From f759f91cf5694b86156570c922e623d43b144fe0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 11 Feb 2013 14:28:23 +0100 Subject: [PATCH 001/597] Show the correct URL for recent ownCloud instances. --- ampache/config.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ampache/config.ui b/ampache/config.ui index 5bddd082e..aed9f47be 100644 --- a/ampache/config.ui +++ b/ampache/config.ui @@ -47,7 +47,7 @@ For owncloud installs, server url is -http://[owncloud url]/apps/media +http://[owncloud url]/remote.php/ampache Qt::AlignCenter From e7286be47099f44567c749e022f4b2577c2a5c68 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Feb 2013 19:28:13 +0100 Subject: [PATCH 002/597] Don't fail if the server doesn't fill out album["album"]. --- subsonic/subsonic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subsonic/subsonic.js b/subsonic/subsonic.js index 4a43d6372..36ab70e15 100644 --- a/subsonic/subsonic.js +++ b/subsonic/subsonic.js @@ -278,7 +278,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { { if (albums[i].artist.toLowerCase() === artist.toLowerCase()) //search2 does partial matches { - results.push(albums[i].album) + results.push(albums[i].title) } } } @@ -286,7 +286,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { { if (albums.artist.toLowerCase() === artist.toLowerCase()) { - results.push(albums.album); + results.push(albums.title); } } From 8f912272c6efc1c0344ccf178fbc045941d6d152 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Sun, 17 Feb 2013 13:01:50 +0100 Subject: [PATCH 003/597] Add collection info support to Subsonic. --- subsonic/subsonic.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/subsonic/subsonic.js b/subsonic/subsonic.js index 36ab70e15..d789c6c81 100644 --- a/subsonic/subsonic.js +++ b/subsonic/subsonic.js @@ -404,6 +404,18 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { "\"&album=\"" + encodeURIComponent(album) + "\"&count=200"; this.executeTracksQuery(qid, search_url, artist, album); + }, + + collection: function() + { + //strip http:// and trailing slash + var desc = this.subsonic_url.replace(/^http:\/\//,"") + .replace(/\/$/, "") + .replace(/\/remote.php\/submedia/, ""); + return { + prettyname: "Subsonic", + description: desc + }; } }); From 215967a57f68a9991c4eb4ca8dfa5ad09769c016 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Sun, 17 Feb 2013 13:07:54 +0100 Subject: [PATCH 004/597] Add collection info support to Ampache. --- ampache/ampache-resolver.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/ampache/ampache-resolver.js b/ampache/ampache-resolver.js index 59b834ac0..1915da229 100644 --- a/ampache/ampache-resolver.js +++ b/ampache/ampache-resolver.js @@ -29,6 +29,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { timeout: 5, limit: 10 }, + getConfigUi: function () { var uiData = Tomahawk.readBase64("config.ui"); return { @@ -54,6 +55,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { }] }; }, + newConfigSaved: function () { var userConfig = this.getUserConfig(); if ((userConfig.username != this.username) || (userConfig.password != this.password) || (userConfig.ampache != this.ampache)) { @@ -67,6 +69,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { this.init(); } }, + init: function () { // check resolver is properly configured var userConfig = this.getUserConfig(); @@ -132,6 +135,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { this.element = document.createElement('div'); }, + generateUrl: function (action, auth, params) { var ampacheUrl = this.ampache + "/server/xml.server.php?"; if (params === undefined) params = []; @@ -164,11 +168,13 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { // this is called from window scope (setInterval), so we need to make methods and data accessible from there Tomahawk.log(AmpacheResolver.apiCall('ping', AmpacheResolver.auth, {}, function () {})); }, + decodeEntity : function(str) { this.element.innerHTML = str; return this.element.textContent; }, + parseSongResponse: function(responseString) { // parse xml var domParser = new DOMParser(); @@ -204,6 +210,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { } return results; }, + parseSearchResponse: function (qid, responseString) { var results = this.parseSongResponse(responseString); @@ -216,9 +223,11 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addTrackResults(return1); //Tomahawk.dumpResult( return1 ); }, + resolve: function (qid, artist, album, title) { return this.search(qid, title); }, + search: function (qid, searchString) { if (!this.ready) return { qid: qid @@ -276,6 +285,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addArtistResults( return_artists ); } ); }, + albums: function (qid, artist) { var artistId = this.artistIds[artist]; this.albumIdsForArtist = {}; @@ -322,6 +332,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addAlbumResults( return_albums ); } ); }, + tracks: function (qid, artist, album) { var artistObject = this.albumIdsForArtist[artist]; var albumId = artistObject[album]; @@ -357,6 +368,18 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.log("Ampache tracks about to return: " + JSON.stringify( return_tracks )); Tomahawk.addAlbumTrackResults( return_tracks ); } ); + }, + + collection: function() + { + //strip http:// and trailing slash + var desc = this.ampache.replace(/^http:\/\//,"") + .replace(/\/$/, "") + .replace(/\/remote.php\/ampache/, ""); + return { + prettyname: "Ampache", + description: desc + }; } }); From 006b53b11889054d29ec15d245574462e584424d Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Thu, 21 Feb 2013 23:32:49 +0100 Subject: [PATCH 005/597] Added client_id param for ex.fm calls. --- exfm/exfm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exfm/exfm.js b/exfm/exfm.js index a129bd99b..55267b33b 100644 --- a/exfm/exfm.js +++ b/exfm/exfm.js @@ -15,7 +15,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { url += encodeURIComponent(title); - url += "?start=0&results=20"; + url += "?start=0&results=20&client_id=tomahawk"; // send request and parse it into javascript var that = this; From fc0480f2c0981fe730b1ce8723d1a2674708f2f1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Feb 2013 09:04:53 +0100 Subject: [PATCH 006/597] Intercept session error on every API call and reauth as needed. --- ampache/ampache-resolver.js | 101 ++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 46 deletions(-) diff --git a/ampache/ampache-resolver.js b/ampache/ampache-resolver.js index 1915da229..74a6e109b 100644 --- a/ampache/ampache-resolver.js +++ b/ampache/ampache-resolver.js @@ -70,6 +70,21 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { } }, + prepareHandshake: function() + { + // prepare handshake arguments + var time = Tomahawk.timestamp(); + var key = Tomahawk.sha256(this.password); + this.passphrase = Tomahawk.sha256(time + key); + + // do the handshake + this.params = { + timestamp: time, + version: 350001, + user: this.username + } + }, + init: function () { // check resolver is properly configured var userConfig = this.getUserConfig(); @@ -88,20 +103,12 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { this.password = userConfig.password; this.ampache = userConfig.ampache; - // prepare handshake arguments - var time = Tomahawk.timestamp(); - var key = Tomahawk.sha256(this.password); - var passphrase = Tomahawk.sha256(time + key); + this.prepareHandshake(); - // do the handshake - var params = { - timestamp: time, - version: 350001, - user: this.username - } try { var that = this; - this.apiCall('handshake', passphrase, params, function (xhr) { + Tomahawk.asyncRequest(this.generateUrl('handshake', this.passphrase, this.params), function (xhr){ + //this.apiCall('handshake', this.passphrase, this.params, function (xhr) { Tomahawk.log(xhr.responseText); @@ -151,7 +158,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { return ampacheUrl; }, - apiCallSync: function (action, auth, params) { + apiCallSync: function (action, auth, params) { //do not use this because it doesn't do re-auth var ampacheUrl = this.generateUrl(action, auth, params); return Tomahawk.syncRequest(ampacheUrl); @@ -161,7 +168,33 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { var ampacheUrl = this.generateUrl(action, auth, params); Tomahawk.log("Ampache API call: " + ampacheUrl ); - Tomahawk.asyncRequest(ampacheUrl, callback); + + var that = this; + Tomahawk.asyncRequest(ampacheUrl, function(xhr) { + var result = xhr.responseText; + Tomahawk.log(result); + + var domParser = new DOMParser(); + xmlDoc = domParser.parseFromString(result, "text/xml"); + + var error = xmlDoc.getElementsByTagName("error")[0]; + if ( typeof error != 'undefined' && + error.getAttribute("code") == "401" ) //session expired + { + that.prepareHandshake(); + var hsResponse = Tomahawk.syncRequest(this.generateUrl('handshake',this.passphrase,this.params)); + xmlDoc = domParser.parseFromString(hsResponse.responseText, "text/xml"); + + that.ready = true; + window.sessionStorage["ampacheAuth"] = that.auth; + + result = Tomahawk.syncRequest(ampacheUrl); + Tomahawk.log(result); + + xmlDoc = domParser.parseFromString(result, "text/xml"); + } + callback(xmlDoc) + }); }, ping: function () { @@ -175,11 +208,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { return this.element.textContent; }, - parseSongResponse: function(responseString) { - // parse xml - var domParser = new DOMParser(); - xmlDoc = domParser.parseFromString(responseString, "text/xml"); - + parseSongResponse: function(xmlDoc) { var results = new Array(); // check the repsonse var songElements = xmlDoc.getElementsByTagName("song")[0]; @@ -211,8 +240,8 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { return results; }, - parseSearchResponse: function (qid, responseString) { - var results = this.parseSongResponse(responseString); + parseSearchResponse: function (qid, xmlDoc) { + var results = this.parseSongResponse(xmlDoc); // prepare the return var return1 = { @@ -241,8 +270,8 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { }; var that = this; - this.apiCall("search_songs", AmpacheResolver.auth, params, function (xhr) { - that.parseSearchResponse(qid, xhr.responseText); + this.apiCall("search_songs", AmpacheResolver.auth, params, function (xmlDoc) { + that.parseSearchResponse(qid, xmlDoc); }); //Tomahawk.log( searchResult ); @@ -253,15 +282,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { var that = this; this.artistIds = {}; - this.apiCall("artists", AmpacheResolver.auth, [], function (xhr) { - var searchResult = xhr.responseText; - - Tomahawk.log(searchResult); - - // parse xml - var domParser = new DOMParser(); - xmlDoc = domParser.parseFromString(searchResult, "text/xml"); - + this.apiCall("artists", AmpacheResolver.auth, [], function (xmlDoc) { var results = []; // check the repsonse @@ -295,15 +316,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { filter: artistId }; - this.apiCall("artist_albums", AmpacheResolver.auth, params, function (xhr) { - var searchResult = xhr.responseText; - - Tomahawk.log( searchResult ); - - // parse xml - var domParser = new DOMParser(); - xmlDoc = domParser.parseFromString(searchResult, "text/xml"); - + this.apiCall("artist_albums", AmpacheResolver.auth, params, function (xmlDoc) { var results = []; // check the repsonse @@ -344,12 +357,8 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { filter: albumId }; - this.apiCall("album_songs", AmpacheResolver.auth, params, function (xhr) { - var searchResult = xhr.responseText; - - Tomahawk.log( searchResult ); - - var tracks_result = that.parseSongResponse(searchResult); + this.apiCall("album_songs", AmpacheResolver.auth, params, function (xmlDoc) { + var tracks_result = that.parseSongResponse(xmlDoc); tracks_result.sort( function(a,b) { if ( a.albumpos < b.albumpos ) return -1; From 7bcb6c04ec74be219aea1e20b8ea665a2ca3303b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Sun, 24 Feb 2013 14:16:41 +0100 Subject: [PATCH 007/597] Actually store the new auth token, and use it. --- ampache/ampache-resolver.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ampache/ampache-resolver.js b/ampache/ampache-resolver.js index 74a6e109b..492dd5139 100644 --- a/ampache/ampache-resolver.js +++ b/ampache/ampache-resolver.js @@ -181,13 +181,20 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { if ( typeof error != 'undefined' && error.getAttribute("code") == "401" ) //session expired { + Tomahawk.log("Let's reauth!"); that.prepareHandshake(); - var hsResponse = Tomahawk.syncRequest(this.generateUrl('handshake',this.passphrase,this.params)); - xmlDoc = domParser.parseFromString(hsResponse.responseText, "text/xml"); + var hsResponse = Tomahawk.syncRequest(that.generateUrl('handshake',that.passphrase,that.params)); + Tomahawk.log(hsResponse); + xmlDoc = domParser.parseFromString(hsResponse, "text/xml"); + var roots = xmlDoc.getElementsByTagName("root"); + Tomahawk.log("Old auth token: " + that.auth); + that.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); + Tomahawk.log("New auth token: " + that.auth); that.ready = true; window.sessionStorage["ampacheAuth"] = that.auth; + ampacheUrl = that.generateUrl(action,that.auth,params); result = Tomahawk.syncRequest(ampacheUrl); Tomahawk.log(result); From 8d7f0c9e8ffda490e001c6d92740425385ed43c8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Sun, 24 Feb 2013 14:19:45 +0100 Subject: [PATCH 008/597] Remove commented-out code. --- ampache/ampache-resolver.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/ampache/ampache-resolver.js b/ampache/ampache-resolver.js index 492dd5139..da6f87d1a 100644 --- a/ampache/ampache-resolver.js +++ b/ampache/ampache-resolver.js @@ -108,8 +108,6 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { try { var that = this; Tomahawk.asyncRequest(this.generateUrl('handshake', this.passphrase, this.params), function (xhr){ - //this.apiCall('handshake', this.passphrase, this.params, function (xhr) { - Tomahawk.log(xhr.responseText); // parse the result From 905d7ca1c40c9cb60e619f7ce241c097b0cc3994 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Sun, 24 Feb 2013 19:14:12 +0100 Subject: [PATCH 009/597] Asyncify. --- ampache/ampache-resolver.js | 40 +++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/ampache/ampache-resolver.js b/ampache/ampache-resolver.js index da6f87d1a..fc7f9fa16 100644 --- a/ampache/ampache-resolver.js +++ b/ampache/ampache-resolver.js @@ -176,29 +176,35 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { xmlDoc = domParser.parseFromString(result, "text/xml"); var error = xmlDoc.getElementsByTagName("error")[0]; + if( 1 ) if ( typeof error != 'undefined' && error.getAttribute("code") == "401" ) //session expired { Tomahawk.log("Let's reauth!"); that.prepareHandshake(); - var hsResponse = Tomahawk.syncRequest(that.generateUrl('handshake',that.passphrase,that.params)); - Tomahawk.log(hsResponse); - xmlDoc = domParser.parseFromString(hsResponse, "text/xml"); - var roots = xmlDoc.getElementsByTagName("root"); - Tomahawk.log("Old auth token: " + that.auth); - that.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); - Tomahawk.log("New auth token: " + that.auth); - - that.ready = true; - window.sessionStorage["ampacheAuth"] = that.auth; - - ampacheUrl = that.generateUrl(action,that.auth,params); - result = Tomahawk.syncRequest(ampacheUrl); - Tomahawk.log(result); - - xmlDoc = domParser.parseFromString(result, "text/xml"); + Tomahawk.asyncRequest(that.generateUrl('handshake',that.passphrase,that.params), function(xhr){ + var hsResponse = xhr.responseText; + Tomahawk.log(hsResponse); + xmlDoc = domParser.parseFromString(hsResponse, "text/xml"); + var roots = xmlDoc.getElementsByTagName("root"); + Tomahawk.log("Old auth token: " + that.auth); + that.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); + Tomahawk.log("New auth token: " + that.auth); + + that.ready = true; + window.sessionStorage["ampacheAuth"] = that.auth; + + ampacheUrl = that.generateUrl(action,that.auth,params); + Tomahawk.asyncRequest(ampacheUrl, function(xhr){ + result = xhr.responseText; + Tomahawk.log(result); + xmlDoc = domParser.parseFromString(result, "text/xml"); + callback(xmlDoc); + }); + }); } - callback(xmlDoc) + else + callback(xmlDoc) }); }, From ed8afb135a374502c14b68e37dd28746d7cdbaa3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 26 Feb 2013 10:51:21 +0100 Subject: [PATCH 010/597] Added track count support to Ampache. --- ampache/ampache-resolver.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/ampache/ampache-resolver.js b/ampache/ampache-resolver.js index fc7f9fa16..476324c3b 100644 --- a/ampache/ampache-resolver.js +++ b/ampache/ampache-resolver.js @@ -116,6 +116,9 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { var roots = xmlDoc.getElementsByTagName("root"); that.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); var pingInterval = parseInt(roots[0] === undefined ? 0 : Tomahawk.valueForSubNode(roots[0], "session_length")) * 1000; + var trackCount = roots[0] === undefined ? (-1) : Tomahawk.valueForSubNode(roots[0], "songs"); + if ( trackCount > -1 ) + that.trackCount = parseInt(trackCount); // inform the user if something went wrong if (!that.auth) { @@ -190,6 +193,9 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.log("Old auth token: " + that.auth); that.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); Tomahawk.log("New auth token: " + that.auth); + var trackCount = roots[0] === undefined ? (-1) : Tomahawk.valueForSubNode(roots[0], "songs"); + if ( trackCount > -1 ) + that.trackCount = parseInt(trackCount); that.ready = true; window.sessionStorage["ampacheAuth"] = that.auth; @@ -396,10 +402,16 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { var desc = this.ampache.replace(/^http:\/\//,"") .replace(/\/$/, "") .replace(/\/remote.php\/ampache/, ""); - return { + + var return_object = { prettyname: "Ampache", - description: desc + description: desc, }; + + if ( typeof( this.trackCount ) !== 'undefined' ) + return_object["trackcount"] = this.trackCount; + + return return_object; } }); From 53ccdf7e378e5342cb5c7b2dc7223affa49b25b4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 26 Feb 2013 11:03:26 +0100 Subject: [PATCH 011/597] DRY in Ampache handshake processing. --- ampache/ampache-resolver.js | 48 ++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/ampache/ampache-resolver.js b/ampache/ampache-resolver.js index 476324c3b..59e32516b 100644 --- a/ampache/ampache-resolver.js +++ b/ampache/ampache-resolver.js @@ -85,6 +85,25 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { } }, + applyHandshake: function(xmlDoc) + { + var roots = xmlDoc.getElementsByTagName("root"); + Tomahawk.log("Old auth token: " + this.auth); + this.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); + Tomahawk.log("New auth token: " + this.auth); + var pingInterval = parseInt(roots[0] === undefined ? 0 : Tomahawk.valueForSubNode(roots[0], "session_length")) * 1000; + var trackCount = roots[0] === undefined ? (-1) : Tomahawk.valueForSubNode(roots[0], "songs"); + if ( trackCount > -1 ) + this.trackCount = parseInt(trackCount); + + // all fine, set the resolver to ready state + this.ready = true; + window.sessionStorage["ampacheAuth"] = this.auth; + + // setup pingTimer + if (pingInterval) window.setInterval(this.ping, pingInterval - 60); + }, + init: function () { // check resolver is properly configured var userConfig = this.getUserConfig(); @@ -113,25 +132,14 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { // parse the result var domParser = new DOMParser(); xmlDoc = domParser.parseFromString(xhr.responseText, "text/xml"); - var roots = xmlDoc.getElementsByTagName("root"); - that.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); - var pingInterval = parseInt(roots[0] === undefined ? 0 : Tomahawk.valueForSubNode(roots[0], "session_length")) * 1000; - var trackCount = roots[0] === undefined ? (-1) : Tomahawk.valueForSubNode(roots[0], "songs"); - if ( trackCount > -1 ) - that.trackCount = parseInt(trackCount); + + that.applyHandshake(xmlDoc); // inform the user if something went wrong if (!that.auth) { Tomahawk.log("INVALID HANDSHAKE RESPONSE: " + xhr.responseText); } - // all fine, set the resolver to ready state - that.ready = true; - window.sessionStorage["ampacheAuth"] = that.auth; - - // setup pingTimer - if (pingInterval) window.setInterval(that.ping, pingInterval - 60); - Tomahawk.log("Ampache Resolver properly initialised!"); Tomahawk.reportCapabilities( TomahawkResolverCapability.Browsable | TomahawkResolverCapability.AccountFactory ); @@ -179,7 +187,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { xmlDoc = domParser.parseFromString(result, "text/xml"); var error = xmlDoc.getElementsByTagName("error")[0]; - if( 1 ) + if ( typeof error != 'undefined' && error.getAttribute("code") == "401" ) //session expired { @@ -189,17 +197,9 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { var hsResponse = xhr.responseText; Tomahawk.log(hsResponse); xmlDoc = domParser.parseFromString(hsResponse, "text/xml"); - var roots = xmlDoc.getElementsByTagName("root"); - Tomahawk.log("Old auth token: " + that.auth); - that.auth = roots[0] === undefined ? false : Tomahawk.valueForSubNode(roots[0], "auth"); - Tomahawk.log("New auth token: " + that.auth); - var trackCount = roots[0] === undefined ? (-1) : Tomahawk.valueForSubNode(roots[0], "songs"); - if ( trackCount > -1 ) - that.trackCount = parseInt(trackCount); - - that.ready = true; - window.sessionStorage["ampacheAuth"] = that.auth; + that.applyHandshake(xmlDoc); + //reauth done, let's retry the API call ampacheUrl = that.generateUrl(action,that.auth,params); Tomahawk.asyncRequest(ampacheUrl, function(xhr){ result = xhr.responseText; From be51e367abba4da0b767ea1ae3879bacf41bbbcd Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 2 Mar 2013 12:21:33 +0100 Subject: [PATCH 012/597] [exfm] Strip whitespace --- exfm/exfm.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/exfm/exfm.js b/exfm/exfm.js index 55267b33b..eaef83402 100644 --- a/exfm/exfm.js +++ b/exfm/exfm.js @@ -16,7 +16,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { url += encodeURIComponent(title); url += "?start=0&results=20&client_id=tomahawk"; - + // send request and parse it into javascript var that = this; var xmlString = Tomahawk.asyncRequest(url, function(xhr) { @@ -24,7 +24,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { var response = JSON.parse(xhr.responseText); var results = new Array(); - + // check the response if (response.results > 0) { var songs = response.songs; @@ -36,11 +36,11 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { if(song.url.indexOf("http://api.soundcloud") === 0){ // unauthorised, use soundcloud resolver instead continue; } - + if (song.artist !== null){ - + if (song.title !== null){ - + var dTitle = ""; if (song.title.indexOf("\n") !== -1){ var stringArray = song.title.split("\n"); @@ -53,7 +53,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { else { dTitle = song.title; } - + dTitle = dTitle.replace("\u2013","").replace(" ", " ").replace("\u201c","").replace("\u201d",""); if (dTitle.toLowerCase().indexOf(song.artist.toLowerCase() + " -") === 0){ dTitle = dTitle.slice(song.artist.length + 2).trim(); @@ -74,7 +74,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { continue; } if (song.album !== null){ - var dAlbum = song.album; + var dAlbum = song.album; } if (dTitle.toLowerCase().indexOf(title.toLowerCase()) !== -1 && dArtist.toLowerCase().indexOf(artist.toLowerCase()) !== -1 || artist === "" && album === ""){ result.artist = ((dArtist !== "")? dArtist:artist); From de3123d0bc4ef4d759247a8e9f576c5417ded996 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 2 Mar 2013 12:55:07 +0100 Subject: [PATCH 013/597] [exfm] Fix comment --- exfm/exfm.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/exfm/exfm.js b/exfm/exfm.js index eaef83402..09d488c21 100644 --- a/exfm/exfm.js +++ b/exfm/exfm.js @@ -10,11 +10,9 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { }, resolve: function (qid, artist, album, title) { - // build query to 4shared + // Build search query for ex.fm var url = "http://ex.fm/api/v3/song/search/"; - url += encodeURIComponent(title); - url += "?start=0&results=20&client_id=tomahawk"; // send request and parse it into javascript From 2cc9f54c9f0a15ba24e58c387830896b78767b3d Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 2 Mar 2013 13:20:09 +0100 Subject: [PATCH 014/597] [exfm] Refactor the title cleanup --- exfm/exfm.js | 70 +++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/exfm/exfm.js b/exfm/exfm.js index 09d488c21..d3cfe7b7a 100644 --- a/exfm/exfm.js +++ b/exfm/exfm.js @@ -9,6 +9,32 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { timeout: 5 }, + cleanTitle: function (title, artist) { + // If the title contains a newline character, strip them off and remove additional spacing + var newTitle = ""; + if (title.indexOf("\n") !== -1) { + var stringArray = title.split("\n"); + for (var j = 0; j < stringArray.length; j++) { + newTitle += stringArray[j].trim() + " "; + } + newTitle = newTitle.trim(); + } else { + newTitle = title; + } + // Remove dash and quotation characters. + newTitle = newTitle.replace("\u2013","").replace(" ", " ").replace("\u201c","").replace("\u201d",""); + // If the artist is included in the song title, cut it + if (newTitle.toLowerCase().indexOf(artist.toLowerCase() + " -") === 0) { + newTitle = newTitle.slice(artist.length + 2).trim(); + } else if (newTitle.toLowerCase().indexOf(artist.toLowerCase() + "-") === 0) { + newTitle = newTitle.slice(artist.length + 1).trim(); + } else if (newTitle.toLowerCase().indexOf(artist.toLowerCase()) === 0){ + // FIXME: This might break results where the artist name is a substring of the song title. + newTitle = newTitle.slice(artist.length).trim(); + } + return newTitle; + }, + resolve: function (qid, artist, album, title) { // Build search query for ex.fm var url = "http://ex.fm/api/v3/song/search/"; @@ -35,43 +61,13 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { continue; } - if (song.artist !== null){ - - if (song.title !== null){ - - var dTitle = ""; - if (song.title.indexOf("\n") !== -1){ - var stringArray = song.title.split("\n"); - var newTitle = ""; - for (var j = 0; j < stringArray.length; j++){ - newTitle += stringArray[j].trim() + " "; - } - dTitle = newTitle.trim(); - } - else { - dTitle = song.title; - } - - dTitle = dTitle.replace("\u2013","").replace(" ", " ").replace("\u201c","").replace("\u201d",""); - if (dTitle.toLowerCase().indexOf(song.artist.toLowerCase() + " -") === 0){ - dTitle = dTitle.slice(song.artist.length + 2).trim(); - } - else if (dTitle.toLowerCase().indexOf(song.artist.toLowerCase() + "-") === 0){ - dTitle = dTitle.slice(song.artist.length + 1).trim(); - } - else if (dTitle.toLowerCase() === song.artist.toLowerCase()){ - continue; - } - else if (dTitle.toLowerCase().indexOf(song.artist.toLowerCase()) === 0){ - dTitle = dTitle.slice(song.artist.length).trim(); - } - var dArtist = song.artist; - } - } - else { - continue; - } - if (song.album !== null){ + if (song.artist === null || song.title === null) { + // This track misses relevant information, so we are going to ignore it. + continue; + } + var dTitle = that.cleanTitle(song.title, song.artist) + var dArtist = song.artist; + if (song.album !== null) { var dAlbum = song.album; } if (dTitle.toLowerCase().indexOf(title.toLowerCase()) !== -1 && dArtist.toLowerCase().indexOf(artist.toLowerCase()) !== -1 || artist === "" && album === ""){ From be710ea6db8e754bbb35d5e08f819331df56399d Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 2 Mar 2013 14:31:25 +0100 Subject: [PATCH 015/597] [exfm] minor cleanups --- exfm/exfm.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/exfm/exfm.js b/exfm/exfm.js index d3cfe7b7a..48d4de485 100644 --- a/exfm/exfm.js +++ b/exfm/exfm.js @@ -70,7 +70,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { if (song.album !== null) { var dAlbum = song.album; } - if (dTitle.toLowerCase().indexOf(title.toLowerCase()) !== -1 && dArtist.toLowerCase().indexOf(artist.toLowerCase()) !== -1 || artist === "" && album === ""){ + if (dTitle.toLowerCase().indexOf(title.toLowerCase()) !== -1 && dArtist.toLowerCase().indexOf(artist.toLowerCase()) !== -1 || (artist === "" && album === "")) { result.artist = ((dArtist !== "")? dArtist:artist); result.album = ((dAlbum !== "")? dAlbum:album); result.track = ((dTitle !== "")? dTitle:title); @@ -80,7 +80,8 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { result.score = 0.80; results.push(result); } - if (artist !== "") { // resolve, return only one result + if (artist !== "") { + // We are in resolve mode, so return only one result break; } } From 99fb956ca6357339d9ecb6ae03eb976a69529ab2 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 3 Mar 2013 13:15:13 +0100 Subject: [PATCH 016/597] [exfm] Check if resolved URLs are readable. * Often ex.fm returns URLs which return with status code 404 and 403. These URLs can't be played and may block other results. * Now using a consistent coding style (could be checked with jslint) --- exfm/async-0.2.5.js | 955 ++++++++++++++++++++++++++++++++++++++++++++ exfm/exfm.js | 194 +++++---- 2 files changed, 1073 insertions(+), 76 deletions(-) create mode 100755 exfm/async-0.2.5.js diff --git a/exfm/async-0.2.5.js b/exfm/async-0.2.5.js new file mode 100755 index 000000000..3ebad60c5 --- /dev/null +++ b/exfm/async-0.2.5.js @@ -0,0 +1,955 @@ +/*global setImmediate: false, setTimeout: false, console: false */ +(function () { + + var async = {}; + + // global on the server, window in the browser + var root, previous_async; + + root = this; + if (root != null) { + previous_async = root.async; + } + + async.noConflict = function () { + root.async = previous_async; + return async; + }; + + function only_once(fn) { + var called = false; + return function() { + if (called) throw new Error("Callback was already called."); + called = true; + fn.apply(root, arguments); + } + } + + //// cross-browser compatiblity functions //// + + var _each = function (arr, iterator) { + if (arr.forEach) { + return arr.forEach(iterator); + } + for (var i = 0; i < arr.length; i += 1) { + iterator(arr[i], i, arr); + } + }; + + var _map = function (arr, iterator) { + if (arr.map) { + return arr.map(iterator); + } + var results = []; + _each(arr, function (x, i, a) { + results.push(iterator(x, i, a)); + }); + return results; + }; + + var _reduce = function (arr, iterator, memo) { + if (arr.reduce) { + return arr.reduce(iterator, memo); + } + _each(arr, function (x, i, a) { + memo = iterator(memo, x, i, a); + }); + return memo; + }; + + var _keys = function (obj) { + if (Object.keys) { + return Object.keys(obj); + } + var keys = []; + for (var k in obj) { + if (obj.hasOwnProperty(k)) { + keys.push(k); + } + } + return keys; + }; + + //// exported async module functions //// + + //// nextTick implementation with browser-compatible fallback //// + if (typeof process === 'undefined' || !(process.nextTick)) { + if (typeof setImmediate === 'function') { + async.nextTick = function (fn) { + setImmediate(fn); + }; + } + else { + async.nextTick = function (fn) { + setTimeout(fn, 0); + }; + } + } + else { + async.nextTick = process.nextTick; + } + + async.each = function (arr, iterator, callback) { + callback = callback || function () {}; + if (!arr.length) { + return callback(); + } + var completed = 0; + _each(arr, function (x) { + iterator(x, only_once(function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + if (completed >= arr.length) { + callback(null); + } + } + })); + }); + }; + async.forEach = async.each; + + async.eachSeries = function (arr, iterator, callback) { + callback = callback || function () {}; + if (!arr.length) { + return callback(); + } + var completed = 0; + var iterate = function () { + var sync = true; + iterator(arr[completed], function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + if (completed >= arr.length) { + callback(null); + } + else { + if (sync) { + async.nextTick(iterate); + } + else { + iterate(); + } + } + } + }); + sync = false; + }; + iterate(); + }; + async.forEachSeries = async.eachSeries; + + async.eachLimit = function (arr, limit, iterator, callback) { + var fn = _eachLimit(limit); + fn.apply(null, [arr, iterator, callback]); + }; + async.forEachLimit = async.eachLimit; + + var _eachLimit = function (limit) { + + return function (arr, iterator, callback) { + callback = callback || function () {}; + if (!arr.length || limit <= 0) { + return callback(); + } + var completed = 0; + var started = 0; + var running = 0; + + (function replenish () { + if (completed >= arr.length) { + return callback(); + } + + while (running < limit && started < arr.length) { + started += 1; + running += 1; + iterator(arr[started - 1], function (err) { + if (err) { + callback(err); + callback = function () {}; + } + else { + completed += 1; + running -= 1; + if (completed >= arr.length) { + callback(); + } + else { + replenish(); + } + } + }); + } + })(); + }; + }; + + + var doParallel = function (fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [async.each].concat(args)); + }; + }; + var doParallelLimit = function(limit, fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [_eachLimit(limit)].concat(args)); + }; + }; + var doSeries = function (fn) { + return function () { + var args = Array.prototype.slice.call(arguments); + return fn.apply(null, [async.eachSeries].concat(args)); + }; + }; + + + var _asyncMap = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (err, v) { + results[x.index] = v; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + }; + async.map = doParallel(_asyncMap); + async.mapSeries = doSeries(_asyncMap); + async.mapLimit = function (arr, limit, iterator, callback) { + return _mapLimit(limit)(arr, iterator, callback); + }; + + var _mapLimit = function(limit) { + return doParallelLimit(limit, _asyncMap); + }; + + // reduce only has a series version, as doing reduce in parallel won't + // work in many situations. + async.reduce = function (arr, memo, iterator, callback) { + async.eachSeries(arr, function (x, callback) { + iterator(memo, x, function (err, v) { + memo = v; + callback(err); + }); + }, function (err) { + callback(err, memo); + }); + }; + // inject alias + async.inject = async.reduce; + // foldl alias + async.foldl = async.reduce; + + async.reduceRight = function (arr, memo, iterator, callback) { + var reversed = _map(arr, function (x) { + return x; + }).reverse(); + async.reduce(reversed, memo, iterator, callback); + }; + // foldr alias + async.foldr = async.reduceRight; + + var _filter = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (v) { + if (v) { + results.push(x); + } + callback(); + }); + }, function (err) { + callback(_map(results.sort(function (a, b) { + return a.index - b.index; + }), function (x) { + return x.value; + })); + }); + }; + async.filter = doParallel(_filter); + async.filterSeries = doSeries(_filter); + // select alias + async.select = async.filter; + async.selectSeries = async.filterSeries; + + var _reject = function (eachfn, arr, iterator, callback) { + var results = []; + arr = _map(arr, function (x, i) { + return {index: i, value: x}; + }); + eachfn(arr, function (x, callback) { + iterator(x.value, function (v) { + if (!v) { + results.push(x); + } + callback(); + }); + }, function (err) { + callback(_map(results.sort(function (a, b) { + return a.index - b.index; + }), function (x) { + return x.value; + })); + }); + }; + async.reject = doParallel(_reject); + async.rejectSeries = doSeries(_reject); + + var _detect = function (eachfn, arr, iterator, main_callback) { + eachfn(arr, function (x, callback) { + iterator(x, function (result) { + if (result) { + main_callback(x); + main_callback = function () {}; + } + else { + callback(); + } + }); + }, function (err) { + main_callback(); + }); + }; + async.detect = doParallel(_detect); + async.detectSeries = doSeries(_detect); + + async.some = function (arr, iterator, main_callback) { + async.each(arr, function (x, callback) { + iterator(x, function (v) { + if (v) { + main_callback(true); + main_callback = function () {}; + } + callback(); + }); + }, function (err) { + main_callback(false); + }); + }; + // any alias + async.any = async.some; + + async.every = function (arr, iterator, main_callback) { + async.each(arr, function (x, callback) { + iterator(x, function (v) { + if (!v) { + main_callback(false); + main_callback = function () {}; + } + callback(); + }); + }, function (err) { + main_callback(true); + }); + }; + // all alias + async.all = async.every; + + async.sortBy = function (arr, iterator, callback) { + async.map(arr, function (x, callback) { + iterator(x, function (err, criteria) { + if (err) { + callback(err); + } + else { + callback(null, {value: x, criteria: criteria}); + } + }); + }, function (err, results) { + if (err) { + return callback(err); + } + else { + var fn = function (left, right) { + var a = left.criteria, b = right.criteria; + return a < b ? -1 : a > b ? 1 : 0; + }; + callback(null, _map(results.sort(fn), function (x) { + return x.value; + })); + } + }); + }; + + async.auto = function (tasks, callback) { + callback = callback || function () {}; + var keys = _keys(tasks); + if (!keys.length) { + return callback(null); + } + + var results = {}; + + var listeners = []; + var addListener = function (fn) { + listeners.unshift(fn); + }; + var removeListener = function (fn) { + for (var i = 0; i < listeners.length; i += 1) { + if (listeners[i] === fn) { + listeners.splice(i, 1); + return; + } + } + }; + var taskComplete = function () { + _each(listeners.slice(0), function (fn) { + fn(); + }); + }; + + addListener(function () { + if (_keys(results).length === keys.length) { + callback(null, results); + callback = function () {}; + } + }); + + _each(keys, function (k) { + var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; + var taskCallback = function (err) { + if (err) { + callback(err); + // stop subsequent errors hitting callback multiple times + callback = function () {}; + } + else { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + async.nextTick(taskComplete); + } + }; + var requires = task.slice(0, Math.abs(task.length - 1)) || []; + var ready = function () { + return _reduce(requires, function (a, x) { + return (a && results.hasOwnProperty(x)); + }, true) && !results.hasOwnProperty(k); + }; + if (ready()) { + task[task.length - 1](taskCallback, results); + } + else { + var listener = function () { + if (ready()) { + removeListener(listener); + task[task.length - 1](taskCallback, results); + } + }; + addListener(listener); + } + }); + }; + + async.waterfall = function (tasks, callback) { + callback = callback || function () {}; + if (!tasks.length) { + return callback(); + } + var wrapIterator = function (iterator) { + return function (err) { + if (err) { + callback.apply(null, arguments); + callback = function () {}; + } + else { + var args = Array.prototype.slice.call(arguments, 1); + var next = iterator.next(); + if (next) { + args.push(wrapIterator(next)); + } + else { + args.push(callback); + } + async.nextTick(function () { + iterator.apply(null, args); + }); + } + }; + }; + wrapIterator(async.iterator(tasks))(); + }; + + var _parallel = function(eachfn, tasks, callback) { + callback = callback || function () {}; + if (tasks.constructor === Array) { + eachfn.map(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args); + }); + } + }, callback); + } + else { + var results = {}; + eachfn.each(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.parallel = function (tasks, callback) { + _parallel({ map: async.map, each: async.each }, tasks, callback); + }; + + async.parallelLimit = function(tasks, limit, callback) { + _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); + }; + + async.series = function (tasks, callback) { + callback = callback || function () {}; + if (tasks.constructor === Array) { + async.mapSeries(tasks, function (fn, callback) { + if (fn) { + fn(function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + callback.call(null, err, args); + }); + } + }, callback); + } + else { + var results = {}; + async.eachSeries(_keys(tasks), function (k, callback) { + tasks[k](function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (args.length <= 1) { + args = args[0]; + } + results[k] = args; + callback(err); + }); + }, function (err) { + callback(err, results); + }); + } + }; + + async.iterator = function (tasks) { + var makeCallback = function (index) { + var fn = function () { + if (tasks.length) { + tasks[index].apply(null, arguments); + } + return fn.next(); + }; + fn.next = function () { + return (index < tasks.length - 1) ? makeCallback(index + 1): null; + }; + return fn; + }; + return makeCallback(0); + }; + + async.apply = function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + return function () { + return fn.apply( + null, args.concat(Array.prototype.slice.call(arguments)) + ); + }; + }; + + var _concat = function (eachfn, arr, fn, callback) { + var r = []; + eachfn(arr, function (x, cb) { + fn(x, function (err, y) { + r = r.concat(y || []); + cb(err); + }); + }, function (err) { + callback(err, r); + }); + }; + async.concat = doParallel(_concat); + async.concatSeries = doSeries(_concat); + + async.whilst = function (test, iterator, callback) { + if (test()) { + var sync = true; + iterator(function (err) { + if (err) { + return callback(err); + } + if (sync) { + async.nextTick(function () { + async.whilst(test, iterator, callback); + }); + } + else { + async.whilst(test, iterator, callback); + } + }); + sync = false; + } + else { + callback(); + } + }; + + async.doWhilst = function (iterator, test, callback) { + var sync = true; + iterator(function (err) { + if (err) { + return callback(err); + } + if (test()) { + if (sync) { + async.nextTick(function () { + async.doWhilst(iterator, test, callback); + }); + } + else { + async.doWhilst(iterator, test, callback); + } + } + else { + callback(); + } + }); + sync = false; + }; + + async.until = function (test, iterator, callback) { + if (!test()) { + var sync = true; + iterator(function (err) { + if (err) { + return callback(err); + } + if (sync) { + async.nextTick(function () { + async.until(test, iterator, callback); + }); + } + else { + async.until(test, iterator, callback); + } + }); + sync = false; + } + else { + callback(); + } + }; + + async.doUntil = function (iterator, test, callback) { + var sync = true; + iterator(function (err) { + if (err) { + return callback(err); + } + if (!test()) { + if (sync) { + async.nextTick(function () { + async.doUntil(iterator, test, callback); + }); + } + else { + async.doUntil(iterator, test, callback); + } + } + else { + callback(); + } + }); + sync = false; + }; + + async.queue = function (worker, concurrency) { + function _insert(q, data, pos, callback) { + if(data.constructor !== Array) { + data = [data]; + } + _each(data, function(task) { + var item = { + data: task, + callback: typeof callback === 'function' ? callback : null + }; + + if (pos) { + q.tasks.unshift(item); + } else { + q.tasks.push(item); + } + + if (q.saturated && q.tasks.length === concurrency) { + q.saturated(); + } + async.nextTick(q.process); + }); + } + + var workers = 0; + var q = { + tasks: [], + concurrency: concurrency, + saturated: null, + empty: null, + drain: null, + push: function (data, callback) { + _insert(q, data, false, callback); + }, + unshift: function (data, callback) { + _insert(q, data, true, callback); + }, + process: function () { + if (workers < q.concurrency && q.tasks.length) { + var task = q.tasks.shift(); + if (q.empty && q.tasks.length === 0) { + q.empty(); + } + workers += 1; + var sync = true; + var next = function () { + workers -= 1; + if (task.callback) { + task.callback.apply(task, arguments); + } + if (q.drain && q.tasks.length + workers === 0) { + q.drain(); + } + q.process(); + }; + var cb = only_once(function () { + var cbArgs = arguments; + + if (sync) { + async.nextTick(function () { + next.apply(null, cbArgs); + }); + } else { + next.apply(null, arguments); + } + }); + worker(task.data, cb); + sync = false; + } + }, + length: function () { + return q.tasks.length; + }, + running: function () { + return workers; + } + }; + return q; + }; + + async.cargo = function (worker, payload) { + var working = false, + tasks = []; + + var cargo = { + tasks: tasks, + payload: payload, + saturated: null, + empty: null, + drain: null, + push: function (data, callback) { + if(data.constructor !== Array) { + data = [data]; + } + _each(data, function(task) { + tasks.push({ + data: task, + callback: typeof callback === 'function' ? callback : null + }); + if (cargo.saturated && tasks.length === payload) { + cargo.saturated(); + } + }); + async.nextTick(cargo.process); + }, + process: function process() { + if (working) return; + if (tasks.length === 0) { + if(cargo.drain) cargo.drain(); + return; + } + + var ts = typeof payload === 'number' + ? tasks.splice(0, payload) + : tasks.splice(0); + + var ds = _map(ts, function (task) { + return task.data; + }); + + if(cargo.empty) cargo.empty(); + working = true; + worker(ds, function () { + working = false; + + var args = arguments; + _each(ts, function (data) { + if (data.callback) { + data.callback.apply(null, args); + } + }); + + process(); + }); + }, + length: function () { + return tasks.length; + }, + running: function () { + return working; + } + }; + return cargo; + }; + + var _console_fn = function (name) { + return function (fn) { + var args = Array.prototype.slice.call(arguments, 1); + fn.apply(null, args.concat([function (err) { + var args = Array.prototype.slice.call(arguments, 1); + if (typeof console !== 'undefined') { + if (err) { + if (console.error) { + console.error(err); + } + } + else if (console[name]) { + _each(args, function (x) { + console[name](x); + }); + } + } + }])); + }; + }; + async.log = _console_fn('log'); + async.dir = _console_fn('dir'); + /*async.info = _console_fn('info'); + async.warn = _console_fn('warn'); + async.error = _console_fn('error');*/ + + async.memoize = function (fn, hasher) { + var memo = {}; + var queues = {}; + hasher = hasher || function (x) { + return x; + }; + var memoized = function () { + var args = Array.prototype.slice.call(arguments); + var callback = args.pop(); + var key = hasher.apply(null, args); + if (key in memo) { + callback.apply(null, memo[key]); + } + else if (key in queues) { + queues[key].push(callback); + } + else { + queues[key] = [callback]; + fn.apply(null, args.concat([function () { + memo[key] = arguments; + var q = queues[key]; + delete queues[key]; + for (var i = 0, l = q.length; i < l; i++) { + q[i].apply(null, arguments); + } + }])); + } + }; + memoized.memo = memo; + memoized.unmemoized = fn; + return memoized; + }; + + async.unmemoize = function (fn) { + return function () { + return (fn.unmemoized || fn).apply(null, arguments); + }; + }; + + async.times = function (count, iterator, callback) { + var counter = []; + for (var i = 0; i < count; i++) { + counter.push(i); + } + return async.map(counter, iterator, callback); + }; + + async.timesSeries = function (count, iterator, callback) { + var counter = []; + for (var i = 0; i < count; i++) { + counter.push(i); + } + return async.mapSeries(counter, iterator, callback); + }; + + async.compose = function (/* functions... */) { + var fns = Array.prototype.reverse.call(arguments); + return function () { + var that = this; + var args = Array.prototype.slice.call(arguments); + var callback = args.pop(); + async.reduce(fns, args, function (newargs, fn, cb) { + fn.apply(that, newargs.concat([function () { + var err = arguments[0]; + var nextargs = Array.prototype.slice.call(arguments, 1); + cb(err, nextargs); + }])) + }, + function (err, results) { + callback.apply(that, [err].concat(results)); + }); + }; + }; + + // AMD / RequireJS + if (typeof define !== 'undefined' && define.amd) { + define([], function () { + return async; + }); + } + // Node.js + else if (typeof module !== 'undefined' && module.exports) { + module.exports = async; + } + // included directly via ) + +
+ +

Introduction

+ +

Google glog is a library that implements application-level +logging. This library provides logging APIs based on C++-style +streams and various helper macros. +You can log a message by simply streaming things to LOG(<a +particular severity level>), e.g. + +

+   #include <glog/logging.h>
+
+   int main(int argc, char* argv[]) {
+     // Initialize Google's logging library.
+     google::InitGoogleLogging(argv[0]);
+
+     // ...
+     LOG(INFO) << "Found " << num_cookies << " cookies";
+   }
+
+ +

Google glog defines a series of macros that simplify many common logging +tasks. You can log messages by severity level, control logging +behavior from the command line, log based on conditionals, abort the +program when expected conditions are not met, introduce your own +verbose logging levels, and more. This document describes the +functionality supported by glog. Please note that this document +doesn't describe all features in this library, but the most useful +ones. If you want to find less common features, please check +header files under src/glog directory. + +

Severity Level

+ +

+You can specify one of the following severity levels (in +increasing order of severity): INFO, WARNING, +ERROR, and FATAL. +Logging a FATAL message terminates the program (after the +message is logged). +Note that messages of a given severity are logged not only in the +logfile for that severity, but also in all logfiles of lower severity. +E.g., a message of severity FATAL will be logged to the +logfiles of severity FATAL, ERROR, +WARNING, and INFO. + +

+The DFATAL severity logs a FATAL error in +debug mode (i.e., there is no NDEBUG macro defined), but +avoids halting the program in production by automatically reducing the +severity to ERROR. + +

Unless otherwise specified, glog writes to the filename +"/tmp/<program name>.<hostname>.<user name>.log.<severity level>.<date>.<time>.<pid>" +(e.g., "/tmp/hello_world.example.com.hamaji.log.INFO.20080709-222411.10474"). +By default, glog copies the log messages of severity level +ERROR or FATAL to standard error (stderr) +in addition to log files. + +

Setting Flags

+ +

Several flags influence glog's output behavior. +If the Google +gflags library is installed on your machine, the +configure script (see the INSTALL file in the package for +detail of this script) will automatically detect and use it, +allowing you to pass flags on the command line. For example, if you +want to turn the flag --logtostderr on, you can start +your application with the following command line: + +

+   ./your_application --logtostderr=1
+
+ +If the Google gflags library isn't installed, you set flags via +environment variables, prefixing the flag name with "GLOG_", e.g. + +
+   GLOG_logtostderr=1 ./your_application
+
+ + + +

The following flags are most commonly used: + +

+
logtostderr (bool, default=false) +
Log messages to stderr instead of logfiles.
+Note: you can set binary flags to true by specifying +1, true, or yes (case +insensitive). +Also, you can set binary flags to false by specifying +0, false, or no (again, case +insensitive). +
stderrthreshold (int, default=2, which +is ERROR) +
Copy log messages at or above this level to stderr in +addition to logfiles. The numbers of severity levels +INFO, WARNING, ERROR, and +FATAL are 0, 1, 2, and 3, respectively. +
minloglevel (int, default=0, which +is INFO) +
Log messages at or above this level. Again, the numbers of +severity levels INFO, WARNING, +ERROR, and FATAL are 0, 1, 2, and 3, +respectively. +
log_dir (string, default="") +
If specified, logfiles are written into this directory instead +of the default logging directory. +
v (int, default=0) +
Show all VLOG(m) messages for m less or +equal the value of this flag. Overridable by --vmodule. +See the section about verbose logging for more +detail. +
vmodule (string, default="") +
Per-module verbose level. The argument has to contain a +comma-separated list of <module name>=<log level>. +<module name> +is a glob pattern (e.g., gfs* for all modules whose name +starts with "gfs"), matched against the filename base +(that is, name ignoring .cc/.h./-inl.h). +<log level> overrides any value given by --v. +See also the section about verbose logging. +
+ +

There are some other flags defined in logging.cc. Please grep the +source code for "DEFINE_" to see a complete list of all flags. + +

Conditional / Occasional Logging

+ +

Sometimes, you may only want to log a message under certain +conditions. You can use the following macros to perform conditional +logging: + +

+   LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
+
+ +The "Got lots of cookies" message is logged only when the variable +num_cookies exceeds 10. + +If a line of code is executed many times, it may be useful to only log +a message at certain intervals. This kind of logging is most useful +for informational messages. + +
+   LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
+
+ +

The above line outputs a log messages on the 1st, 11th, +21st, ... times it is executed. Note that the special +google::COUNTER value is used to identify which repetition is +happening. + +

You can combine conditional and occasional logging with the +following macro. + +

+   LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER
+                                           << "th big cookie";
+
+ +

Instead of outputting a message every nth time, you can also limit +the output to the first n occurrences: + +

+   LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";
+
+ +

Outputs log messages for the first 20 times it is executed. Again, +the google::COUNTER identifier indicates which repetition is +happening. + +

Debug Mode Support

+ +

Special "debug mode" logging macros only have an effect in debug +mode and are compiled away to nothing for non-debug mode +compiles. Use these macros to avoid slowing down your production +application due to excessive logging. + +

+   DLOG(INFO) << "Found cookies";
+
+   DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
+
+   DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
+
+ +

CHECK Macros

+ +

It is a good practice to check expected conditions in your program +frequently to detect errors as early as possible. The +CHECK macro provides the ability to abort the application +when a condition is not met, similar to the assert macro +defined in the standard C library. + +

CHECK aborts the application if a condition is not +true. Unlike assert, it is *not* controlled by +NDEBUG, so the check will be executed regardless of +compilation mode. Therefore, fp->Write(x) in the +following example is always executed: + +

+   CHECK(fp->Write(x) == 4) << "Write failed!";
+
+ +

There are various helper macros for +equality/inequality checks - CHECK_EQ, +CHECK_NE, CHECK_LE, CHECK_LT, +CHECK_GE, and CHECK_GT. +They compare two values, and log a +FATAL message including the two values when the result is +not as expected. The values must have operator<<(ostream, +...) defined. + +

You may append to the error message like so: + +

+   CHECK_NE(1, 2) << ": The world must be ending!";
+
+ +

We are very careful to ensure that each argument is evaluated exactly +once, and that anything which is legal to pass as a function argument is +legal here. In particular, the arguments may be temporary expressions +which will end up being destroyed at the end of the apparent statement, +for example: + +

+   CHECK_EQ(string("abc")[1], 'b');
+
+ +

The compiler reports an error if one of the arguments is a +pointer and the other is NULL. To work around this, simply static_cast +NULL to the type of the desired pointer. + +

+   CHECK_EQ(some_ptr, static_cast<SomeType*>(NULL));
+
+ +

Better yet, use the CHECK_NOTNULL macro: + +

+   CHECK_NOTNULL(some_ptr);
+   some_ptr->DoSomething();
+
+ +

Since this macro returns the given pointer, this is very useful in +constructor initializer lists. + +

+   struct S {
+     S(Something* ptr) : ptr_(CHECK_NOTNULL(ptr)) {}
+     Something* ptr_;
+   };
+
+ +

Note that you cannot use this macro as a C++ stream due to this +feature. Please use CHECK_EQ described above to log a +custom message before aborting the application. + +

If you are comparing C strings (char *), a handy set of macros +performs case sensitive as well as case insensitive comparisons - +CHECK_STREQ, CHECK_STRNE, +CHECK_STRCASEEQ, and CHECK_STRCASENE. The +CASE versions are case-insensitive. You can safely pass NULL +pointers for this macro. They treat NULL and any +non-NULL string as not equal. Two NULLs are +equal. + +

Note that both arguments may be temporary strings which are +destructed at the end of the current "full expression" +(e.g., CHECK_STREQ(Foo().c_str(), Bar().c_str()) where +Foo and Bar return C++'s +std::string). + +

The CHECK_DOUBLE_EQ macro checks the equality of two +floating point values, accepting a small error margin. +CHECK_NEAR accepts a third floating point argument, which +specifies the acceptable error margin. + +

Verbose Logging

+ +

When you are chasing difficult bugs, thorough log messages are very +useful. However, you may want to ignore too verbose messages in usual +development. For such verbose logging, glog provides the +VLOG macro, which allows you to define your own numeric +logging levels. The --v command line option controls +which verbose messages are logged: + +

+   VLOG(1) << "I'm printed when you run the program with --v=1 or higher";
+   VLOG(2) << "I'm printed when you run the program with --v=2 or higher";
+
+ +

With VLOG, the lower the verbose level, the more +likely messages are to be logged. For example, if +--v==1, VLOG(1) will log, but +VLOG(2) will not log. This is opposite of the severity +level, where INFO is 0, and ERROR is 2. +--minloglevel of 1 will log WARNING and +above. Though you can specify any integers for both VLOG +macro and --v flag, the common values for them are small +positive integers. For example, if you write VLOG(0), +you should specify --v=-1 or lower to silence it. This +is less useful since we may not want verbose logs by default in most +cases. The VLOG macros always log at the +INFO log level (when they log at all). + +

Verbose logging can be controlled from the command line on a +per-module basis: + +

+   --vmodule=mapreduce=2,file=1,gfs*=3 --v=0
+
+ +

will: + +

    +
  • a. Print VLOG(2) and lower messages from mapreduce.{h,cc} +
  • b. Print VLOG(1) and lower messages from file.{h,cc} +
  • c. Print VLOG(3) and lower messages from files prefixed with "gfs" +
  • d. Print VLOG(0) and lower messages from elsewhere +
+ +

The wildcarding functionality shown by (c) supports both '*' +(matches 0 or more characters) and '?' (matches any single character) +wildcards. Please also check the section about command line flags. + +

There's also VLOG_IS_ON(n) "verbose level" condition +macro. This macro returns true when the --v is equal or +greater than n. To be used as + +

+   if (VLOG_IS_ON(2)) {
+     // do some logging preparation and logging
+     // that can't be accomplished with just VLOG(2) << ...;
+   }
+
+ +

Verbose level condition macros VLOG_IF, +VLOG_EVERY_N and VLOG_IF_EVERY_N behave +analogous to LOG_IF, LOG_EVERY_N, +LOF_IF_EVERY, but accept a numeric verbosity level as +opposed to a severity level. + +

+   VLOG_IF(1, (size > 1024))
+      << "I'm printed when size is more than 1024 and when you run the "
+         "program with --v=1 or more";
+   VLOG_EVERY_N(1, 10)
+      << "I'm printed every 10th occurrence, and when you run the program "
+         "with --v=1 or more. Present occurence is " << google::COUNTER;
+   VLOG_IF_EVERY_N(1, (size > 1024), 10)
+      << "I'm printed on every 10th occurence of case when size is more "
+         " than 1024, when you run the program with --v=1 or more. ";
+         "Present occurence is " << google::COUNTER;
+
+ +

Failure Signal Handler

+ +

+The library provides a convenient signal handler that will dump useful +information when the program crashes on certain signals such as SIGSEGV. +The signal handler can be installed by +google::InstallFailureSignalHandler(). The following is an example of output +from the signal handler. + +

+*** Aborted at 1225095260 (unix time) try "date -d @1225095260" if you are using GNU date ***
+*** SIGSEGV (@0x0) received by PID 17711 (TID 0x7f893090a6f0) from PID 0; stack trace: ***
+PC: @           0x412eb1 TestWaitingLogSink::send()
+    @     0x7f892fb417d0 (unknown)
+    @           0x412eb1 TestWaitingLogSink::send()
+    @     0x7f89304f7f06 google::LogMessage::SendToLog()
+    @     0x7f89304f35af google::LogMessage::Flush()
+    @     0x7f89304f3739 google::LogMessage::~LogMessage()
+    @           0x408cf4 TestLogSinkWaitTillSent()
+    @           0x4115de main
+    @     0x7f892f7ef1c4 (unknown)
+    @           0x4046f9 (unknown)
+
+ +

+By default, the signal handler writes the failure dump to the standard +error. You can customize the destination by InstallFailureWriter(). + +

Miscellaneous Notes

+ +

Performance of Messages

+ +

The conditional logging macros provided by glog (e.g., +CHECK, LOG_IF, VLOG, ...) are +carefully implemented and don't execute the right hand side +expressions when the conditions are false. So, the following check +may not sacrifice the performance of your application. + +

+   CHECK(obj.ok) << obj.CreatePrettyFormattedStringButVerySlow();
+
+ +

User-defined Failure Function

+ +

FATAL severity level messages or unsatisfied +CHECK condition terminate your program. You can change +the behavior of the termination by +InstallFailureFunction. + +

+   void YourFailureFunction() {
+     // Reports something...
+     exit(1);
+   }
+
+   int main(int argc, char* argv[]) {
+     google::InstallFailureFunction(&YourFailureFunction);
+   }
+
+ +

By default, glog tries to dump stacktrace and makes the program +exit with status 1. The stacktrace is produced only when you run the +program on an architecture for which glog supports stack tracing (as +of September 2008, glog supports stack tracing for x86 and x86_64). + +

Raw Logging

+ +

The header file <glog/raw_logging.h> can be +used for thread-safe logging, which does not allocate any memory or +acquire any locks. Therefore, the macros defined in this +header file can be used by low-level memory allocation and +synchronization code. +Please check src/glog/raw_logging.h.in for detail. +

+ +

Google Style perror()

+ +

PLOG() and PLOG_IF() and +PCHECK() behave exactly like their LOG* and +CHECK equivalents with the addition that they append a +description of the current state of errno to their output lines. +E.g. + +

+   PCHECK(write(1, NULL, 2) >= 0) << "Write NULL failed";
+
+ +

This check fails with the following error message. + +

+   F0825 185142 test.cc:22] Check failed: write(1, NULL, 2) >= 0 Write NULL failed: Bad address [14]
+
+ +

Syslog

+ +

SYSLOG, SYSLOG_IF, and +SYSLOG_EVERY_N macros are available. +These log to syslog in addition to the normal logs. Be aware that +logging to syslog can drastically impact performance, especially if +syslog is configured for remote logging! Make sure you understand the +implications of outputting to syslog before you use these macros. In +general, it's wise to use these macros sparingly. + +

Strip Logging Messages

+ +

Strings used in log messages can increase the size of your binary +and present a privacy concern. You can therefore instruct glog to +remove all strings which fall below a certain severity level by using +the GOOGLE_STRIP_LOG macro: + +

If your application has code like this: + +

+   #define GOOGLE_STRIP_LOG 1    // this must go before the #include!
+   #include <glog/logging.h>
+
+ +

The compiler will remove the log messages whose severities are less +than the specified integer value. Since +VLOG logs at the severity level INFO +(numeric value 0), +setting GOOGLE_STRIP_LOG to 1 or greater removes +all log messages associated with VLOGs as well as +INFO log statements. + +

Notes for Windows users

+ +

Google glog defines a severity level ERROR, which is +also defined in windows.h +There are two known workarounds to avoid this conflict: + +

    +
  • #define WIN32_LEAN_AND_MEAN or NOGDI + before you #include windows.h . +
  • #undef ERROR after you #include + windows.h . +
+ +

See +this issue for more detail. + +


+
+Shinichiro Hamaji
+Gregor Hohpe
+ +
+ + + diff --git a/spotify/breakpad/third_party/glog/google-glog.sln b/spotify/breakpad/third_party/glog/google-glog.sln new file mode 100755 index 000000000..a34ec723a --- /dev/null +++ b/spotify/breakpad/third_party/glog/google-glog.sln @@ -0,0 +1,44 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libglog", "vsprojects\libglog\libglog.vcproj", "{34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logging_unittest", "vsprojects\logging_unittest\logging_unittest.vcproj", "{DD0690AA-5E09-46B5-83FD-4B28604CABA8}" + ProjectSection(ProjectDependencies) = postProject + {34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1} = {34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libglog_static", "vsprojects\libglog_static\libglog_static.vcproj", "{772C2111-BBBF-49E6-B912-198A7F7A88E5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "logging_unittest_static", "vsprojects\logging_unittest_static\logging_unittest_static.vcproj", "{9B239B45-84A9-4E06-AC46-8E220CD43974}" + ProjectSection(ProjectDependencies) = postProject + {772C2111-BBBF-49E6-B912-198A7F7A88E5} = {772C2111-BBBF-49E6-B912-198A7F7A88E5} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Debug|Win32.ActiveCfg = Debug|Win32 + {34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Debug|Win32.Build.0 = Debug|Win32 + {34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Release|Win32.ActiveCfg = Release|Win32 + {34BD04BD-BC1D-4BFC-AAFC-ED02D9E960F1}.Release|Win32.Build.0 = Release|Win32 + {DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Debug|Win32.ActiveCfg = Debug|Win32 + {DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Debug|Win32.Build.0 = Debug|Win32 + {DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Release|Win32.ActiveCfg = Release|Win32 + {DD0690AA-5E09-46B5-83FD-4B28604CABA8}.Release|Win32.Build.0 = Release|Win32 + {772C2111-BBBF-49E6-B912-198A7F7A88E5}.Debug|Win32.ActiveCfg = Debug|Win32 + {772C2111-BBBF-49E6-B912-198A7F7A88E5}.Debug|Win32.Build.0 = Debug|Win32 + {772C2111-BBBF-49E6-B912-198A7F7A88E5}.Release|Win32.ActiveCfg = Release|Win32 + {772C2111-BBBF-49E6-B912-198A7F7A88E5}.Release|Win32.Build.0 = Release|Win32 + {9B239B45-84A9-4E06-AC46-8E220CD43974}.Debug|Win32.ActiveCfg = Debug|Win32 + {9B239B45-84A9-4E06-AC46-8E220CD43974}.Debug|Win32.Build.0 = Debug|Win32 + {9B239B45-84A9-4E06-AC46-8E220CD43974}.Release|Win32.ActiveCfg = Release|Win32 + {9B239B45-84A9-4E06-AC46-8E220CD43974}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/spotify/breakpad/third_party/glog/install-sh b/spotify/breakpad/third_party/glog/install-sh new file mode 100755 index 000000000..a5897de6e --- /dev/null +++ b/spotify/breakpad/third_party/glog/install-sh @@ -0,0 +1,519 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2006-12-25.00 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/spotify/breakpad/third_party/glog/libglog.pc.in b/spotify/breakpad/third_party/glog/libglog.pc.in new file mode 100644 index 000000000..ad2b0774d --- /dev/null +++ b/spotify/breakpad/third_party/glog/libglog.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libglog +Description: Google Log (glog) C++ logging framework +Version: @VERSION@ +Libs: -L${libdir} -lglog +Cflags: -I${includedir} diff --git a/spotify/breakpad/third_party/glog/ltmain.sh b/spotify/breakpad/third_party/glog/ltmain.sh new file mode 100644 index 000000000..7ed280bc9 --- /dev/null +++ b/spotify/breakpad/third_party/glog/ltmain.sh @@ -0,0 +1,8413 @@ +# Generated from ltmain.m4sh. + +# ltmain.sh (GNU libtool) 2.2.6b +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print informational messages (default) +# --version print version information +# -h, --help print short or long help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" +TIMESTAMP="" +package_revision=1.3017 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# NLS nuisances: We save the old values to restore during execute mode. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done + +$lt_unset CDPATH + + + + + +: ${CP="cp -f"} +: ${ECHO="echo"} +: ${EGREP="/bin/grep -E"} +: ${FGREP="/bin/grep -F"} +: ${GREP="/bin/grep"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SED="/bin/sed"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +# Generated shell functions inserted here. + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +# In the unlikely event $progname began with a '-', it would play havoc with +# func_echo (imagine progname=-n), so we prepend ./ in that case: +func_dirname_and_basename "$progpath" +progname=$func_basename_result +case $progname in + -*) progname=./$progname ;; +esac + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=: + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname${mode+: }$mode: $*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` + done + my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "X$my_tmpdir" | $Xsed +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "X$1" | $Xsed \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + + + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $SED -n '/^# Usage:/,/# -h/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + $ECHO + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help +# Echo long help message to standard output and exit. +func_help () +{ + $SED -n '/^# Usage:/,/# Report bugs to/ { + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ + p + }' < "$progpath" + exit $? +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + func_error "missing argument for $1" + exit_cmd=exit +} + +exit_cmd=: + + + + + +# Check that we have a working $ECHO. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell, and then maybe $ECHO will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# Parse options once, thoroughly. This comes as soon as possible in +# the script to make things like `libtool --version' happen quickly. +{ + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Parse non-mode specific arguments: + while test "$#" -gt 0; do + opt="$1" + shift + + case $opt in + --config) func_config ;; + + --debug) preserve_args="$preserve_args $opt" + func_echo "enabling shell trace mode" + opt_debug='set -x' + $opt_debug + ;; + + -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break + execute_dlfiles="$execute_dlfiles $1" + shift + ;; + + --dry-run | -n) opt_dry_run=: ;; + --features) func_features ;; + --finish) mode="finish" ;; + + --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break + case $1 in + # Valid mode arguments: + clean) ;; + compile) ;; + execute) ;; + finish) ;; + install) ;; + link) ;; + relink) ;; + uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; + esac + + mode="$1" + shift + ;; + + --preserve-dup-deps) + opt_duplicate_deps=: ;; + + --quiet|--silent) preserve_args="$preserve_args $opt" + opt_silent=: + ;; + + --verbose| -v) preserve_args="$preserve_args $opt" + opt_silent=false + ;; + + --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break + preserve_args="$preserve_args $opt $1" + func_enable_tag "$1" # tagname is set here + shift + ;; + + # Separate optargs to long options: + -dlopen=*|--mode=*|--tag=*) + func_opt_split "$opt" + set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} + shift + ;; + + -\?|-h) func_usage ;; + --help) opt_help=: ;; + --version) func_version ;; + + -*) func_fatal_help "unrecognized option \`$opt'" ;; + + *) nonopt="$opt" + break + ;; + esac + done + + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_duplicate_deps + ;; + esac + + # Having warned about all mis-specified options, bail out if + # anything was wrong. + $exit_cmd $EXIT_FAILURE +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +## ----------- ## +## Main. ## +## ----------- ## + +$opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + test -z "$mode" && func_fatal_error "error: you must specify a MODE." + + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$mode' for more information." +} + + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_ltwrapper_scriptname_result="" + if func_ltwrapper_executable_p "$1"; then + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" + fi +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_quote_for_eval "$arg" + CC_quoted="$CC_quoted $func_quote_for_eval_result" + done + case "$@ " in + " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T <?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + removelist="$removelist $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + removelist="$removelist $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + command="$command -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { +test "$mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$mode'" + ;; + esac + + $ECHO + $ECHO "Try \`$progname --help' for more information about other modes." + + exit $? +} + + # Now that we've collected a possible --mode arg, show help if necessary + $opt_help && func_mode_help + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_quote_for_eval "$file" + args="$args $func_quote_for_eval_result" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + $ECHO "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + $ECHO "X----------------------------------------------------------------------" | $Xsed + $ECHO "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + $ECHO + $ECHO "If you ever happen to want to link against installed libraries" + $ECHO "in a given directory, LIBDIR, you must either use libtool, and" + $ECHO "specify the full pathname of the library, or use the \`-LLIBDIR'" + $ECHO "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $ECHO " - add LIBDIR to the \`$shlibpath_var' environment variable" + $ECHO " during execution" + fi + if test -n "$runpath_var"; then + $ECHO " - add LIBDIR to the \`$runpath_var' environment variable" + $ECHO " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $ECHO " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $ECHO + + $ECHO "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + $ECHO "more information, such as the ld(1), crle(1) and ld.so(8) manual" + $ECHO "pages." + ;; + *) + $ECHO "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + $ECHO "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS +} + +test "$mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $ECHO "X$nonopt" | $GREP shtool >/dev/null; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + install_prog="$install_prog$func_quote_for_eval_result" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + install_prog="$install_prog $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_verbose "extracting global C symbols from \`$progfile'" + $opt_dry_run || eval "$NM $progfile | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + $ECHO '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + $ECHO >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +" + case $host in + *cygwin* | *mingw* | *cegcc* ) + $ECHO >> "$output_objdir/$my_dlsyms" "\ +/* DATA imports from DLLs on WIN32 con't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs. */" + lt_dlsym_const= ;; + *osf5*) + echo >> "$output_objdir/$my_dlsyms" "\ +/* This system does not cope well with relocations in const data */" + lt_dlsym_const= ;; + *) + lt_dlsym_const=const ;; + esac + + $ECHO >> "$output_objdir/$my_dlsyms" "\ +extern $lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +$lt_dlsym_const lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + $ECHO >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) symtab_cflags="$symtab_cflags $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + + +# func_emit_wrapper_part1 [arg=no] +# +# Emit the first part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part1 () +{ + func_emit_wrapper_part1_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part1_arg1=$1 + fi + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + ECHO=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$ECHO works! + : + else + # Restart under the correct shell, and then maybe \$ECHO will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $ECHO "\ + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done +" +} +# end: func_emit_wrapper_part1 + +# func_emit_wrapper_part2 [arg=no] +# +# Emit the second part of a libtool wrapper script on stdout. +# For more information, see the description associated with +# func_emit_wrapper(), below. +func_emit_wrapper_part2 () +{ + func_emit_wrapper_part2_arg1=no + if test -n "$1" ; then + func_emit_wrapper_part2_arg1=$1 + fi + + $ECHO "\ + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + $ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} +# end: func_emit_wrapper_part2 + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=no + if test -n "$1" ; then + func_emit_wrapper_arg1=$1 + fi + + # split this up so that func_emit_cwrapperexe_src + # can call each part independently. + func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" + func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" +} + + +# func_to_host_path arg +# +# Convert paths to host format when used with build tools. +# Intended for use with "native" mingw (where libtool itself +# is running under the msys shell), or in the following cross- +# build environments: +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# where wine is equipped with the `winepath' executable. +# In the native mingw case, the (msys) shell automatically +# converts paths for any non-msys applications it launches, +# but that facility isn't available from inside the cwrapper. +# Similar accommodations are necessary for $host mingw and +# $build cygwin. Calling this function does no harm for other +# $host/$build combinations not listed above. +# +# ARG is the path (on $build) that should be converted to +# the proper representation for $host. The result is stored +# in $func_to_host_path_result. +func_to_host_path () +{ + func_to_host_path_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + case $build in + *mingw* ) # actually, msys + # awkward: cmd appends spaces to result + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_path_tmp1=`( cmd //c echo "$1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_path_tmp1=`cygpath -w "$1"` + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # Unfortunately, winepath does not exit with a non-zero + # error code, so we are forced to check the contents of + # stdout. On the other hand, if the command is not + # found, the shell will set an exit code of 127 and print + # *an error message* to stdout. So we must check for both + # error code of zero AND non-empty stdout, which explains + # the odd construction: + func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` + if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then + func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ + $SED -e "$lt_sed_naive_backslashify"` + else + # Allow warning below. + func_to_host_path_result="" + fi + ;; + esac + if test -z "$func_to_host_path_result" ; then + func_error "Could not determine host path corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_path_result="$1" + fi + ;; + esac + fi +} +# end: func_to_host_path + +# func_to_host_pathlist arg +# +# Convert pathlists to host format when used with build tools. +# See func_to_host_path(), above. This function supports the +# following $build/$host combinations (but does no harm for +# combinations not listed here): +# $build $host +# mingw (msys) mingw [e.g. native] +# cygwin mingw +# *nix + wine mingw +# +# Path separators are also converted from $build format to +# $host format. If ARG begins or ends with a path separator +# character, it is preserved (but converted to $host format) +# on output. +# +# ARG is a pathlist (on $build) that should be converted to +# the proper representation on $host. The result is stored +# in $func_to_host_pathlist_result. +func_to_host_pathlist () +{ + func_to_host_pathlist_result="$1" + if test -n "$1" ; then + case $host in + *mingw* ) + lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_to_host_pathlist_tmp2="$1" + # Once set for this call, this variable should not be + # reassigned. It is used in tha fallback case. + func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e 's|^:*||' -e 's|:*$||'` + case $build in + *mingw* ) # Actually, msys. + # Awkward: cmd appends spaces to result. + lt_sed_strip_trailing_spaces="s/[ ]*\$//" + func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + *cygwin* ) + func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ + $SED -e "$lt_sed_naive_backslashify"` + ;; + * ) + # unfortunately, winepath doesn't convert pathlists + func_to_host_pathlist_result="" + func_to_host_pathlist_oldIFS=$IFS + IFS=: + for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do + IFS=$func_to_host_pathlist_oldIFS + if test -n "$func_to_host_pathlist_f" ; then + func_to_host_path "$func_to_host_pathlist_f" + if test -n "$func_to_host_path_result" ; then + if test -z "$func_to_host_pathlist_result" ; then + func_to_host_pathlist_result="$func_to_host_path_result" + else + func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" + fi + fi + fi + IFS=: + done + IFS=$func_to_host_pathlist_oldIFS + ;; + esac + if test -z "$func_to_host_pathlist_result" ; then + func_error "Could not determine the host path(s) corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This may break if $1 contains DOS-style drive + # specifications. The fix is not to complicate the expression + # below, but for the user to provide a working wine installation + # with winepath so that path translation in the cross-to-mingw + # case works properly. + lt_replace_pathsep_nix_to_dos="s|:|;|g" + func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ + $SED -e "$lt_replace_pathsep_nix_to_dos"` + fi + # Now, add the leading and trailing path separators back + case "$1" in + :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" + ;; + esac + case "$1" in + *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" + ;; + esac + ;; + esac + fi +} +# end: func_to_host_pathlist + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +# define setmode _setmode +#else +# include +# include +# ifdef __CYGWIN__ +# include +# define HAVE_SETENV +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +#ifdef _MSC_VER +# define S_IXUSR _S_IEXEC +# define stat _stat +# ifndef _INTPTR_T_DEFINED +# define intptr_t int +# endif +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifdef __CYGWIN__ +# define FOPEN_WB "wb" +#endif + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#undef LTWRAPPER_DEBUGPRINTF +#if defined DEBUGWRAPPER +# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args +static void +ltwrapper_debugprintf (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); +} +#else +# define LTWRAPPER_DEBUGPRINTF(args) +#endif + +const char *program_name = NULL; + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_fatal (const char *message, ...); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_opt_process_env_set (const char *arg); +void lt_opt_process_env_prepend (const char *arg); +void lt_opt_process_env_append (const char *arg); +int lt_split_name_value (const char *arg, char** name, char** value); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); + +static const char *script_text_part1 = +EOF + + func_emit_wrapper_part1 yes | + $SED -e 's/\([\\"]\)/\\\1/g' \ + -e 's/^/ "/' -e 's/$/\\n"/' + echo ";" + cat <"))); + for (i = 0; i < newargc; i++) + { + LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); + } + +EOF + + case $host_os in + mingw*) + cat <<"EOF" + /* execv doesn't actually work on mingw as expected on unix */ + rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); + if (rval == -1) + { + /* failed to start process */ + LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); + return 127; + } + return rval; +EOF + ;; + *) + cat <<"EOF" + execv (lt_argv_zero, newargz); + return rval; /* =127, but avoids unused variable warning */ +EOF + ;; + esac + + cat <<"EOF" +} + +void * +xmalloc (size_t num) +{ + void *p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), + string) : NULL; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char) name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable (const char *path) +{ + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", + path ? (*path ? path : "EMPTY!") : "NULL!")); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", + wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + LTWRAPPER_DEBUGPRINTF (("checking path component for symlinks: %s\n", + tmp_pathspec)); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + char *errstr = strerror (errno); + lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal ("Could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} + +void +lt_setenv (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", + (name ? name : ""), + (value ? value : ""))); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +int +lt_split_name_value (const char *arg, char** name, char** value) +{ + const char *p; + int len; + if (!arg || !*arg) + return 1; + + p = strchr (arg, (int)'='); + + if (!p) + return 1; + + *value = xstrdup (++p); + + len = strlen (arg) - strlen (*value); + *name = XMALLOC (char, len); + strncpy (*name, arg, len-1); + (*name)[len - 1] = '\0'; + + return 0; +} + +void +lt_opt_process_env_set (const char *arg) +{ + char *name = NULL; + char *value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); + } + + lt_setenv (name, value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_prepend (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_opt_process_env_append (const char *arg) +{ + char *name = NULL; + char *value = NULL; + char *new_value = NULL; + + if (lt_split_name_value (arg, &name, &value) != 0) + { + XFREE (name); + XFREE (value); + lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); + } + + new_value = lt_extend_str (getenv (name), value, 1); + lt_setenv (name, new_value); + XFREE (new_value); + XFREE (name); + XFREE (value); +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + (name ? name : ""), + (value ? value : ""))); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + + +EOF +} +# end: func_emit_cwrapperexe_src + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) deplibs="$deplibs $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + weak_libs="$weak_libs $arg" + prev= + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname '-L' '' "$arg" + dir=$func_stripname_result + if test -z "$dir"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + arg="$arg $wl$func_quote_for_eval_result" + compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" + linker_flags="$linker_flags $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_duplicate_deps ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + case $lib in + *.la) func_source "$lib" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` + case " $weak_libs " in + *" $deplib_base "*) ;; + *) deplibs="$deplibs $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + dir=$func_stripname_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $ECHO + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because the file extensions .$libext of this argument makes me believe" + $ECHO "*** that it is just a static archive that I should not use here." + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "X$inherited_linker_flags" | $Xsed -e 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + newlib_search_path="$newlib_search_path $func_stripname_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) temp_rpath="$temp_rpath$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + notinst_deplibs="$notinst_deplibs $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + $ECHO + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $ECHO + $ECHO "*** And there doesn't seem to be a static archive available" + $ECHO "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $ECHO + $ECHO "*** Warning: This system can not link to static lib archive $lib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $ECHO "*** But as you try to build a module library, libtool will still create " + $ECHO "*** a static module, that should work as long as the dlopening application" + $ECHO "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if $opt_duplicate_deps ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_dirname "$deplib" "" "." + dir="$func_dirname_result" + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + linker_flags="$linker_flags -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + $ECHO + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + libobjs="$libobjs $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` + # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` + # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $ECHO + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + $ECHO "*** I have the capability to make that library automatically link in when" + $ECHO "*** you link to this library. But I can only do this if you have a" + $ECHO "*** shared version of the library, which you do not appear to have" + $ECHO "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ + -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` + done + fi + if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | + $GREP . >/dev/null; then + $ECHO + if test "X$deplibs_check_method" = "Xnone"; then + $ECHO "*** Warning: inter-library dependencies are not supported in this platform." + else + $ECHO "*** Warning: inter-library dependencies are not known to be supported." + fi + $ECHO "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $ECHO + $ECHO "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + $ECHO "*** a static module, that should work as long as the dlopening" + $ECHO "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $ECHO + $ECHO "*** However, this would only work if libtool was able to extract symbol" + $ECHO "*** lists from a program, using \`nm' or equivalent, but libtool could" + $ECHO "*** not find such a program. So, this module is probably useless." + $ECHO "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $ECHO "*** The inter-library dependencies that have been dropped here will be" + $ECHO "*** automatically added whenever a program is linked with this library" + $ECHO "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $ECHO + $ECHO "*** Since this library must not contain undefined symbols," + $ECHO "*** because either the platform does not support them or" + $ECHO "*** it was explicitly requested with -no-undefined," + $ECHO "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO "X $deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + delfiles="$delfiles $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + func_len " $cmd" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$ECHO "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + $ECHO 'INPUT (' > $output + for obj in $save_libobjs + do + $ECHO "$obj" >> $output + done + $ECHO ')' >> $output + delfiles="$delfiles $output" + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + $ECHO "$obj" >> $output + done + delfiles="$delfiles $output" + output=$firstobj\"$file_list_spec$output\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + delfiles="$delfiles $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + delfiles="$delfiles $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + libobjs="$libobjs $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *cegcc) + # Disable wrappers for cegcc, we are cross compiling anyway. + wrappers_required=no + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $ECHO for shipping. + if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$ECHO "X$ECHO" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + oldobjs="$oldobjs $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $dlprefiles + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $ECHO "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "X$relink_command" | $Xsed -e "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlfiles="$newdlfiles $libdir/$name" + ;; + *) newdlfiles="$newdlfiles $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + newdlprefiles="$newdlprefiles $libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$mode" = link || test "$mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) RM="$RM $arg"; rmforce=yes ;; + -*) RM="$RM $arg" ;; + *) files="$files $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + rmfiles="$rmfiles $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$mode" = uninstall || test "$mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4 b/spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4 new file mode 100644 index 000000000..19f4021e9 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4 @@ -0,0 +1,16 @@ +AC_DEFUN([AX_C___ATTRIBUTE__], [ + AC_MSG_CHECKING(for __attribute__) + AC_CACHE_VAL(ac_cv___attribute__, [ + AC_TRY_COMPILE( + [#include + static void foo(void) __attribute__ ((unused)); + void foo(void) { exit(1); }], + [], + ac_cv___attribute__=yes, + ac_cv___attribute__=no + )]) + if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [define if your compiler has __attribute__]) + fi + AC_MSG_RESULT($ac_cv___attribute__) +]) diff --git a/spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 b/spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 new file mode 100644 index 000000000..e91b6fd98 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 @@ -0,0 +1,14 @@ +AC_DEFUN([AX_C___BUILTIN_EXPECT], [ + AC_MSG_CHECKING(for __builtin_expect) + AC_CACHE_VAL(ac_cv___builtin_expect, [ + AC_TRY_COMPILE( + [int foo(void) { if (__builtin_expect(0, 0)) return 1; return 0; }], + [], + ac_cv___builtin_expect=yes, + ac_cv___builtin_expect=no + )]) + if test "$ac_cv___builtin_expect" = "yes"; then + AC_DEFINE(HAVE___BUILTIN_EXPECT, 1, [define if your compiler has __builtin_expect]) + fi + AC_MSG_RESULT($ac_cv___builtin_expect) +]) diff --git a/spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 b/spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 new file mode 100644 index 000000000..9ff59c25f --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 @@ -0,0 +1,14 @@ +AC_DEFUN([AX_C___SYNC_VAL_COMPARE_AND_SWAP], [ + AC_MSG_CHECKING(for __sync_val_compare_and_swap) + AC_CACHE_VAL(ac_cv___sync_val_compare_and_swap, [ + AC_TRY_LINK( + [int main() { int a; if (__sync_val_compare_and_swap(&a, 0, 1)) return 1; return 0; }], + [], + ac_cv___sync_val_compare_and_swap=yes, + ac_cv___sync_val_compare_and_swap=no + )]) + if test "$ac_cv___sync_val_compare_and_swap" = "yes"; then + AC_DEFINE(HAVE___SYNC_VAL_COMPARE_AND_SWAP, 1, [define if your compiler has __sync_val_compare_and_swap]) + fi + AC_MSG_RESULT($ac_cv___sync_val_compare_and_swap) +]) diff --git a/spotify/breakpad/third_party/glog/m4/ac_rwlock.m4 b/spotify/breakpad/third_party/glog/m4/ac_rwlock.m4 new file mode 100644 index 000000000..5065bcc1c --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/ac_rwlock.m4 @@ -0,0 +1,31 @@ +# TODO(csilvers): it would be better to actually try to link against +# -pthreads, to make sure it defines these methods, but that may be +# too hard, since pthread support is really tricky. + +# Check for support for pthread_rwlock_init() etc. +# These aren't posix, but are widely supported. To get them on linux, +# you need to define _XOPEN_SOURCE first, so this check assumes your +# application does that. +# +# Note: OS X (as of 6/1/06) seems to support pthread_rwlock, but +# doesn't define PTHREAD_RWLOCK_INITIALIZER. Therefore, we don't test +# that particularly macro. It's probably best if you don't use that +# macro in your code either. + +AC_DEFUN([AC_RWLOCK], +[AC_CACHE_CHECK(support for pthread_rwlock_* functions, +ac_cv_rwlock, +[AC_LANG_SAVE + AC_LANG_C + AC_TRY_COMPILE([#define _XOPEN_SOURCE 500 + #include ], + [pthread_rwlock_t l; pthread_rwlock_init(&l, NULL); + pthread_rwlock_rdlock(&l); + return 0;], + ac_cv_rwlock=yes, ac_cv_rwlock=no) + AC_LANG_RESTORE +]) +if test "$ac_cv_rwlock" = yes; then + AC_DEFINE(HAVE_RWLOCK,1,[define if the compiler implements pthread_rwlock_*]) +fi +]) diff --git a/spotify/breakpad/third_party/glog/m4/acx_pthread.m4 b/spotify/breakpad/third_party/glog/m4/acx_pthread.m4 new file mode 100644 index 000000000..2cf20de14 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/acx_pthread.m4 @@ -0,0 +1,363 @@ +# This was retrieved from +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi +# See also (perhaps for new versions?) +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi +# +# We've rewritten the inconsistency check code (from avahi), to work +# more broadly. In particular, it no longer assumes ld accepts -zdefs. +# This caused a restructing of the code, but the functionality has only +# changed a little. + +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl @summary figure out how to build C programs using POSIX threads +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2006-05-29 +dnl @license GPLWithACException +dnl +dnl Checks for GCC shared/pthread inconsistency based on work by +dnl Marcin Owsiany + + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi + + # The next part tries to detect GCC inconsistency with -shared on some + # architectures and systems. The problem is that in certain + # configurations, when -shared is specified, GCC "forgets" to + # internally use various flags which are still necessary. + + # + # Prepare the flags + # + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + save_CC="$CC" + + # Try with the flags determined by the earlier checks. + # + # -Wl,-z,defs forces link-time symbol resolution, so that the + # linking checks with -shared actually have any value + # + # FIXME: -fPIC is required for -shared on many architectures, + # so we specify it here, but the right way would probably be to + # properly detect whether it is actually required. + CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CC="$PTHREAD_CC" + + # In order not to create several levels of indentation, we test + # the value of "$done" until we find the cure or run out of ideas. + done="no" + + # First, make sure the CFLAGS we added are actually accepted by our + # compiler. If not (and OS X's ld, for instance, does not accept -z), + # then we can't do this test. + if test x"$done" = xno; then + AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) + AC_TRY_LINK(,, , [done=yes]) + + if test "x$done" = xyes ; then + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([yes]) + fi + fi + + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -pthread is sufficient with -shared]) + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi + + # + # Linux gcc on some architectures such as mips/mipsel forgets + # about -lpthread + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lpthread fixes that]) + LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + # + # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lc_r fixes that]) + LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + if test x"$done" = xno; then + # OK, we have run out of ideas + AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries]) + + # so it's not safe to assume that we may use pthreads + acx_pthread_ok=no + fi + + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" + CC="$save_CC" +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/spotify/breakpad/third_party/glog/m4/google_namespace.m4 b/spotify/breakpad/third_party/glog/m4/google_namespace.m4 new file mode 100644 index 000000000..79e0a6d42 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/google_namespace.m4 @@ -0,0 +1,36 @@ +# Allow users to override the namespace we define our application's classes in +# Arg $1 is the default namespace to use if --enable-namespace isn't present. + +# In general, $1 should be 'google', so we put all our exported symbols in a +# unique namespace that is not likely to conflict with anyone else. However, +# when it makes sense -- for instance, when publishing stl-like code -- you +# may want to go with a different default, like 'std'. + +AC_DEFUN([AC_DEFINE_GOOGLE_NAMESPACE], + [google_namespace_default=[$1] + AC_ARG_ENABLE(namespace, [ --enable-namespace=FOO to define these Google + classes in the FOO namespace. --disable-namespace + to define them in the global namespace. Default + is to define them in namespace $1.], + [case "$enableval" in + yes) google_namespace="$google_namespace_default" ;; + no) google_namespace="" ;; + *) google_namespace="$enableval" ;; + esac], + [google_namespace="$google_namespace_default"]) + if test -n "$google_namespace"; then + ac_google_namespace="$google_namespace" + ac_google_start_namespace="namespace $google_namespace {" + ac_google_end_namespace="}" + else + ac_google_namespace="" + ac_google_start_namespace="" + ac_google_end_namespace="" + fi + AC_DEFINE_UNQUOTED(GOOGLE_NAMESPACE, $ac_google_namespace, + Namespace for Google classes) + AC_DEFINE_UNQUOTED(_START_GOOGLE_NAMESPACE_, $ac_google_start_namespace, + Puts following code inside the Google namespace) + AC_DEFINE_UNQUOTED(_END_GOOGLE_NAMESPACE_, $ac_google_end_namespace, + Stops putting the code inside the Google namespace) +]) diff --git a/spotify/breakpad/third_party/glog/m4/libtool.m4 b/spotify/breakpad/third_party/glog/m4/libtool.m4 new file mode 100644 index 000000000..a3fee5360 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/libtool.m4 @@ -0,0 +1,7377 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 56 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl +_LT_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "X$" | $Xsed -e "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Fix-up fallback echo if it was mangled by the above quoting rules. +case \$lt_ECHO in +*'\\\[$]0 --fallback-echo"')dnl " + lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` + ;; +esac + +_LT_OUTPUT_LIBTOOL_INIT +]) + + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +cat >"$CONFIG_LT" <<_LTEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate a libtool stub with the current configuration. + +lt_cl_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AS_SHELL_SANITIZE +_AS_PREPARE + +exec AS_MESSAGE_FD>&1 +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2008 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +if test "$no_create" != yes; then + lt_cl_success=: + test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" + exec AS_MESSAGE_LOG_FD>/dev/null + $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false + exec AS_MESSAGE_LOG_FD>>config.log + $lt_cl_success || AS_EXIT(1) +fi +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_XSI_SHELLFNS + + sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES +# -------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=echo + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX +# ----------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_SHELL_INIT + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[_LT_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$lt_ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +ECHO=${lt_ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then + # Yippee, $ECHO works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat <<_LT_EOF +[$]* +_LT_EOF + exit 0 +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test -z "$lt_ECHO"; then + if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if { echo_test_string=`eval $cmd`; } 2>/dev/null && + { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null + then + break + fi + done + fi + + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : + else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$ECHO" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + ECHO='print -r' + elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + ECHO='printf %s\n' + if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && + echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + ECHO="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + ECHO=echo + fi + fi + fi + fi + fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +lt_ECHO=$ECHO +if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(lt_ECHO) +]) +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], + [An echo program that does not interpret backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[AC_CHECK_TOOL(AR, ar, false) +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1]) + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ + = "XX$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line __oline__ "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # Some binutils ld are patched to set DT_RUNPATH + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method == "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:__oline__: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC*) + # IBM XL 8.0 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl*) + # IBM XL C 8.0/Fortran 10.1 on PPC + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac +AC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag= + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO "X$deplibs" | $Xsed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE(int foo(void) {}, + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + ) + LDFLAGS="$save_LDFLAGS" + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1], + [[If ld is used when linking, flag to hardcode $libdir into a binary + during linking. This must work even if $libdir does not exist]]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [fix_srcfile_path], [1], + [Fix the shell variable $srcfile for the compiler]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_PROG_CXX +# ------------ +# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ +# compiler, we have our own version here. +m4_defun([_LT_PROG_CXX], +[ +pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) +AC_PROG_CXX +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_CXX + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_CXX], []) + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[AC_REQUIRE([_LT_PROG_CXX])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + gnu*) + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]]* | *pgcpp\ [[1-5]]*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 will use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + xl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=echo + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +]) +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_PROG_F77 +# ------------ +# Since AC_PROG_F77 is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_F77], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) +AC_PROG_F77 +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_F77 + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_F77], []) + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_REQUIRE([_LT_PROG_F77])dnl +AC_LANG_PUSH(Fortran 77) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${F77-"f77"} + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_PROG_FC +# ----------- +# Since AC_PROG_FC is broken, in that it returns the empty string +# if there is no fortran compiler, we have our own version here. +m4_defun([_LT_PROG_FC], +[ +pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) +AC_PROG_FC +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi +popdef([AC_MSG_ERROR]) +])# _LT_PROG_FC + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([_LT_PROG_FC], []) + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_REQUIRE([_LT_PROG_FC])dnl +AC_LANG_PUSH(Fortran) + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + CC=${FC-"f95"} + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC="$lt_save_CC" +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC="$lt_save_CC" +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_XSI_SHELLFNS +# --------------------- +# Bourne and XSI compatible variants of some useful shell functions. +m4_defun([_LT_PROG_XSI_SHELLFNS], +[case $xsi_shell in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac +} + +# func_basename file +func_basename () +{ + func_basename_result="${1##*/}" +} + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}" +} + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +func_stripname () +{ + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"} +} + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=${1%%=*} + func_opt_split_arg=${1#*=} +} + +# func_lo2o object +func_lo2o () +{ + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=${1%.*}.lo +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=$(( $[*] )) +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=${#1} +} + +_LT_EOF + ;; + *) # Bourne compatible functions. + cat << \_LT_EOF >> "$cfgfile" + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` +} + +dnl func_dirname_and_basename +dnl A portable version of this function is already defined in general.m4sh +dnl so there is no need for it here. + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "X${3}" \ + | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; + esac +} + +# sed scripts: +my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' +my_sed_long_arg='1s/^-[[^=]]*=//' + +# func_opt_split +func_opt_split () +{ + func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` + func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` +} + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` +} + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` +} + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "$[@]"` +} + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` +} + +_LT_EOF +esac + +case $lt_shell_append in + yes) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]+=\$[2]" +} +_LT_EOF + ;; + *) + cat << \_LT_EOF >> "$cfgfile" + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "$[1]=\$$[1]\$[2]" +} + +_LT_EOF + ;; + esac +]) diff --git a/spotify/breakpad/third_party/glog/m4/ltoptions.m4 b/spotify/breakpad/third_party/glog/m4/ltoptions.m4 new file mode 100644 index 000000000..34151a3ba --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/ltoptions.m4 @@ -0,0 +1,368 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [0], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/spotify/breakpad/third_party/glog/m4/ltsugar.m4 b/spotify/breakpad/third_party/glog/m4/ltsugar.m4 new file mode 100644 index 000000000..9000a057d --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/ltsugar.m4 @@ -0,0 +1,123 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/spotify/breakpad/third_party/glog/m4/ltversion.m4 b/spotify/breakpad/third_party/glog/m4/ltversion.m4 new file mode 100644 index 000000000..f3c530980 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# Generated from ltversion.in. + +# serial 3017 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.2.6b]) +m4_define([LT_PACKAGE_REVISION], [1.3017]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.2.6b' +macro_revision='1.3017' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/spotify/breakpad/third_party/glog/m4/lt~obsolete.m4 b/spotify/breakpad/third_party/glog/m4/lt~obsolete.m4 new file mode 100644 index 000000000..637bb2066 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/lt~obsolete.m4 @@ -0,0 +1,92 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 4 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) diff --git a/spotify/breakpad/third_party/glog/m4/namespaces.m4 b/spotify/breakpad/third_party/glog/m4/namespaces.m4 new file mode 100644 index 000000000..d78dbe4cc --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/namespaces.m4 @@ -0,0 +1,15 @@ +# Checks whether the compiler implements namespaces +AC_DEFUN([AC_CXX_NAMESPACES], + [AC_CACHE_CHECK(whether the compiler implements namespaces, + ac_cv_cxx_namespaces, + [AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([namespace Outer { + namespace Inner { int i = 0; }}], + [using namespace Outer::Inner; return i;], + ac_cv_cxx_namespaces=yes, + ac_cv_cxx_namespaces=no) + AC_LANG_RESTORE]) + if test "$ac_cv_cxx_namespaces" = yes; then + AC_DEFINE(HAVE_NAMESPACES, 1, [define if the compiler implements namespaces]) + fi]) diff --git a/spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4 b/spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4 new file mode 100644 index 000000000..daffddb53 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4 @@ -0,0 +1,71 @@ +# We want to access the "PC" (Program Counter) register from a struct +# ucontext. Every system has its own way of doing that. We try all the +# possibilities we know about. Note REG_PC should come first (REG_RIP +# is also defined on solaris, but does the wrong thing). + +# OpenBSD doesn't have ucontext.h, but we can get PC from ucontext_t +# by using signal.h. + +# The first argument of AC_PC_FROM_UCONTEXT will be invoked when we +# cannot find a way to obtain PC from ucontext. + +AC_DEFUN([AC_PC_FROM_UCONTEXT], + [AC_CHECK_HEADERS(ucontext.h) + AC_CHECK_HEADERS(sys/ucontext.h) # ucontext on OS X 10.6 (at least) + AC_MSG_CHECKING([how to access the program counter from a struct ucontext]) + pc_fields=" uc_mcontext.gregs[[REG_PC]]" # Solaris x86 (32 + 64 bit) + pc_fields="$pc_fields uc_mcontext.gregs[[REG_EIP]]" # Linux (i386) + pc_fields="$pc_fields uc_mcontext.gregs[[REG_RIP]]" # Linux (x86_64) + pc_fields="$pc_fields uc_mcontext.sc_ip" # Linux (ia64) + pc_fields="$pc_fields uc_mcontext.uc_regs->gregs[[PT_NIP]]" # Linux (ppc) + pc_fields="$pc_fields uc_mcontext.gregs[[R15]]" # Linux (arm old [untested]) + pc_fields="$pc_fields uc_mcontext.arm_pc" # Linux (arm new [untested]) + pc_fields="$pc_fields uc_mcontext.mc_eip" # FreeBSD (i386) + pc_fields="$pc_fields uc_mcontext.mc_rip" # FreeBSD (x86_64 [untested]) + pc_fields="$pc_fields uc_mcontext.__gregs[[_REG_EIP]]" # NetBSD (i386) + pc_fields="$pc_fields uc_mcontext.__gregs[[_REG_RIP]]" # NetBSD (x86_64) + pc_fields="$pc_fields uc_mcontext->ss.eip" # OS X (i386, <=10.4) + pc_fields="$pc_fields uc_mcontext->__ss.__eip" # OS X (i386, >=10.5) + pc_fields="$pc_fields uc_mcontext->ss.rip" # OS X (x86_64) + pc_fields="$pc_fields uc_mcontext->__ss.__rip" # OS X (>=10.5 [untested]) + pc_fields="$pc_fields uc_mcontext->ss.srr0" # OS X (ppc, ppc64 [untested]) + pc_fields="$pc_fields uc_mcontext->__ss.__srr0" # OS X (>=10.5 [untested]) + pc_field_found=false + for pc_field in $pc_fields; do + if ! $pc_field_found; then + if test "x$ac_cv_header_sys_ucontext_h" = xyes; then + AC_TRY_COMPILE([#define _GNU_SOURCE 1 + #include ], + [ucontext_t u; return u.$pc_field == 0;], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + else + AC_TRY_COMPILE([#define _GNU_SOURCE 1 + #include ], + [ucontext_t u; return u.$pc_field == 0;], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + fi + fi + done + if ! $pc_field_found; then + pc_fields=" sc_eip" # OpenBSD (i386) + pc_fields="$pc_fields sc_rip" # OpenBSD (x86_64) + for pc_field in $pc_fields; do + if ! $pc_field_found; then + AC_TRY_COMPILE([#include ], + [ucontext_t u; return u.$pc_field == 0;], + AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field, + How to access the PC from a struct ucontext) + AC_MSG_RESULT([$pc_field]) + pc_field_found=true) + fi + done + fi + if ! $pc_field_found; then + [$1] + fi]) diff --git a/spotify/breakpad/third_party/glog/m4/stl_namespace.m4 b/spotify/breakpad/third_party/glog/m4/stl_namespace.m4 new file mode 100644 index 000000000..989ad8069 --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/stl_namespace.m4 @@ -0,0 +1,25 @@ +# We check what namespace stl code like vector expects to be executed in + +AC_DEFUN([AC_CXX_STL_NAMESPACE], + [AC_CACHE_CHECK( + what namespace STL code is in, + ac_cv_cxx_stl_namespace, + [AC_REQUIRE([AC_CXX_NAMESPACES]) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include ], + [vector t; return 0;], + ac_cv_cxx_stl_namespace=none) + AC_TRY_COMPILE([#include ], + [std::vector t; return 0;], + ac_cv_cxx_stl_namespace=std) + AC_LANG_RESTORE]) + if test "$ac_cv_cxx_stl_namespace" = none; then + AC_DEFINE(STL_NAMESPACE,, + [the namespace where STL code like vector<> is defined]) + fi + if test "$ac_cv_cxx_stl_namespace" = std; then + AC_DEFINE(STL_NAMESPACE,std, + [the namespace where STL code like vector<> is defined]) + fi +]) diff --git a/spotify/breakpad/third_party/glog/m4/using_operator.m4 b/spotify/breakpad/third_party/glog/m4/using_operator.m4 new file mode 100644 index 000000000..95a9951eb --- /dev/null +++ b/spotify/breakpad/third_party/glog/m4/using_operator.m4 @@ -0,0 +1,15 @@ +AC_DEFUN([AC_CXX_USING_OPERATOR], + [AC_CACHE_CHECK( + whether compiler supports using ::operator<<, + ac_cv_cxx_using_operator, + [AC_LANG_SAVE + AC_LANG_CPLUSPLUS + AC_TRY_COMPILE([#include + std::ostream& operator<<(std::ostream&, struct s);], + [using ::operator<<; return 0;], + ac_cv_cxx_using_operator=1, + ac_cv_cxx_using_operator=0) + AC_LANG_RESTORE]) + if test "$ac_cv_cxx_using_operator" = 1; then + AC_DEFINE(HAVE_USING_OPERATOR, 1, [define if the compiler supports using expression for operator]) + fi]) diff --git a/spotify/breakpad/third_party/glog/missing b/spotify/breakpad/third_party/glog/missing new file mode 100755 index 000000000..1c8ff7049 --- /dev/null +++ b/spotify/breakpad/third_party/glog/missing @@ -0,0 +1,367 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2006-05-10.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). +case $1 in + lex|yacc) + # Not GNU programs, they don't have --version. + ;; + + tar) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $1 in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/spotify/breakpad/third_party/glog/mkinstalldirs b/spotify/breakpad/third_party/glog/mkinstalldirs new file mode 100755 index 000000000..ef7e16fda --- /dev/null +++ b/spotify/breakpad/third_party/glog/mkinstalldirs @@ -0,0 +1,161 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2006-05-11.19 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' +IFS=" "" $nl" +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/spotify/breakpad/third_party/glog/packages/deb.sh b/spotify/breakpad/third_party/glog/packages/deb.sh new file mode 100755 index 000000000..e6f4aca9a --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb.sh @@ -0,0 +1,71 @@ +#!/bin/bash -e + +# This takes one commandline argument, the name of the package. If no +# name is given, then we'll end up just using the name associated with +# an arbitrary .tar.gz file in the rootdir. That's fine: there's probably +# only one. +# +# Run this from the 'packages' directory, just under rootdir + +## Set LIB to lib if exporting a library, empty-string else +LIB= +#LIB=lib + +PACKAGE="$1" +VERSION="$2" + +# We can only build Debian packages, if the Debian build tools are installed +if [ \! -x /usr/bin/debuild ]; then + echo "Cannot find /usr/bin/debuild. Not building Debian packages." 1>&2 + exit 0 +fi + +# Double-check we're in the packages directory, just under rootdir +if [ \! -r ../Makefile -a \! -r ../INSTALL ]; then + echo "Must run $0 in the 'packages' directory, under the root directory." 1>&2 + echo "Also, you must run \"make dist\" before running this script." 1>&2 + exit 0 +fi + +# Find the top directory for this package +topdir="${PWD%/*}" + +# Find the tar archive built by "make dist" +archive="$PACKAGE-$VERSION" +if [ -z "${archive}" ]; then + echo "Cannot find ../$PACKAGE*.tar.gz. Run \"make dist\" first." 1>&2 + exit 0 +fi + +# Create a pristine directory for building the Debian package files +trap 'rm -rf '`pwd`/tmp'; exit $?' EXIT SIGHUP SIGINT SIGTERM + +rm -rf tmp +mkdir -p tmp +cd tmp + +# Debian has very specific requirements about the naming of build +# directories, and tar archives. It also wants to write all generated +# packages to the parent of the source directory. We accommodate these +# requirements by building directly from the tar file. +ln -s "${topdir}/${archive}.tar.gz" "${LIB}${archive}.orig.tar.gz" +tar zfx "${LIB}${archive}.orig.tar.gz" +[ -n "${LIB}" ] && mv "${archive}" "${LIB}${archive}" +cd "${LIB}${archive}" +# This is one of those 'specific requirements': where the deb control files live +ln -s "packages/deb" "debian" + +# Now, we can call Debian's standard build tool +debuild -uc -us +cd ../.. # get back to the original top-level dir + +# We'll put the result in a subdirectory that's named after the OS version +# we've made this .deb file for. +destdir="debian-$(cat /etc/debian_version 2>/dev/null || echo UNKNOWN)" + +rm -rf "$destdir" +mkdir -p "$destdir" +mv $(find tmp -mindepth 1 -maxdepth 1 -type f) "$destdir" + +echo +echo "The Debian package files are located in $PWD/$destdir" diff --git a/spotify/breakpad/third_party/glog/packages/deb/README b/spotify/breakpad/third_party/glog/packages/deb/README new file mode 100644 index 000000000..57becfda7 --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/README @@ -0,0 +1,7 @@ +The list of files here isn't complete. For a step-by-step guide on +how to set this package up correctly, check out + http://www.debian.org/doc/maint-guide/ + +Most of the files that are in this directory are boilerplate. +However, you may need to change the list of binary-arch dependencies +in 'rules'. diff --git a/spotify/breakpad/third_party/glog/packages/deb/changelog b/spotify/breakpad/third_party/glog/packages/deb/changelog new file mode 100644 index 000000000..524bedfdb --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/changelog @@ -0,0 +1,41 @@ +google-glog (0.3.1-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Tue, 15 Jun 2010 13:50:47 +0900 + +google-glog (0.3-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Thu, 30 Jul 2009 21:31:35 +0900 + +google-glog (0.2.1-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Fri, 10 Apr 2009 15:24:17 +0900 + +google-glog (0.2-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Fri, 23 Jan 2009 03:14:29 +0900 + +google-glog (0.1.2-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Tue, 18 Nov 2008 20:37:00 +0900 + +google-glog (0.1.1-1) unstable; urgency=low + + * New upstream release. + + -- Google Inc. Wed, 15 Oct 2008 20:38:19 +0900 + +google-glog (0.1-1) unstable; urgency=low + + * Initial release. + + -- Google Inc. Sat, 10 May 2008 12:31:10 +0900 diff --git a/spotify/breakpad/third_party/glog/packages/deb/compat b/spotify/breakpad/third_party/glog/packages/deb/compat new file mode 100644 index 000000000..b8626c4cf --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/compat @@ -0,0 +1 @@ +4 diff --git a/spotify/breakpad/third_party/glog/packages/deb/control b/spotify/breakpad/third_party/glog/packages/deb/control new file mode 100644 index 000000000..110a72cb3 --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/control @@ -0,0 +1,23 @@ +Source: google-glog +Priority: optional +Maintainer: Google Inc. +Build-Depends: debhelper (>= 4.0.0), binutils +Standards-Version: 3.6.1 + +Package: libgoogle-glog-dev +Section: libdevel +Architecture: any +Depends: libgoogle-glog0 (= ${Source-Version}) +Description: a library that implements application-level logging. + This library provides logging APIs based on C++-style streams and + various helper macros. The devel package contains static and debug + libraries and header files for developing applications that use the + google-glog package. + +Package: libgoogle-glog0 +Section: libs +Architecture: any +Depends: ${shlibs:Depends} +Description: a library that implements application-level logging. + This library provides logging APIs based on C++-style streams and + various helper macros. diff --git a/spotify/breakpad/third_party/glog/packages/deb/copyright b/spotify/breakpad/third_party/glog/packages/deb/copyright new file mode 100644 index 000000000..ed9d9d1ec --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/copyright @@ -0,0 +1,35 @@ +This package was debianized by Google Inc. on +13 June 2008. + +It was downloaded from http://code.google.com/ + +Upstream Author: opensource@google.com + +Copyright (c) 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/spotify/breakpad/third_party/glog/packages/deb/docs b/spotify/breakpad/third_party/glog/packages/deb/docs new file mode 100644 index 000000000..c3d0789b2 --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/docs @@ -0,0 +1,8 @@ +AUTHORS +COPYING +ChangeLog +INSTALL +NEWS +README +doc/designstyle.css +doc/glog.html diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs new file mode 100644 index 000000000..bddfbf5c1 --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs @@ -0,0 +1,4 @@ +usr/lib +usr/lib/pkgconfig +usr/include +usr/include/glog diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install new file mode 100644 index 000000000..9c61e86ea --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install @@ -0,0 +1,10 @@ +usr/include/glog/* +usr/lib/lib*.so +usr/lib/lib*.a +usr/lib/*.la +usr/lib/pkgconfig/* +debian/tmp/usr/include/glog/* +debian/tmp/usr/lib/lib*.so +debian/tmp/usr/lib/lib*.a +debian/tmp/usr/lib/*.la +debian/tmp/usr/lib/pkgconfig/* diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs new file mode 100644 index 000000000..68457717b --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs @@ -0,0 +1 @@ +usr/lib diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install new file mode 100644 index 000000000..704ea87ab --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install @@ -0,0 +1,2 @@ +usr/lib/lib*.so.* +debian/tmp/usr/lib/lib*.so.* diff --git a/spotify/breakpad/third_party/glog/packages/deb/rules b/spotify/breakpad/third_party/glog/packages/deb/rules new file mode 100755 index 000000000..f520befd2 --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/deb/rules @@ -0,0 +1,117 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) + + +CFLAGS = -Wall -g + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + CFLAGS += -O0 +else + CFLAGS += -O2 +endif +ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) + INSTALL_PROGRAM += -s +endif + +# shared library versions, option 1 +#version=2.0.5 +#major=2 +# option 2, assuming the library is created as src/.libs/libfoo.so.2.0.5 or so +version=`ls src/.libs/lib*.so.* | \ + awk '{if (match($$0,/[0-9]+\.[0-9]+\.[0-9]+$$/)) print substr($$0,RSTART)}'` +major=`ls src/.libs/lib*.so.* | \ + awk '{if (match($$0,/\.so\.[0-9]+$$/)) print substr($$0,RSTART+4)}'` + +config.status: configure + dh_testdir + # Add here commands to configure the package. + CFLAGS="$(CFLAGS)" ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info + + +build: build-stamp +build-stamp: config.status + dh_testdir + + # Add here commands to compile the package. + $(MAKE) + + touch build-stamp + +clean: + dh_testdir + dh_testroot + rm -f build-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) distclean +ifneq "$(wildcard /usr/share/misc/config.sub)" "" + cp -f /usr/share/misc/config.sub config.sub +endif +ifneq "$(wildcard /usr/share/misc/config.guess)" "" + cp -f /usr/share/misc/config.guess config.guess +endif + + + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp + $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp + + +# Build architecture-independent files here. +binary-indep: build install +# We have nothing to do by default. + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir + dh_testroot + dh_installchangelogs ChangeLog + dh_installdocs + dh_installexamples + dh_install --sourcedir=debian/tmp +# dh_installmenu +# dh_installdebconf +# dh_installlogrotate +# dh_installemacsen +# dh_installpam +# dh_installmime +# dh_installinit +# dh_installcron +# dh_installinfo + dh_installman + dh_link + dh_strip + dh_compress + dh_fixperms +# dh_perl +# dh_python + dh_makeshlibs + dh_installdeb + dh_shlibdeps + dh_gencontrol + dh_md5sums + dh_builddeb + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install diff --git a/spotify/breakpad/third_party/glog/packages/rpm.sh b/spotify/breakpad/third_party/glog/packages/rpm.sh new file mode 100755 index 000000000..5395dc02b --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/rpm.sh @@ -0,0 +1,75 @@ +#!/bin/sh -e + +# Run this from the 'packages' directory, just under rootdir + +# We can only build rpm packages, if the rpm build tools are installed +if [ \! -x /usr/bin/rpmbuild ] +then + echo "Cannot find /usr/bin/rpmbuild. Not building an rpm." 1>&2 + exit 0 +fi + +# Check the commandline flags +PACKAGE="$1" +VERSION="$2" +fullname="${PACKAGE}-${VERSION}" +archive=../$fullname.tar.gz + +if [ -z "$1" -o -z "$2" ] +then + echo "Usage: $0 " 1>&2 + exit 0 +fi + +# Double-check we're in the packages directory, just under rootdir +if [ \! -r ../Makefile -a \! -r ../INSTALL ] +then + echo "Must run $0 in the 'packages' directory, under the root directory." 1>&2 + echo "Also, you must run \"make dist\" before running this script." 1>&2 + exit 0 +fi + +if [ \! -r "$archive" ] +then + echo "Cannot find $archive. Run \"make dist\" first." 1>&2 + exit 0 +fi + +# Create the directory where the input lives, and where the output should live +RPM_SOURCE_DIR="/tmp/rpmsource-$fullname" +RPM_BUILD_DIR="/tmp/rpmbuild-$fullname" + +trap 'rm -rf $RPM_SOURCE_DIR $RPM_BUILD_DIR; exit $?' EXIT SIGHUP SIGINT SIGTERM + +rm -rf "$RPM_SOURCE_DIR" "$RPM_BUILD_DIR" +mkdir "$RPM_SOURCE_DIR" +mkdir "$RPM_BUILD_DIR" + +cp "$archive" "$RPM_SOURCE_DIR" + +rpmbuild -bb rpm/rpm.spec \ + --define "NAME $PACKAGE" \ + --define "VERSION $VERSION" \ + --define "_sourcedir $RPM_SOURCE_DIR" \ + --define "_builddir $RPM_BUILD_DIR" \ + --define "_rpmdir $RPM_SOURCE_DIR" + +# We put the output in a directory based on what system we've built for +destdir=rpm-unknown +if [ -r /etc/issue ] +then + grep "Red Hat.*release 7" /etc/issue >/dev/null 2>&1 && destdir=rh7 + grep "Red Hat.*release 8" /etc/issue >/dev/null 2>&1 && destdir=rh8 + grep "Red Hat.*release 9" /etc/issue >/dev/null 2>&1 && destdir=rh9 + if grep Fedora /etc/issue >/dev/null; then + destdir=fc`grep Fedora /etc/issue | cut -d' ' -f 4`; + fi +fi + +rm -rf "$destdir" +mkdir -p "$destdir" +# We want to get not only the main package but devel etc, hence the middle * +mv "$RPM_SOURCE_DIR"/*/"${PACKAGE}"-*"${VERSION}"*.rpm "$destdir" + +echo +echo "The rpm package file(s) are located in $PWD/$destdir" diff --git a/spotify/breakpad/third_party/glog/packages/rpm/rpm.spec b/spotify/breakpad/third_party/glog/packages/rpm/rpm.spec new file mode 100644 index 000000000..c2edc83a8 --- /dev/null +++ b/spotify/breakpad/third_party/glog/packages/rpm/rpm.spec @@ -0,0 +1,72 @@ +%define RELEASE 1 +%define rel %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE} +%define prefix /usr + +Name: %NAME +Summary: A C++ application logging library +Version: %VERSION +Release: %rel +Group: Development/Libraries +URL: http://code.google.com/p/google-glog +License: BSD +Vendor: Google +Packager: Google Inc. +Source: http://%{NAME}.googlecode.com/files/%{NAME}-%{VERSION}.tar.gz +Distribution: Redhat 7 and above. +Buildroot: %{_tmppath}/%{name}-root +Prefix: %prefix + +%description +The %name package contains a library that implements application-level +logging. This library provides logging APIs based on C++-style +streams and various helper macros. + +%package devel +Summary: A C++ application logging library +Group: Development/Libraries +Requires: %{NAME} = %{VERSION} + +%description devel +The %name-devel package contains static and debug libraries and header +files for developing applications that use the %name package. + +%changelog + * Wed Mar 26 2008 + - First draft + +%prep +%setup + +%build +./configure +make prefix=%prefix + +%install +rm -rf $RPM_BUILD_ROOT +make prefix=$RPM_BUILD_ROOT%{prefix} install + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +%defattr(-,root,root) + +## Mark all installed files within /usr/share/doc/{package name} as +## documentation. This depends on the following two lines appearing in +## Makefile.am: +## docdir = $(prefix)/share/doc/$(PACKAGE)-$(VERSION) +## dist_doc_DATA = AUTHORS COPYING ChangeLog INSTALL NEWS README +%docdir %{prefix}/share/doc/%{NAME}-%{VERSION} +%{prefix}/share/doc/%{NAME}-%{VERSION}/* + +%{prefix}/lib/libglog.so.0 +%{prefix}/lib/libglog.so.0.0.0 + +%files devel +%defattr(-,root,root) + +%{prefix}/include/glog +%{prefix}/lib/libglog.a +%{prefix}/lib/libglog.la +%{prefix}/lib/libglog.so +%{prefix}/lib/pkgconfig/libglog.pc diff --git a/spotify/breakpad/third_party/glog/src/base/commandlineflags.h b/spotify/breakpad/third_party/glog/src/base/commandlineflags.h new file mode 100644 index 000000000..53d9485f5 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/base/commandlineflags.h @@ -0,0 +1,132 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// This file is a compatibility layer that defines Google's version of +// command line flags that are used for configuration. +// +// We put flags into their own namespace. It is purposefully +// named in an opaque way that people should have trouble typing +// directly. The idea is that DEFINE puts the flag in the weird +// namespace, and DECLARE imports the flag from there into the +// current namespace. The net result is to force people to use +// DECLARE to get access to a flag, rather than saying +// extern bool FLAGS_logtostderr; +// or some such instead. We want this so we can put extra +// functionality (like sanity-checking) in DECLARE if we want, +// and make sure it is picked up everywhere. +// +// We also put the type of the variable in the namespace, so that +// people can't DECLARE_int32 something that they DEFINE_bool'd +// elsewhere. +#ifndef BASE_COMMANDLINEFLAGS_H__ +#define BASE_COMMANDLINEFLAGS_H__ + +#include "config.h" +#include +#include // for memchr +#include // for getenv + +#ifdef HAVE_LIB_GFLAGS + +#include + +#else + +#include "glog/logging.h" + +#define DECLARE_VARIABLE(type, name, tn) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead { \ + extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name +#define DEFINE_VARIABLE(type, name, value, meaning, tn) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead { \ + GOOGLE_GLOG_DLL_DECL type FLAGS_##name(value); \ + char FLAGS_no##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name + +// bool specialization +#define DECLARE_bool(name) \ + DECLARE_VARIABLE(bool, name, bool) +#define DEFINE_bool(name, value, meaning) \ + DEFINE_VARIABLE(bool, name, value, meaning, bool) + +// int32 specialization +#define DECLARE_int32(name) \ + DECLARE_VARIABLE(GOOGLE_NAMESPACE::int32, name, int32) +#define DEFINE_int32(name, value, meaning) \ + DEFINE_VARIABLE(GOOGLE_NAMESPACE::int32, name, value, meaning, int32) + +// Special case for string, because we have to specify the namespace +// std::string, which doesn't play nicely with our FLAG__namespace hackery. +#define DECLARE_string(name) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead { \ + extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name +#define DEFINE_string(name, value, meaning) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead { \ + GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name(value); \ + char FLAGS_no##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name + +#endif // HAVE_LIB_GFLAGS + +// Define GLOG_DEFINE_* using DEFINE_* . By using these macros, we +// have GLOG_* environ variables even if we have gflags installed. +// +// If both an environment variable and a flag are specified, the value +// specified by a flag wins. E.g., if GLOG_v=0 and --v=1, the +// verbosity will be 1, not 0. + +#define GLOG_DEFINE_bool(name, value, meaning) \ + DEFINE_bool(name, EnvToBool("GLOG_" #name, value), meaning) + +#define GLOG_DEFINE_int32(name, value, meaning) \ + DEFINE_int32(name, EnvToInt("GLOG_" #name, value), meaning) + +#define GLOG_DEFINE_string(name, value, meaning) \ + DEFINE_string(name, EnvToString("GLOG_" #name, value), meaning) + +// These macros (could be functions, but I don't want to bother with a .cc +// file), make it easier to initialize flags from the environment. + +#define EnvToString(envname, dflt) \ + (!getenv(envname) ? (dflt) : getenv(envname)) + +#define EnvToBool(envname, dflt) \ + (!getenv(envname) ? (dflt) : memchr("tTyY1\0", getenv(envname)[0], 6) != NULL) + +#define EnvToInt(envname, dflt) \ + (!getenv(envname) ? (dflt) : strtol(getenv(envname), NULL, 10)) + +#endif // BASE_COMMANDLINEFLAGS_H__ diff --git a/spotify/breakpad/third_party/glog/src/base/googleinit.h b/spotify/breakpad/third_party/glog/src/base/googleinit.h new file mode 100644 index 000000000..c907308e8 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/base/googleinit.h @@ -0,0 +1,51 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Jacob Hoffman-Andrews + +#ifndef _GOOGLEINIT_H +#define _GOOGLEINIT_H + +class GoogleInitializer { + public: + typedef void (*void_function)(void); + GoogleInitializer(const char* name, void_function f) { + f(); + } +}; + +#define REGISTER_MODULE_INITIALIZER(name, body) \ + namespace { \ + static void google_init_module_##name () { body; } \ + GoogleInitializer google_initializer_module_##name(#name, \ + google_init_module_##name); \ + } + +#endif /* _GOOGLEINIT_H */ diff --git a/spotify/breakpad/third_party/glog/src/base/mutex.h b/spotify/breakpad/third_party/glog/src/base/mutex.h new file mode 100644 index 000000000..7ba88cb5a --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/base/mutex.h @@ -0,0 +1,325 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// --- +// Author: Craig Silverstein. +// +// A simple mutex wrapper, supporting locks and read-write locks. +// You should assume the locks are *not* re-entrant. +// +// To use: you should define the following macros in your configure.ac: +// ACX_PTHREAD +// AC_RWLOCK +// The latter is defined in ../autoconf. +// +// This class is meant to be internal-only and should be wrapped by an +// internal namespace. Before you use this module, please give the +// name of your internal namespace for this module. Or, if you want +// to expose it, you'll want to move it to the Google namespace. We +// cannot put this class in global namespace because there can be some +// problems when we have multiple versions of Mutex in each shared object. +// +// NOTE: by default, we have #ifdef'ed out the TryLock() method. +// This is for two reasons: +// 1) TryLock() under Windows is a bit annoying (it requires a +// #define to be defined very early). +// 2) TryLock() is broken for NO_THREADS mode, at least in NDEBUG +// mode. +// If you need TryLock(), and either these two caveats are not a +// problem for you, or you're willing to work around them, then +// feel free to #define GMUTEX_TRYLOCK, or to remove the #ifdefs +// in the code below. +// +// CYGWIN NOTE: Cygwin support for rwlock seems to be buggy: +// http://www.cygwin.com/ml/cygwin/2008-12/msg00017.html +// Because of that, we might as well use windows locks for +// cygwin. They seem to be more reliable than the cygwin pthreads layer. +// +// TRICKY IMPLEMENTATION NOTE: +// This class is designed to be safe to use during +// dynamic-initialization -- that is, by global constructors that are +// run before main() starts. The issue in this case is that +// dynamic-initialization happens in an unpredictable order, and it +// could be that someone else's dynamic initializer could call a +// function that tries to acquire this mutex -- but that all happens +// before this mutex's constructor has run. (This can happen even if +// the mutex and the function that uses the mutex are in the same .cc +// file.) Basically, because Mutex does non-trivial work in its +// constructor, it's not, in the naive implementation, safe to use +// before dynamic initialization has run on it. +// +// The solution used here is to pair the actual mutex primitive with a +// bool that is set to true when the mutex is dynamically initialized. +// (Before that it's false.) Then we modify all mutex routines to +// look at the bool, and not try to lock/unlock until the bool makes +// it to true (which happens after the Mutex constructor has run.) +// +// This works because before main() starts -- particularly, during +// dynamic initialization -- there are no threads, so a) it's ok that +// the mutex operations are a no-op, since we don't need locking then +// anyway; and b) we can be quite confident our bool won't change +// state between a call to Lock() and a call to Unlock() (that would +// require a global constructor in one translation unit to call Lock() +// and another global constructor in another translation unit to call +// Unlock() later, which is pretty perverse). +// +// That said, it's tricky, and can conceivably fail; it's safest to +// avoid trying to acquire a mutex in a global constructor, if you +// can. One way it can fail is that a really smart compiler might +// initialize the bool to true at static-initialization time (too +// early) rather than at dynamic-initialization time. To discourage +// that, we set is_safe_ to true in code (not the constructor +// colon-initializer) and set it to true via a function that always +// evaluates to true, but that the compiler can't know always +// evaluates to true. This should be good enough. + +#ifndef GOOGLE_MUTEX_H_ +#define GOOGLE_MUTEX_H_ + +#include "config.h" // to figure out pthreads support + +#if defined(NO_THREADS) + typedef int MutexType; // to keep a lock-count +#elif defined(_WIN32) || defined(__CYGWIN32__) || defined(__CYGWIN64__) +# define WIN32_LEAN_AND_MEAN // We only need minimal includes +# ifdef GMUTEX_TRYLOCK + // We need Windows NT or later for TryEnterCriticalSection(). If you + // don't need that functionality, you can remove these _WIN32_WINNT + // lines, and change TryLock() to assert(0) or something. +# ifndef _WIN32_WINNT +# define _WIN32_WINNT 0x0400 +# endif +# endif +// To avoid macro definition of ERROR. +# define NOGDI +// To avoid macro definition of min/max. +# define NOMINMAX +# include + typedef CRITICAL_SECTION MutexType; +#elif defined(HAVE_PTHREAD) && defined(HAVE_RWLOCK) + // Needed for pthread_rwlock_*. If it causes problems, you could take it + // out, but then you'd have to unset HAVE_RWLOCK (at least on linux -- it + // *does* cause problems for FreeBSD, or MacOSX, but isn't needed + // for locking there.) +# ifdef __linux__ +# define _XOPEN_SOURCE 500 // may be needed to get the rwlock calls +# endif +# include + typedef pthread_rwlock_t MutexType; +#elif defined(HAVE_PTHREAD) +# include + typedef pthread_mutex_t MutexType; +#else +# error Need to implement mutex.h for your architecture, or #define NO_THREADS +#endif + +// We need to include these header files after defining _XOPEN_SOURCE +// as they may define the _XOPEN_SOURCE macro. +#include +#include // for abort() + +#define MUTEX_NAMESPACE glog_internal_namespace_ + +namespace MUTEX_NAMESPACE { + +class Mutex { + public: + // Create a Mutex that is not held by anybody. This constructor is + // typically used for Mutexes allocated on the heap or the stack. + // See below for a recommendation for constructing global Mutex + // objects. + inline Mutex(); + + // Destructor + inline ~Mutex(); + + inline void Lock(); // Block if needed until free then acquire exclusively + inline void Unlock(); // Release a lock acquired via Lock() +#ifdef GMUTEX_TRYLOCK + inline bool TryLock(); // If free, Lock() and return true, else return false +#endif + // Note that on systems that don't support read-write locks, these may + // be implemented as synonyms to Lock() and Unlock(). So you can use + // these for efficiency, but don't use them anyplace where being able + // to do shared reads is necessary to avoid deadlock. + inline void ReaderLock(); // Block until free or shared then acquire a share + inline void ReaderUnlock(); // Release a read share of this Mutex + inline void WriterLock() { Lock(); } // Acquire an exclusive lock + inline void WriterUnlock() { Unlock(); } // Release a lock from WriterLock() + + // TODO(hamaji): Do nothing, implement correctly. + inline void AssertHeld() {} + + private: + MutexType mutex_; + // We want to make sure that the compiler sets is_safe_ to true only + // when we tell it to, and never makes assumptions is_safe_ is + // always true. volatile is the most reliable way to do that. + volatile bool is_safe_; + + inline void SetIsSafe() { is_safe_ = true; } + + // Catch the error of writing Mutex when intending MutexLock. + Mutex(Mutex* /*ignored*/) {} + // Disallow "evil" constructors + Mutex(const Mutex&); + void operator=(const Mutex&); +}; + +// Now the implementation of Mutex for various systems +#if defined(NO_THREADS) + +// When we don't have threads, we can be either reading or writing, +// but not both. We can have lots of readers at once (in no-threads +// mode, that's most likely to happen in recursive function calls), +// but only one writer. We represent this by having mutex_ be -1 when +// writing and a number > 0 when reading (and 0 when no lock is held). +// +// In debug mode, we assert these invariants, while in non-debug mode +// we do nothing, for efficiency. That's why everything is in an +// assert. + +Mutex::Mutex() : mutex_(0) { } +Mutex::~Mutex() { assert(mutex_ == 0); } +void Mutex::Lock() { assert(--mutex_ == -1); } +void Mutex::Unlock() { assert(mutex_++ == -1); } +#ifdef GMUTEX_TRYLOCK +bool Mutex::TryLock() { if (mutex_) return false; Lock(); return true; } +#endif +void Mutex::ReaderLock() { assert(++mutex_ > 0); } +void Mutex::ReaderUnlock() { assert(mutex_-- > 0); } + +#elif defined(_WIN32) || defined(__CYGWIN32__) || defined(__CYGWIN64__) + +Mutex::Mutex() { InitializeCriticalSection(&mutex_); SetIsSafe(); } +Mutex::~Mutex() { DeleteCriticalSection(&mutex_); } +void Mutex::Lock() { if (is_safe_) EnterCriticalSection(&mutex_); } +void Mutex::Unlock() { if (is_safe_) LeaveCriticalSection(&mutex_); } +#ifdef GMUTEX_TRYLOCK +bool Mutex::TryLock() { return is_safe_ ? + TryEnterCriticalSection(&mutex_) != 0 : true; } +#endif +void Mutex::ReaderLock() { Lock(); } // we don't have read-write locks +void Mutex::ReaderUnlock() { Unlock(); } + +#elif defined(HAVE_PTHREAD) && defined(HAVE_RWLOCK) + +#define SAFE_PTHREAD(fncall) do { /* run fncall if is_safe_ is true */ \ + if (is_safe_ && fncall(&mutex_) != 0) abort(); \ +} while (0) + +Mutex::Mutex() { + SetIsSafe(); + if (is_safe_ && pthread_rwlock_init(&mutex_, NULL) != 0) abort(); +} +Mutex::~Mutex() { SAFE_PTHREAD(pthread_rwlock_destroy); } +void Mutex::Lock() { SAFE_PTHREAD(pthread_rwlock_wrlock); } +void Mutex::Unlock() { SAFE_PTHREAD(pthread_rwlock_unlock); } +#ifdef GMUTEX_TRYLOCK +bool Mutex::TryLock() { return is_safe_ ? + pthread_rwlock_trywrlock(&mutex_) == 0 : + true; } +#endif +void Mutex::ReaderLock() { SAFE_PTHREAD(pthread_rwlock_rdlock); } +void Mutex::ReaderUnlock() { SAFE_PTHREAD(pthread_rwlock_unlock); } +#undef SAFE_PTHREAD + +#elif defined(HAVE_PTHREAD) + +#define SAFE_PTHREAD(fncall) do { /* run fncall if is_safe_ is true */ \ + if (is_safe_ && fncall(&mutex_) != 0) abort(); \ +} while (0) + +Mutex::Mutex() { + SetIsSafe(); + if (is_safe_ && pthread_mutex_init(&mutex_, NULL) != 0) abort(); +} +Mutex::~Mutex() { SAFE_PTHREAD(pthread_mutex_destroy); } +void Mutex::Lock() { SAFE_PTHREAD(pthread_mutex_lock); } +void Mutex::Unlock() { SAFE_PTHREAD(pthread_mutex_unlock); } +#ifdef GMUTEX_TRYLOCK +bool Mutex::TryLock() { return is_safe_ ? + pthread_mutex_trylock(&mutex_) == 0 : true; } +#endif +void Mutex::ReaderLock() { Lock(); } +void Mutex::ReaderUnlock() { Unlock(); } +#undef SAFE_PTHREAD + +#endif + +// -------------------------------------------------------------------------- +// Some helper classes + +// MutexLock(mu) acquires mu when constructed and releases it when destroyed. +class MutexLock { + public: + explicit MutexLock(Mutex *mu) : mu_(mu) { mu_->Lock(); } + ~MutexLock() { mu_->Unlock(); } + private: + Mutex * const mu_; + // Disallow "evil" constructors + MutexLock(const MutexLock&); + void operator=(const MutexLock&); +}; + +// ReaderMutexLock and WriterMutexLock do the same, for rwlocks +class ReaderMutexLock { + public: + explicit ReaderMutexLock(Mutex *mu) : mu_(mu) { mu_->ReaderLock(); } + ~ReaderMutexLock() { mu_->ReaderUnlock(); } + private: + Mutex * const mu_; + // Disallow "evil" constructors + ReaderMutexLock(const ReaderMutexLock&); + void operator=(const ReaderMutexLock&); +}; + +class WriterMutexLock { + public: + explicit WriterMutexLock(Mutex *mu) : mu_(mu) { mu_->WriterLock(); } + ~WriterMutexLock() { mu_->WriterUnlock(); } + private: + Mutex * const mu_; + // Disallow "evil" constructors + WriterMutexLock(const WriterMutexLock&); + void operator=(const WriterMutexLock&); +}; + +// Catch bug where variable name is omitted, e.g. MutexLock (&mu); +#define MutexLock(x) COMPILE_ASSERT(0, mutex_lock_decl_missing_var_name) +#define ReaderMutexLock(x) COMPILE_ASSERT(0, rmutex_lock_decl_missing_var_name) +#define WriterMutexLock(x) COMPILE_ASSERT(0, wmutex_lock_decl_missing_var_name) + +} // namespace MUTEX_NAMESPACE + +using namespace MUTEX_NAMESPACE; + +#undef MUTEX_NAMESPACE + +#endif /* #define GOOGLE_MUTEX_H__ */ diff --git a/spotify/breakpad/third_party/glog/src/config.h.in b/spotify/breakpad/third_party/glog/src/config.h.in new file mode 100644 index 000000000..844a7fce5 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/config.h.in @@ -0,0 +1,165 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Namespace for Google classes */ +#undef GOOGLE_NAMESPACE + +/* Define if you have the `dladdr' function */ +#undef HAVE_DLADDR + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_EXECINFO_H + +/* Define if you have the `fcntl' function */ +#undef HAVE_FCNTL + +/* Define to 1 if you have the header file. */ +#undef HAVE_GLOB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +#undef HAVE_LIBPTHREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUNWIND_H + +/* define if you have google gflags library */ +#undef HAVE_LIB_GFLAGS + +/* define if you have google gmock library */ +#undef HAVE_LIB_GMOCK + +/* define if you have google gtest library */ +#undef HAVE_LIB_GTEST + +/* define if you have libunwind */ +#undef HAVE_LIB_UNWIND + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* define if the compiler implements namespaces */ +#undef HAVE_NAMESPACES + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if you have the header file. */ +#undef HAVE_PWD_H + +/* define if the compiler implements pthread_rwlock_* */ +#undef HAVE_RWLOCK + +/* Define if you have the `sigaltstack' function */ +#undef HAVE_SIGALTSTACK + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSCALL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSLOG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCALL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UCONTEXT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UTSNAME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UCONTEXT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* define if the compiler supports using expression for operator */ +#undef HAVE_USING_OPERATOR + +/* define if your compiler has __attribute__ */ +#undef HAVE___ATTRIBUTE__ + +/* define if your compiler has __builtin_expect */ +#undef HAVE___BUILTIN_EXPECT + +/* define if your compiler has __sync_val_compare_and_swap */ +#undef HAVE___SYNC_VAL_COMPARE_AND_SWAP + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* How to access the PC from a struct ucontext */ +#undef PC_FROM_UCONTEXT + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* the namespace where STL code like vector<> is defined */ +#undef STL_NAMESPACE + +/* location of source code */ +#undef TEST_SRC_DIR + +/* Version number of package */ +#undef VERSION + +/* Stops putting the code inside the Google namespace */ +#undef _END_GOOGLE_NAMESPACE_ + +/* Puts following code inside the Google namespace */ +#undef _START_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/config_for_unittests.h b/spotify/breakpad/third_party/glog/src/config_for_unittests.h new file mode 100644 index 000000000..13ea8eab7 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/config_for_unittests.h @@ -0,0 +1,66 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// All Rights Reserved. +// +// Author: Craig Silverstein +// Copied from google-perftools and modified by Shinichiro Hamaji +// +// This file is needed for windows -- unittests are not part of the +// glog dll, but still want to include config.h just like the +// dll does, so they can use internal tools and APIs for testing. +// +// The problem is that config.h declares GOOGLE_GLOG_DLL_DECL to be +// for exporting symbols, but the unittest needs to *import* symbols +// (since it's not the dll). +// +// The solution is to have this file, which is just like config.h but +// sets GOOGLE_GLOG_DLL_DECL to do a dllimport instead of a dllexport. +// +// The reason we need this extra GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS +// variable is in case people want to set GOOGLE_GLOG_DLL_DECL explicitly +// to something other than __declspec(dllexport). In that case, they +// may want to use something other than __declspec(dllimport) for the +// unittest case. For that, we allow folks to define both +// GOOGLE_GLOG_DLL_DECL and GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS explicitly. +// +// NOTE: This file is equivalent to config.h on non-windows systems, +// which never defined GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS and always +// define GOOGLE_GLOG_DLL_DECL to the empty string. + +#include "config.h" + +#undef GOOGLE_GLOG_DLL_DECL +#ifdef GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS +# define GOOGLE_GLOG_DLL_DECL GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS +#else +// if DLL_DECL_FOR_UNITTESTS isn't defined, use "" +# define GOOGLE_GLOG_DLL_DECL +#endif diff --git a/spotify/breakpad/third_party/glog/src/demangle.cc b/spotify/breakpad/third_party/glog/src/demangle.cc new file mode 100644 index 000000000..2fbb79003 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/demangle.cc @@ -0,0 +1,1307 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// +// For reference check out: +// http://www.codesourcery.com/public/cxx-abi/abi.html#mangling +// +// Note that we only have partial C++0x support yet. + +#include // for NULL +#include "demangle.h" + +_START_GOOGLE_NAMESPACE_ + +typedef struct { + const char *abbrev; + const char *real_name; +} AbbrevPair; + +// List of operators from Itanium C++ ABI. +static const AbbrevPair kOperatorList[] = { + { "nw", "new" }, + { "na", "new[]" }, + { "dl", "delete" }, + { "da", "delete[]" }, + { "ps", "+" }, + { "ng", "-" }, + { "ad", "&" }, + { "de", "*" }, + { "co", "~" }, + { "pl", "+" }, + { "mi", "-" }, + { "ml", "*" }, + { "dv", "/" }, + { "rm", "%" }, + { "an", "&" }, + { "or", "|" }, + { "eo", "^" }, + { "aS", "=" }, + { "pL", "+=" }, + { "mI", "-=" }, + { "mL", "*=" }, + { "dV", "/=" }, + { "rM", "%=" }, + { "aN", "&=" }, + { "oR", "|=" }, + { "eO", "^=" }, + { "ls", "<<" }, + { "rs", ">>" }, + { "lS", "<<=" }, + { "rS", ">>=" }, + { "eq", "==" }, + { "ne", "!=" }, + { "lt", "<" }, + { "gt", ">" }, + { "le", "<=" }, + { "ge", ">=" }, + { "nt", "!" }, + { "aa", "&&" }, + { "oo", "||" }, + { "pp", "++" }, + { "mm", "--" }, + { "cm", "," }, + { "pm", "->*" }, + { "pt", "->" }, + { "cl", "()" }, + { "ix", "[]" }, + { "qu", "?" }, + { "st", "sizeof" }, + { "sz", "sizeof" }, + { NULL, NULL }, +}; + +// List of builtin types from Itanium C++ ABI. +static const AbbrevPair kBuiltinTypeList[] = { + { "v", "void" }, + { "w", "wchar_t" }, + { "b", "bool" }, + { "c", "char" }, + { "a", "signed char" }, + { "h", "unsigned char" }, + { "s", "short" }, + { "t", "unsigned short" }, + { "i", "int" }, + { "j", "unsigned int" }, + { "l", "long" }, + { "m", "unsigned long" }, + { "x", "long long" }, + { "y", "unsigned long long" }, + { "n", "__int128" }, + { "o", "unsigned __int128" }, + { "f", "float" }, + { "d", "double" }, + { "e", "long double" }, + { "g", "__float128" }, + { "z", "ellipsis" }, + { NULL, NULL } +}; + +// List of substitutions Itanium C++ ABI. +static const AbbrevPair kSubstitutionList[] = { + { "St", "" }, + { "Sa", "allocator" }, + { "Sb", "basic_string" }, + // std::basic_string,std::allocator > + { "Ss", "string"}, + // std::basic_istream > + { "Si", "istream" }, + // std::basic_ostream > + { "So", "ostream" }, + // std::basic_iostream > + { "Sd", "iostream" }, + { NULL, NULL } +}; + +// State needed for demangling. +typedef struct { + const char *mangled_cur; // Cursor of mangled name. + char *out_cur; // Cursor of output string. + const char *out_begin; // Beginning of output string. + const char *out_end; // End of output string. + const char *prev_name; // For constructors/destructors. + int prev_name_length; // For constructors/destructors. + short nest_level; // For nested names. + bool append; // Append flag. + bool overflowed; // True if output gets overflowed. +} State; + +// We don't use strlen() in libc since it's not guaranteed to be async +// signal safe. +static size_t StrLen(const char *str) { + size_t len = 0; + while (*str != '\0') { + ++str; + ++len; + } + return len; +} + +// Returns true if "str" has at least "n" characters remaining. +static bool AtLeastNumCharsRemaining(const char *str, int n) { + for (int i = 0; i < n; ++i) { + if (str == '\0') { + return false; + } + } + return true; +} + +// Returns true if "str" has "prefix" as a prefix. +static bool StrPrefix(const char *str, const char *prefix) { + size_t i = 0; + while (str[i] != '\0' && prefix[i] != '\0' && + str[i] == prefix[i]) { + ++i; + } + return prefix[i] == '\0'; // Consumed everything in "prefix". +} + +static void InitState(State *state, const char *mangled, + char *out, int out_size) { + state->mangled_cur = mangled; + state->out_cur = out; + state->out_begin = out; + state->out_end = out + out_size; + state->prev_name = NULL; + state->prev_name_length = -1; + state->nest_level = -1; + state->append = true; + state->overflowed = false; +} + +// Returns true and advances "mangled_cur" if we find "one_char_token" +// at "mangled_cur" position. It is assumed that "one_char_token" does +// not contain '\0'. +static bool ParseOneCharToken(State *state, const char one_char_token) { + if (state->mangled_cur[0] == one_char_token) { + ++state->mangled_cur; + return true; + } + return false; +} + +// Returns true and advances "mangled_cur" if we find "two_char_token" +// at "mangled_cur" position. It is assumed that "two_char_token" does +// not contain '\0'. +static bool ParseTwoCharToken(State *state, const char *two_char_token) { + if (state->mangled_cur[0] == two_char_token[0] && + state->mangled_cur[1] == two_char_token[1]) { + state->mangled_cur += 2; + return true; + } + return false; +} + +// Returns true and advances "mangled_cur" if we find any character in +// "char_class" at "mangled_cur" position. +static bool ParseCharClass(State *state, const char *char_class) { + if (state->mangled_cur == '\0') { + return false; + } + const char *p = char_class; + for (; *p != '\0'; ++p) { + if (state->mangled_cur[0] == *p) { + ++state->mangled_cur; + return true; + } + } + return false; +} + +// This function is used for handling an optional non-terminal. +static bool Optional(bool status) { + return true; +} + +// This function is used for handling + syntax. +typedef bool (*ParseFunc)(State *); +static bool OneOrMore(ParseFunc parse_func, State *state) { + if (parse_func(state)) { + while (parse_func(state)) { + } + return true; + } + return false; +} + +// This function is used for handling * syntax. The function +// always returns true and must be followed by a termination token or a +// terminating sequence not handled by parse_func (e.g. +// ParseOneCharToken(state, 'E')). +static bool ZeroOrMore(ParseFunc parse_func, State *state) { + while (parse_func(state)) { + } + return true; +} + +// Append "str" at "out_cur". If there is an overflow, "overflowed" +// is set to true for later use. The output string is ensured to +// always terminate with '\0' as long as there is no overflow. +static void Append(State *state, const char * const str, const int length) { + int i; + for (i = 0; i < length; ++i) { + if (state->out_cur + 1 < state->out_end) { // +1 for '\0' + *state->out_cur = str[i]; + ++state->out_cur; + } else { + state->overflowed = true; + break; + } + } + if (!state->overflowed) { + *state->out_cur = '\0'; // Terminate it with '\0' + } +} + +// We don't use equivalents in libc to avoid locale issues. +static bool IsLower(char c) { + return c >= 'a' && c <= 'z'; +} + +static bool IsAlpha(char c) { + return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +static bool IsDigit(char c) { + return c >= '0' && c <= '9'; +} + +// Returns true if "str" is a function clone suffix. These suffixes are used +// by GCC 4.5.x and later versions to indicate functions which have been +// cloned during optimization. We treat any sequence (.+.+)+ as +// a function clone suffix. +static bool IsFunctionCloneSuffix(const char *str) { + size_t i = 0; + while (str[i] != '\0') { + // Consume a single .+.+ sequence. + if (str[i] != '.' || !IsAlpha(str[i + 1])) { + return false; + } + i += 2; + while (IsAlpha(str[i])) { + ++i; + } + if (str[i] != '.' || !IsDigit(str[i + 1])) { + return false; + } + i += 2; + while (IsDigit(str[i])) { + ++i; + } + } + return true; // Consumed everything in "str". +} + +// Append "str" with some tweaks, iff "append" state is true. +// Returns true so that it can be placed in "if" conditions. +static void MaybeAppendWithLength(State *state, const char * const str, + const int length) { + if (state->append && length > 0) { + // Append a space if the output buffer ends with '<' and "str" + // starts with '<' to avoid <<<. + if (str[0] == '<' && state->out_begin < state->out_cur && + state->out_cur[-1] == '<') { + Append(state, " ", 1); + } + // Remember the last identifier name for ctors/dtors. + if (IsAlpha(str[0]) || str[0] == '_') { + state->prev_name = state->out_cur; + state->prev_name_length = length; + } + Append(state, str, length); + } +} + +// A convenient wrapper arount MaybeAppendWithLength(). +static bool MaybeAppend(State *state, const char * const str) { + if (state->append) { + int length = StrLen(str); + MaybeAppendWithLength(state, str, length); + } + return true; +} + +// This function is used for handling nested names. +static bool EnterNestedName(State *state) { + state->nest_level = 0; + return true; +} + +// This function is used for handling nested names. +static bool LeaveNestedName(State *state, short prev_value) { + state->nest_level = prev_value; + return true; +} + +// Disable the append mode not to print function parameters, etc. +static bool DisableAppend(State *state) { + state->append = false; + return true; +} + +// Restore the append mode to the previous state. +static bool RestoreAppend(State *state, bool prev_value) { + state->append = prev_value; + return true; +} + +// Increase the nest level for nested names. +static void MaybeIncreaseNestLevel(State *state) { + if (state->nest_level > -1) { + ++state->nest_level; + } +} + +// Appends :: for nested names if necessary. +static void MaybeAppendSeparator(State *state) { + if (state->nest_level >= 1) { + MaybeAppend(state, "::"); + } +} + +// Cancel the last separator if necessary. +static void MaybeCancelLastSeparator(State *state) { + if (state->nest_level >= 1 && state->append && + state->out_begin <= state->out_cur - 2) { + state->out_cur -= 2; + *state->out_cur = '\0'; + } +} + +// Returns true if the identifier of the given length pointed to by +// "mangled_cur" is anonymous namespace. +static bool IdentifierIsAnonymousNamespace(State *state, int length) { + static const char anon_prefix[] = "_GLOBAL__N_"; + return (length > sizeof(anon_prefix) - 1 && // Should be longer. + StrPrefix(state->mangled_cur, anon_prefix)); +} + +// Forward declarations of our parsing functions. +static bool ParseMangledName(State *state); +static bool ParseEncoding(State *state); +static bool ParseName(State *state); +static bool ParseUnscopedName(State *state); +static bool ParseUnscopedTemplateName(State *state); +static bool ParseNestedName(State *state); +static bool ParsePrefix(State *state); +static bool ParseUnqualifiedName(State *state); +static bool ParseSourceName(State *state); +static bool ParseLocalSourceName(State *state); +static bool ParseNumber(State *state, int *number_out); +static bool ParseFloatNumber(State *state); +static bool ParseSeqId(State *state); +static bool ParseIdentifier(State *state, int length); +static bool ParseOperatorName(State *state); +static bool ParseSpecialName(State *state); +static bool ParseCallOffset(State *state); +static bool ParseNVOffset(State *state); +static bool ParseVOffset(State *state); +static bool ParseCtorDtorName(State *state); +static bool ParseType(State *state); +static bool ParseCVQualifiers(State *state); +static bool ParseBuiltinType(State *state); +static bool ParseFunctionType(State *state); +static bool ParseBareFunctionType(State *state); +static bool ParseClassEnumType(State *state); +static bool ParseArrayType(State *state); +static bool ParsePointerToMemberType(State *state); +static bool ParseTemplateParam(State *state); +static bool ParseTemplateTemplateParam(State *state); +static bool ParseTemplateArgs(State *state); +static bool ParseTemplateArg(State *state); +static bool ParseExpression(State *state); +static bool ParseExprPrimary(State *state); +static bool ParseLocalName(State *state); +static bool ParseDiscriminator(State *state); +static bool ParseSubstitution(State *state); + +// Implementation note: the following code is a straightforward +// translation of the Itanium C++ ABI defined in BNF with a couple of +// exceptions. +// +// - Support GNU extensions not defined in the Itanium C++ ABI +// - and are combined to avoid infinite loop +// - Reorder patterns to shorten the code +// - Reorder patterns to give greedier functions precedence +// We'll mark "Less greedy than" for these cases in the code +// +// Each parsing function changes the state and returns true on +// success. Otherwise, don't change the state and returns false. To +// ensure that the state isn't changed in the latter case, we save the +// original state before we call more than one parsing functions +// consecutively with &&, and restore the state if unsuccessful. See +// ParseEncoding() as an example of this convention. We follow the +// convention throughout the code. +// +// Originally we tried to do demangling without following the full ABI +// syntax but it turned out we needed to follow the full syntax to +// parse complicated cases like nested template arguments. Note that +// implementing a full-fledged demangler isn't trivial (libiberty's +// cp-demangle.c has +4300 lines). +// +// Note that (foo) in <(foo) ...> is a modifier to be ignored. +// +// Reference: +// - Itanium C++ ABI +// + +// ::= _Z +static bool ParseMangledName(State *state) { + return ParseTwoCharToken(state, "_Z") && ParseEncoding(state); +} + +// ::= <(function) name> +// ::= <(data) name> +// ::= +static bool ParseEncoding(State *state) { + State copy = *state; + if (ParseName(state) && ParseBareFunctionType(state)) { + return true; + } + *state = copy; + + if (ParseName(state) || ParseSpecialName(state)) { + return true; + } + return false; +} + +// ::= +// ::= +// ::= +// ::= +static bool ParseName(State *state) { + if (ParseNestedName(state) || ParseLocalName(state)) { + return true; + } + + State copy = *state; + if (ParseUnscopedTemplateName(state) && + ParseTemplateArgs(state)) { + return true; + } + *state = copy; + + // Less greedy than . + if (ParseUnscopedName(state)) { + return true; + } + return false; +} + +// ::= +// ::= St +static bool ParseUnscopedName(State *state) { + if (ParseUnqualifiedName(state)) { + return true; + } + + State copy = *state; + if (ParseTwoCharToken(state, "St") && + MaybeAppend(state, "std::") && + ParseUnqualifiedName(state)) { + return true; + } + *state = copy; + return false; +} + +// ::= +// ::= +static bool ParseUnscopedTemplateName(State *state) { + return ParseUnscopedName(state) || ParseSubstitution(state); +} + +// ::= N [] E +// ::= N [] E +static bool ParseNestedName(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'N') && + EnterNestedName(state) && + Optional(ParseCVQualifiers(state)) && + ParsePrefix(state) && + LeaveNestedName(state, copy.nest_level) && + ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + return false; +} + +// This part is tricky. If we literally translate them to code, we'll +// end up infinite loop. Hence we merge them to avoid the case. +// +// ::= +// ::= +// ::= +// ::= +// ::= # empty +// ::= <(template) unqualified-name> +// ::= +// ::= +static bool ParsePrefix(State *state) { + bool has_something = false; + while (true) { + MaybeAppendSeparator(state); + if (ParseTemplateParam(state) || + ParseSubstitution(state) || + ParseUnscopedName(state)) { + has_something = true; + MaybeIncreaseNestLevel(state); + continue; + } + MaybeCancelLastSeparator(state); + if (has_something && ParseTemplateArgs(state)) { + return ParsePrefix(state); + } else { + break; + } + } + return true; +} + +// ::= +// ::= +// ::= +// ::= +static bool ParseUnqualifiedName(State *state) { + return (ParseOperatorName(state) || + ParseCtorDtorName(state) || + ParseSourceName(state) || + ParseLocalSourceName(state)); +} + +// ::= +static bool ParseSourceName(State *state) { + State copy = *state; + int length = -1; + if (ParseNumber(state, &length) && ParseIdentifier(state, length)) { + return true; + } + *state = copy; + return false; +} + +// ::= L [] +// +// References: +// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31775 +// http://gcc.gnu.org/viewcvs?view=rev&revision=124467 +static bool ParseLocalSourceName(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'L') && ParseSourceName(state) && + Optional(ParseDiscriminator(state))) { + return true; + } + *state = copy; + return false; +} + +// ::= [n] +// If "number_out" is non-null, then *number_out is set to the value of the +// parsed number on success. +static bool ParseNumber(State *state, int *number_out) { + int sign = 1; + if (ParseOneCharToken(state, 'n')) { + sign = -1; + } + const char *p = state->mangled_cur; + int number = 0; + for (;*p != '\0'; ++p) { + if (IsDigit(*p)) { + number = number * 10 + (*p - '0'); + } else { + break; + } + } + if (p != state->mangled_cur) { // Conversion succeeded. + state->mangled_cur = p; + if (number_out != NULL) { + *number_out = number * sign; + } + return true; + } + return false; +} + +// Floating-point literals are encoded using a fixed-length lowercase +// hexadecimal string. +static bool ParseFloatNumber(State *state) { + const char *p = state->mangled_cur; + for (;*p != '\0'; ++p) { + if (!IsDigit(*p) && !(*p >= 'a' && *p <= 'f')) { + break; + } + } + if (p != state->mangled_cur) { // Conversion succeeded. + state->mangled_cur = p; + return true; + } + return false; +} + +// The is a sequence number in base 36, +// using digits and upper case letters +static bool ParseSeqId(State *state) { + const char *p = state->mangled_cur; + for (;*p != '\0'; ++p) { + if (!IsDigit(*p) && !(*p >= 'A' && *p <= 'Z')) { + break; + } + } + if (p != state->mangled_cur) { // Conversion succeeded. + state->mangled_cur = p; + return true; + } + return false; +} + +// ::= (of given length) +static bool ParseIdentifier(State *state, int length) { + if (length == -1 || + !AtLeastNumCharsRemaining(state->mangled_cur, length)) { + return false; + } + if (IdentifierIsAnonymousNamespace(state, length)) { + MaybeAppend(state, "(anonymous namespace)"); + } else { + MaybeAppendWithLength(state, state->mangled_cur, length); + } + state->mangled_cur += length; + return true; +} + +// ::= nw, and other two letters cases +// ::= cv # (cast) +// ::= v # vendor extended operator +static bool ParseOperatorName(State *state) { + if (!AtLeastNumCharsRemaining(state->mangled_cur, 2)) { + return false; + } + // First check with "cv" (cast) case. + State copy = *state; + if (ParseTwoCharToken(state, "cv") && + MaybeAppend(state, "operator ") && + EnterNestedName(state) && + ParseType(state) && + LeaveNestedName(state, copy.nest_level)) { + return true; + } + *state = copy; + + // Then vendor extended operators. + if (ParseOneCharToken(state, 'v') && ParseCharClass(state, "0123456789") && + ParseSourceName(state)) { + return true; + } + *state = copy; + + // Other operator names should start with a lower alphabet followed + // by a lower/upper alphabet. + if (!(IsLower(state->mangled_cur[0]) && + IsAlpha(state->mangled_cur[1]))) { + return false; + } + // We may want to perform a binary search if we really need speed. + const AbbrevPair *p; + for (p = kOperatorList; p->abbrev != NULL; ++p) { + if (state->mangled_cur[0] == p->abbrev[0] && + state->mangled_cur[1] == p->abbrev[1]) { + MaybeAppend(state, "operator"); + if (IsLower(*p->real_name)) { // new, delete, etc. + MaybeAppend(state, " "); + } + MaybeAppend(state, p->real_name); + state->mangled_cur += 2; + return true; + } + } + return false; +} + +// ::= TV +// ::= TT +// ::= TI +// ::= TS +// ::= Tc <(base) encoding> +// ::= GV <(object) name> +// ::= T <(base) encoding> +// G++ extensions: +// ::= TC <(offset) number> _ <(base) type> +// ::= TF +// ::= TJ +// ::= GR +// ::= GA +// ::= Th <(base) encoding> +// ::= Tv <(base) encoding> +// +// Note: we don't care much about them since they don't appear in +// stack traces. The are special data. +static bool ParseSpecialName(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'T') && + ParseCharClass(state, "VTIS") && + ParseType(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "Tc") && ParseCallOffset(state) && + ParseCallOffset(state) && ParseEncoding(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "GV") && + ParseName(state)) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'T') && ParseCallOffset(state) && + ParseEncoding(state)) { + return true; + } + *state = copy; + + // G++ extensions + if (ParseTwoCharToken(state, "TC") && ParseType(state) && + ParseNumber(state, NULL) && ParseOneCharToken(state, '_') && + DisableAppend(state) && + ParseType(state)) { + RestoreAppend(state, copy.append); + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "FJ") && + ParseType(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "GR") && ParseName(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "GA") && ParseEncoding(state)) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'T') && ParseCharClass(state, "hv") && + ParseCallOffset(state) && ParseEncoding(state)) { + return true; + } + *state = copy; + return false; +} + +// ::= h _ +// ::= v _ +static bool ParseCallOffset(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'h') && + ParseNVOffset(state) && ParseOneCharToken(state, '_')) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'v') && + ParseVOffset(state) && ParseOneCharToken(state, '_')) { + return true; + } + *state = copy; + + return false; +} + +// ::= <(offset) number> +static bool ParseNVOffset(State *state) { + return ParseNumber(state, NULL); +} + +// ::= <(offset) number> _ <(virtual offset) number> +static bool ParseVOffset(State *state) { + State copy = *state; + if (ParseNumber(state, NULL) && ParseOneCharToken(state, '_') && + ParseNumber(state, NULL)) { + return true; + } + *state = copy; + return false; +} + +// ::= C1 | C2 | C3 +// ::= D0 | D1 | D2 +static bool ParseCtorDtorName(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'C') && + ParseCharClass(state, "123")) { + const char * const prev_name = state->prev_name; + const int prev_name_length = state->prev_name_length; + MaybeAppendWithLength(state, prev_name, prev_name_length); + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'D') && + ParseCharClass(state, "012")) { + const char * const prev_name = state->prev_name; + const int prev_name_length = state->prev_name_length; + MaybeAppend(state, "~"); + MaybeAppendWithLength(state, prev_name, prev_name_length); + return true; + } + *state = copy; + return false; +} + +// ::= +// ::= P # pointer-to +// ::= R # reference-to +// ::= O # rvalue reference-to (C++0x) +// ::= C # complex pair (C 2000) +// ::= G # imaginary (C 2000) +// ::= U # vendor extended type qualifier +// ::= +// ::= +// ::= +// ::= +// ::= +// ::= +// ::= +// ::= +// ::= Dp # pack expansion of (C++0x) +// ::= Dt E # decltype of an id-expression or class +// # member access (C++0x) +// ::= DT E # decltype of an expression (C++0x) +// +static bool ParseType(State *state) { + // We should check CV-qualifers, and PRGC things first. + State copy = *state; + if (ParseCVQualifiers(state) && ParseType(state)) { + return true; + } + *state = copy; + + if (ParseCharClass(state, "OPRCG") && ParseType(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "Dp") && ParseType(state)) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'D') && ParseCharClass(state, "tT") && + ParseExpression(state) && ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'U') && ParseSourceName(state) && + ParseType(state)) { + return true; + } + *state = copy; + + if (ParseBuiltinType(state) || + ParseFunctionType(state) || + ParseClassEnumType(state) || + ParseArrayType(state) || + ParsePointerToMemberType(state) || + ParseSubstitution(state)) { + return true; + } + + if (ParseTemplateTemplateParam(state) && + ParseTemplateArgs(state)) { + return true; + } + *state = copy; + + // Less greedy than . + if (ParseTemplateParam(state)) { + return true; + } + + return false; +} + +// ::= [r] [V] [K] +// We don't allow empty to avoid infinite loop in +// ParseType(). +static bool ParseCVQualifiers(State *state) { + int num_cv_qualifiers = 0; + num_cv_qualifiers += ParseOneCharToken(state, 'r'); + num_cv_qualifiers += ParseOneCharToken(state, 'V'); + num_cv_qualifiers += ParseOneCharToken(state, 'K'); + return num_cv_qualifiers > 0; +} + +// ::= v, etc. +// ::= u +static bool ParseBuiltinType(State *state) { + const AbbrevPair *p; + for (p = kBuiltinTypeList; p->abbrev != NULL; ++p) { + if (state->mangled_cur[0] == p->abbrev[0]) { + MaybeAppend(state, p->real_name); + ++state->mangled_cur; + return true; + } + } + + State copy = *state; + if (ParseOneCharToken(state, 'u') && ParseSourceName(state)) { + return true; + } + *state = copy; + return false; +} + +// ::= F [Y] E +static bool ParseFunctionType(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'F') && + Optional(ParseOneCharToken(state, 'Y')) && + ParseBareFunctionType(state) && ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + return false; +} + +// ::= <(signature) type>+ +static bool ParseBareFunctionType(State *state) { + State copy = *state; + DisableAppend(state); + if (OneOrMore(ParseType, state)) { + RestoreAppend(state, copy.append); + MaybeAppend(state, "()"); + return true; + } + *state = copy; + return false; +} + +// ::= +static bool ParseClassEnumType(State *state) { + return ParseName(state); +} + +// ::= A <(positive dimension) number> _ <(element) type> +// ::= A [<(dimension) expression>] _ <(element) type> +static bool ParseArrayType(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'A') && ParseNumber(state, NULL) && + ParseOneCharToken(state, '_') && ParseType(state)) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'A') && Optional(ParseExpression(state)) && + ParseOneCharToken(state, '_') && ParseType(state)) { + return true; + } + *state = copy; + return false; +} + +// ::= M <(class) type> <(member) type> +static bool ParsePointerToMemberType(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'M') && ParseType(state) && + ParseType(state)) { + return true; + } + *state = copy; + return false; +} + +// ::= T_ +// ::= T _ +static bool ParseTemplateParam(State *state) { + if (ParseTwoCharToken(state, "T_")) { + MaybeAppend(state, "?"); // We don't support template substitutions. + return true; + } + + State copy = *state; + if (ParseOneCharToken(state, 'T') && ParseNumber(state, NULL) && + ParseOneCharToken(state, '_')) { + MaybeAppend(state, "?"); // We don't support template substitutions. + return true; + } + *state = copy; + return false; +} + + +// ::= +// ::= +static bool ParseTemplateTemplateParam(State *state) { + return (ParseTemplateParam(state) || + ParseSubstitution(state)); +} + +// ::= I + E +static bool ParseTemplateArgs(State *state) { + State copy = *state; + DisableAppend(state); + if (ParseOneCharToken(state, 'I') && + OneOrMore(ParseTemplateArg, state) && + ParseOneCharToken(state, 'E')) { + RestoreAppend(state, copy.append); + MaybeAppend(state, "<>"); + return true; + } + *state = copy; + return false; +} + +// ::= +// ::= +// ::= I * E # argument pack +// ::= X E +static bool ParseTemplateArg(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'I') && + ZeroOrMore(ParseTemplateArg, state) && + ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + + if (ParseType(state) || + ParseExprPrimary(state)) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'X') && ParseExpression(state) && + ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + return false; +} + +// ::= +// ::= +// ::= +// ::= +// ::= +// +// ::= st +// ::= sr +// ::= sr +static bool ParseExpression(State *state) { + if (ParseTemplateParam(state) || ParseExprPrimary(state)) { + return true; + } + + State copy = *state; + if (ParseOperatorName(state) && + ParseExpression(state) && + ParseExpression(state) && + ParseExpression(state)) { + return true; + } + *state = copy; + + if (ParseOperatorName(state) && + ParseExpression(state) && + ParseExpression(state)) { + return true; + } + *state = copy; + + if (ParseOperatorName(state) && + ParseExpression(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "st") && ParseType(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "sr") && ParseType(state) && + ParseUnqualifiedName(state) && + ParseTemplateArgs(state)) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "sr") && ParseType(state) && + ParseUnqualifiedName(state)) { + return true; + } + *state = copy; + return false; +} + +// ::= L <(value) number> E +// ::= L <(value) float> E +// ::= L E +// // A bug in g++'s C++ ABI version 2 (-fabi-version=2). +// ::= LZ E +static bool ParseExprPrimary(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'L') && ParseType(state) && + ParseNumber(state, NULL) && + ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'L') && ParseType(state) && + ParseFloatNumber(state) && + ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'L') && ParseMangledName(state) && + ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + + if (ParseTwoCharToken(state, "LZ") && ParseEncoding(state) && + ParseOneCharToken(state, 'E')) { + return true; + } + *state = copy; + + return false; +} + +// := Z <(function) encoding> E <(entity) name> +// [] +// := Z <(function) encoding> E s [] +static bool ParseLocalName(State *state) { + State copy = *state; + if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && + ParseOneCharToken(state, 'E') && MaybeAppend(state, "::") && + ParseName(state) && Optional(ParseDiscriminator(state))) { + return true; + } + *state = copy; + + if (ParseOneCharToken(state, 'Z') && ParseEncoding(state) && + ParseTwoCharToken(state, "Es") && Optional(ParseDiscriminator(state))) { + return true; + } + *state = copy; + return false; +} + +// := _ <(non-negative) number> +static bool ParseDiscriminator(State *state) { + State copy = *state; + if (ParseOneCharToken(state, '_') && ParseNumber(state, NULL)) { + return true; + } + *state = copy; + return false; +} + +// ::= S_ +// ::= S _ +// ::= St, etc. +static bool ParseSubstitution(State *state) { + if (ParseTwoCharToken(state, "S_")) { + MaybeAppend(state, "?"); // We don't support substitutions. + return true; + } + + State copy = *state; + if (ParseOneCharToken(state, 'S') && ParseSeqId(state) && + ParseOneCharToken(state, '_')) { + MaybeAppend(state, "?"); // We don't support substitutions. + return true; + } + *state = copy; + + // Expand abbreviations like "St" => "std". + if (ParseOneCharToken(state, 'S')) { + const AbbrevPair *p; + for (p = kSubstitutionList; p->abbrev != NULL; ++p) { + if (state->mangled_cur[0] == p->abbrev[1]) { + MaybeAppend(state, "std"); + if (p->real_name[0] != '\0') { + MaybeAppend(state, "::"); + MaybeAppend(state, p->real_name); + } + ++state->mangled_cur; + return true; + } + } + } + *state = copy; + return false; +} + +// Parse , optionally followed by either a function-clone suffix +// or version suffix. Returns true only if all of "mangled_cur" was consumed. +static bool ParseTopLevelMangledName(State *state) { + if (ParseMangledName(state)) { + if (state->mangled_cur[0] != '\0') { + // Drop trailing function clone suffix, if any. + if (IsFunctionCloneSuffix(state->mangled_cur)) { + return true; + } + // Append trailing version suffix if any. + // ex. _Z3foo@@GLIBCXX_3.4 + if (state->mangled_cur[0] == '@') { + MaybeAppend(state, state->mangled_cur); + return true; + } + return false; // Unconsumed suffix. + } + return true; + } + return false; +} + +// The demangler entry point. +bool Demangle(const char *mangled, char *out, int out_size) { + State state; + InitState(&state, mangled, out, out_size); + return ParseTopLevelMangledName(&state) && !state.overflowed; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/demangle.h b/spotify/breakpad/third_party/glog/src/demangle.h new file mode 100644 index 000000000..9c7591527 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/demangle.h @@ -0,0 +1,84 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// +// An async-signal-safe and thread-safe demangler for Itanium C++ ABI +// (aka G++ V3 ABI). + +// The demangler is implemented to be used in async signal handlers to +// symbolize stack traces. We cannot use libstdc++'s +// abi::__cxa_demangle() in such signal handlers since it's not async +// signal safe (it uses malloc() internally). +// +// Note that this demangler doesn't support full demangling. More +// specifically, it doesn't print types of function parameters and +// types of template arguments. It just skips them. However, it's +// still very useful to extract basic information such as class, +// function, constructor, destructor, and operator names. +// +// See the implementation note in demangle.cc if you are interested. +// +// Example: +// +// | Mangled Name | The Demangler | abi::__cxa_demangle() +// |---------------|---------------|----------------------- +// | _Z1fv | f() | f() +// | _Z1fi | f() | f(int) +// | _Z3foo3bar | foo() | foo(bar) +// | _Z1fIiEvi | f<>() | void f(int) +// | _ZN1N1fE | N::f | N::f +// | _ZN3Foo3BarEv | Foo::Bar() | Foo::Bar() +// | _Zrm1XS_" | operator%() | operator%(X, X) +// | _ZN3FooC1Ev | Foo::Foo() | Foo::Foo() +// | _Z1fSs | f() | f(std::basic_string, +// | | | std::allocator >) +// +// See the unit test for more examples. +// +// Note: we might want to write demanglers for ABIs other than Itanium +// C++ ABI in the future. +// + +#ifndef BASE_DEMANGLE_H_ +#define BASE_DEMANGLE_H_ + +#include "config.h" + +_START_GOOGLE_NAMESPACE_ + +// Demangle "mangled". On success, return true and write the +// demangled symbol name to "out". Otherwise, return false. +// "out" is modified even if demangling is unsuccessful. +bool Demangle(const char *mangled, char *out, int out_size); + +_END_GOOGLE_NAMESPACE_ + +#endif // BASE_DEMANGLE_H_ diff --git a/spotify/breakpad/third_party/glog/src/demangle_unittest.cc b/spotify/breakpad/third_party/glog/src/demangle_unittest.cc new file mode 100644 index 000000000..9d219e653 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/demangle_unittest.cc @@ -0,0 +1,142 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// +// Unit tests for functions in demangle.c. + +#include "utilities.h" + +#include +#include +#include +#include "glog/logging.h" +#include "demangle.h" +#include "googletest.h" +#include "config.h" + +GLOG_DEFINE_bool(demangle_filter, false, + "Run demangle_unittest in filter mode"); + +using namespace std; +using namespace GOOGLE_NAMESPACE; + +// A wrapper function for Demangle() to make the unit test simple. +static const char *DemangleIt(const char * const mangled) { + static char demangled[4096]; + if (Demangle(mangled, demangled, sizeof(demangled))) { + return demangled; + } else { + return mangled; + } +} + +// Test corner cases of bounary conditions. +TEST(Demangle, CornerCases) { + char tmp[10]; + EXPECT_TRUE(Demangle("_Z6foobarv", tmp, sizeof(tmp))); + // sizeof("foobar()") == 9 + EXPECT_STREQ("foobar()", tmp); + EXPECT_TRUE(Demangle("_Z6foobarv", tmp, 9)); + EXPECT_STREQ("foobar()", tmp); + EXPECT_FALSE(Demangle("_Z6foobarv", tmp, 8)); // Not enough. + EXPECT_FALSE(Demangle("_Z6foobarv", tmp, 1)); + EXPECT_FALSE(Demangle("_Z6foobarv", tmp, 0)); + EXPECT_FALSE(Demangle("_Z6foobarv", NULL, 0)); // Should not cause SEGV. +} + +// Test handling of functions suffixed with .clone.N, which is used by GCC +// 4.5.x, and .constprop.N and .isra.N, which are used by GCC 4.6.x. These +// suffixes are used to indicate functions which have been cloned during +// optimization. We ignore these suffixes. +TEST(Demangle, Clones) { + char tmp[20]; + EXPECT_TRUE(Demangle("_ZL3Foov", tmp, sizeof(tmp))); + EXPECT_STREQ("Foo()", tmp); + EXPECT_TRUE(Demangle("_ZL3Foov.clone.3", tmp, sizeof(tmp))); + EXPECT_STREQ("Foo()", tmp); + EXPECT_TRUE(Demangle("_ZL3Foov.constprop.80", tmp, sizeof(tmp))); + EXPECT_STREQ("Foo()", tmp); + EXPECT_TRUE(Demangle("_ZL3Foov.isra.18", tmp, sizeof(tmp))); + EXPECT_STREQ("Foo()", tmp); + EXPECT_TRUE(Demangle("_ZL3Foov.isra.2.constprop.18", tmp, sizeof(tmp))); + EXPECT_STREQ("Foo()", tmp); + // Invalid (truncated), should not demangle. + EXPECT_FALSE(Demangle("_ZL3Foov.clo", tmp, sizeof(tmp))); + // Invalid (.clone. not followed by number), should not demangle. + EXPECT_FALSE(Demangle("_ZL3Foov.clone.", tmp, sizeof(tmp))); + // Invalid (.clone. followed by non-number), should not demangle. + EXPECT_FALSE(Demangle("_ZL3Foov.clone.foo", tmp, sizeof(tmp))); + // Invalid (.constprop. not followed by number), should not demangle. + EXPECT_FALSE(Demangle("_ZL3Foov.isra.2.constprop.", tmp, sizeof(tmp))); +} + +TEST(Demangle, FromFile) { + string test_file = FLAGS_test_srcdir + "/src/demangle_unittest.txt"; + ifstream f(test_file.c_str()); // The file should exist. + EXPECT_FALSE(f.fail()); + + string line; + while (getline(f, line)) { + // Lines start with '#' are considered as comments. + if (line.empty() || line[0] == '#') { + continue; + } + // Each line should contain a mangled name and a demangled name + // separated by '\t'. Example: "_Z3foo\tfoo" + string::size_type tab_pos = line.find('\t'); + EXPECT_NE(string::npos, tab_pos); + string mangled = line.substr(0, tab_pos); + string demangled = line.substr(tab_pos + 1); + EXPECT_EQ(demangled, DemangleIt(mangled.c_str())); + } +} + +int main(int argc, char **argv) { +#ifdef HAVE_LIB_GFLAGS + ParseCommandLineFlags(&argc, &argv, true); +#endif + InitGoogleTest(&argc, argv); + + FLAGS_logtostderr = true; + InitGoogleLogging(argv[0]); + if (FLAGS_demangle_filter) { + // Read from cin and write to cout. + string line; + while (getline(cin, line, '\n')) { + cout << DemangleIt(line.c_str()) << endl; + } + return 0; + } else if (argc > 1) { + cout << DemangleIt(argv[1]) << endl; + return 0; + } else { + return RUN_ALL_TESTS(); + } +} diff --git a/spotify/breakpad/third_party/glog/src/demangle_unittest.sh b/spotify/breakpad/third_party/glog/src/demangle_unittest.sh new file mode 100755 index 000000000..91deee219 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/demangle_unittest.sh @@ -0,0 +1,95 @@ +#! /bin/sh +# +# Copyright (c) 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Author: Satoru Takabayashi +# +# Unit tests for demangle.c with a real binary. + +set -e + +die () { + echo $1 + exit 1 +} + +BINDIR=".libs" +LIBGLOG="$BINDIR/libglog.so" + +DEMANGLER="$BINDIR/demangle_unittest" + +if test -e "$DEMANGLER"; then + # We need shared object. + export LD_LIBRARY_PATH=$BINDIR + export DYLD_LIBRARY_PATH=$BINDIR +else + # For windows + DEMANGLER="./demangle_unittest.exe" + if ! test -e "$DEMANGLER"; then + echo "We coundn't find demangle_unittest binary." + exit 1 + fi +fi + +# Extract C++ mangled symbols from libbase.so. +NM_OUTPUT="demangle.nm" +nm "$LIBGLOG" | perl -nle 'print $1 if /\s(_Z\S+$)/' > "$NM_OUTPUT" + +# Check if mangled symbols exist. If there are none, we quit. +# The binary is more likely compiled with GCC 2.95 or something old. +if ! grep --quiet '^_Z' "$NM_OUTPUT"; then + echo "PASS" + exit 0 +fi + +# Demangle the symbols using our demangler. +DM_OUTPUT="demangle.dm" +GLOG_demangle_filter=1 "$DEMANGLER" --demangle_filter < "$NM_OUTPUT" > "$DM_OUTPUT" + +# Calculate the numbers of lines. +NM_LINES=`wc -l "$NM_OUTPUT" | awk '{ print $1 }'` +DM_LINES=`wc -l "$DM_OUTPUT" | awk '{ print $1 }'` + +# Compare the numbers of lines. They must be the same. +if test "$NM_LINES" != "$DM_LINES"; then + die "$NM_OUTPUT and $DM_OUTPUT don't have the same numbers of lines" +fi + +# Check if mangled symbols exist. They must not exist. +if grep --quiet '^_Z' "$DM_OUTPUT"; then + MANGLED=`grep '^_Z' "$DM_OUTPUT" | wc -l | awk '{ print \$1 }'` + echo "Mangled symbols ($MANGLED out of $NM_LINES) found in $DM_OUTPUT:" + grep '^_Z' "$DM_OUTPUT" + die "Mangled symbols ($MANGLED out of $NM_LINES) found in $DM_OUTPUT" +fi + +# All C++ symbols are demangled successfully. +echo "PASS" +exit 0 diff --git a/spotify/breakpad/third_party/glog/src/demangle_unittest.txt b/spotify/breakpad/third_party/glog/src/demangle_unittest.txt new file mode 100644 index 000000000..4e23c65b2 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/demangle_unittest.txt @@ -0,0 +1,137 @@ +# Test caces for demangle_unittest. Each line consists of a +# tab-separated pair of mangled and demangled symbol names. + +# Constructors and destructors. +_ZN3FooC1Ev Foo::Foo() +_ZN3FooD1Ev Foo::~Foo() +_ZNSoD0Ev std::ostream::~ostream() + +# G++ extensions. +_ZTCN10LogMessage9LogStreamE0_So LogMessage::LogStream +_ZTv0_n12_N10LogMessage9LogStreamD0Ev LogMessage::LogStream::~LogStream() +_ZThn4_N7icu_3_410UnicodeSetD0Ev icu_3_4::UnicodeSet::~UnicodeSet() + +# A bug in g++'s C++ ABI version 2 (-fabi-version=2). +_ZN7NSSInfoI5groupjjXadL_Z10getgrgid_rEELZ19nss_getgrgid_r_nameEEC1Ei NSSInfo<>::NSSInfo() + +# C linkage symbol names. Should keep them untouched. +main main +Demangle Demangle +_ZERO _ZERO + +# Cast operator. +_Zcviv operator int() +_ZN3foocviEv foo::operator int() + +# Versioned symbols. +_Z3Foo@GLIBCXX_3.4 Foo@GLIBCXX_3.4 +_Z3Foo@@GLIBCXX_3.4 Foo@@GLIBCXX_3.4 + +# Abbreviations. +_ZNSaE std::allocator +_ZNSbE std::basic_string +_ZNSdE std::iostream +_ZNSiE std::istream +_ZNSoE std::ostream +_ZNSsE std::string + +# Substitutions. We just replace them with ?. +_ZN3fooS_E foo::? +_ZN3foo3barS0_E foo::bar::? +_ZNcvT_IiEEv operator ?<>() + +# "<< <" case. +_ZlsI3fooE operator<< <> + +# Random things we found interesting. +_ZN3FooISt6vectorISsSaISsEEEclEv Foo<>::operator()() +_ZTI9Callback1IiE Callback1<> +_ZN7icu_3_47UMemorynwEj icu_3_4::UMemory::operator new() +_ZNSt6vectorIbE9push_backE std::vector<>::push_back +_ZNSt6vectorIbSaIbEE9push_backEb std::vector<>::push_back() +_ZlsRSoRK15PRIVATE_Counter operator<<() +_ZSt6fill_nIPPN9__gnu_cxx15_Hashtable_nodeISt4pairIKPKcjEEEjS8_ET_SA_T0_RKT1_ std::fill_n<>() +_ZZ3FoovE3Bar Foo()::Bar +_ZGVZ7UpTimervE8up_timer UpTimer()::up_timer + +# Test cases from gcc-4.1.0/libstdc++-v3/testsuite/demangle. +# Collected by: +# % grep verify_demangle **/*.cc | perl -nle 'print $1 if /"(_Z.*?)"/' | +# sort | uniq +# +# Note that the following symbols are invalid. +# That's why they are not demangled. +# - _ZNZN1N1fEiE1X1gE +# - _ZNZN1N1fEiE1X1gEv +# - _Z1xINiEE +_Z1fA37_iPS_ f() +_Z1fAszL_ZZNK1N1A1fEvE3foo_0E_i f() +_Z1fI1APS0_PKS0_EvT_T0_T1_PA4_S3_M1CS8_ f<>() +_Z1fI1XENT_1tES2_ f<>() +_Z1fI1XEvPVN1AIT_E1TE f<>() +_Z1fILi1ELc120EEv1AIXplT_cviLd4028ae147ae147aeEEE f<>() +_Z1fILi1ELc120EEv1AIXplT_cviLf3f800000EEE f<>() +_Z1fILi5E1AEvN1CIXqugtT_Li0ELi1ELi2EEE1qE f<>() +_Z1fILi5E1AEvN1CIXstN1T1tEEXszsrS2_1tEE1qE f<>() +_Z1fILi5EEvN1AIXcvimlT_Li22EEE1qE f<>() +_Z1fIiEvi f<>() +_Z1fKPFiiE f() +_Z1fM1AFivEPS0_ f() +_Z1fM1AKFivE f() +_Z1fM1AKFvvE f() +_Z1fPFPA1_ivE f() +_Z1fPFYPFiiEiE f() +_Z1fPFvvEM1SFvvE f() +_Z1fPKM1AFivE f() +_Z1fi f() +_Z1fv f() +_Z1jM1AFivEPS1_ j() +_Z1rM1GFivEMS_KFivES_M1HFivES1_4whatIKS_E5what2IS8_ES3_ r() +_Z1sPA37_iPS0_ s() +_Z1xINiEE _Z1xINiEE +_Z3absILi11EEvv abs<>() +_Z3foo3bar foo() +_Z3foo5Hello5WorldS0_S_ foo() +_Z3fooA30_A_i foo() +_Z3fooIA6_KiEvA9_KT_rVPrS4_ foo<>() +_Z3fooILi2EEvRAplT_Li1E_i foo<>() +_Z3fooIiFvdEiEvv foo<>() +_Z3fooPM2ABi foo() +_Z3fooc foo() +_Z3fooiPiPS_PS0_PS1_PS2_PS3_PS4_PS5_PS6_PS7_PS8_PS9_PSA_PSB_PSC_ foo() +_Z3kooPA28_A30_i koo() +_Z4makeI7FactoryiET_IT0_Ev make<>() +_Z5firstI3DuoEvS0_ first<>() +_Z5firstI3DuoEvT_ first<>() +_Z9hairyfuncM1YKFPVPFrPA2_PM1XKFKPA3_ilEPcEiE hairyfunc() +_ZGVN5libcw24_GLOBAL__N_cbll.cc0ZhUKa23compiler_bug_workaroundISt6vectorINS_13omanip_id_tctINS_5debug32memblk_types_manipulator_data_ctEEESaIS6_EEE3idsE libcw::(anonymous namespace)::compiler_bug_workaround<>::ids +_ZN12libcw_app_ct10add_optionIS_EEvMT_FvPKcES3_cS3_S3_ libcw_app_ct::add_option<>() +_ZN1AIfEcvT_IiEEv A<>::operator ?<>() +_ZN1N1TIiiE2mfES0_IddE N::T<>::mf() +_ZN1N1fE N::f +_ZN1f1fE f::f +_ZN3FooIA4_iE3barE Foo<>::bar +_ZN5Arena5levelE Arena::level +_ZN5StackIiiE5levelE Stack<>::level +_ZN5libcw5debug13cwprint_usingINS_9_private_12GlobalObjectEEENS0_17cwprint_using_tctIT_EERKS5_MS5_KFvRSt7ostreamE libcw::debug::cwprint_using<>() +_ZN6System5Sound4beepEv System::Sound::beep() +_ZNKSt14priority_queueIP27timer_event_request_base_ctSt5dequeIS1_SaIS1_EE13timer_greaterE3topEv std::priority_queue<>::top() +_ZNKSt15_Deque_iteratorIP15memory_block_stRKS1_PS2_EeqERKS5_ std::_Deque_iterator<>::operator==() +_ZNKSt17__normal_iteratorIPK6optionSt6vectorIS0_SaIS0_EEEmiERKS6_ std::__normal_iterator<>::operator-() +_ZNSbIcSt11char_traitsIcEN5libcw5debug27no_alloc_checking_allocatorEE12_S_constructIPcEES6_T_S7_RKS3_ std::basic_string<>::_S_construct<>() +_ZNSt13_Alloc_traitsISbIcSt18string_char_traitsIcEN5libcw5debug9_private_17allocator_adaptorIcSt24__default_alloc_templateILb0ELi327664EELb1EEEENS5_IS9_S7_Lb1EEEE15_S_instancelessE std::_Alloc_traits<>::_S_instanceless +_ZNSt3_In4wardE std::_In::ward +_ZNZN1N1fEiE1X1gE _ZNZN1N1fEiE1X1gE +_ZNZN1N1fEiE1X1gEv _ZNZN1N1fEiE1X1gEv +_ZSt1BISt1DIP1ARKS2_PS3_ES0_IS2_RS2_PS2_ES2_ET0_T_SB_SA_PT1_ std::B<>() +_ZSt5state std::state +_ZTI7a_class a_class +_ZZN1N1fEiE1p N::f()::p +_ZZN1N1fEiEs N::f() +_ZlsRK1XS1_ operator<<() +_ZlsRKU3fooU4bart1XS0_ operator<<() +_ZlsRKU3fooU4bart1XS2_ operator<<() +_ZlsRSoRKSs operator<<() +_ZngILi42EEvN1AIXplT_Li2EEE1TE operator-<>() +_ZplR1XS0_ operator+() +_Zrm1XS_ operator%() diff --git a/spotify/breakpad/third_party/glog/src/glog/log_severity.h b/spotify/breakpad/third_party/glog/src/glog/log_severity.h new file mode 100644 index 000000000..17805fbad --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/glog/log_severity.h @@ -0,0 +1,84 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef BASE_LOG_SEVERITY_H__ +#define BASE_LOG_SEVERITY_H__ + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +// Variables of type LogSeverity are widely taken to lie in the range +// [0, NUM_SEVERITIES-1]. Be careful to preserve this assumption if +// you ever need to change their values or add a new severity. +typedef int LogSeverity; + +const int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4; + +// DFATAL is FATAL in debug mode, ERROR in normal mode +#ifdef NDEBUG +#define DFATAL_LEVEL ERROR +#else +#define DFATAL_LEVEL FATAL +#endif + +extern GOOGLE_GLOG_DLL_DECL const char* const LogSeverityNames[NUM_SEVERITIES]; + +// NDEBUG usage helpers related to (RAW_)DCHECK: +// +// DEBUG_MODE is for small !NDEBUG uses like +// if (DEBUG_MODE) foo.CheckThatFoo(); +// instead of substantially more verbose +// #ifndef NDEBUG +// foo.CheckThatFoo(); +// #endif +// +// IF_DEBUG_MODE is for small !NDEBUG uses like +// IF_DEBUG_MODE( string error; ) +// DCHECK(Foo(&error)) << error; +// instead of substantially more verbose +// #ifndef NDEBUG +// string error; +// DCHECK(Foo(&error)) << error; +// #endif +// +#ifdef NDEBUG +enum { DEBUG_MODE = 0 }; +#define IF_DEBUG_MODE(x) +#else +enum { DEBUG_MODE = 1 }; +#define IF_DEBUG_MODE(x) x +#endif + +#endif // BASE_LOG_SEVERITY_H__ diff --git a/spotify/breakpad/third_party/glog/src/glog/logging.h.in b/spotify/breakpad/third_party/glog/src/glog/logging.h.in new file mode 100644 index 000000000..435655247 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/glog/logging.h.in @@ -0,0 +1,1506 @@ +// Copyright (c) 1999, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Ray Sidney +// +// This file contains #include information about logging-related stuff. +// Pretty much everybody needs to #include this file so that they can +// log various happenings. +// +#ifndef _LOGGING_H_ +#define _LOGGING_H_ + +#include +#include +#include +#include +#if @ac_cv_have_unistd_h@ +# include +#endif +#ifdef __DEPRECATED +// Make GCC quiet. +# undef __DEPRECATED +# include +# define __DEPRECATED +#else +# include +#endif +#include + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +// We care a lot about number of bits things take up. Unfortunately, +// systems define their bit-specific ints in a lot of different ways. +// We use our own way, and have a typedef to get there. +// Note: these commands below may look like "#if 1" or "#if 0", but +// that's because they were constructed that way at ./configure time. +// Look at logging.h.in to see how they're calculated (based on your config). +#if @ac_cv_have_stdint_h@ +#include // the normal place uint16_t is defined +#endif +#if @ac_cv_have_systypes_h@ +#include // the normal place u_int16_t is defined +#endif +#if @ac_cv_have_inttypes_h@ +#include // a third place for uint16_t or u_int16_t +#endif + +#if @ac_cv_have_libgflags@ +#include +#endif + +@ac_google_start_namespace@ + +#if @ac_cv_have_uint16_t@ // the C99 format +typedef int32_t int32; +typedef uint32_t uint32; +typedef int64_t int64; +typedef uint64_t uint64; +#elif @ac_cv_have_u_int16_t@ // the BSD format +typedef int32_t int32; +typedef u_int32_t uint32; +typedef int64_t int64; +typedef u_int64_t uint64; +#elif @ac_cv_have___uint16@ // the windows (vc7) format +typedef __int32 int32; +typedef unsigned __int32 uint32; +typedef __int64 int64; +typedef unsigned __int64 uint64; +#else +#error Do not know how to define a 32-bit integer quantity on your system +#endif + +@ac_google_end_namespace@ + +// The global value of GOOGLE_STRIP_LOG. All the messages logged to +// LOG(XXX) with severity less than GOOGLE_STRIP_LOG will not be displayed. +// If it can be determined at compile time that the message will not be +// printed, the statement will be compiled out. +// +// Example: to strip out all INFO and WARNING messages, use the value +// of 2 below. To make an exception for WARNING messages from a single +// file, add "#define GOOGLE_STRIP_LOG 1" to that file _before_ including +// base/logging.h +#ifndef GOOGLE_STRIP_LOG +#define GOOGLE_STRIP_LOG 0 +#endif + +// GCC can be told that a certain branch is not likely to be taken (for +// instance, a CHECK failure), and use that information in static analysis. +// Giving it this information can help it optimize for the common case in +// the absence of better information (ie. -fprofile-arcs). +// +#ifndef GOOGLE_PREDICT_BRANCH_NOT_TAKEN +#if @ac_cv_have___builtin_expect@ +#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) (__builtin_expect(x, 0)) +#else +#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) x +#endif +#endif + +// Make a bunch of macros for logging. The way to log things is to stream +// things to LOG(). E.g., +// +// LOG(INFO) << "Found " << num_cookies << " cookies"; +// +// You can capture log messages in a string, rather than reporting them +// immediately: +// +// vector errors; +// LOG_STRING(ERROR, &errors) << "Couldn't parse cookie #" << cookie_num; +// +// This pushes back the new error onto 'errors'; if given a NULL pointer, +// it reports the error via LOG(ERROR). +// +// You can also do conditional logging: +// +// LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; +// +// You can also do occasional logging (log every n'th occurrence of an +// event): +// +// LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie"; +// +// The above will cause log messages to be output on the 1st, 11th, 21st, ... +// times it is executed. Note that the special google::COUNTER value is used +// to identify which repetition is happening. +// +// You can also do occasional conditional logging (log every n'th +// occurrence of an event, when condition is satisfied): +// +// LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER +// << "th big cookie"; +// +// You can log messages the first N times your code executes a line. E.g. +// +// LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie"; +// +// Outputs log messages for the first 20 times it is executed. +// +// Analogous SYSLOG, SYSLOG_IF, and SYSLOG_EVERY_N macros are available. +// These log to syslog as well as to the normal logs. If you use these at +// all, you need to be aware that syslog can drastically reduce performance, +// especially if it is configured for remote logging! Don't use these +// unless you fully understand this and have a concrete need to use them. +// Even then, try to minimize your use of them. +// +// There are also "debug mode" logging macros like the ones above: +// +// DLOG(INFO) << "Found cookies"; +// +// DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; +// +// DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie"; +// +// All "debug mode" logging is compiled away to nothing for non-debug mode +// compiles. +// +// We also have +// +// LOG_ASSERT(assertion); +// DLOG_ASSERT(assertion); +// +// which is syntactic sugar for {,D}LOG_IF(FATAL, assert fails) << assertion; +// +// There are "verbose level" logging macros. They look like +// +// VLOG(1) << "I'm printed when you run the program with --v=1 or more"; +// VLOG(2) << "I'm printed when you run the program with --v=2 or more"; +// +// These always log at the INFO log level (when they log at all). +// The verbose logging can also be turned on module-by-module. For instance, +// --vmodule=mapreduce=2,file=1,gfs*=3 --v=0 +// will cause: +// a. VLOG(2) and lower messages to be printed from mapreduce.{h,cc} +// b. VLOG(1) and lower messages to be printed from file.{h,cc} +// c. VLOG(3) and lower messages to be printed from files prefixed with "gfs" +// d. VLOG(0) and lower messages to be printed from elsewhere +// +// The wildcarding functionality shown by (c) supports both '*' (match +// 0 or more characters) and '?' (match any single character) wildcards. +// +// There's also VLOG_IS_ON(n) "verbose level" condition macro. To be used as +// +// if (VLOG_IS_ON(2)) { +// // do some logging preparation and logging +// // that can't be accomplished with just VLOG(2) << ...; +// } +// +// There are also VLOG_IF, VLOG_EVERY_N and VLOG_IF_EVERY_N "verbose level" +// condition macros for sample cases, when some extra computation and +// preparation for logs is not needed. +// VLOG_IF(1, (size > 1024)) +// << "I'm printed when size is more than 1024 and when you run the " +// "program with --v=1 or more"; +// VLOG_EVERY_N(1, 10) +// << "I'm printed every 10th occurrence, and when you run the program " +// "with --v=1 or more. Present occurence is " << google::COUNTER; +// VLOG_IF_EVERY_N(1, (size > 1024), 10) +// << "I'm printed on every 10th occurence of case when size is more " +// " than 1024, when you run the program with --v=1 or more. "; +// "Present occurence is " << google::COUNTER; +// +// The supported severity levels for macros that allow you to specify one +// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL. +// Note that messages of a given severity are logged not only in the +// logfile for that severity, but also in all logfiles of lower severity. +// E.g., a message of severity FATAL will be logged to the logfiles of +// severity FATAL, ERROR, WARNING, and INFO. +// +// There is also the special severity of DFATAL, which logs FATAL in +// debug mode, ERROR in normal mode. +// +// Very important: logging a message at the FATAL severity level causes +// the program to terminate (after the message is logged). +// +// Unless otherwise specified, logs will be written to the filename +// "...log..", followed +// by the date, time, and pid (you can't prevent the date, time, and pid +// from being in the filename). +// +// The logging code takes two flags: +// --v=# set the verbose level +// --logtostderr log all the messages to stderr instead of to logfiles + +// LOG LINE PREFIX FORMAT +// +// Log lines have this form: +// +// Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg... +// +// where the fields are defined as follows: +// +// L A single character, representing the log level +// (eg 'I' for INFO) +// mm The month (zero padded; ie May is '05') +// dd The day (zero padded) +// hh:mm:ss.uuuuuu Time in hours, minutes and fractional seconds +// threadid The space-padded thread ID as returned by GetTID() +// (this matches the PID on Linux) +// file The file name +// line The line number +// msg The user-supplied message +// +// Example: +// +// I1103 11:57:31.739339 24395 google.cc:2341] Command line: ./some_prog +// I1103 11:57:31.739403 24395 google.cc:2342] Process id 24395 +// +// NOTE: although the microseconds are useful for comparing events on +// a single machine, clocks on different machines may not be well +// synchronized. Hence, use caution when comparing the low bits of +// timestamps from different machines. + +#ifndef DECLARE_VARIABLE +#define MUST_UNDEF_GFLAGS_DECLARE_MACROS +#define DECLARE_VARIABLE(type, name, tn) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead { \ + extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name + +// bool specialization +#define DECLARE_bool(name) \ + DECLARE_VARIABLE(bool, name, bool) + +// int32 specialization +#define DECLARE_int32(name) \ + DECLARE_VARIABLE(@ac_google_namespace@::int32, name, int32) + +// Special case for string, because we have to specify the namespace +// std::string, which doesn't play nicely with our FLAG__namespace hackery. +#define DECLARE_string(name) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead { \ + extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name +#endif + +// Set whether log messages go to stderr instead of logfiles +DECLARE_bool(logtostderr); + +// Set whether log messages go to stderr in addition to logfiles. +DECLARE_bool(alsologtostderr); + +// Log messages at a level >= this flag are automatically sent to +// stderr in addition to log files. +DECLARE_int32(stderrthreshold); + +// Set whether the log prefix should be prepended to each line of output. +DECLARE_bool(log_prefix); + +// Log messages at a level <= this flag are buffered. +// Log messages at a higher level are flushed immediately. +DECLARE_int32(logbuflevel); + +// Sets the maximum number of seconds which logs may be buffered for. +DECLARE_int32(logbufsecs); + +// Log suppression level: messages logged at a lower level than this +// are suppressed. +DECLARE_int32(minloglevel); + +// If specified, logfiles are written into this directory instead of the +// default logging directory. +DECLARE_string(log_dir); + +// Sets the path of the directory into which to put additional links +// to the log files. +DECLARE_string(log_link); + +DECLARE_int32(v); // in vlog_is_on.cc + +// Sets the maximum log file size (in MB). +DECLARE_int32(max_log_size); + +// Sets whether to avoid logging to the disk if the disk is full. +DECLARE_bool(stop_logging_if_full_disk); + +#ifdef MUST_UNDEF_GFLAGS_DECLARE_MACROS +#undef MUST_UNDEF_GFLAGS_DECLARE_MACROS +#undef DECLARE_VARIABLE +#undef DECLARE_bool +#undef DECLARE_int32 +#undef DECLARE_string +#endif + +// Log messages below the GOOGLE_STRIP_LOG level will be compiled away for +// security reasons. See LOG(severtiy) below. + +// A few definitions of macros that don't generate much code. Since +// LOG(INFO) and its ilk are used all over our code, it's +// better to have compact code for these operations. + +#if GOOGLE_STRIP_LOG == 0 +#define COMPACT_GOOGLE_LOG_INFO @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__) +#define LOG_TO_STRING_INFO(message) @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::INFO, message) +#else +#define COMPACT_GOOGLE_LOG_INFO @ac_google_namespace@::NullStream() +#define LOG_TO_STRING_INFO(message) @ac_google_namespace@::NullStream() +#endif + +#if GOOGLE_STRIP_LOG <= 1 +#define COMPACT_GOOGLE_LOG_WARNING @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::WARNING) +#define LOG_TO_STRING_WARNING(message) @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::WARNING, message) +#else +#define COMPACT_GOOGLE_LOG_WARNING @ac_google_namespace@::NullStream() +#define LOG_TO_STRING_WARNING(message) @ac_google_namespace@::NullStream() +#endif + +#if GOOGLE_STRIP_LOG <= 2 +#define COMPACT_GOOGLE_LOG_ERROR @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::ERROR) +#define LOG_TO_STRING_ERROR(message) @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::ERROR, message) +#else +#define COMPACT_GOOGLE_LOG_ERROR @ac_google_namespace@::NullStream() +#define LOG_TO_STRING_ERROR(message) @ac_google_namespace@::NullStream() +#endif + +#if GOOGLE_STRIP_LOG <= 3 +#define COMPACT_GOOGLE_LOG_FATAL @ac_google_namespace@::LogMessageFatal( \ + __FILE__, __LINE__) +#define LOG_TO_STRING_FATAL(message) @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::FATAL, message) +#else +#define COMPACT_GOOGLE_LOG_FATAL @ac_google_namespace@::NullStreamFatal() +#define LOG_TO_STRING_FATAL(message) @ac_google_namespace@::NullStreamFatal() +#endif + +// For DFATAL, we want to use LogMessage (as opposed to +// LogMessageFatal), to be consistent with the original behavior. +#ifdef NDEBUG +#define COMPACT_GOOGLE_LOG_DFATAL COMPACT_GOOGLE_LOG_ERROR +#elif GOOGLE_STRIP_LOG <= 3 +#define COMPACT_GOOGLE_LOG_DFATAL @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::FATAL) +#else +#define COMPACT_GOOGLE_LOG_DFATAL @ac_google_namespace@::NullStreamFatal() +#endif + +#define GOOGLE_LOG_INFO(counter) @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::INFO, counter, &@ac_google_namespace@::LogMessage::SendToLog) +#define SYSLOG_INFO(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::INFO, counter, \ + &@ac_google_namespace@::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_WARNING(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::WARNING, counter, \ + &@ac_google_namespace@::LogMessage::SendToLog) +#define SYSLOG_WARNING(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::WARNING, counter, \ + &@ac_google_namespace@::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_ERROR(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::ERROR, counter, \ + &@ac_google_namespace@::LogMessage::SendToLog) +#define SYSLOG_ERROR(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::ERROR, counter, \ + &@ac_google_namespace@::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_FATAL(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::FATAL, counter, \ + &@ac_google_namespace@::LogMessage::SendToLog) +#define SYSLOG_FATAL(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::FATAL, counter, \ + &@ac_google_namespace@::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_DFATAL(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::DFATAL_LEVEL, counter, \ + &@ac_google_namespace@::LogMessage::SendToLog) +#define SYSLOG_DFATAL(counter) \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, @ac_google_namespace@::DFATAL_LEVEL, counter, \ + &@ac_google_namespace@::LogMessage::SendToSyslogAndLog) + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) || defined(__CYGWIN32__) +// A very useful logging macro to log windows errors: +#define LOG_SYSRESULT(result) \ + if (FAILED(result)) { \ + LPTSTR message = NULL; \ + LPTSTR msg = reinterpret_cast(&message); \ + DWORD message_length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | \ + FORMAT_MESSAGE_FROM_SYSTEM, \ + 0, result, 0, msg, 100, NULL); \ + if (message_length > 0) { \ + @ac_google_namespace@::LogMessage(__FILE__, __LINE__, ERROR, 0, \ + &@ac_google_namespace@::LogMessage::SendToLog).stream() << message; \ + LocalFree(message); \ + } \ + } +#endif + +// We use the preprocessor's merging operator, "##", so that, e.g., +// LOG(INFO) becomes the token GOOGLE_LOG_INFO. There's some funny +// subtle difference between ostream member streaming functions (e.g., +// ostream::operator<<(int) and ostream non-member streaming functions +// (e.g., ::operator<<(ostream&, string&): it turns out that it's +// impossible to stream something like a string directly to an unnamed +// ostream. We employ a neat hack by calling the stream() member +// function of LogMessage which seems to avoid the problem. +#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream() +#define SYSLOG(severity) SYSLOG_ ## severity(0).stream() + +@ac_google_start_namespace@ + +// They need the definitions of integer types. +#include "glog/log_severity.h" +#include "glog/vlog_is_on.h" + +// Initialize google's logging library. You will see the program name +// specified by argv0 in log outputs. +GOOGLE_GLOG_DLL_DECL void InitGoogleLogging(const char* argv0); + +// Shutdown google's logging library. +GOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging(); + +// Install a function which will be called after LOG(FATAL). +GOOGLE_GLOG_DLL_DECL void InstallFailureFunction(void (*fail_func)()); + +class LogSink; // defined below + +// If a non-NULL sink pointer is given, we push this message to that sink. +// For LOG_TO_SINK we then do normal LOG(severity) logging as well. +// This is useful for capturing messages and passing/storing them +// somewhere more specific than the global log of the process. +// Argument types: +// LogSink* sink; +// LogSeverity severity; +// The cast is to disambiguate NULL arguments. +#define LOG_TO_SINK(sink, severity) \ + @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, \ + @ac_google_namespace@::severity, \ + static_cast<@ac_google_namespace@::LogSink*>(sink), true).stream() +#define LOG_TO_SINK_BUT_NOT_TO_LOGFILE(sink, severity) \ + @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, \ + @ac_google_namespace@::severity, \ + static_cast<@ac_google_namespace@::LogSink*>(sink), false).stream() + +// If a non-NULL string pointer is given, we write this message to that string. +// We then do normal LOG(severity) logging as well. +// This is useful for capturing messages and storing them somewhere more +// specific than the global log of the process. +// Argument types: +// string* message; +// LogSeverity severity; +// The cast is to disambiguate NULL arguments. +// NOTE: LOG(severity) expands to LogMessage().stream() for the specified +// severity. +#define LOG_TO_STRING(severity, message) \ + LOG_TO_STRING_##severity(static_cast(message)).stream() + +// If a non-NULL pointer is given, we push the message onto the end +// of a vector of strings; otherwise, we report it with LOG(severity). +// This is handy for capturing messages and perhaps passing them back +// to the caller, rather than reporting them immediately. +// Argument types: +// LogSeverity severity; +// vector *outvec; +// The cast is to disambiguate NULL arguments. +#define LOG_STRING(severity, outvec) \ + LOG_TO_STRING_##severity(static_cast*>(outvec)).stream() + +#define LOG_IF(severity, condition) \ + !(condition) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity) +#define SYSLOG_IF(severity, condition) \ + !(condition) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & SYSLOG(severity) + +#define LOG_ASSERT(condition) \ + LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition +#define SYSLOG_ASSERT(condition) \ + SYSLOG_IF(FATAL, !(condition)) << "Assert failed: " #condition + +// CHECK dies with a fatal error if condition is not true. It is *not* +// controlled by NDEBUG, so the check will be executed regardless of +// compilation mode. Therefore, it is safe to do things like: +// CHECK(fp->Write(x) == 4) +#define CHECK(condition) \ + LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \ + << "Check failed: " #condition " " + +// A container for a string pointer which can be evaluated to a bool - +// true iff the pointer is NULL. +struct CheckOpString { + CheckOpString(std::string* str) : str_(str) { } + // No destructor: if str_ is non-NULL, we're about to LOG(FATAL), + // so there's no point in cleaning up str_. + operator bool() const { + return GOOGLE_PREDICT_BRANCH_NOT_TAKEN(str_ != NULL); + } + std::string* str_; +}; + +// Function is overloaded for integral types to allow static const +// integrals declared in classes and not defined to be used as arguments to +// CHECK* macros. It's not encouraged though. +template +inline const T& GetReferenceableValue(const T& t) { return t; } +inline char GetReferenceableValue(char t) { return t; } +inline unsigned char GetReferenceableValue(unsigned char t) { return t; } +inline signed char GetReferenceableValue(signed char t) { return t; } +inline short GetReferenceableValue(short t) { return t; } +inline unsigned short GetReferenceableValue(unsigned short t) { return t; } +inline int GetReferenceableValue(int t) { return t; } +inline unsigned int GetReferenceableValue(unsigned int t) { return t; } +inline long GetReferenceableValue(long t) { return t; } +inline unsigned long GetReferenceableValue(unsigned long t) { return t; } +inline long long GetReferenceableValue(long long t) { return t; } +inline unsigned long long GetReferenceableValue(unsigned long long t) { + return t; +} + +// This is a dummy class to define the following operator. +struct DummyClassToDefineOperator {}; + +@ac_google_end_namespace@ + +// Define global operator<< to declare using ::operator<<. +// This declaration will allow use to use CHECK macros for user +// defined classes which have operator<< (e.g., stl_logging.h). +inline std::ostream& operator<<( + std::ostream& out, const google::DummyClassToDefineOperator&) { + return out; +} + +@ac_google_start_namespace@ + +// Build the error message string. +template +std::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) { + // It means that we cannot use stl_logging if compiler doesn't + // support using expression for operator. + // TODO(hamaji): Figure out a way to fix. +#if @ac_cv_cxx_using_operator@ + using ::operator<<; +#endif + std::strstream ss; + ss << names << " (" << v1 << " vs. " << v2 << ")"; + return new std::string(ss.str(), ss.pcount()); +} + +// Helper functions for CHECK_OP macro. +// The (int, int) specialization works around the issue that the compiler +// will not instantiate the template version of the function on values of +// unnamed enum type - see comment below. +#define DEFINE_CHECK_OP_IMPL(name, op) \ + template \ + inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \ + const char* names) { \ + if (v1 op v2) return NULL; \ + else return MakeCheckOpString(v1, v2, names); \ + } \ + inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \ + return Check##name##Impl(v1, v2, names); \ + } + +// Use _EQ, _NE, _LE, etc. in case the file including base/logging.h +// provides its own #defines for the simpler names EQ, NE, LE, etc. +// This happens if, for example, those are used as token names in a +// yacc grammar. +DEFINE_CHECK_OP_IMPL(_EQ, ==) +DEFINE_CHECK_OP_IMPL(_NE, !=) +DEFINE_CHECK_OP_IMPL(_LE, <=) +DEFINE_CHECK_OP_IMPL(_LT, < ) +DEFINE_CHECK_OP_IMPL(_GE, >=) +DEFINE_CHECK_OP_IMPL(_GT, > ) +#undef DEFINE_CHECK_OP_IMPL + +// Helper macro for binary operators. +// Don't use this macro directly in your code, use CHECK_EQ et al below. + +#if defined(STATIC_ANALYSIS) +// Only for static analysis tool to know that it is equivalent to assert +#define CHECK_OP_LOG(name, op, val1, val2, log) CHECK((val1) op (val2)) +#elif !defined(NDEBUG) +// In debug mode, avoid constructing CheckOpStrings if possible, +// to reduce the overhead of CHECK statments by 2x. +// Real DCHECK-heavy tests have seen 1.5x speedups. + +// The meaning of "string" might be different between now and +// when this macro gets invoked (e.g., if someone is experimenting +// with other string implementations that get defined after this +// file is included). Save the current meaning now and use it +// in the macro. +typedef std::string _Check_string; +#define CHECK_OP_LOG(name, op, val1, val2, log) \ + while (@ac_google_namespace@::_Check_string* _result = \ + @ac_google_namespace@::Check##name##Impl( \ + @ac_google_namespace@::GetReferenceableValue(val1), \ + @ac_google_namespace@::GetReferenceableValue(val2), \ + #val1 " " #op " " #val2)) \ + log(__FILE__, __LINE__, \ + @ac_google_namespace@::CheckOpString(_result)).stream() +#else +// In optimized mode, use CheckOpString to hint to compiler that +// the while condition is unlikely. +#define CHECK_OP_LOG(name, op, val1, val2, log) \ + while (@ac_google_namespace@::CheckOpString _result = \ + @ac_google_namespace@::Check##name##Impl( \ + @ac_google_namespace@::GetReferenceableValue(val1), \ + @ac_google_namespace@::GetReferenceableValue(val2), \ + #val1 " " #op " " #val2)) \ + log(__FILE__, __LINE__, _result).stream() +#endif // STATIC_ANALYSIS, !NDEBUG + +#if GOOGLE_STRIP_LOG <= 3 +#define CHECK_OP(name, op, val1, val2) \ + CHECK_OP_LOG(name, op, val1, val2, @ac_google_namespace@::LogMessageFatal) +#else +#define CHECK_OP(name, op, val1, val2) \ + CHECK_OP_LOG(name, op, val1, val2, @ac_google_namespace@::NullStreamFatal) +#endif // STRIP_LOG <= 3 + +// Equality/Inequality checks - compare two values, and log a FATAL message +// including the two values when the result is not as expected. The values +// must have operator<<(ostream, ...) defined. +// +// You may append to the error message like so: +// CHECK_NE(1, 2) << ": The world must be ending!"; +// +// We are very careful to ensure that each argument is evaluated exactly +// once, and that anything which is legal to pass as a function argument is +// legal here. In particular, the arguments may be temporary expressions +// which will end up being destroyed at the end of the apparent statement, +// for example: +// CHECK_EQ(string("abc")[1], 'b'); +// +// WARNING: These don't compile correctly if one of the arguments is a pointer +// and the other is NULL. To work around this, simply static_cast NULL to the +// type of the desired pointer. + +#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2) +#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2) +#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2) +#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2) +#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2) +#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2) + +// Check that the input is non NULL. This very useful in constructor +// initializer lists. + +#define CHECK_NOTNULL(val) \ + @ac_google_namespace@::CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val)) + +// Helper functions for string comparisons. +// To avoid bloat, the definitions are in logging.cc. +#define DECLARE_CHECK_STROP_IMPL(func, expected) \ + GOOGLE_GLOG_DLL_DECL std::string* Check##func##expected##Impl( \ + const char* s1, const char* s2, const char* names); +DECLARE_CHECK_STROP_IMPL(strcmp, true) +DECLARE_CHECK_STROP_IMPL(strcmp, false) +DECLARE_CHECK_STROP_IMPL(strcasecmp, true) +DECLARE_CHECK_STROP_IMPL(strcasecmp, false) +#undef DECLARE_CHECK_STROP_IMPL + +// Helper macro for string comparisons. +// Don't use this macro directly in your code, use CHECK_STREQ et al below. +#define CHECK_STROP(func, op, expected, s1, s2) \ + while (@ac_google_namespace@::CheckOpString _result = \ + @ac_google_namespace@::Check##func##expected##Impl((s1), (s2), \ + #s1 " " #op " " #s2)) \ + LOG(FATAL) << *_result.str_ + + +// String (char*) equality/inequality checks. +// CASE versions are case-insensitive. +// +// Note that "s1" and "s2" may be temporary strings which are destroyed +// by the compiler at the end of the current "full expression" +// (e.g. CHECK_STREQ(Foo().c_str(), Bar().c_str())). + +#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2) +#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2) +#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2) +#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2) + +#define CHECK_INDEX(I,A) CHECK(I < (sizeof(A)/sizeof(A[0]))) +#define CHECK_BOUND(B,A) CHECK(B <= (sizeof(A)/sizeof(A[0]))) + +#define CHECK_DOUBLE_EQ(val1, val2) \ + do { \ + CHECK_LE((val1), (val2)+0.000000000000001L); \ + CHECK_GE((val1), (val2)-0.000000000000001L); \ + } while (0) + +#define CHECK_NEAR(val1, val2, margin) \ + do { \ + CHECK_LE((val1), (val2)+(margin)); \ + CHECK_GE((val1), (val2)-(margin)); \ + } while (0) + +// perror()..googly style! +// +// PLOG() and PLOG_IF() and PCHECK() behave exactly like their LOG* and +// CHECK equivalents with the addition that they postpend a description +// of the current state of errno to their output lines. + +#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream() + +#define GOOGLE_PLOG(severity, counter) \ + @ac_google_namespace@::ErrnoLogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::severity, counter, \ + &@ac_google_namespace@::LogMessage::SendToLog) + +#define PLOG_IF(severity, condition) \ + !(condition) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & PLOG(severity) + +// A CHECK() macro that postpends errno if the condition is false. E.g. +// +// if (poll(fds, nfds, timeout) == -1) { PCHECK(errno == EINTR); ... } +#define PCHECK(condition) \ + PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \ + << "Check failed: " #condition " " + +// A CHECK() macro that lets you assert the success of a function that +// returns -1 and sets errno in case of an error. E.g. +// +// CHECK_ERR(mkdir(path, 0700)); +// +// or +// +// int fd = open(filename, flags); CHECK_ERR(fd) << ": open " << filename; +#define CHECK_ERR(invocation) \ +PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN((invocation) == -1)) \ + << #invocation + +// Use macro expansion to create, for each use of LOG_EVERY_N(), static +// variables with the __LINE__ expansion as part of the variable name. +#define LOG_EVERY_N_VARNAME(base, line) LOG_EVERY_N_VARNAME_CONCAT(base, line) +#define LOG_EVERY_N_VARNAME_CONCAT(base, line) base ## line + +#define LOG_OCCURRENCES LOG_EVERY_N_VARNAME(occurrences_, __LINE__) +#define LOG_OCCURRENCES_MOD_N LOG_EVERY_N_VARNAME(occurrences_mod_n_, __LINE__) + +#define SOME_KIND_OF_LOG_EVERY_N(severity, n, what_to_do) \ + static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \ + ++LOG_OCCURRENCES; \ + if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \ + if (LOG_OCCURRENCES_MOD_N == 1) \ + @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +#define SOME_KIND_OF_LOG_IF_EVERY_N(severity, condition, n, what_to_do) \ + static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \ + ++LOG_OCCURRENCES; \ + if (condition && \ + ((LOG_OCCURRENCES_MOD_N=(LOG_OCCURRENCES_MOD_N + 1) % n) == (1 % n))) \ + @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +#define SOME_KIND_OF_PLOG_EVERY_N(severity, n, what_to_do) \ + static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \ + ++LOG_OCCURRENCES; \ + if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \ + if (LOG_OCCURRENCES_MOD_N == 1) \ + @ac_google_namespace@::ErrnoLogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +#define SOME_KIND_OF_LOG_FIRST_N(severity, n, what_to_do) \ + static int LOG_OCCURRENCES = 0; \ + if (LOG_OCCURRENCES <= n) \ + ++LOG_OCCURRENCES; \ + if (LOG_OCCURRENCES <= n) \ + @ac_google_namespace@::LogMessage( \ + __FILE__, __LINE__, @ac_google_namespace@::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +namespace glog_internal_namespace_ { +template +struct CompileAssert { +}; +struct CrashReason; +} // namespace glog_internal_namespace_ + +#define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \ + typedef @ac_google_namespace@::glog_internal_namespace_::CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] + +#define LOG_EVERY_N(severity, n) \ + GOOGLE_GLOG_COMPILE_ASSERT(@ac_google_namespace@::severity < \ + @ac_google_namespace@::NUM_SEVERITIES, \ + INVALID_REQUESTED_LOG_SEVERITY); \ + SOME_KIND_OF_LOG_EVERY_N(severity, (n), @ac_google_namespace@::LogMessage::SendToLog) + +#define SYSLOG_EVERY_N(severity, n) \ + SOME_KIND_OF_LOG_EVERY_N(severity, (n), @ac_google_namespace@::LogMessage::SendToSyslogAndLog) + +#define PLOG_EVERY_N(severity, n) \ + SOME_KIND_OF_PLOG_EVERY_N(severity, (n), @ac_google_namespace@::LogMessage::SendToLog) + +#define LOG_FIRST_N(severity, n) \ + SOME_KIND_OF_LOG_FIRST_N(severity, (n), @ac_google_namespace@::LogMessage::SendToLog) + +#define LOG_IF_EVERY_N(severity, condition, n) \ + SOME_KIND_OF_LOG_IF_EVERY_N(severity, (condition), (n), @ac_google_namespace@::LogMessage::SendToLog) + +// We want the special COUNTER value available for LOG_EVERY_X()'ed messages +enum PRIVATE_Counter {COUNTER}; + + +// Plus some debug-logging macros that get compiled to nothing for production + +#ifndef NDEBUG + +#define DLOG(severity) LOG(severity) +#define DVLOG(verboselevel) VLOG(verboselevel) +#define DLOG_IF(severity, condition) LOG_IF(severity, condition) +#define DLOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n) +#define DLOG_IF_EVERY_N(severity, condition, n) \ + LOG_IF_EVERY_N(severity, condition, n) +#define DLOG_ASSERT(condition) LOG_ASSERT(condition) + +// debug-only checking. not executed in NDEBUG mode. +#define DCHECK(condition) CHECK(condition) +#define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2) +#define DCHECK_NE(val1, val2) CHECK_NE(val1, val2) +#define DCHECK_LE(val1, val2) CHECK_LE(val1, val2) +#define DCHECK_LT(val1, val2) CHECK_LT(val1, val2) +#define DCHECK_GE(val1, val2) CHECK_GE(val1, val2) +#define DCHECK_GT(val1, val2) CHECK_GT(val1, val2) +#define DCHECK_NOTNULL(val) CHECK_NOTNULL(val) +#define DCHECK_STREQ(str1, str2) CHECK_STREQ(str1, str2) +#define DCHECK_STRCASEEQ(str1, str2) CHECK_STRCASEEQ(str1, str2) +#define DCHECK_STRNE(str1, str2) CHECK_STRNE(str1, str2) +#define DCHECK_STRCASENE(str1, str2) CHECK_STRCASENE(str1, str2) + +#else // NDEBUG + +#define DLOG(severity) \ + true ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity) + +#define DVLOG(verboselevel) \ + (true || !VLOG_IS_ON(verboselevel)) ?\ + (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(INFO) + +#define DLOG_IF(severity, condition) \ + (true || !(condition)) ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity) + +#define DLOG_EVERY_N(severity, n) \ + true ? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity) + +#define DLOG_IF_EVERY_N(severity, condition, n) \ + (true || !(condition))? (void) 0 : @ac_google_namespace@::LogMessageVoidify() & LOG(severity) + +#define DLOG_ASSERT(condition) \ + true ? (void) 0 : LOG_ASSERT(condition) + +#define DCHECK(condition) \ + while (false) \ + CHECK(condition) + +#define DCHECK_EQ(val1, val2) \ + while (false) \ + CHECK_EQ(val1, val2) + +#define DCHECK_NE(val1, val2) \ + while (false) \ + CHECK_NE(val1, val2) + +#define DCHECK_LE(val1, val2) \ + while (false) \ + CHECK_LE(val1, val2) + +#define DCHECK_LT(val1, val2) \ + while (false) \ + CHECK_LT(val1, val2) + +#define DCHECK_GE(val1, val2) \ + while (false) \ + CHECK_GE(val1, val2) + +#define DCHECK_GT(val1, val2) \ + while (false) \ + CHECK_GT(val1, val2) + +#define DCHECK_NOTNULL(val) (val) + +#define DCHECK_STREQ(str1, str2) \ + while (false) \ + CHECK_STREQ(str1, str2) + +#define DCHECK_STRCASEEQ(str1, str2) \ + while (false) \ + CHECK_STRCASEEQ(str1, str2) + +#define DCHECK_STRNE(str1, str2) \ + while (false) \ + CHECK_STRNE(str1, str2) + +#define DCHECK_STRCASENE(str1, str2) \ + while (false) \ + CHECK_STRCASENE(str1, str2) + + +#endif // NDEBUG + +// Log only in verbose mode. + +#define VLOG(verboselevel) LOG_IF(INFO, VLOG_IS_ON(verboselevel)) + +#define VLOG_IF(verboselevel, condition) \ + LOG_IF(INFO, (condition) && VLOG_IS_ON(verboselevel)) + +#define VLOG_EVERY_N(verboselevel, n) \ + LOG_IF_EVERY_N(INFO, VLOG_IS_ON(verboselevel), n) + +#define VLOG_IF_EVERY_N(verboselevel, condition, n) \ + LOG_IF_EVERY_N(INFO, (condition) && VLOG_IS_ON(verboselevel), n) + +// +// This class more or less represents a particular log message. You +// create an instance of LogMessage and then stream stuff to it. +// When you finish streaming to it, ~LogMessage is called and the +// full message gets streamed to the appropriate destination. +// +// You shouldn't actually use LogMessage's constructor to log things, +// though. You should use the LOG() macro (and variants thereof) +// above. +class GOOGLE_GLOG_DLL_DECL LogMessage { +public: + enum { + // Passing kNoLogPrefix for the line number disables the + // log-message prefix. Useful for using the LogMessage + // infrastructure as a printing utility. See also the --log_prefix + // flag for controlling the log-message prefix on an + // application-wide basis. + kNoLogPrefix = -1 + }; + + // LogStream inherit from non-DLL-exported class (std::ostrstream) + // and VC++ produces a warning for this situation. + // However, MSDN says "C4275 can be ignored in Microsoft Visual C++ + // 2005 if you are deriving from a type in the Standard C++ Library" + // http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx + // Let's just ignore the warning. +#ifdef _MSC_VER +# pragma warning(disable: 4275) +#endif + class GOOGLE_GLOG_DLL_DECL LogStream : public std::ostrstream { +#ifdef _MSC_VER +# pragma warning(default: 4275) +#endif + public: + LogStream(char *buf, int len, int ctr) + : ostrstream(buf, len), + ctr_(ctr) { + self_ = this; + } + + int ctr() const { return ctr_; } + void set_ctr(int ctr) { ctr_ = ctr; } + LogStream* self() const { return self_; } + + private: + int ctr_; // Counter hack (for the LOG_EVERY_X() macro) + LogStream *self_; // Consistency check hack + }; + +public: + // icc 8 requires this typedef to avoid an internal compiler error. + typedef void (LogMessage::*SendMethod)(); + + LogMessage(const char* file, int line, LogSeverity severity, int ctr, + SendMethod send_method); + + // Two special constructors that generate reduced amounts of code at + // LOG call sites for common cases. + + // Used for LOG(INFO): Implied are: + // severity = INFO, ctr = 0, send_method = &LogMessage::SendToLog. + // + // Using this constructor instead of the more complex constructor above + // saves 19 bytes per call site. + LogMessage(const char* file, int line); + + // Used for LOG(severity) where severity != INFO. Implied + // are: ctr = 0, send_method = &LogMessage::SendToLog + // + // Using this constructor instead of the more complex constructor above + // saves 17 bytes per call site. + LogMessage(const char* file, int line, LogSeverity severity); + + // Constructor to log this message to a specified sink (if not NULL). + // Implied are: ctr = 0, send_method = &LogMessage::SendToSinkAndLog if + // also_send_to_log is true, send_method = &LogMessage::SendToSink otherwise. + LogMessage(const char* file, int line, LogSeverity severity, LogSink* sink, + bool also_send_to_log); + + // Constructor where we also give a vector pointer + // for storing the messages (if the pointer is not NULL). + // Implied are: ctr = 0, send_method = &LogMessage::SaveOrSendToLog. + LogMessage(const char* file, int line, LogSeverity severity, + std::vector* outvec); + + // Constructor where we also give a string pointer for storing the + // message (if the pointer is not NULL). Implied are: ctr = 0, + // send_method = &LogMessage::WriteToStringAndLog. + LogMessage(const char* file, int line, LogSeverity severity, + std::string* message); + + // A special constructor used for check failures + LogMessage(const char* file, int line, const CheckOpString& result); + + ~LogMessage(); + + // Flush a buffered message to the sink set in the constructor. Always + // called by the destructor, it may also be called from elsewhere if + // needed. Only the first call is actioned; any later ones are ignored. + void Flush(); + + // An arbitrary limit on the length of a single log message. This + // is so that streaming can be done more efficiently. + static const size_t kMaxLogMessageLen; + + // Theses should not be called directly outside of logging.*, + // only passed as SendMethod arguments to other LogMessage methods: + void SendToLog(); // Actually dispatch to the logs + void SendToSyslogAndLog(); // Actually dispatch to syslog and the logs + + // Call abort() or similar to perform LOG(FATAL) crash. + static void Fail() @ac_cv___attribute___noreturn@; + + std::ostream& stream() { return *(data_->stream_); } + + int preserved_errno() const { return data_->preserved_errno_; } + + // Must be called without the log_mutex held. (L < log_mutex) + static int64 num_messages(int severity); + +private: + // Fully internal SendMethod cases: + void SendToSinkAndLog(); // Send to sink if provided and dispatch to the logs + void SendToSink(); // Send to sink if provided, do nothing otherwise. + + // Write to string if provided and dispatch to the logs. + void WriteToStringAndLog(); + + void SaveOrSendToLog(); // Save to stringvec if provided, else to logs + + void Init(const char* file, int line, LogSeverity severity, + void (LogMessage::*send_method)()); + + // Used to fill in crash information during LOG(FATAL) failures. + void RecordCrashReason(glog_internal_namespace_::CrashReason* reason); + + // Counts of messages sent at each priority: + static int64 num_messages_[NUM_SEVERITIES]; // under log_mutex + + // We keep the data in a separate struct so that each instance of + // LogMessage uses less stack space. + struct GOOGLE_GLOG_DLL_DECL LogMessageData { + LogMessageData() {}; + + int preserved_errno_; // preserved errno + char* buf_; + char* message_text_; // Complete message text (points to selected buffer) + LogStream* stream_alloc_; + LogStream* stream_; + char severity_; // What level is this LogMessage logged at? + int line_; // line number where logging call is. + void (LogMessage::*send_method_)(); // Call this in destructor to send + union { // At most one of these is used: union to keep the size low. + LogSink* sink_; // NULL or sink to send message to + std::vector* outvec_; // NULL or vector to push message onto + std::string* message_; // NULL or string to write message into + }; + time_t timestamp_; // Time of creation of LogMessage + struct ::tm tm_time_; // Time of creation of LogMessage + size_t num_prefix_chars_; // # of chars of prefix in this message + size_t num_chars_to_log_; // # of chars of msg to send to log + size_t num_chars_to_syslog_; // # of chars of msg to send to syslog + const char* basename_; // basename of file that called LOG + const char* fullname_; // fullname of file that called LOG + bool has_been_flushed_; // false => data has not been flushed + bool first_fatal_; // true => this was first fatal msg + + ~LogMessageData(); + private: + LogMessageData(const LogMessageData&); + void operator=(const LogMessageData&); + }; + + static LogMessageData fatal_msg_data_exclusive_; + static LogMessageData fatal_msg_data_shared_; + + LogMessageData* allocated_; + LogMessageData* data_; + + friend class LogDestination; + + LogMessage(const LogMessage&); + void operator=(const LogMessage&); +}; + +// This class happens to be thread-hostile because all instances share +// a single data buffer, but since it can only be created just before +// the process dies, we don't worry so much. +class GOOGLE_GLOG_DLL_DECL LogMessageFatal : public LogMessage { + public: + LogMessageFatal(const char* file, int line); + LogMessageFatal(const char* file, int line, const CheckOpString& result); + ~LogMessageFatal() @ac_cv___attribute___noreturn@; +}; + +// A non-macro interface to the log facility; (useful +// when the logging level is not a compile-time constant). +inline void LogAtLevel(int const severity, std::string const &msg) { + LogMessage(__FILE__, __LINE__, severity).stream() << msg; +} + +// A macro alternative of LogAtLevel. New code may want to use this +// version since there are two advantages: 1. this version outputs the +// file name and the line number where this macro is put like other +// LOG macros, 2. this macro can be used as C++ stream. +#define LOG_AT_LEVEL(severity) @ac_google_namespace@::LogMessage(__FILE__, __LINE__, severity).stream() + +// A small helper for CHECK_NOTNULL(). +template +T* CheckNotNull(const char *file, int line, const char *names, T* t) { + if (t == NULL) { + LogMessageFatal(file, line, new std::string(names)); + } + return t; +} + +// Allow folks to put a counter in the LOG_EVERY_X()'ed messages. This +// only works if ostream is a LogStream. If the ostream is not a +// LogStream you'll get an assert saying as much at runtime. +GOOGLE_GLOG_DLL_DECL std::ostream& operator<<(std::ostream &os, + const PRIVATE_Counter&); + + +// Derived class for PLOG*() above. +class GOOGLE_GLOG_DLL_DECL ErrnoLogMessage : public LogMessage { + public: + + ErrnoLogMessage(const char* file, int line, LogSeverity severity, int ctr, + void (LogMessage::*send_method)()); + + // Postpends ": strerror(errno) [errno]". + ~ErrnoLogMessage(); + + private: + ErrnoLogMessage(const ErrnoLogMessage&); + void operator=(const ErrnoLogMessage&); +}; + + +// This class is used to explicitly ignore values in the conditional +// logging macros. This avoids compiler warnings like "value computed +// is not used" and "statement has no effect". + +class GOOGLE_GLOG_DLL_DECL LogMessageVoidify { + public: + LogMessageVoidify() { } + // This has to be an operator with a precedence lower than << but + // higher than ?: + void operator&(std::ostream&) { } +}; + + +// Flushes all log files that contains messages that are at least of +// the specified severity level. Thread-safe. +GOOGLE_GLOG_DLL_DECL void FlushLogFiles(LogSeverity min_severity); + +// Flushes all log files that contains messages that are at least of +// the specified severity level. Thread-hostile because it ignores +// locking -- used for catastrophic failures. +GOOGLE_GLOG_DLL_DECL void FlushLogFilesUnsafe(LogSeverity min_severity); + +// +// Set the destination to which a particular severity level of log +// messages is sent. If base_filename is "", it means "don't log this +// severity". Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetLogDestination(LogSeverity severity, + const char* base_filename); + +// +// Set the basename of the symlink to the latest log file at a given +// severity. If symlink_basename is empty, do not make a symlink. If +// you don't call this function, the symlink basename is the +// invocation name of the program. Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetLogSymlink(LogSeverity severity, + const char* symlink_basename); + +// +// Used to send logs to some other kind of destination +// Users should subclass LogSink and override send to do whatever they want. +// Implementations must be thread-safe because a shared instance will +// be called from whichever thread ran the LOG(XXX) line. +class GOOGLE_GLOG_DLL_DECL LogSink { + public: + virtual ~LogSink(); + + // Sink's logging logic (message_len is such as to exclude '\n' at the end). + // This method can't use LOG() or CHECK() as logging system mutex(s) are held + // during this call. + virtual void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, + const struct ::tm* tm_time, + const char* message, size_t message_len) = 0; + + // Redefine this to implement waiting for + // the sink's logging logic to complete. + // It will be called after each send() returns, + // but before that LogMessage exits or crashes. + // By default this function does nothing. + // Using this function one can implement complex logic for send() + // that itself involves logging; and do all this w/o causing deadlocks and + // inconsistent rearrangement of log messages. + // E.g. if a LogSink has thread-specific actions, the send() method + // can simply add the message to a queue and wake up another thread that + // handles real logging while itself making some LOG() calls; + // WaitTillSent() can be implemented to wait for that logic to complete. + // See our unittest for an example. + virtual void WaitTillSent(); + + // Returns the normal text output of the log message. + // Can be useful to implement send(). + static std::string ToString(LogSeverity severity, const char* file, int line, + const struct ::tm* tm_time, + const char* message, size_t message_len); +}; + +// Add or remove a LogSink as a consumer of logging data. Thread-safe. +GOOGLE_GLOG_DLL_DECL void AddLogSink(LogSink *destination); +GOOGLE_GLOG_DLL_DECL void RemoveLogSink(LogSink *destination); + +// +// Specify an "extension" added to the filename specified via +// SetLogDestination. This applies to all severity levels. It's +// often used to append the port we're listening on to the logfile +// name. Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetLogFilenameExtension( + const char* filename_extension); + +// +// Make it so that all log messages of at least a particular severity +// are logged to stderr (in addition to logging to the usual log +// file(s)). Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetStderrLogging(LogSeverity min_severity); + +// +// Make it so that all log messages go only to stderr. Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void LogToStderr(); + +// +// Make it so that all log messages of at least a particular severity are +// logged via email to a list of addresses (in addition to logging to the +// usual log file(s)). The list of addresses is just a string containing +// the email addresses to send to (separated by spaces, say). Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetEmailLogging(LogSeverity min_severity, + const char* addresses); + +// A simple function that sends email. dest is a commma-separated +// list of addressess. Thread-safe. +GOOGLE_GLOG_DLL_DECL bool SendEmail(const char *dest, + const char *subject, const char *body); + +GOOGLE_GLOG_DLL_DECL const std::vector& GetLoggingDirectories(); + +// For tests only: Clear the internal [cached] list of logging directories to +// force a refresh the next time GetLoggingDirectories is called. +// Thread-hostile. +void TestOnly_ClearLoggingDirectoriesList(); + +// Returns a set of existing temporary directories, which will be a +// subset of the directories returned by GetLogginDirectories(). +// Thread-safe. +GOOGLE_GLOG_DLL_DECL void GetExistingTempDirectories( + std::vector* list); + +// Print any fatal message again -- useful to call from signal handler +// so that the last thing in the output is the fatal message. +// Thread-hostile, but a race is unlikely. +GOOGLE_GLOG_DLL_DECL void ReprintFatalMessage(); + +// Truncate a log file that may be the append-only output of multiple +// processes and hence can't simply be renamed/reopened (typically a +// stdout/stderr). If the file "path" is > "limit" bytes, copy the +// last "keep" bytes to offset 0 and truncate the rest. Since we could +// be racing with other writers, this approach has the potential to +// lose very small amounts of data. For security, only follow symlinks +// if the path is /proc/self/fd/* +GOOGLE_GLOG_DLL_DECL void TruncateLogFile(const char *path, + int64 limit, int64 keep); + +// Truncate stdout and stderr if they are over the value specified by +// --max_log_size; keep the final 1MB. This function has the same +// race condition as TruncateLogFile. +GOOGLE_GLOG_DLL_DECL void TruncateStdoutStderr(); + +// Return the string representation of the provided LogSeverity level. +// Thread-safe. +GOOGLE_GLOG_DLL_DECL const char* GetLogSeverityName(LogSeverity severity); + +// --------------------------------------------------------------------- +// Implementation details that are not useful to most clients +// --------------------------------------------------------------------- + +// A Logger is the interface used by logging modules to emit entries +// to a log. A typical implementation will dump formatted data to a +// sequence of files. We also provide interfaces that will forward +// the data to another thread so that the invoker never blocks. +// Implementations should be thread-safe since the logging system +// will write to them from multiple threads. + +namespace base { + +class GOOGLE_GLOG_DLL_DECL Logger { + public: + virtual ~Logger(); + + // Writes "message[0,message_len-1]" corresponding to an event that + // occurred at "timestamp". If "force_flush" is true, the log file + // is flushed immediately. + // + // The input message has already been formatted as deemed + // appropriate by the higher level logging facility. For example, + // textual log messages already contain timestamps, and the + // file:linenumber header. + virtual void Write(bool force_flush, + time_t timestamp, + const char* message, + int message_len) = 0; + + // Flush any buffered messages + virtual void Flush() = 0; + + // Get the current LOG file size. + // The returned value is approximate since some + // logged data may not have been flushed to disk yet. + virtual uint32 LogSize() = 0; +}; + +// Get the logger for the specified severity level. The logger +// remains the property of the logging module and should not be +// deleted by the caller. Thread-safe. +extern GOOGLE_GLOG_DLL_DECL Logger* GetLogger(LogSeverity level); + +// Set the logger for the specified severity level. The logger +// becomes the property of the logging module and should not +// be deleted by the caller. Thread-safe. +extern GOOGLE_GLOG_DLL_DECL void SetLogger(LogSeverity level, Logger* logger); + +} + +// glibc has traditionally implemented two incompatible versions of +// strerror_r(). There is a poorly defined convention for picking the +// version that we want, but it is not clear whether it even works with +// all versions of glibc. +// So, instead, we provide this wrapper that automatically detects the +// version that is in use, and then implements POSIX semantics. +// N.B. In addition to what POSIX says, we also guarantee that "buf" will +// be set to an empty string, if this function failed. This means, in most +// cases, you do not need to check the error code and you can directly +// use the value of "buf". It will never have an undefined value. +GOOGLE_GLOG_DLL_DECL int posix_strerror_r(int err, char *buf, size_t len); + + +// A class for which we define operator<<, which does nothing. +class GOOGLE_GLOG_DLL_DECL NullStream : public LogMessage::LogStream { + public: + // Initialize the LogStream so the messages can be written somewhere + // (they'll never be actually displayed). This will be needed if a + // NullStream& is implicitly converted to LogStream&, in which case + // the overloaded NullStream::operator<< will not be invoked. + NullStream() : LogMessage::LogStream(message_buffer_, 1, 0) { } + NullStream(const char* /*file*/, int /*line*/, + const CheckOpString& /*result*/) : + LogMessage::LogStream(message_buffer_, 1, 0) { } + NullStream &stream() { return *this; } + private: + // A very short buffer for messages (which we discard anyway). This + // will be needed if NullStream& converted to LogStream& (e.g. as a + // result of a conditional expression). + char message_buffer_[2]; +}; + +// Do nothing. This operator is inline, allowing the message to be +// compiled away. The message will not be compiled away if we do +// something like (flag ? LOG(INFO) : LOG(ERROR)) << message; when +// SKIP_LOG=WARNING. In those cases, NullStream will be implicitly +// converted to LogStream and the message will be computed and then +// quietly discarded. +template +inline NullStream& operator<<(NullStream &str, const T &value) { return str; } + +// Similar to NullStream, but aborts the program (without stack +// trace), like LogMessageFatal. +class GOOGLE_GLOG_DLL_DECL NullStreamFatal : public NullStream { + public: + NullStreamFatal() { } + NullStreamFatal(const char* file, int line, const CheckOpString& result) : + NullStream(file, line, result) { } + @ac_cv___attribute___noreturn@ ~NullStreamFatal() { _exit(1); } +}; + +// Install a signal handler that will dump signal information and a stack +// trace when the program crashes on certain signals. We'll install the +// signal handler for the following signals. +// +// SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, and SIGTERM. +// +// By default, the signal handler will write the failure dump to the +// standard error. You can customize the destination by installing your +// own writer function by InstallFailureWriter() below. +// +// Note on threading: +// +// The function should be called before threads are created, if you want +// to use the failure signal handler for all threads. The stack trace +// will be shown only for the thread that receives the signal. In other +// words, stack traces of other threads won't be shown. +GOOGLE_GLOG_DLL_DECL void InstallFailureSignalHandler(); + +// Installs a function that is used for writing the failure dump. "data" +// is the pointer to the beginning of a message to be written, and "size" +// is the size of the message. You should not expect the data is +// terminated with '\0'. +GOOGLE_GLOG_DLL_DECL void InstallFailureWriter( + void (*writer)(const char* data, int size)); + +@ac_google_end_namespace@ + +#endif // _LOGGING_H_ diff --git a/spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in b/spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in new file mode 100644 index 000000000..5378cd467 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in @@ -0,0 +1,185 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Maxim Lifantsev +// +// Thread-safe logging routines that do not allocate any memory or +// acquire any locks, and can therefore be used by low-level memory +// allocation and synchronization code. + +#ifndef BASE_RAW_LOGGING_H_ +#define BASE_RAW_LOGGING_H_ + +#include + +@ac_google_start_namespace@ + +#include "glog/log_severity.h" +#include "glog/vlog_is_on.h" + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +// This is similar to LOG(severity) << format... and VLOG(level) << format.., +// but +// * it is to be used ONLY by low-level modules that can't use normal LOG() +// * it is desiged to be a low-level logger that does not allocate any +// memory and does not need any locks, hence: +// * it logs straight and ONLY to STDERR w/o buffering +// * it uses an explicit format and arguments list +// * it will silently chop off really long message strings +// Usage example: +// RAW_LOG(ERROR, "Failed foo with %i: %s", status, error); +// RAW_VLOG(3, "status is %i", status); +// These will print an almost standard log lines like this to stderr only: +// E0821 211317 file.cc:123] RAW: Failed foo with 22: bad_file +// I0821 211317 file.cc:142] RAW: status is 20 +#define RAW_LOG(severity, ...) \ + do { \ + switch (@ac_google_namespace@::severity) { \ + case 0: \ + RAW_LOG_INFO(__VA_ARGS__); \ + break; \ + case 1: \ + RAW_LOG_WARNING(__VA_ARGS__); \ + break; \ + case 2: \ + RAW_LOG_ERROR(__VA_ARGS__); \ + break; \ + case 3: \ + RAW_LOG_FATAL(__VA_ARGS__); \ + break; \ + default: \ + break; \ + } \ + } while (0) + +// The following STRIP_LOG testing is performed in the header file so that it's +// possible to completely compile out the logging code and the log messages. +#if STRIP_LOG == 0 +#define RAW_VLOG(verboselevel, ...) \ + do { \ + if (VLOG_IS_ON(verboselevel)) { \ + RAW_LOG_INFO(__VA_ARGS__); \ + } \ + } while (0) +#else +#define RAW_VLOG(verboselevel, ...) RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG == 0 + +#if STRIP_LOG == 0 +#define RAW_LOG_INFO(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::INFO, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_INFO(...) @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG == 0 + +#if STRIP_LOG <= 1 +#define RAW_LOG_WARNING(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::WARNING, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_WARNING(...) @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG <= 1 + +#if STRIP_LOG <= 2 +#define RAW_LOG_ERROR(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::ERROR, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_ERROR(...) @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG <= 2 + +#if STRIP_LOG <= 3 +#define RAW_LOG_FATAL(...) @ac_google_namespace@::RawLog__(@ac_google_namespace@::FATAL, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_FATAL(...) \ + do { \ + @ac_google_namespace@::RawLogStub__(0, __VA_ARGS__); \ + exit(1); \ + } while (0) +#endif // STRIP_LOG <= 3 + +// Similar to CHECK(condition) << message, +// but for low-level modules: we use only RAW_LOG that does not allocate memory. +// We do not want to provide args list here to encourage this usage: +// if (!cond) RAW_LOG(FATAL, "foo ...", hard_to_compute_args); +// so that the args are not computed when not needed. +#define RAW_CHECK(condition, message) \ + do { \ + if (!(condition)) { \ + RAW_LOG(FATAL, "Check %s failed: %s", #condition, message); \ + } \ + } while (0) + +// Debug versions of RAW_LOG and RAW_CHECK +#ifndef NDEBUG + +#define RAW_DLOG(severity, ...) RAW_LOG(severity, __VA_ARGS__) +#define RAW_DCHECK(condition, message) RAW_CHECK(condition, message) + +#else // NDEBUG + +#define RAW_DLOG(severity, ...) \ + while (false) \ + RAW_LOG(severity, __VA_ARGS__) +#define RAW_DCHECK(condition, message) \ + while (false) \ + RAW_CHECK(condition, message) + +#endif // NDEBUG + +// Stub log function used to work around for unused variable warnings when +// building with STRIP_LOG > 0. +static inline void RawLogStub__(int ignored, ...) { +} + +// Helper function to implement RAW_LOG and RAW_VLOG +// Logs format... at "severity" level, reporting it +// as called from file:line. +// This does not allocate memory or acquire locks. +GOOGLE_GLOG_DLL_DECL void RawLog__(LogSeverity severity, + const char* file, + int line, + const char* format, ...) + @ac_cv___attribute___printf_4_5@; + +// Hack to propagate time information into this module so that +// this module does not have to directly call localtime_r(), +// which could allocate memory. +GOOGLE_GLOG_DLL_DECL void RawLog__SetLastTime(const struct tm& t, int usecs); + +@ac_google_end_namespace@ + +#endif // BASE_RAW_LOGGING_H_ diff --git a/spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in b/spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in new file mode 100644 index 000000000..f09e08718 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in @@ -0,0 +1,154 @@ +// Copyright (c) 2003, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Stream output operators for STL containers; to be used for logging *only*. +// Inclusion of this file lets you do: +// +// list x; +// LOG(INFO) << "data: " << x; +// vector v1, v2; +// CHECK_EQ(v1, v2); +// +// Note that if you want to use these operators from the non-global namespace, +// you may get an error since they are not in namespace std (and they are not +// in namespace std since that would result in undefined behavior). You may +// need to write +// +// using ::operator<<; +// +// to fix these errors. + +#ifndef UTIL_GTL_STL_LOGGING_INL_H_ +#define UTIL_GTL_STL_LOGGING_INL_H_ + +#if !@ac_cv_cxx_using_operator@ +# error We do not support stl_logging for this compiler +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# include +# include +# include +#endif + +template +inline std::ostream& operator<<(std::ostream& out, + const std::pair& p) { + out << '(' << p.first << ", " << p.second << ')'; + return out; +} + +@ac_google_start_namespace@ + +template +inline void PrintSequence(std::ostream& out, Iter begin, Iter end) { + using ::operator<<; + // Output at most 100 elements -- appropriate if used for logging. + for (int i = 0; begin != end && i < 100; ++i, ++begin) { + if (i > 0) out << ' '; + out << *begin; + } + if (begin != end) { + out << " ..."; + } +} + +@ac_google_end_namespace@ + +#define OUTPUT_TWO_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +OUTPUT_TWO_ARG_CONTAINER(std::vector) +OUTPUT_TWO_ARG_CONTAINER(std::deque) +OUTPUT_TWO_ARG_CONTAINER(std::list) +#ifdef __GNUC__ +OUTPUT_TWO_ARG_CONTAINER(__gnu_cxx::slist) +#endif + +#undef OUTPUT_TWO_ARG_CONTAINER + +#define OUTPUT_THREE_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +OUTPUT_THREE_ARG_CONTAINER(std::set) +OUTPUT_THREE_ARG_CONTAINER(std::multiset) + +#undef OUTPUT_THREE_ARG_CONTAINER + +#define OUTPUT_FOUR_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +OUTPUT_FOUR_ARG_CONTAINER(std::map) +OUTPUT_FOUR_ARG_CONTAINER(std::multimap) +#ifdef __GNUC__ +OUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_set) +OUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_multiset) +#endif + +#undef OUTPUT_FOUR_ARG_CONTAINER + +#define OUTPUT_FIVE_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + @ac_google_namespace@::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +#ifdef __GNUC__ +OUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_map) +OUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_multimap) +#endif + +#undef OUTPUT_FIVE_ARG_CONTAINER + +#endif // UTIL_GTL_STL_LOGGING_INL_H_ diff --git a/spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in b/spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in new file mode 100644 index 000000000..3f4c4a32a --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in @@ -0,0 +1,129 @@ +// Copyright (c) 1999, 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Ray Sidney and many others +// +// Defines the VLOG_IS_ON macro that controls the variable-verbosity +// conditional logging. +// +// It's used by VLOG and VLOG_IF in logging.h +// and by RAW_VLOG in raw_logging.h to trigger the logging. +// +// It can also be used directly e.g. like this: +// if (VLOG_IS_ON(2)) { +// // do some logging preparation and logging +// // that can't be accomplished e.g. via just VLOG(2) << ...; +// } +// +// The truth value that VLOG_IS_ON(level) returns is determined by +// the three verbosity level flags: +// --v= Gives the default maximal active V-logging level; +// 0 is the default. +// Normally positive values are used for V-logging levels. +// --vmodule= Gives the per-module maximal V-logging levels to override +// the value given by --v. +// E.g. "my_module=2,foo*=3" would change the logging level +// for all code in source files "my_module.*" and "foo*.*" +// ("-inl" suffixes are also disregarded for this matching). +// +// SetVLOGLevel helper function is provided to do limited dynamic control over +// V-logging by overriding the per-module settings given via --vmodule flag. +// +// CAVEAT: --vmodule functionality is not available in non gcc compilers. +// + +#ifndef BASE_VLOG_IS_ON_H_ +#define BASE_VLOG_IS_ON_H_ + +#include "glog/log_severity.h" + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +#if defined(__GNUC__) +// We emit an anonymous static int* variable at every VLOG_IS_ON(n) site. +// (Normally) the first time every VLOG_IS_ON(n) site is hit, +// we determine what variable will dynamically control logging at this site: +// it's either FLAGS_v or an appropriate internal variable +// matching the current source file that represents results of +// parsing of --vmodule flag and/or SetVLOGLevel calls. +#define VLOG_IS_ON(verboselevel) \ + __extension__ \ + ({ static @ac_google_namespace@::int32* vlocal__ = &@ac_google_namespace@::kLogSiteUninitialized; \ + @ac_google_namespace@::int32 verbose_level__ = (verboselevel); \ + (*vlocal__ >= verbose_level__) && \ + ((vlocal__ != &@ac_google_namespace@::kLogSiteUninitialized) || \ + (@ac_google_namespace@::InitVLOG3__(&vlocal__, &FLAGS_v, \ + __FILE__, verbose_level__))); }) +#else +// GNU extensions not available, so we do not support --vmodule. +// Dynamic value of FLAGS_v always controls the logging level. +#define VLOG_IS_ON(verboselevel) (FLAGS_v >= (verboselevel)) +#endif + +// Set VLOG(_IS_ON) level for module_pattern to log_level. +// This lets us dynamically control what is normally set by the --vmodule flag. +// Returns the level that previously applied to module_pattern. +// NOTE: To change the log level for VLOG(_IS_ON) sites +// that have already executed after/during InitGoogleLogging, +// one needs to supply the exact --vmodule pattern that applied to them. +// (If no --vmodule pattern applied to them +// the value of FLAGS_v will continue to control them.) +extern GOOGLE_GLOG_DLL_DECL int SetVLOGLevel(const char* module_pattern, + int log_level); + +// Various declarations needed for VLOG_IS_ON above: ========================= + +// Special value used to indicate that a VLOG_IS_ON site has not been +// initialized. We make this a large value, so the common-case check +// of "*vlocal__ >= verbose_level__" in VLOG_IS_ON definition +// passes in such cases and InitVLOG3__ is then triggered. +extern @ac_google_namespace@::int32 kLogSiteUninitialized; + +// Helper routine which determines the logging info for a particalur VLOG site. +// site_flag is the address of the site-local pointer to the controlling +// verbosity level +// site_default is the default to use for *site_flag +// fname is the current source file name +// verbose_level is the argument to VLOG_IS_ON +// We will return the return value for VLOG_IS_ON +// and if possible set *site_flag appropriately. +extern GOOGLE_GLOG_DLL_DECL bool InitVLOG3__( + @ac_google_namespace@::int32** site_flag, + @ac_google_namespace@::int32* site_default, + const char* fname, + @ac_google_namespace@::int32 verbose_level); + +#endif // BASE_VLOG_IS_ON_H_ diff --git a/spotify/breakpad/third_party/glog/src/googletest.h b/spotify/breakpad/third_party/glog/src/googletest.h new file mode 100644 index 000000000..c9e413e19 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/googletest.h @@ -0,0 +1,604 @@ +// Copyright (c) 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Shinichiro Hamaji +// (based on googletest: http://code.google.com/p/googletest/) + +#ifdef GOOGLETEST_H__ +#error You must not include this file twice. +#endif +#define GOOGLETEST_H__ + +#include "utilities.h" + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#include "base/commandlineflags.h" + +using std::map; +using std::string; +using std::vector; + +_START_GOOGLE_NAMESPACE_ + +extern GOOGLE_GLOG_DLL_DECL void (*g_logging_fail_func)(); + +_END_GOOGLE_NAMESPACE_ + +#undef GOOGLE_GLOG_DLL_DECL +#define GOOGLE_GLOG_DLL_DECL + +static inline string GetTempDir() { +#ifndef OS_WINDOWS + return "/tmp"; +#else + char tmp[MAX_PATH]; + GetTempPathA(MAX_PATH, tmp); + return tmp; +#endif +} + +#ifdef OS_WINDOWS +// The test will run in glog/vsproject/ +// (e.g., glog/vsproject/logging_unittest). +static const char TEST_SRC_DIR[] = "../.."; +#elif !defined(TEST_SRC_DIR) +# warning TEST_SRC_DIR should be defined in config.h +static const char TEST_SRC_DIR[] = "."; +#endif + +DEFINE_string(test_tmpdir, GetTempDir(), "Dir we use for temp files"); +DEFINE_string(test_srcdir, TEST_SRC_DIR, + "Source-dir root, needed to find glog_unittest_flagfile"); +DEFINE_bool(run_benchmark, false, "If true, run benchmarks"); +#ifdef NDEBUG +DEFINE_int32(benchmark_iters, 100000000, "Number of iterations per benchmark"); +#else +DEFINE_int32(benchmark_iters, 100000, "Number of iterations per benchmark"); +#endif + +#ifdef HAVE_LIB_GTEST +# include +// Use our ASSERT_DEATH implementation. +# undef ASSERT_DEATH +# undef ASSERT_DEBUG_DEATH +using testing::InitGoogleTest; +#else + +_START_GOOGLE_NAMESPACE_ + +void InitGoogleTest(int* argc, char** argv) {} + +// The following is some bare-bones testing infrastructure + +#define EXPECT_TRUE(cond) \ + do { \ + if (!(cond)) { \ + fprintf(stderr, "Check failed: %s\n", #cond); \ + exit(1); \ + } \ + } while (0) + +#define EXPECT_FALSE(cond) EXPECT_TRUE(!(cond)) + +#define EXPECT_OP(op, val1, val2) \ + do { \ + if (!((val1) op (val2))) { \ + fprintf(stderr, "Check failed: %s %s %s\n", #val1, #op, #val2); \ + exit(1); \ + } \ + } while (0) + +#define EXPECT_EQ(val1, val2) EXPECT_OP(==, val1, val2) +#define EXPECT_NE(val1, val2) EXPECT_OP(!=, val1, val2) +#define EXPECT_GT(val1, val2) EXPECT_OP(>, val1, val2) +#define EXPECT_LT(val1, val2) EXPECT_OP(<, val1, val2) + +#define EXPECT_NAN(arg) \ + do { \ + if (!isnan(arg)) { \ + fprintf(stderr, "Check failed: isnan(%s)\n", #arg); \ + exit(1); \ + } \ + } while (0) + +#define EXPECT_INF(arg) \ + do { \ + if (!isinf(arg)) { \ + fprintf(stderr, "Check failed: isinf(%s)\n", #arg); \ + exit(1); \ + } \ + } while (0) + +#define EXPECT_DOUBLE_EQ(val1, val2) \ + do { \ + if (((val1) < (val2) - 0.001 || (val1) > (val2) + 0.001)) { \ + fprintf(stderr, "Check failed: %s == %s\n", #val1, #val2); \ + exit(1); \ + } \ + } while (0) + +#define EXPECT_STREQ(val1, val2) \ + do { \ + if (strcmp((val1), (val2)) != 0) { \ + fprintf(stderr, "Check failed: streq(%s, %s)\n", #val1, #val2); \ + exit(1); \ + } \ + } while (0) + +vector g_testlist; // the tests to run + +#define TEST(a, b) \ + struct Test_##a##_##b { \ + Test_##a##_##b() { g_testlist.push_back(&Run); } \ + static void Run() { FlagSaver fs; RunTest(); } \ + static void RunTest(); \ + }; \ + static Test_##a##_##b g_test_##a##_##b; \ + void Test_##a##_##b::RunTest() + + +static inline int RUN_ALL_TESTS() { + vector::const_iterator it; + for (it = g_testlist.begin(); it != g_testlist.end(); ++it) { + (*it)(); + } + fprintf(stderr, "Passed %d tests\n\nPASS\n", (int)g_testlist.size()); + return 0; +} + +_END_GOOGLE_NAMESPACE_ + +#endif // ! HAVE_LIB_GTEST + +_START_GOOGLE_NAMESPACE_ + +static bool g_called_abort; +static jmp_buf g_jmp_buf; +static inline void CalledAbort() { + g_called_abort = true; + longjmp(g_jmp_buf, 1); +} + +#ifdef OS_WINDOWS +// TODO(hamaji): Death test somehow doesn't work in Windows. +#define ASSERT_DEATH(fn, msg) +#else +#define ASSERT_DEATH(fn, msg) \ + do { \ + g_called_abort = false; \ + /* in logging.cc */ \ + void (*original_logging_fail_func)() = g_logging_fail_func; \ + g_logging_fail_func = &CalledAbort; \ + if (!setjmp(g_jmp_buf)) fn; \ + /* set back to their default */ \ + g_logging_fail_func = original_logging_fail_func; \ + if (!g_called_abort) { \ + fprintf(stderr, "Function didn't die (%s): %s\n", msg, #fn); \ + exit(1); \ + } \ + } while (0) +#endif + +#ifdef NDEBUG +#define ASSERT_DEBUG_DEATH(fn, msg) +#else +#define ASSERT_DEBUG_DEATH(fn, msg) ASSERT_DEATH(fn, msg) +#endif // NDEBUG + +// Benchmark tools. + +#define BENCHMARK(n) static BenchmarkRegisterer __benchmark_ ## n (#n, &n); + +map g_benchlist; // the benchmarks to run + +class BenchmarkRegisterer { + public: + BenchmarkRegisterer(const char* name, void (*function)(int iters)) { + EXPECT_TRUE(g_benchlist.insert(std::make_pair(name, function)).second); + } +}; + +static inline void RunSpecifiedBenchmarks() { + if (!FLAGS_run_benchmark) { + return; + } + + int iter_cnt = FLAGS_benchmark_iters; + puts("Benchmark\tTime(ns)\tIterations"); + for (map::const_iterator iter = g_benchlist.begin(); + iter != g_benchlist.end(); + ++iter) { + clock_t start = clock(); + iter->second(iter_cnt); + double elapsed_ns = + ((double)clock() - start) / CLOCKS_PER_SEC * 1000*1000*1000; + printf("%s\t%8.2lf\t%10d\n", + iter->first.c_str(), elapsed_ns / iter_cnt, iter_cnt); + } + puts(""); +} + +// ---------------------------------------------------------------------- +// Golden file functions +// ---------------------------------------------------------------------- + +class CapturedStream { + public: + CapturedStream(int fd, const string & filename) : + fd_(fd), + uncaptured_fd_(-1), + filename_(filename) { + Capture(); + } + + ~CapturedStream() { + if (uncaptured_fd_ != -1) { + CHECK(close(uncaptured_fd_) != -1); + } + } + + // Start redirecting output to a file + void Capture() { + // Keep original stream for later + CHECK(uncaptured_fd_ == -1) << ", Stream " << fd_ << " already captured!"; + uncaptured_fd_ = dup(fd_); + CHECK(uncaptured_fd_ != -1); + + // Open file to save stream to + int cap_fd = open(filename_.c_str(), + O_CREAT | O_TRUNC | O_WRONLY, + S_IRUSR | S_IWUSR); + CHECK(cap_fd != -1); + + // Send stdout/stderr to this file + fflush(NULL); + CHECK(dup2(cap_fd, fd_) != -1); + CHECK(close(cap_fd) != -1); + } + + // Remove output redirection + void StopCapture() { + // Restore original stream + if (uncaptured_fd_ != -1) { + fflush(NULL); + CHECK(dup2(uncaptured_fd_, fd_) != -1); + } + } + + const string & filename() const { return filename_; } + + private: + int fd_; // file descriptor being captured + int uncaptured_fd_; // where the stream was originally being sent to + string filename_; // file where stream is being saved +}; +static CapturedStream * s_captured_streams[STDERR_FILENO+1]; +// Redirect a file descriptor to a file. +// fd - Should be STDOUT_FILENO or STDERR_FILENO +// filename - File where output should be stored +static inline void CaptureTestOutput(int fd, const string & filename) { + CHECK((fd == STDOUT_FILENO) || (fd == STDERR_FILENO)); + CHECK(s_captured_streams[fd] == NULL); + s_captured_streams[fd] = new CapturedStream(fd, filename); +} +static inline void CaptureTestStderr() { + CaptureTestOutput(STDERR_FILENO, FLAGS_test_tmpdir + "/captured.err"); +} +// Return the size (in bytes) of a file +static inline size_t GetFileSize(FILE * file) { + fseek(file, 0, SEEK_END); + return static_cast(ftell(file)); +} +// Read the entire content of a file as a string +static inline string ReadEntireFile(FILE * file) { + const size_t file_size = GetFileSize(file); + char * const buffer = new char[file_size]; + + size_t bytes_last_read = 0; // # of bytes read in the last fread() + size_t bytes_read = 0; // # of bytes read so far + + fseek(file, 0, SEEK_SET); + + // Keep reading the file until we cannot read further or the + // pre-determined file size is reached. + do { + bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); + bytes_read += bytes_last_read; + } while (bytes_last_read > 0 && bytes_read < file_size); + + const string content = string(buffer, buffer+bytes_read); + delete[] buffer; + + return content; +} +// Get the captured stdout (when fd is STDOUT_FILENO) or stderr (when +// fd is STDERR_FILENO) as a string +static inline string GetCapturedTestOutput(int fd) { + CHECK(fd == STDOUT_FILENO || fd == STDERR_FILENO); + CapturedStream * const cap = s_captured_streams[fd]; + CHECK(cap) + << ": did you forget CaptureTestStdout() or CaptureTestStderr()?"; + + // Make sure everything is flushed. + cap->StopCapture(); + + // Read the captured file. + FILE * const file = fopen(cap->filename().c_str(), "r"); + const string content = ReadEntireFile(file); + fclose(file); + + delete cap; + s_captured_streams[fd] = NULL; + + return content; +} +// Get the captured stderr of a test as a string. +static inline string GetCapturedTestStderr() { + return GetCapturedTestOutput(STDERR_FILENO); +} + +// Check if the string is [IWEF](\d{4}|DATE) +static inline bool IsLoggingPrefix(const string& s) { + if (s.size() != 5) return false; + if (!strchr("IWEF", s[0])) return false; + for (int i = 1; i <= 4; ++i) { + if (!isdigit(s[i]) && s[i] != "DATE"[i-1]) return false; + } + return true; +} + +// Convert log output into normalized form. +// +// Example: +// I0102 030405 logging_unittest.cc:345] RAW: vlog -1 +// => IDATE TIME__ logging_unittest.cc:LINE] RAW: vlog -1 +static inline string MungeLine(const string& line) { + std::istringstream iss(line); + string before, logcode_date, time, thread_lineinfo; + iss >> logcode_date; + while (!IsLoggingPrefix(logcode_date)) { + before += " " + logcode_date; + if (!(iss >> logcode_date)) { + // We cannot find the header of log output. + return before; + } + } + if (!before.empty()) before += " "; + iss >> time; + iss >> thread_lineinfo; + CHECK(!thread_lineinfo.empty()); + if (thread_lineinfo[thread_lineinfo.size() - 1] != ']') { + // We found thread ID. + string tmp; + iss >> tmp; + CHECK(!tmp.empty()); + CHECK_EQ(']', tmp[tmp.size() - 1]); + thread_lineinfo = "THREADID " + tmp; + } + size_t index = thread_lineinfo.find(':'); + CHECK_NE(string::npos, index); + thread_lineinfo = thread_lineinfo.substr(0, index+1) + "LINE]"; + string rest; + std::getline(iss, rest); + return (before + logcode_date[0] + "DATE TIME__ " + thread_lineinfo + + MungeLine(rest)); +} + +static inline void StringReplace(string* str, + const string& oldsub, + const string& newsub) { + size_t pos = str->find(oldsub); + if (pos != string::npos) { + str->replace(pos, oldsub.size(), newsub.c_str()); + } +} + +static inline string Munge(const string& filename) { + FILE* fp = fopen(filename.c_str(), "rb"); + CHECK(fp != NULL) << filename << ": couldn't open"; + char buf[4096]; + string result; + while (fgets(buf, 4095, fp)) { + string line = MungeLine(buf); + char null_str[256]; + sprintf(null_str, "%p", static_cast(NULL)); + StringReplace(&line, "__NULLP__", null_str); + // Remove 0x prefix produced by %p. VC++ doesn't put the prefix. + StringReplace(&line, " 0x", " "); + + char errmsg_buf[100]; + posix_strerror_r(0, errmsg_buf, sizeof(errmsg_buf)); + if (*errmsg_buf == '\0') { + // MacOSX 10.4 and FreeBSD return empty string for errno=0. + // In such case, the we need to remove an extra space. + StringReplace(&line, "__SUCCESS__ ", ""); + } else { + StringReplace(&line, "__SUCCESS__", errmsg_buf); + } + StringReplace(&line, "__ENOENT__", strerror(ENOENT)); + StringReplace(&line, "__EINTR__", strerror(EINTR)); + StringReplace(&line, "__ENXIO__", strerror(ENXIO)); + StringReplace(&line, "__ENOEXEC__", strerror(ENOEXEC)); + result += line + "\n"; + } + fclose(fp); + return result; +} + +static inline void WriteToFile(const string& body, const string& file) { + FILE* fp = fopen(file.c_str(), "wb"); + fwrite(body.data(), 1, body.size(), fp); + fclose(fp); +} + +static inline bool MungeAndDiffTestStderr(const string& golden_filename) { + CapturedStream* cap = s_captured_streams[STDERR_FILENO]; + CHECK(cap) << ": did you forget CaptureTestStderr()?"; + + cap->StopCapture(); + + // Run munge + const string captured = Munge(cap->filename()); + const string golden = Munge(golden_filename); + if (captured != golden) { + fprintf(stderr, + "Test with golden file failed. We'll try to show the diff:\n"); + string munged_golden = golden_filename + ".munged"; + WriteToFile(golden, munged_golden); + string munged_captured = cap->filename() + ".munged"; + WriteToFile(captured, munged_captured); + string diffcmd("diff -u " + munged_golden + " " + munged_captured); + if (system(diffcmd.c_str()) != 0) { + fprintf(stderr, "diff command was failed.\n"); + } + unlink(munged_golden.c_str()); + unlink(munged_captured.c_str()); + return false; + } + LOG(INFO) << "Diff was successful"; + return true; +} + +// Save flags used from logging_unittest.cc. +#ifndef HAVE_LIB_GFLAGS +struct FlagSaver { + FlagSaver() + : v_(FLAGS_v), + stderrthreshold_(FLAGS_stderrthreshold), + logtostderr_(FLAGS_logtostderr), + alsologtostderr_(FLAGS_alsologtostderr) {} + ~FlagSaver() { + FLAGS_v = v_; + FLAGS_stderrthreshold = stderrthreshold_; + FLAGS_logtostderr = logtostderr_; + FLAGS_alsologtostderr = alsologtostderr_; + } + int v_; + int stderrthreshold_; + bool logtostderr_; + bool alsologtostderr_; +}; +#endif + +class Thread { + public: + virtual ~Thread() {} + + void SetJoinable(bool joinable) {} +#if defined(OS_WINDOWS) || defined(OS_CYGWIN) + void Start() { + handle_ = CreateThread(NULL, + 0, + (LPTHREAD_START_ROUTINE)&Thread::InvokeThread, + (LPVOID)this, + 0, + &th_); + CHECK(handle_) << "CreateThread"; + } + void Join() { + WaitForSingleObject(handle_, INFINITE); + } +#elif defined(HAVE_PTHREAD) + void Start() { + pthread_create(&th_, NULL, &Thread::InvokeThread, this); + } + void Join() { + pthread_join(th_, NULL); + } +#else +# error No thread implementation. +#endif + + protected: + virtual void Run() = 0; + + private: + static void* InvokeThread(void* self) { + ((Thread*)self)->Run(); + return NULL; + } + +#if defined(OS_WINDOWS) || defined(OS_CYGWIN) + HANDLE handle_; + DWORD th_; +#else + pthread_t th_; +#endif +}; + +static inline void SleepForMilliseconds(int t) { +#ifndef OS_WINDOWS + usleep(t * 1000); +#else + Sleep(t); +#endif +} + +// Add hook for operator new to ensure there are no memory allocation. + +void (*g_new_hook)() = NULL; + +_END_GOOGLE_NAMESPACE_ + +void* operator new(size_t size) { + if (GOOGLE_NAMESPACE::g_new_hook) { + GOOGLE_NAMESPACE::g_new_hook(); + } + return malloc(size); +} + +void* operator new[](size_t size) { + return ::operator new(size); +} + +void operator delete(void* p) { + free(p); +} + +void operator delete[](void* p) { + ::operator delete(p); +} diff --git a/spotify/breakpad/third_party/glog/src/logging.cc b/spotify/breakpad/third_party/glog/src/logging.cc new file mode 100644 index 000000000..445d9f9e0 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/logging.cc @@ -0,0 +1,1808 @@ +// Copyright (c) 1999, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#define _GNU_SOURCE 1 // needed for O_NOFOLLOW and pread()/pwrite() + +#include "utilities.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include // For _exit. +#endif +#include +#include +#include +#ifdef HAVE_SYS_UTSNAME_H +# include // For uname. +#endif +#include +#include +#include +#include +#include +#ifdef HAVE_PWD_H +# include +#endif +#ifdef HAVE_SYSLOG_H +# include +#endif +#include +#include // for errno +#include +#include "base/commandlineflags.h" // to get the program name +#include "glog/logging.h" +#include "glog/raw_logging.h" +#include "base/googleinit.h" + +#ifdef HAVE_STACKTRACE +# include "stacktrace.h" +#endif + +using std::string; +using std::vector; +using std::ostrstream; +using std::setw; +using std::setfill; +using std::hex; +using std::dec; +using std::min; +using std::ostream; +using std::ostringstream; +using std::strstream; + +// There is no thread annotation support. +#define EXCLUSIVE_LOCKS_REQUIRED(mu) + +static bool BoolFromEnv(const char *varname, bool defval) { + const char* const valstr = getenv(varname); + if (!valstr) { + return defval; + } + return memchr("tTyY1\0", valstr[0], 6) != NULL; +} + +GLOG_DEFINE_bool(logtostderr, BoolFromEnv("GOOGLE_LOGTOSTDERR", false), + "log messages go to stderr instead of logfiles"); +GLOG_DEFINE_bool(alsologtostderr, BoolFromEnv("GOOGLE_ALSOLOGTOSTDERR", false), + "log messages go to stderr in addition to logfiles"); +#ifdef OS_LINUX +GLOG_DEFINE_bool(drop_log_memory, true, "Drop in-memory buffers of log contents. " + "Logs can grow very quickly and they are rarely read before they " + "need to be evicted from memory. Instead, drop them from memory " + "as soon as they are flushed to disk."); +_START_GOOGLE_NAMESPACE_ +namespace logging { +static const int64 kPageSize = getpagesize(); +} +_END_GOOGLE_NAMESPACE_ +#endif + +// By default, errors (including fatal errors) get logged to stderr as +// well as the file. +// +// The default is ERROR instead of FATAL so that users can see problems +// when they run a program without having to look in another file. +DEFINE_int32(stderrthreshold, + GOOGLE_NAMESPACE::ERROR, + "log messages at or above this level are copied to stderr in " + "addition to logfiles. This flag obsoletes --alsologtostderr."); + +GLOG_DEFINE_string(alsologtoemail, "", + "log messages go to these email addresses " + "in addition to logfiles"); +GLOG_DEFINE_bool(log_prefix, true, + "Prepend the log prefix to the start of each log line"); +GLOG_DEFINE_int32(minloglevel, 0, "Messages logged at a lower level than this don't " + "actually get logged anywhere"); +GLOG_DEFINE_int32(logbuflevel, 0, + "Buffer log messages logged at this level or lower" + " (-1 means don't buffer; 0 means buffer INFO only;" + " ...)"); +GLOG_DEFINE_int32(logbufsecs, 30, + "Buffer log messages for at most this many seconds"); +GLOG_DEFINE_int32(logemaillevel, 999, + "Email log messages logged at this level or higher" + " (0 means email all; 3 means email FATAL only;" + " ...)"); +GLOG_DEFINE_string(logmailer, "/bin/mail", + "Mailer used to send logging email"); + +// Compute the default value for --log_dir +static const char* DefaultLogDir() { + const char* env; + env = getenv("GOOGLE_LOG_DIR"); + if (env != NULL && env[0] != '\0') { + return env; + } + env = getenv("TEST_TMPDIR"); + if (env != NULL && env[0] != '\0') { + return env; + } + return ""; +} + +GLOG_DEFINE_string(log_dir, DefaultLogDir(), + "If specified, logfiles are written into this directory instead " + "of the default logging directory."); +GLOG_DEFINE_string(log_link, "", "Put additional links to the log " + "files in this directory"); + +GLOG_DEFINE_int32(max_log_size, 1800, + "approx. maximum log file size (in MB). A value of 0 will " + "be silently overridden to 1."); + +GLOG_DEFINE_bool(stop_logging_if_full_disk, false, + "Stop attempting to log to disk if the disk is full."); + +GLOG_DEFINE_string(log_backtrace_at, "", + "Emit a backtrace when logging at file:linenum."); + +// TODO(hamaji): consider windows +#define PATH_SEPARATOR '/' + +static void GetHostName(string* hostname) { +#if defined(HAVE_SYS_UTSNAME_H) + struct utsname buf; + if (0 != uname(&buf)) { + // ensure null termination on failure + *buf.nodename = '\0'; + } + *hostname = buf.nodename; +#elif defined(OS_WINDOWS) + char buf[MAX_COMPUTERNAME_LENGTH + 1]; + DWORD len = MAX_COMPUTERNAME_LENGTH + 1; + if (GetComputerNameA(buf, &len)) { + *hostname = buf; + } else { + hostname->clear(); + } +#else +# warning There is no way to retrieve the host name. + *hostname = "(unknown)"; +#endif +} + +_START_GOOGLE_NAMESPACE_ + +// Safely get max_log_size, overriding to 1 if it somehow gets defined as 0 +static int32 MaxLogSize() { + return (FLAGS_max_log_size > 0 ? FLAGS_max_log_size : 1); +} + +// A mutex that allows only one thread to log at a time, to keep things from +// getting jumbled. Some other very uncommon logging operations (like +// changing the destination file for log messages of a given severity) also +// lock this mutex. Please be sure that anybody who might possibly need to +// lock it does so. +static Mutex log_mutex; + +// Number of messages sent at each severity. Under log_mutex. +int64 LogMessage::num_messages_[NUM_SEVERITIES] = {0, 0, 0, 0}; + +// Globally disable log writing (if disk is full) +static bool stop_writing = false; + +const char*const LogSeverityNames[NUM_SEVERITIES] = { + "INFO", "WARNING", "ERROR", "FATAL" +}; + +// Has the user called SetExitOnDFatal(true)? +static bool exit_on_dfatal = true; + +const char* GetLogSeverityName(LogSeverity severity) { + return LogSeverityNames[severity]; +} + +static bool SendEmailInternal(const char*dest, const char *subject, + const char*body, bool use_logging); + +base::Logger::~Logger() { +} + +namespace { + +// Encapsulates all file-system related state +class LogFileObject : public base::Logger { + public: + LogFileObject(LogSeverity severity, const char* base_filename); + ~LogFileObject(); + + virtual void Write(bool force_flush, // Should we force a flush here? + time_t timestamp, // Timestamp for this entry + const char* message, + int message_len); + + // Configuration options + void SetBasename(const char* basename); + void SetExtension(const char* ext); + void SetSymlinkBasename(const char* symlink_basename); + + // Normal flushing routine + virtual void Flush(); + + // It is the actual file length for the system loggers, + // i.e., INFO, ERROR, etc. + virtual uint32 LogSize() { + MutexLock l(&lock_); + return file_length_; + } + + // Internal flush routine. Exposed so that FlushLogFilesUnsafe() + // can avoid grabbing a lock. Usually Flush() calls it after + // acquiring lock_. + void FlushUnlocked(); + + private: + static const uint32 kRolloverAttemptFrequency = 0x20; + + Mutex lock_; + bool base_filename_selected_; + string base_filename_; + string symlink_basename_; + string filename_extension_; // option users can specify (eg to add port#) + FILE* file_; + LogSeverity severity_; + uint32 bytes_since_flush_; + uint32 file_length_; + unsigned int rollover_attempt_; + int64 next_flush_time_; // cycle count at which to flush log + + // Actually create a logfile using the value of base_filename_ and the + // supplied argument time_pid_string + // REQUIRES: lock_ is held + bool CreateLogfile(const char* time_pid_string); +}; + +} // namespace + +class LogDestination { + public: + friend class LogMessage; + friend void ReprintFatalMessage(); + friend base::Logger* base::GetLogger(LogSeverity); + friend void base::SetLogger(LogSeverity, base::Logger*); + + // These methods are just forwarded to by their global versions. + static void SetLogDestination(LogSeverity severity, + const char* base_filename); + static void SetLogSymlink(LogSeverity severity, + const char* symlink_basename); + static void AddLogSink(LogSink *destination); + static void RemoveLogSink(LogSink *destination); + static void SetLogFilenameExtension(const char* filename_extension); + static void SetStderrLogging(LogSeverity min_severity); + static void SetEmailLogging(LogSeverity min_severity, const char* addresses); + static void LogToStderr(); + // Flush all log files that are at least at the given severity level + static void FlushLogFiles(int min_severity); + static void FlushLogFilesUnsafe(int min_severity); + + // we set the maximum size of our packet to be 1400, the logic being + // to prevent fragmentation. + // Really this number is arbitrary. + static const int kNetworkBytes = 1400; + + static const string& hostname(); + + static void DeleteLogDestinations(); + + private: + LogDestination(LogSeverity severity, const char* base_filename); + ~LogDestination() { } + + // Take a log message of a particular severity and log it to stderr + // iff it's of a high enough severity to deserve it. + static void MaybeLogToStderr(LogSeverity severity, const char* message, + size_t len); + + // Take a log message of a particular severity and log it to email + // iff it's of a high enough severity to deserve it. + static void MaybeLogToEmail(LogSeverity severity, const char* message, + size_t len); + // Take a log message of a particular severity and log it to a file + // iff the base filename is not "" (which means "don't log to me") + static void MaybeLogToLogfile(LogSeverity severity, + time_t timestamp, + const char* message, size_t len); + // Take a log message of a particular severity and log it to the file + // for that severity and also for all files with severity less than + // this severity. + static void LogToAllLogfiles(LogSeverity severity, + time_t timestamp, + const char* message, size_t len); + + // Send logging info to all registered sinks. + static void LogToSinks(LogSeverity severity, + const char *full_filename, + const char *base_filename, + int line, + const struct ::tm* tm_time, + const char* message, + size_t message_len); + + // Wait for all registered sinks via WaitTillSent + // including the optional one in "data". + static void WaitForSinks(LogMessage::LogMessageData* data); + + static LogDestination* log_destination(LogSeverity severity); + + LogFileObject fileobject_; + base::Logger* logger_; // Either &fileobject_, or wrapper around it + + static LogDestination* log_destinations_[NUM_SEVERITIES]; + static LogSeverity email_logging_severity_; + static string addresses_; + static string hostname_; + + // arbitrary global logging destinations. + static vector* sinks_; + + // Protects the vector sinks_, + // but not the LogSink objects its elements reference. + static Mutex sink_mutex_; + + // Disallow + LogDestination(const LogDestination&); + LogDestination& operator=(const LogDestination&); +}; + +// Errors do not get logged to email by default. +LogSeverity LogDestination::email_logging_severity_ = 99999; + +string LogDestination::addresses_; +string LogDestination::hostname_; + +vector* LogDestination::sinks_ = NULL; +Mutex LogDestination::sink_mutex_; + +/* static */ +const string& LogDestination::hostname() { + if (hostname_.empty()) { + GetHostName(&hostname_); + if (hostname_.empty()) { + hostname_ = "(unknown)"; + } + } + return hostname_; +} + +LogDestination::LogDestination(LogSeverity severity, + const char* base_filename) + : fileobject_(severity, base_filename), + logger_(&fileobject_) { +} + +inline void LogDestination::FlushLogFilesUnsafe(int min_severity) { + // assume we have the log_mutex or we simply don't care + // about it + for (int i = min_severity; i < NUM_SEVERITIES; i++) { + LogDestination* log = log_destination(i); + if (log != NULL) { + // Flush the base fileobject_ logger directly instead of going + // through any wrappers to reduce chance of deadlock. + log->fileobject_.FlushUnlocked(); + } + } +} + +inline void LogDestination::FlushLogFiles(int min_severity) { + // Prevent any subtle race conditions by wrapping a mutex lock around + // all this stuff. + MutexLock l(&log_mutex); + for (int i = min_severity; i < NUM_SEVERITIES; i++) { + LogDestination* log = log_destination(i); + if (log != NULL) { + log->logger_->Flush(); + } + } +} + +inline void LogDestination::SetLogDestination(LogSeverity severity, + const char* base_filename) { + assert(severity >= 0 && severity < NUM_SEVERITIES); + // Prevent any subtle race conditions by wrapping a mutex lock around + // all this stuff. + MutexLock l(&log_mutex); + log_destination(severity)->fileobject_.SetBasename(base_filename); +} + +inline void LogDestination::SetLogSymlink(LogSeverity severity, + const char* symlink_basename) { + CHECK_GE(severity, 0); + CHECK_LT(severity, NUM_SEVERITIES); + MutexLock l(&log_mutex); + log_destination(severity)->fileobject_.SetSymlinkBasename(symlink_basename); +} + +inline void LogDestination::AddLogSink(LogSink *destination) { + // Prevent any subtle race conditions by wrapping a mutex lock around + // all this stuff. + MutexLock l(&sink_mutex_); + if (!sinks_) sinks_ = new vector; + sinks_->push_back(destination); +} + +inline void LogDestination::RemoveLogSink(LogSink *destination) { + // Prevent any subtle race conditions by wrapping a mutex lock around + // all this stuff. + MutexLock l(&sink_mutex_); + // This doesn't keep the sinks in order, but who cares? + if (sinks_) { + for (int i = sinks_->size() - 1; i >= 0; i--) { + if ((*sinks_)[i] == destination) { + (*sinks_)[i] = (*sinks_)[sinks_->size() - 1]; + sinks_->pop_back(); + break; + } + } + } +} + +inline void LogDestination::SetLogFilenameExtension(const char* ext) { + // Prevent any subtle race conditions by wrapping a mutex lock around + // all this stuff. + MutexLock l(&log_mutex); + for ( int severity = 0; severity < NUM_SEVERITIES; ++severity ) { + log_destination(severity)->fileobject_.SetExtension(ext); + } +} + +inline void LogDestination::SetStderrLogging(LogSeverity min_severity) { + assert(min_severity >= 0 && min_severity < NUM_SEVERITIES); + // Prevent any subtle race conditions by wrapping a mutex lock around + // all this stuff. + MutexLock l(&log_mutex); + FLAGS_stderrthreshold = min_severity; +} + +inline void LogDestination::LogToStderr() { + // *Don't* put this stuff in a mutex lock, since SetStderrLogging & + // SetLogDestination already do the locking! + SetStderrLogging(0); // thus everything is "also" logged to stderr + for ( int i = 0; i < NUM_SEVERITIES; ++i ) { + SetLogDestination(i, ""); // "" turns off logging to a logfile + } +} + +inline void LogDestination::SetEmailLogging(LogSeverity min_severity, + const char* addresses) { + assert(min_severity >= 0 && min_severity < NUM_SEVERITIES); + // Prevent any subtle race conditions by wrapping a mutex lock around + // all this stuff. + MutexLock l(&log_mutex); + LogDestination::email_logging_severity_ = min_severity; + LogDestination::addresses_ = addresses; +} + +static void WriteToStderr(const char* message, size_t len) { + // Avoid using cerr from this module since we may get called during + // exit code, and cerr may be partially or fully destroyed by then. + fwrite(message, len, 1, stderr); +} + +inline void LogDestination::MaybeLogToStderr(LogSeverity severity, + const char* message, size_t len) { + if ((severity >= FLAGS_stderrthreshold) || FLAGS_alsologtostderr) { + WriteToStderr(message, len); +#ifdef OS_WINDOWS + // On Windows, also output to the debugger + ::OutputDebugStringA(string(message,len).c_str()); +#endif + } +} + + +inline void LogDestination::MaybeLogToEmail(LogSeverity severity, + const char* message, size_t len) { + if (severity >= email_logging_severity_ || + severity >= FLAGS_logemaillevel) { + string to(FLAGS_alsologtoemail); + if (!addresses_.empty()) { + if (!to.empty()) { + to += ","; + } + to += addresses_; + } + const string subject(string("[LOG] ") + LogSeverityNames[severity] + ": " + + glog_internal_namespace_::ProgramInvocationShortName()); + string body(hostname()); + body += "\n\n"; + body.append(message, len); + + // should NOT use SendEmail(). The caller of this function holds the + // log_mutex and SendEmail() calls LOG/VLOG which will block trying to + // acquire the log_mutex object. Use SendEmailInternal() and set + // use_logging to false. + SendEmailInternal(to.c_str(), subject.c_str(), body.c_str(), false); + } +} + + +inline void LogDestination::MaybeLogToLogfile(LogSeverity severity, + time_t timestamp, + const char* message, + size_t len) { + const bool should_flush = severity > FLAGS_logbuflevel; + LogDestination* destination = log_destination(severity); + destination->logger_->Write(should_flush, timestamp, message, len); +} + +inline void LogDestination::LogToAllLogfiles(LogSeverity severity, + time_t timestamp, + const char* message, + size_t len) { + + if ( FLAGS_logtostderr ) // global flag: never log to file + WriteToStderr(message, len); + else + for (int i = severity; i >= 0; --i) + LogDestination::MaybeLogToLogfile(i, timestamp, message, len); + +} + +inline void LogDestination::LogToSinks(LogSeverity severity, + const char *full_filename, + const char *base_filename, + int line, + const struct ::tm* tm_time, + const char* message, + size_t message_len) { + ReaderMutexLock l(&sink_mutex_); + if (sinks_) { + for (int i = sinks_->size() - 1; i >= 0; i--) { + (*sinks_)[i]->send(severity, full_filename, base_filename, + line, tm_time, message, message_len); + } + } +} + +inline void LogDestination::WaitForSinks(LogMessage::LogMessageData* data) { + ReaderMutexLock l(&sink_mutex_); + if (sinks_) { + for (int i = sinks_->size() - 1; i >= 0; i--) { + (*sinks_)[i]->WaitTillSent(); + } + } + const bool send_to_sink = + (data->send_method_ == &LogMessage::SendToSink) || + (data->send_method_ == &LogMessage::SendToSinkAndLog); + if (send_to_sink && data->sink_ != NULL) { + data->sink_->WaitTillSent(); + } +} + +LogDestination* LogDestination::log_destinations_[NUM_SEVERITIES]; + +inline LogDestination* LogDestination::log_destination(LogSeverity severity) { + assert(severity >=0 && severity < NUM_SEVERITIES); + if (!log_destinations_[severity]) { + log_destinations_[severity] = new LogDestination(severity, NULL); + } + return log_destinations_[severity]; +} + +void LogDestination::DeleteLogDestinations() { + for (int severity = 0; severity < NUM_SEVERITIES; ++severity) { + delete log_destinations_[severity]; + log_destinations_[severity] = NULL; + } +} + +namespace { + +LogFileObject::LogFileObject(LogSeverity severity, + const char* base_filename) + : base_filename_selected_(base_filename != NULL), + base_filename_((base_filename != NULL) ? base_filename : ""), + symlink_basename_(glog_internal_namespace_::ProgramInvocationShortName()), + filename_extension_(), + file_(NULL), + severity_(severity), + bytes_since_flush_(0), + file_length_(0), + rollover_attempt_(kRolloverAttemptFrequency-1), + next_flush_time_(0) { + assert(severity >= 0); + assert(severity < NUM_SEVERITIES); +} + +LogFileObject::~LogFileObject() { + MutexLock l(&lock_); + if (file_ != NULL) { + fclose(file_); + file_ = NULL; + } +} + +void LogFileObject::SetBasename(const char* basename) { + MutexLock l(&lock_); + base_filename_selected_ = true; + if (base_filename_ != basename) { + // Get rid of old log file since we are changing names + if (file_ != NULL) { + fclose(file_); + file_ = NULL; + rollover_attempt_ = kRolloverAttemptFrequency-1; + } + base_filename_ = basename; + } +} + +void LogFileObject::SetExtension(const char* ext) { + MutexLock l(&lock_); + if (filename_extension_ != ext) { + // Get rid of old log file since we are changing names + if (file_ != NULL) { + fclose(file_); + file_ = NULL; + rollover_attempt_ = kRolloverAttemptFrequency-1; + } + filename_extension_ = ext; + } +} + +void LogFileObject::SetSymlinkBasename(const char* symlink_basename) { + MutexLock l(&lock_); + symlink_basename_ = symlink_basename; +} + +void LogFileObject::Flush() { + MutexLock l(&lock_); + FlushUnlocked(); +} + +void LogFileObject::FlushUnlocked(){ + if (file_ != NULL) { + fflush(file_); + bytes_since_flush_ = 0; + } + // Figure out when we are due for another flush. + const int64 next = (FLAGS_logbufsecs + * static_cast(1000000)); // in usec + next_flush_time_ = CycleClock_Now() + UsecToCycles(next); +} + +bool LogFileObject::CreateLogfile(const char* time_pid_string) { + string string_filename = base_filename_+filename_extension_+ + time_pid_string; + const char* filename = string_filename.c_str(); + int fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0664); + if (fd == -1) return false; +#ifdef HAVE_FCNTL + // Mark the file close-on-exec. We don't really care if this fails + fcntl(fd, F_SETFD, FD_CLOEXEC); +#endif + + file_ = fdopen(fd, "a"); // Make a FILE*. + if (file_ == NULL) { // Man, we're screwed! + close(fd); + unlink(filename); // Erase the half-baked evidence: an unusable log file + return false; + } + + // We try to create a symlink called ., + // which is easier to use. (Every time we create a new logfile, + // we destroy the old symlink and create a new one, so it always + // points to the latest logfile.) If it fails, we're sad but it's + // no error. + if (!symlink_basename_.empty()) { + // take directory from filename + const char* slash = strrchr(filename, PATH_SEPARATOR); + const string linkname = + symlink_basename_ + '.' + LogSeverityNames[severity_]; + string linkpath; + if ( slash ) linkpath = string(filename, slash-filename+1); // get dirname + linkpath += linkname; + unlink(linkpath.c_str()); // delete old one if it exists + + // We must have unistd.h. +#ifdef HAVE_UNISTD_H + // Make the symlink be relative (in the same dir) so that if the + // entire log directory gets relocated the link is still valid. + const char *linkdest = slash ? (slash + 1) : filename; + if (symlink(linkdest, linkpath.c_str()) != 0) { + // silently ignore failures + } + + // Make an additional link to the log file in a place specified by + // FLAGS_log_link, if indicated + if (!FLAGS_log_link.empty()) { + linkpath = FLAGS_log_link + "/" + linkname; + unlink(linkpath.c_str()); // delete old one if it exists + if (symlink(filename, linkpath.c_str()) != 0) { + // silently ignore failures + } + } +#endif + } + + return true; // Everything worked +} + +void LogFileObject::Write(bool force_flush, + time_t timestamp, + const char* message, + int message_len) { + MutexLock l(&lock_); + + // We don't log if the base_name_ is "" (which means "don't write") + if (base_filename_selected_ && base_filename_.empty()) { + return; + } + + if (static_cast(file_length_ >> 20) >= MaxLogSize() || + PidHasChanged()) { + if (file_ != NULL) fclose(file_); + file_ = NULL; + file_length_ = bytes_since_flush_ = 0; + rollover_attempt_ = kRolloverAttemptFrequency-1; + } + + // If there's no destination file, make one before outputting + if (file_ == NULL) { + // Try to rollover the log file every 32 log messages. The only time + // this could matter would be when we have trouble creating the log + // file. If that happens, we'll lose lots of log messages, of course! + if (++rollover_attempt_ != kRolloverAttemptFrequency) return; + rollover_attempt_ = 0; + + struct ::tm tm_time; + localtime_r(×tamp, &tm_time); + + // The logfile's filename will have the date/time & pid in it + char time_pid_string[256]; // More than enough chars for time, pid, \0 + ostrstream time_pid_stream(time_pid_string, sizeof(time_pid_string)); + time_pid_stream.fill('0'); + time_pid_stream << 1900+tm_time.tm_year + << setw(2) << 1+tm_time.tm_mon + << setw(2) << tm_time.tm_mday + << '-' + << setw(2) << tm_time.tm_hour + << setw(2) << tm_time.tm_min + << setw(2) << tm_time.tm_sec + << '.' + << GetMainThreadPid() + << '\0'; + + if (base_filename_selected_) { + if (!CreateLogfile(time_pid_string)) { + perror("Could not create log file"); + fprintf(stderr, "COULD NOT CREATE LOGFILE '%s'!\n", time_pid_string); + return; + } + } else { + // If no base filename for logs of this severity has been set, use a + // default base filename of + // "...log..". So + // logfiles will have names like + // webserver.examplehost.root.log.INFO.19990817-150000.4354, where + // 19990817 is a date (1999 August 17), 150000 is a time (15:00:00), + // and 4354 is the pid of the logging process. The date & time reflect + // when the file was created for output. + // + // Where does the file get put? Successively try the directories + // "/tmp", and "." + string stripped_filename( + glog_internal_namespace_::ProgramInvocationShortName()); + string hostname; + GetHostName(&hostname); + + string uidname = MyUserName(); + // We should not call CHECK() here because this function can be + // called after holding on to log_mutex. We don't want to + // attempt to hold on to the same mutex, and get into a + // deadlock. Simply use a name like invalid-user. + if (uidname.empty()) uidname = "invalid-user"; + + stripped_filename = stripped_filename+'.'+hostname+'.' + +uidname+".log." + +LogSeverityNames[severity_]+'.'; + // We're going to (potentially) try to put logs in several different dirs + const vector & log_dirs = GetLoggingDirectories(); + + // Go through the list of dirs, and try to create the log file in each + // until we succeed or run out of options + bool success = false; + for (vector::const_iterator dir = log_dirs.begin(); + dir != log_dirs.end(); + ++dir) { + base_filename_ = *dir + "/" + stripped_filename; + if ( CreateLogfile(time_pid_string) ) { + success = true; + break; + } + } + // If we never succeeded, we have to give up + if ( success == false ) { + perror("Could not create logging file"); + fprintf(stderr, "COULD NOT CREATE A LOGGINGFILE %s!", time_pid_string); + return; + } + } + + // Write a header message into the log file + char file_header_string[512]; // Enough chars for time and binary info + ostrstream file_header_stream(file_header_string, + sizeof(file_header_string)); + file_header_stream.fill('0'); + file_header_stream << "Log file created at: " + << 1900+tm_time.tm_year << '/' + << setw(2) << 1+tm_time.tm_mon << '/' + << setw(2) << tm_time.tm_mday + << ' ' + << setw(2) << tm_time.tm_hour << ':' + << setw(2) << tm_time.tm_min << ':' + << setw(2) << tm_time.tm_sec << '\n' + << "Running on machine: " + << LogDestination::hostname() << '\n' + << "Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu " + << "threadid file:line] msg" << '\n' + << '\0'; + int header_len = strlen(file_header_string); + fwrite(file_header_string, 1, header_len, file_); + file_length_ += header_len; + bytes_since_flush_ += header_len; + } + + // Write to LOG file + if ( !stop_writing ) { + // fwrite() doesn't return an error when the disk is full, for + // messages that are less than 4096 bytes. When the disk is full, + // it returns the message length for messages that are less than + // 4096 bytes. fwrite() returns 4096 for message lengths that are + // greater than 4096, thereby indicating an error. + errno = 0; + fwrite(message, 1, message_len, file_); + if ( FLAGS_stop_logging_if_full_disk && + errno == ENOSPC ) { // disk full, stop writing to disk + stop_writing = true; // until the disk is + return; + } else { + file_length_ += message_len; + bytes_since_flush_ += message_len; + } + } else { + if ( CycleClock_Now() >= next_flush_time_ ) + stop_writing = false; // check to see if disk has free space. + return; // no need to flush + } + + // See important msgs *now*. Also, flush logs at least every 10^6 chars, + // or every "FLAGS_logbufsecs" seconds. + if ( force_flush || + (bytes_since_flush_ >= 1000000) || + (CycleClock_Now() >= next_flush_time_) ) { + FlushUnlocked(); +#ifdef OS_LINUX + if (FLAGS_drop_log_memory) { + if (file_length_ >= logging::kPageSize) { + // don't evict the most recent page + uint32 len = file_length_ & ~(logging::kPageSize - 1); + posix_fadvise(fileno(file_), 0, len, POSIX_FADV_DONTNEED); + } + } +#endif + } +} + +} // namespace + +// An arbitrary limit on the length of a single log message. This +// is so that streaming can be done more efficiently. +const size_t LogMessage::kMaxLogMessageLen = 30000; + +// Static log data space to avoid alloc failures in a LOG(FATAL) +// +// Since multiple threads may call LOG(FATAL), and we want to preserve +// the data from the first call, we allocate two sets of space. One +// for exclusive use by the first thread, and one for shared use by +// all other threads. +static Mutex fatal_msg_lock; +static CrashReason crash_reason; +static bool fatal_msg_exclusive = true; +static char fatal_msg_buf_exclusive[LogMessage::kMaxLogMessageLen+1]; +static char fatal_msg_buf_shared[LogMessage::kMaxLogMessageLen+1]; +static LogMessage::LogStream fatal_msg_stream_exclusive( + fatal_msg_buf_exclusive, LogMessage::kMaxLogMessageLen, 0); +static LogMessage::LogStream fatal_msg_stream_shared( + fatal_msg_buf_shared, LogMessage::kMaxLogMessageLen, 0); +LogMessage::LogMessageData LogMessage::fatal_msg_data_exclusive_; +LogMessage::LogMessageData LogMessage::fatal_msg_data_shared_; + +LogMessage::LogMessageData::~LogMessageData() { + delete[] buf_; + delete stream_alloc_; +} + +LogMessage::LogMessage(const char* file, int line, LogSeverity severity, + int ctr, void (LogMessage::*send_method)()) { + Init(file, line, severity, send_method); + data_->stream_->set_ctr(ctr); +} + +LogMessage::LogMessage(const char* file, int line, + const CheckOpString& result) { + Init(file, line, FATAL, &LogMessage::SendToLog); + stream() << "Check failed: " << (*result.str_) << " "; +} + +LogMessage::LogMessage(const char* file, int line) { + Init(file, line, INFO, &LogMessage::SendToLog); +} + +LogMessage::LogMessage(const char* file, int line, LogSeverity severity) { + Init(file, line, severity, &LogMessage::SendToLog); +} + +LogMessage::LogMessage(const char* file, int line, LogSeverity severity, + LogSink* sink, bool also_send_to_log) { + Init(file, line, severity, also_send_to_log ? &LogMessage::SendToSinkAndLog : + &LogMessage::SendToSink); + data_->sink_ = sink; // override Init()'s setting to NULL +} + +LogMessage::LogMessage(const char* file, int line, LogSeverity severity, + vector *outvec) { + Init(file, line, severity, &LogMessage::SaveOrSendToLog); + data_->outvec_ = outvec; // override Init()'s setting to NULL +} + +LogMessage::LogMessage(const char* file, int line, LogSeverity severity, + string *message) { + Init(file, line, severity, &LogMessage::WriteToStringAndLog); + data_->message_ = message; // override Init()'s setting to NULL +} + +void LogMessage::Init(const char* file, + int line, + LogSeverity severity, + void (LogMessage::*send_method)()) { + allocated_ = NULL; + if (severity != FATAL || !exit_on_dfatal) { + allocated_ = new LogMessageData(); + data_ = allocated_; + data_->buf_ = new char[kMaxLogMessageLen+1]; + data_->message_text_ = data_->buf_; + data_->stream_alloc_ = + new LogStream(data_->message_text_, kMaxLogMessageLen, 0); + data_->stream_ = data_->stream_alloc_; + data_->first_fatal_ = false; + } else { + MutexLock l(&fatal_msg_lock); + if (fatal_msg_exclusive) { + fatal_msg_exclusive = false; + data_ = &fatal_msg_data_exclusive_; + data_->message_text_ = fatal_msg_buf_exclusive; + data_->stream_ = &fatal_msg_stream_exclusive; + data_->first_fatal_ = true; + } else { + data_ = &fatal_msg_data_shared_; + data_->message_text_ = fatal_msg_buf_shared; + data_->stream_ = &fatal_msg_stream_shared; + data_->first_fatal_ = false; + } + data_->stream_alloc_ = NULL; + } + + stream().fill('0'); + data_->preserved_errno_ = errno; + data_->severity_ = severity; + data_->line_ = line; + data_->send_method_ = send_method; + data_->sink_ = NULL; + data_->outvec_ = NULL; + WallTime now = WallTime_Now(); + data_->timestamp_ = static_cast(now); + localtime_r(&data_->timestamp_, &data_->tm_time_); + int usecs = static_cast((now - data_->timestamp_) * 1000000); + RawLog__SetLastTime(data_->tm_time_, usecs); + + data_->num_chars_to_log_ = 0; + data_->num_chars_to_syslog_ = 0; + data_->basename_ = const_basename(file); + data_->fullname_ = file; + data_->has_been_flushed_ = false; + + // If specified, prepend a prefix to each line. For example: + // I1018 160715 f5d4fbb0 logging.cc:1153] + // (log level, GMT month, date, time, thread_id, file basename, line) + // We exclude the thread_id for the default thread. + if (FLAGS_log_prefix && (line != kNoLogPrefix)) { + stream() << LogSeverityNames[severity][0] + << setw(2) << 1+data_->tm_time_.tm_mon + << setw(2) << data_->tm_time_.tm_mday + << ' ' + << setw(2) << data_->tm_time_.tm_hour << ':' + << setw(2) << data_->tm_time_.tm_min << ':' + << setw(2) << data_->tm_time_.tm_sec << "." + << setw(6) << usecs + << ' ' + << setfill(' ') << setw(5) + << static_cast(GetTID()) << setfill('0') + << ' ' + << data_->basename_ << ':' << data_->line_ << "] "; + } + data_->num_prefix_chars_ = data_->stream_->pcount(); + + if (!FLAGS_log_backtrace_at.empty()) { + char fileline[128]; + snprintf(fileline, sizeof(fileline), "%s:%d", data_->basename_, line); +#ifdef HAVE_STACKTRACE + if (!strcmp(FLAGS_log_backtrace_at.c_str(), fileline)) { + string stacktrace; + DumpStackTraceToString(&stacktrace); + stream() << " (stacktrace:\n" << stacktrace << ") "; + } +#endif + } +} + +LogMessage::~LogMessage() { + Flush(); + delete allocated_; +} + +// Flush buffered message, called by the destructor, or any other function +// that needs to synchronize the log. +void LogMessage::Flush() { + if (data_->has_been_flushed_ || data_->severity_ < FLAGS_minloglevel) + return; + + data_->num_chars_to_log_ = data_->stream_->pcount(); + data_->num_chars_to_syslog_ = + data_->num_chars_to_log_ - data_->num_prefix_chars_; + + // Do we need to add a \n to the end of this message? + bool append_newline = + (data_->message_text_[data_->num_chars_to_log_-1] != '\n'); + char original_final_char = '\0'; + + // If we do need to add a \n, we'll do it by violating the memory of the + // ostrstream buffer. This is quick, and we'll make sure to undo our + // modification before anything else is done with the ostrstream. It + // would be preferable not to do things this way, but it seems to be + // the best way to deal with this. + if (append_newline) { + original_final_char = data_->message_text_[data_->num_chars_to_log_]; + data_->message_text_[data_->num_chars_to_log_++] = '\n'; + } + + // Prevent any subtle race conditions by wrapping a mutex lock around + // the actual logging action per se. + { + MutexLock l(&log_mutex); + (this->*(data_->send_method_))(); + ++num_messages_[static_cast(data_->severity_)]; + } + LogDestination::WaitForSinks(data_); + + if (append_newline) { + // Fix the ostrstream back how it was before we screwed with it. + // It's 99.44% certain that we don't need to worry about doing this. + data_->message_text_[data_->num_chars_to_log_-1] = original_final_char; + } + + // If errno was already set before we enter the logging call, we'll + // set it back to that value when we return from the logging call. + // It happens often that we log an error message after a syscall + // failure, which can potentially set the errno to some other + // values. We would like to preserve the original errno. + if (data_->preserved_errno_ != 0) { + errno = data_->preserved_errno_; + } + + // Note that this message is now safely logged. If we're asked to flush + // again, as a result of destruction, say, we'll do nothing on future calls. + data_->has_been_flushed_ = true; +} + +// Copy of first FATAL log message so that we can print it out again +// after all the stack traces. To preserve legacy behavior, we don't +// use fatal_msg_buf_exclusive. +static time_t fatal_time; +static char fatal_message[256]; + +void ReprintFatalMessage() { + if (fatal_message[0]) { + const int n = strlen(fatal_message); + if (!FLAGS_logtostderr) { + // Also write to stderr + WriteToStderr(fatal_message, n); + } + LogDestination::LogToAllLogfiles(ERROR, fatal_time, fatal_message, n); + } +} + +// L >= log_mutex (callers must hold the log_mutex). +void LogMessage::SendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) { + static bool already_warned_before_initgoogle = false; + + log_mutex.AssertHeld(); + + RAW_DCHECK(data_->num_chars_to_log_ > 0 && + data_->message_text_[data_->num_chars_to_log_-1] == '\n', ""); + + // Messages of a given severity get logged to lower severity logs, too + + if (!already_warned_before_initgoogle && !IsGoogleLoggingInitialized()) { + const char w[] = "WARNING: Logging before InitGoogleLogging() is " + "written to STDERR\n"; + WriteToStderr(w, strlen(w)); + already_warned_before_initgoogle = true; + } + + // global flag: never log to file if set. Also -- don't log to a + // file if we haven't parsed the command line flags to get the + // program name. + if (FLAGS_logtostderr || !IsGoogleLoggingInitialized()) { + WriteToStderr(data_->message_text_, data_->num_chars_to_log_); + + // this could be protected by a flag if necessary. + LogDestination::LogToSinks(data_->severity_, + data_->fullname_, data_->basename_, + data_->line_, &data_->tm_time_, + data_->message_text_ + data_->num_prefix_chars_, + (data_->num_chars_to_log_ - + data_->num_prefix_chars_ - 1)); + } else { + + // log this message to all log files of severity <= severity_ + LogDestination::LogToAllLogfiles(data_->severity_, data_->timestamp_, + data_->message_text_, + data_->num_chars_to_log_); + + LogDestination::MaybeLogToStderr(data_->severity_, data_->message_text_, + data_->num_chars_to_log_); + LogDestination::MaybeLogToEmail(data_->severity_, data_->message_text_, + data_->num_chars_to_log_); + LogDestination::LogToSinks(data_->severity_, + data_->fullname_, data_->basename_, + data_->line_, &data_->tm_time_, + data_->message_text_ + data_->num_prefix_chars_, + (data_->num_chars_to_log_ + - data_->num_prefix_chars_ - 1)); + // NOTE: -1 removes trailing \n + } + + // If we log a FATAL message, flush all the log destinations, then toss + // a signal for others to catch. We leave the logs in a state that + // someone else can use them (as long as they flush afterwards) + if (data_->severity_ == FATAL && exit_on_dfatal) { + if (data_->first_fatal_) { + // Store crash information so that it is accessible from within signal + // handlers that may be invoked later. + RecordCrashReason(&crash_reason); + SetCrashReason(&crash_reason); + + // Store shortened fatal message for other logs and GWQ status + const int copy = min(data_->num_chars_to_log_, + sizeof(fatal_message)-1); + memcpy(fatal_message, data_->message_text_, copy); + fatal_message[copy] = '\0'; + fatal_time = data_->timestamp_; + } + + if (!FLAGS_logtostderr) { + for (int i = 0; i < NUM_SEVERITIES; ++i) { + if ( LogDestination::log_destinations_[i] ) + LogDestination::log_destinations_[i]->logger_->Write(true, 0, "", 0); + } + } + + // release the lock that our caller (directly or indirectly) + // LogMessage::~LogMessage() grabbed so that signal handlers + // can use the logging facility. Alternately, we could add + // an entire unsafe logging interface to bypass locking + // for signal handlers but this seems simpler. + log_mutex.Unlock(); + LogDestination::WaitForSinks(data_); + + const char* message = "*** Check failure stack trace: ***\n"; + if (write(STDERR_FILENO, message, strlen(message)) < 0) { + // Ignore errors. + } + Fail(); + } +} + +void LogMessage::RecordCrashReason( + glog_internal_namespace_::CrashReason* reason) { + reason->filename = fatal_msg_data_exclusive_.fullname_; + reason->line_number = fatal_msg_data_exclusive_.line_; + reason->message = fatal_msg_buf_exclusive + + fatal_msg_data_exclusive_.num_prefix_chars_; +#ifdef HAVE_STACKTRACE + // Retrieve the stack trace, omitting the logging frames that got us here. + reason->depth = GetStackTrace(reason->stack, ARRAYSIZE(reason->stack), 4); +#else + reason->depth = 0; +#endif +} + +static void logging_fail() { +#if defined(_DEBUG) && defined(_MSC_VER) + // When debugging on windows, avoid the obnoxious dialog and make + // it possible to continue past a LOG(FATAL) in the debugger + _asm int 3 +#else + abort(); +#endif +} + +#ifdef HAVE___ATTRIBUTE__ +GOOGLE_GLOG_DLL_DECL +void (*g_logging_fail_func)() __attribute__((noreturn)) = &logging_fail; +#else +GOOGLE_GLOG_DLL_DECL void (*g_logging_fail_func)() = &logging_fail; +#endif + +void InstallFailureFunction(void (*fail_func)()) { + g_logging_fail_func = fail_func; +} + +void LogMessage::Fail() { + g_logging_fail_func(); +} + +// L >= log_mutex (callers must hold the log_mutex). +void LogMessage::SendToSink() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) { + if (data_->sink_ != NULL) { + RAW_DCHECK(data_->num_chars_to_log_ > 0 && + data_->message_text_[data_->num_chars_to_log_-1] == '\n', ""); + data_->sink_->send(data_->severity_, data_->fullname_, data_->basename_, + data_->line_, &data_->tm_time_, + data_->message_text_ + data_->num_prefix_chars_, + (data_->num_chars_to_log_ - + data_->num_prefix_chars_ - 1)); + } +} + +// L >= log_mutex (callers must hold the log_mutex). +void LogMessage::SendToSinkAndLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) { + SendToSink(); + SendToLog(); +} + +// L >= log_mutex (callers must hold the log_mutex). +void LogMessage::SaveOrSendToLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) { + if (data_->outvec_ != NULL) { + RAW_DCHECK(data_->num_chars_to_log_ > 0 && + data_->message_text_[data_->num_chars_to_log_-1] == '\n', ""); + // Omit prefix of message and trailing newline when recording in outvec_. + const char *start = data_->message_text_ + data_->num_prefix_chars_; + int len = data_->num_chars_to_log_ - data_->num_prefix_chars_ - 1; + data_->outvec_->push_back(string(start, len)); + } else { + SendToLog(); + } +} + +void LogMessage::WriteToStringAndLog() EXCLUSIVE_LOCKS_REQUIRED(log_mutex) { + if (data_->message_ != NULL) { + RAW_DCHECK(data_->num_chars_to_log_ > 0 && + data_->message_text_[data_->num_chars_to_log_-1] == '\n', ""); + // Omit prefix of message and trailing newline when writing to message_. + const char *start = data_->message_text_ + data_->num_prefix_chars_; + int len = data_->num_chars_to_log_ - data_->num_prefix_chars_ - 1; + data_->message_->assign(start, len); + } + SendToLog(); +} + +// L >= log_mutex (callers must hold the log_mutex). +void LogMessage::SendToSyslogAndLog() { +#ifdef HAVE_SYSLOG_H + // Before any calls to syslog(), make a single call to openlog() + static bool openlog_already_called = false; + if (!openlog_already_called) { + openlog(glog_internal_namespace_::ProgramInvocationShortName(), + LOG_CONS | LOG_NDELAY | LOG_PID, + LOG_USER); + openlog_already_called = true; + } + + // This array maps Google severity levels to syslog levels + const int SEVERITY_TO_LEVEL[] = { LOG_INFO, LOG_WARNING, LOG_ERR, LOG_EMERG }; + syslog(LOG_USER | SEVERITY_TO_LEVEL[static_cast(data_->severity_)], "%.*s", + int(data_->num_chars_to_syslog_), + data_->message_text_ + data_->num_prefix_chars_); + SendToLog(); +#else + LOG(ERROR) << "No syslog support: message=" << data_->message_text_; +#endif +} + +base::Logger* base::GetLogger(LogSeverity severity) { + MutexLock l(&log_mutex); + return LogDestination::log_destination(severity)->logger_; +} + +void base::SetLogger(LogSeverity severity, base::Logger* logger) { + MutexLock l(&log_mutex); + LogDestination::log_destination(severity)->logger_ = logger; +} + +// L < log_mutex. Acquires and releases mutex_. +int64 LogMessage::num_messages(int severity) { + MutexLock l(&log_mutex); + return num_messages_[severity]; +} + +// Output the COUNTER value. This is only valid if ostream is a +// LogStream. +ostream& operator<<(ostream &os, const PRIVATE_Counter&) { + LogMessage::LogStream *log = dynamic_cast(&os); + CHECK(log == log->self()); + os << log->ctr(); + return os; +} + +ErrnoLogMessage::ErrnoLogMessage(const char* file, int line, + LogSeverity severity, int ctr, + void (LogMessage::*send_method)()) + : LogMessage(file, line, severity, ctr, send_method) { +} + +ErrnoLogMessage::~ErrnoLogMessage() { + // Don't access errno directly because it may have been altered + // while streaming the message. + char buf[100]; + posix_strerror_r(preserved_errno(), buf, sizeof(buf)); + stream() << ": " << buf << " [" << preserved_errno() << "]"; +} + +void FlushLogFiles(LogSeverity min_severity) { + LogDestination::FlushLogFiles(min_severity); +} + +void FlushLogFilesUnsafe(LogSeverity min_severity) { + LogDestination::FlushLogFilesUnsafe(min_severity); +} + +void SetLogDestination(LogSeverity severity, const char* base_filename) { + LogDestination::SetLogDestination(severity, base_filename); +} + +void SetLogSymlink(LogSeverity severity, const char* symlink_basename) { + LogDestination::SetLogSymlink(severity, symlink_basename); +} + +LogSink::~LogSink() { +} + +void LogSink::WaitTillSent() { + // noop default +} + +string LogSink::ToString(LogSeverity severity, const char* file, int line, + const struct ::tm* tm_time, + const char* message, size_t message_len) { + ostringstream stream(string(message, message_len)); + stream.fill('0'); + + // FIXME(jrvb): Updating this to use the correct value for usecs + // requires changing the signature for both this method and + // LogSink::send(). This change needs to be done in a separate CL + // so subclasses of LogSink can be updated at the same time. + int usecs = 0; + + stream << LogSeverityNames[severity][0] + << setw(2) << 1+tm_time->tm_mon + << setw(2) << tm_time->tm_mday + << ' ' + << setw(2) << tm_time->tm_hour << ':' + << setw(2) << tm_time->tm_min << ':' + << setw(2) << tm_time->tm_sec << '.' + << setw(6) << usecs + << ' ' + << setfill(' ') << setw(5) << GetTID() << setfill('0') + << ' ' + << file << ':' << line << "] "; + + stream << string(message, message_len); + return stream.str(); +} + +void AddLogSink(LogSink *destination) { + LogDestination::AddLogSink(destination); +} + +void RemoveLogSink(LogSink *destination) { + LogDestination::RemoveLogSink(destination); +} + +void SetLogFilenameExtension(const char* ext) { + LogDestination::SetLogFilenameExtension(ext); +} + +void SetStderrLogging(LogSeverity min_severity) { + LogDestination::SetStderrLogging(min_severity); +} + +void SetEmailLogging(LogSeverity min_severity, const char* addresses) { + LogDestination::SetEmailLogging(min_severity, addresses); +} + +void LogToStderr() { + LogDestination::LogToStderr(); +} + +namespace base { +namespace internal { + +bool GetExitOnDFatal() { + MutexLock l(&log_mutex); + return exit_on_dfatal; +} + +// Determines whether we exit the program for a LOG(DFATAL) message in +// debug mode. It does this by skipping the call to Fail/FailQuietly. +// This is intended for testing only. +// +// This can have some effects on LOG(FATAL) as well. Failure messages +// are always allocated (rather than sharing a buffer), the crash +// reason is not recorded, the "gwq" status message is not updated, +// and the stack trace is not recorded. The LOG(FATAL) *will* still +// exit the program. Since this function is used only in testing, +// these differences are acceptable. +void SetExitOnDFatal(bool value) { + MutexLock l(&log_mutex); + exit_on_dfatal = value; +} + +} // namespace internal +} // namespace base + +// use_logging controls whether the logging functions LOG/VLOG are used +// to log errors. It should be set to false when the caller holds the +// log_mutex. +static bool SendEmailInternal(const char*dest, const char *subject, + const char*body, bool use_logging) { + if (dest && *dest) { + if ( use_logging ) { + VLOG(1) << "Trying to send TITLE:" << subject + << " BODY:" << body << " to " << dest; + } else { + fprintf(stderr, "Trying to send TITLE: %s BODY: %s to %s\n", + subject, body, dest); + } + + string cmd = + FLAGS_logmailer + " -s\"" + subject + "\" " + dest; + FILE* pipe = popen(cmd.c_str(), "w"); + if (pipe != NULL) { + // Add the body if we have one + if (body) + fwrite(body, sizeof(char), strlen(body), pipe); + bool ok = pclose(pipe) != -1; + if ( !ok ) { + if ( use_logging ) { + char buf[100]; + posix_strerror_r(errno, buf, sizeof(buf)); + LOG(ERROR) << "Problems sending mail to " << dest << ": " << buf; + } else { + char buf[100]; + posix_strerror_r(errno, buf, sizeof(buf)); + fprintf(stderr, "Problems sending mail to %s: %s\n", dest, buf); + } + } + return ok; + } else { + if ( use_logging ) { + LOG(ERROR) << "Unable to send mail to " << dest; + } else { + fprintf(stderr, "Unable to send mail to %s\n", dest); + } + } + } + return false; +} + +bool SendEmail(const char*dest, const char *subject, const char*body){ + return SendEmailInternal(dest, subject, body, true); +} + +static void GetTempDirectories(vector* list) { + list->clear(); +#ifdef OS_WINDOWS + // On windows we'll try to find a directory in this order: + // C:/Documents & Settings/whomever/TEMP (or whatever GetTempPath() is) + // C:/TMP/ + // C:/TEMP/ + // C:/WINDOWS/ or C:/WINNT/ + // . + char tmp[MAX_PATH]; + if (GetTempPathA(MAX_PATH, tmp)) + list->push_back(tmp); + list->push_back("C:\\tmp\\"); + list->push_back("C:\\temp\\"); +#else + // Directories, in order of preference. If we find a dir that + // exists, we stop adding other less-preferred dirs + const char * candidates[] = { + // Non-null only during unittest/regtest + getenv("TEST_TMPDIR"), + + // Explicitly-supplied temp dirs + getenv("TMPDIR"), getenv("TMP"), + + // If all else fails + "/tmp", + }; + + for (int i = 0; i < ARRAYSIZE(candidates); i++) { + const char *d = candidates[i]; + if (!d) continue; // Empty env var + + // Make sure we don't surprise anyone who's expecting a '/' + string dstr = d; + if (dstr[dstr.size() - 1] != '/') { + dstr += "/"; + } + list->push_back(dstr); + + struct stat statbuf; + if (!stat(d, &statbuf) && S_ISDIR(statbuf.st_mode)) { + // We found a dir that exists - we're done. + return; + } + } + +#endif +} + +static vector* logging_directories_list; + +const vector& GetLoggingDirectories() { + // Not strictly thread-safe but we're called early in InitGoogle(). + if (logging_directories_list == NULL) { + logging_directories_list = new vector; + + if ( !FLAGS_log_dir.empty() ) { + // A dir was specified, we should use it + logging_directories_list->push_back(FLAGS_log_dir.c_str()); + } else { + GetTempDirectories(logging_directories_list); +#ifdef OS_WINDOWS + char tmp[MAX_PATH]; + if (GetWindowsDirectoryA(tmp, MAX_PATH)) + logging_directories_list->push_back(tmp); + logging_directories_list->push_back(".\\"); +#else + logging_directories_list->push_back("./"); +#endif + } + } + return *logging_directories_list; +} + +void TestOnly_ClearLoggingDirectoriesList() { + fprintf(stderr, "TestOnly_ClearLoggingDirectoriesList should only be " + "called from test code.\n"); + delete logging_directories_list; + logging_directories_list = NULL; +} + +void GetExistingTempDirectories(vector* list) { + GetTempDirectories(list); + vector::iterator i_dir = list->begin(); + while( i_dir != list->end() ) { + // zero arg to access means test for existence; no constant + // defined on windows + if ( access(i_dir->c_str(), 0) ) { + i_dir = list->erase(i_dir); + } else { + ++i_dir; + } + } +} + +void TruncateLogFile(const char *path, int64 limit, int64 keep) { +#ifdef HAVE_UNISTD_H + struct stat statbuf; + const int kCopyBlockSize = 8 << 10; + char copybuf[kCopyBlockSize]; + int64 read_offset, write_offset; + // Don't follow symlinks unless they're our own fd symlinks in /proc + int flags = O_RDWR; + const char *procfd_prefix = "/proc/self/fd/"; + if (strncmp(procfd_prefix, path, strlen(procfd_prefix))) flags |= O_NOFOLLOW; + + int fd = open(path, flags); + if (fd == -1) { + if (errno == EFBIG) { + // The log file in question has got too big for us to open. The + // real fix for this would be to compile logging.cc (or probably + // all of base/...) with -D_FILE_OFFSET_BITS=64 but that's + // rather scary. + // Instead just truncate the file to something we can manage + if (truncate(path, 0) == -1) { + PLOG(ERROR) << "Unable to truncate " << path; + } else { + LOG(ERROR) << "Truncated " << path << " due to EFBIG error"; + } + } else { + PLOG(ERROR) << "Unable to open " << path; + } + return; + } + + if (fstat(fd, &statbuf) == -1) { + PLOG(ERROR) << "Unable to fstat()"; + goto out_close_fd; + } + + // See if the path refers to a regular file bigger than the + // specified limit + if (!S_ISREG(statbuf.st_mode)) goto out_close_fd; + if (statbuf.st_size <= limit) goto out_close_fd; + if (statbuf.st_size <= keep) goto out_close_fd; + + // This log file is too large - we need to truncate it + LOG(INFO) << "Truncating " << path << " to " << keep << " bytes"; + + // Copy the last "keep" bytes of the file to the beginning of the file + read_offset = statbuf.st_size - keep; + write_offset = 0; + int bytesin, bytesout; + while ((bytesin = pread(fd, copybuf, sizeof(copybuf), read_offset)) > 0) { + bytesout = pwrite(fd, copybuf, bytesin, write_offset); + if (bytesout == -1) { + PLOG(ERROR) << "Unable to write to " << path; + break; + } else if (bytesout != bytesin) { + LOG(ERROR) << "Expected to write " << bytesin << ", wrote " << bytesout; + } + read_offset += bytesin; + write_offset += bytesout; + } + if (bytesin == -1) PLOG(ERROR) << "Unable to read from " << path; + + // Truncate the remainder of the file. If someone else writes to the + // end of the file after our last read() above, we lose their latest + // data. Too bad ... + if (ftruncate(fd, write_offset) == -1) { + PLOG(ERROR) << "Unable to truncate " << path; + } + + out_close_fd: + close(fd); +#else + LOG(ERROR) << "No log truncation support."; +#endif +} + +void TruncateStdoutStderr() { +#ifdef HAVE_UNISTD_H + int64 limit = MaxLogSize() << 20; + int64 keep = 1 << 20; + TruncateLogFile("/proc/self/fd/1", limit, keep); + TruncateLogFile("/proc/self/fd/2", limit, keep); +#else + LOG(ERROR) << "No log truncation support."; +#endif +} + + +// Helper functions for string comparisons. +#define DEFINE_CHECK_STROP_IMPL(name, func, expected) \ + string* Check##func##expected##Impl(const char* s1, const char* s2, \ + const char* names) { \ + bool equal = s1 == s2 || (s1 && s2 && !func(s1, s2)); \ + if (equal == expected) return NULL; \ + else { \ + strstream ss; \ + if (!s1) s1 = ""; \ + if (!s2) s2 = ""; \ + ss << #name " failed: " << names << " (" << s1 << " vs. " << s2 << ")"; \ + return new string(ss.str(), ss.pcount()); \ + } \ + } +DEFINE_CHECK_STROP_IMPL(CHECK_STREQ, strcmp, true) +DEFINE_CHECK_STROP_IMPL(CHECK_STRNE, strcmp, false) +DEFINE_CHECK_STROP_IMPL(CHECK_STRCASEEQ, strcasecmp, true) +DEFINE_CHECK_STROP_IMPL(CHECK_STRCASENE, strcasecmp, false) +#undef DEFINE_CHECK_STROP_IMPL + +int posix_strerror_r(int err, char *buf, size_t len) { + // Sanity check input parameters + if (buf == NULL || len <= 0) { + errno = EINVAL; + return -1; + } + + // Reset buf and errno, and try calling whatever version of strerror_r() + // is implemented by glibc + buf[0] = '\000'; + int old_errno = errno; + errno = 0; + char *rc = reinterpret_cast(strerror_r(err, buf, len)); + + // Both versions set errno on failure + if (errno) { + // Should already be there, but better safe than sorry + buf[0] = '\000'; + return -1; + } + errno = old_errno; + + // POSIX is vague about whether the string will be terminated, although + // is indirectly implies that typically ERANGE will be returned, instead + // of truncating the string. This is different from the GNU implementation. + // We play it safe by always terminating the string explicitly. + buf[len-1] = '\000'; + + // If the function succeeded, we can use its exit code to determine the + // semantics implemented by glibc + if (!rc) { + return 0; + } else { + // GNU semantics detected + if (rc == buf) { + return 0; + } else { + buf[0] = '\000'; +#if defined(OS_MACOSX) || defined(OS_FREEBSD) || defined(OS_OPENBSD) + if (reinterpret_cast(rc) < sys_nerr) { + // This means an error on MacOSX or FreeBSD. + return -1; + } +#endif + strncat(buf, rc, len-1); + return 0; + } + } +} + +LogMessageFatal::LogMessageFatal(const char* file, int line) : + LogMessage(file, line, FATAL) {} + +LogMessageFatal::LogMessageFatal(const char* file, int line, + const CheckOpString& result) : + LogMessage(file, line, result) {} + +LogMessageFatal::~LogMessageFatal() { + Flush(); + LogMessage::Fail(); +} + +void InitGoogleLogging(const char* argv0) { + glog_internal_namespace_::InitGoogleLoggingUtilities(argv0); +} + +void ShutdownGoogleLogging() { + glog_internal_namespace_::ShutdownGoogleLoggingUtilities(); + LogDestination::DeleteLogDestinations(); + delete logging_directories_list; + logging_directories_list = NULL; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/logging_striplog_test.sh b/spotify/breakpad/third_party/glog/src/logging_striplog_test.sh new file mode 100755 index 000000000..b9033b242 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/logging_striplog_test.sh @@ -0,0 +1,72 @@ +#! /bin/sh +# +# Copyright (c) 2007, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Author: Sergey Ioffe + +get_strings () { + if test -e ".libs/$1"; then + binary=".libs/$1" + elif test -e "$1.exe"; then + binary="$1.exe" + else + echo "We coundn't find $1 binary." + exit 1 + fi + + strings -n 10 $binary | sort | awk '/TESTMESSAGE/ {printf "%s ", $2}' +} + +# Die if "$1" != "$2", print $3 as death reason +check_eq () { + if [ "$1" != "$2" ]; then + echo "Check failed: '$1' == '$2' ${3:+ ($3)}" + exit 1 + fi +} + +die () { + echo $1 + exit 1 +} + +# Check that the string literals are appropriately stripped. This will +# not be the case in debug mode. + +check_eq "`get_strings logging_striptest0`" "COND ERROR FATAL INFO WARNING " +check_eq "`get_strings logging_striptest2`" "COND ERROR FATAL " +check_eq "`get_strings logging_striptest10`" "" + +# Check that LOG(FATAL) aborts even for large STRIP_LOG + +./logging_striptest2 2>/dev/null && die "Did not abort for STRIP_LOG=2" +./logging_striptest10 2>/dev/null && die "Did not abort for STRIP_LOG=10" + +echo "PASS" diff --git a/spotify/breakpad/third_party/glog/src/logging_striptest10.cc b/spotify/breakpad/third_party/glog/src/logging_striptest10.cc new file mode 100644 index 000000000..f6e1078f3 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/logging_striptest10.cc @@ -0,0 +1,35 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sergey Ioffe + +#define GOOGLE_STRIP_LOG 10 + +// Include the actual test. +#include "logging_striptest_main.cc" diff --git a/spotify/breakpad/third_party/glog/src/logging_striptest2.cc b/spotify/breakpad/third_party/glog/src/logging_striptest2.cc new file mode 100644 index 000000000..a64685c9e --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/logging_striptest2.cc @@ -0,0 +1,35 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sergey Ioffe + +#define GOOGLE_STRIP_LOG 2 + +// Include the actual test. +#include "logging_striptest_main.cc" diff --git a/spotify/breakpad/third_party/glog/src/logging_striptest_main.cc b/spotify/breakpad/third_party/glog/src/logging_striptest_main.cc new file mode 100644 index 000000000..17a582f54 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/logging_striptest_main.cc @@ -0,0 +1,68 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Sergey Ioffe + +// The common part of the striplog tests. + +#include +#include +#include +#include "glog/logging.h" +#include "base/commandlineflags.h" +#include "config.h" + +DECLARE_bool(logtostderr); + +using std::string; +using namespace GOOGLE_NAMESPACE; + +int CheckNoReturn(bool b) { + string s; + if (b) { + LOG(FATAL) << "Fatal"; + } else { + return 0; + } +} + +struct A { }; +std::ostream &operator<<(std::ostream &str, const A&) {return str;} + +int main(int argc, char* argv[]) { + FLAGS_logtostderr = true; + InitGoogleLogging(argv[0]); + LOG(INFO) << "TESTMESSAGE INFO"; + LOG(WARNING) << 2 << "something" << "TESTMESSAGE WARNING" + << 1 << 'c' << A() << std::endl; + LOG(ERROR) << "TESTMESSAGE ERROR"; + bool flag = true; + (flag ? LOG(INFO) : LOG(ERROR)) << "TESTMESSAGE COND"; + LOG(FATAL) << "TESTMESSAGE FATAL"; +} diff --git a/spotify/breakpad/third_party/glog/src/logging_unittest.cc b/spotify/breakpad/third_party/glog/src/logging_unittest.cc new file mode 100644 index 000000000..5fc34d4a4 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/logging_unittest.cc @@ -0,0 +1,1210 @@ +// Copyright (c) 2002, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Ray Sidney + +#include "config_for_unittests.h" +#include "utilities.h" + +#include +#ifdef HAVE_GLOB_H +# include +#endif +#include +#ifdef HAVE_UNISTD_H +# include +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "base/commandlineflags.h" +#include "glog/logging.h" +#include "glog/raw_logging.h" +#include "googletest.h" + +DECLARE_string(log_backtrace_at); // logging.cc + +#ifdef HAVE_LIB_GFLAGS +#include +#endif + +#ifdef HAVE_LIB_GMOCK +#include +#include "mock-log.h" +// Introduce several symbols from gmock. +using testing::_; +using testing::AnyNumber; +using testing::HasSubstr; +using testing::AllOf; +using testing::StrNe; +using testing::StrictMock; +using testing::InitGoogleMock; +using GOOGLE_NAMESPACE::glog_testing::ScopedMockLog; +#endif + +using namespace std; +using namespace GOOGLE_NAMESPACE; + +// Some non-advertised functions that we want to test or use. +_START_GOOGLE_NAMESPACE_ +namespace base { +namespace internal { +bool GetExitOnDFatal(); +void SetExitOnDFatal(bool value); +} // namespace internal +} // namespace base +_END_GOOGLE_NAMESPACE_ + +static void TestLogging(bool check_counts); +static void TestRawLogging(); +static void LogWithLevels(int v, int severity, bool err, bool alsoerr); +static void TestLoggingLevels(); +static void TestLogString(); +static void TestLogSink(); +static void TestLogToString(); +static void TestLogSinkWaitTillSent(); +static void TestCHECK(); +static void TestDCHECK(); +static void TestSTREQ(); +static void TestBasename(); +static void TestSymlink(); +static void TestExtension(); +static void TestWrapper(); +static void TestErrno(); +static void TestTruncate(); + +static int x = -1; +static void BM_Check1(int n) { + while (n-- > 0) { + CHECK_GE(n, x); + CHECK_GE(n, x); + CHECK_GE(n, x); + CHECK_GE(n, x); + CHECK_GE(n, x); + CHECK_GE(n, x); + CHECK_GE(n, x); + CHECK_GE(n, x); + } +} +BENCHMARK(BM_Check1); + +static void CheckFailure(int a, int b, const char* file, int line, const char* msg); +static void BM_Check3(int n) { + while (n-- > 0) { + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + if (n < x) CheckFailure(n, x, __FILE__, __LINE__, "n < x"); + } +} +BENCHMARK(BM_Check3); + +static void BM_Check2(int n) { + if (n == 17) { + x = 5; + } + while (n-- > 0) { + CHECK(n >= x); + CHECK(n >= x); + CHECK(n >= x); + CHECK(n >= x); + CHECK(n >= x); + CHECK(n >= x); + CHECK(n >= x); + CHECK(n >= x); + } +} +BENCHMARK(BM_Check2); + +static void CheckFailure(int a, int b, const char* file, int line, const char* msg) { +} + +static void BM_logspeed(int n) { + while (n-- > 0) { + LOG(INFO) << "test message"; + } +} +BENCHMARK(BM_logspeed); + +static void BM_vlog(int n) { + while (n-- > 0) { + VLOG(1) << "test message"; + } +} +BENCHMARK(BM_vlog); + +int main(int argc, char **argv) { +#ifdef HAVE_LIB_GFLAGS + ParseCommandLineFlags(&argc, &argv, true); +#endif + + // Test some basics before InitGoogleLogging: + CaptureTestStderr(); + LogWithLevels(FLAGS_v, FLAGS_stderrthreshold, + FLAGS_logtostderr, FLAGS_alsologtostderr); + LogWithLevels(0, 0, 0, 0); // simulate "before global c-tors" + const string early_stderr = GetCapturedTestStderr(); + + InitGoogleLogging(argv[0]); + + RunSpecifiedBenchmarks(); + + FLAGS_logtostderr = true; + + InitGoogleTest(&argc, argv); +#ifdef HAVE_LIB_GMOCK + InitGoogleMock(&argc, argv); +#endif + + // so that death tests run before we use threads + CHECK_EQ(RUN_ALL_TESTS(), 0); + + CaptureTestStderr(); + + // re-emit early_stderr + LogMessage("dummy", LogMessage::kNoLogPrefix, INFO).stream() << early_stderr; + + TestLogging(true); + TestRawLogging(); + TestLoggingLevels(); + TestLogString(); + TestLogSink(); + TestLogToString(); + TestLogSinkWaitTillSent(); + TestCHECK(); + TestDCHECK(); + TestSTREQ(); + + // TODO: The golden test portion of this test is very flakey. + EXPECT_TRUE( + MungeAndDiffTestStderr(FLAGS_test_srcdir + "/src/logging_unittest.err")); + + FLAGS_logtostderr = false; + + TestBasename(); + TestSymlink(); + TestExtension(); + TestWrapper(); + TestErrno(); + TestTruncate(); + + ShutdownGoogleLogging(); + + fprintf(stdout, "PASS\n"); + return 0; +} + +void TestLogging(bool check_counts) { + int64 base_num_infos = LogMessage::num_messages(INFO); + int64 base_num_warning = LogMessage::num_messages(WARNING); + int64 base_num_errors = LogMessage::num_messages(ERROR); + + LOG(INFO) << string("foo ") << "bar " << 10 << ' ' << 3.4; + for ( int i = 0; i < 10; ++i ) { + int old_errno = errno; + errno = i; + PLOG_EVERY_N(ERROR, 2) << "Plog every 2, iteration " << COUNTER; + errno = old_errno; + + LOG_EVERY_N(ERROR, 3) << "Log every 3, iteration " << COUNTER << endl; + LOG_EVERY_N(ERROR, 4) << "Log every 4, iteration " << COUNTER << endl; + + LOG_IF_EVERY_N(WARNING, true, 5) << "Log if every 5, iteration " << COUNTER; + LOG_IF_EVERY_N(WARNING, false, 3) + << "Log if every 3, iteration " << COUNTER; + LOG_IF_EVERY_N(INFO, true, 1) << "Log if every 1, iteration " << COUNTER; + LOG_IF_EVERY_N(ERROR, (i < 3), 2) + << "Log if less than 3 every 2, iteration " << COUNTER; + } + LOG_IF(WARNING, true) << "log_if this"; + LOG_IF(WARNING, false) << "don't log_if this"; + + char s[] = "array"; + LOG(INFO) << s; + const char const_s[] = "const array"; + LOG(INFO) << const_s; + int j = 1000; + LOG(ERROR) << string("foo") << ' '<< j << ' ' << setw(10) << j << " " + << setw(1) << hex << j; + + LogMessage("foo", LogMessage::kNoLogPrefix, INFO).stream() << "no prefix"; + + if (check_counts) { + CHECK_EQ(base_num_infos + 14, LogMessage::num_messages(INFO)); + CHECK_EQ(base_num_warning + 3, LogMessage::num_messages(WARNING)); + CHECK_EQ(base_num_errors + 15, LogMessage::num_messages(ERROR)); + } +} + +static void NoAllocNewHook() { + CHECK(false) << "unexpected new"; +} + +struct NewHook { + NewHook() { + g_new_hook = &NoAllocNewHook; + } + ~NewHook() { + g_new_hook = NULL; + } +}; + +TEST(DeathNoAllocNewHook, logging) { + // tests that NewHook used below works + NewHook new_hook; + ASSERT_DEATH({ + new int; + }, "unexpected new"); +} + +void TestRawLogging() { + string* foo = new string("foo "); + string huge_str(50000, 'a'); + + FlagSaver saver; + + // Check that RAW loggging does not use mallocs. + NewHook new_hook; + + RAW_LOG(INFO, "%s%s%d%c%f", foo->c_str(), "bar ", 10, ' ', 3.4); + char s[] = "array"; + RAW_LOG(WARNING, "%s", s); + const char const_s[] = "const array"; + RAW_LOG(INFO, "%s", const_s); + void* p = reinterpret_cast(0x12345678); + RAW_LOG(INFO, "ptr %p", p); + p = NULL; + RAW_LOG(INFO, "ptr %p", p); + int j = 1000; + RAW_LOG(ERROR, "%s%d%c%010d%s%1x", foo->c_str(), j, ' ', j, " ", j); + RAW_VLOG(0, "foo %d", j); + +#ifdef NDEBUG + RAW_LOG(INFO, "foo %d", j); // so that have same stderr to compare +#else + RAW_DLOG(INFO, "foo %d", j); // test RAW_DLOG in debug mode +#endif + + // test how long messages are chopped: + RAW_LOG(WARNING, "Huge string: %s", huge_str.c_str()); + RAW_VLOG(0, "Huge string: %s", huge_str.c_str()); + + FLAGS_v = 0; + RAW_LOG(INFO, "log"); + RAW_VLOG(0, "vlog 0 on"); + RAW_VLOG(1, "vlog 1 off"); + RAW_VLOG(2, "vlog 2 off"); + RAW_VLOG(3, "vlog 3 off"); + FLAGS_v = 2; + RAW_LOG(INFO, "log"); + RAW_VLOG(1, "vlog 1 on"); + RAW_VLOG(2, "vlog 2 on"); + RAW_VLOG(3, "vlog 3 off"); + +#ifdef NDEBUG + RAW_DCHECK(1 == 2, " RAW_DCHECK's shouldn't be compiled in normal mode"); +#endif + + RAW_CHECK(1 == 1, "should be ok"); + RAW_DCHECK(true, "should be ok"); + + delete foo; +} + +void LogWithLevels(int v, int severity, bool err, bool alsoerr) { + RAW_LOG(INFO, + "Test: v=%d stderrthreshold=%d logtostderr=%d alsologtostderr=%d", + v, severity, err, alsoerr); + + FlagSaver saver; + + FLAGS_v = v; + FLAGS_stderrthreshold = severity; + FLAGS_logtostderr = err; + FLAGS_alsologtostderr = alsoerr; + + RAW_VLOG(-1, "vlog -1"); + RAW_VLOG(0, "vlog 0"); + RAW_VLOG(1, "vlog 1"); + RAW_LOG(INFO, "log info"); + RAW_LOG(WARNING, "log warning"); + RAW_LOG(ERROR, "log error"); + + VLOG(-1) << "vlog -1"; + VLOG(0) << "vlog 0"; + VLOG(1) << "vlog 1"; + LOG(INFO) << "log info"; + LOG(WARNING) << "log warning"; + LOG(ERROR) << "log error"; + + VLOG_IF(-1, true) << "vlog_if -1"; + VLOG_IF(-1, false) << "don't vlog_if -1"; + VLOG_IF(0, true) << "vlog_if 0"; + VLOG_IF(0, false) << "don't vlog_if 0"; + VLOG_IF(1, true) << "vlog_if 1"; + VLOG_IF(1, false) << "don't vlog_if 1"; + LOG_IF(INFO, true) << "log_if info"; + LOG_IF(INFO, false) << "don't log_if info"; + LOG_IF(WARNING, true) << "log_if warning"; + LOG_IF(WARNING, false) << "don't log_if warning"; + LOG_IF(ERROR, true) << "log_if error"; + LOG_IF(ERROR, false) << "don't log_if error"; + + int c; + c = 1; VLOG_IF(100, c -= 2) << "vlog_if 100 expr"; EXPECT_EQ(c, -1); + c = 1; VLOG_IF(0, c -= 2) << "vlog_if 0 expr"; EXPECT_EQ(c, -1); + c = 1; LOG_IF(INFO, c -= 2) << "log_if info expr"; EXPECT_EQ(c, -1); + c = 1; LOG_IF(ERROR, c -= 2) << "log_if error expr"; EXPECT_EQ(c, -1); + c = 2; VLOG_IF(0, c -= 2) << "don't vlog_if 0 expr"; EXPECT_EQ(c, 0); + c = 2; LOG_IF(ERROR, c -= 2) << "don't log_if error expr"; EXPECT_EQ(c, 0); + + c = 3; LOG_IF_EVERY_N(INFO, c -= 4, 1) << "log_if info every 1 expr"; + EXPECT_EQ(c, -1); + c = 3; LOG_IF_EVERY_N(ERROR, c -= 4, 1) << "log_if error every 1 expr"; + EXPECT_EQ(c, -1); + c = 4; LOG_IF_EVERY_N(ERROR, c -= 4, 3) << "don't log_if info every 3 expr"; + EXPECT_EQ(c, 0); + c = 4; LOG_IF_EVERY_N(ERROR, c -= 4, 3) << "don't log_if error every 3 expr"; + EXPECT_EQ(c, 0); + c = 5; VLOG_IF_EVERY_N(0, c -= 4, 1) << "vlog_if 0 every 1 expr"; + EXPECT_EQ(c, 1); + c = 5; VLOG_IF_EVERY_N(100, c -= 4, 3) << "vlog_if 100 every 3 expr"; + EXPECT_EQ(c, 1); + c = 6; VLOG_IF_EVERY_N(0, c -= 6, 1) << "don't vlog_if 0 every 1 expr"; + EXPECT_EQ(c, 0); + c = 6; VLOG_IF_EVERY_N(100, c -= 6, 3) << "don't vlog_if 100 every 1 expr"; + EXPECT_EQ(c, 0); +} + +void TestLoggingLevels() { + LogWithLevels(0, INFO, false, false); + LogWithLevels(1, INFO, false, false); + LogWithLevels(-1, INFO, false, false); + LogWithLevels(0, WARNING, false, false); + LogWithLevels(0, ERROR, false, false); + LogWithLevels(0, FATAL, false, false); + LogWithLevels(0, FATAL, true, false); + LogWithLevels(0, FATAL, false, true); + LogWithLevels(1, WARNING, false, false); + LogWithLevels(1, FATAL, false, true); +} + +TEST(DeathRawCHECK, logging) { + ASSERT_DEATH(RAW_CHECK(false, "failure 1"), + "RAW: Check false failed: failure 1"); + ASSERT_DEBUG_DEATH(RAW_DCHECK(1 == 2, "failure 2"), + "RAW: Check 1 == 2 failed: failure 2"); +} + +void TestLogString() { + vector errors; + vector *no_errors = NULL; + + LOG_STRING(INFO, &errors) << "LOG_STRING: " << "collected info"; + LOG_STRING(WARNING, &errors) << "LOG_STRING: " << "collected warning"; + LOG_STRING(ERROR, &errors) << "LOG_STRING: " << "collected error"; + + LOG_STRING(INFO, no_errors) << "LOG_STRING: " << "reported info"; + LOG_STRING(WARNING, no_errors) << "LOG_STRING: " << "reported warning"; + LOG_STRING(ERROR, NULL) << "LOG_STRING: " << "reported error"; + + for (size_t i = 0; i < errors.size(); ++i) { + LOG(INFO) << "Captured by LOG_STRING: " << errors[i]; + } +} + +void TestLogToString() { + string error; + string* no_error = NULL; + + LOG_TO_STRING(INFO, &error) << "LOG_TO_STRING: " << "collected info"; + LOG(INFO) << "Captured by LOG_TO_STRING: " << error; + LOG_TO_STRING(WARNING, &error) << "LOG_TO_STRING: " << "collected warning"; + LOG(INFO) << "Captured by LOG_TO_STRING: " << error; + LOG_TO_STRING(ERROR, &error) << "LOG_TO_STRING: " << "collected error"; + LOG(INFO) << "Captured by LOG_TO_STRING: " << error; + + LOG_TO_STRING(INFO, no_error) << "LOG_TO_STRING: " << "reported info"; + LOG_TO_STRING(WARNING, no_error) << "LOG_TO_STRING: " << "reported warning"; + LOG_TO_STRING(ERROR, NULL) << "LOG_TO_STRING: " << "reported error"; +} + +class TestLogSinkImpl : public LogSink { + public: + vector errors; + virtual void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, + const struct tm* tm_time, + const char* message, size_t message_len) { + errors.push_back( + ToString(severity, base_filename, line, tm_time, message, message_len)); + } +}; + +void TestLogSink() { + TestLogSinkImpl sink; + LogSink *no_sink = NULL; + + LOG_TO_SINK(&sink, INFO) << "LOG_TO_SINK: " << "collected info"; + LOG_TO_SINK(&sink, WARNING) << "LOG_TO_SINK: " << "collected warning"; + LOG_TO_SINK(&sink, ERROR) << "LOG_TO_SINK: " << "collected error"; + + LOG_TO_SINK(no_sink, INFO) << "LOG_TO_SINK: " << "reported info"; + LOG_TO_SINK(no_sink, WARNING) << "LOG_TO_SINK: " << "reported warning"; + LOG_TO_SINK(NULL, ERROR) << "LOG_TO_SINK: " << "reported error"; + + LOG_TO_SINK_BUT_NOT_TO_LOGFILE(&sink, INFO) + << "LOG_TO_SINK_BUT_NOT_TO_LOGFILE: " << "collected info"; + LOG_TO_SINK_BUT_NOT_TO_LOGFILE(&sink, WARNING) + << "LOG_TO_SINK_BUT_NOT_TO_LOGFILE: " << "collected warning"; + LOG_TO_SINK_BUT_NOT_TO_LOGFILE(&sink, ERROR) + << "LOG_TO_SINK_BUT_NOT_TO_LOGFILE: " << "collected error"; + + LOG_TO_SINK_BUT_NOT_TO_LOGFILE(no_sink, INFO) + << "LOG_TO_SINK_BUT_NOT_TO_LOGFILE: " << "thrashed info"; + LOG_TO_SINK_BUT_NOT_TO_LOGFILE(no_sink, WARNING) + << "LOG_TO_SINK_BUT_NOT_TO_LOGFILE: " << "thrashed warning"; + LOG_TO_SINK_BUT_NOT_TO_LOGFILE(NULL, ERROR) + << "LOG_TO_SINK_BUT_NOT_TO_LOGFILE: " << "thrashed error"; + + LOG(INFO) << "Captured by LOG_TO_SINK:"; + for (size_t i = 0; i < sink.errors.size(); ++i) { + LogMessage("foo", LogMessage::kNoLogPrefix, INFO).stream() + << sink.errors[i]; + } +} + +// For testing using CHECK*() on anonymous enums. +enum { + CASE_A, + CASE_B +}; + +void TestCHECK() { + // Tests using CHECK*() on int values. + CHECK(1 == 1); + CHECK_EQ(1, 1); + CHECK_NE(1, 2); + CHECK_GE(1, 1); + CHECK_GE(2, 1); + CHECK_LE(1, 1); + CHECK_LE(1, 2); + CHECK_GT(2, 1); + CHECK_LT(1, 2); + + // Tests using CHECK*() on anonymous enums. + // Apple's GCC doesn't like this. +#if !defined(OS_MACOSX) + CHECK_EQ(CASE_A, CASE_A); + CHECK_NE(CASE_A, CASE_B); + CHECK_GE(CASE_A, CASE_A); + CHECK_GE(CASE_B, CASE_A); + CHECK_LE(CASE_A, CASE_A); + CHECK_LE(CASE_A, CASE_B); + CHECK_GT(CASE_B, CASE_A); + CHECK_LT(CASE_A, CASE_B); +#endif +} + +void TestDCHECK() { +#ifdef NDEBUG + DCHECK( 1 == 2 ) << " DCHECK's shouldn't be compiled in normal mode"; +#endif + DCHECK( 1 == 1 ); + DCHECK_EQ(1, 1); + DCHECK_NE(1, 2); + DCHECK_GE(1, 1); + DCHECK_GE(2, 1); + DCHECK_LE(1, 1); + DCHECK_LE(1, 2); + DCHECK_GT(2, 1); + DCHECK_LT(1, 2); + + auto_ptr sptr(new int64); + int64* ptr = DCHECK_NOTNULL(sptr.get()); + CHECK_EQ(ptr, sptr.get()); +} + +void TestSTREQ() { + CHECK_STREQ("this", "this"); + CHECK_STREQ(NULL, NULL); + CHECK_STRCASEEQ("this", "tHiS"); + CHECK_STRCASEEQ(NULL, NULL); + CHECK_STRNE("this", "tHiS"); + CHECK_STRNE("this", NULL); + CHECK_STRCASENE("this", "that"); + CHECK_STRCASENE(NULL, "that"); + CHECK_STREQ((string("a")+"b").c_str(), "ab"); + CHECK_STREQ(string("test").c_str(), + (string("te") + string("st")).c_str()); +} + +TEST(DeathSTREQ, logging) { + ASSERT_DEATH(CHECK_STREQ(NULL, "this"), ""); + ASSERT_DEATH(CHECK_STREQ("this", "siht"), ""); + ASSERT_DEATH(CHECK_STRCASEEQ(NULL, "siht"), ""); + ASSERT_DEATH(CHECK_STRCASEEQ("this", "siht"), ""); + ASSERT_DEATH(CHECK_STRNE(NULL, NULL), ""); + ASSERT_DEATH(CHECK_STRNE("this", "this"), ""); + ASSERT_DEATH(CHECK_STREQ((string("a")+"b").c_str(), "abc"), ""); +} + +TEST(CheckNOTNULL, Simple) { + int64 t; + void *ptr = static_cast(&t); + void *ref = CHECK_NOTNULL(ptr); + EXPECT_EQ(ptr, ref); + CHECK_NOTNULL(reinterpret_cast(ptr)); + CHECK_NOTNULL(reinterpret_cast(ptr)); + CHECK_NOTNULL(reinterpret_cast(ptr)); + CHECK_NOTNULL(reinterpret_cast(ptr)); +} + +TEST(DeathCheckNN, Simple) { + ASSERT_DEATH(CHECK_NOTNULL(static_cast(NULL)), ""); +} + +// Get list of file names that match pattern +static void GetFiles(const string& pattern, vector* files) { + files->clear(); +#if defined(HAVE_GLOB_H) + glob_t g; + const int r = glob(pattern.c_str(), 0, NULL, &g); + CHECK((r == 0) || (r == GLOB_NOMATCH)) << ": error matching " << pattern; + for (int i = 0; i < g.gl_pathc; i++) { + files->push_back(string(g.gl_pathv[i])); + } + globfree(&g); +#elif defined(OS_WINDOWS) + WIN32_FIND_DATAA data; + HANDLE handle = FindFirstFileA(pattern.c_str(), &data); + size_t index = pattern.rfind('\\'); + if (index == string::npos) { + LOG(FATAL) << "No directory separator."; + } + const string dirname = pattern.substr(0, index + 1); + if (FAILED(handle)) { + // Finding no files is OK. + return; + } + do { + files->push_back(dirname + data.cFileName); + } while (FindNextFileA(handle, &data)); + LOG_SYSRESULT(FindClose(handle)); +#else +# error There is no way to do glob. +#endif +} + +// Delete files patching pattern +static void DeleteFiles(const string& pattern) { + vector files; + GetFiles(pattern, &files); + for (size_t i = 0; i < files.size(); i++) { + CHECK(unlink(files[i].c_str()) == 0) << ": " << strerror(errno); + } +} + +static void CheckFile(const string& name, const string& expected_string) { + vector files; + GetFiles(name + "*", &files); + CHECK_EQ(files.size(), 1); + + FILE* file = fopen(files[0].c_str(), "r"); + CHECK(file != NULL) << ": could not open " << files[0]; + char buf[1000]; + while (fgets(buf, sizeof(buf), file) != NULL) { + if (strstr(buf, expected_string.c_str()) != NULL) { + fclose(file); + return; + } + } + fclose(file); + LOG(FATAL) << "Did not find " << expected_string << " in " << files[0]; +} + +static void TestBasename() { + fprintf(stderr, "==== Test setting log file basename\n"); + const string dest = FLAGS_test_tmpdir + "/logging_test_basename"; + DeleteFiles(dest + "*"); + + SetLogDestination(INFO, dest.c_str()); + LOG(INFO) << "message to new base"; + FlushLogFiles(INFO); + + CheckFile(dest, "message to new base"); + + // Release file handle for the destination file to unlock the file in Windows. + LogToStderr(); + DeleteFiles(dest + "*"); +} + +static void TestSymlink() { +#ifndef OS_WINDOWS + fprintf(stderr, "==== Test setting log file symlink\n"); + string dest = FLAGS_test_tmpdir + "/logging_test_symlink"; + string sym = FLAGS_test_tmpdir + "/symlinkbase"; + DeleteFiles(dest + "*"); + DeleteFiles(sym + "*"); + + SetLogSymlink(INFO, "symlinkbase"); + SetLogDestination(INFO, dest.c_str()); + LOG(INFO) << "message to new symlink"; + FlushLogFiles(INFO); + CheckFile(sym, "message to new symlink"); + + DeleteFiles(dest + "*"); + DeleteFiles(sym + "*"); +#endif +} + +static void TestExtension() { + fprintf(stderr, "==== Test setting log file extension\n"); + string dest = FLAGS_test_tmpdir + "/logging_test_extension"; + DeleteFiles(dest + "*"); + + SetLogDestination(INFO, dest.c_str()); + SetLogFilenameExtension("specialextension"); + LOG(INFO) << "message to new extension"; + FlushLogFiles(INFO); + CheckFile(dest, "message to new extension"); + + // Check that file name ends with extension + vector filenames; + GetFiles(dest + "*", &filenames); + CHECK_EQ(filenames.size(), 1); + CHECK(strstr(filenames[0].c_str(), "specialextension") != NULL); + + // Release file handle for the destination file to unlock the file in Windows. + LogToStderr(); + DeleteFiles(dest + "*"); +} + +struct MyLogger : public base::Logger { + string data; + + virtual void Write(bool should_flush, + time_t timestamp, + const char* message, + int length) { + data.append(message, length); + } + + virtual void Flush() { } + + virtual uint32 LogSize() { return data.length(); } +}; + +static void TestWrapper() { + fprintf(stderr, "==== Test log wrapper\n"); + + MyLogger my_logger; + base::Logger* old_logger = base::GetLogger(INFO); + base::SetLogger(INFO, &my_logger); + LOG(INFO) << "Send to wrapped logger"; + FlushLogFiles(INFO); + base::SetLogger(INFO, old_logger); + + CHECK(strstr(my_logger.data.c_str(), "Send to wrapped logger") != NULL); +} + +static void TestErrno() { + fprintf(stderr, "==== Test errno preservation\n"); + + errno = ENOENT; + TestLogging(false); + CHECK_EQ(errno, ENOENT); +} + +static void TestOneTruncate(const char *path, int64 limit, int64 keep, + int64 dsize, int64 ksize, int64 expect) { + int fd; + CHECK_ERR(fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0600)); + + const char *discardstr = "DISCARDME!", *keepstr = "KEEPME!"; + + // Fill the file with the requested data; first discard data, then kept data + int64 written = 0; + while (written < dsize) { + int bytes = min(dsize - written, strlen(discardstr)); + CHECK_ERR(write(fd, discardstr, bytes)); + written += bytes; + } + written = 0; + while (written < ksize) { + int bytes = min(ksize - written, strlen(keepstr)); + CHECK_ERR(write(fd, keepstr, bytes)); + written += bytes; + } + + TruncateLogFile(path, limit, keep); + + // File should now be shorter + struct stat statbuf; + CHECK_ERR(fstat(fd, &statbuf)); + CHECK_EQ(statbuf.st_size, expect); + CHECK_ERR(lseek(fd, 0, SEEK_SET)); + + // File should contain the suffix of the original file + int buf_size = statbuf.st_size + 1; + char* buf = new char[buf_size]; + memset(buf, 0, sizeof(buf)); + CHECK_ERR(read(fd, buf, buf_size)); + + const char *p = buf; + int64 checked = 0; + while (checked < expect) { + int bytes = min(expect - checked, strlen(keepstr)); + CHECK(!memcmp(p, keepstr, bytes)); + checked += bytes; + } + close(fd); + delete[] buf; +} + +static void TestTruncate() { +#ifdef HAVE_UNISTD_H + fprintf(stderr, "==== Test log truncation\n"); + string path = FLAGS_test_tmpdir + "/truncatefile"; + + // Test on a small file + TestOneTruncate(path.c_str(), 10, 10, 10, 10, 10); + + // And a big file (multiple blocks to copy) + TestOneTruncate(path.c_str(), 2<<20, 4<<10, 3<<20, 4<<10, 4<<10); + + // Check edge-case limits + TestOneTruncate(path.c_str(), 10, 20, 0, 20, 20); + TestOneTruncate(path.c_str(), 10, 0, 0, 0, 0); + TestOneTruncate(path.c_str(), 10, 50, 0, 10, 10); + TestOneTruncate(path.c_str(), 50, 100, 0, 30, 30); + + // MacOSX 10.4 doesn't fail in this case. + // Windows doesn't have symlink. + // Let's just ignore this test for these cases. +#if !defined(OS_MACOSX) && !defined(OS_WINDOWS) + // Through a symlink should fail to truncate + string linkname = path + ".link"; + unlink(linkname.c_str()); + CHECK_ERR(symlink(path.c_str(), linkname.c_str())); + TestOneTruncate(linkname.c_str(), 10, 10, 0, 30, 30); +#endif + + // The /proc/self path makes sense only for linux. +#if defined(OS_LINUX) + // Through an open fd symlink should work + int fd; + CHECK_ERR(fd = open(path.c_str(), O_APPEND | O_WRONLY)); + char fdpath[64]; + snprintf(fdpath, sizeof(fdpath), "/proc/self/fd/%d", fd); + TestOneTruncate(fdpath, 10, 10, 10, 10, 10); +#endif + +#endif +} + +_START_GOOGLE_NAMESPACE_ +namespace glog_internal_namespace_ { +extern // in logging.cc +bool SafeFNMatch_(const char* pattern, size_t patt_len, + const char* str, size_t str_len); +} // namespace glog_internal_namespace_ +using glog_internal_namespace_::SafeFNMatch_; +_END_GOOGLE_NAMESPACE_ + +static bool WrapSafeFNMatch(string pattern, string str) { + pattern += "abc"; + str += "defgh"; + return SafeFNMatch_(pattern.data(), pattern.size() - 3, + str.data(), str.size() - 5); +} + +TEST(SafeFNMatch, logging) { + CHECK(WrapSafeFNMatch("foo", "foo")); + CHECK(!WrapSafeFNMatch("foo", "bar")); + CHECK(!WrapSafeFNMatch("foo", "fo")); + CHECK(!WrapSafeFNMatch("foo", "foo2")); + CHECK(WrapSafeFNMatch("bar/foo.ext", "bar/foo.ext")); + CHECK(WrapSafeFNMatch("*ba*r/fo*o.ext*", "bar/foo.ext")); + CHECK(!WrapSafeFNMatch("bar/foo.ext", "bar/baz.ext")); + CHECK(!WrapSafeFNMatch("bar/foo.ext", "bar/foo")); + CHECK(!WrapSafeFNMatch("bar/foo.ext", "bar/foo.ext.zip")); + CHECK(WrapSafeFNMatch("ba?/*.ext", "bar/foo.ext")); + CHECK(WrapSafeFNMatch("ba?/*.ext", "baZ/FOO.ext")); + CHECK(!WrapSafeFNMatch("ba?/*.ext", "barr/foo.ext")); + CHECK(!WrapSafeFNMatch("ba?/*.ext", "bar/foo.ext2")); + CHECK(WrapSafeFNMatch("ba?/*", "bar/foo.ext2")); + CHECK(WrapSafeFNMatch("ba?/*", "bar/")); + CHECK(!WrapSafeFNMatch("ba?/?", "bar/")); + CHECK(!WrapSafeFNMatch("ba?/*", "bar")); +} + +// TestWaitingLogSink will save messages here +// No lock: Accessed only by TestLogSinkWriter thread +// and after its demise by its creator. +static vector global_messages; + +// helper for TestWaitingLogSink below. +// Thread that does the logic of TestWaitingLogSink +// It's free to use LOG() itself. +class TestLogSinkWriter : public Thread { + public: + + TestLogSinkWriter() : should_exit_(false) { + SetJoinable(true); + Start(); + } + + // Just buffer it (can't use LOG() here). + void Buffer(const string& message) { + mutex_.Lock(); + RAW_LOG(INFO, "Buffering"); + messages_.push(message); + mutex_.Unlock(); + RAW_LOG(INFO, "Buffered"); + } + + // Wait for the buffer to clear (can't use LOG() here). + void Wait() { + RAW_LOG(INFO, "Waiting"); + mutex_.Lock(); + while (!NoWork()) { + mutex_.Unlock(); + SleepForMilliseconds(1); + mutex_.Lock(); + } + RAW_LOG(INFO, "Waited"); + mutex_.Unlock(); + } + + // Trigger thread exit. + void Stop() { + MutexLock l(&mutex_); + should_exit_ = true; + } + + private: + + // helpers --------------- + + // For creating a "Condition". + bool NoWork() { return messages_.empty(); } + bool HaveWork() { return !messages_.empty() || should_exit_; } + + // Thread body; CAN use LOG() here! + virtual void Run() { + while (1) { + mutex_.Lock(); + while (!HaveWork()) { + mutex_.Unlock(); + SleepForMilliseconds(1); + mutex_.Lock(); + } + if (should_exit_ && messages_.empty()) { + mutex_.Unlock(); + break; + } + // Give the main thread time to log its message, + // so that we get a reliable log capture to compare to golden file. + // Same for the other sleep below. + SleepForMilliseconds(20); + RAW_LOG(INFO, "Sink got a messages"); // only RAW_LOG under mutex_ here + string message = messages_.front(); + messages_.pop(); + // Normally this would be some more real/involved logging logic + // where LOG() usage can't be eliminated, + // e.g. pushing the message over with an RPC: + int messages_left = messages_.size(); + mutex_.Unlock(); + SleepForMilliseconds(20); + // May not use LOG while holding mutex_, because Buffer() + // acquires mutex_, and Buffer is called from LOG(), + // which has its own internal mutex: + // LOG()->LogToSinks()->TestWaitingLogSink::send()->Buffer() + LOG(INFO) << "Sink is sending out a message: " << message; + LOG(INFO) << "Have " << messages_left << " left"; + global_messages.push_back(message); + } + } + + // data --------------- + + Mutex mutex_; + bool should_exit_; + queue messages_; // messages to be logged +}; + +// A log sink that exercises WaitTillSent: +// it pushes data to a buffer and wakes up another thread to do the logging +// (that other thread can than use LOG() itself), +class TestWaitingLogSink : public LogSink { + public: + + TestWaitingLogSink() { + tid_ = pthread_self(); // for thread-specific behavior + AddLogSink(this); + } + ~TestWaitingLogSink() { + RemoveLogSink(this); + writer_.Stop(); + writer_.Join(); + } + + // (re)define LogSink interface + + virtual void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, + const struct tm* tm_time, + const char* message, size_t message_len) { + // Push it to Writer thread if we are the original logging thread. + // Note: Something like ThreadLocalLogSink is a better choice + // to do thread-specific LogSink logic for real. + if (pthread_equal(tid_, pthread_self())) { + writer_.Buffer(ToString(severity, base_filename, line, + tm_time, message, message_len)); + } + } + virtual void WaitTillSent() { + // Wait for Writer thread if we are the original logging thread. + if (pthread_equal(tid_, pthread_self())) writer_.Wait(); + } + + private: + + pthread_t tid_; + TestLogSinkWriter writer_; +}; + +// Check that LogSink::WaitTillSent can be used in the advertised way. +// We also do golden-stderr comparison. +static void TestLogSinkWaitTillSent() { + { TestWaitingLogSink sink; + // Sleeps give the sink threads time to do all their work, + // so that we get a reliable log capture to compare to the golden file. + LOG(INFO) << "Message 1"; + SleepForMilliseconds(60); + LOG(ERROR) << "Message 2"; + SleepForMilliseconds(60); + LOG(WARNING) << "Message 3"; + SleepForMilliseconds(60); + } + for (size_t i = 0; i < global_messages.size(); ++i) { + LOG(INFO) << "Sink capture: " << global_messages[i]; + } + CHECK_EQ(global_messages.size(), 3); +} + +TEST(Strerror, logging) { + int errcode = EINTR; + char *msg = strdup(strerror(errcode)); + int buf_size = strlen(msg) + 1; + char *buf = new char[buf_size]; + CHECK_EQ(posix_strerror_r(errcode, NULL, 0), -1); + buf[0] = 'A'; + CHECK_EQ(posix_strerror_r(errcode, buf, 0), -1); + CHECK_EQ(buf[0], 'A'); + CHECK_EQ(posix_strerror_r(errcode, NULL, buf_size), -1); +#if defined(OS_MACOSX) || defined(OS_FREEBSD) || defined(OS_OPENBSD) + // MacOSX or FreeBSD considers this case is an error since there is + // no enough space. + CHECK_EQ(posix_strerror_r(errcode, buf, 1), -1); +#else + CHECK_EQ(posix_strerror_r(errcode, buf, 1), 0); +#endif + CHECK_STREQ(buf, ""); + CHECK_EQ(posix_strerror_r(errcode, buf, buf_size), 0); + CHECK_STREQ(buf, msg); + free(msg); + delete[] buf; +} + +// Simple routines to look at the sizes of generated code for LOG(FATAL) and +// CHECK(..) via objdump +void MyFatal() { + LOG(FATAL) << "Failed"; +} +void MyCheck(bool a, bool b) { + CHECK_EQ(a, b); +} + +#ifdef HAVE_LIB_GMOCK + +TEST(DVLog, Basic) { + ScopedMockLog log; + +#if NDEBUG + // We are expecting that nothing is logged. + EXPECT_CALL(log, Log(_, _, _)).Times(0); +#else + EXPECT_CALL(log, Log(INFO, __FILE__, "debug log")); +#endif + + FLAGS_v = 1; + DVLOG(1) << "debug log"; +} + +TEST(DVLog, V0) { + ScopedMockLog log; + + // We are expecting that nothing is logged. + EXPECT_CALL(log, Log(_, _, _)).Times(0); + + FLAGS_v = 0; + DVLOG(1) << "debug log"; +} + +TEST(LogAtLevel, Basic) { + ScopedMockLog log; + + // The function version outputs "logging.h" as a file name. + EXPECT_CALL(log, Log(WARNING, StrNe(__FILE__), "function version")); + EXPECT_CALL(log, Log(INFO, __FILE__, "macro version")); + + int severity = WARNING; + LogAtLevel(severity, "function version"); + + severity = INFO; + // We can use the macro version as a C++ stream. + LOG_AT_LEVEL(severity) << "macro" << ' ' << "version"; +} + +TEST(TestExitOnDFatal, ToBeOrNotToBe) { + // Check the default setting... + EXPECT_TRUE(base::internal::GetExitOnDFatal()); + + // Turn off... + base::internal::SetExitOnDFatal(false); + EXPECT_FALSE(base::internal::GetExitOnDFatal()); + + // We don't die. + { + ScopedMockLog log; + //EXPECT_CALL(log, Log(_, _, _)).Times(AnyNumber()); + // LOG(DFATAL) has severity FATAL if debugging, but is + // downgraded to ERROR if not debugging. + const LogSeverity severity = +#ifdef NDEBUG + ERROR; +#else + FATAL; +#endif + EXPECT_CALL(log, Log(severity, __FILE__, "This should not be fatal")); + LOG(DFATAL) << "This should not be fatal"; + } + + // Turn back on... + base::internal::SetExitOnDFatal(true); + EXPECT_TRUE(base::internal::GetExitOnDFatal()); + +#ifdef GTEST_HAS_DEATH_TEST + // Death comes on little cats' feet. + EXPECT_DEBUG_DEATH({ + LOG(DFATAL) << "This should be fatal in debug mode"; + }, "This should be fatal in debug mode"); +#endif +} + +#ifdef HAVE_STACKTRACE + +static void BacktraceAtHelper() { + LOG(INFO) << "Not me"; + +// The vertical spacing of the next 3 lines is significant. + LOG(INFO) << "Backtrace me"; +} +static int kBacktraceAtLine = __LINE__ - 2; // The line of the LOG(INFO) above + +TEST(LogBacktraceAt, DoesNotBacktraceWhenDisabled) { + StrictMock log; + + FLAGS_log_backtrace_at = ""; + + EXPECT_CALL(log, Log(_, _, "Backtrace me")); + EXPECT_CALL(log, Log(_, _, "Not me")); + + BacktraceAtHelper(); +} + +TEST(LogBacktraceAt, DoesBacktraceAtRightLineWhenEnabled) { + StrictMock log; + + char where[100]; + snprintf(where, 100, "%s:%d", const_basename(__FILE__), kBacktraceAtLine); + FLAGS_log_backtrace_at = where; + + // The LOG at the specified line should include a stacktrace which includes + // the name of the containing function, followed by the log message. + // We use HasSubstr()s instead of ContainsRegex() for environments + // which don't have regexp. + EXPECT_CALL(log, Log(_, _, AllOf(HasSubstr("stacktrace:"), + HasSubstr("BacktraceAtHelper"), + HasSubstr("main"), + HasSubstr("Backtrace me")))); + // Other LOGs should not include a backtrace. + EXPECT_CALL(log, Log(_, _, "Not me")); + + BacktraceAtHelper(); +} + +#endif // HAVE_STACKTRACE + +#endif // HAVE_LIB_GMOCK + +struct UserDefinedClass { + bool operator==(const UserDefinedClass& rhs) const { return true; } +}; + +inline ostream& operator<<(ostream& out, const UserDefinedClass& u) { + out << "OK"; + return out; +} + +TEST(UserDefinedClass, logging) { + UserDefinedClass u; + vector buf; + LOG_STRING(INFO, &buf) << u; + CHECK_EQ(1, buf.size()); + CHECK(buf[0].find("OK") != string::npos); + + // We must be able to compile this. + CHECK_EQ(u, u); +} diff --git a/spotify/breakpad/third_party/glog/src/logging_unittest.err b/spotify/breakpad/third_party/glog/src/logging_unittest.err new file mode 100644 index 000000000..4f80bf5d7 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/logging_unittest.err @@ -0,0 +1,305 @@ +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=2 logtostderr=0 alsologtostderr=0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +WARNING: Logging before InitGoogleLogging() is written to STDERR +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=0 logtostderr=0 alsologtostderr=0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] foo bar 10 3.4 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 1: __SUCCESS__ [0] +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 1 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 4, iteration 1 +WDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 5, iteration 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 1 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log if less than 3 every 2, iteration 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 2 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 3: __ENOENT__ [2] +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 3 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log if less than 3 every 2, iteration 3 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 4 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 4 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 5: __EINTR__ [4] +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 4, iteration 5 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 5 +WDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 5, iteration 6 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 6 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 7: __ENXIO__ [6] +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 7 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 7 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 8 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Plog every 2, iteration 9: __ENOEXEC__ [8] +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 4, iteration 9 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 9 +EDATE TIME__ THREADID logging_unittest.cc:LINE] Log every 3, iteration 10 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Log if every 1, iteration 10 +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if this +IDATE TIME__ THREADID logging_unittest.cc:LINE] array +IDATE TIME__ THREADID logging_unittest.cc:LINE] const array +EDATE TIME__ THREADID logging_unittest.cc:LINE] foo 1000 0000001000 3e8 +no prefix +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo bar 10 3.400000 +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: array +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: const array +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: ptr 0x12345678 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: ptr __NULLP__ +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo 1000 0000001000 3e8 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo 1000 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: foo 1000 +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: RAW_LOG ERROR: The Message was too long! +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: RAW_LOG ERROR: The Message was too long! +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 on +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 1 on +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 2 on +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=0 logtostderr=0 alsologtostderr=0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=1 stderrthreshold=0 logtostderr=0 alsologtostderr=0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=-1 stderrthreshold=0 logtostderr=0 alsologtostderr=0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=1 logtostderr=0 alsologtostderr=0 +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=2 logtostderr=0 alsologtostderr=0 +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=3 logtostderr=0 alsologtostderr=0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=3 logtostderr=1 alsologtostderr=0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=0 stderrthreshold=3 logtostderr=0 alsologtostderr=1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=1 stderrthreshold=1 logtostderr=0 alsologtostderr=0 +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Test: v=1 stderrthreshold=3 logtostderr=0 alsologtostderr=1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: vlog 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if -1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info +WDATE TIME__ THREADID logging_unittest.cc:LINE] log_if warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] log_if info every 1 expr +EDATE TIME__ THREADID logging_unittest.cc:LINE] log_if error every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] vlog_if 0 every 1 expr +IDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_STRING: reported info +WDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_STRING: reported warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_STRING: reported error +IDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_STRING: LOG_STRING: collected info +IDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_STRING: LOG_STRING: collected warning +IDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_STRING: LOG_STRING: collected error +IDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected info +WDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected error +IDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: reported info +WDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: reported warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: reported error +IDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_SINK: +IDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected info +WDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK: collected error +IDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK_BUT_NOT_TO_LOGFILE: collected info +WDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK_BUT_NOT_TO_LOGFILE: collected warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_SINK_BUT_NOT_TO_LOGFILE: collected error +IDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: collected info +IDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_STRING: LOG_TO_STRING: collected info +WDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: collected warning +IDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_STRING: LOG_TO_STRING: collected warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: collected error +IDATE TIME__ THREADID logging_unittest.cc:LINE] Captured by LOG_TO_STRING: LOG_TO_STRING: collected error +IDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: reported info +WDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: reported warning +EDATE TIME__ THREADID logging_unittest.cc:LINE] LOG_TO_STRING: reported error +IDATE TIME__ THREADID logging_unittest.cc:LINE] Message 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffering +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffered +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waiting +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Sink got a messages +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waited +IDATE TIME__ THREADID logging_unittest.cc:LINE] Sink is sending out a message: IDATE TIME__ THREADID logging_unittest.cc:LINE] Message 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Have 0 left +EDATE TIME__ THREADID logging_unittest.cc:LINE] Message 2 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffering +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffered +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waiting +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Sink got a messages +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waited +IDATE TIME__ THREADID logging_unittest.cc:LINE] Sink is sending out a message: EDATE TIME__ THREADID logging_unittest.cc:LINE] Message 2 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Have 0 left +WDATE TIME__ THREADID logging_unittest.cc:LINE] Message 3 +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffering +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Buffered +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waiting +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Sink got a messages +IDATE TIME__ THREADID logging_unittest.cc:LINE] RAW: Waited +IDATE TIME__ THREADID logging_unittest.cc:LINE] Sink is sending out a message: WDATE TIME__ THREADID logging_unittest.cc:LINE] Message 3 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Have 0 left +IDATE TIME__ THREADID logging_unittest.cc:LINE] Sink capture: IDATE TIME__ THREADID logging_unittest.cc:LINE] Message 1 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Sink capture: EDATE TIME__ THREADID logging_unittest.cc:LINE] Message 2 +IDATE TIME__ THREADID logging_unittest.cc:LINE] Sink capture: WDATE TIME__ THREADID logging_unittest.cc:LINE] Message 3 diff --git a/spotify/breakpad/third_party/glog/src/mock-log.h b/spotify/breakpad/third_party/glog/src/mock-log.h new file mode 100644 index 000000000..5b2181150 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/mock-log.h @@ -0,0 +1,155 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Zhanyong Wan +// +// Defines the ScopedMockLog class (using Google C++ Mocking +// Framework), which is convenient for testing code that uses LOG(). + +#ifndef GLOG_SRC_MOCK_LOG_H_ +#define GLOG_SRC_MOCK_LOG_H_ + +// For GOOGLE_NAMESPACE. This must go first so we get _XOPEN_SOURCE. +#include "utilities.h" + +#include + +#include + +#include "glog/logging.h" + +_START_GOOGLE_NAMESPACE_ +namespace glog_testing { + +// A ScopedMockLog object intercepts LOG() messages issued during its +// lifespan. Using this together with Google C++ Mocking Framework, +// it's very easy to test how a piece of code calls LOG(). The +// typical usage: +// +// TEST(FooTest, LogsCorrectly) { +// ScopedMockLog log; +// +// // We expect the WARNING "Something bad!" exactly twice. +// EXPECT_CALL(log, Log(WARNING, _, "Something bad!")) +// .Times(2); +// +// // We allow foo.cc to call LOG(INFO) any number of times. +// EXPECT_CALL(log, Log(INFO, HasSubstr("/foo.cc"), _)) +// .Times(AnyNumber()); +// +// Foo(); // Exercises the code under test. +// } +class ScopedMockLog : public GOOGLE_NAMESPACE::LogSink { + public: + // When a ScopedMockLog object is constructed, it starts to + // intercept logs. + ScopedMockLog() { AddLogSink(this); } + + // When the object is destructed, it stops intercepting logs. + virtual ~ScopedMockLog() { RemoveLogSink(this); } + + // Implements the mock method: + // + // void Log(LogSeverity severity, const string& file_path, + // const string& message); + // + // The second argument to Send() is the full path of the source file + // in which the LOG() was issued. + // + // Note, that in a multi-threaded environment, all LOG() messages from a + // single thread will be handled in sequence, but that cannot be guaranteed + // for messages from different threads. In fact, if the same or multiple + // expectations are matched on two threads concurrently, their actions will + // be executed concurrently as well and may interleave. + MOCK_METHOD3(Log, void(GOOGLE_NAMESPACE::LogSeverity severity, + const std::string& file_path, + const std::string& message)); + + private: + // Implements the send() virtual function in class LogSink. + // Whenever a LOG() statement is executed, this function will be + // invoked with information presented in the LOG(). + // + // The method argument list is long and carries much information a + // test usually doesn't care about, so we trim the list before + // forwarding the call to Log(), which is much easier to use in + // tests. + // + // We still cannot call Log() directly, as it may invoke other LOG() + // messages, either due to Invoke, or due to an error logged in + // Google C++ Mocking Framework code, which would trigger a deadlock + // since a lock is held during send(). + // + // Hence, we save the message for WaitTillSent() which will be called after + // the lock on send() is released, and we'll call Log() inside + // WaitTillSent(). Since while a single send() call may be running at a + // time, multiple WaitTillSent() calls (along with the one send() call) may + // be running simultaneously, we ensure thread-safety of the exchange between + // send() and WaitTillSent(), and that for each message, LOG(), send(), + // WaitTillSent() and Log() are executed in the same thread. + virtual void send(GOOGLE_NAMESPACE::LogSeverity severity, + const char* full_filename, + const char* base_filename, int line, const tm* tm_time, + const char* message, size_t message_len) { + // We are only interested in the log severity, full file name, and + // log message. + message_info_.severity = severity; + message_info_.file_path = full_filename; + message_info_.message = std::string(message, message_len); + } + + // Implements the WaitTillSent() virtual function in class LogSink. + // It will be executed after send() and after the global logging lock is + // released, so calls within it (or rather within the Log() method called + // within) may also issue LOG() statements. + // + // LOG(), send(), WaitTillSent() and Log() will occur in the same thread for + // a given log message. + virtual void WaitTillSent() { + // First, and very importantly, we save a copy of the message being + // processed before calling Log(), since Log() may indirectly call send() + // and WaitTillSent() in the same thread again. + MessageInfo message_info = message_info_; + Log(message_info.severity, message_info.file_path, message_info.message); + } + + // All relevant information about a logged message that needs to be passed + // from send() to WaitTillSent(). + struct MessageInfo { + GOOGLE_NAMESPACE::LogSeverity severity; + std::string file_path; + std::string message; + }; + MessageInfo message_info_; +}; + +} // namespace glog_testing +_END_GOOGLE_NAMESPACE_ + +#endif // GLOG_SRC_MOCK_LOG_H_ diff --git a/spotify/breakpad/third_party/glog/src/mock-log_test.cc b/spotify/breakpad/third_party/glog/src/mock-log_test.cc new file mode 100644 index 000000000..7d58a307c --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/mock-log_test.cc @@ -0,0 +1,106 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Zhanyong Wan + +// Tests the ScopedMockLog class. + +#include "mock-log.h" + +#include + +#include +#include + +namespace { + +using GOOGLE_NAMESPACE::INFO; +using GOOGLE_NAMESPACE::WARNING; +using GOOGLE_NAMESPACE::ERROR; +using GOOGLE_NAMESPACE::glog_testing::ScopedMockLog; +using std::string; +using testing::_; +using testing::HasSubstr; +using testing::InSequence; +using testing::InvokeWithoutArgs; + +// Tests that ScopedMockLog intercepts LOG()s when it's alive. +TEST(ScopedMockLogTest, InterceptsLog) { + ScopedMockLog log; + + InSequence s; + EXPECT_CALL(log, Log(WARNING, HasSubstr("/mock-log_test.cc"), "Fishy.")); + EXPECT_CALL(log, Log(INFO, _, "Working...")) + .Times(2); + EXPECT_CALL(log, Log(ERROR, _, "Bad!!")); + + LOG(WARNING) << "Fishy."; + LOG(INFO) << "Working..."; + LOG(INFO) << "Working..."; + LOG(ERROR) << "Bad!!"; +} + +void LogBranch() { + LOG(INFO) << "Logging a branch..."; +} + +void LogTree() { + LOG(INFO) << "Logging the whole tree..."; +} + +void LogForest() { + LOG(INFO) << "Logging the entire forest."; + LOG(INFO) << "Logging the entire forest.."; + LOG(INFO) << "Logging the entire forest..."; +} + +// The purpose of the following test is to verify that intercepting logging +// continues to work properly if a LOG statement is executed within the scope +// of a mocked call. +TEST(ScopedMockLogTest, LogDuringIntercept) { + ScopedMockLog log; + InSequence s; + EXPECT_CALL(log, Log(INFO, __FILE__, "Logging a branch...")) + .WillOnce(InvokeWithoutArgs(LogTree)); + EXPECT_CALL(log, Log(INFO, __FILE__, "Logging the whole tree...")) + .WillOnce(InvokeWithoutArgs(LogForest)); + EXPECT_CALL(log, Log(INFO, __FILE__, "Logging the entire forest.")); + EXPECT_CALL(log, Log(INFO, __FILE__, "Logging the entire forest..")); + EXPECT_CALL(log, Log(INFO, __FILE__, "Logging the entire forest...")); + LogBranch(); +} + +} // namespace + +int main(int argc, char **argv) { + GOOGLE_NAMESPACE::InitGoogleLogging(argv[0]); + testing::InitGoogleMock(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/glog/src/raw_logging.cc b/spotify/breakpad/third_party/glog/src/raw_logging.cc new file mode 100644 index 000000000..50c6a7199 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/raw_logging.cc @@ -0,0 +1,172 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Maxim Lifantsev +// +// logging_unittest.cc covers the functionality herein + +#include "utilities.h" + +#include +#include +#include +#ifdef HAVE_UNISTD_H +# include // for close() and write() +#endif +#include // for open() +#include +#include "config.h" +#include "glog/logging.h" // To pick up flag settings etc. +#include "glog/raw_logging.h" +#include "base/commandlineflags.h" + +#ifdef HAVE_STACKTRACE +# include "stacktrace.h" +#endif + +#if defined(HAVE_SYSCALL_H) +#include // for syscall() +#elif defined(HAVE_SYS_SYSCALL_H) +#include // for syscall() +#endif +#ifdef HAVE_UNISTD_H +# include +#endif + +#if defined(HAVE_SYSCALL_H) || defined(HAVE_SYS_SYSCALL_H) +# define safe_write(fd, s, len) syscall(SYS_write, fd, s, len) +#else + // Not so safe, but what can you do? +# define safe_write(fd, s, len) write(fd, s, len) +#endif + +_START_GOOGLE_NAMESPACE_ + +// Data for RawLog__ below. We simply pick up the latest +// time data created by a normal log message to avoid calling +// localtime_r which can allocate memory. +static struct ::tm last_tm_time_for_raw_log; +static int last_usecs_for_raw_log; + +void RawLog__SetLastTime(const struct ::tm& t, int usecs) { + memcpy(&last_tm_time_for_raw_log, &t, sizeof(last_tm_time_for_raw_log)); + last_usecs_for_raw_log = usecs; +} + +// CAVEAT: vsnprintf called from *DoRawLog below has some (exotic) code paths +// that invoke malloc() and getenv() that might acquire some locks. +// If this becomes a problem we should reimplement a subset of vsnprintf +// that does not need locks and malloc. + +// Helper for RawLog__ below. +// *DoRawLog writes to *buf of *size and move them past the written portion. +// It returns true iff there was no overflow or error. +static bool DoRawLog(char** buf, int* size, const char* format, ...) { + va_list ap; + va_start(ap, format); + int n = vsnprintf(*buf, *size, format, ap); + va_end(ap); + if (n < 0 || n > *size) return false; + *size -= n; + *buf += n; + return true; +} + +// Helper for RawLog__ below. +inline static bool VADoRawLog(char** buf, int* size, + const char* format, va_list ap) { + int n = vsnprintf(*buf, *size, format, ap); + if (n < 0 || n > *size) return false; + *size -= n; + *buf += n; + return true; +} + +static const int kLogBufSize = 3000; +static bool crashed = false; +static CrashReason crash_reason; +static char crash_buf[kLogBufSize + 1] = { 0 }; // Will end in '\0' + +void RawLog__(LogSeverity severity, const char* file, int line, + const char* format, ...) { + if (!(FLAGS_logtostderr || severity >= FLAGS_stderrthreshold || + FLAGS_alsologtostderr || !IsGoogleLoggingInitialized())) { + return; // this stderr log message is suppressed + } + // can't call localtime_r here: it can allocate + struct ::tm& t = last_tm_time_for_raw_log; + char buffer[kLogBufSize]; + char* buf = buffer; + int size = sizeof(buffer); + + // NOTE: this format should match the specification in base/logging.h + DoRawLog(&buf, &size, "%c%02d%02d %02d:%02d:%02d.%06d %5u %s:%d] RAW: ", + LogSeverityNames[severity][0], + 1 + t.tm_mon, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec, + last_usecs_for_raw_log, + static_cast(GetTID()), + const_basename(const_cast(file)), line); + + // Record the position and size of the buffer after the prefix + const char* msg_start = buf; + const int msg_size = size; + + va_list ap; + va_start(ap, format); + bool no_chop = VADoRawLog(&buf, &size, format, ap); + va_end(ap); + if (no_chop) { + DoRawLog(&buf, &size, "\n"); + } else { + DoRawLog(&buf, &size, "RAW_LOG ERROR: The Message was too long!\n"); + } + // We make a raw syscall to write directly to the stderr file descriptor, + // avoiding FILE buffering (to avoid invoking malloc()), and bypassing + // libc (to side-step any libc interception). + // We write just once to avoid races with other invocations of RawLog__. + safe_write(STDERR_FILENO, buffer, strlen(buffer)); + if (severity == FATAL) { + if (!sync_val_compare_and_swap(&crashed, false, true)) { + crash_reason.filename = file; + crash_reason.line_number = line; + memcpy(crash_buf, msg_start, msg_size); // Don't include prefix + crash_reason.message = crash_buf; +#ifdef HAVE_STACKTRACE + crash_reason.depth = + GetStackTrace(crash_reason.stack, ARRAYSIZE(crash_reason.stack), 1); +#else + crash_reason.depth = 0; +#endif + SetCrashReason(&crash_reason); + } + LogMessage::Fail(); // abort() + } +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/signalhandler.cc b/spotify/breakpad/third_party/glog/src/signalhandler.cc new file mode 100644 index 000000000..7c8fe5742 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/signalhandler.cc @@ -0,0 +1,350 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// +// Implementation of InstallFailureSignalHandler(). + +#include "utilities.h" +#include "stacktrace.h" +#include "symbolize.h" +#include "glog/logging.h" + +#include +#include +#ifdef HAVE_UCONTEXT_H +# include +#endif +#ifdef HAVE_SYS_UCONTEXT_H +# include +#endif +#include + +_START_GOOGLE_NAMESPACE_ + +namespace { + +// We'll install the failure signal handler for these signals. We could +// use strsignal() to get signal names, but we don't use it to avoid +// introducing yet another #ifdef complication. +// +// The list should be synced with the comment in signalhandler.h. +const struct { + int number; + const char *name; +} kFailureSignals[] = { + { SIGSEGV, "SIGSEGV" }, + { SIGILL, "SIGILL" }, + { SIGFPE, "SIGFPE" }, + { SIGABRT, "SIGABRT" }, + { SIGBUS, "SIGBUS" }, + { SIGTERM, "SIGTERM" }, +}; + +// Returns the program counter from signal context, NULL if unknown. +void* GetPC(void* ucontext_in_void) { +#if (defined(HAVE_UCONTEXT_H) || defined(HAVE_SYS_UCONTEXT_H)) && defined(PC_FROM_UCONTEXT) + if (ucontext_in_void != NULL) { + ucontext_t *context = reinterpret_cast(ucontext_in_void); + return (void*)context->PC_FROM_UCONTEXT; + } +#endif + return NULL; +} + +// The class is used for formatting error messages. We don't use printf() +// as it's not async signal safe. +class MinimalFormatter { + public: + MinimalFormatter(char *buffer, int size) + : buffer_(buffer), + cursor_(buffer), + end_(buffer + size) { + } + + // Returns the number of bytes written in the buffer. + int num_bytes_written() const { return cursor_ - buffer_; } + + // Appends string from "str" and updates the internal cursor. + void AppendString(const char* str) { + int i = 0; + while (str[i] != '\0' && cursor_ + i < end_) { + cursor_[i] = str[i]; + ++i; + } + cursor_ += i; + } + + // Formats "number" in "radix" and updates the internal cursor. + // Lowercase letters are used for 'a' - 'z'. + void AppendUint64(uint64 number, int radix) { + int i = 0; + while (cursor_ + i < end_) { + const int tmp = number % radix; + number /= radix; + cursor_[i] = (tmp < 10 ? '0' + tmp : 'a' + tmp - 10); + ++i; + if (number == 0) { + break; + } + } + // Reverse the bytes written. + std::reverse(cursor_, cursor_ + i); + cursor_ += i; + } + + // Formats "number" as hexadecimal number, and updates the internal + // cursor. Padding will be added in front if needed. + void AppendHexWithPadding(uint64 number, int width) { + char* start = cursor_; + AppendString("0x"); + AppendUint64(number, 16); + // Move to right and add padding in front if needed. + if (cursor_ < start + width) { + const int64 delta = start + width - cursor_; + std::copy(start, cursor_, start + delta); + std::fill(start, start + delta, ' '); + cursor_ = start + width; + } + } + + private: + char *buffer_; + char *cursor_; + const char * const end_; +}; + +// Writes the given data with the size to the standard error. +void WriteToStderr(const char* data, int size) { + if (write(STDERR_FILENO, data, size) < 0) { + // Ignore errors. + } +} + +// The writer function can be changed by InstallFailureWriter(). +void (*g_failure_writer)(const char* data, int size) = WriteToStderr; + +// Dumps time information. We don't dump human-readable time information +// as localtime() is not guaranteed to be async signal safe. +void DumpTimeInfo() { + time_t time_in_sec = time(NULL); + char buf[256]; // Big enough for time info. + MinimalFormatter formatter(buf, sizeof(buf)); + formatter.AppendString("*** Aborted at "); + formatter.AppendUint64(time_in_sec, 10); + formatter.AppendString(" (unix time)"); + formatter.AppendString(" try \"date -d @"); + formatter.AppendUint64(time_in_sec, 10); + formatter.AppendString("\" if you are using GNU date ***\n"); + g_failure_writer(buf, formatter.num_bytes_written()); +} + +// Dumps information about the signal to STDERR. +void DumpSignalInfo(int signal_number, siginfo_t *siginfo) { + // Get the signal name. + const char* signal_name = NULL; + for (int i = 0; i < ARRAYSIZE(kFailureSignals); ++i) { + if (signal_number == kFailureSignals[i].number) { + signal_name = kFailureSignals[i].name; + } + } + + char buf[256]; // Big enough for signal info. + MinimalFormatter formatter(buf, sizeof(buf)); + + formatter.AppendString("*** "); + if (signal_name) { + formatter.AppendString(signal_name); + } else { + // Use the signal number if the name is unknown. The signal name + // should be known, but just in case. + formatter.AppendString("Signal "); + formatter.AppendUint64(signal_number, 10); + } + formatter.AppendString(" (@0x"); + formatter.AppendUint64(reinterpret_cast(siginfo->si_addr), 16); + formatter.AppendString(")"); + formatter.AppendString(" received by PID "); + formatter.AppendUint64(getpid(), 10); + formatter.AppendString(" (TID 0x"); + // We assume pthread_t is an integral number or a pointer, rather + // than a complex struct. In some environments, pthread_self() + // returns an uint64 but in some other environments pthread_self() + // returns a pointer. Hence we use C-style cast here, rather than + // reinterpret/static_cast, to support both types of environments. + formatter.AppendUint64((uintptr_t)pthread_self(), 16); + formatter.AppendString(") "); + // Only linux has the PID of the signal sender in si_pid. +#ifdef OS_LINUX + formatter.AppendString("from PID "); + formatter.AppendUint64(siginfo->si_pid, 10); + formatter.AppendString("; "); +#endif + formatter.AppendString("stack trace: ***\n"); + g_failure_writer(buf, formatter.num_bytes_written()); +} + +// Dumps information about the stack frame to STDERR. +void DumpStackFrameInfo(const char* prefix, void* pc) { + // Get the symbol name. + const char *symbol = "(unknown)"; + char symbolized[1024]; // Big enough for a sane symbol. + // Symbolizes the previous address of pc because pc may be in the + // next function. + if (Symbolize(reinterpret_cast(pc) - 1, + symbolized, sizeof(symbolized))) { + symbol = symbolized; + } + + char buf[1024]; // Big enough for stack frame info. + MinimalFormatter formatter(buf, sizeof(buf)); + + formatter.AppendString(prefix); + formatter.AppendString("@ "); + const int width = 2 * sizeof(void*) + 2; // + 2 for "0x". + formatter.AppendHexWithPadding(reinterpret_cast(pc), width); + formatter.AppendString(" "); + formatter.AppendString(symbol); + formatter.AppendString("\n"); + g_failure_writer(buf, formatter.num_bytes_written()); +} + +// Invoke the default signal handler. +void InvokeDefaultSignalHandler(int signal_number) { + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sig_action.sa_handler = SIG_DFL; + sigaction(signal_number, &sig_action, NULL); + kill(getpid(), signal_number); +} + +// This variable is used for protecting FailureSignalHandler() from +// dumping stuff while another thread is doing it. Our policy is to let +// the first thread dump stuff and let other threads wait. +// See also comments in FailureSignalHandler(). +static pthread_t* g_entered_thread_id_pointer = NULL; + +// Dumps signal and stack frame information, and invokes the default +// signal handler once our job is done. +void FailureSignalHandler(int signal_number, + siginfo_t *signal_info, + void *ucontext) { + // First check if we've already entered the function. We use an atomic + // compare and swap operation for platforms that support it. For other + // platforms, we use a naive method that could lead to a subtle race. + + // We assume pthread_self() is async signal safe, though it's not + // officially guaranteed. + pthread_t my_thread_id = pthread_self(); + // NOTE: We could simply use pthread_t rather than pthread_t* for this, + // if pthread_self() is guaranteed to return non-zero value for thread + // ids, but there is no such guarantee. We need to distinguish if the + // old value (value returned from __sync_val_compare_and_swap) is + // different from the original value (in this case NULL). + pthread_t* old_thread_id_pointer = + glog_internal_namespace_::sync_val_compare_and_swap( + &g_entered_thread_id_pointer, + static_cast(NULL), + &my_thread_id); + if (old_thread_id_pointer != NULL) { + // We've already entered the signal handler. What should we do? + if (pthread_equal(my_thread_id, *g_entered_thread_id_pointer)) { + // It looks the current thread is reentering the signal handler. + // Something must be going wrong (maybe we are reentering by another + // type of signal?). Kill ourself by the default signal handler. + InvokeDefaultSignalHandler(signal_number); + } + // Another thread is dumping stuff. Let's wait until that thread + // finishes the job and kills the process. + while (true) { + sleep(1); + } + } + // This is the first time we enter the signal handler. We are going to + // do some interesting stuff from here. + // TODO(satorux): We might want to set timeout here using alarm(), but + // mixing alarm() and sleep() can be a bad idea. + + // First dump time info. + DumpTimeInfo(); + + // Get the program counter from ucontext. + void *pc = GetPC(ucontext); + DumpStackFrameInfo("PC: ", pc); + +#ifdef HAVE_STACKTRACE + // Get the stack traces. + void *stack[32]; + // +1 to exclude this function. + const int depth = GetStackTrace(stack, ARRAYSIZE(stack), 1); + DumpSignalInfo(signal_number, signal_info); + // Dump the stack traces. + for (int i = 0; i < depth; ++i) { + DumpStackFrameInfo(" ", stack[i]); + } +#endif + + // *** TRANSITION *** + // + // BEFORE this point, all code must be async-termination-safe! + // (See WARNING above.) + // + // AFTER this point, we do unsafe things, like using LOG()! + // The process could be terminated or hung at any time. We try to + // do more useful things first and riskier things later. + + // Flush the logs before we do anything in case 'anything' + // causes problems. + FlushLogFilesUnsafe(0); + + // Kill ourself by the default signal handler. + InvokeDefaultSignalHandler(signal_number); +} + +} // namespace + +void InstallFailureSignalHandler() { + // Build the sigaction struct. + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sig_action.sa_flags |= SA_SIGINFO; + sig_action.sa_sigaction = &FailureSignalHandler; + + for (int i = 0; i < ARRAYSIZE(kFailureSignals); ++i) { + CHECK_ERR(sigaction(kFailureSignals[i].number, &sig_action, NULL)); + } +} + +void InstallFailureWriter(void (*writer)(const char* data, int size)) { + g_failure_writer = writer; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc b/spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc new file mode 100644 index 000000000..1cd0fa010 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc @@ -0,0 +1,97 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// +// This is a helper binary for testing signalhandler.cc. The actual test +// is done in signalhandler_unittest.sh. + +#include "utilities.h" + +#include +#include +#include +#include +#include +#include "glog/logging.h" + +using namespace GOOGLE_NAMESPACE; + +void* DieInThread(void*) { + // We assume pthread_t is an integral number or a pointer, rather + // than a complex struct. In some environments, pthread_self() + // returns an uint64 but in some other environments pthread_self() + // returns a pointer. Hence we use C-style cast here, rather than + // reinterpret/static_cast, to support both types of environments. + fprintf(stderr, "0x%lx is dying\n", (long)pthread_self()); + // Use volatile to prevent from these to be optimized away. + volatile int a = 0; + volatile int b = 1 / a; + fprintf(stderr, "We should have died: b=%d\n", b); + return NULL; +} + +void WriteToStdout(const char* data, int size) { + if (write(STDOUT_FILENO, data, size) < 0) { + // Ignore errors. + } +} + +int main(int argc, char **argv) { +#if defined(HAVE_STACKTRACE) && defined(HAVE_SYMBOLIZE) + InitGoogleLogging(argv[0]); +#ifdef HAVE_LIB_GFLAGS + ParseCommandLineFlags(&argc, &argv, true); +#endif + InstallFailureSignalHandler(); + const std::string command = argc > 1 ? argv[1] : "none"; + if (command == "segv") { + // We'll check if this is outputted. + LOG(INFO) << "create the log file"; + LOG(INFO) << "a message before segv"; + // We assume 0xDEAD is not writable. + int *a = (int*)0xDEAD; + *a = 0; + } else if (command == "loop") { + fprintf(stderr, "looping\n"); + while (true); + } else if (command == "die_in_thread") { + pthread_t thread; + pthread_create(&thread, NULL, &DieInThread, NULL); + pthread_join(thread, NULL); + } else if (command == "dump_to_stdout") { + InstallFailureWriter(WriteToStdout); + abort(); + } else { + // Tell the shell script + puts("OK"); + } +#endif + return 0; +} diff --git a/spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh b/spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh new file mode 100755 index 000000000..3b57b05d4 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh @@ -0,0 +1,131 @@ +#! /bin/sh +# +# Copyright (c) 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Author: Satoru Takabayashi +# +# Unit tests for signalhandler.cc. + +die () { + echo $1 + exit 1 +} + +BINDIR=".libs" +LIBGLOG="$BINDIR/libglog.so" + +BINARY="$BINDIR/signalhandler_unittest" +LOG_INFO="./signalhandler_unittest.INFO" + +# Remove temporary files. +rm -f signalhandler.out* + +if test -e "$BINARY"; then + # We need shared object. + export LD_LIBRARY_PATH=$BINDIR + export DYLD_LIBRARY_PATH=$BINDIR +else + # For windows + BINARY="./signalhandler_unittest.exe" + if ! test -e "$BINARY"; then + echo "We coundn't find demangle_unittest binary." + exit 1 + fi +fi + +if [ x`$BINARY` != 'xOK' ]; then + echo "PASS (No stacktrace support. We don't run this test.)" + exit 0 +fi + +# The PC cannot be obtained in signal handlers on PowerPC correctly. +# We just skip the test for PowerPC. +if [ x`uname -p` = x"powerpc" ]; then + echo "PASS (We don't test the signal handler on PowerPC.)" + exit 0 +fi + +# Test for a case the program kills itself by SIGSEGV. +GOOGLE_LOG_DIR=. $BINARY segv 2> signalhandler.out1 +for pattern in SIGSEGV 0xdead main "Aborted at [0-9]"; do + if ! grep --quiet "$pattern" signalhandler.out1; then + die "'$pattern' should appear in the output" + fi +done +if ! grep --quiet "a message before segv" $LOG_INFO; then + die "'a message before segv' should appear in the INFO log" +fi +rm -f $LOG_INFO + +# Test for a case the program is killed by this shell script. +# $! = the process id of the last command run in the background. +# $$ = the process id of this shell. +$BINARY loop 2> signalhandler.out2 & +# Wait until "looping" is written in the file. This indicates the program +# is ready to accept signals. +while true; do + if grep --quiet looping signalhandler.out2; then + break + fi +done +kill -TERM $! +wait $! + +from_pid='' +# Only linux has the process ID of the signal sender. +if [ x`uname` = "xLinux" ]; then + from_pid="from PID $$" +fi +for pattern in SIGTERM "by PID $!" "$from_pid" main "Aborted at [0-9]"; do + if ! grep --quiet "$pattern" signalhandler.out2; then + die "'$pattern' should appear in the output" + fi +done + +# Test for a case the program dies in a non-main thread. +$BINARY die_in_thread 2> signalhandler.out3 +EXPECTED_TID="`sed 's/ .*//' signalhandler.out3`" + +for pattern in SIGFPE DieInThread "TID $EXPECTED_TID" "Aborted at [0-9]"; do + if ! grep --quiet "$pattern" signalhandler.out3; then + die "'$pattern' should appear in the output" + fi +done + +# Test for a case the program installs a custom failure writer that writes +# stuff to stdout instead of stderr. +$BINARY dump_to_stdout 1> signalhandler.out4 +for pattern in SIGABRT main "Aborted at [0-9]"; do + if ! grep --quiet "$pattern" signalhandler.out4; then + die "'$pattern' should appear in the output" + fi +done + +echo PASS diff --git a/spotify/breakpad/third_party/glog/src/stacktrace.h b/spotify/breakpad/third_party/glog/src/stacktrace.h new file mode 100644 index 000000000..8c3e8fe8f --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stacktrace.h @@ -0,0 +1,60 @@ +// Copyright (c) 2000 - 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Routines to extract the current stack trace. These functions are +// thread-safe. + +#ifndef BASE_STACKTRACE_H_ +#define BASE_STACKTRACE_H_ + +#include "config.h" + +_START_GOOGLE_NAMESPACE_ + +// This is similar to the GetStackFrames routine, except that it returns +// the stack trace only, and not the stack frame sizes as well. +// Example: +// main() { foo(); } +// foo() { bar(); } +// bar() { +// void* result[10]; +// int depth = GetStackFrames(result, 10, 1); +// } +// +// This produces: +// result[0] foo +// result[1] main +// .... ... +// +// "result" must not be NULL. +extern int GetStackTrace(void** result, int max_depth, int skip_count); + +_END_GOOGLE_NAMESPACE_ + +#endif // BASE_STACKTRACE_H_ diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h b/spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h new file mode 100644 index 000000000..fad81d3e3 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h @@ -0,0 +1,59 @@ +// Copyright (c) 2000 - 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Portable implementation - just use glibc +// +// Note: The glibc implementation may cause a call to malloc. +// This can cause a deadlock in HeapProfiler. +#include +#include +#include "stacktrace.h" + +_START_GOOGLE_NAMESPACE_ + +// If you change this function, also change GetStackFrames below. +int GetStackTrace(void** result, int max_depth, int skip_count) { + static const int kStackLength = 64; + void * stack[kStackLength]; + int size; + + size = backtrace(stack, kStackLength); + skip_count++; // we want to skip the current frame as well + int result_count = size - skip_count; + if (result_count < 0) + result_count = 0; + if (result_count > max_depth) + result_count = max_depth; + for (int i = 0; i < result_count; i++) + result[i] = stack[i + skip_count]; + + return result_count; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h b/spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h new file mode 100644 index 000000000..0dc14c650 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h @@ -0,0 +1,87 @@ +// Copyright (c) 2005 - 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Arun Sharma +// +// Produce stack trace using libunwind + +#include "utilities.h" + +extern "C" { +#define UNW_LOCAL_ONLY +#include +} +#include "glog/raw_logging.h" +#include "stacktrace.h" + +_START_GOOGLE_NAMESPACE_ + +// Sometimes, we can try to get a stack trace from within a stack +// trace, because libunwind can call mmap (maybe indirectly via an +// internal mmap based memory allocator), and that mmap gets trapped +// and causes a stack-trace request. If were to try to honor that +// recursive request, we'd end up with infinite recursion or deadlock. +// Luckily, it's safe to ignore those subsequent traces. In such +// cases, we return 0 to indicate the situation. +static bool g_now_entering = false; + +// If you change this function, also change GetStackFrames below. +int GetStackTrace(void** result, int max_depth, int skip_count) { + void *ip; + int n = 0; + unw_cursor_t cursor; + unw_context_t uc; + + if (sync_val_compare_and_swap(&g_now_entering, false, true)) { + return 0; + } + + unw_getcontext(&uc); + RAW_CHECK(unw_init_local(&cursor, &uc) >= 0, "unw_init_local failed"); + skip_count++; // Do not include the "GetStackTrace" frame + + while (n < max_depth) { + int ret = unw_get_reg(&cursor, UNW_REG_IP, (unw_word_t *) &ip); + if (ret < 0) + break; + if (skip_count > 0) { + skip_count--; + } else { + result[n++] = ip; + } + ret = unw_step(&cursor); + if (ret <= 0) + break; + } + + g_now_entering = false; + return n; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h b/spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h new file mode 100644 index 000000000..1090ddedb --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h @@ -0,0 +1,130 @@ +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Craig Silverstein +// +// Produce stack trace. I'm guessing (hoping!) the code is much like +// for x86. For apple machines, at least, it seems to be; see +// http://developer.apple.com/documentation/mac/runtimehtml/RTArch-59.html +// http://www.linux-foundation.org/spec/ELF/ppc64/PPC-elf64abi-1.9.html#STACK +// Linux has similar code: http://patchwork.ozlabs.org/linuxppc/patch?id=8882 + +#include +#include // for uintptr_t +#include "stacktrace.h" + +_START_GOOGLE_NAMESPACE_ + +// Given a pointer to a stack frame, locate and return the calling +// stackframe, or return NULL if no stackframe can be found. Perform sanity +// checks (the strictness of which is controlled by the boolean parameter +// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned. +template +static void **NextStackFrame(void **old_sp) { + void **new_sp = (void **) *old_sp; + + // Check that the transition from frame pointer old_sp to frame + // pointer new_sp isn't clearly bogus + if (STRICT_UNWINDING) { + // With the stack growing downwards, older stack frame must be + // at a greater address that the current one. + if (new_sp <= old_sp) return NULL; + // Assume stack frames larger than 100,000 bytes are bogus. + if ((uintptr_t)new_sp - (uintptr_t)old_sp > 100000) return NULL; + } else { + // In the non-strict mode, allow discontiguous stack frames. + // (alternate-signal-stacks for example). + if (new_sp == old_sp) return NULL; + // And allow frames upto about 1MB. + if ((new_sp > old_sp) + && ((uintptr_t)new_sp - (uintptr_t)old_sp > 1000000)) return NULL; + } + if ((uintptr_t)new_sp & (sizeof(void *) - 1)) return NULL; + return new_sp; +} + +// This ensures that GetStackTrace stes up the Link Register properly. +void StacktracePowerPCDummyFunction() __attribute__((noinline)); +void StacktracePowerPCDummyFunction() { __asm__ volatile(""); } + +// If you change this function, also change GetStackFrames below. +int GetStackTrace(void** result, int max_depth, int skip_count) { + void **sp; + // Apple OS X uses an old version of gnu as -- both Darwin 7.9.0 (Panther) + // and Darwin 8.8.1 (Tiger) use as 1.38. This means we have to use a + // different asm syntax. I don't know quite the best way to discriminate + // systems using the old as from the new one; I've gone with __APPLE__. +#ifdef __APPLE__ + __asm__ volatile ("mr %0,r1" : "=r" (sp)); +#else + __asm__ volatile ("mr %0,1" : "=r" (sp)); +#endif + + // On PowerPC, the "Link Register" or "Link Record" (LR), is a stack + // entry that holds the return address of the subroutine call (what + // instruction we run after our function finishes). This is the + // same as the stack-pointer of our parent routine, which is what we + // want here. While the compiler will always(?) set up LR for + // subroutine calls, it may not for leaf functions (such as this one). + // This routine forces the compiler (at least gcc) to push it anyway. + StacktracePowerPCDummyFunction(); + + // The LR save area is used by the callee, so the top entry is bogus. + skip_count++; + + int n = 0; + while (sp && n < max_depth) { + if (skip_count > 0) { + skip_count--; + } else { + // PowerPC has 3 main ABIs, which say where in the stack the + // Link Register is. For DARWIN and AIX (used by apple and + // linux ppc64), it's in sp[2]. For SYSV (used by linux ppc), + // it's in sp[1]. +#if defined(_CALL_AIX) || defined(_CALL_DARWIN) + result[n++] = *(sp+2); +#elif defined(_CALL_SYSV) + result[n++] = *(sp+1); +#elif defined(__APPLE__) || (defined(__linux) && defined(__PPC64__)) + // This check is in case the compiler doesn't define _CALL_AIX/etc. + result[n++] = *(sp+2); +#elif defined(__linux) + // This check is in case the compiler doesn't define _CALL_SYSV. + result[n++] = *(sp+1); +#else +#error Need to specify the PPC ABI for your archiecture. +#endif + } + // Use strict unwinding rules. + sp = NextStackFrame(sp); + } + return n; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc b/spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc new file mode 100644 index 000000000..0acd2c9af --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc @@ -0,0 +1,157 @@ +// Copyright (c) 2004, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "utilities.h" + +#include +#include +#include "config.h" +#include "base/commandlineflags.h" +#include "glog/logging.h" +#include "stacktrace.h" + +#ifdef HAVE_EXECINFO_H +# include +#endif + +using namespace GOOGLE_NAMESPACE; + +#ifdef HAVE_STACKTRACE + +// Obtain a backtrace, verify that the expected callers are present in the +// backtrace, and maybe print the backtrace to stdout. + +//-----------------------------------------------------------------------// +void CheckStackTraceLeaf(); +void CheckStackTrace4(int i); +void CheckStackTrace3(int i); +void CheckStackTrace2(int i); +void CheckStackTrace1(int i); +void CheckStackTrace(int i); +//-----------------------------------------------------------------------// + +// The sequence of functions whose return addresses we expect to see in the +// backtrace. +const int BACKTRACE_STEPS = 6; +void * expected_stack[BACKTRACE_STEPS] = { + (void *) &CheckStackTraceLeaf, + (void *) &CheckStackTrace4, + (void *) &CheckStackTrace3, + (void *) &CheckStackTrace2, + (void *) &CheckStackTrace1, + (void *) &CheckStackTrace, +}; + +// Depending on the architecture/compiler/libraries, (not sure which) +// the current function may or may not appear in the backtrace. +// For gcc-2: +// +// stack[0] is ret addr within CheckStackTrace4 +// stack[1] is ret addr within CheckStackTrace3 +// stack[2] is ret addr within CheckStackTrace2 +// stack[3] is ret addr within CheckStackTrace1 +// stack[4] is ret addr within CheckStackTrace +// +// For gcc3-k8: +// +// stack[0] is ret addr within CheckStackTraceLeaf +// stack[1] is ret addr within CheckStackTrace4 +// ... +// stack[5] is ret addr within CheckStackTrace + +//-----------------------------------------------------------------------// + +const int kMaxFnLen = 0x40; // assume relevant functions are only this long + +void CheckRetAddrIsInFunction( void * ret_addr, void * function_start_addr) +{ + CHECK_GE(ret_addr, function_start_addr); + CHECK_LE(ret_addr, (void *) ((char *) function_start_addr + kMaxFnLen)); +} + +//-----------------------------------------------------------------------// + +void CheckStackTraceLeaf(void) { + const int STACK_LEN = 10; + void *stack[STACK_LEN]; + int size; + + size = GetStackTrace(stack, STACK_LEN, 0); + printf("Obtained %d stack frames.\n", size); + CHECK_LE(size, STACK_LEN); + + if (1) { +#ifdef HAVE_EXECINFO_H + char **strings = backtrace_symbols(stack, size); + printf("Obtained %d stack frames.\n", size); + for (int i = 0; i < size; i++) + printf("%s %p\n", strings[i], stack[i]); + printf("CheckStackTrace() addr: %p\n", &CheckStackTrace); + free(strings); +#endif + } + for (int i = 0; i < BACKTRACE_STEPS; i++) { + printf("Backtrace %d: expected: %p..%p actual: %p ... ", + i, expected_stack[i], + reinterpret_cast(expected_stack[i]) + kMaxFnLen, stack[i]); + CheckRetAddrIsInFunction(stack[i], expected_stack[i]); + printf("OK\n"); + } + + // Check if the second stacktrace returns the same size. + CHECK_EQ(size, GetStackTrace(stack, STACK_LEN, 0)); +} + +//-----------------------------------------------------------------------// + +/* Dummy functions to make the backtrace more interesting. */ +void CheckStackTrace4(int i) { for (int j = i; j >= 0; j--) CheckStackTraceLeaf(); } +void CheckStackTrace3(int i) { for (int j = i; j >= 0; j--) CheckStackTrace4(j); } +void CheckStackTrace2(int i) { for (int j = i; j >= 0; j--) CheckStackTrace3(j); } +void CheckStackTrace1(int i) { for (int j = i; j >= 0; j--) CheckStackTrace2(j); } +void CheckStackTrace(int i) { for (int j = i; j >= 0; j--) CheckStackTrace1(j); } + +//-----------------------------------------------------------------------// + +int main(int argc, char ** argv) { + FLAGS_logtostderr = true; + InitGoogleLogging(argv[0]); + + CheckStackTrace(0); + + printf("PASS\n"); + return 0; +} + +#else +int main() { + printf("PASS (no stacktrace support)\n"); + return 0; +} +#endif // HAVE_STACKTRACE diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h b/spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h new file mode 100644 index 000000000..cfd31f783 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h @@ -0,0 +1,139 @@ +// Copyright (c) 2000 - 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Produce stack trace + +#include // for uintptr_t + +#include "utilities.h" // for OS_* macros + +#if !defined(OS_WINDOWS) +#include +#include +#endif + +#include // for NULL +#include "stacktrace.h" + +_START_GOOGLE_NAMESPACE_ + +// Given a pointer to a stack frame, locate and return the calling +// stackframe, or return NULL if no stackframe can be found. Perform sanity +// checks (the strictness of which is controlled by the boolean parameter +// "STRICT_UNWINDING") to reduce the chance that a bad pointer is returned. +template +static void **NextStackFrame(void **old_sp) { + void **new_sp = (void **) *old_sp; + + // Check that the transition from frame pointer old_sp to frame + // pointer new_sp isn't clearly bogus + if (STRICT_UNWINDING) { + // With the stack growing downwards, older stack frame must be + // at a greater address that the current one. + if (new_sp <= old_sp) return NULL; + // Assume stack frames larger than 100,000 bytes are bogus. + if ((uintptr_t)new_sp - (uintptr_t)old_sp > 100000) return NULL; + } else { + // In the non-strict mode, allow discontiguous stack frames. + // (alternate-signal-stacks for example). + if (new_sp == old_sp) return NULL; + // And allow frames upto about 1MB. + if ((new_sp > old_sp) + && ((uintptr_t)new_sp - (uintptr_t)old_sp > 1000000)) return NULL; + } + if ((uintptr_t)new_sp & (sizeof(void *) - 1)) return NULL; +#ifdef __i386__ + // On 64-bit machines, the stack pointer can be very close to + // 0xffffffff, so we explicitly check for a pointer into the + // last two pages in the address space + if ((uintptr_t)new_sp >= 0xffffe000) return NULL; +#endif +#if !defined(OS_WINDOWS) + if (!STRICT_UNWINDING) { + // Lax sanity checks cause a crash in 32-bit tcmalloc/crash_reason_test + // on AMD-based machines with VDSO-enabled kernels. + // Make an extra sanity check to insure new_sp is readable. + // Note: NextStackFrame() is only called while the program + // is already on its last leg, so it's ok to be slow here. + static int page_size = getpagesize(); + void *new_sp_aligned = (void *)((uintptr_t)new_sp & ~(page_size - 1)); + if (msync(new_sp_aligned, page_size, MS_ASYNC) == -1) + return NULL; + } +#endif + return new_sp; +} + +// If you change this function, also change GetStackFrames below. +int GetStackTrace(void** result, int max_depth, int skip_count) { + void **sp; +#ifdef __i386__ + // Stack frame format: + // sp[0] pointer to previous frame + // sp[1] caller address + // sp[2] first argument + // ... + sp = (void **)&result - 2; +#endif + +#ifdef __x86_64__ + // __builtin_frame_address(0) can return the wrong address on gcc-4.1.0-k8 + unsigned long rbp; + // Move the value of the register %rbp into the local variable rbp. + // We need 'volatile' to prevent this instruction from getting moved + // around during optimization to before function prologue is done. + // An alternative way to achieve this + // would be (before this __asm__ instruction) to call Noop() defined as + // static void Noop() __attribute__ ((noinline)); // prevent inlining + // static void Noop() { asm(""); } // prevent optimizing-away + __asm__ volatile ("mov %%rbp, %0" : "=r" (rbp)); + // Arguments are passed in registers on x86-64, so we can't just + // offset from &result + sp = (void **) rbp; +#endif + + int n = 0; + while (sp && n < max_depth) { + if (*(sp+1) == (void *)0) { + // In 64-bit code, we often see a frame that + // points to itself and has a return address of 0. + break; + } + if (skip_count > 0) { + skip_count--; + } else { + result[n++] = *(sp+1); + } + // Use strict unwinding rules. + sp = NextStackFrame(sp); + } + return n; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h b/spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h new file mode 100644 index 000000000..f7d1dca85 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h @@ -0,0 +1,105 @@ +// Copyright (c) 2005 - 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Arun Sharma +// +// Produce stack trace using libgcc + +extern "C" { +#include // for NULL +#include // ABI defined unwinder +} +#include "stacktrace.h" + +_START_GOOGLE_NAMESPACE_ + +typedef struct { + void **result; + int max_depth; + int skip_count; + int count; +} trace_arg_t; + + +// Workaround for the malloc() in _Unwind_Backtrace() issue. +static _Unwind_Reason_Code nop_backtrace(struct _Unwind_Context *uc, void *opq) { + return _URC_NO_REASON; +} + + +// This code is not considered ready to run until +// static initializers run so that we are guaranteed +// that any malloc-related initialization is done. +static bool ready_to_run = false; +class StackTraceInit { + public: + StackTraceInit() { + // Extra call to force initialization + _Unwind_Backtrace(nop_backtrace, NULL); + ready_to_run = true; + } +}; + +static StackTraceInit module_initializer; // Force initialization + +static _Unwind_Reason_Code GetOneFrame(struct _Unwind_Context *uc, void *opq) { + trace_arg_t *targ = (trace_arg_t *) opq; + + if (targ->skip_count > 0) { + targ->skip_count--; + } else { + targ->result[targ->count++] = (void *) _Unwind_GetIP(uc); + } + + if (targ->count == targ->max_depth) + return _URC_END_OF_STACK; + + return _URC_NO_REASON; +} + +// If you change this function, also change GetStackFrames below. +int GetStackTrace(void** result, int max_depth, int skip_count) { + if (!ready_to_run) + return 0; + + trace_arg_t targ; + + skip_count += 1; // Do not include the "GetStackTrace" frame + + targ.result = result; + targ.max_depth = max_depth; + targ.skip_count = skip_count; + targ.count = 0; + + _Unwind_Backtrace(GetOneFrame, &targ); + + return targ.count; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc b/spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc new file mode 100644 index 000000000..0ed4695da --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc @@ -0,0 +1,191 @@ +// Copyright (c) 2003, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "utilities.h" +#include "config.h" + +#ifdef HAVE_USING_OPERATOR + +#include "glog/stl_logging.h" + +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# include +# include +#endif + +#include "glog/logging.h" +#include "googletest.h" + +using namespace std; +#ifdef __GNUC__ +using namespace __gnu_cxx; +#endif + +struct user_hash { + size_t operator()(int x) const { return x; } +}; + +void TestSTLLogging() { + { + // Test a sequence. + vector v; + v.push_back(10); + v.push_back(20); + v.push_back(30); + char ss_buf[1000]; + ostrstream ss(ss_buf, sizeof(ss_buf)); + // Just ostrstream s1; leaks heap. + ss << v << ends; + CHECK_STREQ(ss.str(), "10 20 30"); + vector copied_v(v); + CHECK_EQ(v, copied_v); // This must compile. + } + + { + // Test a sorted pair associative container. + map< int, string > m; + m[20] = "twenty"; + m[10] = "ten"; + m[30] = "thirty"; + char ss_buf[1000]; + ostrstream ss(ss_buf, sizeof(ss_buf)); + ss << m << ends; + CHECK_STREQ(ss.str(), "(10, ten) (20, twenty) (30, thirty)"); + map< int, string > copied_m(m); + CHECK_EQ(m, copied_m); // This must compile. + } + +#ifdef __GNUC__ + { + // Test a hashed simple associative container. + hash_set hs; + hs.insert(10); + hs.insert(20); + hs.insert(30); + char ss_buf[1000]; + ostrstream ss(ss_buf, sizeof(ss_buf)); + ss << hs << ends; + CHECK_STREQ(ss.str(), "10 20 30"); + hash_set copied_hs(hs); + CHECK_EQ(hs, copied_hs); // This must compile. + } +#endif + +#ifdef __GNUC__ + { + // Test a hashed pair associative container. + hash_map hm; + hm[10] = "ten"; + hm[20] = "twenty"; + hm[30] = "thirty"; + char ss_buf[1000]; + ostrstream ss(ss_buf, sizeof(ss_buf)); + ss << hm << ends; + CHECK_STREQ(ss.str(), "(10, ten) (20, twenty) (30, thirty)"); + hash_map copied_hm(hm); + CHECK_EQ(hm, copied_hm); // this must compile + } +#endif + + { + // Test a long sequence. + vector v; + string expected; + for (int i = 0; i < 100; i++) { + v.push_back(i); + if (i > 0) expected += ' '; + char buf[256]; + sprintf(buf, "%d", i); + expected += buf; + } + v.push_back(100); + expected += " ..."; + char ss_buf[1000]; + ostrstream ss(ss_buf, sizeof(ss_buf)); + ss << v << ends; + CHECK_STREQ(ss.str(), expected.c_str()); + } + + { + // Test a sorted pair associative container. + // Use a non-default comparison functor. + map< int, string, greater > m; + m[20] = "twenty"; + m[10] = "ten"; + m[30] = "thirty"; + char ss_buf[1000]; + ostrstream ss(ss_buf, sizeof(ss_buf)); + ss << m << ends; + CHECK_STREQ(ss.str(), "(30, thirty) (20, twenty) (10, ten)"); + map< int, string, greater > copied_m(m); + CHECK_EQ(m, copied_m); // This must compile. + } + +#ifdef __GNUC__ + { + // Test a hashed simple associative container. + // Use a user defined hash function. + hash_set hs; + hs.insert(10); + hs.insert(20); + hs.insert(30); + char ss_buf[1000]; + ostrstream ss(ss_buf, sizeof(ss_buf)); + ss << hs << ends; + CHECK_STREQ(ss.str(), "10 20 30"); + hash_set copied_hs(hs); + CHECK_EQ(hs, copied_hs); // This must compile. + } +#endif +} + +int main(int argc, char** argv) { + TestSTLLogging(); + std::cout << "PASS\n"; + return 0; +} + +#else + +#include + +int main(int argc, char** argv) { + std::cout << "We don't support stl_logging for this compiler.\n" + << "(we need compiler support of 'using ::operator<<' " + << "for this feature.)\n"; + return 0; +} + +#endif // HAVE_USING_OPERATOR diff --git a/spotify/breakpad/third_party/glog/src/symbolize.cc b/spotify/breakpad/third_party/glog/src/symbolize.cc new file mode 100644 index 000000000..3465de6c6 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/symbolize.cc @@ -0,0 +1,681 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// Stack-footprint reduction work done by Raksit Ashok +// +// Implementation note: +// +// We don't use heaps but only use stacks. We want to reduce the +// stack consumption so that the symbolizer can run on small stacks. +// +// Here are some numbers collected with GCC 4.1.0 on x86: +// - sizeof(Elf32_Sym) = 16 +// - sizeof(Elf32_Shdr) = 40 +// - sizeof(Elf64_Sym) = 24 +// - sizeof(Elf64_Shdr) = 64 +// +// This implementation is intended to be async-signal-safe but uses +// some functions which are not guaranteed to be so, such as memchr() +// and memmove(). We assume they are async-signal-safe. +// + +#include "utilities.h" + +#if defined(HAVE_SYMBOLIZE) + +#include + +#include "symbolize.h" +#include "demangle.h" + +_START_GOOGLE_NAMESPACE_ + +// We don't use assert() since it's not guaranteed to be +// async-signal-safe. Instead we define a minimal assertion +// macro. So far, we don't need pretty printing for __FILE__, etc. + +// A wrapper for abort() to make it callable in ? :. +static int AssertFail() { + abort(); + return 0; // Should not reach. +} + +#define SAFE_ASSERT(expr) ((expr) ? 0 : AssertFail()) + +static SymbolizeCallback g_symbolize_callback = NULL; +void InstallSymbolizeCallback(SymbolizeCallback callback) { + g_symbolize_callback = callback; +} + +// This function wraps the Demangle function to provide an interface +// where the input symbol is demangled in-place. +// To keep stack consumption low, we would like this function to not +// get inlined. +static ATTRIBUTE_NOINLINE void DemangleInplace(char *out, int out_size) { + char demangled[256]; // Big enough for sane demangled symbols. + if (Demangle(out, demangled, sizeof(demangled))) { + // Demangling succeeded. Copy to out if the space allows. + int len = strlen(demangled); + if (len + 1 <= out_size) { // +1 for '\0'. + SAFE_ASSERT(len < sizeof(demangled)); + memmove(out, demangled, len + 1); + } + } +} + +_END_GOOGLE_NAMESPACE_ + +#if defined(__ELF__) + +#include +#include +#include +#include +#include +#include // For ElfW() macro. +#include +#include +#include +#include +#include +#include +#include +#include + +#include "symbolize.h" +#include "config.h" +#include "glog/raw_logging.h" + +// Re-runs fn until it doesn't cause EINTR. +#define NO_INTR(fn) do {} while ((fn) < 0 && errno == EINTR) + +_START_GOOGLE_NAMESPACE_ + +// Read up to "count" bytes from file descriptor "fd" into the buffer +// starting at "buf" while handling short reads and EINTR. On +// success, return the number of bytes read. Otherwise, return -1. +static ssize_t ReadPersistent(const int fd, void *buf, const size_t count) { + SAFE_ASSERT(fd >= 0); + SAFE_ASSERT(count >= 0 && count <= std::numeric_limits::max()); + char *buf0 = reinterpret_cast(buf); + ssize_t num_bytes = 0; + while (num_bytes < count) { + ssize_t len; + NO_INTR(len = read(fd, buf0 + num_bytes, count - num_bytes)); + if (len < 0) { // There was an error other than EINTR. + return -1; + } + if (len == 0) { // Reached EOF. + break; + } + num_bytes += len; + } + SAFE_ASSERT(num_bytes <= count); + return num_bytes; +} + +// Read up to "count" bytes from "offset" in the file pointed by file +// descriptor "fd" into the buffer starting at "buf". On success, +// return the number of bytes read. Otherwise, return -1. +static ssize_t ReadFromOffset(const int fd, void *buf, + const size_t count, const off_t offset) { + off_t off = lseek(fd, offset, SEEK_SET); + if (off == (off_t)-1) { + return -1; + } + return ReadPersistent(fd, buf, count); +} + +// Try reading exactly "count" bytes from "offset" bytes in a file +// pointed by "fd" into the buffer starting at "buf" while handling +// short reads and EINTR. On success, return true. Otherwise, return +// false. +static bool ReadFromOffsetExact(const int fd, void *buf, + const size_t count, const off_t offset) { + ssize_t len = ReadFromOffset(fd, buf, count, offset); + return len == count; +} + +// Returns elf_header.e_type if the file pointed by fd is an ELF binary. +static int FileGetElfType(const int fd) { + ElfW(Ehdr) elf_header; + if (!ReadFromOffsetExact(fd, &elf_header, sizeof(elf_header), 0)) { + return -1; + } + if (memcmp(elf_header.e_ident, ELFMAG, SELFMAG) != 0) { + return -1; + } + return elf_header.e_type; +} + +// Read the section headers in the given ELF binary, and if a section +// of the specified type is found, set the output to this section header +// and return true. Otherwise, return false. +// To keep stack consumption low, we would like this function to not get +// inlined. +static ATTRIBUTE_NOINLINE bool +GetSectionHeaderByType(const int fd, ElfW(Half) sh_num, const off_t sh_offset, + ElfW(Word) type, ElfW(Shdr) *out) { + // Read at most 16 section headers at a time to save read calls. + ElfW(Shdr) buf[16]; + for (int i = 0; i < sh_num;) { + const ssize_t num_bytes_left = (sh_num - i) * sizeof(buf[0]); + const ssize_t num_bytes_to_read = + (sizeof(buf) > num_bytes_left) ? num_bytes_left : sizeof(buf); + const ssize_t len = ReadFromOffset(fd, buf, num_bytes_to_read, + sh_offset + i * sizeof(buf[0])); + SAFE_ASSERT(len % sizeof(buf[0]) == 0); + const ssize_t num_headers_in_buf = len / sizeof(buf[0]); + SAFE_ASSERT(num_headers_in_buf <= sizeof(buf) / sizeof(buf[0])); + for (int j = 0; j < num_headers_in_buf; ++j) { + if (buf[j].sh_type == type) { + *out = buf[j]; + return true; + } + } + i += num_headers_in_buf; + } + return false; +} + +// There is no particular reason to limit section name to 63 characters, +// but there has (as yet) been no need for anything longer either. +const int kMaxSectionNameLen = 64; + +// name_len should include terminating '\0'. +bool GetSectionHeaderByName(int fd, const char *name, size_t name_len, + ElfW(Shdr) *out) { + ElfW(Ehdr) elf_header; + if (!ReadFromOffsetExact(fd, &elf_header, sizeof(elf_header), 0)) { + return false; + } + + ElfW(Shdr) shstrtab; + off_t shstrtab_offset = (elf_header.e_shoff + + elf_header.e_shentsize * elf_header.e_shstrndx); + if (!ReadFromOffsetExact(fd, &shstrtab, sizeof(shstrtab), shstrtab_offset)) { + return false; + } + + for (int i = 0; i < elf_header.e_shnum; ++i) { + off_t section_header_offset = (elf_header.e_shoff + + elf_header.e_shentsize * i); + if (!ReadFromOffsetExact(fd, out, sizeof(*out), section_header_offset)) { + return false; + } + char header_name[kMaxSectionNameLen]; + if (sizeof(header_name) < name_len) { + RAW_LOG(WARNING, "Section name '%s' is too long (%"PRIuS"); " + "section will not be found (even if present).", name, name_len); + // No point in even trying. + return false; + } + off_t name_offset = shstrtab.sh_offset + out->sh_name; + ssize_t n_read = ReadFromOffset(fd, &header_name, name_len, name_offset); + if (n_read == -1) { + return false; + } else if (n_read != name_len) { + // Short read -- name could be at end of file. + continue; + } + if (memcmp(header_name, name, name_len) == 0) { + return true; + } + } + return false; +} + +// Read a symbol table and look for the symbol containing the +// pc. Iterate over symbols in a symbol table and look for the symbol +// containing "pc". On success, return true and write the symbol name +// to out. Otherwise, return false. +// To keep stack consumption low, we would like this function to not get +// inlined. +static ATTRIBUTE_NOINLINE bool +FindSymbol(uint64_t pc, const int fd, char *out, int out_size, + uint64_t symbol_offset, const ElfW(Shdr) *strtab, + const ElfW(Shdr) *symtab) { + if (symtab == NULL) { + return false; + } + const int num_symbols = symtab->sh_size / symtab->sh_entsize; + for (int i = 0; i < num_symbols;) { + off_t offset = symtab->sh_offset + i * symtab->sh_entsize; + + // If we are reading Elf64_Sym's, we want to limit this array to + // 32 elements (to keep stack consumption low), otherwise we can + // have a 64 element Elf32_Sym array. +#if __WORDSIZE == 64 +#define NUM_SYMBOLS 32 +#else +#define NUM_SYMBOLS 64 +#endif + + // Read at most NUM_SYMBOLS symbols at once to save read() calls. + ElfW(Sym) buf[NUM_SYMBOLS]; + const ssize_t len = ReadFromOffset(fd, &buf, sizeof(buf), offset); + SAFE_ASSERT(len % sizeof(buf[0]) == 0); + const ssize_t num_symbols_in_buf = len / sizeof(buf[0]); + SAFE_ASSERT(num_symbols_in_buf <= sizeof(buf)/sizeof(buf[0])); + for (int j = 0; j < num_symbols_in_buf; ++j) { + const ElfW(Sym)& symbol = buf[j]; + uint64_t start_address = symbol.st_value; + start_address += symbol_offset; + uint64_t end_address = start_address + symbol.st_size; + if (symbol.st_value != 0 && // Skip null value symbols. + symbol.st_shndx != 0 && // Skip undefined symbols. + start_address <= pc && pc < end_address) { + ssize_t len1 = ReadFromOffset(fd, out, out_size, + strtab->sh_offset + symbol.st_name); + if (len1 <= 0 || memchr(out, '\0', out_size) == NULL) { + return false; + } + return true; // Obtained the symbol name. + } + } + i += num_symbols_in_buf; + } + return false; +} + +// Get the symbol name of "pc" from the file pointed by "fd". Process +// both regular and dynamic symbol tables if necessary. On success, +// write the symbol name to "out" and return true. Otherwise, return +// false. +static bool GetSymbolFromObjectFile(const int fd, uint64_t pc, + char *out, int out_size, + uint64_t map_start_address) { + // Read the ELF header. + ElfW(Ehdr) elf_header; + if (!ReadFromOffsetExact(fd, &elf_header, sizeof(elf_header), 0)) { + return false; + } + + uint64_t symbol_offset = 0; + if (elf_header.e_type == ET_DYN) { // DSO needs offset adjustment. + symbol_offset = map_start_address; + } + + ElfW(Shdr) symtab, strtab; + + // Consult a regular symbol table first. + if (!GetSectionHeaderByType(fd, elf_header.e_shnum, elf_header.e_shoff, + SHT_SYMTAB, &symtab)) { + return false; + } + if (!ReadFromOffsetExact(fd, &strtab, sizeof(strtab), elf_header.e_shoff + + symtab.sh_link * sizeof(symtab))) { + return false; + } + if (FindSymbol(pc, fd, out, out_size, symbol_offset, + &strtab, &symtab)) { + return true; // Found the symbol in a regular symbol table. + } + + // If the symbol is not found, then consult a dynamic symbol table. + if (!GetSectionHeaderByType(fd, elf_header.e_shnum, elf_header.e_shoff, + SHT_DYNSYM, &symtab)) { + return false; + } + if (!ReadFromOffsetExact(fd, &strtab, sizeof(strtab), elf_header.e_shoff + + symtab.sh_link * sizeof(symtab))) { + return false; + } + if (FindSymbol(pc, fd, out, out_size, symbol_offset, + &strtab, &symtab)) { + return true; // Found the symbol in a dynamic symbol table. + } + + return false; +} + +namespace { +// Thin wrapper around a file descriptor so that the file descriptor +// gets closed for sure. +struct FileDescriptor { + const int fd_; + explicit FileDescriptor(int fd) : fd_(fd) {} + ~FileDescriptor() { + if (fd_ >= 0) { + NO_INTR(close(fd_)); + } + } + int get() { return fd_; } + + private: + explicit FileDescriptor(const FileDescriptor&); + void operator=(const FileDescriptor&); +}; + +// Helper class for reading lines from file. +// +// Note: we don't use ProcMapsIterator since the object is big (it has +// a 5k array member) and uses async-unsafe functions such as sscanf() +// and snprintf(). +class LineReader { + public: + explicit LineReader(int fd, char *buf, int buf_len) : fd_(fd), + buf_(buf), buf_len_(buf_len), bol_(buf), eol_(buf), eod_(buf) { + } + + // Read '\n'-terminated line from file. On success, modify "bol" + // and "eol", then return true. Otherwise, return false. + // + // Note: if the last line doesn't end with '\n', the line will be + // dropped. It's an intentional behavior to make the code simple. + bool ReadLine(const char **bol, const char **eol) { + if (BufferIsEmpty()) { // First time. + const ssize_t num_bytes = ReadPersistent(fd_, buf_, buf_len_); + if (num_bytes <= 0) { // EOF or error. + return false; + } + eod_ = buf_ + num_bytes; + bol_ = buf_; + } else { + bol_ = eol_ + 1; // Advance to the next line in the buffer. + SAFE_ASSERT(bol_ <= eod_); // "bol_" can point to "eod_". + if (!HasCompleteLine()) { + const int incomplete_line_length = eod_ - bol_; + // Move the trailing incomplete line to the beginning. + memmove(buf_, bol_, incomplete_line_length); + // Read text from file and append it. + char * const append_pos = buf_ + incomplete_line_length; + const int capacity_left = buf_len_ - incomplete_line_length; + const ssize_t num_bytes = ReadPersistent(fd_, append_pos, + capacity_left); + if (num_bytes <= 0) { // EOF or error. + return false; + } + eod_ = append_pos + num_bytes; + bol_ = buf_; + } + } + eol_ = FindLineFeed(); + if (eol_ == NULL) { // '\n' not found. Malformed line. + return false; + } + *eol_ = '\0'; // Replace '\n' with '\0'. + + *bol = bol_; + *eol = eol_; + return true; + } + + // Beginning of line. + const char *bol() { + return bol_; + } + + // End of line. + const char *eol() { + return eol_; + } + + private: + explicit LineReader(const LineReader&); + void operator=(const LineReader&); + + char *FindLineFeed() { + return reinterpret_cast(memchr(bol_, '\n', eod_ - bol_)); + } + + bool BufferIsEmpty() { + return buf_ == eod_; + } + + bool HasCompleteLine() { + return !BufferIsEmpty() && FindLineFeed() != NULL; + } + + const int fd_; + char * const buf_; + const int buf_len_; + char *bol_; + char *eol_; + const char *eod_; // End of data in "buf_". +}; +} // namespace + +// Place the hex number read from "start" into "*hex". The pointer to +// the first non-hex character or "end" is returned. +static char *GetHex(const char *start, const char *end, uint64_t *hex) { + *hex = 0; + const char *p; + for (p = start; p < end; ++p) { + int ch = *p; + if ((ch >= '0' && ch <= '9') || + (ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) { + *hex = (*hex << 4) | (ch < 'A' ? ch - '0' : (ch & 0xF) + 9); + } else { // Encountered the first non-hex character. + break; + } + } + SAFE_ASSERT(p <= end); + return const_cast(p); +} + +// Search for the object file (from /proc/self/maps) that contains +// the specified pc. If found, open this file and return the file handle, +// and also set start_address to the start address of where this object +// file is mapped to in memory. Otherwise, return -1. +static ATTRIBUTE_NOINLINE int +OpenObjectFileContainingPcAndGetStartAddress(uint64_t pc, + uint64_t &start_address) { + int object_fd; + + // Open /proc/self/maps. + int maps_fd; + NO_INTR(maps_fd = open("/proc/self/maps", O_RDONLY)); + FileDescriptor wrapped_maps_fd(maps_fd); + if (wrapped_maps_fd.get() < 0) { + return -1; + } + + // Iterate over maps and look for the map containing the pc. Then + // look into the symbol tables inside. + char buf[1024]; // Big enough for line of sane /proc/self/maps + LineReader reader(wrapped_maps_fd.get(), buf, sizeof(buf)); + while (true) { + const char *cursor; + const char *eol; + if (!reader.ReadLine(&cursor, &eol)) { // EOF or malformed line. + return -1; + } + + // Start parsing line in /proc/self/maps. Here is an example: + // + // 08048000-0804c000 r-xp 00000000 08:01 2142121 /bin/cat + // + // We want start address (08048000), end address (0804c000), flags + // (r-xp) and file name (/bin/cat). + + // Read start address. + cursor = GetHex(cursor, eol, &start_address); + if (cursor == eol || *cursor != '-') { + return -1; // Malformed line. + } + ++cursor; // Skip '-'. + + // Read end address. + uint64_t end_address; + cursor = GetHex(cursor, eol, &end_address); + if (cursor == eol || *cursor != ' ') { + return -1; // Malformed line. + } + ++cursor; // Skip ' '. + + // Check start and end addresses. + if (!(start_address <= pc && pc < end_address)) { + continue; // We skip this map. PC isn't in this map. + } + + // Read flags. Skip flags until we encounter a space or eol. + const char * const flags_start = cursor; + while (cursor < eol && *cursor != ' ') { + ++cursor; + } + // We expect at least four letters for flags (ex. "r-xp"). + if (cursor == eol || cursor < flags_start + 4) { + return -1; // Malformed line. + } + + // Check flags. We are only interested in "r-x" maps. + if (memcmp(flags_start, "r-x", 3) != 0) { // Not a "r-x" map. + continue; // We skip this map. + } + ++cursor; // Skip ' '. + + // Skip to file name. "cursor" now points to file offset. We need to + // skip at least three spaces for file offset, dev, and inode. + int num_spaces = 0; + while (cursor < eol) { + if (*cursor == ' ') { + ++num_spaces; + } else if (num_spaces >= 3) { + // The first non-space character after skipping three spaces + // is the beginning of the file name. + break; + } + ++cursor; + } + if (cursor == eol) { + return -1; // Malformed line. + } + + // Finally, "cursor" now points to file name of our interest. + NO_INTR(object_fd = open(cursor, O_RDONLY)); + if (object_fd < 0) { + return -1; + } + return object_fd; + } +} + +// The implementation of our symbolization routine. If it +// successfully finds the symbol containing "pc" and obtains the +// symbol name, returns true and write the symbol name to "out". +// Otherwise, returns false. If Callback function is installed via +// InstallSymbolizeCallback(), the function is also called in this function, +// and "out" is used as its output. +// To keep stack consumption low, we would like this function to not +// get inlined. +static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out, + int out_size) { + uint64_t pc0 = reinterpret_cast(pc); + uint64_t start_address = 0; + + int object_fd = OpenObjectFileContainingPcAndGetStartAddress(pc0, + start_address); + if (object_fd == -1) { + return false; + } + FileDescriptor wrapped_object_fd(object_fd); + int elf_type = FileGetElfType(wrapped_object_fd.get()); + if (elf_type == -1) { + return false; + } + if (g_symbolize_callback) { + // Run the call back if it's installed. + // Note: relocation (and much of the rest of this code) will be + // wrong for prelinked shared libraries and PIE executables. + uint64 relocation = (elf_type == ET_DYN) ? start_address : 0; + int num_bytes_written = g_symbolize_callback(wrapped_object_fd.get(), + pc, out, out_size, + relocation); + if (num_bytes_written > 0) { + out += num_bytes_written; + out_size -= num_bytes_written; + } + } + if (!GetSymbolFromObjectFile(wrapped_object_fd.get(), pc0, + out, out_size, start_address)) { + return false; + } + + // Symbolization succeeded. Now we try to demangle the symbol. + DemangleInplace(out, out_size); + return true; +} + +_END_GOOGLE_NAMESPACE_ + +#elif defined(OS_MACOSX) && defined(HAVE_DLADDR) + +#include +#include + +_START_GOOGLE_NAMESPACE_ + +static ATTRIBUTE_NOINLINE bool SymbolizeAndDemangle(void *pc, char *out, + int out_size) { + Dl_info info; + if (dladdr(pc, &info)) { + if (strlen(info.dli_sname) < out_size) { + strcpy(out, info.dli_sname); + // Symbolization succeeded. Now we try to demangle the symbol. + DemangleInplace(out, out_size); + return true; + } + } + return false; +} + +_END_GOOGLE_NAMESPACE_ + +#else +# error BUG: HAVE_SYMBOLIZE was wrongly set +#endif + +_START_GOOGLE_NAMESPACE_ + +bool Symbolize(void *pc, char *out, int out_size) { + SAFE_ASSERT(out_size >= 0); + return SymbolizeAndDemangle(pc, out, out_size); +} + +_END_GOOGLE_NAMESPACE_ + +#else /* HAVE_SYMBOLIZE */ + +#include + +#include "config.h" + +_START_GOOGLE_NAMESPACE_ + +// TODO: Support other environments. +bool Symbolize(void *pc, char *out, int out_size) { + assert(0); + return false; +} + +_END_GOOGLE_NAMESPACE_ + +#endif diff --git a/spotify/breakpad/third_party/glog/src/symbolize.h b/spotify/breakpad/third_party/glog/src/symbolize.h new file mode 100644 index 000000000..1ebe4dd94 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/symbolize.h @@ -0,0 +1,116 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// +// This library provides Symbolize() function that symbolizes program +// counters to their corresponding symbol names on linux platforms. +// This library has a minimal implementation of an ELF symbol table +// reader (i.e. it doesn't depend on libelf, etc.). +// +// The algorithm used in Symbolize() is as follows. +// +// 1. Go through a list of maps in /proc/self/maps and find the map +// containing the program counter. +// +// 2. Open the mapped file and find a regular symbol table inside. +// Iterate over symbols in the symbol table and look for the symbol +// containing the program counter. If such a symbol is found, +// obtain the symbol name, and demangle the symbol if possible. +// If the symbol isn't found in the regular symbol table (binary is +// stripped), try the same thing with a dynamic symbol table. +// +// Note that Symbolize() is originally implemented to be used in +// FailureSignalHandler() in base/google.cc. Hence it doesn't use +// malloc() and other unsafe operations. It should be both +// thread-safe and async-signal-safe. + +#ifndef BASE_SYMBOLIZE_H_ +#define BASE_SYMBOLIZE_H_ + +#include "utilities.h" +#include "config.h" +#include "glog/logging.h" + +#ifdef HAVE_SYMBOLIZE + +#if defined(__ELF__) // defined by gcc on Linux +#include +#include // For ElfW() macro. + +// If there is no ElfW macro, let's define it by ourself. +#ifndef ElfW +# if SIZEOF_VOID_P == 4 +# define ElfW(type) Elf32_##type +# elif SIZEOF_VOID_P == 8 +# define ElfW(type) Elf64_##type +# else +# error "Unknown sizeof(void *)" +# endif +#endif + +_START_GOOGLE_NAMESPACE_ + +// Gets the section header for the given name, if it exists. Returns true on +// success. Otherwise, returns false. +bool GetSectionHeaderByName(int fd, const char *name, size_t name_len, + ElfW(Shdr) *out); + +_END_GOOGLE_NAMESPACE_ + +#endif /* __ELF__ */ + +_START_GOOGLE_NAMESPACE_ + +// Installs a callback function, which will be called right before a symbol name +// is printed. The callback is intended to be used for showing a file name and a +// line number preceding a symbol name. +// "fd" is a file descriptor of the object file containing the program +// counter "pc". The callback function should write output to "out" +// and return the size of the output written. On error, the callback +// function should return -1. +typedef int (*SymbolizeCallback)(int fd, void *pc, char *out, size_t out_size, + uint64 relocation); +void InstallSymbolizeCallback(SymbolizeCallback callback); + +_END_GOOGLE_NAMESPACE_ + +#endif + +_START_GOOGLE_NAMESPACE_ + +// Symbolizes a program counter. On success, returns true and write the +// symbol name to "out". The symbol name is demangled if possible +// (supports symbols generated by GCC 3.x or newer). Otherwise, +// returns false. +bool Symbolize(void *pc, char *out, int out_size); + +_END_GOOGLE_NAMESPACE_ + +#endif // BASE_SYMBOLIZE_H_ diff --git a/spotify/breakpad/third_party/glog/src/symbolize_unittest.cc b/spotify/breakpad/third_party/glog/src/symbolize_unittest.cc new file mode 100644 index 000000000..f25909d12 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/symbolize_unittest.cc @@ -0,0 +1,365 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Satoru Takabayashi +// +// Unit tests for functions in symbolize.cc. + +#include "utilities.h" + +#include +#include + +#include "glog/logging.h" +#include "symbolize.h" +#include "googletest.h" +#include "config.h" + +using namespace std; +using namespace GOOGLE_NAMESPACE; + +#if defined(HAVE_STACKTRACE) && defined(__ELF__) + +#define always_inline + +// This unit tests make sense only with GCC. +// Uses lots of GCC specific features. +#if defined(__GNUC__) && !defined(__OPENCC__) +# if __GNUC__ >= 4 +# define TEST_WITH_MODERN_GCC +# if __i386__ // always_inline isn't supported for x86_64 with GCC 4.1.0. +# undef always_inline +# define always_inline __attribute__((always_inline)) +# define HAVE_ALWAYS_INLINE +# endif // __i386__ +# else +# endif // __GNUC__ >= 4 +# if defined(__i386__) || defined(__x86_64__) +# define TEST_X86_32_AND_64 1 +# endif // defined(__i386__) || defined(__x86_64__) +#endif + +// A wrapper function for Symbolize() to make the unit test simple. +static const char *TrySymbolize(void *pc) { + static char symbol[4096]; + if (Symbolize(pc, symbol, sizeof(symbol))) { + return symbol; + } else { + return NULL; + } +} + +// Make them C linkage to avoid mangled names. +extern "C" { +void nonstatic_func() { + volatile int a = 0; + ++a; +} + +static void static_func() { + volatile int a = 0; + ++a; +} +} + +TEST(Symbolize, Symbolize) { + // We do C-style cast since GCC 2.95.3 doesn't allow + // reinterpret_cast(&func). + + // Compilers should give us pointers to them. + EXPECT_STREQ("nonstatic_func", TrySymbolize((void *)(&nonstatic_func))); + EXPECT_STREQ("static_func", TrySymbolize((void *)(&static_func))); + + EXPECT_TRUE(NULL == TrySymbolize(NULL)); +} + +struct Foo { + static void func(int x); +}; + +void ATTRIBUTE_NOINLINE Foo::func(int x) { + volatile int a = x; + ++a; +} + +// With a modern GCC, Symbolize() should return demangled symbol +// names. Function parameters should be omitted. +#ifdef TEST_WITH_MODERN_GCC +TEST(Symbolize, SymbolizeWithDemangling) { + Foo::func(100); + EXPECT_STREQ("Foo::func()", TrySymbolize((void *)(&Foo::func))); +} +#endif + +// Tests that verify that Symbolize footprint is within some limit. + +// To measure the stack footprint of the Symbolize function, we create +// a signal handler (for SIGUSR1 say) that calls the Symbolize function +// on an alternate stack. This alternate stack is initialized to some +// known pattern (0x55, 0x55, 0x55, ...). We then self-send this signal, +// and after the signal handler returns, look at the alternate stack +// buffer to see what portion has been touched. +// +// This trick gives us the the stack footprint of the signal handler. +// But the signal handler, even before the call to Symbolize, consumes +// some stack already. We however only want the stack usage of the +// Symbolize function. To measure this accurately, we install two signal +// handlers: one that does nothing and just returns, and another that +// calls Symbolize. The difference between the stack consumption of these +// two signals handlers should give us the Symbolize stack foorprint. + +static void *g_pc_to_symbolize; +static char g_symbolize_buffer[4096]; +static char *g_symbolize_result; + +static void EmptySignalHandler(int signo) {} + +static void SymbolizeSignalHandler(int signo) { + if (Symbolize(g_pc_to_symbolize, g_symbolize_buffer, + sizeof(g_symbolize_buffer))) { + g_symbolize_result = g_symbolize_buffer; + } else { + g_symbolize_result = NULL; + } +} + +const int kAlternateStackSize = 8096; +const char kAlternateStackFillValue = 0x55; + +// These helper functions look at the alternate stack buffer, and figure +// out what portion of this buffer has been touched - this is the stack +// consumption of the signal handler running on this alternate stack. +static ATTRIBUTE_NOINLINE bool StackGrowsDown(int *x) { + int y; + return &y < x; +} +static int GetStackConsumption(const char* alt_stack) { + int x; + if (StackGrowsDown(&x)) { + for (int i = 0; i < kAlternateStackSize; i++) { + if (alt_stack[i] != kAlternateStackFillValue) { + return (kAlternateStackSize - i); + } + } + } else { + for (int i = (kAlternateStackSize - 1); i >= 0; i--) { + if (alt_stack[i] != kAlternateStackFillValue) { + return i; + } + } + } + return -1; +} + +#ifdef HAVE_SIGALTSTACK + +// Call Symbolize and figure out the stack footprint of this call. +static const char *SymbolizeStackConsumption(void *pc, int *stack_consumed) { + + g_pc_to_symbolize = pc; + + // The alt-signal-stack cannot be heap allocated because there is a + // bug in glibc-2.2 where some signal handler setup code looks at the + // current stack pointer to figure out what thread is currently running. + // Therefore, the alternate stack must be allocated from the main stack + // itself. + char altstack[kAlternateStackSize]; + memset(altstack, kAlternateStackFillValue, kAlternateStackSize); + + // Set up the alt-signal-stack (and save the older one). + stack_t sigstk; + memset(&sigstk, 0, sizeof(stack_t)); + stack_t old_sigstk; + sigstk.ss_sp = altstack; + sigstk.ss_size = kAlternateStackSize; + sigstk.ss_flags = 0; + CHECK_ERR(sigaltstack(&sigstk, &old_sigstk)); + + // Set up SIGUSR1 and SIGUSR2 signal handlers (and save the older ones). + struct sigaction sa; + memset(&sa, 0, sizeof(struct sigaction)); + struct sigaction old_sa1, old_sa2; + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_ONSTACK; + + // SIGUSR1 maps to EmptySignalHandler. + sa.sa_handler = EmptySignalHandler; + CHECK_ERR(sigaction(SIGUSR1, &sa, &old_sa1)); + + // SIGUSR2 maps to SymbolizeSignalHanlder. + sa.sa_handler = SymbolizeSignalHandler; + CHECK_ERR(sigaction(SIGUSR2, &sa, &old_sa2)); + + // Send SIGUSR1 signal and measure the stack consumption of the empty + // signal handler. + CHECK_ERR(kill(getpid(), SIGUSR1)); + int stack_consumption1 = GetStackConsumption(altstack); + + // Send SIGUSR2 signal and measure the stack consumption of the symbolize + // signal handler. + CHECK_ERR(kill(getpid(), SIGUSR2)); + int stack_consumption2 = GetStackConsumption(altstack); + + // The difference between the two stack consumption values is the + // stack footprint of the Symbolize function. + if (stack_consumption1 != -1 && stack_consumption2 != -1) { + *stack_consumed = stack_consumption2 - stack_consumption1; + } else { + *stack_consumed = -1; + } + + // Log the stack consumption values. + LOG(INFO) << "Stack consumption of empty signal handler: " + << stack_consumption1; + LOG(INFO) << "Stack consumption of symbolize signal handler: " + << stack_consumption2; + LOG(INFO) << "Stack consumption of Symbolize: " << *stack_consumed; + + // Now restore the old alt-signal-stack and signal handlers. + CHECK_ERR(sigaltstack(&old_sigstk, NULL)); + CHECK_ERR(sigaction(SIGUSR1, &old_sa1, NULL)); + CHECK_ERR(sigaction(SIGUSR2, &old_sa2, NULL)); + + return g_symbolize_result; +} + +// Symbolize stack consumption should be within 2kB. +const int kStackConsumptionUpperLimit = 2048; + +TEST(Symbolize, SymbolizeStackConsumption) { + int stack_consumed; + const char* symbol; + + symbol = SymbolizeStackConsumption((void *)(&nonstatic_func), + &stack_consumed); + EXPECT_STREQ("nonstatic_func", symbol); + EXPECT_GT(stack_consumed, 0); + EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit); + + symbol = SymbolizeStackConsumption((void *)(&static_func), + &stack_consumed); + EXPECT_STREQ("static_func", symbol); + EXPECT_GT(stack_consumed, 0); + EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit); +} + +#ifdef TEST_WITH_MODERN_GCC +TEST(Symbolize, SymbolizeWithDemanglingStackConsumption) { + Foo::func(100); + int stack_consumed; + const char* symbol; + + symbol = SymbolizeStackConsumption((void *)(&Foo::func), &stack_consumed); + + EXPECT_STREQ("Foo::func()", symbol); + EXPECT_GT(stack_consumed, 0); + EXPECT_LT(stack_consumed, kStackConsumptionUpperLimit); +} +#endif + +#endif // HAVE_SIGALTSTACK + +// x86 specific tests. Uses some inline assembler. +extern "C" { +inline void* always_inline inline_func() { + register void *pc = NULL; +#ifdef TEST_X86_32_AND_64 + __asm__ __volatile__("call 1f; 1: pop %0" : "=r"(pc)); +#endif + return pc; +} + +void* ATTRIBUTE_NOINLINE non_inline_func() { + register void *pc = NULL; +#ifdef TEST_X86_32_AND_64 + __asm__ __volatile__("call 1f; 1: pop %0" : "=r"(pc)); +#endif + return pc; +} + +void ATTRIBUTE_NOINLINE TestWithPCInsideNonInlineFunction() { +#if defined(TEST_X86_32_AND_64) && defined(HAVE_ATTRIBUTE_NOINLINE) + void *pc = non_inline_func(); + const char *symbol = TrySymbolize(pc); + CHECK(symbol != NULL); + CHECK_STREQ(symbol, "non_inline_func"); + cout << "Test case TestWithPCInsideNonInlineFunction passed." << endl; +#endif +} + +void ATTRIBUTE_NOINLINE TestWithPCInsideInlineFunction() { +#if defined(TEST_X86_32_AND_64) && defined(HAVE_ALWAYS_INLINE) + void *pc = inline_func(); // Must be inlined. + const char *symbol = TrySymbolize(pc); + CHECK(symbol != NULL); + CHECK_STREQ(symbol, __FUNCTION__); + cout << "Test case TestWithPCInsideInlineFunction passed." << endl; +#endif +} +} + +// Test with a return address. +void ATTRIBUTE_NOINLINE TestWithReturnAddress() { +#if defined(HAVE_ATTRIBUTE_NOINLINE) + void *return_address = __builtin_return_address(0); + const char *symbol = TrySymbolize(return_address); + CHECK(symbol != NULL); + CHECK_STREQ(symbol, "main"); + cout << "Test case TestWithReturnAddress passed." << endl; +#endif +} + +int main(int argc, char **argv) { + FLAGS_logtostderr = true; + InitGoogleLogging(argv[0]); + InitGoogleTest(&argc, argv); +#ifdef HAVE_SYMBOLIZE + // We don't want to get affected by the callback interface, that may be + // used to install some callback function at InitGoogle() time. + InstallSymbolizeCallback(NULL); + + TestWithPCInsideInlineFunction(); + TestWithPCInsideNonInlineFunction(); + TestWithReturnAddress(); + return RUN_ALL_TESTS(); +#else + return 0; +#endif +} + +#else +int main() { +#ifdef HAVE_SYMBOLIZE + printf("PASS (no symbolize_unittest support)\n"); +#else + printf("PASS (no symbolize support)\n"); +#endif + return 0; +} +#endif // HAVE_STACKTRACE diff --git a/spotify/breakpad/third_party/glog/src/utilities.cc b/spotify/breakpad/third_party/glog/src/utilities.cc new file mode 100644 index 000000000..52b802a27 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/utilities.cc @@ -0,0 +1,346 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Shinichiro Hamaji + +#include "utilities.h" + +#include +#include + +#include +#ifdef HAVE_SYS_TIME_H +# include +#endif +#include +#if defined(HAVE_SYSCALL_H) +#include // for syscall() +#elif defined(HAVE_SYS_SYSCALL_H) +#include // for syscall() +#endif +#ifdef HAVE_SYSLOG_H +# include +#endif + +#include "base/googleinit.h" + +using std::string; + +_START_GOOGLE_NAMESPACE_ + +static const char* g_program_invocation_short_name = NULL; +static pthread_t g_main_thread_id; + +_END_GOOGLE_NAMESPACE_ + +// The following APIs are all internal. +#ifdef HAVE_STACKTRACE + +#include "stacktrace.h" +#include "symbolize.h" +#include "base/commandlineflags.h" + +GLOG_DEFINE_bool(symbolize_stacktrace, true, + "Symbolize the stack trace in the tombstone"); + +_START_GOOGLE_NAMESPACE_ + +typedef void DebugWriter(const char*, void*); + +// The %p field width for printf() functions is two characters per byte. +// For some environments, add two extra bytes for the leading "0x". +static const int kPrintfPointerFieldWidth = 2 + 2 * sizeof(void*); + +static void DebugWriteToStderr(const char* data, void *unused) { + // This one is signal-safe. + if (write(STDERR_FILENO, data, strlen(data)) < 0) { + // Ignore errors. + } +} + +void DebugWriteToString(const char* data, void *arg) { + reinterpret_cast(arg)->append(data); +} + +#ifdef HAVE_SYMBOLIZE +// Print a program counter and its symbol name. +static void DumpPCAndSymbol(DebugWriter *writerfn, void *arg, void *pc, + const char * const prefix) { + char tmp[1024]; + const char *symbol = "(unknown)"; + // Symbolizes the previous address of pc because pc may be in the + // next function. The overrun happens when the function ends with + // a call to a function annotated noreturn (e.g. CHECK). + if (Symbolize(reinterpret_cast(pc) - 1, tmp, sizeof(tmp))) { + symbol = tmp; + } + char buf[1024]; + snprintf(buf, sizeof(buf), "%s@ %*p %s\n", + prefix, kPrintfPointerFieldWidth, pc, symbol); + writerfn(buf, arg); +} +#endif + +static void DumpPC(DebugWriter *writerfn, void *arg, void *pc, + const char * const prefix) { + char buf[100]; + snprintf(buf, sizeof(buf), "%s@ %*p\n", + prefix, kPrintfPointerFieldWidth, pc); + writerfn(buf, arg); +} + +// Dump current stack trace as directed by writerfn +static void DumpStackTrace(int skip_count, DebugWriter *writerfn, void *arg) { + // Print stack trace + void* stack[32]; + int depth = GetStackTrace(stack, ARRAYSIZE(stack), skip_count+1); + for (int i = 0; i < depth; i++) { +#if defined(HAVE_SYMBOLIZE) + if (FLAGS_symbolize_stacktrace) { + DumpPCAndSymbol(writerfn, arg, stack[i], " "); + } else { + DumpPC(writerfn, arg, stack[i], " "); + } +#else + DumpPC(writerfn, arg, stack[i], " "); +#endif + } +} + +static void DumpStackTraceAndExit() { + DumpStackTrace(1, DebugWriteToStderr, NULL); + + // Set the default signal handler for SIGABRT, to avoid invoking our + // own signal handler installed by InstallFailedSignalHandler(). + struct sigaction sig_action; + memset(&sig_action, 0, sizeof(sig_action)); + sigemptyset(&sig_action.sa_mask); + sig_action.sa_handler = SIG_DFL; + sigaction(SIGABRT, &sig_action, NULL); + + abort(); +} + +_END_GOOGLE_NAMESPACE_ + +#endif // HAVE_STACKTRACE + +_START_GOOGLE_NAMESPACE_ + +namespace glog_internal_namespace_ { + +const char* ProgramInvocationShortName() { + if (g_program_invocation_short_name != NULL) { + return g_program_invocation_short_name; + } else { + // TODO(hamaji): Use /proc/self/cmdline and so? + return "UNKNOWN"; + } +} + +bool IsGoogleLoggingInitialized() { + return g_program_invocation_short_name != NULL; +} + +bool is_default_thread() { + if (g_program_invocation_short_name == NULL) { + // InitGoogleLogging() not yet called, so unlikely to be in a different + // thread + return true; + } else { + return pthread_equal(pthread_self(), g_main_thread_id); + } +} + +#ifdef OS_WINDOWS +struct timeval { + long tv_sec, tv_usec; +}; + +// Based on: http://www.google.com/codesearch/p?hl=en#dR3YEbitojA/os_win32.c&q=GetSystemTimeAsFileTime%20license:bsd +// See COPYING for copyright information. +static int gettimeofday(struct timeval *tv, void* tz) { +#define EPOCHFILETIME (116444736000000000ULL) + FILETIME ft; + LARGE_INTEGER li; + uint64 tt; + + GetSystemTimeAsFileTime(&ft); + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + tt = (li.QuadPart - EPOCHFILETIME) / 10; + tv->tv_sec = tt / 1000000; + tv->tv_usec = tt % 1000000; + + return 0; +} +#endif + +int64 CycleClock_Now() { + // TODO(hamaji): temporary impementation - it might be too slow. + struct timeval tv; + gettimeofday(&tv, NULL); + return static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; +} + +int64 UsecToCycles(int64 usec) { + return usec; +} + +WallTime WallTime_Now() { + // Now, cycle clock is retuning microseconds since the epoch. + return CycleClock_Now() * 0.000001; +} + +static int32 g_main_thread_pid = getpid(); +int32 GetMainThreadPid() { + return g_main_thread_pid; +} + +bool PidHasChanged() { + int32 pid = getpid(); + if (g_main_thread_pid == pid) { + return false; + } + g_main_thread_pid = pid; + return true; +} + +pid_t GetTID() { + // On Linux and FreeBSD, we try to use gettid(). +#if defined OS_LINUX || defined OS_FREEBSD || defined OS_MACOSX +#ifndef __NR_gettid +#ifdef OS_MACOSX +#define __NR_gettid SYS_gettid +#elif ! defined __i386__ +#error "Must define __NR_gettid for non-x86 platforms" +#else +#define __NR_gettid 224 +#endif +#endif + static bool lacks_gettid = false; + if (!lacks_gettid) { + pid_t tid = syscall(__NR_gettid); + if (tid != -1) { + return tid; + } + // Technically, this variable has to be volatile, but there is a small + // performance penalty in accessing volatile variables and there should + // not be any serious adverse effect if a thread does not immediately see + // the value change to "true". + lacks_gettid = true; + } +#endif // OS_LINUX || OS_FREEBSD + + // If gettid() could not be used, we use one of the following. +#if defined OS_LINUX + return getpid(); // Linux: getpid returns thread ID when gettid is absent +#elif defined OS_WINDOWS || defined OS_CYGWIN + return GetCurrentThreadId(); +#else + // If none of the techniques above worked, we use pthread_self(). + return (pid_t)(uintptr_t)pthread_self(); +#endif +} + +const char* const_basename(const char* filepath) { + const char* base = strrchr(filepath, '/'); +#ifdef OS_WINDOWS // Look for either path separator in Windows + if (!base) + base = strrchr(filepath, '\\'); +#endif + return base ? (base+1) : filepath; +} + +static string g_my_user_name; +const string& MyUserName() { + return g_my_user_name; +} +static void MyUserNameInitializer() { + // TODO(hamaji): Probably this is not portable. +#if defined(OS_WINDOWS) + const char* user = getenv("USERNAME"); +#else + const char* user = getenv("USER"); +#endif + if (user != NULL) { + g_my_user_name = user; + } else { + g_my_user_name = "invalid-user"; + } +} +REGISTER_MODULE_INITIALIZER(utilities, MyUserNameInitializer()); + +#ifdef HAVE_STACKTRACE +void DumpStackTraceToString(string* stacktrace) { + DumpStackTrace(1, DebugWriteToString, stacktrace); +} +#endif + +// We use an atomic operation to prevent problems with calling CrashReason +// from inside the Mutex implementation (potentially through RAW_CHECK). +static const CrashReason* g_reason = 0; + +void SetCrashReason(const CrashReason* r) { + sync_val_compare_and_swap(&g_reason, + reinterpret_cast(0), + r); +} + +void InitGoogleLoggingUtilities(const char* argv0) { + CHECK(!IsGoogleLoggingInitialized()) + << "You called InitGoogleLogging() twice!"; + const char* slash = strrchr(argv0, '/'); +#ifdef OS_WINDOWS + if (!slash) slash = strrchr(argv0, '\\'); +#endif + g_program_invocation_short_name = slash ? slash + 1 : argv0; + g_main_thread_id = pthread_self(); + +#ifdef HAVE_STACKTRACE + InstallFailureFunction(&DumpStackTraceAndExit); +#endif +} + +void ShutdownGoogleLoggingUtilities() { + CHECK(IsGoogleLoggingInitialized()) + << "You called ShutdownGoogleLogging() without calling InitGoogleLogging() first!"; +#ifdef HAVE_SYSLOG_H + closelog(); +#endif +} + +} // namespace glog_internal_namespace_ + +_END_GOOGLE_NAMESPACE_ + +// Make an implementation of stacktrace compiled. +#ifdef STACKTRACE_H +# include STACKTRACE_H +#endif diff --git a/spotify/breakpad/third_party/glog/src/utilities.h b/spotify/breakpad/third_party/glog/src/utilities.h new file mode 100644 index 000000000..42785dc0f --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/utilities.h @@ -0,0 +1,226 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Shinichiro Hamaji +// +// Define utilties for glog internal usage. + +#ifndef UTILITIES_H__ +#define UTILITIES_H__ + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) +# define OS_WINDOWS +#elif defined(__CYGWIN__) || defined(__CYGWIN32__) +# define OS_CYGWIN +#elif defined(linux) || defined(__linux) || defined(__linux__) +# define OS_LINUX +#elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) +# define OS_MACOSX +#elif defined(__FreeBSD__) +# define OS_FREEBSD +#elif defined(__NetBSD__) +# define OS_NETBSD +#elif defined(__OpenBSD__) +# define OS_OPENBSD +#else +// TODO(hamaji): Add other platforms. +#endif + +// printf macros for size_t, in the style of inttypes.h +#ifdef _LP64 +#define __PRIS_PREFIX "z" +#else +#define __PRIS_PREFIX +#endif + +// Use these macros after a % in a printf format string +// to get correct 32/64 bit behavior, like this: +// size_t size = records.size(); +// printf("%"PRIuS"\n", size); + +#define PRIdS __PRIS_PREFIX "d" +#define PRIxS __PRIS_PREFIX "x" +#define PRIuS __PRIS_PREFIX "u" +#define PRIXS __PRIS_PREFIX "X" +#define PRIoS __PRIS_PREFIX "o" + +#include "base/mutex.h" // This must go first so we get _XOPEN_SOURCE + +#include + +#if defined(OS_WINDOWS) +# include "port.h" +#endif + +#include "config.h" +#include "glog/logging.h" + +// There are three different ways we can try to get the stack trace: +// +// 1) The libunwind library. This is still in development, and as a +// separate library adds a new dependency, but doesn't need a frame +// pointer. It also doesn't call malloc. +// +// 2) Our hand-coded stack-unwinder. This depends on a certain stack +// layout, which is used by gcc (and those systems using a +// gcc-compatible ABI) on x86 systems, at least since gcc 2.95. +// It uses the frame pointer to do its work. +// +// 3) The gdb unwinder -- also the one used by the c++ exception code. +// It's obviously well-tested, but has a fatal flaw: it can call +// malloc() from the unwinder. This is a problem because we're +// trying to use the unwinder to instrument malloc(). +// +// Note: if you add a new implementation here, make sure it works +// correctly when GetStackTrace() is called with max_depth == 0. +// Some code may do that. + +#if defined(HAVE_LIB_UNWIND) +# define STACKTRACE_H "stacktrace_libunwind-inl.h" +#elif !defined(NO_FRAME_POINTER) +# if defined(__i386__) && __GNUC__ >= 2 +# define STACKTRACE_H "stacktrace_x86-inl.h" +# elif defined(__x86_64__) && __GNUC__ >= 2 +# define STACKTRACE_H "stacktrace_x86_64-inl.h" +# elif (defined(__ppc__) || defined(__PPC__)) && __GNUC__ >= 2 +# define STACKTRACE_H "stacktrace_powerpc-inl.h" +# endif +#endif + +#if !defined(STACKTRACE_H) && defined(HAVE_EXECINFO_H) +# define STACKTRACE_H "stacktrace_generic-inl.h" +#endif + +#if defined(STACKTRACE_H) +# define HAVE_STACKTRACE +#endif + +// defined by gcc +#if defined(__ELF__) && defined(OS_LINUX) +# define HAVE_SYMBOLIZE +#elif defined(OS_MACOSX) && defined(HAVE_DLADDR) +// Use dladdr to symbolize. +# define HAVE_SYMBOLIZE +#endif + +#ifndef ARRAYSIZE +// There is a better way, but this is good enough for our purpose. +# define ARRAYSIZE(a) (sizeof(a) / sizeof(*(a))) +#endif + +_START_GOOGLE_NAMESPACE_ + +namespace glog_internal_namespace_ { + +#ifdef HAVE___ATTRIBUTE__ +# define ATTRIBUTE_NOINLINE __attribute__ ((noinline)) +# define HAVE_ATTRIBUTE_NOINLINE +#else +# define ATTRIBUTE_NOINLINE +#endif + +const char* ProgramInvocationShortName(); + +bool IsGoogleLoggingInitialized(); + +bool is_default_thread(); + +int64 CycleClock_Now(); + +int64 UsecToCycles(int64 usec); + +typedef double WallTime; +WallTime WallTime_Now(); + +int32 GetMainThreadPid(); +bool PidHasChanged(); + +pid_t GetTID(); + +const std::string& MyUserName(); + +// Get the part of filepath after the last path separator. +// (Doesn't modify filepath, contrary to basename() in libgen.h.) +const char* const_basename(const char* filepath); + +// Wrapper of __sync_val_compare_and_swap. If the GCC extension isn't +// defined, we try the CPU specific logics (we only support x86 and +// x86_64 for now) first, then use a naive implementation, which has a +// race condition. +template +inline T sync_val_compare_and_swap(T* ptr, T oldval, T newval) { +#if defined(HAVE___SYNC_VAL_COMPARE_AND_SWAP) + return __sync_val_compare_and_swap(ptr, oldval, newval); +#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + T ret; + __asm__ __volatile__("lock; cmpxchg %1, (%2);" + :"=a"(ret) + // GCC may produces %sil or %dil for + // constraint "r", but some of apple's gas + // dosn't know the 8 bit registers. + // We use "q" to avoid these registers. + :"q"(newval), "q"(ptr), "a"(oldval) + :"memory", "cc"); + return ret; +#else + T ret = *ptr; + if (ret == oldval) { + *ptr = newval; + } + return ret; +#endif +} + +void DumpStackTraceToString(std::string* stacktrace); + +struct CrashReason { + CrashReason() : filename(0), line_number(0), message(0), depth(0) {} + + const char* filename; + int line_number; + const char* message; + + // We'll also store a bit of stack trace context at the time of crash as + // it may not be available later on. + void* stack[32]; + int depth; +}; + +void SetCrashReason(const CrashReason* r); + +void InitGoogleLoggingUtilities(const char* argv0); +void ShutdownGoogleLoggingUtilities(); + +} // namespace glog_internal_namespace_ + +_END_GOOGLE_NAMESPACE_ + +using namespace GOOGLE_NAMESPACE::glog_internal_namespace_; + +#endif // UTILITIES_H__ diff --git a/spotify/breakpad/third_party/glog/src/utilities_unittest.cc b/spotify/breakpad/third_party/glog/src/utilities_unittest.cc new file mode 100644 index 000000000..7b796190e --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/utilities_unittest.cc @@ -0,0 +1,54 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Shinichiro Hamaji + +#include "utilities.h" +#include "googletest.h" +#include "glog/logging.h" + +using namespace GOOGLE_NAMESPACE; + +TEST(utilities, sync_val_compare_and_swap) { + bool now_entering = false; + EXPECT_FALSE(sync_val_compare_and_swap(&now_entering, false, true)); + EXPECT_TRUE(sync_val_compare_and_swap(&now_entering, false, true)); + EXPECT_TRUE(sync_val_compare_and_swap(&now_entering, false, true)); +} + +TEST(utilities, InitGoogleLoggingDeathTest) { + ASSERT_DEATH(InitGoogleLogging("foobar"), ""); +} + +int main(int argc, char **argv) { + InitGoogleLogging(argv[0]); + InitGoogleTest(&argc, argv); + + CHECK_EQ(RUN_ALL_TESTS(), 0); +} diff --git a/spotify/breakpad/third_party/glog/src/vlog_is_on.cc b/spotify/breakpad/third_party/glog/src/vlog_is_on.cc new file mode 100644 index 000000000..ee0e412f6 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/vlog_is_on.cc @@ -0,0 +1,249 @@ +// Copyright (c) 1999, 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Ray Sidney and many others +// +// Broken out from logging.cc by Soren Lassen +// logging_unittest.cc covers the functionality herein + +#include "utilities.h" + +#include +#include +#include +#include +#include +#include "base/commandlineflags.h" +#include "glog/logging.h" +#include "glog/raw_logging.h" +#include "base/googleinit.h" + +// glog doesn't have annotation +#define ANNOTATE_BENIGN_RACE(address, description) + +using std::string; + +GLOG_DEFINE_int32(v, 0, "Show all VLOG(m) messages for m <= this." +" Overridable by --vmodule."); + +GLOG_DEFINE_string(vmodule, "", "per-module verbose level." +" Argument is a comma-separated list of =." +" is a glob pattern, matched against the filename base" +" (that is, name ignoring .cc/.h./-inl.h)." +" overrides any value given by --v."); + +_START_GOOGLE_NAMESPACE_ + +namespace glog_internal_namespace_ { + +// Implementation of fnmatch that does not need 0-termination +// of arguments and does not allocate any memory, +// but we only support "*" and "?" wildcards, not the "[...]" patterns. +// It's not a static function for the unittest. +GOOGLE_GLOG_DLL_DECL bool SafeFNMatch_(const char* pattern, + size_t patt_len, + const char* str, + size_t str_len) { + int p = 0; + int s = 0; + while (1) { + if (p == patt_len && s == str_len) return true; + if (p == patt_len) return false; + if (s == str_len) return p+1 == patt_len && pattern[p] == '*'; + if (pattern[p] == str[s] || pattern[p] == '?') { + p += 1; + s += 1; + continue; + } + if (pattern[p] == '*') { + if (p+1 == patt_len) return true; + do { + if (SafeFNMatch_(pattern+(p+1), patt_len-(p+1), str+s, str_len-s)) { + return true; + } + s += 1; + } while (s != str_len); + return false; + } + return false; + } +} + +} // namespace glog_internal_namespace_ + +using glog_internal_namespace_::SafeFNMatch_; + +int32 kLogSiteUninitialized = 1000; + +// List of per-module log levels from FLAGS_vmodule. +// Once created each element is never deleted/modified +// except for the vlog_level: other threads will read VModuleInfo blobs +// w/o locks and we'll store pointers to vlog_level at VLOG locations +// that will never go away. +// We can't use an STL struct here as we wouldn't know +// when it's safe to delete/update it: other threads need to use it w/o locks. +struct VModuleInfo { + string module_pattern; + mutable int32 vlog_level; // Conceptually this is an AtomicWord, but it's + // too much work to use AtomicWord type here + // w/o much actual benefit. + const VModuleInfo* next; +}; + +// This protects the following global variables. +static Mutex vmodule_lock; +// Pointer to head of the VModuleInfo list. +// It's a map from module pattern to logging level for those module(s). +static VModuleInfo* vmodule_list = 0; +// Boolean initialization flag. +static bool inited_vmodule = false; + +// L >= vmodule_lock. +static void VLOG2Initializer() { + vmodule_lock.AssertHeld(); + // Can now parse --vmodule flag and initialize mapping of module-specific + // logging levels. + inited_vmodule = false; + const char* vmodule = FLAGS_vmodule.c_str(); + const char* sep; + VModuleInfo* head = NULL; + VModuleInfo* tail = NULL; + while ((sep = strchr(vmodule, '=')) != NULL) { + string pattern(vmodule, sep - vmodule); + int module_level; + if (sscanf(sep, "=%d", &module_level) == 1) { + VModuleInfo* info = new VModuleInfo; + info->module_pattern = pattern; + info->vlog_level = module_level; + if (head) tail->next = info; + else head = info; + tail = info; + } + // Skip past this entry + vmodule = strchr(sep, ','); + if (vmodule == NULL) break; + vmodule++; // Skip past "," + } + if (head) { // Put them into the list at the head: + tail->next = vmodule_list; + vmodule_list = head; + } + inited_vmodule = true; +} + +// This can be called very early, so we use SpinLock and RAW_VLOG here. +int SetVLOGLevel(const char* module_pattern, int log_level) { + int result = FLAGS_v; + int const pattern_len = strlen(module_pattern); + bool found = false; + MutexLock l(&vmodule_lock); // protect whole read-modify-write + for (const VModuleInfo* info = vmodule_list; + info != NULL; info = info->next) { + if (info->module_pattern == module_pattern) { + if (!found) { + result = info->vlog_level; + found = true; + } + info->vlog_level = log_level; + } else if (!found && + SafeFNMatch_(info->module_pattern.c_str(), + info->module_pattern.size(), + module_pattern, pattern_len)) { + result = info->vlog_level; + found = true; + } + } + if (!found) { + VModuleInfo* info = new VModuleInfo; + info->module_pattern = module_pattern; + info->vlog_level = log_level; + info->next = vmodule_list; + vmodule_list = info; + } + RAW_VLOG(1, "Set VLOG level for \"%s\" to %d", module_pattern, log_level); + return result; +} + +// NOTE: Individual VLOG statements cache the integer log level pointers. +// NOTE: This function must not allocate memory or require any locks. +bool InitVLOG3__(int32** site_flag, int32* site_default, + const char* fname, int32 verbose_level) { + MutexLock l(&vmodule_lock); + bool read_vmodule_flag = inited_vmodule; + if (!read_vmodule_flag) { + VLOG2Initializer(); + } + + // protect the errno global in case someone writes: + // VLOG(..) << "The last error was " << strerror(errno) + int old_errno = errno; + + // site_default normally points to FLAGS_v + int32* site_flag_value = site_default; + + // Get basename for file + const char* base = strrchr(fname, '/'); + base = base ? (base+1) : fname; + const char* base_end = strchr(base, '.'); + size_t base_length = base_end ? (base_end - base) : strlen(base); + + // Trim out trailing "-inl" if any + if (base_length >= 4 && (memcmp(base+base_length-4, "-inl", 4) == 0)) { + base_length -= 4; + } + + // TODO: Trim out _unittest suffix? Perhaps it is better to have + // the extra control and just leave it there. + + // find target in vector of modules, replace site_flag_value with + // a module-specific verbose level, if any. + for (const VModuleInfo* info = vmodule_list; + info != NULL; info = info->next) { + if (SafeFNMatch_(info->module_pattern.c_str(), info->module_pattern.size(), + base, base_length)) { + site_flag_value = &info->vlog_level; + // value at info->vlog_level is now what controls + // the VLOG at the caller site forever + break; + } + } + + // Cache the vlog value pointer if --vmodule flag has been parsed. + ANNOTATE_BENIGN_RACE(site_flag, + "*site_flag may be written by several threads," + " but the value will be the same"); + if (read_vmodule_flag) *site_flag = site_flag_value; + + // restore the errno in case something recoverable went wrong during + // the initialization of the VLOG mechanism (see above note "protect the..") + errno = old_errno; + return *site_flag_value >= verbose_level; +} + +_END_GOOGLE_NAMESPACE_ diff --git a/spotify/breakpad/third_party/glog/src/windows/config.h b/spotify/breakpad/third_party/glog/src/windows/config.h new file mode 100755 index 000000000..114762e84 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/config.h @@ -0,0 +1,136 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Namespace for Google classes */ +#define GOOGLE_NAMESPACE google + +/* Define if you have the `dladdr' function */ +#undef HAVE_DLADDR + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_EXECINFO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIBUNWIND_H + +/* define if you have google gflags library */ +#undef HAVE_LIB_GFLAGS + +/* define if you have libunwind */ +#undef HAVE_LIB_UNWIND + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* define if the compiler implements namespaces */ +#undef HAVE_NAMESPACES + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* define if the compiler implements pthread_rwlock_* */ +#undef HAVE_RWLOCK + +/* Define if you have the `sigaltstack' function */ +#undef HAVE_SIGALTSTACK + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSCALL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCALL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UCONTEXT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* define if the compiler supports using expression for operator */ +#undef HAVE_USING_OPERATOR + +/* define if your compiler has __attribute__ */ +#undef HAVE___ATTRIBUTE__ + +/* define if your compiler has __builtin_expect */ +#undef HAVE___BUILTIN_EXPECT + +/* define if your compiler has __sync_val_compare_and_swap */ +#undef HAVE___SYNC_VAL_COMPARE_AND_SWAP + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* How to access the PC from a struct ucontext */ +#undef PC_FROM_UCONTEXT + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* the namespace where STL code like vector<> is defined */ +#undef STL_NAMESPACE + +/* Version number of package */ +#undef VERSION + +/* Stops putting the code inside the Google namespace */ +#define _END_GOOGLE_NAMESPACE_ } + +/* Puts following code inside the Google namespace */ +#define _START_GOOGLE_NAMESPACE_ namespace google { + +/* Always the empty-string on non-windows systems. On windows, should be + "__declspec(dllexport)". This way, when we compile the dll, we export our + functions/classes. It's safe to define this here because config.h is only + used internally, to compile the DLL, and every DLL source file #includes + "config.h" before anything else. */ +#ifndef GOOGLE_GLOG_DLL_DECL +# define GOOGLE_GLOG_IS_A_DLL 1 /* not set if you're statically linking */ +# define GOOGLE_GLOG_DLL_DECL __declspec(dllexport) +# define GOOGLE_GLOG_DLL_DECL_FOR_UNITTESTS __declspec(dllimport) +#endif diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h b/spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h new file mode 100644 index 000000000..5e7d09eff --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h @@ -0,0 +1,88 @@ +// This file is automatically generated from src/glog/log_severity.h +// using src/windows/preprocess.sh. +// DO NOT EDIT! + +// Copyright (c) 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef BASE_LOG_SEVERITY_H__ +#define BASE_LOG_SEVERITY_H__ + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +// Variables of type LogSeverity are widely taken to lie in the range +// [0, NUM_SEVERITIES-1]. Be careful to preserve this assumption if +// you ever need to change their values or add a new severity. +typedef int LogSeverity; + +const int INFO = 0, WARNING = 1, ERROR = 2, FATAL = 3, NUM_SEVERITIES = 4; + +// DFATAL is FATAL in debug mode, ERROR in normal mode +#ifdef NDEBUG +#define DFATAL_LEVEL ERROR +#else +#define DFATAL_LEVEL FATAL +#endif + +extern GOOGLE_GLOG_DLL_DECL const char* const LogSeverityNames[NUM_SEVERITIES]; + +// NDEBUG usage helpers related to (RAW_)DCHECK: +// +// DEBUG_MODE is for small !NDEBUG uses like +// if (DEBUG_MODE) foo.CheckThatFoo(); +// instead of substantially more verbose +// #ifndef NDEBUG +// foo.CheckThatFoo(); +// #endif +// +// IF_DEBUG_MODE is for small !NDEBUG uses like +// IF_DEBUG_MODE( string error; ) +// DCHECK(Foo(&error)) << error; +// instead of substantially more verbose +// #ifndef NDEBUG +// string error; +// DCHECK(Foo(&error)) << error; +// #endif +// +#ifdef NDEBUG +enum { DEBUG_MODE = 0 }; +#define IF_DEBUG_MODE(x) +#else +enum { DEBUG_MODE = 1 }; +#define IF_DEBUG_MODE(x) x +#endif + +#endif // BASE_LOG_SEVERITY_H__ diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/logging.h b/spotify/breakpad/third_party/glog/src/windows/glog/logging.h new file mode 100755 index 000000000..7a6df74f4 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/glog/logging.h @@ -0,0 +1,1510 @@ +// This file is automatically generated from src/glog/logging.h.in +// using src/windows/preprocess.sh. +// DO NOT EDIT! + +// Copyright (c) 1999, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Ray Sidney +// +// This file contains #include information about logging-related stuff. +// Pretty much everybody needs to #include this file so that they can +// log various happenings. +// +#ifndef _LOGGING_H_ +#define _LOGGING_H_ + +#include +#include +#include +#include +#if 0 +# include +#endif +#ifdef __DEPRECATED +// Make GCC quiet. +# undef __DEPRECATED +# include +# define __DEPRECATED +#else +# include +#endif +#include + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +// We care a lot about number of bits things take up. Unfortunately, +// systems define their bit-specific ints in a lot of different ways. +// We use our own way, and have a typedef to get there. +// Note: these commands below may look like "#if 1" or "#if 0", but +// that's because they were constructed that way at ./configure time. +// Look at logging.h.in to see how they're calculated (based on your config). +#if 0 +#include // the normal place uint16_t is defined +#endif +#if 0 +#include // the normal place u_int16_t is defined +#endif +#if 0 +#include // a third place for uint16_t or u_int16_t +#endif + +#if 0 +#include +#endif + +namespace google { + +#if 0 // the C99 format +typedef int32_t int32; +typedef uint32_t uint32; +typedef int64_t int64; +typedef uint64_t uint64; +#elif 0 // the BSD format +typedef int32_t int32; +typedef u_int32_t uint32; +typedef int64_t int64; +typedef u_int64_t uint64; +#elif 1 // the windows (vc7) format +typedef __int32 int32; +typedef unsigned __int32 uint32; +typedef __int64 int64; +typedef unsigned __int64 uint64; +#else +#error Do not know how to define a 32-bit integer quantity on your system +#endif + +} + +// The global value of GOOGLE_STRIP_LOG. All the messages logged to +// LOG(XXX) with severity less than GOOGLE_STRIP_LOG will not be displayed. +// If it can be determined at compile time that the message will not be +// printed, the statement will be compiled out. +// +// Example: to strip out all INFO and WARNING messages, use the value +// of 2 below. To make an exception for WARNING messages from a single +// file, add "#define GOOGLE_STRIP_LOG 1" to that file _before_ including +// base/logging.h +#ifndef GOOGLE_STRIP_LOG +#define GOOGLE_STRIP_LOG 0 +#endif + +// GCC can be told that a certain branch is not likely to be taken (for +// instance, a CHECK failure), and use that information in static analysis. +// Giving it this information can help it optimize for the common case in +// the absence of better information (ie. -fprofile-arcs). +// +#ifndef GOOGLE_PREDICT_BRANCH_NOT_TAKEN +#if 0 +#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) (__builtin_expect(x, 0)) +#else +#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) x +#endif +#endif + +// Make a bunch of macros for logging. The way to log things is to stream +// things to LOG(). E.g., +// +// LOG(INFO) << "Found " << num_cookies << " cookies"; +// +// You can capture log messages in a string, rather than reporting them +// immediately: +// +// vector errors; +// LOG_STRING(ERROR, &errors) << "Couldn't parse cookie #" << cookie_num; +// +// This pushes back the new error onto 'errors'; if given a NULL pointer, +// it reports the error via LOG(ERROR). +// +// You can also do conditional logging: +// +// LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; +// +// You can also do occasional logging (log every n'th occurrence of an +// event): +// +// LOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie"; +// +// The above will cause log messages to be output on the 1st, 11th, 21st, ... +// times it is executed. Note that the special COUNTER value is used to +// identify which repetition is happening. +// +// You can also do occasional conditional logging (log every n'th +// occurrence of an event, when condition is satisfied): +// +// LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << COUNTER +// << "th big cookie"; +// +// You can log messages the first N times your code executes a line. E.g. +// +// LOG_FIRST_N(INFO, 20) << "Got the " << COUNTER << "th cookie"; +// +// Outputs log messages for the first 20 times it is executed. +// +// Analogous SYSLOG, SYSLOG_IF, and SYSLOG_EVERY_N macros are available. +// These log to syslog as well as to the normal logs. If you use these at +// all, you need to be aware that syslog can drastically reduce performance, +// especially if it is configured for remote logging! Don't use these +// unless you fully understand this and have a concrete need to use them. +// Even then, try to minimize your use of them. +// +// There are also "debug mode" logging macros like the ones above: +// +// DLOG(INFO) << "Found cookies"; +// +// DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies"; +// +// DLOG_EVERY_N(INFO, 10) << "Got the " << COUNTER << "th cookie"; +// +// All "debug mode" logging is compiled away to nothing for non-debug mode +// compiles. +// +// We also have +// +// LOG_ASSERT(assertion); +// DLOG_ASSERT(assertion); +// +// which is syntactic sugar for {,D}LOG_IF(FATAL, assert fails) << assertion; +// +// There are "verbose level" logging macros. They look like +// +// VLOG(1) << "I'm printed when you run the program with --v=1 or more"; +// VLOG(2) << "I'm printed when you run the program with --v=2 or more"; +// +// These always log at the INFO log level (when they log at all). +// The verbose logging can also be turned on module-by-module. For instance, +// --vmodule=mapreduce=2,file=1,gfs*=3 --v=0 +// will cause: +// a. VLOG(2) and lower messages to be printed from mapreduce.{h,cc} +// b. VLOG(1) and lower messages to be printed from file.{h,cc} +// c. VLOG(3) and lower messages to be printed from files prefixed with "gfs" +// d. VLOG(0) and lower messages to be printed from elsewhere +// +// The wildcarding functionality shown by (c) supports both '*' (match +// 0 or more characters) and '?' (match any single character) wildcards. +// +// There's also VLOG_IS_ON(n) "verbose level" condition macro. To be used as +// +// if (VLOG_IS_ON(2)) { +// // do some logging preparation and logging +// // that can't be accomplished with just VLOG(2) << ...; +// } +// +// There are also VLOG_IF, VLOG_EVERY_N and VLOG_IF_EVERY_N "verbose level" +// condition macros for sample cases, when some extra computation and +// preparation for logs is not needed. +// VLOG_IF(1, (size > 1024)) +// << "I'm printed when size is more than 1024 and when you run the " +// "program with --v=1 or more"; +// VLOG_EVERY_N(1, 10) +// << "I'm printed every 10th occurrence, and when you run the program " +// "with --v=1 or more. Present occurence is " << COUNTER; +// VLOG_IF_EVERY_N(1, (size > 1024), 10) +// << "I'm printed on every 10th occurence of case when size is more " +// " than 1024, when you run the program with --v=1 or more. "; +// "Present occurence is " << COUNTER; +// +// The supported severity levels for macros that allow you to specify one +// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL. +// Note that messages of a given severity are logged not only in the +// logfile for that severity, but also in all logfiles of lower severity. +// E.g., a message of severity FATAL will be logged to the logfiles of +// severity FATAL, ERROR, WARNING, and INFO. +// +// There is also the special severity of DFATAL, which logs FATAL in +// debug mode, ERROR in normal mode. +// +// Very important: logging a message at the FATAL severity level causes +// the program to terminate (after the message is logged). +// +// Unless otherwise specified, logs will be written to the filename +// "...log..", followed +// by the date, time, and pid (you can't prevent the date, time, and pid +// from being in the filename). +// +// The logging code takes two flags: +// --v=# set the verbose level +// --logtostderr log all the messages to stderr instead of to logfiles + +// LOG LINE PREFIX FORMAT +// +// Log lines have this form: +// +// Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg... +// +// where the fields are defined as follows: +// +// L A single character, representing the log level +// (eg 'I' for INFO) +// mm The month (zero padded; ie May is '05') +// dd The day (zero padded) +// hh:mm:ss.uuuuuu Time in hours, minutes and fractional seconds +// threadid The space-padded thread ID as returned by GetTID() +// (this matches the PID on Linux) +// file The file name +// line The line number +// msg The user-supplied message +// +// Example: +// +// I1103 11:57:31.739339 24395 google.cc:2341] Command line: ./some_prog +// I1103 11:57:31.739403 24395 google.cc:2342] Process id 24395 +// +// NOTE: although the microseconds are useful for comparing events on +// a single machine, clocks on different machines may not be well +// synchronized. Hence, use caution when comparing the low bits of +// timestamps from different machines. + +#ifndef DECLARE_VARIABLE +#define MUST_UNDEF_GFLAGS_DECLARE_MACROS +#define DECLARE_VARIABLE(type, name, tn) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead { \ + extern GOOGLE_GLOG_DLL_DECL type FLAGS_##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_##tn##_instead::FLAGS_##name + +// bool specialization +#define DECLARE_bool(name) \ + DECLARE_VARIABLE(bool, name, bool) + +// int32 specialization +#define DECLARE_int32(name) \ + DECLARE_VARIABLE(google::int32, name, int32) + +// Special case for string, because we have to specify the namespace +// std::string, which doesn't play nicely with our FLAG__namespace hackery. +#define DECLARE_string(name) \ + namespace FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead { \ + extern GOOGLE_GLOG_DLL_DECL std::string FLAGS_##name; \ + } \ + using FLAG__namespace_do_not_use_directly_use_DECLARE_string_instead::FLAGS_##name +#endif + +// Set whether log messages go to stderr instead of logfiles +DECLARE_bool(logtostderr); + +// Set whether log messages go to stderr in addition to logfiles. +DECLARE_bool(alsologtostderr); + +// Log messages at a level >= this flag are automatically sent to +// stderr in addition to log files. +DECLARE_int32(stderrthreshold); + +// Set whether the log prefix should be prepended to each line of output. +DECLARE_bool(log_prefix); + +// Log messages at a level <= this flag are buffered. +// Log messages at a higher level are flushed immediately. +DECLARE_int32(logbuflevel); + +// Sets the maximum number of seconds which logs may be buffered for. +DECLARE_int32(logbufsecs); + +// Log suppression level: messages logged at a lower level than this +// are suppressed. +DECLARE_int32(minloglevel); + +// If specified, logfiles are written into this directory instead of the +// default logging directory. +DECLARE_string(log_dir); + +// Sets the path of the directory into which to put additional links +// to the log files. +DECLARE_string(log_link); + +DECLARE_int32(v); // in vlog_is_on.cc + +// Sets the maximum log file size (in MB). +DECLARE_int32(max_log_size); + +// Sets whether to avoid logging to the disk if the disk is full. +DECLARE_bool(stop_logging_if_full_disk); + +#ifdef MUST_UNDEF_GFLAGS_DECLARE_MACROS +#undef MUST_UNDEF_GFLAGS_DECLARE_MACROS +#undef DECLARE_VARIABLE +#undef DECLARE_bool +#undef DECLARE_int32 +#undef DECLARE_string +#endif + +// Log messages below the GOOGLE_STRIP_LOG level will be compiled away for +// security reasons. See LOG(severtiy) below. + +// A few definitions of macros that don't generate much code. Since +// LOG(INFO) and its ilk are used all over our code, it's +// better to have compact code for these operations. + +#if GOOGLE_STRIP_LOG == 0 +#define COMPACT_GOOGLE_LOG_INFO google::LogMessage( \ + __FILE__, __LINE__) +#define LOG_TO_STRING_INFO(message) google::LogMessage( \ + __FILE__, __LINE__, google::INFO, message) +#else +#define COMPACT_GOOGLE_LOG_INFO google::NullStream() +#define LOG_TO_STRING_INFO(message) google::NullStream() +#endif + +#if GOOGLE_STRIP_LOG <= 1 +#define COMPACT_GOOGLE_LOG_WARNING google::LogMessage( \ + __FILE__, __LINE__, google::WARNING) +#define LOG_TO_STRING_WARNING(message) google::LogMessage( \ + __FILE__, __LINE__, google::WARNING, message) +#else +#define COMPACT_GOOGLE_LOG_WARNING google::NullStream() +#define LOG_TO_STRING_WARNING(message) google::NullStream() +#endif + +#if GOOGLE_STRIP_LOG <= 2 +#define COMPACT_GOOGLE_LOG_ERROR google::LogMessage( \ + __FILE__, __LINE__, google::ERROR) +#define LOG_TO_STRING_ERROR(message) google::LogMessage( \ + __FILE__, __LINE__, google::ERROR, message) +#else +#define COMPACT_GOOGLE_LOG_ERROR google::NullStream() +#define LOG_TO_STRING_ERROR(message) google::NullStream() +#endif + +#if GOOGLE_STRIP_LOG <= 3 +#define COMPACT_GOOGLE_LOG_FATAL google::LogMessageFatal( \ + __FILE__, __LINE__) +#define LOG_TO_STRING_FATAL(message) google::LogMessage( \ + __FILE__, __LINE__, google::FATAL, message) +#else +#define COMPACT_GOOGLE_LOG_FATAL google::NullStreamFatal() +#define LOG_TO_STRING_FATAL(message) google::NullStreamFatal() +#endif + +// For DFATAL, we want to use LogMessage (as opposed to +// LogMessageFatal), to be consistent with the original behavior. +#ifdef NDEBUG +#define COMPACT_GOOGLE_LOG_DFATAL COMPACT_GOOGLE_LOG_ERROR +#elif GOOGLE_STRIP_LOG <= 3 +#define COMPACT_GOOGLE_LOG_DFATAL google::LogMessage( \ + __FILE__, __LINE__, google::FATAL) +#else +#define COMPACT_GOOGLE_LOG_DFATAL google::NullStreamFatal() +#endif + +#define GOOGLE_LOG_INFO(counter) google::LogMessage(__FILE__, __LINE__, google::INFO, counter, &google::LogMessage::SendToLog) +#define SYSLOG_INFO(counter) \ + google::LogMessage(__FILE__, __LINE__, google::INFO, counter, \ + &google::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_WARNING(counter) \ + google::LogMessage(__FILE__, __LINE__, google::WARNING, counter, \ + &google::LogMessage::SendToLog) +#define SYSLOG_WARNING(counter) \ + google::LogMessage(__FILE__, __LINE__, google::WARNING, counter, \ + &google::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_ERROR(counter) \ + google::LogMessage(__FILE__, __LINE__, google::ERROR, counter, \ + &google::LogMessage::SendToLog) +#define SYSLOG_ERROR(counter) \ + google::LogMessage(__FILE__, __LINE__, google::ERROR, counter, \ + &google::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_FATAL(counter) \ + google::LogMessage(__FILE__, __LINE__, google::FATAL, counter, \ + &google::LogMessage::SendToLog) +#define SYSLOG_FATAL(counter) \ + google::LogMessage(__FILE__, __LINE__, google::FATAL, counter, \ + &google::LogMessage::SendToSyslogAndLog) +#define GOOGLE_LOG_DFATAL(counter) \ + google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \ + &google::LogMessage::SendToLog) +#define SYSLOG_DFATAL(counter) \ + google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \ + &google::LogMessage::SendToSyslogAndLog) + +#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) || defined(__CYGWIN32__) +// A very useful logging macro to log windows errors: +#define LOG_SYSRESULT(result) \ + if (FAILED(result)) { \ + LPTSTR message = NULL; \ + LPTSTR msg = reinterpret_cast(&message); \ + DWORD message_length = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | \ + FORMAT_MESSAGE_FROM_SYSTEM, \ + 0, result, 0, msg, 100, NULL); \ + if (message_length > 0) { \ + google::LogMessage(__FILE__, __LINE__, ERROR, 0, \ + &google::LogMessage::SendToLog).stream() << message; \ + LocalFree(message); \ + } \ + } +#endif + +// We use the preprocessor's merging operator, "##", so that, e.g., +// LOG(INFO) becomes the token GOOGLE_LOG_INFO. There's some funny +// subtle difference between ostream member streaming functions (e.g., +// ostream::operator<<(int) and ostream non-member streaming functions +// (e.g., ::operator<<(ostream&, string&): it turns out that it's +// impossible to stream something like a string directly to an unnamed +// ostream. We employ a neat hack by calling the stream() member +// function of LogMessage which seems to avoid the problem. +#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream() +#define SYSLOG(severity) SYSLOG_ ## severity(0).stream() + +namespace google { + +// They need the definitions of integer types. +#include "glog/log_severity.h" +#include "glog/vlog_is_on.h" + +// Initialize google's logging library. You will see the program name +// specified by argv0 in log outputs. +GOOGLE_GLOG_DLL_DECL void InitGoogleLogging(const char* argv0); + +// Shutdown google's logging library. +GOOGLE_GLOG_DLL_DECL void ShutdownGoogleLogging(); + +// Install a function which will be called after LOG(FATAL). +GOOGLE_GLOG_DLL_DECL void InstallFailureFunction(void (*fail_func)()); + +class LogSink; // defined below + +// If a non-NULL sink pointer is given, we push this message to that sink. +// For LOG_TO_SINK we then do normal LOG(severity) logging as well. +// This is useful for capturing messages and passing/storing them +// somewhere more specific than the global log of the process. +// Argument types: +// LogSink* sink; +// LogSeverity severity; +// The cast is to disambiguate NULL arguments. +#define LOG_TO_SINK(sink, severity) \ + google::LogMessage( \ + __FILE__, __LINE__, \ + google::severity, \ + static_cast(sink), true).stream() +#define LOG_TO_SINK_BUT_NOT_TO_LOGFILE(sink, severity) \ + google::LogMessage( \ + __FILE__, __LINE__, \ + google::severity, \ + static_cast(sink), false).stream() + +// If a non-NULL string pointer is given, we write this message to that string. +// We then do normal LOG(severity) logging as well. +// This is useful for capturing messages and storing them somewhere more +// specific than the global log of the process. +// Argument types: +// string* message; +// LogSeverity severity; +// The cast is to disambiguate NULL arguments. +// NOTE: LOG(severity) expands to LogMessage().stream() for the specified +// severity. +#define LOG_TO_STRING(severity, message) \ + LOG_TO_STRING_##severity(static_cast(message)).stream() + +// If a non-NULL pointer is given, we push the message onto the end +// of a vector of strings; otherwise, we report it with LOG(severity). +// This is handy for capturing messages and perhaps passing them back +// to the caller, rather than reporting them immediately. +// Argument types: +// LogSeverity severity; +// vector *outvec; +// The cast is to disambiguate NULL arguments. +#define LOG_STRING(severity, outvec) \ + LOG_TO_STRING_##severity(static_cast*>(outvec)).stream() + +#define LOG_IF(severity, condition) \ + !(condition) ? (void) 0 : google::LogMessageVoidify() & LOG(severity) +#define SYSLOG_IF(severity, condition) \ + !(condition) ? (void) 0 : google::LogMessageVoidify() & SYSLOG(severity) + +#define LOG_ASSERT(condition) \ + LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition +#define SYSLOG_ASSERT(condition) \ + SYSLOG_IF(FATAL, !(condition)) << "Assert failed: " #condition + +// CHECK dies with a fatal error if condition is not true. It is *not* +// controlled by NDEBUG, so the check will be executed regardless of +// compilation mode. Therefore, it is safe to do things like: +// CHECK(fp->Write(x) == 4) +#define CHECK(condition) \ + LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \ + << "Check failed: " #condition " " + +// A container for a string pointer which can be evaluated to a bool - +// true iff the pointer is NULL. +struct CheckOpString { + CheckOpString(std::string* str) : str_(str) { } + // No destructor: if str_ is non-NULL, we're about to LOG(FATAL), + // so there's no point in cleaning up str_. + operator bool() const { + return GOOGLE_PREDICT_BRANCH_NOT_TAKEN(str_ != NULL); + } + std::string* str_; +}; + +// Function is overloaded for integral types to allow static const +// integrals declared in classes and not defined to be used as arguments to +// CHECK* macros. It's not encouraged though. +template +inline const T& GetReferenceableValue(const T& t) { return t; } +inline char GetReferenceableValue(char t) { return t; } +inline unsigned char GetReferenceableValue(unsigned char t) { return t; } +inline signed char GetReferenceableValue(signed char t) { return t; } +inline short GetReferenceableValue(short t) { return t; } +inline unsigned short GetReferenceableValue(unsigned short t) { return t; } +inline int GetReferenceableValue(int t) { return t; } +inline unsigned int GetReferenceableValue(unsigned int t) { return t; } +inline long GetReferenceableValue(long t) { return t; } +inline unsigned long GetReferenceableValue(unsigned long t) { return t; } +inline long long GetReferenceableValue(long long t) { return t; } +inline unsigned long long GetReferenceableValue(unsigned long long t) { + return t; +} + +// This is a dummy class to define the following operator. +struct DummyClassToDefineOperator {}; + +} + +// Define global operator<< to declare using ::operator<<. +// This declaration will allow use to use CHECK macros for user +// defined classes which have operator<< (e.g., stl_logging.h). +inline std::ostream& operator<<( + std::ostream& out, const google::DummyClassToDefineOperator&) { + return out; +} + +namespace google { + +// Build the error message string. +template +std::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) { + // It means that we cannot use stl_logging if compiler doesn't + // support using expression for operator. + // TODO(hamaji): Figure out a way to fix. +#if 1 + using ::operator<<; +#endif + std::strstream ss; + ss << names << " (" << v1 << " vs. " << v2 << ")"; + return new std::string(ss.str(), ss.pcount()); +} + +// Helper functions for CHECK_OP macro. +// The (int, int) specialization works around the issue that the compiler +// will not instantiate the template version of the function on values of +// unnamed enum type - see comment below. +#define DEFINE_CHECK_OP_IMPL(name, op) \ + template \ + inline std::string* Check##name##Impl(const t1& v1, const t2& v2, \ + const char* names) { \ + if (v1 op v2) return NULL; \ + else return MakeCheckOpString(v1, v2, names); \ + } \ + inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \ + return Check##name##Impl(v1, v2, names); \ + } + +// Use _EQ, _NE, _LE, etc. in case the file including base/logging.h +// provides its own #defines for the simpler names EQ, NE, LE, etc. +// This happens if, for example, those are used as token names in a +// yacc grammar. +DEFINE_CHECK_OP_IMPL(_EQ, ==) +DEFINE_CHECK_OP_IMPL(_NE, !=) +DEFINE_CHECK_OP_IMPL(_LE, <=) +DEFINE_CHECK_OP_IMPL(_LT, < ) +DEFINE_CHECK_OP_IMPL(_GE, >=) +DEFINE_CHECK_OP_IMPL(_GT, > ) +#undef DEFINE_CHECK_OP_IMPL + +// Helper macro for binary operators. +// Don't use this macro directly in your code, use CHECK_EQ et al below. + +#if defined(STATIC_ANALYSIS) +// Only for static analysis tool to know that it is equivalent to assert +#define CHECK_OP_LOG(name, op, val1, val2, log) CHECK((val1) op (val2)) +#elif !defined(NDEBUG) +// In debug mode, avoid constructing CheckOpStrings if possible, +// to reduce the overhead of CHECK statments by 2x. +// Real DCHECK-heavy tests have seen 1.5x speedups. + +// The meaning of "string" might be different between now and +// when this macro gets invoked (e.g., if someone is experimenting +// with other string implementations that get defined after this +// file is included). Save the current meaning now and use it +// in the macro. +typedef std::string _Check_string; +#define CHECK_OP_LOG(name, op, val1, val2, log) \ + while (google::_Check_string* _result = \ + google::Check##name##Impl( \ + google::GetReferenceableValue(val1), \ + google::GetReferenceableValue(val2), \ + #val1 " " #op " " #val2)) \ + log(__FILE__, __LINE__, \ + google::CheckOpString(_result)).stream() +#else +// In optimized mode, use CheckOpString to hint to compiler that +// the while condition is unlikely. +#define CHECK_OP_LOG(name, op, val1, val2, log) \ + while (google::CheckOpString _result = \ + google::Check##name##Impl( \ + google::GetReferenceableValue(val1), \ + google::GetReferenceableValue(val2), \ + #val1 " " #op " " #val2)) \ + log(__FILE__, __LINE__, _result).stream() +#endif // STATIC_ANALYSIS, !NDEBUG + +#if GOOGLE_STRIP_LOG <= 3 +#define CHECK_OP(name, op, val1, val2) \ + CHECK_OP_LOG(name, op, val1, val2, google::LogMessageFatal) +#else +#define CHECK_OP(name, op, val1, val2) \ + CHECK_OP_LOG(name, op, val1, val2, google::NullStreamFatal) +#endif // STRIP_LOG <= 3 + +// Equality/Inequality checks - compare two values, and log a FATAL message +// including the two values when the result is not as expected. The values +// must have operator<<(ostream, ...) defined. +// +// You may append to the error message like so: +// CHECK_NE(1, 2) << ": The world must be ending!"; +// +// We are very careful to ensure that each argument is evaluated exactly +// once, and that anything which is legal to pass as a function argument is +// legal here. In particular, the arguments may be temporary expressions +// which will end up being destroyed at the end of the apparent statement, +// for example: +// CHECK_EQ(string("abc")[1], 'b'); +// +// WARNING: These don't compile correctly if one of the arguments is a pointer +// and the other is NULL. To work around this, simply static_cast NULL to the +// type of the desired pointer. + +#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2) +#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2) +#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2) +#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2) +#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2) +#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2) + +// Check that the input is non NULL. This very useful in constructor +// initializer lists. + +#define CHECK_NOTNULL(val) \ + google::CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val)) + +// Helper functions for string comparisons. +// To avoid bloat, the definitions are in logging.cc. +#define DECLARE_CHECK_STROP_IMPL(func, expected) \ + GOOGLE_GLOG_DLL_DECL std::string* Check##func##expected##Impl( \ + const char* s1, const char* s2, const char* names); +DECLARE_CHECK_STROP_IMPL(strcmp, true) +DECLARE_CHECK_STROP_IMPL(strcmp, false) +DECLARE_CHECK_STROP_IMPL(strcasecmp, true) +DECLARE_CHECK_STROP_IMPL(strcasecmp, false) +#undef DECLARE_CHECK_STROP_IMPL + +// Helper macro for string comparisons. +// Don't use this macro directly in your code, use CHECK_STREQ et al below. +#define CHECK_STROP(func, op, expected, s1, s2) \ + while (google::CheckOpString _result = \ + google::Check##func##expected##Impl((s1), (s2), \ + #s1 " " #op " " #s2)) \ + LOG(FATAL) << *_result.str_ + + +// String (char*) equality/inequality checks. +// CASE versions are case-insensitive. +// +// Note that "s1" and "s2" may be temporary strings which are destroyed +// by the compiler at the end of the current "full expression" +// (e.g. CHECK_STREQ(Foo().c_str(), Bar().c_str())). + +#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2) +#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2) +#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2) +#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2) + +#define CHECK_INDEX(I,A) CHECK(I < (sizeof(A)/sizeof(A[0]))) +#define CHECK_BOUND(B,A) CHECK(B <= (sizeof(A)/sizeof(A[0]))) + +#define CHECK_DOUBLE_EQ(val1, val2) \ + do { \ + CHECK_LE((val1), (val2)+0.000000000000001L); \ + CHECK_GE((val1), (val2)-0.000000000000001L); \ + } while (0) + +#define CHECK_NEAR(val1, val2, margin) \ + do { \ + CHECK_LE((val1), (val2)+(margin)); \ + CHECK_GE((val1), (val2)-(margin)); \ + } while (0) + +// perror()..googly style! +// +// PLOG() and PLOG_IF() and PCHECK() behave exactly like their LOG* and +// CHECK equivalents with the addition that they postpend a description +// of the current state of errno to their output lines. + +#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream() + +#define GOOGLE_PLOG(severity, counter) \ + google::ErrnoLogMessage( \ + __FILE__, __LINE__, google::severity, counter, \ + &google::LogMessage::SendToLog) + +#define PLOG_IF(severity, condition) \ + !(condition) ? (void) 0 : google::LogMessageVoidify() & PLOG(severity) + +// A CHECK() macro that postpends errno if the condition is false. E.g. +// +// if (poll(fds, nfds, timeout) == -1) { PCHECK(errno == EINTR); ... } +#define PCHECK(condition) \ + PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \ + << "Check failed: " #condition " " + +// A CHECK() macro that lets you assert the success of a function that +// returns -1 and sets errno in case of an error. E.g. +// +// CHECK_ERR(mkdir(path, 0700)); +// +// or +// +// int fd = open(filename, flags); CHECK_ERR(fd) << ": open " << filename; +#define CHECK_ERR(invocation) \ +PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN((invocation) == -1)) \ + << #invocation + +// Use macro expansion to create, for each use of LOG_EVERY_N(), static +// variables with the __LINE__ expansion as part of the variable name. +#define LOG_EVERY_N_VARNAME(base, line) LOG_EVERY_N_VARNAME_CONCAT(base, line) +#define LOG_EVERY_N_VARNAME_CONCAT(base, line) base ## line + +#define LOG_OCCURRENCES LOG_EVERY_N_VARNAME(occurrences_, __LINE__) +#define LOG_OCCURRENCES_MOD_N LOG_EVERY_N_VARNAME(occurrences_mod_n_, __LINE__) + +#define SOME_KIND_OF_LOG_EVERY_N(severity, n, what_to_do) \ + static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \ + ++LOG_OCCURRENCES; \ + if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \ + if (LOG_OCCURRENCES_MOD_N == 1) \ + google::LogMessage( \ + __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +#define SOME_KIND_OF_LOG_IF_EVERY_N(severity, condition, n, what_to_do) \ + static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \ + ++LOG_OCCURRENCES; \ + if (condition && \ + ((LOG_OCCURRENCES_MOD_N=(LOG_OCCURRENCES_MOD_N + 1) % n) == (1 % n))) \ + google::LogMessage( \ + __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +#define SOME_KIND_OF_PLOG_EVERY_N(severity, n, what_to_do) \ + static int LOG_OCCURRENCES = 0, LOG_OCCURRENCES_MOD_N = 0; \ + ++LOG_OCCURRENCES; \ + if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \ + if (LOG_OCCURRENCES_MOD_N == 1) \ + google::ErrnoLogMessage( \ + __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +#define SOME_KIND_OF_LOG_FIRST_N(severity, n, what_to_do) \ + static int LOG_OCCURRENCES = 0; \ + if (LOG_OCCURRENCES <= n) \ + ++LOG_OCCURRENCES; \ + if (LOG_OCCURRENCES <= n) \ + google::LogMessage( \ + __FILE__, __LINE__, google::severity, LOG_OCCURRENCES, \ + &what_to_do).stream() + +namespace glog_internal_namespace_ { +template +struct CompileAssert { +}; +struct CrashReason; +} // namespace glog_internal_namespace_ + +#define GOOGLE_GLOG_COMPILE_ASSERT(expr, msg) \ + typedef google::glog_internal_namespace_::CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1] + +#define LOG_EVERY_N(severity, n) \ + GOOGLE_GLOG_COMPILE_ASSERT(google::severity < \ + google::NUM_SEVERITIES, \ + INVALID_REQUESTED_LOG_SEVERITY); \ + SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToLog) + +#define SYSLOG_EVERY_N(severity, n) \ + SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToSyslogAndLog) + +#define PLOG_EVERY_N(severity, n) \ + SOME_KIND_OF_PLOG_EVERY_N(severity, (n), google::LogMessage::SendToLog) + +#define LOG_FIRST_N(severity, n) \ + SOME_KIND_OF_LOG_FIRST_N(severity, (n), google::LogMessage::SendToLog) + +#define LOG_IF_EVERY_N(severity, condition, n) \ + SOME_KIND_OF_LOG_IF_EVERY_N(severity, (condition), (n), google::LogMessage::SendToLog) + +// We want the special COUNTER value available for LOG_EVERY_X()'ed messages +enum PRIVATE_Counter {COUNTER}; + + +// Plus some debug-logging macros that get compiled to nothing for production + +#ifndef NDEBUG + +#define DLOG(severity) LOG(severity) +#define DVLOG(verboselevel) VLOG(verboselevel) +#define DLOG_IF(severity, condition) LOG_IF(severity, condition) +#define DLOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n) +#define DLOG_IF_EVERY_N(severity, condition, n) \ + LOG_IF_EVERY_N(severity, condition, n) +#define DLOG_ASSERT(condition) LOG_ASSERT(condition) + +// debug-only checking. not executed in NDEBUG mode. +#define DCHECK(condition) CHECK(condition) +#define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2) +#define DCHECK_NE(val1, val2) CHECK_NE(val1, val2) +#define DCHECK_LE(val1, val2) CHECK_LE(val1, val2) +#define DCHECK_LT(val1, val2) CHECK_LT(val1, val2) +#define DCHECK_GE(val1, val2) CHECK_GE(val1, val2) +#define DCHECK_GT(val1, val2) CHECK_GT(val1, val2) +#define DCHECK_NOTNULL(val) CHECK_NOTNULL(val) +#define DCHECK_STREQ(str1, str2) CHECK_STREQ(str1, str2) +#define DCHECK_STRCASEEQ(str1, str2) CHECK_STRCASEEQ(str1, str2) +#define DCHECK_STRNE(str1, str2) CHECK_STRNE(str1, str2) +#define DCHECK_STRCASENE(str1, str2) CHECK_STRCASENE(str1, str2) + +#else // NDEBUG + +#define DLOG(severity) \ + true ? (void) 0 : google::LogMessageVoidify() & LOG(severity) + +#define DVLOG(verboselevel) \ + (true || !VLOG_IS_ON(verboselevel)) ?\ + (void) 0 : google::LogMessageVoidify() & LOG(INFO) + +#define DLOG_IF(severity, condition) \ + (true || !(condition)) ? (void) 0 : google::LogMessageVoidify() & LOG(severity) + +#define DLOG_EVERY_N(severity, n) \ + true ? (void) 0 : google::LogMessageVoidify() & LOG(severity) + +#define DLOG_IF_EVERY_N(severity, condition, n) \ + (true || !(condition))? (void) 0 : google::LogMessageVoidify() & LOG(severity) + +#define DLOG_ASSERT(condition) \ + true ? (void) 0 : LOG_ASSERT(condition) + +#define DCHECK(condition) \ + while (false) \ + CHECK(condition) + +#define DCHECK_EQ(val1, val2) \ + while (false) \ + CHECK_EQ(val1, val2) + +#define DCHECK_NE(val1, val2) \ + while (false) \ + CHECK_NE(val1, val2) + +#define DCHECK_LE(val1, val2) \ + while (false) \ + CHECK_LE(val1, val2) + +#define DCHECK_LT(val1, val2) \ + while (false) \ + CHECK_LT(val1, val2) + +#define DCHECK_GE(val1, val2) \ + while (false) \ + CHECK_GE(val1, val2) + +#define DCHECK_GT(val1, val2) \ + while (false) \ + CHECK_GT(val1, val2) + +#define DCHECK_NOTNULL(val) (val) + +#define DCHECK_STREQ(str1, str2) \ + while (false) \ + CHECK_STREQ(str1, str2) + +#define DCHECK_STRCASEEQ(str1, str2) \ + while (false) \ + CHECK_STRCASEEQ(str1, str2) + +#define DCHECK_STRNE(str1, str2) \ + while (false) \ + CHECK_STRNE(str1, str2) + +#define DCHECK_STRCASENE(str1, str2) \ + while (false) \ + CHECK_STRCASENE(str1, str2) + + +#endif // NDEBUG + +// Log only in verbose mode. + +#define VLOG(verboselevel) LOG_IF(INFO, VLOG_IS_ON(verboselevel)) + +#define VLOG_IF(verboselevel, condition) \ + LOG_IF(INFO, (condition) && VLOG_IS_ON(verboselevel)) + +#define VLOG_EVERY_N(verboselevel, n) \ + LOG_IF_EVERY_N(INFO, VLOG_IS_ON(verboselevel), n) + +#define VLOG_IF_EVERY_N(verboselevel, condition, n) \ + LOG_IF_EVERY_N(INFO, (condition) && VLOG_IS_ON(verboselevel), n) + +// +// This class more or less represents a particular log message. You +// create an instance of LogMessage and then stream stuff to it. +// When you finish streaming to it, ~LogMessage is called and the +// full message gets streamed to the appropriate destination. +// +// You shouldn't actually use LogMessage's constructor to log things, +// though. You should use the LOG() macro (and variants thereof) +// above. +class GOOGLE_GLOG_DLL_DECL LogMessage { +public: + enum { + // Passing kNoLogPrefix for the line number disables the + // log-message prefix. Useful for using the LogMessage + // infrastructure as a printing utility. See also the --log_prefix + // flag for controlling the log-message prefix on an + // application-wide basis. + kNoLogPrefix = -1 + }; + + // LogStream inherit from non-DLL-exported class (std::ostrstream) + // and VC++ produces a warning for this situation. + // However, MSDN says "C4275 can be ignored in Microsoft Visual C++ + // 2005 if you are deriving from a type in the Standard C++ Library" + // http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx + // Let's just ignore the warning. +#ifdef _MSC_VER +# pragma warning(disable: 4275) +#endif + class GOOGLE_GLOG_DLL_DECL LogStream : public std::ostrstream { +#ifdef _MSC_VER +# pragma warning(default: 4275) +#endif + public: + LogStream(char *buf, int len, int ctr) + : ostrstream(buf, len), + ctr_(ctr) { + self_ = this; + } + + int ctr() const { return ctr_; } + void set_ctr(int ctr) { ctr_ = ctr; } + LogStream* self() const { return self_; } + + private: + int ctr_; // Counter hack (for the LOG_EVERY_X() macro) + LogStream *self_; // Consistency check hack + }; + +public: + // icc 8 requires this typedef to avoid an internal compiler error. + typedef void (LogMessage::*SendMethod)(); + + LogMessage(const char* file, int line, LogSeverity severity, int ctr, + SendMethod send_method); + + // Two special constructors that generate reduced amounts of code at + // LOG call sites for common cases. + + // Used for LOG(INFO): Implied are: + // severity = INFO, ctr = 0, send_method = &LogMessage::SendToLog. + // + // Using this constructor instead of the more complex constructor above + // saves 19 bytes per call site. + LogMessage(const char* file, int line); + + // Used for LOG(severity) where severity != INFO. Implied + // are: ctr = 0, send_method = &LogMessage::SendToLog + // + // Using this constructor instead of the more complex constructor above + // saves 17 bytes per call site. + LogMessage(const char* file, int line, LogSeverity severity); + + // Constructor to log this message to a specified sink (if not NULL). + // Implied are: ctr = 0, send_method = &LogMessage::SendToSinkAndLog if + // also_send_to_log is true, send_method = &LogMessage::SendToSink otherwise. + LogMessage(const char* file, int line, LogSeverity severity, LogSink* sink, + bool also_send_to_log); + + // Constructor where we also give a vector pointer + // for storing the messages (if the pointer is not NULL). + // Implied are: ctr = 0, send_method = &LogMessage::SaveOrSendToLog. + LogMessage(const char* file, int line, LogSeverity severity, + std::vector* outvec); + + // Constructor where we also give a string pointer for storing the + // message (if the pointer is not NULL). Implied are: ctr = 0, + // send_method = &LogMessage::WriteToStringAndLog. + LogMessage(const char* file, int line, LogSeverity severity, + std::string* message); + + // A special constructor used for check failures + LogMessage(const char* file, int line, const CheckOpString& result); + + ~LogMessage(); + + // Flush a buffered message to the sink set in the constructor. Always + // called by the destructor, it may also be called from elsewhere if + // needed. Only the first call is actioned; any later ones are ignored. + void Flush(); + + // An arbitrary limit on the length of a single log message. This + // is so that streaming can be done more efficiently. + static const size_t kMaxLogMessageLen; + + // Theses should not be called directly outside of logging.*, + // only passed as SendMethod arguments to other LogMessage methods: + void SendToLog(); // Actually dispatch to the logs + void SendToSyslogAndLog(); // Actually dispatch to syslog and the logs + + // Call abort() or similar to perform LOG(FATAL) crash. + static void Fail() ; + + std::ostream& stream() { return *(data_->stream_); } + + int preserved_errno() const { return data_->preserved_errno_; } + + // Must be called without the log_mutex held. (L < log_mutex) + static int64 num_messages(int severity); + +private: + // Fully internal SendMethod cases: + void SendToSinkAndLog(); // Send to sink if provided and dispatch to the logs + void SendToSink(); // Send to sink if provided, do nothing otherwise. + + // Write to string if provided and dispatch to the logs. + void WriteToStringAndLog(); + + void SaveOrSendToLog(); // Save to stringvec if provided, else to logs + + void Init(const char* file, int line, LogSeverity severity, + void (LogMessage::*send_method)()); + + // Used to fill in crash information during LOG(FATAL) failures. + void RecordCrashReason(glog_internal_namespace_::CrashReason* reason); + + // Counts of messages sent at each priority: + static int64 num_messages_[NUM_SEVERITIES]; // under log_mutex + + // We keep the data in a separate struct so that each instance of + // LogMessage uses less stack space. + struct GOOGLE_GLOG_DLL_DECL LogMessageData { + LogMessageData() {}; + + int preserved_errno_; // preserved errno + char* buf_; + char* message_text_; // Complete message text (points to selected buffer) + LogStream* stream_alloc_; + LogStream* stream_; + char severity_; // What level is this LogMessage logged at? + int line_; // line number where logging call is. + void (LogMessage::*send_method_)(); // Call this in destructor to send + union { // At most one of these is used: union to keep the size low. + LogSink* sink_; // NULL or sink to send message to + std::vector* outvec_; // NULL or vector to push message onto + std::string* message_; // NULL or string to write message into + }; + time_t timestamp_; // Time of creation of LogMessage + struct ::tm tm_time_; // Time of creation of LogMessage + size_t num_prefix_chars_; // # of chars of prefix in this message + size_t num_chars_to_log_; // # of chars of msg to send to log + size_t num_chars_to_syslog_; // # of chars of msg to send to syslog + const char* basename_; // basename of file that called LOG + const char* fullname_; // fullname of file that called LOG + bool has_been_flushed_; // false => data has not been flushed + bool first_fatal_; // true => this was first fatal msg + + ~LogMessageData(); + private: + LogMessageData(const LogMessageData&); + void operator=(const LogMessageData&); + }; + + static LogMessageData fatal_msg_data_exclusive_; + static LogMessageData fatal_msg_data_shared_; + + LogMessageData* allocated_; + LogMessageData* data_; + + friend class LogDestination; + + LogMessage(const LogMessage&); + void operator=(const LogMessage&); +}; + +// This class happens to be thread-hostile because all instances share +// a single data buffer, but since it can only be created just before +// the process dies, we don't worry so much. +class GOOGLE_GLOG_DLL_DECL LogMessageFatal : public LogMessage { + public: + LogMessageFatal(const char* file, int line); + LogMessageFatal(const char* file, int line, const CheckOpString& result); + ~LogMessageFatal() ; +}; + +// A non-macro interface to the log facility; (useful +// when the logging level is not a compile-time constant). +inline void LogAtLevel(int const severity, std::string const &msg) { + LogMessage(__FILE__, __LINE__, severity).stream() << msg; +} + +// A macro alternative of LogAtLevel. New code may want to use this +// version since there are two advantages: 1. this version outputs the +// file name and the line number where this macro is put like other +// LOG macros, 2. this macro can be used as C++ stream. +#define LOG_AT_LEVEL(severity) google::LogMessage(__FILE__, __LINE__, severity).stream() + +// A small helper for CHECK_NOTNULL(). +template +T* CheckNotNull(const char *file, int line, const char *names, T* t) { + if (t == NULL) { + LogMessageFatal(file, line, new std::string(names)); + } + return t; +} + +// Allow folks to put a counter in the LOG_EVERY_X()'ed messages. This +// only works if ostream is a LogStream. If the ostream is not a +// LogStream you'll get an assert saying as much at runtime. +GOOGLE_GLOG_DLL_DECL std::ostream& operator<<(std::ostream &os, + const PRIVATE_Counter&); + + +// Derived class for PLOG*() above. +class GOOGLE_GLOG_DLL_DECL ErrnoLogMessage : public LogMessage { + public: + + ErrnoLogMessage(const char* file, int line, LogSeverity severity, int ctr, + void (LogMessage::*send_method)()); + + // Postpends ": strerror(errno) [errno]". + ~ErrnoLogMessage(); + + private: + ErrnoLogMessage(const ErrnoLogMessage&); + void operator=(const ErrnoLogMessage&); +}; + + +// This class is used to explicitly ignore values in the conditional +// logging macros. This avoids compiler warnings like "value computed +// is not used" and "statement has no effect". + +class GOOGLE_GLOG_DLL_DECL LogMessageVoidify { + public: + LogMessageVoidify() { } + // This has to be an operator with a precedence lower than << but + // higher than ?: + void operator&(std::ostream&) { } +}; + + +// Flushes all log files that contains messages that are at least of +// the specified severity level. Thread-safe. +GOOGLE_GLOG_DLL_DECL void FlushLogFiles(LogSeverity min_severity); + +// Flushes all log files that contains messages that are at least of +// the specified severity level. Thread-hostile because it ignores +// locking -- used for catastrophic failures. +GOOGLE_GLOG_DLL_DECL void FlushLogFilesUnsafe(LogSeverity min_severity); + +// +// Set the destination to which a particular severity level of log +// messages is sent. If base_filename is "", it means "don't log this +// severity". Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetLogDestination(LogSeverity severity, + const char* base_filename); + +// +// Set the basename of the symlink to the latest log file at a given +// severity. If symlink_basename is empty, do not make a symlink. If +// you don't call this function, the symlink basename is the +// invocation name of the program. Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetLogSymlink(LogSeverity severity, + const char* symlink_basename); + +// +// Used to send logs to some other kind of destination +// Users should subclass LogSink and override send to do whatever they want. +// Implementations must be thread-safe because a shared instance will +// be called from whichever thread ran the LOG(XXX) line. +class GOOGLE_GLOG_DLL_DECL LogSink { + public: + virtual ~LogSink(); + + // Sink's logging logic (message_len is such as to exclude '\n' at the end). + // This method can't use LOG() or CHECK() as logging system mutex(s) are held + // during this call. + virtual void send(LogSeverity severity, const char* full_filename, + const char* base_filename, int line, + const struct ::tm* tm_time, + const char* message, size_t message_len) = 0; + + // Redefine this to implement waiting for + // the sink's logging logic to complete. + // It will be called after each send() returns, + // but before that LogMessage exits or crashes. + // By default this function does nothing. + // Using this function one can implement complex logic for send() + // that itself involves logging; and do all this w/o causing deadlocks and + // inconsistent rearrangement of log messages. + // E.g. if a LogSink has thread-specific actions, the send() method + // can simply add the message to a queue and wake up another thread that + // handles real logging while itself making some LOG() calls; + // WaitTillSent() can be implemented to wait for that logic to complete. + // See our unittest for an example. + virtual void WaitTillSent(); + + // Returns the normal text output of the log message. + // Can be useful to implement send(). + static std::string ToString(LogSeverity severity, const char* file, int line, + const struct ::tm* tm_time, + const char* message, size_t message_len); +}; + +// Add or remove a LogSink as a consumer of logging data. Thread-safe. +GOOGLE_GLOG_DLL_DECL void AddLogSink(LogSink *destination); +GOOGLE_GLOG_DLL_DECL void RemoveLogSink(LogSink *destination); + +// +// Specify an "extension" added to the filename specified via +// SetLogDestination. This applies to all severity levels. It's +// often used to append the port we're listening on to the logfile +// name. Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetLogFilenameExtension( + const char* filename_extension); + +// +// Make it so that all log messages of at least a particular severity +// are logged to stderr (in addition to logging to the usual log +// file(s)). Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetStderrLogging(LogSeverity min_severity); + +// +// Make it so that all log messages go only to stderr. Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void LogToStderr(); + +// +// Make it so that all log messages of at least a particular severity are +// logged via email to a list of addresses (in addition to logging to the +// usual log file(s)). The list of addresses is just a string containing +// the email addresses to send to (separated by spaces, say). Thread-safe. +// +GOOGLE_GLOG_DLL_DECL void SetEmailLogging(LogSeverity min_severity, + const char* addresses); + +// A simple function that sends email. dest is a commma-separated +// list of addressess. Thread-safe. +GOOGLE_GLOG_DLL_DECL bool SendEmail(const char *dest, + const char *subject, const char *body); + +GOOGLE_GLOG_DLL_DECL const std::vector& GetLoggingDirectories(); + +// For tests only: Clear the internal [cached] list of logging directories to +// force a refresh the next time GetLoggingDirectories is called. +// Thread-hostile. +void TestOnly_ClearLoggingDirectoriesList(); + +// Returns a set of existing temporary directories, which will be a +// subset of the directories returned by GetLogginDirectories(). +// Thread-safe. +GOOGLE_GLOG_DLL_DECL void GetExistingTempDirectories( + std::vector* list); + +// Print any fatal message again -- useful to call from signal handler +// so that the last thing in the output is the fatal message. +// Thread-hostile, but a race is unlikely. +GOOGLE_GLOG_DLL_DECL void ReprintFatalMessage(); + +// Truncate a log file that may be the append-only output of multiple +// processes and hence can't simply be renamed/reopened (typically a +// stdout/stderr). If the file "path" is > "limit" bytes, copy the +// last "keep" bytes to offset 0 and truncate the rest. Since we could +// be racing with other writers, this approach has the potential to +// lose very small amounts of data. For security, only follow symlinks +// if the path is /proc/self/fd/* +GOOGLE_GLOG_DLL_DECL void TruncateLogFile(const char *path, + int64 limit, int64 keep); + +// Truncate stdout and stderr if they are over the value specified by +// --max_log_size; keep the final 1MB. This function has the same +// race condition as TruncateLogFile. +GOOGLE_GLOG_DLL_DECL void TruncateStdoutStderr(); + +// Return the string representation of the provided LogSeverity level. +// Thread-safe. +GOOGLE_GLOG_DLL_DECL const char* GetLogSeverityName(LogSeverity severity); + +// --------------------------------------------------------------------- +// Implementation details that are not useful to most clients +// --------------------------------------------------------------------- + +// A Logger is the interface used by logging modules to emit entries +// to a log. A typical implementation will dump formatted data to a +// sequence of files. We also provide interfaces that will forward +// the data to another thread so that the invoker never blocks. +// Implementations should be thread-safe since the logging system +// will write to them from multiple threads. + +namespace base { + +class GOOGLE_GLOG_DLL_DECL Logger { + public: + virtual ~Logger(); + + // Writes "message[0,message_len-1]" corresponding to an event that + // occurred at "timestamp". If "force_flush" is true, the log file + // is flushed immediately. + // + // The input message has already been formatted as deemed + // appropriate by the higher level logging facility. For example, + // textual log messages already contain timestamps, and the + // file:linenumber header. + virtual void Write(bool force_flush, + time_t timestamp, + const char* message, + int message_len) = 0; + + // Flush any buffered messages + virtual void Flush() = 0; + + // Get the current LOG file size. + // The returned value is approximate since some + // logged data may not have been flushed to disk yet. + virtual uint32 LogSize() = 0; +}; + +// Get the logger for the specified severity level. The logger +// remains the property of the logging module and should not be +// deleted by the caller. Thread-safe. +extern GOOGLE_GLOG_DLL_DECL Logger* GetLogger(LogSeverity level); + +// Set the logger for the specified severity level. The logger +// becomes the property of the logging module and should not +// be deleted by the caller. Thread-safe. +extern GOOGLE_GLOG_DLL_DECL void SetLogger(LogSeverity level, Logger* logger); + +} + +// glibc has traditionally implemented two incompatible versions of +// strerror_r(). There is a poorly defined convention for picking the +// version that we want, but it is not clear whether it even works with +// all versions of glibc. +// So, instead, we provide this wrapper that automatically detects the +// version that is in use, and then implements POSIX semantics. +// N.B. In addition to what POSIX says, we also guarantee that "buf" will +// be set to an empty string, if this function failed. This means, in most +// cases, you do not need to check the error code and you can directly +// use the value of "buf". It will never have an undefined value. +GOOGLE_GLOG_DLL_DECL int posix_strerror_r(int err, char *buf, size_t len); + + +// A class for which we define operator<<, which does nothing. +class GOOGLE_GLOG_DLL_DECL NullStream : public LogMessage::LogStream { + public: + // Initialize the LogStream so the messages can be written somewhere + // (they'll never be actually displayed). This will be needed if a + // NullStream& is implicitly converted to LogStream&, in which case + // the overloaded NullStream::operator<< will not be invoked. + NullStream() : LogMessage::LogStream(message_buffer_, 1, 0) { } + NullStream(const char* /*file*/, int /*line*/, + const CheckOpString& /*result*/) : + LogMessage::LogStream(message_buffer_, 1, 0) { } + NullStream &stream() { return *this; } + private: + // A very short buffer for messages (which we discard anyway). This + // will be needed if NullStream& converted to LogStream& (e.g. as a + // result of a conditional expression). + char message_buffer_[2]; +}; + +// Do nothing. This operator is inline, allowing the message to be +// compiled away. The message will not be compiled away if we do +// something like (flag ? LOG(INFO) : LOG(ERROR)) << message; when +// SKIP_LOG=WARNING. In those cases, NullStream will be implicitly +// converted to LogStream and the message will be computed and then +// quietly discarded. +template +inline NullStream& operator<<(NullStream &str, const T &value) { return str; } + +// Similar to NullStream, but aborts the program (without stack +// trace), like LogMessageFatal. +class GOOGLE_GLOG_DLL_DECL NullStreamFatal : public NullStream { + public: + NullStreamFatal() { } + NullStreamFatal(const char* file, int line, const CheckOpString& result) : + NullStream(file, line, result) { } + ~NullStreamFatal() { _exit(1); } +}; + +// Install a signal handler that will dump signal information and a stack +// trace when the program crashes on certain signals. We'll install the +// signal handler for the following signals. +// +// SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, and SIGTERM. +// +// By default, the signal handler will write the failure dump to the +// standard error. You can customize the destination by installing your +// own writer function by InstallFailureWriter() below. +// +// Note on threading: +// +// The function should be called before threads are created, if you want +// to use the failure signal handler for all threads. The stack trace +// will be shown only for the thread that receives the signal. In other +// words, stack traces of other threads won't be shown. +GOOGLE_GLOG_DLL_DECL void InstallFailureSignalHandler(); + +// Installs a function that is used for writing the failure dump. "data" +// is the pointer to the beginning of a message to be written, and "size" +// is the size of the message. You should not expect the data is +// terminated with '\0'. +GOOGLE_GLOG_DLL_DECL void InstallFailureWriter( + void (*writer)(const char* data, int size)); + +} + +#endif // _LOGGING_H_ diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h b/spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h new file mode 100755 index 000000000..c81e67bf9 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h @@ -0,0 +1,189 @@ +// This file is automatically generated from src/glog/raw_logging.h.in +// using src/windows/preprocess.sh. +// DO NOT EDIT! + +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Maxim Lifantsev +// +// Thread-safe logging routines that do not allocate any memory or +// acquire any locks, and can therefore be used by low-level memory +// allocation and synchronization code. + +#ifndef BASE_RAW_LOGGING_H_ +#define BASE_RAW_LOGGING_H_ + +#include + +namespace google { + +#include "glog/log_severity.h" +#include "glog/vlog_is_on.h" + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +// This is similar to LOG(severity) << format... and VLOG(level) << format.., +// but +// * it is to be used ONLY by low-level modules that can't use normal LOG() +// * it is desiged to be a low-level logger that does not allocate any +// memory and does not need any locks, hence: +// * it logs straight and ONLY to STDERR w/o buffering +// * it uses an explicit format and arguments list +// * it will silently chop off really long message strings +// Usage example: +// RAW_LOG(ERROR, "Failed foo with %i: %s", status, error); +// RAW_VLOG(3, "status is %i", status); +// These will print an almost standard log lines like this to stderr only: +// E0821 211317 file.cc:123] RAW: Failed foo with 22: bad_file +// I0821 211317 file.cc:142] RAW: status is 20 +#define RAW_LOG(severity, ...) \ + do { \ + switch (google::severity) { \ + case 0: \ + RAW_LOG_INFO(__VA_ARGS__); \ + break; \ + case 1: \ + RAW_LOG_WARNING(__VA_ARGS__); \ + break; \ + case 2: \ + RAW_LOG_ERROR(__VA_ARGS__); \ + break; \ + case 3: \ + RAW_LOG_FATAL(__VA_ARGS__); \ + break; \ + default: \ + break; \ + } \ + } while (0) + +// The following STRIP_LOG testing is performed in the header file so that it's +// possible to completely compile out the logging code and the log messages. +#if STRIP_LOG == 0 +#define RAW_VLOG(verboselevel, ...) \ + do { \ + if (VLOG_IS_ON(verboselevel)) { \ + RAW_LOG_INFO(__VA_ARGS__); \ + } \ + } while (0) +#else +#define RAW_VLOG(verboselevel, ...) RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG == 0 + +#if STRIP_LOG == 0 +#define RAW_LOG_INFO(...) google::RawLog__(google::INFO, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_INFO(...) google::RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG == 0 + +#if STRIP_LOG <= 1 +#define RAW_LOG_WARNING(...) google::RawLog__(google::WARNING, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_WARNING(...) google::RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG <= 1 + +#if STRIP_LOG <= 2 +#define RAW_LOG_ERROR(...) google::RawLog__(google::ERROR, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_ERROR(...) google::RawLogStub__(0, __VA_ARGS__) +#endif // STRIP_LOG <= 2 + +#if STRIP_LOG <= 3 +#define RAW_LOG_FATAL(...) google::RawLog__(google::FATAL, \ + __FILE__, __LINE__, __VA_ARGS__) +#else +#define RAW_LOG_FATAL(...) \ + do { \ + google::RawLogStub__(0, __VA_ARGS__); \ + exit(1); \ + } while (0) +#endif // STRIP_LOG <= 3 + +// Similar to CHECK(condition) << message, +// but for low-level modules: we use only RAW_LOG that does not allocate memory. +// We do not want to provide args list here to encourage this usage: +// if (!cond) RAW_LOG(FATAL, "foo ...", hard_to_compute_args); +// so that the args are not computed when not needed. +#define RAW_CHECK(condition, message) \ + do { \ + if (!(condition)) { \ + RAW_LOG(FATAL, "Check %s failed: %s", #condition, message); \ + } \ + } while (0) + +// Debug versions of RAW_LOG and RAW_CHECK +#ifndef NDEBUG + +#define RAW_DLOG(severity, ...) RAW_LOG(severity, __VA_ARGS__) +#define RAW_DCHECK(condition, message) RAW_CHECK(condition, message) + +#else // NDEBUG + +#define RAW_DLOG(severity, ...) \ + while (false) \ + RAW_LOG(severity, __VA_ARGS__) +#define RAW_DCHECK(condition, message) \ + while (false) \ + RAW_CHECK(condition, message) + +#endif // NDEBUG + +// Stub log function used to work around for unused variable warnings when +// building with STRIP_LOG > 0. +static inline void RawLogStub__(int ignored, ...) { +} + +// Helper function to implement RAW_LOG and RAW_VLOG +// Logs format... at "severity" level, reporting it +// as called from file:line. +// This does not allocate memory or acquire locks. +GOOGLE_GLOG_DLL_DECL void RawLog__(LogSeverity severity, + const char* file, + int line, + const char* format, ...) + ; + +// Hack to propagate time information into this module so that +// this module does not have to directly call localtime_r(), +// which could allocate memory. +GOOGLE_GLOG_DLL_DECL void RawLog__SetLastTime(const struct tm& t, int usecs); + +} + +#endif // BASE_RAW_LOGGING_H_ diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h b/spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h new file mode 100755 index 000000000..d76f6c18e --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h @@ -0,0 +1,158 @@ +// This file is automatically generated from src/glog/stl_logging.h.in +// using src/windows/preprocess.sh. +// DO NOT EDIT! + +// Copyright (c) 2003, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Stream output operators for STL containers; to be used for logging *only*. +// Inclusion of this file lets you do: +// +// list x; +// LOG(INFO) << "data: " << x; +// vector v1, v2; +// CHECK_EQ(v1, v2); +// +// Note that if you want to use these operators from the non-global namespace, +// you may get an error since they are not in namespace std (and they are not +// in namespace std since that would result in undefined behavior). You may +// need to write +// +// using ::operator<<; +// +// to fix these errors. + +#ifndef UTIL_GTL_STL_LOGGING_INL_H_ +#define UTIL_GTL_STL_LOGGING_INL_H_ + +#if !1 +# error We do not support stl_logging for this compiler +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef __GNUC__ +# include +# include +# include +#endif + +template +inline std::ostream& operator<<(std::ostream& out, + const std::pair& p) { + out << '(' << p.first << ", " << p.second << ')'; + return out; +} + +namespace google { + +template +inline void PrintSequence(std::ostream& out, Iter begin, Iter end) { + using ::operator<<; + // Output at most 100 elements -- appropriate if used for logging. + for (int i = 0; begin != end && i < 100; ++i, ++begin) { + if (i > 0) out << ' '; + out << *begin; + } + if (begin != end) { + out << " ..."; + } +} + +} + +#define OUTPUT_TWO_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + google::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +OUTPUT_TWO_ARG_CONTAINER(std::vector) +OUTPUT_TWO_ARG_CONTAINER(std::deque) +OUTPUT_TWO_ARG_CONTAINER(std::list) +#ifdef __GNUC__ +OUTPUT_TWO_ARG_CONTAINER(__gnu_cxx::slist) +#endif + +#undef OUTPUT_TWO_ARG_CONTAINER + +#define OUTPUT_THREE_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + google::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +OUTPUT_THREE_ARG_CONTAINER(std::set) +OUTPUT_THREE_ARG_CONTAINER(std::multiset) + +#undef OUTPUT_THREE_ARG_CONTAINER + +#define OUTPUT_FOUR_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + google::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +OUTPUT_FOUR_ARG_CONTAINER(std::map) +OUTPUT_FOUR_ARG_CONTAINER(std::multimap) +#ifdef __GNUC__ +OUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_set) +OUTPUT_FOUR_ARG_CONTAINER(__gnu_cxx::hash_multiset) +#endif + +#undef OUTPUT_FOUR_ARG_CONTAINER + +#define OUTPUT_FIVE_ARG_CONTAINER(Sequence) \ +template \ +inline std::ostream& operator<<(std::ostream& out, \ + const Sequence& seq) { \ + google::PrintSequence(out, seq.begin(), seq.end()); \ + return out; \ +} + +#ifdef __GNUC__ +OUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_map) +OUTPUT_FIVE_ARG_CONTAINER(__gnu_cxx::hash_multimap) +#endif + +#undef OUTPUT_FIVE_ARG_CONTAINER + +#endif // UTIL_GTL_STL_LOGGING_INL_H_ diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h b/spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h new file mode 100755 index 000000000..409a4011b --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h @@ -0,0 +1,133 @@ +// This file is automatically generated from src/glog/vlog_is_on.h.in +// using src/windows/preprocess.sh. +// DO NOT EDIT! + +// Copyright (c) 1999, 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Ray Sidney and many others +// +// Defines the VLOG_IS_ON macro that controls the variable-verbosity +// conditional logging. +// +// It's used by VLOG and VLOG_IF in logging.h +// and by RAW_VLOG in raw_logging.h to trigger the logging. +// +// It can also be used directly e.g. like this: +// if (VLOG_IS_ON(2)) { +// // do some logging preparation and logging +// // that can't be accomplished e.g. via just VLOG(2) << ...; +// } +// +// The truth value that VLOG_IS_ON(level) returns is determined by +// the three verbosity level flags: +// --v= Gives the default maximal active V-logging level; +// 0 is the default. +// Normally positive values are used for V-logging levels. +// --vmodule= Gives the per-module maximal V-logging levels to override +// the value given by --v. +// E.g. "my_module=2,foo*=3" would change the logging level +// for all code in source files "my_module.*" and "foo*.*" +// ("-inl" suffixes are also disregarded for this matching). +// +// SetVLOGLevel helper function is provided to do limited dynamic control over +// V-logging by overriding the per-module settings given via --vmodule flag. +// +// CAVEAT: --vmodule functionality is not available in non gcc compilers. +// + +#ifndef BASE_VLOG_IS_ON_H_ +#define BASE_VLOG_IS_ON_H_ + +#include "glog/log_severity.h" + +// Annoying stuff for windows -- makes sure clients can import these functions +#ifndef GOOGLE_GLOG_DLL_DECL +# if defined(_WIN32) && !defined(__CYGWIN__) +# define GOOGLE_GLOG_DLL_DECL __declspec(dllimport) +# else +# define GOOGLE_GLOG_DLL_DECL +# endif +#endif + +#if defined(__GNUC__) +// We emit an anonymous static int* variable at every VLOG_IS_ON(n) site. +// (Normally) the first time every VLOG_IS_ON(n) site is hit, +// we determine what variable will dynamically control logging at this site: +// it's either FLAGS_v or an appropriate internal variable +// matching the current source file that represents results of +// parsing of --vmodule flag and/or SetVLOGLevel calls. +#define VLOG_IS_ON(verboselevel) \ + __extension__ \ + ({ static google::int32* vlocal__ = &google::kLogSiteUninitialized; \ + google::int32 verbose_level__ = (verboselevel); \ + (*vlocal__ >= verbose_level__) && \ + ((vlocal__ != &google::kLogSiteUninitialized) || \ + (google::InitVLOG3__(&vlocal__, &FLAGS_v, \ + __FILE__, verbose_level__))); }) +#else +// GNU extensions not available, so we do not support --vmodule. +// Dynamic value of FLAGS_v always controls the logging level. +#define VLOG_IS_ON(verboselevel) (FLAGS_v >= (verboselevel)) +#endif + +// Set VLOG(_IS_ON) level for module_pattern to log_level. +// This lets us dynamically control what is normally set by the --vmodule flag. +// Returns the level that previously applied to module_pattern. +// NOTE: To change the log level for VLOG(_IS_ON) sites +// that have already executed after/during InitGoogleLogging, +// one needs to supply the exact --vmodule pattern that applied to them. +// (If no --vmodule pattern applied to them +// the value of FLAGS_v will continue to control them.) +extern GOOGLE_GLOG_DLL_DECL int SetVLOGLevel(const char* module_pattern, + int log_level); + +// Various declarations needed for VLOG_IS_ON above: ========================= + +// Special value used to indicate that a VLOG_IS_ON site has not been +// initialized. We make this a large value, so the common-case check +// of "*vlocal__ >= verbose_level__" in VLOG_IS_ON definition +// passes in such cases and InitVLOG3__ is then triggered. +extern google::int32 kLogSiteUninitialized; + +// Helper routine which determines the logging info for a particalur VLOG site. +// site_flag is the address of the site-local pointer to the controlling +// verbosity level +// site_default is the default to use for *site_flag +// fname is the current source file name +// verbose_level is the argument to VLOG_IS_ON +// We will return the return value for VLOG_IS_ON +// and if possible set *site_flag appropriately. +extern GOOGLE_GLOG_DLL_DECL bool InitVLOG3__( + google::int32** site_flag, + google::int32* site_default, + const char* fname, + google::int32 verbose_level); + +#endif // BASE_VLOG_IS_ON_H_ diff --git a/spotify/breakpad/third_party/glog/src/windows/port.cc b/spotify/breakpad/third_party/glog/src/windows/port.cc new file mode 100755 index 000000000..bfa6e70af --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/port.cc @@ -0,0 +1,64 @@ +/* Copyright (c) 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Craig Silverstein + * Copied from google-perftools and modified by Shinichiro Hamaji + */ + +#ifndef _WIN32 +# error You should only be including windows/port.cc in a windows environment! +#endif + +#include "config.h" +#include // for va_list, va_start, va_end +#include // for strstr() +#include +#include +#include +#include "port.h" + +using std::string; +using std::vector; + +// These call the windows _vsnprintf, but always NUL-terminate. +int safe_vsnprintf(char *str, size_t size, const char *format, va_list ap) { + if (size == 0) // not even room for a \0? + return -1; // not what C99 says to do, but what windows does + str[size-1] = '\0'; + return _vsnprintf(str, size-1, format, ap); +} + +int snprintf(char *str, size_t size, const char *format, ...) { + va_list ap; + va_start(ap, format); + const int r = vsnprintf(str, size, format, ap); + va_end(ap); + return r; +} diff --git a/spotify/breakpad/third_party/glog/src/windows/port.h b/spotify/breakpad/third_party/glog/src/windows/port.h new file mode 100755 index 000000000..d093bf5d3 --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/port.h @@ -0,0 +1,149 @@ +/* Copyright (c) 2008, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Craig Silverstein + * Copied from google-perftools and modified by Shinichiro Hamaji + * + * These are some portability typedefs and defines to make it a bit + * easier to compile this code under VC++. + * + * Several of these are taken from glib: + * http://developer.gnome.org/doc/API/glib/glib-windows-compatability-functions.html + */ + +#ifndef CTEMPLATE_WINDOWS_PORT_H_ +#define CTEMPLATE_WINDOWS_PORT_H_ + +#include "config.h" + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN /* We always want minimal includes */ +#include +#include /* for gethostname */ +#include /* because we so often use open/close/etc */ +#include /* for _getcwd() */ +#include /* for _getpid() */ +#include /* read in vsnprintf decl. before redifining it */ +#include /* template_dictionary.cc uses va_copy */ +#include /* for _strnicmp(), strerror_s() */ +#include /* for localtime_s() */ +/* Note: the C++ #includes are all together at the bottom. This file is + * used by both C and C++ code, so we put all the C++ together. + */ + +/* 4244: otherwise we get problems when substracting two size_t's to an int + * 4251: it's complaining about a private struct I've chosen not to dllexport + * 4355: we use this in a constructor, but we do it safely + * 4715: for some reason VC++ stopped realizing you can't return after abort() + * 4800: we know we're casting ints/char*'s to bools, and we're ok with that + * 4996: Yes, we're ok using "unsafe" functions like fopen() and strerror() + */ +#pragma warning(disable:4244 4251 4355 4715 4800 4996) + +/* file I/O */ +#define PATH_MAX 1024 +#define access _access +#define getcwd _getcwd +#define open _open +#define read _read +#define write _write +#define lseek _lseek +#define close _close +#define popen _popen +#define pclose _pclose +#define R_OK 04 /* read-only (for access()) */ +#define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR) +#ifndef __MINGW32__ +enum { STDIN_FILENO = 0, STDOUT_FILENO = 1, STDERR_FILENO = 2 }; +#endif +#define S_IRUSR S_IREAD +#define S_IWUSR S_IWRITE + +/* Not quite as lightweight as a hard-link, but more than good enough for us. */ +#define link(oldpath, newpath) CopyFileA(oldpath, newpath, false) + +#define strcasecmp _stricmp +#define strncasecmp _strnicmp + +/* In windows-land, hash<> is called hash_compare<> (from xhash.h) */ +#define hash hash_compare + +/* Sleep is in ms, on windows */ +#define sleep(secs) Sleep((secs) * 1000) + +/* We can't just use _vsnprintf and _snprintf as drop-in-replacements, + * because they don't always NUL-terminate. :-( We also can't use the + * name vsnprintf, since windows defines that (but not snprintf (!)). + */ +extern int snprintf(char *str, size_t size, + const char *format, ...); +extern int safe_vsnprintf(char *str, size_t size, + const char *format, va_list ap); +#define vsnprintf(str, size, format, ap) safe_vsnprintf(str, size, format, ap) +#define va_copy(dst, src) (dst) = (src) + +/* Windows doesn't support specifying the number of buckets as a + * hash_map constructor arg, so we leave this blank. + */ +#define CTEMPLATE_SMALL_HASHTABLE + +#define DEFAULT_TEMPLATE_ROOTDIR ".." + +// ----------------------------------- SYSTEM/PROCESS +typedef int pid_t; +#define getpid _getpid + +// ----------------------------------- THREADS +typedef DWORD pthread_t; +typedef DWORD pthread_key_t; +typedef LONG pthread_once_t; +enum { PTHREAD_ONCE_INIT = 0 }; // important that this be 0! for SpinLock +#define pthread_self GetCurrentThreadId +#define pthread_equal(pthread_t_1, pthread_t_2) ((pthread_t_1)==(pthread_t_2)) + +inline struct tm* localtime_r(const time_t* timep, struct tm* result) { + localtime_s(result, timep); + return result; +} + +inline char* strerror_r(int errnum, char* buf, size_t buflen) { + strerror_s(buf, buflen, errnum); + return buf; +} + +#ifndef __cplusplus +/* I don't see how to get inlining for C code in MSVC. Ah well. */ +#define inline +#endif + +#endif /* _WIN32 */ + +#endif /* CTEMPLATE_WINDOWS_PORT_H_ */ diff --git a/spotify/breakpad/third_party/glog/src/windows/preprocess.sh b/spotify/breakpad/third_party/glog/src/windows/preprocess.sh new file mode 100755 index 000000000..ea4352e8e --- /dev/null +++ b/spotify/breakpad/third_party/glog/src/windows/preprocess.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +# Copyright (c) 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# --- +# Author: Craig Silverstein +# Copied from google-perftools and modified by Shinichiro Hamaji +# +# This script is meant to be run at distribution-generation time, for +# instance by autogen.sh. It does some of the work configure would +# normally do, for windows systems. In particular, it expands all the +# @...@ variables found in .in files, and puts them here, in the windows +# directory. +# +# This script should be run before any new release. + +if [ -z "$1" ]; then + echo "USAGE: $0 " + exit 1 +fi + +DLLDEF_MACRO_NAME="GLOG_DLL_DECL" + +# The text we put in every .h files we create. As a courtesy, we'll +# include a helpful comment for windows users as to how to use +# GLOG_DLL_DECL. Apparently sed expands \n into a newline. Good! +DLLDEF_DEFINES="\ +// NOTE: if you are statically linking the template library into your binary\n\ +// (rather than using the template .dll), set '/D $DLLDEF_MACRO_NAME='\n\ +// as a compiler flag in your project file to turn off the dllimports.\n\ +#ifndef $DLLDEF_MACRO_NAME\n\ +# define $DLLDEF_MACRO_NAME __declspec(dllimport)\n\ +#endif" + +# Read all the windows config info into variables +# In order for the 'set' to take, this requires putting all in a subshell. +( + while read define varname value; do + [ "$define" != "#define" ] && continue + eval "$varname='$value'" + done + + # Process all the .in files in the "glog" subdirectory + mkdir -p "$1/windows/glog" + for file in `echo "$1"/glog/*.in`; do + echo "Processing $file" + outfile="$1/windows/glog/`basename $file .in`" + + echo "\ +// This file is automatically generated from $file +// using src/windows/preprocess.sh. +// DO NOT EDIT! +" > "$outfile" + # Besides replacing @...@, we also need to turn on dllimport + # We also need to replace hash by hash_compare (annoying we hard-code :-( ) + sed -e "s!@ac_windows_dllexport@!$DLLDEF_MACRO_NAME!g" \ + -e "s!@ac_windows_dllexport_defines@!$DLLDEF_DEFINES!g" \ + -e "s!@ac_cv_cxx_hash_map@!$HASH_MAP_H!g" \ + -e "s!@ac_cv_cxx_hash_namespace@!$HASH_NAMESPACE!g" \ + -e "s!@ac_cv_cxx_hash_set@!$HASH_SET_H!g" \ + -e "s!@ac_cv_have_stdint_h@!0!g" \ + -e "s!@ac_cv_have_systypes_h@!0!g" \ + -e "s!@ac_cv_have_inttypes_h@!0!g" \ + -e "s!@ac_cv_have_unistd_h@!0!g" \ + -e "s!@ac_cv_have_uint16_t@!0!g" \ + -e "s!@ac_cv_have_u_int16_t@!0!g" \ + -e "s!@ac_cv_have___uint16@!1!g" \ + -e "s!@ac_cv_have_libgflags@!0!g" \ + -e "s!@ac_cv_have___builtin_expect@!0!g" \ + -e "s!@ac_cv_cxx_using_operator@!1!g" \ + -e "s!@ac_cv___attribute___noreturn@!!g" \ + -e "s!@ac_cv___attribute___printf_4_5@!!g" \ + -e "s!@ac_google_attribute@!${HAVE___ATTRIBUTE__:-0}!g" \ + -e "s!@ac_google_end_namespace@!$_END_GOOGLE_NAMESPACE_!g" \ + -e "s!@ac_google_namespace@!$GOOGLE_NAMESPACE!g" \ + -e "s!@ac_google_start_namespace@!$_START_GOOGLE_NAMESPACE_!g" \ + -e "s!@ac_htmlparser_namespace@!$HTMLPARSER_NAMESPACE!g" \ + -e "s!\\bhash\\b!hash_compare!g" \ + "$file" >> "$outfile" + done +) < "$1/windows/config.h" + +# log_severity.h isn't a .in file. +echo "\ +// This file is automatically generated from $1/glog/log_severity.h +// using src/windows/preprocess.sh. +// DO NOT EDIT! +" > "$1/windows/glog/log_severity.h" +cat "$1/glog/log_severity.h" >> "$1/windows/glog/log_severity.h" + +echo "DONE" diff --git a/spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj b/spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj new file mode 100755 index 000000000..67aeaaccf --- /dev/null +++ b/spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj b/spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj new file mode 100644 index 000000000..ea66936ad --- /dev/null +++ b/spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj @@ -0,0 +1,220 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj b/spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj new file mode 100755 index 000000000..649a23417 --- /dev/null +++ b/spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj b/spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj new file mode 100644 index 000000000..0d33aaf40 --- /dev/null +++ b/spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/libdisasm/TODO b/spotify/breakpad/third_party/libdisasm/TODO new file mode 100644 index 000000000..148addf9b --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/TODO @@ -0,0 +1,43 @@ +x86_format.c +------------ +intel: jmpf -> jmp, callf -> call +att: jmpf -> ljmp, callf -> lcall + +opcode table +------------ +finish typing instructions +fix flag clear/set/toggle types + +ix64 stuff +---------- +document output file formats in web page +features doc: register aliases, implicit operands, stack mods, +ring0 flags, eflags, cpu model/isa + +ia32_handle_* implementation + +fix operand 0F C2 +CMPPS + +* sysenter, sysexit as CALL types -- preceded by MSR writes +* SYSENTER/SYSEXIT stack : overwrites SS, ESP +* stos, cmps, scas, movs, ins, outs, lods -> OP_PTR +* OP_SIZE in implicit operands +* use OP_SIZE to choose reg sizes! + +DONE?? : +implicit operands: provide action ? +e.g. add/inc for stach, write, etc +replace table numbers in opcodes.dat with +#defines for table names + +replace 0 with INSN_INVALID [or maybe FF for imnvalid and 00 for Not Applicable */ +no wait that is only for prefix tables -- n/p + +if ( prefx) only use if insn != invalid + +these should cover all the wacky disasm exceptions + +for the rep one we can chet, match only a 0x90 + +todo: privilege | ring diff --git a/spotify/breakpad/third_party/libdisasm/ia32_implicit.c b/spotify/breakpad/third_party/libdisasm/ia32_implicit.c new file mode 100644 index 000000000..8b075d2ee --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_implicit.c @@ -0,0 +1,422 @@ +#include + +#include "ia32_implicit.h" +#include "ia32_insn.h" +#include "ia32_reg.h" +#include "x86_operand_list.h" + +/* Conventions: Register operands which are aliases of another register + * operand (e.g. AX in one operand and AL in another) assume that the + * operands are different registers and that alias tracking will resolve + * data flow. This means that something like + * mov ax, al + * would have 'write only' access for AX and 'read only' access for AL, + * even though both AL and AX are read and written */ +typedef struct { + uint32_t type; + uint32_t operand; +} op_implicit_list_t; + +static op_implicit_list_t list_aaa[] = + /* 37 : AAA : rw AL */ + /* 3F : AAS : rw AL */ + {{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}}; /* aaa */ + +static op_implicit_list_t list_aad[] = + /* D5 0A, D5 (ib) : AAD : rw AX */ + /* D4 0A, D4 (ib) : AAM : rw AX */ + {{ OP_R | OP_W, REG_WORD_OFFSET }, {0}}; /* aad */ + +static op_implicit_list_t list_call[] = + /* E8, FF, 9A, FF : CALL : rw ESP, rw EIP */ + /* C2, C3, CA, CB : RET : rw ESP, rw EIP */ + {{ OP_R | OP_W, REG_EIP_INDEX }, + { OP_R | OP_W, REG_ESP_INDEX }, {0}}; /* call, ret */ + +static op_implicit_list_t list_cbw[] = + /* 98 : CBW : r AL, rw AX */ + {{ OP_R | OP_W, REG_WORD_OFFSET }, + { OP_R, REG_BYTE_OFFSET}, {0}}; /* cbw */ + +static op_implicit_list_t list_cwde[] = + /* 98 : CWDE : r AX, rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_R, REG_WORD_OFFSET }, {0}}; /* cwde */ + +static op_implicit_list_t list_clts[] = + /* 0F 06 : CLTS : rw CR0 */ + {{ OP_R | OP_W, REG_CTRL_OFFSET}, {0}}; /* clts */ + +static op_implicit_list_t list_cmpxchg[] = + /* 0F B0 : CMPXCHG : rw AL */ + {{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}}; /* cmpxchg */ + +static op_implicit_list_t list_cmpxchgb[] = + /* 0F B1 : CMPXCHG : rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, {0}}; /* cmpxchg */ + +static op_implicit_list_t list_cmpxchg8b[] = + /* 0F C7 : CMPXCHG8B : rw EDX, rw EAX, r ECX, r EBX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_R | OP_W, REG_DWORD_OFFSET + 2 }, + { OP_R, REG_DWORD_OFFSET + 1 }, + { OP_R, REG_DWORD_OFFSET + 3 }, {0}}; /* cmpxchg8b */ + +static op_implicit_list_t list_cpuid[] = + /* 0F A2 : CPUID : rw EAX, w EBX, w ECX, w EDX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_W, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET + 3 }, {0}}; /* cpuid */ + +static op_implicit_list_t list_cwd[] = + /* 99 : CWD/CWQ : rw EAX, w EDX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_W, REG_DWORD_OFFSET + 2 }, {0}}; /* cwd */ + +static op_implicit_list_t list_daa[] = + /* 27 : DAA : rw AL */ + /* 2F : DAS : rw AL */ + {{ OP_R | OP_W, REG_BYTE_OFFSET }, {0}}; /* daa */ + +static op_implicit_list_t list_idiv[] = + /* F6 : DIV, IDIV : r AX, w AL, w AH */ + /* FIXED: first op was EAX, not Aw. TODO: verify! */ + {{ OP_R, REG_WORD_OFFSET }, + { OP_W, REG_BYTE_OFFSET }, + { OP_W, REG_BYTE_OFFSET + 4 }, {0}}; /* div */ + +static op_implicit_list_t list_div[] = + /* F7 : DIV, IDIV : rw EDX, rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 2 }, + { OP_R | OP_W, REG_DWORD_OFFSET }, {0}}; /* div */ + +static op_implicit_list_t list_enter[] = + /* C8 : ENTER : rw ESP w EBP */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 4 }, + { OP_R, REG_DWORD_OFFSET + 5 }, {0}}; /* enter */ + +static op_implicit_list_t list_f2xm1[] = + /* D9 F0 : F2XM1 : rw ST(0) */ + /* D9 E1 : FABS : rw ST(0) */ + /* D9 E0 : FCHS : rw ST(0) */ + /* D9 FF : FCOS : rw ST(0)*/ + /* D8, DA : FDIV : rw ST(0) */ + /* D8, DA : FDIVR : rw ST(0) */ + /* D9 F2 : FPTAN : rw ST(0) */ + /* D9 FC : FRNDINT : rw ST(0) */ + /* D9 FB : FSINCOS : rw ST(0) */ + /* D9 FE : FSIN : rw ST(0) */ + /* D9 FA : FSQRT : rw ST(0) */ + /* D9 F4 : FXTRACT : rw ST(0) */ + {{ OP_R | OP_W, REG_FPU_OFFSET }, {0}}; /* f2xm1 */ + +static op_implicit_list_t list_fcom[] = + /* D8, DC, DE D9 : FCOM : r ST(0) */ + /* DE, DA : FICOM : r ST(0) */ + /* DF, D8 : FIST : r ST(0) */ + /* D9 E4 : FTST : r ST(0) */ + /* D9 E5 : FXAM : r ST(0) */ + {{ OP_R, REG_FPU_OFFSET }, {0}}; /* fcom */ + +static op_implicit_list_t list_fpatan[] = + /* D9 F3 : FPATAN : r ST(0), rw ST(1) */ + {{ OP_R, REG_FPU_OFFSET }, {0}}; /* fpatan */ + +static op_implicit_list_t list_fprem[] = + /* D9 F8, D9 F5 : FPREM : rw ST(0) r ST(1) */ + /* D9 FD : FSCALE : rw ST(0), r ST(1) */ + {{ OP_R | OP_W, REG_FPU_OFFSET }, + { OP_R, REG_FPU_OFFSET + 1 }, {0}}; /* fprem */ + +static op_implicit_list_t list_faddp[] = + /* DE C1 : FADDP : r ST(0), rw ST(1) */ + /* DE E9 : FSUBP : r ST(0), rw ST(1) */ + /* D9 F1 : FYL2X : r ST(0), rw ST(1) */ + /* D9 F9 : FYL2XP1 : r ST(0), rw ST(1) */ + {{ OP_R, REG_FPU_OFFSET }, + { OP_R | OP_W, REG_FPU_OFFSET + 1 }, {0}}; /* faddp */ + +static op_implicit_list_t list_fucompp[] = + /* DA E9 : FUCOMPP : r ST(0), r ST(1) */ + {{ OP_R, REG_FPU_OFFSET }, + { OP_R, REG_FPU_OFFSET + 1 }, {0}}; /* fucompp */ + +static op_implicit_list_t list_imul[] = + /* F6 : IMUL : r AL, w AX */ + /* F6 : MUL : r AL, w AX */ + {{ OP_R, REG_BYTE_OFFSET }, + { OP_W, REG_WORD_OFFSET }, {0}}; /* imul */ + +static op_implicit_list_t list_mul[] = + /* F7 : IMUL : rw EAX, w EDX */ + /* F7 : MUL : rw EAX, w EDX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET }, + { OP_W, REG_DWORD_OFFSET + 2 }, {0}}; /* imul */ + +static op_implicit_list_t list_lahf[] = + /* 9F : LAHF : r EFLAGS, w AH */ + {{ OP_R, REG_FLAGS_INDEX }, + { OP_W, REG_BYTE_OFFSET + 4 }, {0}}; /* lahf */ + +static op_implicit_list_t list_ldmxcsr[] = + /* 0F AE : LDMXCSR : w MXCSR SSE Control Status Reg */ + {{ OP_W, REG_MXCSG_INDEX }, {0}}; /* ldmxcsr */ + +static op_implicit_list_t list_leave[] = + /* C9 : LEAVE : rw ESP, w EBP */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_W, REG_DWORD_OFFSET + 5 }, {0}}; /* leave */ + +static op_implicit_list_t list_lgdt[] = + /* 0F 01 : LGDT : w GDTR */ + {{ OP_W, REG_GDTR_INDEX }, {0}}; /* lgdt */ + +static op_implicit_list_t list_lidt[] = + /* 0F 01 : LIDT : w IDTR */ + {{ OP_W, REG_IDTR_INDEX }, {0}}; /* lidt */ + +static op_implicit_list_t list_lldt[] = + /* 0F 00 : LLDT : w LDTR */ + {{ OP_W, REG_LDTR_INDEX }, {0}}; /* lldt */ + +static op_implicit_list_t list_lmsw[] = + /* 0F 01 : LMSW : w CR0 */ + {{ OP_W, REG_CTRL_OFFSET }, {0}}; /* lmsw */ + +static op_implicit_list_t list_loop[] = + /* E0, E1, E2 : LOOP : rw ECX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 1 }, {0}};/* loop */ + +static op_implicit_list_t list_ltr[] = + /* 0F 00 : LTR : w Task Register */ + {{ OP_W, REG_TR_INDEX }, {0}}; /* ltr */ + +static op_implicit_list_t list_pop[] = + /* 8F, 58, 1F, 07, 17, 0F A1, 0F A9 : POP : rw ESP */ + /* FF, 50, 6A, 68, 0E, 16, 1E, 06, 0F A0, 0F A8 : PUSH : rw ESP */ + {{ OP_R | OP_W, REG_ESP_INDEX }, {0}}; /* pop, push */ + +static op_implicit_list_t list_popad[] = + /* 61 : POPAD : rw esp, w edi esi ebp ebx edx ecx eax */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_W, REG_DWORD_OFFSET + 7 }, + { OP_W, REG_DWORD_OFFSET + 6 }, + { OP_W, REG_DWORD_OFFSET + 5 }, + { OP_W, REG_DWORD_OFFSET + 3 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET }, {0}}; /* popad */ + +static op_implicit_list_t list_popfd[] = + /* 9D : POPFD : rw esp, w eflags */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_W, REG_FLAGS_INDEX }, {0}}; /* popfd */ + +static op_implicit_list_t list_pushad[] = + /* FF, 50, 6A, 68, 0E, 16, 1E, 06, 0F A0, 0F A8 : PUSH : rw ESP */ + /* 60 : PUSHAD : rw esp, r eax ecx edx ebx esp ebp esi edi */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_R, REG_DWORD_OFFSET }, + { OP_R, REG_DWORD_OFFSET + 1 }, + { OP_R, REG_DWORD_OFFSET + 2 }, + { OP_R, REG_DWORD_OFFSET + 3 }, + { OP_R, REG_DWORD_OFFSET + 5 }, + { OP_R, REG_DWORD_OFFSET + 6 }, + { OP_R, REG_DWORD_OFFSET + 7 }, {0}}; /* pushad */ + +static op_implicit_list_t list_pushfd[] = + /* 9C : PUSHFD : rw esp, r eflags */ + {{ OP_R | OP_W, REG_ESP_INDEX }, + { OP_R, REG_FLAGS_INDEX }, {0}}; /* pushfd */ + +static op_implicit_list_t list_rdmsr[] = + /* 0F 32 : RDMSR : r ECX, w EDX, w EAX */ + {{ OP_R, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET }, {0}}; /* rdmsr */ + +static op_implicit_list_t list_rdpmc[] = + /* 0F 33 : RDPMC : r ECX, w EDX, w EAX */ + {{ OP_R, REG_DWORD_OFFSET + 1 }, + { OP_W, REG_DWORD_OFFSET + 2 }, + { OP_W, REG_DWORD_OFFSET }, {0}}; /* rdpmc */ + +static op_implicit_list_t list_rdtsc[] = + /* 0F 31 : RDTSC : rw EDX, rw EAX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 2 }, + { OP_R | OP_W, REG_DWORD_OFFSET }, {0}}; /* rdtsc */ + +static op_implicit_list_t list_rep[] = + /* F3, F2 ... : REP : rw ECX */ + {{ OP_R | OP_W, REG_DWORD_OFFSET + 1 }, {0}};/* rep */ + +static op_implicit_list_t list_rsm[] = + /* 0F AA : RSM : r CR4, r CR0 */ + {{ OP_R, REG_CTRL_OFFSET + 4 }, + { OP_R, REG_CTRL_OFFSET }, {0}}; /* rsm */ + +static op_implicit_list_t list_sahf[] = + /* 9E : SAHF : r ah, rw eflags (set SF ZF AF PF CF) */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sahf */ + +static op_implicit_list_t list_sgdt[] = + /* 0F : SGDT : r gdtr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sgdt */ + +static op_implicit_list_t list_sidt[] = + /* 0F : SIDT : r idtr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sidt */ + +static op_implicit_list_t list_sldt[] = + /* 0F : SLDT : r ldtr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sldt */ + +static op_implicit_list_t list_smsw[] = + /* 0F : SMSW : r CR0 */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* smsw */ + +static op_implicit_list_t list_stmxcsr[] = + /* 0F AE : STMXCSR : r MXCSR */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* stmxcsr */ + +static op_implicit_list_t list_str[] = + /* 0F 00 : STR : r TR (task register) */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* str */ + +static op_implicit_list_t list_sysenter[] = + /* 0F 34 : SYSENTER : w cs, w eip, w ss, w esp, r CR0, w eflags + * r sysenter_cs_msr, sysenter_esp_msr, sysenter_eip_msr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sysenter */ + +static op_implicit_list_t list_sysexit[] = + /* 0F 35 : SYSEXIT : r edx, r ecx, w cs, w eip, w ss, w esp + * r sysenter_cs_msr */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* sysexit */ + +static op_implicit_list_t list_wrmsr[] = + /* 0F 30 : WRMST : r edx, r eax, r ecx */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* wrmsr */ + +static op_implicit_list_t list_xlat[] = + /* D7 : XLAT : rw al r ebx (ptr) */ + /* TODO: finish this! */ + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* xlat */ +/* TODO: + * monitor 0f 01 c8 eax OP_R ecx OP_R edx OP_R + * mwait 0f 01 c9 eax OP_R ecx OP_R + */ +static op_implicit_list_t list_monitor[] = + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* monitor */ +static op_implicit_list_t list_mwait[] = + {{ OP_R, REG_DWORD_OFFSET }, {0}}; /* mwait */ + +op_implicit_list_t *op_implicit_list[] = { + /* This is a list of implicit operands which are read/written by + * various x86 instructions. Note that modifications to the stack + * register are mentioned here, but that additional information on + * the effect an instruction has on the stack is contained in the + * x86_insn_t 'stack_mod' and 'stack_mod_val' fields. Use of the + * eflags register, i.e. setting, clearing, and testing flags, is + * not recorded here but rather in the flags_set and flags_tested + * fields of the x86_insn_t.*/ + NULL, + list_aaa, list_aad, list_call, list_cbw, /* 1 - 4 */ + list_cwde, list_clts, list_cmpxchg, list_cmpxchgb, /* 5 - 8 */ + list_cmpxchg8b, list_cpuid, list_cwd, list_daa, /* 9 - 12 */ + list_idiv, list_div, list_enter, list_f2xm1, /* 13 - 16 */ + list_fcom, list_fpatan, list_fprem, list_faddp, /* 17 - 20 */ + list_fucompp, list_imul, list_mul, list_lahf, /* 21 - 24 */ + list_ldmxcsr, list_leave, list_lgdt, list_lidt, /* 25 - 28 */ + list_lldt, list_lmsw, list_loop, list_ltr, /* 29 - 32 */ + list_pop, list_popad, list_popfd, list_pushad, /* 33 - 36 */ + list_pushfd, list_rdmsr, list_rdpmc, list_rdtsc, /* 37 - 40 */ + /* NOTE: 'REP' is a hack since it is a prefix: if its position + * in the table changes, then change IDX_IMPLICIT_REP in the .h */ + list_rep, list_rsm, list_sahf, list_sgdt, /* 41 - 44 */ + list_sidt, list_sldt, list_smsw, list_stmxcsr, /* 45 - 48 */ + list_str, list_sysenter, list_sysexit, list_wrmsr, /* 49 - 52 */ + list_xlat, list_monitor, list_mwait, /* 53 - 55*/ + NULL /* end of list */ + }; + +#define LAST_IMPL_IDX 55 + +static void handle_impl_reg( x86_op_t *op, uint32_t val ) { + x86_reg_t *reg = &op->data.reg; + op->type = op_register; + ia32_handle_register( reg, (unsigned int) val ); + switch (reg->size) { + case 1: + op->datatype = op_byte; break; + case 2: + op->datatype = op_word; break; + case 4: + op->datatype = op_dword; break; + case 8: + op->datatype = op_qword; break; + case 10: + op->datatype = op_extreal; break; + case 16: + op->datatype = op_dqword; break; + } + return; +} + +/* 'impl_idx' is the value from the opcode table: between 1 and LAST_IMPL_IDX */ +/* returns number of operands added */ +unsigned int ia32_insn_implicit_ops( x86_insn_t *insn, unsigned int impl_idx ) { + op_implicit_list_t *list; + x86_op_t *op; + unsigned int num = 0; + + if (! impl_idx || impl_idx > LAST_IMPL_IDX ) { + return 0; + } + + for ( list = op_implicit_list[impl_idx]; list->type; list++, num++ ) { + enum x86_op_access access = (enum x86_op_access) OP_PERM(list->type); + enum x86_op_flags flags = (enum x86_op_flags) (OP_FLAGS(list->type) >> 12); + + op = NULL; + /* In some cases (MUL), EAX is an implicit operand hardcoded in + * the instruction without being explicitly listed in assembly. + * For this situation, find the hardcoded operand and add the + * implied flag rather than adding a new implicit operand. */ + x86_oplist_t * existing; + if (ia32_true_register_id(list->operand) == REG_DWORD_OFFSET) { + for ( existing = insn->operands; existing; existing = existing->next ) { + if (existing->op.type == op_register && + existing->op.data.reg.id == list->operand) { + op = &existing->op; + break; + } + } + } + if (!op) { + op = x86_operand_new( insn ); + /* all implicit operands are registers */ + handle_impl_reg( op, list->operand ); + /* decrement the 'explicit count' incremented by default in + * x86_operand_new */ + insn->explicit_count = insn->explicit_count -1; + } + if (!op) { + return num; /* gah! return early */ + } + op->access |= access; + op->flags |= flags; + op->flags |= op_implied; + } + + return num; +} diff --git a/spotify/breakpad/third_party/libdisasm/ia32_implicit.h b/spotify/breakpad/third_party/libdisasm/ia32_implicit.h new file mode 100644 index 000000000..0002b28b9 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_implicit.h @@ -0,0 +1,13 @@ +#ifndef IA32_IMPLICIT_H +#define IA32_IMPLICIT_H + +#include "libdis.h" + +/* OK, this is a hack to deal with prefixes having implicit operands... + * thought I had removed all the old hackishness ;( */ + +#define IDX_IMPLICIT_REP 41 /* change this if the table changes! */ + +unsigned int ia32_insn_implicit_ops( x86_insn_t *insn, unsigned int impl_idx ); + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/ia32_insn.c b/spotify/breakpad/third_party/libdisasm/ia32_insn.c new file mode 100644 index 000000000..e4f42108e --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_insn.c @@ -0,0 +1,625 @@ +#include +#include +#include +#include "qword.h" + +#include "ia32_insn.h" +#include "ia32_opcode_tables.h" + +#include "ia32_reg.h" +#include "ia32_operand.h" +#include "ia32_implicit.h" +#include "ia32_settings.h" + +#include "libdis.h" + +extern ia32_table_desc_t ia32_tables[]; +extern ia32_settings_t ia32_settings; + +#define IS_SP( op ) (op->type == op_register && \ + (op->data.reg.id == REG_ESP_INDEX || \ + op->data.reg.alias == REG_ESP_INDEX) ) +#define IS_IMM( op ) (op->type == op_immediate ) + +#ifdef WIN32 +# define INLINE +#else +# define INLINE inline +#endif + +/* for calculating stack modification based on an operand */ +static INLINE int32_t long_from_operand( x86_op_t *op ) { + + if (! IS_IMM(op) ) { + return 0L; + } + + switch ( op->datatype ) { + case op_byte: + return (int32_t) op->data.sbyte; + case op_word: + return (int32_t) op->data.sword; + case op_qword: + return (int32_t) op->data.sqword; + case op_dword: + return op->data.sdword; + default: + /* these are not used in stack insn */ + break; + } + + return 0L; +} + + +/* determine what this insn does to the stack */ +static void ia32_stack_mod(x86_insn_t *insn) { + x86_op_t *dest, *src = NULL; + + if (! insn || ! insn->operands ) { + return; + } + + dest = &insn->operands->op; + if ( dest ) { + src = &insn->operands->next->op; + } + + insn->stack_mod = 0; + insn->stack_mod_val = 0; + + switch ( insn->type ) { + case insn_call: + case insn_callcc: + insn->stack_mod = 1; + insn->stack_mod_val = insn->addr_size * -1; + break; + case insn_push: + insn->stack_mod = 1; + insn->stack_mod_val = insn->addr_size * -1; + break; + case insn_return: + insn->stack_mod = 1; + insn->stack_mod_val = insn->addr_size; + case insn_int: case insn_intcc: + case insn_iret: + break; + case insn_pop: + insn->stack_mod = 1; + if (! IS_SP( dest ) ) { + insn->stack_mod_val = insn->op_size; + } /* else we don't know the stack change in a pop esp */ + break; + case insn_enter: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_leave: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_pushregs: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_popregs: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_pushflags: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_popflags: + insn->stack_mod = 1; + insn->stack_mod_val = 0; /* TODO : FIX */ + break; + case insn_add: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = long_from_operand( src ); + } + break; + case insn_sub: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = long_from_operand( src ); + insn->stack_mod_val *= -1; + } + break; + case insn_inc: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = 1; + } + break; + case insn_dec: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + insn->stack_mod_val = 1; + } + break; + case insn_mov: case insn_movcc: + case insn_xchg: case insn_xchgcc: + case insn_mul: case insn_div: + case insn_shl: case insn_shr: + case insn_rol: case insn_ror: + case insn_and: case insn_or: + case insn_not: case insn_neg: + case insn_xor: + if ( IS_SP( dest ) ) { + insn->stack_mod = 1; + } + break; + default: + break; + } + if (! strcmp("enter", insn->mnemonic) ) { + insn->stack_mod = 1; + } else if (! strcmp("leave", insn->mnemonic) ) { + insn->stack_mod = 1; + } + + /* for mov, etc we return 0 -- unknown stack mod */ + + return; +} + +/* get the cpu details for this insn from cpu flags int */ +static void ia32_handle_cpu( x86_insn_t *insn, unsigned int cpu ) { + insn->cpu = (enum x86_insn_cpu) CPU_MODEL(cpu); + insn->isa = (enum x86_insn_isa) (ISA_SUBSET(cpu)) >> 16; + return; +} + +/* handle mnemonic type and group */ +static void ia32_handle_mnemtype(x86_insn_t *insn, unsigned int mnemtype) { + unsigned int type = mnemtype & ~INS_FLAG_MASK; + insn->group = (enum x86_insn_group) (INS_GROUP(type)) >> 12; + insn->type = (enum x86_insn_type) INS_TYPE(type); + + return; +} + +static void ia32_handle_notes(x86_insn_t *insn, unsigned int notes) { + insn->note = (enum x86_insn_note) notes; + return; +} + +static void ia32_handle_eflags( x86_insn_t *insn, unsigned int eflags) { + unsigned int flags; + + /* handle flags effected */ + flags = INS_FLAGS_TEST(eflags); + /* handle weird OR cases */ + /* these are either JLE (ZF | SF<>OF) or JBE (CF | ZF) */ + if (flags & INS_TEST_OR) { + flags &= ~INS_TEST_OR; + if ( flags & INS_TEST_ZERO ) { + flags &= ~INS_TEST_ZERO; + if ( flags & INS_TEST_CARRY ) { + flags &= ~INS_TEST_CARRY ; + flags |= (int)insn_carry_or_zero_set; + } else if ( flags & INS_TEST_SFNEOF ) { + flags &= ~INS_TEST_SFNEOF; + flags |= (int)insn_zero_set_or_sign_ne_oflow; + } + } + } + insn->flags_tested = (enum x86_flag_status) flags; + + insn->flags_set = (enum x86_flag_status) INS_FLAGS_SET(eflags) >> 16; + + return; +} + +static void ia32_handle_prefix( x86_insn_t *insn, unsigned int prefixes ) { + + insn->prefix = (enum x86_insn_prefix) prefixes & PREFIX_MASK; // >> 20; + if (! (insn->prefix & PREFIX_PRINT_MASK) ) { + /* no printable prefixes */ + insn->prefix = insn_no_prefix; + } + + /* concat all prefix strings */ + if ( (unsigned int)insn->prefix & PREFIX_LOCK ) { + strncat(insn->prefix_string, "lock ", 32 - + strlen(insn->prefix_string)); + } + + if ( (unsigned int)insn->prefix & PREFIX_REPNZ ) { + strncat(insn->prefix_string, "repnz ", 32 - + strlen(insn->prefix_string)); + } else if ( (unsigned int)insn->prefix & PREFIX_REPZ ) { + strncat(insn->prefix_string, "repz ", 32 - + strlen(insn->prefix_string)); + } + + return; +} + + +static void reg_32_to_16( x86_op_t *op, x86_insn_t *insn, void *arg ) { + + /* if this is a 32-bit register and it is a general register ... */ + if ( op->type == op_register && op->data.reg.size == 4 && + (op->data.reg.type & reg_gen) ) { + /* WORD registers are 8 indices off from DWORD registers */ + ia32_handle_register( &(op->data.reg), + op->data.reg.id + 8 ); + } +} + +static void handle_insn_metadata( x86_insn_t *insn, ia32_insn_t *raw_insn ) { + ia32_handle_mnemtype( insn, raw_insn->mnem_flag ); + ia32_handle_notes( insn, raw_insn->notes ); + ia32_handle_eflags( insn, raw_insn->flags_effected ); + ia32_handle_cpu( insn, raw_insn->cpu ); + ia32_stack_mod( insn ); +} + +static size_t ia32_decode_insn( unsigned char *buf, size_t buf_len, + ia32_insn_t *raw_insn, x86_insn_t *insn, + unsigned int prefixes ) { + size_t size, op_size; + unsigned char modrm; + + /* this should never happen, but just in case... */ + if ( raw_insn->mnem_flag == INS_INVALID ) { + return 0; + } + + if (ia32_settings.options & opt_16_bit) { + insn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 4 : 2; + insn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 4 : 2; + } else { + insn->op_size = ( prefixes & PREFIX_OP_SIZE ) ? 2 : 4; + insn->addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 2 : 4; + } + + + /* ++++ 1. Copy mnemonic and mnemonic-flags to CODE struct */ + if ((ia32_settings.options & opt_att_mnemonics) && raw_insn->mnemonic_att[0]) { + strncpy( insn->mnemonic, raw_insn->mnemonic_att, 16 ); + } + else { + strncpy( insn->mnemonic, raw_insn->mnemonic, 16 ); + } + ia32_handle_prefix( insn, prefixes ); + + handle_insn_metadata( insn, raw_insn ); + + /* prefetch the next byte in case it is a modr/m byte -- saves + * worrying about whether the 'mod/rm' operand or the 'reg' operand + * occurs first */ + modrm = GET_BYTE( buf, buf_len ); + + /* ++++ 2. Decode Explicit Operands */ + /* Intel uses up to 3 explicit operands in its instructions; + * the first is 'dest', the second is 'src', and the third + * is an additional source value (usually an immediate value, + * e.g. in the MUL instructions). These three explicit operands + * are encoded in the opcode tables, even if they are not used + * by the instruction. Additional implicit operands are stored + * in a supplemental table and are handled later. */ + + op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->dest, + raw_insn->dest_flag, prefixes, modrm ); + /* advance buffer, increase size if necessary */ + buf += op_size; + buf_len -= op_size; + size = op_size; + + op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->src, + raw_insn->src_flag, prefixes, modrm ); + buf += op_size; + buf_len -= op_size; + size += op_size; + + op_size = ia32_decode_operand( buf, buf_len, insn, raw_insn->aux, + raw_insn->aux_flag, prefixes, modrm ); + size += op_size; + + + /* ++++ 3. Decode Implicit Operands */ + /* apply implicit operands */ + ia32_insn_implicit_ops( insn, raw_insn->implicit_ops ); + /* we have one small inelegant hack here, to deal with + * the two prefixes that have implicit operands. If Intel + * adds more, we'll change the algorithm to suit :) */ + if ( (prefixes & PREFIX_REPZ) || (prefixes & PREFIX_REPNZ) ) { + ia32_insn_implicit_ops( insn, IDX_IMPLICIT_REP ); + } + + + /* 16-bit hack: foreach operand, if 32-bit reg, make 16-bit reg */ + if ( insn->op_size == 2 ) { + x86_operand_foreach( insn, reg_32_to_16, NULL, op_any ); + } + + return size; +} + + +/* convenience routine */ +#define USES_MOD_RM(flag) \ + (flag == ADDRMETH_E || flag == ADDRMETH_M || flag == ADDRMETH_Q || \ + flag == ADDRMETH_W || flag == ADDRMETH_R) + +static int uses_modrm_flag( unsigned int flag ) { + unsigned int meth; + if ( flag == ARG_NONE ) { + return 0; + } + meth = (flag & ADDRMETH_MASK); + if ( USES_MOD_RM(meth) ) { + return 1; + } + + return 0; +} + +/* This routine performs the actual byte-by-byte opcode table lookup. + * Originally it was pretty simple: get a byte, adjust it to a proper + * index into the table, then check the table row at that index to + * determine what to do next. But is anything that simple with Intel? + * This is now a huge, convoluted mess, mostly of bitter comments. */ +/* buf: pointer to next byte to read from stream + * buf_len: length of buf + * table: index of table to use for lookups + * raw_insn: output pointer that receives opcode definition + * prefixes: output integer that is encoded with prefixes in insn + * returns : number of bytes consumed from stream during lookup */ +size_t ia32_table_lookup( unsigned char *buf, size_t buf_len, + unsigned int table, ia32_insn_t **raw_insn, + unsigned int *prefixes ) { + unsigned char *next, op = buf[0]; /* byte value -- 'opcode' */ + size_t size = 1, sub_size = 0, next_len; + ia32_table_desc_t *table_desc; + unsigned int subtable, prefix = 0, recurse_table = 0; + + table_desc = &ia32_tables[table]; + + op = GET_BYTE( buf, buf_len ); + + if ( table_desc->type == tbl_fpu && op > table_desc->maxlim) { + /* one of the fucking FPU tables out of the 00-BH range */ + /* OK,. this is a bit of a hack -- the proper way would + * have been to use subtables in the 00-BF FPU opcode tables, + * but that is rather wasteful of space... */ + table_desc = &ia32_tables[table +1]; + } + + /* PERFORM TABLE LOOKUP */ + + /* ModR/M trick: shift extension bits into lowest bits of byte */ + /* Note: non-ModR/M tables have a shift value of 0 */ + op >>= table_desc->shift; + + /* ModR/M trick: mask out high bits to turn extension into an index */ + /* Note: non-ModR/M tables have a mask value of 0xFF */ + op &= table_desc->mask; + + + /* Sparse table trick: check that byte is <= max value */ + /* Note: full (256-entry) tables have a maxlim of 155 */ + if ( op > table_desc->maxlim ) { + /* this is a partial table, truncated at the tail, + and op is out of range! */ + return INVALID_INSN; + } + + /* Sparse table trick: check that byte is >= min value */ + /* Note: full (256-entry) tables have a minlim of 0 */ + if ( table_desc->minlim > op ) { + /* this is a partial table, truncated at the head, + and op is out of range! */ + return INVALID_INSN; + } + /* adjust op to be an offset from table index 0 */ + op -= table_desc->minlim; + + /* Yay! 'op' is now fully adjusted to be an index into 'table' */ + *raw_insn = &(table_desc->table[op]); + //printf("BYTE %X TABLE %d OP %X\n", buf[0], table, op ); + + if ( (*raw_insn)->mnem_flag & INS_FLAG_PREFIX ) { + prefix = (*raw_insn)->mnem_flag & PREFIX_MASK; + } + + + /* handle escape to a multibyte/coproc/extension/etc table */ + /* NOTE: if insn is a prefix and has a subtable, then we + * only recurse if this is the first prefix byte -- + * that is, if *prefixes is 0. + * NOTE also that suffix tables are handled later */ + subtable = (*raw_insn)->table; + + if ( subtable && ia32_tables[subtable].type != tbl_suffix && + (! prefix || ! *prefixes) ) { + + if ( ia32_tables[subtable].type == tbl_ext_ext || + ia32_tables[subtable].type == tbl_fpu_ext ) { + /* opcode extension: reuse current byte in buffer */ + next = buf; + next_len = buf_len; + } else { + /* "normal" opcode: advance to next byte in buffer */ + if ( buf_len > 1 ) { + next = &buf[1]; + next_len = buf_len - 1; + } + else { + // buffer is truncated + return INVALID_INSN; + } + } + /* we encountered a multibyte opcode: recurse using the + * table specified in the opcode definition */ + sub_size = ia32_table_lookup( next, next_len, subtable, + raw_insn, prefixes ); + + /* SSE/prefix hack: if the original opcode def was a + * prefix that specified a subtable, and the subtable + * lookup returned a valid insn, then we have encountered + * an SSE opcode definition; otherwise, we pretend we + * never did the subtable lookup, and deal with the + * prefix normally later */ + if ( prefix && ( sub_size == INVALID_INSN || + INS_TYPE((*raw_insn)->mnem_flag) == INS_INVALID ) ) { + /* this is a prefix, not an SSE insn : + * lookup next byte in main table, + * subsize will be reset during the + * main table lookup */ + recurse_table = 1; + } else { + /* this is either a subtable (two-byte) insn + * or an invalid insn: either way, set prefix + * to NULL and end the opcode lookup */ + prefix = 0; + // short-circuit lookup on invalid insn + if (sub_size == INVALID_INSN) return INVALID_INSN; + } + } else if ( prefix ) { + recurse_table = 1; + } + + /* by default, we assume that we have the opcode definition, + * and there is no need to recurse on the same table, but + * if we do then a prefix was encountered... */ + if ( recurse_table ) { + /* this must have been a prefix: use the same table for + * lookup of the next byte */ + sub_size = ia32_table_lookup( &buf[1], buf_len - 1, table, + raw_insn, prefixes ); + + // short-circuit lookup on invalid insn + if (sub_size == INVALID_INSN) return INVALID_INSN; + + /* a bit of a hack for branch hints */ + if ( prefix & BRANCH_HINT_MASK ) { + if ( INS_GROUP((*raw_insn)->mnem_flag) == INS_EXEC ) { + /* segment override prefixes are invalid for + * all branch instructions, so delete them */ + prefix &= ~PREFIX_REG_MASK; + } else { + prefix &= ~BRANCH_HINT_MASK; + } + } + + /* apply prefix to instruction */ + + /* TODO: implement something enforcing prefix groups */ + (*prefixes) |= prefix; + } + + /* if this lookup was in a ModR/M table, then an opcode byte is + * NOT consumed: subtract accordingly. NOTE that if none of the + * operands used the ModR/M, then we need to consume the byte + * here, but ONLY in the 'top-level' opcode extension table */ + + if ( table_desc->type == tbl_ext_ext ) { + /* extensions-to-extensions never consume a byte */ + --size; + } else if ( (table_desc->type == tbl_extension || + table_desc->type == tbl_fpu || + table_desc->type == tbl_fpu_ext ) && + /* extensions that have an operand encoded in ModR/M + * never consume a byte */ + (uses_modrm_flag((*raw_insn)->dest_flag) || + uses_modrm_flag((*raw_insn)->src_flag) ) ) { + --size; + } + + size += sub_size; + + return size; +} + +static size_t handle_insn_suffix( unsigned char *buf, size_t buf_len, + ia32_insn_t *raw_insn, x86_insn_t * insn ) { + ia32_table_desc_t *table_desc; + ia32_insn_t *sfx_insn; + size_t size; + unsigned int prefixes = 0; + + table_desc = &ia32_tables[raw_insn->table]; + size = ia32_table_lookup( buf, buf_len, raw_insn->table, &sfx_insn, + &prefixes ); + if (size == INVALID_INSN || sfx_insn->mnem_flag == INS_INVALID ) { + return 0; + } + + strncpy( insn->mnemonic, sfx_insn->mnemonic, 16 ); + handle_insn_metadata( insn, sfx_insn ); + + return 1; +} + +/* invalid instructions are handled by returning 0 [error] from the + * function, setting the size of the insn to 1 byte, and copying + * the byte at the start of the invalid insn into the x86_insn_t. + * if the caller is saving the x86_insn_t for invalid instructions, + * instead of discarding them, this will maintain a consistent + * address space in the x86_insn_ts */ + +/* this function is called by the controlling disassembler, so its name and + * calling convention cannot be changed */ +/* buf points to the loc of the current opcode (start of the + * instruction) in the instruction stream. The instruction + * stream is assumed to be a buffer of bytes read directly + * from the file for the purpose of disassembly; a mem-mapped + * file is ideal for * this. + * insn points to a code structure to be filled by instr_decode + * returns the size of the decoded instruction in bytes */ +size_t ia32_disasm_addr( unsigned char * buf, size_t buf_len, + x86_insn_t *insn ) { + ia32_insn_t *raw_insn = NULL; + unsigned int prefixes = 0; + size_t size, sfx_size; + + if ( (ia32_settings.options & opt_ignore_nulls) && buf_len > 3 && + !buf[0] && !buf[1] && !buf[2] && !buf[3]) { + /* IF IGNORE_NULLS is set AND + * first 4 bytes in the intruction stream are NULL + * THEN return 0 (END_OF_DISASSEMBLY) */ + /* TODO: set errno */ + MAKE_INVALID( insn, buf ); + return 0; /* 4 00 bytes in a row? This isn't code! */ + } + + /* Perform recursive table lookup starting with main table (0) */ + size = ia32_table_lookup(buf, buf_len, idx_Main, &raw_insn, &prefixes); + if ( size == INVALID_INSN || size > buf_len || raw_insn->mnem_flag == INS_INVALID ) { + MAKE_INVALID( insn, buf ); + /* TODO: set errno */ + return 0; + } + + /* We now have the opcode itself figured out: we can decode + * the rest of the instruction. */ + size += ia32_decode_insn( &buf[size], buf_len - size, raw_insn, insn, + prefixes ); + if ( raw_insn->mnem_flag & INS_FLAG_SUFFIX ) { + /* AMD 3DNow! suffix -- get proper operand type here */ + sfx_size = handle_insn_suffix( &buf[size], buf_len - size, + raw_insn, insn ); + if (! sfx_size ) { + /* TODO: set errno */ + MAKE_INVALID( insn, buf ); + return 0; + } + + size += sfx_size; + } + + if (! size ) { + /* invalid insn */ + MAKE_INVALID( insn, buf ); + return 0; + } + + + insn->size = size; + return size; /* return size of instruction in bytes */ +} diff --git a/spotify/breakpad/third_party/libdisasm/ia32_insn.h b/spotify/breakpad/third_party/libdisasm/ia32_insn.h new file mode 100644 index 000000000..d3f36c3b2 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_insn.h @@ -0,0 +1,506 @@ +#ifndef IA32_INSN_H +#define IA32_INSN_H +/* this file contains the structure of opcode definitions and the + * constants they use */ + +#include +#include "libdis.h" + + +#define GET_BYTE( buf, buf_len ) buf_len ? *buf : 0 + +#define OP_SIZE_16 1 +#define OP_SIZE_32 2 +#define ADDR_SIZE_16 4 +#define ADDR_SIZE_32 8 + +#define MAX_INSTRUCTION_SIZE 20 + +/* invalid instructions are handled by returning 0 [error] from the + * function, setting the size of the insn to 1 byte, and copying + * the byte at the start of the invalid insn into the x86_insn_t. + * if the caller is saving the x86_insn_t for invalid instructions, + * instead of discarding them, this will maintain a consistent + * address space in the x86_insn_ts */ + +#define INVALID_INSN ((size_t) -1) /* return value for invalid insn */ +#define MAKE_INVALID( i, buf ) \ + strcpy( i->mnemonic, "invalid" ); \ + x86_oplist_free( i ); \ + i->size = 1; \ + i->group = insn_none; \ + i->type = insn_invalid; \ + memcpy( i->bytes, buf, 1 ); + + +size_t ia32_disasm_addr( unsigned char * buf, size_t buf_len, + x86_insn_t *insn); + + +/* --------------------------------------------------------- Table Lookup */ +/* IA32 Instruction defintion for ia32_opcodes.c */ +typedef struct { + unsigned int table; /* escape to this sub-table */ + unsigned int mnem_flag; /* Flags referring to mnemonic */ + unsigned int notes; /* Notes for this instruction */ + unsigned int dest_flag, src_flag, aux_flag; /* and for specific operands */ + unsigned int cpu; /* minimumCPU [AND with clocks?? */ + char mnemonic[16]; /* buffers for building instruction */ + char mnemonic_att[16]; /* at&t style mnemonic name */ + int32_t dest; + int32_t src; + int32_t aux; + unsigned int flags_effected; + unsigned int implicit_ops; /* implicit operands */ +} ia32_insn_t; + + + +/* --------------------------------------------------------- Prefixes */ +/* Prefix Flags */ +/* Prefixes, same order as in the manual */ +/* had to reverse the values of the first three as they were entered into + * libdis.h incorrectly. */ +#define PREFIX_LOCK 0x0004 +#define PREFIX_REPNZ 0x0002 +#define PREFIX_REPZ 0x0001 +#define PREFIX_OP_SIZE 0x0010 +#define PREFIX_ADDR_SIZE 0x0020 +#define PREFIX_CS 0x0100 +#define PREFIX_SS 0x0200 +#define PREFIX_DS 0x0300 +#define PREFIX_ES 0x0400 +#define PREFIX_FS 0x0500 +#define PREFIX_GS 0x0600 +#define PREFIX_TAKEN 0x1000 /* branch taken */ +#define PREFIX_NOTTAKEN 0x2000 /* branch not taken */ +#define PREFIX_REG_MASK 0x0F00 +#define BRANCH_HINT_MASK 0x3000 +#define PREFIX_PRINT_MASK 0x000F /* printable prefixes */ +#define PREFIX_MASK 0xFFFF + +/* ---------------------------------------------------------- CPU Type */ + +#define cpu_8086 0x0001 +#define cpu_80286 0x0002 +#define cpu_80386 0x0003 +#define cpu_80387 0x0004 /* originally these were a co-proc */ +#define cpu_80486 0x0005 +#define cpu_PENTIUM 0x0006 +#define cpu_PENTPRO 0x0007 +#define cpu_PENTIUM2 0x0008 +#define cpu_PENTIUM3 0x0009 +#define cpu_PENTIUM4 0x000A +#define cpu_K6 0x0010 +#define cpu_K7 0x0020 +#define cpu_ATHLON 0x0030 +#define CPU_MODEL_MASK 0xFFFF +#define CPU_MODEL(cpu) (cpu & CPU_MODEL_MASK) +/* intel instruction subsets */ +#define isa_GP 0x10000 /* General Purpose Instructions */ +#define isa_FPU 0x20000 /* FPU instructions */ +#define isa_FPUMGT 0x30000 /* FPU/SIMD Management */ +#define isa_MMX 0x40000 /* MMX */ +#define isa_SSE1 0x50000 /* SSE */ +#define isa_SSE2 0x60000 /* SSE 2 */ +#define isa_SSE3 0x70000 /* SSE 3 */ +#define isa_3DNOW 0x80000 /* AMD 3d Now */ +#define isa_SYS 0x90000 /* System Instructions */ +#define ISA_SUBSET_MASK 0xFFFF0000 +#define ISA_SUBSET(isa) (isa & ISA_SUBSET_MASK) + + +/* ------------------------------------------------------ Operand Decoding */ +#define ARG_NONE 0 + +/* Using a mask allows us to store info such as OP_SIGNED in the + * operand flags field */ +#define OPFLAGS_MASK 0x0000FFFF + +/* Operand Addressing Methods, per intel manual */ +#define ADDRMETH_MASK 0x00FF0000 + +/* note: for instructions with implied operands, use no ADDRMETH */ +#define ADDRMETH_A 0x00010000 +#define ADDRMETH_C 0x00020000 +#define ADDRMETH_D 0x00030000 +#define ADDRMETH_E 0x00040000 +#define ADDRMETH_F 0x00050000 +#define ADDRMETH_G 0x00060000 +#define ADDRMETH_I 0x00070000 +#define ADDRMETH_J 0x00080000 +#define ADDRMETH_M 0x00090000 +#define ADDRMETH_O 0x000A0000 +#define ADDRMETH_P 0x000B0000 +#define ADDRMETH_Q 0x000C0000 +#define ADDRMETH_R 0x000D0000 +#define ADDRMETH_S 0x000E0000 +#define ADDRMETH_T 0x000F0000 +#define ADDRMETH_V 0x00100000 +#define ADDRMETH_W 0x00110000 +#define ADDRMETH_X 0x00120000 +#define ADDRMETH_Y 0x00130000 +#define ADDRMETH_RR 0x00140000 /* gen reg hard-coded in opcode */ +#define ADDRMETH_RS 0x00150000 /* seg reg hard-coded in opcode */ +#define ADDRMETH_RT 0x00160000 /* test reg hard-coded in opcode */ +#define ADDRMETH_RF 0x00170000 /* fpu reg hard-coded in opcode */ +#define ADDRMETH_II 0x00180000 /* immediate hard-coded in opcode */ +#define ADDRMETH_PP 0x00190000 /* mm reg ONLY in modr/m field */ +#define ADDRMETH_VV 0x001A0000 /* xmm reg ONLY in mod/rm field */ + +/* Operand Types, per intel manual */ +#define OPTYPE_MASK 0xFF000000 + +#define OPTYPE_a 0x01000000 /* BOUND: h:h or w:w */ +#define OPTYPE_b 0x02000000 /* byte */ +#define OPTYPE_c 0x03000000 /* byte or word */ +#define OPTYPE_d 0x04000000 /* word */ +#define OPTYPE_dq 0x05000000 /* qword */ +#define OPTYPE_p 0x06000000 /* 16:16 or 16:32 pointer */ +#define OPTYPE_pi 0x07000000 /* dword MMX reg */ +#define OPTYPE_ps 0x08000000 /* 128-bit single fp */ +#define OPTYPE_q 0x09000000 /* dword */ +#define OPTYPE_s 0x0A000000 /* 6-byte descriptor */ +#define OPTYPE_ss 0x0B000000 /* scalar of 128-bit single fp */ +#define OPTYPE_si 0x0C000000 /* word general register */ +#define OPTYPE_v 0x0D000000 /* hword or word */ +#define OPTYPE_w 0x0E000000 /* hword */ +#define OPTYPE_m 0x0F000000 /* to handle LEA */ +#define OPTYPE_none 0xFF000000 /* no valid operand size, INVLPG */ + +/* custom ones for FPU instructions */ +#define OPTYPE_fs 0x10000000 /* pointer to single-real*/ +#define OPTYPE_fd 0x20000000 /* pointer to double real */ +#define OPTYPE_fe 0x30000000 /* pointer to extended real */ +#define OPTYPE_fb 0x40000000 /* pointer to packed BCD */ +#define OPTYPE_fv 0x50000000 /* pointer to FPU env: 14|28-bytes */ +#define OPTYPE_ft 0x60000000 /* pointer to FPU state: 94|108-bytes */ +#define OPTYPE_fx 0x70000000 /* pointer to FPU regs: 512 bites */ +#define OPTYPE_fp 0x80000000 /* general fpu register: dbl ext */ + +/* SSE2 operand types */ +#define OPTYPE_sd 0x90000000 /* scalar of 128-bit double fp */ +#define OPTYPE_pd 0xA0000000 /* 128-bit double fp */ + + + +/* ---------------------------------------------- Opcode Table Descriptions */ +/* the table type describes how to handle byte/size increments before + * and after lookup. Some tables re-use the current byte, others + * consume a byte only if the ModR/M encodes no operands, etc */ +enum ia32_tbl_type_id { + tbl_opcode = 0, /* standard opcode table: no surprises */ + tbl_prefix, /* Prefix Override, e.g. 66/F2/F3 */ + tbl_suffix, /* 3D Now style */ + tbl_extension, /* ModR/M extension: 00-FF -> 00-07 */ + tbl_ext_ext, /* extension of modr/m using R/M field */ + tbl_fpu, /* fpu table: 00-BF -> 00-0F */ + tbl_fpu_ext /* fpu extension : C0-FF -> 00-1F */ + }; + +/* How it works: + * Bytes are 'consumed' if the next table lookup requires that the byte + * pointer be advanced in the instruction stream. 'Does not consume' means + * that, when the lookup function recurses, the same byte it re-used in the + * new table. It also means that size is not decremented, for example when + * a ModR/M byte is used. Note that tbl_extension (ModR/M) instructions that + * do not increase the size of an insn with their operands have a forced + 3 size increase in the lookup algo. Weird, yes, confusing, yes, welcome + * to the Intel ISA. Another note: tbl_prefix is used as an override, so an + * empty insn in a prefix table causes the instruction in the original table + * to be used, rather than an invalid insn being generated. + * tbl_opcode uses current byte and consumes it + * tbl_prefix uses current byte but does not consume it + * tbl_suffix uses and consumes last byte in insn + * tbl_extension uses current byte but does not consume it + * tbl_ext_ext uses current byte but does not consume it + * tbl_fpu uses current byte and consumes it + * tbl_fpu_ext uses current byte but does not consume it + */ + +/* Convenience struct for opcode tables : these will be stored in a + * 'table of tables' so we can use a table index instead of a pointer */ +typedef struct { /* Assembly instruction tables */ + ia32_insn_t *table; /* Pointer to table of instruction encodings */ + enum ia32_tbl_type_id type; + unsigned char shift; /* amount to shift modrm byte */ + unsigned char mask; /* bit mask for look up */ + unsigned char minlim,maxlim; /* limits on min/max entries. */ +} ia32_table_desc_t; + + +/* ---------------------------------------------- 'Cooked' Operand Type Info */ +/* Permissions: */ +#define OP_R 0x001 /* operand is READ */ +#define OP_W 0x002 /* operand is WRITTEN */ +#define OP_RW 0x003 /* (OP_R|OP_W): convenience macro */ +#define OP_X 0x004 /* operand is EXECUTED */ + +#define OP_PERM_MASK 0x0000007 /* perms are NOT mutually exclusive */ +#define OP_PERM( type ) (type & OP_PERM_MASK) + +/* Flags */ +#define OP_SIGNED 0x010 /* operand is signed */ + +#define OP_FLAG_MASK 0x0F0 /* mods are NOT mutually exclusive */ +#define OP_FLAGS( type ) (type & OP_FLAG_MASK) + +#define OP_REG_MASK 0x0000FFFF /* lower WORD is register ID */ +#define OP_REGTBL_MASK 0xFFFF0000 /* higher word is register type [gen/dbg] */ +#define OP_REGID( type ) (type & OP_REG_MASK) +#define OP_REGTYPE( type ) (type & OP_REGTBL_MASK) + +/* ------------------------------------------'Cooked' Instruction Type Info */ +/* high-bit opcode types/insn meta-types */ +#define INS_FLAG_PREFIX 0x10000000 /* insn is a prefix */ +#define INS_FLAG_SUFFIX 0x20000000 /* followed by a suffix byte */ +#define INS_FLAG_MASK 0xFF000000 + +/* insn notes */ +#define INS_NOTE_RING0 0x00000001 /* insn is privileged */ +#define INS_NOTE_SMM 0x00000002 /* Sys Mgt Mode only */ +#define INS_NOTE_SERIAL 0x00000004 /* serializes */ +#define INS_NOTE_NONSWAP 0x00000008 /* insn is not swapped in att format */ // could be separate field? +#define INS_NOTE_NOSUFFIX 0x00000010 /* insn has no size suffix in att format */ // could be separate field? +//#define INS_NOTE_NMI + +#define INS_INVALID 0 + +/* instruction groups */ +#define INS_EXEC 0x1000 +#define INS_ARITH 0x2000 +#define INS_LOGIC 0x3000 +#define INS_STACK 0x4000 +#define INS_COND 0x5000 +#define INS_LOAD 0x6000 +#define INS_ARRAY 0x7000 +#define INS_BIT 0x8000 +#define INS_FLAG 0x9000 +#define INS_FPU 0xA000 +#define INS_TRAPS 0xD000 +#define INS_SYSTEM 0xE000 +#define INS_OTHER 0xF000 + +#define INS_GROUP_MASK 0xF000 +#define INS_GROUP( type ) ( type & INS_GROUP_MASK ) + +/* INS_EXEC group */ +#define INS_BRANCH (INS_EXEC | 0x01) /* Unconditional branch */ +#define INS_BRANCHCC (INS_EXEC | 0x02) /* Conditional branch */ +#define INS_CALL (INS_EXEC | 0x03) /* Jump to subroutine */ +#define INS_CALLCC (INS_EXEC | 0x04) /* Jump to subroutine */ +#define INS_RET (INS_EXEC | 0x05) /* Return from subroutine */ + +/* INS_ARITH group */ +#define INS_ADD (INS_ARITH | 0x01) +#define INS_SUB (INS_ARITH | 0x02) +#define INS_MUL (INS_ARITH | 0x03) +#define INS_DIV (INS_ARITH | 0x04) +#define INS_INC (INS_ARITH | 0x05) /* increment */ +#define INS_DEC (INS_ARITH | 0x06) /* decrement */ +#define INS_SHL (INS_ARITH | 0x07) /* shift right */ +#define INS_SHR (INS_ARITH | 0x08) /* shift left */ +#define INS_ROL (INS_ARITH | 0x09) /* rotate left */ +#define INS_ROR (INS_ARITH | 0x0A) /* rotate right */ +#define INS_MIN (INS_ARITH | 0x0B) /* min func */ +#define INS_MAX (INS_ARITH | 0x0C) /* max func */ +#define INS_AVG (INS_ARITH | 0x0D) /* avg func */ +#define INS_FLR (INS_ARITH | 0x0E) /* floor func */ +#define INS_CEIL (INS_ARITH | 0x0F) /* ceiling func */ + +/* INS_LOGIC group */ +#define INS_AND (INS_LOGIC | 0x01) +#define INS_OR (INS_LOGIC | 0x02) +#define INS_XOR (INS_LOGIC | 0x03) +#define INS_NOT (INS_LOGIC | 0x04) +#define INS_NEG (INS_LOGIC | 0x05) +#define INS_NAND (INS_LOGIC | 0x06) + +/* INS_STACK group */ +#define INS_PUSH (INS_STACK | 0x01) +#define INS_POP (INS_STACK | 0x02) +#define INS_PUSHREGS (INS_STACK | 0x03) /* push register context */ +#define INS_POPREGS (INS_STACK | 0x04) /* pop register context */ +#define INS_PUSHFLAGS (INS_STACK | 0x05) /* push all flags */ +#define INS_POPFLAGS (INS_STACK | 0x06) /* pop all flags */ +#define INS_ENTER (INS_STACK | 0x07) /* enter stack frame */ +#define INS_LEAVE (INS_STACK | 0x08) /* leave stack frame */ + +/* INS_COND group */ +#define INS_TEST (INS_COND | 0x01) +#define INS_CMP (INS_COND | 0x02) + +/* INS_LOAD group */ +#define INS_MOV (INS_LOAD | 0x01) +#define INS_MOVCC (INS_LOAD | 0x02) +#define INS_XCHG (INS_LOAD | 0x03) +#define INS_XCHGCC (INS_LOAD | 0x04) +#define INS_CONV (INS_LOAD | 0x05) /* move and convert type */ + +/* INS_ARRAY group */ +#define INS_STRCMP (INS_ARRAY | 0x01) +#define INS_STRLOAD (INS_ARRAY | 0x02) +#define INS_STRMOV (INS_ARRAY | 0x03) +#define INS_STRSTOR (INS_ARRAY | 0x04) +#define INS_XLAT (INS_ARRAY | 0x05) + +/* INS_BIT group */ +#define INS_BITTEST (INS_BIT | 0x01) +#define INS_BITSET (INS_BIT | 0x02) +#define INS_BITCLR (INS_BIT | 0x03) + +/* INS_FLAG group */ +#define INS_CLEARCF (INS_FLAG | 0x01) /* clear Carry flag */ +#define INS_CLEARZF (INS_FLAG | 0x02) /* clear Zero flag */ +#define INS_CLEAROF (INS_FLAG | 0x03) /* clear Overflow flag */ +#define INS_CLEARDF (INS_FLAG | 0x04) /* clear Direction flag */ +#define INS_CLEARSF (INS_FLAG | 0x05) /* clear Sign flag */ +#define INS_CLEARPF (INS_FLAG | 0x06) /* clear Parity flag */ +#define INS_SETCF (INS_FLAG | 0x07) +#define INS_SETZF (INS_FLAG | 0x08) +#define INS_SETOF (INS_FLAG | 0x09) +#define INS_SETDF (INS_FLAG | 0x0A) +#define INS_SETSF (INS_FLAG | 0x0B) +#define INS_SETPF (INS_FLAG | 0x0C) +#define INS_TOGCF (INS_FLAG | 0x10) /* toggle */ +#define INS_TOGZF (INS_FLAG | 0x20) +#define INS_TOGOF (INS_FLAG | 0x30) +#define INS_TOGDF (INS_FLAG | 0x40) +#define INS_TOGSF (INS_FLAG | 0x50) +#define INS_TOGPF (INS_FLAG | 0x60) + +/* INS_FPU */ +#define INS_FMOV (INS_FPU | 0x1) +#define INS_FMOVCC (INS_FPU | 0x2) +#define INS_FNEG (INS_FPU | 0x3) +#define INS_FABS (INS_FPU | 0x4) +#define INS_FADD (INS_FPU | 0x5) +#define INS_FSUB (INS_FPU | 0x6) +#define INS_FMUL (INS_FPU | 0x7) +#define INS_FDIV (INS_FPU | 0x8) +#define INS_FSQRT (INS_FPU | 0x9) +#define INS_FCMP (INS_FPU | 0xA) +#define INS_FCOS (INS_FPU | 0xC) /* cosine */ +#define INS_FLDPI (INS_FPU | 0xD) /* load pi */ +#define INS_FLDZ (INS_FPU | 0xE) /* load 0 */ +#define INS_FTAN (INS_FPU | 0xF) /* tanget */ +#define INS_FSINE (INS_FPU | 0x10) /* sine */ +#define INS_FSYS (INS_FPU | 0x20) /* misc */ + +/* INS_TRAP */ +#define INS_TRAP (INS_TRAPS | 0x01) /* generate trap */ +#define INS_TRAPCC (INS_TRAPS | 0x02) /* conditional trap gen */ +#define INS_TRET (INS_TRAPS | 0x03) /* return from trap */ +#define INS_BOUNDS (INS_TRAPS | 0x04) /* gen bounds trap */ +#define INS_DEBUG (INS_TRAPS | 0x05) /* gen breakpoint trap */ +#define INS_TRACE (INS_TRAPS | 0x06) /* gen single step trap */ +#define INS_INVALIDOP (INS_TRAPS | 0x07) /* gen invalid insn */ +#define INS_OFLOW (INS_TRAPS | 0x08) /* gen overflow trap */ +#define INS_ICEBP (INS_TRAPS | 0x09) /* ICE breakpoint */ + +/* INS_SYSTEM */ +#define INS_HALT (INS_SYSTEM | 0x01) /* halt machine */ +#define INS_IN (INS_SYSTEM | 0x02) /* input form port */ +#define INS_OUT (INS_SYSTEM | 0x03) /* output to port */ +#define INS_CPUID (INS_SYSTEM | 0x04) /* identify cpu */ + +/* INS_OTHER */ +#define INS_NOP (INS_OTHER | 0x01) +#define INS_BCDCONV (INS_OTHER | 0x02) /* convert to/from BCD */ +#define INS_SZCONV (INS_OTHER | 0x03) /* convert size of operand */ +#define INS_SALC (INS_OTHER | 0x04) /* set %al on carry */ +#define INS_UNKNOWN (INS_OTHER | 0x05) + + +#define INS_TYPE_MASK 0xFFFF +#define INS_TYPE( type ) ( type & INS_TYPE_MASK ) + + /* flags effected by instruction */ +#define INS_TEST_CARRY 0x01 /* carry */ +#define INS_TEST_ZERO 0x02 /* zero/equal */ +#define INS_TEST_OFLOW 0x04 /* overflow */ +#define INS_TEST_DIR 0x08 /* direction */ +#define INS_TEST_SIGN 0x10 /* negative */ +#define INS_TEST_PARITY 0x20 /* parity */ +#define INS_TEST_OR 0x40 /* used in jle */ +#define INS_TEST_NCARRY 0x100 /* ! carry */ +#define INS_TEST_NZERO 0x200 /* ! zero */ +#define INS_TEST_NOFLOW 0x400 /* ! oflow */ +#define INS_TEST_NDIR 0x800 /* ! dir */ +#define INS_TEST_NSIGN 0x100 /* ! sign */ +#define INS_TEST_NPARITY 0x2000 /* ! parity */ +/* SF == OF */ +#define INS_TEST_SFEQOF 0x4000 +/* SF != OF */ +#define INS_TEST_SFNEOF 0x8000 + +#define INS_TEST_ALL INS_TEST_CARRY | INS_TEST_ZERO | \ + INS_TEST_OFLOW | INS_TEST_SIGN | \ + INS_TEST_PARITY + +#define INS_SET_CARRY 0x010000 /* carry */ +#define INS_SET_ZERO 0x020000 /* zero/equal */ +#define INS_SET_OFLOW 0x040000 /* overflow */ +#define INS_SET_DIR 0x080000 /* direction */ +#define INS_SET_SIGN 0x100000 /* negative */ +#define INS_SET_PARITY 0x200000 /* parity */ +#define INS_SET_NCARRY 0x1000000 +#define INS_SET_NZERO 0x2000000 +#define INS_SET_NOFLOW 0x4000000 +#define INS_SET_NDIR 0x8000000 +#define INS_SET_NSIGN 0x10000000 +#define INS_SET_NPARITY 0x20000000 +#define INS_SET_SFEQOF 0x40000000 +#define INS_SET_SFNEOF 0x80000000 + +#define INS_SET_ALL INS_SET_CARRY | INS_SET_ZERO | \ + INS_SET_OFLOW | INS_SET_SIGN | \ + INS_SET_PARITY + +#define INS_TEST_MASK 0x0000FFFF +#define INS_FLAGS_TEST(x) (x & INS_TEST_MASK) +#define INS_SET_MASK 0xFFFF0000 +#define INS_FLAGS_SET(x) (x & INS_SET_MASK) + +#if 0 +/* TODO: actually start using these */ +#define X86_PAIR_NP 1 /* not pairable; execs in U */ +#define X86_PAIR_PU 2 /* pairable in U pipe */ +#define X86_PAIR_PV 3 /* pairable in V pipe */ +#define X86_PAIR_UV 4 /* pairable in UV pipe */ +#define X86_PAIR_FX 5 /* pairable with FXCH */ + +#define X86_EXEC_PORT_0 1 +#define X86_EXEC_PORT_1 2 +#define X86_EXEC_PORT_2 4 +#define X86_EXEC_PORT_3 8 +#define X86_EXEC_PORT_4 16 + +#define X86_EXEC_UNITS + +typedef struct { /* representation of an insn during decoding */ + uint32_t flags; /* runtime settings */ + /* instruction prefixes and other foolishness */ + uint32_t prefix; /* encoding of prefix */ + char prefix_str[16]; /* mnemonics for prefix */ + uint32_t branch_hint; /* gah! */ + unsigned int cpu_ver; /* TODO: cpu version */ + unsigned int clocks; /* TODO: clock cycles: min/max */ + unsigned char last_prefix; + /* runtime intruction decoding helpers */ + unsigned char mode; /* 16, 32, 64 */ + unsigned char gen_regs; /* offset of default general reg set */ + unsigned char sz_operand; /* operand size for insn */ + unsigned char sz_address; /* address size for insn */ + unsigned char uops; /* uops per insn */ + unsigned char pairing; /* np,pu,pv.lv */ + unsigned char exec_unit; + unsigned char exec_port; + unsigned char latency; +} ia32_info_t; +#define MODE_32 0 /* default */ +#define MODE_16 1 +#define MODE_64 2 +#endif + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/ia32_invariant.c b/spotify/breakpad/third_party/libdisasm/ia32_invariant.c new file mode 100644 index 000000000..68ec153d2 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_invariant.c @@ -0,0 +1,313 @@ +#include +#include + +#include "ia32_invariant.h" +#include "ia32_insn.h" +#include "ia32_settings.h" + +extern ia32_table_desc_t *ia32_tables; +extern ia32_settings_t ia32_settings; + +extern size_t ia32_table_lookup( unsigned char *buf, size_t buf_len, + unsigned int table, ia32_insn_t **raw_insn, + unsigned int *prefixes ); + + +/* -------------------------------- ModR/M, SIB */ +/* Convenience flags */ +#define MODRM_EA 1 /* ModR/M is an effective addr */ +#define MODRM_reg 2 /* ModR/M is a register */ + +/* ModR/M flags */ +#define MODRM_RM_SIB 0x04 /* R/M == 100 */ +#define MODRM_RM_NOREG 0x05 /* R/B == 101 */ +/* if (MODRM.MOD_NODISP && MODRM.RM_NOREG) then just disp32 */ +#define MODRM_MOD_NODISP 0x00 /* mod == 00 */ +#define MODRM_MOD_DISP8 0x01 /* mod == 01 */ +#define MODRM_MOD_DISP32 0x02 /* mod == 10 */ +#define MODRM_MOD_NOEA 0x03 /* mod == 11 */ +/* 16-bit modrm flags */ +#define MOD16_MOD_NODISP 0 +#define MOD16_MOD_DISP8 1 +#define MOD16_MOD_DISP16 2 +#define MOD16_MOD_REG 3 + +#define MOD16_RM_BXSI 0 +#define MOD16_RM_BXDI 1 +#define MOD16_RM_BPSI 2 +#define MOD16_RM_BPDI 3 +#define MOD16_RM_SI 4 +#define MOD16_RM_DI 5 +#define MOD16_RM_BP 6 +#define MOD16_RM_BX 7 + +/* SIB flags */ +#define SIB_INDEX_NONE 0x04 +#define SIB_BASE_EBP 0x05 +#define SIB_SCALE_NOBASE 0x00 + +/* Convenience struct for modR/M bitfield */ +struct modRM_byte { + unsigned int mod : 2; + unsigned int reg : 3; + unsigned int rm : 3; +}; + +/* Convenience struct for SIB bitfield */ +struct SIB_byte { + unsigned int scale : 2; + unsigned int index : 3; + unsigned int base : 3; +}; + +#ifdef WIN32 +static void byte_decode(unsigned char b, struct modRM_byte *modrm) { +#else +static inline void byte_decode(unsigned char b, struct modRM_byte *modrm) { +#endif + /* generic bitfield-packing routine */ + + modrm->mod = b >> 6; /* top 2 bits */ + modrm->reg = (b & 56) >> 3; /* middle 3 bits */ + modrm->rm = b & 7; /* bottom 3 bits */ +} +static int ia32_invariant_modrm( unsigned char *in, unsigned char *out, + unsigned int mode_16, x86_invariant_op_t *op) { + struct modRM_byte modrm; + struct SIB_byte sib; + unsigned char *c, *cin; + unsigned short *s; + unsigned int *i; + int size = 0; /* modrm byte is already counted */ + + + byte_decode(*in, &modrm); /* get bitfields */ + + out[0] = in[0]; /* save modrm byte */ + cin = &in[1]; + c = &out[1]; + s = (unsigned short *)&out[1]; + i = (unsigned int *)&out[1]; + + op->type = op_expression; + op->flags |= op_pointer; + if ( ! mode_16 && modrm.rm == MODRM_RM_SIB && + modrm.mod != MODRM_MOD_NOEA ) { + size ++; + byte_decode(*cin, (struct modRM_byte *)(void*)&sib); + + out[1] = in[1]; /* save sib byte */ + cin = &in[2]; + c = &out[2]; + s = (unsigned short *)&out[2]; + i = (unsigned int *)&out[2]; + + if ( sib.base == SIB_BASE_EBP && ! modrm.mod ) { + /* disp 32 is variant! */ + memset( i, X86_WILDCARD_BYTE, 4 ); + size += 4; + } + } + + if (! modrm.mod && modrm.rm == 101) { + if ( mode_16 ) { /* straight RVA in disp */ + memset( s, X86_WILDCARD_BYTE, 2 ); + size += 2; + } else { + memset( i, X86_WILDCARD_BYTE, 2 ); + size += 4; + } + } else if (modrm.mod && modrm.mod < 3) { + if (modrm.mod == MODRM_MOD_DISP8) { /* offset in disp */ + *c = *cin; + size += 1; + } else if ( mode_16 ) { + *s = (* ((unsigned short *) cin)); + size += 2; + } else { + *i = (*((unsigned int *) cin)); + size += 4; + } + } else if ( modrm.mod == 3 ) { + op->type = op_register; + op->flags &= ~op_pointer; + } + + return (size); +} + + +static int ia32_decode_invariant( unsigned char *buf, size_t buf_len, + ia32_insn_t *t, unsigned char *out, + unsigned int prefixes, x86_invariant_t *inv) { + + unsigned int addr_size, op_size, mode_16; + unsigned int op_flags[3] = { t->dest_flag, t->src_flag, t->aux_flag }; + int x, type, bytes = 0, size = 0, modrm = 0; + + /* set addressing mode */ + if (ia32_settings.options & opt_16_bit) { + op_size = ( prefixes & PREFIX_OP_SIZE ) ? 4 : 2; + addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 4 : 2; + mode_16 = ( prefixes & PREFIX_ADDR_SIZE ) ? 0 : 1; + } else { + op_size = ( prefixes & PREFIX_OP_SIZE ) ? 2 : 4; + addr_size = ( prefixes & PREFIX_ADDR_SIZE ) ? 2 : 4; + mode_16 = ( prefixes & PREFIX_ADDR_SIZE ) ? 1 : 0; + } + + for (x = 0; x < 3; x++) { + inv->operands[x].access = (enum x86_op_access) + OP_PERM(op_flags[x]); + inv->operands[x].flags = (enum x86_op_flags) + (OP_FLAGS(op_flags[x]) >> 12); + + switch (op_flags[x] & OPTYPE_MASK) { + case OPTYPE_c: + size = (op_size == 4) ? 2 : 1; + break; + case OPTYPE_a: case OPTYPE_v: + size = (op_size == 4) ? 4 : 2; + break; + case OPTYPE_p: + size = (op_size == 4) ? 6 : 4; + break; + case OPTYPE_b: + size = 1; + break; + case OPTYPE_w: + size = 2; + break; + case OPTYPE_d: case OPTYPE_fs: case OPTYPE_fd: + case OPTYPE_fe: case OPTYPE_fb: case OPTYPE_fv: + case OPTYPE_si: case OPTYPE_fx: + size = 4; + break; + case OPTYPE_s: + size = 6; + break; + case OPTYPE_q: case OPTYPE_pi: + size = 8; + break; + case OPTYPE_dq: case OPTYPE_ps: case OPTYPE_ss: + case OPTYPE_pd: case OPTYPE_sd: + size = 16; + break; + case OPTYPE_m: + size = (addr_size == 4) ? 4 : 2; + break; + default: + break; + } + + type = op_flags[x] & ADDRMETH_MASK; + switch (type) { + case ADDRMETH_E: case ADDRMETH_M: case ADDRMETH_Q: + case ADDRMETH_R: case ADDRMETH_W: + modrm = 1; + bytes += ia32_invariant_modrm( buf, out, + mode_16, &inv->operands[x]); + break; + case ADDRMETH_C: case ADDRMETH_D: case ADDRMETH_G: + case ADDRMETH_P: case ADDRMETH_S: case ADDRMETH_T: + case ADDRMETH_V: + inv->operands[x].type = op_register; + modrm = 1; + break; + case ADDRMETH_A: case ADDRMETH_O: + /* pad with xF4's */ + memset( &out[bytes + modrm], X86_WILDCARD_BYTE, + size ); + bytes += size; + inv->operands[x].type = op_offset; + if ( type == ADDRMETH_O ) { + inv->operands[x].flags |= op_signed | + op_pointer; + } + break; + case ADDRMETH_I: case ADDRMETH_J: + /* grab imm value */ + if ((op_flags[x] & OPTYPE_MASK) == OPTYPE_v) { + /* assume this is an address */ + memset( &out[bytes + modrm], + X86_WILDCARD_BYTE, size ); + } else { + memcpy( &out[bytes + modrm], + &buf[bytes + modrm], size ); + } + + bytes += size; + if ( type == ADDRMETH_J ) { + if ( size == 1 ) { + inv->operands[x].type = + op_relative_near; + } else { + inv->operands[x].type = + op_relative_far; + } + inv->operands[x].flags |= op_signed; + } else { + inv->operands[x].type = op_immediate; + } + break; + case ADDRMETH_F: + inv->operands[x].type = op_register; + break; + case ADDRMETH_X: + inv->operands[x].flags |= op_signed | + op_pointer | op_ds_seg | op_string; + break; + case ADDRMETH_Y: + inv->operands[x].flags |= op_signed | + op_pointer | op_es_seg | op_string; + break; + case ADDRMETH_RR: + inv->operands[x].type = op_register; + break; + case ADDRMETH_II: + inv->operands[x].type = op_immediate; + break; + default: + inv->operands[x].type = op_unused; + break; + } + } + + return (bytes + modrm); +} + +size_t ia32_disasm_invariant( unsigned char * buf, size_t buf_len, + x86_invariant_t *inv ) { + ia32_insn_t *raw_insn = NULL; + unsigned int prefixes; + unsigned int type; + size_t size; + + /* Perform recursive table lookup starting with main table (0) */ + size = ia32_table_lookup( buf, buf_len, 0, &raw_insn, &prefixes ); + if ( size == INVALID_INSN || size > buf_len ) { + /* TODO: set errno */ + return 0; + } + + /* copy opcode bytes to buffer */ + memcpy( inv->bytes, buf, size ); + + /* set mnemonic type and group */ + type = raw_insn->mnem_flag & ~INS_FLAG_MASK; + inv->group = (enum x86_insn_group) (INS_GROUP(type)) >> 12; + inv->type = (enum x86_insn_type) INS_TYPE(type); + + /* handle operands */ + size += ia32_decode_invariant( buf + size, buf_len - size, raw_insn, + &buf[size - 1], prefixes, inv ); + + inv->size = size; + + return size; /* return size of instruction in bytes */ +} + +size_t ia32_disasm_size( unsigned char *buf, size_t buf_len ) { + x86_invariant_t inv = { {0} }; + return( ia32_disasm_invariant( buf, buf_len, &inv ) ); +} diff --git a/spotify/breakpad/third_party/libdisasm/ia32_invariant.h b/spotify/breakpad/third_party/libdisasm/ia32_invariant.h new file mode 100644 index 000000000..e1cea60e9 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_invariant.h @@ -0,0 +1,11 @@ +#ifndef IA32_INVARIANT_H +#define IA32_INVARIANT_H + +#include "libdis.h" + +size_t ia32_disasm_invariant( unsigned char *buf, size_t buf_len, + x86_invariant_t *inv); + +size_t ia32_disasm_size( unsigned char *buf, size_t buf_len ); + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/ia32_modrm.c b/spotify/breakpad/third_party/libdisasm/ia32_modrm.c new file mode 100644 index 000000000..b0fe2ed3d --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_modrm.c @@ -0,0 +1,310 @@ +#include "ia32_modrm.h" +#include "ia32_reg.h" +#include "x86_imm.h" + +/* NOTE: when decoding ModR/M and SIB, we have to add 1 to all register + * values obtained from decoding the ModR/M or SIB byte, since they + * are encoded with eAX = 0 and the tables in ia32_reg.c use eAX = 1. + * ADDENDUM: this is only the case when the register value is used + * directly as an index into the register table, not when it is added to + * a genregs offset. */ + +/* -------------------------------- ModR/M, SIB */ +/* ModR/M flags */ +#define MODRM_RM_SIB 0x04 /* R/M == 100 */ +#define MODRM_RM_NOREG 0x05 /* R/B == 101 */ + +/* if (MODRM.MOD_NODISP && MODRM.RM_NOREG) then just disp32 */ +#define MODRM_MOD_NODISP 0x00 /* mod == 00 */ +#define MODRM_MOD_DISP8 0x01 /* mod == 01 */ +#define MODRM_MOD_DISP32 0x02 /* mod == 10 */ +#define MODRM_MOD_NOEA 0x03 /* mod == 11 */ + +/* 16-bit modrm flags */ +#define MOD16_MOD_NODISP 0 +#define MOD16_MOD_DISP8 1 +#define MOD16_MOD_DISP16 2 +#define MOD16_MOD_REG 3 + +#define MOD16_RM_BXSI 0 +#define MOD16_RM_BXDI 1 +#define MOD16_RM_BPSI 2 +#define MOD16_RM_BPDI 3 +#define MOD16_RM_SI 4 +#define MOD16_RM_DI 5 +#define MOD16_RM_BP 6 +#define MOD16_RM_BX 7 + +/* SIB flags */ +#define SIB_INDEX_NONE 0x04 +#define SIB_BASE_EBP 0x05 +#define SIB_SCALE_NOBASE 0x00 + +/* Convenience struct for modR/M bitfield */ +struct modRM_byte { + unsigned int mod : 2; + unsigned int reg : 3; + unsigned int rm : 3; +}; + +/* Convenience struct for SIB bitfield */ +struct SIB_byte { + unsigned int scale : 2; + unsigned int index : 3; + unsigned int base : 3; +}; + + +#if 0 +int modrm_rm[] = {0,1,2,3,MODRM_RM_SIB,MODRM_MOD_DISP32,6,7}; +int modrm_reg[] = {0, 1, 2, 3, 4, 5, 6, 7}; +int modrm_mod[] = {0, MODRM_MOD_DISP8, MODRM_MOD_DISP32, MODRM_MOD_NOEA}; +int sib_scl[] = {0, 2, 4, 8}; +int sib_idx[] = {0, 1, 2, 3, SIB_INDEX_NONE, 5, 6, 7 }; +int sib_bas[] = {0, 1, 2, 3, 4, SIB_SCALE_NOBASE, 6, 7 }; +#endif + +/* this is needed to replace x86_imm_signsized() which does not sign-extend + * to dest */ +static unsigned int imm32_signsized( unsigned char *buf, size_t buf_len, + int32_t *dest, unsigned int size ) { + if ( size > buf_len ) { + return 0; + } + + switch (size) { + case 1: + *dest = *((signed char *) buf); + break; + case 2: + *dest = *((signed short *) buf); + break; + case 4: + default: + *dest = *((signed int *) buf); + break; + } + + return size; +} + + + +static void byte_decode(unsigned char b, struct modRM_byte *modrm) { + /* generic bitfield-packing routine */ + + modrm->mod = b >> 6; /* top 2 bits */ + modrm->reg = (b & 56) >> 3; /* middle 3 bits */ + modrm->rm = b & 7; /* bottom 3 bits */ +} + + +static size_t sib_decode( unsigned char *buf, size_t buf_len, x86_ea_t *ea, + unsigned int mod ) { + /* set Address Expression fields (scale, index, base, disp) + * according to the contents of the SIB byte. + * b points to the SIB byte in the instruction-stream buffer; the + * byte after b[0] is therefore the byte after the SIB + * returns number of bytes 'used', including the SIB byte */ + size_t size = 1; /* start at 1 for SIB byte */ + struct SIB_byte sib; + + if ( buf_len < 1 ) { + return 0; + } + + byte_decode( *buf, (struct modRM_byte *)(void*)&sib ); /* get bit-fields */ + + if ( sib.base == SIB_BASE_EBP && ! mod ) { /* if base == 101 (ebp) */ + /* IF BASE == EBP, deal with exception */ + /* IF (ModR/M did not create a Disp */ + /* ... create a 32-bit Displacement */ + imm32_signsized( &buf[1], buf_len, &ea->disp, sizeof(int32_t)); + ea->disp_size = sizeof(int32_t); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 4; /* add sizeof disp to count */ + + } else { + /* ELSE BASE refers to a General Register */ + ia32_handle_register( &ea->base, sib.base + 1 ); + } + + /* set scale to 1, 2, 4, 8 */ + ea->scale = 1 << sib.scale; + + if (sib.index != SIB_INDEX_NONE) { + /* IF INDEX is not 'ESP' (100) */ + ia32_handle_register( &ea->index, sib.index + 1 ); + } + + return (size); /* return number of bytes processed */ +} + +static size_t modrm_decode16( unsigned char *buf, unsigned int buf_len, + x86_op_t *op, struct modRM_byte *modrm ) { + /* 16-bit mode: hackish, but not as hackish as 32-bit mode ;) */ + size_t size = 1; /* # of bytes decoded [1 for modR/M byte] */ + x86_ea_t * ea = &op->data.expression; + + switch( modrm->rm ) { + case MOD16_RM_BXSI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 3); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 6); + break; + case MOD16_RM_BXDI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 3); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 7); + case MOD16_RM_BPSI: + op->flags |= op_ss_seg; + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 5); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 6); + break; + case MOD16_RM_BPDI: + op->flags |= op_ss_seg; + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 5); + ia32_handle_register(&ea->index, REG_WORD_OFFSET + 7); + break; + case MOD16_RM_SI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 6); + break; + case MOD16_RM_DI: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 7); + break; + case MOD16_RM_BP: + if ( modrm->mod != MOD16_MOD_NODISP ) { + op->flags |= op_ss_seg; + ia32_handle_register(&ea->base, + REG_WORD_OFFSET + 5); + } + break; + case MOD16_RM_BX: + ia32_handle_register(&ea->base, REG_WORD_OFFSET + 3); + break; + } + + /* move to byte after ModR/M */ + ++buf; + --buf_len; + + if ( modrm->mod == MOD16_MOD_DISP8 ) { + imm32_signsized( buf, buf_len, &ea->disp, sizeof(char) ); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + ea->disp_size = sizeof(char); + size += sizeof(char); + } else if ( modrm->mod == MOD16_MOD_DISP16 ) { + imm32_signsized( buf, buf_len, &ea->disp, sizeof(short) ); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + ea->disp_size = sizeof(short); + size += sizeof(short); + } + + return size; +} + +/* TODO : Mark index modes + Use addressing mode flags to imply arrays (index), structure (disp), + two-dimensional arrays [disp + index], classes [ea reg], and so on. +*/ +size_t ia32_modrm_decode( unsigned char *buf, unsigned int buf_len, + x86_op_t *op, x86_insn_t *insn, size_t gen_regs ) { + /* create address expression and/or fill operand based on value of + * ModR/M byte. Calls sib_decode as appropriate. + * flags specifies whether Reg or mod+R/M fields are being decoded + * returns the number of bytes in the instruction, including modR/M */ + struct modRM_byte modrm; + size_t size = 1; /* # of bytes decoded [1 for modR/M byte] */ + x86_ea_t * ea; + + + byte_decode(*buf, &modrm); /* get bitfields */ + + /* first, handle the case where the mod field is a register only */ + if ( modrm.mod == MODRM_MOD_NOEA ) { + op->type = op_register; + ia32_handle_register(&op->data.reg, modrm.rm + gen_regs); + /* increase insn size by 1 for modrm byte */ + return 1; + } + + /* then deal with cases where there is an effective address */ + ea = &op->data.expression; + op->type = op_expression; + op->flags |= op_pointer; + + if ( insn->addr_size == 2 ) { + /* gah! 16 bit mode! */ + return modrm_decode16( buf, buf_len, op, &modrm); + } + + /* move to byte after ModR/M */ + ++buf; + --buf_len; + + if (modrm.mod == MODRM_MOD_NODISP) { /* if mod == 00 */ + + /* IF MOD == No displacement, just Indirect Register */ + if (modrm.rm == MODRM_RM_NOREG) { /* if r/m == 101 */ + /* IF RM == No Register, just Displacement */ + /* This is an Intel Moronic Exception TM */ + imm32_signsized( buf, buf_len, &ea->disp, + sizeof(int32_t) ); + ea->disp_size = sizeof(int32_t); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 4; /* add sizeof disp to count */ + + } else if (modrm.rm == MODRM_RM_SIB) { /* if r/m == 100 */ + /* ELSE IF an SIB byte is present */ + /* TODO: check for 0 retval */ + size += sib_decode( buf, buf_len, ea, modrm.mod); + /* move to byte after SIB for displacement */ + ++buf; + --buf_len; + } else { /* modR/M specifies base register */ + /* ELSE RM encodes a general register */ + ia32_handle_register( &ea->base, modrm.rm + 1 ); + } + } else { /* mod is 01 or 10 */ + if (modrm.rm == MODRM_RM_SIB) { /* rm == 100 */ + /* IF base is an AddrExpr specified by an SIB byte */ + /* TODO: check for 0 retval */ + size += sib_decode( buf, buf_len, ea, modrm.mod); + /* move to byte after SIB for displacement */ + ++buf; + --buf_len; + } else { + /* ELSE base is a general register */ + ia32_handle_register( &ea->base, modrm.rm + 1 ); + } + + /* ELSE mod + r/m specify a disp##[base] or disp##(SIB) */ + if (modrm.mod == MODRM_MOD_DISP8) { /* mod == 01 */ + /* If this is an 8-bit displacement */ + imm32_signsized( buf, buf_len, &ea->disp, + sizeof(char)); + ea->disp_size = sizeof(char); + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 1; /* add sizeof disp to count */ + + } else { + /* Displacement is dependent on address size */ + imm32_signsized( buf, buf_len, &ea->disp, + insn->addr_size); + ea->disp_size = insn->addr_size; + ea->disp_sign = (ea->disp < 0) ? 1 : 0; + size += 4; + } + } + + return size; /* number of bytes found in instruction */ +} + +void ia32_reg_decode( unsigned char byte, x86_op_t *op, size_t gen_regs ) { + struct modRM_byte modrm; + byte_decode( byte, &modrm ); /* get bitfields */ + + /* set operand to register ID */ + op->type = op_register; + ia32_handle_register(&op->data.reg, modrm.reg + gen_regs); + + return; +} diff --git a/spotify/breakpad/third_party/libdisasm/ia32_modrm.h b/spotify/breakpad/third_party/libdisasm/ia32_modrm.h new file mode 100644 index 000000000..765cb0833 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_modrm.h @@ -0,0 +1,13 @@ +#ifndef IA32_MODRM_H +#define IA32_MODRM_H + +#include "libdis.h" +#include "ia32_insn.h" + +size_t ia32_modrm_decode( unsigned char *buf, unsigned int buf_len, + x86_op_t *op, x86_insn_t *insn, + size_t gen_regs ); + +void ia32_reg_decode( unsigned char byte, x86_op_t *op, size_t gen_regs ); + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c b/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c new file mode 100644 index 000000000..ef97c7a35 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c @@ -0,0 +1,2939 @@ +#include "ia32_insn.h" + +#include "ia32_reg.h" + +#include "ia32_opcode_tables.h" + +static ia32_insn_t tbl_Main[] = { /* One-byte Opcodes */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 0, 0, 0, 0 , 33 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 1, 0, 0, 0 , 33 }, + { idx_0F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, +/* 0x10 */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_ADD, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 2, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 2, 0, 0, 0 , 33 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_SIGNED | OP_R, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 3, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 3, 0, 0, 0 , 33 }, +/* 0x20 */ + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_AND, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_ES, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "daa", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_CARRY|INS_SET_PARITY|INS_TEST_CARRY, 12 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_CS | PREFIX_NOTTAKEN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "das", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_CARRY|INS_SET_PARITY|INS_TEST_CARRY, 0 }, +/* 0x30 */ + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_SS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aaa", "", 0, 0, 0, INS_SET_CARRY, 1 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_G | OPTYPE_b | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_DS | PREFIX_TAKEN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aas", "", 0, 0, 0, INS_SET_CARRY, 0 }, +/* 0x40 */ + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 1, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 2, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 3, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 4, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 5, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 6, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_INC, 0, ADDRMETH_RR | OPTYPE_v | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 7, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 1, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 2, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 3, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 4, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 5, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 6, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 7, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, +/* 0x50 */ + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 1, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 2, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 3, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 4, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 5, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 6, 0, 0, 0 , 33 }, + { 0, INS_PUSH, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 7, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 0, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 1, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 2, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 3, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 4, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 5, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 6, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 7, 0, 0, 0 , 33 }, +/* 0x60 */ + { 0, INS_PUSHREGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pusha", "", 0, 0, 0, 0 , 36 }, + { 0, INS_POPREGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "popa", "", 0, 0, 0, 0 , 34 }, + { 0, INS_BOUNDS, INS_NOTE_NONSWAP, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_M | OPTYPE_a | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bound", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R | OP_W, ADDRMETH_G | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "arpl", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_FS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_GS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_66, INS_FLAG_PREFIX | PREFIX_OP_SIZE, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FLAG_PREFIX | PREFIX_ADDR_SIZE, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSH, 0, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_MUL, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 }, + { 0, INS_MUL, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 0 }, + { 0, INS_IN, 0, ADDRMETH_Y | OPTYPE_b | OP_W, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ins", "", 0, 2, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_Y | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ins", "", 0, 2, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_X | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "outs", "", 2, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_X | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "outs", "", 2, 0, 0, 0 , 0 }, +/* 0x70 */ + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jo", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jno", "", 0, 0, 0, INS_TEST_NOFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ja", "", 0, 0, 0, INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "js", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpe", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpo", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, +/* 0x80 */ + { idx_80, 0, 0, ADDRMETH_E | OPTYPE_b, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_81, 0, 0, ADDRMETH_E | OPTYPE_v, ADDRMETH_I | OPTYPE_v, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_82, 0, 0, ADDRMETH_E | OPTYPE_b, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_83, 0, 0, ADDRMETH_E | OPTYPE_v, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XCHG, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_b | OP_W, ADDRMETH_G | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_v | OP_W, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_b | OP_W, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_w | OP_W, ADDRMETH_S | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_m | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lea", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_S | OPTYPE_w | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_POP, 0, ADDRMETH_E | OPTYPE_v | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 0, 0, 0, 0 , 33 }, +/* 0x90 */ + { 0, INS_NOP, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "nop", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 1, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 2, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 3, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 4, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 5, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 6, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xchg", "", 0, 7, 0, 0 , 0 }, + { 0, INS_SZCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cwde", "", 0, 0, 0, 0 , 5 }, + { 0, INS_SZCONV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cdq", "", 0, 0, 0, 0 , 11 }, + { 0, INS_CALL, 0, ADDRMETH_A | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "callf", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "wait", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSHFLAGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pushf", "", 0, 0, 0, 0 , 37 }, + { 0, INS_POPFLAGS, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "popf", "", 0, 0, 0, 0 , 35 }, + { 0, INS_MOV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sahf", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 43 }, + { 0, INS_MOV, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lahf", "", 0, 0, 0, 0 , 24 }, +/* 0xa0 */ + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_O | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_O | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_O | OPTYPE_b | OP_W, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_O | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRMOV, 0, ADDRMETH_Y | OPTYPE_b | OP_W, ADDRMETH_X | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRMOV, 0, ADDRMETH_Y | OPTYPE_v | OP_W, ADDRMETH_X | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_Y | OPTYPE_b | OP_R, ADDRMETH_X | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_X | OPTYPE_v | OP_R, ADDRMETH_Y | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TEST, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_STRSTOR, 0, ADDRMETH_Y | OPTYPE_b | OP_W, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "stos", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRSTOR, 0, ADDRMETH_Y | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_v |OP_R, ARG_NONE, cpu_80386 | isa_GP, "stos", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRLOAD, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_X| OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lods", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRLOAD, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_X| OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lods", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_RR | OPTYPE_b | OP_R, ADDRMETH_Y | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "scas", "", 0, 0, 0, 0 , 0 }, + { 0, INS_STRCMP, 0, ADDRMETH_RR | OPTYPE_v | OP_R, ADDRMETH_Y | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "scas", "", 0, 0, 0, 0 , 0 }, +/* 0xb0 */ + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 1, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 2, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 3, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 4, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 5, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 6, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 7, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 1, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 2, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 3, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 4, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 5, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 6, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 7, 0, 0, 0 , 0 }, +/* 0xc0 */ + { idx_C0, 0, 0, ADDRMETH_E | OPTYPE_b, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_C1, 0, 0, ADDRMETH_E | OPTYPE_v, ADDRMETH_I | OPTYPE_b, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_RET, 0, ADDRMETH_I | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ret", "", 0, 0, 0, 0 , 3 }, + { 0, INS_RET, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ret", "", 0, 0, 0, 0 , 3 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_R, ARG_NONE, cpu_80386 | isa_GP, "les", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lds", "", 0, 0, 0, 0 , 0 }, + { idx_C6, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_C7, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ENTER, INS_NOTE_NONSWAP, ADDRMETH_I | OPTYPE_w | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "enter", "", 0, 0, 0, 0 , 15 }, + { 0, INS_LEAVE, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "leave", "", 0, 0, 0, 0 , 26 }, + { 0, INS_RET, 0, ADDRMETH_I | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "retf", "lret", 0, 0, 0, 0 , 3 }, + { 0, INS_RET, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "retf", "lret", 0, 0, 0, 0 , 3 }, + { 0, INS_DEBUG, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "int3", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TRAP, 0, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "int", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OFLOW, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "into", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_TRET, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "iret", "", 0, 0, 0, INS_SET_ALL|INS_SET_DIR, 0 }, +/* 0xd0 */ + { idx_D0, 0, 0, ADDRMETH_E | OPTYPE_b, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { idx_D1, 0, 0, ADDRMETH_E | OPTYPE_v, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { idx_D2, 0, 0, ADDRMETH_E | OPTYPE_b, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { idx_D3, 0, 0, ADDRMETH_E | OPTYPE_v, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 1, 0, 0 , 0 }, + { 0, INS_BCDCONV, 0, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aam", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_BCDCONV, 0, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "aad", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 2 }, + { 0, INS_SALC, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "salc", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XLAT, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "xlat", "", 0, 0, 0, 0 , 53 }, + { idx_D8, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_D9, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DA, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DB, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DC, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DD, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DE, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_DF, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, +/* 0xe0 */ + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "loopnz", "", 0, 0, 0, INS_TEST_NZERO, 31 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "loopz", "", 0, 0, 0, INS_TEST_ZERO, 31 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "loop", "", 0, 0, 0, 0 , 31 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_b | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jcxz", "", 0, 0, 0, 0 , 31 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 0, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_I | OPTYPE_b | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_I | OPTYPE_b | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CALL, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "call", "", 0, 0, 0, 0 , 3 }, + { 0, INS_BRANCH, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_A | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_J | OPTYPE_b | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_b| OP_W, ADDRMETH_RR | OPTYPE_w| OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 2, 0, 0 , 0 }, + { 0, INS_IN, 0, ADDRMETH_RR | OPTYPE_v | OP_W, ADDRMETH_RR | OPTYPE_w| OP_R, ARG_NONE, cpu_80386 | isa_GP, "in", "", 0, 2, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_w| OP_R, ADDRMETH_RR | OPTYPE_b| OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 2, 0, 0, 0 , 0 }, + { 0, INS_OUT, 0, ADDRMETH_RR | OPTYPE_w| OP_R, ADDRMETH_RR | OPTYPE_v| OP_R, ARG_NONE, cpu_80386 | isa_GP, "out", "", 2, 0, 0, 0 , 0 }, +/* 0xf0 */ + { 0, INS_FLAG_PREFIX | PREFIX_LOCK, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ICEBP, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "icebp", "", 0, 0, 0, 0 , 0 }, + { idx_F2, INS_FLAG_PREFIX | PREFIX_REPNZ, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_F3, INS_FLAG_PREFIX | PREFIX_REPZ, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_HALT, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "hlt", "", 0, 0, 0, 0 , 0 }, + { 0, INS_TOGCF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cmc", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { idx_F6, 0, 0, ADDRMETH_E | OPTYPE_b, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_F7, 0, 0, ADDRMETH_E | OPTYPE_v, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CLEARCF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "clc", "", 0, 0, 0, INS_SET_NCARRY, 0 }, + { 0, INS_SETCF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "stc", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cli", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sti", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CLEARDF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "cld", "", 0, 0, 0, INS_SET_NDIR, 0 }, + { 0, INS_SETDF, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "std", "", 0, 0, 0, INS_SET_DIR, 0 }, + { idx_FE, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_FF, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_66[] = { /* SIMD 66 one-byte Opcodes */ + { idx_660F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_F2[] = { /* SIMD F2 one-byte Opcodes */ + { idx_F20F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_F3[] = { /* SIMD F3 one-byte Opcodes */ + { idx_F30F, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pause", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F[] = { /* Two-byte Opcodes */ + { idx_0F00, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F01, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lar", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "lsl", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "clts", "", 0, 0, 0, 0 , 6 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "wbinvd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_UNKNOWN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTPRO | isa_GP, "ud2", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "prefetch", "", 0, 0, 0, 0, 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "femms", "", 0, 0, 0, 0, 0 }, + { idx_0F0F, INS_FLAG_SUFFIX, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movups", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_ps | OP_W, ADDRMETH_V | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movups", "", 0, 0, 0, 0 , 0 }, + { idx_0F12, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "unpcklps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "unpckhps", "", 0, 0, 0, 0 , 0 }, + { idx_0F16, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_q | OP_W, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { idx_0F18, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_R | OPTYPE_d | OP_W, ADDRMETH_C | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_R | OPTYPE_d | OP_W, ADDRMETH_D | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_C | OPTYPE_d | OP_W, ADDRMETH_R | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_D | OPTYPE_d | OP_W, ADDRMETH_R | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_R | OPTYPE_d | OP_W, ADDRMETH_T | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_T | OPTYPE_d | OP_W, ADDRMETH_R | OPTYPE_d | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movaps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_ps | OP_W, ADDRMETH_V | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movaps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "cvtpi2ps", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_ps | OP_W, ADDRMETH_V | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movntps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "cvttps2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W , ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "cvtps2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ss | OP_W, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "ucomiss", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ss | OP_W, ARG_NONE, cpu_PENTIUM2 | isa_GP, "comiss", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "wrmsr", "", 0, 0, 0, 0 , 52 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "rdtsc", "", 0, 0, 0, 0 , 40 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "rdmsr", "", 0, 0, 0, 0 , 38 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTPRO | isa_GP, "rdpmc", "", 0, 0, 0, 0 , 39 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "sysenter", "", 0, 0, 0, 0 , 50 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "sysexit", "", 0, 0, 0, 0 , 51 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovo", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovno", "", 0, 0, 0, INS_TEST_NOFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmova", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_NCARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovs", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovp", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovnp", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "cmovg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_d | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movmskps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "sqrtps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "rsqrtps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "rcpps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "andps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "andnps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OR, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "orps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XOR, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "xorps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "addps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "mulps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_pd, ADDRMETH_W | OPTYPE_q, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtps2pd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtdq2ps", "", 0, 0, 0, 0, 0 }, + { 0, INS_SUB, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "subps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "minps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_DIV, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "divps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "maxps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpcklbw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpcklwd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckldq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "packsswb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpgtb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpgtw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpgtd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "packuswb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckhbw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckhwd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "punpckhdq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "packssdw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_d | OP_W, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "pshufw", "", 0, 0, 0, 0, 0 }, + { idx_0F71, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F72, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F73, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpeqb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpeqw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pcmpeqd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "emms", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_d | OP_W, ADDRMETH_P | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_Q | OPTYPE_q | OP_W, ADDRMETH_P | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "movq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jo", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jno", "", 0, 0, 0, INS_TEST_NOFLOW, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ja", "", 0, 0, 0, INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "js", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpe", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jpo", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_BRANCHCC, 0, ADDRMETH_J | OPTYPE_v | OP_X | OP_SIGNED, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "seto", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setno", "", 0, 0, 0, INS_TEST_OFLOW, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setc", "", 0, 0, 0, INS_TEST_CARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setnc", "", 0, 0, 0, INS_TEST_NCARRY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setz", "", 0, 0, 0, INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setnz", "", 0, 0, 0, INS_TEST_NZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setbe", "", 0, 0, 0, INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "seta", "", 0, 0, 0, INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sets", "", 0, 0, 0, INS_TEST_SIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setns", "", 0, 0, 0, INS_TEST_NSIGN, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setpe", "", 0, 0, 0, INS_TEST_PARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setpo", "", 0, 0, 0, INS_TEST_NPARITY, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setl", "", 0, 0, 0, INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setge", "", 0, 0, 0, INS_TEST_SFEQOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setle", "", 0, 0, 0, INS_TEST_ZERO|INS_TEST_OR|INS_TEST_SFNEOF, 0 }, + { 0, INS_MOVCC, 0, ADDRMETH_E | OPTYPE_b | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "setg", "", 0, 0, 0, INS_TEST_NZERO|INS_TEST_SFEQOF, 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 4, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 4, 0, 0, 0 , 33 }, + { 0, INS_CPUID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cpuid", "", 0, 0, 0, 0 , 10 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bt", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_80386 | isa_GP, "shld", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + //{ 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_I | OP_R | OPTYPE_b | ADDRMETH_RR, cpu_80386 | isa_GP, "shld", "", 0, 0, 1, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_RR | OP_R | OPTYPE_b, cpu_80386 | isa_GP, "shld", "", 0, 0, 1, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSH, 0, ADDRMETH_RS | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 5, 0, 0, 0 , 33 }, + { 0, INS_POP, 0, ADDRMETH_RS | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "pop", "", 5, 0, 0, 0 , 33 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "rsm", "", 0, 0, 0, INS_SET_ALL|INS_SET_DIR, 42 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bts", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_80386 | isa_GP, "shrd", "", 0, 0, 0, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ADDRMETH_RR | OP_R | OPTYPE_b , cpu_80386 | isa_GP, "shrd", "", 0, 0, 1, INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { idx_0FAE, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_G | OPTYPE_v | OP_SIGNED | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, }, + { 0, INS_XCHGCC, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_W, ARG_NONE, cpu_80486 | isa_GP, "cmpxchg", "", 0, 0, 0, INS_SET_ALL, 8 }, + { 0, INS_XCHGCC, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_W, ARG_NONE, cpu_80486 | isa_GP, "cmpxchg", "", 0, 0, 0, INS_SET_ALL, 7 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W, ARG_NONE, cpu_80386 | isa_GP, "lss", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btr", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W, ARG_NONE, cpu_80386 | isa_GP, "lfs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_M | OPTYPE_p | OP_W, ARG_NONE, cpu_80386 | isa_GP, "lgs", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movzx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movzx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_UNKNOWN, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ud1", "", 0, 0, 0, 0 , 0 }, + { idx_0FBA, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_G | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btc", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_G | OPTYPE_v | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bsf", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_G | OPTYPE_v | OP_R | OP_W, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bsr", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movsx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_G | OPTYPE_v | OP_W, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, cpu_80386 | isa_GP, "movsx", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_G | OPTYPE_b | OP_W, ARG_NONE, cpu_80486 | isa_GP, "xadd", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_G | OPTYPE_v | OP_W, ARG_NONE, cpu_80486 | isa_GP, "xadd", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmpps", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_M | OPTYPE_d | OP_W, ADDRMETH_G | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movnti", "", 0, 0, 0, 0, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "pinsrw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_G | OPTYPE_d | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "pextrw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_ps | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM2 | isa_GP, "shufps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_R | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxchg8b", "", 0, 0, 0, 0, 9 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 1, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 2, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 3, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 4, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 5, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 6, 0, 0, 0 , 0 }, + { 0, INS_XCHG, 0, ADDRMETH_RR | OPTYPE_d | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "bswap", "", 7, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddq", "", 0, 0, 0, 0, 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pmullw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_G | OPTYPE_d | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmovmskb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubusb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubusw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pminub", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pand", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddusb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddusw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmaxub", "", 0, 0, 0, 0 , 0 }, + { 0, INS_AND, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pandn", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pavgb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psraw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrad", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pavgw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmulhuw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pmulhw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_W | OPTYPE_q | OP_W, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movntq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubsb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pminsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OR, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "por", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddsb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "pmaxsw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XOR, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pxor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmuludq", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pmaddwd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "psadbw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_P | OPTYPE_pi | OP_W, ADDRMETH_Q | OPTYPE_pi | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "maskmovq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psubd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_q | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubq", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddb", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "paddd", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F[] = { /* SIMD 66 Two-byte Opcodes */ + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movupd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movupd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movlpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_M | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movlpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "unpcklpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "unpckhpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movhpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_M | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movhpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movapd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MOV, 0, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movapd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpi2pd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_M | OPTYPE_pd | OP_R, ADDRMETH_V | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movntpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttpd2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpd2pi", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "ucomisd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "comisd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movmskpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_FSQRT, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "sqrtpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "andpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_AND, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "andnpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_OR, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "orpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_XOR, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "xorpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_MUL, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mulpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpd2ps", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtps2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "subpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "minpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "divpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maxpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpcklbw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpcklwd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckldq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "packsswb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpgtb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpgtw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpgtd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "packuswb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhbw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhwd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "packssdw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpcklqdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "punpckhqdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_d | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqa", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pshufd", "", 0, 0, 0, 0, 0 }, + { idx_660F71, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { idx_660F72, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { idx_660F73, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpeqb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpeqw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pcmpeqd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "haddpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "hsubpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_V | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqa", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmppd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_w | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pinsrw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_w | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pextrw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "shufpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addsubpd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrlw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrld", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrlq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmullw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_q | OP_R, ADDRMETH_V | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmovmskb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubusb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubusw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pminub", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pand", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddusb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddusw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmaxub", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pandn", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pavgb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psraw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psrad", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pavgw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmulhuw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmulhw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttpd2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_M | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movntdq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubsb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pminsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "por", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddsb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmaxsw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pxor", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psllw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pslld", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psllq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmuludq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "pmaddwd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psadbw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maskmovdqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "psubq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddb", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddw", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "paddd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_F20F[] = { /* SIMD F2 Two-byte Opcodes */ + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_sd | OP_R, ADDRMETH_V | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movddup", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsi2sd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttsd2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsd2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "sqrtsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mulsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsd2ss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "subsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "minsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "divsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maxsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pshuflw", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "haddps", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "hsubps", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_sd | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmpsd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addsubps", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_P | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdq2q", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_pd | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtpd2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_M | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "lddqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_F30F[] = { /* SIMD F3 Two-byte Opcodes */ + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_ss | OP_R, ADDRMETH_V | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movsldup", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ps | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movshdup", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtsi2ss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttss2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_G | OPTYPE_d | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtss2si", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "sqrtss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "rsqrtss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "rcpss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "addss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mulss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_sd | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtss2sd", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_ps | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvttps2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "subss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "minss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "divss", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "maxss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "pshufhw", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_q | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movq", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_W | OPTYPE_dq | OP_R, ADDRMETH_V | OPTYPE_dq | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movdqu", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_ss | OP_R, ADDRMETH_W | OPTYPE_ss | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, cpu_PENTIUM4 | isa_GP, "cmpss", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_dq | OP_R, ADDRMETH_Q | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "movq2dq", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_UNKNOWN, 0, ADDRMETH_V | OPTYPE_pd | OP_R, ADDRMETH_W | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM4 | isa_GP, "cvtdq2pd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F00[] = { /* Group 6 */ + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sldt", "", 0, 0, 0, 0 , 46 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "str", "", 0, 0, 0, 0 , 49 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lldt", "", 0, 0, 0, 0 , 29 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "ltr", "", 0, 0, 0, 0 , 32 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "verr", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "verw", "", 0, 0, 0, INS_SET_ZERO, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F01[] = { /* Group 7 */ + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sgdt", "", 0, 0, 0, 0 , 44 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sidt", "", 0, 0, 0, 0 , 45 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lgdt", "", 0, 0, 0, 0 , 27 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lidt", "", 0, 0, 0, 0 , 28 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_none | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invlpg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sgdt", "", 0, 0, 0, 0 , 44 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sidt", "", 0, 0, 0, 0 , 45 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lgdt", "", 0, 0, 0, 0 , 27 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lidt", "", 0, 0, 0, 0 , 28 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_none | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invlpg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sgdt", "", 0, 0, 0, 0 , 44 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "sidt", "", 0, 0, 0, 0 , 45 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lgdt", "", 0, 0, 0, 0 , 27 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_s | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lidt", "", 0, 0, 0, 0 , 28 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_none | OP_R, ARG_NONE, ARG_NONE, cpu_80486 | isa_GP, "invlpg", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { idx_0F0111, 0, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "smsw", "", 0, 0, 0, 0 , 47 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_w | OP_W, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "lmsw", "", 0, 0, 0, 0 , 30 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F0111[] = { /* Monitor/MWait opcode */ + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "monitor", "", 0, 0, 0, 0, 54 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "mwait", "", 0, 0, 0, 0, 55 } +}; + + +static ia32_insn_t tbl_0F12[] = { /* Movlps Opcode */ + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, INS_NOTE_NOSUFFIX, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movlps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_R | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R , ARG_NONE, cpu_PENTIUM4 | isa_GP, "movhlps", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F16[] = { /* Movhps Opcode */ + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_V | OPTYPE_q | OP_W, ADDRMETH_M | OPTYPE_q | OP_R, ARG_NONE, cpu_PENTIUM2 | isa_GP, "movhps", "", 0, 0, 0, 0 , 0 }, + { 0, INS_MOV, 0, ADDRMETH_V | OPTYPE_ps | OP_R | OP_W, ADDRMETH_W | OPTYPE_ps | OP_R , ARG_NONE, cpu_PENTIUM4 | isa_GP, "movlhps", "", 0, 0, 0, 0, 0 } +}; + + +static ia32_insn_t tbl_0F18[] = { /* Group 16 */ + { 0, INS_SYSTEM, 0, OP_W | OPTYPE_b | ADDRMETH_M, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetchnta", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht0", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht1", "", 1, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht2", "", 2, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, OP_W | OPTYPE_b | ADDRMETH_M, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetchnta", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht0", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht1", "", 1, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht2", "", 2, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, OP_W | OPTYPE_b | ADDRMETH_M, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetchnta", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht0", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht1", "", 1, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_RT | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2 | isa_GP, "prefetcht2", "", 2, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F71[] = { /* Group 12 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psraw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F71[] = { /* Group 12 SSE */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psraw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllw", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F72[] = { /* Group 13 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrad", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F72[] = { /* Group 13 SSE */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrad", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslld", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0F73[] = { /* Group 14 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_P | OPTYPE_q | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_660F73[] = { /* Group 14 SSE */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrlq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psrldq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "psllq", "", 0, 0, 0, 0 , 0 }, + { 0, INS_OTHER, 0, ADDRMETH_W | OPTYPE_dq | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_PENTIUM | isa_MMX, "pslldq", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0FAE[] = { /* Group 15 */ + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxsave", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxrstor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "ldmxcsr", "", 0, 0, 0, 0 , 25 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "stmxcsr", "", 0, 0, 0 , 0, 48 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "clflush", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxsave", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxrstor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "ldmxcsr", "", 0, 0, 0, 0 , 25 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "stmxcsr", "", 0, 0, 0 , 0, 48 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "clflush", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxsave", "", 0, 0, 0, 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_E | OPTYPE_fx | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_MMX, "fxrstor", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "ldmxcsr", "", 0, 0, 0, 0 , 25 }, + { 0, INS_SYSTEM, 0, ADDRMETH_E | OPTYPE_d | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM2, "stmxcsr", "", 0, 0, 0 , 0, 48 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ADDRMETH_M | OPTYPE_b | OP_R, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "clflush", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "lfence", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "mfence", "", 0, 0, 0, 0 , 0 }, + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "sfence", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_0FBA[] = { /* Group 8 */ + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bt", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "bts", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btr", "", 0, 0, 0, INS_SET_CARRY, 0 }, + { 0, INS_BITTEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "btc", "", 0, 0, 0 , INS_SET_CARRY, 0 } +}; + + +static ia32_insn_t tbl_0FC7[] = { /* Group 9 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxch8b", "", 0, 0, 0 , 0 , 9 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxch8b", "", 0, 0, 0 , 0 , 9 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "", "", 0, 0, 0, 0 , 0 }, + { 0, INS_XCHGCC, 0, ADDRMETH_M | OPTYPE_q | OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM | isa_GP, "cmpxch8b", "", 0, 0, 0 , 0 , 9 } +}; + + +static ia32_insn_t tbl_0FB9[] = { /* Group 10 */ + { 0, INS_SYSTEM, 0, ARG_NONE, ARG_NONE, ARG_NONE, 0, "fxsave", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_C6[] = { /* Group 11a */ + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_b | OP_W, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_C7[] = { /* Group 11b */ + { 0, INS_MOV, 0, ADDRMETH_E | OPTYPE_v | OP_W, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mov", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_80[] = { /* Group 1a */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_81[] = { /* Group 1b */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_82[] = { /* Group 1c */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_83[] = { /* Group 1d */ + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "add", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_OR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "or", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_ADD, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "adc", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sbb", "", 0, 0, 0, INS_SET_ALL|INS_TEST_CARRY, 0 }, + { 0, INS_AND, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "and", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SUB, 0, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sub", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_XOR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "xor", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_CMP, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "cmp", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_C0[] = { /* Group 2a */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_C1[] = { /* Group 2b */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 0, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_I | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 0, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D0[] = { /* Group 2c */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_II | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D1[] = { /* Group 2d */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_II | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D2[] = { /* Group 2e */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_D3[] = { /* Group 2f */ + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rol", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "ror", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW, 0 }, + { 0, INS_ROL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcl", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_ROR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "rcr", "", 0, 1, 0, INS_SET_CARRY|INS_SET_OFLOW|INS_TEST_CARRY, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shl", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "shr", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHL, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sal", "", 0, 1, 0, INS_SET_ALL, 0 }, + { 0, INS_SHR, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ADDRMETH_RR | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "sar", "", 0, 1, 0 , INS_SET_ALL, 0 } +}; + + +static ia32_insn_t tbl_F6[] = { /* Group 3a */ + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_b | OP_R, ADDRMETH_I | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_NOT, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "not", "", 0, 0, 0, 0 , 0 }, + { 0, INS_NEG, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "neg", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_MUL, 0, OPTYPE_b | ADDRMETH_RR | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 22 }, + { 0, INS_MUL, 0, OPTYPE_b | ADDRMETH_RR | OP_W | OP_SIGNED | OP_R, ADDRMETH_E | OPTYPE_b | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 22 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "div", "", 0, 0, 0, 0 , 13 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_b | OP_W | OP_R, ADDRMETH_E | OPTYPE_b | OP_R, ARG_NONE, cpu_80386 | isa_GP, "idiv", "", 0, 0, 0 , 0 , 13 } +}; + + +static ia32_insn_t tbl_F7[] = { /* Group 3b */ + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_TEST, 0, ADDRMETH_E | OPTYPE_v | OP_R, ADDRMETH_I | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "test", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_NOT, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "not", "", 0, 0, 0, 0 , 0 }, + { 0, INS_NEG, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "neg", "", 0, 0, 0, INS_SET_ALL, 0 }, + { 0, INS_MUL, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "mul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 23 }, + { 0, INS_MUL, 0, ADDRMETH_RR | OPTYPE_v | OP_SIGNED | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_SIGNED | OP_R, ARG_NONE, cpu_80386 | isa_GP, "imul", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_CARRY, 23 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "div", "", 0, 0, 0, 0 , 14 }, + { 0, INS_DIV, 0, ADDRMETH_RR | OPTYPE_v | OP_W | OP_R, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, cpu_80386 | isa_GP, "idiv", "", 0, 0, 0, 0 , 14 } +}; + + +static ia32_insn_t tbl_FE[] = { /* Group 4 */ + { 0, INS_INC, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_E | OPTYPE_b | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 0, 0, 0 , INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 } +}; + + +static ia32_insn_t tbl_FF[] = { /* Group 5 */ + { 0, INS_INC, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "inc", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_DEC, 0, ADDRMETH_E | OPTYPE_v | OP_W | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "dec", "", 0, 0, 0, INS_SET_OFLOW|INS_SET_SIGN|INS_SET_ZERO|INS_SET_PARITY, 0 }, + { 0, INS_CALL, 0, ADDRMETH_E | OPTYPE_v | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "call", "", 0, 0, 0, 0 , 3 }, + { 0, INS_CALL, 0, ADDRMETH_M | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "call", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_E | OPTYPE_v | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_BRANCH, 0, ADDRMETH_M | OPTYPE_p | OP_X, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "jmp", "", 0, 0, 0, 0 , 0 }, + { 0, INS_PUSH, 0, ADDRMETH_E | OPTYPE_v | OP_R, ARG_NONE, ARG_NONE, cpu_80386 | isa_GP, "push", "", 0, 0, 0, 0 , 33 } +}; + + +static ia32_insn_t tbl_D8[] = { /* FPU D8 */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_D8C0[] = { /* FPU D8 C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 7, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_D9[] = { /* FPU D9 */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fs|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fv|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldenv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldcw", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fv|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstenv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstcw", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_D9C0[] = { /* FPU D9 C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fxch", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnop", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fchs", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fabs", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ftst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fxam", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld1", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldl2t", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldl2e", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldpi", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldlg2", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldln2", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fldz", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "f2xm1", "", 0, 0, 0 , 0 , 16 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fyl2x", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fptan", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fpatan", "", 0, 0, 0 , 0 , 18 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fxtract", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fprem1", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdecstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fincstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fprem", "", 0, 0, 0 , 0 , 19 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fyl2xp1", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsqrt", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsincos", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "frndint", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fscale", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsin", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcos", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DA[] = { /* FPU DA */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fiadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fimul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficom", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficomp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidivr", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DAC0[] = { /* FPU DA C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 0, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 1, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 2, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 3, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 4, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 5, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 6, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovb", "", 0, 7, 0 , INS_TEST_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 0, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 1, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 2, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 3, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 4, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 5, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 6, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmove", "", 0, 7, 0 , INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 0, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 1, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 2, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 3, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 4, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 5, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 6, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovbe", "", 0, 7, 0 , INS_TEST_CARRY|INS_TEST_OR|INS_TEST_ZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 0, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 1, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 2, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 3, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 4, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 5, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 6, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcmovu", "", 0, 7, 0 , INS_TEST_PARITY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fucompp", "", 0, 0, 0 , 0 , 21 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DB[] = { /* FPU DB */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fild", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "fisttp", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fist", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_d|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fistp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fe|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fe|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DBC0[] = { /* FPU DB C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 0, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 1, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 2, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 3, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 4, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 5, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 6, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnb", "", 0, 7, 0 , INS_TEST_NCARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 0, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 1, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 2, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 3, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 4, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 5, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 6, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovne", "", 0, 7, 0 , INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 0, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 1, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 2, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 3, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 4, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 5, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 6, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnbe", "", 0, 7, 0 , INS_TEST_NCARRY|INS_TEST_NZERO, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 0, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 1, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 2, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 3, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 4, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 5, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 6, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcmovnu", "", 0, 7, 0 , INS_TEST_NPARITY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnclex", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fninit", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomi", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0, }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_PENTPRO | isa_GP, "fcomi", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DC[] = { /* FPU DC */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcom", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 17 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcomp", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_DCC0[] = { /* FPU DC C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fadd", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmul", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubr", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsub", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivr", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdiv", "", 7, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DD[] = { /* FPU DD */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_q|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "fisttp", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fd|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_ft|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "frstor", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_ft|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnsave", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstsw", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DDC0[] = { /* FPU DD C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ffree", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fst", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fstp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucom", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DE[] = { /* FPU DE */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fiadd", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fimul", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficom", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "ficomp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisub", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fisubr", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidiv", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fidivr", "", 0, 0, 0, 0 , 0 } +}; + + +static ia32_insn_t tbl_DEC0[] = { /* FPU DE C0 */ + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 0, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 1, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 2, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 3, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 4, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 5, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 6, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "faddp", "", 7, 0, 0 , 0 , 20 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fmulp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fcompp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubrp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fsubp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivrp", "", 7, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 1, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 2, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 3, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 4, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 5, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 6, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fdivp", "", 7, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DF[] = { /* FPU DF */ + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fild", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_PENTIUM4 | isa_GP, "fisttp", "", 0, 0, 0, 0, 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fist", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_w|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fistp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fb|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fbld", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_q|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fild", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_fb|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fbstp", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_M|OPTYPE_q|OP_W, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fistp", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_DFC0[] = { /* FPU DF C0 */ + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RR | OPTYPE_w | OP_R, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "fnstsw", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 1, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 2, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 3, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 4, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 5, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 6, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fucomip", "", 0, 7, 0 , 0 , 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 0, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 1, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 2, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 3, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 4, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 5, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 6, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_FPU, 0, ADDRMETH_RF | OPTYPE_fp | OP_W, ADDRMETH_RF | OPTYPE_fp | OP_R, ARG_NONE, cpu_80387 | isa_FPU, "fcomip", "", 0, 7, 0 , INS_SET_ZERO|INS_SET_PARITY|INS_SET_CARRY, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_80387 | isa_FPU, "", "", 0, 0, 0 , 0 , 0 } +}; + + +static ia32_insn_t tbl_0F0F[] = { /* 3D Now! 0F Suffix */ + /* 00 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CONV, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pi2fd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 10 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CONV, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pf2id", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 20 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 30 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 40 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 50 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 60 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 70 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + /* 80 */ { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfcmpge", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MIN, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfmin", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrcp", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrsqrt", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfsub", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfadd", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfcmpgt", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MAX, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfmax", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrcpit1", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrsqit1", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_SUB, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfsubr", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ADD, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfacc", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_CMP, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfcmpeq", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfmul", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_ARITH, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pfrcpit2", "", 0, 0, 0, 0, 0 }, + { 0, INS_MUL, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pmulhrw", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_INVALID, 0, ARG_NONE, ARG_NONE, ARG_NONE, cpu_K6 | isa_3DNOW, "", "", 0, 0, 0, 0, 0 }, + { 0, INS_AVG, 0, ADDRMETH_P | OPTYPE_pi | OP_R | OP_W, ADDRMETH_Q | OPTYPE_q |OP_R, ARG_NONE, cpu_K6 | isa_3DNOW, "pavgusb", "", 0, 0, 0, 0, 0 } +}; + + + +/* ================== Table of Opcode Tables ================== */ +ia32_table_desc_t ia32_tables[] = { + /* table, prefix table, type, shift, mask, min, max */ + { tbl_Main, tbl_opcode, 0x00, 0xFF, 0x00, 0xFF }, + { tbl_66, tbl_prefix, 0x00, 0xFF, 0x0F, 0x0F }, + { tbl_F2, tbl_prefix, 0x00, 0xFF, 0x0F, 0x0F }, + { tbl_F3, tbl_prefix, 0x00, 0xFF, 0x0F, 0x90 }, + { tbl_0F, tbl_opcode, 0x00, 0xFF, 0x00, 0xFF }, + /* 5 */ + { tbl_660F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF }, + { tbl_F20F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF }, + { tbl_F30F, tbl_prefix, 0x00, 0xFF, 0x10, 0xFF }, + { tbl_0F00, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_0F01, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + /* 10 */ + { tbl_0F0111, tbl_ext_ext, 0x00, 0x01, 0x00, 0x01 }, + { tbl_0F12, tbl_extension, 0x06, 0x03, 0x00, 0x03 }, + { tbl_0F16, tbl_extension, 0x06, 0x03, 0x00, 0x03 }, + { tbl_0F18, tbl_extension, 0x03, 0x1F, 0x00, 0x13 }, + { tbl_0F71, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + /* 15 */ + { tbl_660F71, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_0F72, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_660F72, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_0F73, tbl_extension, 0x00, 0x00, 0x00, 0x00 }, + { tbl_660F73, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + /* 20 */ + { tbl_0FAE, tbl_extension, 0x03, 0x1F, 0x00, 0x1F }, + { tbl_0FBA, tbl_extension, 0x03, 0x07, 0x04, 0x07 }, + { tbl_0FC7, tbl_extension, 0x03, 0x1F, 0x00, 0x11 }, + { tbl_0FB9, tbl_extension, 0x03, 0x07, 0x00, 0x00 }, + { tbl_C6, tbl_extension, 0x03, 0x07, 0x00, 0x00 }, + /* 25 */ + { tbl_C7, tbl_extension, 0x03, 0x07, 0x00, 0x00 }, + { tbl_80, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_81, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_82, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_83, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + /* 30 */ + { tbl_C0, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_C1, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_D0, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_D1, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_D2, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + /* 35 */ + { tbl_D3, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_F6, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_F7, tbl_extension, 0x03, 0x07, 0x00, 0x07 }, + { tbl_FE, tbl_extension, 0x03, 0x07, 0x00, 0x01 }, + { tbl_FF, tbl_extension, 0x03, 0x07, 0x00, 0x06 }, + /* 40 */ + { tbl_D8, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_D8C0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_D9, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_D9C0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DA, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + /* 45 */ + { tbl_DAC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DB, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DBC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DC, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DCC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + /* 50 */ + { tbl_DD, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DDC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DE, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + { tbl_DEC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_DF, tbl_fpu, 0x03, 0x07, 0x00, 0xBF }, + /* 55 */ + { tbl_DFC0, tbl_fpu_ext, 0x00, 0xFF, 0xC0, 0xFF }, + { tbl_0F0F, tbl_suffix, 0x00, 0xFF, 0x00, 0xBF } +}; +/* ia32_opcode_tables.h */ +/* Table index constants: +#define idx_Main 0 +#define idx_66 1 +#define idx_F2 2 +#define idx_F3 3 +#define idx_0F 4 +#define idx_660F 5 +#define idx_F20F 6 +#define idx_F30F 7 +#define idx_0F00 8 +#define idx_0F01 9 +#define idx_0F0111 10 +#define idx_0F12 11 +#define idx_0F16 12 +#define idx_0F18 13 +#define idx_0F71 14 +#define idx_660F71 15 +#define idx_0F72 16 +#define idx_660F72 17 +#define idx_0F73 18 +#define idx_660F73 19 +#define idx_0FAE 20 +#define idx_0FBA 21 +#define idx_0FC7 22 +#define idx_0FB9 23 +#define idx_C6 24 +#define idx_C7 25 +#define idx_80 26 +#define idx_81 27 +#define idx_82 28 +#define idx_83 29 +#define idx_C0 30 +#define idx_C1 31 +#define idx_D0 32 +#define idx_D1 33 +#define idx_D2 34 +#define idx_D3 35 +#define idx_F6 36 +#define idx_F7 37 +#define idx_FE 38 +#define idx_FF 39 +#define idx_D8 40 +#define idx_D8C0 41 +#define idx_D9 42 +#define idx_D9C0 43 +#define idx_DA 44 +#define idx_DAC0 45 +#define idx_DB 46 +#define idx_DBC0 47 +#define idx_DC 48 +#define idx_DCC0 49 +#define idx_DD 50 +#define idx_DDC0 51 +#define idx_DE 52 +#define idx_DEC0 53 +#define idx_DF 54 +#define idx_DFC0 55 +#define idx_0F0F 56 +*/ diff --git a/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h b/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h new file mode 100644 index 000000000..bbd4fae9a --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h @@ -0,0 +1,57 @@ +#define idx_Main 0 +#define idx_66 1 +#define idx_F2 2 +#define idx_F3 3 +#define idx_0F 4 +#define idx_660F 5 +#define idx_F20F 6 +#define idx_F30F 7 +#define idx_0F00 8 +#define idx_0F01 9 +#define idx_0F0111 10 +#define idx_0F12 11 +#define idx_0F16 12 +#define idx_0F18 13 +#define idx_0F71 14 +#define idx_660F71 15 +#define idx_0F72 16 +#define idx_660F72 17 +#define idx_0F73 18 +#define idx_660F73 19 +#define idx_0FAE 20 +#define idx_0FBA 21 +#define idx_0FC7 22 +#define idx_0FB9 23 +#define idx_C6 24 +#define idx_C7 25 +#define idx_80 26 +#define idx_81 27 +#define idx_82 28 +#define idx_83 29 +#define idx_C0 30 +#define idx_C1 31 +#define idx_D0 32 +#define idx_D1 33 +#define idx_D2 34 +#define idx_D3 35 +#define idx_F6 36 +#define idx_F7 37 +#define idx_FE 38 +#define idx_FF 39 +#define idx_D8 40 +#define idx_D8C0 41 +#define idx_D9 42 +#define idx_D9C0 43 +#define idx_DA 44 +#define idx_DAC0 45 +#define idx_DB 46 +#define idx_DBC0 47 +#define idx_DC 48 +#define idx_DCC0 49 +#define idx_DD 50 +#define idx_DDC0 51 +#define idx_DE 52 +#define idx_DEC0 53 +#define idx_DF 54 +#define idx_DFC0 55 +#define idx_0F0F 56 diff --git a/spotify/breakpad/third_party/libdisasm/ia32_operand.c b/spotify/breakpad/third_party/libdisasm/ia32_operand.c new file mode 100644 index 000000000..8e7f16a0c --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_operand.c @@ -0,0 +1,425 @@ +#include +#include +#include + +#include "libdis.h" +#include "ia32_insn.h" +#include "ia32_operand.h" +#include "ia32_modrm.h" +#include "ia32_reg.h" +#include "x86_imm.h" +#include "x86_operand_list.h" + + + +/* apply segment override to memory operand in insn */ +static void apply_seg( x86_op_t *op, unsigned int prefixes ) { + if (! prefixes ) return; + + /* apply overrides from prefix */ + switch ( prefixes & PREFIX_REG_MASK ) { + case PREFIX_CS: + op->flags |= op_cs_seg; break; + case PREFIX_SS: + op->flags |= op_ss_seg; break; + case PREFIX_DS: + op->flags |= op_ds_seg; break; + case PREFIX_ES: + op->flags |= op_es_seg; break; + case PREFIX_FS: + op->flags |= op_fs_seg; break; + case PREFIX_GS: + op->flags |= op_gs_seg; break; + } + + return; +} + +static size_t decode_operand_value( unsigned char *buf, size_t buf_len, + x86_op_t *op, x86_insn_t *insn, + unsigned int addr_meth, size_t op_size, + unsigned int op_value, unsigned char modrm, + size_t gen_regs ) { + size_t size = 0; + + /* ++ Do Operand Addressing Method / Decode operand ++ */ + switch (addr_meth) { + /* This sets the operand Size based on the Intel Opcode Map + * (Vol 2, Appendix A). Letter encodings are from section + * A.1.1, 'Codes for Addressing Method' */ + + /* ---------------------- Addressing Method -------------- */ + /* Note that decoding mod ModR/M operand adjusts the size of + * the instruction, but decoding the reg operand does not. + * This should not cause any problems, as every 'reg' operand + * has an associated 'mod' operand. + * Goddamn-Intel-Note: + * Some Intel addressing methods [M, R] specify that modR/M + * byte may only refer to a memory address/may only refer to + * a register -- however Intel provides no clues on what to do + * if, say, the modR/M for an M opcode decodes to a register + * rather than a memory address ... returning 0 is out of the + * question, as this would be an Immediate or a RelOffset, so + * instead these modR/Ms are decoded with total disregard to + * the M, R constraints. */ + + /* MODRM -- mod operand. sets size to at least 1! */ + case ADDRMETH_E: /* ModR/M present, Gen reg or memory */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + gen_regs ); + break; + case ADDRMETH_M: /* ModR/M only refers to memory */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + gen_regs ); + break; + case ADDRMETH_Q: /* ModR/M present, MMX or Memory */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + REG_MMX_OFFSET ); + break; + case ADDRMETH_R: /* ModR/M mod == gen reg */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + gen_regs ); + break; + case ADDRMETH_W: /* ModR/M present, mem or SIMD reg */ + size = ia32_modrm_decode( buf, buf_len, op, insn, + REG_SIMD_OFFSET ); + break; + + /* MODRM -- reg operand. does not effect size! */ + case ADDRMETH_C: /* ModR/M reg == control reg */ + ia32_reg_decode( modrm, op, REG_CTRL_OFFSET ); + break; + case ADDRMETH_D: /* ModR/M reg == debug reg */ + ia32_reg_decode( modrm, op, REG_DEBUG_OFFSET ); + break; + case ADDRMETH_G: /* ModR/M reg == gen-purpose reg */ + ia32_reg_decode( modrm, op, gen_regs ); + break; + case ADDRMETH_P: /* ModR/M reg == qword MMX reg */ + ia32_reg_decode( modrm, op, REG_MMX_OFFSET ); + break; + case ADDRMETH_S: /* ModR/M reg == segment reg */ + ia32_reg_decode( modrm, op, REG_SEG_OFFSET ); + break; + case ADDRMETH_T: /* ModR/M reg == test reg */ + ia32_reg_decode( modrm, op, REG_TEST_OFFSET ); + break; + case ADDRMETH_V: /* ModR/M reg == SIMD reg */ + ia32_reg_decode( modrm, op, REG_SIMD_OFFSET ); + break; + + /* No MODRM : note these set operand type explicitly */ + case ADDRMETH_A: /* No modR/M -- direct addr */ + op->type = op_absolute; + + /* segment:offset address used in far calls */ + x86_imm_sized( buf, buf_len, + &op->data.absolute.segment, 2 ); + if ( insn->addr_size == 4 ) { + x86_imm_sized( buf, buf_len, + &op->data.absolute.offset.off32, 4 ); + size = 6; + } else { + x86_imm_sized( buf, buf_len, + &op->data.absolute.offset.off16, 2 ); + size = 4; + } + + break; + case ADDRMETH_I: /* Immediate val */ + op->type = op_immediate; + /* if it ever becomes legal to have imm as dest and + * there is a src ModR/M operand, we are screwed! */ + if ( op->flags & op_signed ) { + x86_imm_signsized(buf, buf_len, &op->data.byte, + op_size); + } else { + x86_imm_sized(buf, buf_len, &op->data.byte, + op_size); + } + size = op_size; + break; + case ADDRMETH_J: /* Rel offset to add to IP [jmp] */ + /* this fills op->data.near_offset or + op->data.far_offset depending on the size of + the operand */ + op->flags |= op_signed; + if ( op_size == 1 ) { + /* one-byte near offset */ + op->type = op_relative_near; + x86_imm_signsized(buf, buf_len, + &op->data.relative_near, 1); + } else { + /* far offset...is this truly signed? */ + op->type = op_relative_far; + x86_imm_signsized(buf, buf_len, + &op->data.relative_far, op_size ); + } + size = op_size; + break; + case ADDRMETH_O: /* No ModR/M; op is word/dword offset */ + /* NOTE: these are actually RVAs not offsets to seg!! */ + /* note bene: 'O' ADDR_METH uses addr_size to + determine operand size */ + op->type = op_offset; + op->flags |= op_pointer; + x86_imm_sized( buf, buf_len, &op->data.offset, + insn->addr_size ); + + size = insn->addr_size; + break; + + /* Hard-coded: these are specified in the insn definition */ + case ADDRMETH_F: /* EFLAGS register */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, REG_FLAGS_INDEX ); + break; + case ADDRMETH_X: /* Memory addressed by DS:SI [string] */ + op->type = op_expression; + op->flags |= op_hardcode; + op->flags |= op_ds_seg | op_pointer | op_string; + ia32_handle_register( &op->data.expression.base, + REG_DWORD_OFFSET + 6 ); + break; + case ADDRMETH_Y: /* Memory addressed by ES:DI [string] */ + op->type = op_expression; + op->flags |= op_hardcode; + op->flags |= op_es_seg | op_pointer | op_string; + ia32_handle_register( &op->data.expression.base, + REG_DWORD_OFFSET + 7 ); + break; + case ADDRMETH_RR: /* Gen Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + gen_regs ); + break; + case ADDRMETH_RS: /* Seg Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + REG_SEG_OFFSET ); + break; + case ADDRMETH_RF: /* FPU Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + REG_FPU_OFFSET ); + break; + case ADDRMETH_RT: /* TST Register hard-coded in opcode */ + op->type = op_register; + op->flags |= op_hardcode; + ia32_handle_register( &op->data.reg, + op_value + REG_TEST_OFFSET ); + break; + case ADDRMETH_II: /* Immediate hard-coded in opcode */ + op->type = op_immediate; + op->data.dword = op_value; + op->flags |= op_hardcode; + break; + + case 0: /* Operand is not used */ + default: + /* ignore -- operand not used in this insn */ + op->type = op_unused; /* this shouldn't happen! */ + break; + } + + return size; +} + +static size_t decode_operand_size( unsigned int op_type, x86_insn_t *insn, + x86_op_t *op ){ + size_t size; + + /* ++ Do Operand Type ++ */ + switch (op_type) { + /* This sets the operand Size based on the Intel Opcode Map + * (Vol 2, Appendix A). Letter encodings are from section + * A.1.2, 'Codes for Operand Type' */ + /* NOTE: in this routines, 'size' refers to the size + * of the operand in the raw (encoded) instruction; + * 'datatype' stores the actual size and datatype + * of the operand */ + + /* ------------------------ Operand Type ----------------- */ + case OPTYPE_c: /* byte or word [op size attr] */ + size = (insn->op_size == 4) ? 2 : 1; + op->datatype = (size == 4) ? op_word : op_byte; + break; + case OPTYPE_a: /* 2 word or 2 dword [op size attr] */ + /* pointer to a 16:16 or 32:32 BOUNDS operand */ + size = (insn->op_size == 4) ? 8 : 4; + op->datatype = (size == 4) ? op_bounds32 : op_bounds16; + break; + case OPTYPE_v: /* word or dword [op size attr] */ + size = (insn->op_size == 4) ? 4 : 2; + op->datatype = (size == 4) ? op_dword : op_word; + break; + case OPTYPE_p: /* 32/48-bit ptr [op size attr] */ + /* technically these flags are not accurate: the + * value s a 16:16 pointer or a 16:32 pointer, where + * the first '16' is a segment */ + size = (insn->addr_size == 4) ? 6 : 4; + op->datatype = (size == 4) ? op_descr32 : op_descr16; + break; + case OPTYPE_b: /* byte, ignore op-size */ + size = 1; + op->datatype = op_byte; + break; + case OPTYPE_w: /* word, ignore op-size */ + size = 2; + op->datatype = op_word; + break; + case OPTYPE_d: /* dword , ignore op-size */ + size = 4; + op->datatype = op_dword; + break; + case OPTYPE_s: /* 6-byte psuedo-descriptor */ + /* ptr to 6-byte value which is 32:16 in 32-bit + * mode, or 8:24:16 in 16-bit mode. The high byte + * is ignored in 16-bit mode. */ + size = 6; + op->datatype = (insn->addr_size == 4) ? + op_pdescr32 : op_pdescr16; + break; + case OPTYPE_q: /* qword, ignore op-size */ + size = 8; + op->datatype = op_qword; + break; + case OPTYPE_dq: /* d-qword, ignore op-size */ + size = 16; + op->datatype = op_dqword; + break; + case OPTYPE_ps: /* 128-bit FP data */ + size = 16; + /* really this is 4 packed SP FP values */ + op->datatype = op_ssimd; + break; + case OPTYPE_pd: /* 128-bit FP data */ + size = 16; + /* really this is 2 packed DP FP values */ + op->datatype = op_dsimd; + break; + case OPTYPE_ss: /* Scalar elem of 128-bit FP data */ + size = 16; + /* this only looks at the low dword (4 bytes) + * of the xmmm register passed as a param. + * This is a 16-byte register where only 4 bytes + * are used in the insn. Painful, ain't it? */ + op->datatype = op_sssimd; + break; + case OPTYPE_sd: /* Scalar elem of 128-bit FP data */ + size = 16; + /* this only looks at the low qword (8 bytes) + * of the xmmm register passed as a param. + * This is a 16-byte register where only 8 bytes + * are used in the insn. Painful, again... */ + op->datatype = op_sdsimd; + break; + case OPTYPE_pi: /* qword mmx register */ + size = 8; + op->datatype = op_qword; + break; + case OPTYPE_si: /* dword integer register */ + size = 4; + op->datatype = op_dword; + break; + case OPTYPE_fs: /* single-real */ + size = 4; + op->datatype = op_sreal; + break; + case OPTYPE_fd: /* double real */ + size = 8; + op->datatype = op_dreal; + break; + case OPTYPE_fe: /* extended real */ + size = 10; + op->datatype = op_extreal; + break; + case OPTYPE_fb: /* packed BCD */ + size = 10; + op->datatype = op_bcd; + break; + case OPTYPE_fv: /* pointer to FPU env: 14 or 28-bytes */ + size = (insn->addr_size == 4)? 28 : 14; + op->datatype = (size == 28)? op_fpuenv32: op_fpuenv16; + break; + case OPTYPE_ft: /* pointer to FPU env: 94 or 108 bytes */ + size = (insn->addr_size == 4)? 108 : 94; + op->datatype = (size == 108)? + op_fpustate32: op_fpustate16; + break; + case OPTYPE_fx: /* 512-byte register stack */ + size = 512; + op->datatype = op_fpregset; + break; + case OPTYPE_fp: /* floating point register */ + size = 10; /* double extended precision */ + op->datatype = op_fpreg; + break; + case OPTYPE_m: /* fake operand type used for "lea Gv, M" */ + size = insn->addr_size; + op->datatype = (size == 4) ? op_dword : op_word; + break; + case OPTYPE_none: /* handle weird instructions that have no encoding but use a dword datatype, like invlpg */ + size = 0; + op->datatype = op_none; + break; + case 0: + default: + size = insn->op_size; + op->datatype = (size == 4) ? op_dword : op_word; + break; + } + return size; +} + +size_t ia32_decode_operand( unsigned char *buf, size_t buf_len, + x86_insn_t *insn, unsigned int raw_op, + unsigned int raw_flags, unsigned int prefixes, + unsigned char modrm ) { + unsigned int addr_meth, op_type, op_size, gen_regs; + x86_op_t *op; + size_t size; + + /* ++ Yank optype and addr mode out of operand flags */ + addr_meth = raw_flags & ADDRMETH_MASK; + op_type = raw_flags & OPTYPE_MASK; + + if ( raw_flags == ARG_NONE ) { + /* operand is not used in this instruction */ + return 0; + } + + /* allocate a new operand */ + op = x86_operand_new( insn ); + + /* ++ Copy flags from opcode table to x86_insn_t */ + op->access = (enum x86_op_access) OP_PERM(raw_flags); + op->flags = (enum x86_op_flags) (OP_FLAGS(raw_flags) >> 12); + + /* Get size (for decoding) and datatype of operand */ + op_size = decode_operand_size(op_type, insn, op); + + /* override default register set based on Operand Type */ + /* this allows mixing of 8, 16, and 32 bit regs in insn */ + if (op_size == 1) { + gen_regs = REG_BYTE_OFFSET; + } else if (op_size == 2) { + gen_regs = REG_WORD_OFFSET; + } else { + gen_regs = REG_DWORD_OFFSET; + } + + size = decode_operand_value( buf, buf_len, op, insn, addr_meth, + op_size, raw_op, modrm, gen_regs ); + + /* if operand is an address, apply any segment override prefixes */ + if ( op->type == op_expression || op->type == op_offset ) { + apply_seg(op, prefixes); + } + + return size; /* return number of bytes in instruction */ +} diff --git a/spotify/breakpad/third_party/libdisasm/ia32_operand.h b/spotify/breakpad/third_party/libdisasm/ia32_operand.h new file mode 100644 index 000000000..08c3074cd --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_operand.h @@ -0,0 +1,11 @@ +#ifndef IA32_OPERAND_H +#define IA32_OPERAND_H + +#include "libdis.h" +#include "ia32_insn.h" + +size_t ia32_decode_operand( unsigned char *buf, size_t buf_len, + x86_insn_t *insn, unsigned int raw_op, + unsigned int raw_flags, unsigned int prefixes, + unsigned char modrm ); +#endif diff --git a/spotify/breakpad/third_party/libdisasm/ia32_reg.c b/spotify/breakpad/third_party/libdisasm/ia32_reg.c new file mode 100644 index 000000000..f270c1f34 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_reg.c @@ -0,0 +1,234 @@ +#include +#include + +#include "ia32_reg.h" +#include "ia32_insn.h" + +#define NUM_X86_REGS 92 + +/* register sizes */ +#define REG_DWORD_SIZE 4 +#define REG_WORD_SIZE 2 +#define REG_BYTE_SIZE 1 +#define REG_MMX_SIZE 8 +#define REG_SIMD_SIZE 16 +#define REG_DEBUG_SIZE 4 +#define REG_CTRL_SIZE 4 +#define REG_TEST_SIZE 4 +#define REG_SEG_SIZE 2 +#define REG_FPU_SIZE 10 +#define REG_FLAGS_SIZE 4 +#define REG_FPCTRL_SIZE 2 +#define REG_FPSTATUS_SIZE 2 +#define REG_FPTAG_SIZE 2 +#define REG_EIP_SIZE 4 +#define REG_IP_SIZE 2 + +/* REGISTER ALIAS TABLE: + * + * NOTE: the MMX register mapping is fixed to the physical registers + * used by the FPU. The floating FP stack does not effect the location + * of the MMX registers, so this aliasing is not 100% accurate. + * */ +static struct { + unsigned char alias; /* id of register this is an alias for */ + unsigned char shift; /* # of bits register must be shifted */ +} ia32_reg_aliases[] = { + { 0,0 }, + { REG_DWORD_OFFSET, 0 }, /* al : 1 */ + { REG_DWORD_OFFSET, 8 }, /* ah : 2 */ + { REG_DWORD_OFFSET, 0 }, /* ax : 3 */ + { REG_DWORD_OFFSET + 1, 0 }, /* cl : 4 */ + { REG_DWORD_OFFSET + 1, 8 }, /* ch : 5 */ + { REG_DWORD_OFFSET + 1, 0 }, /* cx : 6 */ + { REG_DWORD_OFFSET + 2, 0 }, /* dl : 7 */ + { REG_DWORD_OFFSET + 2, 8 }, /* dh : 8 */ + { REG_DWORD_OFFSET + 2, 0 }, /* dx : 9 */ + { REG_DWORD_OFFSET + 3, 0 }, /* bl : 10 */ + { REG_DWORD_OFFSET + 3, 8 }, /* bh : 11 */ + { REG_DWORD_OFFSET + 3, 0 }, /* bx : 12 */ + { REG_DWORD_OFFSET + 4, 0 }, /* sp : 13 */ + { REG_DWORD_OFFSET + 5, 0 }, /* bp : 14 */ + { REG_DWORD_OFFSET + 6, 0 }, /* si : 15 */ + { REG_DWORD_OFFSET + 7, 0 }, /* di : 16 */ + { REG_EIP_INDEX, 0 }, /* ip : 17 */ + { REG_FPU_OFFSET, 0 }, /* mm0 : 18 */ + { REG_FPU_OFFSET + 1, 0 }, /* mm1 : 19 */ + { REG_FPU_OFFSET + 2, 0 }, /* mm2 : 20 */ + { REG_FPU_OFFSET + 3, 0 }, /* mm3 : 21 */ + { REG_FPU_OFFSET + 4, 0 }, /* mm4 : 22 */ + { REG_FPU_OFFSET + 5, 0 }, /* mm5 : 23 */ + { REG_FPU_OFFSET + 6, 0 }, /* mm6 : 24 */ + { REG_FPU_OFFSET + 7, 0 } /* mm7 : 25 */ + }; + +/* REGISTER TABLE: size, type, and name of every register in the + * CPU. Does not include MSRs since the are, after all, + * model specific. */ +static struct { + unsigned int size; + enum x86_reg_type type; + unsigned int alias; + char mnemonic[8]; +} ia32_reg_table[NUM_X86_REGS + 2] = { + { 0, 0, 0, "" }, + /* REG_DWORD_OFFSET */ + { REG_DWORD_SIZE, reg_gen | reg_ret, 0, "eax" }, + { REG_DWORD_SIZE, reg_gen | reg_count, 0, "ecx" }, + { REG_DWORD_SIZE, reg_gen, 0, "edx" }, + { REG_DWORD_SIZE, reg_gen, 0, "ebx" }, + /* REG_ESP_INDEX */ + { REG_DWORD_SIZE, reg_gen | reg_sp, 0, "esp" }, + { REG_DWORD_SIZE, reg_gen | reg_fp, 0, "ebp" }, + { REG_DWORD_SIZE, reg_gen | reg_src, 0, "esi" }, + { REG_DWORD_SIZE, reg_gen | reg_dest, 0, "edi" }, + /* REG_WORD_OFFSET */ + { REG_WORD_SIZE, reg_gen | reg_ret, 3, "ax" }, + { REG_WORD_SIZE, reg_gen | reg_count, 6, "cx" }, + { REG_WORD_SIZE, reg_gen, 9, "dx" }, + { REG_WORD_SIZE, reg_gen, 12, "bx" }, + { REG_WORD_SIZE, reg_gen | reg_sp, 13, "sp" }, + { REG_WORD_SIZE, reg_gen | reg_fp, 14, "bp" }, + { REG_WORD_SIZE, reg_gen | reg_src, 15, "si" }, + { REG_WORD_SIZE, reg_gen | reg_dest, 16, "di" }, + /* REG_BYTE_OFFSET */ + { REG_BYTE_SIZE, reg_gen, 1, "al" }, + { REG_BYTE_SIZE, reg_gen, 4, "cl" }, + { REG_BYTE_SIZE, reg_gen, 7, "dl" }, + { REG_BYTE_SIZE, reg_gen, 10, "bl" }, + { REG_BYTE_SIZE, reg_gen, 2, "ah" }, + { REG_BYTE_SIZE, reg_gen, 5, "ch" }, + { REG_BYTE_SIZE, reg_gen, 8, "dh" }, + { REG_BYTE_SIZE, reg_gen, 11, "bh" }, + /* REG_MMX_OFFSET */ + { REG_MMX_SIZE, reg_simd, 18, "mm0" }, + { REG_MMX_SIZE, reg_simd, 19, "mm1" }, + { REG_MMX_SIZE, reg_simd, 20, "mm2" }, + { REG_MMX_SIZE, reg_simd, 21, "mm3" }, + { REG_MMX_SIZE, reg_simd, 22, "mm4" }, + { REG_MMX_SIZE, reg_simd, 23, "mm5" }, + { REG_MMX_SIZE, reg_simd, 24, "mm6" }, + { REG_MMX_SIZE, reg_simd, 25, "mm7" }, + /* REG_SIMD_OFFSET */ + { REG_SIMD_SIZE, reg_simd, 0, "xmm0" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm1" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm2" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm3" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm4" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm5" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm6" }, + { REG_SIMD_SIZE, reg_simd, 0, "xmm7" }, + /* REG_DEBUG_OFFSET */ + { REG_DEBUG_SIZE, reg_sys, 0, "dr0" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr1" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr2" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr3" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr4" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr5" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr6" }, + { REG_DEBUG_SIZE, reg_sys, 0, "dr7" }, + /* REG_CTRL_OFFSET */ + { REG_CTRL_SIZE, reg_sys, 0, "cr0" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr1" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr2" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr3" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr4" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr5" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr6" }, + { REG_CTRL_SIZE, reg_sys, 0, "cr7" }, + /* REG_TEST_OFFSET */ + { REG_TEST_SIZE, reg_sys, 0, "tr0" }, + { REG_TEST_SIZE, reg_sys, 0, "tr1" }, + { REG_TEST_SIZE, reg_sys, 0, "tr2" }, + { REG_TEST_SIZE, reg_sys, 0, "tr3" }, + { REG_TEST_SIZE, reg_sys, 0, "tr4" }, + { REG_TEST_SIZE, reg_sys, 0, "tr5" }, + { REG_TEST_SIZE, reg_sys, 0, "tr6" }, + { REG_TEST_SIZE, reg_sys, 0, "tr7" }, + /* REG_SEG_OFFSET */ + { REG_SEG_SIZE, reg_seg, 0, "es" }, + { REG_SEG_SIZE, reg_seg, 0, "cs" }, + { REG_SEG_SIZE, reg_seg, 0, "ss" }, + { REG_SEG_SIZE, reg_seg, 0, "ds" }, + { REG_SEG_SIZE, reg_seg, 0, "fs" }, + { REG_SEG_SIZE, reg_seg, 0, "gs" }, + /* REG_LDTR_INDEX */ + { REG_DWORD_SIZE, reg_sys, 0, "ldtr" }, + /* REG_GDTR_INDEX */ + { REG_DWORD_SIZE, reg_sys, 0, "gdtr" }, + /* REG_FPU_OFFSET */ + { REG_FPU_SIZE, reg_fpu, 0, "st(0)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(1)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(2)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(3)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(4)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(5)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(6)" }, + { REG_FPU_SIZE, reg_fpu, 0, "st(7)" }, + /* REG_FLAGS_INDEX : 81 */ + { REG_FLAGS_SIZE, reg_cond, 0, "eflags" }, + /* REG_FPCTRL_INDEX : 82*/ + { REG_FPCTRL_SIZE, reg_fpu | reg_sys, 0, "fpctrl" }, + /* REG_FPSTATUS_INDEX : 83*/ + { REG_FPSTATUS_SIZE, reg_fpu | reg_sys, 0, "fpstat" }, + /* REG_FPTAG_INDEX : 84 */ + { REG_FPTAG_SIZE, reg_fpu | reg_sys, 0, "fptag" }, + /* REG_EIP_INDEX : 85 */ + { REG_EIP_SIZE, reg_pc, 0, "eip" }, + /* REG_IP_INDEX : 86 */ + { REG_IP_SIZE, reg_pc, 17, "ip" }, + /* REG_IDTR_INDEX : 87 */ + { REG_DWORD_SIZE, reg_sys, 0, "idtr" }, + /* REG_MXCSG_INDEX : SSE Control Reg : 88 */ + { REG_DWORD_SIZE, reg_sys | reg_simd, 0, "mxcsr" }, + /* REG_TR_INDEX : Task Register : 89 */ + { 16 + 64, reg_sys, 0, "tr" }, + /* REG_CSMSR_INDEX : SYSENTER_CS_MSR : 90 */ + { REG_DWORD_SIZE, reg_sys, 0, "cs_msr" }, + /* REG_ESPMSR_INDEX : SYSENTER_ESP_MSR : 91 */ + { REG_DWORD_SIZE, reg_sys, 0, "esp_msr" }, + /* REG_EIPMSR_INDEX : SYSENTER_EIP_MSR : 92 */ + { REG_DWORD_SIZE, reg_sys, 0, "eip_msr" }, + { 0 } + }; + + +static size_t sz_regtable = NUM_X86_REGS + 1; + + +void ia32_handle_register( x86_reg_t *reg, size_t id ) { + unsigned int alias; + if (! id || id > sz_regtable ) { + return; + } + + memset( reg, 0, sizeof(x86_reg_t) ); + + strncpy( reg->name, ia32_reg_table[id].mnemonic, MAX_REGNAME ); + + reg->type = ia32_reg_table[id].type; + reg->size = ia32_reg_table[id].size; + + alias = ia32_reg_table[id].alias; + if ( alias ) { + reg->alias = ia32_reg_aliases[alias].alias; + reg->shift = ia32_reg_aliases[alias].shift; + } + reg->id = id; + + return; +} + +size_t ia32_true_register_id( size_t id ) { + size_t reg; + + if (! id || id > sz_regtable ) { + return 0; + } + + reg = id; + if (ia32_reg_table[reg].alias) { + reg = ia32_reg_aliases[ia32_reg_table[reg].alias].alias; + } + return reg; +} diff --git a/spotify/breakpad/third_party/libdisasm/ia32_reg.h b/spotify/breakpad/third_party/libdisasm/ia32_reg.h new file mode 100644 index 000000000..fbbc77a17 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_reg.h @@ -0,0 +1,41 @@ +#ifndef IA32_REG_H +#define IA32_REG_H + +#include /* for size_t */ +#include "libdis.h" /* for x86_reg_t */ + +/* NOTE these are used in opcode tables for hard-coded registers */ +#define REG_DWORD_OFFSET 1 /* 0 + 1 */ +#define REG_ECX_INDEX 2 /* 0 + 1 + 1 */ +#define REG_ESP_INDEX 5 /* 0 + 4 + 1 */ +#define REG_EBP_INDEX 6 /* 0 + 5 + 1 */ +#define REG_ESI_INDEX 7 /* 0 + 6 + 1 */ +#define REG_EDI_INDEX 8 /* 0 + 7 + 1 */ +#define REG_WORD_OFFSET 9 /* 1 * 8 + 1 */ +#define REG_BYTE_OFFSET 17 /* 2 * 8 + 1 */ +#define REG_MMX_OFFSET 25 /* 3 * 8 + 1 */ +#define REG_SIMD_OFFSET 33 /* 4 * 8 + 1 */ +#define REG_DEBUG_OFFSET 41 /* 5 * 8 + 1 */ +#define REG_CTRL_OFFSET 49 /* 6 * 8 + 1 */ +#define REG_TEST_OFFSET 57 /* 7 * 8 + 1 */ +#define REG_SEG_OFFSET 65 /* 8 * 8 + 1 */ +#define REG_LDTR_INDEX 71 /* 8 * 8 + 1 + 1 */ +#define REG_GDTR_INDEX 72 /* 8 * 8 + 2 + 1 */ +#define REG_FPU_OFFSET 73 /* 9 * 8 + 1 */ +#define REG_FLAGS_INDEX 81 /* 10 * 8 + 1 */ +#define REG_FPCTRL_INDEX 82 /* 10 * 8 + 1 + 1 */ +#define REG_FPSTATUS_INDEX 83 /* 10 * 8 + 2 + 1 */ +#define REG_FPTAG_INDEX 84 /* 10 * 8 + 3 + 1 */ +#define REG_EIP_INDEX 85 /* 10 * 8 + 4 + 1 */ +#define REG_IP_INDEX 86 /* 10 * 8 + 5 + 1 */ +#define REG_IDTR_INDEX 87 /* 10 * 8 + 6 + 1 */ +#define REG_MXCSG_INDEX 88 /* 10 * 8 + 7 + 1 */ +#define REG_TR_INDEX 89 /* 10 * 8 + 8 + 1 */ +#define REG_CSMSR_INDEX 90 /* 10 * 8 + 9 + 1 */ +#define REG_ESPMSR_INDEX 91 /* 10 * 8 + 10 + 1 */ +#define REG_EIPMSR_INDEX 92 /* 10 * 8 + 11 + 1 */ + +void ia32_handle_register( x86_reg_t *reg, size_t id ); +size_t ia32_true_register_id( size_t id ); + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/ia32_settings.c b/spotify/breakpad/third_party/libdisasm/ia32_settings.c new file mode 100644 index 000000000..b578e3448 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_settings.c @@ -0,0 +1,13 @@ +#include "libdis.h" +#include "ia32_settings.h" +#include "ia32_reg.h" +#include "ia32_insn.h" + +ia32_settings_t ia32_settings = { + 1, 0xF4, + MAX_INSTRUCTION_SIZE, + 4, 4, 8, 4, 8, + REG_ESP_INDEX, REG_EBP_INDEX, REG_EIP_INDEX, REG_FLAGS_INDEX, + REG_DWORD_OFFSET, REG_SEG_OFFSET, REG_FPU_OFFSET, + opt_none +}; diff --git a/spotify/breakpad/third_party/libdisasm/ia32_settings.h b/spotify/breakpad/third_party/libdisasm/ia32_settings.h new file mode 100644 index 000000000..769c0e9fa --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/ia32_settings.h @@ -0,0 +1,27 @@ +#ifndef IA32_SETTINGS_H +#define IA32_SETTINGS_H + +#include "libdis.h" + +typedef struct { + /* options */ + unsigned char endian, /* 0 = big, 1 = little */ + wc_byte, /* wildcard byte */ + max_insn, /* max insn size */ + sz_addr, /* default address size */ + sz_oper, /* default operand size */ + sz_byte, /* # bits in byte */ + sz_word, /* # bytes in machine word */ + sz_dword; /* # bytes in machine dword */ + unsigned int id_sp_reg, /* id of stack pointer */ + id_fp_reg, /* id of frame pointer */ + id_ip_reg, /* id of instruction pointer */ + id_flag_reg, /* id of flags register */ + offset_gen_regs, /* start of general regs */ + offset_seg_regs, /* start of segment regs */ + offset_fpu_regs; /* start of floating point regs */ + /* user-controlled settings */ + enum x86_options options; +} ia32_settings_t; + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/libdis.h b/spotify/breakpad/third_party/libdisasm/libdis.h new file mode 100644 index 000000000..94103396f --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/libdis.h @@ -0,0 +1,836 @@ +#ifndef LIBDISASM_H +#define LIBDISASM_H + +#ifdef WIN32 +#include +#endif + +#include + +/* 'NEW" types + * __________________________________________________________________________*/ +#ifndef LIBDISASM_QWORD_H /* do not interfere with qword.h */ + #define LIBDISASM_QWORD_H + #ifdef _MSC_VER + typedef __int64 qword_t; + #else + typedef int64_t qword_t; + #endif +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* 'NEW" x86 API + * __________________________________________________________________________*/ + + +/* ========================================= Error Reporting */ +/* REPORT CODES + * These are passed to a reporter function passed at initialization. + * Each code determines the type of the argument passed to the reporter; + * this allows the report to recover from errors, or just log them. + */ +enum x86_report_codes { + report_disasm_bounds, /* RVA OUT OF BOUNDS : The disassembler could + not disassemble the supplied RVA as it is + out of the range of the buffer. The + application should store the address and + attempt to determine what section of the + binary it is in, then disassemble the + address from the bytes in that section. + data: uint32_t rva */ + report_insn_bounds, /* INSTRUCTION OUT OF BOUNDS: The disassembler + could not disassemble the instruction as + the instruction would require bytes beyond + the end of the current buffer. This usually + indicated garbage bytes at the end of a + buffer, or an incorrectly-sized buffer. + data: uint32_t rva */ + report_invalid_insn, /* INVALID INSTRUCTION: The disassembler could + not disassemble the instruction as it has an + invalid combination of opcodes and operands. + This will stop automated disassembly; the + application can restart the disassembly + after the invalid instruction. + data: uint32_t rva */ + report_unknown +}; + +/* 'arg' is optional arbitrary data provided by the code passing the + * callback -- for example, it could be 'this' or 'self' in OOP code. + * 'code' is provided by libdisasm, it is one of the above + * 'data' is provided by libdisasm and is context-specific, per the enums */ +typedef void (*DISASM_REPORTER)( enum x86_report_codes code, + void *data, void *arg ); + + +/* x86_report_error : Call the register reporter to report an error */ +void x86_report_error( enum x86_report_codes code, void *data ); + +/* ========================================= Libdisasm Management Routines */ +enum x86_options { /* these can be ORed together */ + opt_none= 0, + opt_ignore_nulls=1, /* ignore sequences of > 4 NULL bytes */ + opt_16_bit=2, /* 16-bit/DOS disassembly */ + opt_att_mnemonics=4, /* use AT&T syntax names for alternate opcode mnemonics */ +}; + +/* management routines */ +/* 'arg' is caller-specific data which is passed as the first argument + * to the reporter callback routine */ +int x86_init( enum x86_options options, DISASM_REPORTER reporter, void *arg); +void x86_set_reporter( DISASM_REPORTER reporter, void *arg); +void x86_set_options( enum x86_options options ); +enum x86_options x86_get_options( void ); +int x86_cleanup(void); + + +/* ========================================= Instruction Representation */ +/* these defines are only intended for use in the array decl's */ +#define MAX_REGNAME 8 + +#define MAX_PREFIX_STR 32 +#define MAX_MNEM_STR 16 +#define MAX_INSN_SIZE 20 /* same as in i386.h */ +#define MAX_OP_STRING 32 /* max possible operand size in string form */ +#define MAX_OP_RAW_STRING 64 /* max possible operand size in raw form */ +#define MAX_OP_XML_STRING 256 /* max possible operand size in xml form */ +#define MAX_NUM_OPERANDS 8 /* max # implicit and explicit operands */ +/* in these, the '2 *' is arbitrary: the max # of operands should require + * more space than the rest of the insn */ +#define MAX_INSN_STRING 512 /* 2 * 8 * MAX_OP_STRING */ +#define MAX_INSN_RAW_STRING 1024 /* 2 * 8 * MAX_OP_RAW_STRING */ +#define MAX_INSN_XML_STRING 4096 /* 2 * 8 * MAX_OP_XML_STRING */ + +enum x86_reg_type { /* NOTE: these may be ORed together */ + reg_gen = 0x00001, /* general purpose */ + reg_in = 0x00002, /* incoming args, ala RISC */ + reg_out = 0x00004, /* args to calls, ala RISC */ + reg_local = 0x00008, /* local vars, ala RISC */ + reg_fpu = 0x00010, /* FPU data register */ + reg_seg = 0x00020, /* segment register */ + reg_simd = 0x00040, /* SIMD/MMX reg */ + reg_sys = 0x00080, /* restricted/system register */ + reg_sp = 0x00100, /* stack pointer */ + reg_fp = 0x00200, /* frame pointer */ + reg_pc = 0x00400, /* program counter */ + reg_retaddr = 0x00800, /* return addr for func */ + reg_cond = 0x01000, /* condition code / flags */ + reg_zero = 0x02000, /* zero register, ala RISC */ + reg_ret = 0x04000, /* return value */ + reg_src = 0x10000, /* array/rep source */ + reg_dest = 0x20000, /* array/rep destination */ + reg_count = 0x40000 /* array/rep/loop counter */ +}; + +/* x86_reg_t : an X86 CPU register */ +typedef struct { + char name[MAX_REGNAME]; + enum x86_reg_type type; /* what register is used for */ + unsigned int size; /* size of register in bytes */ + unsigned int id; /* register ID #, for quick compares */ + unsigned int alias; /* ID of reg this is an alias for */ + unsigned int shift; /* amount to shift aliased reg by */ +} x86_reg_t; + +/* x86_ea_t : an X86 effective address (address expression) */ +typedef struct { + unsigned int scale; /* scale factor */ + x86_reg_t index, base; /* index, base registers */ + int32_t disp; /* displacement */ + char disp_sign; /* is negative? 1/0 */ + char disp_size; /* 0, 1, 2, 4 */ +} x86_ea_t; + +/* x86_absolute_t : an X86 segment:offset address (descriptor) */ +typedef struct { + unsigned short segment; /* loaded directly into CS */ + union { + unsigned short off16; /* loaded directly into IP */ + uint32_t off32; /* loaded directly into EIP */ + } offset; +} x86_absolute_t; + +enum x86_op_type { /* mutually exclusive */ + op_unused = 0, /* empty/unused operand: should never occur */ + op_register = 1, /* CPU register */ + op_immediate = 2, /* Immediate Value */ + op_relative_near = 3, /* Relative offset from IP */ + op_relative_far = 4, /* Relative offset from IP */ + op_absolute = 5, /* Absolute address (ptr16:32) */ + op_expression = 6, /* Address expression (scale/index/base/disp) */ + op_offset = 7, /* Offset from start of segment (m32) */ + op_unknown +}; + +#define x86_optype_is_address( optype ) \ + ( optype == op_absolute || optype == op_offset ) +#define x86_optype_is_relative( optype ) \ + ( optype == op_relative_near || optype == op_relative_far ) +#define x86_optype_is_memory( optype ) \ + ( optype > op_immediate && optype < op_unknown ) + +enum x86_op_datatype { /* these use Intel's lame terminology */ + op_byte = 1, /* 1 byte integer */ + op_word = 2, /* 2 byte integer */ + op_dword = 3, /* 4 byte integer */ + op_qword = 4, /* 8 byte integer */ + op_dqword = 5, /* 16 byte integer */ + op_sreal = 6, /* 4 byte real (single real) */ + op_dreal = 7, /* 8 byte real (double real) */ + op_extreal = 8, /* 10 byte real (extended real) */ + op_bcd = 9, /* 10 byte binary-coded decimal */ + op_ssimd = 10, /* 16 byte : 4 packed single FP (SIMD, MMX) */ + op_dsimd = 11, /* 16 byte : 2 packed double FP (SIMD, MMX) */ + op_sssimd = 12, /* 4 byte : scalar single FP (SIMD, MMX) */ + op_sdsimd = 13, /* 8 byte : scalar double FP (SIMD, MMX) */ + op_descr32 = 14, /* 6 byte Intel descriptor 2:4 */ + op_descr16 = 15, /* 4 byte Intel descriptor 2:2 */ + op_pdescr32 = 16, /* 6 byte Intel pseudo-descriptor 32:16 */ + op_pdescr16 = 17, /* 6 byte Intel pseudo-descriptor 8:24:16 */ + op_bounds16 = 18, /* signed 16:16 lower:upper bounds */ + op_bounds32 = 19, /* signed 32:32 lower:upper bounds */ + op_fpuenv16 = 20, /* 14 byte FPU control/environment data */ + op_fpuenv32 = 21, /* 28 byte FPU control/environment data */ + op_fpustate16 = 22, /* 94 byte FPU state (env & reg stack) */ + op_fpustate32 = 23, /* 108 byte FPU state (env & reg stack) */ + op_fpregset = 24, /* 512 bytes: register set */ + op_fpreg = 25, /* FPU register */ + op_none = 0xFF, /* operand without a datatype (INVLPG) */ +}; + +enum x86_op_access { /* ORed together */ + op_read = 1, + op_write = 2, + op_execute = 4 +}; + +enum x86_op_flags { /* ORed together, but segs are mutually exclusive */ + op_signed = 1, /* signed integer */ + op_string = 2, /* possible string or array */ + op_constant = 4, /* symbolic constant */ + op_pointer = 8, /* operand points to a memory address */ + op_sysref = 0x010, /* operand is a syscall number */ + op_implied = 0x020, /* operand is implicit in the insn */ + op_hardcode = 0x40, /* operand is hardcoded in insn definition */ + /* NOTE: an 'implied' operand is one which can be considered a side + * effect of the insn, e.g. %esp being modified by PUSH or POP. A + * 'hard-coded' operand is one which is specified in the instruction + * definition, e.g. %es:%edi in MOVSB or 1 in ROL Eb, 1. The difference + * is that hard-coded operands are printed by disassemblers and are + * required to re-assemble, while implicit operands are invisible. */ + op_es_seg = 0x100, /* ES segment override */ + op_cs_seg = 0x200, /* CS segment override */ + op_ss_seg = 0x300, /* SS segment override */ + op_ds_seg = 0x400, /* DS segment override */ + op_fs_seg = 0x500, /* FS segment override */ + op_gs_seg = 0x600 /* GS segment override */ +}; + +/* x86_op_t : an X86 instruction operand */ +typedef struct { + enum x86_op_type type; /* operand type */ + enum x86_op_datatype datatype; /* operand size */ + enum x86_op_access access; /* operand access [RWX] */ + enum x86_op_flags flags; /* misc flags */ + union { + /* sizeof will have to work on these union members! */ + /* immediate values */ + char sbyte; + short sword; + int32_t sdword; + qword_t sqword; + unsigned char byte; + unsigned short word; + uint32_t dword; + qword_t qword; + float sreal; + double dreal; + /* misc large/non-native types */ + unsigned char extreal[10]; + unsigned char bcd[10]; + qword_t dqword[2]; + unsigned char simd[16]; + unsigned char fpuenv[28]; + /* offset from segment */ + uint32_t offset; + /* ID of CPU register */ + x86_reg_t reg; + /* offsets from current insn */ + char relative_near; + int32_t relative_far; + /* segment:offset */ + x86_absolute_t absolute; + /* effective address [expression] */ + x86_ea_t expression; + } data; + /* this is needed to make formatting operands more sane */ + void * insn; /* pointer to x86_insn_t owning operand */ +} x86_op_t; + +/* Linked list of x86_op_t; provided for manual traversal of the operand + * list in an insn. Users wishing to add operands to this list, e.g. to add + * implicit operands, should use x86_operand_new in x86_operand_list.h */ +typedef struct x86_operand_list { + x86_op_t op; + struct x86_operand_list *next; +} x86_oplist_t; + +enum x86_insn_group { + insn_none = 0, /* invalid instruction */ + insn_controlflow = 1, + insn_arithmetic = 2, + insn_logic = 3, + insn_stack = 4, + insn_comparison = 5, + insn_move = 6, + insn_string = 7, + insn_bit_manip = 8, + insn_flag_manip = 9, + insn_fpu = 10, + insn_interrupt = 13, + insn_system = 14, + insn_other = 15 +}; + +enum x86_insn_type { + insn_invalid = 0, /* invalid instruction */ + /* insn_controlflow */ + insn_jmp = 0x1001, + insn_jcc = 0x1002, + insn_call = 0x1003, + insn_callcc = 0x1004, + insn_return = 0x1005, + /* insn_arithmetic */ + insn_add = 0x2001, + insn_sub = 0x2002, + insn_mul = 0x2003, + insn_div = 0x2004, + insn_inc = 0x2005, + insn_dec = 0x2006, + insn_shl = 0x2007, + insn_shr = 0x2008, + insn_rol = 0x2009, + insn_ror = 0x200A, + /* insn_logic */ + insn_and = 0x3001, + insn_or = 0x3002, + insn_xor = 0x3003, + insn_not = 0x3004, + insn_neg = 0x3005, + /* insn_stack */ + insn_push = 0x4001, + insn_pop = 0x4002, + insn_pushregs = 0x4003, + insn_popregs = 0x4004, + insn_pushflags = 0x4005, + insn_popflags = 0x4006, + insn_enter = 0x4007, + insn_leave = 0x4008, + /* insn_comparison */ + insn_test = 0x5001, + insn_cmp = 0x5002, + /* insn_move */ + insn_mov = 0x6001, /* move */ + insn_movcc = 0x6002, /* conditional move */ + insn_xchg = 0x6003, /* exchange */ + insn_xchgcc = 0x6004, /* conditional exchange */ + /* insn_string */ + insn_strcmp = 0x7001, + insn_strload = 0x7002, + insn_strmov = 0x7003, + insn_strstore = 0x7004, + insn_translate = 0x7005, /* xlat */ + /* insn_bit_manip */ + insn_bittest = 0x8001, + insn_bitset = 0x8002, + insn_bitclear = 0x8003, + /* insn_flag_manip */ + insn_clear_carry = 0x9001, + insn_clear_zero = 0x9002, + insn_clear_oflow = 0x9003, + insn_clear_dir = 0x9004, + insn_clear_sign = 0x9005, + insn_clear_parity = 0x9006, + insn_set_carry = 0x9007, + insn_set_zero = 0x9008, + insn_set_oflow = 0x9009, + insn_set_dir = 0x900A, + insn_set_sign = 0x900B, + insn_set_parity = 0x900C, + insn_tog_carry = 0x9010, + insn_tog_zero = 0x9020, + insn_tog_oflow = 0x9030, + insn_tog_dir = 0x9040, + insn_tog_sign = 0x9050, + insn_tog_parity = 0x9060, + /* insn_fpu */ + insn_fmov = 0xA001, + insn_fmovcc = 0xA002, + insn_fneg = 0xA003, + insn_fabs = 0xA004, + insn_fadd = 0xA005, + insn_fsub = 0xA006, + insn_fmul = 0xA007, + insn_fdiv = 0xA008, + insn_fsqrt = 0xA009, + insn_fcmp = 0xA00A, + insn_fcos = 0xA00C, + insn_fldpi = 0xA00D, + insn_fldz = 0xA00E, + insn_ftan = 0xA00F, + insn_fsine = 0xA010, + insn_fsys = 0xA020, + /* insn_interrupt */ + insn_int = 0xD001, + insn_intcc = 0xD002, /* not present in x86 ISA */ + insn_iret = 0xD003, + insn_bound = 0xD004, + insn_debug = 0xD005, + insn_trace = 0xD006, + insn_invalid_op = 0xD007, + insn_oflow = 0xD008, + /* insn_system */ + insn_halt = 0xE001, + insn_in = 0xE002, /* input from port/bus */ + insn_out = 0xE003, /* output to port/bus */ + insn_cpuid = 0xE004, + /* insn_other */ + insn_nop = 0xF001, + insn_bcdconv = 0xF002, /* convert to or from BCD */ + insn_szconv = 0xF003 /* change size of operand */ +}; + +/* These flags specify special characteristics of the instruction, such as + * whether the inatruction is privileged or whether it serializes the + * pipeline. + * NOTE : These may not be accurate for all instructions; updates to the + * opcode tables have not been completed. */ +enum x86_insn_note { + insn_note_ring0 = 1, /* Only available in ring 0 */ + insn_note_smm = 2, /* "" in System Management Mode */ + insn_note_serial = 4, /* Serializing instruction */ + insn_note_nonswap = 8, /* Does not swap arguments in att-style formatting */ + insn_note_nosuffix = 16, /* Does not have size suffix in att-style formatting */ +}; + +/* This specifies what effects the instruction has on the %eflags register */ +enum x86_flag_status { + insn_carry_set = 0x1, /* CF */ + insn_zero_set = 0x2, /* ZF */ + insn_oflow_set = 0x4, /* OF */ + insn_dir_set = 0x8, /* DF */ + insn_sign_set = 0x10, /* SF */ + insn_parity_set = 0x20, /* PF */ + insn_carry_or_zero_set = 0x40, + insn_zero_set_or_sign_ne_oflow = 0x80, + insn_carry_clear = 0x100, + insn_zero_clear = 0x200, + insn_oflow_clear = 0x400, + insn_dir_clear = 0x800, + insn_sign_clear = 0x1000, + insn_parity_clear = 0x2000, + insn_sign_eq_oflow = 0x4000, + insn_sign_ne_oflow = 0x8000 +}; + +/* The CPU model in which the insturction first appeared; this can be used + * to mask out instructions appearing in earlier or later models or to + * check the portability of a binary. + * NOTE : These may not be accurate for all instructions; updates to the + * opcode tables have not been completed. */ +enum x86_insn_cpu { + cpu_8086 = 1, /* Intel */ + cpu_80286 = 2, + cpu_80386 = 3, + cpu_80387 = 4, + cpu_80486 = 5, + cpu_pentium = 6, + cpu_pentiumpro = 7, + cpu_pentium2 = 8, + cpu_pentium3 = 9, + cpu_pentium4 = 10, + cpu_k6 = 16, /* AMD */ + cpu_k7 = 32, + cpu_athlon = 48 +}; + +/* CPU ISA subsets: These are derived from the Instruction Groups in + * Intel Vol 1 Chapter 5; they represent subsets of the IA32 ISA but + * do not reflect the 'type' of the instruction in the same way that + * x86_insn_group does. In short, these are AMD/Intel's somewhat useless + * designations. + * NOTE : These may not be accurate for all instructions; updates to the + * opcode tables have not been completed. */ +enum x86_insn_isa { + isa_gp = 1, /* general purpose */ + isa_fp = 2, /* floating point */ + isa_fpumgt = 3, /* FPU/SIMD management */ + isa_mmx = 4, /* Intel MMX */ + isa_sse1 = 5, /* Intel SSE SIMD */ + isa_sse2 = 6, /* Intel SSE2 SIMD */ + isa_sse3 = 7, /* Intel SSE3 SIMD */ + isa_3dnow = 8, /* AMD 3DNow! SIMD */ + isa_sys = 9 /* system instructions */ +}; + +enum x86_insn_prefix { + insn_no_prefix = 0, + insn_rep_zero = 1, /* REPZ and REPE */ + insn_rep_notzero = 2, /* REPNZ and REPNZ */ + insn_lock = 4 /* LOCK: */ +}; + +/* TODO: maybe provide insn_new/free(), and have disasm return new insn_t */ +/* x86_insn_t : an X86 instruction */ +typedef struct { + /* information about the instruction */ + uint32_t addr; /* load address */ + uint32_t offset; /* offset into file/buffer */ + enum x86_insn_group group; /* meta-type, e.g. INS_EXEC */ + enum x86_insn_type type; /* type, e.g. INS_BRANCH */ + enum x86_insn_note note; /* note, e.g. RING0 */ + unsigned char bytes[MAX_INSN_SIZE]; + unsigned char size; /* size of insn in bytes */ + /* 16/32-bit mode settings */ + unsigned char addr_size; /* default address size : 2 or 4 */ + unsigned char op_size; /* default operand size : 2 or 4 */ + /* CPU/instruction set */ + enum x86_insn_cpu cpu; + enum x86_insn_isa isa; + /* flags */ + enum x86_flag_status flags_set; /* flags set or tested by insn */ + enum x86_flag_status flags_tested; + /* stack */ + unsigned char stack_mod; /* 0 or 1 : is the stack modified? */ + int32_t stack_mod_val; /* val stack is modified by if known */ + + /* the instruction proper */ + enum x86_insn_prefix prefix; /* prefixes ORed together */ + char prefix_string[MAX_PREFIX_STR]; /* prefixes [might be truncated] */ + char mnemonic[MAX_MNEM_STR]; + x86_oplist_t *operands; /* list of explicit/implicit operands */ + size_t operand_count; /* total number of operands */ + size_t explicit_count; /* number of explicit operands */ + /* convenience fields for user */ + void *block; /* code block containing this insn */ + void *function; /* function containing this insn */ + int tag; /* tag the insn as seen/processed */ +} x86_insn_t; + + +/* returns 0 if an instruction is invalid, 1 if valid */ +int x86_insn_is_valid( x86_insn_t *insn ); + +/* DISASSEMBLY ROUTINES + * Canonical order of arguments is + * (buf, buf_len, buf_rva, offset, len, insn, func, arg, resolve_func) + * ...but of course all of these are not used at the same time. + */ + + +/* Function prototype for caller-supplied callback routine + * These callbacks are intended to process 'insn' further, e.g. by + * adding it to a linked list, database, etc */ +typedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg ); + +/* Function prototype for caller-supplied address resolver. + * This routine is used to determine the rva to disassemble next, given + * the 'dest' operand of a jump/call. This allows the caller to resolve + * jump/call targets stored in a register or on the stack, and also allows + * the caller to prevent endless loops by checking if an address has + * already been disassembled. If an address cannot be resolved from the + * operand, or if the address has already been disassembled, this routine + * should return -1; in all other cases the RVA to be disassembled next + * should be returned. */ +typedef int32_t (*DISASM_RESOLVER)( x86_op_t *op, x86_insn_t * current_insn, + void *arg ); + + +/* x86_disasm: Disassemble a single instruction from a buffer of bytes. + * Returns size of instruction in bytes. + * Caller is responsible for calling x86_oplist_free() on + * a reused "insn" to avoid leaking memory when calling this + * function repeatedly. + * buf : Buffer of bytes to disassemble + * buf_len : Length of the buffer + * buf_rva : Load address of the start of the buffer + * offset : Offset in buffer to disassemble + * insn : Structure to fill with disassembled instruction + */ +unsigned int x86_disasm( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + x86_insn_t * insn ); + +/* x86_disasm_range: Sequential disassembly of a range of bytes in a buffer, + * invoking a callback function each time an instruction + * is successfully disassembled. The 'range' refers to the + * bytes between 'offset' and 'offset + len' in the buffer; + * 'len' is assumed to be less than the length of the buffer. + * Returns number of instructions processed. + * buf : Buffer of bytes to disassemble (e.g. .text section) + * buf_rva : Load address of buffer (e.g. ELF Virtual Address) + * offset : Offset in buffer to start disassembly at + * len : Number of bytes to disassemble + * func : Callback function to invoke (may be NULL) + * arg : Arbitrary data to pass to callback (may be NULL) + */ +unsigned int x86_disasm_range( unsigned char *buf, uint32_t buf_rva, + unsigned int offset, unsigned int len, + DISASM_CALLBACK func, void *arg ); + +/* x86_disasm_forward: Flow-of-execution disassembly of the bytes in a buffer, + * invoking a callback function each time an instruction + * is successfully disassembled. + * buf : Buffer to disassemble (e.g. .text section) + * buf_len : Number of bytes in buffer + * buf_rva : Load address of buffer (e.g. ELF Virtual Address) + * offset : Offset in buffer to start disassembly at (e.g. entry point) + * func : Callback function to invoke (may be NULL) + * arg : Arbitrary data to pass to callback (may be NULL) + * resolver: Caller-supplied address resolver. If no resolver is + * supplied, a default internal one is used -- however the + * internal resolver does NOT catch loops and could end up + * disassembling forever.. + * r_arg : Arbitrary data to pass to resolver (may be NULL) + */ +unsigned int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + DISASM_CALLBACK func, void *arg, + DISASM_RESOLVER resolver, void *r_arg ); + +/* Instruction operands: these are stored as a list of explicit and + * implicit operands. It is recommended that the 'foreach' routines + * be used to when examining operands for purposes of data flow analysis */ + +/* Operand FOREACH callback: 'arg' is an abritrary parameter passed to the + * foreach routine, 'insn' is the x86_insn_t whose operands are being + * iterated over, and 'op' is the current x86_op_t */ +typedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, void *arg); + +/* FOREACH types: these are used to limit the foreach results to + * operands which match a certain "type" (implicit or explicit) + * or which are accessed in certain ways (e.g. read or write). Note + * that this operates on the operand list of single instruction, so + * specifying the 'real' operand type (register, memory, etc) is not + * useful. Note also that by definition Execute Access implies Read + * Access and implies Not Write Access. + * The "type" (implicit or explicit) and the access method can + * be ORed together, e.g. op_wo | op_explicit */ +enum x86_op_foreach_type { + op_any = 0, /* ALL operands (explicit, implicit, rwx) */ + op_dest = 1, /* operands with Write access */ + op_src = 2, /* operands with Read access */ + op_ro = 3, /* operands with Read but not Write access */ + op_wo = 4, /* operands with Write but not Read access */ + op_xo = 5, /* operands with Execute access */ + op_rw = 6, /* operands with Read AND Write access */ + op_implicit = 0x10, /* operands that are implied by the opcode */ + op_explicit = 0x20 /* operands that are not side-effects */ +}; + + +/* free the operand list associated with an instruction -- useful for + * preventing memory leaks when free()ing an x86_insn_t */ +void x86_oplist_free( x86_insn_t *insn ); + +/* Operand foreach: invokes 'func' with 'insn' and 'arg' as arguments. The + * 'type' parameter is used to select only operands matching specific + * criteria. */ +int x86_operand_foreach( x86_insn_t *insn, x86_operand_fn func, void *arg, + enum x86_op_foreach_type type); + +/* convenience routine: returns count of operands matching 'type' */ +size_t x86_operand_count( x86_insn_t *insn, enum x86_op_foreach_type type ); + +/* accessor functions for the operands */ +x86_op_t * x86_operand_1st( x86_insn_t *insn ); +x86_op_t * x86_operand_2nd( x86_insn_t *insn ); +x86_op_t * x86_operand_3rd( x86_insn_t *insn ); + +/* these allow libdisasm 2.0 accessor functions to still be used */ +#define x86_get_dest_operand( insn ) x86_operand_1st( insn ) +#define x86_get_src_operand( insn ) x86_operand_2nd( insn ) +#define x86_get_imm_operand( insn ) x86_operand_3rd( insn ) + +/* get size of operand data in bytes */ +unsigned int x86_operand_size( x86_op_t *op ); + +/* Operand Convenience Routines: the following three routines are common + * operations on operands, intended to ease the burden of the programmer. */ + +/* Get Address: return the value of an offset operand, or the offset of + * a segment:offset absolute address */ +uint32_t x86_get_address( x86_insn_t *insn ); + +/* Get Relative Offset: return as a sign-extended int32_t the near or far + * relative offset operand, or 0 if there is none. There can be only one + * relaive offset operand in an instruction. */ +int32_t x86_get_rel_offset( x86_insn_t *insn ); + +/* Get Branch Target: return the x86_op_t containing the target of + * a jump or call operand, or NULL if there is no branch target. + * Internally, a 'branch target' is defined as any operand with + * Execute Access set. There can be only one branch target per instruction. */ +x86_op_t * x86_get_branch_target( x86_insn_t *insn ); + +/* Get Immediate: return the x86_op_t containing the immediate operand + * for this instruction, or NULL if there is no immediate operand. There + * can be only one immediate operand per instruction */ +x86_op_t * x86_get_imm( x86_insn_t *insn ); + +/* Get Raw Immediate Data: returns a pointer to the immediate data encoded + * in the instruction. This is useful for large data types [>32 bits] currently + * not supported by libdisasm, or for determining if the disassembler + * screwed up the conversion of the immediate data. Note that 'imm' in this + * context refers to immediate data encoded at the end of an instruction as + * detailed in the Intel Manual Vol II Chapter 2; it does not refer to the + * 'op_imm' operand (the third operand in instructions like 'mul' */ +unsigned char * x86_get_raw_imm( x86_insn_t *insn ); + + +/* More accessor fuctions, this time for user-defined info... */ +/* set the address (usually RVA) of the insn */ +void x86_set_insn_addr( x86_insn_t *insn, uint32_t addr ); + +/* set the offset (usually offset into file) of the insn */ +void x86_set_insn_offset( x86_insn_t *insn, unsigned int offset ); + +/* set a pointer to the function owning the instruction. The + * type of 'func' is user-defined; libdisasm does not use the func field. */ +void x86_set_insn_function( x86_insn_t *insn, void * func ); + +/* set a pointer to the block of code owning the instruction. The + * type of 'block' is user-defined; libdisasm does not use the block field. */ +void x86_set_insn_block( x86_insn_t *insn, void * block ); + +/* instruction tagging: these routines allow the programmer to mark + * instructions as "seen" in a DFS, for example. libdisasm does not use + * the tag field.*/ +/* set insn->tag to 1 */ +void x86_tag_insn( x86_insn_t *insn ); +/* set insn->tag to 0 */ +void x86_untag_insn( x86_insn_t *insn ); +/* return insn->tag */ +int x86_insn_is_tagged( x86_insn_t *insn ); + + +/* Disassembly formats: + * AT&T is standard AS/GAS-style: "mnemonic\tsrc, dest, imm" + * Intel is standard MASM/NASM/TASM: "mnemonic\tdest,src, imm" + * Native is tab-delimited: "RVA\tbytes\tmnemonic\tdest\tsrc\timm" + * XML is your typical ... + * Raw is addr|offset|size|bytes|prefix... see libdisasm_formats.7 + */ +enum x86_asm_format { + unknown_syntax = 0, /* never use! */ + native_syntax, /* header: 35 bytes */ + intel_syntax, /* header: 23 bytes */ + att_syntax, /* header: 23 bytes */ + xml_syntax, /* header: 679 bytes */ + raw_syntax /* header: 172 bytes */ +}; + +/* format (sprintf) an operand into 'buf' using specified syntax */ +int x86_format_operand(x86_op_t *op, char *buf, int len, + enum x86_asm_format format); + +/* format (sprintf) an instruction mnemonic into 'buf' using specified syntax */ +int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format); + +/* format (sprintf) an instruction into 'buf' using specified syntax; + * this includes formatting all operands */ +int x86_format_insn(x86_insn_t *insn, char *buf, int len, enum x86_asm_format); + +/* fill 'buf' with a description of the format's syntax */ +int x86_format_header( char *buf, int len, enum x86_asm_format format); + +/* Endianness of an x86 CPU : 0 is big, 1 is little; always returns 1 */ +unsigned int x86_endian(void); + +/* Default address and operand size in bytes */ +unsigned int x86_addr_size(void); +unsigned int x86_op_size(void); + +/* Size of a machine word in bytes */ +unsigned int x86_word_size(void); + +/* maximum size of a code instruction */ +#define x86_max_inst_size(x) x86_max_insn_size(x) +unsigned int x86_max_insn_size(void); + +/* register IDs of Stack, Frame, Instruction pointer and Flags register */ +unsigned int x86_sp_reg(void); +unsigned int x86_fp_reg(void); +unsigned int x86_ip_reg(void); +unsigned int x86_flag_reg(void); + +/* fill 'reg' struct with details of register 'id' */ +void x86_reg_from_id( unsigned int id, x86_reg_t * reg ); + +/* convenience macro demonstrating how to get an aliased register; proto is + * void x86_get_aliased_reg( x86_reg_t *alias_reg, x86_reg_t *output_reg ) + * where 'alias_reg' is a reg operand and 'output_reg' is filled with the + * register that the operand is an alias for */ +#define x86_get_aliased_reg( alias_reg, output_reg ) \ + x86_reg_from_id( alias_reg->alias, output_reg ) + + +/* ================================== Invariant Instruction Representation */ +/* Invariant instructions are used for generating binary signatures; + * the instruction is modified so that all variant bytes in an instruction + * are replaced with a wildcard byte. + * + * A 'variant byte' is one that is expected to be modified by either the + * static or the dynamic linker: for example, an address encoded in an + * instruction. + * + * By comparing the invariant representation of one instruction [or of a + * sequence of instructions] with the invariant representation of another, + * one determine whether the two invariant representations are from the same + * relocatable object [.o] file. Thus one can use binary signatures [which + * are just sequences of invariant instruction representations] to look for + * library routines which have been statically-linked into a binary. + * + * The invariant routines are faster and smaller than the disassembly + * routines; they can be used to determine the size of an instruction + * without all of the overhead of a full instruction disassembly. + */ + +/* This byte is used to replace variant bytes */ +#define X86_WILDCARD_BYTE 0xF4 + +typedef struct { + enum x86_op_type type; /* operand type */ + enum x86_op_datatype datatype; /* operand size */ + enum x86_op_access access; /* operand access [RWX] */ + enum x86_op_flags flags; /* misc flags */ +} x86_invariant_op_t; + +typedef struct { + unsigned char bytes[64]; /* invariant representation */ + unsigned int size; /* number of bytes in insn */ + enum x86_insn_group group; /* meta-type, e.g. INS_EXEC */ + enum x86_insn_type type; /* type, e.g. INS_BRANCH */ + x86_invariant_op_t operands[3]; /* operands: dest, src, imm */ +} x86_invariant_t; + + +/* return a version of the instruction with the variant bytes masked out */ +size_t x86_invariant_disasm( unsigned char *buf, int buf_len, + x86_invariant_t *inv ); +/* return the size in bytes of the intruction pointed to by 'buf'; + * this used x86_invariant_disasm since it faster than x86_disasm */ +size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ); + +#ifdef __cplusplus +} +#endif + + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/qword.h b/spotify/breakpad/third_party/libdisasm/qword.h new file mode 100644 index 000000000..5f0e803c9 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/qword.h @@ -0,0 +1,14 @@ +#ifndef LIBDISASM_QWORD_H +#define LIBDISASM_QWORD_H + +#include + +/* platform independent data types */ + +#ifdef _MSC_VER + typedef __int64 qword_t; +#else + typedef int64_t qword_t; +#endif + +#endif diff --git a/spotify/breakpad/third_party/libdisasm/swig/README b/spotify/breakpad/third_party/libdisasm/swig/README new file mode 100644 index 000000000..a9fa79ec2 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/swig/README @@ -0,0 +1,128 @@ + Libdisasm SWIG README + +The SWIG utility (www.swig.org) can be used to generate + + +Building SWIG Modules +--------------------- + + make + make install + +Make and Install both build Python, Perl, Ruby, and Tcl modules. If you +do not have one of these languages installed, comment out the relevant +target in the main Makefile. + +Install uses 'sudo' to put files in the correct locations; if you +do not have sudo installed, change the install targets. + +The Module API +-------------- + +The OOP API +----------- + + +The Python Module +----------------- + +To test that the module loads: + + bash# python + >>> import x86disasm + >>> x86disasm.version_string() + '0.21-pre' + >>>^D + bash# + + >>> import x86disasm + >>> import array + >>> disasm = x86disasm.X86_Disasm( ) + >>> tgt = open( "/tmp/a.out", "rb" ) + >>> tgt.seek( 0, 2 ) + >>> size = tgt.tell() + >>> tgt.seek( 0, 0 ) + >>> buf = array.array( 'B' ) + >>> buf.fromfile( tgt, size ) + >>> tgt.close() + >>> data = x86disasm.byteArray( size ) + >>> for i in range( size ): + ... data[i] = buf.pop(0) + ... + >>> del buf + >>> del tgt + >>> insn = disasm.disasm( data, size - 1, 0, 0 ) + >>> insn.format( x86disasm.att_syntax ) + 'jg\t0x00000047' + >>> insn.format( x86disasm.raw_syntax ) + '0x00000000|0x00000000|2|7F 45 |||controlflow|jcc|jg|80386|General Purpose|||zero_clear sign_eq_oflow |0|0|relative|sbyte|00000047|' + >>> ops = insn.operand_list() + >>> node = ops.first() + >>> while node is not None: + ... s = node.op.format(x86disasm.raw_syntax) + ... print s + ... node = ops.next() + ... + relative|sbyte|00000047| + + + + + + +The Perl Module +--------------- + +To test that the module loads: + + bash# perl + use x86disasm; + print x86disasm::version_string() . "\n"; + ^D + 0.21-pre + bash# + +The Ruby Module +--------------- + +To test that the module loads: + + bash# irb + irb(main):001:0> require 'x86disasm' + => true + irb(main):002:0> X86disasm.version_string() + => "0.21-pre" + irb(main):003:0> x = X86disasm::X86_Disasm.new + => # + irb(main):004:0> x.max_register_string() + => 8 + irb(main):003:0> ^D + bash# + +The Tcl Module +--------------- + +To test that the module loads: + + bash# tclsh + % load /usr/lib/tcl8.3/x86disasm.so X86disasm + % version_string + 0.21-pre + % ^D + bash# + + % x86_init 0 NULL NULL + OR + % x86disasm dis + _486b0708_p_x86disasm + % puts "[dis cget -last_error]" + 0 + + + + +The Interface Files +------------------- + + libdisasm.i -- interface file without shadow classes + libdisasm_oop.i -- interface file with shadow classes diff --git a/spotify/breakpad/third_party/libdisasm/swig/libdisasm.i b/spotify/breakpad/third_party/libdisasm/swig/libdisasm.i new file mode 100644 index 000000000..ec1204175 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/swig/libdisasm.i @@ -0,0 +1,508 @@ +%module x86disasm +%{ +#include "../../libdis.h" +#include "../../../config.h" +%} + +%rename(version_string) x86_version_string; +%include "../../libdis.h" +#include "../../../config.h" + +%inline %{ + const char * x86_version_string( void ) { + return PACKAGE_VERSION; + } +%} + +%rename(report_codes) x86_report_codes; +%rename(report_error) x86_report_error; +%rename(options) x86_options; +%rename(init) x86_init; +%rename(set_reporter) x86_set_reporter; +%rename(set_options) x86_set_options; +%rename(options) x86_get_options; +%rename(cleanup) x86_cleanup; +%rename(reg_type) x86_reg_type; +%rename(reg) x86_reg_t; +%rename(eaddr) x86_ea_t; +%rename(op_type) x86_op_type; +%rename(optype_is_address) x86_optype_is_address; +%rename(optype_is_relative) x86_optype_is_relative; +%rename(op_datatype) x86_op_datatype; +%rename(op_access) x86_op_access; +%rename(op_flags) x86_op_flags; +%rename(operand) x86_op_t; +%rename(insn_group) x86_insn_group; +%rename(insn_type) x86_insn_type; +%rename(insn_note) x86_insn_note ; +%rename(flag_status) x86_flag_status; +%rename(insn_cpu) x86_insn_cpu ; +%rename(insn_isa) x86_insn_isa ; +%rename(insn_prefix) x86_insn_prefix ; +%rename(insn) x86_insn_t; +%rename(insn_is_valid) x86_insn_is_valid; +%rename(i_disasm) x86_disasm; +%rename(i_disasm_range) x86_disasm_range; +%rename(i_disasm_forward) x86_disasm_forward; +%rename(insn_operand_count) x86_operand_count; +%rename(insn_operand_1st) x86_operand_1st; +%rename(insn_operand_2nd) x86_operand_2nd; +%rename(insn_operand_3rd) x86_operand_3rd; +%rename(insn_dest_operand) x86_get_dest_operand; +%rename(insn_src_operand) x86_get_src_operand; +%rename(insn_imm_operand) x86_get_imm_operand; +%rename(operand_size) x86_operand_size; +%rename(insn_rel_offset) x86_get_rel_offset; +%rename(insn_branch_target) x86_get_branch_target; +%rename(insn_imm) x86_get_imm; +%rename(insn_raw_imm) x86_get_raw_imm; +%rename(insn_set_addr) x86_set_insn_addr; +%rename(insn_set_offset) x86_set_insn_offset; +%rename(insn_set_function) x86_set_insn_function; +%rename(insn_set_block) x86_set_insn_block; +%rename(insn_tag) x86_tag_insn; +%rename(insn_untag) x86_untag_insn; +%rename(insn_is_tagged) x86_insn_is_tagged; +%rename(asm_format) x86_asm_format; +%rename(operand_format) x86_format_operand; +%rename(insn_format_mnemonic) x86_format_mnemonic; +%rename(insn_format) x86_format_insn; +%rename(header_format) x86_format_header; +%rename(endian) x86_endian; +%rename(size_default_address) x86_addr_size; +%rename(size_default_operand) x86_op_size; +%rename(size_machine_word) x86_word_size; +%rename(size_max_insn) x86_max_insn_size; +%rename(reg_sp) x86_sp_reg; +%rename(reg_fp) x86_fp_reg; +%rename(reg_ip) x86_ip_reg; +%rename(reg_from_id) x86_reg_from_id; +%rename(reg_from_alias) x86_get_aliased_reg; +%rename(invariant_op) x86_invariant_op_t; +%rename(invariant) x86_invariant_t; +%rename(disasm_invariant) x86_invariant_disasm; +%rename(disasm_size) x86_size_disasm; + +%include "carrays.i" + +%array_class( unsigned char, byteArray ); + + +%apply (unsigned char *STRING, int LENGTH) { + (unsigned char *buf, size_t buf_len) +}; + + +%newobject x86_op_copy; +%inline %{ + x86_op_t * x86_op_copy( x86_op_t * src ) { + x86_op_t *op; + + if (! src ) { + return NULL; + } + + op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 ); + if ( op ) { + memcpy( op, src, sizeof(x86_op_t) ); + } + + return op; + } + + typedef struct x86_op_list_node { + x86_op_t *op; + struct x86_op_list_node *next, *prev; + } x86_op_list_node; + + typedef struct x86_op_list { + size_t count; + x86_op_list_node *head, *tail, *curr; + } x86_op_list; + + x86_op_list * x86_op_list_new () { + x86_op_list *list = (x86_op_list *) + calloc( sizeof(x86_op_list), 1 ); + list->count = 0; + return list; + } + + void x86_op_list_free(x86_op_list *list) { + x86_op_list_node *node, *next; + + node = list->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( list ); + } + + x86_op_list_node * x86_op_list_first(x86_op_list *list) { + return list->head; + } + + x86_op_list_node * x86_op_list_last(x86_op_list *list) { + return list->tail; + } + + x86_op_list_node * x86_op_list_next(x86_op_list *list) { + if (! list->curr ) { + list->curr = list->head; + return list->head; + } + + list->curr = list->curr->next; + return list->curr; + } + + x86_op_list_node * x86_op_list_prev(x86_op_list *list) { + if (! list->curr ) { + list->curr = list->tail; + return list->tail; + } + + list->curr = list->curr->prev; + return list->curr; + } + +%} + +%newobject x86_op_list_append; + +%inline %{ + void x86_op_list_append( x86_op_list * list, x86_op_t *op ) { + x86_op_list_node *node = (x86_op_list_node *) + calloc( sizeof(x86_op_list_node) , 1 ); + if (! node ) { + return; + } + + list->count++; + if ( ! list->tail ) { + list->head = list->tail = node; + } else { + list->tail->next = node; + node->prev = list->tail; + list->tail = node; + } + + node->op = x86_op_copy( op ); + } + + x86_oplist_t * x86_op_list_node_copy( x86_oplist_t * list ) { + x86_oplist_t *ptr; + ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 ); + if ( ptr ) { + memcpy( &ptr->op, &list->op, sizeof(x86_op_t) ); + } + + return ptr; + } + + x86_insn_t * x86_insn_new() { + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + return insn; + } + + void x86_insn_free( x86_insn_t *insn ) { + x86_oplist_free( insn ); + free( insn ); + } +%} + +%newobject x86_insn_copy; + +%inline %{ + x86_insn_t * x86_insn_copy( x86_insn_t *src) { + x86_oplist_t *ptr, *list, *last = NULL; + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + + if ( insn ) { + memcpy( insn, src, sizeof(x86_insn_t) ); + insn->operands = NULL; + insn->block = NULL; + insn->function = NULL; + + /* copy operand list */ + for ( list = src->operands; list; list = list->next ) { + ptr = x86_op_list_node_copy( list ); + + if (! ptr ) { + continue; + } + + if ( insn->operands ) { + last->next = ptr; + } else { + insn->operands = ptr; + } + last = ptr; + } + } + + return insn; + } + + x86_op_list * x86_insn_op_list( x86_insn_t *insn ) { + x86_oplist_t *list = insn->operands; + x86_op_list *op_list = x86_op_list_new(); + + for ( list = insn->operands; list; list = list->next ) { + x86_op_list_append( op_list, &list->op ); + } + + return op_list; + } + + typedef struct x86_insn_list_node { + x86_insn_t *insn; + struct x86_insn_list_node *next, *prev; + } x86_insn_list_node; + + typedef struct x86_insn_list { + size_t count; + x86_insn_list_node *head, *tail, *curr; + } x86_insn_list; + +%} + +%newobject x86_insn_list_new; + +%inline %{ + x86_insn_list * x86_insn_list_new () { + x86_insn_list *list = (x86_insn_list *) + calloc( sizeof(x86_insn_list), 1 ); + list->count = 0; + return list; + } + + void x86_insn_list_free( x86_insn_list * list ) { + x86_insn_list_node *node, *next; + + if (! list ) { + return; + } + + node = list->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( list ); + } + + x86_insn_list_node * x86_insn_list_first( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + return list->head; + } + + x86_insn_list_node * x86_insn_list_last( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + return list->tail; + } + + x86_insn_list_node * x86_insn_list_next( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + if (! list->curr ) { + list->curr = list->head; + return list->head; + } + + list->curr = list->curr->next; + return list->curr; + } + + x86_insn_list_node * x86_insn_list_prev( x86_insn_list *list ) { + if (! list ) { + return NULL; + } + if (! list->curr ) { + list->curr = list->tail; + return list->tail; + } + + list->curr = list->curr->prev; + return list->curr; + } + +%} + +%newobject x86_insn_list_append; + +%inline %{ + void x86_insn_list_append( x86_insn_list *list, x86_insn_t *insn ) { + x86_insn_list_node *node; + if (! list ) { + return; + } + + node = (x86_insn_list_node *) + calloc( sizeof(x86_insn_list_node) , 1 ); + + if (! node ) { + return; + } + + list->count++; + if ( ! list->tail ) { + list->head = list->tail = node; + } else { + list->tail->next = node; + node->prev = list->tail; + list->tail = node; + } + + node->insn = x86_insn_copy( insn ); + } + + typedef struct { + enum x86_report_codes last_error; + void * last_error_data; + void * disasm_callback; + void * disasm_resolver; + } x86disasm; + + void x86_default_reporter( enum x86_report_codes code, + void *data, void *arg ) { + x86disasm *dis = (x86disasm *) arg; + if ( dis ) { + dis->last_error = code; + dis->last_error_data = data; + } + } + + void x86_default_callback( x86_insn_t *insn, void *arg ) { + x86_insn_list *list = (x86_insn_list *) arg; + if ( list ) { + x86_insn_list_append( list, insn ); + } + } + + /* TODO: resolver stack, maybe a callback */ + long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) { + x86disasm *dis = (x86disasm *) arg; + if ( dis ) { + //return dis->resolver( op, insn ); + return 0; + } + + return 0; + } + + +%} + +%newobject x86disasm_new; + +%inline %{ + x86disasm * x86disasm_new ( enum x86_options options ) { + x86disasm * dis = (x86disasm *) + calloc( sizeof( x86disasm ), 1 ); + x86_init( options, x86_default_reporter, dis ); + return dis; + } + + void x86disasm_free( x86disasm * dis ) { + x86_cleanup(); + free( dis ); + } +%} + +%newobject x86_disasm; + +%inline %{ + x86_insn_t * disasm( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 ); + x86_disasm( buf, buf_len, buf_rva, offset, insn ); + return insn; + } + + int disasm_range( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset, + unsigned int len ) { + + x86_insn_list *list = x86_insn_list_new(); + + if ( len > buf_len ) { + len = buf_len; + } + + return x86_disasm_range( buf, buf_rva, offset, len, + x86_default_callback, list ); + } + + int disasm_forward( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + x86_insn_list *list = x86_insn_list_new(); + + /* use default resolver: damn SWIG callbacks! */ + return x86_disasm_forward( buf, buf_len, buf_rva, offset, + x86_default_callback, list, + x86_default_resolver, NULL ); + } + + size_t disasm_invariant( unsigned char *buf, size_t buf_len, + x86_invariant_t *inv ) { + return x86_invariant_disasm( buf, buf_len, inv ); + } + + size_t disasm_size( unsigned char *buf, size_t buf_len ) { + return x86_size_disasm( buf, buf_len ); + } + + int x86_max_operand_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_OP_XML_STRING; + break; + case raw_syntax: + return MAX_OP_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_OP_STRING; + break; + } + } + + + int x86_max_insn_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_INSN_XML_STRING; + break; + case raw_syntax: + return MAX_INSN_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_INSN_STRING; + break; + } + } + + int x86_max_num_operands( ) { return MAX_NUM_OPERANDS; } +%} + diff --git a/spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i b/spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i new file mode 100644 index 000000000..973a47e27 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i @@ -0,0 +1,1114 @@ +%module x86disasm +%{ +#ifdef _MSC_VER + typedef __int64 qword; +#else + typedef long long qword; +#endif + +#include + +#define MAX_REGNAME 8 +#define MAX_PREFIX_STR 32 +#define MAX_MNEM_STR 16 +#define MAX_INSN_SIZE 20 +#define MAX_OP_STRING 32 +#define MAX_OP_RAW_STRING 64 +#define MAX_OP_XML_STRING 256 +#define MAX_NUM_OPERANDS 8 +#define MAX_INSN_STRING 512 +#define MAX_INSN_RAW_STRING 1024 +#define MAX_INSN_XML_STRING 4096 + +#include "../../../config.h" + + +const char * version_string( void ) { + return PACKAGE_VERSION; +} + +%} + +const char * version_string( void ); + +%rename(X86_Register) x86_reg_t; +%rename(X86_EAddr) x86_ea_t; +%rename(X86_Operand) x86_op_t; +//%rename(X86_OpList) x86_oplist_t; +%rename(X86_Insn) x86_insn_t; +%rename(X86_InvOperand) x86_invariant_op_t; +%rename(X86_Invariant) x86_invariant_t; + +%include "carrays.i" + +%array_class( unsigned char, byteArray ); + + +%apply (unsigned char *STRING, int LENGTH) { + (unsigned char *buf, size_t buf_len) +}; + + +%inline %{ + + +enum x86_asm_format { + unknown_syntax = 0, /* never use! */ + native_syntax, /* header: 35 bytes */ + intel_syntax, /* header: 23 bytes */ + att_syntax, /* header: 23 bytes */ + xml_syntax, /* header: 679 bytes */ + raw_syntax /* header: 172 bytes */ +}; +%} + +/* ================================================================== */ +/* operand class */ +%inline %{ + enum x86_reg_type { + reg_gen = 0x00001, reg_in = 0x00002, + reg_out = 0x00004, reg_local = 0x00008, + reg_fpu = 0x00010, reg_seg = 0x00020, + reg_simd = 0x00040, reg_sys = 0x00080, + reg_sp = 0x00100, reg_fp = 0x00200, + reg_pc = 0x00400, reg_retaddr = 0x00800, + reg_cond = 0x01000, reg_zero = 0x02000, + reg_ret = 0x04000, reg_src = 0x10000, + reg_dest = 0x20000, reg_count = 0x40000 + }; + + typedef struct { + char name[MAX_REGNAME]; + enum x86_reg_type type; + unsigned int size; + unsigned int id; + unsigned int alias; + unsigned int shift; + } x86_reg_t; + + void x86_reg_from_id( unsigned int id, x86_reg_t * reg ); + + typedef struct { + unsigned int scale; + x86_reg_t index, base; + long disp; + char disp_sign; + char disp_size; + } x86_ea_t; + + enum x86_op_type { + op_unused = 0, + op_register = 1, + op_immediate = 2, + op_relative_near = 3, + op_relative_far = 4, + op_absolute = 5, + op_expression = 6, + op_offset = 7, + op_unknown + }; + + enum x86_op_datatype { + op_byte = 1, op_word = 2, + op_dword = 3, op_qword = 4, + op_dqword = 5, op_sreal = 6, + op_dreal = 7, op_extreal = 8, + op_bcd = 9, op_ssimd = 10, + op_dsimd = 11, op_sssimd = 12, + op_sdsimd = 13, op_descr32 = 14, + op_descr16 = 15, op_pdescr32 = 16, + op_pdescr16 = 17, op_fpuenv = 18, + op_fpregset = 19, + }; + + enum x86_op_access { + op_read = 1, + op_write = 2, + op_execute = 4 + }; + + enum x86_op_flags { + op_signed = 1, op_string = 2, + op_constant = 4, op_pointer = 8, + op_sysref = 0x010, op_implied = 0x020, + op_hardcode = 0x40, op_es_seg = 0x100, + op_cs_seg = 0x200, op_ss_seg = 0x300, + op_ds_seg = 0x400, op_fs_seg = 0x500, + op_gs_seg = 0x600 + }; + + typedef struct { + enum x86_op_type type; + enum x86_op_datatype datatype; + enum x86_op_access access; + enum x86_op_flags flags; + union { + char sbyte; + short sword; + long sdword; + qword sqword; + unsigned char byte; + unsigned short word; + unsigned long dword; + qword qword; + float sreal; + double dreal; + unsigned char extreal[10]; + unsigned char bcd[10]; + qword dqword[2]; + unsigned char simd[16]; + unsigned char fpuenv[28]; + void * address; + unsigned long offset; + x86_reg_t reg; + char relative_near; + long relative_far; + x86_ea_t expression; + } data; + void * insn; + } x86_op_t; + + unsigned int x86_operand_size( x86_op_t *op ); + + int x86_format_operand(x86_op_t *op, char *buf, int len, + enum x86_asm_format format); +%} + +%extend x86_reg_t{ + x86_reg_t * aliased_reg( ) { + x86_reg_t * reg = (x86_reg_t * ) + calloc( sizeof(x86_reg_t), 1 ); + x86_reg_from_id( self->id, reg ); + return reg; + } +} + +%extend x86_op_t{ + size_t size() { + return x86_operand_size( self ); + } + char * format( enum x86_asm_format format ) { + char *buf, *str; + size_t len; + + switch ( format ) { + case xml_syntax: + len = MAX_OP_XML_STRING; + break; + case raw_syntax: + len = MAX_OP_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + len = MAX_OP_STRING; + break; + } + + buf = (char * ) calloc( len + 1, 1 ); + x86_format_operand( self, buf, len, format ); + + /* drop buffer down to a reasonable size */ + str = strdup( buf ); + free(buf); + return str; + } + + int is_address( ) { + if ( self->type == op_absolute || + self->type == op_offset ) { + return 1; + } + + return 0; + } + + int is_relative( ) { + if ( self->type == op_relative_near || + self->type == op_relative_far ) { + return 1; + } + + return 0; + } + + %newobject copy; + x86_op_t * copy() { + x86_op_t *op = (x86_op_t *) calloc( sizeof(x86_op_t), 1 ); + + if ( op ) { + memcpy( op, self, sizeof(x86_op_t) ); + } + + return op; + } +} + +/* ================================================================== */ +/* operand list class */ +%inline %{ + typedef struct X86_OpListNode { + x86_op_t *op; + struct X86_OpListNode *next, *prev; + } X86_OpListNode; + + typedef struct X86_OpList { + size_t count; + X86_OpListNode *head, *tail, *curr; + } X86_OpList; +%} + +%extend X86_OpList { + X86_OpList () { + X86_OpList *list = (X86_OpList *) + calloc( sizeof(X86_OpList), 1 ); + list->count = 0; + return list; + } + + ~X86_OpList() { + X86_OpListNode *node, *next; + + node = self->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( self ); + } + + X86_OpListNode * first() { + self->curr = self->head; + return self->head; + } + + X86_OpListNode * last() { + self->curr = self->tail; + return self->tail; + } + + X86_OpListNode * next() { + if (! self->curr ) { + self->curr = self->head; + return self->head; + } + + self->curr = self->curr->next; + return self->curr; + } + + X86_OpListNode * prev() { + if (! self->curr ) { + self->curr = self->tail; + return self->tail; + } + + self->curr = self->curr->prev; + return self->curr; + } + + %newobject append; + void append( x86_op_t *op ) { + X86_OpListNode *node = (X86_OpListNode *) + calloc( sizeof(X86_OpListNode) , 1 ); + if (! node ) { + return; + } + + self->count++; + if ( ! self->tail ) { + self->head = self->tail = node; + } else { + self->tail->next = node; + node->prev = self->tail; + self->tail = node; + } + + node->op = x86_op_t_copy( op ); + } +} + +%inline %{ + typedef struct x86_operand_list { + x86_op_t op; + struct x86_operand_list *next; + } x86_oplist_t; +%} + +%extend x86_oplist_t { + %newobject x86_oplist_node_copy; +} + +/* ================================================================== */ +/* instruction class */ +%inline %{ + x86_oplist_t * x86_oplist_node_copy( x86_oplist_t * list ) { + x86_oplist_t *ptr; + ptr = (x86_oplist_t *) calloc( sizeof(x86_oplist_t), 1 ); + if ( ptr ) { + memcpy( &ptr->op, &list->op, sizeof(x86_op_t) ); + } + + return ptr; + } + + enum x86_insn_group { + insn_none = 0, insn_controlflow = 1, + insn_arithmetic = 2, insn_logic = 3, + insn_stack = 4, insn_comparison = 5, + insn_move = 6, insn_string = 7, + insn_bit_manip = 8, insn_flag_manip = 9, + insn_fpu = 10, insn_interrupt = 13, + insn_system = 14, insn_other = 15 + }; + + enum x86_insn_type { + insn_invalid = 0, insn_jmp = 0x1001, + insn_jcc = 0x1002, insn_call = 0x1003, + insn_callcc = 0x1004, insn_return = 0x1005, + insn_add = 0x2001, insn_sub = 0x2002, + insn_mul = 0x2003, insn_div = 0x2004, + insn_inc = 0x2005, insn_dec = 0x2006, + insn_shl = 0x2007, insn_shr = 0x2008, + insn_rol = 0x2009, insn_ror = 0x200A, + insn_and = 0x3001, insn_or = 0x3002, + insn_xor = 0x3003, insn_not = 0x3004, + insn_neg = 0x3005, insn_push = 0x4001, + insn_pop = 0x4002, insn_pushregs = 0x4003, + insn_popregs = 0x4004, insn_pushflags = 0x4005, + insn_popflags = 0x4006, insn_enter = 0x4007, + insn_leave = 0x4008, insn_test = 0x5001, + insn_cmp = 0x5002, insn_mov = 0x6001, + insn_movcc = 0x6002, insn_xchg = 0x6003, + insn_xchgcc = 0x6004, insn_strcmp = 0x7001, + insn_strload = 0x7002, insn_strmov = 0x7003, + insn_strstore = 0x7004, insn_translate = 0x7005, + insn_bittest = 0x8001, insn_bitset = 0x8002, + insn_bitclear = 0x8003, insn_clear_carry = 0x9001, + insn_clear_zero = 0x9002, insn_clear_oflow = 0x9003, + insn_clear_dir = 0x9004, insn_clear_sign = 0x9005, + insn_clear_parity = 0x9006, insn_set_carry = 0x9007, + insn_set_zero = 0x9008, insn_set_oflow = 0x9009, + insn_set_dir = 0x900A, insn_set_sign = 0x900B, + insn_set_parity = 0x900C, insn_tog_carry = 0x9010, + insn_tog_zero = 0x9020, insn_tog_oflow = 0x9030, + insn_tog_dir = 0x9040, insn_tog_sign = 0x9050, + insn_tog_parity = 0x9060, insn_fmov = 0xA001, + insn_fmovcc = 0xA002, insn_fneg = 0xA003, + insn_fabs = 0xA004, insn_fadd = 0xA005, + insn_fsub = 0xA006, insn_fmul = 0xA007, + insn_fdiv = 0xA008, insn_fsqrt = 0xA009, + insn_fcmp = 0xA00A, insn_fcos = 0xA00C, + insn_fldpi = 0xA00D, insn_fldz = 0xA00E, + insn_ftan = 0xA00F, insn_fsine = 0xA010, + insn_fsys = 0xA020, insn_int = 0xD001, + insn_intcc = 0xD002, insn_iret = 0xD003, + insn_bound = 0xD004, insn_debug = 0xD005, + insn_trace = 0xD006, insn_invalid_op = 0xD007, + insn_oflow = 0xD008, insn_halt = 0xE001, + insn_in = 0xE002, insn_out = 0xE003, + insn_cpuid = 0xE004, insn_nop = 0xF001, + insn_bcdconv = 0xF002, insn_szconv = 0xF003 + }; + + enum x86_insn_note { + insn_note_ring0 = 1, + insn_note_smm = 2, + insn_note_serial = 4 + }; + + enum x86_flag_status { + insn_carry_set = 0x1, + insn_zero_set = 0x2, + insn_oflow_set = 0x4, + insn_dir_set = 0x8, + insn_sign_set = 0x10, + insn_parity_set = 0x20, + insn_carry_or_zero_set = 0x40, + insn_zero_set_or_sign_ne_oflow = 0x80, + insn_carry_clear = 0x100, + insn_zero_clear = 0x200, + insn_oflow_clear = 0x400, + insn_dir_clear = 0x800, + insn_sign_clear = 0x1000, + insn_parity_clear = 0x2000, + insn_sign_eq_oflow = 0x4000, + insn_sign_ne_oflow = 0x8000 + }; + + enum x86_insn_cpu { + cpu_8086 = 1, cpu_80286 = 2, + cpu_80386 = 3, cpu_80387 = 4, + cpu_80486 = 5, cpu_pentium = 6, + cpu_pentiumpro = 7, cpu_pentium2 = 8, + cpu_pentium3 = 9, cpu_pentium4 = 10, + cpu_k6 = 16, cpu_k7 = 32, + cpu_athlon = 48 + }; + + enum x86_insn_isa { + isa_gp = 1, isa_fp = 2, + isa_fpumgt = 3, isa_mmx = 4, + isa_sse1 = 5, isa_sse2 = 6, + isa_sse3 = 7, isa_3dnow = 8, + isa_sys = 9 + }; + + enum x86_insn_prefix { + insn_no_prefix = 0, + insn_rep_zero = 1, + insn_rep_notzero = 2, + insn_lock = 4 + }; + + + typedef struct { + unsigned long addr; + unsigned long offset; + enum x86_insn_group group; + enum x86_insn_type type; + enum x86_insn_note note; + unsigned char bytes[MAX_INSN_SIZE]; + unsigned char size; + unsigned char addr_size; + unsigned char op_size; + enum x86_insn_cpu cpu; + enum x86_insn_isa isa; + enum x86_flag_status flags_set; + enum x86_flag_status flags_tested; + unsigned char stack_mod; + long stack_mod_val; + enum x86_insn_prefix prefix; + char prefix_string[MAX_PREFIX_STR]; + char mnemonic[MAX_MNEM_STR]; + x86_oplist_t *operands; + size_t operand_count; + size_t explicit_count; + void *block; + void *function; + int tag; + } x86_insn_t; + + typedef void (*x86_operand_fn)(x86_op_t *op, x86_insn_t *insn, + void *arg); + + enum x86_op_foreach_type { + op_any = 0, + op_dest = 1, + op_src = 2, + op_ro = 3, + op_wo = 4, + op_xo = 5, + op_rw = 6, + op_implicit = 0x10, + op_explicit = 0x20 + }; + + size_t x86_operand_count( x86_insn_t *insn, + enum x86_op_foreach_type type ); + x86_op_t * x86_operand_1st( x86_insn_t *insn ); + x86_op_t * x86_operand_2nd( x86_insn_t *insn ); + x86_op_t * x86_operand_3rd( x86_insn_t *insn ); + long x86_get_rel_offset( x86_insn_t *insn ); + x86_op_t * x86_get_branch_target( x86_insn_t *insn ); + x86_op_t * x86_get_imm( x86_insn_t *insn ); + unsigned char * x86_get_raw_imm( x86_insn_t *insn ); + void x86_set_insn_addr( x86_insn_t *insn, unsigned long addr ); + int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format); + int x86_format_insn(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format); + void x86_oplist_free( x86_insn_t *insn ); + int x86_insn_is_valid( x86_insn_t *insn ); +%} + +%extend x86_insn_t { + x86_insn_t() { + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + return insn; + } + ~x86_insn_t() { + x86_oplist_free( self ); + free( self ); + } + + int is_valid( ) { + return x86_insn_is_valid( self ); + } + + x86_op_t * operand_1st() { + return x86_operand_1st( self ); + } + + x86_op_t * operand_2nd() { + return x86_operand_2nd( self ); + } + + x86_op_t * operand_3rd() { + return x86_operand_3rd( self ); + } + + x86_op_t * operand_dest() { + return x86_operand_1st( self ); + } + + x86_op_t * operand_src() { + return x86_operand_2nd( self ); + } + + size_t num_operands( enum x86_op_foreach_type type ) { + return x86_operand_count( self, type ); + } + + long rel_offset() { + return x86_get_rel_offset( self ); + } + + x86_op_t * branch_target() { + return x86_get_branch_target( self ); + } + + x86_op_t * imm() { + return x86_get_imm( self ); + } + + unsigned char * raw_imm() { + return x86_get_raw_imm( self ); + } + + %newobject format; + char * format( enum x86_asm_format format ) { + char *buf, *str; + size_t len; + + switch ( format ) { + case xml_syntax: + len = MAX_INSN_XML_STRING; + break; + case raw_syntax: + len = MAX_INSN_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + len = MAX_INSN_STRING; + break; + } + + buf = (char * ) calloc( len + 1, 1 ); + x86_format_insn( self, buf, len, format ); + + /* drop buffer down to a reasonable size */ + str = strdup( buf ); + free(buf); + return str; + } + + %newobject format_mnemonic; + char * format_mnemonic( enum x86_asm_format format ) { + char *buf, *str; + size_t len = MAX_MNEM_STR + MAX_PREFIX_STR + 4; + + buf = (char * ) calloc( len, 1 ); + x86_format_mnemonic( self, buf, len, format ); + + /* drop buffer down to a reasonable size */ + str = strdup( buf ); + free(buf); + + return str; + } + + %newobject copy; + x86_insn_t * copy() { + x86_oplist_t *ptr, *list, *last = NULL; + x86_insn_t *insn = (x86_insn_t *) + calloc( sizeof(x86_insn_t), 1 ); + + if ( insn ) { + memcpy( insn, self, sizeof(x86_insn_t) ); + insn->operands = NULL; + insn->block = NULL; + insn->function = NULL; + + /* copy operand list */ + for ( list = self->operands; list; list = list->next ) { + ptr = x86_oplist_node_copy( list ); + + if (! ptr ) { + continue; + } + + if ( insn->operands ) { + last->next = ptr; + } else { + insn->operands = ptr; + } + last = ptr; + } + } + + return insn; + } + + X86_OpList * operand_list( ) { + x86_oplist_t *list = self->operands; + X86_OpList *op_list = new_X86_OpList(); + + for ( list = self->operands; list; list = list->next ) { + X86_OpList_append( op_list, &list->op ); + } + + return op_list; + } +} + +/* ================================================================== */ +/* invariant instruction class */ +%inline %{ + #define X86_WILDCARD_BYTE 0xF4 + + typedef struct { + enum x86_op_type type; + enum x86_op_datatype datatype; + enum x86_op_access access; + enum x86_op_flags flags; + } x86_invariant_op_t; + + typedef struct { + unsigned char bytes[64]; + unsigned int size; + enum x86_insn_group group; + enum x86_insn_type type; + x86_invariant_op_t operands[3]; + } x86_invariant_t; +%} + +%extend x86_invariant_t { + + x86_invariant_t() { + x86_invariant_t *inv = (x86_invariant_t *) + calloc( sizeof(x86_invariant_t), 1 ); + return inv; + } + + ~x86_invariant_t() { + free( self ); + } +} + +/* ================================================================== */ +/* instruction list class */ +%inline %{ + typedef struct X86_InsnListNode { + x86_insn_t *insn; + struct X86_InsnListNode *next, *prev; + } X86_InsnListNode; + + typedef struct X86_InsnList { + size_t count; + X86_InsnListNode *head, *tail, *curr; + } X86_InsnList; +%} + +%extend X86_InsnList { + X86_InsnList () { + X86_InsnList *list = (X86_InsnList *) + calloc( sizeof(X86_InsnList), 1 ); + list->count = 0; + return list; + } + + ~X86_InsnList() { + X86_InsnListNode *node, *next; + + node = self->head; + while ( node ) { + next = node->next; + /* free( node->insn ); */ + free( node ); + node = next; + } + + free( self ); + } + + X86_InsnListNode * first() { return self->head; } + + X86_InsnListNode * last() { return self->tail; } + + X86_InsnListNode * next() { + if (! self->curr ) { + self->curr = self->head; + return self->head; + } + + self->curr = self->curr->next; + return self->curr; + } + + X86_InsnListNode * prev() { + if (! self->curr ) { + self->curr = self->tail; + return self->tail; + } + + self->curr = self->curr->prev; + return self->curr; + } + + %newobject append; + void append( x86_insn_t *insn ) { + X86_InsnListNode *node = (X86_InsnListNode *) + calloc( sizeof(X86_InsnListNode) , 1 ); + if (! node ) { + return; + } + + self->count++; + if ( ! self->tail ) { + self->head = self->tail = node; + } else { + self->tail->next = node; + node->prev = self->tail; + self->tail = node; + } + + node->insn = x86_insn_t_copy( insn ); + } +} + +/* ================================================================== */ +/* address table class */ +/* slight TODO */ + +/* ================================================================== */ +/* Main disassembler class */ +%inline %{ + + enum x86_options { + opt_none= 0, + opt_ignore_nulls=1, + opt_16_bit=2 + }; + enum x86_report_codes { + report_disasm_bounds, + report_insn_bounds, + report_invalid_insn, + report_unknown + }; + + + typedef struct { + enum x86_report_codes last_error; + void * last_error_data; + void * disasm_callback; + void * disasm_resolver; + } X86_Disasm; + + typedef void (*DISASM_REPORTER)( enum x86_report_codes code, + void *data, void *arg ); + typedef void (*DISASM_CALLBACK)( x86_insn_t *insn, void * arg ); + typedef long (*DISASM_RESOLVER)( x86_op_t *op, + x86_insn_t * current_insn, + void *arg ); + + void x86_report_error( enum x86_report_codes code, void *data ); + int x86_init( enum x86_options options, DISASM_REPORTER reporter, + void *arg); + void x86_set_reporter( DISASM_REPORTER reporter, void *arg); + void x86_set_options( enum x86_options options ); + enum x86_options x86_get_options( void ); + int x86_cleanup(void); + int x86_format_header( char *buf, int len, enum x86_asm_format format); + unsigned int x86_endian(void); + unsigned int x86_addr_size(void); + unsigned int x86_op_size(void); + unsigned int x86_word_size(void); + unsigned int x86_max_insn_size(void); + unsigned int x86_sp_reg(void); + unsigned int x86_fp_reg(void); + unsigned int x86_ip_reg(void); + size_t x86_invariant_disasm( unsigned char *buf, int buf_len, + x86_invariant_t *inv ); + size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ); + int x86_disasm( unsigned char *buf, unsigned int buf_len, + unsigned long buf_rva, unsigned int offset, + x86_insn_t * insn ); + int x86_disasm_range( unsigned char *buf, unsigned long buf_rva, + unsigned int offset, unsigned int len, + DISASM_CALLBACK func, void *arg ); + int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, + unsigned long buf_rva, unsigned int offset, + DISASM_CALLBACK func, void *arg, + DISASM_RESOLVER resolver, void *r_arg ); + + void x86_default_reporter( enum x86_report_codes code, + void *data, void *arg ) { + X86_Disasm *dis = (X86_Disasm *) arg; + if ( dis ) { + dis->last_error = code; + dis->last_error_data = data; + } + } + + void x86_default_callback( x86_insn_t *insn, void *arg ) { + X86_InsnList *list = (X86_InsnList *) arg; + if ( list ) { + X86_InsnList_append( list, insn ); + } + } + + /* TODO: resolver stack, maybe a callback */ + long x86_default_resolver( x86_op_t *op, x86_insn_t *insn, void *arg ) { + X86_Disasm *dis = (X86_Disasm *) arg; + if ( dis ) { + //return dis->resolver( op, insn ); + return 0; + } + + return 0; + } + +%} + +%extend X86_Disasm { + + X86_Disasm( ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( opt_none, x86_default_reporter, dis ); + return dis; + } + + X86_Disasm( enum x86_options options ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( options, x86_default_reporter, dis ); + return dis; + } + + X86_Disasm( enum x86_options options, DISASM_REPORTER reporter ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( options, reporter, NULL ); + return dis; + } + + X86_Disasm( enum x86_options options, DISASM_REPORTER reporter, + void * arg ) { + X86_Disasm * dis = (X86_Disasm *) + calloc( sizeof( X86_Disasm ), 1 ); + x86_init( options, reporter, arg ); + return dis; + } + + ~X86_Disasm() { + x86_cleanup(); + free( self ); + } + + void set_options( enum x86_options options ) { + return x86_set_options( options ); + } + + enum x86_options options() { + return x86_get_options(); + } + + void set_callback( void * callback ) { + self->disasm_callback = callback; + } + + void set_resolver( void * callback ) { + self->disasm_resolver = callback; + } + + void report_error( enum x86_report_codes code ) { + x86_report_error( code, NULL ); + } + + %newobject disasm; + x86_insn_t * disasm( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + x86_insn_t *insn = calloc( sizeof( x86_insn_t ), 1 ); + x86_disasm( buf, buf_len, buf_rva, offset, insn ); + return insn; + } + + int disasm_range( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset, + unsigned int len ) { + + X86_InsnList *list = new_X86_InsnList(); + + if ( len > buf_len ) { + len = buf_len; + } + + return x86_disasm_range( buf, buf_rva, offset, len, + x86_default_callback, list ); + } + + int disasm_forward( unsigned char *buf, size_t buf_len, + unsigned long buf_rva, unsigned int offset ) { + X86_InsnList *list = new_X86_InsnList(); + + /* use default resolver: damn SWIG callbacks! */ + return x86_disasm_forward( buf, buf_len, buf_rva, offset, + x86_default_callback, list, + x86_default_resolver, NULL ); + } + + size_t disasm_invariant( unsigned char *buf, size_t buf_len, + x86_invariant_t *inv ) { + return x86_invariant_disasm( buf, buf_len, inv ); + } + + size_t disasm_size( unsigned char *buf, size_t buf_len ) { + return x86_size_disasm( buf, buf_len ); + } + + %newobject format_header; + char * format_header( enum x86_asm_format format) { + char *buf, *str; + size_t len; + + switch ( format ) { + /* these were obtained from x86_format.c */ + case xml_syntax: + len = 679; break; + case raw_syntax: + len = 172; break; + case native_syntax: + len = 35; break; + case intel_syntax: + len = 23; break; + case att_syntax: + len = 23; break; + case unknown_syntax: + default: + len = 23; break; + } + + buf = (char * ) calloc( len + 1, 1 ); + x86_format_header( buf, len, format ); + + return buf; + } + + unsigned int endian() { + return x86_endian(); + } + + unsigned int addr_size() { + return x86_addr_size(); + } + + unsigned int op_size() { + return x86_op_size(); + } + + unsigned int word_size() { + return x86_word_size(); + } + + unsigned int max_insn_size() { + return x86_max_insn_size(); + } + + unsigned int sp_reg() { + return x86_sp_reg(); + } + + unsigned int fp_reg() { + return x86_fp_reg(); + } + + unsigned int ip_reg() { + return x86_ip_reg(); + } + + %newobject reg_from_id; + x86_reg_t * reg_from_id( unsigned int id ) { + x86_reg_t * reg = calloc( sizeof(x86_reg_t), 1 ); + x86_reg_from_id( id, reg ); + return reg; + } + + unsigned char wildcard_byte() { return X86_WILDCARD_BYTE; } + + int max_register_string() { return MAX_REGNAME; } + + int max_prefix_string() { return MAX_PREFIX_STR; } + + int max_mnemonic_string() { return MAX_MNEM_STR; } + + int max_operand_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_OP_XML_STRING; + break; + case raw_syntax: + return MAX_OP_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_OP_STRING; + break; + } + } + + + int max_insn_string( enum x86_asm_format format ) { + switch ( format ) { + case xml_syntax: + return MAX_INSN_XML_STRING; + break; + case raw_syntax: + return MAX_INSN_RAW_STRING; + break; + case native_syntax: + case intel_syntax: + case att_syntax: + case unknown_syntax: + default: + return MAX_INSN_STRING; + break; + } + } + + int max_num_operands( ) { return MAX_NUM_OPERANDS; } +} + +/* python callback, per the manual */ +/*%typemap(python,in) PyObject *pyfunc { + if (!PyCallable_Check($source)) { + PyErr_SetString(PyExc_TypeError, "Need a callable object!"); + return NULL; + } + $target = $source; +}*/ + +/* python FILE * callback, per the manual */ +/* +%typemap(python,in) FILE * { + if (!PyFile_Check($source)) { + PyErr_SetString(PyExc_TypeError, "Need a file!"); + return NULL; + } + $target = PyFile_AsFile($source); +}*/ + + diff --git a/spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb b/spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb new file mode 100644 index 000000000..4e7432643 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb @@ -0,0 +1,4 @@ +require 'mkmf' +find_library('disasm', 'x86_init', "/usr/local/lib", "../..") +create_makefile('x86disasm') + diff --git a/spotify/breakpad/third_party/libdisasm/x86_disasm.c b/spotify/breakpad/third_party/libdisasm/x86_disasm.c new file mode 100644 index 000000000..04574fa05 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_disasm.c @@ -0,0 +1,210 @@ +#include +#include +#include + +#include "libdis.h" +#include "ia32_insn.h" +#include "ia32_invariant.h" +#include "x86_operand_list.h" + + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + +unsigned int x86_disasm( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + x86_insn_t *insn ){ + int len, size; + unsigned char bytes[MAX_INSTRUCTION_SIZE]; + + if ( ! buf || ! insn || ! buf_len ) { + /* caller screwed up somehow */ + return 0; + } + + + /* ensure we are all NULLed up */ + memset( insn, 0, sizeof(x86_insn_t) ); + insn->addr = buf_rva + offset; + insn->offset = offset; + /* default to invalid insn */ + insn->type = insn_invalid; + insn->group = insn_none; + + if ( offset >= buf_len ) { + /* another caller screwup ;) */ + x86_report_error(report_disasm_bounds, (void*)(long)buf_rva+offset); + return 0; + } + + len = buf_len - offset; + + /* copy enough bytes for disassembly into buffer : this + * helps prevent buffer overruns at the end of a file */ + memset( bytes, 0, MAX_INSTRUCTION_SIZE ); + memcpy( bytes, &buf[offset], (len < MAX_INSTRUCTION_SIZE) ? len : + MAX_INSTRUCTION_SIZE ); + + /* actually do the disassembly */ + /* TODO: allow switching when more disassemblers are added */ + size = ia32_disasm_addr( bytes, len, insn); + + /* check and see if we had an invalid instruction */ + if (! size ) { + x86_report_error(report_invalid_insn, (void*)(long)buf_rva+offset ); + return 0; + } + + /* check if we overran the end of the buffer */ + if ( size > len ) { + x86_report_error( report_insn_bounds, (void*)(long)buf_rva + offset ); + MAKE_INVALID( insn, bytes ); + return 0; + } + + /* fill bytes field of insn */ + memcpy( insn->bytes, bytes, size ); + + return size; +} + +unsigned int x86_disasm_range( unsigned char *buf, uint32_t buf_rva, + unsigned int offset, unsigned int len, + DISASM_CALLBACK func, void *arg ) { + x86_insn_t insn; + unsigned int buf_len, size, count = 0, bytes = 0; + + /* buf_len is implied by the arguments */ + buf_len = len + offset; + + while ( bytes < len ) { + size = x86_disasm( buf, buf_len, buf_rva, offset + bytes, + &insn ); + if ( size ) { + /* invoke callback if it exists */ + if ( func ) { + (*func)( &insn, arg ); + } + bytes += size; + count ++; + } else { + /* error */ + bytes++; /* try next byte */ + } + + x86_oplist_free( &insn ); + } + + return( count ); +} + +static inline int follow_insn_dest( x86_insn_t *insn ) { + if ( insn->type == insn_jmp || insn->type == insn_jcc || + insn->type == insn_call || insn->type == insn_callcc ) { + return(1); + } + return(0); +} + +static inline int insn_doesnt_return( x86_insn_t *insn ) { + return( (insn->type == insn_jmp || insn->type == insn_return) ? 1: 0 ); +} + +static int32_t internal_resolver( x86_op_t *op, x86_insn_t *insn ){ + int32_t next_addr = -1; + if ( x86_optype_is_address(op->type) ) { + next_addr = op->data.sdword; + } else if ( op->type == op_relative_near ) { + next_addr = insn->addr + insn->size + op->data.relative_near; + } else if ( op->type == op_relative_far ) { + next_addr = insn->addr + insn->size + op->data.relative_far; + } + return( next_addr ); +} + +unsigned int x86_disasm_forward( unsigned char *buf, unsigned int buf_len, + uint32_t buf_rva, unsigned int offset, + DISASM_CALLBACK func, void *arg, + DISASM_RESOLVER resolver, void *r_arg ){ + x86_insn_t insn; + x86_op_t *op; + int32_t next_addr; + uint32_t next_offset; + unsigned int size, count = 0, bytes = 0, cont = 1; + + while ( cont && bytes < buf_len ) { + size = x86_disasm( buf, buf_len, buf_rva, offset + bytes, + &insn ); + + if ( size ) { + /* invoke callback if it exists */ + if ( func ) { + (*func)( &insn, arg ); + } + bytes += size; + count ++; + } else { + /* error */ + bytes++; /* try next byte */ + } + + if ( follow_insn_dest(&insn) ) { + op = x86_get_dest_operand( &insn ); + next_addr = -1; + + /* if caller supplied a resolver, use it to determine + * the address to disassemble */ + if ( resolver ) { + next_addr = resolver(op, &insn, r_arg); + } else { + next_addr = internal_resolver(op, &insn); + } + + if (next_addr != -1 ) { + next_offset = next_addr - buf_rva; + /* if offset is in this buffer... */ + if ( next_offset >= 0 && + next_offset < buf_len ) { + /* go ahead and disassemble */ + count += x86_disasm_forward( buf, + buf_len, + buf_rva, + next_offset, + func, arg, + resolver, r_arg ); + } else { + /* report unresolved address */ + x86_report_error( report_disasm_bounds, + (void*)(long)next_addr ); + } + } + } /* end follow_insn */ + + if ( insn_doesnt_return(&insn) ) { + /* stop disassembling */ + cont = 0; + } + + x86_oplist_free( &insn ); + } + return( count ); +} + +/* invariant instruction representation */ +size_t x86_invariant_disasm( unsigned char *buf, int buf_len, + x86_invariant_t *inv ){ + if (! buf || ! buf_len || ! inv ) { + return(0); + } + + return ia32_disasm_invariant(buf, buf_len, inv); +} +size_t x86_size_disasm( unsigned char *buf, unsigned int buf_len ) { + if (! buf || ! buf_len ) { + return(0); + } + + return ia32_disasm_size(buf, buf_len); +} diff --git a/spotify/breakpad/third_party/libdisasm/x86_format.c b/spotify/breakpad/third_party/libdisasm/x86_format.c new file mode 100644 index 000000000..0ec960dc8 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_format.c @@ -0,0 +1,1430 @@ +#include +#include +#include + +#include "libdis.h" +#include + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + + +/* + * concatenation macros. STRNCATF concatenates a format string, buf + * only with one argument. + */ +#define STRNCAT( buf, str, len ) do { \ + int _i = strlen(str), _blen = strlen(buf), _len = len - 1; \ + if ( len ) { \ + strncat( buf, str, _len ); \ + if ( _len <= _i ) { \ + buf[_blen+_len] = '\0'; \ + len = 0; \ + } else { \ + len -= _i; \ + } \ + } \ +} while( 0 ) + +#define STRNCATF( buf, fmt, data, len ) do { \ + char _tmp[MAX_OP_STRING]; \ + \ + snprintf( _tmp, sizeof _tmp, fmt, data ); \ + STRNCAT( buf, _tmp, len ); \ +} while( 0 ) + + +#define PRINT_DISPLACEMENT( ea ) do { \ + if ( ea->disp_size && ea->disp ) { \ + if ( ea->disp_sign ) { \ + STRNCATF( buf, "-0x%" PRIX32, -ea->disp, len ); \ + } else { \ + STRNCATF( buf, "0x%" PRIX32, ea->disp, len ); \ + } \ + } \ +} while( 0 ) + +static const char *prefix_strings[] = { + "", /* no prefix */ + "repz ", /* the trailing spaces make it easy to prepend to mnemonic */ + "repnz ", + "lock ", + "branch delay " /* unused in x86 */ +}; + +static int format_insn_prefix_str( enum x86_insn_prefix prefix, char *buf, + int len ) { + + int len_orig = len; + + /* concat all prefix strings */ + if ( prefix & 1 ) { STRNCAT( buf, prefix_strings[1], len ); } + if ( prefix & 2 ) { STRNCAT( buf, prefix_strings[2], len ); } + if ( prefix & 4 ) { STRNCAT( buf, prefix_strings[3], len ); } + if ( prefix & 8 ) { STRNCAT( buf, prefix_strings[4], len ); } + + /* return the number of characters added */ + return (len_orig - len); +} + +/* + * sprint's an operand's data to string str. + */ +static void get_operand_data_str( x86_op_t *op, char *str, int len ){ + + if ( op->flags & op_signed ) { + switch ( op->datatype ) { + case op_byte: + snprintf( str, len, "%" PRId8, op->data.sbyte ); + return; + case op_word: + snprintf( str, len, "%" PRId16, op->data.sword ); + return; + case op_qword: + snprintf( str, len, "%" PRId64, op->data.sqword ); + return; + default: + snprintf( str, len, "%" PRId32, op->data.sdword ); + return; + } + } + + //else + switch ( op->datatype ) { + case op_byte: + snprintf( str, len, "0x%02" PRIX8, op->data.byte ); + return; + case op_word: + snprintf( str, len, "0x%04" PRIX16, op->data.word ); + return; + case op_qword: + snprintf( str, len, "0x%08" PRIX64,op->data.sqword ); + return; + default: + snprintf( str, len, "0x%08" PRIX32, op->data.dword ); + return; + } +} + +/* + * sprints register types to a string. the register types can be ORed + * together. + */ +static void get_operand_regtype_str( int regtype, char *str, int len ) +{ + static struct { + const char *name; + int value; + } operand_regtypes[] = { + {"reg_gen" , 0x00001}, + {"reg_in" , 0x00002}, + {"reg_out" , 0x00004}, + {"reg_local" , 0x00008}, + {"reg_fpu" , 0x00010}, + {"reg_seg" , 0x00020}, + {"reg_simd" , 0x00040}, + {"reg_sys" , 0x00080}, + {"reg_sp" , 0x00100}, + {"reg_fp" , 0x00200}, + {"reg_pc" , 0x00400}, + {"reg_retaddr", 0x00800}, + {"reg_cond" , 0x01000}, + {"reg_zero" , 0x02000}, + {"reg_ret" , 0x04000}, + {"reg_src" , 0x10000}, + {"reg_dest" , 0x20000}, + {"reg_count" , 0x40000}, + {NULL, 0}, //end + }; + + unsigned int i; + + memset( str, 0, len ); + + //go thru every type in the enum + for ( i = 0; operand_regtypes[i].name; i++ ) { + //skip if type is not set + if(! (regtype & operand_regtypes[i].value) ) + continue; + + //not the first time around + if( str[0] ) { + STRNCAT( str, " ", len ); + } + + STRNCAT(str, operand_regtypes[i].name, len ); + } +} + +static int format_expr( x86_ea_t *ea, char *buf, int len, + enum x86_asm_format format ) { + char str[MAX_OP_STRING]; + + if ( format == att_syntax ) { + if (ea->base.name[0] || ea->index.name[0] || ea->scale) { + PRINT_DISPLACEMENT(ea); + STRNCAT( buf, "(", len ); + + if ( ea->base.name[0]) { + STRNCATF( buf, "%%%s", ea->base.name, len ); + } + if ( ea->index.name[0]) { + STRNCATF( buf, ",%%%s", ea->index.name, len ); + if ( ea->scale > 1 ) { + STRNCATF( buf, ",%d", ea->scale, len ); + } + } + /* handle the syntactic exception */ + if ( ! ea->base.name[0] && + ! ea->index.name[0] ) { + STRNCATF( buf, ",%d", ea->scale, len ); + } + + STRNCAT( buf, ")", len ); + } else + STRNCATF( buf, "0x%" PRIX32, ea->disp, len ); + + } else if ( format == xml_syntax ){ + + if ( ea->base.name[0]) { + STRNCAT (buf, "\t\t\t\n", len); + + get_operand_regtype_str (ea->base.type, str, + sizeof str); + STRNCAT (buf, "\t\t\t\tbase.name, len); + STRNCATF (buf, "type=\"%s\" ", str, len); + STRNCATF (buf, "size=%d/>\n", ea->base.size, len); + + STRNCAT (buf, "\t\t\t\n", len); + } + + if ( ea->index.name[0]) { + STRNCAT (buf, "\t\t\t\n", len); + + get_operand_regtype_str (ea->index.type, str, + sizeof str); + + STRNCAT (buf, "\t\t\t\tindex.name, len); + STRNCATF (buf, "type=\"%s\" ", str, len); + STRNCATF (buf, "size=%d/>\n", ea->index.size, len); + + STRNCAT (buf, "\t\t\t\n", len); + } + + //scale + STRNCAT (buf, "\t\t\t\n", len); + STRNCAT (buf, "\t\t\t\t\n", ea->scale, len); + STRNCAT (buf, "\t\t\t\n", len); + + if ( ea->disp_size ) { + + STRNCAT (buf, "\t\t\t\n", len); + + if ( ea->disp_size > 1 && ! ea->disp_sign ) { + STRNCAT (buf, "\t\t\t\t
\n", ea->disp, + len); + } else { + STRNCAT (buf, "\t\t\t\t\n", ea->disp, len); + } + + STRNCAT (buf, "\t\t\t\n", len); + } + + } else if ( format == raw_syntax ) { + + PRINT_DISPLACEMENT(ea); + STRNCAT( buf, "(", len ); + + STRNCATF( buf, "%s,", ea->base.name, len ); + STRNCATF( buf, "%s,", ea->index.name, len ); + STRNCATF( buf, "%d", ea->scale, len ); + STRNCAT( buf, ")", len ); + + } else { + + STRNCAT( buf, "[", len ); + + if ( ea->base.name[0] ) { + STRNCAT( buf, ea->base.name, len ); + if ( ea->index.name[0] || + (ea->disp_size && ! ea->disp_sign) ) { + STRNCAT( buf, "+", len ); + } + } + if ( ea->index.name[0] ) { + STRNCAT( buf, ea->index.name, len ); + if ( ea->scale > 1 ) + { + STRNCATF( buf, "*%" PRId32, ea->scale, len ); + } + if ( ea->disp_size && ! ea->disp_sign ) + { + STRNCAT( buf, "+", len ); + } + } + + if ( ea->disp_size || (! ea->index.name[0] && + ! ea->base.name[0] ) ) + { + PRINT_DISPLACEMENT(ea); + } + + STRNCAT( buf, "]", len ); + } + + return( strlen(buf) ); +} + +static int format_seg( x86_op_t *op, char *buf, int len, + enum x86_asm_format format ) { + int len_orig = len; + const char *reg = ""; + + if (! op || ! buf || ! len || ! op->flags) { + return(0); + } + if ( op->type != op_offset && op->type != op_expression ){ + return(0); + } + if (! ((int) op->flags & 0xF00) ) { + return(0); + } + + switch (op->flags & 0xF00) { + case op_es_seg: reg = "es"; break; + case op_cs_seg: reg = "cs"; break; + case op_ss_seg: reg = "ss"; break; + case op_ds_seg: reg = "ds"; break; + case op_fs_seg: reg = "fs"; break; + case op_gs_seg: reg = "gs"; break; + default: + break; + } + + if (! reg[0] ) { + return( 0 ); + } + + switch( format ) { + case xml_syntax: + STRNCAT( buf, "\t\t\t\n", reg, len ); + break; + case att_syntax: + STRNCATF( buf, "%%%s:", reg, len ); + break; + + default: + STRNCATF( buf, "%s:", reg, len ); + break; + } + + return( len_orig - len ); /* return length of appended string */ +} + +static const char *get_operand_datatype_str( x86_op_t *op ){ + + static const char *types[] = { + "sbyte", /* 0 */ + "sword", + "sqword", + "sdword", + "sdqword", /* 4 */ + "byte", + "word", + "qword", + "dword", /* 8 */ + "dqword", + "sreal", + "dreal", + "extreal", /* 12 */ + "bcd", + "ssimd", + "dsimd", + "sssimd", /* 16 */ + "sdsimd", + "descr32", + "descr16", + "pdescr32", /* 20 */ + "pdescr16", + "bounds16", + "bounds32", + "fpu_env16", + "fpu_env32", /* 25 */ + "fpu_state16", + "fpu_state32", + "fp_reg_set" + }; + + /* handle signed values first */ + if ( op->flags & op_signed ) { + switch (op->datatype) { + case op_byte: return types[0]; + case op_word: return types[1]; + case op_qword: return types[2]; + case op_dqword: return types[4]; + default: return types[3]; + } + } + + switch (op->datatype) { + case op_byte: return types[5]; + case op_word: return types[6]; + case op_qword: return types[7]; + case op_dqword: return types[9]; + case op_sreal: return types[10]; + case op_dreal: return types[11]; + case op_extreal: return types[12]; + case op_bcd: return types[13]; + case op_ssimd: return types[14]; + case op_dsimd: return types[15]; + case op_sssimd: return types[16]; + case op_sdsimd: return types[17]; + case op_descr32: return types[18]; + case op_descr16: return types[19]; + case op_pdescr32: return types[20]; + case op_pdescr16: return types[21]; + case op_bounds16: return types[22]; + case op_bounds32: return types[23]; + case op_fpustate16: return types[24]; + case op_fpustate32: return types[25]; + case op_fpuenv16: return types[26]; + case op_fpuenv32: return types[27]; + case op_fpregset: return types[28]; + default: return types[8]; + } +} + +static int format_insn_eflags_str( enum x86_flag_status flags, char *buf, + int len) { + + static struct { + const char *name; + int value; + } insn_flags[] = { + { "carry_set ", 0x0001 }, + { "zero_set ", 0x0002 }, + { "oflow_set ", 0x0004 }, + { "dir_set ", 0x0008 }, + { "sign_set ", 0x0010 }, + { "parity_set ", 0x0020 }, + { "carry_or_zero_set ", 0x0040 }, + { "zero_set_or_sign_ne_oflow ", 0x0080 }, + { "carry_clear ", 0x0100 }, + { "zero_clear ", 0x0200 }, + { "oflow_clear ", 0x0400 }, + { "dir_clear ", 0x0800 }, + { "sign_clear ", 0x1000 }, + { "parity_clear ", 0x2000 }, + { "sign_eq_oflow ", 0x4000 }, + { "sign_ne_oflow ", 0x8000 }, + { NULL, 0x0000 }, //end + }; + + unsigned int i; + int len_orig = len; + + for (i = 0; insn_flags[i].name; i++) { + if (! (flags & insn_flags[i].value) ) + continue; + + STRNCAT( buf, insn_flags[i].name, len ); + } + + return( len_orig - len ); +} + +static const char *get_insn_group_str( enum x86_insn_group gp ) { + + static const char *types[] = { + "", // 0 + "controlflow",// 1 + "arithmetic", // 2 + "logic", // 3 + "stack", // 4 + "comparison", // 5 + "move", // 6 + "string", // 7 + "bit_manip", // 8 + "flag_manip", // 9 + "fpu", // 10 + "", // 11 + "", // 12 + "interrupt", // 13 + "system", // 14 + "other", // 15 + }; + + if ( gp > sizeof (types)/sizeof(types[0]) ) + return ""; + + return types[gp]; +} + +static const char *get_insn_type_str( enum x86_insn_type type ) { + + static struct { + const char *name; + int value; + } types[] = { + /* insn_controlflow */ + { "jmp", 0x1001 }, + { "jcc", 0x1002 }, + { "call", 0x1003 }, + { "callcc", 0x1004 }, + { "return", 0x1005 }, + { "loop", 0x1006 }, + /* insn_arithmetic */ + { "add", 0x2001 }, + { "sub", 0x2002 }, + { "mul", 0x2003 }, + { "div", 0x2004 }, + { "inc", 0x2005 }, + { "dec", 0x2006 }, + { "shl", 0x2007 }, + { "shr", 0x2008 }, + { "rol", 0x2009 }, + { "ror", 0x200A }, + /* insn_logic */ + { "and", 0x3001 }, + { "or", 0x3002 }, + { "xor", 0x3003 }, + { "not", 0x3004 }, + { "neg", 0x3005 }, + /* insn_stack */ + { "push", 0x4001 }, + { "pop", 0x4002 }, + { "pushregs", 0x4003 }, + { "popregs", 0x4004 }, + { "pushflags", 0x4005 }, + { "popflags", 0x4006 }, + { "enter", 0x4007 }, + { "leave", 0x4008 }, + /* insn_comparison */ + { "test", 0x5001 }, + { "cmp", 0x5002 }, + /* insn_move */ + { "mov", 0x6001 }, /* move */ + { "movcc", 0x6002 }, /* conditional move */ + { "xchg", 0x6003 }, /* exchange */ + { "xchgcc", 0x6004 }, /* conditional exchange */ + /* insn_string */ + { "strcmp", 0x7001 }, + { "strload", 0x7002 }, + { "strmov", 0x7003 }, + { "strstore", 0x7004 }, + { "translate", 0x7005 }, /* xlat */ + /* insn_bit_manip */ + { "bittest", 0x8001 }, + { "bitset", 0x8002 }, + { "bitclear", 0x8003 }, + /* insn_flag_manip */ + { "clear_carry", 0x9001 }, + { "clear_zero", 0x9002 }, + { "clear_oflow", 0x9003 }, + { "clear_dir", 0x9004 }, + { "clear_sign", 0x9005 }, + { "clear_parity", 0x9006 }, + { "set_carry", 0x9007 }, + { "set_zero", 0x9008 }, + { "set_oflow", 0x9009 }, + { "set_dir", 0x900A }, + { "set_sign", 0x900B }, + { "set_parity", 0x900C }, + { "tog_carry", 0x9010 }, + { "tog_zero", 0x9020 }, + { "tog_oflow", 0x9030 }, + { "tog_dir", 0x9040 }, + { "tog_sign", 0x9050 }, + { "tog_parity", 0x9060 }, + /* insn_fpu */ + { "fmov", 0xA001 }, + { "fmovcc", 0xA002 }, + { "fneg", 0xA003 }, + { "fabs", 0xA004 }, + { "fadd", 0xA005 }, + { "fsub", 0xA006 }, + { "fmul", 0xA007 }, + { "fdiv", 0xA008 }, + { "fsqrt", 0xA009 }, + { "fcmp", 0xA00A }, + { "fcos", 0xA00C }, + { "fldpi", 0xA00D }, + { "fldz", 0xA00E }, + { "ftan", 0xA00F }, + { "fsine", 0xA010 }, + { "fsys", 0xA020 }, + /* insn_interrupt */ + { "int", 0xD001 }, + { "intcc", 0xD002 }, /* not present in x86 ISA */ + { "iret", 0xD003 }, + { "bound", 0xD004 }, + { "debug", 0xD005 }, + { "trace", 0xD006 }, + { "invalid_op", 0xD007 }, + { "oflow", 0xD008 }, + /* insn_system */ + { "halt", 0xE001 }, + { "in", 0xE002 }, /* input from port/bus */ + { "out", 0xE003 }, /* output to port/bus */ + { "cpuid", 0xE004 }, + /* insn_other */ + { "nop", 0xF001 }, + { "bcdconv", 0xF002 }, /* convert to or from BCD */ + { "szconv", 0xF003 }, /* change size of operand */ + { NULL, 0 }, //end + }; + + unsigned int i; + + //go thru every type in the enum + for ( i = 0; types[i].name; i++ ) { + if ( types[i].value == type ) + return types[i].name; + } + + return ""; +} + +static const char *get_insn_cpu_str( enum x86_insn_cpu cpu ) { + static const char *intel[] = { + "", // 0 + "8086", // 1 + "80286", // 2 + "80386", // 3 + "80387", // 4 + "80486", // 5 + "Pentium", // 6 + "Pentium Pro", // 7 + "Pentium 2", // 8 + "Pentium 3", // 9 + "Pentium 4" // 10 + }; + + if ( cpu < sizeof(intel)/sizeof(intel[0]) ) { + return intel[cpu]; + } else if ( cpu == 16 ) { + return "K6"; + } else if ( cpu == 32 ) { + return "K7"; + } else if ( cpu == 48 ) { + return "Athlon"; + } + + return ""; +} + +static const char *get_insn_isa_str( enum x86_insn_isa isa ) { + static const char *subset[] = { + NULL, // 0 + "General Purpose", // 1 + "Floating Point", // 2 + "FPU Management", // 3 + "MMX", // 4 + "SSE", // 5 + "SSE2", // 6 + "SSE3", // 7 + "3DNow!", // 8 + "System" // 9 + }; + + if ( isa > sizeof (subset)/sizeof(subset[0]) ) { + return ""; + } + + return subset[isa]; +} + +static int format_operand_att( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_STRING]; + + memset (str, 0, sizeof str); + + switch ( op->type ) { + case op_register: + STRNCATF( buf, "%%%s", op->data.reg.name, len ); + break; + + case op_immediate: + get_operand_data_str( op, str, sizeof str ); + STRNCATF( buf, "$%s", str, len ); + break; + + case op_relative_near: + STRNCATF( buf, "0x%08X", + (unsigned int)(op->data.sbyte + + insn->addr + insn->size), len ); + break; + + case op_relative_far: + if (op->datatype == op_word) { + STRNCATF( buf, "0x%08X", + (unsigned int)(op->data.sword + + insn->addr + insn->size), len ); + } else { + STRNCATF( buf, "0x%08X", + (unsigned int)(op->data.sdword + + insn->addr + insn->size), len ); + } + break; + + case op_absolute: + /* ATT uses the syntax $section, $offset */ + STRNCATF( buf, "$0x%04" PRIX16 ", ", op->data.absolute.segment, + len ); + if (op->datatype == op_descr16) { + STRNCATF( buf, "$0x%04" PRIX16, + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "$0x%08" PRIX32, + op->data.absolute.offset.off32, len ); + } + break; + case op_offset: + /* ATT requires a '*' before JMP/CALL ops */ + if (insn->type == insn_jmp || insn->type == insn_call) + STRNCAT( buf, "*", len ); + + len -= format_seg( op, buf, len, att_syntax ); + STRNCATF( buf, "0x%08" PRIX32, op->data.sdword, len ); + break; + + case op_expression: + /* ATT requires a '*' before JMP/CALL ops */ + if (insn->type == insn_jmp || insn->type == insn_call) + STRNCAT( buf, "*", len ); + + len -= format_seg( op, buf, len, att_syntax ); + len -= format_expr( &op->data.expression, buf, len, + att_syntax ); + break; + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return ( strlen( buf ) ); +} + +static int format_operand_native( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_STRING]; + + switch (op->type) { + case op_register: + STRNCAT( buf, op->data.reg.name, len ); + break; + + case op_immediate: + get_operand_data_str( op, str, sizeof str ); + STRNCAT( buf, str, len ); + break; + + case op_relative_near: + STRNCATF( buf, "0x%08" PRIX32, + (unsigned int)(op->data.sbyte + + insn->addr + insn->size), len ); + break; + + case op_relative_far: + if ( op->datatype == op_word ) { + STRNCATF( buf, "0x%08" PRIX32, + (unsigned int)(op->data.sword + + insn->addr + insn->size), len ); + break; + } else { + STRNCATF( buf, "0x%08" PRIX32, op->data.sdword + + insn->addr + insn->size, len ); + } + break; + + case op_absolute: + STRNCATF( buf, "$0x%04" PRIX16 ":", op->data.absolute.segment, + len ); + if (op->datatype == op_descr16) { + STRNCATF( buf, "0x%04" PRIX16, + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "0x%08" PRIX32, + op->data.absolute.offset.off32, len ); + } + break; + + case op_offset: + len -= format_seg( op, buf, len, native_syntax ); + STRNCATF( buf, "[0x%08" PRIX32 "]", op->data.sdword, len ); + break; + + case op_expression: + len -= format_seg( op, buf, len, native_syntax ); + len -= format_expr( &op->data.expression, buf, len, + native_syntax ); + break; + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return( strlen( buf ) ); +} + +static int format_operand_xml( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_STRING] = "\0"; + + switch (op->type) { + case op_register: + + get_operand_regtype_str( op->data.reg.type, str, + sizeof str ); + + STRNCAT( buf, "\t\tdata.reg.name, len ); + STRNCATF( buf, "type=\"%s\" ", str, len ); + STRNCATF( buf, "size=%d/>\n", op->data.reg.size, len ); + break; + + case op_immediate: + + get_operand_data_str( op, str, sizeof str ); + + STRNCAT( buf, "\t\t\n", str, len ); + break; + + case op_relative_near: + STRNCAT( buf, "\t\t\n", + (unsigned int)(op->data.sbyte + + insn->addr + insn->size), len ); + break; + + case op_relative_far: + STRNCAT( buf, "\t\tdatatype == op_word) { + STRNCATF( buf, "value=\"0x%08" PRIX32 "\"/>\n", + (unsigned int)(op->data.sword + + insn->addr + insn->size), len); + break; + } else { + + STRNCATF( buf, "value=\"0x%08" PRIX32 "\"/>\n", + op->data.sdword + insn->addr + insn->size, + len ); + } + break; + + case op_absolute: + + STRNCATF( buf, + "\t\tdata.absolute.segment, len ); + + if (op->datatype == op_descr16) { + STRNCATF( buf, "offset=\"0x%04" PRIX16 "\">", + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "offset=\"0x%08" PRIX32 "\">", + op->data.absolute.offset.off32, len ); + } + + STRNCAT( buf, "\t\t\n", len ); + break; + + case op_expression: + + + STRNCAT( buf, "\t\t\n", len ); + + len -= format_seg( op, buf, len, xml_syntax ); + len -= format_expr( &op->data.expression, buf, len, + xml_syntax ); + + STRNCAT( buf, "\t\t\n", len ); + break; + + case op_offset: + + STRNCAT( buf, "\t\t\n", len ); + + len -= format_seg( op, buf, len, xml_syntax ); + + STRNCAT( buf, "\t\t\t
\n", + op->data.sdword, len ); + STRNCAT( buf, "\t\t\n", len ); + break; + + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return( strlen( buf ) ); +} + +static int format_operand_raw( x86_op_t *op, x86_insn_t *insn, char *buf, + int len){ + + char str[MAX_OP_RAW_STRING]; + const char *datatype = get_operand_datatype_str(op); + + switch (op->type) { + case op_register: + + get_operand_regtype_str( op->data.reg.type, str, + sizeof str ); + + STRNCAT( buf, "reg|", len ); + STRNCATF( buf, "%s|", datatype, len ); + STRNCATF( buf, "%s:", op->data.reg.name, len ); + STRNCATF( buf, "%s:", str, len ); + STRNCATF( buf, "%d|", op->data.reg.size, len ); + break; + + case op_immediate: + + get_operand_data_str( op, str, sizeof str ); + + STRNCAT( buf, "immediate|", len ); + STRNCATF( buf, "%s|", datatype, len ); + STRNCATF( buf, "%s|", str, len ); + break; + + case op_relative_near: + /* NOTE: in raw format, we print the + * relative offset, not the actual + * address of the jump target */ + + STRNCAT( buf, "relative|", len ); + STRNCATF( buf, "%s|", datatype, len ); + STRNCATF( buf, "%" PRId8 "|", op->data.sbyte, len ); + break; + + case op_relative_far: + + STRNCAT( buf, "relative|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + if (op->datatype == op_word) { + STRNCATF( buf, "%" PRId16 "|", op->data.sword, len); + break; + } else { + STRNCATF( buf, "%" PRId32 "|", op->data.sdword, len ); + } + break; + + case op_absolute: + + STRNCAT( buf, "absolute_address|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + STRNCATF( buf, "$0x%04" PRIX16 ":", op->data.absolute.segment, + len ); + if (op->datatype == op_descr16) { + STRNCATF( buf, "0x%04" PRIX16 "|", + op->data.absolute.offset.off16, len ); + } else { + STRNCATF( buf, "0x%08" PRIX32 "|", + op->data.absolute.offset.off32, len ); + } + + break; + + case op_expression: + + STRNCAT( buf, "address_expression|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + len -= format_seg( op, buf, len, native_syntax ); + len -= format_expr( &op->data.expression, buf, len, + raw_syntax ); + + STRNCAT( buf, "|", len ); + break; + + case op_offset: + + STRNCAT( buf, "segment_offset|", len ); + STRNCATF( buf, "%s|", datatype, len ); + + len -= format_seg( op, buf, len, xml_syntax ); + + STRNCATF( buf, "%08" PRIX32 "|", op->data.sdword, len ); + break; + + case op_unused: + case op_unknown: + /* return 0-truncated buffer */ + break; + } + + return( strlen( buf ) ); +} + +int x86_format_operand( x86_op_t *op, char *buf, int len, + enum x86_asm_format format ){ + x86_insn_t *insn; + + if ( ! op || ! buf || len < 1 ) { + return(0); + } + + /* insn is stored in x86_op_t since .21-pre3 */ + insn = (x86_insn_t *) op->insn; + + memset( buf, 0, len ); + + switch ( format ) { + case att_syntax: + return format_operand_att( op, insn, buf, len ); + case xml_syntax: + return format_operand_xml( op, insn, buf, len ); + case raw_syntax: + return format_operand_raw( op, insn, buf, len ); + case native_syntax: + case intel_syntax: + default: + return format_operand_native( op, insn, buf, len ); + } +} + +#define is_imm_jmp(op) (op->type == op_absolute || \ + op->type == op_immediate || \ + op->type == op_offset) +#define is_memory_op(op) (op->type == op_absolute || \ + op->type == op_expression || \ + op->type == op_offset) + +static int format_att_mnemonic( x86_insn_t *insn, char *buf, int len) { + int size = 0; + const char *suffix; + + if (! insn || ! buf || ! len ) + return(0); + + memset( buf, 0, len ); + + /* do long jump/call prefix */ + if ( insn->type == insn_jmp || insn->type == insn_call ) { + if (! is_imm_jmp( x86_operand_1st(insn) ) || + (x86_operand_1st(insn))->datatype != op_byte ) { + /* far jump/call, use "l" prefix */ + STRNCAT( buf, "l", len ); + } + STRNCAT( buf, insn->mnemonic, len ); + + return ( strlen( buf ) ); + } + + /* do mnemonic */ + STRNCAT( buf, insn->mnemonic, len ); + + /* do suffixes for memory operands */ + if (!(insn->note & insn_note_nosuffix) && + (insn->group == insn_arithmetic || + insn->group == insn_logic || + insn->group == insn_move || + insn->group == insn_stack || + insn->group == insn_string || + insn->group == insn_comparison || + insn->type == insn_in || + insn->type == insn_out + )) { + if ( x86_operand_count( insn, op_explicit ) > 0 && + is_memory_op( x86_operand_1st(insn) ) ){ + size = x86_operand_size( x86_operand_1st( insn ) ); + } else if ( x86_operand_count( insn, op_explicit ) > 1 && + is_memory_op( x86_operand_2nd(insn) ) ){ + size = x86_operand_size( x86_operand_2nd( insn ) ); + } + } + + if ( size == 1 ) suffix = "b"; + else if ( size == 2 ) suffix = "w"; + else if ( size == 4 ) suffix = "l"; + else if ( size == 8 ) suffix = "q"; + else suffix = ""; + + STRNCAT( buf, suffix, len ); + return ( strlen( buf ) ); +} + +int x86_format_mnemonic(x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format){ + char str[MAX_OP_STRING]; + + memset( buf, 0, len ); + STRNCAT( buf, insn->prefix_string, len ); + if ( format == att_syntax ) { + format_att_mnemonic( insn, str, sizeof str ); + STRNCAT( buf, str, len ); + } else { + STRNCAT( buf, insn->mnemonic, len ); + } + + return( strlen( buf ) ); +} + +struct op_string { char *buf; size_t len; }; + +static void format_op_raw( x86_op_t *op, x86_insn_t *insn, void *arg ) { + struct op_string * opstr = (struct op_string *) arg; + + format_operand_raw(op, insn, opstr->buf, opstr->len); +} + +static int format_insn_note(x86_insn_t *insn, char *buf, int len){ + char note[32] = {0}; + int len_orig = len, note_len = 32; + + if ( insn->note & insn_note_ring0 ) { + STRNCATF( note, "%s", "Ring0 ", note_len ); + } + if ( insn->note & insn_note_smm ) { + STRNCATF( note, "%s", "SMM ", note_len ); + } + if ( insn->note & insn_note_serial ) { + STRNCATF(note, "%s", "Serialize ", note_len ); + } + STRNCATF( buf, "%s|", note, len ); + + return( len_orig - len ); +} + +static int format_raw_insn( x86_insn_t *insn, char *buf, int len ){ + struct op_string opstr = { buf, len }; + int i; + + /* RAW style: + * ADDRESS|OFFSET|SIZE|BYTES| + * PREFIX|PREFIX_STRING|GROUP|TYPE|NOTES| + * MNEMONIC|CPU|ISA|FLAGS_SET|FLAGS_TESTED| + * STACK_MOD|STACK_MOD_VAL + * [|OP_TYPE|OP_DATATYPE|OP_ACCESS|OP_FLAGS|OP]* + * + * Register values are encoded as: + * NAME:TYPE:SIZE + * + * Effective addresses are encoded as: + * disp(base_reg,index_reg,scale) + */ + STRNCATF( buf, "0x%08" PRIX32 "|", insn->addr , len ); + STRNCATF( buf, "0x%08" PRIX32 "|", insn->offset, len ); + STRNCATF( buf, "%d|" , insn->size , len ); + + /* print bytes */ + for ( i = 0; i < insn->size; i++ ) { + STRNCATF( buf, "%02X ", insn->bytes[i], len ); + } + STRNCAT( buf, "|", len ); + + len -= format_insn_prefix_str( insn->prefix, buf, len ); + STRNCATF( buf, "|%s|", insn->prefix_string , len ); + STRNCATF( buf, "%s|", get_insn_group_str( insn->group ), len ); + STRNCATF( buf, "%s|", get_insn_type_str( insn->type ) , len ); + STRNCATF( buf, "%s|", insn->mnemonic , len ); + STRNCATF( buf, "%s|", get_insn_cpu_str( insn->cpu ) , len ); + STRNCATF( buf, "%s|", get_insn_isa_str( insn->isa ) , len ); + + /* insn note */ + len -= format_insn_note( insn, buf, len ); + + len -= format_insn_eflags_str( insn->flags_set, buf, len ); + STRNCAT( buf, "|", len ); + len -= format_insn_eflags_str( insn->flags_tested, buf, len ); + STRNCAT( buf, "|", len ); + STRNCATF( buf, "%d|", insn->stack_mod, len ); + STRNCATF( buf, "%" PRId32 "|", insn->stack_mod_val, len ); + + opstr.len = len; + x86_operand_foreach( insn, format_op_raw, &opstr, op_any ); + + return( strlen (buf) ); +} + +static int format_xml_insn( x86_insn_t *insn, char *buf, int len ) { + char str[MAX_OP_XML_STRING]; + int i; + + STRNCAT( buf, "\n", len ); + + STRNCATF( buf, "\t
addr, len ); + STRNCATF( buf, "offset=\"0x%08" PRIX32 "\" ", insn->offset, len ); + STRNCATF( buf, "size=%d bytes=\"", insn->size, len ); + + for ( i = 0; i < insn->size; i++ ) { + STRNCATF( buf, "%02X ", insn->bytes[i], len ); + } + STRNCAT( buf, "\"/>\n", len ); + + STRNCAT( buf, "\tprefix, buf, len ); + STRNCATF( buf, "\" string=\"%s\"/>\n", insn->prefix_string, len ); + + STRNCATF( buf, "\tgroup), len ); + STRNCATF( buf, "type=\"%s\" ", get_insn_type_str (insn->type), len ); + STRNCATF( buf, "string=\"%s\"/>\n", insn->mnemonic, len ); + + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, "\t\tflags_set, buf, len ); + STRNCAT( buf, "\"/>\n\t\n", len ); + + + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, "\t\tflags_tested, buf, len ); + STRNCAT( buf, "\"/>\n\t\n", len ); + + if ( x86_operand_1st( insn ) ) { + x86_format_operand( x86_operand_1st(insn), str, + sizeof str, xml_syntax); + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, str, len ); + STRNCAT( buf, "\t\n", len ); + } + + if ( x86_operand_2nd( insn ) ) { + x86_format_operand( x86_operand_2nd( insn ), str, + sizeof str, xml_syntax); + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, str, len ); + STRNCAT( buf, "\t\n", len ); + } + + if ( x86_operand_3rd( insn ) ) { + x86_format_operand( x86_operand_3rd(insn), str, + sizeof str, xml_syntax); + STRNCAT( buf, "\t\n", len ); + STRNCAT( buf, str, len ); + STRNCAT( buf, "\t\n", len ); + } + + STRNCAT( buf, "\n", len ); + + return strlen (buf); +} + +int x86_format_header( char *buf, int len, enum x86_asm_format format ) { + switch (format) { + case att_syntax: + snprintf( buf, len, "MNEMONIC\tSRC, DEST, IMM" ); + break; + case intel_syntax: + snprintf( buf, len, "MNEMONIC\tDEST, SRC, IMM" ); + break; + case native_syntax: + snprintf( buf, len, "ADDRESS\tBYTES\tMNEMONIC\t" + "DEST\tSRC\tIMM" ); + break; + case raw_syntax: + snprintf( buf, len, "ADDRESS|OFFSET|SIZE|BYTES|" + "PREFIX|PREFIX_STRING|GROUP|TYPE|NOTES|" + "MNEMONIC|CPU|ISA|FLAGS_SET|FLAGS_TESTED|" + "STACK_MOD|STACK_MOD_VAL" + "[|OP_TYPE|OP_DATATYPE|OP_ACCESS|OP_FLAGS|OP]*" + ); + break; + case xml_syntax: + snprintf( buf, len, + "" + "
" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "
" + "" + "" + "" + "
" + "" + "" + "" + ); + break; + case unknown_syntax: + if ( len ) { + buf[0] = '\0'; + } + break; + } + + return( strlen(buf) ); +} + +int x86_format_insn( x86_insn_t *insn, char *buf, int len, + enum x86_asm_format format ){ + char str[MAX_OP_STRING]; + x86_op_t *src, *dst; + int i; + + memset(buf, 0, len); + if ( format == intel_syntax ) { + /* INTEL STYLE: mnemonic dest, src, imm */ + STRNCAT( buf, insn->prefix_string, len ); + STRNCAT( buf, insn->mnemonic, len ); + STRNCAT( buf, "\t", len ); + + /* dest */ + if ( (dst = x86_operand_1st( insn )) && !(dst->flags & op_implied) ) { + x86_format_operand( dst, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + /* src */ + if ( (src = x86_operand_2nd( insn )) ) { + if ( !(dst->flags & op_implied) ) { + STRNCAT( buf, ", ", len ); + } + x86_format_operand( src, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + /* imm */ + if ( x86_operand_3rd( insn )) { + STRNCAT( buf, ", ", len ); + x86_format_operand( x86_operand_3rd( insn ), + str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + } else if ( format == att_syntax ) { + /* ATT STYLE: mnemonic src, dest, imm */ + STRNCAT( buf, insn->prefix_string, len ); + format_att_mnemonic(insn, str, MAX_OP_STRING); + STRNCATF( buf, "%s\t", str, len); + + + /* not sure which is correct? sometimes GNU as requires + * an imm as the first operand, sometimes as the third... */ + /* imm */ + if ( x86_operand_3rd( insn ) ) { + x86_format_operand(x86_operand_3rd( insn ), + str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + /* there is always 'dest' operand if there is 'src' */ + STRNCAT( buf, ", ", len ); + } + + if ( (insn->note & insn_note_nonswap ) == 0 ) { + /* regular AT&T style swap */ + src = x86_operand_2nd( insn ); + dst = x86_operand_1st( insn ); + } + else { + /* special-case instructions */ + src = x86_operand_1st( insn ); + dst = x86_operand_2nd( insn ); + } + + /* src */ + if ( src ) { + x86_format_operand(src, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + /* there is always 'dest' operand if there is 'src' */ + if ( dst && !(dst->flags & op_implied) ) { + STRNCAT( buf, ", ", len ); + } + } + + /* dest */ + if ( dst && !(dst->flags & op_implied) ) { + x86_format_operand( dst, str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + + + } else if ( format == raw_syntax ) { + format_raw_insn( insn, buf, len ); + } else if ( format == xml_syntax ) { + format_xml_insn( insn, buf, len ); + } else { /* default to native */ + /* NATIVE style: RVA\tBYTES\tMNEMONIC\tOPERANDS */ + /* print address */ + STRNCATF( buf, "%08" PRIX32 "\t", insn->addr, len ); + + /* print bytes */ + for ( i = 0; i < insn->size; i++ ) { + STRNCATF( buf, "%02X ", insn->bytes[i], len ); + } + + STRNCAT( buf, "\t", len ); + + /* print mnemonic */ + STRNCAT( buf, insn->prefix_string, len ); + STRNCAT( buf, insn->mnemonic, len ); + STRNCAT( buf, "\t", len ); + + /* print operands */ + /* dest */ + if ( x86_operand_1st( insn ) ) { + x86_format_operand( x86_operand_1st( insn ), + str, MAX_OP_STRING, format); + STRNCATF( buf, "%s\t", str, len ); + } + + /* src */ + if ( x86_operand_2nd( insn ) ) { + x86_format_operand(x86_operand_2nd( insn ), + str, MAX_OP_STRING, format); + STRNCATF( buf, "%s\t", str, len ); + } + + /* imm */ + if ( x86_operand_3rd( insn )) { + x86_format_operand( x86_operand_3rd( insn ), + str, MAX_OP_STRING, format); + STRNCAT( buf, str, len ); + } + } + + return( strlen( buf ) ); +} + diff --git a/spotify/breakpad/third_party/libdisasm/x86_imm.c b/spotify/breakpad/third_party/libdisasm/x86_imm.c new file mode 100644 index 000000000..cd59bfc9a --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_imm.c @@ -0,0 +1,70 @@ +#include "qword.h" +#include "x86_imm.h" + +#include + +unsigned int x86_imm_signsized( unsigned char * buf, size_t buf_len, + void *dest, unsigned int size ) { + signed char *cp = (signed char *) dest; + signed short *sp = (signed short *) dest; + int32_t *lp = (int32_t *) dest; + qword_t *qp = (qword_t *) dest; + + if ( size > buf_len ) { + return 0; + } + + /* Copy 'size' bytes from *buf to *op + * return number of bytes copied */ + switch (size) { + case 1: /* BYTE */ + *cp = *((signed char *) buf); + break; + case 2: /* WORD */ + *sp = *((signed short *) buf); + break; + case 6: + case 8: /* QWORD */ + *qp = *((qword_t *) buf); + break; + case 4: /* DWORD */ + default: + *lp = *((int32_t *) buf); + break; + } + return (size); +} + +unsigned int x86_imm_sized( unsigned char * buf, size_t buf_len, void *dest, + unsigned int size ) { + unsigned char *cp = (unsigned char *) dest; + unsigned short *sp = (unsigned short *) dest; + uint32_t *lp = (uint32_t *) dest; + qword_t *qp = (qword_t *) dest; + + if ( size > buf_len ) { + return 0; + } + + /* Copy 'size' bytes from *buf to *op + * return number of bytes copied */ + switch (size) { + case 1: /* BYTE */ + *cp = *((unsigned char *) buf); + break; + case 2: /* WORD */ + *sp = *((unsigned short *) buf); + break; + case 6: + case 8: /* QWORD */ + *qp = *((qword_t *) buf); + break; + case 4: /* DWORD */ + default: + *lp = *((uint32_t *) buf); + break; + } + + return (size); +} + diff --git a/spotify/breakpad/third_party/libdisasm/x86_imm.h b/spotify/breakpad/third_party/libdisasm/x86_imm.h new file mode 100644 index 000000000..fa35ff2de --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_imm.h @@ -0,0 +1,18 @@ +#ifndef x86_IMM_H +#define x86_IMM_H + +#include "./qword.h" +#include + +#ifdef WIN32 +#include +#endif + +/* these are in the global x86 namespace but are not a part of the + * official API */ +unsigned int x86_imm_sized( unsigned char *buf, size_t buf_len, void *dest, + unsigned int size ); + +unsigned int x86_imm_signsized( unsigned char *buf, size_t buf_len, void *dest, + unsigned int size ); +#endif diff --git a/spotify/breakpad/third_party/libdisasm/x86_insn.c b/spotify/breakpad/third_party/libdisasm/x86_insn.c new file mode 100644 index 000000000..5649b89fb --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_insn.c @@ -0,0 +1,182 @@ +#include +#include + +#include "libdis.h" + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + +int x86_insn_is_valid( x86_insn_t *insn ) { + if ( insn && insn->type != insn_invalid && insn->size > 0 ) { + return 1; + } + + return 0; +} + +uint32_t x86_get_address( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return 0; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.type == op_offset ) { + return op_lst->op.data.offset; + } else if ( op_lst->op.type == op_absolute ) { + if ( op_lst->op.datatype == op_descr16 ) { + return (uint32_t) + op_lst->op.data.absolute.offset.off16; + } + return op_lst->op.data.absolute.offset.off32; + } + } + + return 0; +} + +int32_t x86_get_rel_offset( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return 0; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.type == op_relative_near ) { + return (int32_t) op_lst->op.data.relative_near; + } else if ( op_lst->op.type == op_relative_far ) { + return op_lst->op.data.relative_far; + } + } + + return 0; +} + +x86_op_t * x86_get_branch_target( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return NULL; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.access & op_execute ) { + return &(op_lst->op); + } + } + + return NULL; +} +x86_op_t * x86_get_imm( x86_insn_t *insn ) { + x86_oplist_t *op_lst; + if (! insn || ! insn->operands ) { + return NULL; + } + + for (op_lst = insn->operands; op_lst; op_lst = op_lst->next ) { + if ( op_lst->op.type == op_immediate ) { + return &(op_lst->op); + } + } + + return NULL; +} + +#define IS_PROPER_IMM( x ) \ + x->op.type == op_immediate && ! (x->op.flags & op_hardcode) + + +/* if there is an immediate value in the instruction, return a pointer to + * it */ +unsigned char * x86_get_raw_imm( x86_insn_t *insn ) { + int size, offset; + x86_op_t *op = NULL; + + if (! insn || ! insn->operands ) { + return(NULL); + } + + /* a bit inelegant, but oh well... */ + if ( IS_PROPER_IMM( insn->operands ) ) { + op = &insn->operands->op; + } else if ( insn->operands->next ) { + if ( IS_PROPER_IMM( insn->operands->next ) ) { + op = &insn->operands->next->op; + } else if ( insn->operands->next->next && + IS_PROPER_IMM( insn->operands->next->next ) ) { + op = &insn->operands->next->next->op; + } + } + + if (! op ) { + return( NULL ); + } + + /* immediate data is at the end of the insn */ + size = x86_operand_size( op ); + offset = insn->size - size; + return( &insn->bytes[offset] ); +} + + +unsigned int x86_operand_size( x86_op_t *op ) { + switch (op->datatype ) { + case op_byte: return 1; + case op_word: return 2; + case op_dword: return 4; + case op_qword: return 8; + case op_dqword: return 16; + case op_sreal: return 4; + case op_dreal: return 8; + case op_extreal: return 10; + case op_bcd: return 10; + case op_ssimd: return 16; + case op_dsimd: return 16; + case op_sssimd: return 4; + case op_sdsimd: return 8; + case op_descr32: return 6; + case op_descr16: return 4; + case op_pdescr32: return 6; + case op_pdescr16: return 6; + case op_bounds16: return 4; + case op_bounds32: return 8; + case op_fpuenv16: return 14; + case op_fpuenv32: return 28; + case op_fpustate16: return 94; + case op_fpustate32: return 108; + case op_fpregset: return 512; + case op_fpreg: return 10; + case op_none: return 0; + } + return(4); /* default size */ +} + +void x86_set_insn_addr( x86_insn_t *insn, uint32_t addr ) { + if ( insn ) insn->addr = addr; +} + +void x86_set_insn_offset( x86_insn_t *insn, unsigned int offset ){ + if ( insn ) insn->offset = offset; +} + +void x86_set_insn_function( x86_insn_t *insn, void * func ){ + if ( insn ) insn->function = func; +} + +void x86_set_insn_block( x86_insn_t *insn, void * block ){ + if ( insn ) insn->block = block; +} + +void x86_tag_insn( x86_insn_t *insn ){ + if ( insn ) insn->tag = 1; +} + +void x86_untag_insn( x86_insn_t *insn ){ + if ( insn ) insn->tag = 0; +} + +int x86_insn_is_tagged( x86_insn_t *insn ){ + return insn->tag; +} + diff --git a/spotify/breakpad/third_party/libdisasm/x86_misc.c b/spotify/breakpad/third_party/libdisasm/x86_misc.c new file mode 100644 index 000000000..3d2dd0ae8 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_misc.c @@ -0,0 +1,71 @@ +#include +#include +#include + +#include "libdis.h" +#include "ia32_insn.h" +#include "ia32_reg.h" /* for ia32_reg wrapper */ +#include "ia32_settings.h" +extern ia32_settings_t ia32_settings; + +#ifdef _MSC_VER + #define snprintf _snprintf + #define inline __inline +#endif + + +/* =========================================================== INIT/TERM */ +static DISASM_REPORTER __x86_reporter_func = NULL; +static void * __x86_reporter_arg = NULL; + +int x86_init( enum x86_options options, DISASM_REPORTER reporter, void * arg ) +{ + ia32_settings.options = options; + __x86_reporter_func = reporter; + __x86_reporter_arg = arg; + + return 1; +} + +void x86_set_reporter( DISASM_REPORTER reporter, void * arg ) { + __x86_reporter_func = reporter; + __x86_reporter_arg = arg; +} + +void x86_set_options( enum x86_options options ){ + ia32_settings.options = options; +} + +enum x86_options x86_get_options( void ) { + return ia32_settings.options; +} + +int x86_cleanup( void ) +{ + return 1; +} + +/* =========================================================== ERRORS */ +void x86_report_error( enum x86_report_codes code, void *data ) { + if ( __x86_reporter_func ) { + (*__x86_reporter_func)(code, data, __x86_reporter_arg); + } +} + + +/* =========================================================== MISC */ +unsigned int x86_endian(void) { return ia32_settings.endian; } +unsigned int x86_addr_size(void) { return ia32_settings.sz_addr; } +unsigned int x86_op_size(void) { return ia32_settings.sz_oper; } +unsigned int x86_word_size(void) { return ia32_settings.sz_word; } +unsigned int x86_max_insn_size(void) { return ia32_settings.max_insn; } +unsigned int x86_sp_reg(void) { return ia32_settings.id_sp_reg; } +unsigned int x86_fp_reg(void) { return ia32_settings.id_fp_reg; } +unsigned int x86_ip_reg(void) { return ia32_settings.id_ip_reg; } +unsigned int x86_flag_reg(void) { return ia32_settings.id_flag_reg; } + +/* wrapper function to hide the IA32 register fn */ +void x86_reg_from_id( unsigned int id, x86_reg_t * reg ) { + ia32_handle_register( reg, id ); + return; +} diff --git a/spotify/breakpad/third_party/libdisasm/x86_operand_list.c b/spotify/breakpad/third_party/libdisasm/x86_operand_list.c new file mode 100644 index 000000000..95409e069 --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_operand_list.c @@ -0,0 +1,191 @@ +#include +#include "libdis.h" + + +static void x86_oplist_append( x86_insn_t *insn, x86_oplist_t *op ) { + x86_oplist_t *list; + + if (! insn ) { + return; + } + + list = insn->operands; + if (! list ) { + insn->operand_count = 1; + /* Note that we have no way of knowing if this is an + * exlicit operand or not, since the caller fills + * the x86_op_t after we return. We increase the + * explicit count automatically, and ia32_insn_implicit_ops + * decrements it */ + insn->explicit_count = 1; + insn->operands = op; + return; + } + + /* get to end of list */ + for ( ; list->next; list = list->next ) + ; + + insn->operand_count = insn->operand_count + 1; + insn->explicit_count = insn->explicit_count + 1; + list->next = op; + + return; +} + +x86_op_t * x86_operand_new( x86_insn_t *insn ) { + x86_oplist_t *op; + + if (! insn ) { + return(NULL); + } + op = calloc( sizeof(x86_oplist_t), 1 ); + op->op.insn = insn; + x86_oplist_append( insn, op ); + return( &(op->op) ); +} + +void x86_oplist_free( x86_insn_t *insn ) { + x86_oplist_t *op, *list; + + if (! insn ) { + return; + } + + for ( list = insn->operands; list; ) { + op = list; + list = list->next; + free(op); + } + + insn->operands = NULL; + insn->operand_count = 0; + insn->explicit_count = 0; + + return; +} + +/* ================================================== LIBDISASM API */ +/* these could probably just be #defines, but that means exposing the + enum... yet one more confusing thing in the API */ +int x86_operand_foreach( x86_insn_t *insn, x86_operand_fn func, void *arg, + enum x86_op_foreach_type type ){ + x86_oplist_t *list; + char explicit = 1, implicit = 1; + + if (! insn || ! func ) { + return 0; + } + + /* note: explicit and implicit can be ORed together to + * allow an "all" limited by access type, even though the + * user is stupid to do this since it is default behavior :) */ + if ( (type & op_explicit) && ! (type & op_implicit) ) { + implicit = 0; + } + if ( (type & op_implicit) && ! (type & op_explicit) ) { + explicit = 0; + } + + type = type & 0x0F; /* mask out explicit/implicit operands */ + + for ( list = insn->operands; list; list = list->next ) { + if (! implicit && (list->op.flags & op_implied) ) { + /* operand is implicit */ + continue; + } + + if (! explicit && ! (list->op.flags & op_implied) ) { + /* operand is not implicit */ + continue; + } + + switch ( type ) { + case op_any: + break; + case op_dest: + if (! (list->op.access & op_write) ) { + continue; + } + break; + case op_src: + if (! (list->op.access & op_read) ) { + continue; + } + break; + case op_ro: + if (! (list->op.access & op_read) || + (list->op.access & op_write ) ) { + continue; + } + break; + case op_wo: + if (! (list->op.access & op_write) || + (list->op.access & op_read ) ) { + continue; + } + break; + case op_xo: + if (! (list->op.access & op_execute) ) { + continue; + } + break; + case op_rw: + if (! (list->op.access & op_write) || + ! (list->op.access & op_read ) ) { + continue; + } + break; + case op_implicit: case op_explicit: /* make gcc happy */ + break; + } + /* any non-continue ends up here: invoke the callback */ + (*func)( &list->op, insn, arg ); + } + + return 1; +} + +static void count_operand( x86_op_t *op, x86_insn_t *insn, void *arg ) { + size_t * count = (size_t *) arg; + *count = *count + 1; +} + +size_t x86_operand_count( x86_insn_t *insn, enum x86_op_foreach_type type ) { + size_t count = 0; + + /* save us a list traversal for common counts... */ + if ( type == op_any ) { + return insn->operand_count; + } else if ( type == op_explicit ) { + return insn->explicit_count; + } + + x86_operand_foreach( insn, count_operand, &count, type ); + return count; +} + +/* accessor functions */ +x86_op_t * x86_operand_1st( x86_insn_t *insn ) { + if (! insn->explicit_count ) { + return NULL; + } + + return &(insn->operands->op); +} + +x86_op_t * x86_operand_2nd( x86_insn_t *insn ) { + if ( insn->explicit_count < 2 ) { + return NULL; + } + + return &(insn->operands->next->op); +} + +x86_op_t * x86_operand_3rd( x86_insn_t *insn ) { + if ( insn->explicit_count < 3 ) { + return NULL; + } + + return &(insn->operands->next->next->op); +} diff --git a/spotify/breakpad/third_party/libdisasm/x86_operand_list.h b/spotify/breakpad/third_party/libdisasm/x86_operand_list.h new file mode 100644 index 000000000..53668658e --- /dev/null +++ b/spotify/breakpad/third_party/libdisasm/x86_operand_list.h @@ -0,0 +1,8 @@ +#ifndef X86_OPERAND_LIST_H +#define X86_OPERAND_LIST_H +#include "libdis.h" + + +x86_op_t * x86_operand_new( x86_insn_t *insn ); + +#endif diff --git a/spotify/breakpad/third_party/linux/include/gflags/gflags.h b/spotify/breakpad/third_party/linux/include/gflags/gflags.h new file mode 100644 index 000000000..08a3b637e --- /dev/null +++ b/spotify/breakpad/third_party/linux/include/gflags/gflags.h @@ -0,0 +1,533 @@ +// Copyright (c) 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// --- +// Author: Ray Sidney +// Revamped and reorganized by Craig Silverstein +// +// This is the file that should be included by any file which declares +// or defines a command line flag or wants to parse command line flags +// or print a program usage message (which will include information about +// flags). Executive summary, in the form of an example foo.cc file: +// +// #include "foo.h" // foo.h has a line "DECLARE_int32(start);" +// +// DEFINE_int32(end, 1000, "The last record to read"); +// DECLARE_bool(verbose); // some other file has a DEFINE_bool(verbose, ...) +// +// void MyFunc() { +// if (FLAGS_verbose) printf("Records %d-%d\n", FLAGS_start, FLAGS_end); +// } +// +// Then, at the command-line: +// ./foo --noverbose --start=5 --end=100 +// +// For more details, see +// doc/gflags.html +// +// --- A note about thread-safety: +// +// We describe many functions in this routine as being thread-hostile, +// thread-compatible, or thread-safe. Here are the meanings we use: +// +// thread-safe: it is safe for multiple threads to call this routine +// (or, when referring to a class, methods of this class) +// concurrently. +// thread-hostile: it is not safe for multiple threads to call this +// routine (or methods of this class) concurrently. In gflags, +// most thread-hostile routines are intended to be called early in, +// or even before, main() -- that is, before threads are spawned. +// thread-compatible: it is safe for multiple threads to read from +// this variable (when applied to variables), or to call const +// methods of this class (when applied to classes), as long as no +// other thread is writing to the variable or calling non-const +// methods of this class. + +#ifndef GOOGLE_GFLAGS_H_ +#define GOOGLE_GFLAGS_H_ + +#include +#include + +// We care a lot about number of bits things take up. Unfortunately, +// systems define their bit-specific ints in a lot of different ways. +// We use our own way, and have a typedef to get there. +// Note: these commands below may look like "#if 1" or "#if 0", but +// that's because they were constructed that way at ./configure time. +// Look at gflags.h.in to see how they're calculated (based on your config). +#if 1 +#include // the normal place uint16_t is defined +#endif +#if 1 +#include // the normal place u_int16_t is defined +#endif +#if 1 +#include // a third place for uint16_t or u_int16_t +#endif + +namespace google { + +#if 1 // the C99 format +typedef int32_t int32; +typedef uint32_t uint32; +typedef int64_t int64; +typedef uint64_t uint64; +#elif 1 // the BSD format +typedef int32_t int32; +typedef u_int32_t uint32; +typedef int64_t int64; +typedef u_int64_t uint64; +#elif 0 // the windows (vc7) format +typedef __int32 int32; +typedef unsigned __int32 uint32; +typedef __int64 int64; +typedef unsigned __int64 uint64; +#else +#error Do not know how to define a 32-bit integer quantity on your system +#endif + +// -------------------------------------------------------------------- +// To actually define a flag in a file, use DEFINE_bool, +// DEFINE_string, etc. at the bottom of this file. You may also find +// it useful to register a validator with the flag. This ensures that +// when the flag is parsed from the commandline, or is later set via +// SetCommandLineOption, we call the validation function. +// +// The validation function should return true if the flag value is valid, and +// false otherwise. If the function returns false for the new setting of the +// flag, the flag will retain its current value. If it returns false for the +// default value, InitGoogle will die. +// +// This function is safe to call at global construct time (as in the +// example below). +// +// Example use: +// static bool ValidatePort(const char* flagname, int32 value) { +// if (value > 0 && value < 32768) // value is ok +// return true; +// printf("Invalid value for --%s: %d\n", flagname, (int)value); +// return false; +// } +// DEFINE_int32(port, 0, "What port to listen on"); +// static bool dummy = RegisterFlagValidator(&FLAGS_port, &ValidatePort); + +// Returns true if successfully registered, false if not (because the +// first argument doesn't point to a command-line flag, or because a +// validator is already registered for this flag). +bool RegisterFlagValidator(const bool* flag, + bool (*validate_fn)(const char*, bool)); +bool RegisterFlagValidator(const int32* flag, + bool (*validate_fn)(const char*, int32)); +bool RegisterFlagValidator(const int64* flag, + bool (*validate_fn)(const char*, int64)); +bool RegisterFlagValidator(const uint64* flag, + bool (*validate_fn)(const char*, uint64)); +bool RegisterFlagValidator(const double* flag, + bool (*validate_fn)(const char*, double)); +bool RegisterFlagValidator(const std::string* flag, + bool (*validate_fn)(const char*, const std::string&)); + + +// -------------------------------------------------------------------- +// These methods are the best way to get access to info about the +// list of commandline flags. Note that these routines are pretty slow. +// GetAllFlags: mostly-complete info about the list, sorted by file. +// ShowUsageWithFlags: pretty-prints the list to stdout (what --help does) +// ShowUsageWithFlagsRestrict: limit to filenames with restrict as a substr +// +// In addition to accessing flags, you can also access argv[0] (the program +// name) and argv (the entire commandline), which we sock away a copy of. +// These variables are static, so you should only set them once. + +struct CommandLineFlagInfo { + std::string name; // the name of the flag + std::string type; // the type of the flag: int32, etc + std::string description; // the "help text" associated with the flag + std::string current_value; // the current value, as a string + std::string default_value; // the default value, as a string + std::string filename; // 'cleaned' version of filename holding the flag + bool has_validator_fn; // true if RegisterFlagValidator called on flag + bool is_default; // true if the flag has default value +}; + +extern void GetAllFlags(std::vector* OUTPUT); +// These two are actually defined in commandlineflags_reporting.cc. +extern void ShowUsageWithFlags(const char *argv0); // what --help does +extern void ShowUsageWithFlagsRestrict(const char *argv0, const char *restrict); + +// Create a descriptive string for a flag. +// Goes to some trouble to make pretty line breaks. +extern std::string DescribeOneFlag(const CommandLineFlagInfo& flag); + +// Thread-hostile; meant to be called before any threads are spawned. +extern void SetArgv(int argc, const char** argv); +// The following functions are thread-safe as long as SetArgv() is +// only called before any threads start. +extern const std::vector& GetArgvs(); // all of argv as a vector +extern const char* GetArgv(); // all of argv as a string +extern const char* GetArgv0(); // only argv0 +extern uint32 GetArgvSum(); // simple checksum of argv +extern const char* ProgramInvocationName(); // argv0, or "UNKNOWN" if not set +extern const char* ProgramInvocationShortName(); // basename(argv0) +// ProgramUsage() is thread-safe as long as SetUsageMessage() is only +// called before any threads start. +extern const char* ProgramUsage(); // string set by SetUsageMessage() + + +// -------------------------------------------------------------------- +// Normally you access commandline flags by just saying "if (FLAGS_foo)" +// or whatever, and set them by calling "FLAGS_foo = bar" (or, more +// commonly, via the DEFINE_foo macro). But if you need a bit more +// control, we have programmatic ways to get/set the flags as well. +// These programmatic ways to access flags are thread-safe, but direct +// access is only thread-compatible. + +// Return true iff the flagname was found. +// OUTPUT is set to the flag's value, or unchanged if we return false. +extern bool GetCommandLineOption(const char* name, std::string* OUTPUT); + +// Return true iff the flagname was found. OUTPUT is set to the flag's +// CommandLineFlagInfo or unchanged if we return false. +extern bool GetCommandLineFlagInfo(const char* name, + CommandLineFlagInfo* OUTPUT); + +// Return the CommandLineFlagInfo of the flagname. exit() if name not found. +// Example usage, to check if a flag's value is currently the default value: +// if (GetCommandLineFlagInfoOrDie("foo").is_default) ... +extern CommandLineFlagInfo GetCommandLineFlagInfoOrDie(const char* name); + +enum FlagSettingMode { + // update the flag's value (can call this multiple times). + SET_FLAGS_VALUE, + // update the flag's value, but *only if* it has not yet been updated + // with SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef". + SET_FLAG_IF_DEFAULT, + // set the flag's default value to this. If the flag has not yet updated + // yet (via SET_FLAGS_VALUE, SET_FLAG_IF_DEFAULT, or "FLAGS_xxx = nondef") + // change the flag's current value to the new default value as well. + SET_FLAGS_DEFAULT +}; + +// Set a particular flag ("command line option"). Returns a string +// describing the new value that the option has been set to. The +// return value API is not well-specified, so basically just depend on +// it to be empty if the setting failed for some reason -- the name is +// not a valid flag name, or the value is not a valid value -- and +// non-empty else. + +// SetCommandLineOption uses set_mode == SET_FLAGS_VALUE (the common case) +extern std::string SetCommandLineOption(const char* name, const char* value); +extern std::string SetCommandLineOptionWithMode(const char* name, const char* value, + FlagSettingMode set_mode); + + +// -------------------------------------------------------------------- +// Saves the states (value, default value, whether the user has set +// the flag, registered validators, etc) of all flags, and restores +// them when the FlagSaver is destroyed. This is very useful in +// tests, say, when you want to let your tests change the flags, but +// make sure that they get reverted to the original states when your +// test is complete. +// +// Example usage: +// void TestFoo() { +// FlagSaver s1; +// FLAG_foo = false; +// FLAG_bar = "some value"; +// +// // test happens here. You can return at any time +// // without worrying about restoring the FLAG values. +// } +// +// Note: This class is marked with __attribute__((unused)) because all the +// work is done in the constructor and destructor, so in the standard +// usage example above, the compiler would complain that it's an +// unused variable. +// +// This class is thread-safe. + +class FlagSaver { + public: + FlagSaver(); + ~FlagSaver(); + + private: + class FlagSaverImpl* impl_; // we use pimpl here to keep API steady + + FlagSaver(const FlagSaver&); // no copying! + void operator=(const FlagSaver&); +} __attribute__ ((unused)); + +// -------------------------------------------------------------------- +// Some deprecated or hopefully-soon-to-be-deprecated functions. + +// This is often used for logging. TODO(csilvers): figure out a better way +extern std::string CommandlineFlagsIntoString(); +// Usually where this is used, a FlagSaver should be used instead. +extern bool ReadFlagsFromString(const std::string& flagfilecontents, + const char* prog_name, + bool errors_are_fatal); // uses SET_FLAGS_VALUE + +// These let you manually implement --flagfile functionality. +// DEPRECATED. +extern bool AppendFlagsIntoFile(const std::string& filename, const char* prog_name); +extern bool SaveCommandFlags(); // actually defined in google.cc ! +extern bool ReadFromFlagsFile(const std::string& filename, const char* prog_name, + bool errors_are_fatal); // uses SET_FLAGS_VALUE + + +// -------------------------------------------------------------------- +// Useful routines for initializing flags from the environment. +// In each case, if 'varname' does not exist in the environment +// return defval. If 'varname' does exist but is not valid +// (e.g., not a number for an int32 flag), abort with an error. +// Otherwise, return the value. NOTE: for booleans, for true use +// 't' or 'T' or 'true' or '1', for false 'f' or 'F' or 'false' or '0'. + +extern bool BoolFromEnv(const char *varname, bool defval); +extern int32 Int32FromEnv(const char *varname, int32 defval); +extern int64 Int64FromEnv(const char *varname, int64 defval); +extern uint64 Uint64FromEnv(const char *varname, uint64 defval); +extern double DoubleFromEnv(const char *varname, double defval); +extern const char *StringFromEnv(const char *varname, const char *defval); + + +// -------------------------------------------------------------------- +// The next two functions parse commandlineflags from main(): + +// Set the "usage" message for this program. For example: +// string usage("This program does nothing. Sample usage:\n"); +// usage += argv[0] + " "; +// SetUsageMessage(usage); +// Do not include commandline flags in the usage: we do that for you! +// Thread-hostile; meant to be called before any threads are spawned. +extern void SetUsageMessage(const std::string& usage); + +// Looks for flags in argv and parses them. Rearranges argv to put +// flags first, or removes them entirely if remove_flags is true. +// If a flag is defined more than once in the command line or flag +// file, the last definition is used. +// See top-of-file for more details on this function. +#ifndef SWIG // In swig, use ParseCommandLineFlagsScript() instead. +extern uint32 ParseCommandLineFlags(int *argc, char*** argv, + bool remove_flags); +#endif + + +// Calls to ParseCommandLineNonHelpFlags and then to +// HandleCommandLineHelpFlags can be used instead of a call to +// ParseCommandLineFlags during initialization, in order to allow for +// changing default values for some FLAGS (via +// e.g. SetCommandLineOptionWithMode calls) between the time of +// command line parsing and the time of dumping help information for +// the flags as a result of command line parsing. +// If a flag is defined more than once in the command line or flag +// file, the last definition is used. +extern uint32 ParseCommandLineNonHelpFlags(int *argc, char*** argv, + bool remove_flags); +// This is actually defined in commandlineflags_reporting.cc. +// This function is misnamed (it also handles --version, etc.), but +// it's too late to change that now. :-( +extern void HandleCommandLineHelpFlags(); // in commandlineflags_reporting.cc + +// Allow command line reparsing. Disables the error normally +// generated when an unknown flag is found, since it may be found in a +// later parse. Thread-hostile; meant to be called before any threads +// are spawned. +extern void AllowCommandLineReparsing(); + +// Reparse the flags that have not yet been recognized. +// Only flags registered since the last parse will be recognized. +// Any flag value must be provided as part of the argument using "=", +// not as a separate command line argument that follows the flag argument. +// Intended for handling flags from dynamically loaded libraries, +// since their flags are not registered until they are loaded. +extern uint32 ReparseCommandLineNonHelpFlags(); + + +// -------------------------------------------------------------------- +// Now come the command line flag declaration/definition macros that +// will actually be used. They're kind of hairy. A major reason +// for this is initialization: we want people to be able to access +// variables in global constructors and have that not crash, even if +// their global constructor runs before the global constructor here. +// (Obviously, we can't guarantee the flags will have the correct +// default value in that case, but at least accessing them is safe.) +// The only way to do that is have flags point to a static buffer. +// So we make one, using a union to ensure proper alignment, and +// then use placement-new to actually set up the flag with the +// correct default value. In the same vein, we have to worry about +// flag access in global destructors, so FlagRegisterer has to be +// careful never to destroy the flag-values it constructs. +// +// Note that when we define a flag variable FLAGS_, we also +// preemptively define a junk variable, FLAGS_no. This is to +// cause a link-time error if someone tries to define 2 flags with +// names like "logging" and "nologging". We do this because a bool +// flag FLAG can be set from the command line to true with a "-FLAG" +// argument, and to false with a "-noFLAG" argument, and so this can +// potentially avert confusion. +// +// We also put flags into their own namespace. It is purposefully +// named in an opaque way that people should have trouble typing +// directly. The idea is that DEFINE puts the flag in the weird +// namespace, and DECLARE imports the flag from there into the current +// namespace. The net result is to force people to use DECLARE to get +// access to a flag, rather than saying "extern bool FLAGS_whatever;" +// or some such instead. We want this so we can put extra +// functionality (like sanity-checking) in DECLARE if we want, and +// make sure it is picked up everywhere. +// +// We also put the type of the variable in the namespace, so that +// people can't DECLARE_int32 something that they DEFINE_bool'd +// elsewhere. + +class FlagRegisterer { + public: + FlagRegisterer(const char* name, const char* type, + const char* help, const char* filename, + void* current_storage, void* defvalue_storage); +}; + +extern bool FlagsTypeWarn(const char *name); + +// If your application #defines STRIP_FLAG_HELP to a non-zero value +// before #including this file, we remove the help message from the +// binary file. This can reduce the size of the resulting binary +// somewhat, and may also be useful for security reasons. + +extern const char kStrippedFlagHelp[]; + +} + +#ifndef SWIG // In swig, ignore the main flag declarations + +#if defined(STRIP_FLAG_HELP) && STRIP_FLAG_HELP > 0 +// Need this construct to avoid the 'defined but not used' warning. +#define MAYBE_STRIPPED_HELP(txt) (false ? (txt) : kStrippedFlagHelp) +#else +#define MAYBE_STRIPPED_HELP(txt) txt +#endif + +// Each command-line flag has two variables associated with it: one +// with the current value, and one with the default value. However, +// we have a third variable, which is where value is assigned; it's a +// constant. This guarantees that FLAG_##value is initialized at +// static initialization time (e.g. before program-start) rather than +// than global construction time (which is after program-start but +// before main), at least when 'value' is a compile-time constant. We +// use a small trick for the "default value" variable, and call it +// FLAGS_no. This serves the second purpose of assuring a +// compile error if someone tries to define a flag named no +// which is illegal (--foo and --nofoo both affect the "foo" flag). +#define DEFINE_VARIABLE(type, shorttype, name, value, help) \ + namespace fL##shorttype { \ + static const type FLAGS_nono##name = value; \ + type FLAGS_##name = FLAGS_nono##name; \ + type FLAGS_no##name = FLAGS_nono##name; \ + static ::google::FlagRegisterer o_##name( \ + #name, #type, MAYBE_STRIPPED_HELP(help), __FILE__, \ + &FLAGS_##name, &FLAGS_no##name); \ + } \ + using fL##shorttype::FLAGS_##name + +#define DECLARE_VARIABLE(type, shorttype, name) \ + namespace fL##shorttype { \ + extern type FLAGS_##name; \ + } \ + using fL##shorttype::FLAGS_##name + +// For DEFINE_bool, we want to do the extra check that the passed-in +// value is actually a bool, and not a string or something that can be +// coerced to a bool. These declarations (no definition needed!) will +// help us do that, and never evaluate From, which is important. +// We'll use 'sizeof(IsBool(val))' to distinguish. This code requires +// that the compiler have different sizes for bool & double. Since +// this is not guaranteed by the standard, we check it with a +// compile-time assert (msg[-1] will give a compile-time error). +namespace fLB { +struct CompileAssert {}; +typedef CompileAssert expected_sizeof_double_neq_sizeof_bool[ + (sizeof(double) != sizeof(bool)) ? 1 : -1]; +template double IsBoolFlag(const From& from); +bool IsBoolFlag(bool from); +} // namespace fLB + +#define DECLARE_bool(name) DECLARE_VARIABLE(bool,B, name) +#define DEFINE_bool(name,val,txt) \ + namespace fLB { \ + typedef CompileAssert FLAG_##name##_value_is_not_a_bool[ \ + (sizeof(::fLB::IsBoolFlag(val)) != sizeof(double)) ? 1 : -1]; \ + } \ + DEFINE_VARIABLE(bool,B, name, val, txt) + +#define DECLARE_int32(name) DECLARE_VARIABLE(::google::int32,I, name) +#define DEFINE_int32(name,val,txt) DEFINE_VARIABLE(::google::int32,I, name, val, txt) + +#define DECLARE_int64(name) DECLARE_VARIABLE(::google::int64,I64, name) +#define DEFINE_int64(name,val,txt) DEFINE_VARIABLE(::google::int64,I64, name, val, txt) + +#define DECLARE_uint64(name) DECLARE_VARIABLE(::google::uint64,U64, name) +#define DEFINE_uint64(name,val,txt) DEFINE_VARIABLE(::google::uint64,U64, name, val, txt) + +#define DECLARE_double(name) DECLARE_VARIABLE(double,D, name) +#define DEFINE_double(name,val,txt) DEFINE_VARIABLE(double,D, name, val, txt) + +// Strings are trickier, because they're not a POD, so we can't +// construct them at static-initialization time (instead they get +// constructed at global-constructor time, which is much later). To +// try to avoid crashes in that case, we use a char buffer to store +// the string, which we can static-initialize, and then placement-new +// into it later. It's not perfect, but the best we can do. +#define DECLARE_string(name) namespace fLS { extern std::string& FLAGS_##name; } \ + using fLS::FLAGS_##name + +// We need to define a var named FLAGS_no##name so people don't define +// --string and --nostring. And we need a temporary place to put val +// so we don't have to evaluate it twice. Two great needs that go +// great together! +// The weird 'using' + 'extern' inside the fLS namespace is to work around +// an unknown compiler bug/issue with the gcc 4.2.1 on SUSE 10. See +// http://code.google.com/p/google-gflags/issues/detail?id=20 +#define DEFINE_string(name, val, txt) \ + namespace fLS { \ + static union { void* align; char s[sizeof(std::string)]; } s_##name[2]; \ + const std::string* const FLAGS_no##name = new (s_##name[0].s) std::string(val); \ + static ::google::FlagRegisterer o_##name( \ + #name, "string", MAYBE_STRIPPED_HELP(txt), __FILE__, \ + s_##name[0].s, new (s_##name[1].s) std::string(*FLAGS_no##name)); \ + extern std::string& FLAGS_##name; \ + using fLS::FLAGS_##name; \ + std::string& FLAGS_##name = *(reinterpret_cast(s_##name[0].s)); \ + } \ + using fLS::FLAGS_##name + +#endif // SWIG + +#endif // GOOGLE_GFLAGS_H_ diff --git a/spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h b/spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h new file mode 100644 index 000000000..9d9ce7a5f --- /dev/null +++ b/spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h @@ -0,0 +1,121 @@ +// Copyright (c) 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// --- +// Author: Dave Nicponski +// +// Implement helpful bash-style command line flag completions +// +// ** Functional API: +// HandleCommandLineCompletions() should be called early during +// program startup, but after command line flag code has been +// initialized, such as the beginning of HandleCommandLineHelpFlags(). +// It checks the value of the flag --tab_completion_word. If this +// flag is empty, nothing happens here. If it contains a string, +// however, then HandleCommandLineCompletions() will hijack the +// process, attempting to identify the intention behind this +// completion. Regardless of the outcome of this deduction, the +// process will be terminated, similar to --helpshort flag +// handling. +// +// ** Overview of Bash completions: +// Bash can be told to programatically determine completions for the +// current 'cursor word'. It does this by (in this case) invoking a +// command with some additional arguments identifying the command +// being executed, the word being completed, and the previous word +// (if any). Bash then expects a sequence of output lines to be +// printed to stdout. If these lines all contain a common prefix +// longer than the cursor word, bash will replace the cursor word +// with that common prefix, and display nothing. If there isn't such +// a common prefix, bash will display the lines in pages using 'more'. +// +// ** Strategy taken for command line completions: +// If we can deduce either the exact flag intended, or a common flag +// prefix, we'll output exactly that. Otherwise, if information +// must be displayed to the user, we'll take the opportunity to add +// some helpful information beyond just the flag name (specifically, +// we'll include the default flag value and as much of the flag's +// description as can fit on a single terminal line width, as specified +// by the flag --tab_completion_columns). Furthermore, we'll try to +// make bash order the output such that the most useful or relevent +// flags are the most likely to be shown at the top. +// +// ** Additional features: +// To assist in finding that one really useful flag, substring matching +// was implemented. Before pressing a to get completion for the +// current word, you can append one or more '?' to the flag to do +// substring matching. Here's the semantics: +// --foo Show me all flags with names prefixed by 'foo' +// --foo? Show me all flags with 'foo' somewhere in the name +// --foo?? Same as prior case, but also search in module +// definition path for 'foo' +// --foo??? Same as prior case, but also search in flag +// descriptions for 'foo' +// Finally, we'll trim the output to a relatively small number of +// flags to keep bash quiet about the verbosity of output. If one +// really wanted to see all possible matches, appending a '+' to the +// search word will force the exhaustive list of matches to be printed. +// +// ** How to have bash accept completions from a binary: +// Bash requires that it be informed about each command that programmatic +// completion should be enabled for. Example addition to a .bashrc +// file would be (your path to gflags_completions.sh file may differ): + +/* +$ complete -o bashdefault -o default -o nospace -C \ + '/usr/local/bin/gflags_completions.sh --tab_completion_columns $COLUMNS' \ + time env binary_name another_binary [...] +*/ + +// This would allow the following to work: +// $ /path/to/binary_name --vmodule +// Or: +// $ ./bin/path/another_binary --gfs_u +// (etc) +// +// Sadly, it appears that bash gives no easy way to force this behavior for +// all commands. That's where the "time" in the above example comes in. +// If you haven't specifically added a command to the list of completion +// supported commands, you can still get completions by prefixing the +// entire command with "env". +// $ env /some/brand/new/binary --vmod +// Assuming that "binary" is a newly compiled binary, this should still +// produce the expected completion output. + + +#ifndef GOOGLE_GFLAGS_COMPLETIONS_H_ +#define GOOGLE_GFLAGS_COMPLETIONS_H_ + +namespace google { + +void HandleCommandLineCompletions(void); + +} + +#endif // GOOGLE_GFLAGS_COMPLETIONS_H_ diff --git a/spotify/breakpad/third_party/lss/linux_syscall_support.h b/spotify/breakpad/third_party/lss/linux_syscall_support.h new file mode 100644 index 000000000..15282d138 --- /dev/null +++ b/spotify/breakpad/third_party/lss/linux_syscall_support.h @@ -0,0 +1,3500 @@ +/* Copyright (c) 2005-2010, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * --- + * Author: Markus Gutschke + */ + +/* This file includes Linux-specific support functions common to the + * coredumper and the thread lister; primarily, this is a collection + * of direct system calls, and a couple of symbols missing from + * standard header files. + * There are a few options that the including file can set to control + * the behavior of this file: + * + * SYS_CPLUSPLUS: + * The entire header file will normally be wrapped in 'extern "C" { }", + * making it suitable for compilation as both C and C++ source. If you + * do not want to do this, you can set the SYS_CPLUSPLUS macro to inhibit + * the wrapping. N.B. doing so will suppress inclusion of all prerequisite + * system header files, too. It is the caller's responsibility to provide + * the necessary definitions. + * + * SYS_ERRNO: + * All system calls will update "errno" unless overriden by setting the + * SYS_ERRNO macro prior to including this file. SYS_ERRNO should be + * an l-value. + * + * SYS_INLINE: + * New symbols will be defined "static inline", unless overridden by + * the SYS_INLINE macro. + * + * SYS_LINUX_SYSCALL_SUPPORT_H + * This macro is used to avoid multiple inclusions of this header file. + * If you need to include this file more than once, make sure to + * unset SYS_LINUX_SYSCALL_SUPPORT_H before each inclusion. + * + * SYS_PREFIX: + * New system calls will have a prefix of "sys_" unless overridden by + * the SYS_PREFIX macro. Valid values for this macro are [0..9] which + * results in prefixes "sys[0..9]_". It is also possible to set this + * macro to -1, which avoids all prefixes. + * + * SYS_SYSCALL_ENTRYPOINT: + * Some applications (such as sandboxes that filter system calls), need + * to be able to run custom-code each time a system call is made. If this + * macro is defined, it expands to the name of a "common" symbol. If + * this symbol is assigned a non-NULL pointer value, it is used as the + * address of the system call entrypoint. + * A pointer to this symbol can be obtained by calling + * get_syscall_entrypoint() + * + * This file defines a few internal symbols that all start with "LSS_". + * Do not access these symbols from outside this file. They are not part + * of the supported API. + */ +#ifndef SYS_LINUX_SYSCALL_SUPPORT_H +#define SYS_LINUX_SYSCALL_SUPPORT_H + +/* We currently only support x86-32, x86-64, ARM, MIPS, and PPC on Linux. + * Porting to other related platforms should not be difficult. + */ +#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ + defined(__mips__) || defined(__PPC__) || defined(__ARM_EABI__)) \ + && (defined(__linux) || defined(__ANDROID__)) + +#ifndef SYS_CPLUSPLUS +#ifdef __cplusplus +/* Some system header files in older versions of gcc neglect to properly + * handle being included from C++. As it appears to be harmless to have + * multiple nested 'extern "C"' blocks, just add another one here. + */ +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef __mips__ +/* Include definitions of the ABI currently in use. */ +#include +#endif +#endif + +/* As glibc often provides subtly incompatible data structures (and implicit + * wrapper functions that convert them), we provide our own kernel data + * structures for use by the system calls. + * These structures have been developed by using Linux 2.6.23 headers for + * reference. Note though, we do not care about exact API compatibility + * with the kernel, and in fact the kernel often does not have a single + * API that works across architectures. Instead, we try to mimic the glibc + * API where reasonable, and only guarantee ABI compatibility with the + * kernel headers. + * Most notably, here are a few changes that were made to the structures + * defined by kernel headers: + * + * - we only define structures, but not symbolic names for kernel data + * types. For the latter, we directly use the native C datatype + * (i.e. "unsigned" instead of "mode_t"). + * - in a few cases, it is possible to define identical structures for + * both 32bit (e.g. i386) and 64bit (e.g. x86-64) platforms by + * standardizing on the 64bit version of the data types. In particular, + * this means that we use "unsigned" where the 32bit headers say + * "unsigned long". + * - overall, we try to minimize the number of cases where we need to + * conditionally define different structures. + * - the "struct kernel_sigaction" class of structures have been + * modified to more closely mimic glibc's API by introducing an + * anonymous union for the function pointer. + * - a small number of field names had to have an underscore appended to + * them, because glibc defines a global macro by the same name. + */ + +/* include/linux/dirent.h */ +struct kernel_dirent64 { + unsigned long long d_ino; + long long d_off; + unsigned short d_reclen; + unsigned char d_type; + char d_name[256]; +}; + +/* include/linux/dirent.h */ +struct kernel_dirent { + long d_ino; + long d_off; + unsigned short d_reclen; + char d_name[256]; +}; + +/* include/linux/uio.h */ +struct kernel_iovec { + void *iov_base; + unsigned long iov_len; +}; + +/* include/linux/socket.h */ +struct kernel_msghdr { + void *msg_name; + int msg_namelen; + struct kernel_iovec*msg_iov; + unsigned long msg_iovlen; + void *msg_control; + unsigned long msg_controllen; + unsigned msg_flags; +}; + +/* include/asm-generic/poll.h */ +struct kernel_pollfd { + int fd; + short events; + short revents; +}; + +/* include/linux/resource.h */ +struct kernel_rlimit { + unsigned long rlim_cur; + unsigned long rlim_max; +}; + +/* include/linux/time.h */ +struct kernel_timespec { + long tv_sec; + long tv_nsec; +}; + +/* include/linux/time.h */ +struct kernel_timeval { + long tv_sec; + long tv_usec; +}; + +/* include/linux/resource.h */ +struct kernel_rusage { + struct kernel_timeval ru_utime; + struct kernel_timeval ru_stime; + long ru_maxrss; + long ru_ixrss; + long ru_idrss; + long ru_isrss; + long ru_minflt; + long ru_majflt; + long ru_nswap; + long ru_inblock; + long ru_oublock; + long ru_msgsnd; + long ru_msgrcv; + long ru_nsignals; + long ru_nvcsw; + long ru_nivcsw; +}; + +struct siginfo; +#if defined(__i386__) || defined(__ARM_EABI__) || defined(__ARM_ARCH_3__) \ + || defined(__PPC__) + +/* include/asm-{arm,i386,mips,ppc}/signal.h */ +struct kernel_old_sigaction { + union { + void (*sa_handler_)(int); + void (*sa_sigaction_)(int, struct siginfo *, void *); + }; + unsigned long sa_mask; + unsigned long sa_flags; + void (*sa_restorer)(void); +} __attribute__((packed,aligned(4))); +#elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) + #define kernel_old_sigaction kernel_sigaction +#endif + +/* Some kernel functions (e.g. sigaction() in 2.6.23) require that the + * exactly match the size of the signal set, even though the API was + * intended to be extensible. We define our own KERNEL_NSIG to deal with + * this. + * Please note that glibc provides signals [1.._NSIG-1], whereas the + * kernel (and this header) provides the range [1..KERNEL_NSIG]. The + * actual number of signals is obviously the same, but the constants + * differ by one. + */ +#ifdef __mips__ +#define KERNEL_NSIG 128 +#else +#define KERNEL_NSIG 64 +#endif + +/* include/asm-{arm,i386,mips,x86_64}/signal.h */ +struct kernel_sigset_t { + unsigned long sig[(KERNEL_NSIG + 8*sizeof(unsigned long) - 1)/ + (8*sizeof(unsigned long))]; +}; + +/* include/asm-{arm,i386,mips,x86_64,ppc}/signal.h */ +struct kernel_sigaction { +#ifdef __mips__ + unsigned long sa_flags; + union { + void (*sa_handler_)(int); + void (*sa_sigaction_)(int, struct siginfo *, void *); + }; + struct kernel_sigset_t sa_mask; +#else + union { + void (*sa_handler_)(int); + void (*sa_sigaction_)(int, struct siginfo *, void *); + }; + unsigned long sa_flags; + void (*sa_restorer)(void); + struct kernel_sigset_t sa_mask; +#endif +}; + +/* include/linux/socket.h */ +struct kernel_sockaddr { + unsigned short sa_family; + char sa_data[14]; +}; + +/* include/asm-{arm,i386,mips,ppc}/stat.h */ +#ifdef __mips__ +#if _MIPS_SIM == _MIPS_SIM_ABI64 +struct kernel_stat { +#else +struct kernel_stat64 { +#endif + unsigned st_dev; + unsigned __pad0[3]; + unsigned long long st_ino; + unsigned st_mode; + unsigned st_nlink; + unsigned st_uid; + unsigned st_gid; + unsigned st_rdev; + unsigned __pad1[3]; + long long st_size; + unsigned st_atime_; + unsigned st_atime_nsec_; + unsigned st_mtime_; + unsigned st_mtime_nsec_; + unsigned st_ctime_; + unsigned st_ctime_nsec_; + unsigned st_blksize; + unsigned __pad2; + unsigned long long st_blocks; +}; +#elif defined __PPC__ +struct kernel_stat64 { + unsigned long long st_dev; + unsigned long long st_ino; + unsigned st_mode; + unsigned st_nlink; + unsigned st_uid; + unsigned st_gid; + unsigned long long st_rdev; + unsigned short int __pad2; + long long st_size; + long st_blksize; + long long st_blocks; + long st_atime_; + unsigned long st_atime_nsec_; + long st_mtime_; + unsigned long st_mtime_nsec_; + long st_ctime_; + unsigned long st_ctime_nsec_; + unsigned long __unused4; + unsigned long __unused5; +}; +#else +struct kernel_stat64 { + unsigned long long st_dev; + unsigned char __pad0[4]; + unsigned __st_ino; + unsigned st_mode; + unsigned st_nlink; + unsigned st_uid; + unsigned st_gid; + unsigned long long st_rdev; + unsigned char __pad3[4]; + long long st_size; + unsigned st_blksize; + unsigned long long st_blocks; + unsigned st_atime_; + unsigned st_atime_nsec_; + unsigned st_mtime_; + unsigned st_mtime_nsec_; + unsigned st_ctime_; + unsigned st_ctime_nsec_; + unsigned long long st_ino; +}; +#endif + +/* include/asm-{arm,i386,mips,x86_64,ppc}/stat.h */ +#if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) +struct kernel_stat { + /* The kernel headers suggest that st_dev and st_rdev should be 32bit + * quantities encoding 12bit major and 20bit minor numbers in an interleaved + * format. In reality, we do not see useful data in the top bits. So, + * we'll leave the padding in here, until we find a better solution. + */ + unsigned short st_dev; + short pad1; + unsigned st_ino; + unsigned short st_mode; + unsigned short st_nlink; + unsigned short st_uid; + unsigned short st_gid; + unsigned short st_rdev; + short pad2; + unsigned st_size; + unsigned st_blksize; + unsigned st_blocks; + unsigned st_atime_; + unsigned st_atime_nsec_; + unsigned st_mtime_; + unsigned st_mtime_nsec_; + unsigned st_ctime_; + unsigned st_ctime_nsec_; + unsigned __unused4; + unsigned __unused5; +}; +#elif defined(__x86_64__) +struct kernel_stat { + unsigned long st_dev; + unsigned long st_ino; + unsigned long st_nlink; + unsigned st_mode; + unsigned st_uid; + unsigned st_gid; + unsigned __pad0; + unsigned long st_rdev; + long st_size; + long st_blksize; + long st_blocks; + unsigned long st_atime_; + unsigned long st_atime_nsec_; + unsigned long st_mtime_; + unsigned long st_mtime_nsec_; + unsigned long st_ctime_; + unsigned long st_ctime_nsec_; + long __unused[3]; +}; +#elif defined(__PPC__) +struct kernel_stat { + unsigned st_dev; + unsigned long st_ino; // ino_t + unsigned long st_mode; // mode_t + unsigned short st_nlink; // nlink_t + unsigned st_uid; // uid_t + unsigned st_gid; // gid_t + unsigned st_rdev; + long st_size; // off_t + unsigned long st_blksize; + unsigned long st_blocks; + unsigned long st_atime_; + unsigned long st_atime_nsec_; + unsigned long st_mtime_; + unsigned long st_mtime_nsec_; + unsigned long st_ctime_; + unsigned long st_ctime_nsec_; + unsigned long __unused4; + unsigned long __unused5; +}; +#elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) +struct kernel_stat { + unsigned st_dev; + int st_pad1[3]; + unsigned st_ino; + unsigned st_mode; + unsigned st_nlink; + unsigned st_uid; + unsigned st_gid; + unsigned st_rdev; + int st_pad2[2]; + long st_size; + int st_pad3; + long st_atime_; + long st_atime_nsec_; + long st_mtime_; + long st_mtime_nsec_; + long st_ctime_; + long st_ctime_nsec_; + int st_blksize; + int st_blocks; + int st_pad4[14]; +}; +#endif + +/* include/asm-{arm,i386,mips,x86_64,ppc}/statfs.h */ +#ifdef __mips__ +#if _MIPS_SIM != _MIPS_SIM_ABI64 +struct kernel_statfs64 { + unsigned long f_type; + unsigned long f_bsize; + unsigned long f_frsize; + unsigned long __pad; + unsigned long long f_blocks; + unsigned long long f_bfree; + unsigned long long f_files; + unsigned long long f_ffree; + unsigned long long f_bavail; + struct { int val[2]; } f_fsid; + unsigned long f_namelen; + unsigned long f_spare[6]; +}; +#endif +#elif !defined(__x86_64__) +struct kernel_statfs64 { + unsigned long f_type; + unsigned long f_bsize; + unsigned long long f_blocks; + unsigned long long f_bfree; + unsigned long long f_bavail; + unsigned long long f_files; + unsigned long long f_ffree; + struct { int val[2]; } f_fsid; + unsigned long f_namelen; + unsigned long f_frsize; + unsigned long f_spare[5]; +}; +#endif + +/* include/asm-{arm,i386,mips,x86_64,ppc,generic}/statfs.h */ +#ifdef __mips__ +struct kernel_statfs { + long f_type; + long f_bsize; + long f_frsize; + long f_blocks; + long f_bfree; + long f_files; + long f_ffree; + long f_bavail; + struct { int val[2]; } f_fsid; + long f_namelen; + long f_spare[6]; +}; +#else +struct kernel_statfs { + /* x86_64 actually defines all these fields as signed, whereas all other */ + /* platforms define them as unsigned. Leaving them at unsigned should not */ + /* cause any problems. */ + unsigned long f_type; + unsigned long f_bsize; + unsigned long f_blocks; + unsigned long f_bfree; + unsigned long f_bavail; + unsigned long f_files; + unsigned long f_ffree; + struct { int val[2]; } f_fsid; + unsigned long f_namelen; + unsigned long f_frsize; + unsigned long f_spare[5]; +}; +#endif + + +/* Definitions missing from the standard header files */ +#ifndef O_DIRECTORY +#if defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) +#define O_DIRECTORY 0040000 +#else +#define O_DIRECTORY 0200000 +#endif +#endif +#ifndef NT_PRXFPREG +#define NT_PRXFPREG 0x46e62b7f +#endif +#ifndef PTRACE_GETFPXREGS +#define PTRACE_GETFPXREGS ((enum __ptrace_request)18) +#endif +#ifndef PR_GET_DUMPABLE +#define PR_GET_DUMPABLE 3 +#endif +#ifndef PR_SET_DUMPABLE +#define PR_SET_DUMPABLE 4 +#endif +#ifndef PR_GET_SECCOMP +#define PR_GET_SECCOMP 21 +#endif +#ifndef PR_SET_SECCOMP +#define PR_SET_SECCOMP 22 +#endif +#ifndef AT_FDCWD +#define AT_FDCWD (-100) +#endif +#ifndef AT_SYMLINK_NOFOLLOW +#define AT_SYMLINK_NOFOLLOW 0x100 +#endif +#ifndef AT_REMOVEDIR +#define AT_REMOVEDIR 0x200 +#endif +#ifndef MREMAP_FIXED +#define MREMAP_FIXED 2 +#endif +#ifndef SA_RESTORER +#define SA_RESTORER 0x04000000 +#endif +#ifndef CPUCLOCK_PROF +#define CPUCLOCK_PROF 0 +#endif +#ifndef CPUCLOCK_VIRT +#define CPUCLOCK_VIRT 1 +#endif +#ifndef CPUCLOCK_SCHED +#define CPUCLOCK_SCHED 2 +#endif +#ifndef CPUCLOCK_PERTHREAD_MASK +#define CPUCLOCK_PERTHREAD_MASK 4 +#endif +#ifndef MAKE_PROCESS_CPUCLOCK +#define MAKE_PROCESS_CPUCLOCK(pid, clock) \ + ((~(int)(pid) << 3) | (int)(clock)) +#endif +#ifndef MAKE_THREAD_CPUCLOCK +#define MAKE_THREAD_CPUCLOCK(tid, clock) \ + ((~(int)(tid) << 3) | (int)((clock) | CPUCLOCK_PERTHREAD_MASK)) +#endif + +#ifndef FUTEX_WAIT +#define FUTEX_WAIT 0 +#endif +#ifndef FUTEX_WAKE +#define FUTEX_WAKE 1 +#endif +#ifndef FUTEX_FD +#define FUTEX_FD 2 +#endif +#ifndef FUTEX_REQUEUE +#define FUTEX_REQUEUE 3 +#endif +#ifndef FUTEX_CMP_REQUEUE +#define FUTEX_CMP_REQUEUE 4 +#endif +#ifndef FUTEX_WAKE_OP +#define FUTEX_WAKE_OP 5 +#endif +#ifndef FUTEX_LOCK_PI +#define FUTEX_LOCK_PI 6 +#endif +#ifndef FUTEX_UNLOCK_PI +#define FUTEX_UNLOCK_PI 7 +#endif +#ifndef FUTEX_TRYLOCK_PI +#define FUTEX_TRYLOCK_PI 8 +#endif +#ifndef FUTEX_PRIVATE_FLAG +#define FUTEX_PRIVATE_FLAG 128 +#endif +#ifndef FUTEX_CMD_MASK +#define FUTEX_CMD_MASK ~FUTEX_PRIVATE_FLAG +#endif +#ifndef FUTEX_WAIT_PRIVATE +#define FUTEX_WAIT_PRIVATE (FUTEX_WAIT | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAKE_PRIVATE +#define FUTEX_WAKE_PRIVATE (FUTEX_WAKE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_REQUEUE_PRIVATE +#define FUTEX_REQUEUE_PRIVATE (FUTEX_REQUEUE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_CMP_REQUEUE_PRIVATE +#define FUTEX_CMP_REQUEUE_PRIVATE (FUTEX_CMP_REQUEUE | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_WAKE_OP_PRIVATE +#define FUTEX_WAKE_OP_PRIVATE (FUTEX_WAKE_OP | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_LOCK_PI_PRIVATE +#define FUTEX_LOCK_PI_PRIVATE (FUTEX_LOCK_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_UNLOCK_PI_PRIVATE +#define FUTEX_UNLOCK_PI_PRIVATE (FUTEX_UNLOCK_PI | FUTEX_PRIVATE_FLAG) +#endif +#ifndef FUTEX_TRYLOCK_PI_PRIVATE +#define FUTEX_TRYLOCK_PI_PRIVATE (FUTEX_TRYLOCK_PI | FUTEX_PRIVATE_FLAG) +#endif + + +#if defined(__x86_64__) +#ifndef ARCH_SET_GS +#define ARCH_SET_GS 0x1001 +#endif +#ifndef ARCH_GET_GS +#define ARCH_GET_GS 0x1004 +#endif +#endif + +#if defined(__i386__) +#ifndef __NR_quotactl +#define __NR_quotactl 131 +#endif +#ifndef __NR_setresuid +#define __NR_setresuid 164 +#define __NR_getresuid 165 +#define __NR_setresgid 170 +#define __NR_getresgid 171 +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn 173 +#define __NR_rt_sigaction 174 +#define __NR_rt_sigprocmask 175 +#define __NR_rt_sigpending 176 +#define __NR_rt_sigsuspend 179 +#endif +#ifndef __NR_pread64 +#define __NR_pread64 180 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 181 +#endif +#ifndef __NR_ugetrlimit +#define __NR_ugetrlimit 191 +#endif +#ifndef __NR_stat64 +#define __NR_stat64 195 +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 197 +#endif +#ifndef __NR_setresuid32 +#define __NR_setresuid32 208 +#define __NR_getresuid32 209 +#define __NR_setresgid32 210 +#define __NR_getresgid32 211 +#endif +#ifndef __NR_setfsuid32 +#define __NR_setfsuid32 215 +#define __NR_setfsgid32 216 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 220 +#endif +#ifndef __NR_gettid +#define __NR_gettid 224 +#endif +#ifndef __NR_readahead +#define __NR_readahead 225 +#endif +#ifndef __NR_setxattr +#define __NR_setxattr 226 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 227 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 229 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 230 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 232 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 233 +#endif +#ifndef __NR_tkill +#define __NR_tkill 238 +#endif +#ifndef __NR_futex +#define __NR_futex 240 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 241 +#define __NR_sched_getaffinity 242 +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 258 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 265 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 266 +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 268 +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 269 +#endif +#ifndef __NR_fadvise64_64 +#define __NR_fadvise64_64 272 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 289 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 290 +#endif +#ifndef __NR_openat +#define __NR_openat 295 +#endif +#ifndef __NR_fstatat64 +#define __NR_fstatat64 300 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 301 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 317 +#endif +#ifndef __NR_getcpu +#define __NR_getcpu 318 +#endif +#ifndef __NR_fallocate +#define __NR_fallocate 324 +#endif +/* End of i386 definitions */ +#elif defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_SYSCALL_BASE + 164) +#define __NR_getresuid (__NR_SYSCALL_BASE + 165) +#define __NR_setresgid (__NR_SYSCALL_BASE + 170) +#define __NR_getresgid (__NR_SYSCALL_BASE + 171) +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn (__NR_SYSCALL_BASE + 173) +#define __NR_rt_sigaction (__NR_SYSCALL_BASE + 174) +#define __NR_rt_sigprocmask (__NR_SYSCALL_BASE + 175) +#define __NR_rt_sigpending (__NR_SYSCALL_BASE + 176) +#define __NR_rt_sigsuspend (__NR_SYSCALL_BASE + 179) +#endif +#ifndef __NR_pread64 +#define __NR_pread64 (__NR_SYSCALL_BASE + 180) +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 (__NR_SYSCALL_BASE + 181) +#endif +#ifndef __NR_ugetrlimit +#define __NR_ugetrlimit (__NR_SYSCALL_BASE + 191) +#endif +#ifndef __NR_stat64 +#define __NR_stat64 (__NR_SYSCALL_BASE + 195) +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 (__NR_SYSCALL_BASE + 197) +#endif +#ifndef __NR_setresuid32 +#define __NR_setresuid32 (__NR_SYSCALL_BASE + 208) +#define __NR_getresuid32 (__NR_SYSCALL_BASE + 209) +#define __NR_setresgid32 (__NR_SYSCALL_BASE + 210) +#define __NR_getresgid32 (__NR_SYSCALL_BASE + 211) +#endif +#ifndef __NR_setfsuid32 +#define __NR_setfsuid32 (__NR_SYSCALL_BASE + 215) +#define __NR_setfsgid32 (__NR_SYSCALL_BASE + 216) +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 (__NR_SYSCALL_BASE + 217) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_SYSCALL_BASE + 224) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_SYSCALL_BASE + 225) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_SYSCALL_BASE + 226) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_SYSCALL_BASE + 227) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_SYSCALL_BASE + 229) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_SYSCALL_BASE + 230) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_SYSCALL_BASE + 232) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_SYSCALL_BASE + 233) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_SYSCALL_BASE + 238) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_SYSCALL_BASE + 240) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_SYSCALL_BASE + 241) +#define __NR_sched_getaffinity (__NR_SYSCALL_BASE + 242) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_SYSCALL_BASE + 256) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_SYSCALL_BASE + 263) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_SYSCALL_BASE + 264) +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 (__NR_SYSCALL_BASE + 266) +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 (__NR_SYSCALL_BASE + 267) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_SYSCALL_BASE + 314) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_SYSCALL_BASE + 315) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_SYSCALL_BASE + 344) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_SYSCALL_BASE + 345) +#endif +/* End of ARM 3/EABI definitions */ +#elif defined(__x86_64__) +#ifndef __NR_pread64 +#define __NR_pread64 17 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 18 +#endif +#ifndef __NR_setresuid +#define __NR_setresuid 117 +#define __NR_getresuid 118 +#define __NR_setresgid 119 +#define __NR_getresgid 120 +#endif +#ifndef __NR_quotactl +#define __NR_quotactl 179 +#endif +#ifndef __NR_gettid +#define __NR_gettid 186 +#endif +#ifndef __NR_readahead +#define __NR_readahead 187 +#endif +#ifndef __NR_setxattr +#define __NR_setxattr 188 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 189 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 191 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 192 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 194 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 195 +#endif +#ifndef __NR_tkill +#define __NR_tkill 200 +#endif +#ifndef __NR_futex +#define __NR_futex 202 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 203 +#define __NR_sched_getaffinity 204 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 217 +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 218 +#endif +#ifndef __NR_fadvise64 +#define __NR_fadvise64 221 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 228 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 229 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 251 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 252 +#endif +#ifndef __NR_openat +#define __NR_openat 257 +#endif +#ifndef __NR_newfstatat +#define __NR_newfstatat 262 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 263 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 279 +#endif +#ifndef __NR_fallocate +#define __NR_fallocate 285 +#endif +/* End of x86-64 definitions */ +#elif defined(__mips__) +#if _MIPS_SIM == _MIPS_SIM_ABI32 +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_Linux + 185) +#define __NR_getresuid (__NR_Linux + 186) +#define __NR_setresgid (__NR_Linux + 190) +#define __NR_getresgid (__NR_Linux + 191) +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn (__NR_Linux + 193) +#define __NR_rt_sigaction (__NR_Linux + 194) +#define __NR_rt_sigprocmask (__NR_Linux + 195) +#define __NR_rt_sigpending (__NR_Linux + 196) +#define __NR_rt_sigsuspend (__NR_Linux + 199) +#endif +#ifndef __NR_pread64 +#define __NR_pread64 (__NR_Linux + 200) +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 (__NR_Linux + 201) +#endif +#ifndef __NR_stat64 +#define __NR_stat64 (__NR_Linux + 213) +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 (__NR_Linux + 215) +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 (__NR_Linux + 219) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_Linux + 222) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_Linux + 223) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_Linux + 224) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_Linux + 225) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_Linux + 227) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_Linux + 228) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_Linux + 230) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_Linux + 231) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_Linux + 236) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_Linux + 238) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_Linux + 239) +#define __NR_sched_getaffinity (__NR_Linux + 240) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_Linux + 252) +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 (__NR_Linux + 255) +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 (__NR_Linux + 256) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_Linux + 263) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_Linux + 264) +#endif +#ifndef __NR_openat +#define __NR_openat (__NR_Linux + 288) +#endif +#ifndef __NR_fstatat +#define __NR_fstatat (__NR_Linux + 293) +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat (__NR_Linux + 294) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_Linux + 308) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_Linux + 312) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_Linux + 314) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_Linux + 315) +#endif +/* End of MIPS (old 32bit API) definitions */ +#elif _MIPS_SIM == _MIPS_SIM_ABI64 +#ifndef __NR_pread64 +#define __NR_pread64 (__NR_Linux + 16) +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 (__NR_Linux + 17) +#endif +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_Linux + 115) +#define __NR_getresuid (__NR_Linux + 116) +#define __NR_setresgid (__NR_Linux + 117) +#define __NR_getresgid (__NR_Linux + 118) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_Linux + 178) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_Linux + 179) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_Linux + 180) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_Linux + 181) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_Linux + 183) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_Linux + 184) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_Linux + 186) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_Linux + 187) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_Linux + 192) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_Linux + 194) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_Linux + 195) +#define __NR_sched_getaffinity (__NR_Linux + 196) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_Linux + 212) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_Linux + 222) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_Linux + 223) +#endif +#ifndef __NR_openat +#define __NR_openat (__NR_Linux + 247) +#endif +#ifndef __NR_fstatat +#define __NR_fstatat (__NR_Linux + 252) +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat (__NR_Linux + 253) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_Linux + 267) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_Linux + 271) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_Linux + 273) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_Linux + 274) +#endif +/* End of MIPS (64bit API) definitions */ +#else +#ifndef __NR_setresuid +#define __NR_setresuid (__NR_Linux + 115) +#define __NR_getresuid (__NR_Linux + 116) +#define __NR_setresgid (__NR_Linux + 117) +#define __NR_getresgid (__NR_Linux + 118) +#endif +#ifndef __NR_gettid +#define __NR_gettid (__NR_Linux + 178) +#endif +#ifndef __NR_readahead +#define __NR_readahead (__NR_Linux + 179) +#endif +#ifndef __NR_setxattr +#define __NR_setxattr (__NR_Linux + 180) +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr (__NR_Linux + 181) +#endif +#ifndef __NR_getxattr +#define __NR_getxattr (__NR_Linux + 183) +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr (__NR_Linux + 184) +#endif +#ifndef __NR_listxattr +#define __NR_listxattr (__NR_Linux + 186) +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr (__NR_Linux + 187) +#endif +#ifndef __NR_tkill +#define __NR_tkill (__NR_Linux + 192) +#endif +#ifndef __NR_futex +#define __NR_futex (__NR_Linux + 194) +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity (__NR_Linux + 195) +#define __NR_sched_getaffinity (__NR_Linux + 196) +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address (__NR_Linux + 213) +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 (__NR_Linux + 217) +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 (__NR_Linux + 218) +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime (__NR_Linux + 226) +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres (__NR_Linux + 227) +#endif +#ifndef __NR_openat +#define __NR_openat (__NR_Linux + 251) +#endif +#ifndef __NR_fstatat +#define __NR_fstatat (__NR_Linux + 256) +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat (__NR_Linux + 257) +#endif +#ifndef __NR_move_pages +#define __NR_move_pages (__NR_Linux + 271) +#endif +#ifndef __NR_getcpu +#define __NR_getcpu (__NR_Linux + 275) +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set (__NR_Linux + 277) +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get (__NR_Linux + 278) +#endif +/* End of MIPS (new 32bit API) definitions */ +#endif +/* End of MIPS definitions */ +#elif defined(__PPC__) +#ifndef __NR_setfsuid +#define __NR_setfsuid 138 +#define __NR_setfsgid 139 +#endif +#ifndef __NR_setresuid +#define __NR_setresuid 164 +#define __NR_getresuid 165 +#define __NR_setresgid 169 +#define __NR_getresgid 170 +#endif +#ifndef __NR_rt_sigaction +#define __NR_rt_sigreturn 172 +#define __NR_rt_sigaction 173 +#define __NR_rt_sigprocmask 174 +#define __NR_rt_sigpending 175 +#define __NR_rt_sigsuspend 178 +#endif +#ifndef __NR_pread64 +#define __NR_pread64 179 +#endif +#ifndef __NR_pwrite64 +#define __NR_pwrite64 180 +#endif +#ifndef __NR_ugetrlimit +#define __NR_ugetrlimit 190 +#endif +#ifndef __NR_readahead +#define __NR_readahead 191 +#endif +#ifndef __NR_stat64 +#define __NR_stat64 195 +#endif +#ifndef __NR_fstat64 +#define __NR_fstat64 197 +#endif +#ifndef __NR_getdents64 +#define __NR_getdents64 202 +#endif +#ifndef __NR_gettid +#define __NR_gettid 207 +#endif +#ifndef __NR_tkill +#define __NR_tkill 208 +#endif +#ifndef __NR_setxattr +#define __NR_setxattr 209 +#endif +#ifndef __NR_lsetxattr +#define __NR_lsetxattr 210 +#endif +#ifndef __NR_getxattr +#define __NR_getxattr 212 +#endif +#ifndef __NR_lgetxattr +#define __NR_lgetxattr 213 +#endif +#ifndef __NR_listxattr +#define __NR_listxattr 215 +#endif +#ifndef __NR_llistxattr +#define __NR_llistxattr 216 +#endif +#ifndef __NR_futex +#define __NR_futex 221 +#endif +#ifndef __NR_sched_setaffinity +#define __NR_sched_setaffinity 222 +#define __NR_sched_getaffinity 223 +#endif +#ifndef __NR_set_tid_address +#define __NR_set_tid_address 232 +#endif +#ifndef __NR_clock_gettime +#define __NR_clock_gettime 246 +#endif +#ifndef __NR_clock_getres +#define __NR_clock_getres 247 +#endif +#ifndef __NR_statfs64 +#define __NR_statfs64 252 +#endif +#ifndef __NR_fstatfs64 +#define __NR_fstatfs64 253 +#endif +#ifndef __NR_fadvise64_64 +#define __NR_fadvise64_64 254 +#endif +#ifndef __NR_ioprio_set +#define __NR_ioprio_set 273 +#endif +#ifndef __NR_ioprio_get +#define __NR_ioprio_get 274 +#endif +#ifndef __NR_openat +#define __NR_openat 286 +#endif +#ifndef __NR_fstatat64 +#define __NR_fstatat64 291 +#endif +#ifndef __NR_unlinkat +#define __NR_unlinkat 292 +#endif +#ifndef __NR_move_pages +#define __NR_move_pages 301 +#endif +#ifndef __NR_getcpu +#define __NR_getcpu 302 +#endif +/* End of powerpc defininitions */ +#endif + + +/* After forking, we must make sure to only call system calls. */ +#if defined __BOUNDED_POINTERS__ + #error "Need to port invocations of syscalls for bounded ptrs" +#else + /* The core dumper and the thread lister get executed after threads + * have been suspended. As a consequence, we cannot call any functions + * that acquire locks. Unfortunately, libc wraps most system calls + * (e.g. in order to implement pthread_atfork, and to make calls + * cancellable), which means we cannot call these functions. Instead, + * we have to call syscall() directly. + */ + #undef LSS_ERRNO + #ifdef SYS_ERRNO + /* Allow the including file to override the location of errno. This can + * be useful when using clone() with the CLONE_VM option. + */ + #define LSS_ERRNO SYS_ERRNO + #else + #define LSS_ERRNO errno + #endif + + #undef LSS_INLINE + #ifdef SYS_INLINE + #define LSS_INLINE SYS_INLINE + #else + #define LSS_INLINE static inline + #endif + + /* Allow the including file to override the prefix used for all new + * system calls. By default, it will be set to "sys_". + */ + #undef LSS_NAME + #ifndef SYS_PREFIX + #define LSS_NAME(name) sys_##name + #elif defined SYS_PREFIX && SYS_PREFIX < 0 + #define LSS_NAME(name) name + #elif defined SYS_PREFIX && SYS_PREFIX == 0 + #define LSS_NAME(name) sys0_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 1 + #define LSS_NAME(name) sys1_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 2 + #define LSS_NAME(name) sys2_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 3 + #define LSS_NAME(name) sys3_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 4 + #define LSS_NAME(name) sys4_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 5 + #define LSS_NAME(name) sys5_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 6 + #define LSS_NAME(name) sys6_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 7 + #define LSS_NAME(name) sys7_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 8 + #define LSS_NAME(name) sys8_##name + #elif defined SYS_PREFIX && SYS_PREFIX == 9 + #define LSS_NAME(name) sys9_##name + #endif + + #undef LSS_RETURN + #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) \ + || defined(__ARM_EABI__)) + /* Failing system calls return a negative result in the range of + * -1..-4095. These are "errno" values with the sign inverted. + */ + #define LSS_RETURN(type, res) \ + do { \ + if ((unsigned long)(res) >= (unsigned long)(-4095)) { \ + LSS_ERRNO = -(res); \ + res = -1; \ + } \ + return (type) (res); \ + } while (0) + #elif defined(__mips__) + /* On MIPS, failing system calls return -1, and set errno in a + * separate CPU register. + */ + #define LSS_RETURN(type, res, err) \ + do { \ + if (err) { \ + LSS_ERRNO = (res); \ + res = -1; \ + } \ + return (type) (res); \ + } while (0) + #elif defined(__PPC__) + /* On PPC, failing system calls return -1, and set errno in a + * separate CPU register. See linux/unistd.h. + */ + #define LSS_RETURN(type, res, err) \ + do { \ + if (err & 0x10000000 ) { \ + LSS_ERRNO = (res); \ + res = -1; \ + } \ + return (type) (res); \ + } while (0) + #endif + #if defined(__i386__) + /* In PIC mode (e.g. when building shared libraries), gcc for i386 + * reserves ebx. Unfortunately, most distribution ship with implementations + * of _syscallX() which clobber ebx. + * Also, most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_ENTRYPOINT + #ifdef SYS_SYSCALL_ENTRYPOINT + static inline void (**LSS_NAME(get_syscall_entrypoint)(void))(void) { + void (**entrypoint)(void); + asm volatile(".bss\n" + ".align 8\n" + ".globl "SYS_SYSCALL_ENTRYPOINT"\n" + ".common "SYS_SYSCALL_ENTRYPOINT",8,8\n" + ".previous\n" + /* This logically does 'lea "SYS_SYSCALL_ENTRYPOINT", %0' */ + "call 0f\n" + "0:pop %0\n" + "add $_GLOBAL_OFFSET_TABLE_+[.-0b], %0\n" + "mov "SYS_SYSCALL_ENTRYPOINT"@GOT(%0), %0\n" + : "=r"(entrypoint)); + return entrypoint; + } + + #define LSS_ENTRYPOINT ".bss\n" \ + ".align 8\n" \ + ".globl "SYS_SYSCALL_ENTRYPOINT"\n" \ + ".common "SYS_SYSCALL_ENTRYPOINT",8,8\n" \ + ".previous\n" \ + /* Check the SYS_SYSCALL_ENTRYPOINT vector */ \ + "push %%eax\n" \ + "call 10000f\n" \ + "10000:pop %%eax\n" \ + "add $_GLOBAL_OFFSET_TABLE_+[.-10000b], %%eax\n" \ + "mov "SYS_SYSCALL_ENTRYPOINT"@GOT(%%eax), %%eax\n"\ + "mov 0(%%eax), %%eax\n" \ + "test %%eax, %%eax\n" \ + "jz 10001f\n" \ + "push %%eax\n" \ + "lea 10002f, %%eax\n" \ + "xchg 4(%%esp), %%eax\n" \ + "ret\n" \ + "10001:pop %%eax\n" \ + "int $0x80\n" \ + "10002:\n" + #else + #define LSS_ENTRYPOINT "int $0x80\n" + #endif + #undef LSS_BODY + #define LSS_BODY(type,args...) \ + long __res; \ + __asm__ __volatile__("push %%ebx\n" \ + "movl %2,%%ebx\n" \ + LSS_ENTRYPOINT \ + "pop %%ebx" \ + args \ + : "esp", "memory"); \ + LSS_RETURN(type,__res) + #undef _syscall0 + #define _syscall0(type,name) \ + type LSS_NAME(name)(void) { \ + long __res; \ + __asm__ volatile(LSS_ENTRYPOINT \ + : "=a" (__res) \ + : "0" (__NR_##name) \ + : "esp", "memory"); \ + LSS_RETURN(type,__res); \ + } + #undef _syscall1 + #define _syscall1(type,name,type1,arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name), "ri" ((long)(arg1))); \ + } + #undef _syscall2 + #define _syscall2(type,name,type1,arg1,type2,arg2) \ + type LSS_NAME(name)(type1 arg1,type2 arg2) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name),"ri" ((long)(arg1)), "c" ((long)(arg2))); \ + } + #undef _syscall3 + #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ + type LSS_NAME(name)(type1 arg1,type2 arg2,type3 arg3) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)), \ + "d" ((long)(arg3))); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_BODY(type, \ + : "=a" (__res) \ + : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)), \ + "d" ((long)(arg3)),"S" ((long)(arg4))); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + long __res; \ + __asm__ __volatile__("push %%ebx\n" \ + "movl %2,%%ebx\n" \ + "movl %1,%%eax\n" \ + LSS_ENTRYPOINT \ + "pop %%ebx" \ + : "=a" (__res) \ + : "i" (__NR_##name), "ri" ((long)(arg1)), \ + "c" ((long)(arg2)), "d" ((long)(arg3)), \ + "S" ((long)(arg4)), "D" ((long)(arg5)) \ + : "esp", "memory"); \ + LSS_RETURN(type,__res); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + long __res; \ + struct { long __a1; long __a6; } __s = { (long)arg1, (long) arg6 }; \ + __asm__ __volatile__("push %%ebp\n" \ + "push %%ebx\n" \ + "movl 4(%2),%%ebp\n" \ + "movl 0(%2), %%ebx\n" \ + "movl %1,%%eax\n" \ + LSS_ENTRYPOINT \ + "pop %%ebx\n" \ + "pop %%ebp" \ + : "=a" (__res) \ + : "i" (__NR_##name), "0" ((long)(&__s)), \ + "c" ((long)(arg2)), "d" ((long)(arg3)), \ + "S" ((long)(arg4)), "D" ((long)(arg5)) \ + : "esp", "memory"); \ + LSS_RETURN(type,__res); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __res; + __asm__ __volatile__(/* if (fn == NULL) + * return -EINVAL; + */ + "movl %3,%%ecx\n" + "jecxz 1f\n" + + /* if (child_stack == NULL) + * return -EINVAL; + */ + "movl %4,%%ecx\n" + "jecxz 1f\n" + + /* Set up alignment of the child stack: + * child_stack = (child_stack & ~0xF) - 20; + */ + "andl $-16,%%ecx\n" + "subl $20,%%ecx\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "movl %6,%%eax\n" + "movl %%eax,4(%%ecx)\n" + "movl %3,%%eax\n" + "movl %%eax,(%%ecx)\n" + + /* %eax = syscall(%eax = __NR_clone, + * %ebx = flags, + * %ecx = child_stack, + * %edx = parent_tidptr, + * %esi = newtls, + * %edi = child_tidptr) + * Also, make sure that %ebx gets preserved as it is + * used in PIC mode. + */ + "movl %8,%%esi\n" + "movl %7,%%edx\n" + "movl %5,%%eax\n" + "movl %9,%%edi\n" + "pushl %%ebx\n" + "movl %%eax,%%ebx\n" + "movl %2,%%eax\n" + LSS_ENTRYPOINT + + /* In the parent: restore %ebx + * In the child: move "fn" into %ebx + */ + "popl %%ebx\n" + + /* if (%eax != 0) + * return %eax; + */ + "test %%eax,%%eax\n" + "jnz 1f\n" + + /* In the child, now. Terminate frame pointer chain. + */ + "movl $0,%%ebp\n" + + /* Call "fn". "arg" is already on the stack. + */ + "call *%%ebx\n" + + /* Call _exit(%ebx). Unfortunately older versions + * of gcc restrict the number of arguments that can + * be passed to asm(). So, we need to hard-code the + * system call number. + */ + "movl %%eax,%%ebx\n" + "movl $1,%%eax\n" + LSS_ENTRYPOINT + + /* Return to parent. + */ + "1:\n" + : "=a" (__res) + : "0"(-EINVAL), "i"(__NR_clone), + "m"(fn), "m"(child_stack), "m"(flags), "m"(arg), + "m"(parent_tidptr), "m"(newtls), "m"(child_tidptr) + : "esp", "memory", "ecx", "edx", "esi", "edi"); + LSS_RETURN(int, __res); + } + + #define __NR__fadvise64_64 __NR_fadvise64_64 + LSS_INLINE _syscall6(int, _fadvise64_64, int, fd, + unsigned, offset_lo, unsigned, offset_hi, + unsigned, len_lo, unsigned, len_hi, + int, advice) + + LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, + loff_t len, int advice) { + return LSS_NAME(_fadvise64_64)(fd, + (unsigned)offset, (unsigned)(offset >>32), + (unsigned)len, (unsigned)(len >> 32), + advice); + } + + #define __NR__fallocate __NR_fallocate + LSS_INLINE _syscall6(int, _fallocate, int, fd, + int, mode, + unsigned, offset_lo, unsigned, offset_hi, + unsigned, len_lo, unsigned, len_hi) + + LSS_INLINE int LSS_NAME(fallocate)(int fd, int mode, + loff_t offset, loff_t len) { + union { loff_t off; unsigned w[2]; } o = { offset }, l = { len }; + return LSS_NAME(_fallocate)(fd, mode, o.w[0], o.w[1], l.w[0], l.w[1]); + } + + LSS_INLINE _syscall1(int, set_thread_area, void *, u) + LSS_INLINE _syscall1(int, get_thread_area, void *, u) + + LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) { + /* On i386, the kernel does not know how to return from a signal + * handler. Instead, it relies on user space to provide a + * restorer function that calls the {rt_,}sigreturn() system call. + * Unfortunately, we cannot just reference the glibc version of this + * function, as glibc goes out of its way to make it inaccessible. + */ + void (*res)(void); + __asm__ __volatile__("call 2f\n" + "0:.align 16\n" + "1:movl %1,%%eax\n" + LSS_ENTRYPOINT + "2:popl %0\n" + "addl $(1b-0b),%0\n" + : "=a" (res) + : "i" (__NR_rt_sigreturn)); + return res; + } + LSS_INLINE void (*LSS_NAME(restore)(void))(void) { + /* On i386, the kernel does not know how to return from a signal + * handler. Instead, it relies on user space to provide a + * restorer function that calls the {rt_,}sigreturn() system call. + * Unfortunately, we cannot just reference the glibc version of this + * function, as glibc goes out of its way to make it inaccessible. + */ + void (*res)(void); + __asm__ __volatile__("call 2f\n" + "0:.align 16\n" + "1:pop %%eax\n" + "movl %1,%%eax\n" + LSS_ENTRYPOINT + "2:popl %0\n" + "addl $(1b-0b),%0\n" + : "=a" (res) + : "i" (__NR_sigreturn)); + return res; + } + #elif defined(__x86_64__) + /* There are no known problems with any of the _syscallX() macros + * currently shipping for x86_64, but we still need to be able to define + * our own version so that we can override the location of the errno + * location (e.g. when using the clone() system call with the CLONE_VM + * option). + */ + #undef LSS_ENTRYPOINT + #ifdef SYS_SYSCALL_ENTRYPOINT + static inline void (**LSS_NAME(get_syscall_entrypoint)(void))(void) { + void (**entrypoint)(void); + asm volatile(".bss\n" + ".align 8\n" + ".globl "SYS_SYSCALL_ENTRYPOINT"\n" + ".common "SYS_SYSCALL_ENTRYPOINT",8,8\n" + ".previous\n" + "mov "SYS_SYSCALL_ENTRYPOINT"@GOTPCREL(%%rip), %0\n" + : "=r"(entrypoint)); + return entrypoint; + } + + #define LSS_ENTRYPOINT \ + ".bss\n" \ + ".align 8\n" \ + ".globl "SYS_SYSCALL_ENTRYPOINT"\n" \ + ".common "SYS_SYSCALL_ENTRYPOINT",8,8\n" \ + ".previous\n" \ + "mov "SYS_SYSCALL_ENTRYPOINT"@GOTPCREL(%%rip), %%rcx\n" \ + "mov 0(%%rcx), %%rcx\n" \ + "test %%rcx, %%rcx\n" \ + "jz 10001f\n" \ + "call *%%rcx\n" \ + "jmp 10002f\n" \ + "10001:syscall\n" \ + "10002:\n" + + #else + #define LSS_ENTRYPOINT "syscall\n" + #endif + #undef LSS_BODY + #define LSS_BODY(type,name, ...) \ + long __res; \ + __asm__ __volatile__(LSS_ENTRYPOINT \ + : "=a" (__res) : "0" (__NR_##name), \ + ##__VA_ARGS__ : "r11", "rcx", "memory"); \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type,name) \ + type LSS_NAME(name)() { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type,name,type1,arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(type, name, "D" ((long)(arg1))); \ + } + #undef _syscall2 + #define _syscall2(type,name,type1,arg1,type2,arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2))); \ + } + #undef _syscall3 + #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2)), \ + "d" ((long)(arg3))); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + long __res; \ + __asm__ __volatile__("movq %5,%%r10;" LSS_ENTRYPOINT : \ + "=a" (__res) : "0" (__NR_##name), \ + "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)), \ + "r" ((long)(arg4)) : "r10", "r11", "rcx", "memory"); \ + LSS_RETURN(type, __res); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + long __res; \ + __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8;" LSS_ENTRYPOINT :\ + "=a" (__res) : "0" (__NR_##name), \ + "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)), \ + "r" ((long)(arg4)), "r" ((long)(arg5)) : \ + "r8", "r10", "r11", "rcx", "memory"); \ + LSS_RETURN(type, __res); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + long __res; \ + __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8; movq %7,%%r9;" \ + LSS_ENTRYPOINT : \ + "=a" (__res) : "0" (__NR_##name), \ + "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)), \ + "r" ((long)(arg4)), "r" ((long)(arg5)), "r" ((long)(arg6)) : \ + "r8", "r9", "r10", "r11", "rcx", "memory"); \ + LSS_RETURN(type, __res); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __res; + { + __asm__ __volatile__(/* if (fn == NULL) + * return -EINVAL; + */ + "testq %4,%4\n" + "jz 1f\n" + + /* if (child_stack == NULL) + * return -EINVAL; + */ + "testq %5,%5\n" + "jz 1f\n" + + /* childstack -= 2*sizeof(void *); + */ + "subq $16,%5\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "movq %7,8(%5)\n" + "movq %4,0(%5)\n" + + /* %rax = syscall(%rax = __NR_clone, + * %rdi = flags, + * %rsi = child_stack, + * %rdx = parent_tidptr, + * %r8 = new_tls, + * %r10 = child_tidptr) + */ + "movq %2,%%rax\n" + "movq %9,%%r8\n" + "movq %10,%%r10\n" + LSS_ENTRYPOINT + + /* if (%rax != 0) + * return; + */ + "testq %%rax,%%rax\n" + "jnz 1f\n" + + /* In the child. Terminate frame pointer chain. + */ + "xorq %%rbp,%%rbp\n" + + /* Call "fn(arg)". + */ + "popq %%rax\n" + "popq %%rdi\n" + "call *%%rax\n" + + /* Call _exit(%ebx). + */ + "movq %%rax,%%rdi\n" + "movq %3,%%rax\n" + LSS_ENTRYPOINT + + /* Return to parent. + */ + "1:\n" + : "=a" (__res) + : "0"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit), + "r"(fn), "S"(child_stack), "D"(flags), "r"(arg), + "d"(parent_tidptr), "r"(newtls), + "r"(child_tidptr) + : "rsp", "memory", "r8", "r10", "r11", "rcx"); + } + LSS_RETURN(int, __res); + } + LSS_INLINE _syscall2(int, arch_prctl, int, c, void *, a) + LSS_INLINE _syscall4(int, fadvise64, int, fd, loff_t, offset, loff_t, len, + int, advice) + + LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) { + /* On x86-64, the kernel does not know how to return from + * a signal handler. Instead, it relies on user space to provide a + * restorer function that calls the rt_sigreturn() system call. + * Unfortunately, we cannot just reference the glibc version of this + * function, as glibc goes out of its way to make it inaccessible. + */ + void (*res)(void); + __asm__ __volatile__("call 2f\n" + "0:.align 16\n" + "1:movq %1,%%rax\n" + LSS_ENTRYPOINT + "2:popq %0\n" + "addq $(1b-0b),%0\n" + : "=a" (res) + : "i" (__NR_rt_sigreturn)); + return res; + } + #elif defined(__ARM_ARCH_3__) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all of the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(r,a) register long __r##r __asm__("r"#r) = (long)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register long __res_r0 __asm__("r0"); \ + long __res; \ + __asm__ __volatile__ (__syscall(name) \ + : "=r"(__res_r0) : args : "lr", "memory"); \ + __res = __res_r0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)() { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __res; + { + register int __flags __asm__("r0") = flags; + register void *__stack __asm__("r1") = child_stack; + register void *__ptid __asm__("r2") = parent_tidptr; + register void *__tls __asm__("r3") = newtls; + register int *__ctid __asm__("r4") = child_tidptr; + __asm__ __volatile__(/* if (fn == NULL || child_stack == NULL) + * return -EINVAL; + */ + "cmp %2,#0\n" + "cmpne %3,#0\n" + "moveq %0,%1\n" + "beq 1f\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "str %5,[%3,#-4]!\n" + "str %2,[%3,#-4]!\n" + + /* %r0 = syscall(%r0 = flags, + * %r1 = child_stack, + * %r2 = parent_tidptr, + * %r3 = newtls, + * %r4 = child_tidptr) + */ + __syscall(clone)"\n" + + /* if (%r0 != 0) + * return %r0; + */ + "movs %0,r0\n" + "bne 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ldr r0,[sp, #4]\n" + "mov lr,pc\n" + "ldr pc,[sp]\n" + + /* Call _exit(%r0). + */ + __syscall(exit)"\n" + "1:\n" + : "=r" (__res) + : "i"(-EINVAL), + "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid) + : "cc", "lr", "memory"); + } + LSS_RETURN(int, __res); + } + #elif defined(__ARM_EABI__) + /* Most definitions of _syscallX() neglect to mark "memory" as being + * clobbered. This causes problems with compilers, that do a better job + * at optimizing across __asm__ calls. + * So, we just have to redefine all fo the _syscallX() macros. + */ + #undef LSS_REG + #define LSS_REG(r,a) register long __r##r __asm__("r"#r) = (long)a + #undef LSS_BODY + #define LSS_BODY(type,name,args...) \ + register long __res_r0 __asm__("r0"); \ + long __res; \ + __asm__ __volatile__ ("push {r7}\n" \ + "mov r7, %1\n" \ + "swi 0x0\n" \ + "pop {r7}\n" \ + : "=r"(__res_r0) \ + : "i"(__NR_##name) , ## args \ + : "lr", "memory"); \ + __res = __res_r0; \ + LSS_RETURN(type, __res) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)() { \ + LSS_BODY(type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ + } + #undef _syscall5 + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4)); \ + } + #undef _syscall6 + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ + LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ + LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ + "r"(__r4), "r"(__r5)); \ + } + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __res; + { + register int __flags __asm__("r0") = flags; + register void *__stack __asm__("r1") = child_stack; + register void *__ptid __asm__("r2") = parent_tidptr; + register void *__tls __asm__("r3") = newtls; + register int *__ctid __asm__("r4") = child_tidptr; + __asm__ __volatile__(/* if (fn == NULL || child_stack == NULL) + * return -EINVAL; + */ + "cmp %2,#0\n" + "it ne\n" + "cmpne %3,#0\n" + "it eq\n" + "moveq %0,%1\n" + "beq 1f\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + "str %5,[%3,#-4]!\n" + "str %2,[%3,#-4]!\n" + + /* %r0 = syscall(%r0 = flags, + * %r1 = child_stack, + * %r2 = parent_tidptr, + * %r3 = newtls, + * %r4 = child_tidptr) + */ + "mov r7, %9\n" + "swi 0x0\n" + + /* if (%r0 != 0) + * return %r0; + */ + "movs %0,r0\n" + "bne 1f\n" + + /* In the child, now. Call "fn(arg)". + */ + "ldr r0,[sp, #4]\n" + + /* When compiling for Thumb-2 the "MOV LR,PC" here + * won't work because it loads PC+4 into LR, + * whereas the LDR is a 4-byte instruction. + * This results in the child thread always + * crashing with an "Illegal Instruction" when it + * returned into the middle of the LDR instruction + * The instruction sequence used instead was + * recommended by + * "https://wiki.edubuntu.org/ARM/Thumb2PortingHowto#Quick_Reference". + */ + #ifdef __thumb2__ + "ldr r7,[sp]\n" + "blx r7\n" + #else + "mov lr,pc\n" + "ldr pc,[sp]\n" + #endif + + /* Call _exit(%r0). + */ + "mov r7, %10\n" + "swi 0x0\n" + "1:\n" + : "=r" (__res) + : "i"(-EINVAL), + "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__tls), "r"(__ctid), + "i"(__NR_clone), "i"(__NR_exit) + : "cc", "r7", "lr", "memory"); + } + LSS_RETURN(int, __res); + } + #elif defined(__mips__) + #undef LSS_REG + #define LSS_REG(r,a) register unsigned long __r##r __asm__("$"#r) = \ + (unsigned long)(a) + #undef LSS_BODY + #define LSS_BODY(type,name,r7,...) \ + register unsigned long __v0 __asm__("$2") = __NR_##name; \ + __asm__ __volatile__ ("syscall\n" \ + : "=&r"(__v0), r7 (__r7) \ + : "0"(__v0), ##__VA_ARGS__ \ + : "$8", "$9", "$10", "$11", "$12", \ + "$13", "$14", "$15", "$24", "memory"); \ + LSS_RETURN(type, __v0, __r7) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)() { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_BODY(type, name, "=r"); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_REG(4, arg1); LSS_BODY(type, name, "=r", "r"(__r4)); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_REG(4, arg1); LSS_REG(5, arg2); \ + LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5)); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + register unsigned long __r7 __asm__("$7"); \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5), "r"(__r6)); \ + } + #undef _syscall4 + #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); \ + LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6)); \ + } + #undef _syscall5 + #if _MIPS_SIM == _MIPS_SIM_ABI32 + /* The old 32bit MIPS system call API passes the fifth and sixth argument + * on the stack, whereas the new APIs use registers "r8" and "r9". + */ + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); \ + register unsigned long __v0 __asm__("$2"); \ + __asm__ __volatile__ (".set noreorder\n" \ + "lw $2, %6\n" \ + "subu $29, 32\n" \ + "sw $2, 16($29)\n" \ + "li $2, %2\n" \ + "syscall\n" \ + "addiu $29, 32\n" \ + ".set reorder\n" \ + : "=&r"(__v0), "+r" (__r7) \ + : "i" (__NR_##name), "r"(__r4), "r"(__r5), \ + "r"(__r6), "m" ((unsigned long)arg5) \ + : "$8", "$9", "$10", "$11", "$12", \ + "$13", "$14", "$15", "$24", "memory"); \ + LSS_RETURN(type, __v0, __r7); \ + } + #else + #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); LSS_REG(8, arg5); \ + LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6), \ + "r"(__r8)); \ + } + #endif + #undef _syscall6 + #if _MIPS_SIM == _MIPS_SIM_ABI32 + /* The old 32bit MIPS system call API passes the fifth and sixth argument + * on the stack, whereas the new APIs use registers "r8" and "r9". + */ + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); \ + register unsigned long __v0 __asm__("$2"); \ + __asm__ __volatile__ (".set noreorder\n" \ + "lw $2, %6\n" \ + "lw $8, %7\n" \ + "subu $29, 32\n" \ + "sw $2, 16($29)\n" \ + "sw $8, 20($29)\n" \ + "li $2, %2\n" \ + "syscall\n" \ + "addiu $29, 32\n" \ + ".set reorder\n" \ + : "=&r"(__v0), "+r" (__r7) \ + : "i" (__NR_##name), "r"(__r4), "r"(__r5), \ + "r"(__r6), "r" ((unsigned long)arg5), \ + "r" ((unsigned long)arg6) \ + : "$8", "$9", "$10", "$11", "$12", \ + "$13", "$14", "$15", "$24", "memory"); \ + LSS_RETURN(type, __v0, __r7); \ + } + #else + #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ + type5,arg5,type6,arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5,type6 arg6) { \ + LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ + LSS_REG(7, arg4); LSS_REG(8, arg5); LSS_REG(9, arg6); \ + LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6), \ + "r"(__r8), "r"(__r9)); \ + } + #endif + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + register unsigned long __v0 __asm__("$2"); + register unsigned long __r7 __asm__("$7") = (unsigned long)newtls; + { + register int __flags __asm__("$4") = flags; + register void *__stack __asm__("$5") = child_stack; + register void *__ptid __asm__("$6") = parent_tidptr; + register int *__ctid __asm__("$8") = child_tidptr; + __asm__ __volatile__( + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "subu $29,24\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "sub $29,16\n" + #else + "dsubu $29,16\n" + #endif + + /* if (fn == NULL || child_stack == NULL) + * return -EINVAL; + */ + "li %0,%2\n" + "beqz %5,1f\n" + "beqz %6,1f\n" + + /* Push "arg" and "fn" onto the stack that will be + * used by the child. + */ + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "subu %6,32\n" + "sw %5,0(%6)\n" + "sw %8,4(%6)\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "sub %6,32\n" + "sw %5,0(%6)\n" + "sw %8,8(%6)\n" + #else + "dsubu %6,32\n" + "sd %5,0(%6)\n" + "sd %8,8(%6)\n" + #endif + + /* $7 = syscall($4 = flags, + * $5 = child_stack, + * $6 = parent_tidptr, + * $7 = newtls, + * $8 = child_tidptr) + */ + "li $2,%3\n" + "syscall\n" + + /* if ($7 != 0) + * return $2; + */ + "bnez $7,1f\n" + "bnez $2,1f\n" + + /* In the child, now. Call "fn(arg)". + */ + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "lw $25,0($29)\n" + "lw $4,4($29)\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "lw $25,0($29)\n" + "lw $4,8($29)\n" + #else + "ld $25,0($29)\n" + "ld $4,8($29)\n" + #endif + "jalr $25\n" + + /* Call _exit($2) + */ + "move $4,$2\n" + "li $2,%4\n" + "syscall\n" + + "1:\n" + #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 + "addu $29, 24\n" + #elif _MIPS_SIM == _MIPS_SIM_NABI32 + "add $29, 16\n" + #else + "daddu $29,16\n" + #endif + : "=&r" (__v0), "=r" (__r7) + : "i"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit), + "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), + "r"(__ptid), "r"(__r7), "r"(__ctid) + : "$9", "$10", "$11", "$12", "$13", "$14", "$15", + "$24", "memory"); + } + LSS_RETURN(int, __v0, __r7); + } + #elif defined (__PPC__) + #undef LSS_LOADARGS_0 + #define LSS_LOADARGS_0(name, dummy...) \ + __sc_0 = __NR_##name + #undef LSS_LOADARGS_1 + #define LSS_LOADARGS_1(name, arg1) \ + LSS_LOADARGS_0(name); \ + __sc_3 = (unsigned long) (arg1) + #undef LSS_LOADARGS_2 + #define LSS_LOADARGS_2(name, arg1, arg2) \ + LSS_LOADARGS_1(name, arg1); \ + __sc_4 = (unsigned long) (arg2) + #undef LSS_LOADARGS_3 + #define LSS_LOADARGS_3(name, arg1, arg2, arg3) \ + LSS_LOADARGS_2(name, arg1, arg2); \ + __sc_5 = (unsigned long) (arg3) + #undef LSS_LOADARGS_4 + #define LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4) \ + LSS_LOADARGS_3(name, arg1, arg2, arg3); \ + __sc_6 = (unsigned long) (arg4) + #undef LSS_LOADARGS_5 + #define LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5) \ + LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4); \ + __sc_7 = (unsigned long) (arg5) + #undef LSS_LOADARGS_6 + #define LSS_LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6) \ + LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5); \ + __sc_8 = (unsigned long) (arg6) + #undef LSS_ASMINPUT_0 + #define LSS_ASMINPUT_0 "0" (__sc_0) + #undef LSS_ASMINPUT_1 + #define LSS_ASMINPUT_1 LSS_ASMINPUT_0, "1" (__sc_3) + #undef LSS_ASMINPUT_2 + #define LSS_ASMINPUT_2 LSS_ASMINPUT_1, "2" (__sc_4) + #undef LSS_ASMINPUT_3 + #define LSS_ASMINPUT_3 LSS_ASMINPUT_2, "3" (__sc_5) + #undef LSS_ASMINPUT_4 + #define LSS_ASMINPUT_4 LSS_ASMINPUT_3, "4" (__sc_6) + #undef LSS_ASMINPUT_5 + #define LSS_ASMINPUT_5 LSS_ASMINPUT_4, "5" (__sc_7) + #undef LSS_ASMINPUT_6 + #define LSS_ASMINPUT_6 LSS_ASMINPUT_5, "6" (__sc_8) + #undef LSS_BODY + #define LSS_BODY(nr, type, name, args...) \ + long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0"); \ + register unsigned long __sc_3 __asm__ ("r3"); \ + register unsigned long __sc_4 __asm__ ("r4"); \ + register unsigned long __sc_5 __asm__ ("r5"); \ + register unsigned long __sc_6 __asm__ ("r6"); \ + register unsigned long __sc_7 __asm__ ("r7"); \ + register unsigned long __sc_8 __asm__ ("r8"); \ + \ + LSS_LOADARGS_##nr(name, args); \ + __asm__ __volatile__ \ + ("sc\n\t" \ + "mfcr %0" \ + : "=&r" (__sc_0), \ + "=&r" (__sc_3), "=&r" (__sc_4), \ + "=&r" (__sc_5), "=&r" (__sc_6), \ + "=&r" (__sc_7), "=&r" (__sc_8) \ + : LSS_ASMINPUT_##nr \ + : "cr0", "ctr", "memory", \ + "r9", "r10", "r11", "r12"); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + LSS_RETURN(type, __sc_ret, __sc_err) + #undef _syscall0 + #define _syscall0(type, name) \ + type LSS_NAME(name)(void) { \ + LSS_BODY(0, type, name); \ + } + #undef _syscall1 + #define _syscall1(type, name, type1, arg1) \ + type LSS_NAME(name)(type1 arg1) { \ + LSS_BODY(1, type, name, arg1); \ + } + #undef _syscall2 + #define _syscall2(type, name, type1, arg1, type2, arg2) \ + type LSS_NAME(name)(type1 arg1, type2 arg2) { \ + LSS_BODY(2, type, name, arg1, arg2); \ + } + #undef _syscall3 + #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ + LSS_BODY(3, type, name, arg1, arg2, arg3); \ + } + #undef _syscall4 + #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ + LSS_BODY(4, type, name, arg1, arg2, arg3, arg4); \ + } + #undef _syscall5 + #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5) { \ + LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5); \ + } + #undef _syscall6 + #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ + type4, arg4, type5, arg5, type6, arg6) \ + type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ + type5 arg5, type6 arg6) { \ + LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6); \ + } + /* clone function adapted from glibc 2.3.6 clone.S */ + /* TODO(csilvers): consider wrapping some args up in a struct, like we + * do for i386's _syscall6, so we can compile successfully on gcc 2.95 + */ + LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, + int flags, void *arg, int *parent_tidptr, + void *newtls, int *child_tidptr) { + long __ret, __err; + { + register int (*__fn)(void *) __asm__ ("r8") = fn; + register void *__cstack __asm__ ("r4") = child_stack; + register int __flags __asm__ ("r3") = flags; + register void * __arg __asm__ ("r9") = arg; + register int * __ptidptr __asm__ ("r5") = parent_tidptr; + register void * __newtls __asm__ ("r6") = newtls; + register int * __ctidptr __asm__ ("r7") = child_tidptr; + __asm__ __volatile__( + /* check for fn == NULL + * and child_stack == NULL + */ + "cmpwi cr0, %6, 0\n\t" + "cmpwi cr1, %7, 0\n\t" + "cror cr0*4+eq, cr1*4+eq, cr0*4+eq\n\t" + "beq- cr0, 1f\n\t" + + /* set up stack frame for child */ + "clrrwi %7, %7, 4\n\t" + "li 0, 0\n\t" + "stwu 0, -16(%7)\n\t" + + /* fn, arg, child_stack are saved across the syscall: r28-30 */ + "mr 28, %6\n\t" + "mr 29, %7\n\t" + "mr 27, %9\n\t" + + /* syscall */ + "li 0, %4\n\t" + /* flags already in r3 + * child_stack already in r4 + * ptidptr already in r5 + * newtls already in r6 + * ctidptr already in r7 + */ + "sc\n\t" + + /* Test if syscall was successful */ + "cmpwi cr1, 3, 0\n\t" + "crandc cr1*4+eq, cr1*4+eq, cr0*4+so\n\t" + "bne- cr1, 1f\n\t" + + /* Do the function call */ + "mtctr 28\n\t" + "mr 3, 27\n\t" + "bctrl\n\t" + + /* Call _exit(r3) */ + "li 0, %5\n\t" + "sc\n\t" + + /* Return to parent */ + "1:\n" + "mfcr %1\n\t" + "mr %0, 3\n\t" + : "=r" (__ret), "=r" (__err) + : "0" (-1), "1" (EINVAL), + "i" (__NR_clone), "i" (__NR_exit), + "r" (__fn), "r" (__cstack), "r" (__flags), + "r" (__arg), "r" (__ptidptr), "r" (__newtls), + "r" (__ctidptr) + : "cr0", "cr1", "memory", "ctr", + "r0", "r29", "r27", "r28"); + } + LSS_RETURN(int, __ret, __err); + } + #endif + #define __NR__exit __NR_exit + #define __NR__gettid __NR_gettid + #define __NR__mremap __NR_mremap + LSS_INLINE _syscall1(int, brk, void *, e) + LSS_INLINE _syscall1(int, chdir, const char *,p) + LSS_INLINE _syscall1(int, close, int, f) + LSS_INLINE _syscall2(int, clock_getres, int, c, + struct kernel_timespec*, t) + LSS_INLINE _syscall2(int, clock_gettime, int, c, + struct kernel_timespec*, t) + LSS_INLINE _syscall1(int, dup, int, f) + LSS_INLINE _syscall2(int, dup2, int, s, + int, d) + LSS_INLINE _syscall3(int, execve, const char*, f, + const char*const*,a,const char*const*, e) + LSS_INLINE _syscall1(int, _exit, int, e) + LSS_INLINE _syscall1(int, exit_group, int, e) + LSS_INLINE _syscall3(int, fcntl, int, f, + int, c, long, a) + LSS_INLINE _syscall0(pid_t, fork) + LSS_INLINE _syscall2(int, fstat, int, f, + struct kernel_stat*, b) + LSS_INLINE _syscall2(int, fstatfs, int, f, + struct kernel_statfs*, b) + LSS_INLINE _syscall2(int, ftruncate, int, f, + off_t, l) + LSS_INLINE _syscall4(int, futex, int*, a, + int, o, int, v, + struct kernel_timespec*, t) + LSS_INLINE _syscall3(int, getdents, int, f, + struct kernel_dirent*, d, int, c) + LSS_INLINE _syscall3(int, getdents64, int, f, + struct kernel_dirent64*, d, int, c) + LSS_INLINE _syscall0(gid_t, getegid) + LSS_INLINE _syscall0(uid_t, geteuid) + LSS_INLINE _syscall0(pid_t, getpgrp) + LSS_INLINE _syscall0(pid_t, getpid) + LSS_INLINE _syscall0(pid_t, getppid) + LSS_INLINE _syscall2(int, getpriority, int, a, + int, b) + LSS_INLINE _syscall3(int, getresgid, gid_t *, r, + gid_t *, e, gid_t *, s) + LSS_INLINE _syscall3(int, getresuid, uid_t *, r, + uid_t *, e, uid_t *, s) +#if !defined(__ARM_EABI__) + LSS_INLINE _syscall2(int, getrlimit, int, r, + struct kernel_rlimit*, l) +#endif + LSS_INLINE _syscall1(pid_t, getsid, pid_t, p) + LSS_INLINE _syscall0(pid_t, _gettid) + LSS_INLINE _syscall2(pid_t, gettimeofday, struct kernel_timeval*, t, + void*, tz) + LSS_INLINE _syscall5(int, setxattr, const char *,p, + const char *, n, const void *,v, + size_t, s, int, f) + LSS_INLINE _syscall5(int, lsetxattr, const char *,p, + const char *, n, const void *,v, + size_t, s, int, f) + LSS_INLINE _syscall4(ssize_t, getxattr, const char *,p, + const char *, n, void *, v, size_t, s) + LSS_INLINE _syscall4(ssize_t, lgetxattr, const char *,p, + const char *, n, void *, v, size_t, s) + LSS_INLINE _syscall3(ssize_t, listxattr, const char *,p, + char *, l, size_t, s) + LSS_INLINE _syscall3(ssize_t, llistxattr, const char *,p, + char *, l, size_t, s) + LSS_INLINE _syscall3(int, ioctl, int, d, + int, r, void *, a) + LSS_INLINE _syscall2(int, ioprio_get, int, which, + int, who) + LSS_INLINE _syscall3(int, ioprio_set, int, which, + int, who, int, ioprio) + LSS_INLINE _syscall2(int, kill, pid_t, p, + int, s) + LSS_INLINE _syscall3(off_t, lseek, int, f, + off_t, o, int, w) + LSS_INLINE _syscall2(int, munmap, void*, s, + size_t, l) + LSS_INLINE _syscall6(long, move_pages, pid_t, p, + unsigned long, n, void **,g, int *, d, + int *, s, int, f) + LSS_INLINE _syscall3(int, mprotect, const void *,a, + size_t, l, int, p) + LSS_INLINE _syscall5(void*, _mremap, void*, o, + size_t, os, size_t, ns, + unsigned long, f, void *, a) + LSS_INLINE _syscall3(int, open, const char*, p, + int, f, int, m) + LSS_INLINE _syscall3(int, poll, struct kernel_pollfd*, u, + unsigned int, n, int, t) + LSS_INLINE _syscall2(int, prctl, int, o, + long, a) + LSS_INLINE _syscall4(long, ptrace, int, r, + pid_t, p, void *, a, void *, d) + #if defined(__NR_quotactl) + // Defined on x86_64 / i386 only + LSS_INLINE _syscall4(int, quotactl, int, cmd, const char *, special, + int, id, caddr_t, addr) + #endif + LSS_INLINE _syscall3(ssize_t, read, int, f, + void *, b, size_t, c) + LSS_INLINE _syscall3(int, readlink, const char*, p, + char*, b, size_t, s) + LSS_INLINE _syscall4(int, rt_sigaction, int, s, + const struct kernel_sigaction*, a, + struct kernel_sigaction*, o, size_t, c) + LSS_INLINE _syscall2(int, rt_sigpending, struct kernel_sigset_t *, s, + size_t, c) + LSS_INLINE _syscall4(int, rt_sigprocmask, int, h, + const struct kernel_sigset_t*, s, + struct kernel_sigset_t*, o, size_t, c) + LSS_INLINE _syscall2(int, rt_sigsuspend, + const struct kernel_sigset_t*, s, size_t, c) + LSS_INLINE _syscall3(int, sched_getaffinity,pid_t, p, + unsigned int, l, unsigned long *, m) + LSS_INLINE _syscall3(int, sched_setaffinity,pid_t, p, + unsigned int, l, unsigned long *, m) + LSS_INLINE _syscall0(int, sched_yield) + LSS_INLINE _syscall1(long, set_tid_address, int *, t) + LSS_INLINE _syscall1(int, setfsgid, gid_t, g) + LSS_INLINE _syscall1(int, setfsuid, uid_t, u) + LSS_INLINE _syscall1(int, setuid, uid_t, u) + LSS_INLINE _syscall1(int, setgid, gid_t, g) + LSS_INLINE _syscall2(int, setpgid, pid_t, p, + pid_t, g) + LSS_INLINE _syscall3(int, setpriority, int, a, + int, b, int, p) + LSS_INLINE _syscall3(int, setresgid, gid_t, r, + gid_t, e, gid_t, s) + LSS_INLINE _syscall3(int, setresuid, uid_t, r, + uid_t, e, uid_t, s) + LSS_INLINE _syscall2(int, setrlimit, int, r, + const struct kernel_rlimit*, l) + LSS_INLINE _syscall0(pid_t, setsid) + LSS_INLINE _syscall2(int, sigaltstack, const stack_t*, s, + const stack_t*, o) + #if defined(__NR_sigreturn) + LSS_INLINE _syscall1(int, sigreturn, unsigned long, u) + #endif + LSS_INLINE _syscall2(int, stat, const char*, f, + struct kernel_stat*, b) + LSS_INLINE _syscall2(int, statfs, const char*, f, + struct kernel_statfs*, b) + LSS_INLINE _syscall3(int, tgkill, pid_t, p, + pid_t, t, int, s) + LSS_INLINE _syscall2(int, tkill, pid_t, p, + int, s) + LSS_INLINE _syscall1(int, unlink, const char*, f) + LSS_INLINE _syscall3(ssize_t, write, int, f, + const void *, b, size_t, c) + LSS_INLINE _syscall3(ssize_t, writev, int, f, + const struct kernel_iovec*, v, size_t, c) + #if defined(__NR_getcpu) + LSS_INLINE _syscall3(long, getcpu, unsigned *, cpu, + unsigned *, node, void *, unused) + #endif + #if defined(__x86_64__) || \ + (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) + LSS_INLINE _syscall3(int, recvmsg, int, s, + struct kernel_msghdr*, m, int, f) + LSS_INLINE _syscall3(int, sendmsg, int, s, + const struct kernel_msghdr*, m, int, f) + LSS_INLINE _syscall6(int, sendto, int, s, + const void*, m, size_t, l, + int, f, + const struct kernel_sockaddr*, a, int, t) + LSS_INLINE _syscall2(int, shutdown, int, s, + int, h) + LSS_INLINE _syscall3(int, socket, int, d, + int, t, int, p) + LSS_INLINE _syscall4(int, socketpair, int, d, + int, t, int, p, int*, s) + #endif + #if defined(__x86_64__) + LSS_INLINE _syscall4(int, fallocate, int, fd, int, mode, + loff_t, offset, loff_t, len) + + LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid, + gid_t *egid, + gid_t *sgid) { + return LSS_NAME(getresgid)(rgid, egid, sgid); + } + + LSS_INLINE int LSS_NAME(getresuid32)(uid_t *ruid, + uid_t *euid, + uid_t *suid) { + return LSS_NAME(getresuid)(ruid, euid, suid); + } + + LSS_INLINE _syscall6(void*, mmap, void*, s, + size_t, l, int, p, + int, f, int, d, + __off64_t, o) + + LSS_INLINE _syscall4(int, newfstatat, int, d, + const char *, p, + struct kernel_stat*, b, int, f) + + LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) { + return LSS_NAME(setfsgid)(gid); + } + + LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) { + return LSS_NAME(setfsuid)(uid); + } + + LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) { + return LSS_NAME(setresgid)(rgid, egid, sgid); + } + + LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) { + return LSS_NAME(setresuid)(ruid, euid, suid); + } + + LSS_INLINE int LSS_NAME(sigaction)(int signum, + const struct kernel_sigaction *act, + struct kernel_sigaction *oldact) { + /* On x86_64, the kernel requires us to always set our own + * SA_RESTORER in order to be able to return from a signal handler. + * This function must have a "magic" signature that the "gdb" + * (and maybe the kernel?) can recognize. + */ + if (act != NULL && !(act->sa_flags & SA_RESTORER)) { + struct kernel_sigaction a = *act; + a.sa_flags |= SA_RESTORER; + a.sa_restorer = LSS_NAME(restore_rt)(); + return LSS_NAME(rt_sigaction)(signum, &a, oldact, + (KERNEL_NSIG+7)/8); + } else { + return LSS_NAME(rt_sigaction)(signum, act, oldact, + (KERNEL_NSIG+7)/8); + } + } + + LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) { + return LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8); + } + + LSS_INLINE int LSS_NAME(sigprocmask)(int how, + const struct kernel_sigset_t *set, + struct kernel_sigset_t *oldset) { + return LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8); + } + + LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) { + return LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8); + } + #endif + #if defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ + defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) + LSS_INLINE _syscall4(pid_t, wait4, pid_t, p, + int*, s, int, o, + struct kernel_rusage*, r) + + LSS_INLINE pid_t LSS_NAME(waitpid)(pid_t pid, int *status, int options){ + return LSS_NAME(wait4)(pid, status, options, 0); + } + #endif + #if defined(__i386__) || defined(__x86_64__) + LSS_INLINE _syscall4(int, openat, int, d, const char *, p, int, f, int, m) + LSS_INLINE _syscall3(int, unlinkat, int, d, const char *, p, int, f) + #endif + #if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) + #define __NR__getresgid32 __NR_getresgid32 + #define __NR__getresuid32 __NR_getresuid32 + #define __NR__setfsgid32 __NR_setfsgid32 + #define __NR__setfsuid32 __NR_setfsuid32 + #define __NR__setresgid32 __NR_setresgid32 + #define __NR__setresuid32 __NR_setresuid32 +#if defined(__ARM_EABI__) + LSS_INLINE _syscall2(int, ugetrlimit, int, r, + struct kernel_rlimit*, l) +#endif + LSS_INLINE _syscall3(int, _getresgid32, gid_t *, r, + gid_t *, e, gid_t *, s) + LSS_INLINE _syscall3(int, _getresuid32, uid_t *, r, + uid_t *, e, uid_t *, s) + LSS_INLINE _syscall1(int, _setfsgid32, gid_t, f) + LSS_INLINE _syscall1(int, _setfsuid32, uid_t, f) + LSS_INLINE _syscall3(int, _setresgid32, gid_t, r, + gid_t, e, gid_t, s) + LSS_INLINE _syscall3(int, _setresuid32, uid_t, r, + uid_t, e, uid_t, s) + + LSS_INLINE int LSS_NAME(getresgid32)(gid_t *rgid, + gid_t *egid, + gid_t *sgid) { + int rc; + if ((rc = LSS_NAME(_getresgid32)(rgid, egid, sgid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((rgid == NULL) || (egid == NULL) || (sgid == NULL)) { + return EFAULT; + } + // Clear the high bits first, since getresgid only sets 16 bits + *rgid = *egid = *sgid = 0; + rc = LSS_NAME(getresgid)(rgid, egid, sgid); + } + return rc; + } + + LSS_INLINE int LSS_NAME(getresuid32)(uid_t *ruid, + uid_t *euid, + uid_t *suid) { + int rc; + if ((rc = LSS_NAME(_getresuid32)(ruid, euid, suid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((ruid == NULL) || (euid == NULL) || (suid == NULL)) { + return EFAULT; + } + // Clear the high bits first, since getresuid only sets 16 bits + *ruid = *euid = *suid = 0; + rc = LSS_NAME(getresuid)(ruid, euid, suid); + } + return rc; + } + + LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) { + int rc; + if ((rc = LSS_NAME(_setfsgid32)(gid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)gid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setfsgid)(gid); + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) { + int rc; + if ((rc = LSS_NAME(_setfsuid32)(uid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)uid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setfsuid)(uid); + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) { + int rc; + if ((rc = LSS_NAME(_setresgid32)(rgid, egid, sgid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)rgid & ~0xFFFFu || + (unsigned int)egid & ~0xFFFFu || + (unsigned int)sgid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setresgid)(rgid, egid, sgid); + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) { + int rc; + if ((rc = LSS_NAME(_setresuid32)(ruid, euid, suid)) < 0 && + LSS_ERRNO == ENOSYS) { + if ((unsigned int)ruid & ~0xFFFFu || + (unsigned int)euid & ~0xFFFFu || + (unsigned int)suid & ~0xFFFFu) { + rc = EINVAL; + } else { + rc = LSS_NAME(setresuid)(ruid, euid, suid); + } + } + return rc; + } + #endif + LSS_INLINE int LSS_NAME(sigemptyset)(struct kernel_sigset_t *set) { + memset(&set->sig, 0, sizeof(set->sig)); + return 0; + } + + LSS_INLINE int LSS_NAME(sigfillset)(struct kernel_sigset_t *set) { + memset(&set->sig, -1, sizeof(set->sig)); + return 0; + } + + LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set, + int signum) { + if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + LSS_ERRNO = EINVAL; + return -1; + } else { + set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] + |= 1UL << ((signum - 1) % (8*sizeof(set->sig[0]))); + return 0; + } + } + + LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set, + int signum) { + if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + LSS_ERRNO = EINVAL; + return -1; + } else { + set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] + &= ~(1UL << ((signum - 1) % (8*sizeof(set->sig[0])))); + return 0; + } + } + + LSS_INLINE int LSS_NAME(sigismember)(struct kernel_sigset_t *set, + int signum) { + if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { + LSS_ERRNO = EINVAL; + return -1; + } else { + return !!(set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] & + (1UL << ((signum - 1) % (8*sizeof(set->sig[0]))))); + } + } + #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ + defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || defined(__PPC__) + #define __NR__sigaction __NR_sigaction + #define __NR__sigpending __NR_sigpending + #define __NR__sigprocmask __NR_sigprocmask + #define __NR__sigsuspend __NR_sigsuspend + #define __NR__socketcall __NR_socketcall +#if ! defined(__ANDROID__) + /* The Android NDK #defines stat64 stat, so avoid multiple-definition */ + LSS_INLINE _syscall2(int, fstat64, int, f, + struct kernel_stat64 *, b) +#endif + LSS_INLINE _syscall5(int, _llseek, uint, fd, + unsigned long, hi, unsigned long, lo, + loff_t *, res, uint, wh) +#if !defined(__ARM_EABI__) + LSS_INLINE _syscall1(void*, mmap, void*, a) +#endif + LSS_INLINE _syscall6(void*, mmap2, void*, s, + size_t, l, int, p, + int, f, int, d, + off_t, o) + LSS_INLINE _syscall3(int, _sigaction, int, s, + const struct kernel_old_sigaction*, a, + struct kernel_old_sigaction*, o) + LSS_INLINE _syscall1(int, _sigpending, unsigned long*, s) + LSS_INLINE _syscall3(int, _sigprocmask, int, h, + const unsigned long*, s, + unsigned long*, o) + #ifdef __PPC__ + LSS_INLINE _syscall1(int, _sigsuspend, unsigned long, s) + #else + LSS_INLINE _syscall3(int, _sigsuspend, const void*, a, + int, b, + unsigned long, s) + #endif +#if ! defined(__ANDROID__) + /* The Android NDK #defines stat64 stat, so avoid multiple-definition */ + LSS_INLINE _syscall2(int, stat64, const char *, p, + struct kernel_stat64 *, b) +#endif + + LSS_INLINE int LSS_NAME(sigaction)(int signum, + const struct kernel_sigaction *act, + struct kernel_sigaction *oldact) { + int old_errno = LSS_ERRNO; + int rc; + struct kernel_sigaction a; + if (act != NULL) { + a = *act; + #ifdef __i386__ + /* On i386, the kernel requires us to always set our own + * SA_RESTORER when using realtime signals. Otherwise, it does not + * know how to return from a signal handler. This function must have + * a "magic" signature that the "gdb" (and maybe the kernel?) can + * recognize. + * Apparently, a SA_RESTORER is implicitly set by the kernel, when + * using non-realtime signals. + * + * TODO: Test whether ARM needs a restorer + */ + if (!(a.sa_flags & SA_RESTORER)) { + a.sa_flags |= SA_RESTORER; + a.sa_restorer = (a.sa_flags & SA_SIGINFO) + ? LSS_NAME(restore_rt)() : LSS_NAME(restore)(); + } + #endif + } + rc = LSS_NAME(rt_sigaction)(signum, act ? &a : act, oldact, + (KERNEL_NSIG+7)/8); + if (rc < 0 && LSS_ERRNO == ENOSYS) { + struct kernel_old_sigaction oa, ooa, *ptr_a = &oa, *ptr_oa = &ooa; + if (!act) { + ptr_a = NULL; + } else { + oa.sa_handler_ = act->sa_handler_; + memcpy(&oa.sa_mask, &act->sa_mask, sizeof(oa.sa_mask)); + #ifndef __mips__ + oa.sa_restorer = act->sa_restorer; + #endif + oa.sa_flags = act->sa_flags; + } + if (!oldact) { + ptr_oa = NULL; + } + LSS_ERRNO = old_errno; + rc = LSS_NAME(_sigaction)(signum, ptr_a, ptr_oa); + if (rc == 0 && oldact) { + if (act) { + memcpy(oldact, act, sizeof(*act)); + } else { + memset(oldact, 0, sizeof(*oldact)); + } + oldact->sa_handler_ = ptr_oa->sa_handler_; + oldact->sa_flags = ptr_oa->sa_flags; + memcpy(&oldact->sa_mask, &ptr_oa->sa_mask, sizeof(ptr_oa->sa_mask)); + #ifndef __mips__ + oldact->sa_restorer = ptr_oa->sa_restorer; + #endif + } + } + return rc; + } + + LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) { + int old_errno = LSS_ERRNO; + int rc = LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8); + if (rc < 0 && LSS_ERRNO == ENOSYS) { + LSS_ERRNO = old_errno; + LSS_NAME(sigemptyset)(set); + rc = LSS_NAME(_sigpending)(&set->sig[0]); + } + return rc; + } + + LSS_INLINE int LSS_NAME(sigprocmask)(int how, + const struct kernel_sigset_t *set, + struct kernel_sigset_t *oldset) { + int olderrno = LSS_ERRNO; + int rc = LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8); + if (rc < 0 && LSS_ERRNO == ENOSYS) { + LSS_ERRNO = olderrno; + if (oldset) { + LSS_NAME(sigemptyset)(oldset); + } + rc = LSS_NAME(_sigprocmask)(how, + set ? &set->sig[0] : NULL, + oldset ? &oldset->sig[0] : NULL); + } + return rc; + } + + LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) { + int olderrno = LSS_ERRNO; + int rc = LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8); + if (rc < 0 && LSS_ERRNO == ENOSYS) { + LSS_ERRNO = olderrno; + rc = LSS_NAME(_sigsuspend)( + #ifndef __PPC__ + set, 0, + #endif + set->sig[0]); + } + return rc; + } + #endif + #if defined(__PPC__) + #undef LSS_SC_LOADARGS_0 + #define LSS_SC_LOADARGS_0(dummy...) + #undef LSS_SC_LOADARGS_1 + #define LSS_SC_LOADARGS_1(arg1) \ + __sc_4 = (unsigned long) (arg1) + #undef LSS_SC_LOADARGS_2 + #define LSS_SC_LOADARGS_2(arg1, arg2) \ + LSS_SC_LOADARGS_1(arg1); \ + __sc_5 = (unsigned long) (arg2) + #undef LSS_SC_LOADARGS_3 + #define LSS_SC_LOADARGS_3(arg1, arg2, arg3) \ + LSS_SC_LOADARGS_2(arg1, arg2); \ + __sc_6 = (unsigned long) (arg3) + #undef LSS_SC_LOADARGS_4 + #define LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4) \ + LSS_SC_LOADARGS_3(arg1, arg2, arg3); \ + __sc_7 = (unsigned long) (arg4) + #undef LSS_SC_LOADARGS_5 + #define LSS_SC_LOADARGS_5(arg1, arg2, arg3, arg4, arg5) \ + LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4); \ + __sc_8 = (unsigned long) (arg5) + #undef LSS_SC_BODY + #define LSS_SC_BODY(nr, type, opt, args...) \ + long __sc_ret, __sc_err; \ + { \ + register unsigned long __sc_0 __asm__ ("r0") = __NR_socketcall; \ + register unsigned long __sc_3 __asm__ ("r3") = opt; \ + register unsigned long __sc_4 __asm__ ("r4"); \ + register unsigned long __sc_5 __asm__ ("r5"); \ + register unsigned long __sc_6 __asm__ ("r6"); \ + register unsigned long __sc_7 __asm__ ("r7"); \ + register unsigned long __sc_8 __asm__ ("r8"); \ + LSS_SC_LOADARGS_##nr(args); \ + __asm__ __volatile__ \ + ("stwu 1, -48(1)\n\t" \ + "stw 4, 20(1)\n\t" \ + "stw 5, 24(1)\n\t" \ + "stw 6, 28(1)\n\t" \ + "stw 7, 32(1)\n\t" \ + "stw 8, 36(1)\n\t" \ + "addi 4, 1, 20\n\t" \ + "sc\n\t" \ + "mfcr %0" \ + : "=&r" (__sc_0), \ + "=&r" (__sc_3), "=&r" (__sc_4), \ + "=&r" (__sc_5), "=&r" (__sc_6), \ + "=&r" (__sc_7), "=&r" (__sc_8) \ + : LSS_ASMINPUT_##nr \ + : "cr0", "ctr", "memory"); \ + __sc_ret = __sc_3; \ + __sc_err = __sc_0; \ + } \ + LSS_RETURN(type, __sc_ret, __sc_err) + + LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, + int flags){ + LSS_SC_BODY(3, ssize_t, 17, s, msg, flags); + } + + LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, + const struct kernel_msghdr *msg, + int flags) { + LSS_SC_BODY(3, ssize_t, 16, s, msg, flags); + } + + // TODO(csilvers): why is this ifdef'ed out? +#if 0 + LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, + int flags, + const struct kernel_sockaddr *to, + unsigned int tolen) { + LSS_BODY(6, ssize_t, 11, s, buf, len, flags, to, tolen); + } +#endif + + LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { + LSS_SC_BODY(2, int, 13, s, how); + } + + LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { + LSS_SC_BODY(3, int, 1, domain, type, protocol); + } + + LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, + int sv[2]) { + LSS_SC_BODY(4, int, 8, d, type, protocol, sv); + } + #endif + #if defined(__ARM_EABI__) + LSS_INLINE _syscall3(ssize_t, recvmsg, int, s, struct kernel_msghdr*, msg, + int, flags) + LSS_INLINE _syscall3(ssize_t, sendmsg, int, s, const struct kernel_msghdr*, + msg, int, flags) + LSS_INLINE _syscall6(ssize_t, sendto, int, s, const void*, buf, size_t,len, + int, flags, const struct kernel_sockaddr*, to, + unsigned int, tolen) + LSS_INLINE _syscall2(int, shutdown, int, s, int, how) + LSS_INLINE _syscall3(int, socket, int, domain, int, type, int, protocol) + LSS_INLINE _syscall4(int, socketpair, int, d, int, type, int, protocol, + int*, sv) + #endif + #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ + (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) + #define __NR__socketcall __NR_socketcall + LSS_INLINE _syscall2(int, _socketcall, int, c, + va_list, a) + LSS_INLINE int LSS_NAME(socketcall)(int op, ...) { + int rc; + va_list ap; + va_start(ap, op); + rc = LSS_NAME(_socketcall)(op, ap); + va_end(ap); + return rc; + } + + LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, + int flags){ + return (ssize_t)LSS_NAME(socketcall)(17, s, msg, flags); + } + + LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, + const struct kernel_msghdr *msg, + int flags) { + return (ssize_t)LSS_NAME(socketcall)(16, s, msg, flags); + } + + LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, + int flags, + const struct kernel_sockaddr *to, + unsigned int tolen) { + return (ssize_t)LSS_NAME(socketcall)(11, s, buf, len, flags, to, tolen); + } + + LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { + return LSS_NAME(socketcall)(13, s, how); + } + + LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { + return LSS_NAME(socketcall)(1, domain, type, protocol); + } + + LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, + int sv[2]) { + return LSS_NAME(socketcall)(8, d, type, protocol, sv); + } + #endif + #if defined(__i386__) || defined(__PPC__) + LSS_INLINE _syscall4(int, fstatat64, int, d, + const char *, p, + struct kernel_stat64 *, b, int, f) + #endif + #if defined(__i386__) || defined(__PPC__) || \ + (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) + LSS_INLINE _syscall3(pid_t, waitpid, pid_t, p, + int*, s, int, o) + #endif + #if defined(__mips__) + /* sys_pipe() on MIPS has non-standard calling conventions, as it returns + * both file handles through CPU registers. + */ + LSS_INLINE int LSS_NAME(pipe)(int *p) { + register unsigned long __v0 __asm__("$2") = __NR_pipe; + register unsigned long __v1 __asm__("$3"); + register unsigned long __r7 __asm__("$7"); + __asm__ __volatile__ ("syscall\n" + : "=&r"(__v0), "=&r"(__v1), "+r" (__r7) + : "0"(__v0) + : "$8", "$9", "$10", "$11", "$12", + "$13", "$14", "$15", "$24", "memory"); + if (__r7) { + LSS_ERRNO = __v0; + return -1; + } else { + p[0] = __v0; + p[1] = __v1; + return 0; + } + } + #else + LSS_INLINE _syscall1(int, pipe, int *, p) + #endif + /* TODO(csilvers): see if ppc can/should support this as well */ + #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ + defined(__ARM_EABI__) || \ + (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) + #define __NR__statfs64 __NR_statfs64 + #define __NR__fstatfs64 __NR_fstatfs64 + LSS_INLINE _syscall3(int, _statfs64, const char*, p, + size_t, s,struct kernel_statfs64*, b) + LSS_INLINE _syscall3(int, _fstatfs64, int, f, + size_t, s,struct kernel_statfs64*, b) + LSS_INLINE int LSS_NAME(statfs64)(const char *p, + struct kernel_statfs64 *b) { + return LSS_NAME(_statfs64)(p, sizeof(*b), b); + } + LSS_INLINE int LSS_NAME(fstatfs64)(int f,struct kernel_statfs64 *b) { + return LSS_NAME(_fstatfs64)(f, sizeof(*b), b); + } + #endif + + LSS_INLINE int LSS_NAME(execv)(const char *path, const char *const argv[]) { + extern char **environ; + return LSS_NAME(execve)(path, argv, (const char *const *)environ); + } + + LSS_INLINE pid_t LSS_NAME(gettid)() { + pid_t tid = LSS_NAME(_gettid)(); + if (tid != -1) { + return tid; + } + return LSS_NAME(getpid)(); + } + + LSS_INLINE void *LSS_NAME(mremap)(void *old_address, size_t old_size, + size_t new_size, int flags, ...) { + va_list ap; + void *new_address, *rc; + va_start(ap, flags); + new_address = va_arg(ap, void *); + rc = LSS_NAME(_mremap)(old_address, old_size, new_size, + flags, new_address); + va_end(ap); + return rc; + } + + LSS_INLINE int LSS_NAME(ptrace_detach)(pid_t pid) { + /* PTRACE_DETACH can sometimes forget to wake up the tracee and it + * then sends job control signals to the real parent, rather than to + * the tracer. We reduce the risk of this happening by starting a + * whole new time slice, and then quickly sending a SIGCONT signal + * right after detaching from the tracee. + * + * We use tkill to ensure that we only issue a wakeup for the thread being + * detached. Large multi threaded apps can take a long time in the kernel + * processing SIGCONT. + */ + int rc, err; + LSS_NAME(sched_yield)(); + rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0); + err = LSS_ERRNO; + LSS_NAME(tkill)(pid, SIGCONT); + /* Old systems don't have tkill */ + if (LSS_ERRNO == ENOSYS) + LSS_NAME(kill)(pid, SIGCONT); + LSS_ERRNO = err; + return rc; + } + + LSS_INLINE int LSS_NAME(raise)(int sig) { + return LSS_NAME(kill)(LSS_NAME(getpid)(), sig); + } + + LSS_INLINE int LSS_NAME(setpgrp)() { + return LSS_NAME(setpgid)(0, 0); + } + + LSS_INLINE int LSS_NAME(sysconf)(int name) { + extern int __getpagesize(void); + switch (name) { + case _SC_OPEN_MAX: { + struct kernel_rlimit limit; +#if defined(__ARM_EABI__) + return LSS_NAME(ugetrlimit)(RLIMIT_NOFILE, &limit) < 0 + ? 8192 : limit.rlim_cur; +#else + return LSS_NAME(getrlimit)(RLIMIT_NOFILE, &limit) < 0 + ? 8192 : limit.rlim_cur; +#endif + } + case _SC_PAGESIZE: + return __getpagesize(); + default: + LSS_ERRNO = ENOSYS; + return -1; + } + } + #if defined(__x86_64__) || \ + (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64) + LSS_INLINE _syscall4(ssize_t, pread64, int, f, + void *, b, size_t, c, + loff_t, o) + LSS_INLINE _syscall4(ssize_t, pwrite64, int, f, + const void *, b, size_t, c, + loff_t, o) + LSS_INLINE _syscall3(int, readahead, int, f, + loff_t, o, unsigned, c) + #else + #define __NR__pread64 __NR_pread64 + #define __NR__pwrite64 __NR_pwrite64 + #define __NR__readahead __NR_readahead + LSS_INLINE _syscall5(ssize_t, _pread64, int, f, + void *, b, size_t, c, unsigned, o1, + unsigned, o2) + LSS_INLINE _syscall5(ssize_t, _pwrite64, int, f, + const void *, b, size_t, c, unsigned, o1, + long, o2) + LSS_INLINE _syscall4(int, _readahead, int, f, + unsigned, o1, unsigned, o2, size_t, c) + /* We force 64bit-wide parameters onto the stack, then access each + * 32-bit component individually. This guarantees that we build the + * correct parameters independent of the native byte-order of the + * underlying architecture. + */ + LSS_INLINE ssize_t LSS_NAME(pread64)(int fd, void *buf, size_t count, + loff_t off) { + union { loff_t off; unsigned arg[2]; } o = { off }; + return LSS_NAME(_pread64)(fd, buf, count, o.arg[0], o.arg[1]); + } + LSS_INLINE ssize_t LSS_NAME(pwrite64)(int fd, const void *buf, + size_t count, loff_t off) { + union { loff_t off; unsigned arg[2]; } o = { off }; + return LSS_NAME(_pwrite64)(fd, buf, count, o.arg[0], o.arg[1]); + } + LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, int len) { + union { loff_t off; unsigned arg[2]; } o = { off }; + return LSS_NAME(_readahead)(fd, o.arg[0], o.arg[1], len); + } + #endif +#endif + +#if defined(__cplusplus) && !defined(SYS_CPLUSPLUS) +} +#endif + +#endif +#endif diff --git a/spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt b/spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt new file mode 100644 index 000000000..737f86596 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt @@ -0,0 +1,470 @@ +2011-05-01 version 2.4.1: + + C++ + * Fixed the frendship problem for old compilers to make the library now gcc 3 + compatible again. + * Fixed vcprojects/extract_includes.bat to extract compiler/plugin.h. + + Java + * Removed usages of JDK 1.6 only features to make the library now JDK 1.5 + compatible again. + * Fixed a bug about negative enum values. + * serialVersionUID is now defined in generated messages for java serializing. + * Fixed protoc to use java.lang.Object, which makes "Object" now a valid + message name again. + + Python + * Experimental C++ implementation now requires C++ protobuf library installed. + See the README.txt in the python directory for details. + +2011-02-02 version 2.4.0: + + General + * The RPC (cc|java|py)_generic_services default value is now false instead of + true. + * Custom options can have aggregate types. For example, + message MyOption { + optional string comment = 1; + optional string author = 2; + } + extend google.protobuf.FieldOptions { + optional MyOption myoption = 12345; + } + This option can now be set as follows: + message SomeType { + optional int32 field = 1 [(myoption) = { comment:'x' author:'y' }]; + } + + C++ + * Various speed and code size optimizations. + * Added a release_foo() method on string and message fields. + * Fixed gzip_output_stream sub-stream handling. + + Java + * Builders now maintain sub-builders for sub-messages. Use getFooBuilder() to + get the builder for the sub-message "foo". This allows you to repeatedly + modify deeply-nested sub-messages without rebuilding them. + * Builder.build() no longer invalidates the Builder for generated messages + (You may continue to modify it and then build another message). + * Code generator will generate efficient equals() and hashCode() + implementations if new option java_generate_equals_and_hash is enabled. + (Otherwise, reflection-based implementations are used.) + * Generated messages now implement Serializable. + * Fields with [deprecated=true] will be marked with @Deprecated in Java. + * Added lazy conversion of UTF-8 encoded strings to String objects to improve + performance. + * Various optimizations. + * Enum value can be accessed directly, instead of calling getNumber() on the + enum member. + * For each enum value, an integer constant is also generated with the suffix + _VALUE. + + Python + * Added an experimental C++ implementation for Python messages via a Python + extension. Implementation type is controlled by an environment variable + PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION (valid values: "cpp" and "python") + The default value is currently "python" but will be changed to "cpp" in + future release. + * Improved performance on message instantiation significantly. + Most of the work on message instantiation is done just once per message + class, instead of once per message instance. + * Improved performance on text message parsing. + * Allow add() to forward keyword arguments to the concrete class. + E.g. instead of + item = repeated_field.add() + item.foo = bar + item.baz = quux + You can do: + repeated_field.add(foo=bar, baz=quux) + * Added a sort() interface to the BaseContainer. + * Added an extend() method to repeated composite fields. + * Added UTF8 debug string support. + +2010-01-08 version 2.3.0: + + General + * Parsers for repeated numeric fields now always accept both packed and + unpacked input. The [packed=true] option only affects serializers. + Therefore, it is possible to switch a field to packed format without + breaking backwards-compatibility -- as long as all parties are using + protobuf 2.3.0 or above, at least. + * The generic RPC service code generated by the C++, Java, and Python + generators can be disabled via file options: + option cc_generic_services = false; + option java_generic_services = false; + option py_generic_services = false; + This allows plugins to generate alternative code, possibly specific to some + particular RPC implementation. + + protoc + * Now supports a plugin system for code generators. Plugins can generate + code for new languages or inject additional code into the output of other + code generators. Plugins are just binaries which accept a protocol buffer + on stdin and write a protocol buffer to stdout, so they may be written in + any language. See src/google/protobuf/compiler/plugin.proto. + **WARNING**: Plugins are experimental. The interface may change in a + future version. + * If the output location ends in .zip or .jar, protoc will write its output + to a zip/jar archive instead of a directory. For example: + protoc --java_out=myproto_srcs.jar --python_out=myproto.zip myproto.proto + Currently the archive contents are not compressed, though this could change + in the future. + * inf, -inf, and nan can now be used as default values for float and double + fields. + + C++ + * Various speed and code size optimizations. + * DynamicMessageFactory is now fully thread-safe. + * Message::Utf8DebugString() method is like DebugString() but avoids escaping + UTF-8 bytes. + * Compiled-in message types can now contain dynamic extensions, through use + of CodedInputStream::SetExtensionRegistry(). + * Now compiles shared libraries (DLLs) by default on Cygwin and MinGW, to + match other platforms. Use --disable-shared to avoid this. + + Java + * parseDelimitedFrom() and mergeDelimitedFrom() now detect EOF and return + false/null instead of throwing an exception. + * Fixed some initialization ordering bugs. + * Fixes for OpenJDK 7. + + Python + * 10-25 times faster than 2.2.0, still pure-Python. + * Calling a mutating method on a sub-message always instantiates the message + in its parent even if the mutating method doesn't actually mutate anything + (e.g. parsing from an empty string). + * Expanded descriptors a bit. + +2009-08-11 version 2.2.0: + + C++ + * Lite mode: The "optimize_for = LITE_RUNTIME" option causes the compiler + to generate code which only depends libprotobuf-lite, which is much smaller + than libprotobuf but lacks descriptors, reflection, and some other features. + * Fixed bug where Message.Swap(Message) was only implemented for + optimize_for_speed. Swap now properly implemented in both modes + (Issue 91). + * Added RemoveLast and SwapElements(index1, index2) to Reflection + interface for repeated elements. + * Added Swap(Message) to Reflection interface. + * Floating-point literals in generated code that are intended to be + single-precision now explicitly have 'f' suffix to avoid pedantic warnings + produced by some compilers. + * The [deprecated=true] option now causes the C++ code generator to generate + a GCC-style deprecation annotation (no-op on other compilers). + * google::protobuf::GetEnumDescriptor() returns the + EnumDescriptor for that type -- useful for templates which cannot call + SomeGeneratedEnumType_descriptor(). + * Various optimizations and obscure bug fixes. + + Java + * Lite mode: The "optimize_for = LITE_RUNTIME" option causes the compiler + to generate code which only depends libprotobuf-lite, which is much smaller + than libprotobuf but lacks descriptors, reflection, and some other features. + * Lots of style cleanups. + + Python + * Fixed endianness bug with floats and doubles. + * Text format parsing support. + * Fix bug with parsing packed repeated fields in embedded messages. + * Ability to initialize fields by passing keyword args to constructor. + * Support iterators in extend and __setslice__ for containers. + +2009-05-13 version 2.1.0: + + General + * Repeated fields of primitive types (types other that string, group, and + nested messages) may now use the option [packed = true] to get a more + efficient encoding. In the new encoding, the entire list is written + as a single byte blob using the "length-delimited" wire type. Within + this blob, the individual values are encoded the same way they would + be normally except without a tag before each value (thus, they are + tightly "packed"). + * For each field, the generated code contains an integer constant assigned + to the field number. For example, the .proto file: + message Foo { optional int bar_baz = 123; } + would generate the following constants, all with the integer value 123: + C++: Foo::kBarBazFieldNumber + Java: Foo.BAR_BAZ_FIELD_NUMBER + Python: Foo.BAR_BAZ_FIELD_NUMBER + Constants are also generated for extensions, with the same naming scheme. + These constants may be used as switch cases. + * Updated bundled Google Test to version 1.3.0. Google Test is now bundled + in its verbatim form as a nested autoconf package, so you can drop in any + other version of Google Test if needed. + * optimize_for = SPEED is now the default, by popular demand. Use + optimize_for = CODE_SIZE if code size is more important in your app. + * It is now an error to define a default value for a repeated field. + Previously, this was silently ignored (it had no effect on the generated + code). + * Fields can now be marked deprecated like: + optional int32 foo = 1 [deprecated = true]; + Currently this does not have any actual effect, but in the future the code + generators may generate deprecation annotations in each language. + * Cross-compiling should now be possible using the --with-protoc option to + configure. See README.txt for more info. + + protoc + * --error_format=msvs option causes errors to be printed in Visual Studio + format, which should allow them to be clicked on in the build log to go + directly to the error location. + * The type name resolver will no longer resolve type names to fields. For + example, this now works: + message Foo {} + message Bar { + optional int32 Foo = 1; + optional Foo baz = 2; + } + Previously, the type of "baz" would resolve to "Bar.Foo", and you'd get + an error because Bar.Foo is a field, not a type. Now the type of "baz" + resolves to the message type Foo. This change is unlikely to make a + difference to anyone who follows the Protocol Buffers style guide. + + C++ + * Several optimizations, including but not limited to: + - Serialization, especially to flat arrays, is 10%-50% faster, possibly + more for small objects. + - Several descriptor operations which previously required locking no longer + do. + - Descriptors are now constructed lazily on first use, rather than at + process startup time. This should save memory in programs which do not + use descriptors or reflection. + - UnknownFieldSet completely redesigned to be more efficient (especially in + terms of memory usage). + - Various optimizations to reduce code size (though the serialization speed + optimizations increased code size). + * Message interface has method ParseFromBoundedZeroCopyStream() which parses + a limited number of bytes from an input stream rather than parsing until + EOF. + * GzipInputStream and GzipOutputStream support reading/writing gzip- or + zlib-compressed streams if zlib is available. + (google/protobuf/io/gzip_stream.h) + * DescriptorPool::FindAllExtensions() and corresponding + DescriptorDatabase::FindAllExtensions() can be used to enumerate all + extensions of a given type. + * For each enum type Foo, protoc will generate functions: + const string& Foo_Name(Foo value); + bool Foo_Parse(const string& name, Foo* result); + The former returns the name of the enum constant corresponding to the given + value while the latter finds the value corresponding to a name. + * RepeatedField and RepeatedPtrField now have back-insertion iterators. + * String fields now have setters that take a char* and a size, in addition + to the existing ones that took char* or const string&. + * DescriptorPool::AllowUnknownDependencies() may be used to tell + DescriptorPool to create placeholder descriptors for unknown entities + referenced in a FileDescriptorProto. This can allow you to parse a .proto + file without having access to other .proto files that it imports, for + example. + * Updated gtest to latest version. The gtest package is now included as a + nested autoconf package, so it should be able to drop new versions into the + "gtest" subdirectory without modification. + + Java + * Fixed bug where Message.mergeFrom(Message) failed to merge extensions. + * Message interface has new method toBuilder() which is equivalent to + newBuilderForType().mergeFrom(this). + * All enums now implement the ProtocolMessageEnum interface. + * Setting a field to null now throws NullPointerException. + * Fixed tendency for TextFormat's parsing to overflow the stack when + parsing large string values. The underlying problem is with Java's + regex implementation (which unfortunately uses recursive backtracking + rather than building an NFA). Worked around by making use of possesive + quantifiers. + * Generated service classes now also generate pure interfaces. For a service + Foo, Foo.Interface is a pure interface containing all of the service's + defined methods. Foo.newReflectiveService() can be called to wrap an + instance of this interface in a class that implements the generic + RpcService interface, which provides reflection support that is usually + needed by RPC server implementations. + * RPC interfaces now support blocking operation in addition to non-blocking. + The protocol compiler generates separate blocking and non-blocking stubs + which operate against separate blocking and non-blocking RPC interfaces. + RPC implementations will have to implement the new interfaces in order to + support blocking mode. + * New I/O methods parseDelimitedFrom(), mergeDelimitedFrom(), and + writeDelimitedTo() read and write "delemited" messages from/to a stream, + meaning that the message size precedes the data. This way, you can write + multiple messages to a stream without having to worry about delimiting + them yourself. + * Throw a more descriptive exception when build() is double-called. + * Add a method to query whether CodedInputStream is at the end of the input + stream. + * Add a method to reset a CodedInputStream's size counter; useful when + reading many messages with the same stream. + * equals() and hashCode() now account for unknown fields. + + Python + * Added slicing support for repeated scalar fields. Added slice retrieval and + removal of repeated composite fields. + * Updated RPC interfaces to allow for blocking operation. A client may + now pass None for a callback when making an RPC, in which case the + call will block until the response is received, and the response + object will be returned directly to the caller. This interface change + cannot be used in practice until RPC implementations are updated to + implement it. + * Changes to input_stream.py should make protobuf compatible with appengine. + +2008-11-25 version 2.0.3: + + protoc + * Enum values may now have custom options, using syntax similar to field + options. + * Fixed bug where .proto files which use custom options but don't actually + define them (i.e. they import another .proto file defining the options) + had to explicitly import descriptor.proto. + * Adjacent string literals in .proto files will now be concatenated, like in + C. + * If an input file is a Windows absolute path (e.g. "C:\foo\bar.proto") and + the import path only contains "." (or contains "." but does not contain + the file), protoc incorrectly thought that the file was under ".", because + it thought that the path was relative (since it didn't start with a slash). + This has been fixed. + + C++ + * Generated message classes now have a Swap() method which efficiently swaps + the contents of two objects. + * All message classes now have a SpaceUsed() method which returns an estimate + of the number of bytes of allocated memory currently owned by the object. + This is particularly useful when you are reusing a single message object + to improve performance but want to make sure it doesn't bloat up too large. + * New method Message::SerializeAsString() returns a string containing the + serialized data. May be more convenient than calling + SerializeToString(string*). + * In debug mode, log error messages when string-type fields are found to + contain bytes that are not valid UTF-8. + * Fixed bug where a message with multiple extension ranges couldn't parse + extensions. + * Fixed bug where MergeFrom(const Message&) didn't do anything if invoked on + a message that contained no fields (but possibly contained extensions). + * Fixed ShortDebugString() to not be O(n^2). Durr. + * Fixed crash in TextFormat parsing if the first token in the input caused a + tokenization error. + * Fixed obscure bugs in zero_copy_stream_impl.cc. + * Added support for HP C++ on Tru64. + * Only build tests on "make check", not "make". + * Fixed alignment issue that caused crashes when using DynamicMessage on + 64-bit Sparc machines. + * Simplify template usage to work with MSVC 2003. + * Work around GCC 4.3.x x86_64 compiler bug that caused crashes on startup. + (This affected Fedora 9 in particular.) + * Now works on "Solaris 10 using recent Sun Studio". + + Java + * New overload of mergeFrom() which parses a slice of a byte array instead + of the whole thing. + * New method ByteString.asReadOnlyByteBuffer() does what it sounds like. + * Improved performance of isInitialized() when optimizing for code size. + + Python + * Corrected ListFields() signature in Message base class to match what + subclasses actually implement. + * Some minor refactoring. + * Don't pass self as first argument to superclass constructor (no longer + allowed in Python 2.6). + +2008-09-29 version 2.0.2: + + General + * License changed from Apache 2.0 to New BSD. + * It is now possible to define custom "options", which are basically + annotations which may be placed on definitions in a .proto file. + For example, you might define a field option called "foo" like so: + import "google/protobuf/descriptor.proto" + extend google.protobuf.FieldOptions { + optional string foo = 12345; + } + Then you annotate a field using the "foo" option: + message MyMessage { + optional int32 some_field = 1 [(foo) = "bar"] + } + The value of this option is then visible via the message's + Descriptor: + const FieldDescriptor* field = + MyMessage::descriptor()->FindFieldByName("some_field"); + assert(field->options().GetExtension(foo) == "bar"); + This feature has been implemented and tested in C++ and Java. + Other languages may or may not need to do extra work to support + custom options, depending on how they construct descriptors. + + C++ + * Fixed some GCC warnings that only occur when using -pedantic. + * Improved static initialization code, making ordering more + predictable among other things. + * TextFormat will no longer accept messages which contain multiple + instances of a singular field. Previously, the latter instance + would overwrite the former. + * Now works on systems that don't have hash_map. + + Java + * Print @Override annotation in generated code where appropriate. + + Python + * Strings now use the "unicode" type rather than the "str" type. + String fields may still be assigned ASCII "str" values; they will + automatically be converted. + * Adding a property to an object representing a repeated field now + raises an exception. For example: + # No longer works (and never should have). + message.some_repeated_field.foo = 1 + + Windows + * We now build static libraries rather than DLLs by default on MSVC. + See vsprojects/readme.txt for more information. + +2008-08-15 version 2.0.1: + + protoc + * New flags --encode and --decode can be used to convert between protobuf text + format and binary format from the command-line. + * New flag --descriptor_set_out can be used to write FileDescriptorProtos for + all parsed files directly into a single output file. This is particularly + useful if you wish to parse .proto files from programs written in languages + other than C++: just run protoc as a background process and have it output + a FileDescriptorList, then parse that natively. + * Improved error message when an enum value's name conflicts with another + symbol defined in the enum type's scope, e.g. if two enum types declared + in the same scope have values with the same name. This is disallowed for + compatibility with C++, but this wasn't clear from the error. + * Fixed absolute output paths on Windows. + * Allow trailing slashes in --proto_path mappings. + + C++ + * Reflection objects are now per-class rather than per-instance. To make this + possible, the Reflection interface had to be changed such that all methods + take the Message instance as a parameter. This change improves performance + significantly in memory-bandwidth-limited use cases, since it makes the + message objects smaller. Note that source-incompatible interface changes + like this will not be made again after the library leaves beta. + * Heuristically detect sub-messages when printing unknown fields. + * Fix static initialization ordering bug that caused crashes at startup when + compiling on Mac with static linking. + * Fixed TokenizerTest when compiling with -DNDEBUG on Linux. + * Fixed incorrect definition of kint32min. + * Fix bytes type setter to work with byte sequences with embedded NULLs. + * Other irrelevant tweaks. + + Java + * Fixed UnknownFieldSet's parsing of varints larger than 32 bits. + * Fixed TextFormat's parsing of "inf" and "nan". + * Fixed TextFormat's parsing of comments. + * Added info to Java POM that will be required when we upload the + package to a Maven repo. + + Python + * MergeFrom(message) and CopyFrom(message) are now implemented. + * SerializeToString() raises an exception if the message is missing required + fields. + * Code organization improvements. + * Fixed doc comments for RpcController and RpcChannel, which had somehow been + swapped. + * Fixed text_format_test on Windows where floating-point exponents sometimes + contain extra zeros. + * Fix Python service CallMethod() implementation. + + Other + * Improved readmes. + * VIM syntax highlighting improvements. + +2008-07-07 version 2.0.0: + + * First public release. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt b/spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt new file mode 100644 index 000000000..b39ec308b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt @@ -0,0 +1,90 @@ +This file contains a list of people who have made large contributions +to the public version of Protocol Buffers. + +Original Protocol Buffers design and implementation: + Sanjay Ghemawat + Jeff Dean + Daniel Dulitz + Craig Silverstein + Paul Haahr + Corey Anderson + (and many others) + +Proto2 C++ and Java primary author: + Kenton Varda + +Proto2 Python primary authors: + Will Robinson + Petar Petrov + +Large code contributions: + Jason Hsueh + Joseph Schorr + Wenbo Zhu + +Large quantity of code reviews: + Scott Bruce + Frank Yellin + Neal Norwitz + Jeffrey Yasskin + Ambrose Feinstein + +Documentation: + Lisa Carey + +Maven packaging: + Gregory Kick + +Patch contributors: + Kevin Ko + * Small patch to handle trailing slashes in --proto_path flag. + Johan Euphrosine + * Small patch to fix Python CallMethod(). + Ulrich Kunitz + * Small optimizations to Python serialization. + Leandro Lucarella + * VI syntax highlighting tweaks. + * Fix compiler to not make output executable. + Dilip Joseph + * Heuristic detection of sub-messages when printing unknown fields in + text format. + Brian Atkinson + * Added @Override annotation to generated Java code where appropriate. + Vincent Choinire + * Tru64 support. + Monty Taylor + * Solaris 10 + Sun Studio fixes. + Alek Storm + * Slicing support for repeated scalar fields for the Python API. + Oleg Smolsky + * MS Visual Studio error format option. + * Detect unordered_map in stl_hash.m4. + Brian Olson + * gzip/zlib I/O support. + Michael Poole + * Fixed warnings about generated constructors not explicitly initializing + all fields (only present with certain compiler settings). + * Added generation of field number constants. + Wink Saville + * Fixed initialization ordering problem in logging code. + Will Pierce + * Small patch improving performance of in Python serialization. + Alexandre Vassalotti + * Emacs mode for Protocol Buffers (editors/protobuf-mode.el). + Scott Stafford + * Added Swap(), SwapElements(), and RemoveLast() to Reflection interface. + Alexander Melnikov + * HPUX support. + Oliver Jowett + * Detect whether zlib is new enough in configure script. + * Fixes for Solaris 10 32/64-bit confusion. + Evan Jones + * Optimize Java serialization code when writing a small message to a stream. + * Optimize Java serialization of strings so that UTF-8 encoding happens only + once per string per serialization call. + * Clean up some Java warnings. + * Fix bug with permanent callbacks that delete themselves when run. + Michael Kucharski + * Added CodedInputStream.getTotalBytesRead(). + Kacper Kowalik + * Fixed m4/acx_pthread.m4 problem for some Linux distributions. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt b/spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt new file mode 100644 index 000000000..705db579c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt @@ -0,0 +1,33 @@ +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt b/spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt new file mode 100644 index 000000000..ce3b09490 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt @@ -0,0 +1,237 @@ +This file contains detailed but generic information on building and +installing the C++ part of this project. For shorter instructions, +as well as instructions for compiling and installing the Java or +Python parts, see README. + +====================================================================== + +Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/README.txt b/spotify/breakpad/third_party/protobuf/protobuf/README.txt new file mode 100644 index 000000000..a8f660448 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/README.txt @@ -0,0 +1,152 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008 Google Inc. +http://code.google.com/apis/protocolbuffers/ + +C++ Installation - Unix +======================= + +To build and install the C++ Protocol Buffer runtime and the Protocol +Buffer compiler (protoc) execute the following: + + $ ./configure + $ make + $ make check + $ make install + +If "make check" fails, you can still install, but it is likely that +some features of this library will not work correctly on your system. +Proceed at your own risk. + +"make install" may require superuser privileges. + +For advanced usage information on configure and make, see INSTALL.txt. + +** Hint on install location ** + + By default, the package will be installed to /usr/local. However, + on many platforms, /usr/local/lib is not part of LD_LIBRARY_PATH. + You can add it, but it may be easier to just install to /usr + instead. To do this, invoke configure as follows: + + ./configure --prefix=/usr + + If you already built the package with a different prefix, make sure + to run "make clean" before building again. + +** Compiling dependent packages ** + + To compile a package that uses Protocol Buffers, you need to pass + various flags to your compiler and linker. As of version 2.2.0, + Protocol Buffers integrates with pkg-config to manage this. If you + have pkg-config installed, then you can invoke it to get a list of + flags like so: + + pkg-config --cflags protobuf # print compiler flags + pkg-config --libs protobuf # print linker flags + pkg-config --cflags --libs protobuf # print both + + For example: + + c++ my_program.cc my_proto.pb.cc `pkg-config --cflags --libs protobuf` + + Note that packages written prior to the 2.2.0 release of Protocol + Buffers may not yet integrate with pkg-config to get flags, and may + not pass the correct set of flags to correctly link against + libprotobuf. If the package in question uses autoconf, you can + often fix the problem by invoking its configure script like: + + configure CXXFLAGS="$(pkg-config --cflags protobuf)" \ + LIBS="$(pkg-config --libs protobuf)" + + This will force it to use the correct flags. + + If you are writing an autoconf-based package that uses Protocol + Buffers, you should probably use the PKG_CHECK_MODULES macro in your + configure script like: + + PKG_CHECK_MODULES([protobuf], [protobuf]) + + See the pkg-config man page for more info. + + If you only want protobuf-lite, substitute "protobuf-lite" in place + of "protobuf" in these examples. + +** Note for cross-compiling ** + + The makefiles normally invoke the protoc executable that they just + built in order to build tests. When cross-compiling, the protoc + executable may not be executable on the host machine. In this case, + you must build a copy of protoc for the host machine first, then use + the --with-protoc option to tell configure to use it instead. For + example: + + ./configure --with-protoc=protoc + + This will use the installed protoc (found in your $PATH) instead of + trying to execute the one built during the build process. You can + also use an executable that hasn't been installed. For example, if + you built the protobuf package for your host machine in ../host, + you might do: + + ./configure --with-protoc=../host/src/protoc + + Either way, you must make sure that the protoc executable you use + has the same version as the protobuf source code you are trying to + use it with. + +** Note for Solaris users ** + + Solaris 10 x86 has a bug that will make linking fail, complaining + about libstdc++.la being invalid. We have included a work-around + in this package. To use the work-around, run configure as follows: + + ./configure LDFLAGS=-L$PWD/src/solaris + + See src/solaris/libstdc++.la for more info on this bug. + +** Note for HP C++ Tru64 users ** + + To compile invoke configure as follows: + + ./configure CXXFLAGS="-O -std ansi -ieee -D__USE_STD_IOSTREAM" + + Also, you will need to use gmake instead of make. + +C++ Installation - Windows +========================== + +If you are using Micosoft Visual C++, see vsprojects/readme.txt. + +If you are using Cygwin or MinGW, follow the Unix installation +instructions, above. + +Binary Compatibility Warning +============================ + +Due to the nature of C++, it is unlikely that any two versions of the +Protocol Buffers C++ runtime libraries will have compatible ABIs. +That is, if you linked an executable against an older version of +libprotobuf, it is unlikely to work with a newer version without +re-compiling. This problem, when it occurs, will normally be detected +immediately on startup of your app. Still, you may want to consider +using static linkage. You can configure this package to install +static libraries only using: + + ./configure --disable-shared + +Java and Python Installation +============================ + +The Java and Python runtime libraries for Protocol Buffers are located +in the java and python directories. See the README file in each +directory for more information on how to compile and install them. +Note that both of them require you to first install the Protocol +Buffer compiler (protoc), which is part of the C++ package. + +Usage +===== + +The complete documentation for Protocol Buffers is available via the +web at: + + http://code.google.com/apis/protocolbuffers/ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/autogen.sh b/spotify/breakpad/third_party/protobuf/protobuf/autogen.sh new file mode 100755 index 000000000..c3e026d24 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/autogen.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +# Run this script to generate the configure script and other files that will +# be included in the distribution. These files are not checked in because they +# are automatically generated. + +set -e + +# Check that we're being run from the right directory. +if test ! -f src/google/protobuf/stubs/common.h; then + cat >&2 << __EOF__ +Could not find source code. Make sure you are running this script from the +root of the distribution tree. +__EOF__ + exit 1 +fi + +# Check that gtest is present. Usually it is already there since the +# directory is set up as an SVN external. +if test ! -e gtest; then + echo "Google Test not present. Fetching gtest-1.5.0 from the web..." + curl http://googletest.googlecode.com/files/gtest-1.5.0.tar.bz2 | tar jx + mv gtest-1.5.0 gtest +fi + +set -ex + +# Temporary hack: Must change C runtime library to "multi-threaded DLL", +# otherwise it will be set to "multi-threaded static" when MSVC upgrades +# the project file to MSVC 2005/2008. vladl of Google Test says gtest will +# probably change their default to match, then this will be unnecessary. +# One of these mappings converts the debug configuration and the other +# converts the release configuration. I don't know which is which. +sed -i -e 's/RuntimeLibrary="5"/RuntimeLibrary="3"/g; + s/RuntimeLibrary="4"/RuntimeLibrary="2"/g;' gtest/msvc/*.vcproj + +# TODO(kenton): Remove the ",no-obsolete" part and fix the resulting warnings. +autoreconf -f -i -Wall,no-obsolete + +rm -rf autom4te.cache config.h.in~ +exit 0 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java new file mode 100644 index 000000000..6717ffa2f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java @@ -0,0 +1,203 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2009 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protocolbuffers; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.lang.reflect.Method; + +import com.google.protobuf.ByteString; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import com.google.protobuf.Message; + +public class ProtoBench { + + private static final long MIN_SAMPLE_TIME_MS = 2 * 1000; + private static final long TARGET_TIME_MS = 30 * 1000; + + private ProtoBench() { + // Prevent instantiation + } + + public static void main(String[] args) { + if (args.length < 2 || (args.length % 2) != 0) { + System.err.println("Usage: ProtoBench "); + System.err.println("The descriptor type name is the fully-qualified message name,"); + System.err.println("e.g. com.google.protocolbuffers.benchmark.Message1"); + System.err.println("(You can specify multiple pairs of descriptor type name and input data.)"); + System.exit(1); + } + boolean success = true; + for (int i = 0; i < args.length; i += 2) { + success &= runTest(args[i], args[i + 1]); + } + System.exit(success ? 0 : 1); + } + + /** + * Runs a single test. Error messages are displayed to stderr, and the return value + * indicates general success/failure. + */ + public static boolean runTest(String type, String file) { + System.out.println("Benchmarking " + type + " with file " + file); + final Message defaultMessage; + try { + Class clazz = Class.forName(type); + Method method = clazz.getDeclaredMethod("getDefaultInstance"); + defaultMessage = (Message) method.invoke(null); + } catch (Exception e) { + // We want to do the same thing with all exceptions. Not generally nice, + // but this is slightly different. + System.err.println("Unable to get default message for " + type); + return false; + } + + try { + final byte[] inputData = readAllBytes(file); + final ByteArrayInputStream inputStream = new ByteArrayInputStream(inputData); + final ByteString inputString = ByteString.copyFrom(inputData); + final Message sampleMessage = defaultMessage.newBuilderForType().mergeFrom(inputString).build(); + FileOutputStream devNullTemp = null; + CodedOutputStream reuseDevNullTemp = null; + try { + devNullTemp = new FileOutputStream("/dev/null"); + reuseDevNullTemp = CodedOutputStream.newInstance(devNullTemp); + } catch (FileNotFoundException e) { + // ignore: this is probably Windows, where /dev/null does not exist + } + final FileOutputStream devNull = devNullTemp; + final CodedOutputStream reuseDevNull = reuseDevNullTemp; + benchmark("Serialize to byte string", inputData.length, new Action() { + public void execute() { sampleMessage.toByteString(); } + }); + benchmark("Serialize to byte array", inputData.length, new Action() { + public void execute() { sampleMessage.toByteArray(); } + }); + benchmark("Serialize to memory stream", inputData.length, new Action() { + public void execute() throws IOException { + sampleMessage.writeTo(new ByteArrayOutputStream()); + } + }); + if (devNull != null) { + benchmark("Serialize to /dev/null with FileOutputStream", inputData.length, new Action() { + public void execute() throws IOException { + sampleMessage.writeTo(devNull); + } + }); + benchmark("Serialize to /dev/null reusing FileOutputStream", inputData.length, new Action() { + public void execute() throws IOException { + sampleMessage.writeTo(reuseDevNull); + reuseDevNull.flush(); // force the write to the OutputStream + } + }); + } + benchmark("Deserialize from byte string", inputData.length, new Action() { + public void execute() throws IOException { + defaultMessage.newBuilderForType().mergeFrom(inputString).build(); + } + }); + benchmark("Deserialize from byte array", inputData.length, new Action() { + public void execute() throws IOException { + defaultMessage.newBuilderForType() + .mergeFrom(CodedInputStream.newInstance(inputData)).build(); + } + }); + benchmark("Deserialize from memory stream", inputData.length, new Action() { + public void execute() throws IOException { + defaultMessage.newBuilderForType() + .mergeFrom(CodedInputStream.newInstance(inputStream)).build(); + inputStream.reset(); + } + }); + System.out.println(); + return true; + } catch (Exception e) { + System.err.println("Error: " + e.getMessage()); + System.err.println("Detailed exception information:"); + e.printStackTrace(System.err); + return false; + } + } + + private static void benchmark(String name, long dataSize, Action action) throws IOException { + // Make sure it's JITted "reasonably" hard before running the first progress test + for (int i=0; i < 100; i++) { + action.execute(); + } + + // Run it progressively more times until we've got a reasonable sample + int iterations = 1; + long elapsed = timeAction(action, iterations); + while (elapsed < MIN_SAMPLE_TIME_MS) { + iterations *= 2; + elapsed = timeAction(action, iterations); + } + + // Upscale the sample to the target time. Do this in floating point arithmetic + // to avoid overflow issues. + iterations = (int) ((TARGET_TIME_MS / (double) elapsed) * iterations); + elapsed = timeAction(action, iterations); + System.out.println(name + ": " + iterations + " iterations in " + + (elapsed/1000f) + "s; " + + (iterations * dataSize) / (elapsed * 1024 * 1024 / 1000f) + + "MB/s"); + } + + private static long timeAction(Action action, int iterations) throws IOException { + System.gc(); + long start = System.currentTimeMillis(); + for (int i = 0; i < iterations; i++) { + action.execute(); + } + long end = System.currentTimeMillis(); + return end - start; + } + + private static byte[] readAllBytes(String filename) throws IOException { + RandomAccessFile file = new RandomAccessFile(new File(filename), "r"); + byte[] content = new byte[(int) file.length()]; + file.readFully(content); + return content; + } + + /** + * Interface used to capture a single action to benchmark. + */ + interface Action { + void execute() throws IOException; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message1.dat b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message1.dat new file mode 100644 index 0000000000000000000000000000000000000000..bc0f064cc2ebd108e4a8ee14d94c59d2207f0f19 GIT binary patch literal 228 zcmd;L5a5tF-Cw7~X6&tPrm5@|X=tEnRGJxFnjhg~7^hiQo0;t9U>Bf~WmBSDS5g&| zlWuPxtfpa;QDp8KR;->=t!|p&o}ZB%uVGuFkQ%H|TpjOepXpql=pO5%t`$&fs-adM zZ)H+l7nQ)6!BD_h70Dqfpi_4tW~D( zryZr6A6c3h9#v%GY;BsERHIew5ajHXR9aRPXq>K*t>d?nG3389$2}=7^$m<_I~W-| c7#Supa#h;~mZzoGDd$zsVCk5cxPVO_0C9jt)c^nh literal 0 HcmV?d00001 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message2.dat b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message2.dat new file mode 100644 index 0000000000000000000000000000000000000000..06c09441b9e1a3fc8577f6c36dbb583d85481b2c GIT binary patch literal 84570 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 literal 0 HcmV?d00001 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto new file mode 100644 index 000000000..3e6fbdbc7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto @@ -0,0 +1,136 @@ +package benchmarks; + +option java_outer_classname = "GoogleSize"; +option optimize_for = CODE_SIZE; + +message SizeMessage1 { + required string field1 = 1; + optional string field9 = 9; + optional string field18 = 18; + optional bool field80 = 80 [default=false]; + optional bool field81 = 81 [default=true]; + required int32 field2 = 2; + required int32 field3 = 3; + optional int32 field280 = 280; + optional int32 field6 = 6 [default=0]; + optional int64 field22 = 22; + optional string field4 = 4; + repeated fixed64 field5 = 5; + optional bool field59 = 59 [default=false]; + optional string field7 = 7; + optional int32 field16 = 16; + optional int32 field130 = 130 [default=0]; + optional bool field12 = 12 [default=true]; + optional bool field17 = 17 [default=true]; + optional bool field13 = 13 [default=true]; + optional bool field14 = 14 [default=true]; + optional int32 field104 = 104 [default=0]; + optional int32 field100 = 100 [default=0]; + optional int32 field101 = 101 [default=0]; + optional string field102 = 102; + optional string field103 = 103; + optional int32 field29 = 29 [default=0]; + optional bool field30 = 30 [default=false]; + optional int32 field60 = 60 [default=-1]; + optional int32 field271 = 271 [default=-1]; + optional int32 field272 = 272 [default=-1]; + optional int32 field150 = 150; + optional int32 field23 = 23 [default=0]; + optional bool field24 = 24 [default=false]; + optional int32 field25 = 25 [default=0]; + optional SizeMessage1SubMessage field15 = 15; + optional bool field78 = 78; + optional int32 field67 = 67 [default=0]; + optional int32 field68 = 68; + optional int32 field128 = 128 [default=0]; + optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; + optional int32 field131 = 131 [default=0]; +} + +message SizeMessage1SubMessage { + optional int32 field1 = 1 [default=0]; + optional int32 field2 = 2 [default=0]; + optional int32 field3 = 3 [default=0]; + optional string field15 = 15; + optional bool field12 = 12 [default=true]; + optional int64 field13 = 13; + optional int64 field14 = 14; + optional int32 field16 = 16; + optional int32 field19 = 19 [default=2]; + optional bool field20 = 20 [default=true]; + optional bool field28 = 28 [default=true]; + optional fixed64 field21 = 21; + optional int32 field22 = 22; + optional bool field23 = 23 [ default=false ]; + optional bool field206 = 206 [default=false]; + optional fixed32 field203 = 203; + optional int32 field204 = 204; + optional string field205 = 205; + optional uint64 field207 = 207; + optional uint64 field300 = 300; +} + +message SizeMessage2 { + optional string field1 = 1; + optional int64 field3 = 3; + optional int64 field4 = 4; + optional int64 field30 = 30; + optional bool field75 = 75 [default=false]; + optional string field6 = 6; + optional bytes field2 = 2; + optional int32 field21 = 21 [default=0]; + optional int32 field71 = 71; + optional float field25 = 25; + optional int32 field109 = 109 [default=0]; + optional int32 field210 = 210 [default=0]; + optional int32 field211 = 211 [default=0]; + optional int32 field212 = 212 [default=0]; + optional int32 field213 = 213 [default=0]; + optional int32 field216 = 216 [default=0]; + optional int32 field217 = 217 [default=0]; + optional int32 field218 = 218 [default=0]; + optional int32 field220 = 220 [default=0]; + optional int32 field221 = 221 [default=0]; + optional float field222 = 222 [default=0.0]; + optional int32 field63 = 63; + + repeated group Group1 = 10 { + required float field11 = 11; + optional float field26 = 26; + optional string field12 = 12; + optional string field13 = 13; + repeated string field14 = 14; + required uint64 field15 = 15; + optional int32 field5 = 5; + optional string field27 = 27; + optional int32 field28 = 28; + optional string field29 = 29; + optional string field16 = 16; + repeated string field22 = 22; + repeated int32 field73 = 73; + optional int32 field20 = 20 [default=0]; + optional string field24 = 24; + optional SizeMessage2GroupedMessage field31 = 31; + } + repeated string field128 = 128; + optional int64 field131 = 131; + repeated string field127 = 127; + optional int32 field129 = 129; + repeated int64 field130 = 130; + optional bool field205 = 205 [default=false]; + optional bool field206 = 206 [default=false]; +} + +message SizeMessage2GroupedMessage { + optional float field1 = 1; + optional float field2 = 2; + optional float field3 = 3 [default=0.0]; + optional bool field4 = 4; + optional bool field5 = 5; + optional bool field6 = 6 [default=true]; + optional bool field7 = 7 [default=false]; + optional float field8 = 8; + optional bool field9 = 9; + optional float field10 = 10; + optional int64 field11 = 11; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto new file mode 100644 index 000000000..d6cd0321d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto @@ -0,0 +1,136 @@ +package benchmarks; + +option java_outer_classname = "GoogleSpeed"; +option optimize_for = SPEED; + +message SpeedMessage1 { + required string field1 = 1; + optional string field9 = 9; + optional string field18 = 18; + optional bool field80 = 80 [default=false]; + optional bool field81 = 81 [default=true]; + required int32 field2 = 2; + required int32 field3 = 3; + optional int32 field280 = 280; + optional int32 field6 = 6 [default=0]; + optional int64 field22 = 22; + optional string field4 = 4; + repeated fixed64 field5 = 5; + optional bool field59 = 59 [default=false]; + optional string field7 = 7; + optional int32 field16 = 16; + optional int32 field130 = 130 [default=0]; + optional bool field12 = 12 [default=true]; + optional bool field17 = 17 [default=true]; + optional bool field13 = 13 [default=true]; + optional bool field14 = 14 [default=true]; + optional int32 field104 = 104 [default=0]; + optional int32 field100 = 100 [default=0]; + optional int32 field101 = 101 [default=0]; + optional string field102 = 102; + optional string field103 = 103; + optional int32 field29 = 29 [default=0]; + optional bool field30 = 30 [default=false]; + optional int32 field60 = 60 [default=-1]; + optional int32 field271 = 271 [default=-1]; + optional int32 field272 = 272 [default=-1]; + optional int32 field150 = 150; + optional int32 field23 = 23 [default=0]; + optional bool field24 = 24 [default=false]; + optional int32 field25 = 25 [default=0]; + optional SpeedMessage1SubMessage field15 = 15; + optional bool field78 = 78; + optional int32 field67 = 67 [default=0]; + optional int32 field68 = 68; + optional int32 field128 = 128 [default=0]; + optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"]; + optional int32 field131 = 131 [default=0]; +} + +message SpeedMessage1SubMessage { + optional int32 field1 = 1 [default=0]; + optional int32 field2 = 2 [default=0]; + optional int32 field3 = 3 [default=0]; + optional string field15 = 15; + optional bool field12 = 12 [default=true]; + optional int64 field13 = 13; + optional int64 field14 = 14; + optional int32 field16 = 16; + optional int32 field19 = 19 [default=2]; + optional bool field20 = 20 [default=true]; + optional bool field28 = 28 [default=true]; + optional fixed64 field21 = 21; + optional int32 field22 = 22; + optional bool field23 = 23 [ default=false ]; + optional bool field206 = 206 [default=false]; + optional fixed32 field203 = 203; + optional int32 field204 = 204; + optional string field205 = 205; + optional uint64 field207 = 207; + optional uint64 field300 = 300; +} + +message SpeedMessage2 { + optional string field1 = 1; + optional int64 field3 = 3; + optional int64 field4 = 4; + optional int64 field30 = 30; + optional bool field75 = 75 [default=false]; + optional string field6 = 6; + optional bytes field2 = 2; + optional int32 field21 = 21 [default=0]; + optional int32 field71 = 71; + optional float field25 = 25; + optional int32 field109 = 109 [default=0]; + optional int32 field210 = 210 [default=0]; + optional int32 field211 = 211 [default=0]; + optional int32 field212 = 212 [default=0]; + optional int32 field213 = 213 [default=0]; + optional int32 field216 = 216 [default=0]; + optional int32 field217 = 217 [default=0]; + optional int32 field218 = 218 [default=0]; + optional int32 field220 = 220 [default=0]; + optional int32 field221 = 221 [default=0]; + optional float field222 = 222 [default=0.0]; + optional int32 field63 = 63; + + repeated group Group1 = 10 { + required float field11 = 11; + optional float field26 = 26; + optional string field12 = 12; + optional string field13 = 13; + repeated string field14 = 14; + required uint64 field15 = 15; + optional int32 field5 = 5; + optional string field27 = 27; + optional int32 field28 = 28; + optional string field29 = 29; + optional string field16 = 16; + repeated string field22 = 22; + repeated int32 field73 = 73; + optional int32 field20 = 20 [default=0]; + optional string field24 = 24; + optional SpeedMessage2GroupedMessage field31 = 31; + } + repeated string field128 = 128; + optional int64 field131 = 131; + repeated string field127 = 127; + optional int32 field129 = 129; + repeated int64 field130 = 130; + optional bool field205 = 205 [default=false]; + optional bool field206 = 206 [default=false]; +} + +message SpeedMessage2GroupedMessage { + optional float field1 = 1; + optional float field2 = 2; + optional float field3 = 3 [default=0.0]; + optional bool field4 = 4; + optional bool field5 = 5; + optional bool field6 = 6 [default=true]; + optional bool field7 = 7 [default=false]; + optional float field8 = 8; + optional bool field9 = 9; + optional float field10 = 10; + optional int64 field11 = 11; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt new file mode 100644 index 000000000..2c836d0a1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt @@ -0,0 +1,50 @@ +Contents +-------- + +This folder contains three kinds of file: + +- Code, such as ProtoBench.java, to build the benchmarking framework. +- Protocol buffer definitions (.proto files) +- Sample data files + +If we end up with a lot of different benchmarks it may be worth +separating these out info different directories, but while there are +so few they might as well all be together. + +Running a benchmark (Java) +-------------------------- + +1) Build protoc and the Java protocol buffer library. The examples + below assume a jar file (protobuf.jar) has been built and copied + into this directory. + +2) Build ProtoBench: + $ javac -d tmp -cp protobuf.jar ProtoBench.java + +3) Generate code for the relevant benchmark protocol buffer, e.g. + $ protoc --java_out=tmp google_size.proto google_speed.proto + +4) Build the generated code, e.g. + $ cd tmp + $ javac -d . -cp ../protobuf.jar benchmarks/*.java + +5) Run the test. Arguments are given in pairs - the first argument + is the descriptor type; the second is the filename. For example: + $ java -cp .;../protobuf.jar com.google.protocolbuffers.ProtoBench + benchmarks.GoogleSize$SizeMessage1 ../google_message1.dat + benchmarks.GoogleSpeed$SpeedMessage1 ../google_message1.dat + benchmarks.GoogleSize$SizeMessage2 ../google_message2.dat + benchmarks.GoogleSpeed$SpeedMessage2 ../google_message2.dat + +6) Wait! Each test runs for around 30 seconds, and there are 6 tests + per class/data combination. The above command would therefore take + about 12 minutes to run. + + +Benchmarks available +-------------------- + +From Google: +google_size.proto and google_speed.proto, messages +google_message1.dat and google_message2.dat. The proto files are +equivalent, but optimized differently. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/configure.ac b/spotify/breakpad/third_party/protobuf/protobuf/configure.ac new file mode 100644 index 000000000..7b5f0dd64 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/configure.ac @@ -0,0 +1,149 @@ +## Process this file with autoconf to produce configure. +## In general, the safest way to proceed is to run ./autogen.sh + +AC_PREREQ(2.59) + +# Note: If you change the version, you must also update it in: +# * java/pom.xml +# * python/setup.py +# * src/google/protobuf/stubs/common.h +# * src/Makefile.am (Update -version-info for LDFLAGS if needed) +# +# In the SVN trunk, the version should always be the next anticipated release +# version with the "-pre" suffix. (We used to use "-SNAPSHOT" but this pushed +# the size of one file name in the dist tarfile over the 99-char limit.) +AC_INIT([Protocol Buffers],[2.4.2-pre],[protobuf@googlegroups.com],[protobuf]) + + +AC_CONFIG_SRCDIR(src/google/protobuf/message.cc) +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_MACRO_DIR([m4]) + +# autoconf's default CXXFLAGS are usually "-g -O2". These aren't necessarily +# the best choice for libprotobuf. +AS_IF([test "x${ac_cv_env_CFLAGS_set}" = "x"], + [CFLAGS=""]) +AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"], + [CXXFLAGS=""]) + +AC_CANONICAL_TARGET + +AM_INIT_AUTOMAKE + +AC_ARG_WITH([zlib], + [AS_HELP_STRING([--with-zlib], + [include classes for streaming compressed data in and out @<:@default=check@:>@])], + [],[with_zlib=check]) + +AC_ARG_WITH([protoc], + [AS_HELP_STRING([--with-protoc=COMMAND], + [use the given protoc command instead of building a new one when building tests (useful for cross-compiling)])], + [],[with_protoc=no]) + +# Checks for programs. +AC_PROG_CC +AC_PROG_CXX +AC_LANG([C++]) +ACX_USE_SYSTEM_EXTENSIONS +AM_CONDITIONAL(GCC, test "$GCC" = yes) # let the Makefile know if we're gcc + +# test_util.cc takes forever to compile with GCC and optimization turned on. +AC_MSG_CHECKING([C++ compiler flags...]) +AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"],[ + AS_IF([test "$GCC" = "yes"],[ + PROTOBUF_OPT_FLAG="-O2" + CXXFLAGS="${CXXFLAGS} -g" + ]) + + # Protocol Buffers contains several checks that are intended to be used only + # for debugging and which might hurt performance. Most users are probably + # end users who don't want these checks, so add -DNDEBUG by default. + CXXFLAGS="$CXXFLAGS -DNDEBUG" + + AC_MSG_RESULT([use default: $PROTOBUF_OPT_FLAG $CXXFLAGS]) +],[ + AC_MSG_RESULT([use user-supplied: $CXXFLAGS]) +]) + +AC_SUBST(PROTOBUF_OPT_FLAG) + +ACX_CHECK_SUNCC + +# Have to do libtool after SUNCC, other wise it "helpfully" adds Crun Cstd +# to the link +AC_PROG_LIBTOOL + +# Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h inttypes.h limits.h stdlib.h unistd.h]) + +# Checks for library functions. +AC_FUNC_MEMCMP +AC_FUNC_STRTOD +AC_CHECK_FUNCS([ftruncate memset mkdir strchr strerror strtol]) + +# Check for zlib. +HAVE_ZLIB=0 +AS_IF([test "$with_zlib" != no], [ + AC_MSG_CHECKING([zlib version]) + + # First check the zlib header version. + AC_COMPILE_IFELSE( + AC_LANG_PROGRAM([[ + #include + #if !defined(ZLIB_VERNUM) || (ZLIB_VERNUM < 0x1204) + # error zlib version too old + #endif + ]], []), [ + AC_MSG_RESULT([ok (1.2.0.4 or later)]) + + # Also need to add -lz to the linker flags and make sure this succeeds. + AC_SEARCH_LIBS([zlibVersion], [z], [ + AC_DEFINE([HAVE_ZLIB], [1], [Enable classes using zlib compression.]) + HAVE_ZLIB=1 + ], [ + AS_IF([test "$with_zlib" != check], [ + AC_MSG_FAILURE([--with-zlib was given, but no working zlib library was found]) + ]) + ]) + ], [ + AS_IF([test "$with_zlib" = check], [ + AC_MSG_RESULT([headers missing or too old (requires 1.2.0.4)]) + ], [ + AC_MSG_FAILURE([--with-zlib was given, but zlib headers were not present or were too old (requires 1.2.0.4)]) + ]) + ]) +]) +AM_CONDITIONAL([HAVE_ZLIB], [test $HAVE_ZLIB = 1]) + +AS_IF([test "$with_protoc" != "no"], [ + PROTOC=$with_protoc + AS_IF([test "$with_protoc" = "yes"], [ + # No argument given. Use system protoc. + PROTOC=protoc + ]) + AS_IF([echo "$PROTOC" | grep -q '^@<:@^/@:>@.*/'], [ + # Does not start with a slash, but contains a slash. So, it's a relative + # path (as opposed to an absolute path or an executable in $PATH). + # Since it will actually be executed from the src directory, prefix with + # the current directory. We also insert $ac_top_build_prefix in case this + # is a nested package and --with-protoc was actually given on the outer + # package's configure script. + PROTOC=`pwd`/${ac_top_build_prefix}$PROTOC + ]) + AC_SUBST([PROTOC]) +]) +AM_CONDITIONAL([USE_EXTERNAL_PROTOC], [test "$with_protoc" != "no"]) + +ACX_PTHREAD +AC_CXX_STL_HASH + +# HACK: Make gtest's configure script pick up our copy of CFLAGS and CXXFLAGS, +# since the flags added by ACX_CHECK_SUNCC must be used when compiling gtest +# too. +export CFLAGS +export CXXFLAGS +AC_CONFIG_SUBDIRS([gtest]) + +AC_CONFIG_FILES([Makefile src/Makefile protobuf.pc protobuf-lite.pc]) +AC_OUTPUT diff --git a/spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt b/spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt new file mode 100644 index 000000000..3e9fc79e9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt @@ -0,0 +1,5 @@ +This directory contains syntax highlighting and configuration files for editors +to properly display Protocol Buffer files. + +See each file's header comment for directions on how to use it with the +appropriate editor. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim b/spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim new file mode 100644 index 000000000..c262e290f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim @@ -0,0 +1,105 @@ +" Protocol Buffers - Google's data interchange format +" Copyright 2008 Google Inc. All rights reserved. +" http://code.google.com/p/protobuf/ +" +" Redistribution and use in source and binary forms, with or without +" modification, are permitted provided that the following conditions are +" met: +" +" * Redistributions of source code must retain the above copyright +" notice, this list of conditions and the following disclaimer. +" * Redistributions in binary form must reproduce the above +" copyright notice, this list of conditions and the following disclaimer +" in the documentation and/or other materials provided with the +" distribution. +" * Neither the name of Google Inc. nor the names of its +" contributors may be used to endorse or promote products derived from +" this software without specific prior written permission. +" +" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +" "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +" LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +" A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +" OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +" OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +" This is the Vim syntax file for Google Protocol Buffers. +" +" Usage: +" +" 1. cp proto.vim ~/.vim/syntax/ +" 2. Add the following to ~/.vimrc: +" +" augroup filetype +" au! BufRead,BufNewFile *.proto setfiletype proto +" augroup end +" +" Or just create a new file called ~/.vim/ftdetect/proto.vim with the +" previous lines on it. + +if version < 600 + syntax clear +elseif exists("b:current_syntax") + finish +endif + +syn case match + +syn keyword pbTodo contained TODO FIXME XXX +syn cluster pbCommentGrp contains=pbTodo + +syn keyword pbSyntax syntax import option +syn keyword pbStructure package message group +syn keyword pbRepeat optional required repeated +syn keyword pbDefault default +syn keyword pbExtend extend extensions to max +syn keyword pbRPC service rpc returns + +syn keyword pbType int32 int64 uint32 uint64 sint32 sint64 +syn keyword pbType fixed32 fixed64 sfixed32 sfixed64 +syn keyword pbType float double bool string bytes +syn keyword pbTypedef enum +syn keyword pbBool true false + +syn match pbInt /-\?\<\d\+\>/ +syn match pbInt /\<0[xX]\x+\>/ +syn match pbFloat /\<-\?\d*\(\.\d*\)\?/ +syn region pbComment start="\/\*" end="\*\/" contains=@pbCommentGrp +syn region pbComment start="//" skip="\\$" end="$" keepend contains=@pbCommentGrp +syn region pbString start=/"/ skip=/\\"/ end=/"/ +syn region pbString start=/'/ skip=/\\'/ end=/'/ + +if version >= 508 || !exists("did_proto_syn_inits") + if version < 508 + let did_proto_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink pbTodo Todo + + HiLink pbSyntax Include + HiLink pbStructure Structure + HiLink pbRepeat Repeat + HiLink pbDefault Keyword + HiLink pbExtend Keyword + HiLink pbRPC Keyword + HiLink pbType Type + HiLink pbTypedef Typedef + HiLink pbBool Boolean + + HiLink pbInt Number + HiLink pbFloat Float + HiLink pbComment Comment + HiLink pbString String + + delcommand HiLink +endif + +let b:current_syntax = "proto" diff --git a/spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el b/spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el new file mode 100644 index 000000000..09aecc939 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el @@ -0,0 +1,220 @@ +;;; protobuf-mode.el --- major mode for editing protocol buffers. + +;; Author: Alexandre Vassalotti +;; Created: 23-Apr-2009 +;; Version: 0.3 +;; Keywords: google protobuf languages + +;; Redistribution and use in source and binary forms, with or without +;; modification, are permitted provided that the following conditions are +;; met: +;; +;; * Redistributions of source code must retain the above copyright +;; notice, this list of conditions and the following disclaimer. +;; * Redistributions in binary form must reproduce the above +;; copyright notice, this list of conditions and the following disclaimer +;; in the documentation and/or other materials provided with the +;; distribution. +;; * Neither the name of Google Inc. nor the names of its +;; contributors may be used to endorse or promote products derived from +;; this software without specific prior written permission. +;; +;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +;; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +;;; Commentary: + +;; Installation: +;; - Put `protobuf-mode.el' in your Emacs load-path. +;; - Add this line to your .emacs file: +;; (require 'protobuf-mode) +;; +;; You can customize this mode just like any mode derived from CC Mode. If +;; you want to add customizations specific to protobuf-mode, you can use the +;; `protobuf-mode-hook'. For example, the following would make protocol-mode +;; use 2-space indentation: +;; +;; (defconst my-protobuf-style +;; '((c-basic-offset . 2) +;; (indent-tabs-mode . nil))) +;; +;; (add-hook 'protobuf-mode-hook +;; (lambda () (c-add-style "my-style" my-protobuf-style t))) +;; +;; Refer to the documentation of CC Mode for more information about +;; customization details and how to use this mode. +;; +;; TODO: +;; - Make highlighting for enum values work properly. +;; - Fix the parser to recognize extensions as identifiers and not +;; as casts. +;; - Improve the parsing of option assignment lists. For example: +;; optional int32 foo = 1 [(my_field_option) = 4.5]; +;; - Add support for fully-qualified identifiers (e.g., with a leading "."). + +;;; Code: + +(require 'cc-mode) + +(eval-when-compile + (require 'cc-langs) + (require 'cc-fonts)) + +;; This mode does not inherit properties from other modes. So, we do not use +;; the usual `c-add-language' function. +(eval-and-compile + (put 'protobuf-mode 'c-mode-prefix "protobuf-")) + +;; The following code uses of the `c-lang-defconst' macro define syntactic +;; features of protocol buffer language. Refer to the documentation in the +;; cc-langs.el file for information about the meaning of the -kwds variables. + +(c-lang-defconst c-primitive-type-kwds + protobuf '("double" "float" "int32" "int64" "uint32" "uint64" "sint32" + "sint64" "fixed32" "fixed64" "sfixed32" "sfixed64" "bool" + "string" "bytes" "group")) + +(c-lang-defconst c-modifier-kwds + protobuf '("required" "optional" "repeated")) + +(c-lang-defconst c-class-decl-kwds + protobuf '("message" "enum" "service")) + +(c-lang-defconst c-constant-kwds + protobuf '("true" "false")) + +(c-lang-defconst c-other-decl-kwds + protobuf '("package" "import")) + +(c-lang-defconst c-other-kwds + protobuf '("default" "max")) + +(c-lang-defconst c-identifier-ops + ;; Handle extended identifiers like google.protobuf.MessageOptions + protobuf '((left-assoc "."))) + +;; The following keywords do not fit well in keyword classes defined by +;; cc-mode. So, we approximate as best we can. + +(c-lang-defconst c-type-list-kwds + protobuf '("extensions" "to")) + +(c-lang-defconst c-typeless-decl-kwds + protobuf '("extend" "rpc" "option" "returns")) + + +;; Here we remove default syntax for loops, if-statements and other C +;; syntactic features that are not supported by the protocol buffer language. + +(c-lang-defconst c-brace-list-decl-kwds + ;; Remove syntax for C-style enumerations. + protobuf nil) + +(c-lang-defconst c-block-stmt-1-kwds + ;; Remove syntax for "do" and "else" keywords. + protobuf nil) + +(c-lang-defconst c-block-stmt-2-kwds + ;; Remove syntax for "for", "if", "switch" and "while" keywords. + protobuf nil) + +(c-lang-defconst c-simple-stmt-kwds + ;; Remove syntax for "break", "continue", "goto" and "return" keywords. + protobuf nil) + +(c-lang-defconst c-paren-stmt-kwds + ;; Remove special case for the "(;;)" in for-loops. + protobuf nil) + +(c-lang-defconst c-label-kwds + ;; Remove case label syntax for the "case" and "default" keywords. + protobuf nil) + +(c-lang-defconst c-before-label-kwds + ;; Remove special case for the label in a goto statement. + protobuf nil) + +(c-lang-defconst c-cpp-matchers + ;; Disable all the C preprocessor syntax. + protobuf nil) + +(c-lang-defconst c-decl-prefix-re + ;; Same as for C, except it does not match "(". This is needed for disabling + ;; the syntax for casts. + protobuf "\\([\{\};,]+\\)") + + +;; Add support for variable levels of syntax highlighting. + +(defconst protobuf-font-lock-keywords-1 (c-lang-const c-matchers-1 protobuf) + "Minimal highlighting for protobuf-mode.") + +(defconst protobuf-font-lock-keywords-2 (c-lang-const c-matchers-2 protobuf) + "Fast normal highlighting for protobuf-mode.") + +(defconst protobuf-font-lock-keywords-3 (c-lang-const c-matchers-3 protobuf) + "Accurate normal highlighting for protobuf-mode.") + +(defvar protobuf-font-lock-keywords protobuf-font-lock-keywords-3 + "Default expressions to highlight in protobuf-mode.") + +;; Our syntax table is auto-generated from the keyword classes we defined +;; previously with the `c-lang-const' macro. +(defvar protobuf-mode-syntax-table nil + "Syntax table used in protobuf-mode buffers.") +(or protobuf-mode-syntax-table + (setq protobuf-mode-syntax-table + (funcall (c-lang-const c-make-mode-syntax-table protobuf)))) + +(defvar protobuf-mode-abbrev-table nil + "Abbreviation table used in protobuf-mode buffers.") + +(defvar protobuf-mode-map nil + "Keymap used in protobuf-mode buffers.") +(or protobuf-mode-map + (setq protobuf-mode-map (c-make-inherited-keymap))) + +(easy-menu-define protobuf-menu protobuf-mode-map + "Protocol Buffers Mode Commands" + (cons "Protocol Buffers" (c-lang-const c-mode-menu protobuf))) + +;;;###autoload (add-to-list 'auto-mode-alist '("\\.proto\\'" . protobuf-mode)) + +;;;###autoload +(defun protobuf-mode () + "Major mode for editing Protocol Buffers description language. + +The hook `c-mode-common-hook' is run with no argument at mode +initialization, then `protobuf-mode-hook'. + +Key bindings: +\\{protobuf-mode-map}" + (interactive) + (kill-all-local-variables) + (set-syntax-table protobuf-mode-syntax-table) + (setq major-mode 'protobuf-mode + mode-name "Protocol-Buffers" + local-abbrev-table protobuf-mode-abbrev-table + abbrev-mode t) + (use-local-map protobuf-mode-map) + (c-initialize-cc-mode t) + (if (fboundp 'c-make-emacs-variables-local) + (c-make-emacs-variables-local)) + (c-init-language-vars protobuf-mode) + (c-common-init 'protobuf-mode) + (easy-menu-add protobuf-menu) + (c-run-mode-hooks 'c-mode-common-hook 'protobuf-mode-hook) + (c-update-modeline)) + +(provide 'protobuf-mode) + +;;; protobuf-mode.el ends here diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java b/spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java new file mode 100644 index 000000000..ca5ac2734 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java @@ -0,0 +1,95 @@ +// See README.txt for information and build instructions. + +import com.example.tutorial.AddressBookProtos.AddressBook; +import com.example.tutorial.AddressBookProtos.Person; +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.IOException; +import java.io.PrintStream; + +class AddPerson { + // This function fills in a Person message based on user input. + static Person PromptForAddress(BufferedReader stdin, + PrintStream stdout) throws IOException { + Person.Builder person = Person.newBuilder(); + + stdout.print("Enter person ID: "); + person.setId(Integer.valueOf(stdin.readLine())); + + stdout.print("Enter name: "); + person.setName(stdin.readLine()); + + stdout.print("Enter email address (blank for none): "); + String email = stdin.readLine(); + if (email.length() > 0) { + person.setEmail(email); + } + + while (true) { + stdout.print("Enter a phone number (or leave blank to finish): "); + String number = stdin.readLine(); + if (number.length() == 0) { + break; + } + + Person.PhoneNumber.Builder phoneNumber = + Person.PhoneNumber.newBuilder().setNumber(number); + + stdout.print("Is this a mobile, home, or work phone? "); + String type = stdin.readLine(); + if (type.equals("mobile")) { + phoneNumber.setType(Person.PhoneType.MOBILE); + } else if (type.equals("home")) { + phoneNumber.setType(Person.PhoneType.HOME); + } else if (type.equals("work")) { + phoneNumber.setType(Person.PhoneType.WORK); + } else { + stdout.println("Unknown phone type. Using default."); + } + + person.addPhone(phoneNumber); + } + + return person.build(); + } + + // Main function: Reads the entire address book from a file, + // adds one person based on user input, then writes it back out to the same + // file. + public static void main(String[] args) throws Exception { + if (args.length != 1) { + System.err.println("Usage: AddPerson ADDRESS_BOOK_FILE"); + System.exit(-1); + } + + AddressBook.Builder addressBook = AddressBook.newBuilder(); + + // Read the existing address book. + try { + FileInputStream input = new FileInputStream(args[0]); + try { + addressBook.mergeFrom(input); + } finally { + try { input.close(); } catch (Throwable ignore) {} + } + } catch (FileNotFoundException e) { + System.out.println(args[0] + ": File not found. Creating a new file."); + } + + // Add an address. + addressBook.addPerson( + PromptForAddress(new BufferedReader(new InputStreamReader(System.in)), + System.out)); + + // Write the new address book back to disk. + FileOutputStream output = new FileOutputStream(args[0]); + try { + addressBook.build().writeTo(output); + } finally { + output.close(); + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java b/spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java new file mode 100644 index 000000000..b2f153af1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java @@ -0,0 +1,50 @@ +// See README.txt for information and build instructions. + +import com.example.tutorial.AddressBookProtos.AddressBook; +import com.example.tutorial.AddressBookProtos.Person; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.PrintStream; + +class ListPeople { + // Iterates though all people in the AddressBook and prints info about them. + static void Print(AddressBook addressBook) { + for (Person person: addressBook.getPersonList()) { + System.out.println("Person ID: " + person.getId()); + System.out.println(" Name: " + person.getName()); + if (person.hasEmail()) { + System.out.println(" E-mail address: " + person.getEmail()); + } + + for (Person.PhoneNumber phoneNumber : person.getPhoneList()) { + switch (phoneNumber.getType()) { + case MOBILE: + System.out.print(" Mobile phone #: "); + break; + case HOME: + System.out.print(" Home phone #: "); + break; + case WORK: + System.out.print(" Work phone #: "); + break; + } + System.out.println(phoneNumber.getNumber()); + } + } + } + + // Main function: Reads the entire address book from a file and prints all + // the information inside. + public static void main(String[] args) throws Exception { + if (args.length != 1) { + System.err.println("Usage: ListPeople ADDRESS_BOOK_FILE"); + System.exit(-1); + } + + // Read the existing address book. + AddressBook addressBook = + AddressBook.parseFrom(new FileInputStream(args[0])); + + Print(addressBook); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt b/spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt new file mode 100644 index 000000000..d22bf06c6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt @@ -0,0 +1,29 @@ +This directory contains example code that uses Protocol Buffers to manage an +address book. Two programs are provided, each with three different +implementations, one written in each of C++, Java, and Python. The add_person +example adds a new person to an address book, prompting the user to input +the person's information. The list_people example lists people already in the +address book. The examples use the exact same format in all three languages, +so you can, for example, use add_person_java to create an address book and then +use list_people_python to read it. + +You must install the protobuf package before you can build these. + +To build all the examples (on a unix-like system), simply run "make". This +creates the following executable files in the current directory: + add_person_cpp list_people_cpp + add_person_java list_people_java + add_person_python list_people_python + +If you only want to compile examples in one language, use "make cpp"*, +"make java", or "make python". + +All of these programs simply take an address book file as their parameter. +The add_person programs will create the file if it doesn't already exist. + +These examples are part of the Protocol Buffers tutorial, located at: + http://code.google.com/apis/protocolbuffers/docs/tutorials.html + +* Note that on some platforms you may have to edit the Makefile and remove +"-lpthread" from the linker commands (perhaps replacing it with something else). +We didn't do this automatically because we wanted to keep the example simple. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc b/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc new file mode 100644 index 000000000..b9ca44fc4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc @@ -0,0 +1,95 @@ +// See README.txt for information and build instructions. + +#include +#include +#include +#include "addressbook.pb.h" +using namespace std; + +// This function fills in a Person message based on user input. +void PromptForAddress(tutorial::Person* person) { + cout << "Enter person ID number: "; + int id; + cin >> id; + person->set_id(id); + cin.ignore(256, '\n'); + + cout << "Enter name: "; + getline(cin, *person->mutable_name()); + + cout << "Enter email address (blank for none): "; + string email; + getline(cin, email); + if (!email.empty()) { + person->set_email(email); + } + + while (true) { + cout << "Enter a phone number (or leave blank to finish): "; + string number; + getline(cin, number); + if (number.empty()) { + break; + } + + tutorial::Person::PhoneNumber* phone_number = person->add_phone(); + phone_number->set_number(number); + + cout << "Is this a mobile, home, or work phone? "; + string type; + getline(cin, type); + if (type == "mobile") { + phone_number->set_type(tutorial::Person::MOBILE); + } else if (type == "home") { + phone_number->set_type(tutorial::Person::HOME); + } else if (type == "work") { + phone_number->set_type(tutorial::Person::WORK); + } else { + cout << "Unknown phone type. Using default." << endl; + } + } +} + +// Main function: Reads the entire address book from a file, +// adds one person based on user input, then writes it back out to the same +// file. +int main(int argc, char* argv[]) { + // Verify that the version of the library that we linked against is + // compatible with the version of the headers we compiled against. + GOOGLE_PROTOBUF_VERIFY_VERSION; + + if (argc != 2) { + cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; + return -1; + } + + tutorial::AddressBook address_book; + + { + // Read the existing address book. + fstream input(argv[1], ios::in | ios::binary); + if (!input) { + cout << argv[1] << ": File not found. Creating a new file." << endl; + } else if (!address_book.ParseFromIstream(&input)) { + cerr << "Failed to parse address book." << endl; + return -1; + } + } + + // Add an address. + PromptForAddress(address_book.add_person()); + + { + // Write the new address book back to disk. + fstream output(argv[1], ios::out | ios::trunc | ios::binary); + if (!address_book.SerializeToOstream(&output)) { + cerr << "Failed to write address book." << endl; + return -1; + } + } + + // Optional: Delete all global objects allocated by libprotobuf. + google::protobuf::ShutdownProtobufLibrary(); + + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py b/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py new file mode 100755 index 000000000..78e569662 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py @@ -0,0 +1,58 @@ +#! /usr/bin/python + +# See README.txt for information and build instructions. + +import addressbook_pb2 +import sys + +# This function fills in a Person message based on user input. +def PromptForAddress(person): + person.id = int(raw_input("Enter person ID number: ")) + person.name = raw_input("Enter name: ") + + email = raw_input("Enter email address (blank for none): ") + if email != "": + person.email = email + + while True: + number = raw_input("Enter a phone number (or leave blank to finish): ") + if number == "": + break + + phone_number = person.phone.add() + phone_number.number = number + + type = raw_input("Is this a mobile, home, or work phone? ") + if type == "mobile": + phone_number.type = addressbook_pb2.Person.MOBILE + elif type == "home": + phone_number.type = addressbook_pb2.Person.HOME + elif type == "work": + phone_number.type = addressbook_pb2.Person.WORK + else: + print "Unknown phone type; leaving as default value." + +# Main procedure: Reads the entire address book from a file, +# adds one person based on user input, then writes it back out to the same +# file. +if len(sys.argv) != 2: + print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE" + sys.exit(-1) + +address_book = addressbook_pb2.AddressBook() + +# Read the existing address book. +try: + f = open(sys.argv[1], "rb") + address_book.ParseFromString(f.read()) + f.close() +except IOError: + print sys.argv[1] + ": File not found. Creating a new file." + +# Add an address. +PromptForAddress(address_book.person.add()) + +# Write the new address book back to disk. +f = open(sys.argv[1], "wb") +f.write(address_book.SerializeToString()) +f.close() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto b/spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto new file mode 100644 index 000000000..b14829e9c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto @@ -0,0 +1,30 @@ +// See README.txt for information and build instructions. + +package tutorial; + +option java_package = "com.example.tutorial"; +option java_outer_classname = "AddressBookProtos"; + +message Person { + required string name = 1; + required int32 id = 2; // Unique ID number for this person. + optional string email = 3; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + WORK = 2; + } + + message PhoneNumber { + required string number = 1; + optional PhoneType type = 2 [default = HOME]; + } + + repeated PhoneNumber phone = 4; +} + +// Our address book file is just one of these. +message AddressBook { + repeated Person person = 1; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc b/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc new file mode 100644 index 000000000..5363152e2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc @@ -0,0 +1,68 @@ +// See README.txt for information and build instructions. + +#include +#include +#include +#include "addressbook.pb.h" +using namespace std; + +// Iterates though all people in the AddressBook and prints info about them. +void ListPeople(const tutorial::AddressBook& address_book) { + for (int i = 0; i < address_book.person_size(); i++) { + const tutorial::Person& person = address_book.person(i); + + cout << "Person ID: " << person.id() << endl; + cout << " Name: " << person.name() << endl; + if (person.has_email()) { + cout << " E-mail address: " << person.email() << endl; + } + + for (int j = 0; j < person.phone_size(); j++) { + const tutorial::Person::PhoneNumber& phone_number = person.phone(j); + + switch (phone_number.type()) { + case tutorial::Person::MOBILE: + cout << " Mobile phone #: "; + break; + case tutorial::Person::HOME: + cout << " Home phone #: "; + break; + case tutorial::Person::WORK: + cout << " Work phone #: "; + break; + } + cout << phone_number.number() << endl; + } + } +} + +// Main function: Reads the entire address book from a file and prints all +// the information inside. +int main(int argc, char* argv[]) { + // Verify that the version of the library that we linked against is + // compatible with the version of the headers we compiled against. + GOOGLE_PROTOBUF_VERIFY_VERSION; + + if (argc != 2) { + cerr << "Usage: " << argv[0] << " ADDRESS_BOOK_FILE" << endl; + return -1; + } + + tutorial::AddressBook address_book; + + { + // Read the existing address book. + fstream input(argv[1], ios::in | ios::binary); + if (!address_book.ParseFromIstream(&input)) { + cerr << "Failed to parse address book." << endl; + return -1; + } + } + + ListPeople(address_book); + + // Optional: Delete all global objects allocated by libprotobuf. + google::protobuf::ShutdownProtobufLibrary(); + + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py b/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py new file mode 100755 index 000000000..f9f36b96b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py @@ -0,0 +1,38 @@ +#! /usr/bin/python + +# See README.txt for information and build instructions. + +import addressbook_pb2 +import sys + +# Iterates though all people in the AddressBook and prints info about them. +def ListPeople(address_book): + for person in address_book.person: + print "Person ID:", person.id + print " Name:", person.name + if person.HasField('email'): + print " E-mail address:", person.email + + for phone_number in person.phone: + if phone_number.type == addressbook_pb2.Person.MOBILE: + print " Mobile phone #:", + elif phone_number.type == addressbook_pb2.Person.HOME: + print " Home phone #:", + elif phone_number.type == addressbook_pb2.Person.WORK: + print " Work phone #:", + print phone_number.number + +# Main procedure: Reads the entire address book from a file and prints all +# the information inside. +if len(sys.argv) != 2: + print "Usage:", sys.argv[0], "ADDRESS_BOOK_FILE" + sys.exit(-1) + +address_book = addressbook_pb2.AddressBook() + +# Read the existing address book. +f = open(sys.argv[1], "rb") +address_book.ParseFromString(f.read()) +f.close() + +ListPeople(address_book) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh b/spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh new file mode 100755 index 000000000..07219dc1d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +# Run this script to regenerate descriptor.pb.{h,cc} after the protocol +# compiler changes. Since these files are compiled into the protocol compiler +# itself, they cannot be generated automatically by a make rule. "make check" +# will fail if these files do not match what the protocol compiler would +# generate. +# +# HINT: Flags passed to generate_descriptor_proto.sh will be passed directly +# to make when building protoc. This is particularly useful for passing +# -j4 to run 4 jobs simultaneously. + +if test ! -e src/google/protobuf/stubs/common.h; then + cat >&2 << __EOF__ +Could not find source code. Make sure you are running this script from the +root of the distribution tree. +__EOF__ + exit 1 +fi + +if test ! -e src/Makefile; then + cat >&2 << __EOF__ +Could not find src/Makefile. You must run ./configure (and perhaps +./autogen.sh) first. +__EOF__ + exit 1 +fi + +cd src +make $@ protoc && + ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:. google/protobuf/descriptor.proto && \ + ./protoc --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:. google/protobuf/compiler/plugin.proto +cd .. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES b/spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES new file mode 100644 index 000000000..e574415ee --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES @@ -0,0 +1,98 @@ +Changes for 1.5.0: + + * New feature: assertions can be safely called in multiple threads + where the pthreads library is available. + * New feature: predicates used inside EXPECT_TRUE() and friends + can now generate custom failure messages. + * New feature: Google Test can now be compiled as a DLL. + * New feature: fused source files are included. + * New feature: prints help when encountering unrecognized Google Test flags. + * Experimental feature: CMake build script (requires CMake 2.6.4+). + * Experimental feature: the Pump script for meta programming. + * double values streamed to an assertion are printed with enough precision + to differentiate any two different values. + * Google Test now works on Solaris and AIX. + * Build and test script improvements. + * Bug fixes and implementation clean-ups. + + Potentially breaking changes: + + * Stopped supporting VC++ 7.1 with exceptions disabled. + * Dropped support for 'make install'. + +Changes for 1.4.0: + + * New feature: the event listener API + * New feature: test shuffling + * New feature: the XML report format is closer to junitreport and can + be parsed by Hudson now. + * New feature: when a test runs under Visual Studio, its failures are + integrated in the IDE. + * New feature: /MD(d) versions of VC++ projects. + * New feature: elapsed time for the tests is printed by default. + * New feature: comes with a TR1 tuple implementation such that Boost + is no longer needed for Combine(). + * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends. + * New feature: the Xcode project can now produce static gtest + libraries in addition to a framework. + * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile, + Symbian, gcc, and C++Builder. + * Bug fixes and implementation clean-ups. + +Changes for 1.3.0: + + * New feature: death tests on Windows, Cygwin, and Mac. + * New feature: ability to use Google Test assertions in other testing + frameworks. + * New feature: ability to run disabled test via + --gtest_also_run_disabled_tests. + * New feature: the --help flag for printing the usage. + * New feature: access to Google Test flag values in user code. + * New feature: a script that packs Google Test into one .h and one + .cc file for easy deployment. + * New feature: support for distributing test functions to multiple + machines (requires support from the test runner). + * Bug fixes and implementation clean-ups. + +Changes for 1.2.1: + + * Compatibility fixes for Linux IA-64 and IBM z/OS. + * Added support for using Boost and other TR1 implementations. + * Changes to the build scripts to support upcoming release of Google C++ + Mocking Framework. + * Added Makefile to the distribution package. + * Improved build instructions in README. + +Changes for 1.2.0: + + * New feature: value-parameterized tests. + * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS) + macros. + * Changed the XML report format to match JUnit/Ant's. + * Added tests to the Xcode project. + * Added scons/SConscript for building with SCons. + * Added src/gtest-all.cc for building Google Test from a single file. + * Fixed compatibility with Solaris and z/OS. + * Enabled running Python tests on systems with python 2.3 installed, + e.g. Mac OS X 10.4. + * Bug fixes. + +Changes for 1.1.0: + + * New feature: type-parameterized tests. + * New feature: exception assertions. + * New feature: printing elapsed time of tests. + * Improved the robustness of death tests. + * Added an Xcode project and samples. + * Adjusted the output format on Windows to be understandable by Visual Studio. + * Minor bug fixes. + +Changes for 1.0.1: + + * Added project files for Visual Studio 7.1. + * Fixed issues with compiling on Mac OS X. + * Fixed issues with compiling on Cygwin. + +Changes for 1.0.0: + + * Initial Open Source release of Google Test diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt b/spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt new file mode 100644 index 000000000..7910b5df2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt @@ -0,0 +1,384 @@ +######################################################################## +# Experimental CMake build script for Google Test. +# +# Consider this a prototype. It will change drastically. For now, +# this is only for people on the cutting edge. +# +# To run the tests for Google Test itself on Linux, use 'make test' or +# ctest. You can select which tests to run using 'ctest -R regex'. +# For more options, run 'ctest --help'. + +# For hermetic builds, we may need to tell CMake to use compiler in a +# specific location. +if (gtest_compiler) + include(CMakeForceCompiler) + cmake_force_c_compiler("${gtest_compiler}" "") + cmake_force_cxx_compiler("${gtest_compiler}" "") +endif() + +######################################################################## +# +# Project-wide settings + +# Name of the project. +# +# CMake files in this project can refer to the root source directory +# as ${gtest_SOURCE_DIR} and to the root binary directory as +# ${gtest_BINARY_DIR}. +# Language "C" is required for find_package(Threads). +project(gtest CXX C) +cmake_minimum_required(VERSION 2.6.4) + +if (MSVC) + # For MSVC, CMake sets certain flags to defaults we want to override. + # This replacement code is taken from sample in the CMake Wiki at + # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace. + foreach (flag_var + CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) + # In hermetic build environments, tests may not have access to MS runtime + # DLLs, so this replaces /MD (CRT libraries in DLLs) with /MT (static CRT + # libraries). + string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}") + # We prefer more strict warning checking for building Google Test. + # Replaces /W3 with /W4 in defaults. + string(REPLACE "/W3" "-W4" ${flag_var} "${${flag_var}}") + endforeach() +endif() + +# Where gtest's .h files can be found. +include_directories( + ${gtest_SOURCE_DIR}/include + ${gtest_SOURCE_DIR}) + +# Where the gtest libraries can be found. +link_directories( + ${gtest_BINARY_DIR}/src) + +# Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT. +find_package(Threads) + +# Defines the compiler/linker flags used to build gtest. You can +# tweak these definitions to suit your need. A variable's value is +# empty before it's explicitly assigned to. + +if (MSVC) + # Newlines inside flags variables break CMake's NMake generator. + set(cxx_base_flags "-GS -W4 -WX -wd4275 -nologo -J -Zi") + set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32") + set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN") + set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1") + set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0") + set(cxx_no_rtti_flags "-GR-") +elseif (CMAKE_COMPILER_IS_GNUCXX) + set(cxx_base_flags "-Wall -Wshadow") + set(cxx_exception_flags "-fexceptions") + set(cxx_no_exception_flags "-fno-exceptions") + # Until version 4.3.2, GCC doesn't define a macro to indicate + # whether RTTI is enabled. Therefore we define GTEST_HAS_RTTI + # explicitly. + set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0") + set(cxx_strict_flags "-Wextra") +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") + set(cxx_exception_flags "-features=except") + # Sun Pro doesn't provide macros to indicate whether exceptions and + # RTTI are enabled, so we define GTEST_HAS_* explicitly. + set(cxx_no_exception_flags "-features=no%except -DGTEST_HAS_EXCEPTIONS=0") + set(cxx_no_rtti_flags "-features=no%rtti -DGTEST_HAS_RTTI=0") +elseif (CMAKE_CXX_COMPILER_ID STREQUAL "VisualAge" OR + CMAKE_CXX_COMPILER_ID STREQUAL "XL") + # CMake 2.8 changes Visual Age's compiler ID to "XL". + set(cxx_exception_flags "-qeh") + set(cxx_no_exception_flags "-qnoeh") + # Until version 9.0, Visual Age doesn't define a macro to indicate + # whether RTTI is enabled. Therefore we define GTEST_HAS_RTTI + # explicitly. + set(cxx_no_rtti_flags "-qnortti -DGTEST_HAS_RTTI=0") +endif() + +if (CMAKE_USE_PTHREADS_INIT) # The pthreads library is available. + set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=1") +endif() + +# For building gtest's own tests and samples. +set(cxx_exception "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}") +set(cxx_no_exception + "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}") +set(cxx_default "${cxx_exception}") +set(cxx_no_rtti "${cxx_default} ${cxx_no_rtti_flags}") +set(cxx_use_own_tuple "${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1") + +# For building the gtest libraries. +set(cxx_strict "${cxx_default} ${cxx_strict_flags}") + +######################################################################## +# +# Defines the gtest & gtest_main libraries. User tests should link +# with one of them. +function(cxx_library_with_type name type cxx_flags) + # type can be either STATIC or SHARED to denote a static or shared library. + # ARGN refers to additional arguments after 'cxx_flags'. + add_library(${name} ${type} ${ARGN}) + set_target_properties(${name} + PROPERTIES + COMPILE_FLAGS "${cxx_flags}") + if (CMAKE_USE_PTHREADS_INIT) + target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT}) + endif() +endfunction() + +function(cxx_static_library name cxx_flags) + cxx_library_with_type(${name} STATIC "${cxx_flags}" ${ARGN}) +endfunction() + +function(cxx_shared_library name cxx_flags) + cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN}) +endfunction() + +function(cxx_library name cxx_flags) + # TODO(vladl@google.com): Make static/shared a user option. + cxx_static_library(${name} "${cxx_flags}" ${ARGN}) +endfunction() + +# Static versions of Google Test libraries. We build them using more +# strict warnings than what are used for other targets, to ensure that +# gtest can be compiled by a user aggressive about warnings. +cxx_static_library(gtest "${cxx_strict}" src/gtest-all.cc) +cxx_static_library(gtest_main "${cxx_strict}" src/gtest_main.cc) +target_link_libraries(gtest_main gtest) + +######################################################################## +# +# Samples on how to link user tests with gtest or gtest_main. +# +# They are not built by default. To build them, set the +# build_gtest_samples option to ON. You can do it by running ccmake +# or specifying the -Dbuild_gtest_samples=ON flag when running cmake. + +option(build_gtest_samples "Build gtest's sample programs." OFF) + +# cxx_executable_with_flags(name cxx_flags lib srcs...) +# +# creates a named C++ executable that depends on the given library and +# is built from the given source files with the given compiler flags. +function(cxx_executable_with_flags name cxx_flags lib) + add_executable(${name} ${ARGN}) + if (cxx_flags) + set_target_properties(${name} + PROPERTIES + COMPILE_FLAGS "${cxx_flags}") + endif() + target_link_libraries(${name} ${lib}) +endfunction() + +# cxx_executable(name dir lib srcs...) +# +# creates a named target that depends on the given lib and is built +# from the given source files. dir/name.cc is implicitly included in +# the source file list. +function(cxx_executable name dir lib) + cxx_executable_with_flags( + ${name} "${cxx_default}" ${lib} "${dir}/${name}.cc" ${ARGN}) +endfunction() + +if (build_gtest_samples) + cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc) + cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc) + cxx_executable(sample3_unittest samples gtest_main) + cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc) + cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc) + cxx_executable(sample6_unittest samples gtest_main) + cxx_executable(sample7_unittest samples gtest_main) + cxx_executable(sample8_unittest samples gtest_main) + cxx_executable(sample9_unittest samples gtest) + cxx_executable(sample10_unittest samples gtest) +endif() + +######################################################################## +# +# Google Test's own tests. +# +# You can skip this section if you aren't interested in testing +# Google Test itself. +# +# Most of the tests are not built by default. To build them, set the +# build_all_gtest_tests option to ON. You can do it by running ccmake +# or specifying the -Dbuild_all_gtest_tests=ON flag when running cmake. + +option(build_all_gtest_tests "Build all of gtest's own tests." OFF) + +# This must be set in the root directory for the tests to be run by +# 'make test' or ctest. +enable_testing() + +# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE. +find_package(PythonInterp) + +############################################################ +# C++ tests built with standard compiler flags. + +# cxx_test_with_flags(name cxx_flags libs srcs...) +# +# creates a named C++ test that depends on the given libs and is built +# from the given source files with the given compiler flags. +function(cxx_test_with_flags name cxx_flags libs) + add_executable(${name} ${ARGN}) + set_target_properties(${name} + PROPERTIES + COMPILE_FLAGS "${cxx_flags}") + # To support mixing linking in static and dynamic libraries, link each + # library in with an extra call to target_link_libraries. + foreach (lib "${libs}") + target_link_libraries(${name} ${lib}) + endforeach() + add_test(${name} ${name}) +endfunction() + +# cxx_test(name libs srcs...) +# +# creates a named test target that depends on the given libs and is +# built from the given source files. Unlike cxx_test_with_flags, +# test/name.cc is already implicitly included in the source file list. +function(cxx_test name libs) + cxx_test_with_flags("${name}" "${cxx_default}" "${libs}" + "test/${name}.cc" ${ARGN}) +endfunction() + +cxx_test(gtest_unittest gtest_main) + +if (build_all_gtest_tests) + cxx_test(gtest-death-test_test gtest_main) + cxx_test(gtest_environment_test gtest) + cxx_test(gtest-filepath_test gtest_main) + cxx_test(gtest-linked_ptr_test gtest_main) + cxx_test(gtest-listener_test gtest_main) + cxx_test(gtest_main_unittest gtest_main) + cxx_test(gtest-message_test gtest_main) + cxx_test(gtest_no_test_unittest gtest) + cxx_test(gtest-options_test gtest_main) + cxx_test(gtest-param-test_test gtest + test/gtest-param-test2_test.cc) + cxx_test(gtest-port_test gtest_main) + cxx_test(gtest_pred_impl_unittest gtest_main) + cxx_test(gtest_prod_test gtest_main + test/production.cc) + cxx_test(gtest_repeat_test gtest) + cxx_test(gtest_sole_header_test gtest_main) + cxx_test(gtest_stress_test gtest) + cxx_test(gtest-test-part_test gtest_main) + cxx_test(gtest_throw_on_failure_ex_test gtest) + cxx_test(gtest-typed-test_test gtest_main + test/gtest-typed-test2_test.cc) + cxx_test(gtest-unittest-api_test gtest) +endif() + +############################################################ +# C++ tests built with non-standard compiler flags. + +if (build_all_gtest_tests) + cxx_library(gtest_no_exception "${cxx_no_exception}" + src/gtest-all.cc) + cxx_library(gtest_main_no_rtti "${cxx_no_rtti}" + src/gtest-all.cc src/gtest_main.cc) + + cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}" + gtest_main_no_rtti test/gtest_unittest.cc) + + set(cxx_use_shared_gtest "${cxx_default} -DGTEST_LINKED_AS_SHARED_LIBRARY=1") + set(cxx_build_shared_gtest "${cxx_default} -DGTEST_CREATE_SHARED_LIBRARY=1") + if (MSVC) + # Disables the "class 'X' needs to have dll-interface to be used + # by clients of class 'Y'" warning. This particularly concerns generic + # classes like vector that MS doesn't mark as exported. + set(cxx_use_shared_gtest "${cxx_use_shared_gtest} -wd4251") + set(cxx_build_shared_gtest "${cxx_build_shared_gtest} -wd4251") + endif() + + cxx_shared_library(gtest_dll "${cxx_build_shared_gtest}" + src/gtest-all.cc) + + # TODO(vladl): This and the next tests may not run in the hermetic + # environment on Windows. Re-evaluate and possibly make them + # platform-conditional after implementing hermetic builds. + cxx_executable_with_flags(gtest_dll_test_ "${cxx_use_shared_gtest}" + gtest_dll test/gtest_all_test.cc) + + if (NOT(MSVC AND (MSVC_VERSION EQUAL 1600))) + # The C++ Standard specifies tuple_element. + # Yet MSVC 10's declares tuple_element. + # That declaration conflicts with our own standard-conforming + # tuple implementation. Therefore using our own tuple with + # MSVC 10 doesn't compile. + cxx_library(gtest_main_use_own_tuple "${cxx_use_own_tuple}" + src/gtest-all.cc src/gtest_main.cc) + + cxx_test_with_flags(gtest-tuple_test "${cxx_use_own_tuple}" + gtest_main_use_own_tuple test/gtest-tuple_test.cc) + + cxx_test_with_flags(gtest_use_own_tuple_test "${cxx_use_own_tuple}" + gtest_main_use_own_tuple + test/gtest-param-test_test.cc test/gtest-param-test2_test.cc) + endif() + +endif() + +############################################################ +# Python tests. + +# py_test(name) +# +# creates a Python test with the given name whose main module is in +# test/name.py. It does nothing if Python is not installed. +function(py_test name) + if (PYTHONINTERP_FOUND) + # ${gtest_BINARY_DIR} is known at configuration time, so we can + # directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known + # only at ctest runtime (by calling ctest -c ), so + # we have to escape $ to delay variable substitution here. + add_test(${name} + ${PYTHON_EXECUTABLE} ${gtest_SOURCE_DIR}/test/${name}.py + --gtest_build_dir=${gtest_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE}) + endif() +endfunction() + +if (build_all_gtest_tests) + cxx_executable(gtest_break_on_failure_unittest_ test gtest) + py_test(gtest_break_on_failure_unittest) + + cxx_executable(gtest_color_test_ test gtest) + py_test(gtest_color_test) + + cxx_executable(gtest_env_var_test_ test gtest) + py_test(gtest_env_var_test) + + cxx_executable(gtest_filter_unittest_ test gtest) + py_test(gtest_filter_unittest) + + cxx_executable(gtest_help_test_ test gtest_main) + py_test(gtest_help_test) + + cxx_executable(gtest_list_tests_unittest_ test gtest) + py_test(gtest_list_tests_unittest) + + cxx_executable(gtest_output_test_ test gtest) + py_test(gtest_output_test) + + cxx_executable(gtest_shuffle_test_ test gtest) + py_test(gtest_shuffle_test) + + cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception) + set_target_properties(gtest_throw_on_failure_test_ + PROPERTIES + COMPILE_FLAGS "${cxx_no_exception}") + py_test(gtest_throw_on_failure_test) + + cxx_executable(gtest_uninitialized_test_ test gtest) + py_test(gtest_uninitialized_test) + + cxx_executable(gtest_xml_outfile1_test_ test gtest_main) + cxx_executable(gtest_xml_outfile2_test_ test gtest_main) + py_test(gtest_xml_outfiles_test) + + cxx_executable(gtest_xml_output_unittest_ test gtest) + py_test(gtest_xml_output_unittest) +endif() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS b/spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS new file mode 100644 index 000000000..0934ae130 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS @@ -0,0 +1,36 @@ +# This file contains a list of people who've made non-trivial +# contribution to the Google C++ Testing Framework project. People +# who commit code to the project are encouraged to add their names +# here. Please keep the list sorted by first names. + +Ajay Joshi +Balázs Dán +Bharat Mediratta +Chandler Carruth +Chris Prince +Chris Taylor +Dan Egnor +Eric Roman +Hady Zalek +Jeffrey Yasskin +Jói Sigurðsson +Keir Mierle +Keith Ray +Kenton Varda +Manuel Klimek +Markus Heule +Mika Raento +Miklós Fazekas +Patrick Hanna +Patrick Riley +Peter Kaminski +Preston Jackson +Rainer Klaffenboeck +Russ Cox +Russ Rufer +Sean Mcafee +Sigurður Ásgeirsson +Tracy Bialik +Vadim Berman +Vlad Losev +Zhanyong Wan diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING b/spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING new file mode 100644 index 000000000..1941a11f8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING @@ -0,0 +1,28 @@ +Copyright 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/README b/spotify/breakpad/third_party/protobuf/protobuf/gtest/README new file mode 100644 index 000000000..ec6119002 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/README @@ -0,0 +1,417 @@ +Google C++ Testing Framework +============================ + +http://code.google.com/p/googletest/ + +Overview +-------- + +Google's framework for writing C++ tests on a variety of platforms +(Linux, Mac OS X, Windows, Windows CE, Symbian, etc). Based on the +xUnit architecture. Supports automatic test discovery, a rich set of +assertions, user-defined assertions, death tests, fatal and non-fatal +failures, various options for running the tests, and XML test report +generation. + +Please see the project page above for more information as well as the +mailing list for questions, discussions, and development. There is +also an IRC channel on OFTC (irc.oftc.net) #gtest available. Please +join us! + +Requirements for End Users +-------------------------- + +Google Test is designed to have fairly minimal requirements to build +and use with your projects, but there are some. Currently, we support +Linux, Windows, Mac OS X, and Cygwin. We will also make our best +effort to support other platforms (e.g. Solaris, AIX, and z/OS). +However, since core members of the Google Test project have no access +to these platforms, Google Test may have outstanding issues there. If +you notice any problems on your platform, please notify +googletestframework@googlegroups.com. Patches for fixing them are +even more welcome! + +### Linux Requirements ### + +These are the base requirements to build and use Google Test from a source +package (as described below): + * GNU-compatible Make or gmake + * POSIX-standard shell + * POSIX(-2) Regular Expressions (regex.h) + * A C++98-standard-compliant compiler + +### Windows Requirements ### + + * Microsoft Visual C++ 7.1 or newer + +### Cygwin Requirements ### + + * Cygwin 1.5.25-14 or newer + +### Mac OS X Requirements ### + + * Mac OS X 10.4 Tiger or newer + * Developer Tools Installed + +Also, you'll need CMake 2.6.4 or higher if you want to build the +samples using the provided CMake script, regardless of the platform. + +Requirements for Contributors +----------------------------- + +We welcome patches. If you plan to contribute a patch, you need to +build Google Test and its own tests from an SVN checkout (described +below), which has further requirements: + + * Python version 2.3 or newer (for running some of the tests and + re-generating certain source files from templates) + * CMake 2.6.4 or newer + +Getting the Source +------------------ + +There are two primary ways of getting Google Test's source code: you +can download a stable source release in your preferred archive format, +or directly check out the source from our Subversion (SVN) repositary. +The SVN checkout requires a few extra steps and some extra software +packages on your system, but lets you track the latest development and +make patches much more easily, so we highly encourage it. + +### Source Package ### + +Google Test is released in versioned source packages which can be +downloaded from the download page [1]. Several different archive +formats are provided, but the only difference is the tools used to +manipulate them, and the size of the resulting file. Download +whichever you are most comfortable with. + + [1] http://code.google.com/p/googletest/downloads/list + +Once the package is downloaded, expand it using whichever tools you +prefer for that type. This will result in a new directory with the +name "gtest-X.Y.Z" which contains all of the source code. Here are +some examples on Linux: + + tar -xvzf gtest-X.Y.Z.tar.gz + tar -xvjf gtest-X.Y.Z.tar.bz2 + unzip gtest-X.Y.Z.zip + +### SVN Checkout ### + +To check out the main branch (also known as the "trunk") of Google +Test, run the following Subversion command: + + svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn + +Setting up the Build +-------------------- + +To build Google Test and your tests that use it, you need to tell your +build system where to find its headers and source files. The exact +way to do it depends on which build system you use, and is usually +straightforward. + +### Generic Build Instructions ### + +Suppose you put Google Test in directory ${GTEST_DIR}. To build it, +create a library build target (or a project as called by Visual Studio +and Xcode) to compile + + ${GTEST_DIR}/src/gtest-all.cc + +with + + ${GTEST_DIR}/include and ${GTEST_DIR} + +in the header search path. Assuming a Linux-like system and gcc, +something like the following will do: + + g++ -I${GTEST_DIR}/include -I${GTEST_DIR} -c ${GTEST_DIR}/src/gtest-all.cc + ar -rv libgtest.a gtest-all.o + +Next, you should compile your test source file with +${GTEST_DIR}/include in the header search path, and link it with gtest +and any other necessary libraries: + + g++ -I${GTEST_DIR}/include path/to/your_test.cc libgtest.a -o your_test + +As an example, the make/ directory contains a Makefile that you can +use to build Google Test on systems where GNU make is available +(e.g. Linux, Mac OS X, and Cygwin). It doesn't try to build Google +Test's own tests. Instead, it just builds the Google Test library and +a sample test. You can use it as a starting point for your own build +script. + +If the default settings are correct for your environment, the +following commands should succeed: + + cd ${GTEST_DIR}/make + make + ./sample1_unittest + +If you see errors, try to tweak the contents of make/Makefile to make +them go away. There are instructions in make/Makefile on how to do +it. + +### Using CMake ### + +Google Test comes with a CMake build script (CMakeLists.txt) that can +be used on a wide range of platforms ("C" stands for cross-platofrm.). +If you don't have CMake installed already, you can download it for +free from http://www.cmake.org/. + +CMake works by generating native makefiles or build projects that can +be used in the compiler environment of your choice. The typical +workflow starts with: + + mkdir mybuild # Create a directory to hold the build output. + cd mybuild + cmake ${GTEST_DIR} # Generate native build scripts. + +If you want to build Google Test's samples, you should replace the +last command with + + cmake -Dbuild_gtest_samples=ON ${GTEST_DIR} + +If you are on a *nix system, you should now see a Makefile in the +current directory. Just type 'make' to build gtest. + +If you use Windows and have Vistual Studio installed, a gtest.sln file +and several .vcproj files will be created. You can then build them +using Visual Studio. + +On Mac OS X with Xcode installed, a .xcodeproj file will be generated. + +### Legacy Build Scripts ### + +Before settling on CMake, we have been providing hand-maintained build +projects/scripts for Visual Studio, Xcode, and Autotools. While we +continue to provide them for convenience, they are not actively +maintained any more. We highly recommend that you follow the +instructions in the previous two sections to integrate Google Test +with your existing build system. + +If you still need to use the legacy build scripts, here's how: + +The msvc\ folder contains two solutions with Visual C++ projects. +Open the gtest.sln or gtest-md.sln file using Visual Studio, and you +are ready to build Google Test the same way you build any Visual +Studio project. Files that have names ending with -md use DLL +versions of Microsoft runtime libraries (the /MD or the /MDd compiler +option). Files without that suffix use static versions of the runtime +libraries (the /MT or the /MTd option). Please note that one must use +the same option to compile both gtest and the test code. If you use +Visual Studio 2005 or above, we recommend the -md version as /MD is +the default for new projects in these versions of Visual Studio. + +On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using +Xcode. Build the "gtest" target. The universal binary framework will +end up in your selected build directory (selected in the Xcode +"Preferences..." -> "Building" pane and defaults to xcode/build). +Alternatively, at the command line, enter: + + xcodebuild + +This will build the "Release" configuration of gtest.framework in your +default build location. See the "xcodebuild" man page for more +information about building different configurations and building in +different locations. + +Tweaking Google Test +-------------------- + +Google Test can be used in diverse environments. The default +configuration may not work (or may not work well) out of the box in +some environments. However, you can easily tweak Google Test by +defining control macros on the compiler command line. Generally, +these macros are named like GTEST_XYZ and you define them to either 1 +or 0 to enable or disable a certain feature. + +We list the most frequently used macros below. For a complete list, +see file include/gtest/internal/gtest-port.h. + +### Choosing a TR1 Tuple Library ### + +Some Google Test features require the C++ Technical Report 1 (TR1) +tuple library, which is not yet available with all compilers. The +good news is that Google Test implements a subset of TR1 tuple that's +enough for its own need, and will automatically use this when the +compiler doesn't provide TR1 tuple. + +Usually you don't need to care about which tuple library Google Test +uses. However, if your project already uses TR1 tuple, you need to +tell Google Test to use the same TR1 tuple library the rest of your +project uses, or the two tuple implementations will clash. To do +that, add + + -DGTEST_USE_OWN_TR1_TUPLE=0 + +to the compiler flags while compiling Google Test and your tests. If +you want to force Google Test to use its own tuple library, just add + + -DGTEST_USE_OWN_TR1_TUPLE=1 + +to the compiler flags instead. + +If you don't want Google Test to use tuple at all, add + + -DGTEST_HAS_TR1_TUPLE=0 + +and all features using tuple will be disabled. + +### Multi-threaded Tests ### + +Google Test is thread-safe where the pthread library is available. +After #include , you can check the GTEST_IS_THREADSAFE +macro to see whether this is the case (yes if the macro is #defined to +1, no if it's undefined.). + +If Google Test doesn't correctly detect whether pthread is available +in your environment, you can force it with + + -DGTEST_HAS_PTHREAD=1 + +or + + -DGTEST_HAS_PTHREAD=0 + +When Google Test uses pthread, you may need to add flags to your +compiler and/or linker to select the pthread library, or you'll get +link errors. If you use the CMake script or the deprecated Autotools +script, this is taken care of for you. If you use your own build +script, you'll need to read your compiler and linker's manual to +figure out what flags to add. + +### As a Shared Library (DLL) ### + +Google Test is compact, so most users can build and link it as a +static library for the simplicity. You can choose to use Google Test +as a shared library (known as a DLL on Windows) if you prefer. + +To compile gtest as a shared library, add + + -DGTEST_CREATE_SHARED_LIBRARY=1 + +to the compiler flags. You'll also need to tell the linker to produce +a shared library instead - consult your linker's manual for how to do +it. + +To compile your tests that use the gtest shared library, add + + -DGTEST_LINKED_AS_SHARED_LIBRARY=1 + +to the compiler flags. + +### Avoiding Macro Name Clashes ### + +In C++, macros don't obey namespaces. Therefore two libraries that +both define a macro of the same name will clash if you #include both +definitions. In case a Google Test macro clashes with another +library, you can force Google Test to rename its macro to avoid the +conflict. + +Specifically, if both Google Test and some other code define macro +FOO, you can add + + -DGTEST_DONT_DEFINE_FOO=1 + +to the compiler flags to tell Google Test to change the macro's name +from FOO to GTEST_FOO. Currently FOO can be FAIL, SUCCEED, or TEST. +For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write + + GTEST_TEST(SomeTest, DoesThis) { ... } + +instead of + + TEST(SomeTest, DoesThis) { ... } + +in order to define a test. + +Upgrating from an Earlier Version +--------------------------------- + +We strive to keep Google Test releases backward compatible. +Sometimes, though, we have to make some breaking changes for the +users' long-term benefits. This section describes what you'll need to +do if you are upgrading from an earlier version of Google Test. + +### Upgrading from 1.3.0 or Earlier ### + +You may need to explicitly enable or disable Google Test's own TR1 +tuple library. See the instructions in section "Choosing a TR1 Tuple +Library". + +### Upgrading from 1.4.0 or Earlier ### + +The Autotools build script (configure + make) is no longer officially +supportted. You are encouraged to migrate to your own build system or +use CMake. If you still need to use Autotools, you can find +instructions in the README file from Google Test 1.4.0. + +On platforms where the pthread library is available, Google Test uses +it in order to be thread-safe. See the "Multi-threaded Tests" section +for what this means to your build script. + +If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google +Test will no longer compile. This should affect very few people, as a +large portion of STL (including ) doesn't compile in this mode +anyway. We decided to stop supporting it in order to greatly simplify +Google Test's implementation. + +Developing Google Test +---------------------- + +This section discusses how to make your own changes to Google Test. + +### Testing Google Test Itself ### + +To make sure your changes work as intended and don't break existing +functionality, you'll want to compile and run Google Test's own tests. +For that you can use CMake: + + mkdir mybuild + cd mybuild + cmake -Dbuild_all_gtest_tests=ON ${GTEST_DIR} + +Make sure you have Python installed, as some of Google Test's tests +are written in Python. If the cmake command complains about not being +able to find Python ("Could NOT find PythonInterp (missing: +PYTHON_EXECUTABLE)"), try telling it explicitly where your Python +executable can be found: + + cmake -DPYTHON_EXECUTABLE=path/to/python -Dbuild_all_gtest_tests=ON \ + ${GTEST_DIR} + +Next, you can build Google Test and all of its own tests. On *nix, +this is usually done by 'make'. To run the tests, do + + make test + +All tests should pass. + +### Regenerating Source Files ### + +Some of Google Test's source files are generated from templates (not +in the C++ sense) using a script. A template file is named FOO.pump, +where FOO is the name of the file it will generate. For example, the +file include/gtest/internal/gtest-type-util.h.pump is used to generate +gtest-type-util.h in the same directory. + +Normally you don't need to worry about regenerating the source files, +unless you need to modify them. In that case, you should modify the +corresponding .pump files instead and run the pump.py Python script to +regenerate them. You can find pump.py in the scripts/ directory. +Read the Pump manual [2] for how to use it. + + [2] http://code.google.com/p/googletest/wiki/PumpManual + +### Contributing a Patch ### + +We welcome patches. Please read the Google Test developer's guide [3] +for how you can contribute. In particular, make sure you have signed +the Contributor License Agreement, or we won't be able to accept the +patch. + + [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide + +Happy testing! diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep b/spotify/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj new file mode 100644 index 000000000..95c3054b8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj @@ -0,0 +1,138 @@ + + + + {bca37a72-5b07-46cf-b44e-89f8e06451a2} + Release + + + true + + + true + true + Base + + + true + true + Base + + + true + lib + JPHNE + NO_STRICT + true + true + CppStaticLibrary + true + rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi + false + $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;.. + rtl.lib;vcl.lib + 32 + $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk + + + false + false + true + _DEBUG;$(Defines) + true + false + true + None + DEBUG + true + Debug + true + true + true + $(BDS)\lib\debug;$(ILINK_LibraryPath) + Full + true + + + NDEBUG;$(Defines) + Release + $(BDS)\lib\release;$(ILINK_LibraryPath) + None + + + CPlusPlusBuilder.Personality + CppStaticLibrary + +FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0FalseFalseFalseTrueFalse + + + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + FalseTrueTrue3$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include1$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk1NO_STRICT13216 + + + + + 3 + + + 4 + + + 5 + + + 6 + + + 7 + + + 8 + + + 0 + + + 1 + + + 2 + + + 9 + + + 10 + + + 11 + + + 12 + + + 14 + + + 13 + + + 15 + + + 16 + + + 17 + + + 18 + + + Cfg_1 + + + Cfg_2 + + + \ No newline at end of file diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj new file mode 100644 index 000000000..faf31cab6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj @@ -0,0 +1,54 @@ + + + {c1d923e0-6cba-4332-9b6f-3420acbf5091} + + + + + + + + + Default.Personality + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc new file mode 100644 index 000000000..121b2d80e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc @@ -0,0 +1,38 @@ +// Copyright 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Josh Kelley (joshkel@gmail.com) +// +// Google C++ Testing Framework (Google Test) +// +// C++Builder's IDE cannot build a static library from files with hyphens +// in their name. See http://qc.codegear.com/wc/qcmain.aspx?d=70977 . +// This file serves as a workaround. + +#include "src/gtest-all.cc" diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc new file mode 100644 index 000000000..918eccd19 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc @@ -0,0 +1,40 @@ +// Copyright 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: Josh Kelley (joshkel@gmail.com) +// +// Google C++ Testing Framework (Google Test) +// +// Links gtest.lib and gtest_main.lib into the current project in C++Builder. +// This means that these libraries can't be renamed, but it's the only way to +// ensure that Debug versus Release test builds are linked against the +// appropriate Debug or Release build of the libraries. + +#pragma link "gtest.lib" +#pragma link "gtest_main.lib" diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj new file mode 100644 index 000000000..d76ce1398 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj @@ -0,0 +1,82 @@ + + + + {bca37a72-5b07-46cf-b44e-89f8e06451a2} + Release + + + true + + + true + true + Base + + + true + true + Base + + + true + lib + JPHNE + NO_STRICT + true + true + CppStaticLibrary + true + rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi;GR32_BDS2006.bpi;GR32_DSGN_BDS2006.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi;CExceptionExpert11.bpi + false + $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;.. + rtl.lib;vcl.lib + 32 + $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk + + + false + false + true + _DEBUG;$(Defines) + true + false + true + None + DEBUG + true + Debug + true + true + true + $(BDS)\lib\debug;$(ILINK_LibraryPath) + Full + true + + + NDEBUG;$(Defines) + Release + $(BDS)\lib\release;$(ILINK_LibraryPath) + None + + + CPlusPlusBuilder.Personality + CppStaticLibrary + +FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0FalseFalseFalseTrueFalse + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + FalseTrueTrue3$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\src;..\include1$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk1NO_STRICT13216 + + + + + 0 + + + Cfg_1 + + + Cfg_2 + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj new file mode 100644 index 000000000..dc5db8e4d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj @@ -0,0 +1,88 @@ + + + + {eea63393-5ac5-4b9c-8909-d75fef2daa41} + Release + + + true + + + true + true + Base + + + true + true + Base + + + exe + true + NO_STRICT + JPHNE + true + ..\test + true + CppConsoleApplication + true + true + rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSystemD11R.bpi;JvStdCtrlsD11R.bpi;JvAppFrmD11R.bpi;JvBandsD11R.bpi;JvDBD11R.bpi;JvDlgsD11R.bpi;JvBDED11R.bpi;JvCmpD11R.bpi;JvCryptD11R.bpi;JvCtrlsD11R.bpi;JvCustomD11R.bpi;JvDockingD11R.bpi;JvDotNetCtrlsD11R.bpi;JvEDID11R.bpi;JvGlobusD11R.bpi;JvHMID11R.bpi;JvInterpreterD11R.bpi;JvJansD11R.bpi;JvManagedThreadsD11R.bpi;JvMMD11R.bpi;JvNetD11R.bpi;JvPageCompsD11R.bpi;JvPluginD11R.bpi;JvPrintPreviewD11R.bpi;JvRuntimeDesignD11R.bpi;JvTimeFrameworkD11R.bpi;JvValidatorsD11R.bpi;JvWizardD11R.bpi;JvXPCtrlsD11R.bpi;VclSmp.bpi + false + $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;.. + $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test + true + + + false + false + true + _DEBUG;$(Defines) + true + false + true + None + DEBUG + true + Debug + true + true + true + $(BDS)\lib\debug;$(ILINK_LibraryPath) + Full + true + + + NDEBUG;$(Defines) + Release + $(BDS)\lib\release;$(ILINK_LibraryPath) + None + + + CPlusPlusBuilder.Personality + CppConsoleApplication + +FalseFalse1000FalseFalseFalseFalseFalse103312521.0.0.01.0.0.0FalseFalseFalseTrueFalse + + + CodeGear C++Builder Office 2000 Servers Package + CodeGear C++Builder Office XP Servers Package + FalseTrueTrue3$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include1$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;$(OUTPUTDIR);..\test2NO_STRICTSTRICT + + + + + 0 + + + 1 + + + Cfg_1 + + + Cfg_2 + + + \ No newline at end of file diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac b/spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac new file mode 100644 index 000000000..1b9123746 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac @@ -0,0 +1,67 @@ +m4_include(m4/acx_pthread.m4) + +# At this point, the Xcode project assumes the version string will be three +# integers separated by periods and surrounded by square brackets (e.g. +# "[1.0.1]"). It also asumes that there won't be any closing parenthesis +# between "AC_INIT(" and the closing ")" including comments and strings. +AC_INIT([Google C++ Testing Framework], + [1.5.0], + [googletestframework@googlegroups.com], + [gtest]) + +# Provide various options to initialize the Autoconf and configure processes. +AC_PREREQ([2.59]) +AC_CONFIG_SRCDIR([./COPYING]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_HEADERS([build-aux/config.h]) +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config]) + +# Initialize Automake with various options. We require at least v1.9, prevent +# pedantic complaints about package files, and enable various distribution +# targets. +AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects]) + +# Check for programs used in building Google Test. +AC_PROG_CC +AC_PROG_CXX +AC_LANG([C++]) +AC_PROG_LIBTOOL + +# TODO(chandlerc@google.com): Currently we aren't running the Python tests +# against the interpreter detected by AM_PATH_PYTHON, and so we condition +# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's +# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env" +# hashbang. +PYTHON= # We *do not* allow the user to specify a python interpreter +AC_PATH_PROG([PYTHON],[python],[:]) +AS_IF([test "$PYTHON" != ":"], + [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])]) +AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"]) + +# Configure pthreads. +AC_ARG_WITH([pthreads], + [AS_HELP_STRING([--with-pthreads], + [use pthreads (default is yes)])], + [with_pthreads=$withval], + [with_pthreads=check]) + +have_pthreads=no +AS_IF([test "x$with_pthreads" != "xno"], + [ACX_PTHREAD( + [], + [AS_IF([test "x$with_pthreads" != "xcheck"], + [AC_MSG_FAILURE( + [--with-pthreads was specified, but unable to be used])])]) + have_pthreads="$acx_pthread_ok"]) +AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" == "xyes"]) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_LIBS) + +# TODO(chandlerc@google.com) Check for the necessary system headers. + +# TODO(chandlerc@google.com) Check the types, structures, and other compiler +# and architecture characteristics. + +# Output the generated files. No further autoconf macros may be used. +AC_OUTPUT diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h new file mode 100644 index 000000000..121dc1fb5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h @@ -0,0 +1,283 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// The Google C++ Testing Framework (Google Test) +// +// This header file defines the public API for death tests. It is +// #included by gtest.h so a user doesn't need to include this +// directly. + +#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ + +#include + +namespace testing { + +// This flag controls the style of death tests. Valid values are "threadsafe", +// meaning that the death test child process will re-execute the test binary +// from the start, running only a single death test, or "fast", +// meaning that the child process will execute the test logic immediately +// after forking. +GTEST_DECLARE_string_(death_test_style); + +#if GTEST_HAS_DEATH_TEST + +// The following macros are useful for writing death tests. + +// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is +// executed: +// +// 1. It generates a warning if there is more than one active +// thread. This is because it's safe to fork() or clone() only +// when there is a single thread. +// +// 2. The parent process clone()s a sub-process and runs the death +// test in it; the sub-process exits with code 0 at the end of the +// death test, if it hasn't exited already. +// +// 3. The parent process waits for the sub-process to terminate. +// +// 4. The parent process checks the exit code and error message of +// the sub-process. +// +// Examples: +// +// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); +// for (int i = 0; i < 5; i++) { +// EXPECT_DEATH(server.ProcessRequest(i), +// "Invalid request .* in ProcessRequest()") +// << "Failed to die on request " << i); +// } +// +// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); +// +// bool KilledBySIGHUP(int exit_code) { +// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; +// } +// +// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); +// +// On the regular expressions used in death tests: +// +// On POSIX-compliant systems (*nix), we use the library, +// which uses the POSIX extended regex syntax. +// +// On other platforms (e.g. Windows), we only support a simple regex +// syntax implemented as part of Google Test. This limited +// implementation should be enough most of the time when writing +// death tests; though it lacks many features you can find in PCRE +// or POSIX extended regex syntax. For example, we don't support +// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and +// repetition count ("x{5,7}"), among others. +// +// Below is the syntax that we do support. We chose it to be a +// subset of both PCRE and POSIX extended regex, so it's easy to +// learn wherever you come from. In the following: 'A' denotes a +// literal character, period (.), or a single \\ escape sequence; +// 'x' and 'y' denote regular expressions; 'm' and 'n' are for +// natural numbers. +// +// c matches any literal character c +// \\d matches any decimal digit +// \\D matches any character that's not a decimal digit +// \\f matches \f +// \\n matches \n +// \\r matches \r +// \\s matches any ASCII whitespace, including \n +// \\S matches any character that's not a whitespace +// \\t matches \t +// \\v matches \v +// \\w matches any letter, _, or decimal digit +// \\W matches any character that \\w doesn't match +// \\c matches any literal character c, which must be a punctuation +// . matches any single character except \n +// A? matches 0 or 1 occurrences of A +// A* matches 0 or many occurrences of A +// A+ matches 1 or many occurrences of A +// ^ matches the beginning of a string (not that of each line) +// $ matches the end of a string (not that of each line) +// xy matches x followed by y +// +// If you accidentally use PCRE or POSIX extended regex features +// not implemented by us, you will get a run-time failure. In that +// case, please try to rewrite your regular expression within the +// above syntax. +// +// This implementation is *not* meant to be as highly tuned or robust +// as a compiled regex library, but should perform well enough for a +// death test, which already incurs significant overhead by launching +// a child process. +// +// Known caveats: +// +// A "threadsafe" style death test obtains the path to the test +// program from argv[0] and re-executes it in the sub-process. For +// simplicity, the current implementation doesn't search the PATH +// when launching the sub-process. This means that the user must +// invoke the test program via a path that contains at least one +// path separator (e.g. path/to/foo_test and +// /absolute/path/to/bar_test are fine, but foo_test is not). This +// is rarely a problem as people usually don't put the test binary +// directory in PATH. +// +// TODO(wan@google.com): make thread-safe death tests search the PATH. + +// Asserts that a given statement causes the program to exit, with an +// integer exit status that satisfies predicate, and emitting error output +// that matches regex. +#define ASSERT_EXIT(statement, predicate, regex) \ + GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) + +// Like ASSERT_EXIT, but continues on to successive tests in the +// test case, if any: +#define EXPECT_EXIT(statement, predicate, regex) \ + GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) + +// Asserts that a given statement causes the program to exit, either by +// explicitly exiting with a nonzero exit code or being killed by a +// signal, and emitting error output that matches regex. +#define ASSERT_DEATH(statement, regex) \ + ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) + +// Like ASSERT_DEATH, but continues on to successive tests in the +// test case, if any: +#define EXPECT_DEATH(statement, regex) \ + EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) + +// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: + +// Tests that an exit code describes a normal exit with a given exit code. +class GTEST_API_ ExitedWithCode { + public: + explicit ExitedWithCode(int exit_code); + bool operator()(int exit_status) const; + private: + // No implementation - assignment is unsupported. + void operator=(const ExitedWithCode& other); + + const int exit_code_; +}; + +#if !GTEST_OS_WINDOWS +// Tests that an exit code describes an exit due to termination by a +// given signal. +class GTEST_API_ KilledBySignal { + public: + explicit KilledBySignal(int signum); + bool operator()(int exit_status) const; + private: + const int signum_; +}; +#endif // !GTEST_OS_WINDOWS + +// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. +// The death testing framework causes this to have interesting semantics, +// since the sideeffects of the call are only visible in opt mode, and not +// in debug mode. +// +// In practice, this can be used to test functions that utilize the +// LOG(DFATAL) macro using the following style: +// +// int DieInDebugOr12(int* sideeffect) { +// if (sideeffect) { +// *sideeffect = 12; +// } +// LOG(DFATAL) << "death"; +// return 12; +// } +// +// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) { +// int sideeffect = 0; +// // Only asserts in dbg. +// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); +// +// #ifdef NDEBUG +// // opt-mode has sideeffect visible. +// EXPECT_EQ(12, sideeffect); +// #else +// // dbg-mode no visible sideeffect. +// EXPECT_EQ(0, sideeffect); +// #endif +// } +// +// This will assert that DieInDebugReturn12InOpt() crashes in debug +// mode, usually due to a DCHECK or LOG(DFATAL), but returns the +// appropriate fallback value (12 in this case) in opt mode. If you +// need to test that a function has appropriate side-effects in opt +// mode, include assertions against the side-effects. A general +// pattern for this is: +// +// EXPECT_DEBUG_DEATH({ +// // Side-effects here will have an effect after this statement in +// // opt mode, but none in debug mode. +// EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); +// }, "death"); +// +#ifdef NDEBUG + +#define EXPECT_DEBUG_DEATH(statement, regex) \ + do { statement; } while (::testing::internal::AlwaysFalse()) + +#define ASSERT_DEBUG_DEATH(statement, regex) \ + do { statement; } while (::testing::internal::AlwaysFalse()) + +#else + +#define EXPECT_DEBUG_DEATH(statement, regex) \ + EXPECT_DEATH(statement, regex) + +#define ASSERT_DEBUG_DEATH(statement, regex) \ + ASSERT_DEATH(statement, regex) + +#endif // NDEBUG for EXPECT_DEBUG_DEATH +#endif // GTEST_HAS_DEATH_TEST + +// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and +// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if +// death tests are supported; otherwise they just issue a warning. This is +// useful when you are combining death test assertions with normal test +// assertions in one test. +#if GTEST_HAS_DEATH_TEST +#define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ + EXPECT_DEATH(statement, regex) +#define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ + ASSERT_DEATH(statement, regex) +#else +#define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ + GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, ) +#define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ + GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return) +#endif + +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h new file mode 100644 index 000000000..f135b6942 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h @@ -0,0 +1,230 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// The Google C++ Testing Framework (Google Test) +// +// This header file defines the Message class. +// +// IMPORTANT NOTE: Due to limitation of the C++ language, we have to +// leave some internal implementation details in this header file. +// They are clearly marked by comments like this: +// +// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +// +// Such code is NOT meant to be used by a user directly, and is subject +// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user +// program! + +#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ +#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ + +#include + +#include +#include + +namespace testing { + +// The Message class works like an ostream repeater. +// +// Typical usage: +// +// 1. You stream a bunch of values to a Message object. +// It will remember the text in a StrStream. +// 2. Then you stream the Message object to an ostream. +// This causes the text in the Message to be streamed +// to the ostream. +// +// For example; +// +// testing::Message foo; +// foo << 1 << " != " << 2; +// std::cout << foo; +// +// will print "1 != 2". +// +// Message is not intended to be inherited from. In particular, its +// destructor is not virtual. +// +// Note that StrStream behaves differently in gcc and in MSVC. You +// can stream a NULL char pointer to it in the former, but not in the +// latter (it causes an access violation if you do). The Message +// class hides this difference by treating a NULL char pointer as +// "(null)". +class GTEST_API_ Message { + private: + // The type of basic IO manipulators (endl, ends, and flush) for + // narrow streams. + typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); + + public: + // Constructs an empty Message. + // We allocate the StrStream separately because it otherwise each use of + // ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's + // stack frame leading to huge stack frames in some cases; gcc does not reuse + // the stack space. + Message() : ss_(new internal::StrStream) { + // By default, we want there to be enough precision when printing + // a double to a Message. + *ss_ << std::setprecision(std::numeric_limits::digits10 + 2); + } + + // Copy constructor. + Message(const Message& msg) : ss_(new internal::StrStream) { // NOLINT + *ss_ << msg.GetString(); + } + + // Constructs a Message from a C-string. + explicit Message(const char* str) : ss_(new internal::StrStream) { + *ss_ << str; + } + + ~Message() { delete ss_; } +#if GTEST_OS_SYMBIAN + // Streams a value (either a pointer or not) to this object. + template + inline Message& operator <<(const T& value) { + StreamHelper(typename internal::is_pointer::type(), value); + return *this; + } +#else + // Streams a non-pointer value to this object. + template + inline Message& operator <<(const T& val) { + ::GTestStreamToHelper(ss_, val); + return *this; + } + + // Streams a pointer value to this object. + // + // This function is an overload of the previous one. When you + // stream a pointer to a Message, this definition will be used as it + // is more specialized. (The C++ Standard, section + // [temp.func.order].) If you stream a non-pointer, then the + // previous definition will be used. + // + // The reason for this overload is that streaming a NULL pointer to + // ostream is undefined behavior. Depending on the compiler, you + // may get "0", "(nil)", "(null)", or an access violation. To + // ensure consistent result across compilers, we always treat NULL + // as "(null)". + template + inline Message& operator <<(T* const& pointer) { // NOLINT + if (pointer == NULL) { + *ss_ << "(null)"; + } else { + ::GTestStreamToHelper(ss_, pointer); + } + return *this; + } +#endif // GTEST_OS_SYMBIAN + + // Since the basic IO manipulators are overloaded for both narrow + // and wide streams, we have to provide this specialized definition + // of operator <<, even though its body is the same as the + // templatized version above. Without this definition, streaming + // endl or other basic IO manipulators to Message will confuse the + // compiler. + Message& operator <<(BasicNarrowIoManip val) { + *ss_ << val; + return *this; + } + + // Instead of 1/0, we want to see true/false for bool values. + Message& operator <<(bool b) { + return *this << (b ? "true" : "false"); + } + + // These two overloads allow streaming a wide C string to a Message + // using the UTF-8 encoding. + Message& operator <<(const wchar_t* wide_c_str) { + return *this << internal::String::ShowWideCString(wide_c_str); + } + Message& operator <<(wchar_t* wide_c_str) { + return *this << internal::String::ShowWideCString(wide_c_str); + } + +#if GTEST_HAS_STD_WSTRING + // Converts the given wide string to a narrow string using the UTF-8 + // encoding, and streams the result to this Message object. + Message& operator <<(const ::std::wstring& wstr); +#endif // GTEST_HAS_STD_WSTRING + +#if GTEST_HAS_GLOBAL_WSTRING + // Converts the given wide string to a narrow string using the UTF-8 + // encoding, and streams the result to this Message object. + Message& operator <<(const ::wstring& wstr); +#endif // GTEST_HAS_GLOBAL_WSTRING + + // Gets the text streamed to this object so far as a String. + // Each '\0' character in the buffer is replaced with "\\0". + // + // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + internal::String GetString() const { + return internal::StrStreamToString(ss_); + } + + private: +#if GTEST_OS_SYMBIAN + // These are needed as the Nokia Symbian Compiler cannot decide between + // const T& and const T* in a function template. The Nokia compiler _can_ + // decide between class template specializations for T and T*, so a + // tr1::type_traits-like is_pointer works, and we can overload on that. + template + inline void StreamHelper(internal::true_type /*dummy*/, T* pointer) { + if (pointer == NULL) { + *ss_ << "(null)"; + } else { + ::GTestStreamToHelper(ss_, pointer); + } + } + template + inline void StreamHelper(internal::false_type /*dummy*/, const T& value) { + ::GTestStreamToHelper(ss_, value); + } +#endif // GTEST_OS_SYMBIAN + + // We'll hold the text streamed to this object here. + internal::StrStream* const ss_; + + // We declare (but don't implement) this to prevent the compiler + // from implementing the assignment operator. + void operator=(const Message&); +}; + +// Streams a Message to an ostream. +inline std::ostream& operator <<(std::ostream& os, const Message& sb) { + return os << sb.GetString(); +} + +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h new file mode 100644 index 000000000..810069644 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h @@ -0,0 +1,1392 @@ +// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! + +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: vladl@google.com (Vlad Losev) +// +// Macros and functions for implementing parameterized tests +// in Google C++ Testing Framework (Google Test) +// +// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ + + +// Value-parameterized tests allow you to test your code with different +// parameters without writing multiple copies of the same test. +// +// Here is how you use value-parameterized tests: + +#if 0 + +// To write value-parameterized tests, first you should define a fixture +// class. It must be derived from testing::TestWithParam, where T is +// the type of your parameter values. TestWithParam is itself derived +// from testing::Test. T can be any copyable type. If it's a raw pointer, +// you are responsible for managing the lifespan of the pointed values. + +class FooTest : public ::testing::TestWithParam { + // You can implement all the usual class fixture members here. +}; + +// Then, use the TEST_P macro to define as many parameterized tests +// for this fixture as you want. The _P suffix is for "parameterized" +// or "pattern", whichever you prefer to think. + +TEST_P(FooTest, DoesBlah) { + // Inside a test, access the test parameter with the GetParam() method + // of the TestWithParam class: + EXPECT_TRUE(foo.Blah(GetParam())); + ... +} + +TEST_P(FooTest, HasBlahBlah) { + ... +} + +// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test +// case with any set of parameters you want. Google Test defines a number +// of functions for generating test parameters. They return what we call +// (surprise!) parameter generators. Here is a summary of them, which +// are all in the testing namespace: +// +// +// Range(begin, end [, step]) - Yields values {begin, begin+step, +// begin+step+step, ...}. The values do not +// include end. step defaults to 1. +// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. +// ValuesIn(container) - Yields values from a C-style array, an STL +// ValuesIn(begin,end) container, or an iterator range [begin, end). +// Bool() - Yields sequence {false, true}. +// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product +// for the math savvy) of the values generated +// by the N generators. +// +// For more details, see comments at the definitions of these functions below +// in this file. +// +// The following statement will instantiate tests from the FooTest test case +// each with parameter values "meeny", "miny", and "moe". + +INSTANTIATE_TEST_CASE_P(InstantiationName, + FooTest, + Values("meeny", "miny", "moe")); + +// To distinguish different instances of the pattern, (yes, you +// can instantiate it more then once) the first argument to the +// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the +// actual test case name. Remember to pick unique prefixes for different +// instantiations. The tests from the instantiation above will have +// these names: +// +// * InstantiationName/FooTest.DoesBlah/0 for "meeny" +// * InstantiationName/FooTest.DoesBlah/1 for "miny" +// * InstantiationName/FooTest.DoesBlah/2 for "moe" +// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" +// * InstantiationName/FooTest.HasBlahBlah/1 for "miny" +// * InstantiationName/FooTest.HasBlahBlah/2 for "moe" +// +// You can use these names in --gtest_filter. +// +// This statement will instantiate all tests from FooTest again, each +// with parameter values "cat" and "dog": + +const char* pets[] = {"cat", "dog"}; +INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); + +// The tests from the instantiation above will have these names: +// +// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" +// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" +// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" +// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" +// +// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests +// in the given test case, whether their definitions come before or +// AFTER the INSTANTIATE_TEST_CASE_P statement. +// +// Please also note that generator expressions (including parameters to the +// generators) are evaluated in InitGoogleTest(), after main() has started. +// This allows the user on one hand, to adjust generator parameters in order +// to dynamically determine a set of tests to run and on the other hand, +// give the user a chance to inspect the generated tests with Google Test +// reflection API before RUN_ALL_TESTS() is executed. +// +// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc +// for more examples. +// +// In the future, we plan to publish the API for defining new parameter +// generators. But for now this interface remains part of the internal +// implementation and is subject to change. + +#endif // 0 + +#include + +#if !GTEST_OS_SYMBIAN +#include +#endif + +// scripts/fuse_gtest.py depends on gtest's own header being #included +// *unconditionally*. Therefore these #includes cannot be moved +// inside #if GTEST_HAS_PARAM_TEST. +#include +#include +#include + +#if GTEST_HAS_PARAM_TEST + +namespace testing { + +// Functions producing parameter generators. +// +// Google Test uses these generators to produce parameters for value- +// parameterized tests. When a parameterized test case is instantiated +// with a particular generator, Google Test creates and runs tests +// for each element in the sequence produced by the generator. +// +// In the following sample, tests from test case FooTest are instantiated +// each three times with parameter values 3, 5, and 8: +// +// class FooTest : public TestWithParam { ... }; +// +// TEST_P(FooTest, TestThis) { +// } +// TEST_P(FooTest, TestThat) { +// } +// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); +// + +// Range() returns generators providing sequences of values in a range. +// +// Synopsis: +// Range(start, end) +// - returns a generator producing a sequence of values {start, start+1, +// start+2, ..., }. +// Range(start, end, step) +// - returns a generator producing a sequence of values {start, start+step, +// start+step+step, ..., }. +// Notes: +// * The generated sequences never include end. For example, Range(1, 5) +// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) +// returns a generator producing {1, 3, 5, 7}. +// * start and end must have the same type. That type may be any integral or +// floating-point type or a user defined type satisfying these conditions: +// * It must be assignable (have operator=() defined). +// * It must have operator+() (operator+(int-compatible type) for +// two-operand version). +// * It must have operator<() defined. +// Elements in the resulting sequences will also have that type. +// * Condition start < end must be satisfied in order for resulting sequences +// to contain any elements. +// +template +internal::ParamGenerator Range(T start, T end, IncrementT step) { + return internal::ParamGenerator( + new internal::RangeGenerator(start, end, step)); +} + +template +internal::ParamGenerator Range(T start, T end) { + return Range(start, end, 1); +} + +// ValuesIn() function allows generation of tests with parameters coming from +// a container. +// +// Synopsis: +// ValuesIn(const T (&array)[N]) +// - returns a generator producing sequences with elements from +// a C-style array. +// ValuesIn(const Container& container) +// - returns a generator producing sequences with elements from +// an STL-style container. +// ValuesIn(Iterator begin, Iterator end) +// - returns a generator producing sequences with elements from +// a range [begin, end) defined by a pair of STL-style iterators. These +// iterators can also be plain C pointers. +// +// Please note that ValuesIn copies the values from the containers +// passed in and keeps them to generate tests in RUN_ALL_TESTS(). +// +// Examples: +// +// This instantiates tests from test case StringTest +// each with C-string values of "foo", "bar", and "baz": +// +// const char* strings[] = {"foo", "bar", "baz"}; +// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); +// +// This instantiates tests from test case StlStringTest +// each with STL strings with values "a" and "b": +// +// ::std::vector< ::std::string> GetParameterStrings() { +// ::std::vector< ::std::string> v; +// v.push_back("a"); +// v.push_back("b"); +// return v; +// } +// +// INSTANTIATE_TEST_CASE_P(CharSequence, +// StlStringTest, +// ValuesIn(GetParameterStrings())); +// +// +// This will also instantiate tests from CharTest +// each with parameter values 'a' and 'b': +// +// ::std::list GetParameterChars() { +// ::std::list list; +// list.push_back('a'); +// list.push_back('b'); +// return list; +// } +// ::std::list l = GetParameterChars(); +// INSTANTIATE_TEST_CASE_P(CharSequence2, +// CharTest, +// ValuesIn(l.begin(), l.end())); +// +template +internal::ParamGenerator< + typename ::std::iterator_traits::value_type> ValuesIn( + ForwardIterator begin, + ForwardIterator end) { + typedef typename ::std::iterator_traits::value_type + ParamType; + return internal::ParamGenerator( + new internal::ValuesInIteratorRangeGenerator(begin, end)); +} + +template +internal::ParamGenerator ValuesIn(const T (&array)[N]) { + return ValuesIn(array, array + N); +} + +template +internal::ParamGenerator ValuesIn( + const Container& container) { + return ValuesIn(container.begin(), container.end()); +} + +// Values() allows generating tests from explicitly specified list of +// parameters. +// +// Synopsis: +// Values(T v1, T v2, ..., T vN) +// - returns a generator producing sequences with elements v1, v2, ..., vN. +// +// For example, this instantiates tests from test case BarTest each +// with values "one", "two", and "three": +// +// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); +// +// This instantiates tests from test case BazTest each with values 1, 2, 3.5. +// The exact type of values will depend on the type of parameter in BazTest. +// +// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); +// +// Currently, Values() supports from 1 to 50 parameters. +// +template +internal::ValueArray1 Values(T1 v1) { + return internal::ValueArray1(v1); +} + +template +internal::ValueArray2 Values(T1 v1, T2 v2) { + return internal::ValueArray2(v1, v2); +} + +template +internal::ValueArray3 Values(T1 v1, T2 v2, T3 v3) { + return internal::ValueArray3(v1, v2, v3); +} + +template +internal::ValueArray4 Values(T1 v1, T2 v2, T3 v3, T4 v4) { + return internal::ValueArray4(v1, v2, v3, v4); +} + +template +internal::ValueArray5 Values(T1 v1, T2 v2, T3 v3, T4 v4, + T5 v5) { + return internal::ValueArray5(v1, v2, v3, v4, v5); +} + +template +internal::ValueArray6 Values(T1 v1, T2 v2, T3 v3, + T4 v4, T5 v5, T6 v6) { + return internal::ValueArray6(v1, v2, v3, v4, v5, v6); +} + +template +internal::ValueArray7 Values(T1 v1, T2 v2, T3 v3, + T4 v4, T5 v5, T6 v6, T7 v7) { + return internal::ValueArray7(v1, v2, v3, v4, v5, + v6, v7); +} + +template +internal::ValueArray8 Values(T1 v1, T2 v2, + T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) { + return internal::ValueArray8(v1, v2, v3, v4, + v5, v6, v7, v8); +} + +template +internal::ValueArray9 Values(T1 v1, T2 v2, + T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) { + return internal::ValueArray9(v1, v2, v3, + v4, v5, v6, v7, v8, v9); +} + +template +internal::ValueArray10 Values(T1 v1, + T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) { + return internal::ValueArray10(v1, + v2, v3, v4, v5, v6, v7, v8, v9, v10); +} + +template +internal::ValueArray11 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11) { + return internal::ValueArray11(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11); +} + +template +internal::ValueArray12 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12) { + return internal::ValueArray12(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12); +} + +template +internal::ValueArray13 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13) { + return internal::ValueArray13(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13); +} + +template +internal::ValueArray14 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) { + return internal::ValueArray14(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, + v14); +} + +template +internal::ValueArray15 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, + T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) { + return internal::ValueArray15(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15); +} + +template +internal::ValueArray16 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, + T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16) { + return internal::ValueArray16(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, + v12, v13, v14, v15, v16); +} + +template +internal::ValueArray17 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, + T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17) { + return internal::ValueArray17(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, + v11, v12, v13, v14, v15, v16, v17); +} + +template +internal::ValueArray18 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, + T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17, T18 v18) { + return internal::ValueArray18(v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15, v16, v17, v18); +} + +template +internal::ValueArray19 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, + T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, + T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) { + return internal::ValueArray19(v1, v2, v3, v4, v5, v6, v7, v8, + v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19); +} + +template +internal::ValueArray20 Values(T1 v1, T2 v2, T3 v3, T4 v4, + T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, + T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) { + return internal::ValueArray20(v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20); +} + +template +internal::ValueArray21 Values(T1 v1, T2 v2, T3 v3, T4 v4, + T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, + T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) { + return internal::ValueArray21(v1, v2, v3, v4, v5, v6, + v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21); +} + +template +internal::ValueArray22 Values(T1 v1, T2 v2, T3 v3, + T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, + T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, + T21 v21, T22 v22) { + return internal::ValueArray22(v1, v2, v3, v4, + v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, + v20, v21, v22); +} + +template +internal::ValueArray23 Values(T1 v1, T2 v2, + T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, + T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, + T21 v21, T22 v22, T23 v23) { + return internal::ValueArray23(v1, v2, v3, + v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, + v20, v21, v22, v23); +} + +template +internal::ValueArray24 Values(T1 v1, T2 v2, + T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, + T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, + T21 v21, T22 v22, T23 v23, T24 v24) { + return internal::ValueArray24(v1, v2, + v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, + v19, v20, v21, v22, v23, v24); +} + +template +internal::ValueArray25 Values(T1 v1, + T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, + T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, + T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) { + return internal::ValueArray25(v1, + v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, + v18, v19, v20, v21, v22, v23, v24, v25); +} + +template +internal::ValueArray26 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26) { + return internal::ValueArray26(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, + v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26); +} + +template +internal::ValueArray27 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27) { + return internal::ValueArray27(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, + v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27); +} + +template +internal::ValueArray28 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28) { + return internal::ValueArray28(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, + v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, + v28); +} + +template +internal::ValueArray29 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29) { + return internal::ValueArray29(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, + v27, v28, v29); +} + +template +internal::ValueArray30 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, + T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, + T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, + T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) { + return internal::ValueArray30(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, + v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, + v26, v27, v28, v29, v30); +} + +template +internal::ValueArray31 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, + T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, + T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) { + return internal::ValueArray31(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, + v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, + v25, v26, v27, v28, v29, v30, v31); +} + +template +internal::ValueArray32 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, + T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, + T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, + T32 v32) { + return internal::ValueArray32(v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, + v24, v25, v26, v27, v28, v29, v30, v31, v32); +} + +template +internal::ValueArray33 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, + T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, + T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, + T32 v32, T33 v33) { + return internal::ValueArray33(v1, v2, v3, v4, v5, v6, v7, v8, + v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, + v24, v25, v26, v27, v28, v29, v30, v31, v32, v33); +} + +template +internal::ValueArray34 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, + T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, + T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, + T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, + T31 v31, T32 v32, T33 v33, T34 v34) { + return internal::ValueArray34(v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, + v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34); +} + +template +internal::ValueArray35 Values(T1 v1, T2 v2, T3 v3, T4 v4, + T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, + T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, + T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, + T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) { + return internal::ValueArray35(v1, v2, v3, v4, v5, v6, + v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, + v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35); +} + +template +internal::ValueArray36 Values(T1 v1, T2 v2, T3 v3, T4 v4, + T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, + T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, + T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, + T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) { + return internal::ValueArray36(v1, v2, v3, v4, + v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, + v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, + v34, v35, v36); +} + +template +internal::ValueArray37 Values(T1 v1, T2 v2, T3 v3, + T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, + T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, + T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, + T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, + T37 v37) { + return internal::ValueArray37(v1, v2, v3, + v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, + v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, + v34, v35, v36, v37); +} + +template +internal::ValueArray38 Values(T1 v1, T2 v2, + T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, + T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, + T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, + T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, + T37 v37, T38 v38) { + return internal::ValueArray38(v1, v2, + v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, + v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, + v33, v34, v35, v36, v37, v38); +} + +template +internal::ValueArray39 Values(T1 v1, T2 v2, + T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, + T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, + T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, + T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, + T37 v37, T38 v38, T39 v39) { + return internal::ValueArray39(v1, + v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, + v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, + v32, v33, v34, v35, v36, v37, v38, v39); +} + +template +internal::ValueArray40 Values(T1 v1, + T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, + T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, + T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, + T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, + T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) { + return internal::ValueArray40(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, + v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, + v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40); +} + +template +internal::ValueArray41 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) { + return internal::ValueArray41(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, + v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, + v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41); +} + +template +internal::ValueArray42 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42) { + return internal::ValueArray42(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, + v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, + v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, + v42); +} + +template +internal::ValueArray43 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43) { + return internal::ValueArray43(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, + v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, + v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, + v41, v42, v43); +} + +template +internal::ValueArray44 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44) { + return internal::ValueArray44(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, + v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, + v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, + v40, v41, v42, v43, v44); +} + +template +internal::ValueArray45 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, + T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, + T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, + T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, + T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, + T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) { + return internal::ValueArray45(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, + v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, + v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, + v39, v40, v41, v42, v43, v44, v45); +} + +template +internal::ValueArray46 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, + T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, + T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, + T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, + T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) { + return internal::ValueArray46(v1, v2, v3, v4, v5, v6, v7, v8, v9, + v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, + v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, + v38, v39, v40, v41, v42, v43, v44, v45, v46); +} + +template +internal::ValueArray47 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, + T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, + T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, + T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, + T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) { + return internal::ValueArray47(v1, v2, v3, v4, v5, v6, v7, v8, + v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, + v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, + v38, v39, v40, v41, v42, v43, v44, v45, v46, v47); +} + +template +internal::ValueArray48 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, + T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, + T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, + T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, + T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, + T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, + T48 v48) { + return internal::ValueArray48(v1, v2, v3, v4, v5, v6, v7, + v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, + v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, + v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48); +} + +template +internal::ValueArray49 Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, + T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, + T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, + T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, + T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, + T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, + T47 v47, T48 v48, T49 v49) { + return internal::ValueArray49(v1, v2, v3, v4, v5, v6, + v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, + v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, + v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49); +} + +template +internal::ValueArray50 Values(T1 v1, T2 v2, T3 v3, T4 v4, + T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, + T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, + T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, + T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, + T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, + T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) { + return internal::ValueArray50(v1, v2, v3, v4, + v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, + v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, + v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, + v48, v49, v50); +} + +// Bool() allows generating tests with parameters in a set of (false, true). +// +// Synopsis: +// Bool() +// - returns a generator producing sequences with elements {false, true}. +// +// It is useful when testing code that depends on Boolean flags. Combinations +// of multiple flags can be tested when several Bool()'s are combined using +// Combine() function. +// +// In the following example all tests in the test case FlagDependentTest +// will be instantiated twice with parameters false and true. +// +// class FlagDependentTest : public testing::TestWithParam { +// virtual void SetUp() { +// external_flag = GetParam(); +// } +// } +// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); +// +inline internal::ParamGenerator Bool() { + return Values(false, true); +} + +#if GTEST_HAS_COMBINE +// Combine() allows the user to combine two or more sequences to produce +// values of a Cartesian product of those sequences' elements. +// +// Synopsis: +// Combine(gen1, gen2, ..., genN) +// - returns a generator producing sequences with elements coming from +// the Cartesian product of elements from the sequences generated by +// gen1, gen2, ..., genN. The sequence elements will have a type of +// tuple where T1, T2, ..., TN are the types +// of elements from sequences produces by gen1, gen2, ..., genN. +// +// Combine can have up to 10 arguments. This number is currently limited +// by the maximum number of elements in the tuple implementation used by Google +// Test. +// +// Example: +// +// This will instantiate tests in test case AnimalTest each one with +// the parameter values tuple("cat", BLACK), tuple("cat", WHITE), +// tuple("dog", BLACK), and tuple("dog", WHITE): +// +// enum Color { BLACK, GRAY, WHITE }; +// class AnimalTest +// : public testing::TestWithParam > {...}; +// +// TEST_P(AnimalTest, AnimalLooksNice) {...} +// +// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, +// Combine(Values("cat", "dog"), +// Values(BLACK, WHITE))); +// +// This will instantiate tests in FlagDependentTest with all variations of two +// Boolean flags: +// +// class FlagDependentTest +// : public testing::TestWithParam > { +// virtual void SetUp() { +// // Assigns external_flag_1 and external_flag_2 values from the tuple. +// tie(external_flag_1, external_flag_2) = GetParam(); +// } +// }; +// +// TEST_P(FlagDependentTest, TestFeature1) { +// // Test your code using external_flag_1 and external_flag_2 here. +// } +// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, +// Combine(Bool(), Bool())); +// +template +internal::CartesianProductHolder2 Combine( + const Generator1& g1, const Generator2& g2) { + return internal::CartesianProductHolder2( + g1, g2); +} + +template +internal::CartesianProductHolder3 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3) { + return internal::CartesianProductHolder3( + g1, g2, g3); +} + +template +internal::CartesianProductHolder4 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3, + const Generator4& g4) { + return internal::CartesianProductHolder4( + g1, g2, g3, g4); +} + +template +internal::CartesianProductHolder5 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3, + const Generator4& g4, const Generator5& g5) { + return internal::CartesianProductHolder5( + g1, g2, g3, g4, g5); +} + +template +internal::CartesianProductHolder6 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3, + const Generator4& g4, const Generator5& g5, const Generator6& g6) { + return internal::CartesianProductHolder6( + g1, g2, g3, g4, g5, g6); +} + +template +internal::CartesianProductHolder7 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3, + const Generator4& g4, const Generator5& g5, const Generator6& g6, + const Generator7& g7) { + return internal::CartesianProductHolder7( + g1, g2, g3, g4, g5, g6, g7); +} + +template +internal::CartesianProductHolder8 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3, + const Generator4& g4, const Generator5& g5, const Generator6& g6, + const Generator7& g7, const Generator8& g8) { + return internal::CartesianProductHolder8( + g1, g2, g3, g4, g5, g6, g7, g8); +} + +template +internal::CartesianProductHolder9 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3, + const Generator4& g4, const Generator5& g5, const Generator6& g6, + const Generator7& g7, const Generator8& g8, const Generator9& g9) { + return internal::CartesianProductHolder9( + g1, g2, g3, g4, g5, g6, g7, g8, g9); +} + +template +internal::CartesianProductHolder10 Combine( + const Generator1& g1, const Generator2& g2, const Generator3& g3, + const Generator4& g4, const Generator5& g5, const Generator6& g6, + const Generator7& g7, const Generator8& g8, const Generator9& g9, + const Generator10& g10) { + return internal::CartesianProductHolder10( + g1, g2, g3, g4, g5, g6, g7, g8, g9, g10); +} +#endif // GTEST_HAS_COMBINE + + + +#define TEST_P(test_case_name, test_name) \ + class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ + : public test_case_name { \ + public: \ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ + virtual void TestBody(); \ + private: \ + static int AddToRegistry() { \ + ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ + GetTestCasePatternHolder(\ + #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ + #test_case_name, \ + #test_name, \ + new ::testing::internal::TestMetaFactory< \ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ + return 0; \ + } \ + static int gtest_registering_dummy_; \ + GTEST_DISALLOW_COPY_AND_ASSIGN_(\ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ + }; \ + int GTEST_TEST_CLASS_NAME_(test_case_name, \ + test_name)::gtest_registering_dummy_ = \ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ + void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() + +#define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ + ::testing::internal::ParamGenerator \ + gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ + int gtest_##prefix##test_case_name##_dummy_ = \ + ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ + GetTestCasePatternHolder(\ + #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ + #prefix, \ + >est_##prefix##test_case_name##_EvalGenerator_, \ + __FILE__, __LINE__) + +} // namespace testing + +#endif // GTEST_HAS_PARAM_TEST + +#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump new file mode 100644 index 000000000..a23118827 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump @@ -0,0 +1,457 @@ +$$ -*- mode: c++; -*- +$var n = 50 $$ Maximum length of Values arguments we want to support. +$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: vladl@google.com (Vlad Losev) +// +// Macros and functions for implementing parameterized tests +// in Google C++ Testing Framework (Google Test) +// +// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ + + +// Value-parameterized tests allow you to test your code with different +// parameters without writing multiple copies of the same test. +// +// Here is how you use value-parameterized tests: + +#if 0 + +// To write value-parameterized tests, first you should define a fixture +// class. It must be derived from testing::TestWithParam, where T is +// the type of your parameter values. TestWithParam is itself derived +// from testing::Test. T can be any copyable type. If it's a raw pointer, +// you are responsible for managing the lifespan of the pointed values. + +class FooTest : public ::testing::TestWithParam { + // You can implement all the usual class fixture members here. +}; + +// Then, use the TEST_P macro to define as many parameterized tests +// for this fixture as you want. The _P suffix is for "parameterized" +// or "pattern", whichever you prefer to think. + +TEST_P(FooTest, DoesBlah) { + // Inside a test, access the test parameter with the GetParam() method + // of the TestWithParam class: + EXPECT_TRUE(foo.Blah(GetParam())); + ... +} + +TEST_P(FooTest, HasBlahBlah) { + ... +} + +// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test +// case with any set of parameters you want. Google Test defines a number +// of functions for generating test parameters. They return what we call +// (surprise!) parameter generators. Here is a summary of them, which +// are all in the testing namespace: +// +// +// Range(begin, end [, step]) - Yields values {begin, begin+step, +// begin+step+step, ...}. The values do not +// include end. step defaults to 1. +// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. +// ValuesIn(container) - Yields values from a C-style array, an STL +// ValuesIn(begin,end) container, or an iterator range [begin, end). +// Bool() - Yields sequence {false, true}. +// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product +// for the math savvy) of the values generated +// by the N generators. +// +// For more details, see comments at the definitions of these functions below +// in this file. +// +// The following statement will instantiate tests from the FooTest test case +// each with parameter values "meeny", "miny", and "moe". + +INSTANTIATE_TEST_CASE_P(InstantiationName, + FooTest, + Values("meeny", "miny", "moe")); + +// To distinguish different instances of the pattern, (yes, you +// can instantiate it more then once) the first argument to the +// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the +// actual test case name. Remember to pick unique prefixes for different +// instantiations. The tests from the instantiation above will have +// these names: +// +// * InstantiationName/FooTest.DoesBlah/0 for "meeny" +// * InstantiationName/FooTest.DoesBlah/1 for "miny" +// * InstantiationName/FooTest.DoesBlah/2 for "moe" +// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" +// * InstantiationName/FooTest.HasBlahBlah/1 for "miny" +// * InstantiationName/FooTest.HasBlahBlah/2 for "moe" +// +// You can use these names in --gtest_filter. +// +// This statement will instantiate all tests from FooTest again, each +// with parameter values "cat" and "dog": + +const char* pets[] = {"cat", "dog"}; +INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); + +// The tests from the instantiation above will have these names: +// +// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" +// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" +// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" +// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" +// +// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests +// in the given test case, whether their definitions come before or +// AFTER the INSTANTIATE_TEST_CASE_P statement. +// +// Please also note that generator expressions are evaluated in +// RUN_ALL_TESTS(), after main() has started. This allows evaluation of +// parameter list based on command line parameters. +// +// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc +// for more examples. +// +// In the future, we plan to publish the API for defining new parameter +// generators. But for now this interface remains part of the internal +// implementation and is subject to change. + +#endif // 0 + +#include + +#if !GTEST_OS_SYMBIAN +#include +#endif + +// scripts/fuse_gtest.py depends on gtest's own header being #included +// *unconditionally*. Therefore these #includes cannot be moved +// inside #if GTEST_HAS_PARAM_TEST. +#include +#include +#include + +#if GTEST_HAS_PARAM_TEST + +namespace testing { + +// Functions producing parameter generators. +// +// Google Test uses these generators to produce parameters for value- +// parameterized tests. When a parameterized test case is instantiated +// with a particular generator, Google Test creates and runs tests +// for each element in the sequence produced by the generator. +// +// In the following sample, tests from test case FooTest are instantiated +// each three times with parameter values 3, 5, and 8: +// +// class FooTest : public TestWithParam { ... }; +// +// TEST_P(FooTest, TestThis) { +// } +// TEST_P(FooTest, TestThat) { +// } +// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8)); +// + +// Range() returns generators providing sequences of values in a range. +// +// Synopsis: +// Range(start, end) +// - returns a generator producing a sequence of values {start, start+1, +// start+2, ..., }. +// Range(start, end, step) +// - returns a generator producing a sequence of values {start, start+step, +// start+step+step, ..., }. +// Notes: +// * The generated sequences never include end. For example, Range(1, 5) +// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) +// returns a generator producing {1, 3, 5, 7}. +// * start and end must have the same type. That type may be any integral or +// floating-point type or a user defined type satisfying these conditions: +// * It must be assignable (have operator=() defined). +// * It must have operator+() (operator+(int-compatible type) for +// two-operand version). +// * It must have operator<() defined. +// Elements in the resulting sequences will also have that type. +// * Condition start < end must be satisfied in order for resulting sequences +// to contain any elements. +// +template +internal::ParamGenerator Range(T start, T end, IncrementT step) { + return internal::ParamGenerator( + new internal::RangeGenerator(start, end, step)); +} + +template +internal::ParamGenerator Range(T start, T end) { + return Range(start, end, 1); +} + +// ValuesIn() function allows generation of tests with parameters coming from +// a container. +// +// Synopsis: +// ValuesIn(const T (&array)[N]) +// - returns a generator producing sequences with elements from +// a C-style array. +// ValuesIn(const Container& container) +// - returns a generator producing sequences with elements from +// an STL-style container. +// ValuesIn(Iterator begin, Iterator end) +// - returns a generator producing sequences with elements from +// a range [begin, end) defined by a pair of STL-style iterators. These +// iterators can also be plain C pointers. +// +// Please note that ValuesIn copies the values from the containers +// passed in and keeps them to generate tests in RUN_ALL_TESTS(). +// +// Examples: +// +// This instantiates tests from test case StringTest +// each with C-string values of "foo", "bar", and "baz": +// +// const char* strings[] = {"foo", "bar", "baz"}; +// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings)); +// +// This instantiates tests from test case StlStringTest +// each with STL strings with values "a" and "b": +// +// ::std::vector< ::std::string> GetParameterStrings() { +// ::std::vector< ::std::string> v; +// v.push_back("a"); +// v.push_back("b"); +// return v; +// } +// +// INSTANTIATE_TEST_CASE_P(CharSequence, +// StlStringTest, +// ValuesIn(GetParameterStrings())); +// +// +// This will also instantiate tests from CharTest +// each with parameter values 'a' and 'b': +// +// ::std::list GetParameterChars() { +// ::std::list list; +// list.push_back('a'); +// list.push_back('b'); +// return list; +// } +// ::std::list l = GetParameterChars(); +// INSTANTIATE_TEST_CASE_P(CharSequence2, +// CharTest, +// ValuesIn(l.begin(), l.end())); +// +template +internal::ParamGenerator< + typename ::std::iterator_traits::value_type> ValuesIn( + ForwardIterator begin, + ForwardIterator end) { + typedef typename ::std::iterator_traits::value_type + ParamType; + return internal::ParamGenerator( + new internal::ValuesInIteratorRangeGenerator(begin, end)); +} + +template +internal::ParamGenerator ValuesIn(const T (&array)[N]) { + return ValuesIn(array, array + N); +} + +template +internal::ParamGenerator ValuesIn( + const Container& container) { + return ValuesIn(container.begin(), container.end()); +} + +// Values() allows generating tests from explicitly specified list of +// parameters. +// +// Synopsis: +// Values(T v1, T v2, ..., T vN) +// - returns a generator producing sequences with elements v1, v2, ..., vN. +// +// For example, this instantiates tests from test case BarTest each +// with values "one", "two", and "three": +// +// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three")); +// +// This instantiates tests from test case BazTest each with values 1, 2, 3.5. +// The exact type of values will depend on the type of parameter in BazTest. +// +// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); +// +// Currently, Values() supports from 1 to $n parameters. +// +$range i 1..n +$for i [[ +$range j 1..i + +template <$for j, [[typename T$j]]> +internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) { + return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]); +} + +]] + +// Bool() allows generating tests with parameters in a set of (false, true). +// +// Synopsis: +// Bool() +// - returns a generator producing sequences with elements {false, true}. +// +// It is useful when testing code that depends on Boolean flags. Combinations +// of multiple flags can be tested when several Bool()'s are combined using +// Combine() function. +// +// In the following example all tests in the test case FlagDependentTest +// will be instantiated twice with parameters false and true. +// +// class FlagDependentTest : public testing::TestWithParam { +// virtual void SetUp() { +// external_flag = GetParam(); +// } +// } +// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool()); +// +inline internal::ParamGenerator Bool() { + return Values(false, true); +} + +#if GTEST_HAS_COMBINE +// Combine() allows the user to combine two or more sequences to produce +// values of a Cartesian product of those sequences' elements. +// +// Synopsis: +// Combine(gen1, gen2, ..., genN) +// - returns a generator producing sequences with elements coming from +// the Cartesian product of elements from the sequences generated by +// gen1, gen2, ..., genN. The sequence elements will have a type of +// tuple where T1, T2, ..., TN are the types +// of elements from sequences produces by gen1, gen2, ..., genN. +// +// Combine can have up to $maxtuple arguments. This number is currently limited +// by the maximum number of elements in the tuple implementation used by Google +// Test. +// +// Example: +// +// This will instantiate tests in test case AnimalTest each one with +// the parameter values tuple("cat", BLACK), tuple("cat", WHITE), +// tuple("dog", BLACK), and tuple("dog", WHITE): +// +// enum Color { BLACK, GRAY, WHITE }; +// class AnimalTest +// : public testing::TestWithParam > {...}; +// +// TEST_P(AnimalTest, AnimalLooksNice) {...} +// +// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest, +// Combine(Values("cat", "dog"), +// Values(BLACK, WHITE))); +// +// This will instantiate tests in FlagDependentTest with all variations of two +// Boolean flags: +// +// class FlagDependentTest +// : public testing::TestWithParam > { +// virtual void SetUp() { +// // Assigns external_flag_1 and external_flag_2 values from the tuple. +// tie(external_flag_1, external_flag_2) = GetParam(); +// } +// }; +// +// TEST_P(FlagDependentTest, TestFeature1) { +// // Test your code using external_flag_1 and external_flag_2 here. +// } +// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest, +// Combine(Bool(), Bool())); +// +$range i 2..maxtuple +$for i [[ +$range j 1..i + +template <$for j, [[typename Generator$j]]> +internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine( + $for j, [[const Generator$j& g$j]]) { + return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>( + $for j, [[g$j]]); +} + +]] +#endif // GTEST_HAS_COMBINE + + + +#define TEST_P(test_case_name, test_name) \ + class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ + : public test_case_name { \ + public: \ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ + virtual void TestBody(); \ + private: \ + static int AddToRegistry() { \ + ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ + GetTestCasePatternHolder(\ + #test_case_name, __FILE__, __LINE__)->AddTestPattern(\ + #test_case_name, \ + #test_name, \ + new ::testing::internal::TestMetaFactory< \ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \ + return 0; \ + } \ + static int gtest_registering_dummy_; \ + GTEST_DISALLOW_COPY_AND_ASSIGN_(\ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ + }; \ + int GTEST_TEST_CLASS_NAME_(test_case_name, \ + test_name)::gtest_registering_dummy_ = \ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ + void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() + +#define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \ + ::testing::internal::ParamGenerator \ + gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \ + int gtest_##prefix##test_case_name##_dummy_ = \ + ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ + GetTestCasePatternHolder(\ + #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\ + #prefix, \ + >est_##prefix##test_case_name##_EvalGenerator_, \ + __FILE__, __LINE__) + +} // namespace testing + +#endif // GTEST_HAS_PARAM_TEST + +#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h new file mode 100644 index 000000000..c41da4844 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h @@ -0,0 +1,232 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Utilities for testing Google Test itself and code that uses Google Test +// (e.g. frameworks built on top of Google Test). + +#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ +#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ + +#include + +namespace testing { + +// This helper class can be used to mock out Google Test failure reporting +// so that we can test Google Test or code that builds on Google Test. +// +// An object of this class appends a TestPartResult object to the +// TestPartResultArray object given in the constructor whenever a Google Test +// failure is reported. It can either intercept only failures that are +// generated in the same thread that created this object or it can intercept +// all generated failures. The scope of this mock object can be controlled with +// the second argument to the two arguments constructor. +class GTEST_API_ ScopedFakeTestPartResultReporter + : public TestPartResultReporterInterface { + public: + // The two possible mocking modes of this object. + enum InterceptMode { + INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. + INTERCEPT_ALL_THREADS // Intercepts all failures. + }; + + // The c'tor sets this object as the test part result reporter used + // by Google Test. The 'result' parameter specifies where to report the + // results. This reporter will only catch failures generated in the current + // thread. DEPRECATED + explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); + + // Same as above, but you can choose the interception scope of this object. + ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, + TestPartResultArray* result); + + // The d'tor restores the previous test part result reporter. + virtual ~ScopedFakeTestPartResultReporter(); + + // Appends the TestPartResult object to the TestPartResultArray + // received in the constructor. + // + // This method is from the TestPartResultReporterInterface + // interface. + virtual void ReportTestPartResult(const TestPartResult& result); + private: + void Init(); + + const InterceptMode intercept_mode_; + TestPartResultReporterInterface* old_reporter_; + TestPartResultArray* const result_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); +}; + +namespace internal { + +// A helper class for implementing EXPECT_FATAL_FAILURE() and +// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given +// TestPartResultArray contains exactly one failure that has the given +// type and contains the given substring. If that's not the case, a +// non-fatal failure will be generated. +class GTEST_API_ SingleFailureChecker { + public: + // The constructor remembers the arguments. + SingleFailureChecker(const TestPartResultArray* results, + TestPartResult::Type type, + const char* substr); + ~SingleFailureChecker(); + private: + const TestPartResultArray* const results_; + const TestPartResult::Type type_; + const String substr_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); +}; + +} // namespace internal + +} // namespace testing + +// A set of macros for testing Google Test assertions or code that's expected +// to generate Google Test fatal failures. It verifies that the given +// statement will cause exactly one fatal Google Test failure with 'substr' +// being part of the failure message. +// +// There are two different versions of this macro. EXPECT_FATAL_FAILURE only +// affects and considers failures generated in the current thread and +// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. +// +// The verification of the assertion is done correctly even when the statement +// throws an exception or aborts the current function. +// +// Known restrictions: +// - 'statement' cannot reference local non-static variables or +// non-static members of the current object. +// - 'statement' cannot return a value. +// - You cannot stream a failure message to this macro. +// +// Note that even though the implementations of the following two +// macros are much alike, we cannot refactor them to use a common +// helper macro, due to some peculiarity in how the preprocessor +// works. The AcceptsMacroThatExpandsToUnprotectedComma test in +// gtest_unittest.cc will fail to compile if we do that. +#define EXPECT_FATAL_FAILURE(statement, substr) \ + do { \ + class GTestExpectFatalFailureHelper {\ + public:\ + static void Execute() { statement; }\ + };\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter:: \ + INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ + GTestExpectFatalFailureHelper::Execute();\ + }\ + } while (::testing::internal::AlwaysFalse()) + +#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ + do { \ + class GTestExpectFatalFailureHelper {\ + public:\ + static void Execute() { statement; }\ + };\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter:: \ + INTERCEPT_ALL_THREADS, >est_failures);\ + GTestExpectFatalFailureHelper::Execute();\ + }\ + } while (::testing::internal::AlwaysFalse()) + +// A macro for testing Google Test assertions or code that's expected to +// generate Google Test non-fatal failures. It asserts that the given +// statement will cause exactly one non-fatal Google Test failure with 'substr' +// being part of the failure message. +// +// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only +// affects and considers failures generated in the current thread and +// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. +// +// 'statement' is allowed to reference local variables and members of +// the current object. +// +// The verification of the assertion is done correctly even when the statement +// throws an exception or aborts the current function. +// +// Known restrictions: +// - You cannot stream a failure message to this macro. +// +// Note that even though the implementations of the following two +// macros are much alike, we cannot refactor them to use a common +// helper macro, due to some peculiarity in how the preprocessor +// works. If we do that, the code won't compile when the user gives +// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that +// expands to code containing an unprotected comma. The +// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc +// catches that. +// +// For the same reason, we have to write +// if (::testing::internal::AlwaysTrue()) { statement; } +// instead of +// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) +// to avoid an MSVC warning on unreachable code. +#define EXPECT_NONFATAL_FAILURE(statement, substr) \ + do {\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ + (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter:: \ + INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ + if (::testing::internal::AlwaysTrue()) { statement; }\ + }\ + } while (::testing::internal::AlwaysFalse()) + +#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ + do {\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ + (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS,\ + >est_failures);\ + if (::testing::internal::AlwaysTrue()) { statement; }\ + }\ + } while (::testing::internal::AlwaysFalse()) + +#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h new file mode 100644 index 000000000..f71475906 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h @@ -0,0 +1,176 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: mheule@google.com (Markus Heule) +// + +#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ +#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ + +#include +#include +#include +#include + +namespace testing { + +// A copyable object representing the result of a test part (i.e. an +// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). +// +// Don't inherit from TestPartResult as its destructor is not virtual. +class GTEST_API_ TestPartResult { + public: + // The possible outcomes of a test part (i.e. an assertion or an + // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). + enum Type { + kSuccess, // Succeeded. + kNonFatalFailure, // Failed but the test can continue. + kFatalFailure // Failed and the test should be terminated. + }; + + // C'tor. TestPartResult does NOT have a default constructor. + // Always use this constructor (with parameters) to create a + // TestPartResult object. + TestPartResult(Type a_type, + const char* a_file_name, + int a_line_number, + const char* a_message) + : type_(a_type), + file_name_(a_file_name), + line_number_(a_line_number), + summary_(ExtractSummary(a_message)), + message_(a_message) { + } + + // Gets the outcome of the test part. + Type type() const { return type_; } + + // Gets the name of the source file where the test part took place, or + // NULL if it's unknown. + const char* file_name() const { return file_name_.c_str(); } + + // Gets the line in the source file where the test part took place, + // or -1 if it's unknown. + int line_number() const { return line_number_; } + + // Gets the summary of the failure message. + const char* summary() const { return summary_.c_str(); } + + // Gets the message associated with the test part. + const char* message() const { return message_.c_str(); } + + // Returns true iff the test part passed. + bool passed() const { return type_ == kSuccess; } + + // Returns true iff the test part failed. + bool failed() const { return type_ != kSuccess; } + + // Returns true iff the test part non-fatally failed. + bool nonfatally_failed() const { return type_ == kNonFatalFailure; } + + // Returns true iff the test part fatally failed. + bool fatally_failed() const { return type_ == kFatalFailure; } + private: + Type type_; + + // Gets the summary of the failure message by omitting the stack + // trace in it. + static internal::String ExtractSummary(const char* message); + + // The name of the source file where the test part took place, or + // NULL if the source file is unknown. + internal::String file_name_; + // The line in the source file where the test part took place, or -1 + // if the line number is unknown. + int line_number_; + internal::String summary_; // The test failure summary. + internal::String message_; // The test failure message. +}; + +// Prints a TestPartResult object. +std::ostream& operator<<(std::ostream& os, const TestPartResult& result); + +// An array of TestPartResult objects. +// +// Don't inherit from TestPartResultArray as its destructor is not +// virtual. +class GTEST_API_ TestPartResultArray { + public: + TestPartResultArray() {} + + // Appends the given TestPartResult to the array. + void Append(const TestPartResult& result); + + // Returns the TestPartResult at the given index (0-based). + const TestPartResult& GetTestPartResult(int index) const; + + // Returns the number of TestPartResult objects in the array. + int size() const; + + private: + std::vector array_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); +}; + +// This interface knows how to report a test part result. +class TestPartResultReporterInterface { + public: + virtual ~TestPartResultReporterInterface() {} + + virtual void ReportTestPartResult(const TestPartResult& result) = 0; +}; + +namespace internal { + +// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a +// statement generates new fatal failures. To do so it registers itself as the +// current test part result reporter. Besides checking if fatal failures were +// reported, it only delegates the reporting to the former result reporter. +// The original result reporter is restored in the destructor. +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +class GTEST_API_ HasNewFatalFailureHelper + : public TestPartResultReporterInterface { + public: + HasNewFatalFailureHelper(); + virtual ~HasNewFatalFailureHelper(); + virtual void ReportTestPartResult(const TestPartResult& result); + bool has_new_fatal_failure() const { return has_new_fatal_failure_; } + private: + bool has_new_fatal_failure_; + TestPartResultReporterInterface* original_reporter_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); +}; + +} // namespace internal + +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h new file mode 100644 index 000000000..1ec8eb8d3 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h @@ -0,0 +1,259 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ + +// This header implements typed tests and type-parameterized tests. + +// Typed (aka type-driven) tests repeat the same test for types in a +// list. You must know which types you want to test with when writing +// typed tests. Here's how you do it: + +#if 0 + +// First, define a fixture class template. It should be parameterized +// by a type. Remember to derive it from testing::Test. +template +class FooTest : public testing::Test { + public: + ... + typedef std::list List; + static T shared_; + T value_; +}; + +// Next, associate a list of types with the test case, which will be +// repeated for each type in the list. The typedef is necessary for +// the macro to parse correctly. +typedef testing::Types MyTypes; +TYPED_TEST_CASE(FooTest, MyTypes); + +// If the type list contains only one type, you can write that type +// directly without Types<...>: +// TYPED_TEST_CASE(FooTest, int); + +// Then, use TYPED_TEST() instead of TEST_F() to define as many typed +// tests for this test case as you want. +TYPED_TEST(FooTest, DoesBlah) { + // Inside a test, refer to TypeParam to get the type parameter. + // Since we are inside a derived class template, C++ requires use to + // visit the members of FooTest via 'this'. + TypeParam n = this->value_; + + // To visit static members of the fixture, add the TestFixture:: + // prefix. + n += TestFixture::shared_; + + // To refer to typedefs in the fixture, add the "typename + // TestFixture::" prefix. + typename TestFixture::List values; + values.push_back(n); + ... +} + +TYPED_TEST(FooTest, HasPropertyA) { ... } + +#endif // 0 + +// Type-parameterized tests are abstract test patterns parameterized +// by a type. Compared with typed tests, type-parameterized tests +// allow you to define the test pattern without knowing what the type +// parameters are. The defined pattern can be instantiated with +// different types any number of times, in any number of translation +// units. +// +// If you are designing an interface or concept, you can define a +// suite of type-parameterized tests to verify properties that any +// valid implementation of the interface/concept should have. Then, +// each implementation can easily instantiate the test suite to verify +// that it conforms to the requirements, without having to write +// similar tests repeatedly. Here's an example: + +#if 0 + +// First, define a fixture class template. It should be parameterized +// by a type. Remember to derive it from testing::Test. +template +class FooTest : public testing::Test { + ... +}; + +// Next, declare that you will define a type-parameterized test case +// (the _P suffix is for "parameterized" or "pattern", whichever you +// prefer): +TYPED_TEST_CASE_P(FooTest); + +// Then, use TYPED_TEST_P() to define as many type-parameterized tests +// for this type-parameterized test case as you want. +TYPED_TEST_P(FooTest, DoesBlah) { + // Inside a test, refer to TypeParam to get the type parameter. + TypeParam n = 0; + ... +} + +TYPED_TEST_P(FooTest, HasPropertyA) { ... } + +// Now the tricky part: you need to register all test patterns before +// you can instantiate them. The first argument of the macro is the +// test case name; the rest are the names of the tests in this test +// case. +REGISTER_TYPED_TEST_CASE_P(FooTest, + DoesBlah, HasPropertyA); + +// Finally, you are free to instantiate the pattern with the types you +// want. If you put the above code in a header file, you can #include +// it in multiple C++ source files and instantiate it multiple times. +// +// To distinguish different instances of the pattern, the first +// argument to the INSTANTIATE_* macro is a prefix that will be added +// to the actual test case name. Remember to pick unique prefixes for +// different instances. +typedef testing::Types MyTypes; +INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes); + +// If the type list contains only one type, you can write that type +// directly without Types<...>: +// INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int); + +#endif // 0 + +#include +#include + +// Implements typed tests. + +#if GTEST_HAS_TYPED_TEST + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Expands to the name of the typedef for the type parameters of the +// given test case. +#define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_ + +// The 'Types' template argument below must have spaces around it +// since some compilers may choke on '>>' when passing a template +// instance (e.g. Types) +#define TYPED_TEST_CASE(CaseName, Types) \ + typedef ::testing::internal::TypeList< Types >::type \ + GTEST_TYPE_PARAMS_(CaseName) + +#define TYPED_TEST(CaseName, TestName) \ + template \ + class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ + : public CaseName { \ + private: \ + typedef CaseName TestFixture; \ + typedef gtest_TypeParam_ TypeParam; \ + virtual void TestBody(); \ + }; \ + bool gtest_##CaseName##_##TestName##_registered_ = \ + ::testing::internal::TypeParameterizedTest< \ + CaseName, \ + ::testing::internal::TemplateSel< \ + GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \ + GTEST_TYPE_PARAMS_(CaseName)>::Register(\ + "", #CaseName, #TestName, 0); \ + template \ + void GTEST_TEST_CLASS_NAME_(CaseName, TestName)::TestBody() + +#endif // GTEST_HAS_TYPED_TEST + +// Implements type-parameterized tests. + +#if GTEST_HAS_TYPED_TEST_P + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Expands to the namespace name that the type-parameterized tests for +// the given type-parameterized test case are defined in. The exact +// name of the namespace is subject to change without notice. +#define GTEST_CASE_NAMESPACE_(TestCaseName) \ + gtest_case_##TestCaseName##_ + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Expands to the name of the variable used to remember the names of +// the defined tests in the given test case. +#define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \ + gtest_typed_test_case_p_state_##TestCaseName##_ + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY. +// +// Expands to the name of the variable used to remember the names of +// the registered tests in the given test case. +#define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \ + gtest_registered_test_names_##TestCaseName##_ + +// The variables defined in the type-parameterized test macros are +// static as typically these macros are used in a .h file that can be +// #included in multiple translation units linked together. +#define TYPED_TEST_CASE_P(CaseName) \ + static ::testing::internal::TypedTestCasePState \ + GTEST_TYPED_TEST_CASE_P_STATE_(CaseName) + +#define TYPED_TEST_P(CaseName, TestName) \ + namespace GTEST_CASE_NAMESPACE_(CaseName) { \ + template \ + class TestName : public CaseName { \ + private: \ + typedef CaseName TestFixture; \ + typedef gtest_TypeParam_ TypeParam; \ + virtual void TestBody(); \ + }; \ + static bool gtest_##TestName##_defined_ = \ + GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\ + __FILE__, __LINE__, #CaseName, #TestName); \ + } \ + template \ + void GTEST_CASE_NAMESPACE_(CaseName)::TestName::TestBody() + +#define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \ + namespace GTEST_CASE_NAMESPACE_(CaseName) { \ + typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ + } \ + static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \ + GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\ + __FILE__, __LINE__, #__VA_ARGS__) + +// The 'Types' template argument below must have spaces around it +// since some compilers may choke on '>>' when passing a template +// instance (e.g. Types) +#define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \ + bool gtest_##Prefix##_##CaseName = \ + ::testing::internal::TypeParameterizedTestCase::type>::Register(\ + #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName)) + +#endif // GTEST_HAS_TYPED_TEST_P + +#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h new file mode 100644 index 000000000..921fad11f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h @@ -0,0 +1,2052 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// The Google C++ Testing Framework (Google Test) +// +// This header file defines the public API for Google Test. It should be +// included by any test program that uses Google Test. +// +// IMPORTANT NOTE: Due to limitation of the C++ language, we have to +// leave some internal implementation details in this header file. +// They are clearly marked by comments like this: +// +// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +// +// Such code is NOT meant to be used by a user directly, and is subject +// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user +// program! +// +// Acknowledgment: Google Test borrowed the idea of automatic test +// registration from Barthelemy Dagenais' (barthelemy@prologique.com) +// easyUnit framework. + +#ifndef GTEST_INCLUDE_GTEST_GTEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_H_ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +// Depending on the platform, different string classes are available. +// On Linux, in addition to ::std::string, Google also makes use of +// class ::string, which has the same interface as ::std::string, but +// has a different implementation. +// +// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that +// ::string is available AND is a distinct type to ::std::string, or +// define it to 0 to indicate otherwise. +// +// If the user's ::std::string and ::string are the same class due to +// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0. +// +// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined +// heuristically. + +namespace testing { + +// Declares the flags. + +// This flag temporary enables the disabled tests. +GTEST_DECLARE_bool_(also_run_disabled_tests); + +// This flag brings the debugger on an assertion failure. +GTEST_DECLARE_bool_(break_on_failure); + +// This flag controls whether Google Test catches all test-thrown exceptions +// and logs them as failures. +GTEST_DECLARE_bool_(catch_exceptions); + +// This flag enables using colors in terminal output. Available values are +// "yes" to enable colors, "no" (disable colors), or "auto" (the default) +// to let Google Test decide. +GTEST_DECLARE_string_(color); + +// This flag sets up the filter to select by name using a glob pattern +// the tests to run. If the filter is not given all tests are executed. +GTEST_DECLARE_string_(filter); + +// This flag causes the Google Test to list tests. None of the tests listed +// are actually run if the flag is provided. +GTEST_DECLARE_bool_(list_tests); + +// This flag controls whether Google Test emits a detailed XML report to a file +// in addition to its normal textual output. +GTEST_DECLARE_string_(output); + +// This flags control whether Google Test prints the elapsed time for each +// test. +GTEST_DECLARE_bool_(print_time); + +// This flag specifies the random number seed. +GTEST_DECLARE_int32_(random_seed); + +// This flag sets how many times the tests are repeated. The default value +// is 1. If the value is -1 the tests are repeating forever. +GTEST_DECLARE_int32_(repeat); + +// This flag controls whether Google Test includes Google Test internal +// stack frames in failure stack traces. +GTEST_DECLARE_bool_(show_internal_stack_frames); + +// When this flag is specified, tests' order is randomized on every iteration. +GTEST_DECLARE_bool_(shuffle); + +// This flag specifies the maximum number of stack frames to be +// printed in a failure message. +GTEST_DECLARE_int32_(stack_trace_depth); + +// When this flag is specified, a failed assertion will throw an +// exception if exceptions are enabled, or exit the program with a +// non-zero code otherwise. +GTEST_DECLARE_bool_(throw_on_failure); + +// The upper limit for valid stack trace depths. +const int kMaxStackTraceDepth = 100; + +namespace internal { + +class AssertHelper; +class DefaultGlobalTestPartResultReporter; +class ExecDeathTest; +class NoExecDeathTest; +class FinalSuccessChecker; +class GTestFlagSaver; +class TestInfoImpl; +class TestResultAccessor; +class TestEventListenersAccessor; +class TestEventRepeater; +class WindowsDeathTest; +class UnitTestImpl* GetUnitTestImpl(); +void ReportFailureInUnknownLocation(TestPartResult::Type result_type, + const String& message); +class PrettyUnitTestResultPrinter; +class XmlUnitTestResultPrinter; + +// Converts a streamable value to a String. A NULL pointer is +// converted to "(null)". When the input value is a ::string, +// ::std::string, ::wstring, or ::std::wstring object, each NUL +// character in it is replaced with "\\0". +// Declared in gtest-internal.h but defined here, so that it has access +// to the definition of the Message class, required by the ARM +// compiler. +template +String StreamableToString(const T& streamable) { + return (Message() << streamable).GetString(); +} + +} // namespace internal + +// A class for indicating whether an assertion was successful. When +// the assertion wasn't successful, the AssertionResult object +// remembers a non-empty message that describes how it failed. +// +// To create an instance of this class, use one of the factory functions +// (AssertionSuccess() and AssertionFailure()). +// +// This class is useful for two purposes: +// 1. Defining predicate functions to be used with Boolean test assertions +// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts +// 2. Defining predicate-format functions to be +// used with predicate assertions (ASSERT_PRED_FORMAT*, etc). +// +// For example, if you define IsEven predicate: +// +// testing::AssertionResult IsEven(int n) { +// if ((n % 2) == 0) +// return testing::AssertionSuccess(); +// else +// return testing::AssertionFailure() << n << " is odd"; +// } +// +// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5))) +// will print the message +// +// Value of: IsEven(Fib(5)) +// Actual: false (5 is odd) +// Expected: true +// +// instead of a more opaque +// +// Value of: IsEven(Fib(5)) +// Actual: false +// Expected: true +// +// in case IsEven is a simple Boolean predicate. +// +// If you expect your predicate to be reused and want to support informative +// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up +// about half as often as positive ones in our tests), supply messages for +// both success and failure cases: +// +// testing::AssertionResult IsEven(int n) { +// if ((n % 2) == 0) +// return testing::AssertionSuccess() << n << " is even"; +// else +// return testing::AssertionFailure() << n << " is odd"; +// } +// +// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print +// +// Value of: IsEven(Fib(6)) +// Actual: true (8 is even) +// Expected: false +// +// NB: Predicates that support negative Boolean assertions have reduced +// performance in positive ones so be careful not to use them in tests +// that have lots (tens of thousands) of positive Boolean assertions. +// +// To use this class with EXPECT_PRED_FORMAT assertions such as: +// +// // Verifies that Foo() returns an even number. +// EXPECT_PRED_FORMAT1(IsEven, Foo()); +// +// you need to define: +// +// testing::AssertionResult IsEven(const char* expr, int n) { +// if ((n % 2) == 0) +// return testing::AssertionSuccess(); +// else +// return testing::AssertionFailure() +// << "Expected: " << expr << " is even\n Actual: it's " << n; +// } +// +// If Foo() returns 5, you will see the following message: +// +// Expected: Foo() is even +// Actual: it's 5 +// +class GTEST_API_ AssertionResult { + public: + // Copy constructor. + // Used in EXPECT_TRUE/FALSE(assertion_result). + AssertionResult(const AssertionResult& other); + // Used in the EXPECT_TRUE/FALSE(bool_expression). + explicit AssertionResult(bool success) : success_(success) {} + + // Returns true iff the assertion succeeded. + operator bool() const { return success_; } // NOLINT + + // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. + AssertionResult operator!() const; + + // Returns the text streamed into this AssertionResult. Test assertions + // use it when they fail (i.e., the predicate's outcome doesn't match the + // assertion's expectation). When nothing has been streamed into the + // object, returns an empty string. + const char* message() const { + return message_.get() != NULL && message_->c_str() != NULL ? + message_->c_str() : ""; + } + // TODO(vladl@google.com): Remove this after making sure no clients use it. + // Deprecated; please use message() instead. + const char* failure_message() const { return message(); } + + // Streams a custom failure message into this object. + template AssertionResult& operator<<(const T& value); + + private: + // No implementation - we want AssertionResult to be + // copy-constructible but not assignable. + void operator=(const AssertionResult& other); + + // Stores result of the assertion predicate. + bool success_; + // Stores the message describing the condition in case the expectation + // construct is not satisfied with the predicate's outcome. + // Referenced via a pointer to avoid taking too much stack frame space + // with test assertions. + internal::scoped_ptr message_; +}; // class AssertionResult + +// Streams a custom failure message into this object. +template +AssertionResult& AssertionResult::operator<<(const T& value) { + Message msg; + if (message_.get() != NULL) + msg << *message_; + msg << value; + message_.reset(new internal::String(msg.GetString())); + return *this; +} + +// Makes a successful assertion result. +GTEST_API_ AssertionResult AssertionSuccess(); + +// Makes a failed assertion result. +GTEST_API_ AssertionResult AssertionFailure(); + +// Makes a failed assertion result with the given failure message. +// Deprecated; use AssertionFailure() << msg. +GTEST_API_ AssertionResult AssertionFailure(const Message& msg); + +// The abstract class that all tests inherit from. +// +// In Google Test, a unit test program contains one or many TestCases, and +// each TestCase contains one or many Tests. +// +// When you define a test using the TEST macro, you don't need to +// explicitly derive from Test - the TEST macro automatically does +// this for you. +// +// The only time you derive from Test is when defining a test fixture +// to be used a TEST_F. For example: +// +// class FooTest : public testing::Test { +// protected: +// virtual void SetUp() { ... } +// virtual void TearDown() { ... } +// ... +// }; +// +// TEST_F(FooTest, Bar) { ... } +// TEST_F(FooTest, Baz) { ... } +// +// Test is not copyable. +class GTEST_API_ Test { + public: + friend class internal::TestInfoImpl; + + // Defines types for pointers to functions that set up and tear down + // a test case. + typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc; + typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc; + + // The d'tor is virtual as we intend to inherit from Test. + virtual ~Test(); + + // Sets up the stuff shared by all tests in this test case. + // + // Google Test will call Foo::SetUpTestCase() before running the first + // test in test case Foo. Hence a sub-class can define its own + // SetUpTestCase() method to shadow the one defined in the super + // class. + static void SetUpTestCase() {} + + // Tears down the stuff shared by all tests in this test case. + // + // Google Test will call Foo::TearDownTestCase() after running the last + // test in test case Foo. Hence a sub-class can define its own + // TearDownTestCase() method to shadow the one defined in the super + // class. + static void TearDownTestCase() {} + + // Returns true iff the current test has a fatal failure. + static bool HasFatalFailure(); + + // Returns true iff the current test has a non-fatal failure. + static bool HasNonfatalFailure(); + + // Returns true iff the current test has a (either fatal or + // non-fatal) failure. + static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); } + + // Logs a property for the current test. Only the last value for a given + // key is remembered. + // These are public static so they can be called from utility functions + // that are not members of the test fixture. + // The arguments are const char* instead strings, as Google Test is used + // on platforms where string doesn't compile. + // + // Note that a driving consideration for these RecordProperty methods + // was to produce xml output suited to the Greenspan charting utility, + // which at present will only chart values that fit in a 32-bit int. It + // is the user's responsibility to restrict their values to 32-bit ints + // if they intend them to be used with Greenspan. + static void RecordProperty(const char* key, const char* value); + static void RecordProperty(const char* key, int value); + + protected: + // Creates a Test object. + Test(); + + // Sets up the test fixture. + virtual void SetUp(); + + // Tears down the test fixture. + virtual void TearDown(); + + private: + // Returns true iff the current test has the same fixture class as + // the first test in the current test case. + static bool HasSameFixtureClass(); + + // Runs the test after the test fixture has been set up. + // + // A sub-class must implement this to define the test logic. + // + // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM. + // Instead, use the TEST or TEST_F macro. + virtual void TestBody() = 0; + + // Sets up, executes, and tears down the test. + void Run(); + + // Uses a GTestFlagSaver to save and restore all Google Test flags. + const internal::GTestFlagSaver* const gtest_flag_saver_; + + // Often a user mis-spells SetUp() as Setup() and spends a long time + // wondering why it is never called by Google Test. The declaration of + // the following method is solely for catching such an error at + // compile time: + // + // - The return type is deliberately chosen to be not void, so it + // will be a conflict if a user declares void Setup() in his test + // fixture. + // + // - This method is private, so it will be another compiler error + // if a user calls it from his test fixture. + // + // DO NOT OVERRIDE THIS FUNCTION. + // + // If you see an error about overriding the following function or + // about it being private, you have mis-spelled SetUp() as Setup(). + struct Setup_should_be_spelled_SetUp {}; + virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } + + // We disallow copying Tests. + GTEST_DISALLOW_COPY_AND_ASSIGN_(Test); +}; + +typedef internal::TimeInMillis TimeInMillis; + +// A copyable object representing a user specified test property which can be +// output as a key/value string pair. +// +// Don't inherit from TestProperty as its destructor is not virtual. +class TestProperty { + public: + // C'tor. TestProperty does NOT have a default constructor. + // Always use this constructor (with parameters) to create a + // TestProperty object. + TestProperty(const char* a_key, const char* a_value) : + key_(a_key), value_(a_value) { + } + + // Gets the user supplied key. + const char* key() const { + return key_.c_str(); + } + + // Gets the user supplied value. + const char* value() const { + return value_.c_str(); + } + + // Sets a new value, overriding the one supplied in the constructor. + void SetValue(const char* new_value) { + value_ = new_value; + } + + private: + // The key supplied by the user. + internal::String key_; + // The value supplied by the user. + internal::String value_; +}; + +// The result of a single Test. This includes a list of +// TestPartResults, a list of TestProperties, a count of how many +// death tests there are in the Test, and how much time it took to run +// the Test. +// +// TestResult is not copyable. +class GTEST_API_ TestResult { + public: + // Creates an empty TestResult. + TestResult(); + + // D'tor. Do not inherit from TestResult. + ~TestResult(); + + // Gets the number of all test parts. This is the sum of the number + // of successful test parts and the number of failed test parts. + int total_part_count() const; + + // Returns the number of the test properties. + int test_property_count() const; + + // Returns true iff the test passed (i.e. no test part failed). + bool Passed() const { return !Failed(); } + + // Returns true iff the test failed. + bool Failed() const; + + // Returns true iff the test fatally failed. + bool HasFatalFailure() const; + + // Returns true iff the test has a non-fatal failure. + bool HasNonfatalFailure() const; + + // Returns the elapsed time, in milliseconds. + TimeInMillis elapsed_time() const { return elapsed_time_; } + + // Returns the i-th test part result among all the results. i can range + // from 0 to test_property_count() - 1. If i is not in that range, aborts + // the program. + const TestPartResult& GetTestPartResult(int i) const; + + // Returns the i-th test property. i can range from 0 to + // test_property_count() - 1. If i is not in that range, aborts the + // program. + const TestProperty& GetTestProperty(int i) const; + + private: + friend class TestInfo; + friend class UnitTest; + friend class internal::DefaultGlobalTestPartResultReporter; + friend class internal::ExecDeathTest; + friend class internal::TestInfoImpl; + friend class internal::TestResultAccessor; + friend class internal::UnitTestImpl; + friend class internal::WindowsDeathTest; + + // Gets the vector of TestPartResults. + const std::vector& test_part_results() const { + return test_part_results_; + } + + // Gets the vector of TestProperties. + const std::vector& test_properties() const { + return test_properties_; + } + + // Sets the elapsed time. + void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } + + // Adds a test property to the list. The property is validated and may add + // a non-fatal failure if invalid (e.g., if it conflicts with reserved + // key names). If a property is already recorded for the same key, the + // value will be updated, rather than storing multiple values for the same + // key. + void RecordProperty(const TestProperty& test_property); + + // Adds a failure if the key is a reserved attribute of Google Test + // testcase tags. Returns true if the property is valid. + // TODO(russr): Validate attribute names are legal and human readable. + static bool ValidateTestProperty(const TestProperty& test_property); + + // Adds a test part result to the list. + void AddTestPartResult(const TestPartResult& test_part_result); + + // Returns the death test count. + int death_test_count() const { return death_test_count_; } + + // Increments the death test count, returning the new count. + int increment_death_test_count() { return ++death_test_count_; } + + // Clears the test part results. + void ClearTestPartResults(); + + // Clears the object. + void Clear(); + + // Protects mutable state of the property vector and of owned + // properties, whose values may be updated. + internal::Mutex test_properites_mutex_; + + // The vector of TestPartResults + std::vector test_part_results_; + // The vector of TestProperties + std::vector test_properties_; + // Running count of death tests. + int death_test_count_; + // The elapsed time, in milliseconds. + TimeInMillis elapsed_time_; + + // We disallow copying TestResult. + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult); +}; // class TestResult + +// A TestInfo object stores the following information about a test: +// +// Test case name +// Test name +// Whether the test should be run +// A function pointer that creates the test object when invoked +// Test result +// +// The constructor of TestInfo registers itself with the UnitTest +// singleton such that the RUN_ALL_TESTS() macro knows which tests to +// run. +class GTEST_API_ TestInfo { + public: + // Destructs a TestInfo object. This function is not virtual, so + // don't inherit from TestInfo. + ~TestInfo(); + + // Returns the test case name. + const char* test_case_name() const; + + // Returns the test name. + const char* name() const; + + // Returns the test case comment. + const char* test_case_comment() const; + + // Returns the test comment. + const char* comment() const; + + // Returns true if this test should run, that is if the test is not disabled + // (or it is disabled but the also_run_disabled_tests flag has been specified) + // and its full name matches the user-specified filter. + // + // Google Test allows the user to filter the tests by their full names. + // The full name of a test Bar in test case Foo is defined as + // "Foo.Bar". Only the tests that match the filter will run. + // + // A filter is a colon-separated list of glob (not regex) patterns, + // optionally followed by a '-' and a colon-separated list of + // negative patterns (tests to exclude). A test is run if it + // matches one of the positive patterns and does not match any of + // the negative patterns. + // + // For example, *A*:Foo.* is a filter that matches any string that + // contains the character 'A' or starts with "Foo.". + bool should_run() const; + + // Returns the result of the test. + const TestResult* result() const; + + private: +#if GTEST_HAS_DEATH_TEST + friend class internal::DefaultDeathTestFactory; +#endif // GTEST_HAS_DEATH_TEST + friend class Test; + friend class TestCase; + friend class internal::TestInfoImpl; + friend class internal::UnitTestImpl; + friend TestInfo* internal::MakeAndRegisterTestInfo( + const char* test_case_name, const char* name, + const char* test_case_comment, const char* comment, + internal::TypeId fixture_class_id, + Test::SetUpTestCaseFunc set_up_tc, + Test::TearDownTestCaseFunc tear_down_tc, + internal::TestFactoryBase* factory); + + // Returns true if this test matches the user-specified filter. + bool matches_filter() const; + + // Increments the number of death tests encountered in this test so + // far. + int increment_death_test_count(); + + // Accessors for the implementation object. + internal::TestInfoImpl* impl() { return impl_; } + const internal::TestInfoImpl* impl() const { return impl_; } + + // Constructs a TestInfo object. The newly constructed instance assumes + // ownership of the factory object. + TestInfo(const char* test_case_name, const char* name, + const char* test_case_comment, const char* comment, + internal::TypeId fixture_class_id, + internal::TestFactoryBase* factory); + + // An opaque implementation object. + internal::TestInfoImpl* impl_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo); +}; + +// A test case, which consists of a vector of TestInfos. +// +// TestCase is not copyable. +class GTEST_API_ TestCase { + public: + // Creates a TestCase with the given name. + // + // TestCase does NOT have a default constructor. Always use this + // constructor to create a TestCase object. + // + // Arguments: + // + // name: name of the test case + // set_up_tc: pointer to the function that sets up the test case + // tear_down_tc: pointer to the function that tears down the test case + TestCase(const char* name, const char* comment, + Test::SetUpTestCaseFunc set_up_tc, + Test::TearDownTestCaseFunc tear_down_tc); + + // Destructor of TestCase. + virtual ~TestCase(); + + // Gets the name of the TestCase. + const char* name() const { return name_.c_str(); } + + // Returns the test case comment. + const char* comment() const { return comment_.c_str(); } + + // Returns true if any test in this test case should run. + bool should_run() const { return should_run_; } + + // Gets the number of successful tests in this test case. + int successful_test_count() const; + + // Gets the number of failed tests in this test case. + int failed_test_count() const; + + // Gets the number of disabled tests in this test case. + int disabled_test_count() const; + + // Get the number of tests in this test case that should run. + int test_to_run_count() const; + + // Gets the number of all tests in this test case. + int total_test_count() const; + + // Returns true iff the test case passed. + bool Passed() const { return !Failed(); } + + // Returns true iff the test case failed. + bool Failed() const { return failed_test_count() > 0; } + + // Returns the elapsed time, in milliseconds. + TimeInMillis elapsed_time() const { return elapsed_time_; } + + // Returns the i-th test among all the tests. i can range from 0 to + // total_test_count() - 1. If i is not in that range, returns NULL. + const TestInfo* GetTestInfo(int i) const; + + private: + friend class Test; + friend class internal::UnitTestImpl; + + // Gets the (mutable) vector of TestInfos in this TestCase. + std::vector& test_info_list() { return test_info_list_; } + + // Gets the (immutable) vector of TestInfos in this TestCase. + const std::vector& test_info_list() const { + return test_info_list_; + } + + // Returns the i-th test among all the tests. i can range from 0 to + // total_test_count() - 1. If i is not in that range, returns NULL. + TestInfo* GetMutableTestInfo(int i); + + // Sets the should_run member. + void set_should_run(bool should) { should_run_ = should; } + + // Adds a TestInfo to this test case. Will delete the TestInfo upon + // destruction of the TestCase object. + void AddTestInfo(TestInfo * test_info); + + // Clears the results of all tests in this test case. + void ClearResult(); + + // Clears the results of all tests in the given test case. + static void ClearTestCaseResult(TestCase* test_case) { + test_case->ClearResult(); + } + + // Runs every test in this TestCase. + void Run(); + + // Returns true iff test passed. + static bool TestPassed(const TestInfo * test_info); + + // Returns true iff test failed. + static bool TestFailed(const TestInfo * test_info); + + // Returns true iff test is disabled. + static bool TestDisabled(const TestInfo * test_info); + + // Returns true if the given test should run. + static bool ShouldRunTest(const TestInfo *test_info); + + // Shuffles the tests in this test case. + void ShuffleTests(internal::Random* random); + + // Restores the test order to before the first shuffle. + void UnshuffleTests(); + + // Name of the test case. + internal::String name_; + // Comment on the test case. + internal::String comment_; + // The vector of TestInfos in their original order. It owns the + // elements in the vector. + std::vector test_info_list_; + // Provides a level of indirection for the test list to allow easy + // shuffling and restoring the test order. The i-th element in this + // vector is the index of the i-th test in the shuffled test list. + std::vector test_indices_; + // Pointer to the function that sets up the test case. + Test::SetUpTestCaseFunc set_up_tc_; + // Pointer to the function that tears down the test case. + Test::TearDownTestCaseFunc tear_down_tc_; + // True iff any test in this test case should run. + bool should_run_; + // Elapsed time, in milliseconds. + TimeInMillis elapsed_time_; + + // We disallow copying TestCases. + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase); +}; + +// An Environment object is capable of setting up and tearing down an +// environment. The user should subclass this to define his own +// environment(s). +// +// An Environment object does the set-up and tear-down in virtual +// methods SetUp() and TearDown() instead of the constructor and the +// destructor, as: +// +// 1. You cannot safely throw from a destructor. This is a problem +// as in some cases Google Test is used where exceptions are enabled, and +// we may want to implement ASSERT_* using exceptions where they are +// available. +// 2. You cannot use ASSERT_* directly in a constructor or +// destructor. +class Environment { + public: + // The d'tor is virtual as we need to subclass Environment. + virtual ~Environment() {} + + // Override this to define how to set up the environment. + virtual void SetUp() {} + + // Override this to define how to tear down the environment. + virtual void TearDown() {} + private: + // If you see an error about overriding the following function or + // about it being private, you have mis-spelled SetUp() as Setup(). + struct Setup_should_be_spelled_SetUp {}; + virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; } +}; + +// The interface for tracing execution of tests. The methods are organized in +// the order the corresponding events are fired. +class TestEventListener { + public: + virtual ~TestEventListener() {} + + // Fired before any test activity starts. + virtual void OnTestProgramStart(const UnitTest& unit_test) = 0; + + // Fired before each iteration of tests starts. There may be more than + // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration + // index, starting from 0. + virtual void OnTestIterationStart(const UnitTest& unit_test, + int iteration) = 0; + + // Fired before environment set-up for each iteration of tests starts. + virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0; + + // Fired after environment set-up for each iteration of tests ends. + virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0; + + // Fired before the test case starts. + virtual void OnTestCaseStart(const TestCase& test_case) = 0; + + // Fired before the test starts. + virtual void OnTestStart(const TestInfo& test_info) = 0; + + // Fired after a failed assertion or a SUCCESS(). + virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0; + + // Fired after the test ends. + virtual void OnTestEnd(const TestInfo& test_info) = 0; + + // Fired after the test case ends. + virtual void OnTestCaseEnd(const TestCase& test_case) = 0; + + // Fired before environment tear-down for each iteration of tests starts. + virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0; + + // Fired after environment tear-down for each iteration of tests ends. + virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0; + + // Fired after each iteration of tests finishes. + virtual void OnTestIterationEnd(const UnitTest& unit_test, + int iteration) = 0; + + // Fired after all test activities have ended. + virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0; +}; + +// The convenience class for users who need to override just one or two +// methods and are not concerned that a possible change to a signature of +// the methods they override will not be caught during the build. For +// comments about each method please see the definition of TestEventListener +// above. +class EmptyTestEventListener : public TestEventListener { + public: + virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} + virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, + int /*iteration*/) {} + virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {} + virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} + virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} + virtual void OnTestStart(const TestInfo& /*test_info*/) {} + virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {} + virtual void OnTestEnd(const TestInfo& /*test_info*/) {} + virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} + virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {} + virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} + virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, + int /*iteration*/) {} + virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} +}; + +// TestEventListeners lets users add listeners to track events in Google Test. +class GTEST_API_ TestEventListeners { + public: + TestEventListeners(); + ~TestEventListeners(); + + // Appends an event listener to the end of the list. Google Test assumes + // the ownership of the listener (i.e. it will delete the listener when + // the test program finishes). + void Append(TestEventListener* listener); + + // Removes the given event listener from the list and returns it. It then + // becomes the caller's responsibility to delete the listener. Returns + // NULL if the listener is not found in the list. + TestEventListener* Release(TestEventListener* listener); + + // Returns the standard listener responsible for the default console + // output. Can be removed from the listeners list to shut down default + // console output. Note that removing this object from the listener list + // with Release transfers its ownership to the caller and makes this + // function return NULL the next time. + TestEventListener* default_result_printer() const { + return default_result_printer_; + } + + // Returns the standard listener responsible for the default XML output + // controlled by the --gtest_output=xml flag. Can be removed from the + // listeners list by users who want to shut down the default XML output + // controlled by this flag and substitute it with custom one. Note that + // removing this object from the listener list with Release transfers its + // ownership to the caller and makes this function return NULL the next + // time. + TestEventListener* default_xml_generator() const { + return default_xml_generator_; + } + + private: + friend class TestCase; + friend class internal::DefaultGlobalTestPartResultReporter; + friend class internal::NoExecDeathTest; + friend class internal::TestEventListenersAccessor; + friend class internal::TestInfoImpl; + friend class internal::UnitTestImpl; + + // Returns repeater that broadcasts the TestEventListener events to all + // subscribers. + TestEventListener* repeater(); + + // Sets the default_result_printer attribute to the provided listener. + // The listener is also added to the listener list and previous + // default_result_printer is removed from it and deleted. The listener can + // also be NULL in which case it will not be added to the list. Does + // nothing if the previous and the current listener objects are the same. + void SetDefaultResultPrinter(TestEventListener* listener); + + // Sets the default_xml_generator attribute to the provided listener. The + // listener is also added to the listener list and previous + // default_xml_generator is removed from it and deleted. The listener can + // also be NULL in which case it will not be added to the list. Does + // nothing if the previous and the current listener objects are the same. + void SetDefaultXmlGenerator(TestEventListener* listener); + + // Controls whether events will be forwarded by the repeater to the + // listeners in the list. + bool EventForwardingEnabled() const; + void SuppressEventForwarding(); + + // The actual list of listeners. + internal::TestEventRepeater* repeater_; + // Listener responsible for the standard result output. + TestEventListener* default_result_printer_; + // Listener responsible for the creation of the XML output file. + TestEventListener* default_xml_generator_; + + // We disallow copying TestEventListeners. + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners); +}; + +// A UnitTest consists of a vector of TestCases. +// +// This is a singleton class. The only instance of UnitTest is +// created when UnitTest::GetInstance() is first called. This +// instance is never deleted. +// +// UnitTest is not copyable. +// +// This class is thread-safe as long as the methods are called +// according to their specification. +class GTEST_API_ UnitTest { + public: + // Gets the singleton UnitTest object. The first time this method + // is called, a UnitTest object is constructed and returned. + // Consecutive calls will return the same object. + static UnitTest* GetInstance(); + + // Runs all tests in this UnitTest object and prints the result. + // Returns 0 if successful, or 1 otherwise. + // + // This method can only be called from the main thread. + // + // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + int Run() GTEST_MUST_USE_RESULT_; + + // Returns the working directory when the first TEST() or TEST_F() + // was executed. The UnitTest object owns the string. + const char* original_working_dir() const; + + // Returns the TestCase object for the test that's currently running, + // or NULL if no test is running. + const TestCase* current_test_case() const; + + // Returns the TestInfo object for the test that's currently running, + // or NULL if no test is running. + const TestInfo* current_test_info() const; + + // Returns the random seed used at the start of the current test run. + int random_seed() const; + +#if GTEST_HAS_PARAM_TEST + // Returns the ParameterizedTestCaseRegistry object used to keep track of + // value-parameterized tests and instantiate and register them. + // + // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + internal::ParameterizedTestCaseRegistry& parameterized_test_registry(); +#endif // GTEST_HAS_PARAM_TEST + + // Gets the number of successful test cases. + int successful_test_case_count() const; + + // Gets the number of failed test cases. + int failed_test_case_count() const; + + // Gets the number of all test cases. + int total_test_case_count() const; + + // Gets the number of all test cases that contain at least one test + // that should run. + int test_case_to_run_count() const; + + // Gets the number of successful tests. + int successful_test_count() const; + + // Gets the number of failed tests. + int failed_test_count() const; + + // Gets the number of disabled tests. + int disabled_test_count() const; + + // Gets the number of all tests. + int total_test_count() const; + + // Gets the number of tests that should run. + int test_to_run_count() const; + + // Gets the elapsed time, in milliseconds. + TimeInMillis elapsed_time() const; + + // Returns true iff the unit test passed (i.e. all test cases passed). + bool Passed() const; + + // Returns true iff the unit test failed (i.e. some test case failed + // or something outside of all tests failed). + bool Failed() const; + + // Gets the i-th test case among all the test cases. i can range from 0 to + // total_test_case_count() - 1. If i is not in that range, returns NULL. + const TestCase* GetTestCase(int i) const; + + // Returns the list of event listeners that can be used to track events + // inside Google Test. + TestEventListeners& listeners(); + + private: + // Registers and returns a global test environment. When a test + // program is run, all global test environments will be set-up in + // the order they were registered. After all tests in the program + // have finished, all global test environments will be torn-down in + // the *reverse* order they were registered. + // + // The UnitTest object takes ownership of the given environment. + // + // This method can only be called from the main thread. + Environment* AddEnvironment(Environment* env); + + // Adds a TestPartResult to the current TestResult object. All + // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) + // eventually call this to report their results. The user code + // should use the assertion macros instead of calling this directly. + void AddTestPartResult(TestPartResult::Type result_type, + const char* file_name, + int line_number, + const internal::String& message, + const internal::String& os_stack_trace); + + // Adds a TestProperty to the current TestResult object. If the result already + // contains a property with the same key, the value will be updated. + void RecordPropertyForCurrentTest(const char* key, const char* value); + + // Gets the i-th test case among all the test cases. i can range from 0 to + // total_test_case_count() - 1. If i is not in that range, returns NULL. + TestCase* GetMutableTestCase(int i); + + // Accessors for the implementation object. + internal::UnitTestImpl* impl() { return impl_; } + const internal::UnitTestImpl* impl() const { return impl_; } + + // These classes and funcions are friends as they need to access private + // members of UnitTest. + friend class Test; + friend class internal::AssertHelper; + friend class internal::ScopedTrace; + friend Environment* AddGlobalTestEnvironment(Environment* env); + friend internal::UnitTestImpl* internal::GetUnitTestImpl(); + friend void internal::ReportFailureInUnknownLocation( + TestPartResult::Type result_type, + const internal::String& message); + + // Creates an empty UnitTest. + UnitTest(); + + // D'tor + virtual ~UnitTest(); + + // Pushes a trace defined by SCOPED_TRACE() on to the per-thread + // Google Test trace stack. + void PushGTestTrace(const internal::TraceInfo& trace); + + // Pops a trace from the per-thread Google Test trace stack. + void PopGTestTrace(); + + // Protects mutable state in *impl_. This is mutable as some const + // methods need to lock it too. + mutable internal::Mutex mutex_; + + // Opaque implementation object. This field is never changed once + // the object is constructed. We don't mark it as const here, as + // doing so will cause a warning in the constructor of UnitTest. + // Mutable state in *impl_ is protected by mutex_. + internal::UnitTestImpl* impl_; + + // We disallow copying UnitTest. + GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest); +}; + +// A convenient wrapper for adding an environment for the test +// program. +// +// You should call this before RUN_ALL_TESTS() is called, probably in +// main(). If you use gtest_main, you need to call this before main() +// starts for it to take effect. For example, you can define a global +// variable like this: +// +// testing::Environment* const foo_env = +// testing::AddGlobalTestEnvironment(new FooEnvironment); +// +// However, we strongly recommend you to write your own main() and +// call AddGlobalTestEnvironment() there, as relying on initialization +// of global variables makes the code harder to read and may cause +// problems when you register multiple environments from different +// translation units and the environments have dependencies among them +// (remember that the compiler doesn't guarantee the order in which +// global variables from different translation units are initialized). +inline Environment* AddGlobalTestEnvironment(Environment* env) { + return UnitTest::GetInstance()->AddEnvironment(env); +} + +// Initializes Google Test. This must be called before calling +// RUN_ALL_TESTS(). In particular, it parses a command line for the +// flags that Google Test recognizes. Whenever a Google Test flag is +// seen, it is removed from argv, and *argc is decremented. +// +// No value is returned. Instead, the Google Test flag variables are +// updated. +// +// Calling the function for the second time has no user-visible effect. +GTEST_API_ void InitGoogleTest(int* argc, char** argv); + +// This overloaded version can be used in Windows programs compiled in +// UNICODE mode. +GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv); + +namespace internal { + +// These overloaded versions handle ::std::string and ::std::wstring. +GTEST_API_ inline String FormatForFailureMessage(const ::std::string& str) { + return (Message() << '"' << str << '"').GetString(); +} + +#if GTEST_HAS_STD_WSTRING +GTEST_API_ inline String FormatForFailureMessage(const ::std::wstring& wstr) { + return (Message() << "L\"" << wstr << '"').GetString(); +} +#endif // GTEST_HAS_STD_WSTRING + +// These overloaded versions handle ::string and ::wstring. +#if GTEST_HAS_GLOBAL_STRING +GTEST_API_ inline String FormatForFailureMessage(const ::string& str) { + return (Message() << '"' << str << '"').GetString(); +} +#endif // GTEST_HAS_GLOBAL_STRING + +#if GTEST_HAS_GLOBAL_WSTRING +GTEST_API_ inline String FormatForFailureMessage(const ::wstring& wstr) { + return (Message() << "L\"" << wstr << '"').GetString(); +} +#endif // GTEST_HAS_GLOBAL_WSTRING + +// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc) +// operand to be used in a failure message. The type (but not value) +// of the other operand may affect the format. This allows us to +// print a char* as a raw pointer when it is compared against another +// char*, and print it as a C string when it is compared against an +// std::string object, for example. +// +// The default implementation ignores the type of the other operand. +// Some specialized versions are used to handle formatting wide or +// narrow C strings. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +template +String FormatForComparisonFailureMessage(const T1& value, + const T2& /* other_operand */) { + return FormatForFailureMessage(value); +} + +// The helper function for {ASSERT|EXPECT}_EQ. +template +AssertionResult CmpHelperEQ(const char* expected_expression, + const char* actual_expression, + const T1& expected, + const T2& actual) { +#ifdef _MSC_VER +#pragma warning(push) // Saves the current warning state. +#pragma warning(disable:4389) // Temporarily disables warning on + // signed/unsigned mismatch. +#endif + + if (expected == actual) { + return AssertionSuccess(); + } + +#ifdef _MSC_VER +#pragma warning(pop) // Restores the warning state. +#endif + + return EqFailure(expected_expression, + actual_expression, + FormatForComparisonFailureMessage(expected, actual), + FormatForComparisonFailureMessage(actual, expected), + false); +} + +// With this overloaded version, we allow anonymous enums to be used +// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums +// can be implicitly cast to BiggestInt. +GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression, + const char* actual_expression, + BiggestInt expected, + BiggestInt actual); + +// The helper class for {ASSERT|EXPECT}_EQ. The template argument +// lhs_is_null_literal is true iff the first argument to ASSERT_EQ() +// is a null pointer literal. The following default implementation is +// for lhs_is_null_literal being false. +template +class EqHelper { + public: + // This templatized version is for the general case. + template + static AssertionResult Compare(const char* expected_expression, + const char* actual_expression, + const T1& expected, + const T2& actual) { + return CmpHelperEQ(expected_expression, actual_expression, expected, + actual); + } + + // With this overloaded version, we allow anonymous enums to be used + // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous + // enums can be implicitly cast to BiggestInt. + // + // Even though its body looks the same as the above version, we + // cannot merge the two, as it will make anonymous enums unhappy. + static AssertionResult Compare(const char* expected_expression, + const char* actual_expression, + BiggestInt expected, + BiggestInt actual) { + return CmpHelperEQ(expected_expression, actual_expression, expected, + actual); + } +}; + +// This specialization is used when the first argument to ASSERT_EQ() +// is a null pointer literal. +template <> +class EqHelper { + public: + // We define two overloaded versions of Compare(). The first + // version will be picked when the second argument to ASSERT_EQ() is + // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or + // EXPECT_EQ(false, a_bool). + template + static AssertionResult Compare(const char* expected_expression, + const char* actual_expression, + const T1& expected, + const T2& actual) { + return CmpHelperEQ(expected_expression, actual_expression, expected, + actual); + } + + // This version will be picked when the second argument to + // ASSERT_EQ() is a pointer, e.g. ASSERT_EQ(NULL, a_pointer). + template + static AssertionResult Compare(const char* expected_expression, + const char* actual_expression, + const T1& /* expected */, + T2* actual) { + // We already know that 'expected' is a null pointer. + return CmpHelperEQ(expected_expression, actual_expression, + static_cast(NULL), actual); + } +}; + +// A macro for implementing the helper functions needed to implement +// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste +// of similar code. +// +// For each templatized helper function, we also define an overloaded +// version for BiggestInt in order to reduce code bloat and allow +// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled +// with gcc 4. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +#define GTEST_IMPL_CMP_HELPER_(op_name, op)\ +template \ +AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ + const T1& val1, const T2& val2) {\ + if (val1 op val2) {\ + return AssertionSuccess();\ + } else {\ + Message msg;\ + msg << "Expected: (" << expr1 << ") " #op " (" << expr2\ + << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ + << " vs " << FormatForComparisonFailureMessage(val2, val1);\ + return AssertionFailure(msg);\ + }\ +}\ +GTEST_API_ AssertionResult CmpHelper##op_name(\ + const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2) + +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + +// Implements the helper function for {ASSERT|EXPECT}_NE +GTEST_IMPL_CMP_HELPER_(NE, !=); +// Implements the helper function for {ASSERT|EXPECT}_LE +GTEST_IMPL_CMP_HELPER_(LE, <=); +// Implements the helper function for {ASSERT|EXPECT}_LT +GTEST_IMPL_CMP_HELPER_(LT, < ); +// Implements the helper function for {ASSERT|EXPECT}_GE +GTEST_IMPL_CMP_HELPER_(GE, >=); +// Implements the helper function for {ASSERT|EXPECT}_GT +GTEST_IMPL_CMP_HELPER_(GT, > ); + +#undef GTEST_IMPL_CMP_HELPER_ + +// The helper function for {ASSERT|EXPECT}_STREQ. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, + const char* actual_expression, + const char* expected, + const char* actual); + +// The helper function for {ASSERT|EXPECT}_STRCASEEQ. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, + const char* actual_expression, + const char* expected, + const char* actual); + +// The helper function for {ASSERT|EXPECT}_STRNE. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2); + +// The helper function for {ASSERT|EXPECT}_STRCASENE. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2); + + +// Helper function for *_STREQ on wide strings. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression, + const char* actual_expression, + const wchar_t* expected, + const wchar_t* actual); + +// Helper function for *_STRNE on wide strings. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, + const char* s2_expression, + const wchar_t* s1, + const wchar_t* s2); + +} // namespace internal + +// IsSubstring() and IsNotSubstring() are intended to be used as the +// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by +// themselves. They check whether needle is a substring of haystack +// (NULL is considered a substring of itself only), and return an +// appropriate error message when they fail. +// +// The {needle,haystack}_expr arguments are the stringified +// expressions that generated the two real arguments. +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const char* needle, const char* haystack); +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const wchar_t* needle, const wchar_t* haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const char* needle, const char* haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const wchar_t* needle, const wchar_t* haystack); +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::string& needle, const ::std::string& haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::string& needle, const ::std::string& haystack); + +#if GTEST_HAS_STD_WSTRING +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::wstring& needle, const ::std::wstring& haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::wstring& needle, const ::std::wstring& haystack); +#endif // GTEST_HAS_STD_WSTRING + +namespace internal { + +// Helper template function for comparing floating-points. +// +// Template parameter: +// +// RawType: the raw floating-point type (either float or double) +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +template +AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression, + const char* actual_expression, + RawType expected, + RawType actual) { + const FloatingPoint lhs(expected), rhs(actual); + + if (lhs.AlmostEquals(rhs)) { + return AssertionSuccess(); + } + + StrStream expected_ss; + expected_ss << std::setprecision(std::numeric_limits::digits10 + 2) + << expected; + + StrStream actual_ss; + actual_ss << std::setprecision(std::numeric_limits::digits10 + 2) + << actual; + + return EqFailure(expected_expression, + actual_expression, + StrStreamToString(&expected_ss), + StrStreamToString(&actual_ss), + false); +} + +// Helper function for implementing ASSERT_NEAR. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, + const char* expr2, + const char* abs_error_expr, + double val1, + double val2, + double abs_error); + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// A class that enables one to stream messages to assertion macros +class GTEST_API_ AssertHelper { + public: + // Constructor. + AssertHelper(TestPartResult::Type type, + const char* file, + int line, + const char* message); + ~AssertHelper(); + + // Message assignment is a semantic trick to enable assertion + // streaming; see the GTEST_MESSAGE_ macro below. + void operator=(const Message& message) const; + + private: + // We put our data in a struct so that the size of the AssertHelper class can + // be as small as possible. This is important because gcc is incapable of + // re-using stack space even for temporary variables, so every EXPECT_EQ + // reserves stack space for another AssertHelper. + struct AssertHelperData { + AssertHelperData(TestPartResult::Type t, + const char* srcfile, + int line_num, + const char* msg) + : type(t), file(srcfile), line(line_num), message(msg) { } + + TestPartResult::Type const type; + const char* const file; + int const line; + String const message; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData); + }; + + AssertHelperData* const data_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); +}; + +} // namespace internal + +#if GTEST_HAS_PARAM_TEST +// The abstract base class that all value-parameterized tests inherit from. +// +// This class adds support for accessing the test parameter value via +// the GetParam() method. +// +// Use it with one of the parameter generator defining functions, like Range(), +// Values(), ValuesIn(), Bool(), and Combine(). +// +// class FooTest : public ::testing::TestWithParam { +// protected: +// FooTest() { +// // Can use GetParam() here. +// } +// virtual ~FooTest() { +// // Can use GetParam() here. +// } +// virtual void SetUp() { +// // Can use GetParam() here. +// } +// virtual void TearDown { +// // Can use GetParam() here. +// } +// }; +// TEST_P(FooTest, DoesBar) { +// // Can use GetParam() method here. +// Foo foo; +// ASSERT_TRUE(foo.DoesBar(GetParam())); +// } +// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); + +template +class TestWithParam : public Test { + public: + typedef T ParamType; + + // The current parameter value. Is also available in the test fixture's + // constructor. + const ParamType& GetParam() const { return *parameter_; } + + private: + // Sets parameter value. The caller is responsible for making sure the value + // remains alive and unchanged throughout the current test. + static void SetParam(const ParamType* parameter) { + parameter_ = parameter; + } + + // Static value used for accessing parameter during a test lifetime. + static const ParamType* parameter_; + + // TestClass must be a subclass of TestWithParam. + template friend class internal::ParameterizedTestFactory; +}; + +template +const T* TestWithParam::parameter_ = NULL; + +#endif // GTEST_HAS_PARAM_TEST + +// Macros for indicating success/failure in test code. + +// ADD_FAILURE unconditionally adds a failure to the current test. +// SUCCEED generates a success - it doesn't automatically make the +// current test successful, as a test is only successful when it has +// no failure. +// +// EXPECT_* verifies that a certain condition is satisfied. If not, +// it behaves like ADD_FAILURE. In particular: +// +// EXPECT_TRUE verifies that a Boolean condition is true. +// EXPECT_FALSE verifies that a Boolean condition is false. +// +// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except +// that they will also abort the current function on failure. People +// usually want the fail-fast behavior of FAIL and ASSERT_*, but those +// writing data-driven tests often find themselves using ADD_FAILURE +// and EXPECT_* more. +// +// Examples: +// +// EXPECT_TRUE(server.StatusIsOK()); +// ASSERT_FALSE(server.HasPendingRequest(port)) +// << "There are still pending requests " << "on port " << port; + +// Generates a nonfatal failure with a generic message. +#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") + +// Generates a fatal failure with a generic message. +#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") + +// Define this macro to 1 to omit the definition of FAIL(), which is a +// generic name and clashes with some other libraries. +#if !GTEST_DONT_DEFINE_FAIL +#define FAIL() GTEST_FAIL() +#endif + +// Generates a success with a generic message. +#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") + +// Define this macro to 1 to omit the definition of SUCCEED(), which +// is a generic name and clashes with some other libraries. +#if !GTEST_DONT_DEFINE_SUCCEED +#define SUCCEED() GTEST_SUCCEED() +#endif + +// Macros for testing exceptions. +// +// * {ASSERT|EXPECT}_THROW(statement, expected_exception): +// Tests that the statement throws the expected exception. +// * {ASSERT|EXPECT}_NO_THROW(statement): +// Tests that the statement doesn't throw any exception. +// * {ASSERT|EXPECT}_ANY_THROW(statement): +// Tests that the statement throws an exception. + +#define EXPECT_THROW(statement, expected_exception) \ + GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) +#define EXPECT_NO_THROW(statement) \ + GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) +#define EXPECT_ANY_THROW(statement) \ + GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) +#define ASSERT_THROW(statement, expected_exception) \ + GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) +#define ASSERT_NO_THROW(statement) \ + GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) +#define ASSERT_ANY_THROW(statement) \ + GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) + +// Boolean assertions. Condition can be either a Boolean expression or an +// AssertionResult. For more information on how to use AssertionResult with +// these macros see comments on that class. +#define EXPECT_TRUE(condition) \ + GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ + GTEST_NONFATAL_FAILURE_) +#define EXPECT_FALSE(condition) \ + GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ + GTEST_NONFATAL_FAILURE_) +#define ASSERT_TRUE(condition) \ + GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ + GTEST_FATAL_FAILURE_) +#define ASSERT_FALSE(condition) \ + GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ + GTEST_FATAL_FAILURE_) + +// Includes the auto-generated header that implements a family of +// generic predicate assertion macros. +#include + +// Macros for testing equalities and inequalities. +// +// * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual +// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 +// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2 +// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2 +// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2 +// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2 +// +// When they are not, Google Test prints both the tested expressions and +// their actual values. The values must be compatible built-in types, +// or you will get a compiler error. By "compatible" we mean that the +// values can be compared by the respective operator. +// +// Note: +// +// 1. It is possible to make a user-defined type work with +// {ASSERT|EXPECT}_??(), but that requires overloading the +// comparison operators and is thus discouraged by the Google C++ +// Usage Guide. Therefore, you are advised to use the +// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are +// equal. +// +// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on +// pointers (in particular, C strings). Therefore, if you use it +// with two C strings, you are testing how their locations in memory +// are related, not how their content is related. To compare two C +// strings by content, use {ASSERT|EXPECT}_STR*(). +// +// 3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to +// {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you +// what the actual value is when it fails, and similarly for the +// other comparisons. +// +// 4. Do not depend on the order in which {ASSERT|EXPECT}_??() +// evaluate their arguments, which is undefined. +// +// 5. These macros evaluate their arguments exactly once. +// +// Examples: +// +// EXPECT_NE(5, Foo()); +// EXPECT_EQ(NULL, a_pointer); +// ASSERT_LT(i, array_size); +// ASSERT_GT(records.size(), 0) << "There is no record left."; + +#define EXPECT_EQ(expected, actual) \ + EXPECT_PRED_FORMAT2(::testing::internal:: \ + EqHelper::Compare, \ + expected, actual) +#define EXPECT_NE(expected, actual) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual) +#define EXPECT_LE(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) +#define EXPECT_LT(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) +#define EXPECT_GE(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) +#define EXPECT_GT(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) + +#define ASSERT_EQ(expected, actual) \ + ASSERT_PRED_FORMAT2(::testing::internal:: \ + EqHelper::Compare, \ + expected, actual) +#define ASSERT_NE(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) +#define ASSERT_LE(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) +#define ASSERT_LT(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) +#define ASSERT_GE(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) +#define ASSERT_GT(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) + +// C String Comparisons. All tests treat NULL and any non-NULL string +// as different. Two NULLs are equal. +// +// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2 +// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2 +// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case +// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case +// +// For wide or narrow string objects, you can use the +// {ASSERT|EXPECT}_??() macros. +// +// Don't depend on the order in which the arguments are evaluated, +// which is undefined. +// +// These macros evaluate their arguments exactly once. + +#define EXPECT_STREQ(expected, actual) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) +#define EXPECT_STRNE(s1, s2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) +#define EXPECT_STRCASEEQ(expected, actual) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) +#define EXPECT_STRCASENE(s1, s2)\ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) + +#define ASSERT_STREQ(expected, actual) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual) +#define ASSERT_STRNE(s1, s2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) +#define ASSERT_STRCASEEQ(expected, actual) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual) +#define ASSERT_STRCASENE(s1, s2)\ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) + +// Macros for comparing floating-point numbers. +// +// * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual): +// Tests that two float values are almost equal. +// * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual): +// Tests that two double values are almost equal. +// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error): +// Tests that v1 and v2 are within the given distance to each other. +// +// Google Test uses ULP-based comparison to automatically pick a default +// error bound that is appropriate for the operands. See the +// FloatingPoint template class in gtest-internal.h if you are +// interested in the implementation details. + +#define EXPECT_FLOAT_EQ(expected, actual)\ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + expected, actual) + +#define EXPECT_DOUBLE_EQ(expected, actual)\ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + expected, actual) + +#define ASSERT_FLOAT_EQ(expected, actual)\ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + expected, actual) + +#define ASSERT_DOUBLE_EQ(expected, actual)\ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + expected, actual) + +#define EXPECT_NEAR(val1, val2, abs_error)\ + EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ + val1, val2, abs_error) + +#define ASSERT_NEAR(val1, val2, abs_error)\ + ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ + val1, val2, abs_error) + +// These predicate format functions work on floating-point values, and +// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g. +// +// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0); + +// Asserts that val1 is less than, or almost equal to, val2. Fails +// otherwise. In particular, it fails if either val1 or val2 is NaN. +GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2, + float val1, float val2); +GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, + double val1, double val2); + + +#if GTEST_OS_WINDOWS + +// Macros that test for HRESULT failure and success, these are only useful +// on Windows, and rely on Windows SDK macros and APIs to compile. +// +// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr) +// +// When expr unexpectedly fails or succeeds, Google Test prints the +// expected result and the actual result with both a human-readable +// string representation of the error, if available, as well as the +// hex result code. +#define EXPECT_HRESULT_SUCCEEDED(expr) \ + EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) + +#define ASSERT_HRESULT_SUCCEEDED(expr) \ + ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) + +#define EXPECT_HRESULT_FAILED(expr) \ + EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) + +#define ASSERT_HRESULT_FAILED(expr) \ + ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) + +#endif // GTEST_OS_WINDOWS + +// Macros that execute statement and check that it doesn't generate new fatal +// failures in the current thread. +// +// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement); +// +// Examples: +// +// EXPECT_NO_FATAL_FAILURE(Process()); +// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed"; +// +#define ASSERT_NO_FATAL_FAILURE(statement) \ + GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) +#define EXPECT_NO_FATAL_FAILURE(statement) \ + GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) + +// Causes a trace (including the source file path, the current line +// number, and the given message) to be included in every test failure +// message generated by code in the current scope. The effect is +// undone when the control leaves the current scope. +// +// The message argument can be anything streamable to std::ostream. +// +// In the implementation, we include the current line number as part +// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s +// to appear in the same block - as long as they are on different +// lines. +#define SCOPED_TRACE(message) \ + ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ + __FILE__, __LINE__, ::testing::Message() << (message)) + +namespace internal { + +// This template is declared, but intentionally undefined. +template +struct StaticAssertTypeEqHelper; + +template +struct StaticAssertTypeEqHelper {}; + +} // namespace internal + +// Compile-time assertion for type equality. +// StaticAssertTypeEq() compiles iff type1 and type2 are +// the same type. The value it returns is not interesting. +// +// Instead of making StaticAssertTypeEq a class template, we make it a +// function template that invokes a helper class template. This +// prevents a user from misusing StaticAssertTypeEq by +// defining objects of that type. +// +// CAVEAT: +// +// When used inside a method of a class template, +// StaticAssertTypeEq() is effective ONLY IF the method is +// instantiated. For example, given: +// +// template class Foo { +// public: +// void Bar() { testing::StaticAssertTypeEq(); } +// }; +// +// the code: +// +// void Test1() { Foo foo; } +// +// will NOT generate a compiler error, as Foo::Bar() is never +// actually instantiated. Instead, you need: +// +// void Test2() { Foo foo; foo.Bar(); } +// +// to cause a compiler error. +template +bool StaticAssertTypeEq() { + internal::StaticAssertTypeEqHelper(); + return true; +} + +// Defines a test. +// +// The first parameter is the name of the test case, and the second +// parameter is the name of the test within the test case. +// +// The convention is to end the test case name with "Test". For +// example, a test case for the Foo class can be named FooTest. +// +// The user should put his test code between braces after using this +// macro. Example: +// +// TEST(FooTest, InitializesCorrectly) { +// Foo foo; +// EXPECT_TRUE(foo.StatusIsOK()); +// } + +// Note that we call GetTestTypeId() instead of GetTypeId< +// ::testing::Test>() here to get the type ID of testing::Test. This +// is to work around a suspected linker bug when using Google Test as +// a framework on Mac OS X. The bug causes GetTypeId< +// ::testing::Test>() to return different values depending on whether +// the call is from the Google Test framework itself or from user test +// code. GetTestTypeId() is guaranteed to always return the same +// value, as it always calls GetTypeId<>() from the Google Test +// framework. +#define GTEST_TEST(test_case_name, test_name)\ + GTEST_TEST_(test_case_name, test_name, \ + ::testing::Test, ::testing::internal::GetTestTypeId()) + +// Define this macro to 1 to omit the definition of TEST(), which +// is a generic name and clashes with some other libraries. +#if !GTEST_DONT_DEFINE_TEST +#define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name) +#endif + +// Defines a test that uses a test fixture. +// +// The first parameter is the name of the test fixture class, which +// also doubles as the test case name. The second parameter is the +// name of the test within the test case. +// +// A test fixture class must be declared earlier. The user should put +// his test code between braces after using this macro. Example: +// +// class FooTest : public testing::Test { +// protected: +// virtual void SetUp() { b_.AddElement(3); } +// +// Foo a_; +// Foo b_; +// }; +// +// TEST_F(FooTest, InitializesCorrectly) { +// EXPECT_TRUE(a_.StatusIsOK()); +// } +// +// TEST_F(FooTest, ReturnsElementCountCorrectly) { +// EXPECT_EQ(0, a_.size()); +// EXPECT_EQ(1, b_.size()); +// } + +#define TEST_F(test_fixture, test_name)\ + GTEST_TEST_(test_fixture, test_name, test_fixture, \ + ::testing::internal::GetTypeId()) + +// Use this macro in main() to run all tests. It returns 0 if all +// tests are successful, or 1 otherwise. +// +// RUN_ALL_TESTS() should be invoked after the command line has been +// parsed by InitGoogleTest(). + +#define RUN_ALL_TESTS()\ + (::testing::UnitTest::GetInstance()->Run()) + +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_GTEST_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h new file mode 100644 index 000000000..e1e2f8c4c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h @@ -0,0 +1,368 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is AUTOMATICALLY GENERATED on 10/02/2008 by command +// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! +// +// Implements a family of generic predicate assertion macros. + +#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ + +// Makes sure this header is not included before gtest.h. +#ifndef GTEST_INCLUDE_GTEST_GTEST_H_ +#error Do not include gtest_pred_impl.h directly. Include gtest.h instead. +#endif // GTEST_INCLUDE_GTEST_GTEST_H_ + +// This header implements a family of generic predicate assertion +// macros: +// +// ASSERT_PRED_FORMAT1(pred_format, v1) +// ASSERT_PRED_FORMAT2(pred_format, v1, v2) +// ... +// +// where pred_format is a function or functor that takes n (in the +// case of ASSERT_PRED_FORMATn) values and their source expression +// text, and returns a testing::AssertionResult. See the definition +// of ASSERT_EQ in gtest.h for an example. +// +// If you don't care about formatting, you can use the more +// restrictive version: +// +// ASSERT_PRED1(pred, v1) +// ASSERT_PRED2(pred, v1, v2) +// ... +// +// where pred is an n-ary function or functor that returns bool, +// and the values v1, v2, ..., must support the << operator for +// streaming to std::ostream. +// +// We also define the EXPECT_* variations. +// +// For now we only support predicates whose arity is at most 5. +// Please email googletestframework@googlegroups.com if you need +// support for higher arities. + +// GTEST_ASSERT_ is the basic statement to which all of the assertions +// in this file reduce. Don't use this in your code. + +#define GTEST_ASSERT_(expression, on_failure) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const ::testing::AssertionResult gtest_ar = (expression)) \ + ; \ + else \ + on_failure(gtest_ar.failure_message()) + + +// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use +// this in your code. +template +AssertionResult AssertPred1Helper(const char* pred_text, + const char* e1, + Pred pred, + const T1& v1) { + if (pred(v1)) return AssertionSuccess(); + + Message msg; + msg << pred_text << "(" + << e1 << ") evaluates to false, where" + << "\n" << e1 << " evaluates to " << v1; + return AssertionFailure(msg); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. +// Don't use this in your code. +#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, v1),\ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use +// this in your code. +#define GTEST_PRED1_(pred, v1, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ + #v1, \ + pred, \ + v1), on_failure) + +// Unary predicate assertion macros. +#define EXPECT_PRED_FORMAT1(pred_format, v1) \ + GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED1(pred, v1) \ + GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT1(pred_format, v1) \ + GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED1(pred, v1) \ + GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use +// this in your code. +template +AssertionResult AssertPred2Helper(const char* pred_text, + const char* e1, + const char* e2, + Pred pred, + const T1& v1, + const T2& v2) { + if (pred(v1, v2)) return AssertionSuccess(); + + Message msg; + msg << pred_text << "(" + << e1 << ", " + << e2 << ") evaluates to false, where" + << "\n" << e1 << " evaluates to " << v1 + << "\n" << e2 << " evaluates to " << v2; + return AssertionFailure(msg); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. +// Don't use this in your code. +#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2),\ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use +// this in your code. +#define GTEST_PRED2_(pred, v1, v2, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ + #v1, \ + #v2, \ + pred, \ + v1, \ + v2), on_failure) + +// Binary predicate assertion macros. +#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ + GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED2(pred, v1, v2) \ + GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ + GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED2(pred, v1, v2) \ + GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use +// this in your code. +template +AssertionResult AssertPred3Helper(const char* pred_text, + const char* e1, + const char* e2, + const char* e3, + Pred pred, + const T1& v1, + const T2& v2, + const T3& v3) { + if (pred(v1, v2, v3)) return AssertionSuccess(); + + Message msg; + msg << pred_text << "(" + << e1 << ", " + << e2 << ", " + << e3 << ") evaluates to false, where" + << "\n" << e1 << " evaluates to " << v1 + << "\n" << e2 << " evaluates to " << v2 + << "\n" << e3 << " evaluates to " << v3; + return AssertionFailure(msg); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. +// Don't use this in your code. +#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3),\ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use +// this in your code. +#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ + #v1, \ + #v2, \ + #v3, \ + pred, \ + v1, \ + v2, \ + v3), on_failure) + +// Ternary predicate assertion macros. +#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ + GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED3(pred, v1, v2, v3) \ + GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ + GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED3(pred, v1, v2, v3) \ + GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use +// this in your code. +template +AssertionResult AssertPred4Helper(const char* pred_text, + const char* e1, + const char* e2, + const char* e3, + const char* e4, + Pred pred, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4) { + if (pred(v1, v2, v3, v4)) return AssertionSuccess(); + + Message msg; + msg << pred_text << "(" + << e1 << ", " + << e2 << ", " + << e3 << ", " + << e4 << ") evaluates to false, where" + << "\n" << e1 << " evaluates to " << v1 + << "\n" << e2 << " evaluates to " << v2 + << "\n" << e3 << " evaluates to " << v3 + << "\n" << e4 << " evaluates to " << v4; + return AssertionFailure(msg); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. +// Don't use this in your code. +#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4),\ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use +// this in your code. +#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ + #v1, \ + #v2, \ + #v3, \ + #v4, \ + pred, \ + v1, \ + v2, \ + v3, \ + v4), on_failure) + +// 4-ary predicate assertion macros. +#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ + GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED4(pred, v1, v2, v3, v4) \ + GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ + GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED4(pred, v1, v2, v3, v4) \ + GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use +// this in your code. +template +AssertionResult AssertPred5Helper(const char* pred_text, + const char* e1, + const char* e2, + const char* e3, + const char* e4, + const char* e5, + Pred pred, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4, + const T5& v5) { + if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); + + Message msg; + msg << pred_text << "(" + << e1 << ", " + << e2 << ", " + << e3 << ", " + << e4 << ", " + << e5 << ") evaluates to false, where" + << "\n" << e1 << " evaluates to " << v1 + << "\n" << e2 << " evaluates to " << v2 + << "\n" << e3 << " evaluates to " << v3 + << "\n" << e4 << " evaluates to " << v4 + << "\n" << e5 << " evaluates to " << v5; + return AssertionFailure(msg); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. +// Don't use this in your code. +#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5),\ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use +// this in your code. +#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ + #v1, \ + #v2, \ + #v3, \ + #v4, \ + #v5, \ + pred, \ + v1, \ + v2, \ + v3, \ + v4, \ + v5), on_failure) + +// 5-ary predicate assertion macros. +#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ + GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ + GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ + GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ + GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) + + + +#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h new file mode 100644 index 000000000..da80ddc6c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h @@ -0,0 +1,58 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Google C++ Testing Framework definitions useful in production code. + +#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ + +// When you need to test the private or protected members of a class, +// use the FRIEND_TEST macro to declare your tests as friends of the +// class. For example: +// +// class MyClass { +// private: +// void MyMethod(); +// FRIEND_TEST(MyClassTest, MyMethod); +// }; +// +// class MyClassTest : public testing::Test { +// // ... +// }; +// +// TEST_F(MyClassTest, MyMethod) { +// // Can call MyClass::MyMethod() here. +// } + +#define FRIEND_TEST(test_case_name, test_name)\ +friend class test_case_name##_##test_name##_Test + +#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h new file mode 100644 index 000000000..e4330848d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h @@ -0,0 +1,275 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) +// +// The Google C++ Testing Framework (Google Test) +// +// This header file defines internal utilities needed for implementing +// death tests. They are subject to change without notice. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ + +#include + +namespace testing { +namespace internal { + +GTEST_DECLARE_string_(internal_run_death_test); + +// Names of the flags (needed for parsing Google Test flags). +const char kDeathTestStyleFlag[] = "death_test_style"; +const char kDeathTestUseFork[] = "death_test_use_fork"; +const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; + +#if GTEST_HAS_DEATH_TEST + +// DeathTest is a class that hides much of the complexity of the +// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method +// returns a concrete class that depends on the prevailing death test +// style, as defined by the --gtest_death_test_style and/or +// --gtest_internal_run_death_test flags. + +// In describing the results of death tests, these terms are used with +// the corresponding definitions: +// +// exit status: The integer exit information in the format specified +// by wait(2) +// exit code: The integer code passed to exit(3), _exit(2), or +// returned from main() +class GTEST_API_ DeathTest { + public: + // Create returns false if there was an error determining the + // appropriate action to take for the current death test; for example, + // if the gtest_death_test_style flag is set to an invalid value. + // The LastMessage method will return a more detailed message in that + // case. Otherwise, the DeathTest pointer pointed to by the "test" + // argument is set. If the death test should be skipped, the pointer + // is set to NULL; otherwise, it is set to the address of a new concrete + // DeathTest object that controls the execution of the current test. + static bool Create(const char* statement, const RE* regex, + const char* file, int line, DeathTest** test); + DeathTest(); + virtual ~DeathTest() { } + + // A helper class that aborts a death test when it's deleted. + class ReturnSentinel { + public: + explicit ReturnSentinel(DeathTest* test) : test_(test) { } + ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } + private: + DeathTest* const test_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); + } GTEST_ATTRIBUTE_UNUSED_; + + // An enumeration of possible roles that may be taken when a death + // test is encountered. EXECUTE means that the death test logic should + // be executed immediately. OVERSEE means that the program should prepare + // the appropriate environment for a child process to execute the death + // test, then wait for it to complete. + enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; + + // An enumeration of the two reasons that a test might be aborted. + enum AbortReason { TEST_ENCOUNTERED_RETURN_STATEMENT, TEST_DID_NOT_DIE }; + + // Assumes one of the above roles. + virtual TestRole AssumeRole() = 0; + + // Waits for the death test to finish and returns its status. + virtual int Wait() = 0; + + // Returns true if the death test passed; that is, the test process + // exited during the test, its exit status matches a user-supplied + // predicate, and its stderr output matches a user-supplied regular + // expression. + // The user-supplied predicate may be a macro expression rather + // than a function pointer or functor, or else Wait and Passed could + // be combined. + virtual bool Passed(bool exit_status_ok) = 0; + + // Signals that the death test did not die as expected. + virtual void Abort(AbortReason reason) = 0; + + // Returns a human-readable outcome message regarding the outcome of + // the last death test. + static const char* LastMessage(); + + static void set_last_death_test_message(const String& message); + + private: + // A string containing a description of the outcome of the last death test. + static String last_death_test_message_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); +}; + +// Factory interface for death tests. May be mocked out for testing. +class DeathTestFactory { + public: + virtual ~DeathTestFactory() { } + virtual bool Create(const char* statement, const RE* regex, + const char* file, int line, DeathTest** test) = 0; +}; + +// A concrete DeathTestFactory implementation for normal use. +class DefaultDeathTestFactory : public DeathTestFactory { + public: + virtual bool Create(const char* statement, const RE* regex, + const char* file, int line, DeathTest** test); +}; + +// Returns true if exit_status describes a process that was terminated +// by a signal, or exited normally with a nonzero exit code. +GTEST_API_ bool ExitedUnsuccessfully(int exit_status); + +// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, +// ASSERT_EXIT*, and EXPECT_EXIT*. +#define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + const ::testing::internal::RE& gtest_regex = (regex); \ + ::testing::internal::DeathTest* gtest_dt; \ + if (!::testing::internal::DeathTest::Create(#statement, >est_regex, \ + __FILE__, __LINE__, >est_dt)) { \ + goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ + } \ + if (gtest_dt != NULL) { \ + ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \ + gtest_dt_ptr(gtest_dt); \ + switch (gtest_dt->AssumeRole()) { \ + case ::testing::internal::DeathTest::OVERSEE_TEST: \ + if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ + goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ + } \ + break; \ + case ::testing::internal::DeathTest::EXECUTE_TEST: { \ + ::testing::internal::DeathTest::ReturnSentinel \ + gtest_sentinel(gtest_dt); \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ + break; \ + } \ + } \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \ + fail(::testing::internal::DeathTest::LastMessage()) +// The symbol "fail" here expands to something into which a message +// can be streamed. + +// A class representing the parsed contents of the +// --gtest_internal_run_death_test flag, as it existed when +// RUN_ALL_TESTS was called. +class InternalRunDeathTestFlag { + public: + InternalRunDeathTestFlag(const String& a_file, + int a_line, + int an_index, + int a_write_fd) + : file_(a_file), line_(a_line), index_(an_index), + write_fd_(a_write_fd) {} + + ~InternalRunDeathTestFlag() { + if (write_fd_ >= 0) + posix::Close(write_fd_); + } + + String file() const { return file_; } + int line() const { return line_; } + int index() const { return index_; } + int write_fd() const { return write_fd_; } + + private: + String file_; + int line_; + int index_; + int write_fd_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); +}; + +// Returns a newly created InternalRunDeathTestFlag object with fields +// initialized from the GTEST_FLAG(internal_run_death_test) flag if +// the flag is specified; otherwise returns NULL. +InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); + +#else // GTEST_HAS_DEATH_TEST + +// This macro is used for implementing macros such as +// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where +// death tests are not supported. Those macros must compile on such systems +// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on +// systems that support death tests. This allows one to write such a macro +// on a system that does not support death tests and be sure that it will +// compile on a death-test supporting system. +// +// Parameters: +// statement - A statement that a macro such as EXPECT_DEATH would test +// for program termination. This macro has to make sure this +// statement is compiled but not executed, to ensure that +// EXPECT_DEATH_IF_SUPPORTED compiles with a certain +// parameter iff EXPECT_DEATH compiles with it. +// regex - A regex that a macro such as EXPECT_DEATH would use to test +// the output of statement. This parameter has to be +// compiled but not evaluated by this macro, to ensure that +// this macro only accepts expressions that a macro such as +// EXPECT_DEATH would accept. +// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED +// and a return statement for ASSERT_DEATH_IF_SUPPORTED. +// This ensures that ASSERT_DEATH_IF_SUPPORTED will not +// compile inside functions where ASSERT_DEATH doesn't +// compile. +// +// The branch that has an always false condition is used to ensure that +// statement and regex are compiled (and thus syntactically correct) but +// never executed. The unreachable code macro protects the terminator +// statement from generating an 'unreachable code' warning in case +// statement unconditionally returns or throws. The Message constructor at +// the end allows the syntax of streaming additional messages into the +// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. +#define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + GTEST_LOG_(WARNING) \ + << "Death tests are not supported on this platform.\n" \ + << "Statement '" #statement "' cannot be verified."; \ + } else if (::testing::internal::AlwaysFalse()) { \ + ::testing::internal::RE::PartialMatch(".*", (regex)); \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + terminator; \ + } else \ + ::testing::Message() + +#endif // GTEST_HAS_DEATH_TEST + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h new file mode 100644 index 000000000..4b76d7950 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h @@ -0,0 +1,210 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: keith.ray@gmail.com (Keith Ray) +// +// Google Test filepath utilities +// +// This header file declares classes and functions used internally by +// Google Test. They are subject to change without notice. +// +// This file is #included in . +// Do not include this header file separately! + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ + +#include + +namespace testing { +namespace internal { + +// FilePath - a class for file and directory pathname manipulation which +// handles platform-specific conventions (like the pathname separator). +// Used for helper functions for naming files in a directory for xml output. +// Except for Set methods, all methods are const or static, which provides an +// "immutable value object" -- useful for peace of mind. +// A FilePath with a value ending in a path separator ("like/this/") represents +// a directory, otherwise it is assumed to represent a file. In either case, +// it may or may not represent an actual file or directory in the file system. +// Names are NOT checked for syntax correctness -- no checking for illegal +// characters, malformed paths, etc. + +class GTEST_API_ FilePath { + public: + FilePath() : pathname_("") { } + FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } + + explicit FilePath(const char* pathname) : pathname_(pathname) { + Normalize(); + } + + explicit FilePath(const String& pathname) : pathname_(pathname) { + Normalize(); + } + + FilePath& operator=(const FilePath& rhs) { + Set(rhs); + return *this; + } + + void Set(const FilePath& rhs) { + pathname_ = rhs.pathname_; + } + + String ToString() const { return pathname_; } + const char* c_str() const { return pathname_.c_str(); } + + // Returns the current working directory, or "" if unsuccessful. + static FilePath GetCurrentDir(); + + // Given directory = "dir", base_name = "test", number = 0, + // extension = "xml", returns "dir/test.xml". If number is greater + // than zero (e.g., 12), returns "dir/test_12.xml". + // On Windows platform, uses \ as the separator rather than /. + static FilePath MakeFileName(const FilePath& directory, + const FilePath& base_name, + int number, + const char* extension); + + // Given directory = "dir", relative_path = "test.xml", + // returns "dir/test.xml". + // On Windows, uses \ as the separator rather than /. + static FilePath ConcatPaths(const FilePath& directory, + const FilePath& relative_path); + + // Returns a pathname for a file that does not currently exist. The pathname + // will be directory/base_name.extension or + // directory/base_name_.extension if directory/base_name.extension + // already exists. The number will be incremented until a pathname is found + // that does not already exist. + // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. + // There could be a race condition if two or more processes are calling this + // function at the same time -- they could both pick the same filename. + static FilePath GenerateUniqueFileName(const FilePath& directory, + const FilePath& base_name, + const char* extension); + + // Returns true iff the path is NULL or "". + bool IsEmpty() const { return c_str() == NULL || *c_str() == '\0'; } + + // If input name has a trailing separator character, removes it and returns + // the name, otherwise return the name string unmodified. + // On Windows platform, uses \ as the separator, other platforms use /. + FilePath RemoveTrailingPathSeparator() const; + + // Returns a copy of the FilePath with the directory part removed. + // Example: FilePath("path/to/file").RemoveDirectoryName() returns + // FilePath("file"). If there is no directory part ("just_a_file"), it returns + // the FilePath unmodified. If there is no file part ("just_a_dir/") it + // returns an empty FilePath (""). + // On Windows platform, '\' is the path separator, otherwise it is '/'. + FilePath RemoveDirectoryName() const; + + // RemoveFileName returns the directory path with the filename removed. + // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". + // If the FilePath is "a_file" or "/a_file", RemoveFileName returns + // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does + // not have a file, like "just/a/dir/", it returns the FilePath unmodified. + // On Windows platform, '\' is the path separator, otherwise it is '/'. + FilePath RemoveFileName() const; + + // Returns a copy of the FilePath with the case-insensitive extension removed. + // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns + // FilePath("dir/file"). If a case-insensitive extension is not + // found, returns a copy of the original FilePath. + FilePath RemoveExtension(const char* extension) const; + + // Creates directories so that path exists. Returns true if successful or if + // the directories already exist; returns false if unable to create + // directories for any reason. Will also return false if the FilePath does + // not represent a directory (that is, it doesn't end with a path separator). + bool CreateDirectoriesRecursively() const; + + // Create the directory so that path exists. Returns true if successful or + // if the directory already exists; returns false if unable to create the + // directory for any reason, including if the parent directory does not + // exist. Not named "CreateDirectory" because that's a macro on Windows. + bool CreateFolder() const; + + // Returns true if FilePath describes something in the file-system, + // either a file, directory, or whatever, and that something exists. + bool FileOrDirectoryExists() const; + + // Returns true if pathname describes a directory in the file-system + // that exists. + bool DirectoryExists() const; + + // Returns true if FilePath ends with a path separator, which indicates that + // it is intended to represent a directory. Returns false otherwise. + // This does NOT check that a directory (or file) actually exists. + bool IsDirectory() const; + + // Returns true if pathname describes a root directory. (Windows has one + // root directory per disk drive.) + bool IsRootDirectory() const; + + // Returns true if pathname describes an absolute path. + bool IsAbsolutePath() const; + + private: + // Replaces multiple consecutive separators with a single separator. + // For example, "bar///foo" becomes "bar/foo". Does not eliminate other + // redundancies that might be in a pathname involving "." or "..". + // + // A pathname with multiple consecutive separators may occur either through + // user error or as a result of some scripts or APIs that generate a pathname + // with a trailing separator. On other platforms the same API or script + // may NOT generate a pathname with a trailing "/". Then elsewhere that + // pathname may have another "/" and pathname components added to it, + // without checking for the separator already being there. + // The script language and operating system may allow paths like "foo//bar" + // but some of the functions in FilePath will not handle that correctly. In + // particular, RemoveTrailingPathSeparator() only removes one separator, and + // it is called in CreateDirectoriesRecursively() assuming that it will change + // a pathname from directory syntax (trailing separator) to filename syntax. + // + // On Windows this method also replaces the alternate path separator '/' with + // the primary path separator '\\', so that for example "bar\\/\\foo" becomes + // "bar\\foo". + + void Normalize(); + + // Returns a pointer to the last occurence of a valid path separator in + // the FilePath. On Windows, for example, both '/' and '\' are valid path + // separators. Returns NULL if no path separator was found. + const char* FindLastPathSeparator() const; + + String pathname_; +}; // class FilePath + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h new file mode 100644 index 000000000..31a66e99d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h @@ -0,0 +1,923 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) +// +// The Google C++ Testing Framework (Google Test) +// +// This header file declares functions and macros used internally by +// Google Test. They are subject to change without notice. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ + +#include + +#if GTEST_OS_LINUX +#include +#include +#include +#include +#endif // GTEST_OS_LINUX + +#include +#include +#include +#include +#include + +#include +#include +#include + +// Due to C++ preprocessor weirdness, we need double indirection to +// concatenate two tokens when one of them is __LINE__. Writing +// +// foo ## __LINE__ +// +// will result in the token foo__LINE__, instead of foo followed by +// the current line number. For more details, see +// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 +#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) +#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar + +// Google Test defines the testing::Message class to allow construction of +// test messages via the << operator. The idea is that anything +// streamable to std::ostream can be streamed to a testing::Message. +// This allows a user to use his own types in Google Test assertions by +// overloading the << operator. +// +// util/gtl/stl_logging-inl.h overloads << for STL containers. These +// overloads cannot be defined in the std namespace, as that will be +// undefined behavior. Therefore, they are defined in the global +// namespace instead. +// +// C++'s symbol lookup rule (i.e. Koenig lookup) says that these +// overloads are visible in either the std namespace or the global +// namespace, but not other namespaces, including the testing +// namespace which Google Test's Message class is in. +// +// To allow STL containers (and other types that has a << operator +// defined in the global namespace) to be used in Google Test assertions, +// testing::Message must access the custom << operator from the global +// namespace. Hence this helper function. +// +// Note: Jeffrey Yasskin suggested an alternative fix by "using +// ::operator<<;" in the definition of Message's operator<<. That fix +// doesn't require a helper function, but unfortunately doesn't +// compile with MSVC. +template +inline void GTestStreamToHelper(std::ostream* os, const T& val) { + *os << val; +} + +namespace testing { + +// Forward declaration of classes. + +class AssertionResult; // Result of an assertion. +class Message; // Represents a failure message. +class Test; // Represents a test. +class TestInfo; // Information about a test. +class TestPartResult; // Result of a test part. +class UnitTest; // A collection of test cases. + +namespace internal { + +struct TraceInfo; // Information about a trace point. +class ScopedTrace; // Implements scoped trace. +class TestInfoImpl; // Opaque implementation of TestInfo +class UnitTestImpl; // Opaque implementation of UnitTest + +// How many times InitGoogleTest() has been called. +extern int g_init_gtest_count; + +// The text used in failure messages to indicate the start of the +// stack trace. +GTEST_API_ extern const char kStackTraceMarker[]; + +// A secret type that Google Test users don't know about. It has no +// definition on purpose. Therefore it's impossible to create a +// Secret object, which is what we want. +class Secret; + +// Two overloaded helpers for checking at compile time whether an +// expression is a null pointer literal (i.e. NULL or any 0-valued +// compile-time integral constant). Their return values have +// different sizes, so we can use sizeof() to test which version is +// picked by the compiler. These helpers have no implementations, as +// we only need their signatures. +// +// Given IsNullLiteralHelper(x), the compiler will pick the first +// version if x can be implicitly converted to Secret*, and pick the +// second version otherwise. Since Secret is a secret and incomplete +// type, the only expression a user can write that has type Secret* is +// a null pointer literal. Therefore, we know that x is a null +// pointer literal if and only if the first version is picked by the +// compiler. +char IsNullLiteralHelper(Secret* p); +char (&IsNullLiteralHelper(...))[2]; // NOLINT + +// A compile-time bool constant that is true if and only if x is a +// null pointer literal (i.e. NULL or any 0-valued compile-time +// integral constant). +#ifdef GTEST_ELLIPSIS_NEEDS_POD_ +// We lose support for NULL detection where the compiler doesn't like +// passing non-POD classes through ellipsis (...). +#define GTEST_IS_NULL_LITERAL_(x) false +#else +#define GTEST_IS_NULL_LITERAL_(x) \ + (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1) +#endif // GTEST_ELLIPSIS_NEEDS_POD_ + +// Appends the user-supplied message to the Google-Test-generated message. +GTEST_API_ String AppendUserMessage(const String& gtest_msg, + const Message& user_msg); + +// A helper class for creating scoped traces in user programs. +class GTEST_API_ ScopedTrace { + public: + // The c'tor pushes the given source file location and message onto + // a trace stack maintained by Google Test. + ScopedTrace(const char* file, int line, const Message& message); + + // The d'tor pops the info pushed by the c'tor. + // + // Note that the d'tor is not virtual in order to be efficient. + // Don't inherit from ScopedTrace! + ~ScopedTrace(); + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); +} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its + // c'tor and d'tor. Therefore it doesn't + // need to be used otherwise. + +// Converts a streamable value to a String. A NULL pointer is +// converted to "(null)". When the input value is a ::string, +// ::std::string, ::wstring, or ::std::wstring object, each NUL +// character in it is replaced with "\\0". +// Declared here but defined in gtest.h, so that it has access +// to the definition of the Message class, required by the ARM +// compiler. +template +String StreamableToString(const T& streamable); + +// Formats a value to be used in a failure message. + +#ifdef GTEST_NEEDS_IS_POINTER_ + +// These are needed as the Nokia Symbian and IBM XL C/C++ compilers +// cannot decide between const T& and const T* in a function template. +// These compilers _can_ decide between class template specializations +// for T and T*, so a tr1::type_traits-like is_pointer works, and we +// can overload on that. + +// This overload makes sure that all pointers (including +// those to char or wchar_t) are printed as raw pointers. +template +inline String FormatValueForFailureMessage(internal::true_type /*dummy*/, + T* pointer) { + return StreamableToString(static_cast(pointer)); +} + +template +inline String FormatValueForFailureMessage(internal::false_type /*dummy*/, + const T& value) { + return StreamableToString(value); +} + +template +inline String FormatForFailureMessage(const T& value) { + return FormatValueForFailureMessage( + typename internal::is_pointer::type(), value); +} + +#else + +// These are needed as the above solution using is_pointer has the +// limitation that T cannot be a type without external linkage, when +// compiled using MSVC. + +template +inline String FormatForFailureMessage(const T& value) { + return StreamableToString(value); +} + +// This overload makes sure that all pointers (including +// those to char or wchar_t) are printed as raw pointers. +template +inline String FormatForFailureMessage(T* pointer) { + return StreamableToString(static_cast(pointer)); +} + +#endif // GTEST_NEEDS_IS_POINTER_ + +// These overloaded versions handle narrow and wide characters. +GTEST_API_ String FormatForFailureMessage(char ch); +GTEST_API_ String FormatForFailureMessage(wchar_t wchar); + +// When this operand is a const char* or char*, and the other operand +// is a ::std::string or ::string, we print this operand as a C string +// rather than a pointer. We do the same for wide strings. + +// This internal macro is used to avoid duplicated code. +#define GTEST_FORMAT_IMPL_(operand2_type, operand1_printer)\ +inline String FormatForComparisonFailureMessage(\ + operand2_type::value_type* str, const operand2_type& /*operand2*/) {\ + return operand1_printer(str);\ +}\ +inline String FormatForComparisonFailureMessage(\ + const operand2_type::value_type* str, const operand2_type& /*operand2*/) {\ + return operand1_printer(str);\ +} + +GTEST_FORMAT_IMPL_(::std::string, String::ShowCStringQuoted) +#if GTEST_HAS_STD_WSTRING +GTEST_FORMAT_IMPL_(::std::wstring, String::ShowWideCStringQuoted) +#endif // GTEST_HAS_STD_WSTRING + +#if GTEST_HAS_GLOBAL_STRING +GTEST_FORMAT_IMPL_(::string, String::ShowCStringQuoted) +#endif // GTEST_HAS_GLOBAL_STRING +#if GTEST_HAS_GLOBAL_WSTRING +GTEST_FORMAT_IMPL_(::wstring, String::ShowWideCStringQuoted) +#endif // GTEST_HAS_GLOBAL_WSTRING + +#undef GTEST_FORMAT_IMPL_ + +// Constructs and returns the message for an equality assertion +// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. +// +// The first four parameters are the expressions used in the assertion +// and their values, as strings. For example, for ASSERT_EQ(foo, bar) +// where foo is 5 and bar is 6, we have: +// +// expected_expression: "foo" +// actual_expression: "bar" +// expected_value: "5" +// actual_value: "6" +// +// The ignoring_case parameter is true iff the assertion is a +// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will +// be inserted into the message. +GTEST_API_ AssertionResult EqFailure(const char* expected_expression, + const char* actual_expression, + const String& expected_value, + const String& actual_value, + bool ignoring_case); + +// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. +GTEST_API_ String GetBoolAssertionFailureMessage( + const AssertionResult& assertion_result, + const char* expression_text, + const char* actual_predicate_value, + const char* expected_predicate_value); + +// This template class represents an IEEE floating-point number +// (either single-precision or double-precision, depending on the +// template parameters). +// +// The purpose of this class is to do more sophisticated number +// comparison. (Due to round-off error, etc, it's very unlikely that +// two floating-points will be equal exactly. Hence a naive +// comparison by the == operation often doesn't work.) +// +// Format of IEEE floating-point: +// +// The most-significant bit being the leftmost, an IEEE +// floating-point looks like +// +// sign_bit exponent_bits fraction_bits +// +// Here, sign_bit is a single bit that designates the sign of the +// number. +// +// For float, there are 8 exponent bits and 23 fraction bits. +// +// For double, there are 11 exponent bits and 52 fraction bits. +// +// More details can be found at +// http://en.wikipedia.org/wiki/IEEE_floating-point_standard. +// +// Template parameter: +// +// RawType: the raw floating-point type (either float or double) +template +class FloatingPoint { + public: + // Defines the unsigned integer type that has the same size as the + // floating point number. + typedef typename TypeWithSize::UInt Bits; + + // Constants. + + // # of bits in a number. + static const size_t kBitCount = 8*sizeof(RawType); + + // # of fraction bits in a number. + static const size_t kFractionBitCount = + std::numeric_limits::digits - 1; + + // # of exponent bits in a number. + static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; + + // The mask for the sign bit. + static const Bits kSignBitMask = static_cast(1) << (kBitCount - 1); + + // The mask for the fraction bits. + static const Bits kFractionBitMask = + ~static_cast(0) >> (kExponentBitCount + 1); + + // The mask for the exponent bits. + static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); + + // How many ULP's (Units in the Last Place) we want to tolerate when + // comparing two numbers. The larger the value, the more error we + // allow. A 0 value means that two numbers must be exactly the same + // to be considered equal. + // + // The maximum error of a single floating-point operation is 0.5 + // units in the last place. On Intel CPU's, all floating-point + // calculations are done with 80-bit precision, while double has 64 + // bits. Therefore, 4 should be enough for ordinary use. + // + // See the following article for more details on ULP: + // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm. + static const size_t kMaxUlps = 4; + + // Constructs a FloatingPoint from a raw floating-point number. + // + // On an Intel CPU, passing a non-normalized NAN (Not a Number) + // around may change its bits, although the new value is guaranteed + // to be also a NAN. Therefore, don't expect this constructor to + // preserve the bits in x when x is a NAN. + explicit FloatingPoint(const RawType& x) { u_.value_ = x; } + + // Static methods + + // Reinterprets a bit pattern as a floating-point number. + // + // This function is needed to test the AlmostEquals() method. + static RawType ReinterpretBits(const Bits bits) { + FloatingPoint fp(0); + fp.u_.bits_ = bits; + return fp.u_.value_; + } + + // Returns the floating-point number that represent positive infinity. + static RawType Infinity() { + return ReinterpretBits(kExponentBitMask); + } + + // Non-static methods + + // Returns the bits that represents this number. + const Bits &bits() const { return u_.bits_; } + + // Returns the exponent bits of this number. + Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } + + // Returns the fraction bits of this number. + Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } + + // Returns the sign bit of this number. + Bits sign_bit() const { return kSignBitMask & u_.bits_; } + + // Returns true iff this is NAN (not a number). + bool is_nan() const { + // It's a NAN if the exponent bits are all ones and the fraction + // bits are not entirely zeros. + return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); + } + + // Returns true iff this number is at most kMaxUlps ULP's away from + // rhs. In particular, this function: + // + // - returns false if either number is (or both are) NAN. + // - treats really large numbers as almost equal to infinity. + // - thinks +0.0 and -0.0 are 0 DLP's apart. + bool AlmostEquals(const FloatingPoint& rhs) const { + // The IEEE standard says that any comparison operation involving + // a NAN must return false. + if (is_nan() || rhs.is_nan()) return false; + + return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) + <= kMaxUlps; + } + + private: + // The data type used to store the actual floating-point number. + union FloatingPointUnion { + RawType value_; // The raw floating-point number. + Bits bits_; // The bits that represent the number. + }; + + // Converts an integer from the sign-and-magnitude representation to + // the biased representation. More precisely, let N be 2 to the + // power of (kBitCount - 1), an integer x is represented by the + // unsigned number x + N. + // + // For instance, + // + // -N + 1 (the most negative number representable using + // sign-and-magnitude) is represented by 1; + // 0 is represented by N; and + // N - 1 (the biggest number representable using + // sign-and-magnitude) is represented by 2N - 1. + // + // Read http://en.wikipedia.org/wiki/Signed_number_representations + // for more details on signed number representations. + static Bits SignAndMagnitudeToBiased(const Bits &sam) { + if (kSignBitMask & sam) { + // sam represents a negative number. + return ~sam + 1; + } else { + // sam represents a positive number. + return kSignBitMask | sam; + } + } + + // Given two numbers in the sign-and-magnitude representation, + // returns the distance between them as an unsigned number. + static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, + const Bits &sam2) { + const Bits biased1 = SignAndMagnitudeToBiased(sam1); + const Bits biased2 = SignAndMagnitudeToBiased(sam2); + return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); + } + + FloatingPointUnion u_; +}; + +// Typedefs the instances of the FloatingPoint template class that we +// care to use. +typedef FloatingPoint Float; +typedef FloatingPoint Double; + +// In order to catch the mistake of putting tests that use different +// test fixture classes in the same test case, we need to assign +// unique IDs to fixture classes and compare them. The TypeId type is +// used to hold such IDs. The user should treat TypeId as an opaque +// type: the only operation allowed on TypeId values is to compare +// them for equality using the == operator. +typedef const void* TypeId; + +template +class TypeIdHelper { + public: + // dummy_ must not have a const type. Otherwise an overly eager + // compiler (e.g. MSVC 7.1 & 8.0) may try to merge + // TypeIdHelper::dummy_ for different Ts as an "optimization". + static bool dummy_; +}; + +template +bool TypeIdHelper::dummy_ = false; + +// GetTypeId() returns the ID of type T. Different values will be +// returned for different types. Calling the function twice with the +// same type argument is guaranteed to return the same ID. +template +TypeId GetTypeId() { + // The compiler is required to allocate a different + // TypeIdHelper::dummy_ variable for each T used to instantiate + // the template. Therefore, the address of dummy_ is guaranteed to + // be unique. + return &(TypeIdHelper::dummy_); +} + +// Returns the type ID of ::testing::Test. Always call this instead +// of GetTypeId< ::testing::Test>() to get the type ID of +// ::testing::Test, as the latter may give the wrong result due to a +// suspected linker bug when compiling Google Test as a Mac OS X +// framework. +GTEST_API_ TypeId GetTestTypeId(); + +// Defines the abstract factory interface that creates instances +// of a Test object. +class TestFactoryBase { + public: + virtual ~TestFactoryBase() {} + + // Creates a test instance to run. The instance is both created and destroyed + // within TestInfoImpl::Run() + virtual Test* CreateTest() = 0; + + protected: + TestFactoryBase() {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); +}; + +// This class provides implementation of TeastFactoryBase interface. +// It is used in TEST and TEST_F macros. +template +class TestFactoryImpl : public TestFactoryBase { + public: + virtual Test* CreateTest() { return new TestClass; } +}; + +#if GTEST_OS_WINDOWS + +// Predicate-formatters for implementing the HRESULT checking macros +// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} +// We pass a long instead of HRESULT to avoid causing an +// include dependency for the HRESULT type. +GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, + long hr); // NOLINT +GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, + long hr); // NOLINT + +#endif // GTEST_OS_WINDOWS + +// Formats a source file path and a line number as they would appear +// in a compiler error message. +inline String FormatFileLocation(const char* file, int line) { + const char* const file_name = file == NULL ? "unknown file" : file; + if (line < 0) { + return String::Format("%s:", file_name); + } +#ifdef _MSC_VER + return String::Format("%s(%d):", file_name, line); +#else + return String::Format("%s:%d:", file_name, line); +#endif // _MSC_VER +} + +// Types of SetUpTestCase() and TearDownTestCase() functions. +typedef void (*SetUpTestCaseFunc)(); +typedef void (*TearDownTestCaseFunc)(); + +// Creates a new TestInfo object and registers it with Google Test; +// returns the created object. +// +// Arguments: +// +// test_case_name: name of the test case +// name: name of the test +// test_case_comment: a comment on the test case that will be included in +// the test output +// comment: a comment on the test that will be included in the +// test output +// fixture_class_id: ID of the test fixture class +// set_up_tc: pointer to the function that sets up the test case +// tear_down_tc: pointer to the function that tears down the test case +// factory: pointer to the factory that creates a test object. +// The newly created TestInfo instance will assume +// ownership of the factory object. +GTEST_API_ TestInfo* MakeAndRegisterTestInfo( + const char* test_case_name, const char* name, + const char* test_case_comment, const char* comment, + TypeId fixture_class_id, + SetUpTestCaseFunc set_up_tc, + TearDownTestCaseFunc tear_down_tc, + TestFactoryBase* factory); + +// If *pstr starts with the given prefix, modifies *pstr to be right +// past the prefix and returns true; otherwise leaves *pstr unchanged +// and returns false. None of pstr, *pstr, and prefix can be NULL. +bool SkipPrefix(const char* prefix, const char** pstr); + +#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +// State of the definition of a type-parameterized test case. +class GTEST_API_ TypedTestCasePState { + public: + TypedTestCasePState() : registered_(false) {} + + // Adds the given test name to defined_test_names_ and return true + // if the test case hasn't been registered; otherwise aborts the + // program. + bool AddTestName(const char* file, int line, const char* case_name, + const char* test_name) { + if (registered_) { + fprintf(stderr, "%s Test %s must be defined before " + "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n", + FormatFileLocation(file, line).c_str(), test_name, case_name); + fflush(stderr); + posix::Abort(); + } + defined_test_names_.insert(test_name); + return true; + } + + // Verifies that registered_tests match the test names in + // defined_test_names_; returns registered_tests if successful, or + // aborts the program otherwise. + const char* VerifyRegisteredTestNames( + const char* file, int line, const char* registered_tests); + + private: + bool registered_; + ::std::set defined_test_names_; +}; + +// Skips to the first non-space char after the first comma in 'str'; +// returns NULL if no comma is found in 'str'. +inline const char* SkipComma(const char* str) { + const char* comma = strchr(str, ','); + if (comma == NULL) { + return NULL; + } + while (isspace(*(++comma))) {} + return comma; +} + +// Returns the prefix of 'str' before the first comma in it; returns +// the entire string if it contains no comma. +inline String GetPrefixUntilComma(const char* str) { + const char* comma = strchr(str, ','); + return comma == NULL ? String(str) : String(str, comma - str); +} + +// TypeParameterizedTest::Register() +// registers a list of type-parameterized tests with Google Test. The +// return value is insignificant - we just need to return something +// such that we can call this function in a namespace scope. +// +// Implementation note: The GTEST_TEMPLATE_ macro declares a template +// template parameter. It's defined in gtest-type-util.h. +template +class TypeParameterizedTest { + public: + // 'index' is the index of the test in the type list 'Types' + // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase, + // Types). Valid values for 'index' are [0, N - 1] where N is the + // length of Types. + static bool Register(const char* prefix, const char* case_name, + const char* test_names, int index) { + typedef typename Types::Head Type; + typedef Fixture FixtureClass; + typedef typename GTEST_BIND_(TestSel, Type) TestClass; + + // First, registers the first type-parameterized test in the type + // list. + MakeAndRegisterTestInfo( + String::Format("%s%s%s/%d", prefix, prefix[0] == '\0' ? "" : "/", + case_name, index).c_str(), + GetPrefixUntilComma(test_names).c_str(), + String::Format("TypeParam = %s", GetTypeName().c_str()).c_str(), + "", + GetTypeId(), + TestClass::SetUpTestCase, + TestClass::TearDownTestCase, + new TestFactoryImpl); + + // Next, recurses (at compile time) with the tail of the type list. + return TypeParameterizedTest + ::Register(prefix, case_name, test_names, index + 1); + } +}; + +// The base case for the compile time recursion. +template +class TypeParameterizedTest { + public: + static bool Register(const char* /*prefix*/, const char* /*case_name*/, + const char* /*test_names*/, int /*index*/) { + return true; + } +}; + +// TypeParameterizedTestCase::Register() +// registers *all combinations* of 'Tests' and 'Types' with Google +// Test. The return value is insignificant - we just need to return +// something such that we can call this function in a namespace scope. +template +class TypeParameterizedTestCase { + public: + static bool Register(const char* prefix, const char* case_name, + const char* test_names) { + typedef typename Tests::Head Head; + + // First, register the first test in 'Test' for each type in 'Types'. + TypeParameterizedTest::Register( + prefix, case_name, test_names, 0); + + // Next, recurses (at compile time) with the tail of the test list. + return TypeParameterizedTestCase + ::Register(prefix, case_name, SkipComma(test_names)); + } +}; + +// The base case for the compile time recursion. +template +class TypeParameterizedTestCase { + public: + static bool Register(const char* /*prefix*/, const char* /*case_name*/, + const char* /*test_names*/) { + return true; + } +}; + +#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +// Returns the current OS stack trace as a String. +// +// The maximum number of stack frames to be included is specified by +// the gtest_stack_trace_depth flag. The skip_count parameter +// specifies the number of top frames to be skipped, which doesn't +// count against the number of frames to be included. +// +// For example, if Foo() calls Bar(), which in turn calls +// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in +// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. +GTEST_API_ String GetCurrentOsStackTraceExceptTop(UnitTest* unit_test, + int skip_count); + +// Helpers for suppressing warnings on unreachable code or constant +// condition. + +// Always returns true. +GTEST_API_ bool AlwaysTrue(); + +// Always returns false. +inline bool AlwaysFalse() { return !AlwaysTrue(); } + +// A simple Linear Congruential Generator for generating random +// numbers with a uniform distribution. Unlike rand() and srand(), it +// doesn't use global state (and therefore can't interfere with user +// code). Unlike rand_r(), it's portable. An LCG isn't very random, +// but it's good enough for our purposes. +class GTEST_API_ Random { + public: + static const UInt32 kMaxRange = 1u << 31; + + explicit Random(UInt32 seed) : state_(seed) {} + + void Reseed(UInt32 seed) { state_ = seed; } + + // Generates a random number from [0, range). Crashes if 'range' is + // 0 or greater than kMaxRange. + UInt32 Generate(UInt32 range); + + private: + UInt32 state_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); +}; + +} // namespace internal +} // namespace testing + +#define GTEST_MESSAGE_(message, result_type) \ + ::testing::internal::AssertHelper(result_type, __FILE__, __LINE__, message) \ + = ::testing::Message() + +#define GTEST_FATAL_FAILURE_(message) \ + return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) + +#define GTEST_NONFATAL_FAILURE_(message) \ + GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) + +#define GTEST_SUCCESS_(message) \ + GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) + +// Suppresses MSVC warnings 4072 (unreachable code) for the code following +// statement if it returns or throws (or doesn't return or throw in some +// situations). +#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ + if (::testing::internal::AlwaysTrue()) { statement; } + +#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const char* gtest_msg = "") { \ + bool gtest_caught_expected = false; \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } \ + catch (expected_exception const&) { \ + gtest_caught_expected = true; \ + } \ + catch (...) { \ + gtest_msg = "Expected: " #statement " throws an exception of type " \ + #expected_exception ".\n Actual: it throws a different " \ + "type."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } \ + if (!gtest_caught_expected) { \ + gtest_msg = "Expected: " #statement " throws an exception of type " \ + #expected_exception ".\n Actual: it throws nothing."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ + fail(gtest_msg) + +#define GTEST_TEST_NO_THROW_(statement, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const char* gtest_msg = "") { \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } \ + catch (...) { \ + gtest_msg = "Expected: " #statement " doesn't throw an exception.\n" \ + " Actual: it throws."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ + fail(gtest_msg) + +#define GTEST_TEST_ANY_THROW_(statement, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const char* gtest_msg = "") { \ + bool gtest_caught_any = false; \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } \ + catch (...) { \ + gtest_caught_any = true; \ + } \ + if (!gtest_caught_any) { \ + gtest_msg = "Expected: " #statement " throws an exception.\n" \ + " Actual: it doesn't."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ + fail(gtest_msg) + + +// Implements Boolean test assertions such as EXPECT_TRUE. expression can be +// either a boolean expression or an AssertionResult. text is a textual +// represenation of expression as it was passed into the EXPECT_TRUE. +#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const ::testing::AssertionResult gtest_ar_ = \ + ::testing::AssertionResult(expression)) \ + ; \ + else \ + fail(::testing::internal::GetBoolAssertionFailureMessage(\ + gtest_ar_, text, #actual, #expected).c_str()) + +#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const char* gtest_msg = "") { \ + ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ + gtest_msg = "Expected: " #statement " doesn't generate new fatal " \ + "failures in the current thread.\n" \ + " Actual: it does."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ + fail(gtest_msg) + +// Expands to the name of the class that implements the given test. +#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ + test_case_name##_##test_name##_Test + +// Helper macro for defining tests. +#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\ +class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ + public:\ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ + private:\ + virtual void TestBody();\ + static ::testing::TestInfo* const test_info_;\ + GTEST_DISALLOW_COPY_AND_ASSIGN_(\ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ +};\ +\ +::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ + ::test_info_ =\ + ::testing::internal::MakeAndRegisterTestInfo(\ + #test_case_name, #test_name, "", "", \ + (parent_id), \ + parent_class::SetUpTestCase, \ + parent_class::TearDownTestCase, \ + new ::testing::internal::TestFactoryImpl<\ + GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ +void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h new file mode 100644 index 000000000..540ef4cd4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h @@ -0,0 +1,242 @@ +// Copyright 2003 Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: Dan Egnor (egnor@google.com) +// +// A "smart" pointer type with reference tracking. Every pointer to a +// particular object is kept on a circular linked list. When the last pointer +// to an object is destroyed or reassigned, the object is deleted. +// +// Used properly, this deletes the object when the last reference goes away. +// There are several caveats: +// - Like all reference counting schemes, cycles lead to leaks. +// - Each smart pointer is actually two pointers (8 bytes instead of 4). +// - Every time a pointer is assigned, the entire list of pointers to that +// object is traversed. This class is therefore NOT SUITABLE when there +// will often be more than two or three pointers to a particular object. +// - References are only tracked as long as linked_ptr<> objects are copied. +// If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS +// will happen (double deletion). +// +// A good use of this class is storing object references in STL containers. +// You can safely put linked_ptr<> in a vector<>. +// Other uses may not be as good. +// +// Note: If you use an incomplete type with linked_ptr<>, the class +// *containing* linked_ptr<> must have a constructor and destructor (even +// if they do nothing!). +// +// Bill Gibbons suggested we use something like this. +// +// Thread Safety: +// Unlike other linked_ptr implementations, in this implementation +// a linked_ptr object is thread-safe in the sense that: +// - it's safe to copy linked_ptr objects concurrently, +// - it's safe to copy *from* a linked_ptr and read its underlying +// raw pointer (e.g. via get()) concurrently, and +// - it's safe to write to two linked_ptrs that point to the same +// shared object concurrently. +// TODO(wan@google.com): rename this to safe_linked_ptr to avoid +// confusion with normal linked_ptr. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ + +#include +#include + +#include + +namespace testing { +namespace internal { + +// Protects copying of all linked_ptr objects. +GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex); + +// This is used internally by all instances of linked_ptr<>. It needs to be +// a non-template class because different types of linked_ptr<> can refer to +// the same object (linked_ptr(obj) vs linked_ptr(obj)). +// So, it needs to be possible for different types of linked_ptr to participate +// in the same circular linked list, so we need a single class type here. +// +// DO NOT USE THIS CLASS DIRECTLY YOURSELF. Use linked_ptr. +class linked_ptr_internal { + public: + // Create a new circle that includes only this instance. + void join_new() { + next_ = this; + } + + // Many linked_ptr operations may change p.link_ for some linked_ptr + // variable p in the same circle as this object. Therefore we need + // to prevent two such operations from occurring concurrently. + // + // Note that different types of linked_ptr objects can coexist in a + // circle (e.g. linked_ptr, linked_ptr, and + // linked_ptr). Therefore we must use a single mutex to + // protect all linked_ptr objects. This can create serious + // contention in production code, but is acceptable in a testing + // framework. + + // Join an existing circle. + // L < g_linked_ptr_mutex + void join(linked_ptr_internal const* ptr) { + MutexLock lock(&g_linked_ptr_mutex); + + linked_ptr_internal const* p = ptr; + while (p->next_ != ptr) p = p->next_; + p->next_ = this; + next_ = ptr; + } + + // Leave whatever circle we're part of. Returns true if we were the + // last member of the circle. Once this is done, you can join() another. + // L < g_linked_ptr_mutex + bool depart() { + MutexLock lock(&g_linked_ptr_mutex); + + if (next_ == this) return true; + linked_ptr_internal const* p = next_; + while (p->next_ != this) p = p->next_; + p->next_ = next_; + return false; + } + + private: + mutable linked_ptr_internal const* next_; +}; + +template +class linked_ptr { + public: + typedef T element_type; + + // Take over ownership of a raw pointer. This should happen as soon as + // possible after the object is created. + explicit linked_ptr(T* ptr = NULL) { capture(ptr); } + ~linked_ptr() { depart(); } + + // Copy an existing linked_ptr<>, adding ourselves to the list of references. + template linked_ptr(linked_ptr const& ptr) { copy(&ptr); } + linked_ptr(linked_ptr const& ptr) { // NOLINT + assert(&ptr != this); + copy(&ptr); + } + + // Assignment releases the old value and acquires the new. + template linked_ptr& operator=(linked_ptr const& ptr) { + depart(); + copy(&ptr); + return *this; + } + + linked_ptr& operator=(linked_ptr const& ptr) { + if (&ptr != this) { + depart(); + copy(&ptr); + } + return *this; + } + + // Smart pointer members. + void reset(T* ptr = NULL) { + depart(); + capture(ptr); + } + T* get() const { return value_; } + T* operator->() const { return value_; } + T& operator*() const { return *value_; } + // Release ownership of the pointed object and returns it. + // Sole ownership by this linked_ptr object is required. + T* release() { + bool last = link_.depart(); + assert(last); + T* v = value_; + value_ = NULL; + return v; + } + + bool operator==(T* p) const { return value_ == p; } + bool operator!=(T* p) const { return value_ != p; } + template + bool operator==(linked_ptr const& ptr) const { + return value_ == ptr.get(); + } + template + bool operator!=(linked_ptr const& ptr) const { + return value_ != ptr.get(); + } + + private: + template + friend class linked_ptr; + + T* value_; + linked_ptr_internal link_; + + void depart() { + if (link_.depart()) delete value_; + } + + void capture(T* ptr) { + value_ = ptr; + link_.join_new(); + } + + template void copy(linked_ptr const* ptr) { + value_ = ptr->get(); + if (value_) + link_.join(&ptr->link_); + else + link_.join_new(); + } +}; + +template inline +bool operator==(T* ptr, const linked_ptr& x) { + return ptr == x.get(); +} + +template inline +bool operator!=(T* ptr, const linked_ptr& x) { + return ptr != x.get(); +} + +// A function to convert T* into linked_ptr +// Doing e.g. make_linked_ptr(new FooBarBaz(arg)) is a shorter notation +// for linked_ptr >(new FooBarBaz(arg)) +template +linked_ptr make_linked_ptr(T* ptr) { + return linked_ptr(ptr); +} + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h new file mode 100644 index 000000000..ab4ab5662 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h @@ -0,0 +1,4820 @@ +// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! + +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) + +// Type and function utilities for implementing parameterized tests. +// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +// Currently Google Test supports at most 50 arguments in Values, +// and at most 10 arguments in Combine. Please contact +// googletestframework@googlegroups.com if you need more. +// Please note that the number of arguments to Combine is limited +// by the maximum arity of the implementation of tr1::tuple which is +// currently set at 10. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ + +// scripts/fuse_gtest.py depends on gtest's own header being #included +// *unconditionally*. Therefore these #includes cannot be moved +// inside #if GTEST_HAS_PARAM_TEST. +#include +#include + +#if GTEST_HAS_PARAM_TEST + +namespace testing { + +// Forward declarations of ValuesIn(), which is implemented in +// include/gtest/gtest-param-test.h. +template +internal::ParamGenerator< + typename ::std::iterator_traits::value_type> ValuesIn( + ForwardIterator begin, ForwardIterator end); + +template +internal::ParamGenerator ValuesIn(const T (&array)[N]); + +template +internal::ParamGenerator ValuesIn( + const Container& container); + +namespace internal { + +// Used in the Values() function to provide polymorphic capabilities. +template +class ValueArray1 { + public: + explicit ValueArray1(T1 v1) : v1_(v1) {} + + template + operator ParamGenerator() const { return ValuesIn(&v1_, &v1_ + 1); } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray1& other); + + const T1 v1_; +}; + +template +class ValueArray2 { + public: + ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray2& other); + + const T1 v1_; + const T2 v2_; +}; + +template +class ValueArray3 { + public: + ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray3& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; +}; + +template +class ValueArray4 { + public: + ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3), + v4_(v4) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray4& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; +}; + +template +class ValueArray5 { + public: + ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3), + v4_(v4), v5_(v5) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray5& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; +}; + +template +class ValueArray6 { + public: + ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2), + v3_(v3), v4_(v4), v5_(v5), v6_(v6) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray6& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; +}; + +template +class ValueArray7 { + public: + ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1), + v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray7& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; +}; + +template +class ValueArray8 { + public: + ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, + T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray8& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; +}; + +template +class ValueArray9 { + public: + ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, + T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray9& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; +}; + +template +class ValueArray10 { + public: + ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray10& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; +}; + +template +class ValueArray11 { + public: + ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), + v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray11& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; +}; + +template +class ValueArray12 { + public: + ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), + v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray12& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; +}; + +template +class ValueArray13 { + public: + ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), + v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), + v12_(v12), v13_(v13) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray13& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; +}; + +template +class ValueArray14 { + public: + ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3), + v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray14& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; +}; + +template +class ValueArray15 { + public: + ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2), + v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray15& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; +}; + +template +class ValueArray16 { + public: + ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1), + v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), + v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), + v16_(v16) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray16& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; +}; + +template +class ValueArray17 { + public: + ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, + T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray17& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; +}; + +template +class ValueArray18 { + public: + ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray18& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; +}; + +template +class ValueArray19 { + public: + ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), + v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), + v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray19& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; +}; + +template +class ValueArray20 { + public: + ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), + v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), + v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), + v19_(v19), v20_(v20) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray20& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; +}; + +template +class ValueArray21 { + public: + ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), + v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), + v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), + v18_(v18), v19_(v19), v20_(v20), v21_(v21) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray21& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; +}; + +template +class ValueArray22 { + public: + ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3), + v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray22& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; +}; + +template +class ValueArray23 { + public: + ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2), + v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), + v23_(v23) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, + v23_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray23& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; +}; + +template +class ValueArray24 { + public: + ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1), + v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), + v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), + v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), + v22_(v22), v23_(v23), v24_(v24) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray24& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; +}; + +template +class ValueArray25 { + public: + ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, + T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray25& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; +}; + +template +class ValueArray26 { + public: + ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray26& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; +}; + +template +class ValueArray27 { + public: + ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), + v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), + v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), + v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), + v26_(v26), v27_(v27) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray27& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; +}; + +template +class ValueArray28 { + public: + ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), + v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), + v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), + v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), + v25_(v25), v26_(v26), v27_(v27), v28_(v28) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray28& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; +}; + +template +class ValueArray29 { + public: + ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), + v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), + v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), + v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), + v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray29& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; +}; + +template +class ValueArray30 { + public: + ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3), + v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), + v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), + v29_(v29), v30_(v30) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray30& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; +}; + +template +class ValueArray31 { + public: + ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2), + v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), + v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), + v29_(v29), v30_(v30), v31_(v31) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray31& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; +}; + +template +class ValueArray32 { + public: + ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1), + v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), + v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), + v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), + v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), + v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray32& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; +}; + +template +class ValueArray33 { + public: + ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, + T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), + v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), + v33_(v33) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray33& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; +}; + +template +class ValueArray34 { + public: + ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), + v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), + v33_(v33), v34_(v34) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray34& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; +}; + +template +class ValueArray35 { + public: + ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), + v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), + v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), + v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), + v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), + v32_(v32), v33_(v33), v34_(v34), v35_(v35) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, + v35_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray35& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; +}; + +template +class ValueArray36 { + public: + ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), + v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), + v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), + v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), + v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), + v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray36& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; +}; + +template +class ValueArray37 { + public: + ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), + v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), + v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), + v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), + v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), + v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), + v36_(v36), v37_(v37) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray37& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; +}; + +template +class ValueArray38 { + public: + ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3), + v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), + v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), + v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), + v35_(v35), v36_(v36), v37_(v37), v38_(v38) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray38& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; +}; + +template +class ValueArray39 { + public: + ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2), + v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), + v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), + v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), + v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray39& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; +}; + +template +class ValueArray40 { + public: + ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1), + v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), + v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), + v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), + v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), + v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), + v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), + v40_(v40) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray40& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; +}; + +template +class ValueArray41 { + public: + ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, + T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), + v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), + v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), + v39_(v39), v40_(v40), v41_(v41) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray41& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; +}; + +template +class ValueArray42 { + public: + ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), + v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), + v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), + v39_(v39), v40_(v40), v41_(v41), v42_(v42) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray42& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; +}; + +template +class ValueArray43 { + public: + ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), + v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), + v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), + v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), + v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), + v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), + v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray43& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; +}; + +template +class ValueArray44 { + public: + ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), + v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), + v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), + v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), + v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), + v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), + v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), + v43_(v43), v44_(v44) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray44& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; + const T44 v44_; +}; + +template +class ValueArray45 { + public: + ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), + v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), + v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), + v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), + v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), + v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), + v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), + v42_(v42), v43_(v43), v44_(v44), v45_(v45) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray45& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; + const T44 v44_; + const T45 v45_; +}; + +template +class ValueArray46 { + public: + ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3), + v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), + v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), + v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), + v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), + v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray46& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; + const T44 v44_; + const T45 v45_; + const T46 v46_; +}; + +template +class ValueArray47 { + public: + ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2), + v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), + v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), + v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), + v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), + v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), + v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), + v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46), + v47_(v47) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, + v47_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray47& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; + const T44 v44_; + const T45 v45_; + const T46 v46_; + const T47 v47_; +}; + +template +class ValueArray48 { + public: + ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1), + v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), + v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), + v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), + v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), + v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), + v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), + v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), + v46_(v46), v47_(v47), v48_(v48) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, + v48_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray48& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; + const T44 v44_; + const T45 v45_; + const T46 v46_; + const T47 v47_; + const T48 v48_; +}; + +template +class ValueArray49 { + public: + ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, + T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), + v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), + v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), + v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), + v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, + v48_, v49_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray49& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; + const T44 v44_; + const T45 v45_; + const T46 v46_; + const T47 v47_; + const T48 v48_; + const T49 v49_; +}; + +template +class ValueArray50 { + public: + ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, + T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, + T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, + T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, + T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41, + T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49, + T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), + v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), + v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), + v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), + v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), + v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), + v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), + v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {} + + template + operator ParamGenerator() const { + const T array[] = {v1_, v2_, v3_, v4_, v5_, v6_, v7_, v8_, v9_, v10_, v11_, + v12_, v13_, v14_, v15_, v16_, v17_, v18_, v19_, v20_, v21_, v22_, v23_, + v24_, v25_, v26_, v27_, v28_, v29_, v30_, v31_, v32_, v33_, v34_, v35_, + v36_, v37_, v38_, v39_, v40_, v41_, v42_, v43_, v44_, v45_, v46_, v47_, + v48_, v49_, v50_}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray50& other); + + const T1 v1_; + const T2 v2_; + const T3 v3_; + const T4 v4_; + const T5 v5_; + const T6 v6_; + const T7 v7_; + const T8 v8_; + const T9 v9_; + const T10 v10_; + const T11 v11_; + const T12 v12_; + const T13 v13_; + const T14 v14_; + const T15 v15_; + const T16 v16_; + const T17 v17_; + const T18 v18_; + const T19 v19_; + const T20 v20_; + const T21 v21_; + const T22 v22_; + const T23 v23_; + const T24 v24_; + const T25 v25_; + const T26 v26_; + const T27 v27_; + const T28 v28_; + const T29 v29_; + const T30 v30_; + const T31 v31_; + const T32 v32_; + const T33 v33_; + const T34 v34_; + const T35 v35_; + const T36 v36_; + const T37 v37_; + const T38 v38_; + const T39 v39_; + const T40 v40_; + const T41 v41_; + const T42 v42_; + const T43 v43_; + const T44 v44_; + const T45 v45_; + const T46 v46_; + const T47 v47_; + const T48 v48_; + const T49 v49_; + const T50 v50_; +}; + +#if GTEST_HAS_COMBINE +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Generates values from the Cartesian product of values produced +// by the argument generators. +// +template +class CartesianProductGenerator2 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator2(const ParamGenerator& g1, + const ParamGenerator& g2) + : g1_(g1), g2_(g2) {} + virtual ~CartesianProductGenerator2() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current2_; + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + ParamType current_value_; + }; // class CartesianProductGenerator2::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator2& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; +}; // class CartesianProductGenerator2 + + +template +class CartesianProductGenerator3 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator3(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3) + : g1_(g1), g2_(g2), g3_(g3) {} + virtual ~CartesianProductGenerator3() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current3_; + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + ParamType current_value_; + }; // class CartesianProductGenerator3::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator3& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; +}; // class CartesianProductGenerator3 + + +template +class CartesianProductGenerator4 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator4(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3, + const ParamGenerator& g4) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} + virtual ~CartesianProductGenerator4() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin(), g4_, g4_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), + g4_, g4_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3, + const ParamGenerator& g4, + const typename ParamGenerator::iterator& current4) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3), + begin4_(g4.begin()), end4_(g4.end()), current4_(current4) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current4_; + if (current4_ == end4_) { + current4_ = begin4_; + ++current3_; + } + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_ && + current4_ == typed_other->current4_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_), + begin4_(other.begin4_), + end4_(other.end4_), + current4_(other.current4_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_, + *current4_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_ || + current4_ == end4_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + const typename ParamGenerator::iterator begin4_; + const typename ParamGenerator::iterator end4_; + typename ParamGenerator::iterator current4_; + ParamType current_value_; + }; // class CartesianProductGenerator4::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator4& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; + const ParamGenerator g4_; +}; // class CartesianProductGenerator4 + + +template +class CartesianProductGenerator5 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator5(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3, + const ParamGenerator& g4, const ParamGenerator& g5) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} + virtual ~CartesianProductGenerator5() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), + g4_, g4_.end(), g5_, g5_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3, + const ParamGenerator& g4, + const typename ParamGenerator::iterator& current4, + const ParamGenerator& g5, + const typename ParamGenerator::iterator& current5) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3), + begin4_(g4.begin()), end4_(g4.end()), current4_(current4), + begin5_(g5.begin()), end5_(g5.end()), current5_(current5) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current5_; + if (current5_ == end5_) { + current5_ = begin5_; + ++current4_; + } + if (current4_ == end4_) { + current4_ = begin4_; + ++current3_; + } + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_ && + current4_ == typed_other->current4_ && + current5_ == typed_other->current5_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_), + begin4_(other.begin4_), + end4_(other.end4_), + current4_(other.current4_), + begin5_(other.begin5_), + end5_(other.end5_), + current5_(other.current5_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_, + *current4_, *current5_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_ || + current4_ == end4_ || + current5_ == end5_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + const typename ParamGenerator::iterator begin4_; + const typename ParamGenerator::iterator end4_; + typename ParamGenerator::iterator current4_; + const typename ParamGenerator::iterator begin5_; + const typename ParamGenerator::iterator end5_; + typename ParamGenerator::iterator current5_; + ParamType current_value_; + }; // class CartesianProductGenerator5::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator5& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; + const ParamGenerator g4_; + const ParamGenerator g5_; +}; // class CartesianProductGenerator5 + + +template +class CartesianProductGenerator6 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator6(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3, + const ParamGenerator& g4, const ParamGenerator& g5, + const ParamGenerator& g6) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} + virtual ~CartesianProductGenerator6() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), + g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3, + const ParamGenerator& g4, + const typename ParamGenerator::iterator& current4, + const ParamGenerator& g5, + const typename ParamGenerator::iterator& current5, + const ParamGenerator& g6, + const typename ParamGenerator::iterator& current6) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3), + begin4_(g4.begin()), end4_(g4.end()), current4_(current4), + begin5_(g5.begin()), end5_(g5.end()), current5_(current5), + begin6_(g6.begin()), end6_(g6.end()), current6_(current6) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current6_; + if (current6_ == end6_) { + current6_ = begin6_; + ++current5_; + } + if (current5_ == end5_) { + current5_ = begin5_; + ++current4_; + } + if (current4_ == end4_) { + current4_ = begin4_; + ++current3_; + } + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_ && + current4_ == typed_other->current4_ && + current5_ == typed_other->current5_ && + current6_ == typed_other->current6_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_), + begin4_(other.begin4_), + end4_(other.end4_), + current4_(other.current4_), + begin5_(other.begin5_), + end5_(other.end5_), + current5_(other.current5_), + begin6_(other.begin6_), + end6_(other.end6_), + current6_(other.current6_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_, + *current4_, *current5_, *current6_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_ || + current4_ == end4_ || + current5_ == end5_ || + current6_ == end6_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + const typename ParamGenerator::iterator begin4_; + const typename ParamGenerator::iterator end4_; + typename ParamGenerator::iterator current4_; + const typename ParamGenerator::iterator begin5_; + const typename ParamGenerator::iterator end5_; + typename ParamGenerator::iterator current5_; + const typename ParamGenerator::iterator begin6_; + const typename ParamGenerator::iterator end6_; + typename ParamGenerator::iterator current6_; + ParamType current_value_; + }; // class CartesianProductGenerator6::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator6& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; + const ParamGenerator g4_; + const ParamGenerator g5_; + const ParamGenerator g6_; +}; // class CartesianProductGenerator6 + + +template +class CartesianProductGenerator7 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator7(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3, + const ParamGenerator& g4, const ParamGenerator& g5, + const ParamGenerator& g6, const ParamGenerator& g7) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} + virtual ~CartesianProductGenerator7() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, + g7_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), + g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3, + const ParamGenerator& g4, + const typename ParamGenerator::iterator& current4, + const ParamGenerator& g5, + const typename ParamGenerator::iterator& current5, + const ParamGenerator& g6, + const typename ParamGenerator::iterator& current6, + const ParamGenerator& g7, + const typename ParamGenerator::iterator& current7) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3), + begin4_(g4.begin()), end4_(g4.end()), current4_(current4), + begin5_(g5.begin()), end5_(g5.end()), current5_(current5), + begin6_(g6.begin()), end6_(g6.end()), current6_(current6), + begin7_(g7.begin()), end7_(g7.end()), current7_(current7) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current7_; + if (current7_ == end7_) { + current7_ = begin7_; + ++current6_; + } + if (current6_ == end6_) { + current6_ = begin6_; + ++current5_; + } + if (current5_ == end5_) { + current5_ = begin5_; + ++current4_; + } + if (current4_ == end4_) { + current4_ = begin4_; + ++current3_; + } + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_ && + current4_ == typed_other->current4_ && + current5_ == typed_other->current5_ && + current6_ == typed_other->current6_ && + current7_ == typed_other->current7_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_), + begin4_(other.begin4_), + end4_(other.end4_), + current4_(other.current4_), + begin5_(other.begin5_), + end5_(other.end5_), + current5_(other.current5_), + begin6_(other.begin6_), + end6_(other.end6_), + current6_(other.current6_), + begin7_(other.begin7_), + end7_(other.end7_), + current7_(other.current7_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_, + *current4_, *current5_, *current6_, *current7_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_ || + current4_ == end4_ || + current5_ == end5_ || + current6_ == end6_ || + current7_ == end7_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + const typename ParamGenerator::iterator begin4_; + const typename ParamGenerator::iterator end4_; + typename ParamGenerator::iterator current4_; + const typename ParamGenerator::iterator begin5_; + const typename ParamGenerator::iterator end5_; + typename ParamGenerator::iterator current5_; + const typename ParamGenerator::iterator begin6_; + const typename ParamGenerator::iterator end6_; + typename ParamGenerator::iterator current6_; + const typename ParamGenerator::iterator begin7_; + const typename ParamGenerator::iterator end7_; + typename ParamGenerator::iterator current7_; + ParamType current_value_; + }; // class CartesianProductGenerator7::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator7& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; + const ParamGenerator g4_; + const ParamGenerator g5_; + const ParamGenerator g6_; + const ParamGenerator g7_; +}; // class CartesianProductGenerator7 + + +template +class CartesianProductGenerator8 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator8(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3, + const ParamGenerator& g4, const ParamGenerator& g5, + const ParamGenerator& g6, const ParamGenerator& g7, + const ParamGenerator& g8) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), + g8_(g8) {} + virtual ~CartesianProductGenerator8() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, + g7_.begin(), g8_, g8_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), + g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, + g8_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3, + const ParamGenerator& g4, + const typename ParamGenerator::iterator& current4, + const ParamGenerator& g5, + const typename ParamGenerator::iterator& current5, + const ParamGenerator& g6, + const typename ParamGenerator::iterator& current6, + const ParamGenerator& g7, + const typename ParamGenerator::iterator& current7, + const ParamGenerator& g8, + const typename ParamGenerator::iterator& current8) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3), + begin4_(g4.begin()), end4_(g4.end()), current4_(current4), + begin5_(g5.begin()), end5_(g5.end()), current5_(current5), + begin6_(g6.begin()), end6_(g6.end()), current6_(current6), + begin7_(g7.begin()), end7_(g7.end()), current7_(current7), + begin8_(g8.begin()), end8_(g8.end()), current8_(current8) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current8_; + if (current8_ == end8_) { + current8_ = begin8_; + ++current7_; + } + if (current7_ == end7_) { + current7_ = begin7_; + ++current6_; + } + if (current6_ == end6_) { + current6_ = begin6_; + ++current5_; + } + if (current5_ == end5_) { + current5_ = begin5_; + ++current4_; + } + if (current4_ == end4_) { + current4_ = begin4_; + ++current3_; + } + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_ && + current4_ == typed_other->current4_ && + current5_ == typed_other->current5_ && + current6_ == typed_other->current6_ && + current7_ == typed_other->current7_ && + current8_ == typed_other->current8_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_), + begin4_(other.begin4_), + end4_(other.end4_), + current4_(other.current4_), + begin5_(other.begin5_), + end5_(other.end5_), + current5_(other.current5_), + begin6_(other.begin6_), + end6_(other.end6_), + current6_(other.current6_), + begin7_(other.begin7_), + end7_(other.end7_), + current7_(other.current7_), + begin8_(other.begin8_), + end8_(other.end8_), + current8_(other.current8_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_, + *current4_, *current5_, *current6_, *current7_, *current8_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_ || + current4_ == end4_ || + current5_ == end5_ || + current6_ == end6_ || + current7_ == end7_ || + current8_ == end8_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + const typename ParamGenerator::iterator begin4_; + const typename ParamGenerator::iterator end4_; + typename ParamGenerator::iterator current4_; + const typename ParamGenerator::iterator begin5_; + const typename ParamGenerator::iterator end5_; + typename ParamGenerator::iterator current5_; + const typename ParamGenerator::iterator begin6_; + const typename ParamGenerator::iterator end6_; + typename ParamGenerator::iterator current6_; + const typename ParamGenerator::iterator begin7_; + const typename ParamGenerator::iterator end7_; + typename ParamGenerator::iterator current7_; + const typename ParamGenerator::iterator begin8_; + const typename ParamGenerator::iterator end8_; + typename ParamGenerator::iterator current8_; + ParamType current_value_; + }; // class CartesianProductGenerator8::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator8& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; + const ParamGenerator g4_; + const ParamGenerator g5_; + const ParamGenerator g6_; + const ParamGenerator g7_; + const ParamGenerator g8_; +}; // class CartesianProductGenerator8 + + +template +class CartesianProductGenerator9 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator9(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3, + const ParamGenerator& g4, const ParamGenerator& g5, + const ParamGenerator& g6, const ParamGenerator& g7, + const ParamGenerator& g8, const ParamGenerator& g9) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), + g9_(g9) {} + virtual ~CartesianProductGenerator9() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, + g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), + g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, + g8_.end(), g9_, g9_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3, + const ParamGenerator& g4, + const typename ParamGenerator::iterator& current4, + const ParamGenerator& g5, + const typename ParamGenerator::iterator& current5, + const ParamGenerator& g6, + const typename ParamGenerator::iterator& current6, + const ParamGenerator& g7, + const typename ParamGenerator::iterator& current7, + const ParamGenerator& g8, + const typename ParamGenerator::iterator& current8, + const ParamGenerator& g9, + const typename ParamGenerator::iterator& current9) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3), + begin4_(g4.begin()), end4_(g4.end()), current4_(current4), + begin5_(g5.begin()), end5_(g5.end()), current5_(current5), + begin6_(g6.begin()), end6_(g6.end()), current6_(current6), + begin7_(g7.begin()), end7_(g7.end()), current7_(current7), + begin8_(g8.begin()), end8_(g8.end()), current8_(current8), + begin9_(g9.begin()), end9_(g9.end()), current9_(current9) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current9_; + if (current9_ == end9_) { + current9_ = begin9_; + ++current8_; + } + if (current8_ == end8_) { + current8_ = begin8_; + ++current7_; + } + if (current7_ == end7_) { + current7_ = begin7_; + ++current6_; + } + if (current6_ == end6_) { + current6_ = begin6_; + ++current5_; + } + if (current5_ == end5_) { + current5_ = begin5_; + ++current4_; + } + if (current4_ == end4_) { + current4_ = begin4_; + ++current3_; + } + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_ && + current4_ == typed_other->current4_ && + current5_ == typed_other->current5_ && + current6_ == typed_other->current6_ && + current7_ == typed_other->current7_ && + current8_ == typed_other->current8_ && + current9_ == typed_other->current9_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_), + begin4_(other.begin4_), + end4_(other.end4_), + current4_(other.current4_), + begin5_(other.begin5_), + end5_(other.end5_), + current5_(other.current5_), + begin6_(other.begin6_), + end6_(other.end6_), + current6_(other.current6_), + begin7_(other.begin7_), + end7_(other.end7_), + current7_(other.current7_), + begin8_(other.begin8_), + end8_(other.end8_), + current8_(other.current8_), + begin9_(other.begin9_), + end9_(other.end9_), + current9_(other.current9_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_, + *current4_, *current5_, *current6_, *current7_, *current8_, + *current9_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_ || + current4_ == end4_ || + current5_ == end5_ || + current6_ == end6_ || + current7_ == end7_ || + current8_ == end8_ || + current9_ == end9_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + const typename ParamGenerator::iterator begin4_; + const typename ParamGenerator::iterator end4_; + typename ParamGenerator::iterator current4_; + const typename ParamGenerator::iterator begin5_; + const typename ParamGenerator::iterator end5_; + typename ParamGenerator::iterator current5_; + const typename ParamGenerator::iterator begin6_; + const typename ParamGenerator::iterator end6_; + typename ParamGenerator::iterator current6_; + const typename ParamGenerator::iterator begin7_; + const typename ParamGenerator::iterator end7_; + typename ParamGenerator::iterator current7_; + const typename ParamGenerator::iterator begin8_; + const typename ParamGenerator::iterator end8_; + typename ParamGenerator::iterator current8_; + const typename ParamGenerator::iterator begin9_; + const typename ParamGenerator::iterator end9_; + typename ParamGenerator::iterator current9_; + ParamType current_value_; + }; // class CartesianProductGenerator9::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator9& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; + const ParamGenerator g4_; + const ParamGenerator g5_; + const ParamGenerator g6_; + const ParamGenerator g7_; + const ParamGenerator g8_; + const ParamGenerator g9_; +}; // class CartesianProductGenerator9 + + +template +class CartesianProductGenerator10 + : public ParamGeneratorInterface< ::std::tr1::tuple > { + public: + typedef ::std::tr1::tuple ParamType; + + CartesianProductGenerator10(const ParamGenerator& g1, + const ParamGenerator& g2, const ParamGenerator& g3, + const ParamGenerator& g4, const ParamGenerator& g5, + const ParamGenerator& g6, const ParamGenerator& g7, + const ParamGenerator& g8, const ParamGenerator& g9, + const ParamGenerator& g10) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), + g9_(g9), g10_(g10) {} + virtual ~CartesianProductGenerator10() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_, + g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_, + g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(), + g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_, + g8_.end(), g9_, g9_.end(), g10_, g10_.end()); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + const ParamGenerator& g1, + const typename ParamGenerator::iterator& current1, + const ParamGenerator& g2, + const typename ParamGenerator::iterator& current2, + const ParamGenerator& g3, + const typename ParamGenerator::iterator& current3, + const ParamGenerator& g4, + const typename ParamGenerator::iterator& current4, + const ParamGenerator& g5, + const typename ParamGenerator::iterator& current5, + const ParamGenerator& g6, + const typename ParamGenerator::iterator& current6, + const ParamGenerator& g7, + const typename ParamGenerator::iterator& current7, + const ParamGenerator& g8, + const typename ParamGenerator::iterator& current8, + const ParamGenerator& g9, + const typename ParamGenerator::iterator& current9, + const ParamGenerator& g10, + const typename ParamGenerator::iterator& current10) + : base_(base), + begin1_(g1.begin()), end1_(g1.end()), current1_(current1), + begin2_(g2.begin()), end2_(g2.end()), current2_(current2), + begin3_(g3.begin()), end3_(g3.end()), current3_(current3), + begin4_(g4.begin()), end4_(g4.end()), current4_(current4), + begin5_(g5.begin()), end5_(g5.end()), current5_(current5), + begin6_(g6.begin()), end6_(g6.end()), current6_(current6), + begin7_(g7.begin()), end7_(g7.end()), current7_(current7), + begin8_(g8.begin()), end8_(g8.end()), current8_(current8), + begin9_(g9.begin()), end9_(g9.end()), current9_(current9), + begin10_(g10.begin()), end10_(g10.end()), current10_(current10) { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current10_; + if (current10_ == end10_) { + current10_ = begin10_; + ++current9_; + } + if (current9_ == end9_) { + current9_ = begin9_; + ++current8_; + } + if (current8_ == end8_) { + current8_ = begin8_; + ++current7_; + } + if (current7_ == end7_) { + current7_ = begin7_; + ++current6_; + } + if (current6_ == end6_) { + current6_ = begin6_; + ++current5_; + } + if (current5_ == end5_) { + current5_ = begin5_; + ++current4_; + } + if (current4_ == end4_) { + current4_ = begin4_; + ++current3_; + } + if (current3_ == end3_) { + current3_ = begin3_; + ++current2_; + } + if (current2_ == end2_) { + current2_ = begin2_; + ++current1_; + } + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ( + current1_ == typed_other->current1_ && + current2_ == typed_other->current2_ && + current3_ == typed_other->current3_ && + current4_ == typed_other->current4_ && + current5_ == typed_other->current5_ && + current6_ == typed_other->current6_ && + current7_ == typed_other->current7_ && + current8_ == typed_other->current8_ && + current9_ == typed_other->current9_ && + current10_ == typed_other->current10_); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), + begin1_(other.begin1_), + end1_(other.end1_), + current1_(other.current1_), + begin2_(other.begin2_), + end2_(other.end2_), + current2_(other.current2_), + begin3_(other.begin3_), + end3_(other.end3_), + current3_(other.current3_), + begin4_(other.begin4_), + end4_(other.end4_), + current4_(other.current4_), + begin5_(other.begin5_), + end5_(other.end5_), + current5_(other.current5_), + begin6_(other.begin6_), + end6_(other.end6_), + current6_(other.current6_), + begin7_(other.begin7_), + end7_(other.end7_), + current7_(other.current7_), + begin8_(other.begin8_), + end8_(other.end8_), + current8_(other.current8_), + begin9_(other.begin9_), + end9_(other.end9_), + current9_(other.current9_), + begin10_(other.begin10_), + end10_(other.end10_), + current10_(other.current10_) { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType(*current1_, *current2_, *current3_, + *current4_, *current5_, *current6_, *current7_, *current8_, + *current9_, *current10_); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return + current1_ == end1_ || + current2_ == end2_ || + current3_ == end3_ || + current4_ == end4_ || + current5_ == end5_ || + current6_ == end6_ || + current7_ == end7_ || + current8_ == end8_ || + current9_ == end9_ || + current10_ == end10_; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. + const typename ParamGenerator::iterator begin1_; + const typename ParamGenerator::iterator end1_; + typename ParamGenerator::iterator current1_; + const typename ParamGenerator::iterator begin2_; + const typename ParamGenerator::iterator end2_; + typename ParamGenerator::iterator current2_; + const typename ParamGenerator::iterator begin3_; + const typename ParamGenerator::iterator end3_; + typename ParamGenerator::iterator current3_; + const typename ParamGenerator::iterator begin4_; + const typename ParamGenerator::iterator end4_; + typename ParamGenerator::iterator current4_; + const typename ParamGenerator::iterator begin5_; + const typename ParamGenerator::iterator end5_; + typename ParamGenerator::iterator current5_; + const typename ParamGenerator::iterator begin6_; + const typename ParamGenerator::iterator end6_; + typename ParamGenerator::iterator current6_; + const typename ParamGenerator::iterator begin7_; + const typename ParamGenerator::iterator end7_; + typename ParamGenerator::iterator current7_; + const typename ParamGenerator::iterator begin8_; + const typename ParamGenerator::iterator end8_; + typename ParamGenerator::iterator current8_; + const typename ParamGenerator::iterator begin9_; + const typename ParamGenerator::iterator end9_; + typename ParamGenerator::iterator current9_; + const typename ParamGenerator::iterator begin10_; + const typename ParamGenerator::iterator end10_; + typename ParamGenerator::iterator current10_; + ParamType current_value_; + }; // class CartesianProductGenerator10::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator10& other); + + const ParamGenerator g1_; + const ParamGenerator g2_; + const ParamGenerator g3_; + const ParamGenerator g4_; + const ParamGenerator g5_; + const ParamGenerator g6_; + const ParamGenerator g7_; + const ParamGenerator g8_; + const ParamGenerator g9_; + const ParamGenerator g10_; +}; // class CartesianProductGenerator10 + + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Helper classes providing Combine() with polymorphic features. They allow +// casting CartesianProductGeneratorN to ParamGenerator if T is +// convertible to U. +// +template +class CartesianProductHolder2 { + public: +CartesianProductHolder2(const Generator1& g1, const Generator2& g2) + : g1_(g1), g2_(g2) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator2( + static_cast >(g1_), + static_cast >(g2_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder2& other); + + const Generator1 g1_; + const Generator2 g2_; +}; // class CartesianProductHolder2 + +template +class CartesianProductHolder3 { + public: +CartesianProductHolder3(const Generator1& g1, const Generator2& g2, + const Generator3& g3) + : g1_(g1), g2_(g2), g3_(g3) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator3( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder3& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; +}; // class CartesianProductHolder3 + +template +class CartesianProductHolder4 { + public: +CartesianProductHolder4(const Generator1& g1, const Generator2& g2, + const Generator3& g3, const Generator4& g4) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator4( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_), + static_cast >(g4_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder4& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; + const Generator4 g4_; +}; // class CartesianProductHolder4 + +template +class CartesianProductHolder5 { + public: +CartesianProductHolder5(const Generator1& g1, const Generator2& g2, + const Generator3& g3, const Generator4& g4, const Generator5& g5) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator5( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_), + static_cast >(g4_), + static_cast >(g5_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder5& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; + const Generator4 g4_; + const Generator5 g5_; +}; // class CartesianProductHolder5 + +template +class CartesianProductHolder6 { + public: +CartesianProductHolder6(const Generator1& g1, const Generator2& g2, + const Generator3& g3, const Generator4& g4, const Generator5& g5, + const Generator6& g6) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator6( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_), + static_cast >(g4_), + static_cast >(g5_), + static_cast >(g6_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder6& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; + const Generator4 g4_; + const Generator5 g5_; + const Generator6 g6_; +}; // class CartesianProductHolder6 + +template +class CartesianProductHolder7 { + public: +CartesianProductHolder7(const Generator1& g1, const Generator2& g2, + const Generator3& g3, const Generator4& g4, const Generator5& g5, + const Generator6& g6, const Generator7& g7) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator7( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_), + static_cast >(g4_), + static_cast >(g5_), + static_cast >(g6_), + static_cast >(g7_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder7& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; + const Generator4 g4_; + const Generator5 g5_; + const Generator6 g6_; + const Generator7 g7_; +}; // class CartesianProductHolder7 + +template +class CartesianProductHolder8 { + public: +CartesianProductHolder8(const Generator1& g1, const Generator2& g2, + const Generator3& g3, const Generator4& g4, const Generator5& g5, + const Generator6& g6, const Generator7& g7, const Generator8& g8) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), + g8_(g8) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator8( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_), + static_cast >(g4_), + static_cast >(g5_), + static_cast >(g6_), + static_cast >(g7_), + static_cast >(g8_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder8& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; + const Generator4 g4_; + const Generator5 g5_; + const Generator6 g6_; + const Generator7 g7_; + const Generator8 g8_; +}; // class CartesianProductHolder8 + +template +class CartesianProductHolder9 { + public: +CartesianProductHolder9(const Generator1& g1, const Generator2& g2, + const Generator3& g3, const Generator4& g4, const Generator5& g5, + const Generator6& g6, const Generator7& g7, const Generator8& g8, + const Generator9& g9) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), + g9_(g9) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator9( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_), + static_cast >(g4_), + static_cast >(g5_), + static_cast >(g6_), + static_cast >(g7_), + static_cast >(g8_), + static_cast >(g9_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder9& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; + const Generator4 g4_; + const Generator5 g5_; + const Generator6 g6_; + const Generator7 g7_; + const Generator8 g8_; + const Generator9 g9_; +}; // class CartesianProductHolder9 + +template +class CartesianProductHolder10 { + public: +CartesianProductHolder10(const Generator1& g1, const Generator2& g2, + const Generator3& g3, const Generator4& g4, const Generator5& g5, + const Generator6& g6, const Generator7& g7, const Generator8& g8, + const Generator9& g9, const Generator10& g10) + : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8), + g9_(g9), g10_(g10) {} + template + operator ParamGenerator< ::std::tr1::tuple >() const { + return ParamGenerator< ::std::tr1::tuple >( + new CartesianProductGenerator10( + static_cast >(g1_), + static_cast >(g2_), + static_cast >(g3_), + static_cast >(g4_), + static_cast >(g5_), + static_cast >(g6_), + static_cast >(g7_), + static_cast >(g8_), + static_cast >(g9_), + static_cast >(g10_))); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder10& other); + + const Generator1 g1_; + const Generator2 g2_; + const Generator3 g3_; + const Generator4 g4_; + const Generator5 g5_; + const Generator6 g6_; + const Generator7 g7_; + const Generator8 g8_; + const Generator9 g9_; + const Generator10 g10_; +}; // class CartesianProductHolder10 + +#endif // GTEST_HAS_COMBINE + +} // namespace internal +} // namespace testing + +#endif // GTEST_HAS_PARAM_TEST + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump new file mode 100644 index 000000000..baedfbc2d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump @@ -0,0 +1,301 @@ +$$ -*- mode: c++; -*- +$var n = 50 $$ Maximum length of Values arguments we want to support. +$var maxtuple = 10 $$ Maximum number of Combine arguments we want to support. +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) + +// Type and function utilities for implementing parameterized tests. +// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +// Currently Google Test supports at most $n arguments in Values, +// and at most $maxtuple arguments in Combine. Please contact +// googletestframework@googlegroups.com if you need more. +// Please note that the number of arguments to Combine is limited +// by the maximum arity of the implementation of tr1::tuple which is +// currently set at $maxtuple. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ + +// scripts/fuse_gtest.py depends on gtest's own header being #included +// *unconditionally*. Therefore these #includes cannot be moved +// inside #if GTEST_HAS_PARAM_TEST. +#include +#include + +#if GTEST_HAS_PARAM_TEST + +namespace testing { + +// Forward declarations of ValuesIn(), which is implemented in +// include/gtest/gtest-param-test.h. +template +internal::ParamGenerator< + typename ::std::iterator_traits::value_type> ValuesIn( + ForwardIterator begin, ForwardIterator end); + +template +internal::ParamGenerator ValuesIn(const T (&array)[N]); + +template +internal::ParamGenerator ValuesIn( + const Container& container); + +namespace internal { + +// Used in the Values() function to provide polymorphic capabilities. +template +class ValueArray1 { + public: + explicit ValueArray1(T1 v1) : v1_(v1) {} + + template + operator ParamGenerator() const { return ValuesIn(&v1_, &v1_ + 1); } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray1& other); + + const T1 v1_; +}; + +$range i 2..n +$for i [[ +$range j 1..i + +template <$for j, [[typename T$j]]> +class ValueArray$i { + public: + ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {} + + template + operator ParamGenerator() const { + const T array[] = {$for j, [[v$(j)_]]}; + return ValuesIn(array); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const ValueArray$i& other); + +$for j [[ + + const T$j v$(j)_; +]] + +}; + +]] + +#if GTEST_HAS_COMBINE +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Generates values from the Cartesian product of values produced +// by the argument generators. +// +$range i 2..maxtuple +$for i [[ +$range j 1..i +$range k 2..i + +template <$for j, [[typename T$j]]> +class CartesianProductGenerator$i + : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > { + public: + typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType; + + CartesianProductGenerator$i($for j, [[const ParamGenerator& g$j]]) + : $for j, [[g$(j)_(g$j)]] {} + virtual ~CartesianProductGenerator$i() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, $for j, [[ + + const ParamGenerator& g$j, + const typename ParamGenerator::iterator& current$(j)]]) + : base_(base), +$for j, [[ + + begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j) +]] { + ComputeCurrentValue(); + } + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + virtual void Advance() { + assert(!AtEnd()); + ++current$(i)_; + +$for k [[ + if (current$(i+2-k)_ == end$(i+2-k)_) { + current$(i+2-k)_ = begin$(i+2-k)_; + ++current$(i+2-k-1)_; + } + +]] + ComputeCurrentValue(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const ParamType* Current() const { return ¤t_value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const Iterator* typed_other = + CheckedDowncastToActualType(&other); + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + return (AtEnd() && typed_other->AtEnd()) || + ($for j && [[ + + current$(j)_ == typed_other->current$(j)_ +]]); + } + + private: + Iterator(const Iterator& other) + : base_(other.base_), $for j, [[ + + begin$(j)_(other.begin$(j)_), + end$(j)_(other.end$(j)_), + current$(j)_(other.current$(j)_) +]] { + ComputeCurrentValue(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = ParamType($for j, [[*current$(j)_]]); + } + bool AtEnd() const { + // We must report iterator past the end of the range when either of the + // component iterators has reached the end of its range. + return +$for j || [[ + + current$(j)_ == end$(j)_ +]]; + } + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + // begin[i]_ and end[i]_ define the i-th range that Iterator traverses. + // current[i]_ is the actual traversing iterator. +$for j [[ + + const typename ParamGenerator::iterator begin$(j)_; + const typename ParamGenerator::iterator end$(j)_; + typename ParamGenerator::iterator current$(j)_; +]] + + ParamType current_value_; + }; // class CartesianProductGenerator$i::Iterator + + // No implementation - assignment is unsupported. + void operator=(const CartesianProductGenerator$i& other); + + +$for j [[ + const ParamGenerator g$(j)_; + +]] +}; // class CartesianProductGenerator$i + + +]] + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Helper classes providing Combine() with polymorphic features. They allow +// casting CartesianProductGeneratorN to ParamGenerator if T is +// convertible to U. +// +$range i 2..maxtuple +$for i [[ +$range j 1..i + +template <$for j, [[class Generator$j]]> +class CartesianProductHolder$i { + public: +CartesianProductHolder$i($for j, [[const Generator$j& g$j]]) + : $for j, [[g$(j)_(g$j)]] {} + template <$for j, [[typename T$j]]> + operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const { + return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >( + new CartesianProductGenerator$i<$for j, [[T$j]]>( +$for j,[[ + + static_cast >(g$(j)_) +]])); + } + + private: + // No implementation - assignment is unsupported. + void operator=(const CartesianProductHolder$i& other); + + +$for j [[ + const Generator$j g$(j)_; + +]] +}; // class CartesianProductHolder$i + +]] + +#endif // GTEST_HAS_COMBINE + +} // namespace internal +} // namespace testing + +#endif // GTEST_HAS_PARAM_TEST + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h new file mode 100644 index 000000000..0cbb58c21 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h @@ -0,0 +1,619 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) + +// Type and function utilities for implementing parameterized tests. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ + +#include +#include +#include + +// scripts/fuse_gtest.py depends on gtest's own header being #included +// *unconditionally*. Therefore these #includes cannot be moved +// inside #if GTEST_HAS_PARAM_TEST. +#include +#include +#include + +#if GTEST_HAS_PARAM_TEST + +namespace testing { +namespace internal { + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Outputs a message explaining invalid registration of different +// fixture class for the same test case. This may happen when +// TEST_P macro is used to define two tests with the same name +// but in different namespaces. +GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name, + const char* file, int line); + +template class ParamGeneratorInterface; +template class ParamGenerator; + +// Interface for iterating over elements provided by an implementation +// of ParamGeneratorInterface. +template +class ParamIteratorInterface { + public: + virtual ~ParamIteratorInterface() {} + // A pointer to the base generator instance. + // Used only for the purposes of iterator comparison + // to make sure that two iterators belong to the same generator. + virtual const ParamGeneratorInterface* BaseGenerator() const = 0; + // Advances iterator to point to the next element + // provided by the generator. The caller is responsible + // for not calling Advance() on an iterator equal to + // BaseGenerator()->End(). + virtual void Advance() = 0; + // Clones the iterator object. Used for implementing copy semantics + // of ParamIterator. + virtual ParamIteratorInterface* Clone() const = 0; + // Dereferences the current iterator and provides (read-only) access + // to the pointed value. It is the caller's responsibility not to call + // Current() on an iterator equal to BaseGenerator()->End(). + // Used for implementing ParamGenerator::operator*(). + virtual const T* Current() const = 0; + // Determines whether the given iterator and other point to the same + // element in the sequence generated by the generator. + // Used for implementing ParamGenerator::operator==(). + virtual bool Equals(const ParamIteratorInterface& other) const = 0; +}; + +// Class iterating over elements provided by an implementation of +// ParamGeneratorInterface. It wraps ParamIteratorInterface +// and implements the const forward iterator concept. +template +class ParamIterator { + public: + typedef T value_type; + typedef const T& reference; + typedef ptrdiff_t difference_type; + + // ParamIterator assumes ownership of the impl_ pointer. + ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} + ParamIterator& operator=(const ParamIterator& other) { + if (this != &other) + impl_.reset(other.impl_->Clone()); + return *this; + } + + const T& operator*() const { return *impl_->Current(); } + const T* operator->() const { return impl_->Current(); } + // Prefix version of operator++. + ParamIterator& operator++() { + impl_->Advance(); + return *this; + } + // Postfix version of operator++. + ParamIterator operator++(int /*unused*/) { + ParamIteratorInterface* clone = impl_->Clone(); + impl_->Advance(); + return ParamIterator(clone); + } + bool operator==(const ParamIterator& other) const { + return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); + } + bool operator!=(const ParamIterator& other) const { + return !(*this == other); + } + + private: + friend class ParamGenerator; + explicit ParamIterator(ParamIteratorInterface* impl) : impl_(impl) {} + scoped_ptr > impl_; +}; + +// ParamGeneratorInterface is the binary interface to access generators +// defined in other translation units. +template +class ParamGeneratorInterface { + public: + typedef T ParamType; + + virtual ~ParamGeneratorInterface() {} + + // Generator interface definition + virtual ParamIteratorInterface* Begin() const = 0; + virtual ParamIteratorInterface* End() const = 0; +}; + +// Wraps ParamGeneratorInterface and provides general generator syntax +// compatible with the STL Container concept. +// This class implements copy initialization semantics and the contained +// ParamGeneratorInterface instance is shared among all copies +// of the original object. This is possible because that instance is immutable. +template +class ParamGenerator { + public: + typedef ParamIterator iterator; + + explicit ParamGenerator(ParamGeneratorInterface* impl) : impl_(impl) {} + ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} + + ParamGenerator& operator=(const ParamGenerator& other) { + impl_ = other.impl_; + return *this; + } + + iterator begin() const { return iterator(impl_->Begin()); } + iterator end() const { return iterator(impl_->End()); } + + private: + ::testing::internal::linked_ptr > impl_; +}; + +// Generates values from a range of two comparable values. Can be used to +// generate sequences of user-defined types that implement operator+() and +// operator<(). +// This class is used in the Range() function. +template +class RangeGenerator : public ParamGeneratorInterface { + public: + RangeGenerator(T begin, T end, IncrementT step) + : begin_(begin), end_(end), + step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} + virtual ~RangeGenerator() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, begin_, 0, step_); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, end_, end_index_, step_); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, T value, int index, + IncrementT step) + : base_(base), value_(value), index_(index), step_(step) {} + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + virtual void Advance() { + value_ = value_ + step_; + index_++; + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + virtual const T* Current() const { return &value_; } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const int other_index = + CheckedDowncastToActualType(&other)->index_; + return index_ == other_index; + } + + private: + Iterator(const Iterator& other) + : ParamIteratorInterface(), + base_(other.base_), value_(other.value_), index_(other.index_), + step_(other.step_) {} + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + T value_; + int index_; + const IncrementT step_; + }; // class RangeGenerator::Iterator + + static int CalculateEndIndex(const T& begin, + const T& end, + const IncrementT& step) { + int end_index = 0; + for (T i = begin; i < end; i = i + step) + end_index++; + return end_index; + } + + // No implementation - assignment is unsupported. + void operator=(const RangeGenerator& other); + + const T begin_; + const T end_; + const IncrementT step_; + // The index for the end() iterator. All the elements in the generated + // sequence are indexed (0-based) to aid iterator comparison. + const int end_index_; +}; // class RangeGenerator + + +// Generates values from a pair of STL-style iterators. Used in the +// ValuesIn() function. The elements are copied from the source range +// since the source can be located on the stack, and the generator +// is likely to persist beyond that stack frame. +template +class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface { + public: + template + ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) + : container_(begin, end) {} + virtual ~ValuesInIteratorRangeGenerator() {} + + virtual ParamIteratorInterface* Begin() const { + return new Iterator(this, container_.begin()); + } + virtual ParamIteratorInterface* End() const { + return new Iterator(this, container_.end()); + } + + private: + typedef typename ::std::vector ContainerType; + + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + typename ContainerType::const_iterator iterator) + : base_(base), iterator_(iterator) {} + virtual ~Iterator() {} + + virtual const ParamGeneratorInterface* BaseGenerator() const { + return base_; + } + virtual void Advance() { + ++iterator_; + value_.reset(); + } + virtual ParamIteratorInterface* Clone() const { + return new Iterator(*this); + } + // We need to use cached value referenced by iterator_ because *iterator_ + // can return a temporary object (and of type other then T), so just + // having "return &*iterator_;" doesn't work. + // value_ is updated here and not in Advance() because Advance() + // can advance iterator_ beyond the end of the range, and we cannot + // detect that fact. The client code, on the other hand, is + // responsible for not calling Current() on an out-of-range iterator. + virtual const T* Current() const { + if (value_.get() == NULL) + value_.reset(new T(*iterator_)); + return value_.get(); + } + virtual bool Equals(const ParamIteratorInterface& other) const { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + return iterator_ == + CheckedDowncastToActualType(&other)->iterator_; + } + + private: + Iterator(const Iterator& other) + // The explicit constructor call suppresses a false warning + // emitted by gcc when supplied with the -Wextra option. + : ParamIteratorInterface(), + base_(other.base_), + iterator_(other.iterator_) {} + + const ParamGeneratorInterface* const base_; + typename ContainerType::const_iterator iterator_; + // A cached value of *iterator_. We keep it here to allow access by + // pointer in the wrapping iterator's operator->(). + // value_ needs to be mutable to be accessed in Current(). + // Use of scoped_ptr helps manage cached value's lifetime, + // which is bound by the lifespan of the iterator itself. + mutable scoped_ptr value_; + }; // class ValuesInIteratorRangeGenerator::Iterator + + // No implementation - assignment is unsupported. + void operator=(const ValuesInIteratorRangeGenerator& other); + + const ContainerType container_; +}; // class ValuesInIteratorRangeGenerator + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Stores a parameter value and later creates tests parameterized with that +// value. +template +class ParameterizedTestFactory : public TestFactoryBase { + public: + typedef typename TestClass::ParamType ParamType; + explicit ParameterizedTestFactory(ParamType parameter) : + parameter_(parameter) {} + virtual Test* CreateTest() { + TestClass::SetParam(¶meter_); + return new TestClass(); + } + + private: + const ParamType parameter_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// TestMetaFactoryBase is a base class for meta-factories that create +// test factories for passing into MakeAndRegisterTestInfo function. +template +class TestMetaFactoryBase { + public: + virtual ~TestMetaFactoryBase() {} + + virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// TestMetaFactory creates test factories for passing into +// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives +// ownership of test factory pointer, same factory object cannot be passed +// into that method twice. But ParameterizedTestCaseInfo is going to call +// it for each Test/Parameter value combination. Thus it needs meta factory +// creator class. +template +class TestMetaFactory + : public TestMetaFactoryBase { + public: + typedef typename TestCase::ParamType ParamType; + + TestMetaFactory() {} + + virtual TestFactoryBase* CreateTestFactory(ParamType parameter) { + return new ParameterizedTestFactory(parameter); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// ParameterizedTestCaseInfoBase is a generic interface +// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase +// accumulates test information provided by TEST_P macro invocations +// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations +// and uses that information to register all resulting test instances +// in RegisterTests method. The ParameterizeTestCaseRegistry class holds +// a collection of pointers to the ParameterizedTestCaseInfo objects +// and calls RegisterTests() on each of them when asked. +class ParameterizedTestCaseInfoBase { + public: + virtual ~ParameterizedTestCaseInfoBase() {} + + // Base part of test case name for display purposes. + virtual const String& GetTestCaseName() const = 0; + // Test case id to verify identity. + virtual TypeId GetTestCaseTypeId() const = 0; + // UnitTest class invokes this method to register tests in this + // test case right before running them in RUN_ALL_TESTS macro. + // This method should not be called more then once on any single + // instance of a ParameterizedTestCaseInfoBase derived class. + virtual void RegisterTests() = 0; + + protected: + ParameterizedTestCaseInfoBase() {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase); +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P +// macro invocations for a particular test case and generators +// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that +// test case. It registers tests with all values generated by all +// generators when asked. +template +class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase { + public: + // ParamType and GeneratorCreationFunc are private types but are required + // for declarations of public methods AddTestPattern() and + // AddTestCaseInstantiation(). + typedef typename TestCase::ParamType ParamType; + // A function that returns an instance of appropriate generator type. + typedef ParamGenerator(GeneratorCreationFunc)(); + + explicit ParameterizedTestCaseInfo(const char* name) + : test_case_name_(name) {} + + // Test case base name for display purposes. + virtual const String& GetTestCaseName() const { return test_case_name_; } + // Test case id to verify identity. + virtual TypeId GetTestCaseTypeId() const { return GetTypeId(); } + // TEST_P macro uses AddTestPattern() to record information + // about a single test in a LocalTestInfo structure. + // test_case_name is the base name of the test case (without invocation + // prefix). test_base_name is the name of an individual test without + // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is + // test case base name and DoBar is test base name. + void AddTestPattern(const char* test_case_name, + const char* test_base_name, + TestMetaFactoryBase* meta_factory) { + tests_.push_back(linked_ptr(new TestInfo(test_case_name, + test_base_name, + meta_factory))); + } + // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information + // about a generator. + int AddTestCaseInstantiation(const char* instantiation_name, + GeneratorCreationFunc* func, + const char* /* file */, + int /* line */) { + instantiations_.push_back(::std::make_pair(instantiation_name, func)); + return 0; // Return value used only to run this method in namespace scope. + } + // UnitTest class invokes this method to register tests in this test case + // test cases right before running tests in RUN_ALL_TESTS macro. + // This method should not be called more then once on any single + // instance of a ParameterizedTestCaseInfoBase derived class. + // UnitTest has a guard to prevent from calling this method more then once. + virtual void RegisterTests() { + for (typename TestInfoContainer::iterator test_it = tests_.begin(); + test_it != tests_.end(); ++test_it) { + linked_ptr test_info = *test_it; + for (typename InstantiationContainer::iterator gen_it = + instantiations_.begin(); gen_it != instantiations_.end(); + ++gen_it) { + const String& instantiation_name = gen_it->first; + ParamGenerator generator((*gen_it->second)()); + + Message test_case_name_stream; + if ( !instantiation_name.empty() ) + test_case_name_stream << instantiation_name.c_str() << "/"; + test_case_name_stream << test_info->test_case_base_name.c_str(); + + int i = 0; + for (typename ParamGenerator::iterator param_it = + generator.begin(); + param_it != generator.end(); ++param_it, ++i) { + Message test_name_stream; + test_name_stream << test_info->test_base_name.c_str() << "/" << i; + ::testing::internal::MakeAndRegisterTestInfo( + test_case_name_stream.GetString().c_str(), + test_name_stream.GetString().c_str(), + "", // test_case_comment + "", // comment; TODO(vladl@google.com): provide parameter value + // representation. + GetTestCaseTypeId(), + TestCase::SetUpTestCase, + TestCase::TearDownTestCase, + test_info->test_meta_factory->CreateTestFactory(*param_it)); + } // for param_it + } // for gen_it + } // for test_it + } // RegisterTests + + private: + // LocalTestInfo structure keeps information about a single test registered + // with TEST_P macro. + struct TestInfo { + TestInfo(const char* a_test_case_base_name, + const char* a_test_base_name, + TestMetaFactoryBase* a_test_meta_factory) : + test_case_base_name(a_test_case_base_name), + test_base_name(a_test_base_name), + test_meta_factory(a_test_meta_factory) {} + + const String test_case_base_name; + const String test_base_name; + const scoped_ptr > test_meta_factory; + }; + typedef ::std::vector > TestInfoContainer; + // Keeps pairs of + // received from INSTANTIATE_TEST_CASE_P macros. + typedef ::std::vector > + InstantiationContainer; + + const String test_case_name_; + TestInfoContainer tests_; + InstantiationContainer instantiations_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo); +}; // class ParameterizedTestCaseInfo + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase +// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P +// macros use it to locate their corresponding ParameterizedTestCaseInfo +// descriptors. +class ParameterizedTestCaseRegistry { + public: + ParameterizedTestCaseRegistry() {} + ~ParameterizedTestCaseRegistry() { + for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); + it != test_case_infos_.end(); ++it) { + delete *it; + } + } + + // Looks up or creates and returns a structure containing information about + // tests and instantiations of a particular test case. + template + ParameterizedTestCaseInfo* GetTestCasePatternHolder( + const char* test_case_name, + const char* file, + int line) { + ParameterizedTestCaseInfo* typed_test_info = NULL; + for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); + it != test_case_infos_.end(); ++it) { + if ((*it)->GetTestCaseName() == test_case_name) { + if ((*it)->GetTestCaseTypeId() != GetTypeId()) { + // Complain about incorrect usage of Google Test facilities + // and terminate the program since we cannot guaranty correct + // test case setup and tear-down in this case. + ReportInvalidTestCaseType(test_case_name, file, line); + abort(); + } else { + // At this point we are sure that the object we found is of the same + // type we are looking for, so we downcast it to that type + // without further checks. + typed_test_info = CheckedDowncastToActualType< + ParameterizedTestCaseInfo >(*it); + } + break; + } + } + if (typed_test_info == NULL) { + typed_test_info = new ParameterizedTestCaseInfo(test_case_name); + test_case_infos_.push_back(typed_test_info); + } + return typed_test_info; + } + void RegisterTests() { + for (TestCaseInfoContainer::iterator it = test_case_infos_.begin(); + it != test_case_infos_.end(); ++it) { + (*it)->RegisterTests(); + } + } + + private: + typedef ::std::vector TestCaseInfoContainer; + + TestCaseInfoContainer test_case_infos_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry); +}; + +} // namespace internal +} // namespace testing + +#endif // GTEST_HAS_PARAM_TEST + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h new file mode 100644 index 000000000..a2a62be92 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h @@ -0,0 +1,1497 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: wan@google.com (Zhanyong Wan) +// +// Low-level types and utilities for porting Google Test to various +// platforms. They are subject to change without notice. DO NOT USE +// THEM IN USER CODE. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ + +// The user can define the following macros in the build script to +// control Google Test's behavior. If the user doesn't define a macro +// in this list, Google Test will define it. +// +// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) +// is/isn't available. +// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions +// are enabled. +// GTEST_HAS_GLOBAL_STRING - Define it to 1/0 to indicate that ::string +// is/isn't available (some systems define +// ::string, which is different to std::string). +// GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string +// is/isn't available (some systems define +// ::wstring, which is different to std::wstring). +// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that +// is/isn't available. +// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't +// enabled. +// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that +// std::wstring does/doesn't work (Google Test can +// be used where std::wstring is unavailable). +// GTEST_HAS_TR1_TUPLE - Define it to 1/0 to indicate tr1::tuple +// is/isn't available. +// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the +// compiler supports Microsoft's "Structured +// Exception Handling". +// GTEST_USE_OWN_TR1_TUPLE - Define it to 1/0 to indicate whether Google +// Test's own tr1 tuple implementation should be +// used. Unused when the user sets +// GTEST_HAS_TR1_TUPLE to 0. +// GTEST_LINKED_AS_SHARED_LIBRARY +// - Define to 1 when compiling tests that use +// Google Test as a shared library (known as +// DLL on Windows). +// GTEST_CREATE_SHARED_LIBRARY +// - Define to 1 when compiling Google Test itself +// as a shared library. + +// This header defines the following utilities: +// +// Macros indicating the current platform (defined to 1 if compiled on +// the given platform; otherwise undefined): +// GTEST_OS_AIX - IBM AIX +// GTEST_OS_CYGWIN - Cygwin +// GTEST_OS_LINUX - Linux +// GTEST_OS_MAC - Mac OS X +// GTEST_OS_SOLARIS - Sun Solaris +// GTEST_OS_SYMBIAN - Symbian +// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) +// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop +// GTEST_OS_WINDOWS_MINGW - MinGW +// GTEST_OS_WINDOWS_MOBILE - Windows Mobile +// GTEST_OS_ZOS - z/OS +// +// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the +// most stable support. Since core members of the Google Test project +// don't have access to other platforms, support for them may be less +// stable. If you notice any problems on your platform, please notify +// googletestframework@googlegroups.com (patches for fixing them are +// even more welcome!). +// +// Note that it is possible that none of the GTEST_OS_* macros are defined. +// +// Macros indicating available Google Test features (defined to 1 if +// the corresponding feature is supported; otherwise undefined): +// GTEST_HAS_COMBINE - the Combine() function (for value-parameterized +// tests) +// GTEST_HAS_DEATH_TEST - death tests +// GTEST_HAS_PARAM_TEST - value-parameterized tests +// GTEST_HAS_TYPED_TEST - typed tests +// GTEST_HAS_TYPED_TEST_P - type-parameterized tests +// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. +// GTEST_USES_SIMPLE_RE - our own simple regex is used; +// the above two are mutually exclusive. +// GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ(). +// +// Macros for basic C++ coding: +// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. +// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a +// variable don't have to be used. +// GTEST_DISALLOW_ASSIGN_ - disables operator=. +// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. +// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. +// +// Synchronization: +// Mutex, MutexLock, ThreadLocal, GetThreadCount() +// - synchronization primitives. +// GTEST_IS_THREADSAFE - defined to 1 to indicate that the above +// synchronization primitives have real implementations +// and Google Test is thread-safe; or 0 otherwise. +// +// Template meta programming: +// is_pointer - as in TR1; needed on Symbian and IBM XL C/C++ only. +// +// Smart pointers: +// scoped_ptr - as in TR2. +// +// Regular expressions: +// RE - a simple regular expression class using the POSIX +// Extended Regular Expression syntax. Not available on +// Windows. +// +// Logging: +// GTEST_LOG_() - logs messages at the specified severity level. +// LogToStderr() - directs all log messages to stderr. +// FlushInfoLog() - flushes informational log messages. +// +// Stdout and stderr capturing: +// CaptureStdout() - starts capturing stdout. +// GetCapturedStdout() - stops capturing stdout and returns the captured +// string. +// CaptureStderr() - starts capturing stderr. +// GetCapturedStderr() - stops capturing stderr and returns the captured +// string. +// +// Integer types: +// TypeWithSize - maps an integer to a int type. +// Int32, UInt32, Int64, UInt64, TimeInMillis +// - integers of known sizes. +// BiggestInt - the biggest signed integer type. +// +// Command-line utilities: +// GTEST_FLAG() - references a flag. +// GTEST_DECLARE_*() - declares a flag. +// GTEST_DEFINE_*() - defines a flag. +// GetArgvs() - returns the command line as a vector of strings. +// +// Environment variable utilities: +// GetEnv() - gets the value of an environment variable. +// BoolFromGTestEnv() - parses a bool environment variable. +// Int32FromGTestEnv() - parses an Int32 environment variable. +// StringFromGTestEnv() - parses a string environment variable. + +#include // For ptrdiff_t +#include +#include +#include +#ifndef _WIN32_WCE +#include +#endif // !_WIN32_WCE + +#include // NOLINT +#include // NOLINT +#include // NOLINT + +#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" +#define GTEST_FLAG_PREFIX_ "gtest_" +#define GTEST_FLAG_PREFIX_DASH_ "gtest-" +#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" +#define GTEST_NAME_ "Google Test" +#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/" + +// Determines the version of gcc that is used to compile this. +#ifdef __GNUC__ +// 40302 means version 4.3.2. +#define GTEST_GCC_VER_ \ + (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) +#endif // __GNUC__ + +// Determines the platform on which Google Test is compiled. +#ifdef __CYGWIN__ +#define GTEST_OS_CYGWIN 1 +#elif defined __SYMBIAN32__ +#define GTEST_OS_SYMBIAN 1 +#elif defined _WIN32 +#define GTEST_OS_WINDOWS 1 +#ifdef _WIN32_WCE +#define GTEST_OS_WINDOWS_MOBILE 1 +#elif defined(__MINGW__) || defined(__MINGW32__) +#define GTEST_OS_WINDOWS_MINGW 1 +#else +#define GTEST_OS_WINDOWS_DESKTOP 1 +#endif // _WIN32_WCE +#elif defined __APPLE__ +#define GTEST_OS_MAC 1 +#elif defined __linux__ +#define GTEST_OS_LINUX 1 +#elif defined __MVS__ +#define GTEST_OS_ZOS 1 +#elif defined(__sun) && defined(__SVR4) +#define GTEST_OS_SOLARIS 1 +#elif defined(_AIX) +#define GTEST_OS_AIX 1 +#endif // __CYGWIN__ + +#if GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_SYMBIAN || \ + GTEST_OS_SOLARIS || GTEST_OS_AIX + +// On some platforms, needs someone to define size_t, and +// won't compile otherwise. We can #include it here as we already +// included , which is guaranteed to define size_t through +// . +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT + +#define GTEST_USES_POSIX_RE 1 + +#elif GTEST_OS_WINDOWS + +#if !GTEST_OS_WINDOWS_MOBILE +#include // NOLINT +#include // NOLINT +#endif + +// is not available on Windows. Use our own simple regex +// implementation instead. +#define GTEST_USES_SIMPLE_RE 1 + +#else + +// may not be available on this platform. Use our own +// simple regex implementation instead. +#define GTEST_USES_SIMPLE_RE 1 + +#endif // GTEST_OS_CYGWIN || GTEST_OS_LINUX || GTEST_OS_MAC || + // GTEST_OS_SYMBIAN || GTEST_OS_SOLARIS || GTEST_OS_AIX + +#ifndef GTEST_HAS_EXCEPTIONS +// The user didn't tell us whether exceptions are enabled, so we need +// to figure it out. +#if defined(_MSC_VER) || defined(__BORLANDC__) +// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS +// macro to enable exceptions, so we'll do the same. +// Assumes that exceptions are enabled by default. +#ifndef _HAS_EXCEPTIONS +#define _HAS_EXCEPTIONS 1 +#endif // _HAS_EXCEPTIONS +#define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS +#elif defined(__GNUC__) && __EXCEPTIONS +// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled. +#define GTEST_HAS_EXCEPTIONS 1 +#elif defined(__SUNPRO_CC) +// Sun Pro CC supports exceptions. However, there is no compile-time way of +// detecting whether they are enabled or not. Therefore, we assume that +// they are enabled unless the user tells us otherwise. +#define GTEST_HAS_EXCEPTIONS 1 +#elif defined(__IBMCPP__) && __EXCEPTIONS +// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled. +#define GTEST_HAS_EXCEPTIONS 1 +#else +// For other compilers, we assume exceptions are disabled to be +// conservative. +#define GTEST_HAS_EXCEPTIONS 0 +#endif // defined(_MSC_VER) || defined(__BORLANDC__) +#endif // GTEST_HAS_EXCEPTIONS + +#if !defined(GTEST_HAS_STD_STRING) +// Even though we don't use this macro any longer, we keep it in case +// some clients still depend on it. +#define GTEST_HAS_STD_STRING 1 +#elif !GTEST_HAS_STD_STRING +// The user told us that ::std::string isn't available. +#error "Google Test cannot be used where ::std::string isn't available." +#endif // !defined(GTEST_HAS_STD_STRING) + +#ifndef GTEST_HAS_GLOBAL_STRING +// The user didn't tell us whether ::string is available, so we need +// to figure it out. + +#define GTEST_HAS_GLOBAL_STRING 0 + +#endif // GTEST_HAS_GLOBAL_STRING + +#ifndef GTEST_HAS_STD_WSTRING +// The user didn't tell us whether ::std::wstring is available, so we need +// to figure it out. +// TODO(wan@google.com): uses autoconf to detect whether ::std::wstring +// is available. + +// Cygwin 1.5 and below doesn't support ::std::wstring. +// Cygwin 1.7 might add wstring support; this should be updated when clear. +// Solaris' libc++ doesn't support it either. +#define GTEST_HAS_STD_WSTRING (!(GTEST_OS_CYGWIN || GTEST_OS_SOLARIS)) + +#endif // GTEST_HAS_STD_WSTRING + +#ifndef GTEST_HAS_GLOBAL_WSTRING +// The user didn't tell us whether ::wstring is available, so we need +// to figure it out. +#define GTEST_HAS_GLOBAL_WSTRING \ + (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING) +#endif // GTEST_HAS_GLOBAL_WSTRING + +// Determines whether RTTI is available. +#ifndef GTEST_HAS_RTTI +// The user didn't tell us whether RTTI is enabled, so we need to +// figure it out. + +#ifdef _MSC_VER + +#ifdef _CPPRTTI // MSVC defines this macro iff RTTI is enabled. +#define GTEST_HAS_RTTI 1 +#else +#define GTEST_HAS_RTTI 0 +#endif + +// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled. +#elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302) + +#ifdef __GXX_RTTI +#define GTEST_HAS_RTTI 1 +#else +#define GTEST_HAS_RTTI 0 +#endif // __GXX_RTTI + +// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if +// both the typeid and dynamic_cast features are present. +#elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) + +#ifdef __RTTI_ALL__ +#define GTEST_HAS_RTTI 1 +#else +#define GTEST_HAS_RTTI 0 +#endif + +#else + +// For all other compilers, we assume RTTI is enabled. +#define GTEST_HAS_RTTI 1 + +#endif // _MSC_VER + +#endif // GTEST_HAS_RTTI + +// It's this header's responsibility to #include when RTTI +// is enabled. +#if GTEST_HAS_RTTI +#include +#endif + +// Determines whether Google Test can use the pthreads library. +#ifndef GTEST_HAS_PTHREAD +// The user didn't tell us explicitly, so we assume pthreads support is +// available on Linux and Mac. +// +// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 +// to your compiler flags. +#define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC) +#endif // GTEST_HAS_PTHREAD + +// Determines whether Google Test can use tr1/tuple. You can define +// this macro to 0 to prevent Google Test from using tuple (any +// feature depending on tuple with be disabled in this mode). +#ifndef GTEST_HAS_TR1_TUPLE +// The user didn't tell us not to do it, so we assume it's OK. +#define GTEST_HAS_TR1_TUPLE 1 +#endif // GTEST_HAS_TR1_TUPLE + +// Determines whether Google Test's own tr1 tuple implementation +// should be used. +#ifndef GTEST_USE_OWN_TR1_TUPLE +// The user didn't tell us, so we need to figure it out. + +// We use our own TR1 tuple if we aren't sure the user has an +// implementation of it already. At this time, GCC 4.0.0+ and MSVC +// 2010 are the only mainstream compilers that come with a TR1 tuple +// implementation. NVIDIA's CUDA NVCC compiler pretends to be GCC by +// defining __GNUC__ and friends, but cannot compile GCC's tuple +// implementation. MSVC 2008 (9.0) provides TR1 tuple in a 323 MB +// Feature Pack download, which we cannot assume the user has. +#if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000)) \ + || _MSC_VER >= 1600 +#define GTEST_USE_OWN_TR1_TUPLE 0 +#else +#define GTEST_USE_OWN_TR1_TUPLE 1 +#endif + +#endif // GTEST_USE_OWN_TR1_TUPLE + +// To avoid conditional compilation everywhere, we make it +// gtest-port.h's responsibility to #include the header implementing +// tr1/tuple. +#if GTEST_HAS_TR1_TUPLE + +#if GTEST_USE_OWN_TR1_TUPLE +#include +#elif GTEST_OS_SYMBIAN + +// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to +// use STLport's tuple implementation, which unfortunately doesn't +// work as the copy of STLport distributed with Symbian is incomplete. +// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to +// use its own tuple implementation. +#ifdef BOOST_HAS_TR1_TUPLE +#undef BOOST_HAS_TR1_TUPLE +#endif // BOOST_HAS_TR1_TUPLE + +// This prevents , which defines +// BOOST_HAS_TR1_TUPLE, from being #included by Boost's . +#define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED +#include + +#elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000) +// GCC 4.0+ implements tr1/tuple in the header. This does +// not conform to the TR1 spec, which requires the header to be . + +#if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 +// Until version 4.3.2, gcc has a bug that causes , +// which is #included by , to not compile when RTTI is +// disabled. _TR1_FUNCTIONAL is the header guard for +// . Hence the following #define is a hack to prevent +// from being included. +#define _TR1_FUNCTIONAL 1 +#include +#undef _TR1_FUNCTIONAL // Allows the user to #include + // if he chooses to. +#else +#include // NOLINT +#endif // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302 + +#else +// If the compiler is not GCC 4.0+, we assume the user is using a +// spec-conforming TR1 implementation. +#include // NOLINT +#endif // GTEST_USE_OWN_TR1_TUPLE + +#endif // GTEST_HAS_TR1_TUPLE + +// Determines whether clone(2) is supported. +// Usually it will only be available on Linux, excluding +// Linux on the Itanium architecture. +// Also see http://linux.die.net/man/2/clone. +#ifndef GTEST_HAS_CLONE +// The user didn't tell us, so we need to figure it out. + +#if GTEST_OS_LINUX && !defined(__ia64__) +#define GTEST_HAS_CLONE 1 +#else +#define GTEST_HAS_CLONE 0 +#endif // GTEST_OS_LINUX && !defined(__ia64__) + +#endif // GTEST_HAS_CLONE + +// Determines whether to support stream redirection. This is used to test +// output correctness and to implement death tests. +#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN +#define GTEST_HAS_STREAM_REDIRECTION_ 1 +#endif // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN + +// Determines whether to support death tests. +// Google Test does not support death tests for VC 7.1 and earlier as +// abort() in a VC 7.1 application compiled as GUI in debug config +// pops up a dialog window that cannot be suppressed programmatically. +#if (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ + (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \ + GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX) +#define GTEST_HAS_DEATH_TEST 1 +#include // NOLINT +#endif + +// We don't support MSVC 7.1 with exceptions disabled now. Therefore +// all the compilers we care about are adequate for supporting +// value-parameterized tests. +#define GTEST_HAS_PARAM_TEST 1 + +// Determines whether to support type-driven tests. + +// Typed tests need and variadic macros, which GCC, VC++ 8.0, +// Sun Pro CC, and IBM Visual Age support. +#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \ + defined(__IBMCPP__) +#define GTEST_HAS_TYPED_TEST 1 +#define GTEST_HAS_TYPED_TEST_P 1 +#endif + +// Determines whether to support Combine(). This only makes sense when +// value-parameterized tests are enabled. The implementation doesn't +// work on Sun Studio since it doesn't understand templated conversion +// operators. +#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC) +#define GTEST_HAS_COMBINE 1 +#endif + +// Determines whether the system compiler uses UTF-16 for encoding wide strings. +#define GTEST_WIDE_STRING_USES_UTF16_ \ + (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX) + +// Defines some utility macros. + +// The GNU compiler emits a warning if nested "if" statements are followed by +// an "else" statement and braces are not used to explicitly disambiguate the +// "else" binding. This leads to problems with code like: +// +// if (gate) +// ASSERT_*(condition) << "Some message"; +// +// The "switch (0) case 0:" idiom is used to suppress this. +#ifdef __INTEL_COMPILER +#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ +#else +#define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: // NOLINT +#endif + +// Use this annotation at the end of a struct/class definition to +// prevent the compiler from optimizing away instances that are never +// used. This is useful when all interesting logic happens inside the +// c'tor and / or d'tor. Example: +// +// struct Foo { +// Foo() { ... } +// } GTEST_ATTRIBUTE_UNUSED_; +// +// Also use it after a variable or parameter declaration to tell the +// compiler the variable/parameter does not have to be used. +#if defined(__GNUC__) && !defined(COMPILER_ICC) +#define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) +#else +#define GTEST_ATTRIBUTE_UNUSED_ +#endif + +// A macro to disallow operator= +// This should be used in the private: declarations for a class. +#define GTEST_DISALLOW_ASSIGN_(type)\ + void operator=(type const &) + +// A macro to disallow copy constructor and operator= +// This should be used in the private: declarations for a class. +#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\ + type(type const &);\ + GTEST_DISALLOW_ASSIGN_(type) + +// Tell the compiler to warn about unused return values for functions declared +// with this macro. The macro should be used on function declarations +// following the argument list: +// +// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; +#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC) +#define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) +#else +#define GTEST_MUST_USE_RESULT_ +#endif // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC + +// Determine whether the compiler supports Microsoft's Structured Exception +// Handling. This is supported by several Windows compilers but generally +// does not exist on any other system. +#ifndef GTEST_HAS_SEH +// The user didn't tell us, so we need to figure it out. + +#if defined(_MSC_VER) || defined(__BORLANDC__) +// These two compilers are known to support SEH. +#define GTEST_HAS_SEH 1 +#else +// Assume no SEH. +#define GTEST_HAS_SEH 0 +#endif + +#endif // GTEST_HAS_SEH + +#ifdef _MSC_VER + +#if GTEST_LINKED_AS_SHARED_LIBRARY +#define GTEST_API_ __declspec(dllimport) +#elif GTEST_CREATE_SHARED_LIBRARY +#define GTEST_API_ __declspec(dllexport) +#endif + +#endif // _MSC_VER + +#ifndef GTEST_API_ +#define GTEST_API_ +#endif + +namespace testing { + +class Message; + +namespace internal { + +class String; + +typedef ::std::stringstream StrStream; + +// A helper for suppressing warnings on constant condition. It just +// returns 'condition'. +GTEST_API_ bool IsTrue(bool condition); + +// Defines scoped_ptr. + +// This implementation of scoped_ptr is PARTIAL - it only contains +// enough stuff to satisfy Google Test's need. +template +class scoped_ptr { + public: + typedef T element_type; + + explicit scoped_ptr(T* p = NULL) : ptr_(p) {} + ~scoped_ptr() { reset(); } + + T& operator*() const { return *ptr_; } + T* operator->() const { return ptr_; } + T* get() const { return ptr_; } + + T* release() { + T* const ptr = ptr_; + ptr_ = NULL; + return ptr; + } + + void reset(T* p = NULL) { + if (p != ptr_) { + if (IsTrue(sizeof(T) > 0)) { // Makes sure T is a complete type. + delete ptr_; + } + ptr_ = p; + } + } + private: + T* ptr_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr); +}; + +// Defines RE. + +// A simple C++ wrapper for . It uses the POSIX Extended +// Regular Expression syntax. +class GTEST_API_ RE { + public: + // A copy constructor is required by the Standard to initialize object + // references from r-values. + RE(const RE& other) { Init(other.pattern()); } + + // Constructs an RE from a string. + RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT + +#if GTEST_HAS_GLOBAL_STRING + RE(const ::string& regex) { Init(regex.c_str()); } // NOLINT +#endif // GTEST_HAS_GLOBAL_STRING + + RE(const char* regex) { Init(regex); } // NOLINT + ~RE(); + + // Returns the string representation of the regex. + const char* pattern() const { return pattern_; } + + // FullMatch(str, re) returns true iff regular expression re matches + // the entire str. + // PartialMatch(str, re) returns true iff regular expression re + // matches a substring of str (including str itself). + // + // TODO(wan@google.com): make FullMatch() and PartialMatch() work + // when str contains NUL characters. + static bool FullMatch(const ::std::string& str, const RE& re) { + return FullMatch(str.c_str(), re); + } + static bool PartialMatch(const ::std::string& str, const RE& re) { + return PartialMatch(str.c_str(), re); + } + +#if GTEST_HAS_GLOBAL_STRING + static bool FullMatch(const ::string& str, const RE& re) { + return FullMatch(str.c_str(), re); + } + static bool PartialMatch(const ::string& str, const RE& re) { + return PartialMatch(str.c_str(), re); + } +#endif // GTEST_HAS_GLOBAL_STRING + + static bool FullMatch(const char* str, const RE& re); + static bool PartialMatch(const char* str, const RE& re); + + private: + void Init(const char* regex); + + // We use a const char* instead of a string, as Google Test may be used + // where string is not available. We also do not use Google Test's own + // String type here, in order to simplify dependencies between the + // files. + const char* pattern_; + bool is_valid_; +#if GTEST_USES_POSIX_RE + regex_t full_regex_; // For FullMatch(). + regex_t partial_regex_; // For PartialMatch(). +#else // GTEST_USES_SIMPLE_RE + const char* full_pattern_; // For FullMatch(); +#endif + + GTEST_DISALLOW_ASSIGN_(RE); +}; + +// Defines logging utilities: +// GTEST_LOG_(severity) - logs messages at the specified severity level. The +// message itself is streamed into the macro. +// LogToStderr() - directs all log messages to stderr. +// FlushInfoLog() - flushes informational log messages. + +enum GTestLogSeverity { + GTEST_INFO, + GTEST_WARNING, + GTEST_ERROR, + GTEST_FATAL +}; + +// Formats log entry severity, provides a stream object for streaming the +// log message, and terminates the message with a newline when going out of +// scope. +class GTEST_API_ GTestLog { + public: + GTestLog(GTestLogSeverity severity, const char* file, int line); + + // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. + ~GTestLog(); + + ::std::ostream& GetStream() { return ::std::cerr; } + + private: + const GTestLogSeverity severity_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); +}; + +#define GTEST_LOG_(severity) \ + ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ + __FILE__, __LINE__).GetStream() + +inline void LogToStderr() {} +inline void FlushInfoLog() { fflush(NULL); } + +// INTERNAL IMPLEMENTATION - DO NOT USE. +// +// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition +// is not satisfied. +// Synopsys: +// GTEST_CHECK_(boolean_condition); +// or +// GTEST_CHECK_(boolean_condition) << "Additional message"; +// +// This checks the condition and if the condition is not satisfied +// it prints message about the condition violation, including the +// condition itself, plus additional message streamed into it, if any, +// and then it aborts the program. It aborts the program irrespective of +// whether it is built in the debug mode or not. +#define GTEST_CHECK_(condition) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::IsTrue(condition)) \ + ; \ + else \ + GTEST_LOG_(FATAL) << "Condition " #condition " failed. " + +// An all-mode assert to verify that the given POSIX-style function +// call returns 0 (indicating success). Known limitation: this +// doesn't expand to a balanced 'if' statement, so enclose the macro +// in {} if you need to use it as the only statement in an 'if' +// branch. +#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ + if (const int gtest_error = (posix_call)) \ + GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ + << gtest_error + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Downcasts the pointer of type Base to Derived. +// Derived must be a subclass of Base. The parameter MUST +// point to a class of type Derived, not any subclass of it. +// When RTTI is available, the function performs a runtime +// check to enforce this. +template +Derived* CheckedDowncastToActualType(Base* base) { +#if GTEST_HAS_RTTI + GTEST_CHECK_(typeid(*base) == typeid(Derived)); + return dynamic_cast(base); // NOLINT +#else + return static_cast(base); // Poor man's downcast. +#endif +} + +#if GTEST_HAS_STREAM_REDIRECTION_ + +// Defines the stderr capturer: +// CaptureStdout - starts capturing stdout. +// GetCapturedStdout - stops capturing stdout and returns the captured string. +// CaptureStderr - starts capturing stderr. +// GetCapturedStderr - stops capturing stderr and returns the captured string. +// +GTEST_API_ void CaptureStdout(); +GTEST_API_ String GetCapturedStdout(); +GTEST_API_ void CaptureStderr(); +GTEST_API_ String GetCapturedStderr(); + +#endif // GTEST_HAS_STREAM_REDIRECTION_ + + +#if GTEST_HAS_DEATH_TEST + +// A copy of all command line arguments. Set by InitGoogleTest(). +extern ::std::vector g_argvs; + +// GTEST_HAS_DEATH_TEST implies we have ::std::string. +const ::std::vector& GetArgvs(); + +#endif // GTEST_HAS_DEATH_TEST + +// Defines synchronization primitives. + +#if GTEST_HAS_PTHREAD + +// Sleeps for (roughly) n milli-seconds. This function is only for +// testing Google Test's own constructs. Don't use it in user tests, +// either directly or indirectly. +inline void SleepMilliseconds(int n) { + const timespec time = { + 0, // 0 seconds. + n * 1000L * 1000L, // And n ms. + }; + nanosleep(&time, NULL); +} + +// Allows a controller thread to pause execution of newly created +// threads until notified. Instances of this class must be created +// and destroyed in the controller thread. +// +// This class is only for testing Google Test's own constructs. Do not +// use it in user tests, either directly or indirectly. +class Notification { + public: + Notification() : notified_(false) {} + + // Notifies all threads created with this notification to start. Must + // be called from the controller thread. + void Notify() { notified_ = true; } + + // Blocks until the controller thread notifies. Must be called from a test + // thread. + void WaitForNotification() { + while(!notified_) { + SleepMilliseconds(10); + } + } + + private: + volatile bool notified_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); +}; + +// As a C-function, ThreadFuncWithCLinkage cannot be templated itself. +// Consequently, it cannot select a correct instantiation of ThreadWithParam +// in order to call its Run(). Introducing ThreadWithParamBase as a +// non-templated base class for ThreadWithParam allows us to bypass this +// problem. +class ThreadWithParamBase { + public: + virtual ~ThreadWithParamBase() {} + virtual void Run() = 0; +}; + +// pthread_create() accepts a pointer to a function type with the C linkage. +// According to the Standard (7.5/1), function types with different linkages +// are different even if they are otherwise identical. Some compilers (for +// example, SunStudio) treat them as different types. Since class methods +// cannot be defined with C-linkage we need to define a free C-function to +// pass into pthread_create(). +extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { + static_cast(thread)->Run(); + return NULL; +} + +// Helper class for testing Google Test's multi-threading constructs. +// To use it, write: +// +// void ThreadFunc(int param) { /* Do things with param */ } +// Notification thread_can_start; +// ... +// // The thread_can_start parameter is optional; you can supply NULL. +// ThreadWithParam thread(&ThreadFunc, 5, &thread_can_start); +// thread_can_start.Notify(); +// +// These classes are only for testing Google Test's own constructs. Do +// not use them in user tests, either directly or indirectly. +template +class ThreadWithParam : public ThreadWithParamBase { + public: + typedef void (*UserThreadFunc)(T); + + ThreadWithParam( + UserThreadFunc func, T param, Notification* thread_can_start) + : func_(func), + param_(param), + thread_can_start_(thread_can_start), + finished_(false) { + ThreadWithParamBase* const base = this; + // The thread can be created only after all fields except thread_ + // have been initialized. + GTEST_CHECK_POSIX_SUCCESS_( + pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base)); + } + ~ThreadWithParam() { Join(); } + + void Join() { + if (!finished_) { + GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0)); + finished_ = true; + } + } + + virtual void Run() { + if (thread_can_start_ != NULL) + thread_can_start_->WaitForNotification(); + func_(param_); + } + + private: + const UserThreadFunc func_; // User-supplied thread function. + const T param_; // User-supplied parameter to the thread function. + // When non-NULL, used to block execution until the controller thread + // notifies. + Notification* const thread_can_start_; + bool finished_; // true iff we know that the thread function has finished. + pthread_t thread_; // The native thread object. + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); +}; + +// gtest-port.h guarantees to #include when GTEST_HAS_PTHREAD is +// true. +#include + +// MutexBase and Mutex implement mutex on pthreads-based platforms. They +// are used in conjunction with class MutexLock: +// +// Mutex mutex; +// ... +// MutexLock lock(&mutex); // Acquires the mutex and releases it at the end +// // of the current scope. +// +// MutexBase implements behavior for both statically and dynamically +// allocated mutexes. Do not use MutexBase directly. Instead, write +// the following to define a static mutex: +// +// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); +// +// You can forward declare a static mutex like this: +// +// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); +// +// To create a dynamic mutex, just define an object of type Mutex. +class MutexBase { + public: + // Acquires this mutex. + void Lock() { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); + owner_ = pthread_self(); + } + + // Releases this mutex. + void Unlock() { + // We don't protect writing to owner_ here, as it's the caller's + // responsibility to ensure that the current thread holds the + // mutex when this is called. + owner_ = 0; + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); + } + + // Does nothing if the current thread holds the mutex. Otherwise, crashes + // with high probability. + void AssertHeld() const { + GTEST_CHECK_(owner_ == pthread_self()) + << "The current thread is not holding the mutex @" << this; + } + + // A static mutex may be used before main() is entered. It may even + // be used before the dynamic initialization stage. Therefore we + // must be able to initialize a static mutex object at link time. + // This means MutexBase has to be a POD and its member variables + // have to be public. + public: + pthread_mutex_t mutex_; // The underlying pthread mutex. + pthread_t owner_; // The thread holding the mutex; 0 means no one holds it. +}; + +// Forward-declares a static mutex. +#define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ + extern ::testing::internal::MutexBase mutex + +// Defines and statically (i.e. at link time) initializes a static mutex. +#define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ + ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, 0 } + +// The Mutex class can only be used for mutexes created at runtime. It +// shares its API with MutexBase otherwise. +class Mutex : public MutexBase { + public: + Mutex() { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL)); + owner_ = 0; + } + ~Mutex() { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); +}; + +// We cannot name this class MutexLock as the ctor declaration would +// conflict with a macro named MutexLock, which is defined on some +// platforms. Hence the typedef trick below. +class GTestMutexLock { + public: + explicit GTestMutexLock(MutexBase* mutex) + : mutex_(mutex) { mutex_->Lock(); } + + ~GTestMutexLock() { mutex_->Unlock(); } + + private: + MutexBase* const mutex_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); +}; + +typedef GTestMutexLock MutexLock; + +// Helpers for ThreadLocal. + +// pthread_key_create() requires DeleteThreadLocalValue() to have +// C-linkage. Therefore it cannot be templatized to access +// ThreadLocal. Hence the need for class +// ThreadLocalValueHolderBase. +class ThreadLocalValueHolderBase { + public: + virtual ~ThreadLocalValueHolderBase() {} +}; + +// Called by pthread to delete thread-local data stored by +// pthread_setspecific(). +extern "C" inline void DeleteThreadLocalValue(void* value_holder) { + delete static_cast(value_holder); +} + +// Implements thread-local storage on pthreads-based systems. +// +// // Thread 1 +// ThreadLocal tl(100); // 100 is the default value for each thread. +// +// // Thread 2 +// tl.set(150); // Changes the value for thread 2 only. +// EXPECT_EQ(150, tl.get()); +// +// // Thread 1 +// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. +// tl.set(200); +// EXPECT_EQ(200, tl.get()); +// +// The template type argument T must have a public copy constructor. +// In addition, the default ThreadLocal constructor requires T to have +// a public default constructor. +// +// An object managed for a thread by a ThreadLocal instance is deleted +// when the thread exits. Or, if the ThreadLocal instance dies in +// that thread, when the ThreadLocal dies. It's the user's +// responsibility to ensure that all other threads using a ThreadLocal +// have exited when it dies, or the per-thread objects for those +// threads will not be deleted. +// +// Google Test only uses global ThreadLocal objects. That means they +// will die after main() has returned. Therefore, no per-thread +// object managed by Google Test will be leaked as long as all threads +// using Google Test have exited when main() returns. +template +class ThreadLocal { + public: + ThreadLocal() : key_(CreateKey()), + default_() {} + explicit ThreadLocal(const T& value) : key_(CreateKey()), + default_(value) {} + + ~ThreadLocal() { + // Destroys the managed object for the current thread, if any. + DeleteThreadLocalValue(pthread_getspecific(key_)); + + // Releases resources associated with the key. This will *not* + // delete managed objects for other threads. + GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); + } + + T* pointer() { return GetOrCreateValue(); } + const T* pointer() const { return GetOrCreateValue(); } + const T& get() const { return *pointer(); } + void set(const T& value) { *pointer() = value; } + + private: + // Holds a value of type T. + class ValueHolder : public ThreadLocalValueHolderBase { + public: + explicit ValueHolder(const T& value) : value_(value) {} + + T* pointer() { return &value_; } + + private: + T value_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); + }; + + static pthread_key_t CreateKey() { + pthread_key_t key; + // When a thread exits, DeleteThreadLocalValue() will be called on + // the object managed for that thread. + GTEST_CHECK_POSIX_SUCCESS_( + pthread_key_create(&key, &DeleteThreadLocalValue)); + return key; + } + + T* GetOrCreateValue() const { + ThreadLocalValueHolderBase* const holder = + static_cast(pthread_getspecific(key_)); + if (holder != NULL) { + return CheckedDowncastToActualType(holder)->pointer(); + } + + ValueHolder* const new_holder = new ValueHolder(default_); + ThreadLocalValueHolderBase* const holder_base = new_holder; + GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); + return new_holder->pointer(); + } + + // A key pthreads uses for looking up per-thread values. + const pthread_key_t key_; + const T default_; // The default value for each thread. + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); +}; + +#define GTEST_IS_THREADSAFE 1 + +#else // GTEST_HAS_PTHREAD + +// A dummy implementation of synchronization primitives (mutex, lock, +// and thread-local variable). Necessary for compiling Google Test where +// mutex is not supported - using Google Test in multiple threads is not +// supported on such platforms. + +class Mutex { + public: + Mutex() {} + void AssertHeld() const {} +}; + +#define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ + extern ::testing::internal::Mutex mutex + +#define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex + +class GTestMutexLock { + public: + explicit GTestMutexLock(Mutex*) {} // NOLINT +}; + +typedef GTestMutexLock MutexLock; + +template +class ThreadLocal { + public: + ThreadLocal() : value_() {} + explicit ThreadLocal(const T& value) : value_(value) {} + T* pointer() { return &value_; } + const T* pointer() const { return &value_; } + const T& get() const { return value_; } + void set(const T& value) { value_ = value; } + private: + T value_; +}; + +// The above synchronization primitives have dummy implementations. +// Therefore Google Test is not thread-safe. +#define GTEST_IS_THREADSAFE 0 + +#endif // GTEST_HAS_PTHREAD + +// Returns the number of threads running in the process, or 0 to indicate that +// we cannot detect it. +GTEST_API_ size_t GetThreadCount(); + +// Passing non-POD classes through ellipsis (...) crashes the ARM +// compiler and generates a warning in Sun Studio. The Nokia Symbian +// and the IBM XL C/C++ compiler try to instantiate a copy constructor +// for objects passed through ellipsis (...), failing for uncopyable +// objects. We define this to ensure that only POD is passed through +// ellipsis on these systems. +#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC) +// We lose support for NULL detection where the compiler doesn't like +// passing non-POD classes through ellipsis (...). +#define GTEST_ELLIPSIS_NEEDS_POD_ 1 +#else +#define GTEST_CAN_COMPARE_NULL 1 +#endif + +// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between +// const T& and const T* in a function template. These compilers +// _can_ decide between class template specializations for T and T*, +// so a tr1::type_traits-like is_pointer works. +#if defined(__SYMBIAN32__) || defined(__IBMCPP__) +#define GTEST_NEEDS_IS_POINTER_ 1 +#endif + +template +struct bool_constant { + typedef bool_constant type; + static const bool value = bool_value; +}; +template const bool bool_constant::value; + +typedef bool_constant false_type; +typedef bool_constant true_type; + +template +struct is_pointer : public false_type {}; + +template +struct is_pointer : public true_type {}; + +#if GTEST_OS_WINDOWS +#define GTEST_PATH_SEP_ "\\" +#define GTEST_HAS_ALT_PATH_SEP_ 1 +// The biggest signed integer type the compiler supports. +typedef __int64 BiggestInt; +#else +#define GTEST_PATH_SEP_ "/" +#define GTEST_HAS_ALT_PATH_SEP_ 0 +typedef long long BiggestInt; // NOLINT +#endif // GTEST_OS_WINDOWS + +// The testing::internal::posix namespace holds wrappers for common +// POSIX functions. These wrappers hide the differences between +// Windows/MSVC and POSIX systems. Since some compilers define these +// standard functions as macros, the wrapper cannot have the same name +// as the wrapped function. + +namespace posix { + +// Functions with a different name on Windows. + +#if GTEST_OS_WINDOWS + +typedef struct _stat StatStruct; + +#ifdef __BORLANDC__ +inline int IsATTY(int fd) { return isatty(fd); } +inline int StrCaseCmp(const char* s1, const char* s2) { + return stricmp(s1, s2); +} +inline char* StrDup(const char* src) { return strdup(src); } +#else // !__BORLANDC__ +#if GTEST_OS_WINDOWS_MOBILE +inline int IsATTY(int /* fd */) { return 0; } +#else +inline int IsATTY(int fd) { return _isatty(fd); } +#endif // GTEST_OS_WINDOWS_MOBILE +inline int StrCaseCmp(const char* s1, const char* s2) { + return _stricmp(s1, s2); +} +inline char* StrDup(const char* src) { return _strdup(src); } +#endif // __BORLANDC__ + +#if GTEST_OS_WINDOWS_MOBILE +inline int FileNo(FILE* file) { return reinterpret_cast(_fileno(file)); } +// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this +// time and thus not defined there. +#else +inline int FileNo(FILE* file) { return _fileno(file); } +inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } +inline int RmDir(const char* dir) { return _rmdir(dir); } +inline bool IsDir(const StatStruct& st) { + return (_S_IFDIR & st.st_mode) != 0; +} +#endif // GTEST_OS_WINDOWS_MOBILE + +#else + +typedef struct stat StatStruct; + +inline int FileNo(FILE* file) { return fileno(file); } +inline int IsATTY(int fd) { return isatty(fd); } +inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } +inline int StrCaseCmp(const char* s1, const char* s2) { + return strcasecmp(s1, s2); +} +inline char* StrDup(const char* src) { return strdup(src); } +inline int RmDir(const char* dir) { return rmdir(dir); } +inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } + +#endif // GTEST_OS_WINDOWS + +// Functions deprecated by MSVC 8.0. + +#ifdef _MSC_VER +// Temporarily disable warning 4996 (deprecated function). +#pragma warning(push) +#pragma warning(disable:4996) +#endif + +inline const char* StrNCpy(char* dest, const char* src, size_t n) { + return strncpy(dest, src, n); +} + +// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and +// StrError() aren't needed on Windows CE at this time and thus not +// defined there. + +#if !GTEST_OS_WINDOWS_MOBILE +inline int ChDir(const char* dir) { return chdir(dir); } +#endif +inline FILE* FOpen(const char* path, const char* mode) { + return fopen(path, mode); +} +#if !GTEST_OS_WINDOWS_MOBILE +inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { + return freopen(path, mode, stream); +} +inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } +#endif +inline int FClose(FILE* fp) { return fclose(fp); } +#if !GTEST_OS_WINDOWS_MOBILE +inline int Read(int fd, void* buf, unsigned int count) { + return static_cast(read(fd, buf, count)); +} +inline int Write(int fd, const void* buf, unsigned int count) { + return static_cast(write(fd, buf, count)); +} +inline int Close(int fd) { return close(fd); } +inline const char* StrError(int errnum) { return strerror(errnum); } +#endif +inline const char* GetEnv(const char* name) { +#if GTEST_OS_WINDOWS_MOBILE + // We are on Windows CE, which has no environment variables. + return NULL; +#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) + // Environment variables which we programmatically clear will be set to the + // empty string rather than unset (NULL). Handle that case. + const char* const env = getenv(name); + return (env != NULL && env[0] != '\0') ? env : NULL; +#else + return getenv(name); +#endif +} + +#ifdef _MSC_VER +#pragma warning(pop) // Restores the warning state. +#endif + +#if GTEST_OS_WINDOWS_MOBILE +// Windows CE has no C library. The abort() function is used in +// several places in Google Test. This implementation provides a reasonable +// imitation of standard behaviour. +void Abort(); +#else +inline void Abort() { abort(); } +#endif // GTEST_OS_WINDOWS_MOBILE + +} // namespace posix + +// The maximum number a BiggestInt can represent. This definition +// works no matter BiggestInt is represented in one's complement or +// two's complement. +// +// We cannot rely on numeric_limits in STL, as __int64 and long long +// are not part of standard C++ and numeric_limits doesn't need to be +// defined for them. +const BiggestInt kMaxBiggestInt = + ~(static_cast(1) << (8*sizeof(BiggestInt) - 1)); + +// This template class serves as a compile-time function from size to +// type. It maps a size in bytes to a primitive type with that +// size. e.g. +// +// TypeWithSize<4>::UInt +// +// is typedef-ed to be unsigned int (unsigned integer made up of 4 +// bytes). +// +// Such functionality should belong to STL, but I cannot find it +// there. +// +// Google Test uses this class in the implementation of floating-point +// comparison. +// +// For now it only handles UInt (unsigned int) as that's all Google Test +// needs. Other types can be easily added in the future if need +// arises. +template +class TypeWithSize { + public: + // This prevents the user from using TypeWithSize with incorrect + // values of N. + typedef void UInt; +}; + +// The specialization for size 4. +template <> +class TypeWithSize<4> { + public: + // unsigned int has size 4 in both gcc and MSVC. + // + // As base/basictypes.h doesn't compile on Windows, we cannot use + // uint32, uint64, and etc here. + typedef int Int; + typedef unsigned int UInt; +}; + +// The specialization for size 8. +template <> +class TypeWithSize<8> { + public: +#if GTEST_OS_WINDOWS + typedef __int64 Int; + typedef unsigned __int64 UInt; +#else + typedef long long Int; // NOLINT + typedef unsigned long long UInt; // NOLINT +#endif // GTEST_OS_WINDOWS +}; + +// Integer types of known sizes. +typedef TypeWithSize<4>::Int Int32; +typedef TypeWithSize<4>::UInt UInt32; +typedef TypeWithSize<8>::Int Int64; +typedef TypeWithSize<8>::UInt UInt64; +typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. + +// Utilities for command line flags and environment variables. + +// Macro for referencing flags. +#define GTEST_FLAG(name) FLAGS_gtest_##name + +// Macros for declaring flags. +#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) +#define GTEST_DECLARE_int32_(name) \ + GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) +#define GTEST_DECLARE_string_(name) \ + GTEST_API_ extern ::testing::internal::String GTEST_FLAG(name) + +// Macros for defining flags. +#define GTEST_DEFINE_bool_(name, default_val, doc) \ + GTEST_API_ bool GTEST_FLAG(name) = (default_val) +#define GTEST_DEFINE_int32_(name, default_val, doc) \ + GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) +#define GTEST_DEFINE_string_(name, default_val, doc) \ + GTEST_API_ ::testing::internal::String GTEST_FLAG(name) = (default_val) + +// Parses 'str' for a 32-bit signed integer. If successful, writes the result +// to *value and returns true; otherwise leaves *value unchanged and returns +// false. +// TODO(chandlerc): Find a better way to refactor flag and environment parsing +// out of both gtest-port.cc and gtest.cc to avoid exporting this utility +// function. +bool ParseInt32(const Message& src_text, const char* str, Int32* value); + +// Parses a bool/Int32/string from the environment variable +// corresponding to the given Google Test flag. +bool BoolFromGTestEnv(const char* flag, bool default_val); +GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); +const char* StringFromGTestEnv(const char* flag, const char* default_val); + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h new file mode 100644 index 000000000..aff093dec --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h @@ -0,0 +1,350 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: wan@google.com (Zhanyong Wan), eefacm@gmail.com (Sean Mcafee) +// +// The Google C++ Testing Framework (Google Test) +// +// This header file declares the String class and functions used internally by +// Google Test. They are subject to change without notice. They should not used +// by code external to Google Test. +// +// This header file is #included by . +// It should not be #included by other files. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ + +#ifdef __BORLANDC__ +// string.h is not guaranteed to provide strcpy on C++ Builder. +#include +#endif + +#include +#include + +#include + +namespace testing { +namespace internal { + +// String - a UTF-8 string class. +// +// For historic reasons, we don't use std::string. +// +// TODO(wan@google.com): replace this class with std::string or +// implement it in terms of the latter. +// +// Note that String can represent both NULL and the empty string, +// while std::string cannot represent NULL. +// +// NULL and the empty string are considered different. NULL is less +// than anything (including the empty string) except itself. +// +// This class only provides minimum functionality necessary for +// implementing Google Test. We do not intend to implement a full-fledged +// string class here. +// +// Since the purpose of this class is to provide a substitute for +// std::string on platforms where it cannot be used, we define a copy +// constructor and assignment operators such that we don't need +// conditional compilation in a lot of places. +// +// In order to make the representation efficient, the d'tor of String +// is not virtual. Therefore DO NOT INHERIT FROM String. +class GTEST_API_ String { + public: + // Static utility methods + + // Returns the input enclosed in double quotes if it's not NULL; + // otherwise returns "(null)". For example, "\"Hello\"" is returned + // for input "Hello". + // + // This is useful for printing a C string in the syntax of a literal. + // + // Known issue: escape sequences are not handled yet. + static String ShowCStringQuoted(const char* c_str); + + // Clones a 0-terminated C string, allocating memory using new. The + // caller is responsible for deleting the return value using + // delete[]. Returns the cloned string, or NULL if the input is + // NULL. + // + // This is different from strdup() in string.h, which allocates + // memory using malloc(). + static const char* CloneCString(const char* c_str); + +#if GTEST_OS_WINDOWS_MOBILE + // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be + // able to pass strings to Win32 APIs on CE we need to convert them + // to 'Unicode', UTF-16. + + // Creates a UTF-16 wide string from the given ANSI string, allocating + // memory using new. The caller is responsible for deleting the return + // value using delete[]. Returns the wide string, or NULL if the + // input is NULL. + // + // The wide string is created using the ANSI codepage (CP_ACP) to + // match the behaviour of the ANSI versions of Win32 calls and the + // C runtime. + static LPCWSTR AnsiToUtf16(const char* c_str); + + // Creates an ANSI string from the given wide string, allocating + // memory using new. The caller is responsible for deleting the return + // value using delete[]. Returns the ANSI string, or NULL if the + // input is NULL. + // + // The returned string is created using the ANSI codepage (CP_ACP) to + // match the behaviour of the ANSI versions of Win32 calls and the + // C runtime. + static const char* Utf16ToAnsi(LPCWSTR utf16_str); +#endif + + // Compares two C strings. Returns true iff they have the same content. + // + // Unlike strcmp(), this function can handle NULL argument(s). A + // NULL C string is considered different to any non-NULL C string, + // including the empty string. + static bool CStringEquals(const char* lhs, const char* rhs); + + // Converts a wide C string to a String using the UTF-8 encoding. + // NULL will be converted to "(null)". If an error occurred during + // the conversion, "(failed to convert from wide string)" is + // returned. + static String ShowWideCString(const wchar_t* wide_c_str); + + // Similar to ShowWideCString(), except that this function encloses + // the converted string in double quotes. + static String ShowWideCStringQuoted(const wchar_t* wide_c_str); + + // Compares two wide C strings. Returns true iff they have the same + // content. + // + // Unlike wcscmp(), this function can handle NULL argument(s). A + // NULL C string is considered different to any non-NULL C string, + // including the empty string. + static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); + + // Compares two C strings, ignoring case. Returns true iff they + // have the same content. + // + // Unlike strcasecmp(), this function can handle NULL argument(s). + // A NULL C string is considered different to any non-NULL C string, + // including the empty string. + static bool CaseInsensitiveCStringEquals(const char* lhs, + const char* rhs); + + // Compares two wide C strings, ignoring case. Returns true iff they + // have the same content. + // + // Unlike wcscasecmp(), this function can handle NULL argument(s). + // A NULL C string is considered different to any non-NULL wide C string, + // including the empty string. + // NB: The implementations on different platforms slightly differ. + // On windows, this method uses _wcsicmp which compares according to LC_CTYPE + // environment variable. On GNU platform this method uses wcscasecmp + // which compares according to LC_CTYPE category of the current locale. + // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the + // current locale. + static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, + const wchar_t* rhs); + + // Formats a list of arguments to a String, using the same format + // spec string as for printf. + // + // We do not use the StringPrintf class as it is not universally + // available. + // + // The result is limited to 4096 characters (including the tailing + // 0). If 4096 characters are not enough to format the input, + // "" is returned. + static String Format(const char* format, ...); + + // C'tors + + // The default c'tor constructs a NULL string. + String() : c_str_(NULL), length_(0) {} + + // Constructs a String by cloning a 0-terminated C string. + String(const char* a_c_str) { // NOLINT + if (a_c_str == NULL) { + c_str_ = NULL; + length_ = 0; + } else { + ConstructNonNull(a_c_str, strlen(a_c_str)); + } + } + + // Constructs a String by copying a given number of chars from a + // buffer. E.g. String("hello", 3) creates the string "hel", + // String("a\0bcd", 4) creates "a\0bc", String(NULL, 0) creates "", + // and String(NULL, 1) results in access violation. + String(const char* buffer, size_t a_length) { + ConstructNonNull(buffer, a_length); + } + + // The copy c'tor creates a new copy of the string. The two + // String objects do not share content. + String(const String& str) : c_str_(NULL), length_(0) { *this = str; } + + // D'tor. String is intended to be a final class, so the d'tor + // doesn't need to be virtual. + ~String() { delete[] c_str_; } + + // Allows a String to be implicitly converted to an ::std::string or + // ::string, and vice versa. Converting a String containing a NULL + // pointer to ::std::string or ::string is undefined behavior. + // Converting a ::std::string or ::string containing an embedded NUL + // character to a String will result in the prefix up to the first + // NUL character. + String(const ::std::string& str) { + ConstructNonNull(str.c_str(), str.length()); + } + + operator ::std::string() const { return ::std::string(c_str(), length()); } + +#if GTEST_HAS_GLOBAL_STRING + String(const ::string& str) { + ConstructNonNull(str.c_str(), str.length()); + } + + operator ::string() const { return ::string(c_str(), length()); } +#endif // GTEST_HAS_GLOBAL_STRING + + // Returns true iff this is an empty string (i.e. ""). + bool empty() const { return (c_str() != NULL) && (length() == 0); } + + // Compares this with another String. + // Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 + // if this is greater than rhs. + int Compare(const String& rhs) const; + + // Returns true iff this String equals the given C string. A NULL + // string and a non-NULL string are considered not equal. + bool operator==(const char* a_c_str) const { return Compare(a_c_str) == 0; } + + // Returns true iff this String is less than the given String. A + // NULL string is considered less than "". + bool operator<(const String& rhs) const { return Compare(rhs) < 0; } + + // Returns true iff this String doesn't equal the given C string. A NULL + // string and a non-NULL string are considered not equal. + bool operator!=(const char* a_c_str) const { return !(*this == a_c_str); } + + // Returns true iff this String ends with the given suffix. *Any* + // String is considered to end with a NULL or empty suffix. + bool EndsWith(const char* suffix) const; + + // Returns true iff this String ends with the given suffix, not considering + // case. Any String is considered to end with a NULL or empty suffix. + bool EndsWithCaseInsensitive(const char* suffix) const; + + // Returns the length of the encapsulated string, or 0 if the + // string is NULL. + size_t length() const { return length_; } + + // Gets the 0-terminated C string this String object represents. + // The String object still owns the string. Therefore the caller + // should NOT delete the return value. + const char* c_str() const { return c_str_; } + + // Assigns a C string to this object. Self-assignment works. + const String& operator=(const char* a_c_str) { + return *this = String(a_c_str); + } + + // Assigns a String object to this object. Self-assignment works. + const String& operator=(const String& rhs) { + if (this != &rhs) { + delete[] c_str_; + if (rhs.c_str() == NULL) { + c_str_ = NULL; + length_ = 0; + } else { + ConstructNonNull(rhs.c_str(), rhs.length()); + } + } + + return *this; + } + + private: + // Constructs a non-NULL String from the given content. This + // function can only be called when data_ has not been allocated. + // ConstructNonNull(NULL, 0) results in an empty string (""). + // ConstructNonNull(NULL, non_zero) is undefined behavior. + void ConstructNonNull(const char* buffer, size_t a_length) { + char* const str = new char[a_length + 1]; + memcpy(str, buffer, a_length); + str[a_length] = '\0'; + c_str_ = str; + length_ = a_length; + } + + const char* c_str_; + size_t length_; +}; // class String + +// Streams a String to an ostream. Each '\0' character in the String +// is replaced with "\\0". +inline ::std::ostream& operator<<(::std::ostream& os, const String& str) { + if (str.c_str() == NULL) { + os << "(null)"; + } else { + const char* const c_str = str.c_str(); + for (size_t i = 0; i != str.length(); i++) { + if (c_str[i] == '\0') { + os << "\\0"; + } else { + os << c_str[i]; + } + } + } + return os; +} + +// Gets the content of the StrStream's buffer as a String. Each '\0' +// character in the buffer is replaced with "\\0". +GTEST_API_ String StrStreamToString(StrStream* stream); + +// Converts a streamable value to a String. A NULL pointer is +// converted to "(null)". When the input value is a ::string, +// ::std::string, ::wstring, or ::std::wstring object, each NUL +// character in it is replaced with "\\0". + +// Declared here but defined in gtest.h, so that it has access +// to the definition of the Message class, required by the ARM +// compiler. +template +String StreamableToString(const T& streamable); + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h new file mode 100644 index 000000000..16178fc07 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h @@ -0,0 +1,968 @@ +// This file was GENERATED by a script. DO NOT EDIT BY HAND!!! + +// Copyright 2009 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Implements a subset of TR1 tuple needed by Google Test and Google Mock. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ + +#include // For ::std::pair. + +// The compiler used in Symbian has a bug that prevents us from declaring the +// tuple template as a friend (it complains that tuple is redefined). This +// hack bypasses the bug by declaring the members that should otherwise be +// private as public. +// Sun Studio versions < 12 also have the above bug. +#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) +#define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: +#else +#define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ + template friend class tuple; \ + private: +#endif + +// GTEST_n_TUPLE_(T) is the type of an n-tuple. +#define GTEST_0_TUPLE_(T) tuple<> +#define GTEST_1_TUPLE_(T) tuple +#define GTEST_2_TUPLE_(T) tuple +#define GTEST_3_TUPLE_(T) tuple +#define GTEST_4_TUPLE_(T) tuple +#define GTEST_5_TUPLE_(T) tuple +#define GTEST_6_TUPLE_(T) tuple +#define GTEST_7_TUPLE_(T) tuple +#define GTEST_8_TUPLE_(T) tuple +#define GTEST_9_TUPLE_(T) tuple +#define GTEST_10_TUPLE_(T) tuple + +// GTEST_n_TYPENAMES_(T) declares a list of n typenames. +#define GTEST_0_TYPENAMES_(T) +#define GTEST_1_TYPENAMES_(T) typename T##0 +#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1 +#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2 +#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ + typename T##3 +#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ + typename T##3, typename T##4 +#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ + typename T##3, typename T##4, typename T##5 +#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ + typename T##3, typename T##4, typename T##5, typename T##6 +#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ + typename T##3, typename T##4, typename T##5, typename T##6, typename T##7 +#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ + typename T##3, typename T##4, typename T##5, typename T##6, \ + typename T##7, typename T##8 +#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \ + typename T##3, typename T##4, typename T##5, typename T##6, \ + typename T##7, typename T##8, typename T##9 + +// In theory, defining stuff in the ::std namespace is undefined +// behavior. We can do this as we are playing the role of a standard +// library vendor. +namespace std { +namespace tr1 { + +template +class tuple; + +// Anything in namespace gtest_internal is Google Test's INTERNAL +// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. +namespace gtest_internal { + +// ByRef::type is T if T is a reference; otherwise it's const T&. +template +struct ByRef { typedef const T& type; }; // NOLINT +template +struct ByRef { typedef T& type; }; // NOLINT + +// A handy wrapper for ByRef. +#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef::type + +// AddRef::type is T if T is a reference; otherwise it's T&. This +// is the same as tr1::add_reference::type. +template +struct AddRef { typedef T& type; }; // NOLINT +template +struct AddRef { typedef T& type; }; // NOLINT + +// A handy wrapper for AddRef. +#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef::type + +// A helper for implementing get(). +template class Get; + +// A helper for implementing tuple_element. kIndexValid is true +// iff k < the number of fields in tuple type T. +template +struct TupleElement; + +template +struct TupleElement { typedef T0 type; }; + +template +struct TupleElement { typedef T1 type; }; + +template +struct TupleElement { typedef T2 type; }; + +template +struct TupleElement { typedef T3 type; }; + +template +struct TupleElement { typedef T4 type; }; + +template +struct TupleElement { typedef T5 type; }; + +template +struct TupleElement { typedef T6 type; }; + +template +struct TupleElement { typedef T7 type; }; + +template +struct TupleElement { typedef T8 type; }; + +template +struct TupleElement { typedef T9 type; }; + +} // namespace gtest_internal + +template <> +class tuple<> { + public: + tuple() {} + tuple(const tuple& /* t */) {} + tuple& operator=(const tuple& /* t */) { return *this; } +}; + +template +class GTEST_1_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {} + + tuple(const tuple& t) : f0_(t.f0_) {} + + template + tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_1_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) { + f0_ = t.f0_; + return *this; + } + + T0 f0_; +}; + +template +class GTEST_2_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0), + f1_(f1) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {} + + template + tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {} + template + tuple(const ::std::pair& p) : f0_(p.first), f1_(p.second) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_2_TUPLE_(U)& t) { + return CopyFrom(t); + } + template + tuple& operator=(const ::std::pair& p) { + f0_ = p.first; + f1_ = p.second; + return *this; + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + return *this; + } + + T0 f0_; + T1 f1_; +}; + +template +class GTEST_3_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} + + template + tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_3_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; +}; + +template +class GTEST_4_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_(), f3_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2), + f3_(f3) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {} + + template + tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), + f3_(t.f3_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_4_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + f3_ = t.f3_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; + T3 f3_; +}; + +template +class GTEST_5_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, + GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), + f4_(t.f4_) {} + + template + tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), + f3_(t.f3_), f4_(t.f4_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_5_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + f3_ = t.f3_; + f4_ = t.f4_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; + T3 f3_; + T4 f4_; +}; + +template +class GTEST_6_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, + GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), + f5_(f5) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), + f4_(t.f4_), f5_(t.f5_) {} + + template + tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), + f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_6_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + f3_ = t.f3_; + f4_ = t.f4_; + f5_ = t.f5_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; + T3 f3_; + T4 f4_; + T5 f5_; +}; + +template +class GTEST_7_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, + GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2), + f3_(f3), f4_(f4), f5_(f5), f6_(f6) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), + f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} + + template + tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), + f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_7_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + f3_ = t.f3_; + f4_ = t.f4_; + f5_ = t.f5_; + f6_ = t.f6_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; + T3 f3_; + T4 f4_; + T5 f5_; + T6 f6_; +}; + +template +class GTEST_8_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, + GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, + GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), + f5_(f5), f6_(f6), f7_(f7) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), + f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} + + template + tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), + f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_8_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + f3_ = t.f3_; + f4_ = t.f4_; + f5_ = t.f5_; + f6_ = t.f6_; + f7_ = t.f7_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; + T3 f3_; + T4 f4_; + T5 f5_; + T6 f6_; + T7 f7_; +}; + +template +class GTEST_9_TUPLE_(T) { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, + GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, + GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4), + f5_(f5), f6_(f6), f7_(f7), f8_(f8) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), + f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} + + template + tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), + f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_9_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + f3_ = t.f3_; + f4_ = t.f4_; + f5_ = t.f5_; + f6_ = t.f6_; + f7_ = t.f7_; + f8_ = t.f8_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; + T3 f3_; + T4 f4_; + T5 f5_; + T6 f6_; + T7 f7_; + T8 f8_; +}; + +template +class tuple { + public: + template friend class gtest_internal::Get; + + tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(), + f9_() {} + + explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1, + GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4, + GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7, + GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2), + f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {} + + tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_), + f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {} + + template + tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), + f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), + f9_(t.f9_) {} + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_10_TUPLE_(U)& t) { + return CopyFrom(t); + } + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) { + f0_ = t.f0_; + f1_ = t.f1_; + f2_ = t.f2_; + f3_ = t.f3_; + f4_ = t.f4_; + f5_ = t.f5_; + f6_ = t.f6_; + f7_ = t.f7_; + f8_ = t.f8_; + f9_ = t.f9_; + return *this; + } + + T0 f0_; + T1 f1_; + T2 f2_; + T3 f3_; + T4 f4_; + T5 f5_; + T6 f6_; + T7 f7_; + T8 f8_; + T9 f9_; +}; + +// 6.1.3.2 Tuple creation functions. + +// Known limitations: we don't support passing an +// std::tr1::reference_wrapper to make_tuple(). And we don't +// implement tie(). + +inline tuple<> make_tuple() { return tuple<>(); } + +template +inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) { + return GTEST_1_TUPLE_(T)(f0); +} + +template +inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) { + return GTEST_2_TUPLE_(T)(f0, f1); +} + +template +inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) { + return GTEST_3_TUPLE_(T)(f0, f1, f2); +} + +template +inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, + const T3& f3) { + return GTEST_4_TUPLE_(T)(f0, f1, f2, f3); +} + +template +inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, + const T3& f3, const T4& f4) { + return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4); +} + +template +inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, + const T3& f3, const T4& f4, const T5& f5) { + return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5); +} + +template +inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, + const T3& f3, const T4& f4, const T5& f5, const T6& f6) { + return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6); +} + +template +inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, + const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) { + return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7); +} + +template +inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, + const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, + const T8& f8) { + return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8); +} + +template +inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2, + const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7, + const T8& f8, const T9& f9) { + return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9); +} + +// 6.1.3.3 Tuple helper classes. + +template struct tuple_size; + +template +struct tuple_size { static const int value = 0; }; + +template +struct tuple_size { static const int value = 1; }; + +template +struct tuple_size { static const int value = 2; }; + +template +struct tuple_size { static const int value = 3; }; + +template +struct tuple_size { static const int value = 4; }; + +template +struct tuple_size { static const int value = 5; }; + +template +struct tuple_size { static const int value = 6; }; + +template +struct tuple_size { static const int value = 7; }; + +template +struct tuple_size { static const int value = 8; }; + +template +struct tuple_size { static const int value = 9; }; + +template +struct tuple_size { static const int value = 10; }; + +template +struct tuple_element { + typedef typename gtest_internal::TupleElement< + k < (tuple_size::value), k, Tuple>::type type; +}; + +#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element::type + +// 6.1.3.4 Element access. + +namespace gtest_internal { + +template <> +class Get<0> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) + Field(Tuple& t) { return t.f0_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple)) + ConstField(const Tuple& t) { return t.f0_; } +}; + +template <> +class Get<1> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) + Field(Tuple& t) { return t.f1_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple)) + ConstField(const Tuple& t) { return t.f1_; } +}; + +template <> +class Get<2> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) + Field(Tuple& t) { return t.f2_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple)) + ConstField(const Tuple& t) { return t.f2_; } +}; + +template <> +class Get<3> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) + Field(Tuple& t) { return t.f3_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple)) + ConstField(const Tuple& t) { return t.f3_; } +}; + +template <> +class Get<4> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) + Field(Tuple& t) { return t.f4_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple)) + ConstField(const Tuple& t) { return t.f4_; } +}; + +template <> +class Get<5> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) + Field(Tuple& t) { return t.f5_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple)) + ConstField(const Tuple& t) { return t.f5_; } +}; + +template <> +class Get<6> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) + Field(Tuple& t) { return t.f6_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple)) + ConstField(const Tuple& t) { return t.f6_; } +}; + +template <> +class Get<7> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) + Field(Tuple& t) { return t.f7_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple)) + ConstField(const Tuple& t) { return t.f7_; } +}; + +template <> +class Get<8> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) + Field(Tuple& t) { return t.f8_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple)) + ConstField(const Tuple& t) { return t.f8_; } +}; + +template <> +class Get<9> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) + Field(Tuple& t) { return t.f9_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple)) + ConstField(const Tuple& t) { return t.f9_; } +}; + +} // namespace gtest_internal + +template +GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) +get(GTEST_10_TUPLE_(T)& t) { + return gtest_internal::Get::Field(t); +} + +template +GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T))) +get(const GTEST_10_TUPLE_(T)& t) { + return gtest_internal::Get::ConstField(t); +} + +// 6.1.3.5 Relational operators + +// We only implement == and !=, as we don't have a need for the rest yet. + +namespace gtest_internal { + +// SameSizeTuplePrefixComparator::Eq(t1, t2) returns true if the +// first k fields of t1 equals the first k fields of t2. +// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if +// k1 != k2. +template +struct SameSizeTuplePrefixComparator; + +template <> +struct SameSizeTuplePrefixComparator<0, 0> { + template + static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { + return true; + } +}; + +template +struct SameSizeTuplePrefixComparator { + template + static bool Eq(const Tuple1& t1, const Tuple2& t2) { + return SameSizeTuplePrefixComparator::Eq(t1, t2) && + ::std::tr1::get(t1) == ::std::tr1::get(t2); + } +}; + +} // namespace gtest_internal + +template +inline bool operator==(const GTEST_10_TUPLE_(T)& t, + const GTEST_10_TUPLE_(U)& u) { + return gtest_internal::SameSizeTuplePrefixComparator< + tuple_size::value, + tuple_size::value>::Eq(t, u); +} + +template +inline bool operator!=(const GTEST_10_TUPLE_(T)& t, + const GTEST_10_TUPLE_(U)& u) { return !(t == u); } + +// 6.1.4 Pairs. +// Unimplemented. + +} // namespace tr1 +} // namespace std + +#undef GTEST_0_TUPLE_ +#undef GTEST_1_TUPLE_ +#undef GTEST_2_TUPLE_ +#undef GTEST_3_TUPLE_ +#undef GTEST_4_TUPLE_ +#undef GTEST_5_TUPLE_ +#undef GTEST_6_TUPLE_ +#undef GTEST_7_TUPLE_ +#undef GTEST_8_TUPLE_ +#undef GTEST_9_TUPLE_ +#undef GTEST_10_TUPLE_ + +#undef GTEST_0_TYPENAMES_ +#undef GTEST_1_TYPENAMES_ +#undef GTEST_2_TYPENAMES_ +#undef GTEST_3_TYPENAMES_ +#undef GTEST_4_TYPENAMES_ +#undef GTEST_5_TYPENAMES_ +#undef GTEST_6_TYPENAMES_ +#undef GTEST_7_TYPENAMES_ +#undef GTEST_8_TYPENAMES_ +#undef GTEST_9_TYPENAMES_ +#undef GTEST_10_TYPENAMES_ + +#undef GTEST_DECLARE_TUPLE_AS_FRIEND_ +#undef GTEST_BY_REF_ +#undef GTEST_ADD_REF_ +#undef GTEST_TUPLE_ELEMENT_ + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump new file mode 100644 index 000000000..85ebc8062 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump @@ -0,0 +1,336 @@ +$$ -*- mode: c++; -*- +$var n = 10 $$ Maximum number of tuple fields we want to support. +$$ This meta comment fixes auto-indentation in Emacs. }} +// Copyright 2009 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Implements a subset of TR1 tuple needed by Google Test and Google Mock. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ + +#include // For ::std::pair. + +// The compiler used in Symbian has a bug that prevents us from declaring the +// tuple template as a friend (it complains that tuple is redefined). This +// hack bypasses the bug by declaring the members that should otherwise be +// private as public. +// Sun Studio versions < 12 also have the above bug. +#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) +#define GTEST_DECLARE_TUPLE_AS_FRIEND_ public: +#else +#define GTEST_DECLARE_TUPLE_AS_FRIEND_ \ + template friend class tuple; \ + private: +#endif + + +$range i 0..n-1 +$range j 0..n +$range k 1..n +// GTEST_n_TUPLE_(T) is the type of an n-tuple. +#define GTEST_0_TUPLE_(T) tuple<> + +$for k [[ +$range m 0..k-1 +$range m2 k..n-1 +#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]> + +]] + +// GTEST_n_TYPENAMES_(T) declares a list of n typenames. + +$for j [[ +$range m 0..j-1 +#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]] + + +]] + +// In theory, defining stuff in the ::std namespace is undefined +// behavior. We can do this as we are playing the role of a standard +// library vendor. +namespace std { +namespace tr1 { + +template <$for i, [[typename T$i = void]]> +class tuple; + +// Anything in namespace gtest_internal is Google Test's INTERNAL +// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code. +namespace gtest_internal { + +// ByRef::type is T if T is a reference; otherwise it's const T&. +template +struct ByRef { typedef const T& type; }; // NOLINT +template +struct ByRef { typedef T& type; }; // NOLINT + +// A handy wrapper for ByRef. +#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef::type + +// AddRef::type is T if T is a reference; otherwise it's T&. This +// is the same as tr1::add_reference::type. +template +struct AddRef { typedef T& type; }; // NOLINT +template +struct AddRef { typedef T& type; }; // NOLINT + +// A handy wrapper for AddRef. +#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef::type + +// A helper for implementing get(). +template class Get; + +// A helper for implementing tuple_element. kIndexValid is true +// iff k < the number of fields in tuple type T. +template +struct TupleElement; + + +$for i [[ +template +struct TupleElement [[]] +{ typedef T$i type; }; + + +]] +} // namespace gtest_internal + +template <> +class tuple<> { + public: + tuple() {} + tuple(const tuple& /* t */) {} + tuple& operator=(const tuple& /* t */) { return *this; } +}; + + +$for k [[ +$range m 0..k-1 +template +class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] { + public: + template friend class gtest_internal::Get; + + tuple() : $for m, [[f$(m)_()]] {} + + explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]] +$for m, [[f$(m)_(f$m)]] {} + + tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} + + template + tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {} + +$if k == 2 [[ + template + tuple(const ::std::pair& p) : f0_(p.first), f1_(p.second) {} + +]] + + tuple& operator=(const tuple& t) { return CopyFrom(t); } + + template + tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) { + return CopyFrom(t); + } + +$if k == 2 [[ + template + tuple& operator=(const ::std::pair& p) { + f0_ = p.first; + f1_ = p.second; + return *this; + } + +]] + + GTEST_DECLARE_TUPLE_AS_FRIEND_ + + template + tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) { + +$for m [[ + f$(m)_ = t.f$(m)_; + +]] + return *this; + } + + +$for m [[ + T$m f$(m)_; + +]] +}; + + +]] +// 6.1.3.2 Tuple creation functions. + +// Known limitations: we don't support passing an +// std::tr1::reference_wrapper to make_tuple(). And we don't +// implement tie(). + +inline tuple<> make_tuple() { return tuple<>(); } + +$for k [[ +$range m 0..k-1 + +template +inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) { + return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]); +} + +]] + +// 6.1.3.3 Tuple helper classes. + +template struct tuple_size; + + +$for j [[ +template +struct tuple_size { static const int value = $j; }; + + +]] +template +struct tuple_element { + typedef typename gtest_internal::TupleElement< + k < (tuple_size::value), k, Tuple>::type type; +}; + +#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element::type + +// 6.1.3.4 Element access. + +namespace gtest_internal { + + +$for i [[ +template <> +class Get<$i> { + public: + template + static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) + Field(Tuple& t) { return t.f$(i)_; } // NOLINT + + template + static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple)) + ConstField(const Tuple& t) { return t.f$(i)_; } +}; + + +]] +} // namespace gtest_internal + +template +GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) +get(GTEST_$(n)_TUPLE_(T)& t) { + return gtest_internal::Get::Field(t); +} + +template +GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T))) +get(const GTEST_$(n)_TUPLE_(T)& t) { + return gtest_internal::Get::ConstField(t); +} + +// 6.1.3.5 Relational operators + +// We only implement == and !=, as we don't have a need for the rest yet. + +namespace gtest_internal { + +// SameSizeTuplePrefixComparator::Eq(t1, t2) returns true if the +// first k fields of t1 equals the first k fields of t2. +// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if +// k1 != k2. +template +struct SameSizeTuplePrefixComparator; + +template <> +struct SameSizeTuplePrefixComparator<0, 0> { + template + static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) { + return true; + } +}; + +template +struct SameSizeTuplePrefixComparator { + template + static bool Eq(const Tuple1& t1, const Tuple2& t2) { + return SameSizeTuplePrefixComparator::Eq(t1, t2) && + ::std::tr1::get(t1) == ::std::tr1::get(t2); + } +}; + +} // namespace gtest_internal + +template +inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t, + const GTEST_$(n)_TUPLE_(U)& u) { + return gtest_internal::SameSizeTuplePrefixComparator< + tuple_size::value, + tuple_size::value>::Eq(t, u); +} + +template +inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t, + const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); } + +// 6.1.4 Pairs. +// Unimplemented. + +} // namespace tr1 +} // namespace std + + +$for j [[ +#undef GTEST_$(j)_TUPLE_ + +]] + + +$for j [[ +#undef GTEST_$(j)_TYPENAMES_ + +]] + +#undef GTEST_DECLARE_TUPLE_AS_FRIEND_ +#undef GTEST_BY_REF_ +#undef GTEST_ADD_REF_ +#undef GTEST_TUPLE_ELEMENT_ + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h new file mode 100644 index 000000000..093eee6f0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h @@ -0,0 +1,3321 @@ +// This file was GENERATED by command: +// pump.py gtest-type-util.h.pump +// DO NOT EDIT BY HAND!!! + +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Type utilities needed for implementing typed and type-parameterized +// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +// Currently we support at most 50 types in a list, and at most 50 +// type-parameterized tests in one type-parameterized test case. +// Please contact googletestframework@googlegroups.com if you need +// more. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ + +#include +#include + +#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +// #ifdef __GNUC__ is too general here. It is possible to use gcc without using +// libstdc++ (which is where cxxabi.h comes from). +#ifdef __GLIBCXX__ +#include +#endif // __GLIBCXX__ + +namespace testing { +namespace internal { + +// AssertyTypeEq::type is defined iff T1 and T2 are the same +// type. This can be used as a compile-time assertion to ensure that +// two types are equal. + +template +struct AssertTypeEq; + +template +struct AssertTypeEq { + typedef bool type; +}; + +// GetTypeName() returns a human-readable name of type T. +template +String GetTypeName() { +#if GTEST_HAS_RTTI + + const char* const name = typeid(T).name(); +#ifdef __GLIBCXX__ + int status = 0; + // gcc's implementation of typeid(T).name() mangles the type name, + // so we have to demangle it. + char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status); + const String name_str(status == 0 ? readable_name : name); + free(readable_name); + return name_str; +#else + return name; +#endif // __GLIBCXX__ + +#else + return ""; +#endif // GTEST_HAS_RTTI +} + +// A unique type used as the default value for the arguments of class +// template Types. This allows us to simulate variadic templates +// (e.g. Types, Type, and etc), which C++ doesn't +// support directly. +struct None {}; + +// The following family of struct and struct templates are used to +// represent type lists. In particular, TypesN +// represents a type list with N types (T1, T2, ..., and TN) in it. +// Except for Types0, every struct in the family has two member types: +// Head for the first type in the list, and Tail for the rest of the +// list. + +// The empty type list. +struct Types0 {}; + +// Type lists of length 1, 2, 3, and so on. + +template +struct Types1 { + typedef T1 Head; + typedef Types0 Tail; +}; +template +struct Types2 { + typedef T1 Head; + typedef Types1 Tail; +}; + +template +struct Types3 { + typedef T1 Head; + typedef Types2 Tail; +}; + +template +struct Types4 { + typedef T1 Head; + typedef Types3 Tail; +}; + +template +struct Types5 { + typedef T1 Head; + typedef Types4 Tail; +}; + +template +struct Types6 { + typedef T1 Head; + typedef Types5 Tail; +}; + +template +struct Types7 { + typedef T1 Head; + typedef Types6 Tail; +}; + +template +struct Types8 { + typedef T1 Head; + typedef Types7 Tail; +}; + +template +struct Types9 { + typedef T1 Head; + typedef Types8 Tail; +}; + +template +struct Types10 { + typedef T1 Head; + typedef Types9 Tail; +}; + +template +struct Types11 { + typedef T1 Head; + typedef Types10 Tail; +}; + +template +struct Types12 { + typedef T1 Head; + typedef Types11 Tail; +}; + +template +struct Types13 { + typedef T1 Head; + typedef Types12 Tail; +}; + +template +struct Types14 { + typedef T1 Head; + typedef Types13 Tail; +}; + +template +struct Types15 { + typedef T1 Head; + typedef Types14 Tail; +}; + +template +struct Types16 { + typedef T1 Head; + typedef Types15 Tail; +}; + +template +struct Types17 { + typedef T1 Head; + typedef Types16 Tail; +}; + +template +struct Types18 { + typedef T1 Head; + typedef Types17 Tail; +}; + +template +struct Types19 { + typedef T1 Head; + typedef Types18 Tail; +}; + +template +struct Types20 { + typedef T1 Head; + typedef Types19 Tail; +}; + +template +struct Types21 { + typedef T1 Head; + typedef Types20 Tail; +}; + +template +struct Types22 { + typedef T1 Head; + typedef Types21 Tail; +}; + +template +struct Types23 { + typedef T1 Head; + typedef Types22 Tail; +}; + +template +struct Types24 { + typedef T1 Head; + typedef Types23 Tail; +}; + +template +struct Types25 { + typedef T1 Head; + typedef Types24 Tail; +}; + +template +struct Types26 { + typedef T1 Head; + typedef Types25 Tail; +}; + +template +struct Types27 { + typedef T1 Head; + typedef Types26 Tail; +}; + +template +struct Types28 { + typedef T1 Head; + typedef Types27 Tail; +}; + +template +struct Types29 { + typedef T1 Head; + typedef Types28 Tail; +}; + +template +struct Types30 { + typedef T1 Head; + typedef Types29 Tail; +}; + +template +struct Types31 { + typedef T1 Head; + typedef Types30 Tail; +}; + +template +struct Types32 { + typedef T1 Head; + typedef Types31 Tail; +}; + +template +struct Types33 { + typedef T1 Head; + typedef Types32 Tail; +}; + +template +struct Types34 { + typedef T1 Head; + typedef Types33 Tail; +}; + +template +struct Types35 { + typedef T1 Head; + typedef Types34 Tail; +}; + +template +struct Types36 { + typedef T1 Head; + typedef Types35 Tail; +}; + +template +struct Types37 { + typedef T1 Head; + typedef Types36 Tail; +}; + +template +struct Types38 { + typedef T1 Head; + typedef Types37 Tail; +}; + +template +struct Types39 { + typedef T1 Head; + typedef Types38 Tail; +}; + +template +struct Types40 { + typedef T1 Head; + typedef Types39 Tail; +}; + +template +struct Types41 { + typedef T1 Head; + typedef Types40 Tail; +}; + +template +struct Types42 { + typedef T1 Head; + typedef Types41 Tail; +}; + +template +struct Types43 { + typedef T1 Head; + typedef Types42 Tail; +}; + +template +struct Types44 { + typedef T1 Head; + typedef Types43 Tail; +}; + +template +struct Types45 { + typedef T1 Head; + typedef Types44 Tail; +}; + +template +struct Types46 { + typedef T1 Head; + typedef Types45 Tail; +}; + +template +struct Types47 { + typedef T1 Head; + typedef Types46 Tail; +}; + +template +struct Types48 { + typedef T1 Head; + typedef Types47 Tail; +}; + +template +struct Types49 { + typedef T1 Head; + typedef Types48 Tail; +}; + +template +struct Types50 { + typedef T1 Head; + typedef Types49 Tail; +}; + + +} // namespace internal + +// We don't want to require the users to write TypesN<...> directly, +// as that would require them to count the length. Types<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Types +// will appear as Types in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Types, and Google Test will translate +// that to TypesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Types template. +template +struct Types { + typedef internal::Types50 type; +}; + +template <> +struct Types { + typedef internal::Types0 type; +}; +template +struct Types { + typedef internal::Types1 type; +}; +template +struct Types { + typedef internal::Types2 type; +}; +template +struct Types { + typedef internal::Types3 type; +}; +template +struct Types { + typedef internal::Types4 type; +}; +template +struct Types { + typedef internal::Types5 type; +}; +template +struct Types { + typedef internal::Types6 type; +}; +template +struct Types { + typedef internal::Types7 type; +}; +template +struct Types { + typedef internal::Types8 type; +}; +template +struct Types { + typedef internal::Types9 type; +}; +template +struct Types { + typedef internal::Types10 type; +}; +template +struct Types { + typedef internal::Types11 type; +}; +template +struct Types { + typedef internal::Types12 type; +}; +template +struct Types { + typedef internal::Types13 type; +}; +template +struct Types { + typedef internal::Types14 type; +}; +template +struct Types { + typedef internal::Types15 type; +}; +template +struct Types { + typedef internal::Types16 type; +}; +template +struct Types { + typedef internal::Types17 type; +}; +template +struct Types { + typedef internal::Types18 type; +}; +template +struct Types { + typedef internal::Types19 type; +}; +template +struct Types { + typedef internal::Types20 type; +}; +template +struct Types { + typedef internal::Types21 type; +}; +template +struct Types { + typedef internal::Types22 type; +}; +template +struct Types { + typedef internal::Types23 type; +}; +template +struct Types { + typedef internal::Types24 type; +}; +template +struct Types { + typedef internal::Types25 type; +}; +template +struct Types { + typedef internal::Types26 type; +}; +template +struct Types { + typedef internal::Types27 type; +}; +template +struct Types { + typedef internal::Types28 type; +}; +template +struct Types { + typedef internal::Types29 type; +}; +template +struct Types { + typedef internal::Types30 type; +}; +template +struct Types { + typedef internal::Types31 type; +}; +template +struct Types { + typedef internal::Types32 type; +}; +template +struct Types { + typedef internal::Types33 type; +}; +template +struct Types { + typedef internal::Types34 type; +}; +template +struct Types { + typedef internal::Types35 type; +}; +template +struct Types { + typedef internal::Types36 type; +}; +template +struct Types { + typedef internal::Types37 type; +}; +template +struct Types { + typedef internal::Types38 type; +}; +template +struct Types { + typedef internal::Types39 type; +}; +template +struct Types { + typedef internal::Types40 type; +}; +template +struct Types { + typedef internal::Types41 type; +}; +template +struct Types { + typedef internal::Types42 type; +}; +template +struct Types { + typedef internal::Types43 type; +}; +template +struct Types { + typedef internal::Types44 type; +}; +template +struct Types { + typedef internal::Types45 type; +}; +template +struct Types { + typedef internal::Types46 type; +}; +template +struct Types { + typedef internal::Types47 type; +}; +template +struct Types { + typedef internal::Types48 type; +}; +template +struct Types { + typedef internal::Types49 type; +}; + +namespace internal { + +#define GTEST_TEMPLATE_ template class + +// The template "selector" struct TemplateSel is used to +// represent Tmpl, which must be a class template with one type +// parameter, as a type. TemplateSel::Bind::type is defined +// as the type Tmpl. This allows us to actually instantiate the +// template "selected" by TemplateSel. +// +// This trick is necessary for simulating typedef for class templates, +// which C++ doesn't support directly. +template +struct TemplateSel { + template + struct Bind { + typedef Tmpl type; + }; +}; + +#define GTEST_BIND_(TmplSel, T) \ + TmplSel::template Bind::type + +// A unique struct template used as the default value for the +// arguments of class template Templates. This allows us to simulate +// variadic templates (e.g. Templates, Templates, +// and etc), which C++ doesn't support directly. +template +struct NoneT {}; + +// The following family of struct and struct templates are used to +// represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except +// for Templates0, every struct in the family has two member types: +// Head for the selector of the first template in the list, and Tail +// for the rest of the list. + +// The empty template list. +struct Templates0 {}; + +// Template lists of length 1, 2, 3, and so on. + +template +struct Templates1 { + typedef TemplateSel Head; + typedef Templates0 Tail; +}; +template +struct Templates2 { + typedef TemplateSel Head; + typedef Templates1 Tail; +}; + +template +struct Templates3 { + typedef TemplateSel Head; + typedef Templates2 Tail; +}; + +template +struct Templates4 { + typedef TemplateSel Head; + typedef Templates3 Tail; +}; + +template +struct Templates5 { + typedef TemplateSel Head; + typedef Templates4 Tail; +}; + +template +struct Templates6 { + typedef TemplateSel Head; + typedef Templates5 Tail; +}; + +template +struct Templates7 { + typedef TemplateSel Head; + typedef Templates6 Tail; +}; + +template +struct Templates8 { + typedef TemplateSel Head; + typedef Templates7 Tail; +}; + +template +struct Templates9 { + typedef TemplateSel Head; + typedef Templates8 Tail; +}; + +template +struct Templates10 { + typedef TemplateSel Head; + typedef Templates9 Tail; +}; + +template +struct Templates11 { + typedef TemplateSel Head; + typedef Templates10 Tail; +}; + +template +struct Templates12 { + typedef TemplateSel Head; + typedef Templates11 Tail; +}; + +template +struct Templates13 { + typedef TemplateSel Head; + typedef Templates12 Tail; +}; + +template +struct Templates14 { + typedef TemplateSel Head; + typedef Templates13 Tail; +}; + +template +struct Templates15 { + typedef TemplateSel Head; + typedef Templates14 Tail; +}; + +template +struct Templates16 { + typedef TemplateSel Head; + typedef Templates15 Tail; +}; + +template +struct Templates17 { + typedef TemplateSel Head; + typedef Templates16 Tail; +}; + +template +struct Templates18 { + typedef TemplateSel Head; + typedef Templates17 Tail; +}; + +template +struct Templates19 { + typedef TemplateSel Head; + typedef Templates18 Tail; +}; + +template +struct Templates20 { + typedef TemplateSel Head; + typedef Templates19 Tail; +}; + +template +struct Templates21 { + typedef TemplateSel Head; + typedef Templates20 Tail; +}; + +template +struct Templates22 { + typedef TemplateSel Head; + typedef Templates21 Tail; +}; + +template +struct Templates23 { + typedef TemplateSel Head; + typedef Templates22 Tail; +}; + +template +struct Templates24 { + typedef TemplateSel Head; + typedef Templates23 Tail; +}; + +template +struct Templates25 { + typedef TemplateSel Head; + typedef Templates24 Tail; +}; + +template +struct Templates26 { + typedef TemplateSel Head; + typedef Templates25 Tail; +}; + +template +struct Templates27 { + typedef TemplateSel Head; + typedef Templates26 Tail; +}; + +template +struct Templates28 { + typedef TemplateSel Head; + typedef Templates27 Tail; +}; + +template +struct Templates29 { + typedef TemplateSel Head; + typedef Templates28 Tail; +}; + +template +struct Templates30 { + typedef TemplateSel Head; + typedef Templates29 Tail; +}; + +template +struct Templates31 { + typedef TemplateSel Head; + typedef Templates30 Tail; +}; + +template +struct Templates32 { + typedef TemplateSel Head; + typedef Templates31 Tail; +}; + +template +struct Templates33 { + typedef TemplateSel Head; + typedef Templates32 Tail; +}; + +template +struct Templates34 { + typedef TemplateSel Head; + typedef Templates33 Tail; +}; + +template +struct Templates35 { + typedef TemplateSel Head; + typedef Templates34 Tail; +}; + +template +struct Templates36 { + typedef TemplateSel Head; + typedef Templates35 Tail; +}; + +template +struct Templates37 { + typedef TemplateSel Head; + typedef Templates36 Tail; +}; + +template +struct Templates38 { + typedef TemplateSel Head; + typedef Templates37 Tail; +}; + +template +struct Templates39 { + typedef TemplateSel Head; + typedef Templates38 Tail; +}; + +template +struct Templates40 { + typedef TemplateSel Head; + typedef Templates39 Tail; +}; + +template +struct Templates41 { + typedef TemplateSel Head; + typedef Templates40 Tail; +}; + +template +struct Templates42 { + typedef TemplateSel Head; + typedef Templates41 Tail; +}; + +template +struct Templates43 { + typedef TemplateSel Head; + typedef Templates42 Tail; +}; + +template +struct Templates44 { + typedef TemplateSel Head; + typedef Templates43 Tail; +}; + +template +struct Templates45 { + typedef TemplateSel Head; + typedef Templates44 Tail; +}; + +template +struct Templates46 { + typedef TemplateSel Head; + typedef Templates45 Tail; +}; + +template +struct Templates47 { + typedef TemplateSel Head; + typedef Templates46 Tail; +}; + +template +struct Templates48 { + typedef TemplateSel Head; + typedef Templates47 Tail; +}; + +template +struct Templates49 { + typedef TemplateSel Head; + typedef Templates48 Tail; +}; + +template +struct Templates50 { + typedef TemplateSel Head; + typedef Templates49 Tail; +}; + + +// We don't want to require the users to write TemplatesN<...> directly, +// as that would require them to count the length. Templates<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Templates +// will appear as Templates in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Templates, and Google Test will translate +// that to TemplatesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Templates template. +template +struct Templates { + typedef Templates50 type; +}; + +template <> +struct Templates { + typedef Templates0 type; +}; +template +struct Templates { + typedef Templates1 type; +}; +template +struct Templates { + typedef Templates2 type; +}; +template +struct Templates { + typedef Templates3 type; +}; +template +struct Templates { + typedef Templates4 type; +}; +template +struct Templates { + typedef Templates5 type; +}; +template +struct Templates { + typedef Templates6 type; +}; +template +struct Templates { + typedef Templates7 type; +}; +template +struct Templates { + typedef Templates8 type; +}; +template +struct Templates { + typedef Templates9 type; +}; +template +struct Templates { + typedef Templates10 type; +}; +template +struct Templates { + typedef Templates11 type; +}; +template +struct Templates { + typedef Templates12 type; +}; +template +struct Templates { + typedef Templates13 type; +}; +template +struct Templates { + typedef Templates14 type; +}; +template +struct Templates { + typedef Templates15 type; +}; +template +struct Templates { + typedef Templates16 type; +}; +template +struct Templates { + typedef Templates17 type; +}; +template +struct Templates { + typedef Templates18 type; +}; +template +struct Templates { + typedef Templates19 type; +}; +template +struct Templates { + typedef Templates20 type; +}; +template +struct Templates { + typedef Templates21 type; +}; +template +struct Templates { + typedef Templates22 type; +}; +template +struct Templates { + typedef Templates23 type; +}; +template +struct Templates { + typedef Templates24 type; +}; +template +struct Templates { + typedef Templates25 type; +}; +template +struct Templates { + typedef Templates26 type; +}; +template +struct Templates { + typedef Templates27 type; +}; +template +struct Templates { + typedef Templates28 type; +}; +template +struct Templates { + typedef Templates29 type; +}; +template +struct Templates { + typedef Templates30 type; +}; +template +struct Templates { + typedef Templates31 type; +}; +template +struct Templates { + typedef Templates32 type; +}; +template +struct Templates { + typedef Templates33 type; +}; +template +struct Templates { + typedef Templates34 type; +}; +template +struct Templates { + typedef Templates35 type; +}; +template +struct Templates { + typedef Templates36 type; +}; +template +struct Templates { + typedef Templates37 type; +}; +template +struct Templates { + typedef Templates38 type; +}; +template +struct Templates { + typedef Templates39 type; +}; +template +struct Templates { + typedef Templates40 type; +}; +template +struct Templates { + typedef Templates41 type; +}; +template +struct Templates { + typedef Templates42 type; +}; +template +struct Templates { + typedef Templates43 type; +}; +template +struct Templates { + typedef Templates44 type; +}; +template +struct Templates { + typedef Templates45 type; +}; +template +struct Templates { + typedef Templates46 type; +}; +template +struct Templates { + typedef Templates47 type; +}; +template +struct Templates { + typedef Templates48 type; +}; +template +struct Templates { + typedef Templates49 type; +}; + +// The TypeList template makes it possible to use either a single type +// or a Types<...> list in TYPED_TEST_CASE() and +// INSTANTIATE_TYPED_TEST_CASE_P(). + +template +struct TypeList { typedef Types1 type; }; + +template +struct TypeList > { + typedef typename Types::type type; +}; + +} // namespace internal +} // namespace testing + +#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump new file mode 100644 index 000000000..5aed1e554 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump @@ -0,0 +1,287 @@ +$$ -*- mode: c++; -*- +$var n = 50 $$ Maximum length of type lists we want to support. +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Type utilities needed for implementing typed and type-parameterized +// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +// Currently we support at most $n types in a list, and at most $n +// type-parameterized tests in one type-parameterized test case. +// Please contact googletestframework@googlegroups.com if you need +// more. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ + +#include +#include + +#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +// #ifdef __GNUC__ is too general here. It is possible to use gcc without using +// libstdc++ (which is where cxxabi.h comes from). +#ifdef __GLIBCXX__ +#include +#endif // __GLIBCXX__ + +namespace testing { +namespace internal { + +// AssertyTypeEq::type is defined iff T1 and T2 are the same +// type. This can be used as a compile-time assertion to ensure that +// two types are equal. + +template +struct AssertTypeEq; + +template +struct AssertTypeEq { + typedef bool type; +}; + +// GetTypeName() returns a human-readable name of type T. +template +String GetTypeName() { +#if GTEST_HAS_RTTI + + const char* const name = typeid(T).name(); +#ifdef __GLIBCXX__ + int status = 0; + // gcc's implementation of typeid(T).name() mangles the type name, + // so we have to demangle it. + char* const readable_name = abi::__cxa_demangle(name, 0, 0, &status); + const String name_str(status == 0 ? readable_name : name); + free(readable_name); + return name_str; +#else + return name; +#endif // __GLIBCXX__ + +#else + return ""; +#endif // GTEST_HAS_RTTI +} + +// A unique type used as the default value for the arguments of class +// template Types. This allows us to simulate variadic templates +// (e.g. Types, Type, and etc), which C++ doesn't +// support directly. +struct None {}; + +// The following family of struct and struct templates are used to +// represent type lists. In particular, TypesN +// represents a type list with N types (T1, T2, ..., and TN) in it. +// Except for Types0, every struct in the family has two member types: +// Head for the first type in the list, and Tail for the rest of the +// list. + +// The empty type list. +struct Types0 {}; + +// Type lists of length 1, 2, 3, and so on. + +template +struct Types1 { + typedef T1 Head; + typedef Types0 Tail; +}; + +$range i 2..n + +$for i [[ +$range j 1..i +$range k 2..i +template <$for j, [[typename T$j]]> +struct Types$i { + typedef T1 Head; + typedef Types$(i-1)<$for k, [[T$k]]> Tail; +}; + + +]] + +} // namespace internal + +// We don't want to require the users to write TypesN<...> directly, +// as that would require them to count the length. Types<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Types +// will appear as Types in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Types, and Google Test will translate +// that to TypesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Types template. + +$range i 1..n +template <$for i, [[typename T$i = internal::None]]> +struct Types { + typedef internal::Types$n<$for i, [[T$i]]> type; +}; + +template <> +struct Types<$for i, [[internal::None]]> { + typedef internal::Types0 type; +}; + +$range i 1..n-1 +$for i [[ +$range j 1..i +$range k i+1..n +template <$for j, [[typename T$j]]> +struct Types<$for j, [[T$j]]$for k[[, internal::None]]> { + typedef internal::Types$i<$for j, [[T$j]]> type; +}; + +]] + +namespace internal { + +#define GTEST_TEMPLATE_ template class + +// The template "selector" struct TemplateSel is used to +// represent Tmpl, which must be a class template with one type +// parameter, as a type. TemplateSel::Bind::type is defined +// as the type Tmpl. This allows us to actually instantiate the +// template "selected" by TemplateSel. +// +// This trick is necessary for simulating typedef for class templates, +// which C++ doesn't support directly. +template +struct TemplateSel { + template + struct Bind { + typedef Tmpl type; + }; +}; + +#define GTEST_BIND_(TmplSel, T) \ + TmplSel::template Bind::type + +// A unique struct template used as the default value for the +// arguments of class template Templates. This allows us to simulate +// variadic templates (e.g. Templates, Templates, +// and etc), which C++ doesn't support directly. +template +struct NoneT {}; + +// The following family of struct and struct templates are used to +// represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except +// for Templates0, every struct in the family has two member types: +// Head for the selector of the first template in the list, and Tail +// for the rest of the list. + +// The empty template list. +struct Templates0 {}; + +// Template lists of length 1, 2, 3, and so on. + +template +struct Templates1 { + typedef TemplateSel Head; + typedef Templates0 Tail; +}; + +$range i 2..n + +$for i [[ +$range j 1..i +$range k 2..i +template <$for j, [[GTEST_TEMPLATE_ T$j]]> +struct Templates$i { + typedef TemplateSel Head; + typedef Templates$(i-1)<$for k, [[T$k]]> Tail; +}; + + +]] + +// We don't want to require the users to write TemplatesN<...> directly, +// as that would require them to count the length. Templates<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Templates +// will appear as Templates in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Templates, and Google Test will translate +// that to TemplatesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Templates template. + +$range i 1..n +template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]> +struct Templates { + typedef Templates$n<$for i, [[T$i]]> type; +}; + +template <> +struct Templates<$for i, [[NoneT]]> { + typedef Templates0 type; +}; + +$range i 1..n-1 +$for i [[ +$range j 1..i +$range k i+1..n +template <$for j, [[GTEST_TEMPLATE_ T$j]]> +struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> { + typedef Templates$i<$for j, [[T$j]]> type; +}; + +]] + +// The TypeList template makes it possible to use either a single type +// or a Types<...> list in TYPED_TEST_CASE() and +// INSTANTIATE_TYPED_TEST_CASE_P(). + +template +struct TypeList { typedef Types1 type; }; + + +$range i 1..n +template <$for i, [[typename T$i]]> +struct TypeList > { + typedef typename Types<$for i, [[T$i]]>::type type; +}; + +} // namespace internal +} // namespace testing + +#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 b/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 new file mode 100644 index 000000000..2cf20de14 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 @@ -0,0 +1,363 @@ +# This was retrieved from +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi +# See also (perhaps for new versions?) +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi +# +# We've rewritten the inconsistency check code (from avahi), to work +# more broadly. In particular, it no longer assumes ld accepts -zdefs. +# This caused a restructing of the code, but the functionality has only +# changed a little. + +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl @summary figure out how to build C programs using POSIX threads +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2006-05-29 +dnl @license GPLWithACException +dnl +dnl Checks for GCC shared/pthread inconsistency based on work by +dnl Marcin Owsiany + + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi + + # The next part tries to detect GCC inconsistency with -shared on some + # architectures and systems. The problem is that in certain + # configurations, when -shared is specified, GCC "forgets" to + # internally use various flags which are still necessary. + + # + # Prepare the flags + # + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + save_CC="$CC" + + # Try with the flags determined by the earlier checks. + # + # -Wl,-z,defs forces link-time symbol resolution, so that the + # linking checks with -shared actually have any value + # + # FIXME: -fPIC is required for -shared on many architectures, + # so we specify it here, but the right way would probably be to + # properly detect whether it is actually required. + CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CC="$PTHREAD_CC" + + # In order not to create several levels of indentation, we test + # the value of "$done" until we find the cure or run out of ideas. + done="no" + + # First, make sure the CFLAGS we added are actually accepted by our + # compiler. If not (and OS X's ld, for instance, does not accept -z), + # then we can't do this test. + if test x"$done" = xno; then + AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) + AC_TRY_LINK(,, , [done=yes]) + + if test "x$done" = xyes ; then + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([yes]) + fi + fi + + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -pthread is sufficient with -shared]) + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi + + # + # Linux gcc on some architectures such as mips/mipsel forgets + # about -lpthread + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lpthread fixes that]) + LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + # + # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lc_r fixes that]) + LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + if test x"$done" = xno; then + # OK, we have run out of ideas + AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries]) + + # so it's not safe to assume that we may use pthreads + acx_pthread_ok=no + fi + + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" + CC="$save_CC" +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 b/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 new file mode 100644 index 000000000..6598ba75a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 @@ -0,0 +1,74 @@ +dnl GTEST_LIB_CHECK([minimum version [, +dnl action if found [,action if not found]]]) +dnl +dnl Check for the presence of the Google Test library, optionally at a minimum +dnl version, and indicate a viable version with the HAVE_GTEST flag. It defines +dnl standard variables for substitution including GTEST_CPPFLAGS, +dnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines +dnl GTEST_VERSION as the version of Google Test found. Finally, it provides +dnl optional custom action slots in the event GTEST is found or not. +AC_DEFUN([GTEST_LIB_CHECK], +[ +dnl Provide a flag to enable or disable Google Test usage. +AC_ARG_ENABLE([gtest], + [AS_HELP_STRING([--enable-gtest], + [Enable tests using the Google C++ Testing Framework. + (Default is enabled.)])], + [], + [enable_gtest=]) +AC_ARG_VAR([GTEST_CONFIG], + [The exact path of Google Test's 'gtest-config' script.]) +AC_ARG_VAR([GTEST_CPPFLAGS], + [C-like preprocessor flags for Google Test.]) +AC_ARG_VAR([GTEST_CXXFLAGS], + [C++ compile flags for Google Test.]) +AC_ARG_VAR([GTEST_LDFLAGS], + [Linker path and option flags for Google Test.]) +AC_ARG_VAR([GTEST_LIBS], + [Library linking flags for Google Test.]) +AC_ARG_VAR([GTEST_VERSION], + [The version of Google Test available.]) +HAVE_GTEST="no" +AS_IF([test "x${enable_gtest}" != "xno"], + [AC_MSG_CHECKING([for 'gtest-config']) + AS_IF([test "x${enable_gtest}" != "xyes"], + [AS_IF([test -x "${enable_gtest}/scripts/gtest-config"], + [GTEST_CONFIG="${enable_gtest}/scripts/gtest-config"], + [GTEST_CONFIG="${enable_gtest}/bin/gtest-config"]) + AS_IF([test -x "${GTEST_CONFIG}"], [], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([dnl +Unable to locate either a built or installed Google Test. +The specific location '${enable_gtest}' was provided for a built or installed +Google Test, but no 'gtest-config' script could be found at this location.]) + ])], + [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])]) + AS_IF([test -x "${GTEST_CONFIG}"], + [AC_MSG_RESULT([${GTEST_CONFIG}]) + m4_ifval([$1], + [_gtest_min_version="--min-version=$1" + AC_MSG_CHECKING([for Google Test at least version >= $1])], + [_gtest_min_version="--min-version=0" + AC_MSG_CHECKING([for Google Test])]) + AS_IF([${GTEST_CONFIG} ${_gtest_min_version}], + [AC_MSG_RESULT([yes]) + HAVE_GTEST='yes'], + [AC_MSG_RESULT([no])])], + [AC_MSG_RESULT([no])]) + AS_IF([test "x${HAVE_GTEST}" = "xyes"], + [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags` + GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags` + GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags` + GTEST_LIBS=`${GTEST_CONFIG} --libs` + GTEST_VERSION=`${GTEST_CONFIG} --version` + AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])], + [AS_IF([test "x${enable_gtest}" = "xyes"], + [AC_MSG_ERROR([dnl +Google Test was enabled, but no viable version could be found.]) + ])])]) +AC_SUBST([HAVE_GTEST]) +AM_CONDITIONAL([HAVE_GTEST],[test "x$HAVE_GTEST" = "xyes"]) +AS_IF([test "x$HAVE_GTEST" = "xyes"], + [m4_ifval([$2], [$2])], + [m4_ifval([$3], [$3])]) +]) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln new file mode 100644 index 000000000..f7908da11 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln @@ -0,0 +1,45 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest-md", "gtest-md.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main-md", "gtest_main-md.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862033}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test-md", "gtest_prod_test-md.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest-md", "gtest_unittest-md.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.ActiveCfg = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.Build.0 = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.ActiveCfg = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.Build.0 = Release|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.ActiveCfg = Debug|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.Build.0 = Debug|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.ActiveCfg = Release|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.Build.0 = Release|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.ActiveCfg = Debug|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.Build.0 = Debug|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.ActiveCfg = Release|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.Build.0 = Release|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.ActiveCfg = Debug|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.Build.0 = Debug|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.ActiveCfg = Release|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj new file mode 100644 index 000000000..c78a4a4d9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln new file mode 100644 index 000000000..ef4b057ff --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln @@ -0,0 +1,45 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "gtest.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main", "gtest_main.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862032}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest", "gtest_unittest.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test", "gtest_prod_test.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.ActiveCfg = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.Build.0 = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.ActiveCfg = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.Build.0 = Release|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.ActiveCfg = Debug|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.Build.0 = Debug|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.ActiveCfg = Release|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.Build.0 = Release|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.ActiveCfg = Debug|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.Build.0 = Debug|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.ActiveCfg = Release|Win32 + {4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.Build.0 = Release|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.ActiveCfg = Debug|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.Build.0 = Debug|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.ActiveCfg = Release|Win32 + {24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj new file mode 100644 index 000000000..bd2ed81e4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj new file mode 100644 index 000000000..321667f1b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj new file mode 100644 index 000000000..13cc1d4f9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj new file mode 100644 index 000000000..05b05d9ed --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj new file mode 100644 index 000000000..6d7a2f021 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj new file mode 100644 index 000000000..38a5e5663 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj new file mode 100644 index 000000000..cb1f52b1f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py new file mode 100755 index 000000000..e1084056e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Runs the specified tests for Google Test. + +This script requires Python 2.3 or higher. To learn the usage, run it +with -h. +""" + +import os +import sys + +SCRIPT_DIR = os.path.dirname(__file__) or '.' + +sys.path.append(os.path.join(SCRIPT_DIR, 'test')) +import run_tests_util + + +def _Main(): + """Runs all tests for Google Test.""" + + options, args = run_tests_util.ParseArgs('gtest') + test_runner = run_tests_util.TestRunner(script_dir=SCRIPT_DIR) + tests = test_runner.GetTestsToRun(args, + options.configurations, + options.built_configurations) + if not tests: + sys.exit(1) # Incorrect parameters given, abort execution. + + sys.exit(test_runner.RunTests(tests[0], tests[1])) + +if __name__ == '__main__': + _Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h new file mode 100644 index 000000000..92ce16a01 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h @@ -0,0 +1,123 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// Author: vladl@google.com (Vlad Losev) + +// This provides interface PrimeTable that determines whether a number is a +// prime and determines a next prime number. This interface is used +// in Google Test samples demonstrating use of parameterized tests. + +#ifndef GTEST_SAMPLES_PRIME_TABLES_H_ +#define GTEST_SAMPLES_PRIME_TABLES_H_ + +#include + +// The prime table interface. +class PrimeTable { + public: + virtual ~PrimeTable() {} + + // Returns true iff n is a prime number. + virtual bool IsPrime(int n) const = 0; + + // Returns the smallest prime number greater than p; or returns -1 + // if the next prime is beyond the capacity of the table. + virtual int GetNextPrime(int p) const = 0; +}; + +// Implementation #1 calculates the primes on-the-fly. +class OnTheFlyPrimeTable : public PrimeTable { + public: + virtual bool IsPrime(int n) const { + if (n <= 1) return false; + + for (int i = 2; i*i <= n; i++) { + // n is divisible by an integer other than 1 and itself. + if ((n % i) == 0) return false; + } + + return true; + } + + virtual int GetNextPrime(int p) const { + for (int n = p + 1; n > 0; n++) { + if (IsPrime(n)) return n; + } + + return -1; + } +}; + +// Implementation #2 pre-calculates the primes and stores the result +// in an array. +class PreCalculatedPrimeTable : public PrimeTable { + public: + // 'max' specifies the maximum number the prime table holds. + explicit PreCalculatedPrimeTable(int max) + : is_prime_size_(max + 1), is_prime_(new bool[max + 1]) { + CalculatePrimesUpTo(max); + } + virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; } + + virtual bool IsPrime(int n) const { + return 0 <= n && n < is_prime_size_ && is_prime_[n]; + } + + virtual int GetNextPrime(int p) const { + for (int n = p + 1; n < is_prime_size_; n++) { + if (is_prime_[n]) return n; + } + + return -1; + } + + private: + void CalculatePrimesUpTo(int max) { + ::std::fill(is_prime_, is_prime_ + is_prime_size_, true); + is_prime_[0] = is_prime_[1] = false; + + for (int i = 2; i <= max; i++) { + if (!is_prime_[i]) continue; + + // Marks all multiples of i (except i itself) as non-prime. + for (int j = 2*i; j <= max; j += i) { + is_prime_[j] = false; + } + } + } + + const int is_prime_size_; + bool* const is_prime_; + + // Disables compiler warning "assignment operator could not be generated." + void operator=(const PreCalculatedPrimeTable& rhs); +}; + +#endif // GTEST_SAMPLES_PRIME_TABLES_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc new file mode 100644 index 000000000..f171e2609 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc @@ -0,0 +1,68 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + +#include "sample1.h" + +// Returns n! (the factorial of n). For negative n, n! is defined to be 1. +int Factorial(int n) { + int result = 1; + for (int i = 1; i <= n; i++) { + result *= i; + } + + return result; +} + +// Returns true iff n is a prime number. +bool IsPrime(int n) { + // Trivial case 1: small numbers + if (n <= 1) return false; + + // Trivial case 2: even numbers + if (n % 2 == 0) return n == 2; + + // Now, we have that n is odd and n >= 3. + + // Try to divide n by every odd number i, starting from 3 + for (int i = 3; ; i += 2) { + // We only have to try i up to the squre root of n + if (i > n/i) break; + + // Now, we have i <= n/i < n. + // If n is divisible by i, n is not prime. + if (n % i == 0) return false; + } + + // n has no integer factor in the range (1, n), and thus is prime. + return true; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h new file mode 100644 index 000000000..3dfeb98c4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h @@ -0,0 +1,43 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + +#ifndef GTEST_SAMPLES_SAMPLE1_H_ +#define GTEST_SAMPLES_SAMPLE1_H_ + +// Returns n! (the factorial of n). For negative n, n! is defined to be 1. +int Factorial(int n); + +// Returns true iff n is a prime number. +bool IsPrime(int n); + +#endif // GTEST_SAMPLES_SAMPLE1_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc new file mode 100644 index 000000000..3ad6fd653 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc @@ -0,0 +1,145 @@ +// Copyright 2009 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) + +// This sample shows how to use Google Test listener API to implement +// a primitive leak checker. + +#include +#include + +#include + +using ::testing::EmptyTestEventListener; +using ::testing::InitGoogleTest; +using ::testing::Test; +using ::testing::TestCase; +using ::testing::TestEventListeners; +using ::testing::TestInfo; +using ::testing::TestPartResult; +using ::testing::UnitTest; + +namespace { + +// We will track memory used by this class. +class Water { + public: + // Normal Water declarations go here. + + // operator new and operator delete help us control water allocation. + void* operator new(size_t allocation_size) { + allocated_++; + return malloc(allocation_size); + } + + void operator delete(void* block, size_t /* allocation_size */) { + allocated_--; + free(block); + } + + static int allocated() { return allocated_; } + + private: + static int allocated_; +}; + +int Water::allocated_ = 0; + +// This event listener monitors how many Water objects are created and +// destroyed by each test, and reports a failure if a test leaks some Water +// objects. It does this by comparing the number of live Water objects at +// the beginning of a test and at the end of a test. +class LeakChecker : public EmptyTestEventListener { + private: + // Called before a test starts. + virtual void OnTestStart(const TestInfo& /* test_info */) { + initially_allocated_ = Water::allocated(); + } + + // Called after a test ends. + virtual void OnTestEnd(const TestInfo& /* test_info */) { + int difference = Water::allocated() - initially_allocated_; + + // You can generate a failure in any event handler except + // OnTestPartResult. Just use an appropriate Google Test assertion to do + // it. + EXPECT_TRUE(difference <= 0) + << "Leaked " << difference << " unit(s) of Water!"; + } + + int initially_allocated_; +}; + +TEST(ListenersTest, DoesNotLeak) { + Water* water = new Water; + delete water; +} + +// This should fail when the --check_for_leaks command line flag is +// specified. +TEST(ListenersTest, LeaksWater) { + Water* water = new Water; + EXPECT_TRUE(water != NULL); +} + +} // namespace + +int main(int argc, char **argv) { + InitGoogleTest(&argc, argv); + + bool check_for_leaks = false; + if (argc > 1 && strcmp(argv[1], "--check_for_leaks") == 0 ) + check_for_leaks = true; + else + printf("%s\n", "Run this program with --check_for_leaks to enable " + "custom leak checking in the tests."); + + // If we are given the --check_for_leaks command line flag, installs the + // leak checker. + if (check_for_leaks) { + TestEventListeners& listeners = UnitTest::GetInstance()->listeners(); + + // Adds the leak checker to the end of the test event listener list, + // after the default text output printer and the default XML report + // generator. + // + // The order is important - it ensures that failures generated in the + // leak checker's OnTestEnd() method are processed by the text and XML + // printers *before* their OnTestEnd() methods are called, such that + // they are attributed to the right test. Remember that a listener + // receives an OnXyzStart event *after* listeners preceding it in the + // list received that event, and receives an OnXyzEnd event *before* + // listeners preceding it. + // + // We don't need to worry about deleting the new listener later, as + // Google Test will do it. + listeners.Append(new LeakChecker); + } + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc new file mode 100644 index 000000000..01eb5462f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc @@ -0,0 +1,153 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + + +// This sample shows how to write a simple unit test for a function, +// using Google C++ testing framework. +// +// Writing a unit test using Google C++ testing framework is easy as 1-2-3: + + +// Step 1. Include necessary header files such that the stuff your +// test logic needs is declared. +// +// Don't forget gtest.h, which declares the testing framework. + +#include +#include "sample1.h" +#include + + +// Step 2. Use the TEST macro to define your tests. +// +// TEST has two parameters: the test case name and the test name. +// After using the macro, you should define your test logic between a +// pair of braces. You can use a bunch of macros to indicate the +// success or failure of a test. EXPECT_TRUE and EXPECT_EQ are +// examples of such macros. For a complete list, see gtest.h. +// +// +// +// In Google Test, tests are grouped into test cases. This is how we +// keep test code organized. You should put logically related tests +// into the same test case. +// +// The test case name and the test name should both be valid C++ +// identifiers. And you should not use underscore (_) in the names. +// +// Google Test guarantees that each test you define is run exactly +// once, but it makes no guarantee on the order the tests are +// executed. Therefore, you should write your tests in such a way +// that their results don't depend on their order. +// +// + + +// Tests Factorial(). + +// Tests factorial of negative numbers. +TEST(FactorialTest, Negative) { + // This test is named "Negative", and belongs to the "FactorialTest" + // test case. + EXPECT_EQ(1, Factorial(-5)); + EXPECT_EQ(1, Factorial(-1)); + EXPECT_TRUE(Factorial(-10) > 0); + + // + // + // EXPECT_EQ(expected, actual) is the same as + // + // EXPECT_TRUE((expected) == (actual)) + // + // except that it will print both the expected value and the actual + // value when the assertion fails. This is very helpful for + // debugging. Therefore in this case EXPECT_EQ is preferred. + // + // On the other hand, EXPECT_TRUE accepts any Boolean expression, + // and is thus more general. + // + // +} + +// Tests factorial of 0. +TEST(FactorialTest, Zero) { + EXPECT_EQ(1, Factorial(0)); +} + +// Tests factorial of positive numbers. +TEST(FactorialTest, Positive) { + EXPECT_EQ(1, Factorial(1)); + EXPECT_EQ(2, Factorial(2)); + EXPECT_EQ(6, Factorial(3)); + EXPECT_EQ(40320, Factorial(8)); +} + + +// Tests IsPrime() + +// Tests negative input. +TEST(IsPrimeTest, Negative) { + // This test belongs to the IsPrimeTest test case. + + EXPECT_FALSE(IsPrime(-1)); + EXPECT_FALSE(IsPrime(-2)); + EXPECT_FALSE(IsPrime(INT_MIN)); +} + +// Tests some trivial cases. +TEST(IsPrimeTest, Trivial) { + EXPECT_FALSE(IsPrime(0)); + EXPECT_FALSE(IsPrime(1)); + EXPECT_TRUE(IsPrime(2)); + EXPECT_TRUE(IsPrime(3)); +} + +// Tests positive input. +TEST(IsPrimeTest, Positive) { + EXPECT_FALSE(IsPrime(4)); + EXPECT_TRUE(IsPrime(5)); + EXPECT_FALSE(IsPrime(6)); + EXPECT_TRUE(IsPrime(23)); +} + +// Step 3. Call RUN_ALL_TESTS() in main(). +// +// We do this by linking in src/gtest_main.cc file, which consists of +// a main() function which calls RUN_ALL_TESTS() for us. +// +// This runs all the tests you've defined, prints the result, and +// returns 0 if successful, or 1 otherwise. +// +// Did you notice that we didn't register the tests? The +// RUN_ALL_TESTS() macro magically knows about all the tests we +// defined. Isn't this convenient? diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc new file mode 100644 index 000000000..5f763b9bd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc @@ -0,0 +1,56 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + +#include "sample2.h" + +#include + +// Clones a 0-terminated C string, allocating memory using new. +const char* MyString::CloneCString(const char* a_c_string) { + if (a_c_string == NULL) return NULL; + + const size_t len = strlen(a_c_string); + char* const clone = new char[ len + 1 ]; + memcpy(clone, a_c_string, len + 1); + + return clone; +} + +// Sets the 0-terminated C string this MyString object +// represents. +void MyString::Set(const char* a_c_string) { + // Makes sure this works when c_string == c_string_ + const char* const temp = MyString::CloneCString(a_c_string); + delete[] c_string_; + c_string_ = temp; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h new file mode 100644 index 000000000..5b57e6082 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h @@ -0,0 +1,86 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + +#ifndef GTEST_SAMPLES_SAMPLE2_H_ +#define GTEST_SAMPLES_SAMPLE2_H_ + +#include + + +// A simple string class. +class MyString { + private: + const char* c_string_; + const MyString& operator=(const MyString& rhs); + + public: + + // Clones a 0-terminated C string, allocating memory using new. + static const char* CloneCString(const char* a_c_string); + + //////////////////////////////////////////////////////////// + // + // C'tors + + // The default c'tor constructs a NULL string. + MyString() : c_string_(NULL) {} + + // Constructs a MyString by cloning a 0-terminated C string. + explicit MyString(const char* a_c_string) : c_string_(NULL) { + Set(a_c_string); + } + + // Copy c'tor + MyString(const MyString& string) : c_string_(NULL) { + Set(string.c_string_); + } + + //////////////////////////////////////////////////////////// + // + // D'tor. MyString is intended to be a final class, so the d'tor + // doesn't need to be virtual. + ~MyString() { delete[] c_string_; } + + // Gets the 0-terminated C string this MyString object represents. + const char* c_string() const { return c_string_; } + + size_t Length() const { + return c_string_ == NULL ? 0 : strlen(c_string_); + } + + // Sets the 0-terminated C string this MyString object represents. + void Set(const char* c_string); +}; + + +#endif // GTEST_SAMPLES_SAMPLE2_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc new file mode 100644 index 000000000..32232d98c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc @@ -0,0 +1,109 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + + +// This sample shows how to write a more complex unit test for a class +// that has multiple member functions. +// +// Usually, it's a good idea to have one test for each method in your +// class. You don't have to do that exactly, but it helps to keep +// your tests organized. You may also throw in additional tests as +// needed. + +#include "sample2.h" +#include + +// In this example, we test the MyString class (a simple string). + +// Tests the default c'tor. +TEST(MyString, DefaultConstructor) { + const MyString s; + + // Asserts that s.c_string() returns NULL. + // + // + // + // If we write NULL instead of + // + // static_cast(NULL) + // + // in this assertion, it will generate a warning on gcc 3.4. The + // reason is that EXPECT_EQ needs to know the types of its + // arguments in order to print them when it fails. Since NULL is + // #defined as 0, the compiler will use the formatter function for + // int to print it. However, gcc thinks that NULL should be used as + // a pointer, not an int, and therefore complains. + // + // The root of the problem is C++'s lack of distinction between the + // integer number 0 and the null pointer constant. Unfortunately, + // we have to live with this fact. + // + // + EXPECT_STREQ(NULL, s.c_string()); + + EXPECT_EQ(0u, s.Length()); +} + +const char kHelloString[] = "Hello, world!"; + +// Tests the c'tor that accepts a C string. +TEST(MyString, ConstructorFromCString) { + const MyString s(kHelloString); + EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0); + EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1, + s.Length()); +} + +// Tests the copy c'tor. +TEST(MyString, CopyConstructor) { + const MyString s1(kHelloString); + const MyString s2 = s1; + EXPECT_TRUE(strcmp(s2.c_string(), kHelloString) == 0); +} + +// Tests the Set method. +TEST(MyString, Set) { + MyString s; + + s.Set(kHelloString); + EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0); + + // Set should work when the input pointer is the same as the one + // already in the MyString object. + s.Set(s.c_string()); + EXPECT_TRUE(strcmp(s.c_string(), kHelloString) == 0); + + // Can we set the MyString to NULL? + s.Set(NULL); + EXPECT_STREQ(NULL, s.c_string()); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h new file mode 100644 index 000000000..46369a076 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h @@ -0,0 +1,173 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + +#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_ +#define GTEST_SAMPLES_SAMPLE3_INL_H_ + +#include + + +// Queue is a simple queue implemented as a singled-linked list. +// +// The element type must support copy constructor. +template // E is the element type +class Queue; + +// QueueNode is a node in a Queue, which consists of an element of +// type E and a pointer to the next node. +template // E is the element type +class QueueNode { + friend class Queue; + + public: + // Gets the element in this node. + const E& element() const { return element_; } + + // Gets the next node in the queue. + QueueNode* next() { return next_; } + const QueueNode* next() const { return next_; } + + private: + // Creates a node with a given element value. The next pointer is + // set to NULL. + QueueNode(const E& an_element) : element_(an_element), next_(NULL) {} + + // We disable the default assignment operator and copy c'tor. + const QueueNode& operator = (const QueueNode&); + QueueNode(const QueueNode&); + + E element_; + QueueNode* next_; +}; + +template // E is the element type. +class Queue { +public: + + // Creates an empty queue. + Queue() : head_(NULL), last_(NULL), size_(0) {} + + // D'tor. Clears the queue. + ~Queue() { Clear(); } + + // Clears the queue. + void Clear() { + if (size_ > 0) { + // 1. Deletes every node. + QueueNode* node = head_; + QueueNode* next = node->next(); + for (; ;) { + delete node; + node = next; + if (node == NULL) break; + next = node->next(); + } + + // 2. Resets the member variables. + head_ = last_ = NULL; + size_ = 0; + } + } + + // Gets the number of elements. + size_t Size() const { return size_; } + + // Gets the first element of the queue, or NULL if the queue is empty. + QueueNode* Head() { return head_; } + const QueueNode* Head() const { return head_; } + + // Gets the last element of the queue, or NULL if the queue is empty. + QueueNode* Last() { return last_; } + const QueueNode* Last() const { return last_; } + + // Adds an element to the end of the queue. A copy of the element is + // created using the copy constructor, and then stored in the queue. + // Changes made to the element in the queue doesn't affect the source + // object, and vice versa. + void Enqueue(const E& element) { + QueueNode* new_node = new QueueNode(element); + + if (size_ == 0) { + head_ = last_ = new_node; + size_ = 1; + } else { + last_->next_ = new_node; + last_ = new_node; + size_++; + } + } + + // Removes the head of the queue and returns it. Returns NULL if + // the queue is empty. + E* Dequeue() { + if (size_ == 0) { + return NULL; + } + + const QueueNode* const old_head = head_; + head_ = head_->next_; + size_--; + if (size_ == 0) { + last_ = NULL; + } + + E* element = new E(old_head->element()); + delete old_head; + + return element; + } + + // Applies a function/functor on each element of the queue, and + // returns the result in a new queue. The original queue is not + // affected. + template + Queue* Map(F function) const { + Queue* new_queue = new Queue(); + for (const QueueNode* node = head_; node != NULL; node = node->next_) { + new_queue->Enqueue(function(node->element())); + } + + return new_queue; + } + + private: + QueueNode* head_; // The first node of the queue. + QueueNode* last_; // The last node of the queue. + size_t size_; // The number of elements in the queue. + + // We disallow copying a queue. + Queue(const Queue&); + const Queue& operator = (const Queue&); + }; + +#endif // GTEST_SAMPLES_SAMPLE3_INL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc new file mode 100644 index 000000000..34c1ca865 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc @@ -0,0 +1,151 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + + +// In this example, we use a more advanced feature of Google Test called +// test fixture. +// +// A test fixture is a place to hold objects and functions shared by +// all tests in a test case. Using a test fixture avoids duplicating +// the test code necessary to initialize and cleanup those common +// objects for each test. It is also useful for defining sub-routines +// that your tests need to invoke a lot. +// +// +// +// The tests share the test fixture in the sense of code sharing, not +// data sharing. Each test is given its own fresh copy of the +// fixture. You cannot expect the data modified by one test to be +// passed on to another test, which is a bad idea. +// +// The reason for this design is that tests should be independent and +// repeatable. In particular, a test should not fail as the result of +// another test's failure. If one test depends on info produced by +// another test, then the two tests should really be one big test. +// +// The macros for indicating the success/failure of a test +// (EXPECT_TRUE, FAIL, etc) need to know what the current test is +// (when Google Test prints the test result, it tells you which test +// each failure belongs to). Technically, these macros invoke a +// member function of the Test class. Therefore, you cannot use them +// in a global function. That's why you should put test sub-routines +// in a test fixture. +// +// + +#include "sample3-inl.h" +#include + +// To use a test fixture, derive a class from testing::Test. +class QueueTest : public testing::Test { + protected: // You should make the members protected s.t. they can be + // accessed from sub-classes. + + // virtual void SetUp() will be called before each test is run. You + // should define it if you need to initialize the varaibles. + // Otherwise, this can be skipped. + virtual void SetUp() { + q1_.Enqueue(1); + q2_.Enqueue(2); + q2_.Enqueue(3); + } + + // virtual void TearDown() will be called after each test is run. + // You should define it if there is cleanup work to do. Otherwise, + // you don't have to provide it. + // + // virtual void TearDown() { + // } + + // A helper function that some test uses. + static int Double(int n) { + return 2*n; + } + + // A helper function for testing Queue::Map(). + void MapTester(const Queue * q) { + // Creates a new queue, where each element is twice as big as the + // corresponding one in q. + const Queue * const new_q = q->Map(Double); + + // Verifies that the new queue has the same size as q. + ASSERT_EQ(q->Size(), new_q->Size()); + + // Verifies the relationship between the elements of the two queues. + for ( const QueueNode * n1 = q->Head(), * n2 = new_q->Head(); + n1 != NULL; n1 = n1->next(), n2 = n2->next() ) { + EXPECT_EQ(2 * n1->element(), n2->element()); + } + + delete new_q; + } + + // Declares the variables your tests want to use. + Queue q0_; + Queue q1_; + Queue q2_; +}; + +// When you have a test fixture, you define a test using TEST_F +// instead of TEST. + +// Tests the default c'tor. +TEST_F(QueueTest, DefaultConstructor) { + // You can access data in the test fixture here. + EXPECT_EQ(0u, q0_.Size()); +} + +// Tests Dequeue(). +TEST_F(QueueTest, Dequeue) { + int * n = q0_.Dequeue(); + EXPECT_TRUE(n == NULL); + + n = q1_.Dequeue(); + ASSERT_TRUE(n != NULL); + EXPECT_EQ(1, *n); + EXPECT_EQ(0u, q1_.Size()); + delete n; + + n = q2_.Dequeue(); + ASSERT_TRUE(n != NULL); + EXPECT_EQ(2, *n); + EXPECT_EQ(1u, q2_.Size()); + delete n; +} + +// Tests the Queue::Map() function. +TEST_F(QueueTest, Map) { + MapTester(&q0_); + MapTester(&q1_); + MapTester(&q2_); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc new file mode 100644 index 000000000..ae44bda6f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc @@ -0,0 +1,46 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + +#include + +#include "sample4.h" + +// Returns the current counter value, and increments it. +int Counter::Increment() { + return counter_++; +} + +// Prints the current counter value to STDOUT. +void Counter::Print() const { + printf("%d", counter_); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h new file mode 100644 index 000000000..cd60f0dd2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h @@ -0,0 +1,53 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// A sample program demonstrating using Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) + +#ifndef GTEST_SAMPLES_SAMPLE4_H_ +#define GTEST_SAMPLES_SAMPLE4_H_ + +// A simple monotonic counter. +class Counter { + private: + int counter_; + + public: + // Creates a counter that starts at 0. + Counter() : counter_(0) {} + + // Returns the current counter value, and increments it. + int Increment(); + + // Prints the current counter value to STDOUT. + void Print() const; +}; + +#endif // GTEST_SAMPLES_SAMPLE4_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc new file mode 100644 index 000000000..b4fb3736a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc @@ -0,0 +1,45 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include +#include "sample4.h" + +// Tests the Increment() method. +TEST(Counter, Increment) { + Counter c; + + // EXPECT_EQ() evaluates its arguments exactly once, so they + // can have side effects. + + EXPECT_EQ(0, c.Increment()); + EXPECT_EQ(1, c.Increment()); + EXPECT_EQ(2, c.Increment()); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc new file mode 100644 index 000000000..49dae7c69 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc @@ -0,0 +1,199 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// This sample teaches how to reuse a test fixture in multiple test +// cases by deriving sub-fixtures from it. +// +// When you define a test fixture, you specify the name of the test +// case that will use this fixture. Therefore, a test fixture can +// be used by only one test case. +// +// Sometimes, more than one test cases may want to use the same or +// slightly different test fixtures. For example, you may want to +// make sure that all tests for a GUI library don't leak important +// system resources like fonts and brushes. In Google Test, you do +// this by putting the shared logic in a super (as in "super class") +// test fixture, and then have each test case use a fixture derived +// from this super fixture. + +#include +#include +#include "sample3-inl.h" +#include +#include "sample1.h" + +// In this sample, we want to ensure that every test finishes within +// ~5 seconds. If a test takes longer to run, we consider it a +// failure. +// +// We put the code for timing a test in a test fixture called +// "QuickTest". QuickTest is intended to be the super fixture that +// other fixtures derive from, therefore there is no test case with +// the name "QuickTest". This is OK. +// +// Later, we will derive multiple test fixtures from QuickTest. +class QuickTest : public testing::Test { + protected: + // Remember that SetUp() is run immediately before a test starts. + // This is a good place to record the start time. + virtual void SetUp() { + start_time_ = time(NULL); + } + + // TearDown() is invoked immediately after a test finishes. Here we + // check if the test was too slow. + virtual void TearDown() { + // Gets the time when the test finishes + const time_t end_time = time(NULL); + + // Asserts that the test took no more than ~5 seconds. Did you + // know that you can use assertions in SetUp() and TearDown() as + // well? + EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long."; + } + + // The UTC time (in seconds) when the test starts + time_t start_time_; +}; + + +// We derive a fixture named IntegerFunctionTest from the QuickTest +// fixture. All tests using this fixture will be automatically +// required to be quick. +class IntegerFunctionTest : public QuickTest { + // We don't need any more logic than already in the QuickTest fixture. + // Therefore the body is empty. +}; + + +// Now we can write tests in the IntegerFunctionTest test case. + +// Tests Factorial() +TEST_F(IntegerFunctionTest, Factorial) { + // Tests factorial of negative numbers. + EXPECT_EQ(1, Factorial(-5)); + EXPECT_EQ(1, Factorial(-1)); + EXPECT_TRUE(Factorial(-10) > 0); + + // Tests factorial of 0. + EXPECT_EQ(1, Factorial(0)); + + // Tests factorial of positive numbers. + EXPECT_EQ(1, Factorial(1)); + EXPECT_EQ(2, Factorial(2)); + EXPECT_EQ(6, Factorial(3)); + EXPECT_EQ(40320, Factorial(8)); +} + + +// Tests IsPrime() +TEST_F(IntegerFunctionTest, IsPrime) { + // Tests negative input. + EXPECT_TRUE(!IsPrime(-1)); + EXPECT_TRUE(!IsPrime(-2)); + EXPECT_TRUE(!IsPrime(INT_MIN)); + + // Tests some trivial cases. + EXPECT_TRUE(!IsPrime(0)); + EXPECT_TRUE(!IsPrime(1)); + EXPECT_TRUE(IsPrime(2)); + EXPECT_TRUE(IsPrime(3)); + + // Tests positive input. + EXPECT_TRUE(!IsPrime(4)); + EXPECT_TRUE(IsPrime(5)); + EXPECT_TRUE(!IsPrime(6)); + EXPECT_TRUE(IsPrime(23)); +} + + +// The next test case (named "QueueTest") also needs to be quick, so +// we derive another fixture from QuickTest. +// +// The QueueTest test fixture has some logic and shared objects in +// addition to what's in QuickTest already. We define the additional +// stuff inside the body of the test fixture, as usual. +class QueueTest : public QuickTest { + protected: + virtual void SetUp() { + // First, we need to set up the super fixture (QuickTest). + QuickTest::SetUp(); + + // Second, some additional setup for this fixture. + q1_.Enqueue(1); + q2_.Enqueue(2); + q2_.Enqueue(3); + } + + // By default, TearDown() inherits the behavior of + // QuickTest::TearDown(). As we have no additional cleaning work + // for QueueTest, we omit it here. + // + // virtual void TearDown() { + // QuickTest::TearDown(); + // } + + Queue q0_; + Queue q1_; + Queue q2_; +}; + + +// Now, let's write tests using the QueueTest fixture. + +// Tests the default constructor. +TEST_F(QueueTest, DefaultConstructor) { + EXPECT_EQ(0u, q0_.Size()); +} + +// Tests Dequeue(). +TEST_F(QueueTest, Dequeue) { + int* n = q0_.Dequeue(); + EXPECT_TRUE(n == NULL); + + n = q1_.Dequeue(); + EXPECT_TRUE(n != NULL); + EXPECT_EQ(1, *n); + EXPECT_EQ(0u, q1_.Size()); + delete n; + + n = q2_.Dequeue(); + EXPECT_TRUE(n != NULL); + EXPECT_EQ(2, *n); + EXPECT_EQ(1u, q2_.Size()); + delete n; +} + +// If necessary, you can derive further test fixtures from a derived +// fixture itself. For example, you can derive another fixture from +// QueueTest. Google Test imposes no limit on how deep the hierarchy +// can be. In practice, however, you probably don't want it to be too +// deep as to be confusing. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc new file mode 100644 index 000000000..dd0df31f0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc @@ -0,0 +1,224 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// This sample shows how to test common properties of multiple +// implementations of the same interface (aka interface tests). + +// The interface and its implementations are in this header. +#include "prime_tables.h" + +#include + +// First, we define some factory functions for creating instances of +// the implementations. You may be able to skip this step if all your +// implementations can be constructed the same way. + +template +PrimeTable* CreatePrimeTable(); + +template <> +PrimeTable* CreatePrimeTable() { + return new OnTheFlyPrimeTable; +} + +template <> +PrimeTable* CreatePrimeTable() { + return new PreCalculatedPrimeTable(10000); +} + +// Then we define a test fixture class template. +template +class PrimeTableTest : public testing::Test { + protected: + // The ctor calls the factory function to create a prime table + // implemented by T. + PrimeTableTest() : table_(CreatePrimeTable()) {} + + virtual ~PrimeTableTest() { delete table_; } + + // Note that we test an implementation via the base interface + // instead of the actual implementation class. This is important + // for keeping the tests close to the real world scenario, where the + // implementation is invoked via the base interface. It avoids + // got-yas where the implementation class has a method that shadows + // a method with the same name (but slightly different argument + // types) in the base interface, for example. + PrimeTable* const table_; +}; + +#if GTEST_HAS_TYPED_TEST + +using testing::Types; + +// Google Test offers two ways for reusing tests for different types. +// The first is called "typed tests". You should use it if you +// already know *all* the types you are gonna exercise when you write +// the tests. + +// To write a typed test case, first use +// +// TYPED_TEST_CASE(TestCaseName, TypeList); +// +// to declare it and specify the type parameters. As with TEST_F, +// TestCaseName must match the test fixture name. + +// The list of types we want to test. +typedef Types Implementations; + +TYPED_TEST_CASE(PrimeTableTest, Implementations); + +// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test, +// similar to TEST_F. +TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) { + // Inside the test body, you can refer to the type parameter by + // TypeParam, and refer to the fixture class by TestFixture. We + // don't need them in this example. + + // Since we are in the template world, C++ requires explicitly + // writing 'this->' when referring to members of the fixture class. + // This is something you have to learn to live with. + EXPECT_FALSE(this->table_->IsPrime(-5)); + EXPECT_FALSE(this->table_->IsPrime(0)); + EXPECT_FALSE(this->table_->IsPrime(1)); + EXPECT_FALSE(this->table_->IsPrime(4)); + EXPECT_FALSE(this->table_->IsPrime(6)); + EXPECT_FALSE(this->table_->IsPrime(100)); +} + +TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) { + EXPECT_TRUE(this->table_->IsPrime(2)); + EXPECT_TRUE(this->table_->IsPrime(3)); + EXPECT_TRUE(this->table_->IsPrime(5)); + EXPECT_TRUE(this->table_->IsPrime(7)); + EXPECT_TRUE(this->table_->IsPrime(11)); + EXPECT_TRUE(this->table_->IsPrime(131)); +} + +TYPED_TEST(PrimeTableTest, CanGetNextPrime) { + EXPECT_EQ(2, this->table_->GetNextPrime(0)); + EXPECT_EQ(3, this->table_->GetNextPrime(2)); + EXPECT_EQ(5, this->table_->GetNextPrime(3)); + EXPECT_EQ(7, this->table_->GetNextPrime(5)); + EXPECT_EQ(11, this->table_->GetNextPrime(7)); + EXPECT_EQ(131, this->table_->GetNextPrime(128)); +} + +// That's it! Google Test will repeat each TYPED_TEST for each type +// in the type list specified in TYPED_TEST_CASE. Sit back and be +// happy that you don't have to define them multiple times. + +#endif // GTEST_HAS_TYPED_TEST + +#if GTEST_HAS_TYPED_TEST_P + +using testing::Types; + +// Sometimes, however, you don't yet know all the types that you want +// to test when you write the tests. For example, if you are the +// author of an interface and expect other people to implement it, you +// might want to write a set of tests to make sure each implementation +// conforms to some basic requirements, but you don't know what +// implementations will be written in the future. +// +// How can you write the tests without committing to the type +// parameters? That's what "type-parameterized tests" can do for you. +// It is a bit more involved than typed tests, but in return you get a +// test pattern that can be reused in many contexts, which is a big +// win. Here's how you do it: + +// First, define a test fixture class template. Here we just reuse +// the PrimeTableTest fixture defined earlier: + +template +class PrimeTableTest2 : public PrimeTableTest { +}; + +// Then, declare the test case. The argument is the name of the test +// fixture, and also the name of the test case (as usual). The _P +// suffix is for "parameterized" or "pattern". +TYPED_TEST_CASE_P(PrimeTableTest2); + +// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test, +// similar to what you do with TEST_F. +TYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) { + EXPECT_FALSE(this->table_->IsPrime(-5)); + EXPECT_FALSE(this->table_->IsPrime(0)); + EXPECT_FALSE(this->table_->IsPrime(1)); + EXPECT_FALSE(this->table_->IsPrime(4)); + EXPECT_FALSE(this->table_->IsPrime(6)); + EXPECT_FALSE(this->table_->IsPrime(100)); +} + +TYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) { + EXPECT_TRUE(this->table_->IsPrime(2)); + EXPECT_TRUE(this->table_->IsPrime(3)); + EXPECT_TRUE(this->table_->IsPrime(5)); + EXPECT_TRUE(this->table_->IsPrime(7)); + EXPECT_TRUE(this->table_->IsPrime(11)); + EXPECT_TRUE(this->table_->IsPrime(131)); +} + +TYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) { + EXPECT_EQ(2, this->table_->GetNextPrime(0)); + EXPECT_EQ(3, this->table_->GetNextPrime(2)); + EXPECT_EQ(5, this->table_->GetNextPrime(3)); + EXPECT_EQ(7, this->table_->GetNextPrime(5)); + EXPECT_EQ(11, this->table_->GetNextPrime(7)); + EXPECT_EQ(131, this->table_->GetNextPrime(128)); +} + +// Type-parameterized tests involve one extra step: you have to +// enumerate the tests you defined: +REGISTER_TYPED_TEST_CASE_P( + PrimeTableTest2, // The first argument is the test case name. + // The rest of the arguments are the test names. + ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime); + +// At this point the test pattern is done. However, you don't have +// any real test yet as you haven't said which types you want to run +// the tests with. + +// To turn the abstract test pattern into real tests, you instantiate +// it with a list of types. Usually the test pattern will be defined +// in a .h file, and anyone can #include and instantiate it. You can +// even instantiate it more than once in the same program. To tell +// different instances apart, you give each of them a name, which will +// become part of the test case name and can be used in test filters. + +// The list of types we want to test. Note that it doesn't have to be +// defined at the time we write the TYPED_TEST_P()s. +typedef Types + PrimeTableImplementations; +INSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated, // Instance name + PrimeTableTest2, // Test case name + PrimeTableImplementations); // Type list + +#endif // GTEST_HAS_TYPED_TEST_P diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc new file mode 100644 index 000000000..f4552827e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc @@ -0,0 +1,132 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) + +// This sample shows how to test common properties of multiple +// implementations of an interface (aka interface tests) using +// value-parameterized tests. Each test in the test case has +// a parameter that is an interface pointer to an implementation +// tested. + +// The interface and its implementations are in this header. +#include "prime_tables.h" + +#include + +#if GTEST_HAS_PARAM_TEST + +using ::testing::TestWithParam; +using ::testing::Values; + +// As a general rule, tested objects should not be reused between tests. +// Also, their constructors and destructors of tested objects can have +// side effects. Thus you should create and destroy them for each test. +// In this sample we will define a simple factory function for PrimeTable +// objects. We will instantiate objects in test's SetUp() method and +// delete them in TearDown() method. +typedef PrimeTable* CreatePrimeTableFunc(); + +PrimeTable* CreateOnTheFlyPrimeTable() { + return new OnTheFlyPrimeTable(); +} + +template +PrimeTable* CreatePreCalculatedPrimeTable() { + return new PreCalculatedPrimeTable(max_precalculated); +} + +// Inside the test body, fixture constructor, SetUp(), and TearDown() +// you can refer to the test parameter by GetParam(). +// In this case, the test parameter is a PrimeTableFactory interface pointer +// which we use in fixture's SetUp() to create and store an instance of +// PrimeTable. +class PrimeTableTest : public TestWithParam { + public: + virtual ~PrimeTableTest() { delete table_; } + virtual void SetUp() { table_ = (*GetParam())(); } + virtual void TearDown() { + delete table_; + table_ = NULL; + } + + protected: + PrimeTable* table_; +}; + +TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) { + EXPECT_FALSE(table_->IsPrime(-5)); + EXPECT_FALSE(table_->IsPrime(0)); + EXPECT_FALSE(table_->IsPrime(1)); + EXPECT_FALSE(table_->IsPrime(4)); + EXPECT_FALSE(table_->IsPrime(6)); + EXPECT_FALSE(table_->IsPrime(100)); +} + +TEST_P(PrimeTableTest, ReturnsTrueForPrimes) { + EXPECT_TRUE(table_->IsPrime(2)); + EXPECT_TRUE(table_->IsPrime(3)); + EXPECT_TRUE(table_->IsPrime(5)); + EXPECT_TRUE(table_->IsPrime(7)); + EXPECT_TRUE(table_->IsPrime(11)); + EXPECT_TRUE(table_->IsPrime(131)); +} + +TEST_P(PrimeTableTest, CanGetNextPrime) { + EXPECT_EQ(2, table_->GetNextPrime(0)); + EXPECT_EQ(3, table_->GetNextPrime(2)); + EXPECT_EQ(5, table_->GetNextPrime(3)); + EXPECT_EQ(7, table_->GetNextPrime(5)); + EXPECT_EQ(11, table_->GetNextPrime(7)); + EXPECT_EQ(131, table_->GetNextPrime(128)); +} + +// In order to run value-parameterized tests, you need to instantiate them, +// or bind them to a list of values which will be used as test parameters. +// You can instantiate them in a different translation module, or even +// instantiate them several times. +// +// Here, we instantiate our tests with a list of two PrimeTable object +// factory functions: +INSTANTIATE_TEST_CASE_P( + OnTheFlyAndPreCalculated, + PrimeTableTest, + Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>)); + +#else + +// Google Test may not support value-parameterized tests with some +// compilers. If we use conditional compilation to compile out all +// code referring to the gtest_main library, MSVC linker will not link +// that library at all and consequently complain about missing entry +// point defined in that library (fatal error LNK1561: entry point +// must be defined). This dummy test keeps gtest_main linked in. +TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {} + +#endif // GTEST_HAS_PARAM_TEST diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc new file mode 100644 index 000000000..ccf61d92b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc @@ -0,0 +1,173 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) + +// This sample shows how to test code relying on some global flag variables. +// Combine() helps with generating all possible combinations of such flags, +// and each test is given one combination as a parameter. + +// Use class definitions to test from this header. +#include "prime_tables.h" + +#include + +#if GTEST_HAS_COMBINE + +// Suppose we want to introduce a new, improved implementation of PrimeTable +// which combines speed of PrecalcPrimeTable and versatility of +// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both +// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more +// appropriate under the circumstances. But in low memory conditions, it can be +// told to instantiate without PrecalcPrimeTable instance at all and use only +// OnTheFlyPrimeTable. +class HybridPrimeTable : public PrimeTable { + public: + HybridPrimeTable(bool force_on_the_fly, int max_precalculated) + : on_the_fly_impl_(new OnTheFlyPrimeTable), + precalc_impl_(force_on_the_fly ? NULL : + new PreCalculatedPrimeTable(max_precalculated)), + max_precalculated_(max_precalculated) {} + virtual ~HybridPrimeTable() { + delete on_the_fly_impl_; + delete precalc_impl_; + } + + virtual bool IsPrime(int n) const { + if (precalc_impl_ != NULL && n < max_precalculated_) + return precalc_impl_->IsPrime(n); + else + return on_the_fly_impl_->IsPrime(n); + } + + virtual int GetNextPrime(int p) const { + int next_prime = -1; + if (precalc_impl_ != NULL && p < max_precalculated_) + next_prime = precalc_impl_->GetNextPrime(p); + + return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p); + } + + private: + OnTheFlyPrimeTable* on_the_fly_impl_; + PreCalculatedPrimeTable* precalc_impl_; + int max_precalculated_; +}; + +using ::testing::TestWithParam; +using ::testing::Bool; +using ::testing::Values; +using ::testing::Combine; + +// To test all code paths for HybridPrimeTable we must test it with numbers +// both within and outside PreCalculatedPrimeTable's capacity and also with +// PreCalculatedPrimeTable disabled. We do this by defining fixture which will +// accept different combinations of parameters for instantiating a +// HybridPrimeTable instance. +class PrimeTableTest : public TestWithParam< ::std::tr1::tuple > { + protected: + virtual void SetUp() { + // This can be written as + // + // bool force_on_the_fly; + // int max_precalculated; + // tie(force_on_the_fly, max_precalculated) = GetParam(); + // + // once the Google C++ Style Guide allows use of ::std::tr1::tie. + // + bool force_on_the_fly = ::std::tr1::get<0>(GetParam()); + int max_precalculated = ::std::tr1::get<1>(GetParam()); + table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated); + } + virtual void TearDown() { + delete table_; + table_ = NULL; + } + HybridPrimeTable* table_; +}; + +TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) { + // Inside the test body, you can refer to the test parameter by GetParam(). + // In this case, the test parameter is a PrimeTable interface pointer which + // we can use directly. + // Please note that you can also save it in the fixture's SetUp() method + // or constructor and use saved copy in the tests. + + EXPECT_FALSE(table_->IsPrime(-5)); + EXPECT_FALSE(table_->IsPrime(0)); + EXPECT_FALSE(table_->IsPrime(1)); + EXPECT_FALSE(table_->IsPrime(4)); + EXPECT_FALSE(table_->IsPrime(6)); + EXPECT_FALSE(table_->IsPrime(100)); +} + +TEST_P(PrimeTableTest, ReturnsTrueForPrimes) { + EXPECT_TRUE(table_->IsPrime(2)); + EXPECT_TRUE(table_->IsPrime(3)); + EXPECT_TRUE(table_->IsPrime(5)); + EXPECT_TRUE(table_->IsPrime(7)); + EXPECT_TRUE(table_->IsPrime(11)); + EXPECT_TRUE(table_->IsPrime(131)); +} + +TEST_P(PrimeTableTest, CanGetNextPrime) { + EXPECT_EQ(2, table_->GetNextPrime(0)); + EXPECT_EQ(3, table_->GetNextPrime(2)); + EXPECT_EQ(5, table_->GetNextPrime(3)); + EXPECT_EQ(7, table_->GetNextPrime(5)); + EXPECT_EQ(11, table_->GetNextPrime(7)); + EXPECT_EQ(131, table_->GetNextPrime(128)); +} + +// In order to run value-parameterized tests, you need to instantiate them, +// or bind them to a list of values which will be used as test parameters. +// You can instantiate them in a different translation module, or even +// instantiate them several times. +// +// Here, we instantiate our tests with a list of parameters. We must combine +// all variations of the boolean flag suppressing PrecalcPrimeTable and some +// meaningful values for tests. We choose a small value (1), and a value that +// will put some of the tested numbers beyond the capability of the +// PrecalcPrimeTable instance and some inside it (10). Combine will produce all +// possible combinations. +INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters, + PrimeTableTest, + Combine(Bool(), Values(1, 10))); + +#else + +// Google Test may not support Combine() with some compilers. If we +// use conditional compilation to compile out all code referring to +// the gtest_main library, MSVC linker will not link that library at +// all and consequently complain about missing entry point defined in +// that library (fatal error LNK1561: entry point must be +// defined). This dummy test keeps gtest_main linked in. +TEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {} + +#endif // GTEST_HAS_COMBINE diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc new file mode 100644 index 000000000..d828ef4d8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc @@ -0,0 +1,160 @@ +// Copyright 2009 Google Inc. All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) + +// This sample shows how to use Google Test listener API to implement +// an alternative console output and how to use the UnitTest reflection API +// to enumerate test cases and tests and to inspect their results. + +#include + +#include + +using ::testing::EmptyTestEventListener; +using ::testing::InitGoogleTest; +using ::testing::Test; +using ::testing::TestCase; +using ::testing::TestEventListeners; +using ::testing::TestInfo; +using ::testing::TestPartResult; +using ::testing::UnitTest; + +namespace { + +// Provides alternative output mode which produces minimal amount of +// information about tests. +class TersePrinter : public EmptyTestEventListener { + private: + // Called before any test activity starts. + virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {} + + // Called after all test activities have ended. + virtual void OnTestProgramEnd(const UnitTest& unit_test) { + fprintf(stdout, "TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED"); + fflush(stdout); + } + + // Called before a test starts. + virtual void OnTestStart(const TestInfo& test_info) { + fprintf(stdout, + "*** Test %s.%s starting.\n", + test_info.test_case_name(), + test_info.name()); + fflush(stdout); + } + + // Called after a failed assertion or a SUCCESS(). + virtual void OnTestPartResult(const TestPartResult& test_part_result) { + fprintf(stdout, + "%s in %s:%d\n%s\n", + test_part_result.failed() ? "*** Failure" : "Success", + test_part_result.file_name(), + test_part_result.line_number(), + test_part_result.summary()); + fflush(stdout); + } + + // Called after a test ends. + virtual void OnTestEnd(const TestInfo& test_info) { + fprintf(stdout, + "*** Test %s.%s ending.\n", + test_info.test_case_name(), + test_info.name()); + fflush(stdout); + } +}; // class TersePrinter + +TEST(CustomOutputTest, PrintsMessage) { + printf("Printing something from the test body...\n"); +} + +TEST(CustomOutputTest, Succeeds) { + SUCCEED() << "SUCCEED() has been invoked from here"; +} + +TEST(CustomOutputTest, Fails) { + EXPECT_EQ(1, 2) + << "This test fails in order to demonstrate alternative failure messages"; +} + +} // namespace + +int main(int argc, char **argv) { + InitGoogleTest(&argc, argv); + + bool terse_output = false; + if (argc > 1 && strcmp(argv[1], "--terse_output") == 0 ) + terse_output = true; + else + printf("%s\n", "Run this program with --terse_output to change the way " + "it prints its output."); + + UnitTest& unit_test = *UnitTest::GetInstance(); + + // If we are given the --terse_output command line flag, suppresses the + // standard output and attaches own result printer. + if (terse_output) { + TestEventListeners& listeners = unit_test.listeners(); + + // Removes the default console output listener from the list so it will + // not receive events from Google Test and won't print any output. Since + // this operation transfers ownership of the listener to the caller we + // have to delete it as well. + delete listeners.Release(listeners.default_result_printer()); + + // Adds the custom output listener to the list. It will now receive + // events from Google Test and print the alternative output. We don't + // have to worry about deleting it since Google Test assumes ownership + // over it after adding it to the list. + listeners.Append(new TersePrinter); + } + int ret_val = RUN_ALL_TESTS(); + + // This is an example of using the UnitTest reflection API to inspect test + // results. Here we discount failures from the tests we expected to fail. + int unexpectedly_failed_tests = 0; + for (int i = 0; i < unit_test.total_test_case_count(); ++i) { + const TestCase& test_case = *unit_test.GetTestCase(i); + for (int j = 0; j < test_case.total_test_count(); ++j) { + const TestInfo& test_info = *test_case.GetTestInfo(j); + // Counts failed tests that were not meant to fail (those without + // 'Fails' in the name). + if (test_info.result()->Failed() && + strcmp(test_info.name(), "Fails") != 0) { + unexpectedly_failed_tests++; + } + } + } + + // Test that were meant to fail should not affect the test program outcome. + if (unexpectedly_failed_tests == 0) + ret_val = 0; + + return ret_val; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py new file mode 100755 index 000000000..148444ca7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py @@ -0,0 +1,250 @@ +#!/usr/bin/env python +# +# Copyright 2009, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""fuse_gtest_files.py v0.2.0 +Fuses Google Test source code into a .h file and a .cc file. + +SYNOPSIS + fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR + + Scans GTEST_ROOT_DIR for Google Test source code, and generates + two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc. + Then you can build your tests by adding OUTPUT_DIR to the include + search path and linking with OUTPUT_DIR/gtest/gtest-all.cc. These + two files contain everything you need to use Google Test. Hence + you can "install" Google Test by copying them to wherever you want. + + GTEST_ROOT_DIR can be omitted and defaults to the parent + directory of the directory holding this script. + +EXAMPLES + ./fuse_gtest_files.py fused_gtest + ./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest + +This tool is experimental. In particular, it assumes that there is no +conditional inclusion of Google Test headers. Please report any +problems to googletestframework@googlegroups.com. You can read +http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for +more information. +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import re +import sets +import sys + +# We assume that this file is in the scripts/ directory in the Google +# Test root directory. +DEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..') + +# Regex for matching '#include '. +INCLUDE_GTEST_FILE_REGEX = re.compile(r'^\s*#\s*include\s*<(gtest/.+)>') + +# Regex for matching '#include "src/..."'. +INCLUDE_SRC_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(src/.+)"') + +# Where to find the source seed files. +GTEST_H_SEED = 'include/gtest/gtest.h' +GTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h' +GTEST_ALL_CC_SEED = 'src/gtest-all.cc' + +# Where to put the generated files. +GTEST_H_OUTPUT = 'gtest/gtest.h' +GTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc' + + +def VerifyFileExists(directory, relative_path): + """Verifies that the given file exists; aborts on failure. + + relative_path is the file path relative to the given directory. + """ + + if not os.path.isfile(os.path.join(directory, relative_path)): + print 'ERROR: Cannot find %s in directory %s.' % (relative_path, + directory) + print ('Please either specify a valid project root directory ' + 'or omit it on the command line.') + sys.exit(1) + + +def ValidateGTestRootDir(gtest_root): + """Makes sure gtest_root points to a valid gtest root directory. + + The function aborts the program on failure. + """ + + VerifyFileExists(gtest_root, GTEST_H_SEED) + VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED) + + +def VerifyOutputFile(output_dir, relative_path): + """Verifies that the given output file path is valid. + + relative_path is relative to the output_dir directory. + """ + + # Makes sure the output file either doesn't exist or can be overwritten. + output_file = os.path.join(output_dir, relative_path) + if os.path.exists(output_file): + # TODO(wan@google.com): The following user-interaction doesn't + # work with automated processes. We should provide a way for the + # Makefile to force overwriting the files. + print ('%s already exists in directory %s - overwrite it? (y/N) ' % + (relative_path, output_dir)) + answer = sys.stdin.readline().strip() + if answer not in ['y', 'Y']: + print 'ABORTED.' + sys.exit(1) + + # Makes sure the directory holding the output file exists; creates + # it and all its ancestors if necessary. + parent_directory = os.path.dirname(output_file) + if not os.path.isdir(parent_directory): + os.makedirs(parent_directory) + + +def ValidateOutputDir(output_dir): + """Makes sure output_dir points to a valid output directory. + + The function aborts the program on failure. + """ + + VerifyOutputFile(output_dir, GTEST_H_OUTPUT) + VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT) + + +def FuseGTestH(gtest_root, output_dir): + """Scans folder gtest_root to generate gtest/gtest.h in output_dir.""" + + output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w') + processed_files = sets.Set() # Holds all gtest headers we've processed. + + def ProcessFile(gtest_header_path): + """Processes the given gtest header file.""" + + # We don't process the same header twice. + if gtest_header_path in processed_files: + return + + processed_files.add(gtest_header_path) + + # Reads each line in the given gtest header. + for line in file(os.path.join(gtest_root, gtest_header_path), 'r'): + m = INCLUDE_GTEST_FILE_REGEX.match(line) + if m: + # It's '#include ' - let's process it recursively. + ProcessFile('include/' + m.group(1)) + else: + # Otherwise we copy the line unchanged to the output file. + output_file.write(line) + + ProcessFile(GTEST_H_SEED) + output_file.close() + + +def FuseGTestAllCcToFile(gtest_root, output_file): + """Scans folder gtest_root to generate gtest/gtest-all.cc in output_file.""" + + processed_files = sets.Set() + + def ProcessFile(gtest_source_file): + """Processes the given gtest source file.""" + + # We don't process the same #included file twice. + if gtest_source_file in processed_files: + return + + processed_files.add(gtest_source_file) + + # Reads each line in the given gtest source file. + for line in file(os.path.join(gtest_root, gtest_source_file), 'r'): + m = INCLUDE_GTEST_FILE_REGEX.match(line) + if m: + if 'include/' + m.group(1) == GTEST_SPI_H_SEED: + # It's '#include '. This file is not + # #included by , so we need to process it. + ProcessFile(GTEST_SPI_H_SEED) + else: + # It's '#include ' where foo is not gtest-spi. + # We treat it as '#include ', as all other + # gtest headers are being fused into gtest.h and cannot be + # #included directly. + + # There is no need to #include more than once. + if not GTEST_H_SEED in processed_files: + processed_files.add(GTEST_H_SEED) + output_file.write('#include <%s>\n' % (GTEST_H_OUTPUT,)) + else: + m = INCLUDE_SRC_FILE_REGEX.match(line) + if m: + # It's '#include "src/foo"' - let's process it recursively. + ProcessFile(m.group(1)) + else: + output_file.write(line) + + ProcessFile(GTEST_ALL_CC_SEED) + + +def FuseGTestAllCc(gtest_root, output_dir): + """Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir.""" + + output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w') + FuseGTestAllCcToFile(gtest_root, output_file) + output_file.close() + + +def FuseGTest(gtest_root, output_dir): + """Fuses gtest.h and gtest-all.cc.""" + + ValidateGTestRootDir(gtest_root) + ValidateOutputDir(output_dir) + + FuseGTestH(gtest_root, output_dir) + FuseGTestAllCc(gtest_root, output_dir) + + +def main(): + argc = len(sys.argv) + if argc == 2: + # fuse_gtest_files.py OUTPUT_DIR + FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1]) + elif argc == 3: + # fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR + FuseGTest(sys.argv[1], sys.argv[2]) + else: + print __doc__ + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py new file mode 100755 index 000000000..8307134ad --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py @@ -0,0 +1,733 @@ +#!/usr/bin/env python +# +# Copyright 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""gen_gtest_pred_impl.py v0.1 + +Generates the implementation of Google Test predicate assertions and +accompanying tests. + +Usage: + + gen_gtest_pred_impl.py MAX_ARITY + +where MAX_ARITY is a positive integer. + +The command generates the implementation of up-to MAX_ARITY-ary +predicate assertions, and writes it to file gtest_pred_impl.h in the +directory where the script is. It also generates the accompanying +unit test in file gtest_pred_impl_unittest.cc. +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import sys +import time + +# Where this script is. +SCRIPT_DIR = os.path.dirname(sys.argv[0]) + +# Where to store the generated header. +HEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h') + +# Where to store the generated unit test. +UNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc') + + +def HeaderPreamble(n): + """Returns the preamble for the header file. + + Args: + n: the maximum arity of the predicate macros to be generated. + """ + + # A map that defines the values used in the preamble template. + DEFS = { + 'today' : time.strftime('%m/%d/%Y'), + 'year' : time.strftime('%Y'), + 'command' : '%s %s' % (os.path.basename(sys.argv[0]), n), + 'n' : n + } + + return ( +"""// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is AUTOMATICALLY GENERATED on %(today)s by command +// '%(command)s'. DO NOT EDIT BY HAND! +// +// Implements a family of generic predicate assertion macros. + +#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ + +// Makes sure this header is not included before gtest.h. +#ifndef GTEST_INCLUDE_GTEST_GTEST_H_ +#error Do not include gtest_pred_impl.h directly. Include gtest.h instead. +#endif // GTEST_INCLUDE_GTEST_GTEST_H_ + +// This header implements a family of generic predicate assertion +// macros: +// +// ASSERT_PRED_FORMAT1(pred_format, v1) +// ASSERT_PRED_FORMAT2(pred_format, v1, v2) +// ... +// +// where pred_format is a function or functor that takes n (in the +// case of ASSERT_PRED_FORMATn) values and their source expression +// text, and returns a testing::AssertionResult. See the definition +// of ASSERT_EQ in gtest.h for an example. +// +// If you don't care about formatting, you can use the more +// restrictive version: +// +// ASSERT_PRED1(pred, v1) +// ASSERT_PRED2(pred, v1, v2) +// ... +// +// where pred is an n-ary function or functor that returns bool, +// and the values v1, v2, ..., must support the << operator for +// streaming to std::ostream. +// +// We also define the EXPECT_* variations. +// +// For now we only support predicates whose arity is at most %(n)s. +// Please email googletestframework@googlegroups.com if you need +// support for higher arities. + +// GTEST_ASSERT_ is the basic statement to which all of the assertions +// in this file reduce. Don't use this in your code. + +#define GTEST_ASSERT_(expression, on_failure) \\ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\ + if (const ::testing::AssertionResult gtest_ar = (expression)) \\ + ; \\ + else \\ + on_failure(gtest_ar.failure_message()) +""" % DEFS) + + +def Arity(n): + """Returns the English name of the given arity.""" + + if n < 0: + return None + elif n <= 3: + return ['nullary', 'unary', 'binary', 'ternary'][n] + else: + return '%s-ary' % n + + +def Title(word): + """Returns the given word in title case. The difference between + this and string's title() method is that Title('4-ary') is '4-ary' + while '4-ary'.title() is '4-Ary'.""" + + return word[0].upper() + word[1:] + + +def OneTo(n): + """Returns the list [1, 2, 3, ..., n].""" + + return range(1, n + 1) + + +def Iter(n, format, sep=''): + """Given a positive integer n, a format string that contains 0 or + more '%s' format specs, and optionally a separator string, returns + the join of n strings, each formatted with the format string on an + iterator ranged from 1 to n. + + Example: + + Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'. + """ + + # How many '%s' specs are in format? + spec_count = len(format.split('%s')) - 1 + return sep.join([format % (spec_count * (i,)) for i in OneTo(n)]) + + +def ImplementationForArity(n): + """Returns the implementation of n-ary predicate assertions.""" + + # A map the defines the values used in the implementation template. + DEFS = { + 'n' : str(n), + 'vs' : Iter(n, 'v%s', sep=', '), + 'vts' : Iter(n, '#v%s', sep=', '), + 'arity' : Arity(n), + 'Arity' : Title(Arity(n)) + } + + impl = """ + +// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s. Don't use +// this in your code. +template +AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS + + impl += Iter(n, """, + const char* e%s""") + + impl += """, + Pred pred""" + + impl += Iter(n, """, + const T%s& v%s""") + + impl += """) { + if (pred(%(vs)s)) return AssertionSuccess(); + + Message msg; +""" % DEFS + + impl += ' msg << pred_text << "("' + + impl += Iter(n, """ + << e%s""", sep=' << ", "') + + impl += ' << ") evaluates to false, where"' + + impl += Iter(n, """ + << "\\n" << e%s << " evaluates to " << v%s""") + + impl += """; + return AssertionFailure(msg); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s. +// Don't use this in your code. +#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\ + GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s),\\ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s. Don't use +// this in your code. +#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\ + GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred""" % DEFS + + impl += Iter(n, """, \\ + #v%s""") + + impl += """, \\ + pred""" + + impl += Iter(n, """, \\ + v%s""") + + impl += """), on_failure) + +// %(Arity)s predicate assertion macros. +#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\ + GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED%(n)s(pred, %(vs)s) \\ + GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\ + GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED%(n)s(pred, %(vs)s) \\ + GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_) + +""" % DEFS + + return impl + + +def HeaderPostamble(): + """Returns the postamble for the header file.""" + + return """ + +#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ +""" + + +def GenerateFile(path, content): + """Given a file path and a content string, overwrites it with the + given content.""" + + print 'Updating file %s . . .' % path + + f = file(path, 'w+') + print >>f, content, + f.close() + + print 'File %s has been updated.' % path + + +def GenerateHeader(n): + """Given the maximum arity n, updates the header file that implements + the predicate assertions.""" + + GenerateFile(HEADER, + HeaderPreamble(n) + + ''.join([ImplementationForArity(i) for i in OneTo(n)]) + + HeaderPostamble()) + + +def UnitTestPreamble(): + """Returns the preamble for the unit test file.""" + + # A map that defines the values used in the preamble template. + DEFS = { + 'today' : time.strftime('%m/%d/%Y'), + 'year' : time.strftime('%Y'), + 'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]), + } + + return ( +"""// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is AUTOMATICALLY GENERATED on %(today)s by command +// '%(command)s'. DO NOT EDIT BY HAND! + +// Regression test for gtest_pred_impl.h +// +// This file is generated by a script and quite long. If you intend to +// learn how Google Test works by reading its unit tests, read +// gtest_unittest.cc instead. +// +// This is intended as a regression test for the Google Test predicate +// assertions. We compile it as part of the gtest_unittest target +// only to keep the implementation tidy and compact, as it is quite +// involved to set up the stage for testing Google Test using Google +// Test itself. +// +// Currently, gtest_unittest takes ~11 seconds to run in the testing +// daemon. In the future, if it grows too large and needs much more +// time to finish, we should consider separating this file into a +// stand-alone regression test. + +#include + +#include +#include + +// A user-defined data type. +struct Bool { + explicit Bool(int val) : value(val != 0) {} + + bool operator>(int n) const { return value > Bool(n).value; } + + Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); } + + bool operator==(const Bool& rhs) const { return value == rhs.value; } + + bool value; +}; + +// Enables Bool to be used in assertions. +std::ostream& operator<<(std::ostream& os, const Bool& x) { + return os << (x.value ? "true" : "false"); +} + +""" % DEFS) + + +def TestsForArity(n): + """Returns the tests for n-ary predicate assertions.""" + + # A map that defines the values used in the template for the tests. + DEFS = { + 'n' : n, + 'es' : Iter(n, 'e%s', sep=', '), + 'vs' : Iter(n, 'v%s', sep=', '), + 'vts' : Iter(n, '#v%s', sep=', '), + 'tvs' : Iter(n, 'T%s v%s', sep=', '), + 'int_vs' : Iter(n, 'int v%s', sep=', '), + 'Bool_vs' : Iter(n, 'Bool v%s', sep=', '), + 'types' : Iter(n, 'typename T%s', sep=', '), + 'v_sum' : Iter(n, 'v%s', sep=' + '), + 'arity' : Arity(n), + 'Arity' : Title(Arity(n)), + } + + tests = ( +"""// Sample functions/functors for testing %(arity)s predicate assertions. + +// A %(arity)s predicate function. +template <%(types)s> +bool PredFunction%(n)s(%(tvs)s) { + return %(v_sum)s > 0; +} + +// The following two functions are needed to circumvent a bug in +// gcc 2.95.3, which sometimes has problem with the above template +// function. +bool PredFunction%(n)sInt(%(int_vs)s) { + return %(v_sum)s > 0; +} +bool PredFunction%(n)sBool(%(Bool_vs)s) { + return %(v_sum)s > 0; +} +""" % DEFS) + + tests += """ +// A %(arity)s predicate functor. +struct PredFunctor%(n)s { + template <%(types)s> + bool operator()(""" % DEFS + + tests += Iter(n, 'const T%s& v%s', sep=""", + """) + + tests += """) { + return %(v_sum)s > 0; + } +}; +""" % DEFS + + tests += """ +// A %(arity)s predicate-formatter function. +template <%(types)s> +testing::AssertionResult PredFormatFunction%(n)s(""" % DEFS + + tests += Iter(n, 'const char* e%s', sep=""", + """) + + tests += Iter(n, """, + const T%s& v%s""") + + tests += """) { + if (PredFunction%(n)s(%(vs)s)) + return testing::AssertionSuccess(); + + testing::Message msg; + msg << """ % DEFS + + tests += Iter(n, 'e%s', sep=' << " + " << ') + + tests += """ + << " is expected to be positive, but evaluates to " + << %(v_sum)s << "."; + return testing::AssertionFailure(msg); +} +""" % DEFS + + tests += """ +// A %(arity)s predicate-formatter functor. +struct PredFormatFunctor%(n)s { + template <%(types)s> + testing::AssertionResult operator()(""" % DEFS + + tests += Iter(n, 'const char* e%s', sep=""", + """) + + tests += Iter(n, """, + const T%s& v%s""") + + tests += """) const { + return PredFormatFunction%(n)s(%(es)s, %(vs)s); + } +}; +""" % DEFS + + tests += """ +// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s. + +class Predicate%(n)sTest : public testing::Test { + protected: + virtual void SetUp() { + expected_to_finish_ = true; + finished_ = false;""" % DEFS + + tests += """ + """ + Iter(n, 'n%s_ = ') + """0; + } +""" + + tests += """ + virtual void TearDown() { + // Verifies that each of the predicate's arguments was evaluated + // exactly once.""" + + tests += ''.join([""" + EXPECT_EQ(1, n%s_) << + "The predicate assertion didn't evaluate argument %s " + "exactly once.";""" % (i, i + 1) for i in OneTo(n)]) + + tests += """ + + // Verifies that the control flow in the test function is expected. + if (expected_to_finish_ && !finished_) { + FAIL() << "The predicate assertion unexpactedly aborted the test."; + } else if (!expected_to_finish_ && finished_) { + FAIL() << "The failed predicate assertion didn't abort the test " + "as expected."; + } + } + + // true iff the test function is expected to run to finish. + static bool expected_to_finish_; + + // true iff the test function did run to finish. + static bool finished_; +""" % DEFS + + tests += Iter(n, """ + static int n%s_;""") + + tests += """ +}; + +bool Predicate%(n)sTest::expected_to_finish_; +bool Predicate%(n)sTest::finished_; +""" % DEFS + + tests += Iter(n, """int Predicate%%(n)sTest::n%s_; +""") % DEFS + + tests += """ +typedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest; +typedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest; +typedef Predicate%(n)sTest EXPECT_PRED%(n)sTest; +typedef Predicate%(n)sTest ASSERT_PRED%(n)sTest; +""" % DEFS + + def GenTest(use_format, use_assert, expect_failure, + use_functor, use_user_type): + """Returns the test for a predicate assertion macro. + + Args: + use_format: true iff the assertion is a *_PRED_FORMAT*. + use_assert: true iff the assertion is a ASSERT_*. + expect_failure: true iff the assertion is expected to fail. + use_functor: true iff the first argument of the assertion is + a functor (as opposed to a function) + use_user_type: true iff the predicate functor/function takes + argument(s) of a user-defined type. + + Example: + + GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior + of a successful EXPECT_PRED_FORMATn() that takes a functor + whose arguments have built-in types.""" + + if use_assert: + assrt = 'ASSERT' # 'assert' is reserved, so we cannot use + # that identifier here. + else: + assrt = 'EXPECT' + + assertion = assrt + '_PRED' + + if use_format: + pred_format = 'PredFormat' + assertion += '_FORMAT' + else: + pred_format = 'Pred' + + assertion += '%(n)s' % DEFS + + if use_functor: + pred_format_type = 'functor' + pred_format += 'Functor%(n)s()' + else: + pred_format_type = 'function' + pred_format += 'Function%(n)s' + if not use_format: + if use_user_type: + pred_format += 'Bool' + else: + pred_format += 'Int' + + test_name = pred_format_type.title() + + if use_user_type: + arg_type = 'user-defined type (Bool)' + test_name += 'OnUserType' + if expect_failure: + arg = 'Bool(n%s_++)' + else: + arg = 'Bool(++n%s_)' + else: + arg_type = 'built-in type (int)' + test_name += 'OnBuiltInType' + if expect_failure: + arg = 'n%s_++' + else: + arg = '++n%s_' + + if expect_failure: + successful_or_failed = 'failed' + expected_or_not = 'expected.' + test_name += 'Failure' + else: + successful_or_failed = 'successful' + expected_or_not = 'UNEXPECTED!' + test_name += 'Success' + + # A map that defines the values used in the test template. + defs = DEFS.copy() + defs.update({ + 'assert' : assrt, + 'assertion' : assertion, + 'test_name' : test_name, + 'pf_type' : pred_format_type, + 'pf' : pred_format, + 'arg_type' : arg_type, + 'arg' : arg, + 'successful' : successful_or_failed, + 'expected' : expected_or_not, + }) + + test = """ +// Tests a %(successful)s %(assertion)s where the +// predicate-formatter is a %(pf_type)s on a %(arg_type)s. +TEST_F(%(assertion)sTest, %(test_name)s) {""" % defs + + indent = (len(assertion) + 3)*' ' + extra_indent = '' + + if expect_failure: + extra_indent = ' ' + if use_assert: + test += """ + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT""" + else: + test += """ + EXPECT_NONFATAL_FAILURE({ // NOLINT""" + + test += '\n' + extra_indent + """ %(assertion)s(%(pf)s""" % defs + + test = test % defs + test += Iter(n, ',\n' + indent + extra_indent + '%(arg)s' % defs) + test += ');\n' + extra_indent + ' finished_ = true;\n' + + if expect_failure: + test += ' }, "");\n' + + test += '}\n' + return test + + # Generates tests for all 2**6 = 64 combinations. + tests += ''.join([GenTest(use_format, use_assert, expect_failure, + use_functor, use_user_type) + for use_format in [0, 1] + for use_assert in [0, 1] + for expect_failure in [0, 1] + for use_functor in [0, 1] + for use_user_type in [0, 1] + ]) + + return tests + + +def UnitTestPostamble(): + """Returns the postamble for the tests.""" + + return '' + + +def GenerateUnitTest(n): + """Returns the tests for up-to n-ary predicate assertions.""" + + GenerateFile(UNIT_TEST, + UnitTestPreamble() + + ''.join([TestsForArity(i) for i in OneTo(n)]) + + UnitTestPostamble()) + + +def _Main(): + """The entry point of the script. Generates the header file and its + unit test.""" + + if len(sys.argv) != 2: + print __doc__ + print 'Author: ' + __author__ + sys.exit(1) + + n = int(sys.argv[1]) + GenerateHeader(n) + GenerateUnitTest(n) + + +if __name__ == '__main__': + _Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in new file mode 100755 index 000000000..9c7263854 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in @@ -0,0 +1,274 @@ +#!/bin/sh + +# These variables are automatically filled in by the configure script. +name="@PACKAGE_TARNAME@" +version="@PACKAGE_VERSION@" + +show_usage() +{ + echo "Usage: gtest-config [OPTIONS...]" +} + +show_help() +{ + show_usage + cat <<\EOF + +The `gtest-config' script provides access to the necessary compile and linking +flags to connect with Google C++ Testing Framework, both in a build prior to +installation, and on the system proper after installation. The installation +overrides may be issued in combination with any other queries, but will only +affect installation queries if called on a built but not installed gtest. The +installation queries may not be issued with any other types of queries, and +only one installation query may be made at a time. The version queries and +compiler flag queries may be combined as desired but not mixed. Different +version queries are always combined with logical "and" semantics, and only the +last of any particular query is used while all previous ones ignored. All +versions must be specified as a sequence of numbers separated by periods. +Compiler flag queries output the union of the sets of flags when combined. + + Examples: + gtest-config --min-version=1.0 || echo "Insufficient Google Test version." + + g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp + g++ $(gtest-config --ldflags --libs) -o foo foo.o + + # When using a built but not installed Google Test: + g++ $(../../my_gtest_build/scripts/gtest-config ...) ... + + # When using an installed Google Test, but with installation overrides: + export GTEST_PREFIX="/opt" + g++ $(gtest-config --libdir="/opt/lib64" ...) ... + + Help: + --usage brief usage information + --help display this help message + + Installation Overrides: + --prefix= overrides the installation prefix + --exec-prefix= overrides the executable installation prefix + --libdir= overrides the library installation prefix + --includedir= overrides the header file installation prefix + + Installation Queries: + --prefix installation prefix + --exec-prefix executable installation prefix + --libdir library installation directory + --includedir header file installation directory + --version the version of the Google Test installation + + Version Queries: + --min-version=VERSION return 0 if the version is at least VERSION + --exact-version=VERSION return 0 if the version is exactly VERSION + --max-version=VERSION return 0 if the version is at most VERSION + + Compilation Flag Queries: + --cppflags compile flags specific to the C-like preprocessors + --cxxflags compile flags appropriate for C++ programs + --ldflags linker flags + --libs libraries for linking + +EOF +} + +# This function bounds our version with a min and a max. It uses some clever +# POSIX-compliant variable expansion to portably do all the work in the shell +# and avoid any dependency on a particular "sed" or "awk" implementation. +# Notable is that it will only ever compare the first 3 components of versions. +# Further components will be cleanly stripped off. All versions must be +# unadorned, so "v1.0" will *not* work. The minimum version must be in $1, and +# the max in $2. TODO(chandlerc@google.com): If this ever breaks, we should +# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than +# continuing to maintain our own shell version. +check_versions() +{ + major_version=${version%%.*} + minor_version="0" + point_version="0" + if test "${version#*.}" != "${version}"; then + minor_version=${version#*.} + minor_version=${minor_version%%.*} + fi + if test "${version#*.*.}" != "${version}"; then + point_version=${version#*.*.} + point_version=${point_version%%.*} + fi + + min_version="$1" + min_major_version=${min_version%%.*} + min_minor_version="0" + min_point_version="0" + if test "${min_version#*.}" != "${min_version}"; then + min_minor_version=${min_version#*.} + min_minor_version=${min_minor_version%%.*} + fi + if test "${min_version#*.*.}" != "${min_version}"; then + min_point_version=${min_version#*.*.} + min_point_version=${min_point_version%%.*} + fi + + max_version="$2" + max_major_version=${max_version%%.*} + max_minor_version="0" + max_point_version="0" + if test "${max_version#*.}" != "${max_version}"; then + max_minor_version=${max_version#*.} + max_minor_version=${max_minor_version%%.*} + fi + if test "${max_version#*.*.}" != "${max_version}"; then + max_point_version=${max_version#*.*.} + max_point_version=${max_point_version%%.*} + fi + + test $(($major_version)) -lt $(($min_major_version)) && exit 1 + if test $(($major_version)) -eq $(($min_major_version)); then + test $(($minor_version)) -lt $(($min_minor_version)) && exit 1 + if test $(($minor_version)) -eq $(($min_minor_version)); then + test $(($point_version)) -lt $(($min_point_version)) && exit 1 + fi + fi + + test $(($major_version)) -gt $(($max_major_version)) && exit 1 + if test $(($major_version)) -eq $(($max_major_version)); then + test $(($minor_version)) -gt $(($max_minor_version)) && exit 1 + if test $(($minor_version)) -eq $(($max_minor_version)); then + test $(($point_version)) -gt $(($max_point_version)) && exit 1 + fi + fi + + exit 0 +} + +# Show the usage line when no arguments are specified. +if test $# -eq 0; then + show_usage + exit 1 +fi + +while test $# -gt 0; do + case $1 in + --usage) show_usage; exit 0;; + --help) show_help; exit 0;; + + # Installation overrides + --prefix=*) GTEST_PREFIX=${1#--prefix=};; + --exec-prefix=*) GTEST_EXEC_PREFIX=${1#--exec-prefix=};; + --libdir=*) GTEST_LIBDIR=${1#--libdir=};; + --includedir=*) GTEST_INCLUDEDIR=${1#--includedir=};; + + # Installation queries + --prefix|--exec-prefix|--libdir|--includedir|--version) + if test -n "${do_query}"; then + show_usage + exit 1 + fi + do_query=${1#--} + ;; + + # Version checking + --min-version=*) + do_check_versions=yes + min_version=${1#--min-version=} + ;; + --max-version=*) + do_check_versions=yes + max_version=${1#--max-version=} + ;; + --exact-version=*) + do_check_versions=yes + exact_version=${1#--exact-version=} + ;; + + # Compiler flag output + --cppflags) echo_cppflags=yes;; + --cxxflags) echo_cxxflags=yes;; + --ldflags) echo_ldflags=yes;; + --libs) echo_libs=yes;; + + # Everything else is an error + *) show_usage; exit 1;; + esac + shift +done + +# These have defaults filled in by the configure script but can also be +# overridden by environment variables or command line parameters. +prefix="${GTEST_PREFIX:-@prefix@}" +exec_prefix="${GTEST_EXEC_PREFIX:-@exec_prefix@}" +libdir="${GTEST_LIBDIR:-@libdir@}" +includedir="${GTEST_INCLUDEDIR:-@includedir@}" + +# We try and detect if our binary is not located at its installed location. If +# it's not, we provide variables pointing to the source and build tree rather +# than to the install tree. This allows building against a just-built gtest +# rather than an installed gtest. +bindir="@bindir@" +this_relative_bindir=`dirname $0` +this_bindir=`cd ${this_relative_bindir}; pwd -P` +if test "${this_bindir}" = "${this_bindir%${bindir}}"; then + # The path to the script doesn't end in the bindir sequence from Autoconf, + # assume that we are in a build tree. + build_dir=`dirname ${this_bindir}` + src_dir=`cd ${this_bindir}/@top_srcdir@; pwd -P` + + # TODO(chandlerc@google.com): This is a dangerous dependency on libtool, we + # should work to remove it, and/or remove libtool altogether, replacing it + # with direct references to the library and a link path. + gtest_libs="${build_dir}/lib/libgtest.la @PTHREAD_CFLAGS@ @PTHREAD_LIBS@" + gtest_ldflags="" + + # We provide hooks to include from either the source or build dir, where the + # build dir is always preferred. This will potentially allow us to write + # build rules for generated headers and have them automatically be preferred + # over provided versions. + gtest_cppflags="-I${build_dir}/include -I${src_dir}/include" + gtest_cxxflags="@PTHREAD_CFLAGS@" +else + # We're using an installed gtest, although it may be staged under some + # prefix. Assume (as our own libraries do) that we can resolve the prefix, + # and are present in the dynamic link paths. + gtest_ldflags="-L${libdir}" + gtest_libs="-l${name} @PTHREAD_CFLAGS@ @PTHREAD_LIBS@" + gtest_cppflags="-I${includedir}" + gtest_cxxflags="@PTHREAD_CFLAGS@" +fi + +# Do an installation query if requested. +if test -n "$do_query"; then + case $do_query in + prefix) echo $prefix; exit 0;; + exec-prefix) echo $exec_prefix; exit 0;; + libdir) echo $libdir; exit 0;; + includedir) echo $includedir; exit 0;; + version) echo $version; exit 0;; + *) show_usage; exit 1;; + esac +fi + +# Do a version check if requested. +if test "$do_check_versions" = "yes"; then + # Make sure we didn't receive a bad combination of parameters. + test "$echo_cppflags" = "yes" && show_usage && exit 1 + test "$echo_cxxflags" = "yes" && show_usage && exit 1 + test "$echo_ldflags" = "yes" && show_usage && exit 1 + test "$echo_libs" = "yes" && show_usage && exit 1 + + if test "$exact_version" != ""; then + check_versions $exact_version $exact_version + # unreachable + else + check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999} + # unreachable + fi +fi + +# Do the output in the correct order so that these can be used in-line of +# a compiler invocation. +output="" +test "$echo_cppflags" = "yes" && output="$output $gtest_cppflags" +test "$echo_cxxflags" = "yes" && output="$output $gtest_cxxflags" +test "$echo_ldflags" = "yes" && output="$output $gtest_ldflags" +test "$echo_libs" = "yes" && output="$output $gtest_libs" +echo $output + +exit 0 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py new file mode 100755 index 000000000..f15c1b6ce --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py @@ -0,0 +1,835 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""pump v0.1 - Pretty Useful for Meta Programming. + +A tool for preprocessor meta programming. Useful for generating +repetitive boilerplate code. Especially useful for writing C++ +classes, functions, macros, and templates that need to work with +various number of arguments. + +USAGE: + pump.py SOURCE_FILE + +EXAMPLES: + pump.py foo.cc.pump + Converts foo.cc.pump to foo.cc. + +GRAMMAR: + CODE ::= ATOMIC_CODE* + ATOMIC_CODE ::= $var ID = EXPRESSION + | $var ID = [[ CODE ]] + | $range ID EXPRESSION..EXPRESSION + | $for ID SEPARATOR [[ CODE ]] + | $($) + | $ID + | $(EXPRESSION) + | $if EXPRESSION [[ CODE ]] ELSE_BRANCH + | [[ CODE ]] + | RAW_CODE + SEPARATOR ::= RAW_CODE | EMPTY + ELSE_BRANCH ::= $else [[ CODE ]] + | $elif EXPRESSION [[ CODE ]] ELSE_BRANCH + | EMPTY + EXPRESSION has Python syntax. +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import re +import sys + + +TOKEN_TABLE = [ + (re.compile(r'\$var\s+'), '$var'), + (re.compile(r'\$elif\s+'), '$elif'), + (re.compile(r'\$else\s+'), '$else'), + (re.compile(r'\$for\s+'), '$for'), + (re.compile(r'\$if\s+'), '$if'), + (re.compile(r'\$range\s+'), '$range'), + (re.compile(r'\$[_A-Za-z]\w*'), '$id'), + (re.compile(r'\$\(\$\)'), '$($)'), + (re.compile(r'\$\$.*'), '$$'), + (re.compile(r'\$'), '$'), + (re.compile(r'\[\[\n?'), '[['), + (re.compile(r'\]\]\n?'), ']]'), + ] + + +class Cursor: + """Represents a position (line and column) in a text file.""" + + def __init__(self, line=-1, column=-1): + self.line = line + self.column = column + + def __eq__(self, rhs): + return self.line == rhs.line and self.column == rhs.column + + def __ne__(self, rhs): + return not self == rhs + + def __lt__(self, rhs): + return self.line < rhs.line or ( + self.line == rhs.line and self.column < rhs.column) + + def __le__(self, rhs): + return self < rhs or self == rhs + + def __gt__(self, rhs): + return rhs < self + + def __ge__(self, rhs): + return rhs <= self + + def __str__(self): + if self == Eof(): + return 'EOF' + else: + return '%s(%s)' % (self.line + 1, self.column) + + def __add__(self, offset): + return Cursor(self.line, self.column + offset) + + def __sub__(self, offset): + return Cursor(self.line, self.column - offset) + + def Clone(self): + """Returns a copy of self.""" + + return Cursor(self.line, self.column) + + +# Special cursor to indicate the end-of-file. +def Eof(): + """Returns the special cursor to denote the end-of-file.""" + return Cursor(-1, -1) + + +class Token: + """Represents a token in a Pump source file.""" + + def __init__(self, start=None, end=None, value=None, token_type=None): + if start is None: + self.start = Eof() + else: + self.start = start + if end is None: + self.end = Eof() + else: + self.end = end + self.value = value + self.token_type = token_type + + def __str__(self): + return 'Token @%s: \'%s\' type=%s' % ( + self.start, self.value, self.token_type) + + def Clone(self): + """Returns a copy of self.""" + + return Token(self.start.Clone(), self.end.Clone(), self.value, + self.token_type) + + +def StartsWith(lines, pos, string): + """Returns True iff the given position in lines starts with 'string'.""" + + return lines[pos.line][pos.column:].startswith(string) + + +def FindFirstInLine(line, token_table): + best_match_start = -1 + for (regex, token_type) in token_table: + m = regex.search(line) + if m: + # We found regex in lines + if best_match_start < 0 or m.start() < best_match_start: + best_match_start = m.start() + best_match_length = m.end() - m.start() + best_match_token_type = token_type + + if best_match_start < 0: + return None + + return (best_match_start, best_match_length, best_match_token_type) + + +def FindFirst(lines, token_table, cursor): + """Finds the first occurrence of any string in strings in lines.""" + + start = cursor.Clone() + cur_line_number = cursor.line + for line in lines[start.line:]: + if cur_line_number == start.line: + line = line[start.column:] + m = FindFirstInLine(line, token_table) + if m: + # We found a regex in line. + (start_column, length, token_type) = m + if cur_line_number == start.line: + start_column += start.column + found_start = Cursor(cur_line_number, start_column) + found_end = found_start + length + return MakeToken(lines, found_start, found_end, token_type) + cur_line_number += 1 + # We failed to find str in lines + return None + + +def SubString(lines, start, end): + """Returns a substring in lines.""" + + if end == Eof(): + end = Cursor(len(lines) - 1, len(lines[-1])) + + if start >= end: + return '' + + if start.line == end.line: + return lines[start.line][start.column:end.column] + + result_lines = ([lines[start.line][start.column:]] + + lines[start.line + 1:end.line] + + [lines[end.line][:end.column]]) + return ''.join(result_lines) + + +def MakeToken(lines, start, end, token_type): + """Creates a new instance of Token.""" + + return Token(start, end, SubString(lines, start, end), token_type) + + +def ParseToken(lines, pos, regex, token_type): + line = lines[pos.line][pos.column:] + m = regex.search(line) + if m and not m.start(): + return MakeToken(lines, pos, pos + m.end(), token_type) + else: + print 'ERROR: %s expected at %s.' % (token_type, pos) + sys.exit(1) + + +ID_REGEX = re.compile(r'[_A-Za-z]\w*') +EQ_REGEX = re.compile(r'=') +REST_OF_LINE_REGEX = re.compile(r'.*?(?=$|\$\$)') +OPTIONAL_WHITE_SPACES_REGEX = re.compile(r'\s*') +WHITE_SPACE_REGEX = re.compile(r'\s') +DOT_DOT_REGEX = re.compile(r'\.\.') + + +def Skip(lines, pos, regex): + line = lines[pos.line][pos.column:] + m = re.search(regex, line) + if m and not m.start(): + return pos + m.end() + else: + return pos + + +def SkipUntil(lines, pos, regex, token_type): + line = lines[pos.line][pos.column:] + m = re.search(regex, line) + if m: + return pos + m.start() + else: + print ('ERROR: %s expected on line %s after column %s.' % + (token_type, pos.line + 1, pos.column)) + sys.exit(1) + + +def ParseExpTokenInParens(lines, pos): + def ParseInParens(pos): + pos = Skip(lines, pos, OPTIONAL_WHITE_SPACES_REGEX) + pos = Skip(lines, pos, r'\(') + pos = Parse(pos) + pos = Skip(lines, pos, r'\)') + return pos + + def Parse(pos): + pos = SkipUntil(lines, pos, r'\(|\)', ')') + if SubString(lines, pos, pos + 1) == '(': + pos = Parse(pos + 1) + pos = Skip(lines, pos, r'\)') + return Parse(pos) + else: + return pos + + start = pos.Clone() + pos = ParseInParens(pos) + return MakeToken(lines, start, pos, 'exp') + + +def RStripNewLineFromToken(token): + if token.value.endswith('\n'): + return Token(token.start, token.end, token.value[:-1], token.token_type) + else: + return token + + +def TokenizeLines(lines, pos): + while True: + found = FindFirst(lines, TOKEN_TABLE, pos) + if not found: + yield MakeToken(lines, pos, Eof(), 'code') + return + + if found.start == pos: + prev_token = None + prev_token_rstripped = None + else: + prev_token = MakeToken(lines, pos, found.start, 'code') + prev_token_rstripped = RStripNewLineFromToken(prev_token) + + if found.token_type == '$$': # A meta comment. + if prev_token_rstripped: + yield prev_token_rstripped + pos = Cursor(found.end.line + 1, 0) + elif found.token_type == '$var': + if prev_token_rstripped: + yield prev_token_rstripped + yield found + id_token = ParseToken(lines, found.end, ID_REGEX, 'id') + yield id_token + pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX) + + eq_token = ParseToken(lines, pos, EQ_REGEX, '=') + yield eq_token + pos = Skip(lines, eq_token.end, r'\s*') + + if SubString(lines, pos, pos + 2) != '[[': + exp_token = ParseToken(lines, pos, REST_OF_LINE_REGEX, 'exp') + yield exp_token + pos = Cursor(exp_token.end.line + 1, 0) + elif found.token_type == '$for': + if prev_token_rstripped: + yield prev_token_rstripped + yield found + id_token = ParseToken(lines, found.end, ID_REGEX, 'id') + yield id_token + pos = Skip(lines, id_token.end, WHITE_SPACE_REGEX) + elif found.token_type == '$range': + if prev_token_rstripped: + yield prev_token_rstripped + yield found + id_token = ParseToken(lines, found.end, ID_REGEX, 'id') + yield id_token + pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX) + + dots_pos = SkipUntil(lines, pos, DOT_DOT_REGEX, '..') + yield MakeToken(lines, pos, dots_pos, 'exp') + yield MakeToken(lines, dots_pos, dots_pos + 2, '..') + pos = dots_pos + 2 + new_pos = Cursor(pos.line + 1, 0) + yield MakeToken(lines, pos, new_pos, 'exp') + pos = new_pos + elif found.token_type == '$': + if prev_token: + yield prev_token + yield found + exp_token = ParseExpTokenInParens(lines, found.end) + yield exp_token + pos = exp_token.end + elif (found.token_type == ']]' or found.token_type == '$if' or + found.token_type == '$elif' or found.token_type == '$else'): + if prev_token_rstripped: + yield prev_token_rstripped + yield found + pos = found.end + else: + if prev_token: + yield prev_token + yield found + pos = found.end + + +def Tokenize(s): + lines = s.splitlines(True) + return TokenizeLines(lines, Cursor(0, 0)) + + +class CodeNode: + def __init__(self, atomic_code_list=None): + self.atomic_code = atomic_code_list + + +class VarNode: + def __init__(self, identifier=None, atomic_code=None): + self.identifier = identifier + self.atomic_code = atomic_code + + +class RangeNode: + def __init__(self, identifier=None, exp1=None, exp2=None): + self.identifier = identifier + self.exp1 = exp1 + self.exp2 = exp2 + + +class ForNode: + def __init__(self, identifier=None, sep=None, code=None): + self.identifier = identifier + self.sep = sep + self.code = code + + +class ElseNode: + def __init__(self, else_branch=None): + self.else_branch = else_branch + + +class IfNode: + def __init__(self, exp=None, then_branch=None, else_branch=None): + self.exp = exp + self.then_branch = then_branch + self.else_branch = else_branch + + +class RawCodeNode: + def __init__(self, token=None): + self.raw_code = token + + +class LiteralDollarNode: + def __init__(self, token): + self.token = token + + +class ExpNode: + def __init__(self, token, python_exp): + self.token = token + self.python_exp = python_exp + + +def PopFront(a_list): + head = a_list[0] + a_list[:1] = [] + return head + + +def PushFront(a_list, elem): + a_list[:0] = [elem] + + +def PopToken(a_list, token_type=None): + token = PopFront(a_list) + if token_type is not None and token.token_type != token_type: + print 'ERROR: %s expected at %s' % (token_type, token.start) + print 'ERROR: %s found instead' % (token,) + sys.exit(1) + + return token + + +def PeekToken(a_list): + if not a_list: + return None + + return a_list[0] + + +def ParseExpNode(token): + python_exp = re.sub(r'([_A-Za-z]\w*)', r'self.GetValue("\1")', token.value) + return ExpNode(token, python_exp) + + +def ParseElseNode(tokens): + def Pop(token_type=None): + return PopToken(tokens, token_type) + + next = PeekToken(tokens) + if not next: + return None + if next.token_type == '$else': + Pop('$else') + Pop('[[') + code_node = ParseCodeNode(tokens) + Pop(']]') + return code_node + elif next.token_type == '$elif': + Pop('$elif') + exp = Pop('code') + Pop('[[') + code_node = ParseCodeNode(tokens) + Pop(']]') + inner_else_node = ParseElseNode(tokens) + return CodeNode([IfNode(ParseExpNode(exp), code_node, inner_else_node)]) + elif not next.value.strip(): + Pop('code') + return ParseElseNode(tokens) + else: + return None + + +def ParseAtomicCodeNode(tokens): + def Pop(token_type=None): + return PopToken(tokens, token_type) + + head = PopFront(tokens) + t = head.token_type + if t == 'code': + return RawCodeNode(head) + elif t == '$var': + id_token = Pop('id') + Pop('=') + next = PeekToken(tokens) + if next.token_type == 'exp': + exp_token = Pop() + return VarNode(id_token, ParseExpNode(exp_token)) + Pop('[[') + code_node = ParseCodeNode(tokens) + Pop(']]') + return VarNode(id_token, code_node) + elif t == '$for': + id_token = Pop('id') + next_token = PeekToken(tokens) + if next_token.token_type == 'code': + sep_token = next_token + Pop('code') + else: + sep_token = None + Pop('[[') + code_node = ParseCodeNode(tokens) + Pop(']]') + return ForNode(id_token, sep_token, code_node) + elif t == '$if': + exp_token = Pop('code') + Pop('[[') + code_node = ParseCodeNode(tokens) + Pop(']]') + else_node = ParseElseNode(tokens) + return IfNode(ParseExpNode(exp_token), code_node, else_node) + elif t == '$range': + id_token = Pop('id') + exp1_token = Pop('exp') + Pop('..') + exp2_token = Pop('exp') + return RangeNode(id_token, ParseExpNode(exp1_token), + ParseExpNode(exp2_token)) + elif t == '$id': + return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id')) + elif t == '$($)': + return LiteralDollarNode(head) + elif t == '$': + exp_token = Pop('exp') + return ParseExpNode(exp_token) + elif t == '[[': + code_node = ParseCodeNode(tokens) + Pop(']]') + return code_node + else: + PushFront(tokens, head) + return None + + +def ParseCodeNode(tokens): + atomic_code_list = [] + while True: + if not tokens: + break + atomic_code_node = ParseAtomicCodeNode(tokens) + if atomic_code_node: + atomic_code_list.append(atomic_code_node) + else: + break + return CodeNode(atomic_code_list) + + +def Convert(file_path): + s = file(file_path, 'r').read() + tokens = [] + for token in Tokenize(s): + tokens.append(token) + code_node = ParseCodeNode(tokens) + return code_node + + +class Env: + def __init__(self): + self.variables = [] + self.ranges = [] + + def Clone(self): + clone = Env() + clone.variables = self.variables[:] + clone.ranges = self.ranges[:] + return clone + + def PushVariable(self, var, value): + # If value looks like an int, store it as an int. + try: + int_value = int(value) + if ('%s' % int_value) == value: + value = int_value + except Exception: + pass + self.variables[:0] = [(var, value)] + + def PopVariable(self): + self.variables[:1] = [] + + def PushRange(self, var, lower, upper): + self.ranges[:0] = [(var, lower, upper)] + + def PopRange(self): + self.ranges[:1] = [] + + def GetValue(self, identifier): + for (var, value) in self.variables: + if identifier == var: + return value + + print 'ERROR: meta variable %s is undefined.' % (identifier,) + sys.exit(1) + + def EvalExp(self, exp): + try: + result = eval(exp.python_exp) + except Exception, e: + print 'ERROR: caught exception %s: %s' % (e.__class__.__name__, e) + print ('ERROR: failed to evaluate meta expression %s at %s' % + (exp.python_exp, exp.token.start)) + sys.exit(1) + return result + + def GetRange(self, identifier): + for (var, lower, upper) in self.ranges: + if identifier == var: + return (lower, upper) + + print 'ERROR: range %s is undefined.' % (identifier,) + sys.exit(1) + + +class Output: + def __init__(self): + self.string = '' + + def GetLastLine(self): + index = self.string.rfind('\n') + if index < 0: + return '' + + return self.string[index + 1:] + + def Append(self, s): + self.string += s + + +def RunAtomicCode(env, node, output): + if isinstance(node, VarNode): + identifier = node.identifier.value.strip() + result = Output() + RunAtomicCode(env.Clone(), node.atomic_code, result) + value = result.string + env.PushVariable(identifier, value) + elif isinstance(node, RangeNode): + identifier = node.identifier.value.strip() + lower = int(env.EvalExp(node.exp1)) + upper = int(env.EvalExp(node.exp2)) + env.PushRange(identifier, lower, upper) + elif isinstance(node, ForNode): + identifier = node.identifier.value.strip() + if node.sep is None: + sep = '' + else: + sep = node.sep.value + (lower, upper) = env.GetRange(identifier) + for i in range(lower, upper + 1): + new_env = env.Clone() + new_env.PushVariable(identifier, i) + RunCode(new_env, node.code, output) + if i != upper: + output.Append(sep) + elif isinstance(node, RawCodeNode): + output.Append(node.raw_code.value) + elif isinstance(node, IfNode): + cond = env.EvalExp(node.exp) + if cond: + RunCode(env.Clone(), node.then_branch, output) + elif node.else_branch is not None: + RunCode(env.Clone(), node.else_branch, output) + elif isinstance(node, ExpNode): + value = env.EvalExp(node) + output.Append('%s' % (value,)) + elif isinstance(node, LiteralDollarNode): + output.Append('$') + elif isinstance(node, CodeNode): + RunCode(env.Clone(), node, output) + else: + print 'BAD' + print node + sys.exit(1) + + +def RunCode(env, code_node, output): + for atomic_code in code_node.atomic_code: + RunAtomicCode(env, atomic_code, output) + + +def IsComment(cur_line): + return '//' in cur_line + + +def IsInPreprocessorDirevative(prev_lines, cur_line): + if cur_line.lstrip().startswith('#'): + return True + return prev_lines != [] and prev_lines[-1].endswith('\\') + + +def WrapComment(line, output): + loc = line.find('//') + before_comment = line[:loc].rstrip() + if before_comment == '': + indent = loc + else: + output.append(before_comment) + indent = len(before_comment) - len(before_comment.lstrip()) + prefix = indent*' ' + '// ' + max_len = 80 - len(prefix) + comment = line[loc + 2:].strip() + segs = [seg for seg in re.split(r'(\w+\W*)', comment) if seg != ''] + cur_line = '' + for seg in segs: + if len((cur_line + seg).rstrip()) < max_len: + cur_line += seg + else: + if cur_line.strip() != '': + output.append(prefix + cur_line.rstrip()) + cur_line = seg.lstrip() + if cur_line.strip() != '': + output.append(prefix + cur_line.strip()) + + +def WrapCode(line, line_concat, output): + indent = len(line) - len(line.lstrip()) + prefix = indent*' ' # Prefix of the current line + max_len = 80 - indent - len(line_concat) # Maximum length of the current line + new_prefix = prefix + 4*' ' # Prefix of a continuation line + new_max_len = max_len - 4 # Maximum length of a continuation line + # Prefers to wrap a line after a ',' or ';'. + segs = [seg for seg in re.split(r'([^,;]+[,;]?)', line.strip()) if seg != ''] + cur_line = '' # The current line without leading spaces. + for seg in segs: + # If the line is still too long, wrap at a space. + while cur_line == '' and len(seg.strip()) > max_len: + seg = seg.lstrip() + split_at = seg.rfind(' ', 0, max_len) + output.append(prefix + seg[:split_at].strip() + line_concat) + seg = seg[split_at + 1:] + prefix = new_prefix + max_len = new_max_len + + if len((cur_line + seg).rstrip()) < max_len: + cur_line = (cur_line + seg).lstrip() + else: + output.append(prefix + cur_line.rstrip() + line_concat) + prefix = new_prefix + max_len = new_max_len + cur_line = seg.lstrip() + if cur_line.strip() != '': + output.append(prefix + cur_line.strip()) + + +def WrapPreprocessorDirevative(line, output): + WrapCode(line, ' \\', output) + + +def WrapPlainCode(line, output): + WrapCode(line, '', output) + + +def IsHeaderGuardOrInclude(line): + return (re.match(r'^#(ifndef|define|endif\s*//)\s*[\w_]+\s*$', line) or + re.match(r'^#include\s', line)) + + +def WrapLongLine(line, output): + line = line.rstrip() + if len(line) <= 80: + output.append(line) + elif IsComment(line): + if IsHeaderGuardOrInclude(line): + # The style guide made an exception to allow long header guard lines + # and includes. + output.append(line) + else: + WrapComment(line, output) + elif IsInPreprocessorDirevative(output, line): + if IsHeaderGuardOrInclude(line): + # The style guide made an exception to allow long header guard lines + # and includes. + output.append(line) + else: + WrapPreprocessorDirevative(line, output) + else: + WrapPlainCode(line, output) + + +def BeautifyCode(string): + lines = string.splitlines() + output = [] + for line in lines: + WrapLongLine(line, output) + output2 = [line.rstrip() for line in output] + return '\n'.join(output2) + '\n' + + +def main(argv): + if len(argv) == 1: + print __doc__ + sys.exit(1) + + file_path = argv[-1] + ast = Convert(file_path) + output = Output() + RunCode(Env(), ast, output) + output_str = BeautifyCode(output.string) + if file_path.endswith('.pump'): + output_file_path = file_path[:-5] + else: + output_file_path = '-' + if output_file_path == '-': + print output_str, + else: + output_file = file(output_file_path, 'w') + output_file.write('// This file was GENERATED by command:\n') + output_file.write('// %s %s\n' % + (os.path.basename(__file__), os.path.basename(file_path))) + output_file.write('// DO NOT EDIT BY HAND!!!\n\n') + output_file.write(output_str) + output_file.close() + + +if __name__ == '__main__': + main(sys.argv) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py new file mode 100755 index 000000000..6e6f9a147 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py @@ -0,0 +1,1387 @@ +#!/usr/bin/env python +# +# Copyright 2007 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Tool for uploading diffs from a version control system to the codereview app. + +Usage summary: upload.py [options] [-- diff_options] + +Diff options are passed to the diff command of the underlying system. + +Supported version control systems: + Git + Mercurial + Subversion + +It is important for Git/Mercurial users to specify a tree/node/branch to diff +against by using the '--rev' option. +""" +# This code is derived from appcfg.py in the App Engine SDK (open source), +# and from ASPN recipe #146306. + +import cookielib +import getpass +import logging +import md5 +import mimetypes +import optparse +import os +import re +import socket +import subprocess +import sys +import urllib +import urllib2 +import urlparse + +try: + import readline +except ImportError: + pass + +# The logging verbosity: +# 0: Errors only. +# 1: Status messages. +# 2: Info logs. +# 3: Debug logs. +verbosity = 1 + +# Max size of patch or base file. +MAX_UPLOAD_SIZE = 900 * 1024 + + +def GetEmail(prompt): + """Prompts the user for their email address and returns it. + + The last used email address is saved to a file and offered up as a suggestion + to the user. If the user presses enter without typing in anything the last + used email address is used. If the user enters a new address, it is saved + for next time we prompt. + + """ + last_email_file_name = os.path.expanduser("~/.last_codereview_email_address") + last_email = "" + if os.path.exists(last_email_file_name): + try: + last_email_file = open(last_email_file_name, "r") + last_email = last_email_file.readline().strip("\n") + last_email_file.close() + prompt += " [%s]" % last_email + except IOError, e: + pass + email = raw_input(prompt + ": ").strip() + if email: + try: + last_email_file = open(last_email_file_name, "w") + last_email_file.write(email) + last_email_file.close() + except IOError, e: + pass + else: + email = last_email + return email + + +def StatusUpdate(msg): + """Print a status message to stdout. + + If 'verbosity' is greater than 0, print the message. + + Args: + msg: The string to print. + """ + if verbosity > 0: + print msg + + +def ErrorExit(msg): + """Print an error message to stderr and exit.""" + print >>sys.stderr, msg + sys.exit(1) + + +class ClientLoginError(urllib2.HTTPError): + """Raised to indicate there was an error authenticating with ClientLogin.""" + + def __init__(self, url, code, msg, headers, args): + urllib2.HTTPError.__init__(self, url, code, msg, headers, None) + self.args = args + self.reason = args["Error"] + + +class AbstractRpcServer(object): + """Provides a common interface for a simple RPC server.""" + + def __init__(self, host, auth_function, host_override=None, extra_headers={}, + save_cookies=False): + """Creates a new HttpRpcServer. + + Args: + host: The host to send requests to. + auth_function: A function that takes no arguments and returns an + (email, password) tuple when called. Will be called if authentication + is required. + host_override: The host header to send to the server (defaults to host). + extra_headers: A dict of extra headers to append to every request. + save_cookies: If True, save the authentication cookies to local disk. + If False, use an in-memory cookiejar instead. Subclasses must + implement this functionality. Defaults to False. + """ + self.host = host + self.host_override = host_override + self.auth_function = auth_function + self.authenticated = False + self.extra_headers = extra_headers + self.save_cookies = save_cookies + self.opener = self._GetOpener() + if self.host_override: + logging.info("Server: %s; Host: %s", self.host, self.host_override) + else: + logging.info("Server: %s", self.host) + + def _GetOpener(self): + """Returns an OpenerDirector for making HTTP requests. + + Returns: + A urllib2.OpenerDirector object. + """ + raise NotImplementedError() + + def _CreateRequest(self, url, data=None): + """Creates a new urllib request.""" + logging.debug("Creating request for: '%s' with payload:\n%s", url, data) + req = urllib2.Request(url, data=data) + if self.host_override: + req.add_header("Host", self.host_override) + for key, value in self.extra_headers.iteritems(): + req.add_header(key, value) + return req + + def _GetAuthToken(self, email, password): + """Uses ClientLogin to authenticate the user, returning an auth token. + + Args: + email: The user's email address + password: The user's password + + Raises: + ClientLoginError: If there was an error authenticating with ClientLogin. + HTTPError: If there was some other form of HTTP error. + + Returns: + The authentication token returned by ClientLogin. + """ + account_type = "GOOGLE" + if self.host.endswith(".google.com"): + # Needed for use inside Google. + account_type = "HOSTED" + req = self._CreateRequest( + url="https://www.google.com/accounts/ClientLogin", + data=urllib.urlencode({ + "Email": email, + "Passwd": password, + "service": "ah", + "source": "rietveld-codereview-upload", + "accountType": account_type, + }), + ) + try: + response = self.opener.open(req) + response_body = response.read() + response_dict = dict(x.split("=") + for x in response_body.split("\n") if x) + return response_dict["Auth"] + except urllib2.HTTPError, e: + if e.code == 403: + body = e.read() + response_dict = dict(x.split("=", 1) for x in body.split("\n") if x) + raise ClientLoginError(req.get_full_url(), e.code, e.msg, + e.headers, response_dict) + else: + raise + + def _GetAuthCookie(self, auth_token): + """Fetches authentication cookies for an authentication token. + + Args: + auth_token: The authentication token returned by ClientLogin. + + Raises: + HTTPError: If there was an error fetching the authentication cookies. + """ + # This is a dummy value to allow us to identify when we're successful. + continue_location = "http://localhost/" + args = {"continue": continue_location, "auth": auth_token} + req = self._CreateRequest("http://%s/_ah/login?%s" % + (self.host, urllib.urlencode(args))) + try: + response = self.opener.open(req) + except urllib2.HTTPError, e: + response = e + if (response.code != 302 or + response.info()["location"] != continue_location): + raise urllib2.HTTPError(req.get_full_url(), response.code, response.msg, + response.headers, response.fp) + self.authenticated = True + + def _Authenticate(self): + """Authenticates the user. + + The authentication process works as follows: + 1) We get a username and password from the user + 2) We use ClientLogin to obtain an AUTH token for the user + (see http://code.google.com/apis/accounts/AuthForInstalledApps.html). + 3) We pass the auth token to /_ah/login on the server to obtain an + authentication cookie. If login was successful, it tries to redirect + us to the URL we provided. + + If we attempt to access the upload API without first obtaining an + authentication cookie, it returns a 401 response and directs us to + authenticate ourselves with ClientLogin. + """ + for i in range(3): + credentials = self.auth_function() + try: + auth_token = self._GetAuthToken(credentials[0], credentials[1]) + except ClientLoginError, e: + if e.reason == "BadAuthentication": + print >>sys.stderr, "Invalid username or password." + continue + if e.reason == "CaptchaRequired": + print >>sys.stderr, ( + "Please go to\n" + "https://www.google.com/accounts/DisplayUnlockCaptcha\n" + "and verify you are a human. Then try again.") + break + if e.reason == "NotVerified": + print >>sys.stderr, "Account not verified." + break + if e.reason == "TermsNotAgreed": + print >>sys.stderr, "User has not agreed to TOS." + break + if e.reason == "AccountDeleted": + print >>sys.stderr, "The user account has been deleted." + break + if e.reason == "AccountDisabled": + print >>sys.stderr, "The user account has been disabled." + break + if e.reason == "ServiceDisabled": + print >>sys.stderr, ("The user's access to the service has been " + "disabled.") + break + if e.reason == "ServiceUnavailable": + print >>sys.stderr, "The service is not available; try again later." + break + raise + self._GetAuthCookie(auth_token) + return + + def Send(self, request_path, payload=None, + content_type="application/octet-stream", + timeout=None, + **kwargs): + """Sends an RPC and returns the response. + + Args: + request_path: The path to send the request to, eg /api/appversion/create. + payload: The body of the request, or None to send an empty request. + content_type: The Content-Type header to use. + timeout: timeout in seconds; default None i.e. no timeout. + (Note: for large requests on OS X, the timeout doesn't work right.) + kwargs: Any keyword arguments are converted into query string parameters. + + Returns: + The response body, as a string. + """ + # TODO: Don't require authentication. Let the server say + # whether it is necessary. + if not self.authenticated: + self._Authenticate() + + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(timeout) + try: + tries = 0 + while True: + tries += 1 + args = dict(kwargs) + url = "http://%s%s" % (self.host, request_path) + if args: + url += "?" + urllib.urlencode(args) + req = self._CreateRequest(url=url, data=payload) + req.add_header("Content-Type", content_type) + try: + f = self.opener.open(req) + response = f.read() + f.close() + return response + except urllib2.HTTPError, e: + if tries > 3: + raise + elif e.code == 401: + self._Authenticate() +## elif e.code >= 500 and e.code < 600: +## # Server Error - try again. +## continue + else: + raise + finally: + socket.setdefaulttimeout(old_timeout) + + +class HttpRpcServer(AbstractRpcServer): + """Provides a simplified RPC-style interface for HTTP requests.""" + + def _Authenticate(self): + """Save the cookie jar after authentication.""" + super(HttpRpcServer, self)._Authenticate() + if self.save_cookies: + StatusUpdate("Saving authentication cookies to %s" % self.cookie_file) + self.cookie_jar.save() + + def _GetOpener(self): + """Returns an OpenerDirector that supports cookies and ignores redirects. + + Returns: + A urllib2.OpenerDirector object. + """ + opener = urllib2.OpenerDirector() + opener.add_handler(urllib2.ProxyHandler()) + opener.add_handler(urllib2.UnknownHandler()) + opener.add_handler(urllib2.HTTPHandler()) + opener.add_handler(urllib2.HTTPDefaultErrorHandler()) + opener.add_handler(urllib2.HTTPSHandler()) + opener.add_handler(urllib2.HTTPErrorProcessor()) + if self.save_cookies: + self.cookie_file = os.path.expanduser("~/.codereview_upload_cookies") + self.cookie_jar = cookielib.MozillaCookieJar(self.cookie_file) + if os.path.exists(self.cookie_file): + try: + self.cookie_jar.load() + self.authenticated = True + StatusUpdate("Loaded authentication cookies from %s" % + self.cookie_file) + except (cookielib.LoadError, IOError): + # Failed to load cookies - just ignore them. + pass + else: + # Create an empty cookie file with mode 600 + fd = os.open(self.cookie_file, os.O_CREAT, 0600) + os.close(fd) + # Always chmod the cookie file + os.chmod(self.cookie_file, 0600) + else: + # Don't save cookies across runs of update.py. + self.cookie_jar = cookielib.CookieJar() + opener.add_handler(urllib2.HTTPCookieProcessor(self.cookie_jar)) + return opener + + +parser = optparse.OptionParser(usage="%prog [options] [-- diff_options]") +parser.add_option("-y", "--assume_yes", action="store_true", + dest="assume_yes", default=False, + help="Assume that the answer to yes/no questions is 'yes'.") +# Logging +group = parser.add_option_group("Logging options") +group.add_option("-q", "--quiet", action="store_const", const=0, + dest="verbose", help="Print errors only.") +group.add_option("-v", "--verbose", action="store_const", const=2, + dest="verbose", default=1, + help="Print info level logs (default).") +group.add_option("--noisy", action="store_const", const=3, + dest="verbose", help="Print all logs.") +# Review server +group = parser.add_option_group("Review server options") +group.add_option("-s", "--server", action="store", dest="server", + default="codereview.appspot.com", + metavar="SERVER", + help=("The server to upload to. The format is host[:port]. " + "Defaults to 'codereview.appspot.com'.")) +group.add_option("-e", "--email", action="store", dest="email", + metavar="EMAIL", default=None, + help="The username to use. Will prompt if omitted.") +group.add_option("-H", "--host", action="store", dest="host", + metavar="HOST", default=None, + help="Overrides the Host header sent with all RPCs.") +group.add_option("--no_cookies", action="store_false", + dest="save_cookies", default=True, + help="Do not save authentication cookies to local disk.") +# Issue +group = parser.add_option_group("Issue options") +group.add_option("-d", "--description", action="store", dest="description", + metavar="DESCRIPTION", default=None, + help="Optional description when creating an issue.") +group.add_option("-f", "--description_file", action="store", + dest="description_file", metavar="DESCRIPTION_FILE", + default=None, + help="Optional path of a file that contains " + "the description when creating an issue.") +group.add_option("-r", "--reviewers", action="store", dest="reviewers", + metavar="REVIEWERS", default=None, + help="Add reviewers (comma separated email addresses).") +group.add_option("--cc", action="store", dest="cc", + metavar="CC", default=None, + help="Add CC (comma separated email addresses).") +# Upload options +group = parser.add_option_group("Patch options") +group.add_option("-m", "--message", action="store", dest="message", + metavar="MESSAGE", default=None, + help="A message to identify the patch. " + "Will prompt if omitted.") +group.add_option("-i", "--issue", type="int", action="store", + metavar="ISSUE", default=None, + help="Issue number to which to add. Defaults to new issue.") +group.add_option("--download_base", action="store_true", + dest="download_base", default=False, + help="Base files will be downloaded by the server " + "(side-by-side diffs may not work on files with CRs).") +group.add_option("--rev", action="store", dest="revision", + metavar="REV", default=None, + help="Branch/tree/revision to diff against (used by DVCS).") +group.add_option("--send_mail", action="store_true", + dest="send_mail", default=False, + help="Send notification email to reviewers.") + + +def GetRpcServer(options): + """Returns an instance of an AbstractRpcServer. + + Returns: + A new AbstractRpcServer, on which RPC calls can be made. + """ + + rpc_server_class = HttpRpcServer + + def GetUserCredentials(): + """Prompts the user for a username and password.""" + email = options.email + if email is None: + email = GetEmail("Email (login for uploading to %s)" % options.server) + password = getpass.getpass("Password for %s: " % email) + return (email, password) + + # If this is the dev_appserver, use fake authentication. + host = (options.host or options.server).lower() + if host == "localhost" or host.startswith("localhost:"): + email = options.email + if email is None: + email = "test@example.com" + logging.info("Using debug user %s. Override with --email" % email) + server = rpc_server_class( + options.server, + lambda: (email, "password"), + host_override=options.host, + extra_headers={"Cookie": + 'dev_appserver_login="%s:False"' % email}, + save_cookies=options.save_cookies) + # Don't try to talk to ClientLogin. + server.authenticated = True + return server + + return rpc_server_class(options.server, GetUserCredentials, + host_override=options.host, + save_cookies=options.save_cookies) + + +def EncodeMultipartFormData(fields, files): + """Encode form fields for multipart/form-data. + + Args: + fields: A sequence of (name, value) elements for regular form fields. + files: A sequence of (name, filename, value) elements for data to be + uploaded as files. + Returns: + (content_type, body) ready for httplib.HTTP instance. + + Source: + http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306 + """ + BOUNDARY = '-M-A-G-I-C---B-O-U-N-D-A-R-Y-' + CRLF = '\r\n' + lines = [] + for (key, value) in fields: + lines.append('--' + BOUNDARY) + lines.append('Content-Disposition: form-data; name="%s"' % key) + lines.append('') + lines.append(value) + for (key, filename, value) in files: + lines.append('--' + BOUNDARY) + lines.append('Content-Disposition: form-data; name="%s"; filename="%s"' % + (key, filename)) + lines.append('Content-Type: %s' % GetContentType(filename)) + lines.append('') + lines.append(value) + lines.append('--' + BOUNDARY + '--') + lines.append('') + body = CRLF.join(lines) + content_type = 'multipart/form-data; boundary=%s' % BOUNDARY + return content_type, body + + +def GetContentType(filename): + """Helper to guess the content-type from the filename.""" + return mimetypes.guess_type(filename)[0] or 'application/octet-stream' + + +# Use a shell for subcommands on Windows to get a PATH search. +use_shell = sys.platform.startswith("win") + +def RunShellWithReturnCode(command, print_output=False, + universal_newlines=True): + """Executes a command and returns the output from stdout and the return code. + + Args: + command: Command to execute. + print_output: If True, the output is printed to stdout. + If False, both stdout and stderr are ignored. + universal_newlines: Use universal_newlines flag (default: True). + + Returns: + Tuple (output, return code) + """ + logging.info("Running %s", command) + p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + shell=use_shell, universal_newlines=universal_newlines) + if print_output: + output_array = [] + while True: + line = p.stdout.readline() + if not line: + break + print line.strip("\n") + output_array.append(line) + output = "".join(output_array) + else: + output = p.stdout.read() + p.wait() + errout = p.stderr.read() + if print_output and errout: + print >>sys.stderr, errout + p.stdout.close() + p.stderr.close() + return output, p.returncode + + +def RunShell(command, silent_ok=False, universal_newlines=True, + print_output=False): + data, retcode = RunShellWithReturnCode(command, print_output, + universal_newlines) + if retcode: + ErrorExit("Got error status from %s:\n%s" % (command, data)) + if not silent_ok and not data: + ErrorExit("No output from %s" % command) + return data + + +class VersionControlSystem(object): + """Abstract base class providing an interface to the VCS.""" + + def __init__(self, options): + """Constructor. + + Args: + options: Command line options. + """ + self.options = options + + def GenerateDiff(self, args): + """Return the current diff as a string. + + Args: + args: Extra arguments to pass to the diff command. + """ + raise NotImplementedError( + "abstract method -- subclass %s must override" % self.__class__) + + def GetUnknownFiles(self): + """Return a list of files unknown to the VCS.""" + raise NotImplementedError( + "abstract method -- subclass %s must override" % self.__class__) + + def CheckForUnknownFiles(self): + """Show an "are you sure?" prompt if there are unknown files.""" + unknown_files = self.GetUnknownFiles() + if unknown_files: + print "The following files are not added to version control:" + for line in unknown_files: + print line + prompt = "Are you sure to continue?(y/N) " + answer = raw_input(prompt).strip() + if answer != "y": + ErrorExit("User aborted") + + def GetBaseFile(self, filename): + """Get the content of the upstream version of a file. + + Returns: + A tuple (base_content, new_content, is_binary, status) + base_content: The contents of the base file. + new_content: For text files, this is empty. For binary files, this is + the contents of the new file, since the diff output won't contain + information to reconstruct the current file. + is_binary: True iff the file is binary. + status: The status of the file. + """ + + raise NotImplementedError( + "abstract method -- subclass %s must override" % self.__class__) + + + def GetBaseFiles(self, diff): + """Helper that calls GetBase file for each file in the patch. + + Returns: + A dictionary that maps from filename to GetBaseFile's tuple. Filenames + are retrieved based on lines that start with "Index:" or + "Property changes on:". + """ + files = {} + for line in diff.splitlines(True): + if line.startswith('Index:') or line.startswith('Property changes on:'): + unused, filename = line.split(':', 1) + # On Windows if a file has property changes its filename uses '\' + # instead of '/'. + filename = filename.strip().replace('\\', '/') + files[filename] = self.GetBaseFile(filename) + return files + + + def UploadBaseFiles(self, issue, rpc_server, patch_list, patchset, options, + files): + """Uploads the base files (and if necessary, the current ones as well).""" + + def UploadFile(filename, file_id, content, is_binary, status, is_base): + """Uploads a file to the server.""" + file_too_large = False + if is_base: + type = "base" + else: + type = "current" + if len(content) > MAX_UPLOAD_SIZE: + print ("Not uploading the %s file for %s because it's too large." % + (type, filename)) + file_too_large = True + content = "" + checksum = md5.new(content).hexdigest() + if options.verbose > 0 and not file_too_large: + print "Uploading %s file for %s" % (type, filename) + url = "/%d/upload_content/%d/%d" % (int(issue), int(patchset), file_id) + form_fields = [("filename", filename), + ("status", status), + ("checksum", checksum), + ("is_binary", str(is_binary)), + ("is_current", str(not is_base)), + ] + if file_too_large: + form_fields.append(("file_too_large", "1")) + if options.email: + form_fields.append(("user", options.email)) + ctype, body = EncodeMultipartFormData(form_fields, + [("data", filename, content)]) + response_body = rpc_server.Send(url, body, + content_type=ctype) + if not response_body.startswith("OK"): + StatusUpdate(" --> %s" % response_body) + sys.exit(1) + + patches = dict() + [patches.setdefault(v, k) for k, v in patch_list] + for filename in patches.keys(): + base_content, new_content, is_binary, status = files[filename] + file_id_str = patches.get(filename) + if file_id_str.find("nobase") != -1: + base_content = None + file_id_str = file_id_str[file_id_str.rfind("_") + 1:] + file_id = int(file_id_str) + if base_content != None: + UploadFile(filename, file_id, base_content, is_binary, status, True) + if new_content != None: + UploadFile(filename, file_id, new_content, is_binary, status, False) + + def IsImage(self, filename): + """Returns true if the filename has an image extension.""" + mimetype = mimetypes.guess_type(filename)[0] + if not mimetype: + return False + return mimetype.startswith("image/") + + +class SubversionVCS(VersionControlSystem): + """Implementation of the VersionControlSystem interface for Subversion.""" + + def __init__(self, options): + super(SubversionVCS, self).__init__(options) + if self.options.revision: + match = re.match(r"(\d+)(:(\d+))?", self.options.revision) + if not match: + ErrorExit("Invalid Subversion revision %s." % self.options.revision) + self.rev_start = match.group(1) + self.rev_end = match.group(3) + else: + self.rev_start = self.rev_end = None + # Cache output from "svn list -r REVNO dirname". + # Keys: dirname, Values: 2-tuple (ouput for start rev and end rev). + self.svnls_cache = {} + # SVN base URL is required to fetch files deleted in an older revision. + # Result is cached to not guess it over and over again in GetBaseFile(). + required = self.options.download_base or self.options.revision is not None + self.svn_base = self._GuessBase(required) + + def GuessBase(self, required): + """Wrapper for _GuessBase.""" + return self.svn_base + + def _GuessBase(self, required): + """Returns the SVN base URL. + + Args: + required: If true, exits if the url can't be guessed, otherwise None is + returned. + """ + info = RunShell(["svn", "info"]) + for line in info.splitlines(): + words = line.split() + if len(words) == 2 and words[0] == "URL:": + url = words[1] + scheme, netloc, path, params, query, fragment = urlparse.urlparse(url) + username, netloc = urllib.splituser(netloc) + if username: + logging.info("Removed username from base URL") + if netloc.endswith("svn.python.org"): + if netloc == "svn.python.org": + if path.startswith("/projects/"): + path = path[9:] + elif netloc != "pythondev@svn.python.org": + ErrorExit("Unrecognized Python URL: %s" % url) + base = "http://svn.python.org/view/*checkout*%s/" % path + logging.info("Guessed Python base = %s", base) + elif netloc.endswith("svn.collab.net"): + if path.startswith("/repos/"): + path = path[6:] + base = "http://svn.collab.net/viewvc/*checkout*%s/" % path + logging.info("Guessed CollabNet base = %s", base) + elif netloc.endswith(".googlecode.com"): + path = path + "/" + base = urlparse.urlunparse(("http", netloc, path, params, + query, fragment)) + logging.info("Guessed Google Code base = %s", base) + else: + path = path + "/" + base = urlparse.urlunparse((scheme, netloc, path, params, + query, fragment)) + logging.info("Guessed base = %s", base) + return base + if required: + ErrorExit("Can't find URL in output from svn info") + return None + + def GenerateDiff(self, args): + cmd = ["svn", "diff"] + if self.options.revision: + cmd += ["-r", self.options.revision] + cmd.extend(args) + data = RunShell(cmd) + count = 0 + for line in data.splitlines(): + if line.startswith("Index:") or line.startswith("Property changes on:"): + count += 1 + logging.info(line) + if not count: + ErrorExit("No valid patches found in output from svn diff") + return data + + def _CollapseKeywords(self, content, keyword_str): + """Collapses SVN keywords.""" + # svn cat translates keywords but svn diff doesn't. As a result of this + # behavior patching.PatchChunks() fails with a chunk mismatch error. + # This part was originally written by the Review Board development team + # who had the same problem (http://reviews.review-board.org/r/276/). + # Mapping of keywords to known aliases + svn_keywords = { + # Standard keywords + 'Date': ['Date', 'LastChangedDate'], + 'Revision': ['Revision', 'LastChangedRevision', 'Rev'], + 'Author': ['Author', 'LastChangedBy'], + 'HeadURL': ['HeadURL', 'URL'], + 'Id': ['Id'], + + # Aliases + 'LastChangedDate': ['LastChangedDate', 'Date'], + 'LastChangedRevision': ['LastChangedRevision', 'Rev', 'Revision'], + 'LastChangedBy': ['LastChangedBy', 'Author'], + 'URL': ['URL', 'HeadURL'], + } + + def repl(m): + if m.group(2): + return "$%s::%s$" % (m.group(1), " " * len(m.group(3))) + return "$%s$" % m.group(1) + keywords = [keyword + for name in keyword_str.split(" ") + for keyword in svn_keywords.get(name, [])] + return re.sub(r"\$(%s):(:?)([^\$]+)\$" % '|'.join(keywords), repl, content) + + def GetUnknownFiles(self): + status = RunShell(["svn", "status", "--ignore-externals"], silent_ok=True) + unknown_files = [] + for line in status.split("\n"): + if line and line[0] == "?": + unknown_files.append(line) + return unknown_files + + def ReadFile(self, filename): + """Returns the contents of a file.""" + file = open(filename, 'rb') + result = "" + try: + result = file.read() + finally: + file.close() + return result + + def GetStatus(self, filename): + """Returns the status of a file.""" + if not self.options.revision: + status = RunShell(["svn", "status", "--ignore-externals", filename]) + if not status: + ErrorExit("svn status returned no output for %s" % filename) + status_lines = status.splitlines() + # If file is in a cl, the output will begin with + # "\n--- Changelist 'cl_name':\n". See + # http://svn.collab.net/repos/svn/trunk/notes/changelist-design.txt + if (len(status_lines) == 3 and + not status_lines[0] and + status_lines[1].startswith("--- Changelist")): + status = status_lines[2] + else: + status = status_lines[0] + # If we have a revision to diff against we need to run "svn list" + # for the old and the new revision and compare the results to get + # the correct status for a file. + else: + dirname, relfilename = os.path.split(filename) + if dirname not in self.svnls_cache: + cmd = ["svn", "list", "-r", self.rev_start, dirname or "."] + out, returncode = RunShellWithReturnCode(cmd) + if returncode: + ErrorExit("Failed to get status for %s." % filename) + old_files = out.splitlines() + args = ["svn", "list"] + if self.rev_end: + args += ["-r", self.rev_end] + cmd = args + [dirname or "."] + out, returncode = RunShellWithReturnCode(cmd) + if returncode: + ErrorExit("Failed to run command %s" % cmd) + self.svnls_cache[dirname] = (old_files, out.splitlines()) + old_files, new_files = self.svnls_cache[dirname] + if relfilename in old_files and relfilename not in new_files: + status = "D " + elif relfilename in old_files and relfilename in new_files: + status = "M " + else: + status = "A " + return status + + def GetBaseFile(self, filename): + status = self.GetStatus(filename) + base_content = None + new_content = None + + # If a file is copied its status will be "A +", which signifies + # "addition-with-history". See "svn st" for more information. We need to + # upload the original file or else diff parsing will fail if the file was + # edited. + if status[0] == "A" and status[3] != "+": + # We'll need to upload the new content if we're adding a binary file + # since diff's output won't contain it. + mimetype = RunShell(["svn", "propget", "svn:mime-type", filename], + silent_ok=True) + base_content = "" + is_binary = mimetype and not mimetype.startswith("text/") + if is_binary and self.IsImage(filename): + new_content = self.ReadFile(filename) + elif (status[0] in ("M", "D", "R") or + (status[0] == "A" and status[3] == "+") or # Copied file. + (status[0] == " " and status[1] == "M")): # Property change. + args = [] + if self.options.revision: + url = "%s/%s@%s" % (self.svn_base, filename, self.rev_start) + else: + # Don't change filename, it's needed later. + url = filename + args += ["-r", "BASE"] + cmd = ["svn"] + args + ["propget", "svn:mime-type", url] + mimetype, returncode = RunShellWithReturnCode(cmd) + if returncode: + # File does not exist in the requested revision. + # Reset mimetype, it contains an error message. + mimetype = "" + get_base = False + is_binary = mimetype and not mimetype.startswith("text/") + if status[0] == " ": + # Empty base content just to force an upload. + base_content = "" + elif is_binary: + if self.IsImage(filename): + get_base = True + if status[0] == "M": + if not self.rev_end: + new_content = self.ReadFile(filename) + else: + url = "%s/%s@%s" % (self.svn_base, filename, self.rev_end) + new_content = RunShell(["svn", "cat", url], + universal_newlines=True, silent_ok=True) + else: + base_content = "" + else: + get_base = True + + if get_base: + if is_binary: + universal_newlines = False + else: + universal_newlines = True + if self.rev_start: + # "svn cat -r REV delete_file.txt" doesn't work. cat requires + # the full URL with "@REV" appended instead of using "-r" option. + url = "%s/%s@%s" % (self.svn_base, filename, self.rev_start) + base_content = RunShell(["svn", "cat", url], + universal_newlines=universal_newlines, + silent_ok=True) + else: + base_content = RunShell(["svn", "cat", filename], + universal_newlines=universal_newlines, + silent_ok=True) + if not is_binary: + args = [] + if self.rev_start: + url = "%s/%s@%s" % (self.svn_base, filename, self.rev_start) + else: + url = filename + args += ["-r", "BASE"] + cmd = ["svn"] + args + ["propget", "svn:keywords", url] + keywords, returncode = RunShellWithReturnCode(cmd) + if keywords and not returncode: + base_content = self._CollapseKeywords(base_content, keywords) + else: + StatusUpdate("svn status returned unexpected output: %s" % status) + sys.exit(1) + return base_content, new_content, is_binary, status[0:5] + + +class GitVCS(VersionControlSystem): + """Implementation of the VersionControlSystem interface for Git.""" + + def __init__(self, options): + super(GitVCS, self).__init__(options) + # Map of filename -> hash of base file. + self.base_hashes = {} + + def GenerateDiff(self, extra_args): + # This is more complicated than svn's GenerateDiff because we must convert + # the diff output to include an svn-style "Index:" line as well as record + # the hashes of the base files, so we can upload them along with our diff. + if self.options.revision: + extra_args = [self.options.revision] + extra_args + gitdiff = RunShell(["git", "diff", "--full-index"] + extra_args) + svndiff = [] + filecount = 0 + filename = None + for line in gitdiff.splitlines(): + match = re.match(r"diff --git a/(.*) b/.*$", line) + if match: + filecount += 1 + filename = match.group(1) + svndiff.append("Index: %s\n" % filename) + else: + # The "index" line in a git diff looks like this (long hashes elided): + # index 82c0d44..b2cee3f 100755 + # We want to save the left hash, as that identifies the base file. + match = re.match(r"index (\w+)\.\.", line) + if match: + self.base_hashes[filename] = match.group(1) + svndiff.append(line + "\n") + if not filecount: + ErrorExit("No valid patches found in output from git diff") + return "".join(svndiff) + + def GetUnknownFiles(self): + status = RunShell(["git", "ls-files", "--exclude-standard", "--others"], + silent_ok=True) + return status.splitlines() + + def GetBaseFile(self, filename): + hash = self.base_hashes[filename] + base_content = None + new_content = None + is_binary = False + if hash == "0" * 40: # All-zero hash indicates no base file. + status = "A" + base_content = "" + else: + status = "M" + base_content, returncode = RunShellWithReturnCode(["git", "show", hash]) + if returncode: + ErrorExit("Got error status from 'git show %s'" % hash) + return (base_content, new_content, is_binary, status) + + +class MercurialVCS(VersionControlSystem): + """Implementation of the VersionControlSystem interface for Mercurial.""" + + def __init__(self, options, repo_dir): + super(MercurialVCS, self).__init__(options) + # Absolute path to repository (we can be in a subdir) + self.repo_dir = os.path.normpath(repo_dir) + # Compute the subdir + cwd = os.path.normpath(os.getcwd()) + assert cwd.startswith(self.repo_dir) + self.subdir = cwd[len(self.repo_dir):].lstrip(r"\/") + if self.options.revision: + self.base_rev = self.options.revision + else: + self.base_rev = RunShell(["hg", "parent", "-q"]).split(':')[1].strip() + + def _GetRelPath(self, filename): + """Get relative path of a file according to the current directory, + given its logical path in the repo.""" + assert filename.startswith(self.subdir), filename + return filename[len(self.subdir):].lstrip(r"\/") + + def GenerateDiff(self, extra_args): + # If no file specified, restrict to the current subdir + extra_args = extra_args or ["."] + cmd = ["hg", "diff", "--git", "-r", self.base_rev] + extra_args + data = RunShell(cmd, silent_ok=True) + svndiff = [] + filecount = 0 + for line in data.splitlines(): + m = re.match("diff --git a/(\S+) b/(\S+)", line) + if m: + # Modify line to make it look like as it comes from svn diff. + # With this modification no changes on the server side are required + # to make upload.py work with Mercurial repos. + # NOTE: for proper handling of moved/copied files, we have to use + # the second filename. + filename = m.group(2) + svndiff.append("Index: %s" % filename) + svndiff.append("=" * 67) + filecount += 1 + logging.info(line) + else: + svndiff.append(line) + if not filecount: + ErrorExit("No valid patches found in output from hg diff") + return "\n".join(svndiff) + "\n" + + def GetUnknownFiles(self): + """Return a list of files unknown to the VCS.""" + args = [] + status = RunShell(["hg", "status", "--rev", self.base_rev, "-u", "."], + silent_ok=True) + unknown_files = [] + for line in status.splitlines(): + st, fn = line.split(" ", 1) + if st == "?": + unknown_files.append(fn) + return unknown_files + + def GetBaseFile(self, filename): + # "hg status" and "hg cat" both take a path relative to the current subdir + # rather than to the repo root, but "hg diff" has given us the full path + # to the repo root. + base_content = "" + new_content = None + is_binary = False + oldrelpath = relpath = self._GetRelPath(filename) + # "hg status -C" returns two lines for moved/copied files, one otherwise + out = RunShell(["hg", "status", "-C", "--rev", self.base_rev, relpath]) + out = out.splitlines() + # HACK: strip error message about missing file/directory if it isn't in + # the working copy + if out[0].startswith('%s: ' % relpath): + out = out[1:] + if len(out) > 1: + # Moved/copied => considered as modified, use old filename to + # retrieve base contents + oldrelpath = out[1].strip() + status = "M" + else: + status, _ = out[0].split(' ', 1) + if status != "A": + base_content = RunShell(["hg", "cat", "-r", self.base_rev, oldrelpath], + silent_ok=True) + is_binary = "\0" in base_content # Mercurial's heuristic + if status != "R": + new_content = open(relpath, "rb").read() + is_binary = is_binary or "\0" in new_content + if is_binary and base_content: + # Fetch again without converting newlines + base_content = RunShell(["hg", "cat", "-r", self.base_rev, oldrelpath], + silent_ok=True, universal_newlines=False) + if not is_binary or not self.IsImage(relpath): + new_content = None + return base_content, new_content, is_binary, status + + +# NOTE: The SplitPatch function is duplicated in engine.py, keep them in sync. +def SplitPatch(data): + """Splits a patch into separate pieces for each file. + + Args: + data: A string containing the output of svn diff. + + Returns: + A list of 2-tuple (filename, text) where text is the svn diff output + pertaining to filename. + """ + patches = [] + filename = None + diff = [] + for line in data.splitlines(True): + new_filename = None + if line.startswith('Index:'): + unused, new_filename = line.split(':', 1) + new_filename = new_filename.strip() + elif line.startswith('Property changes on:'): + unused, temp_filename = line.split(':', 1) + # When a file is modified, paths use '/' between directories, however + # when a property is modified '\' is used on Windows. Make them the same + # otherwise the file shows up twice. + temp_filename = temp_filename.strip().replace('\\', '/') + if temp_filename != filename: + # File has property changes but no modifications, create a new diff. + new_filename = temp_filename + if new_filename: + if filename and diff: + patches.append((filename, ''.join(diff))) + filename = new_filename + diff = [line] + continue + if diff is not None: + diff.append(line) + if filename and diff: + patches.append((filename, ''.join(diff))) + return patches + + +def UploadSeparatePatches(issue, rpc_server, patchset, data, options): + """Uploads a separate patch for each file in the diff output. + + Returns a list of [patch_key, filename] for each file. + """ + patches = SplitPatch(data) + rv = [] + for patch in patches: + if len(patch[1]) > MAX_UPLOAD_SIZE: + print ("Not uploading the patch for " + patch[0] + + " because the file is too large.") + continue + form_fields = [("filename", patch[0])] + if not options.download_base: + form_fields.append(("content_upload", "1")) + files = [("data", "data.diff", patch[1])] + ctype, body = EncodeMultipartFormData(form_fields, files) + url = "/%d/upload_patch/%d" % (int(issue), int(patchset)) + print "Uploading patch for " + patch[0] + response_body = rpc_server.Send(url, body, content_type=ctype) + lines = response_body.splitlines() + if not lines or lines[0] != "OK": + StatusUpdate(" --> %s" % response_body) + sys.exit(1) + rv.append([lines[1], patch[0]]) + return rv + + +def GuessVCS(options): + """Helper to guess the version control system. + + This examines the current directory, guesses which VersionControlSystem + we're using, and returns an instance of the appropriate class. Exit with an + error if we can't figure it out. + + Returns: + A VersionControlSystem instance. Exits if the VCS can't be guessed. + """ + # Mercurial has a command to get the base directory of a repository + # Try running it, but don't die if we don't have hg installed. + # NOTE: we try Mercurial first as it can sit on top of an SVN working copy. + try: + out, returncode = RunShellWithReturnCode(["hg", "root"]) + if returncode == 0: + return MercurialVCS(options, out.strip()) + except OSError, (errno, message): + if errno != 2: # ENOENT -- they don't have hg installed. + raise + + # Subversion has a .svn in all working directories. + if os.path.isdir('.svn'): + logging.info("Guessed VCS = Subversion") + return SubversionVCS(options) + + # Git has a command to test if you're in a git tree. + # Try running it, but don't die if we don't have git installed. + try: + out, returncode = RunShellWithReturnCode(["git", "rev-parse", + "--is-inside-work-tree"]) + if returncode == 0: + return GitVCS(options) + except OSError, (errno, message): + if errno != 2: # ENOENT -- they don't have git installed. + raise + + ErrorExit(("Could not guess version control system. " + "Are you in a working copy directory?")) + + +def RealMain(argv, data=None): + """The real main function. + + Args: + argv: Command line arguments. + data: Diff contents. If None (default) the diff is generated by + the VersionControlSystem implementation returned by GuessVCS(). + + Returns: + A 2-tuple (issue id, patchset id). + The patchset id is None if the base files are not uploaded by this + script (applies only to SVN checkouts). + """ + logging.basicConfig(format=("%(asctime).19s %(levelname)s %(filename)s:" + "%(lineno)s %(message)s ")) + os.environ['LC_ALL'] = 'C' + options, args = parser.parse_args(argv[1:]) + global verbosity + verbosity = options.verbose + if verbosity >= 3: + logging.getLogger().setLevel(logging.DEBUG) + elif verbosity >= 2: + logging.getLogger().setLevel(logging.INFO) + vcs = GuessVCS(options) + if isinstance(vcs, SubversionVCS): + # base field is only allowed for Subversion. + # Note: Fetching base files may become deprecated in future releases. + base = vcs.GuessBase(options.download_base) + else: + base = None + if not base and options.download_base: + options.download_base = True + logging.info("Enabled upload of base file") + if not options.assume_yes: + vcs.CheckForUnknownFiles() + if data is None: + data = vcs.GenerateDiff(args) + files = vcs.GetBaseFiles(data) + if verbosity >= 1: + print "Upload server:", options.server, "(change with -s/--server)" + if options.issue: + prompt = "Message describing this patch set: " + else: + prompt = "New issue subject: " + message = options.message or raw_input(prompt).strip() + if not message: + ErrorExit("A non-empty message is required") + rpc_server = GetRpcServer(options) + form_fields = [("subject", message)] + if base: + form_fields.append(("base", base)) + if options.issue: + form_fields.append(("issue", str(options.issue))) + if options.email: + form_fields.append(("user", options.email)) + if options.reviewers: + for reviewer in options.reviewers.split(','): + if "@" in reviewer and not reviewer.split("@")[1].count(".") == 1: + ErrorExit("Invalid email address: %s" % reviewer) + form_fields.append(("reviewers", options.reviewers)) + if options.cc: + for cc in options.cc.split(','): + if "@" in cc and not cc.split("@")[1].count(".") == 1: + ErrorExit("Invalid email address: %s" % cc) + form_fields.append(("cc", options.cc)) + description = options.description + if options.description_file: + if options.description: + ErrorExit("Can't specify description and description_file") + file = open(options.description_file, 'r') + description = file.read() + file.close() + if description: + form_fields.append(("description", description)) + # Send a hash of all the base file so the server can determine if a copy + # already exists in an earlier patchset. + base_hashes = "" + for file, info in files.iteritems(): + if not info[0] is None: + checksum = md5.new(info[0]).hexdigest() + if base_hashes: + base_hashes += "|" + base_hashes += checksum + ":" + file + form_fields.append(("base_hashes", base_hashes)) + # If we're uploading base files, don't send the email before the uploads, so + # that it contains the file status. + if options.send_mail and options.download_base: + form_fields.append(("send_mail", "1")) + if not options.download_base: + form_fields.append(("content_upload", "1")) + if len(data) > MAX_UPLOAD_SIZE: + print "Patch is large, so uploading file patches separately." + uploaded_diff_file = [] + form_fields.append(("separate_patches", "1")) + else: + uploaded_diff_file = [("data", "data.diff", data)] + ctype, body = EncodeMultipartFormData(form_fields, uploaded_diff_file) + response_body = rpc_server.Send("/upload", body, content_type=ctype) + patchset = None + if not options.download_base or not uploaded_diff_file: + lines = response_body.splitlines() + if len(lines) >= 2: + msg = lines[0] + patchset = lines[1].strip() + patches = [x.split(" ", 1) for x in lines[2:]] + else: + msg = response_body + else: + msg = response_body + StatusUpdate(msg) + if not response_body.startswith("Issue created.") and \ + not response_body.startswith("Issue updated."): + sys.exit(0) + issue = msg[msg.rfind("/")+1:] + + if not uploaded_diff_file: + result = UploadSeparatePatches(issue, rpc_server, patchset, data, options) + if not options.download_base: + patches = result + + if not options.download_base: + vcs.UploadBaseFiles(issue, rpc_server, patches, patchset, options, files) + if options.send_mail: + rpc_server.Send("/" + issue + "/mail", payload="") + return issue, patchset + + +def main(): + try: + RealMain(sys.argv) + except KeyboardInterrupt: + print + StatusUpdate("Interrupted.") + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py new file mode 100755 index 000000000..be19ae809 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python +# +# Copyright 2009, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""upload_gtest.py v0.1.0 -- uploads a Google Test patch for review. + +This simple wrapper passes all command line flags and +--cc=googletestframework@googlegroups.com to upload.py. + +USAGE: upload_gtest.py [options for upload.py] +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import sys + +CC_FLAG = '--cc=' +GTEST_GROUP = 'googletestframework@googlegroups.com' + + +def main(): + # Finds the path to upload.py, assuming it is in the same directory + # as this file. + my_dir = os.path.dirname(os.path.abspath(__file__)) + upload_py_path = os.path.join(my_dir, 'upload.py') + + # Adds Google Test discussion group to the cc line if it's not there + # already. + upload_py_argv = [upload_py_path] + found_cc_flag = False + for arg in sys.argv[1:]: + if arg.startswith(CC_FLAG): + found_cc_flag = True + cc_line = arg[len(CC_FLAG):] + cc_list = [addr for addr in cc_line.split(',') if addr] + if GTEST_GROUP not in cc_list: + cc_list.append(GTEST_GROUP) + upload_py_argv.append(CC_FLAG + ','.join(cc_list)) + else: + upload_py_argv.append(arg) + + if not found_cc_flag: + upload_py_argv.append(CC_FLAG + GTEST_GROUP) + + # Invokes upload.py with the modified command line flags. + os.execv(upload_py_path, upload_py_argv) + + +if __name__ == '__main__': + main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc new file mode 100644 index 000000000..fe34765fb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc @@ -0,0 +1,47 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: mheule@google.com (Markus Heule) +// +// Google C++ Testing Framework (Google Test) +// +// Sometimes it's desirable to build Google Test by compiling a single file. +// This file serves this purpose. + +// This line ensures that gtest.h can be compiled on its own, even +// when it's fused. +#include + +// The following lines pull in the real gtest *.cc files. +#include "src/gtest.cc" +#include "src/gtest-death-test.cc" +#include "src/gtest-filepath.cc" +#include "src/gtest-port.cc" +#include "src/gtest-test-part.cc" +#include "src/gtest-typed-test.cc" diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc new file mode 100644 index 000000000..3b73b01d2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc @@ -0,0 +1,1172 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan), vladl@google.com (Vlad Losev) +// +// This file implements death tests. + +#include +#include + +#if GTEST_HAS_DEATH_TEST + +#if GTEST_OS_MAC +#include +#endif // GTEST_OS_MAC + +#include +#include +#include +#include + +#if GTEST_OS_WINDOWS +#include +#else +#include +#include +#endif // GTEST_OS_WINDOWS + +#endif // GTEST_HAS_DEATH_TEST + +#include +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +namespace testing { + +// Constants. + +// The default death test style. +static const char kDefaultDeathTestStyle[] = "fast"; + +GTEST_DEFINE_string_( + death_test_style, + internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle), + "Indicates how to run a death test in a forked child process: " + "\"threadsafe\" (child process re-executes the test binary " + "from the beginning, running only the specific death test) or " + "\"fast\" (child process runs the death test immediately " + "after forking)."); + +GTEST_DEFINE_bool_( + death_test_use_fork, + internal::BoolFromGTestEnv("death_test_use_fork", false), + "Instructs to use fork()/_exit() instead of clone() in death tests. " + "Ignored and always uses fork() on POSIX systems where clone() is not " + "implemented. Useful when running under valgrind or similar tools if " + "those do not support clone(). Valgrind 3.3.1 will just fail if " + "it sees an unsupported combination of clone() flags. " + "It is not recommended to use this flag w/o valgrind though it will " + "work in 99% of the cases. Once valgrind is fixed, this flag will " + "most likely be removed."); + +namespace internal { +GTEST_DEFINE_string_( + internal_run_death_test, "", + "Indicates the file, line number, temporal index of " + "the single death test to run, and a file descriptor to " + "which a success code may be sent, all separated by " + "colons. This flag is specified if and only if the current " + "process is a sub-process launched for running a thread-safe " + "death test. FOR INTERNAL USE ONLY."); +} // namespace internal + +#if GTEST_HAS_DEATH_TEST + +// ExitedWithCode constructor. +ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) { +} + +// ExitedWithCode function-call operator. +bool ExitedWithCode::operator()(int exit_status) const { +#if GTEST_OS_WINDOWS + return exit_status == exit_code_; +#else + return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_; +#endif // GTEST_OS_WINDOWS +} + +#if !GTEST_OS_WINDOWS +// KilledBySignal constructor. +KilledBySignal::KilledBySignal(int signum) : signum_(signum) { +} + +// KilledBySignal function-call operator. +bool KilledBySignal::operator()(int exit_status) const { + return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_; +} +#endif // !GTEST_OS_WINDOWS + +namespace internal { + +// Utilities needed for death tests. + +// Generates a textual description of a given exit code, in the format +// specified by wait(2). +static String ExitSummary(int exit_code) { + Message m; +#if GTEST_OS_WINDOWS + m << "Exited with exit status " << exit_code; +#else + if (WIFEXITED(exit_code)) { + m << "Exited with exit status " << WEXITSTATUS(exit_code); + } else if (WIFSIGNALED(exit_code)) { + m << "Terminated by signal " << WTERMSIG(exit_code); + } +#ifdef WCOREDUMP + if (WCOREDUMP(exit_code)) { + m << " (core dumped)"; + } +#endif +#endif // GTEST_OS_WINDOWS + return m.GetString(); +} + +// Returns true if exit_status describes a process that was terminated +// by a signal, or exited normally with a nonzero exit code. +bool ExitedUnsuccessfully(int exit_status) { + return !ExitedWithCode(0)(exit_status); +} + +#if !GTEST_OS_WINDOWS +// Generates a textual failure message when a death test finds more than +// one thread running, or cannot determine the number of threads, prior +// to executing the given statement. It is the responsibility of the +// caller not to pass a thread_count of 1. +static String DeathTestThreadWarning(size_t thread_count) { + Message msg; + msg << "Death tests use fork(), which is unsafe particularly" + << " in a threaded context. For this test, " << GTEST_NAME_ << " "; + if (thread_count == 0) + msg << "couldn't detect the number of threads."; + else + msg << "detected " << thread_count << " threads."; + return msg.GetString(); +} +#endif // !GTEST_OS_WINDOWS + +// Flag characters for reporting a death test that did not die. +static const char kDeathTestLived = 'L'; +static const char kDeathTestReturned = 'R'; +static const char kDeathTestInternalError = 'I'; + +// An enumeration describing all of the possible ways that a death test +// can conclude. DIED means that the process died while executing the +// test code; LIVED means that process lived beyond the end of the test +// code; and RETURNED means that the test statement attempted a "return," +// which is not allowed. IN_PROGRESS means the test has not yet +// concluded. +enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED }; + +// Routine for aborting the program which is safe to call from an +// exec-style death test child process, in which case the error +// message is propagated back to the parent process. Otherwise, the +// message is simply printed to stderr. In either case, the program +// then exits with status 1. +void DeathTestAbort(const String& message) { + // On a POSIX system, this function may be called from a threadsafe-style + // death test child process, which operates on a very small stack. Use + // the heap for any additional non-minuscule memory requirements. + const InternalRunDeathTestFlag* const flag = + GetUnitTestImpl()->internal_run_death_test_flag(); + if (flag != NULL) { + FILE* parent = posix::FDOpen(flag->write_fd(), "w"); + fputc(kDeathTestInternalError, parent); + fprintf(parent, "%s", message.c_str()); + fflush(parent); + _exit(1); + } else { + fprintf(stderr, "%s", message.c_str()); + fflush(stderr); + abort(); + } +} + +// A replacement for CHECK that calls DeathTestAbort if the assertion +// fails. +#define GTEST_DEATH_TEST_CHECK_(expression) \ + do { \ + if (!::testing::internal::IsTrue(expression)) { \ + DeathTestAbort(::testing::internal::String::Format( \ + "CHECK failed: File %s, line %d: %s", \ + __FILE__, __LINE__, #expression)); \ + } \ + } while (::testing::internal::AlwaysFalse()) + +// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for +// evaluating any system call that fulfills two conditions: it must return +// -1 on failure, and set errno to EINTR when it is interrupted and +// should be tried again. The macro expands to a loop that repeatedly +// evaluates the expression as long as it evaluates to -1 and sets +// errno to EINTR. If the expression evaluates to -1 but errno is +// something other than EINTR, DeathTestAbort is called. +#define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \ + do { \ + int gtest_retval; \ + do { \ + gtest_retval = (expression); \ + } while (gtest_retval == -1 && errno == EINTR); \ + if (gtest_retval == -1) { \ + DeathTestAbort(::testing::internal::String::Format( \ + "CHECK failed: File %s, line %d: %s != -1", \ + __FILE__, __LINE__, #expression)); \ + } \ + } while (::testing::internal::AlwaysFalse()) + +// Returns the message describing the last system error in errno. +String GetLastErrnoDescription() { + return String(errno == 0 ? "" : posix::StrError(errno)); +} + +// This is called from a death test parent process to read a failure +// message from the death test child process and log it with the FATAL +// severity. On Windows, the message is read from a pipe handle. On other +// platforms, it is read from a file descriptor. +static void FailFromInternalError(int fd) { + Message error; + char buffer[256]; + int num_read; + + do { + while ((num_read = posix::Read(fd, buffer, 255)) > 0) { + buffer[num_read] = '\0'; + error << buffer; + } + } while (num_read == -1 && errno == EINTR); + + if (num_read == 0) { + GTEST_LOG_(FATAL) << error.GetString(); + } else { + const int last_error = errno; + GTEST_LOG_(FATAL) << "Error while reading death test internal: " + << GetLastErrnoDescription() << " [" << last_error << "]"; + } +} + +// Death test constructor. Increments the running death test count +// for the current test. +DeathTest::DeathTest() { + TestInfo* const info = GetUnitTestImpl()->current_test_info(); + if (info == NULL) { + DeathTestAbort("Cannot run a death test outside of a TEST or " + "TEST_F construct"); + } +} + +// Creates and returns a death test by dispatching to the current +// death test factory. +bool DeathTest::Create(const char* statement, const RE* regex, + const char* file, int line, DeathTest** test) { + return GetUnitTestImpl()->death_test_factory()->Create( + statement, regex, file, line, test); +} + +const char* DeathTest::LastMessage() { + return last_death_test_message_.c_str(); +} + +void DeathTest::set_last_death_test_message(const String& message) { + last_death_test_message_ = message; +} + +String DeathTest::last_death_test_message_; + +// Provides cross platform implementation for some death functionality. +class DeathTestImpl : public DeathTest { + protected: + DeathTestImpl(const char* a_statement, const RE* a_regex) + : statement_(a_statement), + regex_(a_regex), + spawned_(false), + status_(-1), + outcome_(IN_PROGRESS), + read_fd_(-1), + write_fd_(-1) {} + + // read_fd_ is expected to be closed and cleared by a derived class. + ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); } + + void Abort(AbortReason reason); + virtual bool Passed(bool status_ok); + + const char* statement() const { return statement_; } + const RE* regex() const { return regex_; } + bool spawned() const { return spawned_; } + void set_spawned(bool is_spawned) { spawned_ = is_spawned; } + int status() const { return status_; } + void set_status(int a_status) { status_ = a_status; } + DeathTestOutcome outcome() const { return outcome_; } + void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; } + int read_fd() const { return read_fd_; } + void set_read_fd(int fd) { read_fd_ = fd; } + int write_fd() const { return write_fd_; } + void set_write_fd(int fd) { write_fd_ = fd; } + + // Called in the parent process only. Reads the result code of the death + // test child process via a pipe, interprets it to set the outcome_ + // member, and closes read_fd_. Outputs diagnostics and terminates in + // case of unexpected codes. + void ReadAndInterpretStatusByte(); + + private: + // The textual content of the code this object is testing. This class + // doesn't own this string and should not attempt to delete it. + const char* const statement_; + // The regular expression which test output must match. DeathTestImpl + // doesn't own this object and should not attempt to delete it. + const RE* const regex_; + // True if the death test child process has been successfully spawned. + bool spawned_; + // The exit status of the child process. + int status_; + // How the death test concluded. + DeathTestOutcome outcome_; + // Descriptor to the read end of the pipe to the child process. It is + // always -1 in the child process. The child keeps its write end of the + // pipe in write_fd_. + int read_fd_; + // Descriptor to the child's write end of the pipe to the parent process. + // It is always -1 in the parent process. The parent keeps its end of the + // pipe in read_fd_. + int write_fd_; +}; + +// Called in the parent process only. Reads the result code of the death +// test child process via a pipe, interprets it to set the outcome_ +// member, and closes read_fd_. Outputs diagnostics and terminates in +// case of unexpected codes. +void DeathTestImpl::ReadAndInterpretStatusByte() { + char flag; + int bytes_read; + + // The read() here blocks until data is available (signifying the + // failure of the death test) or until the pipe is closed (signifying + // its success), so it's okay to call this in the parent before + // the child process has exited. + do { + bytes_read = posix::Read(read_fd(), &flag, 1); + } while (bytes_read == -1 && errno == EINTR); + + if (bytes_read == 0) { + set_outcome(DIED); + } else if (bytes_read == 1) { + switch (flag) { + case kDeathTestReturned: + set_outcome(RETURNED); + break; + case kDeathTestLived: + set_outcome(LIVED); + break; + case kDeathTestInternalError: + FailFromInternalError(read_fd()); // Does not return. + break; + default: + GTEST_LOG_(FATAL) << "Death test child process reported " + << "unexpected status byte (" + << static_cast(flag) << ")"; + } + } else { + GTEST_LOG_(FATAL) << "Read from death test child process failed: " + << GetLastErrnoDescription(); + } + GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd())); + set_read_fd(-1); +} + +// Signals that the death test code which should have exited, didn't. +// Should be called only in a death test child process. +// Writes a status byte to the child's status file descriptor, then +// calls _exit(1). +void DeathTestImpl::Abort(AbortReason reason) { + // The parent process considers the death test to be a failure if + // it finds any data in our pipe. So, here we write a single flag byte + // to the pipe, then exit. + const char status_ch = + reason == TEST_DID_NOT_DIE ? kDeathTestLived : kDeathTestReturned; + GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1)); + GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(write_fd())); + _exit(1); // Exits w/o any normal exit hooks (we were supposed to crash) +} + +// Assesses the success or failure of a death test, using both private +// members which have previously been set, and one argument: +// +// Private data members: +// outcome: An enumeration describing how the death test +// concluded: DIED, LIVED, or RETURNED. The death test fails +// in the latter two cases. +// status: The exit status of the child process. On *nix, it is in the +// in the format specified by wait(2). On Windows, this is the +// value supplied to the ExitProcess() API or a numeric code +// of the exception that terminated the program. +// regex: A regular expression object to be applied to +// the test's captured standard error output; the death test +// fails if it does not match. +// +// Argument: +// status_ok: true if exit_status is acceptable in the context of +// this particular death test, which fails if it is false +// +// Returns true iff all of the above conditions are met. Otherwise, the +// first failing condition, in the order given above, is the one that is +// reported. Also sets the last death test message string. +bool DeathTestImpl::Passed(bool status_ok) { + if (!spawned()) + return false; + + const String error_message = GetCapturedStderr(); + + bool success = false; + Message buffer; + + buffer << "Death test: " << statement() << "\n"; + switch (outcome()) { + case LIVED: + buffer << " Result: failed to die.\n" + << " Error msg: " << error_message; + break; + case RETURNED: + buffer << " Result: illegal return in test statement.\n" + << " Error msg: " << error_message; + break; + case DIED: + if (status_ok) { + const bool matched = RE::PartialMatch(error_message.c_str(), *regex()); + if (matched) { + success = true; + } else { + buffer << " Result: died but not with expected error.\n" + << " Expected: " << regex()->pattern() << "\n" + << "Actual msg: " << error_message; + } + } else { + buffer << " Result: died but not with expected exit code:\n" + << " " << ExitSummary(status()) << "\n"; + } + break; + case IN_PROGRESS: + default: + GTEST_LOG_(FATAL) + << "DeathTest::Passed somehow called before conclusion of test"; + } + + DeathTest::set_last_death_test_message(buffer.GetString()); + return success; +} + +#if GTEST_OS_WINDOWS +// WindowsDeathTest implements death tests on Windows. Due to the +// specifics of starting new processes on Windows, death tests there are +// always threadsafe, and Google Test considers the +// --gtest_death_test_style=fast setting to be equivalent to +// --gtest_death_test_style=threadsafe there. +// +// A few implementation notes: Like the Linux version, the Windows +// implementation uses pipes for child-to-parent communication. But due to +// the specifics of pipes on Windows, some extra steps are required: +// +// 1. The parent creates a communication pipe and stores handles to both +// ends of it. +// 2. The parent starts the child and provides it with the information +// necessary to acquire the handle to the write end of the pipe. +// 3. The child acquires the write end of the pipe and signals the parent +// using a Windows event. +// 4. Now the parent can release the write end of the pipe on its side. If +// this is done before step 3, the object's reference count goes down to +// 0 and it is destroyed, preventing the child from acquiring it. The +// parent now has to release it, or read operations on the read end of +// the pipe will not return when the child terminates. +// 5. The parent reads child's output through the pipe (outcome code and +// any possible error messages) from the pipe, and its stderr and then +// determines whether to fail the test. +// +// Note: to distinguish Win32 API calls from the local method and function +// calls, the former are explicitly resolved in the global namespace. +// +class WindowsDeathTest : public DeathTestImpl { + public: + WindowsDeathTest(const char* statement, + const RE* regex, + const char* file, + int line) + : DeathTestImpl(statement, regex), file_(file), line_(line) {} + + // All of these virtual functions are inherited from DeathTest. + virtual int Wait(); + virtual TestRole AssumeRole(); + + private: + // The name of the file in which the death test is located. + const char* const file_; + // The line number on which the death test is located. + const int line_; + // Handle to the write end of the pipe to the child process. + AutoHandle write_handle_; + // Child process handle. + AutoHandle child_handle_; + // Event the child process uses to signal the parent that it has + // acquired the handle to the write end of the pipe. After seeing this + // event the parent can release its own handles to make sure its + // ReadFile() calls return when the child terminates. + AutoHandle event_handle_; +}; + +// Waits for the child in a death test to exit, returning its exit +// status, or 0 if no child process exists. As a side effect, sets the +// outcome data member. +int WindowsDeathTest::Wait() { + if (!spawned()) + return 0; + + // Wait until the child either signals that it has acquired the write end + // of the pipe or it dies. + const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() }; + switch (::WaitForMultipleObjects(2, + wait_handles, + FALSE, // Waits for any of the handles. + INFINITE)) { + case WAIT_OBJECT_0: + case WAIT_OBJECT_0 + 1: + break; + default: + GTEST_DEATH_TEST_CHECK_(false); // Should not get here. + } + + // The child has acquired the write end of the pipe or exited. + // We release the handle on our side and continue. + write_handle_.Reset(); + event_handle_.Reset(); + + ReadAndInterpretStatusByte(); + + // Waits for the child process to exit if it haven't already. This + // returns immediately if the child has already exited, regardless of + // whether previous calls to WaitForMultipleObjects synchronized on this + // handle or not. + GTEST_DEATH_TEST_CHECK_( + WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(), + INFINITE)); + DWORD status; + GTEST_DEATH_TEST_CHECK_(::GetExitCodeProcess(child_handle_.Get(), &status) + != FALSE); + child_handle_.Reset(); + set_status(static_cast(status)); + return this->status(); +} + +// The AssumeRole process for a Windows death test. It creates a child +// process with the same executable as the current process to run the +// death test. The child process is given the --gtest_filter and +// --gtest_internal_run_death_test flags such that it knows to run the +// current death test only. +DeathTest::TestRole WindowsDeathTest::AssumeRole() { + const UnitTestImpl* const impl = GetUnitTestImpl(); + const InternalRunDeathTestFlag* const flag = + impl->internal_run_death_test_flag(); + const TestInfo* const info = impl->current_test_info(); + const int death_test_index = info->result()->death_test_count(); + + if (flag != NULL) { + // ParseInternalRunDeathTestFlag() has performed all the necessary + // processing. + set_write_fd(flag->write_fd()); + return EXECUTE_TEST; + } + + // WindowsDeathTest uses an anonymous pipe to communicate results of + // a death test. + SECURITY_ATTRIBUTES handles_are_inheritable = { + sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; + HANDLE read_handle, write_handle; + GTEST_DEATH_TEST_CHECK_( + ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable, + 0) // Default buffer size. + != FALSE); + set_read_fd(::_open_osfhandle(reinterpret_cast(read_handle), + O_RDONLY)); + write_handle_.Reset(write_handle); + event_handle_.Reset(::CreateEvent( + &handles_are_inheritable, + TRUE, // The event will automatically reset to non-signaled state. + FALSE, // The initial state is non-signalled. + NULL)); // The even is unnamed. + GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL); + const String filter_flag = String::Format("--%s%s=%s.%s", + GTEST_FLAG_PREFIX_, kFilterFlag, + info->test_case_name(), + info->name()); + const String internal_flag = String::Format( + "--%s%s=%s|%d|%d|%u|%Iu|%Iu", + GTEST_FLAG_PREFIX_, + kInternalRunDeathTestFlag, + file_, line_, + death_test_index, + static_cast(::GetCurrentProcessId()), + // size_t has the same with as pointers on both 32-bit and 64-bit + // Windows platforms. + // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx. + reinterpret_cast(write_handle), + reinterpret_cast(event_handle_.Get())); + + char executable_path[_MAX_PATH + 1]; // NOLINT + GTEST_DEATH_TEST_CHECK_( + _MAX_PATH + 1 != ::GetModuleFileNameA(NULL, + executable_path, + _MAX_PATH)); + + String command_line = String::Format("%s %s \"%s\"", + ::GetCommandLineA(), + filter_flag.c_str(), + internal_flag.c_str()); + + DeathTest::set_last_death_test_message(""); + + CaptureStderr(); + // Flush the log buffers since the log streams are shared with the child. + FlushInfoLog(); + + // The child process will share the standard handles with the parent. + STARTUPINFOA startup_info; + memset(&startup_info, 0, sizeof(STARTUPINFO)); + startup_info.dwFlags = STARTF_USESTDHANDLES; + startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE); + startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE); + startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE); + + PROCESS_INFORMATION process_info; + GTEST_DEATH_TEST_CHECK_(::CreateProcessA( + executable_path, + const_cast(command_line.c_str()), + NULL, // Retuned process handle is not inheritable. + NULL, // Retuned thread handle is not inheritable. + TRUE, // Child inherits all inheritable handles (for write_handle_). + 0x0, // Default creation flags. + NULL, // Inherit the parent's environment. + UnitTest::GetInstance()->original_working_dir(), + &startup_info, + &process_info) != FALSE); + child_handle_.Reset(process_info.hProcess); + ::CloseHandle(process_info.hThread); + set_spawned(true); + return OVERSEE_TEST; +} +#else // We are not on Windows. + +// ForkingDeathTest provides implementations for most of the abstract +// methods of the DeathTest interface. Only the AssumeRole method is +// left undefined. +class ForkingDeathTest : public DeathTestImpl { + public: + ForkingDeathTest(const char* statement, const RE* regex); + + // All of these virtual functions are inherited from DeathTest. + virtual int Wait(); + + protected: + void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; } + + private: + // PID of child process during death test; 0 in the child process itself. + pid_t child_pid_; +}; + +// Constructs a ForkingDeathTest. +ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex) + : DeathTestImpl(a_statement, a_regex), + child_pid_(-1) {} + +// Waits for the child in a death test to exit, returning its exit +// status, or 0 if no child process exists. As a side effect, sets the +// outcome data member. +int ForkingDeathTest::Wait() { + if (!spawned()) + return 0; + + ReadAndInterpretStatusByte(); + + int status_value; + GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0)); + set_status(status_value); + return status_value; +} + +// A concrete death test class that forks, then immediately runs the test +// in the child process. +class NoExecDeathTest : public ForkingDeathTest { + public: + NoExecDeathTest(const char* a_statement, const RE* a_regex) : + ForkingDeathTest(a_statement, a_regex) { } + virtual TestRole AssumeRole(); +}; + +// The AssumeRole process for a fork-and-run death test. It implements a +// straightforward fork, with a simple pipe to transmit the status byte. +DeathTest::TestRole NoExecDeathTest::AssumeRole() { + const size_t thread_count = GetThreadCount(); + if (thread_count != 1) { + GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count); + } + + int pipe_fd[2]; + GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); + + DeathTest::set_last_death_test_message(""); + CaptureStderr(); + // When we fork the process below, the log file buffers are copied, but the + // file descriptors are shared. We flush all log files here so that closing + // the file descriptors in the child process doesn't throw off the + // synchronization between descriptors and buffers in the parent process. + // This is as close to the fork as possible to avoid a race condition in case + // there are multiple threads running before the death test, and another + // thread writes to the log file. + FlushInfoLog(); + + const pid_t child_pid = fork(); + GTEST_DEATH_TEST_CHECK_(child_pid != -1); + set_child_pid(child_pid); + if (child_pid == 0) { + GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0])); + set_write_fd(pipe_fd[1]); + // Redirects all logging to stderr in the child process to prevent + // concurrent writes to the log files. We capture stderr in the parent + // process and append the child process' output to a log. + LogToStderr(); + // Event forwarding to the listeners of event listener API mush be shut + // down in death test subprocesses. + GetUnitTestImpl()->listeners()->SuppressEventForwarding(); + return EXECUTE_TEST; + } else { + GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); + set_read_fd(pipe_fd[0]); + set_spawned(true); + return OVERSEE_TEST; + } +} + +// A concrete death test class that forks and re-executes the main +// program from the beginning, with command-line flags set that cause +// only this specific death test to be run. +class ExecDeathTest : public ForkingDeathTest { + public: + ExecDeathTest(const char* a_statement, const RE* a_regex, + const char* file, int line) : + ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { } + virtual TestRole AssumeRole(); + private: + // The name of the file in which the death test is located. + const char* const file_; + // The line number on which the death test is located. + const int line_; +}; + +// Utility class for accumulating command-line arguments. +class Arguments { + public: + Arguments() { + args_.push_back(NULL); + } + + ~Arguments() { + for (std::vector::iterator i = args_.begin(); i != args_.end(); + ++i) { + free(*i); + } + } + void AddArgument(const char* argument) { + args_.insert(args_.end() - 1, posix::StrDup(argument)); + } + + template + void AddArguments(const ::std::vector& arguments) { + for (typename ::std::vector::const_iterator i = arguments.begin(); + i != arguments.end(); + ++i) { + args_.insert(args_.end() - 1, posix::StrDup(i->c_str())); + } + } + char* const* Argv() { + return &args_[0]; + } + private: + std::vector args_; +}; + +// A struct that encompasses the arguments to the child process of a +// threadsafe-style death test process. +struct ExecDeathTestArgs { + char* const* argv; // Command-line arguments for the child's call to exec + int close_fd; // File descriptor to close; the read end of a pipe +}; + +#if GTEST_OS_MAC +inline char** GetEnviron() { + // When Google Test is built as a framework on MacOS X, the environ variable + // is unavailable. Apple's documentation (man environ) recommends using + // _NSGetEnviron() instead. + return *_NSGetEnviron(); +} +#else +// Some POSIX platforms expect you to declare environ. extern "C" makes +// it reside in the global namespace. +extern "C" char** environ; +inline char** GetEnviron() { return environ; } +#endif // GTEST_OS_MAC + +// The main function for a threadsafe-style death test child process. +// This function is called in a clone()-ed process and thus must avoid +// any potentially unsafe operations like malloc or libc functions. +static int ExecDeathTestChildMain(void* child_arg) { + ExecDeathTestArgs* const args = static_cast(child_arg); + GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd)); + + // We need to execute the test program in the same environment where + // it was originally invoked. Therefore we change to the original + // working directory first. + const char* const original_dir = + UnitTest::GetInstance()->original_working_dir(); + // We can safely call chdir() as it's a direct system call. + if (chdir(original_dir) != 0) { + DeathTestAbort(String::Format("chdir(\"%s\") failed: %s", + original_dir, + GetLastErrnoDescription().c_str())); + return EXIT_FAILURE; + } + + // We can safely call execve() as it's a direct system call. We + // cannot use execvp() as it's a libc function and thus potentially + // unsafe. Since execve() doesn't search the PATH, the user must + // invoke the test program via a valid path that contains at least + // one path separator. + execve(args->argv[0], args->argv, GetEnviron()); + DeathTestAbort(String::Format("execve(%s, ...) in %s failed: %s", + args->argv[0], + original_dir, + GetLastErrnoDescription().c_str())); + return EXIT_FAILURE; +} + +// Two utility routines that together determine the direction the stack +// grows. +// This could be accomplished more elegantly by a single recursive +// function, but we want to guard against the unlikely possibility of +// a smart compiler optimizing the recursion away. +bool StackLowerThanAddress(const void* ptr) { + int dummy; + return &dummy < ptr; +} + +bool StackGrowsDown() { + int dummy; + return StackLowerThanAddress(&dummy); +} + +// A threadsafe implementation of fork(2) for threadsafe-style death tests +// that uses clone(2). It dies with an error message if anything goes +// wrong. +static pid_t ExecDeathTestFork(char* const* argv, int close_fd) { + ExecDeathTestArgs args = { argv, close_fd }; + pid_t child_pid = -1; + +#if GTEST_HAS_CLONE + const bool use_fork = GTEST_FLAG(death_test_use_fork); + + if (!use_fork) { + static const bool stack_grows_down = StackGrowsDown(); + const size_t stack_size = getpagesize(); + // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. + void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE, + MAP_ANON | MAP_PRIVATE, -1, 0); + GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED); + void* const stack_top = + static_cast(stack) + (stack_grows_down ? stack_size : 0); + + child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); + + GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1); + } +#else + const bool use_fork = true; +#endif // GTEST_HAS_CLONE + + if (use_fork && (child_pid = fork()) == 0) { + ExecDeathTestChildMain(&args); + _exit(0); + } + + GTEST_DEATH_TEST_CHECK_(child_pid != -1); + return child_pid; +} + +// The AssumeRole process for a fork-and-exec death test. It re-executes the +// main program from the beginning, setting the --gtest_filter +// and --gtest_internal_run_death_test flags to cause only the current +// death test to be re-run. +DeathTest::TestRole ExecDeathTest::AssumeRole() { + const UnitTestImpl* const impl = GetUnitTestImpl(); + const InternalRunDeathTestFlag* const flag = + impl->internal_run_death_test_flag(); + const TestInfo* const info = impl->current_test_info(); + const int death_test_index = info->result()->death_test_count(); + + if (flag != NULL) { + set_write_fd(flag->write_fd()); + return EXECUTE_TEST; + } + + int pipe_fd[2]; + GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1); + // Clear the close-on-exec flag on the write end of the pipe, lest + // it be closed when the child process does an exec: + GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1); + + const String filter_flag = + String::Format("--%s%s=%s.%s", + GTEST_FLAG_PREFIX_, kFilterFlag, + info->test_case_name(), info->name()); + const String internal_flag = + String::Format("--%s%s=%s|%d|%d|%d", + GTEST_FLAG_PREFIX_, kInternalRunDeathTestFlag, + file_, line_, death_test_index, pipe_fd[1]); + Arguments args; + args.AddArguments(GetArgvs()); + args.AddArgument(filter_flag.c_str()); + args.AddArgument(internal_flag.c_str()); + + DeathTest::set_last_death_test_message(""); + + CaptureStderr(); + // See the comment in NoExecDeathTest::AssumeRole for why the next line + // is necessary. + FlushInfoLog(); + + const pid_t child_pid = ExecDeathTestFork(args.Argv(), pipe_fd[0]); + GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1])); + set_child_pid(child_pid); + set_read_fd(pipe_fd[0]); + set_spawned(true); + return OVERSEE_TEST; +} + +#endif // !GTEST_OS_WINDOWS + +// Creates a concrete DeathTest-derived class that depends on the +// --gtest_death_test_style flag, and sets the pointer pointed to +// by the "test" argument to its address. If the test should be +// skipped, sets that pointer to NULL. Returns true, unless the +// flag is set to an invalid value. +bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex, + const char* file, int line, + DeathTest** test) { + UnitTestImpl* const impl = GetUnitTestImpl(); + const InternalRunDeathTestFlag* const flag = + impl->internal_run_death_test_flag(); + const int death_test_index = impl->current_test_info() + ->increment_death_test_count(); + + if (flag != NULL) { + if (death_test_index > flag->index()) { + DeathTest::set_last_death_test_message(String::Format( + "Death test count (%d) somehow exceeded expected maximum (%d)", + death_test_index, flag->index())); + return false; + } + + if (!(flag->file() == file && flag->line() == line && + flag->index() == death_test_index)) { + *test = NULL; + return true; + } + } + +#if GTEST_OS_WINDOWS + if (GTEST_FLAG(death_test_style) == "threadsafe" || + GTEST_FLAG(death_test_style) == "fast") { + *test = new WindowsDeathTest(statement, regex, file, line); + } +#else + if (GTEST_FLAG(death_test_style) == "threadsafe") { + *test = new ExecDeathTest(statement, regex, file, line); + } else if (GTEST_FLAG(death_test_style) == "fast") { + *test = new NoExecDeathTest(statement, regex); + } +#endif // GTEST_OS_WINDOWS + else { // NOLINT - this is more readable than unbalanced brackets inside #if. + DeathTest::set_last_death_test_message(String::Format( + "Unknown death test style \"%s\" encountered", + GTEST_FLAG(death_test_style).c_str())); + return false; + } + + return true; +} + +// Splits a given string on a given delimiter, populating a given +// vector with the fields. GTEST_HAS_DEATH_TEST implies that we have +// ::std::string, so we can use it here. +static void SplitString(const ::std::string& str, char delimiter, + ::std::vector< ::std::string>* dest) { + ::std::vector< ::std::string> parsed; + ::std::string::size_type pos = 0; + while (::testing::internal::AlwaysTrue()) { + const ::std::string::size_type colon = str.find(delimiter, pos); + if (colon == ::std::string::npos) { + parsed.push_back(str.substr(pos)); + break; + } else { + parsed.push_back(str.substr(pos, colon - pos)); + pos = colon + 1; + } + } + dest->swap(parsed); +} + +#if GTEST_OS_WINDOWS +// Recreates the pipe and event handles from the provided parameters, +// signals the event, and returns a file descriptor wrapped around the pipe +// handle. This function is called in the child process only. +int GetStatusFileDescriptor(unsigned int parent_process_id, + size_t write_handle_as_size_t, + size_t event_handle_as_size_t) { + AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE, + FALSE, // Non-inheritable. + parent_process_id)); + if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) { + DeathTestAbort(String::Format("Unable to open parent process %u", + parent_process_id)); + } + + // TODO(vladl@google.com): Replace the following check with a + // compile-time assertion when available. + GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t)); + + const HANDLE write_handle = + reinterpret_cast(write_handle_as_size_t); + HANDLE dup_write_handle; + + // The newly initialized handle is accessible only in in the parent + // process. To obtain one accessible within the child, we need to use + // DuplicateHandle. + if (!::DuplicateHandle(parent_process_handle.Get(), write_handle, + ::GetCurrentProcess(), &dup_write_handle, + 0x0, // Requested privileges ignored since + // DUPLICATE_SAME_ACCESS is used. + FALSE, // Request non-inheritable handler. + DUPLICATE_SAME_ACCESS)) { + DeathTestAbort(String::Format( + "Unable to duplicate the pipe handle %Iu from the parent process %u", + write_handle_as_size_t, parent_process_id)); + } + + const HANDLE event_handle = reinterpret_cast(event_handle_as_size_t); + HANDLE dup_event_handle; + + if (!::DuplicateHandle(parent_process_handle.Get(), event_handle, + ::GetCurrentProcess(), &dup_event_handle, + 0x0, + FALSE, + DUPLICATE_SAME_ACCESS)) { + DeathTestAbort(String::Format( + "Unable to duplicate the event handle %Iu from the parent process %u", + event_handle_as_size_t, parent_process_id)); + } + + const int write_fd = + ::_open_osfhandle(reinterpret_cast(dup_write_handle), O_APPEND); + if (write_fd == -1) { + DeathTestAbort(String::Format( + "Unable to convert pipe handle %Iu to a file descriptor", + write_handle_as_size_t)); + } + + // Signals the parent that the write end of the pipe has been acquired + // so the parent can release its own write end. + ::SetEvent(dup_event_handle); + + return write_fd; +} +#endif // GTEST_OS_WINDOWS + +// Returns a newly created InternalRunDeathTestFlag object with fields +// initialized from the GTEST_FLAG(internal_run_death_test) flag if +// the flag is specified; otherwise returns NULL. +InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() { + if (GTEST_FLAG(internal_run_death_test) == "") return NULL; + + // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we + // can use it here. + int line = -1; + int index = -1; + ::std::vector< ::std::string> fields; + SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields); + int write_fd = -1; + +#if GTEST_OS_WINDOWS + unsigned int parent_process_id = 0; + size_t write_handle_as_size_t = 0; + size_t event_handle_as_size_t = 0; + + if (fields.size() != 6 + || !ParseNaturalNumber(fields[1], &line) + || !ParseNaturalNumber(fields[2], &index) + || !ParseNaturalNumber(fields[3], &parent_process_id) + || !ParseNaturalNumber(fields[4], &write_handle_as_size_t) + || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) { + DeathTestAbort(String::Format( + "Bad --gtest_internal_run_death_test flag: %s", + GTEST_FLAG(internal_run_death_test).c_str())); + } + write_fd = GetStatusFileDescriptor(parent_process_id, + write_handle_as_size_t, + event_handle_as_size_t); +#else + if (fields.size() != 4 + || !ParseNaturalNumber(fields[1], &line) + || !ParseNaturalNumber(fields[2], &index) + || !ParseNaturalNumber(fields[3], &write_fd)) { + DeathTestAbort(String::Format( + "Bad --gtest_internal_run_death_test flag: %s", + GTEST_FLAG(internal_run_death_test).c_str())); + } +#endif // GTEST_OS_WINDOWS + return new InternalRunDeathTestFlag(fields[0], line, index, write_fd); +} + +} // namespace internal + +#endif // GTEST_HAS_DEATH_TEST + +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc new file mode 100644 index 000000000..c1ef9188a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc @@ -0,0 +1,380 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: keith.ray@gmail.com (Keith Ray) + +#include +#include + +#include + +#if GTEST_OS_WINDOWS_MOBILE +#include +#elif GTEST_OS_WINDOWS +#include +#include +#elif GTEST_OS_SYMBIAN +// Symbian OpenC has PATH_MAX in sys/syslimits.h +#include +#else +#include +#include // Some Linux distributions define PATH_MAX here. +#endif // GTEST_OS_WINDOWS_MOBILE + +#if GTEST_OS_WINDOWS +#define GTEST_PATH_MAX_ _MAX_PATH +#elif defined(PATH_MAX) +#define GTEST_PATH_MAX_ PATH_MAX +#elif defined(_XOPEN_PATH_MAX) +#define GTEST_PATH_MAX_ _XOPEN_PATH_MAX +#else +#define GTEST_PATH_MAX_ _POSIX_PATH_MAX +#endif // GTEST_OS_WINDOWS + +#include + +namespace testing { +namespace internal { + +#if GTEST_OS_WINDOWS +// On Windows, '\\' is the standard path separator, but many tools and the +// Windows API also accept '/' as an alternate path separator. Unless otherwise +// noted, a file path can contain either kind of path separators, or a mixture +// of them. +const char kPathSeparator = '\\'; +const char kAlternatePathSeparator = '/'; +const char kPathSeparatorString[] = "\\"; +const char kAlternatePathSeparatorString[] = "/"; +#if GTEST_OS_WINDOWS_MOBILE +// Windows CE doesn't have a current directory. You should not use +// the current directory in tests on Windows CE, but this at least +// provides a reasonable fallback. +const char kCurrentDirectoryString[] = "\\"; +// Windows CE doesn't define INVALID_FILE_ATTRIBUTES +const DWORD kInvalidFileAttributes = 0xffffffff; +#else +const char kCurrentDirectoryString[] = ".\\"; +#endif // GTEST_OS_WINDOWS_MOBILE +#else +const char kPathSeparator = '/'; +const char kPathSeparatorString[] = "/"; +const char kCurrentDirectoryString[] = "./"; +#endif // GTEST_OS_WINDOWS + +// Returns whether the given character is a valid path separator. +static bool IsPathSeparator(char c) { +#if GTEST_HAS_ALT_PATH_SEP_ + return (c == kPathSeparator) || (c == kAlternatePathSeparator); +#else + return c == kPathSeparator; +#endif +} + +// Returns the current working directory, or "" if unsuccessful. +FilePath FilePath::GetCurrentDir() { +#if GTEST_OS_WINDOWS_MOBILE + // Windows CE doesn't have a current directory, so we just return + // something reasonable. + return FilePath(kCurrentDirectoryString); +#elif GTEST_OS_WINDOWS + char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; + return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); +#else + char cwd[GTEST_PATH_MAX_ + 1] = { '\0' }; + return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd); +#endif // GTEST_OS_WINDOWS_MOBILE +} + +// Returns a copy of the FilePath with the case-insensitive extension removed. +// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns +// FilePath("dir/file"). If a case-insensitive extension is not +// found, returns a copy of the original FilePath. +FilePath FilePath::RemoveExtension(const char* extension) const { + String dot_extension(String::Format(".%s", extension)); + if (pathname_.EndsWithCaseInsensitive(dot_extension.c_str())) { + return FilePath(String(pathname_.c_str(), pathname_.length() - 4)); + } + return *this; +} + +// Returns a pointer to the last occurence of a valid path separator in +// the FilePath. On Windows, for example, both '/' and '\' are valid path +// separators. Returns NULL if no path separator was found. +const char* FilePath::FindLastPathSeparator() const { + const char* const last_sep = strrchr(c_str(), kPathSeparator); +#if GTEST_HAS_ALT_PATH_SEP_ + const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator); + // Comparing two pointers of which only one is NULL is undefined. + if (last_alt_sep != NULL && + (last_sep == NULL || last_alt_sep > last_sep)) { + return last_alt_sep; + } +#endif + return last_sep; +} + +// Returns a copy of the FilePath with the directory part removed. +// Example: FilePath("path/to/file").RemoveDirectoryName() returns +// FilePath("file"). If there is no directory part ("just_a_file"), it returns +// the FilePath unmodified. If there is no file part ("just_a_dir/") it +// returns an empty FilePath (""). +// On Windows platform, '\' is the path separator, otherwise it is '/'. +FilePath FilePath::RemoveDirectoryName() const { + const char* const last_sep = FindLastPathSeparator(); + return last_sep ? FilePath(String(last_sep + 1)) : *this; +} + +// RemoveFileName returns the directory path with the filename removed. +// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". +// If the FilePath is "a_file" or "/a_file", RemoveFileName returns +// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does +// not have a file, like "just/a/dir/", it returns the FilePath unmodified. +// On Windows platform, '\' is the path separator, otherwise it is '/'. +FilePath FilePath::RemoveFileName() const { + const char* const last_sep = FindLastPathSeparator(); + String dir; + if (last_sep) { + dir = String(c_str(), last_sep + 1 - c_str()); + } else { + dir = kCurrentDirectoryString; + } + return FilePath(dir); +} + +// Helper functions for naming files in a directory for xml output. + +// Given directory = "dir", base_name = "test", number = 0, +// extension = "xml", returns "dir/test.xml". If number is greater +// than zero (e.g., 12), returns "dir/test_12.xml". +// On Windows platform, uses \ as the separator rather than /. +FilePath FilePath::MakeFileName(const FilePath& directory, + const FilePath& base_name, + int number, + const char* extension) { + String file; + if (number == 0) { + file = String::Format("%s.%s", base_name.c_str(), extension); + } else { + file = String::Format("%s_%d.%s", base_name.c_str(), number, extension); + } + return ConcatPaths(directory, FilePath(file)); +} + +// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml". +// On Windows, uses \ as the separator rather than /. +FilePath FilePath::ConcatPaths(const FilePath& directory, + const FilePath& relative_path) { + if (directory.IsEmpty()) + return relative_path; + const FilePath dir(directory.RemoveTrailingPathSeparator()); + return FilePath(String::Format("%s%c%s", dir.c_str(), kPathSeparator, + relative_path.c_str())); +} + +// Returns true if pathname describes something findable in the file-system, +// either a file, directory, or whatever. +bool FilePath::FileOrDirectoryExists() const { +#if GTEST_OS_WINDOWS_MOBILE + LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str()); + const DWORD attributes = GetFileAttributes(unicode); + delete [] unicode; + return attributes != kInvalidFileAttributes; +#else + posix::StatStruct file_stat; + return posix::Stat(pathname_.c_str(), &file_stat) == 0; +#endif // GTEST_OS_WINDOWS_MOBILE +} + +// Returns true if pathname describes a directory in the file-system +// that exists. +bool FilePath::DirectoryExists() const { + bool result = false; +#if GTEST_OS_WINDOWS + // Don't strip off trailing separator if path is a root directory on + // Windows (like "C:\\"). + const FilePath& path(IsRootDirectory() ? *this : + RemoveTrailingPathSeparator()); +#else + const FilePath& path(*this); +#endif + +#if GTEST_OS_WINDOWS_MOBILE + LPCWSTR unicode = String::AnsiToUtf16(path.c_str()); + const DWORD attributes = GetFileAttributes(unicode); + delete [] unicode; + if ((attributes != kInvalidFileAttributes) && + (attributes & FILE_ATTRIBUTE_DIRECTORY)) { + result = true; + } +#else + posix::StatStruct file_stat; + result = posix::Stat(path.c_str(), &file_stat) == 0 && + posix::IsDir(file_stat); +#endif // GTEST_OS_WINDOWS_MOBILE + + return result; +} + +// Returns true if pathname describes a root directory. (Windows has one +// root directory per disk drive.) +bool FilePath::IsRootDirectory() const { +#if GTEST_OS_WINDOWS + // TODO(wan@google.com): on Windows a network share like + // \\server\share can be a root directory, although it cannot be the + // current directory. Handle this properly. + return pathname_.length() == 3 && IsAbsolutePath(); +#else + return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]); +#endif +} + +// Returns true if pathname describes an absolute path. +bool FilePath::IsAbsolutePath() const { + const char* const name = pathname_.c_str(); +#if GTEST_OS_WINDOWS + return pathname_.length() >= 3 && + ((name[0] >= 'a' && name[0] <= 'z') || + (name[0] >= 'A' && name[0] <= 'Z')) && + name[1] == ':' && + IsPathSeparator(name[2]); +#else + return IsPathSeparator(name[0]); +#endif +} + +// Returns a pathname for a file that does not currently exist. The pathname +// will be directory/base_name.extension or +// directory/base_name_.extension if directory/base_name.extension +// already exists. The number will be incremented until a pathname is found +// that does not already exist. +// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. +// There could be a race condition if two or more processes are calling this +// function at the same time -- they could both pick the same filename. +FilePath FilePath::GenerateUniqueFileName(const FilePath& directory, + const FilePath& base_name, + const char* extension) { + FilePath full_pathname; + int number = 0; + do { + full_pathname.Set(MakeFileName(directory, base_name, number++, extension)); + } while (full_pathname.FileOrDirectoryExists()); + return full_pathname; +} + +// Returns true if FilePath ends with a path separator, which indicates that +// it is intended to represent a directory. Returns false otherwise. +// This does NOT check that a directory (or file) actually exists. +bool FilePath::IsDirectory() const { + return !pathname_.empty() && + IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]); +} + +// Create directories so that path exists. Returns true if successful or if +// the directories already exist; returns false if unable to create directories +// for any reason. +bool FilePath::CreateDirectoriesRecursively() const { + if (!this->IsDirectory()) { + return false; + } + + if (pathname_.length() == 0 || this->DirectoryExists()) { + return true; + } + + const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName()); + return parent.CreateDirectoriesRecursively() && this->CreateFolder(); +} + +// Create the directory so that path exists. Returns true if successful or +// if the directory already exists; returns false if unable to create the +// directory for any reason, including if the parent directory does not +// exist. Not named "CreateDirectory" because that's a macro on Windows. +bool FilePath::CreateFolder() const { +#if GTEST_OS_WINDOWS_MOBILE + FilePath removed_sep(this->RemoveTrailingPathSeparator()); + LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str()); + int result = CreateDirectory(unicode, NULL) ? 0 : -1; + delete [] unicode; +#elif GTEST_OS_WINDOWS + int result = _mkdir(pathname_.c_str()); +#else + int result = mkdir(pathname_.c_str(), 0777); +#endif // GTEST_OS_WINDOWS_MOBILE + + if (result == -1) { + return this->DirectoryExists(); // An error is OK if the directory exists. + } + return true; // No error. +} + +// If input name has a trailing separator character, remove it and return the +// name, otherwise return the name string unmodified. +// On Windows platform, uses \ as the separator, other platforms use /. +FilePath FilePath::RemoveTrailingPathSeparator() const { + return IsDirectory() + ? FilePath(String(pathname_.c_str(), pathname_.length() - 1)) + : *this; +} + +// Removes any redundant separators that might be in the pathname. +// For example, "bar///foo" becomes "bar/foo". Does not eliminate other +// redundancies that might be in a pathname involving "." or "..". +// TODO(wan@google.com): handle Windows network shares (e.g. \\server\share). +void FilePath::Normalize() { + if (pathname_.c_str() == NULL) { + pathname_ = ""; + return; + } + const char* src = pathname_.c_str(); + char* const dest = new char[pathname_.length() + 1]; + char* dest_ptr = dest; + memset(dest_ptr, 0, pathname_.length() + 1); + + while (*src != '\0') { + *dest_ptr = *src; + if (!IsPathSeparator(*src)) { + src++; + } else { +#if GTEST_HAS_ALT_PATH_SEP_ + if (*dest_ptr == kAlternatePathSeparator) { + *dest_ptr = kPathSeparator; + } +#endif + while (IsPathSeparator(*src)) + src++; + } + dest_ptr++; + } + *dest_ptr = '\0'; + pathname_ = dest; + delete[] dest; +} + +} // namespace internal +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h new file mode 100644 index 000000000..855b21554 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h @@ -0,0 +1,1074 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Utility functions and classes used by the Google C++ testing framework. +// +// Author: wan@google.com (Zhanyong Wan) +// +// This file contains purely Google Test's internal implementation. Please +// DO NOT #INCLUDE IT IN A USER PROGRAM. + +#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_ +#define GTEST_SRC_GTEST_INTERNAL_INL_H_ + +// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is +// part of Google Test's implementation; otherwise it's undefined. +#if !GTEST_IMPLEMENTATION_ +// A user is trying to include this from his code - just say no. +#error "gtest-internal-inl.h is part of Google Test's internal implementation." +#error "It must not be included except by Google Test itself." +#endif // GTEST_IMPLEMENTATION_ + +#ifndef _WIN32_WCE +#include +#endif // !_WIN32_WCE +#include +#include // For strtoll/_strtoul64/malloc/free. +#include // For memmove. + +#include +#include +#include + +#include + +#if GTEST_OS_WINDOWS +#include // For DWORD. +#endif // GTEST_OS_WINDOWS + +#include // NOLINT +#include + +namespace testing { + +// Declares the flags. +// +// We don't want the users to modify this flag in the code, but want +// Google Test's own unit tests to be able to access it. Therefore we +// declare it here as opposed to in gtest.h. +GTEST_DECLARE_bool_(death_test_use_fork); + +namespace internal { + +// The value of GetTestTypeId() as seen from within the Google Test +// library. This is solely for testing GetTestTypeId(). +GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest; + +// Names of the flags (needed for parsing Google Test flags). +const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests"; +const char kBreakOnFailureFlag[] = "break_on_failure"; +const char kCatchExceptionsFlag[] = "catch_exceptions"; +const char kColorFlag[] = "color"; +const char kFilterFlag[] = "filter"; +const char kListTestsFlag[] = "list_tests"; +const char kOutputFlag[] = "output"; +const char kPrintTimeFlag[] = "print_time"; +const char kRandomSeedFlag[] = "random_seed"; +const char kRepeatFlag[] = "repeat"; +const char kShuffleFlag[] = "shuffle"; +const char kStackTraceDepthFlag[] = "stack_trace_depth"; +const char kThrowOnFailureFlag[] = "throw_on_failure"; + +// A valid random seed must be in [1, kMaxRandomSeed]. +const int kMaxRandomSeed = 99999; + +// g_help_flag is true iff the --help flag or an equivalent form is +// specified on the command line. +GTEST_API_ extern bool g_help_flag; + +// Returns the current time in milliseconds. +GTEST_API_ TimeInMillis GetTimeInMillis(); + +// Returns true iff Google Test should use colors in the output. +GTEST_API_ bool ShouldUseColor(bool stdout_is_tty); + +// Formats the given time in milliseconds as seconds. +GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms); + +// Parses a string for an Int32 flag, in the form of "--flag=value". +// +// On success, stores the value of the flag in *value, and returns +// true. On failure, returns false without changing *value. +GTEST_API_ bool ParseInt32Flag( + const char* str, const char* flag, Int32* value); + +// Returns a random seed in range [1, kMaxRandomSeed] based on the +// given --gtest_random_seed flag value. +inline int GetRandomSeedFromFlag(Int32 random_seed_flag) { + const unsigned int raw_seed = (random_seed_flag == 0) ? + static_cast(GetTimeInMillis()) : + static_cast(random_seed_flag); + + // Normalizes the actual seed to range [1, kMaxRandomSeed] such that + // it's easy to type. + const int normalized_seed = + static_cast((raw_seed - 1U) % + static_cast(kMaxRandomSeed)) + 1; + return normalized_seed; +} + +// Returns the first valid random seed after 'seed'. The behavior is +// undefined if 'seed' is invalid. The seed after kMaxRandomSeed is +// considered to be 1. +inline int GetNextRandomSeed(int seed) { + GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed) + << "Invalid random seed " << seed << " - must be in [1, " + << kMaxRandomSeed << "]."; + const int next_seed = seed + 1; + return (next_seed > kMaxRandomSeed) ? 1 : next_seed; +} + +// This class saves the values of all Google Test flags in its c'tor, and +// restores them in its d'tor. +class GTestFlagSaver { + public: + // The c'tor. + GTestFlagSaver() { + also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests); + break_on_failure_ = GTEST_FLAG(break_on_failure); + catch_exceptions_ = GTEST_FLAG(catch_exceptions); + color_ = GTEST_FLAG(color); + death_test_style_ = GTEST_FLAG(death_test_style); + death_test_use_fork_ = GTEST_FLAG(death_test_use_fork); + filter_ = GTEST_FLAG(filter); + internal_run_death_test_ = GTEST_FLAG(internal_run_death_test); + list_tests_ = GTEST_FLAG(list_tests); + output_ = GTEST_FLAG(output); + print_time_ = GTEST_FLAG(print_time); + random_seed_ = GTEST_FLAG(random_seed); + repeat_ = GTEST_FLAG(repeat); + shuffle_ = GTEST_FLAG(shuffle); + stack_trace_depth_ = GTEST_FLAG(stack_trace_depth); + throw_on_failure_ = GTEST_FLAG(throw_on_failure); + } + + // The d'tor is not virtual. DO NOT INHERIT FROM THIS CLASS. + ~GTestFlagSaver() { + GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_; + GTEST_FLAG(break_on_failure) = break_on_failure_; + GTEST_FLAG(catch_exceptions) = catch_exceptions_; + GTEST_FLAG(color) = color_; + GTEST_FLAG(death_test_style) = death_test_style_; + GTEST_FLAG(death_test_use_fork) = death_test_use_fork_; + GTEST_FLAG(filter) = filter_; + GTEST_FLAG(internal_run_death_test) = internal_run_death_test_; + GTEST_FLAG(list_tests) = list_tests_; + GTEST_FLAG(output) = output_; + GTEST_FLAG(print_time) = print_time_; + GTEST_FLAG(random_seed) = random_seed_; + GTEST_FLAG(repeat) = repeat_; + GTEST_FLAG(shuffle) = shuffle_; + GTEST_FLAG(stack_trace_depth) = stack_trace_depth_; + GTEST_FLAG(throw_on_failure) = throw_on_failure_; + } + private: + // Fields for saving the original values of flags. + bool also_run_disabled_tests_; + bool break_on_failure_; + bool catch_exceptions_; + String color_; + String death_test_style_; + bool death_test_use_fork_; + String filter_; + String internal_run_death_test_; + bool list_tests_; + String output_; + bool print_time_; + bool pretty_; + internal::Int32 random_seed_; + internal::Int32 repeat_; + bool shuffle_; + internal::Int32 stack_trace_depth_; + bool throw_on_failure_; +} GTEST_ATTRIBUTE_UNUSED_; + +// Converts a Unicode code point to a narrow string in UTF-8 encoding. +// code_point parameter is of type UInt32 because wchar_t may not be +// wide enough to contain a code point. +// The output buffer str must containt at least 32 characters. +// The function returns the address of the output buffer. +// If the code_point is not a valid Unicode code point +// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output +// as '(Invalid Unicode 0xXXXXXXXX)'. +GTEST_API_ char* CodePointToUtf8(UInt32 code_point, char* str); + +// Converts a wide string to a narrow string in UTF-8 encoding. +// The wide string is assumed to have the following encoding: +// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) +// UTF-32 if sizeof(wchar_t) == 4 (on Linux) +// Parameter str points to a null-terminated wide string. +// Parameter num_chars may additionally limit the number +// of wchar_t characters processed. -1 is used when the entire string +// should be processed. +// If the string contains code points that are not valid Unicode code points +// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output +// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding +// and contains invalid UTF-16 surrogate pairs, values in those pairs +// will be encoded as individual Unicode characters from Basic Normal Plane. +GTEST_API_ String WideStringToUtf8(const wchar_t* str, int num_chars); + +// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file +// if the variable is present. If a file already exists at this location, this +// function will write over it. If the variable is present, but the file cannot +// be created, prints an error and exits. +void WriteToShardStatusFileIfNeeded(); + +// Checks whether sharding is enabled by examining the relevant +// environment variable values. If the variables are present, +// but inconsistent (e.g., shard_index >= total_shards), prints +// an error and exits. If in_subprocess_for_death_test, sharding is +// disabled because it must only be applied to the original test +// process. Otherwise, we could filter out death tests we intended to execute. +GTEST_API_ bool ShouldShard(const char* total_shards_str, + const char* shard_index_str, + bool in_subprocess_for_death_test); + +// Parses the environment variable var as an Int32. If it is unset, +// returns default_val. If it is not an Int32, prints an error and +// and aborts. +GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val); + +// Given the total number of shards, the shard index, and the test id, +// returns true iff the test should be run on this shard. The test id is +// some arbitrary but unique non-negative integer assigned to each test +// method. Assumes that 0 <= shard_index < total_shards. +GTEST_API_ bool ShouldRunTestOnShard( + int total_shards, int shard_index, int test_id); + +// STL container utilities. + +// Returns the number of elements in the given container that satisfy +// the given predicate. +template +inline int CountIf(const Container& c, Predicate predicate) { + return static_cast(std::count_if(c.begin(), c.end(), predicate)); +} + +// Applies a function/functor to each element in the container. +template +void ForEach(const Container& c, Functor functor) { + std::for_each(c.begin(), c.end(), functor); +} + +// Returns the i-th element of the vector, or default_value if i is not +// in range [0, v.size()). +template +inline E GetElementOr(const std::vector& v, int i, E default_value) { + return (i < 0 || i >= static_cast(v.size())) ? default_value : v[i]; +} + +// Performs an in-place shuffle of a range of the vector's elements. +// 'begin' and 'end' are element indices as an STL-style range; +// i.e. [begin, end) are shuffled, where 'end' == size() means to +// shuffle to the end of the vector. +template +void ShuffleRange(internal::Random* random, int begin, int end, + std::vector* v) { + const int size = static_cast(v->size()); + GTEST_CHECK_(0 <= begin && begin <= size) + << "Invalid shuffle range start " << begin << ": must be in range [0, " + << size << "]."; + GTEST_CHECK_(begin <= end && end <= size) + << "Invalid shuffle range finish " << end << ": must be in range [" + << begin << ", " << size << "]."; + + // Fisher-Yates shuffle, from + // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle + for (int range_width = end - begin; range_width >= 2; range_width--) { + const int last_in_range = begin + range_width - 1; + const int selected = begin + random->Generate(range_width); + std::swap((*v)[selected], (*v)[last_in_range]); + } +} + +// Performs an in-place shuffle of the vector's elements. +template +inline void Shuffle(internal::Random* random, std::vector* v) { + ShuffleRange(random, 0, static_cast(v->size()), v); +} + +// A function for deleting an object. Handy for being used as a +// functor. +template +static void Delete(T* x) { + delete x; +} + +// A predicate that checks the key of a TestProperty against a known key. +// +// TestPropertyKeyIs is copyable. +class TestPropertyKeyIs { + public: + // Constructor. + // + // TestPropertyKeyIs has NO default constructor. + explicit TestPropertyKeyIs(const char* key) + : key_(key) {} + + // Returns true iff the test name of test property matches on key_. + bool operator()(const TestProperty& test_property) const { + return String(test_property.key()).Compare(key_) == 0; + } + + private: + String key_; +}; + +class TestInfoImpl { + public: + TestInfoImpl(TestInfo* parent, const char* test_case_name, + const char* name, const char* test_case_comment, + const char* comment, TypeId fixture_class_id, + internal::TestFactoryBase* factory); + ~TestInfoImpl(); + + // Returns true if this test should run. + bool should_run() const { return should_run_; } + + // Sets the should_run member. + void set_should_run(bool should) { should_run_ = should; } + + // Returns true if this test is disabled. Disabled tests are not run. + bool is_disabled() const { return is_disabled_; } + + // Sets the is_disabled member. + void set_is_disabled(bool is) { is_disabled_ = is; } + + // Returns true if this test matches the filter specified by the user. + bool matches_filter() const { return matches_filter_; } + + // Sets the matches_filter member. + void set_matches_filter(bool matches) { matches_filter_ = matches; } + + // Returns the test case name. + const char* test_case_name() const { return test_case_name_.c_str(); } + + // Returns the test name. + const char* name() const { return name_.c_str(); } + + // Returns the test case comment. + const char* test_case_comment() const { return test_case_comment_.c_str(); } + + // Returns the test comment. + const char* comment() const { return comment_.c_str(); } + + // Returns the ID of the test fixture class. + TypeId fixture_class_id() const { return fixture_class_id_; } + + // Returns the test result. + TestResult* result() { return &result_; } + const TestResult* result() const { return &result_; } + + // Creates the test object, runs it, records its result, and then + // deletes it. + void Run(); + + // Clears the test result. + void ClearResult() { result_.Clear(); } + + // Clears the test result in the given TestInfo object. + static void ClearTestResult(TestInfo * test_info) { + test_info->impl()->ClearResult(); + } + + private: + // These fields are immutable properties of the test. + TestInfo* const parent_; // The owner of this object + const String test_case_name_; // Test case name + const String name_; // Test name + const String test_case_comment_; // Test case comment + const String comment_; // Test comment + const TypeId fixture_class_id_; // ID of the test fixture class + bool should_run_; // True iff this test should run + bool is_disabled_; // True iff this test is disabled + bool matches_filter_; // True if this test matches the + // user-specified filter. + internal::TestFactoryBase* const factory_; // The factory that creates + // the test object + + // This field is mutable and needs to be reset before running the + // test for the second time. + TestResult result_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfoImpl); +}; + +// Class UnitTestOptions. +// +// This class contains functions for processing options the user +// specifies when running the tests. It has only static members. +// +// In most cases, the user can specify an option using either an +// environment variable or a command line flag. E.g. you can set the +// test filter using either GTEST_FILTER or --gtest_filter. If both +// the variable and the flag are present, the latter overrides the +// former. +class GTEST_API_ UnitTestOptions { + public: + // Functions for processing the gtest_output flag. + + // Returns the output format, or "" for normal printed output. + static String GetOutputFormat(); + + // Returns the absolute path of the requested output file, or the + // default (test_detail.xml in the original working directory) if + // none was explicitly specified. + static String GetAbsolutePathToOutputFile(); + + // Functions for processing the gtest_filter flag. + + // Returns true iff the wildcard pattern matches the string. The + // first ':' or '\0' character in pattern marks the end of it. + // + // This recursive algorithm isn't very efficient, but is clear and + // works well enough for matching test names, which are short. + static bool PatternMatchesString(const char *pattern, const char *str); + + // Returns true iff the user-specified filter matches the test case + // name and the test name. + static bool FilterMatchesTest(const String &test_case_name, + const String &test_name); + +#if GTEST_OS_WINDOWS + // Function for supporting the gtest_catch_exception flag. + + // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the + // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. + // This function is useful as an __except condition. + static int GTestShouldProcessSEH(DWORD exception_code); +#endif // GTEST_OS_WINDOWS + + // Returns true if "name" matches the ':' separated list of glob-style + // filters in "filter". + static bool MatchesFilter(const String& name, const char* filter); +}; + +// Returns the current application's name, removing directory path if that +// is present. Used by UnitTestOptions::GetOutputFile. +GTEST_API_ FilePath GetCurrentExecutableName(); + +// The role interface for getting the OS stack trace as a string. +class OsStackTraceGetterInterface { + public: + OsStackTraceGetterInterface() {} + virtual ~OsStackTraceGetterInterface() {} + + // Returns the current OS stack trace as a String. Parameters: + // + // max_depth - the maximum number of stack frames to be included + // in the trace. + // skip_count - the number of top frames to be skipped; doesn't count + // against max_depth. + virtual String CurrentStackTrace(int max_depth, int skip_count) = 0; + + // UponLeavingGTest() should be called immediately before Google Test calls + // user code. It saves some information about the current stack that + // CurrentStackTrace() will use to find and hide Google Test stack frames. + virtual void UponLeavingGTest() = 0; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface); +}; + +// A working implementation of the OsStackTraceGetterInterface interface. +class OsStackTraceGetter : public OsStackTraceGetterInterface { + public: + OsStackTraceGetter() : caller_frame_(NULL) {} + virtual String CurrentStackTrace(int max_depth, int skip_count); + virtual void UponLeavingGTest(); + + // This string is inserted in place of stack frames that are part of + // Google Test's implementation. + static const char* const kElidedFramesMarker; + + private: + Mutex mutex_; // protects all internal state + + // We save the stack frame below the frame that calls user code. + // We do this because the address of the frame immediately below + // the user code changes between the call to UponLeavingGTest() + // and any calls to CurrentStackTrace() from within the user code. + void* caller_frame_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter); +}; + +// Information about a Google Test trace point. +struct TraceInfo { + const char* file; + int line; + String message; +}; + +// This is the default global test part result reporter used in UnitTestImpl. +// This class should only be used by UnitTestImpl. +class DefaultGlobalTestPartResultReporter + : public TestPartResultReporterInterface { + public: + explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test); + // Implements the TestPartResultReporterInterface. Reports the test part + // result in the current test. + virtual void ReportTestPartResult(const TestPartResult& result); + + private: + UnitTestImpl* const unit_test_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter); +}; + +// This is the default per thread test part result reporter used in +// UnitTestImpl. This class should only be used by UnitTestImpl. +class DefaultPerThreadTestPartResultReporter + : public TestPartResultReporterInterface { + public: + explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test); + // Implements the TestPartResultReporterInterface. The implementation just + // delegates to the current global test part result reporter of *unit_test_. + virtual void ReportTestPartResult(const TestPartResult& result); + + private: + UnitTestImpl* const unit_test_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter); +}; + +// The private implementation of the UnitTest class. We don't protect +// the methods under a mutex, as this class is not accessible by a +// user and the UnitTest class that delegates work to this class does +// proper locking. +class GTEST_API_ UnitTestImpl { + public: + explicit UnitTestImpl(UnitTest* parent); + virtual ~UnitTestImpl(); + + // There are two different ways to register your own TestPartResultReporter. + // You can register your own repoter to listen either only for test results + // from the current thread or for results from all threads. + // By default, each per-thread test result repoter just passes a new + // TestPartResult to the global test result reporter, which registers the + // test part result for the currently running test. + + // Returns the global test part result reporter. + TestPartResultReporterInterface* GetGlobalTestPartResultReporter(); + + // Sets the global test part result reporter. + void SetGlobalTestPartResultReporter( + TestPartResultReporterInterface* reporter); + + // Returns the test part result reporter for the current thread. + TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread(); + + // Sets the test part result reporter for the current thread. + void SetTestPartResultReporterForCurrentThread( + TestPartResultReporterInterface* reporter); + + // Gets the number of successful test cases. + int successful_test_case_count() const; + + // Gets the number of failed test cases. + int failed_test_case_count() const; + + // Gets the number of all test cases. + int total_test_case_count() const; + + // Gets the number of all test cases that contain at least one test + // that should run. + int test_case_to_run_count() const; + + // Gets the number of successful tests. + int successful_test_count() const; + + // Gets the number of failed tests. + int failed_test_count() const; + + // Gets the number of disabled tests. + int disabled_test_count() const; + + // Gets the number of all tests. + int total_test_count() const; + + // Gets the number of tests that should run. + int test_to_run_count() const; + + // Gets the elapsed time, in milliseconds. + TimeInMillis elapsed_time() const { return elapsed_time_; } + + // Returns true iff the unit test passed (i.e. all test cases passed). + bool Passed() const { return !Failed(); } + + // Returns true iff the unit test failed (i.e. some test case failed + // or something outside of all tests failed). + bool Failed() const { + return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed(); + } + + // Gets the i-th test case among all the test cases. i can range from 0 to + // total_test_case_count() - 1. If i is not in that range, returns NULL. + const TestCase* GetTestCase(int i) const { + const int index = GetElementOr(test_case_indices_, i, -1); + return index < 0 ? NULL : test_cases_[i]; + } + + // Gets the i-th test case among all the test cases. i can range from 0 to + // total_test_case_count() - 1. If i is not in that range, returns NULL. + TestCase* GetMutableTestCase(int i) { + const int index = GetElementOr(test_case_indices_, i, -1); + return index < 0 ? NULL : test_cases_[index]; + } + + // Provides access to the event listener list. + TestEventListeners* listeners() { return &listeners_; } + + // Returns the TestResult for the test that's currently running, or + // the TestResult for the ad hoc test if no test is running. + TestResult* current_test_result(); + + // Returns the TestResult for the ad hoc test. + const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; } + + // Sets the OS stack trace getter. + // + // Does nothing if the input and the current OS stack trace getter + // are the same; otherwise, deletes the old getter and makes the + // input the current getter. + void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter); + + // Returns the current OS stack trace getter if it is not NULL; + // otherwise, creates an OsStackTraceGetter, makes it the current + // getter, and returns it. + OsStackTraceGetterInterface* os_stack_trace_getter(); + + // Returns the current OS stack trace as a String. + // + // The maximum number of stack frames to be included is specified by + // the gtest_stack_trace_depth flag. The skip_count parameter + // specifies the number of top frames to be skipped, which doesn't + // count against the number of frames to be included. + // + // For example, if Foo() calls Bar(), which in turn calls + // CurrentOsStackTraceExceptTop(1), Foo() will be included in the + // trace but Bar() and CurrentOsStackTraceExceptTop() won't. + String CurrentOsStackTraceExceptTop(int skip_count); + + // Finds and returns a TestCase with the given name. If one doesn't + // exist, creates one and returns it. + // + // Arguments: + // + // test_case_name: name of the test case + // set_up_tc: pointer to the function that sets up the test case + // tear_down_tc: pointer to the function that tears down the test case + TestCase* GetTestCase(const char* test_case_name, + const char* comment, + Test::SetUpTestCaseFunc set_up_tc, + Test::TearDownTestCaseFunc tear_down_tc); + + // Adds a TestInfo to the unit test. + // + // Arguments: + // + // set_up_tc: pointer to the function that sets up the test case + // tear_down_tc: pointer to the function that tears down the test case + // test_info: the TestInfo object + void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc, + Test::TearDownTestCaseFunc tear_down_tc, + TestInfo * test_info) { + // In order to support thread-safe death tests, we need to + // remember the original working directory when the test program + // was first invoked. We cannot do this in RUN_ALL_TESTS(), as + // the user may have changed the current directory before calling + // RUN_ALL_TESTS(). Therefore we capture the current directory in + // AddTestInfo(), which is called to register a TEST or TEST_F + // before main() is reached. + if (original_working_dir_.IsEmpty()) { + original_working_dir_.Set(FilePath::GetCurrentDir()); + GTEST_CHECK_(!original_working_dir_.IsEmpty()) + << "Failed to get the current working directory."; + } + + GetTestCase(test_info->test_case_name(), + test_info->test_case_comment(), + set_up_tc, + tear_down_tc)->AddTestInfo(test_info); + } + +#if GTEST_HAS_PARAM_TEST + // Returns ParameterizedTestCaseRegistry object used to keep track of + // value-parameterized tests and instantiate and register them. + internal::ParameterizedTestCaseRegistry& parameterized_test_registry() { + return parameterized_test_registry_; + } +#endif // GTEST_HAS_PARAM_TEST + + // Sets the TestCase object for the test that's currently running. + void set_current_test_case(TestCase* a_current_test_case) { + current_test_case_ = a_current_test_case; + } + + // Sets the TestInfo object for the test that's currently running. If + // current_test_info is NULL, the assertion results will be stored in + // ad_hoc_test_result_. + void set_current_test_info(TestInfo* a_current_test_info) { + current_test_info_ = a_current_test_info; + } + + // Registers all parameterized tests defined using TEST_P and + // INSTANTIATE_TEST_P, creating regular tests for each test/parameter + // combination. This method can be called more then once; it has + // guards protecting from registering the tests more then once. + // If value-parameterized tests are disabled, RegisterParameterizedTests + // is present but does nothing. + void RegisterParameterizedTests(); + + // Runs all tests in this UnitTest object, prints the result, and + // returns 0 if all tests are successful, or 1 otherwise. If any + // exception is thrown during a test on Windows, this test is + // considered to be failed, but the rest of the tests will still be + // run. (We disable exceptions on Linux and Mac OS X, so the issue + // doesn't apply there.) + int RunAllTests(); + + // Clears the results of all tests, including the ad hoc test. + void ClearResult() { + ForEach(test_cases_, TestCase::ClearTestCaseResult); + ad_hoc_test_result_.Clear(); + } + + enum ReactionToSharding { + HONOR_SHARDING_PROTOCOL, + IGNORE_SHARDING_PROTOCOL + }; + + // Matches the full name of each test against the user-specified + // filter to decide whether the test should run, then records the + // result in each TestCase and TestInfo object. + // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests + // based on sharding variables in the environment. + // Returns the number of tests that should run. + int FilterTests(ReactionToSharding shard_tests); + + // Prints the names of the tests matching the user-specified filter flag. + void ListTestsMatchingFilter(); + + const TestCase* current_test_case() const { return current_test_case_; } + TestInfo* current_test_info() { return current_test_info_; } + const TestInfo* current_test_info() const { return current_test_info_; } + + // Returns the vector of environments that need to be set-up/torn-down + // before/after the tests are run. + std::vector& environments() { return environments_; } + + // Getters for the per-thread Google Test trace stack. + std::vector& gtest_trace_stack() { + return *(gtest_trace_stack_.pointer()); + } + const std::vector& gtest_trace_stack() const { + return gtest_trace_stack_.get(); + } + +#if GTEST_HAS_DEATH_TEST + void InitDeathTestSubprocessControlInfo() { + internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag()); + } + // Returns a pointer to the parsed --gtest_internal_run_death_test + // flag, or NULL if that flag was not specified. + // This information is useful only in a death test child process. + // Must not be called before a call to InitGoogleTest. + const InternalRunDeathTestFlag* internal_run_death_test_flag() const { + return internal_run_death_test_flag_.get(); + } + + // Returns a pointer to the current death test factory. + internal::DeathTestFactory* death_test_factory() { + return death_test_factory_.get(); + } + + void SuppressTestEventsIfInSubprocess(); + + friend class ReplaceDeathTestFactory; +#endif // GTEST_HAS_DEATH_TEST + + // Initializes the event listener performing XML output as specified by + // UnitTestOptions. Must not be called before InitGoogleTest. + void ConfigureXmlOutput(); + + // Performs initialization dependent upon flag values obtained in + // ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to + // ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest + // this function is also called from RunAllTests. Since this function can be + // called more than once, it has to be idempotent. + void PostFlagParsingInit(); + + // Gets the random seed used at the start of the current test iteration. + int random_seed() const { return random_seed_; } + + // Gets the random number generator. + internal::Random* random() { return &random_; } + + // Shuffles all test cases, and the tests within each test case, + // making sure that death tests are still run first. + void ShuffleTests(); + + // Restores the test cases and tests to their order before the first shuffle. + void UnshuffleTests(); + + private: + friend class ::testing::UnitTest; + + // The UnitTest object that owns this implementation object. + UnitTest* const parent_; + + // The working directory when the first TEST() or TEST_F() was + // executed. + internal::FilePath original_working_dir_; + + // The default test part result reporters. + DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_; + DefaultPerThreadTestPartResultReporter + default_per_thread_test_part_result_reporter_; + + // Points to (but doesn't own) the global test part result reporter. + TestPartResultReporterInterface* global_test_part_result_repoter_; + + // Protects read and write access to global_test_part_result_reporter_. + internal::Mutex global_test_part_result_reporter_mutex_; + + // Points to (but doesn't own) the per-thread test part result reporter. + internal::ThreadLocal + per_thread_test_part_result_reporter_; + + // The vector of environments that need to be set-up/torn-down + // before/after the tests are run. + std::vector environments_; + + // The vector of TestCases in their original order. It owns the + // elements in the vector. + std::vector test_cases_; + + // Provides a level of indirection for the test case list to allow + // easy shuffling and restoring the test case order. The i-th + // element of this vector is the index of the i-th test case in the + // shuffled order. + std::vector test_case_indices_; + +#if GTEST_HAS_PARAM_TEST + // ParameterizedTestRegistry object used to register value-parameterized + // tests. + internal::ParameterizedTestCaseRegistry parameterized_test_registry_; + + // Indicates whether RegisterParameterizedTests() has been called already. + bool parameterized_tests_registered_; +#endif // GTEST_HAS_PARAM_TEST + + // Index of the last death test case registered. Initially -1. + int last_death_test_case_; + + // This points to the TestCase for the currently running test. It + // changes as Google Test goes through one test case after another. + // When no test is running, this is set to NULL and Google Test + // stores assertion results in ad_hoc_test_result_. Initially NULL. + TestCase* current_test_case_; + + // This points to the TestInfo for the currently running test. It + // changes as Google Test goes through one test after another. When + // no test is running, this is set to NULL and Google Test stores + // assertion results in ad_hoc_test_result_. Initially NULL. + TestInfo* current_test_info_; + + // Normally, a user only writes assertions inside a TEST or TEST_F, + // or inside a function called by a TEST or TEST_F. Since Google + // Test keeps track of which test is current running, it can + // associate such an assertion with the test it belongs to. + // + // If an assertion is encountered when no TEST or TEST_F is running, + // Google Test attributes the assertion result to an imaginary "ad hoc" + // test, and records the result in ad_hoc_test_result_. + TestResult ad_hoc_test_result_; + + // The list of event listeners that can be used to track events inside + // Google Test. + TestEventListeners listeners_; + + // The OS stack trace getter. Will be deleted when the UnitTest + // object is destructed. By default, an OsStackTraceGetter is used, + // but the user can set this field to use a custom getter if that is + // desired. + OsStackTraceGetterInterface* os_stack_trace_getter_; + + // True iff PostFlagParsingInit() has been called. + bool post_flag_parse_init_performed_; + + // The random number seed used at the beginning of the test run. + int random_seed_; + + // Our random number generator. + internal::Random random_; + + // How long the test took to run, in milliseconds. + TimeInMillis elapsed_time_; + +#if GTEST_HAS_DEATH_TEST + // The decomposed components of the gtest_internal_run_death_test flag, + // parsed when RUN_ALL_TESTS is called. + internal::scoped_ptr internal_run_death_test_flag_; + internal::scoped_ptr death_test_factory_; +#endif // GTEST_HAS_DEATH_TEST + + // A per-thread stack of traces created by the SCOPED_TRACE() macro. + internal::ThreadLocal > gtest_trace_stack_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl); +}; // class UnitTestImpl + +// Convenience function for accessing the global UnitTest +// implementation object. +inline UnitTestImpl* GetUnitTestImpl() { + return UnitTest::GetInstance()->impl(); +} + +// Internal helper functions for implementing the simple regular +// expression matcher. +GTEST_API_ bool IsInSet(char ch, const char* str); +GTEST_API_ bool IsDigit(char ch); +GTEST_API_ bool IsPunct(char ch); +GTEST_API_ bool IsRepeat(char ch); +GTEST_API_ bool IsWhiteSpace(char ch); +GTEST_API_ bool IsWordChar(char ch); +GTEST_API_ bool IsValidEscape(char ch); +GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch); +GTEST_API_ bool ValidateRegex(const char* regex); +GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str); +GTEST_API_ bool MatchRepetitionAndRegexAtHead( + bool escaped, char ch, char repeat, const char* regex, const char* str); +GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str); + +// Parses the command line for Google Test flags, without initializing +// other parts of Google Test. +GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv); +GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv); + +#if GTEST_HAS_DEATH_TEST + +// Returns the message describing the last system error, regardless of the +// platform. +String GetLastErrnoDescription(); + +#if GTEST_OS_WINDOWS +// Provides leak-safe Windows kernel handle ownership. +class AutoHandle { + public: + AutoHandle() : handle_(INVALID_HANDLE_VALUE) {} + explicit AutoHandle(HANDLE handle) : handle_(handle) {} + + ~AutoHandle() { Reset(); } + + HANDLE Get() const { return handle_; } + void Reset() { Reset(INVALID_HANDLE_VALUE); } + void Reset(HANDLE handle) { + if (handle != handle_) { + if (handle_ != INVALID_HANDLE_VALUE) + ::CloseHandle(handle_); + handle_ = handle; + } + } + + private: + HANDLE handle_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); +}; +#endif // GTEST_OS_WINDOWS + +// Attempts to parse a string into a positive integer pointed to by the +// number parameter. Returns true if that is possible. +// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use +// it here. +template +bool ParseNaturalNumber(const ::std::string& str, Integer* number) { + // Fail fast if the given string does not begin with a digit; + // this bypasses strtoXXX's "optional leading whitespace and plus + // or minus sign" semantics, which are undesirable here. + if (str.empty() || !isdigit(str[0])) { + return false; + } + errno = 0; + + char* end; + // BiggestConvertible is the largest integer type that system-provided + // string-to-number conversion routines can return. +#if GTEST_OS_WINDOWS && !defined(__GNUC__) + // MSVC and C++ Builder define __int64 instead of the standard long long. + typedef unsigned __int64 BiggestConvertible; + const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10); +#else + typedef unsigned long long BiggestConvertible; // NOLINT + const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10); +#endif // GTEST_OS_WINDOWS && !defined(__GNUC__) + const bool parse_success = *end == '\0' && errno == 0; + + // TODO(vladl@google.com): Convert this to compile time assertion when it is + // available. + GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed)); + + const Integer result = static_cast(parsed); + if (parse_success && static_cast(result) == parsed) { + *number = result; + return true; + } + return false; +} +#endif // GTEST_HAS_DEATH_TEST + +// TestResult contains some private methods that should be hidden from +// Google Test user but are required for testing. This class allow our tests +// to access them. +// +// This class is supplied only for the purpose of testing Google Test's own +// constructs. Do not use it in user tests, either directly or indirectly. +class TestResultAccessor { + public: + static void RecordProperty(TestResult* test_result, + const TestProperty& property) { + test_result->RecordProperty(property); + } + + static void ClearTestPartResults(TestResult* test_result) { + test_result->ClearTestPartResults(); + } + + static const std::vector& test_part_results( + const TestResult& test_result) { + return test_result.test_part_results(); + } +}; + +} // namespace internal +} // namespace testing + +#endif // GTEST_SRC_GTEST_INTERNAL_INL_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc new file mode 100644 index 000000000..b9504f56a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc @@ -0,0 +1,711 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include + +#include +#include +#include + +#if GTEST_OS_WINDOWS_MOBILE +#include // For TerminateProcess() +#elif GTEST_OS_WINDOWS +#include +#include +#else +#include +#endif // GTEST_OS_WINDOWS_MOBILE + +#if GTEST_OS_MAC +#include +#include +#include +#endif // GTEST_OS_MAC + +#include +#include +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +namespace testing { +namespace internal { + +#if defined(_MSC_VER) || defined(__BORLANDC__) +// MSVC and C++Builder do not provide a definition of STDERR_FILENO. +const int kStdOutFileno = 1; +const int kStdErrFileno = 2; +#else +const int kStdOutFileno = STDOUT_FILENO; +const int kStdErrFileno = STDERR_FILENO; +#endif // _MSC_VER + +#if GTEST_OS_MAC + +// Returns the number of threads running in the process, or 0 to indicate that +// we cannot detect it. +size_t GetThreadCount() { + const task_t task = mach_task_self(); + mach_msg_type_number_t thread_count; + thread_act_array_t thread_list; + const kern_return_t status = task_threads(task, &thread_list, &thread_count); + if (status == KERN_SUCCESS) { + // task_threads allocates resources in thread_list and we need to free them + // to avoid leaks. + vm_deallocate(task, + reinterpret_cast(thread_list), + sizeof(thread_t) * thread_count); + return static_cast(thread_count); + } else { + return 0; + } +} + +#else + +size_t GetThreadCount() { + // There's no portable way to detect the number of threads, so we just + // return 0 to indicate that we cannot detect it. + return 0; +} + +#endif // GTEST_OS_MAC + +#if GTEST_USES_POSIX_RE + +// Implements RE. Currently only needed for death tests. + +RE::~RE() { + if (is_valid_) { + // regfree'ing an invalid regex might crash because the content + // of the regex is undefined. Since the regex's are essentially + // the same, one cannot be valid (or invalid) without the other + // being so too. + regfree(&partial_regex_); + regfree(&full_regex_); + } + free(const_cast(pattern_)); +} + +// Returns true iff regular expression re matches the entire str. +bool RE::FullMatch(const char* str, const RE& re) { + if (!re.is_valid_) return false; + + regmatch_t match; + return regexec(&re.full_regex_, str, 1, &match, 0) == 0; +} + +// Returns true iff regular expression re matches a substring of str +// (including str itself). +bool RE::PartialMatch(const char* str, const RE& re) { + if (!re.is_valid_) return false; + + regmatch_t match; + return regexec(&re.partial_regex_, str, 1, &match, 0) == 0; +} + +// Initializes an RE from its string representation. +void RE::Init(const char* regex) { + pattern_ = posix::StrDup(regex); + + // Reserves enough bytes to hold the regular expression used for a + // full match. + const size_t full_regex_len = strlen(regex) + 10; + char* const full_pattern = new char[full_regex_len]; + + snprintf(full_pattern, full_regex_len, "^(%s)$", regex); + is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0; + // We want to call regcomp(&partial_regex_, ...) even if the + // previous expression returns false. Otherwise partial_regex_ may + // not be properly initialized can may cause trouble when it's + // freed. + // + // Some implementation of POSIX regex (e.g. on at least some + // versions of Cygwin) doesn't accept the empty string as a valid + // regex. We change it to an equivalent form "()" to be safe. + if (is_valid_) { + const char* const partial_regex = (*regex == '\0') ? "()" : regex; + is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0; + } + EXPECT_TRUE(is_valid_) + << "Regular expression \"" << regex + << "\" is not a valid POSIX Extended regular expression."; + + delete[] full_pattern; +} + +#elif GTEST_USES_SIMPLE_RE + +// Returns true iff ch appears anywhere in str (excluding the +// terminating '\0' character). +bool IsInSet(char ch, const char* str) { + return ch != '\0' && strchr(str, ch) != NULL; +} + +// Returns true iff ch belongs to the given classification. Unlike +// similar functions in , these aren't affected by the +// current locale. +bool IsDigit(char ch) { return '0' <= ch && ch <= '9'; } +bool IsPunct(char ch) { + return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"); +} +bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); } +bool IsWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); } +bool IsWordChar(char ch) { + return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || + ('0' <= ch && ch <= '9') || ch == '_'; +} + +// Returns true iff "\\c" is a supported escape sequence. +bool IsValidEscape(char c) { + return (IsPunct(c) || IsInSet(c, "dDfnrsStvwW")); +} + +// Returns true iff the given atom (specified by escaped and pattern) +// matches ch. The result is undefined if the atom is invalid. +bool AtomMatchesChar(bool escaped, char pattern_char, char ch) { + if (escaped) { // "\\p" where p is pattern_char. + switch (pattern_char) { + case 'd': return IsDigit(ch); + case 'D': return !IsDigit(ch); + case 'f': return ch == '\f'; + case 'n': return ch == '\n'; + case 'r': return ch == '\r'; + case 's': return IsWhiteSpace(ch); + case 'S': return !IsWhiteSpace(ch); + case 't': return ch == '\t'; + case 'v': return ch == '\v'; + case 'w': return IsWordChar(ch); + case 'W': return !IsWordChar(ch); + } + return IsPunct(pattern_char) && pattern_char == ch; + } + + return (pattern_char == '.' && ch != '\n') || pattern_char == ch; +} + +// Helper function used by ValidateRegex() to format error messages. +String FormatRegexSyntaxError(const char* regex, int index) { + return (Message() << "Syntax error at index " << index + << " in simple regular expression \"" << regex << "\": ").GetString(); +} + +// Generates non-fatal failures and returns false if regex is invalid; +// otherwise returns true. +bool ValidateRegex(const char* regex) { + if (regex == NULL) { + // TODO(wan@google.com): fix the source file location in the + // assertion failures to match where the regex is used in user + // code. + ADD_FAILURE() << "NULL is not a valid simple regular expression."; + return false; + } + + bool is_valid = true; + + // True iff ?, *, or + can follow the previous atom. + bool prev_repeatable = false; + for (int i = 0; regex[i]; i++) { + if (regex[i] == '\\') { // An escape sequence + i++; + if (regex[i] == '\0') { + ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) + << "'\\' cannot appear at the end."; + return false; + } + + if (!IsValidEscape(regex[i])) { + ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1) + << "invalid escape sequence \"\\" << regex[i] << "\"."; + is_valid = false; + } + prev_repeatable = true; + } else { // Not an escape sequence. + const char ch = regex[i]; + + if (ch == '^' && i > 0) { + ADD_FAILURE() << FormatRegexSyntaxError(regex, i) + << "'^' can only appear at the beginning."; + is_valid = false; + } else if (ch == '$' && regex[i + 1] != '\0') { + ADD_FAILURE() << FormatRegexSyntaxError(regex, i) + << "'$' can only appear at the end."; + is_valid = false; + } else if (IsInSet(ch, "()[]{}|")) { + ADD_FAILURE() << FormatRegexSyntaxError(regex, i) + << "'" << ch << "' is unsupported."; + is_valid = false; + } else if (IsRepeat(ch) && !prev_repeatable) { + ADD_FAILURE() << FormatRegexSyntaxError(regex, i) + << "'" << ch << "' can only follow a repeatable token."; + is_valid = false; + } + + prev_repeatable = !IsInSet(ch, "^$?*+"); + } + } + + return is_valid; +} + +// Matches a repeated regex atom followed by a valid simple regular +// expression. The regex atom is defined as c if escaped is false, +// or \c otherwise. repeat is the repetition meta character (?, *, +// or +). The behavior is undefined if str contains too many +// characters to be indexable by size_t, in which case the test will +// probably time out anyway. We are fine with this limitation as +// std::string has it too. +bool MatchRepetitionAndRegexAtHead( + bool escaped, char c, char repeat, const char* regex, + const char* str) { + const size_t min_count = (repeat == '+') ? 1 : 0; + const size_t max_count = (repeat == '?') ? 1 : + static_cast(-1) - 1; + // We cannot call numeric_limits::max() as it conflicts with the + // max() macro on Windows. + + for (size_t i = 0; i <= max_count; ++i) { + // We know that the atom matches each of the first i characters in str. + if (i >= min_count && MatchRegexAtHead(regex, str + i)) { + // We have enough matches at the head, and the tail matches too. + // Since we only care about *whether* the pattern matches str + // (as opposed to *how* it matches), there is no need to find a + // greedy match. + return true; + } + if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i])) + return false; + } + return false; +} + +// Returns true iff regex matches a prefix of str. regex must be a +// valid simple regular expression and not start with "^", or the +// result is undefined. +bool MatchRegexAtHead(const char* regex, const char* str) { + if (*regex == '\0') // An empty regex matches a prefix of anything. + return true; + + // "$" only matches the end of a string. Note that regex being + // valid guarantees that there's nothing after "$" in it. + if (*regex == '$') + return *str == '\0'; + + // Is the first thing in regex an escape sequence? + const bool escaped = *regex == '\\'; + if (escaped) + ++regex; + if (IsRepeat(regex[1])) { + // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so + // here's an indirect recursion. It terminates as the regex gets + // shorter in each recursion. + return MatchRepetitionAndRegexAtHead( + escaped, regex[0], regex[1], regex + 2, str); + } else { + // regex isn't empty, isn't "$", and doesn't start with a + // repetition. We match the first atom of regex with the first + // character of str and recurse. + return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) && + MatchRegexAtHead(regex + 1, str + 1); + } +} + +// Returns true iff regex matches any substring of str. regex must be +// a valid simple regular expression, or the result is undefined. +// +// The algorithm is recursive, but the recursion depth doesn't exceed +// the regex length, so we won't need to worry about running out of +// stack space normally. In rare cases the time complexity can be +// exponential with respect to the regex length + the string length, +// but usually it's must faster (often close to linear). +bool MatchRegexAnywhere(const char* regex, const char* str) { + if (regex == NULL || str == NULL) + return false; + + if (*regex == '^') + return MatchRegexAtHead(regex + 1, str); + + // A successful match can be anywhere in str. + do { + if (MatchRegexAtHead(regex, str)) + return true; + } while (*str++ != '\0'); + return false; +} + +// Implements the RE class. + +RE::~RE() { + free(const_cast(pattern_)); + free(const_cast(full_pattern_)); +} + +// Returns true iff regular expression re matches the entire str. +bool RE::FullMatch(const char* str, const RE& re) { + return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str); +} + +// Returns true iff regular expression re matches a substring of str +// (including str itself). +bool RE::PartialMatch(const char* str, const RE& re) { + return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str); +} + +// Initializes an RE from its string representation. +void RE::Init(const char* regex) { + pattern_ = full_pattern_ = NULL; + if (regex != NULL) { + pattern_ = posix::StrDup(regex); + } + + is_valid_ = ValidateRegex(regex); + if (!is_valid_) { + // No need to calculate the full pattern when the regex is invalid. + return; + } + + const size_t len = strlen(regex); + // Reserves enough bytes to hold the regular expression used for a + // full match: we need space to prepend a '^', append a '$', and + // terminate the string with '\0'. + char* buffer = static_cast(malloc(len + 3)); + full_pattern_ = buffer; + + if (*regex != '^') + *buffer++ = '^'; // Makes sure full_pattern_ starts with '^'. + + // We don't use snprintf or strncpy, as they trigger a warning when + // compiled with VC++ 8.0. + memcpy(buffer, regex, len); + buffer += len; + + if (len == 0 || regex[len - 1] != '$') + *buffer++ = '$'; // Makes sure full_pattern_ ends with '$'. + + *buffer = '\0'; +} + +#endif // GTEST_USES_POSIX_RE + + +GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line) + : severity_(severity) { + const char* const marker = + severity == GTEST_INFO ? "[ INFO ]" : + severity == GTEST_WARNING ? "[WARNING]" : + severity == GTEST_ERROR ? "[ ERROR ]" : "[ FATAL ]"; + GetStream() << ::std::endl << marker << " " + << FormatFileLocation(file, line).c_str() << ": "; +} + +// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. +GTestLog::~GTestLog() { + GetStream() << ::std::endl; + if (severity_ == GTEST_FATAL) { + fflush(stderr); + posix::Abort(); + } +} +// Disable Microsoft deprecation warnings for POSIX functions called from +// this class (creat, dup, dup2, and close) +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4996) +#endif // _MSC_VER + +#if GTEST_HAS_STREAM_REDIRECTION_ + +// Object that captures an output stream (stdout/stderr). +class CapturedStream { + public: + // The ctor redirects the stream to a temporary file. + CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) { +#if GTEST_OS_WINDOWS + char temp_dir_path[MAX_PATH + 1] = { '\0' }; // NOLINT + char temp_file_path[MAX_PATH + 1] = { '\0' }; // NOLINT + + ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path); + const UINT success = ::GetTempFileNameA(temp_dir_path, + "gtest_redir", + 0, // Generate unique file name. + temp_file_path); + GTEST_CHECK_(success != 0) + << "Unable to create a temporary file in " << temp_dir_path; + const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE); + GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file " + << temp_file_path; + filename_ = temp_file_path; +#else + // There's no guarantee that a test has write access to the + // current directory, so we create the temporary file in the /tmp + // directory instead. + char name_template[] = "/tmp/captured_stream.XXXXXX"; + const int captured_fd = mkstemp(name_template); + filename_ = name_template; +#endif // GTEST_OS_WINDOWS + fflush(NULL); + dup2(captured_fd, fd_); + close(captured_fd); + } + + ~CapturedStream() { + remove(filename_.c_str()); + } + + String GetCapturedString() { + if (uncaptured_fd_ != -1) { + // Restores the original stream. + fflush(NULL); + dup2(uncaptured_fd_, fd_); + close(uncaptured_fd_); + uncaptured_fd_ = -1; + } + + FILE* const file = posix::FOpen(filename_.c_str(), "r"); + const String content = ReadEntireFile(file); + posix::FClose(file); + return content; + } + + private: + // Reads the entire content of a file as a String. + static String ReadEntireFile(FILE* file); + + // Returns the size (in bytes) of a file. + static size_t GetFileSize(FILE* file); + + const int fd_; // A stream to capture. + int uncaptured_fd_; + // Name of the temporary file holding the stderr output. + ::std::string filename_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream); +}; + +// Returns the size (in bytes) of a file. +size_t CapturedStream::GetFileSize(FILE* file) { + fseek(file, 0, SEEK_END); + return static_cast(ftell(file)); +} + +// Reads the entire content of a file as a string. +String CapturedStream::ReadEntireFile(FILE* file) { + const size_t file_size = GetFileSize(file); + char* const buffer = new char[file_size]; + + size_t bytes_last_read = 0; // # of bytes read in the last fread() + size_t bytes_read = 0; // # of bytes read so far + + fseek(file, 0, SEEK_SET); + + // Keeps reading the file until we cannot read further or the + // pre-determined file size is reached. + do { + bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file); + bytes_read += bytes_last_read; + } while (bytes_last_read > 0 && bytes_read < file_size); + + const String content(buffer, bytes_read); + delete[] buffer; + + return content; +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER + +static CapturedStream* g_captured_stderr = NULL; +static CapturedStream* g_captured_stdout = NULL; + +// Starts capturing an output stream (stdout/stderr). +void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) { + if (*stream != NULL) { + GTEST_LOG_(FATAL) << "Only one " << stream_name + << " capturer can exist at a time."; + } + *stream = new CapturedStream(fd); +} + +// Stops capturing the output stream and returns the captured string. +String GetCapturedStream(CapturedStream** captured_stream) { + const String content = (*captured_stream)->GetCapturedString(); + + delete *captured_stream; + *captured_stream = NULL; + + return content; +} + +// Starts capturing stdout. +void CaptureStdout() { + CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout); +} + +// Starts capturing stderr. +void CaptureStderr() { + CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr); +} + +// Stops capturing stdout and returns the captured string. +String GetCapturedStdout() { return GetCapturedStream(&g_captured_stdout); } + +// Stops capturing stderr and returns the captured string. +String GetCapturedStderr() { return GetCapturedStream(&g_captured_stderr); } + +#endif // GTEST_HAS_STREAM_REDIRECTION_ + +#if GTEST_HAS_DEATH_TEST + +// A copy of all command line arguments. Set by InitGoogleTest(). +::std::vector g_argvs; + +// Returns the command line as a vector of strings. +const ::std::vector& GetArgvs() { return g_argvs; } + +#endif // GTEST_HAS_DEATH_TEST + +#if GTEST_OS_WINDOWS_MOBILE +namespace posix { +void Abort() { + DebugBreak(); + TerminateProcess(GetCurrentProcess(), 1); +} +} // namespace posix +#endif // GTEST_OS_WINDOWS_MOBILE + +// Returns the name of the environment variable corresponding to the +// given flag. For example, FlagToEnvVar("foo") will return +// "GTEST_FOO" in the open-source version. +static String FlagToEnvVar(const char* flag) { + const String full_flag = + (Message() << GTEST_FLAG_PREFIX_ << flag).GetString(); + + Message env_var; + for (size_t i = 0; i != full_flag.length(); i++) { + env_var << static_cast(toupper(full_flag.c_str()[i])); + } + + return env_var.GetString(); +} + +// Parses 'str' for a 32-bit signed integer. If successful, writes +// the result to *value and returns true; otherwise leaves *value +// unchanged and returns false. +bool ParseInt32(const Message& src_text, const char* str, Int32* value) { + // Parses the environment variable as a decimal integer. + char* end = NULL; + const long long_value = strtol(str, &end, 10); // NOLINT + + // Has strtol() consumed all characters in the string? + if (*end != '\0') { + // No - an invalid character was encountered. + Message msg; + msg << "WARNING: " << src_text + << " is expected to be a 32-bit integer, but actually" + << " has value \"" << str << "\".\n"; + printf("%s", msg.GetString().c_str()); + fflush(stdout); + return false; + } + + // Is the parsed value in the range of an Int32? + const Int32 result = static_cast(long_value); + if (long_value == LONG_MAX || long_value == LONG_MIN || + // The parsed value overflows as a long. (strtol() returns + // LONG_MAX or LONG_MIN when the input overflows.) + result != long_value + // The parsed value overflows as an Int32. + ) { + Message msg; + msg << "WARNING: " << src_text + << " is expected to be a 32-bit integer, but actually" + << " has value " << str << ", which overflows.\n"; + printf("%s", msg.GetString().c_str()); + fflush(stdout); + return false; + } + + *value = result; + return true; +} + +// Reads and returns the Boolean environment variable corresponding to +// the given flag; if it's not set, returns default_value. +// +// The value is considered true iff it's not "0". +bool BoolFromGTestEnv(const char* flag, bool default_value) { + const String env_var = FlagToEnvVar(flag); + const char* const string_value = posix::GetEnv(env_var.c_str()); + return string_value == NULL ? + default_value : strcmp(string_value, "0") != 0; +} + +// Reads and returns a 32-bit integer stored in the environment +// variable corresponding to the given flag; if it isn't set or +// doesn't represent a valid 32-bit integer, returns default_value. +Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) { + const String env_var = FlagToEnvVar(flag); + const char* const string_value = posix::GetEnv(env_var.c_str()); + if (string_value == NULL) { + // The environment variable is not set. + return default_value; + } + + Int32 result = default_value; + if (!ParseInt32(Message() << "Environment variable " << env_var, + string_value, &result)) { + printf("The default value %s is used.\n", + (Message() << default_value).GetString().c_str()); + fflush(stdout); + return default_value; + } + + return result; +} + +// Reads and returns the string environment variable corresponding to +// the given flag; if it's not set, returns default_value. +const char* StringFromGTestEnv(const char* flag, const char* default_value) { + const String env_var = FlagToEnvVar(flag); + const char* const value = posix::GetEnv(env_var.c_str()); + return value == NULL ? default_value : value; +} + +} // namespace internal +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc new file mode 100644 index 000000000..5d183a446 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc @@ -0,0 +1,110 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: mheule@google.com (Markus Heule) +// +// The Google C++ Testing Framework (Google Test) + +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +namespace testing { + +using internal::GetUnitTestImpl; + +// Gets the summary of the failure message by omitting the stack trace +// in it. +internal::String TestPartResult::ExtractSummary(const char* message) { + const char* const stack_trace = strstr(message, internal::kStackTraceMarker); + return stack_trace == NULL ? internal::String(message) : + internal::String(message, stack_trace - message); +} + +// Prints a TestPartResult object. +std::ostream& operator<<(std::ostream& os, const TestPartResult& result) { + return os + << result.file_name() << ":" << result.line_number() << ": " + << (result.type() == TestPartResult::kSuccess ? "Success" : + result.type() == TestPartResult::kFatalFailure ? "Fatal failure" : + "Non-fatal failure") << ":\n" + << result.message() << std::endl; +} + +// Appends a TestPartResult to the array. +void TestPartResultArray::Append(const TestPartResult& result) { + array_.push_back(result); +} + +// Returns the TestPartResult at the given index (0-based). +const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const { + if (index < 0 || index >= size()) { + printf("\nInvalid index (%d) into TestPartResultArray.\n", index); + internal::posix::Abort(); + } + + return array_[index]; +} + +// Returns the number of TestPartResult objects in the array. +int TestPartResultArray::size() const { + return static_cast(array_.size()); +} + +namespace internal { + +HasNewFatalFailureHelper::HasNewFatalFailureHelper() + : has_new_fatal_failure_(false), + original_reporter_(GetUnitTestImpl()-> + GetTestPartResultReporterForCurrentThread()) { + GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this); +} + +HasNewFatalFailureHelper::~HasNewFatalFailureHelper() { + GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread( + original_reporter_); +} + +void HasNewFatalFailureHelper::ReportTestPartResult( + const TestPartResult& result) { + if (result.fatally_failed()) + has_new_fatal_failure_ = true; + original_reporter_->ReportTestPartResult(result); +} + +} // namespace internal + +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc new file mode 100644 index 000000000..3cc4b5de2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc @@ -0,0 +1,110 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include +#include + +namespace testing { +namespace internal { + +#if GTEST_HAS_TYPED_TEST_P + +// Skips to the first non-space char in str. Returns an empty string if str +// contains only whitespace characters. +static const char* SkipSpaces(const char* str) { + while (isspace(*str)) + str++; + return str; +} + +// Verifies that registered_tests match the test names in +// defined_test_names_; returns registered_tests if successful, or +// aborts the program otherwise. +const char* TypedTestCasePState::VerifyRegisteredTestNames( + const char* file, int line, const char* registered_tests) { + typedef ::std::set::const_iterator DefinedTestIter; + registered_ = true; + + // Skip initial whitespace in registered_tests since some + // preprocessors prefix stringizied literals with whitespace. + registered_tests = SkipSpaces(registered_tests); + + Message errors; + ::std::set tests; + for (const char* names = registered_tests; names != NULL; + names = SkipComma(names)) { + const String name = GetPrefixUntilComma(names); + if (tests.count(name) != 0) { + errors << "Test " << name << " is listed more than once.\n"; + continue; + } + + bool found = false; + for (DefinedTestIter it = defined_test_names_.begin(); + it != defined_test_names_.end(); + ++it) { + if (name == *it) { + found = true; + break; + } + } + + if (found) { + tests.insert(name); + } else { + errors << "No test named " << name + << " can be found in this test case.\n"; + } + } + + for (DefinedTestIter it = defined_test_names_.begin(); + it != defined_test_names_.end(); + ++it) { + if (tests.count(*it) == 0) { + errors << "You forgot to list test " << *it << ".\n"; + } + } + + const String& errors_str = errors.GetString(); + if (errors_str != "") { + fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), + errors_str.c_str()); + fflush(stderr); + posix::Abort(); + } + + return registered_tests; +} + +#endif // GTEST_HAS_TYPED_TEST_P + +} // namespace internal +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc new file mode 100644 index 000000000..342d4582b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc @@ -0,0 +1,4704 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// The Google C++ Testing Framework (Google Test) + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#if GTEST_OS_LINUX + +// TODO(kenton@google.com): Use autoconf to detect availability of +// gettimeofday(). +#define GTEST_HAS_GETTIMEOFDAY_ 1 + +#include +#include +#include +// Declares vsnprintf(). This header is not available on Windows. +#include +#include +#include +#include +#include +#include + +#elif GTEST_OS_SYMBIAN +#define GTEST_HAS_GETTIMEOFDAY_ 1 +#include // NOLINT + +#elif GTEST_OS_ZOS +#define GTEST_HAS_GETTIMEOFDAY_ 1 +#include // NOLINT + +// On z/OS we additionally need strings.h for strcasecmp. +#include // NOLINT + +#elif GTEST_OS_WINDOWS_MOBILE // We are on Windows CE. + +#include // NOLINT + +#elif GTEST_OS_WINDOWS // We are on Windows proper. + +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT + +#if GTEST_OS_WINDOWS_MINGW +// MinGW has gettimeofday() but not _ftime64(). +// TODO(kenton@google.com): Use autoconf to detect availability of +// gettimeofday(). +// TODO(kenton@google.com): There are other ways to get the time on +// Windows, like GetTickCount() or GetSystemTimeAsFileTime(). MinGW +// supports these. consider using them instead. +#define GTEST_HAS_GETTIMEOFDAY_ 1 +#include // NOLINT +#endif // GTEST_OS_WINDOWS_MINGW + +// cpplint thinks that the header is already included, so we want to +// silence it. +#include // NOLINT + +#else + +// Assume other platforms have gettimeofday(). +// TODO(kenton@google.com): Use autoconf to detect availability of +// gettimeofday(). +#define GTEST_HAS_GETTIMEOFDAY_ 1 + +// cpplint thinks that the header is already included, so we want to +// silence it. +#include // NOLINT +#include // NOLINT + +#endif // GTEST_OS_LINUX + +#if GTEST_HAS_EXCEPTIONS +#include +#endif + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +#if GTEST_OS_WINDOWS +#define vsnprintf _vsnprintf +#endif // GTEST_OS_WINDOWS + +namespace testing { + +using internal::CountIf; +using internal::ForEach; +using internal::GetElementOr; +using internal::Shuffle; + +// Constants. + +// A test whose test case name or test name matches this filter is +// disabled and not run. +static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*"; + +// A test case whose name matches this filter is considered a death +// test case and will be run before test cases whose name doesn't +// match this filter. +static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*"; + +// A test filter that matches everything. +static const char kUniversalFilter[] = "*"; + +// The default output file for XML output. +static const char kDefaultOutputFile[] = "test_detail.xml"; + +// The environment variable name for the test shard index. +static const char kTestShardIndex[] = "GTEST_SHARD_INDEX"; +// The environment variable name for the total number of test shards. +static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS"; +// The environment variable name for the test shard status file. +static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE"; + +namespace internal { + +// The text used in failure messages to indicate the start of the +// stack trace. +const char kStackTraceMarker[] = "\nStack trace:\n"; + +// g_help_flag is true iff the --help flag or an equivalent form is +// specified on the command line. +bool g_help_flag = false; + +} // namespace internal + +GTEST_DEFINE_bool_( + also_run_disabled_tests, + internal::BoolFromGTestEnv("also_run_disabled_tests", false), + "Run disabled tests too, in addition to the tests normally being run."); + +GTEST_DEFINE_bool_( + break_on_failure, + internal::BoolFromGTestEnv("break_on_failure", false), + "True iff a failed assertion should be a debugger break-point."); + +GTEST_DEFINE_bool_( + catch_exceptions, + internal::BoolFromGTestEnv("catch_exceptions", false), + "True iff " GTEST_NAME_ + " should catch exceptions and treat them as test failures."); + +GTEST_DEFINE_string_( + color, + internal::StringFromGTestEnv("color", "auto"), + "Whether to use colors in the output. Valid values: yes, no, " + "and auto. 'auto' means to use colors if the output is " + "being sent to a terminal and the TERM environment variable " + "is set to xterm, xterm-color, xterm-256color, linux or cygwin."); + +GTEST_DEFINE_string_( + filter, + internal::StringFromGTestEnv("filter", kUniversalFilter), + "A colon-separated list of glob (not regex) patterns " + "for filtering the tests to run, optionally followed by a " + "'-' and a : separated list of negative patterns (tests to " + "exclude). A test is run if it matches one of the positive " + "patterns and does not match any of the negative patterns."); + +GTEST_DEFINE_bool_(list_tests, false, + "List all tests without running them."); + +GTEST_DEFINE_string_( + output, + internal::StringFromGTestEnv("output", ""), + "A format (currently must be \"xml\"), optionally followed " + "by a colon and an output file name or directory. A directory " + "is indicated by a trailing pathname separator. " + "Examples: \"xml:filename.xml\", \"xml::directoryname/\". " + "If a directory is specified, output files will be created " + "within that directory, with file-names based on the test " + "executable's name and, if necessary, made unique by adding " + "digits."); + +GTEST_DEFINE_bool_( + print_time, + internal::BoolFromGTestEnv("print_time", true), + "True iff " GTEST_NAME_ + " should display elapsed time in text output."); + +GTEST_DEFINE_int32_( + random_seed, + internal::Int32FromGTestEnv("random_seed", 0), + "Random number seed to use when shuffling test orders. Must be in range " + "[1, 99999], or 0 to use a seed based on the current time."); + +GTEST_DEFINE_int32_( + repeat, + internal::Int32FromGTestEnv("repeat", 1), + "How many times to repeat each test. Specify a negative number " + "for repeating forever. Useful for shaking out flaky tests."); + +GTEST_DEFINE_bool_( + show_internal_stack_frames, false, + "True iff " GTEST_NAME_ " should include internal stack frames when " + "printing test failure stack traces."); + +GTEST_DEFINE_bool_( + shuffle, + internal::BoolFromGTestEnv("shuffle", false), + "True iff " GTEST_NAME_ + " should randomize tests' order on every run."); + +GTEST_DEFINE_int32_( + stack_trace_depth, + internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth), + "The maximum number of stack frames to print when an " + "assertion fails. The valid range is 0 through 100, inclusive."); + +GTEST_DEFINE_bool_( + throw_on_failure, + internal::BoolFromGTestEnv("throw_on_failure", false), + "When this flag is specified, a failed assertion will throw an exception " + "if exceptions are enabled or exit the program with a non-zero code " + "otherwise."); + +namespace internal { + +// Generates a random number from [0, range), using a Linear +// Congruential Generator (LCG). Crashes if 'range' is 0 or greater +// than kMaxRange. +UInt32 Random::Generate(UInt32 range) { + // These constants are the same as are used in glibc's rand(3). + state_ = (1103515245U*state_ + 12345U) % kMaxRange; + + GTEST_CHECK_(range > 0) + << "Cannot generate a number in the range [0, 0)."; + GTEST_CHECK_(range <= kMaxRange) + << "Generation of a number in [0, " << range << ") was requested, " + << "but this can only generate numbers in [0, " << kMaxRange << ")."; + + // Converting via modulus introduces a bit of downward bias, but + // it's simple, and a linear congruential generator isn't too good + // to begin with. + return state_ % range; +} + +// GTestIsInitialized() returns true iff the user has initialized +// Google Test. Useful for catching the user mistake of not initializing +// Google Test before calling RUN_ALL_TESTS(). +// +// A user must call testing::InitGoogleTest() to initialize Google +// Test. g_init_gtest_count is set to the number of times +// InitGoogleTest() has been called. We don't protect this variable +// under a mutex as it is only accessed in the main thread. +int g_init_gtest_count = 0; +static bool GTestIsInitialized() { return g_init_gtest_count != 0; } + +// Iterates over a vector of TestCases, keeping a running sum of the +// results of calling a given int-returning method on each. +// Returns the sum. +static int SumOverTestCaseList(const std::vector& case_list, + int (TestCase::*method)() const) { + int sum = 0; + for (size_t i = 0; i < case_list.size(); i++) { + sum += (case_list[i]->*method)(); + } + return sum; +} + +// Returns true iff the test case passed. +static bool TestCasePassed(const TestCase* test_case) { + return test_case->should_run() && test_case->Passed(); +} + +// Returns true iff the test case failed. +static bool TestCaseFailed(const TestCase* test_case) { + return test_case->should_run() && test_case->Failed(); +} + +// Returns true iff test_case contains at least one test that should +// run. +static bool ShouldRunTestCase(const TestCase* test_case) { + return test_case->should_run(); +} + +// AssertHelper constructor. +AssertHelper::AssertHelper(TestPartResult::Type type, + const char* file, + int line, + const char* message) + : data_(new AssertHelperData(type, file, line, message)) { +} + +AssertHelper::~AssertHelper() { + delete data_; +} + +// Message assignment, for assertion streaming support. +void AssertHelper::operator=(const Message& message) const { + UnitTest::GetInstance()-> + AddTestPartResult(data_->type, data_->file, data_->line, + AppendUserMessage(data_->message, message), + UnitTest::GetInstance()->impl() + ->CurrentOsStackTraceExceptTop(1) + // Skips the stack frame for this function itself. + ); // NOLINT +} + +// Mutex for linked pointers. +GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex); + +// Application pathname gotten in InitGoogleTest. +String g_executable_path; + +// Returns the current application's name, removing directory path if that +// is present. +FilePath GetCurrentExecutableName() { + FilePath result; + +#if GTEST_OS_WINDOWS + result.Set(FilePath(g_executable_path).RemoveExtension("exe")); +#else + result.Set(FilePath(g_executable_path)); +#endif // GTEST_OS_WINDOWS + + return result.RemoveDirectoryName(); +} + +// Functions for processing the gtest_output flag. + +// Returns the output format, or "" for normal printed output. +String UnitTestOptions::GetOutputFormat() { + const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); + if (gtest_output_flag == NULL) return String(""); + + const char* const colon = strchr(gtest_output_flag, ':'); + return (colon == NULL) ? + String(gtest_output_flag) : + String(gtest_output_flag, colon - gtest_output_flag); +} + +// Returns the name of the requested output file, or the default if none +// was explicitly specified. +String UnitTestOptions::GetAbsolutePathToOutputFile() { + const char* const gtest_output_flag = GTEST_FLAG(output).c_str(); + if (gtest_output_flag == NULL) + return String(""); + + const char* const colon = strchr(gtest_output_flag, ':'); + if (colon == NULL) + return String(internal::FilePath::ConcatPaths( + internal::FilePath( + UnitTest::GetInstance()->original_working_dir()), + internal::FilePath(kDefaultOutputFile)).ToString() ); + + internal::FilePath output_name(colon + 1); + if (!output_name.IsAbsolutePath()) + // TODO(wan@google.com): on Windows \some\path is not an absolute + // path (as its meaning depends on the current drive), yet the + // following logic for turning it into an absolute path is wrong. + // Fix it. + output_name = internal::FilePath::ConcatPaths( + internal::FilePath(UnitTest::GetInstance()->original_working_dir()), + internal::FilePath(colon + 1)); + + if (!output_name.IsDirectory()) + return output_name.ToString(); + + internal::FilePath result(internal::FilePath::GenerateUniqueFileName( + output_name, internal::GetCurrentExecutableName(), + GetOutputFormat().c_str())); + return result.ToString(); +} + +// Returns true iff the wildcard pattern matches the string. The +// first ':' or '\0' character in pattern marks the end of it. +// +// This recursive algorithm isn't very efficient, but is clear and +// works well enough for matching test names, which are short. +bool UnitTestOptions::PatternMatchesString(const char *pattern, + const char *str) { + switch (*pattern) { + case '\0': + case ':': // Either ':' or '\0' marks the end of the pattern. + return *str == '\0'; + case '?': // Matches any single character. + return *str != '\0' && PatternMatchesString(pattern + 1, str + 1); + case '*': // Matches any string (possibly empty) of characters. + return (*str != '\0' && PatternMatchesString(pattern, str + 1)) || + PatternMatchesString(pattern + 1, str); + default: // Non-special character. Matches itself. + return *pattern == *str && + PatternMatchesString(pattern + 1, str + 1); + } +} + +bool UnitTestOptions::MatchesFilter(const String& name, const char* filter) { + const char *cur_pattern = filter; + for (;;) { + if (PatternMatchesString(cur_pattern, name.c_str())) { + return true; + } + + // Finds the next pattern in the filter. + cur_pattern = strchr(cur_pattern, ':'); + + // Returns if no more pattern can be found. + if (cur_pattern == NULL) { + return false; + } + + // Skips the pattern separater (the ':' character). + cur_pattern++; + } +} + +// TODO(keithray): move String function implementations to gtest-string.cc. + +// Returns true iff the user-specified filter matches the test case +// name and the test name. +bool UnitTestOptions::FilterMatchesTest(const String &test_case_name, + const String &test_name) { + const String& full_name = String::Format("%s.%s", + test_case_name.c_str(), + test_name.c_str()); + + // Split --gtest_filter at '-', if there is one, to separate into + // positive filter and negative filter portions + const char* const p = GTEST_FLAG(filter).c_str(); + const char* const dash = strchr(p, '-'); + String positive; + String negative; + if (dash == NULL) { + positive = GTEST_FLAG(filter).c_str(); // Whole string is a positive filter + negative = String(""); + } else { + positive = String(p, dash - p); // Everything up to the dash + negative = String(dash+1); // Everything after the dash + if (positive.empty()) { + // Treat '-test1' as the same as '*-test1' + positive = kUniversalFilter; + } + } + + // A filter is a colon-separated list of patterns. It matches a + // test if any pattern in it matches the test. + return (MatchesFilter(full_name, positive.c_str()) && + !MatchesFilter(full_name, negative.c_str())); +} + +#if GTEST_OS_WINDOWS +// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the +// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise. +// This function is useful as an __except condition. +int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) { + // Google Test should handle an exception if: + // 1. the user wants it to, AND + // 2. this is not a breakpoint exception. + return (GTEST_FLAG(catch_exceptions) && + exception_code != EXCEPTION_BREAKPOINT) ? + EXCEPTION_EXECUTE_HANDLER : + EXCEPTION_CONTINUE_SEARCH; +} +#endif // GTEST_OS_WINDOWS + +} // namespace internal + +// The c'tor sets this object as the test part result reporter used by +// Google Test. The 'result' parameter specifies where to report the +// results. Intercepts only failures from the current thread. +ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( + TestPartResultArray* result) + : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD), + result_(result) { + Init(); +} + +// The c'tor sets this object as the test part result reporter used by +// Google Test. The 'result' parameter specifies where to report the +// results. +ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter( + InterceptMode intercept_mode, TestPartResultArray* result) + : intercept_mode_(intercept_mode), + result_(result) { + Init(); +} + +void ScopedFakeTestPartResultReporter::Init() { + internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); + if (intercept_mode_ == INTERCEPT_ALL_THREADS) { + old_reporter_ = impl->GetGlobalTestPartResultReporter(); + impl->SetGlobalTestPartResultReporter(this); + } else { + old_reporter_ = impl->GetTestPartResultReporterForCurrentThread(); + impl->SetTestPartResultReporterForCurrentThread(this); + } +} + +// The d'tor restores the test part result reporter used by Google Test +// before. +ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() { + internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); + if (intercept_mode_ == INTERCEPT_ALL_THREADS) { + impl->SetGlobalTestPartResultReporter(old_reporter_); + } else { + impl->SetTestPartResultReporterForCurrentThread(old_reporter_); + } +} + +// Increments the test part result count and remembers the result. +// This method is from the TestPartResultReporterInterface interface. +void ScopedFakeTestPartResultReporter::ReportTestPartResult( + const TestPartResult& result) { + result_->Append(result); +} + +namespace internal { + +// Returns the type ID of ::testing::Test. We should always call this +// instead of GetTypeId< ::testing::Test>() to get the type ID of +// testing::Test. This is to work around a suspected linker bug when +// using Google Test as a framework on Mac OS X. The bug causes +// GetTypeId< ::testing::Test>() to return different values depending +// on whether the call is from the Google Test framework itself or +// from user test code. GetTestTypeId() is guaranteed to always +// return the same value, as it always calls GetTypeId<>() from the +// gtest.cc, which is within the Google Test framework. +TypeId GetTestTypeId() { + return GetTypeId(); +} + +// The value of GetTestTypeId() as seen from within the Google Test +// library. This is solely for testing GetTestTypeId(). +extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId(); + +// This predicate-formatter checks that 'results' contains a test part +// failure of the given type and that the failure message contains the +// given substring. +AssertionResult HasOneFailure(const char* /* results_expr */, + const char* /* type_expr */, + const char* /* substr_expr */, + const TestPartResultArray& results, + TestPartResult::Type type, + const char* substr) { + const String expected(type == TestPartResult::kFatalFailure ? + "1 fatal failure" : + "1 non-fatal failure"); + Message msg; + if (results.size() != 1) { + msg << "Expected: " << expected << "\n" + << " Actual: " << results.size() << " failures"; + for (int i = 0; i < results.size(); i++) { + msg << "\n" << results.GetTestPartResult(i); + } + return AssertionFailure(msg); + } + + const TestPartResult& r = results.GetTestPartResult(0); + if (r.type() != type) { + msg << "Expected: " << expected << "\n" + << " Actual:\n" + << r; + return AssertionFailure(msg); + } + + if (strstr(r.message(), substr) == NULL) { + msg << "Expected: " << expected << " containing \"" + << substr << "\"\n" + << " Actual:\n" + << r; + return AssertionFailure(msg); + } + + return AssertionSuccess(); +} + +// The constructor of SingleFailureChecker remembers where to look up +// test part results, what type of failure we expect, and what +// substring the failure message should contain. +SingleFailureChecker:: SingleFailureChecker( + const TestPartResultArray* results, + TestPartResult::Type type, + const char* substr) + : results_(results), + type_(type), + substr_(substr) {} + +// The destructor of SingleFailureChecker verifies that the given +// TestPartResultArray contains exactly one failure that has the given +// type and contains the given substring. If that's not the case, a +// non-fatal failure will be generated. +SingleFailureChecker::~SingleFailureChecker() { + EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_.c_str()); +} + +DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter( + UnitTestImpl* unit_test) : unit_test_(unit_test) {} + +void DefaultGlobalTestPartResultReporter::ReportTestPartResult( + const TestPartResult& result) { + unit_test_->current_test_result()->AddTestPartResult(result); + unit_test_->listeners()->repeater()->OnTestPartResult(result); +} + +DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter( + UnitTestImpl* unit_test) : unit_test_(unit_test) {} + +void DefaultPerThreadTestPartResultReporter::ReportTestPartResult( + const TestPartResult& result) { + unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result); +} + +// Returns the global test part result reporter. +TestPartResultReporterInterface* +UnitTestImpl::GetGlobalTestPartResultReporter() { + internal::MutexLock lock(&global_test_part_result_reporter_mutex_); + return global_test_part_result_repoter_; +} + +// Sets the global test part result reporter. +void UnitTestImpl::SetGlobalTestPartResultReporter( + TestPartResultReporterInterface* reporter) { + internal::MutexLock lock(&global_test_part_result_reporter_mutex_); + global_test_part_result_repoter_ = reporter; +} + +// Returns the test part result reporter for the current thread. +TestPartResultReporterInterface* +UnitTestImpl::GetTestPartResultReporterForCurrentThread() { + return per_thread_test_part_result_reporter_.get(); +} + +// Sets the test part result reporter for the current thread. +void UnitTestImpl::SetTestPartResultReporterForCurrentThread( + TestPartResultReporterInterface* reporter) { + per_thread_test_part_result_reporter_.set(reporter); +} + +// Gets the number of successful test cases. +int UnitTestImpl::successful_test_case_count() const { + return CountIf(test_cases_, TestCasePassed); +} + +// Gets the number of failed test cases. +int UnitTestImpl::failed_test_case_count() const { + return CountIf(test_cases_, TestCaseFailed); +} + +// Gets the number of all test cases. +int UnitTestImpl::total_test_case_count() const { + return static_cast(test_cases_.size()); +} + +// Gets the number of all test cases that contain at least one test +// that should run. +int UnitTestImpl::test_case_to_run_count() const { + return CountIf(test_cases_, ShouldRunTestCase); +} + +// Gets the number of successful tests. +int UnitTestImpl::successful_test_count() const { + return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count); +} + +// Gets the number of failed tests. +int UnitTestImpl::failed_test_count() const { + return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count); +} + +// Gets the number of disabled tests. +int UnitTestImpl::disabled_test_count() const { + return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count); +} + +// Gets the number of all tests. +int UnitTestImpl::total_test_count() const { + return SumOverTestCaseList(test_cases_, &TestCase::total_test_count); +} + +// Gets the number of tests that should run. +int UnitTestImpl::test_to_run_count() const { + return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count); +} + +// Returns the current OS stack trace as a String. +// +// The maximum number of stack frames to be included is specified by +// the gtest_stack_trace_depth flag. The skip_count parameter +// specifies the number of top frames to be skipped, which doesn't +// count against the number of frames to be included. +// +// For example, if Foo() calls Bar(), which in turn calls +// CurrentOsStackTraceExceptTop(1), Foo() will be included in the +// trace but Bar() and CurrentOsStackTraceExceptTop() won't. +String UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) { + (void)skip_count; + return String(""); +} + +// Returns the current time in milliseconds. +TimeInMillis GetTimeInMillis() { +#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__) + // Difference between 1970-01-01 and 1601-01-01 in milliseconds. + // http://analogous.blogspot.com/2005/04/epoch.html + const TimeInMillis kJavaEpochToWinFileTimeDelta = + static_cast(116444736UL) * 100000UL; + const DWORD kTenthMicrosInMilliSecond = 10000; + + SYSTEMTIME now_systime; + FILETIME now_filetime; + ULARGE_INTEGER now_int64; + // TODO(kenton@google.com): Shouldn't this just use + // GetSystemTimeAsFileTime()? + GetSystemTime(&now_systime); + if (SystemTimeToFileTime(&now_systime, &now_filetime)) { + now_int64.LowPart = now_filetime.dwLowDateTime; + now_int64.HighPart = now_filetime.dwHighDateTime; + now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) - + kJavaEpochToWinFileTimeDelta; + return now_int64.QuadPart; + } + return 0; +#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_ + __timeb64 now; +#ifdef _MSC_VER + // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996 + // (deprecated function) there. + // TODO(kenton@google.com): Use GetTickCount()? Or use + // SystemTimeToFileTime() +#pragma warning(push) // Saves the current warning state. +#pragma warning(disable:4996) // Temporarily disables warning 4996. + _ftime64(&now); +#pragma warning(pop) // Restores the warning state. +#else + _ftime64(&now); +#endif // _MSC_VER + return static_cast(now.time) * 1000 + now.millitm; +#elif GTEST_HAS_GETTIMEOFDAY_ + struct timeval now; + gettimeofday(&now, NULL); + return static_cast(now.tv_sec) * 1000 + now.tv_usec / 1000; +#else +#error "Don't know how to get the current time on your system." +#endif +} + +// Utilities + +// class String + +// Returns the input enclosed in double quotes if it's not NULL; +// otherwise returns "(null)". For example, "\"Hello\"" is returned +// for input "Hello". +// +// This is useful for printing a C string in the syntax of a literal. +// +// Known issue: escape sequences are not handled yet. +String String::ShowCStringQuoted(const char* c_str) { + return c_str ? String::Format("\"%s\"", c_str) : String("(null)"); +} + +// Copies at most length characters from str into a newly-allocated +// piece of memory of size length+1. The memory is allocated with new[]. +// A terminating null byte is written to the memory, and a pointer to it +// is returned. If str is NULL, NULL is returned. +static char* CloneString(const char* str, size_t length) { + if (str == NULL) { + return NULL; + } else { + char* const clone = new char[length + 1]; + posix::StrNCpy(clone, str, length); + clone[length] = '\0'; + return clone; + } +} + +// Clones a 0-terminated C string, allocating memory using new. The +// caller is responsible for deleting[] the return value. Returns the +// cloned string, or NULL if the input is NULL. +const char * String::CloneCString(const char* c_str) { + return (c_str == NULL) ? + NULL : CloneString(c_str, strlen(c_str)); +} + +#if GTEST_OS_WINDOWS_MOBILE +// Creates a UTF-16 wide string from the given ANSI string, allocating +// memory using new. The caller is responsible for deleting the return +// value using delete[]. Returns the wide string, or NULL if the +// input is NULL. +LPCWSTR String::AnsiToUtf16(const char* ansi) { + if (!ansi) return NULL; + const int length = strlen(ansi); + const int unicode_length = + MultiByteToWideChar(CP_ACP, 0, ansi, length, + NULL, 0); + WCHAR* unicode = new WCHAR[unicode_length + 1]; + MultiByteToWideChar(CP_ACP, 0, ansi, length, + unicode, unicode_length); + unicode[unicode_length] = 0; + return unicode; +} + +// Creates an ANSI string from the given wide string, allocating +// memory using new. The caller is responsible for deleting the return +// value using delete[]. Returns the ANSI string, or NULL if the +// input is NULL. +const char* String::Utf16ToAnsi(LPCWSTR utf16_str) { + if (!utf16_str) return NULL; + const int ansi_length = + WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, + NULL, 0, NULL, NULL); + char* ansi = new char[ansi_length + 1]; + WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, + ansi, ansi_length, NULL, NULL); + ansi[ansi_length] = 0; + return ansi; +} + +#endif // GTEST_OS_WINDOWS_MOBILE + +// Compares two C strings. Returns true iff they have the same content. +// +// Unlike strcmp(), this function can handle NULL argument(s). A NULL +// C string is considered different to any non-NULL C string, +// including the empty string. +bool String::CStringEquals(const char * lhs, const char * rhs) { + if ( lhs == NULL ) return rhs == NULL; + + if ( rhs == NULL ) return false; + + return strcmp(lhs, rhs) == 0; +} + +#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING + +// Converts an array of wide chars to a narrow string using the UTF-8 +// encoding, and streams the result to the given Message object. +static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length, + Message* msg) { + // TODO(wan): consider allowing a testing::String object to + // contain '\0'. This will make it behave more like std::string, + // and will allow ToUtf8String() to return the correct encoding + // for '\0' s.t. we can get rid of the conditional here (and in + // several other places). + for (size_t i = 0; i != length; ) { // NOLINT + if (wstr[i] != L'\0') { + *msg << WideStringToUtf8(wstr + i, static_cast(length - i)); + while (i != length && wstr[i] != L'\0') + i++; + } else { + *msg << '\0'; + i++; + } + } +} + +#endif // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING + +} // namespace internal + +#if GTEST_HAS_STD_WSTRING +// Converts the given wide string to a narrow string using the UTF-8 +// encoding, and streams the result to this Message object. +Message& Message::operator <<(const ::std::wstring& wstr) { + internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); + return *this; +} +#endif // GTEST_HAS_STD_WSTRING + +#if GTEST_HAS_GLOBAL_WSTRING +// Converts the given wide string to a narrow string using the UTF-8 +// encoding, and streams the result to this Message object. +Message& Message::operator <<(const ::wstring& wstr) { + internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this); + return *this; +} +#endif // GTEST_HAS_GLOBAL_WSTRING + +namespace internal { + +// Formats a value to be used in a failure message. + +// For a char value, we print it as a C++ char literal and as an +// unsigned integer (both in decimal and in hexadecimal). +String FormatForFailureMessage(char ch) { + const unsigned int ch_as_uint = ch; + // A String object cannot contain '\0', so we print "\\0" when ch is + // '\0'. + return String::Format("'%s' (%u, 0x%X)", + ch ? String::Format("%c", ch).c_str() : "\\0", + ch_as_uint, ch_as_uint); +} + +// For a wchar_t value, we print it as a C++ wchar_t literal and as an +// unsigned integer (both in decimal and in hexidecimal). +String FormatForFailureMessage(wchar_t wchar) { + // The C++ standard doesn't specify the exact size of the wchar_t + // type. It just says that it shall have the same size as another + // integral type, called its underlying type. + // + // Therefore, in order to print a wchar_t value in the numeric form, + // we first convert it to the largest integral type (UInt64) and + // then print the converted value. + // + // We use streaming to print the value as "%llu" doesn't work + // correctly with MSVC 7.1. + const UInt64 wchar_as_uint64 = wchar; + Message msg; + // A String object cannot contain '\0', so we print "\\0" when wchar is + // L'\0'. + char buffer[32]; // CodePointToUtf8 requires a buffer that big. + msg << "L'" + << (wchar ? CodePointToUtf8(static_cast(wchar), buffer) : "\\0") + << "' (" << wchar_as_uint64 << ", 0x" << ::std::setbase(16) + << wchar_as_uint64 << ")"; + return msg.GetString(); +} + +} // namespace internal + +// AssertionResult constructors. +// Used in EXPECT_TRUE/FALSE(assertion_result). +AssertionResult::AssertionResult(const AssertionResult& other) + : success_(other.success_), + message_(other.message_.get() != NULL ? + new internal::String(*other.message_) : + static_cast(NULL)) { +} + +// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. +AssertionResult AssertionResult::operator!() const { + AssertionResult negation(!success_); + if (message_.get() != NULL) + negation << *message_; + return negation; +} + +// Makes a successful assertion result. +AssertionResult AssertionSuccess() { + return AssertionResult(true); +} + +// Makes a failed assertion result. +AssertionResult AssertionFailure() { + return AssertionResult(false); +} + +// Makes a failed assertion result with the given failure message. +// Deprecated; use AssertionFailure() << message. +AssertionResult AssertionFailure(const Message& message) { + return AssertionFailure() << message; +} + +namespace internal { + +// Constructs and returns the message for an equality assertion +// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. +// +// The first four parameters are the expressions used in the assertion +// and their values, as strings. For example, for ASSERT_EQ(foo, bar) +// where foo is 5 and bar is 6, we have: +// +// expected_expression: "foo" +// actual_expression: "bar" +// expected_value: "5" +// actual_value: "6" +// +// The ignoring_case parameter is true iff the assertion is a +// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will +// be inserted into the message. +AssertionResult EqFailure(const char* expected_expression, + const char* actual_expression, + const String& expected_value, + const String& actual_value, + bool ignoring_case) { + Message msg; + msg << "Value of: " << actual_expression; + if (actual_value != actual_expression) { + msg << "\n Actual: " << actual_value; + } + + msg << "\nExpected: " << expected_expression; + if (ignoring_case) { + msg << " (ignoring case)"; + } + if (expected_value != expected_expression) { + msg << "\nWhich is: " << expected_value; + } + + return AssertionFailure(msg); +} + +// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. +String GetBoolAssertionFailureMessage(const AssertionResult& assertion_result, + const char* expression_text, + const char* actual_predicate_value, + const char* expected_predicate_value) { + const char* actual_message = assertion_result.message(); + Message msg; + msg << "Value of: " << expression_text + << "\n Actual: " << actual_predicate_value; + if (actual_message[0] != '\0') + msg << " (" << actual_message << ")"; + msg << "\nExpected: " << expected_predicate_value; + return msg.GetString(); +} + +// Helper function for implementing ASSERT_NEAR. +AssertionResult DoubleNearPredFormat(const char* expr1, + const char* expr2, + const char* abs_error_expr, + double val1, + double val2, + double abs_error) { + const double diff = fabs(val1 - val2); + if (diff <= abs_error) return AssertionSuccess(); + + // TODO(wan): do not print the value of an expression if it's + // already a literal. + Message msg; + msg << "The difference between " << expr1 << " and " << expr2 + << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n" + << expr1 << " evaluates to " << val1 << ",\n" + << expr2 << " evaluates to " << val2 << ", and\n" + << abs_error_expr << " evaluates to " << abs_error << "."; + return AssertionFailure(msg); +} + + +// Helper template for implementing FloatLE() and DoubleLE(). +template +AssertionResult FloatingPointLE(const char* expr1, + const char* expr2, + RawType val1, + RawType val2) { + // Returns success if val1 is less than val2, + if (val1 < val2) { + return AssertionSuccess(); + } + + // or if val1 is almost equal to val2. + const FloatingPoint lhs(val1), rhs(val2); + if (lhs.AlmostEquals(rhs)) { + return AssertionSuccess(); + } + + // Note that the above two checks will both fail if either val1 or + // val2 is NaN, as the IEEE floating-point standard requires that + // any predicate involving a NaN must return false. + + StrStream val1_ss; + val1_ss << std::setprecision(std::numeric_limits::digits10 + 2) + << val1; + + StrStream val2_ss; + val2_ss << std::setprecision(std::numeric_limits::digits10 + 2) + << val2; + + Message msg; + msg << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n" + << " Actual: " << StrStreamToString(&val1_ss) << " vs " + << StrStreamToString(&val2_ss); + + return AssertionFailure(msg); +} + +} // namespace internal + +// Asserts that val1 is less than, or almost equal to, val2. Fails +// otherwise. In particular, it fails if either val1 or val2 is NaN. +AssertionResult FloatLE(const char* expr1, const char* expr2, + float val1, float val2) { + return internal::FloatingPointLE(expr1, expr2, val1, val2); +} + +// Asserts that val1 is less than, or almost equal to, val2. Fails +// otherwise. In particular, it fails if either val1 or val2 is NaN. +AssertionResult DoubleLE(const char* expr1, const char* expr2, + double val1, double val2) { + return internal::FloatingPointLE(expr1, expr2, val1, val2); +} + +namespace internal { + +// The helper function for {ASSERT|EXPECT}_EQ with int or enum +// arguments. +AssertionResult CmpHelperEQ(const char* expected_expression, + const char* actual_expression, + BiggestInt expected, + BiggestInt actual) { + if (expected == actual) { + return AssertionSuccess(); + } + + return EqFailure(expected_expression, + actual_expression, + FormatForComparisonFailureMessage(expected, actual), + FormatForComparisonFailureMessage(actual, expected), + false); +} + +// A macro for implementing the helper functions needed to implement +// ASSERT_?? and EXPECT_?? with integer or enum arguments. It is here +// just to avoid copy-and-paste of similar code. +#define GTEST_IMPL_CMP_HELPER_(op_name, op)\ +AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ + BiggestInt val1, BiggestInt val2) {\ + if (val1 op val2) {\ + return AssertionSuccess();\ + } else {\ + Message msg;\ + msg << "Expected: (" << expr1 << ") " #op " (" << expr2\ + << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\ + << " vs " << FormatForComparisonFailureMessage(val2, val1);\ + return AssertionFailure(msg);\ + }\ +} + +// Implements the helper function for {ASSERT|EXPECT}_NE with int or +// enum arguments. +GTEST_IMPL_CMP_HELPER_(NE, !=) +// Implements the helper function for {ASSERT|EXPECT}_LE with int or +// enum arguments. +GTEST_IMPL_CMP_HELPER_(LE, <=) +// Implements the helper function for {ASSERT|EXPECT}_LT with int or +// enum arguments. +GTEST_IMPL_CMP_HELPER_(LT, < ) +// Implements the helper function for {ASSERT|EXPECT}_GE with int or +// enum arguments. +GTEST_IMPL_CMP_HELPER_(GE, >=) +// Implements the helper function for {ASSERT|EXPECT}_GT with int or +// enum arguments. +GTEST_IMPL_CMP_HELPER_(GT, > ) + +#undef GTEST_IMPL_CMP_HELPER_ + +// The helper function for {ASSERT|EXPECT}_STREQ. +AssertionResult CmpHelperSTREQ(const char* expected_expression, + const char* actual_expression, + const char* expected, + const char* actual) { + if (String::CStringEquals(expected, actual)) { + return AssertionSuccess(); + } + + return EqFailure(expected_expression, + actual_expression, + String::ShowCStringQuoted(expected), + String::ShowCStringQuoted(actual), + false); +} + +// The helper function for {ASSERT|EXPECT}_STRCASEEQ. +AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression, + const char* actual_expression, + const char* expected, + const char* actual) { + if (String::CaseInsensitiveCStringEquals(expected, actual)) { + return AssertionSuccess(); + } + + return EqFailure(expected_expression, + actual_expression, + String::ShowCStringQuoted(expected), + String::ShowCStringQuoted(actual), + true); +} + +// The helper function for {ASSERT|EXPECT}_STRNE. +AssertionResult CmpHelperSTRNE(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2) { + if (!String::CStringEquals(s1, s2)) { + return AssertionSuccess(); + } else { + Message msg; + msg << "Expected: (" << s1_expression << ") != (" + << s2_expression << "), actual: \"" + << s1 << "\" vs \"" << s2 << "\""; + return AssertionFailure(msg); + } +} + +// The helper function for {ASSERT|EXPECT}_STRCASENE. +AssertionResult CmpHelperSTRCASENE(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2) { + if (!String::CaseInsensitiveCStringEquals(s1, s2)) { + return AssertionSuccess(); + } else { + Message msg; + msg << "Expected: (" << s1_expression << ") != (" + << s2_expression << ") (ignoring case), actual: \"" + << s1 << "\" vs \"" << s2 << "\""; + return AssertionFailure(msg); + } +} + +} // namespace internal + +namespace { + +// Helper functions for implementing IsSubString() and IsNotSubstring(). + +// This group of overloaded functions return true iff needle is a +// substring of haystack. NULL is considered a substring of itself +// only. + +bool IsSubstringPred(const char* needle, const char* haystack) { + if (needle == NULL || haystack == NULL) + return needle == haystack; + + return strstr(haystack, needle) != NULL; +} + +bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) { + if (needle == NULL || haystack == NULL) + return needle == haystack; + + return wcsstr(haystack, needle) != NULL; +} + +// StringType here can be either ::std::string or ::std::wstring. +template +bool IsSubstringPred(const StringType& needle, + const StringType& haystack) { + return haystack.find(needle) != StringType::npos; +} + +// This function implements either IsSubstring() or IsNotSubstring(), +// depending on the value of the expected_to_be_substring parameter. +// StringType here can be const char*, const wchar_t*, ::std::string, +// or ::std::wstring. +template +AssertionResult IsSubstringImpl( + bool expected_to_be_substring, + const char* needle_expr, const char* haystack_expr, + const StringType& needle, const StringType& haystack) { + if (IsSubstringPred(needle, haystack) == expected_to_be_substring) + return AssertionSuccess(); + + const bool is_wide_string = sizeof(needle[0]) > 1; + const char* const begin_string_quote = is_wide_string ? "L\"" : "\""; + return AssertionFailure( + Message() + << "Value of: " << needle_expr << "\n" + << " Actual: " << begin_string_quote << needle << "\"\n" + << "Expected: " << (expected_to_be_substring ? "" : "not ") + << "a substring of " << haystack_expr << "\n" + << "Which is: " << begin_string_quote << haystack << "\""); +} + +} // namespace + +// IsSubstring() and IsNotSubstring() check whether needle is a +// substring of haystack (NULL is considered a substring of itself +// only), and return an appropriate error message when they fail. + +AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const char* needle, const char* haystack) { + return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); +} + +AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const wchar_t* needle, const wchar_t* haystack) { + return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); +} + +AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const char* needle, const char* haystack) { + return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); +} + +AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const wchar_t* needle, const wchar_t* haystack) { + return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); +} + +AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::string& needle, const ::std::string& haystack) { + return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); +} + +AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::string& needle, const ::std::string& haystack) { + return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); +} + +#if GTEST_HAS_STD_WSTRING +AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::wstring& needle, const ::std::wstring& haystack) { + return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack); +} + +AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::wstring& needle, const ::std::wstring& haystack) { + return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack); +} +#endif // GTEST_HAS_STD_WSTRING + +namespace internal { + +#if GTEST_OS_WINDOWS + +namespace { + +// Helper function for IsHRESULT{SuccessFailure} predicates +AssertionResult HRESULTFailureHelper(const char* expr, + const char* expected, + long hr) { // NOLINT +#if GTEST_OS_WINDOWS_MOBILE + // Windows CE doesn't support FormatMessage. + const char error_text[] = ""; +#else + // Looks up the human-readable system message for the HRESULT code + // and since we're not passing any params to FormatMessage, we don't + // want inserts expanded. + const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS; + const DWORD kBufSize = 4096; // String::Format can't exceed this length. + // Gets the system's human readable message string for this HRESULT. + char error_text[kBufSize] = { '\0' }; + DWORD message_length = ::FormatMessageA(kFlags, + 0, // no source, we're asking system + hr, // the error + 0, // no line width restrictions + error_text, // output buffer + kBufSize, // buf size + NULL); // no arguments for inserts + // Trims tailing white space (FormatMessage leaves a trailing cr-lf) + for (; message_length && isspace(error_text[message_length - 1]); + --message_length) { + error_text[message_length - 1] = '\0'; + } +#endif // GTEST_OS_WINDOWS_MOBILE + + const String error_hex(String::Format("0x%08X ", hr)); + Message msg; + msg << "Expected: " << expr << " " << expected << ".\n" + << " Actual: " << error_hex << error_text << "\n"; + + return ::testing::AssertionFailure(msg); +} + +} // namespace + +AssertionResult IsHRESULTSuccess(const char* expr, long hr) { // NOLINT + if (SUCCEEDED(hr)) { + return AssertionSuccess(); + } + return HRESULTFailureHelper(expr, "succeeds", hr); +} + +AssertionResult IsHRESULTFailure(const char* expr, long hr) { // NOLINT + if (FAILED(hr)) { + return AssertionSuccess(); + } + return HRESULTFailureHelper(expr, "fails", hr); +} + +#endif // GTEST_OS_WINDOWS + +// Utility functions for encoding Unicode text (wide strings) in +// UTF-8. + +// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8 +// like this: +// +// Code-point length Encoding +// 0 - 7 bits 0xxxxxxx +// 8 - 11 bits 110xxxxx 10xxxxxx +// 12 - 16 bits 1110xxxx 10xxxxxx 10xxxxxx +// 17 - 21 bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx + +// The maximum code-point a one-byte UTF-8 sequence can represent. +const UInt32 kMaxCodePoint1 = (static_cast(1) << 7) - 1; + +// The maximum code-point a two-byte UTF-8 sequence can represent. +const UInt32 kMaxCodePoint2 = (static_cast(1) << (5 + 6)) - 1; + +// The maximum code-point a three-byte UTF-8 sequence can represent. +const UInt32 kMaxCodePoint3 = (static_cast(1) << (4 + 2*6)) - 1; + +// The maximum code-point a four-byte UTF-8 sequence can represent. +const UInt32 kMaxCodePoint4 = (static_cast(1) << (3 + 3*6)) - 1; + +// Chops off the n lowest bits from a bit pattern. Returns the n +// lowest bits. As a side effect, the original bit pattern will be +// shifted to the right by n bits. +inline UInt32 ChopLowBits(UInt32* bits, int n) { + const UInt32 low_bits = *bits & ((static_cast(1) << n) - 1); + *bits >>= n; + return low_bits; +} + +// Converts a Unicode code point to a narrow string in UTF-8 encoding. +// code_point parameter is of type UInt32 because wchar_t may not be +// wide enough to contain a code point. +// The output buffer str must containt at least 32 characters. +// The function returns the address of the output buffer. +// If the code_point is not a valid Unicode code point +// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be output +// as '(Invalid Unicode 0xXXXXXXXX)'. +char* CodePointToUtf8(UInt32 code_point, char* str) { + if (code_point <= kMaxCodePoint1) { + str[1] = '\0'; + str[0] = static_cast(code_point); // 0xxxxxxx + } else if (code_point <= kMaxCodePoint2) { + str[2] = '\0'; + str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx + str[0] = static_cast(0xC0 | code_point); // 110xxxxx + } else if (code_point <= kMaxCodePoint3) { + str[3] = '\0'; + str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx + str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx + str[0] = static_cast(0xE0 | code_point); // 1110xxxx + } else if (code_point <= kMaxCodePoint4) { + str[4] = '\0'; + str[3] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx + str[2] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx + str[1] = static_cast(0x80 | ChopLowBits(&code_point, 6)); // 10xxxxxx + str[0] = static_cast(0xF0 | code_point); // 11110xxx + } else { + // The longest string String::Format can produce when invoked + // with these parameters is 28 character long (not including + // the terminating nul character). We are asking for 32 character + // buffer just in case. This is also enough for strncpy to + // null-terminate the destination string. + posix::StrNCpy( + str, String::Format("(Invalid Unicode 0x%X)", code_point).c_str(), 32); + str[31] = '\0'; // Makes sure no change in the format to strncpy leaves + // the result unterminated. + } + return str; +} + +// The following two functions only make sense if the the system +// uses UTF-16 for wide string encoding. All supported systems +// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16. + +// Determines if the arguments constitute UTF-16 surrogate pair +// and thus should be combined into a single Unicode code point +// using CreateCodePointFromUtf16SurrogatePair. +inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) { + return sizeof(wchar_t) == 2 && + (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00; +} + +// Creates a Unicode code point from UTF16 surrogate pair. +inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, + wchar_t second) { + const UInt32 mask = (1 << 10) - 1; + return (sizeof(wchar_t) == 2) ? + (((first & mask) << 10) | (second & mask)) + 0x10000 : + // This function should not be called when the condition is + // false, but we provide a sensible default in case it is. + static_cast(first); +} + +// Converts a wide string to a narrow string in UTF-8 encoding. +// The wide string is assumed to have the following encoding: +// UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS) +// UTF-32 if sizeof(wchar_t) == 4 (on Linux) +// Parameter str points to a null-terminated wide string. +// Parameter num_chars may additionally limit the number +// of wchar_t characters processed. -1 is used when the entire string +// should be processed. +// If the string contains code points that are not valid Unicode code points +// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output +// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding +// and contains invalid UTF-16 surrogate pairs, values in those pairs +// will be encoded as individual Unicode characters from Basic Normal Plane. +String WideStringToUtf8(const wchar_t* str, int num_chars) { + if (num_chars == -1) + num_chars = static_cast(wcslen(str)); + + StrStream stream; + for (int i = 0; i < num_chars; ++i) { + UInt32 unicode_code_point; + + if (str[i] == L'\0') { + break; + } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) { + unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i], + str[i + 1]); + i++; + } else { + unicode_code_point = static_cast(str[i]); + } + + char buffer[32]; // CodePointToUtf8 requires a buffer this big. + stream << CodePointToUtf8(unicode_code_point, buffer); + } + return StrStreamToString(&stream); +} + +// Converts a wide C string to a String using the UTF-8 encoding. +// NULL will be converted to "(null)". +String String::ShowWideCString(const wchar_t * wide_c_str) { + if (wide_c_str == NULL) return String("(null)"); + + return String(internal::WideStringToUtf8(wide_c_str, -1).c_str()); +} + +// Similar to ShowWideCString(), except that this function encloses +// the converted string in double quotes. +String String::ShowWideCStringQuoted(const wchar_t* wide_c_str) { + if (wide_c_str == NULL) return String("(null)"); + + return String::Format("L\"%s\"", + String::ShowWideCString(wide_c_str).c_str()); +} + +// Compares two wide C strings. Returns true iff they have the same +// content. +// +// Unlike wcscmp(), this function can handle NULL argument(s). A NULL +// C string is considered different to any non-NULL C string, +// including the empty string. +bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) { + if (lhs == NULL) return rhs == NULL; + + if (rhs == NULL) return false; + + return wcscmp(lhs, rhs) == 0; +} + +// Helper function for *_STREQ on wide strings. +AssertionResult CmpHelperSTREQ(const char* expected_expression, + const char* actual_expression, + const wchar_t* expected, + const wchar_t* actual) { + if (String::WideCStringEquals(expected, actual)) { + return AssertionSuccess(); + } + + return EqFailure(expected_expression, + actual_expression, + String::ShowWideCStringQuoted(expected), + String::ShowWideCStringQuoted(actual), + false); +} + +// Helper function for *_STRNE on wide strings. +AssertionResult CmpHelperSTRNE(const char* s1_expression, + const char* s2_expression, + const wchar_t* s1, + const wchar_t* s2) { + if (!String::WideCStringEquals(s1, s2)) { + return AssertionSuccess(); + } + + Message msg; + msg << "Expected: (" << s1_expression << ") != (" + << s2_expression << "), actual: " + << String::ShowWideCStringQuoted(s1) + << " vs " << String::ShowWideCStringQuoted(s2); + return AssertionFailure(msg); +} + +// Compares two C strings, ignoring case. Returns true iff they have +// the same content. +// +// Unlike strcasecmp(), this function can handle NULL argument(s). A +// NULL C string is considered different to any non-NULL C string, +// including the empty string. +bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) { + if (lhs == NULL) + return rhs == NULL; + if (rhs == NULL) + return false; + return posix::StrCaseCmp(lhs, rhs) == 0; +} + + // Compares two wide C strings, ignoring case. Returns true iff they + // have the same content. + // + // Unlike wcscasecmp(), this function can handle NULL argument(s). + // A NULL C string is considered different to any non-NULL wide C string, + // including the empty string. + // NB: The implementations on different platforms slightly differ. + // On windows, this method uses _wcsicmp which compares according to LC_CTYPE + // environment variable. On GNU platform this method uses wcscasecmp + // which compares according to LC_CTYPE category of the current locale. + // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the + // current locale. +bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs, + const wchar_t* rhs) { + if ( lhs == NULL ) return rhs == NULL; + + if ( rhs == NULL ) return false; + +#if GTEST_OS_WINDOWS + return _wcsicmp(lhs, rhs) == 0; +#elif GTEST_OS_LINUX + return wcscasecmp(lhs, rhs) == 0; +#else + // Mac OS X and Cygwin don't define wcscasecmp. Other unknown OSes + // may not define it either. + wint_t left, right; + do { + left = towlower(*lhs++); + right = towlower(*rhs++); + } while (left && left == right); + return left == right; +#endif // OS selector +} + +// Compares this with another String. +// Returns < 0 if this is less than rhs, 0 if this is equal to rhs, or > 0 +// if this is greater than rhs. +int String::Compare(const String & rhs) const { + const char* const lhs_c_str = c_str(); + const char* const rhs_c_str = rhs.c_str(); + + if (lhs_c_str == NULL) { + return rhs_c_str == NULL ? 0 : -1; // NULL < anything except NULL + } else if (rhs_c_str == NULL) { + return 1; + } + + const size_t shorter_str_len = + length() <= rhs.length() ? length() : rhs.length(); + for (size_t i = 0; i != shorter_str_len; i++) { + if (lhs_c_str[i] < rhs_c_str[i]) { + return -1; + } else if (lhs_c_str[i] > rhs_c_str[i]) { + return 1; + } + } + return (length() < rhs.length()) ? -1 : + (length() > rhs.length()) ? 1 : 0; +} + +// Returns true iff this String ends with the given suffix. *Any* +// String is considered to end with a NULL or empty suffix. +bool String::EndsWith(const char* suffix) const { + if (suffix == NULL || CStringEquals(suffix, "")) return true; + + if (c_str() == NULL) return false; + + const size_t this_len = strlen(c_str()); + const size_t suffix_len = strlen(suffix); + return (this_len >= suffix_len) && + CStringEquals(c_str() + this_len - suffix_len, suffix); +} + +// Returns true iff this String ends with the given suffix, ignoring case. +// Any String is considered to end with a NULL or empty suffix. +bool String::EndsWithCaseInsensitive(const char* suffix) const { + if (suffix == NULL || CStringEquals(suffix, "")) return true; + + if (c_str() == NULL) return false; + + const size_t this_len = strlen(c_str()); + const size_t suffix_len = strlen(suffix); + return (this_len >= suffix_len) && + CaseInsensitiveCStringEquals(c_str() + this_len - suffix_len, suffix); +} + +// Formats a list of arguments to a String, using the same format +// spec string as for printf. +// +// We do not use the StringPrintf class as it is not universally +// available. +// +// The result is limited to 4096 characters (including the tailing 0). +// If 4096 characters are not enough to format the input, or if +// there's an error, "" is +// returned. +String String::Format(const char * format, ...) { + va_list args; + va_start(args, format); + + char buffer[4096]; + const int kBufferSize = sizeof(buffer)/sizeof(buffer[0]); + + // MSVC 8 deprecates vsnprintf(), so we want to suppress warning + // 4996 (deprecated function) there. +#ifdef _MSC_VER // We are using MSVC. +#pragma warning(push) // Saves the current warning state. +#pragma warning(disable:4996) // Temporarily disables warning 4996. + const int size = vsnprintf(buffer, kBufferSize, format, args); +#pragma warning(pop) // Restores the warning state. +#else // We are not using MSVC. + const int size = vsnprintf(buffer, kBufferSize, format, args); +#endif // _MSC_VER + va_end(args); + + // vsnprintf()'s behavior is not portable. When the buffer is not + // big enough, it returns a negative value in MSVC, and returns the + // needed buffer size on Linux. When there is an output error, it + // always returns a negative value. For simplicity, we lump the two + // error cases together. + if (size < 0 || size >= kBufferSize) { + return String(""); + } else { + return String(buffer, size); + } +} + +// Converts the buffer in a StrStream to a String, converting NUL +// bytes to "\\0" along the way. +String StrStreamToString(StrStream* ss) { + const ::std::string& str = ss->str(); + const char* const start = str.c_str(); + const char* const end = start + str.length(); + + // We need to use a helper StrStream to do this transformation + // because String doesn't support push_back(). + StrStream helper; + for (const char* ch = start; ch != end; ++ch) { + if (*ch == '\0') { + helper << "\\0"; // Replaces NUL with "\\0"; + } else { + helper.put(*ch); + } + } + + return String(helper.str().c_str()); +} + +// Appends the user-supplied message to the Google-Test-generated message. +String AppendUserMessage(const String& gtest_msg, + const Message& user_msg) { + // Appends the user message if it's non-empty. + const String user_msg_string = user_msg.GetString(); + if (user_msg_string.empty()) { + return gtest_msg; + } + + Message msg; + msg << gtest_msg << "\n" << user_msg_string; + + return msg.GetString(); +} + +} // namespace internal + +// class TestResult + +// Creates an empty TestResult. +TestResult::TestResult() + : death_test_count_(0), + elapsed_time_(0) { +} + +// D'tor. +TestResult::~TestResult() { +} + +// Returns the i-th test part result among all the results. i can +// range from 0 to total_part_count() - 1. If i is not in that range, +// aborts the program. +const TestPartResult& TestResult::GetTestPartResult(int i) const { + if (i < 0 || i >= total_part_count()) + internal::posix::Abort(); + return test_part_results_.at(i); +} + +// Returns the i-th test property. i can range from 0 to +// test_property_count() - 1. If i is not in that range, aborts the +// program. +const TestProperty& TestResult::GetTestProperty(int i) const { + if (i < 0 || i >= test_property_count()) + internal::posix::Abort(); + return test_properties_.at(i); +} + +// Clears the test part results. +void TestResult::ClearTestPartResults() { + test_part_results_.clear(); +} + +// Adds a test part result to the list. +void TestResult::AddTestPartResult(const TestPartResult& test_part_result) { + test_part_results_.push_back(test_part_result); +} + +// Adds a test property to the list. If a property with the same key as the +// supplied property is already represented, the value of this test_property +// replaces the old value for that key. +void TestResult::RecordProperty(const TestProperty& test_property) { + if (!ValidateTestProperty(test_property)) { + return; + } + internal::MutexLock lock(&test_properites_mutex_); + const std::vector::iterator property_with_matching_key = + std::find_if(test_properties_.begin(), test_properties_.end(), + internal::TestPropertyKeyIs(test_property.key())); + if (property_with_matching_key == test_properties_.end()) { + test_properties_.push_back(test_property); + return; + } + property_with_matching_key->SetValue(test_property.value()); +} + +// Adds a failure if the key is a reserved attribute of Google Test +// testcase tags. Returns true if the property is valid. +bool TestResult::ValidateTestProperty(const TestProperty& test_property) { + internal::String key(test_property.key()); + if (key == "name" || key == "status" || key == "time" || key == "classname") { + ADD_FAILURE() + << "Reserved key used in RecordProperty(): " + << key + << " ('name', 'status', 'time', and 'classname' are reserved by " + << GTEST_NAME_ << ")"; + return false; + } + return true; +} + +// Clears the object. +void TestResult::Clear() { + test_part_results_.clear(); + test_properties_.clear(); + death_test_count_ = 0; + elapsed_time_ = 0; +} + +// Returns true iff the test failed. +bool TestResult::Failed() const { + for (int i = 0; i < total_part_count(); ++i) { + if (GetTestPartResult(i).failed()) + return true; + } + return false; +} + +// Returns true iff the test part fatally failed. +static bool TestPartFatallyFailed(const TestPartResult& result) { + return result.fatally_failed(); +} + +// Returns true iff the test fatally failed. +bool TestResult::HasFatalFailure() const { + return CountIf(test_part_results_, TestPartFatallyFailed) > 0; +} + +// Returns true iff the test part non-fatally failed. +static bool TestPartNonfatallyFailed(const TestPartResult& result) { + return result.nonfatally_failed(); +} + +// Returns true iff the test has a non-fatal failure. +bool TestResult::HasNonfatalFailure() const { + return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0; +} + +// Gets the number of all test parts. This is the sum of the number +// of successful test parts and the number of failed test parts. +int TestResult::total_part_count() const { + return static_cast(test_part_results_.size()); +} + +// Returns the number of the test properties. +int TestResult::test_property_count() const { + return static_cast(test_properties_.size()); +} + +// class Test + +// Creates a Test object. + +// The c'tor saves the values of all Google Test flags. +Test::Test() + : gtest_flag_saver_(new internal::GTestFlagSaver) { +} + +// The d'tor restores the values of all Google Test flags. +Test::~Test() { + delete gtest_flag_saver_; +} + +// Sets up the test fixture. +// +// A sub-class may override this. +void Test::SetUp() { +} + +// Tears down the test fixture. +// +// A sub-class may override this. +void Test::TearDown() { +} + +// Allows user supplied key value pairs to be recorded for later output. +void Test::RecordProperty(const char* key, const char* value) { + UnitTest::GetInstance()->RecordPropertyForCurrentTest(key, value); +} + +// Allows user supplied key value pairs to be recorded for later output. +void Test::RecordProperty(const char* key, int value) { + Message value_message; + value_message << value; + RecordProperty(key, value_message.GetString().c_str()); +} + +namespace internal { + +void ReportFailureInUnknownLocation(TestPartResult::Type result_type, + const String& message) { + // This function is a friend of UnitTest and as such has access to + // AddTestPartResult. + UnitTest::GetInstance()->AddTestPartResult( + result_type, + NULL, // No info about the source file where the exception occurred. + -1, // We have no info on which line caused the exception. + message, + String()); // No stack trace, either. +} + +} // namespace internal + +#if GTEST_OS_WINDOWS +// We are on Windows. + +// Adds an "exception thrown" fatal failure to the current test. +static void AddExceptionThrownFailure(DWORD exception_code, + const char* location) { + Message message; + message << "Exception thrown with code 0x" << std::setbase(16) << + exception_code << std::setbase(10) << " in " << location << "."; + + internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure, + message.GetString()); +} + +#endif // GTEST_OS_WINDOWS + +// Google Test requires all tests in the same test case to use the same test +// fixture class. This function checks if the current test has the +// same fixture class as the first test in the current test case. If +// yes, it returns true; otherwise it generates a Google Test failure and +// returns false. +bool Test::HasSameFixtureClass() { + internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); + const TestCase* const test_case = impl->current_test_case(); + + // Info about the first test in the current test case. + const internal::TestInfoImpl* const first_test_info = + test_case->test_info_list()[0]->impl(); + const internal::TypeId first_fixture_id = first_test_info->fixture_class_id(); + const char* const first_test_name = first_test_info->name(); + + // Info about the current test. + const internal::TestInfoImpl* const this_test_info = + impl->current_test_info()->impl(); + const internal::TypeId this_fixture_id = this_test_info->fixture_class_id(); + const char* const this_test_name = this_test_info->name(); + + if (this_fixture_id != first_fixture_id) { + // Is the first test defined using TEST? + const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId(); + // Is this test defined using TEST? + const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId(); + + if (first_is_TEST || this_is_TEST) { + // The user mixed TEST and TEST_F in this test case - we'll tell + // him/her how to fix it. + + // Gets the name of the TEST and the name of the TEST_F. Note + // that first_is_TEST and this_is_TEST cannot both be true, as + // the fixture IDs are different for the two tests. + const char* const TEST_name = + first_is_TEST ? first_test_name : this_test_name; + const char* const TEST_F_name = + first_is_TEST ? this_test_name : first_test_name; + + ADD_FAILURE() + << "All tests in the same test case must use the same test fixture\n" + << "class, so mixing TEST_F and TEST in the same test case is\n" + << "illegal. In test case " << this_test_info->test_case_name() + << ",\n" + << "test " << TEST_F_name << " is defined using TEST_F but\n" + << "test " << TEST_name << " is defined using TEST. You probably\n" + << "want to change the TEST to TEST_F or move it to another test\n" + << "case."; + } else { + // The user defined two fixture classes with the same name in + // two namespaces - we'll tell him/her how to fix it. + ADD_FAILURE() + << "All tests in the same test case must use the same test fixture\n" + << "class. However, in test case " + << this_test_info->test_case_name() << ",\n" + << "you defined test " << first_test_name + << " and test " << this_test_name << "\n" + << "using two different test fixture classes. This can happen if\n" + << "the two classes are from different namespaces or translation\n" + << "units and have the same name. You should probably rename one\n" + << "of the classes to put the tests into different test cases."; + } + return false; + } + + return true; +} + +// Runs the test and updates the test result. +void Test::Run() { + if (!HasSameFixtureClass()) return; + + internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); +#if GTEST_HAS_SEH + // Catch SEH-style exceptions. + impl->os_stack_trace_getter()->UponLeavingGTest(); + __try { + SetUp(); + } __except(internal::UnitTestOptions::GTestShouldProcessSEH( + GetExceptionCode())) { + AddExceptionThrownFailure(GetExceptionCode(), "SetUp()"); + } + + // We will run the test only if SetUp() had no fatal failure. + if (!HasFatalFailure()) { + impl->os_stack_trace_getter()->UponLeavingGTest(); + __try { + TestBody(); + } __except(internal::UnitTestOptions::GTestShouldProcessSEH( + GetExceptionCode())) { + AddExceptionThrownFailure(GetExceptionCode(), "the test body"); + } + } + + // However, we want to clean up as much as possible. Hence we will + // always call TearDown(), even if SetUp() or the test body has + // failed. + impl->os_stack_trace_getter()->UponLeavingGTest(); + __try { + TearDown(); + } __except(internal::UnitTestOptions::GTestShouldProcessSEH( + GetExceptionCode())) { + AddExceptionThrownFailure(GetExceptionCode(), "TearDown()"); + } + +#else // We are on a compiler or platform that doesn't support SEH. + impl->os_stack_trace_getter()->UponLeavingGTest(); + SetUp(); + + // We will run the test only if SetUp() was successful. + if (!HasFatalFailure()) { + impl->os_stack_trace_getter()->UponLeavingGTest(); + TestBody(); + } + + // However, we want to clean up as much as possible. Hence we will + // always call TearDown(), even if SetUp() or the test body has + // failed. + impl->os_stack_trace_getter()->UponLeavingGTest(); + TearDown(); +#endif // GTEST_HAS_SEH +} + + +// Returns true iff the current test has a fatal failure. +bool Test::HasFatalFailure() { + return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure(); +} + +// Returns true iff the current test has a non-fatal failure. +bool Test::HasNonfatalFailure() { + return internal::GetUnitTestImpl()->current_test_result()-> + HasNonfatalFailure(); +} + +// class TestInfo + +// Constructs a TestInfo object. It assumes ownership of the test factory +// object via impl_. +TestInfo::TestInfo(const char* a_test_case_name, + const char* a_name, + const char* a_test_case_comment, + const char* a_comment, + internal::TypeId fixture_class_id, + internal::TestFactoryBase* factory) { + impl_ = new internal::TestInfoImpl(this, a_test_case_name, a_name, + a_test_case_comment, a_comment, + fixture_class_id, factory); +} + +// Destructs a TestInfo object. +TestInfo::~TestInfo() { + delete impl_; +} + +namespace internal { + +// Creates a new TestInfo object and registers it with Google Test; +// returns the created object. +// +// Arguments: +// +// test_case_name: name of the test case +// name: name of the test +// test_case_comment: a comment on the test case that will be included in +// the test output +// comment: a comment on the test that will be included in the +// test output +// fixture_class_id: ID of the test fixture class +// set_up_tc: pointer to the function that sets up the test case +// tear_down_tc: pointer to the function that tears down the test case +// factory: pointer to the factory that creates a test object. +// The newly created TestInfo instance will assume +// ownership of the factory object. +TestInfo* MakeAndRegisterTestInfo( + const char* test_case_name, const char* name, + const char* test_case_comment, const char* comment, + TypeId fixture_class_id, + SetUpTestCaseFunc set_up_tc, + TearDownTestCaseFunc tear_down_tc, + TestFactoryBase* factory) { + TestInfo* const test_info = + new TestInfo(test_case_name, name, test_case_comment, comment, + fixture_class_id, factory); + GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); + return test_info; +} + +#if GTEST_HAS_PARAM_TEST +void ReportInvalidTestCaseType(const char* test_case_name, + const char* file, int line) { + Message errors; + errors + << "Attempted redefinition of test case " << test_case_name << ".\n" + << "All tests in the same test case must use the same test fixture\n" + << "class. However, in test case " << test_case_name << ", you tried\n" + << "to define a test using a fixture class different from the one\n" + << "used earlier. This can happen if the two fixture classes are\n" + << "from different namespaces and have the same name. You should\n" + << "probably rename one of the classes to put the tests into different\n" + << "test cases."; + + fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(), + errors.GetString().c_str()); +} +#endif // GTEST_HAS_PARAM_TEST + +} // namespace internal + +// Returns the test case name. +const char* TestInfo::test_case_name() const { + return impl_->test_case_name(); +} + +// Returns the test name. +const char* TestInfo::name() const { + return impl_->name(); +} + +// Returns the test case comment. +const char* TestInfo::test_case_comment() const { + return impl_->test_case_comment(); +} + +// Returns the test comment. +const char* TestInfo::comment() const { + return impl_->comment(); +} + +// Returns true if this test should run. +bool TestInfo::should_run() const { return impl_->should_run(); } + +// Returns true if this test matches the user-specified filter. +bool TestInfo::matches_filter() const { return impl_->matches_filter(); } + +// Returns the result of the test. +const TestResult* TestInfo::result() const { return impl_->result(); } + +// Increments the number of death tests encountered in this test so +// far. +int TestInfo::increment_death_test_count() { + return impl_->result()->increment_death_test_count(); +} + +namespace { + +// A predicate that checks the test name of a TestInfo against a known +// value. +// +// This is used for implementation of the TestCase class only. We put +// it in the anonymous namespace to prevent polluting the outer +// namespace. +// +// TestNameIs is copyable. +class TestNameIs { + public: + // Constructor. + // + // TestNameIs has NO default constructor. + explicit TestNameIs(const char* name) + : name_(name) {} + + // Returns true iff the test name of test_info matches name_. + bool operator()(const TestInfo * test_info) const { + return test_info && internal::String(test_info->name()).Compare(name_) == 0; + } + + private: + internal::String name_; +}; + +} // namespace + +namespace internal { + +// This method expands all parameterized tests registered with macros TEST_P +// and INSTANTIATE_TEST_CASE_P into regular tests and registers those. +// This will be done just once during the program runtime. +void UnitTestImpl::RegisterParameterizedTests() { +#if GTEST_HAS_PARAM_TEST + if (!parameterized_tests_registered_) { + parameterized_test_registry_.RegisterTests(); + parameterized_tests_registered_ = true; + } +#endif +} + +// Creates the test object, runs it, records its result, and then +// deletes it. +void TestInfoImpl::Run() { + if (!should_run_) return; + + // Tells UnitTest where to store test result. + UnitTestImpl* const impl = internal::GetUnitTestImpl(); + impl->set_current_test_info(parent_); + + TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); + + // Notifies the unit test event listeners that a test is about to start. + repeater->OnTestStart(*parent_); + + const TimeInMillis start = GetTimeInMillis(); + + impl->os_stack_trace_getter()->UponLeavingGTest(); +#if GTEST_HAS_SEH + // Catch SEH-style exceptions. + Test* test = NULL; + + __try { + // Creates the test object. + test = factory_->CreateTest(); + } __except(internal::UnitTestOptions::GTestShouldProcessSEH( + GetExceptionCode())) { + AddExceptionThrownFailure(GetExceptionCode(), + "the test fixture's constructor"); + return; + } +#else // We are on a compiler or platform that doesn't support SEH. + + // TODO(wan): If test->Run() throws, test won't be deleted. This is + // not a problem now as we don't use exceptions. If we were to + // enable exceptions, we should revise the following to be + // exception-safe. + + // Creates the test object. + Test* test = factory_->CreateTest(); +#endif // GTEST_HAS_SEH + + // Runs the test only if the constructor of the test fixture didn't + // generate a fatal failure. + if (!Test::HasFatalFailure()) { + test->Run(); + } + + // Deletes the test object. + impl->os_stack_trace_getter()->UponLeavingGTest(); + delete test; + test = NULL; + + result_.set_elapsed_time(GetTimeInMillis() - start); + + // Notifies the unit test event listener that a test has just finished. + repeater->OnTestEnd(*parent_); + + // Tells UnitTest to stop associating assertion results to this + // test. + impl->set_current_test_info(NULL); +} + +} // namespace internal + +// class TestCase + +// Gets the number of successful tests in this test case. +int TestCase::successful_test_count() const { + return CountIf(test_info_list_, TestPassed); +} + +// Gets the number of failed tests in this test case. +int TestCase::failed_test_count() const { + return CountIf(test_info_list_, TestFailed); +} + +int TestCase::disabled_test_count() const { + return CountIf(test_info_list_, TestDisabled); +} + +// Get the number of tests in this test case that should run. +int TestCase::test_to_run_count() const { + return CountIf(test_info_list_, ShouldRunTest); +} + +// Gets the number of all tests. +int TestCase::total_test_count() const { + return static_cast(test_info_list_.size()); +} + +// Creates a TestCase with the given name. +// +// Arguments: +// +// name: name of the test case +// set_up_tc: pointer to the function that sets up the test case +// tear_down_tc: pointer to the function that tears down the test case +TestCase::TestCase(const char* a_name, const char* a_comment, + Test::SetUpTestCaseFunc set_up_tc, + Test::TearDownTestCaseFunc tear_down_tc) + : name_(a_name), + comment_(a_comment), + set_up_tc_(set_up_tc), + tear_down_tc_(tear_down_tc), + should_run_(false), + elapsed_time_(0) { +} + +// Destructor of TestCase. +TestCase::~TestCase() { + // Deletes every Test in the collection. + ForEach(test_info_list_, internal::Delete); +} + +// Returns the i-th test among all the tests. i can range from 0 to +// total_test_count() - 1. If i is not in that range, returns NULL. +const TestInfo* TestCase::GetTestInfo(int i) const { + const int index = GetElementOr(test_indices_, i, -1); + return index < 0 ? NULL : test_info_list_[index]; +} + +// Returns the i-th test among all the tests. i can range from 0 to +// total_test_count() - 1. If i is not in that range, returns NULL. +TestInfo* TestCase::GetMutableTestInfo(int i) { + const int index = GetElementOr(test_indices_, i, -1); + return index < 0 ? NULL : test_info_list_[index]; +} + +// Adds a test to this test case. Will delete the test upon +// destruction of the TestCase object. +void TestCase::AddTestInfo(TestInfo * test_info) { + test_info_list_.push_back(test_info); + test_indices_.push_back(static_cast(test_indices_.size())); +} + +// Runs every test in this TestCase. +void TestCase::Run() { + if (!should_run_) return; + + internal::UnitTestImpl* const impl = internal::GetUnitTestImpl(); + impl->set_current_test_case(this); + + TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater(); + + repeater->OnTestCaseStart(*this); + impl->os_stack_trace_getter()->UponLeavingGTest(); + set_up_tc_(); + + const internal::TimeInMillis start = internal::GetTimeInMillis(); + for (int i = 0; i < total_test_count(); i++) { + GetMutableTestInfo(i)->impl()->Run(); + } + elapsed_time_ = internal::GetTimeInMillis() - start; + + impl->os_stack_trace_getter()->UponLeavingGTest(); + tear_down_tc_(); + repeater->OnTestCaseEnd(*this); + impl->set_current_test_case(NULL); +} + +// Clears the results of all tests in this test case. +void TestCase::ClearResult() { + ForEach(test_info_list_, internal::TestInfoImpl::ClearTestResult); +} + +// Returns true iff test passed. +bool TestCase::TestPassed(const TestInfo * test_info) { + const internal::TestInfoImpl* const impl = test_info->impl(); + return impl->should_run() && impl->result()->Passed(); +} + +// Returns true iff test failed. +bool TestCase::TestFailed(const TestInfo * test_info) { + const internal::TestInfoImpl* const impl = test_info->impl(); + return impl->should_run() && impl->result()->Failed(); +} + +// Returns true iff test is disabled. +bool TestCase::TestDisabled(const TestInfo * test_info) { + return test_info->impl()->is_disabled(); +} + +// Returns true if the given test should run. +bool TestCase::ShouldRunTest(const TestInfo *test_info) { + return test_info->impl()->should_run(); +} + +// Shuffles the tests in this test case. +void TestCase::ShuffleTests(internal::Random* random) { + Shuffle(random, &test_indices_); +} + +// Restores the test order to before the first shuffle. +void TestCase::UnshuffleTests() { + for (size_t i = 0; i < test_indices_.size(); i++) { + test_indices_[i] = static_cast(i); + } +} + +// Formats a countable noun. Depending on its quantity, either the +// singular form or the plural form is used. e.g. +// +// FormatCountableNoun(1, "formula", "formuli") returns "1 formula". +// FormatCountableNoun(5, "book", "books") returns "5 books". +static internal::String FormatCountableNoun(int count, + const char * singular_form, + const char * plural_form) { + return internal::String::Format("%d %s", count, + count == 1 ? singular_form : plural_form); +} + +// Formats the count of tests. +static internal::String FormatTestCount(int test_count) { + return FormatCountableNoun(test_count, "test", "tests"); +} + +// Formats the count of test cases. +static internal::String FormatTestCaseCount(int test_case_count) { + return FormatCountableNoun(test_case_count, "test case", "test cases"); +} + +// Converts a TestPartResult::Type enum to human-friendly string +// representation. Both kNonFatalFailure and kFatalFailure are translated +// to "Failure", as the user usually doesn't care about the difference +// between the two when viewing the test result. +static const char * TestPartResultTypeToString(TestPartResult::Type type) { + switch (type) { + case TestPartResult::kSuccess: + return "Success"; + + case TestPartResult::kNonFatalFailure: + case TestPartResult::kFatalFailure: +#ifdef _MSC_VER + return "error: "; +#else + return "Failure\n"; +#endif + } + + return "Unknown result type"; +} + +// Prints a TestPartResult to a String. +static internal::String PrintTestPartResultToString( + const TestPartResult& test_part_result) { + return (Message() + << internal::FormatFileLocation(test_part_result.file_name(), + test_part_result.line_number()) + << " " << TestPartResultTypeToString(test_part_result.type()) + << test_part_result.message()).GetString(); +} + +// Prints a TestPartResult. +static void PrintTestPartResult(const TestPartResult& test_part_result) { + const internal::String& result = + PrintTestPartResultToString(test_part_result); + printf("%s\n", result.c_str()); + fflush(stdout); + // If the test program runs in Visual Studio or a debugger, the + // following statements add the test part result message to the Output + // window such that the user can double-click on it to jump to the + // corresponding source code location; otherwise they do nothing. +#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE + // We don't call OutputDebugString*() on Windows Mobile, as printing + // to stdout is done by OutputDebugString() there already - we don't + // want the same message printed twice. + ::OutputDebugStringA(result.c_str()); + ::OutputDebugStringA("\n"); +#endif +} + +// class PrettyUnitTestResultPrinter + +namespace internal { + +enum GTestColor { + COLOR_DEFAULT, + COLOR_RED, + COLOR_GREEN, + COLOR_YELLOW +}; + +#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE + +// Returns the character attribute for the given color. +WORD GetColorAttribute(GTestColor color) { + switch (color) { + case COLOR_RED: return FOREGROUND_RED; + case COLOR_GREEN: return FOREGROUND_GREEN; + case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN; + default: return 0; + } +} + +#else + +// Returns the ANSI color code for the given color. COLOR_DEFAULT is +// an invalid input. +const char* GetAnsiColorCode(GTestColor color) { + switch (color) { + case COLOR_RED: return "1"; + case COLOR_GREEN: return "2"; + case COLOR_YELLOW: return "3"; + default: return NULL; + }; +} + +#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE + +// Returns true iff Google Test should use colors in the output. +bool ShouldUseColor(bool stdout_is_tty) { + const char* const gtest_color = GTEST_FLAG(color).c_str(); + + if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) { +#if GTEST_OS_WINDOWS + // On Windows the TERM variable is usually not set, but the + // console there does support colors. + return stdout_is_tty; +#else + // On non-Windows platforms, we rely on the TERM variable. + const char* const term = posix::GetEnv("TERM"); + const bool term_supports_color = + String::CStringEquals(term, "xterm") || + String::CStringEquals(term, "xterm-color") || + String::CStringEquals(term, "xterm-256color") || + String::CStringEquals(term, "linux") || + String::CStringEquals(term, "cygwin"); + return stdout_is_tty && term_supports_color; +#endif // GTEST_OS_WINDOWS + } + + return String::CaseInsensitiveCStringEquals(gtest_color, "yes") || + String::CaseInsensitiveCStringEquals(gtest_color, "true") || + String::CaseInsensitiveCStringEquals(gtest_color, "t") || + String::CStringEquals(gtest_color, "1"); + // We take "yes", "true", "t", and "1" as meaning "yes". If the + // value is neither one of these nor "auto", we treat it as "no" to + // be conservative. +} + +// Helpers for printing colored strings to stdout. Note that on Windows, we +// cannot simply emit special characters and have the terminal change colors. +// This routine must actually emit the characters rather than return a string +// that would be colored when printed, as can be done on Linux. +void ColoredPrintf(GTestColor color, const char* fmt, ...) { + va_list args; + va_start(args, fmt); + +#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS + const bool use_color = false; +#else + static const bool in_color_mode = + ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0); + const bool use_color = in_color_mode && (color != COLOR_DEFAULT); +#endif // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS + // The '!= 0' comparison is necessary to satisfy MSVC 7.1. + + if (!use_color) { + vprintf(fmt, args); + va_end(args); + return; + } + +#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE + const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE); + + // Gets the current text color. + CONSOLE_SCREEN_BUFFER_INFO buffer_info; + GetConsoleScreenBufferInfo(stdout_handle, &buffer_info); + const WORD old_color_attrs = buffer_info.wAttributes; + + // We need to flush the stream buffers into the console before each + // SetConsoleTextAttribute call lest it affect the text that is already + // printed but has not yet reached the console. + fflush(stdout); + SetConsoleTextAttribute(stdout_handle, + GetColorAttribute(color) | FOREGROUND_INTENSITY); + vprintf(fmt, args); + + fflush(stdout); + // Restores the text color. + SetConsoleTextAttribute(stdout_handle, old_color_attrs); +#else + printf("\033[0;3%sm", GetAnsiColorCode(color)); + vprintf(fmt, args); + printf("\033[m"); // Resets the terminal to default. +#endif // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE + va_end(args); +} + +// This class implements the TestEventListener interface. +// +// Class PrettyUnitTestResultPrinter is copyable. +class PrettyUnitTestResultPrinter : public TestEventListener { + public: + PrettyUnitTestResultPrinter() {} + static void PrintTestName(const char * test_case, const char * test) { + printf("%s.%s", test_case, test); + } + + // The following methods override what's in the TestEventListener class. + virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {} + virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); + virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); + virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {} + virtual void OnTestCaseStart(const TestCase& test_case); + virtual void OnTestStart(const TestInfo& test_info); + virtual void OnTestPartResult(const TestPartResult& result); + virtual void OnTestEnd(const TestInfo& test_info); + virtual void OnTestCaseEnd(const TestCase& test_case); + virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); + virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {} + virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); + virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {} + + private: + static void PrintFailedTests(const UnitTest& unit_test); + + internal::String test_case_name_; +}; + + // Fired before each iteration of tests starts. +void PrettyUnitTestResultPrinter::OnTestIterationStart( + const UnitTest& unit_test, int iteration) { + if (GTEST_FLAG(repeat) != 1) + printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1); + + const char* const filter = GTEST_FLAG(filter).c_str(); + + // Prints the filter if it's not *. This reminds the user that some + // tests may be skipped. + if (!internal::String::CStringEquals(filter, kUniversalFilter)) { + ColoredPrintf(COLOR_YELLOW, + "Note: %s filter = %s\n", GTEST_NAME_, filter); + } + + if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) { + ColoredPrintf(COLOR_YELLOW, + "Note: This is test shard %s of %s.\n", + internal::posix::GetEnv(kTestShardIndex), + internal::posix::GetEnv(kTestTotalShards)); + } + + if (GTEST_FLAG(shuffle)) { + ColoredPrintf(COLOR_YELLOW, + "Note: Randomizing tests' orders with a seed of %d .\n", + unit_test.random_seed()); + } + + ColoredPrintf(COLOR_GREEN, "[==========] "); + printf("Running %s from %s.\n", + FormatTestCount(unit_test.test_to_run_count()).c_str(), + FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); + fflush(stdout); +} + +void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart( + const UnitTest& /*unit_test*/) { + ColoredPrintf(COLOR_GREEN, "[----------] "); + printf("Global test environment set-up.\n"); + fflush(stdout); +} + +void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) { + test_case_name_ = test_case.name(); + const internal::String counts = + FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); + ColoredPrintf(COLOR_GREEN, "[----------] "); + printf("%s from %s", counts.c_str(), test_case_name_.c_str()); + if (test_case.comment()[0] == '\0') { + printf("\n"); + } else { + printf(", where %s\n", test_case.comment()); + } + fflush(stdout); +} + +void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) { + ColoredPrintf(COLOR_GREEN, "[ RUN ] "); + PrintTestName(test_case_name_.c_str(), test_info.name()); + if (test_info.comment()[0] == '\0') { + printf("\n"); + } else { + printf(", where %s\n", test_info.comment()); + } + fflush(stdout); +} + +// Called after an assertion failure. +void PrettyUnitTestResultPrinter::OnTestPartResult( + const TestPartResult& result) { + // If the test part succeeded, we don't need to do anything. + if (result.type() == TestPartResult::kSuccess) + return; + + // Print failure message from the assertion (e.g. expected this and got that). + PrintTestPartResult(result); + fflush(stdout); +} + +void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) { + if (test_info.result()->Passed()) { + ColoredPrintf(COLOR_GREEN, "[ OK ] "); + } else { + ColoredPrintf(COLOR_RED, "[ FAILED ] "); + } + PrintTestName(test_case_name_.c_str(), test_info.name()); + if (GTEST_FLAG(print_time)) { + printf(" (%s ms)\n", internal::StreamableToString( + test_info.result()->elapsed_time()).c_str()); + } else { + printf("\n"); + } + fflush(stdout); +} + +void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) { + if (!GTEST_FLAG(print_time)) return; + + test_case_name_ = test_case.name(); + const internal::String counts = + FormatCountableNoun(test_case.test_to_run_count(), "test", "tests"); + ColoredPrintf(COLOR_GREEN, "[----------] "); + printf("%s from %s (%s ms total)\n\n", + counts.c_str(), test_case_name_.c_str(), + internal::StreamableToString(test_case.elapsed_time()).c_str()); + fflush(stdout); +} + +void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart( + const UnitTest& /*unit_test*/) { + ColoredPrintf(COLOR_GREEN, "[----------] "); + printf("Global test environment tear-down\n"); + fflush(stdout); +} + +// Internal helper for printing the list of failed tests. +void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) { + const int failed_test_count = unit_test.failed_test_count(); + if (failed_test_count == 0) { + return; + } + + for (int i = 0; i < unit_test.total_test_case_count(); ++i) { + const TestCase& test_case = *unit_test.GetTestCase(i); + if (!test_case.should_run() || (test_case.failed_test_count() == 0)) { + continue; + } + for (int j = 0; j < test_case.total_test_count(); ++j) { + const TestInfo& test_info = *test_case.GetTestInfo(j); + if (!test_info.should_run() || test_info.result()->Passed()) { + continue; + } + ColoredPrintf(COLOR_RED, "[ FAILED ] "); + printf("%s.%s", test_case.name(), test_info.name()); + if (test_case.comment()[0] != '\0' || + test_info.comment()[0] != '\0') { + printf(", where %s", test_case.comment()); + if (test_case.comment()[0] != '\0' && + test_info.comment()[0] != '\0') { + printf(" and "); + } + } + printf("%s\n", test_info.comment()); + } + } +} + + void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, + int /*iteration*/) { + ColoredPrintf(COLOR_GREEN, "[==========] "); + printf("%s from %s ran.", + FormatTestCount(unit_test.test_to_run_count()).c_str(), + FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str()); + if (GTEST_FLAG(print_time)) { + printf(" (%s ms total)", + internal::StreamableToString(unit_test.elapsed_time()).c_str()); + } + printf("\n"); + ColoredPrintf(COLOR_GREEN, "[ PASSED ] "); + printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str()); + + int num_failures = unit_test.failed_test_count(); + if (!unit_test.Passed()) { + const int failed_test_count = unit_test.failed_test_count(); + ColoredPrintf(COLOR_RED, "[ FAILED ] "); + printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str()); + PrintFailedTests(unit_test); + printf("\n%2d FAILED %s\n", num_failures, + num_failures == 1 ? "TEST" : "TESTS"); + } + + int num_disabled = unit_test.disabled_test_count(); + if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) { + if (!num_failures) { + printf("\n"); // Add a spacer if no FAILURE banner is displayed. + } + ColoredPrintf(COLOR_YELLOW, + " YOU HAVE %d DISABLED %s\n\n", + num_disabled, + num_disabled == 1 ? "TEST" : "TESTS"); + } + // Ensure that Google Test output is printed before, e.g., heapchecker output. + fflush(stdout); +} + +// End PrettyUnitTestResultPrinter + +// class TestEventRepeater +// +// This class forwards events to other event listeners. +class TestEventRepeater : public TestEventListener { + public: + TestEventRepeater() : forwarding_enabled_(true) {} + virtual ~TestEventRepeater(); + void Append(TestEventListener *listener); + TestEventListener* Release(TestEventListener* listener); + + // Controls whether events will be forwarded to listeners_. Set to false + // in death test child processes. + bool forwarding_enabled() const { return forwarding_enabled_; } + void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; } + + virtual void OnTestProgramStart(const UnitTest& unit_test); + virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration); + virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test); + virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test); + virtual void OnTestCaseStart(const TestCase& test_case); + virtual void OnTestStart(const TestInfo& test_info); + virtual void OnTestPartResult(const TestPartResult& result); + virtual void OnTestEnd(const TestInfo& test_info); + virtual void OnTestCaseEnd(const TestCase& test_case); + virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test); + virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test); + virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); + virtual void OnTestProgramEnd(const UnitTest& unit_test); + + private: + // Controls whether events will be forwarded to listeners_. Set to false + // in death test child processes. + bool forwarding_enabled_; + // The list of listeners that receive events. + std::vector listeners_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater); +}; + +TestEventRepeater::~TestEventRepeater() { + ForEach(listeners_, Delete); +} + +void TestEventRepeater::Append(TestEventListener *listener) { + listeners_.push_back(listener); +} + +// TODO(vladl@google.com): Factor the search functionality into Vector::Find. +TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { + for (size_t i = 0; i < listeners_.size(); ++i) { + if (listeners_[i] == listener) { + listeners_.erase(listeners_.begin() + i); + return listener; + } + } + + return NULL; +} + +// Since most methods are very similar, use macros to reduce boilerplate. +// This defines a member that forwards the call to all listeners. +#define GTEST_REPEATER_METHOD_(Name, Type) \ +void TestEventRepeater::Name(const Type& parameter) { \ + if (forwarding_enabled_) { \ + for (size_t i = 0; i < listeners_.size(); i++) { \ + listeners_[i]->Name(parameter); \ + } \ + } \ +} +// This defines a member that forwards the call to all listeners in reverse +// order. +#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ +void TestEventRepeater::Name(const Type& parameter) { \ + if (forwarding_enabled_) { \ + for (int i = static_cast(listeners_.size()) - 1; i >= 0; i--) { \ + listeners_[i]->Name(parameter); \ + } \ + } \ +} + +GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest) +GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest) +GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase) +GTEST_REPEATER_METHOD_(OnTestStart, TestInfo) +GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult) +GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest) +GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest) +GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest) +GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo) +GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase) +GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest) + +#undef GTEST_REPEATER_METHOD_ +#undef GTEST_REVERSE_REPEATER_METHOD_ + +void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test, + int iteration) { + if (forwarding_enabled_) { + for (size_t i = 0; i < listeners_.size(); i++) { + listeners_[i]->OnTestIterationStart(unit_test, iteration); + } + } +} + +void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, + int iteration) { + if (forwarding_enabled_) { + for (int i = static_cast(listeners_.size()) - 1; i >= 0; i--) { + listeners_[i]->OnTestIterationEnd(unit_test, iteration); + } + } +} + +// End TestEventRepeater + +// This class generates an XML output file. +class XmlUnitTestResultPrinter : public EmptyTestEventListener { + public: + explicit XmlUnitTestResultPrinter(const char* output_file); + + virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration); + + private: + // Is c a whitespace character that is normalized to a space character + // when it appears in an XML attribute value? + static bool IsNormalizableWhitespace(char c) { + return c == 0x9 || c == 0xA || c == 0xD; + } + + // May c appear in a well-formed XML document? + static bool IsValidXmlCharacter(char c) { + return IsNormalizableWhitespace(c) || c >= 0x20; + } + + // Returns an XML-escaped copy of the input string str. If + // is_attribute is true, the text is meant to appear as an attribute + // value, and normalizable whitespace is preserved by replacing it + // with character references. + static String EscapeXml(const char* str, bool is_attribute); + + // Returns the given string with all characters invalid in XML removed. + static String RemoveInvalidXmlCharacters(const char* str); + + // Convenience wrapper around EscapeXml when str is an attribute value. + static String EscapeXmlAttribute(const char* str) { + return EscapeXml(str, true); + } + + // Convenience wrapper around EscapeXml when str is not an attribute value. + static String EscapeXmlText(const char* str) { return EscapeXml(str, false); } + + // Streams an XML CDATA section, escaping invalid CDATA sequences as needed. + static void OutputXmlCDataSection(::std::ostream* stream, const char* data); + + // Streams an XML representation of a TestInfo object. + static void OutputXmlTestInfo(::std::ostream* stream, + const char* test_case_name, + const TestInfo& test_info); + + // Prints an XML representation of a TestCase object + static void PrintXmlTestCase(FILE* out, const TestCase& test_case); + + // Prints an XML summary of unit_test to output stream out. + static void PrintXmlUnitTest(FILE* out, const UnitTest& unit_test); + + // Produces a string representing the test properties in a result as space + // delimited XML attributes based on the property key="value" pairs. + // When the String is not empty, it includes a space at the beginning, + // to delimit this attribute from prior attributes. + static String TestPropertiesAsXmlAttributes(const TestResult& result); + + // The output file. + const String output_file_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter); +}; + +// Creates a new XmlUnitTestResultPrinter. +XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file) + : output_file_(output_file) { + if (output_file_.c_str() == NULL || output_file_.empty()) { + fprintf(stderr, "XML output file may not be null\n"); + fflush(stderr); + exit(EXIT_FAILURE); + } +} + +// Called after the unit test ends. +void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test, + int /*iteration*/) { + FILE* xmlout = NULL; + FilePath output_file(output_file_); + FilePath output_dir(output_file.RemoveFileName()); + + if (output_dir.CreateDirectoriesRecursively()) { + xmlout = posix::FOpen(output_file_.c_str(), "w"); + } + if (xmlout == NULL) { + // TODO(wan): report the reason of the failure. + // + // We don't do it for now as: + // + // 1. There is no urgent need for it. + // 2. It's a bit involved to make the errno variable thread-safe on + // all three operating systems (Linux, Windows, and Mac OS). + // 3. To interpret the meaning of errno in a thread-safe way, + // we need the strerror_r() function, which is not available on + // Windows. + fprintf(stderr, + "Unable to open file \"%s\"\n", + output_file_.c_str()); + fflush(stderr); + exit(EXIT_FAILURE); + } + PrintXmlUnitTest(xmlout, unit_test); + fclose(xmlout); +} + +// Returns an XML-escaped copy of the input string str. If is_attribute +// is true, the text is meant to appear as an attribute value, and +// normalizable whitespace is preserved by replacing it with character +// references. +// +// Invalid XML characters in str, if any, are stripped from the output. +// It is expected that most, if not all, of the text processed by this +// module will consist of ordinary English text. +// If this module is ever modified to produce version 1.1 XML output, +// most invalid characters can be retained using character references. +// TODO(wan): It might be nice to have a minimally invasive, human-readable +// escaping scheme for invalid characters, rather than dropping them. +String XmlUnitTestResultPrinter::EscapeXml(const char* str, bool is_attribute) { + Message m; + + if (str != NULL) { + for (const char* src = str; *src; ++src) { + switch (*src) { + case '<': + m << "<"; + break; + case '>': + m << ">"; + break; + case '&': + m << "&"; + break; + case '\'': + if (is_attribute) + m << "'"; + else + m << '\''; + break; + case '"': + if (is_attribute) + m << """; + else + m << '"'; + break; + default: + if (IsValidXmlCharacter(*src)) { + if (is_attribute && IsNormalizableWhitespace(*src)) + m << String::Format("&#x%02X;", unsigned(*src)); + else + m << *src; + } + break; + } + } + } + + return m.GetString(); +} + +// Returns the given string with all characters invalid in XML removed. +// Currently invalid characters are dropped from the string. An +// alternative is to replace them with certain characters such as . or ?. +String XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(const char* str) { + char* const output = new char[strlen(str) + 1]; + char* appender = output; + for (char ch = *str; ch != '\0'; ch = *++str) + if (IsValidXmlCharacter(ch)) + *appender++ = ch; + *appender = '\0'; + + String ret_value(output); + delete[] output; + return ret_value; +} + +// The following routines generate an XML representation of a UnitTest +// object. +// +// This is how Google Test concepts map to the DTD: +// +// <-- corresponds to a UnitTest object +// <-- corresponds to a TestCase object +// <-- corresponds to a TestInfo object +// ... +// ... +// ... +// <-- individual assertion failures +// +// +// + +// Formats the given time in milliseconds as seconds. +std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) { + ::std::stringstream ss; + ss << ms/1000.0; + return ss.str(); +} + +// Streams an XML CDATA section, escaping invalid CDATA sequences as needed. +void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream, + const char* data) { + const char* segment = data; + *stream << ""); + if (next_segment != NULL) { + stream->write( + segment, static_cast(next_segment - segment)); + *stream << "]]>]]>"); + } else { + *stream << segment; + break; + } + } + *stream << "]]>"; +} + +// Prints an XML representation of a TestInfo object. +// TODO(wan): There is also value in printing properties with the plain printer. +void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream, + const char* test_case_name, + const TestInfo& test_info) { + const TestResult& result = *test_info.result(); + *stream << " \n"; + *stream << " "; + const String message = RemoveInvalidXmlCharacters(String::Format( + "%s:%d\n%s", + part.file_name(), part.line_number(), + part.message()).c_str()); + OutputXmlCDataSection(stream, message.c_str()); + *stream << "\n"; + } + } + + if (failures == 0) + *stream << " />\n"; + else + *stream << " \n"; +} + +// Prints an XML representation of a TestCase object +void XmlUnitTestResultPrinter::PrintXmlTestCase(FILE* out, + const TestCase& test_case) { + fprintf(out, + " \n", + FormatTimeInMillisAsSeconds(test_case.elapsed_time()).c_str()); + for (int i = 0; i < test_case.total_test_count(); ++i) { + StrStream stream; + OutputXmlTestInfo(&stream, test_case.name(), *test_case.GetTestInfo(i)); + fprintf(out, "%s", StrStreamToString(&stream).c_str()); + } + fprintf(out, " \n"); +} + +// Prints an XML summary of unit_test to output stream out. +void XmlUnitTestResultPrinter::PrintXmlUnitTest(FILE* out, + const UnitTest& unit_test) { + fprintf(out, "\n"); + fprintf(out, + "\n"); + for (int i = 0; i < unit_test.total_test_case_count(); ++i) + PrintXmlTestCase(out, *unit_test.GetTestCase(i)); + fprintf(out, "\n"); +} + +// Produces a string representing the test properties in a result as space +// delimited XML attributes based on the property key="value" pairs. +String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes( + const TestResult& result) { + Message attributes; + for (int i = 0; i < result.test_property_count(); ++i) { + const TestProperty& property = result.GetTestProperty(i); + attributes << " " << property.key() << "=" + << "\"" << EscapeXmlAttribute(property.value()) << "\""; + } + return attributes.GetString(); +} + +// End XmlUnitTestResultPrinter + +// Class ScopedTrace + +// Pushes the given source file location and message onto a per-thread +// trace stack maintained by Google Test. +// L < UnitTest::mutex_ +ScopedTrace::ScopedTrace(const char* file, int line, const Message& message) { + TraceInfo trace; + trace.file = file; + trace.line = line; + trace.message = message.GetString(); + + UnitTest::GetInstance()->PushGTestTrace(trace); +} + +// Pops the info pushed by the c'tor. +// L < UnitTest::mutex_ +ScopedTrace::~ScopedTrace() { + UnitTest::GetInstance()->PopGTestTrace(); +} + + +// class OsStackTraceGetter + +// Returns the current OS stack trace as a String. Parameters: +// +// max_depth - the maximum number of stack frames to be included +// in the trace. +// skip_count - the number of top frames to be skipped; doesn't count +// against max_depth. +// +// L < mutex_ +// We use "L < mutex_" to denote that the function may acquire mutex_. +String OsStackTraceGetter::CurrentStackTrace(int, int) { + return String(""); +} + +// L < mutex_ +void OsStackTraceGetter::UponLeavingGTest() { +} + +const char* const +OsStackTraceGetter::kElidedFramesMarker = + "... " GTEST_NAME_ " internal frames ..."; + +} // namespace internal + +// class TestEventListeners + +TestEventListeners::TestEventListeners() + : repeater_(new internal::TestEventRepeater()), + default_result_printer_(NULL), + default_xml_generator_(NULL) { +} + +TestEventListeners::~TestEventListeners() { delete repeater_; } + +// Returns the standard listener responsible for the default console +// output. Can be removed from the listeners list to shut down default +// console output. Note that removing this object from the listener list +// with Release transfers its ownership to the user. +void TestEventListeners::Append(TestEventListener* listener) { + repeater_->Append(listener); +} + +// Removes the given event listener from the list and returns it. It then +// becomes the caller's responsibility to delete the listener. Returns +// NULL if the listener is not found in the list. +TestEventListener* TestEventListeners::Release(TestEventListener* listener) { + if (listener == default_result_printer_) + default_result_printer_ = NULL; + else if (listener == default_xml_generator_) + default_xml_generator_ = NULL; + return repeater_->Release(listener); +} + +// Returns repeater that broadcasts the TestEventListener events to all +// subscribers. +TestEventListener* TestEventListeners::repeater() { return repeater_; } + +// Sets the default_result_printer attribute to the provided listener. +// The listener is also added to the listener list and previous +// default_result_printer is removed from it and deleted. The listener can +// also be NULL in which case it will not be added to the list. Does +// nothing if the previous and the current listener objects are the same. +void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) { + if (default_result_printer_ != listener) { + // It is an error to pass this method a listener that is already in the + // list. + delete Release(default_result_printer_); + default_result_printer_ = listener; + if (listener != NULL) + Append(listener); + } +} + +// Sets the default_xml_generator attribute to the provided listener. The +// listener is also added to the listener list and previous +// default_xml_generator is removed from it and deleted. The listener can +// also be NULL in which case it will not be added to the list. Does +// nothing if the previous and the current listener objects are the same. +void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) { + if (default_xml_generator_ != listener) { + // It is an error to pass this method a listener that is already in the + // list. + delete Release(default_xml_generator_); + default_xml_generator_ = listener; + if (listener != NULL) + Append(listener); + } +} + +// Controls whether events will be forwarded by the repeater to the +// listeners in the list. +bool TestEventListeners::EventForwardingEnabled() const { + return repeater_->forwarding_enabled(); +} + +void TestEventListeners::SuppressEventForwarding() { + repeater_->set_forwarding_enabled(false); +} + +// class UnitTest + +// Gets the singleton UnitTest object. The first time this method is +// called, a UnitTest object is constructed and returned. Consecutive +// calls will return the same object. +// +// We don't protect this under mutex_ as a user is not supposed to +// call this before main() starts, from which point on the return +// value will never change. +UnitTest * UnitTest::GetInstance() { + // When compiled with MSVC 7.1 in optimized mode, destroying the + // UnitTest object upon exiting the program messes up the exit code, + // causing successful tests to appear failed. We have to use a + // different implementation in this case to bypass the compiler bug. + // This implementation makes the compiler happy, at the cost of + // leaking the UnitTest object. + + // CodeGear C++Builder insists on a public destructor for the + // default implementation. Use this implementation to keep good OO + // design with private destructor. + +#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) + static UnitTest* const instance = new UnitTest; + return instance; +#else + static UnitTest instance; + return &instance; +#endif // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__) +} + +// Gets the number of successful test cases. +int UnitTest::successful_test_case_count() const { + return impl()->successful_test_case_count(); +} + +// Gets the number of failed test cases. +int UnitTest::failed_test_case_count() const { + return impl()->failed_test_case_count(); +} + +// Gets the number of all test cases. +int UnitTest::total_test_case_count() const { + return impl()->total_test_case_count(); +} + +// Gets the number of all test cases that contain at least one test +// that should run. +int UnitTest::test_case_to_run_count() const { + return impl()->test_case_to_run_count(); +} + +// Gets the number of successful tests. +int UnitTest::successful_test_count() const { + return impl()->successful_test_count(); +} + +// Gets the number of failed tests. +int UnitTest::failed_test_count() const { return impl()->failed_test_count(); } + +// Gets the number of disabled tests. +int UnitTest::disabled_test_count() const { + return impl()->disabled_test_count(); +} + +// Gets the number of all tests. +int UnitTest::total_test_count() const { return impl()->total_test_count(); } + +// Gets the number of tests that should run. +int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); } + +// Gets the elapsed time, in milliseconds. +internal::TimeInMillis UnitTest::elapsed_time() const { + return impl()->elapsed_time(); +} + +// Returns true iff the unit test passed (i.e. all test cases passed). +bool UnitTest::Passed() const { return impl()->Passed(); } + +// Returns true iff the unit test failed (i.e. some test case failed +// or something outside of all tests failed). +bool UnitTest::Failed() const { return impl()->Failed(); } + +// Gets the i-th test case among all the test cases. i can range from 0 to +// total_test_case_count() - 1. If i is not in that range, returns NULL. +const TestCase* UnitTest::GetTestCase(int i) const { + return impl()->GetTestCase(i); +} + +// Gets the i-th test case among all the test cases. i can range from 0 to +// total_test_case_count() - 1. If i is not in that range, returns NULL. +TestCase* UnitTest::GetMutableTestCase(int i) { + return impl()->GetMutableTestCase(i); +} + +// Returns the list of event listeners that can be used to track events +// inside Google Test. +TestEventListeners& UnitTest::listeners() { + return *impl()->listeners(); +} + +// Registers and returns a global test environment. When a test +// program is run, all global test environments will be set-up in the +// order they were registered. After all tests in the program have +// finished, all global test environments will be torn-down in the +// *reverse* order they were registered. +// +// The UnitTest object takes ownership of the given environment. +// +// We don't protect this under mutex_, as we only support calling it +// from the main thread. +Environment* UnitTest::AddEnvironment(Environment* env) { + if (env == NULL) { + return NULL; + } + + impl_->environments().push_back(env); + return env; +} + +#if GTEST_HAS_EXCEPTIONS +// A failed Google Test assertion will throw an exception of this type +// when exceptions are enabled. We derive it from std::runtime_error, +// which is for errors presumably detectable only at run time. Since +// std::runtime_error inherits from std::exception, many testing +// frameworks know how to extract and print the message inside it. +class GoogleTestFailureException : public ::std::runtime_error { + public: + explicit GoogleTestFailureException(const TestPartResult& failure) + : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {} +}; +#endif + +// Adds a TestPartResult to the current TestResult object. All Google Test +// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call +// this to report their results. The user code should use the +// assertion macros instead of calling this directly. +// L < mutex_ +void UnitTest::AddTestPartResult(TestPartResult::Type result_type, + const char* file_name, + int line_number, + const internal::String& message, + const internal::String& os_stack_trace) { + Message msg; + msg << message; + + internal::MutexLock lock(&mutex_); + if (impl_->gtest_trace_stack().size() > 0) { + msg << "\n" << GTEST_NAME_ << " trace:"; + + for (int i = static_cast(impl_->gtest_trace_stack().size()); + i > 0; --i) { + const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; + msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) + << " " << trace.message; + } + } + + if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) { + msg << internal::kStackTraceMarker << os_stack_trace; + } + + const TestPartResult result = + TestPartResult(result_type, file_name, line_number, + msg.GetString().c_str()); + impl_->GetTestPartResultReporterForCurrentThread()-> + ReportTestPartResult(result); + + if (result_type != TestPartResult::kSuccess) { + // gtest_break_on_failure takes precedence over + // gtest_throw_on_failure. This allows a user to set the latter + // in the code (perhaps in order to use Google Test assertions + // with another testing framework) and specify the former on the + // command line for debugging. + if (GTEST_FLAG(break_on_failure)) { +#if GTEST_OS_WINDOWS + // Using DebugBreak on Windows allows gtest to still break into a debugger + // when a failure happens and both the --gtest_break_on_failure and + // the --gtest_catch_exceptions flags are specified. + DebugBreak(); +#else + *static_cast(NULL) = 1; +#endif // GTEST_OS_WINDOWS + } else if (GTEST_FLAG(throw_on_failure)) { +#if GTEST_HAS_EXCEPTIONS + throw GoogleTestFailureException(result); +#else + // We cannot call abort() as it generates a pop-up in debug mode + // that cannot be suppressed in VC 7.1 or below. + exit(1); +#endif + } + } +} + +// Creates and adds a property to the current TestResult. If a property matching +// the supplied value already exists, updates its value instead. +void UnitTest::RecordPropertyForCurrentTest(const char* key, + const char* value) { + const TestProperty test_property(key, value); + impl_->current_test_result()->RecordProperty(test_property); +} + +// Runs all tests in this UnitTest object and prints the result. +// Returns 0 if successful, or 1 otherwise. +// +// We don't protect this under mutex_, as we only support calling it +// from the main thread. +int UnitTest::Run() { +#if GTEST_HAS_SEH + // Catch SEH-style exceptions. + + const bool in_death_test_child_process = + internal::GTEST_FLAG(internal_run_death_test).length() > 0; + + // Either the user wants Google Test to catch exceptions thrown by the + // tests or this is executing in the context of death test child + // process. In either case the user does not want to see pop-up dialogs + // about crashes - they are expected.. + if (GTEST_FLAG(catch_exceptions) || in_death_test_child_process) { +#if !GTEST_OS_WINDOWS_MOBILE + // SetErrorMode doesn't exist on CE. + SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT | + SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX); +#endif // !GTEST_OS_WINDOWS_MOBILE + +#if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE + // Death test children can be terminated with _abort(). On Windows, + // _abort() can show a dialog with a warning message. This forces the + // abort message to go to stderr instead. + _set_error_mode(_OUT_TO_STDERR); +#endif + +#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE + // In the debug version, Visual Studio pops up a separate dialog + // offering a choice to debug the aborted program. We need to suppress + // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement + // executed. Google Test will notify the user of any unexpected + // failure via stderr. + // + // VC++ doesn't define _set_abort_behavior() prior to the version 8.0. + // Users of prior VC versions shall suffer the agony and pain of + // clicking through the countless debug dialogs. + // TODO(vladl@google.com): find a way to suppress the abort dialog() in the + // debug mode when compiled with VC 7.1 or lower. + if (!GTEST_FLAG(break_on_failure)) + _set_abort_behavior( + 0x0, // Clear the following flags: + _WRITE_ABORT_MSG | _CALL_REPORTFAULT); // pop-up window, core dump. +#endif + } + + __try { + return impl_->RunAllTests(); + } __except(internal::UnitTestOptions::GTestShouldProcessSEH( + GetExceptionCode())) { + printf("Exception thrown with code 0x%x.\nFAIL\n", GetExceptionCode()); + fflush(stdout); + return 1; + } + +#else // We are on a compiler or platform that doesn't support SEH. + + return impl_->RunAllTests(); +#endif // GTEST_HAS_SEH +} + +// Returns the working directory when the first TEST() or TEST_F() was +// executed. +const char* UnitTest::original_working_dir() const { + return impl_->original_working_dir_.c_str(); +} + +// Returns the TestCase object for the test that's currently running, +// or NULL if no test is running. +// L < mutex_ +const TestCase* UnitTest::current_test_case() const { + internal::MutexLock lock(&mutex_); + return impl_->current_test_case(); +} + +// Returns the TestInfo object for the test that's currently running, +// or NULL if no test is running. +// L < mutex_ +const TestInfo* UnitTest::current_test_info() const { + internal::MutexLock lock(&mutex_); + return impl_->current_test_info(); +} + +// Returns the random seed used at the start of the current test run. +int UnitTest::random_seed() const { return impl_->random_seed(); } + +#if GTEST_HAS_PARAM_TEST +// Returns ParameterizedTestCaseRegistry object used to keep track of +// value-parameterized tests and instantiate and register them. +// L < mutex_ +internal::ParameterizedTestCaseRegistry& + UnitTest::parameterized_test_registry() { + return impl_->parameterized_test_registry(); +} +#endif // GTEST_HAS_PARAM_TEST + +// Creates an empty UnitTest. +UnitTest::UnitTest() { + impl_ = new internal::UnitTestImpl(this); +} + +// Destructor of UnitTest. +UnitTest::~UnitTest() { + delete impl_; +} + +// Pushes a trace defined by SCOPED_TRACE() on to the per-thread +// Google Test trace stack. +// L < mutex_ +void UnitTest::PushGTestTrace(const internal::TraceInfo& trace) { + internal::MutexLock lock(&mutex_); + impl_->gtest_trace_stack().push_back(trace); +} + +// Pops a trace from the per-thread Google Test trace stack. +// L < mutex_ +void UnitTest::PopGTestTrace() { + internal::MutexLock lock(&mutex_); + impl_->gtest_trace_stack().pop_back(); +} + +namespace internal { + +UnitTestImpl::UnitTestImpl(UnitTest* parent) + : parent_(parent), +#ifdef _MSC_VER +#pragma warning(push) // Saves the current warning state. +#pragma warning(disable:4355) // Temporarily disables warning 4355 + // (using this in initializer). + default_global_test_part_result_reporter_(this), + default_per_thread_test_part_result_reporter_(this), +#pragma warning(pop) // Restores the warning state again. +#else + default_global_test_part_result_reporter_(this), + default_per_thread_test_part_result_reporter_(this), +#endif // _MSC_VER + global_test_part_result_repoter_( + &default_global_test_part_result_reporter_), + per_thread_test_part_result_reporter_( + &default_per_thread_test_part_result_reporter_), +#if GTEST_HAS_PARAM_TEST + parameterized_test_registry_(), + parameterized_tests_registered_(false), +#endif // GTEST_HAS_PARAM_TEST + last_death_test_case_(-1), + current_test_case_(NULL), + current_test_info_(NULL), + ad_hoc_test_result_(), + os_stack_trace_getter_(NULL), + post_flag_parse_init_performed_(false), + random_seed_(0), // Will be overridden by the flag before first use. + random_(0), // Will be reseeded before first use. +#if GTEST_HAS_DEATH_TEST + elapsed_time_(0), + internal_run_death_test_flag_(NULL), + death_test_factory_(new DefaultDeathTestFactory) { +#else + elapsed_time_(0) { +#endif // GTEST_HAS_DEATH_TEST + listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter); +} + +UnitTestImpl::~UnitTestImpl() { + // Deletes every TestCase. + ForEach(test_cases_, internal::Delete); + + // Deletes every Environment. + ForEach(environments_, internal::Delete); + + delete os_stack_trace_getter_; +} + +#if GTEST_HAS_DEATH_TEST +// Disables event forwarding if the control is currently in a death test +// subprocess. Must not be called before InitGoogleTest. +void UnitTestImpl::SuppressTestEventsIfInSubprocess() { + if (internal_run_death_test_flag_.get() != NULL) + listeners()->SuppressEventForwarding(); +} +#endif // GTEST_HAS_DEATH_TEST + +// Initializes event listeners performing XML output as specified by +// UnitTestOptions. Must not be called before InitGoogleTest. +void UnitTestImpl::ConfigureXmlOutput() { + const String& output_format = UnitTestOptions::GetOutputFormat(); + if (output_format == "xml") { + listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter( + UnitTestOptions::GetAbsolutePathToOutputFile().c_str())); + } else if (output_format != "") { + printf("WARNING: unrecognized output format \"%s\" ignored.\n", + output_format.c_str()); + fflush(stdout); + } +} + +// Performs initialization dependent upon flag values obtained in +// ParseGoogleTestFlagsOnly. Is called from InitGoogleTest after the call to +// ParseGoogleTestFlagsOnly. In case a user neglects to call InitGoogleTest +// this function is also called from RunAllTests. Since this function can be +// called more than once, it has to be idempotent. +void UnitTestImpl::PostFlagParsingInit() { + // Ensures that this function does not execute more than once. + if (!post_flag_parse_init_performed_) { + post_flag_parse_init_performed_ = true; + +#if GTEST_HAS_DEATH_TEST + InitDeathTestSubprocessControlInfo(); + SuppressTestEventsIfInSubprocess(); +#endif // GTEST_HAS_DEATH_TEST + + // Registers parameterized tests. This makes parameterized tests + // available to the UnitTest reflection API without running + // RUN_ALL_TESTS. + RegisterParameterizedTests(); + + // Configures listeners for XML output. This makes it possible for users + // to shut down the default XML output before invoking RUN_ALL_TESTS. + ConfigureXmlOutput(); + } +} + +// A predicate that checks the name of a TestCase against a known +// value. +// +// This is used for implementation of the UnitTest class only. We put +// it in the anonymous namespace to prevent polluting the outer +// namespace. +// +// TestCaseNameIs is copyable. +class TestCaseNameIs { + public: + // Constructor. + explicit TestCaseNameIs(const String& name) + : name_(name) {} + + // Returns true iff the name of test_case matches name_. + bool operator()(const TestCase* test_case) const { + return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0; + } + + private: + String name_; +}; + +// Finds and returns a TestCase with the given name. If one doesn't +// exist, creates one and returns it. It's the CALLER'S +// RESPONSIBILITY to ensure that this function is only called WHEN THE +// TESTS ARE NOT SHUFFLED. +// +// Arguments: +// +// test_case_name: name of the test case +// set_up_tc: pointer to the function that sets up the test case +// tear_down_tc: pointer to the function that tears down the test case +TestCase* UnitTestImpl::GetTestCase(const char* test_case_name, + const char* comment, + Test::SetUpTestCaseFunc set_up_tc, + Test::TearDownTestCaseFunc tear_down_tc) { + // Can we find a TestCase with the given name? + const std::vector::const_iterator test_case = + std::find_if(test_cases_.begin(), test_cases_.end(), + TestCaseNameIs(test_case_name)); + + if (test_case != test_cases_.end()) + return *test_case; + + // No. Let's create one. + TestCase* const new_test_case = + new TestCase(test_case_name, comment, set_up_tc, tear_down_tc); + + // Is this a death test case? + if (internal::UnitTestOptions::MatchesFilter(String(test_case_name), + kDeathTestCaseFilter)) { + // Yes. Inserts the test case after the last death test case + // defined so far. This only works when the test cases haven't + // been shuffled. Otherwise we may end up running a death test + // after a non-death test. + ++last_death_test_case_; + test_cases_.insert(test_cases_.begin() + last_death_test_case_, + new_test_case); + } else { + // No. Appends to the end of the list. + test_cases_.push_back(new_test_case); + } + + test_case_indices_.push_back(static_cast(test_case_indices_.size())); + return new_test_case; +} + +// Helpers for setting up / tearing down the given environment. They +// are for use in the ForEach() function. +static void SetUpEnvironment(Environment* env) { env->SetUp(); } +static void TearDownEnvironment(Environment* env) { env->TearDown(); } + +// Runs all tests in this UnitTest object, prints the result, and +// returns 0 if all tests are successful, or 1 otherwise. If any +// exception is thrown during a test on Windows, this test is +// considered to be failed, but the rest of the tests will still be +// run. (We disable exceptions on Linux and Mac OS X, so the issue +// doesn't apply there.) +// When parameterized tests are enabled, it expands and registers +// parameterized tests first in RegisterParameterizedTests(). +// All other functions called from RunAllTests() may safely assume that +// parameterized tests are ready to be counted and run. +int UnitTestImpl::RunAllTests() { + // Makes sure InitGoogleTest() was called. + if (!GTestIsInitialized()) { + printf("%s", + "\nThis test program did NOT call ::testing::InitGoogleTest " + "before calling RUN_ALL_TESTS(). Please fix it.\n"); + return 1; + } + + // Do not run any test if the --help flag was specified. + if (g_help_flag) + return 0; + + // Repeats the call to the post-flag parsing initialization in case the + // user didn't call InitGoogleTest. + PostFlagParsingInit(); + + // Even if sharding is not on, test runners may want to use the + // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding + // protocol. + internal::WriteToShardStatusFileIfNeeded(); + + // True iff we are in a subprocess for running a thread-safe-style + // death test. + bool in_subprocess_for_death_test = false; + +#if GTEST_HAS_DEATH_TEST + in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL); +#endif // GTEST_HAS_DEATH_TEST + + const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex, + in_subprocess_for_death_test); + + // Compares the full test names with the filter to decide which + // tests to run. + const bool has_tests_to_run = FilterTests(should_shard + ? HONOR_SHARDING_PROTOCOL + : IGNORE_SHARDING_PROTOCOL) > 0; + + // Lists the tests and exits if the --gtest_list_tests flag was specified. + if (GTEST_FLAG(list_tests)) { + // This must be called *after* FilterTests() has been called. + ListTestsMatchingFilter(); + return 0; + } + + random_seed_ = GTEST_FLAG(shuffle) ? + GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0; + + // True iff at least one test has failed. + bool failed = false; + + TestEventListener* repeater = listeners()->repeater(); + + repeater->OnTestProgramStart(*parent_); + + // How many times to repeat the tests? We don't want to repeat them + // when we are inside the subprocess of a death test. + const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat); + // Repeats forever if the repeat count is negative. + const bool forever = repeat < 0; + for (int i = 0; forever || i != repeat; i++) { + ClearResult(); + + const TimeInMillis start = GetTimeInMillis(); + + // Shuffles test cases and tests if requested. + if (has_tests_to_run && GTEST_FLAG(shuffle)) { + random()->Reseed(random_seed_); + // This should be done before calling OnTestIterationStart(), + // such that a test event listener can see the actual test order + // in the event. + ShuffleTests(); + } + + // Tells the unit test event listeners that the tests are about to start. + repeater->OnTestIterationStart(*parent_, i); + + // Runs each test case if there is at least one test to run. + if (has_tests_to_run) { + // Sets up all environments beforehand. + repeater->OnEnvironmentsSetUpStart(*parent_); + ForEach(environments_, SetUpEnvironment); + repeater->OnEnvironmentsSetUpEnd(*parent_); + + // Runs the tests only if there was no fatal failure during global + // set-up. + if (!Test::HasFatalFailure()) { + for (int test_index = 0; test_index < total_test_case_count(); + test_index++) { + GetMutableTestCase(test_index)->Run(); + } + } + + // Tears down all environments in reverse order afterwards. + repeater->OnEnvironmentsTearDownStart(*parent_); + std::for_each(environments_.rbegin(), environments_.rend(), + TearDownEnvironment); + repeater->OnEnvironmentsTearDownEnd(*parent_); + } + + elapsed_time_ = GetTimeInMillis() - start; + + // Tells the unit test event listener that the tests have just finished. + repeater->OnTestIterationEnd(*parent_, i); + + // Gets the result and clears it. + if (!Passed()) { + failed = true; + } + + // Restores the original test order after the iteration. This + // allows the user to quickly repro a failure that happens in the + // N-th iteration without repeating the first (N - 1) iterations. + // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in + // case the user somehow changes the value of the flag somewhere + // (it's always safe to unshuffle the tests). + UnshuffleTests(); + + if (GTEST_FLAG(shuffle)) { + // Picks a new random seed for each iteration. + random_seed_ = GetNextRandomSeed(random_seed_); + } + } + + repeater->OnTestProgramEnd(*parent_); + + // Returns 0 if all tests passed, or 1 other wise. + return failed ? 1 : 0; +} + +// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file +// if the variable is present. If a file already exists at this location, this +// function will write over it. If the variable is present, but the file cannot +// be created, prints an error and exits. +void WriteToShardStatusFileIfNeeded() { + const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile); + if (test_shard_file != NULL) { + FILE* const file = posix::FOpen(test_shard_file, "w"); + if (file == NULL) { + ColoredPrintf(COLOR_RED, + "Could not write to the test shard status file \"%s\" " + "specified by the %s environment variable.\n", + test_shard_file, kTestShardStatusFile); + fflush(stdout); + exit(EXIT_FAILURE); + } + fclose(file); + } +} + +// Checks whether sharding is enabled by examining the relevant +// environment variable values. If the variables are present, +// but inconsistent (i.e., shard_index >= total_shards), prints +// an error and exits. If in_subprocess_for_death_test, sharding is +// disabled because it must only be applied to the original test +// process. Otherwise, we could filter out death tests we intended to execute. +bool ShouldShard(const char* total_shards_env, + const char* shard_index_env, + bool in_subprocess_for_death_test) { + if (in_subprocess_for_death_test) { + return false; + } + + const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1); + const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1); + + if (total_shards == -1 && shard_index == -1) { + return false; + } else if (total_shards == -1 && shard_index != -1) { + const Message msg = Message() + << "Invalid environment variables: you have " + << kTestShardIndex << " = " << shard_index + << ", but have left " << kTestTotalShards << " unset.\n"; + ColoredPrintf(COLOR_RED, msg.GetString().c_str()); + fflush(stdout); + exit(EXIT_FAILURE); + } else if (total_shards != -1 && shard_index == -1) { + const Message msg = Message() + << "Invalid environment variables: you have " + << kTestTotalShards << " = " << total_shards + << ", but have left " << kTestShardIndex << " unset.\n"; + ColoredPrintf(COLOR_RED, msg.GetString().c_str()); + fflush(stdout); + exit(EXIT_FAILURE); + } else if (shard_index < 0 || shard_index >= total_shards) { + const Message msg = Message() + << "Invalid environment variables: we require 0 <= " + << kTestShardIndex << " < " << kTestTotalShards + << ", but you have " << kTestShardIndex << "=" << shard_index + << ", " << kTestTotalShards << "=" << total_shards << ".\n"; + ColoredPrintf(COLOR_RED, msg.GetString().c_str()); + fflush(stdout); + exit(EXIT_FAILURE); + } + + return total_shards > 1; +} + +// Parses the environment variable var as an Int32. If it is unset, +// returns default_val. If it is not an Int32, prints an error +// and aborts. +Int32 Int32FromEnvOrDie(const char* const var, Int32 default_val) { + const char* str_val = posix::GetEnv(var); + if (str_val == NULL) { + return default_val; + } + + Int32 result; + if (!ParseInt32(Message() << "The value of environment variable " << var, + str_val, &result)) { + exit(EXIT_FAILURE); + } + return result; +} + +// Given the total number of shards, the shard index, and the test id, +// returns true iff the test should be run on this shard. The test id is +// some arbitrary but unique non-negative integer assigned to each test +// method. Assumes that 0 <= shard_index < total_shards. +bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) { + return (test_id % total_shards) == shard_index; +} + +// Compares the name of each test with the user-specified filter to +// decide whether the test should be run, then records the result in +// each TestCase and TestInfo object. +// If shard_tests == true, further filters tests based on sharding +// variables in the environment - see +// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide. +// Returns the number of tests that should run. +int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) { + const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ? + Int32FromEnvOrDie(kTestTotalShards, -1) : -1; + const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ? + Int32FromEnvOrDie(kTestShardIndex, -1) : -1; + + // num_runnable_tests are the number of tests that will + // run across all shards (i.e., match filter and are not disabled). + // num_selected_tests are the number of tests to be run on + // this shard. + int num_runnable_tests = 0; + int num_selected_tests = 0; + for (size_t i = 0; i < test_cases_.size(); i++) { + TestCase* const test_case = test_cases_[i]; + const String &test_case_name = test_case->name(); + test_case->set_should_run(false); + + for (size_t j = 0; j < test_case->test_info_list().size(); j++) { + TestInfo* const test_info = test_case->test_info_list()[j]; + const String test_name(test_info->name()); + // A test is disabled if test case name or test name matches + // kDisableTestFilter. + const bool is_disabled = + internal::UnitTestOptions::MatchesFilter(test_case_name, + kDisableTestFilter) || + internal::UnitTestOptions::MatchesFilter(test_name, + kDisableTestFilter); + test_info->impl()->set_is_disabled(is_disabled); + + const bool matches_filter = + internal::UnitTestOptions::FilterMatchesTest(test_case_name, + test_name); + test_info->impl()->set_matches_filter(matches_filter); + + const bool is_runnable = + (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) && + matches_filter; + + const bool is_selected = is_runnable && + (shard_tests == IGNORE_SHARDING_PROTOCOL || + ShouldRunTestOnShard(total_shards, shard_index, + num_runnable_tests)); + + num_runnable_tests += is_runnable; + num_selected_tests += is_selected; + + test_info->impl()->set_should_run(is_selected); + test_case->set_should_run(test_case->should_run() || is_selected); + } + } + return num_selected_tests; +} + +// Prints the names of the tests matching the user-specified filter flag. +void UnitTestImpl::ListTestsMatchingFilter() { + for (size_t i = 0; i < test_cases_.size(); i++) { + const TestCase* const test_case = test_cases_[i]; + bool printed_test_case_name = false; + + for (size_t j = 0; j < test_case->test_info_list().size(); j++) { + const TestInfo* const test_info = + test_case->test_info_list()[j]; + if (test_info->matches_filter()) { + if (!printed_test_case_name) { + printed_test_case_name = true; + printf("%s.\n", test_case->name()); + } + printf(" %s\n", test_info->name()); + } + } + } + fflush(stdout); +} + +// Sets the OS stack trace getter. +// +// Does nothing if the input and the current OS stack trace getter are +// the same; otherwise, deletes the old getter and makes the input the +// current getter. +void UnitTestImpl::set_os_stack_trace_getter( + OsStackTraceGetterInterface* getter) { + if (os_stack_trace_getter_ != getter) { + delete os_stack_trace_getter_; + os_stack_trace_getter_ = getter; + } +} + +// Returns the current OS stack trace getter if it is not NULL; +// otherwise, creates an OsStackTraceGetter, makes it the current +// getter, and returns it. +OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() { + if (os_stack_trace_getter_ == NULL) { + os_stack_trace_getter_ = new OsStackTraceGetter; + } + + return os_stack_trace_getter_; +} + +// Returns the TestResult for the test that's currently running, or +// the TestResult for the ad hoc test if no test is running. +TestResult* UnitTestImpl::current_test_result() { + return current_test_info_ ? + current_test_info_->impl()->result() : &ad_hoc_test_result_; +} + +// Shuffles all test cases, and the tests within each test case, +// making sure that death tests are still run first. +void UnitTestImpl::ShuffleTests() { + // Shuffles the death test cases. + ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_); + + // Shuffles the non-death test cases. + ShuffleRange(random(), last_death_test_case_ + 1, + static_cast(test_cases_.size()), &test_case_indices_); + + // Shuffles the tests inside each test case. + for (size_t i = 0; i < test_cases_.size(); i++) { + test_cases_[i]->ShuffleTests(random()); + } +} + +// Restores the test cases and tests to their order before the first shuffle. +void UnitTestImpl::UnshuffleTests() { + for (size_t i = 0; i < test_cases_.size(); i++) { + // Unshuffles the tests in each test case. + test_cases_[i]->UnshuffleTests(); + // Resets the index of each test case. + test_case_indices_[i] = static_cast(i); + } +} + +// TestInfoImpl constructor. The new instance assumes ownership of the test +// factory object. +TestInfoImpl::TestInfoImpl(TestInfo* parent, + const char* a_test_case_name, + const char* a_name, + const char* a_test_case_comment, + const char* a_comment, + TypeId a_fixture_class_id, + internal::TestFactoryBase* factory) : + parent_(parent), + test_case_name_(String(a_test_case_name)), + name_(String(a_name)), + test_case_comment_(String(a_test_case_comment)), + comment_(String(a_comment)), + fixture_class_id_(a_fixture_class_id), + should_run_(false), + is_disabled_(false), + matches_filter_(false), + factory_(factory) { +} + +// TestInfoImpl destructor. +TestInfoImpl::~TestInfoImpl() { + delete factory_; +} + +// Returns the current OS stack trace as a String. +// +// The maximum number of stack frames to be included is specified by +// the gtest_stack_trace_depth flag. The skip_count parameter +// specifies the number of top frames to be skipped, which doesn't +// count against the number of frames to be included. +// +// For example, if Foo() calls Bar(), which in turn calls +// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in +// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. +String GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/, + int skip_count) { + // We pass skip_count + 1 to skip this wrapper function in addition + // to what the user really wants to skip. + return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1); +} + +// Used by the GTEST_HIDE_UNREACHABLE_CODE_ macro to suppress unreachable +// code warnings. +namespace { +class ClassUniqueToAlwaysTrue {}; +} + +bool IsTrue(bool condition) { return condition; } + +bool AlwaysTrue() { +#if GTEST_HAS_EXCEPTIONS + // This condition is always false so AlwaysTrue() never actually throws, + // but it makes the compiler think that it may throw. + if (IsTrue(false)) + throw ClassUniqueToAlwaysTrue(); +#endif // GTEST_HAS_EXCEPTIONS + return true; +} + +// If *pstr starts with the given prefix, modifies *pstr to be right +// past the prefix and returns true; otherwise leaves *pstr unchanged +// and returns false. None of pstr, *pstr, and prefix can be NULL. +bool SkipPrefix(const char* prefix, const char** pstr) { + const size_t prefix_len = strlen(prefix); + if (strncmp(*pstr, prefix, prefix_len) == 0) { + *pstr += prefix_len; + return true; + } + return false; +} + +// Parses a string as a command line flag. The string should have +// the format "--flag=value". When def_optional is true, the "=value" +// part can be omitted. +// +// Returns the value of the flag, or NULL if the parsing failed. +const char* ParseFlagValue(const char* str, + const char* flag, + bool def_optional) { + // str and flag must not be NULL. + if (str == NULL || flag == NULL) return NULL; + + // The flag must start with "--" followed by GTEST_FLAG_PREFIX_. + const String flag_str = String::Format("--%s%s", GTEST_FLAG_PREFIX_, flag); + const size_t flag_len = flag_str.length(); + if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; + + // Skips the flag name. + const char* flag_end = str + flag_len; + + // When def_optional is true, it's OK to not have a "=value" part. + if (def_optional && (flag_end[0] == '\0')) { + return flag_end; + } + + // If def_optional is true and there are more characters after the + // flag name, or if def_optional is false, there must be a '=' after + // the flag name. + if (flag_end[0] != '=') return NULL; + + // Returns the string after "=". + return flag_end + 1; +} + +// Parses a string for a bool flag, in the form of either +// "--flag=value" or "--flag". +// +// In the former case, the value is taken as true as long as it does +// not start with '0', 'f', or 'F'. +// +// In the latter case, the value is taken as true. +// +// On success, stores the value of the flag in *value, and returns +// true. On failure, returns false without changing *value. +bool ParseBoolFlag(const char* str, const char* flag, bool* value) { + // Gets the value of the flag as a string. + const char* const value_str = ParseFlagValue(str, flag, true); + + // Aborts if the parsing failed. + if (value_str == NULL) return false; + + // Converts the string value to a bool. + *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); + return true; +} + +// Parses a string for an Int32 flag, in the form of +// "--flag=value". +// +// On success, stores the value of the flag in *value, and returns +// true. On failure, returns false without changing *value. +bool ParseInt32Flag(const char* str, const char* flag, Int32* value) { + // Gets the value of the flag as a string. + const char* const value_str = ParseFlagValue(str, flag, false); + + // Aborts if the parsing failed. + if (value_str == NULL) return false; + + // Sets *value to the value of the flag. + return ParseInt32(Message() << "The value of flag --" << flag, + value_str, value); +} + +// Parses a string for a string flag, in the form of +// "--flag=value". +// +// On success, stores the value of the flag in *value, and returns +// true. On failure, returns false without changing *value. +bool ParseStringFlag(const char* str, const char* flag, String* value) { + // Gets the value of the flag as a string. + const char* const value_str = ParseFlagValue(str, flag, false); + + // Aborts if the parsing failed. + if (value_str == NULL) return false; + + // Sets *value to the value of the flag. + *value = value_str; + return true; +} + +// Determines whether a string has a prefix that Google Test uses for its +// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_. +// If Google Test detects that a command line flag has its prefix but is not +// recognized, it will print its help message. Flags starting with +// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test +// internal flags and do not trigger the help message. +static bool HasGoogleTestFlagPrefix(const char* str) { + return (SkipPrefix("--", &str) || + SkipPrefix("-", &str) || + SkipPrefix("/", &str)) && + !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) && + (SkipPrefix(GTEST_FLAG_PREFIX_, &str) || + SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str)); +} + +// Prints a string containing code-encoded text. The following escape +// sequences can be used in the string to control the text color: +// +// @@ prints a single '@' character. +// @R changes the color to red. +// @G changes the color to green. +// @Y changes the color to yellow. +// @D changes to the default terminal text color. +// +// TODO(wan@google.com): Write tests for this once we add stdout +// capturing to Google Test. +static void PrintColorEncoded(const char* str) { + GTestColor color = COLOR_DEFAULT; // The current color. + + // Conceptually, we split the string into segments divided by escape + // sequences. Then we print one segment at a time. At the end of + // each iteration, the str pointer advances to the beginning of the + // next segment. + for (;;) { + const char* p = strchr(str, '@'); + if (p == NULL) { + ColoredPrintf(color, "%s", str); + return; + } + + ColoredPrintf(color, "%s", String(str, p - str).c_str()); + + const char ch = p[1]; + str = p + 2; + if (ch == '@') { + ColoredPrintf(color, "@"); + } else if (ch == 'D') { + color = COLOR_DEFAULT; + } else if (ch == 'R') { + color = COLOR_RED; + } else if (ch == 'G') { + color = COLOR_GREEN; + } else if (ch == 'Y') { + color = COLOR_YELLOW; + } else { + --str; + } + } +} + +static const char kColorEncodedHelpMessage[] = +"This program contains tests written using " GTEST_NAME_ ". You can use the\n" +"following command line flags to control its behavior:\n" +"\n" +"Test Selection:\n" +" @G--" GTEST_FLAG_PREFIX_ "list_tests@D\n" +" List the names of all tests instead of running them. The name of\n" +" TEST(Foo, Bar) is \"Foo.Bar\".\n" +" @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS" + "[@G-@YNEGATIVE_PATTERNS]@D\n" +" Run only the tests whose name matches one of the positive patterns but\n" +" none of the negative patterns. '?' matches any single character; '*'\n" +" matches any substring; ':' separates two patterns.\n" +" @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests@D\n" +" Run all disabled tests too.\n" +"\n" +"Test Execution:\n" +" @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n" +" Run the tests repeatedly; use a negative count to repeat forever.\n" +" @G--" GTEST_FLAG_PREFIX_ "shuffle@D\n" +" Randomize tests' orders on every iteration.\n" +" @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n" +" Random number seed to use for shuffling test orders (between 1 and\n" +" 99999, or 0 to use a seed based on the current time).\n" +"\n" +"Test Output:\n" +" @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes@Y|@Gno@Y|@Gauto@Y)@D\n" +" Enable/disable colored output. The default is @Gauto@D.\n" +" -@G-" GTEST_FLAG_PREFIX_ "print_time=0@D\n" +" Don't print the elapsed time of each test.\n" +" @G--" GTEST_FLAG_PREFIX_ "output=xml@Y[@G:@YDIRECTORY_PATH@G" + GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n" +" Generate an XML report in the given directory or with the given file\n" +" name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n" +"\n" +"Assertion Behavior:\n" +#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS +" @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast@Y|@Gthreadsafe@Y)@D\n" +" Set the default death test style.\n" +#endif // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS +" @G--" GTEST_FLAG_PREFIX_ "break_on_failure@D\n" +" Turn assertion failures into debugger break-points.\n" +" @G--" GTEST_FLAG_PREFIX_ "throw_on_failure@D\n" +" Turn assertion failures into C++ exceptions.\n" +#if GTEST_OS_WINDOWS +" @G--" GTEST_FLAG_PREFIX_ "catch_exceptions@D\n" +" Suppress pop-ups caused by exceptions.\n" +#endif // GTEST_OS_WINDOWS +"\n" +"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests@D, you can alternatively set " + "the corresponding\n" +"environment variable of a flag (all letters in upper-case). For example, to\n" +"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_ + "color=no@D or set\n" +"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR@D environment variable to @Gno@D.\n" +"\n" +"For more information, please read the " GTEST_NAME_ " documentation at\n" +"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n" +"(not one in your own code or tests), please report it to\n" +"@G<" GTEST_DEV_EMAIL_ ">@D.\n"; + +// Parses the command line for Google Test flags, without initializing +// other parts of Google Test. The type parameter CharType can be +// instantiated to either char or wchar_t. +template +void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) { + for (int i = 1; i < *argc; i++) { + const String arg_string = StreamableToString(argv[i]); + const char* const arg = arg_string.c_str(); + + using internal::ParseBoolFlag; + using internal::ParseInt32Flag; + using internal::ParseStringFlag; + + // Do we see a Google Test flag? + if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag, + >EST_FLAG(also_run_disabled_tests)) || + ParseBoolFlag(arg, kBreakOnFailureFlag, + >EST_FLAG(break_on_failure)) || + ParseBoolFlag(arg, kCatchExceptionsFlag, + >EST_FLAG(catch_exceptions)) || + ParseStringFlag(arg, kColorFlag, >EST_FLAG(color)) || + ParseStringFlag(arg, kDeathTestStyleFlag, + >EST_FLAG(death_test_style)) || + ParseBoolFlag(arg, kDeathTestUseFork, + >EST_FLAG(death_test_use_fork)) || + ParseStringFlag(arg, kFilterFlag, >EST_FLAG(filter)) || + ParseStringFlag(arg, kInternalRunDeathTestFlag, + >EST_FLAG(internal_run_death_test)) || + ParseBoolFlag(arg, kListTestsFlag, >EST_FLAG(list_tests)) || + ParseStringFlag(arg, kOutputFlag, >EST_FLAG(output)) || + ParseBoolFlag(arg, kPrintTimeFlag, >EST_FLAG(print_time)) || + ParseInt32Flag(arg, kRandomSeedFlag, >EST_FLAG(random_seed)) || + ParseInt32Flag(arg, kRepeatFlag, >EST_FLAG(repeat)) || + ParseBoolFlag(arg, kShuffleFlag, >EST_FLAG(shuffle)) || + ParseInt32Flag(arg, kStackTraceDepthFlag, + >EST_FLAG(stack_trace_depth)) || + ParseBoolFlag(arg, kThrowOnFailureFlag, >EST_FLAG(throw_on_failure)) + ) { + // Yes. Shift the remainder of the argv list left by one. Note + // that argv has (*argc + 1) elements, the last one always being + // NULL. The following loop moves the trailing NULL element as + // well. + for (int j = i; j != *argc; j++) { + argv[j] = argv[j + 1]; + } + + // Decrements the argument count. + (*argc)--; + + // We also need to decrement the iterator as we just removed + // an element. + i--; + } else if (arg_string == "--help" || arg_string == "-h" || + arg_string == "-?" || arg_string == "/?" || + HasGoogleTestFlagPrefix(arg)) { + // Both help flag and unrecognized Google Test flags (excluding + // internal ones) trigger help display. + g_help_flag = true; + } + } + + if (g_help_flag) { + // We print the help here instead of in RUN_ALL_TESTS(), as the + // latter may not be called at all if the user is using Google + // Test with another testing framework. + PrintColorEncoded(kColorEncodedHelpMessage); + } +} + +// Parses the command line for Google Test flags, without initializing +// other parts of Google Test. +void ParseGoogleTestFlagsOnly(int* argc, char** argv) { + ParseGoogleTestFlagsOnlyImpl(argc, argv); +} +void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) { + ParseGoogleTestFlagsOnlyImpl(argc, argv); +} + +// The internal implementation of InitGoogleTest(). +// +// The type parameter CharType can be instantiated to either char or +// wchar_t. +template +void InitGoogleTestImpl(int* argc, CharType** argv) { + g_init_gtest_count++; + + // We don't want to run the initialization code twice. + if (g_init_gtest_count != 1) return; + + if (*argc <= 0) return; + + internal::g_executable_path = internal::StreamableToString(argv[0]); + +#if GTEST_HAS_DEATH_TEST + g_argvs.clear(); + for (int i = 0; i != *argc; i++) { + g_argvs.push_back(StreamableToString(argv[i])); + } +#endif // GTEST_HAS_DEATH_TEST + + ParseGoogleTestFlagsOnly(argc, argv); + GetUnitTestImpl()->PostFlagParsingInit(); +} + +} // namespace internal + +// Initializes Google Test. This must be called before calling +// RUN_ALL_TESTS(). In particular, it parses a command line for the +// flags that Google Test recognizes. Whenever a Google Test flag is +// seen, it is removed from argv, and *argc is decremented. +// +// No value is returned. Instead, the Google Test flag variables are +// updated. +// +// Calling the function for the second time has no user-visible effect. +void InitGoogleTest(int* argc, char** argv) { + internal::InitGoogleTestImpl(argc, argv); +} + +// This overloaded version can be used in Windows programs compiled in +// UNICODE mode. +void InitGoogleTest(int* argc, wchar_t** argv) { + internal::InitGoogleTestImpl(argc, argv); +} + +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc new file mode 100644 index 000000000..d20c02fdf --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc @@ -0,0 +1,39 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include + +#include + +int main(int argc, char **argv) { + std::cout << "Running main() from gtest_main.cc\n"; + + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc new file mode 100644 index 000000000..ed5b53b71 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc @@ -0,0 +1,1230 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Tests for death tests. + +#include +#include +#include + +using testing::internal::AlwaysFalse; +using testing::internal::AlwaysTrue; + +#if GTEST_HAS_DEATH_TEST + +#if GTEST_OS_WINDOWS +#include // For chdir(). +#else +#include +#include // For waitpid. +#include // For std::numeric_limits. +#endif // GTEST_OS_WINDOWS + +#include +#include +#include + +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +namespace posix = ::testing::internal::posix; + +using testing::Message; +using testing::internal::DeathTest; +using testing::internal::DeathTestFactory; +using testing::internal::FilePath; +using testing::internal::GetLastErrnoDescription; +using testing::internal::GetUnitTestImpl; +using testing::internal::ParseNaturalNumber; +using testing::internal::String; + +namespace testing { +namespace internal { + +// A helper class whose objects replace the death test factory for a +// single UnitTest object during their lifetimes. +class ReplaceDeathTestFactory { + public: + explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory) + : unit_test_impl_(GetUnitTestImpl()) { + old_factory_ = unit_test_impl_->death_test_factory_.release(); + unit_test_impl_->death_test_factory_.reset(new_factory); + } + + ~ReplaceDeathTestFactory() { + unit_test_impl_->death_test_factory_.release(); + unit_test_impl_->death_test_factory_.reset(old_factory_); + } + private: + // Prevents copying ReplaceDeathTestFactory objects. + ReplaceDeathTestFactory(const ReplaceDeathTestFactory&); + void operator=(const ReplaceDeathTestFactory&); + + UnitTestImpl* unit_test_impl_; + DeathTestFactory* old_factory_; +}; + +} // namespace internal +} // namespace testing + +void DieInside(const char* function) { + fprintf(stderr, "death inside %s().", function); + fflush(stderr); + // We call _exit() instead of exit(), as the former is a direct + // system call and thus safer in the presence of threads. exit() + // will invoke user-defined exit-hooks, which may do dangerous + // things that conflict with death tests. + // + // Some compilers can recognize that _exit() never returns and issue the + // 'unreachable code' warning for code following this function, unless + // fooled by a fake condition. + if (AlwaysTrue()) + _exit(1); +} + +// Tests that death tests work. + +class TestForDeathTest : public testing::Test { + protected: + TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {} + + virtual ~TestForDeathTest() { + posix::ChDir(original_dir_.c_str()); + } + + // A static member function that's expected to die. + static void StaticMemberFunction() { DieInside("StaticMemberFunction"); } + + // A method of the test fixture that may die. + void MemberFunction() { + if (should_die_) + DieInside("MemberFunction"); + } + + // True iff MemberFunction() should die. + bool should_die_; + const FilePath original_dir_; +}; + +// A class with a member function that may die. +class MayDie { + public: + explicit MayDie(bool should_die) : should_die_(should_die) {} + + // A member function that may die. + void MemberFunction() const { + if (should_die_) + DieInside("MayDie::MemberFunction"); + } + + private: + // True iff MemberFunction() should die. + bool should_die_; +}; + +// A global function that's expected to die. +void GlobalFunction() { DieInside("GlobalFunction"); } + +// A non-void function that's expected to die. +int NonVoidFunction() { + DieInside("NonVoidFunction"); + return 1; +} + +// A unary function that may die. +void DieIf(bool should_die) { + if (should_die) + DieInside("DieIf"); +} + +// A binary function that may die. +bool DieIfLessThan(int x, int y) { + if (x < y) { + DieInside("DieIfLessThan"); + } + return true; +} + +// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture. +void DeathTestSubroutine() { + EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction"); + ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction"); +} + +// Death in dbg, not opt. +int DieInDebugElse12(int* sideeffect) { + if (sideeffect) *sideeffect = 12; +#ifndef NDEBUG + DieInside("DieInDebugElse12"); +#endif // NDEBUG + return 12; +} + +#if GTEST_OS_WINDOWS + +// Tests the ExitedWithCode predicate. +TEST(ExitStatusPredicateTest, ExitedWithCode) { + // On Windows, the process's exit code is the same as its exit status, + // so the predicate just compares the its input with its parameter. + EXPECT_TRUE(testing::ExitedWithCode(0)(0)); + EXPECT_TRUE(testing::ExitedWithCode(1)(1)); + EXPECT_TRUE(testing::ExitedWithCode(42)(42)); + EXPECT_FALSE(testing::ExitedWithCode(0)(1)); + EXPECT_FALSE(testing::ExitedWithCode(1)(0)); +} + +#else + +// Returns the exit status of a process that calls _exit(2) with a +// given exit code. This is a helper function for the +// ExitStatusPredicateTest test suite. +static int NormalExitStatus(int exit_code) { + pid_t child_pid = fork(); + if (child_pid == 0) { + _exit(exit_code); + } + int status; + waitpid(child_pid, &status, 0); + return status; +} + +// Returns the exit status of a process that raises a given signal. +// If the signal does not cause the process to die, then it returns +// instead the exit status of a process that exits normally with exit +// code 1. This is a helper function for the ExitStatusPredicateTest +// test suite. +static int KilledExitStatus(int signum) { + pid_t child_pid = fork(); + if (child_pid == 0) { + raise(signum); + _exit(1); + } + int status; + waitpid(child_pid, &status, 0); + return status; +} + +// Tests the ExitedWithCode predicate. +TEST(ExitStatusPredicateTest, ExitedWithCode) { + const int status0 = NormalExitStatus(0); + const int status1 = NormalExitStatus(1); + const int status42 = NormalExitStatus(42); + const testing::ExitedWithCode pred0(0); + const testing::ExitedWithCode pred1(1); + const testing::ExitedWithCode pred42(42); + EXPECT_PRED1(pred0, status0); + EXPECT_PRED1(pred1, status1); + EXPECT_PRED1(pred42, status42); + EXPECT_FALSE(pred0(status1)); + EXPECT_FALSE(pred42(status0)); + EXPECT_FALSE(pred1(status42)); +} + +// Tests the KilledBySignal predicate. +TEST(ExitStatusPredicateTest, KilledBySignal) { + const int status_segv = KilledExitStatus(SIGSEGV); + const int status_kill = KilledExitStatus(SIGKILL); + const testing::KilledBySignal pred_segv(SIGSEGV); + const testing::KilledBySignal pred_kill(SIGKILL); + EXPECT_PRED1(pred_segv, status_segv); + EXPECT_PRED1(pred_kill, status_kill); + EXPECT_FALSE(pred_segv(status_kill)); + EXPECT_FALSE(pred_kill(status_segv)); +} + +#endif // GTEST_OS_WINDOWS + +// Tests that the death test macros expand to code which may or may not +// be followed by operator<<, and that in either case the complete text +// comprises only a single C++ statement. +TEST_F(TestForDeathTest, SingleStatement) { + if (AlwaysFalse()) + // This would fail if executed; this is a compilation test only + ASSERT_DEATH(return, ""); + + if (AlwaysTrue()) + EXPECT_DEATH(_exit(1), ""); + else + // This empty "else" branch is meant to ensure that EXPECT_DEATH + // doesn't expand into an "if" statement without an "else" + ; + + if (AlwaysFalse()) + ASSERT_DEATH(return, "") << "did not die"; + + if (AlwaysFalse()) + ; + else + EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3; +} + +void DieWithEmbeddedNul() { + fprintf(stderr, "Hello%cmy null world.\n", '\0'); + fflush(stderr); + _exit(1); +} + +#if GTEST_USES_PCRE +// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error +// message has a NUL character in it. +TEST_F(TestForDeathTest, EmbeddedNulInMessage) { + // TODO(wan@google.com): doesn't support matching strings + // with embedded NUL characters - find a way to workaround it. + EXPECT_DEATH(DieWithEmbeddedNul(), "my null world"); + ASSERT_DEATH(DieWithEmbeddedNul(), "my null world"); +} +#endif // GTEST_USES_PCRE + +// Tests that death test macros expand to code which interacts well with switch +// statements. +TEST_F(TestForDeathTest, SwitchStatement) { +// Microsoft compiler usually complains about switch statements without +// case labels. We suppress that warning for this test. +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4065) +#endif // _MSC_VER + + switch (0) + default: + ASSERT_DEATH(_exit(1), "") << "exit in default switch handler"; + + switch (0) + case 0: + EXPECT_DEATH(_exit(1), "") << "exit in switch case"; + +#ifdef _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER +} + +// Tests that a static member function can be used in a "fast" style +// death test. +TEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) { + testing::GTEST_FLAG(death_test_style) = "fast"; + ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember"); +} + +// Tests that a method of the test fixture can be used in a "fast" +// style death test. +TEST_F(TestForDeathTest, MemberFunctionFastStyle) { + testing::GTEST_FLAG(death_test_style) = "fast"; + should_die_ = true; + EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction"); +} + +void ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); } + +// Tests that death tests work even if the current directory has been +// changed. +TEST_F(TestForDeathTest, FastDeathTestInChangedDir) { + testing::GTEST_FLAG(death_test_style) = "fast"; + + ChangeToRootDir(); + EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); + + ChangeToRootDir(); + ASSERT_DEATH(_exit(1), ""); +} + +// Repeats a representative sample of death tests in the "threadsafe" style: + +TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) { + testing::GTEST_FLAG(death_test_style) = "threadsafe"; + ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember"); +} + +TEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) { + testing::GTEST_FLAG(death_test_style) = "threadsafe"; + should_die_ = true; + EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction"); +} + +TEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) { + testing::GTEST_FLAG(death_test_style) = "threadsafe"; + + for (int i = 0; i < 3; ++i) + EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), "") << ": i = " << i; +} + +TEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) { + testing::GTEST_FLAG(death_test_style) = "threadsafe"; + + ChangeToRootDir(); + EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); + + ChangeToRootDir(); + ASSERT_DEATH(_exit(1), ""); +} + +TEST_F(TestForDeathTest, MixedStyles) { + testing::GTEST_FLAG(death_test_style) = "threadsafe"; + EXPECT_DEATH(_exit(1), ""); + testing::GTEST_FLAG(death_test_style) = "fast"; + EXPECT_DEATH(_exit(1), ""); +} + +namespace { + +bool pthread_flag; + +void SetPthreadFlag() { + pthread_flag = true; +} + +} // namespace + +#if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD + +TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) { + if (!testing::GTEST_FLAG(death_test_use_fork)) { + testing::GTEST_FLAG(death_test_style) = "threadsafe"; + pthread_flag = false; + ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL)); + ASSERT_DEATH(_exit(1), ""); + ASSERT_FALSE(pthread_flag); + } +} + +#endif // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD + +// Tests that a method of another class can be used in a death test. +TEST_F(TestForDeathTest, MethodOfAnotherClass) { + const MayDie x(true); + ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction"); +} + +// Tests that a global function can be used in a death test. +TEST_F(TestForDeathTest, GlobalFunction) { + EXPECT_DEATH(GlobalFunction(), "GlobalFunction"); +} + +// Tests that any value convertible to an RE works as a second +// argument to EXPECT_DEATH. +TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) { + static const char regex_c_str[] = "GlobalFunction"; + EXPECT_DEATH(GlobalFunction(), regex_c_str); + + const testing::internal::RE regex(regex_c_str); + EXPECT_DEATH(GlobalFunction(), regex); + +#if GTEST_HAS_GLOBAL_STRING + const string regex_str(regex_c_str); + EXPECT_DEATH(GlobalFunction(), regex_str); +#endif // GTEST_HAS_GLOBAL_STRING + + const ::std::string regex_std_str(regex_c_str); + EXPECT_DEATH(GlobalFunction(), regex_std_str); +} + +// Tests that a non-void function can be used in a death test. +TEST_F(TestForDeathTest, NonVoidFunction) { + ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction"); +} + +// Tests that functions that take parameter(s) can be used in a death test. +TEST_F(TestForDeathTest, FunctionWithParameter) { + EXPECT_DEATH(DieIf(true), "DieIf\\(\\)"); + EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan"); +} + +// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture. +TEST_F(TestForDeathTest, OutsideFixture) { + DeathTestSubroutine(); +} + +// Tests that death tests can be done inside a loop. +TEST_F(TestForDeathTest, InsideLoop) { + for (int i = 0; i < 5; i++) { + EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i; + } +} + +// Tests that a compound statement can be used in a death test. +TEST_F(TestForDeathTest, CompoundStatement) { + EXPECT_DEATH({ // NOLINT + const int x = 2; + const int y = x + 1; + DieIfLessThan(x, y); + }, + "DieIfLessThan"); +} + +// Tests that code that doesn't die causes a death test to fail. +TEST_F(TestForDeathTest, DoesNotDie) { + EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"), + "failed to die"); +} + +// Tests that a death test fails when the error message isn't expected. +TEST_F(TestForDeathTest, ErrorMessageMismatch) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_DEATH(DieIf(true), "DieIfLessThan") << "End of death test message."; + }, "died but not with expected error"); +} + +// On exit, *aborted will be true iff the EXPECT_DEATH() statement +// aborted the function. +void ExpectDeathTestHelper(bool* aborted) { + *aborted = true; + EXPECT_DEATH(DieIf(false), "DieIf"); // This assertion should fail. + *aborted = false; +} + +// Tests that EXPECT_DEATH doesn't abort the test on failure. +TEST_F(TestForDeathTest, EXPECT_DEATH) { + bool aborted = true; + EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted), + "failed to die"); + EXPECT_FALSE(aborted); +} + +// Tests that ASSERT_DEATH does abort the test on failure. +TEST_F(TestForDeathTest, ASSERT_DEATH) { + static bool aborted; + EXPECT_FATAL_FAILURE({ // NOLINT + aborted = true; + ASSERT_DEATH(DieIf(false), "DieIf"); // This assertion should fail. + aborted = false; + }, "failed to die"); + EXPECT_TRUE(aborted); +} + +// Tests that EXPECT_DEATH evaluates the arguments exactly once. +TEST_F(TestForDeathTest, SingleEvaluation) { + int x = 3; + EXPECT_DEATH(DieIf((++x) == 4), "DieIf"); + + const char* regex = "DieIf"; + const char* regex_save = regex; + EXPECT_DEATH(DieIfLessThan(3, 4), regex++); + EXPECT_EQ(regex_save + 1, regex); +} + +// Tests that run-away death tests are reported as failures. +TEST_F(TestForDeathTest, Runaway) { + EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast(0), "Foo"), + "failed to die."); + + EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"), + "illegal return in test statement."); +} + + +// Tests that EXPECT_DEBUG_DEATH works as expected, +// that is, in debug mode, it: +// 1. Asserts on death. +// 2. Has no side effect. +// +// And in opt mode, it: +// 1. Has side effects but does not assert. +TEST_F(TestForDeathTest, TestExpectDebugDeath) { + int sideeffect = 0; + + EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), + "death.*DieInDebugElse12"); + +#ifdef NDEBUG + // Checks that the assignment occurs in opt mode (sideeffect). + EXPECT_EQ(12, sideeffect); +#else + // Checks that the assignment does not occur in dbg mode (no sideeffect). + EXPECT_EQ(0, sideeffect); +#endif +} + +// Tests that ASSERT_DEBUG_DEATH works as expected +// In debug mode: +// 1. Asserts on debug death. +// 2. Has no side effect. +// +// In opt mode: +// 1. Has side effects and returns the expected value (12). +TEST_F(TestForDeathTest, TestAssertDebugDeath) { + int sideeffect = 0; + + ASSERT_DEBUG_DEATH({ // NOLINT + // Tests that the return value is 12 in opt mode. + EXPECT_EQ(12, DieInDebugElse12(&sideeffect)); + // Tests that the side effect occurred in opt mode. + EXPECT_EQ(12, sideeffect); + }, "death.*DieInDebugElse12"); + +#ifdef NDEBUG + // Checks that the assignment occurs in opt mode (sideeffect). + EXPECT_EQ(12, sideeffect); +#else + // Checks that the assignment does not occur in dbg mode (no sideeffect). + EXPECT_EQ(0, sideeffect); +#endif +} + +#ifndef NDEBUG + +void ExpectDebugDeathHelper(bool* aborted) { + *aborted = true; + EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail."; + *aborted = false; +} + +#if GTEST_OS_WINDOWS +TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) { + printf("This test should be considered failing if it shows " + "any pop-up dialogs.\n"); + fflush(stdout); + + EXPECT_DEATH({ + testing::GTEST_FLAG(catch_exceptions) = false; + abort(); + }, ""); +} + +TEST(PopUpDeathTest, DoesNotShowPopUpOnThrow) { + printf("This test should be considered failing if it shows " + "any pop-up dialogs.\n"); + fflush(stdout); + + EXPECT_DEATH({ + testing::GTEST_FLAG(catch_exceptions) = false; + throw 1; + }, ""); +} +#endif // GTEST_OS_WINDOWS + +// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort +// the function. +TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) { + bool aborted = true; + EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), ""); + EXPECT_FALSE(aborted); +} + +void AssertDebugDeathHelper(bool* aborted) { + *aborted = true; + ASSERT_DEBUG_DEATH(return, "") << "This is expected to fail."; + *aborted = false; +} + +// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on +// failure. +TEST_F(TestForDeathTest, AssertDebugDeathAborts) { + static bool aborted; + aborted = false; + EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), ""); + EXPECT_TRUE(aborted); +} + +#endif // _NDEBUG + +// Tests the *_EXIT family of macros, using a variety of predicates. +static void TestExitMacros() { + EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), ""); + ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), ""); + +#if GTEST_OS_WINDOWS + // Of all signals effects on the process exit code, only those of SIGABRT + // are documented on Windows. + // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx. + EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), ""); +#else + EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo"; + ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar"; + + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "") + << "This failure is expected, too."; + }, "This failure is expected, too."); +#endif // GTEST_OS_WINDOWS + + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "") + << "This failure is expected."; + }, "This failure is expected."); +} + +TEST_F(TestForDeathTest, ExitMacros) { + TestExitMacros(); +} + +TEST_F(TestForDeathTest, ExitMacrosUsingFork) { + testing::GTEST_FLAG(death_test_use_fork) = true; + TestExitMacros(); +} + +TEST_F(TestForDeathTest, InvalidStyle) { + testing::GTEST_FLAG(death_test_style) = "rococo"; + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_DEATH(_exit(0), "") << "This failure is expected."; + }, "This failure is expected."); +} + +// A DeathTestFactory that returns MockDeathTests. +class MockDeathTestFactory : public DeathTestFactory { + public: + MockDeathTestFactory(); + virtual bool Create(const char* statement, + const ::testing::internal::RE* regex, + const char* file, int line, DeathTest** test); + + // Sets the parameters for subsequent calls to Create. + void SetParameters(bool create, DeathTest::TestRole role, + int status, bool passed); + + // Accessors. + int AssumeRoleCalls() const { return assume_role_calls_; } + int WaitCalls() const { return wait_calls_; } + int PassedCalls() const { return passed_args_.size(); } + bool PassedArgument(int n) const { return passed_args_[n]; } + int AbortCalls() const { return abort_args_.size(); } + DeathTest::AbortReason AbortArgument(int n) const { + return abort_args_[n]; + } + bool TestDeleted() const { return test_deleted_; } + + private: + friend class MockDeathTest; + // If true, Create will return a MockDeathTest; otherwise it returns + // NULL. + bool create_; + // The value a MockDeathTest will return from its AssumeRole method. + DeathTest::TestRole role_; + // The value a MockDeathTest will return from its Wait method. + int status_; + // The value a MockDeathTest will return from its Passed method. + bool passed_; + + // Number of times AssumeRole was called. + int assume_role_calls_; + // Number of times Wait was called. + int wait_calls_; + // The arguments to the calls to Passed since the last call to + // SetParameters. + std::vector passed_args_; + // The arguments to the calls to Abort since the last call to + // SetParameters. + std::vector abort_args_; + // True if the last MockDeathTest returned by Create has been + // deleted. + bool test_deleted_; +}; + + +// A DeathTest implementation useful in testing. It returns values set +// at its creation from its various inherited DeathTest methods, and +// reports calls to those methods to its parent MockDeathTestFactory +// object. +class MockDeathTest : public DeathTest { + public: + MockDeathTest(MockDeathTestFactory *parent, + TestRole role, int status, bool passed) : + parent_(parent), role_(role), status_(status), passed_(passed) { + } + virtual ~MockDeathTest() { + parent_->test_deleted_ = true; + } + virtual TestRole AssumeRole() { + ++parent_->assume_role_calls_; + return role_; + } + virtual int Wait() { + ++parent_->wait_calls_; + return status_; + } + virtual bool Passed(bool exit_status_ok) { + parent_->passed_args_.push_back(exit_status_ok); + return passed_; + } + virtual void Abort(AbortReason reason) { + parent_->abort_args_.push_back(reason); + } + private: + MockDeathTestFactory* const parent_; + const TestRole role_; + const int status_; + const bool passed_; +}; + + +// MockDeathTestFactory constructor. +MockDeathTestFactory::MockDeathTestFactory() + : create_(true), + role_(DeathTest::OVERSEE_TEST), + status_(0), + passed_(true), + assume_role_calls_(0), + wait_calls_(0), + passed_args_(), + abort_args_() { +} + + +// Sets the parameters for subsequent calls to Create. +void MockDeathTestFactory::SetParameters(bool create, + DeathTest::TestRole role, + int status, bool passed) { + create_ = create; + role_ = role; + status_ = status; + passed_ = passed; + + assume_role_calls_ = 0; + wait_calls_ = 0; + passed_args_.clear(); + abort_args_.clear(); +} + + +// Sets test to NULL (if create_ is false) or to the address of a new +// MockDeathTest object with parameters taken from the last call +// to SetParameters (if create_ is true). Always returns true. +bool MockDeathTestFactory::Create(const char* /*statement*/, + const ::testing::internal::RE* /*regex*/, + const char* /*file*/, + int /*line*/, + DeathTest** test) { + test_deleted_ = false; + if (create_) { + *test = new MockDeathTest(this, role_, status_, passed_); + } else { + *test = NULL; + } + return true; +} + +// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro. +// It installs a MockDeathTestFactory that is used for the duration +// of the test case. +class MacroLogicDeathTest : public testing::Test { + protected: + static testing::internal::ReplaceDeathTestFactory* replacer_; + static MockDeathTestFactory* factory_; + + static void SetUpTestCase() { + factory_ = new MockDeathTestFactory; + replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_); + } + + static void TearDownTestCase() { + delete replacer_; + replacer_ = NULL; + delete factory_; + factory_ = NULL; + } + + // Runs a death test that breaks the rules by returning. Such a death + // test cannot be run directly from a test routine that uses a + // MockDeathTest, or the remainder of the routine will not be executed. + static void RunReturningDeathTest(bool* flag) { + ASSERT_DEATH({ // NOLINT + *flag = true; + return; + }, ""); + } +}; + +testing::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_ + = NULL; +MockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL; + + +// Test that nothing happens when the factory doesn't return a DeathTest: +TEST_F(MacroLogicDeathTest, NothingHappens) { + bool flag = false; + factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true); + EXPECT_DEATH(flag = true, ""); + EXPECT_FALSE(flag); + EXPECT_EQ(0, factory_->AssumeRoleCalls()); + EXPECT_EQ(0, factory_->WaitCalls()); + EXPECT_EQ(0, factory_->PassedCalls()); + EXPECT_EQ(0, factory_->AbortCalls()); + EXPECT_FALSE(factory_->TestDeleted()); +} + +// Test that the parent process doesn't run the death test code, +// and that the Passed method returns false when the (simulated) +// child process exits with status 0: +TEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) { + bool flag = false; + factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true); + EXPECT_DEATH(flag = true, ""); + EXPECT_FALSE(flag); + EXPECT_EQ(1, factory_->AssumeRoleCalls()); + EXPECT_EQ(1, factory_->WaitCalls()); + ASSERT_EQ(1, factory_->PassedCalls()); + EXPECT_FALSE(factory_->PassedArgument(0)); + EXPECT_EQ(0, factory_->AbortCalls()); + EXPECT_TRUE(factory_->TestDeleted()); +} + +// Tests that the Passed method was given the argument "true" when +// the (simulated) child process exits with status 1: +TEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) { + bool flag = false; + factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true); + EXPECT_DEATH(flag = true, ""); + EXPECT_FALSE(flag); + EXPECT_EQ(1, factory_->AssumeRoleCalls()); + EXPECT_EQ(1, factory_->WaitCalls()); + ASSERT_EQ(1, factory_->PassedCalls()); + EXPECT_TRUE(factory_->PassedArgument(0)); + EXPECT_EQ(0, factory_->AbortCalls()); + EXPECT_TRUE(factory_->TestDeleted()); +} + +// Tests that the (simulated) child process executes the death test +// code, and is aborted with the correct AbortReason if it +// executes a return statement. +TEST_F(MacroLogicDeathTest, ChildPerformsReturn) { + bool flag = false; + factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true); + RunReturningDeathTest(&flag); + EXPECT_TRUE(flag); + EXPECT_EQ(1, factory_->AssumeRoleCalls()); + EXPECT_EQ(0, factory_->WaitCalls()); + EXPECT_EQ(0, factory_->PassedCalls()); + EXPECT_EQ(1, factory_->AbortCalls()); + EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT, + factory_->AbortArgument(0)); + EXPECT_TRUE(factory_->TestDeleted()); +} + +// Tests that the (simulated) child process is aborted with the +// correct AbortReason if it does not die. +TEST_F(MacroLogicDeathTest, ChildDoesNotDie) { + bool flag = false; + factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true); + EXPECT_DEATH(flag = true, ""); + EXPECT_TRUE(flag); + EXPECT_EQ(1, factory_->AssumeRoleCalls()); + EXPECT_EQ(0, factory_->WaitCalls()); + EXPECT_EQ(0, factory_->PassedCalls()); + // This time there are two calls to Abort: one since the test didn't + // die, and another from the ReturnSentinel when it's destroyed. The + // sentinel normally isn't destroyed if a test doesn't die, since + // _exit(2) is called in that case by ForkingDeathTest, but not by + // our MockDeathTest. + ASSERT_EQ(2, factory_->AbortCalls()); + EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE, + factory_->AbortArgument(0)); + EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT, + factory_->AbortArgument(1)); + EXPECT_TRUE(factory_->TestDeleted()); +} + +// Tests that a successful death test does not register a successful +// test part. +TEST(SuccessRegistrationDeathTest, NoSuccessPart) { + EXPECT_DEATH(_exit(1), ""); + EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +TEST(StreamingAssertionsDeathTest, DeathTest) { + EXPECT_DEATH(_exit(1), "") << "unexpected failure"; + ASSERT_DEATH(_exit(1), "") << "unexpected failure"; + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_DEATH(_exit(0), "") << "expected failure"; + }, "expected failure"); + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_DEATH(_exit(0), "") << "expected failure"; + }, "expected failure"); +} + +// Tests that GetLastErrnoDescription returns an empty string when the +// last error is 0 and non-empty string when it is non-zero. +TEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) { + errno = ENOENT; + EXPECT_STRNE("", GetLastErrnoDescription().c_str()); + errno = 0; + EXPECT_STREQ("", GetLastErrnoDescription().c_str()); +} + +#if GTEST_OS_WINDOWS +TEST(AutoHandleTest, AutoHandleWorks) { + HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL); + ASSERT_NE(INVALID_HANDLE_VALUE, handle); + + // Tests that the AutoHandle is correctly initialized with a handle. + testing::internal::AutoHandle auto_handle(handle); + EXPECT_EQ(handle, auto_handle.Get()); + + // Tests that Reset assigns INVALID_HANDLE_VALUE. + // Note that this cannot verify whether the original handle is closed. + auto_handle.Reset(); + EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get()); + + // Tests that Reset assigns the new handle. + // Note that this cannot verify whether the original handle is closed. + handle = ::CreateEvent(NULL, FALSE, FALSE, NULL); + ASSERT_NE(INVALID_HANDLE_VALUE, handle); + auto_handle.Reset(handle); + EXPECT_EQ(handle, auto_handle.Get()); + + // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default. + testing::internal::AutoHandle auto_handle2; + EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get()); +} +#endif // GTEST_OS_WINDOWS + +#if GTEST_OS_WINDOWS +typedef unsigned __int64 BiggestParsable; +typedef signed __int64 BiggestSignedParsable; +const BiggestParsable kBiggestParsableMax = ULLONG_MAX; +const BiggestParsable kBiggestSignedParsableMax = LLONG_MAX; +#else +typedef unsigned long long BiggestParsable; +typedef signed long long BiggestSignedParsable; +const BiggestParsable kBiggestParsableMax = + ::std::numeric_limits::max(); +const BiggestSignedParsable kBiggestSignedParsableMax = + ::std::numeric_limits::max(); +#endif // GTEST_OS_WINDOWS + +TEST(ParseNaturalNumberTest, RejectsInvalidFormat) { + BiggestParsable result = 0; + + // Rejects non-numbers. + EXPECT_FALSE(ParseNaturalNumber(String("non-number string"), &result)); + + // Rejects numbers with whitespace prefix. + EXPECT_FALSE(ParseNaturalNumber(String(" 123"), &result)); + + // Rejects negative numbers. + EXPECT_FALSE(ParseNaturalNumber(String("-123"), &result)); + + // Rejects numbers starting with a plus sign. + EXPECT_FALSE(ParseNaturalNumber(String("+123"), &result)); + errno = 0; +} + +TEST(ParseNaturalNumberTest, RejectsOverflownNumbers) { + BiggestParsable result = 0; + + EXPECT_FALSE(ParseNaturalNumber(String("99999999999999999999999"), &result)); + + signed char char_result = 0; + EXPECT_FALSE(ParseNaturalNumber(String("200"), &char_result)); + errno = 0; +} + +TEST(ParseNaturalNumberTest, AcceptsValidNumbers) { + BiggestParsable result = 0; + + result = 0; + ASSERT_TRUE(ParseNaturalNumber(String("123"), &result)); + EXPECT_EQ(123U, result); + + // Check 0 as an edge case. + result = 1; + ASSERT_TRUE(ParseNaturalNumber(String("0"), &result)); + EXPECT_EQ(0U, result); + + result = 1; + ASSERT_TRUE(ParseNaturalNumber(String("00000"), &result)); + EXPECT_EQ(0U, result); +} + +TEST(ParseNaturalNumberTest, AcceptsTypeLimits) { + Message msg; + msg << kBiggestParsableMax; + + BiggestParsable result = 0; + EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result)); + EXPECT_EQ(kBiggestParsableMax, result); + + Message msg2; + msg2 << kBiggestSignedParsableMax; + + BiggestSignedParsable signed_result = 0; + EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result)); + EXPECT_EQ(kBiggestSignedParsableMax, signed_result); + + Message msg3; + msg3 << INT_MAX; + + int int_result = 0; + EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result)); + EXPECT_EQ(INT_MAX, int_result); + + Message msg4; + msg4 << UINT_MAX; + + unsigned int uint_result = 0; + EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result)); + EXPECT_EQ(UINT_MAX, uint_result); +} + +TEST(ParseNaturalNumberTest, WorksForShorterIntegers) { + short short_result = 0; + ASSERT_TRUE(ParseNaturalNumber(String("123"), &short_result)); + EXPECT_EQ(123, short_result); + + signed char char_result = 0; + ASSERT_TRUE(ParseNaturalNumber(String("123"), &char_result)); + EXPECT_EQ(123, char_result); +} + +#if GTEST_OS_WINDOWS +TEST(EnvironmentTest, HandleFitsIntoSizeT) { + // TODO(vladl@google.com): Remove this test after this condition is verified + // in a static assertion in gtest-death-test.cc in the function + // GetStatusFileDescriptor. + ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t)); +} +#endif // GTEST_OS_WINDOWS + +// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger +// failures when death tests are available on the system. +TEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) { + EXPECT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestExpectMacro"), + "death inside CondDeathTestExpectMacro"); + ASSERT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestAssertMacro"), + "death inside CondDeathTestAssertMacro"); + + // Empty statement will not crash, which must trigger a failure. + EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, ""), ""); + EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, ""), ""); +} + +#else + +using testing::internal::CaptureStderr; +using testing::internal::GetCapturedStderr; +using testing::internal::String; + +// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still +// defined but do not trigger failures when death tests are not available on +// the system. +TEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) { + // Empty statement will not crash, but that should not trigger a failure + // when death tests are not supported. + CaptureStderr(); + EXPECT_DEATH_IF_SUPPORTED(;, ""); + String output = GetCapturedStderr(); + ASSERT_TRUE(NULL != strstr(output.c_str(), + "Death tests are not supported on this platform")); + ASSERT_TRUE(NULL != strstr(output.c_str(), ";")); + + // The streamed message should not be printed as there is no test failure. + CaptureStderr(); + EXPECT_DEATH_IF_SUPPORTED(;, "") << "streamed message"; + output = GetCapturedStderr(); + ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message")); + + CaptureStderr(); + ASSERT_DEATH_IF_SUPPORTED(;, ""); // NOLINT + output = GetCapturedStderr(); + ASSERT_TRUE(NULL != strstr(output.c_str(), + "Death tests are not supported on this platform")); + ASSERT_TRUE(NULL != strstr(output.c_str(), ";")); + + CaptureStderr(); + ASSERT_DEATH_IF_SUPPORTED(;, "") << "streamed message"; // NOLINT + output = GetCapturedStderr(); + ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message")); +} + +void FuncWithAssert(int* n) { + ASSERT_DEATH_IF_SUPPORTED(return;, ""); + (*n)++; +} + +// Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current +// function (as ASSERT_DEATH does) if death tests are not supported. +TEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) { + int n = 0; + FuncWithAssert(&n); + EXPECT_EQ(1, n); +} +#endif // GTEST_HAS_DEATH_TEST + +// Tests that the death test macros expand to code which may or may not +// be followed by operator<<, and that in either case the complete text +// comprises only a single C++ statement. +// +// The syntax should work whether death tests are available or not. +TEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) { + if (AlwaysFalse()) + // This would fail if executed; this is a compilation test only + ASSERT_DEATH_IF_SUPPORTED(return, ""); + + if (AlwaysTrue()) + EXPECT_DEATH_IF_SUPPORTED(_exit(1), ""); + else + // This empty "else" branch is meant to ensure that EXPECT_DEATH + // doesn't expand into an "if" statement without an "else" + ; // NOLINT + + if (AlwaysFalse()) + ASSERT_DEATH_IF_SUPPORTED(return, "") << "did not die"; + + if (AlwaysFalse()) + ; // NOLINT + else + EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << 1 << 2 << 3; +} + +// Tests that conditional death test macros expand to code which interacts +// well with switch statements. +TEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) { +// Microsoft compiler usually complains about switch statements without +// case labels. We suppress that warning for this test. +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4065) +#endif // _MSC_VER + + switch (0) + default: + ASSERT_DEATH_IF_SUPPORTED(_exit(1), "") + << "exit in default switch handler"; + + switch (0) + case 0: + EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << "exit in switch case"; + +#ifdef _MSC_VER +#pragma warning(pop) +#endif // _MSC_VER +} + +// Tests that a test case whose name ends with "DeathTest" works fine +// on Windows. +TEST(NotADeathTest, Test) { + SUCCEED(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc new file mode 100644 index 000000000..625028275 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc @@ -0,0 +1,690 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: keith.ray@gmail.com (Keith Ray) +// +// Google Test filepath utilities +// +// This file tests classes and functions used internally by +// Google Test. They are subject to change without notice. +// +// This file is #included from gtest_unittest.cc, to avoid changing +// build or make-files for some existing Google Test clients. Do not +// #include this file anywhere else! + +#include +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +#if GTEST_OS_WINDOWS_MOBILE +#include // NOLINT +#elif GTEST_OS_WINDOWS +#include // NOLINT +#endif // GTEST_OS_WINDOWS_MOBILE + +namespace testing { +namespace internal { +namespace { + +#if GTEST_OS_WINDOWS_MOBILE +// TODO(wan@google.com): Move these to the POSIX adapter section in +// gtest-port.h. + +// Windows CE doesn't have the remove C function. +int remove(const char* path) { + LPCWSTR wpath = String::AnsiToUtf16(path); + int ret = DeleteFile(wpath) ? 0 : -1; + delete [] wpath; + return ret; +} +// Windows CE doesn't have the _rmdir C function. +int _rmdir(const char* path) { + FilePath filepath(path); + LPCWSTR wpath = String::AnsiToUtf16( + filepath.RemoveTrailingPathSeparator().c_str()); + int ret = RemoveDirectory(wpath) ? 0 : -1; + delete [] wpath; + return ret; +} + +#else + +TEST(GetCurrentDirTest, ReturnsCurrentDir) { + const FilePath original_dir = FilePath::GetCurrentDir(); + EXPECT_FALSE(original_dir.IsEmpty()); + + posix::ChDir(GTEST_PATH_SEP_); + const FilePath cwd = FilePath::GetCurrentDir(); + posix::ChDir(original_dir.c_str()); + +#if GTEST_OS_WINDOWS + // Skips the ":". + const char* const cwd_without_drive = strchr(cwd.c_str(), ':'); + ASSERT_TRUE(cwd_without_drive != NULL); + EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1); +#else + EXPECT_STREQ(GTEST_PATH_SEP_, cwd.c_str()); +#endif +} + +#endif // GTEST_OS_WINDOWS_MOBILE + +TEST(IsEmptyTest, ReturnsTrueForEmptyPath) { + EXPECT_TRUE(FilePath("").IsEmpty()); + EXPECT_TRUE(FilePath(NULL).IsEmpty()); +} + +TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) { + EXPECT_FALSE(FilePath("a").IsEmpty()); + EXPECT_FALSE(FilePath(".").IsEmpty()); + EXPECT_FALSE(FilePath("a/b").IsEmpty()); + EXPECT_FALSE(FilePath("a\\b\\").IsEmpty()); +} + +// RemoveDirectoryName "" -> "" +TEST(RemoveDirectoryNameTest, WhenEmptyName) { + EXPECT_STREQ("", FilePath("").RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName "afile" -> "afile" +TEST(RemoveDirectoryNameTest, ButNoDirectory) { + EXPECT_STREQ("afile", + FilePath("afile").RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName "/afile" -> "afile" +TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) { + EXPECT_STREQ("afile", + FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName "adir/" -> "" +TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) { + EXPECT_STREQ("", + FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName "adir/afile" -> "afile" +TEST(RemoveDirectoryNameTest, ShouldGiveFileName) { + EXPECT_STREQ("afile", + FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName "adir/subdir/afile" -> "afile" +TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) { + EXPECT_STREQ("afile", + FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile") + .RemoveDirectoryName().c_str()); +} + +#if GTEST_HAS_ALT_PATH_SEP_ + +// Tests that RemoveDirectoryName() works with the alternate separator +// on Windows. + +// RemoveDirectoryName("/afile") -> "afile" +TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) { + EXPECT_STREQ("afile", + FilePath("/afile").RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName("adir/") -> "" +TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) { + EXPECT_STREQ("", + FilePath("adir/").RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName("adir/afile") -> "afile" +TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) { + EXPECT_STREQ("afile", + FilePath("adir/afile").RemoveDirectoryName().c_str()); +} + +// RemoveDirectoryName("adir/subdir/afile") -> "afile" +TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) { + EXPECT_STREQ("afile", + FilePath("adir/subdir/afile").RemoveDirectoryName().c_str()); +} + +#endif + +// RemoveFileName "" -> "./" +TEST(RemoveFileNameTest, EmptyName) { +#if GTEST_OS_WINDOWS_MOBILE + // On Windows CE, we use the root as the current directory. + EXPECT_STREQ(GTEST_PATH_SEP_, + FilePath("").RemoveFileName().c_str()); +#else + EXPECT_STREQ("." GTEST_PATH_SEP_, + FilePath("").RemoveFileName().c_str()); +#endif +} + +// RemoveFileName "adir/" -> "adir/" +TEST(RemoveFileNameTest, ButNoFile) { + EXPECT_STREQ("adir" GTEST_PATH_SEP_, + FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().c_str()); +} + +// RemoveFileName "adir/afile" -> "adir/" +TEST(RemoveFileNameTest, GivesDirName) { + EXPECT_STREQ("adir" GTEST_PATH_SEP_, + FilePath("adir" GTEST_PATH_SEP_ "afile") + .RemoveFileName().c_str()); +} + +// RemoveFileName "adir/subdir/afile" -> "adir/subdir/" +TEST(RemoveFileNameTest, GivesDirAndSubDirName) { + EXPECT_STREQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_, + FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile") + .RemoveFileName().c_str()); +} + +// RemoveFileName "/afile" -> "/" +TEST(RemoveFileNameTest, GivesRootDir) { + EXPECT_STREQ(GTEST_PATH_SEP_, + FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().c_str()); +} + +#if GTEST_HAS_ALT_PATH_SEP_ + +// Tests that RemoveFileName() works with the alternate separator on +// Windows. + +// RemoveFileName("adir/") -> "adir/" +TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) { + EXPECT_STREQ("adir" GTEST_PATH_SEP_, + FilePath("adir/").RemoveFileName().c_str()); +} + +// RemoveFileName("adir/afile") -> "adir/" +TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) { + EXPECT_STREQ("adir" GTEST_PATH_SEP_, + FilePath("adir/afile").RemoveFileName().c_str()); +} + +// RemoveFileName("adir/subdir/afile") -> "adir/subdir/" +TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) { + EXPECT_STREQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_, + FilePath("adir/subdir/afile").RemoveFileName().c_str()); +} + +// RemoveFileName("/afile") -> "\" +TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) { + EXPECT_STREQ(GTEST_PATH_SEP_, + FilePath("/afile").RemoveFileName().c_str()); +} + +#endif + +TEST(MakeFileNameTest, GenerateWhenNumberIsZero) { + FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"), + 0, "xml"); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str()); +} + +TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) { + FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"), + 12, "xml"); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str()); +} + +TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) { + FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_), + FilePath("bar"), 0, "xml"); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str()); +} + +TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) { + FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_), + FilePath("bar"), 12, "xml"); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.c_str()); +} + +TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) { + FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"), + 0, "xml"); + EXPECT_STREQ("bar.xml", actual.c_str()); +} + +TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) { + FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"), + 14, "xml"); + EXPECT_STREQ("bar_14.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo"), + FilePath("bar.xml")); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_), + FilePath("bar.xml")); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, Path1BeingEmpty) { + FilePath actual = FilePath::ConcatPaths(FilePath(""), + FilePath("bar.xml")); + EXPECT_STREQ("bar.xml", actual.c_str()); +} + +TEST(ConcatPathsTest, Path2BeingEmpty) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo"), + FilePath("")); + EXPECT_STREQ("foo" GTEST_PATH_SEP_, actual.c_str()); +} + +TEST(ConcatPathsTest, BothPathBeingEmpty) { + FilePath actual = FilePath::ConcatPaths(FilePath(""), + FilePath("")); + EXPECT_STREQ("", actual.c_str()); +} + +TEST(ConcatPathsTest, Path1ContainsPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"), + FilePath("foobar.xml")); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml", + actual.c_str()); +} + +TEST(ConcatPathsTest, Path2ContainsPathSep) { + FilePath actual = FilePath::ConcatPaths( + FilePath("foo" GTEST_PATH_SEP_), + FilePath("bar" GTEST_PATH_SEP_ "bar.xml")); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml", + actual.c_str()); +} + +TEST(ConcatPathsTest, Path2EndsWithPathSep) { + FilePath actual = FilePath::ConcatPaths(FilePath("foo"), + FilePath("bar" GTEST_PATH_SEP_)); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.c_str()); +} + +// RemoveTrailingPathSeparator "" -> "" +TEST(RemoveTrailingPathSeparatorTest, EmptyString) { + EXPECT_STREQ("", + FilePath("").RemoveTrailingPathSeparator().c_str()); +} + +// RemoveTrailingPathSeparator "foo" -> "foo" +TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) { + EXPECT_STREQ("foo", + FilePath("foo").RemoveTrailingPathSeparator().c_str()); +} + +// RemoveTrailingPathSeparator "foo/" -> "foo" +TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) { + EXPECT_STREQ( + "foo", + FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().c_str()); +#if GTEST_HAS_ALT_PATH_SEP_ + EXPECT_STREQ("foo", + FilePath("foo/").RemoveTrailingPathSeparator().c_str()); +#endif +} + +// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/" +TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) { + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar", + FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_) + .RemoveTrailingPathSeparator().c_str()); +} + +// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar" +TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) { + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar", + FilePath("foo" GTEST_PATH_SEP_ "bar") + .RemoveTrailingPathSeparator().c_str()); +} + +TEST(DirectoryTest, RootDirectoryExists) { +#if GTEST_OS_WINDOWS // We are on Windows. + char current_drive[_MAX_PATH]; // NOLINT + current_drive[0] = static_cast(_getdrive() + 'A' - 1); + current_drive[1] = ':'; + current_drive[2] = '\\'; + current_drive[3] = '\0'; + EXPECT_TRUE(FilePath(current_drive).DirectoryExists()); +#else + EXPECT_TRUE(FilePath("/").DirectoryExists()); +#endif // GTEST_OS_WINDOWS +} + +#if GTEST_OS_WINDOWS +TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) { + const int saved_drive_ = _getdrive(); + // Find a drive that doesn't exist. Start with 'Z' to avoid common ones. + for (char drive = 'Z'; drive >= 'A'; drive--) + if (_chdrive(drive - 'A' + 1) == -1) { + char non_drive[_MAX_PATH]; // NOLINT + non_drive[0] = drive; + non_drive[1] = ':'; + non_drive[2] = '\\'; + non_drive[3] = '\0'; + EXPECT_FALSE(FilePath(non_drive).DirectoryExists()); + break; + } + _chdrive(saved_drive_); +} +#endif // GTEST_OS_WINDOWS + +#if !GTEST_OS_WINDOWS_MOBILE +// Windows CE _does_ consider an empty directory to exist. +TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) { + EXPECT_FALSE(FilePath("").DirectoryExists()); +} +#endif // !GTEST_OS_WINDOWS_MOBILE + +TEST(DirectoryTest, CurrentDirectoryExists) { +#if GTEST_OS_WINDOWS // We are on Windows. +#ifndef _WIN32_CE // Windows CE doesn't have a current directory. + EXPECT_TRUE(FilePath(".").DirectoryExists()); + EXPECT_TRUE(FilePath(".\\").DirectoryExists()); +#endif // _WIN32_CE +#else + EXPECT_TRUE(FilePath(".").DirectoryExists()); + EXPECT_TRUE(FilePath("./").DirectoryExists()); +#endif // GTEST_OS_WINDOWS +} + +TEST(NormalizeTest, NullStringsEqualEmptyDirectory) { + EXPECT_STREQ("", FilePath(NULL).c_str()); + EXPECT_STREQ("", FilePath(String(NULL)).c_str()); +} + +// "foo/bar" == foo//bar" == "foo///bar" +TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) { + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar", + FilePath("foo" GTEST_PATH_SEP_ "bar").c_str()); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar", + FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str()); + EXPECT_STREQ("foo" GTEST_PATH_SEP_ "bar", + FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ + GTEST_PATH_SEP_ "bar").c_str()); +} + +// "/bar" == //bar" == "///bar" +TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) { + EXPECT_STREQ(GTEST_PATH_SEP_ "bar", + FilePath(GTEST_PATH_SEP_ "bar").c_str()); + EXPECT_STREQ(GTEST_PATH_SEP_ "bar", + FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str()); + EXPECT_STREQ(GTEST_PATH_SEP_ "bar", + FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").c_str()); +} + +// "foo/" == foo//" == "foo///" +TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) { + EXPECT_STREQ("foo" GTEST_PATH_SEP_, + FilePath("foo" GTEST_PATH_SEP_).c_str()); + EXPECT_STREQ("foo" GTEST_PATH_SEP_, + FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str()); + EXPECT_STREQ("foo" GTEST_PATH_SEP_, + FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).c_str()); +} + +#if GTEST_HAS_ALT_PATH_SEP_ + +// Tests that separators at the end of the string are normalized +// regardless of their combination (e.g. "foo\" =="foo/\" == +// "foo\\/"). +TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) { + EXPECT_STREQ("foo" GTEST_PATH_SEP_, + FilePath("foo/").c_str()); + EXPECT_STREQ("foo" GTEST_PATH_SEP_, + FilePath("foo" GTEST_PATH_SEP_ "/").c_str()); + EXPECT_STREQ("foo" GTEST_PATH_SEP_, + FilePath("foo//" GTEST_PATH_SEP_).c_str()); +} + +#endif + +TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) { + FilePath default_path; + FilePath non_default_path("path"); + non_default_path = default_path; + EXPECT_STREQ("", non_default_path.c_str()); + EXPECT_STREQ("", default_path.c_str()); // RHS var is unchanged. +} + +TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) { + FilePath non_default_path("path"); + FilePath default_path; + default_path = non_default_path; + EXPECT_STREQ("path", default_path.c_str()); + EXPECT_STREQ("path", non_default_path.c_str()); // RHS var is unchanged. +} + +TEST(AssignmentOperatorTest, ConstAssignedToNonConst) { + const FilePath const_default_path("const_path"); + FilePath non_default_path("path"); + non_default_path = const_default_path; + EXPECT_STREQ("const_path", non_default_path.c_str()); +} + +class DirectoryCreationTest : public Test { + protected: + virtual void SetUp() { + testdata_path_.Set(FilePath(String::Format("%s%s%s", + TempDir().c_str(), GetCurrentExecutableName().c_str(), + "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_))); + testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator()); + + unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"), + 0, "txt")); + unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"), + 1, "txt")); + + remove(testdata_file_.c_str()); + remove(unique_file0_.c_str()); + remove(unique_file1_.c_str()); + posix::RmDir(testdata_path_.c_str()); + } + + virtual void TearDown() { + remove(testdata_file_.c_str()); + remove(unique_file0_.c_str()); + remove(unique_file1_.c_str()); + posix::RmDir(testdata_path_.c_str()); + } + + String TempDir() const { +#if GTEST_OS_WINDOWS_MOBILE + return String("\\temp\\"); +#elif GTEST_OS_WINDOWS + const char* temp_dir = posix::GetEnv("TEMP"); + if (temp_dir == NULL || temp_dir[0] == '\0') + return String("\\temp\\"); + else if (String(temp_dir).EndsWith("\\")) + return String(temp_dir); + else + return String::Format("%s\\", temp_dir); +#else + return String("/tmp/"); +#endif // GTEST_OS_WINDOWS_MOBILE + } + + void CreateTextFile(const char* filename) { + FILE* f = posix::FOpen(filename, "w"); + fprintf(f, "text\n"); + fclose(f); + } + + // Strings representing a directory and a file, with identical paths + // except for the trailing separator character that distinquishes + // a directory named 'test' from a file named 'test'. Example names: + FilePath testdata_path_; // "/tmp/directory_creation/test/" + FilePath testdata_file_; // "/tmp/directory_creation/test" + FilePath unique_file0_; // "/tmp/directory_creation/test/unique.txt" + FilePath unique_file1_; // "/tmp/directory_creation/test/unique_1.txt" +}; + +TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) { + EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str(); + EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively()); + EXPECT_TRUE(testdata_path_.DirectoryExists()); +} + +TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) { + EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.c_str(); + EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively()); + // Call 'create' again... should still succeed. + EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively()); +} + +TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) { + FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_, + FilePath("unique"), "txt")); + EXPECT_STREQ(unique_file0_.c_str(), file_path.c_str()); + EXPECT_FALSE(file_path.FileOrDirectoryExists()); // file not there + + testdata_path_.CreateDirectoriesRecursively(); + EXPECT_FALSE(file_path.FileOrDirectoryExists()); // file still not there + CreateTextFile(file_path.c_str()); + EXPECT_TRUE(file_path.FileOrDirectoryExists()); + + FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_, + FilePath("unique"), "txt")); + EXPECT_STREQ(unique_file1_.c_str(), file_path2.c_str()); + EXPECT_FALSE(file_path2.FileOrDirectoryExists()); // file not there + CreateTextFile(file_path2.c_str()); + EXPECT_TRUE(file_path2.FileOrDirectoryExists()); +} + +TEST_F(DirectoryCreationTest, CreateDirectoriesFail) { + // force a failure by putting a file where we will try to create a directory. + CreateTextFile(testdata_file_.c_str()); + EXPECT_TRUE(testdata_file_.FileOrDirectoryExists()); + EXPECT_FALSE(testdata_file_.DirectoryExists()); + EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively()); +} + +TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) { + const FilePath test_detail_xml("test_detail.xml"); + EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively()); +} + +TEST(FilePathTest, DefaultConstructor) { + FilePath fp; + EXPECT_STREQ("", fp.c_str()); +} + +TEST(FilePathTest, CharAndCopyConstructors) { + const FilePath fp("spicy"); + EXPECT_STREQ("spicy", fp.c_str()); + + const FilePath fp_copy(fp); + EXPECT_STREQ("spicy", fp_copy.c_str()); +} + +TEST(FilePathTest, StringConstructor) { + const FilePath fp(String("cider")); + EXPECT_STREQ("cider", fp.c_str()); +} + +TEST(FilePathTest, Set) { + const FilePath apple("apple"); + FilePath mac("mac"); + mac.Set(apple); // Implement Set() since overloading operator= is forbidden. + EXPECT_STREQ("apple", mac.c_str()); + EXPECT_STREQ("apple", apple.c_str()); +} + +TEST(FilePathTest, ToString) { + const FilePath file("drink"); + String str(file.ToString()); + EXPECT_STREQ("drink", str.c_str()); +} + +TEST(FilePathTest, RemoveExtension) { + EXPECT_STREQ("app", FilePath("app.exe").RemoveExtension("exe").c_str()); + EXPECT_STREQ("APP", FilePath("APP.EXE").RemoveExtension("exe").c_str()); +} + +TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) { + EXPECT_STREQ("app", FilePath("app").RemoveExtension("exe").c_str()); +} + +TEST(FilePathTest, IsDirectory) { + EXPECT_FALSE(FilePath("cola").IsDirectory()); + EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory()); +#if GTEST_HAS_ALT_PATH_SEP_ + EXPECT_TRUE(FilePath("koala/").IsDirectory()); +#endif +} + +TEST(FilePathTest, IsAbsolutePath) { + EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath()); + EXPECT_FALSE(FilePath("").IsAbsolutePath()); +#if GTEST_OS_WINDOWS + EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not" + GTEST_PATH_SEP_ "relative").IsAbsolutePath()); + EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath()); + EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not" + GTEST_PATH_SEP_ "relative").IsAbsolutePath()); +#else + EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative") + .IsAbsolutePath()); +#endif // GTEST_OS_WINDOWS +} + +TEST(FilePathTest, IsRootDirectory) { +#if GTEST_OS_WINDOWS + EXPECT_TRUE(FilePath("a:\\").IsRootDirectory()); + EXPECT_TRUE(FilePath("Z:/").IsRootDirectory()); + EXPECT_TRUE(FilePath("e://").IsRootDirectory()); + EXPECT_FALSE(FilePath("").IsRootDirectory()); + EXPECT_FALSE(FilePath("b:").IsRootDirectory()); + EXPECT_FALSE(FilePath("b:a").IsRootDirectory()); + EXPECT_FALSE(FilePath("8:/").IsRootDirectory()); + EXPECT_FALSE(FilePath("c|/").IsRootDirectory()); +#else + EXPECT_TRUE(FilePath("/").IsRootDirectory()); + EXPECT_TRUE(FilePath("//").IsRootDirectory()); + EXPECT_FALSE(FilePath("").IsRootDirectory()); + EXPECT_FALSE(FilePath("\\").IsRootDirectory()); + EXPECT_FALSE(FilePath("/x").IsRootDirectory()); +#endif +} + +} // namespace +} // namespace internal +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc new file mode 100644 index 000000000..eae82296c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc @@ -0,0 +1,154 @@ +// Copyright 2003, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: Dan Egnor (egnor@google.com) +// Ported to Windows: Vadim Berman (vadimb@google.com) + +#include + +#include +#include + +namespace { + +using testing::Message; +using testing::internal::linked_ptr; + +int num; +Message* history = NULL; + +// Class which tracks allocation/deallocation +class A { + public: + A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; } + virtual ~A() { *history << "A" << mynum << " dtor\n"; } + virtual void Use() { *history << "A" << mynum << " use\n"; } + protected: + int mynum; +}; + +// Subclass +class B : public A { + public: + B() { *history << "B" << mynum << " ctor\n"; } + ~B() { *history << "B" << mynum << " dtor\n"; } + virtual void Use() { *history << "B" << mynum << " use\n"; } +}; + +class LinkedPtrTest : public testing::Test { + public: + LinkedPtrTest() { + num = 0; + history = new Message; + } + + virtual ~LinkedPtrTest() { + delete history; + history = NULL; + } +}; + +TEST_F(LinkedPtrTest, GeneralTest) { + { + linked_ptr a0, a1, a2; + a0 = a0; + a1 = a2; + ASSERT_EQ(a0.get(), static_cast(NULL)); + ASSERT_EQ(a1.get(), static_cast(NULL)); + ASSERT_EQ(a2.get(), static_cast(NULL)); + ASSERT_TRUE(a0 == NULL); + ASSERT_TRUE(a1 == NULL); + ASSERT_TRUE(a2 == NULL); + + { + linked_ptr a3(new A); + a0 = a3; + ASSERT_TRUE(a0 == a3); + ASSERT_TRUE(a0 != NULL); + ASSERT_TRUE(a0.get() == a3); + ASSERT_TRUE(a0 == a3.get()); + linked_ptr a4(a0); + a1 = a4; + linked_ptr a5(new A); + ASSERT_TRUE(a5.get() != a3); + ASSERT_TRUE(a5 != a3.get()); + a2 = a5; + linked_ptr b0(new B); + linked_ptr a6(b0); + ASSERT_TRUE(b0 == a6); + ASSERT_TRUE(a6 == b0); + ASSERT_TRUE(b0 != NULL); + a5 = b0; + a5 = b0; + a3->Use(); + a4->Use(); + a5->Use(); + a6->Use(); + b0->Use(); + (*b0).Use(); + b0.get()->Use(); + } + + a0->Use(); + a1->Use(); + a2->Use(); + + a1 = a2; + a2.reset(new A); + a0.reset(); + + linked_ptr a7; + } + + ASSERT_STREQ( + "A0 ctor\n" + "A1 ctor\n" + "A2 ctor\n" + "B2 ctor\n" + "A0 use\n" + "A0 use\n" + "B2 use\n" + "B2 use\n" + "B2 use\n" + "B2 use\n" + "B2 use\n" + "B2 dtor\n" + "A2 dtor\n" + "A0 use\n" + "A0 use\n" + "A1 use\n" + "A3 ctor\n" + "A0 dtor\n" + "A3 dtor\n" + "A1 dtor\n", + history->GetString().c_str() + ); +} + +} // Unnamed namespace diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc new file mode 100644 index 000000000..c9be39a87 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc @@ -0,0 +1,313 @@ +// Copyright 2009 Google Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) +// +// The Google C++ Testing Framework (Google Test) +// +// This file verifies Google Test event listeners receive events at the +// right times. + +#include +#include + +using ::testing::AddGlobalTestEnvironment; +using ::testing::Environment; +using ::testing::InitGoogleTest; +using ::testing::Test; +using ::testing::TestCase; +using ::testing::TestEventListener; +using ::testing::TestInfo; +using ::testing::TestPartResult; +using ::testing::UnitTest; +using ::testing::internal::String; + +// Used by tests to register their events. +std::vector* g_events = NULL; + +namespace testing { +namespace internal { + +class EventRecordingListener : public TestEventListener { + public: + EventRecordingListener(const char* name) : name_(name) {} + + protected: + virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) { + g_events->push_back(GetFullMethodName("OnTestProgramStart")); + } + + virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, + int iteration) { + Message message; + message << GetFullMethodName("OnTestIterationStart") + << "(" << iteration << ")"; + g_events->push_back(message.GetString()); + } + + virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) { + g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart")); + } + + virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) { + g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd")); + } + + virtual void OnTestCaseStart(const TestCase& /*test_case*/) { + g_events->push_back(GetFullMethodName("OnTestCaseStart")); + } + + virtual void OnTestStart(const TestInfo& /*test_info*/) { + g_events->push_back(GetFullMethodName("OnTestStart")); + } + + virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) { + g_events->push_back(GetFullMethodName("OnTestPartResult")); + } + + virtual void OnTestEnd(const TestInfo& /*test_info*/) { + g_events->push_back(GetFullMethodName("OnTestEnd")); + } + + virtual void OnTestCaseEnd(const TestCase& /*test_case*/) { + g_events->push_back(GetFullMethodName("OnTestCaseEnd")); + } + + virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) { + g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart")); + } + + virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) { + g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd")); + } + + virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, + int iteration) { + Message message; + message << GetFullMethodName("OnTestIterationEnd") + << "(" << iteration << ")"; + g_events->push_back(message.GetString()); + } + + virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) { + g_events->push_back(GetFullMethodName("OnTestProgramEnd")); + } + + private: + String GetFullMethodName(const char* name) { + Message message; + message << name_ << "." << name; + return message.GetString(); + } + + String name_; +}; + +class EnvironmentInvocationCatcher : public Environment { + protected: + virtual void SetUp() { + g_events->push_back(String("Environment::SetUp")); + } + + virtual void TearDown() { + g_events->push_back(String("Environment::TearDown")); + } +}; + +class ListenerTest : public Test { + protected: + static void SetUpTestCase() { + g_events->push_back(String("ListenerTest::SetUpTestCase")); + } + + static void TearDownTestCase() { + g_events->push_back(String("ListenerTest::TearDownTestCase")); + } + + virtual void SetUp() { + g_events->push_back(String("ListenerTest::SetUp")); + } + + virtual void TearDown() { + g_events->push_back(String("ListenerTest::TearDown")); + } +}; + +TEST_F(ListenerTest, DoesFoo) { + // Test execution order within a test case is not guaranteed so we are not + // recording the test name. + g_events->push_back(String("ListenerTest::* Test Body")); + SUCCEED(); // Triggers OnTestPartResult. +} + +TEST_F(ListenerTest, DoesBar) { + g_events->push_back(String("ListenerTest::* Test Body")); + SUCCEED(); // Triggers OnTestPartResult. +} + +} // namespace internal + +} // namespace testing + +using ::testing::internal::EnvironmentInvocationCatcher; +using ::testing::internal::EventRecordingListener; + +void VerifyResults(const std::vector& data, + const char* const* expected_data, + int expected_data_size) { + const int actual_size = data.size(); + // If the following assertion fails, a new entry will be appended to + // data. Hence we save data.size() first. + EXPECT_EQ(expected_data_size, actual_size); + + // Compares the common prefix. + const int shorter_size = expected_data_size <= actual_size ? + expected_data_size : actual_size; + int i = 0; + for (; i < shorter_size; ++i) { + ASSERT_STREQ(expected_data[i], data[i].c_str()) + << "at position " << i; + } + + // Prints extra elements in the actual data. + for (; i < actual_size; ++i) { + printf(" Actual event #%d: %s\n", i, data[i].c_str()); + } +} + +int main(int argc, char **argv) { + std::vector events; + g_events = &events; + InitGoogleTest(&argc, argv); + + UnitTest::GetInstance()->listeners().Append( + new EventRecordingListener("1st")); + UnitTest::GetInstance()->listeners().Append( + new EventRecordingListener("2nd")); + + AddGlobalTestEnvironment(new EnvironmentInvocationCatcher); + + GTEST_CHECK_(events.size() == 0) + << "AddGlobalTestEnvironment should not generate any events itself."; + + ::testing::GTEST_FLAG(repeat) = 2; + int ret_val = RUN_ALL_TESTS(); + + const char* const expected_events[] = { + "1st.OnTestProgramStart", + "2nd.OnTestProgramStart", + "1st.OnTestIterationStart(0)", + "2nd.OnTestIterationStart(0)", + "1st.OnEnvironmentsSetUpStart", + "2nd.OnEnvironmentsSetUpStart", + "Environment::SetUp", + "2nd.OnEnvironmentsSetUpEnd", + "1st.OnEnvironmentsSetUpEnd", + "1st.OnTestCaseStart", + "2nd.OnTestCaseStart", + "ListenerTest::SetUpTestCase", + "1st.OnTestStart", + "2nd.OnTestStart", + "ListenerTest::SetUp", + "ListenerTest::* Test Body", + "1st.OnTestPartResult", + "2nd.OnTestPartResult", + "ListenerTest::TearDown", + "2nd.OnTestEnd", + "1st.OnTestEnd", + "1st.OnTestStart", + "2nd.OnTestStart", + "ListenerTest::SetUp", + "ListenerTest::* Test Body", + "1st.OnTestPartResult", + "2nd.OnTestPartResult", + "ListenerTest::TearDown", + "2nd.OnTestEnd", + "1st.OnTestEnd", + "ListenerTest::TearDownTestCase", + "2nd.OnTestCaseEnd", + "1st.OnTestCaseEnd", + "1st.OnEnvironmentsTearDownStart", + "2nd.OnEnvironmentsTearDownStart", + "Environment::TearDown", + "2nd.OnEnvironmentsTearDownEnd", + "1st.OnEnvironmentsTearDownEnd", + "2nd.OnTestIterationEnd(0)", + "1st.OnTestIterationEnd(0)", + "1st.OnTestIterationStart(1)", + "2nd.OnTestIterationStart(1)", + "1st.OnEnvironmentsSetUpStart", + "2nd.OnEnvironmentsSetUpStart", + "Environment::SetUp", + "2nd.OnEnvironmentsSetUpEnd", + "1st.OnEnvironmentsSetUpEnd", + "1st.OnTestCaseStart", + "2nd.OnTestCaseStart", + "ListenerTest::SetUpTestCase", + "1st.OnTestStart", + "2nd.OnTestStart", + "ListenerTest::SetUp", + "ListenerTest::* Test Body", + "1st.OnTestPartResult", + "2nd.OnTestPartResult", + "ListenerTest::TearDown", + "2nd.OnTestEnd", + "1st.OnTestEnd", + "1st.OnTestStart", + "2nd.OnTestStart", + "ListenerTest::SetUp", + "ListenerTest::* Test Body", + "1st.OnTestPartResult", + "2nd.OnTestPartResult", + "ListenerTest::TearDown", + "2nd.OnTestEnd", + "1st.OnTestEnd", + "ListenerTest::TearDownTestCase", + "2nd.OnTestCaseEnd", + "1st.OnTestCaseEnd", + "1st.OnEnvironmentsTearDownStart", + "2nd.OnEnvironmentsTearDownStart", + "Environment::TearDown", + "2nd.OnEnvironmentsTearDownEnd", + "1st.OnEnvironmentsTearDownEnd", + "2nd.OnTestIterationEnd(1)", + "1st.OnTestIterationEnd(1)", + "2nd.OnTestProgramEnd", + "1st.OnTestProgramEnd" + }; + VerifyResults(events, + expected_events, + sizeof(expected_events)/sizeof(expected_events[0])); + + // We need to check manually for ad hoc test failures that happen after + // RUN_ALL_TESTS finishes. + if (UnitTest::GetInstance()->Failed()) + ret_val = 1; + + return ret_val; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc new file mode 100644 index 000000000..e42b03447 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc @@ -0,0 +1,167 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Tests for the Message class. + +#include + +#include + +namespace { + +using ::testing::Message; +using ::testing::internal::StrStream; + +// A helper function that turns a Message into a C string. +const char* ToCString(const Message& msg) { + static testing::internal::String result; + result = msg.GetString(); + return result.c_str(); +} + +// Tests the testing::Message class + +// Tests the default constructor. +TEST(MessageTest, DefaultConstructor) { + const Message msg; + EXPECT_STREQ("", ToCString(msg)); +} + +// Tests the copy constructor. +TEST(MessageTest, CopyConstructor) { + const Message msg1("Hello"); + const Message msg2(msg1); + EXPECT_STREQ("Hello", ToCString(msg2)); +} + +// Tests constructing a Message from a C-string. +TEST(MessageTest, ConstructsFromCString) { + Message msg("Hello"); + EXPECT_STREQ("Hello", ToCString(msg)); +} + +// Tests streaming a float. +TEST(MessageTest, StreamsFloat) { + const char* const s = ToCString(Message() << 1.23456F << " " << 2.34567F); + // Both numbers should be printed with enough precision. + EXPECT_PRED_FORMAT2(testing::IsSubstring, "1.234560", s); + EXPECT_PRED_FORMAT2(testing::IsSubstring, " 2.345669", s); +} + +// Tests streaming a double. +TEST(MessageTest, StreamsDouble) { + const char* const s = ToCString(Message() << 1260570880.4555497 << " " + << 1260572265.1954534); + // Both numbers should be printed with enough precision. + EXPECT_PRED_FORMAT2(testing::IsSubstring, "1260570880.45", s); + EXPECT_PRED_FORMAT2(testing::IsSubstring, " 1260572265.19", s); +} + +// Tests streaming a non-char pointer. +TEST(MessageTest, StreamsPointer) { + int n = 0; + int* p = &n; + EXPECT_STRNE("(null)", ToCString(Message() << p)); +} + +// Tests streaming a NULL non-char pointer. +TEST(MessageTest, StreamsNullPointer) { + int* p = NULL; + EXPECT_STREQ("(null)", ToCString(Message() << p)); +} + +// Tests streaming a C string. +TEST(MessageTest, StreamsCString) { + EXPECT_STREQ("Foo", ToCString(Message() << "Foo")); +} + +// Tests streaming a NULL C string. +TEST(MessageTest, StreamsNullCString) { + char* p = NULL; + EXPECT_STREQ("(null)", ToCString(Message() << p)); +} + +// Tests streaming std::string. +TEST(MessageTest, StreamsString) { + const ::std::string str("Hello"); + EXPECT_STREQ("Hello", ToCString(Message() << str)); +} + +// Tests that we can output strings containing embedded NULs. +TEST(MessageTest, StreamsStringWithEmbeddedNUL) { + const char char_array_with_nul[] = + "Here's a NUL\0 and some more string"; + const ::std::string string_with_nul(char_array_with_nul, + sizeof(char_array_with_nul) - 1); + EXPECT_STREQ("Here's a NUL\\0 and some more string", + ToCString(Message() << string_with_nul)); +} + +// Tests streaming a NUL char. +TEST(MessageTest, StreamsNULChar) { + EXPECT_STREQ("\\0", ToCString(Message() << '\0')); +} + +// Tests streaming int. +TEST(MessageTest, StreamsInt) { + EXPECT_STREQ("123", ToCString(Message() << 123)); +} + +// Tests that basic IO manipulators (endl, ends, and flush) can be +// streamed to Message. +TEST(MessageTest, StreamsBasicIoManip) { + EXPECT_STREQ("Line 1.\nA NUL char \\0 in line 2.", + ToCString(Message() << "Line 1." << std::endl + << "A NUL char " << std::ends << std::flush + << " in line 2.")); +} + +// Tests Message::GetString() +TEST(MessageTest, GetString) { + Message msg; + msg << 1 << " lamb"; + EXPECT_STREQ("1 lamb", msg.GetString().c_str()); +} + +// Tests streaming a Message object to an ostream. +TEST(MessageTest, StreamsToOStream) { + Message msg("Hello"); + StrStream ss; + ss << msg; + EXPECT_STREQ("Hello", testing::internal::StrStreamToString(&ss).c_str()); +} + +// Tests that a Message object doesn't take up too much stack space. +TEST(MessageTest, DoesNotTakeUpMuchStackSpace) { + EXPECT_LE(sizeof(Message), 16U); +} + +} // namespace diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc new file mode 100644 index 000000000..2e2cbc92e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc @@ -0,0 +1,212 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: keith.ray@gmail.com (Keith Ray) +// +// Google Test UnitTestOptions tests +// +// This file tests classes and functions used internally by +// Google Test. They are subject to change without notice. +// +// This file is #included from gtest.cc, to avoid changing build or +// make-files on Windows and other platforms. Do not #include this file +// anywhere else! + +#include + +#if GTEST_OS_WINDOWS_MOBILE +#include +#elif GTEST_OS_WINDOWS +#include +#endif // GTEST_OS_WINDOWS_MOBILE + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +namespace testing { +namespace internal { +namespace { + +// Turns the given relative path into an absolute path. +FilePath GetAbsolutePathOf(const FilePath& relative_path) { + return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path); +} + +// Testing UnitTestOptions::GetOutputFormat/GetOutputFile. + +TEST(XmlOutputTest, GetOutputFormatDefault) { + GTEST_FLAG(output) = ""; + EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str()); +} + +TEST(XmlOutputTest, GetOutputFormat) { + GTEST_FLAG(output) = "xml:filename"; + EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str()); +} + +TEST(XmlOutputTest, GetOutputFileDefault) { + GTEST_FLAG(output) = ""; + EXPECT_STREQ(GetAbsolutePathOf(FilePath("test_detail.xml")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST(XmlOutputTest, GetOutputFileSingleFile) { + GTEST_FLAG(output) = "xml:filename.abc"; + EXPECT_STREQ(GetAbsolutePathOf(FilePath("filename.abc")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) { + GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_; + const std::string expected_output_file = + GetAbsolutePathOf( + FilePath(std::string("path") + GTEST_PATH_SEP_ + + GetCurrentExecutableName().c_str() + ".xml")).c_str(); + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); +#if GTEST_OS_WINDOWS + EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str()); +#else + EXPECT_EQ(expected_output_file, output_file.c_str()); +#endif +} + +TEST(OutputFileHelpersTest, GetCurrentExecutableName) { + const std::string exe_str = GetCurrentExecutableName().c_str(); +#if GTEST_OS_WINDOWS + const bool success = + _strcmpi("gtest-options_test", exe_str.c_str()) == 0 || + _strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 || + _strcmpi("gtest_all_test", exe_str.c_str()) == 0 || + _strcmpi("gtest_dll_test", exe_str.c_str()) == 0; +#else + // TODO(wan@google.com): remove the hard-coded "lt-" prefix when + // Chandler Carruth's libtool replacement is ready. + const bool success = + exe_str == "gtest-options_test" || + exe_str == "gtest_all_test" || + exe_str == "lt-gtest_all_test" || + exe_str == "gtest_dll_test"; +#endif // GTEST_OS_WINDOWS + if (!success) + FAIL() << "GetCurrentExecutableName() returns " << exe_str; +} + +class XmlOutputChangeDirTest : public Test { + protected: + virtual void SetUp() { + original_working_dir_ = FilePath::GetCurrentDir(); + posix::ChDir(".."); + // This will make the test fail if run from the root directory. + EXPECT_STRNE(original_working_dir_.c_str(), + FilePath::GetCurrentDir().c_str()); + } + + virtual void TearDown() { + posix::ChDir(original_working_dir_.c_str()); + } + + FilePath original_working_dir_; +}; + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) { + GTEST_FLAG(output) = ""; + EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_, + FilePath("test_detail.xml")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) { + GTEST_FLAG(output) = "xml"; + EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_, + FilePath("test_detail.xml")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) { + GTEST_FLAG(output) = "xml:filename.abc"; + EXPECT_STREQ(FilePath::ConcatPaths(original_working_dir_, + FilePath("filename.abc")).c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) { + GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_; + const std::string expected_output_file = + FilePath::ConcatPaths( + original_working_dir_, + FilePath(std::string("path") + GTEST_PATH_SEP_ + + GetCurrentExecutableName().c_str() + ".xml")).c_str(); + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); +#if GTEST_OS_WINDOWS + EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str()); +#else + EXPECT_EQ(expected_output_file, output_file.c_str()); +#endif +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) { +#if GTEST_OS_WINDOWS + GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc"; + EXPECT_STREQ(FilePath("c:\\tmp\\filename.abc").c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +#else + GTEST_FLAG(output) ="xml:/tmp/filename.abc"; + EXPECT_STREQ(FilePath("/tmp/filename.abc").c_str(), + UnitTestOptions::GetAbsolutePathToOutputFile().c_str()); +#endif +} + +TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) { +#if GTEST_OS_WINDOWS + const std::string path = "c:\\tmp\\"; +#else + const std::string path = "/tmp/"; +#endif + + GTEST_FLAG(output) = "xml:" + path; + const std::string expected_output_file = + path + GetCurrentExecutableName().c_str() + ".xml"; + const String& output_file = UnitTestOptions::GetAbsolutePathToOutputFile(); + +#if GTEST_OS_WINDOWS + EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str()); +#else + EXPECT_EQ(expected_output_file, output_file.c_str()); +#endif +} + +} // namespace +} // namespace internal +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc new file mode 100644 index 000000000..ccb6cfac9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc @@ -0,0 +1,65 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) +// +// Tests for Google Test itself. This verifies that the basic constructs of +// Google Test work. + +#include + +#include "test/gtest-param-test_test.h" + +#if GTEST_HAS_PARAM_TEST + +using ::testing::Values; +using ::testing::internal::ParamGenerator; + +// Tests that generators defined in a different translation unit +// are functional. The test using extern_gen is defined +// in gtest-param-test_test.cc. +ParamGenerator extern_gen = Values(33); + +// Tests that a parameterized test case can be defined in one translation unit +// and instantiated in another. The test is defined in gtest-param-test_test.cc +// and ExternalInstantiationTest fixture class is defined in +// gtest-param-test_test.h. +INSTANTIATE_TEST_CASE_P(MultiplesOf33, + ExternalInstantiationTest, + Values(33, 66)); + +// Tests that a parameterized test case can be instantiated +// in multiple translation units. Another instantiation is defined +// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest +// fixture is defined in gtest-param-test_test.h +INSTANTIATE_TEST_CASE_P(Sequence2, + InstantiationInMultipleTranslaionUnitsTest, + Values(42*3, 42*4, 42*5)); + +#endif // GTEST_HAS_PARAM_TEST diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc new file mode 100644 index 000000000..d0a0e735c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc @@ -0,0 +1,835 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) +// +// Tests for Google Test itself. This file verifies that the parameter +// generators objects produce correct parameter sequences and that +// Google Test runtime instantiates correct tests from those sequences. + +#include + +#if GTEST_HAS_PARAM_TEST + +#include +#include +#include +#include +#include +#include + +// To include gtest-internal-inl.h. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" // for UnitTestOptions +#undef GTEST_IMPLEMENTATION_ + +#include "test/gtest-param-test_test.h" + +using ::std::vector; +using ::std::sort; + +using ::testing::AddGlobalTestEnvironment; +using ::testing::Bool; +using ::testing::Message; +using ::testing::Range; +using ::testing::TestWithParam; +using ::testing::Values; +using ::testing::ValuesIn; + +#if GTEST_HAS_COMBINE +using ::testing::Combine; +using ::std::tr1::get; +using ::std::tr1::make_tuple; +using ::std::tr1::tuple; +#endif // GTEST_HAS_COMBINE + +using ::testing::internal::ParamGenerator; +using ::testing::internal::UnitTestOptions; + +// Prints a value to a string. +// +// TODO(wan@google.com): remove PrintValue() when we move matchers and +// EXPECT_THAT() from Google Mock to Google Test. At that time, we +// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as +// EXPECT_THAT() and the matchers know how to print tuples. +template +::std::string PrintValue(const T& value) { + ::std::stringstream stream; + stream << value; + return stream.str(); +} + +#if GTEST_HAS_COMBINE + +// These overloads allow printing tuples in our tests. We cannot +// define an operator<< for tuples, as that definition needs to be in +// the std namespace in order to be picked up by Google Test via +// Argument-Dependent Lookup, yet defining anything in the std +// namespace in non-STL code is undefined behavior. + +template +::std::string PrintValue(const tuple& value) { + ::std::stringstream stream; + stream << "(" << get<0>(value) << ", " << get<1>(value) << ")"; + return stream.str(); +} + +template +::std::string PrintValue(const tuple& value) { + ::std::stringstream stream; + stream << "(" << get<0>(value) << ", " << get<1>(value) + << ", "<< get<2>(value) << ")"; + return stream.str(); +} + +template +::std::string PrintValue( + const tuple& value) { + ::std::stringstream stream; + stream << "(" << get<0>(value) << ", " << get<1>(value) + << ", "<< get<2>(value) << ", " << get<3>(value) + << ", "<< get<4>(value) << ", " << get<5>(value) + << ", "<< get<6>(value) << ", " << get<7>(value) + << ", "<< get<8>(value) << ", " << get<9>(value) << ")"; + return stream.str(); +} + +#endif // GTEST_HAS_COMBINE + +// Verifies that a sequence generated by the generator and accessed +// via the iterator object matches the expected one using Google Test +// assertions. +template +void VerifyGenerator(const ParamGenerator& generator, + const T (&expected_values)[N]) { + typename ParamGenerator::iterator it = generator.begin(); + for (size_t i = 0; i < N; ++i) { + ASSERT_FALSE(it == generator.end()) + << "At element " << i << " when accessing via an iterator " + << "created with the copy constructor.\n"; + // We cannot use EXPECT_EQ() here as the values may be tuples, + // which don't support <<. + EXPECT_TRUE(expected_values[i] == *it) + << "where i is " << i + << ", expected_values[i] is " << PrintValue(expected_values[i]) + << ", *it is " << PrintValue(*it) + << ", and 'it' is an iterator created with the copy constructor.\n"; + it++; + } + EXPECT_TRUE(it == generator.end()) + << "At the presumed end of sequence when accessing via an iterator " + << "created with the copy constructor.\n"; + + // Test the iterator assignment. The following lines verify that + // the sequence accessed via an iterator initialized via the + // assignment operator (as opposed to a copy constructor) matches + // just the same. + it = generator.begin(); + for (size_t i = 0; i < N; ++i) { + ASSERT_FALSE(it == generator.end()) + << "At element " << i << " when accessing via an iterator " + << "created with the assignment operator.\n"; + EXPECT_TRUE(expected_values[i] == *it) + << "where i is " << i + << ", expected_values[i] is " << PrintValue(expected_values[i]) + << ", *it is " << PrintValue(*it) + << ", and 'it' is an iterator created with the copy constructor.\n"; + it++; + } + EXPECT_TRUE(it == generator.end()) + << "At the presumed end of sequence when accessing via an iterator " + << "created with the assignment operator.\n"; +} + +template +void VerifyGeneratorIsEmpty(const ParamGenerator& generator) { + typename ParamGenerator::iterator it = generator.begin(); + EXPECT_TRUE(it == generator.end()); + + it = generator.begin(); + EXPECT_TRUE(it == generator.end()); +} + +// Generator tests. They test that each of the provided generator functions +// generates an expected sequence of values. The general test pattern +// instantiates a generator using one of the generator functions, +// checks the sequence produced by the generator using its iterator API, +// and then resets the iterator back to the beginning of the sequence +// and checks the sequence again. + +// Tests that iterators produced by generator functions conform to the +// ForwardIterator concept. +TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) { + const ParamGenerator gen = Range(0, 10); + ParamGenerator::iterator it = gen.begin(); + + // Verifies that iterator initialization works as expected. + ParamGenerator::iterator it2 = it; + EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the " + << "element same as its source points to"; + + // Verifies that iterator assignment works as expected. + it++; + EXPECT_FALSE(*it == *it2); + it2 = it; + EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the " + << "element same as its source points to"; + + // Verifies that prefix operator++() returns *this. + EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be " + << "refer to the original object"; + + // Verifies that the result of the postfix operator++ points to the value + // pointed to by the original iterator. + int original_value = *it; // Have to compute it outside of macro call to be + // unaffected by the parameter evaluation order. + EXPECT_EQ(original_value, *(it++)); + + // Verifies that prefix and postfix operator++() advance an iterator + // all the same. + it2 = it; + it++; + ++it2; + EXPECT_TRUE(*it == *it2); +} + +// Tests that Range() generates the expected sequence. +TEST(RangeTest, IntRangeWithDefaultStep) { + const ParamGenerator gen = Range(0, 3); + const int expected_values[] = {0, 1, 2}; + VerifyGenerator(gen, expected_values); +} + +// Edge case. Tests that Range() generates the single element sequence +// as expected when provided with range limits that are equal. +TEST(RangeTest, IntRangeSingleValue) { + const ParamGenerator gen = Range(0, 1); + const int expected_values[] = {0}; + VerifyGenerator(gen, expected_values); +} + +// Edge case. Tests that Range() with generates empty sequence when +// supplied with an empty range. +TEST(RangeTest, IntRangeEmpty) { + const ParamGenerator gen = Range(0, 0); + VerifyGeneratorIsEmpty(gen); +} + +// Tests that Range() with custom step (greater then one) generates +// the expected sequence. +TEST(RangeTest, IntRangeWithCustomStep) { + const ParamGenerator gen = Range(0, 9, 3); + const int expected_values[] = {0, 3, 6}; + VerifyGenerator(gen, expected_values); +} + +// Tests that Range() with custom step (greater then one) generates +// the expected sequence when the last element does not fall on the +// upper range limit. Sequences generated by Range() must not have +// elements beyond the range limits. +TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) { + const ParamGenerator gen = Range(0, 4, 3); + const int expected_values[] = {0, 3}; + VerifyGenerator(gen, expected_values); +} + +// Verifies that Range works with user-defined types that define +// copy constructor, operator=(), operator+(), and operator<(). +class DogAdder { + public: + explicit DogAdder(const char* a_value) : value_(a_value) {} + DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {} + + DogAdder operator=(const DogAdder& other) { + if (this != &other) + value_ = other.value_; + return *this; + } + DogAdder operator+(const DogAdder& other) const { + Message msg; + msg << value_.c_str() << other.value_.c_str(); + return DogAdder(msg.GetString().c_str()); + } + bool operator<(const DogAdder& other) const { + return value_ < other.value_; + } + const ::testing::internal::String& value() const { return value_; } + + private: + ::testing::internal::String value_; +}; + +TEST(RangeTest, WorksWithACustomType) { + const ParamGenerator gen = + Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog")); + ParamGenerator::iterator it = gen.begin(); + + ASSERT_FALSE(it == gen.end()); + EXPECT_STREQ("cat", it->value().c_str()); + + ASSERT_FALSE(++it == gen.end()); + EXPECT_STREQ("catdog", it->value().c_str()); + + EXPECT_TRUE(++it == gen.end()); +} + +class IntWrapper { + public: + explicit IntWrapper(int a_value) : value_(a_value) {} + IntWrapper(const IntWrapper& other) : value_(other.value_) {} + + IntWrapper operator=(const IntWrapper& other) { + value_ = other.value_; + return *this; + } + // operator+() adds a different type. + IntWrapper operator+(int other) const { return IntWrapper(value_ + other); } + bool operator<(const IntWrapper& other) const { + return value_ < other.value_; + } + int value() const { return value_; } + + private: + int value_; +}; + +TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) { + const ParamGenerator gen = Range(IntWrapper(0), IntWrapper(2)); + ParamGenerator::iterator it = gen.begin(); + + ASSERT_FALSE(it == gen.end()); + EXPECT_EQ(0, it->value()); + + ASSERT_FALSE(++it == gen.end()); + EXPECT_EQ(1, it->value()); + + EXPECT_TRUE(++it == gen.end()); +} + +// Tests that ValuesIn() with an array parameter generates +// the expected sequence. +TEST(ValuesInTest, ValuesInArray) { + int array[] = {3, 5, 8}; + const ParamGenerator gen = ValuesIn(array); + VerifyGenerator(gen, array); +} + +// Tests that ValuesIn() with a const array parameter generates +// the expected sequence. +TEST(ValuesInTest, ValuesInConstArray) { + const int array[] = {3, 5, 8}; + const ParamGenerator gen = ValuesIn(array); + VerifyGenerator(gen, array); +} + +// Edge case. Tests that ValuesIn() with an array parameter containing a +// single element generates the single element sequence. +TEST(ValuesInTest, ValuesInSingleElementArray) { + int array[] = {42}; + const ParamGenerator gen = ValuesIn(array); + VerifyGenerator(gen, array); +} + +// Tests that ValuesIn() generates the expected sequence for an STL +// container (vector). +TEST(ValuesInTest, ValuesInVector) { + typedef ::std::vector ContainerType; + ContainerType values; + values.push_back(3); + values.push_back(5); + values.push_back(8); + const ParamGenerator gen = ValuesIn(values); + + const int expected_values[] = {3, 5, 8}; + VerifyGenerator(gen, expected_values); +} + +// Tests that ValuesIn() generates the expected sequence. +TEST(ValuesInTest, ValuesInIteratorRange) { + typedef ::std::vector ContainerType; + ContainerType values; + values.push_back(3); + values.push_back(5); + values.push_back(8); + const ParamGenerator gen = ValuesIn(values.begin(), values.end()); + + const int expected_values[] = {3, 5, 8}; + VerifyGenerator(gen, expected_values); +} + +// Edge case. Tests that ValuesIn() provided with an iterator range specifying a +// single value generates a single-element sequence. +TEST(ValuesInTest, ValuesInSingleElementIteratorRange) { + typedef ::std::vector ContainerType; + ContainerType values; + values.push_back(42); + const ParamGenerator gen = ValuesIn(values.begin(), values.end()); + + const int expected_values[] = {42}; + VerifyGenerator(gen, expected_values); +} + +// Edge case. Tests that ValuesIn() provided with an empty iterator range +// generates an empty sequence. +TEST(ValuesInTest, ValuesInEmptyIteratorRange) { + typedef ::std::vector ContainerType; + ContainerType values; + const ParamGenerator gen = ValuesIn(values.begin(), values.end()); + + VerifyGeneratorIsEmpty(gen); +} + +// Tests that the Values() generates the expected sequence. +TEST(ValuesTest, ValuesWorks) { + const ParamGenerator gen = Values(3, 5, 8); + + const int expected_values[] = {3, 5, 8}; + VerifyGenerator(gen, expected_values); +} + +// Tests that Values() generates the expected sequences from elements of +// different types convertible to ParamGenerator's parameter type. +TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) { + const ParamGenerator gen = Values(3, 5.0f, 8.0); + + const double expected_values[] = {3.0, 5.0, 8.0}; + VerifyGenerator(gen, expected_values); +} + +TEST(ValuesTest, ValuesWorksForMaxLengthList) { + const ParamGenerator gen = Values( + 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, + 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, + 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, + 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, + 410, 420, 430, 440, 450, 460, 470, 480, 490, 500); + + const int expected_values[] = { + 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, + 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, + 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, + 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, + 410, 420, 430, 440, 450, 460, 470, 480, 490, 500}; + VerifyGenerator(gen, expected_values); +} + +// Edge case test. Tests that single-parameter Values() generates the sequence +// with the single value. +TEST(ValuesTest, ValuesWithSingleParameter) { + const ParamGenerator gen = Values(42); + + const int expected_values[] = {42}; + VerifyGenerator(gen, expected_values); +} + +// Tests that Bool() generates sequence (false, true). +TEST(BoolTest, BoolWorks) { + const ParamGenerator gen = Bool(); + + const bool expected_values[] = {false, true}; + VerifyGenerator(gen, expected_values); +} + +#if GTEST_HAS_COMBINE + +// Tests that Combine() with two parameters generates the expected sequence. +TEST(CombineTest, CombineWithTwoParameters) { + const char* foo = "foo"; + const char* bar = "bar"; + const ParamGenerator > gen = + Combine(Values(foo, bar), Values(3, 4)); + + tuple expected_values[] = { + make_tuple(foo, 3), make_tuple(foo, 4), + make_tuple(bar, 3), make_tuple(bar, 4)}; + VerifyGenerator(gen, expected_values); +} + +// Tests that Combine() with three parameters generates the expected sequence. +TEST(CombineTest, CombineWithThreeParameters) { + const ParamGenerator > gen = Combine(Values(0, 1), + Values(3, 4), + Values(5, 6)); + tuple expected_values[] = { + make_tuple(0, 3, 5), make_tuple(0, 3, 6), + make_tuple(0, 4, 5), make_tuple(0, 4, 6), + make_tuple(1, 3, 5), make_tuple(1, 3, 6), + make_tuple(1, 4, 5), make_tuple(1, 4, 6)}; + VerifyGenerator(gen, expected_values); +} + +// Tests that the Combine() with the first parameter generating a single value +// sequence generates a sequence with the number of elements equal to the +// number of elements in the sequence generated by the second parameter. +TEST(CombineTest, CombineWithFirstParameterSingleValue) { + const ParamGenerator > gen = Combine(Values(42), + Values(0, 1)); + + tuple expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)}; + VerifyGenerator(gen, expected_values); +} + +// Tests that the Combine() with the second parameter generating a single value +// sequence generates a sequence with the number of elements equal to the +// number of elements in the sequence generated by the first parameter. +TEST(CombineTest, CombineWithSecondParameterSingleValue) { + const ParamGenerator > gen = Combine(Values(0, 1), + Values(42)); + + tuple expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)}; + VerifyGenerator(gen, expected_values); +} + +// Tests that when the first parameter produces an empty sequence, +// Combine() produces an empty sequence, too. +TEST(CombineTest, CombineWithFirstParameterEmptyRange) { + const ParamGenerator > gen = Combine(Range(0, 0), + Values(0, 1)); + VerifyGeneratorIsEmpty(gen); +} + +// Tests that when the second parameter produces an empty sequence, +// Combine() produces an empty sequence, too. +TEST(CombineTest, CombineWithSecondParameterEmptyRange) { + const ParamGenerator > gen = Combine(Values(0, 1), + Range(1, 1)); + VerifyGeneratorIsEmpty(gen); +} + +// Edge case. Tests that combine works with the maximum number +// of parameters supported by Google Test (currently 10). +TEST(CombineTest, CombineWithMaxNumberOfParameters) { + const char* foo = "foo"; + const char* bar = "bar"; + const ParamGenerator > gen = Combine(Values(foo, bar), + Values(1), Values(2), + Values(3), Values(4), + Values(5), Values(6), + Values(7), Values(8), + Values(9)); + + tuple + expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9), + make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)}; + VerifyGenerator(gen, expected_values); +} + +#endif // GTEST_HAS_COMBINE + +// Tests that an generator produces correct sequence after being +// assigned from another generator. +TEST(ParamGeneratorTest, AssignmentWorks) { + ParamGenerator gen = Values(1, 2); + const ParamGenerator gen2 = Values(3, 4); + gen = gen2; + + const int expected_values[] = {3, 4}; + VerifyGenerator(gen, expected_values); +} + +// This test verifies that the tests are expanded and run as specified: +// one test per element from the sequence produced by the generator +// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's +// fixture constructor, SetUp(), and TearDown() have run and have been +// supplied with the correct parameters. + +// The use of environment object allows detection of the case where no test +// case functionality is run at all. In this case TestCaseTearDown will not +// be able to detect missing tests, naturally. +template +class TestGenerationEnvironment : public ::testing::Environment { + public: + static TestGenerationEnvironment* Instance() { + static TestGenerationEnvironment* instance = new TestGenerationEnvironment; + return instance; + } + + void FixtureConstructorExecuted() { fixture_constructor_count_++; } + void SetUpExecuted() { set_up_count_++; } + void TearDownExecuted() { tear_down_count_++; } + void TestBodyExecuted() { test_body_count_++; } + + virtual void TearDown() { + // If all MultipleTestGenerationTest tests have been de-selected + // by the filter flag, the following checks make no sense. + bool perform_check = false; + + for (int i = 0; i < kExpectedCalls; ++i) { + Message msg; + msg << "TestsExpandedAndRun/" << i; + if (UnitTestOptions::FilterMatchesTest( + "TestExpansionModule/MultipleTestGenerationTest", + msg.GetString().c_str())) { + perform_check = true; + } + } + if (perform_check) { + EXPECT_EQ(kExpectedCalls, fixture_constructor_count_) + << "Fixture constructor of ParamTestGenerationTest test case " + << "has not been run as expected."; + EXPECT_EQ(kExpectedCalls, set_up_count_) + << "Fixture SetUp method of ParamTestGenerationTest test case " + << "has not been run as expected."; + EXPECT_EQ(kExpectedCalls, tear_down_count_) + << "Fixture TearDown method of ParamTestGenerationTest test case " + << "has not been run as expected."; + EXPECT_EQ(kExpectedCalls, test_body_count_) + << "Test in ParamTestGenerationTest test case " + << "has not been run as expected."; + } + } + private: + TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0), + tear_down_count_(0), test_body_count_(0) {} + + int fixture_constructor_count_; + int set_up_count_; + int tear_down_count_; + int test_body_count_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment); +}; + +const int test_generation_params[] = {36, 42, 72}; + +class TestGenerationTest : public TestWithParam { + public: + enum { + PARAMETER_COUNT = + sizeof(test_generation_params)/sizeof(test_generation_params[0]) + }; + + typedef TestGenerationEnvironment Environment; + + TestGenerationTest() { + Environment::Instance()->FixtureConstructorExecuted(); + current_parameter_ = GetParam(); + } + virtual void SetUp() { + Environment::Instance()->SetUpExecuted(); + EXPECT_EQ(current_parameter_, GetParam()); + } + virtual void TearDown() { + Environment::Instance()->TearDownExecuted(); + EXPECT_EQ(current_parameter_, GetParam()); + } + + static void SetUpTestCase() { + bool all_tests_in_test_case_selected = true; + + for (int i = 0; i < PARAMETER_COUNT; ++i) { + Message test_name; + test_name << "TestsExpandedAndRun/" << i; + if ( !UnitTestOptions::FilterMatchesTest( + "TestExpansionModule/MultipleTestGenerationTest", + test_name.GetString())) { + all_tests_in_test_case_selected = false; + } + } + EXPECT_TRUE(all_tests_in_test_case_selected) + << "When running the TestGenerationTest test case all of its tests\n" + << "must be selected by the filter flag for the test case to pass.\n" + << "If not all of them are enabled, we can't reliably conclude\n" + << "that the correct number of tests have been generated."; + + collected_parameters_.clear(); + } + + static void TearDownTestCase() { + vector expected_values(test_generation_params, + test_generation_params + PARAMETER_COUNT); + // Test execution order is not guaranteed by Google Test, + // so the order of values in collected_parameters_ can be + // different and we have to sort to compare. + sort(expected_values.begin(), expected_values.end()); + sort(collected_parameters_.begin(), collected_parameters_.end()); + + EXPECT_TRUE(collected_parameters_ == expected_values); + } + protected: + int current_parameter_; + static vector collected_parameters_; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest); +}; +vector TestGenerationTest::collected_parameters_; + +TEST_P(TestGenerationTest, TestsExpandedAndRun) { + Environment::Instance()->TestBodyExecuted(); + EXPECT_EQ(current_parameter_, GetParam()); + collected_parameters_.push_back(GetParam()); +} +INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest, + ValuesIn(test_generation_params)); + +// This test verifies that the element sequence (third parameter of +// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at +// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS(). For +// that, we declare param_value_ to be a static member of +// GeneratorEvaluationTest and initialize it to 0. We set it to 1 in +// main(), just before invocation of InitGoogleTest(). After calling +// InitGoogleTest(), we set the value to 2. If the sequence is evaluated +// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a +// test with parameter other than 1, and the test body will fail the +// assertion. +class GeneratorEvaluationTest : public TestWithParam { + public: + static int param_value() { return param_value_; } + static void set_param_value(int param_value) { param_value_ = param_value; } + + private: + static int param_value_; +}; +int GeneratorEvaluationTest::param_value_ = 0; + +TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) { + EXPECT_EQ(1, GetParam()); +} +INSTANTIATE_TEST_CASE_P(GenEvalModule, + GeneratorEvaluationTest, + Values(GeneratorEvaluationTest::param_value())); + +// Tests that generators defined in a different translation unit are +// functional. Generator extern_gen is defined in gtest-param-test_test2.cc. +extern ParamGenerator extern_gen; +class ExternalGeneratorTest : public TestWithParam {}; +TEST_P(ExternalGeneratorTest, ExternalGenerator) { + // Sequence produced by extern_gen contains only a single value + // which we verify here. + EXPECT_EQ(GetParam(), 33); +} +INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule, + ExternalGeneratorTest, + extern_gen); + +// Tests that a parameterized test case can be defined in one translation +// unit and instantiated in another. This test will be instantiated in +// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is +// defined in gtest-param-test_test.h. +TEST_P(ExternalInstantiationTest, IsMultipleOf33) { + EXPECT_EQ(0, GetParam() % 33); +} + +// Tests that a parameterized test case can be instantiated with multiple +// generators. +class MultipleInstantiationTest : public TestWithParam {}; +TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) { +} +INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2)); +INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5)); + +// Tests that a parameterized test case can be instantiated +// in multiple translation units. This test will be instantiated +// here and in gtest-param-test_test2.cc. +// InstantiationInMultipleTranslationUnitsTest fixture class +// is defined in gtest-param-test_test.h. +TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) { + EXPECT_EQ(0, GetParam() % 42); +} +INSTANTIATE_TEST_CASE_P(Sequence1, + InstantiationInMultipleTranslaionUnitsTest, + Values(42, 42*2)); + +// Tests that each iteration of parameterized test runs in a separate test +// object. +class SeparateInstanceTest : public TestWithParam { + public: + SeparateInstanceTest() : count_(0) {} + + static void TearDownTestCase() { + EXPECT_GE(global_count_, 2) + << "If some (but not all) SeparateInstanceTest tests have been " + << "filtered out this test will fail. Make sure that all " + << "GeneratorEvaluationTest are selected or de-selected together " + << "by the test filter."; + } + + protected: + int count_; + static int global_count_; +}; +int SeparateInstanceTest::global_count_ = 0; + +TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) { + EXPECT_EQ(0, count_++); + global_count_++; +} +INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4)); + +// Tests that all instantiations of a test have named appropriately. Test +// defined with TEST_P(TestCaseName, TestName) and instantiated with +// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named +// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the +// sequence element used to instantiate the test. +class NamingTest : public TestWithParam {}; + +TEST_P(NamingTest, TestsAreNamedAppropriately) { + const ::testing::TestInfo* const test_info = + ::testing::UnitTest::GetInstance()->current_test_info(); + + EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name()); + + Message msg; + msg << "TestsAreNamedAppropriately/" << GetParam(); + EXPECT_STREQ(msg.GetString().c_str(), test_info->name()); +} + +INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5)); + +#endif // GTEST_HAS_PARAM_TEST + +TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) { +#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST + FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n" +#endif +} + +int main(int argc, char **argv) { +#if GTEST_HAS_PARAM_TEST + // Used in TestGenerationTest test case. + AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance()); + // Used in GeneratorEvaluationTest test case. Tests that the updated value + // will be picked up for instantiating tests in GeneratorEvaluationTest. + GeneratorEvaluationTest::set_param_value(1); +#endif // GTEST_HAS_PARAM_TEST + + ::testing::InitGoogleTest(&argc, argv); + +#if GTEST_HAS_PARAM_TEST + // Used in GeneratorEvaluationTest test case. Tests that value updated + // here will NOT be used for instantiating tests in + // GeneratorEvaluationTest. + GeneratorEvaluationTest::set_param_value(2); +#endif // GTEST_HAS_PARAM_TEST + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h new file mode 100644 index 000000000..b7f949361 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h @@ -0,0 +1,55 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: vladl@google.com (Vlad Losev) +// +// The Google C++ Testing Framework (Google Test) +// +// This header file provides classes and functions used internally +// for testing Google Test itself. + +#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_ +#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_ + +#include + +#if GTEST_HAS_PARAM_TEST + +// Test fixture for testing definition and instantiation of a test +// in separate translation units. +class ExternalInstantiationTest : public ::testing::TestWithParam {}; + +// Test fixture for testing instantiation of a test in multiple +// translation units. +class InstantiationInMultipleTranslaionUnitsTest + : public ::testing::TestWithParam {}; + +#endif // GTEST_HAS_PARAM_TEST + +#endif // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc new file mode 100644 index 000000000..37258602f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc @@ -0,0 +1,1018 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: vladl@google.com (Vlad Losev), wan@google.com (Zhanyong Wan) +// +// This file tests the internal cross-platform support utilities. + +#include + +#include + +#if GTEST_OS_MAC +#include +#endif // GTEST_OS_MAC + +#include // For std::pair and std::make_pair. + +#include +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +using std::make_pair; +using std::pair; + +namespace testing { +namespace internal { + +// Tests that the element_type typedef is available in scoped_ptr and refers +// to the parameter type. +TEST(ScopedPtrTest, DefinesElementType) { + StaticAssertTypeEq::element_type>(); +} + +// TODO(vladl@google.com): Implement THE REST of scoped_ptr tests. + +TEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) { + if (AlwaysFalse()) + GTEST_CHECK_(false) << "This should never be executed; " + "It's a compilation test only."; + + if (AlwaysTrue()) + GTEST_CHECK_(true); + else + ; // NOLINT + + if (AlwaysFalse()) + ; // NOLINT + else + GTEST_CHECK_(true) << ""; +} + +TEST(GtestCheckSyntaxTest, WorksWithSwitch) { + switch (0) { + case 1: + break; + default: + GTEST_CHECK_(true); + } + + switch(0) + case 0: + GTEST_CHECK_(true) << "Check failed in switch case"; +} + +#if GTEST_OS_MAC +void* ThreadFunc(void* data) { + pthread_mutex_t* mutex = static_cast(data); + pthread_mutex_lock(mutex); + pthread_mutex_unlock(mutex); + return NULL; +} + +TEST(GetThreadCountTest, ReturnsCorrectValue) { + EXPECT_EQ(1U, GetThreadCount()); + pthread_mutex_t mutex; + pthread_attr_t attr; + pthread_t thread_id; + + // TODO(vladl@google.com): turn mutex into internal::Mutex for automatic + // destruction. + pthread_mutex_init(&mutex, NULL); + pthread_mutex_lock(&mutex); + ASSERT_EQ(0, pthread_attr_init(&attr)); + ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE)); + + const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex); + ASSERT_EQ(0, pthread_attr_destroy(&attr)); + ASSERT_EQ(0, status); + EXPECT_EQ(2U, GetThreadCount()); + pthread_mutex_unlock(&mutex); + + void* dummy; + ASSERT_EQ(0, pthread_join(thread_id, &dummy)); + + // MacOS X may not immediately report the updated thread count after + // joining a thread, causing flakiness in this test. To counter that, we + // wait for up to .5 seconds for the OS to report the correct value. + for (int i = 0; i < 5; ++i) { + if (GetThreadCount() == 1) + break; + + SleepMilliseconds(100); + } + EXPECT_EQ(1U, GetThreadCount()); + pthread_mutex_destroy(&mutex); +} +#else +TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) { + EXPECT_EQ(0U, GetThreadCount()); +} +#endif // GTEST_OS_MAC + +TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) { + const bool a_false_condition = false; + const char regex[] = +#ifdef _MSC_VER + "gtest-port_test\\.cc\\(\\d+\\):" +#else + "gtest-port_test\\.cc:[0-9]+" +#endif // _MSC_VER + ".*a_false_condition.*Extra info.*"; + + EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info", + regex); +} + +#if GTEST_HAS_DEATH_TEST + +TEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) { + EXPECT_EXIT({ + GTEST_CHECK_(true) << "Extra info"; + ::std::cerr << "Success\n"; + exit(0); }, + ::testing::ExitedWithCode(0), "Success"); +} + +#endif // GTEST_HAS_DEATH_TEST + +#if GTEST_USES_POSIX_RE + +#if GTEST_HAS_TYPED_TEST + +template +class RETest : public ::testing::Test {}; + +// Defines StringTypes as the list of all string types that class RE +// supports. +typedef testing::Types< + ::std::string, +#if GTEST_HAS_GLOBAL_STRING + ::string, +#endif // GTEST_HAS_GLOBAL_STRING + const char*> StringTypes; + +TYPED_TEST_CASE(RETest, StringTypes); + +// Tests RE's implicit constructors. +TYPED_TEST(RETest, ImplicitConstructorWorks) { + const RE empty(TypeParam("")); + EXPECT_STREQ("", empty.pattern()); + + const RE simple(TypeParam("hello")); + EXPECT_STREQ("hello", simple.pattern()); + + const RE normal(TypeParam(".*(\\w+)")); + EXPECT_STREQ(".*(\\w+)", normal.pattern()); +} + +// Tests that RE's constructors reject invalid regular expressions. +TYPED_TEST(RETest, RejectsInvalidRegex) { + EXPECT_NONFATAL_FAILURE({ + const RE invalid(TypeParam("?")); + }, "\"?\" is not a valid POSIX Extended regular expression."); +} + +// Tests RE::FullMatch(). +TYPED_TEST(RETest, FullMatchWorks) { + const RE empty(TypeParam("")); + EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty)); + EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty)); + + const RE re(TypeParam("a.*z")); + EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re)); + EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re)); + EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re)); + EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re)); +} + +// Tests RE::PartialMatch(). +TYPED_TEST(RETest, PartialMatchWorks) { + const RE empty(TypeParam("")); + EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty)); + EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty)); + + const RE re(TypeParam("a.*z")); + EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re)); + EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re)); + EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re)); + EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re)); + EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re)); +} + +#endif // GTEST_HAS_TYPED_TEST + +#elif GTEST_USES_SIMPLE_RE + +TEST(IsInSetTest, NulCharIsNotInAnySet) { + EXPECT_FALSE(IsInSet('\0', "")); + EXPECT_FALSE(IsInSet('\0', "\0")); + EXPECT_FALSE(IsInSet('\0', "a")); +} + +TEST(IsInSetTest, WorksForNonNulChars) { + EXPECT_FALSE(IsInSet('a', "Ab")); + EXPECT_FALSE(IsInSet('c', "")); + + EXPECT_TRUE(IsInSet('b', "bcd")); + EXPECT_TRUE(IsInSet('b', "ab")); +} + +TEST(IsDigitTest, IsFalseForNonDigit) { + EXPECT_FALSE(IsDigit('\0')); + EXPECT_FALSE(IsDigit(' ')); + EXPECT_FALSE(IsDigit('+')); + EXPECT_FALSE(IsDigit('-')); + EXPECT_FALSE(IsDigit('.')); + EXPECT_FALSE(IsDigit('a')); +} + +TEST(IsDigitTest, IsTrueForDigit) { + EXPECT_TRUE(IsDigit('0')); + EXPECT_TRUE(IsDigit('1')); + EXPECT_TRUE(IsDigit('5')); + EXPECT_TRUE(IsDigit('9')); +} + +TEST(IsPunctTest, IsFalseForNonPunct) { + EXPECT_FALSE(IsPunct('\0')); + EXPECT_FALSE(IsPunct(' ')); + EXPECT_FALSE(IsPunct('\n')); + EXPECT_FALSE(IsPunct('a')); + EXPECT_FALSE(IsPunct('0')); +} + +TEST(IsPunctTest, IsTrueForPunct) { + for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) { + EXPECT_PRED1(IsPunct, *p); + } +} + +TEST(IsRepeatTest, IsFalseForNonRepeatChar) { + EXPECT_FALSE(IsRepeat('\0')); + EXPECT_FALSE(IsRepeat(' ')); + EXPECT_FALSE(IsRepeat('a')); + EXPECT_FALSE(IsRepeat('1')); + EXPECT_FALSE(IsRepeat('-')); +} + +TEST(IsRepeatTest, IsTrueForRepeatChar) { + EXPECT_TRUE(IsRepeat('?')); + EXPECT_TRUE(IsRepeat('*')); + EXPECT_TRUE(IsRepeat('+')); +} + +TEST(IsWhiteSpaceTest, IsFalseForNonWhiteSpace) { + EXPECT_FALSE(IsWhiteSpace('\0')); + EXPECT_FALSE(IsWhiteSpace('a')); + EXPECT_FALSE(IsWhiteSpace('1')); + EXPECT_FALSE(IsWhiteSpace('+')); + EXPECT_FALSE(IsWhiteSpace('_')); +} + +TEST(IsWhiteSpaceTest, IsTrueForWhiteSpace) { + EXPECT_TRUE(IsWhiteSpace(' ')); + EXPECT_TRUE(IsWhiteSpace('\n')); + EXPECT_TRUE(IsWhiteSpace('\r')); + EXPECT_TRUE(IsWhiteSpace('\t')); + EXPECT_TRUE(IsWhiteSpace('\v')); + EXPECT_TRUE(IsWhiteSpace('\f')); +} + +TEST(IsWordCharTest, IsFalseForNonWordChar) { + EXPECT_FALSE(IsWordChar('\0')); + EXPECT_FALSE(IsWordChar('+')); + EXPECT_FALSE(IsWordChar('.')); + EXPECT_FALSE(IsWordChar(' ')); + EXPECT_FALSE(IsWordChar('\n')); +} + +TEST(IsWordCharTest, IsTrueForLetter) { + EXPECT_TRUE(IsWordChar('a')); + EXPECT_TRUE(IsWordChar('b')); + EXPECT_TRUE(IsWordChar('A')); + EXPECT_TRUE(IsWordChar('Z')); +} + +TEST(IsWordCharTest, IsTrueForDigit) { + EXPECT_TRUE(IsWordChar('0')); + EXPECT_TRUE(IsWordChar('1')); + EXPECT_TRUE(IsWordChar('7')); + EXPECT_TRUE(IsWordChar('9')); +} + +TEST(IsWordCharTest, IsTrueForUnderscore) { + EXPECT_TRUE(IsWordChar('_')); +} + +TEST(IsValidEscapeTest, IsFalseForNonPrintable) { + EXPECT_FALSE(IsValidEscape('\0')); + EXPECT_FALSE(IsValidEscape('\007')); +} + +TEST(IsValidEscapeTest, IsFalseForDigit) { + EXPECT_FALSE(IsValidEscape('0')); + EXPECT_FALSE(IsValidEscape('9')); +} + +TEST(IsValidEscapeTest, IsFalseForWhiteSpace) { + EXPECT_FALSE(IsValidEscape(' ')); + EXPECT_FALSE(IsValidEscape('\n')); +} + +TEST(IsValidEscapeTest, IsFalseForSomeLetter) { + EXPECT_FALSE(IsValidEscape('a')); + EXPECT_FALSE(IsValidEscape('Z')); +} + +TEST(IsValidEscapeTest, IsTrueForPunct) { + EXPECT_TRUE(IsValidEscape('.')); + EXPECT_TRUE(IsValidEscape('-')); + EXPECT_TRUE(IsValidEscape('^')); + EXPECT_TRUE(IsValidEscape('$')); + EXPECT_TRUE(IsValidEscape('(')); + EXPECT_TRUE(IsValidEscape(']')); + EXPECT_TRUE(IsValidEscape('{')); + EXPECT_TRUE(IsValidEscape('|')); +} + +TEST(IsValidEscapeTest, IsTrueForSomeLetter) { + EXPECT_TRUE(IsValidEscape('d')); + EXPECT_TRUE(IsValidEscape('D')); + EXPECT_TRUE(IsValidEscape('s')); + EXPECT_TRUE(IsValidEscape('S')); + EXPECT_TRUE(IsValidEscape('w')); + EXPECT_TRUE(IsValidEscape('W')); +} + +TEST(AtomMatchesCharTest, EscapedPunct) { + EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, '\\', ' ')); + EXPECT_FALSE(AtomMatchesChar(true, '_', '.')); + EXPECT_FALSE(AtomMatchesChar(true, '.', 'a')); + + EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\')); + EXPECT_TRUE(AtomMatchesChar(true, '_', '_')); + EXPECT_TRUE(AtomMatchesChar(true, '+', '+')); + EXPECT_TRUE(AtomMatchesChar(true, '.', '.')); +} + +TEST(AtomMatchesCharTest, Escaped_d) { + EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a')); + EXPECT_FALSE(AtomMatchesChar(true, 'd', '.')); + + EXPECT_TRUE(AtomMatchesChar(true, 'd', '0')); + EXPECT_TRUE(AtomMatchesChar(true, 'd', '9')); +} + +TEST(AtomMatchesCharTest, Escaped_D) { + EXPECT_FALSE(AtomMatchesChar(true, 'D', '0')); + EXPECT_FALSE(AtomMatchesChar(true, 'D', '9')); + + EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0')); + EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a')); + EXPECT_TRUE(AtomMatchesChar(true, 'D', '-')); +} + +TEST(AtomMatchesCharTest, Escaped_s) { + EXPECT_FALSE(AtomMatchesChar(true, 's', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 's', 'a')); + EXPECT_FALSE(AtomMatchesChar(true, 's', '.')); + EXPECT_FALSE(AtomMatchesChar(true, 's', '9')); + + EXPECT_TRUE(AtomMatchesChar(true, 's', ' ')); + EXPECT_TRUE(AtomMatchesChar(true, 's', '\n')); + EXPECT_TRUE(AtomMatchesChar(true, 's', '\t')); +} + +TEST(AtomMatchesCharTest, Escaped_S) { + EXPECT_FALSE(AtomMatchesChar(true, 'S', ' ')); + EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r')); + + EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0')); + EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a')); + EXPECT_TRUE(AtomMatchesChar(true, 'S', '9')); +} + +TEST(AtomMatchesCharTest, Escaped_w) { + EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 'w', '+')); + EXPECT_FALSE(AtomMatchesChar(true, 'w', ' ')); + EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n')); + + EXPECT_TRUE(AtomMatchesChar(true, 'w', '0')); + EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b')); + EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C')); + EXPECT_TRUE(AtomMatchesChar(true, 'w', '_')); +} + +TEST(AtomMatchesCharTest, Escaped_W) { + EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A')); + EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b')); + EXPECT_FALSE(AtomMatchesChar(true, 'W', '9')); + EXPECT_FALSE(AtomMatchesChar(true, 'W', '_')); + + EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0')); + EXPECT_TRUE(AtomMatchesChar(true, 'W', '*')); + EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n')); +} + +TEST(AtomMatchesCharTest, EscapedWhiteSpace) { + EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n')); + EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r')); + EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a')); + EXPECT_FALSE(AtomMatchesChar(true, 't', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 't', 't')); + EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0')); + EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f')); + + EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f')); + EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n')); + EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r')); + EXPECT_TRUE(AtomMatchesChar(true, 't', '\t')); + EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v')); +} + +TEST(AtomMatchesCharTest, UnescapedDot) { + EXPECT_FALSE(AtomMatchesChar(false, '.', '\n')); + + EXPECT_TRUE(AtomMatchesChar(false, '.', '\0')); + EXPECT_TRUE(AtomMatchesChar(false, '.', '.')); + EXPECT_TRUE(AtomMatchesChar(false, '.', 'a')); + EXPECT_TRUE(AtomMatchesChar(false, '.', ' ')); +} + +TEST(AtomMatchesCharTest, UnescapedChar) { + EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0')); + EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b')); + EXPECT_FALSE(AtomMatchesChar(false, '$', 'a')); + + EXPECT_TRUE(AtomMatchesChar(false, '$', '$')); + EXPECT_TRUE(AtomMatchesChar(false, '5', '5')); + EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z')); +} + +TEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) { + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)), + "NULL is not a valid simple regular expression"); + EXPECT_NONFATAL_FAILURE( + ASSERT_FALSE(ValidateRegex("a\\")), + "Syntax error at index 1 in simple regular expression \"a\\\": "); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")), + "'\\' cannot appear at the end"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")), + "'\\' cannot appear at the end"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")), + "invalid escape sequence \"\\h\""); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")), + "'^' can only appear at the beginning"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")), + "'^' can only appear at the beginning"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")), + "'$' can only appear at the end"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")), + "'$' can only appear at the end"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")), + "'(' is unsupported"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")), + "')' is unsupported"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")), + "'[' is unsupported"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")), + "'{' is unsupported"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")), + "'?' can only follow a repeatable token"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")), + "'*' can only follow a repeatable token"); + EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")), + "'+' can only follow a repeatable token"); +} + +TEST(ValidateRegexTest, ReturnsTrueForValid) { + EXPECT_TRUE(ValidateRegex("")); + EXPECT_TRUE(ValidateRegex("a")); + EXPECT_TRUE(ValidateRegex(".*")); + EXPECT_TRUE(ValidateRegex("^a_+")); + EXPECT_TRUE(ValidateRegex("^a\\t\\&?")); + EXPECT_TRUE(ValidateRegex("09*$")); + EXPECT_TRUE(ValidateRegex("^Z$")); + EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}")); +} + +TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) { + EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba")); + // Repeating more than once. + EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab")); + + // Repeating zero times. + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba")); + // Repeating once. + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab")); + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##")); +} + +TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) { + EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab")); + + // Repeating zero times. + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc")); + // Repeating once. + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc")); + // Repeating more than once. + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g")); +} + +TEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) { + EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab")); + // Repeating zero times. + EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc")); + + // Repeating once. + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc")); + // Repeating more than once. + EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g")); +} + +TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) { + EXPECT_TRUE(MatchRegexAtHead("", "")); + EXPECT_TRUE(MatchRegexAtHead("", "ab")); +} + +TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) { + EXPECT_FALSE(MatchRegexAtHead("$", "a")); + + EXPECT_TRUE(MatchRegexAtHead("$", "")); + EXPECT_TRUE(MatchRegexAtHead("a$", "a")); +} + +TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) { + EXPECT_FALSE(MatchRegexAtHead("\\w", "+")); + EXPECT_FALSE(MatchRegexAtHead("\\W", "ab")); + + EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab")); + EXPECT_TRUE(MatchRegexAtHead("\\d", "1a")); +} + +TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) { + EXPECT_FALSE(MatchRegexAtHead(".+a", "abc")); + EXPECT_FALSE(MatchRegexAtHead("a?b", "aab")); + + EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab")); + EXPECT_TRUE(MatchRegexAtHead("a?b", "b")); + EXPECT_TRUE(MatchRegexAtHead("a?b", "ab")); +} + +TEST(MatchRegexAtHeadTest, + WorksWhenRegexStartsWithRepetionOfEscapeSequence) { + EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc")); + EXPECT_FALSE(MatchRegexAtHead("\\s?b", " b")); + + EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab")); + EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b")); + EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b")); + EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b")); +} + +TEST(MatchRegexAtHeadTest, MatchesSequentially) { + EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc")); + + EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc")); +} + +TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) { + EXPECT_FALSE(MatchRegexAnywhere("", NULL)); +} + +TEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) { + EXPECT_FALSE(MatchRegexAnywhere("^a", "ba")); + EXPECT_FALSE(MatchRegexAnywhere("^$", "a")); + + EXPECT_TRUE(MatchRegexAnywhere("^a", "ab")); + EXPECT_TRUE(MatchRegexAnywhere("^", "ab")); + EXPECT_TRUE(MatchRegexAnywhere("^$", "")); +} + +TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) { + EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123")); + EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888")); +} + +TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) { + EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5")); + EXPECT_TRUE(MatchRegexAnywhere(".*=", "=")); + EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc")); +} + +TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) { + EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5")); + EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "= ...=")); +} + +// Tests RE's implicit constructors. +TEST(RETest, ImplicitConstructorWorks) { + const RE empty(""); + EXPECT_STREQ("", empty.pattern()); + + const RE simple("hello"); + EXPECT_STREQ("hello", simple.pattern()); +} + +// Tests that RE's constructors reject invalid regular expressions. +TEST(RETest, RejectsInvalidRegex) { + EXPECT_NONFATAL_FAILURE({ + const RE normal(NULL); + }, "NULL is not a valid simple regular expression"); + + EXPECT_NONFATAL_FAILURE({ + const RE normal(".*(\\w+"); + }, "'(' is unsupported"); + + EXPECT_NONFATAL_FAILURE({ + const RE invalid("^?"); + }, "'?' can only follow a repeatable token"); +} + +// Tests RE::FullMatch(). +TEST(RETest, FullMatchWorks) { + const RE empty(""); + EXPECT_TRUE(RE::FullMatch("", empty)); + EXPECT_FALSE(RE::FullMatch("a", empty)); + + const RE re1("a"); + EXPECT_TRUE(RE::FullMatch("a", re1)); + + const RE re("a.*z"); + EXPECT_TRUE(RE::FullMatch("az", re)); + EXPECT_TRUE(RE::FullMatch("axyz", re)); + EXPECT_FALSE(RE::FullMatch("baz", re)); + EXPECT_FALSE(RE::FullMatch("azy", re)); +} + +// Tests RE::PartialMatch(). +TEST(RETest, PartialMatchWorks) { + const RE empty(""); + EXPECT_TRUE(RE::PartialMatch("", empty)); + EXPECT_TRUE(RE::PartialMatch("a", empty)); + + const RE re("a.*z"); + EXPECT_TRUE(RE::PartialMatch("az", re)); + EXPECT_TRUE(RE::PartialMatch("axyz", re)); + EXPECT_TRUE(RE::PartialMatch("baz", re)); + EXPECT_TRUE(RE::PartialMatch("azy", re)); + EXPECT_FALSE(RE::PartialMatch("zza", re)); +} + +#endif // GTEST_USES_POSIX_RE + +#if !GTEST_OS_WINDOWS_MOBILE + +TEST(CaptureTest, CapturesStdout) { + CaptureStdout(); + fprintf(stdout, "abc"); + EXPECT_STREQ("abc", GetCapturedStdout().c_str()); + + CaptureStdout(); + fprintf(stdout, "def%cghi", '\0'); + EXPECT_EQ(::std::string("def\0ghi", 7), ::std::string(GetCapturedStdout())); +} + +TEST(CaptureTest, CapturesStderr) { + CaptureStderr(); + fprintf(stderr, "jkl"); + EXPECT_STREQ("jkl", GetCapturedStderr().c_str()); + + CaptureStderr(); + fprintf(stderr, "jkl%cmno", '\0'); + EXPECT_EQ(::std::string("jkl\0mno", 7), ::std::string(GetCapturedStderr())); +} + +// Tests that stdout and stderr capture don't interfere with each other. +TEST(CaptureTest, CapturesStdoutAndStderr) { + CaptureStdout(); + CaptureStderr(); + fprintf(stdout, "pqr"); + fprintf(stderr, "stu"); + EXPECT_STREQ("pqr", GetCapturedStdout().c_str()); + EXPECT_STREQ("stu", GetCapturedStderr().c_str()); +} + +TEST(CaptureDeathTest, CannotReenterStdoutCapture) { + CaptureStdout(); + EXPECT_DEATH_IF_SUPPORTED(CaptureStdout();, + "Only one stdout capturer can exist at a time"); + GetCapturedStdout(); + + // We cannot test stderr capturing using death tests as they use it + // themselves. +} + +#endif // !GTEST_OS_WINDOWS_MOBILE + +TEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) { + ThreadLocal t1; + EXPECT_EQ(0, t1.get()); + + ThreadLocal t2; + EXPECT_TRUE(t2.get() == NULL); +} + +TEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) { + ThreadLocal t1(123); + EXPECT_EQ(123, t1.get()); + + int i = 0; + ThreadLocal t2(&i); + EXPECT_EQ(&i, t2.get()); +} + +class NoDefaultContructor { + public: + explicit NoDefaultContructor(const char*) {} + NoDefaultContructor(const NoDefaultContructor&) {} +}; + +TEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) { + ThreadLocal bar(NoDefaultContructor("foo")); + bar.pointer(); +} + +TEST(ThreadLocalTest, GetAndPointerReturnSameValue) { + ThreadLocal thread_local; + + EXPECT_EQ(thread_local.pointer(), &(thread_local.get())); + + // Verifies the condition still holds after calling set. + thread_local.set("foo"); + EXPECT_EQ(thread_local.pointer(), &(thread_local.get())); +} + +TEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) { + ThreadLocal thread_local; + const ThreadLocal& const_thread_local = thread_local; + + EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer()); + + thread_local.set("foo"); + EXPECT_EQ(thread_local.pointer(), const_thread_local.pointer()); +} + +#if GTEST_IS_THREADSAFE + +void AddTwo(int* param) { *param += 2; } + +TEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) { + int i = 40; + ThreadWithParam thread(&AddTwo, &i, NULL); + thread.Join(); + EXPECT_EQ(42, i); +} + +TEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) { + // AssertHeld() is flaky only in the presence of multiple threads accessing + // the lock. In this case, the test is robust. + EXPECT_DEATH_IF_SUPPORTED({ + Mutex m; + { MutexLock lock(&m); } + m.AssertHeld(); + }, + "thread .*hold"); +} + +TEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) { + Mutex m; + MutexLock lock(&m); + m.AssertHeld(); +} + +class AtomicCounterWithMutex { + public: + explicit AtomicCounterWithMutex(Mutex* mutex) : + value_(0), mutex_(mutex), random_(42) {} + + void Increment() { + MutexLock lock(mutex_); + int temp = value_; + { + // Locking a mutex puts up a memory barrier, preventing reads and + // writes to value_ rearranged when observed from other threads. + // + // We cannot use Mutex and MutexLock here or rely on their memory + // barrier functionality as we are testing them here. + pthread_mutex_t memory_barrier_mutex; + GTEST_CHECK_POSIX_SUCCESS_( + pthread_mutex_init(&memory_barrier_mutex, NULL)); + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex)); + + SleepMilliseconds(random_.Generate(30)); + + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex)); + } + value_ = temp + 1; + } + int value() const { return value_; } + + private: + volatile int value_; + Mutex* const mutex_; // Protects value_. + Random random_; +}; + +void CountingThreadFunc(pair param) { + for (int i = 0; i < param.second; ++i) + param.first->Increment(); +} + +// Tests that the mutex only lets one thread at a time to lock it. +TEST(MutexTest, OnlyOneThreadCanLockAtATime) { + Mutex mutex; + AtomicCounterWithMutex locked_counter(&mutex); + + typedef ThreadWithParam > ThreadType; + const int kCycleCount = 20; + const int kThreadCount = 7; + scoped_ptr counting_threads[kThreadCount]; + Notification threads_can_start; + // Creates and runs kThreadCount threads that increment locked_counter + // kCycleCount times each. + for (int i = 0; i < kThreadCount; ++i) { + counting_threads[i].reset(new ThreadType(&CountingThreadFunc, + make_pair(&locked_counter, + kCycleCount), + &threads_can_start)); + } + threads_can_start.Notify(); + for (int i = 0; i < kThreadCount; ++i) + counting_threads[i]->Join(); + + // If the mutex lets more than one thread to increment the counter at a + // time, they are likely to encounter a race condition and have some + // increments overwritten, resulting in the lower then expected counter + // value. + EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value()); +} + +template +void RunFromThread(void (func)(T), T param) { + ThreadWithParam thread(func, param, NULL); + thread.Join(); +} + +void RetrieveThreadLocalValue(pair*, String*> param) { + *param.second = param.first->get(); +} + +TEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) { + ThreadLocal thread_local("foo"); + EXPECT_STREQ("foo", thread_local.get().c_str()); + + thread_local.set("bar"); + EXPECT_STREQ("bar", thread_local.get().c_str()); + + String result; + RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result)); + EXPECT_STREQ("foo", result.c_str()); +} + +// DestructorTracker keeps track of whether its instances have been +// destroyed. +static std::vector g_destroyed; + +class DestructorTracker { + public: + DestructorTracker() : index_(GetNewIndex()) {} + DestructorTracker(const DestructorTracker& /* rhs */) + : index_(GetNewIndex()) {} + ~DestructorTracker() { + // We never access g_destroyed concurrently, so we don't need to + // protect the write operation under a mutex. + g_destroyed[index_] = true; + } + + private: + static int GetNewIndex() { + g_destroyed.push_back(false); + return g_destroyed.size() - 1; + } + const int index_; +}; + +typedef ThreadLocal* ThreadParam; + +void CallThreadLocalGet(ThreadParam thread_local) { + thread_local->get(); +} + +// Tests that when a ThreadLocal object dies in a thread, it destroys +// the managed object for that thread. +TEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) { + g_destroyed.clear(); + + { + // The next line default constructs a DestructorTracker object as + // the default value of objects managed by thread_local. + ThreadLocal thread_local; + ASSERT_EQ(1U, g_destroyed.size()); + ASSERT_FALSE(g_destroyed[0]); + + // This creates another DestructorTracker object for the main thread. + thread_local.get(); + ASSERT_EQ(2U, g_destroyed.size()); + ASSERT_FALSE(g_destroyed[0]); + ASSERT_FALSE(g_destroyed[1]); + } + + // Now thread_local has died. It should have destroyed both the + // default value shared by all threads and the value for the main + // thread. + ASSERT_EQ(2U, g_destroyed.size()); + EXPECT_TRUE(g_destroyed[0]); + EXPECT_TRUE(g_destroyed[1]); + + g_destroyed.clear(); +} + +// Tests that when a thread exits, the thread-local object for that +// thread is destroyed. +TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) { + g_destroyed.clear(); + + { + // The next line default constructs a DestructorTracker object as + // the default value of objects managed by thread_local. + ThreadLocal thread_local; + ASSERT_EQ(1U, g_destroyed.size()); + ASSERT_FALSE(g_destroyed[0]); + + // This creates another DestructorTracker object in the new thread. + ThreadWithParam thread( + &CallThreadLocalGet, &thread_local, NULL); + thread.Join(); + + // Now the new thread has exited. The per-thread object for it + // should have been destroyed. + ASSERT_EQ(2U, g_destroyed.size()); + ASSERT_FALSE(g_destroyed[0]); + ASSERT_TRUE(g_destroyed[1]); + } + + // Now thread_local has died. The default value should have been + // destroyed too. + ASSERT_EQ(2U, g_destroyed.size()); + EXPECT_TRUE(g_destroyed[0]); + EXPECT_TRUE(g_destroyed[1]); + + g_destroyed.clear(); +} + +TEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) { + ThreadLocal thread_local; + thread_local.set("Foo"); + EXPECT_STREQ("Foo", thread_local.get().c_str()); + + String result; + RunFromThread(&RetrieveThreadLocalValue, make_pair(&thread_local, &result)); + EXPECT_TRUE(result.c_str() == NULL); +} + +#endif // GTEST_IS_THREADSAFE + +} // namespace internal +} // namespace testing diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc new file mode 100644 index 000000000..5a3e9196a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc @@ -0,0 +1,208 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: mheule@google.com (Markus Heule) +// + +#include + +#include + +using testing::Message; +using testing::Test; +using testing::TestPartResult; +using testing::TestPartResultArray; + +namespace { + +// Tests the TestPartResult class. + +// The test fixture for testing TestPartResult. +class TestPartResultTest : public Test { + protected: + TestPartResultTest() + : r1_(TestPartResult::kSuccess, "foo/bar.cc", 10, "Success!"), + r2_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure!"), + r3_(TestPartResult::kFatalFailure, NULL, -1, "Failure!") {} + + TestPartResult r1_, r2_, r3_; +}; + + +TEST_F(TestPartResultTest, ConstructorWorks) { + Message message; + message << "something is terribly wrong"; + message << static_cast(testing::internal::kStackTraceMarker); + message << "some unimportant stack trace"; + + const TestPartResult result(TestPartResult::kNonFatalFailure, + "some_file.cc", + 42, + message.GetString().c_str()); + + EXPECT_EQ(TestPartResult::kNonFatalFailure, result.type()); + EXPECT_STREQ("some_file.cc", result.file_name()); + EXPECT_EQ(42, result.line_number()); + EXPECT_STREQ(message.GetString().c_str(), result.message()); + EXPECT_STREQ("something is terribly wrong", result.summary()); +} + +TEST_F(TestPartResultTest, ResultAccessorsWork) { + const TestPartResult success(TestPartResult::kSuccess, + "file.cc", + 42, + "message"); + EXPECT_TRUE(success.passed()); + EXPECT_FALSE(success.failed()); + EXPECT_FALSE(success.nonfatally_failed()); + EXPECT_FALSE(success.fatally_failed()); + + const TestPartResult nonfatal_failure(TestPartResult::kNonFatalFailure, + "file.cc", + 42, + "message"); + EXPECT_FALSE(nonfatal_failure.passed()); + EXPECT_TRUE(nonfatal_failure.failed()); + EXPECT_TRUE(nonfatal_failure.nonfatally_failed()); + EXPECT_FALSE(nonfatal_failure.fatally_failed()); + + const TestPartResult fatal_failure(TestPartResult::kFatalFailure, + "file.cc", + 42, + "message"); + EXPECT_FALSE(fatal_failure.passed()); + EXPECT_TRUE(fatal_failure.failed()); + EXPECT_FALSE(fatal_failure.nonfatally_failed()); + EXPECT_TRUE(fatal_failure.fatally_failed()); +} + +// Tests TestPartResult::type(). +TEST_F(TestPartResultTest, type) { + EXPECT_EQ(TestPartResult::kSuccess, r1_.type()); + EXPECT_EQ(TestPartResult::kNonFatalFailure, r2_.type()); + EXPECT_EQ(TestPartResult::kFatalFailure, r3_.type()); +} + +// Tests TestPartResult::file_name(). +TEST_F(TestPartResultTest, file_name) { + EXPECT_STREQ("foo/bar.cc", r1_.file_name()); + EXPECT_STREQ(NULL, r3_.file_name()); +} + +// Tests TestPartResult::line_number(). +TEST_F(TestPartResultTest, line_number) { + EXPECT_EQ(10, r1_.line_number()); + EXPECT_EQ(-1, r2_.line_number()); +} + +// Tests TestPartResult::message(). +TEST_F(TestPartResultTest, message) { + EXPECT_STREQ("Success!", r1_.message()); +} + +// Tests TestPartResult::passed(). +TEST_F(TestPartResultTest, Passed) { + EXPECT_TRUE(r1_.passed()); + EXPECT_FALSE(r2_.passed()); + EXPECT_FALSE(r3_.passed()); +} + +// Tests TestPartResult::failed(). +TEST_F(TestPartResultTest, Failed) { + EXPECT_FALSE(r1_.failed()); + EXPECT_TRUE(r2_.failed()); + EXPECT_TRUE(r3_.failed()); +} + +// Tests TestPartResult::fatally_failed(). +TEST_F(TestPartResultTest, FatallyFailed) { + EXPECT_FALSE(r1_.fatally_failed()); + EXPECT_FALSE(r2_.fatally_failed()); + EXPECT_TRUE(r3_.fatally_failed()); +} + +// Tests TestPartResult::nonfatally_failed(). +TEST_F(TestPartResultTest, NonfatallyFailed) { + EXPECT_FALSE(r1_.nonfatally_failed()); + EXPECT_TRUE(r2_.nonfatally_failed()); + EXPECT_FALSE(r3_.nonfatally_failed()); +} + +// Tests the TestPartResultArray class. + +class TestPartResultArrayTest : public Test { + protected: + TestPartResultArrayTest() + : r1_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure 1"), + r2_(TestPartResult::kFatalFailure, "foo/bar.cc", -1, "Failure 2") {} + + const TestPartResult r1_, r2_; +}; + +// Tests that TestPartResultArray initially has size 0. +TEST_F(TestPartResultArrayTest, InitialSizeIsZero) { + TestPartResultArray results; + EXPECT_EQ(0, results.size()); +} + +// Tests that TestPartResultArray contains the given TestPartResult +// after one Append() operation. +TEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) { + TestPartResultArray results; + results.Append(r1_); + EXPECT_EQ(1, results.size()); + EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message()); +} + +// Tests that TestPartResultArray contains the given TestPartResults +// after two Append() operations. +TEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) { + TestPartResultArray results; + results.Append(r1_); + results.Append(r2_); + EXPECT_EQ(2, results.size()); + EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message()); + EXPECT_STREQ("Failure 2", results.GetTestPartResult(1).message()); +} + +typedef TestPartResultArrayTest TestPartResultArrayDeathTest; + +// Tests that the program dies when GetTestPartResult() is called with +// an invalid index. +TEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) { + TestPartResultArray results; + results.Append(r1_); + + EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(-1), ""); + EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(1), ""); +} + +// TODO(mheule@google.com): Add a test for the class HasNewFatalFailureHelper. + +} // namespace diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc new file mode 100644 index 000000000..532f70b3d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc @@ -0,0 +1,320 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include +#include +#include + +namespace { + +using ::std::tr1::get; +using ::std::tr1::make_tuple; +using ::std::tr1::tuple; +using ::std::tr1::tuple_element; +using ::std::tr1::tuple_size; +using ::testing::StaticAssertTypeEq; + +// Tests that tuple_element >::type returns TK. +TEST(tuple_element_Test, ReturnsElementType) { + StaticAssertTypeEq >::type>(); + StaticAssertTypeEq >::type>(); + StaticAssertTypeEq >::type>(); +} + +// Tests that tuple_size::value gives the number of fields in tuple +// type T. +TEST(tuple_size_Test, ReturnsNumberOfFields) { + EXPECT_EQ(0, +tuple_size >::value); + EXPECT_EQ(1, +tuple_size >::value); + EXPECT_EQ(1, +tuple_size >::value); + EXPECT_EQ(1, +(tuple_size > >::value)); + EXPECT_EQ(2, +(tuple_size >::value)); + EXPECT_EQ(3, +(tuple_size >::value)); +} + +// Tests comparing a tuple with itself. +TEST(ComparisonTest, ComparesWithSelf) { + const tuple a(5, 'a', false); + + EXPECT_TRUE(a == a); + EXPECT_FALSE(a != a); +} + +// Tests comparing two tuples with the same value. +TEST(ComparisonTest, ComparesEqualTuples) { + const tuple a(5, true), b(5, true); + + EXPECT_TRUE(a == b); + EXPECT_FALSE(a != b); +} + +// Tests comparing two different tuples that have no reference fields. +TEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) { + typedef tuple FooTuple; + + const FooTuple a(0, 'x'); + const FooTuple b(1, 'a'); + + EXPECT_TRUE(a != b); + EXPECT_FALSE(a == b); + + const FooTuple c(1, 'b'); + + EXPECT_TRUE(b != c); + EXPECT_FALSE(b == c); +} + +// Tests comparing two different tuples that have reference fields. +TEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) { + typedef tuple FooTuple; + + int i = 5; + const char ch = 'a'; + const FooTuple a(i, ch); + + int j = 6; + const FooTuple b(j, ch); + + EXPECT_TRUE(a != b); + EXPECT_FALSE(a == b); + + j = 5; + const char ch2 = 'b'; + const FooTuple c(j, ch2); + + EXPECT_TRUE(b != c); + EXPECT_FALSE(b == c); +} + +// Tests that a tuple field with a reference type is an alias of the +// variable it's supposed to reference. +TEST(ReferenceFieldTest, IsAliasOfReferencedVariable) { + int n = 0; + tuple t(true, n); + + n = 1; + EXPECT_EQ(n, get<1>(t)) + << "Changing a underlying variable should update the reference field."; + + // Makes sure that the implementation doesn't do anything funny with + // the & operator for the return type of get<>(). + EXPECT_EQ(&n, &(get<1>(t))) + << "The address of a reference field should equal the address of " + << "the underlying variable."; + + get<1>(t) = 2; + EXPECT_EQ(2, n) + << "Changing a reference field should update the underlying variable."; +} + +// Tests that tuple's default constructor default initializes each field. +// This test needs to compile without generating warnings. +TEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) { + // The TR1 report requires that tuple's default constructor default + // initializes each field, even if it's a primitive type. If the + // implementation forgets to do this, this test will catch it by + // generating warnings about using uninitialized variables (assuming + // a decent compiler). + + tuple<> empty; + + tuple a1, b1; + b1 = a1; + EXPECT_EQ(0, get<0>(b1)); + + tuple a2, b2; + b2 = a2; + EXPECT_EQ(0, get<0>(b2)); + EXPECT_EQ(0.0, get<1>(b2)); + + tuple a3, b3; + b3 = a3; + EXPECT_EQ(0.0, get<0>(b3)); + EXPECT_EQ('\0', get<1>(b3)); + EXPECT_TRUE(get<2>(b3) == NULL); + + tuple a10, b10; + b10 = a10; + EXPECT_EQ(0, get<0>(b10)); + EXPECT_EQ(0, get<1>(b10)); + EXPECT_EQ(0, get<2>(b10)); + EXPECT_EQ(0, get<3>(b10)); + EXPECT_EQ(0, get<4>(b10)); + EXPECT_EQ(0, get<5>(b10)); + EXPECT_EQ(0, get<6>(b10)); + EXPECT_EQ(0, get<7>(b10)); + EXPECT_EQ(0, get<8>(b10)); + EXPECT_EQ(0, get<9>(b10)); +} + +// Tests constructing a tuple from its fields. +TEST(TupleConstructorTest, ConstructsFromFields) { + int n = 1; + // Reference field. + tuple a(n); + EXPECT_EQ(&n, &(get<0>(a))); + + // Non-reference fields. + tuple b(5, 'a'); + EXPECT_EQ(5, get<0>(b)); + EXPECT_EQ('a', get<1>(b)); + + // Const reference field. + const int m = 2; + tuple c(true, m); + EXPECT_TRUE(get<0>(c)); + EXPECT_EQ(&m, &(get<1>(c))); +} + +// Tests tuple's copy constructor. +TEST(TupleConstructorTest, CopyConstructor) { + tuple a(0.0, true); + tuple b(a); + + EXPECT_DOUBLE_EQ(0.0, get<0>(b)); + EXPECT_TRUE(get<1>(b)); +} + +// Tests constructing a tuple from another tuple that has a compatible +// but different type. +TEST(TupleConstructorTest, ConstructsFromDifferentTupleType) { + tuple a(0, 1, 'a'); + tuple b(a); + + EXPECT_DOUBLE_EQ(0.0, get<0>(b)); + EXPECT_EQ(1, get<1>(b)); + EXPECT_EQ('a', get<2>(b)); +} + +// Tests constructing a 2-tuple from an std::pair. +TEST(TupleConstructorTest, ConstructsFromPair) { + ::std::pair a(1, 'a'); + tuple b(a); + tuple c(a); +} + +// Tests assigning a tuple to another tuple with the same type. +TEST(TupleAssignmentTest, AssignsToSameTupleType) { + const tuple a(5, 7L); + tuple b; + b = a; + EXPECT_EQ(5, get<0>(b)); + EXPECT_EQ(7L, get<1>(b)); +} + +// Tests assigning a tuple to another tuple with a different but +// compatible type. +TEST(TupleAssignmentTest, AssignsToDifferentTupleType) { + const tuple a(1, 7L, true); + tuple b; + b = a; + EXPECT_EQ(1L, get<0>(b)); + EXPECT_EQ(7, get<1>(b)); + EXPECT_TRUE(get<2>(b)); +} + +// Tests assigning an std::pair to a 2-tuple. +TEST(TupleAssignmentTest, AssignsFromPair) { + const ::std::pair a(5, true); + tuple b; + b = a; + EXPECT_EQ(5, get<0>(b)); + EXPECT_TRUE(get<1>(b)); + + tuple c; + c = a; + EXPECT_EQ(5L, get<0>(c)); + EXPECT_TRUE(get<1>(c)); +} + +// A fixture for testing big tuples. +class BigTupleTest : public testing::Test { + protected: + typedef tuple BigTuple; + + BigTupleTest() : + a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2), + b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {} + + BigTuple a_, b_; +}; + +// Tests constructing big tuples. +TEST_F(BigTupleTest, Construction) { + BigTuple a; + BigTuple b(b_); +} + +// Tests that get(t) returns the N-th (0-based) field of tuple t. +TEST_F(BigTupleTest, get) { + EXPECT_EQ(1, get<0>(a_)); + EXPECT_EQ(2, get<9>(a_)); + + // Tests that get() works on a const tuple too. + const BigTuple a(a_); + EXPECT_EQ(1, get<0>(a)); + EXPECT_EQ(2, get<9>(a)); +} + +// Tests comparing big tuples. +TEST_F(BigTupleTest, Comparisons) { + EXPECT_TRUE(a_ == a_); + EXPECT_FALSE(a_ != a_); + + EXPECT_TRUE(a_ != b_); + EXPECT_FALSE(a_ == b_); +} + +TEST(MakeTupleTest, WorksForScalarTypes) { + tuple a; + a = make_tuple(true, 5); + EXPECT_TRUE(get<0>(a)); + EXPECT_EQ(5, get<1>(a)); + + tuple b; + b = make_tuple('a', 'b', 5); + EXPECT_EQ('a', get<0>(b)); + EXPECT_EQ('b', get<1>(b)); + EXPECT_EQ(5, get<2>(b)); +} + +TEST(MakeTupleTest, WorksForPointers) { + int a[] = { 1, 2, 3, 4 }; + const char* const str = "hi"; + int* const p = a; + + tuple t; + t = make_tuple(str, p); + EXPECT_EQ(str, get<0>(t)); + EXPECT_EQ(p, get<1>(t)); +} + +} // namespace diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc new file mode 100644 index 000000000..79a8a87dc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc @@ -0,0 +1,45 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include + +#include "test/gtest-typed-test_test.h" +#include + +#if GTEST_HAS_TYPED_TEST_P + +// Tests that the same type-parameterized test case can be +// instantiated in different translation units linked together. +// (ContainerTest is also instantiated in gtest-typed-test_test.cc.) +INSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest, + testing::Types >); + +#endif // GTEST_HAS_TYPED_TEST_P diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc new file mode 100644 index 000000000..f2c397231 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc @@ -0,0 +1,360 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include +#include + +#include "test/gtest-typed-test_test.h" +#include + +using testing::Test; + +// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture +// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and +// type-parameterized test. +template +class CommonTest : public Test { + // For some technical reason, SetUpTestCase() and TearDownTestCase() + // must be public. + public: + static void SetUpTestCase() { + shared_ = new T(5); + } + + static void TearDownTestCase() { + delete shared_; + shared_ = NULL; + } + + // This 'protected:' is optional. There's no harm in making all + // members of this fixture class template public. + protected: + // We used to use std::list here, but switched to std::vector since + // MSVC's doesn't compile cleanly with /W4. + typedef std::vector Vector; + typedef std::set IntSet; + + CommonTest() : value_(1) {} + + virtual ~CommonTest() { EXPECT_EQ(3, value_); } + + virtual void SetUp() { + EXPECT_EQ(1, value_); + value_++; + } + + virtual void TearDown() { + EXPECT_EQ(2, value_); + value_++; + } + + T value_; + static T* shared_; +}; + +template +T* CommonTest::shared_ = NULL; + +// This #ifdef block tests typed tests. +#if GTEST_HAS_TYPED_TEST + +using testing::Types; + +// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, +// and SetUp()/TearDown() work correctly in typed tests + +typedef Types TwoTypes; +TYPED_TEST_CASE(CommonTest, TwoTypes); + +TYPED_TEST(CommonTest, ValuesAreCorrect) { + // Static members of the fixture class template can be visited via + // the TestFixture:: prefix. + EXPECT_EQ(5, *TestFixture::shared_); + + // Typedefs in the fixture class template can be visited via the + // "typename TestFixture::" prefix. + typename TestFixture::Vector empty; + EXPECT_EQ(0U, empty.size()); + + typename TestFixture::IntSet empty2; + EXPECT_EQ(0U, empty2.size()); + + // Non-static members of the fixture class must be visited via + // 'this', as required by C++ for class templates. + EXPECT_EQ(2, this->value_); +} + +// The second test makes sure shared_ is not deleted after the first +// test. +TYPED_TEST(CommonTest, ValuesAreStillCorrect) { + // Static members of the fixture class template can also be visited + // via 'this'. + ASSERT_TRUE(this->shared_ != NULL); + EXPECT_EQ(5, *this->shared_); + + // TypeParam can be used to refer to the type parameter. + EXPECT_EQ(static_cast(2), this->value_); +} + +// Tests that multiple TYPED_TEST_CASE's can be defined in the same +// translation unit. + +template +class TypedTest1 : public Test { +}; + +// Verifies that the second argument of TYPED_TEST_CASE can be a +// single type. +TYPED_TEST_CASE(TypedTest1, int); +TYPED_TEST(TypedTest1, A) {} + +template +class TypedTest2 : public Test { +}; + +// Verifies that the second argument of TYPED_TEST_CASE can be a +// Types<...> type list. +TYPED_TEST_CASE(TypedTest2, Types); + +// This also verifies that tests from different typed test cases can +// share the same name. +TYPED_TEST(TypedTest2, A) {} + +// Tests that a typed test case can be defined in a namespace. + +namespace library1 { + +template +class NumericTest : public Test { +}; + +typedef Types NumericTypes; +TYPED_TEST_CASE(NumericTest, NumericTypes); + +TYPED_TEST(NumericTest, DefaultIsZero) { + EXPECT_EQ(0, TypeParam()); +} + +} // namespace library1 + +#endif // GTEST_HAS_TYPED_TEST + +// This #ifdef block tests type-parameterized tests. +#if GTEST_HAS_TYPED_TEST_P + +using testing::Types; +using testing::internal::TypedTestCasePState; + +// Tests TypedTestCasePState. + +class TypedTestCasePStateTest : public Test { + protected: + virtual void SetUp() { + state_.AddTestName("foo.cc", 0, "FooTest", "A"); + state_.AddTestName("foo.cc", 0, "FooTest", "B"); + state_.AddTestName("foo.cc", 0, "FooTest", "C"); + } + + TypedTestCasePState state_; +}; + +TEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) { + const char* tests = "A, B, C"; + EXPECT_EQ(tests, + state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); +} + +// Makes sure that the order of the tests and spaces around the names +// don't matter. +TEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) { + const char* tests = "A,C, B"; + EXPECT_EQ(tests, + state_.VerifyRegisteredTestNames("foo.cc", 1, tests)); +} + +typedef TypedTestCasePStateTest TypedTestCasePStateDeathTest; + +TEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) { + EXPECT_DEATH_IF_SUPPORTED( + state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"), + "foo\\.cc.1.?: Test A is listed more than once\\."); +} + +TEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) { + EXPECT_DEATH_IF_SUPPORTED( + state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"), + "foo\\.cc.1.?: No test named D can be found in this test case\\."); +} + +TEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) { + EXPECT_DEATH_IF_SUPPORTED( + state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"), + "foo\\.cc.1.?: You forgot to list test B\\."); +} + +// Tests that defining a test for a parameterized test case generates +// a run-time error if the test case has been registered. +TEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) { + state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C"); + EXPECT_DEATH_IF_SUPPORTED( + state_.AddTestName("foo.cc", 2, "FooTest", "D"), + "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P" + "\\(FooTest, \\.\\.\\.\\)\\."); +} + +// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor, +// and SetUp()/TearDown() work correctly in type-parameterized tests. + +template +class DerivedTest : public CommonTest { +}; + +TYPED_TEST_CASE_P(DerivedTest); + +TYPED_TEST_P(DerivedTest, ValuesAreCorrect) { + // Static members of the fixture class template can be visited via + // the TestFixture:: prefix. + EXPECT_EQ(5, *TestFixture::shared_); + + // Non-static members of the fixture class must be visited via + // 'this', as required by C++ for class templates. + EXPECT_EQ(2, this->value_); +} + +// The second test makes sure shared_ is not deleted after the first +// test. +TYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) { + // Static members of the fixture class template can also be visited + // via 'this'. + ASSERT_TRUE(this->shared_ != NULL); + EXPECT_EQ(5, *this->shared_); + EXPECT_EQ(2, this->value_); +} + +REGISTER_TYPED_TEST_CASE_P(DerivedTest, + ValuesAreCorrect, ValuesAreStillCorrect); + +typedef Types MyTwoTypes; +INSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes); + +// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same +// translation unit. + +template +class TypedTestP1 : public Test { +}; + +TYPED_TEST_CASE_P(TypedTestP1); + +// For testing that the code between TYPED_TEST_CASE_P() and +// TYPED_TEST_P() is not enclosed in a namespace. +typedef int IntAfterTypedTestCaseP; + +TYPED_TEST_P(TypedTestP1, A) {} +TYPED_TEST_P(TypedTestP1, B) {} + +// For testing that the code between TYPED_TEST_P() and +// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. +typedef int IntBeforeRegisterTypedTestCaseP; + +REGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B); + +template +class TypedTestP2 : public Test { +}; + +TYPED_TEST_CASE_P(TypedTestP2); + +// This also verifies that tests from different type-parameterized +// test cases can share the same name. +TYPED_TEST_P(TypedTestP2, A) {} + +REGISTER_TYPED_TEST_CASE_P(TypedTestP2, A); + +// Verifies that the code between TYPED_TEST_CASE_P() and +// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace. +IntAfterTypedTestCaseP after = 0; +IntBeforeRegisterTypedTestCaseP before = 0; + +// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P() +// can be either a single type or a Types<...> type list. +INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int); +INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types); + +// Tests that the same type-parameterized test case can be +// instantiated more than once in the same translation unit. +INSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types); + +// Tests that the same type-parameterized test case can be +// instantiated in different translation units linked together. +// (ContainerTest is also instantiated in gtest-typed-test_test.cc.) +typedef Types, std::set > MyContainers; +INSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers); + +// Tests that a type-parameterized test case can be defined and +// instantiated in a namespace. + +namespace library2 { + +template +class NumericTest : public Test { +}; + +TYPED_TEST_CASE_P(NumericTest); + +TYPED_TEST_P(NumericTest, DefaultIsZero) { + EXPECT_EQ(0, TypeParam()); +} + +TYPED_TEST_P(NumericTest, ZeroIsLessThanOne) { + EXPECT_LT(TypeParam(0), TypeParam(1)); +} + +REGISTER_TYPED_TEST_CASE_P(NumericTest, + DefaultIsZero, ZeroIsLessThanOne); +typedef Types NumericTypes; +INSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes); + +} // namespace library2 + +#endif // GTEST_HAS_TYPED_TEST_P + +#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) + +// Google Test may not support type-parameterized tests with some +// compilers. If we use conditional compilation to compile out all +// code referring to the gtest_main library, MSVC linker will not link +// that library at all and consequently complain about missing entry +// point defined in that library (fatal error LNK1561: entry point +// must be defined). This dummy test keeps gtest_main linked in. +TEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {} + +#endif // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h new file mode 100644 index 000000000..40dfeac6e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h @@ -0,0 +1,66 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_ +#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_ + +#include + +#if GTEST_HAS_TYPED_TEST_P + +using testing::Test; + +// For testing that the same type-parameterized test case can be +// instantiated in different translation units linked together. +// ContainerTest will be instantiated in both gtest-typed-test_test.cc +// and gtest-typed-test2_test.cc. + +template +class ContainerTest : public Test { +}; + +TYPED_TEST_CASE_P(ContainerTest); + +TYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) { + TypeParam container; +} + +TYPED_TEST_P(ContainerTest, InitialSizeIsZero) { + TypeParam container; + EXPECT_EQ(0U, container.size()); +} + +REGISTER_TYPED_TEST_CASE_P(ContainerTest, + CanBeDefaultConstructed, InitialSizeIsZero); + +#endif // GTEST_HAS_TYPED_TEST_P + +#endif // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc new file mode 100644 index 000000000..7e0f8f804 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc @@ -0,0 +1,343 @@ +// Copyright 2009 Google Inc. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: vladl@google.com (Vlad Losev) +// +// The Google C++ Testing Framework (Google Test) +// +// This file contains tests verifying correctness of data provided via +// UnitTest's public methods. + +#include + +#include // For strcmp. +#include + +using ::testing::InitGoogleTest; + +namespace testing { +namespace internal { + +template +struct LessByName { + bool operator()(const T* a, const T* b) { + return strcmp(a->name(), b->name()) < 0; + } +}; + +class UnitTestHelper { + public: + // Returns the array of pointers to all test cases sorted by the test case + // name. The caller is responsible for deleting the array. + static TestCase const** const GetSortedTestCases() { + UnitTest& unit_test = *UnitTest::GetInstance(); + TestCase const** const test_cases = + new const TestCase*[unit_test.total_test_case_count()]; + + for (int i = 0; i < unit_test.total_test_case_count(); ++i) + test_cases[i] = unit_test.GetTestCase(i); + + std::sort(test_cases, + test_cases + unit_test.total_test_case_count(), + LessByName()); + return test_cases; + } + + // Returns the test case by its name. The caller doesn't own the returned + // pointer. + static const TestCase* FindTestCase(const char* name) { + UnitTest& unit_test = *UnitTest::GetInstance(); + for (int i = 0; i < unit_test.total_test_case_count(); ++i) { + const TestCase* test_case = unit_test.GetTestCase(i); + if (0 == strcmp(test_case->name(), name)) + return test_case; + } + return NULL; + } + + // Returns the array of pointers to all tests in a particular test case + // sorted by the test name. The caller is responsible for deleting the + // array. + static TestInfo const** const GetSortedTests(const TestCase* test_case) { + TestInfo const** const tests = + new const TestInfo*[test_case->total_test_count()]; + + for (int i = 0; i < test_case->total_test_count(); ++i) + tests[i] = test_case->GetTestInfo(i); + + std::sort(tests, tests + test_case->total_test_count(), + LessByName()); + return tests; + } +}; + +#if GTEST_HAS_TYPED_TEST +template class TestCaseWithCommentTest : public Test {}; +TYPED_TEST_CASE(TestCaseWithCommentTest, Types); +TYPED_TEST(TestCaseWithCommentTest, Dummy) {} + +const int kTypedTestCases = 1; +const int kTypedTests = 1; + +String GetExpectedTestCaseComment() { + Message comment; + comment << "TypeParam = " << GetTypeName().c_str(); + return comment.GetString(); +} +#else +const int kTypedTestCases = 0; +const int kTypedTests = 0; +#endif // GTEST_HAS_TYPED_TEST + +// We can only test the accessors that do not change value while tests run. +// Since tests can be run in any order, the values the accessors that track +// test execution (such as failed_test_count) can not be predicted. +TEST(ApiTest, UnitTestImmutableAccessorsWork) { + UnitTest* unit_test = UnitTest::GetInstance(); + + ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count()); + EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count()); + EXPECT_EQ(2, unit_test->disabled_test_count()); + EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count()); + EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count()); + + const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases(); + + EXPECT_STREQ("ApiTest", test_cases[0]->name()); + EXPECT_STREQ("DISABLED_Test", test_cases[1]->name()); +#if GTEST_HAS_TYPED_TEST + EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name()); +#endif // GTEST_HAS_TYPED_TEST + + delete[] test_cases; + + // The following lines initiate actions to verify certain methods in + // FinalSuccessChecker::TearDown. + + // Records a test property to verify TestResult::GetTestProperty(). + RecordProperty("key", "value"); +} + +TEST(ApiTest, TestCaseImmutableAccessorsWork) { + const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest"); + ASSERT_TRUE(test_case != NULL); + + EXPECT_STREQ("ApiTest", test_case->name()); + EXPECT_STREQ("", test_case->comment()); + EXPECT_TRUE(test_case->should_run()); + EXPECT_EQ(1, test_case->disabled_test_count()); + EXPECT_EQ(3, test_case->test_to_run_count()); + ASSERT_EQ(4, test_case->total_test_count()); + + const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case); + + EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name()); + EXPECT_STREQ("ApiTest", tests[0]->test_case_name()); + EXPECT_STREQ("", tests[0]->comment()); + EXPECT_STREQ("", tests[0]->test_case_comment()); + EXPECT_FALSE(tests[0]->should_run()); + + EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name()); + EXPECT_STREQ("ApiTest", tests[1]->test_case_name()); + EXPECT_STREQ("", tests[1]->comment()); + EXPECT_STREQ("", tests[1]->test_case_comment()); + EXPECT_TRUE(tests[1]->should_run()); + + EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name()); + EXPECT_STREQ("ApiTest", tests[2]->test_case_name()); + EXPECT_STREQ("", tests[2]->comment()); + EXPECT_STREQ("", tests[2]->test_case_comment()); + EXPECT_TRUE(tests[2]->should_run()); + + EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name()); + EXPECT_STREQ("ApiTest", tests[3]->test_case_name()); + EXPECT_STREQ("", tests[3]->comment()); + EXPECT_STREQ("", tests[3]->test_case_comment()); + EXPECT_TRUE(tests[3]->should_run()); + + delete[] tests; + tests = NULL; + +#if GTEST_HAS_TYPED_TEST + test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0"); + ASSERT_TRUE(test_case != NULL); + + EXPECT_STREQ("TestCaseWithCommentTest/0", test_case->name()); + EXPECT_STREQ(GetExpectedTestCaseComment().c_str(), test_case->comment()); + EXPECT_TRUE(test_case->should_run()); + EXPECT_EQ(0, test_case->disabled_test_count()); + EXPECT_EQ(1, test_case->test_to_run_count()); + ASSERT_EQ(1, test_case->total_test_count()); + + tests = UnitTestHelper::GetSortedTests(test_case); + + EXPECT_STREQ("Dummy", tests[0]->name()); + EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name()); + EXPECT_STREQ("", tests[0]->comment()); + EXPECT_STREQ(GetExpectedTestCaseComment().c_str(), + tests[0]->test_case_comment()); + EXPECT_TRUE(tests[0]->should_run()); + + delete[] tests; +#endif // GTEST_HAS_TYPED_TEST +} + +TEST(ApiTest, TestCaseDisabledAccessorsWork) { + const TestCase* test_case = UnitTestHelper::FindTestCase("DISABLED_Test"); + ASSERT_TRUE(test_case != NULL); + + EXPECT_STREQ("DISABLED_Test", test_case->name()); + EXPECT_STREQ("", test_case->comment()); + EXPECT_FALSE(test_case->should_run()); + EXPECT_EQ(1, test_case->disabled_test_count()); + EXPECT_EQ(0, test_case->test_to_run_count()); + ASSERT_EQ(1, test_case->total_test_count()); + + const TestInfo* const test_info = test_case->GetTestInfo(0); + EXPECT_STREQ("Dummy2", test_info->name()); + EXPECT_STREQ("DISABLED_Test", test_info->test_case_name()); + EXPECT_STREQ("", test_info->comment()); + EXPECT_STREQ("", test_info->test_case_comment()); + EXPECT_FALSE(test_info->should_run()); +} + +// These two tests are here to provide support for testing +// test_case_to_run_count, disabled_test_count, and test_to_run_count. +TEST(ApiTest, DISABLED_Dummy1) {} +TEST(DISABLED_Test, Dummy2) {} + +class FinalSuccessChecker : public Environment { + protected: + virtual void TearDown() { + UnitTest* unit_test = UnitTest::GetInstance(); + + EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count()); + EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count()); + EXPECT_EQ(0, unit_test->failed_test_case_count()); + EXPECT_EQ(0, unit_test->failed_test_count()); + EXPECT_TRUE(unit_test->Passed()); + EXPECT_FALSE(unit_test->Failed()); + ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count()); + + const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases(); + + EXPECT_STREQ("ApiTest", test_cases[0]->name()); + EXPECT_STREQ("", test_cases[0]->comment()); + EXPECT_TRUE(test_cases[0]->should_run()); + EXPECT_EQ(1, test_cases[0]->disabled_test_count()); + ASSERT_EQ(4, test_cases[0]->total_test_count()); + EXPECT_EQ(3, test_cases[0]->successful_test_count()); + EXPECT_EQ(0, test_cases[0]->failed_test_count()); + EXPECT_TRUE(test_cases[0]->Passed()); + EXPECT_FALSE(test_cases[0]->Failed()); + + EXPECT_STREQ("DISABLED_Test", test_cases[1]->name()); + EXPECT_STREQ("", test_cases[1]->comment()); + EXPECT_FALSE(test_cases[1]->should_run()); + EXPECT_EQ(1, test_cases[1]->disabled_test_count()); + ASSERT_EQ(1, test_cases[1]->total_test_count()); + EXPECT_EQ(0, test_cases[1]->successful_test_count()); + EXPECT_EQ(0, test_cases[1]->failed_test_count()); + +#if GTEST_HAS_TYPED_TEST + EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name()); + EXPECT_STREQ(GetExpectedTestCaseComment().c_str(), + test_cases[2]->comment()); + EXPECT_TRUE(test_cases[2]->should_run()); + EXPECT_EQ(0, test_cases[2]->disabled_test_count()); + ASSERT_EQ(1, test_cases[2]->total_test_count()); + EXPECT_EQ(1, test_cases[2]->successful_test_count()); + EXPECT_EQ(0, test_cases[2]->failed_test_count()); + EXPECT_TRUE(test_cases[2]->Passed()); + EXPECT_FALSE(test_cases[2]->Failed()); +#endif // GTEST_HAS_TYPED_TEST + + const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest"); + const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case); + EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name()); + EXPECT_STREQ("ApiTest", tests[0]->test_case_name()); + EXPECT_FALSE(tests[0]->should_run()); + + EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name()); + EXPECT_STREQ("ApiTest", tests[1]->test_case_name()); + EXPECT_STREQ("", tests[1]->comment()); + EXPECT_STREQ("", tests[1]->test_case_comment()); + EXPECT_TRUE(tests[1]->should_run()); + EXPECT_TRUE(tests[1]->result()->Passed()); + EXPECT_EQ(0, tests[1]->result()->test_property_count()); + + EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name()); + EXPECT_STREQ("ApiTest", tests[2]->test_case_name()); + EXPECT_STREQ("", tests[2]->comment()); + EXPECT_STREQ("", tests[2]->test_case_comment()); + EXPECT_TRUE(tests[2]->should_run()); + EXPECT_TRUE(tests[2]->result()->Passed()); + EXPECT_EQ(0, tests[2]->result()->test_property_count()); + + EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name()); + EXPECT_STREQ("ApiTest", tests[3]->test_case_name()); + EXPECT_STREQ("", tests[3]->comment()); + EXPECT_STREQ("", tests[3]->test_case_comment()); + EXPECT_TRUE(tests[3]->should_run()); + EXPECT_TRUE(tests[3]->result()->Passed()); + EXPECT_EQ(1, tests[3]->result()->test_property_count()); + const TestProperty& property = tests[3]->result()->GetTestProperty(0); + EXPECT_STREQ("key", property.key()); + EXPECT_STREQ("value", property.value()); + + delete[] tests; + +#if GTEST_HAS_TYPED_TEST + test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0"); + tests = UnitTestHelper::GetSortedTests(test_case); + + EXPECT_STREQ("Dummy", tests[0]->name()); + EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name()); + EXPECT_STREQ("", tests[0]->comment()); + EXPECT_STREQ(GetExpectedTestCaseComment().c_str(), + tests[0]->test_case_comment()); + EXPECT_TRUE(tests[0]->should_run()); + EXPECT_TRUE(tests[0]->result()->Passed()); + EXPECT_EQ(0, tests[0]->result()->test_property_count()); + + delete[] tests; +#endif // GTEST_HAS_TYPED_TEST + delete[] test_cases; + } +}; + +} // namespace internal +} // namespace testing + +int main(int argc, char **argv) { + InitGoogleTest(&argc, argv); + + AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker()); + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc new file mode 100644 index 000000000..e1edb08e3 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc @@ -0,0 +1,48 @@ +// Copyright 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Tests for Google C++ Testing Framework (Google Test) +// +// Sometimes it's desirable to build most of Google Test's own tests +// by compiling a single file. This file serves this purpose. +#include "test/gtest-filepath_test.cc" +#include "test/gtest-linked_ptr_test.cc" +#include "test/gtest-message_test.cc" +#include "test/gtest-options_test.cc" +#include "test/gtest-port_test.cc" +#include "test/gtest_pred_impl_unittest.cc" +#include "test/gtest_prod_test.cc" +#include "test/gtest-test-part_test.cc" +#include "test/gtest-typed-test_test.cc" +#include "test/gtest-typed-test2_test.cc" +#include "test/gtest_unittest.cc" +#include "test/production.cc" +#include "src/gtest_main.cc" diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py new file mode 100755 index 000000000..c81918331 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python +# +# Copyright 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test for Google Test's break-on-failure mode. + +A user can ask Google Test to seg-fault when an assertion fails, using +either the GTEST_BREAK_ON_FAILURE environment variable or the +--gtest_break_on_failure flag. This script tests such functionality +by invoking gtest_break_on_failure_unittest_ (a program written with +Google Test) with different environments and command line flags. +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import gtest_test_utils +import os +import sys + + +# Constants. + +IS_WINDOWS = os.name == 'nt' + +# The environment variable for enabling/disabling the break-on-failure mode. +BREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE' + +# The command line flag for enabling/disabling the break-on-failure mode. +BREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure' + +# The environment variable for enabling/disabling the throw-on-failure mode. +THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE' + +# The environment variable for enabling/disabling the catch-exceptions mode. +CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS' + +# Path to the gtest_break_on_failure_unittest_ program. +EXE_PATH = gtest_test_utils.GetTestExecutablePath( + 'gtest_break_on_failure_unittest_') + + +# Utilities. + + +environ = os.environ.copy() + + +def SetEnvVar(env_var, value): + """Sets an environment variable to a given value; unsets it when the + given value is None. + """ + + if value is not None: + environ[env_var] = value + elif env_var in environ: + del environ[env_var] + + +def Run(command): + """Runs a command; returns 1 if it was killed by a signal, or 0 otherwise.""" + + p = gtest_test_utils.Subprocess(command, env=environ) + if p.terminated_by_signal: + return 1 + else: + return 0 + + +# The tests. + + +class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase): + """Tests using the GTEST_BREAK_ON_FAILURE environment variable or + the --gtest_break_on_failure flag to turn assertion failures into + segmentation faults. + """ + + def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault): + """Runs gtest_break_on_failure_unittest_ and verifies that it does + (or does not) have a seg-fault. + + Args: + env_var_value: value of the GTEST_BREAK_ON_FAILURE environment + variable; None if the variable should be unset. + flag_value: value of the --gtest_break_on_failure flag; + None if the flag should not be present. + expect_seg_fault: 1 if the program is expected to generate a seg-fault; + 0 otherwise. + """ + + SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value) + + if env_var_value is None: + env_var_value_msg = ' is not set' + else: + env_var_value_msg = '=' + env_var_value + + if flag_value is None: + flag = '' + elif flag_value == '0': + flag = '--%s=0' % BREAK_ON_FAILURE_FLAG + else: + flag = '--%s' % BREAK_ON_FAILURE_FLAG + + command = [EXE_PATH] + if flag: + command.append(flag) + + if expect_seg_fault: + should_or_not = 'should' + else: + should_or_not = 'should not' + + has_seg_fault = Run(command) + + SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None) + + msg = ('when %s%s, an assertion failure in "%s" %s cause a seg-fault.' % + (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command), + should_or_not)) + self.assert_(has_seg_fault == expect_seg_fault, msg) + + def testDefaultBehavior(self): + """Tests the behavior of the default mode.""" + + self.RunAndVerify(env_var_value=None, + flag_value=None, + expect_seg_fault=0) + + def testEnvVar(self): + """Tests using the GTEST_BREAK_ON_FAILURE environment variable.""" + + self.RunAndVerify(env_var_value='0', + flag_value=None, + expect_seg_fault=0) + self.RunAndVerify(env_var_value='1', + flag_value=None, + expect_seg_fault=1) + + def testFlag(self): + """Tests using the --gtest_break_on_failure flag.""" + + self.RunAndVerify(env_var_value=None, + flag_value='0', + expect_seg_fault=0) + self.RunAndVerify(env_var_value=None, + flag_value='1', + expect_seg_fault=1) + + def testFlagOverridesEnvVar(self): + """Tests that the flag overrides the environment variable.""" + + self.RunAndVerify(env_var_value='0', + flag_value='0', + expect_seg_fault=0) + self.RunAndVerify(env_var_value='0', + flag_value='1', + expect_seg_fault=1) + self.RunAndVerify(env_var_value='1', + flag_value='0', + expect_seg_fault=0) + self.RunAndVerify(env_var_value='1', + flag_value='1', + expect_seg_fault=1) + + def testBreakOnFailureOverridesThrowOnFailure(self): + """Tests that gtest_break_on_failure overrides gtest_throw_on_failure.""" + + SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1') + try: + self.RunAndVerify(env_var_value=None, + flag_value='1', + expect_seg_fault=1) + finally: + SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None) + + if IS_WINDOWS: + def testCatchExceptionsDoesNotInterfere(self): + """Tests that gtest_catch_exceptions doesn't interfere.""" + + SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1') + try: + self.RunAndVerify(env_var_value='1', + flag_value='1', + expect_seg_fault=1) + finally: + SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None) + + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc new file mode 100644 index 000000000..d28d1d3da --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc @@ -0,0 +1,86 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Unit test for Google Test's break-on-failure mode. +// +// A user can ask Google Test to seg-fault when an assertion fails, using +// either the GTEST_BREAK_ON_FAILURE environment variable or the +// --gtest_break_on_failure flag. This file is used for testing such +// functionality. +// +// This program will be invoked from a Python unit test. It is +// expected to fail. Don't run it directly. + +#include + +#if GTEST_OS_WINDOWS +#include +#include +#endif + +namespace { + +// A test that's expected to fail. +TEST(Foo, Bar) { + EXPECT_EQ(2, 3); +} + +#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE +// On Windows Mobile global exception handlers are not supported. +LONG WINAPI ExitWithExceptionCode( + struct _EXCEPTION_POINTERS* exception_pointers) { + exit(exception_pointers->ExceptionRecord->ExceptionCode); +} +#endif + +} // namespace + +int main(int argc, char **argv) { +#if GTEST_OS_WINDOWS + // Suppresses display of the Windows error dialog upon encountering + // a general protection fault (segment violation). + SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS); + +#if !GTEST_OS_WINDOWS_MOBILE + // The default unhandled exception filter does not always exit + // with the exception code as exit code - for example it exits with + // 0 for EXCEPTION_ACCESS_VIOLATION and 1 for EXCEPTION_BREAKPOINT + // if the application is compiled in debug mode. Thus we use our own + // filter which always exits with the exception code for unhandled + // exceptions. + SetUnhandledExceptionFilter(ExitWithExceptionCode); +#endif +#endif + + testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py new file mode 100755 index 000000000..d02a53ed8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Verifies that Google Test correctly determines whether to use colors.""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import gtest_test_utils + + +IS_WINDOWS = os.name = 'nt' + +COLOR_ENV_VAR = 'GTEST_COLOR' +COLOR_FLAG = 'gtest_color' +COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_color_test_') + + +def SetEnvVar(env_var, value): + """Sets the env variable to 'value'; unsets it when 'value' is None.""" + + if value is not None: + os.environ[env_var] = value + elif env_var in os.environ: + del os.environ[env_var] + + +def UsesColor(term, color_env_var, color_flag): + """Runs gtest_color_test_ and returns its exit code.""" + + SetEnvVar('TERM', term) + SetEnvVar(COLOR_ENV_VAR, color_env_var) + + if color_flag is None: + args = [] + else: + args = ['--%s=%s' % (COLOR_FLAG, color_flag)] + p = gtest_test_utils.Subprocess([COMMAND] + args) + return not p.exited or p.exit_code + + +class GTestColorTest(gtest_test_utils.TestCase): + def testNoEnvVarNoFlag(self): + """Tests the case when there's neither GTEST_COLOR nor --gtest_color.""" + + if not IS_WINDOWS: + self.assert_(not UsesColor('dumb', None, None)) + self.assert_(not UsesColor('emacs', None, None)) + self.assert_(not UsesColor('xterm-mono', None, None)) + self.assert_(not UsesColor('unknown', None, None)) + self.assert_(not UsesColor(None, None, None)) + self.assert_(UsesColor('linux', None, None)) + self.assert_(UsesColor('cygwin', None, None)) + self.assert_(UsesColor('xterm', None, None)) + self.assert_(UsesColor('xterm-color', None, None)) + self.assert_(UsesColor('xterm-256color', None, None)) + + def testFlagOnly(self): + """Tests the case when there's --gtest_color but not GTEST_COLOR.""" + + self.assert_(not UsesColor('dumb', None, 'no')) + self.assert_(not UsesColor('xterm-color', None, 'no')) + if not IS_WINDOWS: + self.assert_(not UsesColor('emacs', None, 'auto')) + self.assert_(UsesColor('xterm', None, 'auto')) + self.assert_(UsesColor('dumb', None, 'yes')) + self.assert_(UsesColor('xterm', None, 'yes')) + + def testEnvVarOnly(self): + """Tests the case when there's GTEST_COLOR but not --gtest_color.""" + + self.assert_(not UsesColor('dumb', 'no', None)) + self.assert_(not UsesColor('xterm-color', 'no', None)) + if not IS_WINDOWS: + self.assert_(not UsesColor('dumb', 'auto', None)) + self.assert_(UsesColor('xterm-color', 'auto', None)) + self.assert_(UsesColor('dumb', 'yes', None)) + self.assert_(UsesColor('xterm-color', 'yes', None)) + + def testEnvVarAndFlag(self): + """Tests the case when there are both GTEST_COLOR and --gtest_color.""" + + self.assert_(not UsesColor('xterm-color', 'no', 'no')) + self.assert_(UsesColor('dumb', 'no', 'yes')) + self.assert_(UsesColor('xterm-color', 'no', 'auto')) + + def testAliasesOfYesAndNo(self): + """Tests using aliases in specifying --gtest_color.""" + + self.assert_(UsesColor('dumb', None, 'true')) + self.assert_(UsesColor('dumb', None, 'YES')) + self.assert_(UsesColor('dumb', None, 'T')) + self.assert_(UsesColor('dumb', None, '1')) + + self.assert_(not UsesColor('xterm', None, 'f')) + self.assert_(not UsesColor('xterm', None, 'false')) + self.assert_(not UsesColor('xterm', None, '0')) + self.assert_(not UsesColor('xterm', None, 'unknown')) + + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc new file mode 100644 index 000000000..58d377c9b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc @@ -0,0 +1,71 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// A helper program for testing how Google Test determines whether to use +// colors in the output. It prints "YES" and returns 1 if Google Test +// decides to use colors, and prints "NO" and returns 0 otherwise. + +#include + +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +using testing::internal::ShouldUseColor; + +// The purpose of this is to ensure that the UnitTest singleton is +// created before main() is entered, and thus that ShouldUseColor() +// works the same way as in a real Google-Test-based test. We don't actual +// run the TEST itself. +TEST(GTestColorTest, Dummy) { +} + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + + if (ShouldUseColor(true)) { + // Google Test decides to use colors in the output (assuming it + // goes to a TTY). + printf("YES\n"); + return 1; + } else { + // Google Test decides not to use colors in the output. + printf("NO\n"); + return 0; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py new file mode 100755 index 000000000..bcc0bfd55 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Verifies that Google Test correctly parses environment variables.""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import gtest_test_utils + + +IS_WINDOWS = os.name == 'nt' +IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux' + +COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_env_var_test_') + +environ = os.environ.copy() + + +def AssertEq(expected, actual): + if expected != actual: + print 'Expected: %s' % (expected,) + print ' Actual: %s' % (actual,) + raise AssertionError + + +def SetEnvVar(env_var, value): + """Sets the env variable to 'value'; unsets it when 'value' is None.""" + + if value is not None: + environ[env_var] = value + elif env_var in environ: + del environ[env_var] + + +def GetFlag(flag): + """Runs gtest_env_var_test_ and returns its output.""" + + args = [COMMAND] + if flag is not None: + args += [flag] + return gtest_test_utils.Subprocess(args, env=environ).output + + +def TestFlag(flag, test_val, default_val): + """Verifies that the given flag is affected by the corresponding env var.""" + + env_var = 'GTEST_' + flag.upper() + SetEnvVar(env_var, test_val) + AssertEq(test_val, GetFlag(flag)) + SetEnvVar(env_var, None) + AssertEq(default_val, GetFlag(flag)) + + +class GTestEnvVarTest(gtest_test_utils.TestCase): + def testEnvVarAffectsFlag(self): + """Tests that environment variable should affect the corresponding flag.""" + + TestFlag('break_on_failure', '1', '0') + TestFlag('color', 'yes', 'auto') + TestFlag('filter', 'FooTest.Bar', '*') + TestFlag('output', 'xml:tmp/foo.xml', '') + TestFlag('print_time', '0', '1') + TestFlag('repeat', '999', '1') + TestFlag('throw_on_failure', '1', '0') + TestFlag('death_test_style', 'threadsafe', 'fast') + + if IS_WINDOWS: + TestFlag('catch_exceptions', '1', '0') + + if IS_LINUX: + TestFlag('death_test_use_fork', '1', '0') + TestFlag('stack_trace_depth', '0', '100') + + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc new file mode 100644 index 000000000..f7c78fcf3 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc @@ -0,0 +1,126 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// A helper program for testing that Google Test parses the environment +// variables correctly. + +#include + +#include + +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +using ::std::cout; + +namespace testing { + +// The purpose of this is to make the test more realistic by ensuring +// that the UnitTest singleton is created before main() is entered. +// We don't actual run the TEST itself. +TEST(GTestEnvVarTest, Dummy) { +} + +void PrintFlag(const char* flag) { + if (strcmp(flag, "break_on_failure") == 0) { + cout << GTEST_FLAG(break_on_failure); + return; + } + + if (strcmp(flag, "catch_exceptions") == 0) { + cout << GTEST_FLAG(catch_exceptions); + return; + } + + if (strcmp(flag, "color") == 0) { + cout << GTEST_FLAG(color); + return; + } + + if (strcmp(flag, "death_test_style") == 0) { + cout << GTEST_FLAG(death_test_style); + return; + } + + if (strcmp(flag, "death_test_use_fork") == 0) { + cout << GTEST_FLAG(death_test_use_fork); + return; + } + + if (strcmp(flag, "filter") == 0) { + cout << GTEST_FLAG(filter); + return; + } + + if (strcmp(flag, "output") == 0) { + cout << GTEST_FLAG(output); + return; + } + + if (strcmp(flag, "print_time") == 0) { + cout << GTEST_FLAG(print_time); + return; + } + + if (strcmp(flag, "repeat") == 0) { + cout << GTEST_FLAG(repeat); + return; + } + + if (strcmp(flag, "stack_trace_depth") == 0) { + cout << GTEST_FLAG(stack_trace_depth); + return; + } + + if (strcmp(flag, "throw_on_failure") == 0) { + cout << GTEST_FLAG(throw_on_failure); + return; + } + + cout << "Invalid flag name " << flag + << ". Valid names are break_on_failure, color, filter, etc.\n"; + exit(1); +} + +} // namespace testing + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + + if (argc != 2) { + cout << "Usage: gtest_env_var_test_ NAME_OF_FLAG\n"; + return 1; + } + + testing::PrintFlag(argv[1]); + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc new file mode 100644 index 000000000..c9392614d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc @@ -0,0 +1,186 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Tests using global test environments. + +#include +#include +#include + +namespace testing { +GTEST_DECLARE_string_(filter); +} + +namespace { + +enum FailureType { + NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE +}; + +// For testing using global test environments. +class MyEnvironment : public testing::Environment { + public: + MyEnvironment() { Reset(); } + + // Depending on the value of failure_in_set_up_, SetUp() will + // generate a non-fatal failure, generate a fatal failure, or + // succeed. + virtual void SetUp() { + set_up_was_run_ = true; + + switch (failure_in_set_up_) { + case NON_FATAL_FAILURE: + ADD_FAILURE() << "Expected non-fatal failure in global set-up."; + break; + case FATAL_FAILURE: + FAIL() << "Expected fatal failure in global set-up."; + break; + default: + break; + } + } + + // Generates a non-fatal failure. + virtual void TearDown() { + tear_down_was_run_ = true; + ADD_FAILURE() << "Expected non-fatal failure in global tear-down."; + } + + // Resets the state of the environment s.t. it can be reused. + void Reset() { + failure_in_set_up_ = NO_FAILURE; + set_up_was_run_ = false; + tear_down_was_run_ = false; + } + + // We call this function to set the type of failure SetUp() should + // generate. + void set_failure_in_set_up(FailureType type) { + failure_in_set_up_ = type; + } + + // Was SetUp() run? + bool set_up_was_run() const { return set_up_was_run_; } + + // Was TearDown() run? + bool tear_down_was_run() const { return tear_down_was_run_; } + private: + FailureType failure_in_set_up_; + bool set_up_was_run_; + bool tear_down_was_run_; +}; + +// Was the TEST run? +bool test_was_run; + +// The sole purpose of this TEST is to enable us to check whether it +// was run. +TEST(FooTest, Bar) { + test_was_run = true; +} + +// Prints the message and aborts the program if condition is false. +void Check(bool condition, const char* msg) { + if (!condition) { + printf("FAILED: %s\n", msg); + abort(); + } +} + +// Runs the tests. Return true iff successful. +// +// The 'failure' parameter specifies the type of failure that should +// be generated by the global set-up. +int RunAllTests(MyEnvironment* env, FailureType failure) { + env->Reset(); + env->set_failure_in_set_up(failure); + test_was_run = false; + return RUN_ALL_TESTS(); +} + +} // namespace + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + + // Registers a global test environment, and verifies that the + // registration function returns its argument. + MyEnvironment* const env = new MyEnvironment; + Check(testing::AddGlobalTestEnvironment(env) == env, + "AddGlobalTestEnvironment() should return its argument."); + + // Verifies that RUN_ALL_TESTS() runs the tests when the global + // set-up is successful. + Check(RunAllTests(env, NO_FAILURE) != 0, + "RUN_ALL_TESTS() should return non-zero, as the global tear-down " + "should generate a failure."); + Check(test_was_run, + "The tests should run, as the global set-up should generate no " + "failure"); + Check(env->tear_down_was_run(), + "The global tear-down should run, as the global set-up was run."); + + // Verifies that RUN_ALL_TESTS() runs the tests when the global + // set-up generates no fatal failure. + Check(RunAllTests(env, NON_FATAL_FAILURE) != 0, + "RUN_ALL_TESTS() should return non-zero, as both the global set-up " + "and the global tear-down should generate a non-fatal failure."); + Check(test_was_run, + "The tests should run, as the global set-up should generate no " + "fatal failure."); + Check(env->tear_down_was_run(), + "The global tear-down should run, as the global set-up was run."); + + // Verifies that RUN_ALL_TESTS() runs no test when the global set-up + // generates a fatal failure. + Check(RunAllTests(env, FATAL_FAILURE) != 0, + "RUN_ALL_TESTS() should return non-zero, as the global set-up " + "should generate a fatal failure."); + Check(!test_was_run, + "The tests should not run, as the global set-up should generate " + "a fatal failure."); + Check(env->tear_down_was_run(), + "The global tear-down should run, as the global set-up was run."); + + // Verifies that RUN_ALL_TESTS() doesn't do global set-up or + // tear-down when there is no test to run. + testing::GTEST_FLAG(filter) = "-*"; + Check(RunAllTests(env, NO_FAILURE) == 0, + "RUN_ALL_TESTS() should return zero, as there is no test to run."); + Check(!env->set_up_was_run(), + "The global set-up should not run, as there is no test to run."); + Check(!env->tear_down_was_run(), + "The global tear-down should not run, " + "as the global set-up was not run."); + + printf("PASS\n"); + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py new file mode 100755 index 000000000..0d1a77005 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py @@ -0,0 +1,633 @@ +#!/usr/bin/env python +# +# Copyright 2005 Google Inc. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test for Google Test test filters. + +A user can specify which test(s) in a Google Test program to run via either +the GTEST_FILTER environment variable or the --gtest_filter flag. +This script tests such functionality by invoking +gtest_filter_unittest_ (a program written with Google Test) with different +environments and command line flags. + +Note that test sharding may also influence which tests are filtered. Therefore, +we test that here also. +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import re +import sets +import sys + +import gtest_test_utils + +# Constants. + +# Checks if this platform can pass empty environment variables to child +# processes. We set an env variable to an empty string and invoke a python +# script in a subprocess to print whether the variable is STILL in +# os.environ. We then use 'eval' to parse the child's output so that an +# exception is thrown if the input is anything other than 'True' nor 'False'. +os.environ['EMPTY_VAR'] = '' +child = gtest_test_utils.Subprocess( + [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ']) +CAN_PASS_EMPTY_ENV = eval(child.output) + + +# Check if this platform can unset environment variables in child processes. +# We set an env variable to a non-empty string, unset it, and invoke +# a python script in a subprocess to print whether the variable +# is NO LONGER in os.environ. +# We use 'eval' to parse the child's output so that an exception +# is thrown if the input is neither 'True' nor 'False'. +os.environ['UNSET_VAR'] = 'X' +del os.environ['UNSET_VAR'] +child = gtest_test_utils.Subprocess( + [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ']) +CAN_UNSET_ENV = eval(child.output) + + +# Checks if we should test with an empty filter. This doesn't +# make sense on platforms that cannot pass empty env variables (Win32) +# and on platforms that cannot unset variables (since we cannot tell +# the difference between "" and NULL -- Borland and Solaris < 5.10) +CAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV) + + +# The environment variable for specifying the test filters. +FILTER_ENV_VAR = 'GTEST_FILTER' + +# The environment variables for test sharding. +TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS' +SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX' +SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE' + +# The command line flag for specifying the test filters. +FILTER_FLAG = 'gtest_filter' + +# The command line flag for including disabled tests. +ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests' + +# Command to run the gtest_filter_unittest_ program. +COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_') + +# Regex for determining whether parameterized tests are enabled in the binary. +PARAM_TEST_REGEX = re.compile(r'/ParamTest') + +# Regex for parsing test case names from Google Test's output. +TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)') + +# Regex for parsing test names from Google Test's output. +TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)') + +# The command line flag to tell Google Test to output the list of tests it +# will run. +LIST_TESTS_FLAG = '--gtest_list_tests' + +# Indicates whether Google Test supports death tests. +SUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess( + [COMMAND, LIST_TESTS_FLAG]).output + +# Full names of all tests in gtest_filter_unittests_. +PARAM_TESTS = [ + 'SeqP/ParamTest.TestX/0', + 'SeqP/ParamTest.TestX/1', + 'SeqP/ParamTest.TestY/0', + 'SeqP/ParamTest.TestY/1', + 'SeqQ/ParamTest.TestX/0', + 'SeqQ/ParamTest.TestX/1', + 'SeqQ/ParamTest.TestY/0', + 'SeqQ/ParamTest.TestY/1', + ] + +DISABLED_TESTS = [ + 'BarTest.DISABLED_TestFour', + 'BarTest.DISABLED_TestFive', + 'BazTest.DISABLED_TestC', + 'DISABLED_FoobarTest.Test1', + 'DISABLED_FoobarTest.DISABLED_Test2', + 'DISABLED_FoobarbazTest.TestA', + ] + +if SUPPORTS_DEATH_TESTS: + DEATH_TESTS = [ + 'HasDeathTest.Test1', + 'HasDeathTest.Test2', + ] +else: + DEATH_TESTS = [] + +# All the non-disabled tests. +ACTIVE_TESTS = [ + 'FooTest.Abc', + 'FooTest.Xyz', + + 'BarTest.TestOne', + 'BarTest.TestTwo', + 'BarTest.TestThree', + + 'BazTest.TestOne', + 'BazTest.TestA', + 'BazTest.TestB', + ] + DEATH_TESTS + PARAM_TESTS + +param_tests_present = None + +# Utilities. + +environ = os.environ.copy() + + +def SetEnvVar(env_var, value): + """Sets the env variable to 'value'; unsets it when 'value' is None.""" + + if value is not None: + environ[env_var] = value + elif env_var in environ: + del environ[env_var] + + +def RunAndReturnOutput(args = None): + """Runs the test program and returns its output.""" + + return gtest_test_utils.Subprocess([COMMAND] + (args or []), + env=environ).output + + +def RunAndExtractTestList(args = None): + """Runs the test program and returns its exit code and a list of tests run.""" + + p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ) + tests_run = [] + test_case = '' + test = '' + for line in p.output.split('\n'): + match = TEST_CASE_REGEX.match(line) + if match is not None: + test_case = match.group(1) + else: + match = TEST_REGEX.match(line) + if match is not None: + test = match.group(1) + tests_run.append(test_case + '.' + test) + return (tests_run, p.exit_code) + + +def InvokeWithModifiedEnv(extra_env, function, *args, **kwargs): + """Runs the given function and arguments in a modified environment.""" + try: + original_env = environ.copy() + environ.update(extra_env) + return function(*args, **kwargs) + finally: + environ.clear() + environ.update(original_env) + + +def RunWithSharding(total_shards, shard_index, command): + """Runs a test program shard and returns exit code and a list of tests run.""" + + extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index), + TOTAL_SHARDS_ENV_VAR: str(total_shards)} + return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command) + +# The unit test. + + +class GTestFilterUnitTest(gtest_test_utils.TestCase): + """Tests the env variable or the command line flag to filter tests.""" + + # Utilities. + + def AssertSetEqual(self, lhs, rhs): + """Asserts that two sets are equal.""" + + for elem in lhs: + self.assert_(elem in rhs, '%s in %s' % (elem, rhs)) + + for elem in rhs: + self.assert_(elem in lhs, '%s in %s' % (elem, lhs)) + + def AssertPartitionIsValid(self, set_var, list_of_sets): + """Asserts that list_of_sets is a valid partition of set_var.""" + + full_partition = [] + for slice_var in list_of_sets: + full_partition.extend(slice_var) + self.assertEqual(len(set_var), len(full_partition)) + self.assertEqual(sets.Set(set_var), sets.Set(full_partition)) + + def AdjustForParameterizedTests(self, tests_to_run): + """Adjust tests_to_run in case value parameterized tests are disabled.""" + + global param_tests_present + if not param_tests_present: + return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS)) + else: + return tests_to_run + + def RunAndVerify(self, gtest_filter, tests_to_run): + """Checks that the binary runs correct set of tests for a given filter.""" + + tests_to_run = self.AdjustForParameterizedTests(tests_to_run) + + # First, tests using the environment variable. + + # Windows removes empty variables from the environment when passing it + # to a new process. This means it is impossible to pass an empty filter + # into a process using the environment variable. However, we can still + # test the case when the variable is not supplied (i.e., gtest_filter is + # None). + # pylint: disable-msg=C6403 + if CAN_TEST_EMPTY_FILTER or gtest_filter != '': + SetEnvVar(FILTER_ENV_VAR, gtest_filter) + tests_run = RunAndExtractTestList()[0] + SetEnvVar(FILTER_ENV_VAR, None) + self.AssertSetEqual(tests_run, tests_to_run) + # pylint: enable-msg=C6403 + + # Next, tests using the command line flag. + + if gtest_filter is None: + args = [] + else: + args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)] + + tests_run = RunAndExtractTestList(args)[0] + self.AssertSetEqual(tests_run, tests_to_run) + + def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run, + args=None, check_exit_0=False): + """Checks that binary runs correct tests for the given filter and shard. + + Runs all shards of gtest_filter_unittest_ with the given filter, and + verifies that the right set of tests were run. The union of tests run + on each shard should be identical to tests_to_run, without duplicates. + + Args: + gtest_filter: A filter to apply to the tests. + total_shards: A total number of shards to split test run into. + tests_to_run: A set of tests expected to run. + args : Arguments to pass to the to the test binary. + check_exit_0: When set to a true value, make sure that all shards + return 0. + """ + + tests_to_run = self.AdjustForParameterizedTests(tests_to_run) + + # Windows removes empty variables from the environment when passing it + # to a new process. This means it is impossible to pass an empty filter + # into a process using the environment variable. However, we can still + # test the case when the variable is not supplied (i.e., gtest_filter is + # None). + # pylint: disable-msg=C6403 + if CAN_TEST_EMPTY_FILTER or gtest_filter != '': + SetEnvVar(FILTER_ENV_VAR, gtest_filter) + partition = [] + for i in range(0, total_shards): + (tests_run, exit_code) = RunWithSharding(total_shards, i, args) + if check_exit_0: + self.assertEqual(0, exit_code) + partition.append(tests_run) + + self.AssertPartitionIsValid(tests_to_run, partition) + SetEnvVar(FILTER_ENV_VAR, None) + # pylint: enable-msg=C6403 + + def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run): + """Checks that the binary runs correct set of tests for the given filter. + + Runs gtest_filter_unittest_ with the given filter, and enables + disabled tests. Verifies that the right set of tests were run. + + Args: + gtest_filter: A filter to apply to the tests. + tests_to_run: A set of tests expected to run. + """ + + tests_to_run = self.AdjustForParameterizedTests(tests_to_run) + + # Construct the command line. + args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG] + if gtest_filter is not None: + args.append('--%s=%s' % (FILTER_FLAG, gtest_filter)) + + tests_run = RunAndExtractTestList(args)[0] + self.AssertSetEqual(tests_run, tests_to_run) + + def setUp(self): + """Sets up test case. + + Determines whether value-parameterized tests are enabled in the binary and + sets the flags accordingly. + """ + + global param_tests_present + if param_tests_present is None: + param_tests_present = PARAM_TEST_REGEX.search( + RunAndReturnOutput()) is not None + + def testDefaultBehavior(self): + """Tests the behavior of not specifying the filter.""" + + self.RunAndVerify(None, ACTIVE_TESTS) + + def testDefaultBehaviorWithShards(self): + """Tests the behavior without the filter, with sharding enabled.""" + + self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS) + self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS) + self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS) + self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS) + self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS) + + def testEmptyFilter(self): + """Tests an empty filter.""" + + self.RunAndVerify('', []) + self.RunAndVerifyWithSharding('', 1, []) + self.RunAndVerifyWithSharding('', 2, []) + + def testBadFilter(self): + """Tests a filter that matches nothing.""" + + self.RunAndVerify('BadFilter', []) + self.RunAndVerifyAllowingDisabled('BadFilter', []) + + def testFullName(self): + """Tests filtering by full name.""" + + self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz']) + self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz']) + self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz']) + + def testUniversalFilters(self): + """Tests filters that match everything.""" + + self.RunAndVerify('*', ACTIVE_TESTS) + self.RunAndVerify('*.*', ACTIVE_TESTS) + self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS) + self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS) + self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS) + + def testFilterByTestCase(self): + """Tests filtering by test case name.""" + + self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz']) + + BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB'] + self.RunAndVerify('BazTest.*', BAZ_TESTS) + self.RunAndVerifyAllowingDisabled('BazTest.*', + BAZ_TESTS + ['BazTest.DISABLED_TestC']) + + def testFilterByTest(self): + """Tests filtering by test name.""" + + self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne']) + + def testFilterDisabledTests(self): + """Select only the disabled tests to run.""" + + self.RunAndVerify('DISABLED_FoobarTest.Test1', []) + self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1', + ['DISABLED_FoobarTest.Test1']) + + self.RunAndVerify('*DISABLED_*', []) + self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS) + + self.RunAndVerify('*.DISABLED_*', []) + self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [ + 'BarTest.DISABLED_TestFour', + 'BarTest.DISABLED_TestFive', + 'BazTest.DISABLED_TestC', + 'DISABLED_FoobarTest.DISABLED_Test2', + ]) + + self.RunAndVerify('DISABLED_*', []) + self.RunAndVerifyAllowingDisabled('DISABLED_*', [ + 'DISABLED_FoobarTest.Test1', + 'DISABLED_FoobarTest.DISABLED_Test2', + 'DISABLED_FoobarbazTest.TestA', + ]) + + def testWildcardInTestCaseName(self): + """Tests using wildcard in the test case name.""" + + self.RunAndVerify('*a*.*', [ + 'BarTest.TestOne', + 'BarTest.TestTwo', + 'BarTest.TestThree', + + 'BazTest.TestOne', + 'BazTest.TestA', + 'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS) + + def testWildcardInTestName(self): + """Tests using wildcard in the test name.""" + + self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA']) + + def testFilterWithoutDot(self): + """Tests a filter that has no '.' in it.""" + + self.RunAndVerify('*z*', [ + 'FooTest.Xyz', + + 'BazTest.TestOne', + 'BazTest.TestA', + 'BazTest.TestB', + ]) + + def testTwoPatterns(self): + """Tests filters that consist of two patterns.""" + + self.RunAndVerify('Foo*.*:*A*', [ + 'FooTest.Abc', + 'FooTest.Xyz', + + 'BazTest.TestA', + ]) + + # An empty pattern + a non-empty one + self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA']) + + def testThreePatterns(self): + """Tests filters that consist of three patterns.""" + + self.RunAndVerify('*oo*:*A*:*One', [ + 'FooTest.Abc', + 'FooTest.Xyz', + + 'BarTest.TestOne', + + 'BazTest.TestOne', + 'BazTest.TestA', + ]) + + # The 2nd pattern is empty. + self.RunAndVerify('*oo*::*One', [ + 'FooTest.Abc', + 'FooTest.Xyz', + + 'BarTest.TestOne', + + 'BazTest.TestOne', + ]) + + # The last 2 patterns are empty. + self.RunAndVerify('*oo*::', [ + 'FooTest.Abc', + 'FooTest.Xyz', + ]) + + def testNegativeFilters(self): + self.RunAndVerify('*-BazTest.TestOne', [ + 'FooTest.Abc', + 'FooTest.Xyz', + + 'BarTest.TestOne', + 'BarTest.TestTwo', + 'BarTest.TestThree', + + 'BazTest.TestA', + 'BazTest.TestB', + ] + DEATH_TESTS + PARAM_TESTS) + + self.RunAndVerify('*-FooTest.Abc:BazTest.*', [ + 'FooTest.Xyz', + + 'BarTest.TestOne', + 'BarTest.TestTwo', + 'BarTest.TestThree', + ] + DEATH_TESTS + PARAM_TESTS) + + self.RunAndVerify('BarTest.*-BarTest.TestOne', [ + 'BarTest.TestTwo', + 'BarTest.TestThree', + ]) + + # Tests without leading '*'. + self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [ + 'BarTest.TestOne', + 'BarTest.TestTwo', + 'BarTest.TestThree', + ] + DEATH_TESTS + PARAM_TESTS) + + # Value parameterized tests. + self.RunAndVerify('*/*', PARAM_TESTS) + + # Value parameterized tests filtering by the sequence name. + self.RunAndVerify('SeqP/*', [ + 'SeqP/ParamTest.TestX/0', + 'SeqP/ParamTest.TestX/1', + 'SeqP/ParamTest.TestY/0', + 'SeqP/ParamTest.TestY/1', + ]) + + # Value parameterized tests filtering by the test name. + self.RunAndVerify('*/0', [ + 'SeqP/ParamTest.TestX/0', + 'SeqP/ParamTest.TestY/0', + 'SeqQ/ParamTest.TestX/0', + 'SeqQ/ParamTest.TestY/0', + ]) + + def testFlagOverridesEnvVar(self): + """Tests that the filter flag overrides the filtering env. variable.""" + + SetEnvVar(FILTER_ENV_VAR, 'Foo*') + args = ['--%s=%s' % (FILTER_FLAG, '*One')] + tests_run = RunAndExtractTestList(args)[0] + SetEnvVar(FILTER_ENV_VAR, None) + + self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne']) + + def testShardStatusFileIsCreated(self): + """Tests that the shard file is created if specified in the environment.""" + + shard_status_file = os.path.join(gtest_test_utils.GetTempDir(), + 'shard_status_file') + self.assert_(not os.path.exists(shard_status_file)) + + extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file} + try: + InvokeWithModifiedEnv(extra_env, RunAndReturnOutput) + finally: + self.assert_(os.path.exists(shard_status_file)) + os.remove(shard_status_file) + + def testShardStatusFileIsCreatedWithListTests(self): + """Tests that the shard file is created with the "list_tests" flag.""" + + shard_status_file = os.path.join(gtest_test_utils.GetTempDir(), + 'shard_status_file2') + self.assert_(not os.path.exists(shard_status_file)) + + extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file} + try: + output = InvokeWithModifiedEnv(extra_env, + RunAndReturnOutput, + [LIST_TESTS_FLAG]) + finally: + # This assertion ensures that Google Test enumerated the tests as + # opposed to running them. + self.assert_('[==========]' not in output, + 'Unexpected output during test enumeration.\n' + 'Please ensure that LIST_TESTS_FLAG is assigned the\n' + 'correct flag value for listing Google Test tests.') + + self.assert_(os.path.exists(shard_status_file)) + os.remove(shard_status_file) + + if SUPPORTS_DEATH_TESTS: + def testShardingWorksWithDeathTests(self): + """Tests integration with death tests and sharding.""" + + gtest_filter = 'HasDeathTest.*:SeqP/*' + expected_tests = [ + 'HasDeathTest.Test1', + 'HasDeathTest.Test2', + + 'SeqP/ParamTest.TestX/0', + 'SeqP/ParamTest.TestX/1', + 'SeqP/ParamTest.TestY/0', + 'SeqP/ParamTest.TestY/1', + ] + + for flag in ['--gtest_death_test_style=threadsafe', + '--gtest_death_test_style=fast']: + self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests, + check_exit_0=True, args=[flag]) + self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests, + check_exit_0=True, args=[flag]) + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc new file mode 100644 index 000000000..325504fe9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc @@ -0,0 +1,140 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Unit test for Google Test test filters. +// +// A user can specify which test(s) in a Google Test program to run via +// either the GTEST_FILTER environment variable or the --gtest_filter +// flag. This is used for testing such functionality. +// +// The program will be invoked from a Python unit test. Don't run it +// directly. + +#include + +namespace { + +// Test case FooTest. + +class FooTest : public testing::Test { +}; + +TEST_F(FooTest, Abc) { +} + +TEST_F(FooTest, Xyz) { + FAIL() << "Expected failure."; +} + +// Test case BarTest. + +TEST(BarTest, TestOne) { +} + +TEST(BarTest, TestTwo) { +} + +TEST(BarTest, TestThree) { +} + +TEST(BarTest, DISABLED_TestFour) { + FAIL() << "Expected failure."; +} + +TEST(BarTest, DISABLED_TestFive) { + FAIL() << "Expected failure."; +} + +// Test case BazTest. + +TEST(BazTest, TestOne) { + FAIL() << "Expected failure."; +} + +TEST(BazTest, TestA) { +} + +TEST(BazTest, TestB) { +} + +TEST(BazTest, DISABLED_TestC) { + FAIL() << "Expected failure."; +} + +// Test case HasDeathTest + +TEST(HasDeathTest, Test1) { + EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*"); +} + +// We need at least two death tests to make sure that the all death tests +// aren't on the first shard. +TEST(HasDeathTest, Test2) { + EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*"); +} + +// Test case FoobarTest + +TEST(DISABLED_FoobarTest, Test1) { + FAIL() << "Expected failure."; +} + +TEST(DISABLED_FoobarTest, DISABLED_Test2) { + FAIL() << "Expected failure."; +} + +// Test case FoobarbazTest + +TEST(DISABLED_FoobarbazTest, TestA) { + FAIL() << "Expected failure."; +} + +#if GTEST_HAS_PARAM_TEST +class ParamTest : public testing::TestWithParam { +}; + +TEST_P(ParamTest, TestX) { +} + +TEST_P(ParamTest, TestY) { +} + +INSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2)); +INSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6)); +#endif // GTEST_HAS_PARAM_TEST + +} // namespace + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py new file mode 100755 index 000000000..3cb4c48e0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python +# +# Copyright 2009, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Tests the --help flag of Google C++ Testing Framework. + +SYNOPSIS + gtest_help_test.py --gtest_build_dir=BUILD/DIR + # where BUILD/DIR contains the built gtest_help_test_ file. + gtest_help_test.py +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import re +import gtest_test_utils + + +IS_WINDOWS = os.name == 'nt' + +PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_') +FLAG_PREFIX = '--gtest_' +CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions' +DEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style' +UNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing' +LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests' +INCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG), + re.sub('^--', '/', LIST_TESTS_FLAG), + re.sub('_', '-', LIST_TESTS_FLAG)] +INTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing' + +SUPPORTS_DEATH_TESTS = "DeathTest" in gtest_test_utils.Subprocess( + [PROGRAM_PATH, LIST_TESTS_FLAG]).output + +# The help message must match this regex. +HELP_REGEX = re.compile( + FLAG_PREFIX + r'list_tests.*' + + FLAG_PREFIX + r'filter=.*' + + FLAG_PREFIX + r'also_run_disabled_tests.*' + + FLAG_PREFIX + r'repeat=.*' + + FLAG_PREFIX + r'shuffle.*' + + FLAG_PREFIX + r'random_seed=.*' + + FLAG_PREFIX + r'color=.*' + + FLAG_PREFIX + r'print_time.*' + + FLAG_PREFIX + r'output=.*' + + FLAG_PREFIX + r'break_on_failure.*' + + FLAG_PREFIX + r'throw_on_failure.*', + re.DOTALL) + + +def RunWithFlag(flag): + """Runs gtest_help_test_ with the given flag. + + Returns: + the exit code and the text output as a tuple. + Args: + flag: the command-line flag to pass to gtest_help_test_, or None. + """ + + if flag is None: + command = [PROGRAM_PATH] + else: + command = [PROGRAM_PATH, flag] + child = gtest_test_utils.Subprocess(command) + return child.exit_code, child.output + + +class GTestHelpTest(gtest_test_utils.TestCase): + """Tests the --help flag and its equivalent forms.""" + + def TestHelpFlag(self, flag): + """Verifies correct behavior when help flag is specified. + + The right message must be printed and the tests must + skipped when the given flag is specified. + + Args: + flag: A flag to pass to the binary or None. + """ + + exit_code, output = RunWithFlag(flag) + self.assertEquals(0, exit_code) + self.assert_(HELP_REGEX.search(output), output) + if IS_WINDOWS: + self.assert_(CATCH_EXCEPTIONS_FLAG in output, output) + else: + self.assert_(CATCH_EXCEPTIONS_FLAG not in output, output) + + if SUPPORTS_DEATH_TESTS and not IS_WINDOWS: + self.assert_(DEATH_TEST_STYLE_FLAG in output, output) + else: + self.assert_(DEATH_TEST_STYLE_FLAG not in output, output) + + def TestNonHelpFlag(self, flag): + """Verifies correct behavior when no help flag is specified. + + Verifies that when no help flag is specified, the tests are run + and the help message is not printed. + + Args: + flag: A flag to pass to the binary or None. + """ + + exit_code, output = RunWithFlag(flag) + self.assert_(exit_code != 0) + self.assert_(not HELP_REGEX.search(output), output) + + def testPrintsHelpWithFullFlag(self): + self.TestHelpFlag('--help') + + def testPrintsHelpWithShortFlag(self): + self.TestHelpFlag('-h') + + def testPrintsHelpWithQuestionFlag(self): + self.TestHelpFlag('-?') + + def testPrintsHelpWithWindowsStyleQuestionFlag(self): + self.TestHelpFlag('/?') + + def testPrintsHelpWithUnrecognizedGoogleTestFlag(self): + self.TestHelpFlag(UNKNOWN_FLAG) + + def testPrintsHelpWithIncorrectFlagStyle(self): + for incorrect_flag in INCORRECT_FLAG_VARIANTS: + self.TestHelpFlag(incorrect_flag) + + def testRunsTestsWithoutHelpFlag(self): + """Verifies that when no help flag is specified, the tests are run + and the help message is not printed.""" + + self.TestNonHelpFlag(None) + + def testRunsTestsWithGtestInternalFlag(self): + """Verifies that the tests are run and no help message is printed when + a flag starting with Google Test prefix and 'internal_' is supplied.""" + + self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING) + + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc new file mode 100644 index 000000000..aad0d72d7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc @@ -0,0 +1,46 @@ +// Copyright 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// This program is meant to be run by gtest_help_test.py. Do not run +// it directly. + +#include + +// When a help flag is specified, this program should skip the tests +// and exit with 0; otherwise the following test will be executed, +// causing this program to exit with a non-zero code. +TEST(HelpFlagTest, ShouldNotBeRun) { + ASSERT_TRUE(false) << "Tests shouldn't be run when --help is specified."; +} + +#if GTEST_HAS_DEATH_TEST +TEST(DeathTest, UsedByPythonScriptToDetectSupportForDeathTestsInThisBinary) {} +#endif diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py new file mode 100755 index 000000000..ce8c3ef05 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python +# +# Copyright 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test for Google Test's --gtest_list_tests flag. + +A user can ask Google Test to list all tests by specifying the +--gtest_list_tests flag. This script tests such functionality +by invoking gtest_list_tests_unittest_ (a program written with +Google Test) the command line flags. +""" + +__author__ = 'phanna@google.com (Patrick Hanna)' + +import gtest_test_utils + + +# Constants. + +# The command line flag for enabling/disabling listing all tests. +LIST_TESTS_FLAG = 'gtest_list_tests' + +# Path to the gtest_list_tests_unittest_ program. +EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_') + +# The expected output when running gtest_list_tests_unittest_ with +# --gtest_list_tests +EXPECTED_OUTPUT_NO_FILTER = """FooDeathTest. + Test1 +Foo. + Bar1 + Bar2 + DISABLED_Bar3 +Abc. + Xyz + Def +FooBar. + Baz +FooTest. + Test1 + DISABLED_Test2 + Test3 +""" + +# The expected output when running gtest_list_tests_unittest_ with +# --gtest_list_tests and --gtest_filter=Foo*. +EXPECTED_OUTPUT_FILTER_FOO = """FooDeathTest. + Test1 +Foo. + Bar1 + Bar2 + DISABLED_Bar3 +FooBar. + Baz +FooTest. + Test1 + DISABLED_Test2 + Test3 +""" + +# Utilities. + + +def Run(args): + """Runs gtest_list_tests_unittest_ and returns the list of tests printed.""" + + return gtest_test_utils.Subprocess([EXE_PATH] + args, + capture_stderr=False).output + + +# The unit test. + +class GTestListTestsUnitTest(gtest_test_utils.TestCase): + """Tests using the --gtest_list_tests flag to list all tests.""" + + def RunAndVerify(self, flag_value, expected_output, other_flag): + """Runs gtest_list_tests_unittest_ and verifies that it prints + the correct tests. + + Args: + flag_value: value of the --gtest_list_tests flag; + None if the flag should not be present. + + expected_output: the expected output after running command; + + other_flag: a different flag to be passed to command + along with gtest_list_tests; + None if the flag should not be present. + """ + + if flag_value is None: + flag = '' + flag_expression = 'not set' + elif flag_value == '0': + flag = '--%s=0' % LIST_TESTS_FLAG + flag_expression = '0' + else: + flag = '--%s' % LIST_TESTS_FLAG + flag_expression = '1' + + args = [flag] + + if other_flag is not None: + args += [other_flag] + + output = Run(args) + + msg = ('when %s is %s, the output of "%s" is "%s".' % + (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output)) + + if expected_output is not None: + self.assert_(output == expected_output, msg) + else: + self.assert_(output != EXPECTED_OUTPUT_NO_FILTER, msg) + + def testDefaultBehavior(self): + """Tests the behavior of the default mode.""" + + self.RunAndVerify(flag_value=None, + expected_output=None, + other_flag=None) + + def testFlag(self): + """Tests using the --gtest_list_tests flag.""" + + self.RunAndVerify(flag_value='0', + expected_output=None, + other_flag=None) + self.RunAndVerify(flag_value='1', + expected_output=EXPECTED_OUTPUT_NO_FILTER, + other_flag=None) + + def testOverrideNonFilterFlags(self): + """Tests that --gtest_list_tests overrides the non-filter flags.""" + + self.RunAndVerify(flag_value='1', + expected_output=EXPECTED_OUTPUT_NO_FILTER, + other_flag='--gtest_break_on_failure') + + def testWithFilterFlags(self): + """Tests that --gtest_list_tests takes into account the + --gtest_filter flag.""" + + self.RunAndVerify(flag_value='1', + expected_output=EXPECTED_OUTPUT_FILTER_FOO, + other_flag='--gtest_filter=Foo*') + + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc new file mode 100644 index 000000000..a0ed0825b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc @@ -0,0 +1,85 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: phanna@google.com (Patrick Hanna) + +// Unit test for Google Test's --gtest_list_tests flag. +// +// A user can ask Google Test to list all tests that will run +// so that when using a filter, a user will know what +// tests to look for. The tests will not be run after listing. +// +// This program will be invoked from a Python unit test. +// Don't run it directly. + +#include + +namespace { + +// Several different test cases and tests that will be listed. +TEST(Foo, Bar1) { +} + +TEST(Foo, Bar2) { +} + +TEST(Foo, DISABLED_Bar3) { +} + +TEST(Abc, Xyz) { +} + +TEST(Abc, Def) { +} + +TEST(FooBar, Baz) { +} + +class FooTest : public testing::Test { +}; + +TEST_F(FooTest, Test1) { +} + +TEST_F(FooTest, DISABLED_Test2) { +} + +TEST_F(FooTest, Test3) { +} + +TEST(FooDeathTest, Test1) { +} + +} // namespace + +int main(int argc, char **argv) { + ::testing::InitGoogleTest(&argc, argv); + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc new file mode 100644 index 000000000..7a3f0adfa --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc @@ -0,0 +1,45 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include + +// Tests that we don't have to define main() when we link to +// gtest_main instead of gtest. + +namespace { + +TEST(GTestMainTest, ShouldSucceed) { +} + +} // namespace + +// We are using the main() function defined in src/gtest_main.cc, so +// we don't define it here. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc new file mode 100644 index 000000000..73b5db6d4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc @@ -0,0 +1,234 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// This file is the input to a negative-compilation test for Google +// Test. Code here is NOT supposed to compile. Its purpose is to +// verify that certain incorrect usages of the Google Test API are +// indeed rejected by the compiler. +// +// We still need to write the negative-compilation test itself, which +// will be tightly coupled with the build environment. +// +// TODO(wan@google.com): finish the negative-compilation test. + +#ifdef TEST_CANNOT_IGNORE_RUN_ALL_TESTS_RESULT +// Tests that the result of RUN_ALL_TESTS() cannot be ignored. + +#include + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + RUN_ALL_TESTS(); // This line shouldn't compile. +} + +#elif defined(TEST_USER_CANNOT_INCLUDE_GTEST_INTERNAL_INL_H) +// Tests that a user cannot include gtest-internal-inl.h in his code. + +#include "src/gtest-internal-inl.h" + +#elif defined(TEST_CATCHES_DECLARING_SETUP_IN_TEST_FIXTURE_WITH_TYPO) +// Tests that the compiler catches the typo when a user declares a +// Setup() method in a test fixture. + +#include + +class MyTest : public testing::Test { + protected: + void Setup() {} +}; + +#elif defined(TEST_CATCHES_CALLING_SETUP_IN_TEST_WITH_TYPO) +// Tests that the compiler catches the typo when a user calls Setup() +// from a test fixture. + +#include + +class MyTest : public testing::Test { + protected: + virtual void SetUp() { + testing::Test::Setup(); // Tries to call SetUp() in the parent class. + } +}; + +#elif defined(TEST_CATCHES_DECLARING_SETUP_IN_ENVIRONMENT_WITH_TYPO) +// Tests that the compiler catches the typo when a user declares a +// Setup() method in a subclass of Environment. + +#include + +class MyEnvironment : public testing::Environment { + public: + void Setup() {} +}; + +#elif defined(TEST_CATCHES_CALLING_SETUP_IN_ENVIRONMENT_WITH_TYPO) +// Tests that the compiler catches the typo when a user calls Setup() +// in an Environment. + +#include + +class MyEnvironment : public testing::Environment { + protected: + virtual void SetUp() { + // Tries to call SetUp() in the parent class. + testing::Environment::Setup(); + } +}; + +#elif defined(TEST_CATCHES_WRONG_CASE_IN_TYPED_TEST_P) +// Tests that the compiler catches using the wrong test case name in +// TYPED_TEST_P. + +#include + +template +class FooTest : public testing::Test { +}; + +template +class BarTest : public testing::Test { +}; + +TYPED_TEST_CASE_P(FooTest); +TYPED_TEST_P(BarTest, A) {} // Wrong test case name. +REGISTER_TYPED_TEST_CASE_P(FooTest, A); +INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types); + +#elif defined(TEST_CATCHES_WRONG_CASE_IN_REGISTER_TYPED_TEST_CASE_P) +// Tests that the compiler catches using the wrong test case name in +// REGISTER_TYPED_TEST_CASE_P. + +#include + +template +class FooTest : public testing::Test { +}; + +template +class BarTest : public testing::Test { +}; + +TYPED_TEST_CASE_P(FooTest); +TYPED_TEST_P(FooTest, A) {} +REGISTER_TYPED_TEST_CASE_P(BarTest, A); // Wrong test case name. +INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types); + +#elif defined(TEST_CATCHES_WRONG_CASE_IN_INSTANTIATE_TYPED_TEST_CASE_P) +// Tests that the compiler catches using the wrong test case name in +// INSTANTIATE_TYPED_TEST_CASE_P. + +#include + +template +class FooTest : public testing::Test { +}; + +template +class BarTest : public testing::Test { +}; + +TYPED_TEST_CASE_P(FooTest); +TYPED_TEST_P(FooTest, A) {} +REGISTER_TYPED_TEST_CASE_P(FooTest, A); + +// Wrong test case name. +INSTANTIATE_TYPED_TEST_CASE_P(My, BarTest, testing::Types); + +#elif defined(TEST_CATCHES_INSTANTIATE_TYPED_TESET_CASE_P_WITH_SAME_NAME_PREFIX) +// Tests that the compiler catches instantiating TYPED_TEST_CASE_P +// twice with the same name prefix. + +#include + +template +class FooTest : public testing::Test { +}; + +TYPED_TEST_CASE_P(FooTest); +TYPED_TEST_P(FooTest, A) {} +REGISTER_TYPED_TEST_CASE_P(FooTest, A); + +INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types); + +// Wrong name prefix: "My" has been used. +INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, testing::Types); + +#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_IS_NOT_A_TYPE) + +#include + +// Tests that StaticAssertTypeEq cannot be used as a type. +testing::StaticAssertTypeEq dummy; + +#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_NAMESPACE) + +#include + +// Tests that StaticAssertTypeEq works in a namespace scope. +static bool dummy = testing::StaticAssertTypeEq(); + +#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_CLASS) + +#include + +template +class Helper { + public: + // Tests that StaticAssertTypeEq works in a class. + Helper() { testing::StaticAssertTypeEq(); } + + void DoSomething() {} +}; + +void Test() { + Helper h; + h.DoSomething(); // To avoid the "unused variable" warning. +} + +#elif defined(TEST_STATIC_ASSERT_TYPE_EQ_WORKS_IN_FUNCTION) + +#include + +void Test() { + // Tests that StaticAssertTypeEq works inside a function. + testing::StaticAssertTypeEq(); +} + +#else +// A sanity test. This should compile. + +#include + +int main() { + return RUN_ALL_TESTS(); +} + +#endif diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py new file mode 100755 index 000000000..06ffb3f80 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +# +# Copyright 2007, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Negative compilation test for Google Test.""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import sys +import unittest + + +IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux' +if not IS_LINUX: + sys.exit(0) # Negative compilation tests are not supported on Windows & Mac. + + +class GTestNCTest(unittest.TestCase): + """Negative compilation test for Google Test.""" + + def testCompilerError(self): + """Verifies that erroneous code leads to expected compiler + messages.""" + + # Defines a list of test specs, where each element is a tuple + # (test name, list of regexes for matching the compiler errors). + test_specs = [ + ('CANNOT_IGNORE_RUN_ALL_TESTS_RESULT', + [r'ignoring return value']), + + ('USER_CANNOT_INCLUDE_GTEST_INTERNAL_INL_H', + [r'must not be included except by Google Test itself']), + + ('CATCHES_DECLARING_SETUP_IN_TEST_FIXTURE_WITH_TYPO', + [r'Setup_should_be_spelled_SetUp']), + + ('CATCHES_CALLING_SETUP_IN_TEST_WITH_TYPO', + [r'Setup_should_be_spelled_SetUp']), + + ('CATCHES_DECLARING_SETUP_IN_ENVIRONMENT_WITH_TYPO', + [r'Setup_should_be_spelled_SetUp']), + + ('CATCHES_CALLING_SETUP_IN_ENVIRONMENT_WITH_TYPO', + [r'Setup_should_be_spelled_SetUp']), + + ('CATCHES_WRONG_CASE_IN_TYPED_TEST_P', + [r'BarTest.*was not declared']), + + ('CATCHES_WRONG_CASE_IN_REGISTER_TYPED_TEST_CASE_P', + [r'BarTest.*was not declared']), + + ('CATCHES_WRONG_CASE_IN_INSTANTIATE_TYPED_TEST_CASE_P', + [r'BarTest.*not declared']), + + ('CATCHES_INSTANTIATE_TYPED_TESET_CASE_P_WITH_SAME_NAME_PREFIX', + [r'redefinition of.*My.*FooTest']), + + ('STATIC_ASSERT_TYPE_EQ_IS_NOT_A_TYPE', + [r'StaticAssertTypeEq.* does not name a type']), + + ('STATIC_ASSERT_TYPE_EQ_WORKS_IN_NAMESPACE', + [r'StaticAssertTypeEq.*int.*const int']), + + ('STATIC_ASSERT_TYPE_EQ_WORKS_IN_CLASS', + [r'StaticAssertTypeEq.*int.*bool']), + + ('STATIC_ASSERT_TYPE_EQ_WORKS_IN_FUNCTION', + [r'StaticAssertTypeEq.*const int.*int']), + + ('SANITY', + None) + ] + + # TODO(wan@google.com): verify that the test specs are satisfied. + + +if __name__ == '__main__': + unittest.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc new file mode 100644 index 000000000..afe2dc0c9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc @@ -0,0 +1,54 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Tests that a Google Test program that has no test defined can run +// successfully. +// +// Author: wan@google.com (Zhanyong Wan) + +#include + + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + + // An ad-hoc assertion outside of all tests. + // + // This serves two purposes: + // + // 1. It verifies that an ad-hoc assertion can be executed even if + // no test is defined. + // 2. We had a bug where the XML output won't be generated if an + // assertion is executed before RUN_ALL_TESTS() is called, even + // though --gtest_output=xml is specified. This makes sure the + // bug is fixed and doesn't regress. + EXPECT_EQ(1, 1); + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py new file mode 100755 index 000000000..192030a20 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py @@ -0,0 +1,327 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Tests the text output of Google C++ Testing Framework. + +SYNOPSIS + gtest_output_test.py --gtest_build_dir=BUILD/DIR --gengolden + # where BUILD/DIR contains the built gtest_output_test_ file. + gtest_output_test.py --gengolden + gtest_output_test.py +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import re +import sys +import gtest_test_utils + + +# The flag for generating the golden file +GENGOLDEN_FLAG = '--gengolden' +CATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS' + +IS_WINDOWS = os.name == 'nt' + +if IS_WINDOWS: + GOLDEN_NAME = 'gtest_output_test_golden_win.txt' +else: + GOLDEN_NAME = 'gtest_output_test_golden_lin.txt' + +PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_') + +# At least one command we exercise must not have the +# --gtest_internal_skip_environment_and_ad_hoc_tests flag. +COMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests']) +COMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes']) +COMMAND_WITH_TIME = ({}, [PROGRAM_PATH, + '--gtest_print_time', + '--gtest_internal_skip_environment_and_ad_hoc_tests', + '--gtest_filter=FatalFailureTest.*:LoggingTest.*']) +COMMAND_WITH_DISABLED = ( + {}, [PROGRAM_PATH, + '--gtest_also_run_disabled_tests', + '--gtest_internal_skip_environment_and_ad_hoc_tests', + '--gtest_filter=*DISABLED_*']) +COMMAND_WITH_SHARDING = ( + {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'}, + [PROGRAM_PATH, + '--gtest_internal_skip_environment_and_ad_hoc_tests', + '--gtest_filter=PassingTest.*']) + +GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME) + + +def ToUnixLineEnding(s): + """Changes all Windows/Mac line endings in s to UNIX line endings.""" + + return s.replace('\r\n', '\n').replace('\r', '\n') + + +def RemoveLocations(test_output): + """Removes all file location info from a Google Test program's output. + + Args: + test_output: the output of a Google Test program. + + Returns: + output with all file location info (in the form of + 'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or + 'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by + 'FILE_NAME:#: '. + """ + + return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output) + + +def RemoveStackTraceDetails(output): + """Removes all stack traces from a Google Test program's output.""" + + # *? means "find the shortest string that matches". + return re.sub(r'Stack trace:(.|\n)*?\n\n', + 'Stack trace: (omitted)\n\n', output) + + +def RemoveStackTraces(output): + """Removes all traces of stack traces from a Google Test program's output.""" + + # *? means "find the shortest string that matches". + return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output) + + +def RemoveTime(output): + """Removes all time information from a Google Test program's output.""" + + return re.sub(r'\(\d+ ms', '(? ms', output) + + +def RemoveTypeInfoDetails(test_output): + """Removes compiler-specific type info from Google Test program's output. + + Args: + test_output: the output of a Google Test program. + + Returns: + output with type information normalized to canonical form. + """ + + # some compilers output the name of type 'unsigned int' as 'unsigned' + return re.sub(r'unsigned int', 'unsigned', test_output) + + +def RemoveTestCounts(output): + """Removes test counts from a Google Test program's output.""" + + output = re.sub(r'\d+ tests?, listed below', + '? tests, listed below', output) + output = re.sub(r'\d+ FAILED TESTS', + '? FAILED TESTS', output) + output = re.sub(r'\d+ tests? from \d+ test cases?', + '? tests from ? test cases', output) + output = re.sub(r'\d+ tests? from ([a-zA-Z_])', + r'? tests from \1', output) + return re.sub(r'\d+ tests?\.', '? tests.', output) + + +def RemoveMatchingTests(test_output, pattern): + """Removes output of specified tests from a Google Test program's output. + + This function strips not only the beginning and the end of a test but also + all output in between. + + Args: + test_output: A string containing the test output. + pattern: A regex string that matches names of test cases or + tests to remove. + + Returns: + Contents of test_output with tests whose names match pattern removed. + """ + + test_output = re.sub( + r'.*\[ RUN \] .*%s(.|\n)*?\[( FAILED | OK )\] .*%s.*\n' % ( + pattern, pattern), + '', + test_output) + return re.sub(r'.*%s.*\n' % pattern, '', test_output) + + +def NormalizeOutput(output): + """Normalizes output (the output of gtest_output_test_.exe).""" + + output = ToUnixLineEnding(output) + output = RemoveLocations(output) + output = RemoveStackTraceDetails(output) + output = RemoveTime(output) + return output + + +def GetShellCommandOutput(env_cmd): + """Runs a command in a sub-process, and returns its output in a string. + + Args: + env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra + environment variables to set, and element 1 is a string with + the command and any flags. + + Returns: + A string with the command's combined standard and diagnostic output. + """ + + # Spawns cmd in a sub-process, and gets its standard I/O file objects. + # Set and save the environment properly. + environ = os.environ.copy() + environ.update(env_cmd[0]) + p = gtest_test_utils.Subprocess(env_cmd[1], env=environ) + + return p.output + + +def GetCommandOutput(env_cmd): + """Runs a command and returns its output with all file location + info stripped off. + + Args: + env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra + environment variables to set, and element 1 is a string with + the command and any flags. + """ + + # Disables exception pop-ups on Windows. + environ, cmdline = env_cmd + environ = dict(environ) # Ensures we are modifying a copy. + environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1' + return NormalizeOutput(GetShellCommandOutput((environ, cmdline))) + + +def GetOutputOfAllCommands(): + """Returns concatenated output from several representative commands.""" + + return (GetCommandOutput(COMMAND_WITH_COLOR) + + GetCommandOutput(COMMAND_WITH_TIME) + + GetCommandOutput(COMMAND_WITH_DISABLED) + + GetCommandOutput(COMMAND_WITH_SHARDING)) + + +test_list = GetShellCommandOutput(COMMAND_LIST_TESTS) +SUPPORTS_DEATH_TESTS = 'DeathTest' in test_list +SUPPORTS_TYPED_TESTS = 'TypedTest' in test_list +SUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list +SUPPORTS_STACK_TRACES = False + +CAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and + SUPPORTS_TYPED_TESTS and + SUPPORTS_THREADS) + + +class GTestOutputTest(gtest_test_utils.TestCase): + def RemoveUnsupportedTests(self, test_output): + if not SUPPORTS_DEATH_TESTS: + test_output = RemoveMatchingTests(test_output, 'DeathTest') + if not SUPPORTS_TYPED_TESTS: + test_output = RemoveMatchingTests(test_output, 'TypedTest') + test_output = RemoveMatchingTests(test_output, 'TypedDeathTest') + test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest') + if not SUPPORTS_THREADS: + test_output = RemoveMatchingTests(test_output, + 'ExpectFailureWithThreadsTest') + test_output = RemoveMatchingTests(test_output, + 'ScopedFakeTestPartResultReporterTest') + test_output = RemoveMatchingTests(test_output, + 'WorksConcurrently') + if not SUPPORTS_STACK_TRACES: + test_output = RemoveStackTraces(test_output) + + return test_output + + def testOutput(self): + output = GetOutputOfAllCommands() + + golden_file = open(GOLDEN_PATH, 'rb') + # A mis-configured source control system can cause \r appear in EOL + # sequences when we read the golden file irrespective of an operating + # system used. Therefore, we need to strip those \r's from newlines + # unconditionally. + golden = ToUnixLineEnding(golden_file.read()) + golden_file.close() + + # We want the test to pass regardless of certain features being + # supported or not. + + # We still have to remove type name specifics in all cases. + normalized_actual = RemoveTypeInfoDetails(output) + normalized_golden = RemoveTypeInfoDetails(golden) + + if CAN_GENERATE_GOLDEN_FILE: + self.assertEqual(normalized_golden, normalized_actual) + else: + normalized_actual = RemoveTestCounts(normalized_actual) + normalized_golden = RemoveTestCounts(self.RemoveUnsupportedTests( + normalized_golden)) + + # This code is very handy when debugging golden file differences: + if os.getenv('DEBUG_GTEST_OUTPUT_TEST'): + open(os.path.join( + gtest_test_utils.GetSourceDir(), + '_gtest_output_test_normalized_actual.txt'), 'wb').write( + normalized_actual) + open(os.path.join( + gtest_test_utils.GetSourceDir(), + '_gtest_output_test_normalized_golden.txt'), 'wb').write( + normalized_golden) + + self.assertEqual(normalized_golden, normalized_actual) + + +if __name__ == '__main__': + if sys.argv[1:] == [GENGOLDEN_FLAG]: + if CAN_GENERATE_GOLDEN_FILE: + output = GetOutputOfAllCommands() + golden_file = open(GOLDEN_PATH, 'wb') + golden_file.write(output) + golden_file.close() + else: + message = ( + """Unable to write a golden file when compiled in an environment +that does not support all the required features (death tests""") + if IS_WINDOWS: + message += ( + """\nand typed tests). Please check that you are using VC++ 8.0 SP1 +or higher as your compiler.""") + else: + message += """\ntyped tests, and threads). Please generate the +golden file using a binary built with those features enabled.""" + + sys.stderr.write(message) + sys.exit(1) + else: + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc new file mode 100644 index 000000000..273e8e93e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc @@ -0,0 +1,1135 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// A unit test for Google Test itself. This verifies that the basic +// constructs of Google Test work. +// +// Author: wan@google.com (Zhanyong Wan) + +#include +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +#include + +#if GTEST_IS_THREADSAFE +using testing::ScopedFakeTestPartResultReporter; +using testing::TestPartResultArray; + +using testing::internal::Notification; +using testing::internal::ThreadWithParam; +#endif + +namespace posix = ::testing::internal::posix; +using testing::internal::String; +using testing::internal::scoped_ptr; + +// Tests catching fatal failures. + +// A subroutine used by the following test. +void TestEq1(int x) { + ASSERT_EQ(1, x); +} + +// This function calls a test subroutine, catches the fatal failure it +// generates, and then returns early. +void TryTestSubroutine() { + // Calls a subrountine that yields a fatal failure. + TestEq1(2); + + // Catches the fatal failure and aborts the test. + // + // The testing::Test:: prefix is necessary when calling + // HasFatalFailure() outside of a TEST, TEST_F, or test fixture. + if (testing::Test::HasFatalFailure()) return; + + // If we get here, something is wrong. + FAIL() << "This should never be reached."; +} + +TEST(PassingTest, PassingTest1) { +} + +TEST(PassingTest, PassingTest2) { +} + +// Tests catching a fatal failure in a subroutine. +TEST(FatalFailureTest, FatalFailureInSubroutine) { + printf("(expecting a failure that x should be 1)\n"); + + TryTestSubroutine(); +} + +// Tests catching a fatal failure in a nested subroutine. +TEST(FatalFailureTest, FatalFailureInNestedSubroutine) { + printf("(expecting a failure that x should be 1)\n"); + + // Calls a subrountine that yields a fatal failure. + TryTestSubroutine(); + + // Catches the fatal failure and aborts the test. + // + // When calling HasFatalFailure() inside a TEST, TEST_F, or test + // fixture, the testing::Test:: prefix is not needed. + if (HasFatalFailure()) return; + + // If we get here, something is wrong. + FAIL() << "This should never be reached."; +} + +// Tests HasFatalFailure() after a failed EXPECT check. +TEST(FatalFailureTest, NonfatalFailureInSubroutine) { + printf("(expecting a failure on false)\n"); + EXPECT_TRUE(false); // Generates a nonfatal failure + ASSERT_FALSE(HasFatalFailure()); // This should succeed. +} + +// Tests interleaving user logging and Google Test assertions. +TEST(LoggingTest, InterleavingLoggingAndAssertions) { + static const int a[4] = { + 3, 9, 2, 6 + }; + + printf("(expecting 2 failures on (3) >= (a[i]))\n"); + for (int i = 0; i < static_cast(sizeof(a)/sizeof(*a)); i++) { + printf("i == %d\n", i); + EXPECT_GE(3, a[i]); + } +} + +// Tests the SCOPED_TRACE macro. + +// A helper function for testing SCOPED_TRACE. +void SubWithoutTrace(int n) { + EXPECT_EQ(1, n); + ASSERT_EQ(2, n); +} + +// Another helper function for testing SCOPED_TRACE. +void SubWithTrace(int n) { + SCOPED_TRACE(testing::Message() << "n = " << n); + + SubWithoutTrace(n); +} + +// Tests that SCOPED_TRACE() obeys lexical scopes. +TEST(SCOPED_TRACETest, ObeysScopes) { + printf("(expected to fail)\n"); + + // There should be no trace before SCOPED_TRACE() is invoked. + ADD_FAILURE() << "This failure is expected, and shouldn't have a trace."; + + { + SCOPED_TRACE("Expected trace"); + // After SCOPED_TRACE(), a failure in the current scope should contain + // the trace. + ADD_FAILURE() << "This failure is expected, and should have a trace."; + } + + // Once the control leaves the scope of the SCOPED_TRACE(), there + // should be no trace again. + ADD_FAILURE() << "This failure is expected, and shouldn't have a trace."; +} + +// Tests that SCOPED_TRACE works inside a loop. +TEST(SCOPED_TRACETest, WorksInLoop) { + printf("(expected to fail)\n"); + + for (int i = 1; i <= 2; i++) { + SCOPED_TRACE(testing::Message() << "i = " << i); + + SubWithoutTrace(i); + } +} + +// Tests that SCOPED_TRACE works in a subroutine. +TEST(SCOPED_TRACETest, WorksInSubroutine) { + printf("(expected to fail)\n"); + + SubWithTrace(1); + SubWithTrace(2); +} + +// Tests that SCOPED_TRACE can be nested. +TEST(SCOPED_TRACETest, CanBeNested) { + printf("(expected to fail)\n"); + + SCOPED_TRACE(""); // A trace without a message. + + SubWithTrace(2); +} + +// Tests that multiple SCOPED_TRACEs can be used in the same scope. +TEST(SCOPED_TRACETest, CanBeRepeated) { + printf("(expected to fail)\n"); + + SCOPED_TRACE("A"); + ADD_FAILURE() + << "This failure is expected, and should contain trace point A."; + + SCOPED_TRACE("B"); + ADD_FAILURE() + << "This failure is expected, and should contain trace point A and B."; + + { + SCOPED_TRACE("C"); + ADD_FAILURE() << "This failure is expected, and should contain " + << "trace point A, B, and C."; + } + + SCOPED_TRACE("D"); + ADD_FAILURE() << "This failure is expected, and should contain " + << "trace point A, B, and D."; +} + +#if GTEST_IS_THREADSAFE +// Tests that SCOPED_TRACE()s can be used concurrently from multiple +// threads. Namely, an assertion should be affected by +// SCOPED_TRACE()s in its own thread only. + +// Here's the sequence of actions that happen in the test: +// +// Thread A (main) | Thread B (spawned) +// ===============================|================================ +// spawns thread B | +// -------------------------------+-------------------------------- +// waits for n1 | SCOPED_TRACE("Trace B"); +// | generates failure #1 +// | notifies n1 +// -------------------------------+-------------------------------- +// SCOPED_TRACE("Trace A"); | waits for n2 +// generates failure #2 | +// notifies n2 | +// -------------------------------|-------------------------------- +// waits for n3 | generates failure #3 +// | trace B dies +// | generates failure #4 +// | notifies n3 +// -------------------------------|-------------------------------- +// generates failure #5 | finishes +// trace A dies | +// generates failure #6 | +// -------------------------------|-------------------------------- +// waits for thread B to finish | + +struct CheckPoints { + Notification n1; + Notification n2; + Notification n3; +}; + +static void ThreadWithScopedTrace(CheckPoints* check_points) { + { + SCOPED_TRACE("Trace B"); + ADD_FAILURE() + << "Expected failure #1 (in thread B, only trace B alive)."; + check_points->n1.Notify(); + check_points->n2.WaitForNotification(); + + ADD_FAILURE() + << "Expected failure #3 (in thread B, trace A & B both alive)."; + } // Trace B dies here. + ADD_FAILURE() + << "Expected failure #4 (in thread B, only trace A alive)."; + check_points->n3.Notify(); +} + +TEST(SCOPED_TRACETest, WorksConcurrently) { + printf("(expecting 6 failures)\n"); + + CheckPoints check_points; + ThreadWithParam thread(&ThreadWithScopedTrace, + &check_points, + NULL); + check_points.n1.WaitForNotification(); + + { + SCOPED_TRACE("Trace A"); + ADD_FAILURE() + << "Expected failure #2 (in thread A, trace A & B both alive)."; + check_points.n2.Notify(); + check_points.n3.WaitForNotification(); + + ADD_FAILURE() + << "Expected failure #5 (in thread A, only trace A alive)."; + } // Trace A dies here. + ADD_FAILURE() + << "Expected failure #6 (in thread A, no trace alive)."; + thread.Join(); +} +#endif // GTEST_IS_THREADSAFE + +TEST(DisabledTestsWarningTest, + DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) { + // This test body is intentionally empty. Its sole purpose is for + // verifying that the --gtest_also_run_disabled_tests flag + // suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of + // the test output. +} + +// Tests using assertions outside of TEST and TEST_F. +// +// This function creates two failures intentionally. +void AdHocTest() { + printf("The non-test part of the code is expected to have 2 failures.\n\n"); + EXPECT_TRUE(false); + EXPECT_EQ(2, 3); +} + +// Runs all TESTs, all TEST_Fs, and the ad hoc test. +int RunAllTests() { + AdHocTest(); + return RUN_ALL_TESTS(); +} + +// Tests non-fatal failures in the fixture constructor. +class NonFatalFailureInFixtureConstructorTest : public testing::Test { + protected: + NonFatalFailureInFixtureConstructorTest() { + printf("(expecting 5 failures)\n"); + ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor."; + } + + ~NonFatalFailureInFixtureConstructorTest() { + ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor."; + } + + virtual void SetUp() { + ADD_FAILURE() << "Expected failure #2, in SetUp()."; + } + + virtual void TearDown() { + ADD_FAILURE() << "Expected failure #4, in TearDown."; + } +}; + +TEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) { + ADD_FAILURE() << "Expected failure #3, in the test body."; +} + +// Tests fatal failures in the fixture constructor. +class FatalFailureInFixtureConstructorTest : public testing::Test { + protected: + FatalFailureInFixtureConstructorTest() { + printf("(expecting 2 failures)\n"); + Init(); + } + + ~FatalFailureInFixtureConstructorTest() { + ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor."; + } + + virtual void SetUp() { + ADD_FAILURE() << "UNEXPECTED failure in SetUp(). " + << "We should never get here, as the test fixture c'tor " + << "had a fatal failure."; + } + + virtual void TearDown() { + ADD_FAILURE() << "UNEXPECTED failure in TearDown(). " + << "We should never get here, as the test fixture c'tor " + << "had a fatal failure."; + } + private: + void Init() { + FAIL() << "Expected failure #1, in the test fixture c'tor."; + } +}; + +TEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) { + ADD_FAILURE() << "UNEXPECTED failure in the test body. " + << "We should never get here, as the test fixture c'tor " + << "had a fatal failure."; +} + +// Tests non-fatal failures in SetUp(). +class NonFatalFailureInSetUpTest : public testing::Test { + protected: + virtual ~NonFatalFailureInSetUpTest() { + Deinit(); + } + + virtual void SetUp() { + printf("(expecting 4 failures)\n"); + ADD_FAILURE() << "Expected failure #1, in SetUp()."; + } + + virtual void TearDown() { + FAIL() << "Expected failure #3, in TearDown()."; + } + private: + void Deinit() { + FAIL() << "Expected failure #4, in the test fixture d'tor."; + } +}; + +TEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) { + FAIL() << "Expected failure #2, in the test function."; +} + +// Tests fatal failures in SetUp(). +class FatalFailureInSetUpTest : public testing::Test { + protected: + virtual ~FatalFailureInSetUpTest() { + Deinit(); + } + + virtual void SetUp() { + printf("(expecting 3 failures)\n"); + FAIL() << "Expected failure #1, in SetUp()."; + } + + virtual void TearDown() { + FAIL() << "Expected failure #2, in TearDown()."; + } + private: + void Deinit() { + FAIL() << "Expected failure #3, in the test fixture d'tor."; + } +}; + +TEST_F(FatalFailureInSetUpTest, FailureInSetUp) { + FAIL() << "UNEXPECTED failure in the test function. " + << "We should never get here, as SetUp() failed."; +} + +#if GTEST_OS_WINDOWS + +// This group of tests verifies that Google Test handles SEH and C++ +// exceptions correctly. + +// A function that throws an SEH exception. +static void ThrowSEH() { + int* p = NULL; + *p = 0; // Raises an access violation. +} + +// Tests exceptions thrown in the test fixture constructor. +class ExceptionInFixtureCtorTest : public testing::Test { + protected: + ExceptionInFixtureCtorTest() { + printf("(expecting a failure on thrown exception " + "in the test fixture's constructor)\n"); + + ThrowSEH(); + } + + virtual ~ExceptionInFixtureCtorTest() { + Deinit(); + } + + virtual void SetUp() { + FAIL() << "UNEXPECTED failure in SetUp(). " + << "We should never get here, as the test fixture c'tor threw."; + } + + virtual void TearDown() { + FAIL() << "UNEXPECTED failure in TearDown(). " + << "We should never get here, as the test fixture c'tor threw."; + } + private: + void Deinit() { + FAIL() << "UNEXPECTED failure in the d'tor. " + << "We should never get here, as the test fixture c'tor threw."; + } +}; + +TEST_F(ExceptionInFixtureCtorTest, ExceptionInFixtureCtor) { + FAIL() << "UNEXPECTED failure in the test function. " + << "We should never get here, as the test fixture c'tor threw."; +} + +// Tests exceptions thrown in SetUp(). +class ExceptionInSetUpTest : public testing::Test { + protected: + virtual ~ExceptionInSetUpTest() { + Deinit(); + } + + virtual void SetUp() { + printf("(expecting 3 failures)\n"); + + ThrowSEH(); + } + + virtual void TearDown() { + FAIL() << "Expected failure #2, in TearDown()."; + } + private: + void Deinit() { + FAIL() << "Expected failure #3, in the test fixture d'tor."; + } +}; + +TEST_F(ExceptionInSetUpTest, ExceptionInSetUp) { + FAIL() << "UNEXPECTED failure in the test function. " + << "We should never get here, as SetUp() threw."; +} + +// Tests that TearDown() and the test fixture d'tor are always called, +// even when the test function throws an exception. +class ExceptionInTestFunctionTest : public testing::Test { + protected: + virtual ~ExceptionInTestFunctionTest() { + Deinit(); + } + + virtual void TearDown() { + FAIL() << "Expected failure #2, in TearDown()."; + } + private: + void Deinit() { + FAIL() << "Expected failure #3, in the test fixture d'tor."; + } +}; + +// Tests that the test fixture d'tor is always called, even when the +// test function throws an SEH exception. +TEST_F(ExceptionInTestFunctionTest, SEH) { + printf("(expecting 3 failures)\n"); + + ThrowSEH(); +} + +#if GTEST_HAS_EXCEPTIONS + +// Tests that the test fixture d'tor is always called, even when the +// test function throws a C++ exception. We do this only when +// GTEST_HAS_EXCEPTIONS is non-zero, i.e. C++ exceptions are enabled. +TEST_F(ExceptionInTestFunctionTest, CppException) { + throw 1; +} + +// Tests exceptions thrown in TearDown(). +class ExceptionInTearDownTest : public testing::Test { + protected: + virtual ~ExceptionInTearDownTest() { + Deinit(); + } + + virtual void TearDown() { + throw 1; + } + private: + void Deinit() { + FAIL() << "Expected failure #2, in the test fixture d'tor."; + } +}; + +TEST_F(ExceptionInTearDownTest, ExceptionInTearDown) { + printf("(expecting 2 failures)\n"); +} + +#endif // GTEST_HAS_EXCEPTIONS + +#endif // GTEST_OS_WINDOWS + +#if GTEST_IS_THREADSAFE + +// A unary function that may die. +void DieIf(bool should_die) { + GTEST_CHECK_(!should_die) << " - death inside DieIf()."; +} + +// Tests running death tests in a multi-threaded context. + +// Used for coordination between the main and the spawn thread. +struct SpawnThreadNotifications { + SpawnThreadNotifications() {} + + Notification spawn_thread_started; + Notification spawn_thread_ok_to_terminate; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications); +}; + +// The function to be executed in the thread spawn by the +// MultipleThreads test (below). +static void ThreadRoutine(SpawnThreadNotifications* notifications) { + // Signals the main thread that this thread has started. + notifications->spawn_thread_started.Notify(); + + // Waits for permission to finish from the main thread. + notifications->spawn_thread_ok_to_terminate.WaitForNotification(); +} + +// This is a death-test test, but it's not named with a DeathTest +// suffix. It starts threads which might interfere with later +// death tests, so it must run after all other death tests. +class DeathTestAndMultiThreadsTest : public testing::Test { + protected: + // Starts a thread and waits for it to begin. + virtual void SetUp() { + thread_.reset(new ThreadWithParam( + &ThreadRoutine, ¬ifications_, NULL)); + notifications_.spawn_thread_started.WaitForNotification(); + } + // Tells the thread to finish, and reaps it. + // Depending on the version of the thread library in use, + // a manager thread might still be left running that will interfere + // with later death tests. This is unfortunate, but this class + // cleans up after itself as best it can. + virtual void TearDown() { + notifications_.spawn_thread_ok_to_terminate.Notify(); + } + + private: + SpawnThreadNotifications notifications_; + scoped_ptr > thread_; +}; + +#endif // GTEST_IS_THREADSAFE + +// The MixedUpTestCaseTest test case verifies that Google Test will fail a +// test if it uses a different fixture class than what other tests in +// the same test case use. It deliberately contains two fixture +// classes with the same name but defined in different namespaces. + +// The MixedUpTestCaseWithSameTestNameTest test case verifies that +// when the user defines two tests with the same test case name AND +// same test name (but in different namespaces), the second test will +// fail. + +namespace foo { + +class MixedUpTestCaseTest : public testing::Test { +}; + +TEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {} +TEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {} + +class MixedUpTestCaseWithSameTestNameTest : public testing::Test { +}; + +TEST_F(MixedUpTestCaseWithSameTestNameTest, + TheSecondTestWithThisNameShouldFail) {} + +} // namespace foo + +namespace bar { + +class MixedUpTestCaseTest : public testing::Test { +}; + +// The following two tests are expected to fail. We rely on the +// golden file to check that Google Test generates the right error message. +TEST_F(MixedUpTestCaseTest, ThisShouldFail) {} +TEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {} + +class MixedUpTestCaseWithSameTestNameTest : public testing::Test { +}; + +// Expected to fail. We rely on the golden file to check that Google Test +// generates the right error message. +TEST_F(MixedUpTestCaseWithSameTestNameTest, + TheSecondTestWithThisNameShouldFail) {} + +} // namespace bar + +// The following two test cases verify that Google Test catches the user +// error of mixing TEST and TEST_F in the same test case. The first +// test case checks the scenario where TEST_F appears before TEST, and +// the second one checks where TEST appears before TEST_F. + +class TEST_F_before_TEST_in_same_test_case : public testing::Test { +}; + +TEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {} + +// Expected to fail. We rely on the golden file to check that Google Test +// generates the right error message. +TEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {} + +class TEST_before_TEST_F_in_same_test_case : public testing::Test { +}; + +TEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {} + +// Expected to fail. We rely on the golden file to check that Google Test +// generates the right error message. +TEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) { +} + +// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE(). +int global_integer = 0; + +// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables. +TEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) { + global_integer = 0; + EXPECT_NONFATAL_FAILURE({ + EXPECT_EQ(1, global_integer) << "Expected non-fatal failure."; + }, "Expected non-fatal failure."); +} + +// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables +// (static or not). +TEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) { + int m = 0; + static int n; + n = 1; + EXPECT_NONFATAL_FAILURE({ + EXPECT_EQ(m, n) << "Expected non-fatal failure."; + }, "Expected non-fatal failure."); +} + +// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly +// one non-fatal failure and no fatal failure. +TEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) { + EXPECT_NONFATAL_FAILURE({ + ADD_FAILURE() << "Expected non-fatal failure."; + }, "Expected non-fatal failure."); +} + +// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no +// non-fatal failure. +TEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) { + printf("(expecting a failure)\n"); + EXPECT_NONFATAL_FAILURE({ + }, ""); +} + +// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two +// non-fatal failures. +TEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) { + printf("(expecting a failure)\n"); + EXPECT_NONFATAL_FAILURE({ + ADD_FAILURE() << "Expected non-fatal failure 1."; + ADD_FAILURE() << "Expected non-fatal failure 2."; + }, ""); +} + +// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal +// failure. +TEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) { + printf("(expecting a failure)\n"); + EXPECT_NONFATAL_FAILURE({ + FAIL() << "Expected fatal failure."; + }, ""); +} + +// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being +// tested returns. +TEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) { + printf("(expecting a failure)\n"); + EXPECT_NONFATAL_FAILURE({ + return; + }, ""); +} + +#if GTEST_HAS_EXCEPTIONS + +// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being +// tested throws. +TEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) { + printf("(expecting a failure)\n"); + try { + EXPECT_NONFATAL_FAILURE({ + throw 0; + }, ""); + } catch(int) { // NOLINT + } +} + +#endif // GTEST_HAS_EXCEPTIONS + +// Tests that EXPECT_FATAL_FAILURE() can reference global variables. +TEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) { + global_integer = 0; + EXPECT_FATAL_FAILURE({ + ASSERT_EQ(1, global_integer) << "Expected fatal failure."; + }, "Expected fatal failure."); +} + +// Tests that EXPECT_FATAL_FAILURE() can reference local static +// variables. +TEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) { + static int n; + n = 1; + EXPECT_FATAL_FAILURE({ + ASSERT_EQ(0, n) << "Expected fatal failure."; + }, "Expected fatal failure."); +} + +// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly +// one fatal failure and no non-fatal failure. +TEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) { + EXPECT_FATAL_FAILURE({ + FAIL() << "Expected fatal failure."; + }, "Expected fatal failure."); +} + +// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal +// failure. +TEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) { + printf("(expecting a failure)\n"); + EXPECT_FATAL_FAILURE({ + }, ""); +} + +// A helper for generating a fatal failure. +void FatalFailure() { + FAIL() << "Expected fatal failure."; +} + +// Tests that EXPECT_FATAL_FAILURE() fails when there are two +// fatal failures. +TEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) { + printf("(expecting a failure)\n"); + EXPECT_FATAL_FAILURE({ + FatalFailure(); + FatalFailure(); + }, ""); +} + +// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal +// failure. +TEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) { + printf("(expecting a failure)\n"); + EXPECT_FATAL_FAILURE({ + ADD_FAILURE() << "Expected non-fatal failure."; + }, ""); +} + +// Tests that EXPECT_FATAL_FAILURE() fails when the statement being +// tested returns. +TEST(ExpectFatalFailureTest, FailsWhenStatementReturns) { + printf("(expecting a failure)\n"); + EXPECT_FATAL_FAILURE({ + return; + }, ""); +} + +#if GTEST_HAS_EXCEPTIONS + +// Tests that EXPECT_FATAL_FAILURE() fails when the statement being +// tested throws. +TEST(ExpectFatalFailureTest, FailsWhenStatementThrows) { + printf("(expecting a failure)\n"); + try { + EXPECT_FATAL_FAILURE({ + throw 0; + }, ""); + } catch(int) { // NOLINT + } +} + +#endif // GTEST_HAS_EXCEPTIONS + +// This #ifdef block tests the output of typed tests. +#if GTEST_HAS_TYPED_TEST + +template +class TypedTest : public testing::Test { +}; + +TYPED_TEST_CASE(TypedTest, testing::Types); + +TYPED_TEST(TypedTest, Success) { + EXPECT_EQ(0, TypeParam()); +} + +TYPED_TEST(TypedTest, Failure) { + EXPECT_EQ(1, TypeParam()) << "Expected failure"; +} + +#endif // GTEST_HAS_TYPED_TEST + +// This #ifdef block tests the output of type-parameterized tests. +#if GTEST_HAS_TYPED_TEST_P + +template +class TypedTestP : public testing::Test { +}; + +TYPED_TEST_CASE_P(TypedTestP); + +TYPED_TEST_P(TypedTestP, Success) { + EXPECT_EQ(0U, TypeParam()); +} + +TYPED_TEST_P(TypedTestP, Failure) { + EXPECT_EQ(1U, TypeParam()) << "Expected failure"; +} + +REGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure); + +typedef testing::Types UnsignedTypes; +INSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes); + +#endif // GTEST_HAS_TYPED_TEST_P + +#if GTEST_HAS_DEATH_TEST + +// We rely on the golden file to verify that tests whose test case +// name ends with DeathTest are run first. + +TEST(ADeathTest, ShouldRunFirst) { +} + +#if GTEST_HAS_TYPED_TEST + +// We rely on the golden file to verify that typed tests whose test +// case name ends with DeathTest are run first. + +template +class ATypedDeathTest : public testing::Test { +}; + +typedef testing::Types NumericTypes; +TYPED_TEST_CASE(ATypedDeathTest, NumericTypes); + +TYPED_TEST(ATypedDeathTest, ShouldRunFirst) { +} + +#endif // GTEST_HAS_TYPED_TEST + +#if GTEST_HAS_TYPED_TEST_P + + +// We rely on the golden file to verify that type-parameterized tests +// whose test case name ends with DeathTest are run first. + +template +class ATypeParamDeathTest : public testing::Test { +}; + +TYPED_TEST_CASE_P(ATypeParamDeathTest); + +TYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) { +} + +REGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst); + +INSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes); + +#endif // GTEST_HAS_TYPED_TEST_P + +#endif // GTEST_HAS_DEATH_TEST + +// Tests various failure conditions of +// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}. +class ExpectFailureTest : public testing::Test { + public: // Must be public and not protected due to a bug in g++ 3.4.2. + enum FailureMode { + FATAL_FAILURE, + NONFATAL_FAILURE + }; + static void AddFailure(FailureMode failure) { + if (failure == FATAL_FAILURE) { + FAIL() << "Expected fatal failure."; + } else { + ADD_FAILURE() << "Expected non-fatal failure."; + } + } +}; + +TEST_F(ExpectFailureTest, ExpectFatalFailure) { + // Expected fatal failure, but succeeds. + printf("(expecting 1 failure)\n"); + EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure."); + // Expected fatal failure, but got a non-fatal failure. + printf("(expecting 1 failure)\n"); + EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal " + "failure."); + // Wrong message. + printf("(expecting 1 failure)\n"); + EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure " + "expected."); +} + +TEST_F(ExpectFailureTest, ExpectNonFatalFailure) { + // Expected non-fatal failure, but succeeds. + printf("(expecting 1 failure)\n"); + EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure."); + // Expected non-fatal failure, but got a fatal failure. + printf("(expecting 1 failure)\n"); + EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure."); + // Wrong message. + printf("(expecting 1 failure)\n"); + EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal " + "failure."); +} + +#if GTEST_IS_THREADSAFE + +class ExpectFailureWithThreadsTest : public ExpectFailureTest { + protected: + static void AddFailureInOtherThread(FailureMode failure) { + ThreadWithParam thread(&AddFailure, failure, NULL); + thread.Join(); + } +}; + +TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) { + // We only intercept the current thread. + printf("(expecting 2 failures)\n"); + EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE), + "Expected fatal failure."); +} + +TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) { + // We only intercept the current thread. + printf("(expecting 2 failures)\n"); + EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE), + "Expected non-fatal failure."); +} + +typedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest; + +// Tests that the ScopedFakeTestPartResultReporter only catches failures from +// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD. +TEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) { + printf("(expecting 2 failures)\n"); + TestPartResultArray results; + { + ScopedFakeTestPartResultReporter reporter( + ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD, + &results); + AddFailureInOtherThread(FATAL_FAILURE); + AddFailureInOtherThread(NONFATAL_FAILURE); + } + // The two failures should not have been intercepted. + EXPECT_EQ(0, results.size()) << "This shouldn't fail."; +} + +#endif // GTEST_IS_THREADSAFE + +TEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) { + // Expected fatal failure, but succeeds. + printf("(expecting 1 failure)\n"); + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure."); + // Expected fatal failure, but got a non-fatal failure. + printf("(expecting 1 failure)\n"); + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE), + "Expected non-fatal failure."); + // Wrong message. + printf("(expecting 1 failure)\n"); + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE), + "Some other fatal failure expected."); +} + +TEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) { + // Expected non-fatal failure, but succeeds. + printf("(expecting 1 failure)\n"); + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal " + "failure."); + // Expected non-fatal failure, but got a fatal failure. + printf("(expecting 1 failure)\n"); + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE), + "Expected fatal failure."); + // Wrong message. + printf("(expecting 1 failure)\n"); + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE), + "Some other non-fatal failure."); +} + + +// Two test environments for testing testing::AddGlobalTestEnvironment(). + +class FooEnvironment : public testing::Environment { + public: + virtual void SetUp() { + printf("%s", "FooEnvironment::SetUp() called.\n"); + } + + virtual void TearDown() { + printf("%s", "FooEnvironment::TearDown() called.\n"); + FAIL() << "Expected fatal failure."; + } +}; + +class BarEnvironment : public testing::Environment { + public: + virtual void SetUp() { + printf("%s", "BarEnvironment::SetUp() called.\n"); + } + + virtual void TearDown() { + printf("%s", "BarEnvironment::TearDown() called.\n"); + ADD_FAILURE() << "Expected non-fatal failure."; + } +}; + +GTEST_DEFINE_bool_(internal_skip_environment_and_ad_hoc_tests, false, + "This flag causes the program to skip test environment " + "tests and ad hoc tests."); + +// The main function. +// +// The idea is to use Google Test to run all the tests we have defined (some +// of them are intended to fail), and then compare the test results +// with the "golden" file. +int main(int argc, char **argv) { + testing::GTEST_FLAG(print_time) = false; + + // We just run the tests, knowing some of them are intended to fail. + // We will use a separate Python script to compare the output of + // this program with the golden file. + + // It's hard to test InitGoogleTest() directly, as it has many + // global side effects. The following line serves as a sanity test + // for it. + testing::InitGoogleTest(&argc, argv); + if (argc >= 2 && + String(argv[1]) == "--gtest_internal_skip_environment_and_ad_hoc_tests") + GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true; + +#if GTEST_HAS_DEATH_TEST + if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") { + // Skip the usual output capturing if we're running as the child + // process of an threadsafe-style death test. +#if GTEST_OS_WINDOWS + posix::FReopen("nul:", "w", stdout); +#else + posix::FReopen("/dev/null", "w", stdout); +#endif // GTEST_OS_WINDOWS + return RUN_ALL_TESTS(); + } +#endif // GTEST_HAS_DEATH_TEST + + if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests)) + return RUN_ALL_TESTS(); + + // Registers two global test environments. + // The golden file verifies that they are set up in the order they + // are registered, and torn down in the reverse order. + testing::AddGlobalTestEnvironment(new FooEnvironment); + testing::AddGlobalTestEnvironment(new BarEnvironment); + + return RunAllTests(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt new file mode 100644 index 000000000..ec60437ac --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt @@ -0,0 +1,696 @@ +The non-test part of the code is expected to have 2 failures. + +gtest_output_test_.cc:#: Failure +Value of: false + Actual: false +Expected: true +gtest_output_test_.cc:#: Failure +Value of: 3 +Expected: 2 +[==========] Running 60 tests from 25 test cases. +[----------] Global test environment set-up. +FooEnvironment::SetUp() called. +BarEnvironment::SetUp() called. +[----------] 1 test from ADeathTest +[ RUN ] ADeathTest.ShouldRunFirst +[ OK ] ADeathTest.ShouldRunFirst +[----------] 1 test from ATypedDeathTest/0, where TypeParam = int +[ RUN ] ATypedDeathTest/0.ShouldRunFirst +[ OK ] ATypedDeathTest/0.ShouldRunFirst +[----------] 1 test from ATypedDeathTest/1, where TypeParam = double +[ RUN ] ATypedDeathTest/1.ShouldRunFirst +[ OK ] ATypedDeathTest/1.ShouldRunFirst +[----------] 1 test from My/ATypeParamDeathTest/0, where TypeParam = int +[ RUN ] My/ATypeParamDeathTest/0.ShouldRunFirst +[ OK ] My/ATypeParamDeathTest/0.ShouldRunFirst +[----------] 1 test from My/ATypeParamDeathTest/1, where TypeParam = double +[ RUN ] My/ATypeParamDeathTest/1.ShouldRunFirst +[ OK ] My/ATypeParamDeathTest/1.ShouldRunFirst +[----------] 2 tests from PassingTest +[ RUN ] PassingTest.PassingTest1 +[ OK ] PassingTest.PassingTest1 +[ RUN ] PassingTest.PassingTest2 +[ OK ] PassingTest.PassingTest2 +[----------] 3 tests from FatalFailureTest +[ RUN ] FatalFailureTest.FatalFailureInSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: Failure +Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine +[ RUN ] FatalFailureTest.FatalFailureInNestedSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: Failure +Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine +[ RUN ] FatalFailureTest.NonfatalFailureInSubroutine +(expecting a failure on false) +gtest_output_test_.cc:#: Failure +Value of: false + Actual: false +Expected: true +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine +[----------] 1 test from LoggingTest +[ RUN ] LoggingTest.InterleavingLoggingAndAssertions +(expecting 2 failures on (3) >= (a[i])) +i == 0 +i == 1 +gtest_output_test_.cc:#: Failure +Expected: (3) >= (a[i]), actual: 3 vs 9 +i == 2 +i == 3 +gtest_output_test_.cc:#: Failure +Expected: (3) >= (a[i]), actual: 3 vs 6 +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions +[----------] 6 tests from SCOPED_TRACETest +[ RUN ] SCOPED_TRACETest.ObeysScopes +(expected to fail) +gtest_output_test_.cc:#: Failure +Failed +This failure is expected, and shouldn't have a trace. +gtest_output_test_.cc:#: Failure +Failed +This failure is expected, and should have a trace. +Google Test trace: +gtest_output_test_.cc:#: Expected trace +gtest_output_test_.cc:#: Failure +Failed +This failure is expected, and shouldn't have a trace. +[ FAILED ] SCOPED_TRACETest.ObeysScopes +[ RUN ] SCOPED_TRACETest.WorksInLoop +(expected to fail) +gtest_output_test_.cc:#: Failure +Value of: n + Actual: 1 +Expected: 2 +Google Test trace: +gtest_output_test_.cc:#: i = 1 +gtest_output_test_.cc:#: Failure +Value of: n + Actual: 2 +Expected: 1 +Google Test trace: +gtest_output_test_.cc:#: i = 2 +[ FAILED ] SCOPED_TRACETest.WorksInLoop +[ RUN ] SCOPED_TRACETest.WorksInSubroutine +(expected to fail) +gtest_output_test_.cc:#: Failure +Value of: n + Actual: 1 +Expected: 2 +Google Test trace: +gtest_output_test_.cc:#: n = 1 +gtest_output_test_.cc:#: Failure +Value of: n + Actual: 2 +Expected: 1 +Google Test trace: +gtest_output_test_.cc:#: n = 2 +[ FAILED ] SCOPED_TRACETest.WorksInSubroutine +[ RUN ] SCOPED_TRACETest.CanBeNested +(expected to fail) +gtest_output_test_.cc:#: Failure +Value of: n + Actual: 2 +Expected: 1 +Google Test trace: +gtest_output_test_.cc:#: n = 2 +gtest_output_test_.cc:#: +[ FAILED ] SCOPED_TRACETest.CanBeNested +[ RUN ] SCOPED_TRACETest.CanBeRepeated +(expected to fail) +gtest_output_test_.cc:#: Failure +Failed +This failure is expected, and should contain trace point A. +Google Test trace: +gtest_output_test_.cc:#: A +gtest_output_test_.cc:#: Failure +Failed +This failure is expected, and should contain trace point A and B. +Google Test trace: +gtest_output_test_.cc:#: B +gtest_output_test_.cc:#: A +gtest_output_test_.cc:#: Failure +Failed +This failure is expected, and should contain trace point A, B, and C. +Google Test trace: +gtest_output_test_.cc:#: C +gtest_output_test_.cc:#: B +gtest_output_test_.cc:#: A +gtest_output_test_.cc:#: Failure +Failed +This failure is expected, and should contain trace point A, B, and D. +Google Test trace: +gtest_output_test_.cc:#: D +gtest_output_test_.cc:#: B +gtest_output_test_.cc:#: A +[ FAILED ] SCOPED_TRACETest.CanBeRepeated +[ RUN ] SCOPED_TRACETest.WorksConcurrently +(expecting 6 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected failure #1 (in thread B, only trace B alive). +Google Test trace: +gtest_output_test_.cc:#: Trace B +gtest_output_test_.cc:#: Failure +Failed +Expected failure #2 (in thread A, trace A & B both alive). +Google Test trace: +gtest_output_test_.cc:#: Trace A +gtest_output_test_.cc:#: Failure +Failed +Expected failure #3 (in thread B, trace A & B both alive). +Google Test trace: +gtest_output_test_.cc:#: Trace B +gtest_output_test_.cc:#: Failure +Failed +Expected failure #4 (in thread B, only trace A alive). +gtest_output_test_.cc:#: Failure +Failed +Expected failure #5 (in thread A, only trace A alive). +Google Test trace: +gtest_output_test_.cc:#: Trace A +gtest_output_test_.cc:#: Failure +Failed +Expected failure #6 (in thread A, no trace alive). +[ FAILED ] SCOPED_TRACETest.WorksConcurrently +[----------] 1 test from NonFatalFailureInFixtureConstructorTest +[ RUN ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor +(expecting 5 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected failure #1, in the test fixture c'tor. +gtest_output_test_.cc:#: Failure +Failed +Expected failure #2, in SetUp(). +gtest_output_test_.cc:#: Failure +Failed +Expected failure #3, in the test body. +gtest_output_test_.cc:#: Failure +Failed +Expected failure #4, in TearDown. +gtest_output_test_.cc:#: Failure +Failed +Expected failure #5, in the test fixture d'tor. +[ FAILED ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor +[----------] 1 test from FatalFailureInFixtureConstructorTest +[ RUN ] FatalFailureInFixtureConstructorTest.FailureInConstructor +(expecting 2 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected failure #1, in the test fixture c'tor. +gtest_output_test_.cc:#: Failure +Failed +Expected failure #2, in the test fixture d'tor. +[ FAILED ] FatalFailureInFixtureConstructorTest.FailureInConstructor +[----------] 1 test from NonFatalFailureInSetUpTest +[ RUN ] NonFatalFailureInSetUpTest.FailureInSetUp +(expecting 4 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected failure #1, in SetUp(). +gtest_output_test_.cc:#: Failure +Failed +Expected failure #2, in the test function. +gtest_output_test_.cc:#: Failure +Failed +Expected failure #3, in TearDown(). +gtest_output_test_.cc:#: Failure +Failed +Expected failure #4, in the test fixture d'tor. +[ FAILED ] NonFatalFailureInSetUpTest.FailureInSetUp +[----------] 1 test from FatalFailureInSetUpTest +[ RUN ] FatalFailureInSetUpTest.FailureInSetUp +(expecting 3 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected failure #1, in SetUp(). +gtest_output_test_.cc:#: Failure +Failed +Expected failure #2, in TearDown(). +gtest_output_test_.cc:#: Failure +Failed +Expected failure #3, in the test fixture d'tor. +[ FAILED ] FatalFailureInSetUpTest.FailureInSetUp +[----------] 4 tests from MixedUpTestCaseTest +[ RUN ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo +[ OK ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo +[ RUN ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo +[ OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo +[ RUN ] MixedUpTestCaseTest.ThisShouldFail +gtest.cc:#: Failure +Failed +All tests in the same test case must use the same test fixture +class. However, in test case MixedUpTestCaseTest, +you defined test FirstTestFromNamespaceFoo and test ThisShouldFail +using two different test fixture classes. This can happen if +the two classes are from different namespaces or translation +units and have the same name. You should probably rename one +of the classes to put the tests into different test cases. +[ FAILED ] MixedUpTestCaseTest.ThisShouldFail +[ RUN ] MixedUpTestCaseTest.ThisShouldFailToo +gtest.cc:#: Failure +Failed +All tests in the same test case must use the same test fixture +class. However, in test case MixedUpTestCaseTest, +you defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo +using two different test fixture classes. This can happen if +the two classes are from different namespaces or translation +units and have the same name. You should probably rename one +of the classes to put the tests into different test cases. +[ FAILED ] MixedUpTestCaseTest.ThisShouldFailToo +[----------] 2 tests from MixedUpTestCaseWithSameTestNameTest +[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[ OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +gtest.cc:#: Failure +Failed +All tests in the same test case must use the same test fixture +class. However, in test case MixedUpTestCaseWithSameTestNameTest, +you defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail +using two different test fixture classes. This can happen if +the two classes are from different namespaces or translation +units and have the same name. You should probably rename one +of the classes to put the tests into different test cases. +[ FAILED ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[----------] 2 tests from TEST_F_before_TEST_in_same_test_case +[ RUN ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F +[ OK ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F +[ RUN ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail +gtest.cc:#: Failure +Failed +All tests in the same test case must use the same test fixture +class, so mixing TEST_F and TEST in the same test case is +illegal. In test case TEST_F_before_TEST_in_same_test_case, +test DefinedUsingTEST_F is defined using TEST_F but +test DefinedUsingTESTAndShouldFail is defined using TEST. You probably +want to change the TEST to TEST_F or move it to another test +case. +[ FAILED ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail +[----------] 2 tests from TEST_before_TEST_F_in_same_test_case +[ RUN ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST +[ OK ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST +[ RUN ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail +gtest.cc:#: Failure +Failed +All tests in the same test case must use the same test fixture +class, so mixing TEST_F and TEST in the same test case is +illegal. In test case TEST_before_TEST_F_in_same_test_case, +test DefinedUsingTEST_FAndShouldFail is defined using TEST_F but +test DefinedUsingTEST is defined using TEST. You probably +want to change the TEST to TEST_F or move it to another test +case. +[ FAILED ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail +[----------] 8 tests from ExpectNonfatalFailureTest +[ RUN ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables +[ OK ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables +[ RUN ] ExpectNonfatalFailureTest.CanReferenceLocalVariables +[ OK ] ExpectNonfatalFailureTest.CanReferenceLocalVariables +[ RUN ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure +[ OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure +[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: 0 failures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure +[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: 2 failures +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure 1. + +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure 2. + +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures +[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure +[ RUN ] ExpectNonfatalFailureTest.FailsWhenStatementReturns +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: 0 failures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementReturns +[ RUN ] ExpectNonfatalFailureTest.FailsWhenStatementThrows +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: 0 failures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementThrows +[----------] 8 tests from ExpectFatalFailureTest +[ RUN ] ExpectFatalFailureTest.CanReferenceGlobalVariables +[ OK ] ExpectFatalFailureTest.CanReferenceGlobalVariables +[ RUN ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables +[ OK ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables +[ RUN ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure +[ OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure +[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: 0 failures +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure +[ RUN ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: 2 failures +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures +[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure +[ RUN ] ExpectFatalFailureTest.FailsWhenStatementReturns +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: 0 failures +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns +[ RUN ] ExpectFatalFailureTest.FailsWhenStatementThrows +(expecting a failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: 0 failures +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementThrows +[----------] 2 tests from TypedTest/0, where TypeParam = int +[ RUN ] TypedTest/0.Success +[ OK ] TypedTest/0.Success +[ RUN ] TypedTest/0.Failure +gtest_output_test_.cc:#: Failure +Value of: TypeParam() + Actual: 0 +Expected: 1 +Expected failure +[ FAILED ] TypedTest/0.Failure +[----------] 2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char +[ RUN ] Unsigned/TypedTestP/0.Success +[ OK ] Unsigned/TypedTestP/0.Success +[ RUN ] Unsigned/TypedTestP/0.Failure +gtest_output_test_.cc:#: Failure +Value of: TypeParam() + Actual: \0 +Expected: 1U +Which is: 1 +Expected failure +[ FAILED ] Unsigned/TypedTestP/0.Failure +[----------] 2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int +[ RUN ] Unsigned/TypedTestP/1.Success +[ OK ] Unsigned/TypedTestP/1.Success +[ RUN ] Unsigned/TypedTestP/1.Failure +gtest_output_test_.cc:#: Failure +Value of: TypeParam() + Actual: 0 +Expected: 1U +Which is: 1 +Expected failure +[ FAILED ] Unsigned/TypedTestP/1.Failure +[----------] 4 tests from ExpectFailureTest +[ RUN ] ExpectFailureTest.ExpectFatalFailure +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 fatal failure containing "Some other fatal failure expected." + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectFatalFailure +[ RUN ] ExpectFailureTest.ExpectNonFatalFailure +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure containing "Some other non-fatal failure." + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailure +[ RUN ] ExpectFailureTest.ExpectFatalFailureOnAllThreads +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 fatal failure containing "Some other fatal failure expected." + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectFatalFailureOnAllThreads +[ RUN ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +(expecting 1 failure) +gtest.cc:#: Failure +Expected: 1 non-fatal failure containing "Some other non-fatal failure." + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads +[----------] 2 tests from ExpectFailureWithThreadsTest +[ RUN ] ExpectFailureWithThreadsTest.ExpectFatalFailure +(expecting 2 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected fatal failure. +gtest.cc:#: Failure +Expected: 1 fatal failure + Actual: 0 failures +[ FAILED ] ExpectFailureWithThreadsTest.ExpectFatalFailure +[ RUN ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure +(expecting 2 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected non-fatal failure. +gtest.cc:#: Failure +Expected: 1 non-fatal failure + Actual: 0 failures +[ FAILED ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure +[----------] 1 test from ScopedFakeTestPartResultReporterTest +[ RUN ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread +(expecting 2 failures) +gtest_output_test_.cc:#: Failure +Failed +Expected fatal failure. +gtest_output_test_.cc:#: Failure +Failed +Expected non-fatal failure. +[ FAILED ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread +[----------] Global test environment tear-down +BarEnvironment::TearDown() called. +gtest_output_test_.cc:#: Failure +Failed +Expected non-fatal failure. +FooEnvironment::TearDown() called. +gtest_output_test_.cc:#: Failure +Failed +Expected fatal failure. +[==========] 60 tests from 25 test cases ran. +[ PASSED ] 21 tests. +[ FAILED ] 39 tests, listed below: +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions +[ FAILED ] SCOPED_TRACETest.ObeysScopes +[ FAILED ] SCOPED_TRACETest.WorksInLoop +[ FAILED ] SCOPED_TRACETest.WorksInSubroutine +[ FAILED ] SCOPED_TRACETest.CanBeNested +[ FAILED ] SCOPED_TRACETest.CanBeRepeated +[ FAILED ] SCOPED_TRACETest.WorksConcurrently +[ FAILED ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor +[ FAILED ] FatalFailureInFixtureConstructorTest.FailureInConstructor +[ FAILED ] NonFatalFailureInSetUpTest.FailureInSetUp +[ FAILED ] FatalFailureInSetUpTest.FailureInSetUp +[ FAILED ] MixedUpTestCaseTest.ThisShouldFail +[ FAILED ] MixedUpTestCaseTest.ThisShouldFailToo +[ FAILED ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[ FAILED ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail +[ FAILED ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementReturns +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementThrows +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementThrows +[ FAILED ] TypedTest/0.Failure, where TypeParam = int +[ FAILED ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char +[ FAILED ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int +[ FAILED ] ExpectFailureTest.ExpectFatalFailure +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailure +[ FAILED ] ExpectFailureTest.ExpectFatalFailureOnAllThreads +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads +[ FAILED ] ExpectFailureWithThreadsTest.ExpectFatalFailure +[ FAILED ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure +[ FAILED ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread + +39 FAILED TESTS + YOU HAVE 1 DISABLED TEST + +Note: Google Test filter = FatalFailureTest.*:LoggingTest.* +[==========] Running 4 tests from 2 test cases. +[----------] Global test environment set-up. +[----------] 3 tests from FatalFailureTest +[ RUN ] FatalFailureTest.FatalFailureInSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: Failure +Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine (? ms) +[ RUN ] FatalFailureTest.FatalFailureInNestedSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: Failure +Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms) +[ RUN ] FatalFailureTest.NonfatalFailureInSubroutine +(expecting a failure on false) +gtest_output_test_.cc:#: Failure +Value of: false + Actual: false +Expected: true +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine (? ms) +[----------] 3 tests from FatalFailureTest (? ms total) + +[----------] 1 test from LoggingTest +[ RUN ] LoggingTest.InterleavingLoggingAndAssertions +(expecting 2 failures on (3) >= (a[i])) +i == 0 +i == 1 +gtest_output_test_.cc:#: Failure +Expected: (3) >= (a[i]), actual: 3 vs 9 +i == 2 +i == 3 +gtest_output_test_.cc:#: Failure +Expected: (3) >= (a[i]), actual: 3 vs 6 +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions (? ms) +[----------] 1 test from LoggingTest (? ms total) + +[----------] Global test environment tear-down +[==========] 4 tests from 2 test cases ran. (? ms total) +[ PASSED ] 0 tests. +[ FAILED ] 4 tests, listed below: +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions + + 4 FAILED TESTS + YOU HAVE 1 DISABLED TEST + +Note: Google Test filter = *DISABLED_* +[==========] Running 1 test from 1 test case. +[----------] Global test environment set-up. +[----------] 1 test from DisabledTestsWarningTest +[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning +[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning +[----------] Global test environment tear-down +[==========] 1 test from 1 test case ran. +[ PASSED ] 1 test. +Note: Google Test filter = PassingTest.* +Note: This is test shard 1 of 2. +[==========] Running 1 test from 1 test case. +[----------] Global test environment set-up. +[----------] 1 test from PassingTest +[ RUN ] PassingTest.PassingTest2 +[ OK ] PassingTest.PassingTest2 +[----------] Global test environment tear-down +[==========] 1 test from 1 test case ran. +[ PASSED ] 1 test. + + YOU HAVE 1 DISABLED TEST + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt new file mode 100644 index 000000000..313c3aafc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt @@ -0,0 +1,605 @@ +The non-test part of the code is expected to have 2 failures. + +gtest_output_test_.cc:#: error: Value of: false + Actual: false +Expected: true +gtest_output_test_.cc:#: error: Value of: 3 +Expected: 2 +[==========] Running 61 tests from 27 test cases. +[----------] Global test environment set-up. +FooEnvironment::SetUp() called. +BarEnvironment::SetUp() called. +[----------] 1 test from ADeathTest +[ RUN ] ADeathTest.ShouldRunFirst +[ OK ] ADeathTest.ShouldRunFirst +[----------] 1 test from ATypedDeathTest/0, where TypeParam = int +[ RUN ] ATypedDeathTest/0.ShouldRunFirst +[ OK ] ATypedDeathTest/0.ShouldRunFirst +[----------] 1 test from ATypedDeathTest/1, where TypeParam = double +[ RUN ] ATypedDeathTest/1.ShouldRunFirst +[ OK ] ATypedDeathTest/1.ShouldRunFirst +[----------] 1 test from My/ATypeParamDeathTest/0, where TypeParam = int +[ RUN ] My/ATypeParamDeathTest/0.ShouldRunFirst +[ OK ] My/ATypeParamDeathTest/0.ShouldRunFirst +[----------] 1 test from My/ATypeParamDeathTest/1, where TypeParam = double +[ RUN ] My/ATypeParamDeathTest/1.ShouldRunFirst +[ OK ] My/ATypeParamDeathTest/1.ShouldRunFirst +[----------] 2 tests from PassingTest +[ RUN ] PassingTest.PassingTest1 +[ OK ] PassingTest.PassingTest1 +[ RUN ] PassingTest.PassingTest2 +[ OK ] PassingTest.PassingTest2 +[----------] 3 tests from FatalFailureTest +[ RUN ] FatalFailureTest.FatalFailureInSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: error: Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine +[ RUN ] FatalFailureTest.FatalFailureInNestedSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: error: Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine +[ RUN ] FatalFailureTest.NonfatalFailureInSubroutine +(expecting a failure on false) +gtest_output_test_.cc:#: error: Value of: false + Actual: false +Expected: true +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine +[----------] 1 test from LoggingTest +[ RUN ] LoggingTest.InterleavingLoggingAndAssertions +(expecting 2 failures on (3) >= (a[i])) +i == 0 +i == 1 +gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 9 +i == 2 +i == 3 +gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 6 +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions +[----------] 5 tests from SCOPED_TRACETest +[ RUN ] SCOPED_TRACETest.ObeysScopes +(expected to fail) +gtest_output_test_.cc:#: error: Failed +This failure is expected, and shouldn't have a trace. +gtest_output_test_.cc:#: error: Failed +This failure is expected, and should have a trace. +Google Test trace: +gtest_output_test_.cc:#: Expected trace +gtest_output_test_.cc:#: error: Failed +This failure is expected, and shouldn't have a trace. +[ FAILED ] SCOPED_TRACETest.ObeysScopes +[ RUN ] SCOPED_TRACETest.WorksInLoop +(expected to fail) +gtest_output_test_.cc:#: error: Value of: n + Actual: 1 +Expected: 2 +Google Test trace: +gtest_output_test_.cc:#: i = 1 +gtest_output_test_.cc:#: error: Value of: n + Actual: 2 +Expected: 1 +Google Test trace: +gtest_output_test_.cc:#: i = 2 +[ FAILED ] SCOPED_TRACETest.WorksInLoop +[ RUN ] SCOPED_TRACETest.WorksInSubroutine +(expected to fail) +gtest_output_test_.cc:#: error: Value of: n + Actual: 1 +Expected: 2 +Google Test trace: +gtest_output_test_.cc:#: n = 1 +gtest_output_test_.cc:#: error: Value of: n + Actual: 2 +Expected: 1 +Google Test trace: +gtest_output_test_.cc:#: n = 2 +[ FAILED ] SCOPED_TRACETest.WorksInSubroutine +[ RUN ] SCOPED_TRACETest.CanBeNested +(expected to fail) +gtest_output_test_.cc:#: error: Value of: n + Actual: 2 +Expected: 1 +Google Test trace: +gtest_output_test_.cc:#: n = 2 +gtest_output_test_.cc:#: +[ FAILED ] SCOPED_TRACETest.CanBeNested +[ RUN ] SCOPED_TRACETest.CanBeRepeated +(expected to fail) +gtest_output_test_.cc:#: error: Failed +This failure is expected, and should contain trace point A. +Google Test trace: +gtest_output_test_.cc:#: A +gtest_output_test_.cc:#: error: Failed +This failure is expected, and should contain trace point A and B. +Google Test trace: +gtest_output_test_.cc:#: B +gtest_output_test_.cc:#: A +gtest_output_test_.cc:#: error: Failed +This failure is expected, and should contain trace point A, B, and C. +Google Test trace: +gtest_output_test_.cc:#: C +gtest_output_test_.cc:#: B +gtest_output_test_.cc:#: A +gtest_output_test_.cc:#: error: Failed +This failure is expected, and should contain trace point A, B, and D. +Google Test trace: +gtest_output_test_.cc:#: D +gtest_output_test_.cc:#: B +gtest_output_test_.cc:#: A +[ FAILED ] SCOPED_TRACETest.CanBeRepeated +[----------] 1 test from NonFatalFailureInFixtureConstructorTest +[ RUN ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor +(expecting 5 failures) +gtest_output_test_.cc:#: error: Failed +Expected failure #1, in the test fixture c'tor. +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in SetUp(). +gtest_output_test_.cc:#: error: Failed +Expected failure #3, in the test body. +gtest_output_test_.cc:#: error: Failed +Expected failure #4, in TearDown. +gtest_output_test_.cc:#: error: Failed +Expected failure #5, in the test fixture d'tor. +[ FAILED ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor +[----------] 1 test from FatalFailureInFixtureConstructorTest +[ RUN ] FatalFailureInFixtureConstructorTest.FailureInConstructor +(expecting 2 failures) +gtest_output_test_.cc:#: error: Failed +Expected failure #1, in the test fixture c'tor. +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in the test fixture d'tor. +[ FAILED ] FatalFailureInFixtureConstructorTest.FailureInConstructor +[----------] 1 test from NonFatalFailureInSetUpTest +[ RUN ] NonFatalFailureInSetUpTest.FailureInSetUp +(expecting 4 failures) +gtest_output_test_.cc:#: error: Failed +Expected failure #1, in SetUp(). +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in the test function. +gtest_output_test_.cc:#: error: Failed +Expected failure #3, in TearDown(). +gtest_output_test_.cc:#: error: Failed +Expected failure #4, in the test fixture d'tor. +[ FAILED ] NonFatalFailureInSetUpTest.FailureInSetUp +[----------] 1 test from FatalFailureInSetUpTest +[ RUN ] FatalFailureInSetUpTest.FailureInSetUp +(expecting 3 failures) +gtest_output_test_.cc:#: error: Failed +Expected failure #1, in SetUp(). +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in TearDown(). +gtest_output_test_.cc:#: error: Failed +Expected failure #3, in the test fixture d'tor. +[ FAILED ] FatalFailureInSetUpTest.FailureInSetUp +[----------] 1 test from ExceptionInFixtureCtorTest +[ RUN ] ExceptionInFixtureCtorTest.ExceptionInFixtureCtor +(expecting a failure on thrown exception in the test fixture's constructor) +unknown file: error: Exception thrown with code 0xc0000005 in the test fixture's constructor. +[----------] 1 test from ExceptionInSetUpTest +[ RUN ] ExceptionInSetUpTest.ExceptionInSetUp +(expecting 3 failures) +unknown file: error: Exception thrown with code 0xc0000005 in SetUp(). +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in TearDown(). +gtest_output_test_.cc:#: error: Failed +Expected failure #3, in the test fixture d'tor. +[ FAILED ] ExceptionInSetUpTest.ExceptionInSetUp +[----------] 2 tests from ExceptionInTestFunctionTest +[ RUN ] ExceptionInTestFunctionTest.SEH +(expecting 3 failures) +unknown file: error: Exception thrown with code 0xc0000005 in the test body. +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in TearDown(). +gtest_output_test_.cc:#: error: Failed +Expected failure #3, in the test fixture d'tor. +[ FAILED ] ExceptionInTestFunctionTest.SEH +[ RUN ] ExceptionInTestFunctionTest.CppException +unknown file: error: Exception thrown with code 0xe06d7363 in the test body. +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in TearDown(). +gtest_output_test_.cc:#: error: Failed +Expected failure #3, in the test fixture d'tor. +[ FAILED ] ExceptionInTestFunctionTest.CppException +[----------] 1 test from ExceptionInTearDownTest +[ RUN ] ExceptionInTearDownTest.ExceptionInTearDown +(expecting 2 failures) +unknown file: error: Exception thrown with code 0xe06d7363 in TearDown(). +gtest_output_test_.cc:#: error: Failed +Expected failure #2, in the test fixture d'tor. +[ FAILED ] ExceptionInTearDownTest.ExceptionInTearDown +[----------] 4 tests from MixedUpTestCaseTest +[ RUN ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo +[ OK ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo +[ RUN ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo +[ OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo +[ RUN ] MixedUpTestCaseTest.ThisShouldFail +gtest.cc:#: error: Failed +All tests in the same test case must use the same test fixture +class. However, in test case MixedUpTestCaseTest, +you defined test FirstTestFromNamespaceFoo and test ThisShouldFail +using two different test fixture classes. This can happen if +the two classes are from different namespaces or translation +units and have the same name. You should probably rename one +of the classes to put the tests into different test cases. +[ FAILED ] MixedUpTestCaseTest.ThisShouldFail +[ RUN ] MixedUpTestCaseTest.ThisShouldFailToo +gtest.cc:#: error: Failed +All tests in the same test case must use the same test fixture +class. However, in test case MixedUpTestCaseTest, +you defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo +using two different test fixture classes. This can happen if +the two classes are from different namespaces or translation +units and have the same name. You should probably rename one +of the classes to put the tests into different test cases. +[ FAILED ] MixedUpTestCaseTest.ThisShouldFailToo +[----------] 2 tests from MixedUpTestCaseWithSameTestNameTest +[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[ OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[ RUN ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +gtest.cc:#: error: Failed +All tests in the same test case must use the same test fixture +class. However, in test case MixedUpTestCaseWithSameTestNameTest, +you defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail +using two different test fixture classes. This can happen if +the two classes are from different namespaces or translation +units and have the same name. You should probably rename one +of the classes to put the tests into different test cases. +[ FAILED ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[----------] 2 tests from TEST_F_before_TEST_in_same_test_case +[ RUN ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F +[ OK ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F +[ RUN ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail +gtest.cc:#: error: Failed +All tests in the same test case must use the same test fixture +class, so mixing TEST_F and TEST in the same test case is +illegal. In test case TEST_F_before_TEST_in_same_test_case, +test DefinedUsingTEST_F is defined using TEST_F but +test DefinedUsingTESTAndShouldFail is defined using TEST. You probably +want to change the TEST to TEST_F or move it to another test +case. +[ FAILED ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail +[----------] 2 tests from TEST_before_TEST_F_in_same_test_case +[ RUN ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST +[ OK ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST +[ RUN ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail +gtest.cc:#: error: Failed +All tests in the same test case must use the same test fixture +class, so mixing TEST_F and TEST in the same test case is +illegal. In test case TEST_before_TEST_F_in_same_test_case, +test DefinedUsingTEST_FAndShouldFail is defined using TEST_F but +test DefinedUsingTEST is defined using TEST. You probably +want to change the TEST to TEST_F or move it to another test +case. +[ FAILED ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail +[----------] 8 tests from ExpectNonfatalFailureTest +[ RUN ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables +[ OK ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables +[ RUN ] ExpectNonfatalFailureTest.CanReferenceLocalVariables +[ OK ] ExpectNonfatalFailureTest.CanReferenceLocalVariables +[ RUN ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure +[ OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure +[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure +(expecting a failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: 0 failures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure +[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures +(expecting a failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: 2 failures +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure 1. + +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure 2. + +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures +[ RUN ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure +(expecting a failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure +[ RUN ] ExpectNonfatalFailureTest.FailsWhenStatementReturns +(expecting a failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: 0 failures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementReturns +[ RUN ] ExpectNonfatalFailureTest.FailsWhenStatementThrows +(expecting a failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: 0 failures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementThrows +[----------] 8 tests from ExpectFatalFailureTest +[ RUN ] ExpectFatalFailureTest.CanReferenceGlobalVariables +[ OK ] ExpectFatalFailureTest.CanReferenceGlobalVariables +[ RUN ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables +[ OK ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables +[ RUN ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure +[ OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure +[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure +(expecting a failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: 0 failures +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure +[ RUN ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures +(expecting a failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: 2 failures +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures +[ RUN ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure +(expecting a failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure +[ RUN ] ExpectFatalFailureTest.FailsWhenStatementReturns +(expecting a failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: 0 failures +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns +[ RUN ] ExpectFatalFailureTest.FailsWhenStatementThrows +(expecting a failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: 0 failures +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementThrows +[----------] 2 tests from TypedTest/0, where TypeParam = int +[ RUN ] TypedTest/0.Success +[ OK ] TypedTest/0.Success +[ RUN ] TypedTest/0.Failure +gtest_output_test_.cc:#: error: Value of: TypeParam() + Actual: 0 +Expected: 1 +Expected failure +[ FAILED ] TypedTest/0.Failure +[----------] 2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char +[ RUN ] Unsigned/TypedTestP/0.Success +[ OK ] Unsigned/TypedTestP/0.Success +[ RUN ] Unsigned/TypedTestP/0.Failure +gtest_output_test_.cc:#: error: Value of: TypeParam() + Actual: \0 +Expected: 1U +Which is: 1 +Expected failure +[ FAILED ] Unsigned/TypedTestP/0.Failure +[----------] 2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int +[ RUN ] Unsigned/TypedTestP/1.Success +[ OK ] Unsigned/TypedTestP/1.Success +[ RUN ] Unsigned/TypedTestP/1.Failure +gtest_output_test_.cc:#: error: Value of: TypeParam() + Actual: 0 +Expected: 1U +Which is: 1 +Expected failure +[ FAILED ] Unsigned/TypedTestP/1.Failure +[----------] 4 tests from ExpectFailureTest +[ RUN ] ExpectFailureTest.ExpectFatalFailure +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 fatal failure containing "Some other fatal failure expected." + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectFatalFailure +[ RUN ] ExpectFailureTest.ExpectNonFatalFailure +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 non-fatal failure containing "Some other non-fatal failure." + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailure +[ RUN ] ExpectFailureTest.ExpectFatalFailureOnAllThreads +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 fatal failure + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 fatal failure containing "Some other fatal failure expected." + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectFatalFailureOnAllThreads +[ RUN ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Success: +Succeeded + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 non-fatal failure + Actual: +gtest_output_test_.cc:#: Fatal failure: +Failed +Expected fatal failure. + +(expecting 1 failure) +gtest.cc:#: error: Expected: 1 non-fatal failure containing "Some other non-fatal failure." + Actual: +gtest_output_test_.cc:#: Non-fatal failure: +Failed +Expected non-fatal failure. + +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads +[----------] Global test environment tear-down +BarEnvironment::TearDown() called. +gtest_output_test_.cc:#: error: Failed +Expected non-fatal failure. +FooEnvironment::TearDown() called. +gtest_output_test_.cc:#: error: Failed +Expected fatal failure. +[==========] 61 tests from 27 test cases ran. +[ PASSED ] 21 tests. +[ FAILED ] 40 tests, listed below: +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions +[ FAILED ] SCOPED_TRACETest.ObeysScopes +[ FAILED ] SCOPED_TRACETest.WorksInLoop +[ FAILED ] SCOPED_TRACETest.WorksInSubroutine +[ FAILED ] SCOPED_TRACETest.CanBeNested +[ FAILED ] SCOPED_TRACETest.CanBeRepeated +[ FAILED ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor +[ FAILED ] FatalFailureInFixtureConstructorTest.FailureInConstructor +[ FAILED ] NonFatalFailureInSetUpTest.FailureInSetUp +[ FAILED ] FatalFailureInSetUpTest.FailureInSetUp +[ FAILED ] ExceptionInFixtureCtorTest.ExceptionInFixtureCtor +[ FAILED ] ExceptionInSetUpTest.ExceptionInSetUp +[ FAILED ] ExceptionInTestFunctionTest.SEH +[ FAILED ] ExceptionInTestFunctionTest.CppException +[ FAILED ] ExceptionInTearDownTest.ExceptionInTearDown +[ FAILED ] MixedUpTestCaseTest.ThisShouldFail +[ FAILED ] MixedUpTestCaseTest.ThisShouldFailToo +[ FAILED ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail +[ FAILED ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail +[ FAILED ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementReturns +[ FAILED ] ExpectNonfatalFailureTest.FailsWhenStatementThrows +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures +[ FAILED ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementReturns +[ FAILED ] ExpectFatalFailureTest.FailsWhenStatementThrows +[ FAILED ] TypedTest/0.Failure, where TypeParam = int +[ FAILED ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char +[ FAILED ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int +[ FAILED ] ExpectFailureTest.ExpectFatalFailure +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailure +[ FAILED ] ExpectFailureTest.ExpectFatalFailureOnAllThreads +[ FAILED ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads + +40 FAILED TESTS + YOU HAVE 1 DISABLED TEST + +Note: Google Test filter = FatalFailureTest.*:LoggingTest.* +[==========] Running 4 tests from 2 test cases. +[----------] Global test environment set-up. +[----------] 3 tests from FatalFailureTest +[ RUN ] FatalFailureTest.FatalFailureInSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: error: Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine (? ms) +[ RUN ] FatalFailureTest.FatalFailureInNestedSubroutine +(expecting a failure that x should be 1) +gtest_output_test_.cc:#: error: Value of: x + Actual: 2 +Expected: 1 +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms) +[ RUN ] FatalFailureTest.NonfatalFailureInSubroutine +(expecting a failure on false) +gtest_output_test_.cc:#: error: Value of: false + Actual: false +Expected: true +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine (? ms) +[----------] 3 tests from FatalFailureTest (? ms total) + +[----------] 1 test from LoggingTest +[ RUN ] LoggingTest.InterleavingLoggingAndAssertions +(expecting 2 failures on (3) >= (a[i])) +i == 0 +i == 1 +gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 9 +i == 2 +i == 3 +gtest_output_test_.cc:#: error: Expected: (3) >= (a[i]), actual: 3 vs 6 +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions (? ms) +[----------] 1 test from LoggingTest (? ms total) + +[----------] Global test environment tear-down +[==========] 4 tests from 2 test cases ran. (? ms total) +[ PASSED ] 0 tests. +[ FAILED ] 4 tests, listed below: +[ FAILED ] FatalFailureTest.FatalFailureInSubroutine +[ FAILED ] FatalFailureTest.FatalFailureInNestedSubroutine +[ FAILED ] FatalFailureTest.NonfatalFailureInSubroutine +[ FAILED ] LoggingTest.InterleavingLoggingAndAssertions + + 4 FAILED TESTS + YOU HAVE 1 DISABLED TEST + +Note: Google Test filter = *DISABLED_* +[==========] Running 1 test from 1 test case. +[----------] Global test environment set-up. +[----------] 1 test from DisabledTestsWarningTest +[ RUN ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning +[ OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning +[----------] Global test environment tear-down +[==========] 1 test from 1 test case ran. +[ PASSED ] 1 test. +Note: Google Test filter = PassingTest.* +Note: This is test shard 1 of 2. +[==========] Running 1 test from 1 test case. +[----------] Global test environment set-up. +[----------] 1 test from PassingTest +[ RUN ] PassingTest.PassingTest2 +[ OK ] PassingTest.PassingTest2 +[----------] Global test environment tear-down +[==========] 1 test from 1 test case ran. +[ PASSED ] 1 test. + + YOU HAVE 1 DISABLED TEST + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc new file mode 100644 index 000000000..e7ee54b56 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc @@ -0,0 +1,2432 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is AUTOMATICALLY GENERATED on 10/02/2008 by command +// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! + +// Regression test for gtest_pred_impl.h +// +// This file is generated by a script and quite long. If you intend to +// learn how Google Test works by reading its unit tests, read +// gtest_unittest.cc instead. +// +// This is intended as a regression test for the Google Test predicate +// assertions. We compile it as part of the gtest_unittest target +// only to keep the implementation tidy and compact, as it is quite +// involved to set up the stage for testing Google Test using Google +// Test itself. +// +// Currently, gtest_unittest takes ~11 seconds to run in the testing +// daemon. In the future, if it grows too large and needs much more +// time to finish, we should consider separating this file into a +// stand-alone regression test. + +#include + +#include +#include + +// A user-defined data type. +struct Bool { + explicit Bool(int val) : value(val != 0) {} + + bool operator>(int n) const { return value > Bool(n).value; } + + Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); } + + bool operator==(const Bool& rhs) const { return value == rhs.value; } + + bool value; +}; + +// Enables Bool to be used in assertions. +std::ostream& operator<<(std::ostream& os, const Bool& x) { + return os << (x.value ? "true" : "false"); +} + +// Sample functions/functors for testing unary predicate assertions. + +// A unary predicate function. +template +bool PredFunction1(T1 v1) { + return v1 > 0; +} + +// The following two functions are needed to circumvent a bug in +// gcc 2.95.3, which sometimes has problem with the above template +// function. +bool PredFunction1Int(int v1) { + return v1 > 0; +} +bool PredFunction1Bool(Bool v1) { + return v1 > 0; +} + +// A unary predicate functor. +struct PredFunctor1 { + template + bool operator()(const T1& v1) { + return v1 > 0; + } +}; + +// A unary predicate-formatter function. +template +testing::AssertionResult PredFormatFunction1(const char* e1, + const T1& v1) { + if (PredFunction1(v1)) + return testing::AssertionSuccess(); + + testing::Message msg; + msg << e1 + << " is expected to be positive, but evaluates to " + << v1 << "."; + return testing::AssertionFailure(msg); +} + +// A unary predicate-formatter functor. +struct PredFormatFunctor1 { + template + testing::AssertionResult operator()(const char* e1, + const T1& v1) const { + return PredFormatFunction1(e1, v1); + } +}; + +// Tests for {EXPECT|ASSERT}_PRED_FORMAT1. + +class Predicate1Test : public testing::Test { + protected: + virtual void SetUp() { + expected_to_finish_ = true; + finished_ = false; + n1_ = 0; + } + + virtual void TearDown() { + // Verifies that each of the predicate's arguments was evaluated + // exactly once. + EXPECT_EQ(1, n1_) << + "The predicate assertion didn't evaluate argument 2 " + "exactly once."; + + // Verifies that the control flow in the test function is expected. + if (expected_to_finish_ && !finished_) { + FAIL() << "The predicate assertion unexpactedly aborted the test."; + } else if (!expected_to_finish_ && finished_) { + FAIL() << "The failed predicate assertion didn't abort the test " + "as expected."; + } + } + + // true iff the test function is expected to run to finish. + static bool expected_to_finish_; + + // true iff the test function did run to finish. + static bool finished_; + + static int n1_; +}; + +bool Predicate1Test::expected_to_finish_; +bool Predicate1Test::finished_; +int Predicate1Test::n1_; + +typedef Predicate1Test EXPECT_PRED_FORMAT1Test; +typedef Predicate1Test ASSERT_PRED_FORMAT1Test; +typedef Predicate1Test EXPECT_PRED1Test; +typedef Predicate1Test ASSERT_PRED1Test; + +// Tests a successful EXPECT_PRED1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED1(PredFunction1Int, + ++n1_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED1(PredFunction1Bool, + Bool(++n1_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED1(PredFunctor1(), + ++n1_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED1(PredFunctor1(), + Bool(++n1_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED1(PredFunction1Int, + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED1(PredFunction1Bool, + Bool(n1_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED1(PredFunctor1(), + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED1(PredFunctor1(), + Bool(n1_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED1(PredFunction1Int, + ++n1_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED1(PredFunction1Bool, + Bool(++n1_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED1(PredFunctor1(), + ++n1_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED1(PredFunctor1(), + Bool(++n1_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED1(PredFunction1Int, + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED1(PredFunction1Bool, + Bool(n1_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED1(PredFunctor1(), + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED1(PredFunctor1(), + Bool(n1_++)); + finished_ = true; + }, ""); +} + +// Tests a successful EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT1(PredFormatFunction1, + ++n1_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED_FORMAT1(PredFormatFunction1, + Bool(++n1_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT1(PredFormatFunctor1(), + ++n1_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED_FORMAT1(PredFormatFunctor1(), + Bool(++n1_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT1(PredFormatFunction1, + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT1(PredFormatFunction1, + Bool(n1_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT1(PredFormatFunctor1(), + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT1(PredFormatFunctor1(), + Bool(n1_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT1(PredFormatFunction1, + ++n1_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED_FORMAT1(PredFormatFunction1, + Bool(++n1_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT1(PredFormatFunctor1(), + ++n1_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED_FORMAT1(PredFormatFunctor1(), + Bool(++n1_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT1(PredFormatFunction1, + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT1(PredFormatFunction1, + Bool(n1_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT1(PredFormatFunctor1(), + n1_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT1 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT1(PredFormatFunctor1(), + Bool(n1_++)); + finished_ = true; + }, ""); +} +// Sample functions/functors for testing binary predicate assertions. + +// A binary predicate function. +template +bool PredFunction2(T1 v1, T2 v2) { + return v1 + v2 > 0; +} + +// The following two functions are needed to circumvent a bug in +// gcc 2.95.3, which sometimes has problem with the above template +// function. +bool PredFunction2Int(int v1, int v2) { + return v1 + v2 > 0; +} +bool PredFunction2Bool(Bool v1, Bool v2) { + return v1 + v2 > 0; +} + +// A binary predicate functor. +struct PredFunctor2 { + template + bool operator()(const T1& v1, + const T2& v2) { + return v1 + v2 > 0; + } +}; + +// A binary predicate-formatter function. +template +testing::AssertionResult PredFormatFunction2(const char* e1, + const char* e2, + const T1& v1, + const T2& v2) { + if (PredFunction2(v1, v2)) + return testing::AssertionSuccess(); + + testing::Message msg; + msg << e1 << " + " << e2 + << " is expected to be positive, but evaluates to " + << v1 + v2 << "."; + return testing::AssertionFailure(msg); +} + +// A binary predicate-formatter functor. +struct PredFormatFunctor2 { + template + testing::AssertionResult operator()(const char* e1, + const char* e2, + const T1& v1, + const T2& v2) const { + return PredFormatFunction2(e1, e2, v1, v2); + } +}; + +// Tests for {EXPECT|ASSERT}_PRED_FORMAT2. + +class Predicate2Test : public testing::Test { + protected: + virtual void SetUp() { + expected_to_finish_ = true; + finished_ = false; + n1_ = n2_ = 0; + } + + virtual void TearDown() { + // Verifies that each of the predicate's arguments was evaluated + // exactly once. + EXPECT_EQ(1, n1_) << + "The predicate assertion didn't evaluate argument 2 " + "exactly once."; + EXPECT_EQ(1, n2_) << + "The predicate assertion didn't evaluate argument 3 " + "exactly once."; + + // Verifies that the control flow in the test function is expected. + if (expected_to_finish_ && !finished_) { + FAIL() << "The predicate assertion unexpactedly aborted the test."; + } else if (!expected_to_finish_ && finished_) { + FAIL() << "The failed predicate assertion didn't abort the test " + "as expected."; + } + } + + // true iff the test function is expected to run to finish. + static bool expected_to_finish_; + + // true iff the test function did run to finish. + static bool finished_; + + static int n1_; + static int n2_; +}; + +bool Predicate2Test::expected_to_finish_; +bool Predicate2Test::finished_; +int Predicate2Test::n1_; +int Predicate2Test::n2_; + +typedef Predicate2Test EXPECT_PRED_FORMAT2Test; +typedef Predicate2Test ASSERT_PRED_FORMAT2Test; +typedef Predicate2Test EXPECT_PRED2Test; +typedef Predicate2Test ASSERT_PRED2Test; + +// Tests a successful EXPECT_PRED2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED2(PredFunction2Int, + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED2(PredFunction2Bool, + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED2(PredFunctor2(), + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED2(PredFunctor2(), + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED2(PredFunction2Int, + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED2(PredFunction2Bool, + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED2(PredFunctor2(), + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED2(PredFunctor2(), + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED2(PredFunction2Int, + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED2(PredFunction2Bool, + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED2(PredFunctor2(), + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED2(PredFunctor2(), + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED2(PredFunction2Int, + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED2(PredFunction2Bool, + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED2(PredFunctor2(), + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED2(PredFunctor2(), + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} + +// Tests a successful EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT2(PredFormatFunction2, + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED_FORMAT2(PredFormatFunction2, + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT2(PredFormatFunctor2(), + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED_FORMAT2(PredFormatFunctor2(), + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(PredFormatFunction2, + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(PredFormatFunction2, + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(PredFormatFunctor2(), + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(PredFormatFunctor2(), + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT2(PredFormatFunction2, + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED_FORMAT2(PredFormatFunction2, + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT2(PredFormatFunctor2(), + ++n1_, + ++n2_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED_FORMAT2(PredFormatFunctor2(), + Bool(++n1_), + Bool(++n2_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT2(PredFormatFunction2, + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT2(PredFormatFunction2, + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT2(PredFormatFunctor2(), + n1_++, + n2_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT2 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT2(PredFormatFunctor2(), + Bool(n1_++), + Bool(n2_++)); + finished_ = true; + }, ""); +} +// Sample functions/functors for testing ternary predicate assertions. + +// A ternary predicate function. +template +bool PredFunction3(T1 v1, T2 v2, T3 v3) { + return v1 + v2 + v3 > 0; +} + +// The following two functions are needed to circumvent a bug in +// gcc 2.95.3, which sometimes has problem with the above template +// function. +bool PredFunction3Int(int v1, int v2, int v3) { + return v1 + v2 + v3 > 0; +} +bool PredFunction3Bool(Bool v1, Bool v2, Bool v3) { + return v1 + v2 + v3 > 0; +} + +// A ternary predicate functor. +struct PredFunctor3 { + template + bool operator()(const T1& v1, + const T2& v2, + const T3& v3) { + return v1 + v2 + v3 > 0; + } +}; + +// A ternary predicate-formatter function. +template +testing::AssertionResult PredFormatFunction3(const char* e1, + const char* e2, + const char* e3, + const T1& v1, + const T2& v2, + const T3& v3) { + if (PredFunction3(v1, v2, v3)) + return testing::AssertionSuccess(); + + testing::Message msg; + msg << e1 << " + " << e2 << " + " << e3 + << " is expected to be positive, but evaluates to " + << v1 + v2 + v3 << "."; + return testing::AssertionFailure(msg); +} + +// A ternary predicate-formatter functor. +struct PredFormatFunctor3 { + template + testing::AssertionResult operator()(const char* e1, + const char* e2, + const char* e3, + const T1& v1, + const T2& v2, + const T3& v3) const { + return PredFormatFunction3(e1, e2, e3, v1, v2, v3); + } +}; + +// Tests for {EXPECT|ASSERT}_PRED_FORMAT3. + +class Predicate3Test : public testing::Test { + protected: + virtual void SetUp() { + expected_to_finish_ = true; + finished_ = false; + n1_ = n2_ = n3_ = 0; + } + + virtual void TearDown() { + // Verifies that each of the predicate's arguments was evaluated + // exactly once. + EXPECT_EQ(1, n1_) << + "The predicate assertion didn't evaluate argument 2 " + "exactly once."; + EXPECT_EQ(1, n2_) << + "The predicate assertion didn't evaluate argument 3 " + "exactly once."; + EXPECT_EQ(1, n3_) << + "The predicate assertion didn't evaluate argument 4 " + "exactly once."; + + // Verifies that the control flow in the test function is expected. + if (expected_to_finish_ && !finished_) { + FAIL() << "The predicate assertion unexpactedly aborted the test."; + } else if (!expected_to_finish_ && finished_) { + FAIL() << "The failed predicate assertion didn't abort the test " + "as expected."; + } + } + + // true iff the test function is expected to run to finish. + static bool expected_to_finish_; + + // true iff the test function did run to finish. + static bool finished_; + + static int n1_; + static int n2_; + static int n3_; +}; + +bool Predicate3Test::expected_to_finish_; +bool Predicate3Test::finished_; +int Predicate3Test::n1_; +int Predicate3Test::n2_; +int Predicate3Test::n3_; + +typedef Predicate3Test EXPECT_PRED_FORMAT3Test; +typedef Predicate3Test ASSERT_PRED_FORMAT3Test; +typedef Predicate3Test EXPECT_PRED3Test; +typedef Predicate3Test ASSERT_PRED3Test; + +// Tests a successful EXPECT_PRED3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED3(PredFunction3Int, + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED3(PredFunction3Bool, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED3(PredFunctor3(), + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED3(PredFunctor3(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED3(PredFunction3Int, + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED3(PredFunction3Bool, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED3(PredFunctor3(), + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED3(PredFunctor3(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED3(PredFunction3Int, + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED3(PredFunction3Bool, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED3(PredFunctor3(), + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED3(PredFunctor3(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED3(PredFunction3Int, + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED3(PredFunction3Bool, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED3(PredFunctor3(), + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED3(PredFunctor3(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} + +// Tests a successful EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT3(PredFormatFunction3, + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED_FORMAT3(PredFormatFunction3, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT3(PredFormatFunctor3(), + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED_FORMAT3(PredFormatFunctor3(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT3(PredFormatFunction3, + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT3(PredFormatFunction3, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT3(PredFormatFunctor3(), + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT3(PredFormatFunctor3(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT3(PredFormatFunction3, + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED_FORMAT3(PredFormatFunction3, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT3(PredFormatFunctor3(), + ++n1_, + ++n2_, + ++n3_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED_FORMAT3(PredFormatFunctor3(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT3(PredFormatFunction3, + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT3(PredFormatFunction3, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT3(PredFormatFunctor3(), + n1_++, + n2_++, + n3_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT3 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT3(PredFormatFunctor3(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++)); + finished_ = true; + }, ""); +} +// Sample functions/functors for testing 4-ary predicate assertions. + +// A 4-ary predicate function. +template +bool PredFunction4(T1 v1, T2 v2, T3 v3, T4 v4) { + return v1 + v2 + v3 + v4 > 0; +} + +// The following two functions are needed to circumvent a bug in +// gcc 2.95.3, which sometimes has problem with the above template +// function. +bool PredFunction4Int(int v1, int v2, int v3, int v4) { + return v1 + v2 + v3 + v4 > 0; +} +bool PredFunction4Bool(Bool v1, Bool v2, Bool v3, Bool v4) { + return v1 + v2 + v3 + v4 > 0; +} + +// A 4-ary predicate functor. +struct PredFunctor4 { + template + bool operator()(const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4) { + return v1 + v2 + v3 + v4 > 0; + } +}; + +// A 4-ary predicate-formatter function. +template +testing::AssertionResult PredFormatFunction4(const char* e1, + const char* e2, + const char* e3, + const char* e4, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4) { + if (PredFunction4(v1, v2, v3, v4)) + return testing::AssertionSuccess(); + + testing::Message msg; + msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 + << " is expected to be positive, but evaluates to " + << v1 + v2 + v3 + v4 << "."; + return testing::AssertionFailure(msg); +} + +// A 4-ary predicate-formatter functor. +struct PredFormatFunctor4 { + template + testing::AssertionResult operator()(const char* e1, + const char* e2, + const char* e3, + const char* e4, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4) const { + return PredFormatFunction4(e1, e2, e3, e4, v1, v2, v3, v4); + } +}; + +// Tests for {EXPECT|ASSERT}_PRED_FORMAT4. + +class Predicate4Test : public testing::Test { + protected: + virtual void SetUp() { + expected_to_finish_ = true; + finished_ = false; + n1_ = n2_ = n3_ = n4_ = 0; + } + + virtual void TearDown() { + // Verifies that each of the predicate's arguments was evaluated + // exactly once. + EXPECT_EQ(1, n1_) << + "The predicate assertion didn't evaluate argument 2 " + "exactly once."; + EXPECT_EQ(1, n2_) << + "The predicate assertion didn't evaluate argument 3 " + "exactly once."; + EXPECT_EQ(1, n3_) << + "The predicate assertion didn't evaluate argument 4 " + "exactly once."; + EXPECT_EQ(1, n4_) << + "The predicate assertion didn't evaluate argument 5 " + "exactly once."; + + // Verifies that the control flow in the test function is expected. + if (expected_to_finish_ && !finished_) { + FAIL() << "The predicate assertion unexpactedly aborted the test."; + } else if (!expected_to_finish_ && finished_) { + FAIL() << "The failed predicate assertion didn't abort the test " + "as expected."; + } + } + + // true iff the test function is expected to run to finish. + static bool expected_to_finish_; + + // true iff the test function did run to finish. + static bool finished_; + + static int n1_; + static int n2_; + static int n3_; + static int n4_; +}; + +bool Predicate4Test::expected_to_finish_; +bool Predicate4Test::finished_; +int Predicate4Test::n1_; +int Predicate4Test::n2_; +int Predicate4Test::n3_; +int Predicate4Test::n4_; + +typedef Predicate4Test EXPECT_PRED_FORMAT4Test; +typedef Predicate4Test ASSERT_PRED_FORMAT4Test; +typedef Predicate4Test EXPECT_PRED4Test; +typedef Predicate4Test ASSERT_PRED4Test; + +// Tests a successful EXPECT_PRED4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED4(PredFunction4Int, + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED4(PredFunction4Bool, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED4(PredFunctor4(), + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED4(PredFunctor4(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED4(PredFunction4Int, + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED4(PredFunction4Bool, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED4(PredFunctor4(), + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED4(PredFunctor4(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED4(PredFunction4Int, + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED4(PredFunction4Bool, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED4(PredFunctor4(), + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED4(PredFunctor4(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED4(PredFunction4Int, + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED4(PredFunction4Bool, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED4(PredFunctor4(), + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED4(PredFunctor4(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} + +// Tests a successful EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT4(PredFormatFunction4, + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED_FORMAT4(PredFormatFunction4, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT4(PredFormatFunctor4(), + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED_FORMAT4(PredFormatFunctor4(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT4(PredFormatFunction4, + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT4(PredFormatFunction4, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT4(PredFormatFunctor4(), + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT4(PredFormatFunctor4(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT4(PredFormatFunction4, + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED_FORMAT4(PredFormatFunction4, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT4(PredFormatFunctor4(), + ++n1_, + ++n2_, + ++n3_, + ++n4_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED_FORMAT4(PredFormatFunctor4(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT4(PredFormatFunction4, + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT4(PredFormatFunction4, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT4(PredFormatFunctor4(), + n1_++, + n2_++, + n3_++, + n4_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT4 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT4(PredFormatFunctor4(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++)); + finished_ = true; + }, ""); +} +// Sample functions/functors for testing 5-ary predicate assertions. + +// A 5-ary predicate function. +template +bool PredFunction5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) { + return v1 + v2 + v3 + v4 + v5 > 0; +} + +// The following two functions are needed to circumvent a bug in +// gcc 2.95.3, which sometimes has problem with the above template +// function. +bool PredFunction5Int(int v1, int v2, int v3, int v4, int v5) { + return v1 + v2 + v3 + v4 + v5 > 0; +} +bool PredFunction5Bool(Bool v1, Bool v2, Bool v3, Bool v4, Bool v5) { + return v1 + v2 + v3 + v4 + v5 > 0; +} + +// A 5-ary predicate functor. +struct PredFunctor5 { + template + bool operator()(const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4, + const T5& v5) { + return v1 + v2 + v3 + v4 + v5 > 0; + } +}; + +// A 5-ary predicate-formatter function. +template +testing::AssertionResult PredFormatFunction5(const char* e1, + const char* e2, + const char* e3, + const char* e4, + const char* e5, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4, + const T5& v5) { + if (PredFunction5(v1, v2, v3, v4, v5)) + return testing::AssertionSuccess(); + + testing::Message msg; + msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5 + << " is expected to be positive, but evaluates to " + << v1 + v2 + v3 + v4 + v5 << "."; + return testing::AssertionFailure(msg); +} + +// A 5-ary predicate-formatter functor. +struct PredFormatFunctor5 { + template + testing::AssertionResult operator()(const char* e1, + const char* e2, + const char* e3, + const char* e4, + const char* e5, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4, + const T5& v5) const { + return PredFormatFunction5(e1, e2, e3, e4, e5, v1, v2, v3, v4, v5); + } +}; + +// Tests for {EXPECT|ASSERT}_PRED_FORMAT5. + +class Predicate5Test : public testing::Test { + protected: + virtual void SetUp() { + expected_to_finish_ = true; + finished_ = false; + n1_ = n2_ = n3_ = n4_ = n5_ = 0; + } + + virtual void TearDown() { + // Verifies that each of the predicate's arguments was evaluated + // exactly once. + EXPECT_EQ(1, n1_) << + "The predicate assertion didn't evaluate argument 2 " + "exactly once."; + EXPECT_EQ(1, n2_) << + "The predicate assertion didn't evaluate argument 3 " + "exactly once."; + EXPECT_EQ(1, n3_) << + "The predicate assertion didn't evaluate argument 4 " + "exactly once."; + EXPECT_EQ(1, n4_) << + "The predicate assertion didn't evaluate argument 5 " + "exactly once."; + EXPECT_EQ(1, n5_) << + "The predicate assertion didn't evaluate argument 6 " + "exactly once."; + + // Verifies that the control flow in the test function is expected. + if (expected_to_finish_ && !finished_) { + FAIL() << "The predicate assertion unexpactedly aborted the test."; + } else if (!expected_to_finish_ && finished_) { + FAIL() << "The failed predicate assertion didn't abort the test " + "as expected."; + } + } + + // true iff the test function is expected to run to finish. + static bool expected_to_finish_; + + // true iff the test function did run to finish. + static bool finished_; + + static int n1_; + static int n2_; + static int n3_; + static int n4_; + static int n5_; +}; + +bool Predicate5Test::expected_to_finish_; +bool Predicate5Test::finished_; +int Predicate5Test::n1_; +int Predicate5Test::n2_; +int Predicate5Test::n3_; +int Predicate5Test::n4_; +int Predicate5Test::n5_; + +typedef Predicate5Test EXPECT_PRED_FORMAT5Test; +typedef Predicate5Test ASSERT_PRED_FORMAT5Test; +typedef Predicate5Test EXPECT_PRED5Test; +typedef Predicate5Test ASSERT_PRED5Test; + +// Tests a successful EXPECT_PRED5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED5(PredFunction5Int, + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED5(PredFunction5Bool, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED5(PredFunctor5(), + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED5(PredFunctor5(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED5(PredFunction5Int, + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED5(PredFunction5Bool, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED5(PredFunctor5(), + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED5(PredFunctor5(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED5(PredFunction5Int, + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED5(PredFunction5Bool, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED5(PredFunctor5(), + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED5(PredFunctor5(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED5(PredFunction5Int, + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED5(PredFunction5Bool, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED5(PredFunctor5(), + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED5(PredFunctor5(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} + +// Tests a successful EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT5(PredFormatFunction5, + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) { + EXPECT_PRED_FORMAT5(PredFormatFunction5, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) { + EXPECT_PRED_FORMAT5(PredFormatFunctor5(), + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) { + EXPECT_PRED_FORMAT5(PredFormatFunctor5(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a failed EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT5(PredFormatFunction5, + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT5(PredFormatFunction5, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT5(PredFormatFunctor5(), + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed EXPECT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) { + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT5(PredFormatFunctor5(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} + +// Tests a successful ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT5(PredFormatFunction5, + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) { + ASSERT_PRED_FORMAT5(PredFormatFunction5, + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) { + ASSERT_PRED_FORMAT5(PredFormatFunctor5(), + ++n1_, + ++n2_, + ++n3_, + ++n4_, + ++n5_); + finished_ = true; +} + +// Tests a successful ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) { + ASSERT_PRED_FORMAT5(PredFormatFunctor5(), + Bool(++n1_), + Bool(++n2_), + Bool(++n3_), + Bool(++n4_), + Bool(++n5_)); + finished_ = true; +} + +// Tests a failed ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a function on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT5(PredFormatFunction5, + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a function on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT5(PredFormatFunction5, + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a built-in type (int). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT5(PredFormatFunctor5(), + n1_++, + n2_++, + n3_++, + n4_++, + n5_++); + finished_ = true; + }, ""); +} + +// Tests a failed ASSERT_PRED_FORMAT5 where the +// predicate-formatter is a functor on a user-defined type (Bool). +TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) { + expected_to_finish_ = false; + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT5(PredFormatFunctor5(), + Bool(n1_++), + Bool(n2_++), + Bool(n3_++), + Bool(n4_++), + Bool(n5_++)); + finished_ = true; + }, ""); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc new file mode 100644 index 000000000..bc3201d0f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc @@ -0,0 +1,57 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Unit test for include/gtest/gtest_prod.h. + +#include +#include "test/production.h" + +// Tests that private members can be accessed from a TEST declared as +// a friend of the class. +TEST(PrivateCodeTest, CanAccessPrivateMembers) { + PrivateCode a; + EXPECT_EQ(0, a.x_); + + a.set_x(1); + EXPECT_EQ(1, a.x_); +} + +typedef testing::Test PrivateCodeFixtureTest; + +// Tests that private members can be accessed from a TEST_F declared +// as a friend of the class. +TEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) { + PrivateCode a; + EXPECT_EQ(0, a.x_); + + a.set_x(2); + EXPECT_EQ(2, a.x_); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc new file mode 100644 index 000000000..df6868b83 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc @@ -0,0 +1,253 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Tests the --gtest_repeat=number flag. + +#include +#include +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +namespace testing { + +GTEST_DECLARE_string_(death_test_style); +GTEST_DECLARE_string_(filter); +GTEST_DECLARE_int32_(repeat); + +} // namespace testing + +using testing::GTEST_FLAG(death_test_style); +using testing::GTEST_FLAG(filter); +using testing::GTEST_FLAG(repeat); + +namespace { + +// We need this when we are testing Google Test itself and therefore +// cannot use Google Test assertions. +#define GTEST_CHECK_INT_EQ_(expected, actual) \ + do {\ + const int expected_val = (expected);\ + const int actual_val = (actual);\ + if (::testing::internal::IsTrue(expected_val != actual_val)) {\ + ::std::cout << "Value of: " #actual "\n"\ + << " Actual: " << actual_val << "\n"\ + << "Expected: " #expected "\n"\ + << "Which is: " << expected_val << "\n";\ + abort();\ + }\ + } while(::testing::internal::AlwaysFalse()) + + +// Used for verifying that global environment set-up and tear-down are +// inside the gtest_repeat loop. + +int g_environment_set_up_count = 0; +int g_environment_tear_down_count = 0; + +class MyEnvironment : public testing::Environment { + public: + MyEnvironment() {} + virtual void SetUp() { g_environment_set_up_count++; } + virtual void TearDown() { g_environment_tear_down_count++; } +}; + +// A test that should fail. + +int g_should_fail_count = 0; + +TEST(FooTest, ShouldFail) { + g_should_fail_count++; + EXPECT_EQ(0, 1) << "Expected failure."; +} + +// A test that should pass. + +int g_should_pass_count = 0; + +TEST(FooTest, ShouldPass) { + g_should_pass_count++; +} + +// A test that contains a thread-safe death test and a fast death +// test. It should pass. + +int g_death_test_count = 0; + +TEST(BarDeathTest, ThreadSafeAndFast) { + g_death_test_count++; + + GTEST_FLAG(death_test_style) = "threadsafe"; + EXPECT_DEATH_IF_SUPPORTED(abort(), ""); + + GTEST_FLAG(death_test_style) = "fast"; + EXPECT_DEATH_IF_SUPPORTED(abort(), ""); +} + +#if GTEST_HAS_PARAM_TEST +int g_param_test_count = 0; + +const int kNumberOfParamTests = 10; + +class MyParamTest : public testing::TestWithParam {}; + +TEST_P(MyParamTest, ShouldPass) { + // TODO(vladl@google.com): Make parameter value checking robust + // WRT order of tests. + GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam()); + g_param_test_count++; +} +INSTANTIATE_TEST_CASE_P(MyParamSequence, + MyParamTest, + testing::Range(0, kNumberOfParamTests)); +#endif // GTEST_HAS_PARAM_TEST + +// Resets the count for each test. +void ResetCounts() { + g_environment_set_up_count = 0; + g_environment_tear_down_count = 0; + g_should_fail_count = 0; + g_should_pass_count = 0; + g_death_test_count = 0; +#if GTEST_HAS_PARAM_TEST + g_param_test_count = 0; +#endif // GTEST_HAS_PARAM_TEST +} + +// Checks that the count for each test is expected. +void CheckCounts(int expected) { + GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count); + GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count); + GTEST_CHECK_INT_EQ_(expected, g_should_fail_count); + GTEST_CHECK_INT_EQ_(expected, g_should_pass_count); + GTEST_CHECK_INT_EQ_(expected, g_death_test_count); +#if GTEST_HAS_PARAM_TEST + GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count); +#endif // GTEST_HAS_PARAM_TEST +} + +// Tests the behavior of Google Test when --gtest_repeat is not specified. +void TestRepeatUnspecified() { + ResetCounts(); + GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS()); + CheckCounts(1); +} + +// Tests the behavior of Google Test when --gtest_repeat has the given value. +void TestRepeat(int repeat) { + GTEST_FLAG(repeat) = repeat; + + ResetCounts(); + GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS()); + CheckCounts(repeat); +} + +// Tests using --gtest_repeat when --gtest_filter specifies an empty +// set of tests. +void TestRepeatWithEmptyFilter(int repeat) { + GTEST_FLAG(repeat) = repeat; + GTEST_FLAG(filter) = "None"; + + ResetCounts(); + GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS()); + CheckCounts(0); +} + +// Tests using --gtest_repeat when --gtest_filter specifies a set of +// successful tests. +void TestRepeatWithFilterForSuccessfulTests(int repeat) { + GTEST_FLAG(repeat) = repeat; + GTEST_FLAG(filter) = "*-*ShouldFail"; + + ResetCounts(); + GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS()); + GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count); + GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count); + GTEST_CHECK_INT_EQ_(0, g_should_fail_count); + GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count); + GTEST_CHECK_INT_EQ_(repeat, g_death_test_count); +#if GTEST_HAS_PARAM_TEST + GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count); +#endif // GTEST_HAS_PARAM_TEST +} + +// Tests using --gtest_repeat when --gtest_filter specifies a set of +// failed tests. +void TestRepeatWithFilterForFailedTests(int repeat) { + GTEST_FLAG(repeat) = repeat; + GTEST_FLAG(filter) = "*ShouldFail"; + + ResetCounts(); + GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS()); + GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count); + GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count); + GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count); + GTEST_CHECK_INT_EQ_(0, g_should_pass_count); + GTEST_CHECK_INT_EQ_(0, g_death_test_count); +#if GTEST_HAS_PARAM_TEST + GTEST_CHECK_INT_EQ_(0, g_param_test_count); +#endif // GTEST_HAS_PARAM_TEST +} + +} // namespace + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + testing::AddGlobalTestEnvironment(new MyEnvironment); + + TestRepeatUnspecified(); + TestRepeat(0); + TestRepeat(1); + TestRepeat(5); + + TestRepeatWithEmptyFilter(2); + TestRepeatWithEmptyFilter(3); + + TestRepeatWithFilterForSuccessfulTests(3); + + TestRepeatWithFilterForFailedTests(4); + + // It would be nice to verify that the tests indeed loop forever + // when GTEST_FLAG(repeat) is negative, but this test will be quite + // complicated to write. Since this flag is for interactive + // debugging only and doesn't affect the normal test result, such a + // test would be an overkill. + + printf("PASS\n"); + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py new file mode 100755 index 000000000..30d0303d1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py @@ -0,0 +1,325 @@ +#!/usr/bin/env python +# +# Copyright 2009 Google Inc. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Verifies that test shuffling works.""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import gtest_test_utils + +# Command to run the gtest_shuffle_test_ program. +COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_shuffle_test_') + +# The environment variables for test sharding. +TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS' +SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX' + +TEST_FILTER = 'A*.A:A*.B:C*' + +ALL_TESTS = [] +ACTIVE_TESTS = [] +FILTERED_TESTS = [] +SHARDED_TESTS = [] + +SHUFFLED_ALL_TESTS = [] +SHUFFLED_ACTIVE_TESTS = [] +SHUFFLED_FILTERED_TESTS = [] +SHUFFLED_SHARDED_TESTS = [] + + +def AlsoRunDisabledTestsFlag(): + return '--gtest_also_run_disabled_tests' + + +def FilterFlag(test_filter): + return '--gtest_filter=%s' % (test_filter,) + + +def RepeatFlag(n): + return '--gtest_repeat=%s' % (n,) + + +def ShuffleFlag(): + return '--gtest_shuffle' + + +def RandomSeedFlag(n): + return '--gtest_random_seed=%s' % (n,) + + +def RunAndReturnOutput(extra_env, args): + """Runs the test program and returns its output.""" + + environ_copy = os.environ.copy() + environ_copy.update(extra_env) + + return gtest_test_utils.Subprocess([COMMAND] + args, env=environ_copy).output + + +def GetTestsForAllIterations(extra_env, args): + """Runs the test program and returns a list of test lists. + + Args: + extra_env: a map from environment variables to their values + args: command line flags to pass to gtest_shuffle_test_ + + Returns: + A list where the i-th element is the list of tests run in the i-th + test iteration. + """ + + test_iterations = [] + for line in RunAndReturnOutput(extra_env, args).split('\n'): + if line.startswith('----'): + tests = [] + test_iterations.append(tests) + elif line.strip(): + tests.append(line.strip()) # 'TestCaseName.TestName' + + return test_iterations + + +def GetTestCases(tests): + """Returns a list of test cases in the given full test names. + + Args: + tests: a list of full test names + + Returns: + A list of test cases from 'tests', in their original order. + Consecutive duplicates are removed. + """ + + test_cases = [] + for test in tests: + test_case = test.split('.')[0] + if not test_case in test_cases: + test_cases.append(test_case) + + return test_cases + + +def CalculateTestLists(): + """Calculates the list of tests run under different flags.""" + + if not ALL_TESTS: + ALL_TESTS.extend( + GetTestsForAllIterations({}, [AlsoRunDisabledTestsFlag()])[0]) + + if not ACTIVE_TESTS: + ACTIVE_TESTS.extend(GetTestsForAllIterations({}, [])[0]) + + if not FILTERED_TESTS: + FILTERED_TESTS.extend( + GetTestsForAllIterations({}, [FilterFlag(TEST_FILTER)])[0]) + + if not SHARDED_TESTS: + SHARDED_TESTS.extend( + GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3', + SHARD_INDEX_ENV_VAR: '1'}, + [])[0]) + + if not SHUFFLED_ALL_TESTS: + SHUFFLED_ALL_TESTS.extend(GetTestsForAllIterations( + {}, [AlsoRunDisabledTestsFlag(), ShuffleFlag(), RandomSeedFlag(1)])[0]) + + if not SHUFFLED_ACTIVE_TESTS: + SHUFFLED_ACTIVE_TESTS.extend(GetTestsForAllIterations( + {}, [ShuffleFlag(), RandomSeedFlag(1)])[0]) + + if not SHUFFLED_FILTERED_TESTS: + SHUFFLED_FILTERED_TESTS.extend(GetTestsForAllIterations( + {}, [ShuffleFlag(), RandomSeedFlag(1), FilterFlag(TEST_FILTER)])[0]) + + if not SHUFFLED_SHARDED_TESTS: + SHUFFLED_SHARDED_TESTS.extend( + GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3', + SHARD_INDEX_ENV_VAR: '1'}, + [ShuffleFlag(), RandomSeedFlag(1)])[0]) + + +class GTestShuffleUnitTest(gtest_test_utils.TestCase): + """Tests test shuffling.""" + + def setUp(self): + CalculateTestLists() + + def testShufflePreservesNumberOfTests(self): + self.assertEqual(len(ALL_TESTS), len(SHUFFLED_ALL_TESTS)) + self.assertEqual(len(ACTIVE_TESTS), len(SHUFFLED_ACTIVE_TESTS)) + self.assertEqual(len(FILTERED_TESTS), len(SHUFFLED_FILTERED_TESTS)) + self.assertEqual(len(SHARDED_TESTS), len(SHUFFLED_SHARDED_TESTS)) + + def testShuffleChangesTestOrder(self): + self.assert_(SHUFFLED_ALL_TESTS != ALL_TESTS, SHUFFLED_ALL_TESTS) + self.assert_(SHUFFLED_ACTIVE_TESTS != ACTIVE_TESTS, SHUFFLED_ACTIVE_TESTS) + self.assert_(SHUFFLED_FILTERED_TESTS != FILTERED_TESTS, + SHUFFLED_FILTERED_TESTS) + self.assert_(SHUFFLED_SHARDED_TESTS != SHARDED_TESTS, + SHUFFLED_SHARDED_TESTS) + + def testShuffleChangesTestCaseOrder(self): + self.assert_(GetTestCases(SHUFFLED_ALL_TESTS) != GetTestCases(ALL_TESTS), + GetTestCases(SHUFFLED_ALL_TESTS)) + self.assert_( + GetTestCases(SHUFFLED_ACTIVE_TESTS) != GetTestCases(ACTIVE_TESTS), + GetTestCases(SHUFFLED_ACTIVE_TESTS)) + self.assert_( + GetTestCases(SHUFFLED_FILTERED_TESTS) != GetTestCases(FILTERED_TESTS), + GetTestCases(SHUFFLED_FILTERED_TESTS)) + self.assert_( + GetTestCases(SHUFFLED_SHARDED_TESTS) != GetTestCases(SHARDED_TESTS), + GetTestCases(SHUFFLED_SHARDED_TESTS)) + + def testShuffleDoesNotRepeatTest(self): + for test in SHUFFLED_ALL_TESTS: + self.assertEqual(1, SHUFFLED_ALL_TESTS.count(test), + '%s appears more than once' % (test,)) + for test in SHUFFLED_ACTIVE_TESTS: + self.assertEqual(1, SHUFFLED_ACTIVE_TESTS.count(test), + '%s appears more than once' % (test,)) + for test in SHUFFLED_FILTERED_TESTS: + self.assertEqual(1, SHUFFLED_FILTERED_TESTS.count(test), + '%s appears more than once' % (test,)) + for test in SHUFFLED_SHARDED_TESTS: + self.assertEqual(1, SHUFFLED_SHARDED_TESTS.count(test), + '%s appears more than once' % (test,)) + + def testShuffleDoesNotCreateNewTest(self): + for test in SHUFFLED_ALL_TESTS: + self.assert_(test in ALL_TESTS, '%s is an invalid test' % (test,)) + for test in SHUFFLED_ACTIVE_TESTS: + self.assert_(test in ACTIVE_TESTS, '%s is an invalid test' % (test,)) + for test in SHUFFLED_FILTERED_TESTS: + self.assert_(test in FILTERED_TESTS, '%s is an invalid test' % (test,)) + for test in SHUFFLED_SHARDED_TESTS: + self.assert_(test in SHARDED_TESTS, '%s is an invalid test' % (test,)) + + def testShuffleIncludesAllTests(self): + for test in ALL_TESTS: + self.assert_(test in SHUFFLED_ALL_TESTS, '%s is missing' % (test,)) + for test in ACTIVE_TESTS: + self.assert_(test in SHUFFLED_ACTIVE_TESTS, '%s is missing' % (test,)) + for test in FILTERED_TESTS: + self.assert_(test in SHUFFLED_FILTERED_TESTS, '%s is missing' % (test,)) + for test in SHARDED_TESTS: + self.assert_(test in SHUFFLED_SHARDED_TESTS, '%s is missing' % (test,)) + + def testShuffleLeavesDeathTestsAtFront(self): + non_death_test_found = False + for test in SHUFFLED_ACTIVE_TESTS: + if 'DeathTest.' in test: + self.assert_(not non_death_test_found, + '%s appears after a non-death test' % (test,)) + else: + non_death_test_found = True + + def _VerifyTestCasesDoNotInterleave(self, tests): + test_cases = [] + for test in tests: + [test_case, _] = test.split('.') + if test_cases and test_cases[-1] != test_case: + test_cases.append(test_case) + self.assertEqual(1, test_cases.count(test_case), + 'Test case %s is not grouped together in %s' % + (test_case, tests)) + + def testShuffleDoesNotInterleaveTestCases(self): + self._VerifyTestCasesDoNotInterleave(SHUFFLED_ALL_TESTS) + self._VerifyTestCasesDoNotInterleave(SHUFFLED_ACTIVE_TESTS) + self._VerifyTestCasesDoNotInterleave(SHUFFLED_FILTERED_TESTS) + self._VerifyTestCasesDoNotInterleave(SHUFFLED_SHARDED_TESTS) + + def testShuffleRestoresOrderAfterEachIteration(self): + # Get the test lists in all 3 iterations, using random seed 1, 2, + # and 3 respectively. Google Test picks a different seed in each + # iteration, and this test depends on the current implementation + # picking successive numbers. This dependency is not ideal, but + # makes the test much easier to write. + [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = ( + GetTestsForAllIterations( + {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)])) + + # Make sure running the tests with random seed 1 gets the same + # order as in iteration 1 above. + [tests_with_seed1] = GetTestsForAllIterations( + {}, [ShuffleFlag(), RandomSeedFlag(1)]) + self.assertEqual(tests_in_iteration1, tests_with_seed1) + + # Make sure running the tests with random seed 2 gets the same + # order as in iteration 2 above. Success means that Google Test + # correctly restores the test order before re-shuffling at the + # beginning of iteration 2. + [tests_with_seed2] = GetTestsForAllIterations( + {}, [ShuffleFlag(), RandomSeedFlag(2)]) + self.assertEqual(tests_in_iteration2, tests_with_seed2) + + # Make sure running the tests with random seed 3 gets the same + # order as in iteration 3 above. Success means that Google Test + # correctly restores the test order before re-shuffling at the + # beginning of iteration 3. + [tests_with_seed3] = GetTestsForAllIterations( + {}, [ShuffleFlag(), RandomSeedFlag(3)]) + self.assertEqual(tests_in_iteration3, tests_with_seed3) + + def testShuffleGeneratesNewOrderInEachIteration(self): + [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = ( + GetTestsForAllIterations( + {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)])) + + self.assert_(tests_in_iteration1 != tests_in_iteration2, + tests_in_iteration1) + self.assert_(tests_in_iteration1 != tests_in_iteration3, + tests_in_iteration1) + self.assert_(tests_in_iteration2 != tests_in_iteration3, + tests_in_iteration2) + + def testShuffleShardedTestsPreservesPartition(self): + # If we run M tests on N shards, the same M tests should be run in + # total, regardless of the random seeds used by the shards. + [tests1] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3', + SHARD_INDEX_ENV_VAR: '0'}, + [ShuffleFlag(), RandomSeedFlag(1)]) + [tests2] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3', + SHARD_INDEX_ENV_VAR: '1'}, + [ShuffleFlag(), RandomSeedFlag(20)]) + [tests3] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3', + SHARD_INDEX_ENV_VAR: '2'}, + [ShuffleFlag(), RandomSeedFlag(25)]) + sorted_sharded_tests = tests1 + tests2 + tests3 + sorted_sharded_tests.sort() + sorted_active_tests = [] + sorted_active_tests.extend(ACTIVE_TESTS) + sorted_active_tests.sort() + self.assertEqual(sorted_active_tests, sorted_sharded_tests) + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc new file mode 100644 index 000000000..53ecf7770 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc @@ -0,0 +1,104 @@ +// Copyright 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Verifies that test shuffling works. + +#include + +namespace { + +using ::testing::EmptyTestEventListener; +using ::testing::InitGoogleTest; +using ::testing::Message; +using ::testing::Test; +using ::testing::TestEventListeners; +using ::testing::TestInfo; +using ::testing::UnitTest; +using ::testing::internal::String; +using ::testing::internal::scoped_ptr; + +// The test methods are empty, as the sole purpose of this program is +// to print the test names before/after shuffling. + +class A : public Test {}; +TEST_F(A, A) {} +TEST_F(A, B) {} + +TEST(ADeathTest, A) {} +TEST(ADeathTest, B) {} +TEST(ADeathTest, C) {} + +TEST(B, A) {} +TEST(B, B) {} +TEST(B, C) {} +TEST(B, DISABLED_D) {} +TEST(B, DISABLED_E) {} + +TEST(BDeathTest, A) {} +TEST(BDeathTest, B) {} + +TEST(C, A) {} +TEST(C, B) {} +TEST(C, C) {} +TEST(C, DISABLED_D) {} + +TEST(CDeathTest, A) {} + +TEST(DISABLED_D, A) {} +TEST(DISABLED_D, DISABLED_B) {} + +// This printer prints the full test names only, starting each test +// iteration with a "----" marker. +class TestNamePrinter : public EmptyTestEventListener { + public: + virtual void OnTestIterationStart(const UnitTest& /* unit_test */, + int /* iteration */) { + printf("----\n"); + } + + virtual void OnTestStart(const TestInfo& test_info) { + printf("%s.%s\n", test_info.test_case_name(), test_info.name()); + } +}; + +} // namespace + +int main(int argc, char **argv) { + InitGoogleTest(&argc, argv); + + // Replaces the default printer with TestNamePrinter, which prints + // the test name only. + TestEventListeners& listeners = UnitTest::GetInstance()->listeners(); + delete listeners.Release(listeners.default_result_printer()); + listeners.Append(new TestNamePrinter); + + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc new file mode 100644 index 000000000..de91e800f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc @@ -0,0 +1,57 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: mheule@google.com (Markus Heule) +// +// This test verifies that it's possible to use Google Test by including +// the gtest.h header file alone. + +#include + +namespace { + +void Subroutine() { + EXPECT_EQ(42, 42); +} + +TEST(NoFatalFailureTest, ExpectNoFatalFailure) { + EXPECT_NO_FATAL_FAILURE(;); + EXPECT_NO_FATAL_FAILURE(SUCCEED()); + EXPECT_NO_FATAL_FAILURE(Subroutine()); + EXPECT_NO_FATAL_FAILURE({ SUCCEED(); }); +} + +TEST(NoFatalFailureTest, AssertNoFatalFailure) { + ASSERT_NO_FATAL_FAILURE(;); + ASSERT_NO_FATAL_FAILURE(SUCCEED()); + ASSERT_NO_FATAL_FAILURE(Subroutine()); + ASSERT_NO_FATAL_FAILURE({ SUCCEED(); }); +} + +} // namespace diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc new file mode 100644 index 000000000..f5af78cc6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc @@ -0,0 +1,257 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Tests that SCOPED_TRACE() and various Google Test assertions can be +// used in a large number of threads concurrently. + +#include + +#include +#include + +// We must define this macro in order to #include +// gtest-internal-inl.h. This is how Google Test prevents a user from +// accidentally depending on its internal implementation. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +#if GTEST_IS_THREADSAFE + +namespace testing { +namespace { + +using internal::Notification; +using internal::String; +using internal::TestPropertyKeyIs; +using internal::ThreadWithParam; +using internal::scoped_ptr; + +// In order to run tests in this file, for platforms where Google Test is +// thread safe, implement ThreadWithParam. See the description of its API +// in gtest-port.h, where it is defined for already supported platforms. + +// How many threads to create? +const int kThreadCount = 50; + +String IdToKey(int id, const char* suffix) { + Message key; + key << "key_" << id << "_" << suffix; + return key.GetString(); +} + +String IdToString(int id) { + Message id_message; + id_message << id; + return id_message.GetString(); +} + +void ExpectKeyAndValueWereRecordedForId( + const std::vector& properties, + int id, const char* suffix) { + TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str()); + const std::vector::const_iterator property = + std::find_if(properties.begin(), properties.end(), matches_key); + ASSERT_TRUE(property != properties.end()) + << "expecting " << suffix << " value for id " << id; + EXPECT_STREQ(IdToString(id).c_str(), property->value()); +} + +// Calls a large number of Google Test assertions, where exactly one of them +// will fail. +void ManyAsserts(int id) { + GTEST_LOG_(INFO) << "Thread #" << id << " running..."; + + SCOPED_TRACE(Message() << "Thread #" << id); + + for (int i = 0; i < kThreadCount; i++) { + SCOPED_TRACE(Message() << "Iteration #" << i); + + // A bunch of assertions that should succeed. + EXPECT_TRUE(true); + ASSERT_FALSE(false) << "This shouldn't fail."; + EXPECT_STREQ("a", "a"); + ASSERT_LE(5, 6); + EXPECT_EQ(i, i) << "This shouldn't fail."; + + // RecordProperty() should interact safely with other threads as well. + // The shared_key forces property updates. + Test::RecordProperty(IdToKey(id, "string").c_str(), IdToString(id).c_str()); + Test::RecordProperty(IdToKey(id, "int").c_str(), id); + Test::RecordProperty("shared_key", IdToString(id).c_str()); + + // This assertion should fail kThreadCount times per thread. It + // is for testing whether Google Test can handle failed assertions in a + // multi-threaded context. + EXPECT_LT(i, 0) << "This should always fail."; + } +} + +void CheckTestFailureCount(int expected_failures) { + const TestInfo* const info = UnitTest::GetInstance()->current_test_info(); + const TestResult* const result = info->result(); + GTEST_CHECK_(expected_failures == result->total_part_count()) + << "Logged " << result->total_part_count() << " failures " + << " vs. " << expected_failures << " expected"; +} + +// Tests using SCOPED_TRACE() and Google Test assertions in many threads +// concurrently. +TEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) { + { + scoped_ptr > threads[kThreadCount]; + Notification threads_can_start; + for (int i = 0; i != kThreadCount; i++) + threads[i].reset(new ThreadWithParam(&ManyAsserts, + i, + &threads_can_start)); + + threads_can_start.Notify(); + + // Blocks until all the threads are done. + for (int i = 0; i != kThreadCount; i++) + threads[i]->Join(); + } + + // Ensures that kThreadCount*kThreadCount failures have been reported. + const TestInfo* const info = UnitTest::GetInstance()->current_test_info(); + const TestResult* const result = info->result(); + + std::vector properties; + // We have no access to the TestResult's list of properties but we can + // copy them one by one. + for (int i = 0; i < result->test_property_count(); ++i) + properties.push_back(result->GetTestProperty(i)); + + EXPECT_EQ(kThreadCount * 2 + 1, result->test_property_count()) + << "String and int values recorded on each thread, " + << "as well as one shared_key"; + for (int i = 0; i < kThreadCount; ++i) { + ExpectKeyAndValueWereRecordedForId(properties, i, "string"); + ExpectKeyAndValueWereRecordedForId(properties, i, "int"); + } + CheckTestFailureCount(kThreadCount*kThreadCount); +} + +void FailingThread(bool is_fatal) { + if (is_fatal) + FAIL() << "Fatal failure in some other thread. " + << "(This failure is expected.)"; + else + ADD_FAILURE() << "Non-fatal failure in some other thread. " + << "(This failure is expected.)"; +} + +void GenerateFatalFailureInAnotherThread(bool is_fatal) { + ThreadWithParam thread(&FailingThread, is_fatal, NULL); + thread.Join(); +} + +TEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) { + EXPECT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true)); + // We should only have one failure (the one from + // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE + // should succeed. + CheckTestFailureCount(1); +} + +void AssertNoFatalFailureIgnoresFailuresInOtherThreads() { + ASSERT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true)); +} +TEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) { + // Using a subroutine, to make sure, that the test continues. + AssertNoFatalFailureIgnoresFailuresInOtherThreads(); + // We should only have one failure (the one from + // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE + // should succeed. + CheckTestFailureCount(1); +} + +TEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) { + // This statement should fail, since the current thread doesn't generate a + // fatal failure, only another one does. + EXPECT_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true), "expected"); + CheckTestFailureCount(2); +} + +TEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) { + // This statement should succeed, because failures in all threads are + // considered. + EXPECT_FATAL_FAILURE_ON_ALL_THREADS( + GenerateFatalFailureInAnotherThread(true), "expected"); + CheckTestFailureCount(0); + // We need to add a failure, because main() checks that there are failures. + // But when only this test is run, we shouldn't have any failures. + ADD_FAILURE() << "This is an expected non-fatal failure."; +} + +TEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) { + // This statement should fail, since the current thread doesn't generate a + // fatal failure, only another one does. + EXPECT_NONFATAL_FAILURE(GenerateFatalFailureInAnotherThread(false), + "expected"); + CheckTestFailureCount(2); +} + +TEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) { + // This statement should succeed, because failures in all threads are + // considered. + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS( + GenerateFatalFailureInAnotherThread(false), "expected"); + CheckTestFailureCount(0); + // We need to add a failure, because main() checks that there are failures, + // But when only this test is run, we shouldn't have any failures. + ADD_FAILURE() << "This is an expected non-fatal failure."; +} + +} // namespace +} // namespace testing + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + + const int result = RUN_ALL_TESTS(); // Expected to fail. + GTEST_CHECK_(result == 1) << "RUN_ALL_TESTS() did not fail as expected"; + + printf("\nPASS\n"); + return 0; +} + +#else +TEST(StressTest, + DISABLED_ThreadSafetyTestsAreSkippedWhenGoogleTestIsNotThreadSafe) { +} + +int main(int argc, char **argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} +#endif // GTEST_IS_THREADSAFE diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py new file mode 100755 index 000000000..e0f5973e7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py @@ -0,0 +1,309 @@ +#!/usr/bin/env python +# +# Copyright 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test utilities for Google C++ Testing Framework.""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import atexit +import os +import shutil +import sys +import tempfile +import unittest +_test_module = unittest + +# Suppresses the 'Import not at the top of the file' lint complaint. +# pylint: disable-msg=C6204 +try: + import subprocess + _SUBPROCESS_MODULE_AVAILABLE = True +except: + import popen2 + _SUBPROCESS_MODULE_AVAILABLE = False +# pylint: enable-msg=C6204 + +GTEST_OUTPUT_VAR_NAME = 'GTEST_OUTPUT' + +IS_WINDOWS = os.name == 'nt' +IS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0] + +# Here we expose a class from a particular module, depending on the +# environment. The comment suppresses the 'Invalid variable name' lint +# complaint. +TestCase = _test_module.TestCase # pylint: disable-msg=C6409 + +# Initially maps a flag to its default value. After +# _ParseAndStripGTestFlags() is called, maps a flag to its actual value. +_flag_map = {'gtest_source_dir': os.path.dirname(sys.argv[0]), + 'gtest_build_dir': os.path.dirname(sys.argv[0])} +_gtest_flags_are_parsed = False + + +def _ParseAndStripGTestFlags(argv): + """Parses and strips Google Test flags from argv. This is idempotent.""" + + # Suppresses the lint complaint about a global variable since we need it + # here to maintain module-wide state. + global _gtest_flags_are_parsed # pylint: disable-msg=W0603 + if _gtest_flags_are_parsed: + return + + _gtest_flags_are_parsed = True + for flag in _flag_map: + # The environment variable overrides the default value. + if flag.upper() in os.environ: + _flag_map[flag] = os.environ[flag.upper()] + + # The command line flag overrides the environment variable. + i = 1 # Skips the program name. + while i < len(argv): + prefix = '--' + flag + '=' + if argv[i].startswith(prefix): + _flag_map[flag] = argv[i][len(prefix):] + del argv[i] + break + else: + # We don't increment i in case we just found a --gtest_* flag + # and removed it from argv. + i += 1 + + +def GetFlag(flag): + """Returns the value of the given flag.""" + + # In case GetFlag() is called before Main(), we always call + # _ParseAndStripGTestFlags() here to make sure the --gtest_* flags + # are parsed. + _ParseAndStripGTestFlags(sys.argv) + + return _flag_map[flag] + + +def GetSourceDir(): + """Returns the absolute path of the directory where the .py files are.""" + + return os.path.abspath(GetFlag('gtest_source_dir')) + + +def GetBuildDir(): + """Returns the absolute path of the directory where the test binaries are.""" + + return os.path.abspath(GetFlag('gtest_build_dir')) + + +_temp_dir = None + +def _RemoveTempDir(): + if _temp_dir: + shutil.rmtree(_temp_dir, ignore_errors=True) + +atexit.register(_RemoveTempDir) + + +def GetTempDir(): + """Returns a directory for temporary files.""" + + global _temp_dir + if not _temp_dir: + _temp_dir = tempfile.mkdtemp() + return _temp_dir + + +def GetTestExecutablePath(executable_name, build_dir=None): + """Returns the absolute path of the test binary given its name. + + The function will print a message and abort the program if the resulting file + doesn't exist. + + Args: + executable_name: name of the test binary that the test script runs. + build_dir: directory where to look for executables, by default + the result of GetBuildDir(). + + Returns: + The absolute path of the test binary. + """ + + path = os.path.abspath(os.path.join(build_dir or GetBuildDir(), + executable_name)) + if (IS_WINDOWS or IS_CYGWIN) and not path.endswith('.exe'): + path += '.exe' + + if not os.path.exists(path): + message = ( + 'Unable to find the test binary. Please make sure to provide path\n' + 'to the binary via the --gtest_build_dir flag or the GTEST_BUILD_DIR\n' + 'environment variable. For convenient use, invoke this script via\n' + 'mk_test.py.\n' + # TODO(vladl@google.com): change mk_test.py to test.py after renaming + # the file. + 'Please run mk_test.py -h for help.') + print >> sys.stderr, message + sys.exit(1) + + return path + + +def GetExitStatus(exit_code): + """Returns the argument to exit(), or -1 if exit() wasn't called. + + Args: + exit_code: the result value of os.system(command). + """ + + if os.name == 'nt': + # On Windows, os.WEXITSTATUS() doesn't work and os.system() returns + # the argument to exit() directly. + return exit_code + else: + # On Unix, os.WEXITSTATUS() must be used to extract the exit status + # from the result of os.system(). + if os.WIFEXITED(exit_code): + return os.WEXITSTATUS(exit_code) + else: + return -1 + + +class Subprocess: + def __init__(self, command, working_dir=None, capture_stderr=True, env=None): + """Changes into a specified directory, if provided, and executes a command. + + Restores the old directory afterwards. + + Args: + command: The command to run, in the form of sys.argv. + working_dir: The directory to change into. + capture_stderr: Determines whether to capture stderr in the output member + or to discard it. + env: Dictionary with environment to pass to the subprocess. + + Returns: + An object that represents outcome of the executed process. It has the + following attributes: + terminated_by_signal True iff the child process has been terminated + by a signal. + signal Sygnal that terminated the child process. + exited True iff the child process exited normally. + exit_code The code with which the child process exited. + output Child process's stdout and stderr output + combined in a string. + """ + + # The subprocess module is the preferrable way of running programs + # since it is available and behaves consistently on all platforms, + # including Windows. But it is only available starting in python 2.4. + # In earlier python versions, we revert to the popen2 module, which is + # available in python 2.0 and later but doesn't provide required + # functionality (Popen4) under Windows. This allows us to support Mac + # OS X 10.4 Tiger, which has python 2.3 installed. + if _SUBPROCESS_MODULE_AVAILABLE: + if capture_stderr: + stderr = subprocess.STDOUT + else: + stderr = subprocess.PIPE + + p = subprocess.Popen(command, + stdout=subprocess.PIPE, stderr=stderr, + cwd=working_dir, universal_newlines=True, env=env) + # communicate returns a tuple with the file obect for the child's + # output. + self.output = p.communicate()[0] + self._return_code = p.returncode + else: + old_dir = os.getcwd() + + def _ReplaceEnvDict(dest, src): + # Changes made by os.environ.clear are not inheritable by child + # processes until Python 2.6. To produce inheritable changes we have + # to delete environment items with the del statement. + for key in dest: + del dest[key] + dest.update(src) + + # When 'env' is not None, backup the environment variables and replace + # them with the passed 'env'. When 'env' is None, we simply use the + # current 'os.environ' for compatibility with the subprocess.Popen + # semantics used above. + if env is not None: + old_environ = os.environ.copy() + _ReplaceEnvDict(os.environ, env) + + try: + if working_dir is not None: + os.chdir(working_dir) + if capture_stderr: + p = popen2.Popen4(command) + else: + p = popen2.Popen3(command) + p.tochild.close() + self.output = p.fromchild.read() + ret_code = p.wait() + finally: + os.chdir(old_dir) + + # Restore the old environment variables + # if they were replaced. + if env is not None: + _ReplaceEnvDict(os.environ, old_environ) + + # Converts ret_code to match the semantics of + # subprocess.Popen.returncode. + if os.WIFSIGNALED(ret_code): + self._return_code = -os.WTERMSIG(ret_code) + else: # os.WIFEXITED(ret_code) should return True here. + self._return_code = os.WEXITSTATUS(ret_code) + + if self._return_code < 0: + self.terminated_by_signal = True + self.exited = False + self.signal = -self._return_code + else: + self.terminated_by_signal = False + self.exited = True + self.exit_code = self._return_code + + +def Main(): + """Runs the unit test.""" + + # We must call _ParseAndStripGTestFlags() before calling + # unittest.main(). Otherwise the latter will be confused by the + # --gtest_* flags. + _ParseAndStripGTestFlags(sys.argv) + # The tested binaries should not be writing XML output files unless the + # script explicitly instructs them to. + # TODO(vladl@google.com): Move this into Subprocess when we implement + # passing environment into it as a parameter. + if GTEST_OUTPUT_VAR_NAME in os.environ: + del os.environ[GTEST_OUTPUT_VAR_NAME] + + _test_module.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc new file mode 100644 index 000000000..8bf9dc905 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc @@ -0,0 +1,92 @@ +// Copyright 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Tests Google Test's throw-on-failure mode with exceptions enabled. + +#include + +#include +#include +#include +#include + +// Prints the given failure message and exits the program with +// non-zero. We use this instead of a Google Test assertion to +// indicate a failure, as the latter is been tested and cannot be +// relied on. +void Fail(const char* msg) { + printf("FAILURE: %s\n", msg); + fflush(stdout); + exit(1); +} + +// Tests that an assertion failure throws a subclass of +// std::runtime_error. +void TestFailureThrowsRuntimeError() { + testing::GTEST_FLAG(throw_on_failure) = true; + + // A successful assertion shouldn't throw. + try { + EXPECT_EQ(3, 3); + } catch(...) { + Fail("A successful assertion wrongfully threw."); + } + + // A failed assertion should throw a subclass of std::runtime_error. + try { + EXPECT_EQ(2, 3) << "Expected failure"; + } catch(const std::runtime_error& e) { + if (strstr(e.what(), "Expected failure") != NULL) + return; + + printf("%s", + "A failed assertion did throw an exception of the right type, " + "but the message is incorrect. Instead of containing \"Expected " + "failure\", it is:\n"); + Fail(e.what()); + } catch(...) { + Fail("A failed assertion threw the wrong type of exception."); + } + Fail("A failed assertion should've thrown but didn't."); +} + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + + // We want to ensure that people can use Google Test assertions in + // other testing frameworks, as long as they initialize Google Test + // properly and set the thrown-on-failure mode. Therefore, we don't + // use Google Test's constructs for defining and running tests + // (e.g. TEST and RUN_ALL_TESTS) here. + + TestFailureThrowsRuntimeError(); + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py new file mode 100755 index 000000000..5678ffeaf --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# +# Copyright 2009, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Tests Google Test's throw-on-failure mode with exceptions disabled. + +This script invokes gtest_throw_on_failure_test_ (a program written with +Google Test) with different environments and command line flags. +""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import os +import gtest_test_utils + + +# Constants. + +# The command line flag for enabling/disabling the throw-on-failure mode. +THROW_ON_FAILURE = 'gtest_throw_on_failure' + +# Path to the gtest_throw_on_failure_test_ program, compiled with +# exceptions disabled. +EXE_PATH = gtest_test_utils.GetTestExecutablePath( + 'gtest_throw_on_failure_test_') + + +# Utilities. + + +def SetEnvVar(env_var, value): + """Sets an environment variable to a given value; unsets it when the + given value is None. + """ + + env_var = env_var.upper() + if value is not None: + os.environ[env_var] = value + elif env_var in os.environ: + del os.environ[env_var] + + +def Run(command): + """Runs a command; returns True/False if its exit code is/isn't 0.""" + + print 'Running "%s". . .' % ' '.join(command) + p = gtest_test_utils.Subprocess(command) + return p.exited and p.exit_code == 0 + + +# The tests. TODO(wan@google.com): refactor the class to share common +# logic with code in gtest_break_on_failure_unittest.py. +class ThrowOnFailureTest(gtest_test_utils.TestCase): + """Tests the throw-on-failure mode.""" + + def RunAndVerify(self, env_var_value, flag_value, should_fail): + """Runs gtest_throw_on_failure_test_ and verifies that it does + (or does not) exit with a non-zero code. + + Args: + env_var_value: value of the GTEST_BREAK_ON_FAILURE environment + variable; None if the variable should be unset. + flag_value: value of the --gtest_break_on_failure flag; + None if the flag should not be present. + should_fail: True iff the program is expected to fail. + """ + + SetEnvVar(THROW_ON_FAILURE, env_var_value) + + if env_var_value is None: + env_var_value_msg = ' is not set' + else: + env_var_value_msg = '=' + env_var_value + + if flag_value is None: + flag = '' + elif flag_value == '0': + flag = '--%s=0' % THROW_ON_FAILURE + else: + flag = '--%s' % THROW_ON_FAILURE + + command = [EXE_PATH] + if flag: + command.append(flag) + + if should_fail: + should_or_not = 'should' + else: + should_or_not = 'should not' + + failed = not Run(command) + + SetEnvVar(THROW_ON_FAILURE, None) + + msg = ('when %s%s, an assertion failure in "%s" %s cause a non-zero ' + 'exit code.' % + (THROW_ON_FAILURE, env_var_value_msg, ' '.join(command), + should_or_not)) + self.assert_(failed == should_fail, msg) + + def testDefaultBehavior(self): + """Tests the behavior of the default mode.""" + + self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False) + + def testThrowOnFailureEnvVar(self): + """Tests using the GTEST_THROW_ON_FAILURE environment variable.""" + + self.RunAndVerify(env_var_value='0', + flag_value=None, + should_fail=False) + self.RunAndVerify(env_var_value='1', + flag_value=None, + should_fail=True) + + def testThrowOnFailureFlag(self): + """Tests using the --gtest_throw_on_failure flag.""" + + self.RunAndVerify(env_var_value=None, + flag_value='0', + should_fail=False) + self.RunAndVerify(env_var_value=None, + flag_value='1', + should_fail=True) + + def testThrowOnFailureFlagOverridesEnvVar(self): + """Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE.""" + + self.RunAndVerify(env_var_value='0', + flag_value='0', + should_fail=False) + self.RunAndVerify(env_var_value='0', + flag_value='1', + should_fail=True) + self.RunAndVerify(env_var_value='1', + flag_value='0', + should_fail=False) + self.RunAndVerify(env_var_value='1', + flag_value='1', + should_fail=True) + + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc new file mode 100644 index 000000000..88fbd5a76 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc @@ -0,0 +1,56 @@ +// Copyright 2009, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +// Tests Google Test's throw-on-failure mode with exceptions disabled. +// +// This program must be compiled with exceptions disabled. It will be +// invoked by gtest_throw_on_failure_test.py, and is expected to exit +// with non-zero in the throw-on-failure mode or 0 otherwise. + +#include + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + + // We want to ensure that people can use Google Test assertions in + // other testing frameworks, as long as they initialize Google Test + // properly and set the thrown-on-failure mode. Therefore, we don't + // use Google Test's constructs for defining and running tests + // (e.g. TEST and RUN_ALL_TESTS) here. + + // In the throw-on-failure mode with exceptions disabled, this + // assertion will cause the program to exit with a non-zero code. + EXPECT_EQ(2, 3); + + // When not in the throw-on-failure mode, the control will reach + // here. + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py new file mode 100755 index 000000000..6ae57eeed --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Verifies that Google Test warns the user when not initialized properly.""" + +__author__ = 'wan@google.com (Zhanyong Wan)' + +import gtest_test_utils + + +COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_uninitialized_test_') + + +def Assert(condition): + if not condition: + raise AssertionError + + +def AssertEq(expected, actual): + if expected != actual: + print 'Expected: %s' % (expected,) + print ' Actual: %s' % (actual,) + raise AssertionError + + +def TestExitCodeAndOutput(command): + """Runs the given command and verifies its exit code and output.""" + + # Verifies that 'command' exits with code 1. + p = gtest_test_utils.Subprocess(command) + Assert(p.exited) + AssertEq(1, p.exit_code) + Assert('InitGoogleTest' in p.output) + + +class GTestUninitializedTest(gtest_test_utils.TestCase): + def testExitCodeAndOutput(self): + TestExitCodeAndOutput(COMMAND) + + +if __name__ == '__main__': + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc new file mode 100644 index 000000000..e8b2aa81d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc @@ -0,0 +1,43 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) + +#include + +TEST(DummyTest, Dummy) { + // This test doesn't verify anything. We just need it to create a + // realistic stage for testing the behavior of Google Test when + // RUN_ALL_TESTS() is called without testing::InitGoogleTest() being + // called first. +} + +int main() { + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc new file mode 100644 index 000000000..a14f065a2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc @@ -0,0 +1,6718 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// Tests for Google Test itself. This verifies that the basic constructs of +// Google Test work. + +#include +#include + +// Verifies that the command line flag variables can be accessed +// in code once has been #included. +// Do not move it after other #includes. +TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) { + bool dummy = testing::GTEST_FLAG(also_run_disabled_tests) + || testing::GTEST_FLAG(break_on_failure) + || testing::GTEST_FLAG(catch_exceptions) + || testing::GTEST_FLAG(color) != "unknown" + || testing::GTEST_FLAG(filter) != "unknown" + || testing::GTEST_FLAG(list_tests) + || testing::GTEST_FLAG(output) != "unknown" + || testing::GTEST_FLAG(print_time) + || testing::GTEST_FLAG(random_seed) + || testing::GTEST_FLAG(repeat) > 0 + || testing::GTEST_FLAG(show_internal_stack_frames) + || testing::GTEST_FLAG(shuffle) + || testing::GTEST_FLAG(stack_trace_depth) > 0 + || testing::GTEST_FLAG(throw_on_failure); + EXPECT_TRUE(dummy || !dummy); // Suppresses warning that dummy is unused. +} + +#include + +// Indicates that this translation unit is part of Google Test's +// implementation. It must come before gtest-internal-inl.h is +// included, or there will be a compiler error. This trick is to +// prevent a user from accidentally including gtest-internal-inl.h in +// his code. +#define GTEST_IMPLEMENTATION_ 1 +#include "src/gtest-internal-inl.h" +#undef GTEST_IMPLEMENTATION_ + +#include // For INT_MAX. +#include +#include + +#include + +namespace testing { +namespace internal { + +// Provides access to otherwise private parts of the TestEventListeners class +// that are needed to test it. +class TestEventListenersAccessor { + public: + static TestEventListener* GetRepeater(TestEventListeners* listeners) { + return listeners->repeater(); + } + + static void SetDefaultResultPrinter(TestEventListeners* listeners, + TestEventListener* listener) { + listeners->SetDefaultResultPrinter(listener); + } + static void SetDefaultXmlGenerator(TestEventListeners* listeners, + TestEventListener* listener) { + listeners->SetDefaultXmlGenerator(listener); + } + + static bool EventForwardingEnabled(const TestEventListeners& listeners) { + return listeners.EventForwardingEnabled(); + } + + static void SuppressEventForwarding(TestEventListeners* listeners) { + listeners->SuppressEventForwarding(); + } +}; + +} // namespace internal +} // namespace testing + +using testing::AssertionFailure; +using testing::AssertionResult; +using testing::AssertionSuccess; +using testing::DoubleLE; +using testing::EmptyTestEventListener; +using testing::FloatLE; +using testing::GTEST_FLAG(also_run_disabled_tests); +using testing::GTEST_FLAG(break_on_failure); +using testing::GTEST_FLAG(catch_exceptions); +using testing::GTEST_FLAG(color); +using testing::GTEST_FLAG(death_test_use_fork); +using testing::GTEST_FLAG(filter); +using testing::GTEST_FLAG(list_tests); +using testing::GTEST_FLAG(output); +using testing::GTEST_FLAG(print_time); +using testing::GTEST_FLAG(random_seed); +using testing::GTEST_FLAG(repeat); +using testing::GTEST_FLAG(show_internal_stack_frames); +using testing::GTEST_FLAG(shuffle); +using testing::GTEST_FLAG(stack_trace_depth); +using testing::GTEST_FLAG(throw_on_failure); +using testing::IsNotSubstring; +using testing::IsSubstring; +using testing::Message; +using testing::ScopedFakeTestPartResultReporter; +using testing::StaticAssertTypeEq; +using testing::Test; +using testing::TestEventListeners; +using testing::TestCase; +using testing::TestPartResult; +using testing::TestPartResultArray; +using testing::TestProperty; +using testing::TestResult; +using testing::UnitTest; +using testing::kMaxStackTraceDepth; +using testing::internal::AlwaysFalse; +using testing::internal::AlwaysTrue; +using testing::internal::AppendUserMessage; +using testing::internal::CodePointToUtf8; +using testing::internal::CountIf; +using testing::internal::EqFailure; +using testing::internal::FloatingPoint; +using testing::internal::FormatTimeInMillisAsSeconds; +using testing::internal::ForEach; +using testing::internal::GTestFlagSaver; +using testing::internal::GetCurrentOsStackTraceExceptTop; +using testing::internal::GetElementOr; +using testing::internal::GetNextRandomSeed; +using testing::internal::GetRandomSeedFromFlag; +using testing::internal::GetTestTypeId; +using testing::internal::GetTypeId; +using testing::internal::GetUnitTestImpl; +using testing::internal::Int32; +using testing::internal::Int32FromEnvOrDie; +using testing::internal::ParseInt32Flag; +using testing::internal::ShouldRunTestOnShard; +using testing::internal::ShouldShard; +using testing::internal::ShouldUseColor; +using testing::internal::Shuffle; +using testing::internal::ShuffleRange; +using testing::internal::StreamableToString; +using testing::internal::String; +using testing::internal::TestEventListenersAccessor; +using testing::internal::TestResultAccessor; +using testing::internal::UInt32; +using testing::internal::WideStringToUtf8; +using testing::internal::kMaxRandomSeed; +using testing::internal::kTestTypeIdInGoogleTest; +using testing::internal::scoped_ptr; + +#if GTEST_HAS_STREAM_REDIRECTION_ +using testing::internal::CaptureStdout; +using testing::internal::GetCapturedStdout; +#endif // GTEST_HAS_STREAM_REDIRECTION_ + +#if GTEST_IS_THREADSAFE +using testing::internal::ThreadWithParam; +#endif + +class TestingVector : public std::vector { +}; + +::std::ostream& operator<<(::std::ostream& os, + const TestingVector& vector) { + os << "{ "; + for (size_t i = 0; i < vector.size(); i++) { + os << vector[i] << " "; + } + os << "}"; + return os; +} + +// This line tests that we can define tests in an unnamed namespace. +namespace { + +TEST(GetRandomSeedFromFlagTest, HandlesZero) { + const int seed = GetRandomSeedFromFlag(0); + EXPECT_LE(1, seed); + EXPECT_LE(seed, static_cast(kMaxRandomSeed)); +} + +TEST(GetRandomSeedFromFlagTest, PreservesValidSeed) { + EXPECT_EQ(1, GetRandomSeedFromFlag(1)); + EXPECT_EQ(2, GetRandomSeedFromFlag(2)); + EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1)); + EXPECT_EQ(static_cast(kMaxRandomSeed), + GetRandomSeedFromFlag(kMaxRandomSeed)); +} + +TEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) { + const int seed1 = GetRandomSeedFromFlag(-1); + EXPECT_LE(1, seed1); + EXPECT_LE(seed1, static_cast(kMaxRandomSeed)); + + const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1); + EXPECT_LE(1, seed2); + EXPECT_LE(seed2, static_cast(kMaxRandomSeed)); +} + +TEST(GetNextRandomSeedTest, WorksForValidInput) { + EXPECT_EQ(2, GetNextRandomSeed(1)); + EXPECT_EQ(3, GetNextRandomSeed(2)); + EXPECT_EQ(static_cast(kMaxRandomSeed), + GetNextRandomSeed(kMaxRandomSeed - 1)); + EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed)); + + // We deliberately don't test GetNextRandomSeed() with invalid + // inputs, as that requires death tests, which are expensive. This + // is fine as GetNextRandomSeed() is internal and has a + // straightforward definition. +} + +static void ClearCurrentTestPartResults() { + TestResultAccessor::ClearTestPartResults( + GetUnitTestImpl()->current_test_result()); +} + +// Tests GetTypeId. + +TEST(GetTypeIdTest, ReturnsSameValueForSameType) { + EXPECT_EQ(GetTypeId(), GetTypeId()); + EXPECT_EQ(GetTypeId(), GetTypeId()); +} + +class SubClassOfTest : public Test {}; +class AnotherSubClassOfTest : public Test {}; + +TEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) { + EXPECT_NE(GetTypeId(), GetTypeId()); + EXPECT_NE(GetTypeId(), GetTypeId()); + EXPECT_NE(GetTypeId(), GetTestTypeId()); + EXPECT_NE(GetTypeId(), GetTestTypeId()); + EXPECT_NE(GetTypeId(), GetTestTypeId()); + EXPECT_NE(GetTypeId(), GetTypeId()); +} + +// Verifies that GetTestTypeId() returns the same value, no matter it +// is called from inside Google Test or outside of it. +TEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) { + EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId()); +} + +// Tests FormatTimeInMillisAsSeconds(). + +TEST(FormatTimeInMillisAsSecondsTest, FormatsZero) { + EXPECT_EQ("0", FormatTimeInMillisAsSeconds(0)); +} + +TEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) { + EXPECT_EQ("0.003", FormatTimeInMillisAsSeconds(3)); + EXPECT_EQ("0.01", FormatTimeInMillisAsSeconds(10)); + EXPECT_EQ("0.2", FormatTimeInMillisAsSeconds(200)); + EXPECT_EQ("1.2", FormatTimeInMillisAsSeconds(1200)); + EXPECT_EQ("3", FormatTimeInMillisAsSeconds(3000)); +} + +TEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) { + EXPECT_EQ("-0.003", FormatTimeInMillisAsSeconds(-3)); + EXPECT_EQ("-0.01", FormatTimeInMillisAsSeconds(-10)); + EXPECT_EQ("-0.2", FormatTimeInMillisAsSeconds(-200)); + EXPECT_EQ("-1.2", FormatTimeInMillisAsSeconds(-1200)); + EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000)); +} + +#if GTEST_CAN_COMPARE_NULL + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +#pragma option push -w-ccc -w-rch +#endif + +// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null +// pointer literal. +TEST(NullLiteralTest, IsTrueForNullLiterals) { + EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL)); + EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0)); + EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U)); + EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L)); + EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(false)); +#ifndef __BORLANDC__ + // Some compilers may fail to detect some null pointer literals; + // as long as users of the framework don't use such literals, this + // is harmless. + EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(1 - 1)); + EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(true && false)); +#endif +} + +// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null +// pointer literal. +TEST(NullLiteralTest, IsFalseForNonNullLiterals) { + EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1)); + EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0)); + EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a')); + EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast(NULL))); +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" suppressed them. +#pragma option pop +#endif + +#endif // GTEST_CAN_COMPARE_NULL +// +// Tests CodePointToUtf8(). + +// Tests that the NUL character L'\0' is encoded correctly. +TEST(CodePointToUtf8Test, CanEncodeNul) { + char buffer[32]; + EXPECT_STREQ("", CodePointToUtf8(L'\0', buffer)); +} + +// Tests that ASCII characters are encoded correctly. +TEST(CodePointToUtf8Test, CanEncodeAscii) { + char buffer[32]; + EXPECT_STREQ("a", CodePointToUtf8(L'a', buffer)); + EXPECT_STREQ("Z", CodePointToUtf8(L'Z', buffer)); + EXPECT_STREQ("&", CodePointToUtf8(L'&', buffer)); + EXPECT_STREQ("\x7F", CodePointToUtf8(L'\x7F', buffer)); +} + +// Tests that Unicode code-points that have 8 to 11 bits are encoded +// as 110xxxxx 10xxxxxx. +TEST(CodePointToUtf8Test, CanEncode8To11Bits) { + char buffer[32]; + // 000 1101 0011 => 110-00011 10-010011 + EXPECT_STREQ("\xC3\x93", CodePointToUtf8(L'\xD3', buffer)); + + // 101 0111 0110 => 110-10101 10-110110 + EXPECT_STREQ("\xD5\xB6", CodePointToUtf8(L'\x576', buffer)); +} + +// Tests that Unicode code-points that have 12 to 16 bits are encoded +// as 1110xxxx 10xxxxxx 10xxxxxx. +TEST(CodePointToUtf8Test, CanEncode12To16Bits) { + char buffer[32]; + // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011 + EXPECT_STREQ("\xE0\xA3\x93", CodePointToUtf8(L'\x8D3', buffer)); + + // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101 + EXPECT_STREQ("\xEC\x9D\x8D", CodePointToUtf8(L'\xC74D', buffer)); +} + +#if !GTEST_WIDE_STRING_USES_UTF16_ +// Tests in this group require a wchar_t to hold > 16 bits, and thus +// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is +// 16-bit wide. This code may not compile on those systems. + +// Tests that Unicode code-points that have 17 to 21 bits are encoded +// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. +TEST(CodePointToUtf8Test, CanEncode17To21Bits) { + char buffer[32]; + // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011 + EXPECT_STREQ("\xF0\x90\xA3\x93", CodePointToUtf8(L'\x108D3', buffer)); + + // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000 + EXPECT_STREQ("\xF0\x90\x90\x80", CodePointToUtf8(L'\x10400', buffer)); + + // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100 + EXPECT_STREQ("\xF4\x88\x98\xB4", CodePointToUtf8(L'\x108634', buffer)); +} + +// Tests that encoding an invalid code-point generates the expected result. +TEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) { + char buffer[32]; + EXPECT_STREQ("(Invalid Unicode 0x1234ABCD)", + CodePointToUtf8(L'\x1234ABCD', buffer)); +} + +#endif // !GTEST_WIDE_STRING_USES_UTF16_ + +// Tests WideStringToUtf8(). + +// Tests that the NUL character L'\0' is encoded correctly. +TEST(WideStringToUtf8Test, CanEncodeNul) { + EXPECT_STREQ("", WideStringToUtf8(L"", 0).c_str()); + EXPECT_STREQ("", WideStringToUtf8(L"", -1).c_str()); +} + +// Tests that ASCII strings are encoded correctly. +TEST(WideStringToUtf8Test, CanEncodeAscii) { + EXPECT_STREQ("a", WideStringToUtf8(L"a", 1).c_str()); + EXPECT_STREQ("ab", WideStringToUtf8(L"ab", 2).c_str()); + EXPECT_STREQ("a", WideStringToUtf8(L"a", -1).c_str()); + EXPECT_STREQ("ab", WideStringToUtf8(L"ab", -1).c_str()); +} + +// Tests that Unicode code-points that have 8 to 11 bits are encoded +// as 110xxxxx 10xxxxxx. +TEST(WideStringToUtf8Test, CanEncode8To11Bits) { + // 000 1101 0011 => 110-00011 10-010011 + EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", 1).c_str()); + EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", -1).c_str()); + + // 101 0111 0110 => 110-10101 10-110110 + EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(L"\x576", 1).c_str()); + EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(L"\x576", -1).c_str()); +} + +// Tests that Unicode code-points that have 12 to 16 bits are encoded +// as 1110xxxx 10xxxxxx 10xxxxxx. +TEST(WideStringToUtf8Test, CanEncode12To16Bits) { + // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011 + EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(L"\x8D3", 1).c_str()); + EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(L"\x8D3", -1).c_str()); + + // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101 + EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(L"\xC74D", 1).c_str()); + EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(L"\xC74D", -1).c_str()); +} + +// Tests that the conversion stops when the function encounters \0 character. +TEST(WideStringToUtf8Test, StopsOnNulCharacter) { + EXPECT_STREQ("ABC", WideStringToUtf8(L"ABC\0XYZ", 100).c_str()); +} + +// Tests that the conversion stops when the function reaches the limit +// specified by the 'length' parameter. +TEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) { + EXPECT_STREQ("ABC", WideStringToUtf8(L"ABCDEF", 3).c_str()); +} + + +#if !GTEST_WIDE_STRING_USES_UTF16_ +// Tests that Unicode code-points that have 17 to 21 bits are encoded +// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile +// on the systems using UTF-16 encoding. +TEST(WideStringToUtf8Test, CanEncode17To21Bits) { + // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011 + EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", 1).c_str()); + EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", -1).c_str()); + + // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100 + EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", 1).c_str()); + EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", -1).c_str()); +} + +// Tests that encoding an invalid code-point generates the expected result. +TEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) { + EXPECT_STREQ("(Invalid Unicode 0xABCDFF)", + WideStringToUtf8(L"\xABCDFF", -1).c_str()); +} +#else // !GTEST_WIDE_STRING_USES_UTF16_ +// Tests that surrogate pairs are encoded correctly on the systems using +// UTF-16 encoding in the wide strings. +TEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) { + EXPECT_STREQ("\xF0\x90\x90\x80", + WideStringToUtf8(L"\xD801\xDC00", -1).c_str()); +} + +// Tests that encoding an invalid UTF-16 surrogate pair +// generates the expected result. +TEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) { + // Leading surrogate is at the end of the string. + EXPECT_STREQ("\xED\xA0\x80", WideStringToUtf8(L"\xD800", -1).c_str()); + // Leading surrogate is not followed by the trailing surrogate. + EXPECT_STREQ("\xED\xA0\x80$", WideStringToUtf8(L"\xD800$", -1).c_str()); + // Trailing surrogate appearas without a leading surrogate. + EXPECT_STREQ("\xED\xB0\x80PQR", WideStringToUtf8(L"\xDC00PQR", -1).c_str()); +} +#endif // !GTEST_WIDE_STRING_USES_UTF16_ + +// Tests that codepoint concatenation works correctly. +#if !GTEST_WIDE_STRING_USES_UTF16_ +TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) { + EXPECT_STREQ( + "\xF4\x88\x98\xB4" + "\xEC\x9D\x8D" + "\n" + "\xD5\xB6" + "\xE0\xA3\x93" + "\xF4\x88\x98\xB4", + WideStringToUtf8(L"\x108634\xC74D\n\x576\x8D3\x108634", -1).c_str()); +} +#else +TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) { + EXPECT_STREQ( + "\xEC\x9D\x8D" "\n" "\xD5\xB6" "\xE0\xA3\x93", + WideStringToUtf8(L"\xC74D\n\x576\x8D3", -1).c_str()); +} +#endif // !GTEST_WIDE_STRING_USES_UTF16_ + +// Tests the Random class. + +TEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) { + testing::internal::Random random(42); + EXPECT_DEATH_IF_SUPPORTED( + random.Generate(0), + "Cannot generate a number in the range \\[0, 0\\)"); + EXPECT_DEATH_IF_SUPPORTED( + random.Generate(testing::internal::Random::kMaxRange + 1), + "Generation of a number in \\[0, 2147483649\\) was requested, " + "but this can only generate numbers in \\[0, 2147483648\\)"); +} + +TEST(RandomTest, GeneratesNumbersWithinRange) { + const UInt32 kRange = 10000; + testing::internal::Random random(12345); + for (int i = 0; i < 10; i++) { + EXPECT_LT(random.Generate(kRange), kRange) << " for iteration " << i; + } + + testing::internal::Random random2(testing::internal::Random::kMaxRange); + for (int i = 0; i < 10; i++) { + EXPECT_LT(random2.Generate(kRange), kRange) << " for iteration " << i; + } +} + +TEST(RandomTest, RepeatsWhenReseeded) { + const int kSeed = 123; + const int kArraySize = 10; + const UInt32 kRange = 10000; + UInt32 values[kArraySize]; + + testing::internal::Random random(kSeed); + for (int i = 0; i < kArraySize; i++) { + values[i] = random.Generate(kRange); + } + + random.Reseed(kSeed); + for (int i = 0; i < kArraySize; i++) { + EXPECT_EQ(values[i], random.Generate(kRange)) << " for iteration " << i; + } +} + +// Tests STL container utilities. + +// Tests CountIf(). + +static bool IsPositive(int n) { return n > 0; } + +TEST(ContainerUtilityTest, CountIf) { + std::vector v; + EXPECT_EQ(0, CountIf(v, IsPositive)); // Works for an empty container. + + v.push_back(-1); + v.push_back(0); + EXPECT_EQ(0, CountIf(v, IsPositive)); // Works when no value satisfies. + + v.push_back(2); + v.push_back(-10); + v.push_back(10); + EXPECT_EQ(2, CountIf(v, IsPositive)); +} + +// Tests ForEach(). + +static int g_sum = 0; +static void Accumulate(int n) { g_sum += n; } + +TEST(ContainerUtilityTest, ForEach) { + std::vector v; + g_sum = 0; + ForEach(v, Accumulate); + EXPECT_EQ(0, g_sum); // Works for an empty container; + + g_sum = 0; + v.push_back(1); + ForEach(v, Accumulate); + EXPECT_EQ(1, g_sum); // Works for a container with one element. + + g_sum = 0; + v.push_back(20); + v.push_back(300); + ForEach(v, Accumulate); + EXPECT_EQ(321, g_sum); +} + +// Tests GetElementOr(). +TEST(ContainerUtilityTest, GetElementOr) { + std::vector a; + EXPECT_EQ('x', GetElementOr(a, 0, 'x')); + + a.push_back('a'); + a.push_back('b'); + EXPECT_EQ('a', GetElementOr(a, 0, 'x')); + EXPECT_EQ('b', GetElementOr(a, 1, 'x')); + EXPECT_EQ('x', GetElementOr(a, -2, 'x')); + EXPECT_EQ('x', GetElementOr(a, 2, 'x')); +} + +TEST(ContainerUtilityDeathTest, ShuffleRange) { + std::vector a; + a.push_back(0); + a.push_back(1); + a.push_back(2); + testing::internal::Random random(1); + + EXPECT_DEATH_IF_SUPPORTED( + ShuffleRange(&random, -1, 1, &a), + "Invalid shuffle range start -1: must be in range \\[0, 3\\]"); + EXPECT_DEATH_IF_SUPPORTED( + ShuffleRange(&random, 4, 4, &a), + "Invalid shuffle range start 4: must be in range \\[0, 3\\]"); + EXPECT_DEATH_IF_SUPPORTED( + ShuffleRange(&random, 3, 2, &a), + "Invalid shuffle range finish 2: must be in range \\[3, 3\\]"); + EXPECT_DEATH_IF_SUPPORTED( + ShuffleRange(&random, 3, 4, &a), + "Invalid shuffle range finish 4: must be in range \\[3, 3\\]"); +} + +class VectorShuffleTest : public Test { + protected: + static const int kVectorSize = 20; + + VectorShuffleTest() : random_(1) { + for (int i = 0; i < kVectorSize; i++) { + vector_.push_back(i); + } + } + + static bool VectorIsCorrupt(const TestingVector& vector) { + if (kVectorSize != static_cast(vector.size())) { + return true; + } + + bool found_in_vector[kVectorSize] = { false }; + for (size_t i = 0; i < vector.size(); i++) { + const int e = vector[i]; + if (e < 0 || e >= kVectorSize || found_in_vector[e]) { + return true; + } + found_in_vector[e] = true; + } + + // Vector size is correct, elements' range is correct, no + // duplicate elements. Therefore no corruption has occurred. + return false; + } + + static bool VectorIsNotCorrupt(const TestingVector& vector) { + return !VectorIsCorrupt(vector); + } + + static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) { + for (int i = begin; i < end; i++) { + if (i != vector[i]) { + return true; + } + } + return false; + } + + static bool RangeIsUnshuffled( + const TestingVector& vector, int begin, int end) { + return !RangeIsShuffled(vector, begin, end); + } + + static bool VectorIsShuffled(const TestingVector& vector) { + return RangeIsShuffled(vector, 0, static_cast(vector.size())); + } + + static bool VectorIsUnshuffled(const TestingVector& vector) { + return !VectorIsShuffled(vector); + } + + testing::internal::Random random_; + TestingVector vector_; +}; // class VectorShuffleTest + +const int VectorShuffleTest::kVectorSize; + +TEST_F(VectorShuffleTest, HandlesEmptyRange) { + // Tests an empty range at the beginning... + ShuffleRange(&random_, 0, 0, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsUnshuffled, vector_); + + // ...in the middle... + ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsUnshuffled, vector_); + + // ...at the end... + ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsUnshuffled, vector_); + + // ...and past the end. + ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsUnshuffled, vector_); +} + +TEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) { + // Tests a size one range at the beginning... + ShuffleRange(&random_, 0, 1, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsUnshuffled, vector_); + + // ...in the middle... + ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsUnshuffled, vector_); + + // ...and at the end. + ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsUnshuffled, vector_); +} + +// Because we use our own random number generator and a fixed seed, +// we can guarantee that the following "random" tests will succeed. + +TEST_F(VectorShuffleTest, ShufflesEntireVector) { + Shuffle(&random_, &vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_; + + // Tests the first and last elements in particular to ensure that + // there are no off-by-one problems in our shuffle algorithm. + EXPECT_NE(0, vector_[0]); + EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]); +} + +TEST_F(VectorShuffleTest, ShufflesStartOfVector) { + const int kRangeSize = kVectorSize/2; + + ShuffleRange(&random_, 0, kRangeSize, &vector_); + + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize); + EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize); +} + +TEST_F(VectorShuffleTest, ShufflesEndOfVector) { + const int kRangeSize = kVectorSize / 2; + ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_); + + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize); + EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize); +} + +TEST_F(VectorShuffleTest, ShufflesMiddleOfVector) { + int kRangeSize = kVectorSize/3; + ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_); + + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize); + EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize); + EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize); +} + +TEST_F(VectorShuffleTest, ShufflesRepeatably) { + TestingVector vector2; + for (int i = 0; i < kVectorSize; i++) { + vector2.push_back(i); + } + + random_.Reseed(1234); + Shuffle(&random_, &vector_); + random_.Reseed(1234); + Shuffle(&random_, &vector2); + + ASSERT_PRED1(VectorIsNotCorrupt, vector_); + ASSERT_PRED1(VectorIsNotCorrupt, vector2); + + for (int i = 0; i < kVectorSize; i++) { + EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i; + } +} + +// Tests the size of the AssertHelper class. + +TEST(AssertHelperTest, AssertHelperIsSmall) { + // To avoid breaking clients that use lots of assertions in one + // function, we cannot grow the size of AssertHelper. + EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*)); +} + +// Tests the String class. + +// Tests String's constructors. +TEST(StringTest, Constructors) { + // Default ctor. + String s1; + // We aren't using EXPECT_EQ(NULL, s1.c_str()) because comparing + // pointers with NULL isn't supported on all platforms. + EXPECT_EQ(0U, s1.length()); + EXPECT_TRUE(NULL == s1.c_str()); + + // Implicitly constructs from a C-string. + String s2 = "Hi"; + EXPECT_EQ(2U, s2.length()); + EXPECT_STREQ("Hi", s2.c_str()); + + // Constructs from a C-string and a length. + String s3("hello", 3); + EXPECT_EQ(3U, s3.length()); + EXPECT_STREQ("hel", s3.c_str()); + + // The empty String should be created when String is constructed with + // a NULL pointer and length 0. + EXPECT_EQ(0U, String(NULL, 0).length()); + EXPECT_FALSE(String(NULL, 0).c_str() == NULL); + + // Constructs a String that contains '\0'. + String s4("a\0bcd", 4); + EXPECT_EQ(4U, s4.length()); + EXPECT_EQ('a', s4.c_str()[0]); + EXPECT_EQ('\0', s4.c_str()[1]); + EXPECT_EQ('b', s4.c_str()[2]); + EXPECT_EQ('c', s4.c_str()[3]); + + // Copy ctor where the source is NULL. + const String null_str; + String s5 = null_str; + EXPECT_TRUE(s5.c_str() == NULL); + + // Copy ctor where the source isn't NULL. + String s6 = s3; + EXPECT_EQ(3U, s6.length()); + EXPECT_STREQ("hel", s6.c_str()); + + // Copy ctor where the source contains '\0'. + String s7 = s4; + EXPECT_EQ(4U, s7.length()); + EXPECT_EQ('a', s7.c_str()[0]); + EXPECT_EQ('\0', s7.c_str()[1]); + EXPECT_EQ('b', s7.c_str()[2]); + EXPECT_EQ('c', s7.c_str()[3]); +} + +TEST(StringTest, ConvertsFromStdString) { + // An empty std::string. + const std::string src1(""); + const String dest1 = src1; + EXPECT_EQ(0U, dest1.length()); + EXPECT_STREQ("", dest1.c_str()); + + // A normal std::string. + const std::string src2("Hi"); + const String dest2 = src2; + EXPECT_EQ(2U, dest2.length()); + EXPECT_STREQ("Hi", dest2.c_str()); + + // An std::string with an embedded NUL character. + const char src3[] = "a\0b"; + const String dest3 = std::string(src3, sizeof(src3)); + EXPECT_EQ(sizeof(src3), dest3.length()); + EXPECT_EQ('a', dest3.c_str()[0]); + EXPECT_EQ('\0', dest3.c_str()[1]); + EXPECT_EQ('b', dest3.c_str()[2]); +} + +TEST(StringTest, ConvertsToStdString) { + // An empty String. + const String src1(""); + const std::string dest1 = src1; + EXPECT_EQ("", dest1); + + // A normal String. + const String src2("Hi"); + const std::string dest2 = src2; + EXPECT_EQ("Hi", dest2); + + // A String containing a '\0'. + const String src3("x\0y", 3); + const std::string dest3 = src3; + EXPECT_EQ(std::string("x\0y", 3), dest3); +} + +#if GTEST_HAS_GLOBAL_STRING + +TEST(StringTest, ConvertsFromGlobalString) { + // An empty ::string. + const ::string src1(""); + const String dest1 = src1; + EXPECT_EQ(0U, dest1.length()); + EXPECT_STREQ("", dest1.c_str()); + + // A normal ::string. + const ::string src2("Hi"); + const String dest2 = src2; + EXPECT_EQ(2U, dest2.length()); + EXPECT_STREQ("Hi", dest2.c_str()); + + // An ::string with an embedded NUL character. + const char src3[] = "x\0y"; + const String dest3 = ::string(src3, sizeof(src3)); + EXPECT_EQ(sizeof(src3), dest3.length()); + EXPECT_EQ('x', dest3.c_str()[0]); + EXPECT_EQ('\0', dest3.c_str()[1]); + EXPECT_EQ('y', dest3.c_str()[2]); +} + +TEST(StringTest, ConvertsToGlobalString) { + // An empty String. + const String src1(""); + const ::string dest1 = src1; + EXPECT_EQ("", dest1); + + // A normal String. + const String src2("Hi"); + const ::string dest2 = src2; + EXPECT_EQ("Hi", dest2); + + const String src3("x\0y", 3); + const ::string dest3 = src3; + EXPECT_EQ(::string("x\0y", 3), dest3); +} + +#endif // GTEST_HAS_GLOBAL_STRING + +// Tests String::ShowCStringQuoted(). +TEST(StringTest, ShowCStringQuoted) { + EXPECT_STREQ("(null)", + String::ShowCStringQuoted(NULL).c_str()); + EXPECT_STREQ("\"\"", + String::ShowCStringQuoted("").c_str()); + EXPECT_STREQ("\"foo\"", + String::ShowCStringQuoted("foo").c_str()); +} + +// Tests String::empty(). +TEST(StringTest, Empty) { + EXPECT_TRUE(String("").empty()); + EXPECT_FALSE(String().empty()); + EXPECT_FALSE(String(NULL).empty()); + EXPECT_FALSE(String("a").empty()); + EXPECT_FALSE(String("\0", 1).empty()); +} + +// Tests String::Compare(). +TEST(StringTest, Compare) { + // NULL vs NULL. + EXPECT_EQ(0, String().Compare(String())); + + // NULL vs non-NULL. + EXPECT_EQ(-1, String().Compare(String(""))); + + // Non-NULL vs NULL. + EXPECT_EQ(1, String("").Compare(String())); + + // The following covers non-NULL vs non-NULL. + + // "" vs "". + EXPECT_EQ(0, String("").Compare(String(""))); + + // "" vs non-"". + EXPECT_EQ(-1, String("").Compare(String("\0", 1))); + EXPECT_EQ(-1, String("").Compare(" ")); + + // Non-"" vs "". + EXPECT_EQ(1, String("a").Compare(String(""))); + + // The following covers non-"" vs non-"". + + // Same length and equal. + EXPECT_EQ(0, String("a").Compare(String("a"))); + + // Same length and different. + EXPECT_EQ(-1, String("a\0b", 3).Compare(String("a\0c", 3))); + EXPECT_EQ(1, String("b").Compare(String("a"))); + + // Different lengths. + EXPECT_EQ(-1, String("a").Compare(String("ab"))); + EXPECT_EQ(-1, String("a").Compare(String("a\0", 2))); + EXPECT_EQ(1, String("abc").Compare(String("aacd"))); +} + +// Tests String::operator==(). +TEST(StringTest, Equals) { + const String null(NULL); + EXPECT_TRUE(null == NULL); // NOLINT + EXPECT_FALSE(null == ""); // NOLINT + EXPECT_FALSE(null == "bar"); // NOLINT + + const String empty(""); + EXPECT_FALSE(empty == NULL); // NOLINT + EXPECT_TRUE(empty == ""); // NOLINT + EXPECT_FALSE(empty == "bar"); // NOLINT + + const String foo("foo"); + EXPECT_FALSE(foo == NULL); // NOLINT + EXPECT_FALSE(foo == ""); // NOLINT + EXPECT_FALSE(foo == "bar"); // NOLINT + EXPECT_TRUE(foo == "foo"); // NOLINT + + const String bar("x\0y", 3); + EXPECT_FALSE(bar == "x"); +} + +// Tests String::operator!=(). +TEST(StringTest, NotEquals) { + const String null(NULL); + EXPECT_FALSE(null != NULL); // NOLINT + EXPECT_TRUE(null != ""); // NOLINT + EXPECT_TRUE(null != "bar"); // NOLINT + + const String empty(""); + EXPECT_TRUE(empty != NULL); // NOLINT + EXPECT_FALSE(empty != ""); // NOLINT + EXPECT_TRUE(empty != "bar"); // NOLINT + + const String foo("foo"); + EXPECT_TRUE(foo != NULL); // NOLINT + EXPECT_TRUE(foo != ""); // NOLINT + EXPECT_TRUE(foo != "bar"); // NOLINT + EXPECT_FALSE(foo != "foo"); // NOLINT + + const String bar("x\0y", 3); + EXPECT_TRUE(bar != "x"); +} + +// Tests String::length(). +TEST(StringTest, Length) { + EXPECT_EQ(0U, String().length()); + EXPECT_EQ(0U, String("").length()); + EXPECT_EQ(2U, String("ab").length()); + EXPECT_EQ(3U, String("a\0b", 3).length()); +} + +// Tests String::EndsWith(). +TEST(StringTest, EndsWith) { + EXPECT_TRUE(String("foobar").EndsWith("bar")); + EXPECT_TRUE(String("foobar").EndsWith("")); + EXPECT_TRUE(String("").EndsWith("")); + + EXPECT_FALSE(String("foobar").EndsWith("foo")); + EXPECT_FALSE(String("").EndsWith("foo")); +} + +// Tests String::EndsWithCaseInsensitive(). +TEST(StringTest, EndsWithCaseInsensitive) { + EXPECT_TRUE(String("foobar").EndsWithCaseInsensitive("BAR")); + EXPECT_TRUE(String("foobaR").EndsWithCaseInsensitive("bar")); + EXPECT_TRUE(String("foobar").EndsWithCaseInsensitive("")); + EXPECT_TRUE(String("").EndsWithCaseInsensitive("")); + + EXPECT_FALSE(String("Foobar").EndsWithCaseInsensitive("foo")); + EXPECT_FALSE(String("foobar").EndsWithCaseInsensitive("Foo")); + EXPECT_FALSE(String("").EndsWithCaseInsensitive("foo")); +} + +// C++Builder's preprocessor is buggy; it fails to expand macros that +// appear in macro parameters after wide char literals. Provide an alias +// for NULL as a workaround. +static const wchar_t* const kNull = NULL; + +// Tests String::CaseInsensitiveWideCStringEquals +TEST(StringTest, CaseInsensitiveWideCStringEquals) { + EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL)); + EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"")); + EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"", kNull)); + EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"foobar")); + EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"foobar", kNull)); + EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"foobar")); + EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"FOOBAR")); + EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"FOOBAR", L"foobar")); +} + +// Tests that NULL can be assigned to a String. +TEST(StringTest, CanBeAssignedNULL) { + const String src(NULL); + String dest; + + dest = src; + EXPECT_STREQ(NULL, dest.c_str()); +} + +// Tests that the empty string "" can be assigned to a String. +TEST(StringTest, CanBeAssignedEmpty) { + const String src(""); + String dest; + + dest = src; + EXPECT_STREQ("", dest.c_str()); +} + +// Tests that a non-empty string can be assigned to a String. +TEST(StringTest, CanBeAssignedNonEmpty) { + const String src("hello"); + String dest; + dest = src; + EXPECT_EQ(5U, dest.length()); + EXPECT_STREQ("hello", dest.c_str()); + + const String src2("x\0y", 3); + String dest2; + dest2 = src2; + EXPECT_EQ(3U, dest2.length()); + EXPECT_EQ('x', dest2.c_str()[0]); + EXPECT_EQ('\0', dest2.c_str()[1]); + EXPECT_EQ('y', dest2.c_str()[2]); +} + +// Tests that a String can be assigned to itself. +TEST(StringTest, CanBeAssignedSelf) { + String dest("hello"); + + dest = dest; + EXPECT_STREQ("hello", dest.c_str()); +} + +// Sun Studio < 12 incorrectly rejects this code due to an overloading +// ambiguity. +#if !(defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590) +// Tests streaming a String. +TEST(StringTest, Streams) { + EXPECT_EQ(StreamableToString(String()), "(null)"); + EXPECT_EQ(StreamableToString(String("")), ""); + EXPECT_EQ(StreamableToString(String("a\0b", 3)), "a\\0b"); +} +#endif + +// Tests that String::Format() works. +TEST(StringTest, FormatWorks) { + // Normal case: the format spec is valid, the arguments match the + // spec, and the result is < 4095 characters. + EXPECT_STREQ("Hello, 42", String::Format("%s, %d", "Hello", 42).c_str()); + + // Edge case: the result is 4095 characters. + char buffer[4096]; + const size_t kSize = sizeof(buffer); + memset(buffer, 'a', kSize - 1); + buffer[kSize - 1] = '\0'; + EXPECT_STREQ(buffer, String::Format("%s", buffer).c_str()); + + // The result needs to be 4096 characters, exceeding Format()'s limit. + EXPECT_STREQ("", + String::Format("x%s", buffer).c_str()); + +#if GTEST_OS_LINUX + // On Linux, invalid format spec should lead to an error message. + // In other environment (e.g. MSVC on Windows), String::Format() may + // simply ignore a bad format spec, so this assertion is run on + // Linux only. + EXPECT_STREQ("", + String::Format("%").c_str()); +#endif +} + +#if GTEST_OS_WINDOWS + +// Tests String::ShowWideCString(). +TEST(StringTest, ShowWideCString) { + EXPECT_STREQ("(null)", + String::ShowWideCString(NULL).c_str()); + EXPECT_STREQ("", String::ShowWideCString(L"").c_str()); + EXPECT_STREQ("foo", String::ShowWideCString(L"foo").c_str()); +} + +// Tests String::ShowWideCStringQuoted(). +TEST(StringTest, ShowWideCStringQuoted) { + EXPECT_STREQ("(null)", + String::ShowWideCStringQuoted(NULL).c_str()); + EXPECT_STREQ("L\"\"", + String::ShowWideCStringQuoted(L"").c_str()); + EXPECT_STREQ("L\"foo\"", + String::ShowWideCStringQuoted(L"foo").c_str()); +} + +#if GTEST_OS_WINDOWS_MOBILE +TEST(StringTest, AnsiAndUtf16Null) { + EXPECT_EQ(NULL, String::AnsiToUtf16(NULL)); + EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL)); +} + +TEST(StringTest, AnsiAndUtf16ConvertBasic) { + const char* ansi = String::Utf16ToAnsi(L"str"); + EXPECT_STREQ("str", ansi); + delete [] ansi; + const WCHAR* utf16 = String::AnsiToUtf16("str"); + EXPECT_EQ(0, wcsncmp(L"str", utf16, 3)); + delete [] utf16; +} + +TEST(StringTest, AnsiAndUtf16ConvertPathChars) { + const char* ansi = String::Utf16ToAnsi(L".:\\ \"*?"); + EXPECT_STREQ(".:\\ \"*?", ansi); + delete [] ansi; + const WCHAR* utf16 = String::AnsiToUtf16(".:\\ \"*?"); + EXPECT_EQ(0, wcsncmp(L".:\\ \"*?", utf16, 3)); + delete [] utf16; +} +#endif // GTEST_OS_WINDOWS_MOBILE + +#endif // GTEST_OS_WINDOWS + +// Tests TestProperty construction. +TEST(TestPropertyTest, StringValue) { + TestProperty property("key", "1"); + EXPECT_STREQ("key", property.key()); + EXPECT_STREQ("1", property.value()); +} + +// Tests TestProperty replacing a value. +TEST(TestPropertyTest, ReplaceStringValue) { + TestProperty property("key", "1"); + EXPECT_STREQ("1", property.value()); + property.SetValue("2"); + EXPECT_STREQ("2", property.value()); +} + +// AddFatalFailure() and AddNonfatalFailure() must be stand-alone +// functions (i.e. their definitions cannot be inlined at the call +// sites), or C++Builder won't compile the code. +static void AddFatalFailure() { + FAIL() << "Expected fatal failure."; +} + +static void AddNonfatalFailure() { + ADD_FAILURE() << "Expected non-fatal failure."; +} + +class ScopedFakeTestPartResultReporterTest : public Test { + public: // Must be public and not protected due to a bug in g++ 3.4.2. + enum FailureMode { + FATAL_FAILURE, + NONFATAL_FAILURE + }; + static void AddFailure(FailureMode failure) { + if (failure == FATAL_FAILURE) { + AddFatalFailure(); + } else { + AddNonfatalFailure(); + } + } +}; + +// Tests that ScopedFakeTestPartResultReporter intercepts test +// failures. +TEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) { + TestPartResultArray results; + { + ScopedFakeTestPartResultReporter reporter( + ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD, + &results); + AddFailure(NONFATAL_FAILURE); + AddFailure(FATAL_FAILURE); + } + + EXPECT_EQ(2, results.size()); + EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed()); + EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed()); +} + +TEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) { + TestPartResultArray results; + { + // Tests, that the deprecated constructor still works. + ScopedFakeTestPartResultReporter reporter(&results); + AddFailure(NONFATAL_FAILURE); + } + EXPECT_EQ(1, results.size()); +} + +#if GTEST_IS_THREADSAFE + +class ScopedFakeTestPartResultReporterWithThreadsTest + : public ScopedFakeTestPartResultReporterTest { + protected: + static void AddFailureInOtherThread(FailureMode failure) { + ThreadWithParam thread(&AddFailure, failure, NULL); + thread.Join(); + } +}; + +TEST_F(ScopedFakeTestPartResultReporterWithThreadsTest, + InterceptsTestFailuresInAllThreads) { + TestPartResultArray results; + { + ScopedFakeTestPartResultReporter reporter( + ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results); + AddFailure(NONFATAL_FAILURE); + AddFailure(FATAL_FAILURE); + AddFailureInOtherThread(NONFATAL_FAILURE); + AddFailureInOtherThread(FATAL_FAILURE); + } + + EXPECT_EQ(4, results.size()); + EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed()); + EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed()); + EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed()); + EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed()); +} + +#endif // GTEST_IS_THREADSAFE + +// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}. Makes sure that they +// work even if the failure is generated in a called function rather than +// the current context. + +typedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest; + +TEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) { + EXPECT_FATAL_FAILURE(AddFatalFailure(), "Expected fatal failure."); +} + +TEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) { + // We have another test below to verify that the macro catches fatal + // failures generated on another thread. + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(), + "Expected fatal failure."); +} + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true" +#pragma option push -w-ccc +#endif + +// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void +// function even when the statement in it contains ASSERT_*. + +int NonVoidFunction() { + EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), ""); + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), ""); + return 0; +} + +TEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) { + NonVoidFunction(); +} + +// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the +// current function even though 'statement' generates a fatal failure. + +void DoesNotAbortHelper(bool* aborted) { + EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), ""); + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), ""); + + *aborted = false; +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" suppressed them. +#pragma option pop +#endif + +TEST_F(ExpectFatalFailureTest, DoesNotAbort) { + bool aborted = true; + DoesNotAbortHelper(&aborted); + EXPECT_FALSE(aborted); +} + +// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a +// statement that contains a macro which expands to code containing an +// unprotected comma. + +static int global_var = 0; +#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++ + +TEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) { +#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x600 + // ICE's in C++Builder 2007. + EXPECT_FATAL_FAILURE({ + GTEST_USE_UNPROTECTED_COMMA_; + AddFatalFailure(); + }, ""); +#endif + + EXPECT_FATAL_FAILURE_ON_ALL_THREADS({ + GTEST_USE_UNPROTECTED_COMMA_; + AddFatalFailure(); + }, ""); +} + +// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}. + +typedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest; + +TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) { + EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(), + "Expected non-fatal failure."); +} + +TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) { + // We have another test below to verify that the macro catches + // non-fatal failures generated on another thread. + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(), + "Expected non-fatal failure."); +} + +// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a +// statement that contains a macro which expands to code containing an +// unprotected comma. +TEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) { + EXPECT_NONFATAL_FAILURE({ + GTEST_USE_UNPROTECTED_COMMA_; + AddNonfatalFailure(); + }, ""); + + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({ + GTEST_USE_UNPROTECTED_COMMA_; + AddNonfatalFailure(); + }, ""); +} + +#if GTEST_IS_THREADSAFE + +typedef ScopedFakeTestPartResultReporterWithThreadsTest + ExpectFailureWithThreadsTest; + +TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) { + EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE), + "Expected fatal failure."); +} + +TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) { + EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS( + AddFailureInOtherThread(NONFATAL_FAILURE), "Expected non-fatal failure."); +} + +#endif // GTEST_IS_THREADSAFE + +// Tests the TestProperty class. + +TEST(TestPropertyTest, ConstructorWorks) { + const TestProperty property("key", "value"); + EXPECT_STREQ("key", property.key()); + EXPECT_STREQ("value", property.value()); +} + +TEST(TestPropertyTest, SetValue) { + TestProperty property("key", "value_1"); + EXPECT_STREQ("key", property.key()); + property.SetValue("value_2"); + EXPECT_STREQ("key", property.key()); + EXPECT_STREQ("value_2", property.value()); +} + +// Tests the TestResult class + +// The test fixture for testing TestResult. +class TestResultTest : public Test { + protected: + typedef std::vector TPRVector; + + // We make use of 2 TestPartResult objects, + TestPartResult * pr1, * pr2; + + // ... and 3 TestResult objects. + TestResult * r0, * r1, * r2; + + virtual void SetUp() { + // pr1 is for success. + pr1 = new TestPartResult(TestPartResult::kSuccess, + "foo/bar.cc", + 10, + "Success!"); + + // pr2 is for fatal failure. + pr2 = new TestPartResult(TestPartResult::kFatalFailure, + "foo/bar.cc", + -1, // This line number means "unknown" + "Failure!"); + + // Creates the TestResult objects. + r0 = new TestResult(); + r1 = new TestResult(); + r2 = new TestResult(); + + // In order to test TestResult, we need to modify its internal + // state, in particular the TestPartResult vector it holds. + // test_part_results() returns a const reference to this vector. + // We cast it to a non-const object s.t. it can be modified (yes, + // this is a hack). + TPRVector* results1 = const_cast( + &TestResultAccessor::test_part_results(*r1)); + TPRVector* results2 = const_cast( + &TestResultAccessor::test_part_results(*r2)); + + // r0 is an empty TestResult. + + // r1 contains a single SUCCESS TestPartResult. + results1->push_back(*pr1); + + // r2 contains a SUCCESS, and a FAILURE. + results2->push_back(*pr1); + results2->push_back(*pr2); + } + + virtual void TearDown() { + delete pr1; + delete pr2; + + delete r0; + delete r1; + delete r2; + } + + // Helper that compares two two TestPartResults. + static void CompareTestPartResult(const TestPartResult& expected, + const TestPartResult& actual) { + EXPECT_EQ(expected.type(), actual.type()); + EXPECT_STREQ(expected.file_name(), actual.file_name()); + EXPECT_EQ(expected.line_number(), actual.line_number()); + EXPECT_STREQ(expected.summary(), actual.summary()); + EXPECT_STREQ(expected.message(), actual.message()); + EXPECT_EQ(expected.passed(), actual.passed()); + EXPECT_EQ(expected.failed(), actual.failed()); + EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed()); + EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed()); + } +}; + +// Tests TestResult::total_part_count(). +TEST_F(TestResultTest, total_part_count) { + ASSERT_EQ(0, r0->total_part_count()); + ASSERT_EQ(1, r1->total_part_count()); + ASSERT_EQ(2, r2->total_part_count()); +} + +// Tests TestResult::Passed(). +TEST_F(TestResultTest, Passed) { + ASSERT_TRUE(r0->Passed()); + ASSERT_TRUE(r1->Passed()); + ASSERT_FALSE(r2->Passed()); +} + +// Tests TestResult::Failed(). +TEST_F(TestResultTest, Failed) { + ASSERT_FALSE(r0->Failed()); + ASSERT_FALSE(r1->Failed()); + ASSERT_TRUE(r2->Failed()); +} + +// Tests TestResult::GetTestPartResult(). + +typedef TestResultTest TestResultDeathTest; + +TEST_F(TestResultDeathTest, GetTestPartResult) { + CompareTestPartResult(*pr1, r2->GetTestPartResult(0)); + CompareTestPartResult(*pr2, r2->GetTestPartResult(1)); + EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), ""); + EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), ""); +} + +// Tests TestResult has no properties when none are added. +TEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) { + TestResult test_result; + ASSERT_EQ(0, test_result.test_property_count()); +} + +// Tests TestResult has the expected property when added. +TEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) { + TestResult test_result; + TestProperty property("key_1", "1"); + TestResultAccessor::RecordProperty(&test_result, property); + ASSERT_EQ(1, test_result.test_property_count()); + const TestProperty& actual_property = test_result.GetTestProperty(0); + EXPECT_STREQ("key_1", actual_property.key()); + EXPECT_STREQ("1", actual_property.value()); +} + +// Tests TestResult has multiple properties when added. +TEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) { + TestResult test_result; + TestProperty property_1("key_1", "1"); + TestProperty property_2("key_2", "2"); + TestResultAccessor::RecordProperty(&test_result, property_1); + TestResultAccessor::RecordProperty(&test_result, property_2); + ASSERT_EQ(2, test_result.test_property_count()); + const TestProperty& actual_property_1 = test_result.GetTestProperty(0); + EXPECT_STREQ("key_1", actual_property_1.key()); + EXPECT_STREQ("1", actual_property_1.value()); + + const TestProperty& actual_property_2 = test_result.GetTestProperty(1); + EXPECT_STREQ("key_2", actual_property_2.key()); + EXPECT_STREQ("2", actual_property_2.value()); +} + +// Tests TestResult::RecordProperty() overrides values for duplicate keys. +TEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) { + TestResult test_result; + TestProperty property_1_1("key_1", "1"); + TestProperty property_2_1("key_2", "2"); + TestProperty property_1_2("key_1", "12"); + TestProperty property_2_2("key_2", "22"); + TestResultAccessor::RecordProperty(&test_result, property_1_1); + TestResultAccessor::RecordProperty(&test_result, property_2_1); + TestResultAccessor::RecordProperty(&test_result, property_1_2); + TestResultAccessor::RecordProperty(&test_result, property_2_2); + + ASSERT_EQ(2, test_result.test_property_count()); + const TestProperty& actual_property_1 = test_result.GetTestProperty(0); + EXPECT_STREQ("key_1", actual_property_1.key()); + EXPECT_STREQ("12", actual_property_1.value()); + + const TestProperty& actual_property_2 = test_result.GetTestProperty(1); + EXPECT_STREQ("key_2", actual_property_2.key()); + EXPECT_STREQ("22", actual_property_2.value()); +} + +// Tests TestResult::GetTestProperty(). +TEST(TestResultPropertyDeathTest, GetTestProperty) { + TestResult test_result; + TestProperty property_1("key_1", "1"); + TestProperty property_2("key_2", "2"); + TestProperty property_3("key_3", "3"); + TestResultAccessor::RecordProperty(&test_result, property_1); + TestResultAccessor::RecordProperty(&test_result, property_2); + TestResultAccessor::RecordProperty(&test_result, property_3); + + const TestProperty& fetched_property_1 = test_result.GetTestProperty(0); + const TestProperty& fetched_property_2 = test_result.GetTestProperty(1); + const TestProperty& fetched_property_3 = test_result.GetTestProperty(2); + + EXPECT_STREQ("key_1", fetched_property_1.key()); + EXPECT_STREQ("1", fetched_property_1.value()); + + EXPECT_STREQ("key_2", fetched_property_2.key()); + EXPECT_STREQ("2", fetched_property_2.value()); + + EXPECT_STREQ("key_3", fetched_property_3.key()); + EXPECT_STREQ("3", fetched_property_3.value()); + + EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), ""); + EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), ""); +} + +// When a property using a reserved key is supplied to this function, it tests +// that a non-fatal failure is added, a fatal failure is not added, and that the +// property is not recorded. +void ExpectNonFatalFailureRecordingPropertyWithReservedKey(const char* key) { + TestResult test_result; + TestProperty property(key, "1"); + EXPECT_NONFATAL_FAILURE( + TestResultAccessor::RecordProperty(&test_result, property), + "Reserved key"); + ASSERT_EQ(0, test_result.test_property_count()) << "Not recorded"; +} + +// Attempting to recording a property with the Reserved literal "name" +// should add a non-fatal failure and the property should not be recorded. +TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledName) { + ExpectNonFatalFailureRecordingPropertyWithReservedKey("name"); +} + +// Attempting to recording a property with the Reserved literal "status" +// should add a non-fatal failure and the property should not be recorded. +TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledStatus) { + ExpectNonFatalFailureRecordingPropertyWithReservedKey("status"); +} + +// Attempting to recording a property with the Reserved literal "time" +// should add a non-fatal failure and the property should not be recorded. +TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledTime) { + ExpectNonFatalFailureRecordingPropertyWithReservedKey("time"); +} + +// Attempting to recording a property with the Reserved literal "classname" +// should add a non-fatal failure and the property should not be recorded. +TEST(TestResultPropertyTest, AddFailureWhenUsingReservedKeyCalledClassname) { + ExpectNonFatalFailureRecordingPropertyWithReservedKey("classname"); +} + +// Tests that GTestFlagSaver works on Windows and Mac. + +class GTestFlagSaverTest : public Test { + protected: + // Saves the Google Test flags such that we can restore them later, and + // then sets them to their default values. This will be called + // before the first test in this test case is run. + static void SetUpTestCase() { + saver_ = new GTestFlagSaver; + + GTEST_FLAG(also_run_disabled_tests) = false; + GTEST_FLAG(break_on_failure) = false; + GTEST_FLAG(catch_exceptions) = false; + GTEST_FLAG(death_test_use_fork) = false; + GTEST_FLAG(color) = "auto"; + GTEST_FLAG(filter) = ""; + GTEST_FLAG(list_tests) = false; + GTEST_FLAG(output) = ""; + GTEST_FLAG(print_time) = true; + GTEST_FLAG(random_seed) = 0; + GTEST_FLAG(repeat) = 1; + GTEST_FLAG(shuffle) = false; + GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth; + GTEST_FLAG(throw_on_failure) = false; + } + + // Restores the Google Test flags that the tests have modified. This will + // be called after the last test in this test case is run. + static void TearDownTestCase() { + delete saver_; + saver_ = NULL; + } + + // Verifies that the Google Test flags have their default values, and then + // modifies each of them. + void VerifyAndModifyFlags() { + EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests)); + EXPECT_FALSE(GTEST_FLAG(break_on_failure)); + EXPECT_FALSE(GTEST_FLAG(catch_exceptions)); + EXPECT_STREQ("auto", GTEST_FLAG(color).c_str()); + EXPECT_FALSE(GTEST_FLAG(death_test_use_fork)); + EXPECT_STREQ("", GTEST_FLAG(filter).c_str()); + EXPECT_FALSE(GTEST_FLAG(list_tests)); + EXPECT_STREQ("", GTEST_FLAG(output).c_str()); + EXPECT_TRUE(GTEST_FLAG(print_time)); + EXPECT_EQ(0, GTEST_FLAG(random_seed)); + EXPECT_EQ(1, GTEST_FLAG(repeat)); + EXPECT_FALSE(GTEST_FLAG(shuffle)); + EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth)); + EXPECT_FALSE(GTEST_FLAG(throw_on_failure)); + + GTEST_FLAG(also_run_disabled_tests) = true; + GTEST_FLAG(break_on_failure) = true; + GTEST_FLAG(catch_exceptions) = true; + GTEST_FLAG(color) = "no"; + GTEST_FLAG(death_test_use_fork) = true; + GTEST_FLAG(filter) = "abc"; + GTEST_FLAG(list_tests) = true; + GTEST_FLAG(output) = "xml:foo.xml"; + GTEST_FLAG(print_time) = false; + GTEST_FLAG(random_seed) = 1; + GTEST_FLAG(repeat) = 100; + GTEST_FLAG(shuffle) = true; + GTEST_FLAG(stack_trace_depth) = 1; + GTEST_FLAG(throw_on_failure) = true; + } + private: + // For saving Google Test flags during this test case. + static GTestFlagSaver* saver_; +}; + +GTestFlagSaver* GTestFlagSaverTest::saver_ = NULL; + +// Google Test doesn't guarantee the order of tests. The following two +// tests are designed to work regardless of their order. + +// Modifies the Google Test flags in the test body. +TEST_F(GTestFlagSaverTest, ModifyGTestFlags) { + VerifyAndModifyFlags(); +} + +// Verifies that the Google Test flags in the body of the previous test were +// restored to their original values. +TEST_F(GTestFlagSaverTest, VerifyGTestFlags) { + VerifyAndModifyFlags(); +} + +// Sets an environment variable with the given name to the given +// value. If the value argument is "", unsets the environment +// variable. The caller must ensure that both arguments are not NULL. +static void SetEnv(const char* name, const char* value) { +#if GTEST_OS_WINDOWS_MOBILE + // Environment variables are not supported on Windows CE. + return; +#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) + // C++Builder's putenv only stores a pointer to its parameter; we have to + // ensure that the string remains valid as long as it might be needed. + // We use an std::map to do so. + static std::map added_env; + + // Because putenv stores a pointer to the string buffer, we can't delete the + // previous string (if present) until after it's replaced. + String *prev_env = NULL; + if (added_env.find(name) != added_env.end()) { + prev_env = added_env[name]; + } + added_env[name] = new String((Message() << name << "=" << value).GetString()); + + // The standard signature of putenv accepts a 'char*' argument. Other + // implementations, like C++Builder's, accept a 'const char*'. + // We cast away the 'const' since that would work for both variants. + putenv(const_cast(added_env[name]->c_str())); + delete prev_env; +#elif GTEST_OS_WINDOWS // If we are on Windows proper. + _putenv((Message() << name << "=" << value).GetString().c_str()); +#else + if (*value == '\0') { + unsetenv(name); + } else { + setenv(name, value, 1); + } +#endif // GTEST_OS_WINDOWS_MOBILE +} + +#if !GTEST_OS_WINDOWS_MOBILE +// Environment variables are not supported on Windows CE. + +using testing::internal::Int32FromGTestEnv; + +// Tests Int32FromGTestEnv(). + +// Tests that Int32FromGTestEnv() returns the default value when the +// environment variable is not set. +TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) { + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", ""); + EXPECT_EQ(10, Int32FromGTestEnv("temp", 10)); +} + +// Tests that Int32FromGTestEnv() returns the default value when the +// environment variable overflows as an Int32. +TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) { + printf("(expecting 2 warnings)\n"); + + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12345678987654321"); + EXPECT_EQ(20, Int32FromGTestEnv("temp", 20)); + + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-12345678987654321"); + EXPECT_EQ(30, Int32FromGTestEnv("temp", 30)); +} + +// Tests that Int32FromGTestEnv() returns the default value when the +// environment variable does not represent a valid decimal integer. +TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) { + printf("(expecting 2 warnings)\n"); + + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "A1"); + EXPECT_EQ(40, Int32FromGTestEnv("temp", 40)); + + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12X"); + EXPECT_EQ(50, Int32FromGTestEnv("temp", 50)); +} + +// Tests that Int32FromGTestEnv() parses and returns the value of the +// environment variable when it represents a valid decimal integer in +// the range of an Int32. +TEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) { + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "123"); + EXPECT_EQ(123, Int32FromGTestEnv("temp", 0)); + + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-321"); + EXPECT_EQ(-321, Int32FromGTestEnv("temp", 0)); +} +#endif // !GTEST_OS_WINDOWS_MOBILE + +// Tests ParseInt32Flag(). + +// Tests that ParseInt32Flag() returns false and doesn't change the +// output value when the flag has wrong format +TEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) { + Int32 value = 123; + EXPECT_FALSE(ParseInt32Flag("--a=100", "b", &value)); + EXPECT_EQ(123, value); + + EXPECT_FALSE(ParseInt32Flag("a=100", "a", &value)); + EXPECT_EQ(123, value); +} + +// Tests that ParseInt32Flag() returns false and doesn't change the +// output value when the flag overflows as an Int32. +TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) { + printf("(expecting 2 warnings)\n"); + + Int32 value = 123; + EXPECT_FALSE(ParseInt32Flag("--abc=12345678987654321", "abc", &value)); + EXPECT_EQ(123, value); + + EXPECT_FALSE(ParseInt32Flag("--abc=-12345678987654321", "abc", &value)); + EXPECT_EQ(123, value); +} + +// Tests that ParseInt32Flag() returns false and doesn't change the +// output value when the flag does not represent a valid decimal +// integer. +TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) { + printf("(expecting 2 warnings)\n"); + + Int32 value = 123; + EXPECT_FALSE(ParseInt32Flag("--abc=A1", "abc", &value)); + EXPECT_EQ(123, value); + + EXPECT_FALSE(ParseInt32Flag("--abc=12X", "abc", &value)); + EXPECT_EQ(123, value); +} + +// Tests that ParseInt32Flag() parses the value of the flag and +// returns true when the flag represents a valid decimal integer in +// the range of an Int32. +TEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) { + Int32 value = 123; + EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=456", "abc", &value)); + EXPECT_EQ(456, value); + + EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=-789", + "abc", &value)); + EXPECT_EQ(-789, value); +} + +// Tests that Int32FromEnvOrDie() parses the value of the var or +// returns the correct default. +// Environment variables are not supported on Windows CE. +#if !GTEST_OS_WINDOWS_MOBILE +TEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) { + EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333)); + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "123"); + EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333)); + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "-123"); + EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333)); +} +#endif // !GTEST_OS_WINDOWS_MOBILE + +// Tests that Int32FromEnvOrDie() aborts with an error message +// if the variable is not an Int32. +TEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) { + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "xxx"); + EXPECT_DEATH_IF_SUPPORTED( + Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123), + ".*"); +} + +// Tests that Int32FromEnvOrDie() aborts with an error message +// if the variable cannot be represnted by an Int32. +TEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) { + SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "1234567891234567891234"); + EXPECT_DEATH_IF_SUPPORTED( + Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123), + ".*"); +} + +// Tests that ShouldRunTestOnShard() selects all tests +// where there is 1 shard. +TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) { + EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0)); + EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1)); + EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2)); + EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3)); + EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4)); +} + +class ShouldShardTest : public testing::Test { + protected: + virtual void SetUp() { + index_var_ = GTEST_FLAG_PREFIX_UPPER_ "INDEX"; + total_var_ = GTEST_FLAG_PREFIX_UPPER_ "TOTAL"; + } + + virtual void TearDown() { + SetEnv(index_var_, ""); + SetEnv(total_var_, ""); + } + + const char* index_var_; + const char* total_var_; +}; + +// Tests that sharding is disabled if neither of the environment variables +// are set. +TEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) { + SetEnv(index_var_, ""); + SetEnv(total_var_, ""); + + EXPECT_FALSE(ShouldShard(total_var_, index_var_, false)); + EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); +} + +// Tests that sharding is not enabled if total_shards == 1. +TEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) { + SetEnv(index_var_, "0"); + SetEnv(total_var_, "1"); + EXPECT_FALSE(ShouldShard(total_var_, index_var_, false)); + EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); +} + +// Tests that sharding is enabled if total_shards > 1 and +// we are not in a death test subprocess. +// Environment variables are not supported on Windows CE. +#if !GTEST_OS_WINDOWS_MOBILE +TEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) { + SetEnv(index_var_, "4"); + SetEnv(total_var_, "22"); + EXPECT_TRUE(ShouldShard(total_var_, index_var_, false)); + EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); + + SetEnv(index_var_, "8"); + SetEnv(total_var_, "9"); + EXPECT_TRUE(ShouldShard(total_var_, index_var_, false)); + EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); + + SetEnv(index_var_, "0"); + SetEnv(total_var_, "9"); + EXPECT_TRUE(ShouldShard(total_var_, index_var_, false)); + EXPECT_FALSE(ShouldShard(total_var_, index_var_, true)); +} +#endif // !GTEST_OS_WINDOWS_MOBILE + +// Tests that we exit in error if the sharding values are not valid. + +typedef ShouldShardTest ShouldShardDeathTest; + +TEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) { + SetEnv(index_var_, "4"); + SetEnv(total_var_, "4"); + EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); + + SetEnv(index_var_, "4"); + SetEnv(total_var_, "-2"); + EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); + + SetEnv(index_var_, "5"); + SetEnv(total_var_, ""); + EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); + + SetEnv(index_var_, ""); + SetEnv(total_var_, "5"); + EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*"); +} + +// Tests that ShouldRunTestOnShard is a partition when 5 +// shards are used. +TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) { + // Choose an arbitrary number of tests and shards. + const int num_tests = 17; + const int num_shards = 5; + + // Check partitioning: each test should be on exactly 1 shard. + for (int test_id = 0; test_id < num_tests; test_id++) { + int prev_selected_shard_index = -1; + for (int shard_index = 0; shard_index < num_shards; shard_index++) { + if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) { + if (prev_selected_shard_index < 0) { + prev_selected_shard_index = shard_index; + } else { + ADD_FAILURE() << "Shard " << prev_selected_shard_index << " and " + << shard_index << " are both selected to run test " << test_id; + } + } + } + } + + // Check balance: This is not required by the sharding protocol, but is a + // desirable property for performance. + for (int shard_index = 0; shard_index < num_shards; shard_index++) { + int num_tests_on_shard = 0; + for (int test_id = 0; test_id < num_tests; test_id++) { + num_tests_on_shard += + ShouldRunTestOnShard(num_shards, shard_index, test_id); + } + EXPECT_GE(num_tests_on_shard, num_tests / num_shards); + } +} + +// For the same reason we are not explicitly testing everything in the +// Test class, there are no separate tests for the following classes +// (except for some trivial cases): +// +// TestCase, UnitTest, UnitTestResultPrinter. +// +// Similarly, there are no separate tests for the following macros: +// +// TEST, TEST_F, RUN_ALL_TESTS + +TEST(UnitTestTest, CanGetOriginalWorkingDir) { + ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL); + EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), ""); +} + +// This group of tests is for predicate assertions (ASSERT_PRED*, etc) +// of various arities. They do not attempt to be exhaustive. Rather, +// view them as smoke tests that can be easily reviewed and verified. +// A more complete set of tests for predicate assertions can be found +// in gtest_pred_impl_unittest.cc. + +// First, some predicates and predicate-formatters needed by the tests. + +// Returns true iff the argument is an even number. +bool IsEven(int n) { + return (n % 2) == 0; +} + +// A functor that returns true iff the argument is an even number. +struct IsEvenFunctor { + bool operator()(int n) { return IsEven(n); } +}; + +// A predicate-formatter function that asserts the argument is an even +// number. +AssertionResult AssertIsEven(const char* expr, int n) { + if (IsEven(n)) { + return AssertionSuccess(); + } + + Message msg; + msg << expr << " evaluates to " << n << ", which is not even."; + return AssertionFailure(msg); +} + +// A predicate function that returns AssertionResult for use in +// EXPECT/ASSERT_TRUE/FALSE. +AssertionResult ResultIsEven(int n) { + if (IsEven(n)) + return AssertionSuccess() << n << " is even"; + else + return AssertionFailure() << n << " is odd"; +} + +// A predicate function that returns AssertionResult but gives no +// explanation why it succeeds. Needed for testing that +// EXPECT/ASSERT_FALSE handles such functions correctly. +AssertionResult ResultIsEvenNoExplanation(int n) { + if (IsEven(n)) + return AssertionSuccess(); + else + return AssertionFailure() << n << " is odd"; +} + +// A predicate-formatter functor that asserts the argument is an even +// number. +struct AssertIsEvenFunctor { + AssertionResult operator()(const char* expr, int n) { + return AssertIsEven(expr, n); + } +}; + +// Returns true iff the sum of the arguments is an even number. +bool SumIsEven2(int n1, int n2) { + return IsEven(n1 + n2); +} + +// A functor that returns true iff the sum of the arguments is an even +// number. +struct SumIsEven3Functor { + bool operator()(int n1, int n2, int n3) { + return IsEven(n1 + n2 + n3); + } +}; + +// A predicate-formatter function that asserts the sum of the +// arguments is an even number. +AssertionResult AssertSumIsEven4( + const char* e1, const char* e2, const char* e3, const char* e4, + int n1, int n2, int n3, int n4) { + const int sum = n1 + n2 + n3 + n4; + if (IsEven(sum)) { + return AssertionSuccess(); + } + + Message msg; + msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 + << " (" << n1 << " + " << n2 << " + " << n3 << " + " << n4 + << ") evaluates to " << sum << ", which is not even."; + return AssertionFailure(msg); +} + +// A predicate-formatter functor that asserts the sum of the arguments +// is an even number. +struct AssertSumIsEven5Functor { + AssertionResult operator()( + const char* e1, const char* e2, const char* e3, const char* e4, + const char* e5, int n1, int n2, int n3, int n4, int n5) { + const int sum = n1 + n2 + n3 + n4 + n5; + if (IsEven(sum)) { + return AssertionSuccess(); + } + + Message msg; + msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5 + << " (" + << n1 << " + " << n2 << " + " << n3 << " + " << n4 << " + " << n5 + << ") evaluates to " << sum << ", which is not even."; + return AssertionFailure(msg); + } +}; + + +// Tests unary predicate assertions. + +// Tests unary predicate assertions that don't use a custom formatter. +TEST(Pred1Test, WithoutFormat) { + // Success cases. + EXPECT_PRED1(IsEvenFunctor(), 2) << "This failure is UNEXPECTED!"; + ASSERT_PRED1(IsEven, 4); + + // Failure cases. + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED1(IsEven, 5) << "This failure is expected."; + }, "This failure is expected."); + EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5), + "evaluates to false"); +} + +// Tests unary predicate assertions that use a custom formatter. +TEST(Pred1Test, WithFormat) { + // Success cases. + EXPECT_PRED_FORMAT1(AssertIsEven, 2); + ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4) + << "This failure is UNEXPECTED!"; + + // Failure cases. + const int n = 5; + EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n), + "n evaluates to 5, which is not even."); + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT1(AssertIsEven, 5) << "This failure is expected."; + }, "This failure is expected."); +} + +// Tests that unary predicate assertions evaluates their arguments +// exactly once. +TEST(Pred1Test, SingleEvaluationOnFailure) { + // A success case. + static int n = 0; + EXPECT_PRED1(IsEven, n++); + EXPECT_EQ(1, n) << "The argument is not evaluated exactly once."; + + // A failure case. + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++) + << "This failure is expected."; + }, "This failure is expected."); + EXPECT_EQ(2, n) << "The argument is not evaluated exactly once."; +} + + +// Tests predicate assertions whose arity is >= 2. + +// Tests predicate assertions that don't use a custom formatter. +TEST(PredTest, WithoutFormat) { + // Success cases. + ASSERT_PRED2(SumIsEven2, 2, 4) << "This failure is UNEXPECTED!"; + EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8); + + // Failure cases. + const int n1 = 1; + const int n2 = 2; + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED2(SumIsEven2, n1, n2) << "This failure is expected."; + }, "This failure is expected."); + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4); + }, "evaluates to false"); +} + +// Tests predicate assertions that use a custom formatter. +TEST(PredTest, WithFormat) { + // Success cases. + ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) << + "This failure is UNEXPECTED!"; + EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10); + + // Failure cases. + const int n1 = 1; + const int n2 = 2; + const int n3 = 4; + const int n4 = 6; + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4); + }, "evaluates to 13, which is not even."); + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8) + << "This failure is expected."; + }, "This failure is expected."); +} + +// Tests that predicate assertions evaluates their arguments +// exactly once. +TEST(PredTest, SingleEvaluationOnFailure) { + // A success case. + int n1 = 0; + int n2 = 0; + EXPECT_PRED2(SumIsEven2, n1++, n2++); + EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; + EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; + + // Another success case. + n1 = n2 = 0; + int n3 = 0; + int n4 = 0; + int n5 = 0; + ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), + n1++, n2++, n3++, n4++, n5++) + << "This failure is UNEXPECTED!"; + EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; + EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; + EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once."; + EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once."; + EXPECT_EQ(1, n5) << "Argument 5 is not evaluated exactly once."; + + // A failure case. + n1 = n2 = n3 = 0; + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++) + << "This failure is expected."; + }, "This failure is expected."); + EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; + EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; + EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once."; + + // Another failure case. + n1 = n2 = n3 = n4 = 0; + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++); + }, "evaluates to 1, which is not even."); + EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once."; + EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once."; + EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once."; + EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once."; +} + + +// Some helper functions for testing using overloaded/template +// functions with ASSERT_PREDn and EXPECT_PREDn. + +bool IsPositive(double x) { + return x > 0; +} + +template +bool IsNegative(T x) { + return x < 0; +} + +template +bool GreaterThan(T1 x1, T2 x2) { + return x1 > x2; +} + +// Tests that overloaded functions can be used in *_PRED* as long as +// their types are explicitly specified. +TEST(PredicateAssertionTest, AcceptsOverloadedFunction) { + // C++Builder requires C-style casts rather than static_cast. + EXPECT_PRED1((bool (*)(int))(IsPositive), 5); // NOLINT + ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0); // NOLINT +} + +// Tests that template functions can be used in *_PRED* as long as +// their types are explicitly specified. +TEST(PredicateAssertionTest, AcceptsTemplateFunction) { + EXPECT_PRED1(IsNegative, -5); + // Makes sure that we can handle templates with more than one + // parameter. + ASSERT_PRED2((GreaterThan), 5, 0); +} + + +// Some helper functions for testing using overloaded/template +// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn. + +AssertionResult IsPositiveFormat(const char* /* expr */, int n) { + return n > 0 ? AssertionSuccess() : + AssertionFailure(Message() << "Failure"); +} + +AssertionResult IsPositiveFormat(const char* /* expr */, double x) { + return x > 0 ? AssertionSuccess() : + AssertionFailure(Message() << "Failure"); +} + +template +AssertionResult IsNegativeFormat(const char* /* expr */, T x) { + return x < 0 ? AssertionSuccess() : + AssertionFailure(Message() << "Failure"); +} + +template +AssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */, + const T1& x1, const T2& x2) { + return x1 == x2 ? AssertionSuccess() : + AssertionFailure(Message() << "Failure"); +} + +// Tests that overloaded functions can be used in *_PRED_FORMAT* +// without explicitly specifying their types. +TEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) { + EXPECT_PRED_FORMAT1(IsPositiveFormat, 5); + ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0); +} + +// Tests that template functions can be used in *_PRED_FORMAT* without +// explicitly specifying their types. +TEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) { + EXPECT_PRED_FORMAT1(IsNegativeFormat, -5); + ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3); +} + + +// Tests string assertions. + +// Tests ASSERT_STREQ with non-NULL arguments. +TEST(StringAssertionTest, ASSERT_STREQ) { + const char * const p1 = "good"; + ASSERT_STREQ(p1, p1); + + // Let p2 have the same content as p1, but be at a different address. + const char p2[] = "good"; + ASSERT_STREQ(p1, p2); + + EXPECT_FATAL_FAILURE(ASSERT_STREQ("bad", "good"), + "Expected: \"bad\""); +} + +// Tests ASSERT_STREQ with NULL arguments. +TEST(StringAssertionTest, ASSERT_STREQ_Null) { + ASSERT_STREQ(static_cast(NULL), NULL); + EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, "non-null"), + "non-null"); +} + +// Tests ASSERT_STREQ with NULL arguments. +TEST(StringAssertionTest, ASSERT_STREQ_Null2) { + EXPECT_FATAL_FAILURE(ASSERT_STREQ("non-null", NULL), + "non-null"); +} + +// Tests ASSERT_STRNE. +TEST(StringAssertionTest, ASSERT_STRNE) { + ASSERT_STRNE("hi", "Hi"); + ASSERT_STRNE("Hi", NULL); + ASSERT_STRNE(NULL, "Hi"); + ASSERT_STRNE("", NULL); + ASSERT_STRNE(NULL, ""); + ASSERT_STRNE("", "Hi"); + ASSERT_STRNE("Hi", ""); + EXPECT_FATAL_FAILURE(ASSERT_STRNE("Hi", "Hi"), + "\"Hi\" vs \"Hi\""); +} + +// Tests ASSERT_STRCASEEQ. +TEST(StringAssertionTest, ASSERT_STRCASEEQ) { + ASSERT_STRCASEEQ("hi", "Hi"); + ASSERT_STRCASEEQ(static_cast(NULL), NULL); + + ASSERT_STRCASEEQ("", ""); + EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("Hi", "hi2"), + "(ignoring case)"); +} + +// Tests ASSERT_STRCASENE. +TEST(StringAssertionTest, ASSERT_STRCASENE) { + ASSERT_STRCASENE("hi1", "Hi2"); + ASSERT_STRCASENE("Hi", NULL); + ASSERT_STRCASENE(NULL, "Hi"); + ASSERT_STRCASENE("", NULL); + ASSERT_STRCASENE(NULL, ""); + ASSERT_STRCASENE("", "Hi"); + ASSERT_STRCASENE("Hi", ""); + EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("Hi", "hi"), + "(ignoring case)"); +} + +// Tests *_STREQ on wide strings. +TEST(StringAssertionTest, STREQ_Wide) { + // NULL strings. + ASSERT_STREQ(static_cast(NULL), NULL); + + // Empty strings. + ASSERT_STREQ(L"", L""); + + // Non-null vs NULL. + EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"non-null", NULL), + "non-null"); + + // Equal strings. + EXPECT_STREQ(L"Hi", L"Hi"); + + // Unequal strings. + EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc", L"Abc"), + "Abc"); + + // Strings containing wide characters. + EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc\x8119", L"abc\x8120"), + "abc"); +} + +// Tests *_STRNE on wide strings. +TEST(StringAssertionTest, STRNE_Wide) { + // NULL strings. + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_STRNE(static_cast(NULL), NULL); + }, ""); + + // Empty strings. + EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"", L""), + "L\"\""); + + // Non-null vs NULL. + ASSERT_STRNE(L"non-null", NULL); + + // Equal strings. + EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"Hi", L"Hi"), + "L\"Hi\""); + + // Unequal strings. + EXPECT_STRNE(L"abc", L"Abc"); + + // Strings containing wide characters. + EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"abc\x8119", L"abc\x8119"), + "abc"); +} + +// Tests for ::testing::IsSubstring(). + +// Tests that IsSubstring() returns the correct result when the input +// argument type is const char*. +TEST(IsSubstringTest, ReturnsCorrectResultForCString) { + EXPECT_FALSE(IsSubstring("", "", NULL, "a")); + EXPECT_FALSE(IsSubstring("", "", "b", NULL)); + EXPECT_FALSE(IsSubstring("", "", "needle", "haystack")); + + EXPECT_TRUE(IsSubstring("", "", static_cast(NULL), NULL)); + EXPECT_TRUE(IsSubstring("", "", "needle", "two needles")); +} + +// Tests that IsSubstring() returns the correct result when the input +// argument type is const wchar_t*. +TEST(IsSubstringTest, ReturnsCorrectResultForWideCString) { + EXPECT_FALSE(IsSubstring("", "", kNull, L"a")); + EXPECT_FALSE(IsSubstring("", "", L"b", kNull)); + EXPECT_FALSE(IsSubstring("", "", L"needle", L"haystack")); + + EXPECT_TRUE(IsSubstring("", "", static_cast(NULL), NULL)); + EXPECT_TRUE(IsSubstring("", "", L"needle", L"two needles")); +} + +// Tests that IsSubstring() generates the correct message when the input +// argument type is const char*. +TEST(IsSubstringTest, GeneratesCorrectMessageForCString) { + EXPECT_STREQ("Value of: needle_expr\n" + " Actual: \"needle\"\n" + "Expected: a substring of haystack_expr\n" + "Which is: \"haystack\"", + IsSubstring("needle_expr", "haystack_expr", + "needle", "haystack").failure_message()); +} + +// Tests that IsSubstring returns the correct result when the input +// argument type is ::std::string. +TEST(IsSubstringTest, ReturnsCorrectResultsForStdString) { + EXPECT_TRUE(IsSubstring("", "", std::string("hello"), "ahellob")); + EXPECT_FALSE(IsSubstring("", "", "hello", std::string("world"))); +} + +#if GTEST_HAS_STD_WSTRING +// Tests that IsSubstring returns the correct result when the input +// argument type is ::std::wstring. +TEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) { + EXPECT_TRUE(IsSubstring("", "", ::std::wstring(L"needle"), L"two needles")); + EXPECT_FALSE(IsSubstring("", "", L"needle", ::std::wstring(L"haystack"))); +} + +// Tests that IsSubstring() generates the correct message when the input +// argument type is ::std::wstring. +TEST(IsSubstringTest, GeneratesCorrectMessageForWstring) { + EXPECT_STREQ("Value of: needle_expr\n" + " Actual: L\"needle\"\n" + "Expected: a substring of haystack_expr\n" + "Which is: L\"haystack\"", + IsSubstring( + "needle_expr", "haystack_expr", + ::std::wstring(L"needle"), L"haystack").failure_message()); +} + +#endif // GTEST_HAS_STD_WSTRING + +// Tests for ::testing::IsNotSubstring(). + +// Tests that IsNotSubstring() returns the correct result when the input +// argument type is const char*. +TEST(IsNotSubstringTest, ReturnsCorrectResultForCString) { + EXPECT_TRUE(IsNotSubstring("", "", "needle", "haystack")); + EXPECT_FALSE(IsNotSubstring("", "", "needle", "two needles")); +} + +// Tests that IsNotSubstring() returns the correct result when the input +// argument type is const wchar_t*. +TEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) { + EXPECT_TRUE(IsNotSubstring("", "", L"needle", L"haystack")); + EXPECT_FALSE(IsNotSubstring("", "", L"needle", L"two needles")); +} + +// Tests that IsNotSubstring() generates the correct message when the input +// argument type is const wchar_t*. +TEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) { + EXPECT_STREQ("Value of: needle_expr\n" + " Actual: L\"needle\"\n" + "Expected: not a substring of haystack_expr\n" + "Which is: L\"two needles\"", + IsNotSubstring( + "needle_expr", "haystack_expr", + L"needle", L"two needles").failure_message()); +} + +// Tests that IsNotSubstring returns the correct result when the input +// argument type is ::std::string. +TEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) { + EXPECT_FALSE(IsNotSubstring("", "", std::string("hello"), "ahellob")); + EXPECT_TRUE(IsNotSubstring("", "", "hello", std::string("world"))); +} + +// Tests that IsNotSubstring() generates the correct message when the input +// argument type is ::std::string. +TEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) { + EXPECT_STREQ("Value of: needle_expr\n" + " Actual: \"needle\"\n" + "Expected: not a substring of haystack_expr\n" + "Which is: \"two needles\"", + IsNotSubstring( + "needle_expr", "haystack_expr", + ::std::string("needle"), "two needles").failure_message()); +} + +#if GTEST_HAS_STD_WSTRING + +// Tests that IsNotSubstring returns the correct result when the input +// argument type is ::std::wstring. +TEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) { + EXPECT_FALSE( + IsNotSubstring("", "", ::std::wstring(L"needle"), L"two needles")); + EXPECT_TRUE(IsNotSubstring("", "", L"needle", ::std::wstring(L"haystack"))); +} + +#endif // GTEST_HAS_STD_WSTRING + +// Tests floating-point assertions. + +template +class FloatingPointTest : public Test { + protected: + + // Pre-calculated numbers to be used by the tests. + struct TestValues { + RawType close_to_positive_zero; + RawType close_to_negative_zero; + RawType further_from_negative_zero; + + RawType close_to_one; + RawType further_from_one; + + RawType infinity; + RawType close_to_infinity; + RawType further_from_infinity; + + RawType nan1; + RawType nan2; + }; + + typedef typename testing::internal::FloatingPoint Floating; + typedef typename Floating::Bits Bits; + + virtual void SetUp() { + const size_t max_ulps = Floating::kMaxUlps; + + // The bits that represent 0.0. + const Bits zero_bits = Floating(0).bits(); + + // Makes some numbers close to 0.0. + values_.close_to_positive_zero = Floating::ReinterpretBits( + zero_bits + max_ulps/2); + values_.close_to_negative_zero = -Floating::ReinterpretBits( + zero_bits + max_ulps - max_ulps/2); + values_.further_from_negative_zero = -Floating::ReinterpretBits( + zero_bits + max_ulps + 1 - max_ulps/2); + + // The bits that represent 1.0. + const Bits one_bits = Floating(1).bits(); + + // Makes some numbers close to 1.0. + values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps); + values_.further_from_one = Floating::ReinterpretBits( + one_bits + max_ulps + 1); + + // +infinity. + values_.infinity = Floating::Infinity(); + + // The bits that represent +infinity. + const Bits infinity_bits = Floating(values_.infinity).bits(); + + // Makes some numbers close to infinity. + values_.close_to_infinity = Floating::ReinterpretBits( + infinity_bits - max_ulps); + values_.further_from_infinity = Floating::ReinterpretBits( + infinity_bits - max_ulps - 1); + + // Makes some NAN's. Sets the most significant bit of the fraction so that + // our NaN's are quiet; trying to process a signaling NaN would raise an + // exception if our environment enables floating point exceptions. + values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask + | (static_cast(1) << (Floating::kFractionBitCount - 1)) | 1); + values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask + | (static_cast(1) << (Floating::kFractionBitCount - 1)) | 200); + } + + void TestSize() { + EXPECT_EQ(sizeof(RawType), sizeof(Bits)); + } + + static TestValues values_; +}; + +template +typename FloatingPointTest::TestValues + FloatingPointTest::values_; + +// Instantiates FloatingPointTest for testing *_FLOAT_EQ. +typedef FloatingPointTest FloatTest; + +// Tests that the size of Float::Bits matches the size of float. +TEST_F(FloatTest, Size) { + TestSize(); +} + +// Tests comparing with +0 and -0. +TEST_F(FloatTest, Zeros) { + EXPECT_FLOAT_EQ(0.0, -0.0); + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0), + "1.0"); + EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5), + "1.5"); +} + +// Tests comparing numbers close to 0. +// +// This ensures that *_FLOAT_EQ handles the sign correctly and no +// overflow occurs when comparing numbers whose absolute value is very +// small. +TEST_F(FloatTest, AlmostZeros) { + // In C++Builder, names within local classes (such as used by + // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the + // scoping class. Use a static local alias as a workaround. + // We use the assignment syntax since some compilers, like Sun Studio, + // don't allow initializing references using construction syntax + // (parentheses). + static const FloatTest::TestValues& v = this->values_; + + EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero); + EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero); + EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero); + + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_FLOAT_EQ(v.close_to_positive_zero, + v.further_from_negative_zero); + }, "v.further_from_negative_zero"); +} + +// Tests comparing numbers close to each other. +TEST_F(FloatTest, SmallDiff) { + EXPECT_FLOAT_EQ(1.0, values_.close_to_one); + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one), + "values_.further_from_one"); +} + +// Tests comparing numbers far apart. +TEST_F(FloatTest, LargeDiff) { + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0), + "3.0"); +} + +// Tests comparing with infinity. +// +// This ensures that no overflow occurs when comparing numbers whose +// absolute value is very large. +TEST_F(FloatTest, Infinity) { + EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity); + EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity); +#if !GTEST_OS_SYMBIAN + // Nokia's STLport crashes if we try to output infinity or NaN. + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity), + "-values_.infinity"); + + // This is interesting as the representations of infinity and nan1 + // are only 1 DLP apart. + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1), + "values_.nan1"); +#endif // !GTEST_OS_SYMBIAN +} + +// Tests that comparing with NAN always returns false. +TEST_F(FloatTest, NaN) { +#if !GTEST_OS_SYMBIAN +// Nokia's STLport crashes if we try to output infinity or NaN. + + // In C++Builder, names within local classes (such as used by + // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the + // scoping class. Use a static local alias as a workaround. + // We use the assignment syntax since some compilers, like Sun Studio, + // don't allow initializing references using construction syntax + // (parentheses). + static const FloatTest::TestValues& v = this->values_; + + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1), + "v.nan1"); + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2), + "v.nan2"); + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1), + "v.nan1"); + + EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity), + "v.infinity"); +#endif // !GTEST_OS_SYMBIAN +} + +// Tests that *_FLOAT_EQ are reflexive. +TEST_F(FloatTest, Reflexive) { + EXPECT_FLOAT_EQ(0.0, 0.0); + EXPECT_FLOAT_EQ(1.0, 1.0); + ASSERT_FLOAT_EQ(values_.infinity, values_.infinity); +} + +// Tests that *_FLOAT_EQ are commutative. +TEST_F(FloatTest, Commutative) { + // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one). + EXPECT_FLOAT_EQ(values_.close_to_one, 1.0); + + // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one). + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0), + "1.0"); +} + +// Tests EXPECT_NEAR. +TEST_F(FloatTest, EXPECT_NEAR) { + EXPECT_NEAR(-1.0f, -1.1f, 0.2f); + EXPECT_NEAR(2.0f, 3.0f, 1.0f); + EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f), // NOLINT + "The difference between 1.0f and 1.5f is 0.5, " + "which exceeds 0.25f"); + // To work around a bug in gcc 2.95.0, there is intentionally no + // space after the first comma in the previous line. +} + +// Tests ASSERT_NEAR. +TEST_F(FloatTest, ASSERT_NEAR) { + ASSERT_NEAR(-1.0f, -1.1f, 0.2f); + ASSERT_NEAR(2.0f, 3.0f, 1.0f); + EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f), // NOLINT + "The difference between 1.0f and 1.5f is 0.5, " + "which exceeds 0.25f"); + // To work around a bug in gcc 2.95.0, there is intentionally no + // space after the first comma in the previous line. +} + +// Tests the cases where FloatLE() should succeed. +TEST_F(FloatTest, FloatLESucceeds) { + EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f); // When val1 < val2, + ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f); // val1 == val2, + + // or when val1 is greater than, but almost equals to, val2. + EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f); +} + +// Tests the cases where FloatLE() should fail. +TEST_F(FloatTest, FloatLEFails) { + // When val1 is greater than val2 by a large margin, + EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f), + "(2.0f) <= (1.0f)"); + + // or by a small yet non-negligible margin, + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f); + }, "(values_.further_from_one) <= (1.0f)"); + +#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) + // Nokia's STLport crashes if we try to output infinity or NaN. + // C++Builder gives bad results for ordered comparisons involving NaNs + // due to compiler bugs. + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity); + }, "(values_.nan1) <= (values_.infinity)"); + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1); + }, "(-values_.infinity) <= (values_.nan1)"); + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1); + }, "(values_.nan1) <= (values_.nan1)"); +#endif // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) +} + +// Instantiates FloatingPointTest for testing *_DOUBLE_EQ. +typedef FloatingPointTest DoubleTest; + +// Tests that the size of Double::Bits matches the size of double. +TEST_F(DoubleTest, Size) { + TestSize(); +} + +// Tests comparing with +0 and -0. +TEST_F(DoubleTest, Zeros) { + EXPECT_DOUBLE_EQ(0.0, -0.0); + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0), + "1.0"); + EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0), + "1.0"); +} + +// Tests comparing numbers close to 0. +// +// This ensures that *_DOUBLE_EQ handles the sign correctly and no +// overflow occurs when comparing numbers whose absolute value is very +// small. +TEST_F(DoubleTest, AlmostZeros) { + // In C++Builder, names within local classes (such as used by + // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the + // scoping class. Use a static local alias as a workaround. + // We use the assignment syntax since some compilers, like Sun Studio, + // don't allow initializing references using construction syntax + // (parentheses). + static const DoubleTest::TestValues& v = this->values_; + + EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero); + EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero); + EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero); + + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_DOUBLE_EQ(v.close_to_positive_zero, + v.further_from_negative_zero); + }, "v.further_from_negative_zero"); +} + +// Tests comparing numbers close to each other. +TEST_F(DoubleTest, SmallDiff) { + EXPECT_DOUBLE_EQ(1.0, values_.close_to_one); + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one), + "values_.further_from_one"); +} + +// Tests comparing numbers far apart. +TEST_F(DoubleTest, LargeDiff) { + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0), + "3.0"); +} + +// Tests comparing with infinity. +// +// This ensures that no overflow occurs when comparing numbers whose +// absolute value is very large. +TEST_F(DoubleTest, Infinity) { + EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity); + EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity); +#if !GTEST_OS_SYMBIAN + // Nokia's STLport crashes if we try to output infinity or NaN. + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity), + "-values_.infinity"); + + // This is interesting as the representations of infinity_ and nan1_ + // are only 1 DLP apart. + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1), + "values_.nan1"); +#endif // !GTEST_OS_SYMBIAN +} + +// Tests that comparing with NAN always returns false. +TEST_F(DoubleTest, NaN) { +#if !GTEST_OS_SYMBIAN + // In C++Builder, names within local classes (such as used by + // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the + // scoping class. Use a static local alias as a workaround. + // We use the assignment syntax since some compilers, like Sun Studio, + // don't allow initializing references using construction syntax + // (parentheses). + static const DoubleTest::TestValues& v = this->values_; + + // Nokia's STLport crashes if we try to output infinity or NaN. + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1), + "v.nan1"); + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), "v.nan2"); + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), "v.nan1"); + EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity), + "v.infinity"); +#endif // !GTEST_OS_SYMBIAN +} + +// Tests that *_DOUBLE_EQ are reflexive. +TEST_F(DoubleTest, Reflexive) { + EXPECT_DOUBLE_EQ(0.0, 0.0); + EXPECT_DOUBLE_EQ(1.0, 1.0); +#if !GTEST_OS_SYMBIAN + // Nokia's STLport crashes if we try to output infinity or NaN. + ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity); +#endif // !GTEST_OS_SYMBIAN +} + +// Tests that *_DOUBLE_EQ are commutative. +TEST_F(DoubleTest, Commutative) { + // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one). + EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0); + + // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one). + EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0), + "1.0"); +} + +// Tests EXPECT_NEAR. +TEST_F(DoubleTest, EXPECT_NEAR) { + EXPECT_NEAR(-1.0, -1.1, 0.2); + EXPECT_NEAR(2.0, 3.0, 1.0); + EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25), // NOLINT + "The difference between 1.0 and 1.5 is 0.5, " + "which exceeds 0.25"); + // To work around a bug in gcc 2.95.0, there is intentionally no + // space after the first comma in the previous statement. +} + +// Tests ASSERT_NEAR. +TEST_F(DoubleTest, ASSERT_NEAR) { + ASSERT_NEAR(-1.0, -1.1, 0.2); + ASSERT_NEAR(2.0, 3.0, 1.0); + EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25), // NOLINT + "The difference between 1.0 and 1.5 is 0.5, " + "which exceeds 0.25"); + // To work around a bug in gcc 2.95.0, there is intentionally no + // space after the first comma in the previous statement. +} + +// Tests the cases where DoubleLE() should succeed. +TEST_F(DoubleTest, DoubleLESucceeds) { + EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0); // When val1 < val2, + ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0); // val1 == val2, + + // or when val1 is greater than, but almost equals to, val2. + EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0); +} + +// Tests the cases where DoubleLE() should fail. +TEST_F(DoubleTest, DoubleLEFails) { + // When val1 is greater than val2 by a large margin, + EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0), + "(2.0) <= (1.0)"); + + // or by a small yet non-negligible margin, + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0); + }, "(values_.further_from_one) <= (1.0)"); + +#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) + // Nokia's STLport crashes if we try to output infinity or NaN. + // C++Builder gives bad results for ordered comparisons involving NaNs + // due to compiler bugs. + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity); + }, "(values_.nan1) <= (values_.infinity)"); + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1); + }, " (-values_.infinity) <= (values_.nan1)"); + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1); + }, "(values_.nan1) <= (values_.nan1)"); +#endif // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__) +} + + +// Verifies that a test or test case whose name starts with DISABLED_ is +// not run. + +// A test whose name starts with DISABLED_. +// Should not run. +TEST(DisabledTest, DISABLED_TestShouldNotRun) { + FAIL() << "Unexpected failure: Disabled test should not be run."; +} + +// A test whose name does not start with DISABLED_. +// Should run. +TEST(DisabledTest, NotDISABLED_TestShouldRun) { + EXPECT_EQ(1, 1); +} + +// A test case whose name starts with DISABLED_. +// Should not run. +TEST(DISABLED_TestCase, TestShouldNotRun) { + FAIL() << "Unexpected failure: Test in disabled test case should not be run."; +} + +// A test case and test whose names start with DISABLED_. +// Should not run. +TEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) { + FAIL() << "Unexpected failure: Test in disabled test case should not be run."; +} + +// Check that when all tests in a test case are disabled, SetupTestCase() and +// TearDownTestCase() are not called. +class DisabledTestsTest : public Test { + protected: + static void SetUpTestCase() { + FAIL() << "Unexpected failure: All tests disabled in test case. " + "SetupTestCase() should not be called."; + } + + static void TearDownTestCase() { + FAIL() << "Unexpected failure: All tests disabled in test case. " + "TearDownTestCase() should not be called."; + } +}; + +TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) { + FAIL() << "Unexpected failure: Disabled test should not be run."; +} + +TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) { + FAIL() << "Unexpected failure: Disabled test should not be run."; +} + +// Tests that disabled typed tests aren't run. + +#if GTEST_HAS_TYPED_TEST + +template +class TypedTest : public Test { +}; + +typedef testing::Types NumericTypes; +TYPED_TEST_CASE(TypedTest, NumericTypes); + +TYPED_TEST(TypedTest, DISABLED_ShouldNotRun) { + FAIL() << "Unexpected failure: Disabled typed test should not run."; +} + +template +class DISABLED_TypedTest : public Test { +}; + +TYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes); + +TYPED_TEST(DISABLED_TypedTest, ShouldNotRun) { + FAIL() << "Unexpected failure: Disabled typed test should not run."; +} + +#endif // GTEST_HAS_TYPED_TEST + +// Tests that disabled type-parameterized tests aren't run. + +#if GTEST_HAS_TYPED_TEST_P + +template +class TypedTestP : public Test { +}; + +TYPED_TEST_CASE_P(TypedTestP); + +TYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) { + FAIL() << "Unexpected failure: " + << "Disabled type-parameterized test should not run."; +} + +REGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun); + +INSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes); + +template +class DISABLED_TypedTestP : public Test { +}; + +TYPED_TEST_CASE_P(DISABLED_TypedTestP); + +TYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) { + FAIL() << "Unexpected failure: " + << "Disabled type-parameterized test should not run."; +} + +REGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun); + +INSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes); + +#endif // GTEST_HAS_TYPED_TEST_P + +// Tests that assertion macros evaluate their arguments exactly once. + +class SingleEvaluationTest : public Test { + public: // Must be public and not protected due to a bug in g++ 3.4.2. + // This helper function is needed by the FailedASSERT_STREQ test + // below. It's public to work around C++Builder's bug with scoping local + // classes. + static void CompareAndIncrementCharPtrs() { + ASSERT_STREQ(p1_++, p2_++); + } + + // This helper function is needed by the FailedASSERT_NE test below. It's + // public to work around C++Builder's bug with scoping local classes. + static void CompareAndIncrementInts() { + ASSERT_NE(a_++, b_++); + } + + protected: + SingleEvaluationTest() { + p1_ = s1_; + p2_ = s2_; + a_ = 0; + b_ = 0; + } + + static const char* const s1_; + static const char* const s2_; + static const char* p1_; + static const char* p2_; + + static int a_; + static int b_; +}; + +const char* const SingleEvaluationTest::s1_ = "01234"; +const char* const SingleEvaluationTest::s2_ = "abcde"; +const char* SingleEvaluationTest::p1_; +const char* SingleEvaluationTest::p2_; +int SingleEvaluationTest::a_; +int SingleEvaluationTest::b_; + +// Tests that when ASSERT_STREQ fails, it evaluates its arguments +// exactly once. +TEST_F(SingleEvaluationTest, FailedASSERT_STREQ) { + EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(), + "p2_++"); + EXPECT_EQ(s1_ + 1, p1_); + EXPECT_EQ(s2_ + 1, p2_); +} + +// Tests that string assertion arguments are evaluated exactly once. +TEST_F(SingleEvaluationTest, ASSERT_STR) { + // successful EXPECT_STRNE + EXPECT_STRNE(p1_++, p2_++); + EXPECT_EQ(s1_ + 1, p1_); + EXPECT_EQ(s2_ + 1, p2_); + + // failed EXPECT_STRCASEEQ + EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++), + "ignoring case"); + EXPECT_EQ(s1_ + 2, p1_); + EXPECT_EQ(s2_ + 2, p2_); +} + +// Tests that when ASSERT_NE fails, it evaluates its arguments exactly +// once. +TEST_F(SingleEvaluationTest, FailedASSERT_NE) { + EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(), + "(a_++) != (b_++)"); + EXPECT_EQ(1, a_); + EXPECT_EQ(1, b_); +} + +// Tests that assertion arguments are evaluated exactly once. +TEST_F(SingleEvaluationTest, OtherCases) { + // successful EXPECT_TRUE + EXPECT_TRUE(0 == a_++); // NOLINT + EXPECT_EQ(1, a_); + + // failed EXPECT_TRUE + EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), "-1 == a_++"); + EXPECT_EQ(2, a_); + + // successful EXPECT_GT + EXPECT_GT(a_++, b_++); + EXPECT_EQ(3, a_); + EXPECT_EQ(1, b_); + + // failed EXPECT_LT + EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), "(a_++) < (b_++)"); + EXPECT_EQ(4, a_); + EXPECT_EQ(2, b_); + + // successful ASSERT_TRUE + ASSERT_TRUE(0 < a_++); // NOLINT + EXPECT_EQ(5, a_); + + // successful ASSERT_GT + ASSERT_GT(a_++, b_++); + EXPECT_EQ(6, a_); + EXPECT_EQ(3, b_); +} + +#if GTEST_HAS_EXCEPTIONS + +void ThrowAnInteger() { + throw 1; +} + +// Tests that assertion arguments are evaluated exactly once. +TEST_F(SingleEvaluationTest, ExceptionTests) { + // successful EXPECT_THROW + EXPECT_THROW({ // NOLINT + a_++; + ThrowAnInteger(); + }, int); + EXPECT_EQ(1, a_); + + // failed EXPECT_THROW, throws different + EXPECT_NONFATAL_FAILURE(EXPECT_THROW({ // NOLINT + a_++; + ThrowAnInteger(); + }, bool), "throws a different type"); + EXPECT_EQ(2, a_); + + // failed EXPECT_THROW, throws nothing + EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), "throws nothing"); + EXPECT_EQ(3, a_); + + // successful EXPECT_NO_THROW + EXPECT_NO_THROW(a_++); + EXPECT_EQ(4, a_); + + // failed EXPECT_NO_THROW + EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({ // NOLINT + a_++; + ThrowAnInteger(); + }), "it throws"); + EXPECT_EQ(5, a_); + + // successful EXPECT_ANY_THROW + EXPECT_ANY_THROW({ // NOLINT + a_++; + ThrowAnInteger(); + }); + EXPECT_EQ(6, a_); + + // failed EXPECT_ANY_THROW + EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), "it doesn't"); + EXPECT_EQ(7, a_); +} + +#endif // GTEST_HAS_EXCEPTIONS + +// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE. +class NoFatalFailureTest : public Test { + protected: + void Succeeds() {} + void FailsNonFatal() { + ADD_FAILURE() << "some non-fatal failure"; + } + void Fails() { + FAIL() << "some fatal failure"; + } + + void DoAssertNoFatalFailureOnFails() { + ASSERT_NO_FATAL_FAILURE(Fails()); + ADD_FAILURE() << "shold not reach here."; + } + + void DoExpectNoFatalFailureOnFails() { + EXPECT_NO_FATAL_FAILURE(Fails()); + ADD_FAILURE() << "other failure"; + } +}; + +TEST_F(NoFatalFailureTest, NoFailure) { + EXPECT_NO_FATAL_FAILURE(Succeeds()); + ASSERT_NO_FATAL_FAILURE(Succeeds()); +} + +TEST_F(NoFatalFailureTest, NonFatalIsNoFailure) { + EXPECT_NONFATAL_FAILURE( + EXPECT_NO_FATAL_FAILURE(FailsNonFatal()), + "some non-fatal failure"); + EXPECT_NONFATAL_FAILURE( + ASSERT_NO_FATAL_FAILURE(FailsNonFatal()), + "some non-fatal failure"); +} + +TEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) { + TestPartResultArray gtest_failures; + { + ScopedFakeTestPartResultReporter gtest_reporter(>est_failures); + DoAssertNoFatalFailureOnFails(); + } + ASSERT_EQ(2, gtest_failures.size()); + EXPECT_EQ(TestPartResult::kFatalFailure, + gtest_failures.GetTestPartResult(0).type()); + EXPECT_EQ(TestPartResult::kFatalFailure, + gtest_failures.GetTestPartResult(1).type()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure", + gtest_failures.GetTestPartResult(0).message()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does", + gtest_failures.GetTestPartResult(1).message()); +} + +TEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) { + TestPartResultArray gtest_failures; + { + ScopedFakeTestPartResultReporter gtest_reporter(>est_failures); + DoExpectNoFatalFailureOnFails(); + } + ASSERT_EQ(3, gtest_failures.size()); + EXPECT_EQ(TestPartResult::kFatalFailure, + gtest_failures.GetTestPartResult(0).type()); + EXPECT_EQ(TestPartResult::kNonFatalFailure, + gtest_failures.GetTestPartResult(1).type()); + EXPECT_EQ(TestPartResult::kNonFatalFailure, + gtest_failures.GetTestPartResult(2).type()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure", + gtest_failures.GetTestPartResult(0).message()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does", + gtest_failures.GetTestPartResult(1).message()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "other failure", + gtest_failures.GetTestPartResult(2).message()); +} + +TEST_F(NoFatalFailureTest, MessageIsStreamable) { + TestPartResultArray gtest_failures; + { + ScopedFakeTestPartResultReporter gtest_reporter(>est_failures); + EXPECT_NO_FATAL_FAILURE(FAIL() << "foo") << "my message"; + } + ASSERT_EQ(2, gtest_failures.size()); + EXPECT_EQ(TestPartResult::kNonFatalFailure, + gtest_failures.GetTestPartResult(0).type()); + EXPECT_EQ(TestPartResult::kNonFatalFailure, + gtest_failures.GetTestPartResult(1).type()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "foo", + gtest_failures.GetTestPartResult(0).message()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, "my message", + gtest_failures.GetTestPartResult(1).message()); +} + +// Tests non-string assertions. + +// Tests EqFailure(), used for implementing *EQ* assertions. +TEST(AssertionTest, EqFailure) { + const String foo_val("5"), bar_val("6"); + const String msg1( + EqFailure("foo", "bar", foo_val, bar_val, false) + .failure_message()); + EXPECT_STREQ( + "Value of: bar\n" + " Actual: 6\n" + "Expected: foo\n" + "Which is: 5", + msg1.c_str()); + + const String msg2( + EqFailure("foo", "6", foo_val, bar_val, false) + .failure_message()); + EXPECT_STREQ( + "Value of: 6\n" + "Expected: foo\n" + "Which is: 5", + msg2.c_str()); + + const String msg3( + EqFailure("5", "bar", foo_val, bar_val, false) + .failure_message()); + EXPECT_STREQ( + "Value of: bar\n" + " Actual: 6\n" + "Expected: 5", + msg3.c_str()); + + const String msg4( + EqFailure("5", "6", foo_val, bar_val, false).failure_message()); + EXPECT_STREQ( + "Value of: 6\n" + "Expected: 5", + msg4.c_str()); + + const String msg5( + EqFailure("foo", "bar", + String("\"x\""), String("\"y\""), + true).failure_message()); + EXPECT_STREQ( + "Value of: bar\n" + " Actual: \"y\"\n" + "Expected: foo (ignoring case)\n" + "Which is: \"x\"", + msg5.c_str()); +} + +// Tests AppendUserMessage(), used for implementing the *EQ* macros. +TEST(AssertionTest, AppendUserMessage) { + const String foo("foo"); + + Message msg; + EXPECT_STREQ("foo", + AppendUserMessage(foo, msg).c_str()); + + msg << "bar"; + EXPECT_STREQ("foo\nbar", + AppendUserMessage(foo, msg).c_str()); +} + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +#pragma option push -w-ccc -w-rch +#endif + +// Tests ASSERT_TRUE. +TEST(AssertionTest, ASSERT_TRUE) { + ASSERT_TRUE(2 > 1); // NOLINT + EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1), + "2 < 1"); +} + +// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult. +TEST(AssertionTest, AssertTrueWithAssertionResult) { + ASSERT_TRUE(ResultIsEven(2)); +#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x600 + // ICE's in C++Builder 2007. + EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)), + "Value of: ResultIsEven(3)\n" + " Actual: false (3 is odd)\n" + "Expected: true"); +#endif + ASSERT_TRUE(ResultIsEvenNoExplanation(2)); + EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)), + "Value of: ResultIsEvenNoExplanation(3)\n" + " Actual: false (3 is odd)\n" + "Expected: true"); +} + +// Tests ASSERT_FALSE. +TEST(AssertionTest, ASSERT_FALSE) { + ASSERT_FALSE(2 < 1); // NOLINT + EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1), + "Value of: 2 > 1\n" + " Actual: true\n" + "Expected: false"); +} + +// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult. +TEST(AssertionTest, AssertFalseWithAssertionResult) { + ASSERT_FALSE(ResultIsEven(3)); +#if !defined(__BORLANDC__) || __BORLANDC__ >= 0x600 + // ICE's in C++Builder 2007. + EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)), + "Value of: ResultIsEven(2)\n" + " Actual: true (2 is even)\n" + "Expected: false"); +#endif + ASSERT_FALSE(ResultIsEvenNoExplanation(3)); + EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)), + "Value of: ResultIsEvenNoExplanation(2)\n" + " Actual: true\n" + "Expected: false"); +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" supressed them +#pragma option pop +#endif + +// Tests using ASSERT_EQ on double values. The purpose is to make +// sure that the specialization we did for integer and anonymous enums +// isn't used for double arguments. +TEST(ExpectTest, ASSERT_EQ_Double) { + // A success. + ASSERT_EQ(5.6, 5.6); + + // A failure. + EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2), + "5.1"); +} + +// Tests ASSERT_EQ. +TEST(AssertionTest, ASSERT_EQ) { + ASSERT_EQ(5, 2 + 3); + EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3), + "Value of: 2*3\n" + " Actual: 6\n" + "Expected: 5"); +} + +// Tests ASSERT_EQ(NULL, pointer). +#if GTEST_CAN_COMPARE_NULL +TEST(AssertionTest, ASSERT_EQ_NULL) { + // A success. + const char* p = NULL; + // Some older GCC versions may issue a spurious waring in this or the next + // assertion statement. This warning should not be suppressed with + // static_cast since the test verifies the ability to use bare NULL as the + // expected parameter to the macro. + ASSERT_EQ(NULL, p); + + // A failure. + static int n = 0; + EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n), + "Value of: &n\n"); +} +#endif // GTEST_CAN_COMPARE_NULL + +// Tests ASSERT_EQ(0, non_pointer). Since the literal 0 can be +// treated as a null pointer by the compiler, we need to make sure +// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as +// ASSERT_EQ(static_cast(NULL), non_pointer). +TEST(ExpectTest, ASSERT_EQ_0) { + int n = 0; + + // A success. + ASSERT_EQ(0, n); + + // A failure. + EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6), + "Expected: 0"); +} + +// Tests ASSERT_NE. +TEST(AssertionTest, ASSERT_NE) { + ASSERT_NE(6, 7); + EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'), + "Expected: ('a') != ('a'), " + "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)"); +} + +// Tests ASSERT_LE. +TEST(AssertionTest, ASSERT_LE) { + ASSERT_LE(2, 3); + ASSERT_LE(2, 2); + EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0), + "Expected: (2) <= (0), actual: 2 vs 0"); +} + +// Tests ASSERT_LT. +TEST(AssertionTest, ASSERT_LT) { + ASSERT_LT(2, 3); + EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2), + "Expected: (2) < (2), actual: 2 vs 2"); +} + +// Tests ASSERT_GE. +TEST(AssertionTest, ASSERT_GE) { + ASSERT_GE(2, 1); + ASSERT_GE(2, 2); + EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3), + "Expected: (2) >= (3), actual: 2 vs 3"); +} + +// Tests ASSERT_GT. +TEST(AssertionTest, ASSERT_GT) { + ASSERT_GT(2, 1); + EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2), + "Expected: (2) > (2), actual: 2 vs 2"); +} + +#if GTEST_HAS_EXCEPTIONS + +void ThrowNothing() {} + +// Tests ASSERT_THROW. +TEST(AssertionTest, ASSERT_THROW) { + ASSERT_THROW(ThrowAnInteger(), int); + +#ifndef __BORLANDC__ + // ICE's in C++Builder 2007 and 2009. + EXPECT_FATAL_FAILURE( + ASSERT_THROW(ThrowAnInteger(), bool), + "Expected: ThrowAnInteger() throws an exception of type bool.\n" + " Actual: it throws a different type."); +#endif + + EXPECT_FATAL_FAILURE( + ASSERT_THROW(ThrowNothing(), bool), + "Expected: ThrowNothing() throws an exception of type bool.\n" + " Actual: it throws nothing."); +} + +// Tests ASSERT_NO_THROW. +TEST(AssertionTest, ASSERT_NO_THROW) { + ASSERT_NO_THROW(ThrowNothing()); + EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()), + "Expected: ThrowAnInteger() doesn't throw an exception." + "\n Actual: it throws."); +} + +// Tests ASSERT_ANY_THROW. +TEST(AssertionTest, ASSERT_ANY_THROW) { + ASSERT_ANY_THROW(ThrowAnInteger()); + EXPECT_FATAL_FAILURE( + ASSERT_ANY_THROW(ThrowNothing()), + "Expected: ThrowNothing() throws an exception.\n" + " Actual: it doesn't."); +} + +#endif // GTEST_HAS_EXCEPTIONS + +// Makes sure we deal with the precedence of <<. This test should +// compile. +TEST(AssertionTest, AssertPrecedence) { + ASSERT_EQ(1 < 2, true); + ASSERT_EQ(true && false, false); +} + +// A subroutine used by the following test. +void TestEq1(int x) { + ASSERT_EQ(1, x); +} + +// Tests calling a test subroutine that's not part of a fixture. +TEST(AssertionTest, NonFixtureSubroutine) { + EXPECT_FATAL_FAILURE(TestEq1(2), + "Value of: x"); +} + +// An uncopyable class. +class Uncopyable { + public: + explicit Uncopyable(int a_value) : value_(a_value) {} + + int value() const { return value_; } + bool operator==(const Uncopyable& rhs) const { + return value() == rhs.value(); + } + private: + // This constructor deliberately has no implementation, as we don't + // want this class to be copyable. + Uncopyable(const Uncopyable&); // NOLINT + + int value_; +}; + +::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) { + return os << value.value(); +} + + +bool IsPositiveUncopyable(const Uncopyable& x) { + return x.value() > 0; +} + +// A subroutine used by the following test. +void TestAssertNonPositive() { + Uncopyable y(-1); + ASSERT_PRED1(IsPositiveUncopyable, y); +} +// A subroutine used by the following test. +void TestAssertEqualsUncopyable() { + Uncopyable x(5); + Uncopyable y(-1); + ASSERT_EQ(x, y); +} + +// Tests that uncopyable objects can be used in assertions. +TEST(AssertionTest, AssertWorksWithUncopyableObject) { + Uncopyable x(5); + ASSERT_PRED1(IsPositiveUncopyable, x); + ASSERT_EQ(x, x); + EXPECT_FATAL_FAILURE(TestAssertNonPositive(), + "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1"); + EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(), + "Value of: y\n Actual: -1\nExpected: x\nWhich is: 5"); +} + +// Tests that uncopyable objects can be used in expects. +TEST(AssertionTest, ExpectWorksWithUncopyableObject) { + Uncopyable x(5); + EXPECT_PRED1(IsPositiveUncopyable, x); + Uncopyable y(-1); + EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y), + "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1"); + EXPECT_EQ(x, x); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), + "Value of: y\n Actual: -1\nExpected: x\nWhich is: 5"); +} + + +// The version of gcc used in XCode 2.2 has a bug and doesn't allow +// anonymous enums in assertions. Therefore the following test is not +// done on Mac. +// Sun Studio also rejects this code. +#if !GTEST_OS_MAC && !defined(__SUNPRO_CC) + +// Tests using assertions with anonymous enums. +enum { + CASE_A = -1, +#if GTEST_OS_LINUX + // We want to test the case where the size of the anonymous enum is + // larger than sizeof(int), to make sure our implementation of the + // assertions doesn't truncate the enums. However, MSVC + // (incorrectly) doesn't allow an enum value to exceed the range of + // an int, so this has to be conditionally compiled. + // + // On Linux, CASE_B and CASE_A have the same value when truncated to + // int size. We want to test whether this will confuse the + // assertions. + CASE_B = testing::internal::kMaxBiggestInt, +#else + CASE_B = INT_MAX, +#endif // GTEST_OS_LINUX +}; + +TEST(AssertionTest, AnonymousEnum) { +#if GTEST_OS_LINUX + EXPECT_EQ(static_cast(CASE_A), static_cast(CASE_B)); +#endif // GTEST_OS_LINUX + + EXPECT_EQ(CASE_A, CASE_A); + EXPECT_NE(CASE_A, CASE_B); + EXPECT_LT(CASE_A, CASE_B); + EXPECT_LE(CASE_A, CASE_B); + EXPECT_GT(CASE_B, CASE_A); + EXPECT_GE(CASE_A, CASE_A); + EXPECT_NONFATAL_FAILURE(EXPECT_GE(CASE_A, CASE_B), + "(CASE_A) >= (CASE_B)"); + + ASSERT_EQ(CASE_A, CASE_A); + ASSERT_NE(CASE_A, CASE_B); + ASSERT_LT(CASE_A, CASE_B); + ASSERT_LE(CASE_A, CASE_B); + ASSERT_GT(CASE_B, CASE_A); + ASSERT_GE(CASE_A, CASE_A); + EXPECT_FATAL_FAILURE(ASSERT_EQ(CASE_A, CASE_B), + "Value of: CASE_B"); +} + +#endif // !GTEST_OS_MAC && !defined(__SUNPRO_CC) + +#if GTEST_OS_WINDOWS + +static HRESULT UnexpectedHRESULTFailure() { + return E_UNEXPECTED; +} + +static HRESULT OkHRESULTSuccess() { + return S_OK; +} + +static HRESULT FalseHRESULTSuccess() { + return S_FALSE; +} + +// HRESULT assertion tests test both zero and non-zero +// success codes as well as failure message for each. +// +// Windows CE doesn't support message texts. +TEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) { + EXPECT_HRESULT_SUCCEEDED(S_OK); + EXPECT_HRESULT_SUCCEEDED(S_FALSE); + + EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()), + "Expected: (UnexpectedHRESULTFailure()) succeeds.\n" + " Actual: 0x8000FFFF"); +} + +TEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) { + ASSERT_HRESULT_SUCCEEDED(S_OK); + ASSERT_HRESULT_SUCCEEDED(S_FALSE); + + EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()), + "Expected: (UnexpectedHRESULTFailure()) succeeds.\n" + " Actual: 0x8000FFFF"); +} + +TEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) { + EXPECT_HRESULT_FAILED(E_UNEXPECTED); + + EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()), + "Expected: (OkHRESULTSuccess()) fails.\n" + " Actual: 0x00000000"); + EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()), + "Expected: (FalseHRESULTSuccess()) fails.\n" + " Actual: 0x00000001"); +} + +TEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) { + ASSERT_HRESULT_FAILED(E_UNEXPECTED); + +#ifndef __BORLANDC__ + // ICE's in C++Builder 2007 and 2009. + EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()), + "Expected: (OkHRESULTSuccess()) fails.\n" + " Actual: 0x00000000"); +#endif + EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()), + "Expected: (FalseHRESULTSuccess()) fails.\n" + " Actual: 0x00000001"); +} + +// Tests that streaming to the HRESULT macros works. +TEST(HRESULTAssertionTest, Streaming) { + EXPECT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure"; + ASSERT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure"; + EXPECT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure"; + ASSERT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure"; + + EXPECT_NONFATAL_FAILURE( + EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure", + "expected failure"); + +#ifndef __BORLANDC__ + // ICE's in C++Builder 2007 and 2009. + EXPECT_FATAL_FAILURE( + ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure", + "expected failure"); +#endif + + EXPECT_NONFATAL_FAILURE( + EXPECT_HRESULT_FAILED(S_OK) << "expected failure", + "expected failure"); + + EXPECT_FATAL_FAILURE( + ASSERT_HRESULT_FAILED(S_OK) << "expected failure", + "expected failure"); +} + +#endif // GTEST_OS_WINDOWS + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +#pragma option push -w-ccc -w-rch +#endif + +// Tests that the assertion macros behave like single statements. +TEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) { + if (AlwaysFalse()) + ASSERT_TRUE(false) << "This should never be executed; " + "It's a compilation test only."; + + if (AlwaysTrue()) + EXPECT_FALSE(false); + else + ; // NOLINT + + if (AlwaysFalse()) + ASSERT_LT(1, 3); + + if (AlwaysFalse()) + ; // NOLINT + else + EXPECT_GT(3, 2) << ""; +} + +#if GTEST_HAS_EXCEPTIONS +// Tests that the compiler will not complain about unreachable code in the +// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros. +TEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) { + int n = 0; + + EXPECT_THROW(throw 1, int); + EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), ""); + EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), ""); + EXPECT_NO_THROW(n++); + EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), ""); + EXPECT_ANY_THROW(throw 1); + EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), ""); +} + +TEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) { + if (AlwaysFalse()) + EXPECT_THROW(ThrowNothing(), bool); + + if (AlwaysTrue()) + EXPECT_THROW(ThrowAnInteger(), int); + else + ; // NOLINT + + if (AlwaysFalse()) + EXPECT_NO_THROW(ThrowAnInteger()); + + if (AlwaysTrue()) + EXPECT_NO_THROW(ThrowNothing()); + else + ; // NOLINT + + if (AlwaysFalse()) + EXPECT_ANY_THROW(ThrowNothing()); + + if (AlwaysTrue()) + EXPECT_ANY_THROW(ThrowAnInteger()); + else + ; // NOLINT +} +#endif // GTEST_HAS_EXCEPTIONS + +TEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) { + if (AlwaysFalse()) + EXPECT_NO_FATAL_FAILURE(FAIL()) << "This should never be executed. " + << "It's a compilation test only."; + else + ; // NOLINT + + if (AlwaysFalse()) + ASSERT_NO_FATAL_FAILURE(FAIL()) << ""; + else + ; // NOLINT + + if (AlwaysTrue()) + EXPECT_NO_FATAL_FAILURE(SUCCEED()); + else + ; // NOLINT + + if (AlwaysFalse()) + ; // NOLINT + else + ASSERT_NO_FATAL_FAILURE(SUCCEED()); +} + +// Tests that the assertion macros work well with switch statements. +TEST(AssertionSyntaxTest, WorksWithSwitch) { + switch (0) { + case 1: + break; + default: + ASSERT_TRUE(true); + } + + switch (0) + case 0: + EXPECT_FALSE(false) << "EXPECT_FALSE failed in switch case"; + + // Binary assertions are implemented using a different code path + // than the Boolean assertions. Hence we test them separately. + switch (0) { + case 1: + default: + ASSERT_EQ(1, 1) << "ASSERT_EQ failed in default switch handler"; + } + + switch (0) + case 0: + EXPECT_NE(1, 2); +} + +#if GTEST_HAS_EXCEPTIONS + +void ThrowAString() { + throw "String"; +} + +// Test that the exception assertion macros compile and work with const +// type qualifier. +TEST(AssertionSyntaxTest, WorksWithConst) { + ASSERT_THROW(ThrowAString(), const char*); + + EXPECT_THROW(ThrowAString(), const char*); +} + +#endif // GTEST_HAS_EXCEPTIONS + +} // namespace + +namespace testing { + +// Tests that Google Test tracks SUCCEED*. +TEST(SuccessfulAssertionTest, SUCCEED) { + SUCCEED(); + SUCCEED() << "OK"; + EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful EXPECT_*. +TEST(SuccessfulAssertionTest, EXPECT) { + EXPECT_TRUE(true); + EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful EXPECT_STR*. +TEST(SuccessfulAssertionTest, EXPECT_STR) { + EXPECT_STREQ("", ""); + EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful ASSERT_*. +TEST(SuccessfulAssertionTest, ASSERT) { + ASSERT_TRUE(true); + EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +// Tests that Google Test doesn't track successful ASSERT_STR*. +TEST(SuccessfulAssertionTest, ASSERT_STR) { + ASSERT_STREQ("", ""); + EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count()); +} + +} // namespace testing + +namespace { + +// Tests EXPECT_TRUE. +TEST(ExpectTest, EXPECT_TRUE) { + EXPECT_TRUE(2 > 1); // NOLINT + EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1), + "Value of: 2 < 1\n" + " Actual: false\n" + "Expected: true"); + EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3), + "2 > 3"); +} + +// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult. +TEST(ExpectTest, ExpectTrueWithAssertionResult) { + EXPECT_TRUE(ResultIsEven(2)); + EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)), + "Value of: ResultIsEven(3)\n" + " Actual: false (3 is odd)\n" + "Expected: true"); + EXPECT_TRUE(ResultIsEvenNoExplanation(2)); + EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)), + "Value of: ResultIsEvenNoExplanation(3)\n" + " Actual: false (3 is odd)\n" + "Expected: true"); +} + +// Tests EXPECT_FALSE. +TEST(ExpectTest, EXPECT_FALSE) { + EXPECT_FALSE(2 < 1); // NOLINT + EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1), + "Value of: 2 > 1\n" + " Actual: true\n" + "Expected: false"); + EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3), + "2 < 3"); +} + +// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult. +TEST(ExpectTest, ExpectFalseWithAssertionResult) { + EXPECT_FALSE(ResultIsEven(3)); + EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)), + "Value of: ResultIsEven(2)\n" + " Actual: true (2 is even)\n" + "Expected: false"); + EXPECT_FALSE(ResultIsEvenNoExplanation(3)); + EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)), + "Value of: ResultIsEvenNoExplanation(2)\n" + " Actual: true\n" + "Expected: false"); +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" supressed them +#pragma option pop +#endif + +// Tests EXPECT_EQ. +TEST(ExpectTest, EXPECT_EQ) { + EXPECT_EQ(5, 2 + 3); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3), + "Value of: 2*3\n" + " Actual: 6\n" + "Expected: 5"); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3), + "2 - 3"); +} + +// Tests using EXPECT_EQ on double values. The purpose is to make +// sure that the specialization we did for integer and anonymous enums +// isn't used for double arguments. +TEST(ExpectTest, EXPECT_EQ_Double) { + // A success. + EXPECT_EQ(5.6, 5.6); + + // A failure. + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2), + "5.1"); +} + +#if GTEST_CAN_COMPARE_NULL +// Tests EXPECT_EQ(NULL, pointer). +TEST(ExpectTest, EXPECT_EQ_NULL) { + // A success. + const char* p = NULL; + // Some older GCC versions may issue a spurious waring in this or the next + // assertion statement. This warning should not be suppressed with + // static_cast since the test verifies the ability to use bare NULL as the + // expected parameter to the macro. + EXPECT_EQ(NULL, p); + + // A failure. + int n = 0; + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n), + "Value of: &n\n"); +} +#endif // GTEST_CAN_COMPARE_NULL + +// Tests EXPECT_EQ(0, non_pointer). Since the literal 0 can be +// treated as a null pointer by the compiler, we need to make sure +// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as +// EXPECT_EQ(static_cast(NULL), non_pointer). +TEST(ExpectTest, EXPECT_EQ_0) { + int n = 0; + + // A success. + EXPECT_EQ(0, n); + + // A failure. + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6), + "Expected: 0"); +} + +// Tests EXPECT_NE. +TEST(ExpectTest, EXPECT_NE) { + EXPECT_NE(6, 7); + + EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'), + "Expected: ('a') != ('a'), " + "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)"); + EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2), + "2"); + char* const p0 = NULL; + EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0), + "p0"); + // Only way to get the Nokia compiler to compile the cast + // is to have a separate void* variable first. Putting + // the two casts on the same line doesn't work, neither does + // a direct C-style to char*. + void* pv1 = (void*)0x1234; // NOLINT + char* const p1 = reinterpret_cast(pv1); + EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1), + "p1"); +} + +// Tests EXPECT_LE. +TEST(ExpectTest, EXPECT_LE) { + EXPECT_LE(2, 3); + EXPECT_LE(2, 2); + EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0), + "Expected: (2) <= (0), actual: 2 vs 0"); + EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9), + "(1.1) <= (0.9)"); +} + +// Tests EXPECT_LT. +TEST(ExpectTest, EXPECT_LT) { + EXPECT_LT(2, 3); + EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2), + "Expected: (2) < (2), actual: 2 vs 2"); + EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1), + "(2) < (1)"); +} + +// Tests EXPECT_GE. +TEST(ExpectTest, EXPECT_GE) { + EXPECT_GE(2, 1); + EXPECT_GE(2, 2); + EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3), + "Expected: (2) >= (3), actual: 2 vs 3"); + EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1), + "(0.9) >= (1.1)"); +} + +// Tests EXPECT_GT. +TEST(ExpectTest, EXPECT_GT) { + EXPECT_GT(2, 1); + EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2), + "Expected: (2) > (2), actual: 2 vs 2"); + EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3), + "(2) > (3)"); +} + +#if GTEST_HAS_EXCEPTIONS + +// Tests EXPECT_THROW. +TEST(ExpectTest, EXPECT_THROW) { + EXPECT_THROW(ThrowAnInteger(), int); + EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool), + "Expected: ThrowAnInteger() throws an exception of " + "type bool.\n Actual: it throws a different type."); + EXPECT_NONFATAL_FAILURE( + EXPECT_THROW(ThrowNothing(), bool), + "Expected: ThrowNothing() throws an exception of type bool.\n" + " Actual: it throws nothing."); +} + +// Tests EXPECT_NO_THROW. +TEST(ExpectTest, EXPECT_NO_THROW) { + EXPECT_NO_THROW(ThrowNothing()); + EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()), + "Expected: ThrowAnInteger() doesn't throw an " + "exception.\n Actual: it throws."); +} + +// Tests EXPECT_ANY_THROW. +TEST(ExpectTest, EXPECT_ANY_THROW) { + EXPECT_ANY_THROW(ThrowAnInteger()); + EXPECT_NONFATAL_FAILURE( + EXPECT_ANY_THROW(ThrowNothing()), + "Expected: ThrowNothing() throws an exception.\n" + " Actual: it doesn't."); +} + +#endif // GTEST_HAS_EXCEPTIONS + +// Make sure we deal with the precedence of <<. +TEST(ExpectTest, ExpectPrecedence) { + EXPECT_EQ(1 < 2, true); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false), + "Value of: true && false"); +} + + +// Tests the StreamableToString() function. + +// Tests using StreamableToString() on a scalar. +TEST(StreamableToStringTest, Scalar) { + EXPECT_STREQ("5", StreamableToString(5).c_str()); +} + +// Tests using StreamableToString() on a non-char pointer. +TEST(StreamableToStringTest, Pointer) { + int n = 0; + int* p = &n; + EXPECT_STRNE("(null)", StreamableToString(p).c_str()); +} + +// Tests using StreamableToString() on a NULL non-char pointer. +TEST(StreamableToStringTest, NullPointer) { + int* p = NULL; + EXPECT_STREQ("(null)", StreamableToString(p).c_str()); +} + +// Tests using StreamableToString() on a C string. +TEST(StreamableToStringTest, CString) { + EXPECT_STREQ("Foo", StreamableToString("Foo").c_str()); +} + +// Tests using StreamableToString() on a NULL C string. +TEST(StreamableToStringTest, NullCString) { + char* p = NULL; + EXPECT_STREQ("(null)", StreamableToString(p).c_str()); +} + +// Tests using streamable values as assertion messages. + +// Tests using std::string as an assertion message. +TEST(StreamableTest, string) { + static const std::string str( + "This failure message is a std::string, and is expected."); + EXPECT_FATAL_FAILURE(FAIL() << str, + str.c_str()); +} + +// Tests that we can output strings containing embedded NULs. +// Limited to Linux because we can only do this with std::string's. +TEST(StreamableTest, stringWithEmbeddedNUL) { + static const char char_array_with_nul[] = + "Here's a NUL\0 and some more string"; + static const std::string string_with_nul(char_array_with_nul, + sizeof(char_array_with_nul) + - 1); // drops the trailing NUL + EXPECT_FATAL_FAILURE(FAIL() << string_with_nul, + "Here's a NUL\\0 and some more string"); +} + +// Tests that we can output a NUL char. +TEST(StreamableTest, NULChar) { + EXPECT_FATAL_FAILURE({ // NOLINT + FAIL() << "A NUL" << '\0' << " and some more string"; + }, "A NUL\\0 and some more string"); +} + +// Tests using int as an assertion message. +TEST(StreamableTest, int) { + EXPECT_FATAL_FAILURE(FAIL() << 900913, + "900913"); +} + +// Tests using NULL char pointer as an assertion message. +// +// In MSVC, streaming a NULL char * causes access violation. Google Test +// implemented a workaround (substituting "(null)" for NULL). This +// tests whether the workaround works. +TEST(StreamableTest, NullCharPtr) { + EXPECT_FATAL_FAILURE(FAIL() << static_cast(NULL), + "(null)"); +} + +// Tests that basic IO manipulators (endl, ends, and flush) can be +// streamed to testing::Message. +TEST(StreamableTest, BasicIoManip) { + EXPECT_FATAL_FAILURE({ // NOLINT + FAIL() << "Line 1." << std::endl + << "A NUL char " << std::ends << std::flush << " in line 2."; + }, "Line 1.\nA NUL char \\0 in line 2."); +} + +// Tests the macros that haven't been covered so far. + +void AddFailureHelper(bool* aborted) { + *aborted = true; + ADD_FAILURE() << "Failure"; + *aborted = false; +} + +// Tests ADD_FAILURE. +TEST(MacroTest, ADD_FAILURE) { + bool aborted = true; + EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted), + "Failure"); + EXPECT_FALSE(aborted); +} + +// Tests FAIL. +TEST(MacroTest, FAIL) { + EXPECT_FATAL_FAILURE(FAIL(), + "Failed"); + EXPECT_FATAL_FAILURE(FAIL() << "Intentional failure.", + "Intentional failure."); +} + +// Tests SUCCEED +TEST(MacroTest, SUCCEED) { + SUCCEED(); + SUCCEED() << "Explicit success."; +} + + +// Tests for EXPECT_EQ() and ASSERT_EQ(). +// +// These tests fail *intentionally*, s.t. the failure messages can be +// generated and tested. +// +// We have different tests for different argument types. + +// Tests using bool values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Bool) { + EXPECT_EQ(true, true); + EXPECT_FATAL_FAILURE(ASSERT_EQ(false, true), + "Value of: true"); +} + +// Tests using int values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Int) { + ASSERT_EQ(32, 32); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33), + "33"); +} + +// Tests using time_t values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Time_T) { + EXPECT_EQ(static_cast(0), + static_cast(0)); + EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast(0), + static_cast(1234)), + "1234"); +} + +// Tests using char values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, Char) { + ASSERT_EQ('z', 'z'); + const char ch = 'b'; + EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\0', ch), + "ch"); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch), + "ch"); +} + +// Tests using wchar_t values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, WideChar) { + EXPECT_EQ(L'b', L'b'); + + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\0', L'x'), + "Value of: L'x'\n" + " Actual: L'x' (120, 0x78)\n" + "Expected: L'\0'\n" + "Which is: L'\0' (0, 0x0)"); + + static wchar_t wchar; + wchar = L'b'; + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar), + "wchar"); + wchar = L'\x8119'; + EXPECT_FATAL_FAILURE(ASSERT_EQ(L'\x8120', wchar), + "Value of: wchar"); +} + +// Tests using ::std::string values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, StdString) { + // Compares a const char* to an std::string that has identical + // content. + ASSERT_EQ("Test", ::std::string("Test")); + + // Compares two identical std::strings. + static const ::std::string str1("A * in the middle"); + static const ::std::string str2(str1); + EXPECT_EQ(str1, str2); + + // Compares a const char* to an std::string that has different + // content + EXPECT_NONFATAL_FAILURE(EXPECT_EQ("Test", ::std::string("test")), + "::std::string(\"test\")"); + + // Compares an std::string to a char* that has different content. + char* const p1 = const_cast("foo"); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string("bar"), p1), + "p1"); + + // Compares two std::strings that have different contents, one of + // which having a NUL character in the middle. This should fail. + static ::std::string str3(str1); + str3.at(2) = '\0'; + EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3), + "Value of: str3\n" + " Actual: \"A \\0 in the middle\""); +} + +#if GTEST_HAS_STD_WSTRING + +// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, StdWideString) { + // Compares an std::wstring to a const wchar_t* that has identical + // content. + EXPECT_EQ(::std::wstring(L"Test\x8119"), L"Test\x8119"); + + // Compares two identical std::wstrings. + const ::std::wstring wstr1(L"A * in the middle"); + const ::std::wstring wstr2(wstr1); + ASSERT_EQ(wstr1, wstr2); + + // Compares an std::wstring to a const wchar_t* that has different + // content. + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_EQ(::std::wstring(L"Test\x8119"), L"Test\x8120"); + }, "L\"Test\\x8120\""); + + // Compares two std::wstrings that have different contents, one of + // which having a NUL character in the middle. + ::std::wstring wstr3(wstr1); + wstr3.at(2) = L'\0'; + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3), + "wstr3"); + + // Compares a wchar_t* to an std::wstring that has different + // content. + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_EQ(const_cast(L"foo"), ::std::wstring(L"bar")); + }, ""); +} + +#endif // GTEST_HAS_STD_WSTRING + +#if GTEST_HAS_GLOBAL_STRING +// Tests using ::string values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, GlobalString) { + // Compares a const char* to a ::string that has identical content. + EXPECT_EQ("Test", ::string("Test")); + + // Compares two identical ::strings. + const ::string str1("A * in the middle"); + const ::string str2(str1); + ASSERT_EQ(str1, str2); + + // Compares a ::string to a const char* that has different content. + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string("Test"), "test"), + "test"); + + // Compares two ::strings that have different contents, one of which + // having a NUL character in the middle. + ::string str3(str1); + str3.at(2) = '\0'; + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3), + "str3"); + + // Compares a ::string to a char* that has different content. + EXPECT_FATAL_FAILURE({ // NOLINT + ASSERT_EQ(::string("bar"), const_cast("foo")); + }, ""); +} + +#endif // GTEST_HAS_GLOBAL_STRING + +#if GTEST_HAS_GLOBAL_WSTRING + +// Tests using ::wstring values in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, GlobalWideString) { + // Compares a const wchar_t* to a ::wstring that has identical content. + ASSERT_EQ(L"Test\x8119", ::wstring(L"Test\x8119")); + + // Compares two identical ::wstrings. + static const ::wstring wstr1(L"A * in the middle"); + static const ::wstring wstr2(wstr1); + EXPECT_EQ(wstr1, wstr2); + + // Compares a const wchar_t* to a ::wstring that has different + // content. + EXPECT_NONFATAL_FAILURE({ // NOLINT + EXPECT_EQ(L"Test\x8120", ::wstring(L"Test\x8119")); + }, "Test\\x8119"); + + // Compares a wchar_t* to a ::wstring that has different content. + wchar_t* const p1 = const_cast(L"foo"); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L"bar")), + "bar"); + + // Compares two ::wstrings that have different contents, one of which + // having a NUL character in the middle. + static ::wstring wstr3; + wstr3 = wstr1; + wstr3.at(2) = L'\0'; + EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3), + "wstr3"); +} + +#endif // GTEST_HAS_GLOBAL_WSTRING + +// Tests using char pointers in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, CharPointer) { + char* const p0 = NULL; + // Only way to get the Nokia compiler to compile the cast + // is to have a separate void* variable first. Putting + // the two casts on the same line doesn't work, neither does + // a direct C-style to char*. + void* pv1 = (void*)0x1234; // NOLINT + void* pv2 = (void*)0xABC0; // NOLINT + char* const p1 = reinterpret_cast(pv1); + char* const p2 = reinterpret_cast(pv2); + ASSERT_EQ(p1, p1); + + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2), + "Value of: p2"); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2), + "p2"); + EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast(0x1234), + reinterpret_cast(0xABC0)), + "ABC0"); +} + +// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, WideCharPointer) { + wchar_t* const p0 = NULL; + // Only way to get the Nokia compiler to compile the cast + // is to have a separate void* variable first. Putting + // the two casts on the same line doesn't work, neither does + // a direct C-style to char*. + void* pv1 = (void*)0x1234; // NOLINT + void* pv2 = (void*)0xABC0; // NOLINT + wchar_t* const p1 = reinterpret_cast(pv1); + wchar_t* const p2 = reinterpret_cast(pv2); + EXPECT_EQ(p0, p0); + + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2), + "Value of: p2"); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2), + "p2"); + void* pv3 = (void*)0x1234; // NOLINT + void* pv4 = (void*)0xABC0; // NOLINT + const wchar_t* p3 = reinterpret_cast(pv3); + const wchar_t* p4 = reinterpret_cast(pv4); + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4), + "p4"); +} + +// Tests using other types of pointers in {EXPECT|ASSERT}_EQ. +TEST(EqAssertionTest, OtherPointer) { + ASSERT_EQ(static_cast(NULL), + static_cast(NULL)); + EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast(NULL), + reinterpret_cast(0x1234)), + "0x1234"); +} + +// Tests the FRIEND_TEST macro. + +// This class has a private member we want to test. We will test it +// both in a TEST and in a TEST_F. +class Foo { + public: + Foo() {} + + private: + int Bar() const { return 1; } + + // Declares the friend tests that can access the private member + // Bar(). + FRIEND_TEST(FRIEND_TEST_Test, TEST); + FRIEND_TEST(FRIEND_TEST_Test2, TEST_F); +}; + +// Tests that the FRIEND_TEST declaration allows a TEST to access a +// class's private members. This should compile. +TEST(FRIEND_TEST_Test, TEST) { + ASSERT_EQ(1, Foo().Bar()); +} + +// The fixture needed to test using FRIEND_TEST with TEST_F. +class FRIEND_TEST_Test2 : public Test { + protected: + Foo foo; +}; + +// Tests that the FRIEND_TEST declaration allows a TEST_F to access a +// class's private members. This should compile. +TEST_F(FRIEND_TEST_Test2, TEST_F) { + ASSERT_EQ(1, foo.Bar()); +} + +// Tests the life cycle of Test objects. + +// The test fixture for testing the life cycle of Test objects. +// +// This class counts the number of live test objects that uses this +// fixture. +class TestLifeCycleTest : public Test { + protected: + // Constructor. Increments the number of test objects that uses + // this fixture. + TestLifeCycleTest() { count_++; } + + // Destructor. Decrements the number of test objects that uses this + // fixture. + ~TestLifeCycleTest() { count_--; } + + // Returns the number of live test objects that uses this fixture. + int count() const { return count_; } + + private: + static int count_; +}; + +int TestLifeCycleTest::count_ = 0; + +// Tests the life cycle of test objects. +TEST_F(TestLifeCycleTest, Test1) { + // There should be only one test object in this test case that's + // currently alive. + ASSERT_EQ(1, count()); +} + +// Tests the life cycle of test objects. +TEST_F(TestLifeCycleTest, Test2) { + // After Test1 is done and Test2 is started, there should still be + // only one live test object, as the object for Test1 should've been + // deleted. + ASSERT_EQ(1, count()); +} + +} // namespace + +// Tests that the copy constructor works when it is NOT optimized away by +// the compiler. +TEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) { + // Checks that the copy constructor doesn't try to dereference NULL pointers + // in the source object. + AssertionResult r1 = AssertionSuccess(); + AssertionResult r2 = r1; + // The following line is added to prevent the compiler from optimizing + // away the constructor call. + r1 << "abc"; + + AssertionResult r3 = r1; + EXPECT_EQ(static_cast(r3), static_cast(r1)); + EXPECT_STREQ("abc", r1.message()); +} + +// Tests that AssertionSuccess and AssertionFailure construct +// AssertionResult objects as expected. +TEST(AssertionResultTest, ConstructionWorks) { + AssertionResult r1 = AssertionSuccess(); + EXPECT_TRUE(r1); + EXPECT_STREQ("", r1.message()); + + AssertionResult r2 = AssertionSuccess() << "abc"; + EXPECT_TRUE(r2); + EXPECT_STREQ("abc", r2.message()); + + AssertionResult r3 = AssertionFailure(); + EXPECT_FALSE(r3); + EXPECT_STREQ("", r3.message()); + + AssertionResult r4 = AssertionFailure() << "def"; + EXPECT_FALSE(r4); + EXPECT_STREQ("def", r4.message()); + + AssertionResult r5 = AssertionFailure(Message() << "ghi"); + EXPECT_FALSE(r5); + EXPECT_STREQ("ghi", r5.message()); +} + +// Tests that the negation fips the predicate result but keeps the message. +TEST(AssertionResultTest, NegationWorks) { + AssertionResult r1 = AssertionSuccess() << "abc"; + EXPECT_FALSE(!r1); + EXPECT_STREQ("abc", (!r1).message()); + + AssertionResult r2 = AssertionFailure() << "def"; + EXPECT_TRUE(!r2); + EXPECT_STREQ("def", (!r2).message()); +} + +TEST(AssertionResultTest, StreamingWorks) { + AssertionResult r = AssertionSuccess(); + r << "abc" << 'd' << 0 << true; + EXPECT_STREQ("abcd0true", r.message()); +} + +// Tests streaming a user type whose definition and operator << are +// both in the global namespace. +class Base { + public: + explicit Base(int an_x) : x_(an_x) {} + int x() const { return x_; } + private: + int x_; +}; +std::ostream& operator<<(std::ostream& os, + const Base& val) { + return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, + const Base* pointer) { + return os << "(" << pointer->x() << ")"; +} + +TEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) { + Message msg; + Base a(1); + + msg << a << &a; // Uses ::operator<<. + EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming a user type whose definition and operator<< are +// both in an unnamed namespace. +namespace { +class MyTypeInUnnamedNameSpace : public Base { + public: + explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {} +}; +std::ostream& operator<<(std::ostream& os, + const MyTypeInUnnamedNameSpace& val) { + return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, + const MyTypeInUnnamedNameSpace* pointer) { + return os << "(" << pointer->x() << ")"; +} +} // namespace + +TEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) { + Message msg; + MyTypeInUnnamedNameSpace a(1); + + msg << a << &a; // Uses ::operator<<. + EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming a user type whose definition and operator<< are +// both in a user namespace. +namespace namespace1 { +class MyTypeInNameSpace1 : public Base { + public: + explicit MyTypeInNameSpace1(int an_x): Base(an_x) {} +}; +std::ostream& operator<<(std::ostream& os, + const MyTypeInNameSpace1& val) { + return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, + const MyTypeInNameSpace1* pointer) { + return os << "(" << pointer->x() << ")"; +} +} // namespace namespace1 + +TEST(MessageTest, CanStreamUserTypeInUserNameSpace) { + Message msg; + namespace1::MyTypeInNameSpace1 a(1); + + msg << a << &a; // Uses namespace1::operator<<. + EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming a user type whose definition is in a user namespace +// but whose operator<< is in the global namespace. +namespace namespace2 { +class MyTypeInNameSpace2 : public ::Base { + public: + explicit MyTypeInNameSpace2(int an_x): Base(an_x) {} +}; +} // namespace namespace2 +std::ostream& operator<<(std::ostream& os, + const namespace2::MyTypeInNameSpace2& val) { + return os << val.x(); +} +std::ostream& operator<<(std::ostream& os, + const namespace2::MyTypeInNameSpace2* pointer) { + return os << "(" << pointer->x() << ")"; +} + +TEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) { + Message msg; + namespace2::MyTypeInNameSpace2 a(1); + + msg << a << &a; // Uses ::operator<<. + EXPECT_STREQ("1(1)", msg.GetString().c_str()); +} + +// Tests streaming NULL pointers to testing::Message. +TEST(MessageTest, NullPointers) { + Message msg; + char* const p1 = NULL; + unsigned char* const p2 = NULL; + int* p3 = NULL; + double* p4 = NULL; + bool* p5 = NULL; + Message* p6 = NULL; + + msg << p1 << p2 << p3 << p4 << p5 << p6; + ASSERT_STREQ("(null)(null)(null)(null)(null)(null)", + msg.GetString().c_str()); +} + +// Tests streaming wide strings to testing::Message. +TEST(MessageTest, WideStrings) { + // Streams a NULL of type const wchar_t*. + const wchar_t* const_wstr = NULL; + EXPECT_STREQ("(null)", + (Message() << const_wstr).GetString().c_str()); + + // Streams a NULL of type wchar_t*. + wchar_t* wstr = NULL; + EXPECT_STREQ("(null)", + (Message() << wstr).GetString().c_str()); + + // Streams a non-NULL of type const wchar_t*. + const_wstr = L"abc\x8119"; + EXPECT_STREQ("abc\xe8\x84\x99", + (Message() << const_wstr).GetString().c_str()); + + // Streams a non-NULL of type wchar_t*. + wstr = const_cast(const_wstr); + EXPECT_STREQ("abc\xe8\x84\x99", + (Message() << wstr).GetString().c_str()); +} + + +// This line tests that we can define tests in the testing namespace. +namespace testing { + +// Tests the TestInfo class. + +class TestInfoTest : public Test { + protected: + static const TestInfo* GetTestInfo(const char* test_name) { + const TestCase* const test_case = GetUnitTestImpl()-> + GetTestCase("TestInfoTest", "", NULL, NULL); + + for (int i = 0; i < test_case->total_test_count(); ++i) { + const TestInfo* const test_info = test_case->GetTestInfo(i); + if (strcmp(test_name, test_info->name()) == 0) + return test_info; + } + return NULL; + } + + static const TestResult* GetTestResult( + const TestInfo* test_info) { + return test_info->result(); + } +}; + +// Tests TestInfo::test_case_name() and TestInfo::name(). +TEST_F(TestInfoTest, Names) { + const TestInfo* const test_info = GetTestInfo("Names"); + + ASSERT_STREQ("TestInfoTest", test_info->test_case_name()); + ASSERT_STREQ("Names", test_info->name()); +} + +// Tests TestInfo::result(). +TEST_F(TestInfoTest, result) { + const TestInfo* const test_info = GetTestInfo("result"); + + // Initially, there is no TestPartResult for this test. + ASSERT_EQ(0, GetTestResult(test_info)->total_part_count()); + + // After the previous assertion, there is still none. + ASSERT_EQ(0, GetTestResult(test_info)->total_part_count()); +} + +// Tests setting up and tearing down a test case. + +class SetUpTestCaseTest : public Test { + protected: + // This will be called once before the first test in this test case + // is run. + static void SetUpTestCase() { + printf("Setting up the test case . . .\n"); + + // Initializes some shared resource. In this simple example, we + // just create a C string. More complex stuff can be done if + // desired. + shared_resource_ = "123"; + + // Increments the number of test cases that have been set up. + counter_++; + + // SetUpTestCase() should be called only once. + EXPECT_EQ(1, counter_); + } + + // This will be called once after the last test in this test case is + // run. + static void TearDownTestCase() { + printf("Tearing down the test case . . .\n"); + + // Decrements the number of test cases that have been set up. + counter_--; + + // TearDownTestCase() should be called only once. + EXPECT_EQ(0, counter_); + + // Cleans up the shared resource. + shared_resource_ = NULL; + } + + // This will be called before each test in this test case. + virtual void SetUp() { + // SetUpTestCase() should be called only once, so counter_ should + // always be 1. + EXPECT_EQ(1, counter_); + } + + // Number of test cases that have been set up. + static int counter_; + + // Some resource to be shared by all tests in this test case. + static const char* shared_resource_; +}; + +int SetUpTestCaseTest::counter_ = 0; +const char* SetUpTestCaseTest::shared_resource_ = NULL; + +// A test that uses the shared resource. +TEST_F(SetUpTestCaseTest, Test1) { + EXPECT_STRNE(NULL, shared_resource_); +} + +// Another test that uses the shared resource. +TEST_F(SetUpTestCaseTest, Test2) { + EXPECT_STREQ("123", shared_resource_); +} + +// The InitGoogleTestTest test case tests testing::InitGoogleTest(). + +// The Flags struct stores a copy of all Google Test flags. +struct Flags { + // Constructs a Flags struct where each flag has its default value. + Flags() : also_run_disabled_tests(false), + break_on_failure(false), + catch_exceptions(false), + death_test_use_fork(false), + filter(""), + list_tests(false), + output(""), + print_time(true), + random_seed(0), + repeat(1), + shuffle(false), + stack_trace_depth(kMaxStackTraceDepth), + throw_on_failure(false) {} + + // Factory methods. + + // Creates a Flags struct where the gtest_also_run_disabled_tests flag has + // the given value. + static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) { + Flags flags; + flags.also_run_disabled_tests = also_run_disabled_tests; + return flags; + } + + // Creates a Flags struct where the gtest_break_on_failure flag has + // the given value. + static Flags BreakOnFailure(bool break_on_failure) { + Flags flags; + flags.break_on_failure = break_on_failure; + return flags; + } + + // Creates a Flags struct where the gtest_catch_exceptions flag has + // the given value. + static Flags CatchExceptions(bool catch_exceptions) { + Flags flags; + flags.catch_exceptions = catch_exceptions; + return flags; + } + + // Creates a Flags struct where the gtest_death_test_use_fork flag has + // the given value. + static Flags DeathTestUseFork(bool death_test_use_fork) { + Flags flags; + flags.death_test_use_fork = death_test_use_fork; + return flags; + } + + // Creates a Flags struct where the gtest_filter flag has the given + // value. + static Flags Filter(const char* filter) { + Flags flags; + flags.filter = filter; + return flags; + } + + // Creates a Flags struct where the gtest_list_tests flag has the + // given value. + static Flags ListTests(bool list_tests) { + Flags flags; + flags.list_tests = list_tests; + return flags; + } + + // Creates a Flags struct where the gtest_output flag has the given + // value. + static Flags Output(const char* output) { + Flags flags; + flags.output = output; + return flags; + } + + // Creates a Flags struct where the gtest_print_time flag has the given + // value. + static Flags PrintTime(bool print_time) { + Flags flags; + flags.print_time = print_time; + return flags; + } + + // Creates a Flags struct where the gtest_random_seed flag has + // the given value. + static Flags RandomSeed(Int32 random_seed) { + Flags flags; + flags.random_seed = random_seed; + return flags; + } + + // Creates a Flags struct where the gtest_repeat flag has the given + // value. + static Flags Repeat(Int32 repeat) { + Flags flags; + flags.repeat = repeat; + return flags; + } + + // Creates a Flags struct where the gtest_shuffle flag has + // the given value. + static Flags Shuffle(bool shuffle) { + Flags flags; + flags.shuffle = shuffle; + return flags; + } + + // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has + // the given value. + static Flags StackTraceDepth(Int32 stack_trace_depth) { + Flags flags; + flags.stack_trace_depth = stack_trace_depth; + return flags; + } + + // Creates a Flags struct where the gtest_throw_on_failure flag has + // the given value. + static Flags ThrowOnFailure(bool throw_on_failure) { + Flags flags; + flags.throw_on_failure = throw_on_failure; + return flags; + } + + // These fields store the flag values. + bool also_run_disabled_tests; + bool break_on_failure; + bool catch_exceptions; + bool death_test_use_fork; + const char* filter; + bool list_tests; + const char* output; + bool print_time; + Int32 random_seed; + Int32 repeat; + bool shuffle; + Int32 stack_trace_depth; + bool throw_on_failure; +}; + +// Fixture for testing InitGoogleTest(). +class InitGoogleTestTest : public Test { + protected: + // Clears the flags before each test. + virtual void SetUp() { + GTEST_FLAG(also_run_disabled_tests) = false; + GTEST_FLAG(break_on_failure) = false; + GTEST_FLAG(catch_exceptions) = false; + GTEST_FLAG(death_test_use_fork) = false; + GTEST_FLAG(filter) = ""; + GTEST_FLAG(list_tests) = false; + GTEST_FLAG(output) = ""; + GTEST_FLAG(print_time) = true; + GTEST_FLAG(random_seed) = 0; + GTEST_FLAG(repeat) = 1; + GTEST_FLAG(shuffle) = false; + GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth; + GTEST_FLAG(throw_on_failure) = false; + } + + // Asserts that two narrow or wide string arrays are equal. + template + static void AssertStringArrayEq(size_t size1, CharType** array1, + size_t size2, CharType** array2) { + ASSERT_EQ(size1, size2) << " Array sizes different."; + + for (size_t i = 0; i != size1; i++) { + ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i; + } + } + + // Verifies that the flag values match the expected values. + static void CheckFlags(const Flags& expected) { + EXPECT_EQ(expected.also_run_disabled_tests, + GTEST_FLAG(also_run_disabled_tests)); + EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure)); + EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions)); + EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork)); + EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str()); + EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests)); + EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str()); + EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time)); + EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed)); + EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat)); + EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle)); + EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure)); + EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth)); + } + + // Parses a command line (specified by argc1 and argv1), then + // verifies that the flag values are expected and that the + // recognized flags are removed from the command line. + template + static void TestParsingFlags(int argc1, const CharType** argv1, + int argc2, const CharType** argv2, + const Flags& expected, bool should_print_help) { + const bool saved_help_flag = ::testing::internal::g_help_flag; + ::testing::internal::g_help_flag = false; + +#if GTEST_HAS_STREAM_REDIRECTION_ + CaptureStdout(); +#endif // GTEST_HAS_STREAM_REDIRECTION_ + + // Parses the command line. + internal::ParseGoogleTestFlagsOnly(&argc1, const_cast(argv1)); + +#if GTEST_HAS_STREAM_REDIRECTION_ + const String captured_stdout = GetCapturedStdout(); +#endif // GTEST_HAS_STREAM_REDIRECTION_ + + // Verifies the flag values. + CheckFlags(expected); + + // Verifies that the recognized flags are removed from the command + // line. + AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2); + + // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the + // help message for the flags it recognizes. + EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag); + +#if GTEST_HAS_STREAM_REDIRECTION_ + const char* const expected_help_fragment = + "This program contains tests written using"; + if (should_print_help) { + EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout); + } else { + EXPECT_PRED_FORMAT2(IsNotSubstring, + expected_help_fragment, captured_stdout); + } +#endif // GTEST_HAS_STREAM_REDIRECTION_ + + ::testing::internal::g_help_flag = saved_help_flag; + } + + // This macro wraps TestParsingFlags s.t. the user doesn't need + // to specify the array sizes. +#define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \ + TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \ + sizeof(argv2)/sizeof(*argv2) - 1, argv2, \ + expected, should_print_help) +}; + +// Tests parsing an empty command line. +TEST_F(InitGoogleTestTest, Empty) { + const char* argv[] = { + NULL + }; + + const char* argv2[] = { + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false); +} + +// Tests parsing a command line that has no flag. +TEST_F(InitGoogleTestTest, NoFlag) { + const char* argv[] = { + "foo.exe", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false); +} + +// Tests parsing a bad --gtest_filter flag. +TEST_F(InitGoogleTestTest, FilterBad) { + const char* argv[] = { + "foo.exe", + "--gtest_filter", + NULL + }; + + const char* argv2[] = { + "foo.exe", + "--gtest_filter", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), true); +} + +// Tests parsing an empty --gtest_filter flag. +TEST_F(InitGoogleTestTest, FilterEmpty) { + const char* argv[] = { + "foo.exe", + "--gtest_filter=", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), false); +} + +// Tests parsing a non-empty --gtest_filter flag. +TEST_F(InitGoogleTestTest, FilterNonEmpty) { + const char* argv[] = { + "foo.exe", + "--gtest_filter=abc", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("abc"), false); +} + +// Tests parsing --gtest_break_on_failure. +TEST_F(InitGoogleTestTest, BreakOnFailureWithoutValue) { + const char* argv[] = { + "foo.exe", + "--gtest_break_on_failure", + NULL +}; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false); +} + +// Tests parsing --gtest_break_on_failure=0. +TEST_F(InitGoogleTestTest, BreakOnFailureFalse_0) { + const char* argv[] = { + "foo.exe", + "--gtest_break_on_failure=0", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false); +} + +// Tests parsing --gtest_break_on_failure=f. +TEST_F(InitGoogleTestTest, BreakOnFailureFalse_f) { + const char* argv[] = { + "foo.exe", + "--gtest_break_on_failure=f", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false); +} + +// Tests parsing --gtest_break_on_failure=F. +TEST_F(InitGoogleTestTest, BreakOnFailureFalse_F) { + const char* argv[] = { + "foo.exe", + "--gtest_break_on_failure=F", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false); +} + +// Tests parsing a --gtest_break_on_failure flag that has a "true" +// definition. +TEST_F(InitGoogleTestTest, BreakOnFailureTrue) { + const char* argv[] = { + "foo.exe", + "--gtest_break_on_failure=1", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false); +} + +// Tests parsing --gtest_catch_exceptions. +TEST_F(InitGoogleTestTest, CatchExceptions) { + const char* argv[] = { + "foo.exe", + "--gtest_catch_exceptions", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false); +} + +// Tests parsing --gtest_death_test_use_fork. +TEST_F(InitGoogleTestTest, DeathTestUseFork) { + const char* argv[] = { + "foo.exe", + "--gtest_death_test_use_fork", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false); +} + +// Tests having the same flag twice with different values. The +// expected behavior is that the one coming last takes precedence. +TEST_F(InitGoogleTestTest, DuplicatedFlags) { + const char* argv[] = { + "foo.exe", + "--gtest_filter=a", + "--gtest_filter=b", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("b"), false); +} + +// Tests having an unrecognized flag on the command line. +TEST_F(InitGoogleTestTest, UnrecognizedFlag) { + const char* argv[] = { + "foo.exe", + "--gtest_break_on_failure", + "bar", // Unrecognized by Google Test. + "--gtest_filter=b", + NULL + }; + + const char* argv2[] = { + "foo.exe", + "bar", + NULL + }; + + Flags flags; + flags.break_on_failure = true; + flags.filter = "b"; + GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false); +} + +// Tests having a --gtest_list_tests flag +TEST_F(InitGoogleTestTest, ListTestsFlag) { + const char* argv[] = { + "foo.exe", + "--gtest_list_tests", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false); +} + +// Tests having a --gtest_list_tests flag with a "true" value +TEST_F(InitGoogleTestTest, ListTestsTrue) { + const char* argv[] = { + "foo.exe", + "--gtest_list_tests=1", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false); +} + +// Tests having a --gtest_list_tests flag with a "false" value +TEST_F(InitGoogleTestTest, ListTestsFalse) { + const char* argv[] = { + "foo.exe", + "--gtest_list_tests=0", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false); +} + +// Tests parsing --gtest_list_tests=f. +TEST_F(InitGoogleTestTest, ListTestsFalse_f) { + const char* argv[] = { + "foo.exe", + "--gtest_list_tests=f", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false); +} + +// Tests parsing --gtest_list_tests=F. +TEST_F(InitGoogleTestTest, ListTestsFalse_F) { + const char* argv[] = { + "foo.exe", + "--gtest_list_tests=F", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false); +} + +// Tests parsing --gtest_output (invalid). +TEST_F(InitGoogleTestTest, OutputEmpty) { + const char* argv[] = { + "foo.exe", + "--gtest_output", + NULL + }; + + const char* argv2[] = { + "foo.exe", + "--gtest_output", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true); +} + +// Tests parsing --gtest_output=xml +TEST_F(InitGoogleTestTest, OutputXml) { + const char* argv[] = { + "foo.exe", + "--gtest_output=xml", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml"), false); +} + +// Tests parsing --gtest_output=xml:file +TEST_F(InitGoogleTestTest, OutputXmlFile) { + const char* argv[] = { + "foo.exe", + "--gtest_output=xml:file", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml:file"), false); +} + +// Tests parsing --gtest_output=xml:directory/path/ +TEST_F(InitGoogleTestTest, OutputXmlDirectory) { + const char* argv[] = { + "foo.exe", + "--gtest_output=xml:directory/path/", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, + Flags::Output("xml:directory/path/"), false); +} + +// Tests having a --gtest_print_time flag +TEST_F(InitGoogleTestTest, PrintTimeFlag) { + const char* argv[] = { + "foo.exe", + "--gtest_print_time", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false); +} + +// Tests having a --gtest_print_time flag with a "true" value +TEST_F(InitGoogleTestTest, PrintTimeTrue) { + const char* argv[] = { + "foo.exe", + "--gtest_print_time=1", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false); +} + +// Tests having a --gtest_print_time flag with a "false" value +TEST_F(InitGoogleTestTest, PrintTimeFalse) { + const char* argv[] = { + "foo.exe", + "--gtest_print_time=0", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false); +} + +// Tests parsing --gtest_print_time=f. +TEST_F(InitGoogleTestTest, PrintTimeFalse_f) { + const char* argv[] = { + "foo.exe", + "--gtest_print_time=f", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false); +} + +// Tests parsing --gtest_print_time=F. +TEST_F(InitGoogleTestTest, PrintTimeFalse_F) { + const char* argv[] = { + "foo.exe", + "--gtest_print_time=F", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false); +} + +// Tests parsing --gtest_random_seed=number +TEST_F(InitGoogleTestTest, RandomSeed) { + const char* argv[] = { + "foo.exe", + "--gtest_random_seed=1000", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false); +} + +// Tests parsing --gtest_repeat=number +TEST_F(InitGoogleTestTest, Repeat) { + const char* argv[] = { + "foo.exe", + "--gtest_repeat=1000", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false); +} + +// Tests having a --gtest_also_run_disabled_tests flag +TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFlag) { + const char* argv[] = { + "foo.exe", + "--gtest_also_run_disabled_tests", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, + Flags::AlsoRunDisabledTests(true), false); +} + +// Tests having a --gtest_also_run_disabled_tests flag with a "true" value +TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsTrue) { + const char* argv[] = { + "foo.exe", + "--gtest_also_run_disabled_tests=1", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, + Flags::AlsoRunDisabledTests(true), false); +} + +// Tests having a --gtest_also_run_disabled_tests flag with a "false" value +TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFalse) { + const char* argv[] = { + "foo.exe", + "--gtest_also_run_disabled_tests=0", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, + Flags::AlsoRunDisabledTests(false), false); +} + +// Tests parsing --gtest_shuffle. +TEST_F(InitGoogleTestTest, ShuffleWithoutValue) { + const char* argv[] = { + "foo.exe", + "--gtest_shuffle", + NULL +}; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false); +} + +// Tests parsing --gtest_shuffle=0. +TEST_F(InitGoogleTestTest, ShuffleFalse_0) { + const char* argv[] = { + "foo.exe", + "--gtest_shuffle=0", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false); +} + +// Tests parsing a --gtest_shuffle flag that has a "true" +// definition. +TEST_F(InitGoogleTestTest, ShuffleTrue) { + const char* argv[] = { + "foo.exe", + "--gtest_shuffle=1", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false); +} + +// Tests parsing --gtest_stack_trace_depth=number. +TEST_F(InitGoogleTestTest, StackTraceDepth) { + const char* argv[] = { + "foo.exe", + "--gtest_stack_trace_depth=5", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false); +} + +// Tests parsing --gtest_throw_on_failure. +TEST_F(InitGoogleTestTest, ThrowOnFailureWithoutValue) { + const char* argv[] = { + "foo.exe", + "--gtest_throw_on_failure", + NULL +}; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false); +} + +// Tests parsing --gtest_throw_on_failure=0. +TEST_F(InitGoogleTestTest, ThrowOnFailureFalse_0) { + const char* argv[] = { + "foo.exe", + "--gtest_throw_on_failure=0", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false); +} + +// Tests parsing a --gtest_throw_on_failure flag that has a "true" +// definition. +TEST_F(InitGoogleTestTest, ThrowOnFailureTrue) { + const char* argv[] = { + "foo.exe", + "--gtest_throw_on_failure=1", + NULL + }; + + const char* argv2[] = { + "foo.exe", + NULL + }; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false); +} + +#if GTEST_OS_WINDOWS +// Tests parsing wide strings. +TEST_F(InitGoogleTestTest, WideStrings) { + const wchar_t* argv[] = { + L"foo.exe", + L"--gtest_filter=Foo*", + L"--gtest_list_tests=1", + L"--gtest_break_on_failure", + L"--non_gtest_flag", + NULL + }; + + const wchar_t* argv2[] = { + L"foo.exe", + L"--non_gtest_flag", + NULL + }; + + Flags expected_flags; + expected_flags.break_on_failure = true; + expected_flags.filter = "Foo*"; + expected_flags.list_tests = true; + + GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false); +} +#endif // GTEST_OS_WINDOWS + +// Tests current_test_info() in UnitTest. +class CurrentTestInfoTest : public Test { + protected: + // Tests that current_test_info() returns NULL before the first test in + // the test case is run. + static void SetUpTestCase() { + // There should be no tests running at this point. + const TestInfo* test_info = + UnitTest::GetInstance()->current_test_info(); + EXPECT_TRUE(test_info == NULL) + << "There should be no tests running at this point."; + } + + // Tests that current_test_info() returns NULL after the last test in + // the test case has run. + static void TearDownTestCase() { + const TestInfo* test_info = + UnitTest::GetInstance()->current_test_info(); + EXPECT_TRUE(test_info == NULL) + << "There should be no tests running at this point."; + } +}; + +// Tests that current_test_info() returns TestInfo for currently running +// test by checking the expected test name against the actual one. +TEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) { + const TestInfo* test_info = + UnitTest::GetInstance()->current_test_info(); + ASSERT_TRUE(NULL != test_info) + << "There is a test running so we should have a valid TestInfo."; + EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name()) + << "Expected the name of the currently running test case."; + EXPECT_STREQ("WorksForFirstTestInATestCase", test_info->name()) + << "Expected the name of the currently running test."; +} + +// Tests that current_test_info() returns TestInfo for currently running +// test by checking the expected test name against the actual one. We +// use this test to see that the TestInfo object actually changed from +// the previous invocation. +TEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) { + const TestInfo* test_info = + UnitTest::GetInstance()->current_test_info(); + ASSERT_TRUE(NULL != test_info) + << "There is a test running so we should have a valid TestInfo."; + EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name()) + << "Expected the name of the currently running test case."; + EXPECT_STREQ("WorksForSecondTestInATestCase", test_info->name()) + << "Expected the name of the currently running test."; +} + +} // namespace testing + +// These two lines test that we can define tests in a namespace that +// has the name "testing" and is nested in another namespace. +namespace my_namespace { +namespace testing { + +// Makes sure that TEST knows to use ::testing::Test instead of +// ::my_namespace::testing::Test. +class Test {}; + +// Makes sure that an assertion knows to use ::testing::Message instead of +// ::my_namespace::testing::Message. +class Message {}; + +// Makes sure that an assertion knows to use +// ::testing::AssertionResult instead of +// ::my_namespace::testing::AssertionResult. +class AssertionResult {}; + +// Tests that an assertion that should succeed works as expected. +TEST(NestedTestingNamespaceTest, Success) { + EXPECT_EQ(1, 1) << "This shouldn't fail."; +} + +// Tests that an assertion that should fail works as expected. +TEST(NestedTestingNamespaceTest, Failure) { + EXPECT_FATAL_FAILURE(FAIL() << "This failure is expected.", + "This failure is expected."); +} + +} // namespace testing +} // namespace my_namespace + +// Tests that one can call superclass SetUp and TearDown methods-- +// that is, that they are not private. +// No tests are based on this fixture; the test "passes" if it compiles +// successfully. +class ProtectedFixtureMethodsTest : public Test { + protected: + virtual void SetUp() { + Test::SetUp(); + } + virtual void TearDown() { + Test::TearDown(); + } +}; + +// StreamingAssertionsTest tests the streaming versions of a representative +// sample of assertions. +TEST(StreamingAssertionsTest, Unconditional) { + SUCCEED() << "expected success"; + EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(FAIL() << "expected failure", + "expected failure"); +} + +#ifdef __BORLANDC__ +// Silences warnings: "Condition is always true", "Unreachable code" +#pragma option push -w-ccc -w-rch +#endif + +TEST(StreamingAssertionsTest, Truth) { + EXPECT_TRUE(true) << "unexpected failure"; + ASSERT_TRUE(true) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << "expected failure", + "expected failure"); +} + +TEST(StreamingAssertionsTest, Truth2) { + EXPECT_FALSE(false) << "unexpected failure"; + ASSERT_FALSE(false) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << "expected failure", + "expected failure"); +} + +#ifdef __BORLANDC__ +// Restores warnings after previous "#pragma option push" supressed them +#pragma option pop +#endif + +TEST(StreamingAssertionsTest, IntegerEquals) { + EXPECT_EQ(1, 1) << "unexpected failure"; + ASSERT_EQ(1, 1) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << "expected failure", + "expected failure"); +} + +TEST(StreamingAssertionsTest, IntegerLessThan) { + EXPECT_LT(1, 2) << "unexpected failure"; + ASSERT_LT(1, 2) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << "expected failure", + "expected failure"); +} + +TEST(StreamingAssertionsTest, StringsEqual) { + EXPECT_STREQ("foo", "foo") << "unexpected failure"; + ASSERT_STREQ("foo", "foo") << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_STREQ("foo", "bar") << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_STREQ("foo", "bar") << "expected failure", + "expected failure"); +} + +TEST(StreamingAssertionsTest, StringsNotEqual) { + EXPECT_STRNE("foo", "bar") << "unexpected failure"; + ASSERT_STRNE("foo", "bar") << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("foo", "foo") << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_STRNE("foo", "foo") << "expected failure", + "expected failure"); +} + +TEST(StreamingAssertionsTest, StringsEqualIgnoringCase) { + EXPECT_STRCASEEQ("foo", "FOO") << "unexpected failure"; + ASSERT_STRCASEEQ("foo", "FOO") << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ("foo", "bar") << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("foo", "bar") << "expected failure", + "expected failure"); +} + +TEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) { + EXPECT_STRCASENE("foo", "bar") << "unexpected failure"; + ASSERT_STRCASENE("foo", "bar") << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("foo", "FOO") << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("bar", "BAR") << "expected failure", + "expected failure"); +} + +TEST(StreamingAssertionsTest, FloatingPointEquals) { + EXPECT_FLOAT_EQ(1.0, 1.0) << "unexpected failure"; + ASSERT_FLOAT_EQ(1.0, 1.0) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << "expected failure", + "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << "expected failure", + "expected failure"); +} + +#if GTEST_HAS_EXCEPTIONS + +TEST(StreamingAssertionsTest, Throw) { + EXPECT_THROW(ThrowAnInteger(), int) << "unexpected failure"; + ASSERT_THROW(ThrowAnInteger(), int) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) << + "expected failure", "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) << + "expected failure", "expected failure"); +} + +TEST(StreamingAssertionsTest, NoThrow) { + EXPECT_NO_THROW(ThrowNothing()) << "unexpected failure"; + ASSERT_NO_THROW(ThrowNothing()) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) << + "expected failure", "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) << + "expected failure", "expected failure"); +} + +TEST(StreamingAssertionsTest, AnyThrow) { + EXPECT_ANY_THROW(ThrowAnInteger()) << "unexpected failure"; + ASSERT_ANY_THROW(ThrowAnInteger()) << "unexpected failure"; + EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) << + "expected failure", "expected failure"); + EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) << + "expected failure", "expected failure"); +} + +#endif // GTEST_HAS_EXCEPTIONS + +// Tests that Google Test correctly decides whether to use colors in the output. + +TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) { + GTEST_FLAG(color) = "yes"; + + SetEnv("TERM", "xterm"); // TERM supports colors. + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. + EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY. + + SetEnv("TERM", "dumb"); // TERM doesn't support colors. + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. + EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY. +} + +TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) { + SetEnv("TERM", "dumb"); // TERM doesn't support colors. + + GTEST_FLAG(color) = "True"; + EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY. + + GTEST_FLAG(color) = "t"; + EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY. + + GTEST_FLAG(color) = "1"; + EXPECT_TRUE(ShouldUseColor(false)); // Stdout is not a TTY. +} + +TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) { + GTEST_FLAG(color) = "no"; + + SetEnv("TERM", "xterm"); // TERM supports colors. + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + EXPECT_FALSE(ShouldUseColor(false)); // Stdout is not a TTY. + + SetEnv("TERM", "dumb"); // TERM doesn't support colors. + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + EXPECT_FALSE(ShouldUseColor(false)); // Stdout is not a TTY. +} + +TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) { + SetEnv("TERM", "xterm"); // TERM supports colors. + + GTEST_FLAG(color) = "F"; + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + + GTEST_FLAG(color) = "0"; + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + + GTEST_FLAG(color) = "unknown"; + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. +} + +TEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) { + GTEST_FLAG(color) = "auto"; + + SetEnv("TERM", "xterm"); // TERM supports colors. + EXPECT_FALSE(ShouldUseColor(false)); // Stdout is not a TTY. + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. +} + +TEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) { + GTEST_FLAG(color) = "auto"; + +#if GTEST_OS_WINDOWS + // On Windows, we ignore the TERM variable as it's usually not set. + + SetEnv("TERM", "dumb"); + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", ""); + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", "xterm"); + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. +#else + // On non-Windows platforms, we rely on TERM to determine if the + // terminal supports colors. + + SetEnv("TERM", "dumb"); // TERM doesn't support colors. + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", "emacs"); // TERM doesn't support colors. + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", "vt100"); // TERM doesn't support colors. + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", "xterm-mono"); // TERM doesn't support colors. + EXPECT_FALSE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", "xterm"); // TERM supports colors. + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", "xterm-color"); // TERM supports colors. + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. + + SetEnv("TERM", "linux"); // TERM supports colors. + EXPECT_TRUE(ShouldUseColor(true)); // Stdout is a TTY. +#endif // GTEST_OS_WINDOWS +} + +// Verifies that StaticAssertTypeEq works in a namespace scope. + +static bool dummy1 = StaticAssertTypeEq(); +static bool dummy2 = StaticAssertTypeEq(); + +// Verifies that StaticAssertTypeEq works in a class. + +template +class StaticAssertTypeEqTestHelper { + public: + StaticAssertTypeEqTestHelper() { StaticAssertTypeEq(); } +}; + +TEST(StaticAssertTypeEqTest, WorksInClass) { + StaticAssertTypeEqTestHelper(); +} + +// Verifies that StaticAssertTypeEq works inside a function. + +typedef int IntAlias; + +TEST(StaticAssertTypeEqTest, CompilesForEqualTypes) { + StaticAssertTypeEq(); + StaticAssertTypeEq(); +} + +TEST(GetCurrentOsStackTraceExceptTopTest, ReturnsTheStackTrace) { + testing::UnitTest* const unit_test = testing::UnitTest::GetInstance(); + + // We don't have a stack walker in Google Test yet. + EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 0).c_str()); + EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 1).c_str()); +} + +TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) { + EXPECT_FALSE(HasNonfatalFailure()); +} + +static void FailFatally() { FAIL(); } + +TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) { + FailFatally(); + const bool has_nonfatal_failure = HasNonfatalFailure(); + ClearCurrentTestPartResults(); + EXPECT_FALSE(has_nonfatal_failure); +} + +TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) { + ADD_FAILURE(); + const bool has_nonfatal_failure = HasNonfatalFailure(); + ClearCurrentTestPartResults(); + EXPECT_TRUE(has_nonfatal_failure); +} + +TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) { + FailFatally(); + ADD_FAILURE(); + const bool has_nonfatal_failure = HasNonfatalFailure(); + ClearCurrentTestPartResults(); + EXPECT_TRUE(has_nonfatal_failure); +} + +// A wrapper for calling HasNonfatalFailure outside of a test body. +static bool HasNonfatalFailureHelper() { + return testing::Test::HasNonfatalFailure(); +} + +TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) { + EXPECT_FALSE(HasNonfatalFailureHelper()); +} + +TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) { + ADD_FAILURE(); + const bool has_nonfatal_failure = HasNonfatalFailureHelper(); + ClearCurrentTestPartResults(); + EXPECT_TRUE(has_nonfatal_failure); +} + +TEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) { + EXPECT_FALSE(HasFailure()); +} + +TEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) { + FailFatally(); + const bool has_failure = HasFailure(); + ClearCurrentTestPartResults(); + EXPECT_TRUE(has_failure); +} + +TEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) { + ADD_FAILURE(); + const bool has_failure = HasFailure(); + ClearCurrentTestPartResults(); + EXPECT_TRUE(has_failure); +} + +TEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) { + FailFatally(); + ADD_FAILURE(); + const bool has_failure = HasFailure(); + ClearCurrentTestPartResults(); + EXPECT_TRUE(has_failure); +} + +// A wrapper for calling HasFailure outside of a test body. +static bool HasFailureHelper() { return testing::Test::HasFailure(); } + +TEST(HasFailureTest, WorksOutsideOfTestBody) { + EXPECT_FALSE(HasFailureHelper()); +} + +TEST(HasFailureTest, WorksOutsideOfTestBody2) { + ADD_FAILURE(); + const bool has_failure = HasFailureHelper(); + ClearCurrentTestPartResults(); + EXPECT_TRUE(has_failure); +} + +class TestListener : public EmptyTestEventListener { + public: + TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {} + TestListener(int* on_start_counter, bool* is_destroyed) + : on_start_counter_(on_start_counter), + is_destroyed_(is_destroyed) {} + + virtual ~TestListener() { + if (is_destroyed_) + *is_destroyed_ = true; + } + + protected: + virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) { + if (on_start_counter_ != NULL) + (*on_start_counter_)++; + } + + private: + int* on_start_counter_; + bool* is_destroyed_; +}; + +// Tests the constructor. +TEST(TestEventListenersTest, ConstructionWorks) { + TestEventListeners listeners; + + EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL); + EXPECT_TRUE(listeners.default_result_printer() == NULL); + EXPECT_TRUE(listeners.default_xml_generator() == NULL); +} + +// Tests that the TestEventListeners destructor deletes all the listeners it +// owns. +TEST(TestEventListenersTest, DestructionWorks) { + bool default_result_printer_is_destroyed = false; + bool default_xml_printer_is_destroyed = false; + bool extra_listener_is_destroyed = false; + TestListener* default_result_printer = new TestListener( + NULL, &default_result_printer_is_destroyed); + TestListener* default_xml_printer = new TestListener( + NULL, &default_xml_printer_is_destroyed); + TestListener* extra_listener = new TestListener( + NULL, &extra_listener_is_destroyed); + + { + TestEventListeners listeners; + TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, + default_result_printer); + TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, + default_xml_printer); + listeners.Append(extra_listener); + } + EXPECT_TRUE(default_result_printer_is_destroyed); + EXPECT_TRUE(default_xml_printer_is_destroyed); + EXPECT_TRUE(extra_listener_is_destroyed); +} + +// Tests that a listener Append'ed to a TestEventListeners list starts +// receiving events. +TEST(TestEventListenersTest, Append) { + int on_start_counter = 0; + bool is_destroyed = false; + TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + { + TestEventListeners listeners; + listeners.Append(listener); + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + EXPECT_EQ(1, on_start_counter); + } + EXPECT_TRUE(is_destroyed); +} + +// Tests that listeners receive events in the order they were appended to +// the list, except for *End requests, which must be received in the reverse +// order. +class SequenceTestingListener : public EmptyTestEventListener { + public: + SequenceTestingListener(std::vector* vector, const char* id) + : vector_(vector), id_(id) {} + + protected: + virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) { + vector_->push_back(GetEventDescription("OnTestProgramStart")); + } + + virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) { + vector_->push_back(GetEventDescription("OnTestProgramEnd")); + } + + virtual void OnTestIterationStart(const UnitTest& /*unit_test*/, + int /*iteration*/) { + vector_->push_back(GetEventDescription("OnTestIterationStart")); + } + + virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/, + int /*iteration*/) { + vector_->push_back(GetEventDescription("OnTestIterationEnd")); + } + + private: + String GetEventDescription(const char* method) { + Message message; + message << id_ << "." << method; + return message.GetString(); + } + + std::vector* vector_; + const char* const id_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener); +}; + +TEST(EventListenerTest, AppendKeepsOrder) { + std::vector vec; + TestEventListeners listeners; + listeners.Append(new SequenceTestingListener(&vec, "1st")); + listeners.Append(new SequenceTestingListener(&vec, "2nd")); + listeners.Append(new SequenceTestingListener(&vec, "3rd")); + + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + ASSERT_EQ(3U, vec.size()); + EXPECT_STREQ("1st.OnTestProgramStart", vec[0].c_str()); + EXPECT_STREQ("2nd.OnTestProgramStart", vec[1].c_str()); + EXPECT_STREQ("3rd.OnTestProgramStart", vec[2].c_str()); + + vec.clear(); + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd( + *UnitTest::GetInstance()); + ASSERT_EQ(3U, vec.size()); + EXPECT_STREQ("3rd.OnTestProgramEnd", vec[0].c_str()); + EXPECT_STREQ("2nd.OnTestProgramEnd", vec[1].c_str()); + EXPECT_STREQ("1st.OnTestProgramEnd", vec[2].c_str()); + + vec.clear(); + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart( + *UnitTest::GetInstance(), 0); + ASSERT_EQ(3U, vec.size()); + EXPECT_STREQ("1st.OnTestIterationStart", vec[0].c_str()); + EXPECT_STREQ("2nd.OnTestIterationStart", vec[1].c_str()); + EXPECT_STREQ("3rd.OnTestIterationStart", vec[2].c_str()); + + vec.clear(); + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd( + *UnitTest::GetInstance(), 0); + ASSERT_EQ(3U, vec.size()); + EXPECT_STREQ("3rd.OnTestIterationEnd", vec[0].c_str()); + EXPECT_STREQ("2nd.OnTestIterationEnd", vec[1].c_str()); + EXPECT_STREQ("1st.OnTestIterationEnd", vec[2].c_str()); +} + +// Tests that a listener removed from a TestEventListeners list stops receiving +// events and is not deleted when the list is destroyed. +TEST(TestEventListenersTest, Release) { + int on_start_counter = 0; + bool is_destroyed = false; + // Although Append passes the ownership of this object to the list, + // the following calls release it, and we need to delete it before the + // test ends. + TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + { + TestEventListeners listeners; + listeners.Append(listener); + EXPECT_EQ(listener, listeners.Release(listener)); + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + EXPECT_TRUE(listeners.Release(listener) == NULL); + } + EXPECT_EQ(0, on_start_counter); + EXPECT_FALSE(is_destroyed); + delete listener; +} + +// Tests that no events are forwarded when event forwarding is disabled. +TEST(EventListenerTest, SuppressEventForwarding) { + int on_start_counter = 0; + TestListener* listener = new TestListener(&on_start_counter, NULL); + + TestEventListeners listeners; + listeners.Append(listener); + ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners)); + TestEventListenersAccessor::SuppressEventForwarding(&listeners); + ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners)); + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + EXPECT_EQ(0, on_start_counter); +} + +// Tests that events generated by Google Test are not forwarded in +// death test subprocesses. +TEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) { + EXPECT_DEATH_IF_SUPPORTED({ + GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled( + *GetUnitTestImpl()->listeners())) << "expected failure";}, + "expected failure"); +} + +// Tests that a listener installed via SetDefaultResultPrinter() starts +// receiving events and is returned via default_result_printer() and that +// the previous default_result_printer is removed from the list and deleted. +TEST(EventListenerTest, default_result_printer) { + int on_start_counter = 0; + bool is_destroyed = false; + TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + + TestEventListeners listeners; + TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener); + + EXPECT_EQ(listener, listeners.default_result_printer()); + + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + + EXPECT_EQ(1, on_start_counter); + + // Replacing default_result_printer with something else should remove it + // from the list and destroy it. + TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL); + + EXPECT_TRUE(listeners.default_result_printer() == NULL); + EXPECT_TRUE(is_destroyed); + + // After broadcasting an event the counter is still the same, indicating + // the listener is not in the list anymore. + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + EXPECT_EQ(1, on_start_counter); +} + +// Tests that the default_result_printer listener stops receiving events +// when removed via Release and that is not owned by the list anymore. +TEST(EventListenerTest, RemovingDefaultResultPrinterWorks) { + int on_start_counter = 0; + bool is_destroyed = false; + // Although Append passes the ownership of this object to the list, + // the following calls release it, and we need to delete it before the + // test ends. + TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + { + TestEventListeners listeners; + TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener); + + EXPECT_EQ(listener, listeners.Release(listener)); + EXPECT_TRUE(listeners.default_result_printer() == NULL); + EXPECT_FALSE(is_destroyed); + + // Broadcasting events now should not affect default_result_printer. + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + EXPECT_EQ(0, on_start_counter); + } + // Destroying the list should not affect the listener now, too. + EXPECT_FALSE(is_destroyed); + delete listener; +} + +// Tests that a listener installed via SetDefaultXmlGenerator() starts +// receiving events and is returned via default_xml_generator() and that +// the previous default_xml_generator is removed from the list and deleted. +TEST(EventListenerTest, default_xml_generator) { + int on_start_counter = 0; + bool is_destroyed = false; + TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + + TestEventListeners listeners; + TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener); + + EXPECT_EQ(listener, listeners.default_xml_generator()); + + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + + EXPECT_EQ(1, on_start_counter); + + // Replacing default_xml_generator with something else should remove it + // from the list and destroy it. + TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL); + + EXPECT_TRUE(listeners.default_xml_generator() == NULL); + EXPECT_TRUE(is_destroyed); + + // After broadcasting an event the counter is still the same, indicating + // the listener is not in the list anymore. + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + EXPECT_EQ(1, on_start_counter); +} + +// Tests that the default_xml_generator listener stops receiving events +// when removed via Release and that is not owned by the list anymore. +TEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) { + int on_start_counter = 0; + bool is_destroyed = false; + // Although Append passes the ownership of this object to the list, + // the following calls release it, and we need to delete it before the + // test ends. + TestListener* listener = new TestListener(&on_start_counter, &is_destroyed); + { + TestEventListeners listeners; + TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener); + + EXPECT_EQ(listener, listeners.Release(listener)); + EXPECT_TRUE(listeners.default_xml_generator() == NULL); + EXPECT_FALSE(is_destroyed); + + // Broadcasting events now should not affect default_xml_generator. + TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart( + *UnitTest::GetInstance()); + EXPECT_EQ(0, on_start_counter); + } + // Destroying the list should not affect the listener now, too. + EXPECT_FALSE(is_destroyed); + delete listener; +} + +// Sanity tests to ensure that the alternative, verbose spellings of +// some of the macros work. We don't test them thoroughly as that +// would be quite involved. Since their implementations are +// straightforward, and they are rarely used, we'll just rely on the +// users to tell us when they are broken. +GTEST_TEST(AlternativeNameTest, Works) { // GTEST_TEST is the same as TEST. + GTEST_SUCCEED() << "OK"; // GTEST_SUCCEED is the same as SUCCEED. + + // GTEST_FAIL is the same as FAIL. + EXPECT_FATAL_FAILURE(GTEST_FAIL() << "An expected failure", + "An expected failure"); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc new file mode 100644 index 000000000..664baad2a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc @@ -0,0 +1,49 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: keith.ray@gmail.com (Keith Ray) +// +// gtest_xml_outfile1_test_ writes some xml via TestProperty used by +// gtest_xml_outfiles_test.py + +#include + +class PropertyOne : public testing::Test { + protected: + virtual void SetUp() { + RecordProperty("SetUpProp", 1); + } + virtual void TearDown() { + RecordProperty("TearDownProp", 1); + } +}; + +TEST_F(PropertyOne, TestSomeProperties) { + RecordProperty("TestSomeProperty", 1); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc new file mode 100644 index 000000000..3411a3d38 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc @@ -0,0 +1,49 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: keith.ray@gmail.com (Keith Ray) +// +// gtest_xml_outfile2_test_ writes some xml via TestProperty used by +// gtest_xml_outfiles_test.py + +#include + +class PropertyTwo : public testing::Test { + protected: + virtual void SetUp() { + RecordProperty("SetUpProp", 2); + } + virtual void TearDown() { + RecordProperty("TearDownProp", 2); + } +}; + +TEST_F(PropertyTwo, TestSomeProperties) { + RecordProperty("TestSomeProperty", 2); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py new file mode 100755 index 000000000..0fe947f08 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test for the gtest_xml_output module.""" + +__author__ = "keith.ray@gmail.com (Keith Ray)" + +import os +from xml.dom import minidom, Node + +import gtest_test_utils +import gtest_xml_test_utils + + +GTEST_OUTPUT_SUBDIR = "xml_outfiles" +GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_" +GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_" + +EXPECTED_XML_1 = """ + + + + + +""" + +EXPECTED_XML_2 = """ + + + + + +""" + + +class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase): + """Unit test for Google Test's XML output functionality.""" + + def setUp(self): + # We want the trailing '/' that the last "" provides in os.path.join, for + # telling Google Test to create an output directory instead of a single file + # for xml output. + self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(), + GTEST_OUTPUT_SUBDIR, "") + self.DeleteFilesAndDir() + + def tearDown(self): + self.DeleteFilesAndDir() + + def DeleteFilesAndDir(self): + try: + os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + ".xml")) + except os.error: + pass + try: + os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + ".xml")) + except os.error: + pass + try: + os.rmdir(self.output_dir_) + except os.error: + pass + + def testOutfile1(self): + self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1) + + def testOutfile2(self): + self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2) + + def _TestOutFile(self, test_name, expected_xml): + gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name) + command = [gtest_prog_path, "--gtest_output=xml:%s" % self.output_dir_] + p = gtest_test_utils.Subprocess(command, + working_dir=gtest_test_utils.GetTempDir()) + self.assert_(p.exited) + self.assertEquals(0, p.exit_code) + + # TODO(wan@google.com): libtool causes the built test binary to be + # named lt-gtest_xml_outfiles_test_ instead of + # gtest_xml_outfiles_test_. To account for this possibillity, we + # allow both names in the following code. We should remove this + # hack when Chandler Carruth's libtool replacement tool is ready. + output_file_name1 = test_name + ".xml" + output_file1 = os.path.join(self.output_dir_, output_file_name1) + output_file_name2 = 'lt-' + output_file_name1 + output_file2 = os.path.join(self.output_dir_, output_file_name2) + self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2), + output_file1) + + expected = minidom.parseString(expected_xml) + if os.path.isfile(output_file1): + actual = minidom.parse(output_file1) + else: + actual = minidom.parse(output_file2) + self.NormalizeXml(actual.documentElement) + self.AssertEquivalentNodes(expected.documentElement, + actual.documentElement) + expected.unlink() + actual.unlink() + + +if __name__ == "__main__": + os.environ["GTEST_STACK_TRACE_DEPTH"] = "0" + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py new file mode 100755 index 000000000..6d44929ca --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py @@ -0,0 +1,224 @@ +#!/usr/bin/env python +# +# Copyright 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test for the gtest_xml_output module""" + +__author__ = 'eefacm@gmail.com (Sean Mcafee)' + +import errno +import os +import sys +from xml.dom import minidom, Node + +import gtest_test_utils +import gtest_xml_test_utils + + +GTEST_OUTPUT_FLAG = "--gtest_output" +GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml" +GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_" + +SUPPORTS_STACK_TRACES = False + +if SUPPORTS_STACK_TRACES: + STACK_TRACE_TEMPLATE = "\nStack trace:\n*" +else: + STACK_TRACE_TEMPLATE = "" + +EXPECTED_NON_EMPTY_XML = """ + + + + + + + + + + + + + + + + + + + + ]]>%(stack)s]]> + + + + + + + + + + + + + + + + + + + + + +""" % {'stack': STACK_TRACE_TEMPLATE} + + +EXPECTED_EMPTY_XML = """ + +""" + + +class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase): + """ + Unit test for Google Test's XML output functionality. + """ + + def testNonEmptyXmlOutput(self): + """ + Runs a test program that generates a non-empty XML output, and + tests that the XML output is expected. + """ + self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1) + + def testEmptyXmlOutput(self): + """ + Runs a test program that generates an empty XML output, and + tests that the XML output is expected. + """ + + self._TestXmlOutput("gtest_no_test_unittest", + EXPECTED_EMPTY_XML, 0) + + def testDefaultOutputFile(self): + """ + Confirms that Google Test produces an XML output file with the expected + default name if no name is explicitly specified. + """ + output_file = os.path.join(gtest_test_utils.GetTempDir(), + GTEST_DEFAULT_OUTPUT_FILE) + gtest_prog_path = gtest_test_utils.GetTestExecutablePath( + "gtest_no_test_unittest") + try: + os.remove(output_file) + except OSError, e: + if e.errno != errno.ENOENT: + raise + + p = gtest_test_utils.Subprocess( + [gtest_prog_path, "%s=xml" % GTEST_OUTPUT_FLAG], + working_dir=gtest_test_utils.GetTempDir()) + self.assert_(p.exited) + self.assertEquals(0, p.exit_code) + self.assert_(os.path.isfile(output_file)) + + def testSuppressedXmlOutput(self): + """ + Tests that no XML file is generated if the default XML listener is + shut down before RUN_ALL_TESTS is invoked. + """ + + xml_path = os.path.join(gtest_test_utils.GetTempDir(), + GTEST_PROGRAM_NAME + "out.xml") + if os.path.isfile(xml_path): + os.remove(xml_path) + + gtest_prog_path = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME) + + command = [gtest_prog_path, + "%s=xml:%s" % (GTEST_OUTPUT_FLAG, xml_path), + "--shut_down_xml"] + p = gtest_test_utils.Subprocess(command) + if p.terminated_by_signal: + self.assert_(False, + "%s was killed by signal %d" % (gtest_prog_name, p.signal)) + else: + self.assert_(p.exited) + self.assertEquals(1, p.exit_code, + "'%s' exited with code %s, which doesn't match " + "the expected exit code %s." + % (command, p.exit_code, 1)) + + self.assert_(not os.path.isfile(xml_path)) + + + def _TestXmlOutput(self, gtest_prog_name, expected_xml, expected_exit_code): + """ + Asserts that the XML document generated by running the program + gtest_prog_name matches expected_xml, a string containing another + XML document. Furthermore, the program's exit code must be + expected_exit_code. + """ + xml_path = os.path.join(gtest_test_utils.GetTempDir(), + gtest_prog_name + "out.xml") + gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name) + + command = [gtest_prog_path, "%s=xml:%s" % (GTEST_OUTPUT_FLAG, xml_path)] + p = gtest_test_utils.Subprocess(command) + if p.terminated_by_signal: + self.assert_(False, + "%s was killed by signal %d" % (gtest_prog_name, p.signal)) + else: + self.assert_(p.exited) + self.assertEquals(expected_exit_code, p.exit_code, + "'%s' exited with code %s, which doesn't match " + "the expected exit code %s." + % (command, p.exit_code, expected_exit_code)) + + expected = minidom.parseString(expected_xml) + actual = minidom.parse(xml_path) + self.NormalizeXml(actual.documentElement) + self.AssertEquivalentNodes(expected.documentElement, + actual.documentElement) + expected.unlink() + actual .unlink() + + + +if __name__ == '__main__': + os.environ['GTEST_STACK_TRACE_DEPTH'] = '1' + gtest_test_utils.Main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc new file mode 100644 index 000000000..fc07ef46b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc @@ -0,0 +1,145 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: eefacm@gmail.com (Sean Mcafee) + +// Unit test for Google Test XML output. +// +// A user can specify XML output in a Google Test program to run via +// either the GTEST_OUTPUT environment variable or the --gtest_output +// flag. This is used for testing such functionality. +// +// This program will be invoked from a Python unit test. Don't run it +// directly. + +#include + +using ::testing::InitGoogleTest; +using ::testing::TestEventListeners; +using ::testing::UnitTest; + +class SuccessfulTest : public testing::Test { +}; + +TEST_F(SuccessfulTest, Succeeds) { + SUCCEED() << "This is a success."; + ASSERT_EQ(1, 1); +} + +class FailedTest : public testing::Test { +}; + +TEST_F(FailedTest, Fails) { + ASSERT_EQ(1, 2); +} + +class DisabledTest : public testing::Test { +}; + +TEST_F(DisabledTest, DISABLED_test_not_run) { + FAIL() << "Unexpected failure: Disabled test should not be run"; +} + +TEST(MixedResultTest, Succeeds) { + EXPECT_EQ(1, 1); + ASSERT_EQ(1, 1); +} + +TEST(MixedResultTest, Fails) { + EXPECT_EQ(1, 2); + ASSERT_EQ(2, 3); +} + +TEST(MixedResultTest, DISABLED_test) { + FAIL() << "Unexpected failure: Disabled test should not be run"; +} + +TEST(XmlQuotingTest, OutputsCData) { + FAIL() << "XML output: " + ""; +} + +// Helps to test that invalid characters produced by test code do not make +// it into the XML file. +TEST(InvalidCharactersTest, InvalidCharactersInMessage) { + FAIL() << "Invalid characters in brackets [\x1\x2]"; +} + +class PropertyRecordingTest : public testing::Test { +}; + +TEST_F(PropertyRecordingTest, OneProperty) { + RecordProperty("key_1", "1"); +} + +TEST_F(PropertyRecordingTest, IntValuedProperty) { + RecordProperty("key_int", 1); +} + +TEST_F(PropertyRecordingTest, ThreeProperties) { + RecordProperty("key_1", "1"); + RecordProperty("key_2", "2"); + RecordProperty("key_3", "3"); +} + +TEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) { + RecordProperty("key_1", "1"); + RecordProperty("key_1", "2"); +} + +TEST(NoFixtureTest, RecordProperty) { + RecordProperty("key", "1"); +} + +void ExternalUtilityThatCallsRecordProperty(const char* key, int value) { + testing::Test::RecordProperty(key, value); +} + +void ExternalUtilityThatCallsRecordProperty(const char* key, + const char* value) { + testing::Test::RecordProperty(key, value); +} + +TEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) { + ExternalUtilityThatCallsRecordProperty("key_for_utility_int", 1); +} + +TEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) { + ExternalUtilityThatCallsRecordProperty("key_for_utility_string", "1"); +} + +int main(int argc, char** argv) { + InitGoogleTest(&argc, argv); + + if (argc > 1 && strcmp(argv[1], "--shut_down_xml") == 0) { + TestEventListeners& listeners = UnitTest::GetInstance()->listeners(); + delete listeners.Release(listeners.default_xml_generator()); + } + return RUN_ALL_TESTS(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py new file mode 100755 index 000000000..c83c3b7ea --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python +# +# Copyright 2006, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unit test utilities for gtest_xml_output""" + +__author__ = 'eefacm@gmail.com (Sean Mcafee)' + +import re +from xml.dom import minidom, Node + +import gtest_test_utils + + +GTEST_OUTPUT_FLAG = "--gtest_output" +GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml" + +class GTestXMLTestCase(gtest_test_utils.TestCase): + """ + Base class for tests of Google Test's XML output functionality. + """ + + + def AssertEquivalentNodes(self, expected_node, actual_node): + """ + Asserts that actual_node (a DOM node object) is equivalent to + expected_node (another DOM node object), in that either both of + them are CDATA nodes and have the same value, or both are DOM + elements and actual_node meets all of the following conditions: + + * It has the same tag name as expected_node. + * It has the same set of attributes as expected_node, each with + the same value as the corresponding attribute of expected_node. + An exception is any attribute named "time", which needs only be + convertible to a floating-point number. + * It has an equivalent set of child nodes (including elements and + CDATA sections) as expected_node. Note that we ignore the + order of the children as they are not guaranteed to be in any + particular order. + """ + + if expected_node.nodeType == Node.CDATA_SECTION_NODE: + self.assertEquals(Node.CDATA_SECTION_NODE, actual_node.nodeType) + self.assertEquals(expected_node.nodeValue, actual_node.nodeValue) + return + + self.assertEquals(Node.ELEMENT_NODE, actual_node.nodeType) + self.assertEquals(Node.ELEMENT_NODE, expected_node.nodeType) + self.assertEquals(expected_node.tagName, actual_node.tagName) + + expected_attributes = expected_node.attributes + actual_attributes = actual_node .attributes + self.assertEquals( + expected_attributes.length, actual_attributes.length, + "attribute numbers differ in element " + actual_node.tagName) + for i in range(expected_attributes.length): + expected_attr = expected_attributes.item(i) + actual_attr = actual_attributes.get(expected_attr.name) + self.assert_( + actual_attr is not None, + "expected attribute %s not found in element %s" % + (expected_attr.name, actual_node.tagName)) + self.assertEquals(expected_attr.value, actual_attr.value, + " values of attribute %s in element %s differ" % + (expected_attr.name, actual_node.tagName)) + + expected_children = self._GetChildren(expected_node) + actual_children = self._GetChildren(actual_node) + self.assertEquals( + len(expected_children), len(actual_children), + "number of child elements differ in element " + actual_node.tagName) + for child_id, child in expected_children.iteritems(): + self.assert_(child_id in actual_children, + '<%s> is not in <%s> (in element %s)' % + (child_id, actual_children, actual_node.tagName)) + self.AssertEquivalentNodes(child, actual_children[child_id]) + + identifying_attribute = { + "testsuites": "name", + "testsuite": "name", + "testcase": "name", + "failure": "message", + } + + def _GetChildren(self, element): + """ + Fetches all of the child nodes of element, a DOM Element object. + Returns them as the values of a dictionary keyed by the IDs of the + children. For , and elements, the ID + is the value of their "name" attribute; for elements, it is + the value of the "message" attribute; CDATA sections and non-whitespace + text nodes are concatenated into a single CDATA section with ID + "detail". An exception is raised if any element other than the above + four is encountered, if two child elements with the same identifying + attributes are encountered, or if any other type of node is encountered. + """ + + children = {} + for child in element.childNodes: + if child.nodeType == Node.ELEMENT_NODE: + self.assert_(child.tagName in self.identifying_attribute, + "Encountered unknown element <%s>" % child.tagName) + childID = child.getAttribute(self.identifying_attribute[child.tagName]) + self.assert_(childID not in children) + children[childID] = child + elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]: + if "detail" not in children: + if (child.nodeType == Node.CDATA_SECTION_NODE or + not child.nodeValue.isspace()): + children["detail"] = child.ownerDocument.createCDATASection( + child.nodeValue) + else: + children["detail"].nodeValue += child.nodeValue + else: + self.fail("Encountered unexpected node type %d" % child.nodeType) + return children + + def NormalizeXml(self, element): + """ + Normalizes Google Test's XML output to eliminate references to transient + information that may change from run to run. + + * The "time" attribute of , and + elements is replaced with a single asterisk, if it contains + only digit characters. + * The line number reported in the first line of the "message" + attribute of elements is replaced with a single asterisk. + * The directory names in file paths are removed. + * The stack traces are removed. + """ + + if element.tagName in ("testsuites", "testsuite", "testcase"): + time = element.getAttributeNode("time") + time.value = re.sub(r"^\d+(\.\d+)?$", "*", time.value) + elif element.tagName == "failure": + for child in element.childNodes: + if child.nodeType == Node.CDATA_SECTION_NODE: + # Removes the source line number. + cdata = re.sub(r"^.*[/\\](.*:)\d+\n", "\\1*\n", child.nodeValue) + # Removes the actual stack trace. + child.nodeValue = re.sub(r"\nStack trace:\n(.|\n)*", + "", cdata) + for child in element.childNodes: + if child.nodeType == Node.ELEMENT_NODE: + self.NormalizeXml(child) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc new file mode 100644 index 000000000..8b8a40b44 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc @@ -0,0 +1,36 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// This is part of the unit test for include/gtest/gtest_prod.h. + +#include "production.h" + +PrivateCode::PrivateCode() : x_(0) {} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h new file mode 100644 index 000000000..8f16fffa2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h @@ -0,0 +1,55 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: wan@google.com (Zhanyong Wan) +// +// This is part of the unit test for include/gtest/gtest_prod.h. + +#ifndef GTEST_TEST_PRODUCTION_H_ +#define GTEST_TEST_PRODUCTION_H_ + +#include + +class PrivateCode { + public: + // Declares a friend test that does not use a fixture. + FRIEND_TEST(PrivateCodeTest, CanAccessPrivateMembers); + + // Declares a friend test that uses a fixture. + FRIEND_TEST(PrivateCodeFixtureTest, CanAccessPrivateMembers); + + PrivateCode(); + + int x() const { return x_; } + private: + void set_x(int an_x) { x_ = an_x; } + int x_; +}; + +#endif // GTEST_TEST_PRODUCTION_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py new file mode 100755 index 000000000..9e57931eb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py @@ -0,0 +1,466 @@ +# Copyright 2008 Google Inc. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Provides facilities for running SCons-built Google Test/Mock tests.""" + + +import optparse +import os +import re +import sets +import sys + +try: + # subrocess module is a preferable way to invoke subprocesses but it may + # not be available on MacOS X 10.4. + # Suppresses the 'Import not at the top of the file' lint complaint. + # pylint: disable-msg=C6204 + import subprocess +except ImportError: + subprocess = None + +HELP_MSG = """Runs the specified tests for %(proj)s. + +SYNOPSIS + run_tests.py [OPTION]... [BUILD_DIR]... [TEST]... + +DESCRIPTION + Runs the specified tests (either binary or Python), and prints a + summary of the results. BUILD_DIRS will be used to search for the + binaries. If no TESTs are specified, all binary tests found in + BUILD_DIRs and all Python tests found in the directory test/ (in the + %(proj)s root) are run. + + TEST is a name of either a binary or a Python test. A binary test is + an executable file named *_test or *_unittest (with the .exe + extension on Windows) A Python test is a script named *_test.py or + *_unittest.py. + +OPTIONS + -h, --help + Print this help message. + -c CONFIGURATIONS + Specify build directories via build configurations. + CONFIGURATIONS is either a comma-separated list of build + configurations or 'all'. Each configuration is equivalent to + adding 'scons/build//%(proj)s/scons' to BUILD_DIRs. + Specifying -c=all is equivalent to providing all directories + listed in KNOWN BUILD DIRECTORIES section below. + -a + Equivalent to -c=all + -b + Equivalent to -c=all with the exception that the script will not + fail if some of the KNOWN BUILD DIRECTORIES do not exists; the + script will simply not run the tests there. 'b' stands for + 'built directories'. + +RETURN VALUE + Returns 0 if all tests are successful; otherwise returns 1. + +EXAMPLES + run_tests.py + Runs all tests for the default build configuration. + run_tests.py -a + Runs all tests with binaries in KNOWN BUILD DIRECTORIES. + run_tests.py -b + Runs all tests in KNOWN BUILD DIRECTORIES that have been + built. + run_tests.py foo/ + Runs all tests in the foo/ directory and all Python tests in + the directory test. The Python tests are instructed to look + for binaries in foo/. + run_tests.py bar_test.exe test/baz_test.exe foo/ bar/ + Runs foo/bar_test.exe, bar/bar_test.exe, foo/baz_test.exe, and + bar/baz_test.exe. + run_tests.py foo bar test/foo_test.py + Runs test/foo_test.py twice instructing it to look for its + test binaries in the directories foo and bar, + correspondingly. + +KNOWN BUILD DIRECTORIES + run_tests.py knows about directories where the SCons build script + deposits its products. These are the directories where run_tests.py + will be looking for its binaries. Currently, %(proj)s's SConstruct file + defines them as follows (the default build directory is the first one + listed in each group): + On Windows: + <%(proj)s root>/scons/build/win-dbg8/%(proj)s/scons/ + <%(proj)s root>/scons/build/win-opt8/%(proj)s/scons/ + On Mac: + <%(proj)s root>/scons/build/mac-dbg/%(proj)s/scons/ + <%(proj)s root>/scons/build/mac-opt/%(proj)s/scons/ + On other platforms: + <%(proj)s root>/scons/build/dbg/%(proj)s/scons/ + <%(proj)s root>/scons/build/opt/%(proj)s/scons/""" + +IS_WINDOWS = os.name == 'nt' +IS_MAC = os.name == 'posix' and os.uname()[0] == 'Darwin' +IS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0] + +# Definition of CONFIGS must match that of the build directory names in the +# SConstruct script. The first list item is the default build configuration. +if IS_WINDOWS: + CONFIGS = ('win-dbg8', 'win-opt8') +elif IS_MAC: + CONFIGS = ('mac-dbg', 'mac-opt') +else: + CONFIGS = ('dbg', 'opt') + +if IS_WINDOWS or IS_CYGWIN: + PYTHON_TEST_REGEX = re.compile(r'_(unit)?test\.py$', re.IGNORECASE) + BINARY_TEST_REGEX = re.compile(r'_(unit)?test(\.exe)?$', re.IGNORECASE) + BINARY_TEST_SEARCH_REGEX = re.compile(r'_(unit)?test\.exe$', re.IGNORECASE) +else: + PYTHON_TEST_REGEX = re.compile(r'_(unit)?test\.py$') + BINARY_TEST_REGEX = re.compile(r'_(unit)?test$') + BINARY_TEST_SEARCH_REGEX = BINARY_TEST_REGEX + + +def _GetGtestBuildDir(injected_os, script_dir, config): + """Calculates path to the Google Test SCons build directory.""" + + return injected_os.path.normpath(injected_os.path.join(script_dir, + 'scons/build', + config, + 'gtest/scons')) + + +def _GetConfigFromBuildDir(build_dir): + """Extracts the configuration name from the build directory.""" + + # We don't want to depend on build_dir containing the correct path + # separators. + m = re.match(r'.*[\\/]([^\\/]+)[\\/][^\\/]+[\\/]scons[\\/]?$', build_dir) + if m: + return m.group(1) + else: + print >>sys.stderr, ('%s is an invalid build directory that does not ' + 'correspond to any configuration.' % (build_dir,)) + return '' + + +# All paths in this script are either absolute or relative to the current +# working directory, unless otherwise specified. +class TestRunner(object): + """Provides facilities for running Python and binary tests for Google Test.""" + + def __init__(self, + script_dir, + build_dir_var_name='GTEST_BUILD_DIR', + injected_os=os, + injected_subprocess=subprocess, + injected_build_dir_finder=_GetGtestBuildDir): + """Initializes a TestRunner instance. + + Args: + script_dir: File path to the calling script. + build_dir_var_name: Name of the env variable used to pass the + the build directory path to the invoked + tests. + injected_os: standard os module or a mock/stub for + testing. + injected_subprocess: standard subprocess module or a mock/stub + for testing + injected_build_dir_finder: function that determines the path to + the build directory. + """ + + self.os = injected_os + self.subprocess = injected_subprocess + self.build_dir_finder = injected_build_dir_finder + self.build_dir_var_name = build_dir_var_name + self.script_dir = script_dir + + def _GetBuildDirForConfig(self, config): + """Returns the build directory for a given configuration.""" + + return self.build_dir_finder(self.os, self.script_dir, config) + + def _Run(self, args): + """Runs the executable with given args (args[0] is the executable name). + + Args: + args: Command line arguments for the process. + + Returns: + Process's exit code if it exits normally, or -signal if the process is + killed by a signal. + """ + + if self.subprocess: + return self.subprocess.Popen(args).wait() + else: + return self.os.spawnv(self.os.P_WAIT, args[0], args) + + def _RunBinaryTest(self, test): + """Runs the binary test given its path. + + Args: + test: Path to the test binary. + + Returns: + Process's exit code if it exits normally, or -signal if the process is + killed by a signal. + """ + + return self._Run([test]) + + def _RunPythonTest(self, test, build_dir): + """Runs the Python test script with the specified build directory. + + Args: + test: Path to the test's Python script. + build_dir: Path to the directory where the test binary is to be found. + + Returns: + Process's exit code if it exits normally, or -signal if the process is + killed by a signal. + """ + + old_build_dir = self.os.environ.get(self.build_dir_var_name) + + try: + self.os.environ[self.build_dir_var_name] = build_dir + + # If this script is run on a Windows machine that has no association + # between the .py extension and a python interpreter, simply passing + # the script name into subprocess.Popen/os.spawn will not work. + print 'Running %s . . .' % (test,) + return self._Run([sys.executable, test]) + + finally: + if old_build_dir is None: + del self.os.environ[self.build_dir_var_name] + else: + self.os.environ[self.build_dir_var_name] = old_build_dir + + def _FindFilesByRegex(self, directory, regex): + """Returns files in a directory whose names match a regular expression. + + Args: + directory: Path to the directory to search for files. + regex: Regular expression to filter file names. + + Returns: + The list of the paths to the files in the directory. + """ + + return [self.os.path.join(directory, file_name) + for file_name in self.os.listdir(directory) + if re.search(regex, file_name)] + + # TODO(vladl@google.com): Implement parsing of scons/SConscript to run all + # tests defined there when no tests are specified. + # TODO(vladl@google.com): Update the docstring after the code is changed to + # try to test all builds defined in scons/SConscript. + def GetTestsToRun(self, + args, + named_configurations, + built_configurations, + available_configurations=CONFIGS, + python_tests_to_skip=None): + """Determines what tests should be run. + + Args: + args: The list of non-option arguments from the command line. + named_configurations: The list of configurations specified via -c or -a. + built_configurations: True if -b has been specified. + available_configurations: a list of configurations available on the + current platform, injectable for testing. + python_tests_to_skip: a collection of (configuration, python test name)s + that need to be skipped. + + Returns: + A tuple with 2 elements: the list of Python tests to run and the list of + binary tests to run. + """ + + if named_configurations == 'all': + named_configurations = ','.join(available_configurations) + + normalized_args = [self.os.path.normpath(arg) for arg in args] + + # A final list of build directories which will be searched for the test + # binaries. First, add directories specified directly on the command + # line. + build_dirs = filter(self.os.path.isdir, normalized_args) + + # Adds build directories specified via their build configurations using + # the -c or -a options. + if named_configurations: + build_dirs += [self._GetBuildDirForConfig(config) + for config in named_configurations.split(',')] + + # Adds KNOWN BUILD DIRECTORIES if -b is specified. + if built_configurations: + build_dirs += [self._GetBuildDirForConfig(config) + for config in available_configurations + if self.os.path.isdir(self._GetBuildDirForConfig(config))] + + # If no directories were specified either via -a, -b, -c, or directly, use + # the default configuration. + elif not build_dirs: + build_dirs = [self._GetBuildDirForConfig(available_configurations[0])] + + # Makes sure there are no duplications. + build_dirs = sets.Set(build_dirs) + + errors_found = False + listed_python_tests = [] # All Python tests listed on the command line. + listed_binary_tests = [] # All binary tests listed on the command line. + + test_dir = self.os.path.normpath(self.os.path.join(self.script_dir, 'test')) + + # Sifts through non-directory arguments fishing for any Python or binary + # tests and detecting errors. + for argument in sets.Set(normalized_args) - build_dirs: + if re.search(PYTHON_TEST_REGEX, argument): + python_path = self.os.path.join(test_dir, + self.os.path.basename(argument)) + if self.os.path.isfile(python_path): + listed_python_tests.append(python_path) + else: + sys.stderr.write('Unable to find Python test %s' % argument) + errors_found = True + elif re.search(BINARY_TEST_REGEX, argument): + # This script also accepts binary test names prefixed with test/ for + # the convenience of typing them (can use path completions in the + # shell). Strips test/ prefix from the binary test names. + listed_binary_tests.append(self.os.path.basename(argument)) + else: + sys.stderr.write('%s is neither test nor build directory' % argument) + errors_found = True + + if errors_found: + return None + + user_has_listed_tests = listed_python_tests or listed_binary_tests + + if user_has_listed_tests: + selected_python_tests = listed_python_tests + else: + selected_python_tests = self._FindFilesByRegex(test_dir, + PYTHON_TEST_REGEX) + + # TODO(vladl@google.com): skip unbuilt Python tests when -b is specified. + python_test_pairs = [] + for directory in build_dirs: + for test in selected_python_tests: + config = _GetConfigFromBuildDir(directory) + file_name = os.path.basename(test) + if python_tests_to_skip and (config, file_name) in python_tests_to_skip: + print ('NOTE: %s is skipped for configuration %s, as it does not ' + 'work there.' % (file_name, config)) + else: + python_test_pairs.append((directory, test)) + + binary_test_pairs = [] + for directory in build_dirs: + if user_has_listed_tests: + binary_test_pairs.extend( + [(directory, self.os.path.join(directory, test)) + for test in listed_binary_tests]) + else: + tests = self._FindFilesByRegex(directory, BINARY_TEST_SEARCH_REGEX) + binary_test_pairs.extend([(directory, test) for test in tests]) + + return (python_test_pairs, binary_test_pairs) + + def RunTests(self, python_tests, binary_tests): + """Runs Python and binary tests and reports results to the standard output. + + Args: + python_tests: List of Python tests to run in the form of tuples + (build directory, Python test script). + binary_tests: List of binary tests to run in the form of tuples + (build directory, binary file). + + Returns: + The exit code the program should pass into sys.exit(). + """ + + if python_tests or binary_tests: + results = [] + for directory, test in python_tests: + results.append((directory, + test, + self._RunPythonTest(test, directory) == 0)) + for directory, test in binary_tests: + results.append((directory, + self.os.path.basename(test), + self._RunBinaryTest(test) == 0)) + + failed = [(directory, test) + for (directory, test, success) in results + if not success] + print + print '%d tests run.' % len(results) + if failed: + print 'The following %d tests failed:' % len(failed) + for (directory, test) in failed: + print '%s in %s' % (test, directory) + return 1 + else: + print 'All tests passed!' + else: # No tests defined + print 'Nothing to test - no tests specified!' + + return 0 + + +def ParseArgs(project_name, argv=None, help_callback=None): + """Parses the options run_tests.py uses.""" + + # Suppresses lint warning on unused arguments. These arguments are + # required by optparse, even though they are unused. + # pylint: disable-msg=W0613 + def PrintHelp(option, opt, value, parser): + print HELP_MSG % {'proj': project_name} + sys.exit(1) + + parser = optparse.OptionParser() + parser.add_option('-c', + action='store', + dest='configurations', + default=None) + parser.add_option('-a', + action='store_const', + dest='configurations', + default=None, + const='all') + parser.add_option('-b', + action='store_const', + dest='built_configurations', + default=False, + const=True) + # Replaces the built-in help with ours. + parser.remove_option('-h') + parser.add_option('-h', '--help', + action='callback', + callback=help_callback or PrintHelp) + return parser.parse_args(argv) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py new file mode 100755 index 000000000..9c55726fd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py @@ -0,0 +1,676 @@ +#!/usr/bin/env python +# +# Copyright 2009 Google Inc. All Rights Reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Tests for run_tests_util.py test runner script.""" + +__author__ = 'vladl@google.com (Vlad Losev)' + +import os +import re +import sets +import unittest + +import run_tests_util + + +GTEST_DBG_DIR = 'scons/build/dbg/gtest/scons' +GTEST_OPT_DIR = 'scons/build/opt/gtest/scons' +GTEST_OTHER_DIR = 'scons/build/other/gtest/scons' + + +def AddExeExtension(path): + """Appends .exe to the path on Windows or Cygwin.""" + + if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN: + return path + '.exe' + else: + return path + + +class FakePath(object): + """A fake os.path module for testing.""" + + def __init__(self, current_dir=os.getcwd(), known_paths=None): + self.current_dir = current_dir + self.tree = {} + self.path_separator = os.sep + + # known_paths contains either absolute or relative paths. Relative paths + # are absolutized with self.current_dir. + if known_paths: + self._AddPaths(known_paths) + + def _AddPath(self, path): + ends_with_slash = path.endswith('/') + path = self.abspath(path) + if ends_with_slash: + path += self.path_separator + name_list = path.split(self.path_separator) + tree = self.tree + for name in name_list[:-1]: + if not name: + continue + if name in tree: + tree = tree[name] + else: + tree[name] = {} + tree = tree[name] + + name = name_list[-1] + if name: + if name in tree: + assert tree[name] == 1 + else: + tree[name] = 1 + + def _AddPaths(self, paths): + for path in paths: + self._AddPath(path) + + def PathElement(self, path): + """Returns an internal representation of directory tree entry for path.""" + tree = self.tree + name_list = self.abspath(path).split(self.path_separator) + for name in name_list: + if not name: + continue + tree = tree.get(name, None) + if tree is None: + break + + return tree + + # Silences pylint warning about using standard names. + # pylint: disable-msg=C6409 + def normpath(self, path): + return os.path.normpath(path) + + def abspath(self, path): + return self.normpath(os.path.join(self.current_dir, path)) + + def isfile(self, path): + return self.PathElement(self.abspath(path)) == 1 + + def isdir(self, path): + return type(self.PathElement(self.abspath(path))) == type(dict()) + + def basename(self, path): + return os.path.basename(path) + + def dirname(self, path): + return os.path.dirname(path) + + def join(self, *kargs): + return os.path.join(*kargs) + + +class FakeOs(object): + """A fake os module for testing.""" + P_WAIT = os.P_WAIT + + def __init__(self, fake_path_module): + self.path = fake_path_module + + # Some methods/attributes are delegated to the real os module. + self.environ = os.environ + + # pylint: disable-msg=C6409 + def listdir(self, path): + assert self.path.isdir(path) + return self.path.PathElement(path).iterkeys() + + def spawnv(self, wait, executable, *kargs): + assert wait == FakeOs.P_WAIT + return self.spawn_impl(executable, kargs) + + +class GetTestsToRunTest(unittest.TestCase): + """Exercises TestRunner.GetTestsToRun.""" + + def NormalizeGetTestsToRunResults(self, results): + """Normalizes path data returned from GetTestsToRun for comparison.""" + + def NormalizePythonTestPair(pair): + """Normalizes path data in the (directory, python_script) pair.""" + + return (os.path.normpath(pair[0]), os.path.normpath(pair[1])) + + def NormalizeBinaryTestPair(pair): + """Normalizes path data in the (directory, binary_executable) pair.""" + + directory, executable = map(os.path.normpath, pair) + + # On Windows and Cygwin, the test file names have the .exe extension, but + # they can be invoked either by name or by name+extension. Our test must + # accommodate both situations. + if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN: + executable = re.sub(r'\.exe$', '', executable) + return (directory, executable) + + python_tests = sets.Set(map(NormalizePythonTestPair, results[0])) + binary_tests = sets.Set(map(NormalizeBinaryTestPair, results[1])) + return (python_tests, binary_tests) + + def AssertResultsEqual(self, results, expected): + """Asserts results returned by GetTestsToRun equal to expected results.""" + + self.assertEqual(self.NormalizeGetTestsToRunResults(results), + self.NormalizeGetTestsToRunResults(expected), + 'Incorrect set of tests returned:\n%s\nexpected:\n%s' % + (results, expected)) + + def setUp(self): + self.fake_os = FakeOs(FakePath( + current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)), + known_paths=[AddExeExtension(GTEST_DBG_DIR + '/gtest_unittest'), + AddExeExtension(GTEST_OPT_DIR + '/gtest_unittest'), + 'test/gtest_color_test.py'])) + self.fake_configurations = ['dbg', 'opt'] + self.test_runner = run_tests_util.TestRunner(script_dir='.', + injected_os=self.fake_os, + injected_subprocess=None) + + def testBinaryTestsOnly(self): + """Exercises GetTestsToRun with parameters designating binary tests only.""" + + # A default build. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_unittest'], + '', + False, + available_configurations=self.fake_configurations), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')])) + + # An explicitly specified directory. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'gtest_unittest'], + '', + False, + available_configurations=self.fake_configurations), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')])) + + # A particular configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_unittest'], + 'other', + False, + available_configurations=self.fake_configurations), + ([], + [(GTEST_OTHER_DIR, GTEST_OTHER_DIR + '/gtest_unittest')])) + + # All available configurations + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_unittest'], + 'all', + False, + available_configurations=self.fake_configurations), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'), + (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')])) + + # All built configurations (unbuilt don't cause failure). + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_unittest'], + '', + True, + available_configurations=self.fake_configurations + ['unbuilt']), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'), + (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')])) + + # A combination of an explicit directory and a configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'gtest_unittest'], + 'opt', + False, + available_configurations=self.fake_configurations), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'), + (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')])) + + # Same test specified in an explicit directory and via a configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'gtest_unittest'], + 'dbg', + False, + available_configurations=self.fake_configurations), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')])) + + # All built configurations + explicit directory + explicit configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'gtest_unittest'], + 'opt', + True, + available_configurations=self.fake_configurations), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest'), + (GTEST_OPT_DIR, GTEST_OPT_DIR + '/gtest_unittest')])) + + def testPythonTestsOnly(self): + """Exercises GetTestsToRun with parameters designating Python tests only.""" + + # A default build. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_color_test.py'], + '', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + [])) + + # An explicitly specified directory. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'test/gtest_color_test.py'], + '', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + [])) + + # A particular configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_color_test.py'], + 'other', + False, + available_configurations=self.fake_configurations), + ([(GTEST_OTHER_DIR, 'test/gtest_color_test.py')], + [])) + + # All available configurations + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['test/gtest_color_test.py'], + 'all', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'), + (GTEST_OPT_DIR, 'test/gtest_color_test.py')], + [])) + + # All built configurations (unbuilt don't cause failure). + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_color_test.py'], + '', + True, + available_configurations=self.fake_configurations + ['unbuilt']), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'), + (GTEST_OPT_DIR, 'test/gtest_color_test.py')], + [])) + + # A combination of an explicit directory and a configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'gtest_color_test.py'], + 'opt', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'), + (GTEST_OPT_DIR, 'test/gtest_color_test.py')], + [])) + + # Same test specified in an explicit directory and via a configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'gtest_color_test.py'], + 'dbg', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + [])) + + # All built configurations + explicit directory + explicit configuration. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [GTEST_DBG_DIR, 'gtest_color_test.py'], + 'opt', + True, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py'), + (GTEST_OPT_DIR, 'test/gtest_color_test.py')], + [])) + + def testCombinationOfBinaryAndPythonTests(self): + """Exercises GetTestsToRun with mixed binary/Python tests.""" + + # Use only default configuration for this test. + + # Neither binary nor Python tests are specified so find all. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [], + '', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')])) + + # Specifying both binary and Python tests. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_unittest', 'gtest_color_test.py'], + '', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')])) + + # Specifying binary tests suppresses Python tests. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_unittest'], + '', + False, + available_configurations=self.fake_configurations), + ([], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')])) + + # Specifying Python tests suppresses binary tests. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_color_test.py'], + '', + False, + available_configurations=self.fake_configurations), + ([(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + [])) + + def testIgnoresNonTestFiles(self): + """Verifies that GetTestsToRun ignores non-test files in the filesystem.""" + + self.fake_os = FakeOs(FakePath( + current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)), + known_paths=[AddExeExtension(GTEST_DBG_DIR + '/gtest_nontest'), + 'test/'])) + self.test_runner = run_tests_util.TestRunner(script_dir='.', + injected_os=self.fake_os, + injected_subprocess=None) + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [], + '', + True, + available_configurations=self.fake_configurations), + ([], [])) + + def testWorksFromDifferentDir(self): + """Exercises GetTestsToRun from a directory different from run_test.py's.""" + + # Here we simulate an test script in directory /d/ called from the + # directory /a/b/c/. + self.fake_os = FakeOs(FakePath( + current_dir=os.path.abspath('/a/b/c'), + known_paths=[ + '/a/b/c/', + AddExeExtension('/d/' + GTEST_DBG_DIR + '/gtest_unittest'), + AddExeExtension('/d/' + GTEST_OPT_DIR + '/gtest_unittest'), + '/d/test/gtest_color_test.py'])) + self.fake_configurations = ['dbg', 'opt'] + self.test_runner = run_tests_util.TestRunner(script_dir='/d/', + injected_os=self.fake_os, + injected_subprocess=None) + # A binary test. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_unittest'], + '', + False, + available_configurations=self.fake_configurations), + ([], + [('/d/' + GTEST_DBG_DIR, '/d/' + GTEST_DBG_DIR + '/gtest_unittest')])) + + # A Python test. + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + ['gtest_color_test.py'], + '', + False, + available_configurations=self.fake_configurations), + ([('/d/' + GTEST_DBG_DIR, '/d/test/gtest_color_test.py')], [])) + + def testNonTestBinary(self): + """Exercises GetTestsToRun with a non-test parameter.""" + + self.assert_( + not self.test_runner.GetTestsToRun( + ['gtest_unittest_not_really'], + '', + False, + available_configurations=self.fake_configurations)) + + def testNonExistingPythonTest(self): + """Exercises GetTestsToRun with a non-existent Python test parameter.""" + + self.assert_( + not self.test_runner.GetTestsToRun( + ['nonexistent_test.py'], + '', + False, + available_configurations=self.fake_configurations)) + + if run_tests_util.IS_WINDOWS or run_tests_util.IS_CYGWIN: + + def testDoesNotPickNonExeFilesOnWindows(self): + """Verifies that GetTestsToRun does not find _test files on Windows.""" + + self.fake_os = FakeOs(FakePath( + current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)), + known_paths=['/d/' + GTEST_DBG_DIR + '/gtest_test', 'test/'])) + self.test_runner = run_tests_util.TestRunner(script_dir='.', + injected_os=self.fake_os, + injected_subprocess=None) + self.AssertResultsEqual( + self.test_runner.GetTestsToRun( + [], + '', + True, + available_configurations=self.fake_configurations), + ([], [])) + + +class RunTestsTest(unittest.TestCase): + """Exercises TestRunner.RunTests.""" + + def SpawnSuccess(self, unused_executable, unused_argv): + """Fakes test success by returning 0 as an exit code.""" + + self.num_spawn_calls += 1 + return 0 + + def SpawnFailure(self, unused_executable, unused_argv): + """Fakes test success by returning 1 as an exit code.""" + + self.num_spawn_calls += 1 + return 1 + + def setUp(self): + self.fake_os = FakeOs(FakePath( + current_dir=os.path.abspath(os.path.dirname(run_tests_util.__file__)), + known_paths=[ + AddExeExtension(GTEST_DBG_DIR + '/gtest_unittest'), + AddExeExtension(GTEST_OPT_DIR + '/gtest_unittest'), + 'test/gtest_color_test.py'])) + self.fake_configurations = ['dbg', 'opt'] + self.test_runner = run_tests_util.TestRunner( + script_dir=os.path.dirname(__file__) or '.', + injected_os=self.fake_os, + injected_subprocess=None) + self.num_spawn_calls = 0 # A number of calls to spawn. + + def testRunPythonTestSuccess(self): + """Exercises RunTests to handle a Python test success.""" + + self.fake_os.spawn_impl = self.SpawnSuccess + self.assertEqual( + self.test_runner.RunTests( + [(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + []), + 0) + self.assertEqual(self.num_spawn_calls, 1) + + def testRunBinaryTestSuccess(self): + """Exercises RunTests to handle a binary test success.""" + + self.fake_os.spawn_impl = self.SpawnSuccess + self.assertEqual( + self.test_runner.RunTests( + [], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]), + 0) + self.assertEqual(self.num_spawn_calls, 1) + + def testRunPythonTestFauilure(self): + """Exercises RunTests to handle a Python test failure.""" + + self.fake_os.spawn_impl = self.SpawnFailure + self.assertEqual( + self.test_runner.RunTests( + [(GTEST_DBG_DIR, 'test/gtest_color_test.py')], + []), + 1) + self.assertEqual(self.num_spawn_calls, 1) + + def testRunBinaryTestFailure(self): + """Exercises RunTests to handle a binary test failure.""" + + self.fake_os.spawn_impl = self.SpawnFailure + self.assertEqual( + self.test_runner.RunTests( + [], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]), + 1) + self.assertEqual(self.num_spawn_calls, 1) + + def testCombinedTestSuccess(self): + """Exercises RunTests to handle a success of both Python and binary test.""" + + self.fake_os.spawn_impl = self.SpawnSuccess + self.assertEqual( + self.test_runner.RunTests( + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]), + 0) + self.assertEqual(self.num_spawn_calls, 2) + + def testCombinedTestSuccessAndFailure(self): + """Exercises RunTests to handle a success of both Python and binary test.""" + + def SpawnImpl(executable, argv): + self.num_spawn_calls += 1 + # Simulates failure of a Python test and success of a binary test. + if '.py' in executable or '.py' in argv[0]: + return 1 + else: + return 0 + + self.fake_os.spawn_impl = SpawnImpl + self.assertEqual( + self.test_runner.RunTests( + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')], + [(GTEST_DBG_DIR, GTEST_DBG_DIR + '/gtest_unittest')]), + 0) + self.assertEqual(self.num_spawn_calls, 2) + + +class ParseArgsTest(unittest.TestCase): + """Exercises ParseArgs.""" + + def testNoOptions(self): + options, args = run_tests_util.ParseArgs('gtest', argv=['script.py']) + self.assertEqual(args, ['script.py']) + self.assert_(options.configurations is None) + self.assertFalse(options.built_configurations) + + def testOptionC(self): + options, args = run_tests_util.ParseArgs( + 'gtest', argv=['script.py', '-c', 'dbg']) + self.assertEqual(args, ['script.py']) + self.assertEqual(options.configurations, 'dbg') + self.assertFalse(options.built_configurations) + + def testOptionA(self): + options, args = run_tests_util.ParseArgs('gtest', argv=['script.py', '-a']) + self.assertEqual(args, ['script.py']) + self.assertEqual(options.configurations, 'all') + self.assertFalse(options.built_configurations) + + def testOptionB(self): + options, args = run_tests_util.ParseArgs('gtest', argv=['script.py', '-b']) + self.assertEqual(args, ['script.py']) + self.assert_(options.configurations is None) + self.assertTrue(options.built_configurations) + + def testOptionCAndOptionB(self): + options, args = run_tests_util.ParseArgs( + 'gtest', argv=['script.py', '-c', 'dbg', '-b']) + self.assertEqual(args, ['script.py']) + self.assertEqual(options.configurations, 'dbg') + self.assertTrue(options.built_configurations) + + def testOptionH(self): + help_called = [False] + + # Suppresses lint warning on unused arguments. These arguments are + # required by optparse, even though they are unused. + # pylint: disable-msg=W0613 + def VerifyHelp(option, opt, value, parser): + help_called[0] = True + + # Verifies that -h causes the help callback to be called. + help_called[0] = False + _, args = run_tests_util.ParseArgs( + 'gtest', argv=['script.py', '-h'], help_callback=VerifyHelp) + self.assertEqual(args, ['script.py']) + self.assertTrue(help_called[0]) + + # Verifies that --help causes the help callback to be called. + help_called[0] = False + _, args = run_tests_util.ParseArgs( + 'gtest', argv=['script.py', '--help'], help_callback=VerifyHelp) + self.assertEqual(args, ['script.py']) + self.assertTrue(help_called[0]) + + +if __name__ == '__main__': + unittest.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig new file mode 100644 index 000000000..3d68157d5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig @@ -0,0 +1,30 @@ +// +// DebugProject.xcconfig +// +// These are Debug Configuration project settings for the gtest framework and +// examples. It is set in the "Based On:" dropdown in the "Project" info +// dialog. +// This file is based on the Xcode Configuration files in: +// http://code.google.com/p/google-toolbox-for-mac/ +// + +#include "General.xcconfig" + +// No optimization +GCC_OPTIMIZATION_LEVEL = 0 + +// Deployment postprocessing is what triggers Xcode to strip, turn it off +DEPLOYMENT_POSTPROCESSING = NO + +// Dead code stripping off +DEAD_CODE_STRIPPING = NO + +// Debug symbols should be on obviously +GCC_GENERATE_DEBUGGING_SYMBOLS = YES + +// Define the DEBUG macro in all debug builds +OTHER_CFLAGS = $(OTHER_CFLAGS) -DDEBUG=1 + +// These are turned off to avoid STL incompatibilities with client code +// // Turns on special C++ STL checks to "encourage" good STL use +// GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) _GLIBCXX_DEBUG_PEDANTIC _GLIBCXX_DEBUG _GLIBCPP_CONCEPT_CHECKS diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig new file mode 100644 index 000000000..357b1c8fb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig @@ -0,0 +1,17 @@ +// +// FrameworkTarget.xcconfig +// +// These are Framework target settings for the gtest framework and examples. It +// is set in the "Based On:" dropdown in the "Target" info dialog. +// This file is based on the Xcode Configuration files in: +// http://code.google.com/p/google-toolbox-for-mac/ +// + +// Dynamic libs need to be position independent +GCC_DYNAMIC_NO_PIC = NO + +// Dynamic libs should not have their external symbols stripped. +STRIP_STYLE = non-global + +// Let the user install by specifying the $DSTROOT with xcodebuild +SKIP_INSTALL = NO diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig new file mode 100644 index 000000000..f23e32227 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig @@ -0,0 +1,41 @@ +// +// General.xcconfig +// +// These are General configuration settings for the gtest framework and +// examples. +// This file is based on the Xcode Configuration files in: +// http://code.google.com/p/google-toolbox-for-mac/ +// + +// Build for PPC and Intel, 32- and 64-bit +ARCHS = i386 x86_64 ppc ppc64 + +// Zerolink prevents link warnings so turn it off +ZERO_LINK = NO + +// Prebinding considered unhelpful in 10.3 and later +PREBINDING = NO + +// Strictest warning policy +WARNING_CFLAGS = -Wall -Werror -Wendif-labels -Wnewline-eof -Wno-sign-compare -Wshadow + +// Work around Xcode bugs by using external strip. See: +// http://lists.apple.com/archives/Xcode-users/2006/Feb/msg00050.html +SEPARATE_STRIP = YES + +// Force C99 dialect +GCC_C_LANGUAGE_STANDARD = c99 + +// not sure why apple defaults this on, but it's pretty risky +ALWAYS_SEARCH_USER_PATHS = NO + +// Turn on position dependent code for most cases (overridden where appropriate) +GCC_DYNAMIC_NO_PIC = YES + +// Default SDK and minimum OS version is 10.4 +SDKROOT = $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk +MACOSX_DEPLOYMENT_TARGET = 10.4 +GCC_VERSION = 4.0 + +// VERSIONING BUILD SETTINGS (used in Info.plist) +GTEST_VERSIONINFO_ABOUT = © 2008 Google Inc. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig new file mode 100644 index 000000000..5349f0a04 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig @@ -0,0 +1,32 @@ +// +// ReleaseProject.xcconfig +// +// These are Release Configuration project settings for the gtest framework +// and examples. It is set in the "Based On:" dropdown in the "Project" info +// dialog. +// This file is based on the Xcode Configuration files in: +// http://code.google.com/p/google-toolbox-for-mac/ +// + +#include "General.xcconfig" + +// subconfig/Release.xcconfig + +// Optimize for space and size (Apple recommendation) +GCC_OPTIMIZATION_LEVEL = s + +// Deploment postprocessing is what triggers Xcode to strip +DEPLOYMENT_POSTPROCESSING = YES + +// No symbols +GCC_GENERATE_DEBUGGING_SYMBOLS = NO + +// Dead code strip does not affect ObjC code but can help for C +DEAD_CODE_STRIPPING = YES + +// NDEBUG is used by things like assert.h, so define it for general compat. +// ASSERT going away in release tends to create unused vars. +OTHER_CFLAGS = $(OTHER_CFLAGS) -DNDEBUG=1 -Wno-unused-variable + +// When we strip we want to strip all symbols in release, but save externals. +STRIP_STYLE = all diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig new file mode 100644 index 000000000..3922fa51d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig @@ -0,0 +1,18 @@ +// +// StaticLibraryTarget.xcconfig +// +// These are static library target settings for libgtest.a. It +// is set in the "Based On:" dropdown in the "Target" info dialog. +// This file is based on the Xcode Configuration files in: +// http://code.google.com/p/google-toolbox-for-mac/ +// + +// Static libs can be included in bundles so make them position independent +GCC_DYNAMIC_NO_PIC = NO + +// Static libs should not have their internal globals or external symbols +// stripped. +STRIP_STYLE = debugging + +// Let the user install by specifying the $DSTROOT with xcodebuild +SKIP_INSTALL = NO diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig new file mode 100644 index 000000000..e6652ba85 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig @@ -0,0 +1,8 @@ +// +// TestTarget.xcconfig +// +// These are Test target settings for the gtest framework and examples. It +// is set in the "Based On:" dropdown in the "Target" info dialog. + +PRODUCT_NAME = $(TARGET_NAME) +HEADER_SEARCH_PATHS = ../include diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist new file mode 100644 index 000000000..9dd28ea14 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.google.${PRODUCT_NAME} + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleSignature + ???? + CFBundleVersion + GTEST_VERSIONINFO_LONG + CFBundleShortVersionString + GTEST_VERSIONINFO_SHORT + CFBundleGetInfoString + ${PRODUCT_NAME} GTEST_VERSIONINFO_LONG, ${GTEST_VERSIONINFO_ABOUT} + NSHumanReadableCopyright + ${GTEST_VERSIONINFO_ABOUT} + CSResourcesFileMapped + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist new file mode 100644 index 000000000..f3852edea --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.google.gtest.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + CSResourcesFileMapped + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj new file mode 100644 index 000000000..497617eb6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj @@ -0,0 +1,457 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXAggregateTarget section */ + 4024D162113D7D2400C7059E /* Test */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget "Test" */; + buildPhases = ( + 4024D161113D7D2400C7059E /* ShellScript */, + ); + dependencies = ( + 4024D166113D7D3100C7059E /* PBXTargetDependency */, + ); + name = Test; + productName = TestAndBuild; + }; + 4024D1E9113D83FF00C7059E /* TestAndBuild */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget "TestAndBuild" */; + buildPhases = ( + ); + dependencies = ( + 4024D1ED113D840900C7059E /* PBXTargetDependency */, + 4024D1EF113D840D00C7059E /* PBXTargetDependency */, + ); + name = TestAndBuild; + productName = TestAndBuild; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1230E5AEE3500C7F239 /* widget.cc */; }; + 3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7EB1240E5AEE3500C7F239 /* widget.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1270E5AEE4600C7F239 /* widget_test.cc */; }; + 3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */; }; + 4024D188113D7D7800C7059E /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D185113D7D5500C7059E /* libgtest.a */; }; + 4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D183113D7D5500C7059E /* libgtest_main.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0; + remoteInfo = gTestExample; + }; + 4024D165113D7D3100C7059E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 3B07BDE90E3F3F9E00647869; + remoteInfo = WidgetFrameworkTest; + }; + 4024D1EC113D840900C7059E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0; + remoteInfo = WidgetFramework; + }; + 4024D1EE113D840D00C7059E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4024D162113D7D2400C7059E; + remoteInfo = Test; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = WidgetFrameworkTest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B7EB1230E5AEE3500C7F239 /* widget.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget.cc; sourceTree = ""; }; + 3B7EB1240E5AEE3500C7F239 /* widget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = widget.h; sourceTree = ""; }; + 3B7EB1270E5AEE4600C7F239 /* widget_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget_test.cc; sourceTree = ""; }; + 4024D183113D7D5500C7059E /* libgtest_main.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest_main.a; path = /usr/local/lib/libgtest_main.a; sourceTree = ""; }; + 4024D185113D7D5500C7059E /* libgtest.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest.a; path = /usr/local/lib/libgtest.a; sourceTree = ""; }; + 4024D1E2113D838200C7059E /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = ""; }; + 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; + 8D07F2C80486CC7A007CD1D0 /* Widget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Widget.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3B07BDE80E3F3F9E00647869 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */, + 4024D188113D7D7800C7059E /* libgtest.a in Frameworks */, + 3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DDFF38A45A11DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 8D07F2C80486CC7A007CD1D0 /* Widget.framework */, + 3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* gTestExample */ = { + isa = PBXGroup; + children = ( + 4024D1E1113D836C00C7059E /* Scripts */, + 08FB77ACFE841707C02AAC07 /* Source */, + 089C1665FE841158C02AAC07 /* Resources */, + 3B07BE350E4094E400647869 /* Test */, + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, + 034768DDFF38A45A11DB9C8B /* Products */, + ); + name = gTestExample; + sourceTree = ""; + }; + 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 4024D183113D7D5500C7059E /* libgtest_main.a */, + 4024D185113D7D5500C7059E /* libgtest.a */, + ); + name = "External Frameworks and Libraries"; + sourceTree = ""; + }; + 089C1665FE841158C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 8D07F2C70486CC7A007CD1D0 /* Info.plist */, + ); + name = Resources; + sourceTree = ""; + }; + 08FB77ACFE841707C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 3B7EB1230E5AEE3500C7F239 /* widget.cc */, + 3B7EB1240E5AEE3500C7F239 /* widget.h */, + ); + name = Source; + sourceTree = ""; + }; + 3B07BE350E4094E400647869 /* Test */ = { + isa = PBXGroup; + children = ( + 3B7EB1270E5AEE4600C7F239 /* widget_test.cc */, + ); + name = Test; + sourceTree = ""; + }; + 4024D1E1113D836C00C7059E /* Scripts */ = { + isa = PBXGroup; + children = ( + 4024D1E2113D838200C7059E /* runtests.sh */, + ); + name = Scripts; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget "WidgetFrameworkTest" */; + buildPhases = ( + 3B07BDE70E3F3F9E00647869 /* Sources */, + 3B07BDE80E3F3F9E00647869 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */, + ); + name = WidgetFrameworkTest; + productName = gTestExampleTest; + productReference = 3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */; + productType = "com.apple.product-type.tool"; + }; + 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "WidgetFramework" */; + buildPhases = ( + 8D07F2C10486CC7A007CD1D0 /* Sources */, + 8D07F2C30486CC7A007CD1D0 /* Frameworks */, + 8D07F2BD0486CC7A007CD1D0 /* Headers */, + 8D07F2BF0486CC7A007CD1D0 /* Resources */, + 8D07F2C50486CC7A007CD1D0 /* Rez */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WidgetFramework; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = gTestExample; + productReference = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "WidgetFramework" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + mainGroup = 0867D691FE84028FC02AAC07 /* gTestExample */; + productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */, + 3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */, + 4024D162113D7D2400C7059E /* Test */, + 4024D1E9113D83FF00C7059E /* TestAndBuild */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXRezBuildPhase section */ + 8D07F2C50486CC7A007CD1D0 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXRezBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 4024D161113D7D2400C7059E /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/bash $SRCROOT/runtests.sh $BUILT_PRODUCTS_DIR/WidgetFrameworkTest\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3B07BDE70E3F3F9E00647869 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2C10486CC7A007CD1D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */; + targetProxy = 3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */; + }; + 4024D166113D7D3100C7059E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */; + targetProxy = 4024D165113D7D3100C7059E /* PBXContainerItemProxy */; + }; + 4024D1ED113D840900C7059E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */; + targetProxy = 4024D1EC113D840900C7059E /* PBXContainerItemProxy */; + }; + 4024D1EF113D840D00C7059E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4024D162113D7D2400C7059E /* Test */; + targetProxy = 4024D1EE113D840D00C7059E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 3B07BDEC0E3F3F9F00647869 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = WidgetFrameworkTest; + }; + name = Debug; + }; + 3B07BDED0E3F3F9F00647869 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = WidgetFrameworkTest; + }; + name = Release; + }; + 4024D163113D7D2400C7059E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = TestAndBuild; + }; + name = Debug; + }; + 4024D164113D7D2400C7059E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = TestAndBuild; + }; + name = Release; + }; + 4024D1EA113D83FF00C7059E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = TestAndBuild; + }; + name = Debug; + }; + 4024D1EB113D83FF00C7059E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = TestAndBuild; + }; + name = Release; + }; + 4FADC24308B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "@loader_path/../Frameworks"; + PRODUCT_NAME = Widget; + }; + name = Debug; + }; + 4FADC24408B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + FRAMEWORK_VERSION = A; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "@loader_path/../Frameworks"; + PRODUCT_NAME = Widget; + }; + name = Release; + }; + 4FADC24708B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_VERSION = 4.0; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + 4FADC24808B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_VERSION = 4.0; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget "WidgetFrameworkTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3B07BDEC0E3F3F9F00647869 /* Debug */, + 3B07BDED0E3F3F9F00647869 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget "Test" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4024D163113D7D2400C7059E /* Debug */, + 4024D164113D7D2400C7059E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget "TestAndBuild" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4024D1EA113D83FF00C7059E /* Debug */, + 4024D1EB113D83FF00C7059E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "WidgetFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24308B4156D00ABE55E /* Debug */, + 4FADC24408B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "WidgetFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24708B4156D00ABE55E /* Debug */, + 4FADC24808B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh new file mode 100644 index 000000000..4a0d413e5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Executes the samples and tests for the Google Test Framework. + +# Help the dynamic linker find the path to the libraries. +export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR +export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR + +# Create some executables. +test_executables=$@ + +# Now execute each one in turn keeping track of how many succeeded and failed. +succeeded=0 +failed=0 +failed_list=() +for test in ${test_executables[*]}; do + "$test" + result=$? + if [ $result -eq 0 ]; then + succeeded=$(( $succeeded + 1 )) + else + failed=$(( failed + 1 )) + failed_list="$failed_list $test" + fi +done + +# Report the successes and failures to the console. +echo "Tests complete with $succeeded successes and $failed failures." +if [ $failed -ne 0 ]; then + echo "The following tests failed:" + echo $failed_list +fi +exit $failed diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc new file mode 100644 index 000000000..bfc4e7fcf --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc @@ -0,0 +1,63 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: preston.a.jackson@gmail.com (Preston Jackson) +// +// Google Test - FrameworkSample +// widget.cc +// + +// Widget is a very simple class used for demonstrating the use of gtest + +#include "widget.h" + +Widget::Widget(int number, const std::string& name) + : number_(number), + name_(name) {} + +Widget::~Widget() {} + +float Widget::GetFloatValue() const { + return number_; +} + +int Widget::GetIntValue() const { + return static_cast(number_); +} + +std::string Widget::GetStringValue() const { + return name_; +} + +void Widget::GetCharPtrValue(char* buffer, size_t max_size) const { + // Copy the char* representation of name_ into buffer, up to max_size. + strncpy(buffer, name_.c_str(), max_size-1); + buffer[max_size-1] = '\0'; + return; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h new file mode 100644 index 000000000..0c55cdc8c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h @@ -0,0 +1,59 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: preston.a.jackson@gmail.com (Preston Jackson) +// +// Google Test - FrameworkSample +// widget.h +// + +// Widget is a very simple class used for demonstrating the use of gtest. It +// simply stores two values a string and an integer, which are returned via +// public accessors in multiple forms. + +#import + +class Widget { + public: + Widget(int number, const std::string& name); + ~Widget(); + + // Public accessors to number data + float GetFloatValue() const; + int GetIntValue() const; + + // Public accessors to the string data + std::string GetStringValue() const; + void GetCharPtrValue(char* buffer, size_t max_size) const; + + private: + // Data members + float number_; + std::string name_; +}; diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc new file mode 100644 index 000000000..61c0d2ffd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc @@ -0,0 +1,68 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Author: preston.a.jackson@gmail.com (Preston Jackson) +// +// Google Test - FrameworkSample +// widget_test.cc +// + +// This is a simple test file for the Widget class in the Widget.framework + +#include +#include + +#include + +// This test verifies that the constructor sets the internal state of the +// Widget class correctly. +TEST(WidgetInitializerTest, TestConstructor) { + Widget widget(1.0f, "name"); + EXPECT_FLOAT_EQ(1.0f, widget.GetFloatValue()); + EXPECT_EQ(std::string("name"), widget.GetStringValue()); +} + +// This test verifies the conversion of the float and string values to int and +// char*, respectively. +TEST(WidgetInitializerTest, TestConversion) { + Widget widget(1.0f, "name"); + EXPECT_EQ(1, widget.GetIntValue()); + + size_t max_size = 128; + char buffer[max_size]; + widget.GetCharPtrValue(buffer, max_size); + EXPECT_STREQ("name", buffer); +} + +// Use the Google Test main that is linked into the framework. It does something +// like this: +// int main(int argc, char** argv) { +// testing::InitGoogleTest(&argc, argv); +// return RUN_ALL_TESTS(); +// } diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh new file mode 100644 index 000000000..3fc229f1d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Executes the samples and tests for the Google Test Framework. + +# Help the dynamic linker find the path to the libraries. +export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR +export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR + +# Create some executables. +test_executables=("$BUILT_PRODUCTS_DIR/gtest_unittest-framework" + "$BUILT_PRODUCTS_DIR/gtest_unittest" + "$BUILT_PRODUCTS_DIR/sample1_unittest-framework" + "$BUILT_PRODUCTS_DIR/sample1_unittest-static") + +# Now execute each one in turn keeping track of how many succeeded and failed. +succeeded=0 +failed=0 +failed_list=() +for test in ${test_executables[*]}; do + "$test" + result=$? + if [ $result -eq 0 ]; then + succeeded=$(( $succeeded + 1 )) + else + failed=$(( failed + 1 )) + failed_list="$failed_list $test" + fi +done + +# Report the successes and failures to the console. +echo "Tests complete with $succeeded successes and $failed failures." +if [ $failed -ne 0 ]; then + echo "The following tests failed:" + echo $failed_list +fi +exit $failed diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py new file mode 100644 index 000000000..81de8c96a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python +# +# Copyright 2008, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""A script to prepare version informtion for use the gtest Info.plist file. + + This script extracts the version information from the configure.ac file and + uses it to generate a header file containing the same information. The + #defines in this header file will be included in during the generation of + the Info.plist of the framework, giving the correct value to the version + shown in the Finder. + + This script makes the following assumptions (these are faults of the script, + not problems with the Autoconf): + 1. The AC_INIT macro will be contained within the first 1024 characters + of configure.ac + 2. The version string will be 3 integers separated by periods and will be + surrounded by squre brackets, "[" and "]" (e.g. [1.0.1]). The first + segment represents the major version, the second represents the minor + version and the third represents the fix version. + 3. No ")" character exists between the opening "(" and closing ")" of + AC_INIT, including in comments and character strings. +""" + +import sys +import re + +# Read the command line argument (the output directory for Version.h) +if (len(sys.argv) < 3): + print "Usage: versiongenerate.py input_dir output_dir" + sys.exit(1) +else: + input_dir = sys.argv[1] + output_dir = sys.argv[2] + +# Read the first 1024 characters of the configure.ac file +config_file = open("%s/configure.ac" % input_dir, 'r') +buffer_size = 1024 +opening_string = config_file.read(buffer_size) +config_file.close() + +# Extract the version string from the AC_INIT macro +# The following init_expression means: +# Extract three integers separated by periods and surrounded by squre +# brackets(e.g. "[1.0.1]") between "AC_INIT(" and ")". Do not be greedy +# (*? is the non-greedy flag) since that would pull in everything between +# the first "(" and the last ")" in the file. +version_expression = re.compile(r"AC_INIT\(.*?\[(\d+)\.(\d+)\.(\d+)\].*?\)", + re.DOTALL) +version_values = version_expression.search(opening_string) +major_version = version_values.group(1) +minor_version = version_values.group(2) +fix_version = version_values.group(3) + +# Write the version information to a header file to be included in the +# Info.plist file. +file_data = """// +// DO NOT MODIFY THIS FILE (but you can delete it) +// +// This file is autogenerated by the versiongenerate.py script. This script +// is executed in a "Run Script" build phase when creating gtest.framework. This +// header file is not used during compilation of C-source. Rather, it simply +// defines some version strings for substitution in the Info.plist. Because of +// this, we are not not restricted to C-syntax nor are we using include guards. +// + +#define GTEST_VERSIONINFO_SHORT %s.%s +#define GTEST_VERSIONINFO_LONG %s.%s.%s + +""" % (major_version, minor_version, major_version, minor_version, fix_version) +version_file = open("%s/Version.h" % output_dir, 'w') +version_file.write(file_data) +version_file.close() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj new file mode 100644 index 000000000..4234e728c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj @@ -0,0 +1,1080 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXAggregateTarget section */ + 3B238F5F0E828B5400846E11 /* Check */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget "Check" */; + buildPhases = ( + 3B238F5E0E828B5400846E11 /* ShellScript */, + ); + dependencies = ( + 40899F9D0FFA740F000B29AE /* PBXTargetDependency */, + 40C849F7101A43440083642A /* PBXTargetDependency */, + 4089A0980FFAD34A000B29AE /* PBXTargetDependency */, + 40C849F9101A43490083642A /* PBXTargetDependency */, + ); + name = Check; + productName = Check; + }; + 40C44ADC0E3798F4008FCC51 /* Version Info */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget "Version Info" */; + buildPhases = ( + 40C44ADB0E3798F4008FCC51 /* Generate Version.h */, + ); + comments = "The generation of Version.h must be performed in its own target. Since the Info.plist is preprocessed before any of the other build phases in gtest, the Version.h file would not be ready if included as a build phase of that target."; + dependencies = ( + ); + name = "Version Info"; + productName = Version.h; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */ = {isa = PBXBuildFile; fileRef = 224A12A20E9EADCC00BD17FD /* gtest-test-part.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */; }; + 3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DB0E2F799B00CF7658 /* gtest-death-test.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 404884390E2F799B00CF7658 /* gtest-message.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DC0E2F799B00CF7658 /* gtest-message.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DD0E2F799B00CF7658 /* gtest-spi.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4048843B0E2F799B00CF7658 /* gtest.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DE0E2F799B00CF7658 /* gtest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883E00E2F799B00CF7658 /* gtest_prod.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 404884500E2F799B00CF7658 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 404883F60E2F799B00CF7658 /* README */; }; + 404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */; }; + 404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E30E2F799B00CF7658 /* gtest-filepath.h */; }; + 404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E40E2F799B00CF7658 /* gtest-internal.h */; }; + 404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E50E2F799B00CF7658 /* gtest-port.h */; }; + 404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E60E2F799B00CF7658 /* gtest-string.h */; }; + 404884AC0E2F7CD900CF7658 /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 404884A90E2F7CD900CF7658 /* CHANGES */; }; + 404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */ = {isa = PBXBuildFile; fileRef = 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */; }; + 404884AE0E2F7CD900CF7658 /* COPYING in Resources */ = {isa = PBXBuildFile; fileRef = 404884AB0E2F7CD900CF7658 /* COPYING */; }; + 40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; }; + 40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 40899F4D0FFA7271000B29AE /* gtest-tuple.h */; }; + 40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; }; + 4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; }; + 4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; }; + 40C848FF101A21150083642A /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; }; + 40C84915101A21DF0083642A /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4048840D0E2F799B00CF7658 /* gtest_main.cc */; }; + 40C84916101A235B0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; }; + 40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; }; + 40C84978101A36540083642A /* libgtest_main.a in Resources */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; }; + 40C84980101A36850083642A /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; }; + 40C84982101A36850083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; }; + 40C84983101A36850083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; }; + 40C8498F101A36A60083642A /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; }; + 40C84990101A36A60083642A /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; }; + 40C84992101A36A60083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; }; + 40C84993101A36A60083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; }; + 40C849A2101A37050083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; }; + 40C849A4101A37150083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; }; + 4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 4539C9330EC280AE00A70F4C /* gtest-param-test.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */; }; + 4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */; }; + 4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9370EC280E200A70F4C /* gtest-param-util.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40899F420FFA7184000B29AE; + remoteInfo = gtest_unittest; + }; + 4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4089A0120FFACEFC000B29AE; + remoteInfo = sample1_unittest; + }; + 408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C848F9101A209C0083642A; + remoteInfo = "gtest-static"; + }; + 40C44AE50E379922008FCC51 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C44ADC0E3798F4008FCC51; + remoteInfo = Version.h; + }; + 40C8497C101A36850083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C848F9101A209C0083642A; + remoteInfo = "gtest-static"; + }; + 40C8497E101A36850083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C8490A101A217E0083642A; + remoteInfo = "gtest_main-static"; + }; + 40C8498B101A36A60083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C848F9101A209C0083642A; + remoteInfo = "gtest-static"; + }; + 40C8498D101A36A60083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C8490A101A217E0083642A; + remoteInfo = "gtest_main-static"; + }; + 40C8499B101A36DC0083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C8490A101A217E0083642A; + remoteInfo = "gtest_main-static"; + }; + 40C8499D101A36E50083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0; + remoteInfo = "gtest-framework"; + }; + 40C8499F101A36F10083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0; + remoteInfo = "gtest-framework"; + }; + 40C849F6101A43440083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C8497A101A36850083642A; + remoteInfo = "gtest_unittest-static"; + }; + 40C849F8101A43490083642A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0867D690FE84028FC02AAC07 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 40C84989101A36A60083642A; + remoteInfo = "sample1_unittest-static"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 404884A50E2F7C0400CF7658 /* Copy Headers Internal */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = Headers/internal; + dstSubfolderSpec = 6; + files = ( + 404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */, + 404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */, + 404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */, + 4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */, + 4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */, + 4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */, + 404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */, + 404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */, + 40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */, + 3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */, + ); + name = "Copy Headers Internal"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 224A12A10E9EADA700BD17FD /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "gtest-all.cc"; sourceTree = ""; }; + 224A12A20E9EADCC00BD17FD /* gtest-test-part.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "gtest-test-part.h"; sourceTree = ""; }; + 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_unittest.cc; sourceTree = ""; }; + 3B87D2100E96B92E000D1852 /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = ""; }; + 3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-type-util.h"; sourceTree = ""; }; + 3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-typed-test.h"; sourceTree = ""; }; + 403EE37C0E377822004BD1E2 /* versiongenerate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = versiongenerate.py; sourceTree = ""; }; + 404883DB0E2F799B00CF7658 /* gtest-death-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-death-test.h"; sourceTree = ""; }; + 404883DC0E2F799B00CF7658 /* gtest-message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-message.h"; sourceTree = ""; }; + 404883DD0E2F799B00CF7658 /* gtest-spi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-spi.h"; sourceTree = ""; }; + 404883DE0E2F799B00CF7658 /* gtest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest.h; sourceTree = ""; }; + 404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_pred_impl.h; sourceTree = ""; }; + 404883E00E2F799B00CF7658 /* gtest_prod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_prod.h; sourceTree = ""; }; + 404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-death-test-internal.h"; sourceTree = ""; }; + 404883E30E2F799B00CF7658 /* gtest-filepath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-filepath.h"; sourceTree = ""; }; + 404883E40E2F799B00CF7658 /* gtest-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-internal.h"; sourceTree = ""; }; + 404883E50E2F799B00CF7658 /* gtest-port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-port.h"; sourceTree = ""; }; + 404883E60E2F799B00CF7658 /* gtest-string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-string.h"; sourceTree = ""; }; + 404883F60E2F799B00CF7658 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../README; sourceTree = SOURCE_ROOT; }; + 4048840D0E2F799B00CF7658 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_main.cc; sourceTree = ""; }; + 404884A90E2F7CD900CF7658 /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CHANGES; path = ../CHANGES; sourceTree = SOURCE_ROOT; }; + 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CONTRIBUTORS; path = ../CONTRIBUTORS; sourceTree = SOURCE_ROOT; }; + 404884AB0E2F7CD900CF7658 /* COPYING */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = COPYING; path = ../COPYING; sourceTree = SOURCE_ROOT; }; + 40899F430FFA7184000B29AE /* gtest_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "gtest_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 40899F4D0FFA7271000B29AE /* gtest-tuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-tuple.h"; sourceTree = ""; }; + 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = StaticLibraryTarget.xcconfig; sourceTree = ""; }; + 4089A0130FFACEFC000B29AE /* sample1_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "sample1_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4089A02C0FFACF7F000B29AE /* sample1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1.cc; sourceTree = ""; }; + 4089A02D0FFACF7F000B29AE /* sample1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample1.h; sourceTree = ""; }; + 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1_unittest.cc; sourceTree = ""; }; + 40C848FA101A209C0083642A /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 40C8490B101A217E0083642A /* libgtest_main.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest_main.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 40C84987101A36850083642A /* gtest_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = gtest_unittest; sourceTree = BUILT_PRODUCTS_DIR; }; + 40C84997101A36A60083642A /* sample1_unittest-static */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "sample1_unittest-static"; sourceTree = BUILT_PRODUCTS_DIR; }; + 40D4CDF10E30E07400294801 /* DebugProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugProject.xcconfig; sourceTree = ""; }; + 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FrameworkTarget.xcconfig; sourceTree = ""; }; + 40D4CDF30E30E07400294801 /* General.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = General.xcconfig; sourceTree = ""; }; + 40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ReleaseProject.xcconfig; sourceTree = ""; }; + 40D4CF510E30F5E200294801 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4539C8FF0EC27F6400A70F4C /* gtest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = gtest.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4539C9330EC280AE00A70F4C /* gtest-param-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-test.h"; sourceTree = ""; }; + 4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-linked_ptr.h"; sourceTree = ""; }; + 4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-util-generated.h"; sourceTree = ""; }; + 4539C9370EC280E200A70F4C /* gtest-param-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-util.h"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 40899F410FFA7184000B29AE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C849A4101A37150083642A /* gtest.framework in Frameworks */, + 40C84916101A235B0083642A /* libgtest_main.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4089A0110FFACEFC000B29AE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C849A2101A37050083642A /* gtest.framework in Frameworks */, + 40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40C84981101A36850083642A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C84982101A36850083642A /* libgtest.a in Frameworks */, + 40C84983101A36850083642A /* libgtest_main.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40C84991101A36A60083642A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C84992101A36A60083642A /* libgtest.a in Frameworks */, + 40C84993101A36A60083642A /* libgtest_main.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 034768DDFF38A45A11DB9C8B /* Products */ = { + isa = PBXGroup; + children = ( + 4539C8FF0EC27F6400A70F4C /* gtest.framework */, + 40C848FA101A209C0083642A /* libgtest.a */, + 40C8490B101A217E0083642A /* libgtest_main.a */, + 40899F430FFA7184000B29AE /* gtest_unittest-framework */, + 40C84987101A36850083642A /* gtest_unittest */, + 4089A0130FFACEFC000B29AE /* sample1_unittest-framework */, + 40C84997101A36A60083642A /* sample1_unittest-static */, + ); + name = Products; + sourceTree = ""; + }; + 0867D691FE84028FC02AAC07 /* gtest */ = { + isa = PBXGroup; + children = ( + 40D4CDF00E30E07400294801 /* Config */, + 08FB77ACFE841707C02AAC07 /* Source */, + 40D4CF4E0E30F5E200294801 /* Resources */, + 403EE37B0E377822004BD1E2 /* Scripts */, + 034768DDFF38A45A11DB9C8B /* Products */, + ); + name = gtest; + sourceTree = ""; + }; + 08FB77ACFE841707C02AAC07 /* Source */ = { + isa = PBXGroup; + children = ( + 404884A90E2F7CD900CF7658 /* CHANGES */, + 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */, + 404884AB0E2F7CD900CF7658 /* COPYING */, + 404883F60E2F799B00CF7658 /* README */, + 404883D90E2F799B00CF7658 /* include */, + 4089A02F0FFACF84000B29AE /* samples */, + 404884070E2F799B00CF7658 /* src */, + 3B238BF00E7FE13B00846E11 /* test */, + ); + name = Source; + sourceTree = ""; + }; + 3B238BF00E7FE13B00846E11 /* test */ = { + isa = PBXGroup; + children = ( + 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */, + ); + name = test; + path = ../test; + sourceTree = SOURCE_ROOT; + }; + 403EE37B0E377822004BD1E2 /* Scripts */ = { + isa = PBXGroup; + children = ( + 403EE37C0E377822004BD1E2 /* versiongenerate.py */, + 3B87D2100E96B92E000D1852 /* runtests.sh */, + ); + path = Scripts; + sourceTree = ""; + }; + 404883D90E2F799B00CF7658 /* include */ = { + isa = PBXGroup; + children = ( + 404883DA0E2F799B00CF7658 /* gtest */, + ); + name = include; + path = ../include; + sourceTree = SOURCE_ROOT; + }; + 404883DA0E2F799B00CF7658 /* gtest */ = { + isa = PBXGroup; + children = ( + 404883E10E2F799B00CF7658 /* internal */, + 224A12A20E9EADCC00BD17FD /* gtest-test-part.h */, + 404883DB0E2F799B00CF7658 /* gtest-death-test.h */, + 404883DC0E2F799B00CF7658 /* gtest-message.h */, + 4539C9330EC280AE00A70F4C /* gtest-param-test.h */, + 404883DD0E2F799B00CF7658 /* gtest-spi.h */, + 404883DE0E2F799B00CF7658 /* gtest.h */, + 404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */, + 404883E00E2F799B00CF7658 /* gtest_prod.h */, + 3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */, + ); + path = gtest; + sourceTree = ""; + }; + 404883E10E2F799B00CF7658 /* internal */ = { + isa = PBXGroup; + children = ( + 404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */, + 404883E30E2F799B00CF7658 /* gtest-filepath.h */, + 404883E40E2F799B00CF7658 /* gtest-internal.h */, + 4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */, + 4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */, + 4539C9370EC280E200A70F4C /* gtest-param-util.h */, + 404883E50E2F799B00CF7658 /* gtest-port.h */, + 404883E60E2F799B00CF7658 /* gtest-string.h */, + 40899F4D0FFA7271000B29AE /* gtest-tuple.h */, + 3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */, + ); + path = internal; + sourceTree = ""; + }; + 404884070E2F799B00CF7658 /* src */ = { + isa = PBXGroup; + children = ( + 224A12A10E9EADA700BD17FD /* gtest-all.cc */, + 4048840D0E2F799B00CF7658 /* gtest_main.cc */, + ); + name = src; + path = ../src; + sourceTree = SOURCE_ROOT; + }; + 4089A02F0FFACF84000B29AE /* samples */ = { + isa = PBXGroup; + children = ( + 4089A02C0FFACF7F000B29AE /* sample1.cc */, + 4089A02D0FFACF7F000B29AE /* sample1.h */, + 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */, + ); + name = samples; + path = ../samples; + sourceTree = SOURCE_ROOT; + }; + 40D4CDF00E30E07400294801 /* Config */ = { + isa = PBXGroup; + children = ( + 40D4CDF10E30E07400294801 /* DebugProject.xcconfig */, + 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */, + 40D4CDF30E30E07400294801 /* General.xcconfig */, + 40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */, + 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */, + ); + path = Config; + sourceTree = ""; + }; + 40D4CF4E0E30F5E200294801 /* Resources */ = { + isa = PBXGroup; + children = ( + 40D4CF510E30F5E200294801 /* Info.plist */, + ); + path = Resources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */, + 404884390E2F799B00CF7658 /* gtest-message.h in Headers */, + 4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */, + 3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */, + 4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */, + 4048843B0E2F799B00CF7658 /* gtest.h in Headers */, + 4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */, + 4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */, + 224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 40899F420FFA7184000B29AE /* gtest_unittest-framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget "gtest_unittest-framework" */; + buildPhases = ( + 40899F400FFA7184000B29AE /* Sources */, + 40899F410FFA7184000B29AE /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 40C849A0101A36F10083642A /* PBXTargetDependency */, + ); + name = "gtest_unittest-framework"; + productName = gtest_unittest; + productReference = 40899F430FFA7184000B29AE /* gtest_unittest-framework */; + productType = "com.apple.product-type.tool"; + }; + 4089A0120FFACEFC000B29AE /* sample1_unittest-framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget "sample1_unittest-framework" */; + buildPhases = ( + 4089A0100FFACEFC000B29AE /* Sources */, + 4089A0110FFACEFC000B29AE /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 40C8499E101A36E50083642A /* PBXTargetDependency */, + ); + name = "sample1_unittest-framework"; + productName = sample1_unittest; + productReference = 4089A0130FFACEFC000B29AE /* sample1_unittest-framework */; + productType = "com.apple.product-type.tool"; + }; + 40C848F9101A209C0083642A /* gtest-static */ = { + isa = PBXNativeTarget; + buildConfigurationList = 40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget "gtest-static" */; + buildPhases = ( + 40C848F7101A209C0083642A /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "gtest-static"; + productName = "gtest-static"; + productReference = 40C848FA101A209C0083642A /* libgtest.a */; + productType = "com.apple.product-type.library.static"; + }; + 40C8490A101A217E0083642A /* gtest_main-static */ = { + isa = PBXNativeTarget; + buildConfigurationList = 40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget "gtest_main-static" */; + buildPhases = ( + 40C84908101A217E0083642A /* Sources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "gtest_main-static"; + productName = "gtest_main-static"; + productReference = 40C8490B101A217E0083642A /* libgtest_main.a */; + productType = "com.apple.product-type.library.static"; + }; + 40C8497A101A36850083642A /* gtest_unittest-static */ = { + isa = PBXNativeTarget; + buildConfigurationList = 40C84984101A36850083642A /* Build configuration list for PBXNativeTarget "gtest_unittest-static" */; + buildPhases = ( + 40C8497F101A36850083642A /* Sources */, + 40C84981101A36850083642A /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 40C8497B101A36850083642A /* PBXTargetDependency */, + 40C8497D101A36850083642A /* PBXTargetDependency */, + ); + name = "gtest_unittest-static"; + productName = gtest_unittest; + productReference = 40C84987101A36850083642A /* gtest_unittest */; + productType = "com.apple.product-type.tool"; + }; + 40C84989101A36A60083642A /* sample1_unittest-static */ = { + isa = PBXNativeTarget; + buildConfigurationList = 40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget "sample1_unittest-static" */; + buildPhases = ( + 40C8498E101A36A60083642A /* Sources */, + 40C84991101A36A60083642A /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 40C8498A101A36A60083642A /* PBXTargetDependency */, + 40C8498C101A36A60083642A /* PBXTargetDependency */, + ); + name = "sample1_unittest-static"; + productName = sample1_unittest; + productReference = 40C84997101A36A60083642A /* sample1_unittest-static */; + productType = "com.apple.product-type.tool"; + }; + 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "gtest-framework" */; + buildPhases = ( + 8D07F2C10486CC7A007CD1D0 /* Sources */, + 8D07F2BD0486CC7A007CD1D0 /* Headers */, + 404884A50E2F7C0400CF7658 /* Copy Headers Internal */, + 8D07F2BF0486CC7A007CD1D0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 40C44AE60E379922008FCC51 /* PBXTargetDependency */, + 408BEC101046CFE900DEF522 /* PBXTargetDependency */, + 40C8499C101A36DC0083642A /* PBXTargetDependency */, + ); + name = "gtest-framework"; + productInstallPath = "$(HOME)/Library/Frameworks"; + productName = gtest; + productReference = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0867D690FE84028FC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "gtest" */; + compatibilityVersion = "Xcode 2.4"; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + en, + ); + mainGroup = 0867D691FE84028FC02AAC07 /* gtest */; + productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */, + 40C848F9101A209C0083642A /* gtest-static */, + 40C8490A101A217E0083642A /* gtest_main-static */, + 40899F420FFA7184000B29AE /* gtest_unittest-framework */, + 40C8497A101A36850083642A /* gtest_unittest-static */, + 4089A0120FFACEFC000B29AE /* sample1_unittest-framework */, + 40C84989101A36A60083642A /* sample1_unittest-static */, + 3B238F5F0E828B5400846E11 /* Check */, + 40C44ADC0E3798F4008FCC51 /* Version Info */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 404884500E2F799B00CF7658 /* README in Resources */, + 404884AC0E2F7CD900CF7658 /* CHANGES in Resources */, + 404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */, + 404884AE0E2F7CD900CF7658 /* COPYING in Resources */, + 40C84978101A36540083642A /* libgtest_main.a in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B238F5E0E828B5400846E11 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Remember, this \"Run Script\" build phase will be executed from $SRCROOT\n/bin/bash Scripts/runtests.sh"; + }; + 40C44ADB0E3798F4008FCC51 /* Generate Version.h */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/Scripts/versiongenerate.py", + "$(SRCROOT)/../configure.ac", + ); + name = "Generate Version.h"; + outputPaths = ( + "$(PROJECT_TEMP_DIR)/Version.h", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Remember, this \"Run Script\" build phase will be executed from $SRCROOT\n/usr/bin/python Scripts/versiongenerate.py ../ $PROJECT_TEMP_DIR"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 40899F400FFA7184000B29AE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4089A0100FFACEFC000B29AE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */, + 4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40C848F7101A209C0083642A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C848FF101A21150083642A /* gtest-all.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40C84908101A217E0083642A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C84915101A21DF0083642A /* gtest_main.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40C8497F101A36850083642A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C84980101A36850083642A /* gtest_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 40C8498E101A36A60083642A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 40C8498F101A36A60083642A /* sample1.cc in Sources */, + 40C84990101A36A60083642A /* sample1_unittest.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8D07F2C10486CC7A007CD1D0 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 40899F9D0FFA740F000B29AE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40899F420FFA7184000B29AE /* gtest_unittest-framework */; + targetProxy = 40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */; + }; + 4089A0980FFAD34A000B29AE /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4089A0120FFACEFC000B29AE /* sample1_unittest-framework */; + targetProxy = 4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */; + }; + 408BEC101046CFE900DEF522 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C848F9101A209C0083642A /* gtest-static */; + targetProxy = 408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */; + }; + 40C44AE60E379922008FCC51 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C44ADC0E3798F4008FCC51 /* Version Info */; + targetProxy = 40C44AE50E379922008FCC51 /* PBXContainerItemProxy */; + }; + 40C8497B101A36850083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C848F9101A209C0083642A /* gtest-static */; + targetProxy = 40C8497C101A36850083642A /* PBXContainerItemProxy */; + }; + 40C8497D101A36850083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C8490A101A217E0083642A /* gtest_main-static */; + targetProxy = 40C8497E101A36850083642A /* PBXContainerItemProxy */; + }; + 40C8498A101A36A60083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C848F9101A209C0083642A /* gtest-static */; + targetProxy = 40C8498B101A36A60083642A /* PBXContainerItemProxy */; + }; + 40C8498C101A36A60083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C8490A101A217E0083642A /* gtest_main-static */; + targetProxy = 40C8498D101A36A60083642A /* PBXContainerItemProxy */; + }; + 40C8499C101A36DC0083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C8490A101A217E0083642A /* gtest_main-static */; + targetProxy = 40C8499B101A36DC0083642A /* PBXContainerItemProxy */; + }; + 40C8499E101A36E50083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */; + targetProxy = 40C8499D101A36E50083642A /* PBXContainerItemProxy */; + }; + 40C849A0101A36F10083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */; + targetProxy = 40C8499F101A36F10083642A /* PBXContainerItemProxy */; + }; + 40C849F7101A43440083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C8497A101A36850083642A /* gtest_unittest-static */; + targetProxy = 40C849F6101A43440083642A /* PBXContainerItemProxy */; + }; + 40C849F9101A43490083642A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 40C84989101A36A60083642A /* sample1_unittest-static */; + targetProxy = 40C849F8101A43490083642A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 3B238F600E828B5400846E11 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + PRODUCT_NAME = Check; + }; + name = Debug; + }; + 3B238F610E828B5400846E11 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_ENABLE_FIX_AND_CONTINUE = NO; + PRODUCT_NAME = Check; + ZERO_LINK = NO; + }; + name = Release; + }; + 40899F450FFA7185000B29AE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../; + PRODUCT_NAME = "gtest_unittest-framework"; + }; + name = Debug; + }; + 40899F460FFA7185000B29AE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../; + PRODUCT_NAME = "gtest_unittest-framework"; + }; + name = Release; + }; + 4089A0150FFACEFD000B29AE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "sample1_unittest-framework"; + }; + name = Debug; + }; + 4089A0160FFACEFD000B29AE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "sample1_unittest-framework"; + }; + name = Release; + }; + 40C44ADF0E3798F4008FCC51 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = gtest; + TARGET_NAME = gtest; + }; + name = Debug; + }; + 40C44AE00E3798F4008FCC51 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = gtest; + TARGET_NAME = gtest; + }; + name = Release; + }; + 40C848FB101A209D0083642A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */; + buildSettings = { + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + HEADER_SEARCH_PATHS = ( + ../, + ../include/, + ); + PRODUCT_NAME = gtest; + }; + name = Debug; + }; + 40C848FC101A209D0083642A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */; + buildSettings = { + GCC_INLINES_ARE_PRIVATE_EXTERN = YES; + GCC_SYMBOLS_PRIVATE_EXTERN = YES; + HEADER_SEARCH_PATHS = ( + ../, + ../include/, + ); + PRODUCT_NAME = gtest; + }; + name = Release; + }; + 40C8490E101A217F0083642A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../, + ../include/, + ); + PRODUCT_NAME = gtest_main; + }; + name = Debug; + }; + 40C8490F101A217F0083642A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */; + buildSettings = { + HEADER_SEARCH_PATHS = ( + ../, + ../include/, + ); + PRODUCT_NAME = gtest_main; + }; + name = Release; + }; + 40C84985101A36850083642A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../; + PRODUCT_NAME = gtest_unittest; + }; + name = Debug; + }; + 40C84986101A36850083642A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + HEADER_SEARCH_PATHS = ../; + PRODUCT_NAME = gtest_unittest; + }; + name = Release; + }; + 40C84995101A36A60083642A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "sample1_unittest-static"; + }; + name = Debug; + }; + 40C84996101A36A60083642A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + PRODUCT_NAME = "sample1_unittest-static"; + }; + name = Release; + }; + 4FADC24308B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + HEADER_SEARCH_PATHS = ( + ../, + ../include/, + ); + INFOPLIST_FILE = Resources/Info.plist; + INFOPLIST_PREFIX_HEADER = "$(PROJECT_TEMP_DIR)/Version.h"; + INFOPLIST_PREPROCESS = YES; + PRODUCT_NAME = gtest; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 4FADC24408B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */; + buildSettings = { + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + HEADER_SEARCH_PATHS = ( + ../, + ../include/, + ); + INFOPLIST_FILE = Resources/Info.plist; + INFOPLIST_PREFIX_HEADER = "$(PROJECT_TEMP_DIR)/Version.h"; + INFOPLIST_PREPROCESS = YES; + PRODUCT_NAME = gtest; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 4FADC24708B4156D00ABE55E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40D4CDF10E30E07400294801 /* DebugProject.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 4FADC24808B4156D00ABE55E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */; + buildSettings = { + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget "Check" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3B238F600E828B5400846E11 /* Debug */, + 3B238F610E828B5400846E11 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget "gtest_unittest-framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 40899F450FFA7185000B29AE /* Debug */, + 40899F460FFA7185000B29AE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget "sample1_unittest-framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4089A0150FFACEFD000B29AE /* Debug */, + 4089A0160FFACEFD000B29AE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget "Version Info" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 40C44ADF0E3798F4008FCC51 /* Debug */, + 40C44AE00E3798F4008FCC51 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget "gtest-static" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 40C848FB101A209D0083642A /* Debug */, + 40C848FC101A209D0083642A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget "gtest_main-static" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 40C8490E101A217F0083642A /* Debug */, + 40C8490F101A217F0083642A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 40C84984101A36850083642A /* Build configuration list for PBXNativeTarget "gtest_unittest-static" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 40C84985101A36850083642A /* Debug */, + 40C84986101A36850083642A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget "sample1_unittest-static" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 40C84995101A36A60083642A /* Debug */, + 40C84996101A36A60083642A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "gtest-framework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24308B4156D00ABE55E /* Debug */, + 4FADC24408B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "gtest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4FADC24708B4156D00ABE55E /* Debug */, + 4FADC24808B4156D00ABE55E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0867D690FE84028FC02AAC07 /* Project object */; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/README.txt b/spotify/breakpad/third_party/protobuf/protobuf/java/README.txt new file mode 100644 index 000000000..3ed06a1e2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/README.txt @@ -0,0 +1,96 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008 Google Inc. + +This directory contains the Java Protocol Buffers runtime library. + +Installation - With Maven +========================= + +The Protocol Buffers build is managed using Maven. If you would +rather build without Maven, see below. + +1) Install Apache Maven if you don't have it: + + http://maven.apache.org/ + +2) Build the C++ code, or obtain a binary distribution of protoc. If + you install a binary distribution, make sure that it is the same + version as this package. If in doubt, run: + + $ protoc --version + + You will need to place the protoc executable in ../src. (If you + built it yourself, it should already be there.) + +3) Run the tests: + + $ mvn test + + If some tests fail, this library may not work correctly on your + system. Continue at your own risk. + +4) Install the library into your Maven repository: + + $ mvn install + +5) If you do not use Maven to manage your own build, you can build a + .jar file to use: + + $ mvn package + + The .jar will be placed in the "target" directory. + +Installation - 'Lite' Version - With Maven +========================================== + +Building the 'lite' version of the Java Protocol Buffers library is +the same as building the full version, except that all commands are +run using the 'lite' profile. (see +http://maven.apache.org/guides/introduction/introduction-to-profiles.html) + +E.g. to install the lite version of the jar, you would run: + + $ mvn install -P lite + +The resulting artifact has the 'lite' classifier. To reference it +for dependency resolution, you would specify it as: + + + com.google.protobuf + protobuf-java + ${version} + lite + + +Installation - Without Maven +============================ + +If you would rather not install Maven to build the library, you may +follow these instructions instead. Note that these instructions skip +running unit tests. + +1) Build the C++ code, or obtain a binary distribution of protoc. If + you install a binary distribution, make sure that it is the same + version as this package. If in doubt, run: + + $ protoc --version + + If you built the C++ code without installing, the compiler binary + should be located in ../src. + +2) Invoke protoc to build DescriptorProtos.java: + + $ protoc --java_out=src/main/java -I../src \ + ../src/google/protobuf/descriptor.proto + +3) Compile the code in src/main/java using whatever means you prefer. + +4) Install the classes wherever you prefer. + +Usage +===== + +The complete documentation for Protocol Buffers is available via the +web at: + + http://code.google.com/apis/protocolbuffers/ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml b/spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml new file mode 100644 index 000000000..e28d6db5d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml @@ -0,0 +1,186 @@ + + + 4.0.0 + + com.google + google + 1 + + com.google.protobuf + protobuf-java + 2.4.2-pre + jar + Protocol Buffer Java API + + Protocol Buffers are a way of encoding structured data in an efficient yet + extensible format. + + 2008 + http://code.google.com/p/protobuf + + + New BSD license + http://www.opensource.org/licenses/bsd-license.php + repo + + + + http://code.google.com/p/protobuf/source/browse + + scm:svn:http://protobuf.googlecode.com/svn/trunk/ + + + + + junit + junit + 4.4 + test + + + org.easymock + easymock + 2.2 + test + + + org.easymock + easymockclassextension + 2.2.1 + test + + + + + + maven-compiler-plugin + + 1.5 + 1.5 + + + + maven-surefire-plugin + + + **/*Test.java + + + + + maven-antrun-plugin + + + generate-sources + generate-sources + + + + + + + + + + target/generated-sources + + + run + + + + generate-test-sources + generate-test-sources + + + + + + + + + + + + + + + + + + + + + + + + + + + target/generated-test-sources + + + run + + + + + + + + + lite + + + + maven-compiler-plugin + + + **/AbstractMessageLite.java + **/ByteString.java + **/CodedInputStream.java + **/CodedOutputStream.java + **/ExtensionRegistryLite.java + **/FieldSet.java + **/GeneratedMessageLite.java + **/Internal.java + **/InvalidProtocolBufferException.java + **/LazyStringArrayList.java + **/LazyStringList.java + **/MessageLite.java + **/MessageLiteOrBuilder.java + **/SmallSortedMap.java + **/UninitializedMessageException.java + **/UnmodifiableLazyStringList.java + **/WireFormat.java + + + **/LiteTest.java + **/*Lite.java + + + + + maven-surefire-plugin + + + **/LiteTest.java + + + + + maven-jar-plugin + + lite + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java new file mode 100644 index 000000000..b9d830168 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java @@ -0,0 +1,764 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.Internal.EnumLite; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * A partial implementation of the {@link Message} interface which implements + * as many methods of that interface as possible in terms of other methods. + * + * @author kenton@google.com Kenton Varda + */ +public abstract class AbstractMessage extends AbstractMessageLite + implements Message { + @SuppressWarnings("unchecked") + public boolean isInitialized() { + // Check that all required fields are present. + for (final FieldDescriptor field : getDescriptorForType().getFields()) { + if (field.isRequired()) { + if (!hasField(field)) { + return false; + } + } + } + + // Check that embedded messages are initialized. + for (final Map.Entry entry : + getAllFields().entrySet()) { + final FieldDescriptor field = entry.getKey(); + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + if (field.isRepeated()) { + for (final Message element : (List) entry.getValue()) { + if (!element.isInitialized()) { + return false; + } + } + } else { + if (!((Message) entry.getValue()).isInitialized()) { + return false; + } + } + } + } + + return true; + } + + @Override + public final String toString() { + return TextFormat.printToString(this); + } + + public void writeTo(final CodedOutputStream output) throws IOException { + final boolean isMessageSet = + getDescriptorForType().getOptions().getMessageSetWireFormat(); + + for (final Map.Entry entry : + getAllFields().entrySet()) { + final FieldDescriptor field = entry.getKey(); + final Object value = entry.getValue(); + if (isMessageSet && field.isExtension() && + field.getType() == FieldDescriptor.Type.MESSAGE && + !field.isRepeated()) { + output.writeMessageSetExtension(field.getNumber(), (Message) value); + } else { + FieldSet.writeField(field, value, output); + } + } + + final UnknownFieldSet unknownFields = getUnknownFields(); + if (isMessageSet) { + unknownFields.writeAsMessageSetTo(output); + } else { + unknownFields.writeTo(output); + } + } + + private int memoizedSize = -1; + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) { + return size; + } + + size = 0; + final boolean isMessageSet = + getDescriptorForType().getOptions().getMessageSetWireFormat(); + + for (final Map.Entry entry : + getAllFields().entrySet()) { + final FieldDescriptor field = entry.getKey(); + final Object value = entry.getValue(); + if (isMessageSet && field.isExtension() && + field.getType() == FieldDescriptor.Type.MESSAGE && + !field.isRepeated()) { + size += CodedOutputStream.computeMessageSetExtensionSize( + field.getNumber(), (Message) value); + } else { + size += FieldSet.computeFieldSize(field, value); + } + } + + final UnknownFieldSet unknownFields = getUnknownFields(); + if (isMessageSet) { + size += unknownFields.getSerializedSizeAsMessageSet(); + } else { + size += unknownFields.getSerializedSize(); + } + + memoizedSize = size; + return size; + } + + @Override + public boolean equals(final Object other) { + if (other == this) { + return true; + } + if (!(other instanceof Message)) { + return false; + } + final Message otherMessage = (Message) other; + if (getDescriptorForType() != otherMessage.getDescriptorForType()) { + return false; + } + return getAllFields().equals(otherMessage.getAllFields()) && + getUnknownFields().equals(otherMessage.getUnknownFields()); + } + + @Override + public int hashCode() { + int hash = 41; + hash = (19 * hash) + getDescriptorForType().hashCode(); + hash = hashFields(hash, getAllFields()); + hash = (29 * hash) + getUnknownFields().hashCode(); + return hash; + } + + /** Get a hash code for given fields and values, using the given seed. */ + @SuppressWarnings("unchecked") + protected int hashFields(int hash, Map map) { + for (Map.Entry entry : map.entrySet()) { + FieldDescriptor field = entry.getKey(); + Object value = entry.getValue(); + hash = (37 * hash) + field.getNumber(); + if (field.getType() != FieldDescriptor.Type.ENUM){ + hash = (53 * hash) + value.hashCode(); + } else if (field.isRepeated()) { + List list = (List) value; + hash = (53 * hash) + hashEnumList(list); + } else { + hash = (53 * hash) + hashEnum((EnumLite) value); + } + } + return hash; + } + + /** + * Helper method for implementing {@link Message#hashCode()}. + * @see Boolean#hashCode() + */ + protected static int hashLong(long n) { + return (int) (n ^ (n >>> 32)); + } + + /** + * Helper method for implementing {@link Message#hashCode()}. + * @see Boolean#hashCode() + */ + protected static int hashBoolean(boolean b) { + return b ? 1231 : 1237; + } + + /** + * Helper method for implementing {@link Message#hashCode()}. + *

+ * This is needed because {@link java.lang.Enum#hashCode()} is final, but we + * need to use the field number as the hash code to ensure compatibility + * between statically and dynamically generated enum objects. + */ + protected static int hashEnum(EnumLite e) { + return e.getNumber(); + } + + /** Helper method for implementing {@link Message#hashCode()}. */ + protected static int hashEnumList(List list) { + int hash = 1; + for (EnumLite e : list) { + hash = 31 * hash + hashEnum(e); + } + return hash; + } + + // ================================================================= + + /** + * A partial implementation of the {@link Message.Builder} interface which + * implements as many methods of that interface as possible in terms of + * other methods. + */ + @SuppressWarnings("unchecked") + public static abstract class Builder + extends AbstractMessageLite.Builder + implements Message.Builder { + // The compiler produces an error if this is not declared explicitly. + @Override + public abstract BuilderType clone(); + + public BuilderType clear() { + for (final Map.Entry entry : + getAllFields().entrySet()) { + clearField(entry.getKey()); + } + return (BuilderType) this; + } + + public BuilderType mergeFrom(final Message other) { + if (other.getDescriptorForType() != getDescriptorForType()) { + throw new IllegalArgumentException( + "mergeFrom(Message) can only merge messages of the same type."); + } + + // Note: We don't attempt to verify that other's fields have valid + // types. Doing so would be a losing battle. We'd have to verify + // all sub-messages as well, and we'd have to make copies of all of + // them to insure that they don't change after verification (since + // the Message interface itself cannot enforce immutability of + // implementations). + // TODO(kenton): Provide a function somewhere called makeDeepCopy() + // which allows people to make secure deep copies of messages. + + for (final Map.Entry entry : + other.getAllFields().entrySet()) { + final FieldDescriptor field = entry.getKey(); + if (field.isRepeated()) { + for (final Object element : (List)entry.getValue()) { + addRepeatedField(field, element); + } + } else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + final Message existingValue = (Message)getField(field); + if (existingValue == existingValue.getDefaultInstanceForType()) { + setField(field, entry.getValue()); + } else { + setField(field, + existingValue.newBuilderForType() + .mergeFrom(existingValue) + .mergeFrom((Message)entry.getValue()) + .build()); + } + } else { + setField(field, entry.getValue()); + } + } + + mergeUnknownFields(other.getUnknownFields()); + + return (BuilderType) this; + } + + @Override + public BuilderType mergeFrom(final CodedInputStream input) + throws IOException { + return mergeFrom(input, ExtensionRegistry.getEmptyRegistry()); + } + + @Override + public BuilderType mergeFrom( + final CodedInputStream input, + final ExtensionRegistryLite extensionRegistry) + throws IOException { + final UnknownFieldSet.Builder unknownFields = + UnknownFieldSet.newBuilder(getUnknownFields()); + while (true) { + final int tag = input.readTag(); + if (tag == 0) { + break; + } + + if (!mergeFieldFrom(input, unknownFields, extensionRegistry, + this, tag)) { + // end group tag + break; + } + } + setUnknownFields(unknownFields.build()); + return (BuilderType) this; + } + + /** + * Like {@link #mergeFrom(CodedInputStream, UnknownFieldSet.Builder, + * ExtensionRegistryLite, Message.Builder)}, but parses a single field. + * Package-private because it is used by GeneratedMessage.ExtendableMessage. + * @param tag The tag, which should have already been read. + * @return {@code true} unless the tag is an end-group tag. + */ + static boolean mergeFieldFrom( + final CodedInputStream input, + final UnknownFieldSet.Builder unknownFields, + final ExtensionRegistryLite extensionRegistry, + final Message.Builder builder, + final int tag) throws IOException { + final Descriptor type = builder.getDescriptorForType(); + + if (type.getOptions().getMessageSetWireFormat() && + tag == WireFormat.MESSAGE_SET_ITEM_TAG) { + mergeMessageSetExtensionFromCodedStream( + input, unknownFields, extensionRegistry, builder); + return true; + } + + final int wireType = WireFormat.getTagWireType(tag); + final int fieldNumber = WireFormat.getTagFieldNumber(tag); + + final FieldDescriptor field; + Message defaultInstance = null; + + if (type.isExtensionNumber(fieldNumber)) { + // extensionRegistry may be either ExtensionRegistry or + // ExtensionRegistryLite. Since the type we are parsing is a full + // message, only a full ExtensionRegistry could possibly contain + // extensions of it. Otherwise we will treat the registry as if it + // were empty. + if (extensionRegistry instanceof ExtensionRegistry) { + final ExtensionRegistry.ExtensionInfo extension = + ((ExtensionRegistry) extensionRegistry) + .findExtensionByNumber(type, fieldNumber); + if (extension == null) { + field = null; + } else { + field = extension.descriptor; + defaultInstance = extension.defaultInstance; + if (defaultInstance == null && + field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + throw new IllegalStateException( + "Message-typed extension lacked default instance: " + + field.getFullName()); + } + } + } else { + field = null; + } + } else { + field = type.findFieldByNumber(fieldNumber); + } + + boolean unknown = false; + boolean packed = false; + if (field == null) { + unknown = true; // Unknown field. + } else if (wireType == FieldSet.getWireFormatForFieldType( + field.getLiteType(), + false /* isPacked */)) { + packed = false; + } else if (field.isPackable() && + wireType == FieldSet.getWireFormatForFieldType( + field.getLiteType(), + true /* isPacked */)) { + packed = true; + } else { + unknown = true; // Unknown wire type. + } + + if (unknown) { // Unknown field or wrong wire type. Skip. + return unknownFields.mergeFieldFrom(tag, input); + } + + if (packed) { + final int length = input.readRawVarint32(); + final int limit = input.pushLimit(length); + if (field.getLiteType() == WireFormat.FieldType.ENUM) { + while (input.getBytesUntilLimit() > 0) { + final int rawValue = input.readEnum(); + final Object value = field.getEnumType().findValueByNumber(rawValue); + if (value == null) { + // If the number isn't recognized as a valid value for this + // enum, drop it (don't even add it to unknownFields). + return true; + } + builder.addRepeatedField(field, value); + } + } else { + while (input.getBytesUntilLimit() > 0) { + final Object value = + FieldSet.readPrimitiveField(input, field.getLiteType()); + builder.addRepeatedField(field, value); + } + } + input.popLimit(limit); + } else { + final Object value; + switch (field.getType()) { + case GROUP: { + final Message.Builder subBuilder; + if (defaultInstance != null) { + subBuilder = defaultInstance.newBuilderForType(); + } else { + subBuilder = builder.newBuilderForField(field); + } + if (!field.isRepeated()) { + subBuilder.mergeFrom((Message) builder.getField(field)); + } + input.readGroup(field.getNumber(), subBuilder, extensionRegistry); + value = subBuilder.build(); + break; + } + case MESSAGE: { + final Message.Builder subBuilder; + if (defaultInstance != null) { + subBuilder = defaultInstance.newBuilderForType(); + } else { + subBuilder = builder.newBuilderForField(field); + } + if (!field.isRepeated()) { + subBuilder.mergeFrom((Message) builder.getField(field)); + } + input.readMessage(subBuilder, extensionRegistry); + value = subBuilder.build(); + break; + } + case ENUM: + final int rawValue = input.readEnum(); + value = field.getEnumType().findValueByNumber(rawValue); + // If the number isn't recognized as a valid value for this enum, + // drop it. + if (value == null) { + unknownFields.mergeVarintField(fieldNumber, rawValue); + return true; + } + break; + default: + value = FieldSet.readPrimitiveField(input, field.getLiteType()); + break; + } + + if (field.isRepeated()) { + builder.addRepeatedField(field, value); + } else { + builder.setField(field, value); + } + } + + return true; + } + + /** Called by {@code #mergeFieldFrom()} to parse a MessageSet extension. */ + private static void mergeMessageSetExtensionFromCodedStream( + final CodedInputStream input, + final UnknownFieldSet.Builder unknownFields, + final ExtensionRegistryLite extensionRegistry, + final Message.Builder builder) throws IOException { + final Descriptor type = builder.getDescriptorForType(); + + // The wire format for MessageSet is: + // message MessageSet { + // repeated group Item = 1 { + // required int32 typeId = 2; + // required bytes message = 3; + // } + // } + // "typeId" is the extension's field number. The extension can only be + // a message type, where "message" contains the encoded bytes of that + // message. + // + // In practice, we will probably never see a MessageSet item in which + // the message appears before the type ID, or where either field does not + // appear exactly once. However, in theory such cases are valid, so we + // should be prepared to accept them. + + int typeId = 0; + ByteString rawBytes = null; // If we encounter "message" before "typeId" + Message.Builder subBuilder = null; + FieldDescriptor field = null; + + while (true) { + final int tag = input.readTag(); + if (tag == 0) { + break; + } + + if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) { + typeId = input.readUInt32(); + // Zero is not a valid type ID. + if (typeId != 0) { + final ExtensionRegistry.ExtensionInfo extension; + + // extensionRegistry may be either ExtensionRegistry or + // ExtensionRegistryLite. Since the type we are parsing is a full + // message, only a full ExtensionRegistry could possibly contain + // extensions of it. Otherwise we will treat the registry as if it + // were empty. + if (extensionRegistry instanceof ExtensionRegistry) { + extension = ((ExtensionRegistry) extensionRegistry) + .findExtensionByNumber(type, typeId); + } else { + extension = null; + } + + if (extension != null) { + field = extension.descriptor; + subBuilder = extension.defaultInstance.newBuilderForType(); + final Message originalMessage = (Message)builder.getField(field); + if (originalMessage != null) { + subBuilder.mergeFrom(originalMessage); + } + if (rawBytes != null) { + // We already encountered the message. Parse it now. + subBuilder.mergeFrom( + CodedInputStream.newInstance(rawBytes.newInput())); + rawBytes = null; + } + } else { + // Unknown extension number. If we already saw data, put it + // in rawBytes. + if (rawBytes != null) { + unknownFields.mergeField(typeId, + UnknownFieldSet.Field.newBuilder() + .addLengthDelimited(rawBytes) + .build()); + rawBytes = null; + } + } + } + } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) { + if (typeId == 0) { + // We haven't seen a type ID yet, so we have to store the raw bytes + // for now. + rawBytes = input.readBytes(); + } else if (subBuilder == null) { + // We don't know how to parse this. Ignore it. + unknownFields.mergeField(typeId, + UnknownFieldSet.Field.newBuilder() + .addLengthDelimited(input.readBytes()) + .build()); + } else { + // We already know the type, so we can parse directly from the input + // with no copying. Hooray! + input.readMessage(subBuilder, extensionRegistry); + } + } else { + // Unknown tag. Skip it. + if (!input.skipField(tag)) { + break; // end of group + } + } + } + + input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG); + + if (subBuilder != null) { + builder.setField(field, subBuilder.build()); + } + } + + public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) { + setUnknownFields( + UnknownFieldSet.newBuilder(getUnknownFields()) + .mergeFrom(unknownFields) + .build()); + return (BuilderType) this; + } + + /** + * Construct an UninitializedMessageException reporting missing fields in + * the given message. + */ + protected static UninitializedMessageException + newUninitializedMessageException(Message message) { + return new UninitializedMessageException(findMissingFields(message)); + } + + /** + * Populates {@code this.missingFields} with the full "path" of each + * missing required field in the given message. + */ + private static List findMissingFields(final Message message) { + final List results = new ArrayList(); + findMissingFields(message, "", results); + return results; + } + + /** Recursive helper implementing {@link #findMissingFields(Message)}. */ + private static void findMissingFields(final Message message, + final String prefix, + final List results) { + for (final FieldDescriptor field : + message.getDescriptorForType().getFields()) { + if (field.isRequired() && !message.hasField(field)) { + results.add(prefix + field.getName()); + } + } + + for (final Map.Entry entry : + message.getAllFields().entrySet()) { + final FieldDescriptor field = entry.getKey(); + final Object value = entry.getValue(); + + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + if (field.isRepeated()) { + int i = 0; + for (final Object element : (List) value) { + findMissingFields((Message) element, + subMessagePrefix(prefix, field, i++), + results); + } + } else { + if (message.hasField(field)) { + findMissingFields((Message) value, + subMessagePrefix(prefix, field, -1), + results); + } + } + } + } + } + + private static String subMessagePrefix(final String prefix, + final FieldDescriptor field, + final int index) { + final StringBuilder result = new StringBuilder(prefix); + if (field.isExtension()) { + result.append('(') + .append(field.getFullName()) + .append(')'); + } else { + result.append(field.getName()); + } + if (index != -1) { + result.append('[') + .append(index) + .append(']'); + } + result.append('.'); + return result.toString(); + } + + // =============================================================== + // The following definitions seem to be required in order to make javac + // not produce weird errors like: + // + // java/com/google/protobuf/DynamicMessage.java:203: types + // com.google.protobuf.AbstractMessage.Builder< + // com.google.protobuf.DynamicMessage.Builder> and + // com.google.protobuf.AbstractMessage.Builder< + // com.google.protobuf.DynamicMessage.Builder> are incompatible; both + // define mergeFrom(com.google.protobuf.ByteString), but with unrelated + // return types. + // + // Strangely, these lines are only needed if javac is invoked separately + // on AbstractMessage.java and AbstractMessageLite.java. If javac is + // invoked on both simultaneously, it works. (Or maybe the important + // point is whether or not DynamicMessage.java is compiled together with + // AbstractMessageLite.java -- not sure.) I suspect this is a compiler + // bug. + + @Override + public BuilderType mergeFrom(final ByteString data) + throws InvalidProtocolBufferException { + return super.mergeFrom(data); + } + + @Override + public BuilderType mergeFrom( + final ByteString data, + final ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + return super.mergeFrom(data, extensionRegistry); + } + + @Override + public BuilderType mergeFrom(final byte[] data) + throws InvalidProtocolBufferException { + return super.mergeFrom(data); + } + + @Override + public BuilderType mergeFrom( + final byte[] data, final int off, final int len) + throws InvalidProtocolBufferException { + return super.mergeFrom(data, off, len); + } + + @Override + public BuilderType mergeFrom( + final byte[] data, + final ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + return super.mergeFrom(data, extensionRegistry); + } + + @Override + public BuilderType mergeFrom( + final byte[] data, final int off, final int len, + final ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + return super.mergeFrom(data, off, len, extensionRegistry); + } + + @Override + public BuilderType mergeFrom(final InputStream input) + throws IOException { + return super.mergeFrom(input); + } + + @Override + public BuilderType mergeFrom( + final InputStream input, + final ExtensionRegistryLite extensionRegistry) + throws IOException { + return super.mergeFrom(input, extensionRegistry); + } + + @Override + public boolean mergeDelimitedFrom(final InputStream input) + throws IOException { + return super.mergeDelimitedFrom(input); + } + + @Override + public boolean mergeDelimitedFrom( + final InputStream input, + final ExtensionRegistryLite extensionRegistry) + throws IOException { + return super.mergeDelimitedFrom(input, extensionRegistry); + } + + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java new file mode 100644 index 000000000..77b273702 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java @@ -0,0 +1,325 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.io.FilterInputStream; +import java.io.InputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Collection; + +/** + * A partial implementation of the {@link MessageLite} interface which + * implements as many methods of that interface as possible in terms of other + * methods. + * + * @author kenton@google.com Kenton Varda + */ +public abstract class AbstractMessageLite implements MessageLite { + public ByteString toByteString() { + try { + final ByteString.CodedBuilder out = + ByteString.newCodedBuilder(getSerializedSize()); + writeTo(out.getCodedOutput()); + return out.build(); + } catch (IOException e) { + throw new RuntimeException( + "Serializing to a ByteString threw an IOException (should " + + "never happen).", e); + } + } + + public byte[] toByteArray() { + try { + final byte[] result = new byte[getSerializedSize()]; + final CodedOutputStream output = CodedOutputStream.newInstance(result); + writeTo(output); + output.checkNoSpaceLeft(); + return result; + } catch (IOException e) { + throw new RuntimeException( + "Serializing to a byte array threw an IOException " + + "(should never happen).", e); + } + } + + public void writeTo(final OutputStream output) throws IOException { + final int bufferSize = + CodedOutputStream.computePreferredBufferSize(getSerializedSize()); + final CodedOutputStream codedOutput = + CodedOutputStream.newInstance(output, bufferSize); + writeTo(codedOutput); + codedOutput.flush(); + } + + public void writeDelimitedTo(final OutputStream output) throws IOException { + final int serialized = getSerializedSize(); + final int bufferSize = CodedOutputStream.computePreferredBufferSize( + CodedOutputStream.computeRawVarint32Size(serialized) + serialized); + final CodedOutputStream codedOutput = + CodedOutputStream.newInstance(output, bufferSize); + codedOutput.writeRawVarint32(serialized); + writeTo(codedOutput); + codedOutput.flush(); + } + + /** + * A partial implementation of the {@link Message.Builder} interface which + * implements as many methods of that interface as possible in terms of + * other methods. + */ + @SuppressWarnings("unchecked") + public static abstract class Builder + implements MessageLite.Builder { + // The compiler produces an error if this is not declared explicitly. + @Override + public abstract BuilderType clone(); + + public BuilderType mergeFrom(final CodedInputStream input) + throws IOException { + return mergeFrom(input, ExtensionRegistryLite.getEmptyRegistry()); + } + + // Re-defined here for return type covariance. + public abstract BuilderType mergeFrom( + final CodedInputStream input, + final ExtensionRegistryLite extensionRegistry) + throws IOException; + + public BuilderType mergeFrom(final ByteString data) + throws InvalidProtocolBufferException { + try { + final CodedInputStream input = data.newCodedInput(); + mergeFrom(input); + input.checkLastTagWas(0); + return (BuilderType) this; + } catch (InvalidProtocolBufferException e) { + throw e; + } catch (IOException e) { + throw new RuntimeException( + "Reading from a ByteString threw an IOException (should " + + "never happen).", e); + } + } + + public BuilderType mergeFrom( + final ByteString data, + final ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + try { + final CodedInputStream input = data.newCodedInput(); + mergeFrom(input, extensionRegistry); + input.checkLastTagWas(0); + return (BuilderType) this; + } catch (InvalidProtocolBufferException e) { + throw e; + } catch (IOException e) { + throw new RuntimeException( + "Reading from a ByteString threw an IOException (should " + + "never happen).", e); + } + } + + public BuilderType mergeFrom(final byte[] data) + throws InvalidProtocolBufferException { + return mergeFrom(data, 0, data.length); + } + + public BuilderType mergeFrom(final byte[] data, final int off, + final int len) + throws InvalidProtocolBufferException { + try { + final CodedInputStream input = + CodedInputStream.newInstance(data, off, len); + mergeFrom(input); + input.checkLastTagWas(0); + return (BuilderType) this; + } catch (InvalidProtocolBufferException e) { + throw e; + } catch (IOException e) { + throw new RuntimeException( + "Reading from a byte array threw an IOException (should " + + "never happen).", e); + } + } + + public BuilderType mergeFrom( + final byte[] data, + final ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + return mergeFrom(data, 0, data.length, extensionRegistry); + } + + public BuilderType mergeFrom( + final byte[] data, final int off, final int len, + final ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + try { + final CodedInputStream input = + CodedInputStream.newInstance(data, off, len); + mergeFrom(input, extensionRegistry); + input.checkLastTagWas(0); + return (BuilderType) this; + } catch (InvalidProtocolBufferException e) { + throw e; + } catch (IOException e) { + throw new RuntimeException( + "Reading from a byte array threw an IOException (should " + + "never happen).", e); + } + } + + public BuilderType mergeFrom(final InputStream input) throws IOException { + final CodedInputStream codedInput = CodedInputStream.newInstance(input); + mergeFrom(codedInput); + codedInput.checkLastTagWas(0); + return (BuilderType) this; + } + + public BuilderType mergeFrom( + final InputStream input, + final ExtensionRegistryLite extensionRegistry) + throws IOException { + final CodedInputStream codedInput = CodedInputStream.newInstance(input); + mergeFrom(codedInput, extensionRegistry); + codedInput.checkLastTagWas(0); + return (BuilderType) this; + } + + /** + * An InputStream implementations which reads from some other InputStream + * but is limited to a particular number of bytes. Used by + * mergeDelimitedFrom(). This is intentionally package-private so that + * UnknownFieldSet can share it. + */ + static final class LimitedInputStream extends FilterInputStream { + private int limit; + + LimitedInputStream(InputStream in, int limit) { + super(in); + this.limit = limit; + } + + @Override + public int available() throws IOException { + return Math.min(super.available(), limit); + } + + @Override + public int read() throws IOException { + if (limit <= 0) { + return -1; + } + final int result = super.read(); + if (result >= 0) { + --limit; + } + return result; + } + + @Override + public int read(final byte[] b, final int off, int len) + throws IOException { + if (limit <= 0) { + return -1; + } + len = Math.min(len, limit); + final int result = super.read(b, off, len); + if (result >= 0) { + limit -= result; + } + return result; + } + + @Override + public long skip(final long n) throws IOException { + final long result = super.skip(Math.min(n, limit)); + if (result >= 0) { + limit -= result; + } + return result; + } + } + + public boolean mergeDelimitedFrom( + final InputStream input, + final ExtensionRegistryLite extensionRegistry) + throws IOException { + final int firstByte = input.read(); + if (firstByte == -1) { + return false; + } + final int size = CodedInputStream.readRawVarint32(firstByte, input); + final InputStream limitedInput = new LimitedInputStream(input, size); + mergeFrom(limitedInput, extensionRegistry); + return true; + } + + public boolean mergeDelimitedFrom(final InputStream input) + throws IOException { + return mergeDelimitedFrom(input, + ExtensionRegistryLite.getEmptyRegistry()); + } + + /** + * Construct an UninitializedMessageException reporting missing fields in + * the given message. + */ + protected static UninitializedMessageException + newUninitializedMessageException(MessageLite message) { + return new UninitializedMessageException(message); + } + + /** + * Adds the {@code values} to the {@code list}. This is a helper method + * used by generated code. Users should ignore it. + * + * @throws NullPointerException if any of the elements of {@code values} is + * null. + */ + protected static void addAll(final Iterable values, + final Collection list) { + for (final T value : values) { + if (value == null) { + throw new NullPointerException(); + } + } + if (values instanceof Collection) { + final Collection collection = (Collection) values; + list.addAll(collection); + } else { + for (final T value : values) { + list.add(value); + } + } + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java new file mode 100644 index 000000000..1e81143ae --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + *

Abstract interface for a blocking RPC channel. {@code BlockingRpcChannel} + * is the blocking equivalent to {@link RpcChannel}. + * + * @author kenton@google.com Kenton Varda + * @author cpovirk@google.com Chris Povirk + */ +public interface BlockingRpcChannel { + /** + * Call the given method of the remote service and blocks until it returns. + * {@code callBlockingMethod()} is the blocking equivalent to + * {@link RpcChannel#callMethod}. + */ + Message callBlockingMethod( + Descriptors.MethodDescriptor method, + RpcController controller, + Message request, + Message responsePrototype) throws ServiceException; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java new file mode 100644 index 000000000..ecc80096f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java @@ -0,0 +1,64 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * Blocking equivalent to {@link Service}. + * + * @author kenton@google.com Kenton Varda + * @author cpovirk@google.com Chris Povirk + */ +public interface BlockingService { + /** + * Equivalent to {@link Service#getDescriptorForType}. + */ + Descriptors.ServiceDescriptor getDescriptorForType(); + + /** + * Equivalent to {@link Service#callMethod}, except that + * {@code callBlockingMethod()} returns the result of the RPC or throws a + * {@link ServiceException} if there is a failure, rather than passing the + * information to a callback. + */ + Message callBlockingMethod(Descriptors.MethodDescriptor method, + RpcController controller, + Message request) throws ServiceException; + + /** + * Equivalent to {@link Service#getRequestPrototype}. + */ + Message getRequestPrototype(Descriptors.MethodDescriptor method); + + /** + * Equivalent to {@link Service#getResponsePrototype}. + */ + Message getResponsePrototype(Descriptors.MethodDescriptor method); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java new file mode 100644 index 000000000..913563573 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java @@ -0,0 +1,403 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.io.InputStream; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.FilterOutputStream; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.util.List; + +/** + * Immutable array of bytes. + * + * @author crazybob@google.com Bob Lee + * @author kenton@google.com Kenton Varda + */ +public final class ByteString { + private final byte[] bytes; + + private ByteString(final byte[] bytes) { + this.bytes = bytes; + } + + /** + * Gets the byte at the given index. + * + * @throws ArrayIndexOutOfBoundsException {@code index} is < 0 or >= size + */ + public byte byteAt(final int index) { + return bytes[index]; + } + + /** + * Gets the number of bytes. + */ + public int size() { + return bytes.length; + } + + /** + * Returns {@code true} if the size is {@code 0}, {@code false} otherwise. + */ + public boolean isEmpty() { + return bytes.length == 0; + } + + // ================================================================= + // byte[] -> ByteString + + /** + * Empty ByteString. + */ + public static final ByteString EMPTY = new ByteString(new byte[0]); + + /** + * Copies the given bytes into a {@code ByteString}. + */ + public static ByteString copyFrom(final byte[] bytes, final int offset, + final int size) { + final byte[] copy = new byte[size]; + System.arraycopy(bytes, offset, copy, 0, size); + return new ByteString(copy); + } + + /** + * Copies the given bytes into a {@code ByteString}. + */ + public static ByteString copyFrom(final byte[] bytes) { + return copyFrom(bytes, 0, bytes.length); + } + + /** + * Copies {@code size} bytes from a {@code java.nio.ByteBuffer} into + * a {@code ByteString}. + */ + public static ByteString copyFrom(final ByteBuffer bytes, final int size) { + final byte[] copy = new byte[size]; + bytes.get(copy); + return new ByteString(copy); + } + + /** + * Copies the remaining bytes from a {@code java.nio.ByteBuffer} into + * a {@code ByteString}. + */ + public static ByteString copyFrom(final ByteBuffer bytes) { + return copyFrom(bytes, bytes.remaining()); + } + + /** + * Encodes {@code text} into a sequence of bytes using the named charset + * and returns the result as a {@code ByteString}. + */ + public static ByteString copyFrom(final String text, final String charsetName) + throws UnsupportedEncodingException { + return new ByteString(text.getBytes(charsetName)); + } + + /** + * Encodes {@code text} into a sequence of UTF-8 bytes and returns the + * result as a {@code ByteString}. + */ + public static ByteString copyFromUtf8(final String text) { + try { + return new ByteString(text.getBytes("UTF-8")); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("UTF-8 not supported?", e); + } + } + + /** + * Concatenates all byte strings in the list and returns the result. + * + *

The returned {@code ByteString} is not necessarily a unique object. + * If the list is empty, the returned object is the singleton empty + * {@code ByteString}. If the list has only one element, that + * {@code ByteString} will be returned without copying. + */ + public static ByteString copyFrom(List list) { + if (list.size() == 0) { + return EMPTY; + } else if (list.size() == 1) { + return list.get(0); + } + + int size = 0; + for (ByteString str : list) { + size += str.size(); + } + byte[] bytes = new byte[size]; + int pos = 0; + for (ByteString str : list) { + System.arraycopy(str.bytes, 0, bytes, pos, str.size()); + pos += str.size(); + } + return new ByteString(bytes); + } + + // ================================================================= + // ByteString -> byte[] + + /** + * Copies bytes into a buffer at the given offset. + * + * @param target buffer to copy into + * @param offset in the target buffer + */ + public void copyTo(final byte[] target, final int offset) { + System.arraycopy(bytes, 0, target, offset, bytes.length); + } + + /** + * Copies bytes into a buffer. + * + * @param target buffer to copy into + * @param sourceOffset offset within these bytes + * @param targetOffset offset within the target buffer + * @param size number of bytes to copy + */ + public void copyTo(final byte[] target, final int sourceOffset, + final int targetOffset, + final int size) { + System.arraycopy(bytes, sourceOffset, target, targetOffset, size); + } + + /** + * Copies bytes into a ByteBuffer. + * + * @param target ByteBuffer to copy into. + * @throws ReadOnlyBufferException if the {@code target} is read-only + * @throws BufferOverflowException if the {@code target}'s remaining() + * space is not large enough to hold the data. + */ + public void copyTo(ByteBuffer target) { + target.put(bytes, 0, bytes.length); + } + + /** + * Copies bytes to a {@code byte[]}. + */ + public byte[] toByteArray() { + final int size = bytes.length; + final byte[] copy = new byte[size]; + System.arraycopy(bytes, 0, copy, 0, size); + return copy; + } + + /** + * Constructs a new read-only {@code java.nio.ByteBuffer} with the + * same backing byte array. + */ + public ByteBuffer asReadOnlyByteBuffer() { + final ByteBuffer byteBuffer = ByteBuffer.wrap(bytes); + return byteBuffer.asReadOnlyBuffer(); + } + + /** + * Constructs a new {@code String} by decoding the bytes using the + * specified charset. + */ + public String toString(final String charsetName) + throws UnsupportedEncodingException { + return new String(bytes, charsetName); + } + + /** + * Constructs a new {@code String} by decoding the bytes as UTF-8. + */ + public String toStringUtf8() { + try { + return new String(bytes, "UTF-8"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("UTF-8 not supported?", e); + } + } + + // ================================================================= + // equals() and hashCode() + + @Override + public boolean equals(final Object o) { + if (o == this) { + return true; + } + + if (!(o instanceof ByteString)) { + return false; + } + + final ByteString other = (ByteString) o; + final int size = bytes.length; + if (size != other.bytes.length) { + return false; + } + + final byte[] thisBytes = bytes; + final byte[] otherBytes = other.bytes; + for (int i = 0; i < size; i++) { + if (thisBytes[i] != otherBytes[i]) { + return false; + } + } + + return true; + } + + private volatile int hash = 0; + + @Override + public int hashCode() { + int h = hash; + + if (h == 0) { + final byte[] thisBytes = bytes; + final int size = bytes.length; + + h = size; + for (int i = 0; i < size; i++) { + h = h * 31 + thisBytes[i]; + } + if (h == 0) { + h = 1; + } + + hash = h; + } + + return h; + } + + // ================================================================= + // Input stream + + /** + * Creates an {@code InputStream} which can be used to read the bytes. + */ + public InputStream newInput() { + return new ByteArrayInputStream(bytes); + } + + /** + * Creates a {@link CodedInputStream} which can be used to read the bytes. + * Using this is more efficient than creating a {@link CodedInputStream} + * wrapping the result of {@link #newInput()}. + */ + public CodedInputStream newCodedInput() { + // We trust CodedInputStream not to modify the bytes, or to give anyone + // else access to them. + return CodedInputStream.newInstance(bytes); + } + + // ================================================================= + // Output stream + + /** + * Creates a new {@link Output} with the given initial capacity. + */ + public static Output newOutput(final int initialCapacity) { + return new Output(new ByteArrayOutputStream(initialCapacity)); + } + + /** + * Creates a new {@link Output}. + */ + public static Output newOutput() { + return newOutput(32); + } + + /** + * Outputs to a {@code ByteString} instance. Call {@link #toByteString()} to + * create the {@code ByteString} instance. + */ + public static final class Output extends FilterOutputStream { + private final ByteArrayOutputStream bout; + + /** + * Constructs a new output with the given initial capacity. + */ + private Output(final ByteArrayOutputStream bout) { + super(bout); + this.bout = bout; + } + + /** + * Creates a {@code ByteString} instance from this {@code Output}. + */ + public ByteString toByteString() { + final byte[] byteArray = bout.toByteArray(); + return new ByteString(byteArray); + } + } + + /** + * Constructs a new ByteString builder, which allows you to efficiently + * construct a {@code ByteString} by writing to a {@link CodedOutputStream}. + * Using this is much more efficient than calling {@code newOutput()} and + * wrapping that in a {@code CodedOutputStream}. + * + *

This is package-private because it's a somewhat confusing interface. + * Users can call {@link Message#toByteString()} instead of calling this + * directly. + * + * @param size The target byte size of the {@code ByteString}. You must + * write exactly this many bytes before building the result. + */ + static CodedBuilder newCodedBuilder(final int size) { + return new CodedBuilder(size); + } + + /** See {@link ByteString#newCodedBuilder(int)}. */ + static final class CodedBuilder { + private final CodedOutputStream output; + private final byte[] buffer; + + private CodedBuilder(final int size) { + buffer = new byte[size]; + output = CodedOutputStream.newInstance(buffer); + } + + public ByteString build() { + output.checkNoSpaceLeft(); + + // We can be confident that the CodedOutputStream will not modify the + // underlying bytes anymore because it already wrote all of them. So, + // no need to make a copy. + return new ByteString(buffer); + } + + public CodedOutputStream getCodedOutput() { + return output; + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java new file mode 100644 index 000000000..b3e08555d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java @@ -0,0 +1,885 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * Reads and decodes protocol message fields. + * + * This class contains two kinds of methods: methods that read specific + * protocol message constructs and field types (e.g. {@link #readTag()} and + * {@link #readInt32()}) and methods that read low-level values (e.g. + * {@link #readRawVarint32()} and {@link #readRawBytes}). If you are reading + * encoded protocol messages, you should use the former methods, but if you are + * reading some other format of your own design, use the latter. + * + * @author kenton@google.com Kenton Varda + */ +public final class CodedInputStream { + /** + * Create a new CodedInputStream wrapping the given InputStream. + */ + public static CodedInputStream newInstance(final InputStream input) { + return new CodedInputStream(input); + } + + /** + * Create a new CodedInputStream wrapping the given byte array. + */ + public static CodedInputStream newInstance(final byte[] buf) { + return newInstance(buf, 0, buf.length); + } + + /** + * Create a new CodedInputStream wrapping the given byte array slice. + */ + public static CodedInputStream newInstance(final byte[] buf, final int off, + final int len) { + CodedInputStream result = new CodedInputStream(buf, off, len); + try { + // Some uses of CodedInputStream can be more efficient if they know + // exactly how many bytes are available. By pushing the end point of the + // buffer as a limit, we allow them to get this information via + // getBytesUntilLimit(). Pushing a limit that we know is at the end of + // the stream can never hurt, since we can never past that point anyway. + result.pushLimit(len); + } catch (InvalidProtocolBufferException ex) { + // The only reason pushLimit() might throw an exception here is if len + // is negative. Normally pushLimit()'s parameter comes directly off the + // wire, so it's important to catch exceptions in case of corrupt or + // malicious data. However, in this case, we expect that len is not a + // user-supplied value, so we can assume that it being negative indicates + // a programming error. Therefore, throwing an unchecked exception is + // appropriate. + throw new IllegalArgumentException(ex); + } + return result; + } + + // ----------------------------------------------------------------- + + /** + * Attempt to read a field tag, returning zero if we have reached EOF. + * Protocol message parsers use this to read tags, since a protocol message + * may legally end wherever a tag occurs, and zero is not a valid tag number. + */ + public int readTag() throws IOException { + if (isAtEnd()) { + lastTag = 0; + return 0; + } + + lastTag = readRawVarint32(); + if (WireFormat.getTagFieldNumber(lastTag) == 0) { + // If we actually read zero (or any tag number corresponding to field + // number zero), that's not a valid tag. + throw InvalidProtocolBufferException.invalidTag(); + } + return lastTag; + } + + /** + * Verifies that the last call to readTag() returned the given tag value. + * This is used to verify that a nested group ended with the correct + * end tag. + * + * @throws InvalidProtocolBufferException {@code value} does not match the + * last tag. + */ + public void checkLastTagWas(final int value) + throws InvalidProtocolBufferException { + if (lastTag != value) { + throw InvalidProtocolBufferException.invalidEndTag(); + } + } + + /** + * Reads and discards a single field, given its tag value. + * + * @return {@code false} if the tag is an endgroup tag, in which case + * nothing is skipped. Otherwise, returns {@code true}. + */ + public boolean skipField(final int tag) throws IOException { + switch (WireFormat.getTagWireType(tag)) { + case WireFormat.WIRETYPE_VARINT: + readInt32(); + return true; + case WireFormat.WIRETYPE_FIXED64: + readRawLittleEndian64(); + return true; + case WireFormat.WIRETYPE_LENGTH_DELIMITED: + skipRawBytes(readRawVarint32()); + return true; + case WireFormat.WIRETYPE_START_GROUP: + skipMessage(); + checkLastTagWas( + WireFormat.makeTag(WireFormat.getTagFieldNumber(tag), + WireFormat.WIRETYPE_END_GROUP)); + return true; + case WireFormat.WIRETYPE_END_GROUP: + return false; + case WireFormat.WIRETYPE_FIXED32: + readRawLittleEndian32(); + return true; + default: + throw InvalidProtocolBufferException.invalidWireType(); + } + } + + /** + * Reads and discards an entire message. This will read either until EOF + * or until an endgroup tag, whichever comes first. + */ + public void skipMessage() throws IOException { + while (true) { + final int tag = readTag(); + if (tag == 0 || !skipField(tag)) { + return; + } + } + } + + // ----------------------------------------------------------------- + + /** Read a {@code double} field value from the stream. */ + public double readDouble() throws IOException { + return Double.longBitsToDouble(readRawLittleEndian64()); + } + + /** Read a {@code float} field value from the stream. */ + public float readFloat() throws IOException { + return Float.intBitsToFloat(readRawLittleEndian32()); + } + + /** Read a {@code uint64} field value from the stream. */ + public long readUInt64() throws IOException { + return readRawVarint64(); + } + + /** Read an {@code int64} field value from the stream. */ + public long readInt64() throws IOException { + return readRawVarint64(); + } + + /** Read an {@code int32} field value from the stream. */ + public int readInt32() throws IOException { + return readRawVarint32(); + } + + /** Read a {@code fixed64} field value from the stream. */ + public long readFixed64() throws IOException { + return readRawLittleEndian64(); + } + + /** Read a {@code fixed32} field value from the stream. */ + public int readFixed32() throws IOException { + return readRawLittleEndian32(); + } + + /** Read a {@code bool} field value from the stream. */ + public boolean readBool() throws IOException { + return readRawVarint32() != 0; + } + + /** Read a {@code string} field value from the stream. */ + public String readString() throws IOException { + final int size = readRawVarint32(); + if (size <= (bufferSize - bufferPos) && size > 0) { + // Fast path: We already have the bytes in a contiguous buffer, so + // just copy directly from it. + final String result = new String(buffer, bufferPos, size, "UTF-8"); + bufferPos += size; + return result; + } else { + // Slow path: Build a byte array first then copy it. + return new String(readRawBytes(size), "UTF-8"); + } + } + + /** Read a {@code group} field value from the stream. */ + public void readGroup(final int fieldNumber, + final MessageLite.Builder builder, + final ExtensionRegistryLite extensionRegistry) + throws IOException { + if (recursionDepth >= recursionLimit) { + throw InvalidProtocolBufferException.recursionLimitExceeded(); + } + ++recursionDepth; + builder.mergeFrom(this, extensionRegistry); + checkLastTagWas( + WireFormat.makeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP)); + --recursionDepth; + } + + /** + * Reads a {@code group} field value from the stream and merges it into the + * given {@link UnknownFieldSet}. + * + * @deprecated UnknownFieldSet.Builder now implements MessageLite.Builder, so + * you can just call {@link #readGroup}. + */ + @Deprecated + public void readUnknownGroup(final int fieldNumber, + final MessageLite.Builder builder) + throws IOException { + // We know that UnknownFieldSet will ignore any ExtensionRegistry so it + // is safe to pass null here. (We can't call + // ExtensionRegistry.getEmptyRegistry() because that would make this + // class depend on ExtensionRegistry, which is not part of the lite + // library.) + readGroup(fieldNumber, builder, null); + } + + /** Read an embedded message field value from the stream. */ + public void readMessage(final MessageLite.Builder builder, + final ExtensionRegistryLite extensionRegistry) + throws IOException { + final int length = readRawVarint32(); + if (recursionDepth >= recursionLimit) { + throw InvalidProtocolBufferException.recursionLimitExceeded(); + } + final int oldLimit = pushLimit(length); + ++recursionDepth; + builder.mergeFrom(this, extensionRegistry); + checkLastTagWas(0); + --recursionDepth; + popLimit(oldLimit); + } + + /** Read a {@code bytes} field value from the stream. */ + public ByteString readBytes() throws IOException { + final int size = readRawVarint32(); + if (size == 0) { + return ByteString.EMPTY; + } else if (size <= (bufferSize - bufferPos) && size > 0) { + // Fast path: We already have the bytes in a contiguous buffer, so + // just copy directly from it. + final ByteString result = ByteString.copyFrom(buffer, bufferPos, size); + bufferPos += size; + return result; + } else { + // Slow path: Build a byte array first then copy it. + return ByteString.copyFrom(readRawBytes(size)); + } + } + + /** Read a {@code uint32} field value from the stream. */ + public int readUInt32() throws IOException { + return readRawVarint32(); + } + + /** + * Read an enum field value from the stream. Caller is responsible + * for converting the numeric value to an actual enum. + */ + public int readEnum() throws IOException { + return readRawVarint32(); + } + + /** Read an {@code sfixed32} field value from the stream. */ + public int readSFixed32() throws IOException { + return readRawLittleEndian32(); + } + + /** Read an {@code sfixed64} field value from the stream. */ + public long readSFixed64() throws IOException { + return readRawLittleEndian64(); + } + + /** Read an {@code sint32} field value from the stream. */ + public int readSInt32() throws IOException { + return decodeZigZag32(readRawVarint32()); + } + + /** Read an {@code sint64} field value from the stream. */ + public long readSInt64() throws IOException { + return decodeZigZag64(readRawVarint64()); + } + + // ================================================================= + + /** + * Read a raw Varint from the stream. If larger than 32 bits, discard the + * upper bits. + */ + public int readRawVarint32() throws IOException { + byte tmp = readRawByte(); + if (tmp >= 0) { + return tmp; + } + int result = tmp & 0x7f; + if ((tmp = readRawByte()) >= 0) { + result |= tmp << 7; + } else { + result |= (tmp & 0x7f) << 7; + if ((tmp = readRawByte()) >= 0) { + result |= tmp << 14; + } else { + result |= (tmp & 0x7f) << 14; + if ((tmp = readRawByte()) >= 0) { + result |= tmp << 21; + } else { + result |= (tmp & 0x7f) << 21; + result |= (tmp = readRawByte()) << 28; + if (tmp < 0) { + // Discard upper 32 bits. + for (int i = 0; i < 5; i++) { + if (readRawByte() >= 0) { + return result; + } + } + throw InvalidProtocolBufferException.malformedVarint(); + } + } + } + } + return result; + } + + /** + * Reads a varint from the input one byte at a time, so that it does not + * read any bytes after the end of the varint. If you simply wrapped the + * stream in a CodedInputStream and used {@link #readRawVarint32(InputStream)} + * then you would probably end up reading past the end of the varint since + * CodedInputStream buffers its input. + */ + static int readRawVarint32(final InputStream input) throws IOException { + final int firstByte = input.read(); + if (firstByte == -1) { + throw InvalidProtocolBufferException.truncatedMessage(); + } + return readRawVarint32(firstByte, input); + } + + /** + * Like {@link #readRawVarint32(InputStream)}, but expects that the caller + * has already read one byte. This allows the caller to determine if EOF + * has been reached before attempting to read. + */ + public static int readRawVarint32( + final int firstByte, final InputStream input) throws IOException { + if ((firstByte & 0x80) == 0) { + return firstByte; + } + + int result = firstByte & 0x7f; + int offset = 7; + for (; offset < 32; offset += 7) { + final int b = input.read(); + if (b == -1) { + throw InvalidProtocolBufferException.truncatedMessage(); + } + result |= (b & 0x7f) << offset; + if ((b & 0x80) == 0) { + return result; + } + } + // Keep reading up to 64 bits. + for (; offset < 64; offset += 7) { + final int b = input.read(); + if (b == -1) { + throw InvalidProtocolBufferException.truncatedMessage(); + } + if ((b & 0x80) == 0) { + return result; + } + } + throw InvalidProtocolBufferException.malformedVarint(); + } + + /** Read a raw Varint from the stream. */ + public long readRawVarint64() throws IOException { + int shift = 0; + long result = 0; + while (shift < 64) { + final byte b = readRawByte(); + result |= (long)(b & 0x7F) << shift; + if ((b & 0x80) == 0) { + return result; + } + shift += 7; + } + throw InvalidProtocolBufferException.malformedVarint(); + } + + /** Read a 32-bit little-endian integer from the stream. */ + public int readRawLittleEndian32() throws IOException { + final byte b1 = readRawByte(); + final byte b2 = readRawByte(); + final byte b3 = readRawByte(); + final byte b4 = readRawByte(); + return (((int)b1 & 0xff) ) | + (((int)b2 & 0xff) << 8) | + (((int)b3 & 0xff) << 16) | + (((int)b4 & 0xff) << 24); + } + + /** Read a 64-bit little-endian integer from the stream. */ + public long readRawLittleEndian64() throws IOException { + final byte b1 = readRawByte(); + final byte b2 = readRawByte(); + final byte b3 = readRawByte(); + final byte b4 = readRawByte(); + final byte b5 = readRawByte(); + final byte b6 = readRawByte(); + final byte b7 = readRawByte(); + final byte b8 = readRawByte(); + return (((long)b1 & 0xff) ) | + (((long)b2 & 0xff) << 8) | + (((long)b3 & 0xff) << 16) | + (((long)b4 & 0xff) << 24) | + (((long)b5 & 0xff) << 32) | + (((long)b6 & 0xff) << 40) | + (((long)b7 & 0xff) << 48) | + (((long)b8 & 0xff) << 56); + } + + /** + * Decode a ZigZag-encoded 32-bit value. ZigZag encodes signed integers + * into values that can be efficiently encoded with varint. (Otherwise, + * negative values must be sign-extended to 64 bits to be varint encoded, + * thus always taking 10 bytes on the wire.) + * + * @param n An unsigned 32-bit integer, stored in a signed int because + * Java has no explicit unsigned support. + * @return A signed 32-bit integer. + */ + public static int decodeZigZag32(final int n) { + return (n >>> 1) ^ -(n & 1); + } + + /** + * Decode a ZigZag-encoded 64-bit value. ZigZag encodes signed integers + * into values that can be efficiently encoded with varint. (Otherwise, + * negative values must be sign-extended to 64 bits to be varint encoded, + * thus always taking 10 bytes on the wire.) + * + * @param n An unsigned 64-bit integer, stored in a signed int because + * Java has no explicit unsigned support. + * @return A signed 64-bit integer. + */ + public static long decodeZigZag64(final long n) { + return (n >>> 1) ^ -(n & 1); + } + + // ----------------------------------------------------------------- + + private final byte[] buffer; + private int bufferSize; + private int bufferSizeAfterLimit; + private int bufferPos; + private final InputStream input; + private int lastTag; + + /** + * The total number of bytes read before the current buffer. The total + * bytes read up to the current position can be computed as + * {@code totalBytesRetired + bufferPos}. This value may be negative if + * reading started in the middle of the current buffer (e.g. if the + * constructor that takes a byte array and an offset was used). + */ + private int totalBytesRetired; + + /** The absolute position of the end of the current message. */ + private int currentLimit = Integer.MAX_VALUE; + + /** See setRecursionLimit() */ + private int recursionDepth; + private int recursionLimit = DEFAULT_RECURSION_LIMIT; + + /** See setSizeLimit() */ + private int sizeLimit = DEFAULT_SIZE_LIMIT; + + private static final int DEFAULT_RECURSION_LIMIT = 64; + private static final int DEFAULT_SIZE_LIMIT = 64 << 20; // 64MB + private static final int BUFFER_SIZE = 4096; + + private CodedInputStream(final byte[] buffer, final int off, final int len) { + this.buffer = buffer; + bufferSize = off + len; + bufferPos = off; + totalBytesRetired = -off; + input = null; + } + + private CodedInputStream(final InputStream input) { + buffer = new byte[BUFFER_SIZE]; + bufferSize = 0; + bufferPos = 0; + totalBytesRetired = 0; + this.input = input; + } + + /** + * Set the maximum message recursion depth. In order to prevent malicious + * messages from causing stack overflows, {@code CodedInputStream} limits + * how deeply messages may be nested. The default limit is 64. + * + * @return the old limit. + */ + public int setRecursionLimit(final int limit) { + if (limit < 0) { + throw new IllegalArgumentException( + "Recursion limit cannot be negative: " + limit); + } + final int oldLimit = recursionLimit; + recursionLimit = limit; + return oldLimit; + } + + /** + * Set the maximum message size. In order to prevent malicious + * messages from exhausting memory or causing integer overflows, + * {@code CodedInputStream} limits how large a message may be. + * The default limit is 64MB. You should set this limit as small + * as you can without harming your app's functionality. Note that + * size limits only apply when reading from an {@code InputStream}, not + * when constructed around a raw byte array (nor with + * {@link ByteString#newCodedInput}). + *

+ * If you want to read several messages from a single CodedInputStream, you + * could call {@link #resetSizeCounter()} after each one to avoid hitting the + * size limit. + * + * @return the old limit. + */ + public int setSizeLimit(final int limit) { + if (limit < 0) { + throw new IllegalArgumentException( + "Size limit cannot be negative: " + limit); + } + final int oldLimit = sizeLimit; + sizeLimit = limit; + return oldLimit; + } + + /** + * Resets the current size counter to zero (see {@link #setSizeLimit(int)}). + */ + public void resetSizeCounter() { + totalBytesRetired = -bufferPos; + } + + /** + * Sets {@code currentLimit} to (current position) + {@code byteLimit}. This + * is called when descending into a length-delimited embedded message. + * + *

Note that {@code pushLimit()} does NOT affect how many bytes the + * {@code CodedInputStream} reads from an underlying {@code InputStream} when + * refreshing its buffer. If you need to prevent reading past a certain + * point in the underlying {@code InputStream} (e.g. because you expect it to + * contain more data after the end of the message which you need to handle + * differently) then you must place a wrapper around you {@code InputStream} + * which limits the amount of data that can be read from it. + * + * @return the old limit. + */ + public int pushLimit(int byteLimit) throws InvalidProtocolBufferException { + if (byteLimit < 0) { + throw InvalidProtocolBufferException.negativeSize(); + } + byteLimit += totalBytesRetired + bufferPos; + final int oldLimit = currentLimit; + if (byteLimit > oldLimit) { + throw InvalidProtocolBufferException.truncatedMessage(); + } + currentLimit = byteLimit; + + recomputeBufferSizeAfterLimit(); + + return oldLimit; + } + + private void recomputeBufferSizeAfterLimit() { + bufferSize += bufferSizeAfterLimit; + final int bufferEnd = totalBytesRetired + bufferSize; + if (bufferEnd > currentLimit) { + // Limit is in current buffer. + bufferSizeAfterLimit = bufferEnd - currentLimit; + bufferSize -= bufferSizeAfterLimit; + } else { + bufferSizeAfterLimit = 0; + } + } + + /** + * Discards the current limit, returning to the previous limit. + * + * @param oldLimit The old limit, as returned by {@code pushLimit}. + */ + public void popLimit(final int oldLimit) { + currentLimit = oldLimit; + recomputeBufferSizeAfterLimit(); + } + + /** + * Returns the number of bytes to be read before the current limit. + * If no limit is set, returns -1. + */ + public int getBytesUntilLimit() { + if (currentLimit == Integer.MAX_VALUE) { + return -1; + } + + final int currentAbsolutePosition = totalBytesRetired + bufferPos; + return currentLimit - currentAbsolutePosition; + } + + /** + * Returns true if the stream has reached the end of the input. This is the + * case if either the end of the underlying input source has been reached or + * if the stream has reached a limit created using {@link #pushLimit(int)}. + */ + public boolean isAtEnd() throws IOException { + return bufferPos == bufferSize && !refillBuffer(false); + } + + /** + * The total bytes read up to the current position. Calling + * {@link #resetSizeCounter()} resets this value to zero. + */ + public int getTotalBytesRead() { + return totalBytesRetired + bufferPos; + } + + /** + * Called with {@code this.buffer} is empty to read more bytes from the + * input. If {@code mustSucceed} is true, refillBuffer() gurantees that + * either there will be at least one byte in the buffer when it returns + * or it will throw an exception. If {@code mustSucceed} is false, + * refillBuffer() returns false if no more bytes were available. + */ + private boolean refillBuffer(final boolean mustSucceed) throws IOException { + if (bufferPos < bufferSize) { + throw new IllegalStateException( + "refillBuffer() called when buffer wasn't empty."); + } + + if (totalBytesRetired + bufferSize == currentLimit) { + // Oops, we hit a limit. + if (mustSucceed) { + throw InvalidProtocolBufferException.truncatedMessage(); + } else { + return false; + } + } + + totalBytesRetired += bufferSize; + + bufferPos = 0; + bufferSize = (input == null) ? -1 : input.read(buffer); + if (bufferSize == 0 || bufferSize < -1) { + throw new IllegalStateException( + "InputStream#read(byte[]) returned invalid result: " + bufferSize + + "\nThe InputStream implementation is buggy."); + } + if (bufferSize == -1) { + bufferSize = 0; + if (mustSucceed) { + throw InvalidProtocolBufferException.truncatedMessage(); + } else { + return false; + } + } else { + recomputeBufferSizeAfterLimit(); + final int totalBytesRead = + totalBytesRetired + bufferSize + bufferSizeAfterLimit; + if (totalBytesRead > sizeLimit || totalBytesRead < 0) { + throw InvalidProtocolBufferException.sizeLimitExceeded(); + } + return true; + } + } + + /** + * Read one byte from the input. + * + * @throws InvalidProtocolBufferException The end of the stream or the current + * limit was reached. + */ + public byte readRawByte() throws IOException { + if (bufferPos == bufferSize) { + refillBuffer(true); + } + return buffer[bufferPos++]; + } + + /** + * Read a fixed size of bytes from the input. + * + * @throws InvalidProtocolBufferException The end of the stream or the current + * limit was reached. + */ + public byte[] readRawBytes(final int size) throws IOException { + if (size < 0) { + throw InvalidProtocolBufferException.negativeSize(); + } + + if (totalBytesRetired + bufferPos + size > currentLimit) { + // Read to the end of the stream anyway. + skipRawBytes(currentLimit - totalBytesRetired - bufferPos); + // Then fail. + throw InvalidProtocolBufferException.truncatedMessage(); + } + + if (size <= bufferSize - bufferPos) { + // We have all the bytes we need already. + final byte[] bytes = new byte[size]; + System.arraycopy(buffer, bufferPos, bytes, 0, size); + bufferPos += size; + return bytes; + } else if (size < BUFFER_SIZE) { + // Reading more bytes than are in the buffer, but not an excessive number + // of bytes. We can safely allocate the resulting array ahead of time. + + // First copy what we have. + final byte[] bytes = new byte[size]; + int pos = bufferSize - bufferPos; + System.arraycopy(buffer, bufferPos, bytes, 0, pos); + bufferPos = bufferSize; + + // We want to use refillBuffer() and then copy from the buffer into our + // byte array rather than reading directly into our byte array because + // the input may be unbuffered. + refillBuffer(true); + + while (size - pos > bufferSize) { + System.arraycopy(buffer, 0, bytes, pos, bufferSize); + pos += bufferSize; + bufferPos = bufferSize; + refillBuffer(true); + } + + System.arraycopy(buffer, 0, bytes, pos, size - pos); + bufferPos = size - pos; + + return bytes; + } else { + // The size is very large. For security reasons, we can't allocate the + // entire byte array yet. The size comes directly from the input, so a + // maliciously-crafted message could provide a bogus very large size in + // order to trick the app into allocating a lot of memory. We avoid this + // by allocating and reading only a small chunk at a time, so that the + // malicious message must actually *be* extremely large to cause + // problems. Meanwhile, we limit the allowed size of a message elsewhere. + + // Remember the buffer markers since we'll have to copy the bytes out of + // it later. + final int originalBufferPos = bufferPos; + final int originalBufferSize = bufferSize; + + // Mark the current buffer consumed. + totalBytesRetired += bufferSize; + bufferPos = 0; + bufferSize = 0; + + // Read all the rest of the bytes we need. + int sizeLeft = size - (originalBufferSize - originalBufferPos); + final List chunks = new ArrayList(); + + while (sizeLeft > 0) { + final byte[] chunk = new byte[Math.min(sizeLeft, BUFFER_SIZE)]; + int pos = 0; + while (pos < chunk.length) { + final int n = (input == null) ? -1 : + input.read(chunk, pos, chunk.length - pos); + if (n == -1) { + throw InvalidProtocolBufferException.truncatedMessage(); + } + totalBytesRetired += n; + pos += n; + } + sizeLeft -= chunk.length; + chunks.add(chunk); + } + + // OK, got everything. Now concatenate it all into one buffer. + final byte[] bytes = new byte[size]; + + // Start by copying the leftover bytes from this.buffer. + int pos = originalBufferSize - originalBufferPos; + System.arraycopy(buffer, originalBufferPos, bytes, 0, pos); + + // And now all the chunks. + for (final byte[] chunk : chunks) { + System.arraycopy(chunk, 0, bytes, pos, chunk.length); + pos += chunk.length; + } + + // Done. + return bytes; + } + } + + /** + * Reads and discards {@code size} bytes. + * + * @throws InvalidProtocolBufferException The end of the stream or the current + * limit was reached. + */ + public void skipRawBytes(final int size) throws IOException { + if (size < 0) { + throw InvalidProtocolBufferException.negativeSize(); + } + + if (totalBytesRetired + bufferPos + size > currentLimit) { + // Read to the end of the stream anyway. + skipRawBytes(currentLimit - totalBytesRetired - bufferPos); + // Then fail. + throw InvalidProtocolBufferException.truncatedMessage(); + } + + if (size <= bufferSize - bufferPos) { + // We have all the bytes we need already. + bufferPos += size; + } else { + // Skipping more bytes than are in the buffer. First skip what we have. + int pos = bufferSize - bufferPos; + bufferPos = bufferSize; + + // Keep refilling the buffer until we get to the point we wanted to skip + // to. This has the side effect of ensuring the limits are updated + // correctly. + refillBuffer(true); + while (size - pos > bufferSize) { + pos += bufferSize; + bufferPos = bufferSize; + refillBuffer(true); + } + + bufferPos = size - pos; + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java new file mode 100644 index 000000000..ac5f2d307 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java @@ -0,0 +1,1081 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.io.OutputStream; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.io.InputStream; + +/** + * Encodes and writes protocol message fields. + * + *

This class contains two kinds of methods: methods that write specific + * protocol message constructs and field types (e.g. {@link #writeTag} and + * {@link #writeInt32}) and methods that write low-level values (e.g. + * {@link #writeRawVarint32} and {@link #writeRawBytes}). If you are + * writing encoded protocol messages, you should use the former methods, but if + * you are writing some other format of your own design, use the latter. + * + *

This class is totally unsynchronized. + * + * @author kneton@google.com Kenton Varda + */ +public final class CodedOutputStream { + private final byte[] buffer; + private final int limit; + private int position; + + private final OutputStream output; + + /** + * The buffer size used in {@link #newInstance(OutputStream)}. + */ + public static final int DEFAULT_BUFFER_SIZE = 4096; + + /** + * Returns the buffer size to efficiently write dataLength bytes to this + * CodedOutputStream. Used by AbstractMessageLite. + * + * @return the buffer size to efficiently write dataLength bytes to this + * CodedOutputStream. + */ + static int computePreferredBufferSize(int dataLength) { + if (dataLength > DEFAULT_BUFFER_SIZE) return DEFAULT_BUFFER_SIZE; + return dataLength; + } + + private CodedOutputStream(final byte[] buffer, final int offset, + final int length) { + output = null; + this.buffer = buffer; + position = offset; + limit = offset + length; + } + + private CodedOutputStream(final OutputStream output, final byte[] buffer) { + this.output = output; + this.buffer = buffer; + position = 0; + limit = buffer.length; + } + + /** + * Create a new {@code CodedOutputStream} wrapping the given + * {@code OutputStream}. + */ + public static CodedOutputStream newInstance(final OutputStream output) { + return newInstance(output, DEFAULT_BUFFER_SIZE); + } + + /** + * Create a new {@code CodedOutputStream} wrapping the given + * {@code OutputStream} with a given buffer size. + */ + public static CodedOutputStream newInstance(final OutputStream output, + final int bufferSize) { + return new CodedOutputStream(output, new byte[bufferSize]); + } + + /** + * Create a new {@code CodedOutputStream} that writes directly to the given + * byte array. If more bytes are written than fit in the array, + * {@link OutOfSpaceException} will be thrown. Writing directly to a flat + * array is faster than writing to an {@code OutputStream}. See also + * {@link ByteString#newCodedBuilder}. + */ + public static CodedOutputStream newInstance(final byte[] flatArray) { + return newInstance(flatArray, 0, flatArray.length); + } + + /** + * Create a new {@code CodedOutputStream} that writes directly to the given + * byte array slice. If more bytes are written than fit in the slice, + * {@link OutOfSpaceException} will be thrown. Writing directly to a flat + * array is faster than writing to an {@code OutputStream}. See also + * {@link ByteString#newCodedBuilder}. + */ + public static CodedOutputStream newInstance(final byte[] flatArray, + final int offset, + final int length) { + return new CodedOutputStream(flatArray, offset, length); + } + + // ----------------------------------------------------------------- + + /** Write a {@code double} field, including tag, to the stream. */ + public void writeDouble(final int fieldNumber, final double value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64); + writeDoubleNoTag(value); + } + + /** Write a {@code float} field, including tag, to the stream. */ + public void writeFloat(final int fieldNumber, final float value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32); + writeFloatNoTag(value); + } + + /** Write a {@code uint64} field, including tag, to the stream. */ + public void writeUInt64(final int fieldNumber, final long value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeUInt64NoTag(value); + } + + /** Write an {@code int64} field, including tag, to the stream. */ + public void writeInt64(final int fieldNumber, final long value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeInt64NoTag(value); + } + + /** Write an {@code int32} field, including tag, to the stream. */ + public void writeInt32(final int fieldNumber, final int value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeInt32NoTag(value); + } + + /** Write a {@code fixed64} field, including tag, to the stream. */ + public void writeFixed64(final int fieldNumber, final long value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64); + writeFixed64NoTag(value); + } + + /** Write a {@code fixed32} field, including tag, to the stream. */ + public void writeFixed32(final int fieldNumber, final int value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32); + writeFixed32NoTag(value); + } + + /** Write a {@code bool} field, including tag, to the stream. */ + public void writeBool(final int fieldNumber, final boolean value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeBoolNoTag(value); + } + + /** Write a {@code string} field, including tag, to the stream. */ + public void writeString(final int fieldNumber, final String value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED); + writeStringNoTag(value); + } + + /** Write a {@code group} field, including tag, to the stream. */ + public void writeGroup(final int fieldNumber, final MessageLite value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_START_GROUP); + writeGroupNoTag(value); + writeTag(fieldNumber, WireFormat.WIRETYPE_END_GROUP); + } + + /** + * Write a group represented by an {@link UnknownFieldSet}. + * + * @deprecated UnknownFieldSet now implements MessageLite, so you can just + * call {@link #writeGroup}. + */ + @Deprecated + public void writeUnknownGroup(final int fieldNumber, + final MessageLite value) + throws IOException { + writeGroup(fieldNumber, value); + } + + /** Write an embedded message field, including tag, to the stream. */ + public void writeMessage(final int fieldNumber, final MessageLite value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED); + writeMessageNoTag(value); + } + + /** Write a {@code bytes} field, including tag, to the stream. */ + public void writeBytes(final int fieldNumber, final ByteString value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_LENGTH_DELIMITED); + writeBytesNoTag(value); + } + + /** Write a {@code uint32} field, including tag, to the stream. */ + public void writeUInt32(final int fieldNumber, final int value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeUInt32NoTag(value); + } + + /** + * Write an enum field, including tag, to the stream. Caller is responsible + * for converting the enum value to its numeric value. + */ + public void writeEnum(final int fieldNumber, final int value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeEnumNoTag(value); + } + + /** Write an {@code sfixed32} field, including tag, to the stream. */ + public void writeSFixed32(final int fieldNumber, final int value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED32); + writeSFixed32NoTag(value); + } + + /** Write an {@code sfixed64} field, including tag, to the stream. */ + public void writeSFixed64(final int fieldNumber, final long value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_FIXED64); + writeSFixed64NoTag(value); + } + + /** Write an {@code sint32} field, including tag, to the stream. */ + public void writeSInt32(final int fieldNumber, final int value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeSInt32NoTag(value); + } + + /** Write an {@code sint64} field, including tag, to the stream. */ + public void writeSInt64(final int fieldNumber, final long value) + throws IOException { + writeTag(fieldNumber, WireFormat.WIRETYPE_VARINT); + writeSInt64NoTag(value); + } + + /** + * Write a MessageSet extension field to the stream. For historical reasons, + * the wire format differs from normal fields. + */ + public void writeMessageSetExtension(final int fieldNumber, + final MessageLite value) + throws IOException { + writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP); + writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber); + writeMessage(WireFormat.MESSAGE_SET_MESSAGE, value); + writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP); + } + + /** + * Write an unparsed MessageSet extension field to the stream. For + * historical reasons, the wire format differs from normal fields. + */ + public void writeRawMessageSetExtension(final int fieldNumber, + final ByteString value) + throws IOException { + writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_START_GROUP); + writeUInt32(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber); + writeBytes(WireFormat.MESSAGE_SET_MESSAGE, value); + writeTag(WireFormat.MESSAGE_SET_ITEM, WireFormat.WIRETYPE_END_GROUP); + } + + // ----------------------------------------------------------------- + + /** Write a {@code double} field to the stream. */ + public void writeDoubleNoTag(final double value) throws IOException { + writeRawLittleEndian64(Double.doubleToRawLongBits(value)); + } + + /** Write a {@code float} field to the stream. */ + public void writeFloatNoTag(final float value) throws IOException { + writeRawLittleEndian32(Float.floatToRawIntBits(value)); + } + + /** Write a {@code uint64} field to the stream. */ + public void writeUInt64NoTag(final long value) throws IOException { + writeRawVarint64(value); + } + + /** Write an {@code int64} field to the stream. */ + public void writeInt64NoTag(final long value) throws IOException { + writeRawVarint64(value); + } + + /** Write an {@code int32} field to the stream. */ + public void writeInt32NoTag(final int value) throws IOException { + if (value >= 0) { + writeRawVarint32(value); + } else { + // Must sign-extend. + writeRawVarint64(value); + } + } + + /** Write a {@code fixed64} field to the stream. */ + public void writeFixed64NoTag(final long value) throws IOException { + writeRawLittleEndian64(value); + } + + /** Write a {@code fixed32} field to the stream. */ + public void writeFixed32NoTag(final int value) throws IOException { + writeRawLittleEndian32(value); + } + + /** Write a {@code bool} field to the stream. */ + public void writeBoolNoTag(final boolean value) throws IOException { + writeRawByte(value ? 1 : 0); + } + + /** Write a {@code string} field to the stream. */ + public void writeStringNoTag(final String value) throws IOException { + // Unfortunately there does not appear to be any way to tell Java to encode + // UTF-8 directly into our buffer, so we have to let it create its own byte + // array and then copy. + final byte[] bytes = value.getBytes("UTF-8"); + writeRawVarint32(bytes.length); + writeRawBytes(bytes); + } + + /** Write a {@code group} field to the stream. */ + public void writeGroupNoTag(final MessageLite value) throws IOException { + value.writeTo(this); + } + + /** + * Write a group represented by an {@link UnknownFieldSet}. + * + * @deprecated UnknownFieldSet now implements MessageLite, so you can just + * call {@link #writeGroupNoTag}. + */ + @Deprecated + public void writeUnknownGroupNoTag(final MessageLite value) + throws IOException { + writeGroupNoTag(value); + } + + /** Write an embedded message field to the stream. */ + public void writeMessageNoTag(final MessageLite value) throws IOException { + writeRawVarint32(value.getSerializedSize()); + value.writeTo(this); + } + + /** Write a {@code bytes} field to the stream. */ + public void writeBytesNoTag(final ByteString value) throws IOException { + writeRawVarint32(value.size()); + writeRawBytes(value); + } + + /** Write a {@code uint32} field to the stream. */ + public void writeUInt32NoTag(final int value) throws IOException { + writeRawVarint32(value); + } + + /** + * Write an enum field to the stream. Caller is responsible + * for converting the enum value to its numeric value. + */ + public void writeEnumNoTag(final int value) throws IOException { + writeInt32NoTag(value); + } + + /** Write an {@code sfixed32} field to the stream. */ + public void writeSFixed32NoTag(final int value) throws IOException { + writeRawLittleEndian32(value); + } + + /** Write an {@code sfixed64} field to the stream. */ + public void writeSFixed64NoTag(final long value) throws IOException { + writeRawLittleEndian64(value); + } + + /** Write an {@code sint32} field to the stream. */ + public void writeSInt32NoTag(final int value) throws IOException { + writeRawVarint32(encodeZigZag32(value)); + } + + /** Write an {@code sint64} field to the stream. */ + public void writeSInt64NoTag(final long value) throws IOException { + writeRawVarint64(encodeZigZag64(value)); + } + + // ================================================================= + + /** + * Compute the number of bytes that would be needed to encode a + * {@code double} field, including tag. + */ + public static int computeDoubleSize(final int fieldNumber, + final double value) { + return computeTagSize(fieldNumber) + computeDoubleSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code float} field, including tag. + */ + public static int computeFloatSize(final int fieldNumber, final float value) { + return computeTagSize(fieldNumber) + computeFloatSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code uint64} field, including tag. + */ + public static int computeUInt64Size(final int fieldNumber, final long value) { + return computeTagSize(fieldNumber) + computeUInt64SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code int64} field, including tag. + */ + public static int computeInt64Size(final int fieldNumber, final long value) { + return computeTagSize(fieldNumber) + computeInt64SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code int32} field, including tag. + */ + public static int computeInt32Size(final int fieldNumber, final int value) { + return computeTagSize(fieldNumber) + computeInt32SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code fixed64} field, including tag. + */ + public static int computeFixed64Size(final int fieldNumber, + final long value) { + return computeTagSize(fieldNumber) + computeFixed64SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code fixed32} field, including tag. + */ + public static int computeFixed32Size(final int fieldNumber, + final int value) { + return computeTagSize(fieldNumber) + computeFixed32SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code bool} field, including tag. + */ + public static int computeBoolSize(final int fieldNumber, + final boolean value) { + return computeTagSize(fieldNumber) + computeBoolSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code string} field, including tag. + */ + public static int computeStringSize(final int fieldNumber, + final String value) { + return computeTagSize(fieldNumber) + computeStringSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code group} field, including tag. + */ + public static int computeGroupSize(final int fieldNumber, + final MessageLite value) { + return computeTagSize(fieldNumber) * 2 + computeGroupSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code group} field represented by an {@code UnknownFieldSet}, including + * tag. + * + * @deprecated UnknownFieldSet now implements MessageLite, so you can just + * call {@link #computeGroupSize}. + */ + @Deprecated + public static int computeUnknownGroupSize(final int fieldNumber, + final MessageLite value) { + return computeGroupSize(fieldNumber, value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * embedded message field, including tag. + */ + public static int computeMessageSize(final int fieldNumber, + final MessageLite value) { + return computeTagSize(fieldNumber) + computeMessageSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code bytes} field, including tag. + */ + public static int computeBytesSize(final int fieldNumber, + final ByteString value) { + return computeTagSize(fieldNumber) + computeBytesSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code uint32} field, including tag. + */ + public static int computeUInt32Size(final int fieldNumber, final int value) { + return computeTagSize(fieldNumber) + computeUInt32SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * enum field, including tag. Caller is responsible for converting the + * enum value to its numeric value. + */ + public static int computeEnumSize(final int fieldNumber, final int value) { + return computeTagSize(fieldNumber) + computeEnumSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sfixed32} field, including tag. + */ + public static int computeSFixed32Size(final int fieldNumber, + final int value) { + return computeTagSize(fieldNumber) + computeSFixed32SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sfixed64} field, including tag. + */ + public static int computeSFixed64Size(final int fieldNumber, + final long value) { + return computeTagSize(fieldNumber) + computeSFixed64SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sint32} field, including tag. + */ + public static int computeSInt32Size(final int fieldNumber, final int value) { + return computeTagSize(fieldNumber) + computeSInt32SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sint64} field, including tag. + */ + public static int computeSInt64Size(final int fieldNumber, final long value) { + return computeTagSize(fieldNumber) + computeSInt64SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * MessageSet extension to the stream. For historical reasons, + * the wire format differs from normal fields. + */ + public static int computeMessageSetExtensionSize( + final int fieldNumber, final MessageLite value) { + return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 + + computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) + + computeMessageSize(WireFormat.MESSAGE_SET_MESSAGE, value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * unparsed MessageSet extension field to the stream. For + * historical reasons, the wire format differs from normal fields. + */ + public static int computeRawMessageSetExtensionSize( + final int fieldNumber, final ByteString value) { + return computeTagSize(WireFormat.MESSAGE_SET_ITEM) * 2 + + computeUInt32Size(WireFormat.MESSAGE_SET_TYPE_ID, fieldNumber) + + computeBytesSize(WireFormat.MESSAGE_SET_MESSAGE, value); + } + + // ----------------------------------------------------------------- + + /** + * Compute the number of bytes that would be needed to encode a + * {@code double} field, including tag. + */ + public static int computeDoubleSizeNoTag(final double value) { + return LITTLE_ENDIAN_64_SIZE; + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code float} field, including tag. + */ + public static int computeFloatSizeNoTag(final float value) { + return LITTLE_ENDIAN_32_SIZE; + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code uint64} field, including tag. + */ + public static int computeUInt64SizeNoTag(final long value) { + return computeRawVarint64Size(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code int64} field, including tag. + */ + public static int computeInt64SizeNoTag(final long value) { + return computeRawVarint64Size(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code int32} field, including tag. + */ + public static int computeInt32SizeNoTag(final int value) { + if (value >= 0) { + return computeRawVarint32Size(value); + } else { + // Must sign-extend. + return 10; + } + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code fixed64} field. + */ + public static int computeFixed64SizeNoTag(final long value) { + return LITTLE_ENDIAN_64_SIZE; + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code fixed32} field. + */ + public static int computeFixed32SizeNoTag(final int value) { + return LITTLE_ENDIAN_32_SIZE; + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code bool} field. + */ + public static int computeBoolSizeNoTag(final boolean value) { + return 1; + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code string} field. + */ + public static int computeStringSizeNoTag(final String value) { + try { + final byte[] bytes = value.getBytes("UTF-8"); + return computeRawVarint32Size(bytes.length) + + bytes.length; + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("UTF-8 not supported.", e); + } + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code group} field. + */ + public static int computeGroupSizeNoTag(final MessageLite value) { + return value.getSerializedSize(); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code group} field represented by an {@code UnknownFieldSet}, including + * tag. + * + * @deprecated UnknownFieldSet now implements MessageLite, so you can just + * call {@link #computeUnknownGroupSizeNoTag}. + */ + @Deprecated + public static int computeUnknownGroupSizeNoTag(final MessageLite value) { + return computeGroupSizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an embedded + * message field. + */ + public static int computeMessageSizeNoTag(final MessageLite value) { + final int size = value.getSerializedSize(); + return computeRawVarint32Size(size) + size; + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code bytes} field. + */ + public static int computeBytesSizeNoTag(final ByteString value) { + return computeRawVarint32Size(value.size()) + + value.size(); + } + + /** + * Compute the number of bytes that would be needed to encode a + * {@code uint32} field. + */ + public static int computeUInt32SizeNoTag(final int value) { + return computeRawVarint32Size(value); + } + + /** + * Compute the number of bytes that would be needed to encode an enum field. + * Caller is responsible for converting the enum value to its numeric value. + */ + public static int computeEnumSizeNoTag(final int value) { + return computeInt32SizeNoTag(value); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sfixed32} field. + */ + public static int computeSFixed32SizeNoTag(final int value) { + return LITTLE_ENDIAN_32_SIZE; + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sfixed64} field. + */ + public static int computeSFixed64SizeNoTag(final long value) { + return LITTLE_ENDIAN_64_SIZE; + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sint32} field. + */ + public static int computeSInt32SizeNoTag(final int value) { + return computeRawVarint32Size(encodeZigZag32(value)); + } + + /** + * Compute the number of bytes that would be needed to encode an + * {@code sint64} field. + */ + public static int computeSInt64SizeNoTag(final long value) { + return computeRawVarint64Size(encodeZigZag64(value)); + } + + // ================================================================= + + /** + * Internal helper that writes the current buffer to the output. The + * buffer position is reset to its initial value when this returns. + */ + private void refreshBuffer() throws IOException { + if (output == null) { + // We're writing to a single buffer. + throw new OutOfSpaceException(); + } + + // Since we have an output stream, this is our buffer + // and buffer offset == 0 + output.write(buffer, 0, position); + position = 0; + } + + /** + * Flushes the stream and forces any buffered bytes to be written. This + * does not flush the underlying OutputStream. + */ + public void flush() throws IOException { + if (output != null) { + refreshBuffer(); + } + } + + /** + * If writing to a flat array, return the space left in the array. + * Otherwise, throws {@code UnsupportedOperationException}. + */ + public int spaceLeft() { + if (output == null) { + return limit - position; + } else { + throw new UnsupportedOperationException( + "spaceLeft() can only be called on CodedOutputStreams that are " + + "writing to a flat array."); + } + } + + /** + * Verifies that {@link #spaceLeft()} returns zero. It's common to create + * a byte array that is exactly big enough to hold a message, then write to + * it with a {@code CodedOutputStream}. Calling {@code checkNoSpaceLeft()} + * after writing verifies that the message was actually as big as expected, + * which can help catch bugs. + */ + public void checkNoSpaceLeft() { + if (spaceLeft() != 0) { + throw new IllegalStateException( + "Did not write as much data as expected."); + } + } + + /** + * If you create a CodedOutputStream around a simple flat array, you must + * not attempt to write more bytes than the array has space. Otherwise, + * this exception will be thrown. + */ + public static class OutOfSpaceException extends IOException { + private static final long serialVersionUID = -6947486886997889499L; + + OutOfSpaceException() { + super("CodedOutputStream was writing to a flat byte array and ran " + + "out of space."); + } + } + + /** Write a single byte. */ + public void writeRawByte(final byte value) throws IOException { + if (position == limit) { + refreshBuffer(); + } + + buffer[position++] = value; + } + + /** Write a single byte, represented by an integer value. */ + public void writeRawByte(final int value) throws IOException { + writeRawByte((byte) value); + } + + /** Write a byte string. */ + public void writeRawBytes(final ByteString value) throws IOException { + writeRawBytes(value, 0, value.size()); + } + + /** Write an array of bytes. */ + public void writeRawBytes(final byte[] value) throws IOException { + writeRawBytes(value, 0, value.length); + } + + /** Write part of an array of bytes. */ + public void writeRawBytes(final byte[] value, int offset, int length) + throws IOException { + if (limit - position >= length) { + // We have room in the current buffer. + System.arraycopy(value, offset, buffer, position, length); + position += length; + } else { + // Write extends past current buffer. Fill the rest of this buffer and + // flush. + final int bytesWritten = limit - position; + System.arraycopy(value, offset, buffer, position, bytesWritten); + offset += bytesWritten; + length -= bytesWritten; + position = limit; + refreshBuffer(); + + // Now deal with the rest. + // Since we have an output stream, this is our buffer + // and buffer offset == 0 + if (length <= limit) { + // Fits in new buffer. + System.arraycopy(value, offset, buffer, 0, length); + position = length; + } else { + // Write is very big. Let's do it all at once. + output.write(value, offset, length); + } + } + } + + /** Write part of a byte string. */ + public void writeRawBytes(final ByteString value, int offset, int length) + throws IOException { + if (limit - position >= length) { + // We have room in the current buffer. + value.copyTo(buffer, offset, position, length); + position += length; + } else { + // Write extends past current buffer. Fill the rest of this buffer and + // flush. + final int bytesWritten = limit - position; + value.copyTo(buffer, offset, position, bytesWritten); + offset += bytesWritten; + length -= bytesWritten; + position = limit; + refreshBuffer(); + + // Now deal with the rest. + // Since we have an output stream, this is our buffer + // and buffer offset == 0 + if (length <= limit) { + // Fits in new buffer. + value.copyTo(buffer, offset, 0, length); + position = length; + } else { + // Write is very big, but we can't do it all at once without allocating + // an a copy of the byte array since ByteString does not give us access + // to the underlying bytes. Use the InputStream interface on the + // ByteString and our buffer to copy between the two. + InputStream inputStreamFrom = value.newInput(); + if (offset != inputStreamFrom.skip(offset)) { + throw new IllegalStateException("Skip failed? Should never happen."); + } + // Use the buffer as the temporary buffer to avoid allocating memory. + while (length > 0) { + int bytesToRead = Math.min(length, limit); + int bytesRead = inputStreamFrom.read(buffer, 0, bytesToRead); + if (bytesRead != bytesToRead) { + throw new IllegalStateException("Read failed? Should never happen"); + } + output.write(buffer, 0, bytesRead); + length -= bytesRead; + } + } + } + } + + /** Encode and write a tag. */ + public void writeTag(final int fieldNumber, final int wireType) + throws IOException { + writeRawVarint32(WireFormat.makeTag(fieldNumber, wireType)); + } + + /** Compute the number of bytes that would be needed to encode a tag. */ + public static int computeTagSize(final int fieldNumber) { + return computeRawVarint32Size(WireFormat.makeTag(fieldNumber, 0)); + } + + /** + * Encode and write a varint. {@code value} is treated as + * unsigned, so it won't be sign-extended if negative. + */ + public void writeRawVarint32(int value) throws IOException { + while (true) { + if ((value & ~0x7F) == 0) { + writeRawByte(value); + return; + } else { + writeRawByte((value & 0x7F) | 0x80); + value >>>= 7; + } + } + } + + /** + * Compute the number of bytes that would be needed to encode a varint. + * {@code value} is treated as unsigned, so it won't be sign-extended if + * negative. + */ + public static int computeRawVarint32Size(final int value) { + if ((value & (0xffffffff << 7)) == 0) return 1; + if ((value & (0xffffffff << 14)) == 0) return 2; + if ((value & (0xffffffff << 21)) == 0) return 3; + if ((value & (0xffffffff << 28)) == 0) return 4; + return 5; + } + + /** Encode and write a varint. */ + public void writeRawVarint64(long value) throws IOException { + while (true) { + if ((value & ~0x7FL) == 0) { + writeRawByte((int)value); + return; + } else { + writeRawByte(((int)value & 0x7F) | 0x80); + value >>>= 7; + } + } + } + + /** Compute the number of bytes that would be needed to encode a varint. */ + public static int computeRawVarint64Size(final long value) { + if ((value & (0xffffffffffffffffL << 7)) == 0) return 1; + if ((value & (0xffffffffffffffffL << 14)) == 0) return 2; + if ((value & (0xffffffffffffffffL << 21)) == 0) return 3; + if ((value & (0xffffffffffffffffL << 28)) == 0) return 4; + if ((value & (0xffffffffffffffffL << 35)) == 0) return 5; + if ((value & (0xffffffffffffffffL << 42)) == 0) return 6; + if ((value & (0xffffffffffffffffL << 49)) == 0) return 7; + if ((value & (0xffffffffffffffffL << 56)) == 0) return 8; + if ((value & (0xffffffffffffffffL << 63)) == 0) return 9; + return 10; + } + + /** Write a little-endian 32-bit integer. */ + public void writeRawLittleEndian32(final int value) throws IOException { + writeRawByte((value ) & 0xFF); + writeRawByte((value >> 8) & 0xFF); + writeRawByte((value >> 16) & 0xFF); + writeRawByte((value >> 24) & 0xFF); + } + + public static final int LITTLE_ENDIAN_32_SIZE = 4; + + /** Write a little-endian 64-bit integer. */ + public void writeRawLittleEndian64(final long value) throws IOException { + writeRawByte((int)(value ) & 0xFF); + writeRawByte((int)(value >> 8) & 0xFF); + writeRawByte((int)(value >> 16) & 0xFF); + writeRawByte((int)(value >> 24) & 0xFF); + writeRawByte((int)(value >> 32) & 0xFF); + writeRawByte((int)(value >> 40) & 0xFF); + writeRawByte((int)(value >> 48) & 0xFF); + writeRawByte((int)(value >> 56) & 0xFF); + } + + public static final int LITTLE_ENDIAN_64_SIZE = 8; + + /** + * Encode a ZigZag-encoded 32-bit value. ZigZag encodes signed integers + * into values that can be efficiently encoded with varint. (Otherwise, + * negative values must be sign-extended to 64 bits to be varint encoded, + * thus always taking 10 bytes on the wire.) + * + * @param n A signed 32-bit integer. + * @return An unsigned 32-bit integer, stored in a signed int because + * Java has no explicit unsigned support. + */ + public static int encodeZigZag32(final int n) { + // Note: the right-shift must be arithmetic + return (n << 1) ^ (n >> 31); + } + + /** + * Encode a ZigZag-encoded 64-bit value. ZigZag encodes signed integers + * into values that can be efficiently encoded with varint. (Otherwise, + * negative values must be sign-extended to 64 bits to be varint encoded, + * thus always taking 10 bytes on the wire.) + * + * @param n A signed 64-bit integer. + * @return An unsigned 64-bit integer, stored in a signed int because + * Java has no explicit unsigned support. + */ + public static long encodeZigZag64(final long n) { + // Note: the right-shift must be arithmetic + return (n << 1) ^ (n >> 63); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java new file mode 100644 index 000000000..2ee845947 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java @@ -0,0 +1,1887 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.DescriptorProtos.*; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.io.UnsupportedEncodingException; + +/** + * Contains a collection of classes which describe protocol message types. + * + * Every message type has a {@link Descriptor}, which lists all + * its fields and other information about a type. You can get a message + * type's descriptor by calling {@code MessageType.getDescriptor()}, or + * (given a message object of the type) {@code message.getDescriptorForType()}. + * Furthermore, each message is associated with a {@link FileDescriptor} for + * a relevant {@code .proto} file. You can obtain it by calling + * {@code Descriptor.getFile()}. A {@link FileDescriptor} contains descriptors + * for all the messages defined in that file, and file descriptors for all the + * imported {@code .proto} files. + * + * Descriptors are built from DescriptorProtos, as defined in + * {@code google/protobuf/descriptor.proto}. + * + * @author kenton@google.com Kenton Varda + */ +public final class Descriptors { + /** + * Describes a {@code .proto} file, including everything defined within. + * That includes, in particular, descriptors for all the messages and + * file descriptors for all other imported {@code .proto} files + * (dependencies). + */ + public static final class FileDescriptor { + /** Convert the descriptor to its protocol message representation. */ + public FileDescriptorProto toProto() { return proto; } + + /** Get the file name. */ + public String getName() { return proto.getName(); } + + /** + * Get the proto package name. This is the package name given by the + * {@code package} statement in the {@code .proto} file, which differs + * from the Java package. + */ + public String getPackage() { return proto.getPackage(); } + + /** Get the {@code FileOptions}, defined in {@code descriptor.proto}. */ + public FileOptions getOptions() { return proto.getOptions(); } + + /** Get a list of top-level message types declared in this file. */ + public List getMessageTypes() { + return Collections.unmodifiableList(Arrays.asList(messageTypes)); + } + + /** Get a list of top-level enum types declared in this file. */ + public List getEnumTypes() { + return Collections.unmodifiableList(Arrays.asList(enumTypes)); + } + + /** Get a list of top-level services declared in this file. */ + public List getServices() { + return Collections.unmodifiableList(Arrays.asList(services)); + } + + /** Get a list of top-level extensions declared in this file. */ + public List getExtensions() { + return Collections.unmodifiableList(Arrays.asList(extensions)); + } + + /** Get a list of this file's dependencies (imports). */ + public List getDependencies() { + return Collections.unmodifiableList(Arrays.asList(dependencies)); + } + + /** + * Find a message type in the file by name. Does not find nested types. + * + * @param name The unqualified type name to look for. + * @return The message type's descriptor, or {@code null} if not found. + */ + public Descriptor findMessageTypeByName(String name) { + // Don't allow looking up nested types. This will make optimization + // easier later. + if (name.indexOf('.') != -1) { + return null; + } + if (getPackage().length() > 0) { + name = getPackage() + '.' + name; + } + final GenericDescriptor result = pool.findSymbol(name); + if (result != null && result instanceof Descriptor && + result.getFile() == this) { + return (Descriptor)result; + } else { + return null; + } + } + + /** + * Find an enum type in the file by name. Does not find nested types. + * + * @param name The unqualified type name to look for. + * @return The enum type's descriptor, or {@code null} if not found. + */ + public EnumDescriptor findEnumTypeByName(String name) { + // Don't allow looking up nested types. This will make optimization + // easier later. + if (name.indexOf('.') != -1) { + return null; + } + if (getPackage().length() > 0) { + name = getPackage() + '.' + name; + } + final GenericDescriptor result = pool.findSymbol(name); + if (result != null && result instanceof EnumDescriptor && + result.getFile() == this) { + return (EnumDescriptor)result; + } else { + return null; + } + } + + /** + * Find a service type in the file by name. + * + * @param name The unqualified type name to look for. + * @return The service type's descriptor, or {@code null} if not found. + */ + public ServiceDescriptor findServiceByName(String name) { + // Don't allow looking up nested types. This will make optimization + // easier later. + if (name.indexOf('.') != -1) { + return null; + } + if (getPackage().length() > 0) { + name = getPackage() + '.' + name; + } + final GenericDescriptor result = pool.findSymbol(name); + if (result != null && result instanceof ServiceDescriptor && + result.getFile() == this) { + return (ServiceDescriptor)result; + } else { + return null; + } + } + + /** + * Find an extension in the file by name. Does not find extensions nested + * inside message types. + * + * @param name The unqualified extension name to look for. + * @return The extension's descriptor, or {@code null} if not found. + */ + public FieldDescriptor findExtensionByName(String name) { + if (name.indexOf('.') != -1) { + return null; + } + if (getPackage().length() > 0) { + name = getPackage() + '.' + name; + } + final GenericDescriptor result = pool.findSymbol(name); + if (result != null && result instanceof FieldDescriptor && + result.getFile() == this) { + return (FieldDescriptor)result; + } else { + return null; + } + } + + /** + * Construct a {@code FileDescriptor}. + * + * @param proto The protocol message form of the FileDescriptor. + * @param dependencies {@code FileDescriptor}s corresponding to all of + * the file's dependencies, in the exact order listed + * in {@code proto}. + * @throws DescriptorValidationException {@code proto} is not a valid + * descriptor. This can occur for a number of reasons, e.g. + * because a field has an undefined type or because two messages + * were defined with the same name. + */ + public static FileDescriptor buildFrom(final FileDescriptorProto proto, + final FileDescriptor[] dependencies) + throws DescriptorValidationException { + // Building decsriptors involves two steps: translating and linking. + // In the translation step (implemented by FileDescriptor's + // constructor), we build an object tree mirroring the + // FileDescriptorProto's tree and put all of the descriptors into the + // DescriptorPool's lookup tables. In the linking step, we look up all + // type references in the DescriptorPool, so that, for example, a + // FieldDescriptor for an embedded message contains a pointer directly + // to the Descriptor for that message's type. We also detect undefined + // types in the linking step. + final DescriptorPool pool = new DescriptorPool(dependencies); + final FileDescriptor result = + new FileDescriptor(proto, dependencies, pool); + + if (dependencies.length != proto.getDependencyCount()) { + throw new DescriptorValidationException(result, + "Dependencies passed to FileDescriptor.buildFrom() don't match " + + "those listed in the FileDescriptorProto."); + } + for (int i = 0; i < proto.getDependencyCount(); i++) { + if (!dependencies[i].getName().equals(proto.getDependency(i))) { + throw new DescriptorValidationException(result, + "Dependencies passed to FileDescriptor.buildFrom() don't match " + + "those listed in the FileDescriptorProto."); + } + } + + result.crossLink(); + return result; + } + + /** + * This method is to be called by generated code only. It is equivalent + * to {@code buildFrom} except that the {@code FileDescriptorProto} is + * encoded in protocol buffer wire format. + */ + public static void internalBuildGeneratedFileFrom( + final String[] descriptorDataParts, + final FileDescriptor[] dependencies, + final InternalDescriptorAssigner descriptorAssigner) { + // Hack: We can't embed a raw byte array inside generated Java code + // (at least, not efficiently), but we can embed Strings. So, the + // protocol compiler embeds the FileDescriptorProto as a giant + // string literal which is passed to this function to construct the + // file's FileDescriptor. The string literal contains only 8-bit + // characters, each one representing a byte of the FileDescriptorProto's + // serialized form. So, if we convert it to bytes in ISO-8859-1, we + // should get the original bytes that we want. + + // descriptorData may contain multiple strings in order to get around the + // Java 64k string literal limit. + StringBuilder descriptorData = new StringBuilder(); + for (String part : descriptorDataParts) { + descriptorData.append(part); + } + + final byte[] descriptorBytes; + try { + descriptorBytes = descriptorData.toString().getBytes("ISO-8859-1"); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException( + "Standard encoding ISO-8859-1 not supported by JVM.", e); + } + + FileDescriptorProto proto; + try { + proto = FileDescriptorProto.parseFrom(descriptorBytes); + } catch (InvalidProtocolBufferException e) { + throw new IllegalArgumentException( + "Failed to parse protocol buffer descriptor for generated code.", e); + } + + final FileDescriptor result; + try { + result = buildFrom(proto, dependencies); + } catch (DescriptorValidationException e) { + throw new IllegalArgumentException( + "Invalid embedded descriptor for \"" + proto.getName() + "\".", e); + } + + final ExtensionRegistry registry = + descriptorAssigner.assignDescriptors(result); + + if (registry != null) { + // We must re-parse the proto using the registry. + try { + proto = FileDescriptorProto.parseFrom(descriptorBytes, registry); + } catch (InvalidProtocolBufferException e) { + throw new IllegalArgumentException( + "Failed to parse protocol buffer descriptor for generated code.", + e); + } + + result.setProto(proto); + } + } + + /** + * This class should be used by generated code only. When calling + * {@link FileDescriptor#internalBuildGeneratedFileFrom}, the caller + * provides a callback implementing this interface. The callback is called + * after the FileDescriptor has been constructed, in order to assign all + * the global variales defined in the generated code which point at parts + * of the FileDescriptor. The callback returns an ExtensionRegistry which + * contains any extensions which might be used in the descriptor -- that + * is, extensions of the various "Options" messages defined in + * descriptor.proto. The callback may also return null to indicate that + * no extensions are used in the decsriptor. + */ + public interface InternalDescriptorAssigner { + ExtensionRegistry assignDescriptors(FileDescriptor root); + } + + private FileDescriptorProto proto; + private final Descriptor[] messageTypes; + private final EnumDescriptor[] enumTypes; + private final ServiceDescriptor[] services; + private final FieldDescriptor[] extensions; + private final FileDescriptor[] dependencies; + private final DescriptorPool pool; + + private FileDescriptor(final FileDescriptorProto proto, + final FileDescriptor[] dependencies, + final DescriptorPool pool) + throws DescriptorValidationException { + this.pool = pool; + this.proto = proto; + this.dependencies = dependencies.clone(); + + pool.addPackage(getPackage(), this); + + messageTypes = new Descriptor[proto.getMessageTypeCount()]; + for (int i = 0; i < proto.getMessageTypeCount(); i++) { + messageTypes[i] = + new Descriptor(proto.getMessageType(i), this, null, i); + } + + enumTypes = new EnumDescriptor[proto.getEnumTypeCount()]; + for (int i = 0; i < proto.getEnumTypeCount(); i++) { + enumTypes[i] = new EnumDescriptor(proto.getEnumType(i), this, null, i); + } + + services = new ServiceDescriptor[proto.getServiceCount()]; + for (int i = 0; i < proto.getServiceCount(); i++) { + services[i] = new ServiceDescriptor(proto.getService(i), this, i); + } + + extensions = new FieldDescriptor[proto.getExtensionCount()]; + for (int i = 0; i < proto.getExtensionCount(); i++) { + extensions[i] = new FieldDescriptor( + proto.getExtension(i), this, null, i, true); + } + } + + /** Look up and cross-link all field types, etc. */ + private void crossLink() throws DescriptorValidationException { + for (final Descriptor messageType : messageTypes) { + messageType.crossLink(); + } + + for (final ServiceDescriptor service : services) { + service.crossLink(); + } + + for (final FieldDescriptor extension : extensions) { + extension.crossLink(); + } + } + + /** + * Replace our {@link FileDescriptorProto} with the given one, which is + * identical except that it might contain extensions that weren't present + * in the original. This method is needed for bootstrapping when a file + * defines custom options. The options may be defined in the file itself, + * so we can't actually parse them until we've constructed the descriptors, + * but to construct the decsriptors we have to have parsed the descriptor + * protos. So, we have to parse the descriptor protos a second time after + * constructing the descriptors. + */ + private void setProto(final FileDescriptorProto proto) { + this.proto = proto; + + for (int i = 0; i < messageTypes.length; i++) { + messageTypes[i].setProto(proto.getMessageType(i)); + } + + for (int i = 0; i < enumTypes.length; i++) { + enumTypes[i].setProto(proto.getEnumType(i)); + } + + for (int i = 0; i < services.length; i++) { + services[i].setProto(proto.getService(i)); + } + + for (int i = 0; i < extensions.length; i++) { + extensions[i].setProto(proto.getExtension(i)); + } + } + } + + // ================================================================= + + /** Describes a message type. */ + public static final class Descriptor implements GenericDescriptor { + /** + * Get the index of this descriptor within its parent. In other words, + * given a {@link FileDescriptor} {@code file}, the following is true: + *

+     *   for all i in [0, file.getMessageTypeCount()):
+     *     file.getMessageType(i).getIndex() == i
+     * 
+ * Similarly, for a {@link Descriptor} {@code messageType}: + *
+     *   for all i in [0, messageType.getNestedTypeCount()):
+     *     messageType.getNestedType(i).getIndex() == i
+     * 
+ */ + public int getIndex() { return index; } + + /** Convert the descriptor to its protocol message representation. */ + public DescriptorProto toProto() { return proto; } + + /** Get the type's unqualified name. */ + public String getName() { return proto.getName(); } + + /** + * Get the type's fully-qualified name, within the proto language's + * namespace. This differs from the Java name. For example, given this + * {@code .proto}: + *
+     *   package foo.bar;
+     *   option java_package = "com.example.protos"
+     *   message Baz {}
+     * 
+ * {@code Baz}'s full name is "foo.bar.Baz". + */ + public String getFullName() { return fullName; } + + /** Get the {@link FileDescriptor} containing this descriptor. */ + public FileDescriptor getFile() { return file; } + + /** If this is a nested type, get the outer descriptor, otherwise null. */ + public Descriptor getContainingType() { return containingType; } + + /** Get the {@code MessageOptions}, defined in {@code descriptor.proto}. */ + public MessageOptions getOptions() { return proto.getOptions(); } + + /** Get a list of this message type's fields. */ + public List getFields() { + return Collections.unmodifiableList(Arrays.asList(fields)); + } + + /** Get a list of this message type's extensions. */ + public List getExtensions() { + return Collections.unmodifiableList(Arrays.asList(extensions)); + } + + /** Get a list of message types nested within this one. */ + public List getNestedTypes() { + return Collections.unmodifiableList(Arrays.asList(nestedTypes)); + } + + /** Get a list of enum types nested within this one. */ + public List getEnumTypes() { + return Collections.unmodifiableList(Arrays.asList(enumTypes)); + } + + /** Determines if the given field number is an extension. */ + public boolean isExtensionNumber(final int number) { + for (final DescriptorProto.ExtensionRange range : + proto.getExtensionRangeList()) { + if (range.getStart() <= number && number < range.getEnd()) { + return true; + } + } + return false; + } + + /** + * Finds a field by name. + * @param name The unqualified name of the field (e.g. "foo"). + * @return The field's descriptor, or {@code null} if not found. + */ + public FieldDescriptor findFieldByName(final String name) { + final GenericDescriptor result = + file.pool.findSymbol(fullName + '.' + name); + if (result != null && result instanceof FieldDescriptor) { + return (FieldDescriptor)result; + } else { + return null; + } + } + + /** + * Finds a field by field number. + * @param number The field number within this message type. + * @return The field's descriptor, or {@code null} if not found. + */ + public FieldDescriptor findFieldByNumber(final int number) { + return file.pool.fieldsByNumber.get( + new DescriptorPool.DescriptorIntPair(this, number)); + } + + /** + * Finds a nested message type by name. + * @param name The unqualified name of the nested type (e.g. "Foo"). + * @return The types's descriptor, or {@code null} if not found. + */ + public Descriptor findNestedTypeByName(final String name) { + final GenericDescriptor result = + file.pool.findSymbol(fullName + '.' + name); + if (result != null && result instanceof Descriptor) { + return (Descriptor)result; + } else { + return null; + } + } + + /** + * Finds a nested enum type by name. + * @param name The unqualified name of the nested type (e.g. "Foo"). + * @return The types's descriptor, or {@code null} if not found. + */ + public EnumDescriptor findEnumTypeByName(final String name) { + final GenericDescriptor result = + file.pool.findSymbol(fullName + '.' + name); + if (result != null && result instanceof EnumDescriptor) { + return (EnumDescriptor)result; + } else { + return null; + } + } + + private final int index; + private DescriptorProto proto; + private final String fullName; + private final FileDescriptor file; + private final Descriptor containingType; + private final Descriptor[] nestedTypes; + private final EnumDescriptor[] enumTypes; + private final FieldDescriptor[] fields; + private final FieldDescriptor[] extensions; + + private Descriptor(final DescriptorProto proto, + final FileDescriptor file, + final Descriptor parent, + final int index) + throws DescriptorValidationException { + this.index = index; + this.proto = proto; + fullName = computeFullName(file, parent, proto.getName()); + this.file = file; + containingType = parent; + + nestedTypes = new Descriptor[proto.getNestedTypeCount()]; + for (int i = 0; i < proto.getNestedTypeCount(); i++) { + nestedTypes[i] = new Descriptor( + proto.getNestedType(i), file, this, i); + } + + enumTypes = new EnumDescriptor[proto.getEnumTypeCount()]; + for (int i = 0; i < proto.getEnumTypeCount(); i++) { + enumTypes[i] = new EnumDescriptor( + proto.getEnumType(i), file, this, i); + } + + fields = new FieldDescriptor[proto.getFieldCount()]; + for (int i = 0; i < proto.getFieldCount(); i++) { + fields[i] = new FieldDescriptor( + proto.getField(i), file, this, i, false); + } + + extensions = new FieldDescriptor[proto.getExtensionCount()]; + for (int i = 0; i < proto.getExtensionCount(); i++) { + extensions[i] = new FieldDescriptor( + proto.getExtension(i), file, this, i, true); + } + + file.pool.addSymbol(this); + } + + /** Look up and cross-link all field types, etc. */ + private void crossLink() throws DescriptorValidationException { + for (final Descriptor nestedType : nestedTypes) { + nestedType.crossLink(); + } + + for (final FieldDescriptor field : fields) { + field.crossLink(); + } + + for (final FieldDescriptor extension : extensions) { + extension.crossLink(); + } + } + + /** See {@link FileDescriptor#setProto}. */ + private void setProto(final DescriptorProto proto) { + this.proto = proto; + + for (int i = 0; i < nestedTypes.length; i++) { + nestedTypes[i].setProto(proto.getNestedType(i)); + } + + for (int i = 0; i < enumTypes.length; i++) { + enumTypes[i].setProto(proto.getEnumType(i)); + } + + for (int i = 0; i < fields.length; i++) { + fields[i].setProto(proto.getField(i)); + } + + for (int i = 0; i < extensions.length; i++) { + extensions[i].setProto(proto.getExtension(i)); + } + } + } + + // ================================================================= + + /** Describes a field of a message type. */ + public static final class FieldDescriptor + implements GenericDescriptor, Comparable, + FieldSet.FieldDescriptorLite { + /** + * Get the index of this descriptor within its parent. + * @see Descriptor#getIndex() + */ + public int getIndex() { return index; } + + /** Convert the descriptor to its protocol message representation. */ + public FieldDescriptorProto toProto() { return proto; } + + /** Get the field's unqualified name. */ + public String getName() { return proto.getName(); } + + /** Get the field's number. */ + public int getNumber() { return proto.getNumber(); } + + /** + * Get the field's fully-qualified name. + * @see Descriptor#getFullName() + */ + public String getFullName() { return fullName; } + + /** + * Get the field's java type. This is just for convenience. Every + * {@code FieldDescriptorProto.Type} maps to exactly one Java type. + */ + public JavaType getJavaType() { return type.getJavaType(); } + + /** For internal use only. */ + public WireFormat.JavaType getLiteJavaType() { + return getLiteType().getJavaType(); + } + + /** Get the {@code FileDescriptor} containing this descriptor. */ + public FileDescriptor getFile() { return file; } + + /** Get the field's declared type. */ + public Type getType() { return type; } + + /** For internal use only. */ + public WireFormat.FieldType getLiteType() { + return table[type.ordinal()]; + } + // I'm pretty sure values() constructs a new array every time, since there + // is nothing stopping the caller from mutating the array. Therefore we + // make a static copy here. + private static final WireFormat.FieldType[] table = + WireFormat.FieldType.values(); + + /** Is this field declared required? */ + public boolean isRequired() { + return proto.getLabel() == FieldDescriptorProto.Label.LABEL_REQUIRED; + } + + /** Is this field declared optional? */ + public boolean isOptional() { + return proto.getLabel() == FieldDescriptorProto.Label.LABEL_OPTIONAL; + } + + /** Is this field declared repeated? */ + public boolean isRepeated() { + return proto.getLabel() == FieldDescriptorProto.Label.LABEL_REPEATED; + } + + /** Does this field have the {@code [packed = true]} option? */ + public boolean isPacked() { + return getOptions().getPacked(); + } + + /** Can this field be packed? i.e. is it a repeated primitive field? */ + public boolean isPackable() { + return isRepeated() && getLiteType().isPackable(); + } + + /** Returns true if the field had an explicitly-defined default value. */ + public boolean hasDefaultValue() { return proto.hasDefaultValue(); } + + /** + * Returns the field's default value. Valid for all types except for + * messages and groups. For all other types, the object returned is of + * the same class that would returned by Message.getField(this). + */ + public Object getDefaultValue() { + if (getJavaType() == JavaType.MESSAGE) { + throw new UnsupportedOperationException( + "FieldDescriptor.getDefaultValue() called on an embedded message " + + "field."); + } + return defaultValue; + } + + /** Get the {@code FieldOptions}, defined in {@code descriptor.proto}. */ + public FieldOptions getOptions() { return proto.getOptions(); } + + /** Is this field an extension? */ + public boolean isExtension() { return proto.hasExtendee(); } + + /** + * Get the field's containing type. For extensions, this is the type being + * extended, not the location where the extension was defined. See + * {@link #getExtensionScope()}. + */ + public Descriptor getContainingType() { return containingType; } + + /** + * For extensions defined nested within message types, gets the outer + * type. Not valid for non-extension fields. For example, consider + * this {@code .proto} file: + *
+     *   message Foo {
+     *     extensions 1000 to max;
+     *   }
+     *   extend Foo {
+     *     optional int32 baz = 1234;
+     *   }
+     *   message Bar {
+     *     extend Foo {
+     *       optional int32 qux = 4321;
+     *     }
+     *   }
+     * 
+ * Both {@code baz}'s and {@code qux}'s containing type is {@code Foo}. + * However, {@code baz}'s extension scope is {@code null} while + * {@code qux}'s extension scope is {@code Bar}. + */ + public Descriptor getExtensionScope() { + if (!isExtension()) { + throw new UnsupportedOperationException( + "This field is not an extension."); + } + return extensionScope; + } + + /** For embedded message and group fields, gets the field's type. */ + public Descriptor getMessageType() { + if (getJavaType() != JavaType.MESSAGE) { + throw new UnsupportedOperationException( + "This field is not of message type."); + } + return messageType; + } + + /** For enum fields, gets the field's type. */ + public EnumDescriptor getEnumType() { + if (getJavaType() != JavaType.ENUM) { + throw new UnsupportedOperationException( + "This field is not of enum type."); + } + return enumType; + } + + /** + * Compare with another {@code FieldDescriptor}. This orders fields in + * "canonical" order, which simply means ascending order by field number. + * {@code other} must be a field of the same type -- i.e. + * {@code getContainingType()} must return the same {@code Descriptor} for + * both fields. + * + * @return negative, zero, or positive if {@code this} is less than, + * equal to, or greater than {@code other}, respectively. + */ + public int compareTo(final FieldDescriptor other) { + if (other.containingType != containingType) { + throw new IllegalArgumentException( + "FieldDescriptors can only be compared to other FieldDescriptors " + + "for fields of the same message type."); + } + return getNumber() - other.getNumber(); + } + + private final int index; + + private FieldDescriptorProto proto; + private final String fullName; + private final FileDescriptor file; + private final Descriptor extensionScope; + + // Possibly initialized during cross-linking. + private Type type; + private Descriptor containingType; + private Descriptor messageType; + private EnumDescriptor enumType; + private Object defaultValue; + + public enum Type { + DOUBLE (JavaType.DOUBLE ), + FLOAT (JavaType.FLOAT ), + INT64 (JavaType.LONG ), + UINT64 (JavaType.LONG ), + INT32 (JavaType.INT ), + FIXED64 (JavaType.LONG ), + FIXED32 (JavaType.INT ), + BOOL (JavaType.BOOLEAN ), + STRING (JavaType.STRING ), + GROUP (JavaType.MESSAGE ), + MESSAGE (JavaType.MESSAGE ), + BYTES (JavaType.BYTE_STRING), + UINT32 (JavaType.INT ), + ENUM (JavaType.ENUM ), + SFIXED32(JavaType.INT ), + SFIXED64(JavaType.LONG ), + SINT32 (JavaType.INT ), + SINT64 (JavaType.LONG ); + + Type(final JavaType javaType) { + this.javaType = javaType; + } + + private JavaType javaType; + + public FieldDescriptorProto.Type toProto() { + return FieldDescriptorProto.Type.valueOf(ordinal() + 1); + } + public JavaType getJavaType() { return javaType; } + + public static Type valueOf(final FieldDescriptorProto.Type type) { + return values()[type.getNumber() - 1]; + } + } + + static { + // Refuse to init if someone added a new declared type. + if (Type.values().length != FieldDescriptorProto.Type.values().length) { + throw new RuntimeException( + "descriptor.proto has a new declared type but Desrciptors.java " + + "wasn't updated."); + } + } + + public enum JavaType { + INT(0), + LONG(0L), + FLOAT(0F), + DOUBLE(0D), + BOOLEAN(false), + STRING(""), + BYTE_STRING(ByteString.EMPTY), + ENUM(null), + MESSAGE(null); + + JavaType(final Object defaultDefault) { + this.defaultDefault = defaultDefault; + } + + /** + * The default default value for fields of this type, if it's a primitive + * type. This is meant for use inside this file only, hence is private. + */ + private final Object defaultDefault; + } + + private FieldDescriptor(final FieldDescriptorProto proto, + final FileDescriptor file, + final Descriptor parent, + final int index, + final boolean isExtension) + throws DescriptorValidationException { + this.index = index; + this.proto = proto; + fullName = computeFullName(file, parent, proto.getName()); + this.file = file; + + if (proto.hasType()) { + type = Type.valueOf(proto.getType()); + } + + if (getNumber() <= 0) { + throw new DescriptorValidationException(this, + "Field numbers must be positive integers."); + } + + // Only repeated primitive fields may be packed. + if (proto.getOptions().getPacked() && !isPackable()) { + throw new DescriptorValidationException(this, + "[packed = true] can only be specified for repeated primitive " + + "fields."); + } + + if (isExtension) { + if (!proto.hasExtendee()) { + throw new DescriptorValidationException(this, + "FieldDescriptorProto.extendee not set for extension field."); + } + containingType = null; // Will be filled in when cross-linking + if (parent != null) { + extensionScope = parent; + } else { + extensionScope = null; + } + } else { + if (proto.hasExtendee()) { + throw new DescriptorValidationException(this, + "FieldDescriptorProto.extendee set for non-extension field."); + } + containingType = parent; + extensionScope = null; + } + + file.pool.addSymbol(this); + } + + /** Look up and cross-link all field types, etc. */ + private void crossLink() throws DescriptorValidationException { + if (proto.hasExtendee()) { + final GenericDescriptor extendee = + file.pool.lookupSymbol(proto.getExtendee(), this); + if (!(extendee instanceof Descriptor)) { + throw new DescriptorValidationException(this, + '\"' + proto.getExtendee() + "\" is not a message type."); + } + containingType = (Descriptor)extendee; + + if (!getContainingType().isExtensionNumber(getNumber())) { + throw new DescriptorValidationException(this, + '\"' + getContainingType().getFullName() + + "\" does not declare " + getNumber() + + " as an extension number."); + } + } + + if (proto.hasTypeName()) { + final GenericDescriptor typeDescriptor = + file.pool.lookupSymbol(proto.getTypeName(), this); + + if (!proto.hasType()) { + // Choose field type based on symbol. + if (typeDescriptor instanceof Descriptor) { + type = Type.MESSAGE; + } else if (typeDescriptor instanceof EnumDescriptor) { + type = Type.ENUM; + } else { + throw new DescriptorValidationException(this, + '\"' + proto.getTypeName() + "\" is not a type."); + } + } + + if (getJavaType() == JavaType.MESSAGE) { + if (!(typeDescriptor instanceof Descriptor)) { + throw new DescriptorValidationException(this, + '\"' + proto.getTypeName() + "\" is not a message type."); + } + messageType = (Descriptor)typeDescriptor; + + if (proto.hasDefaultValue()) { + throw new DescriptorValidationException(this, + "Messages can't have default values."); + } + } else if (getJavaType() == JavaType.ENUM) { + if (!(typeDescriptor instanceof EnumDescriptor)) { + throw new DescriptorValidationException(this, + '\"' + proto.getTypeName() + "\" is not an enum type."); + } + enumType = (EnumDescriptor)typeDescriptor; + } else { + throw new DescriptorValidationException(this, + "Field with primitive type has type_name."); + } + } else { + if (getJavaType() == JavaType.MESSAGE || + getJavaType() == JavaType.ENUM) { + throw new DescriptorValidationException(this, + "Field with message or enum type missing type_name."); + } + } + + // We don't attempt to parse the default value until here because for + // enums we need the enum type's descriptor. + if (proto.hasDefaultValue()) { + if (isRepeated()) { + throw new DescriptorValidationException(this, + "Repeated fields cannot have default values."); + } + + try { + switch (getType()) { + case INT32: + case SINT32: + case SFIXED32: + defaultValue = TextFormat.parseInt32(proto.getDefaultValue()); + break; + case UINT32: + case FIXED32: + defaultValue = TextFormat.parseUInt32(proto.getDefaultValue()); + break; + case INT64: + case SINT64: + case SFIXED64: + defaultValue = TextFormat.parseInt64(proto.getDefaultValue()); + break; + case UINT64: + case FIXED64: + defaultValue = TextFormat.parseUInt64(proto.getDefaultValue()); + break; + case FLOAT: + if (proto.getDefaultValue().equals("inf")) { + defaultValue = Float.POSITIVE_INFINITY; + } else if (proto.getDefaultValue().equals("-inf")) { + defaultValue = Float.NEGATIVE_INFINITY; + } else if (proto.getDefaultValue().equals("nan")) { + defaultValue = Float.NaN; + } else { + defaultValue = Float.valueOf(proto.getDefaultValue()); + } + break; + case DOUBLE: + if (proto.getDefaultValue().equals("inf")) { + defaultValue = Double.POSITIVE_INFINITY; + } else if (proto.getDefaultValue().equals("-inf")) { + defaultValue = Double.NEGATIVE_INFINITY; + } else if (proto.getDefaultValue().equals("nan")) { + defaultValue = Double.NaN; + } else { + defaultValue = Double.valueOf(proto.getDefaultValue()); + } + break; + case BOOL: + defaultValue = Boolean.valueOf(proto.getDefaultValue()); + break; + case STRING: + defaultValue = proto.getDefaultValue(); + break; + case BYTES: + try { + defaultValue = + TextFormat.unescapeBytes(proto.getDefaultValue()); + } catch (TextFormat.InvalidEscapeSequenceException e) { + throw new DescriptorValidationException(this, + "Couldn't parse default value: " + e.getMessage(), e); + } + break; + case ENUM: + defaultValue = enumType.findValueByName(proto.getDefaultValue()); + if (defaultValue == null) { + throw new DescriptorValidationException(this, + "Unknown enum default value: \"" + + proto.getDefaultValue() + '\"'); + } + break; + case MESSAGE: + case GROUP: + throw new DescriptorValidationException(this, + "Message type had default value."); + } + } catch (NumberFormatException e) { + throw new DescriptorValidationException(this, + "Could not parse default value: \"" + + proto.getDefaultValue() + '\"', e); + } + } else { + // Determine the default default for this field. + if (isRepeated()) { + defaultValue = Collections.emptyList(); + } else { + switch (getJavaType()) { + case ENUM: + // We guarantee elsewhere that an enum type always has at least + // one possible value. + defaultValue = enumType.getValues().get(0); + break; + case MESSAGE: + defaultValue = null; + break; + default: + defaultValue = getJavaType().defaultDefault; + break; + } + } + } + + if (!isExtension()) { + file.pool.addFieldByNumber(this); + } + + if (containingType != null && + containingType.getOptions().getMessageSetWireFormat()) { + if (isExtension()) { + if (!isOptional() || getType() != Type.MESSAGE) { + throw new DescriptorValidationException(this, + "Extensions of MessageSets must be optional messages."); + } + } else { + throw new DescriptorValidationException(this, + "MessageSets cannot have fields, only extensions."); + } + } + } + + /** See {@link FileDescriptor#setProto}. */ + private void setProto(final FieldDescriptorProto proto) { + this.proto = proto; + } + + /** + * For internal use only. This is to satisfy the FieldDescriptorLite + * interface. + */ + public MessageLite.Builder internalMergeFrom( + MessageLite.Builder to, MessageLite from) { + // FieldDescriptors are only used with non-lite messages so we can just + // down-cast and call mergeFrom directly. + return ((Message.Builder) to).mergeFrom((Message) from); + } + } + + // ================================================================= + + /** Describes an enum type. */ + public static final class EnumDescriptor + implements GenericDescriptor, Internal.EnumLiteMap { + /** + * Get the index of this descriptor within its parent. + * @see Descriptor#getIndex() + */ + public int getIndex() { return index; } + + /** Convert the descriptor to its protocol message representation. */ + public EnumDescriptorProto toProto() { return proto; } + + /** Get the type's unqualified name. */ + public String getName() { return proto.getName(); } + + /** + * Get the type's fully-qualified name. + * @see Descriptor#getFullName() + */ + public String getFullName() { return fullName; } + + /** Get the {@link FileDescriptor} containing this descriptor. */ + public FileDescriptor getFile() { return file; } + + /** If this is a nested type, get the outer descriptor, otherwise null. */ + public Descriptor getContainingType() { return containingType; } + + /** Get the {@code EnumOptions}, defined in {@code descriptor.proto}. */ + public EnumOptions getOptions() { return proto.getOptions(); } + + /** Get a list of defined values for this enum. */ + public List getValues() { + return Collections.unmodifiableList(Arrays.asList(values)); + } + + /** + * Find an enum value by name. + * @param name The unqualified name of the value (e.g. "FOO"). + * @return the value's decsriptor, or {@code null} if not found. + */ + public EnumValueDescriptor findValueByName(final String name) { + final GenericDescriptor result = + file.pool.findSymbol(fullName + '.' + name); + if (result != null && result instanceof EnumValueDescriptor) { + return (EnumValueDescriptor)result; + } else { + return null; + } + } + + /** + * Find an enum value by number. If multiple enum values have the same + * number, this returns the first defined value with that number. + * @param number The value's number. + * @return the value's decsriptor, or {@code null} if not found. + */ + public EnumValueDescriptor findValueByNumber(final int number) { + return file.pool.enumValuesByNumber.get( + new DescriptorPool.DescriptorIntPair(this, number)); + } + + private final int index; + private EnumDescriptorProto proto; + private final String fullName; + private final FileDescriptor file; + private final Descriptor containingType; + private EnumValueDescriptor[] values; + + private EnumDescriptor(final EnumDescriptorProto proto, + final FileDescriptor file, + final Descriptor parent, + final int index) + throws DescriptorValidationException { + this.index = index; + this.proto = proto; + fullName = computeFullName(file, parent, proto.getName()); + this.file = file; + containingType = parent; + + if (proto.getValueCount() == 0) { + // We cannot allow enums with no values because this would mean there + // would be no valid default value for fields of this type. + throw new DescriptorValidationException(this, + "Enums must contain at least one value."); + } + + values = new EnumValueDescriptor[proto.getValueCount()]; + for (int i = 0; i < proto.getValueCount(); i++) { + values[i] = new EnumValueDescriptor( + proto.getValue(i), file, this, i); + } + + file.pool.addSymbol(this); + } + + /** See {@link FileDescriptor#setProto}. */ + private void setProto(final EnumDescriptorProto proto) { + this.proto = proto; + + for (int i = 0; i < values.length; i++) { + values[i].setProto(proto.getValue(i)); + } + } + } + + // ================================================================= + + /** + * Describes one value within an enum type. Note that multiple defined + * values may have the same number. In generated Java code, all values + * with the same number after the first become aliases of the first. + * However, they still have independent EnumValueDescriptors. + */ + public static final class EnumValueDescriptor + implements GenericDescriptor, Internal.EnumLite { + /** + * Get the index of this descriptor within its parent. + * @see Descriptor#getIndex() + */ + public int getIndex() { return index; } + + /** Convert the descriptor to its protocol message representation. */ + public EnumValueDescriptorProto toProto() { return proto; } + + /** Get the value's unqualified name. */ + public String getName() { return proto.getName(); } + + /** Get the value's number. */ + public int getNumber() { return proto.getNumber(); } + + /** + * Get the value's fully-qualified name. + * @see Descriptor#getFullName() + */ + public String getFullName() { return fullName; } + + /** Get the {@link FileDescriptor} containing this descriptor. */ + public FileDescriptor getFile() { return file; } + + /** Get the value's enum type. */ + public EnumDescriptor getType() { return type; } + + /** + * Get the {@code EnumValueOptions}, defined in {@code descriptor.proto}. + */ + public EnumValueOptions getOptions() { return proto.getOptions(); } + + private final int index; + private EnumValueDescriptorProto proto; + private final String fullName; + private final FileDescriptor file; + private final EnumDescriptor type; + + private EnumValueDescriptor(final EnumValueDescriptorProto proto, + final FileDescriptor file, + final EnumDescriptor parent, + final int index) + throws DescriptorValidationException { + this.index = index; + this.proto = proto; + this.file = file; + type = parent; + + fullName = parent.getFullName() + '.' + proto.getName(); + + file.pool.addSymbol(this); + file.pool.addEnumValueByNumber(this); + } + + /** See {@link FileDescriptor#setProto}. */ + private void setProto(final EnumValueDescriptorProto proto) { + this.proto = proto; + } + } + + // ================================================================= + + /** Describes a service type. */ + public static final class ServiceDescriptor implements GenericDescriptor { + /** + * Get the index of this descriptor within its parent. + * * @see Descriptors.Descriptor#getIndex() + */ + public int getIndex() { return index; } + + /** Convert the descriptor to its protocol message representation. */ + public ServiceDescriptorProto toProto() { return proto; } + + /** Get the type's unqualified name. */ + public String getName() { return proto.getName(); } + + /** + * Get the type's fully-qualified name. + * @see Descriptor#getFullName() + */ + public String getFullName() { return fullName; } + + /** Get the {@link FileDescriptor} containing this descriptor. */ + public FileDescriptor getFile() { return file; } + + /** Get the {@code ServiceOptions}, defined in {@code descriptor.proto}. */ + public ServiceOptions getOptions() { return proto.getOptions(); } + + /** Get a list of methods for this service. */ + public List getMethods() { + return Collections.unmodifiableList(Arrays.asList(methods)); + } + + /** + * Find a method by name. + * @param name The unqualified name of the method (e.g. "Foo"). + * @return the method's decsriptor, or {@code null} if not found. + */ + public MethodDescriptor findMethodByName(final String name) { + final GenericDescriptor result = + file.pool.findSymbol(fullName + '.' + name); + if (result != null && result instanceof MethodDescriptor) { + return (MethodDescriptor)result; + } else { + return null; + } + } + + private final int index; + private ServiceDescriptorProto proto; + private final String fullName; + private final FileDescriptor file; + private MethodDescriptor[] methods; + + private ServiceDescriptor(final ServiceDescriptorProto proto, + final FileDescriptor file, + final int index) + throws DescriptorValidationException { + this.index = index; + this.proto = proto; + fullName = computeFullName(file, null, proto.getName()); + this.file = file; + + methods = new MethodDescriptor[proto.getMethodCount()]; + for (int i = 0; i < proto.getMethodCount(); i++) { + methods[i] = new MethodDescriptor( + proto.getMethod(i), file, this, i); + } + + file.pool.addSymbol(this); + } + + private void crossLink() throws DescriptorValidationException { + for (final MethodDescriptor method : methods) { + method.crossLink(); + } + } + + /** See {@link FileDescriptor#setProto}. */ + private void setProto(final ServiceDescriptorProto proto) { + this.proto = proto; + + for (int i = 0; i < methods.length; i++) { + methods[i].setProto(proto.getMethod(i)); + } + } + } + + // ================================================================= + + /** + * Describes one method within a service type. + */ + public static final class MethodDescriptor implements GenericDescriptor { + /** + * Get the index of this descriptor within its parent. + * * @see Descriptors.Descriptor#getIndex() + */ + public int getIndex() { return index; } + + /** Convert the descriptor to its protocol message representation. */ + public MethodDescriptorProto toProto() { return proto; } + + /** Get the method's unqualified name. */ + public String getName() { return proto.getName(); } + + /** + * Get the method's fully-qualified name. + * @see Descriptor#getFullName() + */ + public String getFullName() { return fullName; } + + /** Get the {@link FileDescriptor} containing this descriptor. */ + public FileDescriptor getFile() { return file; } + + /** Get the method's service type. */ + public ServiceDescriptor getService() { return service; } + + /** Get the method's input type. */ + public Descriptor getInputType() { return inputType; } + + /** Get the method's output type. */ + public Descriptor getOutputType() { return outputType; } + + /** + * Get the {@code MethodOptions}, defined in {@code descriptor.proto}. + */ + public MethodOptions getOptions() { return proto.getOptions(); } + + private final int index; + private MethodDescriptorProto proto; + private final String fullName; + private final FileDescriptor file; + private final ServiceDescriptor service; + + // Initialized during cross-linking. + private Descriptor inputType; + private Descriptor outputType; + + private MethodDescriptor(final MethodDescriptorProto proto, + final FileDescriptor file, + final ServiceDescriptor parent, + final int index) + throws DescriptorValidationException { + this.index = index; + this.proto = proto; + this.file = file; + service = parent; + + fullName = parent.getFullName() + '.' + proto.getName(); + + file.pool.addSymbol(this); + } + + private void crossLink() throws DescriptorValidationException { + final GenericDescriptor input = + file.pool.lookupSymbol(proto.getInputType(), this); + if (!(input instanceof Descriptor)) { + throw new DescriptorValidationException(this, + '\"' + proto.getInputType() + "\" is not a message type."); + } + inputType = (Descriptor)input; + + final GenericDescriptor output = + file.pool.lookupSymbol(proto.getOutputType(), this); + if (!(output instanceof Descriptor)) { + throw new DescriptorValidationException(this, + '\"' + proto.getOutputType() + "\" is not a message type."); + } + outputType = (Descriptor)output; + } + + /** See {@link FileDescriptor#setProto}. */ + private void setProto(final MethodDescriptorProto proto) { + this.proto = proto; + } + } + + // ================================================================= + + private static String computeFullName(final FileDescriptor file, + final Descriptor parent, + final String name) { + if (parent != null) { + return parent.getFullName() + '.' + name; + } else if (file.getPackage().length() > 0) { + return file.getPackage() + '.' + name; + } else { + return name; + } + } + + // ================================================================= + + /** + * All descriptors except {@code FileDescriptor} implement this to make + * {@code DescriptorPool}'s life easier. + */ + private interface GenericDescriptor { + Message toProto(); + String getName(); + String getFullName(); + FileDescriptor getFile(); + } + + /** + * Thrown when building descriptors fails because the source DescriptorProtos + * are not valid. + */ + public static class DescriptorValidationException extends Exception { + private static final long serialVersionUID = 5750205775490483148L; + + /** Gets the full name of the descriptor where the error occurred. */ + public String getProblemSymbolName() { return name; } + + /** + * Gets the the protocol message representation of the invalid descriptor. + */ + public Message getProblemProto() { return proto; } + + /** + * Gets a human-readable description of the error. + */ + public String getDescription() { return description; } + + private final String name; + private final Message proto; + private final String description; + + private DescriptorValidationException( + final GenericDescriptor problemDescriptor, + final String description) { + super(problemDescriptor.getFullName() + ": " + description); + + // Note that problemDescriptor may be partially uninitialized, so we + // don't want to expose it directly to the user. So, we only provide + // the name and the original proto. + name = problemDescriptor.getFullName(); + proto = problemDescriptor.toProto(); + this.description = description; + } + + private DescriptorValidationException( + final GenericDescriptor problemDescriptor, + final String description, + final Throwable cause) { + this(problemDescriptor, description); + initCause(cause); + } + + private DescriptorValidationException( + final FileDescriptor problemDescriptor, + final String description) { + super(problemDescriptor.getName() + ": " + description); + + // Note that problemDescriptor may be partially uninitialized, so we + // don't want to expose it directly to the user. So, we only provide + // the name and the original proto. + name = problemDescriptor.getName(); + proto = problemDescriptor.toProto(); + this.description = description; + } + } + + // ================================================================= + + /** + * A private helper class which contains lookup tables containing all the + * descriptors defined in a particular file. + */ + private static final class DescriptorPool { + DescriptorPool(final FileDescriptor[] dependencies) { + this.dependencies = new DescriptorPool[dependencies.length]; + + for (int i = 0; i < dependencies.length; i++) { + this.dependencies[i] = dependencies[i].pool; + } + + for (final FileDescriptor dependency : dependencies) { + try { + addPackage(dependency.getPackage(), dependency); + } catch (DescriptorValidationException e) { + // Can't happen, because addPackage() only fails when the name + // conflicts with a non-package, but we have not yet added any + // non-packages at this point. + assert false; + } + } + } + + private final DescriptorPool[] dependencies; + + private final Map descriptorsByName = + new HashMap(); + private final Map fieldsByNumber = + new HashMap(); + private final Map enumValuesByNumber + = new HashMap(); + + /** Find a generic descriptor by fully-qualified name. */ + GenericDescriptor findSymbol(final String fullName) { + GenericDescriptor result = descriptorsByName.get(fullName); + if (result != null) { + return result; + } + + for (final DescriptorPool dependency : dependencies) { + result = dependency.descriptorsByName.get(fullName); + if (result != null) { + return result; + } + } + + return null; + } + + /** + * Look up a descriptor by name, relative to some other descriptor. + * The name may be fully-qualified (with a leading '.'), + * partially-qualified, or unqualified. C++-like name lookup semantics + * are used to search for the matching descriptor. + */ + GenericDescriptor lookupSymbol(final String name, + final GenericDescriptor relativeTo) + throws DescriptorValidationException { + // TODO(kenton): This could be optimized in a number of ways. + + GenericDescriptor result; + if (name.startsWith(".")) { + // Fully-qualified name. + result = findSymbol(name.substring(1)); + } else { + // If "name" is a compound identifier, we want to search for the + // first component of it, then search within it for the rest. + final int firstPartLength = name.indexOf('.'); + final String firstPart; + if (firstPartLength == -1) { + firstPart = name; + } else { + firstPart = name.substring(0, firstPartLength); + } + + // We will search each parent scope of "relativeTo" looking for the + // symbol. + final StringBuilder scopeToTry = + new StringBuilder(relativeTo.getFullName()); + + while (true) { + // Chop off the last component of the scope. + final int dotpos = scopeToTry.lastIndexOf("."); + if (dotpos == -1) { + result = findSymbol(name); + break; + } else { + scopeToTry.setLength(dotpos + 1); + + // Append firstPart and try to find. + scopeToTry.append(firstPart); + result = findSymbol(scopeToTry.toString()); + + if (result != null) { + if (firstPartLength != -1) { + // We only found the first part of the symbol. Now look for + // the whole thing. If this fails, we *don't* want to keep + // searching parent scopes. + scopeToTry.setLength(dotpos + 1); + scopeToTry.append(name); + result = findSymbol(scopeToTry.toString()); + } + break; + } + + // Not found. Remove the name so we can try again. + scopeToTry.setLength(dotpos); + } + } + } + + if (result == null) { + throw new DescriptorValidationException(relativeTo, + '\"' + name + "\" is not defined."); + } else { + return result; + } + } + + /** + * Adds a symbol to the symbol table. If a symbol with the same name + * already exists, throws an error. + */ + void addSymbol(final GenericDescriptor descriptor) + throws DescriptorValidationException { + validateSymbolName(descriptor); + + final String fullName = descriptor.getFullName(); + final int dotpos = fullName.lastIndexOf('.'); + + final GenericDescriptor old = descriptorsByName.put(fullName, descriptor); + if (old != null) { + descriptorsByName.put(fullName, old); + + if (descriptor.getFile() == old.getFile()) { + if (dotpos == -1) { + throw new DescriptorValidationException(descriptor, + '\"' + fullName + "\" is already defined."); + } else { + throw new DescriptorValidationException(descriptor, + '\"' + fullName.substring(dotpos + 1) + + "\" is already defined in \"" + + fullName.substring(0, dotpos) + "\"."); + } + } else { + throw new DescriptorValidationException(descriptor, + '\"' + fullName + "\" is already defined in file \"" + + old.getFile().getName() + "\"."); + } + } + } + + /** + * Represents a package in the symbol table. We use PackageDescriptors + * just as placeholders so that someone cannot define, say, a message type + * that has the same name as an existing package. + */ + private static final class PackageDescriptor implements GenericDescriptor { + public Message toProto() { return file.toProto(); } + public String getName() { return name; } + public String getFullName() { return fullName; } + public FileDescriptor getFile() { return file; } + + PackageDescriptor(final String name, final String fullName, + final FileDescriptor file) { + this.file = file; + this.fullName = fullName; + this.name = name; + } + + private final String name; + private final String fullName; + private final FileDescriptor file; + } + + /** + * Adds a package to the symbol tables. If a package by the same name + * already exists, that is fine, but if some other kind of symbol exists + * under the same name, an exception is thrown. If the package has + * multiple components, this also adds the parent package(s). + */ + void addPackage(final String fullName, final FileDescriptor file) + throws DescriptorValidationException { + final int dotpos = fullName.lastIndexOf('.'); + final String name; + if (dotpos == -1) { + name = fullName; + } else { + addPackage(fullName.substring(0, dotpos), file); + name = fullName.substring(dotpos + 1); + } + + final GenericDescriptor old = + descriptorsByName.put(fullName, + new PackageDescriptor(name, fullName, file)); + if (old != null) { + descriptorsByName.put(fullName, old); + if (!(old instanceof PackageDescriptor)) { + throw new DescriptorValidationException(file, + '\"' + name + "\" is already defined (as something other than a " + + "package) in file \"" + old.getFile().getName() + "\"."); + } + } + } + + /** A (GenericDescriptor, int) pair, used as a map key. */ + private static final class DescriptorIntPair { + private final GenericDescriptor descriptor; + private final int number; + + DescriptorIntPair(final GenericDescriptor descriptor, final int number) { + this.descriptor = descriptor; + this.number = number; + } + + @Override + public int hashCode() { + return descriptor.hashCode() * ((1 << 16) - 1) + number; + } + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof DescriptorIntPair)) { + return false; + } + final DescriptorIntPair other = (DescriptorIntPair)obj; + return descriptor == other.descriptor && number == other.number; + } + } + + /** + * Adds a field to the fieldsByNumber table. Throws an exception if a + * field with hte same containing type and number already exists. + */ + void addFieldByNumber(final FieldDescriptor field) + throws DescriptorValidationException { + final DescriptorIntPair key = + new DescriptorIntPair(field.getContainingType(), field.getNumber()); + final FieldDescriptor old = fieldsByNumber.put(key, field); + if (old != null) { + fieldsByNumber.put(key, old); + throw new DescriptorValidationException(field, + "Field number " + field.getNumber() + + "has already been used in \"" + + field.getContainingType().getFullName() + + "\" by field \"" + old.getName() + "\"."); + } + } + + /** + * Adds an enum value to the enumValuesByNumber table. If an enum value + * with the same type and number already exists, does nothing. (This is + * allowed; the first value define with the number takes precedence.) + */ + void addEnumValueByNumber(final EnumValueDescriptor value) { + final DescriptorIntPair key = + new DescriptorIntPair(value.getType(), value.getNumber()); + final EnumValueDescriptor old = enumValuesByNumber.put(key, value); + if (old != null) { + enumValuesByNumber.put(key, old); + // Not an error: Multiple enum values may have the same number, but + // we only want the first one in the map. + } + } + + /** + * Verifies that the descriptor's name is valid (i.e. it contains only + * letters, digits, and underscores, and does not start with a digit). + */ + static void validateSymbolName(final GenericDescriptor descriptor) + throws DescriptorValidationException { + final String name = descriptor.getName(); + if (name.length() == 0) { + throw new DescriptorValidationException(descriptor, "Missing name."); + } else { + boolean valid = true; + for (int i = 0; i < name.length(); i++) { + final char c = name.charAt(i); + // Non-ASCII characters are not valid in protobuf identifiers, even + // if they are letters or digits. + if (c >= 128) { + valid = false; + } + // First character must be letter or _. Subsequent characters may + // be letters, numbers, or digits. + if (Character.isLetter(c) || c == '_' || + (Character.isDigit(c) && i > 0)) { + // Valid + } else { + valid = false; + } + } + if (!valid) { + throw new DescriptorValidationException(descriptor, + '\"' + name + "\" is not a valid identifier."); + } + } + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java new file mode 100644 index 000000000..c106b662b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java @@ -0,0 +1,438 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; + +import java.io.InputStream; +import java.io.IOException; +import java.util.Map; + +/** + * An implementation of {@link Message} that can represent arbitrary types, + * given a {@link Descriptors.Descriptor}. + * + * @author kenton@google.com Kenton Varda + */ +public final class DynamicMessage extends AbstractMessage { + private final Descriptor type; + private final FieldSet fields; + private final UnknownFieldSet unknownFields; + private int memoizedSize = -1; + + /** + * Construct a {@code DynamicMessage} using the given {@code FieldSet}. + */ + private DynamicMessage(Descriptor type, FieldSet fields, + UnknownFieldSet unknownFields) { + this.type = type; + this.fields = fields; + this.unknownFields = unknownFields; + } + + /** + * Get a {@code DynamicMessage} representing the default instance of the + * given type. + */ + public static DynamicMessage getDefaultInstance(Descriptor type) { + return new DynamicMessage(type, FieldSet.emptySet(), + UnknownFieldSet.getDefaultInstance()); + } + + /** Parse a message of the given type from the given input stream. */ + public static DynamicMessage parseFrom(Descriptor type, + CodedInputStream input) + throws IOException { + return newBuilder(type).mergeFrom(input).buildParsed(); + } + + /** Parse a message of the given type from the given input stream. */ + public static DynamicMessage parseFrom( + Descriptor type, + CodedInputStream input, + ExtensionRegistry extensionRegistry) + throws IOException { + return newBuilder(type).mergeFrom(input, extensionRegistry).buildParsed(); + } + + /** Parse {@code data} as a message of the given type and return it. */ + public static DynamicMessage parseFrom(Descriptor type, ByteString data) + throws InvalidProtocolBufferException { + return newBuilder(type).mergeFrom(data).buildParsed(); + } + + /** Parse {@code data} as a message of the given type and return it. */ + public static DynamicMessage parseFrom(Descriptor type, ByteString data, + ExtensionRegistry extensionRegistry) + throws InvalidProtocolBufferException { + return newBuilder(type).mergeFrom(data, extensionRegistry).buildParsed(); + } + + /** Parse {@code data} as a message of the given type and return it. */ + public static DynamicMessage parseFrom(Descriptor type, byte[] data) + throws InvalidProtocolBufferException { + return newBuilder(type).mergeFrom(data).buildParsed(); + } + + /** Parse {@code data} as a message of the given type and return it. */ + public static DynamicMessage parseFrom(Descriptor type, byte[] data, + ExtensionRegistry extensionRegistry) + throws InvalidProtocolBufferException { + return newBuilder(type).mergeFrom(data, extensionRegistry).buildParsed(); + } + + /** Parse a message of the given type from {@code input} and return it. */ + public static DynamicMessage parseFrom(Descriptor type, InputStream input) + throws IOException { + return newBuilder(type).mergeFrom(input).buildParsed(); + } + + /** Parse a message of the given type from {@code input} and return it. */ + public static DynamicMessage parseFrom(Descriptor type, InputStream input, + ExtensionRegistry extensionRegistry) + throws IOException { + return newBuilder(type).mergeFrom(input, extensionRegistry).buildParsed(); + } + + /** Construct a {@link Message.Builder} for the given type. */ + public static Builder newBuilder(Descriptor type) { + return new Builder(type); + } + + /** + * Construct a {@link Message.Builder} for a message of the same type as + * {@code prototype}, and initialize it with {@code prototype}'s contents. + */ + public static Builder newBuilder(Message prototype) { + return new Builder(prototype.getDescriptorForType()).mergeFrom(prototype); + } + + // ----------------------------------------------------------------- + // Implementation of Message interface. + + public Descriptor getDescriptorForType() { + return type; + } + + public DynamicMessage getDefaultInstanceForType() { + return getDefaultInstance(type); + } + + public Map getAllFields() { + return fields.getAllFields(); + } + + public boolean hasField(FieldDescriptor field) { + verifyContainingType(field); + return fields.hasField(field); + } + + public Object getField(FieldDescriptor field) { + verifyContainingType(field); + Object result = fields.getField(field); + if (result == null) { + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + result = getDefaultInstance(field.getMessageType()); + } else { + result = field.getDefaultValue(); + } + } + return result; + } + + public int getRepeatedFieldCount(FieldDescriptor field) { + verifyContainingType(field); + return fields.getRepeatedFieldCount(field); + } + + public Object getRepeatedField(FieldDescriptor field, int index) { + verifyContainingType(field); + return fields.getRepeatedField(field, index); + } + + public UnknownFieldSet getUnknownFields() { + return unknownFields; + } + + private static boolean isInitialized(Descriptor type, + FieldSet fields) { + // Check that all required fields are present. + for (final FieldDescriptor field : type.getFields()) { + if (field.isRequired()) { + if (!fields.hasField(field)) { + return false; + } + } + } + + // Check that embedded messages are initialized. + return fields.isInitialized(); + } + + public boolean isInitialized() { + return isInitialized(type, fields); + } + + public void writeTo(CodedOutputStream output) throws IOException { + if (type.getOptions().getMessageSetWireFormat()) { + fields.writeMessageSetTo(output); + unknownFields.writeAsMessageSetTo(output); + } else { + fields.writeTo(output); + unknownFields.writeTo(output); + } + } + + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + if (type.getOptions().getMessageSetWireFormat()) { + size = fields.getMessageSetSerializedSize(); + size += unknownFields.getSerializedSizeAsMessageSet(); + } else { + size = fields.getSerializedSize(); + size += unknownFields.getSerializedSize(); + } + + memoizedSize = size; + return size; + } + + public Builder newBuilderForType() { + return new Builder(type); + } + + public Builder toBuilder() { + return newBuilderForType().mergeFrom(this); + } + + /** Verifies that the field is a field of this message. */ + private void verifyContainingType(FieldDescriptor field) { + if (field.getContainingType() != type) { + throw new IllegalArgumentException( + "FieldDescriptor does not match message type."); + } + } + + // ================================================================= + + /** + * Builder for {@link DynamicMessage}s. + */ + public static final class Builder extends AbstractMessage.Builder { + private final Descriptor type; + private FieldSet fields; + private UnknownFieldSet unknownFields; + + /** Construct a {@code Builder} for the given type. */ + private Builder(Descriptor type) { + this.type = type; + this.fields = FieldSet.newFieldSet(); + this.unknownFields = UnknownFieldSet.getDefaultInstance(); + } + + // --------------------------------------------------------------- + // Implementation of Message.Builder interface. + + public Builder clear() { + if (fields == null) { + throw new IllegalStateException("Cannot call clear() after build()."); + } + fields.clear(); + return this; + } + + public Builder mergeFrom(Message other) { + if (other instanceof DynamicMessage) { + // This should be somewhat faster than calling super.mergeFrom(). + DynamicMessage otherDynamicMessage = (DynamicMessage) other; + if (otherDynamicMessage.type != type) { + throw new IllegalArgumentException( + "mergeFrom(Message) can only merge messages of the same type."); + } + fields.mergeFrom(otherDynamicMessage.fields); + mergeUnknownFields(otherDynamicMessage.unknownFields); + return this; + } else { + return super.mergeFrom(other); + } + } + + public DynamicMessage build() { + // If fields == null, we'll throw an appropriate exception later. + if (fields != null && !isInitialized()) { + throw newUninitializedMessageException( + new DynamicMessage(type, fields, unknownFields)); + } + return buildPartial(); + } + + /** + * Helper for DynamicMessage.parseFrom() methods to call. Throws + * {@link InvalidProtocolBufferException} instead of + * {@link UninitializedMessageException}. + */ + private DynamicMessage buildParsed() throws InvalidProtocolBufferException { + if (!isInitialized()) { + throw newUninitializedMessageException( + new DynamicMessage(type, fields, unknownFields)) + .asInvalidProtocolBufferException(); + } + return buildPartial(); + } + + public DynamicMessage buildPartial() { + if (fields == null) { + throw new IllegalStateException( + "build() has already been called on this Builder."); + } + fields.makeImmutable(); + DynamicMessage result = + new DynamicMessage(type, fields, unknownFields); + fields = null; + unknownFields = null; + return result; + } + + public Builder clone() { + Builder result = new Builder(type); + result.fields.mergeFrom(fields); + return result; + } + + public boolean isInitialized() { + return DynamicMessage.isInitialized(type, fields); + } + + public Descriptor getDescriptorForType() { + return type; + } + + public DynamicMessage getDefaultInstanceForType() { + return getDefaultInstance(type); + } + + public Map getAllFields() { + return fields.getAllFields(); + } + + public Builder newBuilderForField(FieldDescriptor field) { + verifyContainingType(field); + + if (field.getJavaType() != FieldDescriptor.JavaType.MESSAGE) { + throw new IllegalArgumentException( + "newBuilderForField is only valid for fields with message type."); + } + + return new Builder(field.getMessageType()); + } + + public boolean hasField(FieldDescriptor field) { + verifyContainingType(field); + return fields.hasField(field); + } + + public Object getField(FieldDescriptor field) { + verifyContainingType(field); + Object result = fields.getField(field); + if (result == null) { + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + result = getDefaultInstance(field.getMessageType()); + } else { + result = field.getDefaultValue(); + } + } + return result; + } + + public Builder setField(FieldDescriptor field, Object value) { + verifyContainingType(field); + fields.setField(field, value); + return this; + } + + public Builder clearField(FieldDescriptor field) { + verifyContainingType(field); + fields.clearField(field); + return this; + } + + public int getRepeatedFieldCount(FieldDescriptor field) { + verifyContainingType(field); + return fields.getRepeatedFieldCount(field); + } + + public Object getRepeatedField(FieldDescriptor field, int index) { + verifyContainingType(field); + return fields.getRepeatedField(field, index); + } + + public Builder setRepeatedField(FieldDescriptor field, + int index, Object value) { + verifyContainingType(field); + fields.setRepeatedField(field, index, value); + return this; + } + + public Builder addRepeatedField(FieldDescriptor field, Object value) { + verifyContainingType(field); + fields.addRepeatedField(field, value); + return this; + } + + public UnknownFieldSet getUnknownFields() { + return unknownFields; + } + + public Builder setUnknownFields(UnknownFieldSet unknownFields) { + this.unknownFields = unknownFields; + return this; + } + + public Builder mergeUnknownFields(UnknownFieldSet unknownFields) { + this.unknownFields = + UnknownFieldSet.newBuilder(this.unknownFields) + .mergeFrom(unknownFields) + .build(); + return this; + } + + /** Verifies that the field is a field of this message. */ + private void verifyContainingType(FieldDescriptor field) { + if (field.getContainingType() != type) { + throw new IllegalArgumentException( + "FieldDescriptor does not match message type."); + } + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java new file mode 100644 index 000000000..d4f6ba9e7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java @@ -0,0 +1,266 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * A table of known extensions, searchable by name or field number. When + * parsing a protocol message that might have extensions, you must provide + * an {@code ExtensionRegistry} in which you have registered any extensions + * that you want to be able to parse. Otherwise, those extensions will just + * be treated like unknown fields. + * + *

For example, if you had the {@code .proto} file: + * + *

+ * option java_class = "MyProto";
+ *
+ * message Foo {
+ *   extensions 1000 to max;
+ * }
+ *
+ * extend Foo {
+ *   optional int32 bar;
+ * }
+ * 
+ * + * Then you might write code like: + * + *
+ * ExtensionRegistry registry = ExtensionRegistry.newInstance();
+ * registry.add(MyProto.bar);
+ * MyProto.Foo message = MyProto.Foo.parseFrom(input, registry);
+ * 
+ * + *

Background: + * + *

You might wonder why this is necessary. Two alternatives might come to + * mind. First, you might imagine a system where generated extensions are + * automatically registered when their containing classes are loaded. This + * is a popular technique, but is bad design; among other things, it creates a + * situation where behavior can change depending on what classes happen to be + * loaded. It also introduces a security vulnerability, because an + * unprivileged class could cause its code to be called unexpectedly from a + * privileged class by registering itself as an extension of the right type. + * + *

Another option you might consider is lazy parsing: do not parse an + * extension until it is first requested, at which point the caller must + * provide a type to use. This introduces a different set of problems. First, + * it would require a mutex lock any time an extension was accessed, which + * would be slow. Second, corrupt data would not be detected until first + * access, at which point it would be much harder to deal with it. Third, it + * could violate the expectation that message objects are immutable, since the + * type provided could be any arbitrary message class. An unprivileged user + * could take advantage of this to inject a mutable object into a message + * belonging to privileged code and create mischief. + * + * @author kenton@google.com Kenton Varda + */ +public final class ExtensionRegistry extends ExtensionRegistryLite { + /** Construct a new, empty instance. */ + public static ExtensionRegistry newInstance() { + return new ExtensionRegistry(); + } + + /** Get the unmodifiable singleton empty instance. */ + public static ExtensionRegistry getEmptyRegistry() { + return EMPTY; + } + + /** Returns an unmodifiable view of the registry. */ + @Override + public ExtensionRegistry getUnmodifiable() { + return new ExtensionRegistry(this); + } + + /** A (Descriptor, Message) pair, returned by lookup methods. */ + public static final class ExtensionInfo { + /** The extension's descriptor. */ + public final FieldDescriptor descriptor; + + /** + * A default instance of the extension's type, if it has a message type. + * Otherwise, {@code null}. + */ + public final Message defaultInstance; + + private ExtensionInfo(final FieldDescriptor descriptor) { + this.descriptor = descriptor; + defaultInstance = null; + } + private ExtensionInfo(final FieldDescriptor descriptor, + final Message defaultInstance) { + this.descriptor = descriptor; + this.defaultInstance = defaultInstance; + } + } + + /** + * Find an extension by fully-qualified field name, in the proto namespace. + * I.e. {@code result.descriptor.fullName()} will match {@code fullName} if + * a match is found. + * + * @return Information about the extension if found, or {@code null} + * otherwise. + */ + public ExtensionInfo findExtensionByName(final String fullName) { + return extensionsByName.get(fullName); + } + + /** + * Find an extension by containing type and field number. + * + * @return Information about the extension if found, or {@code null} + * otherwise. + */ + public ExtensionInfo findExtensionByNumber(final Descriptor containingType, + final int fieldNumber) { + return extensionsByNumber.get( + new DescriptorIntPair(containingType, fieldNumber)); + } + + /** Add an extension from a generated file to the registry. */ + public void add(final GeneratedMessage.GeneratedExtension extension) { + if (extension.getDescriptor().getJavaType() == + FieldDescriptor.JavaType.MESSAGE) { + if (extension.getMessageDefaultInstance() == null) { + throw new IllegalStateException( + "Registered message-type extension had null default instance: " + + extension.getDescriptor().getFullName()); + } + add(new ExtensionInfo(extension.getDescriptor(), + extension.getMessageDefaultInstance())); + } else { + add(new ExtensionInfo(extension.getDescriptor(), null)); + } + } + + /** Add a non-message-type extension to the registry by descriptor. */ + public void add(final FieldDescriptor type) { + if (type.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + throw new IllegalArgumentException( + "ExtensionRegistry.add() must be provided a default instance when " + + "adding an embedded message extension."); + } + add(new ExtensionInfo(type, null)); + } + + /** Add a message-type extension to the registry by descriptor. */ + public void add(final FieldDescriptor type, final Message defaultInstance) { + if (type.getJavaType() != FieldDescriptor.JavaType.MESSAGE) { + throw new IllegalArgumentException( + "ExtensionRegistry.add() provided a default instance for a " + + "non-message extension."); + } + add(new ExtensionInfo(type, defaultInstance)); + } + + // ================================================================= + // Private stuff. + + private ExtensionRegistry() { + this.extensionsByName = new HashMap(); + this.extensionsByNumber = new HashMap(); + } + + private ExtensionRegistry(ExtensionRegistry other) { + super(other); + this.extensionsByName = Collections.unmodifiableMap(other.extensionsByName); + this.extensionsByNumber = + Collections.unmodifiableMap(other.extensionsByNumber); + } + + private final Map extensionsByName; + private final Map extensionsByNumber; + + private ExtensionRegistry(boolean empty) { + super(ExtensionRegistryLite.getEmptyRegistry()); + this.extensionsByName = Collections.emptyMap(); + this.extensionsByNumber = + Collections.emptyMap(); + } + private static final ExtensionRegistry EMPTY = new ExtensionRegistry(true); + + private void add(final ExtensionInfo extension) { + if (!extension.descriptor.isExtension()) { + throw new IllegalArgumentException( + "ExtensionRegistry.add() was given a FieldDescriptor for a regular " + + "(non-extension) field."); + } + + extensionsByName.put(extension.descriptor.getFullName(), extension); + extensionsByNumber.put( + new DescriptorIntPair(extension.descriptor.getContainingType(), + extension.descriptor.getNumber()), + extension); + + final FieldDescriptor field = extension.descriptor; + if (field.getContainingType().getOptions().getMessageSetWireFormat() && + field.getType() == FieldDescriptor.Type.MESSAGE && + field.isOptional() && + field.getExtensionScope() == field.getMessageType()) { + // This is an extension of a MessageSet type defined within the extension + // type's own scope. For backwards-compatibility, allow it to be looked + // up by type name. + extensionsByName.put(field.getMessageType().getFullName(), extension); + } + } + + /** A (GenericDescriptor, int) pair, used as a map key. */ + private static final class DescriptorIntPair { + private final Descriptor descriptor; + private final int number; + + DescriptorIntPair(final Descriptor descriptor, final int number) { + this.descriptor = descriptor; + this.number = number; + } + + @Override + public int hashCode() { + return descriptor.hashCode() * ((1 << 16) - 1) + number; + } + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof DescriptorIntPair)) { + return false; + } + final DescriptorIntPair other = (DescriptorIntPair)obj; + return descriptor == other.descriptor && number == other.number; + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java new file mode 100644 index 000000000..d5288dd8e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java @@ -0,0 +1,169 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Equivalent to {@link ExtensionRegistry} but supports only "lite" types. + *

+ * If all of your types are lite types, then you only need to use + * {@code ExtensionRegistryLite}. Similarly, if all your types are regular + * types, then you only need {@link ExtensionRegistry}. Typically it does not + * make sense to mix the two, since if you have any regular types in your + * program, you then require the full runtime and lose all the benefits of + * the lite runtime, so you might as well make all your types be regular types. + * However, in some cases (e.g. when depending on multiple third-patry libraries + * where one uses lite types and one uses regular), you may find yourself + * wanting to mix the two. In this case things get more complicated. + *

+ * There are three factors to consider: Whether the type being extended is + * lite, whether the embedded type (in the case of a message-typed extension) + * is lite, and whether the extension itself is lite. Since all three are + * declared in different files, they could all be different. Here are all + * the combinations and which type of registry to use: + *

+ *   Extended type     Inner type    Extension         Use registry
+ *   =======================================================================
+ *   lite              lite          lite              ExtensionRegistryLite
+ *   lite              regular       lite              ExtensionRegistry
+ *   regular           regular       regular           ExtensionRegistry
+ *   all other combinations                            not supported
+ * 
+ *

+ * Note that just as regular types are not allowed to contain lite-type fields, + * they are also not allowed to contain lite-type extensions. This is because + * regular types must be fully accessible via reflection, which in turn means + * that all the inner messages must also support reflection. On the other hand, + * since regular types implement the entire lite interface, there is no problem + * with embedding regular types inside lite types. + * + * @author kenton@google.com Kenton Varda + */ +public class ExtensionRegistryLite { + /** Construct a new, empty instance. */ + public static ExtensionRegistryLite newInstance() { + return new ExtensionRegistryLite(); + } + + /** Get the unmodifiable singleton empty instance. */ + public static ExtensionRegistryLite getEmptyRegistry() { + return EMPTY; + } + + /** Returns an unmodifiable view of the registry. */ + public ExtensionRegistryLite getUnmodifiable() { + return new ExtensionRegistryLite(this); + } + + /** + * Find an extension by containing type and field number. + * + * @return Information about the extension if found, or {@code null} + * otherwise. + */ + @SuppressWarnings("unchecked") + public + GeneratedMessageLite.GeneratedExtension + findLiteExtensionByNumber( + final ContainingType containingTypeDefaultInstance, + final int fieldNumber) { + return (GeneratedMessageLite.GeneratedExtension) + extensionsByNumber.get( + new ObjectIntPair(containingTypeDefaultInstance, fieldNumber)); + } + + /** Add an extension from a lite generated file to the registry. */ + public final void add( + final GeneratedMessageLite.GeneratedExtension extension) { + extensionsByNumber.put( + new ObjectIntPair(extension.getContainingTypeDefaultInstance(), + extension.getNumber()), + extension); + } + + // ================================================================= + // Private stuff. + + // Constructors are package-private so that ExtensionRegistry can subclass + // this. + + ExtensionRegistryLite() { + this.extensionsByNumber = + new HashMap>(); + } + + ExtensionRegistryLite(ExtensionRegistryLite other) { + if (other == EMPTY) { + this.extensionsByNumber = Collections.emptyMap(); + } else { + this.extensionsByNumber = + Collections.unmodifiableMap(other.extensionsByNumber); + } + } + + private final Map> + extensionsByNumber; + + private ExtensionRegistryLite(boolean empty) { + this.extensionsByNumber = Collections.emptyMap(); + } + private static final ExtensionRegistryLite EMPTY = + new ExtensionRegistryLite(true); + + /** A (Object, int) pair, used as a map key. */ + private static final class ObjectIntPair { + private final Object object; + private final int number; + + ObjectIntPair(final Object object, final int number) { + this.object = object; + this.number = number; + } + + @Override + public int hashCode() { + return System.identityHashCode(object) * ((1 << 16) - 1) + number; + } + @Override + public boolean equals(final Object obj) { + if (!(obj instanceof ObjectIntPair)) { + return false; + } + final ObjectIntPair other = (ObjectIntPair)obj; + return object == other.object && number == other.number; + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java new file mode 100644 index 000000000..a85dbaa63 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java @@ -0,0 +1,788 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.io.IOException; + +/** + * A class which represents an arbitrary set of fields of some message type. + * This is used to implement {@link DynamicMessage}, and also to represent + * extensions in {@link GeneratedMessage}. This class is package-private, + * since outside users should probably be using {@link DynamicMessage}. + * + * @author kenton@google.com Kenton Varda + */ +final class FieldSet> { + /** + * Interface for a FieldDescriptor or lite extension descriptor. This + * prevents FieldSet from depending on {@link Descriptors.FieldDescriptor}. + */ + public interface FieldDescriptorLite> + extends Comparable { + int getNumber(); + WireFormat.FieldType getLiteType(); + WireFormat.JavaType getLiteJavaType(); + boolean isRepeated(); + boolean isPacked(); + Internal.EnumLiteMap getEnumType(); + + // If getLiteJavaType() == MESSAGE, this merges a message object of the + // type into a builder of the type. Returns {@code to}. + MessageLite.Builder internalMergeFrom( + MessageLite.Builder to, MessageLite from); + } + + private final SmallSortedMap fields; + private boolean isImmutable; + + /** Construct a new FieldSet. */ + private FieldSet() { + this.fields = SmallSortedMap.newFieldMap(16); + } + + /** + * Construct an empty FieldSet. This is only used to initialize + * DEFAULT_INSTANCE. + */ + private FieldSet(final boolean dummy) { + this.fields = SmallSortedMap.newFieldMap(0); + makeImmutable(); + } + + /** Construct a new FieldSet. */ + public static > + FieldSet newFieldSet() { + return new FieldSet(); + } + + /** Get an immutable empty FieldSet. */ + @SuppressWarnings("unchecked") + public static > + FieldSet emptySet() { + return DEFAULT_INSTANCE; + } + @SuppressWarnings("unchecked") + private static final FieldSet DEFAULT_INSTANCE = new FieldSet(true); + + /** Make this FieldSet immutable from this point forward. */ + @SuppressWarnings("unchecked") + public void makeImmutable() { + if (isImmutable) { + return; + } + fields.makeImmutable(); + isImmutable = true; + } + + /** + * Retuns whether the FieldSet is immutable. This is true if it is the + * {@link #emptySet} or if {@link #makeImmutable} were called. + * + * @return whether the FieldSet is immutable. + */ + public boolean isImmutable() { + return isImmutable; + } + + /** + * Clones the FieldSet. The returned FieldSet will be mutable even if the + * original FieldSet was immutable. + * + * @return the newly cloned FieldSet + */ + @Override + public FieldSet clone() { + // We can't just call fields.clone because List objects in the map + // should not be shared. + FieldSet clone = FieldSet.newFieldSet(); + for (int i = 0; i < fields.getNumArrayEntries(); i++) { + Map.Entry entry = fields.getArrayEntryAt(i); + FieldDescriptorType descriptor = entry.getKey(); + clone.setField(descriptor, entry.getValue()); + } + for (Map.Entry entry : + fields.getOverflowEntries()) { + FieldDescriptorType descriptor = entry.getKey(); + clone.setField(descriptor, entry.getValue()); + } + return clone; + } + + // ================================================================= + + /** See {@link Message.Builder#clear()}. */ + public void clear() { + fields.clear(); + } + + /** + * Get a simple map containing all the fields. + */ + public Map getAllFields() { + return fields.isImmutable() ? fields : Collections.unmodifiableMap(fields); + } + + /** + * Get an iterator to the field map. This iterator should not be leaked out + * of the protobuf library as it is not protected from mutation when + * fields is not immutable. + */ + public Iterator> iterator() { + return fields.entrySet().iterator(); + } + + /** + * Useful for implementing + * {@link Message#hasField(Descriptors.FieldDescriptor)}. + */ + public boolean hasField(final FieldDescriptorType descriptor) { + if (descriptor.isRepeated()) { + throw new IllegalArgumentException( + "hasField() can only be called on non-repeated fields."); + } + + return fields.get(descriptor) != null; + } + + /** + * Useful for implementing + * {@link Message#getField(Descriptors.FieldDescriptor)}. This method + * returns {@code null} if the field is not set; in this case it is up + * to the caller to fetch the field's default value. + */ + public Object getField(final FieldDescriptorType descriptor) { + return fields.get(descriptor); + } + + /** + * Useful for implementing + * {@link Message.Builder#setField(Descriptors.FieldDescriptor,Object)}. + */ + @SuppressWarnings("unchecked") + public void setField(final FieldDescriptorType descriptor, + Object value) { + if (descriptor.isRepeated()) { + if (!(value instanceof List)) { + throw new IllegalArgumentException( + "Wrong object type used with protocol message reflection."); + } + + // Wrap the contents in a new list so that the caller cannot change + // the list's contents after setting it. + final List newList = new ArrayList(); + newList.addAll((List)value); + for (final Object element : newList) { + verifyType(descriptor.getLiteType(), element); + } + value = newList; + } else { + verifyType(descriptor.getLiteType(), value); + } + + fields.put(descriptor, value); + } + + /** + * Useful for implementing + * {@link Message.Builder#clearField(Descriptors.FieldDescriptor)}. + */ + public void clearField(final FieldDescriptorType descriptor) { + fields.remove(descriptor); + } + + /** + * Useful for implementing + * {@link Message#getRepeatedFieldCount(Descriptors.FieldDescriptor)}. + */ + public int getRepeatedFieldCount(final FieldDescriptorType descriptor) { + if (!descriptor.isRepeated()) { + throw new IllegalArgumentException( + "getRepeatedField() can only be called on repeated fields."); + } + + final Object value = fields.get(descriptor); + if (value == null) { + return 0; + } else { + return ((List) value).size(); + } + } + + /** + * Useful for implementing + * {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)}. + */ + public Object getRepeatedField(final FieldDescriptorType descriptor, + final int index) { + if (!descriptor.isRepeated()) { + throw new IllegalArgumentException( + "getRepeatedField() can only be called on repeated fields."); + } + + final Object value = fields.get(descriptor); + + if (value == null) { + throw new IndexOutOfBoundsException(); + } else { + return ((List) value).get(index); + } + } + + /** + * Useful for implementing + * {@link Message.Builder#setRepeatedField(Descriptors.FieldDescriptor,int,Object)}. + */ + @SuppressWarnings("unchecked") + public void setRepeatedField(final FieldDescriptorType descriptor, + final int index, + final Object value) { + if (!descriptor.isRepeated()) { + throw new IllegalArgumentException( + "getRepeatedField() can only be called on repeated fields."); + } + + final Object list = fields.get(descriptor); + if (list == null) { + throw new IndexOutOfBoundsException(); + } + + verifyType(descriptor.getLiteType(), value); + ((List) list).set(index, value); + } + + /** + * Useful for implementing + * {@link Message.Builder#addRepeatedField(Descriptors.FieldDescriptor,Object)}. + */ + @SuppressWarnings("unchecked") + public void addRepeatedField(final FieldDescriptorType descriptor, + final Object value) { + if (!descriptor.isRepeated()) { + throw new IllegalArgumentException( + "addRepeatedField() can only be called on repeated fields."); + } + + verifyType(descriptor.getLiteType(), value); + + final Object existingValue = fields.get(descriptor); + List list; + if (existingValue == null) { + list = new ArrayList(); + fields.put(descriptor, list); + } else { + list = (List) existingValue; + } + + list.add(value); + } + + /** + * Verifies that the given object is of the correct type to be a valid + * value for the given field. (For repeated fields, this checks if the + * object is the right type to be one element of the field.) + * + * @throws IllegalArgumentException The value is not of the right type. + */ + private static void verifyType(final WireFormat.FieldType type, + final Object value) { + if (value == null) { + throw new NullPointerException(); + } + + boolean isValid = false; + switch (type.getJavaType()) { + case INT: isValid = value instanceof Integer ; break; + case LONG: isValid = value instanceof Long ; break; + case FLOAT: isValid = value instanceof Float ; break; + case DOUBLE: isValid = value instanceof Double ; break; + case BOOLEAN: isValid = value instanceof Boolean ; break; + case STRING: isValid = value instanceof String ; break; + case BYTE_STRING: isValid = value instanceof ByteString; break; + case ENUM: + // TODO(kenton): Caller must do type checking here, I guess. + isValid = value instanceof Internal.EnumLite; + break; + case MESSAGE: + // TODO(kenton): Caller must do type checking here, I guess. + isValid = value instanceof MessageLite; + break; + } + + if (!isValid) { + // TODO(kenton): When chaining calls to setField(), it can be hard to + // tell from the stack trace which exact call failed, since the whole + // chain is considered one line of code. It would be nice to print + // more information here, e.g. naming the field. We used to do that. + // But we can't now that FieldSet doesn't use descriptors. Maybe this + // isn't a big deal, though, since it would only really apply when using + // reflection and generally people don't chain reflection setters. + throw new IllegalArgumentException( + "Wrong object type used with protocol message reflection."); + } + } + + // ================================================================= + // Parsing and serialization + + /** + * See {@link Message#isInitialized()}. Note: Since {@code FieldSet} + * itself does not have any way of knowing about required fields that + * aren't actually present in the set, it is up to the caller to check + * that all required fields are present. + */ + public boolean isInitialized() { + for (int i = 0; i < fields.getNumArrayEntries(); i++) { + if (!isInitialized(fields.getArrayEntryAt(i))) { + return false; + } + } + for (final Map.Entry entry : + fields.getOverflowEntries()) { + if (!isInitialized(entry)) { + return false; + } + } + return true; + } + + @SuppressWarnings("unchecked") + private boolean isInitialized( + final Map.Entry entry) { + final FieldDescriptorType descriptor = entry.getKey(); + if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) { + if (descriptor.isRepeated()) { + for (final MessageLite element: + (List) entry.getValue()) { + if (!element.isInitialized()) { + return false; + } + } + } else { + if (!((MessageLite) entry.getValue()).isInitialized()) { + return false; + } + } + } + return true; + } + + /** + * Given a field type, return the wire type. + * + * @returns One of the {@code WIRETYPE_} constants defined in + * {@link WireFormat}. + */ + static int getWireFormatForFieldType(final WireFormat.FieldType type, + boolean isPacked) { + if (isPacked) { + return WireFormat.WIRETYPE_LENGTH_DELIMITED; + } else { + return type.getWireType(); + } + } + + /** + * Like {@link #mergeFrom(Message)}, but merges from another {@link FieldSet}. + */ + public void mergeFrom(final FieldSet other) { + for (int i = 0; i < other.fields.getNumArrayEntries(); i++) { + mergeFromField(other.fields.getArrayEntryAt(i)); + } + for (final Map.Entry entry : + other.fields.getOverflowEntries()) { + mergeFromField(entry); + } + } + + @SuppressWarnings("unchecked") + private void mergeFromField( + final Map.Entry entry) { + final FieldDescriptorType descriptor = entry.getKey(); + final Object otherValue = entry.getValue(); + + if (descriptor.isRepeated()) { + Object value = fields.get(descriptor); + if (value == null) { + // Our list is empty, but we still need to make a defensive copy of + // the other list since we don't know if the other FieldSet is still + // mutable. + fields.put(descriptor, new ArrayList((List) otherValue)); + } else { + // Concatenate the lists. + ((List) value).addAll((List) otherValue); + } + } else if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE) { + Object value = fields.get(descriptor); + if (value == null) { + fields.put(descriptor, otherValue); + } else { + // Merge the messages. + fields.put( + descriptor, + descriptor.internalMergeFrom( + ((MessageLite) value).toBuilder(), (MessageLite) otherValue) + .build()); + } + + } else { + fields.put(descriptor, otherValue); + } + } + + // TODO(kenton): Move static parsing and serialization methods into some + // other class. Probably WireFormat. + + /** + * Read a field of any primitive type from a CodedInputStream. Enums, + * groups, and embedded messages are not handled by this method. + * + * @param input The stream from which to read. + * @param type Declared type of the field. + * @return An object representing the field's value, of the exact + * type which would be returned by + * {@link Message#getField(Descriptors.FieldDescriptor)} for + * this field. + */ + public static Object readPrimitiveField( + CodedInputStream input, + final WireFormat.FieldType type) throws IOException { + switch (type) { + case DOUBLE : return input.readDouble (); + case FLOAT : return input.readFloat (); + case INT64 : return input.readInt64 (); + case UINT64 : return input.readUInt64 (); + case INT32 : return input.readInt32 (); + case FIXED64 : return input.readFixed64 (); + case FIXED32 : return input.readFixed32 (); + case BOOL : return input.readBool (); + case STRING : return input.readString (); + case BYTES : return input.readBytes (); + case UINT32 : return input.readUInt32 (); + case SFIXED32: return input.readSFixed32(); + case SFIXED64: return input.readSFixed64(); + case SINT32 : return input.readSInt32 (); + case SINT64 : return input.readSInt64 (); + + case GROUP: + throw new IllegalArgumentException( + "readPrimitiveField() cannot handle nested groups."); + case MESSAGE: + throw new IllegalArgumentException( + "readPrimitiveField() cannot handle embedded messages."); + case ENUM: + // We don't handle enums because we don't know what to do if the + // value is not recognized. + throw new IllegalArgumentException( + "readPrimitiveField() cannot handle enums."); + } + + throw new RuntimeException( + "There is no way to get here, but the compiler thinks otherwise."); + } + + /** See {@link Message#writeTo(CodedOutputStream)}. */ + public void writeTo(final CodedOutputStream output) + throws IOException { + for (int i = 0; i < fields.getNumArrayEntries(); i++) { + final Map.Entry entry = + fields.getArrayEntryAt(i); + writeField(entry.getKey(), entry.getValue(), output); + } + for (final Map.Entry entry : + fields.getOverflowEntries()) { + writeField(entry.getKey(), entry.getValue(), output); + } + } + + /** + * Like {@link #writeTo} but uses MessageSet wire format. + */ + public void writeMessageSetTo(final CodedOutputStream output) + throws IOException { + for (int i = 0; i < fields.getNumArrayEntries(); i++) { + writeMessageSetTo(fields.getArrayEntryAt(i), output); + } + for (final Map.Entry entry : + fields.getOverflowEntries()) { + writeMessageSetTo(entry, output); + } + } + + private void writeMessageSetTo( + final Map.Entry entry, + final CodedOutputStream output) throws IOException { + final FieldDescriptorType descriptor = entry.getKey(); + if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE && + !descriptor.isRepeated() && !descriptor.isPacked()) { + output.writeMessageSetExtension(entry.getKey().getNumber(), + (MessageLite) entry.getValue()); + } else { + writeField(descriptor, entry.getValue(), output); + } + } + + /** + * Write a single tag-value pair to the stream. + * + * @param output The output stream. + * @param type The field's type. + * @param number The field's number. + * @param value Object representing the field's value. Must be of the exact + * type which would be returned by + * {@link Message#getField(Descriptors.FieldDescriptor)} for + * this field. + */ + private static void writeElement(final CodedOutputStream output, + final WireFormat.FieldType type, + final int number, + final Object value) throws IOException { + // Special case for groups, which need a start and end tag; other fields + // can just use writeTag() and writeFieldNoTag(). + if (type == WireFormat.FieldType.GROUP) { + output.writeGroup(number, (MessageLite) value); + } else { + output.writeTag(number, getWireFormatForFieldType(type, false)); + writeElementNoTag(output, type, value); + } + } + + /** + * Write a field of arbitrary type, without its tag, to the stream. + * + * @param output The output stream. + * @param type The field's type. + * @param value Object representing the field's value. Must be of the exact + * type which would be returned by + * {@link Message#getField(Descriptors.FieldDescriptor)} for + * this field. + */ + private static void writeElementNoTag( + final CodedOutputStream output, + final WireFormat.FieldType type, + final Object value) throws IOException { + switch (type) { + case DOUBLE : output.writeDoubleNoTag ((Double ) value); break; + case FLOAT : output.writeFloatNoTag ((Float ) value); break; + case INT64 : output.writeInt64NoTag ((Long ) value); break; + case UINT64 : output.writeUInt64NoTag ((Long ) value); break; + case INT32 : output.writeInt32NoTag ((Integer ) value); break; + case FIXED64 : output.writeFixed64NoTag ((Long ) value); break; + case FIXED32 : output.writeFixed32NoTag ((Integer ) value); break; + case BOOL : output.writeBoolNoTag ((Boolean ) value); break; + case STRING : output.writeStringNoTag ((String ) value); break; + case GROUP : output.writeGroupNoTag ((MessageLite) value); break; + case MESSAGE : output.writeMessageNoTag ((MessageLite) value); break; + case BYTES : output.writeBytesNoTag ((ByteString ) value); break; + case UINT32 : output.writeUInt32NoTag ((Integer ) value); break; + case SFIXED32: output.writeSFixed32NoTag((Integer ) value); break; + case SFIXED64: output.writeSFixed64NoTag((Long ) value); break; + case SINT32 : output.writeSInt32NoTag ((Integer ) value); break; + case SINT64 : output.writeSInt64NoTag ((Long ) value); break; + + case ENUM: + output.writeEnumNoTag(((Internal.EnumLite) value).getNumber()); + break; + } + } + + /** Write a single field. */ + public static void writeField(final FieldDescriptorLite descriptor, + final Object value, + final CodedOutputStream output) + throws IOException { + WireFormat.FieldType type = descriptor.getLiteType(); + int number = descriptor.getNumber(); + if (descriptor.isRepeated()) { + final List valueList = (List)value; + if (descriptor.isPacked()) { + output.writeTag(number, WireFormat.WIRETYPE_LENGTH_DELIMITED); + // Compute the total data size so the length can be written. + int dataSize = 0; + for (final Object element : valueList) { + dataSize += computeElementSizeNoTag(type, element); + } + output.writeRawVarint32(dataSize); + // Write the data itself, without any tags. + for (final Object element : valueList) { + writeElementNoTag(output, type, element); + } + } else { + for (final Object element : valueList) { + writeElement(output, type, number, element); + } + } + } else { + writeElement(output, type, number, value); + } + } + + /** + * See {@link Message#getSerializedSize()}. It's up to the caller to cache + * the resulting size if desired. + */ + public int getSerializedSize() { + int size = 0; + for (int i = 0; i < fields.getNumArrayEntries(); i++) { + final Map.Entry entry = + fields.getArrayEntryAt(i); + size += computeFieldSize(entry.getKey(), entry.getValue()); + } + for (final Map.Entry entry : + fields.getOverflowEntries()) { + size += computeFieldSize(entry.getKey(), entry.getValue()); + } + return size; + } + + /** + * Like {@link #getSerializedSize} but uses MessageSet wire format. + */ + public int getMessageSetSerializedSize() { + int size = 0; + for (int i = 0; i < fields.getNumArrayEntries(); i++) { + size += getMessageSetSerializedSize(fields.getArrayEntryAt(i)); + } + for (final Map.Entry entry : + fields.getOverflowEntries()) { + size += getMessageSetSerializedSize(entry); + } + return size; + } + + private int getMessageSetSerializedSize( + final Map.Entry entry) { + final FieldDescriptorType descriptor = entry.getKey(); + if (descriptor.getLiteJavaType() == WireFormat.JavaType.MESSAGE && + !descriptor.isRepeated() && !descriptor.isPacked()) { + return CodedOutputStream.computeMessageSetExtensionSize( + entry.getKey().getNumber(), (MessageLite) entry.getValue()); + } else { + return computeFieldSize(descriptor, entry.getValue()); + } + } + + /** + * Compute the number of bytes that would be needed to encode a + * single tag/value pair of arbitrary type. + * + * @param type The field's type. + * @param number The field's number. + * @param value Object representing the field's value. Must be of the exact + * type which would be returned by + * {@link Message#getField(Descriptors.FieldDescriptor)} for + * this field. + */ + private static int computeElementSize( + final WireFormat.FieldType type, + final int number, final Object value) { + int tagSize = CodedOutputStream.computeTagSize(number); + if (type == WireFormat.FieldType.GROUP) { + tagSize *= 2; + } + return tagSize + computeElementSizeNoTag(type, value); + } + + /** + * Compute the number of bytes that would be needed to encode a + * particular value of arbitrary type, excluding tag. + * + * @param type The field's type. + * @param value Object representing the field's value. Must be of the exact + * type which would be returned by + * {@link Message#getField(Descriptors.FieldDescriptor)} for + * this field. + */ + private static int computeElementSizeNoTag( + final WireFormat.FieldType type, final Object value) { + switch (type) { + // Note: Minor violation of 80-char limit rule here because this would + // actually be harder to read if we wrapped the lines. + case DOUBLE : return CodedOutputStream.computeDoubleSizeNoTag ((Double )value); + case FLOAT : return CodedOutputStream.computeFloatSizeNoTag ((Float )value); + case INT64 : return CodedOutputStream.computeInt64SizeNoTag ((Long )value); + case UINT64 : return CodedOutputStream.computeUInt64SizeNoTag ((Long )value); + case INT32 : return CodedOutputStream.computeInt32SizeNoTag ((Integer )value); + case FIXED64 : return CodedOutputStream.computeFixed64SizeNoTag ((Long )value); + case FIXED32 : return CodedOutputStream.computeFixed32SizeNoTag ((Integer )value); + case BOOL : return CodedOutputStream.computeBoolSizeNoTag ((Boolean )value); + case STRING : return CodedOutputStream.computeStringSizeNoTag ((String )value); + case GROUP : return CodedOutputStream.computeGroupSizeNoTag ((MessageLite)value); + case MESSAGE : return CodedOutputStream.computeMessageSizeNoTag ((MessageLite)value); + case BYTES : return CodedOutputStream.computeBytesSizeNoTag ((ByteString )value); + case UINT32 : return CodedOutputStream.computeUInt32SizeNoTag ((Integer )value); + case SFIXED32: return CodedOutputStream.computeSFixed32SizeNoTag((Integer )value); + case SFIXED64: return CodedOutputStream.computeSFixed64SizeNoTag((Long )value); + case SINT32 : return CodedOutputStream.computeSInt32SizeNoTag ((Integer )value); + case SINT64 : return CodedOutputStream.computeSInt64SizeNoTag ((Long )value); + + case ENUM: + return CodedOutputStream.computeEnumSizeNoTag( + ((Internal.EnumLite) value).getNumber()); + } + + throw new RuntimeException( + "There is no way to get here, but the compiler thinks otherwise."); + } + + /** + * Compute the number of bytes needed to encode a particular field. + */ + public static int computeFieldSize(final FieldDescriptorLite descriptor, + final Object value) { + WireFormat.FieldType type = descriptor.getLiteType(); + int number = descriptor.getNumber(); + if (descriptor.isRepeated()) { + if (descriptor.isPacked()) { + int dataSize = 0; + for (final Object element : (List)value) { + dataSize += computeElementSizeNoTag(type, element); + } + return dataSize + + CodedOutputStream.computeTagSize(number) + + CodedOutputStream.computeRawVarint32Size(dataSize); + } else { + int size = 0; + for (final Object element : (List)value) { + size += computeElementSize(type, number, element); + } + return size; + } + } else { + return computeElementSize(type, number, value); + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java new file mode 100644 index 000000000..b5eaded50 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java @@ -0,0 +1,1834 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.EnumValueDescriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; + +import java.io.IOException; +import java.io.ObjectStreamException; +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * All generated protocol message classes extend this class. This class + * implements most of the Message and Builder interfaces using Java reflection. + * Users can ignore this class and pretend that generated messages implement + * the Message interface directly. + * + * @author kenton@google.com Kenton Varda + */ +public abstract class GeneratedMessage extends AbstractMessage + implements Serializable { + private static final long serialVersionUID = 1L; + + private final UnknownFieldSet unknownFields; + + /** + * For testing. Allows a test to disable the optimization that avoids using + * field builders for nested messages until they are requested. By disabling + * this optimization, existing tests can be reused to test the field builders. + */ + protected static boolean alwaysUseFieldBuilders = false; + + protected GeneratedMessage() { + this.unknownFields = UnknownFieldSet.getDefaultInstance(); + } + + protected GeneratedMessage(Builder builder) { + this.unknownFields = builder.getUnknownFields(); + } + + /** + * For testing. Allows a test to disable the optimization that avoids using + * field builders for nested messages until they are requested. By disabling + * this optimization, existing tests can be reused to test the field builders. + * See {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder}. + */ + static void enableAlwaysUseFieldBuildersForTesting() { + alwaysUseFieldBuilders = true; + } + + /** + * Get the FieldAccessorTable for this type. We can't have the message + * class pass this in to the constructor because of bootstrapping trouble + * with DescriptorProtos. + */ + protected abstract FieldAccessorTable internalGetFieldAccessorTable(); + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Descriptor getDescriptorForType() { + return internalGetFieldAccessorTable().descriptor; + } + + /** Internal helper which returns a mutable map. */ + private Map getAllFieldsMutable() { + final TreeMap result = + new TreeMap(); + final Descriptor descriptor = internalGetFieldAccessorTable().descriptor; + for (final FieldDescriptor field : descriptor.getFields()) { + if (field.isRepeated()) { + final List value = (List) getField(field); + if (!value.isEmpty()) { + result.put(field, value); + } + } else { + if (hasField(field)) { + result.put(field, getField(field)); + } + } + } + return result; + } + + @Override + public boolean isInitialized() { + for (final FieldDescriptor field : getDescriptorForType().getFields()) { + // Check that all required fields are present. + if (field.isRequired()) { + if (!hasField(field)) { + return false; + } + } + // Check that embedded messages are initialized. + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + if (field.isRepeated()) { + @SuppressWarnings("unchecked") final + List messageList = (List) getField(field); + for (final Message element : messageList) { + if (!element.isInitialized()) { + return false; + } + } + } else { + if (hasField(field) && !((Message) getField(field)).isInitialized()) { + return false; + } + } + } + } + + return true; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Map getAllFields() { + return Collections.unmodifiableMap(getAllFieldsMutable()); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean hasField(final FieldDescriptor field) { + return internalGetFieldAccessorTable().getField(field).has(this); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Object getField(final FieldDescriptor field) { + return internalGetFieldAccessorTable().getField(field).get(this); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public int getRepeatedFieldCount(final FieldDescriptor field) { + return internalGetFieldAccessorTable().getField(field) + .getRepeatedCount(this); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Object getRepeatedField(final FieldDescriptor field, final int index) { + return internalGetFieldAccessorTable().getField(field) + .getRepeated(this, index); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final UnknownFieldSet getUnknownFields() { + return unknownFields; + } + + protected abstract Message.Builder newBuilderForType(BuilderParent parent); + + /** + * Interface for the parent of a Builder that allows the builder to + * communicate invalidations back to the parent for use when using nested + * builders. + */ + protected interface BuilderParent { + + /** + * A builder becomes dirty whenever a field is modified -- including fields + * in nested builders -- and becomes clean when build() is called. Thus, + * when a builder becomes dirty, all its parents become dirty as well, and + * when it becomes clean, all its children become clean. The dirtiness + * state is used to invalidate certain cached values. + *
+ * To this end, a builder calls markAsDirty() on its parent whenever it + * transitions from clean to dirty. The parent must propagate this call to + * its own parent, unless it was already dirty, in which case the + * grandparent must necessarily already be dirty as well. The parent can + * only transition back to "clean" after calling build() on all children. + */ + void markDirty(); + } + + @SuppressWarnings("unchecked") + public abstract static class Builder + extends AbstractMessage.Builder { + + private BuilderParent builderParent; + + private BuilderParentImpl meAsParent; + + // Indicates that we've built a message and so we are now obligated + // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener. + private boolean isClean; + + private UnknownFieldSet unknownFields = + UnknownFieldSet.getDefaultInstance(); + + protected Builder() { + this(null); + } + + protected Builder(BuilderParent builderParent) { + this.builderParent = builderParent; + } + + void dispose() { + builderParent = null; + } + + /** + * Called by the subclass when a message is built. + */ + protected void onBuilt() { + if (builderParent != null) { + markClean(); + } + } + + /** + * Called by the subclass or a builder to notify us that a message was + * built and may be cached and therefore invalidations are needed. + */ + protected void markClean() { + this.isClean = true; + } + + /** + * Gets whether invalidations are needed + * + * @return whether invalidations are needed + */ + protected boolean isClean() { + return isClean; + } + + // This is implemented here only to work around an apparent bug in the + // Java compiler and/or build system. See bug #1898463. The mere presence + // of this dummy clone() implementation makes it go away. + @Override + public BuilderType clone() { + throw new UnsupportedOperationException( + "This is supposed to be overridden by subclasses."); + } + + /** + * Called by the initialization and clear code paths to allow subclasses to + * reset any of their builtin fields back to the initial values. + */ + public BuilderType clear() { + unknownFields = UnknownFieldSet.getDefaultInstance(); + onChanged(); + return (BuilderType) this; + } + + /** + * Get the FieldAccessorTable for this type. We can't have the message + * class pass this in to the constructor because of bootstrapping trouble + * with DescriptorProtos. + */ + protected abstract FieldAccessorTable internalGetFieldAccessorTable(); + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Descriptor getDescriptorForType() { + return internalGetFieldAccessorTable().descriptor; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Map getAllFields() { + return Collections.unmodifiableMap(getAllFieldsMutable()); + } + + /** Internal helper which returns a mutable map. */ + private Map getAllFieldsMutable() { + final TreeMap result = + new TreeMap(); + final Descriptor descriptor = internalGetFieldAccessorTable().descriptor; + for (final FieldDescriptor field : descriptor.getFields()) { + if (field.isRepeated()) { + final List value = (List) getField(field); + if (!value.isEmpty()) { + result.put(field, value); + } + } else { + if (hasField(field)) { + result.put(field, getField(field)); + } + } + } + return result; + } + + public Message.Builder newBuilderForField( + final FieldDescriptor field) { + return internalGetFieldAccessorTable().getField(field).newBuilder(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean hasField(final FieldDescriptor field) { + return internalGetFieldAccessorTable().getField(field).has(this); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Object getField(final FieldDescriptor field) { + Object object = internalGetFieldAccessorTable().getField(field).get(this); + if (field.isRepeated()) { + // The underlying list object is still modifiable at this point. + // Make sure not to expose the modifiable list to the caller. + return Collections.unmodifiableList((List) object); + } else { + return object; + } + } + + public BuilderType setField(final FieldDescriptor field, + final Object value) { + internalGetFieldAccessorTable().getField(field).set(this, value); + return (BuilderType) this; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public BuilderType clearField(final FieldDescriptor field) { + internalGetFieldAccessorTable().getField(field).clear(this); + return (BuilderType) this; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public int getRepeatedFieldCount(final FieldDescriptor field) { + return internalGetFieldAccessorTable().getField(field) + .getRepeatedCount(this); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Object getRepeatedField(final FieldDescriptor field, + final int index) { + return internalGetFieldAccessorTable().getField(field) + .getRepeated(this, index); + } + + public BuilderType setRepeatedField(final FieldDescriptor field, + final int index, final Object value) { + internalGetFieldAccessorTable().getField(field) + .setRepeated(this, index, value); + return (BuilderType) this; + } + + public BuilderType addRepeatedField(final FieldDescriptor field, + final Object value) { + internalGetFieldAccessorTable().getField(field).addRepeated(this, value); + return (BuilderType) this; + } + + public final BuilderType setUnknownFields( + final UnknownFieldSet unknownFields) { + this.unknownFields = unknownFields; + onChanged(); + return (BuilderType) this; + } + + @Override + public final BuilderType mergeUnknownFields( + final UnknownFieldSet unknownFields) { + this.unknownFields = + UnknownFieldSet.newBuilder(this.unknownFields) + .mergeFrom(unknownFields) + .build(); + onChanged(); + return (BuilderType) this; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean isInitialized() { + for (final FieldDescriptor field : getDescriptorForType().getFields()) { + // Check that all required fields are present. + if (field.isRequired()) { + if (!hasField(field)) { + return false; + } + } + // Check that embedded messages are initialized. + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + if (field.isRepeated()) { + @SuppressWarnings("unchecked") final + List messageList = (List) getField(field); + for (final Message element : messageList) { + if (!element.isInitialized()) { + return false; + } + } + } else { + if (hasField(field) && + !((Message) getField(field)).isInitialized()) { + return false; + } + } + } + } + return true; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final UnknownFieldSet getUnknownFields() { + return unknownFields; + } + + /** + * Called by subclasses to parse an unknown field. + * @return {@code true} unless the tag is an end-group tag. + */ + protected boolean parseUnknownField( + final CodedInputStream input, + final UnknownFieldSet.Builder unknownFields, + final ExtensionRegistryLite extensionRegistry, + final int tag) throws IOException { + return unknownFields.mergeFieldFrom(tag, input); + } + + /** + * Implementation of {@link BuilderParent} for giving to our children. This + * small inner class makes it so we don't publicly expose the BuilderParent + * methods. + */ + private class BuilderParentImpl implements BuilderParent { + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void markDirty() { + onChanged(); + } + } + + /** + * Gets the {@link BuilderParent} for giving to our children. + * @return The builder parent for our children. + */ + protected BuilderParent getParentForChildren() { + if (meAsParent == null) { + meAsParent = new BuilderParentImpl(); + } + return meAsParent; + } + + /** + * Called when a the builder or one of its nested children has changed + * and any parent should be notified of its invalidation. + */ + protected final void onChanged() { + if (isClean && builderParent != null) { + builderParent.markDirty(); + + // Don't keep dispatching invalidations until build is called again. + isClean = false; + } + } + } + + // ================================================================= + // Extensions-related stuff + + public interface ExtendableMessageOrBuilder< + MessageType extends ExtendableMessage> extends MessageOrBuilder { + + /** Check if a singular extension is present. */ + boolean hasExtension( + GeneratedExtension extension); + + /** Get the number of elements in a repeated extension. */ + int getExtensionCount( + GeneratedExtension> extension); + + /** Get the value of an extension. */ + Type getExtension(GeneratedExtension extension); + + /** Get one element of a repeated extension. */ + Type getExtension( + GeneratedExtension> extension, + int index); + } + + /** + * Generated message classes for message types that contain extension ranges + * subclass this. + * + *

This class implements type-safe accessors for extensions. They + * implement all the same operations that you can do with normal fields -- + * e.g. "has", "get", and "getCount" -- but for extensions. The extensions + * are identified using instances of the class {@link GeneratedExtension}; + * the protocol compiler generates a static instance of this class for every + * extension in its input. Through the magic of generics, all is made + * type-safe. + * + *

For example, imagine you have the {@code .proto} file: + * + *

+   * option java_class = "MyProto";
+   *
+   * message Foo {
+   *   extensions 1000 to max;
+   * }
+   *
+   * extend Foo {
+   *   optional int32 bar;
+   * }
+   * 
+ * + *

Then you might write code like: + * + *

+   * MyProto.Foo foo = getFoo();
+   * int i = foo.getExtension(MyProto.bar);
+   * 
+ * + *

See also {@link ExtendableBuilder}. + */ + public abstract static class ExtendableMessage< + MessageType extends ExtendableMessage> + extends GeneratedMessage + implements ExtendableMessageOrBuilder { + + private final FieldSet extensions; + + protected ExtendableMessage() { + this.extensions = FieldSet.newFieldSet(); + } + + protected ExtendableMessage( + ExtendableBuilder builder) { + super(builder); + this.extensions = builder.buildExtensions(); + } + + private void verifyExtensionContainingType( + final GeneratedExtension extension) { + if (extension.getDescriptor().getContainingType() != + getDescriptorForType()) { + // This can only happen if someone uses unchecked operations. + throw new IllegalArgumentException( + "Extension is for type \"" + + extension.getDescriptor().getContainingType().getFullName() + + "\" which does not match message type \"" + + getDescriptorForType().getFullName() + "\"."); + } + } + + /** Check if a singular extension is present. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final boolean hasExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + return extensions.hasField(extension.getDescriptor()); + } + + /** Get the number of elements in a repeated extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final int getExtensionCount( + final GeneratedExtension> extension) { + verifyExtensionContainingType(extension); + final FieldDescriptor descriptor = extension.getDescriptor(); + return extensions.getRepeatedFieldCount(descriptor); + } + + /** Get the value of an extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + @SuppressWarnings("unchecked") + public final Type getExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + FieldDescriptor descriptor = extension.getDescriptor(); + final Object value = extensions.getField(descriptor); + if (value == null) { + if (descriptor.isRepeated()) { + return (Type) Collections.emptyList(); + } else if (descriptor.getJavaType() == + FieldDescriptor.JavaType.MESSAGE) { + return (Type) extension.getMessageDefaultInstance(); + } else { + return (Type) extension.fromReflectionType( + descriptor.getDefaultValue()); + } + } else { + return (Type) extension.fromReflectionType(value); + } + } + + /** Get one element of a repeated extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + @SuppressWarnings("unchecked") + public final Type getExtension( + final GeneratedExtension> extension, + final int index) { + verifyExtensionContainingType(extension); + FieldDescriptor descriptor = extension.getDescriptor(); + return (Type) extension.singularFromReflectionType( + extensions.getRepeatedField(descriptor, index)); + } + + /** Called by subclasses to check if all extensions are initialized. */ + protected boolean extensionsAreInitialized() { + return extensions.isInitialized(); + } + + @Override + public boolean isInitialized() { + return super.isInitialized() && extensionsAreInitialized(); + } + + /** + * Used by subclasses to serialize extensions. Extension ranges may be + * interleaved with field numbers, but we must write them in canonical + * (sorted by field number) order. ExtensionWriter helps us write + * individual ranges of extensions at once. + */ + protected class ExtensionWriter { + // Imagine how much simpler this code would be if Java iterators had + // a way to get the next element without advancing the iterator. + + private final Iterator> iter = + extensions.iterator(); + private Map.Entry next; + private final boolean messageSetWireFormat; + + private ExtensionWriter(final boolean messageSetWireFormat) { + if (iter.hasNext()) { + next = iter.next(); + } + this.messageSetWireFormat = messageSetWireFormat; + } + + public void writeUntil(final int end, final CodedOutputStream output) + throws IOException { + while (next != null && next.getKey().getNumber() < end) { + FieldDescriptor descriptor = next.getKey(); + if (messageSetWireFormat && descriptor.getLiteJavaType() == + WireFormat.JavaType.MESSAGE && + !descriptor.isRepeated()) { + output.writeMessageSetExtension(descriptor.getNumber(), + (Message) next.getValue()); + } else { + FieldSet.writeField(descriptor, next.getValue(), output); + } + if (iter.hasNext()) { + next = iter.next(); + } else { + next = null; + } + } + } + } + + protected ExtensionWriter newExtensionWriter() { + return new ExtensionWriter(false); + } + protected ExtensionWriter newMessageSetExtensionWriter() { + return new ExtensionWriter(true); + } + + /** Called by subclasses to compute the size of extensions. */ + protected int extensionsSerializedSize() { + return extensions.getSerializedSize(); + } + protected int extensionsSerializedSizeAsMessageSet() { + return extensions.getMessageSetSerializedSize(); + } + + // --------------------------------------------------------------- + // Reflection + + protected Map getExtensionFields() { + return extensions.getAllFields(); + } + + @Override + public Map getAllFields() { + final Map result = super.getAllFieldsMutable(); + result.putAll(getExtensionFields()); + return Collections.unmodifiableMap(result); + } + + @Override + public boolean hasField(final FieldDescriptor field) { + if (field.isExtension()) { + verifyContainingType(field); + return extensions.hasField(field); + } else { + return super.hasField(field); + } + } + + @Override + public Object getField(final FieldDescriptor field) { + if (field.isExtension()) { + verifyContainingType(field); + final Object value = extensions.getField(field); + if (value == null) { + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + // Lacking an ExtensionRegistry, we have no way to determine the + // extension's real type, so we return a DynamicMessage. + return DynamicMessage.getDefaultInstance(field.getMessageType()); + } else { + return field.getDefaultValue(); + } + } else { + return value; + } + } else { + return super.getField(field); + } + } + + @Override + public int getRepeatedFieldCount(final FieldDescriptor field) { + if (field.isExtension()) { + verifyContainingType(field); + return extensions.getRepeatedFieldCount(field); + } else { + return super.getRepeatedFieldCount(field); + } + } + + @Override + public Object getRepeatedField(final FieldDescriptor field, + final int index) { + if (field.isExtension()) { + verifyContainingType(field); + return extensions.getRepeatedField(field, index); + } else { + return super.getRepeatedField(field, index); + } + } + + private void verifyContainingType(final FieldDescriptor field) { + if (field.getContainingType() != getDescriptorForType()) { + throw new IllegalArgumentException( + "FieldDescriptor does not match message type."); + } + } + } + + /** + * Generated message builders for message types that contain extension ranges + * subclass this. + * + *

This class implements type-safe accessors for extensions. They + * implement all the same operations that you can do with normal fields -- + * e.g. "get", "set", and "add" -- but for extensions. The extensions are + * identified using instances of the class {@link GeneratedExtension}; the + * protocol compiler generates a static instance of this class for every + * extension in its input. Through the magic of generics, all is made + * type-safe. + * + *

For example, imagine you have the {@code .proto} file: + * + *

+   * option java_class = "MyProto";
+   *
+   * message Foo {
+   *   extensions 1000 to max;
+   * }
+   *
+   * extend Foo {
+   *   optional int32 bar;
+   * }
+   * 
+ * + *

Then you might write code like: + * + *

+   * MyProto.Foo foo =
+   *   MyProto.Foo.newBuilder()
+   *     .setExtension(MyProto.bar, 123)
+   *     .build();
+   * 
+ * + *

See also {@link ExtendableMessage}. + */ + @SuppressWarnings("unchecked") + public abstract static class ExtendableBuilder< + MessageType extends ExtendableMessage, + BuilderType extends ExtendableBuilder> + extends Builder + implements ExtendableMessageOrBuilder { + + private FieldSet extensions = FieldSet.emptySet(); + + protected ExtendableBuilder() {} + + protected ExtendableBuilder( + BuilderParent parent) { + super(parent); + } + + @Override + public BuilderType clear() { + extensions = FieldSet.emptySet(); + return super.clear(); + } + + // This is implemented here only to work around an apparent bug in the + // Java compiler and/or build system. See bug #1898463. The mere presence + // of this dummy clone() implementation makes it go away. + @Override + public BuilderType clone() { + throw new UnsupportedOperationException( + "This is supposed to be overridden by subclasses."); + } + + private void ensureExtensionsIsMutable() { + if (extensions.isImmutable()) { + extensions = extensions.clone(); + } + } + + private void verifyExtensionContainingType( + final GeneratedExtension extension) { + if (extension.getDescriptor().getContainingType() != + getDescriptorForType()) { + // This can only happen if someone uses unchecked operations. + throw new IllegalArgumentException( + "Extension is for type \"" + + extension.getDescriptor().getContainingType().getFullName() + + "\" which does not match message type \"" + + getDescriptorForType().getFullName() + "\"."); + } + } + + /** Check if a singular extension is present. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final boolean hasExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + return extensions.hasField(extension.getDescriptor()); + } + + /** Get the number of elements in a repeated extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final int getExtensionCount( + final GeneratedExtension> extension) { + verifyExtensionContainingType(extension); + final FieldDescriptor descriptor = extension.getDescriptor(); + return extensions.getRepeatedFieldCount(descriptor); + } + + /** Get the value of an extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final Type getExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + FieldDescriptor descriptor = extension.getDescriptor(); + final Object value = extensions.getField(descriptor); + if (value == null) { + if (descriptor.isRepeated()) { + return (Type) Collections.emptyList(); + } else if (descriptor.getJavaType() == + FieldDescriptor.JavaType.MESSAGE) { + return (Type) extension.getMessageDefaultInstance(); + } else { + return (Type) extension.fromReflectionType( + descriptor.getDefaultValue()); + } + } else { + return (Type) extension.fromReflectionType(value); + } + } + + /** Get one element of a repeated extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final Type getExtension( + final GeneratedExtension> extension, + final int index) { + verifyExtensionContainingType(extension); + FieldDescriptor descriptor = extension.getDescriptor(); + return (Type) extension.singularFromReflectionType( + extensions.getRepeatedField(descriptor, index)); + } + + /** Set the value of an extension. */ + public final BuilderType setExtension( + final GeneratedExtension extension, + final Type value) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + final FieldDescriptor descriptor = extension.getDescriptor(); + extensions.setField(descriptor, extension.toReflectionType(value)); + onChanged(); + return (BuilderType) this; + } + + /** Set the value of one element of a repeated extension. */ + public final BuilderType setExtension( + final GeneratedExtension> extension, + final int index, final Type value) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + final FieldDescriptor descriptor = extension.getDescriptor(); + extensions.setRepeatedField( + descriptor, index, + extension.singularToReflectionType(value)); + onChanged(); + return (BuilderType) this; + } + + /** Append a value to a repeated extension. */ + public final BuilderType addExtension( + final GeneratedExtension> extension, + final Type value) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + final FieldDescriptor descriptor = extension.getDescriptor(); + extensions.addRepeatedField( + descriptor, extension.singularToReflectionType(value)); + onChanged(); + return (BuilderType) this; + } + + /** Clear an extension. */ + public final BuilderType clearExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + extensions.clearField(extension.getDescriptor()); + onChanged(); + return (BuilderType) this; + } + + /** Called by subclasses to check if all extensions are initialized. */ + protected boolean extensionsAreInitialized() { + return extensions.isInitialized(); + } + + /** + * Called by the build code path to create a copy of the extensions for + * building the message. + */ + private FieldSet buildExtensions() { + extensions.makeImmutable(); + return extensions; + } + + @Override + public boolean isInitialized() { + return super.isInitialized() && extensionsAreInitialized(); + } + + /** + * Called by subclasses to parse an unknown field or an extension. + * @return {@code true} unless the tag is an end-group tag. + */ + @Override + protected boolean parseUnknownField( + final CodedInputStream input, + final UnknownFieldSet.Builder unknownFields, + final ExtensionRegistryLite extensionRegistry, + final int tag) throws IOException { + return AbstractMessage.Builder.mergeFieldFrom( + input, unknownFields, extensionRegistry, this, tag); + } + + // --------------------------------------------------------------- + // Reflection + + @Override + public Map getAllFields() { + final Map result = super.getAllFieldsMutable(); + result.putAll(extensions.getAllFields()); + return Collections.unmodifiableMap(result); + } + + @Override + public Object getField(final FieldDescriptor field) { + if (field.isExtension()) { + verifyContainingType(field); + final Object value = extensions.getField(field); + if (value == null) { + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + // Lacking an ExtensionRegistry, we have no way to determine the + // extension's real type, so we return a DynamicMessage. + return DynamicMessage.getDefaultInstance(field.getMessageType()); + } else { + return field.getDefaultValue(); + } + } else { + return value; + } + } else { + return super.getField(field); + } + } + + @Override + public int getRepeatedFieldCount(final FieldDescriptor field) { + if (field.isExtension()) { + verifyContainingType(field); + return extensions.getRepeatedFieldCount(field); + } else { + return super.getRepeatedFieldCount(field); + } + } + + @Override + public Object getRepeatedField(final FieldDescriptor field, + final int index) { + if (field.isExtension()) { + verifyContainingType(field); + return extensions.getRepeatedField(field, index); + } else { + return super.getRepeatedField(field, index); + } + } + + @Override + public boolean hasField(final FieldDescriptor field) { + if (field.isExtension()) { + verifyContainingType(field); + return extensions.hasField(field); + } else { + return super.hasField(field); + } + } + + @Override + public BuilderType setField(final FieldDescriptor field, + final Object value) { + if (field.isExtension()) { + verifyContainingType(field); + ensureExtensionsIsMutable(); + extensions.setField(field, value); + onChanged(); + return (BuilderType) this; + } else { + return super.setField(field, value); + } + } + + @Override + public BuilderType clearField(final FieldDescriptor field) { + if (field.isExtension()) { + verifyContainingType(field); + ensureExtensionsIsMutable(); + extensions.clearField(field); + onChanged(); + return (BuilderType) this; + } else { + return super.clearField(field); + } + } + + @Override + public BuilderType setRepeatedField(final FieldDescriptor field, + final int index, final Object value) { + if (field.isExtension()) { + verifyContainingType(field); + ensureExtensionsIsMutable(); + extensions.setRepeatedField(field, index, value); + onChanged(); + return (BuilderType) this; + } else { + return super.setRepeatedField(field, index, value); + } + } + + @Override + public BuilderType addRepeatedField(final FieldDescriptor field, + final Object value) { + if (field.isExtension()) { + verifyContainingType(field); + ensureExtensionsIsMutable(); + extensions.addRepeatedField(field, value); + onChanged(); + return (BuilderType) this; + } else { + return super.addRepeatedField(field, value); + } + } + + protected final void mergeExtensionFields(final ExtendableMessage other) { + ensureExtensionsIsMutable(); + extensions.mergeFrom(other.extensions); + onChanged(); + } + + private void verifyContainingType(final FieldDescriptor field) { + if (field.getContainingType() != getDescriptorForType()) { + throw new IllegalArgumentException( + "FieldDescriptor does not match message type."); + } + } + } + + // ----------------------------------------------------------------- + + /** + * Gets the descriptor for an extension. The implementation depends on whether + * the extension is scoped in the top level of a file or scoped in a Message. + */ + private static interface ExtensionDescriptorRetriever { + FieldDescriptor getDescriptor(); + } + + /** For use by generated code only. */ + public static + GeneratedExtension + newMessageScopedGeneratedExtension(final Message scope, + final int descriptorIndex, + final Class singularType, + final Message defaultInstance) { + // For extensions scoped within a Message, we use the Message to resolve + // the outer class's descriptor, from which the extension descriptor is + // obtained. + return new GeneratedExtension( + new ExtensionDescriptorRetriever() { + //@Override (Java 1.6 override semantics, but we must support 1.5) + public FieldDescriptor getDescriptor() { + return scope.getDescriptorForType().getExtensions() + .get(descriptorIndex); + } + }, + singularType, + defaultInstance); + } + + /** For use by generated code only. */ + public static + GeneratedExtension + newFileScopedGeneratedExtension(final Class singularType, + final Message defaultInstance) { + // For extensions scoped within a file, we rely on the outer class's + // static initializer to call internalInit() on the extension when the + // descriptor is available. + return new GeneratedExtension( + null, // ExtensionDescriptorRetriever is initialized in internalInit(); + singularType, + defaultInstance); + } + + /** + * Type used to represent generated extensions. The protocol compiler + * generates a static singleton instance of this class for each extension. + * + *

For example, imagine you have the {@code .proto} file: + * + *

+   * option java_class = "MyProto";
+   *
+   * message Foo {
+   *   extensions 1000 to max;
+   * }
+   *
+   * extend Foo {
+   *   optional int32 bar;
+   * }
+   * 
+ * + *

Then, {@code MyProto.Foo.bar} has type + * {@code GeneratedExtension}. + * + *

In general, users should ignore the details of this type, and simply use + * these static singletons as parameters to the extension accessors defined + * in {@link ExtendableMessage} and {@link ExtendableBuilder}. + */ + public static final class GeneratedExtension< + ContainingType extends Message, Type> { + // TODO(kenton): Find ways to avoid using Java reflection within this + // class. Also try to avoid suppressing unchecked warnings. + + // We can't always initialize the descriptor of a GeneratedExtension when + // we first construct it due to initialization order difficulties (namely, + // the descriptor may not have been constructed yet, since it is often + // constructed by the initializer of a separate module). + // + // In the case of nested extensions, we initialize the + // ExtensionDescriptorRetriever with an instance that uses the scoping + // Message's default instance to retrieve the extension's descriptor. + // + // In the case of non-nested extensions, we initialize the + // ExtensionDescriptorRetriever to null and rely on the outer class's static + // initializer to call internalInit() after the descriptor has been parsed. + private GeneratedExtension(ExtensionDescriptorRetriever descriptorRetriever, + Class singularType, + Message messageDefaultInstance) { + if (Message.class.isAssignableFrom(singularType) && + !singularType.isInstance(messageDefaultInstance)) { + throw new IllegalArgumentException( + "Bad messageDefaultInstance for " + singularType.getName()); + } + this.descriptorRetriever = descriptorRetriever; + this.singularType = singularType; + this.messageDefaultInstance = messageDefaultInstance; + + if (ProtocolMessageEnum.class.isAssignableFrom(singularType)) { + this.enumValueOf = getMethodOrDie(singularType, "valueOf", + EnumValueDescriptor.class); + this.enumGetValueDescriptor = + getMethodOrDie(singularType, "getValueDescriptor"); + } else { + this.enumValueOf = null; + this.enumGetValueDescriptor = null; + } + } + + /** For use by generated code only. */ + public void internalInit(final FieldDescriptor descriptor) { + if (descriptorRetriever != null) { + throw new IllegalStateException("Already initialized."); + } + descriptorRetriever = new ExtensionDescriptorRetriever() { + //@Override (Java 1.6 override semantics, but we must support 1.5) + public FieldDescriptor getDescriptor() { + return descriptor; + } + }; + } + + private ExtensionDescriptorRetriever descriptorRetriever; + private final Class singularType; + private final Message messageDefaultInstance; + private final Method enumValueOf; + private final Method enumGetValueDescriptor; + + public FieldDescriptor getDescriptor() { + if (descriptorRetriever == null) { + throw new IllegalStateException( + "getDescriptor() called before internalInit()"); + } + return descriptorRetriever.getDescriptor(); + } + + /** + * If the extension is an embedded message or group, returns the default + * instance of the message. + */ + public Message getMessageDefaultInstance() { + return messageDefaultInstance; + } + + /** + * Convert from the type used by the reflection accessors to the type used + * by native accessors. E.g., for enums, the reflection accessors use + * EnumValueDescriptors but the native accessors use the generated enum + * type. + */ + @SuppressWarnings("unchecked") + private Object fromReflectionType(final Object value) { + FieldDescriptor descriptor = getDescriptor(); + if (descriptor.isRepeated()) { + if (descriptor.getJavaType() == FieldDescriptor.JavaType.MESSAGE || + descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) { + // Must convert the whole list. + final List result = new ArrayList(); + for (final Object element : (List) value) { + result.add(singularFromReflectionType(element)); + } + return result; + } else { + return value; + } + } else { + return singularFromReflectionType(value); + } + } + + /** + * Like {@link #fromReflectionType(Object)}, but if the type is a repeated + * type, this converts a single element. + */ + private Object singularFromReflectionType(final Object value) { + FieldDescriptor descriptor = getDescriptor(); + switch (descriptor.getJavaType()) { + case MESSAGE: + if (singularType.isInstance(value)) { + return value; + } else { + // It seems the copy of the embedded message stored inside the + // extended message is not of the exact type the user was + // expecting. This can happen if a user defines a + // GeneratedExtension manually and gives it a different type. + // This should not happen in normal use. But, to be nice, we'll + // copy the message to whatever type the caller was expecting. + return messageDefaultInstance.newBuilderForType() + .mergeFrom((Message) value).build(); + } + case ENUM: + return invokeOrDie(enumValueOf, null, (EnumValueDescriptor) value); + default: + return value; + } + } + + /** + * Convert from the type used by the native accessors to the type used + * by reflection accessors. E.g., for enums, the reflection accessors use + * EnumValueDescriptors but the native accessors use the generated enum + * type. + */ + @SuppressWarnings("unchecked") + private Object toReflectionType(final Object value) { + FieldDescriptor descriptor = getDescriptor(); + if (descriptor.isRepeated()) { + if (descriptor.getJavaType() == FieldDescriptor.JavaType.ENUM) { + // Must convert the whole list. + final List result = new ArrayList(); + for (final Object element : (List) value) { + result.add(singularToReflectionType(element)); + } + return result; + } else { + return value; + } + } else { + return singularToReflectionType(value); + } + } + + /** + * Like {@link #toReflectionType(Object)}, but if the type is a repeated + * type, this converts a single element. + */ + private Object singularToReflectionType(final Object value) { + FieldDescriptor descriptor = getDescriptor(); + switch (descriptor.getJavaType()) { + case ENUM: + return invokeOrDie(enumGetValueDescriptor, value); + default: + return value; + } + } + } + + // ================================================================= + + /** Calls Class.getMethod and throws a RuntimeException if it fails. */ + @SuppressWarnings("unchecked") + private static Method getMethodOrDie( + final Class clazz, final String name, final Class... params) { + try { + return clazz.getMethod(name, params); + } catch (NoSuchMethodException e) { + throw new RuntimeException( + "Generated message class \"" + clazz.getName() + + "\" missing method \"" + name + "\".", e); + } + } + + /** Calls invoke and throws a RuntimeException if it fails. */ + private static Object invokeOrDie( + final Method method, final Object object, final Object... params) { + try { + return method.invoke(object, params); + } catch (IllegalAccessException e) { + throw new RuntimeException( + "Couldn't use Java reflection to implement protocol message " + + "reflection.", e); + } catch (InvocationTargetException e) { + final Throwable cause = e.getCause(); + if (cause instanceof RuntimeException) { + throw (RuntimeException) cause; + } else if (cause instanceof Error) { + throw (Error) cause; + } else { + throw new RuntimeException( + "Unexpected exception thrown by generated accessor method.", cause); + } + } + } + + /** + * Users should ignore this class. This class provides the implementation + * with access to the fields of a message object using Java reflection. + */ + public static final class FieldAccessorTable { + + /** + * Construct a FieldAccessorTable for a particular message class. Only + * one FieldAccessorTable should ever be constructed per class. + * + * @param descriptor The type's descriptor. + * @param camelCaseNames The camelcase names of all fields in the message. + * These are used to derive the accessor method names. + * @param messageClass The message type. + * @param builderClass The builder type. + */ + public FieldAccessorTable( + final Descriptor descriptor, + final String[] camelCaseNames, + final Class messageClass, + final Class builderClass) { + this.descriptor = descriptor; + fields = new FieldAccessor[descriptor.getFields().size()]; + + for (int i = 0; i < fields.length; i++) { + final FieldDescriptor field = descriptor.getFields().get(i); + if (field.isRepeated()) { + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + fields[i] = new RepeatedMessageFieldAccessor( + field, camelCaseNames[i], messageClass, builderClass); + } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) { + fields[i] = new RepeatedEnumFieldAccessor( + field, camelCaseNames[i], messageClass, builderClass); + } else { + fields[i] = new RepeatedFieldAccessor( + field, camelCaseNames[i], messageClass, builderClass); + } + } else { + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + fields[i] = new SingularMessageFieldAccessor( + field, camelCaseNames[i], messageClass, builderClass); + } else if (field.getJavaType() == FieldDescriptor.JavaType.ENUM) { + fields[i] = new SingularEnumFieldAccessor( + field, camelCaseNames[i], messageClass, builderClass); + } else { + fields[i] = new SingularFieldAccessor( + field, camelCaseNames[i], messageClass, builderClass); + } + } + } + } + + private final Descriptor descriptor; + private final FieldAccessor[] fields; + + /** Get the FieldAccessor for a particular field. */ + private FieldAccessor getField(final FieldDescriptor field) { + if (field.getContainingType() != descriptor) { + throw new IllegalArgumentException( + "FieldDescriptor does not match message type."); + } else if (field.isExtension()) { + // If this type had extensions, it would subclass ExtendableMessage, + // which overrides the reflection interface to handle extensions. + throw new IllegalArgumentException( + "This type does not have extensions."); + } + return fields[field.getIndex()]; + } + + /** + * Abstract interface that provides access to a single field. This is + * implemented differently depending on the field type and cardinality. + */ + private interface FieldAccessor { + Object get(GeneratedMessage message); + Object get(GeneratedMessage.Builder builder); + void set(Builder builder, Object value); + Object getRepeated(GeneratedMessage message, int index); + Object getRepeated(GeneratedMessage.Builder builder, int index); + void setRepeated(Builder builder, + int index, Object value); + void addRepeated(Builder builder, Object value); + boolean has(GeneratedMessage message); + boolean has(GeneratedMessage.Builder builder); + int getRepeatedCount(GeneratedMessage message); + int getRepeatedCount(GeneratedMessage.Builder builder); + void clear(Builder builder); + Message.Builder newBuilder(); + } + + // --------------------------------------------------------------- + + private static class SingularFieldAccessor implements FieldAccessor { + SingularFieldAccessor( + final FieldDescriptor descriptor, final String camelCaseName, + final Class messageClass, + final Class builderClass) { + getMethod = getMethodOrDie(messageClass, "get" + camelCaseName); + getMethodBuilder = getMethodOrDie(builderClass, "get" + camelCaseName); + type = getMethod.getReturnType(); + setMethod = getMethodOrDie(builderClass, "set" + camelCaseName, type); + hasMethod = + getMethodOrDie(messageClass, "has" + camelCaseName); + hasMethodBuilder = + getMethodOrDie(builderClass, "has" + camelCaseName); + clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName); + } + + // Note: We use Java reflection to call public methods rather than + // access private fields directly as this avoids runtime security + // checks. + protected final Class type; + protected final Method getMethod; + protected final Method getMethodBuilder; + protected final Method setMethod; + protected final Method hasMethod; + protected final Method hasMethodBuilder; + protected final Method clearMethod; + + public Object get(final GeneratedMessage message) { + return invokeOrDie(getMethod, message); + } + public Object get(GeneratedMessage.Builder builder) { + return invokeOrDie(getMethodBuilder, builder); + } + public void set(final Builder builder, final Object value) { + invokeOrDie(setMethod, builder, value); + } + public Object getRepeated(final GeneratedMessage message, + final int index) { + throw new UnsupportedOperationException( + "getRepeatedField() called on a singular field."); + } + public Object getRepeated(GeneratedMessage.Builder builder, int index) { + throw new UnsupportedOperationException( + "getRepeatedField() called on a singular field."); + } + public void setRepeated(final Builder builder, + final int index, final Object value) { + throw new UnsupportedOperationException( + "setRepeatedField() called on a singular field."); + } + public void addRepeated(final Builder builder, final Object value) { + throw new UnsupportedOperationException( + "addRepeatedField() called on a singular field."); + } + public boolean has(final GeneratedMessage message) { + return (Boolean) invokeOrDie(hasMethod, message); + } + public boolean has(GeneratedMessage.Builder builder) { + return (Boolean) invokeOrDie(hasMethodBuilder, builder); + } + public int getRepeatedCount(final GeneratedMessage message) { + throw new UnsupportedOperationException( + "getRepeatedFieldSize() called on a singular field."); + } + public int getRepeatedCount(GeneratedMessage.Builder builder) { + throw new UnsupportedOperationException( + "getRepeatedFieldSize() called on a singular field."); + } + public void clear(final Builder builder) { + invokeOrDie(clearMethod, builder); + } + public Message.Builder newBuilder() { + throw new UnsupportedOperationException( + "newBuilderForField() called on a non-Message type."); + } + } + + private static class RepeatedFieldAccessor implements FieldAccessor { + protected final Class type; + protected final Method getMethod; + protected final Method getMethodBuilder; + protected final Method getRepeatedMethod; + protected final Method getRepeatedMethodBuilder; + protected final Method setRepeatedMethod; + protected final Method addRepeatedMethod; + protected final Method getCountMethod; + protected final Method getCountMethodBuilder; + protected final Method clearMethod; + + RepeatedFieldAccessor( + final FieldDescriptor descriptor, final String camelCaseName, + final Class messageClass, + final Class builderClass) { + getMethod = getMethodOrDie(messageClass, + "get" + camelCaseName + "List"); + getMethodBuilder = getMethodOrDie(builderClass, + "get" + camelCaseName + "List"); + + + getRepeatedMethod = + getMethodOrDie(messageClass, "get" + camelCaseName, Integer.TYPE); + getRepeatedMethodBuilder = + getMethodOrDie(builderClass, "get" + camelCaseName, Integer.TYPE); + type = getRepeatedMethod.getReturnType(); + setRepeatedMethod = + getMethodOrDie(builderClass, "set" + camelCaseName, + Integer.TYPE, type); + addRepeatedMethod = + getMethodOrDie(builderClass, "add" + camelCaseName, type); + getCountMethod = + getMethodOrDie(messageClass, "get" + camelCaseName + "Count"); + getCountMethodBuilder = + getMethodOrDie(builderClass, "get" + camelCaseName + "Count"); + + clearMethod = getMethodOrDie(builderClass, "clear" + camelCaseName); + } + + public Object get(final GeneratedMessage message) { + return invokeOrDie(getMethod, message); + } + public Object get(GeneratedMessage.Builder builder) { + return invokeOrDie(getMethodBuilder, builder); + } + public void set(final Builder builder, final Object value) { + // Add all the elements individually. This serves two purposes: + // 1) Verifies that each element has the correct type. + // 2) Insures that the caller cannot modify the list later on and + // have the modifications be reflected in the message. + clear(builder); + for (final Object element : (List) value) { + addRepeated(builder, element); + } + } + public Object getRepeated(final GeneratedMessage message, + final int index) { + return invokeOrDie(getRepeatedMethod, message, index); + } + public Object getRepeated(GeneratedMessage.Builder builder, int index) { + return invokeOrDie(getRepeatedMethodBuilder, builder, index); + } + public void setRepeated(final Builder builder, + final int index, final Object value) { + invokeOrDie(setRepeatedMethod, builder, index, value); + } + public void addRepeated(final Builder builder, final Object value) { + invokeOrDie(addRepeatedMethod, builder, value); + } + public boolean has(final GeneratedMessage message) { + throw new UnsupportedOperationException( + "hasField() called on a singular field."); + } + public boolean has(GeneratedMessage.Builder builder) { + throw new UnsupportedOperationException( + "hasField() called on a singular field."); + } + public int getRepeatedCount(final GeneratedMessage message) { + return (Integer) invokeOrDie(getCountMethod, message); + } + public int getRepeatedCount(GeneratedMessage.Builder builder) { + return (Integer) invokeOrDie(getCountMethodBuilder, builder); + } + public void clear(final Builder builder) { + invokeOrDie(clearMethod, builder); + } + public Message.Builder newBuilder() { + throw new UnsupportedOperationException( + "newBuilderForField() called on a non-Message type."); + } + } + + // --------------------------------------------------------------- + + private static final class SingularEnumFieldAccessor + extends SingularFieldAccessor { + SingularEnumFieldAccessor( + final FieldDescriptor descriptor, final String camelCaseName, + final Class messageClass, + final Class builderClass) { + super(descriptor, camelCaseName, messageClass, builderClass); + + valueOfMethod = getMethodOrDie(type, "valueOf", + EnumValueDescriptor.class); + getValueDescriptorMethod = + getMethodOrDie(type, "getValueDescriptor"); + } + + private Method valueOfMethod; + private Method getValueDescriptorMethod; + + @Override + public Object get(final GeneratedMessage message) { + return invokeOrDie(getValueDescriptorMethod, super.get(message)); + } + + @Override + public Object get(final GeneratedMessage.Builder builder) { + return invokeOrDie(getValueDescriptorMethod, super.get(builder)); + } + + @Override + public void set(final Builder builder, final Object value) { + super.set(builder, invokeOrDie(valueOfMethod, null, value)); + } + } + + private static final class RepeatedEnumFieldAccessor + extends RepeatedFieldAccessor { + RepeatedEnumFieldAccessor( + final FieldDescriptor descriptor, final String camelCaseName, + final Class messageClass, + final Class builderClass) { + super(descriptor, camelCaseName, messageClass, builderClass); + + valueOfMethod = getMethodOrDie(type, "valueOf", + EnumValueDescriptor.class); + getValueDescriptorMethod = + getMethodOrDie(type, "getValueDescriptor"); + } + + private final Method valueOfMethod; + private final Method getValueDescriptorMethod; + + @Override + @SuppressWarnings("unchecked") + public Object get(final GeneratedMessage message) { + final List newList = new ArrayList(); + for (final Object element : (List) super.get(message)) { + newList.add(invokeOrDie(getValueDescriptorMethod, element)); + } + return Collections.unmodifiableList(newList); + } + + @Override + @SuppressWarnings("unchecked") + public Object get(final GeneratedMessage.Builder builder) { + final List newList = new ArrayList(); + for (final Object element : (List) super.get(builder)) { + newList.add(invokeOrDie(getValueDescriptorMethod, element)); + } + return Collections.unmodifiableList(newList); + } + + @Override + public Object getRepeated(final GeneratedMessage message, + final int index) { + return invokeOrDie(getValueDescriptorMethod, + super.getRepeated(message, index)); + } + @Override + public Object getRepeated(final GeneratedMessage.Builder builder, + final int index) { + return invokeOrDie(getValueDescriptorMethod, + super.getRepeated(builder, index)); + } + @Override + public void setRepeated(final Builder builder, + final int index, final Object value) { + super.setRepeated(builder, index, invokeOrDie(valueOfMethod, null, + value)); + } + @Override + public void addRepeated(final Builder builder, final Object value) { + super.addRepeated(builder, invokeOrDie(valueOfMethod, null, value)); + } + } + + // --------------------------------------------------------------- + + private static final class SingularMessageFieldAccessor + extends SingularFieldAccessor { + SingularMessageFieldAccessor( + final FieldDescriptor descriptor, final String camelCaseName, + final Class messageClass, + final Class builderClass) { + super(descriptor, camelCaseName, messageClass, builderClass); + + newBuilderMethod = getMethodOrDie(type, "newBuilder"); + } + + private final Method newBuilderMethod; + + private Object coerceType(final Object value) { + if (type.isInstance(value)) { + return value; + } else { + // The value is not the exact right message type. However, if it + // is an alternative implementation of the same type -- e.g. a + // DynamicMessage -- we should accept it. In this case we can make + // a copy of the message. + return ((Message.Builder) invokeOrDie(newBuilderMethod, null)) + .mergeFrom((Message) value).build(); + } + } + + @Override + public void set(final Builder builder, final Object value) { + super.set(builder, coerceType(value)); + } + @Override + public Message.Builder newBuilder() { + return (Message.Builder) invokeOrDie(newBuilderMethod, null); + } + } + + private static final class RepeatedMessageFieldAccessor + extends RepeatedFieldAccessor { + RepeatedMessageFieldAccessor( + final FieldDescriptor descriptor, final String camelCaseName, + final Class messageClass, + final Class builderClass) { + super(descriptor, camelCaseName, messageClass, builderClass); + + newBuilderMethod = getMethodOrDie(type, "newBuilder"); + } + + private final Method newBuilderMethod; + + private Object coerceType(final Object value) { + if (type.isInstance(value)) { + return value; + } else { + // The value is not the exact right message type. However, if it + // is an alternative implementation of the same type -- e.g. a + // DynamicMessage -- we should accept it. In this case we can make + // a copy of the message. + return ((Message.Builder) invokeOrDie(newBuilderMethod, null)) + .mergeFrom((Message) value).build(); + } + } + + @Override + public void setRepeated(final Builder builder, + final int index, final Object value) { + super.setRepeated(builder, index, coerceType(value)); + } + @Override + public void addRepeated(final Builder builder, final Object value) { + super.addRepeated(builder, coerceType(value)); + } + @Override + public Message.Builder newBuilder() { + return (Message.Builder) invokeOrDie(newBuilderMethod, null); + } + } + } + + /** + * Replaces this object in the output stream with a serialized form. + * Part of Java's serialization magic. Generated sub-classes must override + * this method by calling return super.writeReplace(); + * @return a SerializedForm of this message + */ + protected Object writeReplace() throws ObjectStreamException { + return new GeneratedMessageLite.SerializedForm(this); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java new file mode 100644 index 000000000..1813e9b3e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java @@ -0,0 +1,731 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.io.IOException; +import java.io.ObjectStreamException; +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * Lite version of {@link GeneratedMessage}. + * + * @author kenton@google.com Kenton Varda + */ +public abstract class GeneratedMessageLite extends AbstractMessageLite + implements Serializable { + private static final long serialVersionUID = 1L; + + protected GeneratedMessageLite() { + } + + protected GeneratedMessageLite(Builder builder) { + } + + @SuppressWarnings("unchecked") + public abstract static class Builder + extends AbstractMessageLite.Builder { + protected Builder() {} + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public BuilderType clear() { + return (BuilderType) this; + } + + // This is implemented here only to work around an apparent bug in the + // Java compiler and/or build system. See bug #1898463. The mere presence + // of this dummy clone() implementation makes it go away. + @Override + public BuilderType clone() { + throw new UnsupportedOperationException( + "This is supposed to be overridden by subclasses."); + } + + /** All subclasses implement this. */ + public abstract BuilderType mergeFrom(MessageType message); + + // Defined here for return type covariance. + public abstract MessageType getDefaultInstanceForType(); + + /** + * Called by subclasses to parse an unknown field. + * @return {@code true} unless the tag is an end-group tag. + */ + protected boolean parseUnknownField( + final CodedInputStream input, + final ExtensionRegistryLite extensionRegistry, + final int tag) throws IOException { + return input.skipField(tag); + } + } + + // ================================================================= + // Extensions-related stuff + + /** + * Lite equivalent of {@link com.google.protobuf.GeneratedMessage.ExtendableMessageOrBuilder}. + */ + public interface ExtendableMessageOrBuilder< + MessageType extends ExtendableMessage> extends MessageLiteOrBuilder { + + /** Check if a singular extension is present. */ + boolean hasExtension( + GeneratedExtension extension); + + /** Get the number of elements in a repeated extension. */ + int getExtensionCount( + GeneratedExtension> extension); + + /** Get the value of an extension. */ + Type getExtension(GeneratedExtension extension); + + /** Get one element of a repeated extension. */ + Type getExtension( + GeneratedExtension> extension, + int index); + } + + /** + * Lite equivalent of {@link GeneratedMessage.ExtendableMessage}. + */ + public abstract static class ExtendableMessage< + MessageType extends ExtendableMessage> + extends GeneratedMessageLite + implements ExtendableMessageOrBuilder { + + private final FieldSet extensions; + + protected ExtendableMessage() { + this.extensions = FieldSet.newFieldSet(); + } + + protected ExtendableMessage(ExtendableBuilder builder) { + this.extensions = builder.buildExtensions(); + } + + private void verifyExtensionContainingType( + final GeneratedExtension extension) { + if (extension.getContainingTypeDefaultInstance() != + getDefaultInstanceForType()) { + // This can only happen if someone uses unchecked operations. + throw new IllegalArgumentException( + "This extension is for a different message type. Please make " + + "sure that you are not suppressing any generics type warnings."); + } + } + + /** Check if a singular extension is present. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final boolean hasExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + return extensions.hasField(extension.descriptor); + } + + /** Get the number of elements in a repeated extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final int getExtensionCount( + final GeneratedExtension> extension) { + verifyExtensionContainingType(extension); + return extensions.getRepeatedFieldCount(extension.descriptor); + } + + /** Get the value of an extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + @SuppressWarnings("unchecked") + public final Type getExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + final Object value = extensions.getField(extension.descriptor); + if (value == null) { + return extension.defaultValue; + } else { + return (Type) value; + } + } + + /** Get one element of a repeated extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + @SuppressWarnings("unchecked") + public final Type getExtension( + final GeneratedExtension> extension, + final int index) { + verifyExtensionContainingType(extension); + return (Type) extensions.getRepeatedField(extension.descriptor, index); + } + + /** Called by subclasses to check if all extensions are initialized. */ + protected boolean extensionsAreInitialized() { + return extensions.isInitialized(); + } + + /** + * Used by subclasses to serialize extensions. Extension ranges may be + * interleaved with field numbers, but we must write them in canonical + * (sorted by field number) order. ExtensionWriter helps us write + * individual ranges of extensions at once. + */ + protected class ExtensionWriter { + // Imagine how much simpler this code would be if Java iterators had + // a way to get the next element without advancing the iterator. + + private final Iterator> iter = + extensions.iterator(); + private Map.Entry next; + private final boolean messageSetWireFormat; + + private ExtensionWriter(boolean messageSetWireFormat) { + if (iter.hasNext()) { + next = iter.next(); + } + this.messageSetWireFormat = messageSetWireFormat; + } + + public void writeUntil(final int end, final CodedOutputStream output) + throws IOException { + while (next != null && next.getKey().getNumber() < end) { + ExtensionDescriptor extension = next.getKey(); + if (messageSetWireFormat && extension.getLiteJavaType() == + WireFormat.JavaType.MESSAGE && + !extension.isRepeated()) { + output.writeMessageSetExtension(extension.getNumber(), + (MessageLite) next.getValue()); + } else { + FieldSet.writeField(extension, next.getValue(), output); + } + if (iter.hasNext()) { + next = iter.next(); + } else { + next = null; + } + } + } + } + + protected ExtensionWriter newExtensionWriter() { + return new ExtensionWriter(false); + } + protected ExtensionWriter newMessageSetExtensionWriter() { + return new ExtensionWriter(true); + } + + /** Called by subclasses to compute the size of extensions. */ + protected int extensionsSerializedSize() { + return extensions.getSerializedSize(); + } + protected int extensionsSerializedSizeAsMessageSet() { + return extensions.getMessageSetSerializedSize(); + } + } + + /** + * Lite equivalent of {@link GeneratedMessage.ExtendableBuilder}. + */ + @SuppressWarnings("unchecked") + public abstract static class ExtendableBuilder< + MessageType extends ExtendableMessage, + BuilderType extends ExtendableBuilder> + extends Builder + implements ExtendableMessageOrBuilder { + protected ExtendableBuilder() {} + + private FieldSet extensions = FieldSet.emptySet(); + private boolean extensionsIsMutable; + + @Override + public BuilderType clear() { + extensions.clear(); + extensionsIsMutable = false; + return super.clear(); + } + + private void ensureExtensionsIsMutable() { + if (!extensionsIsMutable) { + extensions = extensions.clone(); + extensionsIsMutable = true; + } + } + + /** + * Called by the build code path to create a copy of the extensions for + * building the message. + */ + private FieldSet buildExtensions() { + extensions.makeImmutable(); + extensionsIsMutable = false; + return extensions; + } + + private void verifyExtensionContainingType( + final GeneratedExtension extension) { + if (extension.getContainingTypeDefaultInstance() != + getDefaultInstanceForType()) { + // This can only happen if someone uses unchecked operations. + throw new IllegalArgumentException( + "This extension is for a different message type. Please make " + + "sure that you are not suppressing any generics type warnings."); + } + } + + /** Check if a singular extension is present. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final boolean hasExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + return extensions.hasField(extension.descriptor); + } + + /** Get the number of elements in a repeated extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final int getExtensionCount( + final GeneratedExtension> extension) { + verifyExtensionContainingType(extension); + return extensions.getRepeatedFieldCount(extension.descriptor); + } + + /** Get the value of an extension. */ + //@Override (Java 1.6 override semantics, but we must support 1.5) + @SuppressWarnings("unchecked") + public final Type getExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + final Object value = extensions.getField(extension.descriptor); + if (value == null) { + return extension.defaultValue; + } else { + return (Type) value; + } + } + + /** Get one element of a repeated extension. */ + @SuppressWarnings("unchecked") + //@Override (Java 1.6 override semantics, but we must support 1.5) + public final Type getExtension( + final GeneratedExtension> extension, + final int index) { + verifyExtensionContainingType(extension); + return (Type) extensions.getRepeatedField(extension.descriptor, index); + } + + // This is implemented here only to work around an apparent bug in the + // Java compiler and/or build system. See bug #1898463. The mere presence + // of this dummy clone() implementation makes it go away. + @Override + public BuilderType clone() { + throw new UnsupportedOperationException( + "This is supposed to be overridden by subclasses."); + } + + /** Set the value of an extension. */ + public final BuilderType setExtension( + final GeneratedExtension extension, + final Type value) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + extensions.setField(extension.descriptor, value); + return (BuilderType) this; + } + + /** Set the value of one element of a repeated extension. */ + public final BuilderType setExtension( + final GeneratedExtension> extension, + final int index, final Type value) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + extensions.setRepeatedField(extension.descriptor, index, value); + return (BuilderType) this; + } + + /** Append a value to a repeated extension. */ + public final BuilderType addExtension( + final GeneratedExtension> extension, + final Type value) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + extensions.addRepeatedField(extension.descriptor, value); + return (BuilderType) this; + } + + /** Clear an extension. */ + public final BuilderType clearExtension( + final GeneratedExtension extension) { + verifyExtensionContainingType(extension); + ensureExtensionsIsMutable(); + extensions.clearField(extension.descriptor); + return (BuilderType) this; + } + + /** Called by subclasses to check if all extensions are initialized. */ + protected boolean extensionsAreInitialized() { + return extensions.isInitialized(); + } + + /** + * Called by subclasses to parse an unknown field or an extension. + * @return {@code true} unless the tag is an end-group tag. + */ + @Override + protected boolean parseUnknownField( + final CodedInputStream input, + final ExtensionRegistryLite extensionRegistry, + final int tag) throws IOException { + final int wireType = WireFormat.getTagWireType(tag); + final int fieldNumber = WireFormat.getTagFieldNumber(tag); + + final GeneratedExtension extension = + extensionRegistry.findLiteExtensionByNumber( + getDefaultInstanceForType(), fieldNumber); + + boolean unknown = false; + boolean packed = false; + if (extension == null) { + unknown = true; // Unknown field. + } else if (wireType == FieldSet.getWireFormatForFieldType( + extension.descriptor.getLiteType(), + false /* isPacked */)) { + packed = false; // Normal, unpacked value. + } else if (extension.descriptor.isRepeated && + extension.descriptor.type.isPackable() && + wireType == FieldSet.getWireFormatForFieldType( + extension.descriptor.getLiteType(), + true /* isPacked */)) { + packed = true; // Packed value. + } else { + unknown = true; // Wrong wire type. + } + + if (unknown) { // Unknown field or wrong wire type. Skip. + return input.skipField(tag); + } + + if (packed) { + final int length = input.readRawVarint32(); + final int limit = input.pushLimit(length); + if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) { + while (input.getBytesUntilLimit() > 0) { + final int rawValue = input.readEnum(); + final Object value = + extension.descriptor.getEnumType().findValueByNumber(rawValue); + if (value == null) { + // If the number isn't recognized as a valid value for this + // enum, drop it (don't even add it to unknownFields). + return true; + } + ensureExtensionsIsMutable(); + extensions.addRepeatedField(extension.descriptor, value); + } + } else { + while (input.getBytesUntilLimit() > 0) { + final Object value = + FieldSet.readPrimitiveField(input, + extension.descriptor.getLiteType()); + ensureExtensionsIsMutable(); + extensions.addRepeatedField(extension.descriptor, value); + } + } + input.popLimit(limit); + } else { + final Object value; + switch (extension.descriptor.getLiteJavaType()) { + case MESSAGE: { + MessageLite.Builder subBuilder = null; + if (!extension.descriptor.isRepeated()) { + MessageLite existingValue = + (MessageLite) extensions.getField(extension.descriptor); + if (existingValue != null) { + subBuilder = existingValue.toBuilder(); + } + } + if (subBuilder == null) { + subBuilder = extension.messageDefaultInstance.newBuilderForType(); + } + if (extension.descriptor.getLiteType() == + WireFormat.FieldType.GROUP) { + input.readGroup(extension.getNumber(), + subBuilder, extensionRegistry); + } else { + input.readMessage(subBuilder, extensionRegistry); + } + value = subBuilder.build(); + break; + } + case ENUM: + final int rawValue = input.readEnum(); + value = extension.descriptor.getEnumType() + .findValueByNumber(rawValue); + // If the number isn't recognized as a valid value for this enum, + // drop it. + if (value == null) { + return true; + } + break; + default: + value = FieldSet.readPrimitiveField(input, + extension.descriptor.getLiteType()); + break; + } + + if (extension.descriptor.isRepeated()) { + ensureExtensionsIsMutable(); + extensions.addRepeatedField(extension.descriptor, value); + } else { + ensureExtensionsIsMutable(); + extensions.setField(extension.descriptor, value); + } + } + + return true; + } + + protected final void mergeExtensionFields(final MessageType other) { + ensureExtensionsIsMutable(); + extensions.mergeFrom(((ExtendableMessage) other).extensions); + } + } + + // ----------------------------------------------------------------- + + /** For use by generated code only. */ + public static + GeneratedExtension + newSingularGeneratedExtension( + final ContainingType containingTypeDefaultInstance, + final Type defaultValue, + final MessageLite messageDefaultInstance, + final Internal.EnumLiteMap enumTypeMap, + final int number, + final WireFormat.FieldType type) { + return new GeneratedExtension( + containingTypeDefaultInstance, + defaultValue, + messageDefaultInstance, + new ExtensionDescriptor(enumTypeMap, number, type, + false /* isRepeated */, + false /* isPacked */)); + } + + /** For use by generated code only. */ + public static + GeneratedExtension + newRepeatedGeneratedExtension( + final ContainingType containingTypeDefaultInstance, + final MessageLite messageDefaultInstance, + final Internal.EnumLiteMap enumTypeMap, + final int number, + final WireFormat.FieldType type, + final boolean isPacked) { + @SuppressWarnings("unchecked") // Subclasses ensure Type is a List + Type emptyList = (Type) Collections.emptyList(); + return new GeneratedExtension( + containingTypeDefaultInstance, + emptyList, + messageDefaultInstance, + new ExtensionDescriptor( + enumTypeMap, number, type, true /* isRepeated */, isPacked)); + } + + private static final class ExtensionDescriptor + implements FieldSet.FieldDescriptorLite< + ExtensionDescriptor> { + private ExtensionDescriptor( + final Internal.EnumLiteMap enumTypeMap, + final int number, + final WireFormat.FieldType type, + final boolean isRepeated, + final boolean isPacked) { + this.enumTypeMap = enumTypeMap; + this.number = number; + this.type = type; + this.isRepeated = isRepeated; + this.isPacked = isPacked; + } + + private final Internal.EnumLiteMap enumTypeMap; + private final int number; + private final WireFormat.FieldType type; + private final boolean isRepeated; + private final boolean isPacked; + + public int getNumber() { + return number; + } + + public WireFormat.FieldType getLiteType() { + return type; + } + + public WireFormat.JavaType getLiteJavaType() { + return type.getJavaType(); + } + + public boolean isRepeated() { + return isRepeated; + } + + public boolean isPacked() { + return isPacked; + } + + public Internal.EnumLiteMap getEnumType() { + return enumTypeMap; + } + + @SuppressWarnings("unchecked") + public MessageLite.Builder internalMergeFrom( + MessageLite.Builder to, MessageLite from) { + return ((Builder) to).mergeFrom((GeneratedMessageLite) from); + } + + public int compareTo(ExtensionDescriptor other) { + return number - other.number; + } + } + + /** + * Lite equivalent to {@link GeneratedMessage.GeneratedExtension}. + * + * Users should ignore the contents of this class and only use objects of + * this type as parameters to extension accessors and ExtensionRegistry.add(). + */ + public static final class GeneratedExtension< + ContainingType extends MessageLite, Type> { + + private GeneratedExtension( + final ContainingType containingTypeDefaultInstance, + final Type defaultValue, + final MessageLite messageDefaultInstance, + final ExtensionDescriptor descriptor) { + // Defensive checks to verify the correct initialization order of + // GeneratedExtensions and their related GeneratedMessages. + if (containingTypeDefaultInstance == null) { + throw new IllegalArgumentException( + "Null containingTypeDefaultInstance"); + } + if (descriptor.getLiteType() == WireFormat.FieldType.MESSAGE && + messageDefaultInstance == null) { + throw new IllegalArgumentException( + "Null messageDefaultInstance"); + } + this.containingTypeDefaultInstance = containingTypeDefaultInstance; + this.defaultValue = defaultValue; + this.messageDefaultInstance = messageDefaultInstance; + this.descriptor = descriptor; + } + + private final ContainingType containingTypeDefaultInstance; + private final Type defaultValue; + private final MessageLite messageDefaultInstance; + private final ExtensionDescriptor descriptor; + + /** + * Default instance of the type being extended, used to identify that type. + */ + public ContainingType getContainingTypeDefaultInstance() { + return containingTypeDefaultInstance; + } + + /** Get the field number. */ + public int getNumber() { + return descriptor.getNumber(); + } + + /** + * If the extension is an embedded message, this is the default instance of + * that type. + */ + public MessageLite getMessageDefaultInstance() { + return messageDefaultInstance; + } + } + + /** + * A serialized (serializable) form of the generated message. Stores the + * message as a class name and a byte array. + */ + static final class SerializedForm implements Serializable { + private static final long serialVersionUID = 0L; + + private String messageClassName; + private byte[] asBytes; + + /** + * Creates the serialized form by calling {@link com.google.protobuf.MessageLite#toByteArray}. + * @param regularForm the message to serialize + */ + SerializedForm(MessageLite regularForm) { + messageClassName = regularForm.getClass().getName(); + asBytes = regularForm.toByteArray(); + } + + /** + * When read from an ObjectInputStream, this method converts this object + * back to the regular form. Part of Java's serialization magic. + * @return a GeneratedMessage of the type that was serialized + */ + @SuppressWarnings("unchecked") + protected Object readResolve() throws ObjectStreamException { + try { + Class messageClass = Class.forName(messageClassName); + Method newBuilder = messageClass.getMethod("newBuilder"); + MessageLite.Builder builder = + (MessageLite.Builder) newBuilder.invoke(null); + builder.mergeFrom(asBytes); + return builder.buildPartial(); + } catch (ClassNotFoundException e) { + throw new RuntimeException("Unable to find proto buffer class", e); + } catch (NoSuchMethodException e) { + throw new RuntimeException("Unable to find newBuilder method", e); + } catch (IllegalAccessException e) { + throw new RuntimeException("Unable to call newBuilder method", e); + } catch (InvocationTargetException e) { + throw new RuntimeException("Error calling newBuilder", e.getCause()); + } catch (InvalidProtocolBufferException e) { + throw new RuntimeException("Unable to understand proto buffer", e); + } + } + } + + /** + * Replaces this object in the output stream with a serialized form. + * Part of Java's serialization magic. Generated sub-classes must override + * this method by calling return super.writeReplace(); + * @return a SerializedForm of this message + */ + protected Object writeReplace() throws ObjectStreamException { + return new SerializedForm(this); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java new file mode 100644 index 000000000..05eab57ad --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java @@ -0,0 +1,206 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.io.UnsupportedEncodingException; + +/** + * The classes contained within are used internally by the Protocol Buffer + * library and generated message implementations. They are public only because + * those generated messages do not reside in the {@code protobuf} package. + * Others should not use this class directly. + * + * @author kenton@google.com (Kenton Varda) + */ +public class Internal { + /** + * Helper called by generated code to construct default values for string + * fields. + *

+ * The protocol compiler does not actually contain a UTF-8 decoder -- it + * just pushes UTF-8-encoded text around without touching it. The one place + * where this presents a problem is when generating Java string literals. + * Unicode characters in the string literal would normally need to be encoded + * using a Unicode escape sequence, which would require decoding them. + * To get around this, protoc instead embeds the UTF-8 bytes into the + * generated code and leaves it to the runtime library to decode them. + *

+ * It gets worse, though. If protoc just generated a byte array, like: + * new byte[] {0x12, 0x34, 0x56, 0x78} + * Java actually generates *code* which allocates an array and then fills + * in each value. This is much less efficient than just embedding the bytes + * directly into the bytecode. To get around this, we need another + * work-around. String literals are embedded directly, so protoc actually + * generates a string literal corresponding to the bytes. The easiest way + * to do this is to use the ISO-8859-1 character set, which corresponds to + * the first 256 characters of the Unicode range. Protoc can then use + * good old CEscape to generate the string. + *

+ * So we have a string literal which represents a set of bytes which + * represents another string. This function -- stringDefaultValue -- + * converts from the generated string to the string we actually want. The + * generated code calls this automatically. + */ + public static String stringDefaultValue(String bytes) { + try { + return new String(bytes.getBytes("ISO-8859-1"), "UTF-8"); + } catch (UnsupportedEncodingException e) { + // This should never happen since all JVMs are required to implement + // both of the above character sets. + throw new IllegalStateException( + "Java VM does not support a standard character set.", e); + } + } + + /** + * Helper called by generated code to construct default values for bytes + * fields. + *

+ * This is a lot like {@link #stringDefaultValue}, but for bytes fields. + * In this case we only need the second of the two hacks -- allowing us to + * embed raw bytes as a string literal with ISO-8859-1 encoding. + */ + public static ByteString bytesDefaultValue(String bytes) { + try { + return ByteString.copyFrom(bytes.getBytes("ISO-8859-1")); + } catch (UnsupportedEncodingException e) { + // This should never happen since all JVMs are required to implement + // ISO-8859-1. + throw new IllegalStateException( + "Java VM does not support a standard character set.", e); + } + } + + /** + * Helper called by generated code to determine if a byte array is a valid + * UTF-8 encoded string such that the original bytes can be converted to + * a String object and then back to a byte array round tripping the bytes + * without loss. + *

+ * This is inspired by UTF_8.java in sun.nio.cs. + * + * @param byteString the string to check + * @return whether the byte array is round trippable + */ + public static boolean isValidUtf8(ByteString byteString) { + int index = 0; + int size = byteString.size(); + // To avoid the masking, we could change this to use bytes; + // Then X > 0xC2 gets turned into X < -0xC2; X < 0x80 + // gets turned into X >= 0, etc. + + while (index < size) { + int byte1 = byteString.byteAt(index++) & 0xFF; + if (byte1 < 0x80) { + // fast loop for single bytes + continue; + + // we know from this point on that we have 2-4 byte forms + } else if (byte1 < 0xC2 || byte1 > 0xF4) { + // catch illegal first bytes: < C2 or > F4 + return false; + } + if (index >= size) { + // fail if we run out of bytes + return false; + } + int byte2 = byteString.byteAt(index++) & 0xFF; + if (byte2 < 0x80 || byte2 > 0xBF) { + // general trail-byte test + return false; + } + if (byte1 <= 0xDF) { + // two-byte form; general trail-byte test is sufficient + continue; + } + + // we know from this point on that we have 3 or 4 byte forms + if (index >= size) { + // fail if we run out of bytes + return false; + } + int byte3 = byteString.byteAt(index++) & 0xFF; + if (byte3 < 0x80 || byte3 > 0xBF) { + // general trail-byte test + return false; + } + if (byte1 <= 0xEF) { + // three-byte form. Vastly more frequent than four-byte forms + // The following has an extra test, but not worth restructuring + if (byte1 == 0xE0 && byte2 < 0xA0 || + byte1 == 0xED && byte2 > 0x9F) { + // check special cases of byte2 + return false; + } + + } else { + // four-byte form + + if (index >= size) { + // fail if we run out of bytes + return false; + } + int byte4 = byteString.byteAt(index++) & 0xFF; + if (byte4 < 0x80 || byte4 > 0xBF) { + // general trail-byte test + return false; + } + // The following has an extra test, but not worth restructuring + if (byte1 == 0xF0 && byte2 < 0x90 || + byte1 == 0xF4 && byte2 > 0x8F) { + // check special cases of byte2 + return false; + } + } + } + return true; + } + + /** + * Interface for an enum value or value descriptor, to be used in FieldSet. + * The lite library stores enum values directly in FieldSets but the full + * library stores EnumValueDescriptors in order to better support reflection. + */ + public interface EnumLite { + int getNumber(); + } + + /** + * Interface for an object which maps integers to {@link EnumLite}s. + * {@link Descriptors.EnumDescriptor} implements this interface by mapping + * numbers to {@link Descriptors.EnumValueDescriptor}s. Additionally, + * every generated enum type has a static method internalGetValueMap() which + * returns an implementation of this type that maps numbers to enum values. + */ + public interface EnumLiteMap { + T findValueByNumber(int number); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java new file mode 100644 index 000000000..90f7ffbc2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java @@ -0,0 +1,93 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.io.IOException; + +/** + * Thrown when a protocol message being parsed is invalid in some way, + * e.g. it contains a malformed varint or a negative byte length. + * + * @author kenton@google.com Kenton Varda + */ +public class InvalidProtocolBufferException extends IOException { + private static final long serialVersionUID = -1616151763072450476L; + + public InvalidProtocolBufferException(final String description) { + super(description); + } + + static InvalidProtocolBufferException truncatedMessage() { + return new InvalidProtocolBufferException( + "While parsing a protocol message, the input ended unexpectedly " + + "in the middle of a field. This could mean either than the " + + "input has been truncated or that an embedded message " + + "misreported its own length."); + } + + static InvalidProtocolBufferException negativeSize() { + return new InvalidProtocolBufferException( + "CodedInputStream encountered an embedded string or message " + + "which claimed to have negative size."); + } + + static InvalidProtocolBufferException malformedVarint() { + return new InvalidProtocolBufferException( + "CodedInputStream encountered a malformed varint."); + } + + static InvalidProtocolBufferException invalidTag() { + return new InvalidProtocolBufferException( + "Protocol message contained an invalid tag (zero)."); + } + + static InvalidProtocolBufferException invalidEndTag() { + return new InvalidProtocolBufferException( + "Protocol message end-group tag did not match expected tag."); + } + + static InvalidProtocolBufferException invalidWireType() { + return new InvalidProtocolBufferException( + "Protocol message tag had invalid wire type."); + } + + static InvalidProtocolBufferException recursionLimitExceeded() { + return new InvalidProtocolBufferException( + "Protocol message had too many levels of nesting. May be malicious. " + + "Use CodedInputStream.setRecursionLimit() to increase the depth limit."); + } + + static InvalidProtocolBufferException sizeLimitExceeded() { + return new InvalidProtocolBufferException( + "Protocol message was too large. May be malicious. " + + "Use CodedInputStream.setSizeLimit() to increase the size limit."); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java new file mode 100644 index 000000000..1683a6400 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java @@ -0,0 +1,155 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.List; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.RandomAccess; +import java.util.Collection; + +/** + * An implementation of {@link LazyStringList} that wraps an ArrayList. Each + * element is either a ByteString or a String. It caches the last one requested + * which is most likely the one needed next. This minimizes memory usage while + * satisfying the most common use cases. + *

+ * Note that this implementation is not synchronized. + * If multiple threads access an ArrayList instance concurrently, + * and at least one of the threads modifies the list structurally, it + * must be synchronized externally. (A structural modification is + * any operation that adds or deletes one or more elements, or explicitly + * resizes the backing array; merely setting the value of an element is not + * a structural modification.) This is typically accomplished by + * synchronizing on some object that naturally encapsulates the list. + *

+ * If the implementation is accessed via concurrent reads, this is thread safe. + * Conversions are done in a thread safe manner. It's possible that the + * conversion may happen more than once if two threads attempt to access the + * same element and the modifications were not visible to each other, but this + * will not result in any corruption of the list or change in behavior other + * than performance. + * + * @author jonp@google.com (Jon Perlow) + */ +public class LazyStringArrayList extends AbstractList + implements LazyStringList, RandomAccess { + + public final static LazyStringList EMPTY = new UnmodifiableLazyStringList( + new LazyStringArrayList()); + + private final List list; + + public LazyStringArrayList() { + list = new ArrayList(); + } + + public LazyStringArrayList(List from) { + list = new ArrayList(from); + } + + @Override + public String get(int index) { + Object o = list.get(index); + if (o instanceof String) { + return (String) o; + } else { + ByteString bs = (ByteString) o; + String s = bs.toStringUtf8(); + if (Internal.isValidUtf8(bs)) { + list.set(index, s); + } + return s; + } + } + + @Override + public int size() { + return list.size(); + } + + @Override + public String set(int index, String s) { + Object o = list.set(index, s); + return asString(o); + } + + @Override + public void add(int index, String element) { + list.add(index, element); + modCount++; + } + + @Override + public boolean addAll(int index, Collection c) { + boolean ret = list.addAll(index, c); + modCount++; + return ret; + } + + @Override + public String remove(int index) { + Object o = list.remove(index); + modCount++; + return asString(o); + } + + public void clear() { + list.clear(); + modCount++; + } + + // @Override + public void add(ByteString element) { + list.add(element); + modCount++; + } + + // @Override + public ByteString getByteString(int index) { + Object o = list.get(index); + if (o instanceof String) { + ByteString b = ByteString.copyFromUtf8((String) o); + list.set(index, b); + return b; + } else { + return (ByteString) o; + } + } + + private String asString(Object o) { + if (o instanceof String) { + return (String) o; + } else { + return ((ByteString) o).toStringUtf8(); + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java new file mode 100644 index 000000000..97139ca66 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java @@ -0,0 +1,72 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.List; + +/** + * An interface extending List<String> that also provides access to the + * items of the list as UTF8-encoded ByteString objects. This is used by the + * protocol buffer implementation to support lazily converting bytes parsed + * over the wire to String objects until needed and also increases the + * efficiency of serialization if the String was never requested as the + * ByteString is already cached. + *

+ * This only adds additional methods that are required for the use in the + * protocol buffer code in order to be able successfuly round trip byte arrays + * through parsing and serialization without conversion to strings. It's not + * attempting to support the functionality of say List<ByteString>, hence + * why only these two very specific methods are added. + * + * @author jonp@google.com (Jon Perlow) + */ +public interface LazyStringList extends List { + + /** + * Returns the element at the specified position in this list as a ByteString. + * + * @param index index of the element to return + * @return the element at the specified position in this list + * @throws IndexOutOfBoundsException if the index is out of range + * (index < 0 || index >= size()) + */ + ByteString getByteString(int index); + + /** + * Appends the specified element to the end of this list (optional + * operation). + * + * @param element element to be appended to this list + * @throws UnsupportedOperationException if the add operation + * is not supported by this list + */ + void add(ByteString element); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java new file mode 100644 index 000000000..67c4148ee --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java @@ -0,0 +1,215 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// TODO(kenton): Use generics? E.g. Builder, then +// mergeFrom*() could return BuilderType for better type-safety. + +package com.google.protobuf; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +/** + * Abstract interface implemented by Protocol Message objects. + *

+ * See also {@link MessageLite}, which defines most of the methods that typical + * users care about. {@link Message} adds to it methods that are not available + * in the "lite" runtime. The biggest added features are introspection and + * reflection -- i.e., getting descriptors for the message type and accessing + * the field values dynamically. + * + * @author kenton@google.com Kenton Varda + */ +public interface Message extends MessageLite, MessageOrBuilder { + + // ----------------------------------------------------------------- + // Comparison and hashing + + /** + * Compares the specified object with this message for equality. Returns + * true if the given object is a message of the same type (as + * defined by {@code getDescriptorForType()}) and has identical values for + * all of its fields. Subclasses must implement this; inheriting + * {@code Object.equals()} is incorrect. + * + * @param other object to be compared for equality with this message + * @return true if the specified object is equal to this message + */ + @Override + boolean equals(Object other); + + /** + * Returns the hash code value for this message. The hash code of a message + * should mix the message's type (object identity of the decsriptor) with its + * contents (known and unknown field values). Subclasses must implement this; + * inheriting {@code Object.hashCode()} is incorrect. + * + * @return the hash code value for this message + * @see Map#hashCode() + */ + @Override + int hashCode(); + + // ----------------------------------------------------------------- + // Convenience methods. + + /** + * Converts the message to a string in protocol buffer text format. This is + * just a trivial wrapper around {@link TextFormat#printToString(Message)}. + */ + @Override + String toString(); + + // ================================================================= + // Builders + + // (From MessageLite, re-declared here only for return type covariance.) + Builder newBuilderForType(); + Builder toBuilder(); + + /** + * Abstract interface implemented by Protocol Message builders. + */ + interface Builder extends MessageLite.Builder, MessageOrBuilder { + // (From MessageLite.Builder, re-declared here only for return type + // covariance.) + Builder clear(); + + /** + * Merge {@code other} into the message being built. {@code other} must + * have the exact same type as {@code this} (i.e. + * {@code getDescriptorForType() == other.getDescriptorForType()}). + * + * Merging occurs as follows. For each field:
+ * * For singular primitive fields, if the field is set in {@code other}, + * then {@code other}'s value overwrites the value in this message.
+ * * For singular message fields, if the field is set in {@code other}, + * it is merged into the corresponding sub-message of this message + * using the same merging rules.
+ * * For repeated fields, the elements in {@code other} are concatenated + * with the elements in this message. + * + * This is equivalent to the {@code Message::MergeFrom} method in C++. + */ + Builder mergeFrom(Message other); + + // (From MessageLite.Builder, re-declared here only for return type + // covariance.) + Message build(); + Message buildPartial(); + Builder clone(); + Builder mergeFrom(CodedInputStream input) throws IOException; + Builder mergeFrom(CodedInputStream input, + ExtensionRegistryLite extensionRegistry) + throws IOException; + + /** + * Get the message's type's descriptor. + * See {@link Message#getDescriptorForType()}. + */ + Descriptors.Descriptor getDescriptorForType(); + + /** + * Create a Builder for messages of the appropriate type for the given + * field. Messages built with this can then be passed to setField(), + * setRepeatedField(), or addRepeatedField(). + */ + Builder newBuilderForField(Descriptors.FieldDescriptor field); + + /** + * Sets a field to the given value. The value must be of the correct type + * for this field, i.e. the same type that + * {@link Message#getField(Descriptors.FieldDescriptor)} would return. + */ + Builder setField(Descriptors.FieldDescriptor field, Object value); + + /** + * Clears the field. This is exactly equivalent to calling the generated + * "clear" accessor method corresponding to the field. + */ + Builder clearField(Descriptors.FieldDescriptor field); + + /** + * Sets an element of a repeated field to the given value. The value must + * be of the correct type for this field, i.e. the same type that + * {@link Message#getRepeatedField(Descriptors.FieldDescriptor,int)} would + * return. + * @throws IllegalArgumentException The field is not a repeated field, or + * {@code field.getContainingType() != getDescriptorForType()}. + */ + Builder setRepeatedField(Descriptors.FieldDescriptor field, + int index, Object value); + + /** + * Like {@code setRepeatedField}, but appends the value as a new element. + * @throws IllegalArgumentException The field is not a repeated field, or + * {@code field.getContainingType() != getDescriptorForType()}. + */ + Builder addRepeatedField(Descriptors.FieldDescriptor field, Object value); + + /** Set the {@link UnknownFieldSet} for this message. */ + Builder setUnknownFields(UnknownFieldSet unknownFields); + + /** + * Merge some unknown fields into the {@link UnknownFieldSet} for this + * message. + */ + Builder mergeUnknownFields(UnknownFieldSet unknownFields); + + // --------------------------------------------------------------- + // Convenience methods. + + // (From MessageLite.Builder, re-declared here only for return type + // covariance.) + Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException; + Builder mergeFrom(ByteString data, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException; + Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException; + Builder mergeFrom(byte[] data, int off, int len) + throws InvalidProtocolBufferException; + Builder mergeFrom(byte[] data, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException; + Builder mergeFrom(byte[] data, int off, int len, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException; + Builder mergeFrom(InputStream input) throws IOException; + Builder mergeFrom(InputStream input, + ExtensionRegistryLite extensionRegistry) + throws IOException; + boolean mergeDelimitedFrom(InputStream input) + throws IOException; + boolean mergeDelimitedFrom(InputStream input, + ExtensionRegistryLite extensionRegistry) + throws IOException; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java new file mode 100644 index 000000000..31b8256e4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java @@ -0,0 +1,325 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// TODO(kenton): Use generics? E.g. Builder, then +// mergeFrom*() could return BuilderType for better type-safety. + +package com.google.protobuf; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Abstract interface implemented by Protocol Message objects. + * + *

This interface is implemented by all protocol message objects. Non-lite + * messages additionally implement the Message interface, which is a subclass + * of MessageLite. Use MessageLite instead when you only need the subset of + * features which it supports -- namely, nothing that uses descriptors or + * reflection. You can instruct the protocol compiler to generate classes + * which implement only MessageLite, not the full Message interface, by adding + * the follow line to the .proto file: + *

+ *   option optimize_for = LITE_RUNTIME;
+ * 
+ * + *

This is particularly useful on resource-constrained systems where the + * full protocol buffers runtime library is too big. + * + *

Note that on non-constrained systems (e.g. servers) when you need to link + * in lots of protocol definitions, a better way to reduce total code footprint + * is to use {@code optimize_for = CODE_SIZE}. This will make the generated + * code smaller while still supporting all the same features (at the expense of + * speed). {@code optimize_for = LITE_RUNTIME} is best when you only have a + * small number of message types linked into your binary, in which case the + * size of the protocol buffers runtime itself is the biggest problem. + * + * @author kenton@google.com Kenton Varda + */ +public interface MessageLite extends MessageLiteOrBuilder { + + + /** + * Serializes the message and writes it to {@code output}. This does not + * flush or close the stream. + */ + void writeTo(CodedOutputStream output) throws IOException; + + /** + * Get the number of bytes required to encode this message. The result + * is only computed on the first call and memoized after that. + */ + int getSerializedSize(); + + // ----------------------------------------------------------------- + // Convenience methods. + + /** + * Serializes the message to a {@code ByteString} and returns it. This is + * just a trivial wrapper around + * {@link #writeTo(CodedOutputStream)}. + */ + ByteString toByteString(); + + /** + * Serializes the message to a {@code byte} array and returns it. This is + * just a trivial wrapper around + * {@link #writeTo(CodedOutputStream)}. + */ + byte[] toByteArray(); + + /** + * Serializes the message and writes it to {@code output}. This is just a + * trivial wrapper around {@link #writeTo(CodedOutputStream)}. This does + * not flush or close the stream. + *

+ * NOTE: Protocol Buffers are not self-delimiting. Therefore, if you write + * any more data to the stream after the message, you must somehow ensure + * that the parser on the receiving end does not interpret this as being + * part of the protocol message. This can be done e.g. by writing the size + * of the message before the data, then making sure to limit the input to + * that size on the receiving end (e.g. by wrapping the InputStream in one + * which limits the input). Alternatively, just use + * {@link #writeDelimitedTo(OutputStream)}. + */ + void writeTo(OutputStream output) throws IOException; + + /** + * Like {@link #writeTo(OutputStream)}, but writes the size of the message + * as a varint before writing the data. This allows more data to be written + * to the stream after the message without the need to delimit the message + * data yourself. Use {@link Builder#mergeDelimitedFrom(InputStream)} (or + * the static method {@code YourMessageType.parseDelimitedFrom(InputStream)}) + * to parse messages written by this method. + */ + void writeDelimitedTo(OutputStream output) throws IOException; + + // ================================================================= + // Builders + + /** + * Constructs a new builder for a message of the same type as this message. + */ + Builder newBuilderForType(); + + /** + * Constructs a builder initialized with the current message. Use this to + * derive a new message from the current one. + */ + Builder toBuilder(); + + /** + * Abstract interface implemented by Protocol Message builders. + */ + interface Builder extends MessageLiteOrBuilder, Cloneable { + /** Resets all fields to their default values. */ + Builder clear(); + + /** + * Construct the final message. Once this is called, the Builder is no + * longer valid, and calling any other method will result in undefined + * behavior and may throw a NullPointerException. If you need to continue + * working with the builder after calling {@code build()}, {@code clone()} + * it first. + * @throws UninitializedMessageException The message is missing one or more + * required fields (i.e. {@link #isInitialized()} returns false). + * Use {@link #buildPartial()} to bypass this check. + */ + MessageLite build(); + + /** + * Like {@link #build()}, but does not throw an exception if the message + * is missing required fields. Instead, a partial message is returned. + * Once this is called, the Builder is no longer valid, and calling any + * will result in undefined behavior and may throw a NullPointerException. + * + * If you need to continue working with the builder after calling + * {@code buildPartial()}, {@code clone()} it first. + */ + MessageLite buildPartial(); + + /** + * Clones the Builder. + * @see Object#clone() + */ + Builder clone(); + + /** + * Parses a message of this type from the input and merges it with this + * message, as if using {@link Builder#mergeFrom(MessageLite)}. + * + *

Warning: This does not verify that all required fields are present in + * the input message. If you call {@link #build()} without setting all + * required fields, it will throw an {@link UninitializedMessageException}, + * which is a {@code RuntimeException} and thus might not be caught. There + * are a few good ways to deal with this: + *

    + *
  • Call {@link #isInitialized()} to verify that all required fields + * are set before building. + *
  • Parse the message separately using one of the static + * {@code parseFrom} methods, then use {@link #mergeFrom(MessageLite)} + * to merge it with this one. {@code parseFrom} will throw an + * {@link InvalidProtocolBufferException} (an {@code IOException}) + * if some required fields are missing. + *
  • Use {@code buildPartial()} to build, which ignores missing + * required fields. + *
+ * + *

Note: The caller should call + * {@link CodedInputStream#checkLastTagWas(int)} after calling this to + * verify that the last tag seen was the appropriate end-group tag, + * or zero for EOF. + */ + Builder mergeFrom(CodedInputStream input) throws IOException; + + /** + * Like {@link Builder#mergeFrom(CodedInputStream)}, but also + * parses extensions. The extensions that you want to be able to parse + * must be registered in {@code extensionRegistry}. Extensions not in + * the registry will be treated as unknown fields. + */ + Builder mergeFrom(CodedInputStream input, + ExtensionRegistryLite extensionRegistry) + throws IOException; + + // --------------------------------------------------------------- + // Convenience methods. + + /** + * Parse {@code data} as a message of this type and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream)}. + * + * @return this + */ + Builder mergeFrom(ByteString data) throws InvalidProtocolBufferException; + + /** + * Parse {@code data} as a message of this type and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}. + * + * @return this + */ + Builder mergeFrom(ByteString data, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException; + + /** + * Parse {@code data} as a message of this type and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream)}. + * + * @return this + */ + Builder mergeFrom(byte[] data) throws InvalidProtocolBufferException; + + /** + * Parse {@code data} as a message of this type and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream)}. + * + * @return this + */ + Builder mergeFrom(byte[] data, int off, int len) + throws InvalidProtocolBufferException; + + /** + * Parse {@code data} as a message of this type and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}. + * + * @return this + */ + Builder mergeFrom(byte[] data, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException; + + /** + * Parse {@code data} as a message of this type and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}. + * + * @return this + */ + Builder mergeFrom(byte[] data, int off, int len, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException; + + /** + * Parse a message of this type from {@code input} and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream)}. Note that this method always + * reads the entire input (unless it throws an exception). If you + * want it to stop earlier, you will need to wrap your input in some + * wrapper stream that limits reading. Or, use + * {@link MessageLite#writeDelimitedTo(OutputStream)} to write your message + * and {@link #mergeDelimitedFrom(InputStream)} to read it. + *

+ * Despite usually reading the entire input, this does not close the stream. + * + * @return this + */ + Builder mergeFrom(InputStream input) throws IOException; + + /** + * Parse a message of this type from {@code input} and merge it with the + * message being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream,ExtensionRegistry)}. + * + * @return this + */ + Builder mergeFrom(InputStream input, + ExtensionRegistryLite extensionRegistry) + throws IOException; + + /** + * Like {@link #mergeFrom(InputStream)}, but does not read until EOF. + * Instead, the size of the message (encoded as a varint) is read first, + * then the message data. Use + * {@link MessageLite#writeDelimitedTo(OutputStream)} to write messages in + * this format. + * + * @returns True if successful, or false if the stream is at EOF when the + * method starts. Any other error (including reaching EOF during + * parsing) will cause an exception to be thrown. + */ + boolean mergeDelimitedFrom(InputStream input) + throws IOException; + + /** + * Like {@link #mergeDelimitedFrom(InputStream)} but supporting extensions. + */ + boolean mergeDelimitedFrom(InputStream input, + ExtensionRegistryLite extensionRegistry) + throws IOException; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java new file mode 100644 index 000000000..7cc72e9cb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java @@ -0,0 +1,58 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * Base interface for methods common to {@link MessageLite} + * and {@link MessageLite.Builder} to provide type equivalency. + * + * @author jonp@google.com (Jon Perlow) + */ +public interface MessageLiteOrBuilder { + /** + * Get an instance of the type with no fields set. Because no fields are set, + * all getters for singular fields will return default values and repeated + * fields will appear empty. + * This may or may not be a singleton. This differs from the + * {@code getDefaultInstance()} method of generated message classes in that + * this method is an abstract method of the {@code MessageLite} interface + * whereas {@code getDefaultInstance()} is a static method of a specific + * class. They return the same thing. + */ + MessageLite getDefaultInstanceForType(); + + /** + * Returns true if all required fields in the message and all embedded + * messages are set, false otherwise. + */ + boolean isInitialized(); + +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java new file mode 100644 index 000000000..0132e7cad --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java @@ -0,0 +1,110 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.Map; + +/** + * Base interface for methods common to {@link Message} and + * {@link Message.Builder} to provide type equivalency. + * + * @author jonp@google.com (Jon Perlow) + */ +public interface MessageOrBuilder extends MessageLiteOrBuilder { + + // (From MessageLite, re-declared here only for return type covariance.) + //@Override (Java 1.6 override semantics, but we must support 1.5) + Message getDefaultInstanceForType(); + + /** + * Get the message's type's descriptor. This differs from the + * {@code getDescriptor()} method of generated message classes in that + * this method is an abstract method of the {@code Message} interface + * whereas {@code getDescriptor()} is a static method of a specific class. + * They return the same thing. + */ + Descriptors.Descriptor getDescriptorForType(); + + /** + * Returns a collection of all the fields in this message which are set + * and their corresponding values. A singular ("required" or "optional") + * field is set iff hasField() returns true for that field. A "repeated" + * field is set iff getRepeatedFieldSize() is greater than zero. The + * values are exactly what would be returned by calling + * {@link #getField(Descriptors.FieldDescriptor)} for each field. The map + * is guaranteed to be a sorted map, so iterating over it will return fields + * in order by field number. + *
+ * If this is for a builder, the returned map may or may not reflect future + * changes to the builder. Either way, the returned map is itself + * unmodifiable. + */ + Map getAllFields(); + + /** + * Returns true if the given field is set. This is exactly equivalent to + * calling the generated "has" accessor method corresponding to the field. + * @throws IllegalArgumentException The field is a repeated field, or + * {@code field.getContainingType() != getDescriptorForType()}. + */ + boolean hasField(Descriptors.FieldDescriptor field); + + /** + * Obtains the value of the given field, or the default value if it is + * not set. For primitive fields, the boxed primitive value is returned. + * For enum fields, the EnumValueDescriptor for the value is returend. For + * embedded message fields, the sub-message is returned. For repeated + * fields, a java.util.List is returned. + */ + Object getField(Descriptors.FieldDescriptor field); + + /** + * Gets the number of elements of a repeated field. This is exactly + * equivalent to calling the generated "Count" accessor method corresponding + * to the field. + * @throws IllegalArgumentException The field is not a repeated field, or + * {@code field.getContainingType() != getDescriptorForType()}. + */ + int getRepeatedFieldCount(Descriptors.FieldDescriptor field); + + /** + * Gets an element of a repeated field. For primitive fields, the boxed + * primitive value is returned. For enum fields, the EnumValueDescriptor + * for the value is returend. For embedded message fields, the sub-message + * is returned. + * @throws IllegalArgumentException The field is not a repeated field, or + * {@code field.getContainingType() != getDescriptorForType()}. + */ + Object getRepeatedField(Descriptors.FieldDescriptor field, int index); + + /** Get the {@link UnknownFieldSet} for this message. */ + UnknownFieldSet getUnknownFields(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java new file mode 100644 index 000000000..112400f42 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java @@ -0,0 +1,58 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.EnumDescriptor; +import com.google.protobuf.Descriptors.EnumValueDescriptor; + +/** + * Interface of useful methods added to all enums generated by the protocol + * compiler. + */ +public interface ProtocolMessageEnum extends Internal.EnumLite { + + /** + * Return the value's numeric value as defined in the .proto file. + */ + int getNumber(); + + /** + * Return the value's descriptor, which contains information such as + * value name, number, and type. + */ + EnumValueDescriptor getValueDescriptor(); + + /** + * Return the enum type's descriptor, which contains information + * about each defined value, etc. + */ + EnumDescriptor getDescriptorForType(); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java new file mode 100644 index 000000000..0024f7914 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java @@ -0,0 +1,696 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +/** + * RepeatedFieldBuilder implements a structure that a protocol + * message uses to hold a repeated field of other protocol messages. It supports + * the classical use case of adding immutable {@link Message}'s to the + * repeated field and is highly optimized around this (no extra memory + * allocations and sharing of immutable arrays). + *
+ * It also supports the additional use case of adding a {@link Message.Builder} + * to the repeated field and deferring conversion of that Builder + * to an immutable Message. In this way, it's possible to maintain + * a tree of Builder's that acts as a fully read/write data + * structure. + *
+ * Logically, one can think of a tree of builders as converting the entire tree + * to messages when build is called on the root or when any method is called + * that desires a Message instead of a Builder. In terms of the implementation, + * the SingleFieldBuilder and RepeatedFieldBuilder + * classes cache messages that were created so that messages only need to be + * created when some change occured in its builder or a builder for one of its + * descendants. + * + * @param the type of message for the field + * @param the type of builder for the field + * @param the common interface for the message and the builder + * + * @author jonp@google.com (Jon Perlow) + */ +public class RepeatedFieldBuilder + + implements GeneratedMessage.BuilderParent { + + // Parent to send changes to. + private GeneratedMessage.BuilderParent parent; + + // List of messages. Never null. It may be immutable, in which case + // isMessagesListImmutable will be true. See note below. + private List messages; + + // Whether messages is an mutable array that can be modified. + private boolean isMessagesListMutable; + + // List of builders. May be null, in which case, no nested builders were + // created. If not null, entries represent the builder for that index. + private List> builders; + + // Here are the invariants for messages and builders: + // 1. messages is never null and its count corresponds to the number of items + // in the repeated field. + // 2. If builders is non-null, messages and builders MUST always + // contain the same number of items. + // 3. Entries in either array can be null, but for any index, there MUST be + // either a Message in messages or a builder in builders. + // 4. If the builder at an index is non-null, the builder is + // authoritative. This is the case where a Builder was set on the index. + // Any message in the messages array MUST be ignored. + // t. If the builder at an index is null, the message in the messages + // list is authoritative. This is the case where a Message (not a Builder) + // was set directly for an index. + + // Indicates that we've built a message and so we are now obligated + // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener. + private boolean isClean; + + // A view of this builder that exposes a List interface of messages. This is + // initialized on demand. This is fully backed by this object and all changes + // are reflected in it. Access to any item converts it to a message if it + // was a builder. + private MessageExternalList externalMessageList; + + // A view of this builder that exposes a List interface of builders. This is + // initialized on demand. This is fully backed by this object and all changes + // are reflected in it. Access to any item converts it to a builder if it + // was a message. + private BuilderExternalList externalBuilderList; + + // A view of this builder that exposes a List interface of the interface + // implemented by messages and builders. This is initialized on demand. This + // is fully backed by this object and all changes are reflected in it. + // Access to any item returns either a builder or message depending on + // what is most efficient. + private MessageOrBuilderExternalList + externalMessageOrBuilderList; + + /** + * Constructs a new builder with an empty list of messages. + * + * @param messages the current list of messages + * @param isMessagesListMutable Whether the messages list is mutable + * @param parent a listener to notify of changes + * @param isClean whether the builder is initially marked clean + */ + public RepeatedFieldBuilder( + List messages, + boolean isMessagesListMutable, + GeneratedMessage.BuilderParent parent, + boolean isClean) { + this.messages = messages; + this.isMessagesListMutable = isMessagesListMutable; + this.parent = parent; + this.isClean = isClean; + } + + public void dispose() { + // Null out parent so we stop sending it invalidations. + parent = null; + } + + /** + * Ensures that the list of messages is mutable so it can be updated. If it's + * immutable, a copy is made. + */ + private void ensureMutableMessageList() { + if (!isMessagesListMutable) { + messages = new ArrayList(messages); + isMessagesListMutable = true; + } + } + + /** + * Ensures that the list of builders is not null. If it's null, the list is + * created and initialized to be the same size as the messages list with + * null entries. + */ + private void ensureBuilders() { + if (this.builders == null) { + this.builders = + new ArrayList>( + messages.size()); + for (int i = 0; i < messages.size(); i++) { + builders.add(null); + } + } + } + + /** + * Gets the count of items in the list. + * + * @return the count of items in the list. + */ + public int getCount() { + return messages.size(); + } + + /** + * Gets whether the list is empty. + * + * @return whether the list is empty + */ + public boolean isEmpty() { + return messages.isEmpty(); + } + + /** + * Get the message at the specified index. If the message is currently stored + * as a Builder, it is converted to a Message by + * calling {@link Message.Builder#buildPartial} on it. + * + * @param index the index of the message to get + * @return the message for the specified index + */ + public MType getMessage(int index) { + return getMessage(index, false); + } + + /** + * Get the message at the specified index. If the message is currently stored + * as a Builder, it is converted to a Message by + * calling {@link Message.Builder#buildPartial} on it. + * + * @param index the index of the message to get + * @param forBuild this is being called for build so we want to make sure + * we SingleFieldBuilder.build to send dirty invalidations + * @return the message for the specified index + */ + private MType getMessage(int index, boolean forBuild) { + if (this.builders == null) { + // We don't have any builders -- return the current Message. + // This is the case where no builder was created, so we MUST have a + // Message. + return messages.get(index); + } + + SingleFieldBuilder builder = builders.get(index); + if (builder == null) { + // We don't have a builder -- return the current message. + // This is the case where no builder was created for the entry at index, + // so we MUST have a message. + return messages.get(index); + + } else { + return forBuild ? builder.build() : builder.getMessage(); + } + } + + /** + * Gets a builder for the specified index. If no builder has been created for + * that index, a builder is created on demand by calling + * {@link Message#toBuilder}. + * + * @param index the index of the message to get + * @return The builder for that index + */ + public BType getBuilder(int index) { + ensureBuilders(); + SingleFieldBuilder builder = builders.get(index); + if (builder == null) { + MType message = messages.get(index); + builder = new SingleFieldBuilder( + message, this, isClean); + builders.set(index, builder); + } + return builder.getBuilder(); + } + + /** + * Gets the base class interface for the specified index. This may either be + * a builder or a message. It will return whatever is more efficient. + * + * @param index the index of the message to get + * @return the message or builder for the index as the base class interface + */ + @SuppressWarnings("unchecked") + public IType getMessageOrBuilder(int index) { + if (this.builders == null) { + // We don't have any builders -- return the current Message. + // This is the case where no builder was created, so we MUST have a + // Message. + return (IType) messages.get(index); + } + + SingleFieldBuilder builder = builders.get(index); + if (builder == null) { + // We don't have a builder -- return the current message. + // This is the case where no builder was created for the entry at index, + // so we MUST have a message. + return (IType) messages.get(index); + + } else { + return builder.getMessageOrBuilder(); + } + } + + /** + * Sets a message at the specified index replacing the existing item at + * that index. + * + * @param index the index to set. + * @param message the message to set + * @return the builder + */ + public RepeatedFieldBuilder setMessage( + int index, MType message) { + if (message == null) { + throw new NullPointerException(); + } + ensureMutableMessageList(); + messages.set(index, message); + if (builders != null) { + SingleFieldBuilder entry = + builders.set(index, null); + if (entry != null) { + entry.dispose(); + } + } + onChanged(); + incrementModCounts(); + return this; + } + + /** + * Appends the specified element to the end of this list. + * + * @param message the message to add + * @return the builder + */ + public RepeatedFieldBuilder addMessage( + MType message) { + if (message == null) { + throw new NullPointerException(); + } + ensureMutableMessageList(); + messages.add(message); + if (builders != null) { + builders.add(null); + } + onChanged(); + incrementModCounts(); + return this; + } + + /** + * Inserts the specified message at the specified position in this list. + * Shifts the element currently at that position (if any) and any subsequent + * elements to the right (adds one to their indices). + * + * @param index the index at which to insert the message + * @param message the message to add + * @return the builder + */ + public RepeatedFieldBuilder addMessage( + int index, MType message) { + if (message == null) { + throw new NullPointerException(); + } + ensureMutableMessageList(); + messages.add(index, message); + if (builders != null) { + builders.add(index, null); + } + onChanged(); + incrementModCounts(); + return this; + } + + /** + * Appends all of the messages in the specified collection to the end of + * this list, in the order that they are returned by the specified + * collection's iterator. + * + * @param values the messages to add + * @return the builder + */ + public RepeatedFieldBuilder addAllMessages( + Iterable values) { + for (final MType value : values) { + if (value == null) { + throw new NullPointerException(); + } + } + if (values instanceof Collection) { + @SuppressWarnings("unchecked") final + Collection collection = (Collection) values; + if (collection.size() == 0) { + return this; + } + ensureMutableMessageList(); + for (MType value : values) { + addMessage(value); + } + } else { + ensureMutableMessageList(); + for (MType value : values) { + addMessage(value); + } + } + onChanged(); + incrementModCounts(); + return this; + } + + /** + * Appends a new builder to the end of this list and returns the builder. + * + * @param message the message to add which is the basis of the builder + * @return the new builder + */ + public BType addBuilder(MType message) { + ensureMutableMessageList(); + ensureBuilders(); + SingleFieldBuilder builder = + new SingleFieldBuilder( + message, this, isClean); + messages.add(null); + builders.add(builder); + onChanged(); + incrementModCounts(); + return builder.getBuilder(); + } + + /** + * Inserts a new builder at the specified position in this list. + * Shifts the element currently at that position (if any) and any subsequent + * elements to the right (adds one to their indices). + * + * @param index the index at which to insert the builder + * @param message the message to add which is the basis of the builder + * @return the builder + */ + public BType addBuilder(int index, MType message) { + ensureMutableMessageList(); + ensureBuilders(); + SingleFieldBuilder builder = + new SingleFieldBuilder( + message, this, isClean); + messages.add(index, null); + builders.add(index, builder); + onChanged(); + incrementModCounts(); + return builder.getBuilder(); + } + + /** + * Removes the element at the specified position in this list. Shifts any + * subsequent elements to the left (subtracts one from their indices). + * Returns the element that was removed from the list. + * + * @param index the index at which to remove the message + */ + public void remove(int index) { + ensureMutableMessageList(); + messages.remove(index); + if (builders != null) { + SingleFieldBuilder entry = + builders.remove(index); + if (entry != null) { + entry.dispose(); + } + } + onChanged(); + incrementModCounts(); + } + + /** + * Removes all of the elements from this list. + * The list will be empty after this call returns. + */ + public void clear() { + messages = Collections.emptyList(); + isMessagesListMutable = false; + if (builders != null) { + for (SingleFieldBuilder entry : + builders) { + if (entry != null) { + entry.dispose(); + } + } + builders = null; + } + onChanged(); + incrementModCounts(); + } + + /** + * Builds the list of messages from the builder and returns them. + * + * @return an immutable list of messages + */ + public List build() { + // Now that build has been called, we are required to dispatch + // invalidations. + isClean = true; + + if (!isMessagesListMutable && builders == null) { + // We still have an immutable list and we never created a builder. + return messages; + } + + boolean allMessagesInSync = true; + if (!isMessagesListMutable) { + // We still have an immutable list. Let's see if any of them are out + // of sync with their builders. + for (int i = 0; i < messages.size(); i++) { + Message message = messages.get(i); + SingleFieldBuilder builder = builders.get(i); + if (builder != null) { + if (builder.build() != message) { + allMessagesInSync = false; + break; + } + } + } + if (allMessagesInSync) { + // Immutable list is still in sync. + return messages; + } + } + + // Need to make sure messages is up to date + ensureMutableMessageList(); + for (int i = 0; i < messages.size(); i++) { + messages.set(i, getMessage(i, true)); + } + + // We're going to return our list as immutable so we mark that we can + // no longer update it. + messages = Collections.unmodifiableList(messages); + isMessagesListMutable = false; + return messages; + } + + /** + * Gets a view of the builder as a list of messages. The returned list is live + * and will reflect any changes to the underlying builder. + * + * @return the messages in the list + */ + public List getMessageList() { + if (externalMessageList == null) { + externalMessageList = + new MessageExternalList(this); + } + return externalMessageList; + } + + /** + * Gets a view of the builder as a list of builders. This returned list is + * live and will reflect any changes to the underlying builder. + * + * @return the builders in the list + */ + public List getBuilderList() { + if (externalBuilderList == null) { + externalBuilderList = + new BuilderExternalList(this); + } + return externalBuilderList; + } + + /** + * Gets a view of the builder as a list of MessageOrBuilders. This returned + * list is live and will reflect any changes to the underlying builder. + * + * @return the builders in the list + */ + public List getMessageOrBuilderList() { + if (externalMessageOrBuilderList == null) { + externalMessageOrBuilderList = + new MessageOrBuilderExternalList(this); + } + return externalMessageOrBuilderList; + } + + /** + * Called when a the builder or one of its nested children has changed + * and any parent should be notified of its invalidation. + */ + private void onChanged() { + if (isClean && parent != null) { + parent.markDirty(); + + // Don't keep dispatching invalidations until build is called again. + isClean = false; + } + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void markDirty() { + onChanged(); + } + + /** + * Increments the mod counts so that an ConcurrentModificationException can + * be thrown if calling code tries to modify the builder while its iterating + * the list. + */ + private void incrementModCounts() { + if (externalMessageList != null) { + externalMessageList.incrementModCount(); + } + if (externalBuilderList != null) { + externalBuilderList.incrementModCount(); + } + if (externalMessageOrBuilderList != null) { + externalMessageOrBuilderList.incrementModCount(); + } + } + + /** + * Provides a live view of the builder as a list of messages. + * + * @param the type of message for the field + * @param the type of builder for the field + * @param the common interface for the message and the builder + */ + private static class MessageExternalList< + MType extends GeneratedMessage, + BType extends GeneratedMessage.Builder, + IType extends MessageOrBuilder> + extends AbstractList implements List { + + RepeatedFieldBuilder builder; + + MessageExternalList( + RepeatedFieldBuilder builder) { + this.builder = builder; + } + + public int size() { + return this.builder.getCount(); + } + + public MType get(int index) { + return builder.getMessage(index); + } + + void incrementModCount() { + modCount++; + } + } + + /** + * Provides a live view of the builder as a list of builders. + * + * @param the type of message for the field + * @param the type of builder for the field + * @param the common interface for the message and the builder + */ + private static class BuilderExternalList< + MType extends GeneratedMessage, + BType extends GeneratedMessage.Builder, + IType extends MessageOrBuilder> + extends AbstractList implements List { + + RepeatedFieldBuilder builder; + + BuilderExternalList( + RepeatedFieldBuilder builder) { + this.builder = builder; + } + + public int size() { + return this.builder.getCount(); + } + + public BType get(int index) { + return builder.getBuilder(index); + } + + void incrementModCount() { + modCount++; + } + } + + /** + * Provides a live view of the builder as a list of builders. + * + * @param the type of message for the field + * @param the type of builder for the field + * @param the common interface for the message and the builder + */ + private static class MessageOrBuilderExternalList< + MType extends GeneratedMessage, + BType extends GeneratedMessage.Builder, + IType extends MessageOrBuilder> + extends AbstractList implements List { + + RepeatedFieldBuilder builder; + + MessageOrBuilderExternalList( + RepeatedFieldBuilder builder) { + this.builder = builder; + } + + public int size() { + return this.builder.getCount(); + } + + public IType get(int index) { + return builder.getMessageOrBuilder(index); + } + + void incrementModCount() { + modCount++; + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java new file mode 100644 index 000000000..1fd35ed33 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java @@ -0,0 +1,47 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * Interface for an RPC callback, normally called when an RPC completes. + * {@code ParameterType} is normally the method's response message type. + * + *

Starting with version 2.3.0, RPC implementations should not try to build + * on this, but should instead provide code generator plugins which generate + * code specific to the particular RPC implementation. This way the generated + * code can be more appropriate for the implementation in use and can avoid + * unnecessary layers of indirection. + * + * @author kenton@google.com Kenton Varda + */ +public interface RpcCallback { + void run(ParameterType parameter); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java new file mode 100644 index 000000000..c6ec54fc9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java @@ -0,0 +1,71 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + *

Abstract interface for an RPC channel. An {@code RpcChannel} represents a + * communication line to a {@link Service} which can be used to call that + * {@link Service}'s methods. The {@link Service} may be running on another + * machine. Normally, you should not call an {@code RpcChannel} directly, but + * instead construct a stub {@link Service} wrapping it. Example: + * + *

+ *   RpcChannel channel = rpcImpl.newChannel("remotehost.example.com:1234");
+ *   RpcController controller = rpcImpl.newController();
+ *   MyService service = MyService.newStub(channel);
+ *   service.myMethod(controller, request, callback);
+ * 
+ * + *

Starting with version 2.3.0, RPC implementations should not try to build + * on this, but should instead provide code generator plugins which generate + * code specific to the particular RPC implementation. This way the generated + * code can be more appropriate for the implementation in use and can avoid + * unnecessary layers of indirection. + * + * @author kenton@google.com Kenton Varda + */ +public interface RpcChannel { + /** + * Call the given method of the remote service. This method is similar to + * {@code Service.callMethod()} with one important difference: the caller + * decides the types of the {@code Message} objects, not the callee. The + * request may be of any type as long as + * {@code request.getDescriptor() == method.getInputType()}. + * The response passed to the callback will be of the same type as + * {@code responsePrototype} (which must have + * {@code getDescriptor() == method.getOutputType()}). + */ + void callMethod(Descriptors.MethodDescriptor method, + RpcController controller, + Message request, + Message responsePrototype, + RpcCallback done); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java new file mode 100644 index 000000000..aaa5446da --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java @@ -0,0 +1,118 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + *

An {@code RpcController} mediates a single method call. The primary + * purpose of the controller is to provide a way to manipulate settings + * specific to the RPC implementation and to find out about RPC-level errors. + * + *

Starting with version 2.3.0, RPC implementations should not try to build + * on this, but should instead provide code generator plugins which generate + * code specific to the particular RPC implementation. This way the generated + * code can be more appropriate for the implementation in use and can avoid + * unnecessary layers of indirection. + * + *

The methods provided by the {@code RpcController} interface are intended + * to be a "least common denominator" set of features which we expect all + * implementations to support. Specific implementations may provide more + * advanced features (e.g. deadline propagation). + * + * @author kenton@google.com Kenton Varda + */ +public interface RpcController { + // ----------------------------------------------------------------- + // These calls may be made from the client side only. Their results + // are undefined on the server side (may throw RuntimeExceptions). + + /** + * Resets the RpcController to its initial state so that it may be reused in + * a new call. This can be called from the client side only. It must not + * be called while an RPC is in progress. + */ + void reset(); + + /** + * After a call has finished, returns true if the call failed. The possible + * reasons for failure depend on the RPC implementation. {@code failed()} + * most only be called on the client side, and must not be called before a + * call has finished. + */ + boolean failed(); + + /** + * If {@code failed()} is {@code true}, returns a human-readable description + * of the error. + */ + String errorText(); + + /** + * Advises the RPC system that the caller desires that the RPC call be + * canceled. The RPC system may cancel it immediately, may wait awhile and + * then cancel it, or may not even cancel the call at all. If the call is + * canceled, the "done" callback will still be called and the RpcController + * will indicate that the call failed at that time. + */ + void startCancel(); + + // ----------------------------------------------------------------- + // These calls may be made from the server side only. Their results + // are undefined on the client side (may throw RuntimeExceptions). + + /** + * Causes {@code failed()} to return true on the client side. {@code reason} + * will be incorporated into the message returned by {@code errorText()}. + * If you find you need to return machine-readable information about + * failures, you should incorporate it into your response protocol buffer + * and should NOT call {@code setFailed()}. + */ + void setFailed(String reason); + + /** + * If {@code true}, indicates that the client canceled the RPC, so the server + * may as well give up on replying to it. This method must be called on the + * server side only. The server should still call the final "done" callback. + */ + boolean isCanceled(); + + /** + * Asks that the given callback be called when the RPC is canceled. The + * parameter passed to the callback will always be {@code null}. The + * callback will always be called exactly once. If the RPC completes without + * being canceled, the callback will be called after completion. If the RPC + * has already been canceled when NotifyOnCancel() is called, the callback + * will be called immediately. + * + *

{@code notifyOnCancel()} must be called no more than once per request. + * It must be called on the server side only. + */ + void notifyOnCancel(RpcCallback callback); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java new file mode 100644 index 000000000..b1b959a8a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java @@ -0,0 +1,135 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * Grab-bag of utility functions useful when dealing with RPCs. + * + * @author kenton@google.com Kenton Varda + */ +public final class RpcUtil { + private RpcUtil() {} + + /** + * Take an {@code RpcCallback} and convert it to an + * {@code RpcCallback} accepting a specific message type. This is always + * type-safe (parameter type contravariance). + */ + @SuppressWarnings("unchecked") + public static RpcCallback + specializeCallback(final RpcCallback originalCallback) { + return (RpcCallback)originalCallback; + // The above cast works, but only due to technical details of the Java + // implementation. A more theoretically correct -- but less efficient -- + // implementation would be as follows: + // return new RpcCallback() { + // public void run(Type parameter) { + // originalCallback.run(parameter); + // } + // }; + } + + /** + * Take an {@code RpcCallback} accepting a specific message type and convert + * it to an {@code RpcCallback}. The generalized callback will + * accept any message object which has the same descriptor, and will convert + * it to the correct class before calling the original callback. However, + * if the generalized callback is given a message with a different descriptor, + * an exception will be thrown. + */ + public static + RpcCallback generalizeCallback( + final RpcCallback originalCallback, + final Class originalClass, + final Type defaultInstance) { + return new RpcCallback() { + public void run(final Message parameter) { + Type typedParameter; + try { + typedParameter = originalClass.cast(parameter); + } catch (ClassCastException ignored) { + typedParameter = copyAsType(defaultInstance, parameter); + } + originalCallback.run(typedParameter); + } + }; + } + + /** + * Creates a new message of type "Type" which is a copy of "source". "source" + * must have the same descriptor but may be a different class (e.g. + * DynamicMessage). + */ + @SuppressWarnings("unchecked") + private static Type copyAsType( + final Type typeDefaultInstance, final Message source) { + return (Type)typeDefaultInstance.newBuilderForType() + .mergeFrom(source) + .build(); + } + + /** + * Creates a callback which can only be called once. This may be useful for + * security, when passing a callback to untrusted code: most callbacks do + * not expect to be called more than once, so doing so may expose bugs if it + * is not prevented. + */ + public static + RpcCallback newOneTimeCallback( + final RpcCallback originalCallback) { + return new RpcCallback() { + private boolean alreadyCalled = false; + + public void run(final ParameterType parameter) { + synchronized(this) { + if (alreadyCalled) { + throw new AlreadyCalledException(); + } + alreadyCalled = true; + } + + originalCallback.run(parameter); + } + }; + } + + /** + * Exception thrown when a one-time callback is called more than once. + */ + public static final class AlreadyCalledException extends RuntimeException { + private static final long serialVersionUID = 5469741279507848266L; + + public AlreadyCalledException() { + super("This RpcCallback was already called and cannot be called " + + "multiple times."); + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java new file mode 100644 index 000000000..541585f41 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java @@ -0,0 +1,117 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * Abstract base interface for protocol-buffer-based RPC services. Services + * themselves are abstract classes (implemented either by servers or as + * stubs), but they subclass this base interface. The methods of this + * interface can be used to call the methods of the service without knowing + * its exact type at compile time (analogous to the Message interface). + * + *

Starting with version 2.3.0, RPC implementations should not try to build + * on this, but should instead provide code generator plugins which generate + * code specific to the particular RPC implementation. This way the generated + * code can be more appropriate for the implementation in use and can avoid + * unnecessary layers of indirection. + * + * @author kenton@google.com Kenton Varda + */ +public interface Service { + /** + * Get the {@code ServiceDescriptor} describing this service and its methods. + */ + Descriptors.ServiceDescriptor getDescriptorForType(); + + /** + *

Call a method of the service specified by MethodDescriptor. This is + * normally implemented as a simple {@code switch()} that calls the standard + * definitions of the service's methods. + * + *

Preconditions: + *

    + *
  • {@code method.getService() == getDescriptorForType()} + *
  • {@code request} is of the exact same class as the object returned by + * {@code getRequestPrototype(method)}. + *
  • {@code controller} is of the correct type for the RPC implementation + * being used by this Service. For stubs, the "correct type" depends + * on the RpcChannel which the stub is using. Server-side Service + * implementations are expected to accept whatever type of + * {@code RpcController} the server-side RPC implementation uses. + *
+ * + *

Postconditions: + *

    + *
  • {@code done} will be called when the method is complete. This may be + * before {@code callMethod()} returns or it may be at some point in + * the future. + *
  • The parameter to {@code done} is the response. It must be of the + * exact same type as would be returned by + * {@code getResponsePrototype(method)}. + *
  • If the RPC failed, the parameter to {@code done} will be + * {@code null}. Further details about the failure can be found by + * querying {@code controller}. + *
+ */ + void callMethod(Descriptors.MethodDescriptor method, + RpcController controller, + Message request, + RpcCallback done); + + /** + *

{@code callMethod()} requires that the request passed in is of a + * particular subclass of {@code Message}. {@code getRequestPrototype()} + * gets the default instances of this type for a given method. You can then + * call {@code Message.newBuilderForType()} on this instance to + * construct a builder to build an object which you can then pass to + * {@code callMethod()}. + * + *

Example: + *

+   *   MethodDescriptor method =
+   *     service.getDescriptorForType().findMethodByName("Foo");
+   *   Message request =
+   *     stub.getRequestPrototype(method).newBuilderForType()
+   *         .mergeFrom(input).build();
+   *   service.callMethod(method, request, callback);
+   * 
+ */ + Message getRequestPrototype(Descriptors.MethodDescriptor method); + + /** + * Like {@code getRequestPrototype()}, but gets a prototype of the response + * message. {@code getResponsePrototype()} is generally not needed because + * the {@code Service} implementation constructs the response message itself, + * but it may be useful in some cases to know ahead of time what type of + * object will be returned. + */ + Message getResponsePrototype(Descriptors.MethodDescriptor method); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java new file mode 100644 index 000000000..cde669d6a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java @@ -0,0 +1,52 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * Thrown by blocking RPC methods when a failure occurs. + * + * @author cpovirk@google.com (Chris Povirk) + */ +public class ServiceException extends Exception { + private static final long serialVersionUID = -1219262335729891920L; + + public ServiceException(final String message) { + super(message); + } + + public ServiceException(final Throwable cause) { + super(cause); + } + + public ServiceException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java new file mode 100644 index 000000000..d4475f665 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java @@ -0,0 +1,241 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * SingleFieldBuilder implements a structure that a protocol + * message uses to hold a single field of another protocol message. It supports + * the classical use case of setting an immutable {@link Message} as the value + * of the field and is highly optimized around this. + *
+ * It also supports the additional use case of setting a {@link Message.Builder} + * as the field and deferring conversion of that Builder + * to an immutable Message. In this way, it's possible to maintain + * a tree of Builder's that acts as a fully read/write data + * structure. + *
+ * Logically, one can think of a tree of builders as converting the entire tree + * to messages when build is called on the root or when any method is called + * that desires a Message instead of a Builder. In terms of the implementation, + * the SingleFieldBuilder and RepeatedFieldBuilder + * classes cache messages that were created so that messages only need to be + * created when some change occured in its builder or a builder for one of its + * descendants. + * + * @param the type of message for the field + * @param the type of builder for the field + * @param the common interface for the message and the builder + * + * @author jonp@google.com (Jon Perlow) + */ +public class SingleFieldBuilder + + implements GeneratedMessage.BuilderParent { + + // Parent to send changes to. + private GeneratedMessage.BuilderParent parent; + + // Invariant: one of builder or message fields must be non-null. + + // If set, this is the case where we are backed by a builder. In this case, + // message field represents a cached message for the builder (or null if + // there is no cached message). + private BType builder; + + // If builder is non-null, this represents a cached message from the builder. + // If builder is null, this is the authoritative message for the field. + private MType message; + + // Indicates that we've built a message and so we are now obligated + // to dispatch dirty invalidations. See GeneratedMessage.BuilderListener. + private boolean isClean; + + public SingleFieldBuilder( + MType message, + GeneratedMessage.BuilderParent parent, + boolean isClean) { + if (message == null) { + throw new NullPointerException(); + } + this.message = message; + this.parent = parent; + this.isClean = isClean; + } + + public void dispose() { + // Null out parent so we stop sending it invalidations. + parent = null; + } + + /** + * Get the message for the field. If the message is currently stored + * as a Builder, it is converted to a Message by + * calling {@link Message.Builder#buildPartial} on it. If no message has + * been set, returns the default instance of the message. + * + * @return the message for the field + */ + @SuppressWarnings("unchecked") + public MType getMessage() { + if (message == null) { + // If message is null, the invariant is that we must be have a builder. + message = (MType) builder.buildPartial(); + } + return message; + } + + /** + * Builds the message and returns it. + * + * @return the message + */ + public MType build() { + // Now that build has been called, we are required to dispatch + // invalidations. + isClean = true; + return getMessage(); + } + + /** + * Gets a builder for the field. If no builder has been created yet, a + * builder is created on demand by calling {@link Message#toBuilder}. + * + * @return The builder for the field + */ + @SuppressWarnings("unchecked") + public BType getBuilder() { + if (builder == null) { + // builder.mergeFrom() on a fresh builder + // does not create any sub-objects with independent clean/dirty states, + // therefore setting the builder itself to clean without actually calling + // build() cannot break any invariants. + builder = (BType) message.newBuilderForType(this); + builder.mergeFrom(message); // no-op if message is the default message + builder.markClean(); + } + return builder; + } + + /** + * Gets the base class interface for the field. This may either be a builder + * or a message. It will return whatever is more efficient. + * + * @return the message or builder for the field as the base class interface + */ + @SuppressWarnings("unchecked") + public IType getMessageOrBuilder() { + if (builder != null) { + return (IType) builder; + } else { + return (IType) message; + } + } + + /** + * Sets a message for the field replacing any existing value. + * + * @param message the message to set + * @return the builder + */ + public SingleFieldBuilder setMessage( + MType message) { + if (message == null) { + throw new NullPointerException(); + } + this.message = message; + if (builder != null) { + builder.dispose(); + builder = null; + } + onChanged(); + return this; + } + + /** + * Merges the field from another field. + * + * @param value the value to merge from + * @return the builder + */ + public SingleFieldBuilder mergeFrom( + MType value) { + if (builder == null && message == message.getDefaultInstanceForType()) { + message = value; + } else { + getBuilder().mergeFrom(value); + } + onChanged(); + return this; + } + + /** + * Clears the value of the field. + * + * @return the builder + */ + @SuppressWarnings("unchecked") + public SingleFieldBuilder clear() { + message = (MType) (message != null ? + message.getDefaultInstanceForType() : + builder.getDefaultInstanceForType()); + if (builder != null) { + builder.dispose(); + builder = null; + } + onChanged(); + return this; + } + + /** + * Called when a the builder or one of its nested children has changed + * and any parent should be notified of its invalidation. + */ + private void onChanged() { + // If builder is null, this is the case where onChanged is being called + // from setMessage or clear. + if (builder != null) { + message = null; + } + if (isClean && parent != null) { + parent.markDirty(); + + // Don't keep dispatching invalidations until build is called again. + isClean = false; + } + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void markDirty() { + onChanged(); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java new file mode 100644 index 000000000..1cf270f37 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java @@ -0,0 +1,618 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.AbstractMap; +import java.util.AbstractSet; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.TreeMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Set; +import java.util.SortedMap; + +/** + * A custom map implementation from FieldDescriptor to Object optimized to + * minimize the number of memory allocations for instances with a small number + * of mappings. The implementation stores the first {@code k} mappings in an + * array for a configurable value of {@code k}, allowing direct access to the + * corresponding {@code Entry}s without the need to create an Iterator. The + * remaining entries are stored in an overflow map. Iteration over the entries + * in the map should be done as follows: + * + *
+ * for (int i = 0; i < fieldMap.getNumArrayEntries(); i++) {
+ *   process(fieldMap.getArrayEntryAt(i));
+ * }
+ * for (Map.Entry<K, V> entry : fieldMap.getOverflowEntries()) {
+ *   process(entry);
+ * }
+ * 
+ * + * The resulting iteration is in order of ascending field tag number. The + * object returned by {@link #entrySet()} adheres to the same contract but is + * less efficient as it necessarily involves creating an object for iteration. + *

+ * The tradeoff for this memory efficiency is that the worst case running time + * of the {@code put()} operation is {@code O(k + lg n)}, which happens when + * entries are added in descending order. {@code k} should be chosen such that + * it covers enough common cases without adversely affecting larger maps. In + * practice, the worst case scenario does not happen for extensions because + * extension fields are serialized and deserialized in order of ascending tag + * number, but the worst case scenario can happen for DynamicMessages. + *

+ * The running time for all other operations is similar to that of + * {@code TreeMap}. + *

+ * Instances are not thread-safe until {@link #makeImmutable()} is called, + * after which any modifying operation will result in an + * {@link UnsupportedOperationException}. + * + * @author darick@google.com Darick Tong + */ +// This class is final for all intents and purposes because the constructor is +// private. However, the FieldDescriptor-specific logic is encapsulated in +// a subclass to aid testability of the core logic. +class SmallSortedMap, V> extends AbstractMap { + + /** + * Creates a new instance for mapping FieldDescriptors to their values. + * The {@link #makeImmutable()} implementation will convert the List values + * of any repeated fields to unmodifiable lists. + * + * @param arraySize The size of the entry array containing the + * lexicographically smallest mappings. + */ + static > + SmallSortedMap newFieldMap(int arraySize) { + return new SmallSortedMap(arraySize) { + @Override + @SuppressWarnings("unchecked") + public void makeImmutable() { + if (!isImmutable()) { + for (int i = 0; i < getNumArrayEntries(); i++) { + final Map.Entry entry = + getArrayEntryAt(i); + if (entry.getKey().isRepeated()) { + final List value = (List) entry.getValue(); + entry.setValue(Collections.unmodifiableList(value)); + } + } + for (Map.Entry entry : + getOverflowEntries()) { + if (entry.getKey().isRepeated()) { + final List value = (List) entry.getValue(); + entry.setValue(Collections.unmodifiableList(value)); + } + } + } + super.makeImmutable(); + } + }; + } + + /** + * Creates a new instance for testing. + * + * @param arraySize The size of the entry array containing the + * lexicographically smallest mappings. + */ + static , V> SmallSortedMap newInstanceForTest( + int arraySize) { + return new SmallSortedMap(arraySize); + } + + private final int maxArraySize; + // The "entry array" is actually a List because generic arrays are not + // allowed. ArrayList also nicely handles the entry shifting on inserts and + // removes. + private List entryList; + private Map overflowEntries; + private boolean isImmutable; + // The EntrySet is a stateless view of the Map. It's initialized the first + // time it is requested and reused henceforth. + private volatile EntrySet lazyEntrySet; + + /** + * @code arraySize Size of the array in which the lexicographically smallest + * mappings are stored. (i.e. the {@code k} referred to in the class + * documentation). + */ + private SmallSortedMap(int arraySize) { + this.maxArraySize = arraySize; + this.entryList = Collections.emptyList(); + this.overflowEntries = Collections.emptyMap(); + } + + /** Make this map immutable from this point forward. */ + public void makeImmutable() { + if (!isImmutable) { + // Note: There's no need to wrap the entryList in an unmodifiableList + // because none of the list's accessors are exposed. The iterator() of + // overflowEntries, on the other hand, is exposed so it must be made + // unmodifiable. + overflowEntries = overflowEntries.isEmpty() ? + Collections.emptyMap() : + Collections.unmodifiableMap(overflowEntries); + isImmutable = true; + } + } + + /** @return Whether {@link #makeImmutable()} has been called. */ + public boolean isImmutable() { + return isImmutable; + } + + /** @return The number of entries in the entry array. */ + public int getNumArrayEntries() { + return entryList.size(); + } + + /** @return The array entry at the given {@code index}. */ + public Map.Entry getArrayEntryAt(int index) { + return entryList.get(index); + } + + /** @return There number of overflow entries. */ + public int getNumOverflowEntries() { + return overflowEntries.size(); + } + + /** @return An iterable over the overflow entries. */ + public Iterable> getOverflowEntries() { + return overflowEntries.isEmpty() ? + EmptySet.>iterable() : + overflowEntries.entrySet(); + } + + @Override + public int size() { + return entryList.size() + overflowEntries.size(); + } + + /** + * The implementation throws a {@code ClassCastException} if o is not an + * object of type {@code K}. + * + * {@inheritDoc} + */ + @Override + public boolean containsKey(Object o) { + @SuppressWarnings("unchecked") + final K key = (K) o; + return binarySearchInArray(key) >= 0 || overflowEntries.containsKey(key); + } + + /** + * The implementation throws a {@code ClassCastException} if o is not an + * object of type {@code K}. + * + * {@inheritDoc} + */ + @Override + public V get(Object o) { + @SuppressWarnings("unchecked") + final K key = (K) o; + final int index = binarySearchInArray(key); + if (index >= 0) { + return entryList.get(index).getValue(); + } + return overflowEntries.get(key); + } + + @Override + public V put(K key, V value) { + checkMutable(); + final int index = binarySearchInArray(key); + if (index >= 0) { + // Replace existing array entry. + return entryList.get(index).setValue(value); + } + ensureEntryArrayMutable(); + final int insertionPoint = -(index + 1); + if (insertionPoint >= maxArraySize) { + // Put directly in overflow. + return getOverflowEntriesMutable().put(key, value); + } + // Insert new Entry in array. + if (entryList.size() == maxArraySize) { + // Shift the last array entry into overflow. + final Entry lastEntryInArray = entryList.remove(maxArraySize - 1); + getOverflowEntriesMutable().put(lastEntryInArray.getKey(), + lastEntryInArray.getValue()); + } + entryList.add(insertionPoint, new Entry(key, value)); + return null; + } + + @Override + public void clear() { + checkMutable(); + if (!entryList.isEmpty()) { + entryList.clear(); + } + if (!overflowEntries.isEmpty()) { + overflowEntries.clear(); + } + } + + /** + * The implementation throws a {@code ClassCastException} if o is not an + * object of type {@code K}. + * + * {@inheritDoc} + */ + @Override + public V remove(Object o) { + checkMutable(); + @SuppressWarnings("unchecked") + final K key = (K) o; + final int index = binarySearchInArray(key); + if (index >= 0) { + return removeArrayEntryAt(index); + } + // overflowEntries might be Collections.unmodifiableMap(), so only + // call remove() if it is non-empty. + if (overflowEntries.isEmpty()) { + return null; + } else { + return overflowEntries.remove(key); + } + } + + private V removeArrayEntryAt(int index) { + checkMutable(); + final V removed = entryList.remove(index).getValue(); + if (!overflowEntries.isEmpty()) { + // Shift the first entry in the overflow to be the last entry in the + // array. + final Iterator> iterator = + getOverflowEntriesMutable().entrySet().iterator(); + entryList.add(new Entry(iterator.next())); + iterator.remove(); + } + return removed; + } + + /** + * @param key The key to find in the entry array. + * @return The returned integer position follows the same semantics as the + * value returned by {@link java.util.Arrays#binarySearch()}. + */ + private int binarySearchInArray(K key) { + int left = 0; + int right = entryList.size() - 1; + + // Optimization: For the common case in which entries are added in + // ascending tag order, check the largest element in the array before + // doing a full binary search. + if (right >= 0) { + int cmp = key.compareTo(entryList.get(right).getKey()); + if (cmp > 0) { + return -(right + 2); // Insert point is after "right". + } else if (cmp == 0) { + return right; + } + } + + while (left <= right) { + int mid = (left + right) / 2; + int cmp = key.compareTo(entryList.get(mid).getKey()); + if (cmp < 0) { + right = mid - 1; + } else if (cmp > 0) { + left = mid + 1; + } else { + return mid; + } + } + return -(left + 1); + } + + /** + * Similar to the AbstractMap implementation of {@code keySet()} and + * {@code values()}, the entry set is created the first time this method is + * called, and returned in response to all subsequent calls. + * + * {@inheritDoc} + */ + @Override + public Set> entrySet() { + if (lazyEntrySet == null) { + lazyEntrySet = new EntrySet(); + } + return lazyEntrySet; + } + + /** + * @throws UnsupportedOperationException if {@link #makeImmutable()} has + * has been called. + */ + private void checkMutable() { + if (isImmutable) { + throw new UnsupportedOperationException(); + } + } + + /** + * @return a {@link SortedMap} to which overflow entries mappings can be + * added or removed. + * @throws UnsupportedOperationException if {@link #makeImmutable()} has been + * called. + */ + @SuppressWarnings("unchecked") + private SortedMap getOverflowEntriesMutable() { + checkMutable(); + if (overflowEntries.isEmpty() && !(overflowEntries instanceof TreeMap)) { + overflowEntries = new TreeMap(); + } + return (SortedMap) overflowEntries; + } + + /** + * Lazily creates the entry list. Any code that adds to the list must first + * call this method. + */ + private void ensureEntryArrayMutable() { + checkMutable(); + if (entryList.isEmpty() && !(entryList instanceof ArrayList)) { + entryList = new ArrayList(maxArraySize); + } + } + + /** + * Entry implementation that implements Comparable in order to support + * binary search witin the entry array. Also checks mutability in + * {@link #setValue()}. + */ + private class Entry implements Map.Entry, Comparable { + + private final K key; + private V value; + + Entry(Map.Entry copy) { + this(copy.getKey(), copy.getValue()); + } + + Entry(K key, V value) { + this.key = key; + this.value = value; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public K getKey() { + return key; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public V getValue() { + return value; + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public int compareTo(Entry other) { + return getKey().compareTo(other.getKey()); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public V setValue(V newValue) { + checkMutable(); + final V oldValue = this.value; + this.value = newValue; + return oldValue; + } + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } + if (!(o instanceof Map.Entry)) { + return false; + } + @SuppressWarnings("unchecked") + Map.Entry other = (Map.Entry) o; + return equals(key, other.getKey()) && equals(value, other.getValue()); + } + + @Override + public int hashCode() { + return (key == null ? 0 : key.hashCode()) ^ + (value == null ? 0 : value.hashCode()); + } + + @Override + public String toString() { + return key + "=" + value; + } + + /** equals() that handles null values. */ + private boolean equals(Object o1, Object o2) { + return o1 == null ? o2 == null : o1.equals(o2); + } + } + + /** + * Stateless view of the entries in the field map. + */ + private class EntrySet extends AbstractSet> { + + @Override + public Iterator> iterator() { + return new EntryIterator(); + } + + @Override + public int size() { + return SmallSortedMap.this.size(); + } + + /** + * Throws a {@link ClassCastException} if o is not of the expected type. + * + * {@inheritDoc} + */ + @Override + public boolean contains(Object o) { + @SuppressWarnings("unchecked") + final Map.Entry entry = (Map.Entry) o; + final V existing = get(entry.getKey()); + final V value = entry.getValue(); + return existing == value || + (existing != null && existing.equals(value)); + } + + @Override + public boolean add(Map.Entry entry) { + if (!contains(entry)) { + put(entry.getKey(), entry.getValue()); + return true; + } + return false; + } + + /** + * Throws a {@link ClassCastException} if o is not of the expected type. + * + * {@inheritDoc} + */ + @Override + public boolean remove(Object o) { + @SuppressWarnings("unchecked") + final Map.Entry entry = (Map.Entry) o; + if (contains(entry)) { + SmallSortedMap.this.remove(entry.getKey()); + return true; + } + return false; + } + + @Override + public void clear() { + SmallSortedMap.this.clear(); + } + } + + /** + * Iterator implementation that switches from the entry array to the overflow + * entries appropriately. + */ + private class EntryIterator implements Iterator> { + + private int pos = -1; + private boolean nextCalledBeforeRemove; + private Iterator> lazyOverflowIterator; + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean hasNext() { + return (pos + 1) < entryList.size() || + getOverflowIterator().hasNext(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Map.Entry next() { + nextCalledBeforeRemove = true; + // Always increment pos so that we know whether the last returned value + // was from the array or from overflow. + if (++pos < entryList.size()) { + return entryList.get(pos); + } + return getOverflowIterator().next(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void remove() { + if (!nextCalledBeforeRemove) { + throw new IllegalStateException("remove() was called before next()"); + } + nextCalledBeforeRemove = false; + checkMutable(); + + if (pos < entryList.size()) { + removeArrayEntryAt(pos--); + } else { + getOverflowIterator().remove(); + } + } + + /** + * It is important to create the overflow iterator only after the array + * entries have been iterated over because the overflow entry set changes + * when the client calls remove() on the array entries, which invalidates + * any existing iterators. + */ + private Iterator> getOverflowIterator() { + if (lazyOverflowIterator == null) { + lazyOverflowIterator = overflowEntries.entrySet().iterator(); + } + return lazyOverflowIterator; + } + } + + /** + * Helper class that holds immutable instances of an Iterable/Iterator that + * we return when the overflow entries is empty. This eliminates the creation + * of an Iterator object when there is nothing to iterate over. + */ + private static class EmptySet { + + private static final Iterator ITERATOR = new Iterator() { + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean hasNext() { + return false; + } + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Object next() { + throw new NoSuchElementException(); + } + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void remove() { + throw new UnsupportedOperationException(); + } + }; + + private static final Iterable ITERABLE = new Iterable() { + //@Override (Java 1.6 override semantics, but we must support 1.5) + public Iterator iterator() { + return ITERATOR; + } + }; + + @SuppressWarnings("unchecked") + static Iterable iterable() { + return (Iterable) ITERABLE; + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java new file mode 100644 index 000000000..d5fbdabf8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java @@ -0,0 +1,1476 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.Descriptors.EnumDescriptor; +import com.google.protobuf.Descriptors.EnumValueDescriptor; + +import java.io.IOException; +import java.nio.CharBuffer; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Provide text parsing and formatting support for proto2 instances. + * The implementation largely follows google/protobuf/text_format.cc. + * + * @author wenboz@google.com Wenbo Zhu + * @author kenton@google.com Kenton Varda + */ +public final class TextFormat { + private TextFormat() {} + + private static final Printer DEFAULT_PRINTER = new Printer(false); + private static final Printer SINGLE_LINE_PRINTER = new Printer(true); + + /** + * Outputs a textual representation of the Protocol Message supplied into + * the parameter output. (This representation is the new version of the + * classic "ProtocolPrinter" output from the original Protocol Buffer system) + */ + public static void print(final Message message, final Appendable output) + throws IOException { + DEFAULT_PRINTER.print(message, new TextGenerator(output)); + } + + /** Outputs a textual representation of {@code fields} to {@code output}. */ + public static void print(final UnknownFieldSet fields, + final Appendable output) + throws IOException { + DEFAULT_PRINTER.printUnknownFields(fields, new TextGenerator(output)); + } + + /** + * Generates a human readable form of this message, useful for debugging and + * other purposes, with no newline characters. + */ + public static String shortDebugString(final Message message) { + try { + final StringBuilder sb = new StringBuilder(); + SINGLE_LINE_PRINTER.print(message, new TextGenerator(sb)); + // Single line mode currently might have an extra space at the end. + return sb.toString().trim(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + /** + * Generates a human readable form of the unknown fields, useful for debugging + * and other purposes, with no newline characters. + */ + public static String shortDebugString(final UnknownFieldSet fields) { + try { + final StringBuilder sb = new StringBuilder(); + SINGLE_LINE_PRINTER.printUnknownFields(fields, new TextGenerator(sb)); + // Single line mode currently might have an extra space at the end. + return sb.toString().trim(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + /** + * Like {@code print()}, but writes directly to a {@code String} and + * returns it. + */ + public static String printToString(final Message message) { + try { + final StringBuilder text = new StringBuilder(); + print(message, text); + return text.toString(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + /** + * Like {@code print()}, but writes directly to a {@code String} and + * returns it. + */ + public static String printToString(final UnknownFieldSet fields) { + try { + final StringBuilder text = new StringBuilder(); + print(fields, text); + return text.toString(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + public static void printField(final FieldDescriptor field, + final Object value, + final Appendable output) + throws IOException { + DEFAULT_PRINTER.printField(field, value, new TextGenerator(output)); + } + + public static String printFieldToString(final FieldDescriptor field, + final Object value) { + try { + final StringBuilder text = new StringBuilder(); + printField(field, value, text); + return text.toString(); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + /** + * Outputs a textual representation of the value of given field value. + * + * @param field the descriptor of the field + * @param value the value of the field + * @param output the output to which to append the formatted value + * @throws ClassCastException if the value is not appropriate for the + * given field descriptor + * @throws IOException if there is an exception writing to the output + */ + public static void printFieldValue(final FieldDescriptor field, + final Object value, + final Appendable output) + throws IOException { + DEFAULT_PRINTER.printFieldValue(field, value, new TextGenerator(output)); + } + + /** + * Outputs a textual representation of the value of an unknown field. + * + * @param tag the field's tag number + * @param value the value of the field + * @param output the output to which to append the formatted value + * @throws ClassCastException if the value is not appropriate for the + * given field descriptor + * @throws IOException if there is an exception writing to the output + */ + public static void printUnknownFieldValue(final int tag, + final Object value, + final Appendable output) + throws IOException { + printUnknownFieldValue(tag, value, new TextGenerator(output)); + } + + private static void printUnknownFieldValue(final int tag, + final Object value, + final TextGenerator generator) + throws IOException { + switch (WireFormat.getTagWireType(tag)) { + case WireFormat.WIRETYPE_VARINT: + generator.print(unsignedToString((Long) value)); + break; + case WireFormat.WIRETYPE_FIXED32: + generator.print( + String.format((Locale) null, "0x%08x", (Integer) value)); + break; + case WireFormat.WIRETYPE_FIXED64: + generator.print(String.format((Locale) null, "0x%016x", (Long) value)); + break; + case WireFormat.WIRETYPE_LENGTH_DELIMITED: + generator.print("\""); + generator.print(escapeBytes((ByteString) value)); + generator.print("\""); + break; + case WireFormat.WIRETYPE_START_GROUP: + DEFAULT_PRINTER.printUnknownFields((UnknownFieldSet) value, generator); + break; + default: + throw new IllegalArgumentException("Bad tag: " + tag); + } + } + + /** Helper class for converting protobufs to text. */ + private static final class Printer { + /** Whether to omit newlines from the output. */ + final boolean singleLineMode; + + private Printer(final boolean singleLineMode) { + this.singleLineMode = singleLineMode; + } + + private void print(final Message message, final TextGenerator generator) + throws IOException { + for (Map.Entry field + : message.getAllFields().entrySet()) { + printField(field.getKey(), field.getValue(), generator); + } + printUnknownFields(message.getUnknownFields(), generator); + } + + private void printField(final FieldDescriptor field, final Object value, + final TextGenerator generator) throws IOException { + if (field.isRepeated()) { + // Repeated field. Print each element. + for (Object element : (List) value) { + printSingleField(field, element, generator); + } + } else { + printSingleField(field, value, generator); + } + } + + private void printSingleField(final FieldDescriptor field, + final Object value, + final TextGenerator generator) + throws IOException { + if (field.isExtension()) { + generator.print("["); + // We special-case MessageSet elements for compatibility with proto1. + if (field.getContainingType().getOptions().getMessageSetWireFormat() + && (field.getType() == FieldDescriptor.Type.MESSAGE) + && (field.isOptional()) + // object equality + && (field.getExtensionScope() == field.getMessageType())) { + generator.print(field.getMessageType().getFullName()); + } else { + generator.print(field.getFullName()); + } + generator.print("]"); + } else { + if (field.getType() == FieldDescriptor.Type.GROUP) { + // Groups must be serialized with their original capitalization. + generator.print(field.getMessageType().getName()); + } else { + generator.print(field.getName()); + } + } + + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + if (singleLineMode) { + generator.print(" { "); + } else { + generator.print(" {\n"); + generator.indent(); + } + } else { + generator.print(": "); + } + + printFieldValue(field, value, generator); + + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + if (singleLineMode) { + generator.print("} "); + } else { + generator.outdent(); + generator.print("}\n"); + } + } else { + if (singleLineMode) { + generator.print(" "); + } else { + generator.print("\n"); + } + } + } + + private void printFieldValue(final FieldDescriptor field, + final Object value, + final TextGenerator generator) + throws IOException { + switch (field.getType()) { + case INT32: + case SINT32: + case SFIXED32: + generator.print(((Integer) value).toString()); + break; + + case INT64: + case SINT64: + case SFIXED64: + generator.print(((Long) value).toString()); + break; + + case BOOL: + generator.print(((Boolean) value).toString()); + break; + + case FLOAT: + generator.print(((Float) value).toString()); + break; + + case DOUBLE: + generator.print(((Double) value).toString()); + break; + + case UINT32: + case FIXED32: + generator.print(unsignedToString((Integer) value)); + break; + + case UINT64: + case FIXED64: + generator.print(unsignedToString((Long) value)); + break; + + case STRING: + generator.print("\""); + generator.print(escapeText((String) value)); + generator.print("\""); + break; + + case BYTES: + generator.print("\""); + generator.print(escapeBytes((ByteString) value)); + generator.print("\""); + break; + + case ENUM: + generator.print(((EnumValueDescriptor) value).getName()); + break; + + case MESSAGE: + case GROUP: + print((Message) value, generator); + break; + } + } + + private void printUnknownFields(final UnknownFieldSet unknownFields, + final TextGenerator generator) + throws IOException { + for (Map.Entry entry : + unknownFields.asMap().entrySet()) { + final int number = entry.getKey(); + final UnknownFieldSet.Field field = entry.getValue(); + printUnknownField(number, WireFormat.WIRETYPE_VARINT, + field.getVarintList(), generator); + printUnknownField(number, WireFormat.WIRETYPE_FIXED32, + field.getFixed32List(), generator); + printUnknownField(number, WireFormat.WIRETYPE_FIXED64, + field.getFixed64List(), generator); + printUnknownField(number, WireFormat.WIRETYPE_LENGTH_DELIMITED, + field.getLengthDelimitedList(), generator); + for (final UnknownFieldSet value : field.getGroupList()) { + generator.print(entry.getKey().toString()); + if (singleLineMode) { + generator.print(" { "); + } else { + generator.print(" {\n"); + generator.indent(); + } + printUnknownFields(value, generator); + if (singleLineMode) { + generator.print("} "); + } else { + generator.outdent(); + generator.print("}\n"); + } + } + } + } + + private void printUnknownField(final int number, + final int wireType, + final List values, + final TextGenerator generator) + throws IOException { + for (final Object value : values) { + generator.print(String.valueOf(number)); + generator.print(": "); + printUnknownFieldValue(wireType, value, generator); + generator.print(singleLineMode ? " " : "\n"); + } + } + } + + /** Convert an unsigned 32-bit integer to a string. */ + private static String unsignedToString(final int value) { + if (value >= 0) { + return Integer.toString(value); + } else { + return Long.toString(((long) value) & 0x00000000FFFFFFFFL); + } + } + + /** Convert an unsigned 64-bit integer to a string. */ + private static String unsignedToString(final long value) { + if (value >= 0) { + return Long.toString(value); + } else { + // Pull off the most-significant bit so that BigInteger doesn't think + // the number is negative, then set it again using setBit(). + return BigInteger.valueOf(value & 0x7FFFFFFFFFFFFFFFL) + .setBit(63).toString(); + } + } + + /** + * An inner class for writing text to the output stream. + */ + private static final class TextGenerator { + private final Appendable output; + private final StringBuilder indent = new StringBuilder(); + private boolean atStartOfLine = true; + + private TextGenerator(final Appendable output) { + this.output = output; + } + + /** + * Indent text by two spaces. After calling Indent(), two spaces will be + * inserted at the beginning of each line of text. Indent() may be called + * multiple times to produce deeper indents. + */ + public void indent() { + indent.append(" "); + } + + /** + * Reduces the current indent level by two spaces, or crashes if the indent + * level is zero. + */ + public void outdent() { + final int length = indent.length(); + if (length == 0) { + throw new IllegalArgumentException( + " Outdent() without matching Indent()."); + } + indent.delete(length - 2, length); + } + + /** + * Print text to the output stream. + */ + public void print(final CharSequence text) throws IOException { + final int size = text.length(); + int pos = 0; + + for (int i = 0; i < size; i++) { + if (text.charAt(i) == '\n') { + write(text.subSequence(pos, size), i - pos + 1); + pos = i + 1; + atStartOfLine = true; + } + } + write(text.subSequence(pos, size), size - pos); + } + + private void write(final CharSequence data, final int size) + throws IOException { + if (size == 0) { + return; + } + if (atStartOfLine) { + atStartOfLine = false; + output.append(indent); + } + output.append(data); + } + } + + // ================================================================= + // Parsing + + /** + * Represents a stream of tokens parsed from a {@code String}. + * + *

The Java standard library provides many classes that you might think + * would be useful for implementing this, but aren't. For example: + * + *

    + *
  • {@code java.io.StreamTokenizer}: This almost does what we want -- or, + * at least, something that would get us close to what we want -- except + * for one fatal flaw: It automatically un-escapes strings using Java + * escape sequences, which do not include all the escape sequences we + * need to support (e.g. '\x'). + *
  • {@code java.util.Scanner}: This seems like a great way at least to + * parse regular expressions out of a stream (so we wouldn't have to load + * the entire input into a single string before parsing). Sadly, + * {@code Scanner} requires that tokens be delimited with some delimiter. + * Thus, although the text "foo:" should parse to two tokens ("foo" and + * ":"), {@code Scanner} would recognize it only as a single token. + * Furthermore, {@code Scanner} provides no way to inspect the contents + * of delimiters, making it impossible to keep track of line and column + * numbers. + *
+ * + *

Luckily, Java's regular expression support does manage to be useful to + * us. (Barely: We need {@code Matcher.usePattern()}, which is new in + * Java 1.5.) So, we can use that, at least. Unfortunately, this implies + * that we need to have the entire input in one contiguous string. + */ + private static final class Tokenizer { + private final CharSequence text; + private final Matcher matcher; + private String currentToken; + + // The character index within this.text at which the current token begins. + private int pos = 0; + + // The line and column numbers of the current token. + private int line = 0; + private int column = 0; + + // The line and column numbers of the previous token (allows throwing + // errors *after* consuming). + private int previousLine = 0; + private int previousColumn = 0; + + // We use possesive quantifiers (*+ and ++) because otherwise the Java + // regex matcher has stack overflows on large inputs. + private static final Pattern WHITESPACE = + Pattern.compile("(\\s|(#.*$))++", Pattern.MULTILINE); + private static final Pattern TOKEN = Pattern.compile( + "[a-zA-Z_][0-9a-zA-Z_+-]*+|" + // an identifier + "[.]?[0-9+-][0-9a-zA-Z_.+-]*+|" + // a number + "\"([^\"\n\\\\]|\\\\.)*+(\"|\\\\?$)|" + // a double-quoted string + "\'([^\'\n\\\\]|\\\\.)*+(\'|\\\\?$)", // a single-quoted string + Pattern.MULTILINE); + + private static final Pattern DOUBLE_INFINITY = Pattern.compile( + "-?inf(inity)?", + Pattern.CASE_INSENSITIVE); + private static final Pattern FLOAT_INFINITY = Pattern.compile( + "-?inf(inity)?f?", + Pattern.CASE_INSENSITIVE); + private static final Pattern FLOAT_NAN = Pattern.compile( + "nanf?", + Pattern.CASE_INSENSITIVE); + + /** Construct a tokenizer that parses tokens from the given text. */ + private Tokenizer(final CharSequence text) { + this.text = text; + this.matcher = WHITESPACE.matcher(text); + skipWhitespace(); + nextToken(); + } + + /** Are we at the end of the input? */ + public boolean atEnd() { + return currentToken.length() == 0; + } + + /** Advance to the next token. */ + public void nextToken() { + previousLine = line; + previousColumn = column; + + // Advance the line counter to the current position. + while (pos < matcher.regionStart()) { + if (text.charAt(pos) == '\n') { + ++line; + column = 0; + } else { + ++column; + } + ++pos; + } + + // Match the next token. + if (matcher.regionStart() == matcher.regionEnd()) { + // EOF + currentToken = ""; + } else { + matcher.usePattern(TOKEN); + if (matcher.lookingAt()) { + currentToken = matcher.group(); + matcher.region(matcher.end(), matcher.regionEnd()); + } else { + // Take one character. + currentToken = String.valueOf(text.charAt(pos)); + matcher.region(pos + 1, matcher.regionEnd()); + } + + skipWhitespace(); + } + } + + /** + * Skip over any whitespace so that the matcher region starts at the next + * token. + */ + private void skipWhitespace() { + matcher.usePattern(WHITESPACE); + if (matcher.lookingAt()) { + matcher.region(matcher.end(), matcher.regionEnd()); + } + } + + /** + * If the next token exactly matches {@code token}, consume it and return + * {@code true}. Otherwise, return {@code false} without doing anything. + */ + public boolean tryConsume(final String token) { + if (currentToken.equals(token)) { + nextToken(); + return true; + } else { + return false; + } + } + + /** + * If the next token exactly matches {@code token}, consume it. Otherwise, + * throw a {@link ParseException}. + */ + public void consume(final String token) throws ParseException { + if (!tryConsume(token)) { + throw parseException("Expected \"" + token + "\"."); + } + } + + /** + * Returns {@code true} if the next token is an integer, but does + * not consume it. + */ + public boolean lookingAtInteger() { + if (currentToken.length() == 0) { + return false; + } + + final char c = currentToken.charAt(0); + return ('0' <= c && c <= '9') || + c == '-' || c == '+'; + } + + /** + * If the next token is an identifier, consume it and return its value. + * Otherwise, throw a {@link ParseException}. + */ + public String consumeIdentifier() throws ParseException { + for (int i = 0; i < currentToken.length(); i++) { + final char c = currentToken.charAt(i); + if (('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') || + ('0' <= c && c <= '9') || + (c == '_') || (c == '.')) { + // OK + } else { + throw parseException("Expected identifier."); + } + } + + final String result = currentToken; + nextToken(); + return result; + } + + /** + * If the next token is a 32-bit signed integer, consume it and return its + * value. Otherwise, throw a {@link ParseException}. + */ + public int consumeInt32() throws ParseException { + try { + final int result = parseInt32(currentToken); + nextToken(); + return result; + } catch (NumberFormatException e) { + throw integerParseException(e); + } + } + + /** + * If the next token is a 32-bit unsigned integer, consume it and return its + * value. Otherwise, throw a {@link ParseException}. + */ + public int consumeUInt32() throws ParseException { + try { + final int result = parseUInt32(currentToken); + nextToken(); + return result; + } catch (NumberFormatException e) { + throw integerParseException(e); + } + } + + /** + * If the next token is a 64-bit signed integer, consume it and return its + * value. Otherwise, throw a {@link ParseException}. + */ + public long consumeInt64() throws ParseException { + try { + final long result = parseInt64(currentToken); + nextToken(); + return result; + } catch (NumberFormatException e) { + throw integerParseException(e); + } + } + + /** + * If the next token is a 64-bit unsigned integer, consume it and return its + * value. Otherwise, throw a {@link ParseException}. + */ + public long consumeUInt64() throws ParseException { + try { + final long result = parseUInt64(currentToken); + nextToken(); + return result; + } catch (NumberFormatException e) { + throw integerParseException(e); + } + } + + /** + * If the next token is a double, consume it and return its value. + * Otherwise, throw a {@link ParseException}. + */ + public double consumeDouble() throws ParseException { + // We need to parse infinity and nan separately because + // Double.parseDouble() does not accept "inf", "infinity", or "nan". + if (DOUBLE_INFINITY.matcher(currentToken).matches()) { + final boolean negative = currentToken.startsWith("-"); + nextToken(); + return negative ? Double.NEGATIVE_INFINITY : Double.POSITIVE_INFINITY; + } + if (currentToken.equalsIgnoreCase("nan")) { + nextToken(); + return Double.NaN; + } + try { + final double result = Double.parseDouble(currentToken); + nextToken(); + return result; + } catch (NumberFormatException e) { + throw floatParseException(e); + } + } + + /** + * If the next token is a float, consume it and return its value. + * Otherwise, throw a {@link ParseException}. + */ + public float consumeFloat() throws ParseException { + // We need to parse infinity and nan separately because + // Float.parseFloat() does not accept "inf", "infinity", or "nan". + if (FLOAT_INFINITY.matcher(currentToken).matches()) { + final boolean negative = currentToken.startsWith("-"); + nextToken(); + return negative ? Float.NEGATIVE_INFINITY : Float.POSITIVE_INFINITY; + } + if (FLOAT_NAN.matcher(currentToken).matches()) { + nextToken(); + return Float.NaN; + } + try { + final float result = Float.parseFloat(currentToken); + nextToken(); + return result; + } catch (NumberFormatException e) { + throw floatParseException(e); + } + } + + /** + * If the next token is a boolean, consume it and return its value. + * Otherwise, throw a {@link ParseException}. + */ + public boolean consumeBoolean() throws ParseException { + if (currentToken.equals("true") || + currentToken.equals("t") || + currentToken.equals("1")) { + nextToken(); + return true; + } else if (currentToken.equals("false") || + currentToken.equals("f") || + currentToken.equals("0")) { + nextToken(); + return false; + } else { + throw parseException("Expected \"true\" or \"false\"."); + } + } + + /** + * If the next token is a string, consume it and return its (unescaped) + * value. Otherwise, throw a {@link ParseException}. + */ + public String consumeString() throws ParseException { + return consumeByteString().toStringUtf8(); + } + + /** + * If the next token is a string, consume it, unescape it as a + * {@link ByteString}, and return it. Otherwise, throw a + * {@link ParseException}. + */ + public ByteString consumeByteString() throws ParseException { + List list = new ArrayList(); + consumeByteString(list); + while (currentToken.startsWith("'") || currentToken.startsWith("\"")) { + consumeByteString(list); + } + return ByteString.copyFrom(list); + } + + /** + * Like {@link #consumeByteString()} but adds each token of the string to + * the given list. String literals (whether bytes or text) may come in + * multiple adjacent tokens which are automatically concatenated, like in + * C or Python. + */ + private void consumeByteString(List list) throws ParseException { + final char quote = currentToken.length() > 0 ? currentToken.charAt(0) + : '\0'; + if (quote != '\"' && quote != '\'') { + throw parseException("Expected string."); + } + + if (currentToken.length() < 2 || + currentToken.charAt(currentToken.length() - 1) != quote) { + throw parseException("String missing ending quote."); + } + + try { + final String escaped = + currentToken.substring(1, currentToken.length() - 1); + final ByteString result = unescapeBytes(escaped); + nextToken(); + list.add(result); + } catch (InvalidEscapeSequenceException e) { + throw parseException(e.getMessage()); + } + } + + /** + * Returns a {@link ParseException} with the current line and column + * numbers in the description, suitable for throwing. + */ + public ParseException parseException(final String description) { + // Note: People generally prefer one-based line and column numbers. + return new ParseException( + (line + 1) + ":" + (column + 1) + ": " + description); + } + + /** + * Returns a {@link ParseException} with the line and column numbers of + * the previous token in the description, suitable for throwing. + */ + public ParseException parseExceptionPreviousToken( + final String description) { + // Note: People generally prefer one-based line and column numbers. + return new ParseException( + (previousLine + 1) + ":" + (previousColumn + 1) + ": " + description); + } + + /** + * Constructs an appropriate {@link ParseException} for the given + * {@code NumberFormatException} when trying to parse an integer. + */ + private ParseException integerParseException( + final NumberFormatException e) { + return parseException("Couldn't parse integer: " + e.getMessage()); + } + + /** + * Constructs an appropriate {@link ParseException} for the given + * {@code NumberFormatException} when trying to parse a float or double. + */ + private ParseException floatParseException(final NumberFormatException e) { + return parseException("Couldn't parse number: " + e.getMessage()); + } + } + + /** Thrown when parsing an invalid text format message. */ + public static class ParseException extends IOException { + private static final long serialVersionUID = 3196188060225107702L; + + public ParseException(final String message) { + super(message); + } + } + + /** + * Parse a text-format message from {@code input} and merge the contents + * into {@code builder}. + */ + public static void merge(final Readable input, + final Message.Builder builder) + throws IOException { + merge(input, ExtensionRegistry.getEmptyRegistry(), builder); + } + + /** + * Parse a text-format message from {@code input} and merge the contents + * into {@code builder}. + */ + public static void merge(final CharSequence input, + final Message.Builder builder) + throws ParseException { + merge(input, ExtensionRegistry.getEmptyRegistry(), builder); + } + + /** + * Parse a text-format message from {@code input} and merge the contents + * into {@code builder}. Extensions will be recognized if they are + * registered in {@code extensionRegistry}. + */ + public static void merge(final Readable input, + final ExtensionRegistry extensionRegistry, + final Message.Builder builder) + throws IOException { + // Read the entire input to a String then parse that. + + // If StreamTokenizer were not quite so crippled, or if there were a kind + // of Reader that could read in chunks that match some particular regex, + // or if we wanted to write a custom Reader to tokenize our stream, then + // we would not have to read to one big String. Alas, none of these is + // the case. Oh well. + + merge(toStringBuilder(input), extensionRegistry, builder); + } + + private static final int BUFFER_SIZE = 4096; + + // TODO(chrisn): See if working around java.io.Reader#read(CharBuffer) + // overhead is worthwhile + private static StringBuilder toStringBuilder(final Readable input) + throws IOException { + final StringBuilder text = new StringBuilder(); + final CharBuffer buffer = CharBuffer.allocate(BUFFER_SIZE); + while (true) { + final int n = input.read(buffer); + if (n == -1) { + break; + } + buffer.flip(); + text.append(buffer, 0, n); + } + return text; + } + + /** + * Parse a text-format message from {@code input} and merge the contents + * into {@code builder}. Extensions will be recognized if they are + * registered in {@code extensionRegistry}. + */ + public static void merge(final CharSequence input, + final ExtensionRegistry extensionRegistry, + final Message.Builder builder) + throws ParseException { + final Tokenizer tokenizer = new Tokenizer(input); + + while (!tokenizer.atEnd()) { + mergeField(tokenizer, extensionRegistry, builder); + } + } + + /** + * Parse a single field from {@code tokenizer} and merge it into + * {@code builder}. + */ + private static void mergeField(final Tokenizer tokenizer, + final ExtensionRegistry extensionRegistry, + final Message.Builder builder) + throws ParseException { + FieldDescriptor field; + final Descriptor type = builder.getDescriptorForType(); + ExtensionRegistry.ExtensionInfo extension = null; + + if (tokenizer.tryConsume("[")) { + // An extension. + final StringBuilder name = + new StringBuilder(tokenizer.consumeIdentifier()); + while (tokenizer.tryConsume(".")) { + name.append('.'); + name.append(tokenizer.consumeIdentifier()); + } + + extension = extensionRegistry.findExtensionByName(name.toString()); + + if (extension == null) { + throw tokenizer.parseExceptionPreviousToken( + "Extension \"" + name + "\" not found in the ExtensionRegistry."); + } else if (extension.descriptor.getContainingType() != type) { + throw tokenizer.parseExceptionPreviousToken( + "Extension \"" + name + "\" does not extend message type \"" + + type.getFullName() + "\"."); + } + + tokenizer.consume("]"); + + field = extension.descriptor; + } else { + final String name = tokenizer.consumeIdentifier(); + field = type.findFieldByName(name); + + // Group names are expected to be capitalized as they appear in the + // .proto file, which actually matches their type names, not their field + // names. + if (field == null) { + // Explicitly specify US locale so that this code does not break when + // executing in Turkey. + final String lowerName = name.toLowerCase(Locale.US); + field = type.findFieldByName(lowerName); + // If the case-insensitive match worked but the field is NOT a group, + if (field != null && field.getType() != FieldDescriptor.Type.GROUP) { + field = null; + } + } + // Again, special-case group names as described above. + if (field != null && field.getType() == FieldDescriptor.Type.GROUP && + !field.getMessageType().getName().equals(name)) { + field = null; + } + + if (field == null) { + throw tokenizer.parseExceptionPreviousToken( + "Message type \"" + type.getFullName() + + "\" has no field named \"" + name + "\"."); + } + } + + Object value = null; + + if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { + tokenizer.tryConsume(":"); // optional + + final String endToken; + if (tokenizer.tryConsume("<")) { + endToken = ">"; + } else { + tokenizer.consume("{"); + endToken = "}"; + } + + final Message.Builder subBuilder; + if (extension == null) { + subBuilder = builder.newBuilderForField(field); + } else { + subBuilder = extension.defaultInstance.newBuilderForType(); + } + + while (!tokenizer.tryConsume(endToken)) { + if (tokenizer.atEnd()) { + throw tokenizer.parseException( + "Expected \"" + endToken + "\"."); + } + mergeField(tokenizer, extensionRegistry, subBuilder); + } + + value = subBuilder.build(); + + } else { + tokenizer.consume(":"); + + switch (field.getType()) { + case INT32: + case SINT32: + case SFIXED32: + value = tokenizer.consumeInt32(); + break; + + case INT64: + case SINT64: + case SFIXED64: + value = tokenizer.consumeInt64(); + break; + + case UINT32: + case FIXED32: + value = tokenizer.consumeUInt32(); + break; + + case UINT64: + case FIXED64: + value = tokenizer.consumeUInt64(); + break; + + case FLOAT: + value = tokenizer.consumeFloat(); + break; + + case DOUBLE: + value = tokenizer.consumeDouble(); + break; + + case BOOL: + value = tokenizer.consumeBoolean(); + break; + + case STRING: + value = tokenizer.consumeString(); + break; + + case BYTES: + value = tokenizer.consumeByteString(); + break; + + case ENUM: + final EnumDescriptor enumType = field.getEnumType(); + + if (tokenizer.lookingAtInteger()) { + final int number = tokenizer.consumeInt32(); + value = enumType.findValueByNumber(number); + if (value == null) { + throw tokenizer.parseExceptionPreviousToken( + "Enum type \"" + enumType.getFullName() + + "\" has no value with number " + number + '.'); + } + } else { + final String id = tokenizer.consumeIdentifier(); + value = enumType.findValueByName(id); + if (value == null) { + throw tokenizer.parseExceptionPreviousToken( + "Enum type \"" + enumType.getFullName() + + "\" has no value named \"" + id + "\"."); + } + } + + break; + + case MESSAGE: + case GROUP: + throw new RuntimeException("Can't get here."); + } + } + + if (field.isRepeated()) { + builder.addRepeatedField(field, value); + } else { + builder.setField(field, value); + } + } + + // ================================================================= + // Utility functions + // + // Some of these methods are package-private because Descriptors.java uses + // them. + + /** + * Escapes bytes in the format used in protocol buffer text format, which + * is the same as the format used for C string literals. All bytes + * that are not printable 7-bit ASCII characters are escaped, as well as + * backslash, single-quote, and double-quote characters. Characters for + * which no defined short-hand escape sequence is defined will be escaped + * using 3-digit octal sequences. + */ + static String escapeBytes(final ByteString input) { + final StringBuilder builder = new StringBuilder(input.size()); + for (int i = 0; i < input.size(); i++) { + final byte b = input.byteAt(i); + switch (b) { + // Java does not recognize \a or \v, apparently. + case 0x07: builder.append("\\a" ); break; + case '\b': builder.append("\\b" ); break; + case '\f': builder.append("\\f" ); break; + case '\n': builder.append("\\n" ); break; + case '\r': builder.append("\\r" ); break; + case '\t': builder.append("\\t" ); break; + case 0x0b: builder.append("\\v" ); break; + case '\\': builder.append("\\\\"); break; + case '\'': builder.append("\\\'"); break; + case '"' : builder.append("\\\""); break; + default: + // Note: Bytes with the high-order bit set should be escaped. Since + // bytes are signed, such bytes will compare less than 0x20, hence + // the following line is correct. + if (b >= 0x20) { + builder.append((char) b); + } else { + builder.append('\\'); + builder.append((char) ('0' + ((b >>> 6) & 3))); + builder.append((char) ('0' + ((b >>> 3) & 7))); + builder.append((char) ('0' + (b & 7))); + } + break; + } + } + return builder.toString(); + } + + /** + * Un-escape a byte sequence as escaped using + * {@link #escapeBytes(ByteString)}. Two-digit hex escapes (starting with + * "\x") are also recognized. + */ + static ByteString unescapeBytes(final CharSequence charString) + throws InvalidEscapeSequenceException { + // First convert the Java characater sequence to UTF-8 bytes. + ByteString input = ByteString.copyFromUtf8(charString.toString()); + // Then unescape certain byte sequences introduced by ASCII '\\'. The valid + // escapes can all be expressed with ASCII characters, so it is safe to + // operate on bytes here. + // + // Unescaping the input byte array will result in a byte sequence that's no + // longer than the input. That's because each escape sequence is between + // two and four bytes long and stands for a single byte. + final byte[] result = new byte[input.size()]; + int pos = 0; + for (int i = 0; i < input.size(); i++) { + byte c = input.byteAt(i); + if (c == '\\') { + if (i + 1 < input.size()) { + ++i; + c = input.byteAt(i); + if (isOctal(c)) { + // Octal escape. + int code = digitValue(c); + if (i + 1 < input.size() && isOctal(input.byteAt(i + 1))) { + ++i; + code = code * 8 + digitValue(input.byteAt(i)); + } + if (i + 1 < input.size() && isOctal(input.byteAt(i + 1))) { + ++i; + code = code * 8 + digitValue(input.byteAt(i)); + } + // TODO: Check that 0 <= code && code <= 0xFF. + result[pos++] = (byte)code; + } else { + switch (c) { + case 'a' : result[pos++] = 0x07; break; + case 'b' : result[pos++] = '\b'; break; + case 'f' : result[pos++] = '\f'; break; + case 'n' : result[pos++] = '\n'; break; + case 'r' : result[pos++] = '\r'; break; + case 't' : result[pos++] = '\t'; break; + case 'v' : result[pos++] = 0x0b; break; + case '\\': result[pos++] = '\\'; break; + case '\'': result[pos++] = '\''; break; + case '"' : result[pos++] = '\"'; break; + + case 'x': + // hex escape + int code = 0; + if (i + 1 < input.size() && isHex(input.byteAt(i + 1))) { + ++i; + code = digitValue(input.byteAt(i)); + } else { + throw new InvalidEscapeSequenceException( + "Invalid escape sequence: '\\x' with no digits"); + } + if (i + 1 < input.size() && isHex(input.byteAt(i + 1))) { + ++i; + code = code * 16 + digitValue(input.byteAt(i)); + } + result[pos++] = (byte)code; + break; + + default: + throw new InvalidEscapeSequenceException( + "Invalid escape sequence: '\\" + (char)c + '\''); + } + } + } else { + throw new InvalidEscapeSequenceException( + "Invalid escape sequence: '\\' at end of string."); + } + } else { + result[pos++] = c; + } + } + + return ByteString.copyFrom(result, 0, pos); + } + + /** + * Thrown by {@link TextFormat#unescapeBytes} and + * {@link TextFormat#unescapeText} when an invalid escape sequence is seen. + */ + static class InvalidEscapeSequenceException extends IOException { + private static final long serialVersionUID = -8164033650142593304L; + + InvalidEscapeSequenceException(final String description) { + super(description); + } + } + + /** + * Like {@link #escapeBytes(ByteString)}, but escapes a text string. + * Non-ASCII characters are first encoded as UTF-8, then each byte is escaped + * individually as a 3-digit octal escape. Yes, it's weird. + */ + static String escapeText(final String input) { + return escapeBytes(ByteString.copyFromUtf8(input)); + } + + /** + * Un-escape a text string as escaped using {@link #escapeText(String)}. + * Two-digit hex escapes (starting with "\x") are also recognized. + */ + static String unescapeText(final String input) + throws InvalidEscapeSequenceException { + return unescapeBytes(input).toStringUtf8(); + } + + /** Is this an octal digit? */ + private static boolean isOctal(final byte c) { + return '0' <= c && c <= '7'; + } + + /** Is this a hex digit? */ + private static boolean isHex(final byte c) { + return ('0' <= c && c <= '9') || + ('a' <= c && c <= 'f') || + ('A' <= c && c <= 'F'); + } + + /** + * Interpret a character as a digit (in any base up to 36) and return the + * numeric value. This is like {@code Character.digit()} but we don't accept + * non-ASCII digits. + */ + private static int digitValue(final byte c) { + if ('0' <= c && c <= '9') { + return c - '0'; + } else if ('a' <= c && c <= 'z') { + return c - 'a' + 10; + } else { + return c - 'A' + 10; + } + } + + /** + * Parse a 32-bit signed integer from the text. Unlike the Java standard + * {@code Integer.parseInt()}, this function recognizes the prefixes "0x" + * and "0" to signify hexidecimal and octal numbers, respectively. + */ + static int parseInt32(final String text) throws NumberFormatException { + return (int) parseInteger(text, true, false); + } + + /** + * Parse a 32-bit unsigned integer from the text. Unlike the Java standard + * {@code Integer.parseInt()}, this function recognizes the prefixes "0x" + * and "0" to signify hexidecimal and octal numbers, respectively. The + * result is coerced to a (signed) {@code int} when returned since Java has + * no unsigned integer type. + */ + static int parseUInt32(final String text) throws NumberFormatException { + return (int) parseInteger(text, false, false); + } + + /** + * Parse a 64-bit signed integer from the text. Unlike the Java standard + * {@code Integer.parseInt()}, this function recognizes the prefixes "0x" + * and "0" to signify hexidecimal and octal numbers, respectively. + */ + static long parseInt64(final String text) throws NumberFormatException { + return parseInteger(text, true, true); + } + + /** + * Parse a 64-bit unsigned integer from the text. Unlike the Java standard + * {@code Integer.parseInt()}, this function recognizes the prefixes "0x" + * and "0" to signify hexidecimal and octal numbers, respectively. The + * result is coerced to a (signed) {@code long} when returned since Java has + * no unsigned long type. + */ + static long parseUInt64(final String text) throws NumberFormatException { + return parseInteger(text, false, true); + } + + private static long parseInteger(final String text, + final boolean isSigned, + final boolean isLong) + throws NumberFormatException { + int pos = 0; + + boolean negative = false; + if (text.startsWith("-", pos)) { + if (!isSigned) { + throw new NumberFormatException("Number must be positive: " + text); + } + ++pos; + negative = true; + } + + int radix = 10; + if (text.startsWith("0x", pos)) { + pos += 2; + radix = 16; + } else if (text.startsWith("0", pos)) { + radix = 8; + } + + final String numberText = text.substring(pos); + + long result = 0; + if (numberText.length() < 16) { + // Can safely assume no overflow. + result = Long.parseLong(numberText, radix); + if (negative) { + result = -result; + } + + // Check bounds. + // No need to check for 64-bit numbers since they'd have to be 16 chars + // or longer to overflow. + if (!isLong) { + if (isSigned) { + if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) { + throw new NumberFormatException( + "Number out of range for 32-bit signed integer: " + text); + } + } else { + if (result >= (1L << 32) || result < 0) { + throw new NumberFormatException( + "Number out of range for 32-bit unsigned integer: " + text); + } + } + } + } else { + BigInteger bigValue = new BigInteger(numberText, radix); + if (negative) { + bigValue = bigValue.negate(); + } + + // Check bounds. + if (!isLong) { + if (isSigned) { + if (bigValue.bitLength() > 31) { + throw new NumberFormatException( + "Number out of range for 32-bit signed integer: " + text); + } + } else { + if (bigValue.bitLength() > 32) { + throw new NumberFormatException( + "Number out of range for 32-bit unsigned integer: " + text); + } + } + } else { + if (isSigned) { + if (bigValue.bitLength() > 63) { + throw new NumberFormatException( + "Number out of range for 64-bit signed integer: " + text); + } + } else { + if (bigValue.bitLength() > 64) { + throw new NumberFormatException( + "Number out of range for 64-bit unsigned integer: " + text); + } + } + } + + result = bigValue.longValue(); + } + + return result; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java new file mode 100644 index 000000000..8743c1200 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java @@ -0,0 +1,99 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.Collections; +import java.util.List; + +/** + * Thrown when attempting to build a protocol message that is missing required + * fields. This is a {@code RuntimeException} because it normally represents + * a programming error: it happens when some code which constructs a message + * fails to set all the fields. {@code parseFrom()} methods do not + * throw this; they throw an {@link InvalidProtocolBufferException} if + * required fields are missing, because it is not a programming error to + * receive an incomplete message. In other words, + * {@code UninitializedMessageException} should never be thrown by correct + * code, but {@code InvalidProtocolBufferException} might be. + * + * @author kenton@google.com Kenton Varda + */ +public class UninitializedMessageException extends RuntimeException { + private static final long serialVersionUID = -7466929953374883507L; + + public UninitializedMessageException(final MessageLite message) { + super("Message was missing required fields. (Lite runtime could not " + + "determine which fields were missing)."); + missingFields = null; + } + + public UninitializedMessageException(final List missingFields) { + super(buildDescription(missingFields)); + this.missingFields = missingFields; + } + + private final List missingFields; + + /** + * Get a list of human-readable names of required fields missing from this + * message. Each name is a full path to a field, e.g. "foo.bar[5].baz". + * Returns null if the lite runtime was used, since it lacks the ability to + * find missing fields. + */ + public List getMissingFields() { + return Collections.unmodifiableList(missingFields); + } + + /** + * Converts this exception to an {@link InvalidProtocolBufferException}. + * When a parsed message is missing required fields, this should be thrown + * instead of {@code UninitializedMessageException}. + */ + public InvalidProtocolBufferException asInvalidProtocolBufferException() { + return new InvalidProtocolBufferException(getMessage()); + } + + /** Construct the description string for this exception. */ + private static String buildDescription(final List missingFields) { + final StringBuilder description = + new StringBuilder("Message missing required fields: "); + boolean first = true; + for (final String field : missingFields) { + if (first) { + first = false; + } else { + description.append(", "); + } + description.append(field); + } + return description.toString(); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java new file mode 100644 index 000000000..26a15d008 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java @@ -0,0 +1,953 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * {@code UnknownFieldSet} is used to keep track of fields which were seen when + * parsing a protocol message but whose field numbers or types are unrecognized. + * This most frequently occurs when new fields are added to a message type + * and then messages containing those feilds are read by old software that was + * compiled before the new types were added. + * + *

Every {@link Message} contains an {@code UnknownFieldSet} (and every + * {@link Message.Builder} contains an {@link Builder}). + * + *

Most users will never need to use this class. + * + * @author kenton@google.com Kenton Varda + */ +public final class UnknownFieldSet implements MessageLite { + private UnknownFieldSet() {} + + /** Create a new {@link Builder}. */ + public static Builder newBuilder() { + return Builder.create(); + } + + /** + * Create a new {@link Builder} and initialize it to be a copy + * of {@code copyFrom}. + */ + public static Builder newBuilder(final UnknownFieldSet copyFrom) { + return newBuilder().mergeFrom(copyFrom); + } + + /** Get an empty {@code UnknownFieldSet}. */ + public static UnknownFieldSet getDefaultInstance() { + return defaultInstance; + } + public UnknownFieldSet getDefaultInstanceForType() { + return defaultInstance; + } + private static final UnknownFieldSet defaultInstance = + new UnknownFieldSet(Collections.emptyMap()); + + /** + * Construct an {@code UnknownFieldSet} around the given map. The map is + * expected to be immutable. + */ + private UnknownFieldSet(final Map fields) { + this.fields = fields; + } + private Map fields; + + @Override + public boolean equals(final Object other) { + if (this == other) { + return true; + } + return (other instanceof UnknownFieldSet) && + fields.equals(((UnknownFieldSet) other).fields); + } + + @Override + public int hashCode() { + return fields.hashCode(); + } + + /** Get a map of fields in the set by number. */ + public Map asMap() { + return fields; + } + + /** Check if the given field number is present in the set. */ + public boolean hasField(final int number) { + return fields.containsKey(number); + } + + /** + * Get a field by number. Returns an empty field if not present. Never + * returns {@code null}. + */ + public Field getField(final int number) { + final Field result = fields.get(number); + return (result == null) ? Field.getDefaultInstance() : result; + } + + /** Serializes the set and writes it to {@code output}. */ + public void writeTo(final CodedOutputStream output) throws IOException { + for (final Map.Entry entry : fields.entrySet()) { + entry.getValue().writeTo(entry.getKey(), output); + } + } + + /** + * Converts the set to a string in protocol buffer text format. This is + * just a trivial wrapper around + * {@link TextFormat#printToString(UnknownFieldSet)}. + */ + @Override + public String toString() { + return TextFormat.printToString(this); + } + + /** + * Serializes the message to a {@code ByteString} and returns it. This is + * just a trivial wrapper around {@link #writeTo(CodedOutputStream)}. + */ + public ByteString toByteString() { + try { + final ByteString.CodedBuilder out = + ByteString.newCodedBuilder(getSerializedSize()); + writeTo(out.getCodedOutput()); + return out.build(); + } catch (final IOException e) { + throw new RuntimeException( + "Serializing to a ByteString threw an IOException (should " + + "never happen).", e); + } + } + + /** + * Serializes the message to a {@code byte} array and returns it. This is + * just a trivial wrapper around {@link #writeTo(CodedOutputStream)}. + */ + public byte[] toByteArray() { + try { + final byte[] result = new byte[getSerializedSize()]; + final CodedOutputStream output = CodedOutputStream.newInstance(result); + writeTo(output); + output.checkNoSpaceLeft(); + return result; + } catch (final IOException e) { + throw new RuntimeException( + "Serializing to a byte array threw an IOException " + + "(should never happen).", e); + } + } + + /** + * Serializes the message and writes it to {@code output}. This is just a + * trivial wrapper around {@link #writeTo(CodedOutputStream)}. + */ + public void writeTo(final OutputStream output) throws IOException { + final CodedOutputStream codedOutput = CodedOutputStream.newInstance(output); + writeTo(codedOutput); + codedOutput.flush(); + } + + public void writeDelimitedTo(OutputStream output) throws IOException { + final CodedOutputStream codedOutput = CodedOutputStream.newInstance(output); + codedOutput.writeRawVarint32(getSerializedSize()); + writeTo(codedOutput); + codedOutput.flush(); + } + + /** Get the number of bytes required to encode this set. */ + public int getSerializedSize() { + int result = 0; + for (final Map.Entry entry : fields.entrySet()) { + result += entry.getValue().getSerializedSize(entry.getKey()); + } + return result; + } + + /** + * Serializes the set and writes it to {@code output} using + * {@code MessageSet} wire format. + */ + public void writeAsMessageSetTo(final CodedOutputStream output) + throws IOException { + for (final Map.Entry entry : fields.entrySet()) { + entry.getValue().writeAsMessageSetExtensionTo( + entry.getKey(), output); + } + } + + /** + * Get the number of bytes required to encode this set using + * {@code MessageSet} wire format. + */ + public int getSerializedSizeAsMessageSet() { + int result = 0; + for (final Map.Entry entry : fields.entrySet()) { + result += entry.getValue().getSerializedSizeAsMessageSetExtension( + entry.getKey()); + } + return result; + } + + public boolean isInitialized() { + // UnknownFieldSets do not have required fields, so they are always + // initialized. + return true; + } + + /** Parse an {@code UnknownFieldSet} from the given input stream. */ + public static UnknownFieldSet parseFrom(final CodedInputStream input) + throws IOException { + return newBuilder().mergeFrom(input).build(); + } + + /** Parse {@code data} as an {@code UnknownFieldSet} and return it. */ + public static UnknownFieldSet parseFrom(final ByteString data) + throws InvalidProtocolBufferException { + return newBuilder().mergeFrom(data).build(); + } + + /** Parse {@code data} as an {@code UnknownFieldSet} and return it. */ + public static UnknownFieldSet parseFrom(final byte[] data) + throws InvalidProtocolBufferException { + return newBuilder().mergeFrom(data).build(); + } + + /** Parse an {@code UnknownFieldSet} from {@code input} and return it. */ + public static UnknownFieldSet parseFrom(final InputStream input) + throws IOException { + return newBuilder().mergeFrom(input).build(); + } + + public Builder newBuilderForType() { + return newBuilder(); + } + + public Builder toBuilder() { + return newBuilder().mergeFrom(this); + } + + /** + * Builder for {@link UnknownFieldSet}s. + * + *

Note that this class maintains {@link Field.Builder}s for all fields + * in the set. Thus, adding one element to an existing {@link Field} does not + * require making a copy. This is important for efficient parsing of + * unknown repeated fields. However, it implies that {@link Field}s cannot + * be constructed independently, nor can two {@link UnknownFieldSet}s share + * the same {@code Field} object. + * + *

Use {@link UnknownFieldSet#newBuilder()} to construct a {@code Builder}. + */ + public static final class Builder implements MessageLite.Builder { + // This constructor should never be called directly (except from 'create'). + private Builder() {} + + private Map fields; + + // Optimization: We keep around a builder for the last field that was + // modified so that we can efficiently add to it multiple times in a + // row (important when parsing an unknown repeated field). + private int lastFieldNumber; + private Field.Builder lastField; + + private static Builder create() { + Builder builder = new Builder(); + builder.reinitialize(); + return builder; + } + + /** + * Get a field builder for the given field number which includes any + * values that already exist. + */ + private Field.Builder getFieldBuilder(final int number) { + if (lastField != null) { + if (number == lastFieldNumber) { + return lastField; + } + // Note: addField() will reset lastField and lastFieldNumber. + addField(lastFieldNumber, lastField.build()); + } + if (number == 0) { + return null; + } else { + final Field existing = fields.get(number); + lastFieldNumber = number; + lastField = Field.newBuilder(); + if (existing != null) { + lastField.mergeFrom(existing); + } + return lastField; + } + } + + /** + * Build the {@link UnknownFieldSet} and return it. + * + *

Once {@code build()} has been called, the {@code Builder} will no + * longer be usable. Calling any method after {@code build()} will result + * in undefined behavior and can cause a {@code NullPointerException} to be + * thrown. + */ + public UnknownFieldSet build() { + getFieldBuilder(0); // Force lastField to be built. + final UnknownFieldSet result; + if (fields.isEmpty()) { + result = getDefaultInstance(); + } else { + result = new UnknownFieldSet(Collections.unmodifiableMap(fields)); + } + fields = null; + return result; + } + + public UnknownFieldSet buildPartial() { + // No required fields, so this is the same as build(). + return build(); + } + + @Override + public Builder clone() { + getFieldBuilder(0); // Force lastField to be built. + return UnknownFieldSet.newBuilder().mergeFrom( + new UnknownFieldSet(fields)); + } + + public UnknownFieldSet getDefaultInstanceForType() { + return UnknownFieldSet.getDefaultInstance(); + } + + private void reinitialize() { + fields = Collections.emptyMap(); + lastFieldNumber = 0; + lastField = null; + } + + /** Reset the builder to an empty set. */ + public Builder clear() { + reinitialize(); + return this; + } + + /** + * Merge the fields from {@code other} into this set. If a field number + * exists in both sets, {@code other}'s values for that field will be + * appended to the values in this set. + */ + public Builder mergeFrom(final UnknownFieldSet other) { + if (other != getDefaultInstance()) { + for (final Map.Entry entry : other.fields.entrySet()) { + mergeField(entry.getKey(), entry.getValue()); + } + } + return this; + } + + /** + * Add a field to the {@code UnknownFieldSet}. If a field with the same + * number already exists, the two are merged. + */ + public Builder mergeField(final int number, final Field field) { + if (number == 0) { + throw new IllegalArgumentException("Zero is not a valid field number."); + } + if (hasField(number)) { + getFieldBuilder(number).mergeFrom(field); + } else { + // Optimization: We could call getFieldBuilder(number).mergeFrom(field) + // in this case, but that would create a copy of the Field object. + // We'd rather reuse the one passed to us, so call addField() instead. + addField(number, field); + } + return this; + } + + /** + * Convenience method for merging a new field containing a single varint + * value. This is used in particular when an unknown enum value is + * encountered. + */ + public Builder mergeVarintField(final int number, final int value) { + if (number == 0) { + throw new IllegalArgumentException("Zero is not a valid field number."); + } + getFieldBuilder(number).addVarint(value); + return this; + } + + /** Check if the given field number is present in the set. */ + public boolean hasField(final int number) { + if (number == 0) { + throw new IllegalArgumentException("Zero is not a valid field number."); + } + return number == lastFieldNumber || fields.containsKey(number); + } + + /** + * Add a field to the {@code UnknownFieldSet}. If a field with the same + * number already exists, it is removed. + */ + public Builder addField(final int number, final Field field) { + if (number == 0) { + throw new IllegalArgumentException("Zero is not a valid field number."); + } + if (lastField != null && lastFieldNumber == number) { + // Discard this. + lastField = null; + lastFieldNumber = 0; + } + if (fields.isEmpty()) { + fields = new TreeMap(); + } + fields.put(number, field); + return this; + } + + /** + * Get all present {@code Field}s as an immutable {@code Map}. If more + * fields are added, the changes may or may not be reflected in this map. + */ + public Map asMap() { + getFieldBuilder(0); // Force lastField to be built. + return Collections.unmodifiableMap(fields); + } + + /** + * Parse an entire message from {@code input} and merge its fields into + * this set. + */ + public Builder mergeFrom(final CodedInputStream input) throws IOException { + while (true) { + final int tag = input.readTag(); + if (tag == 0 || !mergeFieldFrom(tag, input)) { + break; + } + } + return this; + } + + /** + * Parse a single field from {@code input} and merge it into this set. + * @param tag The field's tag number, which was already parsed. + * @return {@code false} if the tag is an engroup tag. + */ + public boolean mergeFieldFrom(final int tag, final CodedInputStream input) + throws IOException { + final int number = WireFormat.getTagFieldNumber(tag); + switch (WireFormat.getTagWireType(tag)) { + case WireFormat.WIRETYPE_VARINT: + getFieldBuilder(number).addVarint(input.readInt64()); + return true; + case WireFormat.WIRETYPE_FIXED64: + getFieldBuilder(number).addFixed64(input.readFixed64()); + return true; + case WireFormat.WIRETYPE_LENGTH_DELIMITED: + getFieldBuilder(number).addLengthDelimited(input.readBytes()); + return true; + case WireFormat.WIRETYPE_START_GROUP: + final Builder subBuilder = newBuilder(); + input.readGroup(number, subBuilder, + ExtensionRegistry.getEmptyRegistry()); + getFieldBuilder(number).addGroup(subBuilder.build()); + return true; + case WireFormat.WIRETYPE_END_GROUP: + return false; + case WireFormat.WIRETYPE_FIXED32: + getFieldBuilder(number).addFixed32(input.readFixed32()); + return true; + default: + throw InvalidProtocolBufferException.invalidWireType(); + } + } + + /** + * Parse {@code data} as an {@code UnknownFieldSet} and merge it with the + * set being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream)}. + */ + public Builder mergeFrom(final ByteString data) + throws InvalidProtocolBufferException { + try { + final CodedInputStream input = data.newCodedInput(); + mergeFrom(input); + input.checkLastTagWas(0); + return this; + } catch (final InvalidProtocolBufferException e) { + throw e; + } catch (final IOException e) { + throw new RuntimeException( + "Reading from a ByteString threw an IOException (should " + + "never happen).", e); + } + } + + /** + * Parse {@code data} as an {@code UnknownFieldSet} and merge it with the + * set being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream)}. + */ + public Builder mergeFrom(final byte[] data) + throws InvalidProtocolBufferException { + try { + final CodedInputStream input = CodedInputStream.newInstance(data); + mergeFrom(input); + input.checkLastTagWas(0); + return this; + } catch (final InvalidProtocolBufferException e) { + throw e; + } catch (final IOException e) { + throw new RuntimeException( + "Reading from a byte array threw an IOException (should " + + "never happen).", e); + } + } + + /** + * Parse an {@code UnknownFieldSet} from {@code input} and merge it with the + * set being built. This is just a small wrapper around + * {@link #mergeFrom(CodedInputStream)}. + */ + public Builder mergeFrom(final InputStream input) throws IOException { + final CodedInputStream codedInput = CodedInputStream.newInstance(input); + mergeFrom(codedInput); + codedInput.checkLastTagWas(0); + return this; + } + + public boolean mergeDelimitedFrom(InputStream input) + throws IOException { + final int firstByte = input.read(); + if (firstByte == -1) { + return false; + } + final int size = CodedInputStream.readRawVarint32(firstByte, input); + final InputStream limitedInput = new LimitedInputStream(input, size); + mergeFrom(limitedInput); + return true; + } + + public boolean mergeDelimitedFrom( + InputStream input, + ExtensionRegistryLite extensionRegistry) throws IOException { + // UnknownFieldSet has no extensions. + return mergeDelimitedFrom(input); + } + + public Builder mergeFrom( + CodedInputStream input, + ExtensionRegistryLite extensionRegistry) throws IOException { + // UnknownFieldSet has no extensions. + return mergeFrom(input); + } + + public Builder mergeFrom( + ByteString data, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + // UnknownFieldSet has no extensions. + return mergeFrom(data); + } + + public Builder mergeFrom(byte[] data, int off, int len) + throws InvalidProtocolBufferException { + try { + final CodedInputStream input = + CodedInputStream.newInstance(data, off, len); + mergeFrom(input); + input.checkLastTagWas(0); + return this; + } catch (InvalidProtocolBufferException e) { + throw e; + } catch (IOException e) { + throw new RuntimeException( + "Reading from a byte array threw an IOException (should " + + "never happen).", e); + } + } + + public Builder mergeFrom( + byte[] data, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + // UnknownFieldSet has no extensions. + return mergeFrom(data); + } + + public Builder mergeFrom( + byte[] data, int off, int len, + ExtensionRegistryLite extensionRegistry) + throws InvalidProtocolBufferException { + // UnknownFieldSet has no extensions. + return mergeFrom(data, off, len); + } + + public Builder mergeFrom( + InputStream input, + ExtensionRegistryLite extensionRegistry) throws IOException { + // UnknownFieldSet has no extensions. + return mergeFrom(input); + } + + public boolean isInitialized() { + // UnknownFieldSets do not have required fields, so they are always + // initialized. + return true; + } + } + + /** + * Represents a single field in an {@code UnknownFieldSet}. + * + *

A {@code Field} consists of five lists of values. The lists correspond + * to the five "wire types" used in the protocol buffer binary format. + * The wire type of each field can be determined from the encoded form alone, + * without knowing the field's declared type. So, we are able to parse + * unknown values at least this far and separate them. Normally, only one + * of the five lists will contain any values, since it is impossible to + * define a valid message type that declares two different types for the + * same field number. However, the code is designed to allow for the case + * where the same unknown field number is encountered using multiple different + * wire types. + * + *

{@code Field} is an immutable class. To construct one, you must use a + * {@link Builder}. + * + * @see UnknownFieldSet + */ + public static final class Field { + private Field() {} + + /** Construct a new {@link Builder}. */ + public static Builder newBuilder() { + return Builder.create(); + } + + /** + * Construct a new {@link Builder} and initialize it to a copy of + * {@code copyFrom}. + */ + public static Builder newBuilder(final Field copyFrom) { + return newBuilder().mergeFrom(copyFrom); + } + + /** Get an empty {@code Field}. */ + public static Field getDefaultInstance() { + return fieldDefaultInstance; + } + private static final Field fieldDefaultInstance = newBuilder().build(); + + /** Get the list of varint values for this field. */ + public List getVarintList() { return varint; } + + /** Get the list of fixed32 values for this field. */ + public List getFixed32List() { return fixed32; } + + /** Get the list of fixed64 values for this field. */ + public List getFixed64List() { return fixed64; } + + /** Get the list of length-delimited values for this field. */ + public List getLengthDelimitedList() { return lengthDelimited; } + + /** + * Get the list of embedded group values for this field. These are + * represented using {@link UnknownFieldSet}s rather than {@link Message}s + * since the group's type is presumably unknown. + */ + public List getGroupList() { return group; } + + @Override + public boolean equals(final Object other) { + if (this == other) { + return true; + } + if (!(other instanceof Field)) { + return false; + } + return Arrays.equals(getIdentityArray(), + ((Field) other).getIdentityArray()); + } + + @Override + public int hashCode() { + return Arrays.hashCode(getIdentityArray()); + } + + /** + * Returns the array of objects to be used to uniquely identify this + * {@link Field} instance. + */ + private Object[] getIdentityArray() { + return new Object[] { + varint, + fixed32, + fixed64, + lengthDelimited, + group}; + } + + /** + * Serializes the field, including field number, and writes it to + * {@code output}. + */ + public void writeTo(final int fieldNumber, final CodedOutputStream output) + throws IOException { + for (final long value : varint) { + output.writeUInt64(fieldNumber, value); + } + for (final int value : fixed32) { + output.writeFixed32(fieldNumber, value); + } + for (final long value : fixed64) { + output.writeFixed64(fieldNumber, value); + } + for (final ByteString value : lengthDelimited) { + output.writeBytes(fieldNumber, value); + } + for (final UnknownFieldSet value : group) { + output.writeGroup(fieldNumber, value); + } + } + + /** + * Get the number of bytes required to encode this field, including field + * number. + */ + public int getSerializedSize(final int fieldNumber) { + int result = 0; + for (final long value : varint) { + result += CodedOutputStream.computeUInt64Size(fieldNumber, value); + } + for (final int value : fixed32) { + result += CodedOutputStream.computeFixed32Size(fieldNumber, value); + } + for (final long value : fixed64) { + result += CodedOutputStream.computeFixed64Size(fieldNumber, value); + } + for (final ByteString value : lengthDelimited) { + result += CodedOutputStream.computeBytesSize(fieldNumber, value); + } + for (final UnknownFieldSet value : group) { + result += CodedOutputStream.computeGroupSize(fieldNumber, value); + } + return result; + } + + /** + * Serializes the field, including field number, and writes it to + * {@code output}, using {@code MessageSet} wire format. + */ + public void writeAsMessageSetExtensionTo( + final int fieldNumber, + final CodedOutputStream output) + throws IOException { + for (final ByteString value : lengthDelimited) { + output.writeRawMessageSetExtension(fieldNumber, value); + } + } + + /** + * Get the number of bytes required to encode this field, including field + * number, using {@code MessageSet} wire format. + */ + public int getSerializedSizeAsMessageSetExtension(final int fieldNumber) { + int result = 0; + for (final ByteString value : lengthDelimited) { + result += CodedOutputStream.computeRawMessageSetExtensionSize( + fieldNumber, value); + } + return result; + } + + private List varint; + private List fixed32; + private List fixed64; + private List lengthDelimited; + private List group; + + /** + * Used to build a {@link Field} within an {@link UnknownFieldSet}. + * + *

Use {@link Field#newBuilder()} to construct a {@code Builder}. + */ + public static final class Builder { + // This constructor should never be called directly (except from 'create'). + private Builder() {} + + private static Builder create() { + Builder builder = new Builder(); + builder.result = new Field(); + return builder; + } + + private Field result; + + /** + * Build the field. After {@code build()} has been called, the + * {@code Builder} is no longer usable. Calling any other method will + * result in undefined behavior and can cause a + * {@code NullPointerException} to be thrown. + */ + public Field build() { + if (result.varint == null) { + result.varint = Collections.emptyList(); + } else { + result.varint = Collections.unmodifiableList(result.varint); + } + if (result.fixed32 == null) { + result.fixed32 = Collections.emptyList(); + } else { + result.fixed32 = Collections.unmodifiableList(result.fixed32); + } + if (result.fixed64 == null) { + result.fixed64 = Collections.emptyList(); + } else { + result.fixed64 = Collections.unmodifiableList(result.fixed64); + } + if (result.lengthDelimited == null) { + result.lengthDelimited = Collections.emptyList(); + } else { + result.lengthDelimited = + Collections.unmodifiableList(result.lengthDelimited); + } + if (result.group == null) { + result.group = Collections.emptyList(); + } else { + result.group = Collections.unmodifiableList(result.group); + } + + final Field returnMe = result; + result = null; + return returnMe; + } + + /** Discard the field's contents. */ + public Builder clear() { + result = new Field(); + return this; + } + + /** + * Merge the values in {@code other} into this field. For each list + * of values, {@code other}'s values are append to the ones in this + * field. + */ + public Builder mergeFrom(final Field other) { + if (!other.varint.isEmpty()) { + if (result.varint == null) { + result.varint = new ArrayList(); + } + result.varint.addAll(other.varint); + } + if (!other.fixed32.isEmpty()) { + if (result.fixed32 == null) { + result.fixed32 = new ArrayList(); + } + result.fixed32.addAll(other.fixed32); + } + if (!other.fixed64.isEmpty()) { + if (result.fixed64 == null) { + result.fixed64 = new ArrayList(); + } + result.fixed64.addAll(other.fixed64); + } + if (!other.lengthDelimited.isEmpty()) { + if (result.lengthDelimited == null) { + result.lengthDelimited = new ArrayList(); + } + result.lengthDelimited.addAll(other.lengthDelimited); + } + if (!other.group.isEmpty()) { + if (result.group == null) { + result.group = new ArrayList(); + } + result.group.addAll(other.group); + } + return this; + } + + /** Add a varint value. */ + public Builder addVarint(final long value) { + if (result.varint == null) { + result.varint = new ArrayList(); + } + result.varint.add(value); + return this; + } + + /** Add a fixed32 value. */ + public Builder addFixed32(final int value) { + if (result.fixed32 == null) { + result.fixed32 = new ArrayList(); + } + result.fixed32.add(value); + return this; + } + + /** Add a fixed64 value. */ + public Builder addFixed64(final long value) { + if (result.fixed64 == null) { + result.fixed64 = new ArrayList(); + } + result.fixed64.add(value); + return this; + } + + /** Add a length-delimited value. */ + public Builder addLengthDelimited(final ByteString value) { + if (result.lengthDelimited == null) { + result.lengthDelimited = new ArrayList(); + } + result.lengthDelimited.add(value); + return this; + } + + /** Add an embedded group. */ + public Builder addGroup(final UnknownFieldSet value) { + if (result.group == null) { + result.group = new ArrayList(); + } + result.group.add(value); + return this; + } + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java new file mode 100644 index 000000000..83e5c7969 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java @@ -0,0 +1,146 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import java.util.AbstractList; +import java.util.RandomAccess; +import java.util.ListIterator; +import java.util.Iterator; + +/** + * An implementation of {@link LazyStringList} that wraps another + * {@link LazyStringList} such that it cannot be modified via the wrapper. + * + * @author jonp@google.com (Jon Perlow) + */ +public class UnmodifiableLazyStringList extends AbstractList + implements LazyStringList, RandomAccess { + + private final LazyStringList list; + + public UnmodifiableLazyStringList(LazyStringList list) { + this.list = list; + } + + @Override + public String get(int index) { + return list.get(index); + } + + @Override + public int size() { + return list.size(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public ByteString getByteString(int index) { + return list.getByteString(index); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void add(ByteString element) { + throw new UnsupportedOperationException(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public ListIterator listIterator(final int index) { + return new ListIterator() { + ListIterator iter = list.listIterator(index); + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean hasNext() { + return iter.hasNext(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public String next() { + return iter.next(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean hasPrevious() { + return iter.hasPrevious(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public String previous() { + return iter.previous(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public int nextIndex() { + return iter.nextIndex(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public int previousIndex() { + return iter.previousIndex(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void remove() { + throw new UnsupportedOperationException(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void set(String o) { + throw new UnsupportedOperationException(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void add(String o) { + throw new UnsupportedOperationException(); + } + }; + } + + @Override + public Iterator iterator() { + return new Iterator() { + Iterator iter = list.iterator(); + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public boolean hasNext() { + return iter.hasNext(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public String next() { + return iter.next(); + } + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java new file mode 100644 index 000000000..a30f2a3cc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java @@ -0,0 +1,163 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * This class is used internally by the Protocol Buffer library and generated + * message implementations. It is public only because those generated messages + * do not reside in the {@code protobuf} package. Others should not use this + * class directly. + * + * This class contains constants and helper functions useful for dealing with + * the Protocol Buffer wire format. + * + * @author kenton@google.com Kenton Varda + */ +public final class WireFormat { + // Do not allow instantiation. + private WireFormat() {} + + public static final int WIRETYPE_VARINT = 0; + public static final int WIRETYPE_FIXED64 = 1; + public static final int WIRETYPE_LENGTH_DELIMITED = 2; + public static final int WIRETYPE_START_GROUP = 3; + public static final int WIRETYPE_END_GROUP = 4; + public static final int WIRETYPE_FIXED32 = 5; + + static final int TAG_TYPE_BITS = 3; + static final int TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1; + + /** Given a tag value, determines the wire type (the lower 3 bits). */ + static int getTagWireType(final int tag) { + return tag & TAG_TYPE_MASK; + } + + /** Given a tag value, determines the field number (the upper 29 bits). */ + public static int getTagFieldNumber(final int tag) { + return tag >>> TAG_TYPE_BITS; + } + + /** Makes a tag value given a field number and wire type. */ + static int makeTag(final int fieldNumber, final int wireType) { + return (fieldNumber << TAG_TYPE_BITS) | wireType; + } + + /** + * Lite equivalent to {@link Descriptors.FieldDescriptor.JavaType}. This is + * only here to support the lite runtime and should not be used by users. + */ + public enum JavaType { + INT(0), + LONG(0L), + FLOAT(0F), + DOUBLE(0D), + BOOLEAN(false), + STRING(""), + BYTE_STRING(ByteString.EMPTY), + ENUM(null), + MESSAGE(null); + + JavaType(final Object defaultDefault) { + this.defaultDefault = defaultDefault; + } + + /** + * The default default value for fields of this type, if it's a primitive + * type. + */ + Object getDefaultDefault() { + return defaultDefault; + } + + private final Object defaultDefault; + } + + /** + * Lite equivalent to {@link Descriptors.FieldDescriptor.Type}. This is + * only here to support the lite runtime and should not be used by users. + */ + public enum FieldType { + DOUBLE (JavaType.DOUBLE , WIRETYPE_FIXED64 ), + FLOAT (JavaType.FLOAT , WIRETYPE_FIXED32 ), + INT64 (JavaType.LONG , WIRETYPE_VARINT ), + UINT64 (JavaType.LONG , WIRETYPE_VARINT ), + INT32 (JavaType.INT , WIRETYPE_VARINT ), + FIXED64 (JavaType.LONG , WIRETYPE_FIXED64 ), + FIXED32 (JavaType.INT , WIRETYPE_FIXED32 ), + BOOL (JavaType.BOOLEAN , WIRETYPE_VARINT ), + STRING (JavaType.STRING , WIRETYPE_LENGTH_DELIMITED) { + public boolean isPackable() { return false; } + }, + GROUP (JavaType.MESSAGE , WIRETYPE_START_GROUP ) { + public boolean isPackable() { return false; } + }, + MESSAGE (JavaType.MESSAGE , WIRETYPE_LENGTH_DELIMITED) { + public boolean isPackable() { return false; } + }, + BYTES (JavaType.BYTE_STRING, WIRETYPE_LENGTH_DELIMITED) { + public boolean isPackable() { return false; } + }, + UINT32 (JavaType.INT , WIRETYPE_VARINT ), + ENUM (JavaType.ENUM , WIRETYPE_VARINT ), + SFIXED32(JavaType.INT , WIRETYPE_FIXED32 ), + SFIXED64(JavaType.LONG , WIRETYPE_FIXED64 ), + SINT32 (JavaType.INT , WIRETYPE_VARINT ), + SINT64 (JavaType.LONG , WIRETYPE_VARINT ); + + FieldType(final JavaType javaType, final int wireType) { + this.javaType = javaType; + this.wireType = wireType; + } + + private final JavaType javaType; + private final int wireType; + + public JavaType getJavaType() { return javaType; } + public int getWireType() { return wireType; } + + public boolean isPackable() { return true; } + } + + // Field numbers for feilds in MessageSet wire format. + static final int MESSAGE_SET_ITEM = 1; + static final int MESSAGE_SET_TYPE_ID = 2; + static final int MESSAGE_SET_MESSAGE = 3; + + // Tag numbers. + static final int MESSAGE_SET_ITEM_TAG = + makeTag(MESSAGE_SET_ITEM, WIRETYPE_START_GROUP); + static final int MESSAGE_SET_ITEM_END_TAG = + makeTag(MESSAGE_SET_ITEM, WIRETYPE_END_GROUP); + static final int MESSAGE_SET_TYPE_ID_TAG = + makeTag(MESSAGE_SET_TYPE_ID, WIRETYPE_VARINT); + static final int MESSAGE_SET_MESSAGE_TAG = + makeTag(MESSAGE_SET_MESSAGE, WIRETYPE_LENGTH_DELIMITED); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java new file mode 100644 index 000000000..d53ce8d76 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java @@ -0,0 +1,460 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize; +import protobuf_unittest.UnittestProto; +import protobuf_unittest.UnittestProto.ForeignMessage; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestPackedTypes; +import protobuf_unittest.UnittestProto.TestRequired; +import protobuf_unittest.UnittestProto.TestRequiredForeign; +import protobuf_unittest.UnittestProto.TestUnpackedTypes; + +import junit.framework.TestCase; + +import java.util.Map; + +/** + * Unit test for {@link AbstractMessage}. + * + * @author kenton@google.com Kenton Varda + */ +public class AbstractMessageTest extends TestCase { + /** + * Extends AbstractMessage and wraps some other message object. The methods + * of the Message interface which aren't explicitly implemented by + * AbstractMessage are forwarded to the wrapped object. This allows us to + * test that AbstractMessage's implementations work even if the wrapped + * object does not use them. + */ + private static class AbstractMessageWrapper extends AbstractMessage { + private final Message wrappedMessage; + + public AbstractMessageWrapper(Message wrappedMessage) { + this.wrappedMessage = wrappedMessage; + } + + public Descriptors.Descriptor getDescriptorForType() { + return wrappedMessage.getDescriptorForType(); + } + public AbstractMessageWrapper getDefaultInstanceForType() { + return new AbstractMessageWrapper( + wrappedMessage.getDefaultInstanceForType()); + } + public Map getAllFields() { + return wrappedMessage.getAllFields(); + } + public boolean hasField(Descriptors.FieldDescriptor field) { + return wrappedMessage.hasField(field); + } + public Object getField(Descriptors.FieldDescriptor field) { + return wrappedMessage.getField(field); + } + public int getRepeatedFieldCount(Descriptors.FieldDescriptor field) { + return wrappedMessage.getRepeatedFieldCount(field); + } + public Object getRepeatedField( + Descriptors.FieldDescriptor field, int index) { + return wrappedMessage.getRepeatedField(field, index); + } + public UnknownFieldSet getUnknownFields() { + return wrappedMessage.getUnknownFields(); + } + public Builder newBuilderForType() { + return new Builder(wrappedMessage.newBuilderForType()); + } + public Builder toBuilder() { + return new Builder(wrappedMessage.toBuilder()); + } + + static class Builder extends AbstractMessage.Builder { + private final Message.Builder wrappedBuilder; + + public Builder(Message.Builder wrappedBuilder) { + this.wrappedBuilder = wrappedBuilder; + } + + public AbstractMessageWrapper build() { + return new AbstractMessageWrapper(wrappedBuilder.build()); + } + public AbstractMessageWrapper buildPartial() { + return new AbstractMessageWrapper(wrappedBuilder.buildPartial()); + } + public Builder clone() { + return new Builder(wrappedBuilder.clone()); + } + public boolean isInitialized() { + return clone().buildPartial().isInitialized(); + } + public Descriptors.Descriptor getDescriptorForType() { + return wrappedBuilder.getDescriptorForType(); + } + public AbstractMessageWrapper getDefaultInstanceForType() { + return new AbstractMessageWrapper( + wrappedBuilder.getDefaultInstanceForType()); + } + public Map getAllFields() { + return wrappedBuilder.getAllFields(); + } + public Builder newBuilderForField(Descriptors.FieldDescriptor field) { + return new Builder(wrappedBuilder.newBuilderForField(field)); + } + public boolean hasField(Descriptors.FieldDescriptor field) { + return wrappedBuilder.hasField(field); + } + public Object getField(Descriptors.FieldDescriptor field) { + return wrappedBuilder.getField(field); + } + public Builder setField(Descriptors.FieldDescriptor field, Object value) { + wrappedBuilder.setField(field, value); + return this; + } + public Builder clearField(Descriptors.FieldDescriptor field) { + wrappedBuilder.clearField(field); + return this; + } + public int getRepeatedFieldCount(Descriptors.FieldDescriptor field) { + return wrappedBuilder.getRepeatedFieldCount(field); + } + public Object getRepeatedField( + Descriptors.FieldDescriptor field, int index) { + return wrappedBuilder.getRepeatedField(field, index); + } + public Builder setRepeatedField(Descriptors.FieldDescriptor field, + int index, Object value) { + wrappedBuilder.setRepeatedField(field, index, value); + return this; + } + public Builder addRepeatedField( + Descriptors.FieldDescriptor field, Object value) { + wrappedBuilder.addRepeatedField(field, value); + return this; + } + public UnknownFieldSet getUnknownFields() { + return wrappedBuilder.getUnknownFields(); + } + public Builder setUnknownFields(UnknownFieldSet unknownFields) { + wrappedBuilder.setUnknownFields(unknownFields); + return this; + } + } + } + + // ================================================================= + + TestUtil.ReflectionTester reflectionTester = + new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null); + + TestUtil.ReflectionTester extensionsReflectionTester = + new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(), + TestUtil.getExtensionRegistry()); + + public void testClear() throws Exception { + AbstractMessageWrapper message = + new AbstractMessageWrapper.Builder( + TestAllTypes.newBuilder(TestUtil.getAllSet())) + .clear().build(); + TestUtil.assertClear((TestAllTypes) message.wrappedMessage); + } + + public void testCopy() throws Exception { + AbstractMessageWrapper message = + new AbstractMessageWrapper.Builder(TestAllTypes.newBuilder()) + .mergeFrom(TestUtil.getAllSet()).build(); + TestUtil.assertAllFieldsSet((TestAllTypes) message.wrappedMessage); + } + + public void testSerializedSize() throws Exception { + TestAllTypes message = TestUtil.getAllSet(); + Message abstractMessage = new AbstractMessageWrapper(TestUtil.getAllSet()); + + assertEquals(message.getSerializedSize(), + abstractMessage.getSerializedSize()); + } + + public void testSerialization() throws Exception { + Message abstractMessage = new AbstractMessageWrapper(TestUtil.getAllSet()); + + TestUtil.assertAllFieldsSet( + TestAllTypes.parseFrom(abstractMessage.toByteString())); + + assertEquals(TestUtil.getAllSet().toByteString(), + abstractMessage.toByteString()); + } + + public void testParsing() throws Exception { + AbstractMessageWrapper.Builder builder = + new AbstractMessageWrapper.Builder(TestAllTypes.newBuilder()); + AbstractMessageWrapper message = + builder.mergeFrom(TestUtil.getAllSet().toByteString()).build(); + TestUtil.assertAllFieldsSet((TestAllTypes) message.wrappedMessage); + } + + public void testPackedSerialization() throws Exception { + Message abstractMessage = + new AbstractMessageWrapper(TestUtil.getPackedSet()); + + TestUtil.assertPackedFieldsSet( + TestPackedTypes.parseFrom(abstractMessage.toByteString())); + + assertEquals(TestUtil.getPackedSet().toByteString(), + abstractMessage.toByteString()); + } + + public void testPackedParsing() throws Exception { + AbstractMessageWrapper.Builder builder = + new AbstractMessageWrapper.Builder(TestPackedTypes.newBuilder()); + AbstractMessageWrapper message = + builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build(); + TestUtil.assertPackedFieldsSet((TestPackedTypes) message.wrappedMessage); + } + + public void testUnpackedSerialization() throws Exception { + Message abstractMessage = + new AbstractMessageWrapper(TestUtil.getUnpackedSet()); + + TestUtil.assertUnpackedFieldsSet( + TestUnpackedTypes.parseFrom(abstractMessage.toByteString())); + + assertEquals(TestUtil.getUnpackedSet().toByteString(), + abstractMessage.toByteString()); + } + + public void testParsePackedToUnpacked() throws Exception { + AbstractMessageWrapper.Builder builder = + new AbstractMessageWrapper.Builder(TestUnpackedTypes.newBuilder()); + AbstractMessageWrapper message = + builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build(); + TestUtil.assertUnpackedFieldsSet( + (TestUnpackedTypes) message.wrappedMessage); + } + + public void testParseUnpackedToPacked() throws Exception { + AbstractMessageWrapper.Builder builder = + new AbstractMessageWrapper.Builder(TestPackedTypes.newBuilder()); + AbstractMessageWrapper message = + builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build(); + TestUtil.assertPackedFieldsSet((TestPackedTypes) message.wrappedMessage); + } + + public void testUnpackedParsing() throws Exception { + AbstractMessageWrapper.Builder builder = + new AbstractMessageWrapper.Builder(TestUnpackedTypes.newBuilder()); + AbstractMessageWrapper message = + builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build(); + TestUtil.assertUnpackedFieldsSet( + (TestUnpackedTypes) message.wrappedMessage); + } + + public void testOptimizedForSize() throws Exception { + // We're mostly only checking that this class was compiled successfully. + TestOptimizedForSize message = + TestOptimizedForSize.newBuilder().setI(1).build(); + message = TestOptimizedForSize.parseFrom(message.toByteString()); + assertEquals(2, message.getSerializedSize()); + } + + // ----------------------------------------------------------------- + // Tests for isInitialized(). + + private static final TestRequired TEST_REQUIRED_UNINITIALIZED = + TestRequired.getDefaultInstance(); + private static final TestRequired TEST_REQUIRED_INITIALIZED = + TestRequired.newBuilder().setA(1).setB(2).setC(3).build(); + + public void testIsInitialized() throws Exception { + TestRequired.Builder builder = TestRequired.newBuilder(); + AbstractMessageWrapper.Builder abstractBuilder = + new AbstractMessageWrapper.Builder(builder); + + assertFalse(abstractBuilder.isInitialized()); + builder.setA(1); + assertFalse(abstractBuilder.isInitialized()); + builder.setB(1); + assertFalse(abstractBuilder.isInitialized()); + builder.setC(1); + assertTrue(abstractBuilder.isInitialized()); + } + + public void testForeignIsInitialized() throws Exception { + TestRequiredForeign.Builder builder = TestRequiredForeign.newBuilder(); + AbstractMessageWrapper.Builder abstractBuilder = + new AbstractMessageWrapper.Builder(builder); + + assertTrue(abstractBuilder.isInitialized()); + + builder.setOptionalMessage(TEST_REQUIRED_UNINITIALIZED); + assertFalse(abstractBuilder.isInitialized()); + + builder.setOptionalMessage(TEST_REQUIRED_INITIALIZED); + assertTrue(abstractBuilder.isInitialized()); + + builder.addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED); + assertFalse(abstractBuilder.isInitialized()); + + builder.setRepeatedMessage(0, TEST_REQUIRED_INITIALIZED); + assertTrue(abstractBuilder.isInitialized()); + } + + // ----------------------------------------------------------------- + // Tests for mergeFrom + + static final TestAllTypes MERGE_SOURCE = + TestAllTypes.newBuilder() + .setOptionalInt32(1) + .setOptionalString("foo") + .setOptionalForeignMessage(ForeignMessage.getDefaultInstance()) + .addRepeatedString("bar") + .build(); + + static final TestAllTypes MERGE_DEST = + TestAllTypes.newBuilder() + .setOptionalInt64(2) + .setOptionalString("baz") + .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(3).build()) + .addRepeatedString("qux") + .build(); + + static final String MERGE_RESULT_TEXT = + "optional_int32: 1\n" + + "optional_int64: 2\n" + + "optional_string: \"foo\"\n" + + "optional_foreign_message {\n" + + " c: 3\n" + + "}\n" + + "repeated_string: \"qux\"\n" + + "repeated_string: \"bar\"\n"; + + public void testMergeFrom() throws Exception { + AbstractMessageWrapper result = + new AbstractMessageWrapper.Builder( + TestAllTypes.newBuilder(MERGE_DEST)) + .mergeFrom(MERGE_SOURCE).build(); + + assertEquals(MERGE_RESULT_TEXT, result.toString()); + } + + // ----------------------------------------------------------------- + // Tests for equals and hashCode + + public void testEqualsAndHashCode() throws Exception { + TestAllTypes a = TestUtil.getAllSet(); + TestAllTypes b = TestAllTypes.newBuilder().build(); + TestAllTypes c = TestAllTypes.newBuilder(b).addRepeatedString("x").build(); + TestAllTypes d = TestAllTypes.newBuilder(c).addRepeatedString("y").build(); + TestAllExtensions e = TestUtil.getAllExtensionsSet(); + TestAllExtensions f = TestAllExtensions.newBuilder(e) + .addExtension(UnittestProto.repeatedInt32Extension, 999).build(); + + checkEqualsIsConsistent(a); + checkEqualsIsConsistent(b); + checkEqualsIsConsistent(c); + checkEqualsIsConsistent(d); + checkEqualsIsConsistent(e); + checkEqualsIsConsistent(f); + + checkNotEqual(a, b); + checkNotEqual(a, c); + checkNotEqual(a, d); + checkNotEqual(a, e); + checkNotEqual(a, f); + + checkNotEqual(b, c); + checkNotEqual(b, d); + checkNotEqual(b, e); + checkNotEqual(b, f); + + checkNotEqual(c, d); + checkNotEqual(c, e); + checkNotEqual(c, f); + + checkNotEqual(d, e); + checkNotEqual(d, f); + + checkNotEqual(e, f); + + // Deserializing into the TestEmptyMessage such that every field + // is an {@link UnknownFieldSet.Field}. + UnittestProto.TestEmptyMessage eUnknownFields = + UnittestProto.TestEmptyMessage.parseFrom(e.toByteArray()); + UnittestProto.TestEmptyMessage fUnknownFields = + UnittestProto.TestEmptyMessage.parseFrom(f.toByteArray()); + checkNotEqual(eUnknownFields, fUnknownFields); + checkEqualsIsConsistent(eUnknownFields); + checkEqualsIsConsistent(fUnknownFields); + + // Subsequent reconstitutions should be identical + UnittestProto.TestEmptyMessage eUnknownFields2 = + UnittestProto.TestEmptyMessage.parseFrom(e.toByteArray()); + checkEqualsIsConsistent(eUnknownFields, eUnknownFields2); + } + + + /** + * Asserts that the given proto has symetric equals and hashCode methods. + */ + private void checkEqualsIsConsistent(Message message) { + // Object should be equal to itself. + assertEquals(message, message); + + // Object should be equal to a dynamic copy of itself. + DynamicMessage dynamic = DynamicMessage.newBuilder(message).build(); + checkEqualsIsConsistent(message, dynamic); + } + + /** + * Asserts that the given protos are equal and have the same hash code. + */ + private void checkEqualsIsConsistent(Message message1, Message message2) { + assertEquals(message1, message2); + assertEquals(message2, message1); + assertEquals(message2.hashCode(), message1.hashCode()); + } + + /** + * Asserts that the given protos are not equal and have different hash codes. + * + * @warning It's valid for non-equal objects to have the same hash code, so + * this test is stricter than it needs to be. However, this should happen + * relatively rarely. + */ + private void checkNotEqual(Message m1, Message m2) { + String equalsError = String.format("%s should not be equal to %s", m1, m2); + assertFalse(equalsError, m1.equals(m2)); + assertFalse(equalsError, m2.equals(m1)); + + assertFalse( + String.format("%s should have a different hash code from %s", m1, m2), + m1.hashCode() == m2.hashCode()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java new file mode 100644 index 000000000..83f7f8da5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java @@ -0,0 +1,528 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestRecursiveMessage; + +import junit.framework.TestCase; + +import java.io.ByteArrayInputStream; +import java.io.FilterInputStream; +import java.io.InputStream; +import java.io.IOException; + +/** + * Unit test for {@link CodedInputStream}. + * + * @author kenton@google.com Kenton Varda + */ +public class CodedInputStreamTest extends TestCase { + /** + * Helper to construct a byte array from a bunch of bytes. The inputs are + * actually ints so that I can use hex notation and not get stupid errors + * about precision. + */ + private byte[] bytes(int... bytesAsInts) { + byte[] bytes = new byte[bytesAsInts.length]; + for (int i = 0; i < bytesAsInts.length; i++) { + bytes[i] = (byte) bytesAsInts[i]; + } + return bytes; + } + + /** + * An InputStream which limits the number of bytes it reads at a time. + * We use this to make sure that CodedInputStream doesn't screw up when + * reading in small blocks. + */ + private static final class SmallBlockInputStream extends FilterInputStream { + private final int blockSize; + + public SmallBlockInputStream(byte[] data, int blockSize) { + this(new ByteArrayInputStream(data), blockSize); + } + + public SmallBlockInputStream(InputStream in, int blockSize) { + super(in); + this.blockSize = blockSize; + } + + public int read(byte[] b) throws IOException { + return super.read(b, 0, Math.min(b.length, blockSize)); + } + + public int read(byte[] b, int off, int len) throws IOException { + return super.read(b, off, Math.min(len, blockSize)); + } + } + + /** + * Parses the given bytes using readRawVarint32() and readRawVarint64() and + * checks that the result matches the given value. + */ + private void assertReadVarint(byte[] data, long value) throws Exception { + CodedInputStream input = CodedInputStream.newInstance(data); + assertEquals((int)value, input.readRawVarint32()); + + input = CodedInputStream.newInstance(data); + assertEquals(value, input.readRawVarint64()); + assertTrue(input.isAtEnd()); + + // Try different block sizes. + for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { + input = CodedInputStream.newInstance( + new SmallBlockInputStream(data, blockSize)); + assertEquals((int)value, input.readRawVarint32()); + + input = CodedInputStream.newInstance( + new SmallBlockInputStream(data, blockSize)); + assertEquals(value, input.readRawVarint64()); + assertTrue(input.isAtEnd()); + } + + // Try reading direct from an InputStream. We want to verify that it + // doesn't read past the end of the input, so we copy to a new, bigger + // array first. + byte[] longerData = new byte[data.length + 1]; + System.arraycopy(data, 0, longerData, 0, data.length); + InputStream rawInput = new ByteArrayInputStream(longerData); + assertEquals((int)value, CodedInputStream.readRawVarint32(rawInput)); + assertEquals(1, rawInput.available()); + } + + /** + * Parses the given bytes using readRawVarint32() and readRawVarint64() and + * expects them to fail with an InvalidProtocolBufferException whose + * description matches the given one. + */ + private void assertReadVarintFailure( + InvalidProtocolBufferException expected, byte[] data) + throws Exception { + CodedInputStream input = CodedInputStream.newInstance(data); + try { + input.readRawVarint32(); + fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + assertEquals(expected.getMessage(), e.getMessage()); + } + + input = CodedInputStream.newInstance(data); + try { + input.readRawVarint64(); + fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + assertEquals(expected.getMessage(), e.getMessage()); + } + + // Make sure we get the same error when reading direct from an InputStream. + try { + CodedInputStream.readRawVarint32(new ByteArrayInputStream(data)); + fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + assertEquals(expected.getMessage(), e.getMessage()); + } + } + + /** Tests readRawVarint32() and readRawVarint64(). */ + public void testReadVarint() throws Exception { + assertReadVarint(bytes(0x00), 0); + assertReadVarint(bytes(0x01), 1); + assertReadVarint(bytes(0x7f), 127); + // 14882 + assertReadVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7)); + // 2961488830 + assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b), + (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | + (0x0bL << 28)); + + // 64-bit + // 7256456126 + assertReadVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b), + (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | + (0x1bL << 28)); + // 41256202580718336 + assertReadVarint( + bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49), + (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) | + (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49)); + // 11964378330978735131 + assertReadVarint( + bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01), + (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) | + (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) | + (0x05L << 49) | (0x26L << 56) | (0x01L << 63)); + + // Failures + assertReadVarintFailure( + InvalidProtocolBufferException.malformedVarint(), + bytes(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x00)); + assertReadVarintFailure( + InvalidProtocolBufferException.truncatedMessage(), + bytes(0x80)); + } + + /** + * Parses the given bytes using readRawLittleEndian32() and checks + * that the result matches the given value. + */ + private void assertReadLittleEndian32(byte[] data, int value) + throws Exception { + CodedInputStream input = CodedInputStream.newInstance(data); + assertEquals(value, input.readRawLittleEndian32()); + assertTrue(input.isAtEnd()); + + // Try different block sizes. + for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { + input = CodedInputStream.newInstance( + new SmallBlockInputStream(data, blockSize)); + assertEquals(value, input.readRawLittleEndian32()); + assertTrue(input.isAtEnd()); + } + } + + /** + * Parses the given bytes using readRawLittleEndian64() and checks + * that the result matches the given value. + */ + private void assertReadLittleEndian64(byte[] data, long value) + throws Exception { + CodedInputStream input = CodedInputStream.newInstance(data); + assertEquals(value, input.readRawLittleEndian64()); + assertTrue(input.isAtEnd()); + + // Try different block sizes. + for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { + input = CodedInputStream.newInstance( + new SmallBlockInputStream(data, blockSize)); + assertEquals(value, input.readRawLittleEndian64()); + assertTrue(input.isAtEnd()); + } + } + + /** Tests readRawLittleEndian32() and readRawLittleEndian64(). */ + public void testReadLittleEndian() throws Exception { + assertReadLittleEndian32(bytes(0x78, 0x56, 0x34, 0x12), 0x12345678); + assertReadLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0); + + assertReadLittleEndian64( + bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12), + 0x123456789abcdef0L); + assertReadLittleEndian64( + bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a), + 0x9abcdef012345678L); + } + + /** Test decodeZigZag32() and decodeZigZag64(). */ + public void testDecodeZigZag() throws Exception { + assertEquals( 0, CodedInputStream.decodeZigZag32(0)); + assertEquals(-1, CodedInputStream.decodeZigZag32(1)); + assertEquals( 1, CodedInputStream.decodeZigZag32(2)); + assertEquals(-2, CodedInputStream.decodeZigZag32(3)); + assertEquals(0x3FFFFFFF, CodedInputStream.decodeZigZag32(0x7FFFFFFE)); + assertEquals(0xC0000000, CodedInputStream.decodeZigZag32(0x7FFFFFFF)); + assertEquals(0x7FFFFFFF, CodedInputStream.decodeZigZag32(0xFFFFFFFE)); + assertEquals(0x80000000, CodedInputStream.decodeZigZag32(0xFFFFFFFF)); + + assertEquals( 0, CodedInputStream.decodeZigZag64(0)); + assertEquals(-1, CodedInputStream.decodeZigZag64(1)); + assertEquals( 1, CodedInputStream.decodeZigZag64(2)); + assertEquals(-2, CodedInputStream.decodeZigZag64(3)); + assertEquals(0x000000003FFFFFFFL, + CodedInputStream.decodeZigZag64(0x000000007FFFFFFEL)); + assertEquals(0xFFFFFFFFC0000000L, + CodedInputStream.decodeZigZag64(0x000000007FFFFFFFL)); + assertEquals(0x000000007FFFFFFFL, + CodedInputStream.decodeZigZag64(0x00000000FFFFFFFEL)); + assertEquals(0xFFFFFFFF80000000L, + CodedInputStream.decodeZigZag64(0x00000000FFFFFFFFL)); + assertEquals(0x7FFFFFFFFFFFFFFFL, + CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFEL)); + assertEquals(0x8000000000000000L, + CodedInputStream.decodeZigZag64(0xFFFFFFFFFFFFFFFFL)); + } + + /** Tests reading and parsing a whole message with every field type. */ + public void testReadWholeMessage() throws Exception { + TestAllTypes message = TestUtil.getAllSet(); + + byte[] rawBytes = message.toByteArray(); + assertEquals(rawBytes.length, message.getSerializedSize()); + + TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes); + TestUtil.assertAllFieldsSet(message2); + + // Try different block sizes. + for (int blockSize = 1; blockSize < 256; blockSize *= 2) { + message2 = TestAllTypes.parseFrom( + new SmallBlockInputStream(rawBytes, blockSize)); + TestUtil.assertAllFieldsSet(message2); + } + } + + /** Tests skipField(). */ + public void testSkipWholeMessage() throws Exception { + TestAllTypes message = TestUtil.getAllSet(); + byte[] rawBytes = message.toByteArray(); + + // Create two parallel inputs. Parse one as unknown fields while using + // skipField() to skip each field on the other. Expect the same tags. + CodedInputStream input1 = CodedInputStream.newInstance(rawBytes); + CodedInputStream input2 = CodedInputStream.newInstance(rawBytes); + UnknownFieldSet.Builder unknownFields = UnknownFieldSet.newBuilder(); + + while (true) { + int tag = input1.readTag(); + assertEquals(tag, input2.readTag()); + if (tag == 0) { + break; + } + unknownFields.mergeFieldFrom(tag, input1); + input2.skipField(tag); + } + } + + /** + * Test that a bug in skipRawBytes() has been fixed: if the skip skips + * exactly up to a limit, this should not break things. + */ + public void testSkipRawBytesBug() throws Exception { + byte[] rawBytes = new byte[] { 1, 2 }; + CodedInputStream input = CodedInputStream.newInstance(rawBytes); + + int limit = input.pushLimit(1); + input.skipRawBytes(1); + input.popLimit(limit); + assertEquals(2, input.readRawByte()); + } + + /** + * Test that a bug in skipRawBytes() has been fixed: if the skip skips + * past the end of a buffer with a limit that has been set past the end of + * that buffer, this should not break things. + */ + public void testSkipRawBytesPastEndOfBufferWithLimit() throws Exception { + byte[] rawBytes = new byte[] { 1, 2, 3, 4, 5 }; + CodedInputStream input = CodedInputStream.newInstance( + new SmallBlockInputStream(rawBytes, 3)); + + int limit = input.pushLimit(4); + // In order to expose the bug we need to read at least one byte to prime the + // buffer inside the CodedInputStream. + assertEquals(1, input.readRawByte()); + // Skip to the end of the limit. + input.skipRawBytes(3); + assertTrue(input.isAtEnd()); + input.popLimit(limit); + assertEquals(5, input.readRawByte()); + } + + public void testReadHugeBlob() throws Exception { + // Allocate and initialize a 1MB blob. + byte[] blob = new byte[1 << 20]; + for (int i = 0; i < blob.length; i++) { + blob[i] = (byte)i; + } + + // Make a message containing it. + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + builder.setOptionalBytes(ByteString.copyFrom(blob)); + TestAllTypes message = builder.build(); + + // Serialize and parse it. Make sure to parse from an InputStream, not + // directly from a ByteString, so that CodedInputStream uses buffered + // reading. + TestAllTypes message2 = + TestAllTypes.parseFrom(message.toByteString().newInput()); + + assertEquals(message.getOptionalBytes(), message2.getOptionalBytes()); + + // Make sure all the other fields were parsed correctly. + TestAllTypes message3 = TestAllTypes.newBuilder(message2) + .setOptionalBytes(TestUtil.getAllSet().getOptionalBytes()) + .build(); + TestUtil.assertAllFieldsSet(message3); + } + + public void testReadMaliciouslyLargeBlob() throws Exception { + ByteString.Output rawOutput = ByteString.newOutput(); + CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); + + int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED); + output.writeRawVarint32(tag); + output.writeRawVarint32(0x7FFFFFFF); + output.writeRawBytes(new byte[32]); // Pad with a few random bytes. + output.flush(); + + CodedInputStream input = rawOutput.toByteString().newCodedInput(); + assertEquals(tag, input.readTag()); + + try { + input.readBytes(); + fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // success. + } + } + + private TestRecursiveMessage makeRecursiveMessage(int depth) { + if (depth == 0) { + return TestRecursiveMessage.newBuilder().setI(5).build(); + } else { + return TestRecursiveMessage.newBuilder() + .setA(makeRecursiveMessage(depth - 1)).build(); + } + } + + private void assertMessageDepth(TestRecursiveMessage message, int depth) { + if (depth == 0) { + assertFalse(message.hasA()); + assertEquals(5, message.getI()); + } else { + assertTrue(message.hasA()); + assertMessageDepth(message.getA(), depth - 1); + } + } + + public void testMaliciousRecursion() throws Exception { + ByteString data64 = makeRecursiveMessage(64).toByteString(); + ByteString data65 = makeRecursiveMessage(65).toByteString(); + + assertMessageDepth(TestRecursiveMessage.parseFrom(data64), 64); + + try { + TestRecursiveMessage.parseFrom(data65); + fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // success. + } + + CodedInputStream input = data64.newCodedInput(); + input.setRecursionLimit(8); + try { + TestRecursiveMessage.parseFrom(input); + fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // success. + } + } + + public void testSizeLimit() throws Exception { + CodedInputStream input = CodedInputStream.newInstance( + TestUtil.getAllSet().toByteString().newInput()); + input.setSizeLimit(16); + + try { + TestAllTypes.parseFrom(input); + fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // success. + } + } + + public void testResetSizeCounter() throws Exception { + CodedInputStream input = CodedInputStream.newInstance( + new SmallBlockInputStream(new byte[256], 8)); + input.setSizeLimit(16); + input.readRawBytes(16); + assertEquals(16, input.getTotalBytesRead()); + + try { + input.readRawByte(); + fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // success. + } + + input.resetSizeCounter(); + assertEquals(0, input.getTotalBytesRead()); + input.readRawByte(); // No exception thrown. + input.resetSizeCounter(); + assertEquals(0, input.getTotalBytesRead()); + + try { + input.readRawBytes(16); // Hits limit again. + fail("Should have thrown an exception!"); + } catch (InvalidProtocolBufferException e) { + // success. + } + } + + /** + * Tests that if we read an string that contains invalid UTF-8, no exception + * is thrown. Instead, the invalid bytes are replaced with the Unicode + * "replacement character" U+FFFD. + */ + public void testReadInvalidUtf8() throws Exception { + ByteString.Output rawOutput = ByteString.newOutput(); + CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); + + int tag = WireFormat.makeTag(1, WireFormat.WIRETYPE_LENGTH_DELIMITED); + output.writeRawVarint32(tag); + output.writeRawVarint32(1); + output.writeRawBytes(new byte[] { (byte)0x80 }); + output.flush(); + + CodedInputStream input = rawOutput.toByteString().newCodedInput(); + assertEquals(tag, input.readTag()); + String text = input.readString(); + assertEquals(0xfffd, text.charAt(0)); + } + + public void testReadFromSlice() throws Exception { + byte[] bytes = bytes(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); + CodedInputStream in = CodedInputStream.newInstance(bytes, 3, 5); + assertEquals(0, in.getTotalBytesRead()); + for (int i = 3; i < 8; i++) { + assertEquals(i, in.readRawByte()); + assertEquals(i-2, in.getTotalBytesRead()); + } + // eof + assertEquals(0, in.readTag()); + assertEquals(5, in.getTotalBytesRead()); + } + + public void testInvalidTag() throws Exception { + // Any tag number which corresponds to field number zero is invalid and + // should throw InvalidProtocolBufferException. + for (int i = 0; i < 8; i++) { + try { + CodedInputStream.newInstance(bytes(i)).readTag(); + fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + assertEquals(InvalidProtocolBufferException.invalidTag().getMessage(), + e.getMessage()); + } + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java new file mode 100644 index 000000000..74476e360 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java @@ -0,0 +1,318 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestPackedTypes; + +import junit.framework.TestCase; + +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; + +/** + * Unit test for {@link CodedOutputStream}. + * + * @author kenton@google.com Kenton Varda + */ +public class CodedOutputStreamTest extends TestCase { + /** + * Helper to construct a byte array from a bunch of bytes. The inputs are + * actually ints so that I can use hex notation and not get stupid errors + * about precision. + */ + private byte[] bytes(int... bytesAsInts) { + byte[] bytes = new byte[bytesAsInts.length]; + for (int i = 0; i < bytesAsInts.length; i++) { + bytes[i] = (byte) bytesAsInts[i]; + } + return bytes; + } + + /** Arrays.asList() does not work with arrays of primitives. :( */ + private List toList(byte[] bytes) { + List result = new ArrayList(); + for (byte b : bytes) { + result.add(b); + } + return result; + } + + private void assertEqualBytes(byte[] a, byte[] b) { + assertEquals(toList(a), toList(b)); + } + + /** + * Writes the given value using writeRawVarint32() and writeRawVarint64() and + * checks that the result matches the given bytes. + */ + private void assertWriteVarint(byte[] data, long value) throws Exception { + // Only do 32-bit write if the value fits in 32 bits. + if ((value >>> 32) == 0) { + ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); + CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); + output.writeRawVarint32((int) value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + + // Also try computing size. + assertEquals(data.length, + CodedOutputStream.computeRawVarint32Size((int) value)); + } + + { + ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); + CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); + output.writeRawVarint64(value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + + // Also try computing size. + assertEquals(data.length, + CodedOutputStream.computeRawVarint64Size(value)); + } + + // Try different block sizes. + for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { + // Only do 32-bit write if the value fits in 32 bits. + if ((value >>> 32) == 0) { + ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); + CodedOutputStream output = + CodedOutputStream.newInstance(rawOutput, blockSize); + output.writeRawVarint32((int) value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + } + + { + ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); + CodedOutputStream output = + CodedOutputStream.newInstance(rawOutput, blockSize); + output.writeRawVarint64(value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + } + } + } + + /** Tests writeRawVarint32() and writeRawVarint64(). */ + public void testWriteVarint() throws Exception { + assertWriteVarint(bytes(0x00), 0); + assertWriteVarint(bytes(0x01), 1); + assertWriteVarint(bytes(0x7f), 127); + // 14882 + assertWriteVarint(bytes(0xa2, 0x74), (0x22 << 0) | (0x74 << 7)); + // 2961488830 + assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x0b), + (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | + (0x0bL << 28)); + + // 64-bit + // 7256456126 + assertWriteVarint(bytes(0xbe, 0xf7, 0x92, 0x84, 0x1b), + (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | + (0x1bL << 28)); + // 41256202580718336 + assertWriteVarint( + bytes(0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49), + (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) | + (0x43L << 28) | (0x49L << 35) | (0x24L << 42) | (0x49L << 49)); + // 11964378330978735131 + assertWriteVarint( + bytes(0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01), + (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) | + (0x3bL << 28) | (0x56L << 35) | (0x00L << 42) | + (0x05L << 49) | (0x26L << 56) | (0x01L << 63)); + } + + /** + * Parses the given bytes using writeRawLittleEndian32() and checks + * that the result matches the given value. + */ + private void assertWriteLittleEndian32(byte[] data, int value) + throws Exception { + ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); + CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); + output.writeRawLittleEndian32(value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + + // Try different block sizes. + for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { + rawOutput = new ByteArrayOutputStream(); + output = CodedOutputStream.newInstance(rawOutput, blockSize); + output.writeRawLittleEndian32(value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + } + } + + /** + * Parses the given bytes using writeRawLittleEndian64() and checks + * that the result matches the given value. + */ + private void assertWriteLittleEndian64(byte[] data, long value) + throws Exception { + ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); + CodedOutputStream output = CodedOutputStream.newInstance(rawOutput); + output.writeRawLittleEndian64(value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + + // Try different block sizes. + for (int blockSize = 1; blockSize <= 16; blockSize *= 2) { + rawOutput = new ByteArrayOutputStream(); + output = CodedOutputStream.newInstance(rawOutput, blockSize); + output.writeRawLittleEndian64(value); + output.flush(); + assertEqualBytes(data, rawOutput.toByteArray()); + } + } + + /** Tests writeRawLittleEndian32() and writeRawLittleEndian64(). */ + public void testWriteLittleEndian() throws Exception { + assertWriteLittleEndian32(bytes(0x78, 0x56, 0x34, 0x12), 0x12345678); + assertWriteLittleEndian32(bytes(0xf0, 0xde, 0xbc, 0x9a), 0x9abcdef0); + + assertWriteLittleEndian64( + bytes(0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12), + 0x123456789abcdef0L); + assertWriteLittleEndian64( + bytes(0x78, 0x56, 0x34, 0x12, 0xf0, 0xde, 0xbc, 0x9a), + 0x9abcdef012345678L); + } + + /** Test encodeZigZag32() and encodeZigZag64(). */ + public void testEncodeZigZag() throws Exception { + assertEquals(0, CodedOutputStream.encodeZigZag32( 0)); + assertEquals(1, CodedOutputStream.encodeZigZag32(-1)); + assertEquals(2, CodedOutputStream.encodeZigZag32( 1)); + assertEquals(3, CodedOutputStream.encodeZigZag32(-2)); + assertEquals(0x7FFFFFFE, CodedOutputStream.encodeZigZag32(0x3FFFFFFF)); + assertEquals(0x7FFFFFFF, CodedOutputStream.encodeZigZag32(0xC0000000)); + assertEquals(0xFFFFFFFE, CodedOutputStream.encodeZigZag32(0x7FFFFFFF)); + assertEquals(0xFFFFFFFF, CodedOutputStream.encodeZigZag32(0x80000000)); + + assertEquals(0, CodedOutputStream.encodeZigZag64( 0)); + assertEquals(1, CodedOutputStream.encodeZigZag64(-1)); + assertEquals(2, CodedOutputStream.encodeZigZag64( 1)); + assertEquals(3, CodedOutputStream.encodeZigZag64(-2)); + assertEquals(0x000000007FFFFFFEL, + CodedOutputStream.encodeZigZag64(0x000000003FFFFFFFL)); + assertEquals(0x000000007FFFFFFFL, + CodedOutputStream.encodeZigZag64(0xFFFFFFFFC0000000L)); + assertEquals(0x00000000FFFFFFFEL, + CodedOutputStream.encodeZigZag64(0x000000007FFFFFFFL)); + assertEquals(0x00000000FFFFFFFFL, + CodedOutputStream.encodeZigZag64(0xFFFFFFFF80000000L)); + assertEquals(0xFFFFFFFFFFFFFFFEL, + CodedOutputStream.encodeZigZag64(0x7FFFFFFFFFFFFFFFL)); + assertEquals(0xFFFFFFFFFFFFFFFFL, + CodedOutputStream.encodeZigZag64(0x8000000000000000L)); + + // Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1) + // were chosen semi-randomly via keyboard bashing. + assertEquals(0, + CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(0))); + assertEquals(1, + CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(1))); + assertEquals(-1, + CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-1))); + assertEquals(14927, + CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(14927))); + assertEquals(-3612, + CodedOutputStream.encodeZigZag32(CodedInputStream.decodeZigZag32(-3612))); + + assertEquals(0, + CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(0))); + assertEquals(1, + CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(1))); + assertEquals(-1, + CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-1))); + assertEquals(14927, + CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(14927))); + assertEquals(-3612, + CodedOutputStream.encodeZigZag64(CodedInputStream.decodeZigZag64(-3612))); + + assertEquals(856912304801416L, + CodedOutputStream.encodeZigZag64( + CodedInputStream.decodeZigZag64( + 856912304801416L))); + assertEquals(-75123905439571256L, + CodedOutputStream.encodeZigZag64( + CodedInputStream.decodeZigZag64( + -75123905439571256L))); + } + + /** Tests writing a whole message with every field type. */ + public void testWriteWholeMessage() throws Exception { + TestAllTypes message = TestUtil.getAllSet(); + + byte[] rawBytes = message.toByteArray(); + assertEqualBytes(TestUtil.getGoldenMessage().toByteArray(), rawBytes); + + // Try different block sizes. + for (int blockSize = 1; blockSize < 256; blockSize *= 2) { + ByteArrayOutputStream rawOutput = new ByteArrayOutputStream(); + CodedOutputStream output = + CodedOutputStream.newInstance(rawOutput, blockSize); + message.writeTo(output); + output.flush(); + assertEqualBytes(rawBytes, rawOutput.toByteArray()); + } + } + + /** Tests writing a whole message with every packed field type. Ensures the + * wire format of packed fields is compatible with C++. */ + public void testWriteWholePackedFieldsMessage() throws Exception { + TestPackedTypes message = TestUtil.getPackedSet(); + + byte[] rawBytes = message.toByteArray(); + assertEqualBytes(TestUtil.getGoldenPackedFieldsMessage().toByteArray(), + rawBytes); + } + + /** Test writing a message containing a negative enum value. This used to + * fail because the size was not properly computed as a sign-extended varint. */ + public void testWriteMessageWithNegativeEnumValue() throws Exception { + protobuf_unittest.UnittestProto.SparseEnumMessage message = + protobuf_unittest.UnittestProto.SparseEnumMessage.newBuilder() + .setSparseEnum(protobuf_unittest.UnittestProto.TestSparseEnum.SPARSE_E) + .build(); + assertTrue(message.getSparseEnum().getNumber() < 0); + byte[] rawBytes = message.toByteArray(); + protobuf_unittest.UnittestProto.SparseEnumMessage message2 = + protobuf_unittest.UnittestProto.SparseEnumMessage.parseFrom(rawBytes); + assertEquals(protobuf_unittest.UnittestProto.TestSparseEnum.SPARSE_E, + message2.getSparseEnum()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java new file mode 100644 index 000000000..1f8bb445b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java @@ -0,0 +1,80 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto.TestDeprecatedFields; + +import junit.framework.TestCase; + +import java.lang.reflect.AnnotatedElement; +import java.lang.reflect.Method; +/** + * Test field deprecation + * + * @author birdo@google.com (Roberto Scaramuzzi) + */ +public class DeprecatedFieldTest extends TestCase { + private String[] deprecatedGetterNames = { + "hasDeprecatedInt32", + "getDeprecatedInt32"}; + + private String[] deprecatedBuilderGetterNames = { + "hasDeprecatedInt32", + "getDeprecatedInt32", + "clearDeprecatedInt32"}; + + private String[] deprecatedBuilderSetterNames = { + "setDeprecatedInt32"}; + + public void testDeprecatedField() throws Exception { + Class deprecatedFields = TestDeprecatedFields.class; + Class deprecatedFieldsBuilder = TestDeprecatedFields.Builder.class; + for (String name : deprecatedGetterNames) { + Method method = deprecatedFields.getMethod(name); + assertTrue("Method " + name + " should be deprecated", + isDeprecated(method)); + } + for (String name : deprecatedBuilderGetterNames) { + Method method = deprecatedFieldsBuilder.getMethod(name); + assertTrue("Method " + name + " should be deprecated", + isDeprecated(method)); + } + for (String name : deprecatedBuilderSetterNames) { + Method method = deprecatedFieldsBuilder.getMethod(name, int.class); + assertTrue("Method " + name + " should be deprecated", + isDeprecated(method)); + } + } + + private boolean isDeprecated(AnnotatedElement annotated) { + return annotated.isAnnotationPresent(Deprecated.class); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java new file mode 100644 index 000000000..65d06e329 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java @@ -0,0 +1,460 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.DescriptorProtos.DescriptorProto; +import com.google.protobuf.DescriptorProtos.FieldDescriptorProto; +import com.google.protobuf.DescriptorProtos.FileDescriptorProto; +import com.google.protobuf.Descriptors.DescriptorValidationException; +import com.google.protobuf.Descriptors.FileDescriptor; +import com.google.protobuf.Descriptors.Descriptor; +import com.google.protobuf.Descriptors.FieldDescriptor; +import com.google.protobuf.Descriptors.EnumDescriptor; +import com.google.protobuf.Descriptors.EnumValueDescriptor; +import com.google.protobuf.Descriptors.ServiceDescriptor; +import com.google.protobuf.Descriptors.MethodDescriptor; + +import com.google.protobuf.test.UnittestImport; +import com.google.protobuf.test.UnittestImport.ImportEnum; +import com.google.protobuf.test.UnittestImport.ImportMessage; +import protobuf_unittest.UnittestProto; +import protobuf_unittest.UnittestProto.ForeignEnum; +import protobuf_unittest.UnittestProto.ForeignMessage; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; +import protobuf_unittest.UnittestProto.TestRequired; +import protobuf_unittest.UnittestProto.TestService; +import protobuf_unittest.UnittestCustomOptions; + + +import junit.framework.TestCase; + +import java.util.Arrays; +import java.util.Collections; + +/** + * Unit test for {@link Descriptors}. + * + * @author kenton@google.com Kenton Varda + */ +public class DescriptorsTest extends TestCase { + + // Regression test for bug where referencing a FieldDescriptor.Type value + // before a FieldDescriptorProto.Type value would yield a + // ExceptionInInitializerError. + @SuppressWarnings("unused") + private static final Object STATIC_INIT_TEST = FieldDescriptor.Type.BOOL; + + public void testFieldTypeEnumMapping() throws Exception { + assertEquals(FieldDescriptor.Type.values().length, + FieldDescriptorProto.Type.values().length); + for (FieldDescriptor.Type type : FieldDescriptor.Type.values()) { + FieldDescriptorProto.Type protoType = type.toProto(); + assertEquals("TYPE_" + type.name(), protoType.name()); + assertEquals(type, FieldDescriptor.Type.valueOf(protoType)); + } + } + + public void testFileDescriptor() throws Exception { + FileDescriptor file = UnittestProto.getDescriptor(); + + assertEquals("google/protobuf/unittest.proto", file.getName()); + assertEquals("protobuf_unittest", file.getPackage()); + + assertEquals("UnittestProto", file.getOptions().getJavaOuterClassname()); + assertEquals("google/protobuf/unittest.proto", + file.toProto().getName()); + + assertEquals(Arrays.asList(UnittestImport.getDescriptor()), + file.getDependencies()); + + Descriptor messageType = TestAllTypes.getDescriptor(); + assertEquals(messageType, file.getMessageTypes().get(0)); + assertEquals(messageType, file.findMessageTypeByName("TestAllTypes")); + assertNull(file.findMessageTypeByName("NoSuchType")); + assertNull(file.findMessageTypeByName("protobuf_unittest.TestAllTypes")); + for (int i = 0; i < file.getMessageTypes().size(); i++) { + assertEquals(i, file.getMessageTypes().get(i).getIndex()); + } + + EnumDescriptor enumType = ForeignEnum.getDescriptor(); + assertEquals(enumType, file.getEnumTypes().get(0)); + assertEquals(enumType, file.findEnumTypeByName("ForeignEnum")); + assertNull(file.findEnumTypeByName("NoSuchType")); + assertNull(file.findEnumTypeByName("protobuf_unittest.ForeignEnum")); + assertEquals(Arrays.asList(ImportEnum.getDescriptor()), + UnittestImport.getDescriptor().getEnumTypes()); + for (int i = 0; i < file.getEnumTypes().size(); i++) { + assertEquals(i, file.getEnumTypes().get(i).getIndex()); + } + + ServiceDescriptor service = TestService.getDescriptor(); + assertEquals(service, file.getServices().get(0)); + assertEquals(service, file.findServiceByName("TestService")); + assertNull(file.findServiceByName("NoSuchType")); + assertNull(file.findServiceByName("protobuf_unittest.TestService")); + assertEquals(Collections.emptyList(), + UnittestImport.getDescriptor().getServices()); + for (int i = 0; i < file.getServices().size(); i++) { + assertEquals(i, file.getServices().get(i).getIndex()); + } + + FieldDescriptor extension = + UnittestProto.optionalInt32Extension.getDescriptor(); + assertEquals(extension, file.getExtensions().get(0)); + assertEquals(extension, + file.findExtensionByName("optional_int32_extension")); + assertNull(file.findExtensionByName("no_such_ext")); + assertNull(file.findExtensionByName( + "protobuf_unittest.optional_int32_extension")); + assertEquals(Collections.emptyList(), + UnittestImport.getDescriptor().getExtensions()); + for (int i = 0; i < file.getExtensions().size(); i++) { + assertEquals(i, file.getExtensions().get(i).getIndex()); + } + } + + public void testDescriptor() throws Exception { + Descriptor messageType = TestAllTypes.getDescriptor(); + Descriptor nestedType = TestAllTypes.NestedMessage.getDescriptor(); + + assertEquals("TestAllTypes", messageType.getName()); + assertEquals("protobuf_unittest.TestAllTypes", messageType.getFullName()); + assertEquals(UnittestProto.getDescriptor(), messageType.getFile()); + assertNull(messageType.getContainingType()); + assertEquals(DescriptorProtos.MessageOptions.getDefaultInstance(), + messageType.getOptions()); + assertEquals("TestAllTypes", messageType.toProto().getName()); + + assertEquals("NestedMessage", nestedType.getName()); + assertEquals("protobuf_unittest.TestAllTypes.NestedMessage", + nestedType.getFullName()); + assertEquals(UnittestProto.getDescriptor(), nestedType.getFile()); + assertEquals(messageType, nestedType.getContainingType()); + + FieldDescriptor field = messageType.getFields().get(0); + assertEquals("optional_int32", field.getName()); + assertEquals(field, messageType.findFieldByName("optional_int32")); + assertNull(messageType.findFieldByName("no_such_field")); + assertEquals(field, messageType.findFieldByNumber(1)); + assertNull(messageType.findFieldByNumber(571283)); + for (int i = 0; i < messageType.getFields().size(); i++) { + assertEquals(i, messageType.getFields().get(i).getIndex()); + } + + assertEquals(nestedType, messageType.getNestedTypes().get(0)); + assertEquals(nestedType, messageType.findNestedTypeByName("NestedMessage")); + assertNull(messageType.findNestedTypeByName("NoSuchType")); + for (int i = 0; i < messageType.getNestedTypes().size(); i++) { + assertEquals(i, messageType.getNestedTypes().get(i).getIndex()); + } + + EnumDescriptor enumType = TestAllTypes.NestedEnum.getDescriptor(); + assertEquals(enumType, messageType.getEnumTypes().get(0)); + assertEquals(enumType, messageType.findEnumTypeByName("NestedEnum")); + assertNull(messageType.findEnumTypeByName("NoSuchType")); + for (int i = 0; i < messageType.getEnumTypes().size(); i++) { + assertEquals(i, messageType.getEnumTypes().get(i).getIndex()); + } + } + + public void testFieldDescriptor() throws Exception { + Descriptor messageType = TestAllTypes.getDescriptor(); + FieldDescriptor primitiveField = + messageType.findFieldByName("optional_int32"); + FieldDescriptor enumField = + messageType.findFieldByName("optional_nested_enum"); + FieldDescriptor messageField = + messageType.findFieldByName("optional_foreign_message"); + FieldDescriptor cordField = + messageType.findFieldByName("optional_cord"); + FieldDescriptor extension = + UnittestProto.optionalInt32Extension.getDescriptor(); + FieldDescriptor nestedExtension = TestRequired.single.getDescriptor(); + + assertEquals("optional_int32", primitiveField.getName()); + assertEquals("protobuf_unittest.TestAllTypes.optional_int32", + primitiveField.getFullName()); + assertEquals(1, primitiveField.getNumber()); + assertEquals(messageType, primitiveField.getContainingType()); + assertEquals(UnittestProto.getDescriptor(), primitiveField.getFile()); + assertEquals(FieldDescriptor.Type.INT32, primitiveField.getType()); + assertEquals(FieldDescriptor.JavaType.INT, primitiveField.getJavaType()); + assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(), + primitiveField.getOptions()); + assertFalse(primitiveField.isExtension()); + assertEquals("optional_int32", primitiveField.toProto().getName()); + + assertEquals("optional_nested_enum", enumField.getName()); + assertEquals(FieldDescriptor.Type.ENUM, enumField.getType()); + assertEquals(FieldDescriptor.JavaType.ENUM, enumField.getJavaType()); + assertEquals(TestAllTypes.NestedEnum.getDescriptor(), + enumField.getEnumType()); + + assertEquals("optional_foreign_message", messageField.getName()); + assertEquals(FieldDescriptor.Type.MESSAGE, messageField.getType()); + assertEquals(FieldDescriptor.JavaType.MESSAGE, messageField.getJavaType()); + assertEquals(ForeignMessage.getDescriptor(), messageField.getMessageType()); + + assertEquals("optional_cord", cordField.getName()); + assertEquals(FieldDescriptor.Type.STRING, cordField.getType()); + assertEquals(FieldDescriptor.JavaType.STRING, cordField.getJavaType()); + assertEquals(DescriptorProtos.FieldOptions.CType.CORD, + cordField.getOptions().getCtype()); + + assertEquals("optional_int32_extension", extension.getName()); + assertEquals("protobuf_unittest.optional_int32_extension", + extension.getFullName()); + assertEquals(1, extension.getNumber()); + assertEquals(TestAllExtensions.getDescriptor(), + extension.getContainingType()); + assertEquals(UnittestProto.getDescriptor(), extension.getFile()); + assertEquals(FieldDescriptor.Type.INT32, extension.getType()); + assertEquals(FieldDescriptor.JavaType.INT, extension.getJavaType()); + assertEquals(DescriptorProtos.FieldOptions.getDefaultInstance(), + extension.getOptions()); + assertTrue(extension.isExtension()); + assertEquals(null, extension.getExtensionScope()); + assertEquals("optional_int32_extension", extension.toProto().getName()); + + assertEquals("single", nestedExtension.getName()); + assertEquals("protobuf_unittest.TestRequired.single", + nestedExtension.getFullName()); + assertEquals(TestRequired.getDescriptor(), + nestedExtension.getExtensionScope()); + } + + public void testFieldDescriptorLabel() throws Exception { + FieldDescriptor requiredField = + TestRequired.getDescriptor().findFieldByName("a"); + FieldDescriptor optionalField = + TestAllTypes.getDescriptor().findFieldByName("optional_int32"); + FieldDescriptor repeatedField = + TestAllTypes.getDescriptor().findFieldByName("repeated_int32"); + + assertTrue(requiredField.isRequired()); + assertFalse(requiredField.isRepeated()); + assertFalse(optionalField.isRequired()); + assertFalse(optionalField.isRepeated()); + assertFalse(repeatedField.isRequired()); + assertTrue(repeatedField.isRepeated()); + } + + public void testFieldDescriptorDefault() throws Exception { + Descriptor d = TestAllTypes.getDescriptor(); + assertFalse(d.findFieldByName("optional_int32").hasDefaultValue()); + assertEquals(0, d.findFieldByName("optional_int32").getDefaultValue()); + assertTrue(d.findFieldByName("default_int32").hasDefaultValue()); + assertEquals(41, d.findFieldByName("default_int32").getDefaultValue()); + + d = TestExtremeDefaultValues.getDescriptor(); + assertEquals( + ByteString.copyFrom( + "\0\001\007\b\f\n\r\t\013\\\'\"\u00fe".getBytes("ISO-8859-1")), + d.findFieldByName("escaped_bytes").getDefaultValue()); + assertEquals(-1, d.findFieldByName("large_uint32").getDefaultValue()); + assertEquals(-1L, d.findFieldByName("large_uint64").getDefaultValue()); + } + + public void testEnumDescriptor() throws Exception { + EnumDescriptor enumType = ForeignEnum.getDescriptor(); + EnumDescriptor nestedType = TestAllTypes.NestedEnum.getDescriptor(); + + assertEquals("ForeignEnum", enumType.getName()); + assertEquals("protobuf_unittest.ForeignEnum", enumType.getFullName()); + assertEquals(UnittestProto.getDescriptor(), enumType.getFile()); + assertNull(enumType.getContainingType()); + assertEquals(DescriptorProtos.EnumOptions.getDefaultInstance(), + enumType.getOptions()); + + assertEquals("NestedEnum", nestedType.getName()); + assertEquals("protobuf_unittest.TestAllTypes.NestedEnum", + nestedType.getFullName()); + assertEquals(UnittestProto.getDescriptor(), nestedType.getFile()); + assertEquals(TestAllTypes.getDescriptor(), nestedType.getContainingType()); + + EnumValueDescriptor value = ForeignEnum.FOREIGN_FOO.getValueDescriptor(); + assertEquals(value, enumType.getValues().get(0)); + assertEquals("FOREIGN_FOO", value.getName()); + assertEquals(4, value.getNumber()); + assertEquals(value, enumType.findValueByName("FOREIGN_FOO")); + assertEquals(value, enumType.findValueByNumber(4)); + assertNull(enumType.findValueByName("NO_SUCH_VALUE")); + for (int i = 0; i < enumType.getValues().size(); i++) { + assertEquals(i, enumType.getValues().get(i).getIndex()); + } + } + + public void testServiceDescriptor() throws Exception { + ServiceDescriptor service = TestService.getDescriptor(); + + assertEquals("TestService", service.getName()); + assertEquals("protobuf_unittest.TestService", service.getFullName()); + assertEquals(UnittestProto.getDescriptor(), service.getFile()); + + assertEquals(2, service.getMethods().size()); + + MethodDescriptor fooMethod = service.getMethods().get(0); + assertEquals("Foo", fooMethod.getName()); + assertEquals(UnittestProto.FooRequest.getDescriptor(), + fooMethod.getInputType()); + assertEquals(UnittestProto.FooResponse.getDescriptor(), + fooMethod.getOutputType()); + assertEquals(fooMethod, service.findMethodByName("Foo")); + + MethodDescriptor barMethod = service.getMethods().get(1); + assertEquals("Bar", barMethod.getName()); + assertEquals(UnittestProto.BarRequest.getDescriptor(), + barMethod.getInputType()); + assertEquals(UnittestProto.BarResponse.getDescriptor(), + barMethod.getOutputType()); + assertEquals(barMethod, service.findMethodByName("Bar")); + + assertNull(service.findMethodByName("NoSuchMethod")); + + for (int i = 0; i < service.getMethods().size(); i++) { + assertEquals(i, service.getMethods().get(i).getIndex()); + } + } + + + public void testCustomOptions() throws Exception { + Descriptor descriptor = + UnittestCustomOptions.TestMessageWithCustomOptions.getDescriptor(); + + assertTrue( + descriptor.getOptions().hasExtension(UnittestCustomOptions.messageOpt1)); + assertEquals(Integer.valueOf(-56), + descriptor.getOptions().getExtension(UnittestCustomOptions.messageOpt1)); + + FieldDescriptor field = descriptor.findFieldByName("field1"); + assertNotNull(field); + + assertTrue( + field.getOptions().hasExtension(UnittestCustomOptions.fieldOpt1)); + assertEquals(Long.valueOf(8765432109L), + field.getOptions().getExtension(UnittestCustomOptions.fieldOpt1)); + + EnumDescriptor enumType = + UnittestCustomOptions.TestMessageWithCustomOptions.AnEnum.getDescriptor(); + + assertTrue( + enumType.getOptions().hasExtension(UnittestCustomOptions.enumOpt1)); + assertEquals(Integer.valueOf(-789), + enumType.getOptions().getExtension(UnittestCustomOptions.enumOpt1)); + + ServiceDescriptor service = + UnittestCustomOptions.TestServiceWithCustomOptions.getDescriptor(); + + assertTrue( + service.getOptions().hasExtension(UnittestCustomOptions.serviceOpt1)); + assertEquals(Long.valueOf(-9876543210L), + service.getOptions().getExtension(UnittestCustomOptions.serviceOpt1)); + + MethodDescriptor method = service.findMethodByName("Foo"); + assertNotNull(method); + + assertTrue( + method.getOptions().hasExtension(UnittestCustomOptions.methodOpt1)); + assertEquals(UnittestCustomOptions.MethodOpt1.METHODOPT1_VAL2, + method.getOptions().getExtension(UnittestCustomOptions.methodOpt1)); + } + + /** + * Test that the FieldDescriptor.Type enum is the same as the + * WireFormat.FieldType enum. + */ + public void testFieldTypeTablesMatch() throws Exception { + FieldDescriptor.Type[] values1 = FieldDescriptor.Type.values(); + WireFormat.FieldType[] values2 = WireFormat.FieldType.values(); + + assertEquals(values1.length, values2.length); + + for (int i = 0; i < values1.length; i++) { + assertEquals(values1[i].toString(), values2[i].toString()); + } + } + + /** + * Test that the FieldDescriptor.JavaType enum is the same as the + * WireFormat.JavaType enum. + */ + public void testJavaTypeTablesMatch() throws Exception { + FieldDescriptor.JavaType[] values1 = FieldDescriptor.JavaType.values(); + WireFormat.JavaType[] values2 = WireFormat.JavaType.values(); + + assertEquals(values1.length, values2.length); + + for (int i = 0; i < values1.length; i++) { + assertEquals(values1[i].toString(), values2[i].toString()); + } + } + + public void testEnormousDescriptor() throws Exception { + // The descriptor for this file is larger than 64k, yet it did not cause + // a compiler error due to an over-long string literal. + assertTrue( + UnittestEnormousDescriptor.getDescriptor() + .toProto().getSerializedSize() > 65536); + } + + /** + * Tests that the DescriptorValidationException works as intended. + */ + public void testDescriptorValidatorException() throws Exception { + FileDescriptorProto fileDescriptorProto = FileDescriptorProto.newBuilder() + .setName("foo.proto") + .addMessageType(DescriptorProto.newBuilder() + .setName("Foo") + .addField(FieldDescriptorProto.newBuilder() + .setLabel(FieldDescriptorProto.Label.LABEL_OPTIONAL) + .setType(FieldDescriptorProto.Type.TYPE_INT32) + .setName("foo") + .setNumber(1) + .setDefaultValue("invalid") + .build()) + .build()) + .build(); + try { + Descriptors.FileDescriptor.buildFrom(fileDescriptorProto, + new FileDescriptor[0]); + fail("DescriptorValidationException expected"); + } catch (DescriptorValidationException e) { + // Expected; check that the error message contains some useful hints + assertTrue(e.getMessage().indexOf("foo") != -1); + assertTrue(e.getMessage().indexOf("Foo") != -1); + assertTrue(e.getMessage().indexOf("invalid") != -1); + assertTrue(e.getCause() instanceof NumberFormatException); + assertTrue(e.getCause().getMessage().indexOf("invalid") != -1); + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java new file mode 100644 index 000000000..aabccda2b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java @@ -0,0 +1,226 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestPackedTypes; + +import junit.framework.TestCase; +import java.util.Arrays; + +/** + * Unit test for {@link DynamicMessage}. See also {@link MessageTest}, which + * tests some {@link DynamicMessage} functionality. + * + * @author kenton@google.com Kenton Varda + */ +public class DynamicMessageTest extends TestCase { + TestUtil.ReflectionTester reflectionTester = + new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null); + + TestUtil.ReflectionTester extensionsReflectionTester = + new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(), + TestUtil.getExtensionRegistry()); + TestUtil.ReflectionTester packedReflectionTester = + new TestUtil.ReflectionTester(TestPackedTypes.getDescriptor(), null); + + public void testDynamicMessageAccessors() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + reflectionTester.setAllFieldsViaReflection(builder); + Message message = builder.build(); + reflectionTester.assertAllFieldsSetViaReflection(message); + } + + public void testDoubleBuildError() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + builder.build(); + try { + builder.build(); + fail("Should have thrown exception."); + } catch (IllegalStateException e) { + // Success. + } + } + + public void testClearAfterBuildError() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + builder.build(); + try { + builder.clear(); + fail("Should have thrown exception."); + } catch (IllegalStateException e) { + // Success. + } + } + + public void testDynamicMessageSettersRejectNull() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + reflectionTester.assertReflectionSettersRejectNull(builder); + } + + public void testDynamicMessageExtensionAccessors() throws Exception { + // We don't need to extensively test DynamicMessage's handling of + // extensions because, frankly, it doesn't do anything special with them. + // It treats them just like any other fields. + Message.Builder builder = + DynamicMessage.newBuilder(TestAllExtensions.getDescriptor()); + extensionsReflectionTester.setAllFieldsViaReflection(builder); + Message message = builder.build(); + extensionsReflectionTester.assertAllFieldsSetViaReflection(message); + } + + public void testDynamicMessageExtensionSettersRejectNull() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllExtensions.getDescriptor()); + extensionsReflectionTester.assertReflectionSettersRejectNull(builder); + } + + public void testDynamicMessageRepeatedSetters() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + reflectionTester.setAllFieldsViaReflection(builder); + reflectionTester.modifyRepeatedFieldsViaReflection(builder); + Message message = builder.build(); + reflectionTester.assertRepeatedFieldsModifiedViaReflection(message); + } + + public void testDynamicMessageRepeatedSettersRejectNull() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); + } + + public void testDynamicMessageDefaults() throws Exception { + reflectionTester.assertClearViaReflection( + DynamicMessage.getDefaultInstance(TestAllTypes.getDescriptor())); + reflectionTester.assertClearViaReflection( + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()).build()); + } + + public void testDynamicMessageSerializedSize() throws Exception { + TestAllTypes message = TestUtil.getAllSet(); + + Message.Builder dynamicBuilder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + reflectionTester.setAllFieldsViaReflection(dynamicBuilder); + Message dynamicMessage = dynamicBuilder.build(); + + assertEquals(message.getSerializedSize(), + dynamicMessage.getSerializedSize()); + } + + public void testDynamicMessageSerialization() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + reflectionTester.setAllFieldsViaReflection(builder); + Message message = builder.build(); + + ByteString rawBytes = message.toByteString(); + TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes); + + TestUtil.assertAllFieldsSet(message2); + + // In fact, the serialized forms should be exactly the same, byte-for-byte. + assertEquals(TestUtil.getAllSet().toByteString(), rawBytes); + } + + public void testDynamicMessageParsing() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + TestAllTypes message = builder.build(); + + ByteString rawBytes = message.toByteString(); + + Message message2 = + DynamicMessage.parseFrom(TestAllTypes.getDescriptor(), rawBytes); + reflectionTester.assertAllFieldsSetViaReflection(message2); + } + + public void testDynamicMessagePackedSerialization() throws Exception { + Message.Builder builder = + DynamicMessage.newBuilder(TestPackedTypes.getDescriptor()); + packedReflectionTester.setPackedFieldsViaReflection(builder); + Message message = builder.build(); + + ByteString rawBytes = message.toByteString(); + TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes); + + TestUtil.assertPackedFieldsSet(message2); + + // In fact, the serialized forms should be exactly the same, byte-for-byte. + assertEquals(TestUtil.getPackedSet().toByteString(), rawBytes); + } + + public void testDynamicMessagePackedParsing() throws Exception { + TestPackedTypes.Builder builder = TestPackedTypes.newBuilder(); + TestUtil.setPackedFields(builder); + TestPackedTypes message = builder.build(); + + ByteString rawBytes = message.toByteString(); + + Message message2 = + DynamicMessage.parseFrom(TestPackedTypes.getDescriptor(), rawBytes); + packedReflectionTester.assertPackedFieldsSetViaReflection(message2); + } + + public void testDynamicMessageCopy() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + TestAllTypes message = builder.build(); + + DynamicMessage copy = DynamicMessage.newBuilder(message).build(); + reflectionTester.assertAllFieldsSetViaReflection(copy); + } + + public void testToBuilder() throws Exception { + DynamicMessage.Builder builder = + DynamicMessage.newBuilder(TestAllTypes.getDescriptor()); + reflectionTester.setAllFieldsViaReflection(builder); + int unknownFieldNum = 9; + long unknownFieldVal = 90; + builder.setUnknownFields(UnknownFieldSet.newBuilder() + .addField(unknownFieldNum, + UnknownFieldSet.Field.newBuilder() + .addVarint(unknownFieldVal).build()) + .build()); + DynamicMessage message = builder.build(); + + DynamicMessage derived = message.toBuilder().build(); + reflectionTester.assertAllFieldsSetViaReflection(derived); + assertEquals(Arrays.asList(unknownFieldVal), + derived.getUnknownFields().getField(unknownFieldNum).getVarintList()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java new file mode 100644 index 000000000..8b78893dd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java @@ -0,0 +1,48 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +/** + * A prerun for a test suite that allows running the full protocol buffer + * tests in a mode that disables the optimization for not using + * {@link RepeatedFieldBuilder} and {@link SingleFieldBuilder} until they are + * requested. This allows us to run all the tests through both code paths + * and ensures that both code paths produce identical results. + * + * @author jonp@google.com (Jon Perlow) + */ +public class ForceFieldBuildersPreRun implements Runnable { + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void run() { + GeneratedMessage.enableAlwaysUseFieldBuildersForTesting(); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java new file mode 100644 index 000000000..acb223559 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java @@ -0,0 +1,980 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.UnittestLite.TestAllExtensionsLite; +import com.google.protobuf.test.UnittestImport; +import protobuf_unittest.EnumWithNoOuter; +import protobuf_unittest.MessageWithNoOuter; +import protobuf_unittest.MultipleFilesTestProto; +import protobuf_unittest.NestedExtension.MyNestedExtension; +import protobuf_unittest.NestedExtensionLite.MyNestedExtensionLite; +import protobuf_unittest.NonNestedExtension; +import protobuf_unittest.NonNestedExtension.MessageToBeExtended; +import protobuf_unittest.NonNestedExtension.MyNonNestedExtension; +import protobuf_unittest.NonNestedExtensionLite; +import protobuf_unittest.NonNestedExtensionLite.MessageLiteToBeExtended; +import protobuf_unittest.NonNestedExtensionLite.MyNonNestedExtensionLite; +import protobuf_unittest.ServiceWithNoOuter; +import protobuf_unittest.UnittestOptimizeFor.TestOptimizedForSize; +import protobuf_unittest.UnittestOptimizeFor.TestOptionalOptimizedForSize; +import protobuf_unittest.UnittestOptimizeFor.TestRequiredOptimizedForSize; +import protobuf_unittest.UnittestProto; +import protobuf_unittest.UnittestProto.ForeignEnum; +import protobuf_unittest.UnittestProto.ForeignMessage; +import protobuf_unittest.UnittestProto.ForeignMessageOrBuilder; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; +import protobuf_unittest.UnittestProto.TestExtremeDefaultValues; +import protobuf_unittest.UnittestProto.TestPackedTypes; +import protobuf_unittest.UnittestProto.TestUnpackedTypes; + +import junit.framework.TestCase; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * Unit test for generated messages and generated code. See also + * {@link MessageTest}, which tests some generated message functionality. + * + * @author kenton@google.com Kenton Varda + */ +public class GeneratedMessageTest extends TestCase { + TestUtil.ReflectionTester reflectionTester = + new TestUtil.ReflectionTester(TestAllTypes.getDescriptor(), null); + + public void testDefaultInstance() throws Exception { + assertSame(TestAllTypes.getDefaultInstance(), + TestAllTypes.getDefaultInstance().getDefaultInstanceForType()); + assertSame(TestAllTypes.getDefaultInstance(), + TestAllTypes.newBuilder().getDefaultInstanceForType()); + } + + public void testMessageOrBuilder() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + TestAllTypes message = builder.build(); + TestUtil.assertAllFieldsSet(message); + } + + public void testUsingBuilderMultipleTimes() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + // primitive field scalar and repeated + builder.setOptionalSfixed64(100); + builder.addRepeatedInt32(100); + // enum field scalar and repeated + builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); + builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); + // proto field scalar and repeated + builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(1)); + builder.addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(1)); + + TestAllTypes value1 = builder.build(); + + assertEquals(100, value1.getOptionalSfixed64()); + assertEquals(100, value1.getRepeatedInt32(0)); + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, + value1.getOptionalImportEnum()); + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, + value1.getRepeatedImportEnum(0)); + assertEquals(1, value1.getOptionalForeignMessage().getC()); + assertEquals(1, value1.getRepeatedForeignMessage(0).getC()); + + // Make sure that builder didn't update previously created values + builder.setOptionalSfixed64(200); + builder.setRepeatedInt32(0, 200); + builder.setOptionalImportEnum(UnittestImport.ImportEnum.IMPORT_FOO); + builder.setRepeatedImportEnum(0, UnittestImport.ImportEnum.IMPORT_FOO); + builder.setOptionalForeignMessage(ForeignMessage.newBuilder().setC(2)); + builder.setRepeatedForeignMessage(0, ForeignMessage.newBuilder().setC(2)); + + TestAllTypes value2 = builder.build(); + + // Make sure value1 didn't change. + assertEquals(100, value1.getOptionalSfixed64()); + assertEquals(100, value1.getRepeatedInt32(0)); + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, + value1.getOptionalImportEnum()); + assertEquals(UnittestImport.ImportEnum.IMPORT_BAR, + value1.getRepeatedImportEnum(0)); + assertEquals(1, value1.getOptionalForeignMessage().getC()); + assertEquals(1, value1.getRepeatedForeignMessage(0).getC()); + + // Make sure value2 is correct + assertEquals(200, value2.getOptionalSfixed64()); + assertEquals(200, value2.getRepeatedInt32(0)); + assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, + value2.getOptionalImportEnum()); + assertEquals(UnittestImport.ImportEnum.IMPORT_FOO, + value2.getRepeatedImportEnum(0)); + assertEquals(2, value2.getOptionalForeignMessage().getC()); + assertEquals(2, value2.getRepeatedForeignMessage(0).getC()); + } + + public void testProtosShareRepeatedArraysIfDidntChange() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + builder.addRepeatedInt32(100); + builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); + builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); + + TestAllTypes value1 = builder.build(); + TestAllTypes value2 = value1.toBuilder().build(); + + assertSame(value1.getRepeatedInt32List(), value2.getRepeatedInt32List()); + assertSame(value1.getRepeatedImportEnumList(), + value2.getRepeatedImportEnumList()); + assertSame(value1.getRepeatedForeignMessageList(), + value2.getRepeatedForeignMessageList()); + } + + public void testRepeatedArraysAreImmutable() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + builder.addRepeatedInt32(100); + builder.addRepeatedImportEnum(UnittestImport.ImportEnum.IMPORT_BAR); + builder.addRepeatedForeignMessage(ForeignMessage.getDefaultInstance()); + assertIsUnmodifiable(builder.getRepeatedInt32List()); + assertIsUnmodifiable(builder.getRepeatedImportEnumList()); + assertIsUnmodifiable(builder.getRepeatedForeignMessageList()); + assertIsUnmodifiable(builder.getRepeatedFloatList()); + + + TestAllTypes value = builder.build(); + assertIsUnmodifiable(value.getRepeatedInt32List()); + assertIsUnmodifiable(value.getRepeatedImportEnumList()); + assertIsUnmodifiable(value.getRepeatedForeignMessageList()); + assertIsUnmodifiable(value.getRepeatedFloatList()); + } + + private void assertIsUnmodifiable(List list) { + if (list == Collections.emptyList()) { + // OKAY -- Need to check this b/c EmptyList allows you to call clear. + } else { + try { + list.clear(); + fail("List wasn't immutable"); + } catch (UnsupportedOperationException e) { + // good + } + } + } + + public void testSettersRejectNull() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + try { + builder.setOptionalString(null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setOptionalBytes(null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setOptionalNestedMessage((TestAllTypes.NestedMessage) null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setOptionalNestedMessage( + (TestAllTypes.NestedMessage.Builder) null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setOptionalNestedEnum(null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedString(null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedBytes(null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedNestedMessage((TestAllTypes.NestedMessage) null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedNestedMessage( + (TestAllTypes.NestedMessage.Builder) null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedNestedEnum(null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + } + + public void testRepeatedSetters() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + TestUtil.modifyRepeatedFields(builder); + TestAllTypes message = builder.build(); + TestUtil.assertRepeatedFieldsModified(message); + } + + public void testRepeatedSettersRejectNull() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + + builder.addRepeatedString("one"); + builder.addRepeatedString("two"); + try { + builder.setRepeatedString(1, null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + builder.addRepeatedBytes(TestUtil.toBytes("one")); + builder.addRepeatedBytes(TestUtil.toBytes("two")); + try { + builder.setRepeatedBytes(1, null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + builder.addRepeatedNestedMessage( + TestAllTypes.NestedMessage.newBuilder().setBb(218).build()); + builder.addRepeatedNestedMessage( + TestAllTypes.NestedMessage.newBuilder().setBb(456).build()); + try { + builder.setRepeatedNestedMessage(1, (TestAllTypes.NestedMessage) null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setRepeatedNestedMessage( + 1, (TestAllTypes.NestedMessage.Builder) null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.FOO); + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR); + try { + builder.setRepeatedNestedEnum(1, null); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + } + + public void testRepeatedAppend() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + + builder.addAllRepeatedInt32(Arrays.asList(1, 2, 3, 4)); + builder.addAllRepeatedForeignEnum(Arrays.asList(ForeignEnum.FOREIGN_BAZ)); + + ForeignMessage foreignMessage = + ForeignMessage.newBuilder().setC(12).build(); + builder.addAllRepeatedForeignMessage(Arrays.asList(foreignMessage)); + + TestAllTypes message = builder.build(); + assertEquals(message.getRepeatedInt32List(), Arrays.asList(1, 2, 3, 4)); + assertEquals(message.getRepeatedForeignEnumList(), + Arrays.asList(ForeignEnum.FOREIGN_BAZ)); + assertEquals(1, message.getRepeatedForeignMessageCount()); + assertEquals(12, message.getRepeatedForeignMessage(0).getC()); + } + + public void testRepeatedAppendRejectsNull() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + + ForeignMessage foreignMessage = + ForeignMessage.newBuilder().setC(12).build(); + try { + builder.addAllRepeatedForeignMessage( + Arrays.asList(foreignMessage, (ForeignMessage) null)); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + try { + builder.addAllRepeatedForeignEnum( + Arrays.asList(ForeignEnum.FOREIGN_BAZ, null)); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + try { + builder.addAllRepeatedString(Arrays.asList("one", null)); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + try { + builder.addAllRepeatedBytes(Arrays.asList(TestUtil.toBytes("one"), null)); + fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + } + + public void testSettingForeignMessageUsingBuilder() throws Exception { + TestAllTypes message = TestAllTypes.newBuilder() + // Pass builder for foreign message instance. + .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(123)) + .build(); + TestAllTypes expectedMessage = TestAllTypes.newBuilder() + // Create expected version passing foreign message instance explicitly. + .setOptionalForeignMessage( + ForeignMessage.newBuilder().setC(123).build()) + .build(); + // TODO(ngd): Upgrade to using real #equals method once implemented + assertEquals(expectedMessage.toString(), message.toString()); + } + + public void testSettingRepeatedForeignMessageUsingBuilder() throws Exception { + TestAllTypes message = TestAllTypes.newBuilder() + // Pass builder for foreign message instance. + .addRepeatedForeignMessage(ForeignMessage.newBuilder().setC(456)) + .build(); + TestAllTypes expectedMessage = TestAllTypes.newBuilder() + // Create expected version passing foreign message instance explicitly. + .addRepeatedForeignMessage( + ForeignMessage.newBuilder().setC(456).build()) + .build(); + assertEquals(expectedMessage.toString(), message.toString()); + } + + public void testDefaults() throws Exception { + TestUtil.assertClear(TestAllTypes.getDefaultInstance()); + TestUtil.assertClear(TestAllTypes.newBuilder().build()); + + TestExtremeDefaultValues message = + TestExtremeDefaultValues.getDefaultInstance(); + assertEquals("\u1234", message.getUtf8String()); + assertEquals(Double.POSITIVE_INFINITY, message.getInfDouble()); + assertEquals(Double.NEGATIVE_INFINITY, message.getNegInfDouble()); + assertTrue(Double.isNaN(message.getNanDouble())); + assertEquals(Float.POSITIVE_INFINITY, message.getInfFloat()); + assertEquals(Float.NEGATIVE_INFINITY, message.getNegInfFloat()); + assertTrue(Float.isNaN(message.getNanFloat())); + assertEquals("? ? ?? ?? ??? ??/ ??-", message.getCppTrigraph()); + } + + public void testClear() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.assertClear(builder); + TestUtil.setAllFields(builder); + builder.clear(); + TestUtil.assertClear(builder); + } + + public void testReflectionGetters() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + reflectionTester.assertAllFieldsSetViaReflection(builder); + + TestAllTypes message = builder.build(); + reflectionTester.assertAllFieldsSetViaReflection(message); + } + + public void testReflectionSetters() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + reflectionTester.setAllFieldsViaReflection(builder); + TestUtil.assertAllFieldsSet(builder); + + TestAllTypes message = builder.build(); + TestUtil.assertAllFieldsSet(message); + } + + public void testReflectionSettersRejectNull() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + reflectionTester.assertReflectionSettersRejectNull(builder); + } + + public void testReflectionRepeatedSetters() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + reflectionTester.setAllFieldsViaReflection(builder); + reflectionTester.modifyRepeatedFieldsViaReflection(builder); + TestUtil.assertRepeatedFieldsModified(builder); + + TestAllTypes message = builder.build(); + TestUtil.assertRepeatedFieldsModified(message); + } + + public void testReflectionRepeatedSettersRejectNull() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + reflectionTester.assertReflectionRepeatedSettersRejectNull(builder); + } + + public void testReflectionDefaults() throws Exception { + reflectionTester.assertClearViaReflection( + TestAllTypes.getDefaultInstance()); + reflectionTester.assertClearViaReflection( + TestAllTypes.newBuilder().build()); + } + + public void testEnumInterface() throws Exception { + assertTrue(TestAllTypes.getDefaultInstance().getDefaultNestedEnum() + instanceof ProtocolMessageEnum); + } + + public void testEnumMap() throws Exception { + Internal.EnumLiteMap map = ForeignEnum.internalGetValueMap(); + + for (ForeignEnum value : ForeignEnum.values()) { + assertEquals(value, map.findValueByNumber(value.getNumber())); + } + + assertTrue(map.findValueByNumber(12345) == null); + } + + public void testParsePackedToUnpacked() throws Exception { + TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder(); + TestUnpackedTypes message = + builder.mergeFrom(TestUtil.getPackedSet().toByteString()).build(); + TestUtil.assertUnpackedFieldsSet(message); + } + + public void testParseUnpackedToPacked() throws Exception { + TestPackedTypes.Builder builder = TestPackedTypes.newBuilder(); + TestPackedTypes message = + builder.mergeFrom(TestUtil.getUnpackedSet().toByteString()).build(); + TestUtil.assertPackedFieldsSet(message); + } + + // ================================================================= + // Extensions. + + TestUtil.ReflectionTester extensionsReflectionTester = + new TestUtil.ReflectionTester(TestAllExtensions.getDescriptor(), + TestUtil.getExtensionRegistry()); + + public void testExtensionMessageOrBuilder() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + TestUtil.setAllExtensions(builder); + TestAllExtensions message = builder.build(); + TestUtil.assertAllExtensionsSet(message); + } + + public void testExtensionRepeatedSetters() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + TestUtil.setAllExtensions(builder); + TestUtil.modifyRepeatedExtensions(builder); + TestAllExtensions message = builder.build(); + TestUtil.assertRepeatedExtensionsModified(message); + } + + public void testExtensionDefaults() throws Exception { + TestUtil.assertExtensionsClear(TestAllExtensions.getDefaultInstance()); + TestUtil.assertExtensionsClear(TestAllExtensions.newBuilder().build()); + } + + public void testExtensionReflectionGetters() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + TestUtil.setAllExtensions(builder); + extensionsReflectionTester.assertAllFieldsSetViaReflection(builder); + + TestAllExtensions message = builder.build(); + extensionsReflectionTester.assertAllFieldsSetViaReflection(message); + } + + public void testExtensionReflectionSetters() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + extensionsReflectionTester.setAllFieldsViaReflection(builder); + TestUtil.assertAllExtensionsSet(builder); + + TestAllExtensions message = builder.build(); + TestUtil.assertAllExtensionsSet(message); + } + + public void testExtensionReflectionSettersRejectNull() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + extensionsReflectionTester.assertReflectionSettersRejectNull(builder); + } + + public void testExtensionReflectionRepeatedSetters() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + extensionsReflectionTester.setAllFieldsViaReflection(builder); + extensionsReflectionTester.modifyRepeatedFieldsViaReflection(builder); + TestUtil.assertRepeatedExtensionsModified(builder); + + TestAllExtensions message = builder.build(); + TestUtil.assertRepeatedExtensionsModified(message); + } + + public void testExtensionReflectionRepeatedSettersRejectNull() + throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + extensionsReflectionTester.assertReflectionRepeatedSettersRejectNull( + builder); + } + + public void testExtensionReflectionDefaults() throws Exception { + extensionsReflectionTester.assertClearViaReflection( + TestAllExtensions.getDefaultInstance()); + extensionsReflectionTester.assertClearViaReflection( + TestAllExtensions.newBuilder().build()); + } + + public void testClearExtension() throws Exception { + // clearExtension() is not actually used in TestUtil, so try it manually. + assertFalse( + TestAllExtensions.newBuilder() + .setExtension(UnittestProto.optionalInt32Extension, 1) + .clearExtension(UnittestProto.optionalInt32Extension) + .hasExtension(UnittestProto.optionalInt32Extension)); + assertEquals(0, + TestAllExtensions.newBuilder() + .addExtension(UnittestProto.repeatedInt32Extension, 1) + .clearExtension(UnittestProto.repeatedInt32Extension) + .getExtensionCount(UnittestProto.repeatedInt32Extension)); + } + + public void testExtensionCopy() throws Exception { + TestAllExtensions original = TestUtil.getAllExtensionsSet(); + TestAllExtensions copy = TestAllExtensions.newBuilder(original).build(); + TestUtil.assertAllExtensionsSet(copy); + } + + public void testExtensionMergeFrom() throws Exception { + TestAllExtensions original = + TestAllExtensions.newBuilder() + .setExtension(UnittestProto.optionalInt32Extension, 1).build(); + TestAllExtensions merged = + TestAllExtensions.newBuilder().mergeFrom(original).build(); + assertTrue(merged.hasExtension(UnittestProto.optionalInt32Extension)); + assertEquals( + 1, (int) merged.getExtension(UnittestProto.optionalInt32Extension)); + } + + // ================================================================= + // Lite Extensions. + + // We test lite extensions directly because they have a separate + // implementation from full extensions. In contrast, we do not test + // lite fields directly since they are implemented exactly the same as + // regular fields. + + public void testLiteExtensionMessageOrBuilder() throws Exception { + TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder(); + TestUtil.setAllExtensions(builder); + TestUtil.assertAllExtensionsSet(builder); + + TestAllExtensionsLite message = builder.build(); + TestUtil.assertAllExtensionsSet(message); + } + + public void testLiteExtensionRepeatedSetters() throws Exception { + TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder(); + TestUtil.setAllExtensions(builder); + TestUtil.modifyRepeatedExtensions(builder); + TestUtil.assertRepeatedExtensionsModified(builder); + + TestAllExtensionsLite message = builder.build(); + TestUtil.assertRepeatedExtensionsModified(message); + } + + public void testLiteExtensionDefaults() throws Exception { + TestUtil.assertExtensionsClear(TestAllExtensionsLite.getDefaultInstance()); + TestUtil.assertExtensionsClear(TestAllExtensionsLite.newBuilder().build()); + } + + public void testClearLiteExtension() throws Exception { + // clearExtension() is not actually used in TestUtil, so try it manually. + assertFalse( + TestAllExtensionsLite.newBuilder() + .setExtension(UnittestLite.optionalInt32ExtensionLite, 1) + .clearExtension(UnittestLite.optionalInt32ExtensionLite) + .hasExtension(UnittestLite.optionalInt32ExtensionLite)); + assertEquals(0, + TestAllExtensionsLite.newBuilder() + .addExtension(UnittestLite.repeatedInt32ExtensionLite, 1) + .clearExtension(UnittestLite.repeatedInt32ExtensionLite) + .getExtensionCount(UnittestLite.repeatedInt32ExtensionLite)); + } + + public void testLiteExtensionCopy() throws Exception { + TestAllExtensionsLite original = TestUtil.getAllLiteExtensionsSet(); + TestAllExtensionsLite copy = + TestAllExtensionsLite.newBuilder(original).build(); + TestUtil.assertAllExtensionsSet(copy); + } + + public void testLiteExtensionMergeFrom() throws Exception { + TestAllExtensionsLite original = + TestAllExtensionsLite.newBuilder() + .setExtension(UnittestLite.optionalInt32ExtensionLite, 1).build(); + TestAllExtensionsLite merged = + TestAllExtensionsLite.newBuilder().mergeFrom(original).build(); + assertTrue(merged.hasExtension(UnittestLite.optionalInt32ExtensionLite)); + assertEquals( + 1, (int) merged.getExtension(UnittestLite.optionalInt32ExtensionLite)); + } + + // ================================================================= + // multiple_files_test + + public void testMultipleFilesOption() throws Exception { + // We mostly just want to check that things compile. + MessageWithNoOuter message = + MessageWithNoOuter.newBuilder() + .setNested(MessageWithNoOuter.NestedMessage.newBuilder().setI(1)) + .addForeign(TestAllTypes.newBuilder().setOptionalInt32(1)) + .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ) + .setForeignEnum(EnumWithNoOuter.BAR) + .build(); + assertEquals(message, MessageWithNoOuter.parseFrom(message.toByteString())); + + assertEquals(MultipleFilesTestProto.getDescriptor(), + MessageWithNoOuter.getDescriptor().getFile()); + + Descriptors.FieldDescriptor field = + MessageWithNoOuter.getDescriptor().findFieldByName("foreign_enum"); + assertEquals(EnumWithNoOuter.BAR.getValueDescriptor(), + message.getField(field)); + + assertEquals(MultipleFilesTestProto.getDescriptor(), + ServiceWithNoOuter.getDescriptor().getFile()); + + assertFalse( + TestAllExtensions.getDefaultInstance().hasExtension( + MultipleFilesTestProto.extensionWithOuter)); + } + + public void testOptionalFieldWithRequiredSubfieldsOptimizedForSize() + throws Exception { + TestOptionalOptimizedForSize message = + TestOptionalOptimizedForSize.getDefaultInstance(); + assertTrue(message.isInitialized()); + + message = TestOptionalOptimizedForSize.newBuilder().setO( + TestRequiredOptimizedForSize.newBuilder().buildPartial() + ).buildPartial(); + assertFalse(message.isInitialized()); + + message = TestOptionalOptimizedForSize.newBuilder().setO( + TestRequiredOptimizedForSize.newBuilder().setX(5).buildPartial() + ).buildPartial(); + assertTrue(message.isInitialized()); + } + + public void testUninitializedExtensionInOptimizedForSize() + throws Exception { + TestOptimizedForSize.Builder builder = TestOptimizedForSize.newBuilder(); + builder.setExtension(TestOptimizedForSize.testExtension2, + TestRequiredOptimizedForSize.newBuilder().buildPartial()); + assertFalse(builder.isInitialized()); + assertFalse(builder.buildPartial().isInitialized()); + + builder = TestOptimizedForSize.newBuilder(); + builder.setExtension(TestOptimizedForSize.testExtension2, + TestRequiredOptimizedForSize.newBuilder().setX(10).buildPartial()); + assertTrue(builder.isInitialized()); + assertTrue(builder.buildPartial().isInitialized()); + } + + public void testToBuilder() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + TestAllTypes message = builder.build(); + TestUtil.assertAllFieldsSet(message); + TestUtil.assertAllFieldsSet(message.toBuilder().build()); + } + + public void testFieldConstantValues() throws Exception { + assertEquals(TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1); + assertEquals(TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1); + assertEquals(TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16); + assertEquals(TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18); + assertEquals(TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21); + assertEquals(TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31); + assertEquals(TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46); + assertEquals(TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48); + assertEquals(TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51); + } + + public void testExtensionConstantValues() throws Exception { + assertEquals(UnittestProto.TestRequired.SINGLE_FIELD_NUMBER, 1000); + assertEquals(UnittestProto.TestRequired.MULTI_FIELD_NUMBER, 1001); + assertEquals(UnittestProto.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1); + assertEquals(UnittestProto.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16); + assertEquals( + UnittestProto.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18); + assertEquals(UnittestProto.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 21); + assertEquals(UnittestProto.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31); + assertEquals(UnittestProto.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46); + assertEquals( + UnittestProto.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48); + assertEquals(UnittestProto.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER, 51); + } + + public void testRecursiveMessageDefaultInstance() throws Exception { + UnittestProto.TestRecursiveMessage message = + UnittestProto.TestRecursiveMessage.getDefaultInstance(); + assertTrue(message != null); + assertTrue(message.getA() != null); + assertTrue(message.getA() == message); + } + + public void testSerialize() throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestUtil.setAllFields(builder); + TestAllTypes expected = builder.build(); + ObjectOutputStream out = new ObjectOutputStream(baos); + try { + out.writeObject(expected); + } finally { + out.close(); + } + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bais); + TestAllTypes actual = (TestAllTypes) in.readObject(); + assertEquals(expected, actual); + } + + public void testSerializePartial() throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestAllTypes expected = builder.buildPartial(); + ObjectOutputStream out = new ObjectOutputStream(baos); + try { + out.writeObject(expected); + } finally { + out.close(); + } + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bais); + TestAllTypes actual = (TestAllTypes) in.readObject(); + assertEquals(expected, actual); + } + + public void testEnumValues() { + assertEquals( + TestAllTypes.NestedEnum.BAR.getNumber(), + TestAllTypes.NestedEnum.BAR_VALUE); + assertEquals( + TestAllTypes.NestedEnum.BAZ.getNumber(), + TestAllTypes.NestedEnum.BAZ_VALUE); + assertEquals( + TestAllTypes.NestedEnum.FOO.getNumber(), + TestAllTypes.NestedEnum.FOO_VALUE); + } + + public void testNonNestedExtensionInitialization() { + assertTrue(NonNestedExtension.nonNestedExtension + .getMessageDefaultInstance() instanceof MyNonNestedExtension); + assertEquals("nonNestedExtension", + NonNestedExtension.nonNestedExtension.getDescriptor().getName()); + } + + public void testNestedExtensionInitialization() { + assertTrue(MyNestedExtension.recursiveExtension.getMessageDefaultInstance() + instanceof MessageToBeExtended); + assertEquals("recursiveExtension", + MyNestedExtension.recursiveExtension.getDescriptor().getName()); + } + + public void testNonNestedExtensionLiteInitialization() { + assertTrue(NonNestedExtensionLite.nonNestedExtensionLite + .getMessageDefaultInstance() instanceof MyNonNestedExtensionLite); + } + + public void testNestedExtensionLiteInitialization() { + assertTrue(MyNestedExtensionLite.recursiveExtensionLite + .getMessageDefaultInstance() instanceof MessageLiteToBeExtended); + } + + public void testInvalidations() throws Exception { + GeneratedMessage.enableAlwaysUseFieldBuildersForTesting(); + TestAllTypes.NestedMessage nestedMessage1 = + TestAllTypes.NestedMessage.newBuilder().build(); + TestAllTypes.NestedMessage nestedMessage2 = + TestAllTypes.NestedMessage.newBuilder().build(); + + // Set all three flavors (enum, primitive, message and singular/repeated) + // and verify no invalidations fired + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + + TestAllTypes.Builder builder = (TestAllTypes.Builder) + ((GeneratedMessage) TestAllTypes.getDefaultInstance()). + newBuilderForType(mockParent); + builder.setOptionalInt32(1); + builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); + builder.setOptionalNestedMessage(nestedMessage1); + builder.addRepeatedInt32(1); + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAR); + builder.addRepeatedNestedMessage(nestedMessage1); + assertEquals(0, mockParent.getInvalidationCount()); + + // Now tell it we want changes and make sure it's only fired once + // And do this for each flavor + + // primitive single + builder.buildPartial(); + builder.setOptionalInt32(2); + builder.setOptionalInt32(3); + assertEquals(1, mockParent.getInvalidationCount()); + + // enum single + builder.buildPartial(); + builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAZ); + builder.setOptionalNestedEnum(TestAllTypes.NestedEnum.BAR); + assertEquals(2, mockParent.getInvalidationCount()); + + // message single + builder.buildPartial(); + builder.setOptionalNestedMessage(nestedMessage2); + builder.setOptionalNestedMessage(nestedMessage1); + assertEquals(3, mockParent.getInvalidationCount()); + + // primitive repated + builder.buildPartial(); + builder.addRepeatedInt32(2); + builder.addRepeatedInt32(3); + assertEquals(4, mockParent.getInvalidationCount()); + + // enum repeated + builder.buildPartial(); + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); + builder.addRepeatedNestedEnum(TestAllTypes.NestedEnum.BAZ); + assertEquals(5, mockParent.getInvalidationCount()); + + // message repeated + builder.buildPartial(); + builder.addRepeatedNestedMessage(nestedMessage2); + builder.addRepeatedNestedMessage(nestedMessage1); + assertEquals(6, mockParent.getInvalidationCount()); + + } + + public void testInvalidations_Extensions() throws Exception { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + + TestAllExtensions.Builder builder = (TestAllExtensions.Builder) + ((GeneratedMessage) TestAllExtensions.getDefaultInstance()). + newBuilderForType(mockParent); + + builder.addExtension(UnittestProto.repeatedInt32Extension, 1); + builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 2); + builder.clearExtension(UnittestProto.repeatedInt32Extension); + assertEquals(0, mockParent.getInvalidationCount()); + + // Now tell it we want changes and make sure it's only fired once + builder.buildPartial(); + builder.addExtension(UnittestProto.repeatedInt32Extension, 2); + builder.addExtension(UnittestProto.repeatedInt32Extension, 3); + assertEquals(1, mockParent.getInvalidationCount()); + + builder.buildPartial(); + builder.setExtension(UnittestProto.repeatedInt32Extension, 0, 4); + builder.setExtension(UnittestProto.repeatedInt32Extension, 1, 5); + assertEquals(2, mockParent.getInvalidationCount()); + + builder.buildPartial(); + builder.clearExtension(UnittestProto.repeatedInt32Extension); + builder.clearExtension(UnittestProto.repeatedInt32Extension); + assertEquals(3, mockParent.getInvalidationCount()); + } + + public void testBaseMessageOrBuilder() { + // Mostly just makes sure the base interface exists and has some methods. + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TestAllTypes message = builder.buildPartial(); + TestAllTypesOrBuilder builderAsInterface = (TestAllTypesOrBuilder) builder; + TestAllTypesOrBuilder messageAsInterface = (TestAllTypesOrBuilder) message; + + assertEquals( + messageAsInterface.getDefaultBool(), + messageAsInterface.getDefaultBool()); + assertEquals( + messageAsInterface.getOptionalDouble(), + messageAsInterface.getOptionalDouble()); + } + + public void testMessageOrBuilderGetters() { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + + // single fields + assertSame(ForeignMessage.getDefaultInstance(), + builder.getOptionalForeignMessageOrBuilder()); + ForeignMessage.Builder subBuilder = + builder.getOptionalForeignMessageBuilder(); + assertSame(subBuilder, builder.getOptionalForeignMessageOrBuilder()); + + // repeated fields + ForeignMessage m0 = ForeignMessage.newBuilder().buildPartial(); + ForeignMessage m1 = ForeignMessage.newBuilder().buildPartial(); + ForeignMessage m2 = ForeignMessage.newBuilder().buildPartial(); + builder.addRepeatedForeignMessage(m0); + builder.addRepeatedForeignMessage(m1); + builder.addRepeatedForeignMessage(m2); + assertSame(m0, builder.getRepeatedForeignMessageOrBuilder(0)); + assertSame(m1, builder.getRepeatedForeignMessageOrBuilder(1)); + assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2)); + ForeignMessage.Builder b0 = builder.getRepeatedForeignMessageBuilder(0); + ForeignMessage.Builder b1 = builder.getRepeatedForeignMessageBuilder(1); + assertSame(b0, builder.getRepeatedForeignMessageOrBuilder(0)); + assertSame(b1, builder.getRepeatedForeignMessageOrBuilder(1)); + assertSame(m2, builder.getRepeatedForeignMessageOrBuilder(2)); + + List messageOrBuilderList = + builder.getRepeatedForeignMessageOrBuilderList(); + assertSame(b0, messageOrBuilderList.get(0)); + assertSame(b1, messageOrBuilderList.get(1)); + assertSame(m2, messageOrBuilderList.get(2)); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java new file mode 100644 index 000000000..4dcdc74db --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java @@ -0,0 +1,118 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import junit.framework.TestCase; + +/** + * Tests for {@link LazyStringArrayList}. + * + * @author jonp@google.com (Jon Perlow) + */ +public class LazyStringArrayListTest extends TestCase { + + private static String STRING_A = "A"; + private static String STRING_B = "B"; + private static String STRING_C = "C"; + + private static ByteString BYTE_STRING_A = ByteString.copyFromUtf8("A"); + private static ByteString BYTE_STRING_B = ByteString.copyFromUtf8("B"); + private static ByteString BYTE_STRING_C = ByteString.copyFromUtf8("C"); + + public void testJustStrings() { + LazyStringArrayList list = new LazyStringArrayList(); + list.add(STRING_A); + list.add(STRING_B); + list.add(STRING_C); + + assertEquals(3, list.size()); + assertSame(STRING_A, list.get(0)); + assertSame(STRING_B, list.get(1)); + assertSame(STRING_C, list.get(2)); + + list.set(1, STRING_C); + assertSame(STRING_C, list.get(1)); + + list.remove(1); + assertSame(STRING_A, list.get(0)); + assertSame(STRING_C, list.get(1)); + } + + public void testJustByteString() { + LazyStringArrayList list = new LazyStringArrayList(); + list.add(BYTE_STRING_A); + list.add(BYTE_STRING_B); + list.add(BYTE_STRING_C); + + assertEquals(3, list.size()); + assertSame(BYTE_STRING_A, list.getByteString(0)); + assertSame(BYTE_STRING_B, list.getByteString(1)); + assertSame(BYTE_STRING_C, list.getByteString(2)); + + list.remove(1); + assertSame(BYTE_STRING_A, list.getByteString(0)); + assertSame(BYTE_STRING_C, list.getByteString(1)); + } + + public void testConversionBackAndForth() { + LazyStringArrayList list = new LazyStringArrayList(); + list.add(STRING_A); + list.add(BYTE_STRING_B); + list.add(BYTE_STRING_C); + + // String a should be the same because it was originally a string + assertSame(STRING_A, list.get(0)); + + // String b and c should be different because the string has to be computed + // from the ByteString + String bPrime = list.get(1); + assertNotSame(STRING_B, bPrime); + assertEquals(STRING_B, bPrime); + String cPrime = list.get(2); + assertNotSame(STRING_C, cPrime); + assertEquals(STRING_C, cPrime); + + // String c and c should stay the same once cached. + assertSame(bPrime, list.get(1)); + assertSame(cPrime, list.get(2)); + + // ByteString needs to be computed from string for both a and b + ByteString aPrimeByteString = list.getByteString(0); + assertEquals(BYTE_STRING_A, aPrimeByteString); + ByteString bPrimeByteString = list.getByteString(1); + assertNotSame(BYTE_STRING_B, bPrimeByteString); + assertEquals(BYTE_STRING_B, list.getByteString(1)); + + // Once cached, ByteString should stay cached. + assertSame(aPrimeByteString, list.getByteString(0)); + assertSame(bPrimeByteString, list.getByteString(1)); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java new file mode 100644 index 000000000..e6870b514 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java @@ -0,0 +1,115 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + + +import protobuf_unittest.UnittestProto; + +import junit.framework.TestCase; + +import java.io.IOException; + +/** + * Tests to make sure the lazy conversion of UTF8-encoded byte arrays to + * strings works correctly. + * + * @author jonp@google.com (Jon Perlow) + */ +public class LazyStringEndToEndTest extends TestCase { + + private static ByteString TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8 = + ByteString.copyFrom(new byte[] { + 114, 4, -1, 0, -1, 0, -30, 2, 4, -1, + 0, -1, 0, -30, 2, 4, -1, 0, -1, 0, }); + + /** + * Tests that an invalid UTF8 string will roundtrip through a parse + * and serialization. + */ + public void testParseAndSerialize() throws InvalidProtocolBufferException { + UnittestProto.TestAllTypes tV2 = UnittestProto.TestAllTypes.parseFrom( + TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8); + ByteString bytes = tV2.toByteString(); + assertEquals(TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8, bytes); + + tV2.getOptionalString(); + bytes = tV2.toByteString(); + assertEquals(TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8, bytes); + } + + public void testParseAndWrite() throws IOException { + UnittestProto.TestAllTypes tV2 = UnittestProto.TestAllTypes.parseFrom( + TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8); + byte[] sink = new byte[TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8.size()]; + CodedOutputStream outputStream = CodedOutputStream.newInstance(sink); + tV2.writeTo(outputStream); + outputStream.flush(); + assertEquals( + TEST_ALL_TYPES_SERIALIZED_WITH_ILLEGAL_UTF8, + ByteString.copyFrom(sink)); + } + + public void testCaching() { + String a = "a"; + String b = "b"; + String c = "c"; + UnittestProto.TestAllTypes proto = UnittestProto.TestAllTypes.newBuilder() + .setOptionalString(a) + .addRepeatedString(b) + .addRepeatedString(c) + .build(); + + // String should be the one we passed it. + assertSame(a, proto.getOptionalString()); + assertSame(b, proto.getRepeatedString(0)); + assertSame(c, proto.getRepeatedString(1)); + + + // There's no way to directly observe that the ByteString is cached + // correctly on serialization, but we can observe that it had to recompute + // the string after serialization. + proto.toByteString(); + String aPrime = proto.getOptionalString(); + assertNotSame(a, aPrime); + assertEquals(a, aPrime); + String bPrime = proto.getRepeatedString(0); + assertNotSame(b, bPrime); + assertEquals(b, bPrime); + String cPrime = proto.getRepeatedString(1); + assertNotSame(c, cPrime); + assertEquals(c, cPrime); + + // And now the string should stay cached. + assertSame(aPrime, proto.getOptionalString()); + assertSame(bPrime, proto.getRepeatedString(0)); + assertSame(cPrime, proto.getRepeatedString(1)); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java new file mode 100644 index 000000000..839694d64 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java @@ -0,0 +1,148 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.UnittestLite; +import com.google.protobuf.UnittestLite.TestAllTypesLite; +import com.google.protobuf.UnittestLite.TestAllExtensionsLite; +import com.google.protobuf.UnittestLite.TestNestedExtensionLite; + +import junit.framework.TestCase; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +/** + * Test lite runtime. + * + * @author kenton@google.com Kenton Varda + */ +public class LiteTest extends TestCase { + public void setUp() throws Exception { + // Test that nested extensions are initialized correctly even if the outer + // class has not been accessed directly. This was once a bug with lite + // messages. + // + // We put this in setUp() rather than in its own test method because we + // need to make sure it runs before any actual tests. + assertTrue(TestNestedExtensionLite.nestedExtension != null); + } + + public void testLite() throws Exception { + // Since lite messages are a subset of regular messages, we can mostly + // assume that the functionality of lite messages is already thoroughly + // tested by the regular tests. All this test really verifies is that + // a proto with optimize_for = LITE_RUNTIME compiles correctly when + // linked only against the lite library. That is all tested at compile + // time, leaving not much to do in this method. Let's just do some random + // stuff to make sure the lite message is actually here and usable. + + TestAllTypesLite message = + TestAllTypesLite.newBuilder() + .setOptionalInt32(123) + .addRepeatedString("hello") + .setOptionalNestedMessage( + TestAllTypesLite.NestedMessage.newBuilder().setBb(7)) + .build(); + + ByteString data = message.toByteString(); + + TestAllTypesLite message2 = TestAllTypesLite.parseFrom(data); + + assertEquals(123, message2.getOptionalInt32()); + assertEquals(1, message2.getRepeatedStringCount()); + assertEquals("hello", message2.getRepeatedString(0)); + assertEquals(7, message2.getOptionalNestedMessage().getBb()); + } + + public void testLiteExtensions() throws Exception { + // TODO(kenton): Unlike other features of the lite library, extensions are + // implemented completely differently from the regular library. We + // should probably test them more thoroughly. + + TestAllExtensionsLite message = + TestAllExtensionsLite.newBuilder() + .setExtension(UnittestLite.optionalInt32ExtensionLite, 123) + .addExtension(UnittestLite.repeatedStringExtensionLite, "hello") + .setExtension(UnittestLite.optionalNestedEnumExtensionLite, + TestAllTypesLite.NestedEnum.BAZ) + .setExtension(UnittestLite.optionalNestedMessageExtensionLite, + TestAllTypesLite.NestedMessage.newBuilder().setBb(7).build()) + .build(); + + // Test copying a message, since coping extensions actually does use a + // different code path between lite and regular libraries, and as of this + // writing, parsing hasn't been implemented yet. + TestAllExtensionsLite message2 = message.toBuilder().build(); + + assertEquals(123, (int) message2.getExtension( + UnittestLite.optionalInt32ExtensionLite)); + assertEquals(1, message2.getExtensionCount( + UnittestLite.repeatedStringExtensionLite)); + assertEquals(1, message2.getExtension( + UnittestLite.repeatedStringExtensionLite).size()); + assertEquals("hello", message2.getExtension( + UnittestLite.repeatedStringExtensionLite, 0)); + assertEquals(TestAllTypesLite.NestedEnum.BAZ, message2.getExtension( + UnittestLite.optionalNestedEnumExtensionLite)); + assertEquals(7, message2.getExtension( + UnittestLite.optionalNestedMessageExtensionLite).getBb()); + } + + public void testSerialize() throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + TestAllTypesLite expected = + TestAllTypesLite.newBuilder() + .setOptionalInt32(123) + .addRepeatedString("hello") + .setOptionalNestedMessage( + TestAllTypesLite.NestedMessage.newBuilder().setBb(7)) + .build(); + ObjectOutputStream out = new ObjectOutputStream(baos); + try { + out.writeObject(expected); + } finally { + out.close(); + } + ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); + ObjectInputStream in = new ObjectInputStream(bais); + TestAllTypesLite actual = (TestAllTypesLite) in.readObject(); + assertEquals(expected.getOptionalInt32(), actual.getOptionalInt32()); + assertEquals(expected.getRepeatedStringCount(), + actual.getRepeatedStringCount()); + assertEquals(expected.getRepeatedString(0), + actual.getRepeatedString(0)); + assertEquals(expected.getOptionalNestedMessage().getBb(), + actual.getOptionalNestedMessage().getBb()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java new file mode 100644 index 000000000..c2f47eb2b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java @@ -0,0 +1,313 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestRequired; +import protobuf_unittest.UnittestProto.TestRequiredForeign; +import protobuf_unittest.UnittestProto.ForeignMessage; + +import junit.framework.TestCase; + +/** + * Misc. unit tests for message operations that apply to both generated + * and dynamic messages. + * + * @author kenton@google.com Kenton Varda + */ +public class MessageTest extends TestCase { + // ================================================================= + // Message-merging tests. + + static final TestAllTypes MERGE_SOURCE = + TestAllTypes.newBuilder() + .setOptionalInt32(1) + .setOptionalString("foo") + .setOptionalForeignMessage(ForeignMessage.getDefaultInstance()) + .addRepeatedString("bar") + .build(); + + static final TestAllTypes MERGE_DEST = + TestAllTypes.newBuilder() + .setOptionalInt64(2) + .setOptionalString("baz") + .setOptionalForeignMessage(ForeignMessage.newBuilder().setC(3).build()) + .addRepeatedString("qux") + .build(); + + static final String MERGE_RESULT_TEXT = + "optional_int32: 1\n" + + "optional_int64: 2\n" + + "optional_string: \"foo\"\n" + + "optional_foreign_message {\n" + + " c: 3\n" + + "}\n" + + "repeated_string: \"qux\"\n" + + "repeated_string: \"bar\"\n"; + + public void testMergeFrom() throws Exception { + TestAllTypes result = + TestAllTypes.newBuilder(MERGE_DEST) + .mergeFrom(MERGE_SOURCE).build(); + + assertEquals(MERGE_RESULT_TEXT, result.toString()); + } + + /** + * Test merging a DynamicMessage into a GeneratedMessage. As long as they + * have the same descriptor, this should work, but it is an entirely different + * code path. + */ + public void testMergeFromDynamic() throws Exception { + TestAllTypes result = + TestAllTypes.newBuilder(MERGE_DEST) + .mergeFrom(DynamicMessage.newBuilder(MERGE_SOURCE).build()) + .build(); + + assertEquals(MERGE_RESULT_TEXT, result.toString()); + } + + /** Test merging two DynamicMessages. */ + public void testDynamicMergeFrom() throws Exception { + DynamicMessage result = + DynamicMessage.newBuilder(MERGE_DEST) + .mergeFrom(DynamicMessage.newBuilder(MERGE_SOURCE).build()) + .build(); + + assertEquals(MERGE_RESULT_TEXT, result.toString()); + } + + // ================================================================= + // Required-field-related tests. + + private static final TestRequired TEST_REQUIRED_UNINITIALIZED = + TestRequired.getDefaultInstance(); + private static final TestRequired TEST_REQUIRED_INITIALIZED = + TestRequired.newBuilder().setA(1).setB(2).setC(3).build(); + + public void testRequired() throws Exception { + TestRequired.Builder builder = TestRequired.newBuilder(); + + assertFalse(builder.isInitialized()); + builder.setA(1); + assertFalse(builder.isInitialized()); + builder.setB(1); + assertFalse(builder.isInitialized()); + builder.setC(1); + assertTrue(builder.isInitialized()); + } + + public void testRequiredForeign() throws Exception { + TestRequiredForeign.Builder builder = TestRequiredForeign.newBuilder(); + + assertTrue(builder.isInitialized()); + + builder.setOptionalMessage(TEST_REQUIRED_UNINITIALIZED); + assertFalse(builder.isInitialized()); + + builder.setOptionalMessage(TEST_REQUIRED_INITIALIZED); + assertTrue(builder.isInitialized()); + + builder.addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED); + assertFalse(builder.isInitialized()); + + builder.setRepeatedMessage(0, TEST_REQUIRED_INITIALIZED); + assertTrue(builder.isInitialized()); + } + + public void testRequiredExtension() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + + assertTrue(builder.isInitialized()); + + builder.setExtension(TestRequired.single, TEST_REQUIRED_UNINITIALIZED); + assertFalse(builder.isInitialized()); + + builder.setExtension(TestRequired.single, TEST_REQUIRED_INITIALIZED); + assertTrue(builder.isInitialized()); + + builder.addExtension(TestRequired.multi, TEST_REQUIRED_UNINITIALIZED); + assertFalse(builder.isInitialized()); + + builder.setExtension(TestRequired.multi, 0, TEST_REQUIRED_INITIALIZED); + assertTrue(builder.isInitialized()); + } + + public void testRequiredDynamic() throws Exception { + Descriptors.Descriptor descriptor = TestRequired.getDescriptor(); + DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor); + + assertFalse(builder.isInitialized()); + builder.setField(descriptor.findFieldByName("a"), 1); + assertFalse(builder.isInitialized()); + builder.setField(descriptor.findFieldByName("b"), 1); + assertFalse(builder.isInitialized()); + builder.setField(descriptor.findFieldByName("c"), 1); + assertTrue(builder.isInitialized()); + } + + public void testRequiredDynamicForeign() throws Exception { + Descriptors.Descriptor descriptor = TestRequiredForeign.getDescriptor(); + DynamicMessage.Builder builder = DynamicMessage.newBuilder(descriptor); + + assertTrue(builder.isInitialized()); + + builder.setField(descriptor.findFieldByName("optional_message"), + TEST_REQUIRED_UNINITIALIZED); + assertFalse(builder.isInitialized()); + + builder.setField(descriptor.findFieldByName("optional_message"), + TEST_REQUIRED_INITIALIZED); + assertTrue(builder.isInitialized()); + + builder.addRepeatedField(descriptor.findFieldByName("repeated_message"), + TEST_REQUIRED_UNINITIALIZED); + assertFalse(builder.isInitialized()); + + builder.setRepeatedField(descriptor.findFieldByName("repeated_message"), 0, + TEST_REQUIRED_INITIALIZED); + assertTrue(builder.isInitialized()); + } + + public void testUninitializedException() throws Exception { + try { + TestRequired.newBuilder().build(); + fail("Should have thrown an exception."); + } catch (UninitializedMessageException e) { + assertEquals("Message missing required fields: a, b, c", e.getMessage()); + } + } + + public void testBuildPartial() throws Exception { + // We're mostly testing that no exception is thrown. + TestRequired message = TestRequired.newBuilder().buildPartial(); + assertFalse(message.isInitialized()); + } + + public void testNestedUninitializedException() throws Exception { + try { + TestRequiredForeign.newBuilder() + .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED) + .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED) + .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED) + .build(); + fail("Should have thrown an exception."); + } catch (UninitializedMessageException e) { + assertEquals( + "Message missing required fields: " + + "optional_message.a, " + + "optional_message.b, " + + "optional_message.c, " + + "repeated_message[0].a, " + + "repeated_message[0].b, " + + "repeated_message[0].c, " + + "repeated_message[1].a, " + + "repeated_message[1].b, " + + "repeated_message[1].c", + e.getMessage()); + } + } + + public void testBuildNestedPartial() throws Exception { + // We're mostly testing that no exception is thrown. + TestRequiredForeign message = + TestRequiredForeign.newBuilder() + .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED) + .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED) + .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED) + .buildPartial(); + assertFalse(message.isInitialized()); + } + + public void testParseUnititialized() throws Exception { + try { + TestRequired.parseFrom(ByteString.EMPTY); + fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + assertEquals("Message missing required fields: a, b, c", e.getMessage()); + } + } + + public void testParseNestedUnititialized() throws Exception { + ByteString data = + TestRequiredForeign.newBuilder() + .setOptionalMessage(TEST_REQUIRED_UNINITIALIZED) + .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED) + .addRepeatedMessage(TEST_REQUIRED_UNINITIALIZED) + .buildPartial().toByteString(); + + try { + TestRequiredForeign.parseFrom(data); + fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + assertEquals( + "Message missing required fields: " + + "optional_message.a, " + + "optional_message.b, " + + "optional_message.c, " + + "repeated_message[0].a, " + + "repeated_message[0].b, " + + "repeated_message[0].c, " + + "repeated_message[1].a, " + + "repeated_message[1].b, " + + "repeated_message[1].c", + e.getMessage()); + } + } + + public void testDynamicUninitializedException() throws Exception { + try { + DynamicMessage.newBuilder(TestRequired.getDescriptor()).build(); + fail("Should have thrown an exception."); + } catch (UninitializedMessageException e) { + assertEquals("Message missing required fields: a, b, c", e.getMessage()); + } + } + + public void testDynamicBuildPartial() throws Exception { + // We're mostly testing that no exception is thrown. + DynamicMessage message = + DynamicMessage.newBuilder(TestRequired.getDescriptor()) + .buildPartial(); + assertFalse(message.isInitialized()); + } + + public void testDynamicParseUnititialized() throws Exception { + try { + Descriptors.Descriptor descriptor = TestRequired.getDescriptor(); + DynamicMessage.parseFrom(descriptor, ByteString.EMPTY); + fail("Should have thrown an exception."); + } catch (InvalidProtocolBufferException e) { + assertEquals("Message missing required fields: a, b, c", e.getMessage()); + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java new file mode 100644 index 000000000..f53758015 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java @@ -0,0 +1,185 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.Vehicle; +import protobuf_unittest.Wheel; + +import junit.framework.TestCase; + +import java.util.List; +import java.util.ArrayList; + +/** + * Test cases that exercise end-to-end use cases involving + * {@link SingleFieldBuilder} and {@link RepeatedFieldBuilder}. + * + * @author jonp@google.com (Jon Perlow) + */ +public class NestedBuildersTest extends TestCase { + + public void testMessagesAndBuilders() { + Vehicle.Builder vehicleBuilder = Vehicle.newBuilder(); + vehicleBuilder.addWheelBuilder() + .setRadius(4) + .setWidth(1); + vehicleBuilder.addWheelBuilder() + .setRadius(4) + .setWidth(2); + vehicleBuilder.addWheelBuilder() + .setRadius(4) + .setWidth(3); + vehicleBuilder.addWheelBuilder() + .setRadius(4) + .setWidth(4); + vehicleBuilder.getEngineBuilder() + .setLiters(10); + + Vehicle vehicle = vehicleBuilder.build(); + assertEquals(4, vehicle.getWheelCount()); + for (int i = 0; i < 4; i++) { + Wheel wheel = vehicle.getWheel(i); + assertEquals(4, wheel.getRadius()); + assertEquals(i + 1, wheel.getWidth()); + } + assertEquals(10, vehicle.getEngine().getLiters()); + + for (int i = 0; i < 4; i++) { + vehicleBuilder.getWheelBuilder(i) + .setRadius(5) + .setWidth(i + 10); + } + vehicleBuilder.getEngineBuilder().setLiters(20); + + vehicle = vehicleBuilder.build(); + for (int i = 0; i < 4; i++) { + Wheel wheel = vehicle.getWheel(i); + assertEquals(5, wheel.getRadius()); + assertEquals(i + 10, wheel.getWidth()); + } + assertEquals(20, vehicle.getEngine().getLiters()); + assertTrue(vehicle.hasEngine()); + } + + public void testMessagesAreCached() { + Vehicle.Builder vehicleBuilder = Vehicle.newBuilder(); + vehicleBuilder.addWheelBuilder() + .setRadius(1) + .setWidth(2); + vehicleBuilder.addWheelBuilder() + .setRadius(3) + .setWidth(4); + vehicleBuilder.addWheelBuilder() + .setRadius(5) + .setWidth(6); + vehicleBuilder.addWheelBuilder() + .setRadius(7) + .setWidth(8); + + // Make sure messages are cached. + List wheels = new ArrayList(vehicleBuilder.getWheelList()); + for (int i = 0; i < wheels.size(); i++) { + assertSame(wheels.get(i), vehicleBuilder.getWheel(i)); + } + + // Now get builders and check they didn't change. + for (int i = 0; i < wheels.size(); i++) { + vehicleBuilder.getWheel(i); + } + for (int i = 0; i < wheels.size(); i++) { + assertSame(wheels.get(i), vehicleBuilder.getWheel(i)); + } + + // Change just one + vehicleBuilder.getWheelBuilder(3) + .setRadius(20).setWidth(20); + + // Now get wheels and check that only that one changed + for (int i = 0; i < wheels.size(); i++) { + if (i < 3) { + assertSame(wheels.get(i), vehicleBuilder.getWheel(i)); + } else { + assertNotSame(wheels.get(i), vehicleBuilder.getWheel(i)); + } + } + } + + public void testRemove_WithNestedBuilders() { + Vehicle.Builder vehicleBuilder = Vehicle.newBuilder(); + vehicleBuilder.addWheelBuilder() + .setRadius(1) + .setWidth(1); + vehicleBuilder.addWheelBuilder() + .setRadius(2) + .setWidth(2); + vehicleBuilder.removeWheel(0); + + assertEquals(1, vehicleBuilder.getWheelCount()); + assertEquals(2, vehicleBuilder.getWheel(0).getRadius()); + } + + public void testRemove_WithNestedMessages() { + Vehicle.Builder vehicleBuilder = Vehicle.newBuilder(); + vehicleBuilder.addWheel(Wheel.newBuilder() + .setRadius(1) + .setWidth(1)); + vehicleBuilder.addWheel(Wheel.newBuilder() + .setRadius(2) + .setWidth(2)); + vehicleBuilder.removeWheel(0); + + assertEquals(1, vehicleBuilder.getWheelCount()); + assertEquals(2, vehicleBuilder.getWheel(0).getRadius()); + } + + public void testMerge() { + Vehicle vehicle1 = Vehicle.newBuilder() + .addWheel(Wheel.newBuilder().setRadius(1).build()) + .addWheel(Wheel.newBuilder().setRadius(2).build()) + .build(); + + Vehicle vehicle2 = Vehicle.newBuilder() + .mergeFrom(vehicle1) + .build(); + // List should be the same -- no allocation + assertSame(vehicle1.getWheelList(), vehicle2.getWheelList()); + + Vehicle vehicle3 = vehicle1.toBuilder().build(); + assertSame(vehicle1.getWheelList(), vehicle3.getWheelList()); + } + + public void testGettingBuilderMarksFieldAsHaving() { + Vehicle.Builder vehicleBuilder = Vehicle.newBuilder(); + vehicleBuilder.getEngineBuilder(); + Vehicle vehicle = vehicleBuilder.buildPartial(); + assertTrue(vehicle.hasEngine()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java new file mode 100644 index 000000000..cdcdcb250 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java @@ -0,0 +1,190 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; + +import junit.framework.TestCase; + +import java.util.Collections; +import java.util.List; + +/** + * Tests for {@link RepeatedFieldBuilder}. This tests basic functionality. + * More extensive testing is provided via other tests that exercise the + * builder. + * + * @author jonp@google.com (Jon Perlow) + */ +public class RepeatedFieldBuilderTest extends TestCase { + + public void testBasicUse() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + RepeatedFieldBuilder builder = newRepeatedFieldBuilder(mockParent); + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); + assertEquals(0, builder.getMessage(0).getOptionalInt32()); + assertEquals(1, builder.getMessage(1).getOptionalInt32()); + + List list = builder.build(); + assertEquals(2, list.size()); + assertEquals(0, list.get(0).getOptionalInt32()); + assertEquals(1, list.get(1).getOptionalInt32()); + assertIsUnmodifiable(list); + + // Make sure it doesn't change. + List list2 = builder.build(); + assertSame(list, list2); + assertEquals(0, mockParent.getInvalidationCount()); + } + + public void testGoingBackAndForth() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + RepeatedFieldBuilder builder = newRepeatedFieldBuilder(mockParent); + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); + assertEquals(0, builder.getMessage(0).getOptionalInt32()); + assertEquals(1, builder.getMessage(1).getOptionalInt32()); + + // Convert to list + List list = builder.build(); + assertEquals(2, list.size()); + assertEquals(0, list.get(0).getOptionalInt32()); + assertEquals(1, list.get(1).getOptionalInt32()); + assertIsUnmodifiable(list); + + // Update 0th item + assertEquals(0, mockParent.getInvalidationCount()); + builder.getBuilder(0).setOptionalString("foo"); + assertEquals(1, mockParent.getInvalidationCount()); + list = builder.build(); + assertEquals(2, list.size()); + assertEquals(0, list.get(0).getOptionalInt32()); + assertEquals("foo", list.get(0).getOptionalString()); + assertEquals(1, list.get(1).getOptionalInt32()); + assertIsUnmodifiable(list); + assertEquals(1, mockParent.getInvalidationCount()); + } + + public void testVariousMethods() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + RepeatedFieldBuilder builder = newRepeatedFieldBuilder(mockParent); + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(2).build()); + builder.addBuilder(0, TestAllTypes.getDefaultInstance()) + .setOptionalInt32(0); + builder.addBuilder(TestAllTypes.getDefaultInstance()).setOptionalInt32(3); + + assertEquals(0, builder.getMessage(0).getOptionalInt32()); + assertEquals(1, builder.getMessage(1).getOptionalInt32()); + assertEquals(2, builder.getMessage(2).getOptionalInt32()); + assertEquals(3, builder.getMessage(3).getOptionalInt32()); + + assertEquals(0, mockParent.getInvalidationCount()); + List messages = builder.build(); + assertEquals(4, messages.size()); + assertSame(messages, builder.build()); // expect same list + + // Remove a message. + builder.remove(2); + assertEquals(1, mockParent.getInvalidationCount()); + assertEquals(3, builder.getCount()); + assertEquals(0, builder.getMessage(0).getOptionalInt32()); + assertEquals(1, builder.getMessage(1).getOptionalInt32()); + assertEquals(3, builder.getMessage(2).getOptionalInt32()); + + // Remove a builder. + builder.remove(0); + assertEquals(1, mockParent.getInvalidationCount()); + assertEquals(2, builder.getCount()); + assertEquals(1, builder.getMessage(0).getOptionalInt32()); + assertEquals(3, builder.getMessage(1).getOptionalInt32()); + + // Test clear. + builder.clear(); + assertEquals(1, mockParent.getInvalidationCount()); + assertEquals(0, builder.getCount()); + assertTrue(builder.isEmpty()); + } + + public void testLists() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + RepeatedFieldBuilder builder = newRepeatedFieldBuilder(mockParent); + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(1).build()); + builder.addMessage(0, + TestAllTypes.newBuilder().setOptionalInt32(0).build()); + assertEquals(0, builder.getMessage(0).getOptionalInt32()); + assertEquals(1, builder.getMessage(1).getOptionalInt32()); + + // Use list of builders. + List builders = builder.getBuilderList(); + assertEquals(0, builders.get(0).getOptionalInt32()); + assertEquals(1, builders.get(1).getOptionalInt32()); + builders.get(0).setOptionalInt32(10); + builders.get(1).setOptionalInt32(11); + + // Use list of protos + List protos = builder.getMessageList(); + assertEquals(10, protos.get(0).getOptionalInt32()); + assertEquals(11, protos.get(1).getOptionalInt32()); + + // Add an item to the builders and verify it's updated in both + builder.addMessage(TestAllTypes.newBuilder().setOptionalInt32(12).build()); + assertEquals(3, builders.size()); + assertEquals(3, protos.size()); + } + + private void assertIsUnmodifiable(List list) { + if (list == Collections.emptyList()) { + // OKAY -- Need to check this b/c EmptyList allows you to call clear. + } else { + try { + list.clear(); + fail("List wasn't immutable"); + } catch (UnsupportedOperationException e) { + // good + } + } + } + + private RepeatedFieldBuilder + newRepeatedFieldBuilder(GeneratedMessage.BuilderParent parent) { + return new RepeatedFieldBuilder(Collections.emptyList(), false, + parent, false); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java new file mode 100644 index 000000000..4be84f5b1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java @@ -0,0 +1,320 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.FileDescriptor; +import com.google.protobuf.Descriptors.MethodDescriptor; +import google.protobuf.no_generic_services_test.UnittestNoGenericServices; +import protobuf_unittest.MessageWithNoOuter; +import protobuf_unittest.ServiceWithNoOuter; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestService; +import protobuf_unittest.UnittestProto.FooRequest; +import protobuf_unittest.UnittestProto.FooResponse; +import protobuf_unittest.UnittestProto.BarRequest; +import protobuf_unittest.UnittestProto.BarResponse; + +import org.easymock.classextension.EasyMock; +import org.easymock.classextension.IMocksControl; +import org.easymock.IArgumentMatcher; + +import java.util.HashSet; +import java.util.Set; + +import junit.framework.TestCase; + +/** + * Tests services and stubs. + * + * @author kenton@google.com Kenton Varda + */ +public class ServiceTest extends TestCase { + private IMocksControl control; + private RpcController mockController; + + private final Descriptors.MethodDescriptor fooDescriptor = + TestService.getDescriptor().getMethods().get(0); + private final Descriptors.MethodDescriptor barDescriptor = + TestService.getDescriptor().getMethods().get(1); + + @Override + protected void setUp() throws Exception { + super.setUp(); + control = EasyMock.createStrictControl(); + mockController = control.createMock(RpcController.class); + } + + // ================================================================= + + /** Tests Service.callMethod(). */ + public void testCallMethod() throws Exception { + FooRequest fooRequest = FooRequest.newBuilder().build(); + BarRequest barRequest = BarRequest.newBuilder().build(); + MockCallback fooCallback = new MockCallback(); + MockCallback barCallback = new MockCallback(); + TestService mockService = control.createMock(TestService.class); + + mockService.foo(EasyMock.same(mockController), EasyMock.same(fooRequest), + this.wrapsCallback(fooCallback)); + mockService.bar(EasyMock.same(mockController), EasyMock.same(barRequest), + this.wrapsCallback(barCallback)); + control.replay(); + + mockService.callMethod(fooDescriptor, mockController, + fooRequest, fooCallback); + mockService.callMethod(barDescriptor, mockController, + barRequest, barCallback); + control.verify(); + } + + /** Tests Service.get{Request,Response}Prototype(). */ + public void testGetPrototype() throws Exception { + TestService mockService = control.createMock(TestService.class); + + assertSame(mockService.getRequestPrototype(fooDescriptor), + FooRequest.getDefaultInstance()); + assertSame(mockService.getResponsePrototype(fooDescriptor), + FooResponse.getDefaultInstance()); + assertSame(mockService.getRequestPrototype(barDescriptor), + BarRequest.getDefaultInstance()); + assertSame(mockService.getResponsePrototype(barDescriptor), + BarResponse.getDefaultInstance()); + } + + /** Tests generated stubs. */ + public void testStub() throws Exception { + FooRequest fooRequest = FooRequest.newBuilder().build(); + BarRequest barRequest = BarRequest.newBuilder().build(); + MockCallback fooCallback = new MockCallback(); + MockCallback barCallback = new MockCallback(); + RpcChannel mockChannel = control.createMock(RpcChannel.class); + TestService stub = TestService.newStub(mockChannel); + + mockChannel.callMethod( + EasyMock.same(fooDescriptor), + EasyMock.same(mockController), + EasyMock.same(fooRequest), + EasyMock.same(FooResponse.getDefaultInstance()), + this.wrapsCallback(fooCallback)); + mockChannel.callMethod( + EasyMock.same(barDescriptor), + EasyMock.same(mockController), + EasyMock.same(barRequest), + EasyMock.same(BarResponse.getDefaultInstance()), + this.wrapsCallback(barCallback)); + control.replay(); + + stub.foo(mockController, fooRequest, fooCallback); + stub.bar(mockController, barRequest, barCallback); + control.verify(); + } + + /** Tests generated blocking stubs. */ + public void testBlockingStub() throws Exception { + FooRequest fooRequest = FooRequest.newBuilder().build(); + BarRequest barRequest = BarRequest.newBuilder().build(); + BlockingRpcChannel mockChannel = + control.createMock(BlockingRpcChannel.class); + TestService.BlockingInterface stub = + TestService.newBlockingStub(mockChannel); + + FooResponse fooResponse = FooResponse.newBuilder().build(); + BarResponse barResponse = BarResponse.newBuilder().build(); + + EasyMock.expect(mockChannel.callBlockingMethod( + EasyMock.same(fooDescriptor), + EasyMock.same(mockController), + EasyMock.same(fooRequest), + EasyMock.same(FooResponse.getDefaultInstance()))).andReturn(fooResponse); + EasyMock.expect(mockChannel.callBlockingMethod( + EasyMock.same(barDescriptor), + EasyMock.same(mockController), + EasyMock.same(barRequest), + EasyMock.same(BarResponse.getDefaultInstance()))).andReturn(barResponse); + control.replay(); + + assertSame(fooResponse, stub.foo(mockController, fooRequest)); + assertSame(barResponse, stub.bar(mockController, barRequest)); + control.verify(); + } + + public void testNewReflectiveService() { + ServiceWithNoOuter.Interface impl = + control.createMock(ServiceWithNoOuter.Interface.class); + RpcController controller = control.createMock(RpcController.class); + Service service = ServiceWithNoOuter.newReflectiveService(impl); + + MethodDescriptor fooMethod = + ServiceWithNoOuter.getDescriptor().findMethodByName("Foo"); + MessageWithNoOuter request = MessageWithNoOuter.getDefaultInstance(); + RpcCallback callback = new RpcCallback() { + public void run(Message parameter) { + // No reason this should be run. + fail(); + } + }; + RpcCallback specializedCallback = + RpcUtil.specializeCallback(callback); + + impl.foo(EasyMock.same(controller), EasyMock.same(request), + EasyMock.same(specializedCallback)); + EasyMock.expectLastCall(); + + control.replay(); + + service.callMethod(fooMethod, controller, request, callback); + + control.verify(); + } + + public void testNewReflectiveBlockingService() throws ServiceException { + ServiceWithNoOuter.BlockingInterface impl = + control.createMock(ServiceWithNoOuter.BlockingInterface.class); + RpcController controller = control.createMock(RpcController.class); + BlockingService service = + ServiceWithNoOuter.newReflectiveBlockingService(impl); + + MethodDescriptor fooMethod = + ServiceWithNoOuter.getDescriptor().findMethodByName("Foo"); + MessageWithNoOuter request = MessageWithNoOuter.getDefaultInstance(); + + TestAllTypes expectedResponse = TestAllTypes.getDefaultInstance(); + EasyMock.expect(impl.foo(EasyMock.same(controller), EasyMock.same(request))) + .andReturn(expectedResponse); + + control.replay(); + + Message response = + service.callBlockingMethod(fooMethod, controller, request); + assertEquals(expectedResponse, response); + + control.verify(); + } + + public void testNoGenericServices() throws Exception { + // Non-services should be usable. + UnittestNoGenericServices.TestMessage message = + UnittestNoGenericServices.TestMessage.newBuilder() + .setA(123) + .setExtension(UnittestNoGenericServices.testExtension, 456) + .build(); + assertEquals(123, message.getA()); + assertEquals(1, UnittestNoGenericServices.TestEnum.FOO.getNumber()); + + // Build a list of the class names nested in UnittestNoGenericServices. + String outerName = "google.protobuf.no_generic_services_test." + + "UnittestNoGenericServices"; + Class outerClass = Class.forName(outerName); + + Set innerClassNames = new HashSet(); + for (Class innerClass : outerClass.getClasses()) { + String fullName = innerClass.getName(); + // Figure out the unqualified name of the inner class. + // Note: Surprisingly, the full name of an inner class will be separated + // from the outer class name by a '$' rather than a '.'. This is not + // mentioned in the documentation for java.lang.Class. I don't want to + // make assumptions, so I'm just going to accept any character as the + // separator. + assertTrue(fullName.startsWith(outerName)); + + if (!Service.class.isAssignableFrom(innerClass) && + !Message.class.isAssignableFrom(innerClass) && + !ProtocolMessageEnum.class.isAssignableFrom(innerClass)) { + // Ignore any classes not generated by the base code generator. + continue; + } + + innerClassNames.add(fullName.substring(outerName.length() + 1)); + } + + // No service class should have been generated. + assertTrue(innerClassNames.contains("TestMessage")); + assertTrue(innerClassNames.contains("TestEnum")); + assertFalse(innerClassNames.contains("TestService")); + + // But descriptors are there. + FileDescriptor file = UnittestNoGenericServices.getDescriptor(); + assertEquals(1, file.getServices().size()); + assertEquals("TestService", file.getServices().get(0).getName()); + assertEquals(1, file.getServices().get(0).getMethods().size()); + assertEquals("Foo", + file.getServices().get(0).getMethods().get(0).getName()); + } + + // ================================================================= + + /** + * wrapsCallback() is an EasyMock argument predicate. wrapsCallback(c) + * matches a callback if calling that callback causes c to be called. + * In other words, c wraps the given callback. + */ + private RpcCallback wrapsCallback( + MockCallback callback) { + EasyMock.reportMatcher(new WrapsCallback(callback)); + return null; + } + + /** The parameter to wrapsCallback() must be a MockCallback. */ + private static class MockCallback + implements RpcCallback { + private boolean called = false; + + public boolean isCalled() { return called; } + + public void reset() { called = false; } + public void run(Type message) { called = true; } + } + + /** Implementation of the wrapsCallback() argument matcher. */ + private static class WrapsCallback implements IArgumentMatcher { + private MockCallback callback; + + public WrapsCallback(MockCallback callback) { + this.callback = callback; + } + + @SuppressWarnings("unchecked") + public boolean matches(Object actual) { + if (!(actual instanceof RpcCallback)) { + return false; + } + RpcCallback actualCallback = (RpcCallback)actual; + + callback.reset(); + actualCallback.run(null); + return callback.isCalled(); + } + + public void appendTo(StringBuffer buffer) { + buffer.append("wrapsCallback(mockCallback)"); + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java new file mode 100644 index 000000000..5c2f7e752 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java @@ -0,0 +1,155 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; + +import junit.framework.TestCase; + +/** + * Tests for {@link SingleFieldBuilder}. This tests basic functionality. + * More extensive testing is provided via other tests that exercise the + * builder. + * + * @author jonp@google.com (Jon Perlow) + */ +public class SingleFieldBuilderTest extends TestCase { + + public void testBasicUseAndInvalidations() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + SingleFieldBuilder builder = + new SingleFieldBuilder( + TestAllTypes.getDefaultInstance(), + mockParent, + false); + assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); + assertEquals(TestAllTypes.getDefaultInstance(), + builder.getBuilder().buildPartial()); + assertEquals(0, mockParent.getInvalidationCount()); + + builder.getBuilder().setOptionalInt32(10); + assertEquals(0, mockParent.getInvalidationCount()); + TestAllTypes message = builder.build(); + assertEquals(10, message.getOptionalInt32()); + + // Test that we receive invalidations now that build has been called. + assertEquals(0, mockParent.getInvalidationCount()); + builder.getBuilder().setOptionalInt32(20); + assertEquals(1, mockParent.getInvalidationCount()); + + // Test that we don't keep getting invalidations on every change + builder.getBuilder().setOptionalInt32(30); + assertEquals(1, mockParent.getInvalidationCount()); + + } + + public void testSetMessage() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + SingleFieldBuilder builder = + new SingleFieldBuilder( + TestAllTypes.getDefaultInstance(), + mockParent, + false); + builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); + assertEquals(0, builder.getMessage().getOptionalInt32()); + + // Update message using the builder + builder.getBuilder().setOptionalInt32(1); + assertEquals(0, mockParent.getInvalidationCount()); + assertEquals(1, builder.getBuilder().getOptionalInt32()); + assertEquals(1, builder.getMessage().getOptionalInt32()); + builder.build(); + builder.getBuilder().setOptionalInt32(2); + assertEquals(2, builder.getBuilder().getOptionalInt32()); + assertEquals(2, builder.getMessage().getOptionalInt32()); + + // Make sure message stays cached + assertSame(builder.getMessage(), builder.getMessage()); + } + + public void testClear() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + SingleFieldBuilder builder = + new SingleFieldBuilder( + TestAllTypes.getDefaultInstance(), + mockParent, + false); + builder.setMessage(TestAllTypes.newBuilder().setOptionalInt32(0).build()); + assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); + builder.clear(); + assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); + + builder.getBuilder().setOptionalInt32(1); + assertNotSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); + builder.clear(); + assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); + } + + public void testMerge() { + TestUtil.MockBuilderParent mockParent = new TestUtil.MockBuilderParent(); + SingleFieldBuilder builder = + new SingleFieldBuilder( + TestAllTypes.getDefaultInstance(), + mockParent, + false); + + // Merge into default field. + builder.mergeFrom(TestAllTypes.getDefaultInstance()); + assertSame(TestAllTypes.getDefaultInstance(), builder.getMessage()); + + // Merge into non-default field on existing builder. + builder.getBuilder().setOptionalInt32(2); + builder.mergeFrom(TestAllTypes.newBuilder() + .setOptionalDouble(4.0) + .buildPartial()); + assertEquals(2, builder.getMessage().getOptionalInt32()); + assertEquals(4.0, builder.getMessage().getOptionalDouble()); + + // Merge into non-default field on existing message + builder.setMessage(TestAllTypes.newBuilder() + .setOptionalInt32(10) + .buildPartial()); + builder.mergeFrom(TestAllTypes.newBuilder() + .setOptionalDouble(5.0) + .buildPartial()); + assertEquals(10, builder.getMessage().getOptionalInt32()); + assertEquals(5.0, builder.getMessage().getOptionalDouble()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java new file mode 100644 index 000000000..8f77a036c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java @@ -0,0 +1,420 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import junit.framework.TestCase; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +/** + * @author darick@google.com Darick Tong + */ +public class SmallSortedMapTest extends TestCase { + // java.util.AbstractMap.SimpleEntry is private in JDK 1.5. We re-implement it + // here for JDK 1.5 users. + private static class SimpleEntry implements Map.Entry { + private final K key; + private V value; + + SimpleEntry(K key, V value) { + this.key = key; + this.value = value; + } + + public K getKey() { + return key; + } + + public V getValue() { + return value; + } + + public V setValue(V value) { + V oldValue = this.value; + this.value = value; + return oldValue; + } + + private static boolean eq(Object o1, Object o2) { + return o1 == null ? o2 == null : o1.equals(o2); + } + + @Override + public boolean equals(Object o) { + if (!(o instanceof Map.Entry)) + return false; + Map.Entry e = (Map.Entry) o; + return eq(key, e.getKey()) && eq(value, e.getValue()); + } + + @Override + public int hashCode() { + return ((key == null) ? 0 : key.hashCode()) ^ + ((value == null) ? 0 : value.hashCode()); + } + } + + public void testPutAndGetArrayEntriesOnly() { + runPutAndGetTest(3); + } + + public void testPutAndGetOverflowEntries() { + runPutAndGetTest(6); + } + + private void runPutAndGetTest(int numElements) { + // Test with even and odd arraySize + SmallSortedMap map1 = + SmallSortedMap.newInstanceForTest(3); + SmallSortedMap map2 = + SmallSortedMap.newInstanceForTest(4); + SmallSortedMap map3 = + SmallSortedMap.newInstanceForTest(3); + SmallSortedMap map4 = + SmallSortedMap.newInstanceForTest(4); + + // Test with puts in ascending order. + for (int i = 0; i < numElements; i++) { + assertNull(map1.put(i, i + 1)); + assertNull(map2.put(i, i + 1)); + } + // Test with puts in descending order. + for (int i = numElements - 1; i >= 0; i--) { + assertNull(map3.put(i, i + 1)); + assertNull(map4.put(i, i + 1)); + } + + assertEquals(Math.min(3, numElements), map1.getNumArrayEntries()); + assertEquals(Math.min(4, numElements), map2.getNumArrayEntries()); + assertEquals(Math.min(3, numElements), map3.getNumArrayEntries()); + assertEquals(Math.min(4, numElements), map4.getNumArrayEntries()); + + List> allMaps = + new ArrayList>(); + allMaps.add(map1); + allMaps.add(map2); + allMaps.add(map3); + allMaps.add(map4); + + for (SmallSortedMap map : allMaps) { + assertEquals(numElements, map.size()); + for (int i = 0; i < numElements; i++) { + assertEquals(new Integer(i + 1), map.get(i)); + } + } + + assertEquals(map1, map2); + assertEquals(map2, map3); + assertEquals(map3, map4); + } + + public void testReplacingPut() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + assertNull(map.remove(i + 1)); + } + for (int i = 0; i < 6; i++) { + assertEquals(new Integer(i + 1), map.put(i, i + 2)); + } + } + + public void testRemove() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + assertNull(map.remove(i + 1)); + } + + assertEquals(3, map.getNumArrayEntries()); + assertEquals(3, map.getNumOverflowEntries()); + assertEquals(6, map.size()); + assertEquals(makeSortedKeySet(0, 1, 2, 3, 4, 5), map.keySet()); + + assertEquals(new Integer(2), map.remove(1)); + assertEquals(3, map.getNumArrayEntries()); + assertEquals(2, map.getNumOverflowEntries()); + assertEquals(5, map.size()); + assertEquals(makeSortedKeySet(0, 2, 3, 4, 5), map.keySet()); + + assertEquals(new Integer(5), map.remove(4)); + assertEquals(3, map.getNumArrayEntries()); + assertEquals(1, map.getNumOverflowEntries()); + assertEquals(4, map.size()); + assertEquals(makeSortedKeySet(0, 2, 3, 5), map.keySet()); + + assertEquals(new Integer(4), map.remove(3)); + assertEquals(3, map.getNumArrayEntries()); + assertEquals(0, map.getNumOverflowEntries()); + assertEquals(3, map.size()); + assertEquals(makeSortedKeySet(0, 2, 5), map.keySet()); + + assertNull(map.remove(3)); + assertEquals(3, map.getNumArrayEntries()); + assertEquals(0, map.getNumOverflowEntries()); + assertEquals(3, map.size()); + + assertEquals(new Integer(1), map.remove(0)); + assertEquals(2, map.getNumArrayEntries()); + assertEquals(0, map.getNumOverflowEntries()); + assertEquals(2, map.size()); + } + + public void testClear() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + map.clear(); + assertEquals(0, map.getNumArrayEntries()); + assertEquals(0, map.getNumOverflowEntries()); + assertEquals(0, map.size()); + } + + public void testGetArrayEntryAndOverflowEntries() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + assertEquals(3, map.getNumArrayEntries()); + for (int i = 0; i < 3; i++) { + Map.Entry entry = map.getArrayEntryAt(i); + assertEquals(new Integer(i), entry.getKey()); + assertEquals(new Integer(i + 1), entry.getValue()); + } + Iterator> it = + map.getOverflowEntries().iterator(); + for (int i = 3; i < 6; i++) { + assertTrue(it.hasNext()); + Map.Entry entry = it.next(); + assertEquals(new Integer(i), entry.getKey()); + assertEquals(new Integer(i + 1), entry.getValue()); + } + assertFalse(it.hasNext()); + } + + public void testEntrySetContains() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + Set> entrySet = map.entrySet(); + for (int i = 0; i < 6; i++) { + assertTrue( + entrySet.contains(new SimpleEntry(i, i + 1))); + assertFalse( + entrySet.contains(new SimpleEntry(i, i))); + } + } + + public void testEntrySetAdd() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + Set> entrySet = map.entrySet(); + for (int i = 0; i < 6; i++) { + Map.Entry entry = + new SimpleEntry(i, i + 1); + assertTrue(entrySet.add(entry)); + assertFalse(entrySet.add(entry)); + } + for (int i = 0; i < 6; i++) { + assertEquals(new Integer(i + 1), map.get(i)); + } + assertEquals(3, map.getNumArrayEntries()); + assertEquals(3, map.getNumOverflowEntries()); + assertEquals(6, map.size()); + } + + public void testEntrySetRemove() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + Set> entrySet = map.entrySet(); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + for (int i = 0; i < 6; i++) { + Map.Entry entry = + new SimpleEntry(i, i + 1); + assertTrue(entrySet.remove(entry)); + assertFalse(entrySet.remove(entry)); + } + assertTrue(map.isEmpty()); + assertEquals(0, map.getNumArrayEntries()); + assertEquals(0, map.getNumOverflowEntries()); + assertEquals(0, map.size()); + } + + public void testEntrySetClear() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + map.entrySet().clear(); + assertTrue(map.isEmpty()); + assertEquals(0, map.getNumArrayEntries()); + assertEquals(0, map.getNumOverflowEntries()); + assertEquals(0, map.size()); + } + + public void testEntrySetIteratorNext() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + Iterator> it = map.entrySet().iterator(); + for (int i = 0; i < 6; i++) { + assertTrue(it.hasNext()); + Map.Entry entry = it.next(); + assertEquals(new Integer(i), entry.getKey()); + assertEquals(new Integer(i + 1), entry.getValue()); + } + assertFalse(it.hasNext()); + } + + public void testEntrySetIteratorRemove() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + Iterator> it = map.entrySet().iterator(); + for (int i = 0; i < 6; i++) { + assertTrue(map.containsKey(i)); + it.next(); + it.remove(); + assertFalse(map.containsKey(i)); + assertEquals(6 - i - 1, map.size()); + } + } + + public void testMapEntryModification() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + Iterator> it = map.entrySet().iterator(); + for (int i = 0; i < 6; i++) { + Map.Entry entry = it.next(); + entry.setValue(i + 23); + } + for (int i = 0; i < 6; i++) { + assertEquals(new Integer(i + 23), map.get(i)); + } + } + + public void testMakeImmutable() { + SmallSortedMap map = SmallSortedMap.newInstanceForTest(3); + for (int i = 0; i < 6; i++) { + assertNull(map.put(i, i + 1)); + } + map.makeImmutable(); + assertEquals(new Integer(1), map.get(0)); + assertEquals(6, map.size()); + + try { + map.put(23, 23); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + + Map other = new HashMap(); + other.put(23, 23); + try { + map.putAll(other); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + + try { + map.remove(0); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + + try { + map.clear(); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + + Set> entrySet = map.entrySet(); + try { + entrySet.clear(); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + + Iterator> it = entrySet.iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + try { + entry.setValue(0); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + try { + it.remove(); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + } + + Set keySet = map.keySet(); + try { + keySet.clear(); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + + Iterator keys = keySet.iterator(); + while (keys.hasNext()) { + Integer key = keys.next(); + try { + keySet.remove(key); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + try { + keys.remove(); + fail("Expected UnsupportedOperationException"); + } catch (UnsupportedOperationException expected) { + } + } + } + + private Set makeSortedKeySet(Integer... keys) { + return new TreeSet(Arrays.asList(keys)); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java new file mode 100644 index 000000000..6feec4e68 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java @@ -0,0 +1,49 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import junit.framework.TestCase; + +/** + * Tests that proto2 api generation doesn't cause compile errors when + * compiling protocol buffers that have names that would otherwise conflict + * if not fully qualified (like @Deprecated and @Override). + * + * @author jonp@google.com (Jon Perlow) + */ +public class TestBadIdentifiers extends TestCase { + + public void testCompilation() { + // If this compiles, it means the generation was correct. + TestBadIdentifiersProto.Deprecated.newBuilder(); + TestBadIdentifiersProto.Override.newBuilder(); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java new file mode 100644 index 000000000..9109f4191 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java @@ -0,0 +1,3811 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto; +import com.google.protobuf.UnittestLite; + +// The static imports are to avoid 100+ char lines. The following is roughly equivalent to +// import static protobuf_unittest.UnittestProto.*; +import static protobuf_unittest.UnittestProto.defaultInt32Extension; +import static protobuf_unittest.UnittestProto.defaultInt64Extension; +import static protobuf_unittest.UnittestProto.defaultUint32Extension; +import static protobuf_unittest.UnittestProto.defaultUint64Extension; +import static protobuf_unittest.UnittestProto.defaultSint32Extension; +import static protobuf_unittest.UnittestProto.defaultSint64Extension; +import static protobuf_unittest.UnittestProto.defaultFixed32Extension; +import static protobuf_unittest.UnittestProto.defaultFixed64Extension; +import static protobuf_unittest.UnittestProto.defaultSfixed32Extension; +import static protobuf_unittest.UnittestProto.defaultSfixed64Extension; +import static protobuf_unittest.UnittestProto.defaultFloatExtension; +import static protobuf_unittest.UnittestProto.defaultDoubleExtension; +import static protobuf_unittest.UnittestProto.defaultBoolExtension; +import static protobuf_unittest.UnittestProto.defaultStringExtension; +import static protobuf_unittest.UnittestProto.defaultBytesExtension; +import static protobuf_unittest.UnittestProto.defaultNestedEnumExtension; +import static protobuf_unittest.UnittestProto.defaultForeignEnumExtension; +import static protobuf_unittest.UnittestProto.defaultImportEnumExtension; +import static protobuf_unittest.UnittestProto.defaultStringPieceExtension; +import static protobuf_unittest.UnittestProto.defaultCordExtension; + +import static protobuf_unittest.UnittestProto.optionalInt32Extension; +import static protobuf_unittest.UnittestProto.optionalInt64Extension; +import static protobuf_unittest.UnittestProto.optionalUint32Extension; +import static protobuf_unittest.UnittestProto.optionalUint64Extension; +import static protobuf_unittest.UnittestProto.optionalSint32Extension; +import static protobuf_unittest.UnittestProto.optionalSint64Extension; +import static protobuf_unittest.UnittestProto.optionalFixed32Extension; +import static protobuf_unittest.UnittestProto.optionalFixed64Extension; +import static protobuf_unittest.UnittestProto.optionalSfixed32Extension; +import static protobuf_unittest.UnittestProto.optionalSfixed64Extension; +import static protobuf_unittest.UnittestProto.optionalFloatExtension; +import static protobuf_unittest.UnittestProto.optionalDoubleExtension; +import static protobuf_unittest.UnittestProto.optionalBoolExtension; +import static protobuf_unittest.UnittestProto.optionalStringExtension; +import static protobuf_unittest.UnittestProto.optionalBytesExtension; +import static protobuf_unittest.UnittestProto.optionalGroupExtension; +import static protobuf_unittest.UnittestProto.optionalNestedMessageExtension; +import static protobuf_unittest.UnittestProto.optionalForeignMessageExtension; +import static protobuf_unittest.UnittestProto.optionalImportMessageExtension; +import static protobuf_unittest.UnittestProto.optionalNestedEnumExtension; +import static protobuf_unittest.UnittestProto.optionalForeignEnumExtension; +import static protobuf_unittest.UnittestProto.optionalImportEnumExtension; +import static protobuf_unittest.UnittestProto.optionalStringPieceExtension; +import static protobuf_unittest.UnittestProto.optionalCordExtension; + +import static protobuf_unittest.UnittestProto.repeatedInt32Extension; +import static protobuf_unittest.UnittestProto.repeatedInt64Extension; +import static protobuf_unittest.UnittestProto.repeatedUint32Extension; +import static protobuf_unittest.UnittestProto.repeatedUint64Extension; +import static protobuf_unittest.UnittestProto.repeatedSint32Extension; +import static protobuf_unittest.UnittestProto.repeatedSint64Extension; +import static protobuf_unittest.UnittestProto.repeatedFixed32Extension; +import static protobuf_unittest.UnittestProto.repeatedFixed64Extension; +import static protobuf_unittest.UnittestProto.repeatedSfixed32Extension; +import static protobuf_unittest.UnittestProto.repeatedSfixed64Extension; +import static protobuf_unittest.UnittestProto.repeatedFloatExtension; +import static protobuf_unittest.UnittestProto.repeatedDoubleExtension; +import static protobuf_unittest.UnittestProto.repeatedBoolExtension; +import static protobuf_unittest.UnittestProto.repeatedStringExtension; +import static protobuf_unittest.UnittestProto.repeatedBytesExtension; +import static protobuf_unittest.UnittestProto.repeatedGroupExtension; +import static protobuf_unittest.UnittestProto.repeatedNestedMessageExtension; +import static protobuf_unittest.UnittestProto.repeatedForeignMessageExtension; +import static protobuf_unittest.UnittestProto.repeatedImportMessageExtension; +import static protobuf_unittest.UnittestProto.repeatedNestedEnumExtension; +import static protobuf_unittest.UnittestProto.repeatedForeignEnumExtension; +import static protobuf_unittest.UnittestProto.repeatedImportEnumExtension; +import static protobuf_unittest.UnittestProto.repeatedStringPieceExtension; +import static protobuf_unittest.UnittestProto.repeatedCordExtension; + +import static protobuf_unittest.UnittestProto.OptionalGroup_extension; +import static protobuf_unittest.UnittestProto.RepeatedGroup_extension; + +import static protobuf_unittest.UnittestProto.packedInt32Extension; +import static protobuf_unittest.UnittestProto.packedInt64Extension; +import static protobuf_unittest.UnittestProto.packedUint32Extension; +import static protobuf_unittest.UnittestProto.packedUint64Extension; +import static protobuf_unittest.UnittestProto.packedSint32Extension; +import static protobuf_unittest.UnittestProto.packedSint64Extension; +import static protobuf_unittest.UnittestProto.packedFixed32Extension; +import static protobuf_unittest.UnittestProto.packedFixed64Extension; +import static protobuf_unittest.UnittestProto.packedSfixed32Extension; +import static protobuf_unittest.UnittestProto.packedSfixed64Extension; +import static protobuf_unittest.UnittestProto.packedFloatExtension; +import static protobuf_unittest.UnittestProto.packedDoubleExtension; +import static protobuf_unittest.UnittestProto.packedBoolExtension; +import static protobuf_unittest.UnittestProto.packedEnumExtension; + +import static com.google.protobuf.UnittestLite.defaultInt32ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultInt64ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultUint32ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultUint64ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultSint32ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultSint64ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultFixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultFixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultSfixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultSfixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.defaultFloatExtensionLite; +import static com.google.protobuf.UnittestLite.defaultDoubleExtensionLite; +import static com.google.protobuf.UnittestLite.defaultBoolExtensionLite; +import static com.google.protobuf.UnittestLite.defaultStringExtensionLite; +import static com.google.protobuf.UnittestLite.defaultBytesExtensionLite; +import static com.google.protobuf.UnittestLite.defaultNestedEnumExtensionLite; +import static com.google.protobuf.UnittestLite.defaultForeignEnumExtensionLite; +import static com.google.protobuf.UnittestLite.defaultImportEnumExtensionLite; +import static com.google.protobuf.UnittestLite.defaultStringPieceExtensionLite; +import static com.google.protobuf.UnittestLite.defaultCordExtensionLite; + +import static com.google.protobuf.UnittestLite.optionalInt32ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalInt64ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalUint32ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalUint64ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalSint32ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalSint64ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalFixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalFixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalSfixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalSfixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.optionalFloatExtensionLite; +import static com.google.protobuf.UnittestLite.optionalDoubleExtensionLite; +import static com.google.protobuf.UnittestLite.optionalBoolExtensionLite; +import static com.google.protobuf.UnittestLite.optionalStringExtensionLite; +import static com.google.protobuf.UnittestLite.optionalBytesExtensionLite; +import static com.google.protobuf.UnittestLite.optionalGroupExtensionLite; +import static com.google.protobuf.UnittestLite.optionalNestedMessageExtensionLite; +import static com.google.protobuf.UnittestLite.optionalForeignMessageExtensionLite; +import static com.google.protobuf.UnittestLite.optionalImportMessageExtensionLite; +import static com.google.protobuf.UnittestLite.optionalNestedEnumExtensionLite; +import static com.google.protobuf.UnittestLite.optionalForeignEnumExtensionLite; +import static com.google.protobuf.UnittestLite.optionalImportEnumExtensionLite; +import static com.google.protobuf.UnittestLite.optionalStringPieceExtensionLite; +import static com.google.protobuf.UnittestLite.optionalCordExtensionLite; + +import static com.google.protobuf.UnittestLite.repeatedInt32ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedInt64ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedUint32ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedUint64ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedSint32ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedSint64ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedFixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedFixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedSfixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedSfixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedFloatExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedDoubleExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedBoolExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedStringExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedBytesExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedGroupExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedNestedMessageExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedForeignMessageExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedImportMessageExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedNestedEnumExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedForeignEnumExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedImportEnumExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedStringPieceExtensionLite; +import static com.google.protobuf.UnittestLite.repeatedCordExtensionLite; + +import static com.google.protobuf.UnittestLite.OptionalGroup_extension_lite; +import static com.google.protobuf.UnittestLite.RepeatedGroup_extension_lite; + +import static com.google.protobuf.UnittestLite.packedInt32ExtensionLite; +import static com.google.protobuf.UnittestLite.packedInt64ExtensionLite; +import static com.google.protobuf.UnittestLite.packedUint32ExtensionLite; +import static com.google.protobuf.UnittestLite.packedUint64ExtensionLite; +import static com.google.protobuf.UnittestLite.packedSint32ExtensionLite; +import static com.google.protobuf.UnittestLite.packedSint64ExtensionLite; +import static com.google.protobuf.UnittestLite.packedFixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.packedFixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.packedSfixed32ExtensionLite; +import static com.google.protobuf.UnittestLite.packedSfixed64ExtensionLite; +import static com.google.protobuf.UnittestLite.packedFloatExtensionLite; +import static com.google.protobuf.UnittestLite.packedDoubleExtensionLite; +import static com.google.protobuf.UnittestLite.packedBoolExtensionLite; +import static com.google.protobuf.UnittestLite.packedEnumExtensionLite; + +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestAllExtensionsOrBuilder; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllTypesOrBuilder; +import protobuf_unittest.UnittestProto.TestPackedExtensions; +import protobuf_unittest.UnittestProto.TestPackedTypes; +import protobuf_unittest.UnittestProto.TestUnpackedTypes; +import protobuf_unittest.UnittestProto.ForeignMessage; +import protobuf_unittest.UnittestProto.ForeignEnum; +import com.google.protobuf.test.UnittestImport.ImportMessage; +import com.google.protobuf.test.UnittestImport.ImportEnum; + +import com.google.protobuf.UnittestLite.TestAllTypesLite; +import com.google.protobuf.UnittestLite.TestAllExtensionsLite; +import com.google.protobuf.UnittestLite.TestAllExtensionsLiteOrBuilder; +import com.google.protobuf.UnittestLite.TestPackedExtensionsLite; +import com.google.protobuf.UnittestLite.ForeignMessageLite; +import com.google.protobuf.UnittestLite.ForeignEnumLite; +import com.google.protobuf.UnittestImportLite.ImportMessageLite; +import com.google.protobuf.UnittestImportLite.ImportEnumLite; + +import junit.framework.Assert; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; + +/** + * Contains methods for setting all fields of {@code TestAllTypes} to + * some vaules as well as checking that all the fields are set to those values. + * These are useful for testing various protocol message features, e.g. + * set all fields of a message, serialize it, parse it, and check that all + * fields are set. + * + *

This code is not to be used outside of {@code com.google.protobuf} and + * subpackages. + * + * @author kenton@google.com Kenton Varda + */ +public final class TestUtil { + private TestUtil() {} + + /** Helper to convert a String to ByteString. */ + static ByteString toBytes(String str) { + try { + return ByteString.copyFrom(str.getBytes("UTF-8")); + } catch(java.io.UnsupportedEncodingException e) { + throw new RuntimeException("UTF-8 not supported.", e); + } + } + + /** + * Get a {@code TestAllTypes} with all fields set as they would be by + * {@link #setAllFields(TestAllTypes.Builder)}. + */ + public static TestAllTypes getAllSet() { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + setAllFields(builder); + return builder.build(); + } + + /** + * Get a {@code TestAllExtensions} with all fields set as they would be by + * {@link #setAllExtensions(TestAllExtensions.Builder)}. + */ + public static TestAllExtensions getAllExtensionsSet() { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + setAllExtensions(builder); + return builder.build(); + } + + public static TestAllExtensionsLite getAllLiteExtensionsSet() { + TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.newBuilder(); + setAllExtensions(builder); + return builder.build(); + } + + public static TestPackedTypes getPackedSet() { + TestPackedTypes.Builder builder = TestPackedTypes.newBuilder(); + setPackedFields(builder); + return builder.build(); + } + + public static TestUnpackedTypes getUnpackedSet() { + TestUnpackedTypes.Builder builder = TestUnpackedTypes.newBuilder(); + setUnpackedFields(builder); + return builder.build(); + } + + public static TestPackedExtensions getPackedExtensionsSet() { + TestPackedExtensions.Builder builder = TestPackedExtensions.newBuilder(); + setPackedExtensions(builder); + return builder.build(); + } + + public static TestPackedExtensionsLite getLitePackedExtensionsSet() { + TestPackedExtensionsLite.Builder builder = + TestPackedExtensionsLite.newBuilder(); + setPackedExtensions(builder); + return builder.build(); + } + + /** + * Set every field of {@code message} to the values expected by + * {@code assertAllFieldsSet()}. + */ + public static void setAllFields(TestAllTypes.Builder message) { + message.setOptionalInt32 (101); + message.setOptionalInt64 (102); + message.setOptionalUint32 (103); + message.setOptionalUint64 (104); + message.setOptionalSint32 (105); + message.setOptionalSint64 (106); + message.setOptionalFixed32 (107); + message.setOptionalFixed64 (108); + message.setOptionalSfixed32(109); + message.setOptionalSfixed64(110); + message.setOptionalFloat (111); + message.setOptionalDouble (112); + message.setOptionalBool (true); + message.setOptionalString ("115"); + message.setOptionalBytes (toBytes("116")); + + message.setOptionalGroup( + TestAllTypes.OptionalGroup.newBuilder().setA(117).build()); + message.setOptionalNestedMessage( + TestAllTypes.NestedMessage.newBuilder().setBb(118).build()); + message.setOptionalForeignMessage( + ForeignMessage.newBuilder().setC(119).build()); + message.setOptionalImportMessage( + ImportMessage.newBuilder().setD(120).build()); + + message.setOptionalNestedEnum (TestAllTypes.NestedEnum.BAZ); + message.setOptionalForeignEnum(ForeignEnum.FOREIGN_BAZ); + message.setOptionalImportEnum (ImportEnum.IMPORT_BAZ); + + message.setOptionalStringPiece("124"); + message.setOptionalCord("125"); + + // ----------------------------------------------------------------- + + message.addRepeatedInt32 (201); + message.addRepeatedInt64 (202); + message.addRepeatedUint32 (203); + message.addRepeatedUint64 (204); + message.addRepeatedSint32 (205); + message.addRepeatedSint64 (206); + message.addRepeatedFixed32 (207); + message.addRepeatedFixed64 (208); + message.addRepeatedSfixed32(209); + message.addRepeatedSfixed64(210); + message.addRepeatedFloat (211); + message.addRepeatedDouble (212); + message.addRepeatedBool (true); + message.addRepeatedString ("215"); + message.addRepeatedBytes (toBytes("216")); + + message.addRepeatedGroup( + TestAllTypes.RepeatedGroup.newBuilder().setA(217).build()); + message.addRepeatedNestedMessage( + TestAllTypes.NestedMessage.newBuilder().setBb(218).build()); + message.addRepeatedForeignMessage( + ForeignMessage.newBuilder().setC(219).build()); + message.addRepeatedImportMessage( + ImportMessage.newBuilder().setD(220).build()); + + message.addRepeatedNestedEnum (TestAllTypes.NestedEnum.BAR); + message.addRepeatedForeignEnum(ForeignEnum.FOREIGN_BAR); + message.addRepeatedImportEnum (ImportEnum.IMPORT_BAR); + + message.addRepeatedStringPiece("224"); + message.addRepeatedCord("225"); + + // Add a second one of each field. + message.addRepeatedInt32 (301); + message.addRepeatedInt64 (302); + message.addRepeatedUint32 (303); + message.addRepeatedUint64 (304); + message.addRepeatedSint32 (305); + message.addRepeatedSint64 (306); + message.addRepeatedFixed32 (307); + message.addRepeatedFixed64 (308); + message.addRepeatedSfixed32(309); + message.addRepeatedSfixed64(310); + message.addRepeatedFloat (311); + message.addRepeatedDouble (312); + message.addRepeatedBool (false); + message.addRepeatedString ("315"); + message.addRepeatedBytes (toBytes("316")); + + message.addRepeatedGroup( + TestAllTypes.RepeatedGroup.newBuilder().setA(317).build()); + message.addRepeatedNestedMessage( + TestAllTypes.NestedMessage.newBuilder().setBb(318).build()); + message.addRepeatedForeignMessage( + ForeignMessage.newBuilder().setC(319).build()); + message.addRepeatedImportMessage( + ImportMessage.newBuilder().setD(320).build()); + + message.addRepeatedNestedEnum (TestAllTypes.NestedEnum.BAZ); + message.addRepeatedForeignEnum(ForeignEnum.FOREIGN_BAZ); + message.addRepeatedImportEnum (ImportEnum.IMPORT_BAZ); + + message.addRepeatedStringPiece("324"); + message.addRepeatedCord("325"); + + // ----------------------------------------------------------------- + + message.setDefaultInt32 (401); + message.setDefaultInt64 (402); + message.setDefaultUint32 (403); + message.setDefaultUint64 (404); + message.setDefaultSint32 (405); + message.setDefaultSint64 (406); + message.setDefaultFixed32 (407); + message.setDefaultFixed64 (408); + message.setDefaultSfixed32(409); + message.setDefaultSfixed64(410); + message.setDefaultFloat (411); + message.setDefaultDouble (412); + message.setDefaultBool (false); + message.setDefaultString ("415"); + message.setDefaultBytes (toBytes("416")); + + message.setDefaultNestedEnum (TestAllTypes.NestedEnum.FOO); + message.setDefaultForeignEnum(ForeignEnum.FOREIGN_FOO); + message.setDefaultImportEnum (ImportEnum.IMPORT_FOO); + + message.setDefaultStringPiece("424"); + message.setDefaultCord("425"); + } + + // ------------------------------------------------------------------- + + /** + * Modify the repeated fields of {@code message} to contain the values + * expected by {@code assertRepeatedFieldsModified()}. + */ + public static void modifyRepeatedFields(TestAllTypes.Builder message) { + message.setRepeatedInt32 (1, 501); + message.setRepeatedInt64 (1, 502); + message.setRepeatedUint32 (1, 503); + message.setRepeatedUint64 (1, 504); + message.setRepeatedSint32 (1, 505); + message.setRepeatedSint64 (1, 506); + message.setRepeatedFixed32 (1, 507); + message.setRepeatedFixed64 (1, 508); + message.setRepeatedSfixed32(1, 509); + message.setRepeatedSfixed64(1, 510); + message.setRepeatedFloat (1, 511); + message.setRepeatedDouble (1, 512); + message.setRepeatedBool (1, true); + message.setRepeatedString (1, "515"); + message.setRepeatedBytes (1, toBytes("516")); + + message.setRepeatedGroup(1, + TestAllTypes.RepeatedGroup.newBuilder().setA(517).build()); + message.setRepeatedNestedMessage(1, + TestAllTypes.NestedMessage.newBuilder().setBb(518).build()); + message.setRepeatedForeignMessage(1, + ForeignMessage.newBuilder().setC(519).build()); + message.setRepeatedImportMessage(1, + ImportMessage.newBuilder().setD(520).build()); + + message.setRepeatedNestedEnum (1, TestAllTypes.NestedEnum.FOO); + message.setRepeatedForeignEnum(1, ForeignEnum.FOREIGN_FOO); + message.setRepeatedImportEnum (1, ImportEnum.IMPORT_FOO); + + message.setRepeatedStringPiece(1, "524"); + message.setRepeatedCord(1, "525"); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all fields of + * {@code message} are set to the values assigned by {@code setAllFields}. + */ + public static void assertAllFieldsSet(TestAllTypesOrBuilder message) { + Assert.assertTrue(message.hasOptionalInt32 ()); + Assert.assertTrue(message.hasOptionalInt64 ()); + Assert.assertTrue(message.hasOptionalUint32 ()); + Assert.assertTrue(message.hasOptionalUint64 ()); + Assert.assertTrue(message.hasOptionalSint32 ()); + Assert.assertTrue(message.hasOptionalSint64 ()); + Assert.assertTrue(message.hasOptionalFixed32 ()); + Assert.assertTrue(message.hasOptionalFixed64 ()); + Assert.assertTrue(message.hasOptionalSfixed32()); + Assert.assertTrue(message.hasOptionalSfixed64()); + Assert.assertTrue(message.hasOptionalFloat ()); + Assert.assertTrue(message.hasOptionalDouble ()); + Assert.assertTrue(message.hasOptionalBool ()); + Assert.assertTrue(message.hasOptionalString ()); + Assert.assertTrue(message.hasOptionalBytes ()); + + Assert.assertTrue(message.hasOptionalGroup ()); + Assert.assertTrue(message.hasOptionalNestedMessage ()); + Assert.assertTrue(message.hasOptionalForeignMessage()); + Assert.assertTrue(message.hasOptionalImportMessage ()); + + Assert.assertTrue(message.getOptionalGroup ().hasA()); + Assert.assertTrue(message.getOptionalNestedMessage ().hasBb()); + Assert.assertTrue(message.getOptionalForeignMessage().hasC()); + Assert.assertTrue(message.getOptionalImportMessage ().hasD()); + + Assert.assertTrue(message.hasOptionalNestedEnum ()); + Assert.assertTrue(message.hasOptionalForeignEnum()); + Assert.assertTrue(message.hasOptionalImportEnum ()); + + Assert.assertTrue(message.hasOptionalStringPiece()); + Assert.assertTrue(message.hasOptionalCord()); + + Assert.assertEquals(101 , message.getOptionalInt32 ()); + Assert.assertEquals(102 , message.getOptionalInt64 ()); + Assert.assertEquals(103 , message.getOptionalUint32 ()); + Assert.assertEquals(104 , message.getOptionalUint64 ()); + Assert.assertEquals(105 , message.getOptionalSint32 ()); + Assert.assertEquals(106 , message.getOptionalSint64 ()); + Assert.assertEquals(107 , message.getOptionalFixed32 ()); + Assert.assertEquals(108 , message.getOptionalFixed64 ()); + Assert.assertEquals(109 , message.getOptionalSfixed32()); + Assert.assertEquals(110 , message.getOptionalSfixed64()); + Assert.assertEquals(111 , message.getOptionalFloat (), 0.0); + Assert.assertEquals(112 , message.getOptionalDouble (), 0.0); + Assert.assertEquals(true , message.getOptionalBool ()); + Assert.assertEquals("115", message.getOptionalString ()); + Assert.assertEquals(toBytes("116"), message.getOptionalBytes()); + + Assert.assertEquals(117, message.getOptionalGroup ().getA()); + Assert.assertEquals(118, message.getOptionalNestedMessage ().getBb()); + Assert.assertEquals(119, message.getOptionalForeignMessage().getC()); + Assert.assertEquals(120, message.getOptionalImportMessage ().getD()); + + Assert.assertEquals(TestAllTypes.NestedEnum.BAZ, message.getOptionalNestedEnum()); + Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getOptionalForeignEnum()); + Assert.assertEquals(ImportEnum.IMPORT_BAZ, message.getOptionalImportEnum()); + + Assert.assertEquals("124", message.getOptionalStringPiece()); + Assert.assertEquals("125", message.getOptionalCord()); + + // ----------------------------------------------------------------- + + Assert.assertEquals(2, message.getRepeatedInt32Count ()); + Assert.assertEquals(2, message.getRepeatedInt64Count ()); + Assert.assertEquals(2, message.getRepeatedUint32Count ()); + Assert.assertEquals(2, message.getRepeatedUint64Count ()); + Assert.assertEquals(2, message.getRepeatedSint32Count ()); + Assert.assertEquals(2, message.getRepeatedSint64Count ()); + Assert.assertEquals(2, message.getRepeatedFixed32Count ()); + Assert.assertEquals(2, message.getRepeatedFixed64Count ()); + Assert.assertEquals(2, message.getRepeatedSfixed32Count()); + Assert.assertEquals(2, message.getRepeatedSfixed64Count()); + Assert.assertEquals(2, message.getRepeatedFloatCount ()); + Assert.assertEquals(2, message.getRepeatedDoubleCount ()); + Assert.assertEquals(2, message.getRepeatedBoolCount ()); + Assert.assertEquals(2, message.getRepeatedStringCount ()); + Assert.assertEquals(2, message.getRepeatedBytesCount ()); + + Assert.assertEquals(2, message.getRepeatedGroupCount ()); + Assert.assertEquals(2, message.getRepeatedNestedMessageCount ()); + Assert.assertEquals(2, message.getRepeatedForeignMessageCount()); + Assert.assertEquals(2, message.getRepeatedImportMessageCount ()); + Assert.assertEquals(2, message.getRepeatedNestedEnumCount ()); + Assert.assertEquals(2, message.getRepeatedForeignEnumCount ()); + Assert.assertEquals(2, message.getRepeatedImportEnumCount ()); + + Assert.assertEquals(2, message.getRepeatedStringPieceCount()); + Assert.assertEquals(2, message.getRepeatedCordCount()); + + Assert.assertEquals(201 , message.getRepeatedInt32 (0)); + Assert.assertEquals(202 , message.getRepeatedInt64 (0)); + Assert.assertEquals(203 , message.getRepeatedUint32 (0)); + Assert.assertEquals(204 , message.getRepeatedUint64 (0)); + Assert.assertEquals(205 , message.getRepeatedSint32 (0)); + Assert.assertEquals(206 , message.getRepeatedSint64 (0)); + Assert.assertEquals(207 , message.getRepeatedFixed32 (0)); + Assert.assertEquals(208 , message.getRepeatedFixed64 (0)); + Assert.assertEquals(209 , message.getRepeatedSfixed32(0)); + Assert.assertEquals(210 , message.getRepeatedSfixed64(0)); + Assert.assertEquals(211 , message.getRepeatedFloat (0), 0.0); + Assert.assertEquals(212 , message.getRepeatedDouble (0), 0.0); + Assert.assertEquals(true , message.getRepeatedBool (0)); + Assert.assertEquals("215", message.getRepeatedString (0)); + Assert.assertEquals(toBytes("216"), message.getRepeatedBytes(0)); + + Assert.assertEquals(217, message.getRepeatedGroup (0).getA()); + Assert.assertEquals(218, message.getRepeatedNestedMessage (0).getBb()); + Assert.assertEquals(219, message.getRepeatedForeignMessage(0).getC()); + Assert.assertEquals(220, message.getRepeatedImportMessage (0).getD()); + + Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getRepeatedNestedEnum (0)); + Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getRepeatedForeignEnum(0)); + Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getRepeatedImportEnum(0)); + + Assert.assertEquals("224", message.getRepeatedStringPiece(0)); + Assert.assertEquals("225", message.getRepeatedCord(0)); + + Assert.assertEquals(301 , message.getRepeatedInt32 (1)); + Assert.assertEquals(302 , message.getRepeatedInt64 (1)); + Assert.assertEquals(303 , message.getRepeatedUint32 (1)); + Assert.assertEquals(304 , message.getRepeatedUint64 (1)); + Assert.assertEquals(305 , message.getRepeatedSint32 (1)); + Assert.assertEquals(306 , message.getRepeatedSint64 (1)); + Assert.assertEquals(307 , message.getRepeatedFixed32 (1)); + Assert.assertEquals(308 , message.getRepeatedFixed64 (1)); + Assert.assertEquals(309 , message.getRepeatedSfixed32(1)); + Assert.assertEquals(310 , message.getRepeatedSfixed64(1)); + Assert.assertEquals(311 , message.getRepeatedFloat (1), 0.0); + Assert.assertEquals(312 , message.getRepeatedDouble (1), 0.0); + Assert.assertEquals(false, message.getRepeatedBool (1)); + Assert.assertEquals("315", message.getRepeatedString (1)); + Assert.assertEquals(toBytes("316"), message.getRepeatedBytes(1)); + + Assert.assertEquals(317, message.getRepeatedGroup (1).getA()); + Assert.assertEquals(318, message.getRepeatedNestedMessage (1).getBb()); + Assert.assertEquals(319, message.getRepeatedForeignMessage(1).getC()); + Assert.assertEquals(320, message.getRepeatedImportMessage (1).getD()); + + Assert.assertEquals(TestAllTypes.NestedEnum.BAZ, message.getRepeatedNestedEnum (1)); + Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getRepeatedForeignEnum(1)); + Assert.assertEquals(ImportEnum.IMPORT_BAZ, message.getRepeatedImportEnum(1)); + + Assert.assertEquals("324", message.getRepeatedStringPiece(1)); + Assert.assertEquals("325", message.getRepeatedCord(1)); + + // ----------------------------------------------------------------- + + Assert.assertTrue(message.hasDefaultInt32 ()); + Assert.assertTrue(message.hasDefaultInt64 ()); + Assert.assertTrue(message.hasDefaultUint32 ()); + Assert.assertTrue(message.hasDefaultUint64 ()); + Assert.assertTrue(message.hasDefaultSint32 ()); + Assert.assertTrue(message.hasDefaultSint64 ()); + Assert.assertTrue(message.hasDefaultFixed32 ()); + Assert.assertTrue(message.hasDefaultFixed64 ()); + Assert.assertTrue(message.hasDefaultSfixed32()); + Assert.assertTrue(message.hasDefaultSfixed64()); + Assert.assertTrue(message.hasDefaultFloat ()); + Assert.assertTrue(message.hasDefaultDouble ()); + Assert.assertTrue(message.hasDefaultBool ()); + Assert.assertTrue(message.hasDefaultString ()); + Assert.assertTrue(message.hasDefaultBytes ()); + + Assert.assertTrue(message.hasDefaultNestedEnum ()); + Assert.assertTrue(message.hasDefaultForeignEnum()); + Assert.assertTrue(message.hasDefaultImportEnum ()); + + Assert.assertTrue(message.hasDefaultStringPiece()); + Assert.assertTrue(message.hasDefaultCord()); + + Assert.assertEquals(401 , message.getDefaultInt32 ()); + Assert.assertEquals(402 , message.getDefaultInt64 ()); + Assert.assertEquals(403 , message.getDefaultUint32 ()); + Assert.assertEquals(404 , message.getDefaultUint64 ()); + Assert.assertEquals(405 , message.getDefaultSint32 ()); + Assert.assertEquals(406 , message.getDefaultSint64 ()); + Assert.assertEquals(407 , message.getDefaultFixed32 ()); + Assert.assertEquals(408 , message.getDefaultFixed64 ()); + Assert.assertEquals(409 , message.getDefaultSfixed32()); + Assert.assertEquals(410 , message.getDefaultSfixed64()); + Assert.assertEquals(411 , message.getDefaultFloat (), 0.0); + Assert.assertEquals(412 , message.getDefaultDouble (), 0.0); + Assert.assertEquals(false, message.getDefaultBool ()); + Assert.assertEquals("415", message.getDefaultString ()); + Assert.assertEquals(toBytes("416"), message.getDefaultBytes()); + + Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getDefaultNestedEnum ()); + Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getDefaultForeignEnum()); + Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getDefaultImportEnum()); + + Assert.assertEquals("424", message.getDefaultStringPiece()); + Assert.assertEquals("425", message.getDefaultCord()); + } + + // ------------------------------------------------------------------- + /** + * Assert (using {@code junit.framework.Assert}} that all fields of + * {@code message} are cleared, and that getting the fields returns their + * default values. + */ + public static void assertClear(TestAllTypesOrBuilder message) { + // hasBlah() should initially be false for all optional fields. + Assert.assertFalse(message.hasOptionalInt32 ()); + Assert.assertFalse(message.hasOptionalInt64 ()); + Assert.assertFalse(message.hasOptionalUint32 ()); + Assert.assertFalse(message.hasOptionalUint64 ()); + Assert.assertFalse(message.hasOptionalSint32 ()); + Assert.assertFalse(message.hasOptionalSint64 ()); + Assert.assertFalse(message.hasOptionalFixed32 ()); + Assert.assertFalse(message.hasOptionalFixed64 ()); + Assert.assertFalse(message.hasOptionalSfixed32()); + Assert.assertFalse(message.hasOptionalSfixed64()); + Assert.assertFalse(message.hasOptionalFloat ()); + Assert.assertFalse(message.hasOptionalDouble ()); + Assert.assertFalse(message.hasOptionalBool ()); + Assert.assertFalse(message.hasOptionalString ()); + Assert.assertFalse(message.hasOptionalBytes ()); + + Assert.assertFalse(message.hasOptionalGroup ()); + Assert.assertFalse(message.hasOptionalNestedMessage ()); + Assert.assertFalse(message.hasOptionalForeignMessage()); + Assert.assertFalse(message.hasOptionalImportMessage ()); + + Assert.assertFalse(message.hasOptionalNestedEnum ()); + Assert.assertFalse(message.hasOptionalForeignEnum()); + Assert.assertFalse(message.hasOptionalImportEnum ()); + + Assert.assertFalse(message.hasOptionalStringPiece()); + Assert.assertFalse(message.hasOptionalCord()); + + // Optional fields without defaults are set to zero or something like it. + Assert.assertEquals(0 , message.getOptionalInt32 ()); + Assert.assertEquals(0 , message.getOptionalInt64 ()); + Assert.assertEquals(0 , message.getOptionalUint32 ()); + Assert.assertEquals(0 , message.getOptionalUint64 ()); + Assert.assertEquals(0 , message.getOptionalSint32 ()); + Assert.assertEquals(0 , message.getOptionalSint64 ()); + Assert.assertEquals(0 , message.getOptionalFixed32 ()); + Assert.assertEquals(0 , message.getOptionalFixed64 ()); + Assert.assertEquals(0 , message.getOptionalSfixed32()); + Assert.assertEquals(0 , message.getOptionalSfixed64()); + Assert.assertEquals(0 , message.getOptionalFloat (), 0.0); + Assert.assertEquals(0 , message.getOptionalDouble (), 0.0); + Assert.assertEquals(false, message.getOptionalBool ()); + Assert.assertEquals("" , message.getOptionalString ()); + Assert.assertEquals(ByteString.EMPTY, message.getOptionalBytes()); + + // Embedded messages should also be clear. + Assert.assertFalse(message.getOptionalGroup ().hasA()); + Assert.assertFalse(message.getOptionalNestedMessage ().hasBb()); + Assert.assertFalse(message.getOptionalForeignMessage().hasC()); + Assert.assertFalse(message.getOptionalImportMessage ().hasD()); + + Assert.assertEquals(0, message.getOptionalGroup ().getA()); + Assert.assertEquals(0, message.getOptionalNestedMessage ().getBb()); + Assert.assertEquals(0, message.getOptionalForeignMessage().getC()); + Assert.assertEquals(0, message.getOptionalImportMessage ().getD()); + + // Enums without defaults are set to the first value in the enum. + Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getOptionalNestedEnum ()); + Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getOptionalForeignEnum()); + Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getOptionalImportEnum()); + + Assert.assertEquals("", message.getOptionalStringPiece()); + Assert.assertEquals("", message.getOptionalCord()); + + // Repeated fields are empty. + Assert.assertEquals(0, message.getRepeatedInt32Count ()); + Assert.assertEquals(0, message.getRepeatedInt64Count ()); + Assert.assertEquals(0, message.getRepeatedUint32Count ()); + Assert.assertEquals(0, message.getRepeatedUint64Count ()); + Assert.assertEquals(0, message.getRepeatedSint32Count ()); + Assert.assertEquals(0, message.getRepeatedSint64Count ()); + Assert.assertEquals(0, message.getRepeatedFixed32Count ()); + Assert.assertEquals(0, message.getRepeatedFixed64Count ()); + Assert.assertEquals(0, message.getRepeatedSfixed32Count()); + Assert.assertEquals(0, message.getRepeatedSfixed64Count()); + Assert.assertEquals(0, message.getRepeatedFloatCount ()); + Assert.assertEquals(0, message.getRepeatedDoubleCount ()); + Assert.assertEquals(0, message.getRepeatedBoolCount ()); + Assert.assertEquals(0, message.getRepeatedStringCount ()); + Assert.assertEquals(0, message.getRepeatedBytesCount ()); + + Assert.assertEquals(0, message.getRepeatedGroupCount ()); + Assert.assertEquals(0, message.getRepeatedNestedMessageCount ()); + Assert.assertEquals(0, message.getRepeatedForeignMessageCount()); + Assert.assertEquals(0, message.getRepeatedImportMessageCount ()); + Assert.assertEquals(0, message.getRepeatedNestedEnumCount ()); + Assert.assertEquals(0, message.getRepeatedForeignEnumCount ()); + Assert.assertEquals(0, message.getRepeatedImportEnumCount ()); + + Assert.assertEquals(0, message.getRepeatedStringPieceCount()); + Assert.assertEquals(0, message.getRepeatedCordCount()); + + // hasBlah() should also be false for all default fields. + Assert.assertFalse(message.hasDefaultInt32 ()); + Assert.assertFalse(message.hasDefaultInt64 ()); + Assert.assertFalse(message.hasDefaultUint32 ()); + Assert.assertFalse(message.hasDefaultUint64 ()); + Assert.assertFalse(message.hasDefaultSint32 ()); + Assert.assertFalse(message.hasDefaultSint64 ()); + Assert.assertFalse(message.hasDefaultFixed32 ()); + Assert.assertFalse(message.hasDefaultFixed64 ()); + Assert.assertFalse(message.hasDefaultSfixed32()); + Assert.assertFalse(message.hasDefaultSfixed64()); + Assert.assertFalse(message.hasDefaultFloat ()); + Assert.assertFalse(message.hasDefaultDouble ()); + Assert.assertFalse(message.hasDefaultBool ()); + Assert.assertFalse(message.hasDefaultString ()); + Assert.assertFalse(message.hasDefaultBytes ()); + + Assert.assertFalse(message.hasDefaultNestedEnum ()); + Assert.assertFalse(message.hasDefaultForeignEnum()); + Assert.assertFalse(message.hasDefaultImportEnum ()); + + Assert.assertFalse(message.hasDefaultStringPiece()); + Assert.assertFalse(message.hasDefaultCord()); + + // Fields with defaults have their default values (duh). + Assert.assertEquals( 41 , message.getDefaultInt32 ()); + Assert.assertEquals( 42 , message.getDefaultInt64 ()); + Assert.assertEquals( 43 , message.getDefaultUint32 ()); + Assert.assertEquals( 44 , message.getDefaultUint64 ()); + Assert.assertEquals(-45 , message.getDefaultSint32 ()); + Assert.assertEquals( 46 , message.getDefaultSint64 ()); + Assert.assertEquals( 47 , message.getDefaultFixed32 ()); + Assert.assertEquals( 48 , message.getDefaultFixed64 ()); + Assert.assertEquals( 49 , message.getDefaultSfixed32()); + Assert.assertEquals(-50 , message.getDefaultSfixed64()); + Assert.assertEquals( 51.5 , message.getDefaultFloat (), 0.0); + Assert.assertEquals( 52e3 , message.getDefaultDouble (), 0.0); + Assert.assertEquals(true , message.getDefaultBool ()); + Assert.assertEquals("hello", message.getDefaultString ()); + Assert.assertEquals(toBytes("world"), message.getDefaultBytes()); + + Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getDefaultNestedEnum ()); + Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getDefaultForeignEnum()); + Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getDefaultImportEnum()); + + Assert.assertEquals("abc", message.getDefaultStringPiece()); + Assert.assertEquals("123", message.getDefaultCord()); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all fields of + * {@code message} are set to the values assigned by {@code setAllFields} + * followed by {@code modifyRepeatedFields}. + */ + public static void assertRepeatedFieldsModified( + TestAllTypesOrBuilder message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + Assert.assertEquals(2, message.getRepeatedInt32Count ()); + Assert.assertEquals(2, message.getRepeatedInt64Count ()); + Assert.assertEquals(2, message.getRepeatedUint32Count ()); + Assert.assertEquals(2, message.getRepeatedUint64Count ()); + Assert.assertEquals(2, message.getRepeatedSint32Count ()); + Assert.assertEquals(2, message.getRepeatedSint64Count ()); + Assert.assertEquals(2, message.getRepeatedFixed32Count ()); + Assert.assertEquals(2, message.getRepeatedFixed64Count ()); + Assert.assertEquals(2, message.getRepeatedSfixed32Count()); + Assert.assertEquals(2, message.getRepeatedSfixed64Count()); + Assert.assertEquals(2, message.getRepeatedFloatCount ()); + Assert.assertEquals(2, message.getRepeatedDoubleCount ()); + Assert.assertEquals(2, message.getRepeatedBoolCount ()); + Assert.assertEquals(2, message.getRepeatedStringCount ()); + Assert.assertEquals(2, message.getRepeatedBytesCount ()); + + Assert.assertEquals(2, message.getRepeatedGroupCount ()); + Assert.assertEquals(2, message.getRepeatedNestedMessageCount ()); + Assert.assertEquals(2, message.getRepeatedForeignMessageCount()); + Assert.assertEquals(2, message.getRepeatedImportMessageCount ()); + Assert.assertEquals(2, message.getRepeatedNestedEnumCount ()); + Assert.assertEquals(2, message.getRepeatedForeignEnumCount ()); + Assert.assertEquals(2, message.getRepeatedImportEnumCount ()); + + Assert.assertEquals(2, message.getRepeatedStringPieceCount()); + Assert.assertEquals(2, message.getRepeatedCordCount()); + + Assert.assertEquals(201 , message.getRepeatedInt32 (0)); + Assert.assertEquals(202L , message.getRepeatedInt64 (0)); + Assert.assertEquals(203 , message.getRepeatedUint32 (0)); + Assert.assertEquals(204L , message.getRepeatedUint64 (0)); + Assert.assertEquals(205 , message.getRepeatedSint32 (0)); + Assert.assertEquals(206L , message.getRepeatedSint64 (0)); + Assert.assertEquals(207 , message.getRepeatedFixed32 (0)); + Assert.assertEquals(208L , message.getRepeatedFixed64 (0)); + Assert.assertEquals(209 , message.getRepeatedSfixed32(0)); + Assert.assertEquals(210L , message.getRepeatedSfixed64(0)); + Assert.assertEquals(211F , message.getRepeatedFloat (0)); + Assert.assertEquals(212D , message.getRepeatedDouble (0)); + Assert.assertEquals(true , message.getRepeatedBool (0)); + Assert.assertEquals("215", message.getRepeatedString (0)); + Assert.assertEquals(toBytes("216"), message.getRepeatedBytes(0)); + + Assert.assertEquals(217, message.getRepeatedGroup (0).getA()); + Assert.assertEquals(218, message.getRepeatedNestedMessage (0).getBb()); + Assert.assertEquals(219, message.getRepeatedForeignMessage(0).getC()); + Assert.assertEquals(220, message.getRepeatedImportMessage (0).getD()); + + Assert.assertEquals(TestAllTypes.NestedEnum.BAR, message.getRepeatedNestedEnum (0)); + Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getRepeatedForeignEnum(0)); + Assert.assertEquals(ImportEnum.IMPORT_BAR, message.getRepeatedImportEnum(0)); + + Assert.assertEquals("224", message.getRepeatedStringPiece(0)); + Assert.assertEquals("225", message.getRepeatedCord(0)); + + // Actually verify the second (modified) elements now. + Assert.assertEquals(501 , message.getRepeatedInt32 (1)); + Assert.assertEquals(502L , message.getRepeatedInt64 (1)); + Assert.assertEquals(503 , message.getRepeatedUint32 (1)); + Assert.assertEquals(504L , message.getRepeatedUint64 (1)); + Assert.assertEquals(505 , message.getRepeatedSint32 (1)); + Assert.assertEquals(506L , message.getRepeatedSint64 (1)); + Assert.assertEquals(507 , message.getRepeatedFixed32 (1)); + Assert.assertEquals(508L , message.getRepeatedFixed64 (1)); + Assert.assertEquals(509 , message.getRepeatedSfixed32(1)); + Assert.assertEquals(510L , message.getRepeatedSfixed64(1)); + Assert.assertEquals(511F , message.getRepeatedFloat (1)); + Assert.assertEquals(512D , message.getRepeatedDouble (1)); + Assert.assertEquals(true , message.getRepeatedBool (1)); + Assert.assertEquals("515", message.getRepeatedString (1)); + Assert.assertEquals(toBytes("516"), message.getRepeatedBytes(1)); + + Assert.assertEquals(517, message.getRepeatedGroup (1).getA()); + Assert.assertEquals(518, message.getRepeatedNestedMessage (1).getBb()); + Assert.assertEquals(519, message.getRepeatedForeignMessage(1).getC()); + Assert.assertEquals(520, message.getRepeatedImportMessage (1).getD()); + + Assert.assertEquals(TestAllTypes.NestedEnum.FOO, message.getRepeatedNestedEnum (1)); + Assert.assertEquals(ForeignEnum.FOREIGN_FOO, message.getRepeatedForeignEnum(1)); + Assert.assertEquals(ImportEnum.IMPORT_FOO, message.getRepeatedImportEnum(1)); + + Assert.assertEquals("524", message.getRepeatedStringPiece(1)); + Assert.assertEquals("525", message.getRepeatedCord(1)); + } + + /** + * Set every field of {@code message} to a unique value. + */ + public static void setPackedFields(TestPackedTypes.Builder message) { + message.addPackedInt32 (601); + message.addPackedInt64 (602); + message.addPackedUint32 (603); + message.addPackedUint64 (604); + message.addPackedSint32 (605); + message.addPackedSint64 (606); + message.addPackedFixed32 (607); + message.addPackedFixed64 (608); + message.addPackedSfixed32(609); + message.addPackedSfixed64(610); + message.addPackedFloat (611); + message.addPackedDouble (612); + message.addPackedBool (true); + message.addPackedEnum (ForeignEnum.FOREIGN_BAR); + // Add a second one of each field. + message.addPackedInt32 (701); + message.addPackedInt64 (702); + message.addPackedUint32 (703); + message.addPackedUint64 (704); + message.addPackedSint32 (705); + message.addPackedSint64 (706); + message.addPackedFixed32 (707); + message.addPackedFixed64 (708); + message.addPackedSfixed32(709); + message.addPackedSfixed64(710); + message.addPackedFloat (711); + message.addPackedDouble (712); + message.addPackedBool (false); + message.addPackedEnum (ForeignEnum.FOREIGN_BAZ); + } + + /** + * Set every field of {@code message} to a unique value. Must correspond with + * the values applied by {@code setPackedFields}. + */ + public static void setUnpackedFields(TestUnpackedTypes.Builder message) { + message.addUnpackedInt32 (601); + message.addUnpackedInt64 (602); + message.addUnpackedUint32 (603); + message.addUnpackedUint64 (604); + message.addUnpackedSint32 (605); + message.addUnpackedSint64 (606); + message.addUnpackedFixed32 (607); + message.addUnpackedFixed64 (608); + message.addUnpackedSfixed32(609); + message.addUnpackedSfixed64(610); + message.addUnpackedFloat (611); + message.addUnpackedDouble (612); + message.addUnpackedBool (true); + message.addUnpackedEnum (ForeignEnum.FOREIGN_BAR); + // Add a second one of each field. + message.addUnpackedInt32 (701); + message.addUnpackedInt64 (702); + message.addUnpackedUint32 (703); + message.addUnpackedUint64 (704); + message.addUnpackedSint32 (705); + message.addUnpackedSint64 (706); + message.addUnpackedFixed32 (707); + message.addUnpackedFixed64 (708); + message.addUnpackedSfixed32(709); + message.addUnpackedSfixed64(710); + message.addUnpackedFloat (711); + message.addUnpackedDouble (712); + message.addUnpackedBool (false); + message.addUnpackedEnum (ForeignEnum.FOREIGN_BAZ); + } + + /** + * Assert (using {@code junit.framework.Assert}} that all fields of + * {@code message} are set to the values assigned by {@code setPackedFields}. + */ + public static void assertPackedFieldsSet(TestPackedTypes message) { + Assert.assertEquals(2, message.getPackedInt32Count ()); + Assert.assertEquals(2, message.getPackedInt64Count ()); + Assert.assertEquals(2, message.getPackedUint32Count ()); + Assert.assertEquals(2, message.getPackedUint64Count ()); + Assert.assertEquals(2, message.getPackedSint32Count ()); + Assert.assertEquals(2, message.getPackedSint64Count ()); + Assert.assertEquals(2, message.getPackedFixed32Count ()); + Assert.assertEquals(2, message.getPackedFixed64Count ()); + Assert.assertEquals(2, message.getPackedSfixed32Count()); + Assert.assertEquals(2, message.getPackedSfixed64Count()); + Assert.assertEquals(2, message.getPackedFloatCount ()); + Assert.assertEquals(2, message.getPackedDoubleCount ()); + Assert.assertEquals(2, message.getPackedBoolCount ()); + Assert.assertEquals(2, message.getPackedEnumCount ()); + Assert.assertEquals(601 , message.getPackedInt32 (0)); + Assert.assertEquals(602 , message.getPackedInt64 (0)); + Assert.assertEquals(603 , message.getPackedUint32 (0)); + Assert.assertEquals(604 , message.getPackedUint64 (0)); + Assert.assertEquals(605 , message.getPackedSint32 (0)); + Assert.assertEquals(606 , message.getPackedSint64 (0)); + Assert.assertEquals(607 , message.getPackedFixed32 (0)); + Assert.assertEquals(608 , message.getPackedFixed64 (0)); + Assert.assertEquals(609 , message.getPackedSfixed32(0)); + Assert.assertEquals(610 , message.getPackedSfixed64(0)); + Assert.assertEquals(611 , message.getPackedFloat (0), 0.0); + Assert.assertEquals(612 , message.getPackedDouble (0), 0.0); + Assert.assertEquals(true , message.getPackedBool (0)); + Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getPackedEnum(0)); + Assert.assertEquals(701 , message.getPackedInt32 (1)); + Assert.assertEquals(702 , message.getPackedInt64 (1)); + Assert.assertEquals(703 , message.getPackedUint32 (1)); + Assert.assertEquals(704 , message.getPackedUint64 (1)); + Assert.assertEquals(705 , message.getPackedSint32 (1)); + Assert.assertEquals(706 , message.getPackedSint64 (1)); + Assert.assertEquals(707 , message.getPackedFixed32 (1)); + Assert.assertEquals(708 , message.getPackedFixed64 (1)); + Assert.assertEquals(709 , message.getPackedSfixed32(1)); + Assert.assertEquals(710 , message.getPackedSfixed64(1)); + Assert.assertEquals(711 , message.getPackedFloat (1), 0.0); + Assert.assertEquals(712 , message.getPackedDouble (1), 0.0); + Assert.assertEquals(false, message.getPackedBool (1)); + Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getPackedEnum(1)); + } + + /** + * Assert (using {@code junit.framework.Assert}} that all fields of + * {@code message} are set to the values assigned by {@code setUnpackedFields}. + */ + public static void assertUnpackedFieldsSet(TestUnpackedTypes message) { + Assert.assertEquals(2, message.getUnpackedInt32Count ()); + Assert.assertEquals(2, message.getUnpackedInt64Count ()); + Assert.assertEquals(2, message.getUnpackedUint32Count ()); + Assert.assertEquals(2, message.getUnpackedUint64Count ()); + Assert.assertEquals(2, message.getUnpackedSint32Count ()); + Assert.assertEquals(2, message.getUnpackedSint64Count ()); + Assert.assertEquals(2, message.getUnpackedFixed32Count ()); + Assert.assertEquals(2, message.getUnpackedFixed64Count ()); + Assert.assertEquals(2, message.getUnpackedSfixed32Count()); + Assert.assertEquals(2, message.getUnpackedSfixed64Count()); + Assert.assertEquals(2, message.getUnpackedFloatCount ()); + Assert.assertEquals(2, message.getUnpackedDoubleCount ()); + Assert.assertEquals(2, message.getUnpackedBoolCount ()); + Assert.assertEquals(2, message.getUnpackedEnumCount ()); + Assert.assertEquals(601 , message.getUnpackedInt32 (0)); + Assert.assertEquals(602 , message.getUnpackedInt64 (0)); + Assert.assertEquals(603 , message.getUnpackedUint32 (0)); + Assert.assertEquals(604 , message.getUnpackedUint64 (0)); + Assert.assertEquals(605 , message.getUnpackedSint32 (0)); + Assert.assertEquals(606 , message.getUnpackedSint64 (0)); + Assert.assertEquals(607 , message.getUnpackedFixed32 (0)); + Assert.assertEquals(608 , message.getUnpackedFixed64 (0)); + Assert.assertEquals(609 , message.getUnpackedSfixed32(0)); + Assert.assertEquals(610 , message.getUnpackedSfixed64(0)); + Assert.assertEquals(611 , message.getUnpackedFloat (0), 0.0); + Assert.assertEquals(612 , message.getUnpackedDouble (0), 0.0); + Assert.assertEquals(true , message.getUnpackedBool (0)); + Assert.assertEquals(ForeignEnum.FOREIGN_BAR, message.getUnpackedEnum(0)); + Assert.assertEquals(701 , message.getUnpackedInt32 (1)); + Assert.assertEquals(702 , message.getUnpackedInt64 (1)); + Assert.assertEquals(703 , message.getUnpackedUint32 (1)); + Assert.assertEquals(704 , message.getUnpackedUint64 (1)); + Assert.assertEquals(705 , message.getUnpackedSint32 (1)); + Assert.assertEquals(706 , message.getUnpackedSint64 (1)); + Assert.assertEquals(707 , message.getUnpackedFixed32 (1)); + Assert.assertEquals(708 , message.getUnpackedFixed64 (1)); + Assert.assertEquals(709 , message.getUnpackedSfixed32(1)); + Assert.assertEquals(710 , message.getUnpackedSfixed64(1)); + Assert.assertEquals(711 , message.getUnpackedFloat (1), 0.0); + Assert.assertEquals(712 , message.getUnpackedDouble (1), 0.0); + Assert.assertEquals(false, message.getUnpackedBool (1)); + Assert.assertEquals(ForeignEnum.FOREIGN_BAZ, message.getUnpackedEnum(1)); + } + + // =================================================================== + // Like above, but for extensions + + // Java gets confused with things like assertEquals(int, Integer): it can't + // decide whether to call assertEquals(int, int) or assertEquals(Object, + // Object). So we define these methods to help it. + private static void assertEqualsExactType(int a, int b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(long a, long b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(float a, float b) { + Assert.assertEquals(a, b, 0.0); + } + private static void assertEqualsExactType(double a, double b) { + Assert.assertEquals(a, b, 0.0); + } + private static void assertEqualsExactType(boolean a, boolean b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(String a, String b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(ByteString a, ByteString b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(TestAllTypes.NestedEnum a, + TestAllTypes.NestedEnum b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(ForeignEnum a, ForeignEnum b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(ImportEnum a, ImportEnum b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(TestAllTypesLite.NestedEnum a, + TestAllTypesLite.NestedEnum b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(ForeignEnumLite a, + ForeignEnumLite b) { + Assert.assertEquals(a, b); + } + private static void assertEqualsExactType(ImportEnumLite a, + ImportEnumLite b) { + Assert.assertEquals(a, b); + } + + /** + * Get an unmodifiable {@link ExtensionRegistry} containing all the + * extensions of {@code TestAllExtensions}. + */ + public static ExtensionRegistry getExtensionRegistry() { + ExtensionRegistry registry = ExtensionRegistry.newInstance(); + registerAllExtensions(registry); + return registry.getUnmodifiable(); + } + + public static ExtensionRegistryLite getExtensionRegistryLite() { + ExtensionRegistryLite registry = ExtensionRegistryLite.newInstance(); + registerAllExtensionsLite(registry); + return registry.getUnmodifiable(); + } + + /** + * Register all of {@code TestAllExtensions}'s extensions with the + * given {@link ExtensionRegistry}. + */ + public static void registerAllExtensions(ExtensionRegistry registry) { + UnittestProto.registerAllExtensions(registry); + registerAllExtensionsLite(registry); + } + + public static void registerAllExtensionsLite(ExtensionRegistryLite registry) { + UnittestLite.registerAllExtensions(registry); + } + + /** + * Set every field of {@code message} to the values expected by + * {@code assertAllExtensionsSet()}. + */ + public static void setAllExtensions(TestAllExtensions.Builder message) { + message.setExtension(optionalInt32Extension , 101); + message.setExtension(optionalInt64Extension , 102L); + message.setExtension(optionalUint32Extension , 103); + message.setExtension(optionalUint64Extension , 104L); + message.setExtension(optionalSint32Extension , 105); + message.setExtension(optionalSint64Extension , 106L); + message.setExtension(optionalFixed32Extension , 107); + message.setExtension(optionalFixed64Extension , 108L); + message.setExtension(optionalSfixed32Extension, 109); + message.setExtension(optionalSfixed64Extension, 110L); + message.setExtension(optionalFloatExtension , 111F); + message.setExtension(optionalDoubleExtension , 112D); + message.setExtension(optionalBoolExtension , true); + message.setExtension(optionalStringExtension , "115"); + message.setExtension(optionalBytesExtension , toBytes("116")); + + message.setExtension(optionalGroupExtension, + OptionalGroup_extension.newBuilder().setA(117).build()); + message.setExtension(optionalNestedMessageExtension, + TestAllTypes.NestedMessage.newBuilder().setBb(118).build()); + message.setExtension(optionalForeignMessageExtension, + ForeignMessage.newBuilder().setC(119).build()); + message.setExtension(optionalImportMessageExtension, + ImportMessage.newBuilder().setD(120).build()); + + message.setExtension(optionalNestedEnumExtension, TestAllTypes.NestedEnum.BAZ); + message.setExtension(optionalForeignEnumExtension, ForeignEnum.FOREIGN_BAZ); + message.setExtension(optionalImportEnumExtension, ImportEnum.IMPORT_BAZ); + + message.setExtension(optionalStringPieceExtension, "124"); + message.setExtension(optionalCordExtension, "125"); + + // ----------------------------------------------------------------- + + message.addExtension(repeatedInt32Extension , 201); + message.addExtension(repeatedInt64Extension , 202L); + message.addExtension(repeatedUint32Extension , 203); + message.addExtension(repeatedUint64Extension , 204L); + message.addExtension(repeatedSint32Extension , 205); + message.addExtension(repeatedSint64Extension , 206L); + message.addExtension(repeatedFixed32Extension , 207); + message.addExtension(repeatedFixed64Extension , 208L); + message.addExtension(repeatedSfixed32Extension, 209); + message.addExtension(repeatedSfixed64Extension, 210L); + message.addExtension(repeatedFloatExtension , 211F); + message.addExtension(repeatedDoubleExtension , 212D); + message.addExtension(repeatedBoolExtension , true); + message.addExtension(repeatedStringExtension , "215"); + message.addExtension(repeatedBytesExtension , toBytes("216")); + + message.addExtension(repeatedGroupExtension, + RepeatedGroup_extension.newBuilder().setA(217).build()); + message.addExtension(repeatedNestedMessageExtension, + TestAllTypes.NestedMessage.newBuilder().setBb(218).build()); + message.addExtension(repeatedForeignMessageExtension, + ForeignMessage.newBuilder().setC(219).build()); + message.addExtension(repeatedImportMessageExtension, + ImportMessage.newBuilder().setD(220).build()); + + message.addExtension(repeatedNestedEnumExtension, TestAllTypes.NestedEnum.BAR); + message.addExtension(repeatedForeignEnumExtension, ForeignEnum.FOREIGN_BAR); + message.addExtension(repeatedImportEnumExtension, ImportEnum.IMPORT_BAR); + + message.addExtension(repeatedStringPieceExtension, "224"); + message.addExtension(repeatedCordExtension, "225"); + + // Add a second one of each field. + message.addExtension(repeatedInt32Extension , 301); + message.addExtension(repeatedInt64Extension , 302L); + message.addExtension(repeatedUint32Extension , 303); + message.addExtension(repeatedUint64Extension , 304L); + message.addExtension(repeatedSint32Extension , 305); + message.addExtension(repeatedSint64Extension , 306L); + message.addExtension(repeatedFixed32Extension , 307); + message.addExtension(repeatedFixed64Extension , 308L); + message.addExtension(repeatedSfixed32Extension, 309); + message.addExtension(repeatedSfixed64Extension, 310L); + message.addExtension(repeatedFloatExtension , 311F); + message.addExtension(repeatedDoubleExtension , 312D); + message.addExtension(repeatedBoolExtension , false); + message.addExtension(repeatedStringExtension , "315"); + message.addExtension(repeatedBytesExtension , toBytes("316")); + + message.addExtension(repeatedGroupExtension, + RepeatedGroup_extension.newBuilder().setA(317).build()); + message.addExtension(repeatedNestedMessageExtension, + TestAllTypes.NestedMessage.newBuilder().setBb(318).build()); + message.addExtension(repeatedForeignMessageExtension, + ForeignMessage.newBuilder().setC(319).build()); + message.addExtension(repeatedImportMessageExtension, + ImportMessage.newBuilder().setD(320).build()); + + message.addExtension(repeatedNestedEnumExtension, TestAllTypes.NestedEnum.BAZ); + message.addExtension(repeatedForeignEnumExtension, ForeignEnum.FOREIGN_BAZ); + message.addExtension(repeatedImportEnumExtension, ImportEnum.IMPORT_BAZ); + + message.addExtension(repeatedStringPieceExtension, "324"); + message.addExtension(repeatedCordExtension, "325"); + + // ----------------------------------------------------------------- + + message.setExtension(defaultInt32Extension , 401); + message.setExtension(defaultInt64Extension , 402L); + message.setExtension(defaultUint32Extension , 403); + message.setExtension(defaultUint64Extension , 404L); + message.setExtension(defaultSint32Extension , 405); + message.setExtension(defaultSint64Extension , 406L); + message.setExtension(defaultFixed32Extension , 407); + message.setExtension(defaultFixed64Extension , 408L); + message.setExtension(defaultSfixed32Extension, 409); + message.setExtension(defaultSfixed64Extension, 410L); + message.setExtension(defaultFloatExtension , 411F); + message.setExtension(defaultDoubleExtension , 412D); + message.setExtension(defaultBoolExtension , false); + message.setExtension(defaultStringExtension , "415"); + message.setExtension(defaultBytesExtension , toBytes("416")); + + message.setExtension(defaultNestedEnumExtension, TestAllTypes.NestedEnum.FOO); + message.setExtension(defaultForeignEnumExtension, ForeignEnum.FOREIGN_FOO); + message.setExtension(defaultImportEnumExtension, ImportEnum.IMPORT_FOO); + + message.setExtension(defaultStringPieceExtension, "424"); + message.setExtension(defaultCordExtension, "425"); + } + + // ------------------------------------------------------------------- + + /** + * Modify the repeated extensions of {@code message} to contain the values + * expected by {@code assertRepeatedExtensionsModified()}. + */ + public static void modifyRepeatedExtensions( + TestAllExtensions.Builder message) { + message.setExtension(repeatedInt32Extension , 1, 501); + message.setExtension(repeatedInt64Extension , 1, 502L); + message.setExtension(repeatedUint32Extension , 1, 503); + message.setExtension(repeatedUint64Extension , 1, 504L); + message.setExtension(repeatedSint32Extension , 1, 505); + message.setExtension(repeatedSint64Extension , 1, 506L); + message.setExtension(repeatedFixed32Extension , 1, 507); + message.setExtension(repeatedFixed64Extension , 1, 508L); + message.setExtension(repeatedSfixed32Extension, 1, 509); + message.setExtension(repeatedSfixed64Extension, 1, 510L); + message.setExtension(repeatedFloatExtension , 1, 511F); + message.setExtension(repeatedDoubleExtension , 1, 512D); + message.setExtension(repeatedBoolExtension , 1, true); + message.setExtension(repeatedStringExtension , 1, "515"); + message.setExtension(repeatedBytesExtension , 1, toBytes("516")); + + message.setExtension(repeatedGroupExtension, 1, + RepeatedGroup_extension.newBuilder().setA(517).build()); + message.setExtension(repeatedNestedMessageExtension, 1, + TestAllTypes.NestedMessage.newBuilder().setBb(518).build()); + message.setExtension(repeatedForeignMessageExtension, 1, + ForeignMessage.newBuilder().setC(519).build()); + message.setExtension(repeatedImportMessageExtension, 1, + ImportMessage.newBuilder().setD(520).build()); + + message.setExtension(repeatedNestedEnumExtension , 1, TestAllTypes.NestedEnum.FOO); + message.setExtension(repeatedForeignEnumExtension, 1, ForeignEnum.FOREIGN_FOO); + message.setExtension(repeatedImportEnumExtension , 1, ImportEnum.IMPORT_FOO); + + message.setExtension(repeatedStringPieceExtension, 1, "524"); + message.setExtension(repeatedCordExtension, 1, "525"); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all extensions of + * {@code message} are set to the values assigned by {@code setAllExtensions}. + */ + public static void assertAllExtensionsSet( + TestAllExtensionsOrBuilder message) { + Assert.assertTrue(message.hasExtension(optionalInt32Extension )); + Assert.assertTrue(message.hasExtension(optionalInt64Extension )); + Assert.assertTrue(message.hasExtension(optionalUint32Extension )); + Assert.assertTrue(message.hasExtension(optionalUint64Extension )); + Assert.assertTrue(message.hasExtension(optionalSint32Extension )); + Assert.assertTrue(message.hasExtension(optionalSint64Extension )); + Assert.assertTrue(message.hasExtension(optionalFixed32Extension )); + Assert.assertTrue(message.hasExtension(optionalFixed64Extension )); + Assert.assertTrue(message.hasExtension(optionalSfixed32Extension)); + Assert.assertTrue(message.hasExtension(optionalSfixed64Extension)); + Assert.assertTrue(message.hasExtension(optionalFloatExtension )); + Assert.assertTrue(message.hasExtension(optionalDoubleExtension )); + Assert.assertTrue(message.hasExtension(optionalBoolExtension )); + Assert.assertTrue(message.hasExtension(optionalStringExtension )); + Assert.assertTrue(message.hasExtension(optionalBytesExtension )); + + Assert.assertTrue(message.hasExtension(optionalGroupExtension )); + Assert.assertTrue(message.hasExtension(optionalNestedMessageExtension )); + Assert.assertTrue(message.hasExtension(optionalForeignMessageExtension)); + Assert.assertTrue(message.hasExtension(optionalImportMessageExtension )); + + Assert.assertTrue(message.getExtension(optionalGroupExtension ).hasA()); + Assert.assertTrue(message.getExtension(optionalNestedMessageExtension ).hasBb()); + Assert.assertTrue(message.getExtension(optionalForeignMessageExtension).hasC()); + Assert.assertTrue(message.getExtension(optionalImportMessageExtension ).hasD()); + + Assert.assertTrue(message.hasExtension(optionalNestedEnumExtension )); + Assert.assertTrue(message.hasExtension(optionalForeignEnumExtension)); + Assert.assertTrue(message.hasExtension(optionalImportEnumExtension )); + + Assert.assertTrue(message.hasExtension(optionalStringPieceExtension)); + Assert.assertTrue(message.hasExtension(optionalCordExtension)); + + assertEqualsExactType(101 , message.getExtension(optionalInt32Extension )); + assertEqualsExactType(102L , message.getExtension(optionalInt64Extension )); + assertEqualsExactType(103 , message.getExtension(optionalUint32Extension )); + assertEqualsExactType(104L , message.getExtension(optionalUint64Extension )); + assertEqualsExactType(105 , message.getExtension(optionalSint32Extension )); + assertEqualsExactType(106L , message.getExtension(optionalSint64Extension )); + assertEqualsExactType(107 , message.getExtension(optionalFixed32Extension )); + assertEqualsExactType(108L , message.getExtension(optionalFixed64Extension )); + assertEqualsExactType(109 , message.getExtension(optionalSfixed32Extension)); + assertEqualsExactType(110L , message.getExtension(optionalSfixed64Extension)); + assertEqualsExactType(111F , message.getExtension(optionalFloatExtension )); + assertEqualsExactType(112D , message.getExtension(optionalDoubleExtension )); + assertEqualsExactType(true , message.getExtension(optionalBoolExtension )); + assertEqualsExactType("115", message.getExtension(optionalStringExtension )); + assertEqualsExactType(toBytes("116"), message.getExtension(optionalBytesExtension)); + + assertEqualsExactType(117, message.getExtension(optionalGroupExtension ).getA()); + assertEqualsExactType(118, message.getExtension(optionalNestedMessageExtension ).getBb()); + assertEqualsExactType(119, message.getExtension(optionalForeignMessageExtension).getC()); + assertEqualsExactType(120, message.getExtension(optionalImportMessageExtension ).getD()); + + assertEqualsExactType(TestAllTypes.NestedEnum.BAZ, + message.getExtension(optionalNestedEnumExtension)); + assertEqualsExactType(ForeignEnum.FOREIGN_BAZ, + message.getExtension(optionalForeignEnumExtension)); + assertEqualsExactType(ImportEnum.IMPORT_BAZ, + message.getExtension(optionalImportEnumExtension)); + + assertEqualsExactType("124", message.getExtension(optionalStringPieceExtension)); + assertEqualsExactType("125", message.getExtension(optionalCordExtension)); + + // ----------------------------------------------------------------- + + Assert.assertEquals(2, message.getExtensionCount(repeatedInt32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedInt64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32Extension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64Extension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtension )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtension )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtension)); + + assertEqualsExactType(201 , message.getExtension(repeatedInt32Extension , 0)); + assertEqualsExactType(202L , message.getExtension(repeatedInt64Extension , 0)); + assertEqualsExactType(203 , message.getExtension(repeatedUint32Extension , 0)); + assertEqualsExactType(204L , message.getExtension(repeatedUint64Extension , 0)); + assertEqualsExactType(205 , message.getExtension(repeatedSint32Extension , 0)); + assertEqualsExactType(206L , message.getExtension(repeatedSint64Extension , 0)); + assertEqualsExactType(207 , message.getExtension(repeatedFixed32Extension , 0)); + assertEqualsExactType(208L , message.getExtension(repeatedFixed64Extension , 0)); + assertEqualsExactType(209 , message.getExtension(repeatedSfixed32Extension, 0)); + assertEqualsExactType(210L , message.getExtension(repeatedSfixed64Extension, 0)); + assertEqualsExactType(211F , message.getExtension(repeatedFloatExtension , 0)); + assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtension , 0)); + assertEqualsExactType(true , message.getExtension(repeatedBoolExtension , 0)); + assertEqualsExactType("215", message.getExtension(repeatedStringExtension , 0)); + assertEqualsExactType(toBytes("216"), message.getExtension(repeatedBytesExtension, 0)); + + assertEqualsExactType(217, message.getExtension(repeatedGroupExtension , 0).getA()); + assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtension , 0).getBb()); + assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtension, 0).getC()); + assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtension , 0).getD()); + + assertEqualsExactType(TestAllTypes.NestedEnum.BAR, + message.getExtension(repeatedNestedEnumExtension, 0)); + assertEqualsExactType(ForeignEnum.FOREIGN_BAR, + message.getExtension(repeatedForeignEnumExtension, 0)); + assertEqualsExactType(ImportEnum.IMPORT_BAR, + message.getExtension(repeatedImportEnumExtension, 0)); + + assertEqualsExactType("224", message.getExtension(repeatedStringPieceExtension, 0)); + assertEqualsExactType("225", message.getExtension(repeatedCordExtension, 0)); + + assertEqualsExactType(301 , message.getExtension(repeatedInt32Extension , 1)); + assertEqualsExactType(302L , message.getExtension(repeatedInt64Extension , 1)); + assertEqualsExactType(303 , message.getExtension(repeatedUint32Extension , 1)); + assertEqualsExactType(304L , message.getExtension(repeatedUint64Extension , 1)); + assertEqualsExactType(305 , message.getExtension(repeatedSint32Extension , 1)); + assertEqualsExactType(306L , message.getExtension(repeatedSint64Extension , 1)); + assertEqualsExactType(307 , message.getExtension(repeatedFixed32Extension , 1)); + assertEqualsExactType(308L , message.getExtension(repeatedFixed64Extension , 1)); + assertEqualsExactType(309 , message.getExtension(repeatedSfixed32Extension, 1)); + assertEqualsExactType(310L , message.getExtension(repeatedSfixed64Extension, 1)); + assertEqualsExactType(311F , message.getExtension(repeatedFloatExtension , 1)); + assertEqualsExactType(312D , message.getExtension(repeatedDoubleExtension , 1)); + assertEqualsExactType(false, message.getExtension(repeatedBoolExtension , 1)); + assertEqualsExactType("315", message.getExtension(repeatedStringExtension , 1)); + assertEqualsExactType(toBytes("316"), message.getExtension(repeatedBytesExtension, 1)); + + assertEqualsExactType(317, message.getExtension(repeatedGroupExtension , 1).getA()); + assertEqualsExactType(318, message.getExtension(repeatedNestedMessageExtension , 1).getBb()); + assertEqualsExactType(319, message.getExtension(repeatedForeignMessageExtension, 1).getC()); + assertEqualsExactType(320, message.getExtension(repeatedImportMessageExtension , 1).getD()); + + assertEqualsExactType(TestAllTypes.NestedEnum.BAZ, + message.getExtension(repeatedNestedEnumExtension, 1)); + assertEqualsExactType(ForeignEnum.FOREIGN_BAZ, + message.getExtension(repeatedForeignEnumExtension, 1)); + assertEqualsExactType(ImportEnum.IMPORT_BAZ, + message.getExtension(repeatedImportEnumExtension, 1)); + + assertEqualsExactType("324", message.getExtension(repeatedStringPieceExtension, 1)); + assertEqualsExactType("325", message.getExtension(repeatedCordExtension, 1)); + + // ----------------------------------------------------------------- + + Assert.assertTrue(message.hasExtension(defaultInt32Extension )); + Assert.assertTrue(message.hasExtension(defaultInt64Extension )); + Assert.assertTrue(message.hasExtension(defaultUint32Extension )); + Assert.assertTrue(message.hasExtension(defaultUint64Extension )); + Assert.assertTrue(message.hasExtension(defaultSint32Extension )); + Assert.assertTrue(message.hasExtension(defaultSint64Extension )); + Assert.assertTrue(message.hasExtension(defaultFixed32Extension )); + Assert.assertTrue(message.hasExtension(defaultFixed64Extension )); + Assert.assertTrue(message.hasExtension(defaultSfixed32Extension)); + Assert.assertTrue(message.hasExtension(defaultSfixed64Extension)); + Assert.assertTrue(message.hasExtension(defaultFloatExtension )); + Assert.assertTrue(message.hasExtension(defaultDoubleExtension )); + Assert.assertTrue(message.hasExtension(defaultBoolExtension )); + Assert.assertTrue(message.hasExtension(defaultStringExtension )); + Assert.assertTrue(message.hasExtension(defaultBytesExtension )); + + Assert.assertTrue(message.hasExtension(defaultNestedEnumExtension )); + Assert.assertTrue(message.hasExtension(defaultForeignEnumExtension)); + Assert.assertTrue(message.hasExtension(defaultImportEnumExtension )); + + Assert.assertTrue(message.hasExtension(defaultStringPieceExtension)); + Assert.assertTrue(message.hasExtension(defaultCordExtension)); + + assertEqualsExactType(401 , message.getExtension(defaultInt32Extension )); + assertEqualsExactType(402L , message.getExtension(defaultInt64Extension )); + assertEqualsExactType(403 , message.getExtension(defaultUint32Extension )); + assertEqualsExactType(404L , message.getExtension(defaultUint64Extension )); + assertEqualsExactType(405 , message.getExtension(defaultSint32Extension )); + assertEqualsExactType(406L , message.getExtension(defaultSint64Extension )); + assertEqualsExactType(407 , message.getExtension(defaultFixed32Extension )); + assertEqualsExactType(408L , message.getExtension(defaultFixed64Extension )); + assertEqualsExactType(409 , message.getExtension(defaultSfixed32Extension)); + assertEqualsExactType(410L , message.getExtension(defaultSfixed64Extension)); + assertEqualsExactType(411F , message.getExtension(defaultFloatExtension )); + assertEqualsExactType(412D , message.getExtension(defaultDoubleExtension )); + assertEqualsExactType(false, message.getExtension(defaultBoolExtension )); + assertEqualsExactType("415", message.getExtension(defaultStringExtension )); + assertEqualsExactType(toBytes("416"), message.getExtension(defaultBytesExtension)); + + assertEqualsExactType(TestAllTypes.NestedEnum.FOO, + message.getExtension(defaultNestedEnumExtension )); + assertEqualsExactType(ForeignEnum.FOREIGN_FOO, + message.getExtension(defaultForeignEnumExtension)); + assertEqualsExactType(ImportEnum.IMPORT_FOO, + message.getExtension(defaultImportEnumExtension)); + + assertEqualsExactType("424", message.getExtension(defaultStringPieceExtension)); + assertEqualsExactType("425", message.getExtension(defaultCordExtension)); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all extensions of + * {@code message} are cleared, and that getting the extensions returns their + * default values. + */ + public static void assertExtensionsClear(TestAllExtensionsOrBuilder message) { + // hasBlah() should initially be false for all optional fields. + Assert.assertFalse(message.hasExtension(optionalInt32Extension )); + Assert.assertFalse(message.hasExtension(optionalInt64Extension )); + Assert.assertFalse(message.hasExtension(optionalUint32Extension )); + Assert.assertFalse(message.hasExtension(optionalUint64Extension )); + Assert.assertFalse(message.hasExtension(optionalSint32Extension )); + Assert.assertFalse(message.hasExtension(optionalSint64Extension )); + Assert.assertFalse(message.hasExtension(optionalFixed32Extension )); + Assert.assertFalse(message.hasExtension(optionalFixed64Extension )); + Assert.assertFalse(message.hasExtension(optionalSfixed32Extension)); + Assert.assertFalse(message.hasExtension(optionalSfixed64Extension)); + Assert.assertFalse(message.hasExtension(optionalFloatExtension )); + Assert.assertFalse(message.hasExtension(optionalDoubleExtension )); + Assert.assertFalse(message.hasExtension(optionalBoolExtension )); + Assert.assertFalse(message.hasExtension(optionalStringExtension )); + Assert.assertFalse(message.hasExtension(optionalBytesExtension )); + + Assert.assertFalse(message.hasExtension(optionalGroupExtension )); + Assert.assertFalse(message.hasExtension(optionalNestedMessageExtension )); + Assert.assertFalse(message.hasExtension(optionalForeignMessageExtension)); + Assert.assertFalse(message.hasExtension(optionalImportMessageExtension )); + + Assert.assertFalse(message.hasExtension(optionalNestedEnumExtension )); + Assert.assertFalse(message.hasExtension(optionalForeignEnumExtension)); + Assert.assertFalse(message.hasExtension(optionalImportEnumExtension )); + + Assert.assertFalse(message.hasExtension(optionalStringPieceExtension)); + Assert.assertFalse(message.hasExtension(optionalCordExtension)); + + // Optional fields without defaults are set to zero or something like it. + assertEqualsExactType(0 , message.getExtension(optionalInt32Extension )); + assertEqualsExactType(0L , message.getExtension(optionalInt64Extension )); + assertEqualsExactType(0 , message.getExtension(optionalUint32Extension )); + assertEqualsExactType(0L , message.getExtension(optionalUint64Extension )); + assertEqualsExactType(0 , message.getExtension(optionalSint32Extension )); + assertEqualsExactType(0L , message.getExtension(optionalSint64Extension )); + assertEqualsExactType(0 , message.getExtension(optionalFixed32Extension )); + assertEqualsExactType(0L , message.getExtension(optionalFixed64Extension )); + assertEqualsExactType(0 , message.getExtension(optionalSfixed32Extension)); + assertEqualsExactType(0L , message.getExtension(optionalSfixed64Extension)); + assertEqualsExactType(0F , message.getExtension(optionalFloatExtension )); + assertEqualsExactType(0D , message.getExtension(optionalDoubleExtension )); + assertEqualsExactType(false, message.getExtension(optionalBoolExtension )); + assertEqualsExactType("" , message.getExtension(optionalStringExtension )); + assertEqualsExactType(ByteString.EMPTY, message.getExtension(optionalBytesExtension)); + + // Embedded messages should also be clear. + Assert.assertFalse(message.getExtension(optionalGroupExtension ).hasA()); + Assert.assertFalse(message.getExtension(optionalNestedMessageExtension ).hasBb()); + Assert.assertFalse(message.getExtension(optionalForeignMessageExtension).hasC()); + Assert.assertFalse(message.getExtension(optionalImportMessageExtension ).hasD()); + + assertEqualsExactType(0, message.getExtension(optionalGroupExtension ).getA()); + assertEqualsExactType(0, message.getExtension(optionalNestedMessageExtension ).getBb()); + assertEqualsExactType(0, message.getExtension(optionalForeignMessageExtension).getC()); + assertEqualsExactType(0, message.getExtension(optionalImportMessageExtension ).getD()); + + // Enums without defaults are set to the first value in the enum. + assertEqualsExactType(TestAllTypes.NestedEnum.FOO, + message.getExtension(optionalNestedEnumExtension )); + assertEqualsExactType(ForeignEnum.FOREIGN_FOO, + message.getExtension(optionalForeignEnumExtension)); + assertEqualsExactType(ImportEnum.IMPORT_FOO, + message.getExtension(optionalImportEnumExtension)); + + assertEqualsExactType("", message.getExtension(optionalStringPieceExtension)); + assertEqualsExactType("", message.getExtension(optionalCordExtension)); + + // Repeated fields are empty. + Assert.assertEquals(0, message.getExtensionCount(repeatedInt32Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedInt64Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedUint32Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedUint64Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedSint32Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedSint64Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedFixed32Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedFixed64Extension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed32Extension)); + Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed64Extension)); + Assert.assertEquals(0, message.getExtensionCount(repeatedFloatExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedDoubleExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedBoolExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedStringExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedBytesExtension )); + + Assert.assertEquals(0, message.getExtensionCount(repeatedGroupExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedNestedMessageExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedForeignMessageExtension)); + Assert.assertEquals(0, message.getExtensionCount(repeatedImportMessageExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedNestedEnumExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedForeignEnumExtension )); + Assert.assertEquals(0, message.getExtensionCount(repeatedImportEnumExtension )); + + Assert.assertEquals(0, message.getExtensionCount(repeatedStringPieceExtension)); + Assert.assertEquals(0, message.getExtensionCount(repeatedCordExtension)); + + // Repeated fields are empty via getExtension().size(). + Assert.assertEquals(0, message.getExtension(repeatedInt32Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedInt64Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedUint32Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedUint64Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedSint32Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedSint64Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedFixed32Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedFixed64Extension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedSfixed32Extension).size()); + Assert.assertEquals(0, message.getExtension(repeatedSfixed64Extension).size()); + Assert.assertEquals(0, message.getExtension(repeatedFloatExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedDoubleExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedBoolExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedStringExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedBytesExtension ).size()); + + Assert.assertEquals(0, message.getExtension(repeatedGroupExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedNestedMessageExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedForeignMessageExtension).size()); + Assert.assertEquals(0, message.getExtension(repeatedImportMessageExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedNestedEnumExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedForeignEnumExtension ).size()); + Assert.assertEquals(0, message.getExtension(repeatedImportEnumExtension ).size()); + + Assert.assertEquals(0, message.getExtension(repeatedStringPieceExtension).size()); + Assert.assertEquals(0, message.getExtension(repeatedCordExtension).size()); + + // hasBlah() should also be false for all default fields. + Assert.assertFalse(message.hasExtension(defaultInt32Extension )); + Assert.assertFalse(message.hasExtension(defaultInt64Extension )); + Assert.assertFalse(message.hasExtension(defaultUint32Extension )); + Assert.assertFalse(message.hasExtension(defaultUint64Extension )); + Assert.assertFalse(message.hasExtension(defaultSint32Extension )); + Assert.assertFalse(message.hasExtension(defaultSint64Extension )); + Assert.assertFalse(message.hasExtension(defaultFixed32Extension )); + Assert.assertFalse(message.hasExtension(defaultFixed64Extension )); + Assert.assertFalse(message.hasExtension(defaultSfixed32Extension)); + Assert.assertFalse(message.hasExtension(defaultSfixed64Extension)); + Assert.assertFalse(message.hasExtension(defaultFloatExtension )); + Assert.assertFalse(message.hasExtension(defaultDoubleExtension )); + Assert.assertFalse(message.hasExtension(defaultBoolExtension )); + Assert.assertFalse(message.hasExtension(defaultStringExtension )); + Assert.assertFalse(message.hasExtension(defaultBytesExtension )); + + Assert.assertFalse(message.hasExtension(defaultNestedEnumExtension )); + Assert.assertFalse(message.hasExtension(defaultForeignEnumExtension)); + Assert.assertFalse(message.hasExtension(defaultImportEnumExtension )); + + Assert.assertFalse(message.hasExtension(defaultStringPieceExtension)); + Assert.assertFalse(message.hasExtension(defaultCordExtension)); + + // Fields with defaults have their default values (duh). + assertEqualsExactType( 41 , message.getExtension(defaultInt32Extension )); + assertEqualsExactType( 42L , message.getExtension(defaultInt64Extension )); + assertEqualsExactType( 43 , message.getExtension(defaultUint32Extension )); + assertEqualsExactType( 44L , message.getExtension(defaultUint64Extension )); + assertEqualsExactType(-45 , message.getExtension(defaultSint32Extension )); + assertEqualsExactType( 46L , message.getExtension(defaultSint64Extension )); + assertEqualsExactType( 47 , message.getExtension(defaultFixed32Extension )); + assertEqualsExactType( 48L , message.getExtension(defaultFixed64Extension )); + assertEqualsExactType( 49 , message.getExtension(defaultSfixed32Extension)); + assertEqualsExactType(-50L , message.getExtension(defaultSfixed64Extension)); + assertEqualsExactType( 51.5F , message.getExtension(defaultFloatExtension )); + assertEqualsExactType( 52e3D , message.getExtension(defaultDoubleExtension )); + assertEqualsExactType(true , message.getExtension(defaultBoolExtension )); + assertEqualsExactType("hello", message.getExtension(defaultStringExtension )); + assertEqualsExactType(toBytes("world"), message.getExtension(defaultBytesExtension)); + + assertEqualsExactType(TestAllTypes.NestedEnum.BAR, + message.getExtension(defaultNestedEnumExtension )); + assertEqualsExactType(ForeignEnum.FOREIGN_BAR, + message.getExtension(defaultForeignEnumExtension)); + assertEqualsExactType(ImportEnum.IMPORT_BAR, + message.getExtension(defaultImportEnumExtension)); + + assertEqualsExactType("abc", message.getExtension(defaultStringPieceExtension)); + assertEqualsExactType("123", message.getExtension(defaultCordExtension)); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all extensions of + * {@code message} are set to the values assigned by {@code setAllExtensions} + * followed by {@code modifyRepeatedExtensions}. + */ + public static void assertRepeatedExtensionsModified( + TestAllExtensionsOrBuilder message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + Assert.assertEquals(2, message.getExtensionCount(repeatedInt32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedInt64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64Extension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32Extension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64Extension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtension )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtension )); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtension )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtension)); + Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtension)); + + assertEqualsExactType(201 , message.getExtension(repeatedInt32Extension , 0)); + assertEqualsExactType(202L , message.getExtension(repeatedInt64Extension , 0)); + assertEqualsExactType(203 , message.getExtension(repeatedUint32Extension , 0)); + assertEqualsExactType(204L , message.getExtension(repeatedUint64Extension , 0)); + assertEqualsExactType(205 , message.getExtension(repeatedSint32Extension , 0)); + assertEqualsExactType(206L , message.getExtension(repeatedSint64Extension , 0)); + assertEqualsExactType(207 , message.getExtension(repeatedFixed32Extension , 0)); + assertEqualsExactType(208L , message.getExtension(repeatedFixed64Extension , 0)); + assertEqualsExactType(209 , message.getExtension(repeatedSfixed32Extension, 0)); + assertEqualsExactType(210L , message.getExtension(repeatedSfixed64Extension, 0)); + assertEqualsExactType(211F , message.getExtension(repeatedFloatExtension , 0)); + assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtension , 0)); + assertEqualsExactType(true , message.getExtension(repeatedBoolExtension , 0)); + assertEqualsExactType("215", message.getExtension(repeatedStringExtension , 0)); + assertEqualsExactType(toBytes("216"), message.getExtension(repeatedBytesExtension, 0)); + + assertEqualsExactType(217, message.getExtension(repeatedGroupExtension , 0).getA()); + assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtension , 0).getBb()); + assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtension, 0).getC()); + assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtension , 0).getD()); + + assertEqualsExactType(TestAllTypes.NestedEnum.BAR, + message.getExtension(repeatedNestedEnumExtension, 0)); + assertEqualsExactType(ForeignEnum.FOREIGN_BAR, + message.getExtension(repeatedForeignEnumExtension, 0)); + assertEqualsExactType(ImportEnum.IMPORT_BAR, + message.getExtension(repeatedImportEnumExtension, 0)); + + assertEqualsExactType("224", message.getExtension(repeatedStringPieceExtension, 0)); + assertEqualsExactType("225", message.getExtension(repeatedCordExtension, 0)); + + // Actually verify the second (modified) elements now. + assertEqualsExactType(501 , message.getExtension(repeatedInt32Extension , 1)); + assertEqualsExactType(502L , message.getExtension(repeatedInt64Extension , 1)); + assertEqualsExactType(503 , message.getExtension(repeatedUint32Extension , 1)); + assertEqualsExactType(504L , message.getExtension(repeatedUint64Extension , 1)); + assertEqualsExactType(505 , message.getExtension(repeatedSint32Extension , 1)); + assertEqualsExactType(506L , message.getExtension(repeatedSint64Extension , 1)); + assertEqualsExactType(507 , message.getExtension(repeatedFixed32Extension , 1)); + assertEqualsExactType(508L , message.getExtension(repeatedFixed64Extension , 1)); + assertEqualsExactType(509 , message.getExtension(repeatedSfixed32Extension, 1)); + assertEqualsExactType(510L , message.getExtension(repeatedSfixed64Extension, 1)); + assertEqualsExactType(511F , message.getExtension(repeatedFloatExtension , 1)); + assertEqualsExactType(512D , message.getExtension(repeatedDoubleExtension , 1)); + assertEqualsExactType(true , message.getExtension(repeatedBoolExtension , 1)); + assertEqualsExactType("515", message.getExtension(repeatedStringExtension , 1)); + assertEqualsExactType(toBytes("516"), message.getExtension(repeatedBytesExtension, 1)); + + assertEqualsExactType(517, message.getExtension(repeatedGroupExtension , 1).getA()); + assertEqualsExactType(518, message.getExtension(repeatedNestedMessageExtension , 1).getBb()); + assertEqualsExactType(519, message.getExtension(repeatedForeignMessageExtension, 1).getC()); + assertEqualsExactType(520, message.getExtension(repeatedImportMessageExtension , 1).getD()); + + assertEqualsExactType(TestAllTypes.NestedEnum.FOO, + message.getExtension(repeatedNestedEnumExtension, 1)); + assertEqualsExactType(ForeignEnum.FOREIGN_FOO, + message.getExtension(repeatedForeignEnumExtension, 1)); + assertEqualsExactType(ImportEnum.IMPORT_FOO, + message.getExtension(repeatedImportEnumExtension, 1)); + + assertEqualsExactType("524", message.getExtension(repeatedStringPieceExtension, 1)); + assertEqualsExactType("525", message.getExtension(repeatedCordExtension, 1)); + } + + public static void setPackedExtensions(TestPackedExtensions.Builder message) { + message.addExtension(packedInt32Extension , 601); + message.addExtension(packedInt64Extension , 602L); + message.addExtension(packedUint32Extension , 603); + message.addExtension(packedUint64Extension , 604L); + message.addExtension(packedSint32Extension , 605); + message.addExtension(packedSint64Extension , 606L); + message.addExtension(packedFixed32Extension , 607); + message.addExtension(packedFixed64Extension , 608L); + message.addExtension(packedSfixed32Extension, 609); + message.addExtension(packedSfixed64Extension, 610L); + message.addExtension(packedFloatExtension , 611F); + message.addExtension(packedDoubleExtension , 612D); + message.addExtension(packedBoolExtension , true); + message.addExtension(packedEnumExtension, ForeignEnum.FOREIGN_BAR); + // Add a second one of each field. + message.addExtension(packedInt32Extension , 701); + message.addExtension(packedInt64Extension , 702L); + message.addExtension(packedUint32Extension , 703); + message.addExtension(packedUint64Extension , 704L); + message.addExtension(packedSint32Extension , 705); + message.addExtension(packedSint64Extension , 706L); + message.addExtension(packedFixed32Extension , 707); + message.addExtension(packedFixed64Extension , 708L); + message.addExtension(packedSfixed32Extension, 709); + message.addExtension(packedSfixed64Extension, 710L); + message.addExtension(packedFloatExtension , 711F); + message.addExtension(packedDoubleExtension , 712D); + message.addExtension(packedBoolExtension , false); + message.addExtension(packedEnumExtension, ForeignEnum.FOREIGN_BAZ); + } + + public static void assertPackedExtensionsSet(TestPackedExtensions message) { + Assert.assertEquals(2, message.getExtensionCount(packedInt32Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedInt64Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedUint32Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedUint64Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedSint32Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedSint64Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedFixed32Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedFixed64Extension )); + Assert.assertEquals(2, message.getExtensionCount(packedSfixed32Extension)); + Assert.assertEquals(2, message.getExtensionCount(packedSfixed64Extension)); + Assert.assertEquals(2, message.getExtensionCount(packedFloatExtension )); + Assert.assertEquals(2, message.getExtensionCount(packedDoubleExtension )); + Assert.assertEquals(2, message.getExtensionCount(packedBoolExtension )); + Assert.assertEquals(2, message.getExtensionCount(packedEnumExtension)); + assertEqualsExactType(601 , message.getExtension(packedInt32Extension , 0)); + assertEqualsExactType(602L , message.getExtension(packedInt64Extension , 0)); + assertEqualsExactType(603 , message.getExtension(packedUint32Extension , 0)); + assertEqualsExactType(604L , message.getExtension(packedUint64Extension , 0)); + assertEqualsExactType(605 , message.getExtension(packedSint32Extension , 0)); + assertEqualsExactType(606L , message.getExtension(packedSint64Extension , 0)); + assertEqualsExactType(607 , message.getExtension(packedFixed32Extension , 0)); + assertEqualsExactType(608L , message.getExtension(packedFixed64Extension , 0)); + assertEqualsExactType(609 , message.getExtension(packedSfixed32Extension, 0)); + assertEqualsExactType(610L , message.getExtension(packedSfixed64Extension, 0)); + assertEqualsExactType(611F , message.getExtension(packedFloatExtension , 0)); + assertEqualsExactType(612D , message.getExtension(packedDoubleExtension , 0)); + assertEqualsExactType(true , message.getExtension(packedBoolExtension , 0)); + assertEqualsExactType(ForeignEnum.FOREIGN_BAR, + message.getExtension(packedEnumExtension, 0)); + assertEqualsExactType(701 , message.getExtension(packedInt32Extension , 1)); + assertEqualsExactType(702L , message.getExtension(packedInt64Extension , 1)); + assertEqualsExactType(703 , message.getExtension(packedUint32Extension , 1)); + assertEqualsExactType(704L , message.getExtension(packedUint64Extension , 1)); + assertEqualsExactType(705 , message.getExtension(packedSint32Extension , 1)); + assertEqualsExactType(706L , message.getExtension(packedSint64Extension , 1)); + assertEqualsExactType(707 , message.getExtension(packedFixed32Extension , 1)); + assertEqualsExactType(708L , message.getExtension(packedFixed64Extension , 1)); + assertEqualsExactType(709 , message.getExtension(packedSfixed32Extension, 1)); + assertEqualsExactType(710L , message.getExtension(packedSfixed64Extension, 1)); + assertEqualsExactType(711F , message.getExtension(packedFloatExtension , 1)); + assertEqualsExactType(712D , message.getExtension(packedDoubleExtension , 1)); + assertEqualsExactType(false, message.getExtension(packedBoolExtension , 1)); + assertEqualsExactType(ForeignEnum.FOREIGN_BAZ, + message.getExtension(packedEnumExtension, 1)); + } + + // =================================================================== + // Lite extensions + + /** + * Set every field of {@code message} to the values expected by + * {@code assertAllExtensionsSet()}. + */ + public static void setAllExtensions(TestAllExtensionsLite.Builder message) { + message.setExtension(optionalInt32ExtensionLite , 101); + message.setExtension(optionalInt64ExtensionLite , 102L); + message.setExtension(optionalUint32ExtensionLite , 103); + message.setExtension(optionalUint64ExtensionLite , 104L); + message.setExtension(optionalSint32ExtensionLite , 105); + message.setExtension(optionalSint64ExtensionLite , 106L); + message.setExtension(optionalFixed32ExtensionLite , 107); + message.setExtension(optionalFixed64ExtensionLite , 108L); + message.setExtension(optionalSfixed32ExtensionLite, 109); + message.setExtension(optionalSfixed64ExtensionLite, 110L); + message.setExtension(optionalFloatExtensionLite , 111F); + message.setExtension(optionalDoubleExtensionLite , 112D); + message.setExtension(optionalBoolExtensionLite , true); + message.setExtension(optionalStringExtensionLite , "115"); + message.setExtension(optionalBytesExtensionLite , toBytes("116")); + + message.setExtension(optionalGroupExtensionLite, + OptionalGroup_extension_lite.newBuilder().setA(117).build()); + message.setExtension(optionalNestedMessageExtensionLite, + TestAllTypesLite.NestedMessage.newBuilder().setBb(118).build()); + message.setExtension(optionalForeignMessageExtensionLite, + ForeignMessageLite.newBuilder().setC(119).build()); + message.setExtension(optionalImportMessageExtensionLite, + ImportMessageLite.newBuilder().setD(120).build()); + + message.setExtension(optionalNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.BAZ); + message.setExtension(optionalForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAZ); + message.setExtension(optionalImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ); + + message.setExtension(optionalStringPieceExtensionLite, "124"); + message.setExtension(optionalCordExtensionLite, "125"); + + // ----------------------------------------------------------------- + + message.addExtension(repeatedInt32ExtensionLite , 201); + message.addExtension(repeatedInt64ExtensionLite , 202L); + message.addExtension(repeatedUint32ExtensionLite , 203); + message.addExtension(repeatedUint64ExtensionLite , 204L); + message.addExtension(repeatedSint32ExtensionLite , 205); + message.addExtension(repeatedSint64ExtensionLite , 206L); + message.addExtension(repeatedFixed32ExtensionLite , 207); + message.addExtension(repeatedFixed64ExtensionLite , 208L); + message.addExtension(repeatedSfixed32ExtensionLite, 209); + message.addExtension(repeatedSfixed64ExtensionLite, 210L); + message.addExtension(repeatedFloatExtensionLite , 211F); + message.addExtension(repeatedDoubleExtensionLite , 212D); + message.addExtension(repeatedBoolExtensionLite , true); + message.addExtension(repeatedStringExtensionLite , "215"); + message.addExtension(repeatedBytesExtensionLite , toBytes("216")); + + message.addExtension(repeatedGroupExtensionLite, + RepeatedGroup_extension_lite.newBuilder().setA(217).build()); + message.addExtension(repeatedNestedMessageExtensionLite, + TestAllTypesLite.NestedMessage.newBuilder().setBb(218).build()); + message.addExtension(repeatedForeignMessageExtensionLite, + ForeignMessageLite.newBuilder().setC(219).build()); + message.addExtension(repeatedImportMessageExtensionLite, + ImportMessageLite.newBuilder().setD(220).build()); + + message.addExtension(repeatedNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.BAR); + message.addExtension(repeatedForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAR); + message.addExtension(repeatedImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAR); + + message.addExtension(repeatedStringPieceExtensionLite, "224"); + message.addExtension(repeatedCordExtensionLite, "225"); + + // Add a second one of each field. + message.addExtension(repeatedInt32ExtensionLite , 301); + message.addExtension(repeatedInt64ExtensionLite , 302L); + message.addExtension(repeatedUint32ExtensionLite , 303); + message.addExtension(repeatedUint64ExtensionLite , 304L); + message.addExtension(repeatedSint32ExtensionLite , 305); + message.addExtension(repeatedSint64ExtensionLite , 306L); + message.addExtension(repeatedFixed32ExtensionLite , 307); + message.addExtension(repeatedFixed64ExtensionLite , 308L); + message.addExtension(repeatedSfixed32ExtensionLite, 309); + message.addExtension(repeatedSfixed64ExtensionLite, 310L); + message.addExtension(repeatedFloatExtensionLite , 311F); + message.addExtension(repeatedDoubleExtensionLite , 312D); + message.addExtension(repeatedBoolExtensionLite , false); + message.addExtension(repeatedStringExtensionLite , "315"); + message.addExtension(repeatedBytesExtensionLite , toBytes("316")); + + message.addExtension(repeatedGroupExtensionLite, + RepeatedGroup_extension_lite.newBuilder().setA(317).build()); + message.addExtension(repeatedNestedMessageExtensionLite, + TestAllTypesLite.NestedMessage.newBuilder().setBb(318).build()); + message.addExtension(repeatedForeignMessageExtensionLite, + ForeignMessageLite.newBuilder().setC(319).build()); + message.addExtension(repeatedImportMessageExtensionLite, + ImportMessageLite.newBuilder().setD(320).build()); + + message.addExtension(repeatedNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.BAZ); + message.addExtension(repeatedForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAZ); + message.addExtension(repeatedImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ); + + message.addExtension(repeatedStringPieceExtensionLite, "324"); + message.addExtension(repeatedCordExtensionLite, "325"); + + // ----------------------------------------------------------------- + + message.setExtension(defaultInt32ExtensionLite , 401); + message.setExtension(defaultInt64ExtensionLite , 402L); + message.setExtension(defaultUint32ExtensionLite , 403); + message.setExtension(defaultUint64ExtensionLite , 404L); + message.setExtension(defaultSint32ExtensionLite , 405); + message.setExtension(defaultSint64ExtensionLite , 406L); + message.setExtension(defaultFixed32ExtensionLite , 407); + message.setExtension(defaultFixed64ExtensionLite , 408L); + message.setExtension(defaultSfixed32ExtensionLite, 409); + message.setExtension(defaultSfixed64ExtensionLite, 410L); + message.setExtension(defaultFloatExtensionLite , 411F); + message.setExtension(defaultDoubleExtensionLite , 412D); + message.setExtension(defaultBoolExtensionLite , false); + message.setExtension(defaultStringExtensionLite , "415"); + message.setExtension(defaultBytesExtensionLite , toBytes("416")); + + message.setExtension(defaultNestedEnumExtensionLite, TestAllTypesLite.NestedEnum.FOO); + message.setExtension(defaultForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_FOO); + message.setExtension(defaultImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_FOO); + + message.setExtension(defaultStringPieceExtensionLite, "424"); + message.setExtension(defaultCordExtensionLite, "425"); + } + + // ------------------------------------------------------------------- + + /** + * Modify the repeated extensions of {@code message} to contain the values + * expected by {@code assertRepeatedExtensionsModified()}. + */ + public static void modifyRepeatedExtensions( + TestAllExtensionsLite.Builder message) { + message.setExtension(repeatedInt32ExtensionLite , 1, 501); + message.setExtension(repeatedInt64ExtensionLite , 1, 502L); + message.setExtension(repeatedUint32ExtensionLite , 1, 503); + message.setExtension(repeatedUint64ExtensionLite , 1, 504L); + message.setExtension(repeatedSint32ExtensionLite , 1, 505); + message.setExtension(repeatedSint64ExtensionLite , 1, 506L); + message.setExtension(repeatedFixed32ExtensionLite , 1, 507); + message.setExtension(repeatedFixed64ExtensionLite , 1, 508L); + message.setExtension(repeatedSfixed32ExtensionLite, 1, 509); + message.setExtension(repeatedSfixed64ExtensionLite, 1, 510L); + message.setExtension(repeatedFloatExtensionLite , 1, 511F); + message.setExtension(repeatedDoubleExtensionLite , 1, 512D); + message.setExtension(repeatedBoolExtensionLite , 1, true); + message.setExtension(repeatedStringExtensionLite , 1, "515"); + message.setExtension(repeatedBytesExtensionLite , 1, toBytes("516")); + + message.setExtension(repeatedGroupExtensionLite, 1, + RepeatedGroup_extension_lite.newBuilder().setA(517).build()); + message.setExtension(repeatedNestedMessageExtensionLite, 1, + TestAllTypesLite.NestedMessage.newBuilder().setBb(518).build()); + message.setExtension(repeatedForeignMessageExtensionLite, 1, + ForeignMessageLite.newBuilder().setC(519).build()); + message.setExtension(repeatedImportMessageExtensionLite, 1, + ImportMessageLite.newBuilder().setD(520).build()); + + message.setExtension(repeatedNestedEnumExtensionLite , 1, TestAllTypesLite.NestedEnum.FOO); + message.setExtension(repeatedForeignEnumExtensionLite, 1, ForeignEnumLite.FOREIGN_LITE_FOO); + message.setExtension(repeatedImportEnumExtensionLite , 1, ImportEnumLite.IMPORT_LITE_FOO); + + message.setExtension(repeatedStringPieceExtensionLite, 1, "524"); + message.setExtension(repeatedCordExtensionLite, 1, "525"); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all extensions of + * {@code message} are set to the values assigned by {@code setAllExtensions}. + */ + public static void assertAllExtensionsSet( + TestAllExtensionsLiteOrBuilder message) { + Assert.assertTrue(message.hasExtension(optionalInt32ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalInt64ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalUint32ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalUint64ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalSint32ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalSint64ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalFixed32ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalFixed64ExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalSfixed32ExtensionLite)); + Assert.assertTrue(message.hasExtension(optionalSfixed64ExtensionLite)); + Assert.assertTrue(message.hasExtension(optionalFloatExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalDoubleExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalBoolExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalStringExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalBytesExtensionLite )); + + Assert.assertTrue(message.hasExtension(optionalGroupExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalNestedMessageExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalForeignMessageExtensionLite)); + Assert.assertTrue(message.hasExtension(optionalImportMessageExtensionLite )); + + Assert.assertTrue(message.getExtension(optionalGroupExtensionLite ).hasA()); + Assert.assertTrue(message.getExtension(optionalNestedMessageExtensionLite ).hasBb()); + Assert.assertTrue(message.getExtension(optionalForeignMessageExtensionLite).hasC()); + Assert.assertTrue(message.getExtension(optionalImportMessageExtensionLite ).hasD()); + + Assert.assertTrue(message.hasExtension(optionalNestedEnumExtensionLite )); + Assert.assertTrue(message.hasExtension(optionalForeignEnumExtensionLite)); + Assert.assertTrue(message.hasExtension(optionalImportEnumExtensionLite )); + + Assert.assertTrue(message.hasExtension(optionalStringPieceExtensionLite)); + Assert.assertTrue(message.hasExtension(optionalCordExtensionLite)); + + assertEqualsExactType(101 , message.getExtension(optionalInt32ExtensionLite )); + assertEqualsExactType(102L , message.getExtension(optionalInt64ExtensionLite )); + assertEqualsExactType(103 , message.getExtension(optionalUint32ExtensionLite )); + assertEqualsExactType(104L , message.getExtension(optionalUint64ExtensionLite )); + assertEqualsExactType(105 , message.getExtension(optionalSint32ExtensionLite )); + assertEqualsExactType(106L , message.getExtension(optionalSint64ExtensionLite )); + assertEqualsExactType(107 , message.getExtension(optionalFixed32ExtensionLite )); + assertEqualsExactType(108L , message.getExtension(optionalFixed64ExtensionLite )); + assertEqualsExactType(109 , message.getExtension(optionalSfixed32ExtensionLite)); + assertEqualsExactType(110L , message.getExtension(optionalSfixed64ExtensionLite)); + assertEqualsExactType(111F , message.getExtension(optionalFloatExtensionLite )); + assertEqualsExactType(112D , message.getExtension(optionalDoubleExtensionLite )); + assertEqualsExactType(true , message.getExtension(optionalBoolExtensionLite )); + assertEqualsExactType("115", message.getExtension(optionalStringExtensionLite )); + assertEqualsExactType(toBytes("116"), message.getExtension(optionalBytesExtensionLite)); + + assertEqualsExactType(117, message.getExtension(optionalGroupExtensionLite ).getA()); + assertEqualsExactType(118, message.getExtension(optionalNestedMessageExtensionLite ).getBb()); + assertEqualsExactType(119, message.getExtension(optionalForeignMessageExtensionLite).getC()); + assertEqualsExactType(120, message.getExtension(optionalImportMessageExtensionLite ).getD()); + + assertEqualsExactType(TestAllTypesLite.NestedEnum.BAZ, + message.getExtension(optionalNestedEnumExtensionLite)); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAZ, + message.getExtension(optionalForeignEnumExtensionLite)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAZ, + message.getExtension(optionalImportEnumExtensionLite)); + + assertEqualsExactType("124", message.getExtension(optionalStringPieceExtensionLite)); + assertEqualsExactType("125", message.getExtension(optionalCordExtensionLite)); + + // ----------------------------------------------------------------- + + Assert.assertEquals(2, message.getExtensionCount(repeatedInt32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedInt64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32ExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64ExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtensionLite )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtensionLite )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtensionLite)); + + assertEqualsExactType(201 , message.getExtension(repeatedInt32ExtensionLite , 0)); + assertEqualsExactType(202L , message.getExtension(repeatedInt64ExtensionLite , 0)); + assertEqualsExactType(203 , message.getExtension(repeatedUint32ExtensionLite , 0)); + assertEqualsExactType(204L , message.getExtension(repeatedUint64ExtensionLite , 0)); + assertEqualsExactType(205 , message.getExtension(repeatedSint32ExtensionLite , 0)); + assertEqualsExactType(206L , message.getExtension(repeatedSint64ExtensionLite , 0)); + assertEqualsExactType(207 , message.getExtension(repeatedFixed32ExtensionLite , 0)); + assertEqualsExactType(208L , message.getExtension(repeatedFixed64ExtensionLite , 0)); + assertEqualsExactType(209 , message.getExtension(repeatedSfixed32ExtensionLite, 0)); + assertEqualsExactType(210L , message.getExtension(repeatedSfixed64ExtensionLite, 0)); + assertEqualsExactType(211F , message.getExtension(repeatedFloatExtensionLite , 0)); + assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtensionLite , 0)); + assertEqualsExactType(true , message.getExtension(repeatedBoolExtensionLite , 0)); + assertEqualsExactType("215", message.getExtension(repeatedStringExtensionLite , 0)); + assertEqualsExactType(toBytes("216"), message.getExtension(repeatedBytesExtensionLite, 0)); + + assertEqualsExactType(217, message.getExtension(repeatedGroupExtensionLite ,0).getA()); + assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtensionLite ,0).getBb()); + assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtensionLite,0).getC()); + assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtensionLite ,0).getD()); + + assertEqualsExactType(TestAllTypesLite.NestedEnum.BAR, + message.getExtension(repeatedNestedEnumExtensionLite, 0)); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR, + message.getExtension(repeatedForeignEnumExtensionLite, 0)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAR, + message.getExtension(repeatedImportEnumExtensionLite, 0)); + + assertEqualsExactType("224", message.getExtension(repeatedStringPieceExtensionLite, 0)); + assertEqualsExactType("225", message.getExtension(repeatedCordExtensionLite, 0)); + + assertEqualsExactType(301 , message.getExtension(repeatedInt32ExtensionLite , 1)); + assertEqualsExactType(302L , message.getExtension(repeatedInt64ExtensionLite , 1)); + assertEqualsExactType(303 , message.getExtension(repeatedUint32ExtensionLite , 1)); + assertEqualsExactType(304L , message.getExtension(repeatedUint64ExtensionLite , 1)); + assertEqualsExactType(305 , message.getExtension(repeatedSint32ExtensionLite , 1)); + assertEqualsExactType(306L , message.getExtension(repeatedSint64ExtensionLite , 1)); + assertEqualsExactType(307 , message.getExtension(repeatedFixed32ExtensionLite , 1)); + assertEqualsExactType(308L , message.getExtension(repeatedFixed64ExtensionLite , 1)); + assertEqualsExactType(309 , message.getExtension(repeatedSfixed32ExtensionLite, 1)); + assertEqualsExactType(310L , message.getExtension(repeatedSfixed64ExtensionLite, 1)); + assertEqualsExactType(311F , message.getExtension(repeatedFloatExtensionLite , 1)); + assertEqualsExactType(312D , message.getExtension(repeatedDoubleExtensionLite , 1)); + assertEqualsExactType(false, message.getExtension(repeatedBoolExtensionLite , 1)); + assertEqualsExactType("315", message.getExtension(repeatedStringExtensionLite , 1)); + assertEqualsExactType(toBytes("316"), message.getExtension(repeatedBytesExtensionLite, 1)); + + assertEqualsExactType(317, message.getExtension(repeatedGroupExtensionLite ,1).getA()); + assertEqualsExactType(318, message.getExtension(repeatedNestedMessageExtensionLite ,1).getBb()); + assertEqualsExactType(319, message.getExtension(repeatedForeignMessageExtensionLite,1).getC()); + assertEqualsExactType(320, message.getExtension(repeatedImportMessageExtensionLite ,1).getD()); + + assertEqualsExactType(TestAllTypesLite.NestedEnum.BAZ, + message.getExtension(repeatedNestedEnumExtensionLite, 1)); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAZ, + message.getExtension(repeatedForeignEnumExtensionLite, 1)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAZ, + message.getExtension(repeatedImportEnumExtensionLite, 1)); + + assertEqualsExactType("324", message.getExtension(repeatedStringPieceExtensionLite, 1)); + assertEqualsExactType("325", message.getExtension(repeatedCordExtensionLite, 1)); + + // ----------------------------------------------------------------- + + Assert.assertTrue(message.hasExtension(defaultInt32ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultInt64ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultUint32ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultUint64ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultSint32ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultSint64ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultFixed32ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultFixed64ExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultSfixed32ExtensionLite)); + Assert.assertTrue(message.hasExtension(defaultSfixed64ExtensionLite)); + Assert.assertTrue(message.hasExtension(defaultFloatExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultDoubleExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultBoolExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultStringExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultBytesExtensionLite )); + + Assert.assertTrue(message.hasExtension(defaultNestedEnumExtensionLite )); + Assert.assertTrue(message.hasExtension(defaultForeignEnumExtensionLite)); + Assert.assertTrue(message.hasExtension(defaultImportEnumExtensionLite )); + + Assert.assertTrue(message.hasExtension(defaultStringPieceExtensionLite)); + Assert.assertTrue(message.hasExtension(defaultCordExtensionLite)); + + assertEqualsExactType(401 , message.getExtension(defaultInt32ExtensionLite )); + assertEqualsExactType(402L , message.getExtension(defaultInt64ExtensionLite )); + assertEqualsExactType(403 , message.getExtension(defaultUint32ExtensionLite )); + assertEqualsExactType(404L , message.getExtension(defaultUint64ExtensionLite )); + assertEqualsExactType(405 , message.getExtension(defaultSint32ExtensionLite )); + assertEqualsExactType(406L , message.getExtension(defaultSint64ExtensionLite )); + assertEqualsExactType(407 , message.getExtension(defaultFixed32ExtensionLite )); + assertEqualsExactType(408L , message.getExtension(defaultFixed64ExtensionLite )); + assertEqualsExactType(409 , message.getExtension(defaultSfixed32ExtensionLite)); + assertEqualsExactType(410L , message.getExtension(defaultSfixed64ExtensionLite)); + assertEqualsExactType(411F , message.getExtension(defaultFloatExtensionLite )); + assertEqualsExactType(412D , message.getExtension(defaultDoubleExtensionLite )); + assertEqualsExactType(false, message.getExtension(defaultBoolExtensionLite )); + assertEqualsExactType("415", message.getExtension(defaultStringExtensionLite )); + assertEqualsExactType(toBytes("416"), message.getExtension(defaultBytesExtensionLite)); + + assertEqualsExactType(TestAllTypesLite.NestedEnum.FOO, + message.getExtension(defaultNestedEnumExtensionLite )); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_FOO, + message.getExtension(defaultForeignEnumExtensionLite)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_FOO, + message.getExtension(defaultImportEnumExtensionLite)); + + assertEqualsExactType("424", message.getExtension(defaultStringPieceExtensionLite)); + assertEqualsExactType("425", message.getExtension(defaultCordExtensionLite)); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all extensions of + * {@code message} are cleared, and that getting the extensions returns their + * default values. + */ + public static void assertExtensionsClear( + TestAllExtensionsLiteOrBuilder message) { + // hasBlah() should initially be false for all optional fields. + Assert.assertFalse(message.hasExtension(optionalInt32ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalInt64ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalUint32ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalUint64ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalSint32ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalSint64ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalFixed32ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalFixed64ExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalSfixed32ExtensionLite)); + Assert.assertFalse(message.hasExtension(optionalSfixed64ExtensionLite)); + Assert.assertFalse(message.hasExtension(optionalFloatExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalDoubleExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalBoolExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalStringExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalBytesExtensionLite )); + + Assert.assertFalse(message.hasExtension(optionalGroupExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalNestedMessageExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalForeignMessageExtensionLite)); + Assert.assertFalse(message.hasExtension(optionalImportMessageExtensionLite )); + + Assert.assertFalse(message.hasExtension(optionalNestedEnumExtensionLite )); + Assert.assertFalse(message.hasExtension(optionalForeignEnumExtensionLite)); + Assert.assertFalse(message.hasExtension(optionalImportEnumExtensionLite )); + + Assert.assertFalse(message.hasExtension(optionalStringPieceExtensionLite)); + Assert.assertFalse(message.hasExtension(optionalCordExtensionLite)); + + // Optional fields without defaults are set to zero or something like it. + assertEqualsExactType(0 , message.getExtension(optionalInt32ExtensionLite )); + assertEqualsExactType(0L , message.getExtension(optionalInt64ExtensionLite )); + assertEqualsExactType(0 , message.getExtension(optionalUint32ExtensionLite )); + assertEqualsExactType(0L , message.getExtension(optionalUint64ExtensionLite )); + assertEqualsExactType(0 , message.getExtension(optionalSint32ExtensionLite )); + assertEqualsExactType(0L , message.getExtension(optionalSint64ExtensionLite )); + assertEqualsExactType(0 , message.getExtension(optionalFixed32ExtensionLite )); + assertEqualsExactType(0L , message.getExtension(optionalFixed64ExtensionLite )); + assertEqualsExactType(0 , message.getExtension(optionalSfixed32ExtensionLite)); + assertEqualsExactType(0L , message.getExtension(optionalSfixed64ExtensionLite)); + assertEqualsExactType(0F , message.getExtension(optionalFloatExtensionLite )); + assertEqualsExactType(0D , message.getExtension(optionalDoubleExtensionLite )); + assertEqualsExactType(false, message.getExtension(optionalBoolExtensionLite )); + assertEqualsExactType("" , message.getExtension(optionalStringExtensionLite )); + assertEqualsExactType(ByteString.EMPTY, message.getExtension(optionalBytesExtensionLite)); + + // Embedded messages should also be clear. + Assert.assertFalse(message.getExtension(optionalGroupExtensionLite ).hasA()); + Assert.assertFalse(message.getExtension(optionalNestedMessageExtensionLite ).hasBb()); + Assert.assertFalse(message.getExtension(optionalForeignMessageExtensionLite).hasC()); + Assert.assertFalse(message.getExtension(optionalImportMessageExtensionLite ).hasD()); + + assertEqualsExactType(0, message.getExtension(optionalGroupExtensionLite ).getA()); + assertEqualsExactType(0, message.getExtension(optionalNestedMessageExtensionLite ).getBb()); + assertEqualsExactType(0, message.getExtension(optionalForeignMessageExtensionLite).getC()); + assertEqualsExactType(0, message.getExtension(optionalImportMessageExtensionLite ).getD()); + + // Enums without defaults are set to the first value in the enum. + assertEqualsExactType(TestAllTypesLite.NestedEnum.FOO, + message.getExtension(optionalNestedEnumExtensionLite )); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_FOO, + message.getExtension(optionalForeignEnumExtensionLite)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_FOO, + message.getExtension(optionalImportEnumExtensionLite)); + + assertEqualsExactType("", message.getExtension(optionalStringPieceExtensionLite)); + assertEqualsExactType("", message.getExtension(optionalCordExtensionLite)); + + // Repeated fields are empty. + Assert.assertEquals(0, message.getExtensionCount(repeatedInt32ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedInt64ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedUint32ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedUint64ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedSint32ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedSint64ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedFixed32ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedFixed64ExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed32ExtensionLite)); + Assert.assertEquals(0, message.getExtensionCount(repeatedSfixed64ExtensionLite)); + Assert.assertEquals(0, message.getExtensionCount(repeatedFloatExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedDoubleExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedBoolExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedStringExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedBytesExtensionLite )); + + Assert.assertEquals(0, message.getExtensionCount(repeatedGroupExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedNestedMessageExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedForeignMessageExtensionLite)); + Assert.assertEquals(0, message.getExtensionCount(repeatedImportMessageExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedNestedEnumExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedForeignEnumExtensionLite )); + Assert.assertEquals(0, message.getExtensionCount(repeatedImportEnumExtensionLite )); + + Assert.assertEquals(0, message.getExtensionCount(repeatedStringPieceExtensionLite)); + Assert.assertEquals(0, message.getExtensionCount(repeatedCordExtensionLite)); + + // hasBlah() should also be false for all default fields. + Assert.assertFalse(message.hasExtension(defaultInt32ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultInt64ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultUint32ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultUint64ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultSint32ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultSint64ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultFixed32ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultFixed64ExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultSfixed32ExtensionLite)); + Assert.assertFalse(message.hasExtension(defaultSfixed64ExtensionLite)); + Assert.assertFalse(message.hasExtension(defaultFloatExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultDoubleExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultBoolExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultStringExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultBytesExtensionLite )); + + Assert.assertFalse(message.hasExtension(defaultNestedEnumExtensionLite )); + Assert.assertFalse(message.hasExtension(defaultForeignEnumExtensionLite)); + Assert.assertFalse(message.hasExtension(defaultImportEnumExtensionLite )); + + Assert.assertFalse(message.hasExtension(defaultStringPieceExtensionLite)); + Assert.assertFalse(message.hasExtension(defaultCordExtensionLite)); + + // Fields with defaults have their default values (duh). + assertEqualsExactType( 41 , message.getExtension(defaultInt32ExtensionLite )); + assertEqualsExactType( 42L , message.getExtension(defaultInt64ExtensionLite )); + assertEqualsExactType( 43 , message.getExtension(defaultUint32ExtensionLite )); + assertEqualsExactType( 44L , message.getExtension(defaultUint64ExtensionLite )); + assertEqualsExactType(-45 , message.getExtension(defaultSint32ExtensionLite )); + assertEqualsExactType( 46L , message.getExtension(defaultSint64ExtensionLite )); + assertEqualsExactType( 47 , message.getExtension(defaultFixed32ExtensionLite )); + assertEqualsExactType( 48L , message.getExtension(defaultFixed64ExtensionLite )); + assertEqualsExactType( 49 , message.getExtension(defaultSfixed32ExtensionLite)); + assertEqualsExactType(-50L , message.getExtension(defaultSfixed64ExtensionLite)); + assertEqualsExactType( 51.5F , message.getExtension(defaultFloatExtensionLite )); + assertEqualsExactType( 52e3D , message.getExtension(defaultDoubleExtensionLite )); + assertEqualsExactType(true , message.getExtension(defaultBoolExtensionLite )); + assertEqualsExactType("hello", message.getExtension(defaultStringExtensionLite )); + assertEqualsExactType(toBytes("world"), message.getExtension(defaultBytesExtensionLite)); + + assertEqualsExactType(TestAllTypesLite.NestedEnum.BAR, + message.getExtension(defaultNestedEnumExtensionLite )); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR, + message.getExtension(defaultForeignEnumExtensionLite)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAR, + message.getExtension(defaultImportEnumExtensionLite)); + + assertEqualsExactType("abc", message.getExtension(defaultStringPieceExtensionLite)); + assertEqualsExactType("123", message.getExtension(defaultCordExtensionLite)); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all extensions of + * {@code message} are set to the values assigned by {@code setAllExtensions} + * followed by {@code modifyRepeatedExtensions}. + */ + public static void assertRepeatedExtensionsModified( + TestAllExtensionsLiteOrBuilder message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + Assert.assertEquals(2, message.getExtensionCount(repeatedInt32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedInt64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedUint64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSint64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedFixed64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed32ExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedSfixed64ExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedFloatExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedDoubleExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBoolExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedStringExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedBytesExtensionLite )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedGroupExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedMessageExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignMessageExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportMessageExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedNestedEnumExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedForeignEnumExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(repeatedImportEnumExtensionLite )); + + Assert.assertEquals(2, message.getExtensionCount(repeatedStringPieceExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(repeatedCordExtensionLite)); + + assertEqualsExactType(201 , message.getExtension(repeatedInt32ExtensionLite , 0)); + assertEqualsExactType(202L , message.getExtension(repeatedInt64ExtensionLite , 0)); + assertEqualsExactType(203 , message.getExtension(repeatedUint32ExtensionLite , 0)); + assertEqualsExactType(204L , message.getExtension(repeatedUint64ExtensionLite , 0)); + assertEqualsExactType(205 , message.getExtension(repeatedSint32ExtensionLite , 0)); + assertEqualsExactType(206L , message.getExtension(repeatedSint64ExtensionLite , 0)); + assertEqualsExactType(207 , message.getExtension(repeatedFixed32ExtensionLite , 0)); + assertEqualsExactType(208L , message.getExtension(repeatedFixed64ExtensionLite , 0)); + assertEqualsExactType(209 , message.getExtension(repeatedSfixed32ExtensionLite, 0)); + assertEqualsExactType(210L , message.getExtension(repeatedSfixed64ExtensionLite, 0)); + assertEqualsExactType(211F , message.getExtension(repeatedFloatExtensionLite , 0)); + assertEqualsExactType(212D , message.getExtension(repeatedDoubleExtensionLite , 0)); + assertEqualsExactType(true , message.getExtension(repeatedBoolExtensionLite , 0)); + assertEqualsExactType("215", message.getExtension(repeatedStringExtensionLite , 0)); + assertEqualsExactType(toBytes("216"), message.getExtension(repeatedBytesExtensionLite, 0)); + + assertEqualsExactType(217, message.getExtension(repeatedGroupExtensionLite ,0).getA()); + assertEqualsExactType(218, message.getExtension(repeatedNestedMessageExtensionLite ,0).getBb()); + assertEqualsExactType(219, message.getExtension(repeatedForeignMessageExtensionLite,0).getC()); + assertEqualsExactType(220, message.getExtension(repeatedImportMessageExtensionLite ,0).getD()); + + assertEqualsExactType(TestAllTypesLite.NestedEnum.BAR, + message.getExtension(repeatedNestedEnumExtensionLite, 0)); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR, + message.getExtension(repeatedForeignEnumExtensionLite, 0)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_BAR, + message.getExtension(repeatedImportEnumExtensionLite, 0)); + + assertEqualsExactType("224", message.getExtension(repeatedStringPieceExtensionLite, 0)); + assertEqualsExactType("225", message.getExtension(repeatedCordExtensionLite, 0)); + + // Actually verify the second (modified) elements now. + assertEqualsExactType(501 , message.getExtension(repeatedInt32ExtensionLite , 1)); + assertEqualsExactType(502L , message.getExtension(repeatedInt64ExtensionLite , 1)); + assertEqualsExactType(503 , message.getExtension(repeatedUint32ExtensionLite , 1)); + assertEqualsExactType(504L , message.getExtension(repeatedUint64ExtensionLite , 1)); + assertEqualsExactType(505 , message.getExtension(repeatedSint32ExtensionLite , 1)); + assertEqualsExactType(506L , message.getExtension(repeatedSint64ExtensionLite , 1)); + assertEqualsExactType(507 , message.getExtension(repeatedFixed32ExtensionLite , 1)); + assertEqualsExactType(508L , message.getExtension(repeatedFixed64ExtensionLite , 1)); + assertEqualsExactType(509 , message.getExtension(repeatedSfixed32ExtensionLite, 1)); + assertEqualsExactType(510L , message.getExtension(repeatedSfixed64ExtensionLite, 1)); + assertEqualsExactType(511F , message.getExtension(repeatedFloatExtensionLite , 1)); + assertEqualsExactType(512D , message.getExtension(repeatedDoubleExtensionLite , 1)); + assertEqualsExactType(true , message.getExtension(repeatedBoolExtensionLite , 1)); + assertEqualsExactType("515", message.getExtension(repeatedStringExtensionLite , 1)); + assertEqualsExactType(toBytes("516"), message.getExtension(repeatedBytesExtensionLite, 1)); + + assertEqualsExactType(517, message.getExtension(repeatedGroupExtensionLite ,1).getA()); + assertEqualsExactType(518, message.getExtension(repeatedNestedMessageExtensionLite ,1).getBb()); + assertEqualsExactType(519, message.getExtension(repeatedForeignMessageExtensionLite,1).getC()); + assertEqualsExactType(520, message.getExtension(repeatedImportMessageExtensionLite ,1).getD()); + + assertEqualsExactType(TestAllTypesLite.NestedEnum.FOO, + message.getExtension(repeatedNestedEnumExtensionLite, 1)); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_FOO, + message.getExtension(repeatedForeignEnumExtensionLite, 1)); + assertEqualsExactType(ImportEnumLite.IMPORT_LITE_FOO, + message.getExtension(repeatedImportEnumExtensionLite, 1)); + + assertEqualsExactType("524", message.getExtension(repeatedStringPieceExtensionLite, 1)); + assertEqualsExactType("525", message.getExtension(repeatedCordExtensionLite, 1)); + } + + public static void setPackedExtensions(TestPackedExtensionsLite.Builder message) { + message.addExtension(packedInt32ExtensionLite , 601); + message.addExtension(packedInt64ExtensionLite , 602L); + message.addExtension(packedUint32ExtensionLite , 603); + message.addExtension(packedUint64ExtensionLite , 604L); + message.addExtension(packedSint32ExtensionLite , 605); + message.addExtension(packedSint64ExtensionLite , 606L); + message.addExtension(packedFixed32ExtensionLite , 607); + message.addExtension(packedFixed64ExtensionLite , 608L); + message.addExtension(packedSfixed32ExtensionLite, 609); + message.addExtension(packedSfixed64ExtensionLite, 610L); + message.addExtension(packedFloatExtensionLite , 611F); + message.addExtension(packedDoubleExtensionLite , 612D); + message.addExtension(packedBoolExtensionLite , true); + message.addExtension(packedEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAR); + // Add a second one of each field. + message.addExtension(packedInt32ExtensionLite , 701); + message.addExtension(packedInt64ExtensionLite , 702L); + message.addExtension(packedUint32ExtensionLite , 703); + message.addExtension(packedUint64ExtensionLite , 704L); + message.addExtension(packedSint32ExtensionLite , 705); + message.addExtension(packedSint64ExtensionLite , 706L); + message.addExtension(packedFixed32ExtensionLite , 707); + message.addExtension(packedFixed64ExtensionLite , 708L); + message.addExtension(packedSfixed32ExtensionLite, 709); + message.addExtension(packedSfixed64ExtensionLite, 710L); + message.addExtension(packedFloatExtensionLite , 711F); + message.addExtension(packedDoubleExtensionLite , 712D); + message.addExtension(packedBoolExtensionLite , false); + message.addExtension(packedEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_BAZ); + } + + public static void assertPackedExtensionsSet(TestPackedExtensionsLite message) { + Assert.assertEquals(2, message.getExtensionCount(packedInt32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedInt64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedUint32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedUint64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedSint32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedSint64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedFixed32ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedFixed64ExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedSfixed32ExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(packedSfixed64ExtensionLite)); + Assert.assertEquals(2, message.getExtensionCount(packedFloatExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedDoubleExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedBoolExtensionLite )); + Assert.assertEquals(2, message.getExtensionCount(packedEnumExtensionLite)); + assertEqualsExactType(601 , message.getExtension(packedInt32ExtensionLite , 0)); + assertEqualsExactType(602L , message.getExtension(packedInt64ExtensionLite , 0)); + assertEqualsExactType(603 , message.getExtension(packedUint32ExtensionLite , 0)); + assertEqualsExactType(604L , message.getExtension(packedUint64ExtensionLite , 0)); + assertEqualsExactType(605 , message.getExtension(packedSint32ExtensionLite , 0)); + assertEqualsExactType(606L , message.getExtension(packedSint64ExtensionLite , 0)); + assertEqualsExactType(607 , message.getExtension(packedFixed32ExtensionLite , 0)); + assertEqualsExactType(608L , message.getExtension(packedFixed64ExtensionLite , 0)); + assertEqualsExactType(609 , message.getExtension(packedSfixed32ExtensionLite, 0)); + assertEqualsExactType(610L , message.getExtension(packedSfixed64ExtensionLite, 0)); + assertEqualsExactType(611F , message.getExtension(packedFloatExtensionLite , 0)); + assertEqualsExactType(612D , message.getExtension(packedDoubleExtensionLite , 0)); + assertEqualsExactType(true , message.getExtension(packedBoolExtensionLite , 0)); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAR, + message.getExtension(packedEnumExtensionLite, 0)); + assertEqualsExactType(701 , message.getExtension(packedInt32ExtensionLite , 1)); + assertEqualsExactType(702L , message.getExtension(packedInt64ExtensionLite , 1)); + assertEqualsExactType(703 , message.getExtension(packedUint32ExtensionLite , 1)); + assertEqualsExactType(704L , message.getExtension(packedUint64ExtensionLite , 1)); + assertEqualsExactType(705 , message.getExtension(packedSint32ExtensionLite , 1)); + assertEqualsExactType(706L , message.getExtension(packedSint64ExtensionLite , 1)); + assertEqualsExactType(707 , message.getExtension(packedFixed32ExtensionLite , 1)); + assertEqualsExactType(708L , message.getExtension(packedFixed64ExtensionLite , 1)); + assertEqualsExactType(709 , message.getExtension(packedSfixed32ExtensionLite, 1)); + assertEqualsExactType(710L , message.getExtension(packedSfixed64ExtensionLite, 1)); + assertEqualsExactType(711F , message.getExtension(packedFloatExtensionLite , 1)); + assertEqualsExactType(712D , message.getExtension(packedDoubleExtensionLite , 1)); + assertEqualsExactType(false, message.getExtension(packedBoolExtensionLite , 1)); + assertEqualsExactType(ForeignEnumLite.FOREIGN_LITE_BAZ, + message.getExtension(packedEnumExtensionLite, 1)); + } + + // ================================================================= + + /** + * Performs the same things that the methods of {@code TestUtil} do, but + * via the reflection interface. This is its own class because it needs + * to know what descriptor to use. + */ + public static class ReflectionTester { + private final Descriptors.Descriptor baseDescriptor; + private final ExtensionRegistry extensionRegistry; + + private final Descriptors.FileDescriptor file; + private final Descriptors.FileDescriptor importFile; + + private final Descriptors.Descriptor optionalGroup; + private final Descriptors.Descriptor repeatedGroup; + private final Descriptors.Descriptor nestedMessage; + private final Descriptors.Descriptor foreignMessage; + private final Descriptors.Descriptor importMessage; + + private final Descriptors.FieldDescriptor groupA; + private final Descriptors.FieldDescriptor repeatedGroupA; + private final Descriptors.FieldDescriptor nestedB; + private final Descriptors.FieldDescriptor foreignC; + private final Descriptors.FieldDescriptor importD; + + private final Descriptors.EnumDescriptor nestedEnum; + private final Descriptors.EnumDescriptor foreignEnum; + private final Descriptors.EnumDescriptor importEnum; + + private final Descriptors.EnumValueDescriptor nestedFoo; + private final Descriptors.EnumValueDescriptor nestedBar; + private final Descriptors.EnumValueDescriptor nestedBaz; + private final Descriptors.EnumValueDescriptor foreignFoo; + private final Descriptors.EnumValueDescriptor foreignBar; + private final Descriptors.EnumValueDescriptor foreignBaz; + private final Descriptors.EnumValueDescriptor importFoo; + private final Descriptors.EnumValueDescriptor importBar; + private final Descriptors.EnumValueDescriptor importBaz; + + /** + * Construct a {@code ReflectionTester} that will expect messages using + * the given descriptor. + * + * Normally {@code baseDescriptor} should be a descriptor for the type + * {@code TestAllTypes}, defined in + * {@code google/protobuf/unittest.proto}. However, if + * {@code extensionRegistry} is non-null, then {@code baseDescriptor} should + * be for {@code TestAllExtensions} instead, and instead of reading and + * writing normal fields, the tester will read and write extensions. + * All of {@code TestAllExtensions}' extensions must be registered in the + * registry. + */ + public ReflectionTester(Descriptors.Descriptor baseDescriptor, + ExtensionRegistry extensionRegistry) { + this.baseDescriptor = baseDescriptor; + this.extensionRegistry = extensionRegistry; + + this.file = baseDescriptor.getFile(); + Assert.assertEquals(1, file.getDependencies().size()); + this.importFile = file.getDependencies().get(0); + + Descriptors.Descriptor testAllTypes; + if (baseDescriptor.getName() == "TestAllTypes") { + testAllTypes = baseDescriptor; + } else { + testAllTypes = file.findMessageTypeByName("TestAllTypes"); + Assert.assertNotNull(testAllTypes); + } + + if (extensionRegistry == null) { + // Use testAllTypes, rather than baseDescriptor, to allow + // initialization using TestPackedTypes descriptors. These objects + // won't be used by the methods for packed fields. + this.optionalGroup = + testAllTypes.findNestedTypeByName("OptionalGroup"); + this.repeatedGroup = + testAllTypes.findNestedTypeByName("RepeatedGroup"); + } else { + this.optionalGroup = + file.findMessageTypeByName("OptionalGroup_extension"); + this.repeatedGroup = + file.findMessageTypeByName("RepeatedGroup_extension"); + } + this.nestedMessage = testAllTypes.findNestedTypeByName("NestedMessage"); + this.foreignMessage = file.findMessageTypeByName("ForeignMessage"); + this.importMessage = importFile.findMessageTypeByName("ImportMessage"); + + this.nestedEnum = testAllTypes.findEnumTypeByName("NestedEnum"); + this.foreignEnum = file.findEnumTypeByName("ForeignEnum"); + this.importEnum = importFile.findEnumTypeByName("ImportEnum"); + + Assert.assertNotNull(optionalGroup ); + Assert.assertNotNull(repeatedGroup ); + Assert.assertNotNull(nestedMessage ); + Assert.assertNotNull(foreignMessage); + Assert.assertNotNull(importMessage ); + Assert.assertNotNull(nestedEnum ); + Assert.assertNotNull(foreignEnum ); + Assert.assertNotNull(importEnum ); + + this.nestedB = nestedMessage .findFieldByName("bb"); + this.foreignC = foreignMessage.findFieldByName("c"); + this.importD = importMessage .findFieldByName("d"); + this.nestedFoo = nestedEnum.findValueByName("FOO"); + this.nestedBar = nestedEnum.findValueByName("BAR"); + this.nestedBaz = nestedEnum.findValueByName("BAZ"); + this.foreignFoo = foreignEnum.findValueByName("FOREIGN_FOO"); + this.foreignBar = foreignEnum.findValueByName("FOREIGN_BAR"); + this.foreignBaz = foreignEnum.findValueByName("FOREIGN_BAZ"); + this.importFoo = importEnum.findValueByName("IMPORT_FOO"); + this.importBar = importEnum.findValueByName("IMPORT_BAR"); + this.importBaz = importEnum.findValueByName("IMPORT_BAZ"); + + this.groupA = optionalGroup.findFieldByName("a"); + this.repeatedGroupA = repeatedGroup.findFieldByName("a"); + + Assert.assertNotNull(groupA ); + Assert.assertNotNull(repeatedGroupA); + Assert.assertNotNull(nestedB ); + Assert.assertNotNull(foreignC ); + Assert.assertNotNull(importD ); + Assert.assertNotNull(nestedFoo ); + Assert.assertNotNull(nestedBar ); + Assert.assertNotNull(nestedBaz ); + Assert.assertNotNull(foreignFoo ); + Assert.assertNotNull(foreignBar ); + Assert.assertNotNull(foreignBaz ); + Assert.assertNotNull(importFoo ); + Assert.assertNotNull(importBar ); + Assert.assertNotNull(importBaz ); + } + + /** + * Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes. + */ + private Descriptors.FieldDescriptor f(String name) { + Descriptors.FieldDescriptor result; + if (extensionRegistry == null) { + result = baseDescriptor.findFieldByName(name); + } else { + result = file.findExtensionByName(name + "_extension"); + } + Assert.assertNotNull(result); + return result; + } + + /** + * Calls {@code parent.newBuilderForField()} or uses the + * {@code ExtensionRegistry} to find an appropriate builder, depending + * on what type is being tested. + */ + private Message.Builder newBuilderForField( + Message.Builder parent, Descriptors.FieldDescriptor field) { + if (extensionRegistry == null) { + return parent.newBuilderForField(field); + } else { + ExtensionRegistry.ExtensionInfo extension = + extensionRegistry.findExtensionByNumber(field.getContainingType(), + field.getNumber()); + Assert.assertNotNull(extension); + Assert.assertNotNull(extension.defaultInstance); + return extension.defaultInstance.newBuilderForType(); + } + } + + // ------------------------------------------------------------------- + + /** + * Set every field of {@code message} to the values expected by + * {@code assertAllFieldsSet()}, using the {@link Message.Builder} + * reflection interface. + */ + void setAllFieldsViaReflection(Message.Builder message) { + message.setField(f("optional_int32" ), 101 ); + message.setField(f("optional_int64" ), 102L); + message.setField(f("optional_uint32" ), 103 ); + message.setField(f("optional_uint64" ), 104L); + message.setField(f("optional_sint32" ), 105 ); + message.setField(f("optional_sint64" ), 106L); + message.setField(f("optional_fixed32" ), 107 ); + message.setField(f("optional_fixed64" ), 108L); + message.setField(f("optional_sfixed32"), 109 ); + message.setField(f("optional_sfixed64"), 110L); + message.setField(f("optional_float" ), 111F); + message.setField(f("optional_double" ), 112D); + message.setField(f("optional_bool" ), true); + message.setField(f("optional_string" ), "115"); + message.setField(f("optional_bytes" ), toBytes("116")); + + message.setField(f("optionalgroup"), + newBuilderForField(message, f("optionalgroup")) + .setField(groupA, 117).build()); + message.setField(f("optional_nested_message"), + newBuilderForField(message, f("optional_nested_message")) + .setField(nestedB, 118).build()); + message.setField(f("optional_foreign_message"), + newBuilderForField(message, f("optional_foreign_message")) + .setField(foreignC, 119).build()); + message.setField(f("optional_import_message"), + newBuilderForField(message, f("optional_import_message")) + .setField(importD, 120).build()); + + message.setField(f("optional_nested_enum" ), nestedBaz); + message.setField(f("optional_foreign_enum"), foreignBaz); + message.setField(f("optional_import_enum" ), importBaz); + + message.setField(f("optional_string_piece" ), "124"); + message.setField(f("optional_cord" ), "125"); + + // ----------------------------------------------------------------- + + message.addRepeatedField(f("repeated_int32" ), 201 ); + message.addRepeatedField(f("repeated_int64" ), 202L); + message.addRepeatedField(f("repeated_uint32" ), 203 ); + message.addRepeatedField(f("repeated_uint64" ), 204L); + message.addRepeatedField(f("repeated_sint32" ), 205 ); + message.addRepeatedField(f("repeated_sint64" ), 206L); + message.addRepeatedField(f("repeated_fixed32" ), 207 ); + message.addRepeatedField(f("repeated_fixed64" ), 208L); + message.addRepeatedField(f("repeated_sfixed32"), 209 ); + message.addRepeatedField(f("repeated_sfixed64"), 210L); + message.addRepeatedField(f("repeated_float" ), 211F); + message.addRepeatedField(f("repeated_double" ), 212D); + message.addRepeatedField(f("repeated_bool" ), true); + message.addRepeatedField(f("repeated_string" ), "215"); + message.addRepeatedField(f("repeated_bytes" ), toBytes("216")); + + message.addRepeatedField(f("repeatedgroup"), + newBuilderForField(message, f("repeatedgroup")) + .setField(repeatedGroupA, 217).build()); + message.addRepeatedField(f("repeated_nested_message"), + newBuilderForField(message, f("repeated_nested_message")) + .setField(nestedB, 218).build()); + message.addRepeatedField(f("repeated_foreign_message"), + newBuilderForField(message, f("repeated_foreign_message")) + .setField(foreignC, 219).build()); + message.addRepeatedField(f("repeated_import_message"), + newBuilderForField(message, f("repeated_import_message")) + .setField(importD, 220).build()); + + message.addRepeatedField(f("repeated_nested_enum" ), nestedBar); + message.addRepeatedField(f("repeated_foreign_enum"), foreignBar); + message.addRepeatedField(f("repeated_import_enum" ), importBar); + + message.addRepeatedField(f("repeated_string_piece" ), "224"); + message.addRepeatedField(f("repeated_cord" ), "225"); + + // Add a second one of each field. + message.addRepeatedField(f("repeated_int32" ), 301 ); + message.addRepeatedField(f("repeated_int64" ), 302L); + message.addRepeatedField(f("repeated_uint32" ), 303 ); + message.addRepeatedField(f("repeated_uint64" ), 304L); + message.addRepeatedField(f("repeated_sint32" ), 305 ); + message.addRepeatedField(f("repeated_sint64" ), 306L); + message.addRepeatedField(f("repeated_fixed32" ), 307 ); + message.addRepeatedField(f("repeated_fixed64" ), 308L); + message.addRepeatedField(f("repeated_sfixed32"), 309 ); + message.addRepeatedField(f("repeated_sfixed64"), 310L); + message.addRepeatedField(f("repeated_float" ), 311F); + message.addRepeatedField(f("repeated_double" ), 312D); + message.addRepeatedField(f("repeated_bool" ), false); + message.addRepeatedField(f("repeated_string" ), "315"); + message.addRepeatedField(f("repeated_bytes" ), toBytes("316")); + + message.addRepeatedField(f("repeatedgroup"), + newBuilderForField(message, f("repeatedgroup")) + .setField(repeatedGroupA, 317).build()); + message.addRepeatedField(f("repeated_nested_message"), + newBuilderForField(message, f("repeated_nested_message")) + .setField(nestedB, 318).build()); + message.addRepeatedField(f("repeated_foreign_message"), + newBuilderForField(message, f("repeated_foreign_message")) + .setField(foreignC, 319).build()); + message.addRepeatedField(f("repeated_import_message"), + newBuilderForField(message, f("repeated_import_message")) + .setField(importD, 320).build()); + + message.addRepeatedField(f("repeated_nested_enum" ), nestedBaz); + message.addRepeatedField(f("repeated_foreign_enum"), foreignBaz); + message.addRepeatedField(f("repeated_import_enum" ), importBaz); + + message.addRepeatedField(f("repeated_string_piece" ), "324"); + message.addRepeatedField(f("repeated_cord" ), "325"); + + // ----------------------------------------------------------------- + + message.setField(f("default_int32" ), 401 ); + message.setField(f("default_int64" ), 402L); + message.setField(f("default_uint32" ), 403 ); + message.setField(f("default_uint64" ), 404L); + message.setField(f("default_sint32" ), 405 ); + message.setField(f("default_sint64" ), 406L); + message.setField(f("default_fixed32" ), 407 ); + message.setField(f("default_fixed64" ), 408L); + message.setField(f("default_sfixed32"), 409 ); + message.setField(f("default_sfixed64"), 410L); + message.setField(f("default_float" ), 411F); + message.setField(f("default_double" ), 412D); + message.setField(f("default_bool" ), false); + message.setField(f("default_string" ), "415"); + message.setField(f("default_bytes" ), toBytes("416")); + + message.setField(f("default_nested_enum" ), nestedFoo); + message.setField(f("default_foreign_enum"), foreignFoo); + message.setField(f("default_import_enum" ), importFoo); + + message.setField(f("default_string_piece" ), "424"); + message.setField(f("default_cord" ), "425"); + } + + // ------------------------------------------------------------------- + + /** + * Modify the repeated fields of {@code message} to contain the values + * expected by {@code assertRepeatedFieldsModified()}, using the + * {@link Message.Builder} reflection interface. + */ + void modifyRepeatedFieldsViaReflection(Message.Builder message) { + message.setRepeatedField(f("repeated_int32" ), 1, 501 ); + message.setRepeatedField(f("repeated_int64" ), 1, 502L); + message.setRepeatedField(f("repeated_uint32" ), 1, 503 ); + message.setRepeatedField(f("repeated_uint64" ), 1, 504L); + message.setRepeatedField(f("repeated_sint32" ), 1, 505 ); + message.setRepeatedField(f("repeated_sint64" ), 1, 506L); + message.setRepeatedField(f("repeated_fixed32" ), 1, 507 ); + message.setRepeatedField(f("repeated_fixed64" ), 1, 508L); + message.setRepeatedField(f("repeated_sfixed32"), 1, 509 ); + message.setRepeatedField(f("repeated_sfixed64"), 1, 510L); + message.setRepeatedField(f("repeated_float" ), 1, 511F); + message.setRepeatedField(f("repeated_double" ), 1, 512D); + message.setRepeatedField(f("repeated_bool" ), 1, true); + message.setRepeatedField(f("repeated_string" ), 1, "515"); + message.setRepeatedField(f("repeated_bytes" ), 1, toBytes("516")); + + message.setRepeatedField(f("repeatedgroup"), 1, + newBuilderForField(message, f("repeatedgroup")) + .setField(repeatedGroupA, 517).build()); + message.setRepeatedField(f("repeated_nested_message"), 1, + newBuilderForField(message, f("repeated_nested_message")) + .setField(nestedB, 518).build()); + message.setRepeatedField(f("repeated_foreign_message"), 1, + newBuilderForField(message, f("repeated_foreign_message")) + .setField(foreignC, 519).build()); + message.setRepeatedField(f("repeated_import_message"), 1, + newBuilderForField(message, f("repeated_import_message")) + .setField(importD, 520).build()); + + message.setRepeatedField(f("repeated_nested_enum" ), 1, nestedFoo); + message.setRepeatedField(f("repeated_foreign_enum"), 1, foreignFoo); + message.setRepeatedField(f("repeated_import_enum" ), 1, importFoo); + + message.setRepeatedField(f("repeated_string_piece"), 1, "524"); + message.setRepeatedField(f("repeated_cord"), 1, "525"); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all fields of + * {@code message} are set to the values assigned by {@code setAllFields}, + * using the {@link Message} reflection interface. + */ + public void assertAllFieldsSetViaReflection(MessageOrBuilder message) { + Assert.assertTrue(message.hasField(f("optional_int32" ))); + Assert.assertTrue(message.hasField(f("optional_int64" ))); + Assert.assertTrue(message.hasField(f("optional_uint32" ))); + Assert.assertTrue(message.hasField(f("optional_uint64" ))); + Assert.assertTrue(message.hasField(f("optional_sint32" ))); + Assert.assertTrue(message.hasField(f("optional_sint64" ))); + Assert.assertTrue(message.hasField(f("optional_fixed32" ))); + Assert.assertTrue(message.hasField(f("optional_fixed64" ))); + Assert.assertTrue(message.hasField(f("optional_sfixed32"))); + Assert.assertTrue(message.hasField(f("optional_sfixed64"))); + Assert.assertTrue(message.hasField(f("optional_float" ))); + Assert.assertTrue(message.hasField(f("optional_double" ))); + Assert.assertTrue(message.hasField(f("optional_bool" ))); + Assert.assertTrue(message.hasField(f("optional_string" ))); + Assert.assertTrue(message.hasField(f("optional_bytes" ))); + + Assert.assertTrue(message.hasField(f("optionalgroup" ))); + Assert.assertTrue(message.hasField(f("optional_nested_message" ))); + Assert.assertTrue(message.hasField(f("optional_foreign_message"))); + Assert.assertTrue(message.hasField(f("optional_import_message" ))); + + Assert.assertTrue( + ((Message)message.getField(f("optionalgroup"))).hasField(groupA)); + Assert.assertTrue( + ((Message)message.getField(f("optional_nested_message"))) + .hasField(nestedB)); + Assert.assertTrue( + ((Message)message.getField(f("optional_foreign_message"))) + .hasField(foreignC)); + Assert.assertTrue( + ((Message)message.getField(f("optional_import_message"))) + .hasField(importD)); + + Assert.assertTrue(message.hasField(f("optional_nested_enum" ))); + Assert.assertTrue(message.hasField(f("optional_foreign_enum"))); + Assert.assertTrue(message.hasField(f("optional_import_enum" ))); + + Assert.assertTrue(message.hasField(f("optional_string_piece"))); + Assert.assertTrue(message.hasField(f("optional_cord"))); + + Assert.assertEquals(101 , message.getField(f("optional_int32" ))); + Assert.assertEquals(102L , message.getField(f("optional_int64" ))); + Assert.assertEquals(103 , message.getField(f("optional_uint32" ))); + Assert.assertEquals(104L , message.getField(f("optional_uint64" ))); + Assert.assertEquals(105 , message.getField(f("optional_sint32" ))); + Assert.assertEquals(106L , message.getField(f("optional_sint64" ))); + Assert.assertEquals(107 , message.getField(f("optional_fixed32" ))); + Assert.assertEquals(108L , message.getField(f("optional_fixed64" ))); + Assert.assertEquals(109 , message.getField(f("optional_sfixed32"))); + Assert.assertEquals(110L , message.getField(f("optional_sfixed64"))); + Assert.assertEquals(111F , message.getField(f("optional_float" ))); + Assert.assertEquals(112D , message.getField(f("optional_double" ))); + Assert.assertEquals(true , message.getField(f("optional_bool" ))); + Assert.assertEquals("115", message.getField(f("optional_string" ))); + Assert.assertEquals(toBytes("116"), message.getField(f("optional_bytes"))); + + Assert.assertEquals(117, + ((Message)message.getField(f("optionalgroup"))).getField(groupA)); + Assert.assertEquals(118, + ((Message)message.getField(f("optional_nested_message"))) + .getField(nestedB)); + Assert.assertEquals(119, + ((Message)message.getField(f("optional_foreign_message"))) + .getField(foreignC)); + Assert.assertEquals(120, + ((Message)message.getField(f("optional_import_message"))) + .getField(importD)); + + Assert.assertEquals( nestedBaz, message.getField(f("optional_nested_enum" ))); + Assert.assertEquals(foreignBaz, message.getField(f("optional_foreign_enum"))); + Assert.assertEquals( importBaz, message.getField(f("optional_import_enum" ))); + + Assert.assertEquals("124", message.getField(f("optional_string_piece"))); + Assert.assertEquals("125", message.getField(f("optional_cord"))); + + // ----------------------------------------------------------------- + + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed32"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed64"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_float" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_double" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bool" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bytes" ))); + + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeatedgroup" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_message" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_message"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_message" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_enum" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_enum" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_enum" ))); + + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string_piece"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_cord"))); + + Assert.assertEquals(201 , message.getRepeatedField(f("repeated_int32" ), 0)); + Assert.assertEquals(202L , message.getRepeatedField(f("repeated_int64" ), 0)); + Assert.assertEquals(203 , message.getRepeatedField(f("repeated_uint32" ), 0)); + Assert.assertEquals(204L , message.getRepeatedField(f("repeated_uint64" ), 0)); + Assert.assertEquals(205 , message.getRepeatedField(f("repeated_sint32" ), 0)); + Assert.assertEquals(206L , message.getRepeatedField(f("repeated_sint64" ), 0)); + Assert.assertEquals(207 , message.getRepeatedField(f("repeated_fixed32" ), 0)); + Assert.assertEquals(208L , message.getRepeatedField(f("repeated_fixed64" ), 0)); + Assert.assertEquals(209 , message.getRepeatedField(f("repeated_sfixed32"), 0)); + Assert.assertEquals(210L , message.getRepeatedField(f("repeated_sfixed64"), 0)); + Assert.assertEquals(211F , message.getRepeatedField(f("repeated_float" ), 0)); + Assert.assertEquals(212D , message.getRepeatedField(f("repeated_double" ), 0)); + Assert.assertEquals(true , message.getRepeatedField(f("repeated_bool" ), 0)); + Assert.assertEquals("215", message.getRepeatedField(f("repeated_string" ), 0)); + Assert.assertEquals(toBytes("216"), message.getRepeatedField(f("repeated_bytes"), 0)); + + Assert.assertEquals(217, + ((Message)message.getRepeatedField(f("repeatedgroup"), 0)) + .getField(repeatedGroupA)); + Assert.assertEquals(218, + ((Message)message.getRepeatedField(f("repeated_nested_message"), 0)) + .getField(nestedB)); + Assert.assertEquals(219, + ((Message)message.getRepeatedField(f("repeated_foreign_message"), 0)) + .getField(foreignC)); + Assert.assertEquals(220, + ((Message)message.getRepeatedField(f("repeated_import_message"), 0)) + .getField(importD)); + + Assert.assertEquals( nestedBar, message.getRepeatedField(f("repeated_nested_enum" ),0)); + Assert.assertEquals(foreignBar, message.getRepeatedField(f("repeated_foreign_enum"),0)); + Assert.assertEquals( importBar, message.getRepeatedField(f("repeated_import_enum" ),0)); + + Assert.assertEquals("224", message.getRepeatedField(f("repeated_string_piece"), 0)); + Assert.assertEquals("225", message.getRepeatedField(f("repeated_cord"), 0)); + + Assert.assertEquals(301 , message.getRepeatedField(f("repeated_int32" ), 1)); + Assert.assertEquals(302L , message.getRepeatedField(f("repeated_int64" ), 1)); + Assert.assertEquals(303 , message.getRepeatedField(f("repeated_uint32" ), 1)); + Assert.assertEquals(304L , message.getRepeatedField(f("repeated_uint64" ), 1)); + Assert.assertEquals(305 , message.getRepeatedField(f("repeated_sint32" ), 1)); + Assert.assertEquals(306L , message.getRepeatedField(f("repeated_sint64" ), 1)); + Assert.assertEquals(307 , message.getRepeatedField(f("repeated_fixed32" ), 1)); + Assert.assertEquals(308L , message.getRepeatedField(f("repeated_fixed64" ), 1)); + Assert.assertEquals(309 , message.getRepeatedField(f("repeated_sfixed32"), 1)); + Assert.assertEquals(310L , message.getRepeatedField(f("repeated_sfixed64"), 1)); + Assert.assertEquals(311F , message.getRepeatedField(f("repeated_float" ), 1)); + Assert.assertEquals(312D , message.getRepeatedField(f("repeated_double" ), 1)); + Assert.assertEquals(false, message.getRepeatedField(f("repeated_bool" ), 1)); + Assert.assertEquals("315", message.getRepeatedField(f("repeated_string" ), 1)); + Assert.assertEquals(toBytes("316"), message.getRepeatedField(f("repeated_bytes"), 1)); + + Assert.assertEquals(317, + ((Message)message.getRepeatedField(f("repeatedgroup"), 1)) + .getField(repeatedGroupA)); + Assert.assertEquals(318, + ((Message)message.getRepeatedField(f("repeated_nested_message"), 1)) + .getField(nestedB)); + Assert.assertEquals(319, + ((Message)message.getRepeatedField(f("repeated_foreign_message"), 1)) + .getField(foreignC)); + Assert.assertEquals(320, + ((Message)message.getRepeatedField(f("repeated_import_message"), 1)) + .getField(importD)); + + Assert.assertEquals( nestedBaz, message.getRepeatedField(f("repeated_nested_enum" ),1)); + Assert.assertEquals(foreignBaz, message.getRepeatedField(f("repeated_foreign_enum"),1)); + Assert.assertEquals( importBaz, message.getRepeatedField(f("repeated_import_enum" ),1)); + + Assert.assertEquals("324", message.getRepeatedField(f("repeated_string_piece"), 1)); + Assert.assertEquals("325", message.getRepeatedField(f("repeated_cord"), 1)); + + // ----------------------------------------------------------------- + + Assert.assertTrue(message.hasField(f("default_int32" ))); + Assert.assertTrue(message.hasField(f("default_int64" ))); + Assert.assertTrue(message.hasField(f("default_uint32" ))); + Assert.assertTrue(message.hasField(f("default_uint64" ))); + Assert.assertTrue(message.hasField(f("default_sint32" ))); + Assert.assertTrue(message.hasField(f("default_sint64" ))); + Assert.assertTrue(message.hasField(f("default_fixed32" ))); + Assert.assertTrue(message.hasField(f("default_fixed64" ))); + Assert.assertTrue(message.hasField(f("default_sfixed32"))); + Assert.assertTrue(message.hasField(f("default_sfixed64"))); + Assert.assertTrue(message.hasField(f("default_float" ))); + Assert.assertTrue(message.hasField(f("default_double" ))); + Assert.assertTrue(message.hasField(f("default_bool" ))); + Assert.assertTrue(message.hasField(f("default_string" ))); + Assert.assertTrue(message.hasField(f("default_bytes" ))); + + Assert.assertTrue(message.hasField(f("default_nested_enum" ))); + Assert.assertTrue(message.hasField(f("default_foreign_enum"))); + Assert.assertTrue(message.hasField(f("default_import_enum" ))); + + Assert.assertTrue(message.hasField(f("default_string_piece"))); + Assert.assertTrue(message.hasField(f("default_cord"))); + + Assert.assertEquals(401 , message.getField(f("default_int32" ))); + Assert.assertEquals(402L , message.getField(f("default_int64" ))); + Assert.assertEquals(403 , message.getField(f("default_uint32" ))); + Assert.assertEquals(404L , message.getField(f("default_uint64" ))); + Assert.assertEquals(405 , message.getField(f("default_sint32" ))); + Assert.assertEquals(406L , message.getField(f("default_sint64" ))); + Assert.assertEquals(407 , message.getField(f("default_fixed32" ))); + Assert.assertEquals(408L , message.getField(f("default_fixed64" ))); + Assert.assertEquals(409 , message.getField(f("default_sfixed32"))); + Assert.assertEquals(410L , message.getField(f("default_sfixed64"))); + Assert.assertEquals(411F , message.getField(f("default_float" ))); + Assert.assertEquals(412D , message.getField(f("default_double" ))); + Assert.assertEquals(false, message.getField(f("default_bool" ))); + Assert.assertEquals("415", message.getField(f("default_string" ))); + Assert.assertEquals(toBytes("416"), message.getField(f("default_bytes"))); + + Assert.assertEquals( nestedFoo, message.getField(f("default_nested_enum" ))); + Assert.assertEquals(foreignFoo, message.getField(f("default_foreign_enum"))); + Assert.assertEquals( importFoo, message.getField(f("default_import_enum" ))); + + Assert.assertEquals("424", message.getField(f("default_string_piece"))); + Assert.assertEquals("425", message.getField(f("default_cord"))); + } + + // ------------------------------------------------------------------- + + /** + * Assert (using {@code junit.framework.Assert}} that all fields of + * {@code message} are cleared, and that getting the fields returns their + * default values, using the {@link Message} reflection interface. + */ + public void assertClearViaReflection(MessageOrBuilder message) { + // has_blah() should initially be false for all optional fields. + Assert.assertFalse(message.hasField(f("optional_int32" ))); + Assert.assertFalse(message.hasField(f("optional_int64" ))); + Assert.assertFalse(message.hasField(f("optional_uint32" ))); + Assert.assertFalse(message.hasField(f("optional_uint64" ))); + Assert.assertFalse(message.hasField(f("optional_sint32" ))); + Assert.assertFalse(message.hasField(f("optional_sint64" ))); + Assert.assertFalse(message.hasField(f("optional_fixed32" ))); + Assert.assertFalse(message.hasField(f("optional_fixed64" ))); + Assert.assertFalse(message.hasField(f("optional_sfixed32"))); + Assert.assertFalse(message.hasField(f("optional_sfixed64"))); + Assert.assertFalse(message.hasField(f("optional_float" ))); + Assert.assertFalse(message.hasField(f("optional_double" ))); + Assert.assertFalse(message.hasField(f("optional_bool" ))); + Assert.assertFalse(message.hasField(f("optional_string" ))); + Assert.assertFalse(message.hasField(f("optional_bytes" ))); + + Assert.assertFalse(message.hasField(f("optionalgroup" ))); + Assert.assertFalse(message.hasField(f("optional_nested_message" ))); + Assert.assertFalse(message.hasField(f("optional_foreign_message"))); + Assert.assertFalse(message.hasField(f("optional_import_message" ))); + + Assert.assertFalse(message.hasField(f("optional_nested_enum" ))); + Assert.assertFalse(message.hasField(f("optional_foreign_enum"))); + Assert.assertFalse(message.hasField(f("optional_import_enum" ))); + + Assert.assertFalse(message.hasField(f("optional_string_piece"))); + Assert.assertFalse(message.hasField(f("optional_cord"))); + + // Optional fields without defaults are set to zero or something like it. + Assert.assertEquals(0 , message.getField(f("optional_int32" ))); + Assert.assertEquals(0L , message.getField(f("optional_int64" ))); + Assert.assertEquals(0 , message.getField(f("optional_uint32" ))); + Assert.assertEquals(0L , message.getField(f("optional_uint64" ))); + Assert.assertEquals(0 , message.getField(f("optional_sint32" ))); + Assert.assertEquals(0L , message.getField(f("optional_sint64" ))); + Assert.assertEquals(0 , message.getField(f("optional_fixed32" ))); + Assert.assertEquals(0L , message.getField(f("optional_fixed64" ))); + Assert.assertEquals(0 , message.getField(f("optional_sfixed32"))); + Assert.assertEquals(0L , message.getField(f("optional_sfixed64"))); + Assert.assertEquals(0F , message.getField(f("optional_float" ))); + Assert.assertEquals(0D , message.getField(f("optional_double" ))); + Assert.assertEquals(false, message.getField(f("optional_bool" ))); + Assert.assertEquals("" , message.getField(f("optional_string" ))); + Assert.assertEquals(ByteString.EMPTY, message.getField(f("optional_bytes"))); + + // Embedded messages should also be clear. + Assert.assertFalse( + ((Message)message.getField(f("optionalgroup"))).hasField(groupA)); + Assert.assertFalse( + ((Message)message.getField(f("optional_nested_message"))) + .hasField(nestedB)); + Assert.assertFalse( + ((Message)message.getField(f("optional_foreign_message"))) + .hasField(foreignC)); + Assert.assertFalse( + ((Message)message.getField(f("optional_import_message"))) + .hasField(importD)); + + Assert.assertEquals(0, + ((Message)message.getField(f("optionalgroup"))).getField(groupA)); + Assert.assertEquals(0, + ((Message)message.getField(f("optional_nested_message"))) + .getField(nestedB)); + Assert.assertEquals(0, + ((Message)message.getField(f("optional_foreign_message"))) + .getField(foreignC)); + Assert.assertEquals(0, + ((Message)message.getField(f("optional_import_message"))) + .getField(importD)); + + // Enums without defaults are set to the first value in the enum. + Assert.assertEquals( nestedFoo, message.getField(f("optional_nested_enum" ))); + Assert.assertEquals(foreignFoo, message.getField(f("optional_foreign_enum"))); + Assert.assertEquals( importFoo, message.getField(f("optional_import_enum" ))); + + Assert.assertEquals("", message.getField(f("optional_string_piece"))); + Assert.assertEquals("", message.getField(f("optional_cord"))); + + // Repeated fields are empty. + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_int32" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_int64" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_uint32" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_uint64" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sint32" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sint64" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_fixed32" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_fixed64" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sfixed32"))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_sfixed64"))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_float" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_double" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_bool" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_string" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_bytes" ))); + + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeatedgroup" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_nested_message" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_foreign_message"))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_import_message" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_nested_enum" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_foreign_enum" ))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_import_enum" ))); + + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_string_piece"))); + Assert.assertEquals(0, message.getRepeatedFieldCount(f("repeated_cord"))); + + // has_blah() should also be false for all default fields. + Assert.assertFalse(message.hasField(f("default_int32" ))); + Assert.assertFalse(message.hasField(f("default_int64" ))); + Assert.assertFalse(message.hasField(f("default_uint32" ))); + Assert.assertFalse(message.hasField(f("default_uint64" ))); + Assert.assertFalse(message.hasField(f("default_sint32" ))); + Assert.assertFalse(message.hasField(f("default_sint64" ))); + Assert.assertFalse(message.hasField(f("default_fixed32" ))); + Assert.assertFalse(message.hasField(f("default_fixed64" ))); + Assert.assertFalse(message.hasField(f("default_sfixed32"))); + Assert.assertFalse(message.hasField(f("default_sfixed64"))); + Assert.assertFalse(message.hasField(f("default_float" ))); + Assert.assertFalse(message.hasField(f("default_double" ))); + Assert.assertFalse(message.hasField(f("default_bool" ))); + Assert.assertFalse(message.hasField(f("default_string" ))); + Assert.assertFalse(message.hasField(f("default_bytes" ))); + + Assert.assertFalse(message.hasField(f("default_nested_enum" ))); + Assert.assertFalse(message.hasField(f("default_foreign_enum"))); + Assert.assertFalse(message.hasField(f("default_import_enum" ))); + + Assert.assertFalse(message.hasField(f("default_string_piece" ))); + Assert.assertFalse(message.hasField(f("default_cord" ))); + + // Fields with defaults have their default values (duh). + Assert.assertEquals( 41 , message.getField(f("default_int32" ))); + Assert.assertEquals( 42L , message.getField(f("default_int64" ))); + Assert.assertEquals( 43 , message.getField(f("default_uint32" ))); + Assert.assertEquals( 44L , message.getField(f("default_uint64" ))); + Assert.assertEquals(-45 , message.getField(f("default_sint32" ))); + Assert.assertEquals( 46L , message.getField(f("default_sint64" ))); + Assert.assertEquals( 47 , message.getField(f("default_fixed32" ))); + Assert.assertEquals( 48L , message.getField(f("default_fixed64" ))); + Assert.assertEquals( 49 , message.getField(f("default_sfixed32"))); + Assert.assertEquals(-50L , message.getField(f("default_sfixed64"))); + Assert.assertEquals( 51.5F , message.getField(f("default_float" ))); + Assert.assertEquals( 52e3D , message.getField(f("default_double" ))); + Assert.assertEquals(true , message.getField(f("default_bool" ))); + Assert.assertEquals("hello", message.getField(f("default_string" ))); + Assert.assertEquals(toBytes("world"), message.getField(f("default_bytes"))); + + Assert.assertEquals( nestedBar, message.getField(f("default_nested_enum" ))); + Assert.assertEquals(foreignBar, message.getField(f("default_foreign_enum"))); + Assert.assertEquals( importBar, message.getField(f("default_import_enum" ))); + + Assert.assertEquals("abc", message.getField(f("default_string_piece"))); + Assert.assertEquals("123", message.getField(f("default_cord"))); + } + + + // --------------------------------------------------------------- + + public void assertRepeatedFieldsModifiedViaReflection( + MessageOrBuilder message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_int64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_uint64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sint64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_fixed64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed32"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_sfixed64"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_float" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_double" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bool" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_bytes" ))); + + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeatedgroup" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_message" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_message"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_message" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_nested_enum" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_foreign_enum" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_import_enum" ))); + + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_string_piece"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("repeated_cord"))); + + Assert.assertEquals(201 , message.getRepeatedField(f("repeated_int32" ), 0)); + Assert.assertEquals(202L , message.getRepeatedField(f("repeated_int64" ), 0)); + Assert.assertEquals(203 , message.getRepeatedField(f("repeated_uint32" ), 0)); + Assert.assertEquals(204L , message.getRepeatedField(f("repeated_uint64" ), 0)); + Assert.assertEquals(205 , message.getRepeatedField(f("repeated_sint32" ), 0)); + Assert.assertEquals(206L , message.getRepeatedField(f("repeated_sint64" ), 0)); + Assert.assertEquals(207 , message.getRepeatedField(f("repeated_fixed32" ), 0)); + Assert.assertEquals(208L , message.getRepeatedField(f("repeated_fixed64" ), 0)); + Assert.assertEquals(209 , message.getRepeatedField(f("repeated_sfixed32"), 0)); + Assert.assertEquals(210L , message.getRepeatedField(f("repeated_sfixed64"), 0)); + Assert.assertEquals(211F , message.getRepeatedField(f("repeated_float" ), 0)); + Assert.assertEquals(212D , message.getRepeatedField(f("repeated_double" ), 0)); + Assert.assertEquals(true , message.getRepeatedField(f("repeated_bool" ), 0)); + Assert.assertEquals("215", message.getRepeatedField(f("repeated_string" ), 0)); + Assert.assertEquals(toBytes("216"), message.getRepeatedField(f("repeated_bytes"), 0)); + + Assert.assertEquals(217, + ((Message)message.getRepeatedField(f("repeatedgroup"), 0)) + .getField(repeatedGroupA)); + Assert.assertEquals(218, + ((Message)message.getRepeatedField(f("repeated_nested_message"), 0)) + .getField(nestedB)); + Assert.assertEquals(219, + ((Message)message.getRepeatedField(f("repeated_foreign_message"), 0)) + .getField(foreignC)); + Assert.assertEquals(220, + ((Message)message.getRepeatedField(f("repeated_import_message"), 0)) + .getField(importD)); + + Assert.assertEquals( nestedBar, message.getRepeatedField(f("repeated_nested_enum" ),0)); + Assert.assertEquals(foreignBar, message.getRepeatedField(f("repeated_foreign_enum"),0)); + Assert.assertEquals( importBar, message.getRepeatedField(f("repeated_import_enum" ),0)); + + Assert.assertEquals("224", message.getRepeatedField(f("repeated_string_piece"), 0)); + Assert.assertEquals("225", message.getRepeatedField(f("repeated_cord"), 0)); + + Assert.assertEquals(501 , message.getRepeatedField(f("repeated_int32" ), 1)); + Assert.assertEquals(502L , message.getRepeatedField(f("repeated_int64" ), 1)); + Assert.assertEquals(503 , message.getRepeatedField(f("repeated_uint32" ), 1)); + Assert.assertEquals(504L , message.getRepeatedField(f("repeated_uint64" ), 1)); + Assert.assertEquals(505 , message.getRepeatedField(f("repeated_sint32" ), 1)); + Assert.assertEquals(506L , message.getRepeatedField(f("repeated_sint64" ), 1)); + Assert.assertEquals(507 , message.getRepeatedField(f("repeated_fixed32" ), 1)); + Assert.assertEquals(508L , message.getRepeatedField(f("repeated_fixed64" ), 1)); + Assert.assertEquals(509 , message.getRepeatedField(f("repeated_sfixed32"), 1)); + Assert.assertEquals(510L , message.getRepeatedField(f("repeated_sfixed64"), 1)); + Assert.assertEquals(511F , message.getRepeatedField(f("repeated_float" ), 1)); + Assert.assertEquals(512D , message.getRepeatedField(f("repeated_double" ), 1)); + Assert.assertEquals(true , message.getRepeatedField(f("repeated_bool" ), 1)); + Assert.assertEquals("515", message.getRepeatedField(f("repeated_string" ), 1)); + Assert.assertEquals(toBytes("516"), message.getRepeatedField(f("repeated_bytes"), 1)); + + Assert.assertEquals(517, + ((Message)message.getRepeatedField(f("repeatedgroup"), 1)) + .getField(repeatedGroupA)); + Assert.assertEquals(518, + ((Message)message.getRepeatedField(f("repeated_nested_message"), 1)) + .getField(nestedB)); + Assert.assertEquals(519, + ((Message)message.getRepeatedField(f("repeated_foreign_message"), 1)) + .getField(foreignC)); + Assert.assertEquals(520, + ((Message)message.getRepeatedField(f("repeated_import_message"), 1)) + .getField(importD)); + + Assert.assertEquals( nestedFoo, message.getRepeatedField(f("repeated_nested_enum" ),1)); + Assert.assertEquals(foreignFoo, message.getRepeatedField(f("repeated_foreign_enum"),1)); + Assert.assertEquals( importFoo, message.getRepeatedField(f("repeated_import_enum" ),1)); + + Assert.assertEquals("524", message.getRepeatedField(f("repeated_string_piece"), 1)); + Assert.assertEquals("525", message.getRepeatedField(f("repeated_cord"), 1)); + } + + public void setPackedFieldsViaReflection(Message.Builder message) { + message.addRepeatedField(f("packed_int32" ), 601 ); + message.addRepeatedField(f("packed_int64" ), 602L); + message.addRepeatedField(f("packed_uint32" ), 603 ); + message.addRepeatedField(f("packed_uint64" ), 604L); + message.addRepeatedField(f("packed_sint32" ), 605 ); + message.addRepeatedField(f("packed_sint64" ), 606L); + message.addRepeatedField(f("packed_fixed32" ), 607 ); + message.addRepeatedField(f("packed_fixed64" ), 608L); + message.addRepeatedField(f("packed_sfixed32"), 609 ); + message.addRepeatedField(f("packed_sfixed64"), 610L); + message.addRepeatedField(f("packed_float" ), 611F); + message.addRepeatedField(f("packed_double" ), 612D); + message.addRepeatedField(f("packed_bool" ), true); + message.addRepeatedField(f("packed_enum" ), foreignBar); + // Add a second one of each field. + message.addRepeatedField(f("packed_int32" ), 701 ); + message.addRepeatedField(f("packed_int64" ), 702L); + message.addRepeatedField(f("packed_uint32" ), 703 ); + message.addRepeatedField(f("packed_uint64" ), 704L); + message.addRepeatedField(f("packed_sint32" ), 705 ); + message.addRepeatedField(f("packed_sint64" ), 706L); + message.addRepeatedField(f("packed_fixed32" ), 707 ); + message.addRepeatedField(f("packed_fixed64" ), 708L); + message.addRepeatedField(f("packed_sfixed32"), 709 ); + message.addRepeatedField(f("packed_sfixed64"), 710L); + message.addRepeatedField(f("packed_float" ), 711F); + message.addRepeatedField(f("packed_double" ), 712D); + message.addRepeatedField(f("packed_bool" ), false); + message.addRepeatedField(f("packed_enum" ), foreignBaz); + } + + public void assertPackedFieldsSetViaReflection(MessageOrBuilder message) { + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_int32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_int64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_uint32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_uint64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sint32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sint64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_fixed32" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_fixed64" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sfixed32"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_sfixed64"))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_float" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_double" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_bool" ))); + Assert.assertEquals(2, message.getRepeatedFieldCount(f("packed_enum" ))); + Assert.assertEquals(601 , message.getRepeatedField(f("packed_int32" ), 0)); + Assert.assertEquals(602L , message.getRepeatedField(f("packed_int64" ), 0)); + Assert.assertEquals(603 , message.getRepeatedField(f("packed_uint32" ), 0)); + Assert.assertEquals(604L , message.getRepeatedField(f("packed_uint64" ), 0)); + Assert.assertEquals(605 , message.getRepeatedField(f("packed_sint32" ), 0)); + Assert.assertEquals(606L , message.getRepeatedField(f("packed_sint64" ), 0)); + Assert.assertEquals(607 , message.getRepeatedField(f("packed_fixed32" ), 0)); + Assert.assertEquals(608L , message.getRepeatedField(f("packed_fixed64" ), 0)); + Assert.assertEquals(609 , message.getRepeatedField(f("packed_sfixed32"), 0)); + Assert.assertEquals(610L , message.getRepeatedField(f("packed_sfixed64"), 0)); + Assert.assertEquals(611F , message.getRepeatedField(f("packed_float" ), 0)); + Assert.assertEquals(612D , message.getRepeatedField(f("packed_double" ), 0)); + Assert.assertEquals(true , message.getRepeatedField(f("packed_bool" ), 0)); + Assert.assertEquals(foreignBar, message.getRepeatedField(f("packed_enum" ),0)); + Assert.assertEquals(701 , message.getRepeatedField(f("packed_int32" ), 1)); + Assert.assertEquals(702L , message.getRepeatedField(f("packed_int64" ), 1)); + Assert.assertEquals(703 , message.getRepeatedField(f("packed_uint32" ), 1)); + Assert.assertEquals(704L , message.getRepeatedField(f("packed_uint64" ), 1)); + Assert.assertEquals(705 , message.getRepeatedField(f("packed_sint32" ), 1)); + Assert.assertEquals(706L , message.getRepeatedField(f("packed_sint64" ), 1)); + Assert.assertEquals(707 , message.getRepeatedField(f("packed_fixed32" ), 1)); + Assert.assertEquals(708L , message.getRepeatedField(f("packed_fixed64" ), 1)); + Assert.assertEquals(709 , message.getRepeatedField(f("packed_sfixed32"), 1)); + Assert.assertEquals(710L , message.getRepeatedField(f("packed_sfixed64"), 1)); + Assert.assertEquals(711F , message.getRepeatedField(f("packed_float" ), 1)); + Assert.assertEquals(712D , message.getRepeatedField(f("packed_double" ), 1)); + Assert.assertEquals(false, message.getRepeatedField(f("packed_bool" ), 1)); + Assert.assertEquals(foreignBaz, message.getRepeatedField(f("packed_enum" ),1)); + } + + /** + * Verifies that the reflection setters for the given.Builder object throw a + * NullPointerException if they are passed a null value. Uses Assert to throw an + * appropriate assertion failure, if the condition is not verified. + */ + public void assertReflectionSettersRejectNull(Message.Builder builder) + throws Exception { + try { + builder.setField(f("optional_string"), null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setField(f("optional_bytes"), null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setField(f("optional_nested_enum"), null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setField(f("optional_nested_message"), + (TestAllTypes.NestedMessage) null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.setField(f("optional_nested_message"), + (TestAllTypes.NestedMessage.Builder) null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + try { + builder.addRepeatedField(f("repeated_string"), null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedField(f("repeated_bytes"), null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedField(f("repeated_nested_enum"), null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + try { + builder.addRepeatedField(f("repeated_nested_message"), null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + } + + /** + * Verifies that the reflection repeated setters for the given Builder object throw a + * NullPointerException if they are passed a null value. Uses Assert to throw an appropriate + * assertion failure, if the condition is not verified. + */ + public void assertReflectionRepeatedSettersRejectNull(Message.Builder builder) + throws Exception { + builder.addRepeatedField(f("repeated_string"), "one"); + try { + builder.setRepeatedField(f("repeated_string"), 0, null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + builder.addRepeatedField(f("repeated_bytes"), toBytes("one")); + try { + builder.setRepeatedField(f("repeated_bytes"), 0, null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + builder.addRepeatedField(f("repeated_nested_enum"), nestedBaz); + try { + builder.setRepeatedField(f("repeated_nested_enum"), 0, null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + + builder.addRepeatedField( + f("repeated_nested_message"), + TestAllTypes.NestedMessage.newBuilder().setBb(218).build()); + try { + builder.setRepeatedField(f("repeated_nested_message"), 0, null); + Assert.fail("Exception was not thrown"); + } catch (NullPointerException e) { + // We expect this exception. + } + } + } + + /** + * @param filePath The path relative to + * {@link #getTestDataDir}. + */ + public static String readTextFromFile(String filePath) { + return readBytesFromFile(filePath).toStringUtf8(); + } + + private static File getTestDataDir() { + // Search each parent directory looking for "src/google/protobuf". + File ancestor = new File("."); + try { + ancestor = ancestor.getCanonicalFile(); + } catch (IOException e) { + throw new RuntimeException( + "Couldn't get canonical name of working directory.", e); + } + while (ancestor != null && ancestor.exists()) { + if (new File(ancestor, "src/google/protobuf").exists()) { + return new File(ancestor, "src/google/protobuf/testdata"); + } + ancestor = ancestor.getParentFile(); + } + + throw new RuntimeException( + "Could not find golden files. This test must be run from within the " + + "protobuf source package so that it can read test data files from the " + + "C++ source tree."); + } + + /** + * @param filename The path relative to + * {@link #getTestDataDir}. + */ + public static ByteString readBytesFromFile(String filename) { + File fullPath = new File(getTestDataDir(), filename); + try { + RandomAccessFile file = new RandomAccessFile(fullPath, "r"); + byte[] content = new byte[(int) file.length()]; + file.readFully(content); + return ByteString.copyFrom(content); + } catch (IOException e) { + // Throw a RuntimeException here so that we can call this function from + // static initializers. + throw new IllegalArgumentException( + "Couldn't read file: " + fullPath.getPath(), e); + } + } + + /** + * Get the bytes of the "golden message". This is a serialized TestAllTypes + * with all fields set as they would be by + * {@link #setAllFields(TestAllTypes.Builder)}, but it is loaded from a file + * on disk rather than generated dynamically. The file is actually generated + * by C++ code, so testing against it verifies compatibility with C++. + */ + public static ByteString getGoldenMessage() { + if (goldenMessage == null) { + goldenMessage = readBytesFromFile("golden_message"); + } + return goldenMessage; + } + private static ByteString goldenMessage = null; + + /** + * Get the bytes of the "golden packed fields message". This is a serialized + * TestPackedTypes with all fields set as they would be by + * {@link #setPackedFields(TestPackedTypes.Builder)}, but it is loaded from a + * file on disk rather than generated dynamically. The file is actually + * generated by C++ code, so testing against it verifies compatibility with + * C++. + */ + public static ByteString getGoldenPackedFieldsMessage() { + if (goldenPackedFieldsMessage == null) { + goldenPackedFieldsMessage = + readBytesFromFile("golden_packed_fields_message"); + } + return goldenPackedFieldsMessage; + } + private static ByteString goldenPackedFieldsMessage = null; + + /** + * Mock implementation of {@link GeneratedMessage.BuilderParent} for testing. + * + * @author jonp@google.com (Jon Perlow) + */ + public static class MockBuilderParent + implements GeneratedMessage.BuilderParent { + + private int invalidations; + + //@Override (Java 1.6 override semantics, but we must support 1.5) + public void markDirty() { + invalidations++; + } + + public int getInvalidationCount() { + return invalidations; + } + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java new file mode 100644 index 000000000..47690d1fb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java @@ -0,0 +1,752 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import com.google.protobuf.Descriptors.FieldDescriptor; +import protobuf_unittest.UnittestMset.TestMessageSet; +import protobuf_unittest.UnittestMset.TestMessageSetExtension1; +import protobuf_unittest.UnittestMset.TestMessageSetExtension2; +import protobuf_unittest.UnittestProto.OneString; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestAllTypes.NestedMessage; +import protobuf_unittest.UnittestProto.TestEmptyMessage; + +import junit.framework.TestCase; + +import java.io.StringReader; + +/** + * Test case for {@link TextFormat}. + * + * TODO(wenboz): ExtensionTest and rest of text_format_unittest.cc. + * + * @author wenboz@google.com (Wenbo Zhu) + */ +public class TextFormatTest extends TestCase { + + // A basic string with different escapable characters for testing. + private final static String kEscapeTestString = + "\"A string with ' characters \n and \r newlines and \t tabs and \001 " + + "slashes \\"; + + // A representation of the above string with all the characters escaped. + private final static String kEscapeTestStringEscaped = + "\\\"A string with \\' characters \\n and \\r newlines " + + "and \\t tabs and \\001 slashes \\\\"; + + private static String allFieldsSetText = TestUtil.readTextFromFile( + "text_format_unittest_data.txt"); + private static String allExtensionsSetText = TestUtil.readTextFromFile( + "text_format_unittest_extensions_data.txt"); + + private static String exoticText = + "repeated_int32: -1\n" + + "repeated_int32: -2147483648\n" + + "repeated_int64: -1\n" + + "repeated_int64: -9223372036854775808\n" + + "repeated_uint32: 4294967295\n" + + "repeated_uint32: 2147483648\n" + + "repeated_uint64: 18446744073709551615\n" + + "repeated_uint64: 9223372036854775808\n" + + "repeated_double: 123.0\n" + + "repeated_double: 123.5\n" + + "repeated_double: 0.125\n" + + "repeated_double: .125\n" + + "repeated_double: -.125\n" + + "repeated_double: 1.23E17\n" + + "repeated_double: 1.23E+17\n" + + "repeated_double: -1.23e-17\n" + + "repeated_double: .23e+17\n" + + "repeated_double: -.23E17\n" + + "repeated_double: 1.235E22\n" + + "repeated_double: 1.235E-18\n" + + "repeated_double: 123.456789\n" + + "repeated_double: Infinity\n" + + "repeated_double: -Infinity\n" + + "repeated_double: NaN\n" + + "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"" + + "\\341\\210\\264\"\n" + + "repeated_bytes: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\\376\"\n"; + + private static String canonicalExoticText = + exoticText.replace(": .", ": 0.").replace(": -.", ": -0.") // short-form double + .replace("23e", "23E").replace("E+", "E").replace("0.23E17", "2.3E16"); + + private String messageSetText = + "[protobuf_unittest.TestMessageSetExtension1] {\n" + + " i: 123\n" + + "}\n" + + "[protobuf_unittest.TestMessageSetExtension2] {\n" + + " str: \"foo\"\n" + + "}\n"; + + /** Print TestAllTypes and compare with golden file. */ + public void testPrintMessage() throws Exception { + String javaText = TextFormat.printToString(TestUtil.getAllSet()); + + // Java likes to add a trailing ".0" to floats and doubles. C printf + // (with %g format) does not. Our golden files are used for both + // C++ and Java TextFormat classes, so we need to conform. + javaText = javaText.replace(".0\n", "\n"); + + assertEquals(allFieldsSetText, javaText); + } + + /** Print TestAllExtensions and compare with golden file. */ + public void testPrintExtensions() throws Exception { + String javaText = TextFormat.printToString(TestUtil.getAllExtensionsSet()); + + // Java likes to add a trailing ".0" to floats and doubles. C printf + // (with %g format) does not. Our golden files are used for both + // C++ and Java TextFormat classes, so we need to conform. + javaText = javaText.replace(".0\n", "\n"); + + assertEquals(allExtensionsSetText, javaText); + } + + // Creates an example unknown field set. + private UnknownFieldSet makeUnknownFieldSet() { + return UnknownFieldSet.newBuilder() + .addField(5, + UnknownFieldSet.Field.newBuilder() + .addVarint(1) + .addFixed32(2) + .addFixed64(3) + .addLengthDelimited(ByteString.copyFromUtf8("4")) + .addGroup( + UnknownFieldSet.newBuilder() + .addField(10, + UnknownFieldSet.Field.newBuilder() + .addVarint(5) + .build()) + .build()) + .build()) + .addField(8, + UnknownFieldSet.Field.newBuilder() + .addVarint(1) + .addVarint(2) + .addVarint(3) + .build()) + .addField(15, + UnknownFieldSet.Field.newBuilder() + .addVarint(0xABCDEF1234567890L) + .addFixed32(0xABCD1234) + .addFixed64(0xABCDEF1234567890L) + .build()) + .build(); + } + + public void testPrintUnknownFields() throws Exception { + // Test printing of unknown fields in a message. + + TestEmptyMessage message = + TestEmptyMessage.newBuilder() + .setUnknownFields(makeUnknownFieldSet()) + .build(); + + assertEquals( + "5: 1\n" + + "5: 0x00000002\n" + + "5: 0x0000000000000003\n" + + "5: \"4\"\n" + + "5 {\n" + + " 10: 5\n" + + "}\n" + + "8: 1\n" + + "8: 2\n" + + "8: 3\n" + + "15: 12379813812177893520\n" + + "15: 0xabcd1234\n" + + "15: 0xabcdef1234567890\n", + TextFormat.printToString(message)); + } + + public void testPrintField() throws Exception { + final FieldDescriptor dataField = + OneString.getDescriptor().findFieldByName("data"); + assertEquals( + "data: \"test data\"\n", + TextFormat.printFieldToString(dataField, "test data")); + + final FieldDescriptor optionalField = + TestAllTypes.getDescriptor().findFieldByName("optional_nested_message"); + final Object value = NestedMessage.newBuilder().setBb(42).build(); + + assertEquals( + "optional_nested_message {\n bb: 42\n}\n", + TextFormat.printFieldToString(optionalField, value)); + } + + /** + * Helper to construct a ByteString from a String containing only 8-bit + * characters. The characters are converted directly to bytes, *not* + * encoded using UTF-8. + */ + private ByteString bytes(String str) throws Exception { + return ByteString.copyFrom(str.getBytes("ISO-8859-1")); + } + + /** + * Helper to construct a ByteString from a bunch of bytes. The inputs are + * actually ints so that I can use hex notation and not get stupid errors + * about precision. + */ + private ByteString bytes(int... bytesAsInts) { + byte[] bytes = new byte[bytesAsInts.length]; + for (int i = 0; i < bytesAsInts.length; i++) { + bytes[i] = (byte) bytesAsInts[i]; + } + return ByteString.copyFrom(bytes); + } + + public void testPrintExotic() throws Exception { + Message message = TestAllTypes.newBuilder() + // Signed vs. unsigned numbers. + .addRepeatedInt32 (-1) + .addRepeatedUint32(-1) + .addRepeatedInt64 (-1) + .addRepeatedUint64(-1) + + .addRepeatedInt32 (1 << 31) + .addRepeatedUint32(1 << 31) + .addRepeatedInt64 (1l << 63) + .addRepeatedUint64(1l << 63) + + // Floats of various precisions and exponents. + .addRepeatedDouble(123) + .addRepeatedDouble(123.5) + .addRepeatedDouble(0.125) + .addRepeatedDouble(.125) + .addRepeatedDouble(-.125) + .addRepeatedDouble(123e15) + .addRepeatedDouble(123e15) + .addRepeatedDouble(-1.23e-17) + .addRepeatedDouble(.23e17) + .addRepeatedDouble(-23e15) + .addRepeatedDouble(123.5e20) + .addRepeatedDouble(123.5e-20) + .addRepeatedDouble(123.456789) + .addRepeatedDouble(Double.POSITIVE_INFINITY) + .addRepeatedDouble(Double.NEGATIVE_INFINITY) + .addRepeatedDouble(Double.NaN) + + // Strings and bytes that needing escaping. + .addRepeatedString("\0\001\007\b\f\n\r\t\013\\\'\"\u1234") + .addRepeatedBytes(bytes("\0\001\007\b\f\n\r\t\013\\\'\"\u00fe")) + .build(); + + assertEquals(canonicalExoticText, message.toString()); + } + + public void testPrintMessageSet() throws Exception { + TestMessageSet messageSet = + TestMessageSet.newBuilder() + .setExtension( + TestMessageSetExtension1.messageSetExtension, + TestMessageSetExtension1.newBuilder().setI(123).build()) + .setExtension( + TestMessageSetExtension2.messageSetExtension, + TestMessageSetExtension2.newBuilder().setStr("foo").build()) + .build(); + + assertEquals(messageSetText, messageSet.toString()); + } + + // ================================================================= + + public void testParse() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge(allFieldsSetText, builder); + TestUtil.assertAllFieldsSet(builder.build()); + } + + public void testParseReader() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge(new StringReader(allFieldsSetText), builder); + TestUtil.assertAllFieldsSet(builder.build()); + } + + public void testParseExtensions() throws Exception { + TestAllExtensions.Builder builder = TestAllExtensions.newBuilder(); + TextFormat.merge(allExtensionsSetText, + TestUtil.getExtensionRegistry(), + builder); + TestUtil.assertAllExtensionsSet(builder.build()); + } + + public void testParseCompatibility() throws Exception { + String original = "repeated_float: inf\n" + + "repeated_float: -inf\n" + + "repeated_float: nan\n" + + "repeated_float: inff\n" + + "repeated_float: -inff\n" + + "repeated_float: nanf\n" + + "repeated_float: 1.0f\n" + + "repeated_float: infinityf\n" + + "repeated_float: -Infinityf\n" + + "repeated_double: infinity\n" + + "repeated_double: -infinity\n" + + "repeated_double: nan\n"; + String canonical = "repeated_float: Infinity\n" + + "repeated_float: -Infinity\n" + + "repeated_float: NaN\n" + + "repeated_float: Infinity\n" + + "repeated_float: -Infinity\n" + + "repeated_float: NaN\n" + + "repeated_float: 1.0\n" + + "repeated_float: Infinity\n" + + "repeated_float: -Infinity\n" + + "repeated_double: Infinity\n" + + "repeated_double: -Infinity\n" + + "repeated_double: NaN\n"; + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge(original, builder); + assertEquals(canonical, builder.build().toString()); + } + + public void testParseExotic() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge(exoticText, builder); + + // Too lazy to check things individually. Don't try to debug this + // if testPrintExotic() is failing. + assertEquals(canonicalExoticText, builder.build().toString()); + } + + public void testParseMessageSet() throws Exception { + ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance(); + extensionRegistry.add(TestMessageSetExtension1.messageSetExtension); + extensionRegistry.add(TestMessageSetExtension2.messageSetExtension); + + TestMessageSet.Builder builder = TestMessageSet.newBuilder(); + TextFormat.merge(messageSetText, extensionRegistry, builder); + TestMessageSet messageSet = builder.build(); + + assertTrue(messageSet.hasExtension( + TestMessageSetExtension1.messageSetExtension)); + assertEquals(123, messageSet.getExtension( + TestMessageSetExtension1.messageSetExtension).getI()); + assertTrue(messageSet.hasExtension( + TestMessageSetExtension2.messageSetExtension)); + assertEquals("foo", messageSet.getExtension( + TestMessageSetExtension2.messageSetExtension).getStr()); + } + + public void testParseNumericEnum() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge("optional_nested_enum: 2", builder); + assertEquals(TestAllTypes.NestedEnum.BAR, builder.getOptionalNestedEnum()); + } + + public void testParseAngleBrackets() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge("OptionalGroup: < a: 1 >", builder); + assertTrue(builder.hasOptionalGroup()); + assertEquals(1, builder.getOptionalGroup().getA()); + } + + public void testParseComment() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge( + "# this is a comment\n" + + "optional_int32: 1 # another comment\n" + + "optional_int64: 2\n" + + "# EOF comment", builder); + assertEquals(1, builder.getOptionalInt32()); + assertEquals(2, builder.getOptionalInt64()); + } + + private void assertParseError(String error, String text) { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + try { + TextFormat.merge(text, TestUtil.getExtensionRegistry(), builder); + fail("Expected parse exception."); + } catch (TextFormat.ParseException e) { + assertEquals(error, e.getMessage()); + } + } + + public void testParseErrors() throws Exception { + assertParseError( + "1:16: Expected \":\".", + "optional_int32 123"); + assertParseError( + "1:23: Expected identifier.", + "optional_nested_enum: ?"); + assertParseError( + "1:18: Couldn't parse integer: Number must be positive: -1", + "optional_uint32: -1"); + assertParseError( + "1:17: Couldn't parse integer: Number out of range for 32-bit signed " + + "integer: 82301481290849012385230157", + "optional_int32: 82301481290849012385230157"); + assertParseError( + "1:16: Expected \"true\" or \"false\".", + "optional_bool: maybe"); + assertParseError( + "1:16: Expected \"true\" or \"false\".", + "optional_bool: 2"); + assertParseError( + "1:18: Expected string.", + "optional_string: 123"); + assertParseError( + "1:18: String missing ending quote.", + "optional_string: \"ueoauaoe"); + assertParseError( + "1:18: String missing ending quote.", + "optional_string: \"ueoauaoe\n" + + "optional_int32: 123"); + assertParseError( + "1:18: Invalid escape sequence: '\\z'", + "optional_string: \"\\z\""); + assertParseError( + "1:18: String missing ending quote.", + "optional_string: \"ueoauaoe\n" + + "optional_int32: 123"); + assertParseError( + "1:2: Extension \"nosuchext\" not found in the ExtensionRegistry.", + "[nosuchext]: 123"); + assertParseError( + "1:20: Extension \"protobuf_unittest.optional_int32_extension\" does " + + "not extend message type \"protobuf_unittest.TestAllTypes\".", + "[protobuf_unittest.optional_int32_extension]: 123"); + assertParseError( + "1:1: Message type \"protobuf_unittest.TestAllTypes\" has no field " + + "named \"nosuchfield\".", + "nosuchfield: 123"); + assertParseError( + "1:21: Expected \">\".", + "OptionalGroup < a: 1"); + assertParseError( + "1:23: Enum type \"protobuf_unittest.TestAllTypes.NestedEnum\" has no " + + "value named \"NO_SUCH_VALUE\".", + "optional_nested_enum: NO_SUCH_VALUE"); + assertParseError( + "1:23: Enum type \"protobuf_unittest.TestAllTypes.NestedEnum\" has no " + + "value with number 123.", + "optional_nested_enum: 123"); + + // Delimiters must match. + assertParseError( + "1:22: Expected identifier.", + "OptionalGroup < a: 1 }"); + assertParseError( + "1:22: Expected identifier.", + "OptionalGroup { a: 1 >"); + } + + // ================================================================= + + public void testEscape() throws Exception { + // Escape sequences. + assertEquals("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"", + TextFormat.escapeBytes(bytes("\0\001\007\b\f\n\r\t\013\\\'\""))); + assertEquals("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"", + TextFormat.escapeText("\0\001\007\b\f\n\r\t\013\\\'\"")); + assertEquals(bytes("\0\001\007\b\f\n\r\t\013\\\'\""), + TextFormat.unescapeBytes("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"")); + assertEquals("\0\001\007\b\f\n\r\t\013\\\'\"", + TextFormat.unescapeText("\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"")); + assertEquals(kEscapeTestStringEscaped, + TextFormat.escapeText(kEscapeTestString)); + assertEquals(kEscapeTestString, + TextFormat.unescapeText(kEscapeTestStringEscaped)); + + // Unicode handling. + assertEquals("\\341\\210\\264", TextFormat.escapeText("\u1234")); + assertEquals("\\341\\210\\264", + TextFormat.escapeBytes(bytes(0xe1, 0x88, 0xb4))); + assertEquals("\u1234", TextFormat.unescapeText("\\341\\210\\264")); + assertEquals(bytes(0xe1, 0x88, 0xb4), + TextFormat.unescapeBytes("\\341\\210\\264")); + assertEquals("\u1234", TextFormat.unescapeText("\\xe1\\x88\\xb4")); + assertEquals(bytes(0xe1, 0x88, 0xb4), + TextFormat.unescapeBytes("\\xe1\\x88\\xb4")); + + // Handling of strings with unescaped Unicode characters > 255. + final String zh = "\u9999\u6e2f\u4e0a\u6d77\ud84f\udf80\u8c50\u9280\u884c"; + ByteString zhByteString = ByteString.copyFromUtf8(zh); + assertEquals(zhByteString, TextFormat.unescapeBytes(zh)); + + // Errors. + try { + TextFormat.unescapeText("\\x"); + fail("Should have thrown an exception."); + } catch (TextFormat.InvalidEscapeSequenceException e) { + // success + } + + try { + TextFormat.unescapeText("\\z"); + fail("Should have thrown an exception."); + } catch (TextFormat.InvalidEscapeSequenceException e) { + // success + } + + try { + TextFormat.unescapeText("\\"); + fail("Should have thrown an exception."); + } catch (TextFormat.InvalidEscapeSequenceException e) { + // success + } + } + + public void testParseInteger() throws Exception { + assertEquals( 0, TextFormat.parseInt32( "0")); + assertEquals( 1, TextFormat.parseInt32( "1")); + assertEquals( -1, TextFormat.parseInt32( "-1")); + assertEquals( 12345, TextFormat.parseInt32( "12345")); + assertEquals( -12345, TextFormat.parseInt32( "-12345")); + assertEquals( 2147483647, TextFormat.parseInt32( "2147483647")); + assertEquals(-2147483648, TextFormat.parseInt32("-2147483648")); + + assertEquals( 0, TextFormat.parseUInt32( "0")); + assertEquals( 1, TextFormat.parseUInt32( "1")); + assertEquals( 12345, TextFormat.parseUInt32( "12345")); + assertEquals( 2147483647, TextFormat.parseUInt32("2147483647")); + assertEquals((int) 2147483648L, TextFormat.parseUInt32("2147483648")); + assertEquals((int) 4294967295L, TextFormat.parseUInt32("4294967295")); + + assertEquals( 0L, TextFormat.parseInt64( "0")); + assertEquals( 1L, TextFormat.parseInt64( "1")); + assertEquals( -1L, TextFormat.parseInt64( "-1")); + assertEquals( 12345L, TextFormat.parseInt64( "12345")); + assertEquals( -12345L, TextFormat.parseInt64( "-12345")); + assertEquals( 2147483647L, TextFormat.parseInt64( "2147483647")); + assertEquals(-2147483648L, TextFormat.parseInt64("-2147483648")); + assertEquals( 4294967295L, TextFormat.parseInt64( "4294967295")); + assertEquals( 4294967296L, TextFormat.parseInt64( "4294967296")); + assertEquals(9223372036854775807L, + TextFormat.parseInt64("9223372036854775807")); + assertEquals(-9223372036854775808L, + TextFormat.parseInt64("-9223372036854775808")); + + assertEquals( 0L, TextFormat.parseUInt64( "0")); + assertEquals( 1L, TextFormat.parseUInt64( "1")); + assertEquals( 12345L, TextFormat.parseUInt64( "12345")); + assertEquals( 2147483647L, TextFormat.parseUInt64( "2147483647")); + assertEquals( 4294967295L, TextFormat.parseUInt64( "4294967295")); + assertEquals( 4294967296L, TextFormat.parseUInt64( "4294967296")); + assertEquals(9223372036854775807L, + TextFormat.parseUInt64("9223372036854775807")); + assertEquals(-9223372036854775808L, + TextFormat.parseUInt64("9223372036854775808")); + assertEquals(-1L, TextFormat.parseUInt64("18446744073709551615")); + + // Hex + assertEquals(0x1234abcd, TextFormat.parseInt32("0x1234abcd")); + assertEquals(-0x1234abcd, TextFormat.parseInt32("-0x1234abcd")); + assertEquals(-1, TextFormat.parseUInt64("0xffffffffffffffff")); + assertEquals(0x7fffffffffffffffL, + TextFormat.parseInt64("0x7fffffffffffffff")); + + // Octal + assertEquals(01234567, TextFormat.parseInt32("01234567")); + + // Out-of-range + try { + TextFormat.parseInt32("2147483648"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + try { + TextFormat.parseInt32("-2147483649"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + try { + TextFormat.parseUInt32("4294967296"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + try { + TextFormat.parseUInt32("-1"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + try { + TextFormat.parseInt64("9223372036854775808"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + try { + TextFormat.parseInt64("-9223372036854775809"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + try { + TextFormat.parseUInt64("18446744073709551616"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + try { + TextFormat.parseUInt64("-1"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + + // Not a number. + try { + TextFormat.parseInt32("abcd"); + fail("Should have thrown an exception."); + } catch (NumberFormatException e) { + // success + } + } + + public void testParseString() throws Exception { + final String zh = "\u9999\u6e2f\u4e0a\u6d77\ud84f\udf80\u8c50\u9280\u884c"; + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge("optional_string: \"" + zh + "\"", builder); + assertEquals(zh, builder.getOptionalString()); + } + + public void testParseLongString() throws Exception { + String longText = + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890" + + "123456789012345678901234567890123456789012345678901234567890"; + + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge("optional_string: \"" + longText + "\"", builder); + assertEquals(longText, builder.getOptionalString()); + } + + public void testParseBoolean() throws Exception { + String goodText = + "repeated_bool: t repeated_bool : 0\n" + + "repeated_bool :f repeated_bool:1"; + String goodTextCanonical = + "repeated_bool: true\n" + + "repeated_bool: false\n" + + "repeated_bool: false\n" + + "repeated_bool: true\n"; + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge(goodText, builder); + assertEquals(goodTextCanonical, builder.build().toString()); + + try { + TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder(); + TextFormat.merge("optional_bool:2", badBuilder); + fail("Should have thrown an exception."); + } catch (TextFormat.ParseException e) { + // success + } + try { + TestAllTypes.Builder badBuilder = TestAllTypes.newBuilder(); + TextFormat.merge("optional_bool: foo", badBuilder); + fail("Should have thrown an exception."); + } catch (TextFormat.ParseException e) { + // success + } + } + + public void testParseAdjacentStringLiterals() throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + TextFormat.merge("optional_string: \"foo\" 'corge' \"grault\"", builder); + assertEquals("foocorgegrault", builder.getOptionalString()); + } + + public void testPrintFieldValue() throws Exception { + assertPrintFieldValue("\"Hello\"", "Hello", "repeated_string"); + assertPrintFieldValue("123.0", 123f, "repeated_float"); + assertPrintFieldValue("123.0", 123d, "repeated_double"); + assertPrintFieldValue("123", 123, "repeated_int32"); + assertPrintFieldValue("123", 123L, "repeated_int64"); + assertPrintFieldValue("true", true, "repeated_bool"); + assertPrintFieldValue("4294967295", 0xFFFFFFFF, "repeated_uint32"); + assertPrintFieldValue("18446744073709551615", 0xFFFFFFFFFFFFFFFFL, + "repeated_uint64"); + assertPrintFieldValue("\"\\001\\002\\003\"", + ByteString.copyFrom(new byte[] {1, 2, 3}), "repeated_bytes"); + } + + private void assertPrintFieldValue(String expect, Object value, + String fieldName) throws Exception { + TestAllTypes.Builder builder = TestAllTypes.newBuilder(); + StringBuilder sb = new StringBuilder(); + TextFormat.printFieldValue( + TestAllTypes.getDescriptor().findFieldByName(fieldName), + value, sb); + assertEquals(expect, sb.toString()); + } + + public void testShortDebugString() { + assertEquals("optional_nested_message { bb: 42 } repeated_int32: 1" + + " repeated_uint32: 2", + TextFormat.shortDebugString(TestAllTypes.newBuilder() + .addRepeatedInt32(1) + .addRepeatedUint32(2) + .setOptionalNestedMessage( + NestedMessage.newBuilder().setBb(42).build()) + .build())); + } + + public void testShortDebugString_unknown() { + assertEquals("5: 1 5: 0x00000002 5: 0x0000000000000003 5: \"4\" 5 { 10: 5 }" + + " 8: 1 8: 2 8: 3 15: 12379813812177893520 15: 0xabcd1234 15:" + + " 0xabcdef1234567890", + TextFormat.shortDebugString(makeUnknownFieldSet())); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java new file mode 100644 index 000000000..ea088b32a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java @@ -0,0 +1,437 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import protobuf_unittest.UnittestProto; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestEmptyMessage; +import protobuf_unittest.UnittestProto.TestEmptyMessageWithExtensions; + +import junit.framework.TestCase; + +import java.util.Arrays; +import java.util.Map; + +/** + * Tests related to unknown field handling. + * + * @author kenton@google.com (Kenton Varda) + */ +public class UnknownFieldSetTest extends TestCase { + public void setUp() throws Exception { + descriptor = TestAllTypes.getDescriptor(); + allFields = TestUtil.getAllSet(); + allFieldsData = allFields.toByteString(); + emptyMessage = TestEmptyMessage.parseFrom(allFieldsData); + unknownFields = emptyMessage.getUnknownFields(); + } + + UnknownFieldSet.Field getField(String name) { + Descriptors.FieldDescriptor field = descriptor.findFieldByName(name); + assertNotNull(field); + return unknownFields.getField(field.getNumber()); + } + + // Constructs a protocol buffer which contains fields with all the same + // numbers as allFieldsData except that each field is some other wire + // type. + ByteString getBizarroData() throws Exception { + UnknownFieldSet.Builder bizarroFields = UnknownFieldSet.newBuilder(); + + UnknownFieldSet.Field varintField = + UnknownFieldSet.Field.newBuilder().addVarint(1).build(); + UnknownFieldSet.Field fixed32Field = + UnknownFieldSet.Field.newBuilder().addFixed32(1).build(); + + for (Map.Entry entry : + unknownFields.asMap().entrySet()) { + if (entry.getValue().getVarintList().isEmpty()) { + // Original field is not a varint, so use a varint. + bizarroFields.addField(entry.getKey(), varintField); + } else { + // Original field *is* a varint, so use something else. + bizarroFields.addField(entry.getKey(), fixed32Field); + } + } + + return bizarroFields.build().toByteString(); + } + + Descriptors.Descriptor descriptor; + TestAllTypes allFields; + ByteString allFieldsData; + + // An empty message that has been parsed from allFieldsData. So, it has + // unknown fields of every type. + TestEmptyMessage emptyMessage; + UnknownFieldSet unknownFields; + + // ================================================================= + + public void testVarint() throws Exception { + UnknownFieldSet.Field field = getField("optional_int32"); + assertEquals(1, field.getVarintList().size()); + assertEquals(allFields.getOptionalInt32(), + (long) field.getVarintList().get(0)); + } + + public void testFixed32() throws Exception { + UnknownFieldSet.Field field = getField("optional_fixed32"); + assertEquals(1, field.getFixed32List().size()); + assertEquals(allFields.getOptionalFixed32(), + (int) field.getFixed32List().get(0)); + } + + public void testFixed64() throws Exception { + UnknownFieldSet.Field field = getField("optional_fixed64"); + assertEquals(1, field.getFixed64List().size()); + assertEquals(allFields.getOptionalFixed64(), + (long) field.getFixed64List().get(0)); + } + + public void testLengthDelimited() throws Exception { + UnknownFieldSet.Field field = getField("optional_bytes"); + assertEquals(1, field.getLengthDelimitedList().size()); + assertEquals(allFields.getOptionalBytes(), + field.getLengthDelimitedList().get(0)); + } + + public void testGroup() throws Exception { + Descriptors.FieldDescriptor nestedFieldDescriptor = + TestAllTypes.OptionalGroup.getDescriptor().findFieldByName("a"); + assertNotNull(nestedFieldDescriptor); + + UnknownFieldSet.Field field = getField("optionalgroup"); + assertEquals(1, field.getGroupList().size()); + + UnknownFieldSet group = field.getGroupList().get(0); + assertEquals(1, group.asMap().size()); + assertTrue(group.hasField(nestedFieldDescriptor.getNumber())); + + UnknownFieldSet.Field nestedField = + group.getField(nestedFieldDescriptor.getNumber()); + assertEquals(1, nestedField.getVarintList().size()); + assertEquals(allFields.getOptionalGroup().getA(), + (long) nestedField.getVarintList().get(0)); + } + + public void testSerialize() throws Exception { + // Check that serializing the UnknownFieldSet produces the original data + // again. + ByteString data = emptyMessage.toByteString(); + assertEquals(allFieldsData, data); + } + + public void testCopyFrom() throws Exception { + TestEmptyMessage message = + TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).build(); + + assertEquals(emptyMessage.toString(), message.toString()); + } + + public void testMergeFrom() throws Exception { + TestEmptyMessage source = + TestEmptyMessage.newBuilder() + .setUnknownFields( + UnknownFieldSet.newBuilder() + .addField(2, + UnknownFieldSet.Field.newBuilder() + .addVarint(2).build()) + .addField(3, + UnknownFieldSet.Field.newBuilder() + .addVarint(4).build()) + .build()) + .build(); + TestEmptyMessage destination = + TestEmptyMessage.newBuilder() + .setUnknownFields( + UnknownFieldSet.newBuilder() + .addField(1, + UnknownFieldSet.Field.newBuilder() + .addVarint(1).build()) + .addField(3, + UnknownFieldSet.Field.newBuilder() + .addVarint(3).build()) + .build()) + .mergeFrom(source) + .build(); + + assertEquals( + "1: 1\n" + + "2: 2\n" + + "3: 3\n" + + "3: 4\n", + destination.toString()); + } + + public void testClear() throws Exception { + UnknownFieldSet fields = + UnknownFieldSet.newBuilder().mergeFrom(unknownFields).clear().build(); + assertTrue(fields.asMap().isEmpty()); + } + + public void testClearMessage() throws Exception { + TestEmptyMessage message = + TestEmptyMessage.newBuilder().mergeFrom(emptyMessage).clear().build(); + assertEquals(0, message.getSerializedSize()); + } + + public void testParseKnownAndUnknown() throws Exception { + // Test mixing known and unknown fields when parsing. + + UnknownFieldSet fields = + UnknownFieldSet.newBuilder(unknownFields) + .addField(123456, + UnknownFieldSet.Field.newBuilder().addVarint(654321).build()) + .build(); + + ByteString data = fields.toByteString(); + TestAllTypes destination = TestAllTypes.parseFrom(data); + + TestUtil.assertAllFieldsSet(destination); + assertEquals(1, destination.getUnknownFields().asMap().size()); + + UnknownFieldSet.Field field = + destination.getUnknownFields().getField(123456); + assertEquals(1, field.getVarintList().size()); + assertEquals(654321, (long) field.getVarintList().get(0)); + } + + public void testWrongTypeTreatedAsUnknown() throws Exception { + // Test that fields of the wrong wire type are treated like unknown fields + // when parsing. + + ByteString bizarroData = getBizarroData(); + TestAllTypes allTypesMessage = TestAllTypes.parseFrom(bizarroData); + TestEmptyMessage emptyMessage = TestEmptyMessage.parseFrom(bizarroData); + + // All fields should have been interpreted as unknown, so the debug strings + // should be the same. + assertEquals(emptyMessage.toString(), allTypesMessage.toString()); + } + + public void testUnknownExtensions() throws Exception { + // Make sure fields are properly parsed to the UnknownFieldSet even when + // they are declared as extension numbers. + + TestEmptyMessageWithExtensions message = + TestEmptyMessageWithExtensions.parseFrom(allFieldsData); + + assertEquals(unknownFields.asMap().size(), + message.getUnknownFields().asMap().size()); + assertEquals(allFieldsData, message.toByteString()); + } + + public void testWrongExtensionTypeTreatedAsUnknown() throws Exception { + // Test that fields of the wrong wire type are treated like unknown fields + // when parsing extensions. + + ByteString bizarroData = getBizarroData(); + TestAllExtensions allExtensionsMessage = + TestAllExtensions.parseFrom(bizarroData); + TestEmptyMessage emptyMessage = TestEmptyMessage.parseFrom(bizarroData); + + // All fields should have been interpreted as unknown, so the debug strings + // should be the same. + assertEquals(emptyMessage.toString(), + allExtensionsMessage.toString()); + } + + public void testParseUnknownEnumValue() throws Exception { + Descriptors.FieldDescriptor singularField = + TestAllTypes.getDescriptor().findFieldByName("optional_nested_enum"); + Descriptors.FieldDescriptor repeatedField = + TestAllTypes.getDescriptor().findFieldByName("repeated_nested_enum"); + assertNotNull(singularField); + assertNotNull(repeatedField); + + ByteString data = + UnknownFieldSet.newBuilder() + .addField(singularField.getNumber(), + UnknownFieldSet.Field.newBuilder() + .addVarint(TestAllTypes.NestedEnum.BAR.getNumber()) + .addVarint(5) // not valid + .build()) + .addField(repeatedField.getNumber(), + UnknownFieldSet.Field.newBuilder() + .addVarint(TestAllTypes.NestedEnum.FOO.getNumber()) + .addVarint(4) // not valid + .addVarint(TestAllTypes.NestedEnum.BAZ.getNumber()) + .addVarint(6) // not valid + .build()) + .build() + .toByteString(); + + { + TestAllTypes message = TestAllTypes.parseFrom(data); + assertEquals(TestAllTypes.NestedEnum.BAR, + message.getOptionalNestedEnum()); + assertEquals( + Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ), + message.getRepeatedNestedEnumList()); + assertEquals(Arrays.asList(5L), + message.getUnknownFields() + .getField(singularField.getNumber()) + .getVarintList()); + assertEquals(Arrays.asList(4L, 6L), + message.getUnknownFields() + .getField(repeatedField.getNumber()) + .getVarintList()); + } + + { + TestAllExtensions message = + TestAllExtensions.parseFrom(data, TestUtil.getExtensionRegistry()); + assertEquals(TestAllTypes.NestedEnum.BAR, + message.getExtension(UnittestProto.optionalNestedEnumExtension)); + assertEquals( + Arrays.asList(TestAllTypes.NestedEnum.FOO, TestAllTypes.NestedEnum.BAZ), + message.getExtension(UnittestProto.repeatedNestedEnumExtension)); + assertEquals(Arrays.asList(5L), + message.getUnknownFields() + .getField(singularField.getNumber()) + .getVarintList()); + assertEquals(Arrays.asList(4L, 6L), + message.getUnknownFields() + .getField(repeatedField.getNumber()) + .getVarintList()); + } + } + + public void testLargeVarint() throws Exception { + ByteString data = + UnknownFieldSet.newBuilder() + .addField(1, + UnknownFieldSet.Field.newBuilder() + .addVarint(0x7FFFFFFFFFFFFFFFL) + .build()) + .build() + .toByteString(); + UnknownFieldSet parsed = UnknownFieldSet.parseFrom(data); + UnknownFieldSet.Field field = parsed.getField(1); + assertEquals(1, field.getVarintList().size()); + assertEquals(0x7FFFFFFFFFFFFFFFL, (long)field.getVarintList().get(0)); + } + + public void testEqualsAndHashCode() { + UnknownFieldSet.Field fixed32Field = + UnknownFieldSet.Field.newBuilder() + .addFixed32(1) + .build(); + UnknownFieldSet.Field fixed64Field = + UnknownFieldSet.Field.newBuilder() + .addFixed64(1) + .build(); + UnknownFieldSet.Field varIntField = + UnknownFieldSet.Field.newBuilder() + .addVarint(1) + .build(); + UnknownFieldSet.Field lengthDelimitedField = + UnknownFieldSet.Field.newBuilder() + .addLengthDelimited(ByteString.EMPTY) + .build(); + UnknownFieldSet.Field groupField = + UnknownFieldSet.Field.newBuilder() + .addGroup(unknownFields) + .build(); + + UnknownFieldSet a = + UnknownFieldSet.newBuilder() + .addField(1, fixed32Field) + .build(); + UnknownFieldSet b = + UnknownFieldSet.newBuilder() + .addField(1, fixed64Field) + .build(); + UnknownFieldSet c = + UnknownFieldSet.newBuilder() + .addField(1, varIntField) + .build(); + UnknownFieldSet d = + UnknownFieldSet.newBuilder() + .addField(1, lengthDelimitedField) + .build(); + UnknownFieldSet e = + UnknownFieldSet.newBuilder() + .addField(1, groupField) + .build(); + + checkEqualsIsConsistent(a); + checkEqualsIsConsistent(b); + checkEqualsIsConsistent(c); + checkEqualsIsConsistent(d); + checkEqualsIsConsistent(e); + + checkNotEqual(a, b); + checkNotEqual(a, c); + checkNotEqual(a, d); + checkNotEqual(a, e); + checkNotEqual(b, c); + checkNotEqual(b, d); + checkNotEqual(b, e); + checkNotEqual(c, d); + checkNotEqual(c, e); + checkNotEqual(d, e); + } + + /** + * Asserts that the given field sets are not equal and have different + * hash codes. + * + * @warning It's valid for non-equal objects to have the same hash code, so + * this test is stricter than it needs to be. However, this should happen + * relatively rarely. + */ + private void checkNotEqual(UnknownFieldSet s1, UnknownFieldSet s2) { + String equalsError = String.format("%s should not be equal to %s", s1, s2); + assertFalse(equalsError, s1.equals(s2)); + assertFalse(equalsError, s2.equals(s1)); + + assertFalse( + String.format("%s should have a different hash code from %s", s1, s2), + s1.hashCode() == s2.hashCode()); + } + + /** + * Asserts that the given field sets are equal and have identical hash codes. + */ + private void checkEqualsIsConsistent(UnknownFieldSet set) { + // Object should be equal to itself. + assertEquals(set, set); + + // Object should be equal to a copy of itself. + UnknownFieldSet copy = UnknownFieldSet.newBuilder(set).build(); + assertEquals(set, copy); + assertEquals(copy, set); + assertEquals(set.hashCode(), copy.hashCode()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java new file mode 100644 index 000000000..ed5d069e4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java @@ -0,0 +1,152 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import junit.framework.TestCase; + +import java.util.Iterator; +import java.util.ListIterator; + +/** + * Tests for {@link UnmodifiableLazyStringList}. + * + * @author jonp@google.com (Jon Perlow) + */ +public class UnmodifiableLazyStringListTest extends TestCase { + + private static String STRING_A = "A"; + private static String STRING_B = "B"; + private static String STRING_C = "C"; + + private static ByteString BYTE_STRING_A = ByteString.copyFromUtf8("A"); + private static ByteString BYTE_STRING_B = ByteString.copyFromUtf8("B"); + private static ByteString BYTE_STRING_C = ByteString.copyFromUtf8("C"); + + public void testReadOnlyMethods() { + LazyStringArrayList rawList = createSampleList(); + UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList); + assertEquals(3, list.size()); + assertSame(STRING_A, list.get(0)); + assertSame(STRING_B, list.get(1)); + assertSame(STRING_C, list.get(2)); + assertEquals(BYTE_STRING_A, list.getByteString(0)); + assertEquals(BYTE_STRING_B, list.getByteString(1)); + assertEquals(BYTE_STRING_C, list.getByteString(2)); + } + + public void testModifyMethods() { + LazyStringArrayList rawList = createSampleList(); + UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList); + + try { + list.remove(0); + fail(); + } catch (UnsupportedOperationException e) { + // expected + } + assertEquals(3, list.size()); + + try { + list.add(STRING_B); + fail(); + } catch (UnsupportedOperationException e) { + // expected + } + assertEquals(3, list.size()); + + try { + list.set(1, STRING_B); + fail(); + } catch (UnsupportedOperationException e) { + // expected + } + } + + public void testIterator() { + LazyStringArrayList rawList = createSampleList(); + UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList); + + Iterator iter = list.iterator(); + int count = 0; + while (iter.hasNext()) { + iter.next(); + count++; + try { + iter.remove(); + fail(); + } catch (UnsupportedOperationException e) { + // expected + } + } + assertEquals(3, count); + + } + + public void testListIterator() { + LazyStringArrayList rawList = createSampleList(); + UnmodifiableLazyStringList list = new UnmodifiableLazyStringList(rawList); + + ListIterator iter = list.listIterator(); + int count = 0; + while (iter.hasNext()) { + iter.next(); + count++; + try { + iter.remove(); + fail(); + } catch (UnsupportedOperationException e) { + // expected + } + try { + iter.set("bar"); + fail(); + } catch (UnsupportedOperationException e) { + // expected + } + try { + iter.add("bar"); + fail(); + } catch (UnsupportedOperationException e) { + // expected + } + } + assertEquals(3, count); + + } + + private LazyStringArrayList createSampleList() { + LazyStringArrayList rawList = new LazyStringArrayList(); + rawList.add(STRING_A); + rawList.add(STRING_B); + rawList.add(STRING_C); + return rawList; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java new file mode 100644 index 000000000..5ea1dd6a6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java @@ -0,0 +1,427 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +package com.google.protobuf; + +import junit.framework.TestCase; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; + +import protobuf_unittest.UnittestProto; +import protobuf_unittest.UnittestProto.TestAllExtensions; +import protobuf_unittest.UnittestProto.TestAllTypes; +import protobuf_unittest.UnittestProto.TestFieldOrderings; +import protobuf_unittest.UnittestProto.TestPackedExtensions; +import protobuf_unittest.UnittestProto.TestPackedTypes; +import protobuf_unittest.UnittestMset.TestMessageSet; +import protobuf_unittest.UnittestMset.RawMessageSet; +import protobuf_unittest.UnittestMset.TestMessageSetExtension1; +import protobuf_unittest.UnittestMset.TestMessageSetExtension2; +import com.google.protobuf.UnittestLite.TestAllExtensionsLite; +import com.google.protobuf.UnittestLite.TestPackedExtensionsLite; + +/** + * Tests related to parsing and serialization. + * + * @author kenton@google.com (Kenton Varda) + */ +public class WireFormatTest extends TestCase { + public void testSerialization() throws Exception { + TestAllTypes message = TestUtil.getAllSet(); + + ByteString rawBytes = message.toByteString(); + assertEquals(rawBytes.size(), message.getSerializedSize()); + + TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes); + + TestUtil.assertAllFieldsSet(message2); + } + + public void testSerializationPacked() throws Exception { + TestPackedTypes message = TestUtil.getPackedSet(); + + ByteString rawBytes = message.toByteString(); + assertEquals(rawBytes.size(), message.getSerializedSize()); + + TestPackedTypes message2 = TestPackedTypes.parseFrom(rawBytes); + + TestUtil.assertPackedFieldsSet(message2); + } + + public void testSerializeExtensions() throws Exception { + // TestAllTypes and TestAllExtensions should have compatible wire formats, + // so if we serialize a TestAllExtensions then parse it as TestAllTypes + // it should work. + + TestAllExtensions message = TestUtil.getAllExtensionsSet(); + ByteString rawBytes = message.toByteString(); + assertEquals(rawBytes.size(), message.getSerializedSize()); + + TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes); + + TestUtil.assertAllFieldsSet(message2); + } + + public void testSerializePackedExtensions() throws Exception { + // TestPackedTypes and TestPackedExtensions should have compatible wire + // formats; check that they serialize to the same string. + TestPackedExtensions message = TestUtil.getPackedExtensionsSet(); + ByteString rawBytes = message.toByteString(); + + TestPackedTypes message2 = TestUtil.getPackedSet(); + ByteString rawBytes2 = message2.toByteString(); + + assertEquals(rawBytes, rawBytes2); + } + + public void testSerializationPackedWithoutGetSerializedSize() + throws Exception { + // Write directly to an OutputStream, without invoking getSerializedSize() + // This used to be a bug where the size of a packed field was incorrect, + // since getSerializedSize() was never invoked. + TestPackedTypes message = TestUtil.getPackedSet(); + + // Directly construct a CodedOutputStream around the actual OutputStream, + // in case writeTo(OutputStream output) invokes getSerializedSize(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + CodedOutputStream codedOutput = CodedOutputStream.newInstance(outputStream); + + message.writeTo(codedOutput); + + codedOutput.flush(); + + TestPackedTypes message2 = TestPackedTypes.parseFrom( + outputStream.toByteArray()); + + TestUtil.assertPackedFieldsSet(message2); + } + + public void testSerializeExtensionsLite() throws Exception { + // TestAllTypes and TestAllExtensions should have compatible wire formats, + // so if we serialize a TestAllExtensions then parse it as TestAllTypes + // it should work. + + TestAllExtensionsLite message = TestUtil.getAllLiteExtensionsSet(); + ByteString rawBytes = message.toByteString(); + assertEquals(rawBytes.size(), message.getSerializedSize()); + + TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes); + + TestUtil.assertAllFieldsSet(message2); + } + + public void testSerializePackedExtensionsLite() throws Exception { + // TestPackedTypes and TestPackedExtensions should have compatible wire + // formats; check that they serialize to the same string. + TestPackedExtensionsLite message = TestUtil.getLitePackedExtensionsSet(); + ByteString rawBytes = message.toByteString(); + + TestPackedTypes message2 = TestUtil.getPackedSet(); + ByteString rawBytes2 = message2.toByteString(); + + assertEquals(rawBytes, rawBytes2); + } + + public void testParseExtensions() throws Exception { + // TestAllTypes and TestAllExtensions should have compatible wire formats, + // so if we serialize a TestAllTypes then parse it as TestAllExtensions + // it should work. + + TestAllTypes message = TestUtil.getAllSet(); + ByteString rawBytes = message.toByteString(); + + ExtensionRegistry registry = TestUtil.getExtensionRegistry(); + + TestAllExtensions message2 = + TestAllExtensions.parseFrom(rawBytes, registry); + + TestUtil.assertAllExtensionsSet(message2); + } + + public void testParsePackedExtensions() throws Exception { + // Ensure that packed extensions can be properly parsed. + TestPackedExtensions message = TestUtil.getPackedExtensionsSet(); + ByteString rawBytes = message.toByteString(); + + ExtensionRegistry registry = TestUtil.getExtensionRegistry(); + + TestPackedExtensions message2 = + TestPackedExtensions.parseFrom(rawBytes, registry); + + TestUtil.assertPackedExtensionsSet(message2); + } + + public void testParseExtensionsLite() throws Exception { + // TestAllTypes and TestAllExtensions should have compatible wire formats, + // so if we serialize a TestAllTypes then parse it as TestAllExtensions + // it should work. + + TestAllTypes message = TestUtil.getAllSet(); + ByteString rawBytes = message.toByteString(); + + ExtensionRegistryLite registry_lite = TestUtil.getExtensionRegistryLite(); + + TestAllExtensionsLite message2 = + TestAllExtensionsLite.parseFrom(rawBytes, registry_lite); + + TestUtil.assertAllExtensionsSet(message2); + + // Try again using a full extension registry. + ExtensionRegistry registry = TestUtil.getExtensionRegistry(); + + TestAllExtensionsLite message3 = + TestAllExtensionsLite.parseFrom(rawBytes, registry); + + TestUtil.assertAllExtensionsSet(message3); + } + + public void testParsePackedExtensionsLite() throws Exception { + // Ensure that packed extensions can be properly parsed. + TestPackedExtensionsLite message = TestUtil.getLitePackedExtensionsSet(); + ByteString rawBytes = message.toByteString(); + + ExtensionRegistryLite registry = TestUtil.getExtensionRegistryLite(); + + TestPackedExtensionsLite message2 = + TestPackedExtensionsLite.parseFrom(rawBytes, registry); + + TestUtil.assertPackedExtensionsSet(message2); + } + + public void testExtensionsSerializedSize() throws Exception { + assertEquals(TestUtil.getAllSet().getSerializedSize(), + TestUtil.getAllExtensionsSet().getSerializedSize()); + } + + public void testSerializeDelimited() throws Exception { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + TestUtil.getAllSet().writeDelimitedTo(output); + output.write(12); + TestUtil.getPackedSet().writeDelimitedTo(output); + output.write(34); + + ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray()); + + TestUtil.assertAllFieldsSet(TestAllTypes.parseDelimitedFrom(input)); + assertEquals(12, input.read()); + TestUtil.assertPackedFieldsSet(TestPackedTypes.parseDelimitedFrom(input)); + assertEquals(34, input.read()); + assertEquals(-1, input.read()); + + // We're at EOF, so parsing again should return null. + assertTrue(TestAllTypes.parseDelimitedFrom(input) == null); + } + + private void assertFieldsInOrder(ByteString data) throws Exception { + CodedInputStream input = data.newCodedInput(); + int previousTag = 0; + + while (true) { + int tag = input.readTag(); + if (tag == 0) { + break; + } + + assertTrue(tag > previousTag); + previousTag = tag; + input.skipField(tag); + } + } + + public void testInterleavedFieldsAndExtensions() throws Exception { + // Tests that fields are written in order even when extension ranges + // are interleaved with field numbers. + ByteString data = + TestFieldOrderings.newBuilder() + .setMyInt(1) + .setMyString("foo") + .setMyFloat(1.0F) + .setExtension(UnittestProto.myExtensionInt, 23) + .setExtension(UnittestProto.myExtensionString, "bar") + .build().toByteString(); + assertFieldsInOrder(data); + + Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor(); + ByteString dynamic_data = + DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor()) + .setField(descriptor.findFieldByName("my_int"), 1L) + .setField(descriptor.findFieldByName("my_string"), "foo") + .setField(descriptor.findFieldByName("my_float"), 1.0F) + .setField(UnittestProto.myExtensionInt.getDescriptor(), 23) + .setField(UnittestProto.myExtensionString.getDescriptor(), "bar") + .build().toByteString(); + assertFieldsInOrder(dynamic_data); + } + + private ExtensionRegistry getTestFieldOrderingsRegistry() { + ExtensionRegistry result = ExtensionRegistry.newInstance(); + result.add(UnittestProto.myExtensionInt); + result.add(UnittestProto.myExtensionString); + return result; + } + + public void testParseMultipleExtensionRanges() throws Exception { + // Make sure we can parse a message that contains multiple extensions + // ranges. + TestFieldOrderings source = + TestFieldOrderings.newBuilder() + .setMyInt(1) + .setMyString("foo") + .setMyFloat(1.0F) + .setExtension(UnittestProto.myExtensionInt, 23) + .setExtension(UnittestProto.myExtensionString, "bar") + .build(); + TestFieldOrderings dest = + TestFieldOrderings.parseFrom(source.toByteString(), + getTestFieldOrderingsRegistry()); + assertEquals(source, dest); + } + + public void testParseMultipleExtensionRangesDynamic() throws Exception { + // Same as above except with DynamicMessage. + Descriptors.Descriptor descriptor = TestFieldOrderings.getDescriptor(); + DynamicMessage source = + DynamicMessage.newBuilder(TestFieldOrderings.getDescriptor()) + .setField(descriptor.findFieldByName("my_int"), 1L) + .setField(descriptor.findFieldByName("my_string"), "foo") + .setField(descriptor.findFieldByName("my_float"), 1.0F) + .setField(UnittestProto.myExtensionInt.getDescriptor(), 23) + .setField(UnittestProto.myExtensionString.getDescriptor(), "bar") + .build(); + DynamicMessage dest = + DynamicMessage.parseFrom(descriptor, source.toByteString(), + getTestFieldOrderingsRegistry()); + assertEquals(source, dest); + } + + private static final int UNKNOWN_TYPE_ID = 1550055; + private static final int TYPE_ID_1 = + TestMessageSetExtension1.getDescriptor().getExtensions().get(0).getNumber(); + private static final int TYPE_ID_2 = + TestMessageSetExtension2.getDescriptor().getExtensions().get(0).getNumber(); + + public void testSerializeMessageSet() throws Exception { + // Set up a TestMessageSet with two known messages and an unknown one. + TestMessageSet messageSet = + TestMessageSet.newBuilder() + .setExtension( + TestMessageSetExtension1.messageSetExtension, + TestMessageSetExtension1.newBuilder().setI(123).build()) + .setExtension( + TestMessageSetExtension2.messageSetExtension, + TestMessageSetExtension2.newBuilder().setStr("foo").build()) + .setUnknownFields( + UnknownFieldSet.newBuilder() + .addField(UNKNOWN_TYPE_ID, + UnknownFieldSet.Field.newBuilder() + .addLengthDelimited(ByteString.copyFromUtf8("bar")) + .build()) + .build()) + .build(); + + ByteString data = messageSet.toByteString(); + + // Parse back using RawMessageSet and check the contents. + RawMessageSet raw = RawMessageSet.parseFrom(data); + + assertTrue(raw.getUnknownFields().asMap().isEmpty()); + + assertEquals(3, raw.getItemCount()); + assertEquals(TYPE_ID_1, raw.getItem(0).getTypeId()); + assertEquals(TYPE_ID_2, raw.getItem(1).getTypeId()); + assertEquals(UNKNOWN_TYPE_ID, raw.getItem(2).getTypeId()); + + TestMessageSetExtension1 message1 = + TestMessageSetExtension1.parseFrom( + raw.getItem(0).getMessage().toByteArray()); + assertEquals(123, message1.getI()); + + TestMessageSetExtension2 message2 = + TestMessageSetExtension2.parseFrom( + raw.getItem(1).getMessage().toByteArray()); + assertEquals("foo", message2.getStr()); + + assertEquals("bar", raw.getItem(2).getMessage().toStringUtf8()); + } + + public void testParseMessageSet() throws Exception { + ExtensionRegistry extensionRegistry = ExtensionRegistry.newInstance(); + extensionRegistry.add(TestMessageSetExtension1.messageSetExtension); + extensionRegistry.add(TestMessageSetExtension2.messageSetExtension); + + // Set up a RawMessageSet with two known messages and an unknown one. + RawMessageSet raw = + RawMessageSet.newBuilder() + .addItem( + RawMessageSet.Item.newBuilder() + .setTypeId(TYPE_ID_1) + .setMessage( + TestMessageSetExtension1.newBuilder() + .setI(123) + .build().toByteString()) + .build()) + .addItem( + RawMessageSet.Item.newBuilder() + .setTypeId(TYPE_ID_2) + .setMessage( + TestMessageSetExtension2.newBuilder() + .setStr("foo") + .build().toByteString()) + .build()) + .addItem( + RawMessageSet.Item.newBuilder() + .setTypeId(UNKNOWN_TYPE_ID) + .setMessage(ByteString.copyFromUtf8("bar")) + .build()) + .build(); + + ByteString data = raw.toByteString(); + + // Parse as a TestMessageSet and check the contents. + TestMessageSet messageSet = + TestMessageSet.parseFrom(data, extensionRegistry); + + assertEquals(123, messageSet.getExtension( + TestMessageSetExtension1.messageSetExtension).getI()); + assertEquals("foo", messageSet.getExtension( + TestMessageSetExtension2.messageSetExtension).getStr()); + + // Check for unknown field with type LENGTH_DELIMITED, + // number UNKNOWN_TYPE_ID, and contents "bar". + UnknownFieldSet unknownFields = messageSet.getUnknownFields(); + assertEquals(1, unknownFields.asMap().size()); + assertTrue(unknownFields.hasField(UNKNOWN_TYPE_ID)); + + UnknownFieldSet.Field field = unknownFields.getField(UNKNOWN_TYPE_ID); + assertEquals(1, field.getLengthDelimitedList().size()); + assertEquals("bar", field.getLengthDelimitedList().get(0).toStringUtf8()); + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto new file mode 100644 index 000000000..9a040145a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto @@ -0,0 +1,71 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// A proto file which tests the java_multiple_files option. + + +// Some generic_services option(s) added automatically. +// See: http://go/proto2-generic-services-default +option java_generic_services = true; // auto-added + +import "google/protobuf/unittest.proto"; + +package protobuf_unittest; + +option java_multiple_files = true; +option java_outer_classname = "MultipleFilesTestProto"; + +message MessageWithNoOuter { + message NestedMessage { + optional int32 i = 1; + } + enum NestedEnum { + BAZ = 3; + } + optional NestedMessage nested = 1; + repeated TestAllTypes foreign = 2; + optional NestedEnum nested_enum = 3; + optional EnumWithNoOuter foreign_enum = 4; +} + +enum EnumWithNoOuter { + FOO = 1; + BAR = 2; +} + +service ServiceWithNoOuter { + rpc Foo(MessageWithNoOuter) returns(TestAllTypes); +} + +extend TestAllExtensions { + optional int32 extension_with_outer = 1234567; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto new file mode 100644 index 000000000..abffb9d2b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto @@ -0,0 +1,53 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jonp@google.com (Jon Perlow) +// + +package protobuf_unittest; + +option java_multiple_files = true; +option java_outer_classname = "NestedBuilders"; + + +message Vehicle { + optional Engine engine = 1; + repeated Wheel wheel = 2; +} + +message Engine { + optional int32 cylinder = 1; + optional int32 liters = 2; +} + +message Wheel { + optional int32 radius = 1; + optional int32 width = 2; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto new file mode 100644 index 000000000..9fe5d560c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto @@ -0,0 +1,45 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Darick Tong (darick@google.com) +// +// A proto file with nested extensions. Note that this must be defined in +// a separate file to properly test the initialization of the outer class. + + +import "com/google/protobuf/non_nested_extension.proto"; + +package protobuf_unittest; + +message MyNestedExtension { + extend MessageToBeExtended { + optional MessageToBeExtended recursiveExtension = 2; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto new file mode 100644 index 000000000..16ee46e57 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto @@ -0,0 +1,48 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Darick Tong (darick@google.com) +// +// A proto file with nested extensions for a MessageLite messages. Note that +// this must be defined in a separate file to properly test the initialization +// of the outer class. + + +package protobuf_unittest; + +option optimize_for = LITE_RUNTIME; + +import "com/google/protobuf/non_nested_extension_lite.proto"; + +message MyNestedExtensionLite { + extend MessageLiteToBeExtended { + optional MessageLiteToBeExtended recursiveExtensionLite = 3; + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto new file mode 100644 index 000000000..f61b419bc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto @@ -0,0 +1,48 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Darick Tong (darick@google.com) +// +// A proto file with extensions. + + +package protobuf_unittest; + +message MessageToBeExtended { + extensions 1 to max; +} + +message MyNonNestedExtension { +} + +extend MessageToBeExtended { + optional MyNonNestedExtension nonNestedExtension = 1; +} + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto new file mode 100644 index 000000000..3c82659b5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto @@ -0,0 +1,50 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: Darick Tong (darick@google.com) +// +// A proto file with extensions for a MessageLite messages. + + +package protobuf_unittest; + +option optimize_for = LITE_RUNTIME; + +message MessageLiteToBeExtended { + extensions 1 to max; +} + +message MyNonNestedExtensionLite { +} + +extend MessageLiteToBeExtended { + optional MyNonNestedExtensionLite nonNestedExtensionLite = 1; +} + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto new file mode 100644 index 000000000..9610e9d5c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto @@ -0,0 +1,90 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jonp@google.com (Jon Perlow) + +// This file tests that various identifiers work as field and type names even +// though the same identifiers are used internally by the java code generator. + + +// Some generic_services option(s) added automatically. +// See: http://go/proto2-generic-services-default +option java_generic_services = true; // auto-added + +package io_protocol_tests; + +option java_package = "com.google.protobuf"; +option java_outer_classname = "TestBadIdentifiersProto"; + +message TestMessage { +} + +message Deprecated { + enum TestEnum { + FOO = 1; + } + + optional int32 field1 = 1 [deprecated=true]; + optional TestEnum field2 = 2 [deprecated=true]; + optional TestMessage field3 = 3 [deprecated=true]; +} + +message Override { + optional int32 override = 1; +} + +message Object { + optional int32 object = 1; +} + +message String { + optional string string = 1; +} + +message Integer { + optional int32 integer = 1; +} + +message Long { + optional int32 long = 1; +} + +message Float { + optional float float = 1; +} + +message Double { + optional double double = 1; +} + +service TestConflictingMethodNames { + rpc Override(TestMessage) returns (TestMessage); +} + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 b/spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 new file mode 100644 index 000000000..1ca2eeb1d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 @@ -0,0 +1,37 @@ +dnl Provide AC_USE_SYSTEM_EXTENSIONS for old autoconf machines. +AC_DEFUN([ACX_USE_SYSTEM_EXTENSIONS],[ + ifdef([AC_USE_SYSTEM_EXTENSIONS],[ + AC_USE_SYSTEM_EXTENSIONS + ],[ + AC_BEFORE([$0], [AC_COMPILE_IFELSE]) + AC_BEFORE([$0], [AC_RUN_IFELSE]) + + AC_REQUIRE([AC_GNU_SOURCE]) + AC_REQUIRE([AC_AIX]) + AC_REQUIRE([AC_MINIX]) + + AH_VERBATIM([__EXTENSIONS__], +[/* Enable extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif]) + AC_CACHE_CHECK([whether it is safe to define __EXTENSIONS__], + [ac_cv_safe_to_define___extensions__], + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([ +# define __EXTENSIONS__ 1 + AC_INCLUDES_DEFAULT])], + [ac_cv_safe_to_define___extensions__=yes], + [ac_cv_safe_to_define___extensions__=no])]) + test $ac_cv_safe_to_define___extensions__ = yes && + AC_DEFINE([__EXTENSIONS__]) + AC_DEFINE([_POSIX_PTHREAD_SEMANTICS]) + AC_DEFINE([_TANDEM_SOURCE]) + ]) +]) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 b/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 new file mode 100644 index 000000000..4e8f96107 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 @@ -0,0 +1,74 @@ +dnl Check for the presence of the Sun Studio compiler. +dnl If Sun Studio compiler is found, set appropriate flags. +dnl Additionally, Sun Studio doesn't default to 64-bit by itself, +dnl nor does it automatically look in standard Solaris places for +dnl 64-bit libs, so we must add those options and paths to the search +dnl paths. + +dnl TODO(kenton): This is pretty hacky. It sets CXXFLAGS, which the autoconf +dnl docs say should never be overridden except by the user. It also isn't +dnl cross-compile safe. We should fix these problems, but since I don't have +dnl Sun CC at my disposal for testing, someone else will have to do it. + +AC_DEFUN([ACX_CHECK_SUNCC],[ + + AC_LANG_PUSH([C++]) + AC_CHECK_DECL([__SUNPRO_CC], [SUNCC="yes"], [SUNCC="no"]) + AC_LANG_POP() + + + AC_ARG_ENABLE([64bit-solaris], + [AS_HELP_STRING([--disable-64bit-solaris], + [Build 64 bit binary on Solaris @<:@default=on@:>@])], + [ac_enable_64bit="$enableval"], + [ac_enable_64bit="yes"]) + + AS_IF([test "$SUNCC" = "yes" -a "x${ac_cv_env_CXXFLAGS_set}" = "x"],[ + dnl Sun Studio has a crashing bug with -xO4 in some cases. Keep this + dnl at -xO3 until a proper test to detect those crashes can be done. + CXXFLAGS="-g0 -xO3 -xlibmil -xdepend -xbuiltin -mt -compat=5 -library=stlport4 -library=Crun -template=no%extdef ${CXXFLAGS}" + ]) + + case $host_os in + *solaris*) + AC_CHECK_PROGS(ISAINFO, [isainfo], [no]) + AS_IF([test "x$ISAINFO" != "xno"], + [isainfo_b=`${ISAINFO} -b`], + [isainfo_b="x"]) + + AS_IF([test "$isainfo_b" != "x"],[ + + isainfo_k=`${ISAINFO} -k` + + AS_IF([test "x$ac_enable_64bit" = "xyes"],[ + + AS_IF([test "x$libdir" = "x\${exec_prefix}/lib"],[ + dnl The user hasn't overridden the default libdir, so we'll + dnl the dir suffix to match solaris 32/64-bit policy + libdir="${libdir}/${isainfo_k}" + ]) + + dnl This should just be set in CPPFLAGS and in LDFLAGS, but libtool + dnl does the wrong thing if you don't put it into CXXFLAGS. sigh. + dnl (It also needs it in CFLAGS, or it does a different wrong thing!) + AS_IF([test "x${ac_cv_env_CXXFLAGS_set}" = "x"],[ + CXXFLAGS="${CXXFLAGS} -m64" + ac_cv_env_CXXFLAGS_set=set + ac_cv_env_CXXFLAGS_value='-m64' + ]) + + AS_IF([test "x${ac_cv_env_CFLAGS_set}" = "x"],[ + CFLAGS="${CFLAGS} -m64" + ac_cv_env_CFLAGS_set=set + ac_cv_env_CFLAGS_value='-m64' + ]) + + AS_IF([test "$target_cpu" = "sparc" -a "x$SUNCC" = "xyes" ],[ + CXXFLAGS="-xmemalign=8s ${CXXFLAGS}" + ]) + ]) + ]) + ;; + esac + +]) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 b/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 new file mode 100644 index 000000000..89d42c744 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 @@ -0,0 +1,397 @@ +# This was retrieved from +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi +# See also (perhaps for new versions?) +# http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi +# +# We've rewritten the inconsistency check code (from avahi), to work +# more broadly. In particular, it no longer assumes ld accepts -zdefs. +# This caused a restructing of the code, but the functionality has only +# changed a little. + +dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +dnl +dnl @summary figure out how to build C programs using POSIX threads +dnl +dnl This macro figures out how to build C programs using POSIX threads. +dnl It sets the PTHREAD_LIBS output variable to the threads library and +dnl linker flags, and the PTHREAD_CFLAGS output variable to any special +dnl C compiler flags that are needed. (The user can also force certain +dnl compiler flags/libs to be tested by setting these environment +dnl variables.) +dnl +dnl Also sets PTHREAD_CC to any special C compiler that is needed for +dnl multi-threaded programs (defaults to the value of CC otherwise). +dnl (This is necessary on AIX to use the special cc_r compiler alias.) +dnl +dnl NOTE: You are assumed to not only compile your program with these +dnl flags, but also link it with them as well. e.g. you should link +dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS +dnl $LIBS +dnl +dnl If you are only building threads programs, you may wish to use +dnl these variables in your default LIBS, CFLAGS, and CC: +dnl +dnl LIBS="$PTHREAD_LIBS $LIBS" +dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +dnl CC="$PTHREAD_CC" +dnl +dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute +dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to +dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +dnl +dnl ACTION-IF-FOUND is a list of shell commands to run if a threads +dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to +dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the +dnl default action will define HAVE_PTHREAD. +dnl +dnl Please let the authors know if this macro fails on any platform, or +dnl if you have any other suggestions or comments. This macro was based +dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with +dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros +dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. +dnl We are also grateful for the helpful feedback of numerous users. +dnl +dnl @category InstalledPackages +dnl @author Steven G. Johnson +dnl @version 2006-05-29 +dnl @license GPLWithACException +dnl +dnl Checks for GCC shared/pthread inconsistency based on work by +dnl Marcin Owsiany + + +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi + + # The next part tries to detect GCC inconsistency with -shared on some + # architectures and systems. The problem is that in certain + # configurations, when -shared is specified, GCC "forgets" to + # internally use various flags which are still necessary. + + # + # Prepare the flags + # + save_CFLAGS="$CFLAGS" + save_LIBS="$LIBS" + save_CC="$CC" + + # Try with the flags determined by the earlier checks. + # + # -Wl,-z,defs forces link-time symbol resolution, so that the + # linking checks with -shared actually have any value + # + # FIXME: -fPIC is required for -shared on many architectures, + # so we specify it here, but the right way would probably be to + # properly detect whether it is actually required. + CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CC="$PTHREAD_CC" + + # In order not to create several levels of indentation, we test + # the value of "$done" until we find the cure or run out of ideas. + done="no" + + # First, make sure the CFLAGS we added are actually accepted by our + # compiler. If not (and OS X's ld, for instance, does not accept -z), + # then we can't do this test. + if test x"$done" = xno; then + AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies]) + AC_TRY_LINK(,, , [done=yes]) + + if test "x$done" = xyes ; then + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([yes]) + fi + fi + + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -pthread is sufficient with -shared]) + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + fi + + # + # Linux gcc on some architectures such as mips/mipsel forgets + # about -lpthread + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lpthread fixes that]) + LIBS="-lpthread $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lpthread $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + # + # FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc + # + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lc_r fixes that]) + LIBS="-lc_r $PTHREAD_LIBS $save_LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="-lc_r $PTHREAD_LIBS" + else + AC_MSG_RESULT([no]) + fi + fi + if test x"$done" = xno; then + # OK, we have run out of ideas + AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries]) + + # so it's not safe to assume that we may use pthreads + acx_pthread_ok=no + fi + + AC_MSG_CHECKING([whether what we have so far is sufficient with -nostdlib]) + CFLAGS="-nostdlib $CFLAGS" + # we need c with nostdlib + LIBS="$LIBS -lc" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes],[done=no]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + + if test x"$done" = xno; then + AC_MSG_CHECKING([whether -lpthread saves the day]) + LIBS="-lpthread $LIBS" + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [done=yes],[done=no]) + + if test "x$done" = xyes; then + AC_MSG_RESULT([yes]) + PTHREAD_LIBS="$PTHREAD_LIBS -lpthread" + else + AC_MSG_RESULT([no]) + AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries and -nostdlib]) + fi + fi + + CFLAGS="$save_CFLAGS" + LIBS="$save_LIBS" + CC="$save_CC" +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 b/spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 new file mode 100644 index 000000000..0722b14a7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 @@ -0,0 +1,72 @@ +# We check two things: where the include file is for +# unordered_map/hash_map (we prefer the first form), and what +# namespace unordered/hash_map lives in within that include file. We +# include AC_TRY_COMPILE for all the combinations we've seen in the +# wild. We define HASH_MAP_H to the location of the header file, and +# HASH_NAMESPACE to the namespace the class (unordered_map or +# hash_map) is in. We define HAVE_UNORDERED_MAP if the class we found +# is named unordered_map, or leave it undefined if not. + +# This also checks if unordered map exists. +AC_DEFUN([AC_CXX_STL_HASH], + [ + AC_MSG_CHECKING(the location of hash_map) + AC_LANG_SAVE + AC_LANG_CPLUSPLUS + ac_cv_cxx_hash_map="" + # First try unordered_map, but not on gcc's before 4.2 -- I've + # seen unexplainable unordered_map bugs with -O2 on older gcc's. + AC_TRY_COMPILE([#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)) + # error GCC too old for unordered_map + #endif + ], + [/* no program body necessary */], + [stl_hash_old_gcc=no], + [stl_hash_old_gcc=yes]) + for location in unordered_map tr1/unordered_map; do + for namespace in std std::tr1; do + if test -z "$ac_cv_cxx_hash_map" -a "$stl_hash_old_gcc" != yes; then + # Some older gcc's have a buggy tr1, so test a bit of code. + AC_TRY_COMPILE([#include <$location>], + [const ${namespace}::unordered_map t; + return t.find(5) == t.end();], + [ac_cv_cxx_hash_map="<$location>"; + ac_cv_cxx_hash_namespace="$namespace"; + ac_cv_cxx_hash_map_class="unordered_map";]) + fi + done + done + # Now try hash_map + for location in ext/hash_map hash_map; do + for namespace in __gnu_cxx "" std stdext; do + if test -z "$ac_cv_cxx_hash_map"; then + AC_TRY_COMPILE([#include <$location>], + [${namespace}::hash_map t], + [ac_cv_cxx_hash_map="<$location>"; + ac_cv_cxx_hash_namespace="$namespace"; + ac_cv_cxx_hash_map_class="hash_map";]) + fi + done + done + ac_cv_cxx_hash_set=`echo "$ac_cv_cxx_hash_map" | sed s/map/set/`; + ac_cv_cxx_hash_set_class=`echo "$ac_cv_cxx_hash_map_class" | sed s/map/set/`; + if test -n "$ac_cv_cxx_hash_map"; then + AC_DEFINE(HAVE_HASH_MAP, 1, [define if the compiler has hash_map]) + AC_DEFINE(HAVE_HASH_SET, 1, [define if the compiler has hash_set]) + AC_DEFINE_UNQUOTED(HASH_MAP_H,$ac_cv_cxx_hash_map, + [the location of or ]) + AC_DEFINE_UNQUOTED(HASH_SET_H,$ac_cv_cxx_hash_set, + [the location of or ]) + AC_DEFINE_UNQUOTED(HASH_NAMESPACE,$ac_cv_cxx_hash_namespace, + [the namespace of hash_map/hash_set]) + AC_DEFINE_UNQUOTED(HASH_MAP_CLASS,$ac_cv_cxx_hash_map_class, + [the name of ]) + AC_DEFINE_UNQUOTED(HASH_SET_CLASS,$ac_cv_cxx_hash_set_class, + [the name of ]) + AC_MSG_RESULT([$ac_cv_cxx_hash_map]) + else + AC_MSG_RESULT() + AC_MSG_WARN([could not find an STL hash_map]) + fi +]) + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh b/spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh new file mode 100755 index 000000000..7b2e599d5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh @@ -0,0 +1,60 @@ +#! /bin/sh + +# This script takes the result of "make dist" and: +# 1) Unpacks it. +# 2) Ensures all contents are user-writable. Some version control systems +# keep code read-only until you explicitly ask to edit it, and the normal +# "make dist" process does not correct for this, so the result is that +# the entire dist is still marked read-only when unpacked, which is +# annoying. So, we fix it. +# 3) Convert MSVC project files to MSVC 2005, so that anyone who has version +# 2005 *or* 2008 can open them. (In version control, we keep things in +# MSVC 2008 format since that's what we use in development.) +# 4) Uses the result to create .tar.gz, .tar.bz2, and .zip versions and +# deposites them in the "dist" directory. In the .zip version, all +# non-testdata .txt files are converted to Windows-style line endings. +# 5) Cleans up after itself. + +if [ "$1" == "" ]; then + echo "USAGE: $1 DISTFILE" >&2 + exit 1 +fi + +if [ ! -e $1 ]; then + echo $1": File not found." >&2 + exit 1 +fi + +set -ex + +BASENAME=`basename $1 .tar.gz` + +# Create a directory called "dist", copy the tarball there and unpack it. +mkdir dist +cp $1 dist +cd dist +tar zxvf $BASENAME.tar.gz +rm $BASENAME.tar.gz + +# Set the entire contents to be user-writable. +chmod -R u+w $BASENAME + +# Convert the MSVC projects to MSVC 2005 format. +cd $BASENAME/vsprojects +./convert2008to2005.sh +cd .. + +# Build the dist again in .tar.gz and .tar.bz2 formats. +./configure +make dist-gzip +make dist-bzip2 + +# Convert all text files to use DOS-style line endings, then build a .zip +# distribution. +todos *.txt */*.txt +make dist-zip + +# Clean up. +mv $BASENAME.tar.gz $BASENAME.tar.bz2 $BASENAME.zip .. +cd .. +rm -rf $BASENAME diff --git a/spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in b/spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in new file mode 100644 index 000000000..29c218e5a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Protocol Buffers +Description: Google's Data Interchange Format +Version: @VERSION@ +Libs: -L${libdir} -lprotobuf-lite @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ +Cflags: -I${includedir} @PTHREAD_CFLAGS@ +# Commented out because it crashes pkg-config *sigh*: +# http://bugs.freedesktop.org/show_bug.cgi?id=13265 +# Conflicts: protobuf diff --git a/spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in b/spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in new file mode 100644 index 000000000..8a53a4311 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Protocol Buffers +Description: Google's Data Interchange Format +Version: @VERSION@ +Libs: -L${libdir} -lprotobuf @LIBS@ @PTHREAD_CFLAGS@ @PTHREAD_LIBS@ +Cflags: -I${includedir} @PTHREAD_CFLAGS@ +# Commented out because it crashes pkg-config *sigh*: +# http://bugs.freedesktop.org/show_bug.cgi?id=13265 +# Conflicts: protobuf-lite diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/README.txt b/spotify/breakpad/third_party/protobuf/protobuf/python/README.txt new file mode 100644 index 000000000..6dc144e9b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/README.txt @@ -0,0 +1,100 @@ +Protocol Buffers - Google's data interchange format +Copyright 2008 Google Inc. + +This directory contains the Python Protocol Buffers runtime library. + +Normally, this directory comes as part of the protobuf package, available +from: + + http://code.google.com/p/protobuf + +The complete package includes the C++ source code, which includes the +Protocol Compiler (protoc). If you downloaded this package from PyPI +or some other Python-specific source, you may have received only the +Python part of the code. In this case, you will need to obtain the +Protocol Compiler from some other source before you can use this +package. + +Development Warning +=================== + +The Python implementation of Protocol Buffers is not as mature as the C++ +and Java implementations. It may be more buggy, and it is known to be +pretty slow at this time. If you would like to help fix these issues, +join the Protocol Buffers discussion list and let us know! + +Installation +============ + +1) Make sure you have Python 2.4 or newer. If in doubt, run: + + $ python -V + +2) If you do not have setuptools installed, note that it will be + downloaded and installed automatically as soon as you run setup.py. + If you would rather install it manually, you may do so by following + the instructions on this page: + + http://peak.telecommunity.com/DevCenter/EasyInstall#installation-instructions + +3) Build the C++ code, or install a binary distribution of protoc. If + you install a binary distribution, make sure that it is the same + version as this package. If in doubt, run: + + $ protoc --version + +4) Run the tests: + + $ python setup.py test + + If some tests fail, this library may not work correctly on your + system. Continue at your own risk. + + Please note that there is a known problem with some versions of + Python on Cygwin which causes the tests to fail after printing the + error: "sem_init: Resource temporarily unavailable". This appears + to be a bug either in Cygwin or in Python: + http://www.cygwin.com/ml/cygwin/2005-07/msg01378.html + We do not know if or when it might me fixed. We also do not know + how likely it is that this bug will affect users in practice. + +5) Install: + + $ python setup.py install + + This step may require superuser privileges. + NOTE: To use C++ implementation, you need to install C++ protobuf runtime + library of the same version and export the environment variable before this + step. See the "C++ Implementation" section below for more details. + +Usage +===== + +The complete documentation for Protocol Buffers is available via the +web at: + + http://code.google.com/apis/protocolbuffers/ + +C++ Implementation +================== + +WARNING: This is EXPERIMENTAL and only available for CPython platforms. + +The C++ implementation for Python messages is built as a Python extension to +improve the overall protobuf Python performance. + +To use the C++ implementation, you need to: +1) Install the C++ protobuf runtime library, please see instructions in the + parent directory. +2) Export an environment variable: + + $ export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=cpp + +You need to export this variable before running setup.py script to build and +install the extension. You must also set the variable at runtime, otherwise +the pure-Python implementation will be used. In a future release, we will +change the default so that C++ implementation is used whenever it is available. +It is strongly recommended to run `python setup.py test` after setting the +variable to "cpp", so the tests will be against C++ implemented Python +messages. + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py b/spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py new file mode 100755 index 000000000..a2cf777db --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py @@ -0,0 +1,283 @@ +#!python + +# This file was obtained from: +# http://peak.telecommunity.com/dist/ez_setup.py +# on 2011/1/21. + +"""Bootstrap setuptools installation + +If you want to use setuptools in your package's setup.py, just include this +file in the same directory with it, and add this to the top of your setup.py:: + + from ez_setup import use_setuptools + use_setuptools() + +If you want to require a specific version of setuptools, set a download +mirror, or use an alternate download directory, you can do so by supplying +the appropriate options to ``use_setuptools()``. + +This file can also be run as a script to install or upgrade setuptools. +""" +import sys +DEFAULT_VERSION = "0.6c11" +DEFAULT_URL = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3] + +md5_data = { + 'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca', + 'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb', + 'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b', + 'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a', + 'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618', + 'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac', + 'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5', + 'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4', + 'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c', + 'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b', + 'setuptools-0.6c10-py2.3.egg': 'ce1e2ab5d3a0256456d9fc13800a7090', + 'setuptools-0.6c10-py2.4.egg': '57d6d9d6e9b80772c59a53a8433a5dd4', + 'setuptools-0.6c10-py2.5.egg': 'de46ac8b1c97c895572e5e8596aeb8c7', + 'setuptools-0.6c10-py2.6.egg': '58ea40aef06da02ce641495523a0b7f5', + 'setuptools-0.6c11-py2.3.egg': '2baeac6e13d414a9d28e7ba5b5a596de', + 'setuptools-0.6c11-py2.4.egg': 'bd639f9b0eac4c42497034dec2ec0c2b', + 'setuptools-0.6c11-py2.5.egg': '64c94f3bf7a72a13ec83e0b24f2749b2', + 'setuptools-0.6c11-py2.6.egg': 'bfa92100bd772d5a213eedd356d64086', + 'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27', + 'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277', + 'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa', + 'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e', + 'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e', + 'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f', + 'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2', + 'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc', + 'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167', + 'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64', + 'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d', + 'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20', + 'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab', + 'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53', + 'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2', + 'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e', + 'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372', + 'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902', + 'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de', + 'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b', + 'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03', + 'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a', + 'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6', + 'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a', +} + +import sys, os +try: from hashlib import md5 +except ImportError: from md5 import md5 + +def _validate_md5(egg_name, data): + if egg_name in md5_data: + digest = md5(data).hexdigest() + if digest != md5_data[egg_name]: + print >>sys.stderr, ( + "md5 validation of %s failed! (Possible download problem?)" + % egg_name + ) + sys.exit(2) + return data + +def use_setuptools( + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + download_delay=15 +): + """Automatically find/download setuptools and make it available on sys.path + + `version` should be a valid setuptools version number that is available + as an egg for download under the `download_base` URL (which should end with + a '/'). `to_dir` is the directory where setuptools will be downloaded, if + it is not already available. If `download_delay` is specified, it should + be the number of seconds that will be paused before initiating a download, + should one be required. If an older version of setuptools is installed, + this routine will print a message to ``sys.stderr`` and raise SystemExit in + an attempt to abort the calling script. + """ + was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules + def do_download(): + egg = download_setuptools(version, download_base, to_dir, download_delay) + sys.path.insert(0, egg) + import setuptools; setuptools.bootstrap_install_from = egg + try: + import pkg_resources + except ImportError: + return do_download() + try: + pkg_resources.require("setuptools>="+version); return + except pkg_resources.VersionConflict, e: + if was_imported: + print >>sys.stderr, ( + "The required version of setuptools (>=%s) is not available, and\n" + "can't be installed while this script is running. Please install\n" + " a more recent version first, using 'easy_install -U setuptools'." + "\n\n(Currently using %r)" + ) % (version, e.args[0]) + sys.exit(2) + except pkg_resources.DistributionNotFound: + pass + + del pkg_resources, sys.modules['pkg_resources'] # reload ok + return do_download() + +def download_setuptools( + version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir, + delay = 15 +): + """Download setuptools from a specified location and return its filename + + `version` should be a valid setuptools version number that is available + as an egg for download under the `download_base` URL (which should end + with a '/'). `to_dir` is the directory where the egg will be downloaded. + `delay` is the number of seconds to pause before an actual download attempt. + """ + import urllib2, shutil + egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3]) + url = download_base + egg_name + saveto = os.path.join(to_dir, egg_name) + src = dst = None + if not os.path.exists(saveto): # Avoid repeated downloads + try: + from distutils import log + if delay: + log.warn(""" +--------------------------------------------------------------------------- +This script requires setuptools version %s to run (even to display +help). I will attempt to download it for you (from +%s), but +you may need to enable firewall access for this script first. +I will start the download in %d seconds. + +(Note: if this machine does not have network access, please obtain the file + + %s + +and place it in this directory before rerunning this script.) +---------------------------------------------------------------------------""", + version, download_base, delay, url + ); from time import sleep; sleep(delay) + log.warn("Downloading %s", url) + src = urllib2.urlopen(url) + # Read/write all in one block, so we don't create a corrupt file + # if the download is interrupted. + data = _validate_md5(egg_name, src.read()) + dst = open(saveto,"wb"); dst.write(data) + finally: + if src: src.close() + if dst: dst.close() + return os.path.realpath(saveto) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +def main(argv, version=DEFAULT_VERSION): + """Install or upgrade setuptools and EasyInstall""" + try: + import setuptools + except ImportError: + egg = None + try: + egg = download_setuptools(version, delay=0) + sys.path.insert(0,egg) + from setuptools.command.easy_install import main + return main(list(argv)+[egg]) # we're done here + finally: + if egg and os.path.exists(egg): + os.unlink(egg) + else: + if setuptools.__version__ == '0.0.1': + print >>sys.stderr, ( + "You have an obsolete version of setuptools installed. Please\n" + "remove it from your system entirely before rerunning this script." + ) + sys.exit(2) + + req = "setuptools>="+version + import pkg_resources + try: + pkg_resources.require(req) + except pkg_resources.VersionConflict: + try: + from setuptools.command.easy_install import main + except ImportError: + from easy_install import main + main(list(argv)+[download_setuptools(delay=0)]) + sys.exit(0) # try to force an exit + else: + if argv: + from setuptools.command.easy_install import main + main(argv) + else: + print "Setuptools version",version,"or greater has been installed." + print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)' + +def update_md5(filenames): + """Update our built-in md5 registry""" + + import re + + for name in filenames: + base = os.path.basename(name) + f = open(name,'rb') + md5_data[base] = md5(f.read()).hexdigest() + f.close() + + data = [" %r: %r,\n" % it for it in md5_data.items()] + data.sort() + repl = "".join(data) + + import inspect + srcfile = inspect.getsourcefile(sys.modules[__name__]) + f = open(srcfile, 'rb'); src = f.read(); f.close() + + match = re.search("\nmd5_data = {\n([^}]+)}", src) + if not match: + print >>sys.stderr, "Internal error!" + sys.exit(2) + + src = src[:match.start(1)] + repl + src[match.end(1):] + f = open(srcfile,'w') + f.write(src) + f.close() + + +if __name__=='__main__': + if len(sys.argv)>2 and sys.argv[1]=='--md5update': + update_md5(sys.argv[2:]) + else: + main(sys.argv[1:]) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py new file mode 100755 index 000000000..de40ea7ca --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py @@ -0,0 +1 @@ +__import__('pkg_resources').declare_namespace(__name__) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py new file mode 100755 index 000000000..e69de29bb diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py new file mode 100755 index 000000000..cf609bee8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py @@ -0,0 +1,598 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Descriptors essentially contain exactly the information found in a .proto +file, in types that make this information accessible in Python. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +from google.protobuf.internal import api_implementation + + +if api_implementation.Type() == 'cpp': + from google.protobuf.internal import cpp_message + + +class Error(Exception): + """Base error for this module.""" + + +class DescriptorBase(object): + + """Descriptors base class. + + This class is the base of all descriptor classes. It provides common options + related functionaility. + + Attributes: + has_options: True if the descriptor has non-default options. Usually it + is not necessary to read this -- just call GetOptions() which will + happily return the default instance. However, it's sometimes useful + for efficiency, and also useful inside the protobuf implementation to + avoid some bootstrapping issues. + """ + + def __init__(self, options, options_class_name): + """Initialize the descriptor given its options message and the name of the + class of the options message. The name of the class is required in case + the options message is None and has to be created. + """ + self._options = options + self._options_class_name = options_class_name + + # Does this descriptor have non-default options? + self.has_options = options is not None + + def GetOptions(self): + """Retrieves descriptor options. + + This method returns the options set or creates the default options for the + descriptor. + """ + if self._options: + return self._options + from google.protobuf import descriptor_pb2 + try: + options_class = getattr(descriptor_pb2, self._options_class_name) + except AttributeError: + raise RuntimeError('Unknown options class name %s!' % + (self._options_class_name)) + self._options = options_class() + return self._options + + +class _NestedDescriptorBase(DescriptorBase): + """Common class for descriptors that can be nested.""" + + def __init__(self, options, options_class_name, name, full_name, + file, containing_type, serialized_start=None, + serialized_end=None): + """Constructor. + + Args: + options: Protocol message options or None + to use default message options. + options_class_name: (str) The class name of the above options. + + name: (str) Name of this protocol message type. + full_name: (str) Fully-qualified name of this protocol message type, + which will include protocol "package" name and the name of any + enclosing types. + file: (FileDescriptor) Reference to file info. + containing_type: if provided, this is a nested descriptor, with this + descriptor as parent, otherwise None. + serialized_start: The start index (inclusive) in block in the + file.serialized_pb that describes this descriptor. + serialized_end: The end index (exclusive) in block in the + file.serialized_pb that describes this descriptor. + """ + super(_NestedDescriptorBase, self).__init__( + options, options_class_name) + + self.name = name + # TODO(falk): Add function to calculate full_name instead of having it in + # memory? + self.full_name = full_name + self.file = file + self.containing_type = containing_type + + self._serialized_start = serialized_start + self._serialized_end = serialized_end + + def GetTopLevelContainingType(self): + """Returns the root if this is a nested type, or itself if its the root.""" + desc = self + while desc.containing_type is not None: + desc = desc.containing_type + return desc + + def CopyToProto(self, proto): + """Copies this to the matching proto in descriptor_pb2. + + Args: + proto: An empty proto instance from descriptor_pb2. + + Raises: + Error: If self couldnt be serialized, due to to few constructor arguments. + """ + if (self.file is not None and + self._serialized_start is not None and + self._serialized_end is not None): + proto.ParseFromString(self.file.serialized_pb[ + self._serialized_start:self._serialized_end]) + else: + raise Error('Descriptor does not contain serialization.') + + +class Descriptor(_NestedDescriptorBase): + + """Descriptor for a protocol message type. + + A Descriptor instance has the following attributes: + + name: (str) Name of this protocol message type. + full_name: (str) Fully-qualified name of this protocol message type, + which will include protocol "package" name and the name of any + enclosing types. + + containing_type: (Descriptor) Reference to the descriptor of the + type containing us, or None if this is top-level. + + fields: (list of FieldDescriptors) Field descriptors for all + fields in this type. + fields_by_number: (dict int -> FieldDescriptor) Same FieldDescriptor + objects as in |fields|, but indexed by "number" attribute in each + FieldDescriptor. + fields_by_name: (dict str -> FieldDescriptor) Same FieldDescriptor + objects as in |fields|, but indexed by "name" attribute in each + FieldDescriptor. + + nested_types: (list of Descriptors) Descriptor references + for all protocol message types nested within this one. + nested_types_by_name: (dict str -> Descriptor) Same Descriptor + objects as in |nested_types|, but indexed by "name" attribute + in each Descriptor. + + enum_types: (list of EnumDescriptors) EnumDescriptor references + for all enums contained within this type. + enum_types_by_name: (dict str ->EnumDescriptor) Same EnumDescriptor + objects as in |enum_types|, but indexed by "name" attribute + in each EnumDescriptor. + enum_values_by_name: (dict str -> EnumValueDescriptor) Dict mapping + from enum value name to EnumValueDescriptor for that value. + + extensions: (list of FieldDescriptor) All extensions defined directly + within this message type (NOT within a nested type). + extensions_by_name: (dict, string -> FieldDescriptor) Same FieldDescriptor + objects as |extensions|, but indexed by "name" attribute of each + FieldDescriptor. + + is_extendable: Does this type define any extension ranges? + + options: (descriptor_pb2.MessageOptions) Protocol message options or None + to use default message options. + + file: (FileDescriptor) Reference to file descriptor. + """ + + def __init__(self, name, full_name, filename, containing_type, fields, + nested_types, enum_types, extensions, options=None, + is_extendable=True, extension_ranges=None, file=None, + serialized_start=None, serialized_end=None): + """Arguments to __init__() are as described in the description + of Descriptor fields above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + super(Descriptor, self).__init__( + options, 'MessageOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_start) + + # We have fields in addition to fields_by_name and fields_by_number, + # so that: + # 1. Clients can index fields by "order in which they're listed." + # 2. Clients can easily iterate over all fields with the terse + # syntax: for f in descriptor.fields: ... + self.fields = fields + for field in self.fields: + field.containing_type = self + self.fields_by_number = dict((f.number, f) for f in fields) + self.fields_by_name = dict((f.name, f) for f in fields) + + self.nested_types = nested_types + self.nested_types_by_name = dict((t.name, t) for t in nested_types) + + self.enum_types = enum_types + for enum_type in self.enum_types: + enum_type.containing_type = self + self.enum_types_by_name = dict((t.name, t) for t in enum_types) + self.enum_values_by_name = dict( + (v.name, v) for t in enum_types for v in t.values) + + self.extensions = extensions + for extension in self.extensions: + extension.extension_scope = self + self.extensions_by_name = dict((f.name, f) for f in extensions) + self.is_extendable = is_extendable + self.extension_ranges = extension_ranges + + self._serialized_start = serialized_start + self._serialized_end = serialized_end + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.DescriptorProto. + + Args: + proto: An empty descriptor_pb2.DescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(Descriptor, self).CopyToProto(proto) + + +# TODO(robinson): We should have aggressive checking here, +# for example: +# * If you specify a repeated field, you should not be allowed +# to specify a default value. +# * [Other examples here as needed]. +# +# TODO(robinson): for this and other *Descriptor classes, we +# might also want to lock things down aggressively (e.g., +# prevent clients from setting the attributes). Having +# stronger invariants here in general will reduce the number +# of runtime checks we must do in reflection.py... +class FieldDescriptor(DescriptorBase): + + """Descriptor for a single field in a .proto file. + + A FieldDescriptor instance has the following attriubtes: + + name: (str) Name of this field, exactly as it appears in .proto. + full_name: (str) Name of this field, including containing scope. This is + particularly relevant for extensions. + index: (int) Dense, 0-indexed index giving the order that this + field textually appears within its message in the .proto file. + number: (int) Tag number declared for this field in the .proto file. + + type: (One of the TYPE_* constants below) Declared type. + cpp_type: (One of the CPPTYPE_* constants below) C++ type used to + represent this field. + + label: (One of the LABEL_* constants below) Tells whether this + field is optional, required, or repeated. + has_default_value: (bool) True if this field has a default value defined, + otherwise false. + default_value: (Varies) Default value of this field. Only + meaningful for non-repeated scalar fields. Repeated fields + should always set this to [], and non-repeated composite + fields should always set this to None. + + containing_type: (Descriptor) Descriptor of the protocol message + type that contains this field. Set by the Descriptor constructor + if we're passed into one. + Somewhat confusingly, for extension fields, this is the + descriptor of the EXTENDED message, not the descriptor + of the message containing this field. (See is_extension and + extension_scope below). + message_type: (Descriptor) If a composite field, a descriptor + of the message type contained in this field. Otherwise, this is None. + enum_type: (EnumDescriptor) If this field contains an enum, a + descriptor of that enum. Otherwise, this is None. + + is_extension: True iff this describes an extension field. + extension_scope: (Descriptor) Only meaningful if is_extension is True. + Gives the message that immediately contains this extension field. + Will be None iff we're a top-level (file-level) extension field. + + options: (descriptor_pb2.FieldOptions) Protocol message field options or + None to use default field options. + """ + + # Must be consistent with C++ FieldDescriptor::Type enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + TYPE_DOUBLE = 1 + TYPE_FLOAT = 2 + TYPE_INT64 = 3 + TYPE_UINT64 = 4 + TYPE_INT32 = 5 + TYPE_FIXED64 = 6 + TYPE_FIXED32 = 7 + TYPE_BOOL = 8 + TYPE_STRING = 9 + TYPE_GROUP = 10 + TYPE_MESSAGE = 11 + TYPE_BYTES = 12 + TYPE_UINT32 = 13 + TYPE_ENUM = 14 + TYPE_SFIXED32 = 15 + TYPE_SFIXED64 = 16 + TYPE_SINT32 = 17 + TYPE_SINT64 = 18 + MAX_TYPE = 18 + + # Must be consistent with C++ FieldDescriptor::CppType enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + CPPTYPE_INT32 = 1 + CPPTYPE_INT64 = 2 + CPPTYPE_UINT32 = 3 + CPPTYPE_UINT64 = 4 + CPPTYPE_DOUBLE = 5 + CPPTYPE_FLOAT = 6 + CPPTYPE_BOOL = 7 + CPPTYPE_ENUM = 8 + CPPTYPE_STRING = 9 + CPPTYPE_MESSAGE = 10 + MAX_CPPTYPE = 10 + + # Must be consistent with C++ FieldDescriptor::Label enum in + # descriptor.h. + # + # TODO(robinson): Find a way to eliminate this repetition. + LABEL_OPTIONAL = 1 + LABEL_REQUIRED = 2 + LABEL_REPEATED = 3 + MAX_LABEL = 3 + + def __init__(self, name, full_name, index, number, type, cpp_type, label, + default_value, message_type, enum_type, containing_type, + is_extension, extension_scope, options=None, + has_default_value=True): + """The arguments are as described in the description of FieldDescriptor + attributes above. + + Note that containing_type may be None, and may be set later if necessary + (to deal with circular references between message types, for example). + Likewise for extension_scope. + """ + super(FieldDescriptor, self).__init__(options, 'FieldOptions') + self.name = name + self.full_name = full_name + self.index = index + self.number = number + self.type = type + self.cpp_type = cpp_type + self.label = label + self.has_default_value = has_default_value + self.default_value = default_value + self.containing_type = containing_type + self.message_type = message_type + self.enum_type = enum_type + self.is_extension = is_extension + self.extension_scope = extension_scope + if api_implementation.Type() == 'cpp': + if is_extension: + self._cdescriptor = cpp_message.GetExtensionDescriptor(full_name) + else: + self._cdescriptor = cpp_message.GetFieldDescriptor(full_name) + else: + self._cdescriptor = None + + +class EnumDescriptor(_NestedDescriptorBase): + + """Descriptor for an enum defined in a .proto file. + + An EnumDescriptor instance has the following attributes: + + name: (str) Name of the enum type. + full_name: (str) Full name of the type, including package name + and any enclosing type(s). + + values: (list of EnumValueDescriptors) List of the values + in this enum. + values_by_name: (dict str -> EnumValueDescriptor) Same as |values|, + but indexed by the "name" field of each EnumValueDescriptor. + values_by_number: (dict int -> EnumValueDescriptor) Same as |values|, + but indexed by the "number" field of each EnumValueDescriptor. + containing_type: (Descriptor) Descriptor of the immediate containing + type of this enum, or None if this is an enum defined at the + top level in a .proto file. Set by Descriptor's constructor + if we're passed into one. + file: (FileDescriptor) Reference to file descriptor. + options: (descriptor_pb2.EnumOptions) Enum options message or + None to use default enum options. + """ + + def __init__(self, name, full_name, filename, values, + containing_type=None, options=None, file=None, + serialized_start=None, serialized_end=None): + """Arguments are as described in the attribute description above. + + Note that filename is an obsolete argument, that is not used anymore. + Please use file.name to access this as an attribute. + """ + super(EnumDescriptor, self).__init__( + options, 'EnumOptions', name, full_name, file, + containing_type, serialized_start=serialized_start, + serialized_end=serialized_start) + + self.values = values + for value in self.values: + value.type = self + self.values_by_name = dict((v.name, v) for v in values) + self.values_by_number = dict((v.number, v) for v in values) + + self._serialized_start = serialized_start + self._serialized_end = serialized_end + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.EnumDescriptorProto. + + Args: + proto: An empty descriptor_pb2.EnumDescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(EnumDescriptor, self).CopyToProto(proto) + + +class EnumValueDescriptor(DescriptorBase): + + """Descriptor for a single value within an enum. + + name: (str) Name of this value. + index: (int) Dense, 0-indexed index giving the order that this + value appears textually within its enum in the .proto file. + number: (int) Actual number assigned to this enum value. + type: (EnumDescriptor) EnumDescriptor to which this value + belongs. Set by EnumDescriptor's constructor if we're + passed into one. + options: (descriptor_pb2.EnumValueOptions) Enum value options message or + None to use default enum value options options. + """ + + def __init__(self, name, index, number, type=None, options=None): + """Arguments are as described in the attribute description above.""" + super(EnumValueDescriptor, self).__init__(options, 'EnumValueOptions') + self.name = name + self.index = index + self.number = number + self.type = type + + +class ServiceDescriptor(_NestedDescriptorBase): + + """Descriptor for a service. + + name: (str) Name of the service. + full_name: (str) Full name of the service, including package name. + index: (int) 0-indexed index giving the order that this services + definition appears withing the .proto file. + methods: (list of MethodDescriptor) List of methods provided by this + service. + options: (descriptor_pb2.ServiceOptions) Service options message or + None to use default service options. + file: (FileDescriptor) Reference to file info. + """ + + def __init__(self, name, full_name, index, methods, options=None, file=None, + serialized_start=None, serialized_end=None): + super(ServiceDescriptor, self).__init__( + options, 'ServiceOptions', name, full_name, file, + None, serialized_start=serialized_start, + serialized_end=serialized_end) + self.index = index + self.methods = methods + # Set the containing service for each method in this service. + for method in self.methods: + method.containing_service = self + + def FindMethodByName(self, name): + """Searches for the specified method, and returns its descriptor.""" + for method in self.methods: + if name == method.name: + return method + return None + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.ServiceDescriptorProto. + + Args: + proto: An empty descriptor_pb2.ServiceDescriptorProto. + """ + # This function is overriden to give a better doc comment. + super(ServiceDescriptor, self).CopyToProto(proto) + + +class MethodDescriptor(DescriptorBase): + + """Descriptor for a method in a service. + + name: (str) Name of the method within the service. + full_name: (str) Full name of method. + index: (int) 0-indexed index of the method inside the service. + containing_service: (ServiceDescriptor) The service that contains this + method. + input_type: The descriptor of the message that this method accepts. + output_type: The descriptor of the message that this method returns. + options: (descriptor_pb2.MethodOptions) Method options message or + None to use default method options. + """ + + def __init__(self, name, full_name, index, containing_service, + input_type, output_type, options=None): + """The arguments are as described in the description of MethodDescriptor + attributes above. + + Note that containing_service may be None, and may be set later if necessary. + """ + super(MethodDescriptor, self).__init__(options, 'MethodOptions') + self.name = name + self.full_name = full_name + self.index = index + self.containing_service = containing_service + self.input_type = input_type + self.output_type = output_type + + +class FileDescriptor(DescriptorBase): + """Descriptor for a file. Mimics the descriptor_pb2.FileDescriptorProto. + + name: name of file, relative to root of source tree. + package: name of the package + serialized_pb: (str) Byte string of serialized + descriptor_pb2.FileDescriptorProto. + """ + + def __init__(self, name, package, options=None, serialized_pb=None): + """Constructor.""" + super(FileDescriptor, self).__init__(options, 'FileOptions') + + self.message_types_by_name = {} + self.name = name + self.package = package + self.serialized_pb = serialized_pb + if (api_implementation.Type() == 'cpp' and + self.serialized_pb is not None): + cpp_message.BuildFile(self.serialized_pb) + + def CopyToProto(self, proto): + """Copies this to a descriptor_pb2.FileDescriptorProto. + + Args: + proto: An empty descriptor_pb2.FileDescriptorProto. + """ + proto.ParseFromString(self.serialized_pb) + + +def _ParseOptions(message, string): + """Parses serialized options. + + This helper function is used to parse serialized options in generated + proto2 files. It must not be used outside proto2. + """ + message.ParseFromString(string) + return message diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py new file mode 100755 index 000000000..e69de29bb diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py new file mode 100755 index 000000000..b3e412e22 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py @@ -0,0 +1,64 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +""" +This module is the central entity that determines which implementation of the +API is used. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + +import os +# This environment variable can be used to switch to a certain implementation +# of the Python API. Right now only 'python' and 'cpp' are valid values. Any +# other value will be ignored. +_implementation_type = os.getenv('PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION', + 'python') + + +if _implementation_type != 'python': + # For now, by default use the pure-Python implementation. + # The code below checks if the C extension is available and + # uses it if it is available. + _implementation_type = 'cpp' + ## Determine automatically which implementation to use. + #try: + # from google.protobuf.internal import cpp_message + # _implementation_type = 'cpp' + #except ImportError, e: + # _implementation_type = 'python' + + +# Usage of this function is discouraged. Clients shouldn't care which +# implementation of the API is in use. Note that there is no guarantee +# that differences between APIs will be maintained. +# Please don't use this function if possible. +def Type(): + return _implementation_type diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py new file mode 100755 index 000000000..097a3c269 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py @@ -0,0 +1,259 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Contains container classes to represent different protocol buffer types. + +This file defines container classes which represent categories of protocol +buffer field types which need extra maintenance. Currently these categories +are: + - Repeated scalar fields - These are all repeated fields which aren't + composite (e.g. they are of simple types like int32, string, etc). + - Repeated composite fields - Repeated fields which are composite. This + includes groups and nested messages. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class BaseContainer(object): + + """Base container class.""" + + # Minimizes memory usage and disallows assignment to other attributes. + __slots__ = ['_message_listener', '_values'] + + def __init__(self, message_listener): + """ + Args: + message_listener: A MessageListener implementation. + The RepeatedScalarFieldContainer will call this object's + Modified() method when it is modified. + """ + self._message_listener = message_listener + self._values = [] + + def __getitem__(self, key): + """Retrieves item by the specified key.""" + return self._values[key] + + def __len__(self): + """Returns the number of elements in the container.""" + return len(self._values) + + def __ne__(self, other): + """Checks if another instance isn't equal to this one.""" + # The concrete classes should define __eq__. + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def __repr__(self): + return repr(self._values) + + def sort(self, sort_function=cmp): + self._values.sort(sort_function) + + +class RepeatedScalarFieldContainer(BaseContainer): + + """Simple, type-checked, list-like container for holding repeated scalars.""" + + # Disallows assignment to other attributes. + __slots__ = ['_type_checker'] + + def __init__(self, message_listener, type_checker): + """ + Args: + message_listener: A MessageListener implementation. + The RepeatedScalarFieldContainer will call this object's + Modified() method when it is modified. + type_checker: A type_checkers.ValueChecker instance to run on elements + inserted into this container. + """ + super(RepeatedScalarFieldContainer, self).__init__(message_listener) + self._type_checker = type_checker + + def append(self, value): + """Appends an item to the list. Similar to list.append().""" + self._type_checker.CheckValue(value) + self._values.append(value) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def insert(self, key, value): + """Inserts the item at the specified position. Similar to list.insert().""" + self._type_checker.CheckValue(value) + self._values.insert(key, value) + if not self._message_listener.dirty: + self._message_listener.Modified() + + def extend(self, elem_seq): + """Extends by appending the given sequence. Similar to list.extend().""" + if not elem_seq: + return + + new_values = [] + for elem in elem_seq: + self._type_checker.CheckValue(elem) + new_values.append(elem) + self._values.extend(new_values) + self._message_listener.Modified() + + def MergeFrom(self, other): + """Appends the contents of another repeated field of the same type to this + one. We do not check the types of the individual fields. + """ + self._values.extend(other._values) + self._message_listener.Modified() + + def remove(self, elem): + """Removes an item from the list. Similar to list.remove().""" + self._values.remove(elem) + self._message_listener.Modified() + + def __setitem__(self, key, value): + """Sets the item on the specified position.""" + self._type_checker.CheckValue(value) + self._values[key] = value + self._message_listener.Modified() + + def __getslice__(self, start, stop): + """Retrieves the subset of items from between the specified indices.""" + return self._values[start:stop] + + def __setslice__(self, start, stop, values): + """Sets the subset of items from between the specified indices.""" + new_values = [] + for value in values: + self._type_checker.CheckValue(value) + new_values.append(value) + self._values[start:stop] = new_values + self._message_listener.Modified() + + def __delitem__(self, key): + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __delslice__(self, start, stop): + """Deletes the subset of items from between the specified indices.""" + del self._values[start:stop] + self._message_listener.Modified() + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + # Special case for the same type which should be common and fast. + if isinstance(other, self.__class__): + return other._values == self._values + # We are presumably comparing against some other sequence type. + return other == self._values + + +class RepeatedCompositeFieldContainer(BaseContainer): + + """Simple, list-like container for holding repeated composite fields.""" + + # Disallows assignment to other attributes. + __slots__ = ['_message_descriptor'] + + def __init__(self, message_listener, message_descriptor): + """ + Note that we pass in a descriptor instead of the generated directly, + since at the time we construct a _RepeatedCompositeFieldContainer we + haven't yet necessarily initialized the type that will be contained in the + container. + + Args: + message_listener: A MessageListener implementation. + The RepeatedCompositeFieldContainer will call this object's + Modified() method when it is modified. + message_descriptor: A Descriptor instance describing the protocol type + that should be present in this container. We'll use the + _concrete_class field of this descriptor when the client calls add(). + """ + super(RepeatedCompositeFieldContainer, self).__init__(message_listener) + self._message_descriptor = message_descriptor + + def add(self, **kwargs): + """Adds a new element at the end of the list and returns it. Keyword + arguments may be used to initialize the element. + """ + new_element = self._message_descriptor._concrete_class(**kwargs) + new_element._SetListener(self._message_listener) + self._values.append(new_element) + if not self._message_listener.dirty: + self._message_listener.Modified() + return new_element + + def extend(self, elem_seq): + """Extends by appending the given sequence of elements of the same type + as this one, copying each individual message. + """ + message_class = self._message_descriptor._concrete_class + listener = self._message_listener + values = self._values + for message in elem_seq: + new_element = message_class() + new_element._SetListener(listener) + new_element.MergeFrom(message) + values.append(new_element) + listener.Modified() + + def MergeFrom(self, other): + """Appends the contents of another repeated field of the same type to this + one, copying each individual message. + """ + self.extend(other._values) + + def __getslice__(self, start, stop): + """Retrieves the subset of items from between the specified indices.""" + return self._values[start:stop] + + def __delitem__(self, key): + """Deletes the item at the specified position.""" + del self._values[key] + self._message_listener.Modified() + + def __delslice__(self, start, stop): + """Deletes the subset of items from between the specified indices.""" + del self._values[start:stop] + self._message_listener.Modified() + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + if not isinstance(other, self.__class__): + raise TypeError('Can only compare repeated composite fields against ' + 'other repeated composite fields.') + return self._values == other._values diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py new file mode 100755 index 000000000..3f426502f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py @@ -0,0 +1,616 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Contains helper functions used to create protocol message classes from +Descriptor objects at runtime backed by the protocol buffer C++ API. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + +import operator +from google.protobuf.internal import _net_proto2___python +from google.protobuf import message + + +_LABEL_REPEATED = _net_proto2___python.LABEL_REPEATED +_LABEL_OPTIONAL = _net_proto2___python.LABEL_OPTIONAL +_CPPTYPE_MESSAGE = _net_proto2___python.CPPTYPE_MESSAGE +_TYPE_MESSAGE = _net_proto2___python.TYPE_MESSAGE + + +def GetDescriptorPool(): + """Creates a new DescriptorPool C++ object.""" + return _net_proto2___python.NewCDescriptorPool() + + +_pool = GetDescriptorPool() + + +def GetFieldDescriptor(full_field_name): + """Searches for a field descriptor given a full field name.""" + return _pool.FindFieldByName(full_field_name) + + +def BuildFile(content): + """Registers a new proto file in the underlying C++ descriptor pool.""" + _net_proto2___python.BuildFile(content) + + +def GetExtensionDescriptor(full_extension_name): + """Searches for extension descriptor given a full field name.""" + return _pool.FindExtensionByName(full_extension_name) + + +def NewCMessage(full_message_name): + """Creates a new C++ protocol message by its name.""" + return _net_proto2___python.NewCMessage(full_message_name) + + +def ScalarProperty(cdescriptor): + """Returns a scalar property for the given descriptor.""" + + def Getter(self): + return self._cmsg.GetScalar(cdescriptor) + + def Setter(self, value): + self._cmsg.SetScalar(cdescriptor, value) + + return property(Getter, Setter) + + +def CompositeProperty(cdescriptor, message_type): + """Returns a Python property the given composite field.""" + + def Getter(self): + sub_message = self._composite_fields.get(cdescriptor.name, None) + if sub_message is None: + cmessage = self._cmsg.NewSubMessage(cdescriptor) + sub_message = message_type._concrete_class(__cmessage=cmessage) + self._composite_fields[cdescriptor.name] = sub_message + return sub_message + + return property(Getter) + + +class RepeatedScalarContainer(object): + """Container for repeated scalar fields.""" + + __slots__ = ['_message', '_cfield_descriptor', '_cmsg'] + + def __init__(self, msg, cfield_descriptor): + self._message = msg + self._cmsg = msg._cmsg + self._cfield_descriptor = cfield_descriptor + + def append(self, value): + self._cmsg.AddRepeatedScalar( + self._cfield_descriptor, value) + + def extend(self, sequence): + for element in sequence: + self.append(element) + + def insert(self, key, value): + values = self[slice(None, None, None)] + values.insert(key, value) + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def remove(self, value): + values = self[slice(None, None, None)] + values.remove(value) + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def __setitem__(self, key, value): + values = self[slice(None, None, None)] + values[key] = value + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + def __getitem__(self, key): + return self._cmsg.GetRepeatedScalar(self._cfield_descriptor, key) + + def __delitem__(self, key): + self._cmsg.DeleteRepeatedField(self._cfield_descriptor, key) + + def __len__(self): + return len(self[slice(None, None, None)]) + + def __eq__(self, other): + if self is other: + return True + if not operator.isSequenceType(other): + raise TypeError( + 'Can only compare repeated scalar fields against sequences.') + # We are presumably comparing against some other sequence type. + return other == self[slice(None, None, None)] + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def sort(self, sort_function=cmp): + values = self[slice(None, None, None)] + values.sort(sort_function) + self._cmsg.AssignRepeatedScalar(self._cfield_descriptor, values) + + +def RepeatedScalarProperty(cdescriptor): + """Returns a Python property the given repeated scalar field.""" + + def Getter(self): + container = self._composite_fields.get(cdescriptor.name, None) + if container is None: + container = RepeatedScalarContainer(self, cdescriptor) + self._composite_fields[cdescriptor.name] = container + return container + + def Setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % cdescriptor.name) + + doc = 'Magic attribute generated for "%s" proto field.' % cdescriptor.name + return property(Getter, Setter, doc=doc) + + +class RepeatedCompositeContainer(object): + """Container for repeated composite fields.""" + + __slots__ = ['_message', '_subclass', '_cfield_descriptor', '_cmsg'] + + def __init__(self, msg, cfield_descriptor, subclass): + self._message = msg + self._cmsg = msg._cmsg + self._subclass = subclass + self._cfield_descriptor = cfield_descriptor + + def add(self, **kwargs): + cmessage = self._cmsg.AddMessage(self._cfield_descriptor) + return self._subclass(__cmessage=cmessage, __owner=self._message, **kwargs) + + def extend(self, elem_seq): + """Extends by appending the given sequence of elements of the same type + as this one, copying each individual message. + """ + for message in elem_seq: + self.add().MergeFrom(message) + + def MergeFrom(self, other): + for message in other[:]: + self.add().MergeFrom(message) + + def __getitem__(self, key): + cmessages = self._cmsg.GetRepeatedMessage( + self._cfield_descriptor, key) + subclass = self._subclass + if not isinstance(cmessages, list): + return subclass(__cmessage=cmessages, __owner=self._message) + + return [subclass(__cmessage=m, __owner=self._message) for m in cmessages] + + def __delitem__(self, key): + self._cmsg.DeleteRepeatedField( + self._cfield_descriptor, key) + + def __len__(self): + return self._cmsg.FieldLength(self._cfield_descriptor) + + def __eq__(self, other): + """Compares the current instance with another one.""" + if self is other: + return True + if not isinstance(other, self.__class__): + raise TypeError('Can only compare repeated composite fields against ' + 'other repeated composite fields.') + messages = self[slice(None, None, None)] + other_messages = other[slice(None, None, None)] + return messages == other_messages + + def __hash__(self): + raise TypeError('unhashable object') + + def sort(self, sort_function=cmp): + messages = [] + for index in range(len(self)): + # messages[i][0] is where the i-th element of the new array has to come + # from. + # messages[i][1] is where the i-th element of the old array has to go. + messages.append([index, 0, self[index]]) + messages.sort(lambda x,y: sort_function(x[2], y[2])) + + # Remember which position each elements has to move to. + for i in range(len(messages)): + messages[messages[i][0]][1] = i + + # Apply the transposition. + for i in range(len(messages)): + from_position = messages[i][0] + if i == from_position: + continue + self._cmsg.SwapRepeatedFieldElements( + self._cfield_descriptor, i, from_position) + messages[messages[i][1]][0] = from_position + + +def RepeatedCompositeProperty(cdescriptor, message_type): + """Returns a Python property for the given repeated composite field.""" + + def Getter(self): + container = self._composite_fields.get(cdescriptor.name, None) + if container is None: + container = RepeatedCompositeContainer( + self, cdescriptor, message_type._concrete_class) + self._composite_fields[cdescriptor.name] = container + return container + + def Setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % cdescriptor.name) + + doc = 'Magic attribute generated for "%s" proto field.' % cdescriptor.name + return property(Getter, Setter, doc=doc) + + +class ExtensionDict(object): + """Extension dictionary added to each protocol message.""" + + def __init__(self, msg): + self._message = msg + self._cmsg = msg._cmsg + self._values = {} + + def __setitem__(self, extension, value): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_OPTIONAL or + cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + raise TypeError('Extension %r is repeated and/or a composite type.' % ( + extension.full_name,)) + self._cmsg.SetScalar(cdescriptor, value) + self._values[extension] = value + + def __getitem__(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_REPEATED and + cdescriptor.cpp_type != _CPPTYPE_MESSAGE): + return self._cmsg.GetScalar(cdescriptor) + + ext = self._values.get(extension, None) + if ext is not None: + return ext + + ext = self._CreateNewHandle(extension) + self._values[extension] = ext + return ext + + def ClearExtension(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + self._cmsg.ClearFieldByDescriptor(extension._cdescriptor) + if extension in self._values: + del self._values[extension] + + def HasExtension(self, extension): + from google.protobuf import descriptor + if not isinstance(extension, descriptor.FieldDescriptor): + raise KeyError('Bad extension %r.' % (extension,)) + return self._cmsg.HasFieldByDescriptor(extension._cdescriptor) + + def _FindExtensionByName(self, name): + """Tries to find a known extension with the specified name. + + Args: + name: Extension full name. + + Returns: + Extension field descriptor. + """ + return self._message._extensions_by_name.get(name, None) + + def _CreateNewHandle(self, extension): + cdescriptor = extension._cdescriptor + if (cdescriptor.label != _LABEL_REPEATED and + cdescriptor.cpp_type == _CPPTYPE_MESSAGE): + cmessage = self._cmsg.NewSubMessage(cdescriptor) + return extension.message_type._concrete_class(__cmessage=cmessage) + + if cdescriptor.label == _LABEL_REPEATED: + if cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + return RepeatedCompositeContainer( + self._message, cdescriptor, extension.message_type._concrete_class) + else: + return RepeatedScalarContainer(self._message, cdescriptor) + # This shouldn't happen! + assert False + return None + + +def NewMessage(message_descriptor, dictionary): + """Creates a new protocol message *class*.""" + _AddClassAttributesForNestedExtensions(message_descriptor, dictionary) + _AddEnumValues(message_descriptor, dictionary) + _AddDescriptors(message_descriptor, dictionary) + + +def InitMessage(message_descriptor, cls): + """Constructs a new message instance (called before instance's __init__).""" + cls._extensions_by_name = {} + _AddInitMethod(message_descriptor, cls) + _AddMessageMethods(message_descriptor, cls) + _AddPropertiesForExtensions(message_descriptor, cls) + + +def _AddDescriptors(message_descriptor, dictionary): + """Sets up a new protocol message class dictionary. + + Args: + message_descriptor: A Descriptor instance describing this message type. + dictionary: Class dictionary to which we'll add a '__slots__' entry. + """ + dictionary['__descriptors'] = {} + for field in message_descriptor.fields: + dictionary['__descriptors'][field.name] = GetFieldDescriptor( + field.full_name) + + dictionary['__slots__'] = list(dictionary['__descriptors'].iterkeys()) + [ + '_cmsg', '_owner', '_composite_fields', 'Extensions'] + + +def _AddEnumValues(message_descriptor, dictionary): + """Sets class-level attributes for all enum fields defined in this message. + + Args: + message_descriptor: Descriptor object for this message type. + dictionary: Class dictionary that should be populated. + """ + for enum_type in message_descriptor.enum_types: + for enum_value in enum_type.values: + dictionary[enum_value.name] = enum_value.number + + +def _AddClassAttributesForNestedExtensions(message_descriptor, dictionary): + """Adds class attributes for the nested extensions.""" + extension_dict = message_descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + assert extension_name not in dictionary + dictionary[extension_name] = extension_field + + +def _AddInitMethod(message_descriptor, cls): + """Adds an __init__ method to cls.""" + + # Create and attach message field properties to the message class. + # This can be done just once per message class, since property setters and + # getters are passed the message instance. + # This makes message instantiation extremely fast, and at the same time it + # doesn't require the creation of property objects for each message instance, + # which saves a lot of memory. + for field in message_descriptor.fields: + field_cdescriptor = cls.__descriptors[field.name] + if field.label == _LABEL_REPEATED: + if field.cpp_type == _CPPTYPE_MESSAGE: + value = RepeatedCompositeProperty(field_cdescriptor, field.message_type) + else: + value = RepeatedScalarProperty(field_cdescriptor) + elif field.cpp_type == _CPPTYPE_MESSAGE: + value = CompositeProperty(field_cdescriptor, field.message_type) + else: + value = ScalarProperty(field_cdescriptor) + setattr(cls, field.name, value) + + # Attach a constant with the field number. + constant_name = field.name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, field.number) + + def Init(self, **kwargs): + """Message constructor.""" + cmessage = kwargs.pop('__cmessage', None) + if cmessage is None: + self._cmsg = NewCMessage(message_descriptor.full_name) + else: + self._cmsg = cmessage + + # Keep a reference to the owner, as the owner keeps a reference to the + # underlying protocol buffer message. + owner = kwargs.pop('__owner', None) + if owner is not None: + self._owner = owner + + self.Extensions = ExtensionDict(self) + self._composite_fields = {} + + for field_name, field_value in kwargs.iteritems(): + field_cdescriptor = self.__descriptors.get(field_name, None) + if field_cdescriptor is None: + raise ValueError('Protocol message has no "%s" field.' % field_name) + if field_cdescriptor.label == _LABEL_REPEATED: + if field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + for val in field_value: + getattr(self, field_name).add().MergeFrom(val) + else: + getattr(self, field_name).extend(field_value) + elif field_cdescriptor.cpp_type == _CPPTYPE_MESSAGE: + getattr(self, field_name).MergeFrom(field_value) + else: + setattr(self, field_name, field_value) + + Init.__module__ = None + Init.__doc__ = None + cls.__init__ = Init + + +def _IsMessageSetExtension(field): + """Checks if a field is a message set extension.""" + return (field.is_extension and + field.containing_type.has_options and + field.containing_type.GetOptions().message_set_wire_format and + field.type == _TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == _LABEL_OPTIONAL) + + +def _AddMessageMethods(message_descriptor, cls): + """Adds the methods to a protocol message class.""" + if message_descriptor.is_extendable: + + def ClearExtension(self, extension): + self.Extensions.ClearExtension(extension) + + def HasExtension(self, extension): + return self.Extensions.HasExtension(extension) + + def HasField(self, field_name): + return self._cmsg.HasField(field_name) + + def ClearField(self, field_name): + if field_name in self._composite_fields: + del self._composite_fields[field_name] + self._cmsg.ClearField(field_name) + + def Clear(self): + return self._cmsg.Clear() + + def IsInitialized(self, errors=None): + if self._cmsg.IsInitialized(): + return True + if errors is not None: + errors.extend(self.FindInitializationErrors()); + return False + + def SerializeToString(self): + if not self.IsInitialized(): + raise message.EncodeError( + 'Message is missing required fields: ' + + ','.join(self.FindInitializationErrors())) + return self._cmsg.SerializeToString() + + def SerializePartialToString(self): + return self._cmsg.SerializePartialToString() + + def ParseFromString(self, serialized): + self.Clear() + self.MergeFromString(serialized) + + def MergeFromString(self, serialized): + byte_size = self._cmsg.MergeFromString(serialized) + if byte_size < 0: + raise message.DecodeError('Unable to merge from string.') + return byte_size + + def MergeFrom(self, msg): + if not isinstance(msg, cls): + raise TypeError( + "Parameter to MergeFrom() must be instance of same class.") + self._cmsg.MergeFrom(msg._cmsg) + + def CopyFrom(self, msg): + self._cmsg.CopyFrom(msg._cmsg) + + def ByteSize(self): + return self._cmsg.ByteSize() + + def SetInParent(self): + return self._cmsg.SetInParent() + + def ListFields(self): + all_fields = [] + field_list = self._cmsg.ListFields() + fields_by_name = cls.DESCRIPTOR.fields_by_name + for is_extension, field_name in field_list: + if is_extension: + extension = cls._extensions_by_name[field_name] + all_fields.append((extension, self.Extensions[extension])) + else: + field_descriptor = fields_by_name[field_name] + all_fields.append( + (field_descriptor, getattr(self, field_name))) + all_fields.sort(key=lambda item: item[0].number) + return all_fields + + def FindInitializationErrors(self): + return self._cmsg.FindInitializationErrors() + + def __str__(self): + return self._cmsg.DebugString() + + def __eq__(self, other): + if self is other: + return True + if not isinstance(other, self.__class__): + return False + return self.ListFields() == other.ListFields() + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + def __unicode__(self): + return text_format.MessageToString(self, as_utf8=True).decode('utf-8') + + # Attach the local methods to the message class. + for key, value in locals().copy().iteritems(): + if key not in ('key', 'value', '__builtins__', '__name__', '__doc__'): + setattr(cls, key, value) + + # Static methods: + + def RegisterExtension(extension_handle): + extension_handle.containing_type = cls.DESCRIPTOR + cls._extensions_by_name[extension_handle.full_name] = extension_handle + + if _IsMessageSetExtension(extension_handle): + # MessageSet extension. Also register under type name. + cls._extensions_by_name[ + extension_handle.message_type.full_name] = extension_handle + cls.RegisterExtension = staticmethod(RegisterExtension) + + def FromString(string): + msg = cls() + msg.MergeFromString(string) + return msg + cls.FromString = staticmethod(FromString) + + + +def _AddPropertiesForExtensions(message_descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + extension_dict = message_descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + constant_name = extension_name.upper() + '_FIELD_NUMBER' + setattr(cls, constant_name, extension_field.number) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py new file mode 100755 index 000000000..55f746f50 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py @@ -0,0 +1,714 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Code for decoding protocol buffer primitives. + +This code is very similar to encoder.py -- read the docs for that module first. + +A "decoder" is a function with the signature: + Decode(buffer, pos, end, message, field_dict) +The arguments are: + buffer: The string containing the encoded message. + pos: The current position in the string. + end: The position in the string where the current message ends. May be + less than len(buffer) if we're reading a sub-message. + message: The message object into which we're parsing. + field_dict: message._fields (avoids a hashtable lookup). +The decoder reads the field and stores it into field_dict, returning the new +buffer position. A decoder for a repeated field may proactively decode all of +the elements of that field, if they appear consecutively. + +Note that decoders may throw any of the following: + IndexError: Indicates a truncated message. + struct.error: Unpacking of a fixed-width field failed. + message.DecodeError: Other errors. + +Decoders are expected to raise an exception if they are called with pos > end. +This allows callers to be lax about bounds checking: it's fineto read past +"end" as long as you are sure that someone else will notice and throw an +exception later on. + +Something up the call stack is expected to catch IndexError and struct.error +and convert them to message.DecodeError. + +Decoders are constructed using decoder constructors with the signature: + MakeDecoder(field_number, is_repeated, is_packed, key, new_default) +The arguments are: + field_number: The field number of the field we want to decode. + is_repeated: Is the field a repeated field? (bool) + is_packed: Is the field a packed field? (bool) + key: The key to use when looking up the field within field_dict. + (This is actually the FieldDescriptor but nothing in this + file should depend on that.) + new_default: A function which takes a message object as a parameter and + returns a new instance of the default value for this field. + (This is called for repeated fields and sub-messages, when an + instance does not already exist.) + +As with encoders, we define a decoder constructor for every type of field. +Then, for every field of every message class we construct an actual decoder. +That decoder goes into a dict indexed by tag, so when we decode a message +we repeatedly read a tag, look up the corresponding decoder, and invoke it. +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import struct +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import message + + +# This will overflow and thus become IEEE-754 "infinity". We would use +# "float('inf')" but it doesn't work on Windows pre-Python-2.6. +_POS_INF = 1e10000 +_NEG_INF = -_POS_INF +_NAN = _POS_INF * 0 + + +# This is not for optimization, but rather to avoid conflicts with local +# variables named "message". +_DecodeError = message.DecodeError + + +def _VarintDecoder(mask): + """Return an encoder for a basic varint value (does not include tag). + + Decoded values will be bitwise-anded with the given mask before being + returned, e.g. to limit them to 32 bits. The returned decoder does not + take the usual "end" parameter -- the caller is expected to do bounds checking + after the fact (often the caller can defer such checking until later). The + decoder returns a (value, new_pos) pair. + """ + + local_ord = ord + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = local_ord(buffer[pos]) + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + result &= mask + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + + +def _SignedVarintDecoder(mask): + """Like _VarintDecoder() but decodes signed values.""" + + local_ord = ord + def DecodeVarint(buffer, pos): + result = 0 + shift = 0 + while 1: + b = local_ord(buffer[pos]) + result |= ((b & 0x7f) << shift) + pos += 1 + if not (b & 0x80): + if result > 0x7fffffffffffffff: + result -= (1 << 64) + result |= ~mask + else: + result &= mask + return (result, pos) + shift += 7 + if shift >= 64: + raise _DecodeError('Too many bytes when decoding varint.') + return DecodeVarint + + +_DecodeVarint = _VarintDecoder((1 << 64) - 1) +_DecodeSignedVarint = _SignedVarintDecoder((1 << 64) - 1) + +# Use these versions for values which must be limited to 32 bits. +_DecodeVarint32 = _VarintDecoder((1 << 32) - 1) +_DecodeSignedVarint32 = _SignedVarintDecoder((1 << 32) - 1) + + +def ReadTag(buffer, pos): + """Read a tag from the buffer, and return a (tag_bytes, new_pos) tuple. + + We return the raw bytes of the tag rather than decoding them. The raw + bytes can then be used to look up the proper decoder. This effectively allows + us to trade some work that would be done in pure-python (decoding a varint) + for work that is done in C (searching for a byte string in a hash table). + In a low-level language it would be much cheaper to decode the varint and + use that, but not in Python. + """ + + start = pos + while ord(buffer[pos]) & 0x80: + pos += 1 + pos += 1 + return (buffer[start:pos], pos) + + +# -------------------------------------------------------------------- + + +def _SimpleDecoder(wire_type, decode_value): + """Return a constructor for a decoder for fields of a particular type. + + Args: + wire_type: The field's wire type. + decode_value: A function which decodes an individual value, e.g. + _DecodeVarint() + """ + + def SpecificDecoder(field_number, is_repeated, is_packed, key, new_default): + if is_packed: + local_DecodeVarint = _DecodeVarint + def DecodePackedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + (endpoint, pos) = local_DecodeVarint(buffer, pos) + endpoint += pos + if endpoint > end: + raise _DecodeError('Truncated message.') + while pos < endpoint: + (element, pos) = decode_value(buffer, pos) + value.append(element) + if pos > endpoint: + del value[-1] # Discard corrupt value. + raise _DecodeError('Packed element was truncated.') + return pos + return DecodePackedField + elif is_repeated: + tag_bytes = encoder.TagBytes(field_number, wire_type) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (element, new_pos) = decode_value(buffer, pos) + value.append(element) + # Predict that the next tag is another copy of the same repeated + # field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos >= end: + # Prediction failed. Return. + if new_pos > end: + raise _DecodeError('Truncated message.') + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (field_dict[key], pos) = decode_value(buffer, pos) + if pos > end: + del field_dict[key] # Discard corrupt value. + raise _DecodeError('Truncated message.') + return pos + return DecodeField + + return SpecificDecoder + + +def _ModifiedDecoder(wire_type, decode_value, modify_value): + """Like SimpleDecoder but additionally invokes modify_value on every value + before storing it. Usually modify_value is ZigZagDecode. + """ + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + def InnerDecode(buffer, pos): + (result, new_pos) = decode_value(buffer, pos) + return (modify_value(result), new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _StructPackDecoder(wire_type, format): + """Return a constructor for a decoder for a fixed-width field. + + Args: + wire_type: The field's wire type. + format: The format string to pass to struct.unpack(). + """ + + value_size = struct.calcsize(format) + local_unpack = struct.unpack + + # Reusing _SimpleDecoder is slightly slower than copying a bunch of code, but + # not enough to make a significant difference. + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + + def InnerDecode(buffer, pos): + new_pos = pos + value_size + result = local_unpack(format, buffer[pos:new_pos])[0] + return (result, new_pos) + return _SimpleDecoder(wire_type, InnerDecode) + + +def _FloatDecoder(): + """Returns a decoder for a float field. + + This code works around a bug in struct.unpack for non-finite 32-bit + floating-point values. + """ + + local_unpack = struct.unpack + + def InnerDecode(buffer, pos): + # We expect a 32-bit value in little-endian byte order. Bit 1 is the sign + # bit, bits 2-9 represent the exponent, and bits 10-32 are the significand. + new_pos = pos + 4 + float_bytes = buffer[pos:new_pos] + + # If this value has all its exponent bits set, then it's non-finite. + # In Python 2.4, struct.unpack will convert it to a finite 64-bit value. + # To avoid that, we parse it specially. + if ((float_bytes[3] in '\x7F\xFF') + and (float_bytes[2] >= '\x80')): + # If at least one significand bit is set... + if float_bytes[0:3] != '\x00\x00\x80': + return (_NAN, new_pos) + # If sign bit is set... + if float_bytes[3] == '\xFF': + return (_NEG_INF, new_pos) + return (_POS_INF, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack('= '\xF0') + and (double_bytes[0:7] != '\x00\x00\x00\x00\x00\x00\xF0')): + return (_NAN, new_pos) + + # Note that we expect someone up-stack to catch struct.error and convert + # it to _DecodeError -- this way we don't have to set up exception- + # handling blocks every time we parse one value. + result = local_unpack(' end: + raise _DecodeError('Truncated string.') + value.append(local_unicode(buffer[pos:new_pos], 'utf-8')) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + field_dict[key] = local_unicode(buffer[pos:new_pos], 'utf-8') + return new_pos + return DecodeField + + +def BytesDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a bytes field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + value.append(buffer[pos:new_pos]) + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated string.') + field_dict[key] = buffer[pos:new_pos] + return new_pos + return DecodeField + + +def GroupDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a group field.""" + + end_tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_END_GROUP) + end_tag_len = len(end_tag_bytes) + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_START_GROUP) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value.add()._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read sub-message. + pos = value._InternalParse(buffer, pos, end) + # Read end tag. + new_pos = pos+end_tag_len + if buffer[pos:new_pos] != end_tag_bytes or new_pos > end: + raise _DecodeError('Missing group end tag.') + return new_pos + return DecodeField + + +def MessageDecoder(field_number, is_repeated, is_packed, key, new_default): + """Returns a decoder for a message field.""" + + local_DecodeVarint = _DecodeVarint + + assert not is_packed + if is_repeated: + tag_bytes = encoder.TagBytes(field_number, + wire_format.WIRETYPE_LENGTH_DELIMITED) + tag_len = len(tag_bytes) + def DecodeRepeatedField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + while 1: + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value.add()._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + # Predict that the next tag is another copy of the same repeated field. + pos = new_pos + tag_len + if buffer[new_pos:pos] != tag_bytes or new_pos == end: + # Prediction failed. Return. + return new_pos + return DecodeRepeatedField + else: + def DecodeField(buffer, pos, end, message, field_dict): + value = field_dict.get(key) + if value is None: + value = field_dict.setdefault(key, new_default(message)) + # Read length. + (size, pos) = local_DecodeVarint(buffer, pos) + new_pos = pos + size + if new_pos > end: + raise _DecodeError('Truncated message.') + # Read sub-message. + if value._InternalParse(buffer, pos, new_pos) != new_pos: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + return new_pos + return DecodeField + + +# -------------------------------------------------------------------- + +MESSAGE_SET_ITEM_TAG = encoder.TagBytes(1, wire_format.WIRETYPE_START_GROUP) + +def MessageSetItemDecoder(extensions_by_number): + """Returns a decoder for a MessageSet item. + + The parameter is the _extensions_by_number map for the message class. + + The message set message looks like this: + message MessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required string message = 3; + } + } + """ + + type_id_tag_bytes = encoder.TagBytes(2, wire_format.WIRETYPE_VARINT) + message_tag_bytes = encoder.TagBytes(3, wire_format.WIRETYPE_LENGTH_DELIMITED) + item_end_tag_bytes = encoder.TagBytes(1, wire_format.WIRETYPE_END_GROUP) + + local_ReadTag = ReadTag + local_DecodeVarint = _DecodeVarint + local_SkipField = SkipField + + def DecodeItem(buffer, pos, end, message, field_dict): + type_id = -1 + message_start = -1 + message_end = -1 + + # Technically, type_id and message can appear in any order, so we need + # a little loop here. + while 1: + (tag_bytes, pos) = local_ReadTag(buffer, pos) + if tag_bytes == type_id_tag_bytes: + (type_id, pos) = local_DecodeVarint(buffer, pos) + elif tag_bytes == message_tag_bytes: + (size, message_start) = local_DecodeVarint(buffer, pos) + pos = message_end = message_start + size + elif tag_bytes == item_end_tag_bytes: + break + else: + pos = SkipField(buffer, pos, end, tag_bytes) + if pos == -1: + raise _DecodeError('Missing group end tag.') + + if pos > end: + raise _DecodeError('Truncated message.') + + if type_id == -1: + raise _DecodeError('MessageSet item missing type_id.') + if message_start == -1: + raise _DecodeError('MessageSet item missing message.') + + extension = extensions_by_number.get(type_id) + if extension is not None: + value = field_dict.get(extension) + if value is None: + value = field_dict.setdefault( + extension, extension.message_type._concrete_class()) + if value._InternalParse(buffer, message_start,message_end) != message_end: + # The only reason _InternalParse would return early is if it encountered + # an end-group tag. + raise _DecodeError('Unexpected end-group tag.') + + return pos + + return DecodeItem + +# -------------------------------------------------------------------- +# Optimization is not as heavy here because calls to SkipField() are rare, +# except for handling end-group tags. + +def _SkipVarint(buffer, pos, end): + """Skip a varint value. Returns the new position.""" + + while ord(buffer[pos]) & 0x80: + pos += 1 + pos += 1 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipFixed64(buffer, pos, end): + """Skip a fixed64 value. Returns the new position.""" + + pos += 8 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipLengthDelimited(buffer, pos, end): + """Skip a length-delimited value. Returns the new position.""" + + (size, pos) = _DecodeVarint(buffer, pos) + pos += size + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _SkipGroup(buffer, pos, end): + """Skip sub-group. Returns the new position.""" + + while 1: + (tag_bytes, pos) = ReadTag(buffer, pos) + new_pos = SkipField(buffer, pos, end, tag_bytes) + if new_pos == -1: + return pos + pos = new_pos + +def _EndGroup(buffer, pos, end): + """Skipping an END_GROUP tag returns -1 to tell the parent loop to break.""" + + return -1 + +def _SkipFixed32(buffer, pos, end): + """Skip a fixed32 value. Returns the new position.""" + + pos += 4 + if pos > end: + raise _DecodeError('Truncated message.') + return pos + +def _RaiseInvalidWireType(buffer, pos, end): + """Skip function for unknown wire types. Raises an exception.""" + + raise _DecodeError('Tag had invalid wire type.') + +def _FieldSkipper(): + """Constructs the SkipField function.""" + + WIRETYPE_TO_SKIPPER = [ + _SkipVarint, + _SkipFixed64, + _SkipLengthDelimited, + _SkipGroup, + _EndGroup, + _SkipFixed32, + _RaiseInvalidWireType, + _RaiseInvalidWireType, + ] + + wiretype_mask = wire_format.TAG_TYPE_MASK + local_ord = ord + + def SkipField(buffer, pos, end, tag_bytes): + """Skips a field with the specified tag. + + |pos| should point to the byte immediately after the tag. + + Returns: + The new position (after the tag value), or -1 if the tag is an end-group + tag (in which case the calling loop should break). + """ + + # The wire type is always in the first byte since varints are little-endian. + wire_type = local_ord(tag_bytes[0]) & wiretype_mask + return WIRETYPE_TO_SKIPPER[wire_type](buffer, pos, end) + + return SkipField + +SkipField = _FieldSkipper() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py new file mode 100755 index 000000000..05c274524 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py @@ -0,0 +1,334 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unittest for google.protobuf.internal.descriptor.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import unittest +from google.protobuf import unittest_import_pb2 +from google.protobuf import unittest_pb2 +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor +from google.protobuf import text_format + + +TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII = """ +name: 'TestEmptyMessage' +""" + + +class DescriptorTest(unittest.TestCase): + + def setUp(self): + self.my_file = descriptor.FileDescriptor( + name='some/filename/some.proto', + package='protobuf_unittest' + ) + self.my_enum = descriptor.EnumDescriptor( + name='ForeignEnum', + full_name='protobuf_unittest.ForeignEnum', + filename=None, + file=self.my_file, + values=[ + descriptor.EnumValueDescriptor(name='FOREIGN_FOO', index=0, number=4), + descriptor.EnumValueDescriptor(name='FOREIGN_BAR', index=1, number=5), + descriptor.EnumValueDescriptor(name='FOREIGN_BAZ', index=2, number=6), + ]) + self.my_message = descriptor.Descriptor( + name='NestedMessage', + full_name='protobuf_unittest.TestAllTypes.NestedMessage', + filename=None, + file=self.my_file, + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='bb', + full_name='protobuf_unittest.TestAllTypes.NestedMessage.bb', + index=0, number=1, + type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None), + ], + nested_types=[], + enum_types=[ + self.my_enum, + ], + extensions=[]) + self.my_method = descriptor.MethodDescriptor( + name='Bar', + full_name='protobuf_unittest.TestService.Bar', + index=0, + containing_service=None, + input_type=None, + output_type=None) + self.my_service = descriptor.ServiceDescriptor( + name='TestServiceWithOptions', + full_name='protobuf_unittest.TestServiceWithOptions', + file=self.my_file, + index=0, + methods=[ + self.my_method + ]) + + def testEnumFixups(self): + self.assertEqual(self.my_enum, self.my_enum.values[0].type) + + def testContainingTypeFixups(self): + self.assertEqual(self.my_message, self.my_message.fields[0].containing_type) + self.assertEqual(self.my_message, self.my_enum.containing_type) + + def testContainingServiceFixups(self): + self.assertEqual(self.my_service, self.my_method.containing_service) + + def testGetOptions(self): + self.assertEqual(self.my_enum.GetOptions(), + descriptor_pb2.EnumOptions()) + self.assertEqual(self.my_enum.values[0].GetOptions(), + descriptor_pb2.EnumValueOptions()) + self.assertEqual(self.my_message.GetOptions(), + descriptor_pb2.MessageOptions()) + self.assertEqual(self.my_message.fields[0].GetOptions(), + descriptor_pb2.FieldOptions()) + self.assertEqual(self.my_method.GetOptions(), + descriptor_pb2.MethodOptions()) + self.assertEqual(self.my_service.GetOptions(), + descriptor_pb2.ServiceOptions()) + + def testFileDescriptorReferences(self): + self.assertEqual(self.my_enum.file, self.my_file) + self.assertEqual(self.my_message.file, self.my_file) + + def testFileDescriptor(self): + self.assertEqual(self.my_file.name, 'some/filename/some.proto') + self.assertEqual(self.my_file.package, 'protobuf_unittest') + + +class DescriptorCopyToProtoTest(unittest.TestCase): + """Tests for CopyTo functions of Descriptor.""" + + def _AssertProtoEqual(self, actual_proto, expected_class, expected_ascii): + expected_proto = expected_class() + text_format.Merge(expected_ascii, expected_proto) + + self.assertEqual( + actual_proto, expected_proto, + 'Not equal,\nActual:\n%s\nExpected:\n%s\n' + % (str(actual_proto), str(expected_proto))) + + def _InternalTestCopyToProto(self, desc, expected_proto_class, + expected_proto_ascii): + actual = expected_proto_class() + desc.CopyToProto(actual) + self._AssertProtoEqual( + actual, expected_proto_class, expected_proto_ascii) + + def testCopyToProto_EmptyMessage(self): + self._InternalTestCopyToProto( + unittest_pb2.TestEmptyMessage.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII) + + def testCopyToProto_NestedMessage(self): + TEST_NESTED_MESSAGE_ASCII = """ + name: 'NestedMessage' + field: < + name: 'bb' + number: 1 + label: 1 # Optional + type: 5 # TYPE_INT32 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_NESTED_MESSAGE_ASCII) + + def testCopyToProto_ForeignNestedMessage(self): + TEST_FOREIGN_NESTED_ASCII = """ + name: 'TestForeignNested' + field: < + name: 'foreign_nested' + number: 1 + label: 1 # Optional + type: 11 # TYPE_MESSAGE + type_name: '.protobuf_unittest.TestAllTypes.NestedMessage' + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestForeignNested.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_FOREIGN_NESTED_ASCII) + + def testCopyToProto_ForeignEnum(self): + TEST_FOREIGN_ENUM_ASCII = """ + name: 'ForeignEnum' + value: < + name: 'FOREIGN_FOO' + number: 4 + > + value: < + name: 'FOREIGN_BAR' + number: 5 + > + value: < + name: 'FOREIGN_BAZ' + number: 6 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2._FOREIGNENUM, + descriptor_pb2.EnumDescriptorProto, + TEST_FOREIGN_ENUM_ASCII) + + def testCopyToProto_Options(self): + TEST_DEPRECATED_FIELDS_ASCII = """ + name: 'TestDeprecatedFields' + field: < + name: 'deprecated_int32' + number: 1 + label: 1 # Optional + type: 5 # TYPE_INT32 + options: < + deprecated: true + > + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestDeprecatedFields.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_DEPRECATED_FIELDS_ASCII) + + def testCopyToProto_AllExtensions(self): + TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII = """ + name: 'TestEmptyMessageWithExtensions' + extension_range: < + start: 1 + end: 536870912 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestEmptyMessageWithExtensions.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII) + + def testCopyToProto_SeveralExtensions(self): + TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII = """ + name: 'TestMultipleExtensionRanges' + extension_range: < + start: 42 + end: 43 + > + extension_range: < + start: 4143 + end: 4244 + > + extension_range: < + start: 65536 + end: 536870912 + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR, + descriptor_pb2.DescriptorProto, + TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII) + + def testCopyToProto_FileDescriptor(self): + UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = (""" + name: 'google/protobuf/unittest_import.proto' + package: 'protobuf_unittest_import' + message_type: < + name: 'ImportMessage' + field: < + name: 'd' + number: 1 + label: 1 # Optional + type: 5 # TYPE_INT32 + > + > + """ + + """enum_type: < + name: 'ImportEnum' + value: < + name: 'IMPORT_FOO' + number: 7 + > + value: < + name: 'IMPORT_BAR' + number: 8 + > + value: < + name: 'IMPORT_BAZ' + number: 9 + > + > + options: < + java_package: 'com.google.protobuf.test' + optimize_for: 1 # SPEED + > + """) + + self._InternalTestCopyToProto( + unittest_import_pb2.DESCRIPTOR, + descriptor_pb2.FileDescriptorProto, + UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII) + + def testCopyToProto_ServiceDescriptor(self): + TEST_SERVICE_ASCII = """ + name: 'TestService' + method: < + name: 'Foo' + input_type: '.protobuf_unittest.FooRequest' + output_type: '.protobuf_unittest.FooResponse' + > + method: < + name: 'Bar' + input_type: '.protobuf_unittest.BarRequest' + output_type: '.protobuf_unittest.BarResponse' + > + """ + + self._InternalTestCopyToProto( + unittest_pb2.TestService.DESCRIPTOR, + descriptor_pb2.ServiceDescriptorProto, + TEST_SERVICE_ASCII) + + +if __name__ == '__main__': + unittest.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py new file mode 100755 index 000000000..777975e82 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py @@ -0,0 +1,769 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Code for encoding protocol message primitives. + +Contains the logic for encoding every logical protocol field type +into one of the 5 physical wire types. + +This code is designed to push the Python interpreter's performance to the +limits. + +The basic idea is that at startup time, for every field (i.e. every +FieldDescriptor) we construct two functions: a "sizer" and an "encoder". The +sizer takes a value of this field's type and computes its byte size. The +encoder takes a writer function and a value. It encodes the value into byte +strings and invokes the writer function to write those strings. Typically the +writer function is the write() method of a cStringIO. + +We try to do as much work as possible when constructing the writer and the +sizer rather than when calling them. In particular: +* We copy any needed global functions to local variables, so that we do not need + to do costly global table lookups at runtime. +* Similarly, we try to do any attribute lookups at startup time if possible. +* Every field's tag is encoded to bytes at startup, since it can't change at + runtime. +* Whatever component of the field size we can compute at startup, we do. +* We *avoid* sharing code if doing so would make the code slower and not sharing + does not burden us too much. For example, encoders for repeated fields do + not just call the encoders for singular fields in a loop because this would + add an extra function call overhead for every loop iteration; instead, we + manually inline the single-value encoder into the loop. +* If a Python function lacks a return statement, Python actually generates + instructions to pop the result of the last statement off the stack, push + None onto the stack, and then return that. If we really don't care what + value is returned, then we can save two instructions by returning the + result of the last statement. It looks funny but it helps. +* We assume that type and bounds checking has happened at a higher level. +""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import struct +from google.protobuf.internal import wire_format + + +# This will overflow and thus become IEEE-754 "infinity". We would use +# "float('inf')" but it doesn't work on Windows pre-Python-2.6. +_POS_INF = 1e10000 +_NEG_INF = -_POS_INF + + +def _VarintSize(value): + """Compute the size of a varint value.""" + if value <= 0x7f: return 1 + if value <= 0x3fff: return 2 + if value <= 0x1fffff: return 3 + if value <= 0xfffffff: return 4 + if value <= 0x7ffffffff: return 5 + if value <= 0x3ffffffffff: return 6 + if value <= 0x1ffffffffffff: return 7 + if value <= 0xffffffffffffff: return 8 + if value <= 0x7fffffffffffffff: return 9 + return 10 + + +def _SignedVarintSize(value): + """Compute the size of a signed varint value.""" + if value < 0: return 10 + if value <= 0x7f: return 1 + if value <= 0x3fff: return 2 + if value <= 0x1fffff: return 3 + if value <= 0xfffffff: return 4 + if value <= 0x7ffffffff: return 5 + if value <= 0x3ffffffffff: return 6 + if value <= 0x1ffffffffffff: return 7 + if value <= 0xffffffffffffff: return 8 + if value <= 0x7fffffffffffffff: return 9 + return 10 + + +def _TagSize(field_number): + """Returns the number of bytes required to serialize a tag with this field + number.""" + # Just pass in type 0, since the type won't affect the tag+type size. + return _VarintSize(wire_format.PackTag(field_number, 0)) + + +# -------------------------------------------------------------------- +# In this section we define some generic sizers. Each of these functions +# takes parameters specific to a particular field type, e.g. int32 or fixed64. +# It returns another function which in turn takes parameters specific to a +# particular field, e.g. the field number and whether it is repeated or packed. +# Look at the next section to see how these are used. + + +def _SimpleSizer(compute_value_size): + """A sizer which uses the function compute_value_size to compute the size of + each value. Typically compute_value_size is _VarintSize.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = 0 + for element in value: + result += compute_value_size(element) + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += compute_value_size(element) + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + compute_value_size(value) + return FieldSize + + return SpecificSizer + + +def _ModifiedSizer(compute_value_size, modify_value): + """Like SimpleSizer, but modify_value is invoked on each value before it is + passed to compute_value_size. modify_value is typically ZigZagEncode.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = 0 + for element in value: + result += compute_value_size(modify_value(element)) + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += compute_value_size(modify_value(element)) + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + compute_value_size(modify_value(value)) + return FieldSize + + return SpecificSizer + + +def _FixedSizer(value_size): + """Like _SimpleSizer except for a fixed-size field. The input is the size + of one value.""" + + def SpecificSizer(field_number, is_repeated, is_packed): + tag_size = _TagSize(field_number) + if is_packed: + local_VarintSize = _VarintSize + def PackedFieldSize(value): + result = len(value) * value_size + return result + local_VarintSize(result) + tag_size + return PackedFieldSize + elif is_repeated: + element_size = value_size + tag_size + def RepeatedFieldSize(value): + return len(value) * element_size + return RepeatedFieldSize + else: + field_size = value_size + tag_size + def FieldSize(value): + return field_size + return FieldSize + + return SpecificSizer + + +# ==================================================================== +# Here we declare a sizer constructor for each field type. Each "sizer +# constructor" is a function that takes (field_number, is_repeated, is_packed) +# as parameters and returns a sizer, which in turn takes a field value as +# a parameter and returns its encoded size. + + +Int32Sizer = Int64Sizer = EnumSizer = _SimpleSizer(_SignedVarintSize) + +UInt32Sizer = UInt64Sizer = _SimpleSizer(_VarintSize) + +SInt32Sizer = SInt64Sizer = _ModifiedSizer( + _SignedVarintSize, wire_format.ZigZagEncode) + +Fixed32Sizer = SFixed32Sizer = FloatSizer = _FixedSizer(4) +Fixed64Sizer = SFixed64Sizer = DoubleSizer = _FixedSizer(8) + +BoolSizer = _FixedSizer(1) + + +def StringSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a string field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + local_len = len + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = local_len(element.encode('utf-8')) + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = local_len(value.encode('utf-8')) + return tag_size + local_VarintSize(l) + l + return FieldSize + + +def BytesSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a bytes field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + local_len = len + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = local_len(element) + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = local_len(value) + return tag_size + local_VarintSize(l) + l + return FieldSize + + +def GroupSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a group field.""" + + tag_size = _TagSize(field_number) * 2 + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + result += element.ByteSize() + return result + return RepeatedFieldSize + else: + def FieldSize(value): + return tag_size + value.ByteSize() + return FieldSize + + +def MessageSizer(field_number, is_repeated, is_packed): + """Returns a sizer for a message field.""" + + tag_size = _TagSize(field_number) + local_VarintSize = _VarintSize + assert not is_packed + if is_repeated: + def RepeatedFieldSize(value): + result = tag_size * len(value) + for element in value: + l = element.ByteSize() + result += local_VarintSize(l) + l + return result + return RepeatedFieldSize + else: + def FieldSize(value): + l = value.ByteSize() + return tag_size + local_VarintSize(l) + l + return FieldSize + + +# -------------------------------------------------------------------- +# MessageSet is special. + + +def MessageSetItemSizer(field_number): + """Returns a sizer for extensions of MessageSet. + + The message set message looks like this: + message MessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required string message = 3; + } + } + """ + static_size = (_TagSize(1) * 2 + _TagSize(2) + _VarintSize(field_number) + + _TagSize(3)) + local_VarintSize = _VarintSize + + def FieldSize(value): + l = value.ByteSize() + return static_size + local_VarintSize(l) + l + + return FieldSize + + +# ==================================================================== +# Encoders! + + +def _VarintEncoder(): + """Return an encoder for a basic varint value (does not include tag).""" + + local_chr = chr + def EncodeVarint(write, value): + bits = value & 0x7f + value >>= 7 + while value: + write(local_chr(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_chr(bits)) + + return EncodeVarint + + +def _SignedVarintEncoder(): + """Return an encoder for a basic signed varint value (does not include + tag).""" + + local_chr = chr + def EncodeSignedVarint(write, value): + if value < 0: + value += (1 << 64) + bits = value & 0x7f + value >>= 7 + while value: + write(local_chr(0x80|bits)) + bits = value & 0x7f + value >>= 7 + return write(local_chr(bits)) + + return EncodeSignedVarint + + +_EncodeVarint = _VarintEncoder() +_EncodeSignedVarint = _SignedVarintEncoder() + + +def _VarintBytes(value): + """Encode the given integer as a varint and return the bytes. This is only + called at startup time so it doesn't need to be fast.""" + + pieces = [] + _EncodeVarint(pieces.append, value) + return "".join(pieces) + + +def TagBytes(field_number, wire_type): + """Encode the given tag and return the bytes. Only called at startup.""" + + return _VarintBytes(wire_format.PackTag(field_number, wire_type)) + +# -------------------------------------------------------------------- +# As with sizers (see above), we have a number of common encoder +# implementations. + + +def _SimpleEncoder(wire_type, encode_value, compute_value_size): + """Return a constructor for an encoder for fields of a particular type. + + Args: + wire_type: The field's wire type, for encoding tags. + encode_value: A function which encodes an individual value, e.g. + _EncodeVarint(). + compute_value_size: A function which computes the size of an individual + value, e.g. _VarintSize(). + """ + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(element) + local_EncodeVarint(write, size) + for element in value: + encode_value(write, element) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + encode_value(write, element) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return encode_value(write, value) + return EncodeField + + return SpecificEncoder + + +def _ModifiedEncoder(wire_type, encode_value, compute_value_size, modify_value): + """Like SimpleEncoder but additionally invokes modify_value on every value + before passing it to encode_value. Usually modify_value is ZigZagEncode.""" + + def SpecificEncoder(field_number, is_repeated, is_packed): + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + size = 0 + for element in value: + size += compute_value_size(modify_value(element)) + local_EncodeVarint(write, size) + for element in value: + encode_value(write, modify_value(element)) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + encode_value(write, modify_value(element)) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return encode_value(write, modify_value(value)) + return EncodeField + + return SpecificEncoder + + +def _StructPackEncoder(wire_type, format): + """Return a constructor for an encoder for a fixed-width field. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + value_size = struct.calcsize(format) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size) + for element in value: + write(local_struct_pack(format, element)) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + write(local_struct_pack(format, element)) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + return write(local_struct_pack(format, value)) + return EncodeField + + return SpecificEncoder + + +def _FloatingPointEncoder(wire_type, format): + """Return a constructor for an encoder for float fields. + + This is like StructPackEncoder, but catches errors that may be due to + passing non-finite floating-point values to struct.pack, and makes a + second attempt to encode those values. + + Args: + wire_type: The field's wire type, for encoding tags. + format: The format string to pass to struct.pack(). + """ + + value_size = struct.calcsize(format) + if value_size == 4: + def EncodeNonFiniteOrRaise(write, value): + # Remember that the serialized form uses little-endian byte order. + if value == _POS_INF: + write('\x00\x00\x80\x7F') + elif value == _NEG_INF: + write('\x00\x00\x80\xFF') + elif value != value: # NaN + write('\x00\x00\xC0\x7F') + else: + raise + elif value_size == 8: + def EncodeNonFiniteOrRaise(write, value): + if value == _POS_INF: + write('\x00\x00\x00\x00\x00\x00\xF0\x7F') + elif value == _NEG_INF: + write('\x00\x00\x00\x00\x00\x00\xF0\xFF') + elif value != value: # NaN + write('\x00\x00\x00\x00\x00\x00\xF8\x7F') + else: + raise + else: + raise ValueError('Can\'t encode floating-point values that are ' + '%d bytes long (only 4 or 8)' % value_size) + + def SpecificEncoder(field_number, is_repeated, is_packed): + local_struct_pack = struct.pack + if is_packed: + tag_bytes = TagBytes(field_number, wire_format.WIRETYPE_LENGTH_DELIMITED) + local_EncodeVarint = _EncodeVarint + def EncodePackedField(write, value): + write(tag_bytes) + local_EncodeVarint(write, len(value) * value_size) + for element in value: + # This try/except block is going to be faster than any code that + # we could write to check whether element is finite. + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodePackedField + elif is_repeated: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeRepeatedField(write, value): + for element in value: + write(tag_bytes) + try: + write(local_struct_pack(format, element)) + except SystemError: + EncodeNonFiniteOrRaise(write, element) + return EncodeRepeatedField + else: + tag_bytes = TagBytes(field_number, wire_type) + def EncodeField(write, value): + write(tag_bytes) + try: + write(local_struct_pack(format, value)) + except SystemError: + EncodeNonFiniteOrRaise(write, value) + return EncodeField + + return SpecificEncoder + + +# ==================================================================== +# Here we declare an encoder constructor for each field type. These work +# very similarly to sizer constructors, described earlier. + + +Int32Encoder = Int64Encoder = EnumEncoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeSignedVarint, _SignedVarintSize) + +UInt32Encoder = UInt64Encoder = _SimpleEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize) + +SInt32Encoder = SInt64Encoder = _ModifiedEncoder( + wire_format.WIRETYPE_VARINT, _EncodeVarint, _VarintSize, + wire_format.ZigZagEncode) + +# Note that Python conveniently guarantees that when using the '<' prefix on +# formats, they will also have the same size across all platforms (as opposed +# to without the prefix, where their sizes depend on the C compiler's basic +# type sizes). +Fixed32Encoder = _StructPackEncoder(wire_format.WIRETYPE_FIXED32, ' 0) + self.assertTrue(isinf(message.neg_inf_double)) + self.assertTrue(message.neg_inf_double < 0) + self.assertTrue(isnan(message.nan_double)) + + self.assertTrue(isinf(message.inf_float)) + self.assertTrue(message.inf_float > 0) + self.assertTrue(isinf(message.neg_inf_float)) + self.assertTrue(message.neg_inf_float < 0) + self.assertTrue(isnan(message.nan_float)) + self.assertEqual("? ? ?? ?? ??? ??/ ??-", message.cpp_trigraph) + + def testHasDefaultValues(self): + desc = unittest_pb2.TestAllTypes.DESCRIPTOR + + expected_has_default_by_name = { + 'optional_int32': False, + 'repeated_int32': False, + 'optional_nested_message': False, + 'default_int32': True, + } + + has_default_by_name = dict( + [(f.name, f.has_default_value) + for f in desc.fields + if f.name in expected_has_default_by_name]) + self.assertEqual(expected_has_default_by_name, has_default_by_name) + + def testContainingTypeBehaviorForExtensions(self): + self.assertEqual(unittest_pb2.optional_int32_extension.containing_type, + unittest_pb2.TestAllExtensions.DESCRIPTOR) + self.assertEqual(unittest_pb2.TestRequired.single.containing_type, + unittest_pb2.TestAllExtensions.DESCRIPTOR) + + def testExtensionScope(self): + self.assertEqual(unittest_pb2.optional_int32_extension.extension_scope, + None) + self.assertEqual(unittest_pb2.TestRequired.single.extension_scope, + unittest_pb2.TestRequired.DESCRIPTOR) + + def testIsExtension(self): + self.assertTrue(unittest_pb2.optional_int32_extension.is_extension) + self.assertTrue(unittest_pb2.TestRequired.single.is_extension) + + message_descriptor = unittest_pb2.TestRequired.DESCRIPTOR + non_extension_descriptor = message_descriptor.fields_by_name['a'] + self.assertTrue(not non_extension_descriptor.is_extension) + + def testOptions(self): + proto = unittest_mset_pb2.TestMessageSet() + self.assertTrue(proto.DESCRIPTOR.GetOptions().message_set_wire_format) + + def testMessageWithCustomOptions(self): + proto = unittest_custom_options_pb2.TestMessageWithCustomOptions() + enum_options = proto.DESCRIPTOR.enum_types_by_name['AnEnum'].GetOptions() + self.assertTrue(enum_options is not None) + # TODO(gps): We really should test for the presense of the enum_opt1 + # extension and for its value to be set to -789. + + def testNestedTypes(self): + self.assertEquals( + set(unittest_pb2.TestAllTypes.DESCRIPTOR.nested_types), + set([ + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR, + unittest_pb2.TestAllTypes.OptionalGroup.DESCRIPTOR, + unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR, + ])) + self.assertEqual(unittest_pb2.TestEmptyMessage.DESCRIPTOR.nested_types, []) + self.assertEqual( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.nested_types, []) + + def testContainingType(self): + self.assertTrue( + unittest_pb2.TestEmptyMessage.DESCRIPTOR.containing_type is None) + self.assertTrue( + unittest_pb2.TestAllTypes.DESCRIPTOR.containing_type is None) + self.assertEqual( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + self.assertEqual( + unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + self.assertEqual( + unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + + def testContainingTypeInEnumDescriptor(self): + self.assertTrue(unittest_pb2._FOREIGNENUM.containing_type is None) + self.assertEqual(unittest_pb2._TESTALLTYPES_NESTEDENUM.containing_type, + unittest_pb2.TestAllTypes.DESCRIPTOR) + + def testPackage(self): + self.assertEqual( + unittest_pb2.TestAllTypes.DESCRIPTOR.file.package, + 'protobuf_unittest') + desc = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR + self.assertEqual(desc.file.package, 'protobuf_unittest') + self.assertEqual( + unittest_import_pb2.ImportMessage.DESCRIPTOR.file.package, + 'protobuf_unittest_import') + + self.assertEqual( + unittest_pb2._FOREIGNENUM.file.package, 'protobuf_unittest') + self.assertEqual( + unittest_pb2._TESTALLTYPES_NESTEDENUM.file.package, + 'protobuf_unittest') + self.assertEqual( + unittest_import_pb2._IMPORTENUM.file.package, + 'protobuf_unittest_import') + + def testExtensionRange(self): + self.assertEqual( + unittest_pb2.TestAllTypes.DESCRIPTOR.extension_ranges, []) + self.assertEqual( + unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges, + [(1, MAX_EXTENSION)]) + self.assertEqual( + unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges, + [(42, 43), (4143, 4244), (65536, MAX_EXTENSION)]) + + def testFileDescriptor(self): + self.assertEqual(unittest_pb2.DESCRIPTOR.name, + 'google/protobuf/unittest.proto') + self.assertEqual(unittest_pb2.DESCRIPTOR.package, 'protobuf_unittest') + self.assertFalse(unittest_pb2.DESCRIPTOR.serialized_pb is None) + + def testNoGenericServices(self): + self.assertTrue(hasattr(unittest_no_generic_services_pb2, "TestMessage")) + self.assertTrue(hasattr(unittest_no_generic_services_pb2, "FOO")) + self.assertTrue(hasattr(unittest_no_generic_services_pb2, "test_extension")) + + # Make sure unittest_no_generic_services_pb2 has no services subclassing + # Proto2 Service class. + if hasattr(unittest_no_generic_services_pb2, "TestService"): + self.assertFalse(issubclass(unittest_no_generic_services_pb2.TestService, + service.Service)) + + def testMessageTypesByName(self): + file_type = unittest_pb2.DESCRIPTOR + self.assertEqual( + unittest_pb2._TESTALLTYPES, + file_type.message_types_by_name[unittest_pb2._TESTALLTYPES.name]) + + # Nested messages shouldn't be included in the message_types_by_name + # dictionary (like in the C++ API). + self.assertFalse( + unittest_pb2._TESTALLTYPES_NESTEDMESSAGE.name in + file_type.message_types_by_name) + + +if __name__ == '__main__': + unittest.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py new file mode 100755 index 000000000..1080234da --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py @@ -0,0 +1,78 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Defines a listener interface for observing certain +state transitions on Message objects. + +Also defines a null implementation of this interface. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +class MessageListener(object): + + """Listens for modifications made to a message. Meant to be registered via + Message._SetListener(). + + Attributes: + dirty: If True, then calling Modified() would be a no-op. This can be + used to avoid these calls entirely in the common case. + """ + + def Modified(self): + """Called every time the message is modified in such a way that the parent + message may need to be updated. This currently means either: + (a) The message was modified for the first time, so the parent message + should henceforth mark the message as present. + (b) The message's cached byte size became dirty -- i.e. the message was + modified for the first time after a previous call to ByteSize(). + Therefore the parent should also mark its byte size as dirty. + Note that (a) implies (b), since new objects start out with a client cached + size (zero). However, we document (a) explicitly because it is important. + + Modified() will *only* be called in response to one of these two events -- + not every time the sub-message is modified. + + Note that if the listener's |dirty| attribute is true, then calling + Modified at the moment would be a no-op, so it can be skipped. Performance- + sensitive callers should check this attribute directly before calling since + it will be true most of the time. + """ + + raise NotImplementedError + + +class NullMessageListener(object): + + """No-op MessageListener implementation.""" + + def Modified(self): + pass diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py new file mode 100755 index 000000000..65174373d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py @@ -0,0 +1,343 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Tests python protocol buffers against the golden message. + +Note that the golden messages exercise every known field type, thus this +test ends up exercising and verifying nearly all of the parsing and +serialization code in the whole library. + +TODO(kenton): Merge with wire_format_test? It doesn't make a whole lot of +sense to call this a test of the "message" module, which only declares an +abstract interface. +""" + +__author__ = 'gps@google.com (Gregory P. Smith)' + +import copy +import math +import unittest +from google.protobuf import unittest_import_pb2 +from google.protobuf import unittest_pb2 +from google.protobuf.internal import test_util + +# Python pre-2.6 does not have isinf() or isnan() functions, so we have +# to provide our own. +def isnan(val): + # NaN is never equal to itself. + return val != val +def isinf(val): + # Infinity times zero equals NaN. + return not isnan(val) and isnan(val * 0) +def IsPosInf(val): + return isinf(val) and (val > 0) +def IsNegInf(val): + return isinf(val) and (val < 0) + +class MessageTest(unittest.TestCase): + + def testGoldenMessage(self): + golden_data = test_util.GoldenFile('golden_message').read() + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + test_util.ExpectAllFieldsSet(self, golden_message) + self.assertTrue(golden_message.SerializeToString() == golden_data) + golden_copy = copy.deepcopy(golden_message) + self.assertTrue(golden_copy.SerializeToString() == golden_data) + + def testGoldenExtensions(self): + golden_data = test_util.GoldenFile('golden_message').read() + golden_message = unittest_pb2.TestAllExtensions() + golden_message.ParseFromString(golden_data) + all_set = unittest_pb2.TestAllExtensions() + test_util.SetAllExtensions(all_set) + self.assertEquals(all_set, golden_message) + self.assertTrue(golden_message.SerializeToString() == golden_data) + golden_copy = copy.deepcopy(golden_message) + self.assertTrue(golden_copy.SerializeToString() == golden_data) + + def testGoldenPackedMessage(self): + golden_data = test_util.GoldenFile('golden_packed_fields_message').read() + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + all_set = unittest_pb2.TestPackedTypes() + test_util.SetAllPackedFields(all_set) + self.assertEquals(all_set, golden_message) + self.assertTrue(all_set.SerializeToString() == golden_data) + golden_copy = copy.deepcopy(golden_message) + self.assertTrue(golden_copy.SerializeToString() == golden_data) + + def testGoldenPackedExtensions(self): + golden_data = test_util.GoldenFile('golden_packed_fields_message').read() + golden_message = unittest_pb2.TestPackedExtensions() + golden_message.ParseFromString(golden_data) + all_set = unittest_pb2.TestPackedExtensions() + test_util.SetAllPackedExtensions(all_set) + self.assertEquals(all_set, golden_message) + self.assertTrue(all_set.SerializeToString() == golden_data) + golden_copy = copy.deepcopy(golden_message) + self.assertTrue(golden_copy.SerializeToString() == golden_data) + + def testPositiveInfinity(self): + golden_data = ('\x5D\x00\x00\x80\x7F' + '\x61\x00\x00\x00\x00\x00\x00\xF0\x7F' + '\xCD\x02\x00\x00\x80\x7F' + '\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\x7F') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsPosInf(golden_message.optional_float)) + self.assertTrue(IsPosInf(golden_message.optional_double)) + self.assertTrue(IsPosInf(golden_message.repeated_float[0])) + self.assertTrue(IsPosInf(golden_message.repeated_double[0])) + self.assertTrue(golden_message.SerializeToString() == golden_data) + + def testNegativeInfinity(self): + golden_data = ('\x5D\x00\x00\x80\xFF' + '\x61\x00\x00\x00\x00\x00\x00\xF0\xFF' + '\xCD\x02\x00\x00\x80\xFF' + '\xD1\x02\x00\x00\x00\x00\x00\x00\xF0\xFF') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsNegInf(golden_message.optional_float)) + self.assertTrue(IsNegInf(golden_message.optional_double)) + self.assertTrue(IsNegInf(golden_message.repeated_float[0])) + self.assertTrue(IsNegInf(golden_message.repeated_double[0])) + self.assertTrue(golden_message.SerializeToString() == golden_data) + + def testNotANumber(self): + golden_data = ('\x5D\x00\x00\xC0\x7F' + '\x61\x00\x00\x00\x00\x00\x00\xF8\x7F' + '\xCD\x02\x00\x00\xC0\x7F' + '\xD1\x02\x00\x00\x00\x00\x00\x00\xF8\x7F') + golden_message = unittest_pb2.TestAllTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(isnan(golden_message.optional_float)) + self.assertTrue(isnan(golden_message.optional_double)) + self.assertTrue(isnan(golden_message.repeated_float[0])) + self.assertTrue(isnan(golden_message.repeated_double[0])) + self.assertTrue(golden_message.SerializeToString() == golden_data) + + def testPositiveInfinityPacked(self): + golden_data = ('\xA2\x06\x04\x00\x00\x80\x7F' + '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\x7F') + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsPosInf(golden_message.packed_float[0])) + self.assertTrue(IsPosInf(golden_message.packed_double[0])) + self.assertTrue(golden_message.SerializeToString() == golden_data) + + def testNegativeInfinityPacked(self): + golden_data = ('\xA2\x06\x04\x00\x00\x80\xFF' + '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF0\xFF') + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(IsNegInf(golden_message.packed_float[0])) + self.assertTrue(IsNegInf(golden_message.packed_double[0])) + self.assertTrue(golden_message.SerializeToString() == golden_data) + + def testNotANumberPacked(self): + golden_data = ('\xA2\x06\x04\x00\x00\xC0\x7F' + '\xAA\x06\x08\x00\x00\x00\x00\x00\x00\xF8\x7F') + golden_message = unittest_pb2.TestPackedTypes() + golden_message.ParseFromString(golden_data) + self.assertTrue(isnan(golden_message.packed_float[0])) + self.assertTrue(isnan(golden_message.packed_double[0])) + self.assertTrue(golden_message.SerializeToString() == golden_data) + + def testExtremeFloatValues(self): + message = unittest_pb2.TestAllTypes() + + # Most positive exponent, no significand bits set. + kMostPosExponentNoSigBits = math.pow(2, 127) + message.optional_float = kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostPosExponentNoSigBits) + + # Most positive exponent, one significand bit set. + kMostPosExponentOneSigBit = 1.5 * math.pow(2, 127) + message.optional_float = kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostPosExponentOneSigBit) + + # Repeat last two cases with values of same magnitude, but negative. + message.optional_float = -kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostPosExponentNoSigBits) + + message.optional_float = -kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostPosExponentOneSigBit) + + # Most negative exponent, no significand bits set. + kMostNegExponentNoSigBits = math.pow(2, -127) + message.optional_float = kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostNegExponentNoSigBits) + + # Most negative exponent, one significand bit set. + kMostNegExponentOneSigBit = 1.5 * math.pow(2, -127) + message.optional_float = kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == kMostNegExponentOneSigBit) + + # Repeat last two cases with values of the same magnitude, but negative. + message.optional_float = -kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostNegExponentNoSigBits) + + message.optional_float = -kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_float == -kMostNegExponentOneSigBit) + + def testExtremeFloatValues(self): + message = unittest_pb2.TestAllTypes() + + # Most positive exponent, no significand bits set. + kMostPosExponentNoSigBits = math.pow(2, 1023) + message.optional_double = kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostPosExponentNoSigBits) + + # Most positive exponent, one significand bit set. + kMostPosExponentOneSigBit = 1.5 * math.pow(2, 1023) + message.optional_double = kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostPosExponentOneSigBit) + + # Repeat last two cases with values of same magnitude, but negative. + message.optional_double = -kMostPosExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostPosExponentNoSigBits) + + message.optional_double = -kMostPosExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostPosExponentOneSigBit) + + # Most negative exponent, no significand bits set. + kMostNegExponentNoSigBits = math.pow(2, -1023) + message.optional_double = kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostNegExponentNoSigBits) + + # Most negative exponent, one significand bit set. + kMostNegExponentOneSigBit = 1.5 * math.pow(2, -1023) + message.optional_double = kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == kMostNegExponentOneSigBit) + + # Repeat last two cases with values of the same magnitude, but negative. + message.optional_double = -kMostNegExponentNoSigBits + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostNegExponentNoSigBits) + + message.optional_double = -kMostNegExponentOneSigBit + message.ParseFromString(message.SerializeToString()) + self.assertTrue(message.optional_double == -kMostNegExponentOneSigBit) + + def testSortingRepeatedScalarFieldsDefaultComparator(self): + """Check some different types with the default comparator.""" + message = unittest_pb2.TestAllTypes() + + # TODO(mattp): would testing more scalar types strengthen test? + message.repeated_int32.append(1) + message.repeated_int32.append(3) + message.repeated_int32.append(2) + message.repeated_int32.sort() + self.assertEqual(message.repeated_int32[0], 1) + self.assertEqual(message.repeated_int32[1], 2) + self.assertEqual(message.repeated_int32[2], 3) + + message.repeated_float.append(1.1) + message.repeated_float.append(1.3) + message.repeated_float.append(1.2) + message.repeated_float.sort() + self.assertAlmostEqual(message.repeated_float[0], 1.1) + self.assertAlmostEqual(message.repeated_float[1], 1.2) + self.assertAlmostEqual(message.repeated_float[2], 1.3) + + message.repeated_string.append('a') + message.repeated_string.append('c') + message.repeated_string.append('b') + message.repeated_string.sort() + self.assertEqual(message.repeated_string[0], 'a') + self.assertEqual(message.repeated_string[1], 'b') + self.assertEqual(message.repeated_string[2], 'c') + + message.repeated_bytes.append('a') + message.repeated_bytes.append('c') + message.repeated_bytes.append('b') + message.repeated_bytes.sort() + self.assertEqual(message.repeated_bytes[0], 'a') + self.assertEqual(message.repeated_bytes[1], 'b') + self.assertEqual(message.repeated_bytes[2], 'c') + + def testSortingRepeatedScalarFieldsCustomComparator(self): + """Check some different types with custom comparator.""" + message = unittest_pb2.TestAllTypes() + + message.repeated_int32.append(-3) + message.repeated_int32.append(-2) + message.repeated_int32.append(-1) + message.repeated_int32.sort(lambda x,y: cmp(abs(x), abs(y))) + self.assertEqual(message.repeated_int32[0], -1) + self.assertEqual(message.repeated_int32[1], -2) + self.assertEqual(message.repeated_int32[2], -3) + + message.repeated_string.append('aaa') + message.repeated_string.append('bb') + message.repeated_string.append('c') + message.repeated_string.sort(lambda x,y: cmp(len(x), len(y))) + self.assertEqual(message.repeated_string[0], 'c') + self.assertEqual(message.repeated_string[1], 'bb') + self.assertEqual(message.repeated_string[2], 'aaa') + + def testSortingRepeatedCompositeFieldsCustomComparator(self): + """Check passing a custom comparator to sort a repeated composite field.""" + message = unittest_pb2.TestAllTypes() + + message.repeated_nested_message.add().bb = 1 + message.repeated_nested_message.add().bb = 3 + message.repeated_nested_message.add().bb = 2 + message.repeated_nested_message.add().bb = 6 + message.repeated_nested_message.add().bb = 5 + message.repeated_nested_message.add().bb = 4 + message.repeated_nested_message.sort(lambda x,y: cmp(x.bb, y.bb)) + self.assertEqual(message.repeated_nested_message[0].bb, 1) + self.assertEqual(message.repeated_nested_message[1].bb, 2) + self.assertEqual(message.repeated_nested_message[2].bb, 3) + self.assertEqual(message.repeated_nested_message[3].bb, 4) + self.assertEqual(message.repeated_nested_message[4].bb, 5) + self.assertEqual(message.repeated_nested_message[5].bb, 6) + + +if __name__ == '__main__': + unittest.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto new file mode 100644 index 000000000..e2d970104 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto @@ -0,0 +1,58 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: robinson@google.com (Will Robinson) + + +package google.protobuf.internal; + + +message TopLevelMessage { + optional ExtendedMessage submessage = 1; +} + + +message ExtendedMessage { + extensions 1 to max; +} + + +message ForeignMessage { + optional int32 foreign_message_int = 1; +} + + +extend ExtendedMessage { + optional int32 optional_int_extension = 1; + optional ForeignMessage optional_message_extension = 2; + + repeated int32 repeated_int_extension = 3; + repeated ForeignMessage repeated_message_extension = 4; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto new file mode 100644 index 000000000..c701b4460 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: robinson@google.com (Will Robinson) + + +package google.protobuf.internal; + +// A message where tag numbers are listed out of order, to allow us to test our +// canonicalization of serialized output, which should always be in tag order. +// We also mix in some extensions for extra fun. +message OutOfOrderFields { + optional sint32 optional_sint32 = 5; + extensions 4 to 4; + optional uint32 optional_uint32 = 3; + extensions 2 to 2; + optional int32 optional_int32 = 1; +}; + + +extend OutOfOrderFields { + optional uint64 optional_uint64 = 4; + optional int64 optional_int64 = 2; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py new file mode 100755 index 000000000..66fca918f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py @@ -0,0 +1,1098 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This code is meant to work on Python 2.4 and above only. +# +# TODO(robinson): Helpers for verbose, common checks like seeing if a +# descriptor's cpp_type is CPPTYPE_MESSAGE. + +"""Contains a metaclass and helper functions used to create +protocol message classes from Descriptor objects at runtime. + +Recall that a metaclass is the "type" of a class. +(A class is to a metaclass what an instance is to a class.) + +In this case, we use the GeneratedProtocolMessageType metaclass +to inject all the useful functionality into the classes +output by the protocol compiler at compile-time. + +The upshot of all this is that the real implementation +details for ALL pure-Python protocol buffers are *here in +this file*. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +try: + from cStringIO import StringIO +except ImportError: + from StringIO import StringIO +import struct +import weakref + +# We use "as" to avoid name collisions with variables. +from google.protobuf.internal import containers +from google.protobuf.internal import decoder +from google.protobuf.internal import encoder +from google.protobuf.internal import message_listener as message_listener_mod +from google.protobuf.internal import type_checkers +from google.protobuf.internal import wire_format +from google.protobuf import descriptor as descriptor_mod +from google.protobuf import message as message_mod +from google.protobuf import text_format + +_FieldDescriptor = descriptor_mod.FieldDescriptor + + +def NewMessage(descriptor, dictionary): + _AddClassAttributesForNestedExtensions(descriptor, dictionary) + _AddSlots(descriptor, dictionary) + + +def InitMessage(descriptor, cls): + cls._decoders_by_tag = {} + cls._extensions_by_name = {} + cls._extensions_by_number = {} + if (descriptor.has_options and + descriptor.GetOptions().message_set_wire_format): + cls._decoders_by_tag[decoder.MESSAGE_SET_ITEM_TAG] = ( + decoder.MessageSetItemDecoder(cls._extensions_by_number)) + + # Attach stuff to each FieldDescriptor for quick lookup later on. + for field in descriptor.fields: + _AttachFieldHelpers(cls, field) + + _AddEnumValues(descriptor, cls) + _AddInitMethod(descriptor, cls) + _AddPropertiesForFields(descriptor, cls) + _AddPropertiesForExtensions(descriptor, cls) + _AddStaticMethods(cls) + _AddMessageMethods(descriptor, cls) + _AddPrivateHelperMethods(cls) + + +# Stateless helpers for GeneratedProtocolMessageType below. +# Outside clients should not access these directly. +# +# I opted not to make any of these methods on the metaclass, to make it more +# clear that I'm not really using any state there and to keep clients from +# thinking that they have direct access to these construction helpers. + + +def _PropertyName(proto_field_name): + """Returns the name of the public property attribute which + clients can use to get and (in some cases) set the value + of a protocol message field. + + Args: + proto_field_name: The protocol message field name, exactly + as it appears (or would appear) in a .proto file. + """ + # TODO(robinson): Escape Python keywords (e.g., yield), and test this support. + # nnorwitz makes my day by writing: + # """ + # FYI. See the keyword module in the stdlib. This could be as simple as: + # + # if keyword.iskeyword(proto_field_name): + # return proto_field_name + "_" + # return proto_field_name + # """ + # Kenton says: The above is a BAD IDEA. People rely on being able to use + # getattr() and setattr() to reflectively manipulate field values. If we + # rename the properties, then every such user has to also make sure to apply + # the same transformation. Note that currently if you name a field "yield", + # you can still access it just fine using getattr/setattr -- it's not even + # that cumbersome to do so. + # TODO(kenton): Remove this method entirely if/when everyone agrees with my + # position. + return proto_field_name + + +def _VerifyExtensionHandle(message, extension_handle): + """Verify that the given extension handle is valid.""" + + if not isinstance(extension_handle, _FieldDescriptor): + raise KeyError('HasExtension() expects an extension handle, got: %s' % + extension_handle) + + if not extension_handle.is_extension: + raise KeyError('"%s" is not an extension.' % extension_handle.full_name) + + if extension_handle.containing_type is not message.DESCRIPTOR: + raise KeyError('Extension "%s" extends message type "%s", but this ' + 'message is of type "%s".' % + (extension_handle.full_name, + extension_handle.containing_type.full_name, + message.DESCRIPTOR.full_name)) + + +def _AddSlots(message_descriptor, dictionary): + """Adds a __slots__ entry to dictionary, containing the names of all valid + attributes for this message type. + + Args: + message_descriptor: A Descriptor instance describing this message type. + dictionary: Class dictionary to which we'll add a '__slots__' entry. + """ + dictionary['__slots__'] = ['_cached_byte_size', + '_cached_byte_size_dirty', + '_fields', + '_is_present_in_parent', + '_listener', + '_listener_for_children', + '__weakref__'] + + +def _IsMessageSetExtension(field): + return (field.is_extension and + field.containing_type.has_options and + field.containing_type.GetOptions().message_set_wire_format and + field.type == _FieldDescriptor.TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == _FieldDescriptor.LABEL_OPTIONAL) + + +def _AttachFieldHelpers(cls, field_descriptor): + is_repeated = (field_descriptor.label == _FieldDescriptor.LABEL_REPEATED) + is_packed = (field_descriptor.has_options and + field_descriptor.GetOptions().packed) + + if _IsMessageSetExtension(field_descriptor): + field_encoder = encoder.MessageSetItemEncoder(field_descriptor.number) + sizer = encoder.MessageSetItemSizer(field_descriptor.number) + else: + field_encoder = type_checkers.TYPE_TO_ENCODER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed) + sizer = type_checkers.TYPE_TO_SIZER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed) + + field_descriptor._encoder = field_encoder + field_descriptor._sizer = sizer + field_descriptor._default_constructor = _DefaultValueConstructorForField( + field_descriptor) + + def AddDecoder(wiretype, is_packed): + tag_bytes = encoder.TagBytes(field_descriptor.number, wiretype) + cls._decoders_by_tag[tag_bytes] = ( + type_checkers.TYPE_TO_DECODER[field_descriptor.type]( + field_descriptor.number, is_repeated, is_packed, + field_descriptor, field_descriptor._default_constructor)) + + AddDecoder(type_checkers.FIELD_TYPE_TO_WIRE_TYPE[field_descriptor.type], + False) + + if is_repeated and wire_format.IsTypePackable(field_descriptor.type): + # To support wire compatibility of adding packed = true, add a decoder for + # packed values regardless of the field's options. + AddDecoder(wire_format.WIRETYPE_LENGTH_DELIMITED, True) + + +def _AddClassAttributesForNestedExtensions(descriptor, dictionary): + extension_dict = descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + assert extension_name not in dictionary + dictionary[extension_name] = extension_field + + +def _AddEnumValues(descriptor, cls): + """Sets class-level attributes for all enum fields defined in this message. + + Args: + descriptor: Descriptor object for this message type. + cls: Class we're constructing for this message type. + """ + for enum_type in descriptor.enum_types: + for enum_value in enum_type.values: + setattr(cls, enum_value.name, enum_value.number) + + +def _DefaultValueConstructorForField(field): + """Returns a function which returns a default value for a field. + + Args: + field: FieldDescriptor object for this field. + + The returned function has one argument: + message: Message instance containing this field, or a weakref proxy + of same. + + That function in turn returns a default value for this field. The default + value may refer back to |message| via a weak reference. + """ + + if field.label == _FieldDescriptor.LABEL_REPEATED: + if field.default_value != []: + raise ValueError('Repeated field default value not empty list: %s' % ( + field.default_value)) + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + # We can't look at _concrete_class yet since it might not have + # been set. (Depends on order in which we initialize the classes). + message_type = field.message_type + def MakeRepeatedMessageDefault(message): + return containers.RepeatedCompositeFieldContainer( + message._listener_for_children, field.message_type) + return MakeRepeatedMessageDefault + else: + type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type) + def MakeRepeatedScalarDefault(message): + return containers.RepeatedScalarFieldContainer( + message._listener_for_children, type_checker) + return MakeRepeatedScalarDefault + + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + # _concrete_class may not yet be initialized. + message_type = field.message_type + def MakeSubMessageDefault(message): + result = message_type._concrete_class() + result._SetListener(message._listener_for_children) + return result + return MakeSubMessageDefault + + def MakeScalarDefault(message): + return field.default_value + return MakeScalarDefault + + +def _AddInitMethod(message_descriptor, cls): + """Adds an __init__ method to cls.""" + fields = message_descriptor.fields + def init(self, **kwargs): + self._cached_byte_size = 0 + self._cached_byte_size_dirty = len(kwargs) > 0 + self._fields = {} + self._is_present_in_parent = False + self._listener = message_listener_mod.NullMessageListener() + self._listener_for_children = _Listener(self) + for field_name, field_value in kwargs.iteritems(): + field = _GetFieldByName(message_descriptor, field_name) + if field is None: + raise TypeError("%s() got an unexpected keyword argument '%s'" % + (message_descriptor.name, field_name)) + if field.label == _FieldDescriptor.LABEL_REPEATED: + copy = field._default_constructor(self) + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: # Composite + for val in field_value: + copy.add().MergeFrom(val) + else: # Scalar + copy.extend(field_value) + self._fields[field] = copy + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + copy = field._default_constructor(self) + copy.MergeFrom(field_value) + self._fields[field] = copy + else: + setattr(self, field_name, field_value) + + init.__module__ = None + init.__doc__ = None + cls.__init__ = init + + +def _GetFieldByName(message_descriptor, field_name): + """Returns a field descriptor by field name. + + Args: + message_descriptor: A Descriptor describing all fields in message. + field_name: The name of the field to retrieve. + Returns: + The field descriptor associated with the field name. + """ + try: + return message_descriptor.fields_by_name[field_name] + except KeyError: + raise ValueError('Protocol message has no "%s" field.' % field_name) + + +def _AddPropertiesForFields(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + for field in descriptor.fields: + _AddPropertiesForField(field, cls) + + if descriptor.is_extendable: + # _ExtensionDict is just an adaptor with no state so we allocate a new one + # every time it is accessed. + cls.Extensions = property(lambda self: _ExtensionDict(self)) + + +def _AddPropertiesForField(field, cls): + """Adds a public property for a protocol message field. + Clients can use this property to get and (in the case + of non-repeated scalar fields) directly set the value + of a protocol message field. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # Catch it if we add other types that we should + # handle specially here. + assert _FieldDescriptor.MAX_CPPTYPE == 10 + + constant_name = field.name.upper() + "_FIELD_NUMBER" + setattr(cls, constant_name, field.number) + + if field.label == _FieldDescriptor.LABEL_REPEATED: + _AddPropertiesForRepeatedField(field, cls) + elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + _AddPropertiesForNonRepeatedCompositeField(field, cls) + else: + _AddPropertiesForNonRepeatedScalarField(field, cls) + + +def _AddPropertiesForRepeatedField(field, cls): + """Adds a public property for a "repeated" protocol message field. Clients + can use this property to get the value of the field, which will be either a + _RepeatedScalarFieldContainer or _RepeatedCompositeFieldContainer (see + below). + + Note that when clients add values to these containers, we perform + type-checking in the case of repeated scalar fields, and we also set any + necessary "has" bits as a side-effect. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to repeated field ' + '"%s" in protocol message object.' % proto_field_name) + + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedScalarField(field, cls): + """Adds a public property for a nonrepeated, scalar protocol message field. + Clients can use this property to get and directly set the value of the field. + Note that when the client sets the value of a field by using this property, + all necessary "has" bits are set as a side-effect, and we also perform + type-checking. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + type_checker = type_checkers.GetTypeChecker(field.cpp_type, field.type) + default_value = field.default_value + valid_values = set() + + def getter(self): + return self._fields.get(field, default_value) + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + def setter(self, new_value): + type_checker.CheckValue(new_value) + self._fields[field] = new_value + # Check _cached_byte_size_dirty inline to improve performance, since scalar + # setters are called frequently. + if not self._cached_byte_size_dirty: + self._Modified() + + setter.__module__ = None + setter.__doc__ = 'Setter for %s.' % proto_field_name + + # Add a property to encapsulate the getter/setter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForNonRepeatedCompositeField(field, cls): + """Adds a public property for a nonrepeated, composite protocol message field. + A composite field is a "group" or "message" field. + + Clients can use this property to get the value of the field, but cannot + assign to the property directly. + + Args: + field: A FieldDescriptor for this field. + cls: The class we're constructing. + """ + # TODO(robinson): Remove duplication with similar method + # for non-repeated scalars. + proto_field_name = field.name + property_name = _PropertyName(proto_field_name) + message_type = field.message_type + + def getter(self): + field_value = self._fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = message_type._concrete_class() + field_value._SetListener(self._listener_for_children) + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + field_value = self._fields.setdefault(field, field_value) + return field_value + getter.__module__ = None + getter.__doc__ = 'Getter for %s.' % proto_field_name + + # We define a setter just so we can throw an exception with a more + # helpful error message. + def setter(self, new_value): + raise AttributeError('Assignment not allowed to composite field ' + '"%s" in protocol message object.' % proto_field_name) + + # Add a property to encapsulate the getter. + doc = 'Magic attribute generated for "%s" proto field.' % proto_field_name + setattr(cls, property_name, property(getter, setter, doc=doc)) + + +def _AddPropertiesForExtensions(descriptor, cls): + """Adds properties for all fields in this protocol message type.""" + extension_dict = descriptor.extensions_by_name + for extension_name, extension_field in extension_dict.iteritems(): + constant_name = extension_name.upper() + "_FIELD_NUMBER" + setattr(cls, constant_name, extension_field.number) + + +def _AddStaticMethods(cls): + # TODO(robinson): This probably needs to be thread-safe(?) + def RegisterExtension(extension_handle): + extension_handle.containing_type = cls.DESCRIPTOR + _AttachFieldHelpers(cls, extension_handle) + + # Try to insert our extension, failing if an extension with the same number + # already exists. + actual_handle = cls._extensions_by_number.setdefault( + extension_handle.number, extension_handle) + if actual_handle is not extension_handle: + raise AssertionError( + 'Extensions "%s" and "%s" both try to extend message type "%s" with ' + 'field number %d.' % + (extension_handle.full_name, actual_handle.full_name, + cls.DESCRIPTOR.full_name, extension_handle.number)) + + cls._extensions_by_name[extension_handle.full_name] = extension_handle + + handle = extension_handle # avoid line wrapping + if _IsMessageSetExtension(handle): + # MessageSet extension. Also register under type name. + cls._extensions_by_name[ + extension_handle.message_type.full_name] = extension_handle + + cls.RegisterExtension = staticmethod(RegisterExtension) + + def FromString(s): + message = cls() + message.MergeFromString(s) + return message + cls.FromString = staticmethod(FromString) + + +def _IsPresent(item): + """Given a (FieldDescriptor, value) tuple from _fields, return true if the + value should be included in the list returned by ListFields().""" + + if item[0].label == _FieldDescriptor.LABEL_REPEATED: + return bool(item[1]) + elif item[0].cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + return item[1]._is_present_in_parent + else: + return True + + +def _AddListFieldsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ListFields(self): + all_fields = [item for item in self._fields.iteritems() if _IsPresent(item)] + all_fields.sort(key = lambda item: item[0].number) + return all_fields + + cls.ListFields = ListFields + + +def _AddHasFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + singular_fields = {} + for field in message_descriptor.fields: + if field.label != _FieldDescriptor.LABEL_REPEATED: + singular_fields[field.name] = field + + def HasField(self, field_name): + try: + field = singular_fields[field_name] + except KeyError: + raise ValueError( + 'Protocol message has no singular "%s" field.' % field_name) + + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(field) + return value is not None and value._is_present_in_parent + else: + return field in self._fields + cls.HasField = HasField + + +def _AddClearFieldMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def ClearField(self, field_name): + try: + field = message_descriptor.fields_by_name[field_name] + except KeyError: + raise ValueError('Protocol message has no "%s" field.' % field_name) + + if field in self._fields: + # Note: If the field is a sub-message, its listener will still point + # at us. That's fine, because the worst than can happen is that it + # will call _Modified() and invalidate our byte size. Big deal. + del self._fields[field] + + # Always call _Modified() -- even if nothing was changed, this is + # a mutating method, and thus calling it should cause the field to become + # present in the parent message. + self._Modified() + + cls.ClearField = ClearField + + +def _AddClearExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def ClearExtension(self, extension_handle): + _VerifyExtensionHandle(self, extension_handle) + + # Similar to ClearField(), above. + if extension_handle in self._fields: + del self._fields[extension_handle] + self._Modified() + cls.ClearExtension = ClearExtension + + +def _AddClearMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def Clear(self): + # Clear fields. + self._fields = {} + self._Modified() + cls.Clear = Clear + + +def _AddHasExtensionMethod(cls): + """Helper for _AddMessageMethods().""" + def HasExtension(self, extension_handle): + _VerifyExtensionHandle(self, extension_handle) + if extension_handle.label == _FieldDescriptor.LABEL_REPEATED: + raise KeyError('"%s" is repeated.' % extension_handle.full_name) + + if extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + value = self._fields.get(extension_handle) + return value is not None and value._is_present_in_parent + else: + return extension_handle in self._fields + cls.HasExtension = HasExtension + + +def _AddEqualsMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __eq__(self, other): + if (not isinstance(other, message_mod.Message) or + other.DESCRIPTOR != self.DESCRIPTOR): + return False + + if self is other: + return True + + return self.ListFields() == other.ListFields() + + cls.__eq__ = __eq__ + + +def _AddStrMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def __str__(self): + return text_format.MessageToString(self) + cls.__str__ = __str__ + + +def _AddUnicodeMethod(unused_message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def __unicode__(self): + return text_format.MessageToString(self, as_utf8=True).decode('utf-8') + cls.__unicode__ = __unicode__ + + +def _AddSetListenerMethod(cls): + """Helper for _AddMessageMethods().""" + def SetListener(self, listener): + if listener is None: + self._listener = message_listener_mod.NullMessageListener() + else: + self._listener = listener + cls._SetListener = SetListener + + +def _BytesForNonRepeatedElement(value, field_number, field_type): + """Returns the number of bytes needed to serialize a non-repeated element. + The returned byte count includes space for tag information and any + other additional space associated with serializing value. + + Args: + value: Value we're serializing. + field_number: Field number of this value. (Since the field number + is stored as part of a varint-encoded tag, this has an impact + on the total bytes required to serialize the value). + field_type: The type of the field. One of the TYPE_* constants + within FieldDescriptor. + """ + try: + fn = type_checkers.TYPE_TO_BYTE_SIZE_FN[field_type] + return fn(field_number, value) + except KeyError: + raise message_mod.EncodeError('Unrecognized field type: %d' % field_type) + + +def _AddByteSizeMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def ByteSize(self): + if not self._cached_byte_size_dirty: + return self._cached_byte_size + + size = 0 + for field_descriptor, field_value in self.ListFields(): + size += field_descriptor._sizer(field_value) + + self._cached_byte_size = size + self._cached_byte_size_dirty = False + self._listener_for_children.dirty = False + return size + + cls.ByteSize = ByteSize + + +def _AddSerializeToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializeToString(self): + # Check if the message has all of its required fields set. + errors = [] + if not self.IsInitialized(): + raise message_mod.EncodeError( + 'Message is missing required fields: ' + + ','.join(self.FindInitializationErrors())) + return self.SerializePartialToString() + cls.SerializeToString = SerializeToString + + +def _AddSerializePartialToStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + + def SerializePartialToString(self): + out = StringIO() + self._InternalSerialize(out.write) + return out.getvalue() + cls.SerializePartialToString = SerializePartialToString + + def InternalSerialize(self, write_bytes): + for field_descriptor, field_value in self.ListFields(): + field_descriptor._encoder(write_bytes, field_value) + cls._InternalSerialize = InternalSerialize + + +def _AddMergeFromStringMethod(message_descriptor, cls): + """Helper for _AddMessageMethods().""" + def MergeFromString(self, serialized): + length = len(serialized) + try: + if self._InternalParse(serialized, 0, length) != length: + # The only reason _InternalParse would return early is if it + # encountered an end-group tag. + raise message_mod.DecodeError('Unexpected end-group tag.') + except IndexError: + raise message_mod.DecodeError('Truncated message.') + except struct.error, e: + raise message_mod.DecodeError(e) + return length # Return this for legacy reasons. + cls.MergeFromString = MergeFromString + + local_ReadTag = decoder.ReadTag + local_SkipField = decoder.SkipField + decoders_by_tag = cls._decoders_by_tag + + def InternalParse(self, buffer, pos, end): + self._Modified() + field_dict = self._fields + while pos != end: + (tag_bytes, new_pos) = local_ReadTag(buffer, pos) + field_decoder = decoders_by_tag.get(tag_bytes) + if field_decoder is None: + new_pos = local_SkipField(buffer, new_pos, end, tag_bytes) + if new_pos == -1: + return pos + pos = new_pos + else: + pos = field_decoder(buffer, new_pos, end, self, field_dict) + return pos + cls._InternalParse = InternalParse + + +def _AddIsInitializedMethod(message_descriptor, cls): + """Adds the IsInitialized and FindInitializationError methods to the + protocol message class.""" + + required_fields = [field for field in message_descriptor.fields + if field.label == _FieldDescriptor.LABEL_REQUIRED] + + def IsInitialized(self, errors=None): + """Checks if all required fields of a message are set. + + Args: + errors: A list which, if provided, will be populated with the field + paths of all missing required fields. + + Returns: + True iff the specified message has all required fields set. + """ + + # Performance is critical so we avoid HasField() and ListFields(). + + for field in required_fields: + if (field not in self._fields or + (field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE and + not self._fields[field]._is_present_in_parent)): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + for field, value in self._fields.iteritems(): + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.label == _FieldDescriptor.LABEL_REPEATED: + for element in value: + if not element.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + elif value._is_present_in_parent and not value.IsInitialized(): + if errors is not None: + errors.extend(self.FindInitializationErrors()) + return False + + return True + + cls.IsInitialized = IsInitialized + + def FindInitializationErrors(self): + """Finds required fields which are not initialized. + + Returns: + A list of strings. Each string is a path to an uninitialized field from + the top-level message, e.g. "foo.bar[5].baz". + """ + + errors = [] # simplify things + + for field in required_fields: + if not self.HasField(field.name): + errors.append(field.name) + + for field, value in self.ListFields(): + if field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + if field.is_extension: + name = "(%s)" % field.full_name + else: + name = field.name + + if field.label == _FieldDescriptor.LABEL_REPEATED: + for i in xrange(len(value)): + element = value[i] + prefix = "%s[%d]." % (name, i) + sub_errors = element.FindInitializationErrors() + errors += [ prefix + error for error in sub_errors ] + else: + prefix = name + "." + sub_errors = value.FindInitializationErrors() + errors += [ prefix + error for error in sub_errors ] + + return errors + + cls.FindInitializationErrors = FindInitializationErrors + + +def _AddMergeFromMethod(cls): + LABEL_REPEATED = _FieldDescriptor.LABEL_REPEATED + CPPTYPE_MESSAGE = _FieldDescriptor.CPPTYPE_MESSAGE + + def MergeFrom(self, msg): + if not isinstance(msg, cls): + raise TypeError( + "Parameter to MergeFrom() must be instance of same class.") + + assert msg is not self + self._Modified() + + fields = self._fields + + for field, value in msg._fields.iteritems(): + if field.label == LABEL_REPEATED: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + elif field.cpp_type == CPPTYPE_MESSAGE: + if value._is_present_in_parent: + field_value = fields.get(field) + if field_value is None: + # Construct a new object to represent this field. + field_value = field._default_constructor(self) + fields[field] = field_value + field_value.MergeFrom(value) + else: + self._fields[field] = value + cls.MergeFrom = MergeFrom + + +def _AddMessageMethods(message_descriptor, cls): + """Adds implementations of all Message methods to cls.""" + _AddListFieldsMethod(message_descriptor, cls) + _AddHasFieldMethod(message_descriptor, cls) + _AddClearFieldMethod(message_descriptor, cls) + if message_descriptor.is_extendable: + _AddClearExtensionMethod(cls) + _AddHasExtensionMethod(cls) + _AddClearMethod(message_descriptor, cls) + _AddEqualsMethod(message_descriptor, cls) + _AddStrMethod(message_descriptor, cls) + _AddUnicodeMethod(message_descriptor, cls) + _AddSetListenerMethod(cls) + _AddByteSizeMethod(message_descriptor, cls) + _AddSerializeToStringMethod(message_descriptor, cls) + _AddSerializePartialToStringMethod(message_descriptor, cls) + _AddMergeFromStringMethod(message_descriptor, cls) + _AddIsInitializedMethod(message_descriptor, cls) + _AddMergeFromMethod(cls) + + +def _AddPrivateHelperMethods(cls): + """Adds implementation of private helper methods to cls.""" + + def Modified(self): + """Sets the _cached_byte_size_dirty bit to true, + and propagates this to our listener iff this was a state change. + """ + + # Note: Some callers check _cached_byte_size_dirty before calling + # _Modified() as an extra optimization. So, if this method is ever + # changed such that it does stuff even when _cached_byte_size_dirty is + # already true, the callers need to be updated. + if not self._cached_byte_size_dirty: + self._cached_byte_size_dirty = True + self._listener_for_children.dirty = True + self._is_present_in_parent = True + self._listener.Modified() + + cls._Modified = Modified + cls.SetInParent = Modified + + +class _Listener(object): + + """MessageListener implementation that a parent message registers with its + child message. + + In order to support semantics like: + + foo.bar.baz.qux = 23 + assert foo.HasField('bar') + + ...child objects must have back references to their parents. + This helper class is at the heart of this support. + """ + + def __init__(self, parent_message): + """Args: + parent_message: The message whose _Modified() method we should call when + we receive Modified() messages. + """ + # This listener establishes a back reference from a child (contained) object + # to its parent (containing) object. We make this a weak reference to avoid + # creating cyclic garbage when the client finishes with the 'parent' object + # in the tree. + if isinstance(parent_message, weakref.ProxyType): + self._parent_message_weakref = parent_message + else: + self._parent_message_weakref = weakref.proxy(parent_message) + + # As an optimization, we also indicate directly on the listener whether + # or not the parent message is dirty. This way we can avoid traversing + # up the tree in the common case. + self.dirty = False + + def Modified(self): + if self.dirty: + return + try: + # Propagate the signal to our parents iff this is the first field set. + self._parent_message_weakref._Modified() + except ReferenceError: + # We can get here if a client has kept a reference to a child object, + # and is now setting a field on it, but the child's parent has been + # garbage-collected. This is not an error. + pass + + +# TODO(robinson): Move elsewhere? This file is getting pretty ridiculous... +# TODO(robinson): Unify error handling of "unknown extension" crap. +# TODO(robinson): Support iteritems()-style iteration over all +# extensions with the "has" bits turned on? +class _ExtensionDict(object): + + """Dict-like container for supporting an indexable "Extensions" + field on proto instances. + + Note that in all cases we expect extension handles to be + FieldDescriptors. + """ + + def __init__(self, extended_message): + """extended_message: Message instance for which we are the Extensions dict. + """ + + self._extended_message = extended_message + + def __getitem__(self, extension_handle): + """Returns the current value of the given extension handle.""" + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + result = self._extended_message._fields.get(extension_handle) + if result is not None: + return result + + if extension_handle.label == _FieldDescriptor.LABEL_REPEATED: + result = extension_handle._default_constructor(self._extended_message) + elif extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE: + result = extension_handle.message_type._concrete_class() + try: + result._SetListener(self._extended_message._listener_for_children) + except ReferenceError: + pass + else: + # Singular scalar -- just return the default without inserting into the + # dict. + return extension_handle.default_value + + # Atomically check if another thread has preempted us and, if not, swap + # in the new object we just created. If someone has preempted us, we + # take that object and discard ours. + # WARNING: We are relying on setdefault() being atomic. This is true + # in CPython but we haven't investigated others. This warning appears + # in several other locations in this file. + result = self._extended_message._fields.setdefault( + extension_handle, result) + + return result + + def __eq__(self, other): + if not isinstance(other, self.__class__): + return False + + my_fields = self._extended_message.ListFields() + other_fields = other._extended_message.ListFields() + + # Get rid of non-extension fields. + my_fields = [ field for field in my_fields if field.is_extension ] + other_fields = [ field for field in other_fields if field.is_extension ] + + return my_fields == other_fields + + def __ne__(self, other): + return not self == other + + def __hash__(self): + raise TypeError('unhashable object') + + # Note that this is only meaningful for non-repeated, scalar extension + # fields. Note also that we may have to call _Modified() when we do + # successfully set a field this way, to set any necssary "has" bits in the + # ancestors of the extended message. + def __setitem__(self, extension_handle, value): + """If extension_handle specifies a non-repeated, scalar extension + field, sets the value of that field. + """ + + _VerifyExtensionHandle(self._extended_message, extension_handle) + + if (extension_handle.label == _FieldDescriptor.LABEL_REPEATED or + extension_handle.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE): + raise TypeError( + 'Cannot assign to extension "%s" because it is a repeated or ' + 'composite type.' % extension_handle.full_name) + + # It's slightly wasteful to lookup the type checker each time, + # but we expect this to be a vanishingly uncommon case anyway. + type_checker = type_checkers.GetTypeChecker( + extension_handle.cpp_type, extension_handle.type) + type_checker.CheckValue(value) + self._extended_message._fields[extension_handle] = value + self._extended_message._Modified() + + def _FindExtensionByName(self, name): + """Tries to find a known extension with the specified name. + + Args: + name: Extension full name. + + Returns: + Extension field descriptor. + """ + return self._extended_message._extensions_by_name.get(name, None) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py new file mode 100755 index 000000000..7b9d3398b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py @@ -0,0 +1,2421 @@ +#! /usr/bin/python +# -*- coding: utf-8 -*- +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Unittest for reflection.py, which also indirectly tests the output of the +pure-Python protocol compiler. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import operator +import struct + +import unittest +from google.protobuf import unittest_import_pb2 +from google.protobuf import unittest_mset_pb2 +from google.protobuf import unittest_pb2 +from google.protobuf import descriptor_pb2 +from google.protobuf import descriptor +from google.protobuf import message +from google.protobuf import reflection +from google.protobuf.internal import api_implementation +from google.protobuf.internal import more_extensions_pb2 +from google.protobuf.internal import more_messages_pb2 +from google.protobuf.internal import wire_format +from google.protobuf.internal import test_util +from google.protobuf.internal import decoder + + +class _MiniDecoder(object): + """Decodes a stream of values from a string. + + Once upon a time we actually had a class called decoder.Decoder. Then we + got rid of it during a redesign that made decoding much, much faster overall. + But a couple tests in this file used it to check that the serialized form of + a message was correct. So, this class implements just the methods that were + used by said tests, so that we don't have to rewrite the tests. + """ + + def __init__(self, bytes): + self._bytes = bytes + self._pos = 0 + + def ReadVarint(self): + result, self._pos = decoder._DecodeVarint(self._bytes, self._pos) + return result + + ReadInt32 = ReadVarint + ReadInt64 = ReadVarint + ReadUInt32 = ReadVarint + ReadUInt64 = ReadVarint + + def ReadSInt64(self): + return wire_format.ZigZagDecode(self.ReadVarint()) + + ReadSInt32 = ReadSInt64 + + def ReadFieldNumberAndWireType(self): + return wire_format.UnpackTag(self.ReadVarint()) + + def ReadFloat(self): + result = struct.unpack("".', + text_format.Merge, text, message) + + text = 'RepeatedGroup: {' + self.assertRaisesWithMessage( + text_format.ParseError, '1:16 : Expected "}".', + text_format.Merge, text, message) + + def testMergeEmptyGroup(self): + message = unittest_pb2.TestAllTypes() + text = 'OptionalGroup: {}' + text_format.Merge(text, message) + self.assertTrue(message.HasField('optionalgroup')) + + message.Clear() + + message = unittest_pb2.TestAllTypes() + text = 'OptionalGroup: <>' + text_format.Merge(text, message) + self.assertTrue(message.HasField('optionalgroup')) + + def testMergeBadEnumValue(self): + message = unittest_pb2.TestAllTypes() + text = 'optional_nested_enum: BARR' + self.assertRaisesWithMessage( + text_format.ParseError, + ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" ' + 'has no value named BARR.'), + text_format.Merge, text, message) + + message = unittest_pb2.TestAllTypes() + text = 'optional_nested_enum: 100' + self.assertRaisesWithMessage( + text_format.ParseError, + ('1:23 : Enum type "protobuf_unittest.TestAllTypes.NestedEnum" ' + 'has no value with number 100.'), + text_format.Merge, text, message) + + def assertRaisesWithMessage(self, e_class, e, func, *args, **kwargs): + """Same as assertRaises, but also compares the exception message.""" + if hasattr(e_class, '__name__'): + exc_name = e_class.__name__ + else: + exc_name = str(e_class) + + try: + func(*args, **kwargs) + except e_class, expr: + if str(expr) != e: + msg = '%s raised, but with wrong message: "%s" instead of "%s"' + raise self.failureException(msg % (exc_name, + str(expr).encode('string_escape'), + e.encode('string_escape'))) + return + else: + raise self.failureException('%s not raised' % exc_name) + + +class TokenizerTest(unittest.TestCase): + + def testSimpleTokenCases(self): + text = ('identifier1:"string1"\n \n\n' + 'identifier2 : \n \n123 \n identifier3 :\'string\'\n' + 'identifiER_4 : 1.1e+2 ID5:-0.23 ID6:\'aaaa\\\'bbbb\'\n' + 'ID7 : "aa\\"bb"\n\n\n\n ID8: {A:inf B:-inf C:true D:false}\n' + 'ID9: 22 ID10: -111111111111111111 ID11: -22\n' + 'ID12: 2222222222222222222 ' + 'false_bool: 0 true_BOOL:t \n true_bool1: 1 false_BOOL1:f ' ) + tokenizer = text_format._Tokenizer(text) + methods = [(tokenizer.ConsumeIdentifier, 'identifier1'), + ':', + (tokenizer.ConsumeString, 'string1'), + (tokenizer.ConsumeIdentifier, 'identifier2'), + ':', + (tokenizer.ConsumeInt32, 123), + (tokenizer.ConsumeIdentifier, 'identifier3'), + ':', + (tokenizer.ConsumeString, 'string'), + (tokenizer.ConsumeIdentifier, 'identifiER_4'), + ':', + (tokenizer.ConsumeFloat, 1.1e+2), + (tokenizer.ConsumeIdentifier, 'ID5'), + ':', + (tokenizer.ConsumeFloat, -0.23), + (tokenizer.ConsumeIdentifier, 'ID6'), + ':', + (tokenizer.ConsumeString, 'aaaa\'bbbb'), + (tokenizer.ConsumeIdentifier, 'ID7'), + ':', + (tokenizer.ConsumeString, 'aa\"bb'), + (tokenizer.ConsumeIdentifier, 'ID8'), + ':', + '{', + (tokenizer.ConsumeIdentifier, 'A'), + ':', + (tokenizer.ConsumeFloat, text_format._INFINITY), + (tokenizer.ConsumeIdentifier, 'B'), + ':', + (tokenizer.ConsumeFloat, -text_format._INFINITY), + (tokenizer.ConsumeIdentifier, 'C'), + ':', + (tokenizer.ConsumeBool, True), + (tokenizer.ConsumeIdentifier, 'D'), + ':', + (tokenizer.ConsumeBool, False), + '}', + (tokenizer.ConsumeIdentifier, 'ID9'), + ':', + (tokenizer.ConsumeUint32, 22), + (tokenizer.ConsumeIdentifier, 'ID10'), + ':', + (tokenizer.ConsumeInt64, -111111111111111111), + (tokenizer.ConsumeIdentifier, 'ID11'), + ':', + (tokenizer.ConsumeInt32, -22), + (tokenizer.ConsumeIdentifier, 'ID12'), + ':', + (tokenizer.ConsumeUint64, 2222222222222222222), + (tokenizer.ConsumeIdentifier, 'false_bool'), + ':', + (tokenizer.ConsumeBool, False), + (tokenizer.ConsumeIdentifier, 'true_BOOL'), + ':', + (tokenizer.ConsumeBool, True), + (tokenizer.ConsumeIdentifier, 'true_bool1'), + ':', + (tokenizer.ConsumeBool, True), + (tokenizer.ConsumeIdentifier, 'false_BOOL1'), + ':', + (tokenizer.ConsumeBool, False)] + + i = 0 + while not tokenizer.AtEnd(): + m = methods[i] + if type(m) == str: + token = tokenizer.token + self.assertEqual(token, m) + tokenizer.NextToken() + else: + self.assertEqual(m[1], m[0]()) + i += 1 + + def testConsumeIntegers(self): + # This test only tests the failures in the integer parsing methods as well + # as the '0' special cases. + int64_max = (1 << 63) - 1 + uint32_max = (1 << 32) - 1 + text = '-1 %d %d' % (uint32_max + 1, int64_max + 1) + tokenizer = text_format._Tokenizer(text) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint64) + self.assertEqual(-1, tokenizer.ConsumeInt32()) + + self.assertRaises(text_format.ParseError, tokenizer.ConsumeUint32) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt32) + self.assertEqual(uint32_max + 1, tokenizer.ConsumeInt64()) + + self.assertRaises(text_format.ParseError, tokenizer.ConsumeInt64) + self.assertEqual(int64_max + 1, tokenizer.ConsumeUint64()) + self.assertTrue(tokenizer.AtEnd()) + + text = '-0 -0 0 0' + tokenizer = text_format._Tokenizer(text) + self.assertEqual(0, tokenizer.ConsumeUint32()) + self.assertEqual(0, tokenizer.ConsumeUint64()) + self.assertEqual(0, tokenizer.ConsumeUint32()) + self.assertEqual(0, tokenizer.ConsumeUint64()) + self.assertTrue(tokenizer.AtEnd()) + + def testConsumeByteString(self): + text = '"string1\'' + tokenizer = text_format._Tokenizer(text) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = 'string1"' + tokenizer = text_format._Tokenizer(text) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = '\n"\\xt"' + tokenizer = text_format._Tokenizer(text) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = '\n"\\"' + tokenizer = text_format._Tokenizer(text) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + text = '\n"\\x"' + tokenizer = text_format._Tokenizer(text) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeByteString) + + def testConsumeBool(self): + text = 'not-a-bool' + tokenizer = text_format._Tokenizer(text) + self.assertRaises(text_format.ParseError, tokenizer.ConsumeBool) + + def testInfNan(self): + # Make sure our infinity and NaN definitions are sound. + self.assertEquals(float, type(text_format._INFINITY)) + self.assertEquals(float, type(text_format._NAN)) + self.assertTrue(text_format._NAN != text_format._NAN) + + inf_times_zero = text_format._INFINITY * 0 + self.assertTrue(inf_times_zero != inf_times_zero) + self.assertTrue(text_format._INFINITY > 0) + + +if __name__ == '__main__': + unittest.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py new file mode 100755 index 000000000..2b3cd4de4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py @@ -0,0 +1,286 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Provides type checking routines. + +This module defines type checking utilities in the forms of dictionaries: + +VALUE_CHECKERS: A dictionary of field types and a value validation object. +TYPE_TO_BYTE_SIZE_FN: A dictionary with field types and a size computing + function. +TYPE_TO_SERIALIZE_METHOD: A dictionary with field types and serialization + function. +FIELD_TYPE_TO_WIRE_TYPE: A dictionary with field typed and their + coresponding wire types. +TYPE_TO_DESERIALIZE_METHOD: A dictionary with field types and deserialization + function. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + +from google.protobuf.internal import decoder +from google.protobuf.internal import encoder +from google.protobuf.internal import wire_format +from google.protobuf import descriptor + +_FieldDescriptor = descriptor.FieldDescriptor + + +def GetTypeChecker(cpp_type, field_type): + """Returns a type checker for a message field of the specified types. + + Args: + cpp_type: C++ type of the field (see descriptor.py). + field_type: Protocol message field type (see descriptor.py). + + Returns: + An instance of TypeChecker which can be used to verify the types + of values assigned to a field of the specified type. + """ + if (cpp_type == _FieldDescriptor.CPPTYPE_STRING and + field_type == _FieldDescriptor.TYPE_STRING): + return UnicodeValueChecker() + return _VALUE_CHECKERS[cpp_type] + + +# None of the typecheckers below make any attempt to guard against people +# subclassing builtin types and doing weird things. We're not trying to +# protect against malicious clients here, just people accidentally shooting +# themselves in the foot in obvious ways. + +class TypeChecker(object): + + """Type checker used to catch type errors as early as possible + when the client is setting scalar fields in protocol messages. + """ + + def __init__(self, *acceptable_types): + self._acceptable_types = acceptable_types + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, self._acceptable_types): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), self._acceptable_types)) + raise TypeError(message) + + +# IntValueChecker and its subclasses perform integer type-checks +# and bounds-checks. +class IntValueChecker(object): + + """Checker used for integer fields. Performs type-check and range check.""" + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (int, long)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (int, long))) + raise TypeError(message) + if not self._MIN <= proposed_value <= self._MAX: + raise ValueError('Value out of range: %d' % proposed_value) + + +class UnicodeValueChecker(object): + + """Checker used for string fields.""" + + def CheckValue(self, proposed_value): + if not isinstance(proposed_value, (str, unicode)): + message = ('%.1024r has type %s, but expected one of: %s' % + (proposed_value, type(proposed_value), (str, unicode))) + raise TypeError(message) + + # If the value is of type 'str' make sure that it is in 7-bit ASCII + # encoding. + if isinstance(proposed_value, str): + try: + unicode(proposed_value, 'ascii') + except UnicodeDecodeError: + raise ValueError('%.1024r has type str, but isn\'t in 7-bit ASCII ' + 'encoding. Non-ASCII strings must be converted to ' + 'unicode objects before being added.' % + (proposed_value)) + + +class Int32ValueChecker(IntValueChecker): + # We're sure to use ints instead of longs here since comparison may be more + # efficient. + _MIN = -2147483648 + _MAX = 2147483647 + + +class Uint32ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 32) - 1 + + +class Int64ValueChecker(IntValueChecker): + _MIN = -(1 << 63) + _MAX = (1 << 63) - 1 + + +class Uint64ValueChecker(IntValueChecker): + _MIN = 0 + _MAX = (1 << 64) - 1 + + +# Type-checkers for all scalar CPPTYPEs. +_VALUE_CHECKERS = { + _FieldDescriptor.CPPTYPE_INT32: Int32ValueChecker(), + _FieldDescriptor.CPPTYPE_INT64: Int64ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT32: Uint32ValueChecker(), + _FieldDescriptor.CPPTYPE_UINT64: Uint64ValueChecker(), + _FieldDescriptor.CPPTYPE_DOUBLE: TypeChecker( + float, int, long), + _FieldDescriptor.CPPTYPE_FLOAT: TypeChecker( + float, int, long), + _FieldDescriptor.CPPTYPE_BOOL: TypeChecker(bool, int), + _FieldDescriptor.CPPTYPE_ENUM: Int32ValueChecker(), + _FieldDescriptor.CPPTYPE_STRING: TypeChecker(str), + } + + +# Map from field type to a function F, such that F(field_num, value) +# gives the total byte size for a value of the given type. This +# byte size includes tag information and any other additional space +# associated with serializing "value". +TYPE_TO_BYTE_SIZE_FN = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.DoubleByteSize, + _FieldDescriptor.TYPE_FLOAT: wire_format.FloatByteSize, + _FieldDescriptor.TYPE_INT64: wire_format.Int64ByteSize, + _FieldDescriptor.TYPE_UINT64: wire_format.UInt64ByteSize, + _FieldDescriptor.TYPE_INT32: wire_format.Int32ByteSize, + _FieldDescriptor.TYPE_FIXED64: wire_format.Fixed64ByteSize, + _FieldDescriptor.TYPE_FIXED32: wire_format.Fixed32ByteSize, + _FieldDescriptor.TYPE_BOOL: wire_format.BoolByteSize, + _FieldDescriptor.TYPE_STRING: wire_format.StringByteSize, + _FieldDescriptor.TYPE_GROUP: wire_format.GroupByteSize, + _FieldDescriptor.TYPE_MESSAGE: wire_format.MessageByteSize, + _FieldDescriptor.TYPE_BYTES: wire_format.BytesByteSize, + _FieldDescriptor.TYPE_UINT32: wire_format.UInt32ByteSize, + _FieldDescriptor.TYPE_ENUM: wire_format.EnumByteSize, + _FieldDescriptor.TYPE_SFIXED32: wire_format.SFixed32ByteSize, + _FieldDescriptor.TYPE_SFIXED64: wire_format.SFixed64ByteSize, + _FieldDescriptor.TYPE_SINT32: wire_format.SInt32ByteSize, + _FieldDescriptor.TYPE_SINT64: wire_format.SInt64ByteSize + } + + +# Maps from field types to encoder constructors. +TYPE_TO_ENCODER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleEncoder, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatEncoder, + _FieldDescriptor.TYPE_INT64: encoder.Int64Encoder, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Encoder, + _FieldDescriptor.TYPE_INT32: encoder.Int32Encoder, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Encoder, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Encoder, + _FieldDescriptor.TYPE_BOOL: encoder.BoolEncoder, + _FieldDescriptor.TYPE_STRING: encoder.StringEncoder, + _FieldDescriptor.TYPE_GROUP: encoder.GroupEncoder, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageEncoder, + _FieldDescriptor.TYPE_BYTES: encoder.BytesEncoder, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Encoder, + _FieldDescriptor.TYPE_ENUM: encoder.EnumEncoder, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Encoder, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Encoder, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Encoder, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Encoder, + } + + +# Maps from field types to sizer constructors. +TYPE_TO_SIZER = { + _FieldDescriptor.TYPE_DOUBLE: encoder.DoubleSizer, + _FieldDescriptor.TYPE_FLOAT: encoder.FloatSizer, + _FieldDescriptor.TYPE_INT64: encoder.Int64Sizer, + _FieldDescriptor.TYPE_UINT64: encoder.UInt64Sizer, + _FieldDescriptor.TYPE_INT32: encoder.Int32Sizer, + _FieldDescriptor.TYPE_FIXED64: encoder.Fixed64Sizer, + _FieldDescriptor.TYPE_FIXED32: encoder.Fixed32Sizer, + _FieldDescriptor.TYPE_BOOL: encoder.BoolSizer, + _FieldDescriptor.TYPE_STRING: encoder.StringSizer, + _FieldDescriptor.TYPE_GROUP: encoder.GroupSizer, + _FieldDescriptor.TYPE_MESSAGE: encoder.MessageSizer, + _FieldDescriptor.TYPE_BYTES: encoder.BytesSizer, + _FieldDescriptor.TYPE_UINT32: encoder.UInt32Sizer, + _FieldDescriptor.TYPE_ENUM: encoder.EnumSizer, + _FieldDescriptor.TYPE_SFIXED32: encoder.SFixed32Sizer, + _FieldDescriptor.TYPE_SFIXED64: encoder.SFixed64Sizer, + _FieldDescriptor.TYPE_SINT32: encoder.SInt32Sizer, + _FieldDescriptor.TYPE_SINT64: encoder.SInt64Sizer, + } + + +# Maps from field type to a decoder constructor. +TYPE_TO_DECODER = { + _FieldDescriptor.TYPE_DOUBLE: decoder.DoubleDecoder, + _FieldDescriptor.TYPE_FLOAT: decoder.FloatDecoder, + _FieldDescriptor.TYPE_INT64: decoder.Int64Decoder, + _FieldDescriptor.TYPE_UINT64: decoder.UInt64Decoder, + _FieldDescriptor.TYPE_INT32: decoder.Int32Decoder, + _FieldDescriptor.TYPE_FIXED64: decoder.Fixed64Decoder, + _FieldDescriptor.TYPE_FIXED32: decoder.Fixed32Decoder, + _FieldDescriptor.TYPE_BOOL: decoder.BoolDecoder, + _FieldDescriptor.TYPE_STRING: decoder.StringDecoder, + _FieldDescriptor.TYPE_GROUP: decoder.GroupDecoder, + _FieldDescriptor.TYPE_MESSAGE: decoder.MessageDecoder, + _FieldDescriptor.TYPE_BYTES: decoder.BytesDecoder, + _FieldDescriptor.TYPE_UINT32: decoder.UInt32Decoder, + _FieldDescriptor.TYPE_ENUM: decoder.EnumDecoder, + _FieldDescriptor.TYPE_SFIXED32: decoder.SFixed32Decoder, + _FieldDescriptor.TYPE_SFIXED64: decoder.SFixed64Decoder, + _FieldDescriptor.TYPE_SINT32: decoder.SInt32Decoder, + _FieldDescriptor.TYPE_SINT64: decoder.SInt64Decoder, + } + +# Maps from field type to expected wiretype. +FIELD_TYPE_TO_WIRE_TYPE = { + _FieldDescriptor.TYPE_DOUBLE: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FLOAT: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_INT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_UINT64: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_INT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_FIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_FIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_BOOL: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_STRING: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_GROUP: wire_format.WIRETYPE_START_GROUP, + _FieldDescriptor.TYPE_MESSAGE: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_BYTES: + wire_format.WIRETYPE_LENGTH_DELIMITED, + _FieldDescriptor.TYPE_UINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_ENUM: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SFIXED32: wire_format.WIRETYPE_FIXED32, + _FieldDescriptor.TYPE_SFIXED64: wire_format.WIRETYPE_FIXED64, + _FieldDescriptor.TYPE_SINT32: wire_format.WIRETYPE_VARINT, + _FieldDescriptor.TYPE_SINT64: wire_format.WIRETYPE_VARINT, + } diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py new file mode 100755 index 000000000..c941fe1a5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py @@ -0,0 +1,268 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Constants and static functions to support protocol buffer wire format.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import struct +from google.protobuf import descriptor +from google.protobuf import message + + +TAG_TYPE_BITS = 3 # Number of bits used to hold type info in a proto tag. +TAG_TYPE_MASK = (1 << TAG_TYPE_BITS) - 1 # 0x7 + +# These numbers identify the wire type of a protocol buffer value. +# We use the least-significant TAG_TYPE_BITS bits of the varint-encoded +# tag-and-type to store one of these WIRETYPE_* constants. +# These values must match WireType enum in google/protobuf/wire_format.h. +WIRETYPE_VARINT = 0 +WIRETYPE_FIXED64 = 1 +WIRETYPE_LENGTH_DELIMITED = 2 +WIRETYPE_START_GROUP = 3 +WIRETYPE_END_GROUP = 4 +WIRETYPE_FIXED32 = 5 +_WIRETYPE_MAX = 5 + + +# Bounds for various integer types. +INT32_MAX = int((1 << 31) - 1) +INT32_MIN = int(-(1 << 31)) +UINT32_MAX = (1 << 32) - 1 + +INT64_MAX = (1 << 63) - 1 +INT64_MIN = -(1 << 63) +UINT64_MAX = (1 << 64) - 1 + +# "struct" format strings that will encode/decode the specified formats. +FORMAT_UINT32_LITTLE_ENDIAN = '> TAG_TYPE_BITS), (tag & TAG_TYPE_MASK) + + +def ZigZagEncode(value): + """ZigZag Transform: Encodes signed integers so that they can be + effectively used with varint encoding. See wire_format.h for + more details. + """ + if value >= 0: + return value << 1 + return (value << 1) ^ (~0) + + +def ZigZagDecode(value): + """Inverse of ZigZagEncode().""" + if not value & 0x1: + return value >> 1 + return (value >> 1) ^ (~0) + + + +# The *ByteSize() functions below return the number of bytes required to +# serialize "field number + type" information and then serialize the value. + + +def Int32ByteSize(field_number, int32): + return Int64ByteSize(field_number, int32) + + +def Int32ByteSizeNoTag(int32): + return _VarUInt64ByteSizeNoTag(0xffffffffffffffff & int32) + + +def Int64ByteSize(field_number, int64): + # Have to convert to uint before calling UInt64ByteSize(). + return UInt64ByteSize(field_number, 0xffffffffffffffff & int64) + + +def UInt32ByteSize(field_number, uint32): + return UInt64ByteSize(field_number, uint32) + + +def UInt64ByteSize(field_number, uint64): + return TagByteSize(field_number) + _VarUInt64ByteSizeNoTag(uint64) + + +def SInt32ByteSize(field_number, int32): + return UInt32ByteSize(field_number, ZigZagEncode(int32)) + + +def SInt64ByteSize(field_number, int64): + return UInt64ByteSize(field_number, ZigZagEncode(int64)) + + +def Fixed32ByteSize(field_number, fixed32): + return TagByteSize(field_number) + 4 + + +def Fixed64ByteSize(field_number, fixed64): + return TagByteSize(field_number) + 8 + + +def SFixed32ByteSize(field_number, sfixed32): + return TagByteSize(field_number) + 4 + + +def SFixed64ByteSize(field_number, sfixed64): + return TagByteSize(field_number) + 8 + + +def FloatByteSize(field_number, flt): + return TagByteSize(field_number) + 4 + + +def DoubleByteSize(field_number, double): + return TagByteSize(field_number) + 8 + + +def BoolByteSize(field_number, b): + return TagByteSize(field_number) + 1 + + +def EnumByteSize(field_number, enum): + return UInt32ByteSize(field_number, enum) + + +def StringByteSize(field_number, string): + return BytesByteSize(field_number, string.encode('utf-8')) + + +def BytesByteSize(field_number, b): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(len(b)) + + len(b)) + + +def GroupByteSize(field_number, message): + return (2 * TagByteSize(field_number) # START and END group. + + message.ByteSize()) + + +def MessageByteSize(field_number, message): + return (TagByteSize(field_number) + + _VarUInt64ByteSizeNoTag(message.ByteSize()) + + message.ByteSize()) + + +def MessageSetItemByteSize(field_number, msg): + # First compute the sizes of the tags. + # There are 2 tags for the beginning and ending of the repeated group, that + # is field number 1, one with field number 2 (type_id) and one with field + # number 3 (message). + total_size = (2 * TagByteSize(1) + TagByteSize(2) + TagByteSize(3)) + + # Add the number of bytes for type_id. + total_size += _VarUInt64ByteSizeNoTag(field_number) + + message_size = msg.ByteSize() + + # The number of bytes for encoding the length of the message. + total_size += _VarUInt64ByteSizeNoTag(message_size) + + # The size of the message. + total_size += message_size + return total_size + + +def TagByteSize(field_number): + """Returns the bytes required to serialize a tag with this field number.""" + # Just pass in type 0, since the type won't affect the tag+type size. + return _VarUInt64ByteSizeNoTag(PackTag(field_number, 0)) + + +# Private helper function for the *ByteSize() functions above. + +def _VarUInt64ByteSizeNoTag(uint64): + """Returns the number of bytes required to serialize a single varint + using boundary value comparisons. (unrolled loop optimization -WPierce) + uint64 must be unsigned. + """ + if uint64 <= 0x7f: return 1 + if uint64 <= 0x3fff: return 2 + if uint64 <= 0x1fffff: return 3 + if uint64 <= 0xfffffff: return 4 + if uint64 <= 0x7ffffffff: return 5 + if uint64 <= 0x3ffffffffff: return 6 + if uint64 <= 0x1ffffffffffff: return 7 + if uint64 <= 0xffffffffffffff: return 8 + if uint64 <= 0x7fffffffffffffff: return 9 + if uint64 > UINT64_MAX: + raise message.EncodeError('Value out of range: %d' % uint64) + return 10 + + +NON_PACKABLE_TYPES = ( + descriptor.FieldDescriptor.TYPE_STRING, + descriptor.FieldDescriptor.TYPE_GROUP, + descriptor.FieldDescriptor.TYPE_MESSAGE, + descriptor.FieldDescriptor.TYPE_BYTES +) + + +def IsTypePackable(field_type): + """Return true iff packable = true is valid for fields of this type. + + Args: + field_type: a FieldDescriptor::Type value. + + Returns: + True iff fields of this type are packable. + """ + return field_type not in NON_PACKABLE_TYPES diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py new file mode 100755 index 000000000..760077860 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py @@ -0,0 +1,253 @@ +#! /usr/bin/python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Test for google.protobuf.internal.wire_format.""" + +__author__ = 'robinson@google.com (Will Robinson)' + +import unittest +from google.protobuf import message +from google.protobuf.internal import wire_format + + +class WireFormatTest(unittest.TestCase): + + def testPackTag(self): + field_number = 0xabc + tag_type = 2 + self.assertEqual((field_number << 3) | tag_type, + wire_format.PackTag(field_number, tag_type)) + PackTag = wire_format.PackTag + # Number too high. + self.assertRaises(message.EncodeError, PackTag, field_number, 6) + # Number too low. + self.assertRaises(message.EncodeError, PackTag, field_number, -1) + + def testUnpackTag(self): + # Test field numbers that will require various varint sizes. + for expected_field_number in (1, 15, 16, 2047, 2048): + for expected_wire_type in range(6): # Highest-numbered wiretype is 5. + field_number, wire_type = wire_format.UnpackTag( + wire_format.PackTag(expected_field_number, expected_wire_type)) + self.assertEqual(expected_field_number, field_number) + self.assertEqual(expected_wire_type, wire_type) + + self.assertRaises(TypeError, wire_format.UnpackTag, None) + self.assertRaises(TypeError, wire_format.UnpackTag, 'abc') + self.assertRaises(TypeError, wire_format.UnpackTag, 0.0) + self.assertRaises(TypeError, wire_format.UnpackTag, object()) + + def testZigZagEncode(self): + Z = wire_format.ZigZagEncode + self.assertEqual(0, Z(0)) + self.assertEqual(1, Z(-1)) + self.assertEqual(2, Z(1)) + self.assertEqual(3, Z(-2)) + self.assertEqual(4, Z(2)) + self.assertEqual(0xfffffffe, Z(0x7fffffff)) + self.assertEqual(0xffffffff, Z(-0x80000000)) + self.assertEqual(0xfffffffffffffffe, Z(0x7fffffffffffffff)) + self.assertEqual(0xffffffffffffffff, Z(-0x8000000000000000)) + + self.assertRaises(TypeError, Z, None) + self.assertRaises(TypeError, Z, 'abcd') + self.assertRaises(TypeError, Z, 0.0) + self.assertRaises(TypeError, Z, object()) + + def testZigZagDecode(self): + Z = wire_format.ZigZagDecode + self.assertEqual(0, Z(0)) + self.assertEqual(-1, Z(1)) + self.assertEqual(1, Z(2)) + self.assertEqual(-2, Z(3)) + self.assertEqual(2, Z(4)) + self.assertEqual(0x7fffffff, Z(0xfffffffe)) + self.assertEqual(-0x80000000, Z(0xffffffff)) + self.assertEqual(0x7fffffffffffffff, Z(0xfffffffffffffffe)) + self.assertEqual(-0x8000000000000000, Z(0xffffffffffffffff)) + + self.assertRaises(TypeError, Z, None) + self.assertRaises(TypeError, Z, 'abcd') + self.assertRaises(TypeError, Z, 0.0) + self.assertRaises(TypeError, Z, object()) + + def NumericByteSizeTestHelper(self, byte_size_fn, value, expected_value_size): + # Use field numbers that cause various byte sizes for the tag information. + for field_number, tag_bytes in ((15, 1), (16, 2), (2047, 2), (2048, 3)): + expected_size = expected_value_size + tag_bytes + actual_size = byte_size_fn(field_number, value) + self.assertEqual(expected_size, actual_size, + 'byte_size_fn: %s, field_number: %d, value: %r\n' + 'Expected: %d, Actual: %d'% ( + byte_size_fn, field_number, value, expected_size, actual_size)) + + def testByteSizeFunctions(self): + # Test all numeric *ByteSize() functions. + NUMERIC_ARGS = [ + # Int32ByteSize(). + [wire_format.Int32ByteSize, 0, 1], + [wire_format.Int32ByteSize, 127, 1], + [wire_format.Int32ByteSize, 128, 2], + [wire_format.Int32ByteSize, -1, 10], + # Int64ByteSize(). + [wire_format.Int64ByteSize, 0, 1], + [wire_format.Int64ByteSize, 127, 1], + [wire_format.Int64ByteSize, 128, 2], + [wire_format.Int64ByteSize, -1, 10], + # UInt32ByteSize(). + [wire_format.UInt32ByteSize, 0, 1], + [wire_format.UInt32ByteSize, 127, 1], + [wire_format.UInt32ByteSize, 128, 2], + [wire_format.UInt32ByteSize, wire_format.UINT32_MAX, 5], + # UInt64ByteSize(). + [wire_format.UInt64ByteSize, 0, 1], + [wire_format.UInt64ByteSize, 127, 1], + [wire_format.UInt64ByteSize, 128, 2], + [wire_format.UInt64ByteSize, wire_format.UINT64_MAX, 10], + # SInt32ByteSize(). + [wire_format.SInt32ByteSize, 0, 1], + [wire_format.SInt32ByteSize, -1, 1], + [wire_format.SInt32ByteSize, 1, 1], + [wire_format.SInt32ByteSize, -63, 1], + [wire_format.SInt32ByteSize, 63, 1], + [wire_format.SInt32ByteSize, -64, 1], + [wire_format.SInt32ByteSize, 64, 2], + # SInt64ByteSize(). + [wire_format.SInt64ByteSize, 0, 1], + [wire_format.SInt64ByteSize, -1, 1], + [wire_format.SInt64ByteSize, 1, 1], + [wire_format.SInt64ByteSize, -63, 1], + [wire_format.SInt64ByteSize, 63, 1], + [wire_format.SInt64ByteSize, -64, 1], + [wire_format.SInt64ByteSize, 64, 2], + # Fixed32ByteSize(). + [wire_format.Fixed32ByteSize, 0, 4], + [wire_format.Fixed32ByteSize, wire_format.UINT32_MAX, 4], + # Fixed64ByteSize(). + [wire_format.Fixed64ByteSize, 0, 8], + [wire_format.Fixed64ByteSize, wire_format.UINT64_MAX, 8], + # SFixed32ByteSize(). + [wire_format.SFixed32ByteSize, 0, 4], + [wire_format.SFixed32ByteSize, wire_format.INT32_MIN, 4], + [wire_format.SFixed32ByteSize, wire_format.INT32_MAX, 4], + # SFixed64ByteSize(). + [wire_format.SFixed64ByteSize, 0, 8], + [wire_format.SFixed64ByteSize, wire_format.INT64_MIN, 8], + [wire_format.SFixed64ByteSize, wire_format.INT64_MAX, 8], + # FloatByteSize(). + [wire_format.FloatByteSize, 0.0, 4], + [wire_format.FloatByteSize, 1000000000.0, 4], + [wire_format.FloatByteSize, -1000000000.0, 4], + # DoubleByteSize(). + [wire_format.DoubleByteSize, 0.0, 8], + [wire_format.DoubleByteSize, 1000000000.0, 8], + [wire_format.DoubleByteSize, -1000000000.0, 8], + # BoolByteSize(). + [wire_format.BoolByteSize, False, 1], + [wire_format.BoolByteSize, True, 1], + # EnumByteSize(). + [wire_format.EnumByteSize, 0, 1], + [wire_format.EnumByteSize, 127, 1], + [wire_format.EnumByteSize, 128, 2], + [wire_format.EnumByteSize, wire_format.UINT32_MAX, 5], + ] + for args in NUMERIC_ARGS: + self.NumericByteSizeTestHelper(*args) + + # Test strings and bytes. + for byte_size_fn in (wire_format.StringByteSize, wire_format.BytesByteSize): + # 1 byte for tag, 1 byte for length, 3 bytes for contents. + self.assertEqual(5, byte_size_fn(10, 'abc')) + # 2 bytes for tag, 1 byte for length, 3 bytes for contents. + self.assertEqual(6, byte_size_fn(16, 'abc')) + # 2 bytes for tag, 2 bytes for length, 128 bytes for contents. + self.assertEqual(132, byte_size_fn(16, 'a' * 128)) + + # Test UTF-8 string byte size calculation. + # 1 byte for tag, 1 byte for length, 8 bytes for content. + self.assertEqual(10, wire_format.StringByteSize( + 5, unicode('\xd0\xa2\xd0\xb5\xd1\x81\xd1\x82', 'utf-8'))) + + class MockMessage(object): + def __init__(self, byte_size): + self.byte_size = byte_size + def ByteSize(self): + return self.byte_size + + message_byte_size = 10 + mock_message = MockMessage(byte_size=message_byte_size) + # Test groups. + # (2 * 1) bytes for begin and end tags, plus message_byte_size. + self.assertEqual(2 + message_byte_size, + wire_format.GroupByteSize(1, mock_message)) + # (2 * 2) bytes for begin and end tags, plus message_byte_size. + self.assertEqual(4 + message_byte_size, + wire_format.GroupByteSize(16, mock_message)) + + # Test messages. + # 1 byte for tag, plus 1 byte for length, plus contents. + self.assertEqual(2 + mock_message.byte_size, + wire_format.MessageByteSize(1, mock_message)) + # 2 bytes for tag, plus 1 byte for length, plus contents. + self.assertEqual(3 + mock_message.byte_size, + wire_format.MessageByteSize(16, mock_message)) + # 2 bytes for tag, plus 2 bytes for length, plus contents. + mock_message.byte_size = 128 + self.assertEqual(4 + mock_message.byte_size, + wire_format.MessageByteSize(16, mock_message)) + + + # Test message set item byte size. + # 4 bytes for tags, plus 1 byte for length, plus 1 byte for type_id, + # plus contents. + mock_message.byte_size = 10 + self.assertEqual(mock_message.byte_size + 6, + wire_format.MessageSetItemByteSize(1, mock_message)) + + # 4 bytes for tags, plus 2 bytes for length, plus 1 byte for type_id, + # plus contents. + mock_message.byte_size = 128 + self.assertEqual(mock_message.byte_size + 7, + wire_format.MessageSetItemByteSize(1, mock_message)) + + # 4 bytes for tags, plus 2 bytes for length, plus 2 byte for type_id, + # plus contents. + self.assertEqual(mock_message.byte_size + 8, + wire_format.MessageSetItemByteSize(128, mock_message)) + + # Too-long varint. + self.assertRaises(message.EncodeError, + wire_format.UInt64ByteSize, 1, 1 << 128) + + +if __name__ == '__main__': + unittest.main() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py new file mode 100755 index 000000000..6f19f85f4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py @@ -0,0 +1,268 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# TODO(robinson): We should just make these methods all "pure-virtual" and move +# all implementation out, into reflection.py for now. + + +"""Contains an abstract base class for protocol messages.""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +class Error(Exception): pass +class DecodeError(Error): pass +class EncodeError(Error): pass + + +class Message(object): + + """Abstract base class for protocol messages. + + Protocol message classes are almost always generated by the protocol + compiler. These generated types subclass Message and implement the methods + shown below. + + TODO(robinson): Link to an HTML document here. + + TODO(robinson): Document that instances of this class will also + have an Extensions attribute with __getitem__ and __setitem__. + Again, not sure how to best convey this. + + TODO(robinson): Document that the class must also have a static + RegisterExtension(extension_field) method. + Not sure how to best express at this point. + """ + + # TODO(robinson): Document these fields and methods. + + __slots__ = [] + + DESCRIPTOR = None + + def __deepcopy__(self, memo=None): + clone = type(self)() + clone.MergeFrom(self) + return clone + + def __eq__(self, other_msg): + raise NotImplementedError + + def __ne__(self, other_msg): + # Can't just say self != other_msg, since that would infinitely recurse. :) + return not self == other_msg + + def __hash__(self): + raise TypeError('unhashable object') + + def __str__(self): + raise NotImplementedError + + def __unicode__(self): + raise NotImplementedError + + def MergeFrom(self, other_msg): + """Merges the contents of the specified message into current message. + + This method merges the contents of the specified message into the current + message. Singular fields that are set in the specified message overwrite + the corresponding fields in the current message. Repeated fields are + appended. Singular sub-messages and groups are recursively merged. + + Args: + other_msg: Message to merge into the current message. + """ + raise NotImplementedError + + def CopyFrom(self, other_msg): + """Copies the content of the specified message into the current message. + + The method clears the current message and then merges the specified + message using MergeFrom. + + Args: + other_msg: Message to copy into the current one. + """ + if self is other_msg: + return + self.Clear() + self.MergeFrom(other_msg) + + def Clear(self): + """Clears all data that was set in the message.""" + raise NotImplementedError + + def SetInParent(self): + """Mark this as present in the parent. + + This normally happens automatically when you assign a field of a + sub-message, but sometimes you want to make the sub-message + present while keeping it empty. If you find yourself using this, + you may want to reconsider your design.""" + raise NotImplementedError + + def IsInitialized(self): + """Checks if the message is initialized. + + Returns: + The method returns True if the message is initialized (i.e. all of its + required fields are set). + """ + raise NotImplementedError + + # TODO(robinson): MergeFromString() should probably return None and be + # implemented in terms of a helper that returns the # of bytes read. Our + # deserialization routines would use the helper when recursively + # deserializing, but the end user would almost always just want the no-return + # MergeFromString(). + + def MergeFromString(self, serialized): + """Merges serialized protocol buffer data into this message. + + When we find a field in |serialized| that is already present + in this message: + - If it's a "repeated" field, we append to the end of our list. + - Else, if it's a scalar, we overwrite our field. + - Else, (it's a nonrepeated composite), we recursively merge + into the existing composite. + + TODO(robinson): Document handling of unknown fields. + + Args: + serialized: Any object that allows us to call buffer(serialized) + to access a string of bytes using the buffer interface. + + TODO(robinson): When we switch to a helper, this will return None. + + Returns: + The number of bytes read from |serialized|. + For non-group messages, this will always be len(serialized), + but for messages which are actually groups, this will + generally be less than len(serialized), since we must + stop when we reach an END_GROUP tag. Note that if + we *do* stop because of an END_GROUP tag, the number + of bytes returned does not include the bytes + for the END_GROUP tag information. + """ + raise NotImplementedError + + def ParseFromString(self, serialized): + """Like MergeFromString(), except we clear the object first.""" + self.Clear() + self.MergeFromString(serialized) + + def SerializeToString(self): + """Serializes the protocol message to a binary string. + + Returns: + A binary string representation of the message if all of the required + fields in the message are set (i.e. the message is initialized). + + Raises: + message.EncodeError if the message isn't initialized. + """ + raise NotImplementedError + + def SerializePartialToString(self): + """Serializes the protocol message to a binary string. + + This method is similar to SerializeToString but doesn't check if the + message is initialized. + + Returns: + A string representation of the partial message. + """ + raise NotImplementedError + + # TODO(robinson): Decide whether we like these better + # than auto-generated has_foo() and clear_foo() methods + # on the instances themselves. This way is less consistent + # with C++, but it makes reflection-type access easier and + # reduces the number of magically autogenerated things. + # + # TODO(robinson): Be sure to document (and test) exactly + # which field names are accepted here. Are we case-sensitive? + # What do we do with fields that share names with Python keywords + # like 'lambda' and 'yield'? + # + # nnorwitz says: + # """ + # Typically (in python), an underscore is appended to names that are + # keywords. So they would become lambda_ or yield_. + # """ + def ListFields(self): + """Returns a list of (FieldDescriptor, value) tuples for all + fields in the message which are not empty. A singular field is non-empty + if HasField() would return true, and a repeated field is non-empty if + it contains at least one element. The fields are ordered by field + number""" + raise NotImplementedError + + def HasField(self, field_name): + """Checks if a certain field is set for the message. Note if the + field_name is not defined in the message descriptor, ValueError will be + raised.""" + raise NotImplementedError + + def ClearField(self, field_name): + raise NotImplementedError + + def HasExtension(self, extension_handle): + raise NotImplementedError + + def ClearExtension(self, extension_handle): + raise NotImplementedError + + def ByteSize(self): + """Returns the serialized size of this message. + Recursively calls ByteSize() on all contained messages. + """ + raise NotImplementedError + + def _SetListener(self, message_listener): + """Internal method used by the protocol message implementation. + Clients should not call this directly. + + Sets a listener that this message will call on certain state transitions. + + The purpose of this method is to register back-edges from children to + parents at runtime, for the purpose of setting "has" bits and + byte-size-dirty bits in the parent and ancestor objects whenever a child or + descendant object is modified. + + If the client wants to disconnect this Message from the object tree, she + explicitly sets callback to None. + + If message_listener is None, unregisters any existing listener. Otherwise, + message_listener must implement the MessageListener interface in + internal/message_listener.py, and we discard any listener registered + via a previous _SetListener() call. + """ + raise NotImplementedError diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc new file mode 100644 index 000000000..181d7e976 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc @@ -0,0 +1,1660 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: petar@google.com (Petar Petrov) + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/* Is 64bit */ +#define IS_64BIT (SIZEOF_LONG == 8) + +#define FIELD_BELONGS_TO_MESSAGE(field_descriptor, message) \ + ((message)->GetDescriptor() == (field_descriptor)->containing_type()) + +#define FIELD_IS_REPEATED(field_descriptor) \ + ((field_descriptor)->label() == google::protobuf::FieldDescriptor::LABEL_REPEATED) + +#define GOOGLE_CHECK_GET_INT32(arg, value) \ + int32 value; \ + if (!CheckAndGetInteger(arg, &value, kint32min_py, kint32max_py)) { \ + return NULL; \ + } + +#define GOOGLE_CHECK_GET_INT64(arg, value) \ + int64 value; \ + if (!CheckAndGetInteger(arg, &value, kint64min_py, kint64max_py)) { \ + return NULL; \ + } + +#define GOOGLE_CHECK_GET_UINT32(arg, value) \ + uint32 value; \ + if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint32max_py)) { \ + return NULL; \ + } + +#define GOOGLE_CHECK_GET_UINT64(arg, value) \ + uint64 value; \ + if (!CheckAndGetInteger(arg, &value, kPythonZero, kuint64max_py)) { \ + return NULL; \ + } + +#define GOOGLE_CHECK_GET_FLOAT(arg, value) \ + float value; \ + if (!CheckAndGetFloat(arg, &value)) { \ + return NULL; \ + } \ + +#define GOOGLE_CHECK_GET_DOUBLE(arg, value) \ + double value; \ + if (!CheckAndGetDouble(arg, &value)) { \ + return NULL; \ + } + +#define GOOGLE_CHECK_GET_BOOL(arg, value) \ + bool value; \ + if (!CheckAndGetBool(arg, &value)) { \ + return NULL; \ + } + +#define C(str) const_cast(str) + +// --- Globals: + +// Constants used for integer type range checking. +static PyObject* kPythonZero; +static PyObject* kint32min_py; +static PyObject* kint32max_py; +static PyObject* kuint32max_py; +static PyObject* kint64min_py; +static PyObject* kint64max_py; +static PyObject* kuint64max_py; + +namespace google { +namespace protobuf { +namespace python { + +// --- Support Routines: + +static void AddConstants(PyObject* module) { + struct NameValue { + char* name; + int32 value; + } constants[] = { + // Labels: + {"LABEL_OPTIONAL", google::protobuf::FieldDescriptor::LABEL_OPTIONAL}, + {"LABEL_REQUIRED", google::protobuf::FieldDescriptor::LABEL_REQUIRED}, + {"LABEL_REPEATED", google::protobuf::FieldDescriptor::LABEL_REPEATED}, + // CPP types: + {"CPPTYPE_MESSAGE", google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE}, + // Field Types: + {"TYPE_MESSAGE", google::protobuf::FieldDescriptor::TYPE_MESSAGE}, + // End. + {NULL, 0} + }; + + for (NameValue* constant = constants; + constant->name != NULL; constant++) { + PyModule_AddIntConstant(module, constant->name, constant->value); + } +} + +// --- CMessage Custom Type: + +// ------ Type Forward Declaration: + +struct CMessage; +struct CMessage_Type; + +static void CMessageDealloc(CMessage* self); +static int CMessageInit(CMessage* self, PyObject *args, PyObject *kwds); +static PyObject* CMessageStr(CMessage* self); + +static PyObject* CMessage_AddMessage(CMessage* self, PyObject* args); +static PyObject* CMessage_AddRepeatedScalar(CMessage* self, PyObject* args); +static PyObject* CMessage_AssignRepeatedScalar(CMessage* self, PyObject* args); +static PyObject* CMessage_ByteSize(CMessage* self, PyObject* args); +static PyObject* CMessage_Clear(CMessage* self, PyObject* args); +static PyObject* CMessage_ClearField(CMessage* self, PyObject* args); +static PyObject* CMessage_ClearFieldByDescriptor( + CMessage* self, PyObject* args); +static PyObject* CMessage_CopyFrom(CMessage* self, PyObject* args); +static PyObject* CMessage_DebugString(CMessage* self, PyObject* args); +static PyObject* CMessage_DeleteRepeatedField(CMessage* self, PyObject* args); +static PyObject* CMessage_Equals(CMessage* self, PyObject* args); +static PyObject* CMessage_FieldLength(CMessage* self, PyObject* args); +static PyObject* CMessage_FindInitializationErrors(CMessage* self); +static PyObject* CMessage_GetRepeatedMessage(CMessage* self, PyObject* args); +static PyObject* CMessage_GetRepeatedScalar(CMessage* self, PyObject* args); +static PyObject* CMessage_GetScalar(CMessage* self, PyObject* args); +static PyObject* CMessage_HasField(CMessage* self, PyObject* args); +static PyObject* CMessage_HasFieldByDescriptor(CMessage* self, PyObject* args); +static PyObject* CMessage_IsInitialized(CMessage* self, PyObject* args); +static PyObject* CMessage_ListFields(CMessage* self, PyObject* args); +static PyObject* CMessage_MergeFrom(CMessage* self, PyObject* args); +static PyObject* CMessage_MergeFromString(CMessage* self, PyObject* args); +static PyObject* CMessage_MutableMessage(CMessage* self, PyObject* args); +static PyObject* CMessage_NewSubMessage(CMessage* self, PyObject* args); +static PyObject* CMessage_SetScalar(CMessage* self, PyObject* args); +static PyObject* CMessage_SerializePartialToString( + CMessage* self, PyObject* args); +static PyObject* CMessage_SerializeToString(CMessage* self, PyObject* args); +static PyObject* CMessage_SetInParent(CMessage* self, PyObject* args); +static PyObject* CMessage_SwapRepeatedFieldElements( + CMessage* self, PyObject* args); + +// ------ Object Definition: + +typedef struct CMessage { + PyObject_HEAD + + struct CMessage* parent; // NULL if wasn't created from another message. + CFieldDescriptor* parent_field; + const char* full_name; + google::protobuf::Message* message; + bool free_message; + bool read_only; +} CMessage; + +// ------ Method Table: + +#define CMETHOD(name, args, doc) \ + { C(#name), (PyCFunction)CMessage_##name, args, C(doc) } +static PyMethodDef CMessageMethods[] = { + CMETHOD(AddMessage, METH_O, + "Adds a new message to a repeated composite field."), + CMETHOD(AddRepeatedScalar, METH_VARARGS, + "Adds a scalar to a repeated scalar field."), + CMETHOD(AssignRepeatedScalar, METH_VARARGS, + "Clears and sets the values of a repeated scalar field."), + CMETHOD(ByteSize, METH_NOARGS, + "Returns the size of the message in bytes."), + CMETHOD(Clear, METH_NOARGS, + "Clears a protocol message."), + CMETHOD(ClearField, METH_O, + "Clears a protocol message field by name."), + CMETHOD(ClearFieldByDescriptor, METH_O, + "Clears a protocol message field by descriptor."), + CMETHOD(CopyFrom, METH_O, + "Copies a protocol message into the current message."), + CMETHOD(DebugString, METH_NOARGS, + "Returns the debug string of a protocol message."), + CMETHOD(DeleteRepeatedField, METH_VARARGS, + "Deletes a slice of values from a repeated field."), + CMETHOD(Equals, METH_O, + "Checks if two protocol messages are equal (by identity)."), + CMETHOD(FieldLength, METH_O, + "Returns the number of elements in a repeated field."), + CMETHOD(FindInitializationErrors, METH_NOARGS, + "Returns the initialization errors of a message."), + CMETHOD(GetRepeatedMessage, METH_VARARGS, + "Returns a message from a repeated composite field."), + CMETHOD(GetRepeatedScalar, METH_VARARGS, + "Returns a scalar value from a repeated scalar field."), + CMETHOD(GetScalar, METH_O, + "Returns the scalar value of a field."), + CMETHOD(HasField, METH_O, + "Checks if a message field is set."), + CMETHOD(HasFieldByDescriptor, METH_O, + "Checks if a message field is set by given its descriptor"), + CMETHOD(IsInitialized, METH_NOARGS, + "Checks if all required fields of a protocol message are set."), + CMETHOD(ListFields, METH_NOARGS, + "Lists all set fields of a message."), + CMETHOD(MergeFrom, METH_O, + "Merges a protocol message into the current message."), + CMETHOD(MergeFromString, METH_O, + "Merges a serialized message into the current message."), + CMETHOD(MutableMessage, METH_O, + "Returns a new instance of a nested protocol message."), + CMETHOD(NewSubMessage, METH_O, + "Creates and returns a python message given the descriptor of a " + "composite field of the current message."), + CMETHOD(SetScalar, METH_VARARGS, + "Sets the value of a singular scalar field."), + CMETHOD(SerializePartialToString, METH_VARARGS, + "Serializes the message to a string, even if it isn't initialized."), + CMETHOD(SerializeToString, METH_NOARGS, + "Serializes the message to a string, only for initialized messages."), + CMETHOD(SetInParent, METH_NOARGS, + "Sets the has bit of the given field in its parent message."), + CMETHOD(SwapRepeatedFieldElements, METH_VARARGS, + "Swaps the elements in two positions in a repeated field."), + { NULL, NULL } +}; +#undef CMETHOD + +static PyMemberDef CMessageMembers[] = { + { C("full_name"), T_STRING, offsetof(CMessage, full_name), 0, "Full name" }, + { NULL } +}; + +// ------ Type Definition: + +// The definition for the type object that captures the type of CMessage +// in Python. +PyTypeObject CMessage_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, + C("google3.net.google.protobuf.python.internal." + "_net_proto2___python." + "CMessage"), // tp_name + sizeof(CMessage), // tp_basicsize + 0, // tp_itemsize + (destructor)CMessageDealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + (reprfunc)CMessageStr, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + C("A ProtocolMessage"), // tp_doc + 0, // tp_traverse + 0, // tp_clear + 0, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + CMessageMethods, // tp_methods + CMessageMembers, // tp_members + 0, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + (initproc)CMessageInit, // tp_init + PyType_GenericAlloc, // tp_alloc + PyType_GenericNew, // tp_new + PyObject_Del, // tp_free +}; + +// ------ Helper Functions: + +static void FormatTypeError(PyObject* arg, char* expected_types) { + PyObject* s = PyObject_Str(PyObject_Type(arg)); + PyObject* repr = PyObject_Repr(PyObject_Type(arg)); + PyErr_Format(PyExc_TypeError, + "%.100s has type %.100s, but expected one of: %s", + PyString_AS_STRING(repr), + PyString_AS_STRING(s), + expected_types); + Py_DECREF(s); + Py_DECREF(repr); +} + +template +static bool CheckAndGetInteger( + PyObject* arg, T* value, PyObject* min, PyObject* max) { + bool is_long = PyLong_Check(arg); + if (!PyInt_Check(arg) && !is_long) { + FormatTypeError(arg, "int, long"); + return false; + } + + if (PyObject_Compare(min, arg) > 0 || PyObject_Compare(max, arg) < 0) { + PyObject* s = PyObject_Str(arg); + PyErr_Format(PyExc_ValueError, + "Value out of range: %s", + PyString_AS_STRING(s)); + Py_DECREF(s); + return false; + } + if (is_long) { + if (min == kPythonZero) { + *value = static_cast(PyLong_AsUnsignedLongLong(arg)); + } else { + *value = static_cast(PyLong_AsLongLong(arg)); + } + } else { + *value = static_cast(PyInt_AsLong(arg)); + } + return true; +} + +static bool CheckAndGetDouble(PyObject* arg, double* value) { + if (!PyInt_Check(arg) && !PyLong_Check(arg) && + !PyFloat_Check(arg)) { + FormatTypeError(arg, "int, long, float"); + return false; + } + *value = PyFloat_AsDouble(arg); + return true; +} + +static bool CheckAndGetFloat(PyObject* arg, float* value) { + double double_value; + if (!CheckAndGetDouble(arg, &double_value)) { + return false; + } + *value = static_cast(double_value); + return true; +} + +static bool CheckAndGetBool(PyObject* arg, bool* value) { + if (!PyInt_Check(arg) && !PyBool_Check(arg) && !PyLong_Check(arg)) { + FormatTypeError(arg, "int, long, bool"); + return false; + } + *value = static_cast(PyInt_AsLong(arg)); + return true; +} + +google::protobuf::DynamicMessageFactory* global_message_factory = NULL; +static const google::protobuf::Message* CreateMessage(const char* message_type) { + string message_name(message_type); + const google::protobuf::Descriptor* descriptor = + GetDescriptorPool()->FindMessageTypeByName(message_name); + if (descriptor == NULL) { + return NULL; + } + return global_message_factory->GetPrototype(descriptor); +} + +static bool CheckAndSetString( + PyObject* arg, google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* descriptor, + const google::protobuf::Reflection* reflection, + bool append, + int index) { + GOOGLE_DCHECK(descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING || + descriptor->type() == google::protobuf::FieldDescriptor::TYPE_BYTES); + if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) { + if (!PyString_Check(arg) && !PyUnicode_Check(arg)) { + FormatTypeError(arg, "str, unicode"); + return false; + } + + if (PyString_Check(arg)) { + PyObject* unicode = PyUnicode_FromEncodedObject(arg, "ascii", NULL); + if (unicode == NULL) { + PyObject* repr = PyObject_Repr(arg); + PyErr_Format(PyExc_ValueError, + "%s has type str, but isn't in 7-bit ASCII " + "encoding. Non-ASCII strings must be converted to " + "unicode objects before being added.", + PyString_AS_STRING(repr)); + Py_DECREF(repr); + return false; + } else { + Py_DECREF(unicode); + } + } + } else if (!PyString_Check(arg)) { + FormatTypeError(arg, "str"); + return false; + } + + PyObject* encoded_string = NULL; + if (descriptor->type() == google::protobuf::FieldDescriptor::TYPE_STRING) { + if (PyString_Check(arg)) { + encoded_string = PyString_AsEncodedObject(arg, "utf-8", NULL); + } else { + encoded_string = PyUnicode_AsEncodedObject(arg, "utf-8", NULL); + } + } else { + // In this case field type is "bytes". + encoded_string = arg; + Py_INCREF(encoded_string); + } + + if (encoded_string == NULL) { + return false; + } + + char* value; + Py_ssize_t value_len; + if (PyString_AsStringAndSize(encoded_string, &value, &value_len) < 0) { + Py_DECREF(encoded_string); + return false; + } + + string value_string(value, value_len); + if (append) { + reflection->AddString(message, descriptor, value_string); + } else if (index < 0) { + reflection->SetString(message, descriptor, value_string); + } else { + reflection->SetRepeatedString(message, descriptor, index, value_string); + } + Py_DECREF(encoded_string); + return true; +} + +static PyObject* ToStringObject( + const google::protobuf::FieldDescriptor* descriptor, string value) { + if (descriptor->type() != google::protobuf::FieldDescriptor::TYPE_STRING) { + return PyString_FromStringAndSize(value.c_str(), value.length()); + } + + PyObject* result = PyUnicode_DecodeUTF8(value.c_str(), value.length(), NULL); + // If the string can't be decoded in UTF-8, just return a string object that + // contains the raw bytes. This can't happen if the value was assigned using + // the members of the Python message object, but can happen if the values were + // parsed from the wire (binary). + if (result == NULL) { + PyErr_Clear(); + result = PyString_FromStringAndSize(value.c_str(), value.length()); + } + return result; +} + +static void AssureWritable(CMessage* self) { + if (self == NULL || + self->parent == NULL || + self->parent_field == NULL) { + return; + } + + if (!self->read_only) { + return; + } + + AssureWritable(self->parent); + + google::protobuf::Message* message = self->parent->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + self->message = reflection->MutableMessage( + message, self->parent_field->descriptor, global_message_factory); + self->read_only = false; + self->parent = NULL; + self->parent_field = NULL; +} + +static PyObject* InternalGetScalar( + google::protobuf::Message* message, + const google::protobuf::FieldDescriptor* field_descriptor) { + const google::protobuf::Reflection* reflection = message->GetReflection(); + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return NULL; + } + + PyObject* result = NULL; + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + int32 value = reflection->GetInt32(*message, field_descriptor); + result = PyInt_FromLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + int64 value = reflection->GetInt64(*message, field_descriptor); +#if IS_64BIT + result = PyInt_FromLong(value); +#else + result = PyLong_FromLongLong(value); +#endif + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + uint32 value = reflection->GetUInt32(*message, field_descriptor); +#if IS_64BIT + result = PyInt_FromLong(value); +#else + result = PyLong_FromLongLong(value); +#endif + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + uint64 value = reflection->GetUInt64(*message, field_descriptor); +#if IS_64BIT + if (value <= static_cast(kint64max)) { + result = PyInt_FromLong(static_cast(value)); + } +#else + if (value <= static_cast(kint32max)) { + result = PyInt_FromLong(static_cast(value)); + } +#endif + else { // NOLINT + result = PyLong_FromUnsignedLongLong(value); + } + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + float value = reflection->GetFloat(*message, field_descriptor); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + double value = reflection->GetDouble(*message, field_descriptor); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + bool value = reflection->GetBool(*message, field_descriptor); + result = PyBool_FromLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + string value = reflection->GetString(*message, field_descriptor); + result = ToStringObject(field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + if (!message->GetReflection()->HasField(*message, field_descriptor)) { + // Look for the value in the unknown fields. + google::protobuf::UnknownFieldSet* unknown_field_set = + message->GetReflection()->MutableUnknownFields(message); + for (int i = 0; i < unknown_field_set->field_count(); ++i) { + if (unknown_field_set->field(i).number() == + field_descriptor->number()) { + result = PyInt_FromLong(unknown_field_set->field(i).varint()); + break; + } + } + } + + if (result == NULL) { + const google::protobuf::EnumValueDescriptor* enum_value = + message->GetReflection()->GetEnum(*message, field_descriptor); + result = PyInt_FromLong(enum_value->number()); + } + break; + } + default: + PyErr_Format( + PyExc_SystemError, "Getting a value from a field of unknown type %d", + field_descriptor->cpp_type()); + } + + return result; +} + +static PyObject* InternalSetScalar( + google::protobuf::Message* message, const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* arg) { + const google::protobuf::Reflection* reflection = message->GetReflection(); + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return NULL; + } + + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + GOOGLE_CHECK_GET_INT32(arg, value); + reflection->SetInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + GOOGLE_CHECK_GET_INT64(arg, value); + reflection->SetInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + GOOGLE_CHECK_GET_UINT32(arg, value); + reflection->SetUInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + GOOGLE_CHECK_GET_UINT64(arg, value); + reflection->SetUInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + GOOGLE_CHECK_GET_FLOAT(arg, value); + reflection->SetFloat(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + GOOGLE_CHECK_GET_DOUBLE(arg, value); + reflection->SetDouble(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + GOOGLE_CHECK_GET_BOOL(arg, value); + reflection->SetBool(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + if (!CheckAndSetString( + arg, message, field_descriptor, reflection, false, -1)) { + return NULL; + } + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + GOOGLE_CHECK_GET_INT32(arg, value); + const google::protobuf::EnumDescriptor* enum_descriptor = + field_descriptor->enum_type(); + const google::protobuf::EnumValueDescriptor* enum_value = + enum_descriptor->FindValueByNumber(value); + if (enum_value != NULL) { + reflection->SetEnum(message, field_descriptor, enum_value); + } else { + bool added = false; + // Add the value to the unknown fields. + google::protobuf::UnknownFieldSet* unknown_field_set = + message->GetReflection()->MutableUnknownFields(message); + for (int i = 0; i < unknown_field_set->field_count(); ++i) { + if (unknown_field_set->field(i).number() == + field_descriptor->number()) { + unknown_field_set->mutable_field(i)->set_varint(value); + added = true; + break; + } + } + + if (!added) { + unknown_field_set->AddVarint(field_descriptor->number(), value); + } + reflection->ClearField(message, field_descriptor); + } + break; + } + default: + PyErr_Format( + PyExc_SystemError, "Setting value to a field of unknown type %d", + field_descriptor->cpp_type()); + } + + Py_RETURN_NONE; +} + +static PyObject* InternalAddRepeatedScalar( + google::protobuf::Message* message, const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* arg) { + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString( + PyExc_KeyError, "Field does not belong to message!"); + return NULL; + } + + const google::protobuf::Reflection* reflection = message->GetReflection(); + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + GOOGLE_CHECK_GET_INT32(arg, value); + reflection->AddInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + GOOGLE_CHECK_GET_INT64(arg, value); + reflection->AddInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + GOOGLE_CHECK_GET_UINT32(arg, value); + reflection->AddUInt32(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + GOOGLE_CHECK_GET_UINT64(arg, value); + reflection->AddUInt64(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + GOOGLE_CHECK_GET_FLOAT(arg, value); + reflection->AddFloat(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + GOOGLE_CHECK_GET_DOUBLE(arg, value); + reflection->AddDouble(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + GOOGLE_CHECK_GET_BOOL(arg, value); + reflection->AddBool(message, field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + if (!CheckAndSetString( + arg, message, field_descriptor, reflection, true, -1)) { + return NULL; + } + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + GOOGLE_CHECK_GET_INT32(arg, value); + const google::protobuf::EnumDescriptor* enum_descriptor = + field_descriptor->enum_type(); + const google::protobuf::EnumValueDescriptor* enum_value = + enum_descriptor->FindValueByNumber(value); + if (enum_value != NULL) { + reflection->AddEnum(message, field_descriptor, enum_value); + } else { + PyObject* s = PyObject_Str(arg); + PyErr_Format(PyExc_ValueError, "Unknown enum value: %s", + PyString_AS_STRING(s)); + Py_DECREF(s); + return NULL; + } + break; + } + default: + PyErr_Format( + PyExc_SystemError, "Adding value to a field of unknown type %d", + field_descriptor->cpp_type()); + } + + Py_RETURN_NONE; +} + +static PyObject* InternalGetRepeatedScalar( + CMessage* cmessage, const google::protobuf::FieldDescriptor* field_descriptor, + int index) { + google::protobuf::Message* message = cmessage->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + + int field_size = reflection->FieldSize(*message, field_descriptor); + if (index < 0) { + index = field_size + index; + } + if (index < 0 || index >= field_size) { + PyErr_Format(PyExc_IndexError, + "list assignment index (%d) out of range", index); + return NULL; + } + + PyObject* result = NULL; + switch (field_descriptor->cpp_type()) { + case google::protobuf::FieldDescriptor::CPPTYPE_INT32: { + int32 value = reflection->GetRepeatedInt32( + *message, field_descriptor, index); + result = PyInt_FromLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_INT64: { + int64 value = reflection->GetRepeatedInt64( + *message, field_descriptor, index); + result = PyLong_FromLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT32: { + uint32 value = reflection->GetRepeatedUInt32( + *message, field_descriptor, index); + result = PyLong_FromLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_UINT64: { + uint64 value = reflection->GetRepeatedUInt64( + *message, field_descriptor, index); + result = PyLong_FromUnsignedLongLong(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_FLOAT: { + float value = reflection->GetRepeatedFloat( + *message, field_descriptor, index); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_DOUBLE: { + double value = reflection->GetRepeatedDouble( + *message, field_descriptor, index); + result = PyFloat_FromDouble(value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_BOOL: { + bool value = reflection->GetRepeatedBool( + *message, field_descriptor, index); + result = PyBool_FromLong(value ? 1 : 0); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_ENUM: { + const google::protobuf::EnumValueDescriptor* enum_value = + message->GetReflection()->GetRepeatedEnum( + *message, field_descriptor, index); + result = PyInt_FromLong(enum_value->number()); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_STRING: { + string value = reflection->GetRepeatedString( + *message, field_descriptor, index); + result = ToStringObject(field_descriptor, value); + break; + } + case google::protobuf::FieldDescriptor::CPPTYPE_MESSAGE: { + CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type); + if (py_cmsg == NULL) { + return NULL; + } + const google::protobuf::Message& msg = reflection->GetRepeatedMessage( + *message, field_descriptor, index); + py_cmsg->parent = cmessage; + py_cmsg->full_name = field_descriptor->full_name().c_str(); + py_cmsg->message = const_cast(&msg); + py_cmsg->free_message = false; + py_cmsg->read_only = false; + result = reinterpret_cast(py_cmsg); + break; + } + default: + PyErr_Format( + PyExc_SystemError, + "Getting value from a repeated field of unknown type %d", + field_descriptor->cpp_type()); + } + + return result; +} + +static PyObject* InternalGetRepeatedScalarSlice( + CMessage* cmessage, const google::protobuf::FieldDescriptor* field_descriptor, + PyObject* slice) { + Py_ssize_t from; + Py_ssize_t to; + Py_ssize_t step; + Py_ssize_t length; + bool return_list = false; + google::protobuf::Message* message = cmessage->message; + + if (PyInt_Check(slice)) { + from = to = PyInt_AsLong(slice); + } else if (PyLong_Check(slice)) { + from = to = PyLong_AsLong(slice); + } else if (PySlice_Check(slice)) { + const google::protobuf::Reflection* reflection = message->GetReflection(); + length = reflection->FieldSize(*message, field_descriptor); + PySlice_GetIndices( + reinterpret_cast(slice), length, &from, &to, &step); + return_list = true; + } else { + PyErr_SetString(PyExc_TypeError, "list indices must be integers"); + return NULL; + } + + if (!return_list) { + return InternalGetRepeatedScalar(cmessage, field_descriptor, from); + } + + PyObject* list = PyList_New(0); + if (list == NULL) { + return NULL; + } + + if (from <= to) { + if (step < 0) return list; + for (Py_ssize_t index = from; index < to; index += step) { + if (index < 0 || index >= length) break; + PyObject* s = InternalGetRepeatedScalar( + cmessage, field_descriptor, index); + PyList_Append(list, s); + Py_DECREF(s); + } + } else { + if (step > 0) return list; + for (Py_ssize_t index = from; index > to; index += step) { + if (index < 0 || index >= length) break; + PyObject* s = InternalGetRepeatedScalar( + cmessage, field_descriptor, index); + PyList_Append(list, s); + Py_DECREF(s); + } + } + return list; +} + +// ------ C Constructor/Destructor: + +static int CMessageInit(CMessage* self, PyObject *args, PyObject *kwds) { + self->message = NULL; + return 0; +} + +static void CMessageDealloc(CMessage* self) { + if (self->free_message) { + if (self->read_only) { + PyErr_WriteUnraisable(reinterpret_cast(self)); + } + delete self->message; + } + self->ob_type->tp_free(reinterpret_cast(self)); +} + +// ------ Methods: + +static PyObject* CMessage_Clear(CMessage* self, PyObject* args) { + AssureWritable(self); + self->message->Clear(); + Py_RETURN_NONE; +} + +static PyObject* CMessage_IsInitialized(CMessage* self, PyObject* args) { + return PyBool_FromLong(self->message->IsInitialized() ? 1 : 0); +} + +static PyObject* CMessage_HasField(CMessage* self, PyObject* arg) { + char* field_name; + if (PyString_AsStringAndSize(arg, &field_name, NULL) < 0) { + return NULL; + } + + google::protobuf::Message* message = self->message; + const google::protobuf::Descriptor* descriptor = message->GetDescriptor(); + const google::protobuf::FieldDescriptor* field_descriptor = + descriptor->FindFieldByName(field_name); + if (field_descriptor == NULL) { + PyErr_Format(PyExc_ValueError, "Unknown field %s.", field_name); + return NULL; + } + + bool has_field = + message->GetReflection()->HasField(*message, field_descriptor); + return PyBool_FromLong(has_field ? 1 : 0); +} + +static PyObject* CMessage_HasFieldByDescriptor(CMessage* self, PyObject* arg) { + CFieldDescriptor* cfield_descriptor = NULL; + if (!PyObject_TypeCheck(reinterpret_cast(arg), + &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a field descriptor"); + return NULL; + } + cfield_descriptor = reinterpret_cast(arg); + + google::protobuf::Message* message = self->message; + const google::protobuf::FieldDescriptor* field_descriptor = + cfield_descriptor->descriptor; + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString(PyExc_KeyError, + "Field does not belong to message!"); + return NULL; + } + + if (FIELD_IS_REPEATED(field_descriptor)) { + PyErr_SetString(PyExc_KeyError, + "Field is repeated. A singular method is required."); + return NULL; + } + + bool has_field = + message->GetReflection()->HasField(*message, field_descriptor); + return PyBool_FromLong(has_field ? 1 : 0); +} + +static PyObject* CMessage_ClearFieldByDescriptor( + CMessage* self, PyObject* arg) { + CFieldDescriptor* cfield_descriptor = NULL; + if (!PyObject_TypeCheck(reinterpret_cast(arg), + &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a field descriptor"); + return NULL; + } + cfield_descriptor = reinterpret_cast(arg); + + google::protobuf::Message* message = self->message; + const google::protobuf::FieldDescriptor* field_descriptor = + cfield_descriptor->descriptor; + + if (!FIELD_BELONGS_TO_MESSAGE(field_descriptor, message)) { + PyErr_SetString(PyExc_KeyError, + "Field does not belong to message!"); + return NULL; + } + + message->GetReflection()->ClearField(message, field_descriptor); + Py_RETURN_NONE; +} + +static PyObject* CMessage_ClearField(CMessage* self, PyObject* arg) { + char* field_name; + if (PyString_AsStringAndSize(arg, &field_name, NULL) < 0) { + return NULL; + } + + google::protobuf::Message* message = self->message; + const google::protobuf::Descriptor* descriptor = message->GetDescriptor(); + const google::protobuf::FieldDescriptor* field_descriptor = + descriptor->FindFieldByName(field_name); + if (field_descriptor == NULL) { + PyErr_Format(PyExc_ValueError, "Unknown field %s.", field_name); + return NULL; + } + + message->GetReflection()->ClearField(message, field_descriptor); + Py_RETURN_NONE; +} + +static PyObject* CMessage_GetScalar(CMessage* self, PyObject* arg) { + CFieldDescriptor* cdescriptor = NULL; + if (!PyObject_TypeCheck(reinterpret_cast(arg), + &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a field descriptor"); + return NULL; + } + cdescriptor = reinterpret_cast(arg); + + google::protobuf::Message* message = self->message; + return InternalGetScalar(message, cdescriptor->descriptor); +} + +static PyObject* CMessage_GetRepeatedScalar(CMessage* self, PyObject* args) { + CFieldDescriptor* cfield_descriptor; + PyObject* slice; + if (!PyArg_ParseTuple(args, C("O!O:GetRepeatedScalar"), + &CFieldDescriptor_Type, &cfield_descriptor, &slice)) { + return NULL; + } + + return InternalGetRepeatedScalarSlice( + self, cfield_descriptor->descriptor, slice); +} + +static PyObject* CMessage_AssignRepeatedScalar(CMessage* self, PyObject* args) { + CFieldDescriptor* cfield_descriptor; + PyObject* slice; + if (!PyArg_ParseTuple(args, C("O!O:AssignRepeatedScalar"), + &CFieldDescriptor_Type, &cfield_descriptor, &slice)) { + return NULL; + } + + AssureWritable(self); + google::protobuf::Message* message = self->message; + message->GetReflection()->ClearField(message, cfield_descriptor->descriptor); + + PyObject* iter = PyObject_GetIter(slice); + PyObject* next; + while ((next = PyIter_Next(iter)) != NULL) { + if (InternalAddRepeatedScalar( + message, cfield_descriptor->descriptor, next) == NULL) { + Py_DECREF(next); + Py_DECREF(iter); + return NULL; + } + Py_DECREF(next); + } + Py_DECREF(iter); + Py_RETURN_NONE; +} + +static PyObject* CMessage_DeleteRepeatedField(CMessage* self, PyObject* args) { + CFieldDescriptor* cfield_descriptor; + PyObject* slice; + if (!PyArg_ParseTuple(args, C("O!O:DeleteRepeatedField"), + &CFieldDescriptor_Type, &cfield_descriptor, &slice)) { + return NULL; + } + AssureWritable(self); + + Py_ssize_t length, from, to, step, slice_length; + google::protobuf::Message* message = self->message; + const google::protobuf::FieldDescriptor* field_descriptor = + cfield_descriptor->descriptor; + const google::protobuf::Reflection* reflection = message->GetReflection(); + int min, max; + length = reflection->FieldSize(*message, field_descriptor); + + if (PyInt_Check(slice) || PyLong_Check(slice)) { + from = to = PyLong_AsLong(slice); + if (from < 0) { + from = to = length + from; + } + step = 1; + min = max = from; + + // Range check. + if (from < 0 || from >= length) { + PyErr_Format(PyExc_IndexError, "list assignment index out of range"); + return NULL; + } + } else if (PySlice_Check(slice)) { + from = to = step = slice_length = 0; + PySlice_GetIndicesEx( + reinterpret_cast(slice), + length, &from, &to, &step, &slice_length); + if (from < to) { + min = from; + max = to - 1; + } else { + min = to + 1; + max = from; + } + } else { + PyErr_SetString(PyExc_TypeError, "list indices must be integers"); + return NULL; + } + + Py_ssize_t i = from; + std::vector to_delete(length, false); + while (i >= min && i <= max) { + to_delete[i] = true; + i += step; + } + + to = 0; + for (i = 0; i < length; ++i) { + if (!to_delete[i]) { + if (i != to) { + reflection->SwapElements(message, field_descriptor, i, to); + } + ++to; + } + } + + while (i > to) { + reflection->RemoveLast(message, field_descriptor); + --i; + } + + Py_RETURN_NONE; +} + + +static PyObject* CMessage_SetScalar(CMessage* self, PyObject* args) { + CFieldDescriptor* cfield_descriptor; + PyObject* arg; + if (!PyArg_ParseTuple(args, C("O!O:SetScalar"), + &CFieldDescriptor_Type, &cfield_descriptor, &arg)) { + return NULL; + } + AssureWritable(self); + + return InternalSetScalar(self->message, cfield_descriptor->descriptor, arg); +} + +static PyObject* CMessage_AddRepeatedScalar(CMessage* self, PyObject* args) { + CFieldDescriptor* cfield_descriptor; + PyObject* value; + if (!PyArg_ParseTuple(args, C("O!O:AddRepeatedScalar"), + &CFieldDescriptor_Type, &cfield_descriptor, &value)) { + return NULL; + } + AssureWritable(self); + + return InternalAddRepeatedScalar( + self->message, cfield_descriptor->descriptor, value); +} + +static PyObject* CMessage_FieldLength(CMessage* self, PyObject* arg) { + CFieldDescriptor* cfield_descriptor; + if (!PyObject_TypeCheck(reinterpret_cast(arg), + &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a field descriptor"); + return NULL; + } + cfield_descriptor = reinterpret_cast(arg); + + google::protobuf::Message* message = self->message; + int length = message->GetReflection()->FieldSize( + *message, cfield_descriptor->descriptor); + return PyInt_FromLong(length); +} + +static PyObject* CMessage_DebugString(CMessage* self, PyObject* args) { + return PyString_FromString(self->message->DebugString().c_str()); +} + +static PyObject* CMessage_SerializeToString(CMessage* self, PyObject* args) { + int size = self->message->ByteSize(); + if (size <= 0) { + return PyString_FromString(""); + } + PyObject* result = PyString_FromStringAndSize(NULL, size); + if (result == NULL) { + return NULL; + } + char* buffer = PyString_AS_STRING(result); + self->message->SerializeWithCachedSizesToArray( + reinterpret_cast(buffer)); + return result; +} + +static PyObject* CMessage_SerializePartialToString( + CMessage* self, PyObject* args) { + string contents; + self->message->SerializePartialToString(&contents); + return PyString_FromStringAndSize(contents.c_str(), contents.size()); +} + +static PyObject* CMessageStr(CMessage* self) { + char str[1024]; + str[sizeof(str) - 1] = 0; + snprintf(str, sizeof(str) - 1, "CMessage: <%p>", self->message); + return PyString_FromString(str); +} + +static PyObject* CMessage_MergeFrom(CMessage* self, PyObject* arg) { + CMessage* other_message; + if (!PyObject_TypeCheck(reinterpret_cast(arg), &CMessage_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a message"); + return NULL; + } + + other_message = reinterpret_cast(arg); + if (other_message->message->GetDescriptor() != + self->message->GetDescriptor()) { + PyErr_Format(PyExc_TypeError, + "Tried to merge from a message with a different type. " + "to: %s, from: %s", + self->message->GetDescriptor()->full_name().c_str(), + other_message->message->GetDescriptor()->full_name().c_str()); + return NULL; + } + AssureWritable(self); + + self->message->MergeFrom(*other_message->message); + Py_RETURN_NONE; +} + +static PyObject* CMessage_CopyFrom(CMessage* self, PyObject* arg) { + CMessage* other_message; + if (!PyObject_TypeCheck(reinterpret_cast(arg), &CMessage_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a message"); + return NULL; + } + + other_message = reinterpret_cast(arg); + if (other_message->message->GetDescriptor() != + self->message->GetDescriptor()) { + PyErr_Format(PyExc_TypeError, + "Tried to copy from a message with a different type. " + "to: %s, from: %s", + self->message->GetDescriptor()->full_name().c_str(), + other_message->message->GetDescriptor()->full_name().c_str()); + return NULL; + } + + AssureWritable(self); + + self->message->CopyFrom(*other_message->message); + Py_RETURN_NONE; +} + +static PyObject* CMessage_MergeFromString(CMessage* self, PyObject* arg) { + const void* data; + Py_ssize_t data_length; + if (PyObject_AsReadBuffer(arg, &data, &data_length) < 0) { + return NULL; + } + + AssureWritable(self); + google::protobuf::io::CodedInputStream input( + reinterpret_cast(data), data_length); + bool success = self->message->MergePartialFromCodedStream(&input); + if (success) { + return PyInt_FromLong(self->message->ByteSize()); + } else { + return PyInt_FromLong(-1); + } +} + +static PyObject* CMessage_ByteSize(CMessage* self, PyObject* args) { + return PyLong_FromLong(self->message->ByteSize()); +} + +static PyObject* CMessage_SetInParent(CMessage* self, PyObject* args) { + AssureWritable(self); + Py_RETURN_NONE; +} + +static PyObject* CMessage_SwapRepeatedFieldElements( + CMessage* self, PyObject* args) { + CFieldDescriptor* cfield_descriptor; + int index1, index2; + if (!PyArg_ParseTuple(args, C("O!ii:SwapRepeatedFieldElements"), + &CFieldDescriptor_Type, &cfield_descriptor, + &index1, &index2)) { + return NULL; + } + + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + + reflection->SwapElements( + message, cfield_descriptor->descriptor, index1, index2); + Py_RETURN_NONE; +} + +static PyObject* CMessage_AddMessage(CMessage* self, PyObject* arg) { + CFieldDescriptor* cfield_descriptor; + if (!PyObject_TypeCheck(reinterpret_cast(arg), + &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a field descriptor"); + return NULL; + } + cfield_descriptor = reinterpret_cast(arg); + AssureWritable(self); + + CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type); + if (py_cmsg == NULL) { + return NULL; + } + + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + google::protobuf::Message* sub_message = + reflection->AddMessage(message, cfield_descriptor->descriptor); + + py_cmsg->parent = NULL; + py_cmsg->full_name = sub_message->GetDescriptor()->full_name().c_str(); + py_cmsg->message = sub_message; + py_cmsg->free_message = false; + py_cmsg->read_only = false; + return reinterpret_cast(py_cmsg); +} + +static PyObject* CMessage_GetRepeatedMessage(CMessage* self, PyObject* args) { + CFieldDescriptor* cfield_descriptor; + PyObject* slice; + if (!PyArg_ParseTuple(args, C("O!O:GetRepeatedMessage"), + &CFieldDescriptor_Type, &cfield_descriptor, &slice)) { + return NULL; + } + + return InternalGetRepeatedScalarSlice( + self, cfield_descriptor->descriptor, slice); +} + +static PyObject* CMessage_NewSubMessage(CMessage* self, PyObject* arg) { + CFieldDescriptor* cfield_descriptor; + if (!PyObject_TypeCheck(reinterpret_cast(arg), + &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a field descriptor"); + return NULL; + } + cfield_descriptor = reinterpret_cast(arg); + + CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type); + if (py_cmsg == NULL) { + return NULL; + } + + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + const google::protobuf::Message& sub_message = + reflection->GetMessage(*message, cfield_descriptor->descriptor, + global_message_factory); + + py_cmsg->full_name = sub_message.GetDescriptor()->full_name().c_str(); + py_cmsg->parent = self; + py_cmsg->parent_field = cfield_descriptor; + py_cmsg->message = const_cast(&sub_message); + py_cmsg->free_message = false; + py_cmsg->read_only = true; + return reinterpret_cast(py_cmsg); +} + +static PyObject* CMessage_MutableMessage(CMessage* self, PyObject* arg) { + CFieldDescriptor* cfield_descriptor; + if (!PyObject_TypeCheck(reinterpret_cast(arg), + &CFieldDescriptor_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a field descriptor"); + return NULL; + } + cfield_descriptor = reinterpret_cast(arg); + AssureWritable(self); + + CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type); + if (py_cmsg == NULL) { + return NULL; + } + + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + google::protobuf::Message* mutable_message = + reflection->MutableMessage(message, cfield_descriptor->descriptor, + global_message_factory); + + py_cmsg->full_name = mutable_message->GetDescriptor()->full_name().c_str(); + py_cmsg->message = mutable_message; + py_cmsg->free_message = false; + py_cmsg->read_only = false; + return reinterpret_cast(py_cmsg); +} + +static PyObject* CMessage_Equals(CMessage* self, PyObject* arg) { + CMessage* other_message; + if (!PyObject_TypeCheck(reinterpret_cast(arg), &CMessage_Type)) { + PyErr_SetString(PyExc_TypeError, "Must be a message"); + return NULL; + } + other_message = reinterpret_cast(arg); + + if (other_message->message == self->message) { + return PyBool_FromLong(1); + } + + if (other_message->message->GetDescriptor() != + self->message->GetDescriptor()) { + return PyBool_FromLong(0); + } + + return PyBool_FromLong(1); +} + +static PyObject* CMessage_ListFields(CMessage* self, PyObject* args) { + google::protobuf::Message* message = self->message; + const google::protobuf::Reflection* reflection = message->GetReflection(); + vector fields; + reflection->ListFields(*message, &fields); + + PyObject* list = PyList_New(fields.size()); + if (list == NULL) { + return NULL; + } + + for (unsigned int i = 0; i < fields.size(); ++i) { + bool is_extension = fields[i]->is_extension(); + PyObject* t = PyTuple_New(2); + if (t == NULL) { + Py_DECREF(list); + return NULL; + } + + PyObject* is_extension_object = PyBool_FromLong(is_extension ? 1 : 0); + + PyObject* field_name; + const string* s; + if (is_extension) { + s = &fields[i]->full_name(); + } else { + s = &fields[i]->name(); + } + field_name = PyString_FromStringAndSize(s->c_str(), s->length()); + if (field_name == NULL) { + Py_DECREF(list); + Py_DECREF(t); + return NULL; + } + + PyTuple_SET_ITEM(t, 0, is_extension_object); + PyTuple_SET_ITEM(t, 1, field_name); + PyList_SET_ITEM(list, i, t); + } + + return list; +} + +static PyObject* CMessage_FindInitializationErrors(CMessage* self) { + google::protobuf::Message* message = self->message; + vector errors; + message->FindInitializationErrors(&errors); + + PyObject* error_list = PyList_New(errors.size()); + if (error_list == NULL) { + return NULL; + } + for (unsigned int i = 0; i < errors.size(); ++i) { + const string& error = errors[i]; + PyObject* error_string = PyString_FromStringAndSize( + error.c_str(), error.length()); + if (error_string == NULL) { + Py_DECREF(error_list); + return NULL; + } + PyList_SET_ITEM(error_list, i, error_string); + } + return error_list; +} + +// ------ Python Constructor: + +PyObject* Python_NewCMessage(PyObject* ignored, PyObject* arg) { + const char* message_type = PyString_AsString(arg); + if (message_type == NULL) { + return NULL; + } + + const google::protobuf::Message* message = CreateMessage(message_type); + if (message == NULL) { + PyErr_Format(PyExc_TypeError, "Couldn't create message of type %s!", + message_type); + return NULL; + } + + CMessage* py_cmsg = PyObject_New(CMessage, &CMessage_Type); + if (py_cmsg == NULL) { + return NULL; + } + py_cmsg->message = message->New(); + py_cmsg->free_message = true; + py_cmsg->full_name = message->GetDescriptor()->full_name().c_str(); + py_cmsg->read_only = false; + py_cmsg->parent = NULL; + py_cmsg->parent_field = NULL; + return reinterpret_cast(py_cmsg); +} + +// --- Module Functions (exposed to Python): + +PyMethodDef methods[] = { + { C("NewCMessage"), (PyCFunction)Python_NewCMessage, + METH_O, + C("Creates a new C++ protocol message, given its full name.") }, + { C("NewCDescriptorPool"), (PyCFunction)Python_NewCDescriptorPool, + METH_NOARGS, + C("Creates a new C++ descriptor pool.") }, + { C("BuildFile"), (PyCFunction)Python_BuildFile, + METH_O, + C("Registers a new protocol buffer file in the global C++ descriptor " + "pool.") }, + {NULL} +}; + +// --- Exposing the C proto living inside Python proto to C code: + +extern const Message* (*GetCProtoInsidePyProtoPtr)(PyObject* msg); +extern Message* (*MutableCProtoInsidePyProtoPtr)(PyObject* msg); + +static const google::protobuf::Message* GetCProtoInsidePyProtoImpl(PyObject* msg) { + PyObject* c_msg_obj = PyObject_GetAttrString(msg, "_cmsg"); + if (c_msg_obj == NULL) { + PyErr_Clear(); + return NULL; + } + Py_DECREF(c_msg_obj); + if (!PyObject_TypeCheck(c_msg_obj, &CMessage_Type)) { + return NULL; + } + CMessage* c_msg = reinterpret_cast(c_msg_obj); + return c_msg->message; +} + +static google::protobuf::Message* MutableCProtoInsidePyProtoImpl(PyObject* msg) { + PyObject* c_msg_obj = PyObject_GetAttrString(msg, "_cmsg"); + if (c_msg_obj == NULL) { + PyErr_Clear(); + return NULL; + } + Py_DECREF(c_msg_obj); + if (!PyObject_TypeCheck(c_msg_obj, &CMessage_Type)) { + return NULL; + } + CMessage* c_msg = reinterpret_cast(c_msg_obj); + AssureWritable(c_msg); + return c_msg->message; +} + +// --- Module Init Function: + +static const char module_docstring[] = +"python-proto2 is a module that can be used to enhance proto2 Python API\n" +"performance.\n" +"\n" +"It provides access to the protocol buffers C++ reflection API that\n" +"implements the basic protocol buffer functions."; + +extern "C" { + void init_net_proto2___python() { + // Initialize constants. + kPythonZero = PyInt_FromLong(0); + kint32min_py = PyInt_FromLong(kint32min); + kint32max_py = PyInt_FromLong(kint32max); + kuint32max_py = PyLong_FromLongLong(kuint32max); + kint64min_py = PyLong_FromLongLong(kint64min); + kint64max_py = PyLong_FromLongLong(kint64max); + kuint64max_py = PyLong_FromUnsignedLongLong(kuint64max); + + global_message_factory = new DynamicMessageFactory(GetDescriptorPool()); + global_message_factory->SetDelegateToGeneratedFactory(true); + + // Export our functions to Python. + PyObject *m; + m = Py_InitModule3(C("_net_proto2___python"), methods, C(module_docstring)); + if (m == NULL) { + return; + } + + AddConstants(m); + + CMessage_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&CMessage_Type) < 0) { + return; + } + + if (!InitDescriptor()) { + return; + } + + // Override {Get,Mutable}CProtoInsidePyProto. + GetCProtoInsidePyProtoPtr = GetCProtoInsidePyProtoImpl; + MutableCProtoInsidePyProtoPtr = MutableCProtoInsidePyProtoImpl; + } +} + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc new file mode 100644 index 000000000..fb87bad19 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc @@ -0,0 +1,334 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: petar@google.com (Petar Petrov) + +#include + +#include +#include + +#define C(str) const_cast(str) + +namespace google { +namespace protobuf { +namespace python { + +static void CFieldDescriptorDealloc(CFieldDescriptor* self); + +static google::protobuf::DescriptorPool* g_descriptor_pool = NULL; + +static PyObject* CFieldDescriptor_GetFullName( + CFieldDescriptor* self, void *closure) { + Py_XINCREF(self->full_name); + return self->full_name; +} + +static PyObject* CFieldDescriptor_GetName( + CFieldDescriptor *self, void *closure) { + Py_XINCREF(self->name); + return self->name; +} + +static PyObject* CFieldDescriptor_GetCppType( + CFieldDescriptor *self, void *closure) { + Py_XINCREF(self->cpp_type); + return self->cpp_type; +} + +static PyObject* CFieldDescriptor_GetLabel( + CFieldDescriptor *self, void *closure) { + Py_XINCREF(self->label); + return self->label; +} + +static PyObject* CFieldDescriptor_GetID( + CFieldDescriptor *self, void *closure) { + Py_XINCREF(self->id); + return self->id; +} + + +static PyGetSetDef CFieldDescriptorGetters[] = { + { C("full_name"), + (getter)CFieldDescriptor_GetFullName, NULL, "Full name", NULL}, + { C("name"), + (getter)CFieldDescriptor_GetName, NULL, "last name", NULL}, + { C("cpp_type"), + (getter)CFieldDescriptor_GetCppType, NULL, "C++ Type", NULL}, + { C("label"), + (getter)CFieldDescriptor_GetLabel, NULL, "Label", NULL}, + { C("id"), + (getter)CFieldDescriptor_GetID, NULL, "ID", NULL}, + {NULL} +}; + +PyTypeObject CFieldDescriptor_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, + C("google3.net.google.protobuf.python.internal." + "_net_proto2___python." + "CFieldDescriptor"), // tp_name + sizeof(CFieldDescriptor), // tp_basicsize + 0, // tp_itemsize + (destructor)CFieldDescriptorDealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + C("A Field Descriptor"), // tp_doc + 0, // tp_traverse + 0, // tp_clear + 0, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + 0, // tp_methods + 0, // tp_members + CFieldDescriptorGetters, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + 0, // tp_init + PyType_GenericAlloc, // tp_alloc + PyType_GenericNew, // tp_new + PyObject_Del, // tp_free +}; + +static void CFieldDescriptorDealloc(CFieldDescriptor* self) { + Py_DECREF(self->full_name); + Py_DECREF(self->name); + Py_DECREF(self->cpp_type); + Py_DECREF(self->label); + Py_DECREF(self->id); + self->ob_type->tp_free(reinterpret_cast(self)); +} + +typedef struct { + PyObject_HEAD + + const google::protobuf::DescriptorPool* pool; +} CDescriptorPool; + +static void CDescriptorPoolDealloc(CDescriptorPool* self); + +static PyObject* CDescriptorPool_NewCDescriptor( + const google::protobuf::FieldDescriptor* field_descriptor) { + CFieldDescriptor* cfield_descriptor = PyObject_New( + CFieldDescriptor, &CFieldDescriptor_Type); + if (cfield_descriptor == NULL) { + return NULL; + } + cfield_descriptor->descriptor = field_descriptor; + + cfield_descriptor->full_name = PyString_FromString( + field_descriptor->full_name().c_str()); + cfield_descriptor->name = PyString_FromString( + field_descriptor->name().c_str()); + cfield_descriptor->cpp_type = PyLong_FromLong(field_descriptor->cpp_type()); + cfield_descriptor->label = PyLong_FromLong(field_descriptor->label()); + cfield_descriptor->id = PyLong_FromVoidPtr(cfield_descriptor); + return reinterpret_cast(cfield_descriptor); +} + +static PyObject* CDescriptorPool_FindFieldByName( + CDescriptorPool* self, PyObject* arg) { + const char* full_field_name = PyString_AsString(arg); + if (full_field_name == NULL) { + return NULL; + } + + const google::protobuf::FieldDescriptor* field_descriptor = NULL; + + field_descriptor = self->pool->FindFieldByName(full_field_name); + if (field_descriptor == NULL) { + PyErr_Format(PyExc_TypeError, "Couldn't find field %.200s", + full_field_name); + return NULL; + } + + return CDescriptorPool_NewCDescriptor(field_descriptor); +} + +static PyObject* CDescriptorPool_FindExtensionByName( + CDescriptorPool* self, PyObject* arg) { + const char* full_field_name = PyString_AsString(arg); + if (full_field_name == NULL) { + return NULL; + } + + const google::protobuf::FieldDescriptor* field_descriptor = + self->pool->FindExtensionByName(full_field_name); + if (field_descriptor == NULL) { + PyErr_Format(PyExc_TypeError, "Couldn't find field %.200s", + full_field_name); + return NULL; + } + + return CDescriptorPool_NewCDescriptor(field_descriptor); +} + +static PyMethodDef CDescriptorPoolMethods[] = { + { C("FindFieldByName"), + (PyCFunction)CDescriptorPool_FindFieldByName, + METH_O, + C("Searches for a field descriptor by full name.") }, + { C("FindExtensionByName"), + (PyCFunction)CDescriptorPool_FindExtensionByName, + METH_O, + C("Searches for extension descriptor by full name.") }, + {NULL} +}; + +PyTypeObject CDescriptorPool_Type = { + PyObject_HEAD_INIT(&PyType_Type) + 0, + C("google3.net.google.protobuf.python.internal." + "_net_proto2___python." + "CFieldDescriptor"), // tp_name + sizeof(CDescriptorPool), // tp_basicsize + 0, // tp_itemsize + (destructor)CDescriptorPoolDealloc, // tp_dealloc + 0, // tp_print + 0, // tp_getattr + 0, // tp_setattr + 0, // tp_compare + 0, // tp_repr + 0, // tp_as_number + 0, // tp_as_sequence + 0, // tp_as_mapping + 0, // tp_hash + 0, // tp_call + 0, // tp_str + 0, // tp_getattro + 0, // tp_setattro + 0, // tp_as_buffer + Py_TPFLAGS_DEFAULT, // tp_flags + C("A Descriptor Pool"), // tp_doc + 0, // tp_traverse + 0, // tp_clear + 0, // tp_richcompare + 0, // tp_weaklistoffset + 0, // tp_iter + 0, // tp_iternext + CDescriptorPoolMethods, // tp_methods + 0, // tp_members + 0, // tp_getset + 0, // tp_base + 0, // tp_dict + 0, // tp_descr_get + 0, // tp_descr_set + 0, // tp_dictoffset + 0, // tp_init + PyType_GenericAlloc, // tp_alloc + PyType_GenericNew, // tp_new + PyObject_Del, // tp_free +}; + +static void CDescriptorPoolDealloc(CDescriptorPool* self) { + self->ob_type->tp_free(reinterpret_cast(self)); +} + +google::protobuf::DescriptorPool* GetDescriptorPool() { + if (g_descriptor_pool == NULL) { + g_descriptor_pool = new google::protobuf::DescriptorPool( + google::protobuf::DescriptorPool::generated_pool()); + } + return g_descriptor_pool; +} + +PyObject* Python_NewCDescriptorPool(PyObject* ignored, PyObject* args) { + CDescriptorPool* cdescriptor_pool = PyObject_New( + CDescriptorPool, &CDescriptorPool_Type); + if (cdescriptor_pool == NULL) { + return NULL; + } + cdescriptor_pool->pool = GetDescriptorPool(); + return reinterpret_cast(cdescriptor_pool); +} + +PyObject* Python_BuildFile(PyObject* ignored, PyObject* arg) { + char* message_type; + Py_ssize_t message_len; + + if (PyString_AsStringAndSize(arg, &message_type, &message_len) < 0) { + return NULL; + } + + google::protobuf::FileDescriptorProto file_proto; + if (!file_proto.ParseFromArray(message_type, message_len)) { + PyErr_SetString(PyExc_TypeError, "Couldn't parse file content!"); + return NULL; + } + + // If this file is already in the generated pool, don't add it again. + if (google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + file_proto.name()) != NULL) { + Py_RETURN_NONE; + } + + const google::protobuf::FileDescriptor* descriptor = GetDescriptorPool()->BuildFile( + file_proto); + if (descriptor == NULL) { + PyErr_SetString(PyExc_TypeError, + "Couldn't build proto file into descriptor pool!"); + return NULL; + } + + Py_RETURN_NONE; +} + +bool InitDescriptor() { + CFieldDescriptor_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&CFieldDescriptor_Type) < 0) + return false; + + CDescriptorPool_Type.tp_new = PyType_GenericNew; + if (PyType_Ready(&CDescriptorPool_Type) < 0) + return false; + return true; +} + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h new file mode 100644 index 000000000..5232680f3 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h @@ -0,0 +1,87 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: petar@google.com (Petar Petrov) + +#ifndef GOOGLE_PROTOBUF_PYTHON_DESCRIPTOR_H__ +#define GOOGLE_PROTOBUF_PYTHON_DESCRIPTOR_H__ + +#include +#include + +#include + +#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN) +typedef int Py_ssize_t; +#define PY_SSIZE_T_MAX INT_MAX +#define PY_SSIZE_T_MIN INT_MIN +#endif + +namespace google { +namespace protobuf { +namespace python { + +typedef struct { + PyObject_HEAD + + // The proto2 descriptor that this object represents. + const google::protobuf::FieldDescriptor* descriptor; + + // Full name of the field (PyString). + PyObject* full_name; + + // Name of the field (PyString). + PyObject* name; + + // C++ type of the field (PyLong). + PyObject* cpp_type; + + // Name of the field (PyLong). + PyObject* label; + + // Identity of the descriptor (PyLong used as a poiner). + PyObject* id; +} CFieldDescriptor; + +extern PyTypeObject CFieldDescriptor_Type; + +extern PyTypeObject CDescriptorPool_Type; + + +PyObject* Python_NewCDescriptorPool(PyObject* ignored, PyObject* args); +PyObject* Python_BuildFile(PyObject* ignored, PyObject* args); +bool InitDescriptor(); +google::protobuf::DescriptorPool* GetDescriptorPool(); + +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_DESCRIPTOR_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc new file mode 100644 index 000000000..1b1ab5d1d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc @@ -0,0 +1,63 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: qrczak@google.com (Marcin Kowalczyk) + +#include + +namespace google { +namespace protobuf { +namespace python { + +static const Message* GetCProtoInsidePyProtoStub(PyObject* msg) { + return NULL; +} +static Message* MutableCProtoInsidePyProtoStub(PyObject* msg) { + return NULL; +} + +// This is initialized with a default, stub implementation. +// If python-google.protobuf.cc is loaded, the function pointer is overridden +// with a full implementation. +const Message* (*GetCProtoInsidePyProtoPtr)(PyObject* msg) = + GetCProtoInsidePyProtoStub; +Message* (*MutableCProtoInsidePyProtoPtr)(PyObject* msg) = + MutableCProtoInsidePyProtoStub; + +const Message* GetCProtoInsidePyProto(PyObject* msg) { + return GetCProtoInsidePyProtoPtr(msg); +} +Message* MutableCProtoInsidePyProto(PyObject* msg) { + return MutableCProtoInsidePyProtoPtr(msg); +} + +} // namespace python +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h new file mode 100644 index 000000000..c5b0b1cdd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h @@ -0,0 +1,57 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: qrczak@google.com (Marcin Kowalczyk) +// +// This module exposes the C proto inside the given Python proto, in +// case the Python proto is implemented with a C proto. + +#ifndef GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__ +#define GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__ + +#include + +namespace google { +namespace protobuf { + +class Message; + +namespace python { + +// Return the pointer to the C proto inside the given Python proto, +// or NULL when this is not a Python proto implemented with a C proto. +const Message* GetCProtoInsidePyProto(PyObject* msg); +Message* MutableCProtoInsidePyProto(PyObject* msg); + +} // namespace python +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_PYTHON_PYTHON_PROTOBUF_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py new file mode 100755 index 000000000..1373c882d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py @@ -0,0 +1,142 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# This code is meant to work on Python 2.4 and above only. + +"""Contains a metaclass and helper functions used to create +protocol message classes from Descriptor objects at runtime. + +Recall that a metaclass is the "type" of a class. +(A class is to a metaclass what an instance is to a class.) + +In this case, we use the GeneratedProtocolMessageType metaclass +to inject all the useful functionality into the classes +output by the protocol compiler at compile-time. + +The upshot of all this is that the real implementation +details for ALL pure-Python protocol buffers are *here in +this file*. +""" + +__author__ = 'robinson@google.com (Will Robinson)' + + +from google.protobuf.internal import api_implementation +from google.protobuf import descriptor as descriptor_mod +_FieldDescriptor = descriptor_mod.FieldDescriptor + + +if api_implementation.Type() == 'cpp': + from google.protobuf.internal import cpp_message + _NewMessage = cpp_message.NewMessage + _InitMessage = cpp_message.InitMessage +else: + from google.protobuf.internal import python_message + _NewMessage = python_message.NewMessage + _InitMessage = python_message.InitMessage + + +class GeneratedProtocolMessageType(type): + + """Metaclass for protocol message classes created at runtime from Descriptors. + + We add implementations for all methods described in the Message class. We + also create properties to allow getting/setting all fields in the protocol + message. Finally, we create slots to prevent users from accidentally + "setting" nonexistent fields in the protocol message, which then wouldn't get + serialized / deserialized properly. + + The protocol compiler currently uses this metaclass to create protocol + message classes at runtime. Clients can also manually create their own + classes at runtime, as in this example: + + mydescriptor = Descriptor(.....) + class MyProtoClass(Message): + __metaclass__ = GeneratedProtocolMessageType + DESCRIPTOR = mydescriptor + myproto_instance = MyProtoClass() + myproto.foo_field = 23 + ... + """ + + # Must be consistent with the protocol-compiler code in + # proto2/compiler/internal/generator.*. + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __new__(cls, name, bases, dictionary): + """Custom allocation for runtime-generated class types. + + We override __new__ because this is apparently the only place + where we can meaningfully set __slots__ on the class we're creating(?). + (The interplay between metaclasses and slots is not very well-documented). + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + + Returns: + Newly-allocated class. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + _NewMessage(descriptor, dictionary) + superclass = super(GeneratedProtocolMessageType, cls) + + new_class = superclass.__new__(cls, name, bases, dictionary) + setattr(descriptor, '_concrete_class', new_class) + return new_class + + def __init__(cls, name, bases, dictionary): + """Here we perform the majority of our work on the class. + We add enum getters, an __init__ method, implementations + of all Message methods, and properties for all fields + in the protocol type. + + Args: + name: Name of the class (ignored, but required by the + metaclass protocol). + bases: Base classes of the class we're constructing. + (Should be message.Message). We ignore this field, but + it's required by the metaclass protocol + dictionary: The class dictionary of the class we're + constructing. dictionary[_DESCRIPTOR_KEY] must contain + a Descriptor object describing this protocol message + type. + """ + descriptor = dictionary[GeneratedProtocolMessageType._DESCRIPTOR_KEY] + _InitMessage(descriptor, cls) + superclass = super(GeneratedProtocolMessageType, cls) + superclass.__init__(name, bases, dictionary) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py new file mode 100755 index 000000000..180b70e82 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py @@ -0,0 +1,226 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""DEPRECATED: Declares the RPC service interfaces. + +This module declares the abstract interfaces underlying proto2 RPC +services. These are intended to be independent of any particular RPC +implementation, so that proto2 services can be used on top of a variety +of implementations. Starting with version 2.3.0, RPC implementations should +not try to build on these, but should instead provide code generator plugins +which generate code specific to the particular RPC implementation. This way +the generated code can be more appropriate for the implementation in use +and can avoid unnecessary layers of indirection. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class RpcException(Exception): + """Exception raised on failed blocking RPC method call.""" + pass + + +class Service(object): + + """Abstract base interface for protocol-buffer-based RPC services. + + Services themselves are abstract classes (implemented either by servers or as + stubs), but they subclass this base interface. The methods of this + interface can be used to call the methods of the service without knowing + its exact type at compile time (analogous to the Message interface). + """ + + def GetDescriptor(): + """Retrieves this service's descriptor.""" + raise NotImplementedError + + def CallMethod(self, method_descriptor, rpc_controller, + request, done): + """Calls a method of the service specified by method_descriptor. + + If "done" is None then the call is blocking and the response + message will be returned directly. Otherwise the call is asynchronous + and "done" will later be called with the response value. + + In the blocking case, RpcException will be raised on error. + + Preconditions: + * method_descriptor.service == GetDescriptor + * request is of the exact same classes as returned by + GetRequestClass(method). + * After the call has started, the request must not be modified. + * "rpc_controller" is of the correct type for the RPC implementation being + used by this Service. For stubs, the "correct type" depends on the + RpcChannel which the stub is using. + + Postconditions: + * "done" will be called when the method is complete. This may be + before CallMethod() returns or it may be at some point in the future. + * If the RPC failed, the response value passed to "done" will be None. + Further details about the failure can be found by querying the + RpcController. + """ + raise NotImplementedError + + def GetRequestClass(self, method_descriptor): + """Returns the class of the request message for the specified method. + + CallMethod() requires that the request is of a particular subclass of + Message. GetRequestClass() gets the default instance of this required + type. + + Example: + method = service.GetDescriptor().FindMethodByName("Foo") + request = stub.GetRequestClass(method)() + request.ParseFromString(input) + service.CallMethod(method, request, callback) + """ + raise NotImplementedError + + def GetResponseClass(self, method_descriptor): + """Returns the class of the response message for the specified method. + + This method isn't really needed, as the RpcChannel's CallMethod constructs + the response protocol message. It's provided anyway in case it is useful + for the caller to know the response type in advance. + """ + raise NotImplementedError + + +class RpcController(object): + + """An RpcController mediates a single method call. + + The primary purpose of the controller is to provide a way to manipulate + settings specific to the RPC implementation and to find out about RPC-level + errors. The methods provided by the RpcController interface are intended + to be a "least common denominator" set of features which we expect all + implementations to support. Specific implementations may provide more + advanced features (e.g. deadline propagation). + """ + + # Client-side methods below + + def Reset(self): + """Resets the RpcController to its initial state. + + After the RpcController has been reset, it may be reused in + a new call. Must not be called while an RPC is in progress. + """ + raise NotImplementedError + + def Failed(self): + """Returns true if the call failed. + + After a call has finished, returns true if the call failed. The possible + reasons for failure depend on the RPC implementation. Failed() must not + be called before a call has finished. If Failed() returns true, the + contents of the response message are undefined. + """ + raise NotImplementedError + + def ErrorText(self): + """If Failed is true, returns a human-readable description of the error.""" + raise NotImplementedError + + def StartCancel(self): + """Initiate cancellation. + + Advises the RPC system that the caller desires that the RPC call be + canceled. The RPC system may cancel it immediately, may wait awhile and + then cancel it, or may not even cancel the call at all. If the call is + canceled, the "done" callback will still be called and the RpcController + will indicate that the call failed at that time. + """ + raise NotImplementedError + + # Server-side methods below + + def SetFailed(self, reason): + """Sets a failure reason. + + Causes Failed() to return true on the client side. "reason" will be + incorporated into the message returned by ErrorText(). If you find + you need to return machine-readable information about failures, you + should incorporate it into your response protocol buffer and should + NOT call SetFailed(). + """ + raise NotImplementedError + + def IsCanceled(self): + """Checks if the client cancelled the RPC. + + If true, indicates that the client canceled the RPC, so the server may + as well give up on replying to it. The server should still call the + final "done" callback. + """ + raise NotImplementedError + + def NotifyOnCancel(self, callback): + """Sets a callback to invoke on cancel. + + Asks that the given callback be called when the RPC is canceled. The + callback will always be called exactly once. If the RPC completes without + being canceled, the callback will be called after completion. If the RPC + has already been canceled when NotifyOnCancel() is called, the callback + will be called immediately. + + NotifyOnCancel() must be called no more than once per request. + """ + raise NotImplementedError + + +class RpcChannel(object): + + """Abstract interface for an RPC channel. + + An RpcChannel represents a communication line to a service which can be used + to call that service's methods. The service may be running on another + machine. Normally, you should not use an RpcChannel directly, but instead + construct a stub {@link Service} wrapping it. Example: + + Example: + RpcChannel channel = rpcImpl.Channel("remotehost.example.com:1234") + RpcController controller = rpcImpl.Controller() + MyService service = MyService_Stub(channel) + service.MyMethod(controller, request, callback) + """ + + def CallMethod(self, method_descriptor, rpc_controller, + request, response_class, done): + """Calls the method identified by the descriptor. + + Call the given method of the remote service. The signature of this + procedure looks the same as Service.CallMethod(), but the requirements + are less strict in one important way: the request object doesn't have to + be of any specific class as long as its descriptor is method.input_type. + """ + raise NotImplementedError diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py new file mode 100755 index 000000000..851e83e72 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py @@ -0,0 +1,284 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Contains metaclasses used to create protocol service and service stub +classes from ServiceDescriptor objects at runtime. + +The GeneratedServiceType and GeneratedServiceStubType metaclasses are used to +inject all useful functionality into the classes output by the protocol +compiler at compile-time. +""" + +__author__ = 'petar@google.com (Petar Petrov)' + + +class GeneratedServiceType(type): + + """Metaclass for service classes created at runtime from ServiceDescriptors. + + Implementations for all methods described in the Service class are added here + by this class. We also create properties to allow getting/setting all fields + in the protocol message. + + The protocol compiler currently uses this metaclass to create protocol service + classes at runtime. Clients can also manually create their own classes at + runtime, as in this example: + + mydescriptor = ServiceDescriptor(.....) + class MyProtoService(service.Service): + __metaclass__ = GeneratedServiceType + DESCRIPTOR = mydescriptor + myservice_instance = MyProtoService() + ... + """ + + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __init__(cls, name, bases, dictionary): + """Creates a message service class. + + Args: + name: Name of the class (ignored, but required by the metaclass + protocol). + bases: Base classes of the class being constructed. + dictionary: The class dictionary of the class being constructed. + dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object + describing this protocol service type. + """ + # Don't do anything if this class doesn't have a descriptor. This happens + # when a service class is subclassed. + if GeneratedServiceType._DESCRIPTOR_KEY not in dictionary: + return + descriptor = dictionary[GeneratedServiceType._DESCRIPTOR_KEY] + service_builder = _ServiceBuilder(descriptor) + service_builder.BuildService(cls) + + +class GeneratedServiceStubType(GeneratedServiceType): + + """Metaclass for service stubs created at runtime from ServiceDescriptors. + + This class has similar responsibilities as GeneratedServiceType, except that + it creates the service stub classes. + """ + + _DESCRIPTOR_KEY = 'DESCRIPTOR' + + def __init__(cls, name, bases, dictionary): + """Creates a message service stub class. + + Args: + name: Name of the class (ignored, here). + bases: Base classes of the class being constructed. + dictionary: The class dictionary of the class being constructed. + dictionary[_DESCRIPTOR_KEY] must contain a ServiceDescriptor object + describing this protocol service type. + """ + super(GeneratedServiceStubType, cls).__init__(name, bases, dictionary) + # Don't do anything if this class doesn't have a descriptor. This happens + # when a service stub is subclassed. + if GeneratedServiceStubType._DESCRIPTOR_KEY not in dictionary: + return + descriptor = dictionary[GeneratedServiceStubType._DESCRIPTOR_KEY] + service_stub_builder = _ServiceStubBuilder(descriptor) + service_stub_builder.BuildServiceStub(cls) + + +class _ServiceBuilder(object): + + """This class constructs a protocol service class using a service descriptor. + + Given a service descriptor, this class constructs a class that represents + the specified service descriptor. One service builder instance constructs + exactly one service class. That means all instances of that class share the + same builder. + """ + + def __init__(self, service_descriptor): + """Initializes an instance of the service class builder. + + Args: + service_descriptor: ServiceDescriptor to use when constructing the + service class. + """ + self.descriptor = service_descriptor + + def BuildService(self, cls): + """Constructs the service class. + + Args: + cls: The class that will be constructed. + """ + + # CallMethod needs to operate with an instance of the Service class. This + # internal wrapper function exists only to be able to pass the service + # instance to the method that does the real CallMethod work. + def _WrapCallMethod(srvc, method_descriptor, + rpc_controller, request, callback): + return self._CallMethod(srvc, method_descriptor, + rpc_controller, request, callback) + self.cls = cls + cls.CallMethod = _WrapCallMethod + cls.GetDescriptor = staticmethod(lambda: self.descriptor) + cls.GetDescriptor.__doc__ = "Returns the service descriptor." + cls.GetRequestClass = self._GetRequestClass + cls.GetResponseClass = self._GetResponseClass + for method in self.descriptor.methods: + setattr(cls, method.name, self._GenerateNonImplementedMethod(method)) + + def _CallMethod(self, srvc, method_descriptor, + rpc_controller, request, callback): + """Calls the method described by a given method descriptor. + + Args: + srvc: Instance of the service for which this method is called. + method_descriptor: Descriptor that represent the method to call. + rpc_controller: RPC controller to use for this method's execution. + request: Request protocol message. + callback: A callback to invoke after the method has completed. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'CallMethod() given method descriptor for wrong service type.') + method = getattr(srvc, method_descriptor.name) + return method(rpc_controller, request, callback) + + def _GetRequestClass(self, method_descriptor): + """Returns the class of the request protocol message. + + Args: + method_descriptor: Descriptor of the method for which to return the + request protocol message class. + + Returns: + A class that represents the input protocol message of the specified + method. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'GetRequestClass() given method descriptor for wrong service type.') + return method_descriptor.input_type._concrete_class + + def _GetResponseClass(self, method_descriptor): + """Returns the class of the response protocol message. + + Args: + method_descriptor: Descriptor of the method for which to return the + response protocol message class. + + Returns: + A class that represents the output protocol message of the specified + method. + """ + if method_descriptor.containing_service != self.descriptor: + raise RuntimeError( + 'GetResponseClass() given method descriptor for wrong service type.') + return method_descriptor.output_type._concrete_class + + def _GenerateNonImplementedMethod(self, method): + """Generates and returns a method that can be set for a service methods. + + Args: + method: Descriptor of the service method for which a method is to be + generated. + + Returns: + A method that can be added to the service class. + """ + return lambda inst, rpc_controller, request, callback: ( + self._NonImplementedMethod(method.name, rpc_controller, callback)) + + def _NonImplementedMethod(self, method_name, rpc_controller, callback): + """The body of all methods in the generated service class. + + Args: + method_name: Name of the method being executed. + rpc_controller: RPC controller used to execute this method. + callback: A callback which will be invoked when the method finishes. + """ + rpc_controller.SetFailed('Method %s not implemented.' % method_name) + callback(None) + + +class _ServiceStubBuilder(object): + + """Constructs a protocol service stub class using a service descriptor. + + Given a service descriptor, this class constructs a suitable stub class. + A stub is just a type-safe wrapper around an RpcChannel which emulates a + local implementation of the service. + + One service stub builder instance constructs exactly one class. It means all + instances of that class share the same service stub builder. + """ + + def __init__(self, service_descriptor): + """Initializes an instance of the service stub class builder. + + Args: + service_descriptor: ServiceDescriptor to use when constructing the + stub class. + """ + self.descriptor = service_descriptor + + def BuildServiceStub(self, cls): + """Constructs the stub class. + + Args: + cls: The class that will be constructed. + """ + + def _ServiceStubInit(stub, rpc_channel): + stub.rpc_channel = rpc_channel + self.cls = cls + cls.__init__ = _ServiceStubInit + for method in self.descriptor.methods: + setattr(cls, method.name, self._GenerateStubMethod(method)) + + def _GenerateStubMethod(self, method): + return (lambda inst, rpc_controller, request, callback=None: + self._StubMethod(inst, method, rpc_controller, request, callback)) + + def _StubMethod(self, stub, method_descriptor, + rpc_controller, request, callback): + """The body of all service methods in the generated stub class. + + Args: + stub: Stub instance. + method_descriptor: Descriptor of the invoked method. + rpc_controller: Rpc controller to execute the method. + request: Request protocol message. + callback: A callback to execute when the method finishes. + Returns: + Response message (in case of blocking call). + """ + return stub.rpc_channel.CallMethod( + method_descriptor, rpc_controller, request, + method_descriptor.output_type._concrete_class, callback) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py new file mode 100755 index 000000000..c3a1cf602 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py @@ -0,0 +1,691 @@ +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Contains routines for printing protocol messages in text format.""" + +__author__ = 'kenton@google.com (Kenton Varda)' + +import cStringIO +import re + +from collections import deque +from google.protobuf.internal import type_checkers +from google.protobuf import descriptor + +__all__ = [ 'MessageToString', 'PrintMessage', 'PrintField', + 'PrintFieldValue', 'Merge' ] + + +# Infinity and NaN are not explicitly supported by Python pre-2.6, and +# float('inf') does not work on Windows (pre-2.6). +_INFINITY = 1e10000 # overflows, thus will actually be infinity. +_NAN = _INFINITY * 0 + + +class ParseError(Exception): + """Thrown in case of ASCII parsing error.""" + + +def MessageToString(message, as_utf8=False, as_one_line=False): + out = cStringIO.StringIO() + PrintMessage(message, out, as_utf8=as_utf8, as_one_line=as_one_line) + result = out.getvalue() + out.close() + if as_one_line: + return result.rstrip() + return result + + +def PrintMessage(message, out, indent=0, as_utf8=False, as_one_line=False): + for field, value in message.ListFields(): + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + for element in value: + PrintField(field, element, out, indent, as_utf8, as_one_line) + else: + PrintField(field, value, out, indent, as_utf8, as_one_line) + + +def PrintField(field, value, out, indent=0, as_utf8=False, as_one_line=False): + """Print a single field name/value pair. For repeated fields, the value + should be a single element.""" + + out.write(' ' * indent); + if field.is_extension: + out.write('[') + if (field.containing_type.GetOptions().message_set_wire_format and + field.type == descriptor.FieldDescriptor.TYPE_MESSAGE and + field.message_type == field.extension_scope and + field.label == descriptor.FieldDescriptor.LABEL_OPTIONAL): + out.write(field.message_type.full_name) + else: + out.write(field.full_name) + out.write(']') + elif field.type == descriptor.FieldDescriptor.TYPE_GROUP: + # For groups, use the capitalized name. + out.write(field.message_type.name) + else: + out.write(field.name) + + if field.cpp_type != descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + # The colon is optional in this case, but our cross-language golden files + # don't include it. + out.write(': ') + + PrintFieldValue(field, value, out, indent, as_utf8, as_one_line) + if as_one_line: + out.write(' ') + else: + out.write('\n') + + +def PrintFieldValue(field, value, out, indent=0, + as_utf8=False, as_one_line=False): + """Print a single field value (not including name). For repeated fields, + the value should be a single element.""" + + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + if as_one_line: + out.write(' { ') + PrintMessage(value, out, indent, as_utf8, as_one_line) + out.write('}') + else: + out.write(' {\n') + PrintMessage(value, out, indent + 2, as_utf8, as_one_line) + out.write(' ' * indent + '}') + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_ENUM: + out.write(field.enum_type.values_by_number[value].name) + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_STRING: + out.write('\"') + if type(value) is unicode: + out.write(_CEscape(value.encode('utf-8'), as_utf8)) + else: + out.write(_CEscape(value, as_utf8)) + out.write('\"') + elif field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_BOOL: + if value: + out.write("true") + else: + out.write("false") + else: + out.write(str(value)) + + +def Merge(text, message): + """Merges an ASCII representation of a protocol message into a message. + + Args: + text: Message ASCII representation. + message: A protocol buffer message to merge into. + + Raises: + ParseError: On ASCII parsing problems. + """ + tokenizer = _Tokenizer(text) + while not tokenizer.AtEnd(): + _MergeField(tokenizer, message) + + +def _MergeField(tokenizer, message): + """Merges a single protocol message field into a message. + + Args: + tokenizer: A tokenizer to parse the field name and values. + message: A protocol message to record the data. + + Raises: + ParseError: In case of ASCII parsing problems. + """ + message_descriptor = message.DESCRIPTOR + if tokenizer.TryConsume('['): + name = [tokenizer.ConsumeIdentifier()] + while tokenizer.TryConsume('.'): + name.append(tokenizer.ConsumeIdentifier()) + name = '.'.join(name) + + if not message_descriptor.is_extendable: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" does not have extensions.' % + message_descriptor.full_name) + field = message.Extensions._FindExtensionByName(name) + if not field: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" not registered.' % name) + elif message_descriptor != field.containing_type: + raise tokenizer.ParseErrorPreviousToken( + 'Extension "%s" does not extend message type "%s".' % ( + name, message_descriptor.full_name)) + tokenizer.Consume(']') + else: + name = tokenizer.ConsumeIdentifier() + field = message_descriptor.fields_by_name.get(name, None) + + # Group names are expected to be capitalized as they appear in the + # .proto file, which actually matches their type names, not their field + # names. + if not field: + field = message_descriptor.fields_by_name.get(name.lower(), None) + if field and field.type != descriptor.FieldDescriptor.TYPE_GROUP: + field = None + + if (field and field.type == descriptor.FieldDescriptor.TYPE_GROUP and + field.message_type.name != name): + field = None + + if not field: + raise tokenizer.ParseErrorPreviousToken( + 'Message type "%s" has no field named "%s".' % ( + message_descriptor.full_name, name)) + + if field.cpp_type == descriptor.FieldDescriptor.CPPTYPE_MESSAGE: + tokenizer.TryConsume(':') + + if tokenizer.TryConsume('<'): + end_token = '>' + else: + tokenizer.Consume('{') + end_token = '}' + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + sub_message = message.Extensions[field].add() + else: + sub_message = getattr(message, field.name).add() + else: + if field.is_extension: + sub_message = message.Extensions[field] + else: + sub_message = getattr(message, field.name) + sub_message.SetInParent() + + while not tokenizer.TryConsume(end_token): + if tokenizer.AtEnd(): + raise tokenizer.ParseErrorPreviousToken('Expected "%s".' % (end_token)) + _MergeField(tokenizer, sub_message) + else: + _MergeScalarField(tokenizer, message, field) + + +def _MergeScalarField(tokenizer, message, field): + """Merges a single protocol message scalar field into a message. + + Args: + tokenizer: A tokenizer to parse the field value. + message: A protocol message to record the data. + field: The descriptor of the field to be merged. + + Raises: + ParseError: In case of ASCII parsing problems. + RuntimeError: On runtime errors. + """ + tokenizer.Consume(':') + value = None + + if field.type in (descriptor.FieldDescriptor.TYPE_INT32, + descriptor.FieldDescriptor.TYPE_SINT32, + descriptor.FieldDescriptor.TYPE_SFIXED32): + value = tokenizer.ConsumeInt32() + elif field.type in (descriptor.FieldDescriptor.TYPE_INT64, + descriptor.FieldDescriptor.TYPE_SINT64, + descriptor.FieldDescriptor.TYPE_SFIXED64): + value = tokenizer.ConsumeInt64() + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT32, + descriptor.FieldDescriptor.TYPE_FIXED32): + value = tokenizer.ConsumeUint32() + elif field.type in (descriptor.FieldDescriptor.TYPE_UINT64, + descriptor.FieldDescriptor.TYPE_FIXED64): + value = tokenizer.ConsumeUint64() + elif field.type in (descriptor.FieldDescriptor.TYPE_FLOAT, + descriptor.FieldDescriptor.TYPE_DOUBLE): + value = tokenizer.ConsumeFloat() + elif field.type == descriptor.FieldDescriptor.TYPE_BOOL: + value = tokenizer.ConsumeBool() + elif field.type == descriptor.FieldDescriptor.TYPE_STRING: + value = tokenizer.ConsumeString() + elif field.type == descriptor.FieldDescriptor.TYPE_BYTES: + value = tokenizer.ConsumeByteString() + elif field.type == descriptor.FieldDescriptor.TYPE_ENUM: + # Enum can be specified by a number (the enum value), or by + # a string literal (the enum name). + enum_descriptor = field.enum_type + if tokenizer.LookingAtInteger(): + number = tokenizer.ConsumeInt32() + enum_value = enum_descriptor.values_by_number.get(number, None) + if enum_value is None: + raise tokenizer.ParseErrorPreviousToken( + 'Enum type "%s" has no value with number %d.' % ( + enum_descriptor.full_name, number)) + else: + identifier = tokenizer.ConsumeIdentifier() + enum_value = enum_descriptor.values_by_name.get(identifier, None) + if enum_value is None: + raise tokenizer.ParseErrorPreviousToken( + 'Enum type "%s" has no value named %s.' % ( + enum_descriptor.full_name, identifier)) + value = enum_value.number + else: + raise RuntimeError('Unknown field type %d' % field.type) + + if field.label == descriptor.FieldDescriptor.LABEL_REPEATED: + if field.is_extension: + message.Extensions[field].append(value) + else: + getattr(message, field.name).append(value) + else: + if field.is_extension: + message.Extensions[field] = value + else: + setattr(message, field.name, value) + + +class _Tokenizer(object): + """Protocol buffer ASCII representation tokenizer. + + This class handles the lower level string parsing by splitting it into + meaningful tokens. + + It was directly ported from the Java protocol buffer API. + """ + + _WHITESPACE = re.compile('(\\s|(#.*$))+', re.MULTILINE) + _TOKEN = re.compile( + '[a-zA-Z_][0-9a-zA-Z_+-]*|' # an identifier + '[0-9+-][0-9a-zA-Z_.+-]*|' # a number + '\"([^\"\n\\\\]|\\\\.)*(\"|\\\\?$)|' # a double-quoted string + '\'([^\'\n\\\\]|\\\\.)*(\'|\\\\?$)') # a single-quoted string + _IDENTIFIER = re.compile('\w+') + _INTEGER_CHECKERS = [type_checkers.Uint32ValueChecker(), + type_checkers.Int32ValueChecker(), + type_checkers.Uint64ValueChecker(), + type_checkers.Int64ValueChecker()] + _FLOAT_INFINITY = re.compile('-?inf(inity)?f?', re.IGNORECASE) + _FLOAT_NAN = re.compile("nanf?", re.IGNORECASE) + + def __init__(self, text_message): + self._text_message = text_message + + self._position = 0 + self._line = -1 + self._column = 0 + self._token_start = None + self.token = '' + self._lines = deque(text_message.split('\n')) + self._current_line = '' + self._previous_line = 0 + self._previous_column = 0 + self._SkipWhitespace() + self.NextToken() + + def AtEnd(self): + """Checks the end of the text was reached. + + Returns: + True iff the end was reached. + """ + return self.token == '' + + def _PopLine(self): + while len(self._current_line) <= self._column: + if not self._lines: + self._current_line = '' + return + self._line += 1 + self._column = 0 + self._current_line = self._lines.popleft() + + def _SkipWhitespace(self): + while True: + self._PopLine() + match = self._WHITESPACE.match(self._current_line, self._column) + if not match: + break + length = len(match.group(0)) + self._column += length + + def TryConsume(self, token): + """Tries to consume a given piece of text. + + Args: + token: Text to consume. + + Returns: + True iff the text was consumed. + """ + if self.token == token: + self.NextToken() + return True + return False + + def Consume(self, token): + """Consumes a piece of text. + + Args: + token: Text to consume. + + Raises: + ParseError: If the text couldn't be consumed. + """ + if not self.TryConsume(token): + raise self._ParseError('Expected "%s".' % token) + + def LookingAtInteger(self): + """Checks if the current token is an integer. + + Returns: + True iff the current token is an integer. + """ + if not self.token: + return False + c = self.token[0] + return (c >= '0' and c <= '9') or c == '-' or c == '+' + + def ConsumeIdentifier(self): + """Consumes protocol message field identifier. + + Returns: + Identifier string. + + Raises: + ParseError: If an identifier couldn't be consumed. + """ + result = self.token + if not self._IDENTIFIER.match(result): + raise self._ParseError('Expected identifier.') + self.NextToken() + return result + + def ConsumeInt32(self): + """Consumes a signed 32bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 32bit integer couldn't be consumed. + """ + try: + result = self._ParseInteger(self.token, is_signed=True, is_long=False) + except ValueError, e: + raise self._IntegerParseError(e) + self.NextToken() + return result + + def ConsumeUint32(self): + """Consumes an unsigned 32bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 32bit integer couldn't be consumed. + """ + try: + result = self._ParseInteger(self.token, is_signed=False, is_long=False) + except ValueError, e: + raise self._IntegerParseError(e) + self.NextToken() + return result + + def ConsumeInt64(self): + """Consumes a signed 64bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If a signed 64bit integer couldn't be consumed. + """ + try: + result = self._ParseInteger(self.token, is_signed=True, is_long=True) + except ValueError, e: + raise self._IntegerParseError(e) + self.NextToken() + return result + + def ConsumeUint64(self): + """Consumes an unsigned 64bit integer number. + + Returns: + The integer parsed. + + Raises: + ParseError: If an unsigned 64bit integer couldn't be consumed. + """ + try: + result = self._ParseInteger(self.token, is_signed=False, is_long=True) + except ValueError, e: + raise self._IntegerParseError(e) + self.NextToken() + return result + + def ConsumeFloat(self): + """Consumes an floating point number. + + Returns: + The number parsed. + + Raises: + ParseError: If a floating point number couldn't be consumed. + """ + text = self.token + if self._FLOAT_INFINITY.match(text): + self.NextToken() + if text.startswith('-'): + return -_INFINITY + return _INFINITY + + if self._FLOAT_NAN.match(text): + self.NextToken() + return _NAN + + try: + result = float(text) + except ValueError, e: + raise self._FloatParseError(e) + self.NextToken() + return result + + def ConsumeBool(self): + """Consumes a boolean value. + + Returns: + The bool parsed. + + Raises: + ParseError: If a boolean value couldn't be consumed. + """ + if self.token in ('true', 't', '1'): + self.NextToken() + return True + elif self.token in ('false', 'f', '0'): + self.NextToken() + return False + else: + raise self._ParseError('Expected "true" or "false".') + + def ConsumeString(self): + """Consumes a string value. + + Returns: + The string parsed. + + Raises: + ParseError: If a string value couldn't be consumed. + """ + bytes = self.ConsumeByteString() + try: + return unicode(bytes, 'utf-8') + except UnicodeDecodeError, e: + raise self._StringParseError(e) + + def ConsumeByteString(self): + """Consumes a byte array value. + + Returns: + The array parsed (as a string). + + Raises: + ParseError: If a byte array value couldn't be consumed. + """ + list = [self._ConsumeSingleByteString()] + while len(self.token) > 0 and self.token[0] in ('\'', '"'): + list.append(self._ConsumeSingleByteString()) + return "".join(list) + + def _ConsumeSingleByteString(self): + """Consume one token of a string literal. + + String literals (whether bytes or text) can come in multiple adjacent + tokens which are automatically concatenated, like in C or Python. This + method only consumes one token. + """ + text = self.token + if len(text) < 1 or text[0] not in ('\'', '"'): + raise self._ParseError('Exptected string.') + + if len(text) < 2 or text[-1] != text[0]: + raise self._ParseError('String missing ending quote.') + + try: + result = _CUnescape(text[1:-1]) + except ValueError, e: + raise self._ParseError(str(e)) + self.NextToken() + return result + + def _ParseInteger(self, text, is_signed=False, is_long=False): + """Parses an integer. + + Args: + text: The text to parse. + is_signed: True if a signed integer must be parsed. + is_long: True if a long integer must be parsed. + + Returns: + The integer value. + + Raises: + ValueError: Thrown Iff the text is not a valid integer. + """ + pos = 0 + if text.startswith('-'): + pos += 1 + + base = 10 + if text.startswith('0x', pos) or text.startswith('0X', pos): + base = 16 + elif text.startswith('0', pos): + base = 8 + + # Do the actual parsing. Exception handling is propagated to caller. + result = int(text, base) + + # Check if the integer is sane. Exceptions handled by callers. + checker = self._INTEGER_CHECKERS[2 * int(is_long) + int(is_signed)] + checker.CheckValue(result) + return result + + def ParseErrorPreviousToken(self, message): + """Creates and *returns* a ParseError for the previously read token. + + Args: + message: A message to set for the exception. + + Returns: + A ParseError instance. + """ + return ParseError('%d:%d : %s' % ( + self._previous_line + 1, self._previous_column + 1, message)) + + def _ParseError(self, message): + """Creates and *returns* a ParseError for the current token.""" + return ParseError('%d:%d : %s' % ( + self._line + 1, self._column - len(self.token) + 1, message)) + + def _IntegerParseError(self, e): + return self._ParseError('Couldn\'t parse integer: ' + str(e)) + + def _FloatParseError(self, e): + return self._ParseError('Couldn\'t parse number: ' + str(e)) + + def _StringParseError(self, e): + return self._ParseError('Couldn\'t parse string: ' + str(e)) + + def NextToken(self): + """Reads the next meaningful token.""" + self._previous_line = self._line + self._previous_column = self._column + + self._column += len(self.token) + self._SkipWhitespace() + + if not self._lines and len(self._current_line) <= self._column: + self.token = '' + return + + match = self._TOKEN.match(self._current_line, self._column) + if match: + token = match.group(0) + self.token = token + else: + self.token = self._current_line[self._column] + + +# text.encode('string_escape') does not seem to satisfy our needs as it +# encodes unprintable characters using two-digit hex escapes whereas our +# C++ unescaping function allows hex escapes to be any length. So, +# "\0011".encode('string_escape') ends up being "\\x011", which will be +# decoded in C++ as a single-character string with char code 0x11. +def _CEscape(text, as_utf8): + def escape(c): + o = ord(c) + if o == 10: return r"\n" # optional escape + if o == 13: return r"\r" # optional escape + if o == 9: return r"\t" # optional escape + if o == 39: return r"\'" # optional escape + + if o == 34: return r'\"' # necessary escape + if o == 92: return r"\\" # necessary escape + + # necessary escapes + if not as_utf8 and (o >= 127 or o < 32): return "\\%03o" % o + return c + return "".join([escape(c) for c in text]) + + +_CUNESCAPE_HEX = re.compile('\\\\x([0-9a-fA-F]{2}|[0-9a-fA-F])') + + +def _CUnescape(text): + def ReplaceHex(m): + return chr(int(m.group(0)[2:], 16)) + # This is required because the 'string_escape' encoding doesn't + # allow single-digit hex escapes (like '\xf'). + result = _CUNESCAPE_HEX.sub(ReplaceHex, text) + return result.decode('string_escape') diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/mox.py b/spotify/breakpad/third_party/protobuf/protobuf/python/mox.py new file mode 100755 index 000000000..ce80ba505 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/mox.py @@ -0,0 +1,1401 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is used for testing. The original is at: +# http://code.google.com/p/pymox/ + +"""Mox, an object-mocking framework for Python. + +Mox works in the record-replay-verify paradigm. When you first create +a mock object, it is in record mode. You then programmatically set +the expected behavior of the mock object (what methods are to be +called on it, with what parameters, what they should return, and in +what order). + +Once you have set up the expected mock behavior, you put it in replay +mode. Now the mock responds to method calls just as you told it to. +If an unexpected method (or an expected method with unexpected +parameters) is called, then an exception will be raised. + +Once you are done interacting with the mock, you need to verify that +all the expected interactions occured. (Maybe your code exited +prematurely without calling some cleanup method!) The verify phase +ensures that every expected method was called; otherwise, an exception +will be raised. + +Suggested usage / workflow: + + # Create Mox factory + my_mox = Mox() + + # Create a mock data access object + mock_dao = my_mox.CreateMock(DAOClass) + + # Set up expected behavior + mock_dao.RetrievePersonWithIdentifier('1').AndReturn(person) + mock_dao.DeletePerson(person) + + # Put mocks in replay mode + my_mox.ReplayAll() + + # Inject mock object and run test + controller.SetDao(mock_dao) + controller.DeletePersonById('1') + + # Verify all methods were called as expected + my_mox.VerifyAll() +""" + +from collections import deque +import re +import types +import unittest + +import stubout + +class Error(AssertionError): + """Base exception for this module.""" + + pass + + +class ExpectedMethodCallsError(Error): + """Raised when Verify() is called before all expected methods have been called + """ + + def __init__(self, expected_methods): + """Init exception. + + Args: + # expected_methods: A sequence of MockMethod objects that should have been + # called. + expected_methods: [MockMethod] + + Raises: + ValueError: if expected_methods contains no methods. + """ + + if not expected_methods: + raise ValueError("There must be at least one expected method") + Error.__init__(self) + self._expected_methods = expected_methods + + def __str__(self): + calls = "\n".join(["%3d. %s" % (i, m) + for i, m in enumerate(self._expected_methods)]) + return "Verify: Expected methods never called:\n%s" % (calls,) + + +class UnexpectedMethodCallError(Error): + """Raised when an unexpected method is called. + + This can occur if a method is called with incorrect parameters, or out of the + specified order. + """ + + def __init__(self, unexpected_method, expected): + """Init exception. + + Args: + # unexpected_method: MockMethod that was called but was not at the head of + # the expected_method queue. + # expected: MockMethod or UnorderedGroup the method should have + # been in. + unexpected_method: MockMethod + expected: MockMethod or UnorderedGroup + """ + + Error.__init__(self) + self._unexpected_method = unexpected_method + self._expected = expected + + def __str__(self): + return "Unexpected method call: %s. Expecting: %s" % \ + (self._unexpected_method, self._expected) + + +class UnknownMethodCallError(Error): + """Raised if an unknown method is requested of the mock object.""" + + def __init__(self, unknown_method_name): + """Init exception. + + Args: + # unknown_method_name: Method call that is not part of the mocked class's + # public interface. + unknown_method_name: str + """ + + Error.__init__(self) + self._unknown_method_name = unknown_method_name + + def __str__(self): + return "Method called is not a member of the object: %s" % \ + self._unknown_method_name + + +class Mox(object): + """Mox: a factory for creating mock objects.""" + + # A list of types that should be stubbed out with MockObjects (as + # opposed to MockAnythings). + _USE_MOCK_OBJECT = [types.ClassType, types.InstanceType, types.ModuleType, + types.ObjectType, types.TypeType] + + def __init__(self): + """Initialize a new Mox.""" + + self._mock_objects = [] + self.stubs = stubout.StubOutForTesting() + + def CreateMock(self, class_to_mock): + """Create a new mock object. + + Args: + # class_to_mock: the class to be mocked + class_to_mock: class + + Returns: + MockObject that can be used as the class_to_mock would be. + """ + + new_mock = MockObject(class_to_mock) + self._mock_objects.append(new_mock) + return new_mock + + def CreateMockAnything(self): + """Create a mock that will accept any method calls. + + This does not enforce an interface. + """ + + new_mock = MockAnything() + self._mock_objects.append(new_mock) + return new_mock + + def ReplayAll(self): + """Set all mock objects to replay mode.""" + + for mock_obj in self._mock_objects: + mock_obj._Replay() + + + def VerifyAll(self): + """Call verify on all mock objects created.""" + + for mock_obj in self._mock_objects: + mock_obj._Verify() + + def ResetAll(self): + """Call reset on all mock objects. This does not unset stubs.""" + + for mock_obj in self._mock_objects: + mock_obj._Reset() + + def StubOutWithMock(self, obj, attr_name, use_mock_anything=False): + """Replace a method, attribute, etc. with a Mock. + + This will replace a class or module with a MockObject, and everything else + (method, function, etc) with a MockAnything. This can be overridden to + always use a MockAnything by setting use_mock_anything to True. + + Args: + obj: A Python object (class, module, instance, callable). + attr_name: str. The name of the attribute to replace with a mock. + use_mock_anything: bool. True if a MockAnything should be used regardless + of the type of attribute. + """ + + attr_to_replace = getattr(obj, attr_name) + if type(attr_to_replace) in self._USE_MOCK_OBJECT and not use_mock_anything: + stub = self.CreateMock(attr_to_replace) + else: + stub = self.CreateMockAnything() + + self.stubs.Set(obj, attr_name, stub) + + def UnsetStubs(self): + """Restore stubs to their original state.""" + + self.stubs.UnsetAll() + +def Replay(*args): + """Put mocks into Replay mode. + + Args: + # args is any number of mocks to put into replay mode. + """ + + for mock in args: + mock._Replay() + + +def Verify(*args): + """Verify mocks. + + Args: + # args is any number of mocks to be verified. + """ + + for mock in args: + mock._Verify() + + +def Reset(*args): + """Reset mocks. + + Args: + # args is any number of mocks to be reset. + """ + + for mock in args: + mock._Reset() + + +class MockAnything: + """A mock that can be used to mock anything. + + This is helpful for mocking classes that do not provide a public interface. + """ + + def __init__(self): + """ """ + self._Reset() + + def __getattr__(self, method_name): + """Intercept method calls on this object. + + A new MockMethod is returned that is aware of the MockAnything's + state (record or replay). The call will be recorded or replayed + by the MockMethod's __call__. + + Args: + # method name: the name of the method being called. + method_name: str + + Returns: + A new MockMethod aware of MockAnything's state (record or replay). + """ + + return self._CreateMockMethod(method_name) + + def _CreateMockMethod(self, method_name): + """Create a new mock method call and return it. + + Args: + # method name: the name of the method being called. + method_name: str + + Returns: + A new MockMethod aware of MockAnything's state (record or replay). + """ + + return MockMethod(method_name, self._expected_calls_queue, + self._replay_mode) + + def __nonzero__(self): + """Return 1 for nonzero so the mock can be used as a conditional.""" + + return 1 + + def __eq__(self, rhs): + """Provide custom logic to compare objects.""" + + return (isinstance(rhs, MockAnything) and + self._replay_mode == rhs._replay_mode and + self._expected_calls_queue == rhs._expected_calls_queue) + + def __ne__(self, rhs): + """Provide custom logic to compare objects.""" + + return not self == rhs + + def _Replay(self): + """Start replaying expected method calls.""" + + self._replay_mode = True + + def _Verify(self): + """Verify that all of the expected calls have been made. + + Raises: + ExpectedMethodCallsError: if there are still more method calls in the + expected queue. + """ + + # If the list of expected calls is not empty, raise an exception + if self._expected_calls_queue: + # The last MultipleTimesGroup is not popped from the queue. + if (len(self._expected_calls_queue) == 1 and + isinstance(self._expected_calls_queue[0], MultipleTimesGroup) and + self._expected_calls_queue[0].IsSatisfied()): + pass + else: + raise ExpectedMethodCallsError(self._expected_calls_queue) + + def _Reset(self): + """Reset the state of this mock to record mode with an empty queue.""" + + # Maintain a list of method calls we are expecting + self._expected_calls_queue = deque() + + # Make sure we are in setup mode, not replay mode + self._replay_mode = False + + +class MockObject(MockAnything, object): + """A mock object that simulates the public/protected interface of a class.""" + + def __init__(self, class_to_mock): + """Initialize a mock object. + + This determines the methods and properties of the class and stores them. + + Args: + # class_to_mock: class to be mocked + class_to_mock: class + """ + + # This is used to hack around the mixin/inheritance of MockAnything, which + # is not a proper object (it can be anything. :-) + MockAnything.__dict__['__init__'](self) + + # Get a list of all the public and special methods we should mock. + self._known_methods = set() + self._known_vars = set() + self._class_to_mock = class_to_mock + for method in dir(class_to_mock): + if callable(getattr(class_to_mock, method)): + self._known_methods.add(method) + else: + self._known_vars.add(method) + + def __getattr__(self, name): + """Intercept attribute request on this object. + + If the attribute is a public class variable, it will be returned and not + recorded as a call. + + If the attribute is not a variable, it is handled like a method + call. The method name is checked against the set of mockable + methods, and a new MockMethod is returned that is aware of the + MockObject's state (record or replay). The call will be recorded + or replayed by the MockMethod's __call__. + + Args: + # name: the name of the attribute being requested. + name: str + + Returns: + Either a class variable or a new MockMethod that is aware of the state + of the mock (record or replay). + + Raises: + UnknownMethodCallError if the MockObject does not mock the requested + method. + """ + + if name in self._known_vars: + return getattr(self._class_to_mock, name) + + if name in self._known_methods: + return self._CreateMockMethod(name) + + raise UnknownMethodCallError(name) + + def __eq__(self, rhs): + """Provide custom logic to compare objects.""" + + return (isinstance(rhs, MockObject) and + self._class_to_mock == rhs._class_to_mock and + self._replay_mode == rhs._replay_mode and + self._expected_calls_queue == rhs._expected_calls_queue) + + def __setitem__(self, key, value): + """Provide custom logic for mocking classes that support item assignment. + + Args: + key: Key to set the value for. + value: Value to set. + + Returns: + Expected return value in replay mode. A MockMethod object for the + __setitem__ method that has already been called if not in replay mode. + + Raises: + TypeError if the underlying class does not support item assignment. + UnexpectedMethodCallError if the object does not expect the call to + __setitem__. + + """ + setitem = self._class_to_mock.__dict__.get('__setitem__', None) + + # Verify the class supports item assignment. + if setitem is None: + raise TypeError('object does not support item assignment') + + # If we are in replay mode then simply call the mock __setitem__ method. + if self._replay_mode: + return MockMethod('__setitem__', self._expected_calls_queue, + self._replay_mode)(key, value) + + + # Otherwise, create a mock method __setitem__. + return self._CreateMockMethod('__setitem__')(key, value) + + def __getitem__(self, key): + """Provide custom logic for mocking classes that are subscriptable. + + Args: + key: Key to return the value for. + + Returns: + Expected return value in replay mode. A MockMethod object for the + __getitem__ method that has already been called if not in replay mode. + + Raises: + TypeError if the underlying class is not subscriptable. + UnexpectedMethodCallError if the object does not expect the call to + __setitem__. + + """ + getitem = self._class_to_mock.__dict__.get('__getitem__', None) + + # Verify the class supports item assignment. + if getitem is None: + raise TypeError('unsubscriptable object') + + # If we are in replay mode then simply call the mock __getitem__ method. + if self._replay_mode: + return MockMethod('__getitem__', self._expected_calls_queue, + self._replay_mode)(key) + + + # Otherwise, create a mock method __getitem__. + return self._CreateMockMethod('__getitem__')(key) + + def __call__(self, *params, **named_params): + """Provide custom logic for mocking classes that are callable.""" + + # Verify the class we are mocking is callable + callable = self._class_to_mock.__dict__.get('__call__', None) + if callable is None: + raise TypeError('Not callable') + + # Because the call is happening directly on this object instead of a method, + # the call on the mock method is made right here + mock_method = self._CreateMockMethod('__call__') + return mock_method(*params, **named_params) + + @property + def __class__(self): + """Return the class that is being mocked.""" + + return self._class_to_mock + + +class MockMethod(object): + """Callable mock method. + + A MockMethod should act exactly like the method it mocks, accepting parameters + and returning a value, or throwing an exception (as specified). When this + method is called, it can optionally verify whether the called method (name and + signature) matches the expected method. + """ + + def __init__(self, method_name, call_queue, replay_mode): + """Construct a new mock method. + + Args: + # method_name: the name of the method + # call_queue: deque of calls, verify this call against the head, or add + # this call to the queue. + # replay_mode: False if we are recording, True if we are verifying calls + # against the call queue. + method_name: str + call_queue: list or deque + replay_mode: bool + """ + + self._name = method_name + self._call_queue = call_queue + if not isinstance(call_queue, deque): + self._call_queue = deque(self._call_queue) + self._replay_mode = replay_mode + + self._params = None + self._named_params = None + self._return_value = None + self._exception = None + self._side_effects = None + + def __call__(self, *params, **named_params): + """Log parameters and return the specified return value. + + If the Mock(Anything/Object) associated with this call is in record mode, + this MockMethod will be pushed onto the expected call queue. If the mock + is in replay mode, this will pop a MockMethod off the top of the queue and + verify this call is equal to the expected call. + + Raises: + UnexpectedMethodCall if this call is supposed to match an expected method + call and it does not. + """ + + self._params = params + self._named_params = named_params + + if not self._replay_mode: + self._call_queue.append(self) + return self + + expected_method = self._VerifyMethodCall() + + if expected_method._side_effects: + expected_method._side_effects(*params, **named_params) + + if expected_method._exception: + raise expected_method._exception + + return expected_method._return_value + + def __getattr__(self, name): + """Raise an AttributeError with a helpful message.""" + + raise AttributeError('MockMethod has no attribute "%s". ' + 'Did you remember to put your mocks in replay mode?' % name) + + def _PopNextMethod(self): + """Pop the next method from our call queue.""" + try: + return self._call_queue.popleft() + except IndexError: + raise UnexpectedMethodCallError(self, None) + + def _VerifyMethodCall(self): + """Verify the called method is expected. + + This can be an ordered method, or part of an unordered set. + + Returns: + The expected mock method. + + Raises: + UnexpectedMethodCall if the method called was not expected. + """ + + expected = self._PopNextMethod() + + # Loop here, because we might have a MethodGroup followed by another + # group. + while isinstance(expected, MethodGroup): + expected, method = expected.MethodCalled(self) + if method is not None: + return method + + # This is a mock method, so just check equality. + if expected != self: + raise UnexpectedMethodCallError(self, expected) + + return expected + + def __str__(self): + params = ', '.join( + [repr(p) for p in self._params or []] + + ['%s=%r' % x for x in sorted((self._named_params or {}).items())]) + desc = "%s(%s) -> %r" % (self._name, params, self._return_value) + return desc + + def __eq__(self, rhs): + """Test whether this MockMethod is equivalent to another MockMethod. + + Args: + # rhs: the right hand side of the test + rhs: MockMethod + """ + + return (isinstance(rhs, MockMethod) and + self._name == rhs._name and + self._params == rhs._params and + self._named_params == rhs._named_params) + + def __ne__(self, rhs): + """Test whether this MockMethod is not equivalent to another MockMethod. + + Args: + # rhs: the right hand side of the test + rhs: MockMethod + """ + + return not self == rhs + + def GetPossibleGroup(self): + """Returns a possible group from the end of the call queue or None if no + other methods are on the stack. + """ + + # Remove this method from the tail of the queue so we can add it to a group. + this_method = self._call_queue.pop() + assert this_method == self + + # Determine if the tail of the queue is a group, or just a regular ordered + # mock method. + group = None + try: + group = self._call_queue[-1] + except IndexError: + pass + + return group + + def _CheckAndCreateNewGroup(self, group_name, group_class): + """Checks if the last method (a possible group) is an instance of our + group_class. Adds the current method to this group or creates a new one. + + Args: + + group_name: the name of the group. + group_class: the class used to create instance of this new group + """ + group = self.GetPossibleGroup() + + # If this is a group, and it is the correct group, add the method. + if isinstance(group, group_class) and group.group_name() == group_name: + group.AddMethod(self) + return self + + # Create a new group and add the method. + new_group = group_class(group_name) + new_group.AddMethod(self) + self._call_queue.append(new_group) + return self + + def InAnyOrder(self, group_name="default"): + """Move this method into a group of unordered calls. + + A group of unordered calls must be defined together, and must be executed + in full before the next expected method can be called. There can be + multiple groups that are expected serially, if they are given + different group names. The same group name can be reused if there is a + standard method call, or a group with a different name, spliced between + usages. + + Args: + group_name: the name of the unordered group. + + Returns: + self + """ + return self._CheckAndCreateNewGroup(group_name, UnorderedGroup) + + def MultipleTimes(self, group_name="default"): + """Move this method into group of calls which may be called multiple times. + + A group of repeating calls must be defined together, and must be executed in + full before the next expected mehtod can be called. + + Args: + group_name: the name of the unordered group. + + Returns: + self + """ + return self._CheckAndCreateNewGroup(group_name, MultipleTimesGroup) + + def AndReturn(self, return_value): + """Set the value to return when this method is called. + + Args: + # return_value can be anything. + """ + + self._return_value = return_value + return return_value + + def AndRaise(self, exception): + """Set the exception to raise when this method is called. + + Args: + # exception: the exception to raise when this method is called. + exception: Exception + """ + + self._exception = exception + + def WithSideEffects(self, side_effects): + """Set the side effects that are simulated when this method is called. + + Args: + side_effects: A callable which modifies the parameters or other relevant + state which a given test case depends on. + + Returns: + Self for chaining with AndReturn and AndRaise. + """ + self._side_effects = side_effects + return self + +class Comparator: + """Base class for all Mox comparators. + + A Comparator can be used as a parameter to a mocked method when the exact + value is not known. For example, the code you are testing might build up a + long SQL string that is passed to your mock DAO. You're only interested that + the IN clause contains the proper primary keys, so you can set your mock + up as follows: + + mock_dao.RunQuery(StrContains('IN (1, 2, 4, 5)')).AndReturn(mock_result) + + Now whatever query is passed in must contain the string 'IN (1, 2, 4, 5)'. + + A Comparator may replace one or more parameters, for example: + # return at most 10 rows + mock_dao.RunQuery(StrContains('SELECT'), 10) + + or + + # Return some non-deterministic number of rows + mock_dao.RunQuery(StrContains('SELECT'), IsA(int)) + """ + + def equals(self, rhs): + """Special equals method that all comparators must implement. + + Args: + rhs: any python object + """ + + raise NotImplementedError, 'method must be implemented by a subclass.' + + def __eq__(self, rhs): + return self.equals(rhs) + + def __ne__(self, rhs): + return not self.equals(rhs) + + +class IsA(Comparator): + """This class wraps a basic Python type or class. It is used to verify + that a parameter is of the given type or class. + + Example: + mock_dao.Connect(IsA(DbConnectInfo)) + """ + + def __init__(self, class_name): + """Initialize IsA + + Args: + class_name: basic python type or a class + """ + + self._class_name = class_name + + def equals(self, rhs): + """Check to see if the RHS is an instance of class_name. + + Args: + # rhs: the right hand side of the test + rhs: object + + Returns: + bool + """ + + try: + return isinstance(rhs, self._class_name) + except TypeError: + # Check raw types if there was a type error. This is helpful for + # things like cStringIO.StringIO. + return type(rhs) == type(self._class_name) + + def __repr__(self): + return str(self._class_name) + +class IsAlmost(Comparator): + """Comparison class used to check whether a parameter is nearly equal + to a given value. Generally useful for floating point numbers. + + Example mock_dao.SetTimeout((IsAlmost(3.9))) + """ + + def __init__(self, float_value, places=7): + """Initialize IsAlmost. + + Args: + float_value: The value for making the comparison. + places: The number of decimal places to round to. + """ + + self._float_value = float_value + self._places = places + + def equals(self, rhs): + """Check to see if RHS is almost equal to float_value + + Args: + rhs: the value to compare to float_value + + Returns: + bool + """ + + try: + return round(rhs-self._float_value, self._places) == 0 + except TypeError: + # This is probably because either float_value or rhs is not a number. + return False + + def __repr__(self): + return str(self._float_value) + +class StrContains(Comparator): + """Comparison class used to check whether a substring exists in a + string parameter. This can be useful in mocking a database with SQL + passed in as a string parameter, for example. + + Example: + mock_dao.RunQuery(StrContains('IN (1, 2, 4, 5)')).AndReturn(mock_result) + """ + + def __init__(self, search_string): + """Initialize. + + Args: + # search_string: the string you are searching for + search_string: str + """ + + self._search_string = search_string + + def equals(self, rhs): + """Check to see if the search_string is contained in the rhs string. + + Args: + # rhs: the right hand side of the test + rhs: object + + Returns: + bool + """ + + try: + return rhs.find(self._search_string) > -1 + except Exception: + return False + + def __repr__(self): + return '' % self._search_string + + +class Regex(Comparator): + """Checks if a string matches a regular expression. + + This uses a given regular expression to determine equality. + """ + + def __init__(self, pattern, flags=0): + """Initialize. + + Args: + # pattern is the regular expression to search for + pattern: str + # flags passed to re.compile function as the second argument + flags: int + """ + + self.regex = re.compile(pattern, flags=flags) + + def equals(self, rhs): + """Check to see if rhs matches regular expression pattern. + + Returns: + bool + """ + + return self.regex.search(rhs) is not None + + def __repr__(self): + s = '' % self._key + + +class ContainsKeyValue(Comparator): + """Checks whether a key/value pair is in a dict parameter. + + Example: + mock_dao.UpdateUsers(ContainsKeyValue('stevepm', stevepm_user_info)) + """ + + def __init__(self, key, value): + """Initialize. + + Args: + # key: a key in a dict + # value: the corresponding value + """ + + self._key = key + self._value = value + + def equals(self, rhs): + """Check whether the given key/value pair is in the rhs dict. + + Returns: + bool + """ + + try: + return rhs[self._key] == self._value + except Exception: + return False + + def __repr__(self): + return '' % (self._key, self._value) + + +class SameElementsAs(Comparator): + """Checks whether iterables contain the same elements (ignoring order). + + Example: + mock_dao.ProcessUsers(SameElementsAs('stevepm', 'salomaki')) + """ + + def __init__(self, expected_seq): + """Initialize. + + Args: + expected_seq: a sequence + """ + + self._expected_seq = expected_seq + + def equals(self, actual_seq): + """Check to see whether actual_seq has same elements as expected_seq. + + Args: + actual_seq: sequence + + Returns: + bool + """ + + try: + expected = dict([(element, None) for element in self._expected_seq]) + actual = dict([(element, None) for element in actual_seq]) + except TypeError: + # Fall back to slower list-compare if any of the objects are unhashable. + expected = list(self._expected_seq) + actual = list(actual_seq) + expected.sort() + actual.sort() + return expected == actual + + def __repr__(self): + return '' % self._expected_seq + + +class And(Comparator): + """Evaluates one or more Comparators on RHS and returns an AND of the results. + """ + + def __init__(self, *args): + """Initialize. + + Args: + *args: One or more Comparator + """ + + self._comparators = args + + def equals(self, rhs): + """Checks whether all Comparators are equal to rhs. + + Args: + # rhs: can be anything + + Returns: + bool + """ + + for comparator in self._comparators: + if not comparator.equals(rhs): + return False + + return True + + def __repr__(self): + return '' % str(self._comparators) + + +class Or(Comparator): + """Evaluates one or more Comparators on RHS and returns an OR of the results. + """ + + def __init__(self, *args): + """Initialize. + + Args: + *args: One or more Mox comparators + """ + + self._comparators = args + + def equals(self, rhs): + """Checks whether any Comparator is equal to rhs. + + Args: + # rhs: can be anything + + Returns: + bool + """ + + for comparator in self._comparators: + if comparator.equals(rhs): + return True + + return False + + def __repr__(self): + return '' % str(self._comparators) + + +class Func(Comparator): + """Call a function that should verify the parameter passed in is correct. + + You may need the ability to perform more advanced operations on the parameter + in order to validate it. You can use this to have a callable validate any + parameter. The callable should return either True or False. + + + Example: + + def myParamValidator(param): + # Advanced logic here + return True + + mock_dao.DoSomething(Func(myParamValidator), true) + """ + + def __init__(self, func): + """Initialize. + + Args: + func: callable that takes one parameter and returns a bool + """ + + self._func = func + + def equals(self, rhs): + """Test whether rhs passes the function test. + + rhs is passed into func. + + Args: + rhs: any python object + + Returns: + the result of func(rhs) + """ + + return self._func(rhs) + + def __repr__(self): + return str(self._func) + + +class IgnoreArg(Comparator): + """Ignore an argument. + + This can be used when we don't care about an argument of a method call. + + Example: + # Check if CastMagic is called with 3 as first arg and 'disappear' as third. + mymock.CastMagic(3, IgnoreArg(), 'disappear') + """ + + def equals(self, unused_rhs): + """Ignores arguments and returns True. + + Args: + unused_rhs: any python object + + Returns: + always returns True + """ + + return True + + def __repr__(self): + return '' + + +class MethodGroup(object): + """Base class containing common behaviour for MethodGroups.""" + + def __init__(self, group_name): + self._group_name = group_name + + def group_name(self): + return self._group_name + + def __str__(self): + return '<%s "%s">' % (self.__class__.__name__, self._group_name) + + def AddMethod(self, mock_method): + raise NotImplementedError + + def MethodCalled(self, mock_method): + raise NotImplementedError + + def IsSatisfied(self): + raise NotImplementedError + +class UnorderedGroup(MethodGroup): + """UnorderedGroup holds a set of method calls that may occur in any order. + + This construct is helpful for non-deterministic events, such as iterating + over the keys of a dict. + """ + + def __init__(self, group_name): + super(UnorderedGroup, self).__init__(group_name) + self._methods = [] + + def AddMethod(self, mock_method): + """Add a method to this group. + + Args: + mock_method: A mock method to be added to this group. + """ + + self._methods.append(mock_method) + + def MethodCalled(self, mock_method): + """Remove a method call from the group. + + If the method is not in the set, an UnexpectedMethodCallError will be + raised. + + Args: + mock_method: a mock method that should be equal to a method in the group. + + Returns: + The mock method from the group + + Raises: + UnexpectedMethodCallError if the mock_method was not in the group. + """ + + # Check to see if this method exists, and if so, remove it from the set + # and return it. + for method in self._methods: + if method == mock_method: + # Remove the called mock_method instead of the method in the group. + # The called method will match any comparators when equality is checked + # during removal. The method in the group could pass a comparator to + # another comparator during the equality check. + self._methods.remove(mock_method) + + # If this group is not empty, put it back at the head of the queue. + if not self.IsSatisfied(): + mock_method._call_queue.appendleft(self) + + return self, method + + raise UnexpectedMethodCallError(mock_method, self) + + def IsSatisfied(self): + """Return True if there are not any methods in this group.""" + + return len(self._methods) == 0 + + +class MultipleTimesGroup(MethodGroup): + """MultipleTimesGroup holds methods that may be called any number of times. + + Note: Each method must be called at least once. + + This is helpful, if you don't know or care how many times a method is called. + """ + + def __init__(self, group_name): + super(MultipleTimesGroup, self).__init__(group_name) + self._methods = set() + self._methods_called = set() + + def AddMethod(self, mock_method): + """Add a method to this group. + + Args: + mock_method: A mock method to be added to this group. + """ + + self._methods.add(mock_method) + + def MethodCalled(self, mock_method): + """Remove a method call from the group. + + If the method is not in the set, an UnexpectedMethodCallError will be + raised. + + Args: + mock_method: a mock method that should be equal to a method in the group. + + Returns: + The mock method from the group + + Raises: + UnexpectedMethodCallError if the mock_method was not in the group. + """ + + # Check to see if this method exists, and if so add it to the set of + # called methods. + + for method in self._methods: + if method == mock_method: + self._methods_called.add(mock_method) + # Always put this group back on top of the queue, because we don't know + # when we are done. + mock_method._call_queue.appendleft(self) + return self, method + + if self.IsSatisfied(): + next_method = mock_method._PopNextMethod(); + return next_method, None + else: + raise UnexpectedMethodCallError(mock_method, self) + + def IsSatisfied(self): + """Return True if all methods in this group are called at least once.""" + # NOTE(psycho): We can't use the simple set difference here because we want + # to match different parameters which are considered the same e.g. IsA(str) + # and some string. This solution is O(n^2) but n should be small. + tmp = self._methods.copy() + for called in self._methods_called: + for expected in tmp: + if called == expected: + tmp.remove(expected) + if not tmp: + return True + break + return False + + +class MoxMetaTestBase(type): + """Metaclass to add mox cleanup and verification to every test. + + As the mox unit testing class is being constructed (MoxTestBase or a + subclass), this metaclass will modify all test functions to call the + CleanUpMox method of the test class after they finish. This means that + unstubbing and verifying will happen for every test with no additional code, + and any failures will result in test failures as opposed to errors. + """ + + def __init__(cls, name, bases, d): + type.__init__(cls, name, bases, d) + + # also get all the attributes from the base classes to account + # for a case when test class is not the immediate child of MoxTestBase + for base in bases: + for attr_name in dir(base): + d[attr_name] = getattr(base, attr_name) + + for func_name, func in d.items(): + if func_name.startswith('test') and callable(func): + setattr(cls, func_name, MoxMetaTestBase.CleanUpTest(cls, func)) + + @staticmethod + def CleanUpTest(cls, func): + """Adds Mox cleanup code to any MoxTestBase method. + + Always unsets stubs after a test. Will verify all mocks for tests that + otherwise pass. + + Args: + cls: MoxTestBase or subclass; the class whose test method we are altering. + func: method; the method of the MoxTestBase test class we wish to alter. + + Returns: + The modified method. + """ + def new_method(self, *args, **kwargs): + mox_obj = getattr(self, 'mox', None) + cleanup_mox = False + if mox_obj and isinstance(mox_obj, Mox): + cleanup_mox = True + try: + func(self, *args, **kwargs) + finally: + if cleanup_mox: + mox_obj.UnsetStubs() + if cleanup_mox: + mox_obj.VerifyAll() + new_method.__name__ = func.__name__ + new_method.__doc__ = func.__doc__ + new_method.__module__ = func.__module__ + return new_method + + +class MoxTestBase(unittest.TestCase): + """Convenience test class to make stubbing easier. + + Sets up a "mox" attribute which is an instance of Mox - any mox tests will + want this. Also automatically unsets any stubs and verifies that all mock + methods have been called at the end of each test, eliminating boilerplate + code. + """ + + __metaclass__ = MoxMetaTestBase + + def setUp(self): + self.mox = Mox() diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/setup.py b/spotify/breakpad/third_party/protobuf/protobuf/python/setup.py new file mode 100755 index 000000000..7d9714ec5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/setup.py @@ -0,0 +1,152 @@ +#! /usr/bin/python +# +# See README for usage instructions. + +# We must use setuptools, not distutils, because we need to use the +# namespace_packages option for the "google" package. +from ez_setup import use_setuptools +use_setuptools() + +from setuptools import setup, Extension +from distutils.spawn import find_executable +import sys +import os +import subprocess + +maintainer_email = "protobuf@googlegroups.com" + +# Find the Protocol Compiler. +if os.path.exists("../src/protoc"): + protoc = "../src/protoc" +elif os.path.exists("../src/protoc.exe"): + protoc = "../src/protoc.exe" +elif os.path.exists("../vsprojects/Debug/protoc.exe"): + protoc = "../vsprojects/Debug/protoc.exe" +elif os.path.exists("../vsprojects/Release/protoc.exe"): + protoc = "../vsprojects/Release/protoc.exe" +else: + protoc = find_executable("protoc") + +def generate_proto(source): + """Invokes the Protocol Compiler to generate a _pb2.py from the given + .proto file. Does nothing if the output already exists and is newer than + the input.""" + + output = source.replace(".proto", "_pb2.py").replace("../src/", "") + + if not os.path.exists(source): + print "Can't find required file: " + source + sys.exit(-1) + + if (not os.path.exists(output) or + (os.path.exists(source) and + os.path.getmtime(source) > os.path.getmtime(output))): + print "Generating %s..." % output + + if protoc == None: + sys.stderr.write( + "protoc is not installed nor found in ../src. Please compile it " + "or install the binary package.\n") + sys.exit(-1) + + protoc_command = [ protoc, "-I../src", "-I.", "--python_out=.", source ] + if subprocess.call(protoc_command) != 0: + sys.exit(-1) + +def MakeTestSuite(): + # This is apparently needed on some systems to make sure that the tests + # work even if a previous version is already installed. + if 'google' in sys.modules: + del sys.modules['google'] + + generate_proto("../src/google/protobuf/unittest.proto") + generate_proto("../src/google/protobuf/unittest_custom_options.proto") + generate_proto("../src/google/protobuf/unittest_import.proto") + generate_proto("../src/google/protobuf/unittest_mset.proto") + generate_proto("../src/google/protobuf/unittest_no_generic_services.proto") + generate_proto("google/protobuf/internal/more_extensions.proto") + generate_proto("google/protobuf/internal/more_messages.proto") + + import unittest + import google.protobuf.internal.generator_test as generator_test + import google.protobuf.internal.descriptor_test as descriptor_test + import google.protobuf.internal.reflection_test as reflection_test + import google.protobuf.internal.service_reflection_test \ + as service_reflection_test + import google.protobuf.internal.text_format_test as text_format_test + import google.protobuf.internal.wire_format_test as wire_format_test + + loader = unittest.defaultTestLoader + suite = unittest.TestSuite() + for test in [ generator_test, + descriptor_test, + reflection_test, + service_reflection_test, + text_format_test, + wire_format_test ]: + suite.addTest(loader.loadTestsFromModule(test)) + + return suite + +if __name__ == '__main__': + # TODO(kenton): Integrate this into setuptools somehow? + if len(sys.argv) >= 2 and sys.argv[1] == "clean": + # Delete generated _pb2.py files and .pyc files in the code tree. + for (dirpath, dirnames, filenames) in os.walk("."): + for filename in filenames: + filepath = os.path.join(dirpath, filename) + if filepath.endswith("_pb2.py") or filepath.endswith(".pyc") or \ + filepath.endswith(".so") or filepath.endswith(".o"): + os.remove(filepath) + else: + # Generate necessary .proto file if it doesn't exist. + # TODO(kenton): Maybe we should hook this into a distutils command? + generate_proto("../src/google/protobuf/descriptor.proto") + generate_proto("../src/google/protobuf/compiler/plugin.proto") + + ext_module_list = [] + + # C++ implementation extension + if os.getenv("PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION", "python") == "cpp": + print "Using EXPERIMENTAL C++ Implmenetation." + ext_module_list.append(Extension( + "google.protobuf.internal._net_proto2___python", + [ "google/protobuf/pyext/python_descriptor.cc", + "google/protobuf/pyext/python_protobuf.cc", + "google/protobuf/pyext/python-proto2.cc" ], + include_dirs = [ "." ], + libraries = [ "protobuf" ])) + + setup(name = 'protobuf', + version = '2.4.2-pre', + packages = [ 'google' ], + namespace_packages = [ 'google' ], + test_suite = 'setup.MakeTestSuite', + # Must list modules explicitly so that we don't install tests. + py_modules = [ + 'google.protobuf.internal.api_implementation', + 'google.protobuf.internal.containers', + 'google.protobuf.internal.cpp_message', + 'google.protobuf.internal.decoder', + 'google.protobuf.internal.encoder', + 'google.protobuf.internal.message_listener', + 'google.protobuf.internal.python_message', + 'google.protobuf.internal.type_checkers', + 'google.protobuf.internal.wire_format', + 'google.protobuf.descriptor', + 'google.protobuf.descriptor_pb2', + 'google.protobuf.compiler.plugin_pb2', + 'google.protobuf.message', + 'google.protobuf.reflection', + 'google.protobuf.service', + 'google.protobuf.service_reflection', + 'google.protobuf.text_format' ], + ext_modules = ext_module_list, + url = 'http://code.google.com/p/protobuf/', + maintainer = maintainer_email, + maintainer_email = 'protobuf@googlegroups.com', + license = 'New BSD License', + description = 'Protocol Buffers', + long_description = + "Protocol Buffers are Google's data interchange format.", + ) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py b/spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py new file mode 100755 index 000000000..aee4f2da2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py @@ -0,0 +1,140 @@ +#!/usr/bin/python2.4 +# +# Copyright 2008 Google Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is used for testing. The original is at: +# http://code.google.com/p/pymox/ + +class StubOutForTesting: + """Sample Usage: + You want os.path.exists() to always return true during testing. + + stubs = StubOutForTesting() + stubs.Set(os.path, 'exists', lambda x: 1) + ... + stubs.UnsetAll() + + The above changes os.path.exists into a lambda that returns 1. Once + the ... part of the code finishes, the UnsetAll() looks up the old value + of os.path.exists and restores it. + + """ + def __init__(self): + self.cache = [] + self.stubs = [] + + def __del__(self): + self.SmartUnsetAll() + self.UnsetAll() + + def SmartSet(self, obj, attr_name, new_attr): + """Replace obj.attr_name with new_attr. This method is smart and works + at the module, class, and instance level while preserving proper + inheritance. It will not stub out C types however unless that has been + explicitly allowed by the type. + + This method supports the case where attr_name is a staticmethod or a + classmethod of obj. + + Notes: + - If obj is an instance, then it is its class that will actually be + stubbed. Note that the method Set() does not do that: if obj is + an instance, it (and not its class) will be stubbed. + - The stubbing is using the builtin getattr and setattr. So, the __get__ + and __set__ will be called when stubbing (TODO: A better idea would + probably be to manipulate obj.__dict__ instead of getattr() and + setattr()). + + Raises AttributeError if the attribute cannot be found. + """ + if (inspect.ismodule(obj) or + (not inspect.isclass(obj) and obj.__dict__.has_key(attr_name))): + orig_obj = obj + orig_attr = getattr(obj, attr_name) + + else: + if not inspect.isclass(obj): + mro = list(inspect.getmro(obj.__class__)) + else: + mro = list(inspect.getmro(obj)) + + mro.reverse() + + orig_attr = None + + for cls in mro: + try: + orig_obj = cls + orig_attr = getattr(obj, attr_name) + except AttributeError: + continue + + if orig_attr is None: + raise AttributeError("Attribute not found.") + + # Calling getattr() on a staticmethod transforms it to a 'normal' function. + # We need to ensure that we put it back as a staticmethod. + old_attribute = obj.__dict__.get(attr_name) + if old_attribute is not None and isinstance(old_attribute, staticmethod): + orig_attr = staticmethod(orig_attr) + + self.stubs.append((orig_obj, attr_name, orig_attr)) + setattr(orig_obj, attr_name, new_attr) + + def SmartUnsetAll(self): + """Reverses all the SmartSet() calls, restoring things to their original + definition. Its okay to call SmartUnsetAll() repeatedly, as later calls + have no effect if no SmartSet() calls have been made. + + """ + self.stubs.reverse() + + for args in self.stubs: + setattr(*args) + + self.stubs = [] + + def Set(self, parent, child_name, new_child): + """Replace child_name's old definition with new_child, in the context + of the given parent. The parent could be a module when the child is a + function at module scope. Or the parent could be a class when a class' + method is being replaced. The named child is set to new_child, while + the prior definition is saved away for later, when UnsetAll() is called. + + This method supports the case where child_name is a staticmethod or a + classmethod of parent. + """ + old_child = getattr(parent, child_name) + + old_attribute = parent.__dict__.get(child_name) + if old_attribute is not None and isinstance(old_attribute, staticmethod): + old_child = staticmethod(old_child) + + self.cache.append((parent, old_child, child_name)) + setattr(parent, child_name, new_child) + + def UnsetAll(self): + """Reverses all the Set() calls, restoring things to their original + definition. Its okay to call UnsetAll() repeatedly, as later calls have + no effect if no Set() calls have been made. + + """ + # Undo calls to Set() in reverse order, in case Set() was called on the + # same arguments repeatedly (want the original call to be last one undone) + self.cache.reverse() + + for (parent, old_child, child_name) in self.cache: + setattr(parent, child_name, old_child) + self.cache = [] diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS new file mode 100644 index 000000000..ba33c7327 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS @@ -0,0 +1,240 @@ +# **EXPERIMENTAL** +# +# See http://sebs.googlecode.com +# +# This is an experimental build definition file using the SEBS build system. +# I (Kenton Varda, maintainer of Protocol Buffers) happen to be the author of +# SEBS, though SEBS is not a Google project. I'm sticking this file in +# protobuf's SVN because that's the easiest place for me to put it, and it +# shouldn't harm anyone. This file is not included in the distribution. +# +# Currently, to use this file, you must generate config.h and put it at the +# top level of the source tree. + +_cpp = sebs.import_("//sebs/cpp.sebs") + +# ==================================================================== +# Public targets + +protobuf_lite = _cpp.Library( + name = "protobuf-lite", + srcs = [ "stubs/common.cc", + "stubs/once.cc", + "stubs/hash.cc", + "stubs/hash.h", + "stubs/map-util.h", + "stubs/stl_util-inl.h", + "extension_set.cc", + "generated_message_util.cc", + "message_lite.cc", + "repeated_field.cc", + "wire_format_lite.cc", + "io/coded_stream.cc", + "io/zero_copy_stream.cc", + "io/zero_copy_stream_impl_lite.cc" ], + deps = [ _cpp.SystemLibrary(name = "pthread") ]) + +protobuf = _cpp.Library( + name = "protobuf", + srcs = [ "stubs/strutil.cc", + "stubs/strutil.h", + "stubs/substitute.cc", + "stubs/substitute.h", + "stubs/structurally_valid.cc", + "descriptor.cc", + "descriptor.pb.cc", + "descriptor_database.cc", + "dynamic_message.cc", + "extension_set_heavy.cc", + "generated_message_reflection.cc", + "message.cc", + "reflection_ops.cc", + "service.cc", + "text_format.cc", + "unknown_field_set.cc", + "wire_format.cc", + "io/gzip_stream.cc", + "io/printer.cc", + "io/tokenizer.cc", + "io/zero_copy_stream_impl.cc", + "compiler/importer.cc", + "compiler/parser.cc" ], + deps = [ protobuf_lite, + _cpp.SystemLibrary(name = "z") ]) + +libprotoc = _cpp.Library( + name = "protoc", + srcs = [ "compiler/code_generator.cc", + "compiler/command_line_interface.cc", + "compiler/cpp/cpp_enum.cc", + "compiler/cpp/cpp_enum.h", + "compiler/cpp/cpp_enum_field.cc", + "compiler/cpp/cpp_enum_field.h", + "compiler/cpp/cpp_extension.cc", + "compiler/cpp/cpp_extension.h", + "compiler/cpp/cpp_field.cc", + "compiler/cpp/cpp_field.h", + "compiler/cpp/cpp_file.cc", + "compiler/cpp/cpp_file.h", + "compiler/cpp/cpp_generator.cc", + "compiler/cpp/cpp_helpers.cc", + "compiler/cpp/cpp_helpers.h", + "compiler/cpp/cpp_message.cc", + "compiler/cpp/cpp_message.h", + "compiler/cpp/cpp_message_field.cc", + "compiler/cpp/cpp_message_field.h", + "compiler/cpp/cpp_primitive_field.cc", + "compiler/cpp/cpp_primitive_field.h", + "compiler/cpp/cpp_service.cc", + "compiler/cpp/cpp_service.h", + "compiler/cpp/cpp_string_field.cc", + "compiler/cpp/cpp_string_field.h", + "compiler/java/java_enum.cc", + "compiler/java/java_enum.h", + "compiler/java/java_enum_field.cc", + "compiler/java/java_enum_field.h", + "compiler/java/java_extension.cc", + "compiler/java/java_extension.h", + "compiler/java/java_field.cc", + "compiler/java/java_field.h", + "compiler/java/java_file.cc", + "compiler/java/java_file.h", + "compiler/java/java_generator.cc", + "compiler/java/java_helpers.cc", + "compiler/java/java_helpers.h", + "compiler/java/java_message.cc", + "compiler/java/java_message.h", + "compiler/java/java_message_field.cc", + "compiler/java/java_message_field.h", + "compiler/java/java_primitive_field.cc", + "compiler/java/java_primitive_field.h", + "compiler/java/java_service.cc", + "compiler/java/java_service.h", + "compiler/python/python_generator.cc" ], + deps = [ protobuf ]) + +protoc = _cpp.Binary( + name = "protoc", + srcs = [ "compiler/main.cc" ], + deps = [ libprotoc ]) + +# ==================================================================== +# ProtobufLibrary rule class + +class ProtobufLibrary(sebs.Rule): + argument_spec = sebs.ArgumentSpec(srcs = [sebs.Artifact], + deps = ([sebs.Rule], []), + lite = (bool, False)) + + def _expand(self, args): + for dep in args.deps: + if not isinstance(dep, ProtobufLibrary): + raise sebs.DefinitionError( + "Dependency of ProtobufLibrary is not a ProtobufLibrary: %s" % dep) + + protoc.expand_once() + + # We must build protoc for the host configuration to allow cross-compiling. + host_protoc = self.context.configured_artifact(protoc.binary, "host") + + protoc_action = self.context.action(self, "protobuf") + protoc_args = [host_protoc, "-Isrc", "-Itmp", "-Iinclude","--cpp_out=tmp"] + + cpp_srcs = [] + for src in args.srcs: + protoc_args.append(src) + + # We cannot build .proto files from other packages because the .pb.cc + # and .pb.h files would be written to that package, and we aren't allowed + # to write to other packages. + if self.context.local_filename(src) is None: + raise sebs.DefinitionError( + "Source file is not in this package: %s" % src) + + cc_artifact = self.context.derived_artifact(src, ".pb.cc", protoc_action) + header_artifact = self.context.derived_artifact( + src, ".pb.h", protoc_action) + + cpp_srcs.append(cc_artifact) + cpp_srcs.append(header_artifact) + + protoc_action.set_command( + sebs.SubprocessCommand(protoc_action, protoc_args, implicit = cpp_srcs)) + + deps = list(args.deps) + if args.lite: + deps.append(protobuf_lite) + else: + deps.append(protobuf) + + self.__cpp_library = _cpp.Library(srcs = cpp_srcs, deps = deps, + context = self.context) + self.__cpp_library.label = self.label + self.outputs = [] + + def as_cpp_library(self): + self.expand_once() + return self.__cpp_library + +# ==================================================================== +# Tests + +_lite_test_protos = ProtobufLibrary( + srcs = [ "unittest_lite.proto", + "unittest_import_lite.proto" ], + lite = True) +_test_protos = ProtobufLibrary( + srcs = [ "unittest.proto", + "unittest_empty.proto", + "unittest_import.proto", + "unittest_mset.proto", + "unittest_optimize_for.proto", + "unittest_embed_optimize_for.proto", + "unittest_custom_options.proto", + "unittest_lite_imports_nonlite.proto", + "compiler/cpp/cpp_test_bad_identifiers.proto" ], + deps = [ _lite_test_protos ]) + +_test_util = _cpp.Library( + name = "test_util", + srcs = [ "test_util.cc", + "test_util.h", + "testing/googletest.cc", + "testing/googletest.h", + "testing/file.cc", + "testing/file.h" ], + deps = [ protobuf, _test_protos, _cpp.SystemLibrary(name = "gtest")] ) + +protobuf_lite_test = _cpp.Test( + srcs = [ "lite_unittest.cc", + "test_util_lite.cc", + "test_util_lite.h" ], + deps = [ _lite_test_protos ]) + +protobuf_test = _cpp.Test( + srcs = [ "stubs/common_unittest.cc", + "stubs/once_unittest.cc", + "stubs/strutil_unittest.cc", + "stubs/structurally_valid_unittest.cc", + "descriptor_database_unittest.cc", + "descriptor_unittest.cc", + "dynamic_message_unittest.cc", + "extension_set_unittest.cc", + "generated_message_reflection_unittest.cc", + "message_unittest.cc", + "reflection_ops_unittest.cc", + "repeated_field_unittest.cc", + "text_format_unittest.cc", + "unknown_field_set_unittest.cc", + "wire_format_unittest.cc", + "io/coded_stream_unittest.cc", + "io/printer_unittest.cc", + "io/tokenizer_unittest.cc", + "io/zero_copy_stream_unittest.cc", + "compiler/command_line_interface_unittest.cc", + "compiler/importer_unittest.cc", + "compiler/parser_unittest.cc", + "compiler/cpp/cpp_bootstrap_unittest.cc", + "compiler/cpp/cpp_unittest.cc" ], + deps = [ protobuf, libprotoc, _test_util, + _cpp.SystemLibrary(name = "gtest_main") ]) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc new file mode 100644 index 000000000..455c239a9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc @@ -0,0 +1,80 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +CodeGenerator::~CodeGenerator() {} +GeneratorContext::~GeneratorContext() {} + +io::ZeroCopyOutputStream* GeneratorContext::OpenForInsert( + const string& filename, const string& insertion_point) { + GOOGLE_LOG(FATAL) << "This GeneratorContext does not support insertion."; + return NULL; // make compiler happy +} + +void GeneratorContext::ListParsedFiles( + vector* output) { + GOOGLE_LOG(FATAL) << "This GeneratorContext does not support ListParsedFiles"; +} + +// Parses a set of comma-delimited name/value pairs. +void ParseGeneratorParameter(const string& text, + vector >* output) { + vector parts; + SplitStringUsing(text, ",", &parts); + + for (int i = 0; i < parts.size(); i++) { + string::size_type equals_pos = parts[i].find_first_of('='); + pair value; + if (equals_pos == string::npos) { + value.first = parts[i]; + value.second = ""; + } else { + value.first = parts[i].substr(0, equals_pos); + value.second = parts[i].substr(equals_pos + 1); + } + output->push_back(value); + } +} + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h new file mode 100644 index 000000000..252f68d1d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h @@ -0,0 +1,142 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Defines the abstract interface implemented by each of the language-specific +// code generators. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__ +#define GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__ + +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +namespace io { class ZeroCopyOutputStream; } +class FileDescriptor; + +namespace compiler { + +// Defined in this file. +class CodeGenerator; +class GeneratorContext; + +// The abstract interface to a class which generates code implementing a +// particular proto file in a particular language. A number of these may +// be registered with CommandLineInterface to support various languages. +class LIBPROTOC_EXPORT CodeGenerator { + public: + inline CodeGenerator() {} + virtual ~CodeGenerator(); + + // Generates code for the given proto file, generating one or more files in + // the given output directory. + // + // A parameter to be passed to the generator can be specified on the + // command line. This is intended to be used by Java and similar languages + // to specify which specific class from the proto file is to be generated, + // though it could have other uses as well. It is empty if no parameter was + // given. + // + // Returns true if successful. Otherwise, sets *error to a description of + // the problem (e.g. "invalid parameter") and returns false. + virtual bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* generator_context, + string* error) const = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodeGenerator); +}; + +// CodeGenerators generate one or more files in a given directory. This +// abstract interface represents the directory to which the CodeGenerator is +// to write and other information about the context in which the Generator +// runs. +class LIBPROTOC_EXPORT GeneratorContext { + public: + inline GeneratorContext() {} + virtual ~GeneratorContext(); + + // Opens the given file, truncating it if it exists, and returns a + // ZeroCopyOutputStream that writes to the file. The caller takes ownership + // of the returned object. This method never fails (a dummy stream will be + // returned instead). + // + // The filename given should be relative to the root of the source tree. + // E.g. the C++ generator, when generating code for "foo/bar.proto", will + // generate the files "foo/bar.pb.h" and "foo/bar.pb.cc"; note that + // "foo/" is included in these filenames. The filename is not allowed to + // contain "." or ".." components. + virtual io::ZeroCopyOutputStream* Open(const string& filename) = 0; + + // Creates a ZeroCopyOutputStream which will insert code into the given file + // at the given insertion point. See plugin.proto (plugin.pb.h) for more + // information on insertion points. The default implementation + // assert-fails -- it exists only for backwards-compatibility. + // + // WARNING: This feature is currently EXPERIMENTAL and is subject to change. + virtual io::ZeroCopyOutputStream* OpenForInsert( + const string& filename, const string& insertion_point); + + // Returns a vector of FileDescriptors for all the files being compiled + // in this run. Useful for languages, such as Go, that treat files + // differently when compiled as a set rather than individually. + virtual void ListParsedFiles(vector* output); + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratorContext); +}; + +// The type GeneratorContext was once called OutputDirectory. This typedef +// provides backward compatibility. +typedef GeneratorContext OutputDirectory; + +// Several code generators treat the parameter argument as holding a +// list of options separated by commas. This helper function parses +// a set of comma-delimited name/value pairs: e.g., +// "foo=bar,baz,qux=corge" +// parses to the pairs: +// ("foo", "bar"), ("baz", ""), ("qux", "corge") +extern void ParseGeneratorParameter(const string&, + vector >*); + +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CODE_GENERATOR_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc new file mode 100644 index 000000000..1c76994bd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc @@ -0,0 +1,1357 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#include +#else +#include +#endif +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace compiler { + +#if defined(_WIN32) +#define mkdir(name, mode) mkdir(name) +#ifndef W_OK +#define W_OK 02 // not defined by MSVC for whatever reason +#endif +#ifndef F_OK +#define F_OK 00 // not defined by MSVC for whatever reason +#endif +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif +#endif + +#ifndef O_BINARY +#ifdef _O_BINARY +#define O_BINARY _O_BINARY +#else +#define O_BINARY 0 // If this isn't defined, the platform doesn't need it. +#endif +#endif + +namespace { +#if defined(_WIN32) && !defined(__CYGWIN__) +static const char* kPathSeparator = ";"; +#else +static const char* kPathSeparator = ":"; +#endif + +// Returns true if the text looks like a Windows-style absolute path, starting +// with a drive letter. Example: "C:\foo". TODO(kenton): Share this with +// copy in importer.cc? +static bool IsWindowsAbsolutePath(const string& text) { +#if defined(_WIN32) || defined(__CYGWIN__) + return text.size() >= 3 && text[1] == ':' && + isalpha(text[0]) && + (text[2] == '/' || text[2] == '\\') && + text.find_last_of(':') == 1; +#else + return false; +#endif +} + +void SetFdToTextMode(int fd) { +#ifdef _WIN32 + if (_setmode(fd, _O_TEXT) == -1) { + // This should never happen, I think. + GOOGLE_LOG(WARNING) << "_setmode(" << fd << ", _O_TEXT): " << strerror(errno); + } +#endif + // (Text and binary are the same on non-Windows platforms.) +} + +void SetFdToBinaryMode(int fd) { +#ifdef _WIN32 + if (_setmode(fd, _O_BINARY) == -1) { + // This should never happen, I think. + GOOGLE_LOG(WARNING) << "_setmode(" << fd << ", _O_BINARY): " << strerror(errno); + } +#endif + // (Text and binary are the same on non-Windows platforms.) +} + +void AddTrailingSlash(string* path) { + if (!path->empty() && path->at(path->size() - 1) != '/') { + path->push_back('/'); + } +} + +bool VerifyDirectoryExists(const string& path) { + if (path.empty()) return true; + + if (access(path.c_str(), W_OK) == -1) { + cerr << path << ": " << strerror(errno) << endl; + return false; + } else { + return true; + } +} + +// Try to create the parent directory of the given file, creating the parent's +// parent if necessary, and so on. The full file name is actually +// (prefix + filename), but we assume |prefix| already exists and only create +// directories listed in |filename|. +bool TryCreateParentDirectory(const string& prefix, const string& filename) { + // Recursively create parent directories to the output file. + vector parts; + SplitStringUsing(filename, "/", &parts); + string path_so_far = prefix; + for (int i = 0; i < parts.size() - 1; i++) { + path_so_far += parts[i]; + if (mkdir(path_so_far.c_str(), 0777) != 0) { + if (errno != EEXIST) { + cerr << filename << ": while trying to create directory " + << path_so_far << ": " << strerror(errno) << endl; + return false; + } + } + path_so_far += '/'; + } + + return true; +} + +} // namespace + +// A MultiFileErrorCollector that prints errors to stderr. +class CommandLineInterface::ErrorPrinter : public MultiFileErrorCollector, + public io::ErrorCollector { + public: + ErrorPrinter(ErrorFormat format, DiskSourceTree *tree = NULL) + : format_(format), tree_(tree) {} + ~ErrorPrinter() {} + + // implements MultiFileErrorCollector ------------------------------ + void AddError(const string& filename, int line, int column, + const string& message) { + + // Print full path when running under MSVS + string dfile; + if (format_ == CommandLineInterface::ERROR_FORMAT_MSVS && + tree_ != NULL && + tree_->VirtualFileToDiskFile(filename, &dfile)) { + cerr << dfile; + } else { + cerr << filename; + } + + // Users typically expect 1-based line/column numbers, so we add 1 + // to each here. + if (line != -1) { + // Allow for both GCC- and Visual-Studio-compatible output. + switch (format_) { + case CommandLineInterface::ERROR_FORMAT_GCC: + cerr << ":" << (line + 1) << ":" << (column + 1); + break; + case CommandLineInterface::ERROR_FORMAT_MSVS: + cerr << "(" << (line + 1) << ") : error in column=" << (column + 1); + break; + } + } + + cerr << ": " << message << endl; + } + + // implements io::ErrorCollector ----------------------------------- + void AddError(int line, int column, const string& message) { + AddError("input", line, column, message); + } + + private: + const ErrorFormat format_; + DiskSourceTree *tree_; +}; + +// ------------------------------------------------------------------- + +// A GeneratorContext implementation that buffers files in memory, then dumps +// them all to disk on demand. +class CommandLineInterface::GeneratorContextImpl : public GeneratorContext { + public: + GeneratorContextImpl(const vector& parsed_files); + ~GeneratorContextImpl(); + + // Write all files in the directory to disk at the given output location, + // which must end in a '/'. + bool WriteAllToDisk(const string& prefix); + + // Write the contents of this directory to a ZIP-format archive with the + // given name. + bool WriteAllToZip(const string& filename); + + // Add a boilerplate META-INF/MANIFEST.MF file as required by the Java JAR + // format, unless one has already been written. + void AddJarManifest(); + + // implements GeneratorContext -------------------------------------- + io::ZeroCopyOutputStream* Open(const string& filename); + io::ZeroCopyOutputStream* OpenForInsert( + const string& filename, const string& insertion_point); + void ListParsedFiles(vector* output) { + *output = parsed_files_; + } + + private: + friend class MemoryOutputStream; + + // map instead of hash_map so that files are written in order (good when + // writing zips). + map files_; + const vector& parsed_files_; + bool had_error_; +}; + +class CommandLineInterface::MemoryOutputStream + : public io::ZeroCopyOutputStream { + public: + MemoryOutputStream(GeneratorContextImpl* directory, const string& filename); + MemoryOutputStream(GeneratorContextImpl* directory, const string& filename, + const string& insertion_point); + virtual ~MemoryOutputStream(); + + // implements ZeroCopyOutputStream --------------------------------- + virtual bool Next(void** data, int* size) { return inner_->Next(data, size); } + virtual void BackUp(int count) { inner_->BackUp(count); } + virtual int64 ByteCount() const { return inner_->ByteCount(); } + + private: + // Where to insert the string when it's done. + GeneratorContextImpl* directory_; + string filename_; + string insertion_point_; + + // The string we're building. + string data_; + + // StringOutputStream writing to data_. + scoped_ptr inner_; +}; + +// ------------------------------------------------------------------- + +CommandLineInterface::GeneratorContextImpl::GeneratorContextImpl( + const vector& parsed_files) + : parsed_files_(parsed_files), + had_error_(false) { +} + +CommandLineInterface::GeneratorContextImpl::~GeneratorContextImpl() { + STLDeleteValues(&files_); +} + +bool CommandLineInterface::GeneratorContextImpl::WriteAllToDisk( + const string& prefix) { + if (had_error_) { + return false; + } + + if (!VerifyDirectoryExists(prefix)) { + return false; + } + + for (map::const_iterator iter = files_.begin(); + iter != files_.end(); ++iter) { + const string& relative_filename = iter->first; + const char* data = iter->second->data(); + int size = iter->second->size(); + + if (!TryCreateParentDirectory(prefix, relative_filename)) { + return false; + } + string filename = prefix + relative_filename; + + // Create the output file. + int file_descriptor; + do { + file_descriptor = + open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + } while (file_descriptor < 0 && errno == EINTR); + + if (file_descriptor < 0) { + int error = errno; + cerr << filename << ": " << strerror(error); + return false; + } + + // Write the file. + while (size > 0) { + int write_result; + do { + write_result = write(file_descriptor, data, size); + } while (write_result < 0 && errno == EINTR); + + if (write_result <= 0) { + // Write error. + + // FIXME(kenton): According to the man page, if write() returns zero, + // there was no error; write() simply did not write anything. It's + // unclear under what circumstances this might happen, but presumably + // errno won't be set in this case. I am confused as to how such an + // event should be handled. For now I'm treating it as an error, + // since retrying seems like it could lead to an infinite loop. I + // suspect this never actually happens anyway. + + if (write_result < 0) { + int error = errno; + cerr << filename << ": write: " << strerror(error); + } else { + cerr << filename << ": write() returned zero?" << endl; + } + return false; + } + + data += write_result; + size -= write_result; + } + + if (close(file_descriptor) != 0) { + int error = errno; + cerr << filename << ": close: " << strerror(error); + return false; + } + } + + return true; +} + +bool CommandLineInterface::GeneratorContextImpl::WriteAllToZip( + const string& filename) { + if (had_error_) { + return false; + } + + // Create the output file. + int file_descriptor; + do { + file_descriptor = + open(filename.c_str(), O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + } while (file_descriptor < 0 && errno == EINTR); + + if (file_descriptor < 0) { + int error = errno; + cerr << filename << ": " << strerror(error); + return false; + } + + // Create the ZipWriter + io::FileOutputStream stream(file_descriptor); + ZipWriter zip_writer(&stream); + + for (map::const_iterator iter = files_.begin(); + iter != files_.end(); ++iter) { + zip_writer.Write(iter->first, *iter->second); + } + + zip_writer.WriteDirectory(); + + if (stream.GetErrno() != 0) { + cerr << filename << ": " << strerror(stream.GetErrno()) << endl; + } + + if (!stream.Close()) { + cerr << filename << ": " << strerror(stream.GetErrno()) << endl; + } + + return true; +} + +void CommandLineInterface::GeneratorContextImpl::AddJarManifest() { + string** map_slot = &files_["META-INF/MANIFEST.MF"]; + if (*map_slot == NULL) { + *map_slot = new string( + "Manifest-Version: 1.0\n" + "Created-By: 1.6.0 (protoc)\n" + "\n"); + } +} + +io::ZeroCopyOutputStream* CommandLineInterface::GeneratorContextImpl::Open( + const string& filename) { + return new MemoryOutputStream(this, filename); +} + +io::ZeroCopyOutputStream* +CommandLineInterface::GeneratorContextImpl::OpenForInsert( + const string& filename, const string& insertion_point) { + return new MemoryOutputStream(this, filename, insertion_point); +} + +// ------------------------------------------------------------------- + +CommandLineInterface::MemoryOutputStream::MemoryOutputStream( + GeneratorContextImpl* directory, const string& filename) + : directory_(directory), + filename_(filename), + inner_(new io::StringOutputStream(&data_)) { +} + +CommandLineInterface::MemoryOutputStream::MemoryOutputStream( + GeneratorContextImpl* directory, const string& filename, + const string& insertion_point) + : directory_(directory), + filename_(filename), + insertion_point_(insertion_point), + inner_(new io::StringOutputStream(&data_)) { +} + +CommandLineInterface::MemoryOutputStream::~MemoryOutputStream() { + // Make sure all data has been written. + inner_.reset(); + + // Insert into the directory. + string** map_slot = &directory_->files_[filename_]; + + if (insertion_point_.empty()) { + // This was just a regular Open(). + if (*map_slot != NULL) { + cerr << filename_ << ": Tried to write the same file twice." << endl; + directory_->had_error_ = true; + return; + } + + *map_slot = new string; + (*map_slot)->swap(data_); + } else { + // This was an OpenForInsert(). + + // If the data doens't end with a clean line break, add one. + if (!data_.empty() && data_[data_.size() - 1] != '\n') { + data_.push_back('\n'); + } + + // Find the file we are going to insert into. + if (*map_slot == NULL) { + cerr << filename_ << ": Tried to insert into file that doesn't exist." + << endl; + directory_->had_error_ = true; + return; + } + string* target = *map_slot; + + // Find the insertion point. + string magic_string = strings::Substitute( + "@@protoc_insertion_point($0)", insertion_point_); + string::size_type pos = target->find(magic_string); + + if (pos == string::npos) { + cerr << filename_ << ": insertion point \"" << insertion_point_ + << "\" not found." << endl; + directory_->had_error_ = true; + return; + } + + // Seek backwards to the beginning of the line, which is where we will + // insert the data. Note that this has the effect of pushing the insertion + // point down, so the data is inserted before it. This is intentional + // because it means that multiple insertions at the same point will end + // up in the expected order in the final output. + pos = target->find_last_of('\n', pos); + if (pos == string::npos) { + // Insertion point is on the first line. + pos = 0; + } else { + // Advance to character after '\n'. + ++pos; + } + + // Extract indent. + string indent_(*target, pos, target->find_first_not_of(" \t", pos) - pos); + + if (indent_.empty()) { + // No indent. This makes things easier. + target->insert(pos, data_); + } else { + // Calculate how much space we need. + int indent_size = 0; + for (int i = 0; i < data_.size(); i++) { + if (data_[i] == '\n') indent_size += indent_.size(); + } + + // Make a hole for it. + target->insert(pos, data_.size() + indent_size, '\0'); + + // Now copy in the data. + string::size_type data_pos = 0; + char* target_ptr = string_as_array(target) + pos; + while (data_pos < data_.size()) { + // Copy indent. + memcpy(target_ptr, indent_.data(), indent_.size()); + target_ptr += indent_.size(); + + // Copy line from data_. + // We already guaranteed that data_ ends with a newline (above), so this + // search can't fail. + string::size_type line_length = + data_.find_first_of('\n', data_pos) + 1 - data_pos; + memcpy(target_ptr, data_.data() + data_pos, line_length); + target_ptr += line_length; + data_pos += line_length; + } + + GOOGLE_CHECK_EQ(target_ptr, + string_as_array(target) + pos + data_.size() + indent_size); + } + } +} + +// =================================================================== + +CommandLineInterface::CommandLineInterface() + : mode_(MODE_COMPILE), + error_format_(ERROR_FORMAT_GCC), + imports_in_descriptor_set_(false), + disallow_services_(false), + inputs_are_proto_path_relative_(false) {} +CommandLineInterface::~CommandLineInterface() {} + +void CommandLineInterface::RegisterGenerator(const string& flag_name, + CodeGenerator* generator, + const string& help_text) { + GeneratorInfo info; + info.generator = generator; + info.help_text = help_text; + generators_[flag_name] = info; +} + +void CommandLineInterface::AllowPlugins(const string& exe_name_prefix) { + plugin_prefix_ = exe_name_prefix; +} + +int CommandLineInterface::Run(int argc, const char* const argv[]) { + Clear(); + if (!ParseArguments(argc, argv)) return 1; + + // Set up the source tree. + DiskSourceTree source_tree; + for (int i = 0; i < proto_path_.size(); i++) { + source_tree.MapPath(proto_path_[i].first, proto_path_[i].second); + } + + // Map input files to virtual paths if necessary. + if (!inputs_are_proto_path_relative_) { + if (!MakeInputsBeProtoPathRelative(&source_tree)) { + return 1; + } + } + + // Allocate the Importer. + ErrorPrinter error_collector(error_format_, &source_tree); + Importer importer(&source_tree, &error_collector); + + vector parsed_files; + + // Parse each file. + for (int i = 0; i < input_files_.size(); i++) { + // Import the file. + const FileDescriptor* parsed_file = importer.Import(input_files_[i]); + if (parsed_file == NULL) return 1; + parsed_files.push_back(parsed_file); + + // Enforce --disallow_services. + if (disallow_services_ && parsed_file->service_count() > 0) { + cerr << parsed_file->name() << ": This file contains services, but " + "--disallow_services was used." << endl; + return 1; + } + } + + // We construct a separate GeneratorContext for each output location. Note + // that two code generators may output to the same location, in which case + // they should share a single GeneratorContext so that OpenForInsert() works. + typedef hash_map GeneratorContextMap; + GeneratorContextMap output_directories; + + // Generate output. + if (mode_ == MODE_COMPILE) { + for (int i = 0; i < output_directives_.size(); i++) { + string output_location = output_directives_[i].output_location; + if (!HasSuffixString(output_location, ".zip") && + !HasSuffixString(output_location, ".jar")) { + AddTrailingSlash(&output_location); + } + GeneratorContextImpl** map_slot = &output_directories[output_location]; + + if (*map_slot == NULL) { + // First time we've seen this output location. + *map_slot = new GeneratorContextImpl(parsed_files); + } + + if (!GenerateOutput(parsed_files, output_directives_[i], *map_slot)) { + STLDeleteValues(&output_directories); + return 1; + } + } + } + + // Write all output to disk. + for (GeneratorContextMap::iterator iter = output_directories.begin(); + iter != output_directories.end(); ++iter) { + const string& location = iter->first; + GeneratorContextImpl* directory = iter->second; + if (HasSuffixString(location, "/")) { + if (!directory->WriteAllToDisk(location)) { + STLDeleteValues(&output_directories); + return 1; + } + } else { + if (HasSuffixString(location, ".jar")) { + directory->AddJarManifest(); + } + + if (!directory->WriteAllToZip(location)) { + STLDeleteValues(&output_directories); + return 1; + } + } + } + + STLDeleteValues(&output_directories); + + if (!descriptor_set_name_.empty()) { + if (!WriteDescriptorSet(parsed_files)) { + return 1; + } + } + + if (mode_ == MODE_ENCODE || mode_ == MODE_DECODE) { + if (codec_type_.empty()) { + // HACK: Define an EmptyMessage type to use for decoding. + DescriptorPool pool; + FileDescriptorProto file; + file.set_name("empty_message.proto"); + file.add_message_type()->set_name("EmptyMessage"); + GOOGLE_CHECK(pool.BuildFile(file) != NULL); + codec_type_ = "EmptyMessage"; + if (!EncodeOrDecode(&pool)) { + return 1; + } + } else { + if (!EncodeOrDecode(importer.pool())) { + return 1; + } + } + } + + return 0; +} + +void CommandLineInterface::Clear() { + // Clear all members that are set by Run(). Note that we must not clear + // members which are set by other methods before Run() is called. + executable_name_.clear(); + proto_path_.clear(); + input_files_.clear(); + output_directives_.clear(); + codec_type_.clear(); + descriptor_set_name_.clear(); + + mode_ = MODE_COMPILE; + imports_in_descriptor_set_ = false; + disallow_services_ = false; +} + +bool CommandLineInterface::MakeInputsBeProtoPathRelative( + DiskSourceTree* source_tree) { + for (int i = 0; i < input_files_.size(); i++) { + string virtual_file, shadowing_disk_file; + switch (source_tree->DiskFileToVirtualFile( + input_files_[i], &virtual_file, &shadowing_disk_file)) { + case DiskSourceTree::SUCCESS: + input_files_[i] = virtual_file; + break; + case DiskSourceTree::SHADOWED: + cerr << input_files_[i] << ": Input is shadowed in the --proto_path " + "by \"" << shadowing_disk_file << "\". Either use the latter " + "file as your input or reorder the --proto_path so that the " + "former file's location comes first." << endl; + return false; + case DiskSourceTree::CANNOT_OPEN: + cerr << input_files_[i] << ": " << strerror(errno) << endl; + return false; + case DiskSourceTree::NO_MAPPING: + // First check if the file exists at all. + if (access(input_files_[i].c_str(), F_OK) < 0) { + // File does not even exist. + cerr << input_files_[i] << ": " << strerror(ENOENT) << endl; + } else { + cerr << input_files_[i] << ": File does not reside within any path " + "specified using --proto_path (or -I). You must specify a " + "--proto_path which encompasses this file. Note that the " + "proto_path must be an exact prefix of the .proto file " + "names -- protoc is too dumb to figure out when two paths " + "(e.g. absolute and relative) are equivalent (it's harder " + "than you think)." << endl; + } + return false; + } + } + + return true; +} + +bool CommandLineInterface::ParseArguments(int argc, const char* const argv[]) { + executable_name_ = argv[0]; + + // Iterate through all arguments and parse them. + for (int i = 1; i < argc; i++) { + string name, value; + + if (ParseArgument(argv[i], &name, &value)) { + // Returned true => Use the next argument as the flag value. + if (i + 1 == argc || argv[i+1][0] == '-') { + cerr << "Missing value for flag: " << name << endl; + if (name == "--decode") { + cerr << "To decode an unknown message, use --decode_raw." << endl; + } + return false; + } else { + ++i; + value = argv[i]; + } + } + + if (!InterpretArgument(name, value)) return false; + } + + // If no --proto_path was given, use the current working directory. + if (proto_path_.empty()) { + proto_path_.push_back(make_pair("", ".")); + } + + // Check some errror cases. + bool decoding_raw = (mode_ == MODE_DECODE) && codec_type_.empty(); + if (decoding_raw && !input_files_.empty()) { + cerr << "When using --decode_raw, no input files should be given." << endl; + return false; + } else if (!decoding_raw && input_files_.empty()) { + cerr << "Missing input file." << endl; + return false; + } + if (mode_ == MODE_COMPILE && output_directives_.empty() && + descriptor_set_name_.empty()) { + cerr << "Missing output directives." << endl; + return false; + } + if (imports_in_descriptor_set_ && descriptor_set_name_.empty()) { + cerr << "--include_imports only makes sense when combined with " + "--descriptor_set_out." << endl; + } + + return true; +} + +bool CommandLineInterface::ParseArgument(const char* arg, + string* name, string* value) { + bool parsed_value = false; + + if (arg[0] != '-') { + // Not a flag. + name->clear(); + parsed_value = true; + *value = arg; + } else if (arg[1] == '-') { + // Two dashes: Multi-character name, with '=' separating name and + // value. + const char* equals_pos = strchr(arg, '='); + if (equals_pos != NULL) { + *name = string(arg, equals_pos - arg); + *value = equals_pos + 1; + parsed_value = true; + } else { + *name = arg; + } + } else { + // One dash: One-character name, all subsequent characters are the + // value. + if (arg[1] == '\0') { + // arg is just "-". We treat this as an input file, except that at + // present this will just lead to a "file not found" error. + name->clear(); + *value = arg; + parsed_value = true; + } else { + *name = string(arg, 2); + *value = arg + 2; + parsed_value = !value->empty(); + } + } + + // Need to return true iff the next arg should be used as the value for this + // one, false otherwise. + + if (parsed_value) { + // We already parsed a value for this flag. + return false; + } + + if (*name == "-h" || *name == "--help" || + *name == "--disallow_services" || + *name == "--include_imports" || + *name == "--version" || + *name == "--decode_raw") { + // HACK: These are the only flags that don't take a value. + // They probably should not be hard-coded like this but for now it's + // not worth doing better. + return false; + } + + // Next argument is the flag value. + return true; +} + +bool CommandLineInterface::InterpretArgument(const string& name, + const string& value) { + if (name.empty()) { + // Not a flag. Just a filename. + if (value.empty()) { + cerr << "You seem to have passed an empty string as one of the " + "arguments to " << executable_name_ << ". This is actually " + "sort of hard to do. Congrats. Unfortunately it is not valid " + "input so the program is going to die now." << endl; + return false; + } + + input_files_.push_back(value); + + } else if (name == "-I" || name == "--proto_path") { + // Java's -classpath (and some other languages) delimits path components + // with colons. Let's accept that syntax too just to make things more + // intuitive. + vector parts; + SplitStringUsing(value, kPathSeparator, &parts); + + for (int i = 0; i < parts.size(); i++) { + string virtual_path; + string disk_path; + + int equals_pos = parts[i].find_first_of('='); + if (equals_pos == string::npos) { + virtual_path = ""; + disk_path = parts[i]; + } else { + virtual_path = parts[i].substr(0, equals_pos); + disk_path = parts[i].substr(equals_pos + 1); + } + + if (disk_path.empty()) { + cerr << "--proto_path passed empty directory name. (Use \".\" for " + "current directory.)" << endl; + return false; + } + + // Make sure disk path exists, warn otherwise. + if (access(disk_path.c_str(), F_OK) < 0) { + cerr << disk_path << ": warning: directory does not exist." << endl; + } + + proto_path_.push_back(make_pair(virtual_path, disk_path)); + } + + } else if (name == "-o" || name == "--descriptor_set_out") { + if (!descriptor_set_name_.empty()) { + cerr << name << " may only be passed once." << endl; + return false; + } + if (value.empty()) { + cerr << name << " requires a non-empty value." << endl; + return false; + } + if (mode_ != MODE_COMPILE) { + cerr << "Cannot use --encode or --decode and generate descriptors at the " + "same time." << endl; + return false; + } + descriptor_set_name_ = value; + + } else if (name == "--include_imports") { + if (imports_in_descriptor_set_) { + cerr << name << " may only be passed once." << endl; + return false; + } + imports_in_descriptor_set_ = true; + + } else if (name == "-h" || name == "--help") { + PrintHelpText(); + return false; // Exit without running compiler. + + } else if (name == "--version") { + if (!version_info_.empty()) { + cout << version_info_ << endl; + } + cout << "libprotoc " + << protobuf::internal::VersionString(GOOGLE_PROTOBUF_VERSION) + << endl; + return false; // Exit without running compiler. + + } else if (name == "--disallow_services") { + disallow_services_ = true; + + } else if (name == "--encode" || name == "--decode" || + name == "--decode_raw") { + if (mode_ != MODE_COMPILE) { + cerr << "Only one of --encode and --decode can be specified." << endl; + return false; + } + if (!output_directives_.empty() || !descriptor_set_name_.empty()) { + cerr << "Cannot use " << name + << " and generate code or descriptors at the same time." << endl; + return false; + } + + mode_ = (name == "--encode") ? MODE_ENCODE : MODE_DECODE; + + if (value.empty() && name != "--decode_raw") { + cerr << "Type name for " << name << " cannot be blank." << endl; + if (name == "--decode") { + cerr << "To decode an unknown message, use --decode_raw." << endl; + } + return false; + } else if (!value.empty() && name == "--decode_raw") { + cerr << "--decode_raw does not take a parameter." << endl; + return false; + } + + codec_type_ = value; + + } else if (name == "--error_format") { + if (value == "gcc") { + error_format_ = ERROR_FORMAT_GCC; + } else if (value == "msvs") { + error_format_ = ERROR_FORMAT_MSVS; + } else { + cerr << "Unknown error format: " << value << endl; + return false; + } + + } else if (name == "--plugin") { + if (plugin_prefix_.empty()) { + cerr << "This compiler does not support plugins." << endl; + return false; + } + + string name; + string path; + + string::size_type equals_pos = value.find_first_of('='); + if (equals_pos == string::npos) { + // Use the basename of the file. + string::size_type slash_pos = value.find_last_of('/'); + if (slash_pos == string::npos) { + name = value; + } else { + name = value.substr(slash_pos + 1); + } + path = value; + } else { + name = value.substr(0, equals_pos); + path = value.substr(equals_pos + 1); + } + + plugins_[name] = path; + + } else { + // Some other flag. Look it up in the generators list. + const GeneratorInfo* generator_info = FindOrNull(generators_, name); + if (generator_info == NULL && + (plugin_prefix_.empty() || !HasSuffixString(name, "_out"))) { + cerr << "Unknown flag: " << name << endl; + return false; + } + + // It's an output flag. Add it to the output directives. + if (mode_ != MODE_COMPILE) { + cerr << "Cannot use --encode or --decode and generate code at the " + "same time." << endl; + return false; + } + + OutputDirective directive; + directive.name = name; + if (generator_info == NULL) { + directive.generator = NULL; + } else { + directive.generator = generator_info->generator; + } + + // Split value at ':' to separate the generator parameter from the + // filename. However, avoid doing this if the colon is part of a valid + // Windows-style absolute path. + string::size_type colon_pos = value.find_first_of(':'); + if (colon_pos == string::npos || IsWindowsAbsolutePath(value)) { + directive.output_location = value; + } else { + directive.parameter = value.substr(0, colon_pos); + directive.output_location = value.substr(colon_pos + 1); + } + + output_directives_.push_back(directive); + } + + return true; +} + +void CommandLineInterface::PrintHelpText() { + // Sorry for indentation here; line wrapping would be uglier. + cerr << +"Usage: " << executable_name_ << " [OPTION] PROTO_FILES\n" +"Parse PROTO_FILES and generate output based on the options given:\n" +" -IPATH, --proto_path=PATH Specify the directory in which to search for\n" +" imports. May be specified multiple times;\n" +" directories will be searched in order. If not\n" +" given, the current working directory is used.\n" +" --version Show version info and exit.\n" +" -h, --help Show this text and exit.\n" +" --encode=MESSAGE_TYPE Read a text-format message of the given type\n" +" from standard input and write it in binary\n" +" to standard output. The message type must\n" +" be defined in PROTO_FILES or their imports.\n" +" --decode=MESSAGE_TYPE Read a binary message of the given type from\n" +" standard input and write it in text format\n" +" to standard output. The message type must\n" +" be defined in PROTO_FILES or their imports.\n" +" --decode_raw Read an arbitrary protocol message from\n" +" standard input and write the raw tag/value\n" +" pairs in text format to standard output. No\n" +" PROTO_FILES should be given when using this\n" +" flag.\n" +" -oFILE, Writes a FileDescriptorSet (a protocol buffer,\n" +" --descriptor_set_out=FILE defined in descriptor.proto) containing all of\n" +" the input files to FILE.\n" +" --include_imports When using --descriptor_set_out, also include\n" +" all dependencies of the input files in the\n" +" set, so that the set is self-contained.\n" +" --error_format=FORMAT Set the format in which to print errors.\n" +" FORMAT may be 'gcc' (the default) or 'msvs'\n" +" (Microsoft Visual Studio format)." << endl; + if (!plugin_prefix_.empty()) { + cerr << +" --plugin=EXECUTABLE Specifies a plugin executable to use.\n" +" Normally, protoc searches the PATH for\n" +" plugins, but you may specify additional\n" +" executables not in the path using this flag.\n" +" Additionally, EXECUTABLE may be of the form\n" +" NAME=PATH, in which case the given plugin name\n" +" is mapped to the given executable even if\n" +" the executable's own name differs." << endl; + } + + for (GeneratorMap::iterator iter = generators_.begin(); + iter != generators_.end(); ++iter) { + // FIXME(kenton): If the text is long enough it will wrap, which is ugly, + // but fixing this nicely (e.g. splitting on spaces) is probably more + // trouble than it's worth. + cerr << " " << iter->first << "=OUT_DIR " + << string(19 - iter->first.size(), ' ') // Spaces for alignment. + << iter->second.help_text << endl; + } +} + +bool CommandLineInterface::GenerateOutput( + const vector& parsed_files, + const OutputDirective& output_directive, + GeneratorContext* generator_context) { + // Call the generator. + string error; + if (output_directive.generator == NULL) { + // This is a plugin. + GOOGLE_CHECK(HasPrefixString(output_directive.name, "--") && + HasSuffixString(output_directive.name, "_out")) + << "Bad name for plugin generator: " << output_directive.name; + + // Strip the "--" and "_out" and add the plugin prefix. + string plugin_name = plugin_prefix_ + "gen-" + + output_directive.name.substr(2, output_directive.name.size() - 6); + + if (!GeneratePluginOutput(parsed_files, plugin_name, + output_directive.parameter, + generator_context, &error)) { + cerr << output_directive.name << ": " << error << endl; + return false; + } + } else { + // Regular generator. + for (int i = 0; i < parsed_files.size(); i++) { + if (!output_directive.generator->Generate( + parsed_files[i], output_directive.parameter, + generator_context, &error)) { + // Generator returned an error. + cerr << output_directive.name << ": " << parsed_files[i]->name() << ": " + << error << endl; + return false; + } + } + } + + return true; +} + +bool CommandLineInterface::GeneratePluginOutput( + const vector& parsed_files, + const string& plugin_name, + const string& parameter, + GeneratorContext* generator_context, + string* error) { + CodeGeneratorRequest request; + CodeGeneratorResponse response; + + // Build the request. + if (!parameter.empty()) { + request.set_parameter(parameter); + } + + set already_seen; + for (int i = 0; i < parsed_files.size(); i++) { + request.add_file_to_generate(parsed_files[i]->name()); + GetTransitiveDependencies(parsed_files[i], &already_seen, + request.mutable_proto_file()); + } + + // Invoke the plugin. + Subprocess subprocess; + + if (plugins_.count(plugin_name) > 0) { + subprocess.Start(plugins_[plugin_name], Subprocess::EXACT_NAME); + } else { + subprocess.Start(plugin_name, Subprocess::SEARCH_PATH); + } + + string communicate_error; + if (!subprocess.Communicate(request, &response, &communicate_error)) { + *error = strings::Substitute("$0: $1", plugin_name, communicate_error); + return false; + } + + // Write the files. We do this even if there was a generator error in order + // to match the behavior of a compiled-in generator. + scoped_ptr current_output; + for (int i = 0; i < response.file_size(); i++) { + const CodeGeneratorResponse::File& output_file = response.file(i); + + if (!output_file.insertion_point().empty()) { + // Open a file for insert. + // We reset current_output to NULL first so that the old file is closed + // before the new one is opened. + current_output.reset(); + current_output.reset(generator_context->OpenForInsert( + output_file.name(), output_file.insertion_point())); + } else if (!output_file.name().empty()) { + // Starting a new file. Open it. + // We reset current_output to NULL first so that the old file is closed + // before the new one is opened. + current_output.reset(); + current_output.reset(generator_context->Open(output_file.name())); + } else if (current_output == NULL) { + *error = strings::Substitute( + "$0: First file chunk returned by plugin did not specify a file name.", + plugin_name); + return false; + } + + // Use CodedOutputStream for convenience; otherwise we'd need to provide + // our own buffer-copying loop. + io::CodedOutputStream writer(current_output.get()); + writer.WriteString(output_file.content()); + } + + // Check for errors. + if (!response.error().empty()) { + // Generator returned an error. + *error = response.error(); + return false; + } + + return true; +} + +bool CommandLineInterface::EncodeOrDecode(const DescriptorPool* pool) { + // Look up the type. + const Descriptor* type = pool->FindMessageTypeByName(codec_type_); + if (type == NULL) { + cerr << "Type not defined: " << codec_type_ << endl; + return false; + } + + DynamicMessageFactory dynamic_factory(pool); + scoped_ptr message(dynamic_factory.GetPrototype(type)->New()); + + if (mode_ == MODE_ENCODE) { + SetFdToTextMode(STDIN_FILENO); + SetFdToBinaryMode(STDOUT_FILENO); + } else { + SetFdToBinaryMode(STDIN_FILENO); + SetFdToTextMode(STDOUT_FILENO); + } + + io::FileInputStream in(STDIN_FILENO); + io::FileOutputStream out(STDOUT_FILENO); + + if (mode_ == MODE_ENCODE) { + // Input is text. + ErrorPrinter error_collector(error_format_); + TextFormat::Parser parser; + parser.RecordErrorsTo(&error_collector); + parser.AllowPartialMessage(true); + + if (!parser.Parse(&in, message.get())) { + cerr << "Failed to parse input." << endl; + return false; + } + } else { + // Input is binary. + if (!message->ParsePartialFromZeroCopyStream(&in)) { + cerr << "Failed to parse input." << endl; + return false; + } + } + + if (!message->IsInitialized()) { + cerr << "warning: Input message is missing required fields: " + << message->InitializationErrorString() << endl; + } + + if (mode_ == MODE_ENCODE) { + // Output is binary. + if (!message->SerializePartialToZeroCopyStream(&out)) { + cerr << "output: I/O error." << endl; + return false; + } + } else { + // Output is text. + if (!TextFormat::Print(*message, &out)) { + cerr << "output: I/O error." << endl; + return false; + } + } + + return true; +} + +bool CommandLineInterface::WriteDescriptorSet( + const vector parsed_files) { + FileDescriptorSet file_set; + + if (imports_in_descriptor_set_) { + set already_seen; + for (int i = 0; i < parsed_files.size(); i++) { + GetTransitiveDependencies( + parsed_files[i], &already_seen, file_set.mutable_file()); + } + } else { + for (int i = 0; i < parsed_files.size(); i++) { + parsed_files[i]->CopyTo(file_set.add_file()); + } + } + + int fd; + do { + fd = open(descriptor_set_name_.c_str(), + O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0666); + } while (fd < 0 && errno == EINTR); + + if (fd < 0) { + perror(descriptor_set_name_.c_str()); + return false; + } + + io::FileOutputStream out(fd); + if (!file_set.SerializeToZeroCopyStream(&out)) { + cerr << descriptor_set_name_ << ": " << strerror(out.GetErrno()) << endl; + out.Close(); + return false; + } + if (!out.Close()) { + cerr << descriptor_set_name_ << ": " << strerror(out.GetErrno()) << endl; + return false; + } + + return true; +} + +void CommandLineInterface::GetTransitiveDependencies( + const FileDescriptor* file, + set* already_seen, + RepeatedPtrField* output) { + if (!already_seen->insert(file).second) { + // Already saw this file. Skip. + return; + } + + // Add all dependencies. + for (int i = 0; i < file->dependency_count(); i++) { + GetTransitiveDependencies(file->dependency(i), already_seen, output); + } + + // Add this file. + file->CopyTo(output->Add()); +} + + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h new file mode 100644 index 000000000..0b507d801 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h @@ -0,0 +1,318 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Implements the Protocol Compiler front-end such that it may be reused by +// custom compilers written to support other languages. + +#ifndef GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__ +#define GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__ + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +class FileDescriptor; // descriptor.h +class DescriptorPool; // descriptor.h +class FileDescriptorProto; // descriptor.pb.h +template class RepeatedPtrField; // repeated_field.h + +namespace compiler { + +class CodeGenerator; // code_generator.h +class GeneratorContext; // code_generator.h +class DiskSourceTree; // importer.h + +// This class implements the command-line interface to the protocol compiler. +// It is designed to make it very easy to create a custom protocol compiler +// supporting the languages of your choice. For example, if you wanted to +// create a custom protocol compiler binary which includes both the regular +// C++ support plus support for your own custom output "Foo", you would +// write a class "FooGenerator" which implements the CodeGenerator interface, +// then write a main() procedure like this: +// +// int main(int argc, char* argv[]) { +// google::protobuf::compiler::CommandLineInterface cli; +// +// // Support generation of C++ source and headers. +// google::protobuf::compiler::cpp::CppGenerator cpp_generator; +// cli.RegisterGenerator("--cpp_out", &cpp_generator, +// "Generate C++ source and header."); +// +// // Support generation of Foo code. +// FooGenerator foo_generator; +// cli.RegisterGenerator("--foo_out", &foo_generator, +// "Generate Foo file."); +// +// return cli.Run(argc, argv); +// } +// +// The compiler is invoked with syntax like: +// protoc --cpp_out=outdir --foo_out=outdir --proto_path=src src/foo.proto +// +// For a full description of the command-line syntax, invoke it with --help. +class LIBPROTOC_EXPORT CommandLineInterface { + public: + CommandLineInterface(); + ~CommandLineInterface(); + + // Register a code generator for a language. + // + // Parameters: + // * flag_name: The command-line flag used to specify an output file of + // this type. The name must start with a '-'. If the name is longer + // than one letter, it must start with two '-'s. + // * generator: The CodeGenerator which will be called to generate files + // of this type. + // * help_text: Text describing this flag in the --help output. + // + // Some generators accept extra parameters. You can specify this parameter + // on the command-line by placing it before the output directory, separated + // by a colon: + // protoc --foo_out=enable_bar:outdir + // The text before the colon is passed to CodeGenerator::Generate() as the + // "parameter". + void RegisterGenerator(const string& flag_name, + CodeGenerator* generator, + const string& help_text); + + // Enables "plugins". In this mode, if a command-line flag ends with "_out" + // but does not match any registered generator, the compiler will attempt to + // find a "plugin" to implement the generator. Plugins are just executables. + // They should live somewhere in the PATH. + // + // The compiler determines the executable name to search for by concatenating + // exe_name_prefix with the unrecognized flag name, removing "_out". So, for + // example, if exe_name_prefix is "protoc-" and you pass the flag --foo_out, + // the compiler will try to run the program "protoc-foo". + // + // The plugin program should implement the following usage: + // plugin [--out=OUTDIR] [--parameter=PARAMETER] PROTO_FILES < DESCRIPTORS + // --out indicates the output directory (as passed to the --foo_out + // parameter); if omitted, the current directory should be used. --parameter + // gives the generator parameter, if any was provided. The PROTO_FILES list + // the .proto files which were given on the compiler command-line; these are + // the files for which the plugin is expected to generate output code. + // Finally, DESCRIPTORS is an encoded FileDescriptorSet (as defined in + // descriptor.proto). This is piped to the plugin's stdin. The set will + // include descriptors for all the files listed in PROTO_FILES as well as + // all files that they import. The plugin MUST NOT attempt to read the + // PROTO_FILES directly -- it must use the FileDescriptorSet. + // + // The plugin should generate whatever files are necessary, as code generators + // normally do. It should write the names of all files it generates to + // stdout. The names should be relative to the output directory, NOT absolute + // names or relative to the current directory. If any errors occur, error + // messages should be written to stderr. If an error is fatal, the plugin + // should exit with a non-zero exit code. + void AllowPlugins(const string& exe_name_prefix); + + // Run the Protocol Compiler with the given command-line parameters. + // Returns the error code which should be returned by main(). + // + // It may not be safe to call Run() in a multi-threaded environment because + // it calls strerror(). I'm not sure why you'd want to do this anyway. + int Run(int argc, const char* const argv[]); + + // Call SetInputsAreCwdRelative(true) if the input files given on the command + // line should be interpreted relative to the proto import path specified + // using --proto_path or -I flags. Otherwise, input file names will be + // interpreted relative to the current working directory (or as absolute + // paths if they start with '/'), though they must still reside inside + // a directory given by --proto_path or the compiler will fail. The latter + // mode is generally more intuitive and easier to use, especially e.g. when + // defining implicit rules in Makefiles. + void SetInputsAreProtoPathRelative(bool enable) { + inputs_are_proto_path_relative_ = enable; + } + + // Provides some text which will be printed when the --version flag is + // used. The version of libprotoc will also be printed on the next line + // after this text. + void SetVersionInfo(const string& text) { + version_info_ = text; + } + + + private: + // ----------------------------------------------------------------- + + class ErrorPrinter; + class GeneratorContextImpl; + class MemoryOutputStream; + + // Clear state from previous Run(). + void Clear(); + + // Remaps each file in input_files_ so that it is relative to one of the + // directories in proto_path_. Returns false if an error occurred. This + // is only used if inputs_are_proto_path_relative_ is false. + bool MakeInputsBeProtoPathRelative( + DiskSourceTree* source_tree); + + // Parse all command-line arguments. + bool ParseArguments(int argc, const char* const argv[]); + + // Parses a command-line argument into a name/value pair. Returns + // true if the next argument in the argv should be used as the value, + // false otherwise. + // + // Exmaples: + // "-Isrc/protos" -> + // name = "-I", value = "src/protos" + // "--cpp_out=src/foo.pb2.cc" -> + // name = "--cpp_out", value = "src/foo.pb2.cc" + // "foo.proto" -> + // name = "", value = "foo.proto" + bool ParseArgument(const char* arg, string* name, string* value); + + // Interprets arguments parsed with ParseArgument. + bool InterpretArgument(const string& name, const string& value); + + // Print the --help text to stderr. + void PrintHelpText(); + + // Generate the given output file from the given input. + struct OutputDirective; // see below + bool GenerateOutput(const vector& parsed_files, + const OutputDirective& output_directive, + GeneratorContext* generator_context); + bool GeneratePluginOutput(const vector& parsed_files, + const string& plugin_name, + const string& parameter, + GeneratorContext* generator_context, + string* error); + + // Implements --encode and --decode. + bool EncodeOrDecode(const DescriptorPool* pool); + + // Implements the --descriptor_set_out option. + bool WriteDescriptorSet(const vector parsed_files); + + // Get all transitive dependencies of the given file (including the file + // itself), adding them to the given list of FileDescriptorProtos. The + // protos will be ordered such that every file is listed before any file that + // depends on it, so that you can call DescriptorPool::BuildFile() on them + // in order. Any files in *already_seen will not be added, and each file + // added will be inserted into *already_seen. + static void GetTransitiveDependencies( + const FileDescriptor* file, + set* already_seen, + RepeatedPtrField* output); + + // ----------------------------------------------------------------- + + // The name of the executable as invoked (i.e. argv[0]). + string executable_name_; + + // Version info set with SetVersionInfo(). + string version_info_; + + // Map from flag names to registered generators. + struct GeneratorInfo { + CodeGenerator* generator; + string help_text; + }; + typedef map GeneratorMap; + GeneratorMap generators_; + + // See AllowPlugins(). If this is empty, plugins aren't allowed. + string plugin_prefix_; + + // Maps specific plugin names to files. When executing a plugin, this map + // is searched first to find the plugin executable. If not found here, the + // PATH (or other OS-specific search strategy) is searched. + map plugins_; + + // Stuff parsed from command line. + enum Mode { + MODE_COMPILE, // Normal mode: parse .proto files and compile them. + MODE_ENCODE, // --encode: read text from stdin, write binary to stdout. + MODE_DECODE // --decode: read binary from stdin, write text to stdout. + }; + + Mode mode_; + + enum ErrorFormat { + ERROR_FORMAT_GCC, // GCC error output format (default). + ERROR_FORMAT_MSVS // Visual Studio output (--error_format=msvs). + }; + + ErrorFormat error_format_; + + vector > proto_path_; // Search path for proto files. + vector input_files_; // Names of the input proto files. + + // output_directives_ lists all the files we are supposed to output and what + // generator to use for each. + struct OutputDirective { + string name; // E.g. "--foo_out" + CodeGenerator* generator; // NULL for plugins + string parameter; + string output_location; + }; + vector output_directives_; + + // When using --encode or --decode, this names the type we are encoding or + // decoding. (Empty string indicates --decode_raw.) + string codec_type_; + + // If --descriptor_set_out was given, this is the filename to which the + // FileDescriptorSet should be written. Otherwise, empty. + string descriptor_set_name_; + + // True if --include_imports was given, meaning that we should + // write all transitive dependencies to the DescriptorSet. Otherwise, only + // the .proto files listed on the command-line are added. + bool imports_in_descriptor_set_; + + // Was the --disallow_services flag used? + bool disallow_services_; + + // See SetInputsAreProtoPathRelative(). + bool inputs_are_proto_path_relative_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CommandLineInterface); +}; + +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_COMMAND_LINE_INTERFACE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc new file mode 100644 index 000000000..d5b3a1dcd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc @@ -0,0 +1,1452 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#ifdef _MSC_VER +#include +#else +#include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +#if defined(_WIN32) +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif +#ifndef F_OK +#define F_OK 00 // not defined by MSVC for whatever reason +#endif +#endif + +namespace { + +class CommandLineInterfaceTest : public testing::Test { + protected: + virtual void SetUp(); + virtual void TearDown(); + + // Runs the CommandLineInterface with the given command line. The + // command is automatically split on spaces, and the string "$tmpdir" + // is replaced with TestTempDir(). + void Run(const string& command); + + // ----------------------------------------------------------------- + // Methods to set up the test (called before Run()). + + class NullCodeGenerator; + + // Normally plugins are allowed for all tests. Call this to explicitly + // disable them. + void DisallowPlugins() { disallow_plugins_ = true; } + + // Create a temp file within temp_directory_ with the given name. + // The containing directory is also created if necessary. + void CreateTempFile(const string& name, const string& contents); + + // Create a subdirectory within temp_directory_. + void CreateTempDir(const string& name); + + void SetInputsAreProtoPathRelative(bool enable) { + cli_.SetInputsAreProtoPathRelative(enable); + } + + // ----------------------------------------------------------------- + // Methods to check the test results (called after Run()). + + // Checks that no text was written to stderr during Run(), and Run() + // returned 0. + void ExpectNoErrors(); + + // Checks that Run() returned non-zero and the stderr output is exactly + // the text given. expected_test may contain references to "$tmpdir", + // which will be replaced by the temporary directory path. + void ExpectErrorText(const string& expected_text); + + // Checks that Run() returned non-zero and the stderr contains the given + // substring. + void ExpectErrorSubstring(const string& expected_substring); + + // Returns true if ExpectErrorSubstring(expected_substring) would pass, but + // does not fail otherwise. + bool HasAlternateErrorSubstring(const string& expected_substring); + + // Checks that MockCodeGenerator::Generate() was called in the given + // context (or the generator in test_plugin.cc, which produces the same + // output). That is, this tests if the generator with the given name + // was called with the given parameter and proto file and produced the + // given output file. This is checked by reading the output file and + // checking that it contains the content that MockCodeGenerator would + // generate given these inputs. message_name is the name of the first + // message that appeared in the proto file; this is just to make extra + // sure that the correct file was parsed. + void ExpectGenerated(const string& generator_name, + const string& parameter, + const string& proto_name, + const string& message_name); + void ExpectGenerated(const string& generator_name, + const string& parameter, + const string& proto_name, + const string& message_name, + const string& output_directory); + void ExpectGeneratedWithMultipleInputs(const string& generator_name, + const string& all_proto_names, + const string& proto_name, + const string& message_name); + void ExpectGeneratedWithInsertions(const string& generator_name, + const string& parameter, + const string& insertions, + const string& proto_name, + const string& message_name); + + void ExpectNullCodeGeneratorCalled(const string& parameter); + + void ReadDescriptorSet(const string& filename, + FileDescriptorSet* descriptor_set); + + private: + // The object we are testing. + CommandLineInterface cli_; + + // Was DisallowPlugins() called? + bool disallow_plugins_; + + // We create a directory within TestTempDir() in order to add extra + // protection against accidentally deleting user files (since we recursively + // delete this directory during the test). This is the full path of that + // directory. + string temp_directory_; + + // The result of Run(). + int return_code_; + + // The captured stderr output. + string error_text_; + + // Pointers which need to be deleted later. + vector mock_generators_to_delete_; + + NullCodeGenerator* null_generator_; +}; + +class CommandLineInterfaceTest::NullCodeGenerator : public CodeGenerator { + public: + NullCodeGenerator() : called_(false) {} + ~NullCodeGenerator() {} + + mutable bool called_; + mutable string parameter_; + + // implements CodeGenerator ---------------------------------------- + bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const { + called_ = true; + parameter_ = parameter; + return true; + } +}; + +// =================================================================== + +void CommandLineInterfaceTest::SetUp() { + // Most of these tests were written before this option was added, so we + // run with the option on (which used to be the only way) except in certain + // tests where we turn it off. + cli_.SetInputsAreProtoPathRelative(true); + + temp_directory_ = TestTempDir() + "/proto2_cli_test_temp"; + + // If the temp directory already exists, it must be left over from a + // previous run. Delete it. + if (File::Exists(temp_directory_)) { + File::DeleteRecursively(temp_directory_, NULL, NULL); + } + + // Create the temp directory. + GOOGLE_CHECK(File::CreateDir(temp_directory_.c_str(), DEFAULT_FILE_MODE)); + + // Register generators. + CodeGenerator* generator = new MockCodeGenerator("test_generator"); + mock_generators_to_delete_.push_back(generator); + cli_.RegisterGenerator("--test_out", generator, "Test output."); + cli_.RegisterGenerator("-t", generator, "Test output."); + + generator = new MockCodeGenerator("alt_generator"); + mock_generators_to_delete_.push_back(generator); + cli_.RegisterGenerator("--alt_out", generator, "Alt output."); + + generator = null_generator_ = new NullCodeGenerator(); + mock_generators_to_delete_.push_back(generator); + cli_.RegisterGenerator("--null_out", generator, "Null output."); + + disallow_plugins_ = false; +} + +void CommandLineInterfaceTest::TearDown() { + // Delete the temp directory. + File::DeleteRecursively(temp_directory_, NULL, NULL); + + // Delete all the MockCodeGenerators. + for (int i = 0; i < mock_generators_to_delete_.size(); i++) { + delete mock_generators_to_delete_[i]; + } + mock_generators_to_delete_.clear(); +} + +void CommandLineInterfaceTest::Run(const string& command) { + vector args; + SplitStringUsing(command, " ", &args); + + if (!disallow_plugins_) { + cli_.AllowPlugins("prefix-"); + const char* possible_paths[] = { + // When building with shared libraries, libtool hides the real executable + // in .libs and puts a fake wrapper in the current directory. + // Unfortunately, due to an apparent bug on Cygwin/MinGW, if one program + // wrapped in this way (e.g. protobuf-tests.exe) tries to execute another + // program wrapped in this way (e.g. test_plugin.exe), the latter fails + // with error code 127 and no explanation message. Presumably the problem + // is that the wrapper for protobuf-tests.exe set some environment + // variables that confuse the wrapper for test_plugin.exe. Luckily, it + // turns out that if we simply invoke the wrapped test_plugin.exe + // directly, it works -- I guess the environment variables set by the + // protobuf-tests.exe wrapper happen to be correct for it too. So we do + // that. + ".libs/test_plugin.exe", // Win32 w/autotool (Cygwin / MinGW) + "test_plugin.exe", // Other Win32 (MSVC) + "test_plugin", // Unix + }; + + string plugin_path; + + for (int i = 0; i < GOOGLE_ARRAYSIZE(possible_paths); i++) { + if (access(possible_paths[i], F_OK) == 0) { + plugin_path = possible_paths[i]; + break; + } + } + + if (plugin_path.empty()) { + GOOGLE_LOG(ERROR) + << "Plugin executable not found. Plugin tests are likely to fail."; + } else { + args.push_back("--plugin=prefix-gen-plug=" + plugin_path); + } + } + + scoped_array argv(new const char*[args.size()]); + + for (int i = 0; i < args.size(); i++) { + args[i] = StringReplace(args[i], "$tmpdir", temp_directory_, true); + argv[i] = args[i].c_str(); + } + + CaptureTestStderr(); + + return_code_ = cli_.Run(args.size(), argv.get()); + + error_text_ = GetCapturedTestStderr(); +} + +// ------------------------------------------------------------------- + +void CommandLineInterfaceTest::CreateTempFile( + const string& name, + const string& contents) { + // Create parent directory, if necessary. + string::size_type slash_pos = name.find_last_of('/'); + if (slash_pos != string::npos) { + string dir = name.substr(0, slash_pos); + File::RecursivelyCreateDir(temp_directory_ + "/" + dir, 0777); + } + + // Write file. + string full_name = temp_directory_ + "/" + name; + File::WriteStringToFileOrDie(contents, full_name); +} + +void CommandLineInterfaceTest::CreateTempDir(const string& name) { + File::RecursivelyCreateDir(temp_directory_ + "/" + name, 0777); +} + +// ------------------------------------------------------------------- + +void CommandLineInterfaceTest::ExpectNoErrors() { + EXPECT_EQ(0, return_code_); + EXPECT_EQ("", error_text_); +} + +void CommandLineInterfaceTest::ExpectErrorText(const string& expected_text) { + EXPECT_NE(0, return_code_); + EXPECT_EQ(StringReplace(expected_text, "$tmpdir", temp_directory_, true), + error_text_); +} + +void CommandLineInterfaceTest::ExpectErrorSubstring( + const string& expected_substring) { + EXPECT_NE(0, return_code_); + EXPECT_PRED_FORMAT2(testing::IsSubstring, expected_substring, error_text_); +} + +bool CommandLineInterfaceTest::HasAlternateErrorSubstring( + const string& expected_substring) { + EXPECT_NE(0, return_code_); + return error_text_.find(expected_substring) != string::npos; +} + +void CommandLineInterfaceTest::ExpectGenerated( + const string& generator_name, + const string& parameter, + const string& proto_name, + const string& message_name) { + MockCodeGenerator::ExpectGenerated( + generator_name, parameter, "", proto_name, message_name, proto_name, + temp_directory_); +} + +void CommandLineInterfaceTest::ExpectGenerated( + const string& generator_name, + const string& parameter, + const string& proto_name, + const string& message_name, + const string& output_directory) { + MockCodeGenerator::ExpectGenerated( + generator_name, parameter, "", proto_name, message_name, proto_name, + temp_directory_ + "/" + output_directory); +} + +void CommandLineInterfaceTest::ExpectGeneratedWithMultipleInputs( + const string& generator_name, + const string& all_proto_names, + const string& proto_name, + const string& message_name) { + MockCodeGenerator::ExpectGenerated( + generator_name, "", "", proto_name, message_name, + all_proto_names, + temp_directory_); +} + +void CommandLineInterfaceTest::ExpectGeneratedWithInsertions( + const string& generator_name, + const string& parameter, + const string& insertions, + const string& proto_name, + const string& message_name) { + MockCodeGenerator::ExpectGenerated( + generator_name, parameter, insertions, proto_name, message_name, + proto_name, temp_directory_); +} + +void CommandLineInterfaceTest::ExpectNullCodeGeneratorCalled( + const string& parameter) { + EXPECT_TRUE(null_generator_->called_); + EXPECT_EQ(parameter, null_generator_->parameter_); +} + +void CommandLineInterfaceTest::ReadDescriptorSet( + const string& filename, FileDescriptorSet* descriptor_set) { + string path = temp_directory_ + "/" + filename; + string file_contents; + if (!File::ReadFileToString(path, &file_contents)) { + FAIL() << "File not found: " << path; + } + if (!descriptor_set->ParseFromString(file_contents)) { + FAIL() << "Could not parse file contents: " << path; + } +} + +// =================================================================== + +TEST_F(CommandLineInterfaceTest, BasicOutput) { + // Test that the common case works. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, BasicPlugin) { + // Test that basic plugins work. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --plug_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_plugin", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, GeneratorAndPlugin) { + // Invoke a generator and a plugin at the same time. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); + ExpectGenerated("test_plugin", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, MultipleInputs) { + // Test parsing multiple input files. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + CreateTempFile("bar.proto", + "syntax = \"proto2\";\n" + "message Bar {}\n"); + + Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " + "--proto_path=$tmpdir foo.proto bar.proto"); + + ExpectNoErrors(); + ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", + "foo.proto", "Foo"); + ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", + "bar.proto", "Bar"); + ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", + "foo.proto", "Foo"); + ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", + "bar.proto", "Bar"); +} + +TEST_F(CommandLineInterfaceTest, MultipleInputsWithImport) { + // Test parsing multiple input files with an import of a separate file. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + CreateTempFile("bar.proto", + "syntax = \"proto2\";\n" + "import \"baz.proto\";\n" + "message Bar {\n" + " optional Baz a = 1;\n" + "}\n"); + CreateTempFile("baz.proto", + "syntax = \"proto2\";\n" + "message Baz {}\n"); + + Run("protocol_compiler --test_out=$tmpdir --plug_out=$tmpdir " + "--proto_path=$tmpdir foo.proto bar.proto"); + + ExpectNoErrors(); + ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", + "foo.proto", "Foo"); + ExpectGeneratedWithMultipleInputs("test_generator", "foo.proto,bar.proto", + "bar.proto", "Bar"); + ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", + "foo.proto", "Foo"); + ExpectGeneratedWithMultipleInputs("test_plugin", "foo.proto,bar.proto", + "bar.proto", "Bar"); +} + +TEST_F(CommandLineInterfaceTest, CreateDirectory) { + // Test that when we output to a sub-directory, it is created. + + CreateTempFile("bar/baz/foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + CreateTempDir("out"); + CreateTempDir("plugout"); + + Run("protocol_compiler --test_out=$tmpdir/out --plug_out=$tmpdir/plugout " + "--proto_path=$tmpdir bar/baz/foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "bar/baz/foo.proto", "Foo", "out"); + ExpectGenerated("test_plugin", "", "bar/baz/foo.proto", "Foo", "plugout"); +} + +TEST_F(CommandLineInterfaceTest, GeneratorParameters) { + // Test that generator parameters are correctly parsed from the command line. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=TestParameter:$tmpdir " + "--plug_out=TestPluginParameter:$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "TestParameter", "foo.proto", "Foo"); + ExpectGenerated("test_plugin", "TestPluginParameter", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, Insert) { + // Test running a generator that inserts code into another's output. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler " + "--test_out=TestParameter:$tmpdir " + "--plug_out=TestPluginParameter:$tmpdir " + "--test_out=insert=test_generator,test_plugin:$tmpdir " + "--plug_out=insert=test_generator,test_plugin:$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGeneratedWithInsertions( + "test_generator", "TestParameter", "test_generator,test_plugin", + "foo.proto", "Foo"); + ExpectGeneratedWithInsertions( + "test_plugin", "TestPluginParameter", "test_generator,test_plugin", + "foo.proto", "Foo"); +} + +#if defined(_WIN32) + +TEST_F(CommandLineInterfaceTest, WindowsOutputPath) { + // Test that the output path can be a Windows-style path. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n"); + + Run("protocol_compiler --null_out=C:\\ " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectNullCodeGeneratorCalled(""); +} + +TEST_F(CommandLineInterfaceTest, WindowsOutputPathAndParameter) { + // Test that we can have a windows-style output path and a parameter. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n"); + + Run("protocol_compiler --null_out=bar:C:\\ " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectNullCodeGeneratorCalled("bar"); +} + +TEST_F(CommandLineInterfaceTest, TrailingBackslash) { + // Test that the directories can end in backslashes. Some users claim this + // doesn't work on their system. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=$tmpdir\\ " + "--proto_path=$tmpdir\\ foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +#endif // defined(_WIN32) || defined(__CYGWIN__) + +TEST_F(CommandLineInterfaceTest, PathLookup) { + // Test that specifying multiple directories in the proto search path works. + + CreateTempFile("b/bar.proto", + "syntax = \"proto2\";\n" + "message Bar {}\n"); + CreateTempFile("a/foo.proto", + "syntax = \"proto2\";\n" + "import \"bar.proto\";\n" + "message Foo {\n" + " optional Bar a = 1;\n" + "}\n"); + CreateTempFile("b/foo.proto", "this should not be parsed\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir/a --proto_path=$tmpdir/b foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, ColonDelimitedPath) { + // Same as PathLookup, but we provide the proto_path in a single flag. + + CreateTempFile("b/bar.proto", + "syntax = \"proto2\";\n" + "message Bar {}\n"); + CreateTempFile("a/foo.proto", + "syntax = \"proto2\";\n" + "import \"bar.proto\";\n" + "message Foo {\n" + " optional Bar a = 1;\n" + "}\n"); + CreateTempFile("b/foo.proto", "this should not be parsed\n"); + +#undef PATH_SEPARATOR +#if defined(_WIN32) +#define PATH_SEPARATOR ";" +#else +#define PATH_SEPARATOR ":" +#endif + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir/a"PATH_SEPARATOR"$tmpdir/b foo.proto"); + +#undef PATH_SEPARATOR + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, NonRootMapping) { + // Test setting up a search path mapping a directory to a non-root location. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=bar=$tmpdir bar/foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "bar/foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, MultipleGenerators) { + // Test that we can have multiple generators and use both in one invocation, + // each with a different output directory. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + // Create the "a" and "b" sub-directories. + CreateTempDir("a"); + CreateTempDir("b"); + + Run("protocol_compiler " + "--test_out=$tmpdir/a " + "--alt_out=$tmpdir/b " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo", "a"); + ExpectGenerated("alt_generator", "", "foo.proto", "Foo", "b"); +} + +TEST_F(CommandLineInterfaceTest, DisallowServicesNoServices) { + // Test that --disallow_services doesn't cause a problem when there are no + // services. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --disallow_services --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, DisallowServicesHasService) { + // Test that --disallow_services produces an error when there are services. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n" + "service Bar {}\n"); + + Run("protocol_compiler --disallow_services --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorSubstring("foo.proto: This file contains services"); +} + +TEST_F(CommandLineInterfaceTest, AllowServicesHasService) { + // Test that services work fine as long as --disallow_services is not used. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n" + "service Bar {}\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, CwdRelativeInputs) { + // Test that we can accept working-directory-relative input files. + + SetInputsAreProtoPathRelative(false); + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir $tmpdir/foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, WriteDescriptorSet) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + CreateTempFile("bar.proto", + "syntax = \"proto2\";\n" + "import \"foo.proto\";\n" + "message Bar {\n" + " optional Foo foo = 1;\n" + "}\n"); + + Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set " + "--proto_path=$tmpdir bar.proto"); + + ExpectNoErrors(); + + FileDescriptorSet descriptor_set; + ReadDescriptorSet("descriptor_set", &descriptor_set); + if (HasFatalFailure()) return; + ASSERT_EQ(1, descriptor_set.file_size()); + EXPECT_EQ("bar.proto", descriptor_set.file(0).name()); +} + +TEST_F(CommandLineInterfaceTest, WriteTransitiveDescriptorSet) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + CreateTempFile("bar.proto", + "syntax = \"proto2\";\n" + "import \"foo.proto\";\n" + "message Bar {\n" + " optional Foo foo = 1;\n" + "}\n"); + + Run("protocol_compiler --descriptor_set_out=$tmpdir/descriptor_set " + "--include_imports --proto_path=$tmpdir bar.proto"); + + ExpectNoErrors(); + + FileDescriptorSet descriptor_set; + ReadDescriptorSet("descriptor_set", &descriptor_set); + if (HasFatalFailure()) return; + ASSERT_EQ(2, descriptor_set.file_size()); + if (descriptor_set.file(0).name() == "bar.proto") { + std::swap(descriptor_set.mutable_file()->mutable_data()[0], + descriptor_set.mutable_file()->mutable_data()[1]); + } + EXPECT_EQ("foo.proto", descriptor_set.file(0).name()); + EXPECT_EQ("bar.proto", descriptor_set.file(1).name()); +} + +// ------------------------------------------------------------------- + +TEST_F(CommandLineInterfaceTest, ParseErrors) { + // Test that parse errors are reported. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "badsyntax\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorText( + "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n"); +} + +TEST_F(CommandLineInterfaceTest, ParseErrorsMultipleFiles) { + // Test that parse errors are reported from multiple files. + + // We set up files such that foo.proto actually depends on bar.proto in + // two ways: Directly and through baz.proto. bar.proto's errors should + // only be reported once. + CreateTempFile("bar.proto", + "syntax = \"proto2\";\n" + "badsyntax\n"); + CreateTempFile("baz.proto", + "syntax = \"proto2\";\n" + "import \"bar.proto\";\n"); + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "import \"bar.proto\";\n" + "import \"baz.proto\";\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorText( + "bar.proto:2:1: Expected top-level statement (e.g. \"message\").\n" + "baz.proto: Import \"bar.proto\" was not found or had errors.\n" + "foo.proto: Import \"bar.proto\" was not found or had errors.\n" + "foo.proto: Import \"baz.proto\" was not found or had errors.\n"); +} + +TEST_F(CommandLineInterfaceTest, InputNotFoundError) { + // Test what happens if the input file is not found. + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorText( + "foo.proto: File not found.\n"); +} + +TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundError) { + // Test what happens when a working-directory-relative input file is not + // found. + + SetInputsAreProtoPathRelative(false); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir $tmpdir/foo.proto"); + + ExpectErrorText( + "$tmpdir/foo.proto: No such file or directory\n"); +} + +TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotMappedError) { + // Test what happens when a working-directory-relative input file is not + // mapped to a virtual path. + + SetInputsAreProtoPathRelative(false); + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + // Create a directory called "bar" so that we can point --proto_path at it. + CreateTempFile("bar/dummy", ""); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir/bar $tmpdir/foo.proto"); + + ExpectErrorText( + "$tmpdir/foo.proto: File does not reside within any path " + "specified using --proto_path (or -I). You must specify a " + "--proto_path which encompasses this file. Note that the " + "proto_path must be an exact prefix of the .proto file " + "names -- protoc is too dumb to figure out when two paths " + "(e.g. absolute and relative) are equivalent (it's harder " + "than you think).\n"); +} + +TEST_F(CommandLineInterfaceTest, CwdRelativeInputNotFoundAndNotMappedError) { + // Check what happens if the input file is not found *and* is not mapped + // in the proto_path. + + SetInputsAreProtoPathRelative(false); + + // Create a directory called "bar" so that we can point --proto_path at it. + CreateTempFile("bar/dummy", ""); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir/bar $tmpdir/foo.proto"); + + ExpectErrorText( + "$tmpdir/foo.proto: No such file or directory\n"); +} + +TEST_F(CommandLineInterfaceTest, CwdRelativeInputShadowedError) { + // Test what happens when a working-directory-relative input file is shadowed + // by another file in the virtual path. + + SetInputsAreProtoPathRelative(false); + + CreateTempFile("foo/foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + CreateTempFile("bar/foo.proto", + "syntax = \"proto2\";\n" + "message Bar {}\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir/foo --proto_path=$tmpdir/bar " + "$tmpdir/bar/foo.proto"); + + ExpectErrorText( + "$tmpdir/bar/foo.proto: Input is shadowed in the --proto_path " + "by \"$tmpdir/foo/foo.proto\". Either use the latter " + "file as your input or reorder the --proto_path so that the " + "former file's location comes first.\n"); +} + +TEST_F(CommandLineInterfaceTest, ProtoPathNotFoundError) { + // Test what happens if the input file is not found. + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir/foo foo.proto"); + + ExpectErrorText( + "$tmpdir/foo: warning: directory does not exist.\n" + "foo.proto: File not found.\n"); +} + +TEST_F(CommandLineInterfaceTest, MissingInputError) { + // Test that we get an error if no inputs are given. + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir"); + + ExpectErrorText("Missing input file.\n"); +} + +TEST_F(CommandLineInterfaceTest, MissingOutputError) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --proto_path=$tmpdir foo.proto"); + + ExpectErrorText("Missing output directives.\n"); +} + +TEST_F(CommandLineInterfaceTest, OutputWriteError) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + string output_file = + MockCodeGenerator::GetOutputFileName("test_generator", "foo.proto"); + + // Create a directory blocking our output location. + CreateTempDir(output_file); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + // MockCodeGenerator no longer detects an error because we actually write to + // an in-memory location first, then dump to disk at the end. This is no + // big deal. + // ExpectErrorSubstring("MockCodeGenerator detected write error."); + +#if defined(_WIN32) && !defined(__CYGWIN__) + // Windows with MSVCRT.dll produces EPERM instead of EISDIR. + if (HasAlternateErrorSubstring(output_file + ": Permission denied")) { + return; + } +#endif + + ExpectErrorSubstring(output_file + ": Is a directory"); +} + +TEST_F(CommandLineInterfaceTest, PluginOutputWriteError) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + string output_file = + MockCodeGenerator::GetOutputFileName("test_plugin", "foo.proto"); + + // Create a directory blocking our output location. + CreateTempDir(output_file); + + Run("protocol_compiler --plug_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + +#if defined(_WIN32) && !defined(__CYGWIN__) + // Windows with MSVCRT.dll produces EPERM instead of EISDIR. + if (HasAlternateErrorSubstring(output_file + ": Permission denied")) { + return; + } +#endif + + ExpectErrorSubstring(output_file + ": Is a directory"); +} + +TEST_F(CommandLineInterfaceTest, OutputDirectoryNotFoundError) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=$tmpdir/nosuchdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorSubstring("nosuchdir/: No such file or directory"); +} + +TEST_F(CommandLineInterfaceTest, PluginOutputDirectoryNotFoundError) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --plug_out=$tmpdir/nosuchdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorSubstring("nosuchdir/: No such file or directory"); +} + +TEST_F(CommandLineInterfaceTest, OutputDirectoryIsFileError) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out=$tmpdir/foo.proto " + "--proto_path=$tmpdir foo.proto"); + +#if defined(_WIN32) && !defined(__CYGWIN__) + // Windows with MSVCRT.dll produces EINVAL instead of ENOTDIR. + if (HasAlternateErrorSubstring("foo.proto/: Invalid argument")) { + return; + } +#endif + + ExpectErrorSubstring("foo.proto/: Not a directory"); +} + +TEST_F(CommandLineInterfaceTest, GeneratorError) { + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message MockCodeGenerator_Error {}\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorSubstring( + "--test_out: foo.proto: Saw message type MockCodeGenerator_Error."); +} + +TEST_F(CommandLineInterfaceTest, GeneratorPluginError) { + // Test a generator plugin that returns an error. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message MockCodeGenerator_Error {}\n"); + + Run("protocol_compiler --plug_out=TestParameter:$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorSubstring( + "--plug_out: foo.proto: Saw message type MockCodeGenerator_Error."); +} + +TEST_F(CommandLineInterfaceTest, GeneratorPluginFail) { + // Test a generator plugin that exits with an error code. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message MockCodeGenerator_Exit {}\n"); + + Run("protocol_compiler --plug_out=TestParameter:$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorSubstring("Saw message type MockCodeGenerator_Exit."); + ExpectErrorSubstring( + "--plug_out: prefix-gen-plug: Plugin failed with status code 123."); +} + +TEST_F(CommandLineInterfaceTest, GeneratorPluginCrash) { + // Test a generator plugin that crashes. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message MockCodeGenerator_Abort {}\n"); + + Run("protocol_compiler --plug_out=TestParameter:$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectErrorSubstring("Saw message type MockCodeGenerator_Abort."); + +#ifdef _WIN32 + // Windows doesn't have signals. It looks like abort()ing causes the process + // to exit with status code 3, but let's not depend on the exact number here. + ExpectErrorSubstring( + "--plug_out: prefix-gen-plug: Plugin failed with status code"); +#else + // Don't depend on the exact signal number. + ExpectErrorSubstring( + "--plug_out: prefix-gen-plug: Plugin killed by signal"); +#endif +} + +TEST_F(CommandLineInterfaceTest, GeneratorPluginNotFound) { + // Test what happens if the plugin isn't found. + + CreateTempFile("error.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --badplug_out=TestParameter:$tmpdir " + "--plugin=prefix-gen-badplug=no_such_file " + "--proto_path=$tmpdir error.proto"); + +#ifdef _WIN32 + ExpectErrorSubstring("--badplug_out: prefix-gen-badplug: " + + Subprocess::Win32ErrorMessage(ERROR_FILE_NOT_FOUND)); +#else + // Error written to stdout by child process after exec() fails. + ExpectErrorSubstring( + "no_such_file: program not found or is not executable"); + + // Error written by parent process when child fails. + ExpectErrorSubstring( + "--badplug_out: prefix-gen-badplug: Plugin failed with status code 1."); +#endif +} + +TEST_F(CommandLineInterfaceTest, GeneratorPluginNotAllowed) { + // Test what happens if plugins aren't allowed. + + CreateTempFile("error.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + DisallowPlugins(); + Run("protocol_compiler --plug_out=TestParameter:$tmpdir " + "--proto_path=$tmpdir error.proto"); + + ExpectErrorSubstring("Unknown flag: --plug_out"); +} + +TEST_F(CommandLineInterfaceTest, HelpText) { + Run("test_exec_name --help"); + + ExpectErrorSubstring("Usage: test_exec_name "); + ExpectErrorSubstring("--test_out=OUT_DIR"); + ExpectErrorSubstring("Test output."); + ExpectErrorSubstring("--alt_out=OUT_DIR"); + ExpectErrorSubstring("Alt output."); +} + +TEST_F(CommandLineInterfaceTest, GccFormatErrors) { + // Test --error_format=gcc (which is the default, but we want to verify + // that it can be set explicitly). + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "badsyntax\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir --error_format=gcc foo.proto"); + + ExpectErrorText( + "foo.proto:2:1: Expected top-level statement (e.g. \"message\").\n"); +} + +TEST_F(CommandLineInterfaceTest, MsvsFormatErrors) { + // Test --error_format=msvs + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "badsyntax\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir --error_format=msvs foo.proto"); + + ExpectErrorText( + "$tmpdir/foo.proto(2) : error in column=1: Expected top-level statement " + "(e.g. \"message\").\n"); +} + +TEST_F(CommandLineInterfaceTest, InvalidErrorFormat) { + // Test --error_format=msvs + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "badsyntax\n"); + + Run("protocol_compiler --test_out=$tmpdir " + "--proto_path=$tmpdir --error_format=invalid foo.proto"); + + ExpectErrorText( + "Unknown error format: invalid\n"); +} + +// ------------------------------------------------------------------- +// Flag parsing tests + +TEST_F(CommandLineInterfaceTest, ParseSingleCharacterFlag) { + // Test that a single-character flag works. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler -t$tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, ParseSpaceDelimitedValue) { + // Test that separating the flag value with a space works. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler --test_out $tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, ParseSingleCharacterSpaceDelimitedValue) { + // Test that separating the flag value with a space works for + // single-character flags. + + CreateTempFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + Run("protocol_compiler -t $tmpdir " + "--proto_path=$tmpdir foo.proto"); + + ExpectNoErrors(); + ExpectGenerated("test_generator", "", "foo.proto", "Foo"); +} + +TEST_F(CommandLineInterfaceTest, MissingValueError) { + // Test that we get an error if a flag is missing its value. + + Run("protocol_compiler --test_out --proto_path=$tmpdir foo.proto"); + + ExpectErrorText("Missing value for flag: --test_out\n"); +} + +TEST_F(CommandLineInterfaceTest, MissingValueAtEndError) { + // Test that we get an error if the last argument is a flag requiring a + // value. + + Run("protocol_compiler --test_out"); + + ExpectErrorText("Missing value for flag: --test_out\n"); +} + +// =================================================================== + +// Test for --encode and --decode. Note that it would be easier to do this +// test as a shell script, but we'd like to be able to run the test on +// platforms that don't have a Bourne-compatible shell available (especially +// Windows/MSVC). +class EncodeDecodeTest : public testing::Test { + protected: + virtual void SetUp() { + duped_stdin_ = dup(STDIN_FILENO); + } + + virtual void TearDown() { + dup2(duped_stdin_, STDIN_FILENO); + close(duped_stdin_); + } + + void RedirectStdinFromText(const string& input) { + string filename = TestTempDir() + "/test_stdin"; + File::WriteStringToFileOrDie(input, filename); + GOOGLE_CHECK(RedirectStdinFromFile(filename)); + } + + bool RedirectStdinFromFile(const string& filename) { + int fd = open(filename.c_str(), O_RDONLY); + if (fd < 0) return false; + dup2(fd, STDIN_FILENO); + close(fd); + return true; + } + + // Remove '\r' characters from text. + string StripCR(const string& text) { + string result; + + for (int i = 0; i < text.size(); i++) { + if (text[i] != '\r') { + result.push_back(text[i]); + } + } + + return result; + } + + enum Type { TEXT, BINARY }; + enum ReturnCode { SUCCESS, ERROR }; + + bool Run(const string& command) { + vector args; + args.push_back("protoc"); + SplitStringUsing(command, " ", &args); + args.push_back("--proto_path=" + TestSourceDir()); + + scoped_array argv(new const char*[args.size()]); + for (int i = 0; i < args.size(); i++) { + argv[i] = args[i].c_str(); + } + + CommandLineInterface cli; + cli.SetInputsAreProtoPathRelative(true); + + CaptureTestStdout(); + CaptureTestStderr(); + + int result = cli.Run(args.size(), argv.get()); + + captured_stdout_ = GetCapturedTestStdout(); + captured_stderr_ = GetCapturedTestStderr(); + + return result == 0; + } + + void ExpectStdoutMatchesBinaryFile(const string& filename) { + string expected_output; + ASSERT_TRUE(File::ReadFileToString(filename, &expected_output)); + + // Don't use EXPECT_EQ because we don't want to print raw binary data to + // stdout on failure. + EXPECT_TRUE(captured_stdout_ == expected_output); + } + + void ExpectStdoutMatchesTextFile(const string& filename) { + string expected_output; + ASSERT_TRUE(File::ReadFileToString(filename, &expected_output)); + + ExpectStdoutMatchesText(expected_output); + } + + void ExpectStdoutMatchesText(const string& expected_text) { + EXPECT_EQ(StripCR(expected_text), StripCR(captured_stdout_)); + } + + void ExpectStderrMatchesText(const string& expected_text) { + EXPECT_EQ(StripCR(expected_text), StripCR(captured_stderr_)); + } + + private: + int duped_stdin_; + string captured_stdout_; + string captured_stderr_; +}; + +TEST_F(EncodeDecodeTest, Encode) { + RedirectStdinFromFile(TestSourceDir() + + "/google/protobuf/testdata/text_format_unittest_data.txt"); + EXPECT_TRUE(Run("google/protobuf/unittest.proto " + "--encode=protobuf_unittest.TestAllTypes")); + ExpectStdoutMatchesBinaryFile(TestSourceDir() + + "/google/protobuf/testdata/golden_message"); + ExpectStderrMatchesText(""); +} + +TEST_F(EncodeDecodeTest, Decode) { + RedirectStdinFromFile(TestSourceDir() + + "/google/protobuf/testdata/golden_message"); + EXPECT_TRUE(Run("google/protobuf/unittest.proto " + "--decode=protobuf_unittest.TestAllTypes")); + ExpectStdoutMatchesTextFile(TestSourceDir() + + "/google/protobuf/testdata/text_format_unittest_data.txt"); + ExpectStderrMatchesText(""); +} + +TEST_F(EncodeDecodeTest, Partial) { + RedirectStdinFromText(""); + EXPECT_TRUE(Run("google/protobuf/unittest.proto " + "--encode=protobuf_unittest.TestRequired")); + ExpectStdoutMatchesText(""); + ExpectStderrMatchesText( + "warning: Input message is missing required fields: a, b, c\n"); +} + +TEST_F(EncodeDecodeTest, DecodeRaw) { + protobuf_unittest::TestAllTypes message; + message.set_optional_int32(123); + message.set_optional_string("foo"); + string data; + message.SerializeToString(&data); + + RedirectStdinFromText(data); + EXPECT_TRUE(Run("--decode_raw")); + ExpectStdoutMatchesText("1: 123\n" + "14: \"foo\"\n"); + ExpectStderrMatchesText(""); +} + +TEST_F(EncodeDecodeTest, UnknownType) { + EXPECT_FALSE(Run("google/protobuf/unittest.proto " + "--encode=NoSuchType")); + ExpectStdoutMatchesText(""); + ExpectStderrMatchesText("Type not defined: NoSuchType\n"); +} + +TEST_F(EncodeDecodeTest, ProtoParseError) { + EXPECT_FALSE(Run("google/protobuf/no_such_file.proto " + "--encode=NoSuchType")); + ExpectStdoutMatchesText(""); + ExpectStderrMatchesText( + "google/protobuf/no_such_file.proto: File not found.\n"); +} + +} // anonymous namespace + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc new file mode 100644 index 000000000..bcfa50207 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc @@ -0,0 +1,158 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This test insures that google/protobuf/descriptor.pb.{h,cc} match exactly +// what would be generated by the protocol compiler. These files are not +// generated automatically at build time because they are compiled into the +// protocol compiler itself. So, if they were auto-generated, you'd have a +// chicken-and-egg problem. +// +// If this test fails, run the script +// "generate_descriptor_proto.sh" and add +// descriptor.pb.{h,cc} to your changelist. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +namespace { + +class MockErrorCollector : public MultiFileErrorCollector { + public: + MockErrorCollector() {} + ~MockErrorCollector() {} + + string text_; + + // implements ErrorCollector --------------------------------------- + void AddError(const string& filename, int line, int column, + const string& message) { + strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", + filename, line, column, message); + } +}; + +class MockGeneratorContext : public GeneratorContext { + public: + MockGeneratorContext() {} + ~MockGeneratorContext() { + STLDeleteValues(&files_); + } + + void ExpectFileMatches(const string& virtual_filename, + const string& physical_filename) { + string* expected_contents = FindPtrOrNull(files_, virtual_filename); + ASSERT_TRUE(expected_contents != NULL) + << "Generator failed to generate file: " << virtual_filename; + + string actual_contents; + File::ReadFileToStringOrDie( + TestSourceDir() + "/" + physical_filename, + &actual_contents); + EXPECT_TRUE(actual_contents == *expected_contents) + << physical_filename << " needs to be regenerated. Please run " + "generate_descriptor_proto.sh and add this file " + "to your CL."; + } + + // implements GeneratorContext -------------------------------------- + + virtual io::ZeroCopyOutputStream* Open(const string& filename) { + string** map_slot = &files_[filename]; + if (*map_slot != NULL) delete *map_slot; + *map_slot = new string; + + return new io::StringOutputStream(*map_slot); + } + + private: + map files_; +}; + +TEST(BootstrapTest, GeneratedDescriptorMatches) { + MockErrorCollector error_collector; + DiskSourceTree source_tree; + source_tree.MapPath("", TestSourceDir()); + Importer importer(&source_tree, &error_collector); + const FileDescriptor* proto_file = + importer.Import("google/protobuf/descriptor.proto"); + const FileDescriptor* plugin_proto_file = + importer.Import("google/protobuf/compiler/plugin.proto"); + EXPECT_EQ("", error_collector.text_); + ASSERT_TRUE(proto_file != NULL); + ASSERT_TRUE(plugin_proto_file != NULL); + + CppGenerator generator; + MockGeneratorContext context; + string error; + string parameter; + parameter = "dllexport_decl=LIBPROTOBUF_EXPORT"; + ASSERT_TRUE(generator.Generate(proto_file, parameter, + &context, &error)); + parameter = "dllexport_decl=LIBPROTOC_EXPORT"; + ASSERT_TRUE(generator.Generate(plugin_proto_file, parameter, + &context, &error)); + + context.ExpectFileMatches("google/protobuf/descriptor.pb.h", + "google/protobuf/descriptor.pb.h"); + context.ExpectFileMatches("google/protobuf/descriptor.pb.cc", + "google/protobuf/descriptor.pb.cc"); + context.ExpectFileMatches("google/protobuf/compiler/plugin.pb.h", + "google/protobuf/compiler/plugin.pb.h"); + context.ExpectFileMatches("google/protobuf/compiler/plugin.pb.cc", + "google/protobuf/compiler/plugin.pb.cc"); +} + +} // namespace + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc new file mode 100644 index 000000000..76d2b7985 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc @@ -0,0 +1,258 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor, + const string& dllexport_decl) + : descriptor_(descriptor), + classname_(ClassName(descriptor, false)), + dllexport_decl_(dllexport_decl) { +} + +EnumGenerator::~EnumGenerator() {} + +void EnumGenerator::GenerateDefinition(io::Printer* printer) { + map vars; + vars["classname"] = classname_; + vars["short_name"] = descriptor_->name(); + + printer->Print(vars, "enum $classname$ {\n"); + printer->Indent(); + + const EnumValueDescriptor* min_value = descriptor_->value(0); + const EnumValueDescriptor* max_value = descriptor_->value(0); + + for (int i = 0; i < descriptor_->value_count(); i++) { + vars["name"] = descriptor_->value(i)->name(); + vars["number"] = SimpleItoa(descriptor_->value(i)->number()); + vars["prefix"] = (descriptor_->containing_type() == NULL) ? + "" : classname_ + "_"; + + if (i > 0) printer->Print(",\n"); + printer->Print(vars, "$prefix$$name$ = $number$"); + + if (descriptor_->value(i)->number() < min_value->number()) { + min_value = descriptor_->value(i); + } + if (descriptor_->value(i)->number() > max_value->number()) { + max_value = descriptor_->value(i); + } + } + + printer->Outdent(); + printer->Print("\n};\n"); + + vars["min_name"] = min_value->name(); + vars["max_name"] = max_value->name(); + + if (dllexport_decl_.empty()) { + vars["dllexport"] = ""; + } else { + vars["dllexport"] = dllexport_decl_ + " "; + } + + printer->Print(vars, + "$dllexport$bool $classname$_IsValid(int value);\n" + "const $classname$ $prefix$$short_name$_MIN = $prefix$$min_name$;\n" + "const $classname$ $prefix$$short_name$_MAX = $prefix$$max_name$;\n" + "const int $prefix$$short_name$_ARRAYSIZE = $prefix$$short_name$_MAX + 1;\n" + "\n"); + + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print(vars, + "$dllexport$const ::google::protobuf::EnumDescriptor* $classname$_descriptor();\n"); + // The _Name and _Parse methods + printer->Print(vars, + "inline const ::std::string& $classname$_Name($classname$ value) {\n" + " return ::google::protobuf::internal::NameOfEnum(\n" + " $classname$_descriptor(), value);\n" + "}\n"); + printer->Print(vars, + "inline bool $classname$_Parse(\n" + " const ::std::string& name, $classname$* value) {\n" + " return ::google::protobuf::internal::ParseNamedEnum<$classname$>(\n" + " $classname$_descriptor(), name, value);\n" + "}\n"); + } +} + +void EnumGenerator:: +GenerateGetEnumDescriptorSpecializations(io::Printer* printer) { + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print( + "template <>\n" + "inline const EnumDescriptor* GetEnumDescriptor< $classname$>() {\n" + " return $classname$_descriptor();\n" + "}\n", + "classname", ClassName(descriptor_, true)); + } +} + +void EnumGenerator::GenerateSymbolImports(io::Printer* printer) { + map vars; + vars["nested_name"] = descriptor_->name(); + vars["classname"] = classname_; + printer->Print(vars, "typedef $classname$ $nested_name$;\n"); + + for (int j = 0; j < descriptor_->value_count(); j++) { + vars["tag"] = descriptor_->value(j)->name(); + printer->Print(vars, + "static const $nested_name$ $tag$ = $classname$_$tag$;\n"); + } + + printer->Print(vars, + "static inline bool $nested_name$_IsValid(int value) {\n" + " return $classname$_IsValid(value);\n" + "}\n" + "static const $nested_name$ $nested_name$_MIN =\n" + " $classname$_$nested_name$_MIN;\n" + "static const $nested_name$ $nested_name$_MAX =\n" + " $classname$_$nested_name$_MAX;\n" + "static const int $nested_name$_ARRAYSIZE =\n" + " $classname$_$nested_name$_ARRAYSIZE;\n"); + + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print(vars, + "static inline const ::google::protobuf::EnumDescriptor*\n" + "$nested_name$_descriptor() {\n" + " return $classname$_descriptor();\n" + "}\n"); + printer->Print(vars, + "static inline const ::std::string& $nested_name$_Name($nested_name$ value) {\n" + " return $classname$_Name(value);\n" + "}\n"); + printer->Print(vars, + "static inline bool $nested_name$_Parse(const ::std::string& name,\n" + " $nested_name$* value) {\n" + " return $classname$_Parse(name, value);\n" + "}\n"); + } +} + +void EnumGenerator::GenerateDescriptorInitializer( + io::Printer* printer, int index) { + map vars; + vars["classname"] = classname_; + vars["index"] = SimpleItoa(index); + + if (descriptor_->containing_type() == NULL) { + printer->Print(vars, + "$classname$_descriptor_ = file->enum_type($index$);\n"); + } else { + vars["parent"] = ClassName(descriptor_->containing_type(), false); + printer->Print(vars, + "$classname$_descriptor_ = $parent$_descriptor_->enum_type($index$);\n"); + } +} + +void EnumGenerator::GenerateMethods(io::Printer* printer) { + map vars; + vars["classname"] = classname_; + + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print(vars, + "const ::google::protobuf::EnumDescriptor* $classname$_descriptor() {\n" + " protobuf_AssignDescriptorsOnce();\n" + " return $classname$_descriptor_;\n" + "}\n"); + } + + printer->Print(vars, + "bool $classname$_IsValid(int value) {\n" + " switch(value) {\n"); + + // Multiple values may have the same number. Make sure we only cover + // each number once by first constructing a set containing all valid + // numbers, then printing a case statement for each element. + + set numbers; + for (int j = 0; j < descriptor_->value_count(); j++) { + const EnumValueDescriptor* value = descriptor_->value(j); + numbers.insert(value->number()); + } + + for (set::iterator iter = numbers.begin(); + iter != numbers.end(); ++iter) { + printer->Print( + " case $number$:\n", + "number", SimpleItoa(*iter)); + } + + printer->Print(vars, + " return true;\n" + " default:\n" + " return false;\n" + " }\n" + "}\n" + "\n"); + + if (descriptor_->containing_type() != NULL) { + // We need to "define" the static constants which were declared in the + // header, to give the linker a place to put them. Or at least the C++ + // standard says we have to. MSVC actually insists tha we do _not_ define + // them again in the .cc file. + printer->Print("#ifndef _MSC_VER\n"); + + vars["parent"] = ClassName(descriptor_->containing_type(), false); + vars["nested_name"] = descriptor_->name(); + for (int i = 0; i < descriptor_->value_count(); i++) { + vars["value"] = descriptor_->value(i)->name(); + printer->Print(vars, + "const $classname$ $parent$::$value$;\n"); + } + printer->Print(vars, + "const $classname$ $parent$::$nested_name$_MIN;\n" + "const $classname$ $parent$::$nested_name$_MAX;\n" + "const int $parent$::$nested_name$_ARRAYSIZE;\n"); + + printer->Print("#endif // _MSC_VER\n"); + } +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h new file mode 100644 index 000000000..58f7721ec --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h @@ -0,0 +1,99 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__ + +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace cpp { + +class EnumGenerator { + public: + // See generator.cc for the meaning of dllexport_decl. + explicit EnumGenerator(const EnumDescriptor* descriptor, + const string& dllexport_decl); + ~EnumGenerator(); + + // Header stuff. + + // Generate header code defining the enum. This code should be placed + // within the enum's package namespace, but NOT within any class, even for + // nested enums. + void GenerateDefinition(io::Printer* printer); + + // Generate specialization of GetEnumDescriptor(). + // Precondition: in ::google::protobuf namespace. + void GenerateGetEnumDescriptorSpecializations(io::Printer* printer); + + // For enums nested within a message, generate code to import all the enum's + // symbols (e.g. the enum type name, all its values, etc.) into the class's + // namespace. This should be placed inside the class definition in the + // header. + void GenerateSymbolImports(io::Printer* printer); + + // Source file stuff. + + // Generate code that initializes the global variable storing the enum's + // descriptor. + void GenerateDescriptorInitializer(io::Printer* printer, int index); + + // Generate non-inline methods related to the enum, such as IsValidValue(). + // Goes in the .cc file. + void GenerateMethods(io::Printer* printer); + + private: + const EnumDescriptor* descriptor_; + string classname_; + string dllexport_decl_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc new file mode 100644 index 000000000..a369f4178 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc @@ -0,0 +1,361 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +namespace { + +void SetEnumVariables(const FieldDescriptor* descriptor, + map* variables) { + SetCommonFieldVariables(descriptor, variables); + const EnumValueDescriptor* default_value = descriptor->default_value_enum(); + (*variables)["type"] = ClassName(descriptor->enum_type(), true); + (*variables)["default"] = SimpleItoa(default_value->number()); +} + +} // namespace + +// =================================================================== + +EnumFieldGenerator:: +EnumFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetEnumVariables(descriptor, &variables_); +} + +EnumFieldGenerator::~EnumFieldGenerator() {} + +void EnumFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, "int $name$_;\n"); +} + +void EnumFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $name$() const$deprecation$;\n" + "inline void set_$name$($type$ value)$deprecation$;\n"); +} + +void EnumFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $classname$::$name$() const {\n" + " return static_cast< $type$ >($name$_);\n" + "}\n" + "inline void $classname$::set_$name$($type$ value) {\n" + " GOOGLE_DCHECK($type$_IsValid(value));\n" + " set_has_$name$();\n" + " $name$_ = value;\n" + "}\n"); +} + +void EnumFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $default$;\n"); +} + +void EnumFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, "set_$name$(from.$name$());\n"); +} + +void EnumFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); +} + +void EnumFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $default$;\n"); +} + +void EnumFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + printer->Print(variables_, + "int value;\n" + "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" + " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" + " input, &value)));\n" + "if ($type$_IsValid(value)) {\n" + " set_$name$(static_cast< $type$ >(value));\n"); + if (HasUnknownFields(descriptor_->file())) { + printer->Print(variables_, + "} else {\n" + " mutable_unknown_fields()->AddVarint($number$, value);\n"); + } + printer->Print(variables_, + "}\n"); +} + +void EnumFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + printer->Print(variables_, + "::google::protobuf::internal::WireFormatLite::WriteEnum(\n" + " $number$, this->$name$(), output);\n"); +} + +void EnumFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + printer->Print(variables_, + "target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n" + " $number$, this->$name$(), target);\n"); +} + +void EnumFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + printer->Print(variables_, + "total_size += $tag_size$ +\n" + " ::google::protobuf::internal::WireFormatLite::EnumSize(this->$name$());\n"); +} + +// =================================================================== + +RepeatedEnumFieldGenerator:: +RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetEnumVariables(descriptor, &variables_); +} + +RepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {} + +void RepeatedEnumFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, + "::google::protobuf::RepeatedField $name$_;\n"); + if (descriptor_->options().packed() && HasGeneratedMethods(descriptor_->file())) { + printer->Print(variables_, + "mutable int _$name$_cached_byte_size_;\n"); + } +} + +void RepeatedEnumFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $name$(int index) const$deprecation$;\n" + "inline void set_$name$(int index, $type$ value)$deprecation$;\n" + "inline void add_$name$($type$ value)$deprecation$;\n"); + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedField& $name$() const$deprecation$;\n" + "inline ::google::protobuf::RepeatedField* mutable_$name$()$deprecation$;\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $classname$::$name$(int index) const {\n" + " return static_cast< $type$ >($name$_.Get(index));\n" + "}\n" + "inline void $classname$::set_$name$(int index, $type$ value) {\n" + " GOOGLE_DCHECK($type$_IsValid(value));\n" + " $name$_.Set(index, value);\n" + "}\n" + "inline void $classname$::add_$name$($type$ value) {\n" + " GOOGLE_DCHECK($type$_IsValid(value));\n" + " $name$_.Add(value);\n" + "}\n"); + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedField&\n" + "$classname$::$name$() const {\n" + " return $name$_;\n" + "}\n" + "inline ::google::protobuf::RepeatedField*\n" + "$classname$::mutable_$name$() {\n" + " return &$name$_;\n" + "}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Clear();\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + // Not needed for repeated fields. +} + +void RepeatedEnumFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + // Don't use ReadRepeatedPrimitive here so that the enum can be validated. + printer->Print(variables_, + "int value;\n" + "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" + " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" + " input, &value)));\n" + "if ($type$_IsValid(value)) {\n" + " add_$name$(static_cast< $type$ >(value));\n"); + if (HasUnknownFields(descriptor_->file())) { + printer->Print(variables_, + "} else {\n" + " mutable_unknown_fields()->AddVarint($number$, value);\n"); + } + printer->Print("}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { + if (!descriptor_->options().packed()) { + // We use a non-inlined implementation in this case, since this path will + // rarely be executed. + printer->Print(variables_, + "DO_((::google::protobuf::internal::WireFormatLite::ReadPackedEnumNoInline(\n" + " input,\n" + " &$type$_IsValid,\n" + " this->mutable_$name$())));\n"); + } else { + printer->Print(variables_, + "::google::protobuf::uint32 length;\n" + "DO_(input->ReadVarint32(&length));\n" + "::google::protobuf::io::CodedInputStream::Limit limit = " + "input->PushLimit(length);\n" + "while (input->BytesUntilLimit() > 0) {\n" + " int value;\n" + " DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" + " int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(\n" + " input, &value)));\n" + " if ($type$_IsValid(value)) {\n" + " add_$name$(static_cast< $type$ >(value));\n" + " }\n" + "}\n" + "input->PopLimit(limit);\n"); + } +} + +void RepeatedEnumFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + if (descriptor_->options().packed()) { + // Write the tag and the size. + printer->Print(variables_, + "if (this->$name$_size() > 0) {\n" + " ::google::protobuf::internal::WireFormatLite::WriteTag(\n" + " $number$,\n" + " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" + " output);\n" + " output->WriteVarint32(_$name$_cached_byte_size_);\n" + "}\n"); + } + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n"); + if (descriptor_->options().packed()) { + printer->Print(variables_, + " ::google::protobuf::internal::WireFormatLite::WriteEnumNoTag(\n" + " this->$name$(i), output);\n"); + } else { + printer->Print(variables_, + " ::google::protobuf::internal::WireFormatLite::WriteEnum(\n" + " $number$, this->$name$(i), output);\n"); + } + printer->Print("}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + if (descriptor_->options().packed()) { + // Write the tag and the size. + printer->Print(variables_, + "if (this->$name$_size() > 0) {\n" + " target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n" + " $number$,\n" + " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" + " target);\n" + " target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(" + " _$name$_cached_byte_size_, target);\n" + "}\n"); + } + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n"); + if (descriptor_->options().packed()) { + printer->Print(variables_, + " target = ::google::protobuf::internal::WireFormatLite::WriteEnumNoTagToArray(\n" + " this->$name$(i), target);\n"); + } else { + printer->Print(variables_, + " target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(\n" + " $number$, this->$name$(i), target);\n"); + } + printer->Print("}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + printer->Print(variables_, + "{\n" + " int data_size = 0;\n"); + printer->Indent(); + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n" + " data_size += ::google::protobuf::internal::WireFormatLite::EnumSize(\n" + " this->$name$(i));\n" + "}\n"); + + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (data_size > 0) {\n" + " total_size += $tag_size$ +\n" + " ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n" + "}\n" + "_$name$_cached_byte_size_ = data_size;\n" + "total_size += data_size;\n"); + } else { + printer->Print(variables_, + "total_size += $tag_size$ * this->$name$_size() + data_size;\n"); + } + printer->Outdent(); + printer->Print("}\n"); +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h new file mode 100644 index 000000000..0793430c1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h @@ -0,0 +1,103 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +class EnumFieldGenerator : public FieldGenerator { + public: + explicit EnumFieldGenerator(const FieldDescriptor* descriptor); + ~EnumFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator); +}; + +class RepeatedEnumFieldGenerator : public FieldGenerator { + public: + explicit RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor); + ~RepeatedEnumFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_ENUM_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc new file mode 100644 index 000000000..658a7077b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc @@ -0,0 +1,210 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +namespace { + +// Returns the fully-qualified class name of the message that this field +// extends. This function is used in the Google-internal code to handle some +// legacy cases. +string ExtendeeClassName(const FieldDescriptor* descriptor) { + const Descriptor* extendee = descriptor->containing_type(); + return ClassName(extendee, true); +} + +} // anonymous namespace + +ExtensionGenerator::ExtensionGenerator(const FieldDescriptor* descriptor, + const string& dllexport_decl) + : descriptor_(descriptor), + dllexport_decl_(dllexport_decl) { + // Construct type_traits_. + if (descriptor_->is_repeated()) { + type_traits_ = "Repeated"; + } + + switch (descriptor_->cpp_type()) { + case FieldDescriptor::CPPTYPE_ENUM: + type_traits_.append("EnumTypeTraits< "); + type_traits_.append(ClassName(descriptor_->enum_type(), true)); + type_traits_.append(", "); + type_traits_.append(ClassName(descriptor_->enum_type(), true)); + type_traits_.append("_IsValid>"); + break; + case FieldDescriptor::CPPTYPE_STRING: + type_traits_.append("StringTypeTraits"); + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + type_traits_.append("MessageTypeTraits< "); + type_traits_.append(ClassName(descriptor_->message_type(), true)); + type_traits_.append(" >"); + break; + default: + type_traits_.append("PrimitiveTypeTraits< "); + type_traits_.append(PrimitiveTypeName(descriptor_->cpp_type())); + type_traits_.append(" >"); + break; + } +} + +ExtensionGenerator::~ExtensionGenerator() {} + +void ExtensionGenerator::GenerateDeclaration(io::Printer* printer) { + map vars; + vars["extendee" ] = ExtendeeClassName(descriptor_); + vars["number" ] = SimpleItoa(descriptor_->number()); + vars["type_traits" ] = type_traits_; + vars["name" ] = descriptor_->name(); + vars["field_type" ] = SimpleItoa(static_cast(descriptor_->type())); + vars["packed" ] = descriptor_->options().packed() ? "true" : "false"; + vars["constant_name"] = FieldConstantName(descriptor_); + + // If this is a class member, it needs to be declared "static". Otherwise, + // it needs to be "extern". In the latter case, it also needs the DLL + // export/import specifier. + if (descriptor_->extension_scope() == NULL) { + vars["qualifier"] = "extern"; + if (!dllexport_decl_.empty()) { + vars["qualifier"] = dllexport_decl_ + " " + vars["qualifier"]; + } + } else { + vars["qualifier"] = "static"; + } + + printer->Print(vars, + "static const int $constant_name$ = $number$;\n" + "$qualifier$ ::google::protobuf::internal::ExtensionIdentifier< $extendee$,\n" + " ::google::protobuf::internal::$type_traits$, $field_type$, $packed$ >\n" + " $name$;\n" + ); + +} + +void ExtensionGenerator::GenerateDefinition(io::Printer* printer) { + // If this is a class member, it needs to be declared in its class scope. + string scope = (descriptor_->extension_scope() == NULL) ? "" : + ClassName(descriptor_->extension_scope(), false) + "::"; + string name = scope + descriptor_->name(); + + map vars; + vars["extendee" ] = ExtendeeClassName(descriptor_); + vars["type_traits" ] = type_traits_; + vars["name" ] = name; + vars["constant_name"] = FieldConstantName(descriptor_); + vars["default" ] = DefaultValue(descriptor_); + vars["field_type" ] = SimpleItoa(static_cast(descriptor_->type())); + vars["packed" ] = descriptor_->options().packed() ? "true" : "false"; + vars["scope" ] = scope; + + if (descriptor_->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { + // We need to declare a global string which will contain the default value. + // We cannot declare it at class scope because that would require exposing + // it in the header which would be annoying for other reasons. So we + // replace :: with _ in the name and declare it as a global. + string global_name = StringReplace(name, "::", "_", true); + vars["global_name"] = global_name; + printer->Print(vars, + "const ::std::string $global_name$_default($default$);\n"); + + // Update the default to refer to the string global. + vars["default"] = global_name + "_default"; + } + + // Likewise, class members need to declare the field constant variable. + if (descriptor_->extension_scope() != NULL) { + printer->Print(vars, + "#ifndef _MSC_VER\n" + "const int $scope$$constant_name$;\n" + "#endif\n"); + } + + printer->Print(vars, + "::google::protobuf::internal::ExtensionIdentifier< $extendee$,\n" + " ::google::protobuf::internal::$type_traits$, $field_type$, $packed$ >\n" + " $name$($constant_name$, $default$);\n"); +} + +void ExtensionGenerator::GenerateRegistration(io::Printer* printer) { + map vars; + vars["extendee" ] = ExtendeeClassName(descriptor_); + vars["number" ] = SimpleItoa(descriptor_->number()); + vars["field_type" ] = SimpleItoa(static_cast(descriptor_->type())); + vars["is_repeated"] = descriptor_->is_repeated() ? "true" : "false"; + vars["is_packed" ] = (descriptor_->is_repeated() && + descriptor_->options().packed()) + ? "true" : "false"; + + switch (descriptor_->cpp_type()) { + case FieldDescriptor::CPPTYPE_ENUM: + printer->Print(vars, + "::google::protobuf::internal::ExtensionSet::RegisterEnumExtension(\n" + " &$extendee$::default_instance(),\n" + " $number$, $field_type$, $is_repeated$, $is_packed$,\n"); + printer->Print( + " &$type$_IsValid);\n", + "type", ClassName(descriptor_->enum_type(), true)); + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + printer->Print(vars, + "::google::protobuf::internal::ExtensionSet::RegisterMessageExtension(\n" + " &$extendee$::default_instance(),\n" + " $number$, $field_type$, $is_repeated$, $is_packed$,\n"); + printer->Print( + " &$type$::default_instance());\n", + "type", ClassName(descriptor_->message_type(), true)); + break; + default: + printer->Print(vars, + "::google::protobuf::internal::ExtensionSet::RegisterExtension(\n" + " &$extendee$::default_instance(),\n" + " $number$, $field_type$, $is_repeated$, $is_packed$);\n"); + break; + } +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h new file mode 100644 index 000000000..3068b0914 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h @@ -0,0 +1,85 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_EXTENSION_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_EXTENSION_H__ + +#include +#include + +namespace google { +namespace protobuf { + class FieldDescriptor; // descriptor.h + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace cpp { + +// Generates code for an extension, which may be within the scope of some +// message or may be at file scope. This is much simpler than FieldGenerator +// since extensions are just simple identifiers with interesting types. +class ExtensionGenerator { + public: + // See generator.cc for the meaning of dllexport_decl. + explicit ExtensionGenerator(const FieldDescriptor* descriptor, + const string& dllexport_decl); + ~ExtensionGenerator(); + + // Header stuff. + void GenerateDeclaration(io::Printer* printer); + + // Source file stuff. + void GenerateDefinition(io::Printer* printer); + + // Generate code to register the extension. + void GenerateRegistration(io::Printer* printer); + + private: + const FieldDescriptor* descriptor_; + string type_traits_; + string dllexport_decl_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc new file mode 100644 index 000000000..103cac4a9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc @@ -0,0 +1,139 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +using internal::WireFormat; + +void SetCommonFieldVariables(const FieldDescriptor* descriptor, + map* variables) { + (*variables)["name"] = FieldName(descriptor); + (*variables)["index"] = SimpleItoa(descriptor->index()); + (*variables)["number"] = SimpleItoa(descriptor->number()); + (*variables)["classname"] = ClassName(FieldScope(descriptor), false); + (*variables)["declared_type"] = DeclaredTypeMethodName(descriptor->type()); + + (*variables)["tag_size"] = SimpleItoa( + WireFormat::TagSize(descriptor->number(), descriptor->type())); + (*variables)["deprecation"] = descriptor->options().deprecated() + ? " PROTOBUF_DEPRECATED" : ""; + +} + +FieldGenerator::~FieldGenerator() {} + +void FieldGenerator:: +GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { + // Reaching here indicates a bug. Cases are: + // - This FieldGenerator should support packing, but this method should be + // overridden. + // - This FieldGenerator doesn't support packing, and this method should + // never have been called. + GOOGLE_LOG(FATAL) << "GenerateMergeFromCodedStreamWithPacking() " + << "called on field generator that does not support packing."; + +} + +FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor) + : descriptor_(descriptor), + field_generators_( + new scoped_ptr[descriptor->field_count()]) { + // Construct all the FieldGenerators. + for (int i = 0; i < descriptor->field_count(); i++) { + field_generators_[i].reset(MakeGenerator(descriptor->field(i))); + } +} + +FieldGenerator* FieldGeneratorMap::MakeGenerator(const FieldDescriptor* field) { + if (field->is_repeated()) { + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_MESSAGE: + return new RepeatedMessageFieldGenerator(field); + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // RepeatedStringFieldGenerator handles unknown ctypes. + case FieldOptions::STRING: + return new RepeatedStringFieldGenerator(field); + } + case FieldDescriptor::CPPTYPE_ENUM: + return new RepeatedEnumFieldGenerator(field); + default: + return new RepeatedPrimitiveFieldGenerator(field); + } + } else { + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_MESSAGE: + return new MessageFieldGenerator(field); + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // StringFieldGenerator handles unknown ctypes. + case FieldOptions::STRING: + return new StringFieldGenerator(field); + } + case FieldDescriptor::CPPTYPE_ENUM: + return new EnumFieldGenerator(field); + default: + return new PrimitiveFieldGenerator(field); + } + } +} + +FieldGeneratorMap::~FieldGeneratorMap() {} + +const FieldGenerator& FieldGeneratorMap::get( + const FieldDescriptor* field) const { + GOOGLE_CHECK_EQ(field->containing_type(), descriptor_); + return *field_generators_[field->index()]; +} + + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h new file mode 100644 index 000000000..c303a3378 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h @@ -0,0 +1,167 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__ + +#include +#include + +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace cpp { + +// Helper function: set variables in the map that are the same for all +// field code generators. +// ['name', 'index', 'number', 'classname', 'declared_type', 'tag_size', +// 'deprecation']. +void SetCommonFieldVariables(const FieldDescriptor* descriptor, + map* variables); + +class FieldGenerator { + public: + FieldGenerator() {} + virtual ~FieldGenerator(); + + // Generate lines of code declaring members fields of the message class + // needed to represent this field. These are placed inside the message + // class. + virtual void GeneratePrivateMembers(io::Printer* printer) const = 0; + + // Generate prototypes for all of the accessor functions related to this + // field. These are placed inside the class definition. + virtual void GenerateAccessorDeclarations(io::Printer* printer) const = 0; + + // Generate inline definitions of accessor functions for this field. + // These are placed inside the header after all class definitions. + virtual void GenerateInlineAccessorDefinitions( + io::Printer* printer) const = 0; + + // Generate definitions of accessors that aren't inlined. These are + // placed somewhere in the .cc file. + // Most field types don't need this, so the default implementation is empty. + virtual void GenerateNonInlineAccessorDefinitions( + io::Printer* printer) const {} + + // Generate lines of code (statements, not declarations) which clear the + // field. This is used to define the clear_$name$() method as well as + // the Clear() method for the whole message. + virtual void GenerateClearingCode(io::Printer* printer) const = 0; + + // Generate lines of code (statements, not declarations) which merges the + // contents of the field from the current message to the target message, + // which is stored in the generated code variable "from". + // This is used to fill in the MergeFrom method for the whole message. + // Details of this usage can be found in message.cc under the + // GenerateMergeFrom method. + virtual void GenerateMergingCode(io::Printer* printer) const = 0; + + // Generate lines of code (statements, not declarations) which swaps + // this field and the corresponding field of another message, which + // is stored in the generated code variable "other". This is used to + // define the Swap method. Details of usage can be found in + // message.cc under the GenerateSwap method. + virtual void GenerateSwappingCode(io::Printer* printer) const = 0; + + // Generate initialization code for private members declared by + // GeneratePrivateMembers(). These go into the message class's SharedCtor() + // method, invoked by each of the generated constructors. + virtual void GenerateConstructorCode(io::Printer* printer) const = 0; + + // Generate any code that needs to go in the class's SharedDtor() method, + // invoked by the destructor. + // Most field types don't need this, so the default implementation is empty. + virtual void GenerateDestructorCode(io::Printer* printer) const {} + + // Generate lines to decode this field, which will be placed inside the + // message's MergeFromCodedStream() method. + virtual void GenerateMergeFromCodedStream(io::Printer* printer) const = 0; + + // Generate lines to decode this field from a packed value, which will be + // placed inside the message's MergeFromCodedStream() method. + virtual void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) + const; + + // Generate lines to serialize this field, which are placed within the + // message's SerializeWithCachedSizes() method. + virtual void GenerateSerializeWithCachedSizes(io::Printer* printer) const = 0; + + // Generate lines to serialize this field directly to the array "target", + // which are placed within the message's SerializeWithCachedSizesToArray() + // method. This must also advance "target" past the written bytes. + virtual void GenerateSerializeWithCachedSizesToArray( + io::Printer* printer) const = 0; + + // Generate lines to compute the serialized size of this field, which + // are placed in the message's ByteSize() method. + virtual void GenerateByteSize(io::Printer* printer) const = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator); +}; + +// Convenience class which constructs FieldGenerators for a Descriptor. +class FieldGeneratorMap { + public: + explicit FieldGeneratorMap(const Descriptor* descriptor); + ~FieldGeneratorMap(); + + const FieldGenerator& get(const FieldDescriptor* field) const; + + private: + const Descriptor* descriptor_; + scoped_array > field_generators_; + + static FieldGenerator* MakeGenerator(const FieldDescriptor* field); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap); +}; + + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc new file mode 100644 index 000000000..312ebc86d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc @@ -0,0 +1,611 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +// =================================================================== + +FileGenerator::FileGenerator(const FileDescriptor* file, + const string& dllexport_decl) + : file_(file), + message_generators_( + new scoped_ptr[file->message_type_count()]), + enum_generators_( + new scoped_ptr[file->enum_type_count()]), + service_generators_( + new scoped_ptr[file->service_count()]), + extension_generators_( + new scoped_ptr[file->extension_count()]), + dllexport_decl_(dllexport_decl) { + + for (int i = 0; i < file->message_type_count(); i++) { + message_generators_[i].reset( + new MessageGenerator(file->message_type(i), dllexport_decl)); + } + + for (int i = 0; i < file->enum_type_count(); i++) { + enum_generators_[i].reset( + new EnumGenerator(file->enum_type(i), dllexport_decl)); + } + + for (int i = 0; i < file->service_count(); i++) { + service_generators_[i].reset( + new ServiceGenerator(file->service(i), dllexport_decl)); + } + + for (int i = 0; i < file->extension_count(); i++) { + extension_generators_[i].reset( + new ExtensionGenerator(file->extension(i), dllexport_decl)); + } + + SplitStringUsing(file_->package(), ".", &package_parts_); +} + +FileGenerator::~FileGenerator() {} + +void FileGenerator::GenerateHeader(io::Printer* printer) { + string filename_identifier = FilenameIdentifier(file_->name()); + + // Generate top of header. + printer->Print( + "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" + "// source: $filename$\n" + "\n" + "#ifndef PROTOBUF_$filename_identifier$__INCLUDED\n" + "#define PROTOBUF_$filename_identifier$__INCLUDED\n" + "\n" + "#include \n" + "\n", + "filename", file_->name(), + "filename_identifier", filename_identifier); + + printer->Print( + "#include \n" + "\n"); + + // Verify the protobuf library header version is compatible with the protoc + // version before going any further. + printer->Print( + "#if GOOGLE_PROTOBUF_VERSION < $min_header_version$\n" + "#error This file was generated by a newer version of protoc which is\n" + "#error incompatible with your Protocol Buffer headers. Please update\n" + "#error your headers.\n" + "#endif\n" + "#if $protoc_version$ < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION\n" + "#error This file was generated by an older version of protoc which is\n" + "#error incompatible with your Protocol Buffer headers. Please\n" + "#error regenerate this file with a newer version of protoc.\n" + "#endif\n" + "\n", + "min_header_version", + SimpleItoa(protobuf::internal::kMinHeaderVersionForProtoc), + "protoc_version", SimpleItoa(GOOGLE_PROTOBUF_VERSION)); + + // OK, it's now safe to #include other files. + printer->Print( + "#include \n" + "#include \n" + "#include \n"); + + if (HasDescriptorMethods(file_)) { + printer->Print( + "#include \n"); + } + + if (HasGenericServices(file_)) { + printer->Print( + "#include \n"); + } + + + for (int i = 0; i < file_->dependency_count(); i++) { + printer->Print( + "#include \"$dependency$.pb.h\"\n", + "dependency", StripProto(file_->dependency(i)->name())); + } + + printer->Print( + "// @@protoc_insertion_point(includes)\n"); + + // Open namespace. + GenerateNamespaceOpeners(printer); + + // Forward-declare the AddDescriptors, AssignDescriptors, and ShutdownFile + // functions, so that we can declare them to be friends of each class. + printer->Print( + "\n" + "// Internal implementation detail -- do not call these.\n" + "void $dllexport_decl$ $adddescriptorsname$();\n", + "adddescriptorsname", GlobalAddDescriptorsName(file_->name()), + "dllexport_decl", dllexport_decl_); + + printer->Print( + // Note that we don't put dllexport_decl on these because they are only + // called by the .pb.cc file in which they are defined. + "void $assigndescriptorsname$();\n" + "void $shutdownfilename$();\n" + "\n", + "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name()), + "shutdownfilename", GlobalShutdownFileName(file_->name())); + + // Generate forward declarations of classes. + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateForwardDeclaration(printer); + } + + printer->Print("\n"); + + // Generate enum definitions. + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateEnumDefinitions(printer); + } + for (int i = 0; i < file_->enum_type_count(); i++) { + enum_generators_[i]->GenerateDefinition(printer); + } + + printer->Print(kThickSeparator); + printer->Print("\n"); + + // Generate class definitions. + for (int i = 0; i < file_->message_type_count(); i++) { + if (i > 0) { + printer->Print("\n"); + printer->Print(kThinSeparator); + printer->Print("\n"); + } + message_generators_[i]->GenerateClassDefinition(printer); + } + + printer->Print("\n"); + printer->Print(kThickSeparator); + printer->Print("\n"); + + if (HasGenericServices(file_)) { + // Generate service definitions. + for (int i = 0; i < file_->service_count(); i++) { + if (i > 0) { + printer->Print("\n"); + printer->Print(kThinSeparator); + printer->Print("\n"); + } + service_generators_[i]->GenerateDeclarations(printer); + } + + printer->Print("\n"); + printer->Print(kThickSeparator); + printer->Print("\n"); + } + + // Declare extension identifiers. + for (int i = 0; i < file_->extension_count(); i++) { + extension_generators_[i]->GenerateDeclaration(printer); + } + + printer->Print("\n"); + printer->Print(kThickSeparator); + printer->Print("\n"); + + // Generate class inline methods. + for (int i = 0; i < file_->message_type_count(); i++) { + if (i > 0) { + printer->Print(kThinSeparator); + printer->Print("\n"); + } + message_generators_[i]->GenerateInlineMethods(printer); + } + + printer->Print( + "\n" + "// @@protoc_insertion_point(namespace_scope)\n"); + + // Close up namespace. + GenerateNamespaceClosers(printer); + + // Emit GetEnumDescriptor specializations into google::protobuf namespace: + if (HasDescriptorMethods(file_)) { + // The SWIG conditional is to avoid a null-pointer dereference + // (bug 1984964) in swig-1.3.21 resulting from the following syntax: + // namespace X { void Y(); } + // which appears in GetEnumDescriptor() specializations. + printer->Print( + "\n" + "#ifndef SWIG\n" + "namespace google {\nnamespace protobuf {\n" + "\n"); + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer); + } + for (int i = 0; i < file_->enum_type_count(); i++) { + enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer); + } + printer->Print( + "\n" + "} // namespace google\n} // namespace protobuf\n" + "#endif // SWIG\n"); + } + + printer->Print( + "\n" + "// @@protoc_insertion_point(global_scope)\n" + "\n"); + + printer->Print( + "#endif // PROTOBUF_$filename_identifier$__INCLUDED\n", + "filename_identifier", filename_identifier); +} + +void FileGenerator::GenerateSource(io::Printer* printer) { + printer->Print( + "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" + "\n" + + // The generated code calls accessors that might be deprecated. We don't + // want the compiler to warn in generated code. + "#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION\n" + "#include \"$basename$.pb.h\"\n" + "\n" + "#include \n" // for swap() + "\n" + "#include \n" + "#include \n" + "#include \n", + "basename", StripProto(file_->name())); + + if (HasDescriptorMethods(file_)) { + printer->Print( + "#include \n" + "#include \n" + "#include \n"); + } + + printer->Print( + "// @@protoc_insertion_point(includes)\n"); + + GenerateNamespaceOpeners(printer); + + if (HasDescriptorMethods(file_)) { + printer->Print( + "\n" + "namespace {\n" + "\n"); + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateDescriptorDeclarations(printer); + } + for (int i = 0; i < file_->enum_type_count(); i++) { + printer->Print( + "const ::google::protobuf::EnumDescriptor* $name$_descriptor_ = NULL;\n", + "name", ClassName(file_->enum_type(i), false)); + } + + if (HasGenericServices(file_)) { + for (int i = 0; i < file_->service_count(); i++) { + printer->Print( + "const ::google::protobuf::ServiceDescriptor* $name$_descriptor_ = NULL;\n", + "name", file_->service(i)->name()); + } + } + + printer->Print( + "\n" + "} // namespace\n" + "\n"); + } + + // Define our externally-visible BuildDescriptors() function. (For the lite + // library, all this does is initialize default instances.) + GenerateBuildDescriptors(printer); + + // Generate enums. + for (int i = 0; i < file_->enum_type_count(); i++) { + enum_generators_[i]->GenerateMethods(printer); + } + + // Generate classes. + for (int i = 0; i < file_->message_type_count(); i++) { + printer->Print("\n"); + printer->Print(kThickSeparator); + printer->Print("\n"); + message_generators_[i]->GenerateClassMethods(printer); + } + + if (HasGenericServices(file_)) { + // Generate services. + for (int i = 0; i < file_->service_count(); i++) { + if (i == 0) printer->Print("\n"); + printer->Print(kThickSeparator); + printer->Print("\n"); + service_generators_[i]->GenerateImplementation(printer); + } + } + + // Define extensions. + for (int i = 0; i < file_->extension_count(); i++) { + extension_generators_[i]->GenerateDefinition(printer); + } + + printer->Print( + "\n" + "// @@protoc_insertion_point(namespace_scope)\n"); + + GenerateNamespaceClosers(printer); + + printer->Print( + "\n" + "// @@protoc_insertion_point(global_scope)\n"); +} + +void FileGenerator::GenerateBuildDescriptors(io::Printer* printer) { + // AddDescriptors() is a file-level procedure which adds the encoded + // FileDescriptorProto for this .proto file to the global DescriptorPool + // for generated files (DescriptorPool::generated_pool()). It always runs + // at static initialization time, so all files will be registered before + // main() starts. This procedure also constructs default instances and + // registers extensions. + // + // Its sibling, AssignDescriptors(), actually pulls the compiled + // FileDescriptor from the DescriptorPool and uses it to populate all of + // the global variables which store pointers to the descriptor objects. + // It also constructs the reflection objects. It is called the first time + // anyone calls descriptor() or GetReflection() on one of the types defined + // in the file. + + // In optimize_for = LITE_RUNTIME mode, we don't generate AssignDescriptors() + // and we only use AddDescriptors() to allocate default instances. + if (HasDescriptorMethods(file_)) { + printer->Print( + "\n" + "void $assigndescriptorsname$() {\n", + "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name())); + printer->Indent(); + + // Make sure the file has found its way into the pool. If a descriptor + // is requested *during* static init then AddDescriptors() may not have + // been called yet, so we call it manually. Note that it's fine if + // AddDescriptors() is called multiple times. + printer->Print( + "$adddescriptorsname$();\n", + "adddescriptorsname", GlobalAddDescriptorsName(file_->name())); + + // Get the file's descriptor from the pool. + printer->Print( + "const ::google::protobuf::FileDescriptor* file =\n" + " ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(\n" + " \"$filename$\");\n" + // Note that this GOOGLE_CHECK is necessary to prevent a warning about "file" + // being unused when compiling an empty .proto file. + "GOOGLE_CHECK(file != NULL);\n", + "filename", file_->name()); + + // Go through all the stuff defined in this file and generated code to + // assign the global descriptor pointers based on the file descriptor. + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateDescriptorInitializer(printer, i); + } + for (int i = 0; i < file_->enum_type_count(); i++) { + enum_generators_[i]->GenerateDescriptorInitializer(printer, i); + } + if (HasGenericServices(file_)) { + for (int i = 0; i < file_->service_count(); i++) { + service_generators_[i]->GenerateDescriptorInitializer(printer, i); + } + } + + printer->Outdent(); + printer->Print( + "}\n" + "\n"); + + // --------------------------------------------------------------- + + // protobuf_AssignDescriptorsOnce(): The first time it is called, calls + // AssignDescriptors(). All later times, waits for the first call to + // complete and then returns. + printer->Print( + "namespace {\n" + "\n" + "GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);\n" + "inline void protobuf_AssignDescriptorsOnce() {\n" + " ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,\n" + " &$assigndescriptorsname$);\n" + "}\n" + "\n", + "assigndescriptorsname", GlobalAssignDescriptorsName(file_->name())); + + // protobuf_RegisterTypes(): Calls + // MessageFactory::InternalRegisterGeneratedType() for each message type. + printer->Print( + "void protobuf_RegisterTypes(const ::std::string&) {\n" + " protobuf_AssignDescriptorsOnce();\n"); + printer->Indent(); + + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateTypeRegistrations(printer); + } + + printer->Outdent(); + printer->Print( + "}\n" + "\n" + "} // namespace\n"); + } + + // ----------------------------------------------------------------- + + // ShutdownFile(): Deletes descriptors, default instances, etc. on shutdown. + printer->Print( + "\n" + "void $shutdownfilename$() {\n", + "shutdownfilename", GlobalShutdownFileName(file_->name())); + printer->Indent(); + + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateShutdownCode(printer); + } + + printer->Outdent(); + printer->Print( + "}\n"); + + // ----------------------------------------------------------------- + + // Now generate the AddDescriptors() function. + printer->Print( + "\n" + "void $adddescriptorsname$() {\n" + // We don't need any special synchronization here because this code is + // called at static init time before any threads exist. + " static bool already_here = false;\n" + " if (already_here) return;\n" + " already_here = true;\n" + " GOOGLE_PROTOBUF_VERIFY_VERSION;\n" + "\n", + "adddescriptorsname", GlobalAddDescriptorsName(file_->name())); + printer->Indent(); + + // Call the AddDescriptors() methods for all of our dependencies, to make + // sure they get added first. + for (int i = 0; i < file_->dependency_count(); i++) { + const FileDescriptor* dependency = file_->dependency(i); + // Print the namespace prefix for the dependency. + vector dependency_package_parts; + SplitStringUsing(dependency->package(), ".", &dependency_package_parts); + printer->Print("::"); + for (int i = 0; i < dependency_package_parts.size(); i++) { + printer->Print("$name$::", + "name", dependency_package_parts[i]); + } + // Call its AddDescriptors function. + printer->Print( + "$name$();\n", + "name", GlobalAddDescriptorsName(dependency->name())); + } + + if (HasDescriptorMethods(file_)) { + // Embed the descriptor. We simply serialize the entire FileDescriptorProto + // and embed it as a string literal, which is parsed and built into real + // descriptors at initialization time. + FileDescriptorProto file_proto; + file_->CopyTo(&file_proto); + string file_data; + file_proto.SerializeToString(&file_data); + + printer->Print( + "::google::protobuf::DescriptorPool::InternalAddGeneratedFile("); + + // Only write 40 bytes per line. + static const int kBytesPerLine = 40; + for (int i = 0; i < file_data.size(); i += kBytesPerLine) { + printer->Print("\n \"$data$\"", + "data", EscapeTrigraphs(CEscape(file_data.substr(i, kBytesPerLine)))); + } + printer->Print( + ", $size$);\n", + "size", SimpleItoa(file_data.size())); + + // Call MessageFactory::InternalRegisterGeneratedFile(). + printer->Print( + "::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(\n" + " \"$filename$\", &protobuf_RegisterTypes);\n", + "filename", file_->name()); + } + + // Allocate and initialize default instances. This can't be done lazily + // since default instances are returned by simple accessors and are used with + // extensions. Speaking of which, we also register extensions at this time. + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateDefaultInstanceAllocator(printer); + } + for (int i = 0; i < file_->extension_count(); i++) { + extension_generators_[i]->GenerateRegistration(printer); + } + for (int i = 0; i < file_->message_type_count(); i++) { + message_generators_[i]->GenerateDefaultInstanceInitializer(printer); + } + + printer->Print( + "::google::protobuf::internal::OnShutdown(&$shutdownfilename$);\n", + "shutdownfilename", GlobalShutdownFileName(file_->name())); + + printer->Outdent(); + + printer->Print( + "}\n" + "\n" + "// Force AddDescriptors() to be called at static initialization time.\n" + "struct StaticDescriptorInitializer_$filename$ {\n" + " StaticDescriptorInitializer_$filename$() {\n" + " $adddescriptorsname$();\n" + " }\n" + "} static_descriptor_initializer_$filename$_;\n" + "\n", + "adddescriptorsname", GlobalAddDescriptorsName(file_->name()), + "filename", FilenameIdentifier(file_->name())); +} + +void FileGenerator::GenerateNamespaceOpeners(io::Printer* printer) { + if (package_parts_.size() > 0) printer->Print("\n"); + + for (int i = 0; i < package_parts_.size(); i++) { + printer->Print("namespace $part$ {\n", + "part", package_parts_[i]); + } +} + +void FileGenerator::GenerateNamespaceClosers(io::Printer* printer) { + if (package_parts_.size() > 0) printer->Print("\n"); + + for (int i = package_parts_.size() - 1; i >= 0; i--) { + printer->Print("} // namespace $part$\n", + "part", package_parts_[i]); + } +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h new file mode 100644 index 000000000..b4e012857 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h @@ -0,0 +1,98 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__ + +#include +#include +#include +#include + +namespace google { +namespace protobuf { + class FileDescriptor; // descriptor.h + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace cpp { + +class EnumGenerator; // enum.h +class MessageGenerator; // message.h +class ServiceGenerator; // service.h +class ExtensionGenerator; // extension.h + +class FileGenerator { + public: + // See generator.cc for the meaning of dllexport_decl. + explicit FileGenerator(const FileDescriptor* file, + const string& dllexport_decl); + ~FileGenerator(); + + void GenerateHeader(io::Printer* printer); + void GenerateSource(io::Printer* printer); + + private: + // Generate the BuildDescriptors() procedure, which builds all descriptors + // for types defined in the file. + void GenerateBuildDescriptors(io::Printer* printer); + + void GenerateNamespaceOpeners(io::Printer* printer); + void GenerateNamespaceClosers(io::Printer* printer); + + const FileDescriptor* file_; + + scoped_array > message_generators_; + scoped_array > enum_generators_; + scoped_array > service_generators_; + scoped_array > extension_generators_; + + // E.g. if the package is foo.bar, package_parts_ is {"foo", "bar"}. + vector package_parts_; + + string dllexport_decl_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc new file mode 100644 index 000000000..bb84e2ab4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc @@ -0,0 +1,122 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +CppGenerator::CppGenerator() {} +CppGenerator::~CppGenerator() {} + +bool CppGenerator::Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* generator_context, + string* error) const { + vector > options; + ParseGeneratorParameter(parameter, &options); + + // ----------------------------------------------------------------- + // parse generator options + + // TODO(kenton): If we ever have more options, we may want to create a + // class that encapsulates them which we can pass down to all the + // generator classes. Currently we pass dllexport_decl down to all of + // them via the constructors, but we don't want to have to add another + // constructor parameter for every option. + + // If the dllexport_decl option is passed to the compiler, we need to write + // it in front of every symbol that should be exported if this .proto is + // compiled into a Windows DLL. E.g., if the user invokes the protocol + // compiler as: + // protoc --cpp_out=dllexport_decl=FOO_EXPORT:outdir foo.proto + // then we'll define classes like this: + // class FOO_EXPORT Foo { + // ... + // } + // FOO_EXPORT is a macro which should expand to __declspec(dllexport) or + // __declspec(dllimport) depending on what is being compiled. + string dllexport_decl; + + for (int i = 0; i < options.size(); i++) { + if (options[i].first == "dllexport_decl") { + dllexport_decl = options[i].second; + } else { + *error = "Unknown generator option: " + options[i].first; + return false; + } + } + + // ----------------------------------------------------------------- + + + string basename = StripProto(file->name()); + basename.append(".pb"); + + FileGenerator file_generator(file, dllexport_decl); + + // Generate header. + { + scoped_ptr output( + generator_context->Open(basename + ".h")); + io::Printer printer(output.get(), '$'); + file_generator.GenerateHeader(&printer); + } + + // Generate cc file. + { + scoped_ptr output( + generator_context->Open(basename + ".cc")); + io::Printer printer(output.get(), '$'); + file_generator.GenerateSource(&printer); + } + + return true; +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h new file mode 100644 index 000000000..a90e84d7b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h @@ -0,0 +1,72 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Generates C++ code for a given .proto file. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__ + +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +// CodeGenerator implementation which generates a C++ source file and +// header. If you create your own protocol compiler binary and you want +// it to support C++ output, you can do so by registering an instance of this +// CodeGenerator with the CommandLineInterface in your main() function. +class LIBPROTOC_EXPORT CppGenerator : public CodeGenerator { + public: + CppGenerator(); + ~CppGenerator(); + + // implements CodeGenerator ---------------------------------------- + bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* generator_context, + string* error) const; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CppGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_GENERATOR_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc new file mode 100644 index 000000000..25b05a85f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc @@ -0,0 +1,347 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +namespace { + +string DotsToUnderscores(const string& name) { + return StringReplace(name, ".", "_", true); +} + +string DotsToColons(const string& name) { + return StringReplace(name, ".", "::", true); +} + +const char* const kKeywordList[] = { + "and", "and_eq", "asm", "auto", "bitand", "bitor", "bool", "break", "case", + "catch", "char", "class", "compl", "const", "const_cast", "continue", + "default", "delete", "do", "double", "dynamic_cast", "else", "enum", + "explicit", "extern", "false", "float", "for", "friend", "goto", "if", + "inline", "int", "long", "mutable", "namespace", "new", "not", "not_eq", + "operator", "or", "or_eq", "private", "protected", "public", "register", + "reinterpret_cast", "return", "short", "signed", "sizeof", "static", + "static_cast", "struct", "switch", "template", "this", "throw", "true", "try", + "typedef", "typeid", "typename", "union", "unsigned", "using", "virtual", + "void", "volatile", "wchar_t", "while", "xor", "xor_eq" +}; + +hash_set MakeKeywordsMap() { + hash_set result; + for (int i = 0; i < GOOGLE_ARRAYSIZE(kKeywordList); i++) { + result.insert(kKeywordList[i]); + } + return result; +} + +hash_set kKeywords = MakeKeywordsMap(); + +string UnderscoresToCamelCase(const string& input, bool cap_next_letter) { + string result; + // Note: I distrust ctype.h due to locales. + for (int i = 0; i < input.size(); i++) { + if ('a' <= input[i] && input[i] <= 'z') { + if (cap_next_letter) { + result += input[i] + ('A' - 'a'); + } else { + result += input[i]; + } + cap_next_letter = false; + } else if ('A' <= input[i] && input[i] <= 'Z') { + // Capital letters are left as-is. + result += input[i]; + cap_next_letter = false; + } else if ('0' <= input[i] && input[i] <= '9') { + result += input[i]; + cap_next_letter = true; + } else { + cap_next_letter = true; + } + } + return result; +} + +} // namespace + +const char kThickSeparator[] = + "// ===================================================================\n"; +const char kThinSeparator[] = + "// -------------------------------------------------------------------\n"; + +string ClassName(const Descriptor* descriptor, bool qualified) { + + // Find "outer", the descriptor of the top-level message in which + // "descriptor" is embedded. + const Descriptor* outer = descriptor; + while (outer->containing_type() != NULL) outer = outer->containing_type(); + + const string& outer_name = outer->full_name(); + string inner_name = descriptor->full_name().substr(outer_name.size()); + + if (qualified) { + return "::" + DotsToColons(outer_name) + DotsToUnderscores(inner_name); + } else { + return outer->name() + DotsToUnderscores(inner_name); + } +} + +string ClassName(const EnumDescriptor* enum_descriptor, bool qualified) { + if (enum_descriptor->containing_type() == NULL) { + if (qualified) { + return DotsToColons(enum_descriptor->full_name()); + } else { + return enum_descriptor->name(); + } + } else { + string result = ClassName(enum_descriptor->containing_type(), qualified); + result += '_'; + result += enum_descriptor->name(); + return result; + } +} + + +string SuperClassName(const Descriptor* descriptor) { + return HasDescriptorMethods(descriptor->file()) ? + "::google::protobuf::Message" : "::google::protobuf::MessageLite"; +} + +string FieldName(const FieldDescriptor* field) { + string result = field->name(); + LowerString(&result); + if (kKeywords.count(result) > 0) { + result.append("_"); + } + return result; +} + +string FieldConstantName(const FieldDescriptor *field) { + string field_name = UnderscoresToCamelCase(field->name(), true); + string result = "k" + field_name + "FieldNumber"; + + if (!field->is_extension() && + field->containing_type()->FindFieldByCamelcaseName( + field->camelcase_name()) != field) { + // This field's camelcase name is not unique. As a hack, add the field + // number to the constant name. This makes the constant rather useless, + // but what can we do? + result += "_" + SimpleItoa(field->number()); + } + + return result; +} + +string FieldMessageTypeName(const FieldDescriptor* field) { + // Note: The Google-internal version of Protocol Buffers uses this function + // as a hook point for hacks to support legacy code. + return ClassName(field->message_type(), true); +} + +string StripProto(const string& filename) { + if (HasSuffixString(filename, ".protodevel")) { + return StripSuffixString(filename, ".protodevel"); + } else { + return StripSuffixString(filename, ".proto"); + } +} + +const char* PrimitiveTypeName(FieldDescriptor::CppType type) { + switch (type) { + case FieldDescriptor::CPPTYPE_INT32 : return "::google::protobuf::int32"; + case FieldDescriptor::CPPTYPE_INT64 : return "::google::protobuf::int64"; + case FieldDescriptor::CPPTYPE_UINT32 : return "::google::protobuf::uint32"; + case FieldDescriptor::CPPTYPE_UINT64 : return "::google::protobuf::uint64"; + case FieldDescriptor::CPPTYPE_DOUBLE : return "double"; + case FieldDescriptor::CPPTYPE_FLOAT : return "float"; + case FieldDescriptor::CPPTYPE_BOOL : return "bool"; + case FieldDescriptor::CPPTYPE_ENUM : return "int"; + case FieldDescriptor::CPPTYPE_STRING : return "::std::string"; + case FieldDescriptor::CPPTYPE_MESSAGE: return NULL; + + // No default because we want the compiler to complain if any new + // CppTypes are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return NULL; +} + +const char* DeclaredTypeMethodName(FieldDescriptor::Type type) { + switch (type) { + case FieldDescriptor::TYPE_INT32 : return "Int32"; + case FieldDescriptor::TYPE_INT64 : return "Int64"; + case FieldDescriptor::TYPE_UINT32 : return "UInt32"; + case FieldDescriptor::TYPE_UINT64 : return "UInt64"; + case FieldDescriptor::TYPE_SINT32 : return "SInt32"; + case FieldDescriptor::TYPE_SINT64 : return "SInt64"; + case FieldDescriptor::TYPE_FIXED32 : return "Fixed32"; + case FieldDescriptor::TYPE_FIXED64 : return "Fixed64"; + case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; + case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; + case FieldDescriptor::TYPE_FLOAT : return "Float"; + case FieldDescriptor::TYPE_DOUBLE : return "Double"; + + case FieldDescriptor::TYPE_BOOL : return "Bool"; + case FieldDescriptor::TYPE_ENUM : return "Enum"; + + case FieldDescriptor::TYPE_STRING : return "String"; + case FieldDescriptor::TYPE_BYTES : return "Bytes"; + case FieldDescriptor::TYPE_GROUP : return "Group"; + case FieldDescriptor::TYPE_MESSAGE : return "Message"; + + // No default because we want the compiler to complain if any new + // types are added. + } + GOOGLE_LOG(FATAL) << "Can't get here."; + return ""; +} + +string DefaultValue(const FieldDescriptor* field) { + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + return SimpleItoa(field->default_value_int32()); + case FieldDescriptor::CPPTYPE_UINT32: + return SimpleItoa(field->default_value_uint32()) + "u"; + case FieldDescriptor::CPPTYPE_INT64: + return "GOOGLE_LONGLONG(" + SimpleItoa(field->default_value_int64()) + ")"; + case FieldDescriptor::CPPTYPE_UINT64: + return "GOOGLE_ULONGLONG(" + SimpleItoa(field->default_value_uint64())+ ")"; + case FieldDescriptor::CPPTYPE_DOUBLE: { + double value = field->default_value_double(); + if (value == numeric_limits::infinity()) { + return "::google::protobuf::internal::Infinity()"; + } else if (value == -numeric_limits::infinity()) { + return "-::google::protobuf::internal::Infinity()"; + } else if (value != value) { + return "::google::protobuf::internal::NaN()"; + } else { + return SimpleDtoa(value); + } + } + case FieldDescriptor::CPPTYPE_FLOAT: + { + float value = field->default_value_float(); + if (value == numeric_limits::infinity()) { + return "static_cast(::google::protobuf::internal::Infinity())"; + } else if (value == -numeric_limits::infinity()) { + return "static_cast(-::google::protobuf::internal::Infinity())"; + } else if (value != value) { + return "static_cast(::google::protobuf::internal::NaN())"; + } else { + string float_value = SimpleFtoa(value); + // If floating point value contains a period (.) or an exponent + // (either E or e), then append suffix 'f' to make it a float + // literal. + if (float_value.find_first_of(".eE") != string::npos) { + float_value.push_back('f'); + } + return float_value; + } + } + case FieldDescriptor::CPPTYPE_BOOL: + return field->default_value_bool() ? "true" : "false"; + case FieldDescriptor::CPPTYPE_ENUM: + // Lazy: Generate a static_cast because we don't have a helper function + // that constructs the full name of an enum value. + return strings::Substitute( + "static_cast< $0 >($1)", + ClassName(field->enum_type(), true), + field->default_value_enum()->number()); + case FieldDescriptor::CPPTYPE_STRING: + return "\"" + EscapeTrigraphs(CEscape(field->default_value_string())) + + "\""; + case FieldDescriptor::CPPTYPE_MESSAGE: + return FieldMessageTypeName(field) + "::default_instance()"; + } + // Can't actually get here; make compiler happy. (We could add a default + // case above but then we wouldn't get the nice compiler warning when a + // new type is added.) + GOOGLE_LOG(FATAL) << "Can't get here."; + return ""; +} + +// Convert a file name into a valid identifier. +string FilenameIdentifier(const string& filename) { + string result; + for (int i = 0; i < filename.size(); i++) { + if (ascii_isalnum(filename[i])) { + result.push_back(filename[i]); + } else { + // Not alphanumeric. To avoid any possibility of name conflicts we + // use the hex code for the character. + result.push_back('_'); + char buffer[kFastToBufferSize]; + result.append(FastHexToBuffer(static_cast(filename[i]), buffer)); + } + } + return result; +} + +// Return the name of the AddDescriptors() function for a given file. +string GlobalAddDescriptorsName(const string& filename) { + return "protobuf_AddDesc_" + FilenameIdentifier(filename); +} + +// Return the name of the AssignDescriptors() function for a given file. +string GlobalAssignDescriptorsName(const string& filename) { + return "protobuf_AssignDesc_" + FilenameIdentifier(filename); +} + +// Return the name of the ShutdownFile() function for a given file. +string GlobalShutdownFileName(const string& filename) { + return "protobuf_ShutdownFile_" + FilenameIdentifier(filename); +} + +// Escape C++ trigraphs by escaping question marks to \? +string EscapeTrigraphs(const string& to_escape) { + return StringReplace(to_escape, "?", "\\?", true); +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h new file mode 100644 index 000000000..b13d53bef --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h @@ -0,0 +1,159 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +// Commonly-used separator comments. Thick is a line of '=', thin is a line +// of '-'. +extern const char kThickSeparator[]; +extern const char kThinSeparator[]; + +// Returns the non-nested type name for the given type. If "qualified" is +// true, prefix the type with the full namespace. For example, if you had: +// package foo.bar; +// message Baz { message Qux {} } +// Then the qualified ClassName for Qux would be: +// ::foo::bar::Baz_Qux +// While the non-qualified version would be: +// Baz_Qux +string ClassName(const Descriptor* descriptor, bool qualified); +string ClassName(const EnumDescriptor* enum_descriptor, bool qualified); + +string SuperClassName(const Descriptor* descriptor); + +// Get the (unqualified) name that should be used for this field in C++ code. +// The name is coerced to lower-case to emulate proto1 behavior. People +// should be using lowercase-with-underscores style for proto field names +// anyway, so normally this just returns field->name(). +string FieldName(const FieldDescriptor* field); + +// Get the unqualified name that should be used for a field's field +// number constant. +string FieldConstantName(const FieldDescriptor *field); + +// Returns the scope where the field was defined (for extensions, this is +// different from the message type to which the field applies). +inline const Descriptor* FieldScope(const FieldDescriptor* field) { + return field->is_extension() ? + field->extension_scope() : field->containing_type(); +} + +// Returns the fully-qualified type name field->message_type(). Usually this +// is just ClassName(field->message_type(), true); +string FieldMessageTypeName(const FieldDescriptor* field); + +// Strips ".proto" or ".protodevel" from the end of a filename. +string StripProto(const string& filename); + +// Get the C++ type name for a primitive type (e.g. "double", "::google::protobuf::int32", etc.). +// Note: non-built-in type names will be qualified, meaning they will start +// with a ::. If you are using the type as a template parameter, you will +// need to insure there is a space between the < and the ::, because the +// ridiculous C++ standard defines "<:" to be a synonym for "[". +const char* PrimitiveTypeName(FieldDescriptor::CppType type); + +// Get the declared type name in CamelCase format, as is used e.g. for the +// methods of WireFormat. For example, TYPE_INT32 becomes "Int32". +const char* DeclaredTypeMethodName(FieldDescriptor::Type type); + +// Get code that evaluates to the field's default value. +string DefaultValue(const FieldDescriptor* field); + +// Convert a file name into a valid identifier. +string FilenameIdentifier(const string& filename); + +// Return the name of the AddDescriptors() function for a given file. +string GlobalAddDescriptorsName(const string& filename); + +// Return the name of the AssignDescriptors() function for a given file. +string GlobalAssignDescriptorsName(const string& filename); + +// Return the name of the ShutdownFile() function for a given file. +string GlobalShutdownFileName(const string& filename); + +// Escape C++ trigraphs by escaping question marks to \? +string EscapeTrigraphs(const string& to_escape); + +// Do message classes in this file keep track of unknown fields? +inline bool HasUnknownFields(const FileDescriptor *file) { + return file->options().optimize_for() != FileOptions::LITE_RUNTIME; +} + +// Does this file have generated parsing, serialization, and other +// standard methods for which reflection-based fallback implementations exist? +inline bool HasGeneratedMethods(const FileDescriptor *file) { + return file->options().optimize_for() != FileOptions::CODE_SIZE; +} + +// Do message classes in this file have descriptor and refelction methods? +inline bool HasDescriptorMethods(const FileDescriptor *file) { + return file->options().optimize_for() != FileOptions::LITE_RUNTIME; +} + +// Should we generate generic services for this file? +inline bool HasGenericServices(const FileDescriptor *file) { + return file->service_count() > 0 && + file->options().optimize_for() != FileOptions::LITE_RUNTIME && + file->options().cc_generic_services(); +} + +// Should string fields in this file verify that their contents are UTF-8? +inline bool HasUtf8Verification(const FileDescriptor* file) { + return file->options().optimize_for() != FileOptions::LITE_RUNTIME; +} + +// Should we generate a separate, super-optimized code path for serializing to +// flat arrays? We don't do this in Lite mode because we'd rather reduce code +// size. +inline bool HasFastArraySerialization(const FileDescriptor* file) { + return file->options().optimize_for() == FileOptions::SPEED; +} + + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_HELPERS_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc new file mode 100644 index 000000000..c4e6fb2c8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc @@ -0,0 +1,1933 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +using internal::WireFormat; +using internal::WireFormatLite; + +namespace { + +void PrintFieldComment(io::Printer* printer, const FieldDescriptor* field) { + // Print the field's proto-syntax definition as a comment. We don't want to + // print group bodies so we cut off after the first line. + string def = field->DebugString(); + printer->Print("// $def$\n", + "def", def.substr(0, def.find_first_of('\n'))); +} + +struct FieldOrderingByNumber { + inline bool operator()(const FieldDescriptor* a, + const FieldDescriptor* b) const { + return a->number() < b->number(); + } +}; + +const char* kWireTypeNames[] = { + "VARINT", + "FIXED64", + "LENGTH_DELIMITED", + "START_GROUP", + "END_GROUP", + "FIXED32", +}; + +// Sort the fields of the given Descriptor by number into a new[]'d array +// and return it. +const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) { + const FieldDescriptor** fields = + new const FieldDescriptor*[descriptor->field_count()]; + for (int i = 0; i < descriptor->field_count(); i++) { + fields[i] = descriptor->field(i); + } + sort(fields, fields + descriptor->field_count(), + FieldOrderingByNumber()); + return fields; +} + +// Functor for sorting extension ranges by their "start" field number. +struct ExtensionRangeSorter { + bool operator()(const Descriptor::ExtensionRange* left, + const Descriptor::ExtensionRange* right) const { + return left->start < right->start; + } +}; + +// Returns true if the message type has any required fields. If it doesn't, +// we can optimize out calls to its IsInitialized() method. +// +// already_seen is used to avoid checking the same type multiple times +// (and also to protect against recursion). +static bool HasRequiredFields( + const Descriptor* type, + hash_set* already_seen) { + if (already_seen->count(type) > 0) { + // Since the first occurrence of a required field causes the whole + // function to return true, we can assume that if the type is already + // in the cache it didn't have any required fields. + return false; + } + already_seen->insert(type); + + // If the type has extensions, an extension with message type could contain + // required fields, so we have to be conservative and assume such an + // extension exists. + if (type->extension_range_count() > 0) return true; + + for (int i = 0; i < type->field_count(); i++) { + const FieldDescriptor* field = type->field(i); + if (field->is_required()) { + return true; + } + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (HasRequiredFields(field->message_type(), already_seen)) { + return true; + } + } + } + + return false; +} + +static bool HasRequiredFields(const Descriptor* type) { + hash_set already_seen; + return HasRequiredFields(type, &already_seen); +} + +// This returns an estimate of the compiler's alignment for the field. This +// can't guarantee to be correct because the generated code could be compiled on +// different systems with different alignment rules. The estimates below assume +// 64-bit pointers. +int EstimateAlignmentSize(const FieldDescriptor* field) { + if (field == NULL) return 0; + if (field->is_repeated()) return 8; + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_BOOL: + return 1; + + case FieldDescriptor::CPPTYPE_INT32: + case FieldDescriptor::CPPTYPE_UINT32: + case FieldDescriptor::CPPTYPE_ENUM: + case FieldDescriptor::CPPTYPE_FLOAT: + return 4; + + case FieldDescriptor::CPPTYPE_INT64: + case FieldDescriptor::CPPTYPE_UINT64: + case FieldDescriptor::CPPTYPE_DOUBLE: + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_MESSAGE: + return 8; + } + GOOGLE_LOG(FATAL) << "Can't get here."; + return -1; // Make compiler happy. +} + +// FieldGroup is just a helper for OptimizePadding below. It holds a vector of +// fields that are grouped together because they have compatible alignment, and +// a preferred location in the final field ordering. +class FieldGroup { + public: + FieldGroup() + : preferred_location_(0) {} + + // A group with a single field. + FieldGroup(float preferred_location, const FieldDescriptor* field) + : preferred_location_(preferred_location), + fields_(1, field) {} + + // Append the fields in 'other' to this group. + void Append(const FieldGroup& other) { + if (other.fields_.empty()) { + return; + } + // Preferred location is the average among all the fields, so we weight by + // the number of fields on each FieldGroup object. + preferred_location_ = + (preferred_location_ * fields_.size() + + (other.preferred_location_ * other.fields_.size())) / + (fields_.size() + other.fields_.size()); + fields_.insert(fields_.end(), other.fields_.begin(), other.fields_.end()); + } + + void SetPreferredLocation(float location) { preferred_location_ = location; } + const vector& fields() const { return fields_; } + + // FieldGroup objects sort by their preferred location. + bool operator<(const FieldGroup& other) const { + return preferred_location_ < other.preferred_location_; + } + + private: + // "preferred_location_" is an estimate of where this group should go in the + // final list of fields. We compute this by taking the average index of each + // field in this group in the original ordering of fields. This is very + // approximate, but should put this group close to where its member fields + // originally went. + float preferred_location_; + vector fields_; + // We rely on the default copy constructor and operator= so this type can be + // used in a vector. +}; + +// Reorder 'fields' so that if the fields are output into a c++ class in the new +// order, the alignment padding is minimized. We try to do this while keeping +// each field as close as possible to its original position so that we don't +// reduce cache locality much for function that access each field in order. +void OptimizePadding(vector* fields) { + // First divide fields into those that align to 1 byte, 4 bytes or 8 bytes. + vector aligned_to_1, aligned_to_4, aligned_to_8; + for (int i = 0; i < fields->size(); ++i) { + switch (EstimateAlignmentSize((*fields)[i])) { + case 1: aligned_to_1.push_back(FieldGroup(i, (*fields)[i])); break; + case 4: aligned_to_4.push_back(FieldGroup(i, (*fields)[i])); break; + case 8: aligned_to_8.push_back(FieldGroup(i, (*fields)[i])); break; + default: + GOOGLE_LOG(FATAL) << "Unknown alignment size."; + } + } + + // Now group fields aligned to 1 byte into sets of 4, and treat those like a + // single field aligned to 4 bytes. + for (int i = 0; i < aligned_to_1.size(); i += 4) { + FieldGroup field_group; + for (int j = i; j < aligned_to_1.size() && j < i + 4; ++j) { + field_group.Append(aligned_to_1[j]); + } + aligned_to_4.push_back(field_group); + } + // Sort by preferred location to keep fields as close to their original + // location as possible. + sort(aligned_to_4.begin(), aligned_to_4.end()); + + // Now group fields aligned to 4 bytes (or the 4-field groups created above) + // into pairs, and treat those like a single field aligned to 8 bytes. + for (int i = 0; i < aligned_to_4.size(); i += 2) { + FieldGroup field_group; + for (int j = i; j < aligned_to_4.size() && j < i + 2; ++j) { + field_group.Append(aligned_to_4[j]); + } + if (i == aligned_to_4.size() - 1) { + // Move incomplete 4-byte block to the end. + field_group.SetPreferredLocation(fields->size() + 1); + } + aligned_to_8.push_back(field_group); + } + // Sort by preferred location to keep fields as close to their original + // location as possible. + sort(aligned_to_8.begin(), aligned_to_8.end()); + + // Now pull out all the FieldDescriptors in order. + fields->clear(); + for (int i = 0; i < aligned_to_8.size(); ++i) { + fields->insert(fields->end(), + aligned_to_8[i].fields().begin(), + aligned_to_8[i].fields().end()); + } +} + +} + +// =================================================================== + +MessageGenerator::MessageGenerator(const Descriptor* descriptor, + const string& dllexport_decl) + : descriptor_(descriptor), + classname_(ClassName(descriptor, false)), + dllexport_decl_(dllexport_decl), + field_generators_(descriptor), + nested_generators_(new scoped_ptr[ + descriptor->nested_type_count()]), + enum_generators_(new scoped_ptr[ + descriptor->enum_type_count()]), + extension_generators_(new scoped_ptr[ + descriptor->extension_count()]) { + + for (int i = 0; i < descriptor->nested_type_count(); i++) { + nested_generators_[i].reset( + new MessageGenerator(descriptor->nested_type(i), dllexport_decl)); + } + + for (int i = 0; i < descriptor->enum_type_count(); i++) { + enum_generators_[i].reset( + new EnumGenerator(descriptor->enum_type(i), dllexport_decl)); + } + + for (int i = 0; i < descriptor->extension_count(); i++) { + extension_generators_[i].reset( + new ExtensionGenerator(descriptor->extension(i), dllexport_decl)); + } +} + +MessageGenerator::~MessageGenerator() {} + +void MessageGenerator:: +GenerateForwardDeclaration(io::Printer* printer) { + printer->Print("class $classname$;\n", + "classname", classname_); + + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateForwardDeclaration(printer); + } +} + +void MessageGenerator:: +GenerateEnumDefinitions(io::Printer* printer) { + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateEnumDefinitions(printer); + } + + for (int i = 0; i < descriptor_->enum_type_count(); i++) { + enum_generators_[i]->GenerateDefinition(printer); + } +} + +void MessageGenerator:: +GenerateGetEnumDescriptorSpecializations(io::Printer* printer) { + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer); + } + for (int i = 0; i < descriptor_->enum_type_count(); i++) { + enum_generators_[i]->GenerateGetEnumDescriptorSpecializations(printer); + } +} + +void MessageGenerator:: +GenerateFieldAccessorDeclarations(io::Printer* printer) { + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + PrintFieldComment(printer, field); + + map vars; + SetCommonFieldVariables(field, &vars); + vars["constant_name"] = FieldConstantName(field); + + if (field->is_repeated()) { + printer->Print(vars, "inline int $name$_size() const$deprecation$;\n"); + } else { + printer->Print(vars, "inline bool has_$name$() const$deprecation$;\n"); + } + + printer->Print(vars, "inline void clear_$name$()$deprecation$;\n"); + printer->Print(vars, "static const int $constant_name$ = $number$;\n"); + + // Generate type-specific accessor declarations. + field_generators_.get(field).GenerateAccessorDeclarations(printer); + + printer->Print("\n"); + } + + if (descriptor_->extension_range_count() > 0) { + // Generate accessors for extensions. We just call a macro located in + // extension_set.h since the accessors about 80 lines of static code. + printer->Print( + "GOOGLE_PROTOBUF_EXTENSION_ACCESSORS($classname$)\n", + "classname", classname_); + } +} + +void MessageGenerator:: +GenerateFieldAccessorDefinitions(io::Printer* printer) { + printer->Print("// $classname$\n\n", "classname", classname_); + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + PrintFieldComment(printer, field); + + map vars; + SetCommonFieldVariables(field, &vars); + + // Generate has_$name$() or $name$_size(). + if (field->is_repeated()) { + printer->Print(vars, + "inline int $classname$::$name$_size() const {\n" + " return $name$_.size();\n" + "}\n"); + } else { + // Singular field. + char buffer[kFastToBufferSize]; + vars["has_array_index"] = SimpleItoa(field->index() / 32); + vars["has_mask"] = FastHex32ToBuffer(1u << (field->index() % 32), buffer); + printer->Print(vars, + "inline bool $classname$::has_$name$() const {\n" + " return (_has_bits_[$has_array_index$] & 0x$has_mask$u) != 0;\n" + "}\n" + "inline void $classname$::set_has_$name$() {\n" + " _has_bits_[$has_array_index$] |= 0x$has_mask$u;\n" + "}\n" + "inline void $classname$::clear_has_$name$() {\n" + " _has_bits_[$has_array_index$] &= ~0x$has_mask$u;\n" + "}\n" + ); + } + + // Generate clear_$name$() + printer->Print(vars, + "inline void $classname$::clear_$name$() {\n"); + + printer->Indent(); + field_generators_.get(field).GenerateClearingCode(printer); + printer->Outdent(); + + if (!field->is_repeated()) { + printer->Print(vars, + " clear_has_$name$();\n"); + } + + printer->Print("}\n"); + + // Generate type-specific accessors. + field_generators_.get(field).GenerateInlineAccessorDefinitions(printer); + + printer->Print("\n"); + } +} + +void MessageGenerator:: +GenerateClassDefinition(io::Printer* printer) { + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateClassDefinition(printer); + printer->Print("\n"); + printer->Print(kThinSeparator); + printer->Print("\n"); + } + + map vars; + vars["classname"] = classname_; + vars["field_count"] = SimpleItoa(descriptor_->field_count()); + if (dllexport_decl_.empty()) { + vars["dllexport"] = ""; + } else { + vars["dllexport"] = dllexport_decl_ + " "; + } + vars["superclass"] = SuperClassName(descriptor_); + + printer->Print(vars, + "class $dllexport$$classname$ : public $superclass$ {\n" + " public:\n"); + printer->Indent(); + + printer->Print(vars, + "$classname$();\n" + "virtual ~$classname$();\n" + "\n" + "$classname$(const $classname$& from);\n" + "\n" + "inline $classname$& operator=(const $classname$& from) {\n" + " CopyFrom(from);\n" + " return *this;\n" + "}\n" + "\n"); + + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + "inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {\n" + " return _unknown_fields_;\n" + "}\n" + "\n" + "inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {\n" + " return &_unknown_fields_;\n" + "}\n" + "\n"); + } + + // Only generate this member if it's not disabled. + if (HasDescriptorMethods(descriptor_->file()) && + !descriptor_->options().no_standard_descriptor_accessor()) { + printer->Print(vars, + "static const ::google::protobuf::Descriptor* descriptor();\n"); + } + + printer->Print(vars, + "static const $classname$& default_instance();\n" + "\n"); + + + printer->Print(vars, + "void Swap($classname$* other);\n" + "\n" + "// implements Message ----------------------------------------------\n" + "\n" + "$classname$* New() const;\n"); + + if (HasGeneratedMethods(descriptor_->file())) { + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print(vars, + "void CopyFrom(const ::google::protobuf::Message& from);\n" + "void MergeFrom(const ::google::protobuf::Message& from);\n"); + } else { + printer->Print(vars, + "void CheckTypeAndMergeFrom(const ::google::protobuf::MessageLite& from);\n"); + } + + printer->Print(vars, + "void CopyFrom(const $classname$& from);\n" + "void MergeFrom(const $classname$& from);\n" + "void Clear();\n" + "bool IsInitialized() const;\n" + "\n" + "int ByteSize() const;\n" + "bool MergePartialFromCodedStream(\n" + " ::google::protobuf::io::CodedInputStream* input);\n" + "void SerializeWithCachedSizes(\n" + " ::google::protobuf::io::CodedOutputStream* output) const;\n"); + if (HasFastArraySerialization(descriptor_->file())) { + printer->Print( + "::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;\n"); + } + } + + printer->Print(vars, + "int GetCachedSize() const { return _cached_size_; }\n" + "private:\n" + "void SharedCtor();\n" + "void SharedDtor();\n" + "void SetCachedSize(int size) const;\n" + "public:\n" + "\n"); + + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print( + "::google::protobuf::Metadata GetMetadata() const;\n" + "\n"); + } else { + printer->Print( + "::std::string GetTypeName() const;\n" + "\n"); + } + + printer->Print( + "// nested types ----------------------------------------------------\n" + "\n"); + + // Import all nested message classes into this class's scope with typedefs. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + const Descriptor* nested_type = descriptor_->nested_type(i); + printer->Print("typedef $nested_full_name$ $nested_name$;\n", + "nested_name", nested_type->name(), + "nested_full_name", ClassName(nested_type, false)); + } + + if (descriptor_->nested_type_count() > 0) { + printer->Print("\n"); + } + + // Import all nested enums and their values into this class's scope with + // typedefs and constants. + for (int i = 0; i < descriptor_->enum_type_count(); i++) { + enum_generators_[i]->GenerateSymbolImports(printer); + printer->Print("\n"); + } + + printer->Print( + "// accessors -------------------------------------------------------\n" + "\n"); + + // Generate accessor methods for all fields. + GenerateFieldAccessorDeclarations(printer); + + // Declare extension identifiers. + for (int i = 0; i < descriptor_->extension_count(); i++) { + extension_generators_[i]->GenerateDeclaration(printer); + } + + + printer->Print( + "// @@protoc_insertion_point(class_scope:$full_name$)\n", + "full_name", descriptor_->full_name()); + + // Generate private members. + printer->Outdent(); + printer->Print(" private:\n"); + printer->Indent(); + + for (int i = 0; i < descriptor_->field_count(); i++) { + if (!descriptor_->field(i)->is_repeated()) { + printer->Print( + "inline void set_has_$name$();\n", + "name", FieldName(descriptor_->field(i))); + printer->Print( + "inline void clear_has_$name$();\n", + "name", FieldName(descriptor_->field(i))); + } + } + printer->Print("\n"); + + // To minimize padding, data members are divided into three sections: + // (1) members assumed to align to 8 bytes + // (2) members corresponding to message fields, re-ordered to optimize + // alignment. + // (3) members assumed to align to 4 bytes. + + // Members assumed to align to 8 bytes: + + if (descriptor_->extension_range_count() > 0) { + printer->Print( + "::google::protobuf::internal::ExtensionSet _extensions_;\n" + "\n"); + } + + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + "::google::protobuf::UnknownFieldSet _unknown_fields_;\n" + "\n"); + } + + // Field members: + + vector fields; + for (int i = 0; i < descriptor_->field_count(); i++) { + fields.push_back(descriptor_->field(i)); + } + OptimizePadding(&fields); + for (int i = 0; i < fields.size(); ++i) { + field_generators_.get(fields[i]).GeneratePrivateMembers(printer); + } + + // Members assumed to align to 4 bytes: + + // TODO(kenton): Make _cached_size_ an atomic when C++ supports it. + printer->Print( + "\n" + "mutable int _cached_size_;\n"); + + // Generate _has_bits_. + if (descriptor_->field_count() > 0) { + printer->Print(vars, + "::google::protobuf::uint32 _has_bits_[($field_count$ + 31) / 32];\n" + "\n"); + } else { + // Zero-size arrays aren't technically allowed, and MSVC in particular + // doesn't like them. We still need to declare these arrays to make + // other code compile. Since this is an uncommon case, we'll just declare + // them with size 1 and waste some space. Oh well. + printer->Print( + "::google::protobuf::uint32 _has_bits_[1];\n" + "\n"); + } + + // Declare AddDescriptors(), BuildDescriptors(), and ShutdownFile() as + // friends so that they can access private static variables like + // default_instance_ and reflection_. + printer->Print( + "friend void $dllexport_decl$ $adddescriptorsname$();\n", + "dllexport_decl", dllexport_decl_, + "adddescriptorsname", + GlobalAddDescriptorsName(descriptor_->file()->name())); + printer->Print( + "friend void $assigndescriptorsname$();\n" + "friend void $shutdownfilename$();\n" + "\n", + "assigndescriptorsname", + GlobalAssignDescriptorsName(descriptor_->file()->name()), + "shutdownfilename", GlobalShutdownFileName(descriptor_->file()->name())); + + printer->Print( + "void InitAsDefaultInstance();\n" + "static $classname$* default_instance_;\n", + "classname", classname_); + + printer->Outdent(); + printer->Print(vars, "};"); +} + +void MessageGenerator:: +GenerateInlineMethods(io::Printer* printer) { + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateInlineMethods(printer); + printer->Print(kThinSeparator); + printer->Print("\n"); + } + + GenerateFieldAccessorDefinitions(printer); +} + +void MessageGenerator:: +GenerateDescriptorDeclarations(io::Printer* printer) { + printer->Print( + "const ::google::protobuf::Descriptor* $name$_descriptor_ = NULL;\n" + "const ::google::protobuf::internal::GeneratedMessageReflection*\n" + " $name$_reflection_ = NULL;\n", + "name", classname_); + + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateDescriptorDeclarations(printer); + } + + for (int i = 0; i < descriptor_->enum_type_count(); i++) { + printer->Print( + "const ::google::protobuf::EnumDescriptor* $name$_descriptor_ = NULL;\n", + "name", ClassName(descriptor_->enum_type(i), false)); + } +} + +void MessageGenerator:: +GenerateDescriptorInitializer(io::Printer* printer, int index) { + // TODO(kenton): Passing the index to this method is redundant; just use + // descriptor_->index() instead. + map vars; + vars["classname"] = classname_; + vars["index"] = SimpleItoa(index); + + // Obtain the descriptor from the parent's descriptor. + if (descriptor_->containing_type() == NULL) { + printer->Print(vars, + "$classname$_descriptor_ = file->message_type($index$);\n"); + } else { + vars["parent"] = ClassName(descriptor_->containing_type(), false); + printer->Print(vars, + "$classname$_descriptor_ = " + "$parent$_descriptor_->nested_type($index$);\n"); + } + + // Generate the offsets. + GenerateOffsets(printer); + + // Construct the reflection object. + printer->Print(vars, + "$classname$_reflection_ =\n" + " new ::google::protobuf::internal::GeneratedMessageReflection(\n" + " $classname$_descriptor_,\n" + " $classname$::default_instance_,\n" + " $classname$_offsets_,\n" + " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, _has_bits_[0]),\n" + " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(" + "$classname$, _unknown_fields_),\n"); + if (descriptor_->extension_range_count() > 0) { + printer->Print(vars, + " GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(" + "$classname$, _extensions_),\n"); + } else { + // No extensions. + printer->Print(vars, + " -1,\n"); + } + printer->Print(vars, + " ::google::protobuf::DescriptorPool::generated_pool(),\n" + " ::google::protobuf::MessageFactory::generated_factory(),\n" + " sizeof($classname$));\n"); + + // Handle nested types. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateDescriptorInitializer(printer, i); + } + + for (int i = 0; i < descriptor_->enum_type_count(); i++) { + enum_generators_[i]->GenerateDescriptorInitializer(printer, i); + } +} + +void MessageGenerator:: +GenerateTypeRegistrations(io::Printer* printer) { + // Register this message type with the message factory. + printer->Print( + "::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(\n" + " $classname$_descriptor_, &$classname$::default_instance());\n", + "classname", classname_); + + // Handle nested types. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateTypeRegistrations(printer); + } +} + +void MessageGenerator:: +GenerateDefaultInstanceAllocator(io::Printer* printer) { + // Construct the default instance. We can't call InitAsDefaultInstance() yet + // because we need to make sure all default instances that this one might + // depend on are constructed first. + printer->Print( + "$classname$::default_instance_ = new $classname$();\n", + "classname", classname_); + + // Handle nested types. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateDefaultInstanceAllocator(printer); + } + +} + +void MessageGenerator:: +GenerateDefaultInstanceInitializer(io::Printer* printer) { + printer->Print( + "$classname$::default_instance_->InitAsDefaultInstance();\n", + "classname", classname_); + + // Register extensions. + for (int i = 0; i < descriptor_->extension_count(); i++) { + extension_generators_[i]->GenerateRegistration(printer); + } + + // Handle nested types. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateDefaultInstanceInitializer(printer); + } +} + +void MessageGenerator:: +GenerateShutdownCode(io::Printer* printer) { + printer->Print( + "delete $classname$::default_instance_;\n", + "classname", classname_); + + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print( + "delete $classname$_reflection_;\n", + "classname", classname_); + } + + // Handle nested types. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateShutdownCode(printer); + } +} + +void MessageGenerator:: +GenerateClassMethods(io::Printer* printer) { + for (int i = 0; i < descriptor_->enum_type_count(); i++) { + enum_generators_[i]->GenerateMethods(printer); + } + + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + nested_generators_[i]->GenerateClassMethods(printer); + printer->Print("\n"); + printer->Print(kThinSeparator); + printer->Print("\n"); + } + + // Generate non-inline field definitions. + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)) + .GenerateNonInlineAccessorDefinitions(printer); + } + + // Generate field number constants. + printer->Print("#ifndef _MSC_VER\n"); + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor *field = descriptor_->field(i); + printer->Print( + "const int $classname$::$constant_name$;\n", + "classname", ClassName(FieldScope(field), false), + "constant_name", FieldConstantName(field)); + } + printer->Print( + "#endif // !_MSC_VER\n" + "\n"); + + // Define extension identifiers. + for (int i = 0; i < descriptor_->extension_count(); i++) { + extension_generators_[i]->GenerateDefinition(printer); + } + + GenerateStructors(printer); + printer->Print("\n"); + + if (HasGeneratedMethods(descriptor_->file())) { + GenerateClear(printer); + printer->Print("\n"); + + GenerateMergeFromCodedStream(printer); + printer->Print("\n"); + + GenerateSerializeWithCachedSizes(printer); + printer->Print("\n"); + + if (HasFastArraySerialization(descriptor_->file())) { + GenerateSerializeWithCachedSizesToArray(printer); + printer->Print("\n"); + } + + GenerateByteSize(printer); + printer->Print("\n"); + + GenerateMergeFrom(printer); + printer->Print("\n"); + + GenerateCopyFrom(printer); + printer->Print("\n"); + + GenerateIsInitialized(printer); + printer->Print("\n"); + } + + GenerateSwap(printer); + printer->Print("\n"); + + if (HasDescriptorMethods(descriptor_->file())) { + printer->Print( + "::google::protobuf::Metadata $classname$::GetMetadata() const {\n" + " protobuf_AssignDescriptorsOnce();\n" + " ::google::protobuf::Metadata metadata;\n" + " metadata.descriptor = $classname$_descriptor_;\n" + " metadata.reflection = $classname$_reflection_;\n" + " return metadata;\n" + "}\n" + "\n", + "classname", classname_); + } else { + printer->Print( + "::std::string $classname$::GetTypeName() const {\n" + " return \"$type_name$\";\n" + "}\n" + "\n", + "classname", classname_, + "type_name", descriptor_->full_name()); + } + +} + +void MessageGenerator:: +GenerateOffsets(io::Printer* printer) { + printer->Print( + "static const int $classname$_offsets_[$field_count$] = {\n", + "classname", classname_, + "field_count", SimpleItoa(max(1, descriptor_->field_count()))); + printer->Indent(); + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + printer->Print( + "GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET($classname$, $name$_),\n", + "classname", classname_, + "name", FieldName(field)); + } + + printer->Outdent(); + printer->Print("};\n"); +} + +void MessageGenerator:: +GenerateSharedConstructorCode(io::Printer* printer) { + printer->Print( + "void $classname$::SharedCtor() {\n", + "classname", classname_); + printer->Indent(); + + printer->Print( + "_cached_size_ = 0;\n"); + + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)) + .GenerateConstructorCode(printer); + } + + printer->Print( + "::memset(_has_bits_, 0, sizeof(_has_bits_));\n"); + + printer->Outdent(); + printer->Print("}\n\n"); +} + +void MessageGenerator:: +GenerateSharedDestructorCode(io::Printer* printer) { + printer->Print( + "void $classname$::SharedDtor() {\n", + "classname", classname_); + printer->Indent(); + // Write the destructors for each field. + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)) + .GenerateDestructorCode(printer); + } + + printer->Print( + "if (this != default_instance_) {\n"); + + // We need to delete all embedded messages. + // TODO(kenton): If we make unset messages point at default instances + // instead of NULL, then it would make sense to move this code into + // MessageFieldGenerator::GenerateDestructorCode(). + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (!field->is_repeated() && + field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + printer->Print(" delete $name$_;\n", + "name", FieldName(field)); + } + } + + printer->Outdent(); + printer->Print( + " }\n" + "}\n" + "\n"); +} + +void MessageGenerator:: +GenerateStructors(io::Printer* printer) { + string superclass = SuperClassName(descriptor_); + + // Generate the default constructor. + printer->Print( + "$classname$::$classname$()\n" + " : $superclass$() {\n" + " SharedCtor();\n" + "}\n", + "classname", classname_, + "superclass", superclass); + + printer->Print( + "\n" + "void $classname$::InitAsDefaultInstance() {\n", + "classname", classname_); + + // The default instance needs all of its embedded message pointers + // cross-linked to other default instances. We can't do this initialization + // in the constructor because some other default instances may not have been + // constructed yet at that time. + // TODO(kenton): Maybe all message fields (even for non-default messages) + // should be initialized to point at default instances rather than NULL? + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (!field->is_repeated() && + field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + printer->Print( + " $name$_ = const_cast< $type$*>(&$type$::default_instance());\n", + "name", FieldName(field), + "type", FieldMessageTypeName(field)); + } + } + printer->Print( + "}\n" + "\n"); + + // Generate the copy constructor. + printer->Print( + "$classname$::$classname$(const $classname$& from)\n" + " : $superclass$() {\n" + " SharedCtor();\n" + " MergeFrom(from);\n" + "}\n" + "\n", + "classname", classname_, + "superclass", superclass); + + // Generate the shared constructor code. + GenerateSharedConstructorCode(printer); + + // Generate the destructor. + printer->Print( + "$classname$::~$classname$() {\n" + " SharedDtor();\n" + "}\n" + "\n", + "classname", classname_); + + // Generate the shared destructor code. + GenerateSharedDestructorCode(printer); + + // Generate SetCachedSize. + printer->Print( + "void $classname$::SetCachedSize(int size) const {\n" + " GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" + " _cached_size_ = size;\n" + " GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" + "}\n", + "classname", classname_); + + // Only generate this member if it's not disabled. + if (HasDescriptorMethods(descriptor_->file()) && + !descriptor_->options().no_standard_descriptor_accessor()) { + printer->Print( + "const ::google::protobuf::Descriptor* $classname$::descriptor() {\n" + " protobuf_AssignDescriptorsOnce();\n" + " return $classname$_descriptor_;\n" + "}\n" + "\n", + "classname", classname_, + "adddescriptorsname", + GlobalAddDescriptorsName(descriptor_->file()->name())); + } + + printer->Print( + "const $classname$& $classname$::default_instance() {\n" + " if (default_instance_ == NULL) $adddescriptorsname$();" + " return *default_instance_;\n" + "}\n" + "\n" + "$classname$* $classname$::default_instance_ = NULL;\n" + "\n" + "$classname$* $classname$::New() const {\n" + " return new $classname$;\n" + "}\n", + "classname", classname_, + "adddescriptorsname", + GlobalAddDescriptorsName(descriptor_->file()->name())); + +} + +void MessageGenerator:: +GenerateClear(io::Printer* printer) { + printer->Print("void $classname$::Clear() {\n", + "classname", classname_); + printer->Indent(); + + int last_index = -1; + + if (descriptor_->extension_range_count() > 0) { + printer->Print("_extensions_.Clear();\n"); + } + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (!field->is_repeated()) { + // We can use the fact that _has_bits_ is a giant bitfield to our + // advantage: We can check up to 32 bits at a time for equality to + // zero, and skip the whole range if so. This can improve the speed + // of Clear() for messages which contain a very large number of + // optional fields of which only a few are used at a time. Here, + // we've chosen to check 8 bits at a time rather than 32. + if (i / 8 != last_index / 8 || last_index < 0) { + if (last_index >= 0) { + printer->Outdent(); + printer->Print("}\n"); + } + printer->Print( + "if (_has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\n", + "index", SimpleItoa(field->index())); + printer->Indent(); + } + last_index = i; + + // It's faster to just overwrite primitive types, but we should + // only clear strings and messages if they were set. + // TODO(kenton): Let the CppFieldGenerator decide this somehow. + bool should_check_bit = + field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE || + field->cpp_type() == FieldDescriptor::CPPTYPE_STRING; + + if (should_check_bit) { + printer->Print( + "if (has_$name$()) {\n", + "name", FieldName(field)); + printer->Indent(); + } + + field_generators_.get(field).GenerateClearingCode(printer); + + if (should_check_bit) { + printer->Outdent(); + printer->Print("}\n"); + } + } + } + + if (last_index >= 0) { + printer->Outdent(); + printer->Print("}\n"); + } + + // Repeated fields don't use _has_bits_ so we clear them in a separate + // pass. + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (field->is_repeated()) { + field_generators_.get(field).GenerateClearingCode(printer); + } + } + + printer->Print( + "::memset(_has_bits_, 0, sizeof(_has_bits_));\n"); + + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + "mutable_unknown_fields()->Clear();\n"); + } + + printer->Outdent(); + printer->Print("}\n"); +} + +void MessageGenerator:: +GenerateSwap(io::Printer* printer) { + // Generate the Swap member function. + printer->Print("void $classname$::Swap($classname$* other) {\n", + "classname", classname_); + printer->Indent(); + printer->Print("if (other != this) {\n"); + printer->Indent(); + + if (HasGeneratedMethods(descriptor_->file())) { + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + field_generators_.get(field).GenerateSwappingCode(printer); + } + + for (int i = 0; i < (descriptor_->field_count() + 31) / 32; ++i) { + printer->Print("std::swap(_has_bits_[$i$], other->_has_bits_[$i$]);\n", + "i", SimpleItoa(i)); + } + + if (HasUnknownFields(descriptor_->file())) { + printer->Print("_unknown_fields_.Swap(&other->_unknown_fields_);\n"); + } + printer->Print("std::swap(_cached_size_, other->_cached_size_);\n"); + if (descriptor_->extension_range_count() > 0) { + printer->Print("_extensions_.Swap(&other->_extensions_);\n"); + } + } else { + printer->Print("GetReflection()->Swap(this, other);"); + } + + printer->Outdent(); + printer->Print("}\n"); + printer->Outdent(); + printer->Print("}\n"); +} + +void MessageGenerator:: +GenerateMergeFrom(io::Printer* printer) { + if (HasDescriptorMethods(descriptor_->file())) { + // Generate the generalized MergeFrom (aka that which takes in the Message + // base class as a parameter). + printer->Print( + "void $classname$::MergeFrom(const ::google::protobuf::Message& from) {\n" + " GOOGLE_CHECK_NE(&from, this);\n", + "classname", classname_); + printer->Indent(); + + // Cast the message to the proper type. If we find that the message is + // *not* of the proper type, we can still call Merge via the reflection + // system, as the GOOGLE_CHECK above ensured that we have the same descriptor + // for each message. + printer->Print( + "const $classname$* source =\n" + " ::google::protobuf::internal::dynamic_cast_if_available(\n" + " &from);\n" + "if (source == NULL) {\n" + " ::google::protobuf::internal::ReflectionOps::Merge(from, this);\n" + "} else {\n" + " MergeFrom(*source);\n" + "}\n", + "classname", classname_); + + printer->Outdent(); + printer->Print("}\n\n"); + } else { + // Generate CheckTypeAndMergeFrom(). + printer->Print( + "void $classname$::CheckTypeAndMergeFrom(\n" + " const ::google::protobuf::MessageLite& from) {\n" + " MergeFrom(*::google::protobuf::down_cast(&from));\n" + "}\n" + "\n", + "classname", classname_); + } + + // Generate the class-specific MergeFrom, which avoids the GOOGLE_CHECK and cast. + printer->Print( + "void $classname$::MergeFrom(const $classname$& from) {\n" + " GOOGLE_CHECK_NE(&from, this);\n", + "classname", classname_); + printer->Indent(); + + // Merge Repeated fields. These fields do not require a + // check as we can simply iterate over them. + for (int i = 0; i < descriptor_->field_count(); ++i) { + const FieldDescriptor* field = descriptor_->field(i); + + if (field->is_repeated()) { + field_generators_.get(field).GenerateMergingCode(printer); + } + } + + // Merge Optional and Required fields (after a _has_bit check). + int last_index = -1; + + for (int i = 0; i < descriptor_->field_count(); ++i) { + const FieldDescriptor* field = descriptor_->field(i); + + if (!field->is_repeated()) { + // See above in GenerateClear for an explanation of this. + if (i / 8 != last_index / 8 || last_index < 0) { + if (last_index >= 0) { + printer->Outdent(); + printer->Print("}\n"); + } + printer->Print( + "if (from._has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\n", + "index", SimpleItoa(field->index())); + printer->Indent(); + } + + last_index = i; + + printer->Print( + "if (from.has_$name$()) {\n", + "name", FieldName(field)); + printer->Indent(); + + field_generators_.get(field).GenerateMergingCode(printer); + + printer->Outdent(); + printer->Print("}\n"); + } + } + + if (last_index >= 0) { + printer->Outdent(); + printer->Print("}\n"); + } + + if (descriptor_->extension_range_count() > 0) { + printer->Print("_extensions_.MergeFrom(from._extensions_);\n"); + } + + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + "mutable_unknown_fields()->MergeFrom(from.unknown_fields());\n"); + } + + printer->Outdent(); + printer->Print("}\n"); +} + +void MessageGenerator:: +GenerateCopyFrom(io::Printer* printer) { + if (HasDescriptorMethods(descriptor_->file())) { + // Generate the generalized CopyFrom (aka that which takes in the Message + // base class as a parameter). + printer->Print( + "void $classname$::CopyFrom(const ::google::protobuf::Message& from) {\n", + "classname", classname_); + printer->Indent(); + + printer->Print( + "if (&from == this) return;\n" + "Clear();\n" + "MergeFrom(from);\n"); + + printer->Outdent(); + printer->Print("}\n\n"); + } + + // Generate the class-specific CopyFrom. + printer->Print( + "void $classname$::CopyFrom(const $classname$& from) {\n", + "classname", classname_); + printer->Indent(); + + printer->Print( + "if (&from == this) return;\n" + "Clear();\n" + "MergeFrom(from);\n"); + + printer->Outdent(); + printer->Print("}\n"); +} + +void MessageGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) { + if (descriptor_->options().message_set_wire_format()) { + // Special-case MessageSet. + printer->Print( + "bool $classname$::MergePartialFromCodedStream(\n" + " ::google::protobuf::io::CodedInputStream* input) {\n" + " return _extensions_.ParseMessageSet(input, default_instance_,\n" + " mutable_unknown_fields());\n" + "}\n", + "classname", classname_); + return; + } + + printer->Print( + "bool $classname$::MergePartialFromCodedStream(\n" + " ::google::protobuf::io::CodedInputStream* input) {\n" + "#define DO_(EXPRESSION) if (!(EXPRESSION)) return false\n" + " ::google::protobuf::uint32 tag;\n" + " while ((tag = input->ReadTag()) != 0) {\n", + "classname", classname_); + + printer->Indent(); + printer->Indent(); + + if (descriptor_->field_count() > 0) { + // We don't even want to print the switch() if we have no fields because + // MSVC dislikes switch() statements that contain only a default value. + + // Note: If we just switched on the tag rather than the field number, we + // could avoid the need for the if() to check the wire type at the beginning + // of each case. However, this is actually a bit slower in practice as it + // creates a jump table that is 8x larger and sparser, and meanwhile the + // if()s are highly predictable. + printer->Print( + "switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {\n"); + + printer->Indent(); + + scoped_array ordered_fields( + SortFieldsByNumber(descriptor_)); + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = ordered_fields[i]; + + PrintFieldComment(printer, field); + + printer->Print( + "case $number$: {\n", + "number", SimpleItoa(field->number())); + printer->Indent(); + const FieldGenerator& field_generator = field_generators_.get(field); + + // Emit code to parse the common, expected case. + printer->Print( + "if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n" + " ::google::protobuf::internal::WireFormatLite::WIRETYPE_$wiretype$) {\n", + "wiretype", kWireTypeNames[WireFormat::WireTypeForField(field)]); + + if (i > 0 || (field->is_repeated() && !field->options().packed())) { + printer->Print( + " parse_$name$:\n", + "name", field->name()); + } + + printer->Indent(); + if (field->options().packed()) { + field_generator.GenerateMergeFromCodedStreamWithPacking(printer); + } else { + field_generator.GenerateMergeFromCodedStream(printer); + } + printer->Outdent(); + + // Emit code to parse unexpectedly packed or unpacked values. + if (field->is_packable() && field->options().packed()) { + printer->Print( + "} else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag)\n" + " == ::google::protobuf::internal::WireFormatLite::\n" + " WIRETYPE_$wiretype$) {\n", + "wiretype", + kWireTypeNames[WireFormat::WireTypeForFieldType(field->type())]); + printer->Indent(); + field_generator.GenerateMergeFromCodedStream(printer); + printer->Outdent(); + } else if (field->is_packable() && !field->options().packed()) { + printer->Print( + "} else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag)\n" + " == ::google::protobuf::internal::WireFormatLite::\n" + " WIRETYPE_LENGTH_DELIMITED) {\n"); + printer->Indent(); + field_generator.GenerateMergeFromCodedStreamWithPacking(printer); + printer->Outdent(); + } + + printer->Print( + "} else {\n" + " goto handle_uninterpreted;\n" + "}\n"); + + // switch() is slow since it can't be predicted well. Insert some if()s + // here that attempt to predict the next tag. + if (field->is_repeated() && !field->options().packed()) { + // Expect repeats of this field. + printer->Print( + "if (input->ExpectTag($tag$)) goto parse_$name$;\n", + "tag", SimpleItoa(WireFormat::MakeTag(field)), + "name", field->name()); + } + + if (i + 1 < descriptor_->field_count()) { + // Expect the next field in order. + const FieldDescriptor* next_field = ordered_fields[i + 1]; + printer->Print( + "if (input->ExpectTag($next_tag$)) goto parse_$next_name$;\n", + "next_tag", SimpleItoa(WireFormat::MakeTag(next_field)), + "next_name", next_field->name()); + } else { + // Expect EOF. + // TODO(kenton): Expect group end-tag? + printer->Print( + "if (input->ExpectAtEnd()) return true;\n"); + } + + printer->Print( + "break;\n"); + + printer->Outdent(); + printer->Print("}\n\n"); + } + + printer->Print( + "default: {\n" + "handle_uninterpreted:\n"); + printer->Indent(); + } + + // Is this an end-group tag? If so, this must be the end of the message. + printer->Print( + "if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==\n" + " ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {\n" + " return true;\n" + "}\n"); + + // Handle extension ranges. + if (descriptor_->extension_range_count() > 0) { + printer->Print( + "if ("); + for (int i = 0; i < descriptor_->extension_range_count(); i++) { + const Descriptor::ExtensionRange* range = + descriptor_->extension_range(i); + if (i > 0) printer->Print(" ||\n "); + + uint32 start_tag = WireFormatLite::MakeTag( + range->start, static_cast(0)); + uint32 end_tag = WireFormatLite::MakeTag( + range->end, static_cast(0)); + + if (range->end > FieldDescriptor::kMaxNumber) { + printer->Print( + "($start$u <= tag)", + "start", SimpleItoa(start_tag)); + } else { + printer->Print( + "($start$u <= tag && tag < $end$u)", + "start", SimpleItoa(start_tag), + "end", SimpleItoa(end_tag)); + } + } + printer->Print(") {\n"); + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + " DO_(_extensions_.ParseField(tag, input, default_instance_,\n" + " mutable_unknown_fields()));\n"); + } else { + printer->Print( + " DO_(_extensions_.ParseField(tag, input, default_instance_));\n"); + } + printer->Print( + " continue;\n" + "}\n"); + } + + // We really don't recognize this tag. Skip it. + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + "DO_(::google::protobuf::internal::WireFormat::SkipField(\n" + " input, tag, mutable_unknown_fields()));\n"); + } else { + printer->Print( + "DO_(::google::protobuf::internal::WireFormatLite::SkipField(input, tag));\n"); + } + + if (descriptor_->field_count() > 0) { + printer->Print("break;\n"); + printer->Outdent(); + printer->Print("}\n"); // default: + printer->Outdent(); + printer->Print("}\n"); // switch + } + + printer->Outdent(); + printer->Outdent(); + printer->Print( + " }\n" // while + " return true;\n" + "#undef DO_\n" + "}\n"); +} + +void MessageGenerator::GenerateSerializeOneField( + io::Printer* printer, const FieldDescriptor* field, bool to_array) { + PrintFieldComment(printer, field); + + if (!field->is_repeated()) { + printer->Print( + "if (has_$name$()) {\n", + "name", FieldName(field)); + printer->Indent(); + } + + if (to_array) { + field_generators_.get(field).GenerateSerializeWithCachedSizesToArray( + printer); + } else { + field_generators_.get(field).GenerateSerializeWithCachedSizes(printer); + } + + if (!field->is_repeated()) { + printer->Outdent(); + printer->Print("}\n"); + } + printer->Print("\n"); +} + +void MessageGenerator::GenerateSerializeOneExtensionRange( + io::Printer* printer, const Descriptor::ExtensionRange* range, + bool to_array) { + map vars; + vars["start"] = SimpleItoa(range->start); + vars["end"] = SimpleItoa(range->end); + printer->Print(vars, + "// Extension range [$start$, $end$)\n"); + if (to_array) { + printer->Print(vars, + "target = _extensions_.SerializeWithCachedSizesToArray(\n" + " $start$, $end$, target);\n\n"); + } else { + printer->Print(vars, + "_extensions_.SerializeWithCachedSizes(\n" + " $start$, $end$, output);\n\n"); + } +} + +void MessageGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) { + if (descriptor_->options().message_set_wire_format()) { + // Special-case MessageSet. + printer->Print( + "void $classname$::SerializeWithCachedSizes(\n" + " ::google::protobuf::io::CodedOutputStream* output) const {\n" + " _extensions_.SerializeMessageSetWithCachedSizes(output);\n", + "classname", classname_); + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + " ::google::protobuf::internal::WireFormat::SerializeUnknownMessageSetItems(\n" + " unknown_fields(), output);\n"); + } + printer->Print( + "}\n"); + return; + } + + printer->Print( + "void $classname$::SerializeWithCachedSizes(\n" + " ::google::protobuf::io::CodedOutputStream* output) const {\n", + "classname", classname_); + printer->Indent(); + + GenerateSerializeWithCachedSizesBody(printer, false); + + printer->Outdent(); + printer->Print( + "}\n"); +} + +void MessageGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) { + if (descriptor_->options().message_set_wire_format()) { + // Special-case MessageSet. + printer->Print( + "::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\n" + " ::google::protobuf::uint8* target) const {\n" + " target =\n" + " _extensions_.SerializeMessageSetWithCachedSizesToArray(target);\n", + "classname", classname_); + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + " target = ::google::protobuf::internal::WireFormat::\n" + " SerializeUnknownMessageSetItemsToArray(\n" + " unknown_fields(), target);\n"); + } + printer->Print( + " return target;\n" + "}\n"); + return; + } + + printer->Print( + "::google::protobuf::uint8* $classname$::SerializeWithCachedSizesToArray(\n" + " ::google::protobuf::uint8* target) const {\n", + "classname", classname_); + printer->Indent(); + + GenerateSerializeWithCachedSizesBody(printer, true); + + printer->Outdent(); + printer->Print( + " return target;\n" + "}\n"); +} + +void MessageGenerator:: +GenerateSerializeWithCachedSizesBody(io::Printer* printer, bool to_array) { + scoped_array ordered_fields( + SortFieldsByNumber(descriptor_)); + + vector sorted_extensions; + for (int i = 0; i < descriptor_->extension_range_count(); ++i) { + sorted_extensions.push_back(descriptor_->extension_range(i)); + } + sort(sorted_extensions.begin(), sorted_extensions.end(), + ExtensionRangeSorter()); + + // Merge the fields and the extension ranges, both sorted by field number. + int i, j; + for (i = 0, j = 0; + i < descriptor_->field_count() || j < sorted_extensions.size(); + ) { + if (i == descriptor_->field_count()) { + GenerateSerializeOneExtensionRange(printer, + sorted_extensions[j++], + to_array); + } else if (j == sorted_extensions.size()) { + GenerateSerializeOneField(printer, ordered_fields[i++], to_array); + } else if (ordered_fields[i]->number() < sorted_extensions[j]->start) { + GenerateSerializeOneField(printer, ordered_fields[i++], to_array); + } else { + GenerateSerializeOneExtensionRange(printer, + sorted_extensions[j++], + to_array); + } + } + + if (HasUnknownFields(descriptor_->file())) { + printer->Print("if (!unknown_fields().empty()) {\n"); + printer->Indent(); + if (to_array) { + printer->Print( + "target = " + "::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(\n" + " unknown_fields(), target);\n"); + } else { + printer->Print( + "::google::protobuf::internal::WireFormat::SerializeUnknownFields(\n" + " unknown_fields(), output);\n"); + } + printer->Outdent(); + + printer->Print( + "}\n"); + } +} + +void MessageGenerator:: +GenerateByteSize(io::Printer* printer) { + if (descriptor_->options().message_set_wire_format()) { + // Special-case MessageSet. + printer->Print( + "int $classname$::ByteSize() const {\n" + " int total_size = _extensions_.MessageSetByteSize();\n", + "classname", classname_); + if (HasUnknownFields(descriptor_->file())) { + printer->Print( + " total_size += ::google::protobuf::internal::WireFormat::\n" + " ComputeUnknownMessageSetItemsSize(unknown_fields());\n"); + } + printer->Print( + " GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" + " _cached_size_ = total_size;\n" + " GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" + " return total_size;\n" + "}\n"); + return; + } + + printer->Print( + "int $classname$::ByteSize() const {\n", + "classname", classname_); + printer->Indent(); + printer->Print( + "int total_size = 0;\n" + "\n"); + + int last_index = -1; + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (!field->is_repeated()) { + // See above in GenerateClear for an explanation of this. + // TODO(kenton): Share code? Unclear how to do so without + // over-engineering. + if ((i / 8) != (last_index / 8) || + last_index < 0) { + if (last_index >= 0) { + printer->Outdent(); + printer->Print("}\n"); + } + printer->Print( + "if (_has_bits_[$index$ / 32] & (0xffu << ($index$ % 32))) {\n", + "index", SimpleItoa(field->index())); + printer->Indent(); + } + last_index = i; + + PrintFieldComment(printer, field); + + printer->Print( + "if (has_$name$()) {\n", + "name", FieldName(field)); + printer->Indent(); + + field_generators_.get(field).GenerateByteSize(printer); + + printer->Outdent(); + printer->Print( + "}\n" + "\n"); + } + } + + if (last_index >= 0) { + printer->Outdent(); + printer->Print("}\n"); + } + + // Repeated fields don't use _has_bits_ so we count them in a separate + // pass. + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (field->is_repeated()) { + PrintFieldComment(printer, field); + field_generators_.get(field).GenerateByteSize(printer); + printer->Print("\n"); + } + } + + if (descriptor_->extension_range_count() > 0) { + printer->Print( + "total_size += _extensions_.ByteSize();\n" + "\n"); + } + + if (HasUnknownFields(descriptor_->file())) { + printer->Print("if (!unknown_fields().empty()) {\n"); + printer->Indent(); + printer->Print( + "total_size +=\n" + " ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(\n" + " unknown_fields());\n"); + printer->Outdent(); + printer->Print("}\n"); + } + + // We update _cached_size_ even though this is a const method. In theory, + // this is not thread-compatible, because concurrent writes have undefined + // results. In practice, since any concurrent writes will be writing the + // exact same value, it works on all common processors. In a future version + // of C++, _cached_size_ should be made into an atomic. + printer->Print( + "GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();\n" + "_cached_size_ = total_size;\n" + "GOOGLE_SAFE_CONCURRENT_WRITES_END();\n" + "return total_size;\n"); + + printer->Outdent(); + printer->Print("}\n"); +} + +void MessageGenerator:: +GenerateIsInitialized(io::Printer* printer) { + printer->Print( + "bool $classname$::IsInitialized() const {\n", + "classname", classname_); + printer->Indent(); + + // Check that all required fields in this message are set. We can do this + // most efficiently by checking 32 "has bits" at a time. + int has_bits_array_size = (descriptor_->field_count() + 31) / 32; + for (int i = 0; i < has_bits_array_size; i++) { + uint32 mask = 0; + for (int bit = 0; bit < 32; bit++) { + int index = i * 32 + bit; + if (index >= descriptor_->field_count()) break; + const FieldDescriptor* field = descriptor_->field(index); + + if (field->is_required()) { + mask |= 1 << bit; + } + } + + if (mask != 0) { + char buffer[kFastToBufferSize]; + printer->Print( + "if ((_has_bits_[$i$] & 0x$mask$) != 0x$mask$) return false;\n", + "i", SimpleItoa(i), + "mask", FastHex32ToBuffer(mask, buffer)); + } + } + + // Now check that all embedded messages are initialized. + printer->Print("\n"); + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && + HasRequiredFields(field->message_type())) { + if (field->is_repeated()) { + printer->Print( + "for (int i = 0; i < $name$_size(); i++) {\n" + " if (!this->$name$(i).IsInitialized()) return false;\n" + "}\n", + "name", FieldName(field)); + } else { + printer->Print( + "if (has_$name$()) {\n" + " if (!this->$name$().IsInitialized()) return false;\n" + "}\n", + "name", FieldName(field)); + } + } + } + + if (descriptor_->extension_range_count() > 0) { + printer->Print( + "\n" + "if (!_extensions_.IsInitialized()) return false;"); + } + + printer->Outdent(); + printer->Print( + " return true;\n" + "}\n"); +} + + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h new file mode 100644 index 000000000..04778f6d1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h @@ -0,0 +1,170 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace cpp { + +class EnumGenerator; // enum.h +class ExtensionGenerator; // extension.h + +class MessageGenerator { + public: + // See generator.cc for the meaning of dllexport_decl. + explicit MessageGenerator(const Descriptor* descriptor, + const string& dllexport_decl); + ~MessageGenerator(); + + // Header stuff. + + // Generate foward declarations for this class and all its nested types. + void GenerateForwardDeclaration(io::Printer* printer); + + // Generate definitions of all nested enums (must come before class + // definitions because those classes use the enums definitions). + void GenerateEnumDefinitions(io::Printer* printer); + + // Generate specializations of GetEnumDescriptor(). + // Precondition: in ::google::protobuf namespace. + void GenerateGetEnumDescriptorSpecializations(io::Printer* printer); + + // Generate definitions for this class and all its nested types. + void GenerateClassDefinition(io::Printer* printer); + + // Generate definitions of inline methods (placed at the end of the header + // file). + void GenerateInlineMethods(io::Printer* printer); + + // Source file stuff. + + // Generate code which declares all the global descriptor pointers which + // will be initialized by the methods below. + void GenerateDescriptorDeclarations(io::Printer* printer); + + // Generate code that initializes the global variable storing the message's + // descriptor. + void GenerateDescriptorInitializer(io::Printer* printer, int index); + + // Generate code that calls MessageFactory::InternalRegisterGeneratedMessage() + // for all types. + void GenerateTypeRegistrations(io::Printer* printer); + + // Generates code that allocates the message's default instance. + void GenerateDefaultInstanceAllocator(io::Printer* printer); + + // Generates code that initializes the message's default instance. This + // is separate from allocating because all default instances must be + // allocated before any can be initialized. + void GenerateDefaultInstanceInitializer(io::Printer* printer); + + // Generates code that should be run when ShutdownProtobufLibrary() is called, + // to delete all dynamically-allocated objects. + void GenerateShutdownCode(io::Printer* printer); + + // Generate all non-inline methods for this class. + void GenerateClassMethods(io::Printer* printer); + + private: + // Generate declarations and definitions of accessors for fields. + void GenerateFieldAccessorDeclarations(io::Printer* printer); + void GenerateFieldAccessorDefinitions(io::Printer* printer); + + // Generate the field offsets array. + void GenerateOffsets(io::Printer* printer); + + // Generate constructors and destructor. + void GenerateStructors(io::Printer* printer); + + // The compiler typically generates multiple copies of each constructor and + // destructor: http://gcc.gnu.org/bugs.html#nonbugs_cxx + // Placing common code in a separate method reduces the generated code size. + // + // Generate the shared constructor code. + void GenerateSharedConstructorCode(io::Printer* printer); + // Generate the shared destructor code. + void GenerateSharedDestructorCode(io::Printer* printer); + + // Generate standard Message methods. + void GenerateClear(io::Printer* printer); + void GenerateMergeFromCodedStream(io::Printer* printer); + void GenerateSerializeWithCachedSizes(io::Printer* printer); + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer); + void GenerateSerializeWithCachedSizesBody(io::Printer* printer, + bool to_array); + void GenerateByteSize(io::Printer* printer); + void GenerateMergeFrom(io::Printer* printer); + void GenerateCopyFrom(io::Printer* printer); + void GenerateSwap(io::Printer* printer); + void GenerateIsInitialized(io::Printer* printer); + + // Helpers for GenerateSerializeWithCachedSizes(). + void GenerateSerializeOneField(io::Printer* printer, + const FieldDescriptor* field, + bool unbounded); + void GenerateSerializeOneExtensionRange( + io::Printer* printer, const Descriptor::ExtensionRange* range, + bool unbounded); + + + const Descriptor* descriptor_; + string classname_; + string dllexport_decl_; + FieldGeneratorMap field_generators_; + scoped_array > nested_generators_; + scoped_array > enum_generators_; + scoped_array > extension_generators_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc new file mode 100644 index 000000000..23e75b87d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc @@ -0,0 +1,277 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +namespace { + +void SetMessageVariables(const FieldDescriptor* descriptor, + map* variables) { + SetCommonFieldVariables(descriptor, variables); + (*variables)["type"] = FieldMessageTypeName(descriptor); + (*variables)["stream_writer"] = (*variables)["declared_type"] + + (HasFastArraySerialization(descriptor->message_type()->file()) ? + "MaybeToArray" : + ""); +} + +} // namespace + +// =================================================================== + +MessageFieldGenerator:: +MessageFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetMessageVariables(descriptor, &variables_); +} + +MessageFieldGenerator::~MessageFieldGenerator() {} + +void MessageFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, "$type$* $name$_;\n"); +} + +void MessageFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + printer->Print(variables_, + "inline const $type$& $name$() const$deprecation$;\n" + "inline $type$* mutable_$name$()$deprecation$;\n" + "inline $type$* release_$name$()$deprecation$;\n"); +} + +void MessageFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline const $type$& $classname$::$name$() const {\n" + " return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n" + "}\n" + "inline $type$* $classname$::mutable_$name$() {\n" + " set_has_$name$();\n" + " if ($name$_ == NULL) $name$_ = new $type$;\n" + " return $name$_;\n" + "}\n" + "inline $type$* $classname$::release_$name$() {\n" + " clear_has_$name$();\n" + " $type$* temp = $name$_;\n" + " $name$_ = NULL;\n" + " return temp;\n" + "}\n"); +} + +void MessageFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($name$_ != NULL) $name$_->$type$::Clear();\n"); +} + +void MessageFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, + "mutable_$name$()->$type$::MergeFrom(from.$name$());\n"); +} + +void MessageFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); +} + +void MessageFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = NULL;\n"); +} + +void MessageFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { + printer->Print(variables_, + "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n" + " input, mutable_$name$()));\n"); + } else { + printer->Print(variables_, + "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n" + " $number$, input, mutable_$name$()));\n"); + } +} + +void MessageFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + printer->Print(variables_, + "::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" + " $number$, this->$name$(), output);\n"); +} + +void MessageFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + printer->Print(variables_, + "target = ::google::protobuf::internal::WireFormatLite::\n" + " Write$declared_type$NoVirtualToArray(\n" + " $number$, this->$name$(), target);\n"); +} + +void MessageFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + printer->Print(variables_, + "total_size += $tag_size$ +\n" + " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n" + " this->$name$());\n"); +} + +// =================================================================== + +RepeatedMessageFieldGenerator:: +RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetMessageVariables(descriptor, &variables_); +} + +RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} + +void RepeatedMessageFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, + "::google::protobuf::RepeatedPtrField< $type$ > $name$_;\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + printer->Print(variables_, + "inline const $type$& $name$(int index) const$deprecation$;\n" + "inline $type$* mutable_$name$(int index)$deprecation$;\n" + "inline $type$* add_$name$()$deprecation$;\n"); + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" + " $name$() const$deprecation$;\n" + "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" + " mutable_$name$()$deprecation$;\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline const $type$& $classname$::$name$(int index) const {\n" + " return $name$_.Get(index);\n" + "}\n" + "inline $type$* $classname$::mutable_$name$(int index) {\n" + " return $name$_.Mutable(index);\n" + "}\n" + "inline $type$* $classname$::add_$name$() {\n" + " return $name$_.Add();\n" + "}\n"); + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedPtrField< $type$ >&\n" + "$classname$::$name$() const {\n" + " return $name$_;\n" + "}\n" + "inline ::google::protobuf::RepeatedPtrField< $type$ >*\n" + "$classname$::mutable_$name$() {\n" + " return &$name$_;\n" + "}\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Clear();\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + // Not needed for repeated fields. +} + +void RepeatedMessageFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { + printer->Print(variables_, + "DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(\n" + " input, add_$name$()));\n"); + } else { + printer->Print(variables_, + "DO_(::google::protobuf::internal::WireFormatLite::ReadGroupNoVirtual(\n" + " $number$, input, add_$name$()));\n"); + } +} + +void RepeatedMessageFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n" + " ::google::protobuf::internal::WireFormatLite::Write$stream_writer$(\n" + " $number$, this->$name$(i), output);\n" + "}\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n" + " target = ::google::protobuf::internal::WireFormatLite::\n" + " Write$declared_type$NoVirtualToArray(\n" + " $number$, this->$name$(i), target);\n" + "}\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + printer->Print(variables_, + "total_size += $tag_size$ * this->$name$_size();\n" + "for (int i = 0; i < this->$name$_size(); i++) {\n" + " total_size +=\n" + " ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n" + " this->$name$(i));\n" + "}\n"); +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h new file mode 100644 index 000000000..f5147278b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h @@ -0,0 +1,102 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +class MessageFieldGenerator : public FieldGenerator { + public: + explicit MessageFieldGenerator(const FieldDescriptor* descriptor); + ~MessageFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator); +}; + +class RepeatedMessageFieldGenerator : public FieldGenerator { + public: + explicit RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor); + ~RepeatedMessageFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_MESSAGE_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc new file mode 100644 index 000000000..5c4aa4fbc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc @@ -0,0 +1,121 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// TODO(kenton): Share code with the versions of this test in other languages? +// It seemed like parameterizing it would add more complexity than it is +// worth. + +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { +namespace { + +class TestGenerator : public CodeGenerator { + public: + TestGenerator() {} + ~TestGenerator() {} + + virtual bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const { + TryInsert("test.pb.h", "includes", context); + TryInsert("test.pb.h", "namespace_scope", context); + TryInsert("test.pb.h", "global_scope", context); + TryInsert("test.pb.h", "class_scope:foo.Bar", context); + TryInsert("test.pb.h", "class_scope:foo.Bar.Baz", context); + + TryInsert("test.pb.cc", "includes", context); + TryInsert("test.pb.cc", "namespace_scope", context); + TryInsert("test.pb.cc", "global_scope", context); + return true; + } + + void TryInsert(const string& filename, const string& insertion_point, + GeneratorContext* context) const { + scoped_ptr output( + context->OpenForInsert(filename, insertion_point)); + io::Printer printer(output.get(), '$'); + printer.Print("// inserted $name$\n", "name", insertion_point); + } +}; + +// This test verifies that all the expected insertion points exist. It does +// not verify that they are correctly-placed; that would require actually +// compiling the output which is a bit more than I care to do for this test. +TEST(CppPluginTest, PluginTest) { + File::WriteStringToFileOrDie( + "syntax = \"proto2\";\n" + "package foo;\n" + "message Bar {\n" + " message Baz {}\n" + "}\n", + TestTempDir() + "/test.proto"); + + google::protobuf::compiler::CommandLineInterface cli; + cli.SetInputsAreProtoPathRelative(true); + + CppGenerator cpp_generator; + TestGenerator test_generator; + cli.RegisterGenerator("--cpp_out", &cpp_generator, ""); + cli.RegisterGenerator("--test_out", &test_generator, ""); + + string proto_path = "-I" + TestTempDir(); + string cpp_out = "--cpp_out=" + TestTempDir(); + string test_out = "--test_out=" + TestTempDir(); + + const char* argv[] = { + "protoc", + proto_path.c_str(), + cpp_out.c_str(), + test_out.c_str(), + "test.proto" + }; + + EXPECT_EQ(0, cli.Run(5, argv)); +} + +} // namespace +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc new file mode 100644 index 000000000..5e8df0f49 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc @@ -0,0 +1,382 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +using internal::WireFormatLite; + +namespace { + +// For encodings with fixed sizes, returns that size in bytes. Otherwise +// returns -1. +int FixedSize(FieldDescriptor::Type type) { + switch (type) { + case FieldDescriptor::TYPE_INT32 : return -1; + case FieldDescriptor::TYPE_INT64 : return -1; + case FieldDescriptor::TYPE_UINT32 : return -1; + case FieldDescriptor::TYPE_UINT64 : return -1; + case FieldDescriptor::TYPE_SINT32 : return -1; + case FieldDescriptor::TYPE_SINT64 : return -1; + case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size; + case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size; + case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size; + case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size; + case FieldDescriptor::TYPE_FLOAT : return WireFormatLite::kFloatSize; + case FieldDescriptor::TYPE_DOUBLE : return WireFormatLite::kDoubleSize; + + case FieldDescriptor::TYPE_BOOL : return WireFormatLite::kBoolSize; + case FieldDescriptor::TYPE_ENUM : return -1; + + case FieldDescriptor::TYPE_STRING : return -1; + case FieldDescriptor::TYPE_BYTES : return -1; + case FieldDescriptor::TYPE_GROUP : return -1; + case FieldDescriptor::TYPE_MESSAGE : return -1; + + // No default because we want the compiler to complain if any new + // types are added. + } + GOOGLE_LOG(FATAL) << "Can't get here."; + return -1; +} + +void SetPrimitiveVariables(const FieldDescriptor* descriptor, + map* variables) { + SetCommonFieldVariables(descriptor, variables); + (*variables)["type"] = PrimitiveTypeName(descriptor->cpp_type()); + (*variables)["default"] = DefaultValue(descriptor); + (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor)); + int fixed_size = FixedSize(descriptor->type()); + if (fixed_size != -1) { + (*variables)["fixed_size"] = SimpleItoa(fixed_size); + } + (*variables)["wire_format_field_type"] = + "::google::protobuf::internal::WireFormatLite::" + FieldDescriptorProto_Type_Name( + static_cast(descriptor->type())); +} + +} // namespace + +// =================================================================== + +PrimitiveFieldGenerator:: +PrimitiveFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetPrimitiveVariables(descriptor, &variables_); +} + +PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {} + +void PrimitiveFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, "$type$ $name$_;\n"); +} + +void PrimitiveFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $name$() const$deprecation$;\n" + "inline void set_$name$($type$ value)$deprecation$;\n"); +} + +void PrimitiveFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $classname$::$name$() const {\n" + " return $name$_;\n" + "}\n" + "inline void $classname$::set_$name$($type$ value) {\n" + " set_has_$name$();\n" + " $name$_ = value;\n" + "}\n"); +} + +void PrimitiveFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $default$;\n"); +} + +void PrimitiveFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, "set_$name$(from.$name$());\n"); +} + +void PrimitiveFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); +} + +void PrimitiveFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $default$;\n"); +} + +void PrimitiveFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + printer->Print(variables_, + "DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<\n" + " $type$, $wire_format_field_type$>(\n" + " input, &$name$_)));\n" + "set_has_$name$();\n"); +} + +void PrimitiveFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + printer->Print(variables_, + "::google::protobuf::internal::WireFormatLite::Write$declared_type$(" + "$number$, this->$name$(), output);\n"); +} + +void PrimitiveFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + printer->Print(variables_, + "target = ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray(" + "$number$, this->$name$(), target);\n"); +} + +void PrimitiveFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + int fixed_size = FixedSize(descriptor_->type()); + if (fixed_size == -1) { + printer->Print(variables_, + "total_size += $tag_size$ +\n" + " ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" + " this->$name$());\n"); + } else { + printer->Print(variables_, + "total_size += $tag_size$ + $fixed_size$;\n"); + } +} + +// =================================================================== + +RepeatedPrimitiveFieldGenerator:: +RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetPrimitiveVariables(descriptor, &variables_); + + if (descriptor->options().packed()) { + variables_["packed_reader"] = "ReadPackedPrimitive"; + variables_["repeated_reader"] = "ReadRepeatedPrimitiveNoInline"; + } else { + variables_["packed_reader"] = "ReadPackedPrimitiveNoInline"; + variables_["repeated_reader"] = "ReadRepeatedPrimitive"; + } +} + +RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {} + +void RepeatedPrimitiveFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, + "::google::protobuf::RepeatedField< $type$ > $name$_;\n"); + if (descriptor_->options().packed() && HasGeneratedMethods(descriptor_->file())) { + printer->Print(variables_, + "mutable int _$name$_cached_byte_size_;\n"); + } +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $name$(int index) const$deprecation$;\n" + "inline void set_$name$(int index, $type$ value)$deprecation$;\n" + "inline void add_$name$($type$ value)$deprecation$;\n"); + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedField< $type$ >&\n" + " $name$() const$deprecation$;\n" + "inline ::google::protobuf::RepeatedField< $type$ >*\n" + " mutable_$name$()$deprecation$;\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline $type$ $classname$::$name$(int index) const {\n" + " return $name$_.Get(index);\n" + "}\n" + "inline void $classname$::set_$name$(int index, $type$ value) {\n" + " $name$_.Set(index, value);\n" + "}\n" + "inline void $classname$::add_$name$($type$ value) {\n" + " $name$_.Add(value);\n" + "}\n"); + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedField< $type$ >&\n" + "$classname$::$name$() const {\n" + " return $name$_;\n" + "}\n" + "inline ::google::protobuf::RepeatedField< $type$ >*\n" + "$classname$::mutable_$name$() {\n" + " return &$name$_;\n" + "}\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Clear();\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + // Not needed for repeated fields. +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + printer->Print(variables_, + "DO_((::google::protobuf::internal::WireFormatLite::$repeated_reader$<\n" + " $type$, $wire_format_field_type$>(\n" + " $tag_size$, $tag$, input, this->mutable_$name$())));\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const { + printer->Print(variables_, + "DO_((::google::protobuf::internal::WireFormatLite::$packed_reader$<\n" + " $type$, $wire_format_field_type$>(\n" + " input, this->mutable_$name$())));\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + if (descriptor_->options().packed()) { + // Write the tag and the size. + printer->Print(variables_, + "if (this->$name$_size() > 0) {\n" + " ::google::protobuf::internal::WireFormatLite::WriteTag(" + "$number$, " + "::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, " + "output);\n" + " output->WriteVarint32(_$name$_cached_byte_size_);\n" + "}\n"); + } + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n"); + if (descriptor_->options().packed()) { + printer->Print(variables_, + " ::google::protobuf::internal::WireFormatLite::Write$declared_type$NoTag(\n" + " this->$name$(i), output);\n"); + } else { + printer->Print(variables_, + " ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n" + " $number$, this->$name$(i), output);\n"); + } + printer->Print("}\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + if (descriptor_->options().packed()) { + // Write the tag and the size. + printer->Print(variables_, + "if (this->$name$_size() > 0) {\n" + " target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray(\n" + " $number$,\n" + " ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED,\n" + " target);\n" + " target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray(\n" + " _$name$_cached_byte_size_, target);\n" + "}\n"); + } + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n"); + if (descriptor_->options().packed()) { + printer->Print(variables_, + " target = ::google::protobuf::internal::WireFormatLite::\n" + " Write$declared_type$NoTagToArray(this->$name$(i), target);\n"); + } else { + printer->Print(variables_, + " target = ::google::protobuf::internal::WireFormatLite::\n" + " Write$declared_type$ToArray($number$, this->$name$(i), target);\n"); + } + printer->Print("}\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + printer->Print(variables_, + "{\n" + " int data_size = 0;\n"); + printer->Indent(); + int fixed_size = FixedSize(descriptor_->type()); + if (fixed_size == -1) { + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n" + " data_size += ::google::protobuf::internal::WireFormatLite::\n" + " $declared_type$Size(this->$name$(i));\n" + "}\n"); + } else { + printer->Print(variables_, + "data_size = $fixed_size$ * this->$name$_size();\n"); + } + + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (data_size > 0) {\n" + " total_size += $tag_size$ +\n" + " ::google::protobuf::internal::WireFormatLite::Int32Size(data_size);\n" + "}\n" + "_$name$_cached_byte_size_ = data_size;\n" + "total_size += data_size;\n"); + } else { + printer->Print(variables_, + "total_size += $tag_size$ * this->$name$_size() + data_size;\n"); + } + printer->Outdent(); + printer->Print("}\n"); +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h new file mode 100644 index 000000000..8fcd74ae5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h @@ -0,0 +1,103 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +class PrimitiveFieldGenerator : public FieldGenerator { + public: + explicit PrimitiveFieldGenerator(const FieldDescriptor* descriptor); + ~PrimitiveFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator); +}; + +class RepeatedPrimitiveFieldGenerator : public FieldGenerator { + public: + explicit RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor); + ~RepeatedPrimitiveFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateMergeFromCodedStreamWithPacking(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_PRIMITIVE_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc new file mode 100644 index 000000000..c28256835 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc @@ -0,0 +1,334 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +ServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor, + const string& dllexport_decl) + : descriptor_(descriptor) { + vars_["classname"] = descriptor_->name(); + vars_["full_name"] = descriptor_->full_name(); + if (dllexport_decl.empty()) { + vars_["dllexport"] = ""; + } else { + vars_["dllexport"] = dllexport_decl + " "; + } +} + +ServiceGenerator::~ServiceGenerator() {} + +void ServiceGenerator::GenerateDeclarations(io::Printer* printer) { + // Forward-declare the stub type. + printer->Print(vars_, + "class $classname$_Stub;\n" + "\n"); + + GenerateInterface(printer); + GenerateStubDefinition(printer); +} + +void ServiceGenerator::GenerateInterface(io::Printer* printer) { + printer->Print(vars_, + "class $dllexport$$classname$ : public ::google::protobuf::Service {\n" + " protected:\n" + " // This class should be treated as an abstract interface.\n" + " inline $classname$() {};\n" + " public:\n" + " virtual ~$classname$();\n"); + printer->Indent(); + + printer->Print(vars_, + "\n" + "typedef $classname$_Stub Stub;\n" + "\n" + "static const ::google::protobuf::ServiceDescriptor* descriptor();\n" + "\n"); + + GenerateMethodSignatures(VIRTUAL, printer); + + printer->Print( + "\n" + "// implements Service ----------------------------------------------\n" + "\n" + "const ::google::protobuf::ServiceDescriptor* GetDescriptor();\n" + "void CallMethod(const ::google::protobuf::MethodDescriptor* method,\n" + " ::google::protobuf::RpcController* controller,\n" + " const ::google::protobuf::Message* request,\n" + " ::google::protobuf::Message* response,\n" + " ::google::protobuf::Closure* done);\n" + "const ::google::protobuf::Message& GetRequestPrototype(\n" + " const ::google::protobuf::MethodDescriptor* method) const;\n" + "const ::google::protobuf::Message& GetResponsePrototype(\n" + " const ::google::protobuf::MethodDescriptor* method) const;\n"); + + printer->Outdent(); + printer->Print(vars_, + "\n" + " private:\n" + " GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$);\n" + "};\n" + "\n"); +} + +void ServiceGenerator::GenerateStubDefinition(io::Printer* printer) { + printer->Print(vars_, + "class $dllexport$$classname$_Stub : public $classname$ {\n" + " public:\n"); + + printer->Indent(); + + printer->Print(vars_, + "$classname$_Stub(::google::protobuf::RpcChannel* channel);\n" + "$classname$_Stub(::google::protobuf::RpcChannel* channel,\n" + " ::google::protobuf::Service::ChannelOwnership ownership);\n" + "~$classname$_Stub();\n" + "\n" + "inline ::google::protobuf::RpcChannel* channel() { return channel_; }\n" + "\n" + "// implements $classname$ ------------------------------------------\n" + "\n"); + + GenerateMethodSignatures(NON_VIRTUAL, printer); + + printer->Outdent(); + printer->Print(vars_, + " private:\n" + " ::google::protobuf::RpcChannel* channel_;\n" + " bool owns_channel_;\n" + " GOOGLE_DISALLOW_EVIL_CONSTRUCTORS($classname$_Stub);\n" + "};\n" + "\n"); +} + +void ServiceGenerator::GenerateMethodSignatures( + VirtualOrNon virtual_or_non, io::Printer* printer) { + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + map sub_vars; + sub_vars["name"] = method->name(); + sub_vars["input_type"] = ClassName(method->input_type(), true); + sub_vars["output_type"] = ClassName(method->output_type(), true); + sub_vars["virtual"] = virtual_or_non == VIRTUAL ? "virtual " : ""; + + printer->Print(sub_vars, + "$virtual$void $name$(::google::protobuf::RpcController* controller,\n" + " const $input_type$* request,\n" + " $output_type$* response,\n" + " ::google::protobuf::Closure* done);\n"); + } +} + +// =================================================================== + +void ServiceGenerator::GenerateDescriptorInitializer( + io::Printer* printer, int index) { + map vars; + vars["classname"] = descriptor_->name(); + vars["index"] = SimpleItoa(index); + + printer->Print(vars, + "$classname$_descriptor_ = file->service($index$);\n"); +} + +// =================================================================== + +void ServiceGenerator::GenerateImplementation(io::Printer* printer) { + printer->Print(vars_, + "$classname$::~$classname$() {}\n" + "\n" + "const ::google::protobuf::ServiceDescriptor* $classname$::descriptor() {\n" + " protobuf_AssignDescriptorsOnce();\n" + " return $classname$_descriptor_;\n" + "}\n" + "\n" + "const ::google::protobuf::ServiceDescriptor* $classname$::GetDescriptor() {\n" + " protobuf_AssignDescriptorsOnce();\n" + " return $classname$_descriptor_;\n" + "}\n" + "\n"); + + // Generate methods of the interface. + GenerateNotImplementedMethods(printer); + GenerateCallMethod(printer); + GenerateGetPrototype(REQUEST, printer); + GenerateGetPrototype(RESPONSE, printer); + + // Generate stub implementation. + printer->Print(vars_, + "$classname$_Stub::$classname$_Stub(::google::protobuf::RpcChannel* channel)\n" + " : channel_(channel), owns_channel_(false) {}\n" + "$classname$_Stub::$classname$_Stub(\n" + " ::google::protobuf::RpcChannel* channel,\n" + " ::google::protobuf::Service::ChannelOwnership ownership)\n" + " : channel_(channel),\n" + " owns_channel_(ownership == ::google::protobuf::Service::STUB_OWNS_CHANNEL) {}\n" + "$classname$_Stub::~$classname$_Stub() {\n" + " if (owns_channel_) delete channel_;\n" + "}\n" + "\n"); + + GenerateStubMethods(printer); +} + +void ServiceGenerator::GenerateNotImplementedMethods(io::Printer* printer) { + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + map sub_vars; + sub_vars["classname"] = descriptor_->name(); + sub_vars["name"] = method->name(); + sub_vars["index"] = SimpleItoa(i); + sub_vars["input_type"] = ClassName(method->input_type(), true); + sub_vars["output_type"] = ClassName(method->output_type(), true); + + printer->Print(sub_vars, + "void $classname$::$name$(::google::protobuf::RpcController* controller,\n" + " const $input_type$*,\n" + " $output_type$*,\n" + " ::google::protobuf::Closure* done) {\n" + " controller->SetFailed(\"Method $name$() not implemented.\");\n" + " done->Run();\n" + "}\n" + "\n"); + } +} + +void ServiceGenerator::GenerateCallMethod(io::Printer* printer) { + printer->Print(vars_, + "void $classname$::CallMethod(const ::google::protobuf::MethodDescriptor* method,\n" + " ::google::protobuf::RpcController* controller,\n" + " const ::google::protobuf::Message* request,\n" + " ::google::protobuf::Message* response,\n" + " ::google::protobuf::Closure* done) {\n" + " GOOGLE_DCHECK_EQ(method->service(), $classname$_descriptor_);\n" + " switch(method->index()) {\n"); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + map sub_vars; + sub_vars["name"] = method->name(); + sub_vars["index"] = SimpleItoa(i); + sub_vars["input_type"] = ClassName(method->input_type(), true); + sub_vars["output_type"] = ClassName(method->output_type(), true); + + // Note: down_cast does not work here because it only works on pointers, + // not references. + printer->Print(sub_vars, + " case $index$:\n" + " $name$(controller,\n" + " ::google::protobuf::down_cast(request),\n" + " ::google::protobuf::down_cast< $output_type$*>(response),\n" + " done);\n" + " break;\n"); + } + + printer->Print(vars_, + " default:\n" + " GOOGLE_LOG(FATAL) << \"Bad method index; this should never happen.\";\n" + " break;\n" + " }\n" + "}\n" + "\n"); +} + +void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which, + io::Printer* printer) { + if (which == REQUEST) { + printer->Print(vars_, + "const ::google::protobuf::Message& $classname$::GetRequestPrototype(\n"); + } else { + printer->Print(vars_, + "const ::google::protobuf::Message& $classname$::GetResponsePrototype(\n"); + } + + printer->Print(vars_, + " const ::google::protobuf::MethodDescriptor* method) const {\n" + " GOOGLE_DCHECK_EQ(method->service(), descriptor());\n" + " switch(method->index()) {\n"); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + const Descriptor* type = + (which == REQUEST) ? method->input_type() : method->output_type(); + + map sub_vars; + sub_vars["index"] = SimpleItoa(i); + sub_vars["type"] = ClassName(type, true); + + printer->Print(sub_vars, + " case $index$:\n" + " return $type$::default_instance();\n"); + } + + printer->Print(vars_, + " default:\n" + " GOOGLE_LOG(FATAL) << \"Bad method index; this should never happen.\";\n" + " return *reinterpret_cast< ::google::protobuf::Message*>(NULL);\n" + " }\n" + "}\n" + "\n"); +} + +void ServiceGenerator::GenerateStubMethods(io::Printer* printer) { + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + map sub_vars; + sub_vars["classname"] = descriptor_->name(); + sub_vars["name"] = method->name(); + sub_vars["index"] = SimpleItoa(i); + sub_vars["input_type"] = ClassName(method->input_type(), true); + sub_vars["output_type"] = ClassName(method->output_type(), true); + + printer->Print(sub_vars, + "void $classname$_Stub::$name$(::google::protobuf::RpcController* controller,\n" + " const $input_type$* request,\n" + " $output_type$* response,\n" + " ::google::protobuf::Closure* done) {\n" + " channel_->CallMethod(descriptor()->method($index$),\n" + " controller, request, response, done);\n" + "}\n"); + } +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h new file mode 100644 index 000000000..10e9dd3cd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h @@ -0,0 +1,118 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__ + +#include +#include +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace cpp { + +class ServiceGenerator { + public: + // See generator.cc for the meaning of dllexport_decl. + explicit ServiceGenerator(const ServiceDescriptor* descriptor, + const string& dllexport_decl); + ~ServiceGenerator(); + + // Header stuff. + + // Generate the class definitions for the service's interface and the + // stub implementation. + void GenerateDeclarations(io::Printer* printer); + + // Source file stuff. + + // Generate code that initializes the global variable storing the service's + // descriptor. + void GenerateDescriptorInitializer(io::Printer* printer, int index); + + // Generate implementations of everything declared by GenerateDeclarations(). + void GenerateImplementation(io::Printer* printer); + + private: + enum RequestOrResponse { REQUEST, RESPONSE }; + enum VirtualOrNon { VIRTUAL, NON_VIRTUAL }; + + // Header stuff. + + // Generate the service abstract interface. + void GenerateInterface(io::Printer* printer); + + // Generate the stub class definition. + void GenerateStubDefinition(io::Printer* printer); + + // Prints signatures for all methods in the + void GenerateMethodSignatures(VirtualOrNon virtual_or_non, + io::Printer* printer); + + // Source file stuff. + + // Generate the default implementations of the service methods, which + // produce a "not implemented" error. + void GenerateNotImplementedMethods(io::Printer* printer); + + // Generate the CallMethod() method of the service. + void GenerateCallMethod(io::Printer* printer); + + // Generate the Get{Request,Response}Prototype() methods. + void GenerateGetPrototype(RequestOrResponse which, io::Printer* printer); + + // Generate the stub's implementations of the service methods. + void GenerateStubMethods(io::Printer* printer); + + const ServiceDescriptor* descriptor_; + map vars_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_SERVICE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc new file mode 100644 index 000000000..8d611b690 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc @@ -0,0 +1,453 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +namespace { + +void SetStringVariables(const FieldDescriptor* descriptor, + map* variables) { + SetCommonFieldVariables(descriptor, variables); + (*variables)["default"] = DefaultValue(descriptor); + (*variables)["default_variable"] = descriptor->default_value_string().empty() + ? "::google::protobuf::internal::kEmptyString" + : "_default_" + FieldName(descriptor) + "_"; + (*variables)["pointer_type"] = + descriptor->type() == FieldDescriptor::TYPE_BYTES ? "void" : "char"; +} + +} // namespace + +// =================================================================== + +StringFieldGenerator:: +StringFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetStringVariables(descriptor, &variables_); +} + +StringFieldGenerator::~StringFieldGenerator() {} + +void StringFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, "::std::string* $name$_;\n"); + if (!descriptor_->default_value_string().empty()) { + printer->Print(variables_, "static const ::std::string $default_variable$;\n"); + } +} + +void StringFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + // If we're using StringFieldGenerator for a field with a ctype, it's + // because that ctype isn't actually implemented. In particular, this is + // true of ctype=CORD and ctype=STRING_PIECE in the open source release. + // We aren't releasing Cord because it has too many Google-specific + // dependencies and we aren't releasing StringPiece because it's hardly + // useful outside of Google and because it would get confusing to have + // multiple instances of the StringPiece class in different libraries (PCRE + // already includes it for their C++ bindings, which came from Google). + // + // In any case, we make all the accessors private while still actually + // using a string to represent the field internally. This way, we can + // guarantee that if we do ever implement the ctype, it won't break any + // existing users who might be -- for whatever reason -- already using .proto + // files that applied the ctype. The field can still be accessed via the + // reflection interface since the reflection interface is independent of + // the string's underlying representation. + if (descriptor_->options().ctype() != FieldOptions::STRING) { + printer->Outdent(); + printer->Print( + " private:\n" + " // Hidden due to unknown ctype option.\n"); + printer->Indent(); + } + + printer->Print(variables_, + "inline const ::std::string& $name$() const$deprecation$;\n" + "inline void set_$name$(const ::std::string& value)$deprecation$;\n" + "inline void set_$name$(const char* value)$deprecation$;\n" + "inline void set_$name$(const $pointer_type$* value, size_t size)" + "$deprecation$;\n" + "inline ::std::string* mutable_$name$()$deprecation$;\n" + "inline ::std::string* release_$name$()$deprecation$;\n"); + + if (descriptor_->options().ctype() != FieldOptions::STRING) { + printer->Outdent(); + printer->Print(" public:\n"); + printer->Indent(); + } +} + +void StringFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline const ::std::string& $classname$::$name$() const {\n" + " return *$name$_;\n" + "}\n" + "inline void $classname$::set_$name$(const ::std::string& value) {\n" + " set_has_$name$();\n" + " if ($name$_ == &$default_variable$) {\n" + " $name$_ = new ::std::string;\n" + " }\n" + " $name$_->assign(value);\n" + "}\n" + "inline void $classname$::set_$name$(const char* value) {\n" + " set_has_$name$();\n" + " if ($name$_ == &$default_variable$) {\n" + " $name$_ = new ::std::string;\n" + " }\n" + " $name$_->assign(value);\n" + "}\n" + "inline " + "void $classname$::set_$name$(const $pointer_type$* value, size_t size) {\n" + " set_has_$name$();\n" + " if ($name$_ == &$default_variable$) {\n" + " $name$_ = new ::std::string;\n" + " }\n" + " $name$_->assign(reinterpret_cast(value), size);\n" + "}\n" + "inline ::std::string* $classname$::mutable_$name$() {\n" + " set_has_$name$();\n" + " if ($name$_ == &$default_variable$) {\n"); + if (descriptor_->default_value_string().empty()) { + printer->Print(variables_, + " $name$_ = new ::std::string;\n"); + } else { + printer->Print(variables_, + " $name$_ = new ::std::string($default_variable$);\n"); + } + printer->Print(variables_, + " }\n" + " return $name$_;\n" + "}\n" + "inline ::std::string* $classname$::release_$name$() {\n" + " clear_has_$name$();\n" + " if ($name$_ == &$default_variable$) {\n" + " return NULL;\n" + " } else {\n" + " ::std::string* temp = $name$_;\n" + " $name$_ = const_cast< ::std::string*>(&$default_variable$);\n" + " return temp;\n" + " }\n" + "}\n"); +} + +void StringFieldGenerator:: +GenerateNonInlineAccessorDefinitions(io::Printer* printer) const { + if (!descriptor_->default_value_string().empty()) { + printer->Print(variables_, + "const ::std::string $classname$::$default_variable$($default$);\n"); + } +} + +void StringFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + if (descriptor_->default_value_string().empty()) { + printer->Print(variables_, + "if ($name$_ != &$default_variable$) {\n" + " $name$_->clear();\n" + "}\n"); + } else { + printer->Print(variables_, + "if ($name$_ != &$default_variable$) {\n" + " $name$_->assign($default_variable$);\n" + "}\n"); + } +} + +void StringFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, "set_$name$(from.$name$());\n"); +} + +void StringFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "std::swap($name$_, other->$name$_);\n"); +} + +void StringFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$_ = const_cast< ::std::string*>(&$default_variable$);\n"); +} + +void StringFieldGenerator:: +GenerateDestructorCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($name$_ != &$default_variable$) {\n" + " delete $name$_;\n" + "}\n"); +} + +void StringFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + printer->Print(variables_, + "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n" + " input, this->mutable_$name$()));\n"); + if (HasUtf8Verification(descriptor_->file()) && + descriptor_->type() == FieldDescriptor::TYPE_STRING) { + printer->Print(variables_, + "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n" + " this->$name$().data(), this->$name$().length(),\n" + " ::google::protobuf::internal::WireFormat::PARSE);\n"); + } +} + +void StringFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + if (HasUtf8Verification(descriptor_->file()) && + descriptor_->type() == FieldDescriptor::TYPE_STRING) { + printer->Print(variables_, + "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n" + " this->$name$().data(), this->$name$().length(),\n" + " ::google::protobuf::internal::WireFormat::SERIALIZE);\n"); + } + printer->Print(variables_, + "::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n" + " $number$, this->$name$(), output);\n"); +} + +void StringFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + if (HasUtf8Verification(descriptor_->file()) && + descriptor_->type() == FieldDescriptor::TYPE_STRING) { + printer->Print(variables_, + "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n" + " this->$name$().data(), this->$name$().length(),\n" + " ::google::protobuf::internal::WireFormat::SERIALIZE);\n"); + } + printer->Print(variables_, + "target =\n" + " ::google::protobuf::internal::WireFormatLite::Write$declared_type$ToArray(\n" + " $number$, this->$name$(), target);\n"); +} + +void StringFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + printer->Print(variables_, + "total_size += $tag_size$ +\n" + " ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" + " this->$name$());\n"); +} + +// =================================================================== + +RepeatedStringFieldGenerator:: +RepeatedStringFieldGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + SetStringVariables(descriptor, &variables_); +} + +RepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {} + +void RepeatedStringFieldGenerator:: +GeneratePrivateMembers(io::Printer* printer) const { + printer->Print(variables_, + "::google::protobuf::RepeatedPtrField< ::std::string> $name$_;\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateAccessorDeclarations(io::Printer* printer) const { + // See comment above about unknown ctypes. + if (descriptor_->options().ctype() != FieldOptions::STRING) { + printer->Outdent(); + printer->Print( + " private:\n" + " // Hidden due to unknown ctype option.\n"); + printer->Indent(); + } + + printer->Print(variables_, + "inline const ::std::string& $name$(int index) const$deprecation$;\n" + "inline ::std::string* mutable_$name$(int index)$deprecation$;\n" + "inline void set_$name$(int index, const ::std::string& value)$deprecation$;\n" + "inline void set_$name$(int index, const char* value)$deprecation$;\n" + "inline " + "void set_$name$(int index, const $pointer_type$* value, size_t size)" + "$deprecation$;\n" + "inline ::std::string* add_$name$()$deprecation$;\n" + "inline void add_$name$(const ::std::string& value)$deprecation$;\n" + "inline void add_$name$(const char* value)$deprecation$;\n" + "inline void add_$name$(const $pointer_type$* value, size_t size)" + "$deprecation$;\n"); + + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedPtrField< ::std::string>& $name$() const" + "$deprecation$;\n" + "inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_$name$()" + "$deprecation$;\n"); + + if (descriptor_->options().ctype() != FieldOptions::STRING) { + printer->Outdent(); + printer->Print(" public:\n"); + printer->Indent(); + } +} + +void RepeatedStringFieldGenerator:: +GenerateInlineAccessorDefinitions(io::Printer* printer) const { + printer->Print(variables_, + "inline const ::std::string& $classname$::$name$(int index) const {\n" + " return $name$_.Get(index);\n" + "}\n" + "inline ::std::string* $classname$::mutable_$name$(int index) {\n" + " return $name$_.Mutable(index);\n" + "}\n" + "inline void $classname$::set_$name$(int index, const ::std::string& value) {\n" + " $name$_.Mutable(index)->assign(value);\n" + "}\n" + "inline void $classname$::set_$name$(int index, const char* value) {\n" + " $name$_.Mutable(index)->assign(value);\n" + "}\n" + "inline void " + "$classname$::set_$name$" + "(int index, const $pointer_type$* value, size_t size) {\n" + " $name$_.Mutable(index)->assign(\n" + " reinterpret_cast(value), size);\n" + "}\n" + "inline ::std::string* $classname$::add_$name$() {\n" + " return $name$_.Add();\n" + "}\n" + "inline void $classname$::add_$name$(const ::std::string& value) {\n" + " $name$_.Add()->assign(value);\n" + "}\n" + "inline void $classname$::add_$name$(const char* value) {\n" + " $name$_.Add()->assign(value);\n" + "}\n" + "inline void " + "$classname$::add_$name$(const $pointer_type$* value, size_t size) {\n" + " $name$_.Add()->assign(reinterpret_cast(value), size);\n" + "}\n"); + printer->Print(variables_, + "inline const ::google::protobuf::RepeatedPtrField< ::std::string>&\n" + "$classname$::$name$() const {\n" + " return $name$_;\n" + "}\n" + "inline ::google::protobuf::RepeatedPtrField< ::std::string>*\n" + "$classname$::mutable_$name$() {\n" + " return &$name$_;\n" + "}\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateClearingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Clear();\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.MergeFrom(from.$name$_);\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateSwappingCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_.Swap(&other->$name$_);\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateConstructorCode(io::Printer* printer) const { + // Not needed for repeated fields. +} + +void RepeatedStringFieldGenerator:: +GenerateMergeFromCodedStream(io::Printer* printer) const { + printer->Print(variables_, + "DO_(::google::protobuf::internal::WireFormatLite::Read$declared_type$(\n" + " input, this->add_$name$()));\n"); + if (HasUtf8Verification(descriptor_->file()) && + descriptor_->type() == FieldDescriptor::TYPE_STRING) { + printer->Print(variables_, + "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n" + " this->$name$(0).data(), this->$name$(0).length(),\n" + " ::google::protobuf::internal::WireFormat::PARSE);\n"); + } +} + +void RepeatedStringFieldGenerator:: +GenerateSerializeWithCachedSizes(io::Printer* printer) const { + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n"); + if (HasUtf8Verification(descriptor_->file()) && + descriptor_->type() == FieldDescriptor::TYPE_STRING) { + printer->Print(variables_, + "::google::protobuf::internal::WireFormat::VerifyUTF8String(\n" + " this->$name$(i).data(), this->$name$(i).length(),\n" + " ::google::protobuf::internal::WireFormat::SERIALIZE);\n"); + } + printer->Print(variables_, + " ::google::protobuf::internal::WireFormatLite::Write$declared_type$(\n" + " $number$, this->$name$(i), output);\n" + "}\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { + printer->Print(variables_, + "for (int i = 0; i < this->$name$_size(); i++) {\n"); + if (HasUtf8Verification(descriptor_->file()) && + descriptor_->type() == FieldDescriptor::TYPE_STRING) { + printer->Print(variables_, + " ::google::protobuf::internal::WireFormat::VerifyUTF8String(\n" + " this->$name$(i).data(), this->$name$(i).length(),\n" + " ::google::protobuf::internal::WireFormat::SERIALIZE);\n"); + } + printer->Print(variables_, + " target = ::google::protobuf::internal::WireFormatLite::\n" + " Write$declared_type$ToArray($number$, this->$name$(i), target);\n" + "}\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateByteSize(io::Printer* printer) const { + printer->Print(variables_, + "total_size += $tag_size$ * this->$name$_size();\n" + "for (int i = 0; i < this->$name$_size(); i++) {\n" + " total_size += ::google::protobuf::internal::WireFormatLite::$declared_type$Size(\n" + " this->$name$(i));\n" + "}\n"); +} + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h new file mode 100644 index 000000000..7f45107de --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h @@ -0,0 +1,104 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +class StringFieldGenerator : public FieldGenerator { + public: + explicit StringFieldGenerator(const FieldDescriptor* descriptor); + ~StringFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateNonInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateDestructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringFieldGenerator); +}; + +class RepeatedStringFieldGenerator : public FieldGenerator { + public: + explicit RepeatedStringFieldGenerator(const FieldDescriptor* descriptor); + ~RepeatedStringFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + void GeneratePrivateMembers(io::Printer* printer) const; + void GenerateAccessorDeclarations(io::Printer* printer) const; + void GenerateInlineAccessorDefinitions(io::Printer* printer) const; + void GenerateClearingCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateSwappingCode(io::Printer* printer) const; + void GenerateConstructorCode(io::Printer* printer) const; + void GenerateMergeFromCodedStream(io::Printer* printer) const; + void GenerateSerializeWithCachedSizes(io::Printer* printer) const; + void GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const; + void GenerateByteSize(io::Printer* printer) const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedStringFieldGenerator); +}; + +} // namespace cpp +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_CPP_STRING_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto new file mode 100644 index 000000000..54d830fca --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto @@ -0,0 +1,113 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file tests that various identifiers work as field and type names even +// though the same identifiers are used internally by the C++ code generator. + + +// Some generic_services option(s) added automatically. +// See: http://go/proto2-generic-services-default +option cc_generic_services = true; // auto-added + +// We don't put this in a package within proto2 because we need to make sure +// that the generated code doesn't depend on being in the proto2 namespace. +package protobuf_unittest; + +// Test that fields can have names like "input" and "i" which are also used +// internally by the code generator for local variables. +message TestConflictingSymbolNames { + message BuildDescriptors {} + message TypeTraits {} + + optional int32 input = 1; + optional int32 output = 2; + optional string length = 3; + repeated int32 i = 4; + repeated string new_element = 5 [ctype=STRING_PIECE]; + optional int32 total_size = 6; + optional int32 tag = 7; + + enum TestEnum { FOO = 1; } + message Data1 { repeated int32 data = 1; } + message Data2 { repeated TestEnum data = 1; } + message Data3 { repeated string data = 1; } + message Data4 { repeated Data4 data = 1; } + message Data5 { repeated string data = 1 [ctype=STRING_PIECE]; } + message Data6 { repeated string data = 1 [ctype=CORD]; } + + optional int32 source = 8; + optional int32 value = 9; + optional int32 file = 10; + optional int32 from = 11; + optional int32 handle_uninterpreted = 12; + repeated int32 index = 13; + optional int32 controller = 14; + optional int32 already_here = 15; + + optional uint32 uint32 = 16; + optional uint64 uint64 = 17; + optional string string = 18; + optional int32 memset = 19; + optional int32 int32 = 20; + optional int64 int64 = 21; + + optional uint32 cached_size = 22; + optional uint32 extensions = 23; + optional uint32 bit = 24; + optional uint32 bits = 25; + optional uint32 offsets = 26; + optional uint32 reflection = 27; + + message Cord {} + optional string some_cord = 28 [ctype=CORD]; + + message StringPiece {} + optional string some_string_piece = 29 [ctype=STRING_PIECE]; + + // Some keywords. + optional uint32 int = 30; + optional uint32 friend = 31; + + // The generator used to #define a macro called "DO" inside the .cc file. + message DO {} + optional DO do = 32; + + extensions 1000 to max; +} + +message DummyMessage {} + +service TestConflictingMethodNames { + rpc Closure(DummyMessage) returns (DummyMessage); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc new file mode 100644 index 000000000..301a7ce67 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc @@ -0,0 +1,1281 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// To test the code generator, we actually use it to generate code for +// google/protobuf/unittest.proto, then test that. This means that we +// are actually testing the parser and other parts of the system at the same +// time, and that problems in the generator may show up as compile-time errors +// rather than unittest failures, which may be surprising. However, testing +// the output of the C++ generator directly would be very hard. We can't very +// well just check it against golden files since those files would have to be +// updated for any small change; such a test would be very brittle and probably +// not very helpful. What we really want to test is that the code compiles +// correctly and produces the interfaces we expect, which is why this test +// is written this way. + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace cpp { + +// Can't use an anonymous namespace here due to brokenness of Tru64 compiler. +namespace cpp_unittest { + + +class MockErrorCollector : public MultiFileErrorCollector { + public: + MockErrorCollector() {} + ~MockErrorCollector() {} + + string text_; + + // implements ErrorCollector --------------------------------------- + void AddError(const string& filename, int line, int column, + const string& message) { + strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", + filename, line, column, message); + } +}; + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + +// Test that generated code has proper descriptors: +// Parse a descriptor directly (using google::protobuf::compiler::Importer) and +// compare it to the one that was produced by generated code. +TEST(GeneratedDescriptorTest, IdenticalDescriptors) { + const FileDescriptor* generated_descriptor = + unittest::TestAllTypes::descriptor()->file(); + + // Set up the Importer. + MockErrorCollector error_collector; + DiskSourceTree source_tree; + source_tree.MapPath("", TestSourceDir()); + Importer importer(&source_tree, &error_collector); + + // Import (parse) unittest.proto. + const FileDescriptor* parsed_descriptor = + importer.Import("google/protobuf/unittest.proto"); + EXPECT_EQ("", error_collector.text_); + ASSERT_TRUE(parsed_descriptor != NULL); + + // Test that descriptors are generated correctly by converting them to + // FileDescriptorProtos and comparing. + FileDescriptorProto generated_decsriptor_proto, parsed_descriptor_proto; + generated_descriptor->CopyTo(&generated_decsriptor_proto); + parsed_descriptor->CopyTo(&parsed_descriptor_proto); + + EXPECT_EQ(parsed_descriptor_proto.DebugString(), + generated_decsriptor_proto.DebugString()); +} + +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS + +// =================================================================== + +TEST(GeneratedMessageTest, Defaults) { + // Check that all default values are set correctly in the initial message. + unittest::TestAllTypes message; + + TestUtil::ExpectClear(message); + + // Messages should return pointers to default instances until first use. + // (This is not checked by ExpectClear() since it is not actually true after + // the fields have been set and then cleared.) + EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), + &message.optionalgroup()); + EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), + &message.optional_nested_message()); + EXPECT_EQ(&unittest::ForeignMessage::default_instance(), + &message.optional_foreign_message()); + EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), + &message.optional_import_message()); +} + +TEST(GeneratedMessageTest, FloatingPointDefaults) { + const unittest::TestExtremeDefaultValues& extreme_default = + unittest::TestExtremeDefaultValues::default_instance(); + + EXPECT_EQ(0.0f, extreme_default.zero_float()); + EXPECT_EQ(1.0f, extreme_default.one_float()); + EXPECT_EQ(1.5f, extreme_default.small_float()); + EXPECT_EQ(-1.0f, extreme_default.negative_one_float()); + EXPECT_EQ(-1.5f, extreme_default.negative_float()); + EXPECT_EQ(2.0e8f, extreme_default.large_float()); + EXPECT_EQ(-8e-28f, extreme_default.small_negative_float()); + EXPECT_EQ(numeric_limits::infinity(), + extreme_default.inf_double()); + EXPECT_EQ(-numeric_limits::infinity(), + extreme_default.neg_inf_double()); + EXPECT_TRUE(extreme_default.nan_double() != extreme_default.nan_double()); + EXPECT_EQ(numeric_limits::infinity(), + extreme_default.inf_float()); + EXPECT_EQ(-numeric_limits::infinity(), + extreme_default.neg_inf_float()); + EXPECT_TRUE(extreme_default.nan_float() != extreme_default.nan_float()); +} + +TEST(GeneratedMessageTest, Trigraph) { + const unittest::TestExtremeDefaultValues& extreme_default = + unittest::TestExtremeDefaultValues::default_instance(); + + EXPECT_EQ("? ? ?? ?? ??? ?\?/ ?\?-", extreme_default.cpp_trigraph()); +} + +TEST(GeneratedMessageTest, Accessors) { + // Set every field to a unique value then go back and check all those + // values. + unittest::TestAllTypes message; + + TestUtil::SetAllFields(&message); + TestUtil::ExpectAllFieldsSet(message); + + TestUtil::ModifyRepeatedFields(&message); + TestUtil::ExpectRepeatedFieldsModified(message); +} + +TEST(GeneratedMessageTest, MutableStringDefault) { + // mutable_foo() for a string should return a string initialized to its + // default value. + unittest::TestAllTypes message; + + EXPECT_EQ("hello", *message.mutable_default_string()); + + // Note that the first time we call mutable_foo(), we get a newly-allocated + // string, but if we clear it and call it again, we get the same object again. + // We should verify that it has its default value in both cases. + message.set_default_string("blah"); + message.Clear(); + + EXPECT_EQ("hello", *message.mutable_default_string()); +} + +TEST(GeneratedMessageTest, ReleaseString) { + // Check that release_foo() starts out NULL, and gives us a value + // that we can delete after it's been set. + unittest::TestAllTypes message; + + EXPECT_EQ(NULL, message.release_default_string()); + EXPECT_FALSE(message.has_default_string()); + EXPECT_EQ("hello", message.default_string()); + + message.set_default_string("blah"); + EXPECT_TRUE(message.has_default_string()); + string* str = message.release_default_string(); + EXPECT_FALSE(message.has_default_string()); + ASSERT_TRUE(str != NULL); + EXPECT_EQ("blah", *str); + delete str; + + EXPECT_EQ(NULL, message.release_default_string()); + EXPECT_FALSE(message.has_default_string()); + EXPECT_EQ("hello", message.default_string()); +} + +TEST(GeneratedMessageTest, ReleaseMessage) { + // Check that release_foo() starts out NULL, and gives us a value + // that we can delete after it's been set. + unittest::TestAllTypes message; + + EXPECT_EQ(NULL, message.release_optional_nested_message()); + EXPECT_FALSE(message.has_optional_nested_message()); + + message.mutable_optional_nested_message()->set_bb(1); + unittest::TestAllTypes::NestedMessage* nest = + message.release_optional_nested_message(); + EXPECT_FALSE(message.has_optional_nested_message()); + ASSERT_TRUE(nest != NULL); + EXPECT_EQ(1, nest->bb()); + delete nest; + + EXPECT_EQ(NULL, message.release_optional_nested_message()); + EXPECT_FALSE(message.has_optional_nested_message()); +} + +TEST(GeneratedMessageTest, Clear) { + // Set every field to a unique value, clear the message, then check that + // it is cleared. + unittest::TestAllTypes message; + + TestUtil::SetAllFields(&message); + message.Clear(); + TestUtil::ExpectClear(message); + + // Unlike with the defaults test, we do NOT expect that requesting embedded + // messages will return a pointer to the default instance. Instead, they + // should return the objects that were created when mutable_blah() was + // called. + EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), + &message.optionalgroup()); + EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), + &message.optional_nested_message()); + EXPECT_NE(&unittest::ForeignMessage::default_instance(), + &message.optional_foreign_message()); + EXPECT_NE(&unittest_import::ImportMessage::default_instance(), + &message.optional_import_message()); +} + +TEST(GeneratedMessageTest, EmbeddedNullsInBytesCharStar) { + unittest::TestAllTypes message; + + const char* value = "\0lalala\0\0"; + message.set_optional_bytes(value, 9); + ASSERT_EQ(9, message.optional_bytes().size()); + EXPECT_EQ(0, memcmp(value, message.optional_bytes().data(), 9)); + + message.add_repeated_bytes(value, 9); + ASSERT_EQ(9, message.repeated_bytes(0).size()); + EXPECT_EQ(0, memcmp(value, message.repeated_bytes(0).data(), 9)); +} + +TEST(GeneratedMessageTest, ClearOneField) { + // Set every field to a unique value, then clear one value and insure that + // only that one value is cleared. + unittest::TestAllTypes message; + + TestUtil::SetAllFields(&message); + int64 original_value = message.optional_int64(); + + // Clear the field and make sure it shows up as cleared. + message.clear_optional_int64(); + EXPECT_FALSE(message.has_optional_int64()); + EXPECT_EQ(0, message.optional_int64()); + + // Other adjacent fields should not be cleared. + EXPECT_TRUE(message.has_optional_int32()); + EXPECT_TRUE(message.has_optional_uint32()); + + // Make sure if we set it again, then all fields are set. + message.set_optional_int64(original_value); + TestUtil::ExpectAllFieldsSet(message); +} + +TEST(GeneratedMessageTest, StringCharStarLength) { + // Verify that we can use a char*,length to set one of the string fields. + unittest::TestAllTypes message; + message.set_optional_string("abcdef", 3); + EXPECT_EQ("abc", message.optional_string()); + + // Verify that we can use a char*,length to add to a repeated string field. + message.add_repeated_string("abcdef", 3); + EXPECT_EQ(1, message.repeated_string_size()); + EXPECT_EQ("abc", message.repeated_string(0)); + + // Verify that we can use a char*,length to set a repeated string field. + message.set_repeated_string(0, "wxyz", 2); + EXPECT_EQ("wx", message.repeated_string(0)); +} + + +TEST(GeneratedMessageTest, CopyFrom) { + unittest::TestAllTypes message1, message2; + + TestUtil::SetAllFields(&message1); + message2.CopyFrom(message1); + TestUtil::ExpectAllFieldsSet(message2); + + // Copying from self should be a no-op. + message2.CopyFrom(message2); + TestUtil::ExpectAllFieldsSet(message2); +} + + +TEST(GeneratedMessageTest, SwapWithEmpty) { + unittest::TestAllTypes message1, message2; + TestUtil::SetAllFields(&message1); + + TestUtil::ExpectAllFieldsSet(message1); + TestUtil::ExpectClear(message2); + message1.Swap(&message2); + TestUtil::ExpectAllFieldsSet(message2); + TestUtil::ExpectClear(message1); +} + +TEST(GeneratedMessageTest, SwapWithSelf) { + unittest::TestAllTypes message; + TestUtil::SetAllFields(&message); + TestUtil::ExpectAllFieldsSet(message); + message.Swap(&message); + TestUtil::ExpectAllFieldsSet(message); +} + +TEST(GeneratedMessageTest, SwapWithOther) { + unittest::TestAllTypes message1, message2; + + message1.set_optional_int32(123); + message1.set_optional_string("abc"); + message1.mutable_optional_nested_message()->set_bb(1); + message1.set_optional_nested_enum(unittest::TestAllTypes::FOO); + message1.add_repeated_int32(1); + message1.add_repeated_int32(2); + message1.add_repeated_string("a"); + message1.add_repeated_string("b"); + message1.add_repeated_nested_message()->set_bb(7); + message1.add_repeated_nested_message()->set_bb(8); + message1.add_repeated_nested_enum(unittest::TestAllTypes::FOO); + message1.add_repeated_nested_enum(unittest::TestAllTypes::BAR); + + message2.set_optional_int32(456); + message2.set_optional_string("def"); + message2.mutable_optional_nested_message()->set_bb(2); + message2.set_optional_nested_enum(unittest::TestAllTypes::BAR); + message2.add_repeated_int32(3); + message2.add_repeated_string("c"); + message2.add_repeated_nested_message()->set_bb(9); + message2.add_repeated_nested_enum(unittest::TestAllTypes::BAZ); + + message1.Swap(&message2); + + EXPECT_EQ(456, message1.optional_int32()); + EXPECT_EQ("def", message1.optional_string()); + EXPECT_EQ(2, message1.optional_nested_message().bb()); + EXPECT_EQ(unittest::TestAllTypes::BAR, message1.optional_nested_enum()); + ASSERT_EQ(1, message1.repeated_int32_size()); + EXPECT_EQ(3, message1.repeated_int32(0)); + ASSERT_EQ(1, message1.repeated_string_size()); + EXPECT_EQ("c", message1.repeated_string(0)); + ASSERT_EQ(1, message1.repeated_nested_message_size()); + EXPECT_EQ(9, message1.repeated_nested_message(0).bb()); + ASSERT_EQ(1, message1.repeated_nested_enum_size()); + EXPECT_EQ(unittest::TestAllTypes::BAZ, message1.repeated_nested_enum(0)); + + EXPECT_EQ(123, message2.optional_int32()); + EXPECT_EQ("abc", message2.optional_string()); + EXPECT_EQ(1, message2.optional_nested_message().bb()); + EXPECT_EQ(unittest::TestAllTypes::FOO, message2.optional_nested_enum()); + ASSERT_EQ(2, message2.repeated_int32_size()); + EXPECT_EQ(1, message2.repeated_int32(0)); + EXPECT_EQ(2, message2.repeated_int32(1)); + ASSERT_EQ(2, message2.repeated_string_size()); + EXPECT_EQ("a", message2.repeated_string(0)); + EXPECT_EQ("b", message2.repeated_string(1)); + ASSERT_EQ(2, message2.repeated_nested_message_size()); + EXPECT_EQ(7, message2.repeated_nested_message(0).bb()); + EXPECT_EQ(8, message2.repeated_nested_message(1).bb()); + ASSERT_EQ(2, message2.repeated_nested_enum_size()); + EXPECT_EQ(unittest::TestAllTypes::FOO, message2.repeated_nested_enum(0)); + EXPECT_EQ(unittest::TestAllTypes::BAR, message2.repeated_nested_enum(1)); +} + +TEST(GeneratedMessageTest, CopyConstructor) { + unittest::TestAllTypes message1; + TestUtil::SetAllFields(&message1); + + unittest::TestAllTypes message2(message1); + TestUtil::ExpectAllFieldsSet(message2); +} + +TEST(GeneratedMessageTest, CopyAssignmentOperator) { + unittest::TestAllTypes message1; + TestUtil::SetAllFields(&message1); + + unittest::TestAllTypes message2; + message2 = message1; + TestUtil::ExpectAllFieldsSet(message2); + + // Make sure that self-assignment does something sane. + message2.operator=(message2); + TestUtil::ExpectAllFieldsSet(message2); +} + +TEST(GeneratedMessageTest, UpcastCopyFrom) { + // Test the CopyFrom method that takes in the generic const Message& + // parameter. + unittest::TestAllTypes message1, message2; + + TestUtil::SetAllFields(&message1); + + const Message* source = implicit_cast(&message1); + message2.CopyFrom(*source); + + TestUtil::ExpectAllFieldsSet(message2); +} + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + +TEST(GeneratedMessageTest, DynamicMessageCopyFrom) { + // Test copying from a DynamicMessage, which must fall back to using + // reflection. + unittest::TestAllTypes message2; + + // Construct a new version of the dynamic message via the factory. + DynamicMessageFactory factory; + scoped_ptr message1; + message1.reset(factory.GetPrototype( + unittest::TestAllTypes::descriptor())->New()); + + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllTypes::descriptor()); + reflection_tester.SetAllFieldsViaReflection(message1.get()); + + message2.CopyFrom(*message1); + + TestUtil::ExpectAllFieldsSet(message2); +} + +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS + +TEST(GeneratedMessageTest, NonEmptyMergeFrom) { + // Test merging with a non-empty message. Code is a modified form + // of that found in google/protobuf/reflection_ops_unittest.cc. + unittest::TestAllTypes message1, message2; + + TestUtil::SetAllFields(&message1); + + // This field will test merging into an empty spot. + message2.set_optional_int32(message1.optional_int32()); + message1.clear_optional_int32(); + + // This tests overwriting. + message2.set_optional_string(message1.optional_string()); + message1.set_optional_string("something else"); + + // This tests concatenating. + message2.add_repeated_int32(message1.repeated_int32(1)); + int32 i = message1.repeated_int32(0); + message1.clear_repeated_int32(); + message1.add_repeated_int32(i); + + message1.MergeFrom(message2); + + TestUtil::ExpectAllFieldsSet(message1); +} + +#ifdef GTEST_HAS_DEATH_TEST + +TEST(GeneratedMessageTest, MergeFromSelf) { + unittest::TestAllTypes message; + EXPECT_DEATH(message.MergeFrom(message), "&from"); + EXPECT_DEATH(message.MergeFrom(implicit_cast(message)), + "&from"); +} + +#endif // GTEST_HAS_DEATH_TEST + +// Test the generated SerializeWithCachedSizesToArray(), +TEST(GeneratedMessageTest, SerializationToArray) { + unittest::TestAllTypes message1, message2; + string data; + TestUtil::SetAllFields(&message1); + int size = message1.ByteSize(); + data.resize(size); + uint8* start = reinterpret_cast(string_as_array(&data)); + uint8* end = message1.SerializeWithCachedSizesToArray(start); + EXPECT_EQ(size, end - start); + EXPECT_TRUE(message2.ParseFromString(data)); + TestUtil::ExpectAllFieldsSet(message2); + +} + +TEST(GeneratedMessageTest, PackedFieldsSerializationToArray) { + unittest::TestPackedTypes packed_message1, packed_message2; + string packed_data; + TestUtil::SetPackedFields(&packed_message1); + int packed_size = packed_message1.ByteSize(); + packed_data.resize(packed_size); + uint8* start = reinterpret_cast(string_as_array(&packed_data)); + uint8* end = packed_message1.SerializeWithCachedSizesToArray(start); + EXPECT_EQ(packed_size, end - start); + EXPECT_TRUE(packed_message2.ParseFromString(packed_data)); + TestUtil::ExpectPackedFieldsSet(packed_message2); +} + +// Test the generated SerializeWithCachedSizes() by forcing the buffer to write +// one byte at a time. +TEST(GeneratedMessageTest, SerializationToStream) { + unittest::TestAllTypes message1, message2; + TestUtil::SetAllFields(&message1); + int size = message1.ByteSize(); + string data; + data.resize(size); + { + // Allow the output stream to buffer only one byte at a time. + io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); + io::CodedOutputStream output_stream(&array_stream); + message1.SerializeWithCachedSizes(&output_stream); + EXPECT_FALSE(output_stream.HadError()); + EXPECT_EQ(size, output_stream.ByteCount()); + } + EXPECT_TRUE(message2.ParseFromString(data)); + TestUtil::ExpectAllFieldsSet(message2); + +} + +TEST(GeneratedMessageTest, PackedFieldsSerializationToStream) { + unittest::TestPackedTypes message1, message2; + TestUtil::SetPackedFields(&message1); + int size = message1.ByteSize(); + string data; + data.resize(size); + { + // Allow the output stream to buffer only one byte at a time. + io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); + io::CodedOutputStream output_stream(&array_stream); + message1.SerializeWithCachedSizes(&output_stream); + EXPECT_FALSE(output_stream.HadError()); + EXPECT_EQ(size, output_stream.ByteCount()); + } + EXPECT_TRUE(message2.ParseFromString(data)); + TestUtil::ExpectPackedFieldsSet(message2); +} + + +TEST(GeneratedMessageTest, Required) { + // Test that IsInitialized() returns false if required fields are missing. + unittest::TestRequired message; + + EXPECT_FALSE(message.IsInitialized()); + message.set_a(1); + EXPECT_FALSE(message.IsInitialized()); + message.set_b(2); + EXPECT_FALSE(message.IsInitialized()); + message.set_c(3); + EXPECT_TRUE(message.IsInitialized()); +} + +TEST(GeneratedMessageTest, RequiredForeign) { + // Test that IsInitialized() returns false if required fields in nested + // messages are missing. + unittest::TestRequiredForeign message; + + EXPECT_TRUE(message.IsInitialized()); + + message.mutable_optional_message(); + EXPECT_FALSE(message.IsInitialized()); + + message.mutable_optional_message()->set_a(1); + message.mutable_optional_message()->set_b(2); + message.mutable_optional_message()->set_c(3); + EXPECT_TRUE(message.IsInitialized()); + + message.add_repeated_message(); + EXPECT_FALSE(message.IsInitialized()); + + message.mutable_repeated_message(0)->set_a(1); + message.mutable_repeated_message(0)->set_b(2); + message.mutable_repeated_message(0)->set_c(3); + EXPECT_TRUE(message.IsInitialized()); +} + +TEST(GeneratedMessageTest, ForeignNested) { + // Test that TestAllTypes::NestedMessage can be embedded directly into + // another message. + unittest::TestForeignNested message; + + // If this compiles and runs without crashing, it must work. We have + // nothing more to test. + unittest::TestAllTypes::NestedMessage* nested = + message.mutable_foreign_nested(); + nested->set_bb(1); +} + +TEST(GeneratedMessageTest, ReallyLargeTagNumber) { + // Test that really large tag numbers don't break anything. + unittest::TestReallyLargeTagNumber message1, message2; + string data; + + // For the most part, if this compiles and runs then we're probably good. + // (The most likely cause for failure would be if something were attempting + // to allocate a lookup table of some sort using tag numbers as the index.) + // We'll try serializing just for fun. + message1.set_a(1234); + message1.set_bb(5678); + message1.SerializeToString(&data); + EXPECT_TRUE(message2.ParseFromString(data)); + EXPECT_EQ(1234, message2.a()); + EXPECT_EQ(5678, message2.bb()); +} + +TEST(GeneratedMessageTest, MutualRecursion) { + // Test that mutually-recursive message types work. + unittest::TestMutualRecursionA message; + unittest::TestMutualRecursionA* nested = message.mutable_bb()->mutable_a(); + unittest::TestMutualRecursionA* nested2 = nested->mutable_bb()->mutable_a(); + + // Again, if the above compiles and runs, that's all we really have to + // test, but just for run we'll check that the system didn't somehow come + // up with a pointer loop... + EXPECT_NE(&message, nested); + EXPECT_NE(&message, nested2); + EXPECT_NE(nested, nested2); +} + +TEST(GeneratedMessageTest, CamelCaseFieldNames) { + // This test is mainly checking that the following compiles, which verifies + // that the field names were coerced to lower-case. + // + // Protocol buffers standard style is to use lowercase-with-underscores for + // field names. Some old proto1 .protos unfortunately used camel-case field + // names. In proto1, these names were forced to lower-case. So, we do the + // same thing in proto2. + + unittest::TestCamelCaseFieldNames message; + + message.set_primitivefield(2); + message.set_stringfield("foo"); + message.set_enumfield(unittest::FOREIGN_FOO); + message.mutable_messagefield()->set_c(6); + + message.add_repeatedprimitivefield(8); + message.add_repeatedstringfield("qux"); + message.add_repeatedenumfield(unittest::FOREIGN_BAR); + message.add_repeatedmessagefield()->set_c(15); + + EXPECT_EQ(2, message.primitivefield()); + EXPECT_EQ("foo", message.stringfield()); + EXPECT_EQ(unittest::FOREIGN_FOO, message.enumfield()); + EXPECT_EQ(6, message.messagefield().c()); + + EXPECT_EQ(8, message.repeatedprimitivefield(0)); + EXPECT_EQ("qux", message.repeatedstringfield(0)); + EXPECT_EQ(unittest::FOREIGN_BAR, message.repeatedenumfield(0)); + EXPECT_EQ(15, message.repeatedmessagefield(0).c()); +} + +TEST(GeneratedMessageTest, TestConflictingSymbolNames) { + // test_bad_identifiers.proto successfully compiled, then it works. The + // following is just a token usage to insure that the code is, in fact, + // being compiled and linked. + + protobuf_unittest::TestConflictingSymbolNames message; + message.set_uint32(1); + EXPECT_EQ(3, message.ByteSize()); + + message.set_friend_(5); + EXPECT_EQ(5, message.friend_()); +} + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + +TEST(GeneratedMessageTest, TestOptimizedForSize) { + // We rely on the tests in reflection_ops_unittest and wire_format_unittest + // to really test that reflection-based methods work. Here we are mostly + // just making sure that TestOptimizedForSize actually builds and seems to + // function. + + protobuf_unittest::TestOptimizedForSize message, message2; + message.set_i(1); + message.mutable_msg()->set_c(2); + message2.CopyFrom(message); + EXPECT_EQ(1, message2.i()); + EXPECT_EQ(2, message2.msg().c()); +} + +TEST(GeneratedMessageTest, TestEmbedOptimizedForSize) { + // Verifies that something optimized for speed can contain something optimized + // for size. + + protobuf_unittest::TestEmbedOptimizedForSize message, message2; + message.mutable_optional_message()->set_i(1); + message.add_repeated_message()->mutable_msg()->set_c(2); + string data; + message.SerializeToString(&data); + ASSERT_TRUE(message2.ParseFromString(data)); + EXPECT_EQ(1, message2.optional_message().i()); + EXPECT_EQ(2, message2.repeated_message(0).msg().c()); +} + +TEST(GeneratedMessageTest, TestSpaceUsed) { + unittest::TestAllTypes message1; + // sizeof provides a lower bound on SpaceUsed(). + EXPECT_LE(sizeof(unittest::TestAllTypes), message1.SpaceUsed()); + const int empty_message_size = message1.SpaceUsed(); + + // Setting primitive types shouldn't affect the space used. + message1.set_optional_int32(123); + message1.set_optional_int64(12345); + message1.set_optional_uint32(123); + message1.set_optional_uint64(12345); + EXPECT_EQ(empty_message_size, message1.SpaceUsed()); + + // On some STL implementations, setting the string to a small value should + // only increase SpaceUsed() by the size of a string object, though this is + // not true everywhere. + message1.set_optional_string("abc"); + EXPECT_LE(empty_message_size + sizeof(string), message1.SpaceUsed()); + + // Setting a string to a value larger than the string object itself should + // increase SpaceUsed(), because it cannot store the value internally. + message1.set_optional_string(string(sizeof(string) + 1, 'x')); + int min_expected_increase = message1.optional_string().capacity() + + sizeof(string); + EXPECT_LE(empty_message_size + min_expected_increase, + message1.SpaceUsed()); + + int previous_size = message1.SpaceUsed(); + // Adding an optional message should increase the size by the size of the + // nested message type. NestedMessage is simple enough (1 int field) that it + // is equal to sizeof(NestedMessage) + message1.mutable_optional_nested_message(); + ASSERT_EQ(sizeof(unittest::TestAllTypes::NestedMessage), + message1.optional_nested_message().SpaceUsed()); + EXPECT_EQ(previous_size + + sizeof(unittest::TestAllTypes::NestedMessage), + message1.SpaceUsed()); +} + +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS + + +TEST(GeneratedMessageTest, FieldConstantValues) { + unittest::TestRequired message; + EXPECT_EQ(unittest::TestAllTypes_NestedMessage::kBbFieldNumber, 1); + EXPECT_EQ(unittest::TestAllTypes::kOptionalInt32FieldNumber, 1); + EXPECT_EQ(unittest::TestAllTypes::kOptionalgroupFieldNumber, 16); + EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedMessageFieldNumber, 18); + EXPECT_EQ(unittest::TestAllTypes::kOptionalNestedEnumFieldNumber, 21); + EXPECT_EQ(unittest::TestAllTypes::kRepeatedInt32FieldNumber, 31); + EXPECT_EQ(unittest::TestAllTypes::kRepeatedgroupFieldNumber, 46); + EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedMessageFieldNumber, 48); + EXPECT_EQ(unittest::TestAllTypes::kRepeatedNestedEnumFieldNumber, 51); +} + +TEST(GeneratedMessageTest, ExtensionConstantValues) { + EXPECT_EQ(unittest::TestRequired::kSingleFieldNumber, 1000); + EXPECT_EQ(unittest::TestRequired::kMultiFieldNumber, 1001); + EXPECT_EQ(unittest::kOptionalInt32ExtensionFieldNumber, 1); + EXPECT_EQ(unittest::kOptionalgroupExtensionFieldNumber, 16); + EXPECT_EQ(unittest::kOptionalNestedMessageExtensionFieldNumber, 18); + EXPECT_EQ(unittest::kOptionalNestedEnumExtensionFieldNumber, 21); + EXPECT_EQ(unittest::kRepeatedInt32ExtensionFieldNumber, 31); + EXPECT_EQ(unittest::kRepeatedgroupExtensionFieldNumber, 46); + EXPECT_EQ(unittest::kRepeatedNestedMessageExtensionFieldNumber, 48); + EXPECT_EQ(unittest::kRepeatedNestedEnumExtensionFieldNumber, 51); +} + +// =================================================================== + +TEST(GeneratedEnumTest, EnumValuesAsSwitchCases) { + // Test that our nested enum values can be used as switch cases. This test + // doesn't actually do anything, the proof that it works is that it + // compiles. + int i =0; + unittest::TestAllTypes::NestedEnum a = unittest::TestAllTypes::BAR; + switch (a) { + case unittest::TestAllTypes::FOO: + i = 1; + break; + case unittest::TestAllTypes::BAR: + i = 2; + break; + case unittest::TestAllTypes::BAZ: + i = 3; + break; + // no default case: We want to make sure the compiler recognizes that + // all cases are covered. (GCC warns if you do not cover all cases of + // an enum in a switch.) + } + + // Token check just for fun. + EXPECT_EQ(2, i); +} + +TEST(GeneratedEnumTest, IsValidValue) { + // Test enum IsValidValue. + EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(1)); + EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(2)); + EXPECT_TRUE(unittest::TestAllTypes::NestedEnum_IsValid(3)); + + EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(0)); + EXPECT_FALSE(unittest::TestAllTypes::NestedEnum_IsValid(4)); + + // Make sure it also works when there are dups. + EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(1)); + EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(2)); + EXPECT_TRUE(unittest::TestEnumWithDupValue_IsValid(3)); + + EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(0)); + EXPECT_FALSE(unittest::TestEnumWithDupValue_IsValid(4)); +} + +TEST(GeneratedEnumTest, MinAndMax) { + EXPECT_EQ(unittest::TestAllTypes::FOO, + unittest::TestAllTypes::NestedEnum_MIN); + EXPECT_EQ(unittest::TestAllTypes::BAZ, + unittest::TestAllTypes::NestedEnum_MAX); + EXPECT_EQ(4, unittest::TestAllTypes::NestedEnum_ARRAYSIZE); + + EXPECT_EQ(unittest::FOREIGN_FOO, unittest::ForeignEnum_MIN); + EXPECT_EQ(unittest::FOREIGN_BAZ, unittest::ForeignEnum_MAX); + EXPECT_EQ(7, unittest::ForeignEnum_ARRAYSIZE); + + EXPECT_EQ(1, unittest::TestEnumWithDupValue_MIN); + EXPECT_EQ(3, unittest::TestEnumWithDupValue_MAX); + EXPECT_EQ(4, unittest::TestEnumWithDupValue_ARRAYSIZE); + + EXPECT_EQ(unittest::SPARSE_E, unittest::TestSparseEnum_MIN); + EXPECT_EQ(unittest::SPARSE_C, unittest::TestSparseEnum_MAX); + EXPECT_EQ(12589235, unittest::TestSparseEnum_ARRAYSIZE); + + // Make sure we can take the address of _MIN, _MAX and _ARRAYSIZE. + void* null_pointer = 0; // NULL may be integer-type, not pointer-type. + EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MIN); + EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_MAX); + EXPECT_NE(null_pointer, &unittest::TestAllTypes::NestedEnum_ARRAYSIZE); + + EXPECT_NE(null_pointer, &unittest::ForeignEnum_MIN); + EXPECT_NE(null_pointer, &unittest::ForeignEnum_MAX); + EXPECT_NE(null_pointer, &unittest::ForeignEnum_ARRAYSIZE); + + // Make sure we can use _MIN, _MAX and _ARRAYSIZE as switch cases. + switch (unittest::SPARSE_A) { + case unittest::TestSparseEnum_MIN: + case unittest::TestSparseEnum_MAX: + case unittest::TestSparseEnum_ARRAYSIZE: + break; + default: + break; + } +} + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + +TEST(GeneratedEnumTest, Name) { + // "Names" in the presence of dup values are a bit arbitrary. + EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO1)); + EXPECT_EQ("FOO1", unittest::TestEnumWithDupValue_Name(unittest::FOO2)); + + EXPECT_EQ("SPARSE_A", unittest::TestSparseEnum_Name(unittest::SPARSE_A)); + EXPECT_EQ("SPARSE_B", unittest::TestSparseEnum_Name(unittest::SPARSE_B)); + EXPECT_EQ("SPARSE_C", unittest::TestSparseEnum_Name(unittest::SPARSE_C)); + EXPECT_EQ("SPARSE_D", unittest::TestSparseEnum_Name(unittest::SPARSE_D)); + EXPECT_EQ("SPARSE_E", unittest::TestSparseEnum_Name(unittest::SPARSE_E)); + EXPECT_EQ("SPARSE_F", unittest::TestSparseEnum_Name(unittest::SPARSE_F)); + EXPECT_EQ("SPARSE_G", unittest::TestSparseEnum_Name(unittest::SPARSE_G)); +} + +TEST(GeneratedEnumTest, Parse) { + unittest::TestEnumWithDupValue dup_value = unittest::FOO1; + EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO1", &dup_value)); + EXPECT_EQ(unittest::FOO1, dup_value); + EXPECT_TRUE(unittest::TestEnumWithDupValue_Parse("FOO2", &dup_value)); + EXPECT_EQ(unittest::FOO2, dup_value); + EXPECT_FALSE(unittest::TestEnumWithDupValue_Parse("FOO", &dup_value)); +} + +TEST(GeneratedEnumTest, GetEnumDescriptor) { + EXPECT_EQ(unittest::TestAllTypes::NestedEnum_descriptor(), + GetEnumDescriptor()); + EXPECT_EQ(unittest::ForeignEnum_descriptor(), + GetEnumDescriptor()); + EXPECT_EQ(unittest::TestEnumWithDupValue_descriptor(), + GetEnumDescriptor()); + EXPECT_EQ(unittest::TestSparseEnum_descriptor(), + GetEnumDescriptor()); +} + +#endif // PROTOBUF_TEST_NO_DESCRIPTORS + +// =================================================================== + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + +// Support code for testing services. +class GeneratedServiceTest : public testing::Test { + protected: + class MockTestService : public unittest::TestService { + public: + MockTestService() + : called_(false), + method_(""), + controller_(NULL), + request_(NULL), + response_(NULL), + done_(NULL) {} + + ~MockTestService() {} + + void Reset() { called_ = false; } + + // implements TestService ---------------------------------------- + + void Foo(RpcController* controller, + const unittest::FooRequest* request, + unittest::FooResponse* response, + Closure* done) { + ASSERT_FALSE(called_); + called_ = true; + method_ = "Foo"; + controller_ = controller; + request_ = request; + response_ = response; + done_ = done; + } + + void Bar(RpcController* controller, + const unittest::BarRequest* request, + unittest::BarResponse* response, + Closure* done) { + ASSERT_FALSE(called_); + called_ = true; + method_ = "Bar"; + controller_ = controller; + request_ = request; + response_ = response; + done_ = done; + } + + // --------------------------------------------------------------- + + bool called_; + string method_; + RpcController* controller_; + const Message* request_; + Message* response_; + Closure* done_; + }; + + class MockRpcChannel : public RpcChannel { + public: + MockRpcChannel() + : called_(false), + method_(NULL), + controller_(NULL), + request_(NULL), + response_(NULL), + done_(NULL), + destroyed_(NULL) {} + + ~MockRpcChannel() { + if (destroyed_ != NULL) *destroyed_ = true; + } + + void Reset() { called_ = false; } + + // implements TestService ---------------------------------------- + + void CallMethod(const MethodDescriptor* method, + RpcController* controller, + const Message* request, + Message* response, + Closure* done) { + ASSERT_FALSE(called_); + called_ = true; + method_ = method; + controller_ = controller; + request_ = request; + response_ = response; + done_ = done; + } + + // --------------------------------------------------------------- + + bool called_; + const MethodDescriptor* method_; + RpcController* controller_; + const Message* request_; + Message* response_; + Closure* done_; + bool* destroyed_; + }; + + class MockController : public RpcController { + public: + void Reset() { + ADD_FAILURE() << "Reset() not expected during this test."; + } + bool Failed() const { + ADD_FAILURE() << "Failed() not expected during this test."; + return false; + } + string ErrorText() const { + ADD_FAILURE() << "ErrorText() not expected during this test."; + return ""; + } + void StartCancel() { + ADD_FAILURE() << "StartCancel() not expected during this test."; + } + void SetFailed(const string& reason) { + ADD_FAILURE() << "SetFailed() not expected during this test."; + } + bool IsCanceled() const { + ADD_FAILURE() << "IsCanceled() not expected during this test."; + return false; + } + void NotifyOnCancel(Closure* callback) { + ADD_FAILURE() << "NotifyOnCancel() not expected during this test."; + } + }; + + GeneratedServiceTest() + : descriptor_(unittest::TestService::descriptor()), + foo_(descriptor_->FindMethodByName("Foo")), + bar_(descriptor_->FindMethodByName("Bar")), + stub_(&mock_channel_), + done_(NewPermanentCallback(&DoNothing)) {} + + virtual void SetUp() { + ASSERT_TRUE(foo_ != NULL); + ASSERT_TRUE(bar_ != NULL); + } + + const ServiceDescriptor* descriptor_; + const MethodDescriptor* foo_; + const MethodDescriptor* bar_; + + MockTestService mock_service_; + MockController mock_controller_; + + MockRpcChannel mock_channel_; + unittest::TestService::Stub stub_; + + // Just so we don't have to re-define these with every test. + unittest::FooRequest foo_request_; + unittest::FooResponse foo_response_; + unittest::BarRequest bar_request_; + unittest::BarResponse bar_response_; + scoped_ptr done_; +}; + +TEST_F(GeneratedServiceTest, GetDescriptor) { + // Test that GetDescriptor() works. + + EXPECT_EQ(descriptor_, mock_service_.GetDescriptor()); +} + +TEST_F(GeneratedServiceTest, GetChannel) { + EXPECT_EQ(&mock_channel_, stub_.channel()); +} + +TEST_F(GeneratedServiceTest, OwnsChannel) { + MockRpcChannel* channel = new MockRpcChannel; + bool destroyed = false; + channel->destroyed_ = &destroyed; + + { + unittest::TestService::Stub owning_stub(channel, + Service::STUB_OWNS_CHANNEL); + EXPECT_FALSE(destroyed); + } + + EXPECT_TRUE(destroyed); +} + +TEST_F(GeneratedServiceTest, CallMethod) { + // Test that CallMethod() works. + + // Call Foo() via CallMethod(). + mock_service_.CallMethod(foo_, &mock_controller_, + &foo_request_, &foo_response_, done_.get()); + + ASSERT_TRUE(mock_service_.called_); + + EXPECT_EQ("Foo" , mock_service_.method_ ); + EXPECT_EQ(&mock_controller_, mock_service_.controller_); + EXPECT_EQ(&foo_request_ , mock_service_.request_ ); + EXPECT_EQ(&foo_response_ , mock_service_.response_ ); + EXPECT_EQ(done_.get() , mock_service_.done_ ); + + // Try again, but call Bar() instead. + mock_service_.Reset(); + mock_service_.CallMethod(bar_, &mock_controller_, + &bar_request_, &bar_response_, done_.get()); + + ASSERT_TRUE(mock_service_.called_); + EXPECT_EQ("Bar", mock_service_.method_); +} + +TEST_F(GeneratedServiceTest, CallMethodTypeFailure) { + // Verify death if we call Foo() with Bar's message types. + +#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet + EXPECT_DEBUG_DEATH( + mock_service_.CallMethod(foo_, &mock_controller_, + &foo_request_, &bar_response_, done_.get()), + "dynamic_cast"); + + mock_service_.Reset(); + EXPECT_DEBUG_DEATH( + mock_service_.CallMethod(foo_, &mock_controller_, + &bar_request_, &foo_response_, done_.get()), + "dynamic_cast"); +#endif // GTEST_HAS_DEATH_TEST +} + +TEST_F(GeneratedServiceTest, GetPrototypes) { + // Test Get{Request,Response}Prototype() methods. + + EXPECT_EQ(&unittest::FooRequest::default_instance(), + &mock_service_.GetRequestPrototype(foo_)); + EXPECT_EQ(&unittest::BarRequest::default_instance(), + &mock_service_.GetRequestPrototype(bar_)); + + EXPECT_EQ(&unittest::FooResponse::default_instance(), + &mock_service_.GetResponsePrototype(foo_)); + EXPECT_EQ(&unittest::BarResponse::default_instance(), + &mock_service_.GetResponsePrototype(bar_)); +} + +TEST_F(GeneratedServiceTest, Stub) { + // Test that the stub class works. + + // Call Foo() via the stub. + stub_.Foo(&mock_controller_, &foo_request_, &foo_response_, done_.get()); + + ASSERT_TRUE(mock_channel_.called_); + + EXPECT_EQ(foo_ , mock_channel_.method_ ); + EXPECT_EQ(&mock_controller_, mock_channel_.controller_); + EXPECT_EQ(&foo_request_ , mock_channel_.request_ ); + EXPECT_EQ(&foo_response_ , mock_channel_.response_ ); + EXPECT_EQ(done_.get() , mock_channel_.done_ ); + + // Call Bar() via the stub. + mock_channel_.Reset(); + stub_.Bar(&mock_controller_, &bar_request_, &bar_response_, done_.get()); + + ASSERT_TRUE(mock_channel_.called_); + EXPECT_EQ(bar_, mock_channel_.method_); +} + +TEST_F(GeneratedServiceTest, NotImplemented) { + // Test that failing to implement a method of a service causes it to fail + // with a "not implemented" error message. + + // A service which doesn't implement any methods. + class UnimplementedService : public unittest::TestService { + public: + UnimplementedService() {} + }; + + UnimplementedService unimplemented_service; + + // And a controller which expects to get a "not implemented" error. + class ExpectUnimplementedController : public MockController { + public: + ExpectUnimplementedController() : called_(false) {} + + void SetFailed(const string& reason) { + EXPECT_FALSE(called_); + called_ = true; + EXPECT_EQ("Method Foo() not implemented.", reason); + } + + bool called_; + }; + + ExpectUnimplementedController controller; + + // Call Foo. + unimplemented_service.Foo(&controller, &foo_request_, &foo_response_, + done_.get()); + + EXPECT_TRUE(controller.called_); +} + +} // namespace cpp_unittest +} // namespace cpp +} // namespace compiler + +namespace no_generic_services_test { + // Verify that no class called "TestService" was defined in + // unittest_no_generic_services.pb.h by defining a different type by the same + // name. If such a service was generated, this will not compile. + struct TestService { + int i; + }; +} + +namespace compiler { +namespace cpp { +namespace cpp_unittest { + +TEST_F(GeneratedServiceTest, NoGenericServices) { + // Verify that non-services in unittest_no_generic_services.proto were + // generated. + no_generic_services_test::TestMessage message; + message.set_a(1); + message.SetExtension(no_generic_services_test::test_extension, 123); + no_generic_services_test::TestEnum e = no_generic_services_test::FOO; + EXPECT_EQ(e, 1); + + // Verify that a ServiceDescriptor is generated for the service even if the + // class itself is not. + const FileDescriptor* file = + no_generic_services_test::TestMessage::descriptor()->file(); + + ASSERT_EQ(1, file->service_count()); + EXPECT_EQ("TestService", file->service(0)->name()); + ASSERT_EQ(1, file->service(0)->method_count()); + EXPECT_EQ("Foo", file->service(0)->method(0)->name()); +} + +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS + +// =================================================================== + +// This test must run last. It verifies that descriptors were or were not +// initialized depending on whether PROTOBUF_TEST_NO_DESCRIPTORS was defined. +// When this is defined, we skip all tests which are expected to trigger +// descriptor initialization. This verifies that everything else still works +// if descriptors are not initialized. +TEST(DescriptorInitializationTest, Initialized) { +#ifdef PROTOBUF_TEST_NO_DESCRIPTORS + bool should_have_descriptors = false; +#else + bool should_have_descriptors = true; +#endif + + EXPECT_EQ(should_have_descriptors, + DescriptorPool::generated_pool()->InternalIsFileLoaded( + "google/protobuf/unittest.proto")); +} + +} // namespace cpp_unittest + +} // namespace cpp +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc new file mode 100644 index 000000000..422f759f2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc @@ -0,0 +1,459 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifdef _MSC_VER +#include +#else +#include +#endif +#include +#include +#include +#include + +#include + +#include + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +#ifdef _WIN32 +#ifndef F_OK +#define F_OK 00 // not defined by MSVC for whatever reason +#endif +#include +#endif + +// Returns true if the text looks like a Windows-style absolute path, starting +// with a drive letter. Example: "C:\foo". TODO(kenton): Share this with +// copy in command_line_interface.cc? +static bool IsWindowsAbsolutePath(const string& text) { +#if defined(_WIN32) || defined(__CYGWIN__) + return text.size() >= 3 && text[1] == ':' && + isalpha(text[0]) && + (text[2] == '/' || text[2] == '\\') && + text.find_last_of(':') == 1; +#else + return false; +#endif +} + +MultiFileErrorCollector::~MultiFileErrorCollector() {} + +// This class serves two purposes: +// - It implements the ErrorCollector interface (used by Tokenizer and Parser) +// in terms of MultiFileErrorCollector, using a particular filename. +// - It lets us check if any errors have occurred. +class SourceTreeDescriptorDatabase::SingleFileErrorCollector + : public io::ErrorCollector { + public: + SingleFileErrorCollector(const string& filename, + MultiFileErrorCollector* multi_file_error_collector) + : filename_(filename), + multi_file_error_collector_(multi_file_error_collector), + had_errors_(false) {} + ~SingleFileErrorCollector() {} + + bool had_errors() { return had_errors_; } + + // implements ErrorCollector --------------------------------------- + void AddError(int line, int column, const string& message) { + if (multi_file_error_collector_ != NULL) { + multi_file_error_collector_->AddError(filename_, line, column, message); + } + had_errors_ = true; + } + + private: + string filename_; + MultiFileErrorCollector* multi_file_error_collector_; + bool had_errors_; +}; + +// =================================================================== + +SourceTreeDescriptorDatabase::SourceTreeDescriptorDatabase( + SourceTree* source_tree) + : source_tree_(source_tree), + error_collector_(NULL), + using_validation_error_collector_(false), + validation_error_collector_(this) {} + +SourceTreeDescriptorDatabase::~SourceTreeDescriptorDatabase() {} + +bool SourceTreeDescriptorDatabase::FindFileByName( + const string& filename, FileDescriptorProto* output) { + scoped_ptr input(source_tree_->Open(filename)); + if (input == NULL) { + if (error_collector_ != NULL) { + error_collector_->AddError(filename, -1, 0, "File not found."); + } + return false; + } + + // Set up the tokenizer and parser. + SingleFileErrorCollector file_error_collector(filename, error_collector_); + io::Tokenizer tokenizer(input.get(), &file_error_collector); + + Parser parser; + if (error_collector_ != NULL) { + parser.RecordErrorsTo(&file_error_collector); + } + if (using_validation_error_collector_) { + parser.RecordSourceLocationsTo(&source_locations_); + } + + // Parse it. + output->set_name(filename); + return parser.Parse(&tokenizer, output) && + !file_error_collector.had_errors(); +} + +bool SourceTreeDescriptorDatabase::FindFileContainingSymbol( + const string& symbol_name, FileDescriptorProto* output) { + return false; +} + +bool SourceTreeDescriptorDatabase::FindFileContainingExtension( + const string& containing_type, int field_number, + FileDescriptorProto* output) { + return false; +} + +// ------------------------------------------------------------------- + +SourceTreeDescriptorDatabase::ValidationErrorCollector:: +ValidationErrorCollector(SourceTreeDescriptorDatabase* owner) + : owner_(owner) {} + +SourceTreeDescriptorDatabase::ValidationErrorCollector:: +~ValidationErrorCollector() {} + +void SourceTreeDescriptorDatabase::ValidationErrorCollector::AddError( + const string& filename, + const string& element_name, + const Message* descriptor, + ErrorLocation location, + const string& message) { + if (owner_->error_collector_ == NULL) return; + + int line, column; + owner_->source_locations_.Find(descriptor, location, &line, &column); + owner_->error_collector_->AddError(filename, line, column, message); +} + +// =================================================================== + +Importer::Importer(SourceTree* source_tree, + MultiFileErrorCollector* error_collector) + : database_(source_tree), + pool_(&database_, database_.GetValidationErrorCollector()) { + database_.RecordErrorsTo(error_collector); +} + +Importer::~Importer() {} + +const FileDescriptor* Importer::Import(const string& filename) { + return pool_.FindFileByName(filename); +} + +// =================================================================== + +SourceTree::~SourceTree() {} + +DiskSourceTree::DiskSourceTree() {} + +DiskSourceTree::~DiskSourceTree() {} + +static inline char LastChar(const string& str) { + return str[str.size() - 1]; +} + +// Given a path, returns an equivalent path with these changes: +// - On Windows, any backslashes are replaced with forward slashes. +// - Any instances of the directory "." are removed. +// - Any consecutive '/'s are collapsed into a single slash. +// Note that the resulting string may be empty. +// +// TODO(kenton): It would be nice to handle "..", e.g. so that we can figure +// out that "foo/bar.proto" is inside "baz/../foo". However, if baz is a +// symlink or doesn't exist, then things get complicated, and we can't +// actually determine this without investigating the filesystem, probably +// in non-portable ways. So, we punt. +// +// TODO(kenton): It would be nice to use realpath() here except that it +// resolves symbolic links. This could cause problems if people place +// symbolic links in their source tree. For example, if you executed: +// protoc --proto_path=foo foo/bar/baz.proto +// then if foo/bar is a symbolic link, foo/bar/baz.proto will canonicalize +// to a path which does not appear to be under foo, and thus the compiler +// will complain that baz.proto is not inside the --proto_path. +static string CanonicalizePath(string path) { +#ifdef _WIN32 + // The Win32 API accepts forward slashes as a path delimiter even though + // backslashes are standard. Let's avoid confusion and use only forward + // slashes. + if (HasPrefixString(path, "\\\\")) { + // Avoid converting two leading backslashes. + path = "\\\\" + StringReplace(path.substr(2), "\\", "/", true); + } else { + path = StringReplace(path, "\\", "/", true); + } +#endif + + vector parts; + vector canonical_parts; + SplitStringUsing(path, "/", &parts); // Note: Removes empty parts. + for (int i = 0; i < parts.size(); i++) { + if (parts[i] == ".") { + // Ignore. + } else { + canonical_parts.push_back(parts[i]); + } + } + string result = JoinStrings(canonical_parts, "/"); + if (!path.empty() && path[0] == '/') { + // Restore leading slash. + result = '/' + result; + } + if (!path.empty() && LastChar(path) == '/' && + !result.empty() && LastChar(result) != '/') { + // Restore trailing slash. + result += '/'; + } + return result; +} + +static inline bool ContainsParentReference(const string& path) { + return path == ".." || + HasPrefixString(path, "../") || + HasSuffixString(path, "/..") || + path.find("/../") != string::npos; +} + +// Maps a file from an old location to a new one. Typically, old_prefix is +// a virtual path and new_prefix is its corresponding disk path. Returns +// false if the filename did not start with old_prefix, otherwise replaces +// old_prefix with new_prefix and stores the result in *result. Examples: +// string result; +// assert(ApplyMapping("foo/bar", "", "baz", &result)); +// assert(result == "baz/foo/bar"); +// +// assert(ApplyMapping("foo/bar", "foo", "baz", &result)); +// assert(result == "baz/bar"); +// +// assert(ApplyMapping("foo", "foo", "bar", &result)); +// assert(result == "bar"); +// +// assert(!ApplyMapping("foo/bar", "baz", "qux", &result)); +// assert(!ApplyMapping("foo/bar", "baz", "qux", &result)); +// assert(!ApplyMapping("foobar", "foo", "baz", &result)); +static bool ApplyMapping(const string& filename, + const string& old_prefix, + const string& new_prefix, + string* result) { + if (old_prefix.empty()) { + // old_prefix matches any relative path. + if (ContainsParentReference(filename)) { + // We do not allow the file name to use "..". + return false; + } + if (HasPrefixString(filename, "/") || + IsWindowsAbsolutePath(filename)) { + // This is an absolute path, so it isn't matched by the empty string. + return false; + } + result->assign(new_prefix); + if (!result->empty()) result->push_back('/'); + result->append(filename); + return true; + } else if (HasPrefixString(filename, old_prefix)) { + // old_prefix is a prefix of the filename. Is it the whole filename? + if (filename.size() == old_prefix.size()) { + // Yep, it's an exact match. + *result = new_prefix; + return true; + } else { + // Not an exact match. Is the next character a '/'? Otherwise, + // this isn't actually a match at all. E.g. the prefix "foo/bar" + // does not match the filename "foo/barbaz". + int after_prefix_start = -1; + if (filename[old_prefix.size()] == '/') { + after_prefix_start = old_prefix.size() + 1; + } else if (filename[old_prefix.size() - 1] == '/') { + // old_prefix is never empty, and canonicalized paths never have + // consecutive '/' characters. + after_prefix_start = old_prefix.size(); + } + if (after_prefix_start != -1) { + // Yep. So the prefixes are directories and the filename is a file + // inside them. + string after_prefix = filename.substr(after_prefix_start); + if (ContainsParentReference(after_prefix)) { + // We do not allow the file name to use "..". + return false; + } + result->assign(new_prefix); + if (!result->empty()) result->push_back('/'); + result->append(after_prefix); + return true; + } + } + } + + return false; +} + +void DiskSourceTree::MapPath(const string& virtual_path, + const string& disk_path) { + mappings_.push_back(Mapping(virtual_path, CanonicalizePath(disk_path))); +} + +DiskSourceTree::DiskFileToVirtualFileResult +DiskSourceTree::DiskFileToVirtualFile( + const string& disk_file, + string* virtual_file, + string* shadowing_disk_file) { + int mapping_index = -1; + string canonical_disk_file = CanonicalizePath(disk_file); + + for (int i = 0; i < mappings_.size(); i++) { + // Apply the mapping in reverse. + if (ApplyMapping(canonical_disk_file, mappings_[i].disk_path, + mappings_[i].virtual_path, virtual_file)) { + // Success. + mapping_index = i; + break; + } + } + + if (mapping_index == -1) { + return NO_MAPPING; + } + + // Iterate through all mappings with higher precedence and verify that none + // of them map this file to some other existing file. + for (int i = 0; i < mapping_index; i++) { + if (ApplyMapping(*virtual_file, mappings_[i].virtual_path, + mappings_[i].disk_path, shadowing_disk_file)) { + if (access(shadowing_disk_file->c_str(), F_OK) >= 0) { + // File exists. + return SHADOWED; + } + } + } + shadowing_disk_file->clear(); + + // Verify that we can open the file. Note that this also has the side-effect + // of verifying that we are not canonicalizing away any non-existent + // directories. + scoped_ptr stream(OpenDiskFile(disk_file)); + if (stream == NULL) { + return CANNOT_OPEN; + } + + return SUCCESS; +} + +bool DiskSourceTree::VirtualFileToDiskFile(const string& virtual_file, + string* disk_file) { + scoped_ptr stream(OpenVirtualFile(virtual_file, + disk_file)); + return stream != NULL; +} + +io::ZeroCopyInputStream* DiskSourceTree::Open(const string& filename) { + return OpenVirtualFile(filename, NULL); +} + +io::ZeroCopyInputStream* DiskSourceTree::OpenVirtualFile( + const string& virtual_file, + string* disk_file) { + if (virtual_file != CanonicalizePath(virtual_file) || + ContainsParentReference(virtual_file)) { + // We do not allow importing of paths containing things like ".." or + // consecutive slashes since the compiler expects files to be uniquely + // identified by file name. + return NULL; + } + + for (int i = 0; i < mappings_.size(); i++) { + string temp_disk_file; + if (ApplyMapping(virtual_file, mappings_[i].virtual_path, + mappings_[i].disk_path, &temp_disk_file)) { + io::ZeroCopyInputStream* stream = OpenDiskFile(temp_disk_file); + if (stream != NULL) { + if (disk_file != NULL) { + *disk_file = temp_disk_file; + } + return stream; + } + + if (errno == EACCES) { + // The file exists but is not readable. + // TODO(kenton): Find a way to report this more nicely. + GOOGLE_LOG(WARNING) << "Read access is denied for file: " << temp_disk_file; + return NULL; + } + } + } + + return NULL; +} + +io::ZeroCopyInputStream* DiskSourceTree::OpenDiskFile( + const string& filename) { + int file_descriptor; + do { + file_descriptor = open(filename.c_str(), O_RDONLY); + } while (file_descriptor < 0 && errno == EINTR); + if (file_descriptor >= 0) { + io::FileInputStream* result = new io::FileInputStream(file_descriptor); + result->SetCloseOnDelete(true); + return result; + } else { + return NULL; + } +} + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h new file mode 100644 index 000000000..7a2efc297 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h @@ -0,0 +1,303 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file is the public interface to the .proto file parser. + +#ifndef GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__ +#define GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__ + +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +namespace io { class ZeroCopyInputStream; } + +namespace compiler { + +// Defined in this file. +class Importer; +class MultiFileErrorCollector; +class SourceTree; +class DiskSourceTree; + +// TODO(kenton): Move all SourceTree stuff to a separate file? + +// An implementation of DescriptorDatabase which loads files from a SourceTree +// and parses them. +// +// Note: This class is not thread-safe since it maintains a table of source +// code locations for error reporting. However, when a DescriptorPool wraps +// a DescriptorDatabase, it uses mutex locking to make sure only one method +// of the database is called at a time, even if the DescriptorPool is used +// from multiple threads. Therefore, there is only a problem if you create +// multiple DescriptorPools wrapping the same SourceTreeDescriptorDatabase +// and use them from multiple threads. +// +// Note: This class does not implement FindFileContainingSymbol() or +// FindFileContainingExtension(); these will always return false. +class LIBPROTOBUF_EXPORT SourceTreeDescriptorDatabase : public DescriptorDatabase { + public: + SourceTreeDescriptorDatabase(SourceTree* source_tree); + ~SourceTreeDescriptorDatabase(); + + // Instructs the SourceTreeDescriptorDatabase to report any parse errors + // to the given MultiFileErrorCollector. This should be called before + // parsing. error_collector must remain valid until either this method + // is called again or the SourceTreeDescriptorDatabase is destroyed. + void RecordErrorsTo(MultiFileErrorCollector* error_collector) { + error_collector_ = error_collector; + } + + // Gets a DescriptorPool::ErrorCollector which records errors to the + // MultiFileErrorCollector specified with RecordErrorsTo(). This collector + // has the ability to determine exact line and column numbers of errors + // from the information given to it by the DescriptorPool. + DescriptorPool::ErrorCollector* GetValidationErrorCollector() { + using_validation_error_collector_ = true; + return &validation_error_collector_; + } + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + + private: + class SingleFileErrorCollector; + + SourceTree* source_tree_; + MultiFileErrorCollector* error_collector_; + + class LIBPROTOBUF_EXPORT ValidationErrorCollector : public DescriptorPool::ErrorCollector { + public: + ValidationErrorCollector(SourceTreeDescriptorDatabase* owner); + ~ValidationErrorCollector(); + + // implements ErrorCollector --------------------------------------- + void AddError(const string& filename, + const string& element_name, + const Message* descriptor, + ErrorLocation location, + const string& message); + + private: + SourceTreeDescriptorDatabase* owner_; + }; + friend class ValidationErrorCollector; + + bool using_validation_error_collector_; + SourceLocationTable source_locations_; + ValidationErrorCollector validation_error_collector_; +}; + +// Simple interface for parsing .proto files. This wraps the process +// of opening the file, parsing it with a Parser, recursively parsing all its +// imports, and then cross-linking the results to produce a FileDescriptor. +// +// This is really just a thin wrapper around SourceTreeDescriptorDatabase. +// You may find that SourceTreeDescriptorDatabase is more flexible. +// +// TODO(kenton): I feel like this class is not well-named. +class LIBPROTOBUF_EXPORT Importer { + public: + Importer(SourceTree* source_tree, + MultiFileErrorCollector* error_collector); + ~Importer(); + + // Import the given file and build a FileDescriptor representing it. If + // the file is already in the DescriptorPool, the existing FileDescriptor + // will be returned. The FileDescriptor is property of the DescriptorPool, + // and will remain valid until it is destroyed. If any errors occur, they + // will be reported using the error collector and Import() will return NULL. + // + // A particular Importer object will only report errors for a particular + // file once. All future attempts to import the same file will return NULL + // without reporting any errors. The idea is that you might want to import + // a lot of files without seeing the same errors over and over again. If + // you want to see errors for the same files repeatedly, you can use a + // separate Importer object to import each one (but use the same + // DescriptorPool so that they can be cross-linked). + const FileDescriptor* Import(const string& filename); + + // The DescriptorPool in which all imported FileDescriptors and their + // contents are stored. + inline const DescriptorPool* pool() const { + return &pool_; + } + + private: + SourceTreeDescriptorDatabase database_; + DescriptorPool pool_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Importer); +}; + +// If the importer encounters problems while trying to import the proto files, +// it reports them to a MultiFileErrorCollector. +class LIBPROTOBUF_EXPORT MultiFileErrorCollector { + public: + inline MultiFileErrorCollector() {} + virtual ~MultiFileErrorCollector(); + + // Line and column numbers are zero-based. A line number of -1 indicates + // an error with the entire file (e.g. "not found"). + virtual void AddError(const string& filename, int line, int column, + const string& message) = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MultiFileErrorCollector); +}; + +// Abstract interface which represents a directory tree containing proto files. +// Used by the default implementation of Importer to resolve import statements +// Most users will probably want to use the DiskSourceTree implementation, +// below. +class LIBPROTOBUF_EXPORT SourceTree { + public: + inline SourceTree() {} + virtual ~SourceTree(); + + // Open the given file and return a stream that reads it, or NULL if not + // found. The caller takes ownership of the returned object. The filename + // must be a path relative to the root of the source tree and must not + // contain "." or ".." components. + virtual io::ZeroCopyInputStream* Open(const string& filename) = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SourceTree); +}; + +// An implementation of SourceTree which loads files from locations on disk. +// Multiple mappings can be set up to map locations in the DiskSourceTree to +// locations in the physical filesystem. +class LIBPROTOBUF_EXPORT DiskSourceTree : public SourceTree { + public: + DiskSourceTree(); + ~DiskSourceTree(); + + // Map a path on disk to a location in the SourceTree. The path may be + // either a file or a directory. If it is a directory, the entire tree + // under it will be mapped to the given virtual location. To map a directory + // to the root of the source tree, pass an empty string for virtual_path. + // + // If multiple mapped paths apply when opening a file, they will be searched + // in order. For example, if you do: + // MapPath("bar", "foo/bar"); + // MapPath("", "baz"); + // and then you do: + // Open("bar/qux"); + // the DiskSourceTree will first try to open foo/bar/qux, then baz/bar/qux, + // returning the first one that opens successfuly. + // + // disk_path may be an absolute path or relative to the current directory, + // just like a path you'd pass to open(). + void MapPath(const string& virtual_path, const string& disk_path); + + // Return type for DiskFileToVirtualFile(). + enum DiskFileToVirtualFileResult { + SUCCESS, + SHADOWED, + CANNOT_OPEN, + NO_MAPPING + }; + + // Given a path to a file on disk, find a virtual path mapping to that + // file. The first mapping created with MapPath() whose disk_path contains + // the filename is used. However, that virtual path may not actually be + // usable to open the given file. Possible return values are: + // * SUCCESS: The mapping was found. *virtual_file is filled in so that + // calling Open(*virtual_file) will open the file named by disk_file. + // * SHADOWED: A mapping was found, but using Open() to open this virtual + // path will end up returning some different file. This is because some + // other mapping with a higher precedence also matches this virtual path + // and maps it to a different file that exists on disk. *virtual_file + // is filled in as it would be in the SUCCESS case. *shadowing_disk_file + // is filled in with the disk path of the file which would be opened if + // you were to call Open(*virtual_file). + // * CANNOT_OPEN: The mapping was found and was not shadowed, but the + // file specified cannot be opened. When this value is returned, + // errno will indicate the reason the file cannot be opened. *virtual_file + // will be set to the virtual path as in the SUCCESS case, even though + // it is not useful. + // * NO_MAPPING: Indicates that no mapping was found which contains this + // file. + DiskFileToVirtualFileResult + DiskFileToVirtualFile(const string& disk_file, + string* virtual_file, + string* shadowing_disk_file); + + // Given a virtual path, find the path to the file on disk. + // Return true and update disk_file with the on-disk path if the file exists. + // Return false and leave disk_file untouched if the file doesn't exist. + bool VirtualFileToDiskFile(const string& virtual_file, string* disk_file); + + // implements SourceTree ------------------------------------------- + io::ZeroCopyInputStream* Open(const string& filename); + + private: + struct Mapping { + string virtual_path; + string disk_path; + + inline Mapping(const string& virtual_path, const string& disk_path) + : virtual_path(virtual_path), disk_path(disk_path) {} + }; + vector mappings_; + + // Like Open(), but returns the on-disk path in disk_file if disk_file is + // non-NULL and the file could be successfully opened. + io::ZeroCopyInputStream* OpenVirtualFile(const string& virtual_file, + string* disk_file); + + // Like Open() but given the actual on-disk path. + io::ZeroCopyInputStream* OpenDiskFile(const string& filename); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DiskSourceTree); +}; + +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_IMPORTER_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc new file mode 100644 index 000000000..56fad56ed --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc @@ -0,0 +1,600 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +namespace { + +#define EXPECT_SUBSTRING(needle, haystack) \ + EXPECT_PRED_FORMAT2(testing::IsSubstring, (needle), (haystack)) + +class MockErrorCollector : public MultiFileErrorCollector { + public: + MockErrorCollector() {} + ~MockErrorCollector() {} + + string text_; + + // implements ErrorCollector --------------------------------------- + void AddError(const string& filename, int line, int column, + const string& message) { + strings::SubstituteAndAppend(&text_, "$0:$1:$2: $3\n", + filename, line, column, message); + } +}; + +// ------------------------------------------------------------------- + +// A dummy implementation of SourceTree backed by a simple map. +class MockSourceTree : public SourceTree { + public: + MockSourceTree() {} + ~MockSourceTree() {} + + void AddFile(const string& name, const char* contents) { + files_[name] = contents; + } + + // implements SourceTree ------------------------------------------- + io::ZeroCopyInputStream* Open(const string& filename) { + const char* contents = FindPtrOrNull(files_, filename); + if (contents == NULL) { + return NULL; + } else { + return new io::ArrayInputStream(contents, strlen(contents)); + } + } + + private: + hash_map files_; +}; + +// =================================================================== + +class ImporterTest : public testing::Test { + protected: + ImporterTest() + : importer_(&source_tree_, &error_collector_) {} + + void AddFile(const string& filename, const char* text) { + source_tree_.AddFile(filename, text); + } + + // Return the collected error text + string error() const { return error_collector_.text_; } + + MockErrorCollector error_collector_; + MockSourceTree source_tree_; + Importer importer_; +}; + +TEST_F(ImporterTest, Import) { + // Test normal importing. + AddFile("foo.proto", + "syntax = \"proto2\";\n" + "message Foo {}\n"); + + const FileDescriptor* file = importer_.Import("foo.proto"); + EXPECT_EQ("", error_collector_.text_); + ASSERT_TRUE(file != NULL); + + ASSERT_EQ(1, file->message_type_count()); + EXPECT_EQ("Foo", file->message_type(0)->name()); + + // Importing again should return same object. + EXPECT_EQ(file, importer_.Import("foo.proto")); +} + +TEST_F(ImporterTest, ImportNested) { + // Test that importing a file which imports another file works. + AddFile("foo.proto", + "syntax = \"proto2\";\n" + "import \"bar.proto\";\n" + "message Foo {\n" + " optional Bar bar = 1;\n" + "}\n"); + AddFile("bar.proto", + "syntax = \"proto2\";\n" + "message Bar {}\n"); + + // Note that both files are actually parsed by the first call to Import() + // here, since foo.proto imports bar.proto. The second call just returns + // the same ProtoFile for bar.proto which was constructed while importing + // foo.proto. We test that this is the case below by checking that bar + // is among foo's dependencies (by pointer). + const FileDescriptor* foo = importer_.Import("foo.proto"); + const FileDescriptor* bar = importer_.Import("bar.proto"); + EXPECT_EQ("", error_collector_.text_); + ASSERT_TRUE(foo != NULL); + ASSERT_TRUE(bar != NULL); + + // Check that foo's dependency is the same object as bar. + ASSERT_EQ(1, foo->dependency_count()); + EXPECT_EQ(bar, foo->dependency(0)); + + // Check that foo properly cross-links bar. + ASSERT_EQ(1, foo->message_type_count()); + ASSERT_EQ(1, bar->message_type_count()); + ASSERT_EQ(1, foo->message_type(0)->field_count()); + ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, + foo->message_type(0)->field(0)->type()); + EXPECT_EQ(bar->message_type(0), + foo->message_type(0)->field(0)->message_type()); +} + +TEST_F(ImporterTest, FileNotFound) { + // Error: Parsing a file that doesn't exist. + EXPECT_TRUE(importer_.Import("foo.proto") == NULL); + EXPECT_EQ( + "foo.proto:-1:0: File not found.\n", + error_collector_.text_); +} + +TEST_F(ImporterTest, ImportNotFound) { + // Error: Importing a file that doesn't exist. + AddFile("foo.proto", + "syntax = \"proto2\";\n" + "import \"bar.proto\";\n"); + + EXPECT_TRUE(importer_.Import("foo.proto") == NULL); + EXPECT_EQ( + "bar.proto:-1:0: File not found.\n" + "foo.proto:-1:0: Import \"bar.proto\" was not found or had errors.\n", + error_collector_.text_); +} + +TEST_F(ImporterTest, RecursiveImport) { + // Error: Recursive import. + AddFile("recursive1.proto", + "syntax = \"proto2\";\n" + "import \"recursive2.proto\";\n"); + AddFile("recursive2.proto", + "syntax = \"proto2\";\n" + "import \"recursive1.proto\";\n"); + + EXPECT_TRUE(importer_.Import("recursive1.proto") == NULL); + EXPECT_EQ( + "recursive1.proto:-1:0: File recursively imports itself: recursive1.proto " + "-> recursive2.proto -> recursive1.proto\n" + "recursive2.proto:-1:0: Import \"recursive1.proto\" was not found " + "or had errors.\n" + "recursive1.proto:-1:0: Import \"recursive2.proto\" was not found " + "or had errors.\n", + error_collector_.text_); +} + +// TODO(sanjay): The MapField tests below more properly belong in +// descriptor_unittest, but are more convenient to test here. +TEST_F(ImporterTest, MapFieldValid) { + AddFile( + "map.proto", + "syntax = \"proto2\";\n" + "message Item {\n" + " required string key = 1;\n" + "}\n" + "message Map {\n" + " repeated Item items = 1 [experimental_map_key = \"key\"];\n" + "}\n" + ); + const FileDescriptor* file = importer_.Import("map.proto"); + ASSERT_TRUE(file != NULL) << error_collector_.text_; + EXPECT_EQ("", error_collector_.text_); + + // Check that Map::items points to Item::key + const Descriptor* item_type = file->FindMessageTypeByName("Item"); + ASSERT_TRUE(item_type != NULL); + const Descriptor* map_type = file->FindMessageTypeByName("Map"); + ASSERT_TRUE(map_type != NULL); + const FieldDescriptor* key_field = item_type->FindFieldByName("key"); + ASSERT_TRUE(key_field != NULL); + const FieldDescriptor* items_field = map_type->FindFieldByName("items"); + ASSERT_TRUE(items_field != NULL); + EXPECT_EQ(items_field->experimental_map_key(), key_field); +} + +TEST_F(ImporterTest, MapFieldNotRepeated) { + AddFile( + "map.proto", + "syntax = \"proto2\";\n" + "message Item {\n" + " required string key = 1;\n" + "}\n" + "message Map {\n" + " required Item items = 1 [experimental_map_key = \"key\"];\n" + "}\n" + ); + EXPECT_TRUE(importer_.Import("map.proto") == NULL); + EXPECT_SUBSTRING("only allowed for repeated fields", error()); +} + +TEST_F(ImporterTest, MapFieldNotMessageType) { + AddFile( + "map.proto", + "syntax = \"proto2\";\n" + "message Map {\n" + " repeated int32 items = 1 [experimental_map_key = \"key\"];\n" + "}\n" + ); + EXPECT_TRUE(importer_.Import("map.proto") == NULL); + EXPECT_SUBSTRING("only allowed for fields with a message type", error()); +} + +TEST_F(ImporterTest, MapFieldTypeNotFound) { + AddFile( + "map.proto", + "syntax = \"proto2\";\n" + "message Map {\n" + " repeated Unknown items = 1 [experimental_map_key = \"key\"];\n" + "}\n" + ); + EXPECT_TRUE(importer_.Import("map.proto") == NULL); + EXPECT_SUBSTRING("not defined", error()); +} + +TEST_F(ImporterTest, MapFieldKeyNotFound) { + AddFile( + "map.proto", + "syntax = \"proto2\";\n" + "message Item {\n" + " required string key = 1;\n" + "}\n" + "message Map {\n" + " repeated Item items = 1 [experimental_map_key = \"badkey\"];\n" + "}\n" + ); + EXPECT_TRUE(importer_.Import("map.proto") == NULL); + EXPECT_SUBSTRING("Could not find field", error()); +} + +TEST_F(ImporterTest, MapFieldKeyRepeated) { + AddFile( + "map.proto", + "syntax = \"proto2\";\n" + "message Item {\n" + " repeated string key = 1;\n" + "}\n" + "message Map {\n" + " repeated Item items = 1 [experimental_map_key = \"key\"];\n" + "}\n" + ); + EXPECT_TRUE(importer_.Import("map.proto") == NULL); + EXPECT_SUBSTRING("must not name a repeated field", error()); +} + +TEST_F(ImporterTest, MapFieldKeyNotScalar) { + AddFile( + "map.proto", + "syntax = \"proto2\";\n" + "message ItemKey { }\n" + "message Item {\n" + " required ItemKey key = 1;\n" + "}\n" + "message Map {\n" + " repeated Item items = 1 [experimental_map_key = \"key\"];\n" + "}\n" + ); + EXPECT_TRUE(importer_.Import("map.proto") == NULL); + EXPECT_SUBSTRING("must name a scalar or string", error()); +} + +// =================================================================== + +class DiskSourceTreeTest : public testing::Test { + protected: + virtual void SetUp() { + dirnames_.push_back(TestTempDir() + "/test_proto2_import_path_1"); + dirnames_.push_back(TestTempDir() + "/test_proto2_import_path_2"); + + for (int i = 0; i < dirnames_.size(); i++) { + if (File::Exists(dirnames_[i])) { + File::DeleteRecursively(dirnames_[i], NULL, NULL); + } + GOOGLE_CHECK(File::CreateDir(dirnames_[i].c_str(), DEFAULT_FILE_MODE)); + } + } + + virtual void TearDown() { + for (int i = 0; i < dirnames_.size(); i++) { + File::DeleteRecursively(dirnames_[i], NULL, NULL); + } + } + + void AddFile(const string& filename, const char* contents) { + File::WriteStringToFileOrDie(contents, filename); + } + + void AddSubdir(const string& dirname) { + GOOGLE_CHECK(File::CreateDir(dirname.c_str(), DEFAULT_FILE_MODE)); + } + + void ExpectFileContents(const string& filename, + const char* expected_contents) { + scoped_ptr input(source_tree_.Open(filename)); + + ASSERT_FALSE(input == NULL); + + // Read all the data from the file. + string file_contents; + const void* data; + int size; + while (input->Next(&data, &size)) { + file_contents.append(reinterpret_cast(data), size); + } + + EXPECT_EQ(expected_contents, file_contents); + } + + void ExpectFileNotFound(const string& filename) { + scoped_ptr input(source_tree_.Open(filename)); + EXPECT_TRUE(input == NULL); + } + + DiskSourceTree source_tree_; + + // Paths of two on-disk directories to use during the test. + vector dirnames_; +}; + +TEST_F(DiskSourceTreeTest, MapRoot) { + // Test opening a file in a directory that is mapped to the root of the + // source tree. + AddFile(dirnames_[0] + "/foo", "Hello World!"); + source_tree_.MapPath("", dirnames_[0]); + + ExpectFileContents("foo", "Hello World!"); + ExpectFileNotFound("bar"); +} + +TEST_F(DiskSourceTreeTest, MapDirectory) { + // Test opening a file in a directory that is mapped to somewhere other + // than the root of the source tree. + + AddFile(dirnames_[0] + "/foo", "Hello World!"); + source_tree_.MapPath("baz", dirnames_[0]); + + ExpectFileContents("baz/foo", "Hello World!"); + ExpectFileNotFound("baz/bar"); + ExpectFileNotFound("foo"); + ExpectFileNotFound("bar"); + + // Non-canonical file names should not work. + ExpectFileNotFound("baz//foo"); + ExpectFileNotFound("baz/../baz/foo"); + ExpectFileNotFound("baz/./foo"); + ExpectFileNotFound("baz/foo/"); +} + +TEST_F(DiskSourceTreeTest, NoParent) { + // Test that we cannot open files in a parent of a mapped directory. + + AddFile(dirnames_[0] + "/foo", "Hello World!"); + AddSubdir(dirnames_[0] + "/bar"); + AddFile(dirnames_[0] + "/bar/baz", "Blah."); + source_tree_.MapPath("", dirnames_[0] + "/bar"); + + ExpectFileContents("baz", "Blah."); + ExpectFileNotFound("../foo"); + ExpectFileNotFound("../bar/baz"); +} + +TEST_F(DiskSourceTreeTest, MapFile) { + // Test opening a file that is mapped directly into the source tree. + + AddFile(dirnames_[0] + "/foo", "Hello World!"); + source_tree_.MapPath("foo", dirnames_[0] + "/foo"); + + ExpectFileContents("foo", "Hello World!"); + ExpectFileNotFound("bar"); +} + +TEST_F(DiskSourceTreeTest, SearchMultipleDirectories) { + // Test mapping and searching multiple directories. + + AddFile(dirnames_[0] + "/foo", "Hello World!"); + AddFile(dirnames_[1] + "/foo", "This file should be hidden."); + AddFile(dirnames_[1] + "/bar", "Goodbye World!"); + source_tree_.MapPath("", dirnames_[0]); + source_tree_.MapPath("", dirnames_[1]); + + ExpectFileContents("foo", "Hello World!"); + ExpectFileContents("bar", "Goodbye World!"); + ExpectFileNotFound("baz"); +} + +TEST_F(DiskSourceTreeTest, OrderingTrumpsSpecificity) { + // Test that directories are always searched in order, even when a latter + // directory is more-specific than a former one. + + // Create the "bar" directory so we can put a file in it. + ASSERT_TRUE(File::CreateDir((dirnames_[0] + "/bar").c_str(), + DEFAULT_FILE_MODE)); + + // Add files and map paths. + AddFile(dirnames_[0] + "/bar/foo", "Hello World!"); + AddFile(dirnames_[1] + "/foo", "This file should be hidden."); + source_tree_.MapPath("", dirnames_[0]); + source_tree_.MapPath("bar", dirnames_[1]); + + // Check. + ExpectFileContents("bar/foo", "Hello World!"); +} + +TEST_F(DiskSourceTreeTest, DiskFileToVirtualFile) { + // Test DiskFileToVirtualFile. + + AddFile(dirnames_[0] + "/foo", "Hello World!"); + AddFile(dirnames_[1] + "/foo", "This file should be hidden."); + source_tree_.MapPath("bar", dirnames_[0]); + source_tree_.MapPath("bar", dirnames_[1]); + + string virtual_file; + string shadowing_disk_file; + + EXPECT_EQ(DiskSourceTree::NO_MAPPING, + source_tree_.DiskFileToVirtualFile( + "/foo", &virtual_file, &shadowing_disk_file)); + + EXPECT_EQ(DiskSourceTree::SHADOWED, + source_tree_.DiskFileToVirtualFile( + dirnames_[1] + "/foo", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("bar/foo", virtual_file); + EXPECT_EQ(dirnames_[0] + "/foo", shadowing_disk_file); + + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + dirnames_[1] + "/baz", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("bar/baz", virtual_file); + + EXPECT_EQ(DiskSourceTree::SUCCESS, + source_tree_.DiskFileToVirtualFile( + dirnames_[0] + "/foo", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("bar/foo", virtual_file); +} + +TEST_F(DiskSourceTreeTest, DiskFileToVirtualFileCanonicalization) { + // Test handling of "..", ".", etc. in DiskFileToVirtualFile(). + + source_tree_.MapPath("dir1", ".."); + source_tree_.MapPath("dir2", "../../foo"); + source_tree_.MapPath("dir3", "./foo/bar/."); + source_tree_.MapPath("dir4", "."); + source_tree_.MapPath("", "/qux"); + source_tree_.MapPath("dir5", "/quux/"); + + string virtual_file; + string shadowing_disk_file; + + // "../.." should not be considered to be under "..". + EXPECT_EQ(DiskSourceTree::NO_MAPPING, + source_tree_.DiskFileToVirtualFile( + "../../baz", &virtual_file, &shadowing_disk_file)); + + // "/foo" is not mapped (it should not be misintepreted as being under "."). + EXPECT_EQ(DiskSourceTree::NO_MAPPING, + source_tree_.DiskFileToVirtualFile( + "/foo", &virtual_file, &shadowing_disk_file)); + +#ifdef WIN32 + // "C:\foo" is not mapped (it should not be misintepreted as being under "."). + EXPECT_EQ(DiskSourceTree::NO_MAPPING, + source_tree_.DiskFileToVirtualFile( + "C:\\foo", &virtual_file, &shadowing_disk_file)); +#endif // WIN32 + + // But "../baz" should be. + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + "../baz", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("dir1/baz", virtual_file); + + // "../../foo/baz" is under "../../foo". + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + "../../foo/baz", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("dir2/baz", virtual_file); + + // "foo/./bar/baz" is under "./foo/bar/.". + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + "foo/bar/baz", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("dir3/baz", virtual_file); + + // "bar" is under ".". + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + "bar", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("dir4/bar", virtual_file); + + // "/qux/baz" is under "/qux". + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + "/qux/baz", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("baz", virtual_file); + + // "/quux/bar" is under "/quux". + EXPECT_EQ(DiskSourceTree::CANNOT_OPEN, + source_tree_.DiskFileToVirtualFile( + "/quux/bar", &virtual_file, &shadowing_disk_file)); + EXPECT_EQ("dir5/bar", virtual_file); +} + +TEST_F(DiskSourceTreeTest, VirtualFileToDiskFile) { + // Test VirtualFileToDiskFile. + + AddFile(dirnames_[0] + "/foo", "Hello World!"); + AddFile(dirnames_[1] + "/foo", "This file should be hidden."); + AddFile(dirnames_[1] + "/quux", "This file should not be hidden."); + source_tree_.MapPath("bar", dirnames_[0]); + source_tree_.MapPath("bar", dirnames_[1]); + + // Existent files, shadowed and non-shadowed case. + string disk_file; + EXPECT_TRUE(source_tree_.VirtualFileToDiskFile("bar/foo", &disk_file)); + EXPECT_EQ(dirnames_[0] + "/foo", disk_file); + EXPECT_TRUE(source_tree_.VirtualFileToDiskFile("bar/quux", &disk_file)); + EXPECT_EQ(dirnames_[1] + "/quux", disk_file); + + // Nonexistent file in existent directory and vice versa. + string not_touched = "not touched"; + EXPECT_FALSE(source_tree_.VirtualFileToDiskFile("bar/baz", ¬_touched)); + EXPECT_EQ("not touched", not_touched); + EXPECT_FALSE(source_tree_.VirtualFileToDiskFile("baz/foo", ¬_touched)); + EXPECT_EQ("not touched", not_touched); + + // Accept NULL as output parameter. + EXPECT_TRUE(source_tree_.VirtualFileToDiskFile("bar/foo", NULL)); + EXPECT_FALSE(source_tree_.VirtualFileToDiskFile("baz/foo", NULL)); +} + +} // namespace + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc new file mode 100644 index 000000000..9d7bcab64 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc @@ -0,0 +1,243 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +EnumGenerator::EnumGenerator(const EnumDescriptor* descriptor) + : descriptor_(descriptor) { + for (int i = 0; i < descriptor_->value_count(); i++) { + const EnumValueDescriptor* value = descriptor_->value(i); + const EnumValueDescriptor* canonical_value = + descriptor_->FindValueByNumber(value->number()); + + if (value == canonical_value) { + canonical_values_.push_back(value); + } else { + Alias alias; + alias.value = value; + alias.canonical_value = canonical_value; + aliases_.push_back(alias); + } + } +} + +EnumGenerator::~EnumGenerator() {} + +void EnumGenerator::Generate(io::Printer* printer) { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public enum $classname$\n" + " implements com.google.protobuf.ProtocolMessageEnum {\n", + "classname", descriptor_->name()); + } else { + printer->Print( + "public enum $classname$\n" + " implements com.google.protobuf.Internal.EnumLite {\n", + "classname", descriptor_->name()); + } + printer->Indent(); + + for (int i = 0; i < canonical_values_.size(); i++) { + map vars; + vars["name"] = canonical_values_[i]->name(); + vars["index"] = SimpleItoa(canonical_values_[i]->index()); + vars["number"] = SimpleItoa(canonical_values_[i]->number()); + printer->Print(vars, + "$name$($index$, $number$),\n"); + } + + printer->Print( + ";\n" + "\n"); + + // ----------------------------------------------------------------- + + for (int i = 0; i < aliases_.size(); i++) { + map vars; + vars["classname"] = descriptor_->name(); + vars["name"] = aliases_[i].value->name(); + vars["canonical_name"] = aliases_[i].canonical_value->name(); + printer->Print(vars, + "public static final $classname$ $name$ = $canonical_name$;\n"); + } + + for (int i = 0; i < descriptor_->value_count(); i++) { + map vars; + vars["name"] = descriptor_->value(i)->name(); + vars["number"] = SimpleItoa(descriptor_->value(i)->number()); + printer->Print(vars, + "public static final int $name$_VALUE = $number$;\n"); + } + printer->Print("\n"); + + // ----------------------------------------------------------------- + + printer->Print( + "\n" + "public final int getNumber() { return value; }\n" + "\n" + "public static $classname$ valueOf(int value) {\n" + " switch (value) {\n", + "classname", descriptor_->name()); + printer->Indent(); + printer->Indent(); + + for (int i = 0; i < canonical_values_.size(); i++) { + printer->Print( + "case $number$: return $name$;\n", + "name", canonical_values_[i]->name(), + "number", SimpleItoa(canonical_values_[i]->number())); + } + + printer->Outdent(); + printer->Outdent(); + printer->Print( + " default: return null;\n" + " }\n" + "}\n" + "\n" + "public static com.google.protobuf.Internal.EnumLiteMap<$classname$>\n" + " internalGetValueMap() {\n" + " return internalValueMap;\n" + "}\n" + "private static com.google.protobuf.Internal.EnumLiteMap<$classname$>\n" + " internalValueMap =\n" + " new com.google.protobuf.Internal.EnumLiteMap<$classname$>() {\n" + " public $classname$ findValueByNumber(int number) {\n" + " return $classname$.valueOf(number);\n" + " }\n" + " };\n" + "\n", + "classname", descriptor_->name()); + + // ----------------------------------------------------------------- + // Reflection + + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public final com.google.protobuf.Descriptors.EnumValueDescriptor\n" + " getValueDescriptor() {\n" + " return getDescriptor().getValues().get(index);\n" + "}\n" + "public final com.google.protobuf.Descriptors.EnumDescriptor\n" + " getDescriptorForType() {\n" + " return getDescriptor();\n" + "}\n" + "public static final com.google.protobuf.Descriptors.EnumDescriptor\n" + " getDescriptor() {\n"); + + // TODO(kenton): Cache statically? Note that we can't access descriptors + // at module init time because it wouldn't work with descriptor.proto, but + // we can cache the value the first time getDescriptor() is called. + if (descriptor_->containing_type() == NULL) { + printer->Print( + " return $file$.getDescriptor().getEnumTypes().get($index$);\n", + "file", ClassName(descriptor_->file()), + "index", SimpleItoa(descriptor_->index())); + } else { + printer->Print( + " return $parent$.getDescriptor().getEnumTypes().get($index$);\n", + "parent", ClassName(descriptor_->containing_type()), + "index", SimpleItoa(descriptor_->index())); + } + + printer->Print( + "}\n" + "\n" + "private static final $classname$[] VALUES = {\n" + " ", + "classname", descriptor_->name()); + + for (int i = 0; i < descriptor_->value_count(); i++) { + printer->Print("$name$, ", + "name", descriptor_->value(i)->name()); + } + + printer->Print( + "\n" + "};\n" + "\n" + "public static $classname$ valueOf(\n" + " com.google.protobuf.Descriptors.EnumValueDescriptor desc) {\n" + " if (desc.getType() != getDescriptor()) {\n" + " throw new java.lang.IllegalArgumentException(\n" + " \"EnumValueDescriptor is not for this type.\");\n" + " }\n" + " return VALUES[desc.getIndex()];\n" + "}\n" + "\n", + "classname", descriptor_->name()); + + // index is only used for reflection; lite implementation does not need it + printer->Print("private final int index;\n"); + } + + // ----------------------------------------------------------------- + + printer->Print( + "private final int value;\n\n" + "private $classname$(int index, int value) {\n", + "classname", descriptor_->name()); + if (HasDescriptorMethods(descriptor_)) { + printer->Print(" this.index = index;\n"); + } + printer->Print( + " this.value = value;\n" + "}\n"); + + printer->Print( + "\n" + "// @@protoc_insertion_point(enum_scope:$full_name$)\n", + "full_name", descriptor_->full_name()); + + printer->Outdent(); + printer->Print("}\n\n"); +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h new file mode 100644 index 000000000..05ece1f13 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h @@ -0,0 +1,84 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace java { + +class EnumGenerator { + public: + explicit EnumGenerator(const EnumDescriptor* descriptor); + ~EnumGenerator(); + + void Generate(io::Printer* printer); + + private: + const EnumDescriptor* descriptor_; + + // The proto language allows multiple enum constants to have the same numeric + // value. Java, however, does not allow multiple enum constants to be + // considered equivalent. We treat the first defined constant for any + // given numeric value as "canonical" and the rest as aliases of that + // canonical value. + vector canonical_values_; + + struct Alias { + const EnumValueDescriptor* value; + const EnumValueDescriptor* canonical_value; + }; + vector aliases_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc new file mode 100644 index 000000000..72caa10b5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc @@ -0,0 +1,537 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +namespace { + +// TODO(kenton): Factor out a "SetCommonFieldVariables()" to get rid of +// repeat code between this and the other field types. +void SetEnumVariables(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex, + map* variables) { + (*variables)["name"] = + UnderscoresToCamelCase(descriptor); + (*variables)["capitalized_name"] = + UnderscoresToCapitalizedCamelCase(descriptor); + (*variables)["constant_name"] = FieldConstantName(descriptor); + (*variables)["number"] = SimpleItoa(descriptor->number()); + (*variables)["type"] = ClassName(descriptor->enum_type()); + (*variables)["default"] = DefaultValue(descriptor); + (*variables)["tag"] = SimpleItoa(internal::WireFormat::MakeTag(descriptor)); + (*variables)["tag_size"] = SimpleItoa( + internal::WireFormat::TagSize(descriptor->number(), GetType(descriptor))); + // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported + // by the proto compiler + (*variables)["deprecation"] = descriptor->options().deprecated() + ? "@java.lang.Deprecated " : ""; + (*variables)["on_changed"] = + HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : ""; + + // For singular messages and builders, one bit is used for the hasField bit. + (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); + + (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_has_field_bit_builder"] = + GenerateClearBit(builderBitIndex); + + // For repated builders, one bit is used for whether the array is immutable. + (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); + + (*variables)["get_has_field_bit_from_local"] = + GenerateGetBitFromLocal(builderBitIndex); + (*variables)["set_has_field_bit_to_local"] = + GenerateSetBitToLocal(messageBitIndex); +} + +} // namespace + +// =================================================================== + +EnumFieldGenerator:: +EnumFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, &variables_); +} + +EnumFieldGenerator::~EnumFieldGenerator() {} + +int EnumFieldGenerator::GetNumBitsForMessage() const { + return 1; +} + +int EnumFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +void EnumFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + printer->Print(variables_, + "$deprecation$boolean has$capitalized_name$();\n" + "$deprecation$$type$ get$capitalized_name$();\n"); +} + +void EnumFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private $type$ $name$_;\n" + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_message$;\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$() {\n" + " return $name$_;\n" + "}\n"); +} + +void EnumFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + printer->Print(variables_, + "private $type$ $name$_ = $default$;\n" + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_builder$;\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$() {\n" + " return $name$_;\n" + "}\n" + "$deprecation$public Builder set$capitalized_name$($type$ value) {\n" + " if (value == null) {\n" + " throw new NullPointerException();\n" + " }\n" + " $set_has_field_bit_builder$;\n" + " $name$_ = value;\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder clear$capitalized_name$() {\n" + " $clear_has_field_bit_builder$;\n" + " $name$_ = $default$;\n" + " $on_changed$\n" + " return this;\n" + "}\n"); +} + +void EnumFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + // noop for enums +} + +void EnumFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $default$;\n"); +} + +void EnumFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$_ = $default$;\n" + "$clear_has_field_bit_builder$;\n"); +} + +void EnumFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, + "if (other.has$capitalized_name$()) {\n" + " set$capitalized_name$(other.get$capitalized_name$());\n" + "}\n"); +} + +void EnumFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_from_local$) {\n" + " $set_has_field_bit_to_local$;\n" + "}\n" + "result.$name$_ = $name$_;\n"); +} + +void EnumFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + printer->Print(variables_, + "int rawValue = input.readEnum();\n" + "$type$ value = $type$.valueOf(rawValue);\n"); + if (HasUnknownFields(descriptor_->containing_type())) { + printer->Print(variables_, + "if (value == null) {\n" + " unknownFields.mergeVarintField($number$, rawValue);\n" + "} else {\n"); + } else { + printer->Print(variables_, + "if (value != null) {\n"); + } + printer->Print(variables_, + " $set_has_field_bit_builder$;\n" + " $name$_ = value;\n" + "}\n"); +} + +void EnumFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " output.writeEnum($number$, $name$_.getNumber());\n" + "}\n"); +} + +void EnumFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .computeEnumSize($number$, $name$_.getNumber());\n" + "}\n"); +} + +void EnumFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + printer->Print(variables_, + "result = result &&\n" + " (get$capitalized_name$() == other.get$capitalized_name$());\n"); +} + +void EnumFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "hash = (37 * hash) + $constant_name$;\n" + "hash = (53 * hash) + hashEnum(get$capitalized_name$());\n"); +} + +string EnumFieldGenerator::GetBoxedType() const { + return ClassName(descriptor_->enum_type()); +} + +// =================================================================== + +RepeatedEnumFieldGenerator:: +RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetEnumVariables(descriptor, messageBitIndex, builderBitIndex, &variables_); +} + +RepeatedEnumFieldGenerator::~RepeatedEnumFieldGenerator() {} + +int RepeatedEnumFieldGenerator::GetNumBitsForMessage() const { + return 0; +} + +int RepeatedEnumFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +void RepeatedEnumFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + printer->Print(variables_, + "$deprecation$java.util.List<$type$> get$capitalized_name$List();\n" + "$deprecation$int get$capitalized_name$Count();\n" + "$deprecation$$type$ get$capitalized_name$(int index);\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private java.util.List<$type$> $name$_;\n" + "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n" + " return $name$_;\n" // note: unmodifiable list + "}\n" + "$deprecation$public int get$capitalized_name$Count() {\n" + " return $name$_.size();\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" + "}\n"); + + if (descriptor_->options().packed() && + HasGeneratedMethods(descriptor_->containing_type())) { + printer->Print(variables_, + "private int $name$MemoizedSerializedSize;\n"); + } +} + +void RepeatedEnumFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + printer->Print(variables_, + // One field is the list and the other field keeps track of whether the + // list is immutable. If it's immutable, the invariant is that it must + // either an instance of Collections.emptyList() or it's an ArrayList + // wrapped in a Collections.unmodifiableList() wrapper and nobody else has + // a refererence to the underlying ArrayList. This invariant allows us to + // share instances of lists between protocol buffers avoiding expensive + // memory allocations. Note, immutable is a strong guarantee here -- not + // just that the list cannot be modified via the reference but that the + // list can never be modified. + "private java.util.List<$type$> $name$_ =\n" + " java.util.Collections.emptyList();\n" + + "private void ensure$capitalized_name$IsMutable() {\n" + " if (!$get_mutable_bit_builder$) {\n" + " $name$_ = new java.util.ArrayList<$type$>($name$_);\n" + " $set_mutable_bit_builder$;\n" + " }\n" + "}\n" + + // Note: We return an unmodifiable list because otherwise the caller + // could hold on to the returned list and modify it after the message + // has been built, thus mutating the message which is supposed to be + // immutable. + "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n" + " return java.util.Collections.unmodifiableList($name$_);\n" + "}\n" + "$deprecation$public int get$capitalized_name$Count() {\n" + " return $name$_.size();\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" + "}\n" + "$deprecation$public Builder set$capitalized_name$(\n" + " int index, $type$ value) {\n" + " if (value == null) {\n" + " throw new NullPointerException();\n" + " }\n" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.set(index, value);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder add$capitalized_name$($type$ value) {\n" + " if (value == null) {\n" + " throw new NullPointerException();\n" + " }\n" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.add(value);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder addAll$capitalized_name$(\n" + " java.lang.Iterable values) {\n" + " ensure$capitalized_name$IsMutable();\n" + " super.addAll(values, $name$_);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder clear$capitalized_name$() {\n" + " $name$_ = java.util.Collections.emptyList();\n" + " $clear_mutable_bit_builder$;\n" + " $on_changed$\n" + " return this;\n" + "}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + // noop for enums +} + +void RepeatedEnumFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$_ = java.util.Collections.emptyList();\n" + "$clear_mutable_bit_builder$;\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + // The code below does two optimizations: + // 1. If the other list is empty, there's nothing to do. This ensures we + // don't allocate a new array if we already have an immutable one. + // 2. If the other list is non-empty and our current list is empty, we can + // reuse the other list which is guaranteed to be immutable. + printer->Print(variables_, + "if (!other.$name$_.isEmpty()) {\n" + " if ($name$_.isEmpty()) {\n" + " $name$_ = other.$name$_;\n" + " $clear_mutable_bit_builder$;\n" + " } else {\n" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.addAll(other.$name$_);\n" + " }\n" + " $on_changed$\n" + "}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + // The code below ensures that the result has an immutable list. If our + // list is immutable, we can just reuse it. If not, we make it immutable. + printer->Print(variables_, + "if ($get_mutable_bit_builder$) {\n" + " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" + " $clear_mutable_bit_builder$;\n" + "}\n" + "result.$name$_ = $name$_;\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + // Read and store the enum + printer->Print(variables_, + "int rawValue = input.readEnum();\n" + "$type$ value = $type$.valueOf(rawValue);\n"); + if (HasUnknownFields(descriptor_->containing_type())) { + printer->Print(variables_, + "if (value == null) {\n" + " unknownFields.mergeVarintField($number$, rawValue);\n" + "} else {\n"); + } else { + printer->Print(variables_, + "if (value != null) {\n"); + } + printer->Print(variables_, + " add$capitalized_name$(value);\n" + "}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateParsingCodeFromPacked(io::Printer* printer) const { + // Wrap GenerateParsingCode's contents with a while loop. + + printer->Print(variables_, + "int length = input.readRawVarint32();\n" + "int oldLimit = input.pushLimit(length);\n" + "while(input.getBytesUntilLimit() > 0) {\n"); + printer->Indent(); + + GenerateParsingCode(printer); + + printer->Outdent(); + printer->Print(variables_, + "}\n" + "input.popLimit(oldLimit);\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (get$capitalized_name$List().size() > 0) {\n" + " output.writeRawVarint32($tag$);\n" + " output.writeRawVarint32($name$MemoizedSerializedSize);\n" + "}\n" + "for (int i = 0; i < $name$_.size(); i++) {\n" + " output.writeEnumNoTag($name$_.get(i).getNumber());\n" + "}\n"); + } else { + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " output.writeEnum($number$, $name$_.get(i).getNumber());\n" + "}\n"); + } +} + +void RepeatedEnumFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "{\n" + " int dataSize = 0;\n"); + printer->Indent(); + + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " dataSize += com.google.protobuf.CodedOutputStream\n" + " .computeEnumSizeNoTag($name$_.get(i).getNumber());\n" + "}\n"); + printer->Print( + "size += dataSize;\n"); + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (!get$capitalized_name$List().isEmpty()) {" + " size += $tag_size$;\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .computeRawVarint32Size(dataSize);\n" + "}"); + } else { + printer->Print(variables_, + "size += $tag_size$ * $name$_.size();\n"); + } + + // cache the data size for packed fields. + if (descriptor_->options().packed()) { + printer->Print(variables_, + "$name$MemoizedSerializedSize = dataSize;\n"); + } + + printer->Outdent(); + printer->Print("}\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + printer->Print(variables_, + "result = result && get$capitalized_name$List()\n" + " .equals(other.get$capitalized_name$List());\n"); +} + +void RepeatedEnumFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "if (get$capitalized_name$Count() > 0) {\n" + " hash = (37 * hash) + $constant_name$;\n" + " hash = (53 * hash) + hashEnumList(get$capitalized_name$List());\n" + "}\n"); +} + +string RepeatedEnumFieldGenerator::GetBoxedType() const { + return ClassName(descriptor_->enum_type()); +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h new file mode 100644 index 000000000..0cad6be0e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h @@ -0,0 +1,121 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +class EnumFieldGenerator : public FieldGenerator { + public: + explicit EnumFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~EnumFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumFieldGenerator); +}; + +class RepeatedEnumFieldGenerator : public FieldGenerator { + public: + explicit RepeatedEnumFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~RepeatedEnumFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateParsingCodeFromPacked(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedEnumFieldGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_ENUM_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc new file mode 100644 index 000000000..9b147c776 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc @@ -0,0 +1,216 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +namespace { + +const char* TypeName(FieldDescriptor::Type field_type) { + switch (field_type) { + case FieldDescriptor::TYPE_INT32 : return "INT32"; + case FieldDescriptor::TYPE_UINT32 : return "UINT32"; + case FieldDescriptor::TYPE_SINT32 : return "SINT32"; + case FieldDescriptor::TYPE_FIXED32 : return "FIXED32"; + case FieldDescriptor::TYPE_SFIXED32: return "SFIXED32"; + case FieldDescriptor::TYPE_INT64 : return "INT64"; + case FieldDescriptor::TYPE_UINT64 : return "UINT64"; + case FieldDescriptor::TYPE_SINT64 : return "SINT64"; + case FieldDescriptor::TYPE_FIXED64 : return "FIXED64"; + case FieldDescriptor::TYPE_SFIXED64: return "SFIXED64"; + case FieldDescriptor::TYPE_FLOAT : return "FLOAT"; + case FieldDescriptor::TYPE_DOUBLE : return "DOUBLE"; + case FieldDescriptor::TYPE_BOOL : return "BOOL"; + case FieldDescriptor::TYPE_STRING : return "STRING"; + case FieldDescriptor::TYPE_BYTES : return "BYTES"; + case FieldDescriptor::TYPE_ENUM : return "ENUM"; + case FieldDescriptor::TYPE_GROUP : return "GROUP"; + case FieldDescriptor::TYPE_MESSAGE : return "MESSAGE"; + + // No default because we want the compiler to complain if any new + // types are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return NULL; +} + +} + +ExtensionGenerator::ExtensionGenerator(const FieldDescriptor* descriptor) + : descriptor_(descriptor) { + if (descriptor_->extension_scope() != NULL) { + scope_ = ClassName(descriptor_->extension_scope()); + } else { + scope_ = ClassName(descriptor_->file()); + } +} + +ExtensionGenerator::~ExtensionGenerator() {} + +// Initializes the vars referenced in the generated code templates. +void InitTemplateVars(const FieldDescriptor* descriptor, + const string& scope, + map* vars_pointer) { + map &vars = *vars_pointer; + vars["scope"] = scope; + vars["name"] = UnderscoresToCamelCase(descriptor); + vars["containing_type"] = ClassName(descriptor->containing_type()); + vars["number"] = SimpleItoa(descriptor->number()); + vars["constant_name"] = FieldConstantName(descriptor); + vars["index"] = SimpleItoa(descriptor->index()); + vars["default"] = + descriptor->is_repeated() ? "" : DefaultValue(descriptor); + vars["type_constant"] = TypeName(GetType(descriptor)); + vars["packed"] = descriptor->options().packed() ? "true" : "false"; + vars["enum_map"] = "null"; + vars["prototype"] = "null"; + + JavaType java_type = GetJavaType(descriptor); + string singular_type; + switch (java_type) { + case JAVATYPE_MESSAGE: + singular_type = ClassName(descriptor->message_type()); + vars["prototype"] = singular_type + ".getDefaultInstance()"; + break; + case JAVATYPE_ENUM: + singular_type = ClassName(descriptor->enum_type()); + vars["enum_map"] = singular_type + ".internalGetValueMap()"; + break; + default: + singular_type = BoxedPrimitiveTypeName(java_type); + break; + } + vars["type"] = descriptor->is_repeated() ? + "java.util.List<" + singular_type + ">" : singular_type; + vars["singular_type"] = singular_type; +} + +void ExtensionGenerator::Generate(io::Printer* printer) { + map vars; + InitTemplateVars(descriptor_, scope_, &vars); + printer->Print(vars, + "public static final int $constant_name$ = $number$;\n"); + + if (HasDescriptorMethods(descriptor_->file())) { + // Non-lite extensions + if (descriptor_->extension_scope() == NULL) { + // Non-nested + printer->Print( + vars, + "public static final\n" + " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" + " $containing_type$,\n" + " $type$> $name$ = com.google.protobuf.GeneratedMessage\n" + " .newFileScopedGeneratedExtension(\n" + " $singular_type$.class,\n" + " $prototype$);\n"); + } else { + // Nested + printer->Print( + vars, + "public static final\n" + " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" + " $containing_type$,\n" + " $type$> $name$ = com.google.protobuf.GeneratedMessage\n" + " .newMessageScopedGeneratedExtension(\n" + " $scope$.getDefaultInstance(),\n" + " $index$,\n" + " $singular_type$.class,\n" + " $prototype$);\n"); + } + } else { + // Lite extensions + if (descriptor_->is_repeated()) { + printer->Print( + vars, + "public static final\n" + " com.google.protobuf.GeneratedMessageLite.GeneratedExtension<\n" + " $containing_type$,\n" + " $type$> $name$ = com.google.protobuf.GeneratedMessageLite\n" + " .newRepeatedGeneratedExtension(\n" + " $containing_type$.getDefaultInstance(),\n" + " $prototype$,\n" + " $enum_map$,\n" + " $number$,\n" + " com.google.protobuf.WireFormat.FieldType.$type_constant$,\n" + " $packed$);\n"); + } else { + printer->Print( + vars, + "public static final\n" + " com.google.protobuf.GeneratedMessageLite.GeneratedExtension<\n" + " $containing_type$,\n" + " $type$> $name$ = com.google.protobuf.GeneratedMessageLite\n" + " .newSingularGeneratedExtension(\n" + " $containing_type$.getDefaultInstance(),\n" + " $default$,\n" + " $prototype$,\n" + " $enum_map$,\n" + " $number$,\n" + " com.google.protobuf.WireFormat.FieldType.$type_constant$);\n"); + } + } +} + +void ExtensionGenerator::GenerateNonNestedInitializationCode( + io::Printer* printer) { + if (descriptor_->extension_scope() == NULL && + HasDescriptorMethods(descriptor_->file())) { + // Only applies to non-nested, non-lite extensions. + printer->Print( + "$name$.internalInit(descriptor.getExtensions().get($index$));\n", + "name", UnderscoresToCamelCase(descriptor_), + "index", SimpleItoa(descriptor_->index())); + } +} + +void ExtensionGenerator::GenerateRegistrationCode(io::Printer* printer) { + printer->Print( + "registry.add($scope$.$name$);\n", + "scope", scope_, + "name", UnderscoresToCamelCase(descriptor_)); +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h new file mode 100644 index 000000000..009ed9ffa --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h @@ -0,0 +1,77 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_EXTENSION_H__ + +#include + +#include + +namespace google { +namespace protobuf { + class FieldDescriptor; // descriptor.h + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace java { + +// Generates code for an extension, which may be within the scope of some +// message or may be at file scope. This is much simpler than FieldGenerator +// since extensions are just simple identifiers with interesting types. +class ExtensionGenerator { + public: + explicit ExtensionGenerator(const FieldDescriptor* descriptor); + ~ExtensionGenerator(); + + void Generate(io::Printer* printer); + void GenerateNonNestedInitializationCode(io::Printer* printer); + void GenerateRegistrationCode(io::Printer* printer); + + private: + const FieldDescriptor* descriptor_; + string scope_; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc new file mode 100644 index 000000000..c7d433c8e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc @@ -0,0 +1,137 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +FieldGenerator::~FieldGenerator() {} + +void FieldGenerator::GenerateParsingCodeFromPacked(io::Printer* printer) const { + // Reaching here indicates a bug. Cases are: + // - This FieldGenerator should support packing, but this method should be + // overridden. + // - This FieldGenerator doesn't support packing, and this method should + // never have been called. + GOOGLE_LOG(FATAL) << "GenerateParsingCodeFromPacked() " + << "called on field generator that does not support packing."; +} + +FieldGeneratorMap::FieldGeneratorMap(const Descriptor* descriptor) + : descriptor_(descriptor), + field_generators_( + new scoped_ptr[descriptor->field_count()]), + extension_generators_( + new scoped_ptr[descriptor->extension_count()]) { + + // Construct all the FieldGenerators and assign them bit indices for their + // bit fields. + int messageBitIndex = 0; + int builderBitIndex = 0; + for (int i = 0; i < descriptor->field_count(); i++) { + FieldGenerator* generator = MakeGenerator(descriptor->field(i), + messageBitIndex, builderBitIndex); + field_generators_[i].reset(generator); + messageBitIndex += generator->GetNumBitsForMessage(); + builderBitIndex += generator->GetNumBitsForBuilder(); + } + for (int i = 0; i < descriptor->extension_count(); i++) { + FieldGenerator* generator = MakeGenerator(descriptor->extension(i), + messageBitIndex, builderBitIndex); + extension_generators_[i].reset(generator); + messageBitIndex += generator->GetNumBitsForMessage(); + builderBitIndex += generator->GetNumBitsForBuilder(); + } +} + +FieldGenerator* FieldGeneratorMap::MakeGenerator( + const FieldDescriptor* field, int messageBitIndex, int builderBitIndex) { + if (field->is_repeated()) { + switch (GetJavaType(field)) { + case JAVATYPE_MESSAGE: + return new RepeatedMessageFieldGenerator( + field, messageBitIndex, builderBitIndex); + case JAVATYPE_ENUM: + return new RepeatedEnumFieldGenerator( + field, messageBitIndex, builderBitIndex); + case JAVATYPE_STRING: + return new RepeatedStringFieldGenerator( + field, messageBitIndex, builderBitIndex); + default: + return new RepeatedPrimitiveFieldGenerator( + field, messageBitIndex, builderBitIndex); + } + } else { + switch (GetJavaType(field)) { + case JAVATYPE_MESSAGE: + return new MessageFieldGenerator( + field, messageBitIndex, builderBitIndex); + case JAVATYPE_ENUM: + return new EnumFieldGenerator( + field, messageBitIndex, builderBitIndex); + case JAVATYPE_STRING: + return new StringFieldGenerator( + field, messageBitIndex, builderBitIndex); + default: + return new PrimitiveFieldGenerator( + field, messageBitIndex, builderBitIndex); + } + } +} + +FieldGeneratorMap::~FieldGeneratorMap() {} + +const FieldGenerator& FieldGeneratorMap::get( + const FieldDescriptor* field) const { + GOOGLE_CHECK_EQ(field->containing_type(), descriptor_); + return *field_generators_[field->index()]; +} + +const FieldGenerator& FieldGeneratorMap::get_extension(int index) const { + return *extension_generators_[index]; +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h new file mode 100644 index 000000000..6097f357c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h @@ -0,0 +1,108 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace java { + +class FieldGenerator { + public: + FieldGenerator() {} + virtual ~FieldGenerator(); + + virtual int GetNumBitsForMessage() const = 0; + virtual int GetNumBitsForBuilder() const = 0; + virtual void GenerateInterfaceMembers(io::Printer* printer) const = 0; + virtual void GenerateMembers(io::Printer* printer) const = 0; + virtual void GenerateBuilderMembers(io::Printer* printer) const = 0; + virtual void GenerateInitializationCode(io::Printer* printer) const = 0; + virtual void GenerateBuilderClearCode(io::Printer* printer) const = 0; + virtual void GenerateMergingCode(io::Printer* printer) const = 0; + virtual void GenerateBuildingCode(io::Printer* printer) const = 0; + virtual void GenerateParsingCode(io::Printer* printer) const = 0; + virtual void GenerateParsingCodeFromPacked(io::Printer* printer) const; + virtual void GenerateSerializationCode(io::Printer* printer) const = 0; + virtual void GenerateSerializedSizeCode(io::Printer* printer) const = 0; + virtual void GenerateFieldBuilderInitializationCode(io::Printer* printer) + const = 0; + + virtual void GenerateEqualsCode(io::Printer* printer) const = 0; + virtual void GenerateHashCode(io::Printer* printer) const = 0; + + virtual string GetBoxedType() const = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGenerator); +}; + +// Convenience class which constructs FieldGenerators for a Descriptor. +class FieldGeneratorMap { + public: + explicit FieldGeneratorMap(const Descriptor* descriptor); + ~FieldGeneratorMap(); + + const FieldGenerator& get(const FieldDescriptor* field) const; + const FieldGenerator& get_extension(int index) const; + + private: + const Descriptor* descriptor_; + scoped_array > field_generators_; + scoped_array > extension_generators_; + + static FieldGenerator* MakeGenerator(const FieldDescriptor* field, + int messageBitIndex, int builderBitIndex); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldGeneratorMap); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc new file mode 100644 index 000000000..8968069f4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc @@ -0,0 +1,428 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +namespace { + +// Recursively searches the given message to see if it contains any extensions. +bool UsesExtensions(const Message& message) { + const Reflection* reflection = message.GetReflection(); + + // We conservatively assume that unknown fields are extensions. + if (reflection->GetUnknownFields(message).field_count() > 0) return true; + + vector fields; + reflection->ListFields(message, &fields); + + for (int i = 0; i < fields.size(); i++) { + if (fields[i]->is_extension()) return true; + + if (GetJavaType(fields[i]) == JAVATYPE_MESSAGE) { + if (fields[i]->is_repeated()) { + int size = reflection->FieldSize(message, fields[i]); + for (int j = 0; j < size; j++) { + const Message& sub_message = + reflection->GetRepeatedMessage(message, fields[i], j); + if (UsesExtensions(sub_message)) return true; + } + } else { + const Message& sub_message = reflection->GetMessage(message, fields[i]); + if (UsesExtensions(sub_message)) return true; + } + } + } + + return false; +} + + +} // namespace + +FileGenerator::FileGenerator(const FileDescriptor* file) + : file_(file), + java_package_(FileJavaPackage(file)), + classname_(FileClassName(file)) { +} + +FileGenerator::~FileGenerator() {} + +bool FileGenerator::Validate(string* error) { + // Check that no class name matches the file's class name. This is a common + // problem that leads to Java compile errors that can be hard to understand. + // It's especially bad when using the java_multiple_files, since we would + // end up overwriting the outer class with one of the inner ones. + + bool found_conflict = false; + for (int i = 0; i < file_->enum_type_count() && !found_conflict; i++) { + if (file_->enum_type(i)->name() == classname_) { + found_conflict = true; + } + } + for (int i = 0; i < file_->message_type_count() && !found_conflict; i++) { + if (file_->message_type(i)->name() == classname_) { + found_conflict = true; + } + } + for (int i = 0; i < file_->service_count() && !found_conflict; i++) { + if (file_->service(i)->name() == classname_) { + found_conflict = true; + } + } + + if (found_conflict) { + error->assign(file_->name()); + error->append( + ": Cannot generate Java output because the file's outer class name, \""); + error->append(classname_); + error->append( + "\", matches the name of one of the types declared inside it. " + "Please either rename the type or use the java_outer_classname " + "option to specify a different outer class name for the .proto file."); + return false; + } + + return true; +} + +void FileGenerator::Generate(io::Printer* printer) { + // We don't import anything because we refer to all classes by their + // fully-qualified names in the generated source. + printer->Print( + "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" + "// source: $filename$\n" + "\n", + "filename", file_->name()); + if (!java_package_.empty()) { + printer->Print( + "package $package$;\n" + "\n", + "package", java_package_); + } + printer->Print( + "public final class $classname$ {\n" + " private $classname$() {}\n", + "classname", classname_); + printer->Indent(); + + // ----------------------------------------------------------------- + + printer->Print( + "public static void registerAllExtensions(\n" + " com.google.protobuf.ExtensionRegistry$lite$ registry) {\n", + "lite", HasDescriptorMethods(file_) ? "" : "Lite"); + + printer->Indent(); + + for (int i = 0; i < file_->extension_count(); i++) { + ExtensionGenerator(file_->extension(i)).GenerateRegistrationCode(printer); + } + + for (int i = 0; i < file_->message_type_count(); i++) { + MessageGenerator(file_->message_type(i)) + .GenerateExtensionRegistrationCode(printer); + } + + printer->Outdent(); + printer->Print( + "}\n"); + + // ----------------------------------------------------------------- + + if (!file_->options().java_multiple_files()) { + for (int i = 0; i < file_->enum_type_count(); i++) { + EnumGenerator(file_->enum_type(i)).Generate(printer); + } + for (int i = 0; i < file_->message_type_count(); i++) { + MessageGenerator messageGenerator(file_->message_type(i)); + messageGenerator.GenerateInterface(printer); + messageGenerator.Generate(printer); + } + if (HasGenericServices(file_)) { + for (int i = 0; i < file_->service_count(); i++) { + ServiceGenerator(file_->service(i)).Generate(printer); + } + } + } + + // Extensions must be generated in the outer class since they are values, + // not classes. + for (int i = 0; i < file_->extension_count(); i++) { + ExtensionGenerator(file_->extension(i)).Generate(printer); + } + + // Static variables. + for (int i = 0; i < file_->message_type_count(); i++) { + // TODO(kenton): Reuse MessageGenerator objects? + MessageGenerator(file_->message_type(i)).GenerateStaticVariables(printer); + } + + printer->Print("\n"); + + if (HasDescriptorMethods(file_)) { + GenerateEmbeddedDescriptor(printer); + } else { + printer->Print( + "static {\n"); + printer->Indent(); + + for (int i = 0; i < file_->message_type_count(); i++) { + // TODO(kenton): Reuse MessageGenerator objects? + MessageGenerator(file_->message_type(i)) + .GenerateStaticVariableInitializers(printer); + } + + printer->Outdent(); + printer->Print( + "}\n"); + } + + printer->Print( + "\n" + "// @@protoc_insertion_point(outer_class_scope)\n"); + + printer->Outdent(); + printer->Print("}\n"); +} + +void FileGenerator::GenerateEmbeddedDescriptor(io::Printer* printer) { + // Embed the descriptor. We simply serialize the entire FileDescriptorProto + // and embed it as a string literal, which is parsed and built into real + // descriptors at initialization time. We unfortunately have to put it in + // a string literal, not a byte array, because apparently using a literal + // byte array causes the Java compiler to generate *instructions* to + // initialize each and every byte of the array, e.g. as if you typed: + // b[0] = 123; b[1] = 456; b[2] = 789; + // This makes huge bytecode files and can easily hit the compiler's internal + // code size limits (error "code to large"). String literals are apparently + // embedded raw, which is what we want. + FileDescriptorProto file_proto; + file_->CopyTo(&file_proto); + + string file_data; + file_proto.SerializeToString(&file_data); + + printer->Print( + "public static com.google.protobuf.Descriptors.FileDescriptor\n" + " getDescriptor() {\n" + " return descriptor;\n" + "}\n" + "private static com.google.protobuf.Descriptors.FileDescriptor\n" + " descriptor;\n" + "static {\n" + " java.lang.String[] descriptorData = {\n"); + printer->Indent(); + printer->Indent(); + + // Only write 40 bytes per line. + static const int kBytesPerLine = 40; + for (int i = 0; i < file_data.size(); i += kBytesPerLine) { + if (i > 0) { + // Every 400 lines, start a new string literal, in order to avoid the + // 64k length limit. + if (i % 400 == 0) { + printer->Print(",\n"); + } else { + printer->Print(" +\n"); + } + } + printer->Print("\"$data$\"", + "data", CEscape(file_data.substr(i, kBytesPerLine))); + } + + printer->Outdent(); + printer->Print("\n};\n"); + + // ----------------------------------------------------------------- + // Create the InternalDescriptorAssigner. + + printer->Print( + "com.google.protobuf.Descriptors.FileDescriptor." + "InternalDescriptorAssigner assigner =\n" + " new com.google.protobuf.Descriptors.FileDescriptor." + "InternalDescriptorAssigner() {\n" + " public com.google.protobuf.ExtensionRegistry assignDescriptors(\n" + " com.google.protobuf.Descriptors.FileDescriptor root) {\n" + " descriptor = root;\n"); + + printer->Indent(); + printer->Indent(); + printer->Indent(); + + for (int i = 0; i < file_->message_type_count(); i++) { + // TODO(kenton): Reuse MessageGenerator objects? + MessageGenerator(file_->message_type(i)) + .GenerateStaticVariableInitializers(printer); + } + for (int i = 0; i < file_->extension_count(); i++) { + // TODO(kenton): Reuse ExtensionGenerator objects? + ExtensionGenerator(file_->extension(i)) + .GenerateNonNestedInitializationCode(printer); + } + + if (UsesExtensions(file_proto)) { + // Must construct an ExtensionRegistry containing all possible extensions + // and return it. + printer->Print( + "com.google.protobuf.ExtensionRegistry registry =\n" + " com.google.protobuf.ExtensionRegistry.newInstance();\n" + "registerAllExtensions(registry);\n"); + for (int i = 0; i < file_->dependency_count(); i++) { + if (ShouldIncludeDependency(file_->dependency(i))) { + printer->Print( + "$dependency$.registerAllExtensions(registry);\n", + "dependency", ClassName(file_->dependency(i))); + } + } + printer->Print( + "return registry;\n"); + } else { + printer->Print( + "return null;\n"); + } + + printer->Outdent(); + printer->Outdent(); + printer->Outdent(); + + printer->Print( + " }\n" + " };\n"); + + // ----------------------------------------------------------------- + // Invoke internalBuildGeneratedFileFrom() to build the file. + + printer->Print( + "com.google.protobuf.Descriptors.FileDescriptor\n" + " .internalBuildGeneratedFileFrom(descriptorData,\n" + " new com.google.protobuf.Descriptors.FileDescriptor[] {\n"); + + for (int i = 0; i < file_->dependency_count(); i++) { + if (ShouldIncludeDependency(file_->dependency(i))) { + printer->Print( + " $dependency$.getDescriptor(),\n", + "dependency", ClassName(file_->dependency(i))); + } + } + + printer->Print( + " }, assigner);\n"); + + printer->Outdent(); + printer->Print( + "}\n"); +} + +template +static void GenerateSibling(const string& package_dir, + const string& java_package, + const DescriptorClass* descriptor, + GeneratorContext* context, + vector* file_list, + const string& name_suffix, + void (GeneratorClass::*pfn)(io::Printer* printer)) { + string filename = package_dir + descriptor->name() + name_suffix + ".java"; + file_list->push_back(filename); + + scoped_ptr output(context->Open(filename)); + io::Printer printer(output.get(), '$'); + + printer.Print( + "// Generated by the protocol buffer compiler. DO NOT EDIT!\n" + "\n"); + if (!java_package.empty()) { + printer.Print( + "package $package$;\n" + "\n", + "package", java_package); + } + + GeneratorClass generator(descriptor); + (generator.*pfn)(&printer); +} + +void FileGenerator::GenerateSiblings(const string& package_dir, + GeneratorContext* context, + vector* file_list) { + if (file_->options().java_multiple_files()) { + for (int i = 0; i < file_->enum_type_count(); i++) { + GenerateSibling(package_dir, java_package_, + file_->enum_type(i), + context, file_list, "", + &EnumGenerator::Generate); + } + for (int i = 0; i < file_->message_type_count(); i++) { + GenerateSibling(package_dir, java_package_, + file_->message_type(i), + context, file_list, "OrBuilder", + &MessageGenerator::GenerateInterface); + GenerateSibling(package_dir, java_package_, + file_->message_type(i), + context, file_list, "", + &MessageGenerator::Generate); + } + if (HasGenericServices(file_)) { + for (int i = 0; i < file_->service_count(); i++) { + GenerateSibling(package_dir, java_package_, + file_->service(i), + context, file_list, "", + &ServiceGenerator::Generate); + } + } + } +} + +bool FileGenerator::ShouldIncludeDependency(const FileDescriptor* descriptor) { + return true; +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h new file mode 100644 index 000000000..599114626 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h @@ -0,0 +1,101 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + class FileDescriptor; // descriptor.h + namespace io { + class Printer; // printer.h + } + namespace compiler { + class GeneratorContext; // code_generator.h + } +} + +namespace protobuf { +namespace compiler { +namespace java { + +class FileGenerator { + public: + explicit FileGenerator(const FileDescriptor* file); + ~FileGenerator(); + + // Checks for problems that would otherwise lead to cryptic compile errors. + // Returns true if there are no problems, or writes an error description to + // the given string and returns false otherwise. + bool Validate(string* error); + + void Generate(io::Printer* printer); + + // If we aren't putting everything into one file, this will write all the + // files other than the outer file (i.e. one for each message, enum, and + // service type). + void GenerateSiblings(const string& package_dir, + GeneratorContext* generator_context, + vector* file_list); + + const string& java_package() { return java_package_; } + const string& classname() { return classname_; } + + + private: + // Returns whether the dependency should be included in the output file. + // Always returns true for opensource, but used internally at Google to help + // improve compatibility with version 1 of protocol buffers. + bool ShouldIncludeDependency(const FileDescriptor* descriptor); + + const FileDescriptor* file_; + string java_package_; + string classname_; + + + void GenerateEmbeddedDescriptor(io::Printer* printer); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_FILE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc new file mode 100644 index 000000000..e6c79abcd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc @@ -0,0 +1,128 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + + +JavaGenerator::JavaGenerator() {} +JavaGenerator::~JavaGenerator() {} + +bool JavaGenerator::Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const { + // ----------------------------------------------------------------- + // parse generator options + + // Name a file where we will write a list of generated file names, one + // per line. + string output_list_file; + + + vector > options; + ParseGeneratorParameter(parameter, &options); + + for (int i = 0; i < options.size(); i++) { + if (options[i].first == "output_list_file") { + output_list_file = options[i].second; + } else { + *error = "Unknown generator option: " + options[i].first; + return false; + } + } + + // ----------------------------------------------------------------- + + + if (file->options().optimize_for() == FileOptions::LITE_RUNTIME && + file->options().java_generate_equals_and_hash()) { + *error = "The \"java_generate_equals_and_hash\" option is incompatible " + "with \"optimize_for = LITE_RUNTIME\". You must optimize for " + "SPEED or CODE_SIZE if you want to use this option."; + return false; + } + + FileGenerator file_generator(file); + if (!file_generator.Validate(error)) { + return false; + } + + string package_dir = JavaPackageToDir(file_generator.java_package()); + + vector all_files; + + string java_filename = package_dir; + java_filename += file_generator.classname(); + java_filename += ".java"; + all_files.push_back(java_filename); + + // Generate main java file. + scoped_ptr output( + context->Open(java_filename)); + io::Printer printer(output.get(), '$'); + file_generator.Generate(&printer); + + // Generate sibling files. + file_generator.GenerateSiblings(package_dir, context, &all_files); + + // Generate output list if requested. + if (!output_list_file.empty()) { + // Generate output list. This is just a simple text file placed in a + // deterministic location which lists the .java files being generated. + scoped_ptr srclist_raw_output( + context->Open(output_list_file)); + io::Printer srclist_printer(srclist_raw_output.get(), '$'); + for (int i = 0; i < all_files.size(); i++) { + srclist_printer.Print("$filename$\n", "filename", all_files[i]); + } + } + + return true; +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h new file mode 100644 index 000000000..888b8d85e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h @@ -0,0 +1,72 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Generates Java code for a given .proto file. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__ + +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +// CodeGenerator implementation which generates Java code. If you create your +// own protocol compiler binary and you want it to support Java output, you +// can do so by registering an instance of this CodeGenerator with the +// CommandLineInterface in your main() function. +class LIBPROTOC_EXPORT JavaGenerator : public CodeGenerator { + public: + JavaGenerator(); + ~JavaGenerator(); + + // implements CodeGenerator ---------------------------------------- + bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(JavaGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_GENERATOR_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc new file mode 100644 index 000000000..1b6f16531 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc @@ -0,0 +1,478 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +const char kThickSeparator[] = + "// ===================================================================\n"; +const char kThinSeparator[] = + "// -------------------------------------------------------------------\n"; + +namespace { + +const char* kDefaultPackage = ""; + +const string& FieldName(const FieldDescriptor* field) { + // Groups are hacky: The name of the field is just the lower-cased name + // of the group type. In Java, though, we would like to retain the original + // capitalization of the type name. + if (GetType(field) == FieldDescriptor::TYPE_GROUP) { + return field->message_type()->name(); + } else { + return field->name(); + } +} + +string UnderscoresToCamelCaseImpl(const string& input, bool cap_next_letter) { + string result; + // Note: I distrust ctype.h due to locales. + for (int i = 0; i < input.size(); i++) { + if ('a' <= input[i] && input[i] <= 'z') { + if (cap_next_letter) { + result += input[i] + ('A' - 'a'); + } else { + result += input[i]; + } + cap_next_letter = false; + } else if ('A' <= input[i] && input[i] <= 'Z') { + if (i == 0 && !cap_next_letter) { + // Force first letter to lower-case unless explicitly told to + // capitalize it. + result += input[i] + ('a' - 'A'); + } else { + // Capital letters after the first are left as-is. + result += input[i]; + } + cap_next_letter = false; + } else if ('0' <= input[i] && input[i] <= '9') { + result += input[i]; + cap_next_letter = true; + } else { + cap_next_letter = true; + } + } + return result; +} + +} // namespace + +string UnderscoresToCamelCase(const FieldDescriptor* field) { + return UnderscoresToCamelCaseImpl(FieldName(field), false); +} + +string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) { + return UnderscoresToCamelCaseImpl(FieldName(field), true); +} + +string UnderscoresToCamelCase(const MethodDescriptor* method) { + return UnderscoresToCamelCaseImpl(method->name(), false); +} + +string StripProto(const string& filename) { + if (HasSuffixString(filename, ".protodevel")) { + return StripSuffixString(filename, ".protodevel"); + } else { + return StripSuffixString(filename, ".proto"); + } +} + +string FileClassName(const FileDescriptor* file) { + if (file->options().has_java_outer_classname()) { + return file->options().java_outer_classname(); + } else { + string basename; + string::size_type last_slash = file->name().find_last_of('/'); + if (last_slash == string::npos) { + basename = file->name(); + } else { + basename = file->name().substr(last_slash + 1); + } + return UnderscoresToCamelCaseImpl(StripProto(basename), true); + } +} + +string FileJavaPackage(const FileDescriptor* file) { + string result; + + if (file->options().has_java_package()) { + result = file->options().java_package(); + } else { + result = kDefaultPackage; + if (!file->package().empty()) { + if (!result.empty()) result += '.'; + result += file->package(); + } + } + + + return result; +} + +string JavaPackageToDir(string package_name) { + string package_dir = + StringReplace(package_name, ".", "/", true); + if (!package_dir.empty()) package_dir += "/"; + return package_dir; +} + +string ToJavaName(const string& full_name, const FileDescriptor* file) { + string result; + if (file->options().java_multiple_files()) { + result = FileJavaPackage(file); + } else { + result = ClassName(file); + } + if (!result.empty()) { + result += '.'; + } + if (file->package().empty()) { + result += full_name; + } else { + // Strip the proto package from full_name since we've replaced it with + // the Java package. + result += full_name.substr(file->package().size() + 1); + } + return result; +} + +string ClassName(const FileDescriptor* descriptor) { + string result = FileJavaPackage(descriptor); + if (!result.empty()) result += '.'; + result += FileClassName(descriptor); + return result; +} + +string FieldConstantName(const FieldDescriptor *field) { + string name = field->name() + "_FIELD_NUMBER"; + UpperString(&name); + return name; +} + +FieldDescriptor::Type GetType(const FieldDescriptor* field) { + return field->type(); +} + +JavaType GetJavaType(const FieldDescriptor* field) { + switch (GetType(field)) { + case FieldDescriptor::TYPE_INT32: + case FieldDescriptor::TYPE_UINT32: + case FieldDescriptor::TYPE_SINT32: + case FieldDescriptor::TYPE_FIXED32: + case FieldDescriptor::TYPE_SFIXED32: + return JAVATYPE_INT; + + case FieldDescriptor::TYPE_INT64: + case FieldDescriptor::TYPE_UINT64: + case FieldDescriptor::TYPE_SINT64: + case FieldDescriptor::TYPE_FIXED64: + case FieldDescriptor::TYPE_SFIXED64: + return JAVATYPE_LONG; + + case FieldDescriptor::TYPE_FLOAT: + return JAVATYPE_FLOAT; + + case FieldDescriptor::TYPE_DOUBLE: + return JAVATYPE_DOUBLE; + + case FieldDescriptor::TYPE_BOOL: + return JAVATYPE_BOOLEAN; + + case FieldDescriptor::TYPE_STRING: + return JAVATYPE_STRING; + + case FieldDescriptor::TYPE_BYTES: + return JAVATYPE_BYTES; + + case FieldDescriptor::TYPE_ENUM: + return JAVATYPE_ENUM; + + case FieldDescriptor::TYPE_GROUP: + case FieldDescriptor::TYPE_MESSAGE: + return JAVATYPE_MESSAGE; + + // No default because we want the compiler to complain if any new + // types are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return JAVATYPE_INT; +} + +const char* BoxedPrimitiveTypeName(JavaType type) { + switch (type) { + case JAVATYPE_INT : return "java.lang.Integer"; + case JAVATYPE_LONG : return "java.lang.Long"; + case JAVATYPE_FLOAT : return "java.lang.Float"; + case JAVATYPE_DOUBLE : return "java.lang.Double"; + case JAVATYPE_BOOLEAN: return "java.lang.Boolean"; + case JAVATYPE_STRING : return "java.lang.String"; + case JAVATYPE_BYTES : return "com.google.protobuf.ByteString"; + case JAVATYPE_ENUM : return NULL; + case JAVATYPE_MESSAGE: return NULL; + + // No default because we want the compiler to complain if any new + // JavaTypes are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return NULL; +} + +bool AllAscii(const string& text) { + for (int i = 0; i < text.size(); i++) { + if ((text[i] & 0x80) != 0) { + return false; + } + } + return true; +} + +string DefaultValue(const FieldDescriptor* field) { + // Switch on CppType since we need to know which default_value_* method + // of FieldDescriptor to call. + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + return SimpleItoa(field->default_value_int32()); + case FieldDescriptor::CPPTYPE_UINT32: + // Need to print as a signed int since Java has no unsigned. + return SimpleItoa(static_cast(field->default_value_uint32())); + case FieldDescriptor::CPPTYPE_INT64: + return SimpleItoa(field->default_value_int64()) + "L"; + case FieldDescriptor::CPPTYPE_UINT64: + return SimpleItoa(static_cast(field->default_value_uint64())) + + "L"; + case FieldDescriptor::CPPTYPE_DOUBLE: { + double value = field->default_value_double(); + if (value == numeric_limits::infinity()) { + return "Double.POSITIVE_INFINITY"; + } else if (value == -numeric_limits::infinity()) { + return "Double.NEGATIVE_INFINITY"; + } else if (value != value) { + return "Double.NaN"; + } else { + return SimpleDtoa(value) + "D"; + } + } + case FieldDescriptor::CPPTYPE_FLOAT: { + float value = field->default_value_float(); + if (value == numeric_limits::infinity()) { + return "Float.POSITIVE_INFINITY"; + } else if (value == -numeric_limits::infinity()) { + return "Float.NEGATIVE_INFINITY"; + } else if (value != value) { + return "Float.NaN"; + } else { + return SimpleFtoa(value) + "F"; + } + } + case FieldDescriptor::CPPTYPE_BOOL: + return field->default_value_bool() ? "true" : "false"; + case FieldDescriptor::CPPTYPE_STRING: + if (GetType(field) == FieldDescriptor::TYPE_BYTES) { + if (field->has_default_value()) { + // See comments in Internal.java for gory details. + return strings::Substitute( + "com.google.protobuf.Internal.bytesDefaultValue(\"$0\")", + CEscape(field->default_value_string())); + } else { + return "com.google.protobuf.ByteString.EMPTY"; + } + } else { + if (AllAscii(field->default_value_string())) { + // All chars are ASCII. In this case CEscape() works fine. + return "\"" + CEscape(field->default_value_string()) + "\""; + } else { + // See comments in Internal.java for gory details. + return strings::Substitute( + "com.google.protobuf.Internal.stringDefaultValue(\"$0\")", + CEscape(field->default_value_string())); + } + } + + case FieldDescriptor::CPPTYPE_ENUM: + return ClassName(field->enum_type()) + "." + + field->default_value_enum()->name(); + + case FieldDescriptor::CPPTYPE_MESSAGE: + return ClassName(field->message_type()) + ".getDefaultInstance()"; + + // No default because we want the compiler to complain if any new + // types are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return ""; +} + +bool IsDefaultValueJavaDefault(const FieldDescriptor* field) { + // Switch on CppType since we need to know which default_value_* method + // of FieldDescriptor to call. + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + return field->default_value_int32() == 0; + case FieldDescriptor::CPPTYPE_UINT32: + return field->default_value_uint32() == 0; + case FieldDescriptor::CPPTYPE_INT64: + return field->default_value_int64() == 0L; + case FieldDescriptor::CPPTYPE_UINT64: + return field->default_value_uint64() == 0L; + case FieldDescriptor::CPPTYPE_DOUBLE: + return field->default_value_double() == 0.0; + case FieldDescriptor::CPPTYPE_FLOAT: + return field->default_value_float() == 0.0; + case FieldDescriptor::CPPTYPE_BOOL: + return field->default_value_bool() == false; + + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_ENUM: + case FieldDescriptor::CPPTYPE_MESSAGE: + return false; + + // No default because we want the compiler to complain if any new + // types are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return false; +} + +const char* bit_masks[] = { + "0x00000001", + "0x00000002", + "0x00000004", + "0x00000008", + "0x00000010", + "0x00000020", + "0x00000040", + "0x00000080", + + "0x00000100", + "0x00000200", + "0x00000400", + "0x00000800", + "0x00001000", + "0x00002000", + "0x00004000", + "0x00008000", + + "0x00010000", + "0x00020000", + "0x00040000", + "0x00080000", + "0x00100000", + "0x00200000", + "0x00400000", + "0x00800000", + + "0x01000000", + "0x02000000", + "0x04000000", + "0x08000000", + "0x10000000", + "0x20000000", + "0x40000000", + "0x80000000", +}; + +string GetBitFieldName(int index) { + string varName = "bitField"; + varName += SimpleItoa(index); + varName += "_"; + return varName; +} + +string GetBitFieldNameForBit(int bitIndex) { + return GetBitFieldName(bitIndex / 32); +} + +string GenerateGetBit(int bitIndex) { + string varName = GetBitFieldNameForBit(bitIndex); + int bitInVarIndex = bitIndex % 32; + + string mask = bit_masks[bitInVarIndex]; + string result = "((" + varName + " & " + mask + ") == " + mask + ")"; + return result; +} + +string GenerateSetBit(int bitIndex) { + string varName = GetBitFieldNameForBit(bitIndex); + int bitInVarIndex = bitIndex % 32; + + string mask = bit_masks[bitInVarIndex]; + string result = varName + " |= " + mask; + return result; +} + +string GenerateClearBit(int bitIndex) { + string varName = GetBitFieldNameForBit(bitIndex); + int bitInVarIndex = bitIndex % 32; + + string mask = bit_masks[bitInVarIndex]; + string result = varName + " = (" + varName + " & ~" + mask + ")"; + return result; +} + +string GenerateGetBitFromLocal(int bitIndex) { + string varName = "from_" + GetBitFieldNameForBit(bitIndex); + int bitInVarIndex = bitIndex % 32; + + string mask = bit_masks[bitInVarIndex]; + string result = "((" + varName + " & " + mask + ") == " + mask + ")"; + return result; +} + +string GenerateSetBitToLocal(int bitIndex) { + string varName = "to_" + GetBitFieldNameForBit(bitIndex); + int bitInVarIndex = bitIndex % 32; + + string mask = bit_masks[bitInVarIndex]; + string result = varName + " |= " + mask; + return result; +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h new file mode 100644 index 000000000..4ae07f150 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h @@ -0,0 +1,213 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +// Commonly-used separator comments. Thick is a line of '=', thin is a line +// of '-'. +extern const char kThickSeparator[]; +extern const char kThinSeparator[]; + +// Converts the field's name to camel-case, e.g. "foo_bar_baz" becomes +// "fooBarBaz" or "FooBarBaz", respectively. +string UnderscoresToCamelCase(const FieldDescriptor* field); +string UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field); + +// Similar, but for method names. (Typically, this merely has the effect +// of lower-casing the first letter of the name.) +string UnderscoresToCamelCase(const MethodDescriptor* method); + +// Strips ".proto" or ".protodevel" from the end of a filename. +string StripProto(const string& filename); + +// Gets the unqualified class name for the file. Each .proto file becomes a +// single Java class, with all its contents nested in that class. +string FileClassName(const FileDescriptor* file); + +// Returns the file's Java package name. +string FileJavaPackage(const FileDescriptor* file); + +// Returns output directory for the given package name. +string JavaPackageToDir(string package_name); + +// Converts the given fully-qualified name in the proto namespace to its +// fully-qualified name in the Java namespace, given that it is in the given +// file. +string ToJavaName(const string& full_name, const FileDescriptor* file); + +// These return the fully-qualified class name corresponding to the given +// descriptor. +inline string ClassName(const Descriptor* descriptor) { + return ToJavaName(descriptor->full_name(), descriptor->file()); +} +inline string ClassName(const EnumDescriptor* descriptor) { + return ToJavaName(descriptor->full_name(), descriptor->file()); +} +inline string ClassName(const ServiceDescriptor* descriptor) { + return ToJavaName(descriptor->full_name(), descriptor->file()); +} +inline string ExtensionIdentifierName(const FieldDescriptor* descriptor) { + return ToJavaName(descriptor->full_name(), descriptor->file()); +} +string ClassName(const FileDescriptor* descriptor); + +// Get the unqualified name that should be used for a field's field +// number constant. +string FieldConstantName(const FieldDescriptor *field); + +// Returns the type of the FieldDescriptor. +// This does nothing interesting for the open source release, but is used for +// hacks that improve compatability with version 1 protocol buffers at Google. +FieldDescriptor::Type GetType(const FieldDescriptor* field); + +enum JavaType { + JAVATYPE_INT, + JAVATYPE_LONG, + JAVATYPE_FLOAT, + JAVATYPE_DOUBLE, + JAVATYPE_BOOLEAN, + JAVATYPE_STRING, + JAVATYPE_BYTES, + JAVATYPE_ENUM, + JAVATYPE_MESSAGE +}; + +JavaType GetJavaType(const FieldDescriptor* field); + +// Get the fully-qualified class name for a boxed primitive type, e.g. +// "java.lang.Integer" for JAVATYPE_INT. Returns NULL for enum and message +// types. +const char* BoxedPrimitiveTypeName(JavaType type); + +string DefaultValue(const FieldDescriptor* field); +bool IsDefaultValueJavaDefault(const FieldDescriptor* field); + +// Does this message class keep track of unknown fields? +inline bool HasUnknownFields(const Descriptor* descriptor) { + return descriptor->file()->options().optimize_for() != + FileOptions::LITE_RUNTIME; +} + +// Does this message class have generated parsing, serialization, and other +// standard methods for which reflection-based fallback implementations exist? +inline bool HasGeneratedMethods(const Descriptor* descriptor) { + return descriptor->file()->options().optimize_for() != + FileOptions::CODE_SIZE; +} + +// Does this message have specialized equals() and hashCode() methods? +inline bool HasEqualsAndHashCode(const Descriptor* descriptor) { + return descriptor->file()->options().java_generate_equals_and_hash(); +} + +// Does this message class have descriptor and reflection methods? +inline bool HasDescriptorMethods(const Descriptor* descriptor) { + return descriptor->file()->options().optimize_for() != + FileOptions::LITE_RUNTIME; +} +inline bool HasDescriptorMethods(const EnumDescriptor* descriptor) { + return descriptor->file()->options().optimize_for() != + FileOptions::LITE_RUNTIME; +} +inline bool HasDescriptorMethods(const FileDescriptor* descriptor) { + return descriptor->options().optimize_for() != + FileOptions::LITE_RUNTIME; +} + +inline bool HasNestedBuilders(const Descriptor* descriptor) { + // The proto-lite version doesn't support nested builders. + return descriptor->file()->options().optimize_for() != + FileOptions::LITE_RUNTIME; +} + +// Should we generate generic services for this file? +inline bool HasGenericServices(const FileDescriptor *file) { + return file->service_count() > 0 && + file->options().optimize_for() != FileOptions::LITE_RUNTIME && + file->options().java_generic_services(); +} + + +// Methods for shared bitfields. + +// Gets the name of the shared bitfield for the given index. +string GetBitFieldName(int index); + +// Gets the name of the shared bitfield for the given bit index. +// Effectively, GetBitFieldName(bitIndex / 32) +string GetBitFieldNameForBit(int bitIndex); + +// Generates the java code for the expression that returns the boolean value +// of the bit of the shared bitfields for the given bit index. +// Example: "((bitField1_ & 0x04) == 0x04)" +string GenerateGetBit(int bitIndex); + +// Generates the java code for the expression that sets the bit of the shared +// bitfields for the given bit index. +// Example: "bitField1_ = (bitField1_ | 0x04)" +string GenerateSetBit(int bitIndex); + +// Generates the java code for the expression that clears the bit of the shared +// bitfields for the given bit index. +// Example: "bitField1_ = (bitField1_ & ~0x04)" +string GenerateClearBit(int bitIndex); + +// Does the same as GenerateGetBit but operates on the bit field on a local +// variable. This is used by the builder to copy the value in the builder to +// the message. +// Example: "((from_bitField1_ & 0x04) == 0x04)" +string GenerateGetBitFromLocal(int bitIndex); + +// Does the same as GenerateSetBit but operates on the bit field on a local +// variable. This is used by the builder to copy the value in the builder to +// the message. +// Example: "to_bitField1_ = (to_bitField1_ | 0x04)" +string GenerateSetBitToLocal(int bitIndex); + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc new file mode 100644 index 000000000..4c087db54 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc @@ -0,0 +1,1287 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +using internal::WireFormat; +using internal::WireFormatLite; + +namespace { + +void PrintFieldComment(io::Printer* printer, const FieldDescriptor* field) { + // Print the field's proto-syntax definition as a comment. We don't want to + // print group bodies so we cut off after the first line. + string def = field->DebugString(); + printer->Print("// $def$\n", + "def", def.substr(0, def.find_first_of('\n'))); +} + +struct FieldOrderingByNumber { + inline bool operator()(const FieldDescriptor* a, + const FieldDescriptor* b) const { + return a->number() < b->number(); + } +}; + +struct ExtensionRangeOrdering { + bool operator()(const Descriptor::ExtensionRange* a, + const Descriptor::ExtensionRange* b) const { + return a->start < b->start; + } +}; + +// Sort the fields of the given Descriptor by number into a new[]'d array +// and return it. +const FieldDescriptor** SortFieldsByNumber(const Descriptor* descriptor) { + const FieldDescriptor** fields = + new const FieldDescriptor*[descriptor->field_count()]; + for (int i = 0; i < descriptor->field_count(); i++) { + fields[i] = descriptor->field(i); + } + sort(fields, fields + descriptor->field_count(), + FieldOrderingByNumber()); + return fields; +} + +// Get an identifier that uniquely identifies this type within the file. +// This is used to declare static variables related to this type at the +// outermost file scope. +string UniqueFileScopeIdentifier(const Descriptor* descriptor) { + return "static_" + StringReplace(descriptor->full_name(), ".", "_", true); +} + +// Returns true if the message type has any required fields. If it doesn't, +// we can optimize out calls to its isInitialized() method. +// +// already_seen is used to avoid checking the same type multiple times +// (and also to protect against recursion). +static bool HasRequiredFields( + const Descriptor* type, + hash_set* already_seen) { + if (already_seen->count(type) > 0) { + // The type is already in cache. This means that either: + // a. The type has no required fields. + // b. We are in the midst of checking if the type has required fields, + // somewhere up the stack. In this case, we know that if the type + // has any required fields, they'll be found when we return to it, + // and the whole call to HasRequiredFields() will return true. + // Therefore, we don't have to check if this type has required fields + // here. + return false; + } + already_seen->insert(type); + + // If the type has extensions, an extension with message type could contain + // required fields, so we have to be conservative and assume such an + // extension exists. + if (type->extension_range_count() > 0) return true; + + for (int i = 0; i < type->field_count(); i++) { + const FieldDescriptor* field = type->field(i); + if (field->is_required()) { + return true; + } + if (GetJavaType(field) == JAVATYPE_MESSAGE) { + if (HasRequiredFields(field->message_type(), already_seen)) { + return true; + } + } + } + + return false; +} + +static bool HasRequiredFields(const Descriptor* type) { + hash_set already_seen; + return HasRequiredFields(type, &already_seen); +} + +} // namespace + +// =================================================================== + +MessageGenerator::MessageGenerator(const Descriptor* descriptor) + : descriptor_(descriptor), + field_generators_(descriptor) { +} + +MessageGenerator::~MessageGenerator() {} + +void MessageGenerator::GenerateStaticVariables(io::Printer* printer) { + if (HasDescriptorMethods(descriptor_)) { + // Because descriptor.proto (com.google.protobuf.DescriptorProtos) is + // used in the construction of descriptors, we have a tricky bootstrapping + // problem. To help control static initialization order, we make sure all + // descriptors and other static data that depends on them are members of + // the outermost class in the file. This way, they will be initialized in + // a deterministic order. + + map vars; + vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); + vars["index"] = SimpleItoa(descriptor_->index()); + vars["classname"] = ClassName(descriptor_); + if (descriptor_->containing_type() != NULL) { + vars["parent"] = UniqueFileScopeIdentifier( + descriptor_->containing_type()); + } + if (descriptor_->file()->options().java_multiple_files()) { + // We can only make these package-private since the classes that use them + // are in separate files. + vars["private"] = ""; + } else { + vars["private"] = "private "; + } + + // The descriptor for this type. + printer->Print(vars, + "$private$static com.google.protobuf.Descriptors.Descriptor\n" + " internal_$identifier$_descriptor;\n"); + + // And the FieldAccessorTable. + printer->Print(vars, + "$private$static\n" + " com.google.protobuf.GeneratedMessage.FieldAccessorTable\n" + " internal_$identifier$_fieldAccessorTable;\n"); + } + + // Generate static members for all nested types. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + // TODO(kenton): Reuse MessageGenerator objects? + MessageGenerator(descriptor_->nested_type(i)) + .GenerateStaticVariables(printer); + } +} + +void MessageGenerator::GenerateStaticVariableInitializers( + io::Printer* printer) { + if (HasDescriptorMethods(descriptor_)) { + map vars; + vars["identifier"] = UniqueFileScopeIdentifier(descriptor_); + vars["index"] = SimpleItoa(descriptor_->index()); + vars["classname"] = ClassName(descriptor_); + if (descriptor_->containing_type() != NULL) { + vars["parent"] = UniqueFileScopeIdentifier( + descriptor_->containing_type()); + } + + // The descriptor for this type. + if (descriptor_->containing_type() == NULL) { + printer->Print(vars, + "internal_$identifier$_descriptor =\n" + " getDescriptor().getMessageTypes().get($index$);\n"); + } else { + printer->Print(vars, + "internal_$identifier$_descriptor =\n" + " internal_$parent$_descriptor.getNestedTypes().get($index$);\n"); + } + + // And the FieldAccessorTable. + printer->Print(vars, + "internal_$identifier$_fieldAccessorTable = new\n" + " com.google.protobuf.GeneratedMessage.FieldAccessorTable(\n" + " internal_$identifier$_descriptor,\n" + " new java.lang.String[] { "); + for (int i = 0; i < descriptor_->field_count(); i++) { + printer->Print( + "\"$field_name$\", ", + "field_name", + UnderscoresToCapitalizedCamelCase(descriptor_->field(i))); + } + printer->Print("},\n" + " $classname$.class,\n" + " $classname$.Builder.class);\n", + "classname", ClassName(descriptor_)); + } + + // Generate static member initializers for all nested types. + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + // TODO(kenton): Reuse MessageGenerator objects? + MessageGenerator(descriptor_->nested_type(i)) + .GenerateStaticVariableInitializers(printer); + } +} + +// =================================================================== + +void MessageGenerator::GenerateInterface(io::Printer* printer) { + + if (descriptor_->extension_range_count() > 0) { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public interface $classname$OrBuilder extends\n" + " com.google.protobuf.GeneratedMessage.\n" + " ExtendableMessageOrBuilder<$classname$> {\n", + "classname", descriptor_->name()); + } else { + printer->Print( + "public interface $classname$OrBuilder extends \n" + " com.google.protobuf.GeneratedMessageLite.\n" + " ExtendableMessageOrBuilder<$classname$> {\n", + "classname", descriptor_->name()); + } + } else { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public interface $classname$OrBuilder\n" + " extends com.google.protobuf.MessageOrBuilder {\n", + "classname", descriptor_->name()); + } else { + printer->Print( + "public interface $classname$OrBuilder\n" + " extends com.google.protobuf.MessageLiteOrBuilder {\n", + "classname", descriptor_->name()); + } + } + + printer->Indent(); + for (int i = 0; i < descriptor_->field_count(); i++) { + printer->Print("\n"); + PrintFieldComment(printer, descriptor_->field(i)); + field_generators_.get(descriptor_->field(i)) + .GenerateInterfaceMembers(printer); + } + printer->Outdent(); + + printer->Print("}\n"); +} + +// =================================================================== + +void MessageGenerator::Generate(io::Printer* printer) { + bool is_own_file = + descriptor_->containing_type() == NULL && + descriptor_->file()->options().java_multiple_files(); + + if (descriptor_->extension_range_count() > 0) { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public $static$ final class $classname$ extends\n" + " com.google.protobuf.GeneratedMessage.ExtendableMessage<\n" + " $classname$> implements $classname$OrBuilder {\n", + "static", is_own_file ? "" : "static", + "classname", descriptor_->name()); + } else { + printer->Print( + "public $static$ final class $classname$ extends\n" + " com.google.protobuf.GeneratedMessageLite.ExtendableMessage<\n" + " $classname$> implements $classname$OrBuilder {\n", + "static", is_own_file ? "" : "static", + "classname", descriptor_->name()); + } + } else { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public $static$ final class $classname$ extends\n" + " com.google.protobuf.GeneratedMessage\n" + " implements $classname$OrBuilder {\n", + "static", is_own_file ? "" : "static", + "classname", descriptor_->name()); + } else { + printer->Print( + "public $static$ final class $classname$ extends\n" + " com.google.protobuf.GeneratedMessageLite\n" + " implements $classname$OrBuilder {\n", + "static", is_own_file ? "" : "static", + "classname", descriptor_->name()); + } + } + printer->Indent(); + printer->Print( + "// Use $classname$.newBuilder() to construct.\n" + "private $classname$(Builder builder) {\n" + " super(builder);\n" + "}\n" + // Used when constructing the default instance, which cannot be initialized + // immediately because it may cyclically refer to other default instances. + "private $classname$(boolean noInit) {}\n" + "\n" + "private static final $classname$ defaultInstance;\n" + "public static $classname$ getDefaultInstance() {\n" + " return defaultInstance;\n" + "}\n" + "\n" + "public $classname$ getDefaultInstanceForType() {\n" + " return defaultInstance;\n" + "}\n" + "\n", + "classname", descriptor_->name()); + + GenerateDescriptorMethods(printer); + + // Nested types + for (int i = 0; i < descriptor_->enum_type_count(); i++) { + EnumGenerator(descriptor_->enum_type(i)).Generate(printer); + } + + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + MessageGenerator messageGenerator(descriptor_->nested_type(i)); + messageGenerator.GenerateInterface(printer); + messageGenerator.Generate(printer); + } + + // Integers for bit fields. + int totalBits = 0; + for (int i = 0; i < descriptor_->field_count(); i++) { + totalBits += field_generators_.get(descriptor_->field(i)) + .GetNumBitsForMessage(); + } + int totalInts = (totalBits + 31) / 32; + for (int i = 0; i < totalInts; i++) { + printer->Print("private int $bit_field_name$;\n", + "bit_field_name", GetBitFieldName(i)); + } + + // Fields + for (int i = 0; i < descriptor_->field_count(); i++) { + PrintFieldComment(printer, descriptor_->field(i)); + printer->Print("public static final int $constant_name$ = $number$;\n", + "constant_name", FieldConstantName(descriptor_->field(i)), + "number", SimpleItoa(descriptor_->field(i)->number())); + field_generators_.get(descriptor_->field(i)).GenerateMembers(printer); + printer->Print("\n"); + } + + // Called by the constructor, except in the case of the default instance, + // in which case this is called by static init code later on. + printer->Print("private void initFields() {\n"); + printer->Indent(); + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)) + .GenerateInitializationCode(printer); + } + printer->Outdent(); + printer->Print("}\n"); + + if (HasGeneratedMethods(descriptor_)) { + GenerateIsInitialized(printer, MEMOIZE); + GenerateMessageSerializationMethods(printer); + } + + if (HasEqualsAndHashCode(descriptor_)) { + GenerateEqualsAndHashCode(printer); + } + + GenerateParseFromMethods(printer); + GenerateBuilder(printer); + + // Carefully initialize the default instance in such a way that it doesn't + // conflict with other initialization. + printer->Print( + "\n" + "static {\n" + " defaultInstance = new $classname$(true);\n" + " defaultInstance.initFields();\n" + "}\n" + "\n" + "// @@protoc_insertion_point(class_scope:$full_name$)\n", + "classname", descriptor_->name(), + "full_name", descriptor_->full_name()); + + // Extensions must be declared after the defaultInstance is initialized + // because the defaultInstance is used by the extension to lazily retrieve + // the outer class's FileDescriptor. + for (int i = 0; i < descriptor_->extension_count(); i++) { + ExtensionGenerator(descriptor_->extension(i)).Generate(printer); + } + + printer->Outdent(); + printer->Print("}\n\n"); +} + + +// =================================================================== + +void MessageGenerator:: +GenerateMessageSerializationMethods(io::Printer* printer) { + scoped_array sorted_fields( + SortFieldsByNumber(descriptor_)); + + vector sorted_extensions; + for (int i = 0; i < descriptor_->extension_range_count(); ++i) { + sorted_extensions.push_back(descriptor_->extension_range(i)); + } + sort(sorted_extensions.begin(), sorted_extensions.end(), + ExtensionRangeOrdering()); + + printer->Print( + "public void writeTo(com.google.protobuf.CodedOutputStream output)\n" + " throws java.io.IOException {\n"); + printer->Indent(); + // writeTo(CodedOutputStream output) might be invoked without + // getSerializedSize() ever being called, but we need the memoized + // sizes in case this message has packed fields. Rather than emit checks for + // each packed field, just call getSerializedSize() up front for all messages. + // In most cases, getSerializedSize() will have already been called anyway by + // one of the wrapper writeTo() methods, making this call cheap. + printer->Print( + "getSerializedSize();\n"); + + if (descriptor_->extension_range_count() > 0) { + if (descriptor_->options().message_set_wire_format()) { + printer->Print( + "com.google.protobuf.GeneratedMessage$lite$\n" + " .ExtendableMessage<$classname$>.ExtensionWriter extensionWriter =\n" + " newMessageSetExtensionWriter();\n", + "lite", HasDescriptorMethods(descriptor_) ? "" : "Lite", + "classname", ClassName(descriptor_)); + } else { + printer->Print( + "com.google.protobuf.GeneratedMessage$lite$\n" + " .ExtendableMessage<$classname$>.ExtensionWriter extensionWriter =\n" + " newExtensionWriter();\n", + "lite", HasDescriptorMethods(descriptor_) ? "" : "Lite", + "classname", ClassName(descriptor_)); + } + } + + // Merge the fields and the extension ranges, both sorted by field number. + for (int i = 0, j = 0; + i < descriptor_->field_count() || j < sorted_extensions.size(); + ) { + if (i == descriptor_->field_count()) { + GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]); + } else if (j == sorted_extensions.size()) { + GenerateSerializeOneField(printer, sorted_fields[i++]); + } else if (sorted_fields[i]->number() < sorted_extensions[j]->start) { + GenerateSerializeOneField(printer, sorted_fields[i++]); + } else { + GenerateSerializeOneExtensionRange(printer, sorted_extensions[j++]); + } + } + + if (HasUnknownFields(descriptor_)) { + if (descriptor_->options().message_set_wire_format()) { + printer->Print( + "getUnknownFields().writeAsMessageSetTo(output);\n"); + } else { + printer->Print( + "getUnknownFields().writeTo(output);\n"); + } + } + + printer->Outdent(); + printer->Print( + "}\n" + "\n" + "private int memoizedSerializedSize = -1;\n" + "public int getSerializedSize() {\n" + " int size = memoizedSerializedSize;\n" + " if (size != -1) return size;\n" + "\n" + " size = 0;\n"); + printer->Indent(); + + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(sorted_fields[i]).GenerateSerializedSizeCode(printer); + } + + if (descriptor_->extension_range_count() > 0) { + if (descriptor_->options().message_set_wire_format()) { + printer->Print( + "size += extensionsSerializedSizeAsMessageSet();\n"); + } else { + printer->Print( + "size += extensionsSerializedSize();\n"); + } + } + + if (HasUnknownFields(descriptor_)) { + if (descriptor_->options().message_set_wire_format()) { + printer->Print( + "size += getUnknownFields().getSerializedSizeAsMessageSet();\n"); + } else { + printer->Print( + "size += getUnknownFields().getSerializedSize();\n"); + } + } + + printer->Outdent(); + printer->Print( + " memoizedSerializedSize = size;\n" + " return size;\n" + "}\n" + "\n"); + + printer->Print( + "private static final long serialVersionUID = 0L;\n" + "@java.lang.Override\n" + "protected java.lang.Object writeReplace()\n" + " throws java.io.ObjectStreamException {\n" + " return super.writeReplace();\n" + "}\n" + "\n"); +} + +void MessageGenerator:: +GenerateParseFromMethods(io::Printer* printer) { + // Note: These are separate from GenerateMessageSerializationMethods() + // because they need to be generated even for messages that are optimized + // for code size. + printer->Print( + "public static $classname$ parseFrom(\n" + " com.google.protobuf.ByteString data)\n" + " throws com.google.protobuf.InvalidProtocolBufferException {\n" + " return newBuilder().mergeFrom(data).buildParsed();\n" + "}\n" + "public static $classname$ parseFrom(\n" + " com.google.protobuf.ByteString data,\n" + " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" + " throws com.google.protobuf.InvalidProtocolBufferException {\n" + " return newBuilder().mergeFrom(data, extensionRegistry)\n" + " .buildParsed();\n" + "}\n" + "public static $classname$ parseFrom(byte[] data)\n" + " throws com.google.protobuf.InvalidProtocolBufferException {\n" + " return newBuilder().mergeFrom(data).buildParsed();\n" + "}\n" + "public static $classname$ parseFrom(\n" + " byte[] data,\n" + " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" + " throws com.google.protobuf.InvalidProtocolBufferException {\n" + " return newBuilder().mergeFrom(data, extensionRegistry)\n" + " .buildParsed();\n" + "}\n" + "public static $classname$ parseFrom(java.io.InputStream input)\n" + " throws java.io.IOException {\n" + " return newBuilder().mergeFrom(input).buildParsed();\n" + "}\n" + "public static $classname$ parseFrom(\n" + " java.io.InputStream input,\n" + " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" + " throws java.io.IOException {\n" + " return newBuilder().mergeFrom(input, extensionRegistry)\n" + " .buildParsed();\n" + "}\n" + "public static $classname$ parseDelimitedFrom(java.io.InputStream input)\n" + " throws java.io.IOException {\n" + " Builder builder = newBuilder();\n" + " if (builder.mergeDelimitedFrom(input)) {\n" + " return builder.buildParsed();\n" + " } else {\n" + " return null;\n" + " }\n" + "}\n" + "public static $classname$ parseDelimitedFrom(\n" + " java.io.InputStream input,\n" + " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" + " throws java.io.IOException {\n" + " Builder builder = newBuilder();\n" + " if (builder.mergeDelimitedFrom(input, extensionRegistry)) {\n" + " return builder.buildParsed();\n" + " } else {\n" + " return null;\n" + " }\n" + "}\n" + "public static $classname$ parseFrom(\n" + " com.google.protobuf.CodedInputStream input)\n" + " throws java.io.IOException {\n" + " return newBuilder().mergeFrom(input).buildParsed();\n" + "}\n" + "public static $classname$ parseFrom(\n" + " com.google.protobuf.CodedInputStream input,\n" + " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" + " throws java.io.IOException {\n" + " return newBuilder().mergeFrom(input, extensionRegistry)\n" + " .buildParsed();\n" + "}\n" + "\n", + "classname", ClassName(descriptor_)); +} + +void MessageGenerator::GenerateSerializeOneField( + io::Printer* printer, const FieldDescriptor* field) { + field_generators_.get(field).GenerateSerializationCode(printer); +} + +void MessageGenerator::GenerateSerializeOneExtensionRange( + io::Printer* printer, const Descriptor::ExtensionRange* range) { + printer->Print( + "extensionWriter.writeUntil($end$, output);\n", + "end", SimpleItoa(range->end)); +} + +// =================================================================== + +void MessageGenerator::GenerateBuilder(io::Printer* printer) { + printer->Print( + "public static Builder newBuilder() { return Builder.create(); }\n" + "public Builder newBuilderForType() { return newBuilder(); }\n" + "public static Builder newBuilder($classname$ prototype) {\n" + " return newBuilder().mergeFrom(prototype);\n" + "}\n" + "public Builder toBuilder() { return newBuilder(this); }\n" + "\n", + "classname", ClassName(descriptor_)); + + if (HasNestedBuilders(descriptor_)) { + printer->Print( + "@java.lang.Override\n" + "protected Builder newBuilderForType(\n" + " com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n" + " Builder builder = new Builder(parent);\n" + " return builder;\n" + "}\n"); + } + + if (descriptor_->extension_range_count() > 0) { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public static final class Builder extends\n" + " com.google.protobuf.GeneratedMessage.ExtendableBuilder<\n" + " $classname$, Builder> implements $classname$OrBuilder {\n", + "classname", ClassName(descriptor_)); + } else { + printer->Print( + "public static final class Builder extends\n" + " com.google.protobuf.GeneratedMessageLite.ExtendableBuilder<\n" + " $classname$, Builder> implements $classname$OrBuilder {\n", + "classname", ClassName(descriptor_)); + } + } else { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public static final class Builder extends\n" + " com.google.protobuf.GeneratedMessage.Builder\n" + " implements $classname$OrBuilder {\n", + "classname", ClassName(descriptor_)); + } else { + printer->Print( + "public static final class Builder extends\n" + " com.google.protobuf.GeneratedMessageLite.Builder<\n" + " $classname$, Builder>\n" + " implements $classname$OrBuilder {\n", + "classname", ClassName(descriptor_)); + } + } + printer->Indent(); + + GenerateDescriptorMethods(printer); + GenerateCommonBuilderMethods(printer); + + if (HasGeneratedMethods(descriptor_)) { + GenerateIsInitialized(printer, DONT_MEMOIZE); + GenerateBuilderParsingMethods(printer); + } + + // Integers for bit fields. + int totalBits = 0; + for (int i = 0; i < descriptor_->field_count(); i++) { + totalBits += field_generators_.get(descriptor_->field(i)) + .GetNumBitsForBuilder(); + } + int totalInts = (totalBits + 31) / 32; + for (int i = 0; i < totalInts; i++) { + printer->Print("private int $bit_field_name$;\n", + "bit_field_name", GetBitFieldName(i)); + } + + for (int i = 0; i < descriptor_->field_count(); i++) { + printer->Print("\n"); + PrintFieldComment(printer, descriptor_->field(i)); + field_generators_.get(descriptor_->field(i)) + .GenerateBuilderMembers(printer); + } + + printer->Print( + "\n" + "// @@protoc_insertion_point(builder_scope:$full_name$)\n", + "full_name", descriptor_->full_name()); + + printer->Outdent(); + printer->Print("}\n"); +} + +void MessageGenerator::GenerateDescriptorMethods(io::Printer* printer) { + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public static final com.google.protobuf.Descriptors.Descriptor\n" + " getDescriptor() {\n" + " return $fileclass$.internal_$identifier$_descriptor;\n" + "}\n" + "\n" + "protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n" + " internalGetFieldAccessorTable() {\n" + " return $fileclass$.internal_$identifier$_fieldAccessorTable;\n" + "}\n" + "\n", + "fileclass", ClassName(descriptor_->file()), + "identifier", UniqueFileScopeIdentifier(descriptor_)); + } +} + +// =================================================================== + +void MessageGenerator::GenerateCommonBuilderMethods(io::Printer* printer) { + printer->Print( + "// Construct using $classname$.newBuilder()\n" + "private Builder() {\n" + " maybeForceBuilderInitialization();\n" + "}\n" + "\n", + "classname", ClassName(descriptor_)); + + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "private Builder(BuilderParent parent) {\n" + " super(parent);\n" + " maybeForceBuilderInitialization();\n" + "}\n", + "classname", ClassName(descriptor_)); + } + + + if (HasNestedBuilders(descriptor_)) { + printer->Print( + "private void maybeForceBuilderInitialization() {\n" + " if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {\n"); + + printer->Indent(); + printer->Indent(); + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)) + .GenerateFieldBuilderInitializationCode(printer); + } + printer->Outdent(); + printer->Outdent(); + + printer->Print( + " }\n" + "}\n"); + } else { + printer->Print( + "private void maybeForceBuilderInitialization() {\n" + "}\n"); + } + + printer->Print( + "private static Builder create() {\n" + " return new Builder();\n" + "}\n" + "\n" + "public Builder clear() {\n" + " super.clear();\n", + "classname", ClassName(descriptor_)); + + printer->Indent(); + + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)) + .GenerateBuilderClearCode(printer); + } + + printer->Outdent(); + + printer->Print( + " return this;\n" + "}\n" + "\n" + "public Builder clone() {\n" + " return create().mergeFrom(buildPartial());\n" + "}\n" + "\n", + "classname", ClassName(descriptor_)); + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public com.google.protobuf.Descriptors.Descriptor\n" + " getDescriptorForType() {\n" + " return $classname$.getDescriptor();\n" + "}\n" + "\n", + "classname", ClassName(descriptor_)); + } + printer->Print( + "public $classname$ getDefaultInstanceForType() {\n" + " return $classname$.getDefaultInstance();\n" + "}\n" + "\n", + "classname", ClassName(descriptor_)); + + // ----------------------------------------------------------------- + + printer->Print( + "public $classname$ build() {\n" + " $classname$ result = buildPartial();\n" + " if (!result.isInitialized()) {\n" + " throw newUninitializedMessageException(result);\n" + " }\n" + " return result;\n" + "}\n" + "\n" + "private $classname$ buildParsed()\n" + " throws com.google.protobuf.InvalidProtocolBufferException {\n" + " $classname$ result = buildPartial();\n" + " if (!result.isInitialized()) {\n" + " throw newUninitializedMessageException(\n" + " result).asInvalidProtocolBufferException();\n" + " }\n" + " return result;\n" + "}\n" + "\n" + "public $classname$ buildPartial() {\n" + " $classname$ result = new $classname$(this);\n", + "classname", ClassName(descriptor_)); + + printer->Indent(); + + // Local vars for from and to bit fields to avoid accessing the builder and + // message over and over for these fields. Seems to provide a slight + // perforamance improvement in micro benchmark and this is also what proto1 + // code does. + int totalBuilderBits = 0; + int totalMessageBits = 0; + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldGenerator& field = field_generators_.get(descriptor_->field(i)); + totalBuilderBits += field.GetNumBitsForBuilder(); + totalMessageBits += field.GetNumBitsForMessage(); + } + int totalBuilderInts = (totalBuilderBits + 31) / 32; + int totalMessageInts = (totalMessageBits + 31) / 32; + for (int i = 0; i < totalBuilderInts; i++) { + printer->Print("int from_$bit_field_name$ = $bit_field_name$;\n", + "bit_field_name", GetBitFieldName(i)); + } + for (int i = 0; i < totalMessageInts; i++) { + printer->Print("int to_$bit_field_name$ = 0;\n", + "bit_field_name", GetBitFieldName(i)); + } + + // Output generation code for each field. + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)).GenerateBuildingCode(printer); + } + + // Copy the bit field results to the generated message + for (int i = 0; i < totalMessageInts; i++) { + printer->Print("result.$bit_field_name$ = to_$bit_field_name$;\n", + "bit_field_name", GetBitFieldName(i)); + } + + printer->Outdent(); + + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + " onBuilt();\n"); + } + + printer->Print( + " return result;\n" + "}\n" + "\n", + "classname", ClassName(descriptor_)); + + // ----------------------------------------------------------------- + + if (HasGeneratedMethods(descriptor_)) { + // MergeFrom(Message other) requires the ability to distinguish the other + // messages type by its descriptor. + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "public Builder mergeFrom(com.google.protobuf.Message other) {\n" + " if (other instanceof $classname$) {\n" + " return mergeFrom(($classname$)other);\n" + " } else {\n" + " super.mergeFrom(other);\n" + " return this;\n" + " }\n" + "}\n" + "\n", + "classname", ClassName(descriptor_)); + } + + printer->Print( + "public Builder mergeFrom($classname$ other) {\n" + // Optimization: If other is the default instance, we know none of its + // fields are set so we can skip the merge. + " if (other == $classname$.getDefaultInstance()) return this;\n", + "classname", ClassName(descriptor_)); + printer->Indent(); + + for (int i = 0; i < descriptor_->field_count(); i++) { + field_generators_.get(descriptor_->field(i)).GenerateMergingCode(printer); + } + + printer->Outdent(); + + // if message type has extensions + if (descriptor_->extension_range_count() > 0) { + printer->Print( + " this.mergeExtensionFields(other);\n"); + } + + if (HasUnknownFields(descriptor_)) { + printer->Print( + " this.mergeUnknownFields(other.getUnknownFields());\n"); + } + + printer->Print( + " return this;\n" + "}\n" + "\n"); + } +} + +// =================================================================== + +void MessageGenerator::GenerateBuilderParsingMethods(io::Printer* printer) { + scoped_array sorted_fields( + SortFieldsByNumber(descriptor_)); + + printer->Print( + "public Builder mergeFrom(\n" + " com.google.protobuf.CodedInputStream input,\n" + " com.google.protobuf.ExtensionRegistryLite extensionRegistry)\n" + " throws java.io.IOException {\n"); + printer->Indent(); + + if (HasUnknownFields(descriptor_)) { + printer->Print( + "com.google.protobuf.UnknownFieldSet.Builder unknownFields =\n" + " com.google.protobuf.UnknownFieldSet.newBuilder(\n" + " this.getUnknownFields());\n"); + } + + printer->Print( + "while (true) {\n"); + printer->Indent(); + + printer->Print( + "int tag = input.readTag();\n" + "switch (tag) {\n"); + printer->Indent(); + + if (HasUnknownFields(descriptor_)) { + printer->Print( + "case 0:\n" // zero signals EOF / limit reached + " this.setUnknownFields(unknownFields.build());\n" + " $on_changed$\n" + " return this;\n" + "default: {\n" + " if (!parseUnknownField(input, unknownFields,\n" + " extensionRegistry, tag)) {\n" + " this.setUnknownFields(unknownFields.build());\n" + " $on_changed$\n" + " return this;\n" // it's an endgroup tag + " }\n" + " break;\n" + "}\n", + "on_changed", HasDescriptorMethods(descriptor_) ? "onChanged();" : ""); + } else { + printer->Print( + "case 0:\n" // zero signals EOF / limit reached + " $on_changed$\n" + " return this;\n" + "default: {\n" + " if (!parseUnknownField(input, extensionRegistry, tag)) {\n" + " $on_changed$\n" + " return this;\n" // it's an endgroup tag + " }\n" + " break;\n" + "}\n", + "on_changed", HasDescriptorMethods(descriptor_) ? "onChanged();" : ""); + } + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = sorted_fields[i]; + uint32 tag = WireFormatLite::MakeTag(field->number(), + WireFormat::WireTypeForFieldType(field->type())); + + printer->Print( + "case $tag$: {\n", + "tag", SimpleItoa(tag)); + printer->Indent(); + + field_generators_.get(field).GenerateParsingCode(printer); + + printer->Outdent(); + printer->Print( + " break;\n" + "}\n"); + + if (field->is_packable()) { + // To make packed = true wire compatible, we generate parsing code from a + // packed version of this field regardless of field->options().packed(). + uint32 packed_tag = WireFormatLite::MakeTag(field->number(), + WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + printer->Print( + "case $tag$: {\n", + "tag", SimpleItoa(packed_tag)); + printer->Indent(); + + field_generators_.get(field).GenerateParsingCodeFromPacked(printer); + + printer->Outdent(); + printer->Print( + " break;\n" + "}\n"); + } + } + + printer->Outdent(); + printer->Outdent(); + printer->Outdent(); + printer->Print( + " }\n" // switch (tag) + " }\n" // while (true) + "}\n" + + "\n"); +} + +// =================================================================== + +void MessageGenerator::GenerateIsInitialized( + io::Printer* printer, UseMemoization useMemoization) { + bool memoization = useMemoization == MEMOIZE; + if (memoization) { + // Memoizes whether the protocol buffer is fully initialized (has all + // required fields). -1 means not yet computed. 0 means false and 1 means + // true. + printer->Print( + "private byte memoizedIsInitialized = -1;\n"); + } + printer->Print( + "public final boolean isInitialized() {\n"); + printer->Indent(); + + if (memoization) { + printer->Print( + "byte isInitialized = memoizedIsInitialized;\n" + "if (isInitialized != -1) return isInitialized == 1;\n" + "\n"); + } + + // Check that all required fields in this message are set. + // TODO(kenton): We can optimize this when we switch to putting all the + // "has" fields into a single bitfield. + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (field->is_required()) { + printer->Print( + "if (!has$name$()) {\n" + " $memoize$\n" + " return false;\n" + "}\n", + "name", UnderscoresToCapitalizedCamelCase(field), + "memoize", memoization ? "memoizedIsInitialized = 0;" : ""); + } + } + + // Now check that all embedded messages are initialized. + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (GetJavaType(field) == JAVATYPE_MESSAGE && + HasRequiredFields(field->message_type())) { + switch (field->label()) { + case FieldDescriptor::LABEL_REQUIRED: + printer->Print( + "if (!get$name$().isInitialized()) {\n" + " $memoize$\n" + " return false;\n" + "}\n", + "type", ClassName(field->message_type()), + "name", UnderscoresToCapitalizedCamelCase(field), + "memoize", memoization ? "memoizedIsInitialized = 0;" : ""); + break; + case FieldDescriptor::LABEL_OPTIONAL: + printer->Print( + "if (has$name$()) {\n" + " if (!get$name$().isInitialized()) {\n" + " $memoize$\n" + " return false;\n" + " }\n" + "}\n", + "type", ClassName(field->message_type()), + "name", UnderscoresToCapitalizedCamelCase(field), + "memoize", memoization ? "memoizedIsInitialized = 0;" : ""); + break; + case FieldDescriptor::LABEL_REPEATED: + printer->Print( + "for (int i = 0; i < get$name$Count(); i++) {\n" + " if (!get$name$(i).isInitialized()) {\n" + " $memoize$\n" + " return false;\n" + " }\n" + "}\n", + "type", ClassName(field->message_type()), + "name", UnderscoresToCapitalizedCamelCase(field), + "memoize", memoization ? "memoizedIsInitialized = 0;" : ""); + break; + } + } + } + + if (descriptor_->extension_range_count() > 0) { + printer->Print( + "if (!extensionsAreInitialized()) {\n" + " $memoize$\n" + " return false;\n" + "}\n", + "memoize", memoization ? "memoizedIsInitialized = 0;" : ""); + } + + printer->Outdent(); + + if (memoization) { + printer->Print( + " memoizedIsInitialized = 1;\n"); + } + + printer->Print( + " return true;\n" + "}\n" + "\n"); +} + +// =================================================================== + +void MessageGenerator::GenerateEqualsAndHashCode(io::Printer* printer) { + printer->Print( + "@java.lang.Override\n" + "public boolean equals(final java.lang.Object obj) {\n"); + printer->Indent(); + printer->Print( + "if (obj == this) {\n" + " return true;\n" + "}\n" + "if (!(obj instanceof $classname$)) {\n" + " return super.equals(obj);\n" + "}\n" + "$classname$ other = ($classname$) obj;\n" + "\n", + "classname", ClassName(descriptor_)); + + printer->Print("boolean result = true;\n"); + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (!field->is_repeated()) { + printer->Print( + "result = result && (has$name$() == other.has$name$());\n" + "if (has$name$()) {\n", + "name", UnderscoresToCapitalizedCamelCase(field)); + printer->Indent(); + } + field_generators_.get(field).GenerateEqualsCode(printer); + if (!field->is_repeated()) { + printer->Outdent(); + printer->Print( + "}\n"); + } + } + if (HasDescriptorMethods(descriptor_)) { + printer->Print( + "result = result &&\n" + " getUnknownFields().equals(other.getUnknownFields());\n"); + if (descriptor_->extension_range_count() > 0) { + printer->Print( + "result = result &&\n" + " getExtensionFields().equals(other.getExtensionFields());\n"); + } + } + printer->Print( + "return result;\n"); + printer->Outdent(); + printer->Print( + "}\n" + "\n"); + + printer->Print( + "@java.lang.Override\n" + "public int hashCode() {\n"); + printer->Indent(); + printer->Print( + "int hash = 41;\n" + "hash = (19 * hash) + getDescriptorForType().hashCode();\n"); + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (!field->is_repeated()) { + printer->Print( + "if (has$name$()) {\n", + "name", UnderscoresToCapitalizedCamelCase(field)); + printer->Indent(); + } + field_generators_.get(field).GenerateHashCode(printer); + if (!field->is_repeated()) { + printer->Outdent(); + printer->Print("}\n"); + } + } + if (HasDescriptorMethods(descriptor_)) { + if (descriptor_->extension_range_count() > 0) { + printer->Print( + "hash = hashFields(hash, getExtensionFields());\n"); + } + } + printer->Print( + "hash = (29 * hash) + getUnknownFields().hashCode();\n" + "return hash;\n"); + printer->Outdent(); + printer->Print( + "}\n" + "\n"); +} + +// =================================================================== + +void MessageGenerator::GenerateExtensionRegistrationCode(io::Printer* printer) { + for (int i = 0; i < descriptor_->extension_count(); i++) { + ExtensionGenerator(descriptor_->extension(i)) + .GenerateRegistrationCode(printer); + } + + for (int i = 0; i < descriptor_->nested_type_count(); i++) { + MessageGenerator(descriptor_->nested_type(i)) + .GenerateExtensionRegistrationCode(printer); + } +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h new file mode 100644 index 000000000..4c6fbbe51 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h @@ -0,0 +1,109 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace java { + +class MessageGenerator { + public: + explicit MessageGenerator(const Descriptor* descriptor); + ~MessageGenerator(); + + // All static variables have to be declared at the top-level of the file + // so that we can control initialization order, which is important for + // DescriptorProto bootstrapping to work. + void GenerateStaticVariables(io::Printer* printer); + + // Output code which initializes the static variables generated by + // GenerateStaticVariables(). + void GenerateStaticVariableInitializers(io::Printer* printer); + + // Generate the class itself. + void Generate(io::Printer* printer); + + // Generates the base interface that both the class and its builder implement + void GenerateInterface(io::Printer* printer); + + // Generate code to register all contained extensions with an + // ExtensionRegistry. + void GenerateExtensionRegistrationCode(io::Printer* printer); + + private: + enum UseMemoization { + MEMOIZE, + DONT_MEMOIZE + }; + + void GenerateMessageSerializationMethods(io::Printer* printer); + void GenerateParseFromMethods(io::Printer* printer); + void GenerateSerializeOneField(io::Printer* printer, + const FieldDescriptor* field); + void GenerateSerializeOneExtensionRange( + io::Printer* printer, const Descriptor::ExtensionRange* range); + + void GenerateBuilder(io::Printer* printer); + void GenerateCommonBuilderMethods(io::Printer* printer); + void GenerateDescriptorMethods(io::Printer* printer); + void GenerateBuilderParsingMethods(io::Printer* printer); + void GenerateIsInitialized(io::Printer* printer, + UseMemoization useMemoization); + void GenerateEqualsAndHashCode(io::Printer* printer); + + const Descriptor* descriptor_; + FieldGeneratorMap field_generators_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc new file mode 100644 index 000000000..251945afd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc @@ -0,0 +1,884 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +namespace { + +// TODO(kenton): Factor out a "SetCommonFieldVariables()" to get rid of +// repeat code between this and the other field types. +void SetMessageVariables(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex, + map* variables) { + (*variables)["name"] = + UnderscoresToCamelCase(descriptor); + (*variables)["capitalized_name"] = + UnderscoresToCapitalizedCamelCase(descriptor); + (*variables)["constant_name"] = FieldConstantName(descriptor); + (*variables)["number"] = SimpleItoa(descriptor->number()); + (*variables)["type"] = ClassName(descriptor->message_type()); + (*variables)["group_or_message"] = + (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ? + "Group" : "Message"; + // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported + // by the proto compiler + (*variables)["deprecation"] = descriptor->options().deprecated() + ? "@java.lang.Deprecated " : ""; + (*variables)["on_changed"] = + HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : ""; + + // For singular messages and builders, one bit is used for the hasField bit. + (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); + + (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_has_field_bit_builder"] = + GenerateClearBit(builderBitIndex); + + // For repated builders, one bit is used for whether the array is immutable. + (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); + + (*variables)["get_has_field_bit_from_local"] = + GenerateGetBitFromLocal(builderBitIndex); + (*variables)["set_has_field_bit_to_local"] = + GenerateSetBitToLocal(messageBitIndex); +} + +} // namespace + +// =================================================================== + +MessageFieldGenerator:: +MessageFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, + &variables_); +} + +MessageFieldGenerator::~MessageFieldGenerator() {} + +int MessageFieldGenerator::GetNumBitsForMessage() const { + return 1; +} + +int MessageFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +void MessageFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + // TODO(jonp): In the future, consider having a method specific to the + // interface so that builders can choose dynamically to either return a + // message or a nested builder, so that asking for the interface doesn't + // cause a message to ever be built. + printer->Print(variables_, + "$deprecation$boolean has$capitalized_name$();\n" + "$deprecation$$type$ get$capitalized_name$();\n"); + + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, + "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n"); + } +} + +void MessageFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private $type$ $name$_;\n" + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_message$;\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$() {\n" + " return $name$_;\n" + "}\n"); + + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, + "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n" + " return $name$_;\n" + "}\n"); + } +} + +void MessageFieldGenerator::PrintNestedBuilderCondition( + io::Printer* printer, + const char* regular_case, + const char* nested_builder_case) const { + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, "if ($name$Builder_ == null) {\n"); + printer->Indent(); + printer->Print(variables_, regular_case); + printer->Outdent(); + printer->Print("} else {\n"); + printer->Indent(); + printer->Print(variables_, nested_builder_case); + printer->Outdent(); + printer->Print("}\n"); + } else { + printer->Print(variables_, regular_case); + } +} + +void MessageFieldGenerator::PrintNestedBuilderFunction( + io::Printer* printer, + const char* method_prototype, + const char* regular_case, + const char* nested_builder_case, + const char* trailing_code) const { + printer->Print(variables_, method_prototype); + printer->Print(" {\n"); + printer->Indent(); + PrintNestedBuilderCondition(printer, regular_case, nested_builder_case); + if (trailing_code != NULL) { + printer->Print(variables_, trailing_code); + } + printer->Outdent(); + printer->Print("}\n"); +} + +void MessageFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + // When using nested-builders, the code initially works just like the + // non-nested builder case. It only creates a nested builder lazily on + // demand and then forever delegates to it after creation. + + printer->Print(variables_, + // Used when the builder is null. + "private $type$ $name$_ = $type$.getDefaultInstance();\n"); + + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, + // If this builder is non-null, it is used and the other fields are + // ignored. + "private com.google.protobuf.SingleFieldBuilder<\n" + " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;" + "\n"); + } + + // The comments above the methods below are based on a hypothetical + // field of type "Field" called "Field". + + // boolean hasField() + printer->Print(variables_, + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_builder$;\n" + "}\n"); + + // Field getField() + PrintNestedBuilderFunction(printer, + "$deprecation$public $type$ get$capitalized_name$()", + + "return $name$_;\n", + + "return $name$Builder_.getMessage();\n", + + NULL); + + // Field.Builder setField(Field value) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder set$capitalized_name$($type$ value)", + + "if (value == null) {\n" + " throw new NullPointerException();\n" + "}\n" + "$name$_ = value;\n" + "$on_changed$\n", + + "$name$Builder_.setMessage(value);\n", + + "$set_has_field_bit_builder$;\n" + "return this;\n"); + + // Field.Builder setField(Field.Builder builderForValue) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder set$capitalized_name$(\n" + " $type$.Builder builderForValue)", + + "$name$_ = builderForValue.build();\n" + "$on_changed$\n", + + "$name$Builder_.setMessage(builderForValue.build());\n", + + "$set_has_field_bit_builder$;\n" + "return this;\n"); + + // Field.Builder mergeField(Field value) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder merge$capitalized_name$($type$ value)", + + "if ($get_has_field_bit_builder$ &&\n" + " $name$_ != $type$.getDefaultInstance()) {\n" + " $name$_ =\n" + " $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n" + "} else {\n" + " $name$_ = value;\n" + "}\n" + "$on_changed$\n", + + "$name$Builder_.mergeFrom(value);\n", + + "$set_has_field_bit_builder$;\n" + "return this;\n"); + + // Field.Builder clearField() + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder clear$capitalized_name$()", + + "$name$_ = $type$.getDefaultInstance();\n" + "$on_changed$\n", + + "$name$Builder_.clear();\n", + + "$clear_has_field_bit_builder$;\n" + "return this;\n"); + + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, + "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n" + " $set_has_field_bit_builder$;\n" + " $on_changed$\n" + " return get$capitalized_name$FieldBuilder().getBuilder();\n" + "}\n" + "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n" + " if ($name$Builder_ != null) {\n" + " return $name$Builder_.getMessageOrBuilder();\n" + " } else {\n" + " return $name$_;\n" + " }\n" + "}\n" + "private com.google.protobuf.SingleFieldBuilder<\n" + " $type$, $type$.Builder, $type$OrBuilder> \n" + " get$capitalized_name$FieldBuilder() {\n" + " if ($name$Builder_ == null) {\n" + " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n" + " $type$, $type$.Builder, $type$OrBuilder>(\n" + " $name$_,\n" + " getParentForChildren(),\n" + " isClean());\n" + " $name$_ = null;\n" + " }\n" + " return $name$Builder_;\n" + "}\n"); + } +} + +void MessageFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + printer->Print(variables_, + "get$capitalized_name$FieldBuilder();\n"); +} + + +void MessageFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $type$.getDefaultInstance();\n"); +} + +void MessageFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + PrintNestedBuilderCondition(printer, + "$name$_ = $type$.getDefaultInstance();\n", + + "$name$Builder_.clear();\n"); + printer->Print(variables_, "$clear_has_field_bit_builder$;\n"); +} + +void MessageFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, + "if (other.has$capitalized_name$()) {\n" + " merge$capitalized_name$(other.get$capitalized_name$());\n" + "}\n"); +} + +void MessageFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + + printer->Print(variables_, + "if ($get_has_field_bit_from_local$) {\n" + " $set_has_field_bit_to_local$;\n" + "}\n"); + + PrintNestedBuilderCondition(printer, + "result.$name$_ = $name$_;\n", + + "result.$name$_ = $name$Builder_.build();\n"); +} + +void MessageFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + printer->Print(variables_, + "$type$.Builder subBuilder = $type$.newBuilder();\n" + "if (has$capitalized_name$()) {\n" + " subBuilder.mergeFrom(get$capitalized_name$());\n" + "}\n"); + + if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { + printer->Print(variables_, + "input.readGroup($number$, subBuilder, extensionRegistry);\n"); + } else { + printer->Print(variables_, + "input.readMessage(subBuilder, extensionRegistry);\n"); + } + + printer->Print(variables_, + "set$capitalized_name$(subBuilder.buildPartial());\n"); +} + +void MessageFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " output.write$group_or_message$($number$, $name$_);\n" + "}\n"); +} + +void MessageFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .compute$group_or_message$Size($number$, $name$_);\n" + "}\n"); +} + +void MessageFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + printer->Print(variables_, + "result = result && get$capitalized_name$()\n" + " .equals(other.get$capitalized_name$());\n"); +} + +void MessageFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "hash = (37 * hash) + $constant_name$;\n" + "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); +} + +string MessageFieldGenerator::GetBoxedType() const { + return ClassName(descriptor_->message_type()); +} + +// =================================================================== + +RepeatedMessageFieldGenerator:: +RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, + &variables_); +} + +RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} + +int RepeatedMessageFieldGenerator::GetNumBitsForMessage() const { + return 0; +} + +int RepeatedMessageFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +void RepeatedMessageFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + // TODO(jonp): In the future, consider having methods specific to the + // interface so that builders can choose dynamically to either return a + // message or a nested builder, so that asking for the interface doesn't + // cause a message to ever be built. + printer->Print(variables_, + "$deprecation$java.util.List<$type$> \n" + " get$capitalized_name$List();\n" + "$deprecation$$type$ get$capitalized_name$(int index);\n" + "$deprecation$int get$capitalized_name$Count();\n"); + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, + "$deprecation$java.util.List \n" + " get$capitalized_name$OrBuilderList();\n" + "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n" + " int index);\n"); + } +} + +void RepeatedMessageFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private java.util.List<$type$> $name$_;\n" + "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n" + " return $name$_;\n" // note: unmodifiable list + "}\n" + "$deprecation$public java.util.List \n" + " get$capitalized_name$OrBuilderList() {\n" + " return $name$_;\n" + "}\n" + "$deprecation$public int get$capitalized_name$Count() {\n" + " return $name$_.size();\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" + "}\n" + "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n" + " int index) {\n" + " return $name$_.get(index);\n" + "}\n"); + +} + +void RepeatedMessageFieldGenerator::PrintNestedBuilderCondition( + io::Printer* printer, + const char* regular_case, + const char* nested_builder_case) const { + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, "if ($name$Builder_ == null) {\n"); + printer->Indent(); + printer->Print(variables_, regular_case); + printer->Outdent(); + printer->Print("} else {\n"); + printer->Indent(); + printer->Print(variables_, nested_builder_case); + printer->Outdent(); + printer->Print("}\n"); + } else { + printer->Print(variables_, regular_case); + } +} + +void RepeatedMessageFieldGenerator::PrintNestedBuilderFunction( + io::Printer* printer, + const char* method_prototype, + const char* regular_case, + const char* nested_builder_case, + const char* trailing_code) const { + printer->Print(variables_, method_prototype); + printer->Print(" {\n"); + printer->Indent(); + PrintNestedBuilderCondition(printer, regular_case, nested_builder_case); + if (trailing_code != NULL) { + printer->Print(variables_, trailing_code); + } + printer->Outdent(); + printer->Print("}\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + // When using nested-builders, the code initially works just like the + // non-nested builder case. It only creates a nested builder lazily on + // demand and then forever delegates to it after creation. + + printer->Print(variables_, + // Used when the builder is null. + // One field is the list and the other field keeps track of whether the + // list is immutable. If it's immutable, the invariant is that it must + // either an instance of Collections.emptyList() or it's an ArrayList + // wrapped in a Collections.unmodifiableList() wrapper and nobody else has + // a refererence to the underlying ArrayList. This invariant allows us to + // share instances of lists between protocol buffers avoiding expensive + // memory allocations. Note, immutable is a strong guarantee here -- not + // just that the list cannot be modified via the reference but that the + // list can never be modified. + "private java.util.List<$type$> $name$_ =\n" + " java.util.Collections.emptyList();\n" + + "private void ensure$capitalized_name$IsMutable() {\n" + " if (!$get_mutable_bit_builder$) {\n" + " $name$_ = new java.util.ArrayList<$type$>($name$_);\n" + " $set_mutable_bit_builder$;\n" + " }\n" + "}\n" + "\n"); + + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, + // If this builder is non-null, it is used and the other fields are + // ignored. + "private com.google.protobuf.RepeatedFieldBuilder<\n" + " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n" + "\n"); + } + + // The comments above the methods below are based on a hypothetical + // repeated field of type "Field" called "RepeatedField". + + // List getRepeatedFieldList() + PrintNestedBuilderFunction(printer, + "$deprecation$public java.util.List<$type$> get$capitalized_name$List()", + + "return java.util.Collections.unmodifiableList($name$_);\n", + "return $name$Builder_.getMessageList();\n", + + NULL); + + // int getRepeatedFieldCount() + PrintNestedBuilderFunction(printer, + "$deprecation$public int get$capitalized_name$Count()", + + "return $name$_.size();\n", + "return $name$Builder_.getCount();\n", + + NULL); + + // Field getRepeatedField(int index) + PrintNestedBuilderFunction(printer, + "$deprecation$public $type$ get$capitalized_name$(int index)", + + "return $name$_.get(index);\n", + + "return $name$Builder_.getMessage(index);\n", + + NULL); + + // Builder setRepeatedField(int index, Field value) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder set$capitalized_name$(\n" + " int index, $type$ value)", + "if (value == null) {\n" + " throw new NullPointerException();\n" + "}\n" + "ensure$capitalized_name$IsMutable();\n" + "$name$_.set(index, value);\n" + "$on_changed$\n", + "$name$Builder_.setMessage(index, value);\n", + "return this;\n"); + + // Builder setRepeatedField(int index, Field.Builder builderForValue) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder set$capitalized_name$(\n" + " int index, $type$.Builder builderForValue)", + + "ensure$capitalized_name$IsMutable();\n" + "$name$_.set(index, builderForValue.build());\n" + "$on_changed$\n", + + "$name$Builder_.setMessage(index, builderForValue.build());\n", + + "return this;\n"); + + // Builder addRepeatedField(Field value) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder add$capitalized_name$($type$ value)", + + "if (value == null) {\n" + " throw new NullPointerException();\n" + "}\n" + "ensure$capitalized_name$IsMutable();\n" + "$name$_.add(value);\n" + + "$on_changed$\n", + + "$name$Builder_.addMessage(value);\n", + + "return this;\n"); + + // Builder addRepeatedField(int index, Field value) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder add$capitalized_name$(\n" + " int index, $type$ value)", + + "if (value == null) {\n" + " throw new NullPointerException();\n" + "}\n" + "ensure$capitalized_name$IsMutable();\n" + "$name$_.add(index, value);\n" + "$on_changed$\n", + + "$name$Builder_.addMessage(index, value);\n", + + "return this;\n"); + + // Builder addRepeatedField(Field.Builder builderForValue) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder add$capitalized_name$(\n" + " $type$.Builder builderForValue)", + + "ensure$capitalized_name$IsMutable();\n" + "$name$_.add(builderForValue.build());\n" + "$on_changed$\n", + + "$name$Builder_.addMessage(builderForValue.build());\n", + + "return this;\n"); + + // Builder addRepeatedField(int index, Field.Builder builderForValue) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder add$capitalized_name$(\n" + " int index, $type$.Builder builderForValue)", + + "ensure$capitalized_name$IsMutable();\n" + "$name$_.add(index, builderForValue.build());\n" + "$on_changed$\n", + + "$name$Builder_.addMessage(index, builderForValue.build());\n", + + "return this;\n"); + + // Builder addAllRepeatedField(Iterable values) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder addAll$capitalized_name$(\n" + " java.lang.Iterable values)", + + "ensure$capitalized_name$IsMutable();\n" + "super.addAll(values, $name$_);\n" + "$on_changed$\n", + + "$name$Builder_.addAllMessages(values);\n", + + "return this;\n"); + + // Builder clearAllRepeatedField() + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder clear$capitalized_name$()", + + "$name$_ = java.util.Collections.emptyList();\n" + "$clear_mutable_bit_builder$;\n" + "$on_changed$\n", + + "$name$Builder_.clear();\n", + + "return this;\n"); + + // Builder removeRepeatedField(int index) + PrintNestedBuilderFunction(printer, + "$deprecation$public Builder remove$capitalized_name$(int index)", + + "ensure$capitalized_name$IsMutable();\n" + "$name$_.remove(index);\n" + "$on_changed$\n", + + "$name$Builder_.remove(index);\n", + + "return this;\n"); + + if (HasNestedBuilders(descriptor_->containing_type())) { + printer->Print(variables_, + "$deprecation$public $type$.Builder get$capitalized_name$Builder(\n" + " int index) {\n" + " return get$capitalized_name$FieldBuilder().getBuilder(index);\n" + "}\n" + + "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n" + " int index) {\n" + " if ($name$Builder_ == null) {\n" + " return $name$_.get(index);" + " } else {\n" + " return $name$Builder_.getMessageOrBuilder(index);\n" + " }\n" + "}\n" + + "$deprecation$public java.util.List \n" + " get$capitalized_name$OrBuilderList() {\n" + " if ($name$Builder_ != null) {\n" + " return $name$Builder_.getMessageOrBuilderList();\n" + " } else {\n" + " return java.util.Collections.unmodifiableList($name$_);\n" + " }\n" + "}\n" + + "$deprecation$public $type$.Builder add$capitalized_name$Builder() {\n" + " return get$capitalized_name$FieldBuilder().addBuilder(\n" + " $type$.getDefaultInstance());\n" + "}\n" + "$deprecation$public $type$.Builder add$capitalized_name$Builder(\n" + " int index) {\n" + " return get$capitalized_name$FieldBuilder().addBuilder(\n" + " index, $type$.getDefaultInstance());\n" + "}\n" + "$deprecation$public java.util.List<$type$.Builder> \n" + " get$capitalized_name$BuilderList() {\n" + " return get$capitalized_name$FieldBuilder().getBuilderList();\n" + "}\n" + "private com.google.protobuf.RepeatedFieldBuilder<\n" + " $type$, $type$.Builder, $type$OrBuilder> \n" + " get$capitalized_name$FieldBuilder() {\n" + " if ($name$Builder_ == null) {\n" + " $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n" + " $type$, $type$.Builder, $type$OrBuilder>(\n" + " $name$_,\n" + " $get_mutable_bit_builder$,\n" + " getParentForChildren(),\n" + " isClean());\n" + " $name$_ = null;\n" + " }\n" + " return $name$Builder_;\n" + "}\n"); + } +} + +void RepeatedMessageFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + printer->Print(variables_, + "get$capitalized_name$FieldBuilder();\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + PrintNestedBuilderCondition(printer, + "$name$_ = java.util.Collections.emptyList();\n" + "$clear_mutable_bit_builder$;\n", + + "$name$Builder_.clear();\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + // The code below does two optimizations (non-nested builder case): + // 1. If the other list is empty, there's nothing to do. This ensures we + // don't allocate a new array if we already have an immutable one. + // 2. If the other list is non-empty and our current list is empty, we can + // reuse the other list which is guaranteed to be immutable. + PrintNestedBuilderCondition(printer, + "if (!other.$name$_.isEmpty()) {\n" + " if ($name$_.isEmpty()) {\n" + " $name$_ = other.$name$_;\n" + " $clear_mutable_bit_builder$;\n" + " } else {\n" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.addAll(other.$name$_);\n" + " }\n" + " $on_changed$\n" + "}\n", + + "if (!other.$name$_.isEmpty()) {\n" + " if ($name$Builder_.isEmpty()) {\n" + " $name$Builder_.dispose();\n" + " $name$Builder_ = null;\n" + " $name$_ = other.$name$_;\n" + " $clear_mutable_bit_builder$;\n" + " $name$Builder_ = \n" + " com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?\n" + " get$capitalized_name$FieldBuilder() : null;\n" + " } else {\n" + " $name$Builder_.addAllMessages(other.$name$_);\n" + " }\n" + "}\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + // The code below (non-nested builder case) ensures that the result has an + // immutable list. If our list is immutable, we can just reuse it. If not, + // we make it immutable. + PrintNestedBuilderCondition(printer, + "if ($get_mutable_bit_builder$) {\n" + " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" + " $clear_mutable_bit_builder$;\n" + "}\n" + "result.$name$_ = $name$_;\n", + + "result.$name$_ = $name$Builder_.build();\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + printer->Print(variables_, + "$type$.Builder subBuilder = $type$.newBuilder();\n"); + + if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { + printer->Print(variables_, + "input.readGroup($number$, subBuilder, extensionRegistry);\n"); + } else { + printer->Print(variables_, + "input.readMessage(subBuilder, extensionRegistry);\n"); + } + + printer->Print(variables_, + "add$capitalized_name$(subBuilder.buildPartial());\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " output.write$group_or_message$($number$, $name$_.get(i));\n" + "}\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .compute$group_or_message$Size($number$, $name$_.get(i));\n" + "}\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + printer->Print(variables_, + "result = result && get$capitalized_name$List()\n" + " .equals(other.get$capitalized_name$List());\n"); +} + +void RepeatedMessageFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "if (get$capitalized_name$Count() > 0) {\n" + " hash = (37 * hash) + $constant_name$;\n" + " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" + "}\n"); +} + +string RepeatedMessageFieldGenerator::GetBoxedType() const { + return ClassName(descriptor_->message_type()); +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h new file mode 100644 index 000000000..2efbcd97b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h @@ -0,0 +1,134 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +class MessageFieldGenerator : public FieldGenerator { + public: + explicit MessageFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~MessageFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFieldGenerator); + + void PrintNestedBuilderCondition(io::Printer* printer, + const char* regular_case, const char* nested_builder_case) const; + void PrintNestedBuilderFunction(io::Printer* printer, + const char* method_prototype, const char* regular_case, + const char* nested_builder_case, + const char* trailing_code) const; +}; + +class RepeatedMessageFieldGenerator : public FieldGenerator { + public: + explicit RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~RepeatedMessageFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedMessageFieldGenerator); + + void PrintNestedBuilderCondition(io::Printer* printer, + const char* regular_case, const char* nested_builder_case) const; + void PrintNestedBuilderFunction(io::Printer* printer, + const char* method_prototype, const char* regular_case, + const char* nested_builder_case, + const char* trailing_code) const; +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_MESSAGE_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc new file mode 100644 index 000000000..ccc94c9df --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc @@ -0,0 +1,122 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// TODO(kenton): Share code with the versions of this test in other languages? +// It seemed like parameterizing it would add more complexity than it is +// worth. + +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { +namespace { + +class TestGenerator : public CodeGenerator { + public: + TestGenerator() {} + ~TestGenerator() {} + + virtual bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const { + string filename = "Test.java"; + TryInsert(filename, "outer_class_scope", context); + TryInsert(filename, "class_scope:foo.Bar", context); + TryInsert(filename, "class_scope:foo.Bar.Baz", context); + TryInsert(filename, "builder_scope:foo.Bar", context); + TryInsert(filename, "builder_scope:foo.Bar.Baz", context); + TryInsert(filename, "enum_scope:foo.Qux", context); + return true; + } + + void TryInsert(const string& filename, const string& insertion_point, + GeneratorContext* context) const { + scoped_ptr output( + context->OpenForInsert(filename, insertion_point)); + io::Printer printer(output.get(), '$'); + printer.Print("// inserted $name$\n", "name", insertion_point); + } +}; + +// This test verifies that all the expected insertion points exist. It does +// not verify that they are correctly-placed; that would require actually +// compiling the output which is a bit more than I care to do for this test. +TEST(JavaPluginTest, PluginTest) { + File::WriteStringToFileOrDie( + "syntax = \"proto2\";\n" + "package foo;\n" + "option java_package = \"\";\n" + "option java_outer_classname = \"Test\";\n" + "message Bar {\n" + " message Baz {}\n" + "}\n" + "enum Qux { BLAH = 1; }\n", + TestTempDir() + "/test.proto"); + + google::protobuf::compiler::CommandLineInterface cli; + cli.SetInputsAreProtoPathRelative(true); + + JavaGenerator java_generator; + TestGenerator test_generator; + cli.RegisterGenerator("--java_out", &java_generator, ""); + cli.RegisterGenerator("--test_out", &test_generator, ""); + + string proto_path = "-I" + TestTempDir(); + string java_out = "--java_out=" + TestTempDir(); + string test_out = "--test_out=" + TestTempDir(); + + const char* argv[] = { + "protoc", + proto_path.c_str(), + java_out.c_str(), + test_out.c_str(), + "test.proto" + }; + + EXPECT_EQ(0, cli.Run(5, argv)); +} + +} // namespace +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc new file mode 100644 index 000000000..712e047af --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc @@ -0,0 +1,719 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +using internal::WireFormat; +using internal::WireFormatLite; + +namespace { + +const char* PrimitiveTypeName(JavaType type) { + switch (type) { + case JAVATYPE_INT : return "int"; + case JAVATYPE_LONG : return "long"; + case JAVATYPE_FLOAT : return "float"; + case JAVATYPE_DOUBLE : return "double"; + case JAVATYPE_BOOLEAN: return "boolean"; + case JAVATYPE_STRING : return "java.lang.String"; + case JAVATYPE_BYTES : return "com.google.protobuf.ByteString"; + case JAVATYPE_ENUM : return NULL; + case JAVATYPE_MESSAGE: return NULL; + + // No default because we want the compiler to complain if any new + // JavaTypes are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return NULL; +} + +bool IsReferenceType(JavaType type) { + switch (type) { + case JAVATYPE_INT : return false; + case JAVATYPE_LONG : return false; + case JAVATYPE_FLOAT : return false; + case JAVATYPE_DOUBLE : return false; + case JAVATYPE_BOOLEAN: return false; + case JAVATYPE_STRING : return true; + case JAVATYPE_BYTES : return true; + case JAVATYPE_ENUM : return true; + case JAVATYPE_MESSAGE: return true; + + // No default because we want the compiler to complain if any new + // JavaTypes are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return false; +} + +const char* GetCapitalizedType(const FieldDescriptor* field) { + switch (GetType(field)) { + case FieldDescriptor::TYPE_INT32 : return "Int32" ; + case FieldDescriptor::TYPE_UINT32 : return "UInt32" ; + case FieldDescriptor::TYPE_SINT32 : return "SInt32" ; + case FieldDescriptor::TYPE_FIXED32 : return "Fixed32" ; + case FieldDescriptor::TYPE_SFIXED32: return "SFixed32"; + case FieldDescriptor::TYPE_INT64 : return "Int64" ; + case FieldDescriptor::TYPE_UINT64 : return "UInt64" ; + case FieldDescriptor::TYPE_SINT64 : return "SInt64" ; + case FieldDescriptor::TYPE_FIXED64 : return "Fixed64" ; + case FieldDescriptor::TYPE_SFIXED64: return "SFixed64"; + case FieldDescriptor::TYPE_FLOAT : return "Float" ; + case FieldDescriptor::TYPE_DOUBLE : return "Double" ; + case FieldDescriptor::TYPE_BOOL : return "Bool" ; + case FieldDescriptor::TYPE_STRING : return "String" ; + case FieldDescriptor::TYPE_BYTES : return "Bytes" ; + case FieldDescriptor::TYPE_ENUM : return "Enum" ; + case FieldDescriptor::TYPE_GROUP : return "Group" ; + case FieldDescriptor::TYPE_MESSAGE : return "Message" ; + + // No default because we want the compiler to complain if any new + // types are added. + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return NULL; +} + +// For encodings with fixed sizes, returns that size in bytes. Otherwise +// returns -1. +int FixedSize(FieldDescriptor::Type type) { + switch (type) { + case FieldDescriptor::TYPE_INT32 : return -1; + case FieldDescriptor::TYPE_INT64 : return -1; + case FieldDescriptor::TYPE_UINT32 : return -1; + case FieldDescriptor::TYPE_UINT64 : return -1; + case FieldDescriptor::TYPE_SINT32 : return -1; + case FieldDescriptor::TYPE_SINT64 : return -1; + case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size; + case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size; + case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size; + case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size; + case FieldDescriptor::TYPE_FLOAT : return WireFormatLite::kFloatSize; + case FieldDescriptor::TYPE_DOUBLE : return WireFormatLite::kDoubleSize; + + case FieldDescriptor::TYPE_BOOL : return WireFormatLite::kBoolSize; + case FieldDescriptor::TYPE_ENUM : return -1; + + case FieldDescriptor::TYPE_STRING : return -1; + case FieldDescriptor::TYPE_BYTES : return -1; + case FieldDescriptor::TYPE_GROUP : return -1; + case FieldDescriptor::TYPE_MESSAGE : return -1; + + // No default because we want the compiler to complain if any new + // types are added. + } + GOOGLE_LOG(FATAL) << "Can't get here."; + return -1; +} + +void SetPrimitiveVariables(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex, + map* variables) { + (*variables)["name"] = + UnderscoresToCamelCase(descriptor); + (*variables)["capitalized_name"] = + UnderscoresToCapitalizedCamelCase(descriptor); + (*variables)["constant_name"] = FieldConstantName(descriptor); + (*variables)["number"] = SimpleItoa(descriptor->number()); + (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor)); + (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); + (*variables)["field_type"] = (*variables)["type"]; + (*variables)["field_list_type"] = "java.util.List<" + + (*variables)["boxed_type"] + ">"; + (*variables)["empty_list"] = "java.util.Collections.emptyList()"; + (*variables)["default"] = DefaultValue(descriptor); + (*variables)["default_init"] = IsDefaultValueJavaDefault(descriptor) ? + "" : ("= " + DefaultValue(descriptor)); + (*variables)["capitalized_type"] = GetCapitalizedType(descriptor); + (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); + (*variables)["tag_size"] = SimpleItoa( + WireFormat::TagSize(descriptor->number(), GetType(descriptor))); + if (IsReferenceType(GetJavaType(descriptor))) { + (*variables)["null_check"] = + " if (value == null) {\n" + " throw new NullPointerException();\n" + " }\n"; + } else { + (*variables)["null_check"] = ""; + } + // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported + // by the proto compiler + (*variables)["deprecation"] = descriptor->options().deprecated() + ? "@java.lang.Deprecated " : ""; + int fixed_size = FixedSize(GetType(descriptor)); + if (fixed_size != -1) { + (*variables)["fixed_size"] = SimpleItoa(fixed_size); + } + (*variables)["on_changed"] = + HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : ""; + + // For singular messages and builders, one bit is used for the hasField bit. + (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); + + (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_has_field_bit_builder"] = + GenerateClearBit(builderBitIndex); + + // For repated builders, one bit is used for whether the array is immutable. + (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); + + (*variables)["get_has_field_bit_from_local"] = + GenerateGetBitFromLocal(builderBitIndex); + (*variables)["set_has_field_bit_to_local"] = + GenerateSetBitToLocal(messageBitIndex); +} + +} // namespace + +// =================================================================== + +PrimitiveFieldGenerator:: +PrimitiveFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, + &variables_); +} + +PrimitiveFieldGenerator::~PrimitiveFieldGenerator() {} + +int PrimitiveFieldGenerator::GetNumBitsForMessage() const { + return 1; +} + +int PrimitiveFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +void PrimitiveFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + printer->Print(variables_, + "$deprecation$boolean has$capitalized_name$();\n" + "$deprecation$$type$ get$capitalized_name$();\n"); +} + +void PrimitiveFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private $field_type$ $name$_;\n" + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_message$;\n" + "}\n"); + + printer->Print(variables_, + "$deprecation$public $type$ get$capitalized_name$() {\n" + " return $name$_;\n" + "}\n"); +} + +void PrimitiveFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + printer->Print(variables_, + "private $field_type$ $name$_ $default_init$;\n" + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_builder$;\n" + "}\n"); + + printer->Print(variables_, + "$deprecation$public $type$ get$capitalized_name$() {\n" + " return $name$_;\n" + "}\n"); + + printer->Print(variables_, + "$deprecation$public Builder set$capitalized_name$($type$ value) {\n" + "$null_check$" + " $set_has_field_bit_builder$;\n" + " $name$_ = value;\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder clear$capitalized_name$() {\n" + " $clear_has_field_bit_builder$;\n"); + JavaType type = GetJavaType(descriptor_); + if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) { + // The default value is not a simple literal so we want to avoid executing + // it multiple times. Instead, get the default out of the default instance. + printer->Print(variables_, + " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); + } else { + printer->Print(variables_, + " $name$_ = $default$;\n"); + } + printer->Print(variables_, + " $on_changed$\n" + " return this;\n" + "}\n"); +} + +void PrimitiveFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + // noop for primitives +} + +void PrimitiveFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $default$;\n"); +} + +void PrimitiveFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$_ = $default$;\n" + "$clear_has_field_bit_builder$;\n"); +} + +void PrimitiveFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, + "if (other.has$capitalized_name$()) {\n" + " set$capitalized_name$(other.get$capitalized_name$());\n" + "}\n"); +} + +void PrimitiveFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_from_local$) {\n" + " $set_has_field_bit_to_local$;\n" + "}\n" + "result.$name$_ = $name$_;\n"); +} + +void PrimitiveFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + printer->Print(variables_, + "$set_has_field_bit_builder$;\n" + "$name$_ = input.read$capitalized_type$();\n"); +} + +void PrimitiveFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " output.write$capitalized_type$($number$, $name$_);\n" + "}\n"); +} + +void PrimitiveFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .compute$capitalized_type$Size($number$, $name$_);\n" + "}\n"); +} + +void PrimitiveFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + switch (GetJavaType(descriptor_)) { + case JAVATYPE_INT: + case JAVATYPE_LONG: + case JAVATYPE_BOOLEAN: + printer->Print(variables_, + "result = result && (get$capitalized_name$()\n" + " == other.get$capitalized_name$());\n"); + break; + + case JAVATYPE_FLOAT: + printer->Print(variables_, + "result = result && (Float.floatToIntBits(get$capitalized_name$())" + " == Float.floatToIntBits(other.get$capitalized_name$()));\n"); + break; + + case JAVATYPE_DOUBLE: + printer->Print(variables_, + "result = result && (Double.doubleToLongBits(get$capitalized_name$())" + " == Double.doubleToLongBits(other.get$capitalized_name$()));\n"); + break; + + case JAVATYPE_STRING: + case JAVATYPE_BYTES: + printer->Print(variables_, + "result = result && get$capitalized_name$()\n" + " .equals(other.get$capitalized_name$());\n"); + break; + + case JAVATYPE_ENUM: + case JAVATYPE_MESSAGE: + default: + GOOGLE_LOG(FATAL) << "Can't get here."; + break; + } +} + +void PrimitiveFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "hash = (37 * hash) + $constant_name$;\n"); + switch (GetJavaType(descriptor_)) { + case JAVATYPE_INT: + printer->Print(variables_, + "hash = (53 * hash) + get$capitalized_name$();\n"); + break; + + case JAVATYPE_LONG: + printer->Print(variables_, + "hash = (53 * hash) + hashLong(get$capitalized_name$());\n"); + break; + + case JAVATYPE_BOOLEAN: + printer->Print(variables_, + "hash = (53 * hash) + hashBoolean(get$capitalized_name$());\n"); + break; + + case JAVATYPE_FLOAT: + printer->Print(variables_, + "hash = (53 * hash) + Float.floatToIntBits(\n" + " get$capitalized_name$());\n"); + break; + + case JAVATYPE_DOUBLE: + printer->Print(variables_, + "hash = (53 * hash) + hashLong(\n" + " Double.doubleToLongBits(get$capitalized_name$()));\n"); + break; + + case JAVATYPE_STRING: + case JAVATYPE_BYTES: + printer->Print(variables_, + "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); + break; + + case JAVATYPE_ENUM: + case JAVATYPE_MESSAGE: + default: + GOOGLE_LOG(FATAL) << "Can't get here."; + break; + } +} + +string PrimitiveFieldGenerator::GetBoxedType() const { + return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); +} + +// =================================================================== + +RepeatedPrimitiveFieldGenerator:: +RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, + &variables_); +} + +RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {} + +int RepeatedPrimitiveFieldGenerator::GetNumBitsForMessage() const { + return 0; +} + +int RepeatedPrimitiveFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + printer->Print(variables_, + "$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\n" + "$deprecation$int get$capitalized_name$Count();\n" + "$deprecation$$type$ get$capitalized_name$(int index);\n"); +} + + +void RepeatedPrimitiveFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private $field_list_type$ $name$_;\n" + "$deprecation$public java.util.List<$boxed_type$>\n" + " get$capitalized_name$List() {\n" + " return $name$_;\n" // note: unmodifiable list + "}\n" + "$deprecation$public int get$capitalized_name$Count() {\n" + " return $name$_.size();\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" + "}\n"); + + if (descriptor_->options().packed() && + HasGeneratedMethods(descriptor_->containing_type())) { + printer->Print(variables_, + "private int $name$MemoizedSerializedSize = -1;\n"); + } +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + // One field is the list and the bit field keeps track of whether the + // list is immutable. If it's immutable, the invariant is that it must + // either an instance of Collections.emptyList() or it's an ArrayList + // wrapped in a Collections.unmodifiableList() wrapper and nobody else has + // a refererence to the underlying ArrayList. This invariant allows us to + // share instances of lists between protocol buffers avoiding expensive + // memory allocations. Note, immutable is a strong guarantee here -- not + // just that the list cannot be modified via the reference but that the + // list can never be modified. + printer->Print(variables_, + "private $field_list_type$ $name$_ = $empty_list$;\n"); + + printer->Print(variables_, + "private void ensure$capitalized_name$IsMutable() {\n" + " if (!$get_mutable_bit_builder$) {\n" + " $name$_ = new java.util.ArrayList<$boxed_type$>($name$_);\n" + " $set_mutable_bit_builder$;\n" + " }\n" + "}\n"); + + // Note: We return an unmodifiable list because otherwise the caller + // could hold on to the returned list and modify it after the message + // has been built, thus mutating the message which is supposed to be + // immutable. + printer->Print(variables_, + "$deprecation$public java.util.List<$boxed_type$>\n" + " get$capitalized_name$List() {\n" + " return java.util.Collections.unmodifiableList($name$_);\n" + "}\n" + "$deprecation$public int get$capitalized_name$Count() {\n" + " return $name$_.size();\n" + "}\n" + "$deprecation$public $type$ get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" + "}\n" + "$deprecation$public Builder set$capitalized_name$(\n" + " int index, $type$ value) {\n" + "$null_check$" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.set(index, value);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder add$capitalized_name$($type$ value) {\n" + "$null_check$" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.add(value);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder addAll$capitalized_name$(\n" + " java.lang.Iterable values) {\n" + " ensure$capitalized_name$IsMutable();\n" + " super.addAll(values, $name$_);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder clear$capitalized_name$() {\n" + " $name$_ = $empty_list$;\n" + " $clear_mutable_bit_builder$;\n" + " $on_changed$\n" + " return this;\n" + "}\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + // noop for primitives +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $empty_list$;\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$_ = $empty_list$;\n" + "$clear_mutable_bit_builder$;\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + // The code below does two optimizations: + // 1. If the other list is empty, there's nothing to do. This ensures we + // don't allocate a new array if we already have an immutable one. + // 2. If the other list is non-empty and our current list is empty, we can + // reuse the other list which is guaranteed to be immutable. + printer->Print(variables_, + "if (!other.$name$_.isEmpty()) {\n" + " if ($name$_.isEmpty()) {\n" + " $name$_ = other.$name$_;\n" + " $clear_mutable_bit_builder$;\n" + " } else {\n" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.addAll(other.$name$_);\n" + " }\n" + " $on_changed$\n" + "}\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + // The code below ensures that the result has an immutable list. If our + // list is immutable, we can just reuse it. If not, we make it immutable. + printer->Print(variables_, + "if ($get_mutable_bit_builder$) {\n" + " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" + " $clear_mutable_bit_builder$;\n" + "}\n" + "result.$name$_ = $name$_;\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + printer->Print(variables_, + "ensure$capitalized_name$IsMutable();\n" + "$name$_.add(input.read$capitalized_type$());\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateParsingCodeFromPacked(io::Printer* printer) const { + printer->Print(variables_, + "int length = input.readRawVarint32();\n" + "int limit = input.pushLimit(length);\n" + "while (input.getBytesUntilLimit() > 0) {\n" + " add$capitalized_name$(input.read$capitalized_type$());\n" + "}\n" + "input.popLimit(limit);\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (get$capitalized_name$List().size() > 0) {\n" + " output.writeRawVarint32($tag$);\n" + " output.writeRawVarint32($name$MemoizedSerializedSize);\n" + "}\n" + "for (int i = 0; i < $name$_.size(); i++) {\n" + " output.write$capitalized_type$NoTag($name$_.get(i));\n" + "}\n"); + } else { + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " output.write$capitalized_type$($number$, $name$_.get(i));\n" + "}\n"); + } +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "{\n" + " int dataSize = 0;\n"); + printer->Indent(); + + if (FixedSize(GetType(descriptor_)) == -1) { + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " dataSize += com.google.protobuf.CodedOutputStream\n" + " .compute$capitalized_type$SizeNoTag($name$_.get(i));\n" + "}\n"); + } else { + printer->Print(variables_, + "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n"); + } + + printer->Print( + "size += dataSize;\n"); + + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (!get$capitalized_name$List().isEmpty()) {\n" + " size += $tag_size$;\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .computeInt32SizeNoTag(dataSize);\n" + "}\n"); + } else { + printer->Print(variables_, + "size += $tag_size$ * get$capitalized_name$List().size();\n"); + } + + // cache the data size for packed fields. + if (descriptor_->options().packed()) { + printer->Print(variables_, + "$name$MemoizedSerializedSize = dataSize;\n"); + } + + printer->Outdent(); + printer->Print("}\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + printer->Print(variables_, + "result = result && get$capitalized_name$List()\n" + " .equals(other.get$capitalized_name$List());\n"); +} + +void RepeatedPrimitiveFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "if (get$capitalized_name$Count() > 0) {\n" + " hash = (37 * hash) + $constant_name$;\n" + " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" + "}\n"); +} + +string RepeatedPrimitiveFieldGenerator::GetBoxedType() const { + return BoxedPrimitiveTypeName(GetJavaType(descriptor_)); +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h new file mode 100644 index 000000000..7900fac52 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h @@ -0,0 +1,121 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +class PrimitiveFieldGenerator : public FieldGenerator { + public: + explicit PrimitiveFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~PrimitiveFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(PrimitiveFieldGenerator); +}; + +class RepeatedPrimitiveFieldGenerator : public FieldGenerator { + public: + explicit RepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~RepeatedPrimitiveFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateParsingCodeFromPacked(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPrimitiveFieldGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_PRIMITIVE_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc new file mode 100644 index 000000000..1ae4f4616 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc @@ -0,0 +1,444 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +ServiceGenerator::ServiceGenerator(const ServiceDescriptor* descriptor) + : descriptor_(descriptor) {} + +ServiceGenerator::~ServiceGenerator() {} + +void ServiceGenerator::Generate(io::Printer* printer) { + bool is_own_file = descriptor_->file()->options().java_multiple_files(); + printer->Print( + "public $static$ abstract class $classname$\n" + " implements com.google.protobuf.Service {\n", + "static", is_own_file ? "" : "static", + "classname", descriptor_->name()); + printer->Indent(); + + printer->Print( + "protected $classname$() {}\n\n", + "classname", descriptor_->name()); + + GenerateInterface(printer); + + GenerateNewReflectiveServiceMethod(printer); + GenerateNewReflectiveBlockingServiceMethod(printer); + + GenerateAbstractMethods(printer); + + // Generate getDescriptor() and getDescriptorForType(). + printer->Print( + "public static final\n" + " com.google.protobuf.Descriptors.ServiceDescriptor\n" + " getDescriptor() {\n" + " return $file$.getDescriptor().getServices().get($index$);\n" + "}\n", + "file", ClassName(descriptor_->file()), + "index", SimpleItoa(descriptor_->index())); + GenerateGetDescriptorForType(printer); + + // Generate more stuff. + GenerateCallMethod(printer); + GenerateGetPrototype(REQUEST, printer); + GenerateGetPrototype(RESPONSE, printer); + GenerateStub(printer); + GenerateBlockingStub(printer); + + printer->Outdent(); + printer->Print("}\n\n"); +} + +void ServiceGenerator::GenerateGetDescriptorForType(io::Printer* printer) { + printer->Print( + "public final com.google.protobuf.Descriptors.ServiceDescriptor\n" + " getDescriptorForType() {\n" + " return getDescriptor();\n" + "}\n"); +} + +void ServiceGenerator::GenerateInterface(io::Printer* printer) { + printer->Print("public interface Interface {\n"); + printer->Indent(); + GenerateAbstractMethods(printer); + printer->Outdent(); + printer->Print("}\n\n"); +} + +void ServiceGenerator::GenerateNewReflectiveServiceMethod( + io::Printer* printer) { + printer->Print( + "public static com.google.protobuf.Service newReflectiveService(\n" + " final Interface impl) {\n" + " return new $classname$() {\n", + "classname", descriptor_->name()); + printer->Indent(); + printer->Indent(); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + printer->Print("@java.lang.Override\n"); + GenerateMethodSignature(printer, method, IS_CONCRETE); + printer->Print( + " {\n" + " impl.$method$(controller, request, done);\n" + "}\n\n", + "method", UnderscoresToCamelCase(method)); + } + + printer->Outdent(); + printer->Print("};\n"); + printer->Outdent(); + printer->Print("}\n\n"); +} + +void ServiceGenerator::GenerateNewReflectiveBlockingServiceMethod( + io::Printer* printer) { + printer->Print( + "public static com.google.protobuf.BlockingService\n" + " newReflectiveBlockingService(final BlockingInterface impl) {\n" + " return new com.google.protobuf.BlockingService() {\n"); + printer->Indent(); + printer->Indent(); + + GenerateGetDescriptorForType(printer); + + GenerateCallBlockingMethod(printer); + GenerateGetPrototype(REQUEST, printer); + GenerateGetPrototype(RESPONSE, printer); + + printer->Outdent(); + printer->Print("};\n"); + printer->Outdent(); + printer->Print("}\n\n"); +} + +void ServiceGenerator::GenerateAbstractMethods(io::Printer* printer) { + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + GenerateMethodSignature(printer, method, IS_ABSTRACT); + printer->Print(";\n\n"); + } +} + +void ServiceGenerator::GenerateCallMethod(io::Printer* printer) { + printer->Print( + "\n" + "public final void callMethod(\n" + " com.google.protobuf.Descriptors.MethodDescriptor method,\n" + " com.google.protobuf.RpcController controller,\n" + " com.google.protobuf.Message request,\n" + " com.google.protobuf.RpcCallback<\n" + " com.google.protobuf.Message> done) {\n" + " if (method.getService() != getDescriptor()) {\n" + " throw new java.lang.IllegalArgumentException(\n" + " \"Service.callMethod() given method descriptor for wrong \" +\n" + " \"service type.\");\n" + " }\n" + " switch(method.getIndex()) {\n"); + printer->Indent(); + printer->Indent(); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + map vars; + vars["index"] = SimpleItoa(i); + vars["method"] = UnderscoresToCamelCase(method); + vars["input"] = ClassName(method->input_type()); + vars["output"] = ClassName(method->output_type()); + printer->Print(vars, + "case $index$:\n" + " this.$method$(controller, ($input$)request,\n" + " com.google.protobuf.RpcUtil.<$output$>specializeCallback(\n" + " done));\n" + " return;\n"); + } + + printer->Print( + "default:\n" + " throw new java.lang.AssertionError(\"Can't get here.\");\n"); + + printer->Outdent(); + printer->Outdent(); + + printer->Print( + " }\n" + "}\n" + "\n"); +} + +void ServiceGenerator::GenerateCallBlockingMethod(io::Printer* printer) { + printer->Print( + "\n" + "public final com.google.protobuf.Message callBlockingMethod(\n" + " com.google.protobuf.Descriptors.MethodDescriptor method,\n" + " com.google.protobuf.RpcController controller,\n" + " com.google.protobuf.Message request)\n" + " throws com.google.protobuf.ServiceException {\n" + " if (method.getService() != getDescriptor()) {\n" + " throw new java.lang.IllegalArgumentException(\n" + " \"Service.callBlockingMethod() given method descriptor for \" +\n" + " \"wrong service type.\");\n" + " }\n" + " switch(method.getIndex()) {\n"); + printer->Indent(); + printer->Indent(); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + map vars; + vars["index"] = SimpleItoa(i); + vars["method"] = UnderscoresToCamelCase(method); + vars["input"] = ClassName(method->input_type()); + vars["output"] = ClassName(method->output_type()); + printer->Print(vars, + "case $index$:\n" + " return impl.$method$(controller, ($input$)request);\n"); + } + + printer->Print( + "default:\n" + " throw new java.lang.AssertionError(\"Can't get here.\");\n"); + + printer->Outdent(); + printer->Outdent(); + + printer->Print( + " }\n" + "}\n" + "\n"); +} + +void ServiceGenerator::GenerateGetPrototype(RequestOrResponse which, + io::Printer* printer) { + /* + * TODO(cpovirk): The exception message says "Service.foo" when it may be + * "BlockingService.foo." Consider fixing. + */ + printer->Print( + "public final com.google.protobuf.Message\n" + " get$request_or_response$Prototype(\n" + " com.google.protobuf.Descriptors.MethodDescriptor method) {\n" + " if (method.getService() != getDescriptor()) {\n" + " throw new java.lang.IllegalArgumentException(\n" + " \"Service.get$request_or_response$Prototype() given method \" +\n" + " \"descriptor for wrong service type.\");\n" + " }\n" + " switch(method.getIndex()) {\n", + "request_or_response", (which == REQUEST) ? "Request" : "Response"); + printer->Indent(); + printer->Indent(); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + map vars; + vars["index"] = SimpleItoa(i); + vars["type"] = ClassName( + (which == REQUEST) ? method->input_type() : method->output_type()); + printer->Print(vars, + "case $index$:\n" + " return $type$.getDefaultInstance();\n"); + } + + printer->Print( + "default:\n" + " throw new java.lang.AssertionError(\"Can't get here.\");\n"); + + printer->Outdent(); + printer->Outdent(); + + printer->Print( + " }\n" + "}\n" + "\n"); +} + +void ServiceGenerator::GenerateStub(io::Printer* printer) { + printer->Print( + "public static Stub newStub(\n" + " com.google.protobuf.RpcChannel channel) {\n" + " return new Stub(channel);\n" + "}\n" + "\n" + "public static final class Stub extends $classname$ implements Interface {" + "\n", + "classname", ClassName(descriptor_)); + printer->Indent(); + + printer->Print( + "private Stub(com.google.protobuf.RpcChannel channel) {\n" + " this.channel = channel;\n" + "}\n" + "\n" + "private final com.google.protobuf.RpcChannel channel;\n" + "\n" + "public com.google.protobuf.RpcChannel getChannel() {\n" + " return channel;\n" + "}\n"); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + printer->Print("\n"); + GenerateMethodSignature(printer, method, IS_CONCRETE); + printer->Print(" {\n"); + printer->Indent(); + + map vars; + vars["index"] = SimpleItoa(i); + vars["output"] = ClassName(method->output_type()); + printer->Print(vars, + "channel.callMethod(\n" + " getDescriptor().getMethods().get($index$),\n" + " controller,\n" + " request,\n" + " $output$.getDefaultInstance(),\n" + " com.google.protobuf.RpcUtil.generalizeCallback(\n" + " done,\n" + " $output$.class,\n" + " $output$.getDefaultInstance()));\n"); + + printer->Outdent(); + printer->Print("}\n"); + } + + printer->Outdent(); + printer->Print( + "}\n" + "\n"); +} + +void ServiceGenerator::GenerateBlockingStub(io::Printer* printer) { + printer->Print( + "public static BlockingInterface newBlockingStub(\n" + " com.google.protobuf.BlockingRpcChannel channel) {\n" + " return new BlockingStub(channel);\n" + "}\n" + "\n"); + + printer->Print( + "public interface BlockingInterface {"); + printer->Indent(); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + GenerateBlockingMethodSignature(printer, method); + printer->Print(";\n"); + } + + printer->Outdent(); + printer->Print( + "}\n" + "\n"); + + printer->Print( + "private static final class BlockingStub implements BlockingInterface {\n"); + printer->Indent(); + + printer->Print( + "private BlockingStub(com.google.protobuf.BlockingRpcChannel channel) {\n" + " this.channel = channel;\n" + "}\n" + "\n" + "private final com.google.protobuf.BlockingRpcChannel channel;\n"); + + for (int i = 0; i < descriptor_->method_count(); i++) { + const MethodDescriptor* method = descriptor_->method(i); + GenerateBlockingMethodSignature(printer, method); + printer->Print(" {\n"); + printer->Indent(); + + map vars; + vars["index"] = SimpleItoa(i); + vars["output"] = ClassName(method->output_type()); + printer->Print(vars, + "return ($output$) channel.callBlockingMethod(\n" + " getDescriptor().getMethods().get($index$),\n" + " controller,\n" + " request,\n" + " $output$.getDefaultInstance());\n"); + + printer->Outdent(); + printer->Print( + "}\n" + "\n"); + } + + printer->Outdent(); + printer->Print("}\n"); +} + +void ServiceGenerator::GenerateMethodSignature(io::Printer* printer, + const MethodDescriptor* method, + IsAbstract is_abstract) { + map vars; + vars["name"] = UnderscoresToCamelCase(method); + vars["input"] = ClassName(method->input_type()); + vars["output"] = ClassName(method->output_type()); + vars["abstract"] = (is_abstract == IS_ABSTRACT) ? "abstract" : ""; + printer->Print(vars, + "public $abstract$ void $name$(\n" + " com.google.protobuf.RpcController controller,\n" + " $input$ request,\n" + " com.google.protobuf.RpcCallback<$output$> done)"); +} + +void ServiceGenerator::GenerateBlockingMethodSignature( + io::Printer* printer, + const MethodDescriptor* method) { + map vars; + vars["method"] = UnderscoresToCamelCase(method); + vars["input"] = ClassName(method->input_type()); + vars["output"] = ClassName(method->output_type()); + printer->Print(vars, + "\n" + "public $output$ $method$(\n" + " com.google.protobuf.RpcController controller,\n" + " $input$ request)\n" + " throws com.google.protobuf.ServiceException"); +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h new file mode 100644 index 000000000..e07eebf75 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h @@ -0,0 +1,113 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_SERVICE_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_SERVICE_H__ + +#include +#include + +namespace google { +namespace protobuf { + namespace io { + class Printer; // printer.h + } +} + +namespace protobuf { +namespace compiler { +namespace java { + +class ServiceGenerator { + public: + explicit ServiceGenerator(const ServiceDescriptor* descriptor); + ~ServiceGenerator(); + + void Generate(io::Printer* printer); + + private: + + // Generate the getDescriptorForType() method. + void GenerateGetDescriptorForType(io::Printer* printer); + + // Generate a Java interface for the service. + void GenerateInterface(io::Printer* printer); + + // Generate newReflectiveService() method. + void GenerateNewReflectiveServiceMethod(io::Printer* printer); + + // Generate newReflectiveBlockingService() method. + void GenerateNewReflectiveBlockingServiceMethod(io::Printer* printer); + + // Generate abstract method declarations for all methods. + void GenerateAbstractMethods(io::Printer* printer); + + // Generate the implementation of Service.callMethod(). + void GenerateCallMethod(io::Printer* printer); + + // Generate the implementation of BlockingService.callBlockingMethod(). + void GenerateCallBlockingMethod(io::Printer* printer); + + // Generate the implementations of Service.get{Request,Response}Prototype(). + enum RequestOrResponse { REQUEST, RESPONSE }; + void GenerateGetPrototype(RequestOrResponse which, io::Printer* printer); + + // Generate a stub implementation of the service. + void GenerateStub(io::Printer* printer); + + // Generate a method signature, possibly abstract, without body or trailing + // semicolon. + enum IsAbstract { IS_ABSTRACT, IS_CONCRETE }; + void GenerateMethodSignature(io::Printer* printer, + const MethodDescriptor* method, + IsAbstract is_abstract); + + // Generate a blocking stub interface and implementation of the service. + void GenerateBlockingStub(io::Printer* printer); + + // Generate the method signature for one method of a blocking stub. + void GenerateBlockingMethodSignature(io::Printer* printer, + const MethodDescriptor* method); + + const ServiceDescriptor* descriptor_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +#endif // NET_PROTO2_COMPILER_JAVA_SERVICE_H__ +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc new file mode 100644 index 000000000..222285bdb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc @@ -0,0 +1,610 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Author: jonp@google.com (Jon Perlow) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +using internal::WireFormat; +using internal::WireFormatLite; + +namespace { + +void SetPrimitiveVariables(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex, + map* variables) { + (*variables)["name"] = + UnderscoresToCamelCase(descriptor); + (*variables)["capitalized_name"] = + UnderscoresToCapitalizedCamelCase(descriptor); + (*variables)["constant_name"] = FieldConstantName(descriptor); + (*variables)["number"] = SimpleItoa(descriptor->number()); + (*variables)["empty_list"] = "com.google.protobuf.LazyStringArrayList.EMPTY"; + + (*variables)["default"] = DefaultValue(descriptor); + (*variables)["default_init"] = ("= " + DefaultValue(descriptor)); + (*variables)["capitalized_type"] = "String"; + (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); + (*variables)["tag_size"] = SimpleItoa( + WireFormat::TagSize(descriptor->number(), GetType(descriptor))); + (*variables)["null_check"] = + " if (value == null) {\n" + " throw new NullPointerException();\n" + " }\n"; + + // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported + // by the proto compiler + (*variables)["deprecation"] = descriptor->options().deprecated() + ? "@java.lang.Deprecated " : ""; + (*variables)["on_changed"] = + HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : ""; + + // For singular messages and builders, one bit is used for the hasField bit. + (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); + + (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_has_field_bit_builder"] = + GenerateClearBit(builderBitIndex); + + // For repated builders, one bit is used for whether the array is immutable. + (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); + (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); + (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); + + (*variables)["get_has_field_bit_from_local"] = + GenerateGetBitFromLocal(builderBitIndex); + (*variables)["set_has_field_bit_to_local"] = + GenerateSetBitToLocal(messageBitIndex); +} + +} // namespace + +// =================================================================== + +StringFieldGenerator:: +StringFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, + &variables_); +} + +StringFieldGenerator::~StringFieldGenerator() {} + +int StringFieldGenerator::GetNumBitsForMessage() const { + return 1; +} + +int StringFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +// A note about how strings are handled. This code used to just store a String +// in the Message. This had two issues: +// +// 1. It wouldn't roundtrip byte arrays that were not vaid UTF-8 encoded +// strings, but rather fields that were raw bytes incorrectly marked +// as strings in the proto file. This is common because in the proto1 +// syntax, string was the way to indicate bytes and C++ engineers can +// easily make this mistake without affecting the C++ API. By converting to +// strings immediately, some java code might corrupt these byte arrays as +// it passes through a java server even if the field was never accessed by +// application code. +// +// 2. There's a performance hit to converting between bytes and strings and +// it many cases, the field is never even read by the application code. This +// avoids unnecessary conversions in the common use cases. +// +// So now, the field for String is maintained as an Object reference which can +// either store a String or a ByteString. The code uses an instanceof check +// to see which one it has and converts to the other one if needed. It remembers +// the last value requested (in a thread safe manner) as this is most likely +// the one needed next. The thread safety is such that if two threads both +// convert the field because the changes made by each thread were not visible to +// the other, they may cause a conversion to happen more times than would +// otherwise be necessary. This was deemed better than adding synchronization +// overhead. It will not cause any corruption issues or affect the behavior of +// the API. The instanceof check is also highly optimized in the JVM and we +// decided it was better to reduce the memory overhead by not having two +// separate fields but rather use dynamic type checking. +// +// For single fields, the logic for this is done inside the generated code. For +// repeated fields, the logic is done in LazyStringArrayList and +// UnmodifiableLazyStringList. +void StringFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + printer->Print(variables_, + "$deprecation$boolean has$capitalized_name$();\n" + "$deprecation$java.lang.String get$capitalized_name$();\n"); +} + +void StringFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private java.lang.Object $name$_;\n" + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_message$;\n" + "}\n"); + + printer->Print(variables_, + "$deprecation$public java.lang.String get$capitalized_name$() {\n" + " java.lang.Object ref = $name$_;\n" + " if (ref instanceof java.lang.String) {\n" + " return (java.lang.String) ref;\n" + " } else {\n" + " com.google.protobuf.ByteString bs = \n" + " (com.google.protobuf.ByteString) ref;\n" + " java.lang.String s = bs.toStringUtf8();\n" + " if (com.google.protobuf.Internal.isValidUtf8(bs)) {\n" + " $name$_ = s;\n" + " }\n" + " return s;\n" + " }\n" + "}\n" + "private com.google.protobuf.ByteString get$capitalized_name$Bytes() {\n" + " java.lang.Object ref = $name$_;\n" + " if (ref instanceof java.lang.String) {\n" + " com.google.protobuf.ByteString b = \n" + " com.google.protobuf.ByteString.copyFromUtf8(\n" + " (java.lang.String) ref);\n" + " $name$_ = b;\n" + " return b;\n" + " } else {\n" + " return (com.google.protobuf.ByteString) ref;\n" + " }\n" + "}\n"); +} + +void StringFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + printer->Print(variables_, + "private java.lang.Object $name$_ $default_init$;\n" + "$deprecation$public boolean has$capitalized_name$() {\n" + " return $get_has_field_bit_builder$;\n" + "}\n"); + + printer->Print(variables_, + "$deprecation$public java.lang.String get$capitalized_name$() {\n" + " java.lang.Object ref = $name$_;\n" + " if (!(ref instanceof java.lang.String)) {\n" + " java.lang.String s = ((com.google.protobuf.ByteString) ref)\n" + " .toStringUtf8();\n" + " $name$_ = s;\n" + " return s;\n" + " } else {\n" + " return (java.lang.String) ref;\n" + " }\n" + "}\n"); + + printer->Print(variables_, + "$deprecation$public Builder set$capitalized_name$(\n" + " java.lang.String value) {\n" + "$null_check$" + " $set_has_field_bit_builder$;\n" + " $name$_ = value;\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder clear$capitalized_name$() {\n" + " $clear_has_field_bit_builder$;\n"); + // The default value is not a simple literal so we want to avoid executing + // it multiple times. Instead, get the default out of the default instance. + printer->Print(variables_, + " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); + printer->Print(variables_, + " $on_changed$\n" + " return this;\n" + "}\n"); + + printer->Print(variables_, + "void set$capitalized_name$(com.google.protobuf.ByteString value) {\n" + " $set_has_field_bit_builder$;\n" + " $name$_ = value;\n" + " $on_changed$\n" + "}\n"); +} + +void StringFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + // noop for primitives +} + +void StringFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $default$;\n"); +} + +void StringFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$_ = $default$;\n" + "$clear_has_field_bit_builder$;\n"); +} + +void StringFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + printer->Print(variables_, + "if (other.has$capitalized_name$()) {\n" + " set$capitalized_name$(other.get$capitalized_name$());\n" + "}\n"); +} + +void StringFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_from_local$) {\n" + " $set_has_field_bit_to_local$;\n" + "}\n" + "result.$name$_ = $name$_;\n"); +} + +void StringFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + printer->Print(variables_, + "$set_has_field_bit_builder$;\n" + "$name$_ = input.readBytes();\n"); +} + +void StringFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " output.writeBytes($number$, get$capitalized_name$Bytes());\n" + "}\n"); +} + +void StringFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "if ($get_has_field_bit_message$) {\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .computeBytesSize($number$, get$capitalized_name$Bytes());\n" + "}\n"); +} + +void StringFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + printer->Print(variables_, + "result = result && get$capitalized_name$()\n" + " .equals(other.get$capitalized_name$());\n"); +} + +void StringFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "hash = (37 * hash) + $constant_name$;\n"); + printer->Print(variables_, + "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); +} + +string StringFieldGenerator::GetBoxedType() const { + return "java.lang.String"; +} + + +// =================================================================== + +RepeatedStringFieldGenerator:: +RepeatedStringFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, + int builderBitIndex) + : descriptor_(descriptor), messageBitIndex_(messageBitIndex), + builderBitIndex_(builderBitIndex) { + SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, + &variables_); +} + +RepeatedStringFieldGenerator::~RepeatedStringFieldGenerator() {} + +int RepeatedStringFieldGenerator::GetNumBitsForMessage() const { + return 0; +} + +int RepeatedStringFieldGenerator::GetNumBitsForBuilder() const { + return 1; +} + +void RepeatedStringFieldGenerator:: +GenerateInterfaceMembers(io::Printer* printer) const { + printer->Print(variables_, + "$deprecation$java.util.List\n" + " get$capitalized_name$List();\n" + "$deprecation$int get$capitalized_name$Count();\n" + "$deprecation$java.lang.String get$capitalized_name$(int index);\n"); +} + + +void RepeatedStringFieldGenerator:: +GenerateMembers(io::Printer* printer) const { + printer->Print(variables_, + "private com.google.protobuf.LazyStringList $name$_;\n" + "$deprecation$public java.util.List\n" + " get$capitalized_name$List() {\n" + " return $name$_;\n" // note: unmodifiable list + "}\n" + "$deprecation$public int get$capitalized_name$Count() {\n" + " return $name$_.size();\n" + "}\n" + "$deprecation$public java.lang.String get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" + "}\n"); + + if (descriptor_->options().packed() && + HasGeneratedMethods(descriptor_->containing_type())) { + printer->Print(variables_, + "private int $name$MemoizedSerializedSize = -1;\n"); + } +} + +void RepeatedStringFieldGenerator:: +GenerateBuilderMembers(io::Printer* printer) const { + // One field is the list and the bit field keeps track of whether the + // list is immutable. If it's immutable, the invariant is that it must + // either an instance of Collections.emptyList() or it's an ArrayList + // wrapped in a Collections.unmodifiableList() wrapper and nobody else has + // a refererence to the underlying ArrayList. This invariant allows us to + // share instances of lists between protocol buffers avoiding expensive + // memory allocations. Note, immutable is a strong guarantee here -- not + // just that the list cannot be modified via the reference but that the + // list can never be modified. + printer->Print(variables_, + "private com.google.protobuf.LazyStringList $name$_ = $empty_list$;\n"); + + printer->Print(variables_, + "private void ensure$capitalized_name$IsMutable() {\n" + " if (!$get_mutable_bit_builder$) {\n" + " $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\n" + " $set_mutable_bit_builder$;\n" + " }\n" + "}\n"); + + // Note: We return an unmodifiable list because otherwise the caller + // could hold on to the returned list and modify it after the message + // has been built, thus mutating the message which is supposed to be + // immutable. + printer->Print(variables_, + "$deprecation$public java.util.List\n" + " get$capitalized_name$List() {\n" + " return java.util.Collections.unmodifiableList($name$_);\n" + "}\n" + "$deprecation$public int get$capitalized_name$Count() {\n" + " return $name$_.size();\n" + "}\n" + "$deprecation$public java.lang.String get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" + "}\n" + "$deprecation$public Builder set$capitalized_name$(\n" + " int index, java.lang.String value) {\n" + "$null_check$" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.set(index, value);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder add$capitalized_name$(\n" + " java.lang.String value) {\n" + "$null_check$" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.add(value);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder addAll$capitalized_name$(\n" + " java.lang.Iterable values) {\n" + " ensure$capitalized_name$IsMutable();\n" + " super.addAll(values, $name$_);\n" + " $on_changed$\n" + " return this;\n" + "}\n" + "$deprecation$public Builder clear$capitalized_name$() {\n" + " $name$_ = $empty_list$;\n" + " $clear_mutable_bit_builder$;\n" + " $on_changed$\n" + " return this;\n" + "}\n"); + + printer->Print(variables_, + "void add$capitalized_name$(com.google.protobuf.ByteString value) {\n" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.add(value);\n" + " $on_changed$\n" + "}\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateFieldBuilderInitializationCode(io::Printer* printer) const { + // noop for primitives +} + +void RepeatedStringFieldGenerator:: +GenerateInitializationCode(io::Printer* printer) const { + printer->Print(variables_, "$name$_ = $empty_list$;\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateBuilderClearCode(io::Printer* printer) const { + printer->Print(variables_, + "$name$_ = $empty_list$;\n" + "$clear_mutable_bit_builder$;\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateMergingCode(io::Printer* printer) const { + // The code below does two optimizations: + // 1. If the other list is empty, there's nothing to do. This ensures we + // don't allocate a new array if we already have an immutable one. + // 2. If the other list is non-empty and our current list is empty, we can + // reuse the other list which is guaranteed to be immutable. + printer->Print(variables_, + "if (!other.$name$_.isEmpty()) {\n" + " if ($name$_.isEmpty()) {\n" + " $name$_ = other.$name$_;\n" + " $clear_mutable_bit_builder$;\n" + " } else {\n" + " ensure$capitalized_name$IsMutable();\n" + " $name$_.addAll(other.$name$_);\n" + " }\n" + " $on_changed$\n" + "}\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateBuildingCode(io::Printer* printer) const { + // The code below ensures that the result has an immutable list. If our + // list is immutable, we can just reuse it. If not, we make it immutable. + + printer->Print(variables_, + "if ($get_mutable_bit_builder$) {\n" + " $name$_ = new com.google.protobuf.UnmodifiableLazyStringList(\n" + " $name$_);\n" + " $clear_mutable_bit_builder$;\n" + "}\n" + "result.$name$_ = $name$_;\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateParsingCode(io::Printer* printer) const { + printer->Print(variables_, + "ensure$capitalized_name$IsMutable();\n" + "$name$_.add(input.readBytes());\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateParsingCodeFromPacked(io::Printer* printer) const { + printer->Print(variables_, + "int length = input.readRawVarint32();\n" + "int limit = input.pushLimit(length);\n" + "while (input.getBytesUntilLimit() > 0) {\n" + " add$capitalized_name$(input.read$capitalized_type$());\n" + "}\n" + "input.popLimit(limit);\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateSerializationCode(io::Printer* printer) const { + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (get$capitalized_name$List().size() > 0) {\n" + " output.writeRawVarint32($tag$);\n" + " output.writeRawVarint32($name$MemoizedSerializedSize);\n" + "}\n" + "for (int i = 0; i < $name$_.size(); i++) {\n" + " output.write$capitalized_type$NoTag($name$_.get(i));\n" + "}\n"); + } else { + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " output.writeBytes($number$, $name$_.getByteString(i));\n" + "}\n"); + } +} + +void RepeatedStringFieldGenerator:: +GenerateSerializedSizeCode(io::Printer* printer) const { + printer->Print(variables_, + "{\n" + " int dataSize = 0;\n"); + printer->Indent(); + + printer->Print(variables_, + "for (int i = 0; i < $name$_.size(); i++) {\n" + " dataSize += com.google.protobuf.CodedOutputStream\n" + " .computeBytesSizeNoTag($name$_.getByteString(i));\n" + "}\n"); + + printer->Print( + "size += dataSize;\n"); + + if (descriptor_->options().packed()) { + printer->Print(variables_, + "if (!get$capitalized_name$List().isEmpty()) {\n" + " size += $tag_size$;\n" + " size += com.google.protobuf.CodedOutputStream\n" + " .computeInt32SizeNoTag(dataSize);\n" + "}\n"); + } else { + printer->Print(variables_, + "size += $tag_size$ * get$capitalized_name$List().size();\n"); + } + + // cache the data size for packed fields. + if (descriptor_->options().packed()) { + printer->Print(variables_, + "$name$MemoizedSerializedSize = dataSize;\n"); + } + + printer->Outdent(); + printer->Print("}\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateEqualsCode(io::Printer* printer) const { + printer->Print(variables_, + "result = result && get$capitalized_name$List()\n" + " .equals(other.get$capitalized_name$List());\n"); +} + +void RepeatedStringFieldGenerator:: +GenerateHashCode(io::Printer* printer) const { + printer->Print(variables_, + "if (get$capitalized_name$Count() > 0) {\n" + " hash = (37 * hash) + $constant_name$;\n" + " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" + "}\n"); +} + +string RepeatedStringFieldGenerator::GetBoxedType() const { + return "String"; +} + +} // namespace java +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h new file mode 100644 index 000000000..8cb414694 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h @@ -0,0 +1,120 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Author: jonp@google.com (Jon Perlow) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__ +#define GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace java { + +class StringFieldGenerator : public FieldGenerator { + public: + explicit StringFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~StringFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringFieldGenerator); +}; + +class RepeatedStringFieldGenerator : public FieldGenerator { + public: + explicit RepeatedStringFieldGenerator(const FieldDescriptor* descriptor, + int messageBitIndex, int builderBitIndex); + ~RepeatedStringFieldGenerator(); + + // implements FieldGenerator --------------------------------------- + int GetNumBitsForMessage() const; + int GetNumBitsForBuilder() const; + void GenerateInterfaceMembers(io::Printer* printer) const; + void GenerateMembers(io::Printer* printer) const; + void GenerateBuilderMembers(io::Printer* printer) const; + void GenerateInitializationCode(io::Printer* printer) const; + void GenerateBuilderClearCode(io::Printer* printer) const; + void GenerateMergingCode(io::Printer* printer) const; + void GenerateBuildingCode(io::Printer* printer) const; + void GenerateParsingCode(io::Printer* printer) const; + void GenerateParsingCodeFromPacked(io::Printer* printer) const; + void GenerateSerializationCode(io::Printer* printer) const; + void GenerateSerializedSizeCode(io::Printer* printer) const; + void GenerateFieldBuilderInitializationCode(io::Printer* printer) const; + void GenerateEqualsCode(io::Printer* printer) const; + void GenerateHashCode(io::Printer* printer) const; + string GetBoxedType() const; + + private: + const FieldDescriptor* descriptor_; + map variables_; + const int messageBitIndex_; + const int builderBitIndex_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedStringFieldGenerator); +}; + +} // namespace java +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_STRING_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc new file mode 100644 index 000000000..d9b0c3f9d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc @@ -0,0 +1,61 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include +#include +#include +#include + + +int main(int argc, char* argv[]) { + + google::protobuf::compiler::CommandLineInterface cli; + cli.AllowPlugins("protoc-"); + + // Proto2 C++ + google::protobuf::compiler::cpp::CppGenerator cpp_generator; + cli.RegisterGenerator("--cpp_out", &cpp_generator, + "Generate C++ header and source."); + + // Proto2 Java + google::protobuf::compiler::java::JavaGenerator java_generator; + cli.RegisterGenerator("--java_out", &java_generator, + "Generate Java source file."); + + + // Proto2 Python + google::protobuf::compiler::python::Generator py_generator; + cli.RegisterGenerator("--python_out", &py_generator, + "Generate Python source file."); + + return cli.Run(argc, argv); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc new file mode 100644 index 000000000..5b76af257 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc @@ -0,0 +1,231 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +// Returns the list of the names of files in all_files in the form of a +// comma-separated string. +string CommaSeparatedList(const vector all_files) { + vector names; + for (int i = 0; i < all_files.size(); i++) { + names.push_back(all_files[i]->name()); + } + return JoinStrings(names, ","); +} + +static const char* kFirstInsertionPointName = "first_mock_insertion_point"; +static const char* kSecondInsertionPointName = "second_mock_insertion_point"; +static const char* kFirstInsertionPoint = + "# @@protoc_insertion_point(first_mock_insertion_point) is here\n"; +static const char* kSecondInsertionPoint = + " # @@protoc_insertion_point(second_mock_insertion_point) is here\n"; + +MockCodeGenerator::MockCodeGenerator(const string& name) + : name_(name) {} + +MockCodeGenerator::~MockCodeGenerator() {} + +void MockCodeGenerator::ExpectGenerated( + const string& name, + const string& parameter, + const string& insertions, + const string& file, + const string& first_message_name, + const string& first_parsed_file_name, + const string& output_directory) { + string content; + ASSERT_TRUE(File::ReadFileToString( + output_directory + "/" + GetOutputFileName(name, file), &content)); + + vector lines; + SplitStringUsing(content, "\n", &lines); + + while (!lines.empty() && lines.back().empty()) { + lines.pop_back(); + } + for (int i = 0; i < lines.size(); i++) { + lines[i] += "\n"; + } + + vector insertion_list; + if (!insertions.empty()) { + SplitStringUsing(insertions, ",", &insertion_list); + } + + ASSERT_EQ(lines.size(), 3 + insertion_list.size() * 2); + EXPECT_EQ(GetOutputFileContent(name, parameter, file, + first_parsed_file_name, first_message_name), + lines[0]); + + EXPECT_EQ(kFirstInsertionPoint, lines[1 + insertion_list.size()]); + EXPECT_EQ(kSecondInsertionPoint, lines[2 + insertion_list.size() * 2]); + + for (int i = 0; i < insertion_list.size(); i++) { + EXPECT_EQ(GetOutputFileContent(insertion_list[i], "first_insert", + file, file, first_message_name), + lines[1 + i]); + // Second insertion point is indented, so the inserted text should + // automatically be indented too. + EXPECT_EQ(" " + GetOutputFileContent(insertion_list[i], "second_insert", + file, file, first_message_name), + lines[2 + insertion_list.size() + i]); + } +} + +bool MockCodeGenerator::Generate( + const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const { + for (int i = 0; i < file->message_type_count(); i++) { + if (HasPrefixString(file->message_type(i)->name(), "MockCodeGenerator_")) { + string command = StripPrefixString(file->message_type(i)->name(), + "MockCodeGenerator_"); + if (command == "Error") { + *error = "Saw message type MockCodeGenerator_Error."; + return false; + } else if (command == "Exit") { + cerr << "Saw message type MockCodeGenerator_Exit." << endl; + exit(123); + } else if (command == "Abort") { + cerr << "Saw message type MockCodeGenerator_Abort." << endl; + abort(); + } else { + GOOGLE_LOG(FATAL) << "Unknown MockCodeGenerator command: " << command; + } + } + } + + if (HasPrefixString(parameter, "insert=")) { + vector insert_into; + SplitStringUsing(StripPrefixString(parameter, "insert="), + ",", &insert_into); + + for (int i = 0; i < insert_into.size(); i++) { + { + scoped_ptr output( + context->OpenForInsert( + GetOutputFileName(insert_into[i], file), + kFirstInsertionPointName)); + io::Printer printer(output.get(), '$'); + printer.PrintRaw(GetOutputFileContent(name_, "first_insert", + file, context)); + if (printer.failed()) { + *error = "MockCodeGenerator detected write error."; + return false; + } + } + + { + scoped_ptr output( + context->OpenForInsert( + GetOutputFileName(insert_into[i], file), + kSecondInsertionPointName)); + io::Printer printer(output.get(), '$'); + printer.PrintRaw(GetOutputFileContent(name_, "second_insert", + file, context)); + if (printer.failed()) { + *error = "MockCodeGenerator detected write error."; + return false; + } + } + } + } else { + scoped_ptr output( + context->Open(GetOutputFileName(name_, file))); + + io::Printer printer(output.get(), '$'); + printer.PrintRaw(GetOutputFileContent(name_, parameter, + file, context)); + printer.PrintRaw(kFirstInsertionPoint); + printer.PrintRaw(kSecondInsertionPoint); + + if (printer.failed()) { + *error = "MockCodeGenerator detected write error."; + return false; + } + } + + return true; +} + +string MockCodeGenerator::GetOutputFileName(const string& generator_name, + const FileDescriptor* file) { + return GetOutputFileName(generator_name, file->name()); +} + +string MockCodeGenerator::GetOutputFileName(const string& generator_name, + const string& file) { + return file + ".MockCodeGenerator." + generator_name; +} + +string MockCodeGenerator::GetOutputFileContent( + const string& generator_name, + const string& parameter, + const FileDescriptor* file, + GeneratorContext *context) { + vector all_files; + context->ListParsedFiles(&all_files); + return GetOutputFileContent( + generator_name, parameter, file->name(), + CommaSeparatedList(all_files), + file->message_type_count() > 0 ? + file->message_type(0)->name() : "(none)"); +} + +string MockCodeGenerator::GetOutputFileContent( + const string& generator_name, + const string& parameter, + const string& file, + const string& parsed_file_list, + const string& first_message_name) { + return strings::Substitute("$0: $1, $2, $3, $4\n", + generator_name, parameter, file, + first_message_name, parsed_file_list); +} + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h new file mode 100644 index 000000000..5c7942bda --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h @@ -0,0 +1,113 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#ifndef GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__ +#define GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__ + +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +// A mock CodeGenerator, used by command_line_interface_unittest. This is in +// its own file so that it can be used both directly and as a plugin. +// +// Generate() produces some output which can be checked by ExpectCalled(). The +// generator can run in a different process (e.g. a plugin). +// +// If the parameter is "insert=NAMES", the MockCodeGenerator will insert lines +// into the files generated by other MockCodeGenerators instead of creating +// its own file. NAMES is a comma-separated list of the names of those other +// MockCodeGenerators. +// +// MockCodeGenerator will also modify its behavior slightly if the input file +// contains a message type with one of the following names: +// MockCodeGenerator_Error: Causes Generate() to return false and set the +// error message to "Saw message type MockCodeGenerator_Error." +// MockCodeGenerator_Exit: Generate() prints "Saw message type +// MockCodeGenerator_Exit." to stderr and then calls exit(123). +// MockCodeGenerator_Abort: Generate() prints "Saw message type +// MockCodeGenerator_Abort." to stderr and then calls abort(). +class MockCodeGenerator : public CodeGenerator { + public: + MockCodeGenerator(const string& name); + virtual ~MockCodeGenerator(); + + // Expect (via gTest) that a MockCodeGenerator with the given name was called + // with the given parameters by inspecting the output location. + // + // |insertions| is a comma-separated list of names of MockCodeGenerators which + // should have inserted lines into this file. + // |parsed_file_list| is a comma-separated list of names of the files + // that are being compiled together in this run. + static void ExpectGenerated(const string& name, + const string& parameter, + const string& insertions, + const string& file, + const string& first_message_name, + const string& parsed_file_list, + const string& output_directory); + + // Get the name of the file which would be written by the given generator. + static string GetOutputFileName(const string& generator_name, + const FileDescriptor* file); + static string GetOutputFileName(const string& generator_name, + const string& file); + + // implements CodeGenerator ---------------------------------------- + + virtual bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const; + + private: + string name_; + + static string GetOutputFileContent(const string& generator_name, + const string& parameter, + const FileDescriptor* file, + GeneratorContext *context); + static string GetOutputFileContent(const string& generator_name, + const string& parameter, + const string& file, + const string& parsed_file_list, + const string& first_message_name); +}; + +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_MOCK_CODE_GENERATOR_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h new file mode 100644 index 000000000..b89712674 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h @@ -0,0 +1,64 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file exists solely to document the google::protobuf::compiler namespace. +// It is not compiled into anything, but it may be read by an automated +// documentation generator. + +namespace google { + +namespace protobuf { + +// Implementation of the Protocol Buffer compiler. +// +// This package contains code for parsing .proto files and generating code +// based on them. There are two reasons you might be interested in this +// package: +// - You want to parse .proto files at runtime. In this case, you should +// look at importer.h. Since this functionality is widely useful, it is +// included in the libprotobuf base library; you do not have to link against +// libprotoc. +// - You want to write a custom protocol compiler which generates different +// kinds of code, e.g. code in a different language which is not supported +// by the official compiler. For this purpose, command_line_interface.h +// provides you with a complete compiler front-end, so all you need to do +// is write a custom implementation of CodeGenerator and a trivial main() +// function. You can even make your compiler support the official languages +// in addition to your own. Since this functionality is only useful to those +// writing custom compilers, it is in a separate library called "libprotoc" +// which you will have to link against. +namespace compiler {} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc new file mode 100644 index 000000000..34317b1fd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc @@ -0,0 +1,1473 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Recursive descent FTW. + +#include +#include +#include + + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +using internal::WireFormat; + +namespace { + +typedef hash_map TypeNameMap; + +TypeNameMap MakeTypeNameTable() { + TypeNameMap result; + + result["double" ] = FieldDescriptorProto::TYPE_DOUBLE; + result["float" ] = FieldDescriptorProto::TYPE_FLOAT; + result["uint64" ] = FieldDescriptorProto::TYPE_UINT64; + result["fixed64" ] = FieldDescriptorProto::TYPE_FIXED64; + result["fixed32" ] = FieldDescriptorProto::TYPE_FIXED32; + result["bool" ] = FieldDescriptorProto::TYPE_BOOL; + result["string" ] = FieldDescriptorProto::TYPE_STRING; + result["group" ] = FieldDescriptorProto::TYPE_GROUP; + + result["bytes" ] = FieldDescriptorProto::TYPE_BYTES; + result["uint32" ] = FieldDescriptorProto::TYPE_UINT32; + result["sfixed32"] = FieldDescriptorProto::TYPE_SFIXED32; + result["sfixed64"] = FieldDescriptorProto::TYPE_SFIXED64; + result["int32" ] = FieldDescriptorProto::TYPE_INT32; + result["int64" ] = FieldDescriptorProto::TYPE_INT64; + result["sint32" ] = FieldDescriptorProto::TYPE_SINT32; + result["sint64" ] = FieldDescriptorProto::TYPE_SINT64; + + return result; +} + +const TypeNameMap kTypeNames = MakeTypeNameTable(); + +} // anonymous namespace + +// Makes code slightly more readable. The meaning of "DO(foo)" is +// "Execute foo and fail if it fails.", where failure is indicated by +// returning false. +#define DO(STATEMENT) if (STATEMENT) {} else return false + +// =================================================================== + +Parser::Parser() + : input_(NULL), + error_collector_(NULL), + source_location_table_(NULL), + had_errors_(false), + require_syntax_identifier_(false), + stop_after_syntax_identifier_(false) { +} + +Parser::~Parser() { +} + +// =================================================================== + +inline bool Parser::LookingAt(const char* text) { + return input_->current().text == text; +} + +inline bool Parser::LookingAtType(io::Tokenizer::TokenType token_type) { + return input_->current().type == token_type; +} + +inline bool Parser::AtEnd() { + return LookingAtType(io::Tokenizer::TYPE_END); +} + +bool Parser::TryConsume(const char* text) { + if (LookingAt(text)) { + input_->Next(); + return true; + } else { + return false; + } +} + +bool Parser::Consume(const char* text, const char* error) { + if (TryConsume(text)) { + return true; + } else { + AddError(error); + return false; + } +} + +bool Parser::Consume(const char* text) { + if (TryConsume(text)) { + return true; + } else { + AddError("Expected \"" + string(text) + "\"."); + return false; + } +} + +bool Parser::ConsumeIdentifier(string* output, const char* error) { + if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + *output = input_->current().text; + input_->Next(); + return true; + } else { + AddError(error); + return false; + } +} + +bool Parser::ConsumeInteger(int* output, const char* error) { + if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + uint64 value = 0; + if (!io::Tokenizer::ParseInteger(input_->current().text, + kint32max, &value)) { + AddError("Integer out of range."); + // We still return true because we did, in fact, parse an integer. + } + *output = value; + input_->Next(); + return true; + } else { + AddError(error); + return false; + } +} + +bool Parser::ConsumeInteger64(uint64 max_value, uint64* output, + const char* error) { + if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + if (!io::Tokenizer::ParseInteger(input_->current().text, max_value, + output)) { + AddError("Integer out of range."); + // We still return true because we did, in fact, parse an integer. + *output = 0; + } + input_->Next(); + return true; + } else { + AddError(error); + return false; + } +} + +bool Parser::ConsumeNumber(double* output, const char* error) { + if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) { + *output = io::Tokenizer::ParseFloat(input_->current().text); + input_->Next(); + return true; + } else if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + // Also accept integers. + uint64 value = 0; + if (!io::Tokenizer::ParseInteger(input_->current().text, + kuint64max, &value)) { + AddError("Integer out of range."); + // We still return true because we did, in fact, parse a number. + } + *output = value; + input_->Next(); + return true; + } else if (LookingAt("inf")) { + *output = numeric_limits::infinity(); + input_->Next(); + return true; + } else if (LookingAt("nan")) { + *output = numeric_limits::quiet_NaN(); + input_->Next(); + return true; + } else { + AddError(error); + return false; + } +} + +bool Parser::ConsumeString(string* output, const char* error) { + if (LookingAtType(io::Tokenizer::TYPE_STRING)) { + io::Tokenizer::ParseString(input_->current().text, output); + input_->Next(); + // Allow C++ like concatenation of adjacent string tokens. + while (LookingAtType(io::Tokenizer::TYPE_STRING)) { + io::Tokenizer::ParseStringAppend(input_->current().text, output); + input_->Next(); + } + return true; + } else { + AddError(error); + return false; + } +} + +// ------------------------------------------------------------------- + +void Parser::AddError(int line, int column, const string& error) { + if (error_collector_ != NULL) { + error_collector_->AddError(line, column, error); + } + had_errors_ = true; +} + +void Parser::AddError(const string& error) { + AddError(input_->current().line, input_->current().column, error); +} + +// ------------------------------------------------------------------- + +Parser::LocationRecorder::LocationRecorder(Parser* parser) + : parser_(parser), + location_(parser_->source_code_info_->add_location()) { + location_->add_span(parser_->input_->current().line); + location_->add_span(parser_->input_->current().column); +} + +Parser::LocationRecorder::LocationRecorder(const LocationRecorder& parent) { + Init(parent); +} + +Parser::LocationRecorder::LocationRecorder(const LocationRecorder& parent, + int path1) { + Init(parent); + AddPath(path1); +} + +Parser::LocationRecorder::LocationRecorder(const LocationRecorder& parent, + int path1, int path2) { + Init(parent); + AddPath(path1); + AddPath(path2); +} + +void Parser::LocationRecorder::Init(const LocationRecorder& parent) { + parser_ = parent.parser_; + location_ = parser_->source_code_info_->add_location(); + location_->mutable_path()->CopyFrom(parent.location_->path()); + + location_->add_span(parser_->input_->current().line); + location_->add_span(parser_->input_->current().column); +} + +Parser::LocationRecorder::~LocationRecorder() { + if (location_->span_size() <= 2) { + EndAt(parser_->input_->previous()); + } +} + +void Parser::LocationRecorder::AddPath(int path_component) { + location_->add_path(path_component); +} + +void Parser::LocationRecorder::StartAt(const io::Tokenizer::Token& token) { + location_->set_span(0, token.line); + location_->set_span(1, token.column); +} + +void Parser::LocationRecorder::EndAt(const io::Tokenizer::Token& token) { + if (token.line != location_->span(0)) { + location_->add_span(token.line); + } + location_->add_span(token.end_column); +} + +void Parser::LocationRecorder::RecordLegacyLocation(const Message* descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location) { + if (parser_->source_location_table_ != NULL) { + parser_->source_location_table_->Add( + descriptor, location, location_->span(0), location_->span(1)); + } +} + +// ------------------------------------------------------------------- + +void Parser::SkipStatement() { + while (true) { + if (AtEnd()) { + return; + } else if (LookingAtType(io::Tokenizer::TYPE_SYMBOL)) { + if (TryConsume(";")) { + return; + } else if (TryConsume("{")) { + SkipRestOfBlock(); + return; + } else if (LookingAt("}")) { + return; + } + } + input_->Next(); + } +} + +void Parser::SkipRestOfBlock() { + while (true) { + if (AtEnd()) { + return; + } else if (LookingAtType(io::Tokenizer::TYPE_SYMBOL)) { + if (TryConsume("}")) { + return; + } else if (TryConsume("{")) { + SkipRestOfBlock(); + } + } + input_->Next(); + } +} + +// =================================================================== + +bool Parser::Parse(io::Tokenizer* input, FileDescriptorProto* file) { + input_ = input; + had_errors_ = false; + syntax_identifier_.clear(); + + // Note that |file| could be NULL at this point if + // stop_after_syntax_identifier_ is true. So, we conservatively allocate + // SourceCodeInfo on the stack, then swap it into the FileDescriptorProto + // later on. + SourceCodeInfo source_code_info; + source_code_info_ = &source_code_info; + + if (LookingAtType(io::Tokenizer::TYPE_START)) { + // Advance to first token. + input_->Next(); + } + + { + LocationRecorder root_location(this); + + if (require_syntax_identifier_ || LookingAt("syntax")) { + if (!ParseSyntaxIdentifier()) { + // Don't attempt to parse the file if we didn't recognize the syntax + // identifier. + return false; + } + } else if (!stop_after_syntax_identifier_) { + syntax_identifier_ = "proto2"; + } + + if (stop_after_syntax_identifier_) return !had_errors_; + + // Repeatedly parse statements until we reach the end of the file. + while (!AtEnd()) { + if (!ParseTopLevelStatement(file, root_location)) { + // This statement failed to parse. Skip it, but keep looping to parse + // other statements. + SkipStatement(); + + if (LookingAt("}")) { + AddError("Unmatched \"}\"."); + input_->Next(); + } + } + } + } + + input_ = NULL; + source_code_info_ = NULL; + source_code_info.Swap(file->mutable_source_code_info()); + return !had_errors_; +} + +bool Parser::ParseSyntaxIdentifier() { + DO(Consume("syntax", "File must begin with 'syntax = \"proto2\";'.")); + DO(Consume("=")); + io::Tokenizer::Token syntax_token = input_->current(); + string syntax; + DO(ConsumeString(&syntax, "Expected syntax identifier.")); + DO(Consume(";")); + + syntax_identifier_ = syntax; + + if (syntax != "proto2" && !stop_after_syntax_identifier_) { + AddError(syntax_token.line, syntax_token.column, + "Unrecognized syntax identifier \"" + syntax + "\". This parser " + "only recognizes \"proto2\"."); + return false; + } + + return true; +} + +bool Parser::ParseTopLevelStatement(FileDescriptorProto* file, + const LocationRecorder& root_location) { + if (TryConsume(";")) { + // empty statement; ignore + return true; + } else if (LookingAt("message")) { + LocationRecorder location(root_location, + FileDescriptorProto::kMessageTypeFieldNumber, file->message_type_size()); + return ParseMessageDefinition(file->add_message_type(), location); + } else if (LookingAt("enum")) { + LocationRecorder location(root_location, + FileDescriptorProto::kEnumTypeFieldNumber, file->enum_type_size()); + return ParseEnumDefinition(file->add_enum_type(), location); + } else if (LookingAt("service")) { + LocationRecorder location(root_location, + FileDescriptorProto::kServiceFieldNumber, file->service_size()); + return ParseServiceDefinition(file->add_service(), location); + } else if (LookingAt("extend")) { + LocationRecorder location(root_location, + FileDescriptorProto::kExtensionFieldNumber); + return ParseExtend(file->mutable_extension(), + file->mutable_message_type(), + root_location, + FileDescriptorProto::kMessageTypeFieldNumber, + location); + } else if (LookingAt("import")) { + int index = file->dependency_size(); + return ParseImport(file->add_dependency(), root_location, index); + } else if (LookingAt("package")) { + return ParsePackage(file, root_location); + } else if (LookingAt("option")) { + LocationRecorder location(root_location, + FileDescriptorProto::kOptionsFieldNumber); + return ParseOption(file->mutable_options(), location); + } else { + AddError("Expected top-level statement (e.g. \"message\")."); + return false; + } +} + +// ------------------------------------------------------------------- +// Messages + +bool Parser::ParseMessageDefinition(DescriptorProto* message, + const LocationRecorder& message_location) { + DO(Consume("message")); + { + LocationRecorder location(message_location, + DescriptorProto::kNameFieldNumber); + location.RecordLegacyLocation( + message, DescriptorPool::ErrorCollector::NAME); + DO(ConsumeIdentifier(message->mutable_name(), "Expected message name.")); + } + DO(ParseMessageBlock(message, message_location)); + return true; +} + +bool Parser::ParseMessageBlock(DescriptorProto* message, + const LocationRecorder& message_location) { + DO(Consume("{")); + + while (!TryConsume("}")) { + if (AtEnd()) { + AddError("Reached end of input in message definition (missing '}')."); + return false; + } + + if (!ParseMessageStatement(message, message_location)) { + // This statement failed to parse. Skip it, but keep looping to parse + // other statements. + SkipStatement(); + } + } + + return true; +} + +bool Parser::ParseMessageStatement(DescriptorProto* message, + const LocationRecorder& message_location) { + if (TryConsume(";")) { + // empty statement; ignore + return true; + } else if (LookingAt("message")) { + LocationRecorder location(message_location, + DescriptorProto::kNestedTypeFieldNumber, + message->nested_type_size()); + return ParseMessageDefinition(message->add_nested_type(), location); + } else if (LookingAt("enum")) { + LocationRecorder location(message_location, + DescriptorProto::kEnumTypeFieldNumber, + message->enum_type_size()); + return ParseEnumDefinition(message->add_enum_type(), location); + } else if (LookingAt("extensions")) { + LocationRecorder location(message_location, + DescriptorProto::kExtensionRangeFieldNumber); + return ParseExtensions(message, location); + } else if (LookingAt("extend")) { + LocationRecorder location(message_location, + DescriptorProto::kExtensionFieldNumber); + return ParseExtend(message->mutable_extension(), + message->mutable_nested_type(), + message_location, + DescriptorProto::kNestedTypeFieldNumber, + location); + } else if (LookingAt("option")) { + LocationRecorder location(message_location, + DescriptorProto::kOptionsFieldNumber); + return ParseOption(message->mutable_options(), location); + } else { + LocationRecorder location(message_location, + DescriptorProto::kFieldFieldNumber, + message->field_size()); + return ParseMessageField(message->add_field(), + message->mutable_nested_type(), + message_location, + DescriptorProto::kNestedTypeFieldNumber, + location); + } +} + +bool Parser::ParseMessageField(FieldDescriptorProto* field, + RepeatedPtrField* messages, + const LocationRecorder& parent_location, + int location_field_number_for_nested_type, + const LocationRecorder& field_location) { + // Parse label and type. + io::Tokenizer::Token label_token = input_->current(); + { + LocationRecorder location(field_location, + FieldDescriptorProto::kLabelFieldNumber); + FieldDescriptorProto::Label label; + DO(ParseLabel(&label)); + field->set_label(label); + } + + { + LocationRecorder location(field_location); // add path later + location.RecordLegacyLocation(field, DescriptorPool::ErrorCollector::TYPE); + + FieldDescriptorProto::Type type = FieldDescriptorProto::TYPE_INT32; + string type_name; + DO(ParseType(&type, &type_name)); + if (type_name.empty()) { + location.AddPath(FieldDescriptorProto::kTypeFieldNumber); + field->set_type(type); + } else { + location.AddPath(FieldDescriptorProto::kTypeNameFieldNumber); + field->set_type_name(type_name); + } + } + + // Parse name and '='. + io::Tokenizer::Token name_token = input_->current(); + { + LocationRecorder location(field_location, + FieldDescriptorProto::kNameFieldNumber); + location.RecordLegacyLocation(field, DescriptorPool::ErrorCollector::NAME); + DO(ConsumeIdentifier(field->mutable_name(), "Expected field name.")); + } + DO(Consume("=", "Missing field number.")); + + // Parse field number. + { + LocationRecorder location(field_location, + FieldDescriptorProto::kNumberFieldNumber); + location.RecordLegacyLocation( + field, DescriptorPool::ErrorCollector::NUMBER); + int number; + DO(ConsumeInteger(&number, "Expected field number.")); + field->set_number(number); + } + + // Parse options. + DO(ParseFieldOptions(field, field_location)); + + // Deal with groups. + if (field->has_type() && field->type() == FieldDescriptorProto::TYPE_GROUP) { + // Awkward: Since a group declares both a message type and a field, we + // have to create overlapping locations. + LocationRecorder group_location(parent_location); + group_location.StartAt(label_token); + group_location.AddPath(location_field_number_for_nested_type); + group_location.AddPath(messages->size()); + + DescriptorProto* group = messages->Add(); + group->set_name(field->name()); + + // Record name location to match the field name's location. + { + LocationRecorder location(group_location, + DescriptorProto::kNameFieldNumber); + location.StartAt(name_token); + location.EndAt(name_token); + location.RecordLegacyLocation( + group, DescriptorPool::ErrorCollector::NAME); + } + + // The field's type_name also comes from the name. Confusing! + { + LocationRecorder location(field_location, + FieldDescriptorProto::kTypeNameFieldNumber); + location.StartAt(name_token); + location.EndAt(name_token); + } + + // As a hack for backwards-compatibility, we force the group name to start + // with a capital letter and lower-case the field name. New code should + // not use groups; it should use nested messages. + if (group->name()[0] < 'A' || 'Z' < group->name()[0]) { + AddError(name_token.line, name_token.column, + "Group names must start with a capital letter."); + } + LowerString(field->mutable_name()); + + field->set_type_name(group->name()); + if (LookingAt("{")) { + DO(ParseMessageBlock(group, group_location)); + } else { + AddError("Missing group body."); + return false; + } + } else { + DO(Consume(";")); + } + + return true; +} + +bool Parser::ParseFieldOptions(FieldDescriptorProto* field, + const LocationRecorder& field_location) { + if (!LookingAt("[")) return true; + + LocationRecorder location(field_location, + FieldDescriptorProto::kOptionsFieldNumber); + + DO(Consume("[")); + + // Parse field options. + do { + if (LookingAt("default")) { + // We intentionally pass field_location rather than location here, since + // the default value is not actually an option. + DO(ParseDefaultAssignment(field, field_location)); + } else { + DO(ParseOptionAssignment(field->mutable_options(), location)); + } + } while (TryConsume(",")); + + DO(Consume("]")); + return true; +} + +bool Parser::ParseDefaultAssignment(FieldDescriptorProto* field, + const LocationRecorder& field_location) { + if (field->has_default_value()) { + AddError("Already set option \"default\"."); + field->clear_default_value(); + } + + DO(Consume("default")); + DO(Consume("=")); + + LocationRecorder location(field_location, + FieldDescriptorProto::kDefaultValueFieldNumber); + location.RecordLegacyLocation( + field, DescriptorPool::ErrorCollector::DEFAULT_VALUE); + string* default_value = field->mutable_default_value(); + + if (!field->has_type()) { + // The field has a type name, but we don't know if it is a message or an + // enum yet. Assume an enum for now. + DO(ConsumeIdentifier(default_value, "Expected identifier.")); + return true; + } + + switch (field->type()) { + case FieldDescriptorProto::TYPE_INT32: + case FieldDescriptorProto::TYPE_INT64: + case FieldDescriptorProto::TYPE_SINT32: + case FieldDescriptorProto::TYPE_SINT64: + case FieldDescriptorProto::TYPE_SFIXED32: + case FieldDescriptorProto::TYPE_SFIXED64: { + uint64 max_value = kint64max; + if (field->type() == FieldDescriptorProto::TYPE_INT32 || + field->type() == FieldDescriptorProto::TYPE_SINT32 || + field->type() == FieldDescriptorProto::TYPE_SFIXED32) { + max_value = kint32max; + } + + // These types can be negative. + if (TryConsume("-")) { + default_value->append("-"); + // Two's complement always has one more negative value than positive. + ++max_value; + } + // Parse the integer to verify that it is not out-of-range. + uint64 value; + DO(ConsumeInteger64(max_value, &value, "Expected integer.")); + // And stringify it again. + default_value->append(SimpleItoa(value)); + break; + } + + case FieldDescriptorProto::TYPE_UINT32: + case FieldDescriptorProto::TYPE_UINT64: + case FieldDescriptorProto::TYPE_FIXED32: + case FieldDescriptorProto::TYPE_FIXED64: { + uint64 max_value = kuint64max; + if (field->type() == FieldDescriptorProto::TYPE_UINT32 || + field->type() == FieldDescriptorProto::TYPE_FIXED32) { + max_value = kuint32max; + } + + // Numeric, not negative. + if (TryConsume("-")) { + AddError("Unsigned field can't have negative default value."); + } + // Parse the integer to verify that it is not out-of-range. + uint64 value; + DO(ConsumeInteger64(max_value, &value, "Expected integer.")); + // And stringify it again. + default_value->append(SimpleItoa(value)); + break; + } + + case FieldDescriptorProto::TYPE_FLOAT: + case FieldDescriptorProto::TYPE_DOUBLE: + // These types can be negative. + if (TryConsume("-")) { + default_value->append("-"); + } + // Parse the integer because we have to convert hex integers to decimal + // floats. + double value; + DO(ConsumeNumber(&value, "Expected number.")); + // And stringify it again. + default_value->append(SimpleDtoa(value)); + break; + + case FieldDescriptorProto::TYPE_BOOL: + if (TryConsume("true")) { + default_value->assign("true"); + } else if (TryConsume("false")) { + default_value->assign("false"); + } else { + AddError("Expected \"true\" or \"false\"."); + return false; + } + break; + + case FieldDescriptorProto::TYPE_STRING: + DO(ConsumeString(default_value, "Expected string.")); + break; + + case FieldDescriptorProto::TYPE_BYTES: + DO(ConsumeString(default_value, "Expected string.")); + *default_value = CEscape(*default_value); + break; + + case FieldDescriptorProto::TYPE_ENUM: + DO(ConsumeIdentifier(default_value, "Expected identifier.")); + break; + + case FieldDescriptorProto::TYPE_MESSAGE: + case FieldDescriptorProto::TYPE_GROUP: + AddError("Messages can't have default values."); + return false; + } + + return true; +} + +bool Parser::ParseOptionNamePart(UninterpretedOption* uninterpreted_option, + const LocationRecorder& part_location) { + UninterpretedOption::NamePart* name = uninterpreted_option->add_name(); + string identifier; // We parse identifiers into this string. + if (LookingAt("(")) { // This is an extension. + DO(Consume("(")); + + { + LocationRecorder location( + part_location, UninterpretedOption::NamePart::kNamePartFieldNumber); + // An extension name consists of dot-separated identifiers, and may begin + // with a dot. + if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + DO(ConsumeIdentifier(&identifier, "Expected identifier.")); + name->mutable_name_part()->append(identifier); + } + while (LookingAt(".")) { + DO(Consume(".")); + name->mutable_name_part()->append("."); + DO(ConsumeIdentifier(&identifier, "Expected identifier.")); + name->mutable_name_part()->append(identifier); + } + } + + DO(Consume(")")); + name->set_is_extension(true); + } else { // This is a regular field. + LocationRecorder location( + part_location, UninterpretedOption::NamePart::kNamePartFieldNumber); + DO(ConsumeIdentifier(&identifier, "Expected identifier.")); + name->mutable_name_part()->append(identifier); + name->set_is_extension(false); + } + return true; +} + +bool Parser::ParseUninterpretedBlock(string* value) { + // Note that enclosing braces are not added to *value. + DO(Consume("{")); + int brace_depth = 1; + while (!AtEnd()) { + if (LookingAt("{")) { + brace_depth++; + } else if (LookingAt("}")) { + brace_depth--; + if (brace_depth == 0) { + input_->Next(); + return true; + } + } + // TODO(sanjay): Interpret line/column numbers to preserve formatting + if (!value->empty()) value->push_back(' '); + value->append(input_->current().text); + input_->Next(); + } + AddError("Unexpected end of stream while parsing aggregate value."); + return false; +} + +// We don't interpret the option here. Instead we store it in an +// UninterpretedOption, to be interpreted later. +bool Parser::ParseOptionAssignment(Message* options, + const LocationRecorder& options_location) { + // Create an entry in the uninterpreted_option field. + const FieldDescriptor* uninterpreted_option_field = options->GetDescriptor()-> + FindFieldByName("uninterpreted_option"); + GOOGLE_CHECK(uninterpreted_option_field != NULL) + << "No field named \"uninterpreted_option\" in the Options proto."; + + const Reflection* reflection = options->GetReflection(); + + LocationRecorder location( + options_location, uninterpreted_option_field->number(), + reflection->FieldSize(*options, uninterpreted_option_field)); + + UninterpretedOption* uninterpreted_option = down_cast( + options->GetReflection()->AddMessage(options, + uninterpreted_option_field)); + + // Parse dot-separated name. + { + LocationRecorder name_location(location, + UninterpretedOption::kNameFieldNumber); + name_location.RecordLegacyLocation( + uninterpreted_option, DescriptorPool::ErrorCollector::OPTION_NAME); + + { + LocationRecorder part_location(name_location, + uninterpreted_option->name_size()); + DO(ParseOptionNamePart(uninterpreted_option, part_location)); + } + + while (LookingAt(".")) { + DO(Consume(".")); + LocationRecorder part_location(name_location, + uninterpreted_option->name_size()); + DO(ParseOptionNamePart(uninterpreted_option, part_location)); + } + } + + DO(Consume("=")); + + LocationRecorder value_location(location); + value_location.RecordLegacyLocation( + uninterpreted_option, DescriptorPool::ErrorCollector::OPTION_VALUE); + + // All values are a single token, except for negative numbers, which consist + // of a single '-' symbol, followed by a positive number. + bool is_negative = TryConsume("-"); + + switch (input_->current().type) { + case io::Tokenizer::TYPE_START: + GOOGLE_LOG(FATAL) << "Trying to read value before any tokens have been read."; + return false; + + case io::Tokenizer::TYPE_END: + AddError("Unexpected end of stream while parsing option value."); + return false; + + case io::Tokenizer::TYPE_IDENTIFIER: { + value_location.AddPath(UninterpretedOption::kIdentifierValueFieldNumber); + if (is_negative) { + AddError("Invalid '-' symbol before identifier."); + return false; + } + string value; + DO(ConsumeIdentifier(&value, "Expected identifier.")); + uninterpreted_option->set_identifier_value(value); + break; + } + + case io::Tokenizer::TYPE_INTEGER: { + uint64 value; + uint64 max_value = + is_negative ? static_cast(kint64max) + 1 : kuint64max; + DO(ConsumeInteger64(max_value, &value, "Expected integer.")); + if (is_negative) { + value_location.AddPath( + UninterpretedOption::kNegativeIntValueFieldNumber); + uninterpreted_option->set_negative_int_value(-static_cast(value)); + } else { + value_location.AddPath( + UninterpretedOption::kPositiveIntValueFieldNumber); + uninterpreted_option->set_positive_int_value(value); + } + break; + } + + case io::Tokenizer::TYPE_FLOAT: { + value_location.AddPath(UninterpretedOption::kDoubleValueFieldNumber); + double value; + DO(ConsumeNumber(&value, "Expected number.")); + uninterpreted_option->set_double_value(is_negative ? -value : value); + break; + } + + case io::Tokenizer::TYPE_STRING: { + value_location.AddPath(UninterpretedOption::kStringValueFieldNumber); + if (is_negative) { + AddError("Invalid '-' symbol before string."); + return false; + } + string value; + DO(ConsumeString(&value, "Expected string.")); + uninterpreted_option->set_string_value(value); + break; + } + + case io::Tokenizer::TYPE_SYMBOL: + if (LookingAt("{")) { + value_location.AddPath(UninterpretedOption::kAggregateValueFieldNumber); + DO(ParseUninterpretedBlock( + uninterpreted_option->mutable_aggregate_value())); + } else { + AddError("Expected option value."); + return false; + } + break; + } + + return true; +} + +bool Parser::ParseExtensions(DescriptorProto* message, + const LocationRecorder& extensions_location) { + // Parse the declaration. + DO(Consume("extensions")); + + do { + // Note that kExtensionRangeFieldNumber was already pushed by the parent. + LocationRecorder location(extensions_location, + message->extension_range_size()); + + DescriptorProto::ExtensionRange* range = message->add_extension_range(); + location.RecordLegacyLocation( + range, DescriptorPool::ErrorCollector::NUMBER); + + int start, end; + io::Tokenizer::Token start_token; + + { + LocationRecorder start_location( + location, DescriptorProto::ExtensionRange::kStartFieldNumber); + start_token = input_->current(); + DO(ConsumeInteger(&start, "Expected field number range.")); + } + + if (TryConsume("to")) { + LocationRecorder end_location( + location, DescriptorProto::ExtensionRange::kEndFieldNumber); + if (TryConsume("max")) { + end = FieldDescriptor::kMaxNumber; + } else { + DO(ConsumeInteger(&end, "Expected integer.")); + } + } else { + LocationRecorder end_location( + location, DescriptorProto::ExtensionRange::kEndFieldNumber); + end_location.StartAt(start_token); + end_location.EndAt(start_token); + end = start; + } + + // Users like to specify inclusive ranges, but in code we like the end + // number to be exclusive. + ++end; + + range->set_start(start); + range->set_end(end); + } while (TryConsume(",")); + + DO(Consume(";")); + return true; +} + +bool Parser::ParseExtend(RepeatedPtrField* extensions, + RepeatedPtrField* messages, + const LocationRecorder& parent_location, + int location_field_number_for_nested_type, + const LocationRecorder& extend_location) { + DO(Consume("extend")); + + // Parse the extendee type. + io::Tokenizer::Token extendee_start = input_->current(); + string extendee; + DO(ParseUserDefinedType(&extendee)); + io::Tokenizer::Token extendee_end = input_->previous(); + + // Parse the block. + DO(Consume("{")); + + bool is_first = true; + + do { + if (AtEnd()) { + AddError("Reached end of input in extend definition (missing '}')."); + return false; + } + + // Note that kExtensionFieldNumber was already pushed by the parent. + LocationRecorder location(extend_location, extensions->size()); + + FieldDescriptorProto* field = extensions->Add(); + + { + LocationRecorder extendee_location( + location, FieldDescriptorProto::kExtendeeFieldNumber); + extendee_location.StartAt(extendee_start); + extendee_location.EndAt(extendee_end); + + if (is_first) { + extendee_location.RecordLegacyLocation( + field, DescriptorPool::ErrorCollector::EXTENDEE); + is_first = false; + } + } + + field->set_extendee(extendee); + + if (!ParseMessageField(field, messages, parent_location, + location_field_number_for_nested_type, + location)) { + // This statement failed to parse. Skip it, but keep looping to parse + // other statements. + SkipStatement(); + } + } while(!TryConsume("}")); + + return true; +} + +// ------------------------------------------------------------------- +// Enums + +bool Parser::ParseEnumDefinition(EnumDescriptorProto* enum_type, + const LocationRecorder& enum_location) { + DO(Consume("enum")); + + { + LocationRecorder location(enum_location, + EnumDescriptorProto::kNameFieldNumber); + location.RecordLegacyLocation( + enum_type, DescriptorPool::ErrorCollector::NAME); + DO(ConsumeIdentifier(enum_type->mutable_name(), "Expected enum name.")); + } + + DO(ParseEnumBlock(enum_type, enum_location)); + return true; +} + +bool Parser::ParseEnumBlock(EnumDescriptorProto* enum_type, + const LocationRecorder& enum_location) { + DO(Consume("{")); + + while (!TryConsume("}")) { + if (AtEnd()) { + AddError("Reached end of input in enum definition (missing '}')."); + return false; + } + + if (!ParseEnumStatement(enum_type, enum_location)) { + // This statement failed to parse. Skip it, but keep looping to parse + // other statements. + SkipStatement(); + } + } + + return true; +} + +bool Parser::ParseEnumStatement(EnumDescriptorProto* enum_type, + const LocationRecorder& enum_location) { + if (TryConsume(";")) { + // empty statement; ignore + return true; + } else if (LookingAt("option")) { + LocationRecorder location(enum_location, + EnumDescriptorProto::kOptionsFieldNumber); + return ParseOption(enum_type->mutable_options(), location); + } else { + LocationRecorder location(enum_location, + EnumDescriptorProto::kValueFieldNumber, enum_type->value_size()); + return ParseEnumConstant(enum_type->add_value(), location); + } +} + +bool Parser::ParseEnumConstant(EnumValueDescriptorProto* enum_value, + const LocationRecorder& enum_value_location) { + // Parse name. + { + LocationRecorder location(enum_value_location, + EnumValueDescriptorProto::kNameFieldNumber); + location.RecordLegacyLocation( + enum_value, DescriptorPool::ErrorCollector::NAME); + DO(ConsumeIdentifier(enum_value->mutable_name(), + "Expected enum constant name.")); + } + + DO(Consume("=", "Missing numeric value for enum constant.")); + + // Parse value. + { + LocationRecorder location( + enum_value_location, EnumValueDescriptorProto::kNumberFieldNumber); + location.RecordLegacyLocation( + enum_value, DescriptorPool::ErrorCollector::NUMBER); + + bool is_negative = TryConsume("-"); + int number; + DO(ConsumeInteger(&number, "Expected integer.")); + if (is_negative) number *= -1; + enum_value->set_number(number); + } + + DO(ParseEnumConstantOptions(enum_value, enum_value_location)); + + DO(Consume(";")); + + return true; +} + +bool Parser::ParseEnumConstantOptions( + EnumValueDescriptorProto* value, + const LocationRecorder& enum_value_location) { + if (!LookingAt("[")) return true; + + LocationRecorder location( + enum_value_location, EnumValueDescriptorProto::kOptionsFieldNumber); + + DO(Consume("[")); + + do { + DO(ParseOptionAssignment(value->mutable_options(), location)); + } while (TryConsume(",")); + + DO(Consume("]")); + return true; +} + +// ------------------------------------------------------------------- +// Services + +bool Parser::ParseServiceDefinition(ServiceDescriptorProto* service, + const LocationRecorder& service_location) { + DO(Consume("service")); + + { + LocationRecorder location(service_location, + ServiceDescriptorProto::kNameFieldNumber); + location.RecordLegacyLocation( + service, DescriptorPool::ErrorCollector::NAME); + DO(ConsumeIdentifier(service->mutable_name(), "Expected service name.")); + } + + DO(ParseServiceBlock(service, service_location)); + return true; +} + +bool Parser::ParseServiceBlock(ServiceDescriptorProto* service, + const LocationRecorder& service_location) { + DO(Consume("{")); + + while (!TryConsume("}")) { + if (AtEnd()) { + AddError("Reached end of input in service definition (missing '}')."); + return false; + } + + if (!ParseServiceStatement(service, service_location)) { + // This statement failed to parse. Skip it, but keep looping to parse + // other statements. + SkipStatement(); + } + } + + return true; +} + +bool Parser::ParseServiceStatement(ServiceDescriptorProto* service, + const LocationRecorder& service_location) { + if (TryConsume(";")) { + // empty statement; ignore + return true; + } else if (LookingAt("option")) { + LocationRecorder location( + service_location, ServiceDescriptorProto::kOptionsFieldNumber); + return ParseOption(service->mutable_options(), location); + } else { + LocationRecorder location(service_location, + ServiceDescriptorProto::kMethodFieldNumber, service->method_size()); + return ParseServiceMethod(service->add_method(), location); + } +} + +bool Parser::ParseServiceMethod(MethodDescriptorProto* method, + const LocationRecorder& method_location) { + DO(Consume("rpc")); + + { + LocationRecorder location(method_location, + MethodDescriptorProto::kNameFieldNumber); + location.RecordLegacyLocation( + method, DescriptorPool::ErrorCollector::NAME); + DO(ConsumeIdentifier(method->mutable_name(), "Expected method name.")); + } + + // Parse input type. + DO(Consume("(")); + { + LocationRecorder location(method_location, + MethodDescriptorProto::kInputTypeFieldNumber); + location.RecordLegacyLocation( + method, DescriptorPool::ErrorCollector::INPUT_TYPE); + DO(ParseUserDefinedType(method->mutable_input_type())); + } + DO(Consume(")")); + + // Parse output type. + DO(Consume("returns")); + DO(Consume("(")); + { + LocationRecorder location(method_location, + MethodDescriptorProto::kOutputTypeFieldNumber); + location.RecordLegacyLocation( + method, DescriptorPool::ErrorCollector::OUTPUT_TYPE); + DO(ParseUserDefinedType(method->mutable_output_type())); + } + DO(Consume(")")); + + if (TryConsume("{")) { + // Options! + while (!TryConsume("}")) { + if (AtEnd()) { + AddError("Reached end of input in method options (missing '}')."); + return false; + } + + if (TryConsume(";")) { + // empty statement; ignore + } else { + LocationRecorder location(method_location, + MethodDescriptorProto::kOptionsFieldNumber); + if (!ParseOption(method->mutable_options(), location)) { + // This statement failed to parse. Skip it, but keep looping to + // parse other statements. + SkipStatement(); + } + } + } + } else { + DO(Consume(";")); + } + + return true; +} + +// ------------------------------------------------------------------- + +bool Parser::ParseLabel(FieldDescriptorProto::Label* label) { + if (TryConsume("optional")) { + *label = FieldDescriptorProto::LABEL_OPTIONAL; + return true; + } else if (TryConsume("repeated")) { + *label = FieldDescriptorProto::LABEL_REPEATED; + return true; + } else if (TryConsume("required")) { + *label = FieldDescriptorProto::LABEL_REQUIRED; + return true; + } else { + AddError("Expected \"required\", \"optional\", or \"repeated\"."); + // We can actually reasonably recover here by just assuming the user + // forgot the label altogether. + *label = FieldDescriptorProto::LABEL_OPTIONAL; + return true; + } +} + +bool Parser::ParseType(FieldDescriptorProto::Type* type, + string* type_name) { + TypeNameMap::const_iterator iter = kTypeNames.find(input_->current().text); + if (iter != kTypeNames.end()) { + *type = iter->second; + input_->Next(); + } else { + DO(ParseUserDefinedType(type_name)); + } + return true; +} + +bool Parser::ParseUserDefinedType(string* type_name) { + type_name->clear(); + + TypeNameMap::const_iterator iter = kTypeNames.find(input_->current().text); + if (iter != kTypeNames.end()) { + // Note: The only place enum types are allowed is for field types, but + // if we are parsing a field type then we would not get here because + // primitives are allowed there as well. So this error message doesn't + // need to account for enums. + AddError("Expected message type."); + + // Pretend to accept this type so that we can go on parsing. + *type_name = input_->current().text; + input_->Next(); + return true; + } + + // A leading "." means the name is fully-qualified. + if (TryConsume(".")) type_name->append("."); + + // Consume the first part of the name. + string identifier; + DO(ConsumeIdentifier(&identifier, "Expected type name.")); + type_name->append(identifier); + + // Consume more parts. + while (TryConsume(".")) { + type_name->append("."); + DO(ConsumeIdentifier(&identifier, "Expected identifier.")); + type_name->append(identifier); + } + + return true; +} + +// =================================================================== + +bool Parser::ParsePackage(FileDescriptorProto* file, + const LocationRecorder& root_location) { + if (file->has_package()) { + AddError("Multiple package definitions."); + // Don't append the new package to the old one. Just replace it. Not + // that it really matters since this is an error anyway. + file->clear_package(); + } + + DO(Consume("package")); + + { + LocationRecorder location(root_location, + FileDescriptorProto::kPackageFieldNumber); + location.RecordLegacyLocation(file, DescriptorPool::ErrorCollector::NAME); + + while (true) { + string identifier; + DO(ConsumeIdentifier(&identifier, "Expected identifier.")); + file->mutable_package()->append(identifier); + if (!TryConsume(".")) break; + file->mutable_package()->append("."); + } + } + + DO(Consume(";")); + return true; +} + +bool Parser::ParseImport(string* import_filename, + const LocationRecorder& root_location, + int index) { + DO(Consume("import")); + { + LocationRecorder location(root_location, + FileDescriptorProto::kDependencyFieldNumber, + index); + DO(ConsumeString(import_filename, + "Expected a string naming the file to import.")); + } + DO(Consume(";")); + return true; +} + +bool Parser::ParseOption(Message* options, + const LocationRecorder& options_location) { + DO(Consume("option")); + DO(ParseOptionAssignment(options, options_location)); + DO(Consume(";")); + return true; +} + +// =================================================================== + +SourceLocationTable::SourceLocationTable() {} +SourceLocationTable::~SourceLocationTable() {} + +bool SourceLocationTable::Find( + const Message* descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + int* line, int* column) const { + const pair* result = + FindOrNull(location_map_, make_pair(descriptor, location)); + if (result == NULL) { + *line = -1; + *column = 0; + return false; + } else { + *line = result->first; + *column = result->second; + return true; + } +} + +void SourceLocationTable::Add( + const Message* descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + int line, int column) { + location_map_[make_pair(descriptor, location)] = make_pair(line, column); +} + +void SourceLocationTable::Clear() { + location_map_.clear(); +} + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h new file mode 100644 index 000000000..4cc90a29a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h @@ -0,0 +1,434 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Implements parsing of .proto files to FileDescriptorProtos. + +#ifndef GOOGLE_PROTOBUF_COMPILER_PARSER_H__ +#define GOOGLE_PROTOBUF_COMPILER_PARSER_H__ + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { class Message; } + +namespace protobuf { +namespace compiler { + +// Defined in this file. +class Parser; +class SourceLocationTable; + +// Implements parsing of protocol definitions (such as .proto files). +// +// Note that most users will be more interested in the Importer class. +// Parser is a lower-level class which simply converts a single .proto file +// to a FileDescriptorProto. It does not resolve import directives or perform +// many other kinds of validation needed to construct a complete +// FileDescriptor. +class LIBPROTOBUF_EXPORT Parser { + public: + Parser(); + ~Parser(); + + // Parse the entire input and construct a FileDescriptorProto representing + // it. Returns true if no errors occurred, false otherwise. + bool Parse(io::Tokenizer* input, FileDescriptorProto* file); + + // Optional fetaures: + + // DEPRECATED: New code should use the SourceCodeInfo embedded in the + // FileDescriptorProto. + // + // Requests that locations of certain definitions be recorded to the given + // SourceLocationTable while parsing. This can be used to look up exact line + // and column numbers for errors reported by DescriptorPool during validation. + // Set to NULL (the default) to discard source location information. + void RecordSourceLocationsTo(SourceLocationTable* location_table) { + source_location_table_ = location_table; + } + + // Requests that errors be recorded to the given ErrorCollector while + // parsing. Set to NULL (the default) to discard error messages. + void RecordErrorsTo(io::ErrorCollector* error_collector) { + error_collector_ = error_collector; + } + + // Returns the identifier used in the "syntax = " declaration, if one was + // seen during the last call to Parse(), or the empty string otherwise. + const string& GetSyntaxIdentifier() { return syntax_identifier_; } + + // If set true, input files will be required to begin with a syntax + // identifier. Otherwise, files may omit this. If a syntax identifier + // is provided, it must be 'syntax = "proto2";' and must appear at the + // top of this file regardless of whether or not it was required. + void SetRequireSyntaxIdentifier(bool value) { + require_syntax_identifier_ = value; + } + + // Call SetStopAfterSyntaxIdentifier(true) to tell the parser to stop + // parsing as soon as it has seen the syntax identifier, or lack thereof. + // This is useful for quickly identifying the syntax of the file without + // parsing the whole thing. If this is enabled, no error will be recorded + // if the syntax identifier is something other than "proto2" (since + // presumably the caller intends to deal with that), but other kinds of + // errors (e.g. parse errors) will still be reported. When this is enabled, + // you may pass a NULL FileDescriptorProto to Parse(). + void SetStopAfterSyntaxIdentifier(bool value) { + stop_after_syntax_identifier_ = value; + } + + private: + // ================================================================= + // Error recovery helpers + + // Consume the rest of the current statement. This consumes tokens + // until it sees one of: + // ';' Consumes the token and returns. + // '{' Consumes the brace then calls SkipRestOfBlock(). + // '}' Returns without consuming. + // EOF Returns (can't consume). + // The Parser often calls SkipStatement() after encountering a syntax + // error. This allows it to go on parsing the following lines, allowing + // it to report more than just one error in the file. + void SkipStatement(); + + // Consume the rest of the current block, including nested blocks, + // ending after the closing '}' is encountered and consumed, or at EOF. + void SkipRestOfBlock(); + + // ----------------------------------------------------------------- + // Single-token consuming helpers + // + // These make parsing code more readable. + + // True if the current token is TYPE_END. + inline bool AtEnd(); + + // True if the next token matches the given text. + inline bool LookingAt(const char* text); + // True if the next token is of the given type. + inline bool LookingAtType(io::Tokenizer::TokenType token_type); + + // If the next token exactly matches the text given, consume it and return + // true. Otherwise, return false without logging an error. + bool TryConsume(const char* text); + + // These attempt to read some kind of token from the input. If successful, + // they return true. Otherwise they return false and add the given error + // to the error list. + + // Consume a token with the exact text given. + bool Consume(const char* text, const char* error); + // Same as above, but automatically generates the error "Expected \"text\".", + // where "text" is the expected token text. + bool Consume(const char* text); + // Consume a token of type IDENTIFIER and store its text in "output". + bool ConsumeIdentifier(string* output, const char* error); + // Consume an integer and store its value in "output". + bool ConsumeInteger(int* output, const char* error); + // Consume a 64-bit integer and store its value in "output". If the value + // is greater than max_value, an error will be reported. + bool ConsumeInteger64(uint64 max_value, uint64* output, const char* error); + // Consume a number and store its value in "output". This will accept + // tokens of either INTEGER or FLOAT type. + bool ConsumeNumber(double* output, const char* error); + // Consume a string literal and store its (unescaped) value in "output". + bool ConsumeString(string* output, const char* error); + + // ----------------------------------------------------------------- + // Error logging helpers + + // Invokes error_collector_->AddError(), if error_collector_ is not NULL. + void AddError(int line, int column, const string& error); + + // Invokes error_collector_->AddError() with the line and column number + // of the current token. + void AddError(const string& error); + + // Records a location in the SourceCodeInfo.location table (see + // descriptor.proto). We use RAII to ensure that the start and end locations + // are recorded -- the constructor records the start location and the + // destructor records the end location. Since the parser is + // recursive-descent, this works out beautifully. + class LIBPROTOBUF_EXPORT LocationRecorder { + public: + // Construct the file's "root" location. + LocationRecorder(Parser* parser); + + // Construct a location that represents a declaration nested within the + // given parent. E.g. a field's location is nested within the location + // for a message type. The parent's path will be copied, so you should + // call AddPath() only to add the path components leading from the parent + // to the child (as opposed to leading from the root to the child). + LocationRecorder(const LocationRecorder& parent); + + // Convenience constructors that call AddPath() one or two times. + LocationRecorder(const LocationRecorder& parent, int path1); + LocationRecorder(const LocationRecorder& parent, int path1, int path2); + + ~LocationRecorder(); + + // Add a path component. See SourceCodeInfo.Location.path in + // descriptor.proto. + void AddPath(int path_component); + + // By default the location is considered to start at the current token at + // the time the LocationRecorder is created. StartAt() sets the start + // location to the given token instead. + void StartAt(const io::Tokenizer::Token& token); + + // By default the location is considered to end at the previous token at + // the time the LocationRecorder is destroyed. EndAt() sets the end + // location to the given token instead. + void EndAt(const io::Tokenizer::Token& token); + + // Records the start point of this location to the SourceLocationTable that + // was passed to RecordSourceLocationsTo(), if any. SourceLocationTable + // is an older way of keeping track of source locations which is still + // used in some places. + void RecordLegacyLocation(const Message* descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location); + + private: + Parser* parser_; + SourceCodeInfo::Location* location_; + + void Init(const LocationRecorder& parent); + }; + + // ================================================================= + // Parsers for various language constructs + + // Parses the "syntax = \"proto2\";" line at the top of the file. Returns + // false if it failed to parse or if the syntax identifier was not + // recognized. + bool ParseSyntaxIdentifier(); + + // These methods parse various individual bits of code. They return + // false if they completely fail to parse the construct. In this case, + // it is probably necessary to skip the rest of the statement to recover. + // However, if these methods return true, it does NOT mean that there + // were no errors; only that there were no *syntax* errors. For instance, + // if a service method is defined using proper syntax but uses a primitive + // type as its input or output, ParseMethodField() still returns true + // and only reports the error by calling AddError(). In practice, this + // makes logic much simpler for the caller. + + // Parse a top-level message, enum, service, etc. + bool ParseTopLevelStatement(FileDescriptorProto* file, + const LocationRecorder& root_location); + + // Parse various language high-level language construrcts. + bool ParseMessageDefinition(DescriptorProto* message, + const LocationRecorder& message_location); + bool ParseEnumDefinition(EnumDescriptorProto* enum_type, + const LocationRecorder& enum_location); + bool ParseServiceDefinition(ServiceDescriptorProto* service, + const LocationRecorder& service_location); + bool ParsePackage(FileDescriptorProto* file, + const LocationRecorder& root_location); + bool ParseImport(string* import_filename, + const LocationRecorder& root_location, + int index); + bool ParseOption(Message* options, + const LocationRecorder& options_location); + + // These methods parse the contents of a message, enum, or service type and + // add them to the given object. They consume the entire block including + // the beginning and ending brace. + bool ParseMessageBlock(DescriptorProto* message, + const LocationRecorder& message_location); + bool ParseEnumBlock(EnumDescriptorProto* enum_type, + const LocationRecorder& enum_location); + bool ParseServiceBlock(ServiceDescriptorProto* service, + const LocationRecorder& service_location); + + // Parse one statement within a message, enum, or service block, inclunding + // final semicolon. + bool ParseMessageStatement(DescriptorProto* message, + const LocationRecorder& message_location); + bool ParseEnumStatement(EnumDescriptorProto* message, + const LocationRecorder& enum_location); + bool ParseServiceStatement(ServiceDescriptorProto* message, + const LocationRecorder& service_location); + + // Parse a field of a message. If the field is a group, its type will be + // added to "messages". + // + // parent_location and location_field_number_for_nested_type are needed when + // parsing groups -- we need to generate a nested message type within the + // parent and record its location accordingly. Since the parent could be + // either a FileDescriptorProto or a DescriptorProto, we must pass in the + // correct field number to use. + bool ParseMessageField(FieldDescriptorProto* field, + RepeatedPtrField* messages, + const LocationRecorder& parent_location, + int location_field_number_for_nested_type, + const LocationRecorder& field_location); + + // Parse an "extensions" declaration. + bool ParseExtensions(DescriptorProto* message, + const LocationRecorder& extensions_location); + + // Parse an "extend" declaration. (See also comments for + // ParseMessageField().) + bool ParseExtend(RepeatedPtrField* extensions, + RepeatedPtrField* messages, + const LocationRecorder& parent_location, + int location_field_number_for_nested_type, + const LocationRecorder& extend_location); + + // Parse a single enum value within an enum block. + bool ParseEnumConstant(EnumValueDescriptorProto* enum_value, + const LocationRecorder& enum_value_location); + + // Parse enum constant options, i.e. the list in square brackets at the end + // of the enum constant value definition. + bool ParseEnumConstantOptions(EnumValueDescriptorProto* value, + const LocationRecorder& enum_value_location); + + // Parse a single method within a service definition. + bool ParseServiceMethod(MethodDescriptorProto* method, + const LocationRecorder& method_location); + + // Parse "required", "optional", or "repeated" and fill in "label" + // with the value. + bool ParseLabel(FieldDescriptorProto::Label* label); + + // Parse a type name and fill in "type" (if it is a primitive) or + // "type_name" (if it is not) with the type parsed. + bool ParseType(FieldDescriptorProto::Type* type, + string* type_name); + // Parse a user-defined type and fill in "type_name" with the name. + // If a primitive type is named, it is treated as an error. + bool ParseUserDefinedType(string* type_name); + + // Parses field options, i.e. the stuff in square brackets at the end + // of a field definition. Also parses default value. + bool ParseFieldOptions(FieldDescriptorProto* field, + const LocationRecorder& field_location); + + // Parse the "default" option. This needs special handling because its + // type is the field's type. + bool ParseDefaultAssignment(FieldDescriptorProto* field, + const LocationRecorder& field_location); + + // Parse a single option name/value pair, e.g. "ctype = CORD". The name + // identifies a field of the given Message, and the value of that field + // is set to the parsed value. + bool ParseOptionAssignment(Message* options, + const LocationRecorder& options_location); + + // Parses a single part of a multipart option name. A multipart name consists + // of names separated by dots. Each name is either an identifier or a series + // of identifiers separated by dots and enclosed in parentheses. E.g., + // "foo.(bar.baz).qux". + bool ParseOptionNamePart(UninterpretedOption* uninterpreted_option, + const LocationRecorder& part_location); + + // Parses a string surrounded by balanced braces. Strips off the outer + // braces and stores the enclosed string in *value. + // E.g., + // { foo } *value gets 'foo' + // { foo { bar: box } } *value gets 'foo { bar: box }' + // {} *value gets '' + // + // REQUIRES: LookingAt("{") + // When finished successfully, we are looking at the first token past + // the ending brace. + bool ParseUninterpretedBlock(string* value); + + // ================================================================= + + io::Tokenizer* input_; + io::ErrorCollector* error_collector_; + SourceCodeInfo* source_code_info_; + SourceLocationTable* source_location_table_; // legacy + bool had_errors_; + bool require_syntax_identifier_; + bool stop_after_syntax_identifier_; + string syntax_identifier_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Parser); +}; + +// A table mapping (descriptor, ErrorLocation) pairs -- as reported by +// DescriptorPool when validating descriptors -- to line and column numbers +// within the original source code. +// +// This is semi-obsolete: FileDescriptorProto.source_code_info now contains +// far more complete information about source locations. However, as of this +// writing you still need to use SourceLocationTable when integrating with +// DescriptorPool. +class LIBPROTOBUF_EXPORT SourceLocationTable { + public: + SourceLocationTable(); + ~SourceLocationTable(); + + // Finds the precise location of the given error and fills in *line and + // *column with the line and column numbers. If not found, sets *line to + // -1 and *column to 0 (since line = -1 is used to mean "error has no exact + // location" in the ErrorCollector interface). Returns true if found, false + // otherwise. + bool Find(const Message* descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + int* line, int* column) const; + + // Adds a location to the table. + void Add(const Message* descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + int line, int column); + + // Clears the contents of the table. + void Clear(); + + private: + typedef map< + pair, + pair > LocationMap; + LocationMap location_map_; +}; + +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_PARSER_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc new file mode 100644 index 000000000..156c0dc3c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc @@ -0,0 +1,2122 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +namespace { + +class MockErrorCollector : public io::ErrorCollector { + public: + MockErrorCollector() {} + ~MockErrorCollector() {} + + string text_; + + // implements ErrorCollector --------------------------------------- + void AddError(int line, int column, const string& message) { + strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", + line, column, message); + } +}; + +class MockValidationErrorCollector : public DescriptorPool::ErrorCollector { + public: + MockValidationErrorCollector(const SourceLocationTable& source_locations, + io::ErrorCollector* wrapped_collector) + : source_locations_(source_locations), + wrapped_collector_(wrapped_collector) {} + ~MockValidationErrorCollector() {} + + // implements ErrorCollector --------------------------------------- + void AddError(const string& filename, + const string& element_name, + const Message* descriptor, + ErrorLocation location, + const string& message) { + int line, column; + source_locations_.Find(descriptor, location, &line, &column); + wrapped_collector_->AddError(line, column, message); + } + + private: + const SourceLocationTable& source_locations_; + io::ErrorCollector* wrapped_collector_; +}; + +class ParserTest : public testing::Test { + protected: + ParserTest() + : require_syntax_identifier_(false) {} + + // Set up the parser to parse the given text. + void SetupParser(const char* text) { + raw_input_.reset(new io::ArrayInputStream(text, strlen(text))); + input_.reset(new io::Tokenizer(raw_input_.get(), &error_collector_)); + parser_.reset(new Parser()); + parser_->RecordErrorsTo(&error_collector_); + parser_->SetRequireSyntaxIdentifier(require_syntax_identifier_); + } + + // Parse the input and expect that the resulting FileDescriptorProto matches + // the given output. The output is a FileDescriptorProto in protocol buffer + // text format. + void ExpectParsesTo(const char* input, const char* output) { + SetupParser(input); + FileDescriptorProto actual, expected; + + parser_->Parse(input_.get(), &actual); + EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); + ASSERT_EQ("", error_collector_.text_); + + // We don't cover SourceCodeInfo in these tests. + actual.clear_source_code_info(); + + // Parse the ASCII representation in order to canonicalize it. We could + // just compare directly to actual.DebugString(), but that would require + // that the caller precisely match the formatting that DebugString() + // produces. + ASSERT_TRUE(TextFormat::ParseFromString(output, &expected)); + + // Compare by comparing debug strings. + // TODO(kenton): Use differencer, once it is available. + EXPECT_EQ(expected.DebugString(), actual.DebugString()); + } + + // Parse the text and expect that the given errors are reported. + void ExpectHasErrors(const char* text, const char* expected_errors) { + ExpectHasEarlyExitErrors(text, expected_errors); + EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); + } + + // Same as above but does not expect that the parser parses the complete + // input. + void ExpectHasEarlyExitErrors(const char* text, const char* expected_errors) { + SetupParser(text); + FileDescriptorProto file; + parser_->Parse(input_.get(), &file); + EXPECT_EQ(expected_errors, error_collector_.text_); + } + + // Parse the text as a file and validate it (with a DescriptorPool), and + // expect that the validation step reports the given errors. + void ExpectHasValidationErrors(const char* text, + const char* expected_errors) { + SetupParser(text); + SourceLocationTable source_locations; + parser_->RecordSourceLocationsTo(&source_locations); + + FileDescriptorProto file; + file.set_name("foo.proto"); + parser_->Parse(input_.get(), &file); + EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); + ASSERT_EQ("", error_collector_.text_); + + MockValidationErrorCollector validation_error_collector( + source_locations, &error_collector_); + EXPECT_TRUE(pool_.BuildFileCollectingErrors( + file, &validation_error_collector) == NULL); + EXPECT_EQ(expected_errors, error_collector_.text_); + } + + MockErrorCollector error_collector_; + DescriptorPool pool_; + + scoped_ptr raw_input_; + scoped_ptr input_; + scoped_ptr parser_; + bool require_syntax_identifier_; +}; + +// =================================================================== + +TEST_F(ParserTest, StopAfterSyntaxIdentifier) { + SetupParser( + "// blah\n" + "syntax = \"foobar\";\n" + "this line will not be parsed\n"); + parser_->SetStopAfterSyntaxIdentifier(true); + EXPECT_TRUE(parser_->Parse(input_.get(), NULL)); + EXPECT_EQ("", error_collector_.text_); + EXPECT_EQ("foobar", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParserTest, StopAfterOmittedSyntaxIdentifier) { + SetupParser( + "// blah\n" + "this line will not be parsed\n"); + parser_->SetStopAfterSyntaxIdentifier(true); + EXPECT_TRUE(parser_->Parse(input_.get(), NULL)); + EXPECT_EQ("", error_collector_.text_); + EXPECT_EQ("", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParserTest, StopAfterSyntaxIdentifierWithErrors) { + SetupParser( + "// blah\n" + "syntax = error;\n"); + parser_->SetStopAfterSyntaxIdentifier(true); + EXPECT_FALSE(parser_->Parse(input_.get(), NULL)); + EXPECT_EQ("1:9: Expected syntax identifier.\n", error_collector_.text_); +} + +// =================================================================== + +typedef ParserTest ParseMessageTest; + +TEST_F(ParseMessageTest, SimpleMessage) { + ExpectParsesTo( + "message TestMessage {\n" + " required int32 foo = 1;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" + "}"); +} + +TEST_F(ParseMessageTest, ImplicitSyntaxIdentifier) { + require_syntax_identifier_ = false; + ExpectParsesTo( + "message TestMessage {\n" + " required int32 foo = 1;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" + "}"); + EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParseMessageTest, ExplicitSyntaxIdentifier) { + ExpectParsesTo( + "syntax = \"proto2\";\n" + "message TestMessage {\n" + " required int32 foo = 1;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" + "}"); + EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParseMessageTest, ExplicitRequiredSyntaxIdentifier) { + require_syntax_identifier_ = true; + ExpectParsesTo( + "syntax = \"proto2\";\n" + "message TestMessage {\n" + " required int32 foo = 1;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" + "}"); + EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParseMessageTest, SimpleFields) { + ExpectParsesTo( + "message TestMessage {\n" + " required int32 foo = 15;\n" + " optional int32 bar = 34;\n" + " repeated int32 baz = 3;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:15 }" + " field { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:34 }" + " field { name:\"baz\" label:LABEL_REPEATED type:TYPE_INT32 number:3 }" + "}"); +} + +TEST_F(ParseMessageTest, PrimitiveFieldTypes) { + ExpectParsesTo( + "message TestMessage {\n" + " required int32 foo = 1;\n" + " required int64 foo = 1;\n" + " required uint32 foo = 1;\n" + " required uint64 foo = 1;\n" + " required sint32 foo = 1;\n" + " required sint64 foo = 1;\n" + " required fixed32 foo = 1;\n" + " required fixed64 foo = 1;\n" + " required sfixed32 foo = 1;\n" + " required sfixed64 foo = 1;\n" + " required float foo = 1;\n" + " required double foo = 1;\n" + " required string foo = 1;\n" + " required bytes foo = 1;\n" + " required bool foo = 1;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT32 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_INT64 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT32 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_UINT64 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT32 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SINT64 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED32 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FIXED64 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED32 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_SFIXED64 number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_FLOAT number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_DOUBLE number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_STRING number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BYTES number:1 }" + " field { name:\"foo\" label:LABEL_REQUIRED type:TYPE_BOOL number:1 }" + "}"); +} + +TEST_F(ParseMessageTest, FieldDefaults) { + ExpectParsesTo( + "message TestMessage {\n" + " required int32 foo = 1 [default= 1 ];\n" + " required int32 foo = 1 [default= -2 ];\n" + " required int64 foo = 1 [default= 3 ];\n" + " required int64 foo = 1 [default= -4 ];\n" + " required uint32 foo = 1 [default= 5 ];\n" + " required uint64 foo = 1 [default= 6 ];\n" + " required float foo = 1 [default= 7.5];\n" + " required float foo = 1 [default= -8.5];\n" + " required float foo = 1 [default= 9 ];\n" + " required double foo = 1 [default= 10.5];\n" + " required double foo = 1 [default=-11.5];\n" + " required double foo = 1 [default= 12 ];\n" + " required double foo = 1 [default= inf ];\n" + " required double foo = 1 [default=-inf ];\n" + " required double foo = 1 [default= nan ];\n" + " required string foo = 1 [default='13\\001'];\n" + " required string foo = 1 [default='a' \"b\" \n \"c\"];\n" + " required bytes foo = 1 [default='14\\002'];\n" + " required bytes foo = 1 [default='a' \"b\" \n 'c'];\n" + " required bool foo = 1 [default=true ];\n" + " required Foo foo = 1 [default=FOO ];\n" + + " required int32 foo = 1 [default= 0x7FFFFFFF];\n" + " required int32 foo = 1 [default=-0x80000000];\n" + " required uint32 foo = 1 [default= 0xFFFFFFFF];\n" + " required int64 foo = 1 [default= 0x7FFFFFFFFFFFFFFF];\n" + " required int64 foo = 1 [default=-0x8000000000000000];\n" + " required uint64 foo = 1 [default= 0xFFFFFFFFFFFFFFFF];\n" + " required double foo = 1 [default= 0xabcd];\n" + "}\n", + +#define ETC "name:\"foo\" label:LABEL_REQUIRED number:1" + "message_type {" + " name: \"TestMessage\"" + " field { type:TYPE_INT32 default_value:\"1\" "ETC" }" + " field { type:TYPE_INT32 default_value:\"-2\" "ETC" }" + " field { type:TYPE_INT64 default_value:\"3\" "ETC" }" + " field { type:TYPE_INT64 default_value:\"-4\" "ETC" }" + " field { type:TYPE_UINT32 default_value:\"5\" "ETC" }" + " field { type:TYPE_UINT64 default_value:\"6\" "ETC" }" + " field { type:TYPE_FLOAT default_value:\"7.5\" "ETC" }" + " field { type:TYPE_FLOAT default_value:\"-8.5\" "ETC" }" + " field { type:TYPE_FLOAT default_value:\"9\" "ETC" }" + " field { type:TYPE_DOUBLE default_value:\"10.5\" "ETC" }" + " field { type:TYPE_DOUBLE default_value:\"-11.5\" "ETC" }" + " field { type:TYPE_DOUBLE default_value:\"12\" "ETC" }" + " field { type:TYPE_DOUBLE default_value:\"inf\" "ETC" }" + " field { type:TYPE_DOUBLE default_value:\"-inf\" "ETC" }" + " field { type:TYPE_DOUBLE default_value:\"nan\" "ETC" }" + " field { type:TYPE_STRING default_value:\"13\\001\" "ETC" }" + " field { type:TYPE_STRING default_value:\"abc\" "ETC" }" + " field { type:TYPE_BYTES default_value:\"14\\\\002\" "ETC" }" + " field { type:TYPE_BYTES default_value:\"abc\" "ETC" }" + " field { type:TYPE_BOOL default_value:\"true\" "ETC" }" + " field { type_name:\"Foo\" default_value:\"FOO\" "ETC" }" + + " field { type:TYPE_INT32 default_value:\"2147483647\" "ETC" }" + " field { type:TYPE_INT32 default_value:\"-2147483648\" "ETC" }" + " field { type:TYPE_UINT32 default_value:\"4294967295\" "ETC" }" + " field { type:TYPE_INT64 default_value:\"9223372036854775807\" "ETC" }" + " field { type:TYPE_INT64 default_value:\"-9223372036854775808\" "ETC" }" + " field { type:TYPE_UINT64 default_value:\"18446744073709551615\" "ETC" }" + " field { type:TYPE_DOUBLE default_value:\"43981\" "ETC" }" + "}"); +#undef ETC +} + +TEST_F(ParseMessageTest, FieldOptions) { + ExpectParsesTo( + "message TestMessage {\n" + " optional string foo = 1\n" + " [ctype=CORD, (foo)=7, foo.(.bar.baz).qux.quux.(corge)=-33, \n" + " (quux)=\"x\040y\", (baz.qux)=hey];\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " field { name: \"foo\" label: LABEL_OPTIONAL type: TYPE_STRING number: 1" + " options { uninterpreted_option: { name { name_part: \"ctype\" " + " is_extension: false } " + " identifier_value: \"CORD\" }" + " uninterpreted_option: { name { name_part: \"foo\" " + " is_extension: true } " + " positive_int_value: 7 }" + " uninterpreted_option: { name { name_part: \"foo\" " + " is_extension: false } " + " name { name_part: \".bar.baz\"" + " is_extension: true } " + " name { name_part: \"qux\" " + " is_extension: false } " + " name { name_part: \"quux\" " + " is_extension: false } " + " name { name_part: \"corge\" " + " is_extension: true } " + " negative_int_value: -33 }" + " uninterpreted_option: { name { name_part: \"quux\" " + " is_extension: true } " + " string_value: \"x y\" }" + " uninterpreted_option: { name { name_part: \"baz.qux\" " + " is_extension: true } " + " identifier_value: \"hey\" }" + " }" + " }" + "}"); +} + +TEST_F(ParseMessageTest, Group) { + ExpectParsesTo( + "message TestMessage {\n" + " optional group TestGroup = 1 {};\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " nested_type { name: \"TestGroup\" }" + " field { name:\"testgroup\" label:LABEL_OPTIONAL number:1" + " type:TYPE_GROUP type_name: \"TestGroup\" }" + "}"); +} + +TEST_F(ParseMessageTest, NestedMessage) { + ExpectParsesTo( + "message TestMessage {\n" + " message Nested {}\n" + " optional Nested test_nested = 1;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " nested_type { name: \"Nested\" }" + " field { name:\"test_nested\" label:LABEL_OPTIONAL number:1" + " type_name: \"Nested\" }" + "}"); +} + +TEST_F(ParseMessageTest, NestedEnum) { + ExpectParsesTo( + "message TestMessage {\n" + " enum NestedEnum {}\n" + " optional NestedEnum test_enum = 1;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " enum_type { name: \"NestedEnum\" }" + " field { name:\"test_enum\" label:LABEL_OPTIONAL number:1" + " type_name: \"NestedEnum\" }" + "}"); +} + +TEST_F(ParseMessageTest, ExtensionRange) { + ExpectParsesTo( + "message TestMessage {\n" + " extensions 10 to 19;\n" + " extensions 30 to max;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " extension_range { start:10 end:20 }" + " extension_range { start:30 end:536870912 }" + "}"); +} + +TEST_F(ParseMessageTest, CompoundExtensionRange) { + ExpectParsesTo( + "message TestMessage {\n" + " extensions 2, 15, 9 to 11, 100 to max, 3;\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " extension_range { start:2 end:3 }" + " extension_range { start:15 end:16 }" + " extension_range { start:9 end:12 }" + " extension_range { start:100 end:536870912 }" + " extension_range { start:3 end:4 }" + "}"); +} + +TEST_F(ParseMessageTest, Extensions) { + ExpectParsesTo( + "extend Extendee1 { optional int32 foo = 12; }\n" + "extend Extendee2 { repeated TestMessage bar = 22; }\n", + + "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" + " extendee: \"Extendee1\" } " + "extension { name:\"bar\" label:LABEL_REPEATED number:22" + " type_name:\"TestMessage\" extendee: \"Extendee2\" }"); +} + +TEST_F(ParseMessageTest, ExtensionsInMessageScope) { + ExpectParsesTo( + "message TestMessage {\n" + " extend Extendee1 { optional int32 foo = 12; }\n" + " extend Extendee2 { repeated TestMessage bar = 22; }\n" + "}\n", + + "message_type {" + " name: \"TestMessage\"" + " extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" + " extendee: \"Extendee1\" }" + " extension { name:\"bar\" label:LABEL_REPEATED number:22" + " type_name:\"TestMessage\" extendee: \"Extendee2\" }" + "}"); +} + +TEST_F(ParseMessageTest, MultipleExtensionsOneExtendee) { + ExpectParsesTo( + "extend Extendee1 {\n" + " optional int32 foo = 12;\n" + " repeated TestMessage bar = 22;\n" + "}\n", + + "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:12" + " extendee: \"Extendee1\" } " + "extension { name:\"bar\" label:LABEL_REPEATED number:22" + " type_name:\"TestMessage\" extendee: \"Extendee1\" }"); +} + +// =================================================================== + +typedef ParserTest ParseEnumTest; + +TEST_F(ParseEnumTest, SimpleEnum) { + ExpectParsesTo( + "enum TestEnum {\n" + " FOO = 0;\n" + "}\n", + + "enum_type {" + " name: \"TestEnum\"" + " value { name:\"FOO\" number:0 }" + "}"); +} + +TEST_F(ParseEnumTest, Values) { + ExpectParsesTo( + "enum TestEnum {\n" + " FOO = 13;\n" + " BAR = -10;\n" + " BAZ = 500;\n" + "}\n", + + "enum_type {" + " name: \"TestEnum\"" + " value { name:\"FOO\" number:13 }" + " value { name:\"BAR\" number:-10 }" + " value { name:\"BAZ\" number:500 }" + "}"); +} + +TEST_F(ParseEnumTest, ValueOptions) { + ExpectParsesTo( + "enum TestEnum {\n" + " FOO = 13;\n" + " BAR = -10 [ (something.text) = 'abc' ];\n" + " BAZ = 500 [ (something.text) = 'def', other = 1 ];\n" + "}\n", + + "enum_type {" + " name: \"TestEnum\"" + " value { name: \"FOO\" number: 13 }" + " value { name: \"BAR\" number: -10 " + " options { " + " uninterpreted_option { " + " name { name_part: \"something.text\" is_extension: true } " + " string_value: \"abc\" " + " } " + " } " + " } " + " value { name: \"BAZ\" number: 500 " + " options { " + " uninterpreted_option { " + " name { name_part: \"something.text\" is_extension: true } " + " string_value: \"def\" " + " } " + " uninterpreted_option { " + " name { name_part: \"other\" is_extension: false } " + " positive_int_value: 1 " + " } " + " } " + " } " + "}"); +} + +// =================================================================== + +typedef ParserTest ParseServiceTest; + +TEST_F(ParseServiceTest, SimpleService) { + ExpectParsesTo( + "service TestService {\n" + " rpc Foo(In) returns (Out);\n" + "}\n", + + "service {" + " name: \"TestService\"" + " method { name:\"Foo\" input_type:\"In\" output_type:\"Out\" }" + "}"); +} + +TEST_F(ParseServiceTest, Methods) { + ExpectParsesTo( + "service TestService {\n" + " rpc Foo(In1) returns (Out1);\n" + " rpc Bar(In2) returns (Out2);\n" + " rpc Baz(In3) returns (Out3);\n" + "}\n", + + "service {" + " name: \"TestService\"" + " method { name:\"Foo\" input_type:\"In1\" output_type:\"Out1\" }" + " method { name:\"Bar\" input_type:\"In2\" output_type:\"Out2\" }" + " method { name:\"Baz\" input_type:\"In3\" output_type:\"Out3\" }" + "}"); +} + +// =================================================================== +// imports and packages + +typedef ParserTest ParseMiscTest; + +TEST_F(ParseMiscTest, ParseImport) { + ExpectParsesTo( + "import \"foo/bar/baz.proto\";\n", + "dependency: \"foo/bar/baz.proto\""); +} + +TEST_F(ParseMiscTest, ParseMultipleImports) { + ExpectParsesTo( + "import \"foo.proto\";\n" + "import \"bar.proto\";\n" + "import \"baz.proto\";\n", + "dependency: \"foo.proto\"" + "dependency: \"bar.proto\"" + "dependency: \"baz.proto\""); +} + +TEST_F(ParseMiscTest, ParsePackage) { + ExpectParsesTo( + "package foo.bar.baz;\n", + "package: \"foo.bar.baz\""); +} + +TEST_F(ParseMiscTest, ParsePackageWithSpaces) { + ExpectParsesTo( + "package foo . bar. \n" + " baz;\n", + "package: \"foo.bar.baz\""); +} + +// =================================================================== +// options + +TEST_F(ParseMiscTest, ParseFileOptions) { + ExpectParsesTo( + "option java_package = \"com.google.foo\";\n" + "option optimize_for = CODE_SIZE;", + + "options {" + "uninterpreted_option { name { name_part: \"java_package\" " + " is_extension: false }" + " string_value: \"com.google.foo\"} " + "uninterpreted_option { name { name_part: \"optimize_for\" " + " is_extension: false }" + " identifier_value: \"CODE_SIZE\" } " + "}"); +} + +// =================================================================== +// Error tests +// +// There are a very large number of possible errors that the parser could +// report, so it's infeasible to test every single one of them. Instead, +// we test each unique call to AddError() in parser.h. This does not mean +// we are testing every possible error that Parser can generate because +// each variant of the Consume() helper only counts as one unique call to +// AddError(). + +typedef ParserTest ParseErrorTest; + +TEST_F(ParseErrorTest, MissingSyntaxIdentifier) { + require_syntax_identifier_ = true; + ExpectHasEarlyExitErrors( + "message TestMessage {}", + "0:0: File must begin with 'syntax = \"proto2\";'.\n"); + EXPECT_EQ("", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParseErrorTest, UnknownSyntaxIdentifier) { + ExpectHasEarlyExitErrors( + "syntax = \"no_such_syntax\";", + "0:9: Unrecognized syntax identifier \"no_such_syntax\". This parser " + "only recognizes \"proto2\".\n"); + EXPECT_EQ("no_such_syntax", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParseErrorTest, SimpleSyntaxError) { + ExpectHasErrors( + "message TestMessage @#$ { blah }", + "0:20: Expected \"{\".\n"); + EXPECT_EQ("proto2", parser_->GetSyntaxIdentifier()); +} + +TEST_F(ParseErrorTest, ExpectedTopLevel) { + ExpectHasErrors( + "blah;", + "0:0: Expected top-level statement (e.g. \"message\").\n"); +} + +TEST_F(ParseErrorTest, UnmatchedCloseBrace) { + // This used to cause an infinite loop. Doh. + ExpectHasErrors( + "}", + "0:0: Expected top-level statement (e.g. \"message\").\n" + "0:0: Unmatched \"}\".\n"); +} + +// ------------------------------------------------------------------- +// Message errors + +TEST_F(ParseErrorTest, MessageMissingName) { + ExpectHasErrors( + "message {}", + "0:8: Expected message name.\n"); +} + +TEST_F(ParseErrorTest, MessageMissingBody) { + ExpectHasErrors( + "message TestMessage;", + "0:19: Expected \"{\".\n"); +} + +TEST_F(ParseErrorTest, EofInMessage) { + ExpectHasErrors( + "message TestMessage {", + "0:21: Reached end of input in message definition (missing '}').\n"); +} + +TEST_F(ParseErrorTest, MissingFieldNumber) { + ExpectHasErrors( + "message TestMessage {\n" + " optional int32 foo;\n" + "}\n", + "1:20: Missing field number.\n"); +} + +TEST_F(ParseErrorTest, ExpectedFieldNumber) { + ExpectHasErrors( + "message TestMessage {\n" + " optional int32 foo = ;\n" + "}\n", + "1:23: Expected field number.\n"); +} + +TEST_F(ParseErrorTest, FieldNumberOutOfRange) { + ExpectHasErrors( + "message TestMessage {\n" + " optional int32 foo = 0x100000000;\n" + "}\n", + "1:23: Integer out of range.\n"); +} + +TEST_F(ParseErrorTest, MissingLabel) { + ExpectHasErrors( + "message TestMessage {\n" + " int32 foo = 1;\n" + "}\n", + "1:2: Expected \"required\", \"optional\", or \"repeated\".\n"); +} + +TEST_F(ParseErrorTest, ExpectedOptionName) { + ExpectHasErrors( + "message TestMessage {\n" + " optional uint32 foo = 1 [];\n" + "}\n", + "1:27: Expected identifier.\n"); +} + +TEST_F(ParseErrorTest, NonExtensionOptionNameBeginningWithDot) { + ExpectHasErrors( + "message TestMessage {\n" + " optional uint32 foo = 1 [.foo=1];\n" + "}\n", + "1:27: Expected identifier.\n"); +} + +TEST_F(ParseErrorTest, DefaultValueTypeMismatch) { + ExpectHasErrors( + "message TestMessage {\n" + " optional uint32 foo = 1 [default=true];\n" + "}\n", + "1:35: Expected integer.\n"); +} + +TEST_F(ParseErrorTest, DefaultValueNotBoolean) { + ExpectHasErrors( + "message TestMessage {\n" + " optional bool foo = 1 [default=blah];\n" + "}\n", + "1:33: Expected \"true\" or \"false\".\n"); +} + +TEST_F(ParseErrorTest, DefaultValueNotString) { + ExpectHasErrors( + "message TestMessage {\n" + " optional string foo = 1 [default=1];\n" + "}\n", + "1:35: Expected string.\n"); +} + +TEST_F(ParseErrorTest, DefaultValueUnsignedNegative) { + ExpectHasErrors( + "message TestMessage {\n" + " optional uint32 foo = 1 [default=-1];\n" + "}\n", + "1:36: Unsigned field can't have negative default value.\n"); +} + +TEST_F(ParseErrorTest, DefaultValueTooLarge) { + ExpectHasErrors( + "message TestMessage {\n" + " optional int32 foo = 1 [default= 0x80000000];\n" + " optional int32 foo = 1 [default=-0x80000001];\n" + " optional uint32 foo = 1 [default= 0x100000000];\n" + " optional int64 foo = 1 [default= 0x80000000000000000];\n" + " optional int64 foo = 1 [default=-0x80000000000000001];\n" + " optional uint64 foo = 1 [default= 0x100000000000000000];\n" + "}\n", + "1:36: Integer out of range.\n" + "2:36: Integer out of range.\n" + "3:36: Integer out of range.\n" + "4:36: Integer out of range.\n" + "5:36: Integer out of range.\n" + "6:36: Integer out of range.\n"); +} + +TEST_F(ParseErrorTest, DefaultValueMissing) { + ExpectHasErrors( + "message TestMessage {\n" + " optional uint32 foo = 1 [default=];\n" + "}\n", + "1:35: Expected integer.\n"); +} + +TEST_F(ParseErrorTest, DefaultValueForGroup) { + ExpectHasErrors( + "message TestMessage {\n" + " optional group Foo = 1 [default=blah] {}\n" + "}\n", + "1:34: Messages can't have default values.\n"); +} + +TEST_F(ParseErrorTest, DuplicateDefaultValue) { + ExpectHasErrors( + "message TestMessage {\n" + " optional uint32 foo = 1 [default=1,default=2];\n" + "}\n", + "1:37: Already set option \"default\".\n"); +} + +TEST_F(ParseErrorTest, GroupNotCapitalized) { + ExpectHasErrors( + "message TestMessage {\n" + " optional group foo = 1 {}\n" + "}\n", + "1:17: Group names must start with a capital letter.\n"); +} + +TEST_F(ParseErrorTest, GroupMissingBody) { + ExpectHasErrors( + "message TestMessage {\n" + " optional group Foo = 1;\n" + "}\n", + "1:24: Missing group body.\n"); +} + +TEST_F(ParseErrorTest, ExtendingPrimitive) { + ExpectHasErrors( + "extend int32 { optional string foo = 4; }\n", + "0:7: Expected message type.\n"); +} + +TEST_F(ParseErrorTest, ErrorInExtension) { + ExpectHasErrors( + "message Foo { extensions 100 to 199; }\n" + "extend Foo { optional string foo; }\n", + "1:32: Missing field number.\n"); +} + +TEST_F(ParseErrorTest, MultipleParseErrors) { + // When a statement has a parse error, the parser should be able to continue + // parsing at the next statement. + ExpectHasErrors( + "message TestMessage {\n" + " optional int32 foo;\n" + " !invalid statement ending in a block { blah blah { blah } blah }\n" + " optional int32 bar = 3 {}\n" + "}\n", + "1:20: Missing field number.\n" + "2:2: Expected \"required\", \"optional\", or \"repeated\".\n" + "2:2: Expected type name.\n" + "3:25: Expected \";\".\n"); +} + +TEST_F(ParseErrorTest, EofInAggregateValue) { + ExpectHasErrors( + "option (fileopt) = { i:100\n", + "1:0: Unexpected end of stream while parsing aggregate value.\n"); +} + +// ------------------------------------------------------------------- +// Enum errors + +TEST_F(ParseErrorTest, EofInEnum) { + ExpectHasErrors( + "enum TestEnum {", + "0:15: Reached end of input in enum definition (missing '}').\n"); +} + +TEST_F(ParseErrorTest, EnumValueMissingNumber) { + ExpectHasErrors( + "enum TestEnum {\n" + " FOO;\n" + "}\n", + "1:5: Missing numeric value for enum constant.\n"); +} + +// ------------------------------------------------------------------- +// Service errors + +TEST_F(ParseErrorTest, EofInService) { + ExpectHasErrors( + "service TestService {", + "0:21: Reached end of input in service definition (missing '}').\n"); +} + +TEST_F(ParseErrorTest, ServiceMethodPrimitiveParams) { + ExpectHasErrors( + "service TestService {\n" + " rpc Foo(int32) returns (string);\n" + "}\n", + "1:10: Expected message type.\n" + "1:26: Expected message type.\n"); +} + +TEST_F(ParseErrorTest, EofInMethodOptions) { + ExpectHasErrors( + "service TestService {\n" + " rpc Foo(Bar) returns(Bar) {", + "1:29: Reached end of input in method options (missing '}').\n" + "1:29: Reached end of input in service definition (missing '}').\n"); +} + +TEST_F(ParseErrorTest, PrimitiveMethodInput) { + ExpectHasErrors( + "service TestService {\n" + " rpc Foo(int32) returns(Bar);\n" + "}\n", + "1:10: Expected message type.\n"); +} + +TEST_F(ParseErrorTest, MethodOptionTypeError) { + // This used to cause an infinite loop. + ExpectHasErrors( + "message Baz {}\n" + "service Foo {\n" + " rpc Bar(Baz) returns(Baz) { option invalid syntax; }\n" + "}\n", + "2:45: Expected \"=\".\n"); +} + +// ------------------------------------------------------------------- +// Import and package errors + +TEST_F(ParseErrorTest, ImportNotQuoted) { + ExpectHasErrors( + "import foo;\n", + "0:7: Expected a string naming the file to import.\n"); +} + +TEST_F(ParseErrorTest, MultiplePackagesInFile) { + ExpectHasErrors( + "package foo;\n" + "package bar;\n", + "1:0: Multiple package definitions.\n"); +} + +// =================================================================== +// Test that errors detected by DescriptorPool correctly report line and +// column numbers. We have one test for every call to RecordLocation() in +// parser.cc. + +typedef ParserTest ParserValidationErrorTest; + +TEST_F(ParserValidationErrorTest, PackageNameError) { + // Create another file which defines symbol "foo". + FileDescriptorProto other_file; + other_file.set_name("bar.proto"); + other_file.add_message_type()->set_name("foo"); + EXPECT_TRUE(pool_.BuildFile(other_file) != NULL); + + // Now try to define it as a package. + ExpectHasValidationErrors( + "package foo.bar;", + "0:8: \"foo\" is already defined (as something other than a package) " + "in file \"bar.proto\".\n"); +} + +TEST_F(ParserValidationErrorTest, MessageNameError) { + ExpectHasValidationErrors( + "message Foo {}\n" + "message Foo {}\n", + "1:8: \"Foo\" is already defined.\n"); +} + +TEST_F(ParserValidationErrorTest, FieldNameError) { + ExpectHasValidationErrors( + "message Foo {\n" + " optional int32 bar = 1;\n" + " optional int32 bar = 2;\n" + "}\n", + "2:17: \"bar\" is already defined in \"Foo\".\n"); +} + +TEST_F(ParserValidationErrorTest, FieldTypeError) { + ExpectHasValidationErrors( + "message Foo {\n" + " optional Baz bar = 1;\n" + "}\n", + "1:11: \"Baz\" is not defined.\n"); +} + +TEST_F(ParserValidationErrorTest, FieldNumberError) { + ExpectHasValidationErrors( + "message Foo {\n" + " optional int32 bar = 0;\n" + "}\n", + "1:23: Field numbers must be positive integers.\n"); +} + +TEST_F(ParserValidationErrorTest, FieldExtendeeError) { + ExpectHasValidationErrors( + "extend Baz { optional int32 bar = 1; }\n", + "0:7: \"Baz\" is not defined.\n"); +} + +TEST_F(ParserValidationErrorTest, FieldDefaultValueError) { + ExpectHasValidationErrors( + "enum Baz { QUX = 1; }\n" + "message Foo {\n" + " optional Baz bar = 1 [default=NO_SUCH_VALUE];\n" + "}\n", + "2:32: Enum type \"Baz\" has no value named \"NO_SUCH_VALUE\".\n"); +} + +TEST_F(ParserValidationErrorTest, FileOptionNameError) { + ExpectHasValidationErrors( + "option foo = 5;", + "0:7: Option \"foo\" unknown.\n"); +} + +TEST_F(ParserValidationErrorTest, FileOptionValueError) { + ExpectHasValidationErrors( + "option java_outer_classname = 5;", + "0:30: Value must be quoted string for string option " + "\"google.protobuf.FileOptions.java_outer_classname\".\n"); +} + +TEST_F(ParserValidationErrorTest, FieldOptionNameError) { + ExpectHasValidationErrors( + "message Foo {\n" + " optional bool bar = 1 [foo=1];\n" + "}\n", + "1:25: Option \"foo\" unknown.\n"); +} + +TEST_F(ParserValidationErrorTest, FieldOptionValueError) { + ExpectHasValidationErrors( + "message Foo {\n" + " optional int32 bar = 1 [ctype=1];\n" + "}\n", + "1:32: Value must be identifier for enum-valued option " + "\"google.protobuf.FieldOptions.ctype\".\n"); +} + +TEST_F(ParserValidationErrorTest, ExtensionRangeNumberError) { + ExpectHasValidationErrors( + "message Foo {\n" + " extensions 0;\n" + "}\n", + "1:13: Extension numbers must be positive integers.\n"); +} + +TEST_F(ParserValidationErrorTest, EnumNameError) { + ExpectHasValidationErrors( + "enum Foo {A = 1;}\n" + "enum Foo {B = 1;}\n", + "1:5: \"Foo\" is already defined.\n"); +} + +TEST_F(ParserValidationErrorTest, EnumValueNameError) { + ExpectHasValidationErrors( + "enum Foo {\n" + " BAR = 1;\n" + " BAR = 1;\n" + "}\n", + "2:2: \"BAR\" is already defined.\n"); +} + +TEST_F(ParserValidationErrorTest, ServiceNameError) { + ExpectHasValidationErrors( + "service Foo {}\n" + "service Foo {}\n", + "1:8: \"Foo\" is already defined.\n"); +} + +TEST_F(ParserValidationErrorTest, MethodNameError) { + ExpectHasValidationErrors( + "message Baz {}\n" + "service Foo {\n" + " rpc Bar(Baz) returns(Baz);\n" + " rpc Bar(Baz) returns(Baz);\n" + "}\n", + "3:6: \"Bar\" is already defined in \"Foo\".\n"); +} + +TEST_F(ParserValidationErrorTest, MethodInputTypeError) { + ExpectHasValidationErrors( + "message Baz {}\n" + "service Foo {\n" + " rpc Bar(Qux) returns(Baz);\n" + "}\n", + "2:10: \"Qux\" is not defined.\n"); +} + +TEST_F(ParserValidationErrorTest, MethodOutputTypeError) { + ExpectHasValidationErrors( + "message Baz {}\n" + "service Foo {\n" + " rpc Bar(Baz) returns(Qux);\n" + "}\n", + "2:23: \"Qux\" is not defined.\n"); +} + +// =================================================================== +// Test that the output from FileDescriptor::DebugString() (and all other +// descriptor types) is parseable, and results in the same Descriptor +// definitions again afoter parsing (not, however, that the order of messages +// cannot be guaranteed to be the same) + +typedef ParserTest ParseDecriptorDebugTest; + +class CompareDescriptorNames { + public: + bool operator()(const DescriptorProto* left, const DescriptorProto* right) { + return left->name() < right->name(); + } +}; + +// Sorts nested DescriptorProtos of a DescriptoProto, by name. +void SortMessages(DescriptorProto *descriptor_proto) { + int size = descriptor_proto->nested_type_size(); + // recursively sort; we can't guarantee the order of nested messages either + for (int i = 0; i < size; ++i) { + SortMessages(descriptor_proto->mutable_nested_type(i)); + } + DescriptorProto **data = + descriptor_proto->mutable_nested_type()->mutable_data(); + sort(data, data + size, CompareDescriptorNames()); +} + +// Sorts DescriptorProtos belonging to a FileDescriptorProto, by name. +void SortMessages(FileDescriptorProto *file_descriptor_proto) { + int size = file_descriptor_proto->message_type_size(); + // recursively sort; we can't guarantee the order of nested messages either + for (int i = 0; i < size; ++i) { + SortMessages(file_descriptor_proto->mutable_message_type(i)); + } + DescriptorProto **data = + file_descriptor_proto->mutable_message_type()->mutable_data(); + sort(data, data + size, CompareDescriptorNames()); +} + +TEST_F(ParseDecriptorDebugTest, TestAllDescriptorTypes) { + const FileDescriptor* original_file = + protobuf_unittest::TestAllTypes::descriptor()->file(); + FileDescriptorProto expected; + original_file->CopyTo(&expected); + + // Get the DebugString of the unittest.proto FileDecriptor, which includes + // all other descriptor types + string debug_string = original_file->DebugString(); + + // Parse the debug string + SetupParser(debug_string.c_str()); + FileDescriptorProto parsed; + parser_->Parse(input_.get(), &parsed); + EXPECT_EQ(io::Tokenizer::TYPE_END, input_->current().type); + ASSERT_EQ("", error_collector_.text_); + + // We now have a FileDescriptorProto, but to compare with the expected we + // need to link to a FileDecriptor, then output back to a proto. We'll + // also need to give it the same name as the original. + parsed.set_name("google/protobuf/unittest.proto"); + // We need the imported dependency before we can build our parsed proto + const FileDescriptor* import = + protobuf_unittest_import::ImportMessage::descriptor()->file(); + FileDescriptorProto import_proto; + import->CopyTo(&import_proto); + ASSERT_TRUE(pool_.BuildFile(import_proto) != NULL); + const FileDescriptor* actual = pool_.BuildFile(parsed); + parsed.Clear(); + actual->CopyTo(&parsed); + ASSERT_TRUE(actual != NULL); + + // The messages might be in different orders, making them hard to compare. + // So, sort the messages in the descriptor protos (including nested messages, + // recursively). + SortMessages(&expected); + SortMessages(&parsed); + + // I really wanted to use StringDiff here for the debug output on fail, + // but the strings are too long for it, and if I increase its max size, + // we get a memory allocation failure :( + EXPECT_EQ(expected.DebugString(), parsed.DebugString()); +} + +// =================================================================== +// SourceCodeInfo tests. + +// Follows a path -- as defined by SourceCodeInfo.Location.path -- from a +// message to a particular sub-field. +// * If the target is itself a message, sets *output_message to point at it, +// *output_field to NULL, and *output_index to -1. +// * Otherwise, if the target is an element of a repeated field, sets +// *output_message to the containing message, *output_field to the descriptor +// of the field, and *output_index to the index of the element. +// * Otherwise, the target is a field (possibly a repeated field, but not any +// one element). Sets *output_message to the containing message, +// *output_field to the descriptor of the field, and *output_index to -1. +// Returns true if the path was valid, false otherwise. A gTest failure is +// recorded before returning false. +bool FollowPath(const Message& root, + const int* path_begin, const int* path_end, + const Message** output_message, + const FieldDescriptor** output_field, + int* output_index) { + if (path_begin == path_end) { + // Path refers to this whole message. + *output_message = &root; + *output_field = NULL; + *output_index = -1; + return true; + } + + const Descriptor* descriptor = root.GetDescriptor(); + const Reflection* reflection = root.GetReflection(); + + const FieldDescriptor* field = descriptor->FindFieldByNumber(*path_begin); + + if (field == NULL) { + ADD_FAILURE() << descriptor->name() << " has no field number: " + << *path_begin; + return false; + } + + ++path_begin; + + if (field->is_repeated()) { + if (path_begin == path_end) { + // Path refers to the whole repeated field. + *output_message = &root; + *output_field = field; + *output_index = -1; + return true; + } + + int index = *path_begin++; + int size = reflection->FieldSize(root, field); + + if (index >= size) { + ADD_FAILURE() << descriptor->name() << "." << field->name() + << " has size " << size << ", but path contained index: " + << index; + return false; + } + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + // Descend into child message. + const Message& child = reflection->GetRepeatedMessage(root, field, index); + return FollowPath(child, path_begin, path_end, + output_message, output_field, output_index); + } else if (path_begin == path_end) { + // Path refers to this element. + *output_message = &root; + *output_field = field; + *output_index = index; + return true; + } else { + ADD_FAILURE() << descriptor->name() << "." << field->name() + << " is not a message; cannot descend into it."; + return false; + } + } else { + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + const Message& child = reflection->GetMessage(root, field); + return FollowPath(child, path_begin, path_end, + output_message, output_field, output_index); + } else if (path_begin == path_end) { + // Path refers to this field. + *output_message = &root; + *output_field = field; + *output_index = -1; + return true; + } else { + ADD_FAILURE() << descriptor->name() << "." << field->name() + << " is not a message; cannot descend into it."; + return false; + } + } +} + +// Split some text on line breaks. The line breaks are retained in the output, +// so each line (except the last) ends with a '\n', and the lines can be +// concatenated to produce the original text. +// +// I couldn't find the proper string utility function for this. Our +// split-on-delimiter functions don't include the delimiter in the output. +void SplitLines(const string& text, vector* lines) { + string::size_type pos = 0; + + while (pos != string::npos) { + string::size_type last_pos = pos; + pos = text.find_first_of('\n', pos); + if (pos != string::npos) ++pos; + lines->push_back(text.substr(last_pos, pos - last_pos)); + } +} + +// Look for the given tags in the given text and construct a span (as defined +// by SourceCodeInfo.Location.span) from them. E.g. for text like: +// /*a*/message /*b*/Foo/*c*/ {}/*d*/ +// There are four tags: "a", "b", "c", and "d". The constructed span starts +// immediately after the start tag's trailing '/' and ends immediately before +// the end tags leading '/'. +void MakeExpectedSpan(const vector& lines, + const string& start_tag, const string& end_tag, + RepeatedField* output) { + string start_comment = "/*" + start_tag + "*/"; + string end_comment = "/*" + end_tag + "*/"; + + int start_line = -1; + int start_column = -1; + for (int i = 0; i < lines.size(); i++) { + string::size_type pos = lines[i].find(start_comment); + if (pos != string::npos) { + start_line = i; + start_column = pos + start_comment.size(); + break; + } + } + ASSERT_NE(start_line, -1) + << "Tag \"" << start_comment << "\" not found in text."; + + int end_line = -1; + int end_column = -1; + for (int i = start_line; i < lines.size(); i++) { + string::size_type pos = lines[i].find(end_comment); + if (pos != string::npos) { + end_line = i; + end_column = pos; + break; + } + } + ASSERT_NE(end_line, -1) + << "Tag \"" << end_comment << "\" not found in text."; + + output->Add(start_line); + output->Add(start_column); + if (end_line != start_line) output->Add(end_line); + output->Add(end_column); +} + +// Check if two spans are equal. +bool CompareSpans(const RepeatedField& span1, + const RepeatedField& span2) { + if (span1.size() != span2.size()) return false; + for (int i = 0; i < span1.size(); i++) { + if (span1.Get(i) != span2.Get(i)) return false; + } + return true; +} + +// Test fixture for source info tests, which check that source locations are +// recorded correctly in FileDescriptorProto.source_code_info.location. +class SourceInfoTest : public ParserTest { + protected: + // The parsed file (initialized by Parse()). + FileDescriptorProto file_; + + // Parse the given text as a .proto file and populate the spans_ map with + // all the source location spans in its SourceCodeInfo table. + bool Parse(const char* text) { + SetupParser(text); + SplitLines(text, &lines_); + if (!parser_->Parse(input_.get(), &file_)) { + return false; + } + + const SourceCodeInfo& source_info = file_.source_code_info(); + for (int i = 0; i < source_info.location_size(); i++) { + const SourceCodeInfo::Location& location = source_info.location(i); + const Message* descriptor_proto = NULL; + const FieldDescriptor* field = NULL; + int index = 0; + if (!FollowPath(file_, location.path().begin(), location.path().end(), + &descriptor_proto, &field, &index)) { + return false; + } + + spans_.insert(make_pair(SpanKey(*descriptor_proto, field, index), + &location)); + } + + return true; + } + + virtual void TearDown() { + EXPECT_TRUE(spans_.empty()) + << "Forgot to call HasSpan() for:\n" + << spans_.begin()->second->DebugString(); + } + + // ----------------------------------------------------------------- + // HasSpan() checks that the span of source code delimited by the given + // tags (comments) correspond via the SourceCodeInfo table to the given + // part of the FileDescriptorProto. (If unclear, look at the actual tests; + // it should quickly become obvious.) + + bool HasSpan(const char* start_tag, const char* end_tag, + const Message& descriptor_proto) { + return HasSpan(start_tag, end_tag, descriptor_proto, NULL, -1); + } + + bool HasSpan(const char* start_tag, const char* end_tag, + const Message& descriptor_proto, const string& field_name) { + return HasSpan(start_tag, end_tag, descriptor_proto, field_name, -1); + } + + bool HasSpan(const char* start_tag, const char* end_tag, + const Message& descriptor_proto, const string& field_name, + int index) { + const FieldDescriptor* field = + descriptor_proto.GetDescriptor()->FindFieldByName(field_name); + if (field == NULL) { + ADD_FAILURE() << descriptor_proto.GetDescriptor()->name() + << " has no such field: " << field_name; + return false; + } + + return HasSpan(start_tag, end_tag, descriptor_proto, field, index); + } + + bool HasSpan(const Message& descriptor_proto) { + return HasSpan(NULL, NULL, descriptor_proto, NULL, -1); + } + + bool HasSpan(const Message& descriptor_proto, const string& field_name) { + return HasSpan(NULL, NULL, descriptor_proto, field_name, -1); + } + + bool HasSpan(const Message& descriptor_proto, const string& field_name, + int index) { + return HasSpan(NULL, NULL, descriptor_proto, field_name, index); + } + + bool HasSpan(const char* start_tag, const char* end_tag, + const Message& descriptor_proto, const FieldDescriptor* field, + int index) { + pair range = + spans_.equal_range(SpanKey(descriptor_proto, field, index)); + + if (start_tag == NULL) { + if (range.first == range.second) { + return false; + } else { + spans_.erase(range.first); + return true; + } + } else { + RepeatedField expected_span; + MakeExpectedSpan(lines_, start_tag, end_tag, &expected_span); + + for (SpanMap::iterator iter = range.first; iter != range.second; ++iter) { + if (CompareSpans(expected_span, iter->second->span())) { + spans_.erase(iter); + return true; + } + } + + return false; + } + } + + private: + struct SpanKey { + const Message* descriptor_proto; + const FieldDescriptor* field; + int index; + + inline SpanKey() {} + inline SpanKey(const Message& descriptor_proto, + const FieldDescriptor* field, + int index) + : descriptor_proto(&descriptor_proto), field(field), index(index) {} + + inline bool operator<(const SpanKey& other) const { + if (descriptor_proto < other.descriptor_proto) return true; + if (descriptor_proto > other.descriptor_proto) return false; + if (field < other.field) return true; + if (field > other.field) return false; + return index < other.index; + } + }; + + typedef multimap SpanMap; + SpanMap spans_; + vector lines_; +}; + +TEST_F(SourceInfoTest, BasicFileDecls) { + EXPECT_TRUE(Parse( + "/*a*/syntax = \"proto2\";\n" + "package /*b*/foo.bar/*c*/;\n" + "import /*d*/\"baz.proto\"/*e*/;\n" + "import /*f*/\"qux.proto\"/*g*/;/*h*/\n" + "// comment ignored\n")); + + EXPECT_TRUE(HasSpan("a", "h", file_)); + EXPECT_TRUE(HasSpan("b", "c", file_, "package")); + EXPECT_TRUE(HasSpan("d", "e", file_, "dependency", 0)); + EXPECT_TRUE(HasSpan("f", "g", file_, "dependency", 1)); +} + +TEST_F(SourceInfoTest, Messages) { + EXPECT_TRUE(Parse( + "/*a*/message /*b*/Foo/*c*/ {}/*d*/\n" + "/*e*/message /*f*/Bar/*g*/ {}/*h*/\n")); + + EXPECT_TRUE(HasSpan("a", "d", file_.message_type(0))); + EXPECT_TRUE(HasSpan("b", "c", file_.message_type(0), "name")); + EXPECT_TRUE(HasSpan("e", "h", file_.message_type(1))); + EXPECT_TRUE(HasSpan("f", "g", file_.message_type(1), "name")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); +} + +TEST_F(SourceInfoTest, Fields) { + EXPECT_TRUE(Parse( + "message Foo {\n" + " /*a*/optional/*b*/ /*c*/int32/*d*/ /*e*/bar/*f*/ = /*g*/1/*h*/;/*i*/\n" + " /*j*/repeated/*k*/ /*l*/X.Y/*m*/ /*n*/baz/*o*/ = /*p*/2/*q*/;/*r*/\n" + "}\n")); + + const FieldDescriptorProto& field1 = file_.message_type(0).field(0); + const FieldDescriptorProto& field2 = file_.message_type(0).field(1); + + EXPECT_TRUE(HasSpan("a", "i", field1)); + EXPECT_TRUE(HasSpan("a", "b", field1, "label")); + EXPECT_TRUE(HasSpan("c", "d", field1, "type")); + EXPECT_TRUE(HasSpan("e", "f", field1, "name")); + EXPECT_TRUE(HasSpan("g", "h", field1, "number")); + + EXPECT_TRUE(HasSpan("j", "r", field2)); + EXPECT_TRUE(HasSpan("j", "k", field2, "label")); + EXPECT_TRUE(HasSpan("l", "m", field2, "type_name")); + EXPECT_TRUE(HasSpan("n", "o", field2, "name")); + EXPECT_TRUE(HasSpan("p", "q", field2, "number")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); +} + +TEST_F(SourceInfoTest, Extensions) { + EXPECT_TRUE(Parse( + "/*a*/extend /*b*/Foo/*c*/ {\n" + " /*d*/optional/*e*/ int32 bar = 1;/*f*/\n" + " /*g*/repeated/*h*/ X.Y baz = 2;/*i*/\n" + "}/*j*/\n" + "/*k*/extend /*l*/Bar/*m*/ {\n" + " /*n*/optional int32 qux = 1;/*o*/\n" + "}/*p*/\n")); + + const FieldDescriptorProto& field1 = file_.extension(0); + const FieldDescriptorProto& field2 = file_.extension(1); + const FieldDescriptorProto& field3 = file_.extension(2); + + EXPECT_TRUE(HasSpan("a", "j", file_, "extension")); + EXPECT_TRUE(HasSpan("k", "p", file_, "extension")); + + EXPECT_TRUE(HasSpan("d", "f", field1)); + EXPECT_TRUE(HasSpan("d", "e", field1, "label")); + EXPECT_TRUE(HasSpan("b", "c", field1, "extendee")); + + EXPECT_TRUE(HasSpan("g", "i", field2)); + EXPECT_TRUE(HasSpan("g", "h", field2, "label")); + EXPECT_TRUE(HasSpan("b", "c", field2, "extendee")); + + EXPECT_TRUE(HasSpan("n", "o", field3)); + EXPECT_TRUE(HasSpan("l", "m", field3, "extendee")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(field1, "type")); + EXPECT_TRUE(HasSpan(field1, "name")); + EXPECT_TRUE(HasSpan(field1, "number")); + EXPECT_TRUE(HasSpan(field2, "type_name")); + EXPECT_TRUE(HasSpan(field2, "name")); + EXPECT_TRUE(HasSpan(field2, "number")); + EXPECT_TRUE(HasSpan(field3, "label")); + EXPECT_TRUE(HasSpan(field3, "type")); + EXPECT_TRUE(HasSpan(field3, "name")); + EXPECT_TRUE(HasSpan(field3, "number")); +} + +TEST_F(SourceInfoTest, NestedExtensions) { + EXPECT_TRUE(Parse( + "message Message {\n" + " /*a*/extend /*b*/Foo/*c*/ {\n" + " /*d*/optional/*e*/ int32 bar = 1;/*f*/\n" + " /*g*/repeated/*h*/ X.Y baz = 2;/*i*/\n" + " }/*j*/\n" + " /*k*/extend /*l*/Bar/*m*/ {\n" + " /*n*/optional int32 qux = 1;/*o*/\n" + " }/*p*/\n" + "}\n")); + + const FieldDescriptorProto& field1 = file_.message_type(0).extension(0); + const FieldDescriptorProto& field2 = file_.message_type(0).extension(1); + const FieldDescriptorProto& field3 = file_.message_type(0).extension(2); + + EXPECT_TRUE(HasSpan("a", "j", file_.message_type(0), "extension")); + EXPECT_TRUE(HasSpan("k", "p", file_.message_type(0), "extension")); + + EXPECT_TRUE(HasSpan("d", "f", field1)); + EXPECT_TRUE(HasSpan("d", "e", field1, "label")); + EXPECT_TRUE(HasSpan("b", "c", field1, "extendee")); + + EXPECT_TRUE(HasSpan("g", "i", field2)); + EXPECT_TRUE(HasSpan("g", "h", field2, "label")); + EXPECT_TRUE(HasSpan("b", "c", field2, "extendee")); + + EXPECT_TRUE(HasSpan("n", "o", field3)); + EXPECT_TRUE(HasSpan("l", "m", field3, "extendee")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); + EXPECT_TRUE(HasSpan(field1, "type")); + EXPECT_TRUE(HasSpan(field1, "name")); + EXPECT_TRUE(HasSpan(field1, "number")); + EXPECT_TRUE(HasSpan(field2, "type_name")); + EXPECT_TRUE(HasSpan(field2, "name")); + EXPECT_TRUE(HasSpan(field2, "number")); + EXPECT_TRUE(HasSpan(field3, "label")); + EXPECT_TRUE(HasSpan(field3, "type")); + EXPECT_TRUE(HasSpan(field3, "name")); + EXPECT_TRUE(HasSpan(field3, "number")); +} + +TEST_F(SourceInfoTest, ExtensionRanges) { + EXPECT_TRUE(Parse( + "message Message {\n" + " /*a*/extensions /*b*/1/*c*/ to /*d*/4/*e*/, /*f*/6/*g*/;/*h*/\n" + " /*i*/extensions /*j*/8/*k*/ to /*l*/max/*m*/;/*n*/\n" + "}\n")); + + const DescriptorProto::ExtensionRange& range1 = + file_.message_type(0).extension_range(0); + const DescriptorProto::ExtensionRange& range2 = + file_.message_type(0).extension_range(1); + const DescriptorProto::ExtensionRange& range3 = + file_.message_type(0).extension_range(2); + + EXPECT_TRUE(HasSpan("a", "h", file_.message_type(0), "extension_range")); + EXPECT_TRUE(HasSpan("i", "n", file_.message_type(0), "extension_range")); + + EXPECT_TRUE(HasSpan("b", "e", range1)); + EXPECT_TRUE(HasSpan("b", "c", range1, "start")); + EXPECT_TRUE(HasSpan("d", "e", range1, "end")); + + EXPECT_TRUE(HasSpan("f", "g", range2)); + EXPECT_TRUE(HasSpan("f", "g", range2, "start")); + EXPECT_TRUE(HasSpan("f", "g", range2, "end")); + + EXPECT_TRUE(HasSpan("j", "m", range3)); + EXPECT_TRUE(HasSpan("j", "k", range3, "start")); + EXPECT_TRUE(HasSpan("l", "m", range3, "end")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); +} + +TEST_F(SourceInfoTest, NestedMessages) { + EXPECT_TRUE(Parse( + "message Foo {\n" + " /*a*/message /*b*/Bar/*c*/ {\n" + " /*d*/message /*e*/Baz/*f*/ {}/*g*/\n" + " }/*h*/\n" + " /*i*/message /*j*/Qux/*k*/ {}/*l*/\n" + "}\n")); + + const DescriptorProto& bar = file_.message_type(0).nested_type(0); + const DescriptorProto& baz = bar.nested_type(0); + const DescriptorProto& qux = file_.message_type(0).nested_type(1); + + EXPECT_TRUE(HasSpan("a", "h", bar)); + EXPECT_TRUE(HasSpan("b", "c", bar, "name")); + EXPECT_TRUE(HasSpan("d", "g", baz)); + EXPECT_TRUE(HasSpan("e", "f", baz, "name")); + EXPECT_TRUE(HasSpan("i", "l", qux)); + EXPECT_TRUE(HasSpan("j", "k", qux, "name")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); +} + +TEST_F(SourceInfoTest, Groups) { + EXPECT_TRUE(Parse( + "message Foo {\n" + " message Bar {}\n" + " /*a*/optional/*b*/ /*c*/group/*d*/ /*e*/Baz/*f*/ = /*g*/1/*h*/ {\n" + " /*i*/message Qux {}/*j*/\n" + " }/*k*/\n" + "}\n")); + + const DescriptorProto& bar = file_.message_type(0).nested_type(0); + const DescriptorProto& baz = file_.message_type(0).nested_type(1); + const DescriptorProto& qux = baz.nested_type(0); + const FieldDescriptorProto& field = file_.message_type(0).field(0); + + EXPECT_TRUE(HasSpan("a", "k", field)); + EXPECT_TRUE(HasSpan("a", "b", field, "label")); + EXPECT_TRUE(HasSpan("c", "d", field, "type")); + EXPECT_TRUE(HasSpan("e", "f", field, "name")); + EXPECT_TRUE(HasSpan("e", "f", field, "type_name")); + EXPECT_TRUE(HasSpan("g", "h", field, "number")); + + EXPECT_TRUE(HasSpan("a", "k", baz)); + EXPECT_TRUE(HasSpan("e", "f", baz, "name")); + EXPECT_TRUE(HasSpan("i", "j", qux)); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); + EXPECT_TRUE(HasSpan(bar)); + EXPECT_TRUE(HasSpan(bar, "name")); + EXPECT_TRUE(HasSpan(qux, "name")); +} + +TEST_F(SourceInfoTest, Enums) { + EXPECT_TRUE(Parse( + "/*a*/enum /*b*/Foo/*c*/ {}/*d*/\n" + "/*e*/enum /*f*/Bar/*g*/ {}/*h*/\n")); + + EXPECT_TRUE(HasSpan("a", "d", file_.enum_type(0))); + EXPECT_TRUE(HasSpan("b", "c", file_.enum_type(0), "name")); + EXPECT_TRUE(HasSpan("e", "h", file_.enum_type(1))); + EXPECT_TRUE(HasSpan("f", "g", file_.enum_type(1), "name")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); +} + +TEST_F(SourceInfoTest, EnumValues) { + EXPECT_TRUE(Parse( + "enum Foo {\n" + " /*a*/BAR/*b*/ = /*c*/1/*d*/;/*e*/\n" + " /*f*/BAZ/*g*/ = /*h*/2/*i*/;/*j*/\n" + "}")); + + const EnumValueDescriptorProto& bar = file_.enum_type(0).value(0); + const EnumValueDescriptorProto& baz = file_.enum_type(0).value(1); + + EXPECT_TRUE(HasSpan("a", "e", bar)); + EXPECT_TRUE(HasSpan("a", "b", bar, "name")); + EXPECT_TRUE(HasSpan("c", "d", bar, "number")); + EXPECT_TRUE(HasSpan("f", "j", baz)); + EXPECT_TRUE(HasSpan("f", "g", baz, "name")); + EXPECT_TRUE(HasSpan("h", "i", baz, "number")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.enum_type(0))); + EXPECT_TRUE(HasSpan(file_.enum_type(0), "name")); +} + +TEST_F(SourceInfoTest, NestedEnums) { + EXPECT_TRUE(Parse( + "message Foo {\n" + " /*a*/enum /*b*/Bar/*c*/ {}/*d*/\n" + " /*e*/enum /*f*/Baz/*g*/ {}/*h*/\n" + "}\n")); + + const EnumDescriptorProto& bar = file_.message_type(0).enum_type(0); + const EnumDescriptorProto& baz = file_.message_type(0).enum_type(1); + + EXPECT_TRUE(HasSpan("a", "d", bar)); + EXPECT_TRUE(HasSpan("b", "c", bar, "name")); + EXPECT_TRUE(HasSpan("e", "h", baz)); + EXPECT_TRUE(HasSpan("f", "g", baz, "name")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); +} + +TEST_F(SourceInfoTest, Services) { + EXPECT_TRUE(Parse( + "/*a*/service /*b*/Foo/*c*/ {}/*d*/\n" + "/*e*/service /*f*/Bar/*g*/ {}/*h*/\n")); + + EXPECT_TRUE(HasSpan("a", "d", file_.service(0))); + EXPECT_TRUE(HasSpan("b", "c", file_.service(0), "name")); + EXPECT_TRUE(HasSpan("e", "h", file_.service(1))); + EXPECT_TRUE(HasSpan("f", "g", file_.service(1), "name")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); +} + +TEST_F(SourceInfoTest, Methods) { + EXPECT_TRUE(Parse( + "service Foo {\n" + " /*a*/rpc /*b*/Bar/*c*/(/*d*/X/*e*/) returns(/*f*/Y/*g*/);/*h*/" + " /*i*/rpc /*j*/Baz/*k*/(/*l*/Z/*m*/) returns(/*n*/W/*o*/);/*p*/" + "}")); + + const MethodDescriptorProto& bar = file_.service(0).method(0); + const MethodDescriptorProto& baz = file_.service(0).method(1); + + EXPECT_TRUE(HasSpan("a", "h", bar)); + EXPECT_TRUE(HasSpan("b", "c", bar, "name")); + EXPECT_TRUE(HasSpan("d", "e", bar, "input_type")); + EXPECT_TRUE(HasSpan("f", "g", bar, "output_type")); + + EXPECT_TRUE(HasSpan("i", "p", baz)); + EXPECT_TRUE(HasSpan("j", "k", baz, "name")); + EXPECT_TRUE(HasSpan("l", "m", baz, "input_type")); + EXPECT_TRUE(HasSpan("n", "o", baz, "output_type")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.service(0))); + EXPECT_TRUE(HasSpan(file_.service(0), "name")); +} + +TEST_F(SourceInfoTest, Options) { + EXPECT_TRUE(Parse( + "/*a*/option /*b*/foo/*c*/./*d*/(/*e*/bar.baz/*f*/)/*g*/ = " + "/*h*/123/*i*/;/*j*/\n" + "/*k*/option qux = /*l*/-123/*m*/;/*n*/\n" + "/*o*/option corge = /*p*/abc/*q*/;/*r*/\n" + "/*s*/option grault = /*t*/'blah'/*u*/;/*v*/\n" + "/*w*/option garply = /*x*/{ yadda yadda }/*y*/;/*z*/\n" + "/*0*/option waldo = /*1*/123.0/*2*/;/*3*/\n" + )); + + const UninterpretedOption& option1 = file_.options().uninterpreted_option(0); + const UninterpretedOption& option2 = file_.options().uninterpreted_option(1); + const UninterpretedOption& option3 = file_.options().uninterpreted_option(2); + const UninterpretedOption& option4 = file_.options().uninterpreted_option(3); + const UninterpretedOption& option5 = file_.options().uninterpreted_option(4); + const UninterpretedOption& option6 = file_.options().uninterpreted_option(5); + + EXPECT_TRUE(HasSpan("a", "j", file_.options())); + EXPECT_TRUE(HasSpan("b", "i", option1)); + EXPECT_TRUE(HasSpan("b", "g", option1, "name")); + EXPECT_TRUE(HasSpan("b", "c", option1.name(0))); + EXPECT_TRUE(HasSpan("b", "c", option1.name(0), "name_part")); + EXPECT_TRUE(HasSpan("d", "g", option1.name(1))); + EXPECT_TRUE(HasSpan("e", "f", option1.name(1), "name_part")); + EXPECT_TRUE(HasSpan("h", "i", option1, "positive_int_value")); + + EXPECT_TRUE(HasSpan("k", "n", file_.options())); + EXPECT_TRUE(HasSpan("l", "m", option2, "negative_int_value")); + + EXPECT_TRUE(HasSpan("o", "r", file_.options())); + EXPECT_TRUE(HasSpan("p", "q", option3, "identifier_value")); + + EXPECT_TRUE(HasSpan("s", "v", file_.options())); + EXPECT_TRUE(HasSpan("t", "u", option4, "string_value")); + + EXPECT_TRUE(HasSpan("w", "z", file_.options())); + EXPECT_TRUE(HasSpan("x", "y", option5, "aggregate_value")); + + EXPECT_TRUE(HasSpan("0", "3", file_.options())); + EXPECT_TRUE(HasSpan("1", "2", option6, "double_value")); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(option2)); + EXPECT_TRUE(HasSpan(option3)); + EXPECT_TRUE(HasSpan(option4)); + EXPECT_TRUE(HasSpan(option5)); + EXPECT_TRUE(HasSpan(option6)); + EXPECT_TRUE(HasSpan(option2, "name")); + EXPECT_TRUE(HasSpan(option3, "name")); + EXPECT_TRUE(HasSpan(option4, "name")); + EXPECT_TRUE(HasSpan(option5, "name")); + EXPECT_TRUE(HasSpan(option6, "name")); + EXPECT_TRUE(HasSpan(option2.name(0))); + EXPECT_TRUE(HasSpan(option3.name(0))); + EXPECT_TRUE(HasSpan(option4.name(0))); + EXPECT_TRUE(HasSpan(option5.name(0))); + EXPECT_TRUE(HasSpan(option6.name(0))); + EXPECT_TRUE(HasSpan(option2.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option3.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option4.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option5.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option6.name(0), "name_part")); +} + +TEST_F(SourceInfoTest, ScopedOptions) { + EXPECT_TRUE(Parse( + "message Foo {\n" + " /*a*/option mopt = 1;/*b*/\n" + "}\n" + "enum Bar {\n" + " /*c*/option eopt = 1;/*d*/\n" + "}\n" + "service Baz {\n" + " /*e*/option sopt = 1;/*f*/\n" + " rpc M(X) returns(Y) {\n" + " /*g*/option mopt = 1;/*h*/\n" + " }\n" + "}\n")); + + EXPECT_TRUE(HasSpan("a", "b", file_.message_type(0).options())); + EXPECT_TRUE(HasSpan("c", "d", file_.enum_type(0).options())); + EXPECT_TRUE(HasSpan("e", "f", file_.service(0).options())); + EXPECT_TRUE(HasSpan("g", "h", file_.service(0).method(0).options())); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); + EXPECT_TRUE(HasSpan(file_.message_type(0).options() + .uninterpreted_option(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0).options() + .uninterpreted_option(0), "name")); + EXPECT_TRUE(HasSpan(file_.message_type(0).options() + .uninterpreted_option(0).name(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0).options() + .uninterpreted_option(0).name(0), "name_part")); + EXPECT_TRUE(HasSpan(file_.message_type(0).options() + .uninterpreted_option(0), "positive_int_value")); + EXPECT_TRUE(HasSpan(file_.enum_type(0))); + EXPECT_TRUE(HasSpan(file_.enum_type(0), "name")); + EXPECT_TRUE(HasSpan(file_.enum_type(0).options() + .uninterpreted_option(0))); + EXPECT_TRUE(HasSpan(file_.enum_type(0).options() + .uninterpreted_option(0), "name")); + EXPECT_TRUE(HasSpan(file_.enum_type(0).options() + .uninterpreted_option(0).name(0))); + EXPECT_TRUE(HasSpan(file_.enum_type(0).options() + .uninterpreted_option(0).name(0), "name_part")); + EXPECT_TRUE(HasSpan(file_.enum_type(0).options() + .uninterpreted_option(0), "positive_int_value")); + EXPECT_TRUE(HasSpan(file_.service(0))); + EXPECT_TRUE(HasSpan(file_.service(0), "name")); + EXPECT_TRUE(HasSpan(file_.service(0).method(0))); + EXPECT_TRUE(HasSpan(file_.service(0).options() + .uninterpreted_option(0))); + EXPECT_TRUE(HasSpan(file_.service(0).options() + .uninterpreted_option(0), "name")); + EXPECT_TRUE(HasSpan(file_.service(0).options() + .uninterpreted_option(0).name(0))); + EXPECT_TRUE(HasSpan(file_.service(0).options() + .uninterpreted_option(0).name(0), "name_part")); + EXPECT_TRUE(HasSpan(file_.service(0).options() + .uninterpreted_option(0), "positive_int_value")); + EXPECT_TRUE(HasSpan(file_.service(0).method(0), "name")); + EXPECT_TRUE(HasSpan(file_.service(0).method(0), "input_type")); + EXPECT_TRUE(HasSpan(file_.service(0).method(0), "output_type")); + EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() + .uninterpreted_option(0))); + EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() + .uninterpreted_option(0), "name")); + EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() + .uninterpreted_option(0).name(0))); + EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() + .uninterpreted_option(0).name(0), "name_part")); + EXPECT_TRUE(HasSpan(file_.service(0).method(0).options() + .uninterpreted_option(0), "positive_int_value")); +} + +TEST_F(SourceInfoTest, FieldOptions) { + // The actual "name = value" pairs are parsed by the same code as for + // top-level options so we won't re-test that -- just make sure that the + // syntax used for field options is understood. + EXPECT_TRUE(Parse( + "message Foo {" + " optional int32 bar = 1 " + "/*a*/[default=/*b*/123/*c*/,/*d*/opt1=123/*e*/," + "/*f*/opt2='hi'/*g*/]/*h*/;" + "}\n" + )); + + const FieldDescriptorProto& field = file_.message_type(0).field(0); + const UninterpretedOption& option1 = field.options().uninterpreted_option(0); + const UninterpretedOption& option2 = field.options().uninterpreted_option(1); + + EXPECT_TRUE(HasSpan("a", "h", field.options())); + EXPECT_TRUE(HasSpan("b", "c", field, "default_value")); + EXPECT_TRUE(HasSpan("d", "e", option1)); + EXPECT_TRUE(HasSpan("f", "g", option2)); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.message_type(0))); + EXPECT_TRUE(HasSpan(file_.message_type(0), "name")); + EXPECT_TRUE(HasSpan(field)); + EXPECT_TRUE(HasSpan(field, "label")); + EXPECT_TRUE(HasSpan(field, "type")); + EXPECT_TRUE(HasSpan(field, "name")); + EXPECT_TRUE(HasSpan(field, "number")); + EXPECT_TRUE(HasSpan(option1, "name")); + EXPECT_TRUE(HasSpan(option2, "name")); + EXPECT_TRUE(HasSpan(option1.name(0))); + EXPECT_TRUE(HasSpan(option2.name(0))); + EXPECT_TRUE(HasSpan(option1.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option2.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option1, "positive_int_value")); + EXPECT_TRUE(HasSpan(option2, "string_value")); +} + +TEST_F(SourceInfoTest, EnumValueOptions) { + // The actual "name = value" pairs are parsed by the same code as for + // top-level options so we won't re-test that -- just make sure that the + // syntax used for enum options is understood. + EXPECT_TRUE(Parse( + "enum Foo {" + " BAR = 1 /*a*/[/*b*/opt1=123/*c*/,/*d*/opt2='hi'/*e*/]/*f*/;" + "}\n" + )); + + const EnumValueDescriptorProto& value = file_.enum_type(0).value(0); + const UninterpretedOption& option1 = value.options().uninterpreted_option(0); + const UninterpretedOption& option2 = value.options().uninterpreted_option(1); + + EXPECT_TRUE(HasSpan("a", "f", value.options())); + EXPECT_TRUE(HasSpan("b", "c", option1)); + EXPECT_TRUE(HasSpan("d", "e", option2)); + + // Ignore these. + EXPECT_TRUE(HasSpan(file_)); + EXPECT_TRUE(HasSpan(file_.enum_type(0))); + EXPECT_TRUE(HasSpan(file_.enum_type(0), "name")); + EXPECT_TRUE(HasSpan(value)); + EXPECT_TRUE(HasSpan(value, "name")); + EXPECT_TRUE(HasSpan(value, "number")); + EXPECT_TRUE(HasSpan(option1, "name")); + EXPECT_TRUE(HasSpan(option2, "name")); + EXPECT_TRUE(HasSpan(option1.name(0))); + EXPECT_TRUE(HasSpan(option2.name(0))); + EXPECT_TRUE(HasSpan(option1.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option2.name(0), "name_part")); + EXPECT_TRUE(HasSpan(option1, "positive_int_value")); + EXPECT_TRUE(HasSpan(option2, "string_value")); +} + +// =================================================================== + +} // anonymous namespace + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc new file mode 100644 index 000000000..727f94216 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc @@ -0,0 +1,163 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include + +#include +#include + +#ifdef _WIN32 +#include +#include +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif +#ifndef STDOUT_FILENO +#define STDOUT_FILENO 1 +#endif +#else +#include +#endif + +#include +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace compiler { + +class GeneratorResponseContext : public GeneratorContext { + public: + GeneratorResponseContext(CodeGeneratorResponse* response, + const vector& parsed_files) + : response_(response), + parsed_files_(parsed_files) {} + virtual ~GeneratorResponseContext() {} + + // implements GeneratorContext -------------------------------------- + + virtual io::ZeroCopyOutputStream* Open(const string& filename) { + CodeGeneratorResponse::File* file = response_->add_file(); + file->set_name(filename); + return new io::StringOutputStream(file->mutable_content()); + } + + virtual io::ZeroCopyOutputStream* OpenForInsert( + const string& filename, const string& insertion_point) { + CodeGeneratorResponse::File* file = response_->add_file(); + file->set_name(filename); + file->set_insertion_point(insertion_point); + return new io::StringOutputStream(file->mutable_content()); + } + + void ListParsedFiles(vector* output) { + *output = parsed_files_; + } + + private: + CodeGeneratorResponse* response_; + const vector& parsed_files_; +}; + +int PluginMain(int argc, char* argv[], const CodeGenerator* generator) { + + if (argc > 1) { + cerr << argv[0] << ": Unknown option: " << argv[1] << endl; + return 1; + } + +#ifdef _WIN32 + _setmode(STDIN_FILENO, _O_BINARY); + _setmode(STDOUT_FILENO, _O_BINARY); +#endif + + CodeGeneratorRequest request; + if (!request.ParseFromFileDescriptor(STDIN_FILENO)) { + cerr << argv[0] << ": protoc sent unparseable request to plugin." << endl; + return 1; + } + + DescriptorPool pool; + for (int i = 0; i < request.proto_file_size(); i++) { + const FileDescriptor* file = pool.BuildFile(request.proto_file(i)); + if (file == NULL) { + // BuildFile() already wrote an error message. + return 1; + } + } + + vector parsed_files; + for (int i = 0; i < request.file_to_generate_size(); i++) { + parsed_files.push_back(pool.FindFileByName(request.file_to_generate(i))); + if (parsed_files.back() == NULL) { + cerr << argv[0] << ": protoc asked plugin to generate a file but " + "did not provide a descriptor for the file: " + << request.file_to_generate(i) << endl; + return 1; + } + } + + CodeGeneratorResponse response; + GeneratorResponseContext context(&response, parsed_files); + + for (int i = 0; i < parsed_files.size(); i++) { + const FileDescriptor* file = parsed_files[i]; + + string error; + bool succeeded = generator->Generate( + file, request.parameter(), &context, &error); + + if (!succeeded && error.empty()) { + error = "Code generator returned false but provided no error " + "description."; + } + if (!error.empty()) { + response.set_error(file->name() + ": " + error); + break; + } + } + + if (!response.SerializeToFileDescriptor(STDOUT_FILENO)) { + cerr << argv[0] << ": Error writing to stdout." << endl; + return 1; + } + + return 0; +} + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h new file mode 100644 index 000000000..7c4033321 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h @@ -0,0 +1,73 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// Front-end for protoc code generator plugins written in C++. +// +// To implement a protoc plugin in C++, simply write an implementation of +// CodeGenerator, then create a main() function like: +// int main(int argc, char* argv[]) { +// MyCodeGenerator generator; +// return google::protobuf::compiler::PluginMain(argc, argv, &generator); +// } +// You must link your plugin against libprotobuf and libprotoc. +// +// To get protoc to use the plugin, do one of the following: +// * Place the plugin binary somewhere in the PATH and give it the name +// "protoc-gen-NAME" (replacing "NAME" with the name of your plugin). If you +// then invoke protoc with the parameter --NAME_out=OUT_DIR (again, replace +// "NAME" with your plugin's name), protoc will invoke your plugin to generate +// the output, which will be placed in OUT_DIR. +// * Place the plugin binary anywhere, with any name, and pass the --plugin +// parameter to protoc to direct it to your plugin like so: +// protoc --plugin=protoc-gen-NAME=path/to/mybinary --NAME_out=OUT_DIR +// On Windows, make sure to include the .exe suffix: +// protoc --plugin=protoc-gen-NAME=path/to/mybinary.exe --NAME_out=OUT_DIR + +#ifndef GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__ +#define GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__ + +#include + +namespace google { +namespace protobuf { +namespace compiler { + +class CodeGenerator; // code_generator.h + +// Implements main() for a protoc plugin exposing the given code generator. +LIBPROTOC_EXPORT int PluginMain(int argc, char* argv[], const CodeGenerator* generator); + +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_PLUGIN_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc new file mode 100644 index 000000000..ad4b4deb0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc @@ -0,0 +1,1082 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "google/protobuf/compiler/plugin.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace google { +namespace protobuf { +namespace compiler { + +namespace { + +const ::google::protobuf::Descriptor* CodeGeneratorRequest_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + CodeGeneratorRequest_reflection_ = NULL; +const ::google::protobuf::Descriptor* CodeGeneratorResponse_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + CodeGeneratorResponse_reflection_ = NULL; +const ::google::protobuf::Descriptor* CodeGeneratorResponse_File_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + CodeGeneratorResponse_File_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto() { + protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "google/protobuf/compiler/plugin.proto"); + GOOGLE_CHECK(file != NULL); + CodeGeneratorRequest_descriptor_ = file->message_type(0); + static const int CodeGeneratorRequest_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, file_to_generate_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, parameter_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, proto_file_), + }; + CodeGeneratorRequest_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + CodeGeneratorRequest_descriptor_, + CodeGeneratorRequest::default_instance_, + CodeGeneratorRequest_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorRequest, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(CodeGeneratorRequest)); + CodeGeneratorResponse_descriptor_ = file->message_type(1); + static const int CodeGeneratorResponse_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, error_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, file_), + }; + CodeGeneratorResponse_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + CodeGeneratorResponse_descriptor_, + CodeGeneratorResponse::default_instance_, + CodeGeneratorResponse_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(CodeGeneratorResponse)); + CodeGeneratorResponse_File_descriptor_ = CodeGeneratorResponse_descriptor_->nested_type(0); + static const int CodeGeneratorResponse_File_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, insertion_point_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, content_), + }; + CodeGeneratorResponse_File_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + CodeGeneratorResponse_File_descriptor_, + CodeGeneratorResponse_File::default_instance_, + CodeGeneratorResponse_File_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(CodeGeneratorResponse_File, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(CodeGeneratorResponse_File)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + CodeGeneratorRequest_descriptor_, &CodeGeneratorRequest::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + CodeGeneratorResponse_descriptor_, &CodeGeneratorResponse::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + CodeGeneratorResponse_File_descriptor_, &CodeGeneratorResponse_File::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto() { + delete CodeGeneratorRequest::default_instance_; + delete CodeGeneratorRequest_reflection_; + delete CodeGeneratorResponse::default_instance_; + delete CodeGeneratorResponse_reflection_; + delete CodeGeneratorResponse_File::default_instance_; + delete CodeGeneratorResponse_File_reflection_; +} + +void protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n%google/protobuf/compiler/plugin.proto\022" + "\030google.protobuf.compiler\032 google/protob" + "uf/descriptor.proto\"}\n\024CodeGeneratorRequ" + "est\022\030\n\020file_to_generate\030\001 \003(\t\022\021\n\tparamet" + "er\030\002 \001(\t\0228\n\nproto_file\030\017 \003(\0132$.google.pr" + "otobuf.FileDescriptorProto\"\252\001\n\025CodeGener" + "atorResponse\022\r\n\005error\030\001 \001(\t\022B\n\004file\030\017 \003(" + "\01324.google.protobuf.compiler.CodeGenerat" + "orResponse.File\032>\n\004File\022\014\n\004name\030\001 \001(\t\022\027\n" + "\017insertion_point\030\002 \001(\t\022\017\n\007content\030\017 \001(\t", 399); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "google/protobuf/compiler/plugin.proto", &protobuf_RegisterTypes); + CodeGeneratorRequest::default_instance_ = new CodeGeneratorRequest(); + CodeGeneratorResponse::default_instance_ = new CodeGeneratorResponse(); + CodeGeneratorResponse_File::default_instance_ = new CodeGeneratorResponse_File(); + CodeGeneratorRequest::default_instance_->InitAsDefaultInstance(); + CodeGeneratorResponse::default_instance_->InitAsDefaultInstance(); + CodeGeneratorResponse_File::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto { + StaticDescriptorInitializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto() { + protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + } +} static_descriptor_initializer_google_2fprotobuf_2fcompiler_2fplugin_2eproto_; + + +// =================================================================== + +#ifndef _MSC_VER +const int CodeGeneratorRequest::kFileToGenerateFieldNumber; +const int CodeGeneratorRequest::kParameterFieldNumber; +const int CodeGeneratorRequest::kProtoFileFieldNumber; +#endif // !_MSC_VER + +CodeGeneratorRequest::CodeGeneratorRequest() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void CodeGeneratorRequest::InitAsDefaultInstance() { +} + +CodeGeneratorRequest::CodeGeneratorRequest(const CodeGeneratorRequest& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void CodeGeneratorRequest::SharedCtor() { + _cached_size_ = 0; + parameter_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +CodeGeneratorRequest::~CodeGeneratorRequest() { + SharedDtor(); +} + +void CodeGeneratorRequest::SharedDtor() { + if (parameter_ != &::google::protobuf::internal::kEmptyString) { + delete parameter_; + } + if (this != default_instance_) { + } +} + +void CodeGeneratorRequest::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* CodeGeneratorRequest::descriptor() { + protobuf_AssignDescriptorsOnce(); + return CodeGeneratorRequest_descriptor_; +} + +const CodeGeneratorRequest& CodeGeneratorRequest::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); return *default_instance_; +} + +CodeGeneratorRequest* CodeGeneratorRequest::default_instance_ = NULL; + +CodeGeneratorRequest* CodeGeneratorRequest::New() const { + return new CodeGeneratorRequest; +} + +void CodeGeneratorRequest::Clear() { + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (has_parameter()) { + if (parameter_ != &::google::protobuf::internal::kEmptyString) { + parameter_->clear(); + } + } + } + file_to_generate_.Clear(); + proto_file_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool CodeGeneratorRequest::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated string file_to_generate = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_file_to_generate: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_file_to_generate())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->file_to_generate(0).data(), this->file_to_generate(0).length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_file_to_generate; + if (input->ExpectTag(18)) goto parse_parameter; + break; + } + + // optional string parameter = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_parameter: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_parameter())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->parameter().data(), this->parameter().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(122)) goto parse_proto_file; + break; + } + + // repeated .google.protobuf.FileDescriptorProto proto_file = 15; + case 15: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_proto_file: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_proto_file())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(122)) goto parse_proto_file; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void CodeGeneratorRequest::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated string file_to_generate = 1; + for (int i = 0; i < this->file_to_generate_size(); i++) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->file_to_generate(i).data(), this->file_to_generate(i).length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->file_to_generate(i), output); + } + + // optional string parameter = 2; + if (has_parameter()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->parameter().data(), this->parameter().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->parameter(), output); + } + + // repeated .google.protobuf.FileDescriptorProto proto_file = 15; + for (int i = 0; i < this->proto_file_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 15, this->proto_file(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* CodeGeneratorRequest::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated string file_to_generate = 1; + for (int i = 0; i < this->file_to_generate_size(); i++) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->file_to_generate(i).data(), this->file_to_generate(i).length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = ::google::protobuf::internal::WireFormatLite:: + WriteStringToArray(1, this->file_to_generate(i), target); + } + + // optional string parameter = 2; + if (has_parameter()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->parameter().data(), this->parameter().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->parameter(), target); + } + + // repeated .google.protobuf.FileDescriptorProto proto_file = 15; + for (int i = 0; i < this->proto_file_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 15, this->proto_file(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int CodeGeneratorRequest::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional string parameter = 2; + if (has_parameter()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->parameter()); + } + + } + // repeated string file_to_generate = 1; + total_size += 1 * this->file_to_generate_size(); + for (int i = 0; i < this->file_to_generate_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->file_to_generate(i)); + } + + // repeated .google.protobuf.FileDescriptorProto proto_file = 15; + total_size += 1 * this->proto_file_size(); + for (int i = 0; i < this->proto_file_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->proto_file(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void CodeGeneratorRequest::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const CodeGeneratorRequest* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void CodeGeneratorRequest::MergeFrom(const CodeGeneratorRequest& from) { + GOOGLE_CHECK_NE(&from, this); + file_to_generate_.MergeFrom(from.file_to_generate_); + proto_file_.MergeFrom(from.proto_file_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from.has_parameter()) { + set_parameter(from.parameter()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void CodeGeneratorRequest::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void CodeGeneratorRequest::CopyFrom(const CodeGeneratorRequest& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool CodeGeneratorRequest::IsInitialized() const { + + for (int i = 0; i < proto_file_size(); i++) { + if (!this->proto_file(i).IsInitialized()) return false; + } + return true; +} + +void CodeGeneratorRequest::Swap(CodeGeneratorRequest* other) { + if (other != this) { + file_to_generate_.Swap(&other->file_to_generate_); + std::swap(parameter_, other->parameter_); + proto_file_.Swap(&other->proto_file_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata CodeGeneratorRequest::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = CodeGeneratorRequest_descriptor_; + metadata.reflection = CodeGeneratorRequest_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int CodeGeneratorResponse_File::kNameFieldNumber; +const int CodeGeneratorResponse_File::kInsertionPointFieldNumber; +const int CodeGeneratorResponse_File::kContentFieldNumber; +#endif // !_MSC_VER + +CodeGeneratorResponse_File::CodeGeneratorResponse_File() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void CodeGeneratorResponse_File::InitAsDefaultInstance() { +} + +CodeGeneratorResponse_File::CodeGeneratorResponse_File(const CodeGeneratorResponse_File& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void CodeGeneratorResponse_File::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + insertion_point_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + content_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +CodeGeneratorResponse_File::~CodeGeneratorResponse_File() { + SharedDtor(); +} + +void CodeGeneratorResponse_File::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (insertion_point_ != &::google::protobuf::internal::kEmptyString) { + delete insertion_point_; + } + if (content_ != &::google::protobuf::internal::kEmptyString) { + delete content_; + } + if (this != default_instance_) { + } +} + +void CodeGeneratorResponse_File::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* CodeGeneratorResponse_File::descriptor() { + protobuf_AssignDescriptorsOnce(); + return CodeGeneratorResponse_File_descriptor_; +} + +const CodeGeneratorResponse_File& CodeGeneratorResponse_File::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); return *default_instance_; +} + +CodeGeneratorResponse_File* CodeGeneratorResponse_File::default_instance_ = NULL; + +CodeGeneratorResponse_File* CodeGeneratorResponse_File::New() const { + return new CodeGeneratorResponse_File; +} + +void CodeGeneratorResponse_File::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + if (has_insertion_point()) { + if (insertion_point_ != &::google::protobuf::internal::kEmptyString) { + insertion_point_->clear(); + } + } + if (has_content()) { + if (content_ != &::google::protobuf::internal::kEmptyString) { + content_->clear(); + } + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool CodeGeneratorResponse_File::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_insertion_point; + break; + } + + // optional string insertion_point = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_insertion_point: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_insertion_point())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->insertion_point().data(), this->insertion_point().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(122)) goto parse_content; + break; + } + + // optional string content = 15; + case 15: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_content: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_content())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->content().data(), this->content().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void CodeGeneratorResponse_File::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // optional string insertion_point = 2; + if (has_insertion_point()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->insertion_point().data(), this->insertion_point().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->insertion_point(), output); + } + + // optional string content = 15; + if (has_content()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->content().data(), this->content().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 15, this->content(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* CodeGeneratorResponse_File::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string insertion_point = 2; + if (has_insertion_point()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->insertion_point().data(), this->insertion_point().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->insertion_point(), target); + } + + // optional string content = 15; + if (has_content()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->content().data(), this->content().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 15, this->content(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int CodeGeneratorResponse_File::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string insertion_point = 2; + if (has_insertion_point()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->insertion_point()); + } + + // optional string content = 15; + if (has_content()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->content()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void CodeGeneratorResponse_File::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const CodeGeneratorResponse_File* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void CodeGeneratorResponse_File::MergeFrom(const CodeGeneratorResponse_File& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_insertion_point()) { + set_insertion_point(from.insertion_point()); + } + if (from.has_content()) { + set_content(from.content()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void CodeGeneratorResponse_File::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void CodeGeneratorResponse_File::CopyFrom(const CodeGeneratorResponse_File& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool CodeGeneratorResponse_File::IsInitialized() const { + + return true; +} + +void CodeGeneratorResponse_File::Swap(CodeGeneratorResponse_File* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(insertion_point_, other->insertion_point_); + std::swap(content_, other->content_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata CodeGeneratorResponse_File::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = CodeGeneratorResponse_File_descriptor_; + metadata.reflection = CodeGeneratorResponse_File_reflection_; + return metadata; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int CodeGeneratorResponse::kErrorFieldNumber; +const int CodeGeneratorResponse::kFileFieldNumber; +#endif // !_MSC_VER + +CodeGeneratorResponse::CodeGeneratorResponse() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void CodeGeneratorResponse::InitAsDefaultInstance() { +} + +CodeGeneratorResponse::CodeGeneratorResponse(const CodeGeneratorResponse& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void CodeGeneratorResponse::SharedCtor() { + _cached_size_ = 0; + error_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +CodeGeneratorResponse::~CodeGeneratorResponse() { + SharedDtor(); +} + +void CodeGeneratorResponse::SharedDtor() { + if (error_ != &::google::protobuf::internal::kEmptyString) { + delete error_; + } + if (this != default_instance_) { + } +} + +void CodeGeneratorResponse::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* CodeGeneratorResponse::descriptor() { + protobuf_AssignDescriptorsOnce(); + return CodeGeneratorResponse_descriptor_; +} + +const CodeGeneratorResponse& CodeGeneratorResponse::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); return *default_instance_; +} + +CodeGeneratorResponse* CodeGeneratorResponse::default_instance_ = NULL; + +CodeGeneratorResponse* CodeGeneratorResponse::New() const { + return new CodeGeneratorResponse; +} + +void CodeGeneratorResponse::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_error()) { + if (error_ != &::google::protobuf::internal::kEmptyString) { + error_->clear(); + } + } + } + file_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool CodeGeneratorResponse::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string error = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_error())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->error().data(), this->error().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(122)) goto parse_file; + break; + } + + // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; + case 15: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_file: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_file())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(122)) goto parse_file; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void CodeGeneratorResponse::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string error = 1; + if (has_error()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->error().data(), this->error().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->error(), output); + } + + // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; + for (int i = 0; i < this->file_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 15, this->file(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* CodeGeneratorResponse::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string error = 1; + if (has_error()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->error().data(), this->error().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->error(), target); + } + + // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; + for (int i = 0; i < this->file_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 15, this->file(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int CodeGeneratorResponse::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string error = 1; + if (has_error()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->error()); + } + + } + // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; + total_size += 1 * this->file_size(); + for (int i = 0; i < this->file_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->file(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void CodeGeneratorResponse::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const CodeGeneratorResponse* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void CodeGeneratorResponse::MergeFrom(const CodeGeneratorResponse& from) { + GOOGLE_CHECK_NE(&from, this); + file_.MergeFrom(from.file_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_error()) { + set_error(from.error()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void CodeGeneratorResponse::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void CodeGeneratorResponse::CopyFrom(const CodeGeneratorResponse& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool CodeGeneratorResponse::IsInitialized() const { + + return true; +} + +void CodeGeneratorResponse::Swap(CodeGeneratorResponse* other) { + if (other != this) { + std::swap(error_, other->error_); + file_.Swap(&other->file_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata CodeGeneratorResponse::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = CodeGeneratorResponse_descriptor_; + metadata.reflection = CodeGeneratorResponse_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace compiler +} // namespace protobuf +} // namespace google + +// @@protoc_insertion_point(global_scope) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h new file mode 100644 index 000000000..1cf8a5562 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h @@ -0,0 +1,790 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/protobuf/compiler/plugin.proto + +#ifndef PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED +#define PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2004000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2004002 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +#include "google/protobuf/descriptor.pb.h" +// @@protoc_insertion_point(includes) + +namespace google { +namespace protobuf { +namespace compiler { + +// Internal implementation detail -- do not call these. +void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); +void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); +void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + +class CodeGeneratorRequest; +class CodeGeneratorResponse; +class CodeGeneratorResponse_File; + +// =================================================================== + +class LIBPROTOC_EXPORT CodeGeneratorRequest : public ::google::protobuf::Message { + public: + CodeGeneratorRequest(); + virtual ~CodeGeneratorRequest(); + + CodeGeneratorRequest(const CodeGeneratorRequest& from); + + inline CodeGeneratorRequest& operator=(const CodeGeneratorRequest& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const CodeGeneratorRequest& default_instance(); + + void Swap(CodeGeneratorRequest* other); + + // implements Message ---------------------------------------------- + + CodeGeneratorRequest* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const CodeGeneratorRequest& from); + void MergeFrom(const CodeGeneratorRequest& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated string file_to_generate = 1; + inline int file_to_generate_size() const; + inline void clear_file_to_generate(); + static const int kFileToGenerateFieldNumber = 1; + inline const ::std::string& file_to_generate(int index) const; + inline ::std::string* mutable_file_to_generate(int index); + inline void set_file_to_generate(int index, const ::std::string& value); + inline void set_file_to_generate(int index, const char* value); + inline void set_file_to_generate(int index, const char* value, size_t size); + inline ::std::string* add_file_to_generate(); + inline void add_file_to_generate(const ::std::string& value); + inline void add_file_to_generate(const char* value); + inline void add_file_to_generate(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& file_to_generate() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_file_to_generate(); + + // optional string parameter = 2; + inline bool has_parameter() const; + inline void clear_parameter(); + static const int kParameterFieldNumber = 2; + inline const ::std::string& parameter() const; + inline void set_parameter(const ::std::string& value); + inline void set_parameter(const char* value); + inline void set_parameter(const char* value, size_t size); + inline ::std::string* mutable_parameter(); + inline ::std::string* release_parameter(); + + // repeated .google.protobuf.FileDescriptorProto proto_file = 15; + inline int proto_file_size() const; + inline void clear_proto_file(); + static const int kProtoFileFieldNumber = 15; + inline const ::google::protobuf::FileDescriptorProto& proto_file(int index) const; + inline ::google::protobuf::FileDescriptorProto* mutable_proto_file(int index); + inline ::google::protobuf::FileDescriptorProto* add_proto_file(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& + proto_file() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* + mutable_proto_file(); + + // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorRequest) + private: + inline void set_has_parameter(); + inline void clear_has_parameter(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::std::string> file_to_generate_; + ::std::string* parameter_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > proto_file_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; + + friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + + void InitAsDefaultInstance(); + static CodeGeneratorRequest* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOC_EXPORT CodeGeneratorResponse_File : public ::google::protobuf::Message { + public: + CodeGeneratorResponse_File(); + virtual ~CodeGeneratorResponse_File(); + + CodeGeneratorResponse_File(const CodeGeneratorResponse_File& from); + + inline CodeGeneratorResponse_File& operator=(const CodeGeneratorResponse_File& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const CodeGeneratorResponse_File& default_instance(); + + void Swap(CodeGeneratorResponse_File* other); + + // implements Message ---------------------------------------------- + + CodeGeneratorResponse_File* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const CodeGeneratorResponse_File& from); + void MergeFrom(const CodeGeneratorResponse_File& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // optional string insertion_point = 2; + inline bool has_insertion_point() const; + inline void clear_insertion_point(); + static const int kInsertionPointFieldNumber = 2; + inline const ::std::string& insertion_point() const; + inline void set_insertion_point(const ::std::string& value); + inline void set_insertion_point(const char* value); + inline void set_insertion_point(const char* value, size_t size); + inline ::std::string* mutable_insertion_point(); + inline ::std::string* release_insertion_point(); + + // optional string content = 15; + inline bool has_content() const; + inline void clear_content(); + static const int kContentFieldNumber = 15; + inline const ::std::string& content() const; + inline void set_content(const ::std::string& value); + inline void set_content(const char* value); + inline void set_content(const char* value, size_t size); + inline ::std::string* mutable_content(); + inline ::std::string* release_content(); + + // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse.File) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_insertion_point(); + inline void clear_has_insertion_point(); + inline void set_has_content(); + inline void clear_has_content(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::std::string* insertion_point_; + ::std::string* content_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; + + friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + + void InitAsDefaultInstance(); + static CodeGeneratorResponse_File* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOC_EXPORT CodeGeneratorResponse : public ::google::protobuf::Message { + public: + CodeGeneratorResponse(); + virtual ~CodeGeneratorResponse(); + + CodeGeneratorResponse(const CodeGeneratorResponse& from); + + inline CodeGeneratorResponse& operator=(const CodeGeneratorResponse& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const CodeGeneratorResponse& default_instance(); + + void Swap(CodeGeneratorResponse* other); + + // implements Message ---------------------------------------------- + + CodeGeneratorResponse* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const CodeGeneratorResponse& from); + void MergeFrom(const CodeGeneratorResponse& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef CodeGeneratorResponse_File File; + + // accessors ------------------------------------------------------- + + // optional string error = 1; + inline bool has_error() const; + inline void clear_error(); + static const int kErrorFieldNumber = 1; + inline const ::std::string& error() const; + inline void set_error(const ::std::string& value); + inline void set_error(const char* value); + inline void set_error(const char* value, size_t size); + inline ::std::string* mutable_error(); + inline ::std::string* release_error(); + + // repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; + inline int file_size() const; + inline void clear_file(); + static const int kFileFieldNumber = 15; + inline const ::google::protobuf::compiler::CodeGeneratorResponse_File& file(int index) const; + inline ::google::protobuf::compiler::CodeGeneratorResponse_File* mutable_file(int index); + inline ::google::protobuf::compiler::CodeGeneratorResponse_File* add_file(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >& + file() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >* + mutable_file(); + + // @@protoc_insertion_point(class_scope:google.protobuf.compiler.CodeGeneratorResponse) + private: + inline void set_has_error(); + inline void clear_has_error(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* error_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File > file_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; + + friend void LIBPROTOC_EXPORT protobuf_AddDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fcompiler_2fplugin_2eproto(); + + void InitAsDefaultInstance(); + static CodeGeneratorResponse* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// CodeGeneratorRequest + +// repeated string file_to_generate = 1; +inline int CodeGeneratorRequest::file_to_generate_size() const { + return file_to_generate_.size(); +} +inline void CodeGeneratorRequest::clear_file_to_generate() { + file_to_generate_.Clear(); +} +inline const ::std::string& CodeGeneratorRequest::file_to_generate(int index) const { + return file_to_generate_.Get(index); +} +inline ::std::string* CodeGeneratorRequest::mutable_file_to_generate(int index) { + return file_to_generate_.Mutable(index); +} +inline void CodeGeneratorRequest::set_file_to_generate(int index, const ::std::string& value) { + file_to_generate_.Mutable(index)->assign(value); +} +inline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value) { + file_to_generate_.Mutable(index)->assign(value); +} +inline void CodeGeneratorRequest::set_file_to_generate(int index, const char* value, size_t size) { + file_to_generate_.Mutable(index)->assign( + reinterpret_cast(value), size); +} +inline ::std::string* CodeGeneratorRequest::add_file_to_generate() { + return file_to_generate_.Add(); +} +inline void CodeGeneratorRequest::add_file_to_generate(const ::std::string& value) { + file_to_generate_.Add()->assign(value); +} +inline void CodeGeneratorRequest::add_file_to_generate(const char* value) { + file_to_generate_.Add()->assign(value); +} +inline void CodeGeneratorRequest::add_file_to_generate(const char* value, size_t size) { + file_to_generate_.Add()->assign(reinterpret_cast(value), size); +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +CodeGeneratorRequest::file_to_generate() const { + return file_to_generate_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +CodeGeneratorRequest::mutable_file_to_generate() { + return &file_to_generate_; +} + +// optional string parameter = 2; +inline bool CodeGeneratorRequest::has_parameter() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void CodeGeneratorRequest::set_has_parameter() { + _has_bits_[0] |= 0x00000002u; +} +inline void CodeGeneratorRequest::clear_has_parameter() { + _has_bits_[0] &= ~0x00000002u; +} +inline void CodeGeneratorRequest::clear_parameter() { + if (parameter_ != &::google::protobuf::internal::kEmptyString) { + parameter_->clear(); + } + clear_has_parameter(); +} +inline const ::std::string& CodeGeneratorRequest::parameter() const { + return *parameter_; +} +inline void CodeGeneratorRequest::set_parameter(const ::std::string& value) { + set_has_parameter(); + if (parameter_ == &::google::protobuf::internal::kEmptyString) { + parameter_ = new ::std::string; + } + parameter_->assign(value); +} +inline void CodeGeneratorRequest::set_parameter(const char* value) { + set_has_parameter(); + if (parameter_ == &::google::protobuf::internal::kEmptyString) { + parameter_ = new ::std::string; + } + parameter_->assign(value); +} +inline void CodeGeneratorRequest::set_parameter(const char* value, size_t size) { + set_has_parameter(); + if (parameter_ == &::google::protobuf::internal::kEmptyString) { + parameter_ = new ::std::string; + } + parameter_->assign(reinterpret_cast(value), size); +} +inline ::std::string* CodeGeneratorRequest::mutable_parameter() { + set_has_parameter(); + if (parameter_ == &::google::protobuf::internal::kEmptyString) { + parameter_ = new ::std::string; + } + return parameter_; +} +inline ::std::string* CodeGeneratorRequest::release_parameter() { + clear_has_parameter(); + if (parameter_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = parameter_; + parameter_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .google.protobuf.FileDescriptorProto proto_file = 15; +inline int CodeGeneratorRequest::proto_file_size() const { + return proto_file_.size(); +} +inline void CodeGeneratorRequest::clear_proto_file() { + proto_file_.Clear(); +} +inline const ::google::protobuf::FileDescriptorProto& CodeGeneratorRequest::proto_file(int index) const { + return proto_file_.Get(index); +} +inline ::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::mutable_proto_file(int index) { + return proto_file_.Mutable(index); +} +inline ::google::protobuf::FileDescriptorProto* CodeGeneratorRequest::add_proto_file() { + return proto_file_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& +CodeGeneratorRequest::proto_file() const { + return proto_file_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* +CodeGeneratorRequest::mutable_proto_file() { + return &proto_file_; +} + +// ------------------------------------------------------------------- + +// CodeGeneratorResponse_File + +// optional string name = 1; +inline bool CodeGeneratorResponse_File::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void CodeGeneratorResponse_File::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void CodeGeneratorResponse_File::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void CodeGeneratorResponse_File::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& CodeGeneratorResponse_File::name() const { + return *name_; +} +inline void CodeGeneratorResponse_File::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void CodeGeneratorResponse_File::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void CodeGeneratorResponse_File::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* CodeGeneratorResponse_File::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* CodeGeneratorResponse_File::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string insertion_point = 2; +inline bool CodeGeneratorResponse_File::has_insertion_point() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void CodeGeneratorResponse_File::set_has_insertion_point() { + _has_bits_[0] |= 0x00000002u; +} +inline void CodeGeneratorResponse_File::clear_has_insertion_point() { + _has_bits_[0] &= ~0x00000002u; +} +inline void CodeGeneratorResponse_File::clear_insertion_point() { + if (insertion_point_ != &::google::protobuf::internal::kEmptyString) { + insertion_point_->clear(); + } + clear_has_insertion_point(); +} +inline const ::std::string& CodeGeneratorResponse_File::insertion_point() const { + return *insertion_point_; +} +inline void CodeGeneratorResponse_File::set_insertion_point(const ::std::string& value) { + set_has_insertion_point(); + if (insertion_point_ == &::google::protobuf::internal::kEmptyString) { + insertion_point_ = new ::std::string; + } + insertion_point_->assign(value); +} +inline void CodeGeneratorResponse_File::set_insertion_point(const char* value) { + set_has_insertion_point(); + if (insertion_point_ == &::google::protobuf::internal::kEmptyString) { + insertion_point_ = new ::std::string; + } + insertion_point_->assign(value); +} +inline void CodeGeneratorResponse_File::set_insertion_point(const char* value, size_t size) { + set_has_insertion_point(); + if (insertion_point_ == &::google::protobuf::internal::kEmptyString) { + insertion_point_ = new ::std::string; + } + insertion_point_->assign(reinterpret_cast(value), size); +} +inline ::std::string* CodeGeneratorResponse_File::mutable_insertion_point() { + set_has_insertion_point(); + if (insertion_point_ == &::google::protobuf::internal::kEmptyString) { + insertion_point_ = new ::std::string; + } + return insertion_point_; +} +inline ::std::string* CodeGeneratorResponse_File::release_insertion_point() { + clear_has_insertion_point(); + if (insertion_point_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = insertion_point_; + insertion_point_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string content = 15; +inline bool CodeGeneratorResponse_File::has_content() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void CodeGeneratorResponse_File::set_has_content() { + _has_bits_[0] |= 0x00000004u; +} +inline void CodeGeneratorResponse_File::clear_has_content() { + _has_bits_[0] &= ~0x00000004u; +} +inline void CodeGeneratorResponse_File::clear_content() { + if (content_ != &::google::protobuf::internal::kEmptyString) { + content_->clear(); + } + clear_has_content(); +} +inline const ::std::string& CodeGeneratorResponse_File::content() const { + return *content_; +} +inline void CodeGeneratorResponse_File::set_content(const ::std::string& value) { + set_has_content(); + if (content_ == &::google::protobuf::internal::kEmptyString) { + content_ = new ::std::string; + } + content_->assign(value); +} +inline void CodeGeneratorResponse_File::set_content(const char* value) { + set_has_content(); + if (content_ == &::google::protobuf::internal::kEmptyString) { + content_ = new ::std::string; + } + content_->assign(value); +} +inline void CodeGeneratorResponse_File::set_content(const char* value, size_t size) { + set_has_content(); + if (content_ == &::google::protobuf::internal::kEmptyString) { + content_ = new ::std::string; + } + content_->assign(reinterpret_cast(value), size); +} +inline ::std::string* CodeGeneratorResponse_File::mutable_content() { + set_has_content(); + if (content_ == &::google::protobuf::internal::kEmptyString) { + content_ = new ::std::string; + } + return content_; +} +inline ::std::string* CodeGeneratorResponse_File::release_content() { + clear_has_content(); + if (content_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = content_; + content_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// CodeGeneratorResponse + +// optional string error = 1; +inline bool CodeGeneratorResponse::has_error() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void CodeGeneratorResponse::set_has_error() { + _has_bits_[0] |= 0x00000001u; +} +inline void CodeGeneratorResponse::clear_has_error() { + _has_bits_[0] &= ~0x00000001u; +} +inline void CodeGeneratorResponse::clear_error() { + if (error_ != &::google::protobuf::internal::kEmptyString) { + error_->clear(); + } + clear_has_error(); +} +inline const ::std::string& CodeGeneratorResponse::error() const { + return *error_; +} +inline void CodeGeneratorResponse::set_error(const ::std::string& value) { + set_has_error(); + if (error_ == &::google::protobuf::internal::kEmptyString) { + error_ = new ::std::string; + } + error_->assign(value); +} +inline void CodeGeneratorResponse::set_error(const char* value) { + set_has_error(); + if (error_ == &::google::protobuf::internal::kEmptyString) { + error_ = new ::std::string; + } + error_->assign(value); +} +inline void CodeGeneratorResponse::set_error(const char* value, size_t size) { + set_has_error(); + if (error_ == &::google::protobuf::internal::kEmptyString) { + error_ = new ::std::string; + } + error_->assign(reinterpret_cast(value), size); +} +inline ::std::string* CodeGeneratorResponse::mutable_error() { + set_has_error(); + if (error_ == &::google::protobuf::internal::kEmptyString) { + error_ = new ::std::string; + } + return error_; +} +inline ::std::string* CodeGeneratorResponse::release_error() { + clear_has_error(); + if (error_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = error_; + error_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .google.protobuf.compiler.CodeGeneratorResponse.File file = 15; +inline int CodeGeneratorResponse::file_size() const { + return file_.size(); +} +inline void CodeGeneratorResponse::clear_file() { + file_.Clear(); +} +inline const ::google::protobuf::compiler::CodeGeneratorResponse_File& CodeGeneratorResponse::file(int index) const { + return file_.Get(index); +} +inline ::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::mutable_file(int index) { + return file_.Mutable(index); +} +inline ::google::protobuf::compiler::CodeGeneratorResponse_File* CodeGeneratorResponse::add_file() { + return file_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >& +CodeGeneratorResponse::file() const { + return file_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::compiler::CodeGeneratorResponse_File >* +CodeGeneratorResponse::mutable_file() { + return &file_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace compiler +} // namespace protobuf +} // namespace google + +#ifndef SWIG +namespace google { +namespace protobuf { + + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_google_2fprotobuf_2fcompiler_2fplugin_2eproto__INCLUDED diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto new file mode 100644 index 000000000..651ed10c2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto @@ -0,0 +1,145 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// WARNING: The plugin interface is currently EXPERIMENTAL and is subject to +// change. +// +// protoc (aka the Protocol Compiler) can be extended via plugins. A plugin is +// just a program that reads a CodeGeneratorRequest from stdin and writes a +// CodeGeneratorResponse to stdout. +// +// Plugins written using C++ can use google/protobuf/compiler/plugin.h instead +// of dealing with the raw protocol defined here. +// +// A plugin executable needs only to be placed somewhere in the path. The +// plugin should be named "protoc-gen-$NAME", and will then be used when the +// flag "--${NAME}_out" is passed to protoc. + +package google.protobuf.compiler; + +import "google/protobuf/descriptor.proto"; + +// An encoded CodeGeneratorRequest is written to the plugin's stdin. +message CodeGeneratorRequest { + // The .proto files that were explicitly listed on the command-line. The + // code generator should generate code only for these files. Each file's + // descriptor will be included in proto_file, below. + repeated string file_to_generate = 1; + + // The generator parameter passed on the command-line. + optional string parameter = 2; + + // FileDescriptorProtos for all files in files_to_generate and everything + // they import. The files will appear in topological order, so each file + // appears before any file that imports it. + // + // protoc guarantees that all proto_files will be written after + // the fields above, even though this is not technically guaranteed by the + // protobuf wire format. This theoretically could allow a plugin to stream + // in the FileDescriptorProtos and handle them one by one rather than read + // the entire set into memory at once. However, as of this writing, this + // is not similarly optimized on protoc's end -- it will store all fields in + // memory at once before sending them to the plugin. + repeated FileDescriptorProto proto_file = 15; +} + +// The plugin writes an encoded CodeGeneratorResponse to stdout. +message CodeGeneratorResponse { + // Error message. If non-empty, code generation failed. The plugin process + // should exit with status code zero even if it reports an error in this way. + // + // This should be used to indicate errors in .proto files which prevent the + // code generator from generating correct code. Errors which indicate a + // problem in protoc itself -- such as the input CodeGeneratorRequest being + // unparseable -- should be reported by writing a message to stderr and + // exiting with a non-zero status code. + optional string error = 1; + + // Represents a single generated file. + message File { + // The file name, relative to the output directory. The name must not + // contain "." or ".." components and must be relative, not be absolute (so, + // the file cannot lie outside the output directory). "/" must be used as + // the path separator, not "\". + // + // If the name is omitted, the content will be appended to the previous + // file. This allows the generator to break large files into small chunks, + // and allows the generated text to be streamed back to protoc so that large + // files need not reside completely in memory at one time. Note that as of + // this writing protoc does not optimize for this -- it will read the entire + // CodeGeneratorResponse before writing files to disk. + optional string name = 1; + + // If non-empty, indicates that the named file should already exist, and the + // content here is to be inserted into that file at a defined insertion + // point. This feature allows a code generator to extend the output + // produced by another code generator. The original generator may provide + // insertion points by placing special annotations in the file that look + // like: + // @@protoc_insertion_point(NAME) + // The annotation can have arbitrary text before and after it on the line, + // which allows it to be placed in a comment. NAME should be replaced with + // an identifier naming the point -- this is what other generators will use + // as the insertion_point. Code inserted at this point will be placed + // immediately above the line containing the insertion point (thus multiple + // insertions to the same point will come out in the order they were added). + // The double-@ is intended to make it unlikely that the generated code + // could contain things that look like insertion points by accident. + // + // For example, the C++ code generator places the following line in the + // .pb.h files that it generates: + // // @@protoc_insertion_point(namespace_scope) + // This line appears within the scope of the file's package namespace, but + // outside of any particular class. Another plugin can then specify the + // insertion_point "namespace_scope" to generate additional classes or + // other declarations that should be placed in this scope. + // + // Note that if the line containing the insertion point begins with + // whitespace, the same whitespace will be added to every line of the + // inserted text. This is useful for languages like Python, where + // indentation matters. In these languages, the insertion point comment + // should be indented the same amount as any inserted code will need to be + // in order to work correctly in that context. + // + // The code generator that generates the initial file and the one which + // inserts into it must both run as part of a single invocation of protoc. + // Code generators are executed in the order in which they appear on the + // command line. + // + // If |insertion_point| is present, |name| must also be present. + optional string insertion_point = 2; + + // The file contents. + optional string content = 15; + } + repeated File file = 15; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc new file mode 100644 index 000000000..9b1093780 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc @@ -0,0 +1,1006 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: robinson@google.com (Will Robinson) +// +// This module outputs pure-Python protocol message classes that will +// largely be constructed at runtime via the metaclass in reflection.py. +// In other words, our job is basically to output a Python equivalent +// of the C++ *Descriptor objects, and fix up all circular references +// within these objects. +// +// Note that the runtime performance of protocol message classes created in +// this way is expected to be lousy. The plan is to create an alternate +// generator that outputs a Python/C extension module that lets +// performance-minded Python code leverage the fast C++ implementation +// directly. + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace python { + +namespace { + +// Returns a copy of |filename| with any trailing ".protodevel" or ".proto +// suffix stripped. +// TODO(robinson): Unify with copy in compiler/cpp/internal/helpers.cc. +string StripProto(const string& filename) { + const char* suffix = HasSuffixString(filename, ".protodevel") + ? ".protodevel" : ".proto"; + return StripSuffixString(filename, suffix); +} + + +// Returns the Python module name expected for a given .proto filename. +string ModuleName(const string& filename) { + string basename = StripProto(filename); + StripString(&basename, "-", '_'); + StripString(&basename, "/", '.'); + return basename + "_pb2"; +} + + +// Returns the name of all containing types for descriptor, +// in order from outermost to innermost, followed by descriptor's +// own name. Each name is separated by |separator|. +template +string NamePrefixedWithNestedTypes(const DescriptorT& descriptor, + const string& separator) { + string name = descriptor.name(); + for (const Descriptor* current = descriptor.containing_type(); + current != NULL; current = current->containing_type()) { + name = current->name() + separator + name; + } + return name; +} + + +// Name of the class attribute where we store the Python +// descriptor.Descriptor instance for the generated class. +// Must stay consistent with the _DESCRIPTOR_KEY constant +// in proto2/public/reflection.py. +const char kDescriptorKey[] = "DESCRIPTOR"; + + +// Should we generate generic services for this file? +inline bool HasGenericServices(const FileDescriptor *file) { + return file->service_count() > 0 && + file->options().py_generic_services(); +} + + +// Prints the common boilerplate needed at the top of every .py +// file output by this generator. +void PrintTopBoilerplate( + io::Printer* printer, const FileDescriptor* file, bool descriptor_proto) { + // TODO(robinson): Allow parameterization of Python version? + printer->Print( + "# Generated by the protocol buffer compiler. DO NOT EDIT!\n" + "\n" + "from google.protobuf import descriptor\n" + "from google.protobuf import message\n" + "from google.protobuf import reflection\n"); + if (HasGenericServices(file)) { + printer->Print( + "from google.protobuf import service\n" + "from google.protobuf import service_reflection\n"); + } + + // Avoid circular imports if this module is descriptor_pb2. + if (!descriptor_proto) { + printer->Print( + "from google.protobuf import descriptor_pb2\n"); + } + printer->Print( + "# @@protoc_insertion_point(imports)\n"); + printer->Print("\n\n"); +} + + +// Returns a Python literal giving the default value for a field. +// If the field specifies no explicit default value, we'll return +// the default default value for the field type (zero for numbers, +// empty string for strings, empty list for repeated fields, and +// None for non-repeated, composite fields). +// +// TODO(robinson): Unify with code from +// //compiler/cpp/internal/primitive_field.cc +// //compiler/cpp/internal/enum_field.cc +// //compiler/cpp/internal/string_field.cc +string StringifyDefaultValue(const FieldDescriptor& field) { + if (field.is_repeated()) { + return "[]"; + } + + switch (field.cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + return SimpleItoa(field.default_value_int32()); + case FieldDescriptor::CPPTYPE_UINT32: + return SimpleItoa(field.default_value_uint32()); + case FieldDescriptor::CPPTYPE_INT64: + return SimpleItoa(field.default_value_int64()); + case FieldDescriptor::CPPTYPE_UINT64: + return SimpleItoa(field.default_value_uint64()); + case FieldDescriptor::CPPTYPE_DOUBLE: { + double value = field.default_value_double(); + if (value == numeric_limits::infinity()) { + // Python pre-2.6 on Windows does not parse "inf" correctly. However, + // a numeric literal that is too big for a double will become infinity. + return "1e10000"; + } else if (value == -numeric_limits::infinity()) { + // See above. + return "-1e10000"; + } else if (value != value) { + // infinity * 0 = nan + return "(1e10000 * 0)"; + } else { + return SimpleDtoa(value); + } + } + case FieldDescriptor::CPPTYPE_FLOAT: { + float value = field.default_value_float(); + if (value == numeric_limits::infinity()) { + // Python pre-2.6 on Windows does not parse "inf" correctly. However, + // a numeric literal that is too big for a double will become infinity. + return "1e10000"; + } else if (value == -numeric_limits::infinity()) { + // See above. + return "-1e10000"; + } else if (value != value) { + // infinity - infinity = nan + return "(1e10000 * 0)"; + } else { + return SimpleFtoa(value); + } + } + case FieldDescriptor::CPPTYPE_BOOL: + return field.default_value_bool() ? "True" : "False"; + case FieldDescriptor::CPPTYPE_ENUM: + return SimpleItoa(field.default_value_enum()->number()); + case FieldDescriptor::CPPTYPE_STRING: + if (field.type() == FieldDescriptor::TYPE_STRING) { + return "unicode(\"" + CEscape(field.default_value_string()) + + "\", \"utf-8\")"; + } else { + return "\"" + CEscape(field.default_value_string()) + "\""; + } + case FieldDescriptor::CPPTYPE_MESSAGE: + return "None"; + } + // (We could add a default case above but then we wouldn't get the nice + // compiler warning when a new type is added.) + GOOGLE_LOG(FATAL) << "Not reached."; + return ""; +} + + + +} // namespace + + +Generator::Generator() : file_(NULL) { +} + +Generator::~Generator() { +} + +bool Generator::Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const { + + // Completely serialize all Generate() calls on this instance. The + // thread-safety constraints of the CodeGenerator interface aren't clear so + // just be as conservative as possible. It's easier to relax this later if + // we need to, but I doubt it will be an issue. + // TODO(kenton): The proper thing to do would be to allocate any state on + // the stack and use that, so that the Generator class itself does not need + // to have any mutable members. Then it is implicitly thread-safe. + MutexLock lock(&mutex_); + file_ = file; + string module_name = ModuleName(file->name()); + string filename = module_name; + StripString(&filename, ".", '/'); + filename += ".py"; + + FileDescriptorProto fdp; + file_->CopyTo(&fdp); + fdp.SerializeToString(&file_descriptor_serialized_); + + + scoped_ptr output(context->Open(filename)); + GOOGLE_CHECK(output.get()); + io::Printer printer(output.get(), '$'); + printer_ = &printer; + + PrintTopBoilerplate(printer_, file_, GeneratingDescriptorProto()); + PrintImports(); + PrintFileDescriptor(); + PrintTopLevelEnums(); + PrintTopLevelExtensions(); + PrintAllNestedEnumsInFile(); + PrintMessageDescriptors(); + FixForeignFieldsInDescriptors(); + PrintMessages(); + // We have to fix up the extensions after the message classes themselves, + // since they need to call static RegisterExtension() methods on these + // classes. + FixForeignFieldsInExtensions(); + if (HasGenericServices(file)) { + PrintServices(); + } + + printer.Print( + "# @@protoc_insertion_point(module_scope)\n"); + + return !printer.failed(); +} + +// Prints Python imports for all modules imported by |file|. +void Generator::PrintImports() const { + for (int i = 0; i < file_->dependency_count(); ++i) { + string module_name = ModuleName(file_->dependency(i)->name()); + printer_->Print("import $module$\n", "module", + module_name); + } + printer_->Print("\n"); +} + +// Prints the single file descriptor for this file. +void Generator::PrintFileDescriptor() const { + map m; + m["descriptor_name"] = kDescriptorKey; + m["name"] = file_->name(); + m["package"] = file_->package(); + const char file_descriptor_template[] = + "$descriptor_name$ = descriptor.FileDescriptor(\n" + " name='$name$',\n" + " package='$package$',\n"; + printer_->Print(m, file_descriptor_template); + printer_->Indent(); + printer_->Print( + "serialized_pb='$value$'", + "value", strings::CHexEscape(file_descriptor_serialized_)); + + // TODO(falk): Also print options and fix the message_type, enum_type, + // service and extension later in the generation. + + printer_->Outdent(); + printer_->Print(")\n"); + printer_->Print("\n"); +} + +// Prints descriptors and module-level constants for all top-level +// enums defined in |file|. +void Generator::PrintTopLevelEnums() const { + vector > top_level_enum_values; + for (int i = 0; i < file_->enum_type_count(); ++i) { + const EnumDescriptor& enum_descriptor = *file_->enum_type(i); + PrintEnum(enum_descriptor); + printer_->Print("\n"); + + for (int j = 0; j < enum_descriptor.value_count(); ++j) { + const EnumValueDescriptor& value_descriptor = *enum_descriptor.value(j); + top_level_enum_values.push_back( + make_pair(value_descriptor.name(), value_descriptor.number())); + } + } + + for (int i = 0; i < top_level_enum_values.size(); ++i) { + printer_->Print("$name$ = $value$\n", + "name", top_level_enum_values[i].first, + "value", SimpleItoa(top_level_enum_values[i].second)); + } + printer_->Print("\n"); +} + +// Prints all enums contained in all message types in |file|. +void Generator::PrintAllNestedEnumsInFile() const { + for (int i = 0; i < file_->message_type_count(); ++i) { + PrintNestedEnums(*file_->message_type(i)); + } +} + +// Prints a Python statement assigning the appropriate module-level +// enum name to a Python EnumDescriptor object equivalent to +// enum_descriptor. +void Generator::PrintEnum(const EnumDescriptor& enum_descriptor) const { + map m; + m["descriptor_name"] = ModuleLevelDescriptorName(enum_descriptor); + m["name"] = enum_descriptor.name(); + m["full_name"] = enum_descriptor.full_name(); + m["file"] = kDescriptorKey; + const char enum_descriptor_template[] = + "$descriptor_name$ = descriptor.EnumDescriptor(\n" + " name='$name$',\n" + " full_name='$full_name$',\n" + " filename=None,\n" + " file=$file$,\n" + " values=[\n"; + string options_string; + enum_descriptor.options().SerializeToString(&options_string); + printer_->Print(m, enum_descriptor_template); + printer_->Indent(); + printer_->Indent(); + for (int i = 0; i < enum_descriptor.value_count(); ++i) { + PrintEnumValueDescriptor(*enum_descriptor.value(i)); + printer_->Print(",\n"); + } + printer_->Outdent(); + printer_->Print("],\n"); + printer_->Print("containing_type=None,\n"); + printer_->Print("options=$options_value$,\n", + "options_value", + OptionsValue("EnumOptions", options_string)); + EnumDescriptorProto edp; + PrintSerializedPbInterval(enum_descriptor, edp); + printer_->Outdent(); + printer_->Print(")\n"); + printer_->Print("\n"); +} + +// Recursively prints enums in nested types within descriptor, then +// prints enums contained at the top level in descriptor. +void Generator::PrintNestedEnums(const Descriptor& descriptor) const { + for (int i = 0; i < descriptor.nested_type_count(); ++i) { + PrintNestedEnums(*descriptor.nested_type(i)); + } + + for (int i = 0; i < descriptor.enum_type_count(); ++i) { + PrintEnum(*descriptor.enum_type(i)); + } +} + +void Generator::PrintTopLevelExtensions() const { + const bool is_extension = true; + for (int i = 0; i < file_->extension_count(); ++i) { + const FieldDescriptor& extension_field = *file_->extension(i); + string constant_name = extension_field.name() + "_FIELD_NUMBER"; + UpperString(&constant_name); + printer_->Print("$constant_name$ = $number$\n", + "constant_name", constant_name, + "number", SimpleItoa(extension_field.number())); + printer_->Print("$name$ = ", "name", extension_field.name()); + PrintFieldDescriptor(extension_field, is_extension); + printer_->Print("\n"); + } + printer_->Print("\n"); +} + +// Prints Python equivalents of all Descriptors in |file|. +void Generator::PrintMessageDescriptors() const { + for (int i = 0; i < file_->message_type_count(); ++i) { + PrintDescriptor(*file_->message_type(i)); + printer_->Print("\n"); + } +} + +void Generator::PrintServices() const { + for (int i = 0; i < file_->service_count(); ++i) { + PrintServiceDescriptor(*file_->service(i)); + PrintServiceClass(*file_->service(i)); + PrintServiceStub(*file_->service(i)); + printer_->Print("\n"); + } +} + +void Generator::PrintServiceDescriptor( + const ServiceDescriptor& descriptor) const { + printer_->Print("\n"); + string service_name = ModuleLevelServiceDescriptorName(descriptor); + string options_string; + descriptor.options().SerializeToString(&options_string); + + printer_->Print( + "$service_name$ = descriptor.ServiceDescriptor(\n", + "service_name", service_name); + printer_->Indent(); + map m; + m["name"] = descriptor.name(); + m["full_name"] = descriptor.full_name(); + m["file"] = kDescriptorKey; + m["index"] = SimpleItoa(descriptor.index()); + m["options_value"] = OptionsValue("ServiceOptions", options_string); + const char required_function_arguments[] = + "name='$name$',\n" + "full_name='$full_name$',\n" + "file=$file$,\n" + "index=$index$,\n" + "options=$options_value$,\n"; + printer_->Print(m, required_function_arguments); + + ServiceDescriptorProto sdp; + PrintSerializedPbInterval(descriptor, sdp); + + printer_->Print("methods=[\n"); + for (int i = 0; i < descriptor.method_count(); ++i) { + const MethodDescriptor* method = descriptor.method(i); + string options_string; + method->options().SerializeToString(&options_string); + + m.clear(); + m["name"] = method->name(); + m["full_name"] = method->full_name(); + m["index"] = SimpleItoa(method->index()); + m["serialized_options"] = CEscape(options_string); + m["input_type"] = ModuleLevelDescriptorName(*(method->input_type())); + m["output_type"] = ModuleLevelDescriptorName(*(method->output_type())); + m["options_value"] = OptionsValue("MethodOptions", options_string); + printer_->Print("descriptor.MethodDescriptor(\n"); + printer_->Indent(); + printer_->Print( + m, + "name='$name$',\n" + "full_name='$full_name$',\n" + "index=$index$,\n" + "containing_service=None,\n" + "input_type=$input_type$,\n" + "output_type=$output_type$,\n" + "options=$options_value$,\n"); + printer_->Outdent(); + printer_->Print("),\n"); + } + + printer_->Outdent(); + printer_->Print("])\n\n"); +} + +void Generator::PrintServiceClass(const ServiceDescriptor& descriptor) const { + // Print the service. + printer_->Print("class $class_name$(service.Service):\n", + "class_name", descriptor.name()); + printer_->Indent(); + printer_->Print( + "__metaclass__ = service_reflection.GeneratedServiceType\n" + "$descriptor_key$ = $descriptor_name$\n", + "descriptor_key", kDescriptorKey, + "descriptor_name", ModuleLevelServiceDescriptorName(descriptor)); + printer_->Outdent(); +} + +void Generator::PrintServiceStub(const ServiceDescriptor& descriptor) const { + // Print the service stub. + printer_->Print("class $class_name$_Stub($class_name$):\n", + "class_name", descriptor.name()); + printer_->Indent(); + printer_->Print( + "__metaclass__ = service_reflection.GeneratedServiceStubType\n" + "$descriptor_key$ = $descriptor_name$\n", + "descriptor_key", kDescriptorKey, + "descriptor_name", ModuleLevelServiceDescriptorName(descriptor)); + printer_->Outdent(); +} + +// Prints statement assigning ModuleLevelDescriptorName(message_descriptor) +// to a Python Descriptor object for message_descriptor. +// +// Mutually recursive with PrintNestedDescriptors(). +void Generator::PrintDescriptor(const Descriptor& message_descriptor) const { + PrintNestedDescriptors(message_descriptor); + + printer_->Print("\n"); + printer_->Print("$descriptor_name$ = descriptor.Descriptor(\n", + "descriptor_name", + ModuleLevelDescriptorName(message_descriptor)); + printer_->Indent(); + map m; + m["name"] = message_descriptor.name(); + m["full_name"] = message_descriptor.full_name(); + m["file"] = kDescriptorKey; + const char required_function_arguments[] = + "name='$name$',\n" + "full_name='$full_name$',\n" + "filename=None,\n" + "file=$file$,\n" + "containing_type=None,\n"; + printer_->Print(m, required_function_arguments); + PrintFieldsInDescriptor(message_descriptor); + PrintExtensionsInDescriptor(message_descriptor); + + // Nested types + printer_->Print("nested_types=["); + for (int i = 0; i < message_descriptor.nested_type_count(); ++i) { + const string nested_name = ModuleLevelDescriptorName( + *message_descriptor.nested_type(i)); + printer_->Print("$name$, ", "name", nested_name); + } + printer_->Print("],\n"); + + // Enum types + printer_->Print("enum_types=[\n"); + printer_->Indent(); + for (int i = 0; i < message_descriptor.enum_type_count(); ++i) { + const string descriptor_name = ModuleLevelDescriptorName( + *message_descriptor.enum_type(i)); + printer_->Print(descriptor_name.c_str()); + printer_->Print(",\n"); + } + printer_->Outdent(); + printer_->Print("],\n"); + string options_string; + message_descriptor.options().SerializeToString(&options_string); + printer_->Print( + "options=$options_value$,\n" + "is_extendable=$extendable$", + "options_value", OptionsValue("MessageOptions", options_string), + "extendable", message_descriptor.extension_range_count() > 0 ? + "True" : "False"); + printer_->Print(",\n"); + + // Extension ranges + printer_->Print("extension_ranges=["); + for (int i = 0; i < message_descriptor.extension_range_count(); ++i) { + const Descriptor::ExtensionRange* range = + message_descriptor.extension_range(i); + printer_->Print("($start$, $end$), ", + "start", SimpleItoa(range->start), + "end", SimpleItoa(range->end)); + } + printer_->Print("],\n"); + + // Serialization of proto + DescriptorProto edp; + PrintSerializedPbInterval(message_descriptor, edp); + + printer_->Outdent(); + printer_->Print(")\n"); +} + +// Prints Python Descriptor objects for all nested types contained in +// message_descriptor. +// +// Mutually recursive with PrintDescriptor(). +void Generator::PrintNestedDescriptors( + const Descriptor& containing_descriptor) const { + for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) { + PrintDescriptor(*containing_descriptor.nested_type(i)); + } +} + +// Prints all messages in |file|. +void Generator::PrintMessages() const { + for (int i = 0; i < file_->message_type_count(); ++i) { + PrintMessage(*file_->message_type(i)); + printer_->Print("\n"); + } +} + +// Prints a Python class for the given message descriptor. We defer to the +// metaclass to do almost all of the work of actually creating a useful class. +// The purpose of this function and its many helper functions above is merely +// to output a Python version of the descriptors, which the metaclass in +// reflection.py will use to construct the meat of the class itself. +// +// Mutually recursive with PrintNestedMessages(). +void Generator::PrintMessage( + const Descriptor& message_descriptor) const { + printer_->Print("class $name$(message.Message):\n", "name", + message_descriptor.name()); + printer_->Indent(); + printer_->Print("__metaclass__ = reflection.GeneratedProtocolMessageType\n"); + PrintNestedMessages(message_descriptor); + map m; + m["descriptor_key"] = kDescriptorKey; + m["descriptor_name"] = ModuleLevelDescriptorName(message_descriptor); + printer_->Print(m, "$descriptor_key$ = $descriptor_name$\n"); + + printer_->Print( + "\n" + "# @@protoc_insertion_point(class_scope:$full_name$)\n", + "full_name", message_descriptor.full_name()); + + printer_->Outdent(); +} + +// Prints all nested messages within |containing_descriptor|. +// Mutually recursive with PrintMessage(). +void Generator::PrintNestedMessages( + const Descriptor& containing_descriptor) const { + for (int i = 0; i < containing_descriptor.nested_type_count(); ++i) { + printer_->Print("\n"); + PrintMessage(*containing_descriptor.nested_type(i)); + } +} + +// Recursively fixes foreign fields in all nested types in |descriptor|, then +// sets the message_type and enum_type of all message and enum fields to point +// to their respective descriptors. +// Args: +// descriptor: descriptor to print fields for. +// containing_descriptor: if descriptor is a nested type, this is its +// containing type, or NULL if this is a root/top-level type. +void Generator::FixForeignFieldsInDescriptor( + const Descriptor& descriptor, + const Descriptor* containing_descriptor) const { + for (int i = 0; i < descriptor.nested_type_count(); ++i) { + FixForeignFieldsInDescriptor(*descriptor.nested_type(i), &descriptor); + } + + for (int i = 0; i < descriptor.field_count(); ++i) { + const FieldDescriptor& field_descriptor = *descriptor.field(i); + FixForeignFieldsInField(&descriptor, field_descriptor, "fields_by_name"); + } + + FixContainingTypeInDescriptor(descriptor, containing_descriptor); + for (int i = 0; i < descriptor.enum_type_count(); ++i) { + const EnumDescriptor& enum_descriptor = *descriptor.enum_type(i); + FixContainingTypeInDescriptor(enum_descriptor, &descriptor); + } +} + +void Generator::AddMessageToFileDescriptor(const Descriptor& descriptor) const { + map m; + m["descriptor_name"] = kDescriptorKey; + m["message_name"] = descriptor.name(); + m["message_descriptor_name"] = ModuleLevelDescriptorName(descriptor); + const char file_descriptor_template[] = + "$descriptor_name$.message_types_by_name['$message_name$'] = " + "$message_descriptor_name$\n"; + printer_->Print(m, file_descriptor_template); +} + +// Sets any necessary message_type and enum_type attributes +// for the Python version of |field|. +// +// containing_type may be NULL, in which case this is a module-level field. +// +// python_dict_name is the name of the Python dict where we should +// look the field up in the containing type. (e.g., fields_by_name +// or extensions_by_name). We ignore python_dict_name if containing_type +// is NULL. +void Generator::FixForeignFieldsInField(const Descriptor* containing_type, + const FieldDescriptor& field, + const string& python_dict_name) const { + const string field_referencing_expression = FieldReferencingExpression( + containing_type, field, python_dict_name); + map m; + m["field_ref"] = field_referencing_expression; + const Descriptor* foreign_message_type = field.message_type(); + if (foreign_message_type) { + m["foreign_type"] = ModuleLevelDescriptorName(*foreign_message_type); + printer_->Print(m, "$field_ref$.message_type = $foreign_type$\n"); + } + const EnumDescriptor* enum_type = field.enum_type(); + if (enum_type) { + m["enum_type"] = ModuleLevelDescriptorName(*enum_type); + printer_->Print(m, "$field_ref$.enum_type = $enum_type$\n"); + } +} + +// Returns the module-level expression for the given FieldDescriptor. +// Only works for fields in the .proto file this Generator is generating for. +// +// containing_type may be NULL, in which case this is a module-level field. +// +// python_dict_name is the name of the Python dict where we should +// look the field up in the containing type. (e.g., fields_by_name +// or extensions_by_name). We ignore python_dict_name if containing_type +// is NULL. +string Generator::FieldReferencingExpression( + const Descriptor* containing_type, + const FieldDescriptor& field, + const string& python_dict_name) const { + // We should only ever be looking up fields in the current file. + // The only things we refer to from other files are message descriptors. + GOOGLE_CHECK_EQ(field.file(), file_) << field.file()->name() << " vs. " + << file_->name(); + if (!containing_type) { + return field.name(); + } + return strings::Substitute( + "$0.$1['$2']", + ModuleLevelDescriptorName(*containing_type), + python_dict_name, field.name()); +} + +// Prints containing_type for nested descriptors or enum descriptors. +template +void Generator::FixContainingTypeInDescriptor( + const DescriptorT& descriptor, + const Descriptor* containing_descriptor) const { + if (containing_descriptor != NULL) { + const string nested_name = ModuleLevelDescriptorName(descriptor); + const string parent_name = ModuleLevelDescriptorName( + *containing_descriptor); + printer_->Print( + "$nested_name$.containing_type = $parent_name$;\n", + "nested_name", nested_name, + "parent_name", parent_name); + } +} + +// Prints statements setting the message_type and enum_type fields in the +// Python descriptor objects we've already output in ths file. We must +// do this in a separate step due to circular references (otherwise, we'd +// just set everything in the initial assignment statements). +void Generator::FixForeignFieldsInDescriptors() const { + for (int i = 0; i < file_->message_type_count(); ++i) { + FixForeignFieldsInDescriptor(*file_->message_type(i), NULL); + } + for (int i = 0; i < file_->message_type_count(); ++i) { + AddMessageToFileDescriptor(*file_->message_type(i)); + } + printer_->Print("\n"); +} + +// We need to not only set any necessary message_type fields, but +// also need to call RegisterExtension() on each message we're +// extending. +void Generator::FixForeignFieldsInExtensions() const { + // Top-level extensions. + for (int i = 0; i < file_->extension_count(); ++i) { + FixForeignFieldsInExtension(*file_->extension(i)); + } + // Nested extensions. + for (int i = 0; i < file_->message_type_count(); ++i) { + FixForeignFieldsInNestedExtensions(*file_->message_type(i)); + } +} + +void Generator::FixForeignFieldsInExtension( + const FieldDescriptor& extension_field) const { + GOOGLE_CHECK(extension_field.is_extension()); + // extension_scope() will be NULL for top-level extensions, which is + // exactly what FixForeignFieldsInField() wants. + FixForeignFieldsInField(extension_field.extension_scope(), extension_field, + "extensions_by_name"); + + map m; + // Confusingly, for FieldDescriptors that happen to be extensions, + // containing_type() means "extended type." + // On the other hand, extension_scope() will give us what we normally + // mean by containing_type(). + m["extended_message_class"] = ModuleLevelMessageName( + *extension_field.containing_type()); + m["field"] = FieldReferencingExpression(extension_field.extension_scope(), + extension_field, + "extensions_by_name"); + printer_->Print(m, "$extended_message_class$.RegisterExtension($field$)\n"); +} + +void Generator::FixForeignFieldsInNestedExtensions( + const Descriptor& descriptor) const { + // Recursively fix up extensions in all nested types. + for (int i = 0; i < descriptor.nested_type_count(); ++i) { + FixForeignFieldsInNestedExtensions(*descriptor.nested_type(i)); + } + // Fix up extensions directly contained within this type. + for (int i = 0; i < descriptor.extension_count(); ++i) { + FixForeignFieldsInExtension(*descriptor.extension(i)); + } +} + +// Returns a Python expression that instantiates a Python EnumValueDescriptor +// object for the given C++ descriptor. +void Generator::PrintEnumValueDescriptor( + const EnumValueDescriptor& descriptor) const { + // TODO(robinson): Fix up EnumValueDescriptor "type" fields. + // More circular references. ::sigh:: + string options_string; + descriptor.options().SerializeToString(&options_string); + map m; + m["name"] = descriptor.name(); + m["index"] = SimpleItoa(descriptor.index()); + m["number"] = SimpleItoa(descriptor.number()); + m["options"] = OptionsValue("EnumValueOptions", options_string); + printer_->Print( + m, + "descriptor.EnumValueDescriptor(\n" + " name='$name$', index=$index$, number=$number$,\n" + " options=$options$,\n" + " type=None)"); +} + +// Returns a Python expression that calls descriptor._ParseOptions using +// the given descriptor class name and serialized options protobuf string. +string Generator::OptionsValue( + const string& class_name, const string& serialized_options) const { + if (serialized_options.length() == 0 || GeneratingDescriptorProto()) { + return "None"; + } else { + string full_class_name = "descriptor_pb2." + class_name; + return "descriptor._ParseOptions(" + full_class_name + "(), '" + + CEscape(serialized_options)+ "')"; + } +} + +// Prints an expression for a Python FieldDescriptor for |field|. +void Generator::PrintFieldDescriptor( + const FieldDescriptor& field, bool is_extension) const { + string options_string; + field.options().SerializeToString(&options_string); + map m; + m["name"] = field.name(); + m["full_name"] = field.full_name(); + m["index"] = SimpleItoa(field.index()); + m["number"] = SimpleItoa(field.number()); + m["type"] = SimpleItoa(field.type()); + m["cpp_type"] = SimpleItoa(field.cpp_type()); + m["label"] = SimpleItoa(field.label()); + m["has_default_value"] = field.has_default_value() ? "True" : "False"; + m["default_value"] = StringifyDefaultValue(field); + m["is_extension"] = is_extension ? "True" : "False"; + m["options"] = OptionsValue("FieldOptions", options_string); + // We always set message_type and enum_type to None at this point, and then + // these fields in correctly after all referenced descriptors have been + // defined and/or imported (see FixForeignFieldsInDescriptors()). + const char field_descriptor_decl[] = + "descriptor.FieldDescriptor(\n" + " name='$name$', full_name='$full_name$', index=$index$,\n" + " number=$number$, type=$type$, cpp_type=$cpp_type$, label=$label$,\n" + " has_default_value=$has_default_value$, default_value=$default_value$,\n" + " message_type=None, enum_type=None, containing_type=None,\n" + " is_extension=$is_extension$, extension_scope=None,\n" + " options=$options$)"; + printer_->Print(m, field_descriptor_decl); +} + +// Helper for Print{Fields,Extensions}InDescriptor(). +void Generator::PrintFieldDescriptorsInDescriptor( + const Descriptor& message_descriptor, + bool is_extension, + const string& list_variable_name, + int (Descriptor::*CountFn)() const, + const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const { + printer_->Print("$list$=[\n", "list", list_variable_name); + printer_->Indent(); + for (int i = 0; i < (message_descriptor.*CountFn)(); ++i) { + PrintFieldDescriptor(*(message_descriptor.*GetterFn)(i), + is_extension); + printer_->Print(",\n"); + } + printer_->Outdent(); + printer_->Print("],\n"); +} + +// Prints a statement assigning "fields" to a list of Python FieldDescriptors, +// one for each field present in message_descriptor. +void Generator::PrintFieldsInDescriptor( + const Descriptor& message_descriptor) const { + const bool is_extension = false; + PrintFieldDescriptorsInDescriptor( + message_descriptor, is_extension, "fields", + &Descriptor::field_count, &Descriptor::field); +} + +// Prints a statement assigning "extensions" to a list of Python +// FieldDescriptors, one for each extension present in message_descriptor. +void Generator::PrintExtensionsInDescriptor( + const Descriptor& message_descriptor) const { + const bool is_extension = true; + PrintFieldDescriptorsInDescriptor( + message_descriptor, is_extension, "extensions", + &Descriptor::extension_count, &Descriptor::extension); +} + +bool Generator::GeneratingDescriptorProto() const { + return file_->name() == "google/protobuf/descriptor.proto"; +} + +// Returns the unique Python module-level identifier given to a descriptor. +// This name is module-qualified iff the given descriptor describes an +// entity that doesn't come from the current file. +template +string Generator::ModuleLevelDescriptorName( + const DescriptorT& descriptor) const { + // FIXME(robinson): + // We currently don't worry about collisions with underscores in the type + // names, so these would collide in nasty ways if found in the same file: + // OuterProto.ProtoA.ProtoB + // OuterProto_ProtoA.ProtoB # Underscore instead of period. + // As would these: + // OuterProto.ProtoA_.ProtoB + // OuterProto.ProtoA._ProtoB # Leading vs. trailing underscore. + // (Contrived, but certainly possible). + // + // The C++ implementation doesn't guard against this either. Leaving + // it for now... + string name = NamePrefixedWithNestedTypes(descriptor, "_"); + UpperString(&name); + // Module-private for now. Easy to make public later; almost impossible + // to make private later. + name = "_" + name; + // We now have the name relative to its own module. Also qualify with + // the module name iff this descriptor is from a different .proto file. + if (descriptor.file() != file_) { + name = ModuleName(descriptor.file()->name()) + "." + name; + } + return name; +} + +// Returns the name of the message class itself, not the descriptor. +// Like ModuleLevelDescriptorName(), module-qualifies the name iff +// the given descriptor describes an entity that doesn't come from +// the current file. +string Generator::ModuleLevelMessageName(const Descriptor& descriptor) const { + string name = NamePrefixedWithNestedTypes(descriptor, "."); + if (descriptor.file() != file_) { + name = ModuleName(descriptor.file()->name()) + "." + name; + } + return name; +} + +// Returns the unique Python module-level identifier given to a service +// descriptor. +string Generator::ModuleLevelServiceDescriptorName( + const ServiceDescriptor& descriptor) const { + string name = descriptor.name(); + UpperString(&name); + name = "_" + name; + if (descriptor.file() != file_) { + name = ModuleName(descriptor.file()->name()) + "." + name; + } + return name; +} + +// Prints standard constructor arguments serialized_start and serialized_end. +// Args: +// descriptor: The cpp descriptor to have a serialized reference. +// proto: A proto +// Example printer output: +// serialized_start=41, +// serialized_end=43, +// +template +void Generator::PrintSerializedPbInterval( + const DescriptorT& descriptor, DescriptorProtoT& proto) const { + descriptor.CopyTo(&proto); + string sp; + proto.SerializeToString(&sp); + int offset = file_descriptor_serialized_.find(sp); + GOOGLE_CHECK_GE(offset, 0); + + printer_->Print("serialized_start=$serialized_start$,\n" + "serialized_end=$serialized_end$,\n", + "serialized_start", SimpleItoa(offset), + "serialized_end", SimpleItoa(offset + sp.size())); +} + +} // namespace python +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h new file mode 100644 index 000000000..84eaf8abd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h @@ -0,0 +1,156 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: robinson@google.com (Will Robinson) +// +// Generates Python code for a given .proto file. + +#ifndef GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ +#define GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ + +#include + +#include +#include + +namespace google { +namespace protobuf { + +class Descriptor; +class EnumDescriptor; +class EnumValueDescriptor; +class FieldDescriptor; +class ServiceDescriptor; + +namespace io { class Printer; } + +namespace compiler { +namespace python { + +// CodeGenerator implementation for generated Python protocol buffer classes. +// If you create your own protocol compiler binary and you want it to support +// Python output, you can do so by registering an instance of this +// CodeGenerator with the CommandLineInterface in your main() function. +class LIBPROTOC_EXPORT Generator : public CodeGenerator { + public: + Generator(); + virtual ~Generator(); + + // CodeGenerator methods. + virtual bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* generator_context, + string* error) const; + + private: + void PrintImports() const; + void PrintFileDescriptor() const; + void PrintTopLevelEnums() const; + void PrintAllNestedEnumsInFile() const; + void PrintNestedEnums(const Descriptor& descriptor) const; + void PrintEnum(const EnumDescriptor& enum_descriptor) const; + + void PrintTopLevelExtensions() const; + + void PrintFieldDescriptor( + const FieldDescriptor& field, bool is_extension) const; + void PrintFieldDescriptorsInDescriptor( + const Descriptor& message_descriptor, + bool is_extension, + const string& list_variable_name, + int (Descriptor::*CountFn)() const, + const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const; + void PrintFieldsInDescriptor(const Descriptor& message_descriptor) const; + void PrintExtensionsInDescriptor(const Descriptor& message_descriptor) const; + void PrintMessageDescriptors() const; + void PrintDescriptor(const Descriptor& message_descriptor) const; + void PrintNestedDescriptors(const Descriptor& containing_descriptor) const; + + void PrintMessages() const; + void PrintMessage(const Descriptor& message_descriptor) const; + void PrintNestedMessages(const Descriptor& containing_descriptor) const; + + void FixForeignFieldsInDescriptors() const; + void FixForeignFieldsInDescriptor( + const Descriptor& descriptor, + const Descriptor* containing_descriptor) const; + void FixForeignFieldsInField(const Descriptor* containing_type, + const FieldDescriptor& field, + const string& python_dict_name) const; + void AddMessageToFileDescriptor(const Descriptor& descriptor) const; + string FieldReferencingExpression(const Descriptor* containing_type, + const FieldDescriptor& field, + const string& python_dict_name) const; + template + void FixContainingTypeInDescriptor( + const DescriptorT& descriptor, + const Descriptor* containing_descriptor) const; + + void FixForeignFieldsInExtensions() const; + void FixForeignFieldsInExtension( + const FieldDescriptor& extension_field) const; + void FixForeignFieldsInNestedExtensions(const Descriptor& descriptor) const; + + void PrintServices() const; + void PrintServiceDescriptor(const ServiceDescriptor& descriptor) const; + void PrintServiceClass(const ServiceDescriptor& descriptor) const; + void PrintServiceStub(const ServiceDescriptor& descriptor) const; + + void PrintEnumValueDescriptor(const EnumValueDescriptor& descriptor) const; + string OptionsValue(const string& class_name, + const string& serialized_options) const; + bool GeneratingDescriptorProto() const; + + template + string ModuleLevelDescriptorName(const DescriptorT& descriptor) const; + string ModuleLevelMessageName(const Descriptor& descriptor) const; + string ModuleLevelServiceDescriptorName( + const ServiceDescriptor& descriptor) const; + + template + void PrintSerializedPbInterval( + const DescriptorT& descriptor, DescriptorProtoT& proto) const; + + // Very coarse-grained lock to ensure that Generate() is reentrant. + // Guards file_, printer_ and file_descriptor_serialized_. + mutable Mutex mutex_; + mutable const FileDescriptor* file_; // Set in Generate(). Under mutex_. + mutable string file_descriptor_serialized_; + mutable io::Printer* printer_; // Set in Generate(). Under mutex_. + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator); +}; + +} // namespace python +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc new file mode 100644 index 000000000..da619ad3e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc @@ -0,0 +1,116 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// TODO(kenton): Share code with the versions of this test in other languages? +// It seemed like parameterizing it would add more complexity than it is +// worth. + +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace python { +namespace { + +class TestGenerator : public CodeGenerator { + public: + TestGenerator() {} + ~TestGenerator() {} + + virtual bool Generate(const FileDescriptor* file, + const string& parameter, + GeneratorContext* context, + string* error) const { + TryInsert("test_pb2.py", "imports", context); + TryInsert("test_pb2.py", "module_scope", context); + TryInsert("test_pb2.py", "class_scope:foo.Bar", context); + TryInsert("test_pb2.py", "class_scope:foo.Bar.Baz", context); + return true; + } + + void TryInsert(const string& filename, const string& insertion_point, + GeneratorContext* context) const { + scoped_ptr output( + context->OpenForInsert(filename, insertion_point)); + io::Printer printer(output.get(), '$'); + printer.Print("// inserted $name$\n", "name", insertion_point); + } +}; + +// This test verifies that all the expected insertion points exist. It does +// not verify that they are correctly-placed; that would require actually +// compiling the output which is a bit more than I care to do for this test. +TEST(PythonPluginTest, PluginTest) { + File::WriteStringToFileOrDie( + "syntax = \"proto2\";\n" + "package foo;\n" + "message Bar {\n" + " message Baz {}\n" + "}\n", + TestTempDir() + "/test.proto"); + + google::protobuf::compiler::CommandLineInterface cli; + cli.SetInputsAreProtoPathRelative(true); + + python::Generator python_generator; + TestGenerator test_generator; + cli.RegisterGenerator("--python_out", &python_generator, ""); + cli.RegisterGenerator("--test_out", &test_generator, ""); + + string proto_path = "-I" + TestTempDir(); + string python_out = "--python_out=" + TestTempDir(); + string test_out = "--test_out=" + TestTempDir(); + + const char* argv[] = { + "protoc", + proto_path.c_str(), + python_out.c_str(), + test_out.c_str(), + "test.proto" + }; + + EXPECT_EQ(0, cli.Run(5, argv)); +} + +} // namespace +} // namespace python +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc new file mode 100644 index 000000000..5fb5d5cb7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc @@ -0,0 +1,460 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include + +#include + +#ifndef _WIN32 +#include +#include +#include +#include +#endif + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +#ifdef _WIN32 + +static void CloseHandleOrDie(HANDLE handle) { + if (!CloseHandle(handle)) { + GOOGLE_LOG(FATAL) << "CloseHandle: " + << Subprocess::Win32ErrorMessage(GetLastError()); + } +} + +Subprocess::Subprocess() + : process_start_error_(ERROR_SUCCESS), + child_handle_(NULL), child_stdin_(NULL), child_stdout_(NULL) {} + +Subprocess::~Subprocess() { + if (child_stdin_ != NULL) { + CloseHandleOrDie(child_stdin_); + } + if (child_stdout_ != NULL) { + CloseHandleOrDie(child_stdout_); + } +} + +void Subprocess::Start(const string& program, SearchMode search_mode) { + // Create the pipes. + HANDLE stdin_pipe_read; + HANDLE stdin_pipe_write; + HANDLE stdout_pipe_read; + HANDLE stdout_pipe_write; + + if (!CreatePipe(&stdin_pipe_read, &stdin_pipe_write, NULL, 0)) { + GOOGLE_LOG(FATAL) << "CreatePipe: " << Win32ErrorMessage(GetLastError()); + } + if (!CreatePipe(&stdout_pipe_read, &stdout_pipe_write, NULL, 0)) { + GOOGLE_LOG(FATAL) << "CreatePipe: " << Win32ErrorMessage(GetLastError()); + } + + // Make child side of the pipes inheritable. + if (!SetHandleInformation(stdin_pipe_read, + HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) { + GOOGLE_LOG(FATAL) << "SetHandleInformation: " + << Win32ErrorMessage(GetLastError()); + } + if (!SetHandleInformation(stdout_pipe_write, + HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)) { + GOOGLE_LOG(FATAL) << "SetHandleInformation: " + << Win32ErrorMessage(GetLastError()); + } + + // Setup STARTUPINFO to redirect handles. + STARTUPINFOA startup_info; + ZeroMemory(&startup_info, sizeof(startup_info)); + startup_info.cb = sizeof(startup_info); + startup_info.dwFlags = STARTF_USESTDHANDLES; + startup_info.hStdInput = stdin_pipe_read; + startup_info.hStdOutput = stdout_pipe_write; + startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); + + if (startup_info.hStdError == INVALID_HANDLE_VALUE) { + GOOGLE_LOG(FATAL) << "GetStdHandle: " + << Win32ErrorMessage(GetLastError()); + } + + // CreateProcess() mutates its second parameter. WTF? + char* name_copy = strdup(program.c_str()); + + // Create the process. + PROCESS_INFORMATION process_info; + + if (CreateProcessA((search_mode == SEARCH_PATH) ? NULL : program.c_str(), + (search_mode == SEARCH_PATH) ? name_copy : NULL, + NULL, // process security attributes + NULL, // thread security attributes + TRUE, // inherit handles? + 0, // obscure creation flags + NULL, // environment (inherit from parent) + NULL, // current directory (inherit from parent) + &startup_info, + &process_info)) { + child_handle_ = process_info.hProcess; + CloseHandleOrDie(process_info.hThread); + child_stdin_ = stdin_pipe_write; + child_stdout_ = stdout_pipe_read; + } else { + process_start_error_ = GetLastError(); + CloseHandleOrDie(stdin_pipe_write); + CloseHandleOrDie(stdout_pipe_read); + } + + CloseHandleOrDie(stdin_pipe_read); + CloseHandleOrDie(stdout_pipe_write); + free(name_copy); +} + +bool Subprocess::Communicate(const Message& input, Message* output, + string* error) { + if (process_start_error_ != ERROR_SUCCESS) { + *error = Win32ErrorMessage(process_start_error_); + return false; + } + + GOOGLE_CHECK(child_handle_ != NULL) << "Must call Start() first."; + + string input_data = input.SerializeAsString(); + string output_data; + + int input_pos = 0; + + while (child_stdout_ != NULL) { + HANDLE handles[2]; + int handle_count = 0; + + if (child_stdin_ != NULL) { + handles[handle_count++] = child_stdin_; + } + if (child_stdout_ != NULL) { + handles[handle_count++] = child_stdout_; + } + + DWORD wait_result = + WaitForMultipleObjects(handle_count, handles, FALSE, INFINITE); + + HANDLE signaled_handle; + if (wait_result >= WAIT_OBJECT_0 && + wait_result < WAIT_OBJECT_0 + handle_count) { + signaled_handle = handles[wait_result - WAIT_OBJECT_0]; + } else if (wait_result == WAIT_FAILED) { + GOOGLE_LOG(FATAL) << "WaitForMultipleObjects: " + << Win32ErrorMessage(GetLastError()); + } else { + GOOGLE_LOG(FATAL) << "WaitForMultipleObjects: Unexpected return code: " + << wait_result; + } + + if (signaled_handle == child_stdin_) { + DWORD n; + if (!WriteFile(child_stdin_, + input_data.data() + input_pos, + input_data.size() - input_pos, + &n, NULL)) { + // Child closed pipe. Presumably it will report an error later. + // Pretend we're done for now. + input_pos = input_data.size(); + } else { + input_pos += n; + } + + if (input_pos == input_data.size()) { + // We're done writing. Close. + CloseHandleOrDie(child_stdin_); + child_stdin_ = NULL; + } + } else if (signaled_handle == child_stdout_) { + char buffer[4096]; + DWORD n; + + if (!ReadFile(child_stdout_, buffer, sizeof(buffer), &n, NULL)) { + // We're done reading. Close. + CloseHandleOrDie(child_stdout_); + child_stdout_ = NULL; + } else { + output_data.append(buffer, n); + } + } + } + + if (child_stdin_ != NULL) { + // Child did not finish reading input before it closed the output. + // Presumably it exited with an error. + CloseHandleOrDie(child_stdin_); + child_stdin_ = NULL; + } + + DWORD wait_result = WaitForSingleObject(child_handle_, INFINITE); + + if (wait_result == WAIT_FAILED) { + GOOGLE_LOG(FATAL) << "WaitForSingleObject: " + << Win32ErrorMessage(GetLastError()); + } else if (wait_result != WAIT_OBJECT_0) { + GOOGLE_LOG(FATAL) << "WaitForSingleObject: Unexpected return code: " + << wait_result; + } + + DWORD exit_code; + if (!GetExitCodeProcess(child_handle_, &exit_code)) { + GOOGLE_LOG(FATAL) << "GetExitCodeProcess: " + << Win32ErrorMessage(GetLastError()); + } + + CloseHandleOrDie(child_handle_); + child_handle_ = NULL; + + if (exit_code != 0) { + *error = strings::Substitute( + "Plugin failed with status code $0.", exit_code); + return false; + } + + if (!output->ParseFromString(output_data)) { + *error = "Plugin output is unparseable: " + CEscape(output_data); + return false; + } + + return true; +} + +string Subprocess::Win32ErrorMessage(DWORD error_code) { + char* message; + + // WTF? + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, error_code, 0, + (LPTSTR)&message, // NOT A BUG! + 0, NULL); + + string result = message; + LocalFree(message); + return result; +} + +// =================================================================== + +#else // _WIN32 + +Subprocess::Subprocess() + : child_pid_(-1), child_stdin_(-1), child_stdout_(-1) {} + +Subprocess::~Subprocess() { + if (child_stdin_ != -1) { + close(child_stdin_); + } + if (child_stdout_ != -1) { + close(child_stdout_); + } +} + +void Subprocess::Start(const string& program, SearchMode search_mode) { + // Note that we assume that there are no other threads, thus we don't have to + // do crazy stuff like using socket pairs or avoiding libc locks. + + // [0] is read end, [1] is write end. + int stdin_pipe[2]; + int stdout_pipe[2]; + + pipe(stdin_pipe); + pipe(stdout_pipe); + + char* argv[2] = { strdup(program.c_str()), NULL }; + + child_pid_ = fork(); + if (child_pid_ == -1) { + GOOGLE_LOG(FATAL) << "fork: " << strerror(errno); + } else if (child_pid_ == 0) { + // We are the child. + dup2(stdin_pipe[0], STDIN_FILENO); + dup2(stdout_pipe[1], STDOUT_FILENO); + + close(stdin_pipe[0]); + close(stdin_pipe[1]); + close(stdout_pipe[0]); + close(stdout_pipe[1]); + + switch (search_mode) { + case SEARCH_PATH: + execvp(argv[0], argv); + break; + case EXACT_NAME: + execv(argv[0], argv); + break; + } + + // Write directly to STDERR_FILENO to avoid stdio code paths that may do + // stuff that is unsafe here. + write(STDERR_FILENO, argv[0], strlen(argv[0])); + const char* message = ": program not found or is not executable\n"; + write(STDERR_FILENO, message, strlen(message)); + + // Must use _exit() rather than exit() to avoid flushing output buffers + // that will also be flushed by the parent. + _exit(1); + } else { + free(argv[0]); + + close(stdin_pipe[0]); + close(stdout_pipe[1]); + + child_stdin_ = stdin_pipe[1]; + child_stdout_ = stdout_pipe[0]; + } +} + +bool Subprocess::Communicate(const Message& input, Message* output, + string* error) { + + GOOGLE_CHECK_NE(child_stdin_, -1) << "Must call Start() first."; + + // The "sighandler_t" typedef is GNU-specific, so define our own. + typedef void SignalHandler(int); + + // Make sure SIGPIPE is disabled so that if the child dies it doesn't kill us. + SignalHandler* old_pipe_handler = signal(SIGPIPE, SIG_IGN); + + string input_data = input.SerializeAsString(); + string output_data; + + int input_pos = 0; + int max_fd = max(child_stdin_, child_stdout_); + + while (child_stdout_ != -1) { + fd_set read_fds; + fd_set write_fds; + FD_ZERO(&read_fds); + FD_ZERO(&write_fds); + if (child_stdout_ != -1) { + FD_SET(child_stdout_, &read_fds); + } + if (child_stdin_ != -1) { + FD_SET(child_stdin_, &write_fds); + } + + if (select(max_fd + 1, &read_fds, &write_fds, NULL, NULL) < 0) { + if (errno == EINTR) { + // Interrupted by signal. Try again. + continue; + } else { + GOOGLE_LOG(FATAL) << "select: " << strerror(errno); + } + } + + if (child_stdin_ != -1 && FD_ISSET(child_stdin_, &write_fds)) { + int n = write(child_stdin_, input_data.data() + input_pos, + input_data.size() - input_pos); + if (n < 0) { + // Child closed pipe. Presumably it will report an error later. + // Pretend we're done for now. + input_pos = input_data.size(); + } else { + input_pos += n; + } + + if (input_pos == input_data.size()) { + // We're done writing. Close. + close(child_stdin_); + child_stdin_ = -1; + } + } + + if (child_stdout_ != -1 && FD_ISSET(child_stdout_, &read_fds)) { + char buffer[4096]; + int n = read(child_stdout_, buffer, sizeof(buffer)); + + if (n > 0) { + output_data.append(buffer, n); + } else { + // We're done reading. Close. + close(child_stdout_); + child_stdout_ = -1; + } + } + } + + if (child_stdin_ != -1) { + // Child did not finish reading input before it closed the output. + // Presumably it exited with an error. + close(child_stdin_); + child_stdin_ = -1; + } + + int status; + while (waitpid(child_pid_, &status, 0) == -1) { + if (errno != EINTR) { + GOOGLE_LOG(FATAL) << "waitpid: " << strerror(errno); + } + } + + // Restore SIGPIPE handling. + signal(SIGPIPE, old_pipe_handler); + + if (WIFEXITED(status)) { + if (WEXITSTATUS(status) != 0) { + int error_code = WEXITSTATUS(status); + *error = strings::Substitute( + "Plugin failed with status code $0.", error_code); + return false; + } + } else if (WIFSIGNALED(status)) { + int signal = WTERMSIG(status); + *error = strings::Substitute( + "Plugin killed by signal $0.", signal); + return false; + } else { + *error = "Neither WEXITSTATUS nor WTERMSIG is true?"; + return false; + } + + if (!output->ParseFromString(output_data)) { + *error = "Plugin output is unparseable."; + return false; + } + + return true; +} + +#endif // !_WIN32 + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h new file mode 100644 index 000000000..005649640 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h @@ -0,0 +1,108 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#ifndef GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__ +#define GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__ + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN // right... +#include +#else // _WIN32 +#include +#include +#endif // !_WIN32 +#include + +#include + + +namespace google { +namespace protobuf { + +class Message; + +namespace compiler { + +// Utility class for launching sub-processes. +class LIBPROTOC_EXPORT Subprocess { + public: + Subprocess(); + ~Subprocess(); + + enum SearchMode { + SEARCH_PATH, // Use PATH environment variable. + EXACT_NAME // Program is an exact file name; don't use the PATH. + }; + + // Start the subprocess. Currently we don't provide a way to specify + // arguments as protoc plugins don't have any. + void Start(const string& program, SearchMode search_mode); + + // Serialize the input message and pipe it to the subprocess's stdin, then + // close the pipe. Meanwhile, read from the subprocess's stdout and parse + // the data into *output. All this is done carefully to avoid deadlocks. + // Returns true if successful. On any sort of error, returns false and sets + // *error to a description of the problem. + bool Communicate(const Message& input, Message* output, string* error); + +#ifdef _WIN32 + // Given an error code, returns a human-readable error message. This is + // defined here so that CommandLineInterface can share it. + static string Win32ErrorMessage(DWORD error_code); +#endif + + private: +#ifdef _WIN32 + DWORD process_start_error_; + HANDLE child_handle_; + + // The file handles for our end of the child's pipes. We close each and + // set it to NULL when no longer needed. + HANDLE child_stdin_; + HANDLE child_stdout_; + +#else // _WIN32 + pid_t child_pid_; + + // The file descriptors for our end of the child's pipes. We close each and + // set it to -1 when no longer needed. + int child_stdin_; + int child_stdout_; + +#endif // !_WIN32 +}; + +} // namespace compiler +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_COMPILER_SUBPROCESS_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc new file mode 100644 index 000000000..5cbbf3d9d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc @@ -0,0 +1,51 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// This is a dummy code generator plugin used by +// command_line_interface_unittest. + +#include +#include +#include +#include +#include + +int main(int argc, char* argv[]) { +#ifdef _MSC_VER + // Don't print a silly message or stick a modal dialog box in my face, + // please. + _set_abort_behavior(0, ~0); +#endif // !_MSC_VER + + google::protobuf::compiler::MockCodeGenerator generator("test_plugin"); + return google::protobuf::compiler::PluginMain(argc, argv, &generator); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh new file mode 100755 index 000000000..3a024364d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh @@ -0,0 +1,91 @@ +#!/bin/sh +# +# Protocol Buffers - Google's data interchange format +# Copyright 2009 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Author: kenton@google.com (Kenton Varda) +# +# Test protoc's zip output mode. + +fail() { + echo "$@" >&2 + exit 1 +} + +TEST_TMPDIR=. +PROTOC=./protoc + +echo ' + syntax = "proto2"; + option java_multiple_files = true; + option java_package = "test.jar"; + option java_outer_classname = "Outer"; + message Foo {} + message Bar {} +' > $TEST_TMPDIR/testzip.proto + +$PROTOC \ + --cpp_out=$TEST_TMPDIR/testzip.zip --python_out=$TEST_TMPDIR/testzip.zip \ + --java_out=$TEST_TMPDIR/testzip.jar -I$TEST_TMPDIR testzip.proto \ + || fail 'protoc failed.' + +echo "Testing output to zip..." +if unzip -h > /dev/null; then + unzip -t $TEST_TMPDIR/testzip.zip > $TEST_TMPDIR/testzip.list || fail 'unzip failed.' + + grep 'testing: testzip\.pb\.cc *OK$' $TEST_TMPDIR/testzip.list > /dev/null \ + || fail 'testzip.pb.cc not found in output zip.' + grep 'testing: testzip\.pb\.h *OK$' $TEST_TMPDIR/testzip.list > /dev/null \ + || fail 'testzip.pb.h not found in output zip.' + grep 'testing: testzip_pb2\.py *OK$' $TEST_TMPDIR/testzip.list > /dev/null \ + || fail 'testzip_pb2.py not found in output zip.' + grep -i 'manifest' $TEST_TMPDIR/testzip.list > /dev/null \ + && fail 'Zip file contained manifest.' +else + echo "Warning: 'unzip' command not available. Skipping test." +fi + +echo "Testing output to jar..." +if jar c $TEST_TMPDIR/testzip.proto > /dev/null; then + jar tf $TEST_TMPDIR/testzip.jar > $TEST_TMPDIR/testzip.list || fail 'jar failed.' + + grep '^test/jar/Foo\.java$' $TEST_TMPDIR/testzip.list > /dev/null \ + || fail 'Foo.java not found in output jar.' + grep '^test/jar/Bar\.java$' $TEST_TMPDIR/testzip.list > /dev/null \ + || fail 'Bar.java not found in output jar.' + grep '^test/jar/Outer\.java$' $TEST_TMPDIR/testzip.list > /dev/null \ + || fail 'Outer.java not found in output jar.' + grep '^META-INF/MANIFEST\.MF$' $TEST_TMPDIR/testzip.list > /dev/null \ + || fail 'Manifest not found in output jar.' +else + echo "Warning: 'jar' command not available. Skipping test." +fi + +echo PASS diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc new file mode 100644 index 000000000..65d735270 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc @@ -0,0 +1,218 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: ambrose@google.com (Ambrose Feinstein), +// kenton@google.com (Kenton Varda) +// +// Based on http://www.pkware.com/documents/casestudies/APPNOTE.TXT + +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +static const uint32 kCRC32Table[256] = { + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, + 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, + 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, + 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, + 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, + 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, + 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, + 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, + 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, + 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, + 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, + 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, + 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, + 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, + 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, + 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, + 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, + 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, + 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, + 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, + 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, + 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +static uint32 ComputeCRC32(const string &buf) { + uint32 x = ~0U; + for (int i = 0; i < buf.size(); ++i) { + unsigned char c = buf[i]; + x = kCRC32Table[(x ^ c) & 0xff] ^ (x >> 8); + } + return ~x; +} + +static void WriteShort(io::CodedOutputStream *out, uint16 val) { + uint8 p[2]; + p[0] = static_cast(val); + p[1] = static_cast(val >> 8); + out->WriteRaw(p, 2); +} + +ZipWriter::ZipWriter(io::ZeroCopyOutputStream* raw_output) + : raw_output_(raw_output) {} +ZipWriter::~ZipWriter() {} + +bool ZipWriter::Write(const string& filename, const string& contents) { + FileInfo info; + + info.name = filename; + uint16 filename_size = filename.size(); + info.offset = raw_output_->ByteCount(); + info.size = contents.size(); + info.crc32 = ComputeCRC32(contents); + + files_.push_back(info); + + // write file header + io::CodedOutputStream output(raw_output_); + output.WriteLittleEndian32(0x04034b50); // magic + WriteShort(&output, 10); // version needed to extract + WriteShort(&output, 0); // flags + WriteShort(&output, 0); // compression method: stored + WriteShort(&output, 0); // last modified time + WriteShort(&output, 0); // last modified date + output.WriteLittleEndian32(info.crc32); // crc-32 + output.WriteLittleEndian32(info.size); // compressed size + output.WriteLittleEndian32(info.size); // uncompressed size + WriteShort(&output, filename_size); // file name length + WriteShort(&output, 0); // extra field length + output.WriteString(filename); // file name + output.WriteString(contents); // file data + + return !output.HadError(); +} + +bool ZipWriter::WriteDirectory() { + uint16 num_entries = files_.size(); + uint32 dir_ofs = raw_output_->ByteCount(); + + // write central directory + io::CodedOutputStream output(raw_output_); + for (int i = 0; i < num_entries; ++i) { + const string &filename = files_[i].name; + uint16 filename_size = filename.size(); + uint32 crc32 = files_[i].crc32; + uint32 size = files_[i].size; + uint32 offset = files_[i].offset; + + output.WriteLittleEndian32(0x02014b50); // magic + WriteShort(&output, 10); // version made by + WriteShort(&output, 10); // version needed to extract + WriteShort(&output, 0); // flags + WriteShort(&output, 0); // compression method: stored + WriteShort(&output, 0); // last modified time + WriteShort(&output, 0); // last modified date + output.WriteLittleEndian32(crc32); // crc-32 + output.WriteLittleEndian32(size); // compressed size + output.WriteLittleEndian32(size); // uncompressed size + WriteShort(&output, filename_size); // file name length + WriteShort(&output, 0); // extra field length + WriteShort(&output, 0); // file comment length + WriteShort(&output, 0); // starting disk number + WriteShort(&output, 0); // internal file attributes + output.WriteLittleEndian32(0); // external file attributes + output.WriteLittleEndian32(offset); // local header offset + output.WriteString(filename); // file name + } + uint32 dir_len = output.ByteCount(); + + // write end of central directory marker + output.WriteLittleEndian32(0x06054b50); // magic + WriteShort(&output, 0); // disk number + WriteShort(&output, 0); // disk with start of central directory + WriteShort(&output, num_entries); // central directory entries (this disk) + WriteShort(&output, num_entries); // central directory entries (total) + output.WriteLittleEndian32(dir_len); // central directory byte size + output.WriteLittleEndian32(dir_ofs); // central directory offset + WriteShort(&output, 0); // comment length + + return output.HadError(); +} + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h new file mode 100644 index 000000000..be73972a6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h @@ -0,0 +1,93 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace compiler { + +class ZipWriter { + public: + ZipWriter(io::ZeroCopyOutputStream* raw_output); + ~ZipWriter(); + + bool Write(const string& filename, const string& contents); + bool WriteDirectory(); + + private: + struct FileInfo { + string name; + uint32 offset; + uint32 size; + uint32 crc32; + }; + + io::ZeroCopyOutputStream* raw_output_; + vector files_; +}; + +} // namespace compiler +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc new file mode 100644 index 000000000..754b56283 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc @@ -0,0 +1,4497 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#undef PACKAGE // autoheader #defines this. :( + +namespace google { +namespace protobuf { + +const FieldDescriptor::CppType +FieldDescriptor::kTypeToCppTypeMap[MAX_TYPE + 1] = { + static_cast(0), // 0 is reserved for errors + + CPPTYPE_DOUBLE, // TYPE_DOUBLE + CPPTYPE_FLOAT, // TYPE_FLOAT + CPPTYPE_INT64, // TYPE_INT64 + CPPTYPE_UINT64, // TYPE_UINT64 + CPPTYPE_INT32, // TYPE_INT32 + CPPTYPE_UINT64, // TYPE_FIXED64 + CPPTYPE_UINT32, // TYPE_FIXED32 + CPPTYPE_BOOL, // TYPE_BOOL + CPPTYPE_STRING, // TYPE_STRING + CPPTYPE_MESSAGE, // TYPE_GROUP + CPPTYPE_MESSAGE, // TYPE_MESSAGE + CPPTYPE_STRING, // TYPE_BYTES + CPPTYPE_UINT32, // TYPE_UINT32 + CPPTYPE_ENUM, // TYPE_ENUM + CPPTYPE_INT32, // TYPE_SFIXED32 + CPPTYPE_INT64, // TYPE_SFIXED64 + CPPTYPE_INT32, // TYPE_SINT32 + CPPTYPE_INT64, // TYPE_SINT64 +}; + +const char * const FieldDescriptor::kTypeToName[MAX_TYPE + 1] = { + "ERROR", // 0 is reserved for errors + + "double", // TYPE_DOUBLE + "float", // TYPE_FLOAT + "int64", // TYPE_INT64 + "uint64", // TYPE_UINT64 + "int32", // TYPE_INT32 + "fixed64", // TYPE_FIXED64 + "fixed32", // TYPE_FIXED32 + "bool", // TYPE_BOOL + "string", // TYPE_STRING + "group", // TYPE_GROUP + "message", // TYPE_MESSAGE + "bytes", // TYPE_BYTES + "uint32", // TYPE_UINT32 + "enum", // TYPE_ENUM + "sfixed32", // TYPE_SFIXED32 + "sfixed64", // TYPE_SFIXED64 + "sint32", // TYPE_SINT32 + "sint64", // TYPE_SINT64 +}; + +const char * const FieldDescriptor::kLabelToName[MAX_LABEL + 1] = { + "ERROR", // 0 is reserved for errors + + "optional", // LABEL_OPTIONAL + "required", // LABEL_REQUIRED + "repeated", // LABEL_REPEATED +}; + +#ifndef _MSC_VER // MSVC doesn't need these and won't even accept them. +const int FieldDescriptor::kMaxNumber; +const int FieldDescriptor::kFirstReservedNumber; +const int FieldDescriptor::kLastReservedNumber; +#endif + +namespace { + +const string kEmptyString; + +string ToCamelCase(const string& input) { + bool capitalize_next = false; + string result; + result.reserve(input.size()); + + for (int i = 0; i < input.size(); i++) { + if (input[i] == '_') { + capitalize_next = true; + } else if (capitalize_next) { + // Note: I distrust ctype.h due to locales. + if ('a' <= input[i] && input[i] <= 'z') { + result.push_back(input[i] - 'a' + 'A'); + } else { + result.push_back(input[i]); + } + capitalize_next = false; + } else { + result.push_back(input[i]); + } + } + + // Lower-case the first letter. + if (!result.empty() && 'A' <= result[0] && result[0] <= 'Z') { + result[0] = result[0] - 'A' + 'a'; + } + + return result; +} + +// A DescriptorPool contains a bunch of hash_maps to implement the +// various Find*By*() methods. Since hashtable lookups are O(1), it's +// most efficient to construct a fixed set of large hash_maps used by +// all objects in the pool rather than construct one or more small +// hash_maps for each object. +// +// The keys to these hash_maps are (parent, name) or (parent, number) +// pairs. Unfortunately STL doesn't provide hash functions for pair<>, +// so we must invent our own. +// +// TODO(kenton): Use StringPiece rather than const char* in keys? It would +// be a lot cleaner but we'd just have to convert it back to const char* +// for the open source release. + +typedef pair PointerStringPair; + +struct PointerStringPairEqual { + inline bool operator()(const PointerStringPair& a, + const PointerStringPair& b) const { + return a.first == b.first && strcmp(a.second, b.second) == 0; + } +}; + +template +struct PointerIntegerPairHash { + size_t operator()(const PairType& p) const { + // FIXME(kenton): What is the best way to compute this hash? I have + // no idea! This seems a bit better than an XOR. + return reinterpret_cast(p.first) * ((1 << 16) - 1) + p.second; + } + + // Used only by MSVC and platforms where hash_map is not available. + static const size_t bucket_size = 4; + static const size_t min_buckets = 8; + inline bool operator()(const PairType& a, const PairType& b) const { + return a.first < b.first || + (a.first == b.first && a.second < b.second); + } +}; + +typedef pair DescriptorIntPair; +typedef pair EnumIntPair; + +struct PointerStringPairHash { + size_t operator()(const PointerStringPair& p) const { + // FIXME(kenton): What is the best way to compute this hash? I have + // no idea! This seems a bit better than an XOR. + hash cstring_hash; + return reinterpret_cast(p.first) * ((1 << 16) - 1) + + cstring_hash(p.second); + } + + // Used only by MSVC and platforms where hash_map is not available. + static const size_t bucket_size = 4; + static const size_t min_buckets = 8; + inline bool operator()(const PointerStringPair& a, + const PointerStringPair& b) const { + if (a.first < b.first) return true; + if (a.first > b.first) return false; + return strcmp(a.second, b.second) < 0; + } +}; + + +struct Symbol { + enum Type { + NULL_SYMBOL, MESSAGE, FIELD, ENUM, ENUM_VALUE, SERVICE, METHOD, PACKAGE + }; + Type type; + union { + const Descriptor* descriptor; + const FieldDescriptor* field_descriptor; + const EnumDescriptor* enum_descriptor; + const EnumValueDescriptor* enum_value_descriptor; + const ServiceDescriptor* service_descriptor; + const MethodDescriptor* method_descriptor; + const FileDescriptor* package_file_descriptor; + }; + + inline Symbol() : type(NULL_SYMBOL) { descriptor = NULL; } + inline bool IsNull() const { return type == NULL_SYMBOL; } + inline bool IsType() const { + return type == MESSAGE || type == ENUM; + } + inline bool IsAggregate() const { + return type == MESSAGE || type == PACKAGE + || type == ENUM || type == SERVICE; + } + +#define CONSTRUCTOR(TYPE, TYPE_CONSTANT, FIELD) \ + inline explicit Symbol(const TYPE* value) { \ + type = TYPE_CONSTANT; \ + this->FIELD = value; \ + } + + CONSTRUCTOR(Descriptor , MESSAGE , descriptor ) + CONSTRUCTOR(FieldDescriptor , FIELD , field_descriptor ) + CONSTRUCTOR(EnumDescriptor , ENUM , enum_descriptor ) + CONSTRUCTOR(EnumValueDescriptor, ENUM_VALUE, enum_value_descriptor ) + CONSTRUCTOR(ServiceDescriptor , SERVICE , service_descriptor ) + CONSTRUCTOR(MethodDescriptor , METHOD , method_descriptor ) + CONSTRUCTOR(FileDescriptor , PACKAGE , package_file_descriptor) +#undef CONSTRUCTOR + + const FileDescriptor* GetFile() const { + switch (type) { + case NULL_SYMBOL: return NULL; + case MESSAGE : return descriptor ->file(); + case FIELD : return field_descriptor ->file(); + case ENUM : return enum_descriptor ->file(); + case ENUM_VALUE : return enum_value_descriptor->type()->file(); + case SERVICE : return service_descriptor ->file(); + case METHOD : return method_descriptor ->service()->file(); + case PACKAGE : return package_file_descriptor; + } + return NULL; + } +}; + +const Symbol kNullSymbol; + +typedef hash_map, streq> + SymbolsByNameMap; +typedef hash_map + SymbolsByParentMap; +typedef hash_map, streq> + FilesByNameMap; +typedef hash_map + FieldsByNameMap; +typedef hash_map > + FieldsByNumberMap; +typedef hash_map > + EnumValuesByNumberMap; +// This is a map rather than a hash_map, since we use it to iterate +// through all the extensions that extend a given Descriptor, and an +// ordered data structure that implements lower_bound is convenient +// for that. +typedef map + ExtensionsGroupedByDescriptorMap; + +} // anonymous namespace + +// =================================================================== +// DescriptorPool::Tables + +class DescriptorPool::Tables { + public: + Tables(); + ~Tables(); + + // Checkpoint the state of the tables. Future calls to Rollback() will + // return the Tables to this state. This is used when building files, since + // some kinds of validation errors cannot be detected until the file's + // descriptors have already been added to the tables. BuildFile() calls + // Checkpoint() before it starts building and Rollback() if it encounters + // an error. + void Checkpoint(); + + // Roll back the Tables to the state of the last Checkpoint(), removing + // everything that was added after that point. + void Rollback(); + + // The stack of files which are currently being built. Used to detect + // cyclic dependencies when loading files from a DescriptorDatabase. Not + // used when fallback_database_ == NULL. + vector pending_files_; + + // A set of files which we have tried to load from the fallback database + // and encountered errors. We will not attempt to load them again. + // Not used when fallback_database_ == NULL. + hash_set known_bad_files_; + + // The set of descriptors for which we've already loaded the full + // set of extensions numbers from fallback_database_. + hash_set extensions_loaded_from_db_; + + // ----------------------------------------------------------------- + // Finding items. + + // Find symbols. This returns a null Symbol (symbol.IsNull() is true) + // if not found. + inline Symbol FindSymbol(const string& key) const; + + // This implements the body of DescriptorPool::Find*ByName(). It should + // really be a private method of DescriptorPool, but that would require + // declaring Symbol in descriptor.h, which would drag all kinds of other + // stuff into the header. Yay C++. + Symbol FindByNameHelper( + const DescriptorPool* pool, const string& name) const; + + // These return NULL if not found. + inline const FileDescriptor* FindFile(const string& key) const; + inline const FieldDescriptor* FindExtension(const Descriptor* extendee, + int number); + inline void FindAllExtensions(const Descriptor* extendee, + vector* out) const; + + // ----------------------------------------------------------------- + // Adding items. + + // These add items to the corresponding tables. They return false if + // the key already exists in the table. For AddSymbol(), the string passed + // in must be one that was constructed using AllocateString(), as it will + // be used as a key in the symbols_by_name_ map without copying. + bool AddSymbol(const string& full_name, Symbol symbol); + bool AddFile(const FileDescriptor* file); + bool AddExtension(const FieldDescriptor* field); + + // ----------------------------------------------------------------- + // Allocating memory. + + // Allocate an object which will be reclaimed when the pool is + // destroyed. Note that the object's destructor will never be called, + // so its fields must be plain old data (primitive data types and + // pointers). All of the descriptor types are such objects. + template Type* Allocate(); + + // Allocate an array of objects which will be reclaimed when the + // pool in destroyed. Again, destructors are never called. + template Type* AllocateArray(int count); + + // Allocate a string which will be destroyed when the pool is destroyed. + // The string is initialized to the given value for convenience. + string* AllocateString(const string& value); + + // Allocate a protocol message object. Some older versions of GCC have + // trouble understanding explicit template instantiations in some cases, so + // in those cases we have to pass a dummy pointer of the right type as the + // parameter instead of specifying the type explicitly. + template Type* AllocateMessage(Type* dummy = NULL); + + // Allocate a FileDescriptorTables object. + FileDescriptorTables* AllocateFileTables(); + + private: + vector strings_; // All strings in the pool. + vector messages_; // All messages in the pool. + vector file_tables_; // All file tables in the pool. + vector allocations_; // All other memory allocated in the pool. + + SymbolsByNameMap symbols_by_name_; + FilesByNameMap files_by_name_; + ExtensionsGroupedByDescriptorMap extensions_; + + int strings_before_checkpoint_; + int messages_before_checkpoint_; + int file_tables_before_checkpoint_; + int allocations_before_checkpoint_; + vector symbols_after_checkpoint_; + vector files_after_checkpoint_; + vector extensions_after_checkpoint_; + + // Allocate some bytes which will be reclaimed when the pool is + // destroyed. + void* AllocateBytes(int size); +}; + +// Contains tables specific to a particular file. These tables are not +// modified once the file has been constructed, so they need not be +// protected by a mutex. This makes operations that depend only on the +// contents of a single file -- e.g. Descriptor::FindFieldByName() -- +// lock-free. +// +// For historical reasons, the definitions of the methods of +// FileDescriptorTables and DescriptorPool::Tables are interleaved below. +// These used to be a single class. +class FileDescriptorTables { + public: + FileDescriptorTables(); + ~FileDescriptorTables(); + + // Empty table, used with placeholder files. + static const FileDescriptorTables kEmpty; + + // ----------------------------------------------------------------- + // Finding items. + + // Find symbols. These return a null Symbol (symbol.IsNull() is true) + // if not found. + inline Symbol FindNestedSymbol(const void* parent, + const string& name) const; + inline Symbol FindNestedSymbolOfType(const void* parent, + const string& name, + const Symbol::Type type) const; + + // These return NULL if not found. + inline const FieldDescriptor* FindFieldByNumber( + const Descriptor* parent, int number) const; + inline const FieldDescriptor* FindFieldByLowercaseName( + const void* parent, const string& lowercase_name) const; + inline const FieldDescriptor* FindFieldByCamelcaseName( + const void* parent, const string& camelcase_name) const; + inline const EnumValueDescriptor* FindEnumValueByNumber( + const EnumDescriptor* parent, int number) const; + + // ----------------------------------------------------------------- + // Adding items. + + // These add items to the corresponding tables. They return false if + // the key already exists in the table. For AddAliasUnderParent(), the + // string passed in must be one that was constructed using AllocateString(), + // as it will be used as a key in the symbols_by_parent_ map without copying. + bool AddAliasUnderParent(const void* parent, const string& name, + Symbol symbol); + bool AddFieldByNumber(const FieldDescriptor* field); + bool AddEnumValueByNumber(const EnumValueDescriptor* value); + + // Adds the field to the lowercase_name and camelcase_name maps. Never + // fails because we allow duplicates; the first field by the name wins. + void AddFieldByStylizedNames(const FieldDescriptor* field); + + private: + SymbolsByParentMap symbols_by_parent_; + FieldsByNameMap fields_by_lowercase_name_; + FieldsByNameMap fields_by_camelcase_name_; + FieldsByNumberMap fields_by_number_; // Not including extensions. + EnumValuesByNumberMap enum_values_by_number_; +}; + +DescriptorPool::Tables::Tables() + : strings_before_checkpoint_(0), + messages_before_checkpoint_(0), + allocations_before_checkpoint_(0) {} + +DescriptorPool::Tables::~Tables() { + // Note that the deletion order is important, since the destructors of some + // messages may refer to objects in allocations_. + STLDeleteElements(&messages_); + for (int i = 0; i < allocations_.size(); i++) { + operator delete(allocations_[i]); + } + STLDeleteElements(&strings_); + STLDeleteElements(&file_tables_); +} + +FileDescriptorTables::FileDescriptorTables() {} +FileDescriptorTables::~FileDescriptorTables() {} + +const FileDescriptorTables FileDescriptorTables::kEmpty; + +void DescriptorPool::Tables::Checkpoint() { + strings_before_checkpoint_ = strings_.size(); + messages_before_checkpoint_ = messages_.size(); + file_tables_before_checkpoint_ = file_tables_.size(); + allocations_before_checkpoint_ = allocations_.size(); + + symbols_after_checkpoint_.clear(); + files_after_checkpoint_.clear(); + extensions_after_checkpoint_.clear(); +} + +void DescriptorPool::Tables::Rollback() { + for (int i = 0; i < symbols_after_checkpoint_.size(); i++) { + symbols_by_name_.erase(symbols_after_checkpoint_[i]); + } + for (int i = 0; i < files_after_checkpoint_.size(); i++) { + files_by_name_.erase(files_after_checkpoint_[i]); + } + for (int i = 0; i < extensions_after_checkpoint_.size(); i++) { + extensions_.erase(extensions_after_checkpoint_[i]); + } + + symbols_after_checkpoint_.clear(); + files_after_checkpoint_.clear(); + extensions_after_checkpoint_.clear(); + + STLDeleteContainerPointers( + strings_.begin() + strings_before_checkpoint_, strings_.end()); + STLDeleteContainerPointers( + messages_.begin() + messages_before_checkpoint_, messages_.end()); + STLDeleteContainerPointers( + file_tables_.begin() + file_tables_before_checkpoint_, file_tables_.end()); + for (int i = allocations_before_checkpoint_; i < allocations_.size(); i++) { + operator delete(allocations_[i]); + } + + strings_.resize(strings_before_checkpoint_); + messages_.resize(messages_before_checkpoint_); + file_tables_.resize(file_tables_before_checkpoint_); + allocations_.resize(allocations_before_checkpoint_); +} + +// ------------------------------------------------------------------- + +inline Symbol DescriptorPool::Tables::FindSymbol(const string& key) const { + const Symbol* result = FindOrNull(symbols_by_name_, key.c_str()); + if (result == NULL) { + return kNullSymbol; + } else { + return *result; + } +} + +inline Symbol FileDescriptorTables::FindNestedSymbol( + const void* parent, const string& name) const { + const Symbol* result = + FindOrNull(symbols_by_parent_, PointerStringPair(parent, name.c_str())); + if (result == NULL) { + return kNullSymbol; + } else { + return *result; + } +} + +inline Symbol FileDescriptorTables::FindNestedSymbolOfType( + const void* parent, const string& name, const Symbol::Type type) const { + Symbol result = FindNestedSymbol(parent, name); + if (result.type != type) return kNullSymbol; + return result; +} + +Symbol DescriptorPool::Tables::FindByNameHelper( + const DescriptorPool* pool, const string& name) const { + MutexLockMaybe lock(pool->mutex_); + Symbol result = FindSymbol(name); + + if (result.IsNull() && pool->underlay_ != NULL) { + // Symbol not found; check the underlay. + result = + pool->underlay_->tables_->FindByNameHelper(pool->underlay_, name); + } + + if (result.IsNull()) { + // Symbol still not found, so check fallback database. + if (pool->TryFindSymbolInFallbackDatabase(name)) { + result = FindSymbol(name); + } + } + + return result; +} + +inline const FileDescriptor* DescriptorPool::Tables::FindFile( + const string& key) const { + return FindPtrOrNull(files_by_name_, key.c_str()); +} + +inline const FieldDescriptor* FileDescriptorTables::FindFieldByNumber( + const Descriptor* parent, int number) const { + return FindPtrOrNull(fields_by_number_, make_pair(parent, number)); +} + +inline const FieldDescriptor* FileDescriptorTables::FindFieldByLowercaseName( + const void* parent, const string& lowercase_name) const { + return FindPtrOrNull(fields_by_lowercase_name_, + PointerStringPair(parent, lowercase_name.c_str())); +} + +inline const FieldDescriptor* FileDescriptorTables::FindFieldByCamelcaseName( + const void* parent, const string& camelcase_name) const { + return FindPtrOrNull(fields_by_camelcase_name_, + PointerStringPair(parent, camelcase_name.c_str())); +} + +inline const EnumValueDescriptor* FileDescriptorTables::FindEnumValueByNumber( + const EnumDescriptor* parent, int number) const { + return FindPtrOrNull(enum_values_by_number_, make_pair(parent, number)); +} + +inline const FieldDescriptor* DescriptorPool::Tables::FindExtension( + const Descriptor* extendee, int number) { + return FindPtrOrNull(extensions_, make_pair(extendee, number)); +} + +inline void DescriptorPool::Tables::FindAllExtensions( + const Descriptor* extendee, vector* out) const { + ExtensionsGroupedByDescriptorMap::const_iterator it = + extensions_.lower_bound(make_pair(extendee, 0)); + for (; it != extensions_.end() && it->first.first == extendee; ++it) { + out->push_back(it->second); + } +} + +// ------------------------------------------------------------------- + +bool DescriptorPool::Tables::AddSymbol( + const string& full_name, Symbol symbol) { + if (InsertIfNotPresent(&symbols_by_name_, full_name.c_str(), symbol)) { + symbols_after_checkpoint_.push_back(full_name.c_str()); + return true; + } else { + return false; + } +} + +bool FileDescriptorTables::AddAliasUnderParent( + const void* parent, const string& name, Symbol symbol) { + PointerStringPair by_parent_key(parent, name.c_str()); + return InsertIfNotPresent(&symbols_by_parent_, by_parent_key, symbol); +} + +bool DescriptorPool::Tables::AddFile(const FileDescriptor* file) { + if (InsertIfNotPresent(&files_by_name_, file->name().c_str(), file)) { + files_after_checkpoint_.push_back(file->name().c_str()); + return true; + } else { + return false; + } +} + +void FileDescriptorTables::AddFieldByStylizedNames( + const FieldDescriptor* field) { + const void* parent; + if (field->is_extension()) { + if (field->extension_scope() == NULL) { + parent = field->file(); + } else { + parent = field->extension_scope(); + } + } else { + parent = field->containing_type(); + } + + PointerStringPair lowercase_key(parent, field->lowercase_name().c_str()); + InsertIfNotPresent(&fields_by_lowercase_name_, lowercase_key, field); + + PointerStringPair camelcase_key(parent, field->camelcase_name().c_str()); + InsertIfNotPresent(&fields_by_camelcase_name_, camelcase_key, field); +} + +bool FileDescriptorTables::AddFieldByNumber(const FieldDescriptor* field) { + DescriptorIntPair key(field->containing_type(), field->number()); + return InsertIfNotPresent(&fields_by_number_, key, field); +} + +bool FileDescriptorTables::AddEnumValueByNumber( + const EnumValueDescriptor* value) { + EnumIntPair key(value->type(), value->number()); + return InsertIfNotPresent(&enum_values_by_number_, key, value); +} + +bool DescriptorPool::Tables::AddExtension(const FieldDescriptor* field) { + DescriptorIntPair key(field->containing_type(), field->number()); + if (InsertIfNotPresent(&extensions_, key, field)) { + extensions_after_checkpoint_.push_back(key); + return true; + } else { + return false; + } +} + +// ------------------------------------------------------------------- + +template +Type* DescriptorPool::Tables::Allocate() { + return reinterpret_cast(AllocateBytes(sizeof(Type))); +} + +template +Type* DescriptorPool::Tables::AllocateArray(int count) { + return reinterpret_cast(AllocateBytes(sizeof(Type) * count)); +} + +string* DescriptorPool::Tables::AllocateString(const string& value) { + string* result = new string(value); + strings_.push_back(result); + return result; +} + +template +Type* DescriptorPool::Tables::AllocateMessage(Type* dummy) { + Type* result = new Type; + messages_.push_back(result); + return result; +} + +FileDescriptorTables* DescriptorPool::Tables::AllocateFileTables() { + FileDescriptorTables* result = new FileDescriptorTables; + file_tables_.push_back(result); + return result; +} + +void* DescriptorPool::Tables::AllocateBytes(int size) { + // TODO(kenton): Would it be worthwhile to implement this in some more + // sophisticated way? Probably not for the open source release, but for + // internal use we could easily plug in one of our existing memory pool + // allocators... + if (size == 0) return NULL; + + void* result = operator new(size); + allocations_.push_back(result); + return result; +} + +// =================================================================== +// DescriptorPool + +DescriptorPool::ErrorCollector::~ErrorCollector() {} + +DescriptorPool::DescriptorPool() + : mutex_(NULL), + fallback_database_(NULL), + default_error_collector_(NULL), + underlay_(NULL), + tables_(new Tables), + enforce_dependencies_(true), + allow_unknown_(false) {} + +DescriptorPool::DescriptorPool(DescriptorDatabase* fallback_database, + ErrorCollector* error_collector) + : mutex_(new Mutex), + fallback_database_(fallback_database), + default_error_collector_(error_collector), + underlay_(NULL), + tables_(new Tables), + enforce_dependencies_(true), + allow_unknown_(false) { +} + +DescriptorPool::DescriptorPool(const DescriptorPool* underlay) + : mutex_(NULL), + fallback_database_(NULL), + default_error_collector_(NULL), + underlay_(underlay), + tables_(new Tables), + enforce_dependencies_(true), + allow_unknown_(false) {} + +DescriptorPool::~DescriptorPool() { + if (mutex_ != NULL) delete mutex_; +} + +// DescriptorPool::BuildFile() defined later. +// DescriptorPool::BuildFileCollectingErrors() defined later. + +void DescriptorPool::InternalDontEnforceDependencies() { + enforce_dependencies_ = false; +} + +bool DescriptorPool::InternalIsFileLoaded(const string& filename) const { + MutexLockMaybe lock(mutex_); + return tables_->FindFile(filename) != NULL; +} + +// generated_pool ==================================================== + +namespace { + + +EncodedDescriptorDatabase* generated_database_ = NULL; +DescriptorPool* generated_pool_ = NULL; +GOOGLE_PROTOBUF_DECLARE_ONCE(generated_pool_init_); + +void DeleteGeneratedPool() { + delete generated_database_; + generated_database_ = NULL; + delete generated_pool_; + generated_pool_ = NULL; +} + +void InitGeneratedPool() { + generated_database_ = new EncodedDescriptorDatabase; + generated_pool_ = new DescriptorPool(generated_database_); + + internal::OnShutdown(&DeleteGeneratedPool); +} + +inline void InitGeneratedPoolOnce() { + ::google::protobuf::GoogleOnceInit(&generated_pool_init_, &InitGeneratedPool); +} + +} // anonymous namespace + +const DescriptorPool* DescriptorPool::generated_pool() { + InitGeneratedPoolOnce(); + return generated_pool_; +} + +DescriptorPool* DescriptorPool::internal_generated_pool() { + InitGeneratedPoolOnce(); + return generated_pool_; +} + +void DescriptorPool::InternalAddGeneratedFile( + const void* encoded_file_descriptor, int size) { + // So, this function is called in the process of initializing the + // descriptors for generated proto classes. Each generated .pb.cc file + // has an internal procedure called AddDescriptors() which is called at + // process startup, and that function calls this one in order to register + // the raw bytes of the FileDescriptorProto representing the file. + // + // We do not actually construct the descriptor objects right away. We just + // hang on to the bytes until they are actually needed. We actually construct + // the descriptor the first time one of the following things happens: + // * Someone calls a method like descriptor(), GetDescriptor(), or + // GetReflection() on the generated types, which requires returning the + // descriptor or an object based on it. + // * Someone looks up the descriptor in DescriptorPool::generated_pool(). + // + // Once one of these happens, the DescriptorPool actually parses the + // FileDescriptorProto and generates a FileDescriptor (and all its children) + // based on it. + // + // Note that FileDescriptorProto is itself a generated protocol message. + // Therefore, when we parse one, we have to be very careful to avoid using + // any descriptor-based operations, since this might cause infinite recursion + // or deadlock. + InitGeneratedPoolOnce(); + GOOGLE_CHECK(generated_database_->Add(encoded_file_descriptor, size)); +} + + +// Find*By* methods ================================================== + +// TODO(kenton): There's a lot of repeated code here, but I'm not sure if +// there's any good way to factor it out. Think about this some time when +// there's nothing more important to do (read: never). + +const FileDescriptor* DescriptorPool::FindFileByName(const string& name) const { + MutexLockMaybe lock(mutex_); + const FileDescriptor* result = tables_->FindFile(name); + if (result != NULL) return result; + if (underlay_ != NULL) { + const FileDescriptor* result = underlay_->FindFileByName(name); + if (result != NULL) return result; + } + if (TryFindFileInFallbackDatabase(name)) { + const FileDescriptor* result = tables_->FindFile(name); + if (result != NULL) return result; + } + return NULL; +} + +const FileDescriptor* DescriptorPool::FindFileContainingSymbol( + const string& symbol_name) const { + MutexLockMaybe lock(mutex_); + Symbol result = tables_->FindSymbol(symbol_name); + if (!result.IsNull()) return result.GetFile(); + if (underlay_ != NULL) { + const FileDescriptor* result = + underlay_->FindFileContainingSymbol(symbol_name); + if (result != NULL) return result; + } + if (TryFindSymbolInFallbackDatabase(symbol_name)) { + Symbol result = tables_->FindSymbol(symbol_name); + if (!result.IsNull()) return result.GetFile(); + } + return NULL; +} + +const Descriptor* DescriptorPool::FindMessageTypeByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::MESSAGE) ? result.descriptor : NULL; +} + +const FieldDescriptor* DescriptorPool::FindFieldByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + if (result.type == Symbol::FIELD && + !result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* DescriptorPool::FindExtensionByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + if (result.type == Symbol::FIELD && + result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const EnumDescriptor* DescriptorPool::FindEnumTypeByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::ENUM) ? result.enum_descriptor : NULL; +} + +const EnumValueDescriptor* DescriptorPool::FindEnumValueByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::ENUM_VALUE) ? + result.enum_value_descriptor : NULL; +} + +const ServiceDescriptor* DescriptorPool::FindServiceByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::SERVICE) ? result.service_descriptor : NULL; +} + +const MethodDescriptor* DescriptorPool::FindMethodByName( + const string& name) const { + Symbol result = tables_->FindByNameHelper(this, name); + return (result.type == Symbol::METHOD) ? result.method_descriptor : NULL; +} + +const FieldDescriptor* DescriptorPool::FindExtensionByNumber( + const Descriptor* extendee, int number) const { + MutexLockMaybe lock(mutex_); + const FieldDescriptor* result = tables_->FindExtension(extendee, number); + if (result != NULL) { + return result; + } + if (underlay_ != NULL) { + const FieldDescriptor* result = + underlay_->FindExtensionByNumber(extendee, number); + if (result != NULL) return result; + } + if (TryFindExtensionInFallbackDatabase(extendee, number)) { + const FieldDescriptor* result = tables_->FindExtension(extendee, number); + if (result != NULL) { + return result; + } + } + return NULL; +} + +void DescriptorPool::FindAllExtensions( + const Descriptor* extendee, vector* out) const { + MutexLockMaybe lock(mutex_); + + // Initialize tables_->extensions_ from the fallback database first + // (but do this only once per descriptor). + if (fallback_database_ != NULL && + tables_->extensions_loaded_from_db_.count(extendee) == 0) { + vector numbers; + if (fallback_database_->FindAllExtensionNumbers(extendee->full_name(), + &numbers)) { + for (int i = 0; i < numbers.size(); ++i) { + int number = numbers[i]; + if (tables_->FindExtension(extendee, number) == NULL) { + TryFindExtensionInFallbackDatabase(extendee, number); + } + } + tables_->extensions_loaded_from_db_.insert(extendee); + } + } + + tables_->FindAllExtensions(extendee, out); + if (underlay_ != NULL) { + underlay_->FindAllExtensions(extendee, out); + } +} + +// ------------------------------------------------------------------- + +const FieldDescriptor* +Descriptor::FindFieldByNumber(int key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByNumber(this, key); + if (result == NULL || result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindFieldByLowercaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByLowercaseName(this, key); + if (result == NULL || result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindFieldByCamelcaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByCamelcaseName(this, key); + if (result == NULL || result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindFieldByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); + if (!result.IsNull() && !result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +Descriptor::FindExtensionByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); + if (!result.IsNull() && result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +Descriptor::FindExtensionByLowercaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByLowercaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +Descriptor::FindExtensionByCamelcaseName(const string& key) const { + const FieldDescriptor* result = + file()->tables_->FindFieldByCamelcaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const Descriptor* +Descriptor::FindNestedTypeByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE); + if (!result.IsNull()) { + return result.descriptor; + } else { + return NULL; + } +} + +const EnumDescriptor* +Descriptor::FindEnumTypeByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM); + if (!result.IsNull()) { + return result.enum_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +Descriptor::FindEnumValueByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); + if (!result.IsNull()) { + return result.enum_value_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +EnumDescriptor::FindValueByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); + if (!result.IsNull()) { + return result.enum_value_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +EnumDescriptor::FindValueByNumber(int key) const { + return file()->tables_->FindEnumValueByNumber(this, key); +} + +const MethodDescriptor* +ServiceDescriptor::FindMethodByName(const string& key) const { + Symbol result = + file()->tables_->FindNestedSymbolOfType(this, key, Symbol::METHOD); + if (!result.IsNull()) { + return result.method_descriptor; + } else { + return NULL; + } +} + +const Descriptor* +FileDescriptor::FindMessageTypeByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::MESSAGE); + if (!result.IsNull()) { + return result.descriptor; + } else { + return NULL; + } +} + +const EnumDescriptor* +FileDescriptor::FindEnumTypeByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM); + if (!result.IsNull()) { + return result.enum_descriptor; + } else { + return NULL; + } +} + +const EnumValueDescriptor* +FileDescriptor::FindEnumValueByName(const string& key) const { + Symbol result = + tables_->FindNestedSymbolOfType(this, key, Symbol::ENUM_VALUE); + if (!result.IsNull()) { + return result.enum_value_descriptor; + } else { + return NULL; + } +} + +const ServiceDescriptor* +FileDescriptor::FindServiceByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::SERVICE); + if (!result.IsNull()) { + return result.service_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +FileDescriptor::FindExtensionByName(const string& key) const { + Symbol result = tables_->FindNestedSymbolOfType(this, key, Symbol::FIELD); + if (!result.IsNull() && result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } +} + +const FieldDescriptor* +FileDescriptor::FindExtensionByLowercaseName(const string& key) const { + const FieldDescriptor* result = tables_->FindFieldByLowercaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +const FieldDescriptor* +FileDescriptor::FindExtensionByCamelcaseName(const string& key) const { + const FieldDescriptor* result = tables_->FindFieldByCamelcaseName(this, key); + if (result == NULL || !result->is_extension()) { + return NULL; + } else { + return result; + } +} + +bool Descriptor::IsExtensionNumber(int number) const { + // Linear search should be fine because we don't expect a message to have + // more than a couple extension ranges. + for (int i = 0; i < extension_range_count(); i++) { + if (number >= extension_range(i)->start && + number < extension_range(i)->end) { + return true; + } + } + return false; +} + +// ------------------------------------------------------------------- + +bool DescriptorPool::TryFindFileInFallbackDatabase(const string& name) const { + if (fallback_database_ == NULL) return false; + + if (tables_->known_bad_files_.count(name) > 0) return false; + + FileDescriptorProto file_proto; + if (!fallback_database_->FindFileByName(name, &file_proto) || + BuildFileFromDatabase(file_proto) == NULL) { + tables_->known_bad_files_.insert(name); + return false; + } + + return true; +} + +bool DescriptorPool::TryFindSymbolInFallbackDatabase(const string& name) const { + if (fallback_database_ == NULL) return false; + + FileDescriptorProto file_proto; + if (!fallback_database_->FindFileContainingSymbol(name, &file_proto)) { + return false; + } + + if (tables_->FindFile(file_proto.name()) != NULL) { + // We've already loaded this file, and it apparently doesn't contain the + // symbol we're looking for. Some DescriptorDatabases return false + // positives. + return false; + } + + if (BuildFileFromDatabase(file_proto) == NULL) { + return false; + } + + return true; +} + +bool DescriptorPool::TryFindExtensionInFallbackDatabase( + const Descriptor* containing_type, int field_number) const { + if (fallback_database_ == NULL) return false; + + FileDescriptorProto file_proto; + if (!fallback_database_->FindFileContainingExtension( + containing_type->full_name(), field_number, &file_proto)) { + return false; + } + + if (tables_->FindFile(file_proto.name()) != NULL) { + // We've already loaded this file, and it apparently doesn't contain the + // extension we're looking for. Some DescriptorDatabases return false + // positives. + return false; + } + + if (BuildFileFromDatabase(file_proto) == NULL) { + return false; + } + + return true; +} + +// =================================================================== + +string FieldDescriptor::DefaultValueAsString(bool quote_string_type) const { + GOOGLE_CHECK(has_default_value()) << "No default value"; + switch (cpp_type()) { + case CPPTYPE_INT32: + return SimpleItoa(default_value_int32()); + break; + case CPPTYPE_INT64: + return SimpleItoa(default_value_int64()); + break; + case CPPTYPE_UINT32: + return SimpleItoa(default_value_uint32()); + break; + case CPPTYPE_UINT64: + return SimpleItoa(default_value_uint64()); + break; + case CPPTYPE_FLOAT: + return SimpleFtoa(default_value_float()); + break; + case CPPTYPE_DOUBLE: + return SimpleDtoa(default_value_double()); + break; + case CPPTYPE_BOOL: + return default_value_bool() ? "true" : "false"; + break; + case CPPTYPE_STRING: + if (quote_string_type) { + return "\"" + CEscape(default_value_string()) + "\""; + } else { + if (type() == TYPE_BYTES) { + return CEscape(default_value_string()); + } else { + return default_value_string(); + } + } + break; + case CPPTYPE_ENUM: + return default_value_enum()->name(); + break; + case CPPTYPE_MESSAGE: + GOOGLE_LOG(DFATAL) << "Messages can't have default values!"; + break; + } + GOOGLE_LOG(FATAL) << "Can't get here: failed to get default value as string"; + return ""; +} + +// CopyTo methods ==================================================== + +void FileDescriptor::CopyTo(FileDescriptorProto* proto) const { + proto->set_name(name()); + if (!package().empty()) proto->set_package(package()); + + for (int i = 0; i < dependency_count(); i++) { + proto->add_dependency(dependency(i)->name()); + } + + for (int i = 0; i < message_type_count(); i++) { + message_type(i)->CopyTo(proto->add_message_type()); + } + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->CopyTo(proto->add_enum_type()); + } + for (int i = 0; i < service_count(); i++) { + service(i)->CopyTo(proto->add_service()); + } + for (int i = 0; i < extension_count(); i++) { + extension(i)->CopyTo(proto->add_extension()); + } + + if (&options() != &FileOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void Descriptor::CopyTo(DescriptorProto* proto) const { + proto->set_name(name()); + + for (int i = 0; i < field_count(); i++) { + field(i)->CopyTo(proto->add_field()); + } + for (int i = 0; i < nested_type_count(); i++) { + nested_type(i)->CopyTo(proto->add_nested_type()); + } + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->CopyTo(proto->add_enum_type()); + } + for (int i = 0; i < extension_range_count(); i++) { + DescriptorProto::ExtensionRange* range = proto->add_extension_range(); + range->set_start(extension_range(i)->start); + range->set_end(extension_range(i)->end); + } + for (int i = 0; i < extension_count(); i++) { + extension(i)->CopyTo(proto->add_extension()); + } + + if (&options() != &MessageOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void FieldDescriptor::CopyTo(FieldDescriptorProto* proto) const { + proto->set_name(name()); + proto->set_number(number()); + + // Some compilers do not allow static_cast directly between two enum types, + // so we must cast to int first. + proto->set_label(static_cast( + implicit_cast(label()))); + proto->set_type(static_cast( + implicit_cast(type()))); + + if (is_extension()) { + if (!containing_type()->is_unqualified_placeholder_) { + proto->set_extendee("."); + } + proto->mutable_extendee()->append(containing_type()->full_name()); + } + + if (cpp_type() == CPPTYPE_MESSAGE) { + if (message_type()->is_placeholder_) { + // We don't actually know if the type is a message type. It could be + // an enum. + proto->clear_type(); + } + + if (!message_type()->is_unqualified_placeholder_) { + proto->set_type_name("."); + } + proto->mutable_type_name()->append(message_type()->full_name()); + } else if (cpp_type() == CPPTYPE_ENUM) { + if (!enum_type()->is_unqualified_placeholder_) { + proto->set_type_name("."); + } + proto->mutable_type_name()->append(enum_type()->full_name()); + } + + if (has_default_value()) { + proto->set_default_value(DefaultValueAsString(false)); + } + + if (&options() != &FieldOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void EnumDescriptor::CopyTo(EnumDescriptorProto* proto) const { + proto->set_name(name()); + + for (int i = 0; i < value_count(); i++) { + value(i)->CopyTo(proto->add_value()); + } + + if (&options() != &EnumOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void EnumValueDescriptor::CopyTo(EnumValueDescriptorProto* proto) const { + proto->set_name(name()); + proto->set_number(number()); + + if (&options() != &EnumValueOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void ServiceDescriptor::CopyTo(ServiceDescriptorProto* proto) const { + proto->set_name(name()); + + for (int i = 0; i < method_count(); i++) { + method(i)->CopyTo(proto->add_method()); + } + + if (&options() != &ServiceOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +void MethodDescriptor::CopyTo(MethodDescriptorProto* proto) const { + proto->set_name(name()); + + if (!input_type()->is_unqualified_placeholder_) { + proto->set_input_type("."); + } + proto->mutable_input_type()->append(input_type()->full_name()); + + if (!output_type()->is_unqualified_placeholder_) { + proto->set_output_type("."); + } + proto->mutable_output_type()->append(output_type()->full_name()); + + if (&options() != &MethodOptions::default_instance()) { + proto->mutable_options()->CopyFrom(options()); + } +} + +// DebugString methods =============================================== + +namespace { + +// Used by each of the option formatters. +bool RetrieveOptions(const Message &options, vector *option_entries) { + option_entries->clear(); + const Reflection* reflection = options.GetReflection(); + vector fields; + reflection->ListFields(options, &fields); + for (int i = 0; i < fields.size(); i++) { + // Doesn't make sense to have message type fields here + if (fields[i]->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + continue; + } + int count = 1; + bool repeated = false; + if (fields[i]->is_repeated()) { + count = reflection->FieldSize(options, fields[i]); + repeated = true; + } + for (int j = 0; j < count; j++) { + string fieldval; + TextFormat::PrintFieldValueToString(options, fields[i], + repeated ? count : -1, &fieldval); + option_entries->push_back(fields[i]->name() + " = " + fieldval); + } + } + return !option_entries->empty(); +} + +// Formats options that all appear together in brackets. Does not include +// brackets. +bool FormatBracketedOptions(const Message &options, string *output) { + vector all_options; + if (RetrieveOptions(options, &all_options)) { + output->append(JoinStrings(all_options, ", ")); + } + return !all_options.empty(); +} + +// Formats options one per line +bool FormatLineOptions(int depth, const Message &options, string *output) { + string prefix(depth * 2, ' '); + vector all_options; + if (RetrieveOptions(options, &all_options)) { + for (int i = 0; i < all_options.size(); i++) { + strings::SubstituteAndAppend(output, "$0option $1;\n", + prefix, all_options[i]); + } + } + return !all_options.empty(); +} + +} // anonymous namespace + +string FileDescriptor::DebugString() const { + string contents = "syntax = \"proto2\";\n\n"; + + for (int i = 0; i < dependency_count(); i++) { + strings::SubstituteAndAppend(&contents, "import \"$0\";\n", + dependency(i)->name()); + } + + if (!package().empty()) { + strings::SubstituteAndAppend(&contents, "package $0;\n\n", package()); + } + + if (FormatLineOptions(0, options(), &contents)) { + contents.append("\n"); // add some space if we had options + } + + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->DebugString(0, &contents); + contents.append("\n"); + } + + // Find all the 'group' type extensions; we will not output their nested + // definitions (those will be done with their group field descriptor). + set groups; + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) { + groups.insert(extension(i)->message_type()); + } + } + + for (int i = 0; i < message_type_count(); i++) { + if (groups.count(message_type(i)) == 0) { + strings::SubstituteAndAppend(&contents, "message $0", + message_type(i)->name()); + message_type(i)->DebugString(0, &contents); + contents.append("\n"); + } + } + + for (int i = 0; i < service_count(); i++) { + service(i)->DebugString(&contents); + contents.append("\n"); + } + + const Descriptor* containing_type = NULL; + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->containing_type() != containing_type) { + if (i > 0) contents.append("}\n\n"); + containing_type = extension(i)->containing_type(); + strings::SubstituteAndAppend(&contents, "extend .$0 {\n", + containing_type->full_name()); + } + extension(i)->DebugString(1, &contents); + } + if (extension_count() > 0) contents.append("}\n\n"); + + return contents; +} + +string Descriptor::DebugString() const { + string contents; + strings::SubstituteAndAppend(&contents, "message $0", name()); + DebugString(0, &contents); + return contents; +} + +void Descriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + ++depth; + contents->append(" {\n"); + + FormatLineOptions(depth, options(), contents); + + // Find all the 'group' types for fields and extensions; we will not output + // their nested definitions (those will be done with their group field + // descriptor). + set groups; + for (int i = 0; i < field_count(); i++) { + if (field(i)->type() == FieldDescriptor::TYPE_GROUP) { + groups.insert(field(i)->message_type()); + } + } + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->type() == FieldDescriptor::TYPE_GROUP) { + groups.insert(extension(i)->message_type()); + } + } + + for (int i = 0; i < nested_type_count(); i++) { + if (groups.count(nested_type(i)) == 0) { + strings::SubstituteAndAppend(contents, "$0 message $1", + prefix, nested_type(i)->name()); + nested_type(i)->DebugString(depth, contents); + } + } + for (int i = 0; i < enum_type_count(); i++) { + enum_type(i)->DebugString(depth, contents); + } + for (int i = 0; i < field_count(); i++) { + field(i)->DebugString(depth, contents); + } + + for (int i = 0; i < extension_range_count(); i++) { + strings::SubstituteAndAppend(contents, "$0 extensions $1 to $2;\n", + prefix, + extension_range(i)->start, + extension_range(i)->end - 1); + } + + // Group extensions by what they extend, so they can be printed out together. + const Descriptor* containing_type = NULL; + for (int i = 0; i < extension_count(); i++) { + if (extension(i)->containing_type() != containing_type) { + if (i > 0) strings::SubstituteAndAppend(contents, "$0 }\n", prefix); + containing_type = extension(i)->containing_type(); + strings::SubstituteAndAppend(contents, "$0 extend .$1 {\n", + prefix, containing_type->full_name()); + } + extension(i)->DebugString(depth + 1, contents); + } + if (extension_count() > 0) + strings::SubstituteAndAppend(contents, "$0 }\n", prefix); + + strings::SubstituteAndAppend(contents, "$0}\n", prefix); +} + +string FieldDescriptor::DebugString() const { + string contents; + int depth = 0; + if (is_extension()) { + strings::SubstituteAndAppend(&contents, "extend .$0 {\n", + containing_type()->full_name()); + depth = 1; + } + DebugString(depth, &contents); + if (is_extension()) { + contents.append("}\n"); + } + return contents; +} + +void FieldDescriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + string field_type; + switch (type()) { + case TYPE_MESSAGE: + field_type = "." + message_type()->full_name(); + break; + case TYPE_ENUM: + field_type = "." + enum_type()->full_name(); + break; + default: + field_type = kTypeToName[type()]; + } + + strings::SubstituteAndAppend(contents, "$0$1 $2 $3 = $4", + prefix, + kLabelToName[label()], + field_type, + type() == TYPE_GROUP ? message_type()->name() : + name(), + number()); + + bool bracketed = false; + if (has_default_value()) { + bracketed = true; + strings::SubstituteAndAppend(contents, " [default = $0", + DefaultValueAsString(true)); + } + + string formatted_options; + if (FormatBracketedOptions(options(), &formatted_options)) { + contents->append(bracketed ? ", " : " ["); + bracketed = true; + contents->append(formatted_options); + } + + if (bracketed) { + contents->append("]"); + } + + if (type() == TYPE_GROUP) { + message_type()->DebugString(depth, contents); + } else { + contents->append(";\n"); + } +} + +string EnumDescriptor::DebugString() const { + string contents; + DebugString(0, &contents); + return contents; +} + +void EnumDescriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + ++depth; + strings::SubstituteAndAppend(contents, "$0enum $1 {\n", + prefix, name()); + + FormatLineOptions(depth, options(), contents); + + for (int i = 0; i < value_count(); i++) { + value(i)->DebugString(depth, contents); + } + strings::SubstituteAndAppend(contents, "$0}\n", prefix); +} + +string EnumValueDescriptor::DebugString() const { + string contents; + DebugString(0, &contents); + return contents; +} + +void EnumValueDescriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + strings::SubstituteAndAppend(contents, "$0$1 = $2", + prefix, name(), number()); + + string formatted_options; + if (FormatBracketedOptions(options(), &formatted_options)) { + strings::SubstituteAndAppend(contents, " [$0]", formatted_options); + } + contents->append(";\n"); +} + +string ServiceDescriptor::DebugString() const { + string contents; + DebugString(&contents); + return contents; +} + +void ServiceDescriptor::DebugString(string *contents) const { + strings::SubstituteAndAppend(contents, "service $0 {\n", name()); + + FormatLineOptions(1, options(), contents); + + for (int i = 0; i < method_count(); i++) { + method(i)->DebugString(1, contents); + } + + contents->append("}\n"); +} + +string MethodDescriptor::DebugString() const { + string contents; + DebugString(0, &contents); + return contents; +} + +void MethodDescriptor::DebugString(int depth, string *contents) const { + string prefix(depth * 2, ' '); + ++depth; + strings::SubstituteAndAppend(contents, "$0rpc $1(.$2) returns (.$3)", + prefix, name(), + input_type()->full_name(), + output_type()->full_name()); + + string formatted_options; + if (FormatLineOptions(depth, options(), &formatted_options)) { + strings::SubstituteAndAppend(contents, " {\n$0$1}\n", + formatted_options, prefix); + } else { + contents->append(";\n"); + } +} +// =================================================================== + +namespace { + +// Represents an options message to interpret. Extension names in the option +// name are respolved relative to name_scope. element_name and orig_opt are +// used only for error reporting (since the parser records locations against +// pointers in the original options, not the mutable copy). The Message must be +// one of the Options messages in descriptor.proto. +struct OptionsToInterpret { + OptionsToInterpret(const string& ns, + const string& el, + const Message* orig_opt, + Message* opt) + : name_scope(ns), + element_name(el), + original_options(orig_opt), + options(opt) { + } + string name_scope; + string element_name; + const Message* original_options; + Message* options; +}; + +} // namespace + +class DescriptorBuilder { + public: + DescriptorBuilder(const DescriptorPool* pool, + DescriptorPool::Tables* tables, + DescriptorPool::ErrorCollector* error_collector); + ~DescriptorBuilder(); + + const FileDescriptor* BuildFile(const FileDescriptorProto& proto); + + private: + friend class OptionInterpreter; + + const DescriptorPool* pool_; + DescriptorPool::Tables* tables_; // for convenience + DescriptorPool::ErrorCollector* error_collector_; + + // As we build descriptors we store copies of the options messages in + // them. We put pointers to those copies in this vector, as we build, so we + // can later (after cross-linking) interpret those options. + vector options_to_interpret_; + + bool had_errors_; + string filename_; + FileDescriptor* file_; + FileDescriptorTables* file_tables_; + + // If LookupSymbol() finds a symbol that is in a file which is not a declared + // dependency of this file, it will fail, but will set + // possible_undeclared_dependency_ to point at that file. This is only used + // by AddNotDefinedError() to report a more useful error message. + // possible_undeclared_dependency_name_ is the name of the symbol that was + // actually found in possible_undeclared_dependency_, which may be a parent + // of the symbol actually looked for. + const FileDescriptor* possible_undeclared_dependency_; + string possible_undeclared_dependency_name_; + + void AddError(const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& error); + + // Adds an error indicating that undefined_symbol was not defined. Must + // only be called after LookupSymbol() fails. + void AddNotDefinedError( + const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& undefined_symbol); + + // Silly helper which determines if the given file is in the given package. + // I.e., either file->package() == package_name or file->package() is a + // nested package within package_name. + bool IsInPackage(const FileDescriptor* file, const string& package_name); + + // Like tables_->FindSymbol(), but additionally: + // - Search the pool's underlay if not found in tables_. + // - Insure that the resulting Symbol is from one of the file's declared + // dependencies. + Symbol FindSymbol(const string& name); + + // Like FindSymbol() but does not require that the symbol is in one of the + // file's declared dependencies. + Symbol FindSymbolNotEnforcingDeps(const string& name); + + // Like FindSymbol(), but looks up the name relative to some other symbol + // name. This first searches siblings of relative_to, then siblings of its + // parents, etc. For example, LookupSymbol("foo.bar", "baz.qux.corge") makes + // the following calls, returning the first non-null result: + // FindSymbol("baz.qux.foo.bar"), FindSymbol("baz.foo.bar"), + // FindSymbol("foo.bar"). If AllowUnknownDependencies() has been called + // on the DescriptorPool, this will generate a placeholder type if + // the name is not found (unless the name itself is malformed). The + // placeholder_type parameter indicates what kind of placeholder should be + // constructed in this case. The resolve_mode parameter determines whether + // any symbol is returned, or only symbols that are types. Note, however, + // that LookupSymbol may still return a non-type symbol in LOOKUP_TYPES mode, + // if it believes that's all it could refer to. The caller should always + // check that it receives the type of symbol it was expecting. + enum PlaceholderType { + PLACEHOLDER_MESSAGE, + PLACEHOLDER_ENUM, + PLACEHOLDER_EXTENDABLE_MESSAGE + }; + enum ResolveMode { + LOOKUP_ALL, LOOKUP_TYPES + }; + Symbol LookupSymbol(const string& name, const string& relative_to, + PlaceholderType placeholder_type = PLACEHOLDER_MESSAGE, + ResolveMode resolve_mode = LOOKUP_ALL); + + // Like LookupSymbol() but will not return a placeholder even if + // AllowUnknownDependencies() has been used. + Symbol LookupSymbolNoPlaceholder(const string& name, + const string& relative_to, + ResolveMode resolve_mode = LOOKUP_ALL); + + // Creates a placeholder type suitable for return from LookupSymbol(). May + // return kNullSymbol if the name is not a valid type name. + Symbol NewPlaceholder(const string& name, PlaceholderType placeholder_type); + + // Creates a placeholder file. Never returns NULL. This is used when an + // import is not found and AllowUnknownDependencies() is enabled. + const FileDescriptor* NewPlaceholderFile(const string& name); + + // Calls tables_->AddSymbol() and records an error if it fails. Returns + // true if successful or false if failed, though most callers can ignore + // the return value since an error has already been recorded. + bool AddSymbol(const string& full_name, + const void* parent, const string& name, + const Message& proto, Symbol symbol); + + // Like AddSymbol(), but succeeds if the symbol is already defined as long + // as the existing definition is also a package (because it's OK to define + // the same package in two different files). Also adds all parents of the + // packgae to the symbol table (e.g. AddPackage("foo.bar", ...) will add + // "foo.bar" and "foo" to the table). + void AddPackage(const string& name, const Message& proto, + const FileDescriptor* file); + + // Checks that the symbol name contains only alphanumeric characters and + // underscores. Records an error otherwise. + void ValidateSymbolName(const string& name, const string& full_name, + const Message& proto); + + // Like ValidateSymbolName(), but the name is allowed to contain periods and + // an error is indicated by returning false (not recording the error). + bool ValidateQualifiedName(const string& name); + + // Used by BUILD_ARRAY macro (below) to avoid having to have the type + // specified as a macro parameter. + template + inline void AllocateArray(int size, Type** output) { + *output = tables_->AllocateArray(size); + } + + // Allocates a copy of orig_options in tables_ and stores it in the + // descriptor. Remembers its uninterpreted options, to be interpreted + // later. DescriptorT must be one of the Descriptor messages from + // descriptor.proto. + template void AllocateOptions( + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor); + // Specialization for FileOptions. + void AllocateOptions(const FileOptions& orig_options, + FileDescriptor* descriptor); + + // Implementation for AllocateOptions(). Don't call this directly. + template void AllocateOptionsImpl( + const string& name_scope, + const string& element_name, + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor); + + // These methods all have the same signature for the sake of the BUILD_ARRAY + // macro, below. + void BuildMessage(const DescriptorProto& proto, + const Descriptor* parent, + Descriptor* result); + void BuildFieldOrExtension(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result, + bool is_extension); + void BuildField(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result) { + BuildFieldOrExtension(proto, parent, result, false); + } + void BuildExtension(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result) { + BuildFieldOrExtension(proto, parent, result, true); + } + void BuildExtensionRange(const DescriptorProto::ExtensionRange& proto, + const Descriptor* parent, + Descriptor::ExtensionRange* result); + void BuildEnum(const EnumDescriptorProto& proto, + const Descriptor* parent, + EnumDescriptor* result); + void BuildEnumValue(const EnumValueDescriptorProto& proto, + const EnumDescriptor* parent, + EnumValueDescriptor* result); + void BuildService(const ServiceDescriptorProto& proto, + const void* dummy, + ServiceDescriptor* result); + void BuildMethod(const MethodDescriptorProto& proto, + const ServiceDescriptor* parent, + MethodDescriptor* result); + + // Must be run only after building. + // + // NOTE: Options will not be available during cross-linking, as they + // have not yet been interpreted. Defer any handling of options to the + // Validate*Options methods. + void CrossLinkFile(FileDescriptor* file, const FileDescriptorProto& proto); + void CrossLinkMessage(Descriptor* message, const DescriptorProto& proto); + void CrossLinkField(FieldDescriptor* field, + const FieldDescriptorProto& proto); + void CrossLinkEnum(EnumDescriptor* enum_type, + const EnumDescriptorProto& proto); + void CrossLinkEnumValue(EnumValueDescriptor* enum_value, + const EnumValueDescriptorProto& proto); + void CrossLinkService(ServiceDescriptor* service, + const ServiceDescriptorProto& proto); + void CrossLinkMethod(MethodDescriptor* method, + const MethodDescriptorProto& proto); + + // Must be run only after cross-linking. + void InterpretOptions(); + + // A helper class for interpreting options. + class OptionInterpreter { + public: + // Creates an interpreter that operates in the context of the pool of the + // specified builder, which must not be NULL. We don't take ownership of the + // builder. + explicit OptionInterpreter(DescriptorBuilder* builder); + + ~OptionInterpreter(); + + // Interprets the uninterpreted options in the specified Options message. + // On error, calls AddError() on the underlying builder and returns false. + // Otherwise returns true. + bool InterpretOptions(OptionsToInterpret* options_to_interpret); + + class AggregateOptionFinder; + + private: + // Interprets uninterpreted_option_ on the specified message, which + // must be the mutable copy of the original options message to which + // uninterpreted_option_ belongs. + bool InterpretSingleOption(Message* options); + + // Adds the uninterpreted_option to the given options message verbatim. + // Used when AllowUnknownDependencies() is in effect and we can't find + // the option's definition. + void AddWithoutInterpreting(const UninterpretedOption& uninterpreted_option, + Message* options); + + // A recursive helper function that drills into the intermediate fields + // in unknown_fields to check if field innermost_field is set on the + // innermost message. Returns false and sets an error if so. + bool ExamineIfOptionIsSet( + vector::const_iterator intermediate_fields_iter, + vector::const_iterator intermediate_fields_end, + const FieldDescriptor* innermost_field, const string& debug_msg_name, + const UnknownFieldSet& unknown_fields); + + // Validates the value for the option field of the currently interpreted + // option and then sets it on the unknown_field. + bool SetOptionValue(const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields); + + // Parses an aggregate value for a CPPTYPE_MESSAGE option and + // saves it into *unknown_fields. + bool SetAggregateOption(const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields); + + // Convenience functions to set an int field the right way, depending on + // its wire type (a single int CppType can represent multiple wire types). + void SetInt32(int number, int32 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + void SetInt64(int number, int64 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + void SetUInt32(int number, uint32 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + void SetUInt64(int number, uint64 value, FieldDescriptor::Type type, + UnknownFieldSet* unknown_fields); + + // A helper function that adds an error at the specified location of the + // option we're currently interpreting, and returns false. + bool AddOptionError(DescriptorPool::ErrorCollector::ErrorLocation location, + const string& msg) { + builder_->AddError(options_to_interpret_->element_name, + *uninterpreted_option_, location, msg); + return false; + } + + // A helper function that adds an error at the location of the option name + // and returns false. + bool AddNameError(const string& msg) { + return AddOptionError(DescriptorPool::ErrorCollector::OPTION_NAME, msg); + } + + // A helper function that adds an error at the location of the option name + // and returns false. + bool AddValueError(const string& msg) { + return AddOptionError(DescriptorPool::ErrorCollector::OPTION_VALUE, msg); + } + + // We interpret against this builder's pool. Is never NULL. We don't own + // this pointer. + DescriptorBuilder* builder_; + + // The options we're currently interpreting, or NULL if we're not in a call + // to InterpretOptions. + const OptionsToInterpret* options_to_interpret_; + + // The option we're currently interpreting within options_to_interpret_, or + // NULL if we're not in a call to InterpretOptions(). This points to a + // submessage of the original option, not the mutable copy. Therefore we + // can use it to find locations recorded by the parser. + const UninterpretedOption* uninterpreted_option_; + + // Factory used to create the dynamic messages we need to parse + // any aggregate option values we encounter. + DynamicMessageFactory dynamic_factory_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OptionInterpreter); + }; + + // Work-around for broken compilers: According to the C++ standard, + // OptionInterpreter should have access to the private members of any class + // which has declared DescriptorBuilder as a friend. Unfortunately some old + // versions of GCC and other compilers do not implement this correctly. So, + // we have to have these intermediate methods to provide access. We also + // redundantly declare OptionInterpreter a friend just to make things extra + // clear for these bad compilers. + friend class OptionInterpreter; + friend class OptionInterpreter::AggregateOptionFinder; + + static inline bool get_allow_unknown(const DescriptorPool* pool) { + return pool->allow_unknown_; + } + static inline bool get_is_placeholder(const Descriptor* descriptor) { + return descriptor->is_placeholder_; + } + static inline void assert_mutex_held(const DescriptorPool* pool) { + if (pool->mutex_ != NULL) { + pool->mutex_->AssertHeld(); + } + } + + // Must be run only after options have been interpreted. + // + // NOTE: Validation code must only reference the options in the mutable + // descriptors, which are the ones that have been interpreted. The const + // proto references are passed in only so they can be provided to calls to + // AddError(). Do not look at their options, which have not been interpreted. + void ValidateFileOptions(FileDescriptor* file, + const FileDescriptorProto& proto); + void ValidateMessageOptions(Descriptor* message, + const DescriptorProto& proto); + void ValidateFieldOptions(FieldDescriptor* field, + const FieldDescriptorProto& proto); + void ValidateEnumOptions(EnumDescriptor* enm, + const EnumDescriptorProto& proto); + void ValidateEnumValueOptions(EnumValueDescriptor* enum_value, + const EnumValueDescriptorProto& proto); + void ValidateServiceOptions(ServiceDescriptor* service, + const ServiceDescriptorProto& proto); + void ValidateMethodOptions(MethodDescriptor* method, + const MethodDescriptorProto& proto); + + void ValidateMapKey(FieldDescriptor* field, + const FieldDescriptorProto& proto); +}; + +const FileDescriptor* DescriptorPool::BuildFile( + const FileDescriptorProto& proto) { + GOOGLE_CHECK(fallback_database_ == NULL) + << "Cannot call BuildFile on a DescriptorPool that uses a " + "DescriptorDatabase. You must instead find a way to get your file " + "into the underlying database."; + GOOGLE_CHECK(mutex_ == NULL); // Implied by the above GOOGLE_CHECK. + return DescriptorBuilder(this, tables_.get(), NULL).BuildFile(proto); +} + +const FileDescriptor* DescriptorPool::BuildFileCollectingErrors( + const FileDescriptorProto& proto, + ErrorCollector* error_collector) { + GOOGLE_CHECK(fallback_database_ == NULL) + << "Cannot call BuildFile on a DescriptorPool that uses a " + "DescriptorDatabase. You must instead find a way to get your file " + "into the underlying database."; + GOOGLE_CHECK(mutex_ == NULL); // Implied by the above GOOGLE_CHECK. + return DescriptorBuilder(this, tables_.get(), + error_collector).BuildFile(proto); +} + +const FileDescriptor* DescriptorPool::BuildFileFromDatabase( + const FileDescriptorProto& proto) const { + mutex_->AssertHeld(); + return DescriptorBuilder(this, tables_.get(), + default_error_collector_).BuildFile(proto); +} + +DescriptorBuilder::DescriptorBuilder( + const DescriptorPool* pool, + DescriptorPool::Tables* tables, + DescriptorPool::ErrorCollector* error_collector) + : pool_(pool), + tables_(tables), + error_collector_(error_collector), + had_errors_(false), + possible_undeclared_dependency_(NULL) {} + +DescriptorBuilder::~DescriptorBuilder() {} + +void DescriptorBuilder::AddError( + const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& error) { + if (error_collector_ == NULL) { + if (!had_errors_) { + GOOGLE_LOG(ERROR) << "Invalid proto descriptor for file \"" << filename_ + << "\":"; + } + GOOGLE_LOG(ERROR) << " " << element_name << ": " << error; + } else { + error_collector_->AddError(filename_, element_name, + &descriptor, location, error); + } + had_errors_ = true; +} + +void DescriptorBuilder::AddNotDefinedError( + const string& element_name, + const Message& descriptor, + DescriptorPool::ErrorCollector::ErrorLocation location, + const string& undefined_symbol) { + if (possible_undeclared_dependency_ == NULL) { + AddError(element_name, descriptor, location, + "\"" + undefined_symbol + "\" is not defined."); + } else { + AddError(element_name, descriptor, location, + "\"" + possible_undeclared_dependency_name_ + + "\" seems to be defined in \"" + + possible_undeclared_dependency_->name() + "\", which is not " + "imported by \"" + filename_ + "\". To use it here, please " + "add the necessary import."); + } +} + +bool DescriptorBuilder::IsInPackage(const FileDescriptor* file, + const string& package_name) { + return HasPrefixString(file->package(), package_name) && + (file->package().size() == package_name.size() || + file->package()[package_name.size()] == '.'); +} + +Symbol DescriptorBuilder::FindSymbolNotEnforcingDeps(const string& name) { + Symbol result; + + // We need to search our pool and all its underlays. + const DescriptorPool* pool = pool_; + while (true) { + // If we are looking at an underlay, we must lock its mutex_, since we are + // accessing the underlay's tables_ dircetly. + MutexLockMaybe lock((pool == pool_) ? NULL : pool->mutex_); + + // Note that we don't have to check fallback_database_ here because the + // symbol has to be in one of its file's direct dependencies, and we have + // already loaded those by the time we get here. + result = pool->tables_->FindSymbol(name); + if (!result.IsNull()) break; + if (pool->underlay_ == NULL) return kNullSymbol; + pool = pool->underlay_; + } + + return result; +} + +Symbol DescriptorBuilder::FindSymbol(const string& name) { + Symbol result = FindSymbolNotEnforcingDeps(name); + + if (!pool_->enforce_dependencies_) { + // Hack for CompilerUpgrader. + return result; + } + + // Only find symbols which were defined in this file or one of its + // dependencies. + const FileDescriptor* file = result.GetFile(); + if (file == file_) return result; + for (int i = 0; i < file_->dependency_count(); i++) { + if (file == file_->dependency(i)) return result; + } + + if (result.type == Symbol::PACKAGE) { + // Arg, this is overcomplicated. The symbol is a package name. It could + // be that the package was defined in multiple files. result.GetFile() + // returns the first file we saw that used this package. We've determined + // that that file is not a direct dependency of the file we are currently + // building, but it could be that some other file which *is* a direct + // dependency also defines the same package. We can't really rule out this + // symbol unless none of the dependencies define it. + if (IsInPackage(file_, name)) return result; + for (int i = 0; i < file_->dependency_count(); i++) { + // Note: A dependency may be NULL if it was not found or had errors. + if (file_->dependency(i) != NULL && + IsInPackage(file_->dependency(i), name)) { + return result; + } + } + } + + possible_undeclared_dependency_ = file; + possible_undeclared_dependency_name_ = name; + return kNullSymbol; +} + +Symbol DescriptorBuilder::LookupSymbolNoPlaceholder( + const string& name, const string& relative_to, ResolveMode resolve_mode) { + possible_undeclared_dependency_ = NULL; + + if (name.size() > 0 && name[0] == '.') { + // Fully-qualified name. + return FindSymbol(name.substr(1)); + } + + // If name is something like "Foo.Bar.baz", and symbols named "Foo" are + // defined in multiple parent scopes, we only want to find "Bar.baz" in the + // innermost one. E.g., the following should produce an error: + // message Bar { message Baz {} } + // message Foo { + // message Bar { + // } + // optional Bar.Baz baz = 1; + // } + // So, we look for just "Foo" first, then look for "Bar.baz" within it if + // found. + int name_dot_pos = name.find_first_of('.'); + string first_part_of_name; + if (name_dot_pos == string::npos) { + first_part_of_name = name; + } else { + first_part_of_name = name.substr(0, name_dot_pos); + } + + string scope_to_try(relative_to); + + while (true) { + // Chop off the last component of the scope. + string::size_type dot_pos = scope_to_try.find_last_of('.'); + if (dot_pos == string::npos) { + return FindSymbol(name); + } else { + scope_to_try.erase(dot_pos); + } + + // Append ".first_part_of_name" and try to find. + string::size_type old_size = scope_to_try.size(); + scope_to_try.append(1, '.'); + scope_to_try.append(first_part_of_name); + Symbol result = FindSymbol(scope_to_try); + if (!result.IsNull()) { + if (first_part_of_name.size() < name.size()) { + // name is a compound symbol, of which we only found the first part. + // Now try to look up the rest of it. + if (result.IsAggregate()) { + scope_to_try.append(name, first_part_of_name.size(), + name.size() - first_part_of_name.size()); + return FindSymbol(scope_to_try); + } else { + // We found a symbol but it's not an aggregate. Continue the loop. + } + } else { + if (resolve_mode == LOOKUP_TYPES && !result.IsType()) { + // We found a symbol but it's not a type. Continue the loop. + } else { + return result; + } + } + } + + // Not found. Remove the name so we can try again. + scope_to_try.erase(old_size); + } +} + +Symbol DescriptorBuilder::LookupSymbol( + const string& name, const string& relative_to, + PlaceholderType placeholder_type, ResolveMode resolve_mode) { + Symbol result = LookupSymbolNoPlaceholder( + name, relative_to, resolve_mode); + if (result.IsNull() && pool_->allow_unknown_) { + // Not found, but AllowUnknownDependencies() is enabled. Return a + // placeholder instead. + result = NewPlaceholder(name, placeholder_type); + } + return result; +} + +Symbol DescriptorBuilder::NewPlaceholder(const string& name, + PlaceholderType placeholder_type) { + // Compute names. + const string* placeholder_full_name; + const string* placeholder_name; + const string* placeholder_package; + + if (!ValidateQualifiedName(name)) return kNullSymbol; + if (name[0] == '.') { + // Fully-qualified. + placeholder_full_name = tables_->AllocateString(name.substr(1)); + } else { + placeholder_full_name = tables_->AllocateString(name); + } + + string::size_type dotpos = placeholder_full_name->find_last_of('.'); + if (dotpos != string::npos) { + placeholder_package = tables_->AllocateString( + placeholder_full_name->substr(0, dotpos)); + placeholder_name = tables_->AllocateString( + placeholder_full_name->substr(dotpos + 1)); + } else { + placeholder_package = &kEmptyString; + placeholder_name = placeholder_full_name; + } + + // Create the placeholders. + FileDescriptor* placeholder_file = tables_->Allocate(); + memset(placeholder_file, 0, sizeof(*placeholder_file)); + + placeholder_file->name_ = + tables_->AllocateString(*placeholder_full_name + ".placeholder.proto"); + placeholder_file->package_ = placeholder_package; + placeholder_file->pool_ = pool_; + placeholder_file->options_ = &FileOptions::default_instance(); + placeholder_file->tables_ = &FileDescriptorTables::kEmpty; + // All other fields are zero or NULL. + + if (placeholder_type == PLACEHOLDER_ENUM) { + placeholder_file->enum_type_count_ = 1; + placeholder_file->enum_types_ = + tables_->AllocateArray(1); + + EnumDescriptor* placeholder_enum = &placeholder_file->enum_types_[0]; + memset(placeholder_enum, 0, sizeof(*placeholder_enum)); + + placeholder_enum->full_name_ = placeholder_full_name; + placeholder_enum->name_ = placeholder_name; + placeholder_enum->file_ = placeholder_file; + placeholder_enum->options_ = &EnumOptions::default_instance(); + placeholder_enum->is_placeholder_ = true; + placeholder_enum->is_unqualified_placeholder_ = (name[0] != '.'); + + // Enums must have at least one value. + placeholder_enum->value_count_ = 1; + placeholder_enum->values_ = tables_->AllocateArray(1); + + EnumValueDescriptor* placeholder_value = &placeholder_enum->values_[0]; + memset(placeholder_value, 0, sizeof(*placeholder_value)); + + placeholder_value->name_ = tables_->AllocateString("PLACEHOLDER_VALUE"); + // Note that enum value names are siblings of their type, not children. + placeholder_value->full_name_ = + placeholder_package->empty() ? placeholder_value->name_ : + tables_->AllocateString(*placeholder_package + ".PLACEHOLDER_VALUE"); + + placeholder_value->number_ = 0; + placeholder_value->type_ = placeholder_enum; + placeholder_value->options_ = &EnumValueOptions::default_instance(); + + return Symbol(placeholder_enum); + } else { + placeholder_file->message_type_count_ = 1; + placeholder_file->message_types_ = + tables_->AllocateArray(1); + + Descriptor* placeholder_message = &placeholder_file->message_types_[0]; + memset(placeholder_message, 0, sizeof(*placeholder_message)); + + placeholder_message->full_name_ = placeholder_full_name; + placeholder_message->name_ = placeholder_name; + placeholder_message->file_ = placeholder_file; + placeholder_message->options_ = &MessageOptions::default_instance(); + placeholder_message->is_placeholder_ = true; + placeholder_message->is_unqualified_placeholder_ = (name[0] != '.'); + + if (placeholder_type == PLACEHOLDER_EXTENDABLE_MESSAGE) { + placeholder_message->extension_range_count_ = 1; + placeholder_message->extension_ranges_ = + tables_->AllocateArray(1); + placeholder_message->extension_ranges_->start = 1; + // kMaxNumber + 1 because ExtensionRange::end is exclusive. + placeholder_message->extension_ranges_->end = + FieldDescriptor::kMaxNumber + 1; + } + + return Symbol(placeholder_message); + } +} + +const FileDescriptor* DescriptorBuilder::NewPlaceholderFile( + const string& name) { + FileDescriptor* placeholder = tables_->Allocate(); + memset(placeholder, 0, sizeof(*placeholder)); + + placeholder->name_ = tables_->AllocateString(name); + placeholder->package_ = &kEmptyString; + placeholder->pool_ = pool_; + placeholder->options_ = &FileOptions::default_instance(); + placeholder->tables_ = &FileDescriptorTables::kEmpty; + // All other fields are zero or NULL. + + return placeholder; +} + +bool DescriptorBuilder::AddSymbol( + const string& full_name, const void* parent, const string& name, + const Message& proto, Symbol symbol) { + // If the caller passed NULL for the parent, the symbol is at file scope. + // Use its file as the parent instead. + if (parent == NULL) parent = file_; + + if (tables_->AddSymbol(full_name, symbol)) { + if (!file_tables_->AddAliasUnderParent(parent, name, symbol)) { + GOOGLE_LOG(DFATAL) << "\"" << full_name << "\" not previously defined in " + "symbols_by_name_, but was defined in symbols_by_parent_; " + "this shouldn't be possible."; + return false; + } + return true; + } else { + const FileDescriptor* other_file = tables_->FindSymbol(full_name).GetFile(); + if (other_file == file_) { + string::size_type dot_pos = full_name.find_last_of('.'); + if (dot_pos == string::npos) { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + full_name + "\" is already defined."); + } else { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + full_name.substr(dot_pos + 1) + + "\" is already defined in \"" + + full_name.substr(0, dot_pos) + "\"."); + } + } else { + // Symbol seems to have been defined in a different file. + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + full_name + "\" is already defined in file \"" + + other_file->name() + "\"."); + } + return false; + } +} + +void DescriptorBuilder::AddPackage( + const string& name, const Message& proto, const FileDescriptor* file) { + if (tables_->AddSymbol(name, Symbol(file))) { + // Success. Also add parent package, if any. + string::size_type dot_pos = name.find_last_of('.'); + if (dot_pos == string::npos) { + // No parents. + ValidateSymbolName(name, name, proto); + } else { + // Has parent. + string* parent_name = tables_->AllocateString(name.substr(0, dot_pos)); + AddPackage(*parent_name, proto, file); + ValidateSymbolName(name.substr(dot_pos + 1), name, proto); + } + } else { + Symbol existing_symbol = tables_->FindSymbol(name); + // It's OK to redefine a package. + if (existing_symbol.type != Symbol::PACKAGE) { + // Symbol seems to have been defined in a different file. + AddError(name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + name + "\" is already defined (as something other than " + "a package) in file \"" + existing_symbol.GetFile()->name() + + "\"."); + } + } +} + +void DescriptorBuilder::ValidateSymbolName( + const string& name, const string& full_name, const Message& proto) { + if (name.empty()) { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "Missing name."); + } else { + for (int i = 0; i < name.size(); i++) { + // I don't trust isalnum() due to locales. :( + if ((name[i] < 'a' || 'z' < name[i]) && + (name[i] < 'A' || 'Z' < name[i]) && + (name[i] < '0' || '9' < name[i]) && + (name[i] != '_')) { + AddError(full_name, proto, DescriptorPool::ErrorCollector::NAME, + "\"" + name + "\" is not a valid identifier."); + } + } + } +} + +bool DescriptorBuilder::ValidateQualifiedName(const string& name) { + bool last_was_period = false; + + for (int i = 0; i < name.size(); i++) { + // I don't trust isalnum() due to locales. :( + if (('a' <= name[i] && name[i] <= 'z') || + ('A' <= name[i] && name[i] <= 'Z') || + ('0' <= name[i] && name[i] <= '9') || + (name[i] == '_')) { + last_was_period = false; + } else if (name[i] == '.') { + if (last_was_period) return false; + last_was_period = true; + } else { + return false; + } + } + + return !name.empty() && !last_was_period; +} + +// ------------------------------------------------------------------- + +// This generic implementation is good for all descriptors except +// FileDescriptor. +template void DescriptorBuilder::AllocateOptions( + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor) { + AllocateOptionsImpl(descriptor->full_name(), descriptor->full_name(), + orig_options, descriptor); +} + +// We specialize for FileDescriptor. +void DescriptorBuilder::AllocateOptions(const FileOptions& orig_options, + FileDescriptor* descriptor) { + // We add the dummy token so that LookupSymbol does the right thing. + AllocateOptionsImpl(descriptor->package() + ".dummy", descriptor->name(), + orig_options, descriptor); +} + +template void DescriptorBuilder::AllocateOptionsImpl( + const string& name_scope, + const string& element_name, + const typename DescriptorT::OptionsType& orig_options, + DescriptorT* descriptor) { + // We need to use a dummy pointer to work around a bug in older versions of + // GCC. Otherwise, the following two lines could be replaced with: + // typename DescriptorT::OptionsType* options = + // tables_->AllocateMessage(); + typename DescriptorT::OptionsType* const dummy = NULL; + typename DescriptorT::OptionsType* options = tables_->AllocateMessage(dummy); + options->CopyFrom(orig_options); + descriptor->options_ = options; + + // Don't add to options_to_interpret_ unless there were uninterpreted + // options. This not only avoids unnecessary work, but prevents a + // bootstrapping problem when building descriptors for descriptor.proto. + // descriptor.proto does not contain any uninterpreted options, but + // attempting to interpret options anyway will cause + // OptionsType::GetDescriptor() to be called which may then deadlock since + // we're still trying to build it. + if (options->uninterpreted_option_size() > 0) { + options_to_interpret_.push_back( + OptionsToInterpret(name_scope, element_name, &orig_options, options)); + } +} + + +// A common pattern: We want to convert a repeated field in the descriptor +// to an array of values, calling some method to build each value. +#define BUILD_ARRAY(INPUT, OUTPUT, NAME, METHOD, PARENT) \ + OUTPUT->NAME##_count_ = INPUT.NAME##_size(); \ + AllocateArray(INPUT.NAME##_size(), &OUTPUT->NAME##s_); \ + for (int i = 0; i < INPUT.NAME##_size(); i++) { \ + METHOD(INPUT.NAME(i), PARENT, OUTPUT->NAME##s_ + i); \ + } + +const FileDescriptor* DescriptorBuilder::BuildFile( + const FileDescriptorProto& proto) { + filename_ = proto.name(); + + // Check if the file already exists and is identical to the one being built. + // Note: This only works if the input is canonical -- that is, it + // fully-qualifies all type names, has no UninterpretedOptions, etc. + // This is fine, because this idempotency "feature" really only exists to + // accomodate one hack in the proto1->proto2 migration layer. + const FileDescriptor* existing_file = tables_->FindFile(filename_); + if (existing_file != NULL) { + // File already in pool. Compare the existing one to the input. + FileDescriptorProto existing_proto; + existing_file->CopyTo(&existing_proto); + if (existing_proto.SerializeAsString() == proto.SerializeAsString()) { + // They're identical. Return the existing descriptor. + return existing_file; + } + + // Not a match. The error will be detected and handled later. + } + + // Check to see if this file is already on the pending files list. + // TODO(kenton): Allow recursive imports? It may not work with some + // (most?) programming languages. E.g., in C++, a forward declaration + // of a type is not sufficient to allow it to be used even in a + // generated header file due to inlining. This could perhaps be + // worked around using tricks involving inserting #include statements + // mid-file, but that's pretty ugly, and I'm pretty sure there are + // some languages out there that do not allow recursive dependencies + // at all. + for (int i = 0; i < tables_->pending_files_.size(); i++) { + if (tables_->pending_files_[i] == proto.name()) { + string error_message("File recursively imports itself: "); + for (; i < tables_->pending_files_.size(); i++) { + error_message.append(tables_->pending_files_[i]); + error_message.append(" -> "); + } + error_message.append(proto.name()); + + AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, + error_message); + return NULL; + } + } + + // If we have a fallback_database_, attempt to load all dependencies now, + // before checkpointing tables_. This avoids confusion with recursive + // checkpoints. + if (pool_->fallback_database_ != NULL) { + tables_->pending_files_.push_back(proto.name()); + for (int i = 0; i < proto.dependency_size(); i++) { + if (tables_->FindFile(proto.dependency(i)) == NULL && + (pool_->underlay_ == NULL || + pool_->underlay_->FindFileByName(proto.dependency(i)) == NULL)) { + // We don't care what this returns since we'll find out below anyway. + pool_->TryFindFileInFallbackDatabase(proto.dependency(i)); + } + } + tables_->pending_files_.pop_back(); + } + + // Checkpoint the tables so that we can roll back if something goes wrong. + tables_->Checkpoint(); + + FileDescriptor* result = tables_->Allocate(); + file_ = result; + + file_tables_ = tables_->AllocateFileTables(); + file_->tables_ = file_tables_; + + if (!proto.has_name()) { + AddError("", proto, DescriptorPool::ErrorCollector::OTHER, + "Missing field: FileDescriptorProto.name."); + } + + result->name_ = tables_->AllocateString(proto.name()); + if (proto.has_package()) { + result->package_ = tables_->AllocateString(proto.package()); + } else { + // We cannot rely on proto.package() returning a valid string if + // proto.has_package() is false, because we might be running at static + // initialization time, in which case default values have not yet been + // initialized. + result->package_ = tables_->AllocateString(""); + } + result->pool_ = pool_; + + // Add to tables. + if (!tables_->AddFile(result)) { + AddError(proto.name(), proto, DescriptorPool::ErrorCollector::OTHER, + "A file with this name is already in the pool."); + // Bail out early so that if this is actually the exact same file, we + // don't end up reporting that every single symbol is already defined. + tables_->Rollback(); + return NULL; + } + if (!result->package().empty()) { + AddPackage(result->package(), proto, result); + } + + // Make sure all dependencies are loaded. + set seen_dependencies; + result->dependency_count_ = proto.dependency_size(); + result->dependencies_ = + tables_->AllocateArray(proto.dependency_size()); + for (int i = 0; i < proto.dependency_size(); i++) { + if (!seen_dependencies.insert(proto.dependency(i)).second) { + AddError(proto.name(), proto, + DescriptorPool::ErrorCollector::OTHER, + "Import \"" + proto.dependency(i) + "\" was listed twice."); + } + + const FileDescriptor* dependency = tables_->FindFile(proto.dependency(i)); + if (dependency == NULL && pool_->underlay_ != NULL) { + dependency = pool_->underlay_->FindFileByName(proto.dependency(i)); + } + + if (dependency == NULL) { + if (pool_->allow_unknown_) { + dependency = NewPlaceholderFile(proto.dependency(i)); + } else { + string message; + if (pool_->fallback_database_ == NULL) { + message = "Import \"" + proto.dependency(i) + + "\" has not been loaded."; + } else { + message = "Import \"" + proto.dependency(i) + + "\" was not found or had errors."; + } + AddError(proto.name(), proto, + DescriptorPool::ErrorCollector::OTHER, + message); + } + } + + result->dependencies_[i] = dependency; + } + + // Convert children. + BUILD_ARRAY(proto, result, message_type, BuildMessage , NULL); + BUILD_ARRAY(proto, result, enum_type , BuildEnum , NULL); + BUILD_ARRAY(proto, result, service , BuildService , NULL); + BUILD_ARRAY(proto, result, extension , BuildExtension, NULL); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + // Note that the following steps must occur in exactly the specified order. + + // Cross-link. + CrossLinkFile(result, proto); + + // Interpret any remaining uninterpreted options gathered into + // options_to_interpret_ during descriptor building. Cross-linking has made + // extension options known, so all interpretations should now succeed. + if (!had_errors_) { + OptionInterpreter option_interpreter(this); + for (vector::iterator iter = + options_to_interpret_.begin(); + iter != options_to_interpret_.end(); ++iter) { + option_interpreter.InterpretOptions(&(*iter)); + } + options_to_interpret_.clear(); + } + + // Validate options. + if (!had_errors_) { + ValidateFileOptions(result, proto); + } + + if (had_errors_) { + tables_->Rollback(); + return NULL; + } else { + tables_->Checkpoint(); + return result; + } +} + +void DescriptorBuilder::BuildMessage(const DescriptorProto& proto, + const Descriptor* parent, + Descriptor* result) { + const string& scope = (parent == NULL) ? + file_->package() : parent->full_name(); + string* full_name = tables_->AllocateString(scope); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + result->containing_type_ = parent; + result->is_placeholder_ = false; + result->is_unqualified_placeholder_ = false; + + BUILD_ARRAY(proto, result, field , BuildField , result); + BUILD_ARRAY(proto, result, nested_type , BuildMessage , result); + BUILD_ARRAY(proto, result, enum_type , BuildEnum , result); + BUILD_ARRAY(proto, result, extension_range, BuildExtensionRange, result); + BUILD_ARRAY(proto, result, extension , BuildExtension , result); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); + + // Check that no fields have numbers in extension ranges. + for (int i = 0; i < result->field_count(); i++) { + const FieldDescriptor* field = result->field(i); + for (int j = 0; j < result->extension_range_count(); j++) { + const Descriptor::ExtensionRange* range = result->extension_range(j); + if (range->start <= field->number() && field->number() < range->end) { + AddError(field->full_name(), proto.extension_range(j), + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute( + "Extension range $0 to $1 includes field \"$2\" ($3).", + range->start, range->end - 1, + field->name(), field->number())); + } + } + } + + // Check that extension ranges don't overlap. + for (int i = 0; i < result->extension_range_count(); i++) { + const Descriptor::ExtensionRange* range1 = result->extension_range(i); + for (int j = i + 1; j < result->extension_range_count(); j++) { + const Descriptor::ExtensionRange* range2 = result->extension_range(j); + if (range1->end > range2->start && range2->end > range1->start) { + AddError(result->full_name(), proto.extension_range(j), + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Extension range $0 to $1 overlaps with " + "already-defined range $2 to $3.", + range2->start, range2->end - 1, + range1->start, range1->end - 1)); + } + } + } +} + +void DescriptorBuilder::BuildFieldOrExtension(const FieldDescriptorProto& proto, + const Descriptor* parent, + FieldDescriptor* result, + bool is_extension) { + const string& scope = (parent == NULL) ? + file_->package() : parent->full_name(); + string* full_name = tables_->AllocateString(scope); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + result->number_ = proto.number(); + result->is_extension_ = is_extension; + + // If .proto files follow the style guide then the name should already be + // lower-cased. If that's the case we can just reuse the string we already + // allocated rather than allocate a new one. + string lowercase_name(proto.name()); + LowerString(&lowercase_name); + if (lowercase_name == proto.name()) { + result->lowercase_name_ = result->name_; + } else { + result->lowercase_name_ = tables_->AllocateString(lowercase_name); + } + + // Don't bother with the above optimization for camel-case names since + // .proto files that follow the guide shouldn't be using names in this + // format, so the optimization wouldn't help much. + result->camelcase_name_ = tables_->AllocateString(ToCamelCase(proto.name())); + + // Some compilers do not allow static_cast directly between two enum types, + // so we must cast to int first. + result->type_ = static_cast( + implicit_cast(proto.type())); + result->label_ = static_cast( + implicit_cast(proto.label())); + + // Some of these may be filled in when cross-linking. + result->containing_type_ = NULL; + result->extension_scope_ = NULL; + result->experimental_map_key_ = NULL; + result->message_type_ = NULL; + result->enum_type_ = NULL; + + result->has_default_value_ = proto.has_default_value(); + if (proto.has_default_value() && result->is_repeated()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Repeated fields can't have default values."); + } + + if (proto.has_type()) { + if (proto.has_default_value()) { + char* end_pos = NULL; + switch (result->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + result->default_value_int32_ = + strtol(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_INT64: + result->default_value_int64_ = + strto64(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_UINT32: + result->default_value_uint32_ = + strtoul(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_UINT64: + result->default_value_uint64_ = + strtou64(proto.default_value().c_str(), &end_pos, 0); + break; + case FieldDescriptor::CPPTYPE_FLOAT: + if (proto.default_value() == "inf") { + result->default_value_float_ = numeric_limits::infinity(); + } else if (proto.default_value() == "-inf") { + result->default_value_float_ = -numeric_limits::infinity(); + } else if (proto.default_value() == "nan") { + result->default_value_float_ = numeric_limits::quiet_NaN(); + } else { + result->default_value_float_ = + NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + } + break; + case FieldDescriptor::CPPTYPE_DOUBLE: + if (proto.default_value() == "inf") { + result->default_value_double_ = numeric_limits::infinity(); + } else if (proto.default_value() == "-inf") { + result->default_value_double_ = -numeric_limits::infinity(); + } else if (proto.default_value() == "nan") { + result->default_value_double_ = numeric_limits::quiet_NaN(); + } else { + result->default_value_double_ = + NoLocaleStrtod(proto.default_value().c_str(), &end_pos); + } + break; + case FieldDescriptor::CPPTYPE_BOOL: + if (proto.default_value() == "true") { + result->default_value_bool_ = true; + } else if (proto.default_value() == "false") { + result->default_value_bool_ = false; + } else { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Boolean default must be true or false."); + } + break; + case FieldDescriptor::CPPTYPE_ENUM: + // This will be filled in when cross-linking. + result->default_value_enum_ = NULL; + break; + case FieldDescriptor::CPPTYPE_STRING: + if (result->type() == FieldDescriptor::TYPE_BYTES) { + result->default_value_string_ = tables_->AllocateString( + UnescapeCEscapeString(proto.default_value())); + } else { + result->default_value_string_ = + tables_->AllocateString(proto.default_value()); + } + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Messages can't have default values."); + result->has_default_value_ = false; + break; + } + + if (end_pos != NULL) { + // end_pos is only set non-NULL by the parsers for numeric types, above. + // This checks that the default was non-empty and had no extra junk + // after the end of the number. + if (proto.default_value().empty() || *end_pos != '\0') { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Couldn't parse default value."); + } + } + } else { + // No explicit default value + switch (result->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: + result->default_value_int32_ = 0; + break; + case FieldDescriptor::CPPTYPE_INT64: + result->default_value_int64_ = 0; + break; + case FieldDescriptor::CPPTYPE_UINT32: + result->default_value_uint32_ = 0; + break; + case FieldDescriptor::CPPTYPE_UINT64: + result->default_value_uint64_ = 0; + break; + case FieldDescriptor::CPPTYPE_FLOAT: + result->default_value_float_ = 0.0f; + break; + case FieldDescriptor::CPPTYPE_DOUBLE: + result->default_value_double_ = 0.0; + break; + case FieldDescriptor::CPPTYPE_BOOL: + result->default_value_bool_ = false; + break; + case FieldDescriptor::CPPTYPE_ENUM: + // This will be filled in when cross-linking. + result->default_value_enum_ = NULL; + break; + case FieldDescriptor::CPPTYPE_STRING: + result->default_value_string_ = &kEmptyString; + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + break; + } + } + } + + if (result->number() <= 0) { + AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, + "Field numbers must be positive integers."); + } else if (result->number() > FieldDescriptor::kMaxNumber) { + AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Field numbers cannot be greater than $0.", + FieldDescriptor::kMaxNumber)); + } else if (result->number() >= FieldDescriptor::kFirstReservedNumber && + result->number() <= FieldDescriptor::kLastReservedNumber) { + AddError(result->full_name(), proto, DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute( + "Field numbers $0 through $1 are reserved for the protocol " + "buffer library implementation.", + FieldDescriptor::kFirstReservedNumber, + FieldDescriptor::kLastReservedNumber)); + } + + if (is_extension) { + if (!proto.has_extendee()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "FieldDescriptorProto.extendee not set for extension field."); + } + + result->extension_scope_ = parent; + } else { + if (proto.has_extendee()) { + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "FieldDescriptorProto.extendee set for non-extension field."); + } + + result->containing_type_ = parent; + } + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); +} + +void DescriptorBuilder::BuildExtensionRange( + const DescriptorProto::ExtensionRange& proto, + const Descriptor* parent, + Descriptor::ExtensionRange* result) { + result->start = proto.start(); + result->end = proto.end(); + if (result->start <= 0) { + AddError(parent->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + "Extension numbers must be positive integers."); + } + + if (result->end > FieldDescriptor::kMaxNumber + 1) { + AddError(parent->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Extension numbers cannot be greater than $0.", + FieldDescriptor::kMaxNumber)); + } + + if (result->start >= result->end) { + AddError(parent->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + "Extension range end number must be greater than start number."); + } +} + +void DescriptorBuilder::BuildEnum(const EnumDescriptorProto& proto, + const Descriptor* parent, + EnumDescriptor* result) { + const string& scope = (parent == NULL) ? + file_->package() : parent->full_name(); + string* full_name = tables_->AllocateString(scope); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + result->containing_type_ = parent; + result->is_placeholder_ = false; + result->is_unqualified_placeholder_ = false; + + if (proto.value_size() == 0) { + // We cannot allow enums with no values because this would mean there + // would be no valid default value for fields of this type. + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "Enums must contain at least one value."); + } + + BUILD_ARRAY(proto, result, value, BuildEnumValue, result); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); +} + +void DescriptorBuilder::BuildEnumValue(const EnumValueDescriptorProto& proto, + const EnumDescriptor* parent, + EnumValueDescriptor* result) { + result->name_ = tables_->AllocateString(proto.name()); + result->number_ = proto.number(); + result->type_ = parent; + + // Note: full_name for enum values is a sibling to the parent's name, not a + // child of it. + string* full_name = tables_->AllocateString(*parent->full_name_); + full_name->resize(full_name->size() - parent->name_->size()); + full_name->append(*result->name_); + result->full_name_ = full_name; + + ValidateSymbolName(proto.name(), *full_name, proto); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + // Again, enum values are weird because we makes them appear as siblings + // of the enum type instead of children of it. So, we use + // parent->containing_type() as the value's parent. + bool added_to_outer_scope = + AddSymbol(result->full_name(), parent->containing_type(), result->name(), + proto, Symbol(result)); + + // However, we also want to be able to search for values within a single + // enum type, so we add it as a child of the enum type itself, too. + // Note: This could fail, but if it does, the error has already been + // reported by the above AddSymbol() call, so we ignore the return code. + bool added_to_inner_scope = + file_tables_->AddAliasUnderParent(parent, result->name(), Symbol(result)); + + if (added_to_inner_scope && !added_to_outer_scope) { + // This value did not conflict with any values defined in the same enum, + // but it did conflict with some other symbol defined in the enum type's + // scope. Let's print an additional error to explain this. + string outer_scope; + if (parent->containing_type() == NULL) { + outer_scope = file_->package(); + } else { + outer_scope = parent->containing_type()->full_name(); + } + + if (outer_scope.empty()) { + outer_scope = "the global scope"; + } else { + outer_scope = "\"" + outer_scope + "\""; + } + + AddError(result->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "Note that enum values use C++ scoping rules, meaning that " + "enum values are siblings of their type, not children of it. " + "Therefore, \"" + result->name() + "\" must be unique within " + + outer_scope + ", not just within \"" + parent->name() + "\"."); + } + + // An enum is allowed to define two numbers that refer to the same value. + // FindValueByNumber() should return the first such value, so we simply + // ignore AddEnumValueByNumber()'s return code. + file_tables_->AddEnumValueByNumber(result); +} + +void DescriptorBuilder::BuildService(const ServiceDescriptorProto& proto, + const void* dummy, + ServiceDescriptor* result) { + string* full_name = tables_->AllocateString(file_->package()); + if (!full_name->empty()) full_name->append(1, '.'); + full_name->append(proto.name()); + + ValidateSymbolName(proto.name(), *full_name, proto); + + result->name_ = tables_->AllocateString(proto.name()); + result->full_name_ = full_name; + result->file_ = file_; + + BUILD_ARRAY(proto, result, method, BuildMethod, result); + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), NULL, result->name(), + proto, Symbol(result)); +} + +void DescriptorBuilder::BuildMethod(const MethodDescriptorProto& proto, + const ServiceDescriptor* parent, + MethodDescriptor* result) { + result->name_ = tables_->AllocateString(proto.name()); + result->service_ = parent; + + string* full_name = tables_->AllocateString(parent->full_name()); + full_name->append(1, '.'); + full_name->append(*result->name_); + result->full_name_ = full_name; + + ValidateSymbolName(proto.name(), *full_name, proto); + + // These will be filled in when cross-linking. + result->input_type_ = NULL; + result->output_type_ = NULL; + + // Copy options. + if (!proto.has_options()) { + result->options_ = NULL; // Will set to default_instance later. + } else { + AllocateOptions(proto.options(), result); + } + + AddSymbol(result->full_name(), parent, result->name(), + proto, Symbol(result)); +} + +#undef BUILD_ARRAY + +// ------------------------------------------------------------------- + +void DescriptorBuilder::CrossLinkFile( + FileDescriptor* file, const FileDescriptorProto& proto) { + if (file->options_ == NULL) { + file->options_ = &FileOptions::default_instance(); + } + + for (int i = 0; i < file->message_type_count(); i++) { + CrossLinkMessage(&file->message_types_[i], proto.message_type(i)); + } + + for (int i = 0; i < file->extension_count(); i++) { + CrossLinkField(&file->extensions_[i], proto.extension(i)); + } + + for (int i = 0; i < file->enum_type_count(); i++) { + CrossLinkEnum(&file->enum_types_[i], proto.enum_type(i)); + } + + for (int i = 0; i < file->service_count(); i++) { + CrossLinkService(&file->services_[i], proto.service(i)); + } +} + +void DescriptorBuilder::CrossLinkMessage( + Descriptor* message, const DescriptorProto& proto) { + if (message->options_ == NULL) { + message->options_ = &MessageOptions::default_instance(); + } + + for (int i = 0; i < message->nested_type_count(); i++) { + CrossLinkMessage(&message->nested_types_[i], proto.nested_type(i)); + } + + for (int i = 0; i < message->enum_type_count(); i++) { + CrossLinkEnum(&message->enum_types_[i], proto.enum_type(i)); + } + + for (int i = 0; i < message->field_count(); i++) { + CrossLinkField(&message->fields_[i], proto.field(i)); + } + + for (int i = 0; i < message->extension_count(); i++) { + CrossLinkField(&message->extensions_[i], proto.extension(i)); + } +} + +void DescriptorBuilder::CrossLinkField( + FieldDescriptor* field, const FieldDescriptorProto& proto) { + if (field->options_ == NULL) { + field->options_ = &FieldOptions::default_instance(); + } + + if (proto.has_extendee()) { + Symbol extendee = LookupSymbol(proto.extendee(), field->full_name(), + PLACEHOLDER_EXTENDABLE_MESSAGE); + if (extendee.IsNull()) { + AddNotDefinedError(field->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + proto.extendee()); + return; + } else if (extendee.type != Symbol::MESSAGE) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "\"" + proto.extendee() + "\" is not a message type."); + return; + } + field->containing_type_ = extendee.descriptor; + + if (!field->containing_type()->IsExtensionNumber(field->number())) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("\"$0\" does not declare $1 as an " + "extension number.", + field->containing_type()->full_name(), + field->number())); + } + } + + if (proto.has_type_name()) { + // Assume we are expecting a message type unless the proto contains some + // evidence that it expects an enum type. This only makes a difference if + // we end up creating a placeholder. + bool expecting_enum = (proto.type() == FieldDescriptorProto::TYPE_ENUM) || + proto.has_default_value(); + + Symbol type = + LookupSymbol(proto.type_name(), field->full_name(), + expecting_enum ? PLACEHOLDER_ENUM : PLACEHOLDER_MESSAGE, + LOOKUP_TYPES); + + if (type.IsNull()) { + AddNotDefinedError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + proto.type_name()); + return; + } + + if (!proto.has_type()) { + // Choose field type based on symbol. + if (type.type == Symbol::MESSAGE) { + field->type_ = FieldDescriptor::TYPE_MESSAGE; + } else if (type.type == Symbol::ENUM) { + field->type_ = FieldDescriptor::TYPE_ENUM; + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "\"" + proto.type_name() + "\" is not a type."); + return; + } + } + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (type.type != Symbol::MESSAGE) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "\"" + proto.type_name() + "\" is not a message type."); + return; + } + field->message_type_ = type.descriptor; + + if (field->has_default_value()) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Messages can't have default values."); + } + } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { + if (type.type != Symbol::ENUM) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "\"" + proto.type_name() + "\" is not an enum type."); + return; + } + field->enum_type_ = type.enum_descriptor; + + if (field->enum_type()->is_placeholder_) { + // We can't look up default values for placeholder types. We'll have + // to just drop them. + field->has_default_value_ = false; + } + + if (field->has_default_value()) { + // We can't just use field->enum_type()->FindValueByName() here + // because that locks the pool's mutex, which we have already locked + // at this point. + Symbol default_value = + LookupSymbolNoPlaceholder(proto.default_value(), + field->enum_type()->full_name()); + + if (default_value.type == Symbol::ENUM_VALUE && + default_value.enum_value_descriptor->type() == field->enum_type()) { + field->default_value_enum_ = default_value.enum_value_descriptor; + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::DEFAULT_VALUE, + "Enum type \"" + field->enum_type()->full_name() + + "\" has no value named \"" + proto.default_value() + "\"."); + } + } else if (field->enum_type()->value_count() > 0) { + // All enums must have at least one value, or we would have reported + // an error elsewhere. We use the first defined value as the default + // if a default is not explicitly defined. + field->default_value_enum_ = field->enum_type()->value(0); + } + } else { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Field with primitive type has type_name."); + } + } else { + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE || + field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Field with message or enum type missing type_name."); + } + } + + // Add the field to the fields-by-number table. + // Note: We have to do this *after* cross-linking because extensions do not + // know their containing type until now. + if (!file_tables_->AddFieldByNumber(field)) { + const FieldDescriptor* conflicting_field = + file_tables_->FindFieldByNumber(field->containing_type(), + field->number()); + if (field->is_extension()) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Extension number $0 has already been used " + "in \"$1\" by extension \"$2\".", + field->number(), + field->containing_type()->full_name(), + conflicting_field->full_name())); + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NUMBER, + strings::Substitute("Field number $0 has already been used in " + "\"$1\" by field \"$2\".", + field->number(), + field->containing_type()->full_name(), + conflicting_field->name())); + } + } + + if (field->is_extension()) { + // No need for error checking: if the extension number collided, + // we've already been informed of it by the if() above. + tables_->AddExtension(field); + } + + // Add the field to the lowercase-name and camelcase-name tables. + file_tables_->AddFieldByStylizedNames(field); +} + +void DescriptorBuilder::CrossLinkEnum( + EnumDescriptor* enum_type, const EnumDescriptorProto& proto) { + if (enum_type->options_ == NULL) { + enum_type->options_ = &EnumOptions::default_instance(); + } + + for (int i = 0; i < enum_type->value_count(); i++) { + CrossLinkEnumValue(&enum_type->values_[i], proto.value(i)); + } +} + +void DescriptorBuilder::CrossLinkEnumValue( + EnumValueDescriptor* enum_value, const EnumValueDescriptorProto& proto) { + if (enum_value->options_ == NULL) { + enum_value->options_ = &EnumValueOptions::default_instance(); + } +} + +void DescriptorBuilder::CrossLinkService( + ServiceDescriptor* service, const ServiceDescriptorProto& proto) { + if (service->options_ == NULL) { + service->options_ = &ServiceOptions::default_instance(); + } + + for (int i = 0; i < service->method_count(); i++) { + CrossLinkMethod(&service->methods_[i], proto.method(i)); + } +} + +void DescriptorBuilder::CrossLinkMethod( + MethodDescriptor* method, const MethodDescriptorProto& proto) { + if (method->options_ == NULL) { + method->options_ = &MethodOptions::default_instance(); + } + + Symbol input_type = LookupSymbol(proto.input_type(), method->full_name()); + if (input_type.IsNull()) { + AddNotDefinedError(method->full_name(), proto, + DescriptorPool::ErrorCollector::INPUT_TYPE, + proto.input_type()); + } else if (input_type.type != Symbol::MESSAGE) { + AddError(method->full_name(), proto, + DescriptorPool::ErrorCollector::INPUT_TYPE, + "\"" + proto.input_type() + "\" is not a message type."); + } else { + method->input_type_ = input_type.descriptor; + } + + Symbol output_type = LookupSymbol(proto.output_type(), method->full_name()); + if (output_type.IsNull()) { + AddNotDefinedError(method->full_name(), proto, + DescriptorPool::ErrorCollector::OUTPUT_TYPE, + proto.output_type()); + } else if (output_type.type != Symbol::MESSAGE) { + AddError(method->full_name(), proto, + DescriptorPool::ErrorCollector::OUTPUT_TYPE, + "\"" + proto.output_type() + "\" is not a message type."); + } else { + method->output_type_ = output_type.descriptor; + } +} + +// ------------------------------------------------------------------- + +#define VALIDATE_OPTIONS_FROM_ARRAY(descriptor, array_name, type) \ + for (int i = 0; i < descriptor->array_name##_count(); ++i) { \ + Validate##type##Options(descriptor->array_name##s_ + i, \ + proto.array_name(i)); \ + } + +// Determine if the file uses optimize_for = LITE_RUNTIME, being careful to +// avoid problems that exist at init time. +static bool IsLite(const FileDescriptor* file) { + // TODO(kenton): I don't even remember how many of these conditions are + // actually possible. I'm just being super-safe. + return file != NULL && + &file->options() != NULL && + &file->options() != &FileOptions::default_instance() && + file->options().optimize_for() == FileOptions::LITE_RUNTIME; +} + +void DescriptorBuilder::ValidateFileOptions(FileDescriptor* file, + const FileDescriptorProto& proto) { + VALIDATE_OPTIONS_FROM_ARRAY(file, message_type, Message); + VALIDATE_OPTIONS_FROM_ARRAY(file, enum_type, Enum); + VALIDATE_OPTIONS_FROM_ARRAY(file, service, Service); + VALIDATE_OPTIONS_FROM_ARRAY(file, extension, Field); + + // Lite files can only be imported by other Lite files. + if (!IsLite(file)) { + for (int i = 0; i < file->dependency_count(); i++) { + if (IsLite(file->dependency(i))) { + AddError( + file->name(), proto, + DescriptorPool::ErrorCollector::OTHER, + "Files that do not use optimize_for = LITE_RUNTIME cannot import " + "files which do use this option. This file is not lite, but it " + "imports \"" + file->dependency(i)->name() + "\" which is."); + break; + } + } + } +} + +void DescriptorBuilder::ValidateMessageOptions(Descriptor* message, + const DescriptorProto& proto) { + VALIDATE_OPTIONS_FROM_ARRAY(message, field, Field); + VALIDATE_OPTIONS_FROM_ARRAY(message, nested_type, Message); + VALIDATE_OPTIONS_FROM_ARRAY(message, enum_type, Enum); + VALIDATE_OPTIONS_FROM_ARRAY(message, extension, Field); +} + +void DescriptorBuilder::ValidateFieldOptions(FieldDescriptor* field, + const FieldDescriptorProto& proto) { + if (field->options().has_experimental_map_key()) { + ValidateMapKey(field, proto); + } + + // Only repeated primitive fields may be packed. + if (field->options().packed() && !field->is_packable()) { + AddError( + field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "[packed = true] can only be specified for repeated primitive fields."); + } + + // Note: Default instance may not yet be initialized here, so we have to + // avoid reading from it. + if (field->containing_type_ != NULL && + &field->containing_type()->options() != + &MessageOptions::default_instance() && + field->containing_type()->options().message_set_wire_format()) { + if (field->is_extension()) { + if (!field->is_optional() || + field->type() != FieldDescriptor::TYPE_MESSAGE) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::TYPE, + "Extensions of MessageSets must be optional messages."); + } + } else { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "MessageSets cannot have fields, only extensions."); + } + } + + // Lite extensions can only be of Lite types. + if (IsLite(field->file()) && + field->containing_type_ != NULL && + !IsLite(field->containing_type()->file())) { + AddError(field->full_name(), proto, + DescriptorPool::ErrorCollector::EXTENDEE, + "Extensions to non-lite types can only be declared in non-lite " + "files. Note that you cannot extend a non-lite type to contain " + "a lite type, but the reverse is allowed."); + } +} + +void DescriptorBuilder::ValidateEnumOptions(EnumDescriptor* enm, + const EnumDescriptorProto& proto) { + VALIDATE_OPTIONS_FROM_ARRAY(enm, value, EnumValue); +} + +void DescriptorBuilder::ValidateEnumValueOptions( + EnumValueDescriptor* enum_value, const EnumValueDescriptorProto& proto) { + // Nothing to do so far. +} +void DescriptorBuilder::ValidateServiceOptions(ServiceDescriptor* service, + const ServiceDescriptorProto& proto) { + if (IsLite(service->file()) && + (service->file()->options().cc_generic_services() || + service->file()->options().java_generic_services())) { + AddError(service->full_name(), proto, + DescriptorPool::ErrorCollector::NAME, + "Files with optimize_for = LITE_RUNTIME cannot define services " + "unless you set both options cc_generic_services and " + "java_generic_sevices to false."); + } + + VALIDATE_OPTIONS_FROM_ARRAY(service, method, Method); +} + +void DescriptorBuilder::ValidateMethodOptions(MethodDescriptor* method, + const MethodDescriptorProto& proto) { + // Nothing to do so far. +} + +void DescriptorBuilder::ValidateMapKey(FieldDescriptor* field, + const FieldDescriptorProto& proto) { + if (!field->is_repeated()) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map type is only allowed for repeated fields."); + return; + } + + if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map type is only allowed for fields with a message type."); + return; + } + + const Descriptor* item_type = field->message_type(); + if (item_type == NULL) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Could not find field type."); + return; + } + + // Find the field in item_type named by "experimental_map_key" + const string& key_name = field->options().experimental_map_key(); + const Symbol key_symbol = LookupSymbol( + key_name, + // We append ".key_name" to the containing type's name since + // LookupSymbol() searches for peers of the supplied name, not + // children of the supplied name. + item_type->full_name() + "." + key_name); + + if (key_symbol.IsNull() || key_symbol.field_descriptor->is_extension()) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "Could not find field named \"" + key_name + "\" in type \"" + + item_type->full_name() + "\"."); + return; + } + const FieldDescriptor* key_field = key_symbol.field_descriptor; + + if (key_field->is_repeated()) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map_key must not name a repeated field."); + return; + } + + if (key_field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE, + "map key must name a scalar or string field."); + return; + } + + field->experimental_map_key_ = key_field; +} + +#undef VALIDATE_OPTIONS_FROM_ARRAY + +// ------------------------------------------------------------------- + +DescriptorBuilder::OptionInterpreter::OptionInterpreter( + DescriptorBuilder* builder) : builder_(builder) { + GOOGLE_CHECK(builder_); +} + +DescriptorBuilder::OptionInterpreter::~OptionInterpreter() { +} + +bool DescriptorBuilder::OptionInterpreter::InterpretOptions( + OptionsToInterpret* options_to_interpret) { + // Note that these may be in different pools, so we can't use the same + // descriptor and reflection objects on both. + Message* options = options_to_interpret->options; + const Message* original_options = options_to_interpret->original_options; + + bool failed = false; + options_to_interpret_ = options_to_interpret; + + // Find the uninterpreted_option field in the mutable copy of the options + // and clear them, since we're about to interpret them. + const FieldDescriptor* uninterpreted_options_field = + options->GetDescriptor()->FindFieldByName("uninterpreted_option"); + GOOGLE_CHECK(uninterpreted_options_field != NULL) + << "No field named \"uninterpreted_option\" in the Options proto."; + options->GetReflection()->ClearField(options, uninterpreted_options_field); + + // Find the uninterpreted_option field in the original options. + const FieldDescriptor* original_uninterpreted_options_field = + original_options->GetDescriptor()-> + FindFieldByName("uninterpreted_option"); + GOOGLE_CHECK(original_uninterpreted_options_field != NULL) + << "No field named \"uninterpreted_option\" in the Options proto."; + + const int num_uninterpreted_options = original_options->GetReflection()-> + FieldSize(*original_options, original_uninterpreted_options_field); + for (int i = 0; i < num_uninterpreted_options; ++i) { + uninterpreted_option_ = down_cast( + &original_options->GetReflection()->GetRepeatedMessage( + *original_options, original_uninterpreted_options_field, i)); + if (!InterpretSingleOption(options)) { + // Error already added by InterpretSingleOption(). + failed = true; + break; + } + } + // Reset these, so we don't have any dangling pointers. + uninterpreted_option_ = NULL; + options_to_interpret_ = NULL; + + if (!failed) { + // InterpretSingleOption() added the interpreted options in the + // UnknownFieldSet, in case the option isn't yet known to us. Now we + // serialize the options message and deserialize it back. That way, any + // option fields that we do happen to know about will get moved from the + // UnknownFieldSet into the real fields, and thus be available right away. + // If they are not known, that's OK too. They will get reparsed into the + // UnknownFieldSet and wait there until the message is parsed by something + // that does know about the options. + string buf; + options->AppendToString(&buf); + GOOGLE_CHECK(options->ParseFromString(buf)) + << "Protocol message serialized itself in invalid fashion."; + } + + return !failed; +} + +bool DescriptorBuilder::OptionInterpreter::InterpretSingleOption( + Message* options) { + // First do some basic validation. + if (uninterpreted_option_->name_size() == 0) { + // This should never happen unless the parser has gone seriously awry or + // someone has manually created the uninterpreted option badly. + return AddNameError("Option must have a name."); + } + if (uninterpreted_option_->name(0).name_part() == "uninterpreted_option") { + return AddNameError("Option must not use reserved name " + "\"uninterpreted_option\"."); + } + + const Descriptor* options_descriptor = NULL; + // Get the options message's descriptor from the builder's pool, so that we + // get the version that knows about any extension options declared in the + // file we're currently building. The descriptor should be there as long as + // the file we're building imported "google/protobuf/descriptors.proto". + + // Note that we use DescriptorBuilder::FindSymbol(), not + // DescriptorPool::FindMessageTypeByName() because we're already holding the + // pool's mutex, and the latter method locks it again. + Symbol symbol = builder_->FindSymbolNotEnforcingDeps( + options->GetDescriptor()->full_name()); + if (!symbol.IsNull() && symbol.type == Symbol::MESSAGE) { + options_descriptor = symbol.descriptor; + } else { + // The options message's descriptor was not in the builder's pool, so use + // the standard version from the generated pool. We're not holding the + // generated pool's mutex, so we can search it the straightforward way. + options_descriptor = options->GetDescriptor(); + } + GOOGLE_CHECK(options_descriptor); + + // We iterate over the name parts to drill into the submessages until we find + // the leaf field for the option. As we drill down we remember the current + // submessage's descriptor in |descriptor| and the next field in that + // submessage in |field|. We also track the fields we're drilling down + // through in |intermediate_fields|. As we go, we reconstruct the full option + // name in |debug_msg_name|, for use in error messages. + const Descriptor* descriptor = options_descriptor; + const FieldDescriptor* field = NULL; + vector intermediate_fields; + string debug_msg_name = ""; + + for (int i = 0; i < uninterpreted_option_->name_size(); ++i) { + const string& name_part = uninterpreted_option_->name(i).name_part(); + if (debug_msg_name.size() > 0) { + debug_msg_name += "."; + } + if (uninterpreted_option_->name(i).is_extension()) { + debug_msg_name += "(" + name_part + ")"; + // Search for the extension's descriptor as an extension in the builder's + // pool. Note that we use DescriptorBuilder::LookupSymbol(), not + // DescriptorPool::FindExtensionByName(), for two reasons: 1) It allows + // relative lookups, and 2) because we're already holding the pool's + // mutex, and the latter method locks it again. + Symbol symbol = builder_->LookupSymbol(name_part, + options_to_interpret_->name_scope); + if (!symbol.IsNull() && symbol.type == Symbol::FIELD) { + field = symbol.field_descriptor; + } + // If we don't find the field then the field's descriptor was not in the + // builder's pool, but there's no point in looking in the generated + // pool. We require that you import the file that defines any extensions + // you use, so they must be present in the builder's pool. + } else { + debug_msg_name += name_part; + // Search for the field's descriptor as a regular field. + field = descriptor->FindFieldByName(name_part); + } + + if (field == NULL) { + if (get_allow_unknown(builder_->pool_)) { + // We can't find the option, but AllowUnknownDependencies() is enabled, + // so we will just leave it as uninterpreted. + AddWithoutInterpreting(*uninterpreted_option_, options); + return true; + } else { + return AddNameError("Option \"" + debug_msg_name + "\" unknown."); + } + } else if (field->containing_type() != descriptor) { + if (get_is_placeholder(field->containing_type())) { + // The field is an extension of a placeholder type, so we can't + // reliably verify whether it is a valid extension to use here (e.g. + // we don't know if it is an extension of the correct *Options message, + // or if it has a valid field number, etc.). Just leave it as + // uninterpreted instead. + AddWithoutInterpreting(*uninterpreted_option_, options); + return true; + } else { + // This can only happen if, due to some insane misconfiguration of the + // pools, we find the options message in one pool but the field in + // another. This would probably imply a hefty bug somewhere. + return AddNameError("Option field \"" + debug_msg_name + + "\" is not a field or extension of message \"" + + descriptor->name() + "\"."); + } + } else if (field->is_repeated()) { + return AddNameError("Option field \"" + debug_msg_name + + "\" is repeated. Repeated options are not " + "supported."); + } else if (i < uninterpreted_option_->name_size() - 1) { + if (field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { + return AddNameError("Option \"" + debug_msg_name + + "\" is an atomic type, not a message."); + } else { + // Drill down into the submessage. + intermediate_fields.push_back(field); + descriptor = field->message_type(); + } + } + } + + // We've found the leaf field. Now we use UnknownFieldSets to set its value + // on the options message. We do so because the message may not yet know + // about its extension fields, so we may not be able to set the fields + // directly. But the UnknownFieldSets will serialize to the same wire-format + // message, so reading that message back in once the extension fields are + // known will populate them correctly. + + // First see if the option is already set. + if (!ExamineIfOptionIsSet( + intermediate_fields.begin(), + intermediate_fields.end(), + field, debug_msg_name, + options->GetReflection()->GetUnknownFields(*options))) { + return false; // ExamineIfOptionIsSet() already added the error. + } + + + // First set the value on the UnknownFieldSet corresponding to the + // innermost message. + scoped_ptr unknown_fields(new UnknownFieldSet()); + if (!SetOptionValue(field, unknown_fields.get())) { + return false; // SetOptionValue() already added the error. + } + + // Now wrap the UnknownFieldSet with UnknownFieldSets corresponding to all + // the intermediate messages. + for (vector::reverse_iterator iter = + intermediate_fields.rbegin(); + iter != intermediate_fields.rend(); ++iter) { + scoped_ptr parent_unknown_fields(new UnknownFieldSet()); + switch ((*iter)->type()) { + case FieldDescriptor::TYPE_MESSAGE: { + io::StringOutputStream outstr( + parent_unknown_fields->AddLengthDelimited((*iter)->number())); + io::CodedOutputStream out(&outstr); + internal::WireFormat::SerializeUnknownFields(*unknown_fields, &out); + GOOGLE_CHECK(!out.HadError()) + << "Unexpected failure while serializing option submessage " + << debug_msg_name << "\"."; + break; + } + + case FieldDescriptor::TYPE_GROUP: { + parent_unknown_fields->AddGroup((*iter)->number()) + ->MergeFrom(*unknown_fields); + break; + } + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_MESSAGE: " + << (*iter)->type(); + return false; + } + unknown_fields.reset(parent_unknown_fields.release()); + } + + // Now merge the UnknownFieldSet corresponding to the top-level message into + // the options message. + options->GetReflection()->MutableUnknownFields(options)->MergeFrom( + *unknown_fields); + + return true; +} + +void DescriptorBuilder::OptionInterpreter::AddWithoutInterpreting( + const UninterpretedOption& uninterpreted_option, Message* options) { + const FieldDescriptor* field = + options->GetDescriptor()->FindFieldByName("uninterpreted_option"); + GOOGLE_CHECK(field != NULL); + + options->GetReflection()->AddMessage(options, field) + ->CopyFrom(uninterpreted_option); +} + +bool DescriptorBuilder::OptionInterpreter::ExamineIfOptionIsSet( + vector::const_iterator intermediate_fields_iter, + vector::const_iterator intermediate_fields_end, + const FieldDescriptor* innermost_field, const string& debug_msg_name, + const UnknownFieldSet& unknown_fields) { + // We do linear searches of the UnknownFieldSet and its sub-groups. This + // should be fine since it's unlikely that any one options structure will + // contain more than a handful of options. + + if (intermediate_fields_iter == intermediate_fields_end) { + // We're at the innermost submessage. + for (int i = 0; i < unknown_fields.field_count(); i++) { + if (unknown_fields.field(i).number() == innermost_field->number()) { + return AddNameError("Option \"" + debug_msg_name + + "\" was already set."); + } + } + return true; + } + + for (int i = 0; i < unknown_fields.field_count(); i++) { + if (unknown_fields.field(i).number() == + (*intermediate_fields_iter)->number()) { + const UnknownField* unknown_field = &unknown_fields.field(i); + FieldDescriptor::Type type = (*intermediate_fields_iter)->type(); + // Recurse into the next submessage. + switch (type) { + case FieldDescriptor::TYPE_MESSAGE: + if (unknown_field->type() == UnknownField::TYPE_LENGTH_DELIMITED) { + UnknownFieldSet intermediate_unknown_fields; + if (intermediate_unknown_fields.ParseFromString( + unknown_field->length_delimited()) && + !ExamineIfOptionIsSet(intermediate_fields_iter + 1, + intermediate_fields_end, + innermost_field, debug_msg_name, + intermediate_unknown_fields)) { + return false; // Error already added. + } + } + break; + + case FieldDescriptor::TYPE_GROUP: + if (unknown_field->type() == UnknownField::TYPE_GROUP) { + if (!ExamineIfOptionIsSet(intermediate_fields_iter + 1, + intermediate_fields_end, + innermost_field, debug_msg_name, + unknown_field->group())) { + return false; // Error already added. + } + } + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_MESSAGE: " << type; + return false; + } + } + } + return true; +} + +bool DescriptorBuilder::OptionInterpreter::SetOptionValue( + const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields) { + // We switch on the CppType to validate. + switch (option_field->cpp_type()) { + + case FieldDescriptor::CPPTYPE_INT32: + if (uninterpreted_option_->has_positive_int_value()) { + if (uninterpreted_option_->positive_int_value() > + static_cast(kint32max)) { + return AddValueError("Value out of range for int32 option \"" + + option_field->full_name() + "\"."); + } else { + SetInt32(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } + } else if (uninterpreted_option_->has_negative_int_value()) { + if (uninterpreted_option_->negative_int_value() < + static_cast(kint32min)) { + return AddValueError("Value out of range for int32 option \"" + + option_field->full_name() + "\"."); + } else { + SetInt32(option_field->number(), + uninterpreted_option_->negative_int_value(), + option_field->type(), unknown_fields); + } + } else { + return AddValueError("Value must be integer for int32 option \"" + + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_INT64: + if (uninterpreted_option_->has_positive_int_value()) { + if (uninterpreted_option_->positive_int_value() > + static_cast(kint64max)) { + return AddValueError("Value out of range for int64 option \"" + + option_field->full_name() + "\"."); + } else { + SetInt64(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } + } else if (uninterpreted_option_->has_negative_int_value()) { + SetInt64(option_field->number(), + uninterpreted_option_->negative_int_value(), + option_field->type(), unknown_fields); + } else { + return AddValueError("Value must be integer for int64 option \"" + + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_UINT32: + if (uninterpreted_option_->has_positive_int_value()) { + if (uninterpreted_option_->positive_int_value() > kuint32max) { + return AddValueError("Value out of range for uint32 option \"" + + option_field->name() + "\"."); + } else { + SetUInt32(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } + } else { + return AddValueError("Value must be non-negative integer for uint32 " + "option \"" + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_UINT64: + if (uninterpreted_option_->has_positive_int_value()) { + SetUInt64(option_field->number(), + uninterpreted_option_->positive_int_value(), + option_field->type(), unknown_fields); + } else { + return AddValueError("Value must be non-negative integer for uint64 " + "option \"" + option_field->full_name() + "\"."); + } + break; + + case FieldDescriptor::CPPTYPE_FLOAT: { + float value; + if (uninterpreted_option_->has_double_value()) { + value = uninterpreted_option_->double_value(); + } else if (uninterpreted_option_->has_positive_int_value()) { + value = uninterpreted_option_->positive_int_value(); + } else if (uninterpreted_option_->has_negative_int_value()) { + value = uninterpreted_option_->negative_int_value(); + } else { + return AddValueError("Value must be number for float option \"" + + option_field->full_name() + "\"."); + } + unknown_fields->AddFixed32(option_field->number(), + google::protobuf::internal::WireFormatLite::EncodeFloat(value)); + break; + } + + case FieldDescriptor::CPPTYPE_DOUBLE: { + double value; + if (uninterpreted_option_->has_double_value()) { + value = uninterpreted_option_->double_value(); + } else if (uninterpreted_option_->has_positive_int_value()) { + value = uninterpreted_option_->positive_int_value(); + } else if (uninterpreted_option_->has_negative_int_value()) { + value = uninterpreted_option_->negative_int_value(); + } else { + return AddValueError("Value must be number for double option \"" + + option_field->full_name() + "\"."); + } + unknown_fields->AddFixed64(option_field->number(), + google::protobuf::internal::WireFormatLite::EncodeDouble(value)); + break; + } + + case FieldDescriptor::CPPTYPE_BOOL: + uint64 value; + if (!uninterpreted_option_->has_identifier_value()) { + return AddValueError("Value must be identifier for boolean option " + "\"" + option_field->full_name() + "\"."); + } + if (uninterpreted_option_->identifier_value() == "true") { + value = 1; + } else if (uninterpreted_option_->identifier_value() == "false") { + value = 0; + } else { + return AddValueError("Value must be \"true\" or \"false\" for boolean " + "option \"" + option_field->full_name() + "\"."); + } + unknown_fields->AddVarint(option_field->number(), value); + break; + + case FieldDescriptor::CPPTYPE_ENUM: { + if (!uninterpreted_option_->has_identifier_value()) { + return AddValueError("Value must be identifier for enum-valued option " + "\"" + option_field->full_name() + "\"."); + } + const EnumDescriptor* enum_type = option_field->enum_type(); + const string& value_name = uninterpreted_option_->identifier_value(); + const EnumValueDescriptor* enum_value = NULL; + + if (enum_type->file()->pool() != DescriptorPool::generated_pool()) { + // Note that the enum value's fully-qualified name is a sibling of the + // enum's name, not a child of it. + string fully_qualified_name = enum_type->full_name(); + fully_qualified_name.resize(fully_qualified_name.size() - + enum_type->name().size()); + fully_qualified_name += value_name; + + // Search for the enum value's descriptor in the builder's pool. Note + // that we use DescriptorBuilder::FindSymbolNotEnforcingDeps(), not + // DescriptorPool::FindEnumValueByName() because we're already holding + // the pool's mutex, and the latter method locks it again. + Symbol symbol = + builder_->FindSymbolNotEnforcingDeps(fully_qualified_name); + if (!symbol.IsNull() && symbol.type == Symbol::ENUM_VALUE) { + if (symbol.enum_value_descriptor->type() != enum_type) { + return AddValueError("Enum type \"" + enum_type->full_name() + + "\" has no value named \"" + value_name + "\" for option \"" + + option_field->full_name() + + "\". This appears to be a value from a sibling type."); + } else { + enum_value = symbol.enum_value_descriptor; + } + } + } else { + // The enum type is in the generated pool, so we can search for the + // value there. + enum_value = enum_type->FindValueByName(value_name); + } + + if (enum_value == NULL) { + return AddValueError("Enum type \"" + + option_field->enum_type()->full_name() + + "\" has no value named \"" + value_name + "\" for " + "option \"" + option_field->full_name() + "\"."); + } else { + // Sign-extension is not a problem, since we cast directly from int32 to + // uint64, without first going through uint32. + unknown_fields->AddVarint(option_field->number(), + static_cast(static_cast(enum_value->number()))); + } + break; + } + + case FieldDescriptor::CPPTYPE_STRING: + if (!uninterpreted_option_->has_string_value()) { + return AddValueError("Value must be quoted string for string option " + "\"" + option_field->full_name() + "\"."); + } + // The string has already been unquoted and unescaped by the parser. + unknown_fields->AddLengthDelimited(option_field->number(), + uninterpreted_option_->string_value()); + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + if (!SetAggregateOption(option_field, unknown_fields)) { + return false; + } + break; + } + + return true; +} + +class DescriptorBuilder::OptionInterpreter::AggregateOptionFinder + : public TextFormat::Finder { + public: + DescriptorBuilder* builder_; + + virtual const FieldDescriptor* FindExtension( + Message* message, const string& name) const { + assert_mutex_held(builder_->pool_); + Symbol result = builder_->LookupSymbolNoPlaceholder( + name, message->GetDescriptor()->full_name()); + if (result.type == Symbol::FIELD && + result.field_descriptor->is_extension()) { + return result.field_descriptor; + } else { + return NULL; + } + } +}; + +// A custom error collector to record any text-format parsing errors +namespace { +class AggregateErrorCollector : public io::ErrorCollector { + public: + string error_; + + virtual void AddError(int line, int column, const string& message) { + if (!error_.empty()) { + error_ += "; "; + } + error_ += message; + } + + virtual void AddWarning(int line, int column, const string& message) { + // Ignore warnings + } +}; +} + +// We construct a dynamic message of the type corresponding to +// option_field, parse the supplied text-format string into this +// message, and serialize the resulting message to produce the value. +bool DescriptorBuilder::OptionInterpreter::SetAggregateOption( + const FieldDescriptor* option_field, + UnknownFieldSet* unknown_fields) { + if (!uninterpreted_option_->has_aggregate_value()) { + return AddValueError("Option \"" + option_field->full_name() + + "\" is a message. To set the entire message, use " + "syntax like \"" + option_field->name() + + " = { }\". " + "To set fields within it, use " + "syntax like \"" + option_field->name() + + ".foo = value\"."); + } + + const Descriptor* type = option_field->message_type(); + scoped_ptr dynamic(dynamic_factory_.GetPrototype(type)->New()); + GOOGLE_CHECK(dynamic.get() != NULL) + << "Could not create an instance of " << option_field->DebugString(); + + AggregateErrorCollector collector; + AggregateOptionFinder finder; + finder.builder_ = builder_; + TextFormat::Parser parser; + parser.RecordErrorsTo(&collector); + parser.SetFinder(&finder); + if (!parser.ParseFromString(uninterpreted_option_->aggregate_value(), + dynamic.get())) { + AddValueError("Error while parsing option value for \"" + + option_field->name() + "\": " + collector.error_); + return false; + } else { + string serial; + dynamic->SerializeToString(&serial); // Never fails + unknown_fields->AddLengthDelimited(option_field->number(), serial); + return true; + } +} + +void DescriptorBuilder::OptionInterpreter::SetInt32(int number, int32 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_INT32: + unknown_fields->AddVarint(number, + static_cast(static_cast(value))); + break; + + case FieldDescriptor::TYPE_SFIXED32: + unknown_fields->AddFixed32(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_SINT32: + unknown_fields->AddVarint(number, + google::protobuf::internal::WireFormatLite::ZigZagEncode32(value)); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_INT32: " << type; + break; + } +} + +void DescriptorBuilder::OptionInterpreter::SetInt64(int number, int64 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_INT64: + unknown_fields->AddVarint(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_SFIXED64: + unknown_fields->AddFixed64(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_SINT64: + unknown_fields->AddVarint(number, + google::protobuf::internal::WireFormatLite::ZigZagEncode64(value)); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_INT64: " << type; + break; + } +} + +void DescriptorBuilder::OptionInterpreter::SetUInt32(int number, uint32 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_UINT32: + unknown_fields->AddVarint(number, static_cast(value)); + break; + + case FieldDescriptor::TYPE_FIXED32: + unknown_fields->AddFixed32(number, static_cast(value)); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_UINT32: " << type; + break; + } +} + +void DescriptorBuilder::OptionInterpreter::SetUInt64(int number, uint64 value, + FieldDescriptor::Type type, UnknownFieldSet* unknown_fields) { + switch (type) { + case FieldDescriptor::TYPE_UINT64: + unknown_fields->AddVarint(number, value); + break; + + case FieldDescriptor::TYPE_FIXED64: + unknown_fields->AddFixed64(number, value); + break; + + default: + GOOGLE_LOG(FATAL) << "Invalid wire type for CPPTYPE_UINT64: " << type; + break; + } +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h new file mode 100644 index 000000000..7f87dd809 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h @@ -0,0 +1,1367 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains classes which describe a type of protocol message. +// You can use a message's descriptor to learn at runtime what fields +// it contains and what the types of those fields are. The Message +// interface also allows you to dynamically access and modify individual +// fields by passing the FieldDescriptor of the field you are interested +// in. +// +// Most users will not care about descriptors, because they will write +// code specific to certain protocol types and will simply use the classes +// generated by the protocol compiler directly. Advanced users who want +// to operate on arbitrary types (not known at compile time) may want to +// read descriptors in order to learn about the contents of a message. +// A very small number of users will want to construct their own +// Descriptors, either because they are implementing Message manually or +// because they are writing something like the protocol compiler. +// +// For an example of how you might use descriptors, see the code example +// at the top of message.h. + +#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_H__ +#define GOOGLE_PROTOBUF_DESCRIPTOR_H__ + +#include +#include +#include + + +namespace google { +namespace protobuf { + +// Defined in this file. +class Descriptor; +class FieldDescriptor; +class EnumDescriptor; +class EnumValueDescriptor; +class ServiceDescriptor; +class MethodDescriptor; +class FileDescriptor; +class DescriptorDatabase; +class DescriptorPool; + +// Defined in descriptor.proto +class DescriptorProto; +class FieldDescriptorProto; +class EnumDescriptorProto; +class EnumValueDescriptorProto; +class ServiceDescriptorProto; +class MethodDescriptorProto; +class FileDescriptorProto; +class MessageOptions; +class FieldOptions; +class EnumOptions; +class EnumValueOptions; +class ServiceOptions; +class MethodOptions; +class FileOptions; +class UninterpretedOption; + +// Defined in message.h +class Message; + +// Defined in descriptor.cc +class DescriptorBuilder; +class FileDescriptorTables; + +// Defined in unknown_field_set.h. +class UnknownField; + +// Describes a type of protocol message, or a particular group within a +// message. To obtain the Descriptor for a given message object, call +// Message::GetDescriptor(). Generated message classes also have a +// static method called descriptor() which returns the type's descriptor. +// Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT Descriptor { + public: + // The name of the message type, not including its scope. + const string& name() const; + + // The fully-qualified name of the message type, scope delimited by + // periods. For example, message type "Foo" which is declared in package + // "bar" has full name "bar.Foo". If a type "Baz" is nested within + // Foo, Baz's full_name is "bar.Foo.Baz". To get only the part that + // comes after the last '.', use name(). + const string& full_name() const; + + // Index of this descriptor within the file or containing type's message + // type array. + int index() const; + + // The .proto file in which this message type was defined. Never NULL. + const FileDescriptor* file() const; + + // If this Descriptor describes a nested type, this returns the type + // in which it is nested. Otherwise, returns NULL. + const Descriptor* containing_type() const; + + // Get options for this message type. These are specified in the .proto file + // by placing lines like "option foo = 1234;" in the message definition. + // Allowed options are defined by MessageOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const MessageOptions& options() const; + + // Write the contents of this Descriptor into the given DescriptorProto. + // The target DescriptorProto must be clear before calling this; if it + // isn't, the result may be garbage. + void CopyTo(DescriptorProto* proto) const; + + // Write the contents of this decriptor in a human-readable form. Output + // will be suitable for re-parsing. + string DebugString() const; + + // Field stuff ----------------------------------------------------- + + // The number of fields in this message type. + int field_count() const; + // Gets a field by index, where 0 <= index < field_count(). + // These are returned in the order they were defined in the .proto file. + const FieldDescriptor* field(int index) const; + + // Looks up a field by declared tag number. Returns NULL if no such field + // exists. + const FieldDescriptor* FindFieldByNumber(int number) const; + // Looks up a field by name. Returns NULL if no such field exists. + const FieldDescriptor* FindFieldByName(const string& name) const; + + // Looks up a field by lowercased name (as returned by lowercase_name()). + // This lookup may be ambiguous if multiple field names differ only by case, + // in which case the field returned is chosen arbitrarily from the matches. + const FieldDescriptor* FindFieldByLowercaseName( + const string& lowercase_name) const; + + // Looks up a field by camel-case name (as returned by camelcase_name()). + // This lookup may be ambiguous if multiple field names differ in a way that + // leads them to have identical camel-case names, in which case the field + // returned is chosen arbitrarily from the matches. + const FieldDescriptor* FindFieldByCamelcaseName( + const string& camelcase_name) const; + + // Nested type stuff ----------------------------------------------- + + // The number of nested types in this message type. + int nested_type_count() const; + // Gets a nested type by index, where 0 <= index < nested_type_count(). + // These are returned in the order they were defined in the .proto file. + const Descriptor* nested_type(int index) const; + + // Looks up a nested type by name. Returns NULL if no such nested type + // exists. + const Descriptor* FindNestedTypeByName(const string& name) const; + + // Enum stuff ------------------------------------------------------ + + // The number of enum types in this message type. + int enum_type_count() const; + // Gets an enum type by index, where 0 <= index < enum_type_count(). + // These are returned in the order they were defined in the .proto file. + const EnumDescriptor* enum_type(int index) const; + + // Looks up an enum type by name. Returns NULL if no such enum type exists. + const EnumDescriptor* FindEnumTypeByName(const string& name) const; + + // Looks up an enum value by name, among all enum types in this message. + // Returns NULL if no such value exists. + const EnumValueDescriptor* FindEnumValueByName(const string& name) const; + + // Extensions ------------------------------------------------------ + + // A range of field numbers which are designated for third-party + // extensions. + struct ExtensionRange { + int start; // inclusive + int end; // exclusive + }; + + // The number of extension ranges in this message type. + int extension_range_count() const; + // Gets an extension range by index, where 0 <= index < + // extension_range_count(). These are returned in the order they were defined + // in the .proto file. + const ExtensionRange* extension_range(int index) const; + + // Returns true if the number is in one of the extension ranges. + bool IsExtensionNumber(int number) const; + + // The number of extensions -- extending *other* messages -- that were + // defined nested within this message type's scope. + int extension_count() const; + // Get an extension by index, where 0 <= index < extension_count(). + // These are returned in the order they were defined in the .proto file. + const FieldDescriptor* extension(int index) const; + + // Looks up a named extension (which extends some *other* message type) + // defined within this message type's scope. + const FieldDescriptor* FindExtensionByName(const string& name) const; + + // Similar to FindFieldByLowercaseName(), but finds extensions defined within + // this message type's scope. + const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; + + // Similar to FindFieldByCamelcaseName(), but finds extensions defined within + // this message type's scope. + const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; + + private: + typedef MessageOptions OptionsType; + + // Internal version of DebugString; controls the level of indenting for + // correct depth + void DebugString(int depth, string *contents) const; + + const string* name_; + const string* full_name_; + const FileDescriptor* file_; + const Descriptor* containing_type_; + const MessageOptions* options_; + + // True if this is a placeholder for an unknown type. + bool is_placeholder_; + // True if this is a placeholder and the type name wasn't fully-qualified. + bool is_unqualified_placeholder_; + + int field_count_; + FieldDescriptor* fields_; + int nested_type_count_; + Descriptor* nested_types_; + int enum_type_count_; + EnumDescriptor* enum_types_; + int extension_range_count_; + ExtensionRange* extension_ranges_; + int extension_count_; + FieldDescriptor* extensions_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in descriptor.cc + // and update them to initialize the field. + + // Must be constructed using DescriptorPool. + Descriptor() {} + friend class DescriptorBuilder; + friend class EnumDescriptor; + friend class FieldDescriptor; + friend class MethodDescriptor; + friend class FileDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Descriptor); +}; + +// Describes a single field of a message. To get the descriptor for a given +// field, first get the Descriptor for the message in which it is defined, +// then call Descriptor::FindFieldByName(). To get a FieldDescriptor for +// an extension, do one of the following: +// - Get the Descriptor or FileDescriptor for its containing scope, then +// call Descriptor::FindExtensionByName() or +// FileDescriptor::FindExtensionByName(). +// - Given a DescriptorPool, call DescriptorPool::FindExtensionByNumber(). +// - Given a Reflection for a message object, call +// Reflection::FindKnownExtensionByName() or +// Reflection::FindKnownExtensionByNumber(). +// Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT FieldDescriptor { + public: + // Identifies a field type. 0 is reserved for errors. The order is weird + // for historical reasons. Types 12 and up are new in proto2. + enum Type { + TYPE_DOUBLE = 1, // double, exactly eight bytes on the wire. + TYPE_FLOAT = 2, // float, exactly four bytes on the wire. + TYPE_INT64 = 3, // int64, varint on the wire. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. + TYPE_UINT64 = 4, // uint64, varint on the wire. + TYPE_INT32 = 5, // int32, varint on the wire. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. + TYPE_FIXED64 = 6, // uint64, exactly eight bytes on the wire. + TYPE_FIXED32 = 7, // uint32, exactly four bytes on the wire. + TYPE_BOOL = 8, // bool, varint on the wire. + TYPE_STRING = 9, // UTF-8 text. + TYPE_GROUP = 10, // Tag-delimited message. Deprecated. + TYPE_MESSAGE = 11, // Length-delimited message. + + TYPE_BYTES = 12, // Arbitrary byte array. + TYPE_UINT32 = 13, // uint32, varint on the wire + TYPE_ENUM = 14, // Enum, varint on the wire + TYPE_SFIXED32 = 15, // int32, exactly four bytes on the wire + TYPE_SFIXED64 = 16, // int64, exactly eight bytes on the wire + TYPE_SINT32 = 17, // int32, ZigZag-encoded varint on the wire + TYPE_SINT64 = 18, // int64, ZigZag-encoded varint on the wire + + MAX_TYPE = 18, // Constant useful for defining lookup tables + // indexed by Type. + }; + + // Specifies the C++ data type used to represent the field. There is a + // fixed mapping from Type to CppType where each Type maps to exactly one + // CppType. 0 is reserved for errors. + enum CppType { + CPPTYPE_INT32 = 1, // TYPE_INT32, TYPE_SINT32, TYPE_SFIXED32 + CPPTYPE_INT64 = 2, // TYPE_INT64, TYPE_SINT64, TYPE_SFIXED64 + CPPTYPE_UINT32 = 3, // TYPE_UINT32, TYPE_FIXED32 + CPPTYPE_UINT64 = 4, // TYPE_UINT64, TYPE_FIXED64 + CPPTYPE_DOUBLE = 5, // TYPE_DOUBLE + CPPTYPE_FLOAT = 6, // TYPE_FLOAT + CPPTYPE_BOOL = 7, // TYPE_BOOL + CPPTYPE_ENUM = 8, // TYPE_ENUM + CPPTYPE_STRING = 9, // TYPE_STRING, TYPE_BYTES + CPPTYPE_MESSAGE = 10, // TYPE_MESSAGE, TYPE_GROUP + + MAX_CPPTYPE = 10, // Constant useful for defining lookup tables + // indexed by CppType. + }; + + // Identifies whether the field is optional, required, or repeated. 0 is + // reserved for errors. + enum Label { + LABEL_OPTIONAL = 1, // optional + LABEL_REQUIRED = 2, // required + LABEL_REPEATED = 3, // repeated + + MAX_LABEL = 3, // Constant useful for defining lookup tables + // indexed by Label. + }; + + // Valid field numbers are positive integers up to kMaxNumber. + static const int kMaxNumber = (1 << 29) - 1; + + // First field number reserved for the protocol buffer library implementation. + // Users may not declare fields that use reserved numbers. + static const int kFirstReservedNumber = 19000; + // Last field number reserved for the protocol buffer library implementation. + // Users may not declare fields that use reserved numbers. + static const int kLastReservedNumber = 19999; + + const string& name() const; // Name of this field within the message. + const string& full_name() const; // Fully-qualified name of the field. + const FileDescriptor* file() const;// File in which this field was defined. + bool is_extension() const; // Is this an extension field? + int number() const; // Declared tag number. + + // Same as name() except converted to lower-case. This (and especially the + // FindFieldByLowercaseName() method) can be useful when parsing formats + // which prefer to use lowercase naming style. (Although, technically + // field names should be lowercased anyway according to the protobuf style + // guide, so this only makes a difference when dealing with old .proto files + // which do not follow the guide.) + const string& lowercase_name() const; + + // Same as name() except converted to camel-case. In this conversion, any + // time an underscore appears in the name, it is removed and the next + // letter is capitalized. Furthermore, the first letter of the name is + // lower-cased. Examples: + // FooBar -> fooBar + // foo_bar -> fooBar + // fooBar -> fooBar + // This (and especially the FindFieldByCamelcaseName() method) can be useful + // when parsing formats which prefer to use camel-case naming style. + const string& camelcase_name() const; + + Type type() const; // Declared type of this field. + CppType cpp_type() const; // C++ type of this field. + Label label() const; // optional/required/repeated + + bool is_required() const; // shorthand for label() == LABEL_REQUIRED + bool is_optional() const; // shorthand for label() == LABEL_OPTIONAL + bool is_repeated() const; // shorthand for label() == LABEL_REPEATED + bool is_packable() const; // shorthand for is_repeated() && + // IsTypePackable(type()) + + // Index of this field within the message's field array, or the file or + // extension scope's extensions array. + int index() const; + + // Does this field have an explicitly-declared default value? + bool has_default_value() const; + + // Get the field default value if cpp_type() == CPPTYPE_INT32. If no + // explicit default was defined, the default is 0. + int32 default_value_int32() const; + // Get the field default value if cpp_type() == CPPTYPE_INT64. If no + // explicit default was defined, the default is 0. + int64 default_value_int64() const; + // Get the field default value if cpp_type() == CPPTYPE_UINT32. If no + // explicit default was defined, the default is 0. + uint32 default_value_uint32() const; + // Get the field default value if cpp_type() == CPPTYPE_UINT64. If no + // explicit default was defined, the default is 0. + uint64 default_value_uint64() const; + // Get the field default value if cpp_type() == CPPTYPE_FLOAT. If no + // explicit default was defined, the default is 0.0. + float default_value_float() const; + // Get the field default value if cpp_type() == CPPTYPE_DOUBLE. If no + // explicit default was defined, the default is 0.0. + double default_value_double() const; + // Get the field default value if cpp_type() == CPPTYPE_BOOL. If no + // explicit default was defined, the default is false. + bool default_value_bool() const; + // Get the field default value if cpp_type() == CPPTYPE_ENUM. If no + // explicit default was defined, the default is the first value defined + // in the enum type (all enum types are required to have at least one value). + // This never returns NULL. + const EnumValueDescriptor* default_value_enum() const; + // Get the field default value if cpp_type() == CPPTYPE_STRING. If no + // explicit default was defined, the default is the empty string. + const string& default_value_string() const; + + // The Descriptor for the message of which this is a field. For extensions, + // this is the extended type. Never NULL. + const Descriptor* containing_type() const; + + // An extension may be declared within the scope of another message. If this + // field is an extension (is_extension() is true), then extension_scope() + // returns that message, or NULL if the extension was declared at global + // scope. If this is not an extension, extension_scope() is undefined (may + // assert-fail). + const Descriptor* extension_scope() const; + + // If type is TYPE_MESSAGE or TYPE_GROUP, returns a descriptor for the + // message or the group type. Otherwise, undefined. + const Descriptor* message_type() const; + // If type is TYPE_ENUM, returns a descriptor for the enum. Otherwise, + // undefined. + const EnumDescriptor* enum_type() const; + + // EXPERIMENTAL; DO NOT USE. + // If this field is a map field, experimental_map_key() is the field + // that is the key for this map. + // experimental_map_key()->containing_type() is the same as message_type(). + const FieldDescriptor* experimental_map_key() const; + + // Get the FieldOptions for this field. This includes things listed in + // square brackets after the field definition. E.g., the field: + // optional string text = 1 [ctype=CORD]; + // has the "ctype" option set. Allowed options are defined by FieldOptions + // in google/protobuf/descriptor.proto, and any available extensions of that + // message. + const FieldOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(FieldDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + // Helper method to get the CppType for a particular Type. + static CppType TypeToCppType(Type type); + + // Return true iff [packed = true] is valid for fields of this type. + static inline bool IsTypePackable(Type field_type); + + private: + typedef FieldOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(int depth, string *contents) const; + + // formats the default value appropriately and returns it as a string. + // Must have a default value to call this. If quote_string_type is true, then + // types of CPPTYPE_STRING whill be surrounded by quotes and CEscaped. + string DefaultValueAsString(bool quote_string_type) const; + + const string* name_; + const string* full_name_; + const string* lowercase_name_; + const string* camelcase_name_; + const FileDescriptor* file_; + int number_; + Type type_; + Label label_; + bool is_extension_; + const Descriptor* containing_type_; + const Descriptor* extension_scope_; + const Descriptor* message_type_; + const EnumDescriptor* enum_type_; + const FieldDescriptor* experimental_map_key_; + const FieldOptions* options_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + bool has_default_value_; + union { + int32 default_value_int32_; + int64 default_value_int64_; + uint32 default_value_uint32_; + uint64 default_value_uint64_; + float default_value_float_; + double default_value_double_; + bool default_value_bool_; + + const EnumValueDescriptor* default_value_enum_; + const string* default_value_string_; + }; + + static const CppType kTypeToCppTypeMap[MAX_TYPE + 1]; + + static const char * const kTypeToName[MAX_TYPE + 1]; + + static const char * const kLabelToName[MAX_LABEL + 1]; + + // Must be constructed using DescriptorPool. + FieldDescriptor() {} + friend class DescriptorBuilder; + friend class FileDescriptor; + friend class Descriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FieldDescriptor); +}; + +// Describes an enum type defined in a .proto file. To get the EnumDescriptor +// for a generated enum type, call TypeName_descriptor(). Use DescriptorPool +// to construct your own descriptors. +class LIBPROTOBUF_EXPORT EnumDescriptor { + public: + // The name of this enum type in the containing scope. + const string& name() const; + + // The fully-qualified name of the enum type, scope delimited by periods. + const string& full_name() const; + + // Index of this enum within the file or containing message's enum array. + int index() const; + + // The .proto file in which this enum type was defined. Never NULL. + const FileDescriptor* file() const; + + // The number of values for this EnumDescriptor. Guaranteed to be greater + // than zero. + int value_count() const; + // Gets a value by index, where 0 <= index < value_count(). + // These are returned in the order they were defined in the .proto file. + const EnumValueDescriptor* value(int index) const; + + // Looks up a value by name. Returns NULL if no such value exists. + const EnumValueDescriptor* FindValueByName(const string& name) const; + // Looks up a value by number. Returns NULL if no such value exists. If + // multiple values have this number, the first one defined is returned. + const EnumValueDescriptor* FindValueByNumber(int number) const; + + // If this enum type is nested in a message type, this is that message type. + // Otherwise, NULL. + const Descriptor* containing_type() const; + + // Get options for this enum type. These are specified in the .proto file by + // placing lines like "option foo = 1234;" in the enum definition. Allowed + // options are defined by EnumOptions in google/protobuf/descriptor.proto, + // and any available extensions of that message. + const EnumOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(EnumDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + private: + typedef EnumOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(int depth, string *contents) const; + + const string* name_; + const string* full_name_; + const FileDescriptor* file_; + const Descriptor* containing_type_; + const EnumOptions* options_; + + // True if this is a placeholder for an unknown type. + bool is_placeholder_; + // True if this is a placeholder and the type name wasn't fully-qualified. + bool is_unqualified_placeholder_; + + int value_count_; + EnumValueDescriptor* values_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + EnumDescriptor() {} + friend class DescriptorBuilder; + friend class Descriptor; + friend class FieldDescriptor; + friend class EnumValueDescriptor; + friend class FileDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumDescriptor); +}; + +// Describes an individual enum constant of a particular type. To get the +// EnumValueDescriptor for a given enum value, first get the EnumDescriptor +// for its type, then use EnumDescriptor::FindValueByName() or +// EnumDescriptor::FindValueByNumber(). Use DescriptorPool to construct +// your own descriptors. +class LIBPROTOBUF_EXPORT EnumValueDescriptor { + public: + const string& name() const; // Name of this enum constant. + int index() const; // Index within the enums's Descriptor. + int number() const; // Numeric value of this enum constant. + + // The full_name of an enum value is a sibling symbol of the enum type. + // e.g. the full name of FieldDescriptorProto::TYPE_INT32 is actually + // "google.protobuf.FieldDescriptorProto.TYPE_INT32", NOT + // "google.protobuf.FieldDescriptorProto.Type.TYPE_INT32". This is to conform + // with C++ scoping rules for enums. + const string& full_name() const; + + // The type of this value. Never NULL. + const EnumDescriptor* type() const; + + // Get options for this enum value. These are specified in the .proto file + // by adding text like "[foo = 1234]" after an enum value definition. + // Allowed options are defined by EnumValueOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const EnumValueOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(EnumValueDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + private: + typedef EnumValueOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(int depth, string *contents) const; + + const string* name_; + const string* full_name_; + int number_; + const EnumDescriptor* type_; + const EnumValueOptions* options_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() + // in descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + EnumValueDescriptor() {} + friend class DescriptorBuilder; + friend class EnumDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EnumValueDescriptor); +}; + +// Describes an RPC service. To get the ServiceDescriptor for a service, +// call Service::GetDescriptor(). Generated service classes also have a +// static method called descriptor() which returns the type's +// ServiceDescriptor. Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT ServiceDescriptor { + public: + // The name of the service, not including its containing scope. + const string& name() const; + // The fully-qualified name of the service, scope delimited by periods. + const string& full_name() const; + // Index of this service within the file's services array. + int index() const; + + // The .proto file in which this service was defined. Never NULL. + const FileDescriptor* file() const; + + // Get options for this service type. These are specified in the .proto file + // by placing lines like "option foo = 1234;" in the service definition. + // Allowed options are defined by ServiceOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const ServiceOptions& options() const; + + // The number of methods this service defines. + int method_count() const; + // Gets a MethodDescriptor by index, where 0 <= index < method_count(). + // These are returned in the order they were defined in the .proto file. + const MethodDescriptor* method(int index) const; + + // Look up a MethodDescriptor by name. + const MethodDescriptor* FindMethodByName(const string& name) const; + + // See Descriptor::CopyTo(). + void CopyTo(ServiceDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + private: + typedef ServiceOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(string *contents) const; + + const string* name_; + const string* full_name_; + const FileDescriptor* file_; + const ServiceOptions* options_; + int method_count_; + MethodDescriptor* methods_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + ServiceDescriptor() {} + friend class DescriptorBuilder; + friend class FileDescriptor; + friend class MethodDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ServiceDescriptor); +}; + +// Describes an individual service method. To obtain a MethodDescriptor given +// a service, first get its ServiceDescriptor, then call +// ServiceDescriptor::FindMethodByName(). Use DescriptorPool to construct your +// own descriptors. +class LIBPROTOBUF_EXPORT MethodDescriptor { + public: + // Name of this method, not including containing scope. + const string& name() const; + // The fully-qualified name of the method, scope delimited by periods. + const string& full_name() const; + // Index within the service's Descriptor. + int index() const; + + // Gets the service to which this method belongs. Never NULL. + const ServiceDescriptor* service() const; + + // Gets the type of protocol message which this method accepts as input. + const Descriptor* input_type() const; + // Gets the type of protocol message which this message produces as output. + const Descriptor* output_type() const; + + // Get options for this method. These are specified in the .proto file by + // placing lines like "option foo = 1234;" in curly-braces after a method + // declaration. Allowed options are defined by MethodOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const MethodOptions& options() const; + + // See Descriptor::CopyTo(). + void CopyTo(MethodDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + private: + typedef MethodOptions OptionsType; + + // See Descriptor::DebugString(). + void DebugString(int depth, string *contents) const; + + const string* name_; + const string* full_name_; + const ServiceDescriptor* service_; + const Descriptor* input_type_; + const Descriptor* output_type_; + const MethodOptions* options_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + // Must be constructed using DescriptorPool. + MethodDescriptor() {} + friend class DescriptorBuilder; + friend class ServiceDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MethodDescriptor); +}; + +// Describes a whole .proto file. To get the FileDescriptor for a compiled-in +// file, get the descriptor for something defined in that file and call +// descriptor->file(). Use DescriptorPool to construct your own descriptors. +class LIBPROTOBUF_EXPORT FileDescriptor { + public: + // The filename, relative to the source tree. + // e.g. "google/protobuf/descriptor.proto" + const string& name() const; + + // The package, e.g. "google.protobuf.compiler". + const string& package() const; + + // The DescriptorPool in which this FileDescriptor and all its contents were + // allocated. Never NULL. + const DescriptorPool* pool() const; + + // The number of files imported by this one. + int dependency_count() const; + // Gets an imported file by index, where 0 <= index < dependency_count(). + // These are returned in the order they were defined in the .proto file. + const FileDescriptor* dependency(int index) const; + + // Number of top-level message types defined in this file. (This does not + // include nested types.) + int message_type_count() const; + // Gets a top-level message type, where 0 <= index < message_type_count(). + // These are returned in the order they were defined in the .proto file. + const Descriptor* message_type(int index) const; + + // Number of top-level enum types defined in this file. (This does not + // include nested types.) + int enum_type_count() const; + // Gets a top-level enum type, where 0 <= index < enum_type_count(). + // These are returned in the order they were defined in the .proto file. + const EnumDescriptor* enum_type(int index) const; + + // Number of services defined in this file. + int service_count() const; + // Gets a service, where 0 <= index < service_count(). + // These are returned in the order they were defined in the .proto file. + const ServiceDescriptor* service(int index) const; + + // Number of extensions defined at file scope. (This does not include + // extensions nested within message types.) + int extension_count() const; + // Gets an extension's descriptor, where 0 <= index < extension_count(). + // These are returned in the order they were defined in the .proto file. + const FieldDescriptor* extension(int index) const; + + // Get options for this file. These are specified in the .proto file by + // placing lines like "option foo = 1234;" at the top level, outside of any + // other definitions. Allowed options are defined by FileOptions in + // google/protobuf/descriptor.proto, and any available extensions of that + // message. + const FileOptions& options() const; + + // Find a top-level message type by name. Returns NULL if not found. + const Descriptor* FindMessageTypeByName(const string& name) const; + // Find a top-level enum type by name. Returns NULL if not found. + const EnumDescriptor* FindEnumTypeByName(const string& name) const; + // Find an enum value defined in any top-level enum by name. Returns NULL if + // not found. + const EnumValueDescriptor* FindEnumValueByName(const string& name) const; + // Find a service definition by name. Returns NULL if not found. + const ServiceDescriptor* FindServiceByName(const string& name) const; + // Find a top-level extension definition by name. Returns NULL if not found. + const FieldDescriptor* FindExtensionByName(const string& name) const; + // Similar to FindExtensionByName(), but searches by lowercased-name. See + // Descriptor::FindFieldByLowercaseName(). + const FieldDescriptor* FindExtensionByLowercaseName(const string& name) const; + // Similar to FindExtensionByName(), but searches by camelcased-name. See + // Descriptor::FindFieldByCamelcaseName(). + const FieldDescriptor* FindExtensionByCamelcaseName(const string& name) const; + + // See Descriptor::CopyTo(). + void CopyTo(FileDescriptorProto* proto) const; + + // See Descriptor::DebugString(). + string DebugString() const; + + private: + typedef FileOptions OptionsType; + + const string* name_; + const string* package_; + const DescriptorPool* pool_; + int dependency_count_; + const FileDescriptor** dependencies_; + int message_type_count_; + Descriptor* message_types_; + int enum_type_count_; + EnumDescriptor* enum_types_; + int service_count_; + ServiceDescriptor* services_; + int extension_count_; + FieldDescriptor* extensions_; + const FileOptions* options_; + + const FileDescriptorTables* tables_; + // IMPORTANT: If you add a new field, make sure to search for all instances + // of Allocate() and AllocateArray() in + // descriptor.cc and update them to initialize the field. + + FileDescriptor() {} + friend class DescriptorBuilder; + friend class Descriptor; + friend class FieldDescriptor; + friend class EnumDescriptor; + friend class ServiceDescriptor; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileDescriptor); +}; + +// =================================================================== + +// Used to construct descriptors. +// +// Normally you won't want to build your own descriptors. Message classes +// constructed by the protocol compiler will provide them for you. However, +// if you are implementing Message on your own, or if you are writing a +// program which can operate on totally arbitrary types and needs to load +// them from some sort of database, you might need to. +// +// Since Descriptors are composed of a whole lot of cross-linked bits of +// data that would be a pain to put together manually, the +// DescriptorPool class is provided to make the process easier. It can +// take a FileDescriptorProto (defined in descriptor.proto), validate it, +// and convert it to a set of nicely cross-linked Descriptors. +// +// DescriptorPool also helps with memory management. Descriptors are +// composed of many objects containing static data and pointers to each +// other. In all likelihood, when it comes time to delete this data, +// you'll want to delete it all at once. In fact, it is not uncommon to +// have a whole pool of descriptors all cross-linked with each other which +// you wish to delete all at once. This class represents such a pool, and +// handles the memory management for you. +// +// You can also search for descriptors within a DescriptorPool by name, and +// extensions by number. +class LIBPROTOBUF_EXPORT DescriptorPool { + public: + // Create a normal, empty DescriptorPool. + DescriptorPool(); + + // Constructs a DescriptorPool that, when it can't find something among the + // descriptors already in the pool, looks for it in the given + // DescriptorDatabase. + // Notes: + // - If a DescriptorPool is constructed this way, its BuildFile*() methods + // must not be called (they will assert-fail). The only way to populate + // the pool with descriptors is to call the Find*By*() methods. + // - The Find*By*() methods may block the calling thread if the + // DescriptorDatabase blocks. This in turn means that parsing messages + // may block if they need to look up extensions. + // - The Find*By*() methods will use mutexes for thread-safety, thus making + // them slower even when they don't have to fall back to the database. + // In fact, even the Find*By*() methods of descriptor objects owned by + // this pool will be slower, since they will have to obtain locks too. + // - An ErrorCollector may optionally be given to collect validation errors + // in files loaded from the database. If not given, errors will be printed + // to GOOGLE_LOG(ERROR). Remember that files are built on-demand, so this + // ErrorCollector may be called from any thread that calls one of the + // Find*By*() methods. + class ErrorCollector; + explicit DescriptorPool(DescriptorDatabase* fallback_database, + ErrorCollector* error_collector = NULL); + + ~DescriptorPool(); + + // Get a pointer to the generated pool. Generated protocol message classes + // which are compiled into the binary will allocate their descriptors in + // this pool. Do not add your own descriptors to this pool. + static const DescriptorPool* generated_pool(); + + // Find a FileDescriptor in the pool by file name. Returns NULL if not + // found. + const FileDescriptor* FindFileByName(const string& name) const; + + // Find the FileDescriptor in the pool which defines the given symbol. + // If any of the Find*ByName() methods below would succeed, then this is + // equivalent to calling that method and calling the result's file() method. + // Otherwise this returns NULL. + const FileDescriptor* FindFileContainingSymbol( + const string& symbol_name) const; + + // Looking up descriptors ------------------------------------------ + // These find descriptors by fully-qualified name. These will find both + // top-level descriptors and nested descriptors. They return NULL if not + // found. + + const Descriptor* FindMessageTypeByName(const string& name) const; + const FieldDescriptor* FindFieldByName(const string& name) const; + const FieldDescriptor* FindExtensionByName(const string& name) const; + const EnumDescriptor* FindEnumTypeByName(const string& name) const; + const EnumValueDescriptor* FindEnumValueByName(const string& name) const; + const ServiceDescriptor* FindServiceByName(const string& name) const; + const MethodDescriptor* FindMethodByName(const string& name) const; + + // Finds an extension of the given type by number. The extendee must be + // a member of this DescriptorPool or one of its underlays. + const FieldDescriptor* FindExtensionByNumber(const Descriptor* extendee, + int number) const; + + // Finds extensions of extendee. The extensions will be appended to + // out in an undefined order. Only extensions defined directly in + // this DescriptorPool or one of its underlays are guaranteed to be + // found: extensions defined in the fallback database might not be found + // depending on the database implementation. + void FindAllExtensions(const Descriptor* extendee, + vector* out) const; + + // Building descriptors -------------------------------------------- + + // When converting a FileDescriptorProto to a FileDescriptor, various + // errors might be detected in the input. The caller may handle these + // programmatically by implementing an ErrorCollector. + class LIBPROTOBUF_EXPORT ErrorCollector { + public: + inline ErrorCollector() {} + virtual ~ErrorCollector(); + + // These constants specify what exact part of the construct is broken. + // This is useful e.g. for mapping the error back to an exact location + // in a .proto file. + enum ErrorLocation { + NAME, // the symbol name, or the package name for files + NUMBER, // field or extension range number + TYPE, // field type + EXTENDEE, // field extendee + DEFAULT_VALUE, // field default value + INPUT_TYPE, // method input type + OUTPUT_TYPE, // method output type + OPTION_NAME, // name in assignment + OPTION_VALUE, // value in option assignment + OTHER // some other problem + }; + + // Reports an error in the FileDescriptorProto. + virtual void AddError( + const string& filename, // File name in which the error occurred. + const string& element_name, // Full name of the erroneous element. + const Message* descriptor, // Descriptor of the erroneous element. + ErrorLocation location, // One of the location constants, above. + const string& message // Human-readable error message. + ) = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector); + }; + + // Convert the FileDescriptorProto to real descriptors and place them in + // this DescriptorPool. All dependencies of the file must already be in + // the pool. Returns the resulting FileDescriptor, or NULL if there were + // problems with the input (e.g. the message was invalid, or dependencies + // were missing). Details about the errors are written to GOOGLE_LOG(ERROR). + const FileDescriptor* BuildFile(const FileDescriptorProto& proto); + + // Same as BuildFile() except errors are sent to the given ErrorCollector. + const FileDescriptor* BuildFileCollectingErrors( + const FileDescriptorProto& proto, + ErrorCollector* error_collector); + + // By default, it is an error if a FileDescriptorProto contains references + // to types or other files that are not found in the DescriptorPool (or its + // backing DescriptorDatabase, if any). If you call + // AllowUnknownDependencies(), however, then unknown types and files + // will be replaced by placeholder descriptors. This can allow you to + // perform some useful operations with a .proto file even if you do not + // have access to other .proto files on which it depends. However, some + // heuristics must be used to fill in the gaps in information, and these + // can lead to descriptors which are inaccurate. For example, the + // DescriptorPool may be forced to guess whether an unknown type is a message + // or an enum, as well as what package it resides in. Furthermore, + // placeholder types will not be discoverable via FindMessageTypeByName() + // and similar methods, which could confuse some descriptor-based algorithms. + // Generally, the results of this option should only be relied upon for + // debugging purposes. + void AllowUnknownDependencies() { allow_unknown_ = true; } + + // Internal stuff -------------------------------------------------- + // These methods MUST NOT be called from outside the proto2 library. + // These methods may contain hidden pitfalls and may be removed in a + // future library version. + + // Create a DescriptorPool which is overlaid on top of some other pool. + // If you search for a descriptor in the overlay and it is not found, the + // underlay will be searched as a backup. If the underlay has its own + // underlay, that will be searched next, and so on. This also means that + // files built in the overlay will be cross-linked with the underlay's + // descriptors if necessary. The underlay remains property of the caller; + // it must remain valid for the lifetime of the newly-constructed pool. + // + // Example: Say you want to parse a .proto file at runtime in order to use + // its type with a DynamicMessage. Say this .proto file has dependencies, + // but you know that all the dependencies will be things that are already + // compiled into the binary. For ease of use, you'd like to load the types + // right out of generated_pool() rather than have to parse redundant copies + // of all these .protos and runtime. But, you don't want to add the parsed + // types directly into generated_pool(): this is not allowed, and would be + // bad design anyway. So, instead, you could use generated_pool() as an + // underlay for a new DescriptorPool in which you add only the new file. + // + // WARNING: Use of underlays can lead to many subtle gotchas. Instead, + // try to formulate what you want to do in terms of DescriptorDatabases. + explicit DescriptorPool(const DescriptorPool* underlay); + + // Called by generated classes at init time to add their descriptors to + // generated_pool. Do NOT call this in your own code! filename must be a + // permanent string (e.g. a string literal). + static void InternalAddGeneratedFile( + const void* encoded_file_descriptor, int size); + + + // For internal use only: Gets a non-const pointer to the generated pool. + // This is called at static-initialization time only, so thread-safety is + // not a concern. If both an underlay and a fallback database are present, + // the fallback database takes precedence. + static DescriptorPool* internal_generated_pool(); + + // For internal use only: Changes the behavior of BuildFile() such that it + // allows the file to make reference to message types declared in other files + // which it did not officially declare as dependencies. + void InternalDontEnforceDependencies(); + + // For internal use only. + void internal_set_underlay(const DescriptorPool* underlay) { + underlay_ = underlay; + } + + // For internal (unit test) use only: Returns true if a FileDescriptor has + // been constructed for the given file, false otherwise. Useful for testing + // lazy descriptor initialization behavior. + bool InternalIsFileLoaded(const string& filename) const; + + private: + friend class Descriptor; + friend class FieldDescriptor; + friend class EnumDescriptor; + friend class ServiceDescriptor; + friend class FileDescriptor; + friend class DescriptorBuilder; + + // Tries to find something in the fallback database and link in the + // corresponding proto file. Returns true if successful, in which case + // the caller should search for the thing again. These are declared + // const because they are called by (semantically) const methods. + bool TryFindFileInFallbackDatabase(const string& name) const; + bool TryFindSymbolInFallbackDatabase(const string& name) const; + bool TryFindExtensionInFallbackDatabase(const Descriptor* containing_type, + int field_number) const; + + // Like BuildFile() but called internally when the file has been loaded from + // fallback_database_. Declared const because it is called by (semantically) + // const methods. + const FileDescriptor* BuildFileFromDatabase( + const FileDescriptorProto& proto) const; + + // If fallback_database_ is NULL, this is NULL. Otherwise, this is a mutex + // which must be locked while accessing tables_. + Mutex* mutex_; + + // See constructor. + DescriptorDatabase* fallback_database_; + ErrorCollector* default_error_collector_; + const DescriptorPool* underlay_; + + // This class contains a lot of hash maps with complicated types that + // we'd like to keep out of the header. + class Tables; + scoped_ptr tables_; + + bool enforce_dependencies_; + bool allow_unknown_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPool); +}; + +// inline methods ==================================================== + +// These macros makes this repetitive code more readable. +#define PROTOBUF_DEFINE_ACCESSOR(CLASS, FIELD, TYPE) \ + inline TYPE CLASS::FIELD() const { return FIELD##_; } + +// Strings fields are stored as pointers but returned as const references. +#define PROTOBUF_DEFINE_STRING_ACCESSOR(CLASS, FIELD) \ + inline const string& CLASS::FIELD() const { return *FIELD##_; } + +// Arrays take an index parameter, obviously. +#define PROTOBUF_DEFINE_ARRAY_ACCESSOR(CLASS, FIELD, TYPE) \ + inline TYPE CLASS::FIELD(int index) const { return FIELD##s_ + index; } + +#define PROTOBUF_DEFINE_OPTIONS_ACCESSOR(CLASS, TYPE) \ + inline const TYPE& CLASS::options() const { return *options_; } + +PROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(Descriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, containing_type, const Descriptor*) + +PROTOBUF_DEFINE_ACCESSOR(Descriptor, field_count, int) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, nested_type_count, int) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, enum_type_count, int) + +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, field, const FieldDescriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, nested_type, const Descriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, enum_type, const EnumDescriptor*) + +PROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_range_count, int) +PROTOBUF_DEFINE_ACCESSOR(Descriptor, extension_count, int) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension_range, + const Descriptor::ExtensionRange*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(Descriptor, extension, + const FieldDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(Descriptor, MessageOptions); + +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, full_name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, lowercase_name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, camelcase_name) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, number, int) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, is_extension, bool) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, type, FieldDescriptor::Type) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, label, FieldDescriptor::Label) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, containing_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, extension_scope, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, message_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, enum_type, const EnumDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, experimental_map_key, + const FieldDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FieldDescriptor, FieldOptions); +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, has_default_value, bool) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int32 , int32 ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_int64 , int64 ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint32, uint32) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_uint64, uint64) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_float , float ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_double, double) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_bool , bool ) +PROTOBUF_DEFINE_ACCESSOR(FieldDescriptor, default_value_enum, + const EnumValueDescriptor*) +PROTOBUF_DEFINE_STRING_ACCESSOR(FieldDescriptor, default_value_string) + +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, containing_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(EnumDescriptor, value_count, int) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(EnumDescriptor, value, + const EnumValueDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumDescriptor, EnumOptions); + +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(EnumValueDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, number, int) +PROTOBUF_DEFINE_ACCESSOR(EnumValueDescriptor, type, const EnumDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(EnumValueDescriptor, EnumValueOptions); + +PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(ServiceDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, file, const FileDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(ServiceDescriptor, method_count, int) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(ServiceDescriptor, method, + const MethodDescriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(ServiceDescriptor, ServiceOptions); + +PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(MethodDescriptor, full_name) +PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, service, const ServiceDescriptor*) +PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, input_type, const Descriptor*) +PROTOBUF_DEFINE_ACCESSOR(MethodDescriptor, output_type, const Descriptor*) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(MethodDescriptor, MethodOptions); + +PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, name) +PROTOBUF_DEFINE_STRING_ACCESSOR(FileDescriptor, package) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, pool, const DescriptorPool*) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, dependency_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, message_type_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, enum_type_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, service_count, int) +PROTOBUF_DEFINE_ACCESSOR(FileDescriptor, extension_count, int) +PROTOBUF_DEFINE_OPTIONS_ACCESSOR(FileDescriptor, FileOptions); + +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, message_type, const Descriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, enum_type, const EnumDescriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, service, + const ServiceDescriptor*) +PROTOBUF_DEFINE_ARRAY_ACCESSOR(FileDescriptor, extension, + const FieldDescriptor*) + +#undef PROTOBUF_DEFINE_ACCESSOR +#undef PROTOBUF_DEFINE_STRING_ACCESSOR +#undef PROTOBUF_DEFINE_ARRAY_ACCESSOR + +// A few accessors differ from the macros... + +inline bool FieldDescriptor::is_required() const { + return label() == LABEL_REQUIRED; +} + +inline bool FieldDescriptor::is_optional() const { + return label() == LABEL_OPTIONAL; +} + +inline bool FieldDescriptor::is_repeated() const { + return label() == LABEL_REPEATED; +} + +inline bool FieldDescriptor::is_packable() const { + return is_repeated() && IsTypePackable(type()); +} + +// To save space, index() is computed by looking at the descriptor's position +// in the parent's array of children. +inline int FieldDescriptor::index() const { + if (!is_extension_) { + return this - containing_type_->fields_; + } else if (extension_scope_ != NULL) { + return this - extension_scope_->extensions_; + } else { + return this - file_->extensions_; + } +} + +inline int Descriptor::index() const { + if (containing_type_ == NULL) { + return this - file_->message_types_; + } else { + return this - containing_type_->nested_types_; + } +} + +inline int EnumDescriptor::index() const { + if (containing_type_ == NULL) { + return this - file_->enum_types_; + } else { + return this - containing_type_->enum_types_; + } +} + +inline int EnumValueDescriptor::index() const { + return this - type_->values_; +} + +inline int ServiceDescriptor::index() const { + return this - file_->services_; +} + +inline int MethodDescriptor::index() const { + return this - service_->methods_; +} + +inline FieldDescriptor::CppType FieldDescriptor::cpp_type() const { + return kTypeToCppTypeMap[type_]; +} + +inline FieldDescriptor::CppType FieldDescriptor::TypeToCppType(Type type) { + return kTypeToCppTypeMap[type]; +} + +inline bool FieldDescriptor::IsTypePackable(Type field_type) { + return (field_type != FieldDescriptor::TYPE_STRING && + field_type != FieldDescriptor::TYPE_GROUP && + field_type != FieldDescriptor::TYPE_MESSAGE && + field_type != FieldDescriptor::TYPE_BYTES); +} + +inline const FileDescriptor* FileDescriptor::dependency(int index) const { + return dependencies_[index]; +} + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_DESCRIPTOR_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc new file mode 100644 index 000000000..87303ef87 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc @@ -0,0 +1,7708 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! + +#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION +#include "google/protobuf/descriptor.pb.h" + +#include + +#include +#include +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace google { +namespace protobuf { + +namespace { + +const ::google::protobuf::Descriptor* FileDescriptorSet_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FileDescriptorSet_reflection_ = NULL; +const ::google::protobuf::Descriptor* FileDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FileDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* DescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + DescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + DescriptorProto_ExtensionRange_reflection_ = NULL; +const ::google::protobuf::Descriptor* FieldDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FieldDescriptorProto_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor_ = NULL; +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor_ = NULL; +const ::google::protobuf::Descriptor* EnumDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* EnumValueDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumValueDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* ServiceDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + ServiceDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* MethodDescriptorProto_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MethodDescriptorProto_reflection_ = NULL; +const ::google::protobuf::Descriptor* FileOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FileOptions_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor_ = NULL; +const ::google::protobuf::Descriptor* MessageOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MessageOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* FieldOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + FieldOptions_reflection_ = NULL; +const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor_ = NULL; +const ::google::protobuf::Descriptor* EnumOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* EnumValueOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + EnumValueOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* ServiceOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + ServiceOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* MethodOptions_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + MethodOptions_reflection_ = NULL; +const ::google::protobuf::Descriptor* UninterpretedOption_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + UninterpretedOption_reflection_ = NULL; +const ::google::protobuf::Descriptor* UninterpretedOption_NamePart_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + UninterpretedOption_NamePart_reflection_ = NULL; +const ::google::protobuf::Descriptor* SourceCodeInfo_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + SourceCodeInfo_reflection_ = NULL; +const ::google::protobuf::Descriptor* SourceCodeInfo_Location_descriptor_ = NULL; +const ::google::protobuf::internal::GeneratedMessageReflection* + SourceCodeInfo_Location_reflection_ = NULL; + +} // namespace + + +void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto() { + protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + const ::google::protobuf::FileDescriptor* file = + ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( + "google/protobuf/descriptor.proto"); + GOOGLE_CHECK(file != NULL); + FileDescriptorSet_descriptor_ = file->message_type(0); + static const int FileDescriptorSet_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, file_), + }; + FileDescriptorSet_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FileDescriptorSet_descriptor_, + FileDescriptorSet::default_instance_, + FileDescriptorSet_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorSet, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FileDescriptorSet)); + FileDescriptorProto_descriptor_ = file->message_type(1); + static const int FileDescriptorProto_offsets_[9] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, package_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, dependency_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, message_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, enum_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, service_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, extension_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, options_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, source_code_info_), + }; + FileDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FileDescriptorProto_descriptor_, + FileDescriptorProto::default_instance_, + FileDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FileDescriptorProto)); + DescriptorProto_descriptor_ = file->message_type(2); + static const int DescriptorProto_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, field_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, nested_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, enum_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, extension_range_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, options_), + }; + DescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + DescriptorProto_descriptor_, + DescriptorProto::default_instance_, + DescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(DescriptorProto)); + DescriptorProto_ExtensionRange_descriptor_ = DescriptorProto_descriptor_->nested_type(0); + static const int DescriptorProto_ExtensionRange_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, start_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, end_), + }; + DescriptorProto_ExtensionRange_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + DescriptorProto_ExtensionRange_descriptor_, + DescriptorProto_ExtensionRange::default_instance_, + DescriptorProto_ExtensionRange_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(DescriptorProto_ExtensionRange, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(DescriptorProto_ExtensionRange)); + FieldDescriptorProto_descriptor_ = file->message_type(3); + static const int FieldDescriptorProto_offsets_[8] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, number_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, label_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, type_name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, extendee_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, default_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, options_), + }; + FieldDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FieldDescriptorProto_descriptor_, + FieldDescriptorProto::default_instance_, + FieldDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FieldDescriptorProto)); + FieldDescriptorProto_Type_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(0); + FieldDescriptorProto_Label_descriptor_ = FieldDescriptorProto_descriptor_->enum_type(1); + EnumDescriptorProto_descriptor_ = file->message_type(4); + static const int EnumDescriptorProto_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, options_), + }; + EnumDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumDescriptorProto_descriptor_, + EnumDescriptorProto::default_instance_, + EnumDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumDescriptorProto)); + EnumValueDescriptorProto_descriptor_ = file->message_type(5); + static const int EnumValueDescriptorProto_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, number_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, options_), + }; + EnumValueDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumValueDescriptorProto_descriptor_, + EnumValueDescriptorProto::default_instance_, + EnumValueDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumValueDescriptorProto)); + ServiceDescriptorProto_descriptor_ = file->message_type(6); + static const int ServiceDescriptorProto_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, method_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, options_), + }; + ServiceDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + ServiceDescriptorProto_descriptor_, + ServiceDescriptorProto::default_instance_, + ServiceDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(ServiceDescriptorProto)); + MethodDescriptorProto_descriptor_ = file->message_type(7); + static const int MethodDescriptorProto_offsets_[4] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, input_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, output_type_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, options_), + }; + MethodDescriptorProto_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MethodDescriptorProto_descriptor_, + MethodDescriptorProto::default_instance_, + MethodDescriptorProto_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodDescriptorProto, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MethodDescriptorProto)); + FileOptions_descriptor_ = file->message_type(8); + static const int FileOptions_offsets_[9] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_package_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_outer_classname_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_multiple_files_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generate_equals_and_hash_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, optimize_for_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, cc_generic_services_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, java_generic_services_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, py_generic_services_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, uninterpreted_option_), + }; + FileOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FileOptions_descriptor_, + FileOptions::default_instance_, + FileOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FileOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FileOptions)); + FileOptions_OptimizeMode_descriptor_ = FileOptions_descriptor_->enum_type(0); + MessageOptions_descriptor_ = file->message_type(9); + static const int MessageOptions_offsets_[3] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, message_set_wire_format_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, no_standard_descriptor_accessor_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, uninterpreted_option_), + }; + MessageOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MessageOptions_descriptor_, + MessageOptions::default_instance_, + MessageOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MessageOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MessageOptions)); + FieldOptions_descriptor_ = file->message_type(10); + static const int FieldOptions_offsets_[5] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, ctype_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, packed_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, deprecated_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, experimental_map_key_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, uninterpreted_option_), + }; + FieldOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + FieldOptions_descriptor_, + FieldOptions::default_instance_, + FieldOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(FieldOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(FieldOptions)); + FieldOptions_CType_descriptor_ = FieldOptions_descriptor_->enum_type(0); + EnumOptions_descriptor_ = file->message_type(11); + static const int EnumOptions_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, uninterpreted_option_), + }; + EnumOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumOptions_descriptor_, + EnumOptions::default_instance_, + EnumOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumOptions)); + EnumValueOptions_descriptor_ = file->message_type(12); + static const int EnumValueOptions_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, uninterpreted_option_), + }; + EnumValueOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + EnumValueOptions_descriptor_, + EnumValueOptions::default_instance_, + EnumValueOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(EnumValueOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(EnumValueOptions)); + ServiceOptions_descriptor_ = file->message_type(13); + static const int ServiceOptions_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, uninterpreted_option_), + }; + ServiceOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + ServiceOptions_descriptor_, + ServiceOptions::default_instance_, + ServiceOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(ServiceOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(ServiceOptions)); + MethodOptions_descriptor_ = file->message_type(14); + static const int MethodOptions_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, uninterpreted_option_), + }; + MethodOptions_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + MethodOptions_descriptor_, + MethodOptions::default_instance_, + MethodOptions_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _unknown_fields_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(MethodOptions, _extensions_), + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(MethodOptions)); + UninterpretedOption_descriptor_ = file->message_type(15); + static const int UninterpretedOption_offsets_[7] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, name_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, identifier_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, positive_int_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, negative_int_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, double_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, string_value_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, aggregate_value_), + }; + UninterpretedOption_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + UninterpretedOption_descriptor_, + UninterpretedOption::default_instance_, + UninterpretedOption_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(UninterpretedOption)); + UninterpretedOption_NamePart_descriptor_ = UninterpretedOption_descriptor_->nested_type(0); + static const int UninterpretedOption_NamePart_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, name_part_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, is_extension_), + }; + UninterpretedOption_NamePart_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + UninterpretedOption_NamePart_descriptor_, + UninterpretedOption_NamePart::default_instance_, + UninterpretedOption_NamePart_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(UninterpretedOption_NamePart, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(UninterpretedOption_NamePart)); + SourceCodeInfo_descriptor_ = file->message_type(16); + static const int SourceCodeInfo_offsets_[1] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, location_), + }; + SourceCodeInfo_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + SourceCodeInfo_descriptor_, + SourceCodeInfo::default_instance_, + SourceCodeInfo_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(SourceCodeInfo)); + SourceCodeInfo_Location_descriptor_ = SourceCodeInfo_descriptor_->nested_type(0); + static const int SourceCodeInfo_Location_offsets_[2] = { + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, path_), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, span_), + }; + SourceCodeInfo_Location_reflection_ = + new ::google::protobuf::internal::GeneratedMessageReflection( + SourceCodeInfo_Location_descriptor_, + SourceCodeInfo_Location::default_instance_, + SourceCodeInfo_Location_offsets_, + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _has_bits_[0]), + GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(SourceCodeInfo_Location, _unknown_fields_), + -1, + ::google::protobuf::DescriptorPool::generated_pool(), + ::google::protobuf::MessageFactory::generated_factory(), + sizeof(SourceCodeInfo_Location)); +} + +namespace { + +GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); +inline void protobuf_AssignDescriptorsOnce() { + ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, + &protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto); +} + +void protobuf_RegisterTypes(const ::std::string&) { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FileDescriptorSet_descriptor_, &FileDescriptorSet::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FileDescriptorProto_descriptor_, &FileDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + DescriptorProto_descriptor_, &DescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + DescriptorProto_ExtensionRange_descriptor_, &DescriptorProto_ExtensionRange::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FieldDescriptorProto_descriptor_, &FieldDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumDescriptorProto_descriptor_, &EnumDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumValueDescriptorProto_descriptor_, &EnumValueDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + ServiceDescriptorProto_descriptor_, &ServiceDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MethodDescriptorProto_descriptor_, &MethodDescriptorProto::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FileOptions_descriptor_, &FileOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MessageOptions_descriptor_, &MessageOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + FieldOptions_descriptor_, &FieldOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumOptions_descriptor_, &EnumOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + EnumValueOptions_descriptor_, &EnumValueOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + ServiceOptions_descriptor_, &ServiceOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + MethodOptions_descriptor_, &MethodOptions::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + UninterpretedOption_descriptor_, &UninterpretedOption::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + UninterpretedOption_NamePart_descriptor_, &UninterpretedOption_NamePart::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + SourceCodeInfo_descriptor_, &SourceCodeInfo::default_instance()); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( + SourceCodeInfo_Location_descriptor_, &SourceCodeInfo_Location::default_instance()); +} + +} // namespace + +void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto() { + delete FileDescriptorSet::default_instance_; + delete FileDescriptorSet_reflection_; + delete FileDescriptorProto::default_instance_; + delete FileDescriptorProto_reflection_; + delete DescriptorProto::default_instance_; + delete DescriptorProto_reflection_; + delete DescriptorProto_ExtensionRange::default_instance_; + delete DescriptorProto_ExtensionRange_reflection_; + delete FieldDescriptorProto::default_instance_; + delete FieldDescriptorProto_reflection_; + delete EnumDescriptorProto::default_instance_; + delete EnumDescriptorProto_reflection_; + delete EnumValueDescriptorProto::default_instance_; + delete EnumValueDescriptorProto_reflection_; + delete ServiceDescriptorProto::default_instance_; + delete ServiceDescriptorProto_reflection_; + delete MethodDescriptorProto::default_instance_; + delete MethodDescriptorProto_reflection_; + delete FileOptions::default_instance_; + delete FileOptions_reflection_; + delete MessageOptions::default_instance_; + delete MessageOptions_reflection_; + delete FieldOptions::default_instance_; + delete FieldOptions_reflection_; + delete EnumOptions::default_instance_; + delete EnumOptions_reflection_; + delete EnumValueOptions::default_instance_; + delete EnumValueOptions_reflection_; + delete ServiceOptions::default_instance_; + delete ServiceOptions_reflection_; + delete MethodOptions::default_instance_; + delete MethodOptions_reflection_; + delete UninterpretedOption::default_instance_; + delete UninterpretedOption_reflection_; + delete UninterpretedOption_NamePart::default_instance_; + delete UninterpretedOption_NamePart_reflection_; + delete SourceCodeInfo::default_instance_; + delete SourceCodeInfo_reflection_; + delete SourceCodeInfo_Location::default_instance_; + delete SourceCodeInfo_Location_reflection_; +} + +void protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto() { + static bool already_here = false; + if (already_here) return; + already_here = true; + GOOGLE_PROTOBUF_VERIFY_VERSION; + + ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( + "\n google/protobuf/descriptor.proto\022\017goog" + "le.protobuf\"G\n\021FileDescriptorSet\0222\n\004file" + "\030\001 \003(\0132$.google.protobuf.FileDescriptorP" + "roto\"\227\003\n\023FileDescriptorProto\022\014\n\004name\030\001 \001" + "(\t\022\017\n\007package\030\002 \001(\t\022\022\n\ndependency\030\003 \003(\t\022" + "6\n\014message_type\030\004 \003(\0132 .google.protobuf." + "DescriptorProto\0227\n\tenum_type\030\005 \003(\0132$.goo" + "gle.protobuf.EnumDescriptorProto\0228\n\007serv" + "ice\030\006 \003(\0132\'.google.protobuf.ServiceDescr" + "iptorProto\0228\n\textension\030\007 \003(\0132%.google.p" + "rotobuf.FieldDescriptorProto\022-\n\007options\030" + "\010 \001(\0132\034.google.protobuf.FileOptions\0229\n\020s" + "ource_code_info\030\t \001(\0132\037.google.protobuf." + "SourceCodeInfo\"\251\003\n\017DescriptorProto\022\014\n\004na" + "me\030\001 \001(\t\0224\n\005field\030\002 \003(\0132%.google.protobu" + "f.FieldDescriptorProto\0228\n\textension\030\006 \003(" + "\0132%.google.protobuf.FieldDescriptorProto" + "\0225\n\013nested_type\030\003 \003(\0132 .google.protobuf." + "DescriptorProto\0227\n\tenum_type\030\004 \003(\0132$.goo" + "gle.protobuf.EnumDescriptorProto\022H\n\017exte" + "nsion_range\030\005 \003(\0132/.google.protobuf.Desc" + "riptorProto.ExtensionRange\0220\n\007options\030\007 " + "\001(\0132\037.google.protobuf.MessageOptions\032,\n\016" + "ExtensionRange\022\r\n\005start\030\001 \001(\005\022\013\n\003end\030\002 \001" + "(\005\"\224\005\n\024FieldDescriptorProto\022\014\n\004name\030\001 \001(" + "\t\022\016\n\006number\030\003 \001(\005\022:\n\005label\030\004 \001(\0162+.googl" + "e.protobuf.FieldDescriptorProto.Label\0228\n" + "\004type\030\005 \001(\0162*.google.protobuf.FieldDescr" + "iptorProto.Type\022\021\n\ttype_name\030\006 \001(\t\022\020\n\010ex" + "tendee\030\002 \001(\t\022\025\n\rdefault_value\030\007 \001(\t\022.\n\007o" + "ptions\030\010 \001(\0132\035.google.protobuf.FieldOpti" + "ons\"\266\002\n\004Type\022\017\n\013TYPE_DOUBLE\020\001\022\016\n\nTYPE_FL" + "OAT\020\002\022\016\n\nTYPE_INT64\020\003\022\017\n\013TYPE_UINT64\020\004\022\016" + "\n\nTYPE_INT32\020\005\022\020\n\014TYPE_FIXED64\020\006\022\020\n\014TYPE" + "_FIXED32\020\007\022\r\n\tTYPE_BOOL\020\010\022\017\n\013TYPE_STRING" + "\020\t\022\016\n\nTYPE_GROUP\020\n\022\020\n\014TYPE_MESSAGE\020\013\022\016\n\n" + "TYPE_BYTES\020\014\022\017\n\013TYPE_UINT32\020\r\022\r\n\tTYPE_EN" + "UM\020\016\022\021\n\rTYPE_SFIXED32\020\017\022\021\n\rTYPE_SFIXED64" + "\020\020\022\017\n\013TYPE_SINT32\020\021\022\017\n\013TYPE_SINT64\020\022\"C\n\005" + "Label\022\022\n\016LABEL_OPTIONAL\020\001\022\022\n\016LABEL_REQUI" + "RED\020\002\022\022\n\016LABEL_REPEATED\020\003\"\214\001\n\023EnumDescri" + "ptorProto\022\014\n\004name\030\001 \001(\t\0228\n\005value\030\002 \003(\0132)" + ".google.protobuf.EnumValueDescriptorProt" + "o\022-\n\007options\030\003 \001(\0132\034.google.protobuf.Enu" + "mOptions\"l\n\030EnumValueDescriptorProto\022\014\n\004" + "name\030\001 \001(\t\022\016\n\006number\030\002 \001(\005\0222\n\007options\030\003 " + "\001(\0132!.google.protobuf.EnumValueOptions\"\220" + "\001\n\026ServiceDescriptorProto\022\014\n\004name\030\001 \001(\t\022" + "6\n\006method\030\002 \003(\0132&.google.protobuf.Method" + "DescriptorProto\0220\n\007options\030\003 \001(\0132\037.googl" + "e.protobuf.ServiceOptions\"\177\n\025MethodDescr" + "iptorProto\022\014\n\004name\030\001 \001(\t\022\022\n\ninput_type\030\002" + " \001(\t\022\023\n\013output_type\030\003 \001(\t\022/\n\007options\030\004 \001" + "(\0132\036.google.protobuf.MethodOptions\"\325\003\n\013F" + "ileOptions\022\024\n\014java_package\030\001 \001(\t\022\034\n\024java" + "_outer_classname\030\010 \001(\t\022\"\n\023java_multiple_" + "files\030\n \001(\010:\005false\022,\n\035java_generate_equa" + "ls_and_hash\030\024 \001(\010:\005false\022F\n\014optimize_for" + "\030\t \001(\0162).google.protobuf.FileOptions.Opt" + "imizeMode:\005SPEED\022\"\n\023cc_generic_services\030" + "\020 \001(\010:\005false\022$\n\025java_generic_services\030\021 " + "\001(\010:\005false\022\"\n\023py_generic_services\030\022 \001(\010:" + "\005false\022C\n\024uninterpreted_option\030\347\007 \003(\0132$." + "google.protobuf.UninterpretedOption\":\n\014O" + "ptimizeMode\022\t\n\005SPEED\020\001\022\r\n\tCODE_SIZE\020\002\022\020\n" + "\014LITE_RUNTIME\020\003*\t\010\350\007\020\200\200\200\200\002\"\270\001\n\016MessageOp" + "tions\022&\n\027message_set_wire_format\030\001 \001(\010:\005" + "false\022.\n\037no_standard_descriptor_accessor" + "\030\002 \001(\010:\005false\022C\n\024uninterpreted_option\030\347\007" + " \003(\0132$.google.protobuf.UninterpretedOpti" + "on*\t\010\350\007\020\200\200\200\200\002\"\224\002\n\014FieldOptions\022:\n\005ctype\030" + "\001 \001(\0162#.google.protobuf.FieldOptions.CTy" + "pe:\006STRING\022\016\n\006packed\030\002 \001(\010\022\031\n\ndeprecated" + "\030\003 \001(\010:\005false\022\034\n\024experimental_map_key\030\t " + "\001(\t\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goo" + "gle.protobuf.UninterpretedOption\"/\n\005CTyp" + "e\022\n\n\006STRING\020\000\022\010\n\004CORD\020\001\022\020\n\014STRING_PIECE\020" + "\002*\t\010\350\007\020\200\200\200\200\002\"]\n\013EnumOptions\022C\n\024uninterpr" + "eted_option\030\347\007 \003(\0132$.google.protobuf.Uni" + "nterpretedOption*\t\010\350\007\020\200\200\200\200\002\"b\n\020EnumValue" + "Options\022C\n\024uninterpreted_option\030\347\007 \003(\0132$" + ".google.protobuf.UninterpretedOption*\t\010\350" + "\007\020\200\200\200\200\002\"`\n\016ServiceOptions\022C\n\024uninterpret" + "ed_option\030\347\007 \003(\0132$.google.protobuf.Unint" + "erpretedOption*\t\010\350\007\020\200\200\200\200\002\"_\n\rMethodOptio" + "ns\022C\n\024uninterpreted_option\030\347\007 \003(\0132$.goog" + "le.protobuf.UninterpretedOption*\t\010\350\007\020\200\200\200" + "\200\002\"\236\002\n\023UninterpretedOption\022;\n\004name\030\002 \003(\013" + "2-.google.protobuf.UninterpretedOption.N" + "amePart\022\030\n\020identifier_value\030\003 \001(\t\022\032\n\022pos" + "itive_int_value\030\004 \001(\004\022\032\n\022negative_int_va" + "lue\030\005 \001(\003\022\024\n\014double_value\030\006 \001(\001\022\024\n\014strin" + "g_value\030\007 \001(\014\022\027\n\017aggregate_value\030\010 \001(\t\0323" + "\n\010NamePart\022\021\n\tname_part\030\001 \002(\t\022\024\n\014is_exte" + "nsion\030\002 \002(\010\"|\n\016SourceCodeInfo\022:\n\010locatio" + "n\030\001 \003(\0132(.google.protobuf.SourceCodeInfo" + ".Location\032.\n\010Location\022\020\n\004path\030\001 \003(\005B\002\020\001\022" + "\020\n\004span\030\002 \003(\005B\002\020\001B)\n\023com.google.protobuf" + "B\020DescriptorProtosH\001", 3940); + ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( + "google/protobuf/descriptor.proto", &protobuf_RegisterTypes); + FileDescriptorSet::default_instance_ = new FileDescriptorSet(); + FileDescriptorProto::default_instance_ = new FileDescriptorProto(); + DescriptorProto::default_instance_ = new DescriptorProto(); + DescriptorProto_ExtensionRange::default_instance_ = new DescriptorProto_ExtensionRange(); + FieldDescriptorProto::default_instance_ = new FieldDescriptorProto(); + EnumDescriptorProto::default_instance_ = new EnumDescriptorProto(); + EnumValueDescriptorProto::default_instance_ = new EnumValueDescriptorProto(); + ServiceDescriptorProto::default_instance_ = new ServiceDescriptorProto(); + MethodDescriptorProto::default_instance_ = new MethodDescriptorProto(); + FileOptions::default_instance_ = new FileOptions(); + MessageOptions::default_instance_ = new MessageOptions(); + FieldOptions::default_instance_ = new FieldOptions(); + EnumOptions::default_instance_ = new EnumOptions(); + EnumValueOptions::default_instance_ = new EnumValueOptions(); + ServiceOptions::default_instance_ = new ServiceOptions(); + MethodOptions::default_instance_ = new MethodOptions(); + UninterpretedOption::default_instance_ = new UninterpretedOption(); + UninterpretedOption_NamePart::default_instance_ = new UninterpretedOption_NamePart(); + SourceCodeInfo::default_instance_ = new SourceCodeInfo(); + SourceCodeInfo_Location::default_instance_ = new SourceCodeInfo_Location(); + FileDescriptorSet::default_instance_->InitAsDefaultInstance(); + FileDescriptorProto::default_instance_->InitAsDefaultInstance(); + DescriptorProto::default_instance_->InitAsDefaultInstance(); + DescriptorProto_ExtensionRange::default_instance_->InitAsDefaultInstance(); + FieldDescriptorProto::default_instance_->InitAsDefaultInstance(); + EnumDescriptorProto::default_instance_->InitAsDefaultInstance(); + EnumValueDescriptorProto::default_instance_->InitAsDefaultInstance(); + ServiceDescriptorProto::default_instance_->InitAsDefaultInstance(); + MethodDescriptorProto::default_instance_->InitAsDefaultInstance(); + FileOptions::default_instance_->InitAsDefaultInstance(); + MessageOptions::default_instance_->InitAsDefaultInstance(); + FieldOptions::default_instance_->InitAsDefaultInstance(); + EnumOptions::default_instance_->InitAsDefaultInstance(); + EnumValueOptions::default_instance_->InitAsDefaultInstance(); + ServiceOptions::default_instance_->InitAsDefaultInstance(); + MethodOptions::default_instance_->InitAsDefaultInstance(); + UninterpretedOption::default_instance_->InitAsDefaultInstance(); + UninterpretedOption_NamePart::default_instance_->InitAsDefaultInstance(); + SourceCodeInfo::default_instance_->InitAsDefaultInstance(); + SourceCodeInfo_Location::default_instance_->InitAsDefaultInstance(); + ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto); +} + +// Force AddDescriptors() to be called at static initialization time. +struct StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto { + StaticDescriptorInitializer_google_2fprotobuf_2fdescriptor_2eproto() { + protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + } +} static_descriptor_initializer_google_2fprotobuf_2fdescriptor_2eproto_; + + +// =================================================================== + +#ifndef _MSC_VER +const int FileDescriptorSet::kFileFieldNumber; +#endif // !_MSC_VER + +FileDescriptorSet::FileDescriptorSet() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void FileDescriptorSet::InitAsDefaultInstance() { +} + +FileDescriptorSet::FileDescriptorSet(const FileDescriptorSet& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void FileDescriptorSet::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FileDescriptorSet::~FileDescriptorSet() { + SharedDtor(); +} + +void FileDescriptorSet::SharedDtor() { + if (this != default_instance_) { + } +} + +void FileDescriptorSet::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FileDescriptorSet::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileDescriptorSet_descriptor_; +} + +const FileDescriptorSet& FileDescriptorSet::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +FileDescriptorSet* FileDescriptorSet::default_instance_ = NULL; + +FileDescriptorSet* FileDescriptorSet::New() const { + return new FileDescriptorSet; +} + +void FileDescriptorSet::Clear() { + file_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FileDescriptorSet::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.FileDescriptorProto file = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_file: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_file())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_file; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void FileDescriptorSet::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .google.protobuf.FileDescriptorProto file = 1; + for (int i = 0; i < this->file_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->file(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* FileDescriptorSet::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .google.protobuf.FileDescriptorProto file = 1; + for (int i = 0; i < this->file_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->file(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int FileDescriptorSet::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.FileDescriptorProto file = 1; + total_size += 1 * this->file_size(); + for (int i = 0; i < this->file_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->file(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FileDescriptorSet::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FileDescriptorSet* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FileDescriptorSet::MergeFrom(const FileDescriptorSet& from) { + GOOGLE_CHECK_NE(&from, this); + file_.MergeFrom(from.file_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FileDescriptorSet::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FileDescriptorSet::CopyFrom(const FileDescriptorSet& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FileDescriptorSet::IsInitialized() const { + + for (int i = 0; i < file_size(); i++) { + if (!this->file(i).IsInitialized()) return false; + } + return true; +} + +void FileDescriptorSet::Swap(FileDescriptorSet* other) { + if (other != this) { + file_.Swap(&other->file_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata FileDescriptorSet::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FileDescriptorSet_descriptor_; + metadata.reflection = FileDescriptorSet_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int FileDescriptorProto::kNameFieldNumber; +const int FileDescriptorProto::kPackageFieldNumber; +const int FileDescriptorProto::kDependencyFieldNumber; +const int FileDescriptorProto::kMessageTypeFieldNumber; +const int FileDescriptorProto::kEnumTypeFieldNumber; +const int FileDescriptorProto::kServiceFieldNumber; +const int FileDescriptorProto::kExtensionFieldNumber; +const int FileDescriptorProto::kOptionsFieldNumber; +const int FileDescriptorProto::kSourceCodeInfoFieldNumber; +#endif // !_MSC_VER + +FileDescriptorProto::FileDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void FileDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::FileOptions*>(&::google::protobuf::FileOptions::default_instance()); + source_code_info_ = const_cast< ::google::protobuf::SourceCodeInfo*>(&::google::protobuf::SourceCodeInfo::default_instance()); +} + +FileDescriptorProto::FileDescriptorProto(const FileDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void FileDescriptorProto::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + options_ = NULL; + source_code_info_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FileDescriptorProto::~FileDescriptorProto() { + SharedDtor(); +} + +void FileDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (package_ != &::google::protobuf::internal::kEmptyString) { + delete package_; + } + if (this != default_instance_) { + delete options_; + delete source_code_info_; + } +} + +void FileDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FileDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileDescriptorProto_descriptor_; +} + +const FileDescriptorProto& FileDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +FileDescriptorProto* FileDescriptorProto::default_instance_ = NULL; + +FileDescriptorProto* FileDescriptorProto::New() const { + return new FileDescriptorProto; +} + +void FileDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + if (has_package()) { + if (package_ != &::google::protobuf::internal::kEmptyString) { + package_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear(); + } + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (has_source_code_info()) { + if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear(); + } + } + dependency_.Clear(); + message_type_.Clear(); + enum_type_.Clear(); + service_.Clear(); + extension_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FileDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_package; + break; + } + + // optional string package = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_package: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_package())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->package().data(), this->package().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_dependency; + break; + } + + // repeated string dependency = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_dependency: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->add_dependency())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->dependency(0).data(), this->dependency(0).length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_dependency; + if (input->ExpectTag(34)) goto parse_message_type; + break; + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_message_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_message_type())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_message_type; + if (input->ExpectTag(42)) goto parse_enum_type; + break; + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_enum_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_enum_type())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_enum_type; + if (input->ExpectTag(50)) goto parse_service; + break; + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_service: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_service())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_service; + if (input->ExpectTag(58)) goto parse_extension; + break; + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_extension: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_extension())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_extension; + if (input->ExpectTag(66)) goto parse_options; + break; + } + + // optional .google.protobuf.FileOptions options = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(74)) goto parse_source_code_info; + break; + } + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_source_code_info: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_source_code_info())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void FileDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // optional string package = 2; + if (has_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->package().data(), this->package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->package(), output); + } + + // repeated string dependency = 3; + for (int i = 0; i < this->dependency_size(); i++) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->dependency(i).data(), this->dependency(i).length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->dependency(i), output); + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + for (int i = 0; i < this->message_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->message_type(i), output); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + for (int i = 0; i < this->enum_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 5, this->enum_type(i), output); + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + for (int i = 0; i < this->service_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 6, this->service(i), output); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + for (int i = 0; i < this->extension_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 7, this->extension(i), output); + } + + // optional .google.protobuf.FileOptions options = 8; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 8, this->options(), output); + } + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + if (has_source_code_info()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 9, this->source_code_info(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* FileDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string package = 2; + if (has_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->package().data(), this->package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->package(), target); + } + + // repeated string dependency = 3; + for (int i = 0; i < this->dependency_size(); i++) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->dependency(i).data(), this->dependency(i).length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = ::google::protobuf::internal::WireFormatLite:: + WriteStringToArray(3, this->dependency(i), target); + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + for (int i = 0; i < this->message_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->message_type(i), target); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + for (int i = 0; i < this->enum_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 5, this->enum_type(i), target); + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + for (int i = 0; i < this->service_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 6, this->service(i), target); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + for (int i = 0; i < this->extension_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 7, this->extension(i), target); + } + + // optional .google.protobuf.FileOptions options = 8; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 8, this->options(), target); + } + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + if (has_source_code_info()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 9, this->source_code_info(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int FileDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string package = 2; + if (has_package()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->package()); + } + + // optional .google.protobuf.FileOptions options = 8; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + if (_has_bits_[8 / 32] & (0xffu << (8 % 32))) { + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + if (has_source_code_info()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->source_code_info()); + } + + } + // repeated string dependency = 3; + total_size += 1 * this->dependency_size(); + for (int i = 0; i < this->dependency_size(); i++) { + total_size += ::google::protobuf::internal::WireFormatLite::StringSize( + this->dependency(i)); + } + + // repeated .google.protobuf.DescriptorProto message_type = 4; + total_size += 1 * this->message_type_size(); + for (int i = 0; i < this->message_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->message_type(i)); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + total_size += 1 * this->enum_type_size(); + for (int i = 0; i < this->enum_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->enum_type(i)); + } + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + total_size += 1 * this->service_size(); + for (int i = 0; i < this->service_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->service(i)); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + total_size += 1 * this->extension_size(); + for (int i = 0; i < this->extension_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->extension(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FileDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FileDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FileDescriptorProto::MergeFrom(const FileDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + dependency_.MergeFrom(from.dependency_); + message_type_.MergeFrom(from.message_type_); + enum_type_.MergeFrom(from.enum_type_); + service_.MergeFrom(from.service_); + extension_.MergeFrom(from.extension_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_package()) { + set_package(from.package()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::FileOptions::MergeFrom(from.options()); + } + } + if (from._has_bits_[8 / 32] & (0xffu << (8 % 32))) { + if (from.has_source_code_info()) { + mutable_source_code_info()->::google::protobuf::SourceCodeInfo::MergeFrom(from.source_code_info()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FileDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FileDescriptorProto::CopyFrom(const FileDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FileDescriptorProto::IsInitialized() const { + + for (int i = 0; i < message_type_size(); i++) { + if (!this->message_type(i).IsInitialized()) return false; + } + for (int i = 0; i < enum_type_size(); i++) { + if (!this->enum_type(i).IsInitialized()) return false; + } + for (int i = 0; i < service_size(); i++) { + if (!this->service(i).IsInitialized()) return false; + } + for (int i = 0; i < extension_size(); i++) { + if (!this->extension(i).IsInitialized()) return false; + } + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void FileDescriptorProto::Swap(FileDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(package_, other->package_); + dependency_.Swap(&other->dependency_); + message_type_.Swap(&other->message_type_); + enum_type_.Swap(&other->enum_type_); + service_.Swap(&other->service_); + extension_.Swap(&other->extension_); + std::swap(options_, other->options_); + std::swap(source_code_info_, other->source_code_info_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata FileDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FileDescriptorProto_descriptor_; + metadata.reflection = FileDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int DescriptorProto_ExtensionRange::kStartFieldNumber; +const int DescriptorProto_ExtensionRange::kEndFieldNumber; +#endif // !_MSC_VER + +DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void DescriptorProto_ExtensionRange::InitAsDefaultInstance() { +} + +DescriptorProto_ExtensionRange::DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void DescriptorProto_ExtensionRange::SharedCtor() { + _cached_size_ = 0; + start_ = 0; + end_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +DescriptorProto_ExtensionRange::~DescriptorProto_ExtensionRange() { + SharedDtor(); +} + +void DescriptorProto_ExtensionRange::SharedDtor() { + if (this != default_instance_) { + } +} + +void DescriptorProto_ExtensionRange::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* DescriptorProto_ExtensionRange::descriptor() { + protobuf_AssignDescriptorsOnce(); + return DescriptorProto_ExtensionRange_descriptor_; +} + +const DescriptorProto_ExtensionRange& DescriptorProto_ExtensionRange::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::default_instance_ = NULL; + +DescriptorProto_ExtensionRange* DescriptorProto_ExtensionRange::New() const { + return new DescriptorProto_ExtensionRange; +} + +void DescriptorProto_ExtensionRange::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + start_ = 0; + end_ = 0; + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool DescriptorProto_ExtensionRange::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional int32 start = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &start_))); + set_has_start(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_end; + break; + } + + // optional int32 end = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_end: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &end_))); + set_has_end(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void DescriptorProto_ExtensionRange::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional int32 start = 1; + if (has_start()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(1, this->start(), output); + } + + // optional int32 end = 2; + if (has_end()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->end(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* DescriptorProto_ExtensionRange::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional int32 start = 1; + if (has_start()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(1, this->start(), target); + } + + // optional int32 end = 2; + if (has_end()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->end(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int DescriptorProto_ExtensionRange::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional int32 start = 1; + if (has_start()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->start()); + } + + // optional int32 end = 2; + if (has_end()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->end()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void DescriptorProto_ExtensionRange::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const DescriptorProto_ExtensionRange* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void DescriptorProto_ExtensionRange::MergeFrom(const DescriptorProto_ExtensionRange& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_start()) { + set_start(from.start()); + } + if (from.has_end()) { + set_end(from.end()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void DescriptorProto_ExtensionRange::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void DescriptorProto_ExtensionRange::CopyFrom(const DescriptorProto_ExtensionRange& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool DescriptorProto_ExtensionRange::IsInitialized() const { + + return true; +} + +void DescriptorProto_ExtensionRange::Swap(DescriptorProto_ExtensionRange* other) { + if (other != this) { + std::swap(start_, other->start_); + std::swap(end_, other->end_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata DescriptorProto_ExtensionRange::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = DescriptorProto_ExtensionRange_descriptor_; + metadata.reflection = DescriptorProto_ExtensionRange_reflection_; + return metadata; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int DescriptorProto::kNameFieldNumber; +const int DescriptorProto::kFieldFieldNumber; +const int DescriptorProto::kExtensionFieldNumber; +const int DescriptorProto::kNestedTypeFieldNumber; +const int DescriptorProto::kEnumTypeFieldNumber; +const int DescriptorProto::kExtensionRangeFieldNumber; +const int DescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +DescriptorProto::DescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void DescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::MessageOptions*>(&::google::protobuf::MessageOptions::default_instance()); +} + +DescriptorProto::DescriptorProto(const DescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void DescriptorProto::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +DescriptorProto::~DescriptorProto() { + SharedDtor(); +} + +void DescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void DescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* DescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return DescriptorProto_descriptor_; +} + +const DescriptorProto& DescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +DescriptorProto* DescriptorProto::default_instance_ = NULL; + +DescriptorProto* DescriptorProto::New() const { + return new DescriptorProto; +} + +void DescriptorProto::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear(); + } + } + field_.Clear(); + extension_.Clear(); + nested_type_.Clear(); + enum_type_.Clear(); + extension_range_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool DescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_field; + break; + } + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_field: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_field())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_field; + if (input->ExpectTag(26)) goto parse_nested_type; + break; + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_nested_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_nested_type())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_nested_type; + if (input->ExpectTag(34)) goto parse_enum_type; + break; + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_enum_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_enum_type())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_enum_type; + if (input->ExpectTag(42)) goto parse_extension_range; + break; + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_extension_range: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_extension_range())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(42)) goto parse_extension_range; + if (input->ExpectTag(50)) goto parse_extension; + break; + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_extension: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_extension())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_extension; + if (input->ExpectTag(58)) goto parse_options; + break; + } + + // optional .google.protobuf.MessageOptions options = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void DescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + for (int i = 0; i < this->field_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->field(i), output); + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + for (int i = 0; i < this->nested_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->nested_type(i), output); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + for (int i = 0; i < this->enum_type_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->enum_type(i), output); + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + for (int i = 0; i < this->extension_range_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 5, this->extension_range(i), output); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + for (int i = 0; i < this->extension_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 6, this->extension(i), output); + } + + // optional .google.protobuf.MessageOptions options = 7; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 7, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* DescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + for (int i = 0; i < this->field_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->field(i), target); + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + for (int i = 0; i < this->nested_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->nested_type(i), target); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + for (int i = 0; i < this->enum_type_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->enum_type(i), target); + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + for (int i = 0; i < this->extension_range_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 5, this->extension_range(i), target); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + for (int i = 0; i < this->extension_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 6, this->extension(i), target); + } + + // optional .google.protobuf.MessageOptions options = 7; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 7, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int DescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional .google.protobuf.MessageOptions options = 7; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + // repeated .google.protobuf.FieldDescriptorProto field = 2; + total_size += 1 * this->field_size(); + for (int i = 0; i < this->field_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->field(i)); + } + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + total_size += 1 * this->extension_size(); + for (int i = 0; i < this->extension_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->extension(i)); + } + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + total_size += 1 * this->nested_type_size(); + for (int i = 0; i < this->nested_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->nested_type(i)); + } + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + total_size += 1 * this->enum_type_size(); + for (int i = 0; i < this->enum_type_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->enum_type(i)); + } + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + total_size += 1 * this->extension_range_size(); + for (int i = 0; i < this->extension_range_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->extension_range(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void DescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const DescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void DescriptorProto::MergeFrom(const DescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + field_.MergeFrom(from.field_); + extension_.MergeFrom(from.extension_); + nested_type_.MergeFrom(from.nested_type_); + enum_type_.MergeFrom(from.enum_type_); + extension_range_.MergeFrom(from.extension_range_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::MessageOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void DescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void DescriptorProto::CopyFrom(const DescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool DescriptorProto::IsInitialized() const { + + for (int i = 0; i < field_size(); i++) { + if (!this->field(i).IsInitialized()) return false; + } + for (int i = 0; i < extension_size(); i++) { + if (!this->extension(i).IsInitialized()) return false; + } + for (int i = 0; i < nested_type_size(); i++) { + if (!this->nested_type(i).IsInitialized()) return false; + } + for (int i = 0; i < enum_type_size(); i++) { + if (!this->enum_type(i).IsInitialized()) return false; + } + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void DescriptorProto::Swap(DescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + field_.Swap(&other->field_); + extension_.Swap(&other->extension_); + nested_type_.Swap(&other->nested_type_); + enum_type_.Swap(&other->enum_type_); + extension_range_.Swap(&other->extension_range_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata DescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = DescriptorProto_descriptor_; + metadata.reflection = DescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldDescriptorProto_Type_descriptor_; +} +bool FieldDescriptorProto_Type_IsValid(int value) { + switch(value) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_DOUBLE; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FLOAT; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_INT32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_FIXED32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BOOL; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_STRING; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_GROUP; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_MESSAGE; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_BYTES; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_UINT32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_ENUM; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SFIXED64; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT32; +const FieldDescriptorProto_Type FieldDescriptorProto::TYPE_SINT64; +const FieldDescriptorProto_Type FieldDescriptorProto::Type_MIN; +const FieldDescriptorProto_Type FieldDescriptorProto::Type_MAX; +const int FieldDescriptorProto::Type_ARRAYSIZE; +#endif // _MSC_VER +const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldDescriptorProto_Label_descriptor_; +} +bool FieldDescriptorProto_Label_IsValid(int value) { + switch(value) { + case 1: + case 2: + case 3: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_OPTIONAL; +const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REQUIRED; +const FieldDescriptorProto_Label FieldDescriptorProto::LABEL_REPEATED; +const FieldDescriptorProto_Label FieldDescriptorProto::Label_MIN; +const FieldDescriptorProto_Label FieldDescriptorProto::Label_MAX; +const int FieldDescriptorProto::Label_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int FieldDescriptorProto::kNameFieldNumber; +const int FieldDescriptorProto::kNumberFieldNumber; +const int FieldDescriptorProto::kLabelFieldNumber; +const int FieldDescriptorProto::kTypeFieldNumber; +const int FieldDescriptorProto::kTypeNameFieldNumber; +const int FieldDescriptorProto::kExtendeeFieldNumber; +const int FieldDescriptorProto::kDefaultValueFieldNumber; +const int FieldDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +FieldDescriptorProto::FieldDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void FieldDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::FieldOptions*>(&::google::protobuf::FieldOptions::default_instance()); +} + +FieldDescriptorProto::FieldDescriptorProto(const FieldDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void FieldDescriptorProto::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + number_ = 0; + label_ = 1; + type_ = 1; + type_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + extendee_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + default_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FieldDescriptorProto::~FieldDescriptorProto() { + SharedDtor(); +} + +void FieldDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (type_name_ != &::google::protobuf::internal::kEmptyString) { + delete type_name_; + } + if (extendee_ != &::google::protobuf::internal::kEmptyString) { + delete extendee_; + } + if (default_value_ != &::google::protobuf::internal::kEmptyString) { + delete default_value_; + } + if (this != default_instance_) { + delete options_; + } +} + +void FieldDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FieldDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldDescriptorProto_descriptor_; +} + +const FieldDescriptorProto& FieldDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +FieldDescriptorProto* FieldDescriptorProto::default_instance_ = NULL; + +FieldDescriptorProto* FieldDescriptorProto::New() const { + return new FieldDescriptorProto; +} + +void FieldDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + number_ = 0; + label_ = 1; + type_ = 1; + if (has_type_name()) { + if (type_name_ != &::google::protobuf::internal::kEmptyString) { + type_name_->clear(); + } + } + if (has_extendee()) { + if (extendee_ != &::google::protobuf::internal::kEmptyString) { + extendee_->clear(); + } + } + if (has_default_value()) { + if (default_value_ != &::google::protobuf::internal::kEmptyString) { + default_value_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FieldDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_extendee; + break; + } + + // optional string extendee = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_extendee: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_extendee())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->extendee().data(), this->extendee().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(24)) goto parse_number; + break; + } + + // optional int32 number = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_number: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &number_))); + set_has_number(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(32)) goto parse_label; + break; + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_label: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FieldDescriptorProto_Label_IsValid(value)) { + set_label(static_cast< ::google::protobuf::FieldDescriptorProto_Label >(value)); + } else { + mutable_unknown_fields()->AddVarint(4, value); + } + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(40)) goto parse_type; + break; + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_type: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FieldDescriptorProto_Type_IsValid(value)) { + set_type(static_cast< ::google::protobuf::FieldDescriptorProto_Type >(value)); + } else { + mutable_unknown_fields()->AddVarint(5, value); + } + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(50)) goto parse_type_name; + break; + } + + // optional string type_name = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_type_name: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_type_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->type_name().data(), this->type_name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_default_value; + break; + } + + // optional string default_value = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_default_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_default_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->default_value().data(), this->default_value().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_options; + break; + } + + // optional .google.protobuf.FieldOptions options = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void FieldDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // optional string extendee = 2; + if (has_extendee()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->extendee().data(), this->extendee().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->extendee(), output); + } + + // optional int32 number = 3; + if (has_number()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(3, this->number(), output); + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + if (has_label()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 4, this->label(), output); + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + if (has_type()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 5, this->type(), output); + } + + // optional string type_name = 6; + if (has_type_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->type_name().data(), this->type_name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 6, this->type_name(), output); + } + + // optional string default_value = 7; + if (has_default_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->default_value().data(), this->default_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 7, this->default_value(), output); + } + + // optional .google.protobuf.FieldOptions options = 8; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 8, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* FieldDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string extendee = 2; + if (has_extendee()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->extendee().data(), this->extendee().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->extendee(), target); + } + + // optional int32 number = 3; + if (has_number()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(3, this->number(), target); + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + if (has_label()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 4, this->label(), target); + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + if (has_type()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 5, this->type(), target); + } + + // optional string type_name = 6; + if (has_type_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->type_name().data(), this->type_name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 6, this->type_name(), target); + } + + // optional string default_value = 7; + if (has_default_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->default_value().data(), this->default_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 7, this->default_value(), target); + } + + // optional .google.protobuf.FieldOptions options = 8; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 8, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int FieldDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional int32 number = 3; + if (has_number()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->number()); + } + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + if (has_label()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->label()); + } + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + if (has_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->type()); + } + + // optional string type_name = 6; + if (has_type_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->type_name()); + } + + // optional string extendee = 2; + if (has_extendee()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->extendee()); + } + + // optional string default_value = 7; + if (has_default_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->default_value()); + } + + // optional .google.protobuf.FieldOptions options = 8; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FieldDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FieldDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FieldDescriptorProto::MergeFrom(const FieldDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_number()) { + set_number(from.number()); + } + if (from.has_label()) { + set_label(from.label()); + } + if (from.has_type()) { + set_type(from.type()); + } + if (from.has_type_name()) { + set_type_name(from.type_name()); + } + if (from.has_extendee()) { + set_extendee(from.extendee()); + } + if (from.has_default_value()) { + set_default_value(from.default_value()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::FieldOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FieldDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FieldDescriptorProto::CopyFrom(const FieldDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FieldDescriptorProto::IsInitialized() const { + + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void FieldDescriptorProto::Swap(FieldDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(number_, other->number_); + std::swap(label_, other->label_); + std::swap(type_, other->type_); + std::swap(type_name_, other->type_name_); + std::swap(extendee_, other->extendee_); + std::swap(default_value_, other->default_value_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata FieldDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FieldDescriptorProto_descriptor_; + metadata.reflection = FieldDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumDescriptorProto::kNameFieldNumber; +const int EnumDescriptorProto::kValueFieldNumber; +const int EnumDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +EnumDescriptorProto::EnumDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void EnumDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::EnumOptions*>(&::google::protobuf::EnumOptions::default_instance()); +} + +EnumDescriptorProto::EnumDescriptorProto(const EnumDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void EnumDescriptorProto::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumDescriptorProto::~EnumDescriptorProto() { + SharedDtor(); +} + +void EnumDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void EnumDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumDescriptorProto_descriptor_; +} + +const EnumDescriptorProto& EnumDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +EnumDescriptorProto* EnumDescriptorProto::default_instance_ = NULL; + +EnumDescriptorProto* EnumDescriptorProto::New() const { + return new EnumDescriptorProto; +} + +void EnumDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear(); + } + } + value_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_value; + break; + } + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_value())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_value; + if (input->ExpectTag(26)) goto parse_options; + break; + } + + // optional .google.protobuf.EnumOptions options = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void EnumDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + for (int i = 0; i < this->value_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->value(i), output); + } + + // optional .google.protobuf.EnumOptions options = 3; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* EnumDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + for (int i = 0; i < this->value_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->value(i), target); + } + + // optional .google.protobuf.EnumOptions options = 3; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int EnumDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional .google.protobuf.EnumOptions options = 3; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + total_size += 1 * this->value_size(); + for (int i = 0; i < this->value_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->value(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumDescriptorProto::MergeFrom(const EnumDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + value_.MergeFrom(from.value_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::EnumOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumDescriptorProto::CopyFrom(const EnumDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumDescriptorProto::IsInitialized() const { + + for (int i = 0; i < value_size(); i++) { + if (!this->value(i).IsInitialized()) return false; + } + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void EnumDescriptorProto::Swap(EnumDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + value_.Swap(&other->value_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata EnumDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumDescriptorProto_descriptor_; + metadata.reflection = EnumDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumValueDescriptorProto::kNameFieldNumber; +const int EnumValueDescriptorProto::kNumberFieldNumber; +const int EnumValueDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +EnumValueDescriptorProto::EnumValueDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void EnumValueDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::EnumValueOptions*>(&::google::protobuf::EnumValueOptions::default_instance()); +} + +EnumValueDescriptorProto::EnumValueDescriptorProto(const EnumValueDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void EnumValueDescriptorProto::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + number_ = 0; + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumValueDescriptorProto::~EnumValueDescriptorProto() { + SharedDtor(); +} + +void EnumValueDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void EnumValueDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumValueDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumValueDescriptorProto_descriptor_; +} + +const EnumValueDescriptorProto& EnumValueDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +EnumValueDescriptorProto* EnumValueDescriptorProto::default_instance_ = NULL; + +EnumValueDescriptorProto* EnumValueDescriptorProto::New() const { + return new EnumValueDescriptorProto; +} + +void EnumValueDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + number_ = 0; + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumValueDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_number; + break; + } + + // optional int32 number = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_number: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, &number_))); + set_has_number(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_options; + break; + } + + // optional .google.protobuf.EnumValueOptions options = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void EnumValueDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // optional int32 number = 2; + if (has_number()) { + ::google::protobuf::internal::WireFormatLite::WriteInt32(2, this->number(), output); + } + + // optional .google.protobuf.EnumValueOptions options = 3; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* EnumValueDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional int32 number = 2; + if (has_number()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt32ToArray(2, this->number(), target); + } + + // optional .google.protobuf.EnumValueOptions options = 3; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int EnumValueDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional int32 number = 2; + if (has_number()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size( + this->number()); + } + + // optional .google.protobuf.EnumValueOptions options = 3; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumValueDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumValueDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumValueDescriptorProto::MergeFrom(const EnumValueDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_number()) { + set_number(from.number()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::EnumValueOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumValueDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumValueDescriptorProto::CopyFrom(const EnumValueDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumValueDescriptorProto::IsInitialized() const { + + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void EnumValueDescriptorProto::Swap(EnumValueDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(number_, other->number_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata EnumValueDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumValueDescriptorProto_descriptor_; + metadata.reflection = EnumValueDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ServiceDescriptorProto::kNameFieldNumber; +const int ServiceDescriptorProto::kMethodFieldNumber; +const int ServiceDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +ServiceDescriptorProto::ServiceDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void ServiceDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::ServiceOptions*>(&::google::protobuf::ServiceOptions::default_instance()); +} + +ServiceDescriptorProto::ServiceDescriptorProto(const ServiceDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void ServiceDescriptorProto::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ServiceDescriptorProto::~ServiceDescriptorProto() { + SharedDtor(); +} + +void ServiceDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (this != default_instance_) { + delete options_; + } +} + +void ServiceDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ServiceDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return ServiceDescriptorProto_descriptor_; +} + +const ServiceDescriptorProto& ServiceDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +ServiceDescriptorProto* ServiceDescriptorProto::default_instance_ = NULL; + +ServiceDescriptorProto* ServiceDescriptorProto::New() const { + return new ServiceDescriptorProto; +} + +void ServiceDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear(); + } + } + method_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool ServiceDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_method; + break; + } + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_method: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_method())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_method; + if (input->ExpectTag(26)) goto parse_options; + break; + } + + // optional .google.protobuf.ServiceOptions options = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void ServiceDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + for (int i = 0; i < this->method_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->method(i), output); + } + + // optional .google.protobuf.ServiceOptions options = 3; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 3, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* ServiceDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + for (int i = 0; i < this->method_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->method(i), target); + } + + // optional .google.protobuf.ServiceOptions options = 3; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 3, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int ServiceDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional .google.protobuf.ServiceOptions options = 3; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + // repeated .google.protobuf.MethodDescriptorProto method = 2; + total_size += 1 * this->method_size(); + for (int i = 0; i < this->method_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->method(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ServiceDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const ServiceDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void ServiceDescriptorProto::MergeFrom(const ServiceDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + method_.MergeFrom(from.method_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::ServiceOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void ServiceDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void ServiceDescriptorProto::CopyFrom(const ServiceDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ServiceDescriptorProto::IsInitialized() const { + + for (int i = 0; i < method_size(); i++) { + if (!this->method(i).IsInitialized()) return false; + } + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void ServiceDescriptorProto::Swap(ServiceDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + method_.Swap(&other->method_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata ServiceDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = ServiceDescriptorProto_descriptor_; + metadata.reflection = ServiceDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MethodDescriptorProto::kNameFieldNumber; +const int MethodDescriptorProto::kInputTypeFieldNumber; +const int MethodDescriptorProto::kOutputTypeFieldNumber; +const int MethodDescriptorProto::kOptionsFieldNumber; +#endif // !_MSC_VER + +MethodDescriptorProto::MethodDescriptorProto() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void MethodDescriptorProto::InitAsDefaultInstance() { + options_ = const_cast< ::google::protobuf::MethodOptions*>(&::google::protobuf::MethodOptions::default_instance()); +} + +MethodDescriptorProto::MethodDescriptorProto(const MethodDescriptorProto& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void MethodDescriptorProto::SharedCtor() { + _cached_size_ = 0; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + input_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + output_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + options_ = NULL; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MethodDescriptorProto::~MethodDescriptorProto() { + SharedDtor(); +} + +void MethodDescriptorProto::SharedDtor() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + delete name_; + } + if (input_type_ != &::google::protobuf::internal::kEmptyString) { + delete input_type_; + } + if (output_type_ != &::google::protobuf::internal::kEmptyString) { + delete output_type_; + } + if (this != default_instance_) { + delete options_; + } +} + +void MethodDescriptorProto::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MethodDescriptorProto::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MethodDescriptorProto_descriptor_; +} + +const MethodDescriptorProto& MethodDescriptorProto::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +MethodDescriptorProto* MethodDescriptorProto::default_instance_ = NULL; + +MethodDescriptorProto* MethodDescriptorProto::New() const { + return new MethodDescriptorProto; +} + +void MethodDescriptorProto::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name()) { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + } + if (has_input_type()) { + if (input_type_ != &::google::protobuf::internal::kEmptyString) { + input_type_->clear(); + } + } + if (has_output_type()) { + if (output_type_ != &::google::protobuf::internal::kEmptyString) { + output_type_->clear(); + } + } + if (has_options()) { + if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear(); + } + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MethodDescriptorProto::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string name = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_input_type; + break; + } + + // optional string input_type = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_input_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_input_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->input_type().data(), this->input_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(26)) goto parse_output_type; + break; + } + + // optional string output_type = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_output_type: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_output_type())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->output_type().data(), this->output_type().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(34)) goto parse_options; + break; + } + + // optional .google.protobuf.MethodOptions options = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_options: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, mutable_options())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void MethodDescriptorProto::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name(), output); + } + + // optional string input_type = 2; + if (has_input_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->input_type().data(), this->input_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 2, this->input_type(), output); + } + + // optional string output_type = 3; + if (has_output_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->output_type().data(), this->output_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->output_type(), output); + } + + // optional .google.protobuf.MethodOptions options = 4; + if (has_options()) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 4, this->options(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* MethodDescriptorProto::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string name = 1; + if (has_name()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name().data(), this->name().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name(), target); + } + + // optional string input_type = 2; + if (has_input_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->input_type().data(), this->input_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 2, this->input_type(), target); + } + + // optional string output_type = 3; + if (has_output_type()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->output_type().data(), this->output_type().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->output_type(), target); + } + + // optional .google.protobuf.MethodOptions options = 4; + if (has_options()) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 4, this->options(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int MethodDescriptorProto::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string name = 1; + if (has_name()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name()); + } + + // optional string input_type = 2; + if (has_input_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->input_type()); + } + + // optional string output_type = 3; + if (has_output_type()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->output_type()); + } + + // optional .google.protobuf.MethodOptions options = 4; + if (has_options()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->options()); + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MethodDescriptorProto::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MethodDescriptorProto* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MethodDescriptorProto::MergeFrom(const MethodDescriptorProto& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name()) { + set_name(from.name()); + } + if (from.has_input_type()) { + set_input_type(from.input_type()); + } + if (from.has_output_type()) { + set_output_type(from.output_type()); + } + if (from.has_options()) { + mutable_options()->::google::protobuf::MethodOptions::MergeFrom(from.options()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MethodDescriptorProto::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MethodDescriptorProto::CopyFrom(const MethodDescriptorProto& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MethodDescriptorProto::IsInitialized() const { + + if (has_options()) { + if (!this->options().IsInitialized()) return false; + } + return true; +} + +void MethodDescriptorProto::Swap(MethodDescriptorProto* other) { + if (other != this) { + std::swap(name_, other->name_); + std::swap(input_type_, other->input_type_); + std::swap(output_type_, other->output_type_); + std::swap(options_, other->options_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata MethodDescriptorProto::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MethodDescriptorProto_descriptor_; + metadata.reflection = MethodDescriptorProto_reflection_; + return metadata; +} + + +// =================================================================== + +const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileOptions_OptimizeMode_descriptor_; +} +bool FileOptions_OptimizeMode_IsValid(int value) { + switch(value) { + case 1: + case 2: + case 3: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FileOptions_OptimizeMode FileOptions::SPEED; +const FileOptions_OptimizeMode FileOptions::CODE_SIZE; +const FileOptions_OptimizeMode FileOptions::LITE_RUNTIME; +const FileOptions_OptimizeMode FileOptions::OptimizeMode_MIN; +const FileOptions_OptimizeMode FileOptions::OptimizeMode_MAX; +const int FileOptions::OptimizeMode_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int FileOptions::kJavaPackageFieldNumber; +const int FileOptions::kJavaOuterClassnameFieldNumber; +const int FileOptions::kJavaMultipleFilesFieldNumber; +const int FileOptions::kJavaGenerateEqualsAndHashFieldNumber; +const int FileOptions::kOptimizeForFieldNumber; +const int FileOptions::kCcGenericServicesFieldNumber; +const int FileOptions::kJavaGenericServicesFieldNumber; +const int FileOptions::kPyGenericServicesFieldNumber; +const int FileOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +FileOptions::FileOptions() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void FileOptions::InitAsDefaultInstance() { +} + +FileOptions::FileOptions(const FileOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void FileOptions::SharedCtor() { + _cached_size_ = 0; + java_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + java_outer_classname_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + java_multiple_files_ = false; + java_generate_equals_and_hash_ = false; + optimize_for_ = 1; + cc_generic_services_ = false; + java_generic_services_ = false; + py_generic_services_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FileOptions::~FileOptions() { + SharedDtor(); +} + +void FileOptions::SharedDtor() { + if (java_package_ != &::google::protobuf::internal::kEmptyString) { + delete java_package_; + } + if (java_outer_classname_ != &::google::protobuf::internal::kEmptyString) { + delete java_outer_classname_; + } + if (this != default_instance_) { + } +} + +void FileOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FileOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FileOptions_descriptor_; +} + +const FileOptions& FileOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +FileOptions* FileOptions::default_instance_ = NULL; + +FileOptions* FileOptions::New() const { + return new FileOptions; +} + +void FileOptions::Clear() { + _extensions_.Clear(); + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_java_package()) { + if (java_package_ != &::google::protobuf::internal::kEmptyString) { + java_package_->clear(); + } + } + if (has_java_outer_classname()) { + if (java_outer_classname_ != &::google::protobuf::internal::kEmptyString) { + java_outer_classname_->clear(); + } + } + java_multiple_files_ = false; + java_generate_equals_and_hash_ = false; + optimize_for_ = 1; + cc_generic_services_ = false; + java_generic_services_ = false; + py_generic_services_ = false; + } + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FileOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional string java_package = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_java_package())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->java_package().data(), this->java_package().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_java_outer_classname; + break; + } + + // optional string java_outer_classname = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_java_outer_classname: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_java_outer_classname())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->java_outer_classname().data(), this->java_outer_classname().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(72)) goto parse_optimize_for; + break; + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_optimize_for: + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FileOptions_OptimizeMode_IsValid(value)) { + set_optimize_for(static_cast< ::google::protobuf::FileOptions_OptimizeMode >(value)); + } else { + mutable_unknown_fields()->AddVarint(9, value); + } + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(80)) goto parse_java_multiple_files; + break; + } + + // optional bool java_multiple_files = 10 [default = false]; + case 10: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_java_multiple_files: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &java_multiple_files_))); + set_has_java_multiple_files(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(128)) goto parse_cc_generic_services; + break; + } + + // optional bool cc_generic_services = 16 [default = false]; + case 16: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_cc_generic_services: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &cc_generic_services_))); + set_has_cc_generic_services(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(136)) goto parse_java_generic_services; + break; + } + + // optional bool java_generic_services = 17 [default = false]; + case 17: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_java_generic_services: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &java_generic_services_))); + set_has_java_generic_services(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(144)) goto parse_py_generic_services; + break; + } + + // optional bool py_generic_services = 18 [default = false]; + case 18: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_py_generic_services: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &py_generic_services_))); + set_has_py_generic_services(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(160)) goto parse_java_generate_equals_and_hash; + break; + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + case 20: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_java_generate_equals_and_hash: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &java_generate_equals_and_hash_))); + set_has_java_generate_equals_and_hash(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void FileOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional string java_package = 1; + if (has_java_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->java_package().data(), this->java_package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->java_package(), output); + } + + // optional string java_outer_classname = 8; + if (has_java_outer_classname()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->java_outer_classname().data(), this->java_outer_classname().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 8, this->java_outer_classname(), output); + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + if (has_optimize_for()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 9, this->optimize_for(), output); + } + + // optional bool java_multiple_files = 10 [default = false]; + if (has_java_multiple_files()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(10, this->java_multiple_files(), output); + } + + // optional bool cc_generic_services = 16 [default = false]; + if (has_cc_generic_services()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(16, this->cc_generic_services(), output); + } + + // optional bool java_generic_services = 17 [default = false]; + if (has_java_generic_services()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(17, this->java_generic_services(), output); + } + + // optional bool py_generic_services = 18 [default = false]; + if (has_py_generic_services()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(18, this->py_generic_services(), output); + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + if (has_java_generate_equals_and_hash()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(20, this->java_generate_equals_and_hash(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* FileOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional string java_package = 1; + if (has_java_package()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->java_package().data(), this->java_package().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->java_package(), target); + } + + // optional string java_outer_classname = 8; + if (has_java_outer_classname()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->java_outer_classname().data(), this->java_outer_classname().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->java_outer_classname(), target); + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + if (has_optimize_for()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 9, this->optimize_for(), target); + } + + // optional bool java_multiple_files = 10 [default = false]; + if (has_java_multiple_files()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(10, this->java_multiple_files(), target); + } + + // optional bool cc_generic_services = 16 [default = false]; + if (has_cc_generic_services()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(16, this->cc_generic_services(), target); + } + + // optional bool java_generic_services = 17 [default = false]; + if (has_java_generic_services()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(17, this->java_generic_services(), target); + } + + // optional bool py_generic_services = 18 [default = false]; + if (has_py_generic_services()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(18, this->py_generic_services(), target); + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + if (has_java_generate_equals_and_hash()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(20, this->java_generate_equals_and_hash(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int FileOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional string java_package = 1; + if (has_java_package()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->java_package()); + } + + // optional string java_outer_classname = 8; + if (has_java_outer_classname()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->java_outer_classname()); + } + + // optional bool java_multiple_files = 10 [default = false]; + if (has_java_multiple_files()) { + total_size += 1 + 1; + } + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + if (has_java_generate_equals_and_hash()) { + total_size += 2 + 1; + } + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + if (has_optimize_for()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->optimize_for()); + } + + // optional bool cc_generic_services = 16 [default = false]; + if (has_cc_generic_services()) { + total_size += 2 + 1; + } + + // optional bool java_generic_services = 17 [default = false]; + if (has_java_generic_services()) { + total_size += 2 + 1; + } + + // optional bool py_generic_services = 18 [default = false]; + if (has_py_generic_services()) { + total_size += 2 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FileOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FileOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FileOptions::MergeFrom(const FileOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_java_package()) { + set_java_package(from.java_package()); + } + if (from.has_java_outer_classname()) { + set_java_outer_classname(from.java_outer_classname()); + } + if (from.has_java_multiple_files()) { + set_java_multiple_files(from.java_multiple_files()); + } + if (from.has_java_generate_equals_and_hash()) { + set_java_generate_equals_and_hash(from.java_generate_equals_and_hash()); + } + if (from.has_optimize_for()) { + set_optimize_for(from.optimize_for()); + } + if (from.has_cc_generic_services()) { + set_cc_generic_services(from.cc_generic_services()); + } + if (from.has_java_generic_services()) { + set_java_generic_services(from.java_generic_services()); + } + if (from.has_py_generic_services()) { + set_py_generic_services(from.py_generic_services()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FileOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FileOptions::CopyFrom(const FileOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FileOptions::IsInitialized() const { + + for (int i = 0; i < uninterpreted_option_size(); i++) { + if (!this->uninterpreted_option(i).IsInitialized()) return false; + } + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void FileOptions::Swap(FileOptions* other) { + if (other != this) { + std::swap(java_package_, other->java_package_); + std::swap(java_outer_classname_, other->java_outer_classname_); + std::swap(java_multiple_files_, other->java_multiple_files_); + std::swap(java_generate_equals_and_hash_, other->java_generate_equals_and_hash_); + std::swap(optimize_for_, other->optimize_for_); + std::swap(cc_generic_services_, other->cc_generic_services_); + std::swap(java_generic_services_, other->java_generic_services_); + std::swap(py_generic_services_, other->py_generic_services_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata FileOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FileOptions_descriptor_; + metadata.reflection = FileOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MessageOptions::kMessageSetWireFormatFieldNumber; +const int MessageOptions::kNoStandardDescriptorAccessorFieldNumber; +const int MessageOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +MessageOptions::MessageOptions() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void MessageOptions::InitAsDefaultInstance() { +} + +MessageOptions::MessageOptions(const MessageOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void MessageOptions::SharedCtor() { + _cached_size_ = 0; + message_set_wire_format_ = false; + no_standard_descriptor_accessor_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MessageOptions::~MessageOptions() { + SharedDtor(); +} + +void MessageOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void MessageOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MessageOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MessageOptions_descriptor_; +} + +const MessageOptions& MessageOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +MessageOptions* MessageOptions::default_instance_ = NULL; + +MessageOptions* MessageOptions::New() const { + return new MessageOptions; +} + +void MessageOptions::Clear() { + _extensions_.Clear(); + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + message_set_wire_format_ = false; + no_standard_descriptor_accessor_ = false; + } + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MessageOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional bool message_set_wire_format = 1 [default = false]; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &message_set_wire_format_))); + set_has_message_set_wire_format(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_no_standard_descriptor_accessor; + break; + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_no_standard_descriptor_accessor: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &no_standard_descriptor_accessor_))); + set_has_no_standard_descriptor_accessor(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void MessageOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional bool message_set_wire_format = 1 [default = false]; + if (has_message_set_wire_format()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(1, this->message_set_wire_format(), output); + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + if (has_no_standard_descriptor_accessor()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->no_standard_descriptor_accessor(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* MessageOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional bool message_set_wire_format = 1 [default = false]; + if (has_message_set_wire_format()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(1, this->message_set_wire_format(), target); + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + if (has_no_standard_descriptor_accessor()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->no_standard_descriptor_accessor(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int MessageOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional bool message_set_wire_format = 1 [default = false]; + if (has_message_set_wire_format()) { + total_size += 1 + 1; + } + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + if (has_no_standard_descriptor_accessor()) { + total_size += 1 + 1; + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MessageOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MessageOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MessageOptions::MergeFrom(const MessageOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_message_set_wire_format()) { + set_message_set_wire_format(from.message_set_wire_format()); + } + if (from.has_no_standard_descriptor_accessor()) { + set_no_standard_descriptor_accessor(from.no_standard_descriptor_accessor()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MessageOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MessageOptions::CopyFrom(const MessageOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MessageOptions::IsInitialized() const { + + for (int i = 0; i < uninterpreted_option_size(); i++) { + if (!this->uninterpreted_option(i).IsInitialized()) return false; + } + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void MessageOptions::Swap(MessageOptions* other) { + if (other != this) { + std::swap(message_set_wire_format_, other->message_set_wire_format_); + std::swap(no_standard_descriptor_accessor_, other->no_standard_descriptor_accessor_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata MessageOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MessageOptions_descriptor_; + metadata.reflection = MessageOptions_reflection_; + return metadata; +} + + +// =================================================================== + +const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldOptions_CType_descriptor_; +} +bool FieldOptions_CType_IsValid(int value) { + switch(value) { + case 0: + case 1: + case 2: + return true; + default: + return false; + } +} + +#ifndef _MSC_VER +const FieldOptions_CType FieldOptions::STRING; +const FieldOptions_CType FieldOptions::CORD; +const FieldOptions_CType FieldOptions::STRING_PIECE; +const FieldOptions_CType FieldOptions::CType_MIN; +const FieldOptions_CType FieldOptions::CType_MAX; +const int FieldOptions::CType_ARRAYSIZE; +#endif // _MSC_VER +#ifndef _MSC_VER +const int FieldOptions::kCtypeFieldNumber; +const int FieldOptions::kPackedFieldNumber; +const int FieldOptions::kDeprecatedFieldNumber; +const int FieldOptions::kExperimentalMapKeyFieldNumber; +const int FieldOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +FieldOptions::FieldOptions() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void FieldOptions::InitAsDefaultInstance() { +} + +FieldOptions::FieldOptions(const FieldOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void FieldOptions::SharedCtor() { + _cached_size_ = 0; + ctype_ = 0; + packed_ = false; + deprecated_ = false; + experimental_map_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +FieldOptions::~FieldOptions() { + SharedDtor(); +} + +void FieldOptions::SharedDtor() { + if (experimental_map_key_ != &::google::protobuf::internal::kEmptyString) { + delete experimental_map_key_; + } + if (this != default_instance_) { + } +} + +void FieldOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* FieldOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return FieldOptions_descriptor_; +} + +const FieldOptions& FieldOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +FieldOptions* FieldOptions::default_instance_ = NULL; + +FieldOptions* FieldOptions::New() const { + return new FieldOptions; +} + +void FieldOptions::Clear() { + _extensions_.Clear(); + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + ctype_ = 0; + packed_ = false; + deprecated_ = false; + if (has_experimental_map_key()) { + if (experimental_map_key_ != &::google::protobuf::internal::kEmptyString) { + experimental_map_key_->clear(); + } + } + } + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool FieldOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + int value; + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>( + input, &value))); + if (::google::protobuf::FieldOptions_CType_IsValid(value)) { + set_ctype(static_cast< ::google::protobuf::FieldOptions_CType >(value)); + } else { + mutable_unknown_fields()->AddVarint(1, value); + } + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_packed; + break; + } + + // optional bool packed = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_packed: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &packed_))); + set_has_packed(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(24)) goto parse_deprecated; + break; + } + + // optional bool deprecated = 3 [default = false]; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_deprecated: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &deprecated_))); + set_has_deprecated(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(74)) goto parse_experimental_map_key; + break; + } + + // optional string experimental_map_key = 9; + case 9: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_experimental_map_key: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_experimental_map_key())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->experimental_map_key().data(), this->experimental_map_key().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + break; + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void FieldOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + if (has_ctype()) { + ::google::protobuf::internal::WireFormatLite::WriteEnum( + 1, this->ctype(), output); + } + + // optional bool packed = 2; + if (has_packed()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->packed(), output); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(3, this->deprecated(), output); + } + + // optional string experimental_map_key = 9; + if (has_experimental_map_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->experimental_map_key().data(), this->experimental_map_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 9, this->experimental_map_key(), output); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* FieldOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + if (has_ctype()) { + target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray( + 1, this->ctype(), target); + } + + // optional bool packed = 2; + if (has_packed()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->packed(), target); + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(3, this->deprecated(), target); + } + + // optional string experimental_map_key = 9; + if (has_experimental_map_key()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->experimental_map_key().data(), this->experimental_map_key().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 9, this->experimental_map_key(), target); + } + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int FieldOptions::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + if (has_ctype()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::EnumSize(this->ctype()); + } + + // optional bool packed = 2; + if (has_packed()) { + total_size += 1 + 1; + } + + // optional bool deprecated = 3 [default = false]; + if (has_deprecated()) { + total_size += 1 + 1; + } + + // optional string experimental_map_key = 9; + if (has_experimental_map_key()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->experimental_map_key()); + } + + } + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void FieldOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const FieldOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void FieldOptions::MergeFrom(const FieldOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_ctype()) { + set_ctype(from.ctype()); + } + if (from.has_packed()) { + set_packed(from.packed()); + } + if (from.has_deprecated()) { + set_deprecated(from.deprecated()); + } + if (from.has_experimental_map_key()) { + set_experimental_map_key(from.experimental_map_key()); + } + } + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void FieldOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void FieldOptions::CopyFrom(const FieldOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool FieldOptions::IsInitialized() const { + + for (int i = 0; i < uninterpreted_option_size(); i++) { + if (!this->uninterpreted_option(i).IsInitialized()) return false; + } + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void FieldOptions::Swap(FieldOptions* other) { + if (other != this) { + std::swap(ctype_, other->ctype_); + std::swap(packed_, other->packed_); + std::swap(deprecated_, other->deprecated_); + std::swap(experimental_map_key_, other->experimental_map_key_); + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata FieldOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = FieldOptions_descriptor_; + metadata.reflection = FieldOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +EnumOptions::EnumOptions() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void EnumOptions::InitAsDefaultInstance() { +} + +EnumOptions::EnumOptions(const EnumOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void EnumOptions::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumOptions::~EnumOptions() { + SharedDtor(); +} + +void EnumOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void EnumOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumOptions_descriptor_; +} + +const EnumOptions& EnumOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +EnumOptions* EnumOptions::default_instance_ = NULL; + +EnumOptions* EnumOptions::New() const { + return new EnumOptions; +} + +void EnumOptions::Clear() { + _extensions_.Clear(); + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void EnumOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* EnumOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int EnumOptions::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumOptions::MergeFrom(const EnumOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumOptions::CopyFrom(const EnumOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumOptions::IsInitialized() const { + + for (int i = 0; i < uninterpreted_option_size(); i++) { + if (!this->uninterpreted_option(i).IsInitialized()) return false; + } + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void EnumOptions::Swap(EnumOptions* other) { + if (other != this) { + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata EnumOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumOptions_descriptor_; + metadata.reflection = EnumOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int EnumValueOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +EnumValueOptions::EnumValueOptions() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void EnumValueOptions::InitAsDefaultInstance() { +} + +EnumValueOptions::EnumValueOptions(const EnumValueOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void EnumValueOptions::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +EnumValueOptions::~EnumValueOptions() { + SharedDtor(); +} + +void EnumValueOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void EnumValueOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* EnumValueOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return EnumValueOptions_descriptor_; +} + +const EnumValueOptions& EnumValueOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +EnumValueOptions* EnumValueOptions::default_instance_ = NULL; + +EnumValueOptions* EnumValueOptions::New() const { + return new EnumValueOptions; +} + +void EnumValueOptions::Clear() { + _extensions_.Clear(); + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool EnumValueOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void EnumValueOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* EnumValueOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int EnumValueOptions::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void EnumValueOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const EnumValueOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void EnumValueOptions::MergeFrom(const EnumValueOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void EnumValueOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void EnumValueOptions::CopyFrom(const EnumValueOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool EnumValueOptions::IsInitialized() const { + + for (int i = 0; i < uninterpreted_option_size(); i++) { + if (!this->uninterpreted_option(i).IsInitialized()) return false; + } + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void EnumValueOptions::Swap(EnumValueOptions* other) { + if (other != this) { + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata EnumValueOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = EnumValueOptions_descriptor_; + metadata.reflection = EnumValueOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int ServiceOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +ServiceOptions::ServiceOptions() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void ServiceOptions::InitAsDefaultInstance() { +} + +ServiceOptions::ServiceOptions(const ServiceOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void ServiceOptions::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +ServiceOptions::~ServiceOptions() { + SharedDtor(); +} + +void ServiceOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void ServiceOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* ServiceOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return ServiceOptions_descriptor_; +} + +const ServiceOptions& ServiceOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +ServiceOptions* ServiceOptions::default_instance_ = NULL; + +ServiceOptions* ServiceOptions::New() const { + return new ServiceOptions; +} + +void ServiceOptions::Clear() { + _extensions_.Clear(); + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool ServiceOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void ServiceOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* ServiceOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int ServiceOptions::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void ServiceOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const ServiceOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void ServiceOptions::MergeFrom(const ServiceOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void ServiceOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void ServiceOptions::CopyFrom(const ServiceOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool ServiceOptions::IsInitialized() const { + + for (int i = 0; i < uninterpreted_option_size(); i++) { + if (!this->uninterpreted_option(i).IsInitialized()) return false; + } + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void ServiceOptions::Swap(ServiceOptions* other) { + if (other != this) { + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata ServiceOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = ServiceOptions_descriptor_; + metadata.reflection = ServiceOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int MethodOptions::kUninterpretedOptionFieldNumber; +#endif // !_MSC_VER + +MethodOptions::MethodOptions() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void MethodOptions::InitAsDefaultInstance() { +} + +MethodOptions::MethodOptions(const MethodOptions& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void MethodOptions::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +MethodOptions::~MethodOptions() { + SharedDtor(); +} + +void MethodOptions::SharedDtor() { + if (this != default_instance_) { + } +} + +void MethodOptions::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* MethodOptions::descriptor() { + protobuf_AssignDescriptorsOnce(); + return MethodOptions_descriptor_; +} + +const MethodOptions& MethodOptions::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +MethodOptions* MethodOptions::default_instance_ = NULL; + +MethodOptions* MethodOptions::New() const { + return new MethodOptions; +} + +void MethodOptions::Clear() { + _extensions_.Clear(); + uninterpreted_option_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool MethodOptions::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + case 999: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_uninterpreted_option: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_uninterpreted_option())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(7994)) goto parse_uninterpreted_option; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + if ((8000u <= tag)) { + DO_(_extensions_.ParseField(tag, input, default_instance_, + mutable_unknown_fields())); + continue; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void MethodOptions::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 999, this->uninterpreted_option(i), output); + } + + // Extension range [1000, 536870912) + _extensions_.SerializeWithCachedSizes( + 1000, 536870912, output); + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* MethodOptions::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 999, this->uninterpreted_option(i), target); + } + + // Extension range [1000, 536870912) + target = _extensions_.SerializeWithCachedSizesToArray( + 1000, 536870912, target); + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int MethodOptions::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + total_size += 2 * this->uninterpreted_option_size(); + for (int i = 0; i < this->uninterpreted_option_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->uninterpreted_option(i)); + } + + total_size += _extensions_.ByteSize(); + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void MethodOptions::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const MethodOptions* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void MethodOptions::MergeFrom(const MethodOptions& from) { + GOOGLE_CHECK_NE(&from, this); + uninterpreted_option_.MergeFrom(from.uninterpreted_option_); + _extensions_.MergeFrom(from._extensions_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void MethodOptions::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void MethodOptions::CopyFrom(const MethodOptions& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool MethodOptions::IsInitialized() const { + + for (int i = 0; i < uninterpreted_option_size(); i++) { + if (!this->uninterpreted_option(i).IsInitialized()) return false; + } + + if (!_extensions_.IsInitialized()) return false; return true; +} + +void MethodOptions::Swap(MethodOptions* other) { + if (other != this) { + uninterpreted_option_.Swap(&other->uninterpreted_option_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + _extensions_.Swap(&other->_extensions_); + } +} + +::google::protobuf::Metadata MethodOptions::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = MethodOptions_descriptor_; + metadata.reflection = MethodOptions_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int UninterpretedOption_NamePart::kNamePartFieldNumber; +const int UninterpretedOption_NamePart::kIsExtensionFieldNumber; +#endif // !_MSC_VER + +UninterpretedOption_NamePart::UninterpretedOption_NamePart() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void UninterpretedOption_NamePart::InitAsDefaultInstance() { +} + +UninterpretedOption_NamePart::UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void UninterpretedOption_NamePart::SharedCtor() { + _cached_size_ = 0; + name_part_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + is_extension_ = false; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +UninterpretedOption_NamePart::~UninterpretedOption_NamePart() { + SharedDtor(); +} + +void UninterpretedOption_NamePart::SharedDtor() { + if (name_part_ != &::google::protobuf::internal::kEmptyString) { + delete name_part_; + } + if (this != default_instance_) { + } +} + +void UninterpretedOption_NamePart::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* UninterpretedOption_NamePart::descriptor() { + protobuf_AssignDescriptorsOnce(); + return UninterpretedOption_NamePart_descriptor_; +} + +const UninterpretedOption_NamePart& UninterpretedOption_NamePart::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +UninterpretedOption_NamePart* UninterpretedOption_NamePart::default_instance_ = NULL; + +UninterpretedOption_NamePart* UninterpretedOption_NamePart::New() const { + return new UninterpretedOption_NamePart; +} + +void UninterpretedOption_NamePart::Clear() { + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (has_name_part()) { + if (name_part_ != &::google::protobuf::internal::kEmptyString) { + name_part_->clear(); + } + } + is_extension_ = false; + } + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool UninterpretedOption_NamePart::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // required string name_part = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_name_part())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name_part().data(), this->name_part().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(16)) goto parse_is_extension; + break; + } + + // required bool is_extension = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_is_extension: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>( + input, &is_extension_))); + set_has_is_extension(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void UninterpretedOption_NamePart::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // required string name_part = 1; + if (has_name_part()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name_part().data(), this->name_part().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 1, this->name_part(), output); + } + + // required bool is_extension = 2; + if (has_is_extension()) { + ::google::protobuf::internal::WireFormatLite::WriteBool(2, this->is_extension(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* UninterpretedOption_NamePart::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // required string name_part = 1; + if (has_name_part()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->name_part().data(), this->name_part().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 1, this->name_part(), target); + } + + // required bool is_extension = 2; + if (has_is_extension()) { + target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(2, this->is_extension(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int UninterpretedOption_NamePart::ByteSize() const { + int total_size = 0; + + if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { + // required string name_part = 1; + if (has_name_part()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->name_part()); + } + + // required bool is_extension = 2; + if (has_is_extension()) { + total_size += 1 + 1; + } + + } + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void UninterpretedOption_NamePart::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const UninterpretedOption_NamePart* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void UninterpretedOption_NamePart::MergeFrom(const UninterpretedOption_NamePart& from) { + GOOGLE_CHECK_NE(&from, this); + if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { + if (from.has_name_part()) { + set_name_part(from.name_part()); + } + if (from.has_is_extension()) { + set_is_extension(from.is_extension()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void UninterpretedOption_NamePart::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void UninterpretedOption_NamePart::CopyFrom(const UninterpretedOption_NamePart& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool UninterpretedOption_NamePart::IsInitialized() const { + if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false; + + return true; +} + +void UninterpretedOption_NamePart::Swap(UninterpretedOption_NamePart* other) { + if (other != this) { + std::swap(name_part_, other->name_part_); + std::swap(is_extension_, other->is_extension_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata UninterpretedOption_NamePart::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = UninterpretedOption_NamePart_descriptor_; + metadata.reflection = UninterpretedOption_NamePart_reflection_; + return metadata; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int UninterpretedOption::kNameFieldNumber; +const int UninterpretedOption::kIdentifierValueFieldNumber; +const int UninterpretedOption::kPositiveIntValueFieldNumber; +const int UninterpretedOption::kNegativeIntValueFieldNumber; +const int UninterpretedOption::kDoubleValueFieldNumber; +const int UninterpretedOption::kStringValueFieldNumber; +const int UninterpretedOption::kAggregateValueFieldNumber; +#endif // !_MSC_VER + +UninterpretedOption::UninterpretedOption() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void UninterpretedOption::InitAsDefaultInstance() { +} + +UninterpretedOption::UninterpretedOption(const UninterpretedOption& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void UninterpretedOption::SharedCtor() { + _cached_size_ = 0; + identifier_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + positive_int_value_ = GOOGLE_ULONGLONG(0); + negative_int_value_ = GOOGLE_LONGLONG(0); + double_value_ = 0; + string_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + aggregate_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +UninterpretedOption::~UninterpretedOption() { + SharedDtor(); +} + +void UninterpretedOption::SharedDtor() { + if (identifier_value_ != &::google::protobuf::internal::kEmptyString) { + delete identifier_value_; + } + if (string_value_ != &::google::protobuf::internal::kEmptyString) { + delete string_value_; + } + if (aggregate_value_ != &::google::protobuf::internal::kEmptyString) { + delete aggregate_value_; + } + if (this != default_instance_) { + } +} + +void UninterpretedOption::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* UninterpretedOption::descriptor() { + protobuf_AssignDescriptorsOnce(); + return UninterpretedOption_descriptor_; +} + +const UninterpretedOption& UninterpretedOption::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +UninterpretedOption* UninterpretedOption::default_instance_ = NULL; + +UninterpretedOption* UninterpretedOption::New() const { + return new UninterpretedOption; +} + +void UninterpretedOption::Clear() { + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (has_identifier_value()) { + if (identifier_value_ != &::google::protobuf::internal::kEmptyString) { + identifier_value_->clear(); + } + } + positive_int_value_ = GOOGLE_ULONGLONG(0); + negative_int_value_ = GOOGLE_LONGLONG(0); + double_value_ = 0; + if (has_string_value()) { + if (string_value_ != &::google::protobuf::internal::kEmptyString) { + string_value_->clear(); + } + } + if (has_aggregate_value()) { + if (aggregate_value_ != &::google::protobuf::internal::kEmptyString) { + aggregate_value_->clear(); + } + } + } + name_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool UninterpretedOption::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_name: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_name())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_name; + if (input->ExpectTag(26)) goto parse_identifier_value; + break; + } + + // optional string identifier_value = 3; + case 3: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_identifier_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_identifier_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->identifier_value().data(), this->identifier_value().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(32)) goto parse_positive_int_value; + break; + } + + // optional uint64 positive_int_value = 4; + case 4: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_positive_int_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::uint64, ::google::protobuf::internal::WireFormatLite::TYPE_UINT64>( + input, &positive_int_value_))); + set_has_positive_int_value(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(40)) goto parse_negative_int_value; + break; + } + + // optional int64 negative_int_value = 5; + case 5: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) { + parse_negative_int_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + ::google::protobuf::int64, ::google::protobuf::internal::WireFormatLite::TYPE_INT64>( + input, &negative_int_value_))); + set_has_negative_int_value(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(49)) goto parse_double_value; + break; + } + + // optional double double_value = 6; + case 6: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_FIXED64) { + parse_double_value: + DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive< + double, ::google::protobuf::internal::WireFormatLite::TYPE_DOUBLE>( + input, &double_value_))); + set_has_double_value(); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(58)) goto parse_string_value; + break; + } + + // optional bytes string_value = 7; + case 7: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_string_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadBytes( + input, this->mutable_string_value())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(66)) goto parse_aggregate_value; + break; + } + + // optional string aggregate_value = 8; + case 8: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_aggregate_value: + DO_(::google::protobuf::internal::WireFormatLite::ReadString( + input, this->mutable_aggregate_value())); + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->aggregate_value().data(), this->aggregate_value().length(), + ::google::protobuf::internal::WireFormat::PARSE); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void UninterpretedOption::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + for (int i = 0; i < this->name_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 2, this->name(i), output); + } + + // optional string identifier_value = 3; + if (has_identifier_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->identifier_value().data(), this->identifier_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 3, this->identifier_value(), output); + } + + // optional uint64 positive_int_value = 4; + if (has_positive_int_value()) { + ::google::protobuf::internal::WireFormatLite::WriteUInt64(4, this->positive_int_value(), output); + } + + // optional int64 negative_int_value = 5; + if (has_negative_int_value()) { + ::google::protobuf::internal::WireFormatLite::WriteInt64(5, this->negative_int_value(), output); + } + + // optional double double_value = 6; + if (has_double_value()) { + ::google::protobuf::internal::WireFormatLite::WriteDouble(6, this->double_value(), output); + } + + // optional bytes string_value = 7; + if (has_string_value()) { + ::google::protobuf::internal::WireFormatLite::WriteBytes( + 7, this->string_value(), output); + } + + // optional string aggregate_value = 8; + if (has_aggregate_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->aggregate_value().data(), this->aggregate_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + ::google::protobuf::internal::WireFormatLite::WriteString( + 8, this->aggregate_value(), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* UninterpretedOption::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + for (int i = 0; i < this->name_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 2, this->name(i), target); + } + + // optional string identifier_value = 3; + if (has_identifier_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->identifier_value().data(), this->identifier_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 3, this->identifier_value(), target); + } + + // optional uint64 positive_int_value = 4; + if (has_positive_int_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteUInt64ToArray(4, this->positive_int_value(), target); + } + + // optional int64 negative_int_value = 5; + if (has_negative_int_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteInt64ToArray(5, this->negative_int_value(), target); + } + + // optional double double_value = 6; + if (has_double_value()) { + target = ::google::protobuf::internal::WireFormatLite::WriteDoubleToArray(6, this->double_value(), target); + } + + // optional bytes string_value = 7; + if (has_string_value()) { + target = + ::google::protobuf::internal::WireFormatLite::WriteBytesToArray( + 7, this->string_value(), target); + } + + // optional string aggregate_value = 8; + if (has_aggregate_value()) { + ::google::protobuf::internal::WireFormat::VerifyUTF8String( + this->aggregate_value().data(), this->aggregate_value().length(), + ::google::protobuf::internal::WireFormat::SERIALIZE); + target = + ::google::protobuf::internal::WireFormatLite::WriteStringToArray( + 8, this->aggregate_value(), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int UninterpretedOption::ByteSize() const { + int total_size = 0; + + if (_has_bits_[1 / 32] & (0xffu << (1 % 32))) { + // optional string identifier_value = 3; + if (has_identifier_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->identifier_value()); + } + + // optional uint64 positive_int_value = 4; + if (has_positive_int_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::UInt64Size( + this->positive_int_value()); + } + + // optional int64 negative_int_value = 5; + if (has_negative_int_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int64Size( + this->negative_int_value()); + } + + // optional double double_value = 6; + if (has_double_value()) { + total_size += 1 + 8; + } + + // optional bytes string_value = 7; + if (has_string_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::BytesSize( + this->string_value()); + } + + // optional string aggregate_value = 8; + if (has_aggregate_value()) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::StringSize( + this->aggregate_value()); + } + + } + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + total_size += 1 * this->name_size(); + for (int i = 0; i < this->name_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->name(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void UninterpretedOption::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const UninterpretedOption* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void UninterpretedOption::MergeFrom(const UninterpretedOption& from) { + GOOGLE_CHECK_NE(&from, this); + name_.MergeFrom(from.name_); + if (from._has_bits_[1 / 32] & (0xffu << (1 % 32))) { + if (from.has_identifier_value()) { + set_identifier_value(from.identifier_value()); + } + if (from.has_positive_int_value()) { + set_positive_int_value(from.positive_int_value()); + } + if (from.has_negative_int_value()) { + set_negative_int_value(from.negative_int_value()); + } + if (from.has_double_value()) { + set_double_value(from.double_value()); + } + if (from.has_string_value()) { + set_string_value(from.string_value()); + } + if (from.has_aggregate_value()) { + set_aggregate_value(from.aggregate_value()); + } + } + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void UninterpretedOption::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void UninterpretedOption::CopyFrom(const UninterpretedOption& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool UninterpretedOption::IsInitialized() const { + + for (int i = 0; i < name_size(); i++) { + if (!this->name(i).IsInitialized()) return false; + } + return true; +} + +void UninterpretedOption::Swap(UninterpretedOption* other) { + if (other != this) { + name_.Swap(&other->name_); + std::swap(identifier_value_, other->identifier_value_); + std::swap(positive_int_value_, other->positive_int_value_); + std::swap(negative_int_value_, other->negative_int_value_); + std::swap(double_value_, other->double_value_); + std::swap(string_value_, other->string_value_); + std::swap(aggregate_value_, other->aggregate_value_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata UninterpretedOption::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = UninterpretedOption_descriptor_; + metadata.reflection = UninterpretedOption_reflection_; + return metadata; +} + + +// =================================================================== + +#ifndef _MSC_VER +const int SourceCodeInfo_Location::kPathFieldNumber; +const int SourceCodeInfo_Location::kSpanFieldNumber; +#endif // !_MSC_VER + +SourceCodeInfo_Location::SourceCodeInfo_Location() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void SourceCodeInfo_Location::InitAsDefaultInstance() { +} + +SourceCodeInfo_Location::SourceCodeInfo_Location(const SourceCodeInfo_Location& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void SourceCodeInfo_Location::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +SourceCodeInfo_Location::~SourceCodeInfo_Location() { + SharedDtor(); +} + +void SourceCodeInfo_Location::SharedDtor() { + if (this != default_instance_) { + } +} + +void SourceCodeInfo_Location::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* SourceCodeInfo_Location::descriptor() { + protobuf_AssignDescriptorsOnce(); + return SourceCodeInfo_Location_descriptor_; +} + +const SourceCodeInfo_Location& SourceCodeInfo_Location::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +SourceCodeInfo_Location* SourceCodeInfo_Location::default_instance_ = NULL; + +SourceCodeInfo_Location* SourceCodeInfo_Location::New() const { + return new SourceCodeInfo_Location; +} + +void SourceCodeInfo_Location::Clear() { + path_.Clear(); + span_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool SourceCodeInfo_Location::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated int32 path = 1 [packed = true]; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_path()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 10, input, this->mutable_path()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(18)) goto parse_span; + break; + } + + // repeated int32 span = 2 [packed = true]; + case 2: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_span: + DO_((::google::protobuf::internal::WireFormatLite::ReadPackedPrimitive< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + input, this->mutable_span()))); + } else if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) + == ::google::protobuf::internal::WireFormatLite:: + WIRETYPE_VARINT) { + DO_((::google::protobuf::internal::WireFormatLite::ReadRepeatedPrimitiveNoInline< + ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_INT32>( + 1, 18, input, this->mutable_span()))); + } else { + goto handle_uninterpreted; + } + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void SourceCodeInfo_Location::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated int32 path = 1 [packed = true]; + if (this->path_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(1, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_path_cached_byte_size_); + } + for (int i = 0; i < this->path_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( + this->path(i), output); + } + + // repeated int32 span = 2 [packed = true]; + if (this->span_size() > 0) { + ::google::protobuf::internal::WireFormatLite::WriteTag(2, ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(_span_cached_byte_size_); + } + for (int i = 0; i < this->span_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteInt32NoTag( + this->span(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* SourceCodeInfo_Location::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated int32 path = 1 [packed = true]; + if (this->path_size() > 0) { + target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray( + 1, + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, + target); + target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray( + _path_cached_byte_size_, target); + } + for (int i = 0; i < this->path_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteInt32NoTagToArray(this->path(i), target); + } + + // repeated int32 span = 2 [packed = true]; + if (this->span_size() > 0) { + target = ::google::protobuf::internal::WireFormatLite::WriteTagToArray( + 2, + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED, + target); + target = ::google::protobuf::io::CodedOutputStream::WriteVarint32ToArray( + _span_cached_byte_size_, target); + } + for (int i = 0; i < this->span_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteInt32NoTagToArray(this->span(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int SourceCodeInfo_Location::ByteSize() const { + int total_size = 0; + + // repeated int32 path = 1 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->path_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->path(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _path_cached_byte_size_ = data_size; + total_size += data_size; + } + + // repeated int32 span = 2 [packed = true]; + { + int data_size = 0; + for (int i = 0; i < this->span_size(); i++) { + data_size += ::google::protobuf::internal::WireFormatLite:: + Int32Size(this->span(i)); + } + if (data_size > 0) { + total_size += 1 + + ::google::protobuf::internal::WireFormatLite::Int32Size(data_size); + } + _span_cached_byte_size_ = data_size; + total_size += data_size; + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void SourceCodeInfo_Location::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const SourceCodeInfo_Location* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void SourceCodeInfo_Location::MergeFrom(const SourceCodeInfo_Location& from) { + GOOGLE_CHECK_NE(&from, this); + path_.MergeFrom(from.path_); + span_.MergeFrom(from.span_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void SourceCodeInfo_Location::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void SourceCodeInfo_Location::CopyFrom(const SourceCodeInfo_Location& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool SourceCodeInfo_Location::IsInitialized() const { + + return true; +} + +void SourceCodeInfo_Location::Swap(SourceCodeInfo_Location* other) { + if (other != this) { + path_.Swap(&other->path_); + span_.Swap(&other->span_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata SourceCodeInfo_Location::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = SourceCodeInfo_Location_descriptor_; + metadata.reflection = SourceCodeInfo_Location_reflection_; + return metadata; +} + + +// ------------------------------------------------------------------- + +#ifndef _MSC_VER +const int SourceCodeInfo::kLocationFieldNumber; +#endif // !_MSC_VER + +SourceCodeInfo::SourceCodeInfo() + : ::google::protobuf::Message() { + SharedCtor(); +} + +void SourceCodeInfo::InitAsDefaultInstance() { +} + +SourceCodeInfo::SourceCodeInfo(const SourceCodeInfo& from) + : ::google::protobuf::Message() { + SharedCtor(); + MergeFrom(from); +} + +void SourceCodeInfo::SharedCtor() { + _cached_size_ = 0; + ::memset(_has_bits_, 0, sizeof(_has_bits_)); +} + +SourceCodeInfo::~SourceCodeInfo() { + SharedDtor(); +} + +void SourceCodeInfo::SharedDtor() { + if (this != default_instance_) { + } +} + +void SourceCodeInfo::SetCachedSize(int size) const { + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); +} +const ::google::protobuf::Descriptor* SourceCodeInfo::descriptor() { + protobuf_AssignDescriptorsOnce(); + return SourceCodeInfo_descriptor_; +} + +const SourceCodeInfo& SourceCodeInfo::default_instance() { + if (default_instance_ == NULL) protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); return *default_instance_; +} + +SourceCodeInfo* SourceCodeInfo::default_instance_ = NULL; + +SourceCodeInfo* SourceCodeInfo::New() const { + return new SourceCodeInfo; +} + +void SourceCodeInfo::Clear() { + location_.Clear(); + ::memset(_has_bits_, 0, sizeof(_has_bits_)); + mutable_unknown_fields()->Clear(); +} + +bool SourceCodeInfo::MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input) { +#define DO_(EXPRESSION) if (!(EXPRESSION)) return false + ::google::protobuf::uint32 tag; + while ((tag = input->ReadTag()) != 0) { + switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + case 1: { + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + parse_location: + DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual( + input, add_location())); + } else { + goto handle_uninterpreted; + } + if (input->ExpectTag(10)) goto parse_location; + if (input->ExpectAtEnd()) return true; + break; + } + + default: { + handle_uninterpreted: + if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == + ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { + return true; + } + DO_(::google::protobuf::internal::WireFormat::SkipField( + input, tag, mutable_unknown_fields())); + break; + } + } + } + return true; +#undef DO_ +} + +void SourceCodeInfo::SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const { + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + for (int i = 0; i < this->location_size(); i++) { + ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray( + 1, this->location(i), output); + } + + if (!unknown_fields().empty()) { + ::google::protobuf::internal::WireFormat::SerializeUnknownFields( + unknown_fields(), output); + } +} + +::google::protobuf::uint8* SourceCodeInfo::SerializeWithCachedSizesToArray( + ::google::protobuf::uint8* target) const { + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + for (int i = 0; i < this->location_size(); i++) { + target = ::google::protobuf::internal::WireFormatLite:: + WriteMessageNoVirtualToArray( + 1, this->location(i), target); + } + + if (!unknown_fields().empty()) { + target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( + unknown_fields(), target); + } + return target; +} + +int SourceCodeInfo::ByteSize() const { + int total_size = 0; + + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + total_size += 1 * this->location_size(); + for (int i = 0; i < this->location_size(); i++) { + total_size += + ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual( + this->location(i)); + } + + if (!unknown_fields().empty()) { + total_size += + ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( + unknown_fields()); + } + GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); + _cached_size_ = total_size; + GOOGLE_SAFE_CONCURRENT_WRITES_END(); + return total_size; +} + +void SourceCodeInfo::MergeFrom(const ::google::protobuf::Message& from) { + GOOGLE_CHECK_NE(&from, this); + const SourceCodeInfo* source = + ::google::protobuf::internal::dynamic_cast_if_available( + &from); + if (source == NULL) { + ::google::protobuf::internal::ReflectionOps::Merge(from, this); + } else { + MergeFrom(*source); + } +} + +void SourceCodeInfo::MergeFrom(const SourceCodeInfo& from) { + GOOGLE_CHECK_NE(&from, this); + location_.MergeFrom(from.location_); + mutable_unknown_fields()->MergeFrom(from.unknown_fields()); +} + +void SourceCodeInfo::CopyFrom(const ::google::protobuf::Message& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +void SourceCodeInfo::CopyFrom(const SourceCodeInfo& from) { + if (&from == this) return; + Clear(); + MergeFrom(from); +} + +bool SourceCodeInfo::IsInitialized() const { + + return true; +} + +void SourceCodeInfo::Swap(SourceCodeInfo* other) { + if (other != this) { + location_.Swap(&other->location_); + std::swap(_has_bits_[0], other->_has_bits_[0]); + _unknown_fields_.Swap(&other->_unknown_fields_); + std::swap(_cached_size_, other->_cached_size_); + } +} + +::google::protobuf::Metadata SourceCodeInfo::GetMetadata() const { + protobuf_AssignDescriptorsOnce(); + ::google::protobuf::Metadata metadata; + metadata.descriptor = SourceCodeInfo_descriptor_; + metadata.reflection = SourceCodeInfo_reflection_; + return metadata; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace protobuf +} // namespace google + +// @@protoc_insertion_point(global_scope) diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h new file mode 100644 index 000000000..267d0d350 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h @@ -0,0 +1,5223 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: google/protobuf/descriptor.proto + +#ifndef PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED +#define PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED + +#include + +#include + +#if GOOGLE_PROTOBUF_VERSION < 2004000 +#error This file was generated by a newer version of protoc which is +#error incompatible with your Protocol Buffer headers. Please update +#error your headers. +#endif +#if 2004002 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION +#error This file was generated by an older version of protoc which is +#error incompatible with your Protocol Buffer headers. Please +#error regenerate this file with a newer version of protoc. +#endif + +#include +#include +#include +#include +// @@protoc_insertion_point(includes) + +namespace google { +namespace protobuf { + +// Internal implementation detail -- do not call these. +void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); +void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); +void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + +class FileDescriptorSet; +class FileDescriptorProto; +class DescriptorProto; +class DescriptorProto_ExtensionRange; +class FieldDescriptorProto; +class EnumDescriptorProto; +class EnumValueDescriptorProto; +class ServiceDescriptorProto; +class MethodDescriptorProto; +class FileOptions; +class MessageOptions; +class FieldOptions; +class EnumOptions; +class EnumValueOptions; +class ServiceOptions; +class MethodOptions; +class UninterpretedOption; +class UninterpretedOption_NamePart; +class SourceCodeInfo; +class SourceCodeInfo_Location; + +enum FieldDescriptorProto_Type { + FieldDescriptorProto_Type_TYPE_DOUBLE = 1, + FieldDescriptorProto_Type_TYPE_FLOAT = 2, + FieldDescriptorProto_Type_TYPE_INT64 = 3, + FieldDescriptorProto_Type_TYPE_UINT64 = 4, + FieldDescriptorProto_Type_TYPE_INT32 = 5, + FieldDescriptorProto_Type_TYPE_FIXED64 = 6, + FieldDescriptorProto_Type_TYPE_FIXED32 = 7, + FieldDescriptorProto_Type_TYPE_BOOL = 8, + FieldDescriptorProto_Type_TYPE_STRING = 9, + FieldDescriptorProto_Type_TYPE_GROUP = 10, + FieldDescriptorProto_Type_TYPE_MESSAGE = 11, + FieldDescriptorProto_Type_TYPE_BYTES = 12, + FieldDescriptorProto_Type_TYPE_UINT32 = 13, + FieldDescriptorProto_Type_TYPE_ENUM = 14, + FieldDescriptorProto_Type_TYPE_SFIXED32 = 15, + FieldDescriptorProto_Type_TYPE_SFIXED64 = 16, + FieldDescriptorProto_Type_TYPE_SINT32 = 17, + FieldDescriptorProto_Type_TYPE_SINT64 = 18 +}; +LIBPROTOBUF_EXPORT bool FieldDescriptorProto_Type_IsValid(int value); +const FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MIN = FieldDescriptorProto_Type_TYPE_DOUBLE; +const FieldDescriptorProto_Type FieldDescriptorProto_Type_Type_MAX = FieldDescriptorProto_Type_TYPE_SINT64; +const int FieldDescriptorProto_Type_Type_ARRAYSIZE = FieldDescriptorProto_Type_Type_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Type_descriptor(); +inline const ::std::string& FieldDescriptorProto_Type_Name(FieldDescriptorProto_Type value) { + return ::google::protobuf::internal::NameOfEnum( + FieldDescriptorProto_Type_descriptor(), value); +} +inline bool FieldDescriptorProto_Type_Parse( + const ::std::string& name, FieldDescriptorProto_Type* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FieldDescriptorProto_Type_descriptor(), name, value); +} +enum FieldDescriptorProto_Label { + FieldDescriptorProto_Label_LABEL_OPTIONAL = 1, + FieldDescriptorProto_Label_LABEL_REQUIRED = 2, + FieldDescriptorProto_Label_LABEL_REPEATED = 3 +}; +LIBPROTOBUF_EXPORT bool FieldDescriptorProto_Label_IsValid(int value); +const FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MIN = FieldDescriptorProto_Label_LABEL_OPTIONAL; +const FieldDescriptorProto_Label FieldDescriptorProto_Label_Label_MAX = FieldDescriptorProto_Label_LABEL_REPEATED; +const int FieldDescriptorProto_Label_Label_ARRAYSIZE = FieldDescriptorProto_Label_Label_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldDescriptorProto_Label_descriptor(); +inline const ::std::string& FieldDescriptorProto_Label_Name(FieldDescriptorProto_Label value) { + return ::google::protobuf::internal::NameOfEnum( + FieldDescriptorProto_Label_descriptor(), value); +} +inline bool FieldDescriptorProto_Label_Parse( + const ::std::string& name, FieldDescriptorProto_Label* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FieldDescriptorProto_Label_descriptor(), name, value); +} +enum FileOptions_OptimizeMode { + FileOptions_OptimizeMode_SPEED = 1, + FileOptions_OptimizeMode_CODE_SIZE = 2, + FileOptions_OptimizeMode_LITE_RUNTIME = 3 +}; +LIBPROTOBUF_EXPORT bool FileOptions_OptimizeMode_IsValid(int value); +const FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MIN = FileOptions_OptimizeMode_SPEED; +const FileOptions_OptimizeMode FileOptions_OptimizeMode_OptimizeMode_MAX = FileOptions_OptimizeMode_LITE_RUNTIME; +const int FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE = FileOptions_OptimizeMode_OptimizeMode_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FileOptions_OptimizeMode_descriptor(); +inline const ::std::string& FileOptions_OptimizeMode_Name(FileOptions_OptimizeMode value) { + return ::google::protobuf::internal::NameOfEnum( + FileOptions_OptimizeMode_descriptor(), value); +} +inline bool FileOptions_OptimizeMode_Parse( + const ::std::string& name, FileOptions_OptimizeMode* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FileOptions_OptimizeMode_descriptor(), name, value); +} +enum FieldOptions_CType { + FieldOptions_CType_STRING = 0, + FieldOptions_CType_CORD = 1, + FieldOptions_CType_STRING_PIECE = 2 +}; +LIBPROTOBUF_EXPORT bool FieldOptions_CType_IsValid(int value); +const FieldOptions_CType FieldOptions_CType_CType_MIN = FieldOptions_CType_STRING; +const FieldOptions_CType FieldOptions_CType_CType_MAX = FieldOptions_CType_STRING_PIECE; +const int FieldOptions_CType_CType_ARRAYSIZE = FieldOptions_CType_CType_MAX + 1; + +LIBPROTOBUF_EXPORT const ::google::protobuf::EnumDescriptor* FieldOptions_CType_descriptor(); +inline const ::std::string& FieldOptions_CType_Name(FieldOptions_CType value) { + return ::google::protobuf::internal::NameOfEnum( + FieldOptions_CType_descriptor(), value); +} +inline bool FieldOptions_CType_Parse( + const ::std::string& name, FieldOptions_CType* value) { + return ::google::protobuf::internal::ParseNamedEnum( + FieldOptions_CType_descriptor(), name, value); +} +// =================================================================== + +class LIBPROTOBUF_EXPORT FileDescriptorSet : public ::google::protobuf::Message { + public: + FileDescriptorSet(); + virtual ~FileDescriptorSet(); + + FileDescriptorSet(const FileDescriptorSet& from); + + inline FileDescriptorSet& operator=(const FileDescriptorSet& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FileDescriptorSet& default_instance(); + + void Swap(FileDescriptorSet* other); + + // implements Message ---------------------------------------------- + + FileDescriptorSet* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FileDescriptorSet& from); + void MergeFrom(const FileDescriptorSet& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.FileDescriptorProto file = 1; + inline int file_size() const; + inline void clear_file(); + static const int kFileFieldNumber = 1; + inline const ::google::protobuf::FileDescriptorProto& file(int index) const; + inline ::google::protobuf::FileDescriptorProto* mutable_file(int index); + inline ::google::protobuf::FileDescriptorProto* add_file(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& + file() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* + mutable_file(); + + // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorSet) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto > file_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FileDescriptorSet* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FileDescriptorProto : public ::google::protobuf::Message { + public: + FileDescriptorProto(); + virtual ~FileDescriptorProto(); + + FileDescriptorProto(const FileDescriptorProto& from); + + inline FileDescriptorProto& operator=(const FileDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FileDescriptorProto& default_instance(); + + void Swap(FileDescriptorProto* other); + + // implements Message ---------------------------------------------- + + FileDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FileDescriptorProto& from); + void MergeFrom(const FileDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // optional string package = 2; + inline bool has_package() const; + inline void clear_package(); + static const int kPackageFieldNumber = 2; + inline const ::std::string& package() const; + inline void set_package(const ::std::string& value); + inline void set_package(const char* value); + inline void set_package(const char* value, size_t size); + inline ::std::string* mutable_package(); + inline ::std::string* release_package(); + + // repeated string dependency = 3; + inline int dependency_size() const; + inline void clear_dependency(); + static const int kDependencyFieldNumber = 3; + inline const ::std::string& dependency(int index) const; + inline ::std::string* mutable_dependency(int index); + inline void set_dependency(int index, const ::std::string& value); + inline void set_dependency(int index, const char* value); + inline void set_dependency(int index, const char* value, size_t size); + inline ::std::string* add_dependency(); + inline void add_dependency(const ::std::string& value); + inline void add_dependency(const char* value); + inline void add_dependency(const char* value, size_t size); + inline const ::google::protobuf::RepeatedPtrField< ::std::string>& dependency() const; + inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_dependency(); + + // repeated .google.protobuf.DescriptorProto message_type = 4; + inline int message_type_size() const; + inline void clear_message_type(); + static const int kMessageTypeFieldNumber = 4; + inline const ::google::protobuf::DescriptorProto& message_type(int index) const; + inline ::google::protobuf::DescriptorProto* mutable_message_type(int index); + inline ::google::protobuf::DescriptorProto* add_message_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& + message_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* + mutable_message_type(); + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 5; + inline int enum_type_size() const; + inline void clear_enum_type(); + static const int kEnumTypeFieldNumber = 5; + inline const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const; + inline ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index); + inline ::google::protobuf::EnumDescriptorProto* add_enum_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& + enum_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* + mutable_enum_type(); + + // repeated .google.protobuf.ServiceDescriptorProto service = 6; + inline int service_size() const; + inline void clear_service(); + static const int kServiceFieldNumber = 6; + inline const ::google::protobuf::ServiceDescriptorProto& service(int index) const; + inline ::google::protobuf::ServiceDescriptorProto* mutable_service(int index); + inline ::google::protobuf::ServiceDescriptorProto* add_service(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >& + service() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >* + mutable_service(); + + // repeated .google.protobuf.FieldDescriptorProto extension = 7; + inline int extension_size() const; + inline void clear_extension(); + static const int kExtensionFieldNumber = 7; + inline const ::google::protobuf::FieldDescriptorProto& extension(int index) const; + inline ::google::protobuf::FieldDescriptorProto* mutable_extension(int index); + inline ::google::protobuf::FieldDescriptorProto* add_extension(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& + extension() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* + mutable_extension(); + + // optional .google.protobuf.FileOptions options = 8; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 8; + inline const ::google::protobuf::FileOptions& options() const; + inline ::google::protobuf::FileOptions* mutable_options(); + inline ::google::protobuf::FileOptions* release_options(); + + // optional .google.protobuf.SourceCodeInfo source_code_info = 9; + inline bool has_source_code_info() const; + inline void clear_source_code_info(); + static const int kSourceCodeInfoFieldNumber = 9; + inline const ::google::protobuf::SourceCodeInfo& source_code_info() const; + inline ::google::protobuf::SourceCodeInfo* mutable_source_code_info(); + inline ::google::protobuf::SourceCodeInfo* release_source_code_info(); + + // @@protoc_insertion_point(class_scope:google.protobuf.FileDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_package(); + inline void clear_has_package(); + inline void set_has_options(); + inline void clear_has_options(); + inline void set_has_source_code_info(); + inline void clear_has_source_code_info(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::std::string* package_; + ::google::protobuf::RepeatedPtrField< ::std::string> dependency_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > message_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto > service_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_; + ::google::protobuf::FileOptions* options_; + ::google::protobuf::SourceCodeInfo* source_code_info_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(9 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FileDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT DescriptorProto_ExtensionRange : public ::google::protobuf::Message { + public: + DescriptorProto_ExtensionRange(); + virtual ~DescriptorProto_ExtensionRange(); + + DescriptorProto_ExtensionRange(const DescriptorProto_ExtensionRange& from); + + inline DescriptorProto_ExtensionRange& operator=(const DescriptorProto_ExtensionRange& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const DescriptorProto_ExtensionRange& default_instance(); + + void Swap(DescriptorProto_ExtensionRange* other); + + // implements Message ---------------------------------------------- + + DescriptorProto_ExtensionRange* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const DescriptorProto_ExtensionRange& from); + void MergeFrom(const DescriptorProto_ExtensionRange& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional int32 start = 1; + inline bool has_start() const; + inline void clear_start(); + static const int kStartFieldNumber = 1; + inline ::google::protobuf::int32 start() const; + inline void set_start(::google::protobuf::int32 value); + + // optional int32 end = 2; + inline bool has_end() const; + inline void clear_end(); + static const int kEndFieldNumber = 2; + inline ::google::protobuf::int32 end() const; + inline void set_end(::google::protobuf::int32 value); + + // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto.ExtensionRange) + private: + inline void set_has_start(); + inline void clear_has_start(); + inline void set_has_end(); + inline void clear_has_end(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::int32 start_; + ::google::protobuf::int32 end_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static DescriptorProto_ExtensionRange* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT DescriptorProto : public ::google::protobuf::Message { + public: + DescriptorProto(); + virtual ~DescriptorProto(); + + DescriptorProto(const DescriptorProto& from); + + inline DescriptorProto& operator=(const DescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const DescriptorProto& default_instance(); + + void Swap(DescriptorProto* other); + + // implements Message ---------------------------------------------- + + DescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const DescriptorProto& from); + void MergeFrom(const DescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef DescriptorProto_ExtensionRange ExtensionRange; + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // repeated .google.protobuf.FieldDescriptorProto field = 2; + inline int field_size() const; + inline void clear_field(); + static const int kFieldFieldNumber = 2; + inline const ::google::protobuf::FieldDescriptorProto& field(int index) const; + inline ::google::protobuf::FieldDescriptorProto* mutable_field(int index); + inline ::google::protobuf::FieldDescriptorProto* add_field(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& + field() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* + mutable_field(); + + // repeated .google.protobuf.FieldDescriptorProto extension = 6; + inline int extension_size() const; + inline void clear_extension(); + static const int kExtensionFieldNumber = 6; + inline const ::google::protobuf::FieldDescriptorProto& extension(int index) const; + inline ::google::protobuf::FieldDescriptorProto* mutable_extension(int index); + inline ::google::protobuf::FieldDescriptorProto* add_extension(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& + extension() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* + mutable_extension(); + + // repeated .google.protobuf.DescriptorProto nested_type = 3; + inline int nested_type_size() const; + inline void clear_nested_type(); + static const int kNestedTypeFieldNumber = 3; + inline const ::google::protobuf::DescriptorProto& nested_type(int index) const; + inline ::google::protobuf::DescriptorProto* mutable_nested_type(int index); + inline ::google::protobuf::DescriptorProto* add_nested_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& + nested_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* + mutable_nested_type(); + + // repeated .google.protobuf.EnumDescriptorProto enum_type = 4; + inline int enum_type_size() const; + inline void clear_enum_type(); + static const int kEnumTypeFieldNumber = 4; + inline const ::google::protobuf::EnumDescriptorProto& enum_type(int index) const; + inline ::google::protobuf::EnumDescriptorProto* mutable_enum_type(int index); + inline ::google::protobuf::EnumDescriptorProto* add_enum_type(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& + enum_type() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* + mutable_enum_type(); + + // repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; + inline int extension_range_size() const; + inline void clear_extension_range(); + static const int kExtensionRangeFieldNumber = 5; + inline const ::google::protobuf::DescriptorProto_ExtensionRange& extension_range(int index) const; + inline ::google::protobuf::DescriptorProto_ExtensionRange* mutable_extension_range(int index); + inline ::google::protobuf::DescriptorProto_ExtensionRange* add_extension_range(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >& + extension_range() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >* + mutable_extension_range(); + + // optional .google.protobuf.MessageOptions options = 7; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 7; + inline const ::google::protobuf::MessageOptions& options() const; + inline ::google::protobuf::MessageOptions* mutable_options(); + inline ::google::protobuf::MessageOptions* release_options(); + + // @@protoc_insertion_point(class_scope:google.protobuf.DescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > field_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto > extension_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto > nested_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto > enum_type_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange > extension_range_; + ::google::protobuf::MessageOptions* options_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static DescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FieldDescriptorProto : public ::google::protobuf::Message { + public: + FieldDescriptorProto(); + virtual ~FieldDescriptorProto(); + + FieldDescriptorProto(const FieldDescriptorProto& from); + + inline FieldDescriptorProto& operator=(const FieldDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FieldDescriptorProto& default_instance(); + + void Swap(FieldDescriptorProto* other); + + // implements Message ---------------------------------------------- + + FieldDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FieldDescriptorProto& from); + void MergeFrom(const FieldDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef FieldDescriptorProto_Type Type; + static const Type TYPE_DOUBLE = FieldDescriptorProto_Type_TYPE_DOUBLE; + static const Type TYPE_FLOAT = FieldDescriptorProto_Type_TYPE_FLOAT; + static const Type TYPE_INT64 = FieldDescriptorProto_Type_TYPE_INT64; + static const Type TYPE_UINT64 = FieldDescriptorProto_Type_TYPE_UINT64; + static const Type TYPE_INT32 = FieldDescriptorProto_Type_TYPE_INT32; + static const Type TYPE_FIXED64 = FieldDescriptorProto_Type_TYPE_FIXED64; + static const Type TYPE_FIXED32 = FieldDescriptorProto_Type_TYPE_FIXED32; + static const Type TYPE_BOOL = FieldDescriptorProto_Type_TYPE_BOOL; + static const Type TYPE_STRING = FieldDescriptorProto_Type_TYPE_STRING; + static const Type TYPE_GROUP = FieldDescriptorProto_Type_TYPE_GROUP; + static const Type TYPE_MESSAGE = FieldDescriptorProto_Type_TYPE_MESSAGE; + static const Type TYPE_BYTES = FieldDescriptorProto_Type_TYPE_BYTES; + static const Type TYPE_UINT32 = FieldDescriptorProto_Type_TYPE_UINT32; + static const Type TYPE_ENUM = FieldDescriptorProto_Type_TYPE_ENUM; + static const Type TYPE_SFIXED32 = FieldDescriptorProto_Type_TYPE_SFIXED32; + static const Type TYPE_SFIXED64 = FieldDescriptorProto_Type_TYPE_SFIXED64; + static const Type TYPE_SINT32 = FieldDescriptorProto_Type_TYPE_SINT32; + static const Type TYPE_SINT64 = FieldDescriptorProto_Type_TYPE_SINT64; + static inline bool Type_IsValid(int value) { + return FieldDescriptorProto_Type_IsValid(value); + } + static const Type Type_MIN = + FieldDescriptorProto_Type_Type_MIN; + static const Type Type_MAX = + FieldDescriptorProto_Type_Type_MAX; + static const int Type_ARRAYSIZE = + FieldDescriptorProto_Type_Type_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + Type_descriptor() { + return FieldDescriptorProto_Type_descriptor(); + } + static inline const ::std::string& Type_Name(Type value) { + return FieldDescriptorProto_Type_Name(value); + } + static inline bool Type_Parse(const ::std::string& name, + Type* value) { + return FieldDescriptorProto_Type_Parse(name, value); + } + + typedef FieldDescriptorProto_Label Label; + static const Label LABEL_OPTIONAL = FieldDescriptorProto_Label_LABEL_OPTIONAL; + static const Label LABEL_REQUIRED = FieldDescriptorProto_Label_LABEL_REQUIRED; + static const Label LABEL_REPEATED = FieldDescriptorProto_Label_LABEL_REPEATED; + static inline bool Label_IsValid(int value) { + return FieldDescriptorProto_Label_IsValid(value); + } + static const Label Label_MIN = + FieldDescriptorProto_Label_Label_MIN; + static const Label Label_MAX = + FieldDescriptorProto_Label_Label_MAX; + static const int Label_ARRAYSIZE = + FieldDescriptorProto_Label_Label_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + Label_descriptor() { + return FieldDescriptorProto_Label_descriptor(); + } + static inline const ::std::string& Label_Name(Label value) { + return FieldDescriptorProto_Label_Name(value); + } + static inline bool Label_Parse(const ::std::string& name, + Label* value) { + return FieldDescriptorProto_Label_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // optional int32 number = 3; + inline bool has_number() const; + inline void clear_number(); + static const int kNumberFieldNumber = 3; + inline ::google::protobuf::int32 number() const; + inline void set_number(::google::protobuf::int32 value); + + // optional .google.protobuf.FieldDescriptorProto.Label label = 4; + inline bool has_label() const; + inline void clear_label(); + static const int kLabelFieldNumber = 4; + inline ::google::protobuf::FieldDescriptorProto_Label label() const; + inline void set_label(::google::protobuf::FieldDescriptorProto_Label value); + + // optional .google.protobuf.FieldDescriptorProto.Type type = 5; + inline bool has_type() const; + inline void clear_type(); + static const int kTypeFieldNumber = 5; + inline ::google::protobuf::FieldDescriptorProto_Type type() const; + inline void set_type(::google::protobuf::FieldDescriptorProto_Type value); + + // optional string type_name = 6; + inline bool has_type_name() const; + inline void clear_type_name(); + static const int kTypeNameFieldNumber = 6; + inline const ::std::string& type_name() const; + inline void set_type_name(const ::std::string& value); + inline void set_type_name(const char* value); + inline void set_type_name(const char* value, size_t size); + inline ::std::string* mutable_type_name(); + inline ::std::string* release_type_name(); + + // optional string extendee = 2; + inline bool has_extendee() const; + inline void clear_extendee(); + static const int kExtendeeFieldNumber = 2; + inline const ::std::string& extendee() const; + inline void set_extendee(const ::std::string& value); + inline void set_extendee(const char* value); + inline void set_extendee(const char* value, size_t size); + inline ::std::string* mutable_extendee(); + inline ::std::string* release_extendee(); + + // optional string default_value = 7; + inline bool has_default_value() const; + inline void clear_default_value(); + static const int kDefaultValueFieldNumber = 7; + inline const ::std::string& default_value() const; + inline void set_default_value(const ::std::string& value); + inline void set_default_value(const char* value); + inline void set_default_value(const char* value, size_t size); + inline ::std::string* mutable_default_value(); + inline ::std::string* release_default_value(); + + // optional .google.protobuf.FieldOptions options = 8; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 8; + inline const ::google::protobuf::FieldOptions& options() const; + inline ::google::protobuf::FieldOptions* mutable_options(); + inline ::google::protobuf::FieldOptions* release_options(); + + // @@protoc_insertion_point(class_scope:google.protobuf.FieldDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_number(); + inline void clear_has_number(); + inline void set_has_label(); + inline void clear_has_label(); + inline void set_has_type(); + inline void clear_has_type(); + inline void set_has_type_name(); + inline void clear_has_type_name(); + inline void set_has_extendee(); + inline void clear_has_extendee(); + inline void set_has_default_value(); + inline void clear_has_default_value(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::google::protobuf::int32 number_; + int label_; + ::std::string* type_name_; + ::std::string* extendee_; + ::std::string* default_value_; + ::google::protobuf::FieldOptions* options_; + int type_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(8 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FieldDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumDescriptorProto : public ::google::protobuf::Message { + public: + EnumDescriptorProto(); + virtual ~EnumDescriptorProto(); + + EnumDescriptorProto(const EnumDescriptorProto& from); + + inline EnumDescriptorProto& operator=(const EnumDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumDescriptorProto& default_instance(); + + void Swap(EnumDescriptorProto* other); + + // implements Message ---------------------------------------------- + + EnumDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumDescriptorProto& from); + void MergeFrom(const EnumDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // repeated .google.protobuf.EnumValueDescriptorProto value = 2; + inline int value_size() const; + inline void clear_value(); + static const int kValueFieldNumber = 2; + inline const ::google::protobuf::EnumValueDescriptorProto& value(int index) const; + inline ::google::protobuf::EnumValueDescriptorProto* mutable_value(int index); + inline ::google::protobuf::EnumValueDescriptorProto* add_value(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >& + value() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >* + mutable_value(); + + // optional .google.protobuf.EnumOptions options = 3; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 3; + inline const ::google::protobuf::EnumOptions& options() const; + inline ::google::protobuf::EnumOptions* mutable_options(); + inline ::google::protobuf::EnumOptions* release_options(); + + // @@protoc_insertion_point(class_scope:google.protobuf.EnumDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto > value_; + ::google::protobuf::EnumOptions* options_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumValueDescriptorProto : public ::google::protobuf::Message { + public: + EnumValueDescriptorProto(); + virtual ~EnumValueDescriptorProto(); + + EnumValueDescriptorProto(const EnumValueDescriptorProto& from); + + inline EnumValueDescriptorProto& operator=(const EnumValueDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumValueDescriptorProto& default_instance(); + + void Swap(EnumValueDescriptorProto* other); + + // implements Message ---------------------------------------------- + + EnumValueDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumValueDescriptorProto& from); + void MergeFrom(const EnumValueDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // optional int32 number = 2; + inline bool has_number() const; + inline void clear_number(); + static const int kNumberFieldNumber = 2; + inline ::google::protobuf::int32 number() const; + inline void set_number(::google::protobuf::int32 value); + + // optional .google.protobuf.EnumValueOptions options = 3; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 3; + inline const ::google::protobuf::EnumValueOptions& options() const; + inline ::google::protobuf::EnumValueOptions* mutable_options(); + inline ::google::protobuf::EnumValueOptions* release_options(); + + // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_number(); + inline void clear_has_number(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::google::protobuf::EnumValueOptions* options_; + ::google::protobuf::int32 number_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumValueDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT ServiceDescriptorProto : public ::google::protobuf::Message { + public: + ServiceDescriptorProto(); + virtual ~ServiceDescriptorProto(); + + ServiceDescriptorProto(const ServiceDescriptorProto& from); + + inline ServiceDescriptorProto& operator=(const ServiceDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const ServiceDescriptorProto& default_instance(); + + void Swap(ServiceDescriptorProto* other); + + // implements Message ---------------------------------------------- + + ServiceDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const ServiceDescriptorProto& from); + void MergeFrom(const ServiceDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // repeated .google.protobuf.MethodDescriptorProto method = 2; + inline int method_size() const; + inline void clear_method(); + static const int kMethodFieldNumber = 2; + inline const ::google::protobuf::MethodDescriptorProto& method(int index) const; + inline ::google::protobuf::MethodDescriptorProto* mutable_method(int index); + inline ::google::protobuf::MethodDescriptorProto* add_method(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >& + method() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >* + mutable_method(); + + // optional .google.protobuf.ServiceOptions options = 3; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 3; + inline const ::google::protobuf::ServiceOptions& options() const; + inline ::google::protobuf::ServiceOptions* mutable_options(); + inline ::google::protobuf::ServiceOptions* release_options(); + + // @@protoc_insertion_point(class_scope:google.protobuf.ServiceDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto > method_; + ::google::protobuf::ServiceOptions* options_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static ServiceDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT MethodDescriptorProto : public ::google::protobuf::Message { + public: + MethodDescriptorProto(); + virtual ~MethodDescriptorProto(); + + MethodDescriptorProto(const MethodDescriptorProto& from); + + inline MethodDescriptorProto& operator=(const MethodDescriptorProto& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MethodDescriptorProto& default_instance(); + + void Swap(MethodDescriptorProto* other); + + // implements Message ---------------------------------------------- + + MethodDescriptorProto* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MethodDescriptorProto& from); + void MergeFrom(const MethodDescriptorProto& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional string name = 1; + inline bool has_name() const; + inline void clear_name(); + static const int kNameFieldNumber = 1; + inline const ::std::string& name() const; + inline void set_name(const ::std::string& value); + inline void set_name(const char* value); + inline void set_name(const char* value, size_t size); + inline ::std::string* mutable_name(); + inline ::std::string* release_name(); + + // optional string input_type = 2; + inline bool has_input_type() const; + inline void clear_input_type(); + static const int kInputTypeFieldNumber = 2; + inline const ::std::string& input_type() const; + inline void set_input_type(const ::std::string& value); + inline void set_input_type(const char* value); + inline void set_input_type(const char* value, size_t size); + inline ::std::string* mutable_input_type(); + inline ::std::string* release_input_type(); + + // optional string output_type = 3; + inline bool has_output_type() const; + inline void clear_output_type(); + static const int kOutputTypeFieldNumber = 3; + inline const ::std::string& output_type() const; + inline void set_output_type(const ::std::string& value); + inline void set_output_type(const char* value); + inline void set_output_type(const char* value, size_t size); + inline ::std::string* mutable_output_type(); + inline ::std::string* release_output_type(); + + // optional .google.protobuf.MethodOptions options = 4; + inline bool has_options() const; + inline void clear_options(); + static const int kOptionsFieldNumber = 4; + inline const ::google::protobuf::MethodOptions& options() const; + inline ::google::protobuf::MethodOptions* mutable_options(); + inline ::google::protobuf::MethodOptions* release_options(); + + // @@protoc_insertion_point(class_scope:google.protobuf.MethodDescriptorProto) + private: + inline void set_has_name(); + inline void clear_has_name(); + inline void set_has_input_type(); + inline void clear_has_input_type(); + inline void set_has_output_type(); + inline void clear_has_output_type(); + inline void set_has_options(); + inline void clear_has_options(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_; + ::std::string* input_type_; + ::std::string* output_type_; + ::google::protobuf::MethodOptions* options_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(4 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static MethodDescriptorProto* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FileOptions : public ::google::protobuf::Message { + public: + FileOptions(); + virtual ~FileOptions(); + + FileOptions(const FileOptions& from); + + inline FileOptions& operator=(const FileOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FileOptions& default_instance(); + + void Swap(FileOptions* other); + + // implements Message ---------------------------------------------- + + FileOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FileOptions& from); + void MergeFrom(const FileOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef FileOptions_OptimizeMode OptimizeMode; + static const OptimizeMode SPEED = FileOptions_OptimizeMode_SPEED; + static const OptimizeMode CODE_SIZE = FileOptions_OptimizeMode_CODE_SIZE; + static const OptimizeMode LITE_RUNTIME = FileOptions_OptimizeMode_LITE_RUNTIME; + static inline bool OptimizeMode_IsValid(int value) { + return FileOptions_OptimizeMode_IsValid(value); + } + static const OptimizeMode OptimizeMode_MIN = + FileOptions_OptimizeMode_OptimizeMode_MIN; + static const OptimizeMode OptimizeMode_MAX = + FileOptions_OptimizeMode_OptimizeMode_MAX; + static const int OptimizeMode_ARRAYSIZE = + FileOptions_OptimizeMode_OptimizeMode_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + OptimizeMode_descriptor() { + return FileOptions_OptimizeMode_descriptor(); + } + static inline const ::std::string& OptimizeMode_Name(OptimizeMode value) { + return FileOptions_OptimizeMode_Name(value); + } + static inline bool OptimizeMode_Parse(const ::std::string& name, + OptimizeMode* value) { + return FileOptions_OptimizeMode_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + // optional string java_package = 1; + inline bool has_java_package() const; + inline void clear_java_package(); + static const int kJavaPackageFieldNumber = 1; + inline const ::std::string& java_package() const; + inline void set_java_package(const ::std::string& value); + inline void set_java_package(const char* value); + inline void set_java_package(const char* value, size_t size); + inline ::std::string* mutable_java_package(); + inline ::std::string* release_java_package(); + + // optional string java_outer_classname = 8; + inline bool has_java_outer_classname() const; + inline void clear_java_outer_classname(); + static const int kJavaOuterClassnameFieldNumber = 8; + inline const ::std::string& java_outer_classname() const; + inline void set_java_outer_classname(const ::std::string& value); + inline void set_java_outer_classname(const char* value); + inline void set_java_outer_classname(const char* value, size_t size); + inline ::std::string* mutable_java_outer_classname(); + inline ::std::string* release_java_outer_classname(); + + // optional bool java_multiple_files = 10 [default = false]; + inline bool has_java_multiple_files() const; + inline void clear_java_multiple_files(); + static const int kJavaMultipleFilesFieldNumber = 10; + inline bool java_multiple_files() const; + inline void set_java_multiple_files(bool value); + + // optional bool java_generate_equals_and_hash = 20 [default = false]; + inline bool has_java_generate_equals_and_hash() const; + inline void clear_java_generate_equals_and_hash(); + static const int kJavaGenerateEqualsAndHashFieldNumber = 20; + inline bool java_generate_equals_and_hash() const; + inline void set_java_generate_equals_and_hash(bool value); + + // optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; + inline bool has_optimize_for() const; + inline void clear_optimize_for(); + static const int kOptimizeForFieldNumber = 9; + inline ::google::protobuf::FileOptions_OptimizeMode optimize_for() const; + inline void set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value); + + // optional bool cc_generic_services = 16 [default = false]; + inline bool has_cc_generic_services() const; + inline void clear_cc_generic_services(); + static const int kCcGenericServicesFieldNumber = 16; + inline bool cc_generic_services() const; + inline void set_cc_generic_services(bool value); + + // optional bool java_generic_services = 17 [default = false]; + inline bool has_java_generic_services() const; + inline void clear_java_generic_services(); + static const int kJavaGenericServicesFieldNumber = 17; + inline bool java_generic_services() const; + inline void set_java_generic_services(bool value); + + // optional bool py_generic_services = 18 [default = false]; + inline bool has_py_generic_services() const; + inline void clear_py_generic_services(); + static const int kPyGenericServicesFieldNumber = 18; + inline bool py_generic_services() const; + inline void set_py_generic_services(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FileOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.FileOptions) + private: + inline void set_has_java_package(); + inline void clear_has_java_package(); + inline void set_has_java_outer_classname(); + inline void clear_has_java_outer_classname(); + inline void set_has_java_multiple_files(); + inline void clear_has_java_multiple_files(); + inline void set_has_java_generate_equals_and_hash(); + inline void clear_has_java_generate_equals_and_hash(); + inline void set_has_optimize_for(); + inline void clear_has_optimize_for(); + inline void set_has_cc_generic_services(); + inline void clear_has_cc_generic_services(); + inline void set_has_java_generic_services(); + inline void clear_has_java_generic_services(); + inline void set_has_py_generic_services(); + inline void clear_has_py_generic_services(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* java_package_; + ::std::string* java_outer_classname_; + int optimize_for_; + bool java_multiple_files_; + bool java_generate_equals_and_hash_; + bool cc_generic_services_; + bool java_generic_services_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool py_generic_services_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(9 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FileOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT MessageOptions : public ::google::protobuf::Message { + public: + MessageOptions(); + virtual ~MessageOptions(); + + MessageOptions(const MessageOptions& from); + + inline MessageOptions& operator=(const MessageOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MessageOptions& default_instance(); + + void Swap(MessageOptions* other); + + // implements Message ---------------------------------------------- + + MessageOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MessageOptions& from); + void MergeFrom(const MessageOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // optional bool message_set_wire_format = 1 [default = false]; + inline bool has_message_set_wire_format() const; + inline void clear_message_set_wire_format(); + static const int kMessageSetWireFormatFieldNumber = 1; + inline bool message_set_wire_format() const; + inline void set_message_set_wire_format(bool value); + + // optional bool no_standard_descriptor_accessor = 2 [default = false]; + inline bool has_no_standard_descriptor_accessor() const; + inline void clear_no_standard_descriptor_accessor(); + static const int kNoStandardDescriptorAccessorFieldNumber = 2; + inline bool no_standard_descriptor_accessor() const; + inline void set_no_standard_descriptor_accessor(bool value); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MessageOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.MessageOptions) + private: + inline void set_has_message_set_wire_format(); + inline void clear_has_message_set_wire_format(); + inline void set_has_no_standard_descriptor_accessor(); + inline void clear_has_no_standard_descriptor_accessor(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + bool message_set_wire_format_; + bool no_standard_descriptor_accessor_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static MessageOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT FieldOptions : public ::google::protobuf::Message { + public: + FieldOptions(); + virtual ~FieldOptions(); + + FieldOptions(const FieldOptions& from); + + inline FieldOptions& operator=(const FieldOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const FieldOptions& default_instance(); + + void Swap(FieldOptions* other); + + // implements Message ---------------------------------------------- + + FieldOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const FieldOptions& from); + void MergeFrom(const FieldOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef FieldOptions_CType CType; + static const CType STRING = FieldOptions_CType_STRING; + static const CType CORD = FieldOptions_CType_CORD; + static const CType STRING_PIECE = FieldOptions_CType_STRING_PIECE; + static inline bool CType_IsValid(int value) { + return FieldOptions_CType_IsValid(value); + } + static const CType CType_MIN = + FieldOptions_CType_CType_MIN; + static const CType CType_MAX = + FieldOptions_CType_CType_MAX; + static const int CType_ARRAYSIZE = + FieldOptions_CType_CType_ARRAYSIZE; + static inline const ::google::protobuf::EnumDescriptor* + CType_descriptor() { + return FieldOptions_CType_descriptor(); + } + static inline const ::std::string& CType_Name(CType value) { + return FieldOptions_CType_Name(value); + } + static inline bool CType_Parse(const ::std::string& name, + CType* value) { + return FieldOptions_CType_Parse(name, value); + } + + // accessors ------------------------------------------------------- + + // optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; + inline bool has_ctype() const; + inline void clear_ctype(); + static const int kCtypeFieldNumber = 1; + inline ::google::protobuf::FieldOptions_CType ctype() const; + inline void set_ctype(::google::protobuf::FieldOptions_CType value); + + // optional bool packed = 2; + inline bool has_packed() const; + inline void clear_packed(); + static const int kPackedFieldNumber = 2; + inline bool packed() const; + inline void set_packed(bool value); + + // optional bool deprecated = 3 [default = false]; + inline bool has_deprecated() const; + inline void clear_deprecated(); + static const int kDeprecatedFieldNumber = 3; + inline bool deprecated() const; + inline void set_deprecated(bool value); + + // optional string experimental_map_key = 9; + inline bool has_experimental_map_key() const; + inline void clear_experimental_map_key(); + static const int kExperimentalMapKeyFieldNumber = 9; + inline const ::std::string& experimental_map_key() const; + inline void set_experimental_map_key(const ::std::string& value); + inline void set_experimental_map_key(const char* value); + inline void set_experimental_map_key(const char* value, size_t size); + inline ::std::string* mutable_experimental_map_key(); + inline ::std::string* release_experimental_map_key(); + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(FieldOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.FieldOptions) + private: + inline void set_has_ctype(); + inline void clear_has_ctype(); + inline void set_has_packed(); + inline void clear_has_packed(); + inline void set_has_deprecated(); + inline void clear_has_deprecated(); + inline void set_has_experimental_map_key(); + inline void clear_has_experimental_map_key(); + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + int ctype_; + bool packed_; + bool deprecated_; + ::std::string* experimental_map_key_; + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(5 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static FieldOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumOptions : public ::google::protobuf::Message { + public: + EnumOptions(); + virtual ~EnumOptions(); + + EnumOptions(const EnumOptions& from); + + inline EnumOptions& operator=(const EnumOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumOptions& default_instance(); + + void Swap(EnumOptions* other); + + // implements Message ---------------------------------------------- + + EnumOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumOptions& from); + void MergeFrom(const EnumOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.EnumOptions) + private: + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT EnumValueOptions : public ::google::protobuf::Message { + public: + EnumValueOptions(); + virtual ~EnumValueOptions(); + + EnumValueOptions(const EnumValueOptions& from); + + inline EnumValueOptions& operator=(const EnumValueOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const EnumValueOptions& default_instance(); + + void Swap(EnumValueOptions* other); + + // implements Message ---------------------------------------------- + + EnumValueOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const EnumValueOptions& from); + void MergeFrom(const EnumValueOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(EnumValueOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.EnumValueOptions) + private: + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static EnumValueOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT ServiceOptions : public ::google::protobuf::Message { + public: + ServiceOptions(); + virtual ~ServiceOptions(); + + ServiceOptions(const ServiceOptions& from); + + inline ServiceOptions& operator=(const ServiceOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const ServiceOptions& default_instance(); + + void Swap(ServiceOptions* other); + + // implements Message ---------------------------------------------- + + ServiceOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const ServiceOptions& from); + void MergeFrom(const ServiceOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(ServiceOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.ServiceOptions) + private: + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static ServiceOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT MethodOptions : public ::google::protobuf::Message { + public: + MethodOptions(); + virtual ~MethodOptions(); + + MethodOptions(const MethodOptions& from); + + inline MethodOptions& operator=(const MethodOptions& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const MethodOptions& default_instance(); + + void Swap(MethodOptions* other); + + // implements Message ---------------------------------------------- + + MethodOptions* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const MethodOptions& from); + void MergeFrom(const MethodOptions& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; + inline int uninterpreted_option_size() const; + inline void clear_uninterpreted_option(); + static const int kUninterpretedOptionFieldNumber = 999; + inline const ::google::protobuf::UninterpretedOption& uninterpreted_option(int index) const; + inline ::google::protobuf::UninterpretedOption* mutable_uninterpreted_option(int index); + inline ::google::protobuf::UninterpretedOption* add_uninterpreted_option(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& + uninterpreted_option() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* + mutable_uninterpreted_option(); + + GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(MethodOptions) + // @@protoc_insertion_point(class_scope:google.protobuf.MethodOptions) + private: + + ::google::protobuf::internal::ExtensionSet _extensions_; + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption > uninterpreted_option_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static MethodOptions* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT UninterpretedOption_NamePart : public ::google::protobuf::Message { + public: + UninterpretedOption_NamePart(); + virtual ~UninterpretedOption_NamePart(); + + UninterpretedOption_NamePart(const UninterpretedOption_NamePart& from); + + inline UninterpretedOption_NamePart& operator=(const UninterpretedOption_NamePart& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const UninterpretedOption_NamePart& default_instance(); + + void Swap(UninterpretedOption_NamePart* other); + + // implements Message ---------------------------------------------- + + UninterpretedOption_NamePart* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const UninterpretedOption_NamePart& from); + void MergeFrom(const UninterpretedOption_NamePart& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // required string name_part = 1; + inline bool has_name_part() const; + inline void clear_name_part(); + static const int kNamePartFieldNumber = 1; + inline const ::std::string& name_part() const; + inline void set_name_part(const ::std::string& value); + inline void set_name_part(const char* value); + inline void set_name_part(const char* value, size_t size); + inline ::std::string* mutable_name_part(); + inline ::std::string* release_name_part(); + + // required bool is_extension = 2; + inline bool has_is_extension() const; + inline void clear_is_extension(); + static const int kIsExtensionFieldNumber = 2; + inline bool is_extension() const; + inline void set_is_extension(bool value); + + // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption.NamePart) + private: + inline void set_has_name_part(); + inline void clear_has_name_part(); + inline void set_has_is_extension(); + inline void clear_has_is_extension(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::std::string* name_part_; + bool is_extension_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static UninterpretedOption_NamePart* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT UninterpretedOption : public ::google::protobuf::Message { + public: + UninterpretedOption(); + virtual ~UninterpretedOption(); + + UninterpretedOption(const UninterpretedOption& from); + + inline UninterpretedOption& operator=(const UninterpretedOption& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const UninterpretedOption& default_instance(); + + void Swap(UninterpretedOption* other); + + // implements Message ---------------------------------------------- + + UninterpretedOption* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const UninterpretedOption& from); + void MergeFrom(const UninterpretedOption& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef UninterpretedOption_NamePart NamePart; + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.UninterpretedOption.NamePart name = 2; + inline int name_size() const; + inline void clear_name(); + static const int kNameFieldNumber = 2; + inline const ::google::protobuf::UninterpretedOption_NamePart& name(int index) const; + inline ::google::protobuf::UninterpretedOption_NamePart* mutable_name(int index); + inline ::google::protobuf::UninterpretedOption_NamePart* add_name(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >& + name() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >* + mutable_name(); + + // optional string identifier_value = 3; + inline bool has_identifier_value() const; + inline void clear_identifier_value(); + static const int kIdentifierValueFieldNumber = 3; + inline const ::std::string& identifier_value() const; + inline void set_identifier_value(const ::std::string& value); + inline void set_identifier_value(const char* value); + inline void set_identifier_value(const char* value, size_t size); + inline ::std::string* mutable_identifier_value(); + inline ::std::string* release_identifier_value(); + + // optional uint64 positive_int_value = 4; + inline bool has_positive_int_value() const; + inline void clear_positive_int_value(); + static const int kPositiveIntValueFieldNumber = 4; + inline ::google::protobuf::uint64 positive_int_value() const; + inline void set_positive_int_value(::google::protobuf::uint64 value); + + // optional int64 negative_int_value = 5; + inline bool has_negative_int_value() const; + inline void clear_negative_int_value(); + static const int kNegativeIntValueFieldNumber = 5; + inline ::google::protobuf::int64 negative_int_value() const; + inline void set_negative_int_value(::google::protobuf::int64 value); + + // optional double double_value = 6; + inline bool has_double_value() const; + inline void clear_double_value(); + static const int kDoubleValueFieldNumber = 6; + inline double double_value() const; + inline void set_double_value(double value); + + // optional bytes string_value = 7; + inline bool has_string_value() const; + inline void clear_string_value(); + static const int kStringValueFieldNumber = 7; + inline const ::std::string& string_value() const; + inline void set_string_value(const ::std::string& value); + inline void set_string_value(const char* value); + inline void set_string_value(const void* value, size_t size); + inline ::std::string* mutable_string_value(); + inline ::std::string* release_string_value(); + + // optional string aggregate_value = 8; + inline bool has_aggregate_value() const; + inline void clear_aggregate_value(); + static const int kAggregateValueFieldNumber = 8; + inline const ::std::string& aggregate_value() const; + inline void set_aggregate_value(const ::std::string& value); + inline void set_aggregate_value(const char* value); + inline void set_aggregate_value(const char* value, size_t size); + inline ::std::string* mutable_aggregate_value(); + inline ::std::string* release_aggregate_value(); + + // @@protoc_insertion_point(class_scope:google.protobuf.UninterpretedOption) + private: + inline void set_has_identifier_value(); + inline void clear_has_identifier_value(); + inline void set_has_positive_int_value(); + inline void clear_has_positive_int_value(); + inline void set_has_negative_int_value(); + inline void clear_has_negative_int_value(); + inline void set_has_double_value(); + inline void clear_has_double_value(); + inline void set_has_string_value(); + inline void clear_has_string_value(); + inline void set_has_aggregate_value(); + inline void clear_has_aggregate_value(); + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart > name_; + ::std::string* identifier_value_; + ::google::protobuf::uint64 positive_int_value_; + ::google::protobuf::int64 negative_int_value_; + double double_value_; + ::std::string* string_value_; + ::std::string* aggregate_value_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(7 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static UninterpretedOption* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT SourceCodeInfo_Location : public ::google::protobuf::Message { + public: + SourceCodeInfo_Location(); + virtual ~SourceCodeInfo_Location(); + + SourceCodeInfo_Location(const SourceCodeInfo_Location& from); + + inline SourceCodeInfo_Location& operator=(const SourceCodeInfo_Location& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const SourceCodeInfo_Location& default_instance(); + + void Swap(SourceCodeInfo_Location* other); + + // implements Message ---------------------------------------------- + + SourceCodeInfo_Location* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const SourceCodeInfo_Location& from); + void MergeFrom(const SourceCodeInfo_Location& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + // accessors ------------------------------------------------------- + + // repeated int32 path = 1 [packed = true]; + inline int path_size() const; + inline void clear_path(); + static const int kPathFieldNumber = 1; + inline ::google::protobuf::int32 path(int index) const; + inline void set_path(int index, ::google::protobuf::int32 value); + inline void add_path(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + path() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_path(); + + // repeated int32 span = 2 [packed = true]; + inline int span_size() const; + inline void clear_span(); + static const int kSpanFieldNumber = 2; + inline ::google::protobuf::int32 span(int index) const; + inline void set_span(int index, ::google::protobuf::int32 value); + inline void add_span(::google::protobuf::int32 value); + inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& + span() const; + inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* + mutable_span(); + + // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo.Location) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > path_; + mutable int _path_cached_byte_size_; + ::google::protobuf::RepeatedField< ::google::protobuf::int32 > span_; + mutable int _span_cached_byte_size_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static SourceCodeInfo_Location* default_instance_; +}; +// ------------------------------------------------------------------- + +class LIBPROTOBUF_EXPORT SourceCodeInfo : public ::google::protobuf::Message { + public: + SourceCodeInfo(); + virtual ~SourceCodeInfo(); + + SourceCodeInfo(const SourceCodeInfo& from); + + inline SourceCodeInfo& operator=(const SourceCodeInfo& from) { + CopyFrom(from); + return *this; + } + + inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { + return _unknown_fields_; + } + + inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { + return &_unknown_fields_; + } + + static const ::google::protobuf::Descriptor* descriptor(); + static const SourceCodeInfo& default_instance(); + + void Swap(SourceCodeInfo* other); + + // implements Message ---------------------------------------------- + + SourceCodeInfo* New() const; + void CopyFrom(const ::google::protobuf::Message& from); + void MergeFrom(const ::google::protobuf::Message& from); + void CopyFrom(const SourceCodeInfo& from); + void MergeFrom(const SourceCodeInfo& from); + void Clear(); + bool IsInitialized() const; + + int ByteSize() const; + bool MergePartialFromCodedStream( + ::google::protobuf::io::CodedInputStream* input); + void SerializeWithCachedSizes( + ::google::protobuf::io::CodedOutputStream* output) const; + ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; + int GetCachedSize() const { return _cached_size_; } + private: + void SharedCtor(); + void SharedDtor(); + void SetCachedSize(int size) const; + public: + + ::google::protobuf::Metadata GetMetadata() const; + + // nested types ---------------------------------------------------- + + typedef SourceCodeInfo_Location Location; + + // accessors ------------------------------------------------------- + + // repeated .google.protobuf.SourceCodeInfo.Location location = 1; + inline int location_size() const; + inline void clear_location(); + static const int kLocationFieldNumber = 1; + inline const ::google::protobuf::SourceCodeInfo_Location& location(int index) const; + inline ::google::protobuf::SourceCodeInfo_Location* mutable_location(int index); + inline ::google::protobuf::SourceCodeInfo_Location* add_location(); + inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >& + location() const; + inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >* + mutable_location(); + + // @@protoc_insertion_point(class_scope:google.protobuf.SourceCodeInfo) + private: + + ::google::protobuf::UnknownFieldSet _unknown_fields_; + + ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location > location_; + + mutable int _cached_size_; + ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; + + friend void LIBPROTOBUF_EXPORT protobuf_AddDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_AssignDesc_google_2fprotobuf_2fdescriptor_2eproto(); + friend void protobuf_ShutdownFile_google_2fprotobuf_2fdescriptor_2eproto(); + + void InitAsDefaultInstance(); + static SourceCodeInfo* default_instance_; +}; +// =================================================================== + + +// =================================================================== + +// FileDescriptorSet + +// repeated .google.protobuf.FileDescriptorProto file = 1; +inline int FileDescriptorSet::file_size() const { + return file_.size(); +} +inline void FileDescriptorSet::clear_file() { + file_.Clear(); +} +inline const ::google::protobuf::FileDescriptorProto& FileDescriptorSet::file(int index) const { + return file_.Get(index); +} +inline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::mutable_file(int index) { + return file_.Mutable(index); +} +inline ::google::protobuf::FileDescriptorProto* FileDescriptorSet::add_file() { + return file_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >& +FileDescriptorSet::file() const { + return file_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FileDescriptorProto >* +FileDescriptorSet::mutable_file() { + return &file_; +} + +// ------------------------------------------------------------------- + +// FileDescriptorProto + +// optional string name = 1; +inline bool FileDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FileDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void FileDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FileDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& FileDescriptorProto::name() const { + return *name_; +} +inline void FileDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void FileDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void FileDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FileDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* FileDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string package = 2; +inline bool FileDescriptorProto::has_package() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FileDescriptorProto::set_has_package() { + _has_bits_[0] |= 0x00000002u; +} +inline void FileDescriptorProto::clear_has_package() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FileDescriptorProto::clear_package() { + if (package_ != &::google::protobuf::internal::kEmptyString) { + package_->clear(); + } + clear_has_package(); +} +inline const ::std::string& FileDescriptorProto::package() const { + return *package_; +} +inline void FileDescriptorProto::set_package(const ::std::string& value) { + set_has_package(); + if (package_ == &::google::protobuf::internal::kEmptyString) { + package_ = new ::std::string; + } + package_->assign(value); +} +inline void FileDescriptorProto::set_package(const char* value) { + set_has_package(); + if (package_ == &::google::protobuf::internal::kEmptyString) { + package_ = new ::std::string; + } + package_->assign(value); +} +inline void FileDescriptorProto::set_package(const char* value, size_t size) { + set_has_package(); + if (package_ == &::google::protobuf::internal::kEmptyString) { + package_ = new ::std::string; + } + package_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FileDescriptorProto::mutable_package() { + set_has_package(); + if (package_ == &::google::protobuf::internal::kEmptyString) { + package_ = new ::std::string; + } + return package_; +} +inline ::std::string* FileDescriptorProto::release_package() { + clear_has_package(); + if (package_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = package_; + package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated string dependency = 3; +inline int FileDescriptorProto::dependency_size() const { + return dependency_.size(); +} +inline void FileDescriptorProto::clear_dependency() { + dependency_.Clear(); +} +inline const ::std::string& FileDescriptorProto::dependency(int index) const { + return dependency_.Get(index); +} +inline ::std::string* FileDescriptorProto::mutable_dependency(int index) { + return dependency_.Mutable(index); +} +inline void FileDescriptorProto::set_dependency(int index, const ::std::string& value) { + dependency_.Mutable(index)->assign(value); +} +inline void FileDescriptorProto::set_dependency(int index, const char* value) { + dependency_.Mutable(index)->assign(value); +} +inline void FileDescriptorProto::set_dependency(int index, const char* value, size_t size) { + dependency_.Mutable(index)->assign( + reinterpret_cast(value), size); +} +inline ::std::string* FileDescriptorProto::add_dependency() { + return dependency_.Add(); +} +inline void FileDescriptorProto::add_dependency(const ::std::string& value) { + dependency_.Add()->assign(value); +} +inline void FileDescriptorProto::add_dependency(const char* value) { + dependency_.Add()->assign(value); +} +inline void FileDescriptorProto::add_dependency(const char* value, size_t size) { + dependency_.Add()->assign(reinterpret_cast(value), size); +} +inline const ::google::protobuf::RepeatedPtrField< ::std::string>& +FileDescriptorProto::dependency() const { + return dependency_; +} +inline ::google::protobuf::RepeatedPtrField< ::std::string>* +FileDescriptorProto::mutable_dependency() { + return &dependency_; +} + +// repeated .google.protobuf.DescriptorProto message_type = 4; +inline int FileDescriptorProto::message_type_size() const { + return message_type_.size(); +} +inline void FileDescriptorProto::clear_message_type() { + message_type_.Clear(); +} +inline const ::google::protobuf::DescriptorProto& FileDescriptorProto::message_type(int index) const { + return message_type_.Get(index); +} +inline ::google::protobuf::DescriptorProto* FileDescriptorProto::mutable_message_type(int index) { + return message_type_.Mutable(index); +} +inline ::google::protobuf::DescriptorProto* FileDescriptorProto::add_message_type() { + return message_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& +FileDescriptorProto::message_type() const { + return message_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* +FileDescriptorProto::mutable_message_type() { + return &message_type_; +} + +// repeated .google.protobuf.EnumDescriptorProto enum_type = 5; +inline int FileDescriptorProto::enum_type_size() const { + return enum_type_.size(); +} +inline void FileDescriptorProto::clear_enum_type() { + enum_type_.Clear(); +} +inline const ::google::protobuf::EnumDescriptorProto& FileDescriptorProto::enum_type(int index) const { + return enum_type_.Get(index); +} +inline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::mutable_enum_type(int index) { + return enum_type_.Mutable(index); +} +inline ::google::protobuf::EnumDescriptorProto* FileDescriptorProto::add_enum_type() { + return enum_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& +FileDescriptorProto::enum_type() const { + return enum_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* +FileDescriptorProto::mutable_enum_type() { + return &enum_type_; +} + +// repeated .google.protobuf.ServiceDescriptorProto service = 6; +inline int FileDescriptorProto::service_size() const { + return service_.size(); +} +inline void FileDescriptorProto::clear_service() { + service_.Clear(); +} +inline const ::google::protobuf::ServiceDescriptorProto& FileDescriptorProto::service(int index) const { + return service_.Get(index); +} +inline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::mutable_service(int index) { + return service_.Mutable(index); +} +inline ::google::protobuf::ServiceDescriptorProto* FileDescriptorProto::add_service() { + return service_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >& +FileDescriptorProto::service() const { + return service_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::ServiceDescriptorProto >* +FileDescriptorProto::mutable_service() { + return &service_; +} + +// repeated .google.protobuf.FieldDescriptorProto extension = 7; +inline int FileDescriptorProto::extension_size() const { + return extension_.size(); +} +inline void FileDescriptorProto::clear_extension() { + extension_.Clear(); +} +inline const ::google::protobuf::FieldDescriptorProto& FileDescriptorProto::extension(int index) const { + return extension_.Get(index); +} +inline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::mutable_extension(int index) { + return extension_.Mutable(index); +} +inline ::google::protobuf::FieldDescriptorProto* FileDescriptorProto::add_extension() { + return extension_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& +FileDescriptorProto::extension() const { + return extension_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* +FileDescriptorProto::mutable_extension() { + return &extension_; +} + +// optional .google.protobuf.FileOptions options = 8; +inline bool FileDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void FileDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000080u; +} +inline void FileDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000080u; +} +inline void FileDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::FileOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::FileOptions& FileDescriptorProto::options() const { + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::FileOptions* FileDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::FileOptions; + return options_; +} +inline ::google::protobuf::FileOptions* FileDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::FileOptions* temp = options_; + options_ = NULL; + return temp; +} + +// optional .google.protobuf.SourceCodeInfo source_code_info = 9; +inline bool FileDescriptorProto::has_source_code_info() const { + return (_has_bits_[0] & 0x00000100u) != 0; +} +inline void FileDescriptorProto::set_has_source_code_info() { + _has_bits_[0] |= 0x00000100u; +} +inline void FileDescriptorProto::clear_has_source_code_info() { + _has_bits_[0] &= ~0x00000100u; +} +inline void FileDescriptorProto::clear_source_code_info() { + if (source_code_info_ != NULL) source_code_info_->::google::protobuf::SourceCodeInfo::Clear(); + clear_has_source_code_info(); +} +inline const ::google::protobuf::SourceCodeInfo& FileDescriptorProto::source_code_info() const { + return source_code_info_ != NULL ? *source_code_info_ : *default_instance_->source_code_info_; +} +inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::mutable_source_code_info() { + set_has_source_code_info(); + if (source_code_info_ == NULL) source_code_info_ = new ::google::protobuf::SourceCodeInfo; + return source_code_info_; +} +inline ::google::protobuf::SourceCodeInfo* FileDescriptorProto::release_source_code_info() { + clear_has_source_code_info(); + ::google::protobuf::SourceCodeInfo* temp = source_code_info_; + source_code_info_ = NULL; + return temp; +} + +// ------------------------------------------------------------------- + +// DescriptorProto_ExtensionRange + +// optional int32 start = 1; +inline bool DescriptorProto_ExtensionRange::has_start() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void DescriptorProto_ExtensionRange::set_has_start() { + _has_bits_[0] |= 0x00000001u; +} +inline void DescriptorProto_ExtensionRange::clear_has_start() { + _has_bits_[0] &= ~0x00000001u; +} +inline void DescriptorProto_ExtensionRange::clear_start() { + start_ = 0; + clear_has_start(); +} +inline ::google::protobuf::int32 DescriptorProto_ExtensionRange::start() const { + return start_; +} +inline void DescriptorProto_ExtensionRange::set_start(::google::protobuf::int32 value) { + set_has_start(); + start_ = value; +} + +// optional int32 end = 2; +inline bool DescriptorProto_ExtensionRange::has_end() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void DescriptorProto_ExtensionRange::set_has_end() { + _has_bits_[0] |= 0x00000002u; +} +inline void DescriptorProto_ExtensionRange::clear_has_end() { + _has_bits_[0] &= ~0x00000002u; +} +inline void DescriptorProto_ExtensionRange::clear_end() { + end_ = 0; + clear_has_end(); +} +inline ::google::protobuf::int32 DescriptorProto_ExtensionRange::end() const { + return end_; +} +inline void DescriptorProto_ExtensionRange::set_end(::google::protobuf::int32 value) { + set_has_end(); + end_ = value; +} + +// ------------------------------------------------------------------- + +// DescriptorProto + +// optional string name = 1; +inline bool DescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void DescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void DescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void DescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& DescriptorProto::name() const { + return *name_; +} +inline void DescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void DescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void DescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* DescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* DescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .google.protobuf.FieldDescriptorProto field = 2; +inline int DescriptorProto::field_size() const { + return field_.size(); +} +inline void DescriptorProto::clear_field() { + field_.Clear(); +} +inline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::field(int index) const { + return field_.Get(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_field(int index) { + return field_.Mutable(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_field() { + return field_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& +DescriptorProto::field() const { + return field_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* +DescriptorProto::mutable_field() { + return &field_; +} + +// repeated .google.protobuf.FieldDescriptorProto extension = 6; +inline int DescriptorProto::extension_size() const { + return extension_.size(); +} +inline void DescriptorProto::clear_extension() { + extension_.Clear(); +} +inline const ::google::protobuf::FieldDescriptorProto& DescriptorProto::extension(int index) const { + return extension_.Get(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::mutable_extension(int index) { + return extension_.Mutable(index); +} +inline ::google::protobuf::FieldDescriptorProto* DescriptorProto::add_extension() { + return extension_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >& +DescriptorProto::extension() const { + return extension_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::FieldDescriptorProto >* +DescriptorProto::mutable_extension() { + return &extension_; +} + +// repeated .google.protobuf.DescriptorProto nested_type = 3; +inline int DescriptorProto::nested_type_size() const { + return nested_type_.size(); +} +inline void DescriptorProto::clear_nested_type() { + nested_type_.Clear(); +} +inline const ::google::protobuf::DescriptorProto& DescriptorProto::nested_type(int index) const { + return nested_type_.Get(index); +} +inline ::google::protobuf::DescriptorProto* DescriptorProto::mutable_nested_type(int index) { + return nested_type_.Mutable(index); +} +inline ::google::protobuf::DescriptorProto* DescriptorProto::add_nested_type() { + return nested_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >& +DescriptorProto::nested_type() const { + return nested_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto >* +DescriptorProto::mutable_nested_type() { + return &nested_type_; +} + +// repeated .google.protobuf.EnumDescriptorProto enum_type = 4; +inline int DescriptorProto::enum_type_size() const { + return enum_type_.size(); +} +inline void DescriptorProto::clear_enum_type() { + enum_type_.Clear(); +} +inline const ::google::protobuf::EnumDescriptorProto& DescriptorProto::enum_type(int index) const { + return enum_type_.Get(index); +} +inline ::google::protobuf::EnumDescriptorProto* DescriptorProto::mutable_enum_type(int index) { + return enum_type_.Mutable(index); +} +inline ::google::protobuf::EnumDescriptorProto* DescriptorProto::add_enum_type() { + return enum_type_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >& +DescriptorProto::enum_type() const { + return enum_type_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumDescriptorProto >* +DescriptorProto::mutable_enum_type() { + return &enum_type_; +} + +// repeated .google.protobuf.DescriptorProto.ExtensionRange extension_range = 5; +inline int DescriptorProto::extension_range_size() const { + return extension_range_.size(); +} +inline void DescriptorProto::clear_extension_range() { + extension_range_.Clear(); +} +inline const ::google::protobuf::DescriptorProto_ExtensionRange& DescriptorProto::extension_range(int index) const { + return extension_range_.Get(index); +} +inline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::mutable_extension_range(int index) { + return extension_range_.Mutable(index); +} +inline ::google::protobuf::DescriptorProto_ExtensionRange* DescriptorProto::add_extension_range() { + return extension_range_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >& +DescriptorProto::extension_range() const { + return extension_range_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::DescriptorProto_ExtensionRange >* +DescriptorProto::mutable_extension_range() { + return &extension_range_; +} + +// optional .google.protobuf.MessageOptions options = 7; +inline bool DescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void DescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000040u; +} +inline void DescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000040u; +} +inline void DescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::MessageOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::MessageOptions& DescriptorProto::options() const { + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::MessageOptions* DescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::MessageOptions; + return options_; +} +inline ::google::protobuf::MessageOptions* DescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::MessageOptions* temp = options_; + options_ = NULL; + return temp; +} + +// ------------------------------------------------------------------- + +// FieldDescriptorProto + +// optional string name = 1; +inline bool FieldDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FieldDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void FieldDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FieldDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& FieldDescriptorProto::name() const { + return *name_; +} +inline void FieldDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void FieldDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void FieldDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FieldDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* FieldDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional int32 number = 3; +inline bool FieldDescriptorProto::has_number() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FieldDescriptorProto::set_has_number() { + _has_bits_[0] |= 0x00000002u; +} +inline void FieldDescriptorProto::clear_has_number() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FieldDescriptorProto::clear_number() { + number_ = 0; + clear_has_number(); +} +inline ::google::protobuf::int32 FieldDescriptorProto::number() const { + return number_; +} +inline void FieldDescriptorProto::set_number(::google::protobuf::int32 value) { + set_has_number(); + number_ = value; +} + +// optional .google.protobuf.FieldDescriptorProto.Label label = 4; +inline bool FieldDescriptorProto::has_label() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void FieldDescriptorProto::set_has_label() { + _has_bits_[0] |= 0x00000004u; +} +inline void FieldDescriptorProto::clear_has_label() { + _has_bits_[0] &= ~0x00000004u; +} +inline void FieldDescriptorProto::clear_label() { + label_ = 1; + clear_has_label(); +} +inline ::google::protobuf::FieldDescriptorProto_Label FieldDescriptorProto::label() const { + return static_cast< ::google::protobuf::FieldDescriptorProto_Label >(label_); +} +inline void FieldDescriptorProto::set_label(::google::protobuf::FieldDescriptorProto_Label value) { + GOOGLE_DCHECK(::google::protobuf::FieldDescriptorProto_Label_IsValid(value)); + set_has_label(); + label_ = value; +} + +// optional .google.protobuf.FieldDescriptorProto.Type type = 5; +inline bool FieldDescriptorProto::has_type() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void FieldDescriptorProto::set_has_type() { + _has_bits_[0] |= 0x00000008u; +} +inline void FieldDescriptorProto::clear_has_type() { + _has_bits_[0] &= ~0x00000008u; +} +inline void FieldDescriptorProto::clear_type() { + type_ = 1; + clear_has_type(); +} +inline ::google::protobuf::FieldDescriptorProto_Type FieldDescriptorProto::type() const { + return static_cast< ::google::protobuf::FieldDescriptorProto_Type >(type_); +} +inline void FieldDescriptorProto::set_type(::google::protobuf::FieldDescriptorProto_Type value) { + GOOGLE_DCHECK(::google::protobuf::FieldDescriptorProto_Type_IsValid(value)); + set_has_type(); + type_ = value; +} + +// optional string type_name = 6; +inline bool FieldDescriptorProto::has_type_name() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void FieldDescriptorProto::set_has_type_name() { + _has_bits_[0] |= 0x00000010u; +} +inline void FieldDescriptorProto::clear_has_type_name() { + _has_bits_[0] &= ~0x00000010u; +} +inline void FieldDescriptorProto::clear_type_name() { + if (type_name_ != &::google::protobuf::internal::kEmptyString) { + type_name_->clear(); + } + clear_has_type_name(); +} +inline const ::std::string& FieldDescriptorProto::type_name() const { + return *type_name_; +} +inline void FieldDescriptorProto::set_type_name(const ::std::string& value) { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::kEmptyString) { + type_name_ = new ::std::string; + } + type_name_->assign(value); +} +inline void FieldDescriptorProto::set_type_name(const char* value) { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::kEmptyString) { + type_name_ = new ::std::string; + } + type_name_->assign(value); +} +inline void FieldDescriptorProto::set_type_name(const char* value, size_t size) { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::kEmptyString) { + type_name_ = new ::std::string; + } + type_name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FieldDescriptorProto::mutable_type_name() { + set_has_type_name(); + if (type_name_ == &::google::protobuf::internal::kEmptyString) { + type_name_ = new ::std::string; + } + return type_name_; +} +inline ::std::string* FieldDescriptorProto::release_type_name() { + clear_has_type_name(); + if (type_name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = type_name_; + type_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string extendee = 2; +inline bool FieldDescriptorProto::has_extendee() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void FieldDescriptorProto::set_has_extendee() { + _has_bits_[0] |= 0x00000020u; +} +inline void FieldDescriptorProto::clear_has_extendee() { + _has_bits_[0] &= ~0x00000020u; +} +inline void FieldDescriptorProto::clear_extendee() { + if (extendee_ != &::google::protobuf::internal::kEmptyString) { + extendee_->clear(); + } + clear_has_extendee(); +} +inline const ::std::string& FieldDescriptorProto::extendee() const { + return *extendee_; +} +inline void FieldDescriptorProto::set_extendee(const ::std::string& value) { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::kEmptyString) { + extendee_ = new ::std::string; + } + extendee_->assign(value); +} +inline void FieldDescriptorProto::set_extendee(const char* value) { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::kEmptyString) { + extendee_ = new ::std::string; + } + extendee_->assign(value); +} +inline void FieldDescriptorProto::set_extendee(const char* value, size_t size) { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::kEmptyString) { + extendee_ = new ::std::string; + } + extendee_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FieldDescriptorProto::mutable_extendee() { + set_has_extendee(); + if (extendee_ == &::google::protobuf::internal::kEmptyString) { + extendee_ = new ::std::string; + } + return extendee_; +} +inline ::std::string* FieldDescriptorProto::release_extendee() { + clear_has_extendee(); + if (extendee_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = extendee_; + extendee_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string default_value = 7; +inline bool FieldDescriptorProto::has_default_value() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void FieldDescriptorProto::set_has_default_value() { + _has_bits_[0] |= 0x00000040u; +} +inline void FieldDescriptorProto::clear_has_default_value() { + _has_bits_[0] &= ~0x00000040u; +} +inline void FieldDescriptorProto::clear_default_value() { + if (default_value_ != &::google::protobuf::internal::kEmptyString) { + default_value_->clear(); + } + clear_has_default_value(); +} +inline const ::std::string& FieldDescriptorProto::default_value() const { + return *default_value_; +} +inline void FieldDescriptorProto::set_default_value(const ::std::string& value) { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::kEmptyString) { + default_value_ = new ::std::string; + } + default_value_->assign(value); +} +inline void FieldDescriptorProto::set_default_value(const char* value) { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::kEmptyString) { + default_value_ = new ::std::string; + } + default_value_->assign(value); +} +inline void FieldDescriptorProto::set_default_value(const char* value, size_t size) { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::kEmptyString) { + default_value_ = new ::std::string; + } + default_value_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FieldDescriptorProto::mutable_default_value() { + set_has_default_value(); + if (default_value_ == &::google::protobuf::internal::kEmptyString) { + default_value_ = new ::std::string; + } + return default_value_; +} +inline ::std::string* FieldDescriptorProto::release_default_value() { + clear_has_default_value(); + if (default_value_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = default_value_; + default_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional .google.protobuf.FieldOptions options = 8; +inline bool FieldDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void FieldDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000080u; +} +inline void FieldDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000080u; +} +inline void FieldDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::FieldOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::FieldOptions& FieldDescriptorProto::options() const { + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::FieldOptions* FieldDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::FieldOptions; + return options_; +} +inline ::google::protobuf::FieldOptions* FieldDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::FieldOptions* temp = options_; + options_ = NULL; + return temp; +} + +// ------------------------------------------------------------------- + +// EnumDescriptorProto + +// optional string name = 1; +inline bool EnumDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void EnumDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void EnumDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void EnumDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& EnumDescriptorProto::name() const { + return *name_; +} +inline void EnumDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void EnumDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void EnumDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* EnumDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* EnumDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .google.protobuf.EnumValueDescriptorProto value = 2; +inline int EnumDescriptorProto::value_size() const { + return value_.size(); +} +inline void EnumDescriptorProto::clear_value() { + value_.Clear(); +} +inline const ::google::protobuf::EnumValueDescriptorProto& EnumDescriptorProto::value(int index) const { + return value_.Get(index); +} +inline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::mutable_value(int index) { + return value_.Mutable(index); +} +inline ::google::protobuf::EnumValueDescriptorProto* EnumDescriptorProto::add_value() { + return value_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >& +EnumDescriptorProto::value() const { + return value_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::EnumValueDescriptorProto >* +EnumDescriptorProto::mutable_value() { + return &value_; +} + +// optional .google.protobuf.EnumOptions options = 3; +inline bool EnumDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void EnumDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000004u; +} +inline void EnumDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000004u; +} +inline void EnumDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::EnumOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::EnumOptions& EnumDescriptorProto::options() const { + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::EnumOptions* EnumDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::EnumOptions; + return options_; +} +inline ::google::protobuf::EnumOptions* EnumDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::EnumOptions* temp = options_; + options_ = NULL; + return temp; +} + +// ------------------------------------------------------------------- + +// EnumValueDescriptorProto + +// optional string name = 1; +inline bool EnumValueDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void EnumValueDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void EnumValueDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void EnumValueDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& EnumValueDescriptorProto::name() const { + return *name_; +} +inline void EnumValueDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void EnumValueDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void EnumValueDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* EnumValueDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* EnumValueDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional int32 number = 2; +inline bool EnumValueDescriptorProto::has_number() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void EnumValueDescriptorProto::set_has_number() { + _has_bits_[0] |= 0x00000002u; +} +inline void EnumValueDescriptorProto::clear_has_number() { + _has_bits_[0] &= ~0x00000002u; +} +inline void EnumValueDescriptorProto::clear_number() { + number_ = 0; + clear_has_number(); +} +inline ::google::protobuf::int32 EnumValueDescriptorProto::number() const { + return number_; +} +inline void EnumValueDescriptorProto::set_number(::google::protobuf::int32 value) { + set_has_number(); + number_ = value; +} + +// optional .google.protobuf.EnumValueOptions options = 3; +inline bool EnumValueDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void EnumValueDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000004u; +} +inline void EnumValueDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000004u; +} +inline void EnumValueDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::EnumValueOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::EnumValueOptions& EnumValueDescriptorProto::options() const { + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::EnumValueOptions; + return options_; +} +inline ::google::protobuf::EnumValueOptions* EnumValueDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::EnumValueOptions* temp = options_; + options_ = NULL; + return temp; +} + +// ------------------------------------------------------------------- + +// ServiceDescriptorProto + +// optional string name = 1; +inline bool ServiceDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void ServiceDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void ServiceDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void ServiceDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& ServiceDescriptorProto::name() const { + return *name_; +} +inline void ServiceDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void ServiceDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void ServiceDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* ServiceDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* ServiceDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .google.protobuf.MethodDescriptorProto method = 2; +inline int ServiceDescriptorProto::method_size() const { + return method_.size(); +} +inline void ServiceDescriptorProto::clear_method() { + method_.Clear(); +} +inline const ::google::protobuf::MethodDescriptorProto& ServiceDescriptorProto::method(int index) const { + return method_.Get(index); +} +inline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::mutable_method(int index) { + return method_.Mutable(index); +} +inline ::google::protobuf::MethodDescriptorProto* ServiceDescriptorProto::add_method() { + return method_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >& +ServiceDescriptorProto::method() const { + return method_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::MethodDescriptorProto >* +ServiceDescriptorProto::mutable_method() { + return &method_; +} + +// optional .google.protobuf.ServiceOptions options = 3; +inline bool ServiceDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void ServiceDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000004u; +} +inline void ServiceDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000004u; +} +inline void ServiceDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::ServiceOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::ServiceOptions& ServiceDescriptorProto::options() const { + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::ServiceOptions; + return options_; +} +inline ::google::protobuf::ServiceOptions* ServiceDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::ServiceOptions* temp = options_; + options_ = NULL; + return temp; +} + +// ------------------------------------------------------------------- + +// MethodDescriptorProto + +// optional string name = 1; +inline bool MethodDescriptorProto::has_name() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MethodDescriptorProto::set_has_name() { + _has_bits_[0] |= 0x00000001u; +} +inline void MethodDescriptorProto::clear_has_name() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MethodDescriptorProto::clear_name() { + if (name_ != &::google::protobuf::internal::kEmptyString) { + name_->clear(); + } + clear_has_name(); +} +inline const ::std::string& MethodDescriptorProto::name() const { + return *name_; +} +inline void MethodDescriptorProto::set_name(const ::std::string& value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void MethodDescriptorProto::set_name(const char* value) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(value); +} +inline void MethodDescriptorProto::set_name(const char* value, size_t size) { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + name_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MethodDescriptorProto::mutable_name() { + set_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + name_ = new ::std::string; + } + return name_; +} +inline ::std::string* MethodDescriptorProto::release_name() { + clear_has_name(); + if (name_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_; + name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string input_type = 2; +inline bool MethodDescriptorProto::has_input_type() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void MethodDescriptorProto::set_has_input_type() { + _has_bits_[0] |= 0x00000002u; +} +inline void MethodDescriptorProto::clear_has_input_type() { + _has_bits_[0] &= ~0x00000002u; +} +inline void MethodDescriptorProto::clear_input_type() { + if (input_type_ != &::google::protobuf::internal::kEmptyString) { + input_type_->clear(); + } + clear_has_input_type(); +} +inline const ::std::string& MethodDescriptorProto::input_type() const { + return *input_type_; +} +inline void MethodDescriptorProto::set_input_type(const ::std::string& value) { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::kEmptyString) { + input_type_ = new ::std::string; + } + input_type_->assign(value); +} +inline void MethodDescriptorProto::set_input_type(const char* value) { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::kEmptyString) { + input_type_ = new ::std::string; + } + input_type_->assign(value); +} +inline void MethodDescriptorProto::set_input_type(const char* value, size_t size) { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::kEmptyString) { + input_type_ = new ::std::string; + } + input_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MethodDescriptorProto::mutable_input_type() { + set_has_input_type(); + if (input_type_ == &::google::protobuf::internal::kEmptyString) { + input_type_ = new ::std::string; + } + return input_type_; +} +inline ::std::string* MethodDescriptorProto::release_input_type() { + clear_has_input_type(); + if (input_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = input_type_; + input_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string output_type = 3; +inline bool MethodDescriptorProto::has_output_type() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void MethodDescriptorProto::set_has_output_type() { + _has_bits_[0] |= 0x00000004u; +} +inline void MethodDescriptorProto::clear_has_output_type() { + _has_bits_[0] &= ~0x00000004u; +} +inline void MethodDescriptorProto::clear_output_type() { + if (output_type_ != &::google::protobuf::internal::kEmptyString) { + output_type_->clear(); + } + clear_has_output_type(); +} +inline const ::std::string& MethodDescriptorProto::output_type() const { + return *output_type_; +} +inline void MethodDescriptorProto::set_output_type(const ::std::string& value) { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::kEmptyString) { + output_type_ = new ::std::string; + } + output_type_->assign(value); +} +inline void MethodDescriptorProto::set_output_type(const char* value) { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::kEmptyString) { + output_type_ = new ::std::string; + } + output_type_->assign(value); +} +inline void MethodDescriptorProto::set_output_type(const char* value, size_t size) { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::kEmptyString) { + output_type_ = new ::std::string; + } + output_type_->assign(reinterpret_cast(value), size); +} +inline ::std::string* MethodDescriptorProto::mutable_output_type() { + set_has_output_type(); + if (output_type_ == &::google::protobuf::internal::kEmptyString) { + output_type_ = new ::std::string; + } + return output_type_; +} +inline ::std::string* MethodDescriptorProto::release_output_type() { + clear_has_output_type(); + if (output_type_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = output_type_; + output_type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional .google.protobuf.MethodOptions options = 4; +inline bool MethodDescriptorProto::has_options() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void MethodDescriptorProto::set_has_options() { + _has_bits_[0] |= 0x00000008u; +} +inline void MethodDescriptorProto::clear_has_options() { + _has_bits_[0] &= ~0x00000008u; +} +inline void MethodDescriptorProto::clear_options() { + if (options_ != NULL) options_->::google::protobuf::MethodOptions::Clear(); + clear_has_options(); +} +inline const ::google::protobuf::MethodOptions& MethodDescriptorProto::options() const { + return options_ != NULL ? *options_ : *default_instance_->options_; +} +inline ::google::protobuf::MethodOptions* MethodDescriptorProto::mutable_options() { + set_has_options(); + if (options_ == NULL) options_ = new ::google::protobuf::MethodOptions; + return options_; +} +inline ::google::protobuf::MethodOptions* MethodDescriptorProto::release_options() { + clear_has_options(); + ::google::protobuf::MethodOptions* temp = options_; + options_ = NULL; + return temp; +} + +// ------------------------------------------------------------------- + +// FileOptions + +// optional string java_package = 1; +inline bool FileOptions::has_java_package() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FileOptions::set_has_java_package() { + _has_bits_[0] |= 0x00000001u; +} +inline void FileOptions::clear_has_java_package() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FileOptions::clear_java_package() { + if (java_package_ != &::google::protobuf::internal::kEmptyString) { + java_package_->clear(); + } + clear_has_java_package(); +} +inline const ::std::string& FileOptions::java_package() const { + return *java_package_; +} +inline void FileOptions::set_java_package(const ::std::string& value) { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::kEmptyString) { + java_package_ = new ::std::string; + } + java_package_->assign(value); +} +inline void FileOptions::set_java_package(const char* value) { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::kEmptyString) { + java_package_ = new ::std::string; + } + java_package_->assign(value); +} +inline void FileOptions::set_java_package(const char* value, size_t size) { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::kEmptyString) { + java_package_ = new ::std::string; + } + java_package_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FileOptions::mutable_java_package() { + set_has_java_package(); + if (java_package_ == &::google::protobuf::internal::kEmptyString) { + java_package_ = new ::std::string; + } + return java_package_; +} +inline ::std::string* FileOptions::release_java_package() { + clear_has_java_package(); + if (java_package_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = java_package_; + java_package_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string java_outer_classname = 8; +inline bool FileOptions::has_java_outer_classname() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FileOptions::set_has_java_outer_classname() { + _has_bits_[0] |= 0x00000002u; +} +inline void FileOptions::clear_has_java_outer_classname() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FileOptions::clear_java_outer_classname() { + if (java_outer_classname_ != &::google::protobuf::internal::kEmptyString) { + java_outer_classname_->clear(); + } + clear_has_java_outer_classname(); +} +inline const ::std::string& FileOptions::java_outer_classname() const { + return *java_outer_classname_; +} +inline void FileOptions::set_java_outer_classname(const ::std::string& value) { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) { + java_outer_classname_ = new ::std::string; + } + java_outer_classname_->assign(value); +} +inline void FileOptions::set_java_outer_classname(const char* value) { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) { + java_outer_classname_ = new ::std::string; + } + java_outer_classname_->assign(value); +} +inline void FileOptions::set_java_outer_classname(const char* value, size_t size) { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) { + java_outer_classname_ = new ::std::string; + } + java_outer_classname_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FileOptions::mutable_java_outer_classname() { + set_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) { + java_outer_classname_ = new ::std::string; + } + return java_outer_classname_; +} +inline ::std::string* FileOptions::release_java_outer_classname() { + clear_has_java_outer_classname(); + if (java_outer_classname_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = java_outer_classname_; + java_outer_classname_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional bool java_multiple_files = 10 [default = false]; +inline bool FileOptions::has_java_multiple_files() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void FileOptions::set_has_java_multiple_files() { + _has_bits_[0] |= 0x00000004u; +} +inline void FileOptions::clear_has_java_multiple_files() { + _has_bits_[0] &= ~0x00000004u; +} +inline void FileOptions::clear_java_multiple_files() { + java_multiple_files_ = false; + clear_has_java_multiple_files(); +} +inline bool FileOptions::java_multiple_files() const { + return java_multiple_files_; +} +inline void FileOptions::set_java_multiple_files(bool value) { + set_has_java_multiple_files(); + java_multiple_files_ = value; +} + +// optional bool java_generate_equals_and_hash = 20 [default = false]; +inline bool FileOptions::has_java_generate_equals_and_hash() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void FileOptions::set_has_java_generate_equals_and_hash() { + _has_bits_[0] |= 0x00000008u; +} +inline void FileOptions::clear_has_java_generate_equals_and_hash() { + _has_bits_[0] &= ~0x00000008u; +} +inline void FileOptions::clear_java_generate_equals_and_hash() { + java_generate_equals_and_hash_ = false; + clear_has_java_generate_equals_and_hash(); +} +inline bool FileOptions::java_generate_equals_and_hash() const { + return java_generate_equals_and_hash_; +} +inline void FileOptions::set_java_generate_equals_and_hash(bool value) { + set_has_java_generate_equals_and_hash(); + java_generate_equals_and_hash_ = value; +} + +// optional .google.protobuf.FileOptions.OptimizeMode optimize_for = 9 [default = SPEED]; +inline bool FileOptions::has_optimize_for() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void FileOptions::set_has_optimize_for() { + _has_bits_[0] |= 0x00000010u; +} +inline void FileOptions::clear_has_optimize_for() { + _has_bits_[0] &= ~0x00000010u; +} +inline void FileOptions::clear_optimize_for() { + optimize_for_ = 1; + clear_has_optimize_for(); +} +inline ::google::protobuf::FileOptions_OptimizeMode FileOptions::optimize_for() const { + return static_cast< ::google::protobuf::FileOptions_OptimizeMode >(optimize_for_); +} +inline void FileOptions::set_optimize_for(::google::protobuf::FileOptions_OptimizeMode value) { + GOOGLE_DCHECK(::google::protobuf::FileOptions_OptimizeMode_IsValid(value)); + set_has_optimize_for(); + optimize_for_ = value; +} + +// optional bool cc_generic_services = 16 [default = false]; +inline bool FileOptions::has_cc_generic_services() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void FileOptions::set_has_cc_generic_services() { + _has_bits_[0] |= 0x00000020u; +} +inline void FileOptions::clear_has_cc_generic_services() { + _has_bits_[0] &= ~0x00000020u; +} +inline void FileOptions::clear_cc_generic_services() { + cc_generic_services_ = false; + clear_has_cc_generic_services(); +} +inline bool FileOptions::cc_generic_services() const { + return cc_generic_services_; +} +inline void FileOptions::set_cc_generic_services(bool value) { + set_has_cc_generic_services(); + cc_generic_services_ = value; +} + +// optional bool java_generic_services = 17 [default = false]; +inline bool FileOptions::has_java_generic_services() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void FileOptions::set_has_java_generic_services() { + _has_bits_[0] |= 0x00000040u; +} +inline void FileOptions::clear_has_java_generic_services() { + _has_bits_[0] &= ~0x00000040u; +} +inline void FileOptions::clear_java_generic_services() { + java_generic_services_ = false; + clear_has_java_generic_services(); +} +inline bool FileOptions::java_generic_services() const { + return java_generic_services_; +} +inline void FileOptions::set_java_generic_services(bool value) { + set_has_java_generic_services(); + java_generic_services_ = value; +} + +// optional bool py_generic_services = 18 [default = false]; +inline bool FileOptions::has_py_generic_services() const { + return (_has_bits_[0] & 0x00000080u) != 0; +} +inline void FileOptions::set_has_py_generic_services() { + _has_bits_[0] |= 0x00000080u; +} +inline void FileOptions::clear_has_py_generic_services() { + _has_bits_[0] &= ~0x00000080u; +} +inline void FileOptions::clear_py_generic_services() { + py_generic_services_ = false; + clear_has_py_generic_services(); +} +inline bool FileOptions::py_generic_services() const { + return py_generic_services_; +} +inline void FileOptions::set_py_generic_services(bool value) { + set_has_py_generic_services(); + py_generic_services_ = value; +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int FileOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void FileOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& FileOptions::uninterpreted_option(int index) const { + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* FileOptions::mutable_uninterpreted_option(int index) { + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* FileOptions::add_uninterpreted_option() { + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +FileOptions::uninterpreted_option() const { + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +FileOptions::mutable_uninterpreted_option() { + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// MessageOptions + +// optional bool message_set_wire_format = 1 [default = false]; +inline bool MessageOptions::has_message_set_wire_format() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void MessageOptions::set_has_message_set_wire_format() { + _has_bits_[0] |= 0x00000001u; +} +inline void MessageOptions::clear_has_message_set_wire_format() { + _has_bits_[0] &= ~0x00000001u; +} +inline void MessageOptions::clear_message_set_wire_format() { + message_set_wire_format_ = false; + clear_has_message_set_wire_format(); +} +inline bool MessageOptions::message_set_wire_format() const { + return message_set_wire_format_; +} +inline void MessageOptions::set_message_set_wire_format(bool value) { + set_has_message_set_wire_format(); + message_set_wire_format_ = value; +} + +// optional bool no_standard_descriptor_accessor = 2 [default = false]; +inline bool MessageOptions::has_no_standard_descriptor_accessor() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void MessageOptions::set_has_no_standard_descriptor_accessor() { + _has_bits_[0] |= 0x00000002u; +} +inline void MessageOptions::clear_has_no_standard_descriptor_accessor() { + _has_bits_[0] &= ~0x00000002u; +} +inline void MessageOptions::clear_no_standard_descriptor_accessor() { + no_standard_descriptor_accessor_ = false; + clear_has_no_standard_descriptor_accessor(); +} +inline bool MessageOptions::no_standard_descriptor_accessor() const { + return no_standard_descriptor_accessor_; +} +inline void MessageOptions::set_no_standard_descriptor_accessor(bool value) { + set_has_no_standard_descriptor_accessor(); + no_standard_descriptor_accessor_ = value; +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int MessageOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void MessageOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& MessageOptions::uninterpreted_option(int index) const { + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* MessageOptions::mutable_uninterpreted_option(int index) { + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* MessageOptions::add_uninterpreted_option() { + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +MessageOptions::uninterpreted_option() const { + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +MessageOptions::mutable_uninterpreted_option() { + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// FieldOptions + +// optional .google.protobuf.FieldOptions.CType ctype = 1 [default = STRING]; +inline bool FieldOptions::has_ctype() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void FieldOptions::set_has_ctype() { + _has_bits_[0] |= 0x00000001u; +} +inline void FieldOptions::clear_has_ctype() { + _has_bits_[0] &= ~0x00000001u; +} +inline void FieldOptions::clear_ctype() { + ctype_ = 0; + clear_has_ctype(); +} +inline ::google::protobuf::FieldOptions_CType FieldOptions::ctype() const { + return static_cast< ::google::protobuf::FieldOptions_CType >(ctype_); +} +inline void FieldOptions::set_ctype(::google::protobuf::FieldOptions_CType value) { + GOOGLE_DCHECK(::google::protobuf::FieldOptions_CType_IsValid(value)); + set_has_ctype(); + ctype_ = value; +} + +// optional bool packed = 2; +inline bool FieldOptions::has_packed() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void FieldOptions::set_has_packed() { + _has_bits_[0] |= 0x00000002u; +} +inline void FieldOptions::clear_has_packed() { + _has_bits_[0] &= ~0x00000002u; +} +inline void FieldOptions::clear_packed() { + packed_ = false; + clear_has_packed(); +} +inline bool FieldOptions::packed() const { + return packed_; +} +inline void FieldOptions::set_packed(bool value) { + set_has_packed(); + packed_ = value; +} + +// optional bool deprecated = 3 [default = false]; +inline bool FieldOptions::has_deprecated() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void FieldOptions::set_has_deprecated() { + _has_bits_[0] |= 0x00000004u; +} +inline void FieldOptions::clear_has_deprecated() { + _has_bits_[0] &= ~0x00000004u; +} +inline void FieldOptions::clear_deprecated() { + deprecated_ = false; + clear_has_deprecated(); +} +inline bool FieldOptions::deprecated() const { + return deprecated_; +} +inline void FieldOptions::set_deprecated(bool value) { + set_has_deprecated(); + deprecated_ = value; +} + +// optional string experimental_map_key = 9; +inline bool FieldOptions::has_experimental_map_key() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void FieldOptions::set_has_experimental_map_key() { + _has_bits_[0] |= 0x00000008u; +} +inline void FieldOptions::clear_has_experimental_map_key() { + _has_bits_[0] &= ~0x00000008u; +} +inline void FieldOptions::clear_experimental_map_key() { + if (experimental_map_key_ != &::google::protobuf::internal::kEmptyString) { + experimental_map_key_->clear(); + } + clear_has_experimental_map_key(); +} +inline const ::std::string& FieldOptions::experimental_map_key() const { + return *experimental_map_key_; +} +inline void FieldOptions::set_experimental_map_key(const ::std::string& value) { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) { + experimental_map_key_ = new ::std::string; + } + experimental_map_key_->assign(value); +} +inline void FieldOptions::set_experimental_map_key(const char* value) { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) { + experimental_map_key_ = new ::std::string; + } + experimental_map_key_->assign(value); +} +inline void FieldOptions::set_experimental_map_key(const char* value, size_t size) { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) { + experimental_map_key_ = new ::std::string; + } + experimental_map_key_->assign(reinterpret_cast(value), size); +} +inline ::std::string* FieldOptions::mutable_experimental_map_key() { + set_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) { + experimental_map_key_ = new ::std::string; + } + return experimental_map_key_; +} +inline ::std::string* FieldOptions::release_experimental_map_key() { + clear_has_experimental_map_key(); + if (experimental_map_key_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = experimental_map_key_; + experimental_map_key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int FieldOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void FieldOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& FieldOptions::uninterpreted_option(int index) const { + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* FieldOptions::mutable_uninterpreted_option(int index) { + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* FieldOptions::add_uninterpreted_option() { + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +FieldOptions::uninterpreted_option() const { + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +FieldOptions::mutable_uninterpreted_option() { + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// EnumOptions + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int EnumOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void EnumOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& EnumOptions::uninterpreted_option(int index) const { + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* EnumOptions::mutable_uninterpreted_option(int index) { + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* EnumOptions::add_uninterpreted_option() { + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +EnumOptions::uninterpreted_option() const { + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +EnumOptions::mutable_uninterpreted_option() { + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// EnumValueOptions + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int EnumValueOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void EnumValueOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& EnumValueOptions::uninterpreted_option(int index) const { + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* EnumValueOptions::mutable_uninterpreted_option(int index) { + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* EnumValueOptions::add_uninterpreted_option() { + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +EnumValueOptions::uninterpreted_option() const { + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +EnumValueOptions::mutable_uninterpreted_option() { + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// ServiceOptions + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int ServiceOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void ServiceOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& ServiceOptions::uninterpreted_option(int index) const { + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* ServiceOptions::mutable_uninterpreted_option(int index) { + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* ServiceOptions::add_uninterpreted_option() { + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +ServiceOptions::uninterpreted_option() const { + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +ServiceOptions::mutable_uninterpreted_option() { + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// MethodOptions + +// repeated .google.protobuf.UninterpretedOption uninterpreted_option = 999; +inline int MethodOptions::uninterpreted_option_size() const { + return uninterpreted_option_.size(); +} +inline void MethodOptions::clear_uninterpreted_option() { + uninterpreted_option_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption& MethodOptions::uninterpreted_option(int index) const { + return uninterpreted_option_.Get(index); +} +inline ::google::protobuf::UninterpretedOption* MethodOptions::mutable_uninterpreted_option(int index) { + return uninterpreted_option_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption* MethodOptions::add_uninterpreted_option() { + return uninterpreted_option_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >& +MethodOptions::uninterpreted_option() const { + return uninterpreted_option_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption >* +MethodOptions::mutable_uninterpreted_option() { + return &uninterpreted_option_; +} + +// ------------------------------------------------------------------- + +// UninterpretedOption_NamePart + +// required string name_part = 1; +inline bool UninterpretedOption_NamePart::has_name_part() const { + return (_has_bits_[0] & 0x00000001u) != 0; +} +inline void UninterpretedOption_NamePart::set_has_name_part() { + _has_bits_[0] |= 0x00000001u; +} +inline void UninterpretedOption_NamePart::clear_has_name_part() { + _has_bits_[0] &= ~0x00000001u; +} +inline void UninterpretedOption_NamePart::clear_name_part() { + if (name_part_ != &::google::protobuf::internal::kEmptyString) { + name_part_->clear(); + } + clear_has_name_part(); +} +inline const ::std::string& UninterpretedOption_NamePart::name_part() const { + return *name_part_; +} +inline void UninterpretedOption_NamePart::set_name_part(const ::std::string& value) { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::kEmptyString) { + name_part_ = new ::std::string; + } + name_part_->assign(value); +} +inline void UninterpretedOption_NamePart::set_name_part(const char* value) { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::kEmptyString) { + name_part_ = new ::std::string; + } + name_part_->assign(value); +} +inline void UninterpretedOption_NamePart::set_name_part(const char* value, size_t size) { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::kEmptyString) { + name_part_ = new ::std::string; + } + name_part_->assign(reinterpret_cast(value), size); +} +inline ::std::string* UninterpretedOption_NamePart::mutable_name_part() { + set_has_name_part(); + if (name_part_ == &::google::protobuf::internal::kEmptyString) { + name_part_ = new ::std::string; + } + return name_part_; +} +inline ::std::string* UninterpretedOption_NamePart::release_name_part() { + clear_has_name_part(); + if (name_part_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = name_part_; + name_part_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// required bool is_extension = 2; +inline bool UninterpretedOption_NamePart::has_is_extension() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void UninterpretedOption_NamePart::set_has_is_extension() { + _has_bits_[0] |= 0x00000002u; +} +inline void UninterpretedOption_NamePart::clear_has_is_extension() { + _has_bits_[0] &= ~0x00000002u; +} +inline void UninterpretedOption_NamePart::clear_is_extension() { + is_extension_ = false; + clear_has_is_extension(); +} +inline bool UninterpretedOption_NamePart::is_extension() const { + return is_extension_; +} +inline void UninterpretedOption_NamePart::set_is_extension(bool value) { + set_has_is_extension(); + is_extension_ = value; +} + +// ------------------------------------------------------------------- + +// UninterpretedOption + +// repeated .google.protobuf.UninterpretedOption.NamePart name = 2; +inline int UninterpretedOption::name_size() const { + return name_.size(); +} +inline void UninterpretedOption::clear_name() { + name_.Clear(); +} +inline const ::google::protobuf::UninterpretedOption_NamePart& UninterpretedOption::name(int index) const { + return name_.Get(index); +} +inline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::mutable_name(int index) { + return name_.Mutable(index); +} +inline ::google::protobuf::UninterpretedOption_NamePart* UninterpretedOption::add_name() { + return name_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >& +UninterpretedOption::name() const { + return name_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::UninterpretedOption_NamePart >* +UninterpretedOption::mutable_name() { + return &name_; +} + +// optional string identifier_value = 3; +inline bool UninterpretedOption::has_identifier_value() const { + return (_has_bits_[0] & 0x00000002u) != 0; +} +inline void UninterpretedOption::set_has_identifier_value() { + _has_bits_[0] |= 0x00000002u; +} +inline void UninterpretedOption::clear_has_identifier_value() { + _has_bits_[0] &= ~0x00000002u; +} +inline void UninterpretedOption::clear_identifier_value() { + if (identifier_value_ != &::google::protobuf::internal::kEmptyString) { + identifier_value_->clear(); + } + clear_has_identifier_value(); +} +inline const ::std::string& UninterpretedOption::identifier_value() const { + return *identifier_value_; +} +inline void UninterpretedOption::set_identifier_value(const ::std::string& value) { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::kEmptyString) { + identifier_value_ = new ::std::string; + } + identifier_value_->assign(value); +} +inline void UninterpretedOption::set_identifier_value(const char* value) { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::kEmptyString) { + identifier_value_ = new ::std::string; + } + identifier_value_->assign(value); +} +inline void UninterpretedOption::set_identifier_value(const char* value, size_t size) { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::kEmptyString) { + identifier_value_ = new ::std::string; + } + identifier_value_->assign(reinterpret_cast(value), size); +} +inline ::std::string* UninterpretedOption::mutable_identifier_value() { + set_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::kEmptyString) { + identifier_value_ = new ::std::string; + } + return identifier_value_; +} +inline ::std::string* UninterpretedOption::release_identifier_value() { + clear_has_identifier_value(); + if (identifier_value_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = identifier_value_; + identifier_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional uint64 positive_int_value = 4; +inline bool UninterpretedOption::has_positive_int_value() const { + return (_has_bits_[0] & 0x00000004u) != 0; +} +inline void UninterpretedOption::set_has_positive_int_value() { + _has_bits_[0] |= 0x00000004u; +} +inline void UninterpretedOption::clear_has_positive_int_value() { + _has_bits_[0] &= ~0x00000004u; +} +inline void UninterpretedOption::clear_positive_int_value() { + positive_int_value_ = GOOGLE_ULONGLONG(0); + clear_has_positive_int_value(); +} +inline ::google::protobuf::uint64 UninterpretedOption::positive_int_value() const { + return positive_int_value_; +} +inline void UninterpretedOption::set_positive_int_value(::google::protobuf::uint64 value) { + set_has_positive_int_value(); + positive_int_value_ = value; +} + +// optional int64 negative_int_value = 5; +inline bool UninterpretedOption::has_negative_int_value() const { + return (_has_bits_[0] & 0x00000008u) != 0; +} +inline void UninterpretedOption::set_has_negative_int_value() { + _has_bits_[0] |= 0x00000008u; +} +inline void UninterpretedOption::clear_has_negative_int_value() { + _has_bits_[0] &= ~0x00000008u; +} +inline void UninterpretedOption::clear_negative_int_value() { + negative_int_value_ = GOOGLE_LONGLONG(0); + clear_has_negative_int_value(); +} +inline ::google::protobuf::int64 UninterpretedOption::negative_int_value() const { + return negative_int_value_; +} +inline void UninterpretedOption::set_negative_int_value(::google::protobuf::int64 value) { + set_has_negative_int_value(); + negative_int_value_ = value; +} + +// optional double double_value = 6; +inline bool UninterpretedOption::has_double_value() const { + return (_has_bits_[0] & 0x00000010u) != 0; +} +inline void UninterpretedOption::set_has_double_value() { + _has_bits_[0] |= 0x00000010u; +} +inline void UninterpretedOption::clear_has_double_value() { + _has_bits_[0] &= ~0x00000010u; +} +inline void UninterpretedOption::clear_double_value() { + double_value_ = 0; + clear_has_double_value(); +} +inline double UninterpretedOption::double_value() const { + return double_value_; +} +inline void UninterpretedOption::set_double_value(double value) { + set_has_double_value(); + double_value_ = value; +} + +// optional bytes string_value = 7; +inline bool UninterpretedOption::has_string_value() const { + return (_has_bits_[0] & 0x00000020u) != 0; +} +inline void UninterpretedOption::set_has_string_value() { + _has_bits_[0] |= 0x00000020u; +} +inline void UninterpretedOption::clear_has_string_value() { + _has_bits_[0] &= ~0x00000020u; +} +inline void UninterpretedOption::clear_string_value() { + if (string_value_ != &::google::protobuf::internal::kEmptyString) { + string_value_->clear(); + } + clear_has_string_value(); +} +inline const ::std::string& UninterpretedOption::string_value() const { + return *string_value_; +} +inline void UninterpretedOption::set_string_value(const ::std::string& value) { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::kEmptyString) { + string_value_ = new ::std::string; + } + string_value_->assign(value); +} +inline void UninterpretedOption::set_string_value(const char* value) { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::kEmptyString) { + string_value_ = new ::std::string; + } + string_value_->assign(value); +} +inline void UninterpretedOption::set_string_value(const void* value, size_t size) { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::kEmptyString) { + string_value_ = new ::std::string; + } + string_value_->assign(reinterpret_cast(value), size); +} +inline ::std::string* UninterpretedOption::mutable_string_value() { + set_has_string_value(); + if (string_value_ == &::google::protobuf::internal::kEmptyString) { + string_value_ = new ::std::string; + } + return string_value_; +} +inline ::std::string* UninterpretedOption::release_string_value() { + clear_has_string_value(); + if (string_value_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = string_value_; + string_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// optional string aggregate_value = 8; +inline bool UninterpretedOption::has_aggregate_value() const { + return (_has_bits_[0] & 0x00000040u) != 0; +} +inline void UninterpretedOption::set_has_aggregate_value() { + _has_bits_[0] |= 0x00000040u; +} +inline void UninterpretedOption::clear_has_aggregate_value() { + _has_bits_[0] &= ~0x00000040u; +} +inline void UninterpretedOption::clear_aggregate_value() { + if (aggregate_value_ != &::google::protobuf::internal::kEmptyString) { + aggregate_value_->clear(); + } + clear_has_aggregate_value(); +} +inline const ::std::string& UninterpretedOption::aggregate_value() const { + return *aggregate_value_; +} +inline void UninterpretedOption::set_aggregate_value(const ::std::string& value) { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) { + aggregate_value_ = new ::std::string; + } + aggregate_value_->assign(value); +} +inline void UninterpretedOption::set_aggregate_value(const char* value) { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) { + aggregate_value_ = new ::std::string; + } + aggregate_value_->assign(value); +} +inline void UninterpretedOption::set_aggregate_value(const char* value, size_t size) { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) { + aggregate_value_ = new ::std::string; + } + aggregate_value_->assign(reinterpret_cast(value), size); +} +inline ::std::string* UninterpretedOption::mutable_aggregate_value() { + set_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) { + aggregate_value_ = new ::std::string; + } + return aggregate_value_; +} +inline ::std::string* UninterpretedOption::release_aggregate_value() { + clear_has_aggregate_value(); + if (aggregate_value_ == &::google::protobuf::internal::kEmptyString) { + return NULL; + } else { + ::std::string* temp = aggregate_value_; + aggregate_value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); + return temp; + } +} + +// ------------------------------------------------------------------- + +// SourceCodeInfo_Location + +// repeated int32 path = 1 [packed = true]; +inline int SourceCodeInfo_Location::path_size() const { + return path_.size(); +} +inline void SourceCodeInfo_Location::clear_path() { + path_.Clear(); +} +inline ::google::protobuf::int32 SourceCodeInfo_Location::path(int index) const { + return path_.Get(index); +} +inline void SourceCodeInfo_Location::set_path(int index, ::google::protobuf::int32 value) { + path_.Set(index, value); +} +inline void SourceCodeInfo_Location::add_path(::google::protobuf::int32 value) { + path_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +SourceCodeInfo_Location::path() const { + return path_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +SourceCodeInfo_Location::mutable_path() { + return &path_; +} + +// repeated int32 span = 2 [packed = true]; +inline int SourceCodeInfo_Location::span_size() const { + return span_.size(); +} +inline void SourceCodeInfo_Location::clear_span() { + span_.Clear(); +} +inline ::google::protobuf::int32 SourceCodeInfo_Location::span(int index) const { + return span_.Get(index); +} +inline void SourceCodeInfo_Location::set_span(int index, ::google::protobuf::int32 value) { + span_.Set(index, value); +} +inline void SourceCodeInfo_Location::add_span(::google::protobuf::int32 value) { + span_.Add(value); +} +inline const ::google::protobuf::RepeatedField< ::google::protobuf::int32 >& +SourceCodeInfo_Location::span() const { + return span_; +} +inline ::google::protobuf::RepeatedField< ::google::protobuf::int32 >* +SourceCodeInfo_Location::mutable_span() { + return &span_; +} + +// ------------------------------------------------------------------- + +// SourceCodeInfo + +// repeated .google.protobuf.SourceCodeInfo.Location location = 1; +inline int SourceCodeInfo::location_size() const { + return location_.size(); +} +inline void SourceCodeInfo::clear_location() { + location_.Clear(); +} +inline const ::google::protobuf::SourceCodeInfo_Location& SourceCodeInfo::location(int index) const { + return location_.Get(index); +} +inline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::mutable_location(int index) { + return location_.Mutable(index); +} +inline ::google::protobuf::SourceCodeInfo_Location* SourceCodeInfo::add_location() { + return location_.Add(); +} +inline const ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >& +SourceCodeInfo::location() const { + return location_; +} +inline ::google::protobuf::RepeatedPtrField< ::google::protobuf::SourceCodeInfo_Location >* +SourceCodeInfo::mutable_location() { + return &location_; +} + + +// @@protoc_insertion_point(namespace_scope) + +} // namespace protobuf +} // namespace google + +#ifndef SWIG +namespace google { +namespace protobuf { + +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Type>() { + return ::google::protobuf::FieldDescriptorProto_Type_descriptor(); +} +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldDescriptorProto_Label>() { + return ::google::protobuf::FieldDescriptorProto_Label_descriptor(); +} +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FileOptions_OptimizeMode>() { + return ::google::protobuf::FileOptions_OptimizeMode_descriptor(); +} +template <> +inline const EnumDescriptor* GetEnumDescriptor< ::google::protobuf::FieldOptions_CType>() { + return ::google::protobuf::FieldOptions_CType_descriptor(); +} + +} // namespace google +} // namespace protobuf +#endif // SWIG + +// @@protoc_insertion_point(global_scope) + +#endif // PROTOBUF_google_2fprotobuf_2fdescriptor_2eproto__INCLUDED diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto new file mode 100644 index 000000000..4eeb43b59 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto @@ -0,0 +1,538 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// The messages in this file describe the definitions found in .proto files. +// A valid .proto file can be translated directly to a FileDescriptorProto +// without any other information (e.g. without reading its imports). + + + +package google.protobuf; +option java_package = "com.google.protobuf"; +option java_outer_classname = "DescriptorProtos"; + +// descriptor.proto must be optimized for speed because reflection-based +// algorithms don't work during bootstrapping. +option optimize_for = SPEED; + +// The protocol compiler can output a FileDescriptorSet containing the .proto +// files it parses. +message FileDescriptorSet { + repeated FileDescriptorProto file = 1; +} + +// Describes a complete .proto file. +message FileDescriptorProto { + optional string name = 1; // file name, relative to root of source tree + optional string package = 2; // e.g. "foo", "foo.bar", etc. + + // Names of files imported by this file. + repeated string dependency = 3; + + // All top-level definitions in this file. + repeated DescriptorProto message_type = 4; + repeated EnumDescriptorProto enum_type = 5; + repeated ServiceDescriptorProto service = 6; + repeated FieldDescriptorProto extension = 7; + + optional FileOptions options = 8; + + // This field contains optional information about the original source code. + // You may safely remove this entire field whithout harming runtime + // functionality of the descriptors -- the information is needed only by + // development tools. + optional SourceCodeInfo source_code_info = 9; +} + +// Describes a message type. +message DescriptorProto { + optional string name = 1; + + repeated FieldDescriptorProto field = 2; + repeated FieldDescriptorProto extension = 6; + + repeated DescriptorProto nested_type = 3; + repeated EnumDescriptorProto enum_type = 4; + + message ExtensionRange { + optional int32 start = 1; + optional int32 end = 2; + } + repeated ExtensionRange extension_range = 5; + + optional MessageOptions options = 7; +} + +// Describes a field within a message. +message FieldDescriptorProto { + enum Type { + // 0 is reserved for errors. + // Order is weird for historical reasons. + TYPE_DOUBLE = 1; + TYPE_FLOAT = 2; + TYPE_INT64 = 3; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. + TYPE_UINT64 = 4; + TYPE_INT32 = 5; // Not ZigZag encoded. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. + TYPE_FIXED64 = 6; + TYPE_FIXED32 = 7; + TYPE_BOOL = 8; + TYPE_STRING = 9; + TYPE_GROUP = 10; // Tag-delimited aggregate. + TYPE_MESSAGE = 11; // Length-delimited aggregate. + + // New in version 2. + TYPE_BYTES = 12; + TYPE_UINT32 = 13; + TYPE_ENUM = 14; + TYPE_SFIXED32 = 15; + TYPE_SFIXED64 = 16; + TYPE_SINT32 = 17; // Uses ZigZag encoding. + TYPE_SINT64 = 18; // Uses ZigZag encoding. + }; + + enum Label { + // 0 is reserved for errors + LABEL_OPTIONAL = 1; + LABEL_REQUIRED = 2; + LABEL_REPEATED = 3; + // TODO(sanjay): Should we add LABEL_MAP? + }; + + optional string name = 1; + optional int32 number = 3; + optional Label label = 4; + + // If type_name is set, this need not be set. If both this and type_name + // are set, this must be either TYPE_ENUM or TYPE_MESSAGE. + optional Type type = 5; + + // For message and enum types, this is the name of the type. If the name + // starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + // rules are used to find the type (i.e. first the nested types within this + // message are searched, then within the parent, on up to the root + // namespace). + optional string type_name = 6; + + // For extensions, this is the name of the type being extended. It is + // resolved in the same manner as type_name. + optional string extendee = 2; + + // For numeric types, contains the original text representation of the value. + // For booleans, "true" or "false". + // For strings, contains the default text contents (not escaped in any way). + // For bytes, contains the C escaped value. All bytes >= 128 are escaped. + // TODO(kenton): Base-64 encode? + optional string default_value = 7; + + optional FieldOptions options = 8; +} + +// Describes an enum type. +message EnumDescriptorProto { + optional string name = 1; + + repeated EnumValueDescriptorProto value = 2; + + optional EnumOptions options = 3; +} + +// Describes a value within an enum. +message EnumValueDescriptorProto { + optional string name = 1; + optional int32 number = 2; + + optional EnumValueOptions options = 3; +} + +// Describes a service. +message ServiceDescriptorProto { + optional string name = 1; + repeated MethodDescriptorProto method = 2; + + optional ServiceOptions options = 3; +} + +// Describes a method of a service. +message MethodDescriptorProto { + optional string name = 1; + + // Input and output type names. These are resolved in the same way as + // FieldDescriptorProto.type_name, but must refer to a message type. + optional string input_type = 2; + optional string output_type = 3; + + optional MethodOptions options = 4; +} + +// =================================================================== +// Options + +// Each of the definitions above may have "options" attached. These are +// just annotations which may cause code to be generated slightly differently +// or may contain hints for code that manipulates protocol messages. +// +// Clients may define custom options as extensions of the *Options messages. +// These extensions may not yet be known at parsing time, so the parser cannot +// store the values in them. Instead it stores them in a field in the *Options +// message called uninterpreted_option. This field must have the same name +// across all *Options messages. We then use this field to populate the +// extensions when we build a descriptor, at which point all protos have been +// parsed and so all extensions are known. +// +// Extension numbers for custom options may be chosen as follows: +// * For options which will only be used within a single application or +// organization, or for experimental options, use field numbers 50000 +// through 99999. It is up to you to ensure that you do not use the +// same number for multiple options. +// * For options which will be published and used publicly by multiple +// independent entities, e-mail protobuf-global-extension-registry@google.com +// to reserve extension numbers. Simply provide your project name (e.g. +// Object-C plugin) and your porject website (if available) -- there's no need +// to explain how you intend to use them. Usually you only need one extension +// number. You can declare multiple options with only one extension number by +// putting them in a sub-message. See the Custom Options section of the docs +// for examples: +// http://code.google.com/apis/protocolbuffers/docs/proto.html#options +// If this turns out to be popular, a web service will be set up +// to automatically assign option numbers. + + +message FileOptions { + + // Sets the Java package where classes generated from this .proto will be + // placed. By default, the proto package is used, but this is often + // inappropriate because proto packages do not normally start with backwards + // domain names. + optional string java_package = 1; + + + // If set, all the classes from the .proto file are wrapped in a single + // outer class with the given name. This applies to both Proto1 + // (equivalent to the old "--one_java_file" option) and Proto2 (where + // a .proto always translates to a single class, but you may want to + // explicitly choose the class name). + optional string java_outer_classname = 8; + + // If set true, then the Java code generator will generate a separate .java + // file for each top-level message, enum, and service defined in the .proto + // file. Thus, these types will *not* be nested inside the outer class + // named by java_outer_classname. However, the outer class will still be + // generated to contain the file's getDescriptor() method as well as any + // top-level extensions defined in the file. + optional bool java_multiple_files = 10 [default=false]; + + // If set true, then the Java code generator will generate equals() and + // hashCode() methods for all messages defined in the .proto file. This is + // purely a speed optimization, as the AbstractMessage base class includes + // reflection-based implementations of these methods. + optional bool java_generate_equals_and_hash = 20 [default=false]; + + // Generated classes can be optimized for speed or code size. + enum OptimizeMode { + SPEED = 1; // Generate complete code for parsing, serialization, + // etc. + CODE_SIZE = 2; // Use ReflectionOps to implement these methods. + LITE_RUNTIME = 3; // Generate code using MessageLite and the lite runtime. + } + optional OptimizeMode optimize_for = 9 [default=SPEED]; + + + + + // Should generic services be generated in each language? "Generic" services + // are not specific to any particular RPC system. They are generated by the + // main code generators in each language (without additional plugins). + // Generic services were the only kind of service generation supported by + // early versions of proto2. + // + // Generic services are now considered deprecated in favor of using plugins + // that generate code specific to your particular RPC system. Therefore, + // these default to false. Old code which depends on generic services should + // explicitly set them to true. + optional bool cc_generic_services = 16 [default=false]; + optional bool java_generic_services = 17 [default=false]; + optional bool py_generic_services = 18 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MessageOptions { + // Set true to use the old proto1 MessageSet wire format for extensions. + // This is provided for backwards-compatibility with the MessageSet wire + // format. You should not use this for any other reason: It's less + // efficient, has fewer features, and is more complicated. + // + // The message must be defined exactly as follows: + // message Foo { + // option message_set_wire_format = true; + // extensions 4 to max; + // } + // Note that the message cannot have any defined fields; MessageSets only + // have extensions. + // + // All extensions of your type must be singular messages; e.g. they cannot + // be int32s, enums, or repeated messages. + // + // Because this is an option, the above two restrictions are not enforced by + // the protocol compiler. + optional bool message_set_wire_format = 1 [default=false]; + + // Disables the generation of the standard "descriptor()" accessor, which can + // conflict with a field of the same name. This is meant to make migration + // from proto1 easier; new code should avoid fields named "descriptor". + optional bool no_standard_descriptor_accessor = 2 [default=false]; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message FieldOptions { + // The ctype option instructs the C++ code generator to use a different + // representation of the field than it normally would. See the specific + // options below. This option is not yet implemented in the open source + // release -- sorry, we'll try to include it in a future version! + optional CType ctype = 1 [default = STRING]; + enum CType { + // Default mode. + STRING = 0; + + CORD = 1; + + STRING_PIECE = 2; + } + // The packed option can be enabled for repeated primitive fields to enable + // a more efficient representation on the wire. Rather than repeatedly + // writing the tag and type for each element, the entire array is encoded as + // a single length-delimited blob. + optional bool packed = 2; + + + // Is this field deprecated? + // Depending on the target platform, this can emit Deprecated annotations + // for accessors, or it will be completely ignored; in the very least, this + // is a formalization for deprecating fields. + optional bool deprecated = 3 [default=false]; + + // EXPERIMENTAL. DO NOT USE. + // For "map" fields, the name of the field in the enclosed type that + // is the key for this map. For example, suppose we have: + // message Item { + // required string name = 1; + // required string value = 2; + // } + // message Config { + // repeated Item items = 1 [experimental_map_key="name"]; + // } + // In this situation, the map key for Item will be set to "name". + // TODO: Fully-implement this, then remove the "experimental_" prefix. + optional string experimental_map_key = 9; + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumOptions { + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message EnumValueOptions { + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message ServiceOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +message MethodOptions { + + // Note: Field numbers 1 through 32 are reserved for Google's internal RPC + // framework. We apologize for hoarding these numbers to ourselves, but + // we were already using them long before we decided to release Protocol + // Buffers. + + // The parser stores options it doesn't recognize here. See above. + repeated UninterpretedOption uninterpreted_option = 999; + + // Clients can define custom options in extensions of this message. See above. + extensions 1000 to max; +} + +// A message representing a option the parser does not recognize. This only +// appears in options protos created by the compiler::Parser class. +// DescriptorPool resolves these when building Descriptor objects. Therefore, +// options protos in descriptor objects (e.g. returned by Descriptor::options(), +// or produced by Descriptor::CopyTo()) will never have UninterpretedOptions +// in them. +message UninterpretedOption { + // The name of the uninterpreted option. Each string represents a segment in + // a dot-separated name. is_extension is true iff a segment represents an + // extension (denoted with parentheses in options specs in .proto files). + // E.g.,{ ["foo", false], ["bar.baz", true], ["qux", false] } represents + // "foo.(bar.baz).qux". + message NamePart { + required string name_part = 1; + required bool is_extension = 2; + } + repeated NamePart name = 2; + + // The value of the uninterpreted option, in whatever type the tokenizer + // identified it as during parsing. Exactly one of these should be set. + optional string identifier_value = 3; + optional uint64 positive_int_value = 4; + optional int64 negative_int_value = 5; + optional double double_value = 6; + optional bytes string_value = 7; + optional string aggregate_value = 8; +} + +// =================================================================== +// Optional source code info + +// Encapsulates information about the original source file from which a +// FileDescriptorProto was generated. +message SourceCodeInfo { + // A Location identifies a piece of source code in a .proto file which + // corresponds to a particular definition. This information is intended + // to be useful to IDEs, code indexers, documentation generators, and similar + // tools. + // + // For example, say we have a file like: + // message Foo { + // optional string foo = 1; + // } + // Let's look at just the field definition: + // optional string foo = 1; + // ^ ^^ ^^ ^ ^^^ + // a bc de f ghi + // We have the following locations: + // span path represents + // [a,i) [ 4, 0, 2, 0 ] The whole field definition. + // [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + // [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + // [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + // [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + // + // Notes: + // - A location may refer to a repeated field itself (i.e. not to any + // particular index within it). This is used whenever a set of elements are + // logically enclosed in a single code segment. For example, an entire + // extend block (possibly containing multiple extension definitions) will + // have an outer location whose path refers to the "extensions" repeated + // field without an index. + // - Multiple locations may have the same path. This happens when a single + // logical declaration is spread out across multiple places. The most + // obvious example is the "extend" block again -- there may be multiple + // extend blocks in the same scope, each of which will have the same path. + // - A location's span is not always a subset of its parent's span. For + // example, the "extendee" of an extension declaration appears at the + // beginning of the "extend" block and is shared by all extensions within + // the block. + // - Just because a location's span is a subset of some other location's span + // does not mean that it is a descendent. For example, a "group" defines + // both a type and a field in a single declaration. Thus, the locations + // corresponding to the type and field and their components will overlap. + // - Code which tries to interpret locations should probably be designed to + // ignore those that it doesn't understand, as more types of locations could + // be recorded in the future. + repeated Location location = 1; + message Location { + // Identifies which part of the FileDescriptorProto was defined at this + // location. + // + // Each element is a field number or an index. They form a path from + // the root FileDescriptorProto to the place where the definition. For + // example, this path: + // [ 4, 3, 2, 7, 1 ] + // refers to: + // file.message_type(3) // 4, 3 + // .field(7) // 2, 7 + // .name() // 1 + // This is because FileDescriptorProto.message_type has field number 4: + // repeated DescriptorProto message_type = 4; + // and DescriptorProto.field has field number 2: + // repeated FieldDescriptorProto field = 2; + // and FieldDescriptorProto.name has field number 1: + // optional string name = 1; + // + // Thus, the above path gives the location of a field name. If we removed + // the last element: + // [ 4, 3, 2, 7 ] + // this path refers to the whole field declaration (from the beginning + // of the label to the terminating semicolon). + repeated int32 path = 1 [packed=true]; + + // Always has exactly three or four elements: start line, start column, + // end line (optional, otherwise assumed same as start line), end column. + // These are packed into a single field for efficiency. Note that line + // and column numbers are zero-based -- typically you will want to add + // 1 to each before displaying to a user. + repeated int32 span = 2 [packed=true]; + + // TODO(kenton): Record comments appearing before and after the + // declaration. + } +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc new file mode 100644 index 000000000..23e48a67f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc @@ -0,0 +1,541 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +DescriptorDatabase::~DescriptorDatabase() {} + +// =================================================================== + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddFile( + const FileDescriptorProto& file, + Value value) { + if (!InsertIfNotPresent(&by_name_, file.name(), value)) { + GOOGLE_LOG(ERROR) << "File already exists in database: " << file.name(); + return false; + } + + // We must be careful here -- calling file.package() if file.has_package() is + // false could access an uninitialized static-storage variable if we are being + // run at startup time. + string path = file.has_package() ? file.package() : string(); + if (!path.empty()) path += '.'; + + for (int i = 0; i < file.message_type_size(); i++) { + if (!AddSymbol(path + file.message_type(i).name(), value)) return false; + if (!AddNestedExtensions(file.message_type(i), value)) return false; + } + for (int i = 0; i < file.enum_type_size(); i++) { + if (!AddSymbol(path + file.enum_type(i).name(), value)) return false; + } + for (int i = 0; i < file.extension_size(); i++) { + if (!AddSymbol(path + file.extension(i).name(), value)) return false; + if (!AddExtension(file.extension(i), value)) return false; + } + for (int i = 0; i < file.service_size(); i++) { + if (!AddSymbol(path + file.service(i).name(), value)) return false; + } + + return true; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddSymbol( + const string& name, Value value) { + // We need to make sure not to violate our map invariant. + + // If the symbol name is invalid it could break our lookup algorithm (which + // relies on the fact that '.' sorts before all other characters that are + // valid in symbol names). + if (!ValidateSymbolName(name)) { + GOOGLE_LOG(ERROR) << "Invalid symbol name: " << name; + return false; + } + + // Try to look up the symbol to make sure a super-symbol doesn't already + // exist. + typename map::iterator iter = FindLastLessOrEqual(name); + + if (iter == by_symbol_.end()) { + // Apparently the map is currently empty. Just insert and be done with it. + by_symbol_.insert(typename map::value_type(name, value)); + return true; + } + + if (IsSubSymbol(iter->first, name)) { + GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing " + "symbol \"" << iter->first << "\"."; + return false; + } + + // OK, that worked. Now we have to make sure that no symbol in the map is + // a sub-symbol of the one we are inserting. The only symbol which could + // be so is the first symbol that is greater than the new symbol. Since + // |iter| points at the last symbol that is less than or equal, we just have + // to increment it. + ++iter; + + if (iter != by_symbol_.end() && IsSubSymbol(name, iter->first)) { + GOOGLE_LOG(ERROR) << "Symbol name \"" << name << "\" conflicts with the existing " + "symbol \"" << iter->first << "\"."; + return false; + } + + // OK, no conflicts. + + // Insert the new symbol using the iterator as a hint, the new entry will + // appear immediately before the one the iterator is pointing at. + by_symbol_.insert(iter, typename map::value_type(name, value)); + + return true; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddNestedExtensions( + const DescriptorProto& message_type, + Value value) { + for (int i = 0; i < message_type.nested_type_size(); i++) { + if (!AddNestedExtensions(message_type.nested_type(i), value)) return false; + } + for (int i = 0; i < message_type.extension_size(); i++) { + if (!AddExtension(message_type.extension(i), value)) return false; + } + return true; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::AddExtension( + const FieldDescriptorProto& field, + Value value) { + if (!field.extendee().empty() && field.extendee()[0] == '.') { + // The extension is fully-qualified. We can use it as a lookup key in + // the by_symbol_ table. + if (!InsertIfNotPresent(&by_extension_, + make_pair(field.extendee().substr(1), + field.number()), + value)) { + GOOGLE_LOG(ERROR) << "Extension conflicts with extension already in database: " + "extend " << field.extendee() << " { " + << field.name() << " = " << field.number() << " }"; + return false; + } + } else { + // Not fully-qualified. We can't really do anything here, unfortunately. + // We don't consider this an error, though, because the descriptor is + // valid. + } + return true; +} + +template +Value SimpleDescriptorDatabase::DescriptorIndex::FindFile( + const string& filename) { + return FindWithDefault(by_name_, filename, Value()); +} + +template +Value SimpleDescriptorDatabase::DescriptorIndex::FindSymbol( + const string& name) { + typename map::iterator iter = FindLastLessOrEqual(name); + + return (iter != by_symbol_.end() && IsSubSymbol(iter->first, name)) ? + iter->second : Value(); +} + +template +Value SimpleDescriptorDatabase::DescriptorIndex::FindExtension( + const string& containing_type, + int field_number) { + return FindWithDefault(by_extension_, + make_pair(containing_type, field_number), + Value()); +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::FindAllExtensionNumbers( + const string& containing_type, + vector* output) { + typename map, Value >::const_iterator it = + by_extension_.lower_bound(make_pair(containing_type, 0)); + bool success = false; + + for (; it != by_extension_.end() && it->first.first == containing_type; + ++it) { + output->push_back(it->first.second); + success = true; + } + + return success; +} + +template +typename map::iterator +SimpleDescriptorDatabase::DescriptorIndex::FindLastLessOrEqual( + const string& name) { + // Find the last key in the map which sorts less than or equal to the + // symbol name. Since upper_bound() returns the *first* key that sorts + // *greater* than the input, we want the element immediately before that. + typename map::iterator iter = by_symbol_.upper_bound(name); + if (iter != by_symbol_.begin()) --iter; + return iter; +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::IsSubSymbol( + const string& sub_symbol, const string& super_symbol) { + return sub_symbol == super_symbol || + (HasPrefixString(super_symbol, sub_symbol) && + super_symbol[sub_symbol.size()] == '.'); +} + +template +bool SimpleDescriptorDatabase::DescriptorIndex::ValidateSymbolName( + const string& name) { + for (int i = 0; i < name.size(); i++) { + // I don't trust ctype.h due to locales. :( + if (name[i] != '.' && name[i] != '_' && + (name[i] < '0' || name[i] > '9') && + (name[i] < 'A' || name[i] > 'Z') && + (name[i] < 'a' || name[i] > 'z')) { + return false; + } + } + return true; +} + +// ------------------------------------------------------------------- + +SimpleDescriptorDatabase::SimpleDescriptorDatabase() {} +SimpleDescriptorDatabase::~SimpleDescriptorDatabase() { + STLDeleteElements(&files_to_delete_); +} + +bool SimpleDescriptorDatabase::Add(const FileDescriptorProto& file) { + FileDescriptorProto* new_file = new FileDescriptorProto; + new_file->CopyFrom(file); + return AddAndOwn(new_file); +} + +bool SimpleDescriptorDatabase::AddAndOwn(const FileDescriptorProto* file) { + files_to_delete_.push_back(file); + return index_.AddFile(*file, file); +} + +bool SimpleDescriptorDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + return MaybeCopy(index_.FindFile(filename), output); +} + +bool SimpleDescriptorDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + return MaybeCopy(index_.FindSymbol(symbol_name), output); +} + +bool SimpleDescriptorDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + return MaybeCopy(index_.FindExtension(containing_type, field_number), output); +} + +bool SimpleDescriptorDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + return index_.FindAllExtensionNumbers(extendee_type, output); +} + +bool SimpleDescriptorDatabase::MaybeCopy(const FileDescriptorProto* file, + FileDescriptorProto* output) { + if (file == NULL) return false; + output->CopyFrom(*file); + return true; +} + +// ------------------------------------------------------------------- + +EncodedDescriptorDatabase::EncodedDescriptorDatabase() {} +EncodedDescriptorDatabase::~EncodedDescriptorDatabase() { + for (int i = 0; i < files_to_delete_.size(); i++) { + operator delete(files_to_delete_[i]); + } +} + +bool EncodedDescriptorDatabase::Add( + const void* encoded_file_descriptor, int size) { + FileDescriptorProto file; + if (file.ParseFromArray(encoded_file_descriptor, size)) { + return index_.AddFile(file, make_pair(encoded_file_descriptor, size)); + } else { + GOOGLE_LOG(ERROR) << "Invalid file descriptor data passed to " + "EncodedDescriptorDatabase::Add()."; + return false; + } +} + +bool EncodedDescriptorDatabase::AddCopy( + const void* encoded_file_descriptor, int size) { + void* copy = operator new(size); + memcpy(copy, encoded_file_descriptor, size); + files_to_delete_.push_back(copy); + return Add(copy, size); +} + +bool EncodedDescriptorDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + return MaybeParse(index_.FindFile(filename), output); +} + +bool EncodedDescriptorDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + return MaybeParse(index_.FindSymbol(symbol_name), output); +} + +bool EncodedDescriptorDatabase::FindNameOfFileContainingSymbol( + const string& symbol_name, + string* output) { + pair encoded_file = index_.FindSymbol(symbol_name); + if (encoded_file.first == NULL) return false; + + // Optimization: The name should be the first field in the encoded message. + // Try to just read it directly. + io::CodedInputStream input(reinterpret_cast(encoded_file.first), + encoded_file.second); + + const uint32 kNameTag = internal::WireFormatLite::MakeTag( + FileDescriptorProto::kNameFieldNumber, + internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + + if (input.ReadTag() == kNameTag) { + // Success! + return internal::WireFormatLite::ReadString(&input, output); + } else { + // Slow path. Parse whole message. + FileDescriptorProto file_proto; + if (!file_proto.ParseFromArray(encoded_file.first, encoded_file.second)) { + return false; + } + *output = file_proto.name(); + return true; + } +} + +bool EncodedDescriptorDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + return MaybeParse(index_.FindExtension(containing_type, field_number), + output); +} + +bool EncodedDescriptorDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + return index_.FindAllExtensionNumbers(extendee_type, output); +} + +bool EncodedDescriptorDatabase::MaybeParse( + pair encoded_file, + FileDescriptorProto* output) { + if (encoded_file.first == NULL) return false; + return output->ParseFromArray(encoded_file.first, encoded_file.second); +} + +// =================================================================== + +DescriptorPoolDatabase::DescriptorPoolDatabase(const DescriptorPool& pool) + : pool_(pool) {} +DescriptorPoolDatabase::~DescriptorPoolDatabase() {} + +bool DescriptorPoolDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + const FileDescriptor* file = pool_.FindFileByName(filename); + if (file == NULL) return false; + output->Clear(); + file->CopyTo(output); + return true; +} + +bool DescriptorPoolDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + const FileDescriptor* file = pool_.FindFileContainingSymbol(symbol_name); + if (file == NULL) return false; + output->Clear(); + file->CopyTo(output); + return true; +} + +bool DescriptorPoolDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + const Descriptor* extendee = pool_.FindMessageTypeByName(containing_type); + if (extendee == NULL) return false; + + const FieldDescriptor* extension = + pool_.FindExtensionByNumber(extendee, field_number); + if (extension == NULL) return false; + + output->Clear(); + extension->file()->CopyTo(output); + return true; +} + +bool DescriptorPoolDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + const Descriptor* extendee = pool_.FindMessageTypeByName(extendee_type); + if (extendee == NULL) return false; + + vector extensions; + pool_.FindAllExtensions(extendee, &extensions); + + for (int i = 0; i < extensions.size(); ++i) { + output->push_back(extensions[i]->number()); + } + + return true; +} + +// =================================================================== + +MergedDescriptorDatabase::MergedDescriptorDatabase( + DescriptorDatabase* source1, + DescriptorDatabase* source2) { + sources_.push_back(source1); + sources_.push_back(source2); +} +MergedDescriptorDatabase::MergedDescriptorDatabase( + const vector& sources) + : sources_(sources) {} +MergedDescriptorDatabase::~MergedDescriptorDatabase() {} + +bool MergedDescriptorDatabase::FindFileByName( + const string& filename, + FileDescriptorProto* output) { + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindFileByName(filename, output)) { + return true; + } + } + return false; +} + +bool MergedDescriptorDatabase::FindFileContainingSymbol( + const string& symbol_name, + FileDescriptorProto* output) { + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindFileContainingSymbol(symbol_name, output)) { + // The symbol was found in source i. However, if one of the previous + // sources defines a file with the same name (which presumably doesn't + // contain the symbol, since it wasn't found in that source), then we + // must hide it from the caller. + FileDescriptorProto temp; + for (int j = 0; j < i; j++) { + if (sources_[j]->FindFileByName(output->name(), &temp)) { + // Found conflicting file in a previous source. + return false; + } + } + return true; + } + } + return false; +} + +bool MergedDescriptorDatabase::FindFileContainingExtension( + const string& containing_type, + int field_number, + FileDescriptorProto* output) { + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindFileContainingExtension( + containing_type, field_number, output)) { + // The symbol was found in source i. However, if one of the previous + // sources defines a file with the same name (which presumably doesn't + // contain the symbol, since it wasn't found in that source), then we + // must hide it from the caller. + FileDescriptorProto temp; + for (int j = 0; j < i; j++) { + if (sources_[j]->FindFileByName(output->name(), &temp)) { + // Found conflicting file in a previous source. + return false; + } + } + return true; + } + } + return false; +} + +bool MergedDescriptorDatabase::FindAllExtensionNumbers( + const string& extendee_type, + vector* output) { + set merged_results; + vector results; + bool success = false; + + for (int i = 0; i < sources_.size(); i++) { + if (sources_[i]->FindAllExtensionNumbers(extendee_type, &results)) { + copy(results.begin(), results.end(), + insert_iterator >(merged_results, merged_results.begin())); + success = true; + } + results.clear(); + } + + copy(merged_results.begin(), merged_results.end(), + insert_iterator >(*output, output->end())); + + return success; +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h new file mode 100644 index 000000000..f32b1db93 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h @@ -0,0 +1,366 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Interface for manipulating databases of descriptors. + +#ifndef GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ +#define GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +// Defined in this file. +class DescriptorDatabase; +class SimpleDescriptorDatabase; +class EncodedDescriptorDatabase; +class DescriptorPoolDatabase; +class MergedDescriptorDatabase; + +// Abstract interface for a database of descriptors. +// +// This is useful if you want to create a DescriptorPool which loads +// descriptors on-demand from some sort of large database. If the database +// is large, it may be inefficient to enumerate every .proto file inside it +// calling DescriptorPool::BuildFile() for each one. Instead, a DescriptorPool +// can be created which wraps a DescriptorDatabase and only builds particular +// descriptors when they are needed. +class LIBPROTOBUF_EXPORT DescriptorDatabase { + public: + inline DescriptorDatabase() {} + virtual ~DescriptorDatabase(); + + // Find a file by file name. Fills in in *output and returns true if found. + // Otherwise, returns false, leaving the contents of *output undefined. + virtual bool FindFileByName(const string& filename, + FileDescriptorProto* output) = 0; + + // Find the file that declares the given fully-qualified symbol name. + // If found, fills in *output and returns true, otherwise returns false + // and leaves *output undefined. + virtual bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output) = 0; + + // Find the file which defines an extension extending the given message type + // with the given field number. If found, fills in *output and returns true, + // otherwise returns false and leaves *output undefined. containing_type + // must be a fully-qualified type name. + virtual bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output) = 0; + + // Finds the tag numbers used by all known extensions of + // extendee_type, and appends them to output in an undefined + // order. This method is best-effort: it's not guaranteed that the + // database will find all extensions, and it's not guaranteed that + // FindFileContainingExtension will return true on all of the found + // numbers. Returns true if the search was successful, otherwise + // returns false and leaves output unchanged. + // + // This method has a default implementation that always returns + // false. + virtual bool FindAllExtensionNumbers(const string& extendee_type, + vector* output) { + return false; + } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorDatabase); +}; + +// A DescriptorDatabase into which you can insert files manually. +// +// FindFileContainingSymbol() is fully-implemented. When you add a file, its +// symbols will be indexed for this purpose. Note that the implementation +// may return false positives, but only if it isn't possible for the symbol +// to be defined in any other file. In particular, if a file defines a symbol +// "Foo", then searching for "Foo.[anything]" will match that file. This way, +// the database does not need to aggressively index all children of a symbol. +// +// FindFileContainingExtension() is mostly-implemented. It works if and only +// if the original FieldDescriptorProto defining the extension has a +// fully-qualified type name in its "extendee" field (i.e. starts with a '.'). +// If the extendee is a relative name, SimpleDescriptorDatabase will not +// attempt to resolve the type, so it will not know what type the extension is +// extending. Therefore, calling FindFileContainingExtension() with the +// extension's containing type will never actually find that extension. Note +// that this is an unlikely problem, as all FileDescriptorProtos created by the +// protocol compiler (as well as ones created by calling +// FileDescriptor::CopyTo()) will always use fully-qualified names for all +// types. You only need to worry if you are constructing FileDescriptorProtos +// yourself, or are calling compiler::Parser directly. +class LIBPROTOBUF_EXPORT SimpleDescriptorDatabase : public DescriptorDatabase { + public: + SimpleDescriptorDatabase(); + ~SimpleDescriptorDatabase(); + + // Adds the FileDescriptorProto to the database, making a copy. The object + // can be deleted after Add() returns. Returns false if the file conflicted + // with a file already in the database, in which case an error will have + // been written to GOOGLE_LOG(ERROR). + bool Add(const FileDescriptorProto& file); + + // Adds the FileDescriptorProto to the database and takes ownership of it. + bool AddAndOwn(const FileDescriptorProto* file); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + private: + // So that it can use DescriptorIndex. + friend class EncodedDescriptorDatabase; + + // An index mapping file names, symbol names, and extension numbers to + // some sort of values. + template + class DescriptorIndex { + public: + // Helpers to recursively add particular descriptors and all their contents + // to the index. + bool AddFile(const FileDescriptorProto& file, + Value value); + bool AddSymbol(const string& name, Value value); + bool AddNestedExtensions(const DescriptorProto& message_type, + Value value); + bool AddExtension(const FieldDescriptorProto& field, + Value value); + + Value FindFile(const string& filename); + Value FindSymbol(const string& name); + Value FindExtension(const string& containing_type, int field_number); + bool FindAllExtensionNumbers(const string& containing_type, + vector* output); + + private: + map by_name_; + map by_symbol_; + map, Value> by_extension_; + + // Invariant: The by_symbol_ map does not contain any symbols which are + // prefixes of other symbols in the map. For example, "foo.bar" is a + // prefix of "foo.bar.baz" (but is not a prefix of "foo.barbaz"). + // + // This invariant is important because it means that given a symbol name, + // we can find a key in the map which is a prefix of the symbol in O(lg n) + // time, and we know that there is at most one such key. + // + // The prefix lookup algorithm works like so: + // 1) Find the last key in the map which is less than or equal to the + // search key. + // 2) If the found key is a prefix of the search key, then return it. + // Otherwise, there is no match. + // + // I am sure this algorithm has been described elsewhere, but since I + // wasn't able to find it quickly I will instead prove that it works + // myself. The key to the algorithm is that if a match exists, step (1) + // will find it. Proof: + // 1) Define the "search key" to be the key we are looking for, the "found + // key" to be the key found in step (1), and the "match key" to be the + // key which actually matches the serach key (i.e. the key we're trying + // to find). + // 2) The found key must be less than or equal to the search key by + // definition. + // 3) The match key must also be less than or equal to the search key + // (because it is a prefix). + // 4) The match key cannot be greater than the found key, because if it + // were, then step (1) of the algorithm would have returned the match + // key instead (since it finds the *greatest* key which is less than or + // equal to the search key). + // 5) Therefore, the found key must be between the match key and the search + // key, inclusive. + // 6) Since the search key must be a sub-symbol of the match key, if it is + // not equal to the match key, then search_key[match_key.size()] must + // be '.'. + // 7) Since '.' sorts before any other character that is valid in a symbol + // name, then if the found key is not equal to the match key, then + // found_key[match_key.size()] must also be '.', because any other value + // would make it sort after the search key. + // 8) Therefore, if the found key is not equal to the match key, then the + // found key must be a sub-symbol of the match key. However, this would + // contradict our map invariant which says that no symbol in the map is + // a sub-symbol of any other. + // 9) Therefore, the found key must match the match key. + // + // The above proof assumes the match key exists. In the case that the + // match key does not exist, then step (1) will return some other symbol. + // That symbol cannot be a super-symbol of the search key since if it were, + // then it would be a match, and we're assuming the match key doesn't exist. + // Therefore, step 2 will correctly return no match. + + // Find the last entry in the by_symbol_ map whose key is less than or + // equal to the given name. + typename map::iterator FindLastLessOrEqual( + const string& name); + + // True if either the arguments are equal or super_symbol identifies a + // parent symbol of sub_symbol (e.g. "foo.bar" is a parent of + // "foo.bar.baz", but not a parent of "foo.barbaz"). + bool IsSubSymbol(const string& sub_symbol, const string& super_symbol); + + // Returns true if and only if all characters in the name are alphanumerics, + // underscores, or periods. + bool ValidateSymbolName(const string& name); + }; + + + DescriptorIndex index_; + vector files_to_delete_; + + // If file is non-NULL, copy it into *output and return true, otherwise + // return false. + bool MaybeCopy(const FileDescriptorProto* file, + FileDescriptorProto* output); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(SimpleDescriptorDatabase); +}; + +// Very similar to SimpleDescriptorDatabase, but stores all the descriptors +// as raw bytes and generally tries to use as little memory as possible. +// +// The same caveats regarding FindFileContainingExtension() apply as with +// SimpleDescriptorDatabase. +class LIBPROTOBUF_EXPORT EncodedDescriptorDatabase : public DescriptorDatabase { + public: + EncodedDescriptorDatabase(); + ~EncodedDescriptorDatabase(); + + // Adds the FileDescriptorProto to the database. The descriptor is provided + // in encoded form. The database does not make a copy of the bytes, nor + // does it take ownership; it's up to the caller to make sure the bytes + // remain valid for the life of the database. Returns false and logs an error + // if the bytes are not a valid FileDescriptorProto or if the file conflicted + // with a file already in the database. + bool Add(const void* encoded_file_descriptor, int size); + + // Like Add(), but makes a copy of the data, so that the caller does not + // need to keep it around. + bool AddCopy(const void* encoded_file_descriptor, int size); + + // Like FindFileContainingSymbol but returns only the name of the file. + bool FindNameOfFileContainingSymbol(const string& symbol_name, + string* output); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + private: + SimpleDescriptorDatabase::DescriptorIndex > index_; + vector files_to_delete_; + + // If encoded_file.first is non-NULL, parse the data into *output and return + // true, otherwise return false. + bool MaybeParse(pair encoded_file, + FileDescriptorProto* output); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(EncodedDescriptorDatabase); +}; + +// A DescriptorDatabase that fetches files from a given pool. +class LIBPROTOBUF_EXPORT DescriptorPoolDatabase : public DescriptorDatabase { + public: + DescriptorPoolDatabase(const DescriptorPool& pool); + ~DescriptorPoolDatabase(); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + private: + const DescriptorPool& pool_; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DescriptorPoolDatabase); +}; + +// A DescriptorDatabase that wraps two or more others. It first searches the +// first database and, if that fails, tries the second, and so on. +class LIBPROTOBUF_EXPORT MergedDescriptorDatabase : public DescriptorDatabase { + public: + // Merge just two databases. The sources remain property of the caller. + MergedDescriptorDatabase(DescriptorDatabase* source1, + DescriptorDatabase* source2); + // Merge more than two databases. The sources remain property of the caller. + // The vector may be deleted after the constructor returns but the + // DescriptorDatabases need to stick around. + MergedDescriptorDatabase(const vector& sources); + ~MergedDescriptorDatabase(); + + // implements DescriptorDatabase ----------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output); + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output); + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output); + // Merges the results of calling all databases. Returns true iff any + // of the databases returned true. + bool FindAllExtensionNumbers(const string& extendee_type, + vector* output); + + private: + vector sources_; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MergedDescriptorDatabase); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_DESCRIPTOR_DATABASE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc new file mode 100644 index 000000000..ac72ddcdb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc @@ -0,0 +1,748 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file makes extensive use of RFC 3092. :) + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace { + +static void AddToDatabase(SimpleDescriptorDatabase* database, + const char* file_text) { + FileDescriptorProto file_proto; + EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); + database->Add(file_proto); +} + +static void ExpectContainsType(const FileDescriptorProto& proto, + const string& type_name) { + for (int i = 0; i < proto.message_type_size(); i++) { + if (proto.message_type(i).name() == type_name) return; + } + ADD_FAILURE() << "\"" << proto.name() + << "\" did not contain expected type \"" + << type_name << "\"."; +} + +// =================================================================== + +#if GTEST_HAS_PARAM_TEST + +// SimpleDescriptorDatabase, EncodedDescriptorDatabase, and +// DescriptorPoolDatabase call for very similar tests. Instead of writing +// three nearly-identical sets of tests, we use parameterized tests to apply +// the same code to all three. + +// The parameterized test runs against a DescriptarDatabaseTestCase. We have +// implementations for each of the three classes we want to test. +class DescriptorDatabaseTestCase { + public: + virtual ~DescriptorDatabaseTestCase() {} + + virtual DescriptorDatabase* GetDatabase() = 0; + virtual bool AddToDatabase(const FileDescriptorProto& file) = 0; +}; + +// Factory function type. +typedef DescriptorDatabaseTestCase* DescriptorDatabaseTestCaseFactory(); + +// Specialization for SimpleDescriptorDatabase. +class SimpleDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase { + public: + static DescriptorDatabaseTestCase* New() { + return new SimpleDescriptorDatabaseTestCase; + } + + virtual ~SimpleDescriptorDatabaseTestCase() {} + + virtual DescriptorDatabase* GetDatabase() { + return &database_; + } + virtual bool AddToDatabase(const FileDescriptorProto& file) { + return database_.Add(file); + } + + private: + SimpleDescriptorDatabase database_; +}; + +// Specialization for EncodedDescriptorDatabase. +class EncodedDescriptorDatabaseTestCase : public DescriptorDatabaseTestCase { + public: + static DescriptorDatabaseTestCase* New() { + return new EncodedDescriptorDatabaseTestCase; + } + + virtual ~EncodedDescriptorDatabaseTestCase() {} + + virtual DescriptorDatabase* GetDatabase() { + return &database_; + } + virtual bool AddToDatabase(const FileDescriptorProto& file) { + string data; + file.SerializeToString(&data); + return database_.AddCopy(data.data(), data.size()); + } + + private: + EncodedDescriptorDatabase database_; +}; + +// Specialization for DescriptorPoolDatabase. +class DescriptorPoolDatabaseTestCase : public DescriptorDatabaseTestCase { + public: + static DescriptorDatabaseTestCase* New() { + return new EncodedDescriptorDatabaseTestCase; + } + + DescriptorPoolDatabaseTestCase() : database_(pool_) {} + virtual ~DescriptorPoolDatabaseTestCase() {} + + virtual DescriptorDatabase* GetDatabase() { + return &database_; + } + virtual bool AddToDatabase(const FileDescriptorProto& file) { + return pool_.BuildFile(file); + } + + private: + DescriptorPool pool_; + DescriptorPoolDatabase database_; +}; + +// ------------------------------------------------------------------- + +class DescriptorDatabaseTest + : public testing::TestWithParam { + protected: + virtual void SetUp() { + test_case_.reset(GetParam()()); + database_ = test_case_->GetDatabase(); + } + + void AddToDatabase(const char* file_descriptor_text) { + FileDescriptorProto file_proto; + EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto)); + EXPECT_TRUE(test_case_->AddToDatabase(file_proto)); + } + + void AddToDatabaseWithError(const char* file_descriptor_text) { + FileDescriptorProto file_proto; + EXPECT_TRUE(TextFormat::ParseFromString(file_descriptor_text, &file_proto)); + EXPECT_FALSE(test_case_->AddToDatabase(file_proto)); + } + + scoped_ptr test_case_; + DescriptorDatabase* database_; +}; + +TEST_P(DescriptorDatabaseTest, FindFileByName) { + AddToDatabase( + "name: \"foo.proto\" " + "message_type { name:\"Foo\" }"); + AddToDatabase( + "name: \"bar.proto\" " + "message_type { name:\"Bar\" }"); + + { + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileByName("foo.proto", &file)); + EXPECT_EQ("foo.proto", file.name()); + ExpectContainsType(file, "Foo"); + } + + { + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileByName("bar.proto", &file)); + EXPECT_EQ("bar.proto", file.name()); + ExpectContainsType(file, "Bar"); + } + + { + // Fails to find undefined files. + FileDescriptorProto file; + EXPECT_FALSE(database_->FindFileByName("baz.proto", &file)); + } +} + +TEST_P(DescriptorDatabaseTest, FindFileContainingSymbol) { + AddToDatabase( + "name: \"foo.proto\" " + "message_type { " + " name: \"Foo\" " + " field { name:\"qux\" }" + " nested_type { name: \"Grault\" } " + " enum_type { name: \"Garply\" } " + "} " + "enum_type { " + " name: \"Waldo\" " + " value { name:\"FRED\" } " + "} " + "extension { name: \"plugh\" } " + "service { " + " name: \"Xyzzy\" " + " method { name: \"Thud\" } " + "}" + ); + AddToDatabase( + "name: \"bar.proto\" " + "package: \"corge\" " + "message_type { name: \"Bar\" }"); + + { + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Foo", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find fields. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.qux", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find nested types. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.Grault", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find nested enums. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Foo.Garply", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find enum types. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Waldo", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find enum values. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Waldo.FRED", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find extensions. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("plugh", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find services. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Xyzzy", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find methods. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("Xyzzy.Thud", &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + // Can find things in packages. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingSymbol("corge.Bar", &file)); + EXPECT_EQ("bar.proto", file.name()); + } + + { + // Fails to find undefined symbols. + FileDescriptorProto file; + EXPECT_FALSE(database_->FindFileContainingSymbol("Baz", &file)); + } + + { + // Names must be fully-qualified. + FileDescriptorProto file; + EXPECT_FALSE(database_->FindFileContainingSymbol("Bar", &file)); + } +} + +TEST_P(DescriptorDatabaseTest, FindFileContainingExtension) { + AddToDatabase( + "name: \"foo.proto\" " + "message_type { " + " name: \"Foo\" " + " extension_range { start: 1 end: 1000 } " + " extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " + " extendee: \".Foo\" }" + "}"); + AddToDatabase( + "name: \"bar.proto\" " + "package: \"corge\" " + "dependency: \"foo.proto\" " + "message_type { " + " name: \"Bar\" " + " extension_range { start: 1 end: 1000 } " + "} " + "extension { name:\"grault\" extendee: \".Foo\" number:32 } " + "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } " + "extension { name:\"waldo\" extendee: \"Bar\" number:56 } "); + + { + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingExtension("Foo", 5, &file)); + EXPECT_EQ("foo.proto", file.name()); + } + + { + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingExtension("Foo", 32, &file)); + EXPECT_EQ("bar.proto", file.name()); + } + + { + // Can find extensions for qualified type names. + FileDescriptorProto file; + EXPECT_TRUE(database_->FindFileContainingExtension("corge.Bar", 70, &file)); + EXPECT_EQ("bar.proto", file.name()); + } + + { + // Can't find extensions whose extendee was not fully-qualified in the + // FileDescriptorProto. + FileDescriptorProto file; + EXPECT_FALSE(database_->FindFileContainingExtension("Bar", 56, &file)); + EXPECT_FALSE( + database_->FindFileContainingExtension("corge.Bar", 56, &file)); + } + + { + // Can't find non-existent extension numbers. + FileDescriptorProto file; + EXPECT_FALSE(database_->FindFileContainingExtension("Foo", 12, &file)); + } + + { + // Can't find extensions for non-existent types. + FileDescriptorProto file; + EXPECT_FALSE( + database_->FindFileContainingExtension("NoSuchType", 5, &file)); + } + + { + // Can't find extensions for unqualified type names. + FileDescriptorProto file; + EXPECT_FALSE(database_->FindFileContainingExtension("Bar", 70, &file)); + } +} + +TEST_P(DescriptorDatabaseTest, FindAllExtensionNumbers) { + AddToDatabase( + "name: \"foo.proto\" " + "message_type { " + " name: \"Foo\" " + " extension_range { start: 1 end: 1000 } " + " extension { name:\"qux\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " + " extendee: \".Foo\" }" + "}"); + AddToDatabase( + "name: \"bar.proto\" " + "package: \"corge\" " + "dependency: \"foo.proto\" " + "message_type { " + " name: \"Bar\" " + " extension_range { start: 1 end: 1000 } " + "} " + "extension { name:\"grault\" extendee: \".Foo\" number:32 } " + "extension { name:\"garply\" extendee: \".corge.Bar\" number:70 } " + "extension { name:\"waldo\" extendee: \"Bar\" number:56 } "); + + { + vector numbers; + EXPECT_TRUE(database_->FindAllExtensionNumbers("Foo", &numbers)); + ASSERT_EQ(2, numbers.size()); + sort(numbers.begin(), numbers.end()); + EXPECT_EQ(5, numbers[0]); + EXPECT_EQ(32, numbers[1]); + } + + { + vector numbers; + EXPECT_TRUE(database_->FindAllExtensionNumbers("corge.Bar", &numbers)); + // Note: won't find extension 56 due to the name not being fully qualified. + ASSERT_EQ(1, numbers.size()); + EXPECT_EQ(70, numbers[0]); + } + + { + // Can't find extensions for non-existent types. + vector numbers; + EXPECT_FALSE(database_->FindAllExtensionNumbers("NoSuchType", &numbers)); + } + + { + // Can't find extensions for unqualified types. + vector numbers; + EXPECT_FALSE(database_->FindAllExtensionNumbers("Bar", &numbers)); + } +} + +TEST_P(DescriptorDatabaseTest, ConflictingFileError) { + AddToDatabase( + "name: \"foo.proto\" " + "message_type { " + " name: \"Foo\" " + "}"); + AddToDatabaseWithError( + "name: \"foo.proto\" " + "message_type { " + " name: \"Bar\" " + "}"); +} + +TEST_P(DescriptorDatabaseTest, ConflictingTypeError) { + AddToDatabase( + "name: \"foo.proto\" " + "message_type { " + " name: \"Foo\" " + "}"); + AddToDatabaseWithError( + "name: \"bar.proto\" " + "message_type { " + " name: \"Foo\" " + "}"); +} + +TEST_P(DescriptorDatabaseTest, ConflictingExtensionError) { + AddToDatabase( + "name: \"foo.proto\" " + "extension { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " + " extendee: \".Foo\" }"); + AddToDatabaseWithError( + "name: \"bar.proto\" " + "extension { name:\"bar\" label:LABEL_OPTIONAL type:TYPE_INT32 number:5 " + " extendee: \".Foo\" }"); +} + +INSTANTIATE_TEST_CASE_P(Simple, DescriptorDatabaseTest, + testing::Values(&SimpleDescriptorDatabaseTestCase::New)); +INSTANTIATE_TEST_CASE_P(MemoryConserving, DescriptorDatabaseTest, + testing::Values(&EncodedDescriptorDatabaseTestCase::New)); +INSTANTIATE_TEST_CASE_P(Pool, DescriptorDatabaseTest, + testing::Values(&DescriptorPoolDatabaseTestCase::New)); + +#endif // GTEST_HAS_PARAM_TEST + +TEST(EncodedDescriptorDatabaseExtraTest, FindNameOfFileContainingSymbol) { + // Create two files, one of which is in two parts. + FileDescriptorProto file1, file2a, file2b; + file1.set_name("foo.proto"); + file1.set_package("foo"); + file1.add_message_type()->set_name("Foo"); + file2a.set_name("bar.proto"); + file2b.set_package("bar"); + file2b.add_message_type()->set_name("Bar"); + + // Normal serialization allows our optimization to kick in. + string data1 = file1.SerializeAsString(); + + // Force out-of-order serialization to test slow path. + string data2 = file2b.SerializeAsString() + file2a.SerializeAsString(); + + // Create EncodedDescriptorDatabase containing both files. + EncodedDescriptorDatabase db; + db.Add(data1.data(), data1.size()); + db.Add(data2.data(), data2.size()); + + // Test! + string filename; + EXPECT_TRUE(db.FindNameOfFileContainingSymbol("foo.Foo", &filename)); + EXPECT_EQ("foo.proto", filename); + EXPECT_TRUE(db.FindNameOfFileContainingSymbol("foo.Foo.Blah", &filename)); + EXPECT_EQ("foo.proto", filename); + EXPECT_TRUE(db.FindNameOfFileContainingSymbol("bar.Bar", &filename)); + EXPECT_EQ("bar.proto", filename); + EXPECT_FALSE(db.FindNameOfFileContainingSymbol("foo", &filename)); + EXPECT_FALSE(db.FindNameOfFileContainingSymbol("bar", &filename)); + EXPECT_FALSE(db.FindNameOfFileContainingSymbol("baz.Baz", &filename)); +} + +// =================================================================== + +class MergedDescriptorDatabaseTest : public testing::Test { + protected: + MergedDescriptorDatabaseTest() + : forward_merged_(&database1_, &database2_), + reverse_merged_(&database2_, &database1_) {} + + virtual void SetUp() { + AddToDatabase(&database1_, + "name: \"foo.proto\" " + "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } " + "extension { name:\"foo_ext\" extendee: \".Foo\" number:3 " + " label:LABEL_OPTIONAL type:TYPE_INT32 } "); + AddToDatabase(&database2_, + "name: \"bar.proto\" " + "message_type { name:\"Bar\" extension_range { start: 1 end: 100 } } " + "extension { name:\"bar_ext\" extendee: \".Bar\" number:5 " + " label:LABEL_OPTIONAL type:TYPE_INT32 } "); + + // baz.proto exists in both pools, with different definitions. + AddToDatabase(&database1_, + "name: \"baz.proto\" " + "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } " + "message_type { name:\"FromPool1\" } " + "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 " + " label:LABEL_OPTIONAL type:TYPE_INT32 } " + "extension { name:\"database1_only_ext\" extendee: \".Baz\" number:13 " + " label:LABEL_OPTIONAL type:TYPE_INT32 } "); + AddToDatabase(&database2_, + "name: \"baz.proto\" " + "message_type { name:\"Baz\" extension_range { start: 1 end: 100 } } " + "message_type { name:\"FromPool2\" } " + "extension { name:\"baz_ext\" extendee: \".Baz\" number:12 " + " label:LABEL_OPTIONAL type:TYPE_INT32 } "); + } + + SimpleDescriptorDatabase database1_; + SimpleDescriptorDatabase database2_; + + MergedDescriptorDatabase forward_merged_; + MergedDescriptorDatabase reverse_merged_; +}; + +TEST_F(MergedDescriptorDatabaseTest, FindFileByName) { + { + // Can find file that is only in database1_. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileByName("foo.proto", &file)); + EXPECT_EQ("foo.proto", file.name()); + ExpectContainsType(file, "Foo"); + } + + { + // Can find file that is only in database2_. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileByName("bar.proto", &file)); + EXPECT_EQ("bar.proto", file.name()); + ExpectContainsType(file, "Bar"); + } + + { + // In forward_merged_, database1_'s baz.proto takes precedence. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileByName("baz.proto", &file)); + EXPECT_EQ("baz.proto", file.name()); + ExpectContainsType(file, "FromPool1"); + } + + { + // In reverse_merged_, database2_'s baz.proto takes precedence. + FileDescriptorProto file; + EXPECT_TRUE(reverse_merged_.FindFileByName("baz.proto", &file)); + EXPECT_EQ("baz.proto", file.name()); + ExpectContainsType(file, "FromPool2"); + } + + { + // Can't find non-existent file. + FileDescriptorProto file; + EXPECT_FALSE(forward_merged_.FindFileByName("no_such.proto", &file)); + } +} + +TEST_F(MergedDescriptorDatabaseTest, FindFileContainingSymbol) { + { + // Can find file that is only in database1_. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Foo", &file)); + EXPECT_EQ("foo.proto", file.name()); + ExpectContainsType(file, "Foo"); + } + + { + // Can find file that is only in database2_. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Bar", &file)); + EXPECT_EQ("bar.proto", file.name()); + ExpectContainsType(file, "Bar"); + } + + { + // In forward_merged_, database1_'s baz.proto takes precedence. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("Baz", &file)); + EXPECT_EQ("baz.proto", file.name()); + ExpectContainsType(file, "FromPool1"); + } + + { + // In reverse_merged_, database2_'s baz.proto takes precedence. + FileDescriptorProto file; + EXPECT_TRUE(reverse_merged_.FindFileContainingSymbol("Baz", &file)); + EXPECT_EQ("baz.proto", file.name()); + ExpectContainsType(file, "FromPool2"); + } + + { + // FromPool1 only shows up in forward_merged_ because it is masked by + // database2_'s baz.proto in reverse_merged_. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileContainingSymbol("FromPool1", &file)); + EXPECT_FALSE(reverse_merged_.FindFileContainingSymbol("FromPool1", &file)); + } + + { + // Can't find non-existent symbol. + FileDescriptorProto file; + EXPECT_FALSE( + forward_merged_.FindFileContainingSymbol("NoSuchType", &file)); + } +} + +TEST_F(MergedDescriptorDatabaseTest, FindFileContainingExtension) { + { + // Can find file that is only in database1_. + FileDescriptorProto file; + EXPECT_TRUE( + forward_merged_.FindFileContainingExtension("Foo", 3, &file)); + EXPECT_EQ("foo.proto", file.name()); + ExpectContainsType(file, "Foo"); + } + + { + // Can find file that is only in database2_. + FileDescriptorProto file; + EXPECT_TRUE( + forward_merged_.FindFileContainingExtension("Bar", 5, &file)); + EXPECT_EQ("bar.proto", file.name()); + ExpectContainsType(file, "Bar"); + } + + { + // In forward_merged_, database1_'s baz.proto takes precedence. + FileDescriptorProto file; + EXPECT_TRUE( + forward_merged_.FindFileContainingExtension("Baz", 12, &file)); + EXPECT_EQ("baz.proto", file.name()); + ExpectContainsType(file, "FromPool1"); + } + + { + // In reverse_merged_, database2_'s baz.proto takes precedence. + FileDescriptorProto file; + EXPECT_TRUE( + reverse_merged_.FindFileContainingExtension("Baz", 12, &file)); + EXPECT_EQ("baz.proto", file.name()); + ExpectContainsType(file, "FromPool2"); + } + + { + // Baz's extension 13 only shows up in forward_merged_ because it is + // masked by database2_'s baz.proto in reverse_merged_. + FileDescriptorProto file; + EXPECT_TRUE(forward_merged_.FindFileContainingExtension("Baz", 13, &file)); + EXPECT_FALSE(reverse_merged_.FindFileContainingExtension("Baz", 13, &file)); + } + + { + // Can't find non-existent extension. + FileDescriptorProto file; + EXPECT_FALSE( + forward_merged_.FindFileContainingExtension("Foo", 6, &file)); + } +} + +TEST_F(MergedDescriptorDatabaseTest, FindAllExtensionNumbers) { + { + // Message only has extension in database1_ + vector numbers; + EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Foo", &numbers)); + ASSERT_EQ(1, numbers.size()); + EXPECT_EQ(3, numbers[0]); + } + + { + // Message only has extension in database2_ + vector numbers; + EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Bar", &numbers)); + ASSERT_EQ(1, numbers.size()); + EXPECT_EQ(5, numbers[0]); + } + + { + // Merge results from the two databases. + vector numbers; + EXPECT_TRUE(forward_merged_.FindAllExtensionNumbers("Baz", &numbers)); + ASSERT_EQ(2, numbers.size()); + sort(numbers.begin(), numbers.end()); + EXPECT_EQ(12, numbers[0]); + EXPECT_EQ(13, numbers[1]); + } + + { + vector numbers; + EXPECT_TRUE(reverse_merged_.FindAllExtensionNumbers("Baz", &numbers)); + ASSERT_EQ(2, numbers.size()); + sort(numbers.begin(), numbers.end()); + EXPECT_EQ(12, numbers[0]); + EXPECT_EQ(13, numbers[1]); + } + + { + // Can't find extensions for a non-existent message. + vector numbers; + EXPECT_FALSE(reverse_merged_.FindAllExtensionNumbers("Blah", &numbers)); + } +} + +} // anonymous namespace +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc new file mode 100644 index 000000000..55aebfd12 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc @@ -0,0 +1,4034 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file makes extensive use of RFC 3092. :) + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { + +// Can't use an anonymous namespace here due to brokenness of Tru64 compiler. +namespace descriptor_unittest { + +// Some helpers to make assembling descriptors faster. +DescriptorProto* AddMessage(FileDescriptorProto* file, const string& name) { + DescriptorProto* result = file->add_message_type(); + result->set_name(name); + return result; +} + +DescriptorProto* AddNestedMessage(DescriptorProto* parent, const string& name) { + DescriptorProto* result = parent->add_nested_type(); + result->set_name(name); + return result; +} + +EnumDescriptorProto* AddEnum(FileDescriptorProto* file, const string& name) { + EnumDescriptorProto* result = file->add_enum_type(); + result->set_name(name); + return result; +} + +EnumDescriptorProto* AddNestedEnum(DescriptorProto* parent, + const string& name) { + EnumDescriptorProto* result = parent->add_enum_type(); + result->set_name(name); + return result; +} + +ServiceDescriptorProto* AddService(FileDescriptorProto* file, + const string& name) { + ServiceDescriptorProto* result = file->add_service(); + result->set_name(name); + return result; +} + +FieldDescriptorProto* AddField(DescriptorProto* parent, + const string& name, int number, + FieldDescriptorProto::Label label, + FieldDescriptorProto::Type type) { + FieldDescriptorProto* result = parent->add_field(); + result->set_name(name); + result->set_number(number); + result->set_label(label); + result->set_type(type); + return result; +} + +FieldDescriptorProto* AddExtension(FileDescriptorProto* file, + const string& extendee, + const string& name, int number, + FieldDescriptorProto::Label label, + FieldDescriptorProto::Type type) { + FieldDescriptorProto* result = file->add_extension(); + result->set_name(name); + result->set_number(number); + result->set_label(label); + result->set_type(type); + result->set_extendee(extendee); + return result; +} + +FieldDescriptorProto* AddNestedExtension(DescriptorProto* parent, + const string& extendee, + const string& name, int number, + FieldDescriptorProto::Label label, + FieldDescriptorProto::Type type) { + FieldDescriptorProto* result = parent->add_extension(); + result->set_name(name); + result->set_number(number); + result->set_label(label); + result->set_type(type); + result->set_extendee(extendee); + return result; +} + +DescriptorProto::ExtensionRange* AddExtensionRange(DescriptorProto* parent, + int start, int end) { + DescriptorProto::ExtensionRange* result = parent->add_extension_range(); + result->set_start(start); + result->set_end(end); + return result; +} + +EnumValueDescriptorProto* AddEnumValue(EnumDescriptorProto* enum_proto, + const string& name, int number) { + EnumValueDescriptorProto* result = enum_proto->add_value(); + result->set_name(name); + result->set_number(number); + return result; +} + +MethodDescriptorProto* AddMethod(ServiceDescriptorProto* service, + const string& name, + const string& input_type, + const string& output_type) { + MethodDescriptorProto* result = service->add_method(); + result->set_name(name); + result->set_input_type(input_type); + result->set_output_type(output_type); + return result; +} + +// Empty enums technically aren't allowed. We need to insert a dummy value +// into them. +void AddEmptyEnum(FileDescriptorProto* file, const string& name) { + AddEnumValue(AddEnum(file, name), name + "_DUMMY", 1); +} + +// =================================================================== + +// Test simple files. +class FileDescriptorTest : public testing::Test { + protected: + virtual void SetUp() { + // Build descriptors for the following definitions: + // + // // in "foo.proto" + // message FooMessage { extensions 1; } + // enum FooEnum {FOO_ENUM_VALUE = 1;} + // service FooService {} + // extend FooMessage { optional int32 foo_extension = 1; } + // + // // in "bar.proto" + // package bar_package; + // message BarMessage { extensions 1; } + // enum BarEnum {BAR_ENUM_VALUE = 1;} + // service BarService {} + // extend BarMessage { optional int32 bar_extension = 1; } + // + // Also, we have an empty file "baz.proto". This file's purpose is to + // make sure that even though it has the same package as foo.proto, + // searching it for members of foo.proto won't work. + + FileDescriptorProto foo_file; + foo_file.set_name("foo.proto"); + AddExtensionRange(AddMessage(&foo_file, "FooMessage"), 1, 2); + AddEnumValue(AddEnum(&foo_file, "FooEnum"), "FOO_ENUM_VALUE", 1); + AddService(&foo_file, "FooService"); + AddExtension(&foo_file, "FooMessage", "foo_extension", 1, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + + FileDescriptorProto bar_file; + bar_file.set_name("bar.proto"); + bar_file.set_package("bar_package"); + bar_file.add_dependency("foo.proto"); + AddExtensionRange(AddMessage(&bar_file, "BarMessage"), 1, 2); + AddEnumValue(AddEnum(&bar_file, "BarEnum"), "BAR_ENUM_VALUE", 1); + AddService(&bar_file, "BarService"); + AddExtension(&bar_file, "bar_package.BarMessage", "bar_extension", 1, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + + FileDescriptorProto baz_file; + baz_file.set_name("baz.proto"); + + // Build the descriptors and get the pointers. + foo_file_ = pool_.BuildFile(foo_file); + ASSERT_TRUE(foo_file_ != NULL); + + bar_file_ = pool_.BuildFile(bar_file); + ASSERT_TRUE(bar_file_ != NULL); + + baz_file_ = pool_.BuildFile(baz_file); + ASSERT_TRUE(baz_file_ != NULL); + + ASSERT_EQ(1, foo_file_->message_type_count()); + foo_message_ = foo_file_->message_type(0); + ASSERT_EQ(1, foo_file_->enum_type_count()); + foo_enum_ = foo_file_->enum_type(0); + ASSERT_EQ(1, foo_enum_->value_count()); + foo_enum_value_ = foo_enum_->value(0); + ASSERT_EQ(1, foo_file_->service_count()); + foo_service_ = foo_file_->service(0); + ASSERT_EQ(1, foo_file_->extension_count()); + foo_extension_ = foo_file_->extension(0); + + ASSERT_EQ(1, bar_file_->message_type_count()); + bar_message_ = bar_file_->message_type(0); + ASSERT_EQ(1, bar_file_->enum_type_count()); + bar_enum_ = bar_file_->enum_type(0); + ASSERT_EQ(1, bar_enum_->value_count()); + bar_enum_value_ = bar_enum_->value(0); + ASSERT_EQ(1, bar_file_->service_count()); + bar_service_ = bar_file_->service(0); + ASSERT_EQ(1, bar_file_->extension_count()); + bar_extension_ = bar_file_->extension(0); + } + + DescriptorPool pool_; + + const FileDescriptor* foo_file_; + const FileDescriptor* bar_file_; + const FileDescriptor* baz_file_; + + const Descriptor* foo_message_; + const EnumDescriptor* foo_enum_; + const EnumValueDescriptor* foo_enum_value_; + const ServiceDescriptor* foo_service_; + const FieldDescriptor* foo_extension_; + + const Descriptor* bar_message_; + const EnumDescriptor* bar_enum_; + const EnumValueDescriptor* bar_enum_value_; + const ServiceDescriptor* bar_service_; + const FieldDescriptor* bar_extension_; +}; + +TEST_F(FileDescriptorTest, Name) { + EXPECT_EQ("foo.proto", foo_file_->name()); + EXPECT_EQ("bar.proto", bar_file_->name()); + EXPECT_EQ("baz.proto", baz_file_->name()); +} + +TEST_F(FileDescriptorTest, Package) { + EXPECT_EQ("", foo_file_->package()); + EXPECT_EQ("bar_package", bar_file_->package()); +} + +TEST_F(FileDescriptorTest, Dependencies) { + EXPECT_EQ(0, foo_file_->dependency_count()); + EXPECT_EQ(1, bar_file_->dependency_count()); + EXPECT_EQ(foo_file_, bar_file_->dependency(0)); +} + +TEST_F(FileDescriptorTest, FindMessageTypeByName) { + EXPECT_EQ(foo_message_, foo_file_->FindMessageTypeByName("FooMessage")); + EXPECT_EQ(bar_message_, bar_file_->FindMessageTypeByName("BarMessage")); + + EXPECT_TRUE(foo_file_->FindMessageTypeByName("BarMessage") == NULL); + EXPECT_TRUE(bar_file_->FindMessageTypeByName("FooMessage") == NULL); + EXPECT_TRUE(baz_file_->FindMessageTypeByName("FooMessage") == NULL); + + EXPECT_TRUE(foo_file_->FindMessageTypeByName("NoSuchMessage") == NULL); + EXPECT_TRUE(foo_file_->FindMessageTypeByName("FooEnum") == NULL); +} + +TEST_F(FileDescriptorTest, FindEnumTypeByName) { + EXPECT_EQ(foo_enum_, foo_file_->FindEnumTypeByName("FooEnum")); + EXPECT_EQ(bar_enum_, bar_file_->FindEnumTypeByName("BarEnum")); + + EXPECT_TRUE(foo_file_->FindEnumTypeByName("BarEnum") == NULL); + EXPECT_TRUE(bar_file_->FindEnumTypeByName("FooEnum") == NULL); + EXPECT_TRUE(baz_file_->FindEnumTypeByName("FooEnum") == NULL); + + EXPECT_TRUE(foo_file_->FindEnumTypeByName("NoSuchEnum") == NULL); + EXPECT_TRUE(foo_file_->FindEnumTypeByName("FooMessage") == NULL); +} + +TEST_F(FileDescriptorTest, FindEnumValueByName) { + EXPECT_EQ(foo_enum_value_, foo_file_->FindEnumValueByName("FOO_ENUM_VALUE")); + EXPECT_EQ(bar_enum_value_, bar_file_->FindEnumValueByName("BAR_ENUM_VALUE")); + + EXPECT_TRUE(foo_file_->FindEnumValueByName("BAR_ENUM_VALUE") == NULL); + EXPECT_TRUE(bar_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); + EXPECT_TRUE(baz_file_->FindEnumValueByName("FOO_ENUM_VALUE") == NULL); + + EXPECT_TRUE(foo_file_->FindEnumValueByName("NO_SUCH_VALUE") == NULL); + EXPECT_TRUE(foo_file_->FindEnumValueByName("FooMessage") == NULL); +} + +TEST_F(FileDescriptorTest, FindServiceByName) { + EXPECT_EQ(foo_service_, foo_file_->FindServiceByName("FooService")); + EXPECT_EQ(bar_service_, bar_file_->FindServiceByName("BarService")); + + EXPECT_TRUE(foo_file_->FindServiceByName("BarService") == NULL); + EXPECT_TRUE(bar_file_->FindServiceByName("FooService") == NULL); + EXPECT_TRUE(baz_file_->FindServiceByName("FooService") == NULL); + + EXPECT_TRUE(foo_file_->FindServiceByName("NoSuchService") == NULL); + EXPECT_TRUE(foo_file_->FindServiceByName("FooMessage") == NULL); +} + +TEST_F(FileDescriptorTest, FindExtensionByName) { + EXPECT_EQ(foo_extension_, foo_file_->FindExtensionByName("foo_extension")); + EXPECT_EQ(bar_extension_, bar_file_->FindExtensionByName("bar_extension")); + + EXPECT_TRUE(foo_file_->FindExtensionByName("bar_extension") == NULL); + EXPECT_TRUE(bar_file_->FindExtensionByName("foo_extension") == NULL); + EXPECT_TRUE(baz_file_->FindExtensionByName("foo_extension") == NULL); + + EXPECT_TRUE(foo_file_->FindExtensionByName("no_such_extension") == NULL); + EXPECT_TRUE(foo_file_->FindExtensionByName("FooMessage") == NULL); +} + +TEST_F(FileDescriptorTest, FindExtensionByNumber) { + EXPECT_EQ(foo_extension_, pool_.FindExtensionByNumber(foo_message_, 1)); + EXPECT_EQ(bar_extension_, pool_.FindExtensionByNumber(bar_message_, 1)); + + EXPECT_TRUE(pool_.FindExtensionByNumber(foo_message_, 2) == NULL); +} + +TEST_F(FileDescriptorTest, BuildAgain) { + // Test that if te call BuildFile again on the same input we get the same + // FileDescriptor back. + FileDescriptorProto file; + foo_file_->CopyTo(&file); + EXPECT_EQ(foo_file_, pool_.BuildFile(file)); + + // But if we change the file then it won't work. + file.set_package("some.other.package"); + EXPECT_TRUE(pool_.BuildFile(file) == NULL); +} + +// =================================================================== + +// Test simple flat messages and fields. +class DescriptorTest : public testing::Test { + protected: + virtual void SetUp() { + // Build descriptors for the following definitions: + // + // // in "foo.proto" + // message TestForeign {} + // enum TestEnum {} + // + // message TestMessage { + // required string foo = 1; + // optional TestEnum bar = 6; + // repeated TestForeign baz = 500000000; + // optional group qux = 15 {} + // } + // + // // in "bar.proto" + // package corge.grault; + // message TestMessage2 { + // required string foo = 1; + // required string bar = 2; + // required string quux = 6; + // } + // + // We cheat and use TestForeign as the type for qux rather than create + // an actual nested type. + // + // Since all primitive types (including string) use the same building + // code, there's no need to test each one individually. + // + // TestMessage2 is primarily here to test FindFieldByName and friends. + // All messages created from the same DescriptorPool share the same lookup + // table, so we need to insure that they don't interfere. + + FileDescriptorProto foo_file; + foo_file.set_name("foo.proto"); + AddMessage(&foo_file, "TestForeign"); + AddEmptyEnum(&foo_file, "TestEnum"); + + DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); + AddField(message, "foo", 1, + FieldDescriptorProto::LABEL_REQUIRED, + FieldDescriptorProto::TYPE_STRING); + AddField(message, "bar", 6, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_ENUM) + ->set_type_name("TestEnum"); + AddField(message, "baz", 500000000, + FieldDescriptorProto::LABEL_REPEATED, + FieldDescriptorProto::TYPE_MESSAGE) + ->set_type_name("TestForeign"); + AddField(message, "qux", 15, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_GROUP) + ->set_type_name("TestForeign"); + + FileDescriptorProto bar_file; + bar_file.set_name("bar.proto"); + bar_file.set_package("corge.grault"); + + DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); + AddField(message2, "foo", 1, + FieldDescriptorProto::LABEL_REQUIRED, + FieldDescriptorProto::TYPE_STRING); + AddField(message2, "bar", 2, + FieldDescriptorProto::LABEL_REQUIRED, + FieldDescriptorProto::TYPE_STRING); + AddField(message2, "quux", 6, + FieldDescriptorProto::LABEL_REQUIRED, + FieldDescriptorProto::TYPE_STRING); + + // Build the descriptors and get the pointers. + foo_file_ = pool_.BuildFile(foo_file); + ASSERT_TRUE(foo_file_ != NULL); + + bar_file_ = pool_.BuildFile(bar_file); + ASSERT_TRUE(bar_file_ != NULL); + + ASSERT_EQ(1, foo_file_->enum_type_count()); + enum_ = foo_file_->enum_type(0); + + ASSERT_EQ(2, foo_file_->message_type_count()); + foreign_ = foo_file_->message_type(0); + message_ = foo_file_->message_type(1); + + ASSERT_EQ(4, message_->field_count()); + foo_ = message_->field(0); + bar_ = message_->field(1); + baz_ = message_->field(2); + qux_ = message_->field(3); + + ASSERT_EQ(1, bar_file_->message_type_count()); + message2_ = bar_file_->message_type(0); + + ASSERT_EQ(3, message2_->field_count()); + foo2_ = message2_->field(0); + bar2_ = message2_->field(1); + quux2_ = message2_->field(2); + } + + DescriptorPool pool_; + + const FileDescriptor* foo_file_; + const FileDescriptor* bar_file_; + + const Descriptor* message_; + const Descriptor* message2_; + const Descriptor* foreign_; + const EnumDescriptor* enum_; + + const FieldDescriptor* foo_; + const FieldDescriptor* bar_; + const FieldDescriptor* baz_; + const FieldDescriptor* qux_; + + const FieldDescriptor* foo2_; + const FieldDescriptor* bar2_; + const FieldDescriptor* quux2_; +}; + +TEST_F(DescriptorTest, Name) { + EXPECT_EQ("TestMessage", message_->name()); + EXPECT_EQ("TestMessage", message_->full_name()); + EXPECT_EQ(foo_file_, message_->file()); + + EXPECT_EQ("TestMessage2", message2_->name()); + EXPECT_EQ("corge.grault.TestMessage2", message2_->full_name()); + EXPECT_EQ(bar_file_, message2_->file()); +} + +TEST_F(DescriptorTest, ContainingType) { + EXPECT_TRUE(message_->containing_type() == NULL); + EXPECT_TRUE(message2_->containing_type() == NULL); +} + +TEST_F(DescriptorTest, FieldsByIndex) { + ASSERT_EQ(4, message_->field_count()); + EXPECT_EQ(foo_, message_->field(0)); + EXPECT_EQ(bar_, message_->field(1)); + EXPECT_EQ(baz_, message_->field(2)); + EXPECT_EQ(qux_, message_->field(3)); +} + +TEST_F(DescriptorTest, FindFieldByName) { + // All messages in the same DescriptorPool share a single lookup table for + // fields. So, in addition to testing that FindFieldByName finds the fields + // of the message, we need to test that it does *not* find the fields of + // *other* messages. + + EXPECT_EQ(foo_, message_->FindFieldByName("foo")); + EXPECT_EQ(bar_, message_->FindFieldByName("bar")); + EXPECT_EQ(baz_, message_->FindFieldByName("baz")); + EXPECT_EQ(qux_, message_->FindFieldByName("qux")); + EXPECT_TRUE(message_->FindFieldByName("no_such_field") == NULL); + EXPECT_TRUE(message_->FindFieldByName("quux") == NULL); + + EXPECT_EQ(foo2_ , message2_->FindFieldByName("foo" )); + EXPECT_EQ(bar2_ , message2_->FindFieldByName("bar" )); + EXPECT_EQ(quux2_, message2_->FindFieldByName("quux")); + EXPECT_TRUE(message2_->FindFieldByName("baz") == NULL); + EXPECT_TRUE(message2_->FindFieldByName("qux") == NULL); +} + +TEST_F(DescriptorTest, FindFieldByNumber) { + EXPECT_EQ(foo_, message_->FindFieldByNumber(1)); + EXPECT_EQ(bar_, message_->FindFieldByNumber(6)); + EXPECT_EQ(baz_, message_->FindFieldByNumber(500000000)); + EXPECT_EQ(qux_, message_->FindFieldByNumber(15)); + EXPECT_TRUE(message_->FindFieldByNumber(837592) == NULL); + EXPECT_TRUE(message_->FindFieldByNumber(2) == NULL); + + EXPECT_EQ(foo2_ , message2_->FindFieldByNumber(1)); + EXPECT_EQ(bar2_ , message2_->FindFieldByNumber(2)); + EXPECT_EQ(quux2_, message2_->FindFieldByNumber(6)); + EXPECT_TRUE(message2_->FindFieldByNumber(15) == NULL); + EXPECT_TRUE(message2_->FindFieldByNumber(500000000) == NULL); +} + +TEST_F(DescriptorTest, FieldName) { + EXPECT_EQ("foo", foo_->name()); + EXPECT_EQ("bar", bar_->name()); + EXPECT_EQ("baz", baz_->name()); + EXPECT_EQ("qux", qux_->name()); +} + +TEST_F(DescriptorTest, FieldFullName) { + EXPECT_EQ("TestMessage.foo", foo_->full_name()); + EXPECT_EQ("TestMessage.bar", bar_->full_name()); + EXPECT_EQ("TestMessage.baz", baz_->full_name()); + EXPECT_EQ("TestMessage.qux", qux_->full_name()); + + EXPECT_EQ("corge.grault.TestMessage2.foo", foo2_->full_name()); + EXPECT_EQ("corge.grault.TestMessage2.bar", bar2_->full_name()); + EXPECT_EQ("corge.grault.TestMessage2.quux", quux2_->full_name()); +} + +TEST_F(DescriptorTest, FieldFile) { + EXPECT_EQ(foo_file_, foo_->file()); + EXPECT_EQ(foo_file_, bar_->file()); + EXPECT_EQ(foo_file_, baz_->file()); + EXPECT_EQ(foo_file_, qux_->file()); + + EXPECT_EQ(bar_file_, foo2_->file()); + EXPECT_EQ(bar_file_, bar2_->file()); + EXPECT_EQ(bar_file_, quux2_->file()); +} + +TEST_F(DescriptorTest, FieldIndex) { + EXPECT_EQ(0, foo_->index()); + EXPECT_EQ(1, bar_->index()); + EXPECT_EQ(2, baz_->index()); + EXPECT_EQ(3, qux_->index()); +} + +TEST_F(DescriptorTest, FieldNumber) { + EXPECT_EQ( 1, foo_->number()); + EXPECT_EQ( 6, bar_->number()); + EXPECT_EQ(500000000, baz_->number()); + EXPECT_EQ( 15, qux_->number()); +} + +TEST_F(DescriptorTest, FieldType) { + EXPECT_EQ(FieldDescriptor::TYPE_STRING , foo_->type()); + EXPECT_EQ(FieldDescriptor::TYPE_ENUM , bar_->type()); + EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_->type()); + EXPECT_EQ(FieldDescriptor::TYPE_GROUP , qux_->type()); +} + +TEST_F(DescriptorTest, FieldLabel) { + EXPECT_EQ(FieldDescriptor::LABEL_REQUIRED, foo_->label()); + EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->label()); + EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, baz_->label()); + EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, qux_->label()); + + EXPECT_TRUE (foo_->is_required()); + EXPECT_FALSE(foo_->is_optional()); + EXPECT_FALSE(foo_->is_repeated()); + + EXPECT_FALSE(bar_->is_required()); + EXPECT_TRUE (bar_->is_optional()); + EXPECT_FALSE(bar_->is_repeated()); + + EXPECT_FALSE(baz_->is_required()); + EXPECT_FALSE(baz_->is_optional()); + EXPECT_TRUE (baz_->is_repeated()); +} + +TEST_F(DescriptorTest, FieldHasDefault) { + EXPECT_FALSE(foo_->has_default_value()); + EXPECT_FALSE(bar_->has_default_value()); + EXPECT_FALSE(baz_->has_default_value()); + EXPECT_FALSE(qux_->has_default_value()); +} + +TEST_F(DescriptorTest, FieldContainingType) { + EXPECT_EQ(message_, foo_->containing_type()); + EXPECT_EQ(message_, bar_->containing_type()); + EXPECT_EQ(message_, baz_->containing_type()); + EXPECT_EQ(message_, qux_->containing_type()); + + EXPECT_EQ(message2_, foo2_ ->containing_type()); + EXPECT_EQ(message2_, bar2_ ->containing_type()); + EXPECT_EQ(message2_, quux2_->containing_type()); +} + +TEST_F(DescriptorTest, FieldMessageType) { + EXPECT_TRUE(foo_->message_type() == NULL); + EXPECT_TRUE(bar_->message_type() == NULL); + + EXPECT_EQ(foreign_, baz_->message_type()); + EXPECT_EQ(foreign_, qux_->message_type()); +} + +TEST_F(DescriptorTest, FieldEnumType) { + EXPECT_TRUE(foo_->enum_type() == NULL); + EXPECT_TRUE(baz_->enum_type() == NULL); + EXPECT_TRUE(qux_->enum_type() == NULL); + + EXPECT_EQ(enum_, bar_->enum_type()); +} + +// =================================================================== + +class StylizedFieldNamesTest : public testing::Test { + protected: + void SetUp() { + FileDescriptorProto file; + file.set_name("foo.proto"); + + AddExtensionRange(AddMessage(&file, "ExtendableMessage"), 1, 1000); + + DescriptorProto* message = AddMessage(&file, "TestMessage"); + AddField(message, "foo_foo", 1, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddField(message, "FooBar", 2, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddField(message, "fooBaz", 3, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddField(message, "fooFoo", 4, // Camel-case conflict with foo_foo. + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddField(message, "foobar", 5, // Lower-case conflict with FooBar. + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + + AddNestedExtension(message, "ExtendableMessage", "bar_foo", 1, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddNestedExtension(message, "ExtendableMessage", "BarBar", 2, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddNestedExtension(message, "ExtendableMessage", "BarBaz", 3, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddNestedExtension(message, "ExtendableMessage", "barFoo", 4, // Conflict + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddNestedExtension(message, "ExtendableMessage", "barbar", 5, // Conflict + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + + AddExtension(&file, "ExtendableMessage", "baz_foo", 11, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddExtension(&file, "ExtendableMessage", "BazBar", 12, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddExtension(&file, "ExtendableMessage", "BazBaz", 13, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddExtension(&file, "ExtendableMessage", "bazFoo", 14, // Conflict + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddExtension(&file, "ExtendableMessage", "bazbar", 15, // Conflict + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + + file_ = pool_.BuildFile(file); + ASSERT_TRUE(file_ != NULL); + ASSERT_EQ(2, file_->message_type_count()); + message_ = file_->message_type(1); + ASSERT_EQ("TestMessage", message_->name()); + ASSERT_EQ(5, message_->field_count()); + ASSERT_EQ(5, message_->extension_count()); + ASSERT_EQ(5, file_->extension_count()); + } + + DescriptorPool pool_; + const FileDescriptor* file_; + const Descriptor* message_; +}; + +TEST_F(StylizedFieldNamesTest, LowercaseName) { + EXPECT_EQ("foo_foo", message_->field(0)->lowercase_name()); + EXPECT_EQ("foobar" , message_->field(1)->lowercase_name()); + EXPECT_EQ("foobaz" , message_->field(2)->lowercase_name()); + EXPECT_EQ("foofoo" , message_->field(3)->lowercase_name()); + EXPECT_EQ("foobar" , message_->field(4)->lowercase_name()); + + EXPECT_EQ("bar_foo", message_->extension(0)->lowercase_name()); + EXPECT_EQ("barbar" , message_->extension(1)->lowercase_name()); + EXPECT_EQ("barbaz" , message_->extension(2)->lowercase_name()); + EXPECT_EQ("barfoo" , message_->extension(3)->lowercase_name()); + EXPECT_EQ("barbar" , message_->extension(4)->lowercase_name()); + + EXPECT_EQ("baz_foo", file_->extension(0)->lowercase_name()); + EXPECT_EQ("bazbar" , file_->extension(1)->lowercase_name()); + EXPECT_EQ("bazbaz" , file_->extension(2)->lowercase_name()); + EXPECT_EQ("bazfoo" , file_->extension(3)->lowercase_name()); + EXPECT_EQ("bazbar" , file_->extension(4)->lowercase_name()); +} + +TEST_F(StylizedFieldNamesTest, CamelcaseName) { + EXPECT_EQ("fooFoo", message_->field(0)->camelcase_name()); + EXPECT_EQ("fooBar", message_->field(1)->camelcase_name()); + EXPECT_EQ("fooBaz", message_->field(2)->camelcase_name()); + EXPECT_EQ("fooFoo", message_->field(3)->camelcase_name()); + EXPECT_EQ("foobar", message_->field(4)->camelcase_name()); + + EXPECT_EQ("barFoo", message_->extension(0)->camelcase_name()); + EXPECT_EQ("barBar", message_->extension(1)->camelcase_name()); + EXPECT_EQ("barBaz", message_->extension(2)->camelcase_name()); + EXPECT_EQ("barFoo", message_->extension(3)->camelcase_name()); + EXPECT_EQ("barbar", message_->extension(4)->camelcase_name()); + + EXPECT_EQ("bazFoo", file_->extension(0)->camelcase_name()); + EXPECT_EQ("bazBar", file_->extension(1)->camelcase_name()); + EXPECT_EQ("bazBaz", file_->extension(2)->camelcase_name()); + EXPECT_EQ("bazFoo", file_->extension(3)->camelcase_name()); + EXPECT_EQ("bazbar", file_->extension(4)->camelcase_name()); +} + +TEST_F(StylizedFieldNamesTest, FindByLowercaseName) { + EXPECT_EQ(message_->field(0), + message_->FindFieldByLowercaseName("foo_foo")); + EXPECT_EQ(message_->field(1), + message_->FindFieldByLowercaseName("foobar")); + EXPECT_EQ(message_->field(2), + message_->FindFieldByLowercaseName("foobaz")); + EXPECT_TRUE(message_->FindFieldByLowercaseName("FooBar") == NULL); + EXPECT_TRUE(message_->FindFieldByLowercaseName("fooBaz") == NULL); + EXPECT_TRUE(message_->FindFieldByLowercaseName("bar_foo") == NULL); + EXPECT_TRUE(message_->FindFieldByLowercaseName("nosuchfield") == NULL); + + EXPECT_EQ(message_->extension(0), + message_->FindExtensionByLowercaseName("bar_foo")); + EXPECT_EQ(message_->extension(1), + message_->FindExtensionByLowercaseName("barbar")); + EXPECT_EQ(message_->extension(2), + message_->FindExtensionByLowercaseName("barbaz")); + EXPECT_TRUE(message_->FindExtensionByLowercaseName("BarBar") == NULL); + EXPECT_TRUE(message_->FindExtensionByLowercaseName("barBaz") == NULL); + EXPECT_TRUE(message_->FindExtensionByLowercaseName("foo_foo") == NULL); + EXPECT_TRUE(message_->FindExtensionByLowercaseName("nosuchfield") == NULL); + + EXPECT_EQ(file_->extension(0), + file_->FindExtensionByLowercaseName("baz_foo")); + EXPECT_EQ(file_->extension(1), + file_->FindExtensionByLowercaseName("bazbar")); + EXPECT_EQ(file_->extension(2), + file_->FindExtensionByLowercaseName("bazbaz")); + EXPECT_TRUE(file_->FindExtensionByLowercaseName("BazBar") == NULL); + EXPECT_TRUE(file_->FindExtensionByLowercaseName("bazBaz") == NULL); + EXPECT_TRUE(file_->FindExtensionByLowercaseName("nosuchfield") == NULL); +} + +TEST_F(StylizedFieldNamesTest, FindByCamelcaseName) { + EXPECT_EQ(message_->field(0), + message_->FindFieldByCamelcaseName("fooFoo")); + EXPECT_EQ(message_->field(1), + message_->FindFieldByCamelcaseName("fooBar")); + EXPECT_EQ(message_->field(2), + message_->FindFieldByCamelcaseName("fooBaz")); + EXPECT_TRUE(message_->FindFieldByCamelcaseName("foo_foo") == NULL); + EXPECT_TRUE(message_->FindFieldByCamelcaseName("FooBar") == NULL); + EXPECT_TRUE(message_->FindFieldByCamelcaseName("barFoo") == NULL); + EXPECT_TRUE(message_->FindFieldByCamelcaseName("nosuchfield") == NULL); + + EXPECT_EQ(message_->extension(0), + message_->FindExtensionByCamelcaseName("barFoo")); + EXPECT_EQ(message_->extension(1), + message_->FindExtensionByCamelcaseName("barBar")); + EXPECT_EQ(message_->extension(2), + message_->FindExtensionByCamelcaseName("barBaz")); + EXPECT_TRUE(message_->FindExtensionByCamelcaseName("bar_foo") == NULL); + EXPECT_TRUE(message_->FindExtensionByCamelcaseName("BarBar") == NULL); + EXPECT_TRUE(message_->FindExtensionByCamelcaseName("fooFoo") == NULL); + EXPECT_TRUE(message_->FindExtensionByCamelcaseName("nosuchfield") == NULL); + + EXPECT_EQ(file_->extension(0), + file_->FindExtensionByCamelcaseName("bazFoo")); + EXPECT_EQ(file_->extension(1), + file_->FindExtensionByCamelcaseName("bazBar")); + EXPECT_EQ(file_->extension(2), + file_->FindExtensionByCamelcaseName("bazBaz")); + EXPECT_TRUE(file_->FindExtensionByCamelcaseName("baz_foo") == NULL); + EXPECT_TRUE(file_->FindExtensionByCamelcaseName("BazBar") == NULL); + EXPECT_TRUE(file_->FindExtensionByCamelcaseName("nosuchfield") == NULL); +} + +// =================================================================== + +// Test enum descriptors. +class EnumDescriptorTest : public testing::Test { + protected: + virtual void SetUp() { + // Build descriptors for the following definitions: + // + // // in "foo.proto" + // enum TestEnum { + // FOO = 1; + // BAR = 2; + // } + // + // // in "bar.proto" + // package corge.grault; + // enum TestEnum2 { + // FOO = 1; + // BAZ = 3; + // } + // + // TestEnum2 is primarily here to test FindValueByName and friends. + // All enums created from the same DescriptorPool share the same lookup + // table, so we need to insure that they don't interfere. + + // TestEnum + FileDescriptorProto foo_file; + foo_file.set_name("foo.proto"); + + EnumDescriptorProto* enum_proto = AddEnum(&foo_file, "TestEnum"); + AddEnumValue(enum_proto, "FOO", 1); + AddEnumValue(enum_proto, "BAR", 2); + + // TestEnum2 + FileDescriptorProto bar_file; + bar_file.set_name("bar.proto"); + bar_file.set_package("corge.grault"); + + EnumDescriptorProto* enum2_proto = AddEnum(&bar_file, "TestEnum2"); + AddEnumValue(enum2_proto, "FOO", 1); + AddEnumValue(enum2_proto, "BAZ", 3); + + // Build the descriptors and get the pointers. + foo_file_ = pool_.BuildFile(foo_file); + ASSERT_TRUE(foo_file_ != NULL); + + bar_file_ = pool_.BuildFile(bar_file); + ASSERT_TRUE(bar_file_ != NULL); + + ASSERT_EQ(1, foo_file_->enum_type_count()); + enum_ = foo_file_->enum_type(0); + + ASSERT_EQ(2, enum_->value_count()); + foo_ = enum_->value(0); + bar_ = enum_->value(1); + + ASSERT_EQ(1, bar_file_->enum_type_count()); + enum2_ = bar_file_->enum_type(0); + + ASSERT_EQ(2, enum2_->value_count()); + foo2_ = enum2_->value(0); + baz2_ = enum2_->value(1); + } + + DescriptorPool pool_; + + const FileDescriptor* foo_file_; + const FileDescriptor* bar_file_; + + const EnumDescriptor* enum_; + const EnumDescriptor* enum2_; + + const EnumValueDescriptor* foo_; + const EnumValueDescriptor* bar_; + + const EnumValueDescriptor* foo2_; + const EnumValueDescriptor* baz2_; +}; + +TEST_F(EnumDescriptorTest, Name) { + EXPECT_EQ("TestEnum", enum_->name()); + EXPECT_EQ("TestEnum", enum_->full_name()); + EXPECT_EQ(foo_file_, enum_->file()); + + EXPECT_EQ("TestEnum2", enum2_->name()); + EXPECT_EQ("corge.grault.TestEnum2", enum2_->full_name()); + EXPECT_EQ(bar_file_, enum2_->file()); +} + +TEST_F(EnumDescriptorTest, ContainingType) { + EXPECT_TRUE(enum_->containing_type() == NULL); + EXPECT_TRUE(enum2_->containing_type() == NULL); +} + +TEST_F(EnumDescriptorTest, ValuesByIndex) { + ASSERT_EQ(2, enum_->value_count()); + EXPECT_EQ(foo_, enum_->value(0)); + EXPECT_EQ(bar_, enum_->value(1)); +} + +TEST_F(EnumDescriptorTest, FindValueByName) { + EXPECT_EQ(foo_ , enum_ ->FindValueByName("FOO")); + EXPECT_EQ(bar_ , enum_ ->FindValueByName("BAR")); + EXPECT_EQ(foo2_, enum2_->FindValueByName("FOO")); + EXPECT_EQ(baz2_, enum2_->FindValueByName("BAZ")); + + EXPECT_TRUE(enum_ ->FindValueByName("NO_SUCH_VALUE") == NULL); + EXPECT_TRUE(enum_ ->FindValueByName("BAZ" ) == NULL); + EXPECT_TRUE(enum2_->FindValueByName("BAR" ) == NULL); +} + +TEST_F(EnumDescriptorTest, FindValueByNumber) { + EXPECT_EQ(foo_ , enum_ ->FindValueByNumber(1)); + EXPECT_EQ(bar_ , enum_ ->FindValueByNumber(2)); + EXPECT_EQ(foo2_, enum2_->FindValueByNumber(1)); + EXPECT_EQ(baz2_, enum2_->FindValueByNumber(3)); + + EXPECT_TRUE(enum_ ->FindValueByNumber(416) == NULL); + EXPECT_TRUE(enum_ ->FindValueByNumber(3) == NULL); + EXPECT_TRUE(enum2_->FindValueByNumber(2) == NULL); +} + +TEST_F(EnumDescriptorTest, ValueName) { + EXPECT_EQ("FOO", foo_->name()); + EXPECT_EQ("BAR", bar_->name()); +} + +TEST_F(EnumDescriptorTest, ValueFullName) { + EXPECT_EQ("FOO", foo_->full_name()); + EXPECT_EQ("BAR", bar_->full_name()); + EXPECT_EQ("corge.grault.FOO", foo2_->full_name()); + EXPECT_EQ("corge.grault.BAZ", baz2_->full_name()); +} + +TEST_F(EnumDescriptorTest, ValueIndex) { + EXPECT_EQ(0, foo_->index()); + EXPECT_EQ(1, bar_->index()); +} + +TEST_F(EnumDescriptorTest, ValueNumber) { + EXPECT_EQ(1, foo_->number()); + EXPECT_EQ(2, bar_->number()); +} + +TEST_F(EnumDescriptorTest, ValueType) { + EXPECT_EQ(enum_ , foo_ ->type()); + EXPECT_EQ(enum_ , bar_ ->type()); + EXPECT_EQ(enum2_, foo2_->type()); + EXPECT_EQ(enum2_, baz2_->type()); +} + +// =================================================================== + +// Test service descriptors. +class ServiceDescriptorTest : public testing::Test { + protected: + virtual void SetUp() { + // Build descriptors for the following messages and service: + // // in "foo.proto" + // message FooRequest {} + // message FooResponse {} + // message BarRequest {} + // message BarResponse {} + // message BazRequest {} + // message BazResponse {} + // + // service TestService { + // rpc Foo(FooRequest) returns (FooResponse); + // rpc Bar(BarRequest) returns (BarResponse); + // } + // + // // in "bar.proto" + // package corge.grault + // service TestService2 { + // rpc Foo(FooRequest) returns (FooResponse); + // rpc Baz(BazRequest) returns (BazResponse); + // } + + FileDescriptorProto foo_file; + foo_file.set_name("foo.proto"); + + AddMessage(&foo_file, "FooRequest"); + AddMessage(&foo_file, "FooResponse"); + AddMessage(&foo_file, "BarRequest"); + AddMessage(&foo_file, "BarResponse"); + AddMessage(&foo_file, "BazRequest"); + AddMessage(&foo_file, "BazResponse"); + + ServiceDescriptorProto* service = AddService(&foo_file, "TestService"); + AddMethod(service, "Foo", "FooRequest", "FooResponse"); + AddMethod(service, "Bar", "BarRequest", "BarResponse"); + + FileDescriptorProto bar_file; + bar_file.set_name("bar.proto"); + bar_file.set_package("corge.grault"); + bar_file.add_dependency("foo.proto"); + + ServiceDescriptorProto* service2 = AddService(&bar_file, "TestService2"); + AddMethod(service2, "Foo", "FooRequest", "FooResponse"); + AddMethod(service2, "Baz", "BazRequest", "BazResponse"); + + // Build the descriptors and get the pointers. + foo_file_ = pool_.BuildFile(foo_file); + ASSERT_TRUE(foo_file_ != NULL); + + bar_file_ = pool_.BuildFile(bar_file); + ASSERT_TRUE(bar_file_ != NULL); + + ASSERT_EQ(6, foo_file_->message_type_count()); + foo_request_ = foo_file_->message_type(0); + foo_response_ = foo_file_->message_type(1); + bar_request_ = foo_file_->message_type(2); + bar_response_ = foo_file_->message_type(3); + baz_request_ = foo_file_->message_type(4); + baz_response_ = foo_file_->message_type(5); + + ASSERT_EQ(1, foo_file_->service_count()); + service_ = foo_file_->service(0); + + ASSERT_EQ(2, service_->method_count()); + foo_ = service_->method(0); + bar_ = service_->method(1); + + ASSERT_EQ(1, bar_file_->service_count()); + service2_ = bar_file_->service(0); + + ASSERT_EQ(2, service2_->method_count()); + foo2_ = service2_->method(0); + baz2_ = service2_->method(1); + } + + DescriptorPool pool_; + + const FileDescriptor* foo_file_; + const FileDescriptor* bar_file_; + + const Descriptor* foo_request_; + const Descriptor* foo_response_; + const Descriptor* bar_request_; + const Descriptor* bar_response_; + const Descriptor* baz_request_; + const Descriptor* baz_response_; + + const ServiceDescriptor* service_; + const ServiceDescriptor* service2_; + + const MethodDescriptor* foo_; + const MethodDescriptor* bar_; + + const MethodDescriptor* foo2_; + const MethodDescriptor* baz2_; +}; + +TEST_F(ServiceDescriptorTest, Name) { + EXPECT_EQ("TestService", service_->name()); + EXPECT_EQ("TestService", service_->full_name()); + EXPECT_EQ(foo_file_, service_->file()); + + EXPECT_EQ("TestService2", service2_->name()); + EXPECT_EQ("corge.grault.TestService2", service2_->full_name()); + EXPECT_EQ(bar_file_, service2_->file()); +} + +TEST_F(ServiceDescriptorTest, MethodsByIndex) { + ASSERT_EQ(2, service_->method_count()); + EXPECT_EQ(foo_, service_->method(0)); + EXPECT_EQ(bar_, service_->method(1)); +} + +TEST_F(ServiceDescriptorTest, FindMethodByName) { + EXPECT_EQ(foo_ , service_ ->FindMethodByName("Foo")); + EXPECT_EQ(bar_ , service_ ->FindMethodByName("Bar")); + EXPECT_EQ(foo2_, service2_->FindMethodByName("Foo")); + EXPECT_EQ(baz2_, service2_->FindMethodByName("Baz")); + + EXPECT_TRUE(service_ ->FindMethodByName("NoSuchMethod") == NULL); + EXPECT_TRUE(service_ ->FindMethodByName("Baz" ) == NULL); + EXPECT_TRUE(service2_->FindMethodByName("Bar" ) == NULL); +} + +TEST_F(ServiceDescriptorTest, MethodName) { + EXPECT_EQ("Foo", foo_->name()); + EXPECT_EQ("Bar", bar_->name()); +} + +TEST_F(ServiceDescriptorTest, MethodFullName) { + EXPECT_EQ("TestService.Foo", foo_->full_name()); + EXPECT_EQ("TestService.Bar", bar_->full_name()); + EXPECT_EQ("corge.grault.TestService2.Foo", foo2_->full_name()); + EXPECT_EQ("corge.grault.TestService2.Baz", baz2_->full_name()); +} + +TEST_F(ServiceDescriptorTest, MethodIndex) { + EXPECT_EQ(0, foo_->index()); + EXPECT_EQ(1, bar_->index()); +} + +TEST_F(ServiceDescriptorTest, MethodParent) { + EXPECT_EQ(service_, foo_->service()); + EXPECT_EQ(service_, bar_->service()); +} + +TEST_F(ServiceDescriptorTest, MethodInputType) { + EXPECT_EQ(foo_request_, foo_->input_type()); + EXPECT_EQ(bar_request_, bar_->input_type()); +} + +TEST_F(ServiceDescriptorTest, MethodOutputType) { + EXPECT_EQ(foo_response_, foo_->output_type()); + EXPECT_EQ(bar_response_, bar_->output_type()); +} + +// =================================================================== + +// Test nested types. +class NestedDescriptorTest : public testing::Test { + protected: + virtual void SetUp() { + // Build descriptors for the following definitions: + // + // // in "foo.proto" + // message TestMessage { + // message Foo {} + // message Bar {} + // enum Baz { A = 1; } + // enum Qux { B = 1; } + // } + // + // // in "bar.proto" + // package corge.grault; + // message TestMessage2 { + // message Foo {} + // message Baz {} + // enum Qux { A = 1; } + // enum Quux { C = 1; } + // } + // + // TestMessage2 is primarily here to test FindNestedTypeByName and friends. + // All messages created from the same DescriptorPool share the same lookup + // table, so we need to insure that they don't interfere. + // + // We add enum values to the enums in order to test searching for enum + // values across a message's scope. + + FileDescriptorProto foo_file; + foo_file.set_name("foo.proto"); + + DescriptorProto* message = AddMessage(&foo_file, "TestMessage"); + AddNestedMessage(message, "Foo"); + AddNestedMessage(message, "Bar"); + EnumDescriptorProto* baz = AddNestedEnum(message, "Baz"); + AddEnumValue(baz, "A", 1); + EnumDescriptorProto* qux = AddNestedEnum(message, "Qux"); + AddEnumValue(qux, "B", 1); + + FileDescriptorProto bar_file; + bar_file.set_name("bar.proto"); + bar_file.set_package("corge.grault"); + + DescriptorProto* message2 = AddMessage(&bar_file, "TestMessage2"); + AddNestedMessage(message2, "Foo"); + AddNestedMessage(message2, "Baz"); + EnumDescriptorProto* qux2 = AddNestedEnum(message2, "Qux"); + AddEnumValue(qux2, "A", 1); + EnumDescriptorProto* quux2 = AddNestedEnum(message2, "Quux"); + AddEnumValue(quux2, "C", 1); + + // Build the descriptors and get the pointers. + foo_file_ = pool_.BuildFile(foo_file); + ASSERT_TRUE(foo_file_ != NULL); + + bar_file_ = pool_.BuildFile(bar_file); + ASSERT_TRUE(bar_file_ != NULL); + + ASSERT_EQ(1, foo_file_->message_type_count()); + message_ = foo_file_->message_type(0); + + ASSERT_EQ(2, message_->nested_type_count()); + foo_ = message_->nested_type(0); + bar_ = message_->nested_type(1); + + ASSERT_EQ(2, message_->enum_type_count()); + baz_ = message_->enum_type(0); + qux_ = message_->enum_type(1); + + ASSERT_EQ(1, baz_->value_count()); + a_ = baz_->value(0); + ASSERT_EQ(1, qux_->value_count()); + b_ = qux_->value(0); + + ASSERT_EQ(1, bar_file_->message_type_count()); + message2_ = bar_file_->message_type(0); + + ASSERT_EQ(2, message2_->nested_type_count()); + foo2_ = message2_->nested_type(0); + baz2_ = message2_->nested_type(1); + + ASSERT_EQ(2, message2_->enum_type_count()); + qux2_ = message2_->enum_type(0); + quux2_ = message2_->enum_type(1); + + ASSERT_EQ(1, qux2_->value_count()); + a2_ = qux2_->value(0); + ASSERT_EQ(1, quux2_->value_count()); + c2_ = quux2_->value(0); + } + + DescriptorPool pool_; + + const FileDescriptor* foo_file_; + const FileDescriptor* bar_file_; + + const Descriptor* message_; + const Descriptor* message2_; + + const Descriptor* foo_; + const Descriptor* bar_; + const EnumDescriptor* baz_; + const EnumDescriptor* qux_; + const EnumValueDescriptor* a_; + const EnumValueDescriptor* b_; + + const Descriptor* foo2_; + const Descriptor* baz2_; + const EnumDescriptor* qux2_; + const EnumDescriptor* quux2_; + const EnumValueDescriptor* a2_; + const EnumValueDescriptor* c2_; +}; + +TEST_F(NestedDescriptorTest, MessageName) { + EXPECT_EQ("Foo", foo_ ->name()); + EXPECT_EQ("Bar", bar_ ->name()); + EXPECT_EQ("Foo", foo2_->name()); + EXPECT_EQ("Baz", baz2_->name()); + + EXPECT_EQ("TestMessage.Foo", foo_->full_name()); + EXPECT_EQ("TestMessage.Bar", bar_->full_name()); + EXPECT_EQ("corge.grault.TestMessage2.Foo", foo2_->full_name()); + EXPECT_EQ("corge.grault.TestMessage2.Baz", baz2_->full_name()); +} + +TEST_F(NestedDescriptorTest, MessageContainingType) { + EXPECT_EQ(message_ , foo_ ->containing_type()); + EXPECT_EQ(message_ , bar_ ->containing_type()); + EXPECT_EQ(message2_, foo2_->containing_type()); + EXPECT_EQ(message2_, baz2_->containing_type()); +} + +TEST_F(NestedDescriptorTest, NestedMessagesByIndex) { + ASSERT_EQ(2, message_->nested_type_count()); + EXPECT_EQ(foo_, message_->nested_type(0)); + EXPECT_EQ(bar_, message_->nested_type(1)); +} + +TEST_F(NestedDescriptorTest, FindFieldByNameDoesntFindNestedTypes) { + EXPECT_TRUE(message_->FindFieldByName("Foo") == NULL); + EXPECT_TRUE(message_->FindFieldByName("Qux") == NULL); + EXPECT_TRUE(message_->FindExtensionByName("Foo") == NULL); + EXPECT_TRUE(message_->FindExtensionByName("Qux") == NULL); +} + +TEST_F(NestedDescriptorTest, FindNestedTypeByName) { + EXPECT_EQ(foo_ , message_ ->FindNestedTypeByName("Foo")); + EXPECT_EQ(bar_ , message_ ->FindNestedTypeByName("Bar")); + EXPECT_EQ(foo2_, message2_->FindNestedTypeByName("Foo")); + EXPECT_EQ(baz2_, message2_->FindNestedTypeByName("Baz")); + + EXPECT_TRUE(message_ ->FindNestedTypeByName("NoSuchType") == NULL); + EXPECT_TRUE(message_ ->FindNestedTypeByName("Baz" ) == NULL); + EXPECT_TRUE(message2_->FindNestedTypeByName("Bar" ) == NULL); + + EXPECT_TRUE(message_->FindNestedTypeByName("Qux") == NULL); +} + +TEST_F(NestedDescriptorTest, EnumName) { + EXPECT_EQ("Baz" , baz_ ->name()); + EXPECT_EQ("Qux" , qux_ ->name()); + EXPECT_EQ("Qux" , qux2_->name()); + EXPECT_EQ("Quux", quux2_->name()); + + EXPECT_EQ("TestMessage.Baz", baz_->full_name()); + EXPECT_EQ("TestMessage.Qux", qux_->full_name()); + EXPECT_EQ("corge.grault.TestMessage2.Qux" , qux2_ ->full_name()); + EXPECT_EQ("corge.grault.TestMessage2.Quux", quux2_->full_name()); +} + +TEST_F(NestedDescriptorTest, EnumContainingType) { + EXPECT_EQ(message_ , baz_ ->containing_type()); + EXPECT_EQ(message_ , qux_ ->containing_type()); + EXPECT_EQ(message2_, qux2_ ->containing_type()); + EXPECT_EQ(message2_, quux2_->containing_type()); +} + +TEST_F(NestedDescriptorTest, NestedEnumsByIndex) { + ASSERT_EQ(2, message_->nested_type_count()); + EXPECT_EQ(foo_, message_->nested_type(0)); + EXPECT_EQ(bar_, message_->nested_type(1)); +} + +TEST_F(NestedDescriptorTest, FindEnumTypeByName) { + EXPECT_EQ(baz_ , message_ ->FindEnumTypeByName("Baz" )); + EXPECT_EQ(qux_ , message_ ->FindEnumTypeByName("Qux" )); + EXPECT_EQ(qux2_ , message2_->FindEnumTypeByName("Qux" )); + EXPECT_EQ(quux2_, message2_->FindEnumTypeByName("Quux")); + + EXPECT_TRUE(message_ ->FindEnumTypeByName("NoSuchType") == NULL); + EXPECT_TRUE(message_ ->FindEnumTypeByName("Quux" ) == NULL); + EXPECT_TRUE(message2_->FindEnumTypeByName("Baz" ) == NULL); + + EXPECT_TRUE(message_->FindEnumTypeByName("Foo") == NULL); +} + +TEST_F(NestedDescriptorTest, FindEnumValueByName) { + EXPECT_EQ(a_ , message_ ->FindEnumValueByName("A")); + EXPECT_EQ(b_ , message_ ->FindEnumValueByName("B")); + EXPECT_EQ(a2_, message2_->FindEnumValueByName("A")); + EXPECT_EQ(c2_, message2_->FindEnumValueByName("C")); + + EXPECT_TRUE(message_ ->FindEnumValueByName("NO_SUCH_VALUE") == NULL); + EXPECT_TRUE(message_ ->FindEnumValueByName("C" ) == NULL); + EXPECT_TRUE(message2_->FindEnumValueByName("B" ) == NULL); + + EXPECT_TRUE(message_->FindEnumValueByName("Foo") == NULL); +} + +// =================================================================== + +// Test extensions. +class ExtensionDescriptorTest : public testing::Test { + protected: + virtual void SetUp() { + // Build descriptors for the following definitions: + // + // enum Baz {} + // message Qux {} + // + // message Foo { + // extensions 10 to 19; + // extensions 30 to 39; + // } + // extends Foo with optional int32 foo_int32 = 10; + // extends Foo with repeated TestEnum foo_enum = 19; + // message Bar { + // extends Foo with optional Qux foo_message = 30; + // // (using Qux as the group type) + // extends Foo with repeated group foo_group = 39; + // } + + FileDescriptorProto foo_file; + foo_file.set_name("foo.proto"); + + AddEmptyEnum(&foo_file, "Baz"); + AddMessage(&foo_file, "Qux"); + + DescriptorProto* foo = AddMessage(&foo_file, "Foo"); + AddExtensionRange(foo, 10, 20); + AddExtensionRange(foo, 30, 40); + + AddExtension(&foo_file, "Foo", "foo_int32", 10, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + AddExtension(&foo_file, "Foo", "foo_enum", 19, + FieldDescriptorProto::LABEL_REPEATED, + FieldDescriptorProto::TYPE_ENUM) + ->set_type_name("Baz"); + + DescriptorProto* bar = AddMessage(&foo_file, "Bar"); + AddNestedExtension(bar, "Foo", "foo_message", 30, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_MESSAGE) + ->set_type_name("Qux"); + AddNestedExtension(bar, "Foo", "foo_group", 39, + FieldDescriptorProto::LABEL_REPEATED, + FieldDescriptorProto::TYPE_GROUP) + ->set_type_name("Qux"); + + // Build the descriptors and get the pointers. + foo_file_ = pool_.BuildFile(foo_file); + ASSERT_TRUE(foo_file_ != NULL); + + ASSERT_EQ(1, foo_file_->enum_type_count()); + baz_ = foo_file_->enum_type(0); + + ASSERT_EQ(3, foo_file_->message_type_count()); + qux_ = foo_file_->message_type(0); + foo_ = foo_file_->message_type(1); + bar_ = foo_file_->message_type(2); + } + + DescriptorPool pool_; + + const FileDescriptor* foo_file_; + + const Descriptor* foo_; + const Descriptor* bar_; + const EnumDescriptor* baz_; + const Descriptor* qux_; +}; + +TEST_F(ExtensionDescriptorTest, ExtensionRanges) { + EXPECT_EQ(0, bar_->extension_range_count()); + ASSERT_EQ(2, foo_->extension_range_count()); + + EXPECT_EQ(10, foo_->extension_range(0)->start); + EXPECT_EQ(30, foo_->extension_range(1)->start); + + EXPECT_EQ(20, foo_->extension_range(0)->end); + EXPECT_EQ(40, foo_->extension_range(1)->end); +}; + +TEST_F(ExtensionDescriptorTest, Extensions) { + EXPECT_EQ(0, foo_->extension_count()); + ASSERT_EQ(2, foo_file_->extension_count()); + ASSERT_EQ(2, bar_->extension_count()); + + EXPECT_TRUE(foo_file_->extension(0)->is_extension()); + EXPECT_TRUE(foo_file_->extension(1)->is_extension()); + EXPECT_TRUE(bar_->extension(0)->is_extension()); + EXPECT_TRUE(bar_->extension(1)->is_extension()); + + EXPECT_EQ("foo_int32" , foo_file_->extension(0)->name()); + EXPECT_EQ("foo_enum" , foo_file_->extension(1)->name()); + EXPECT_EQ("foo_message", bar_->extension(0)->name()); + EXPECT_EQ("foo_group" , bar_->extension(1)->name()); + + EXPECT_EQ(10, foo_file_->extension(0)->number()); + EXPECT_EQ(19, foo_file_->extension(1)->number()); + EXPECT_EQ(30, bar_->extension(0)->number()); + EXPECT_EQ(39, bar_->extension(1)->number()); + + EXPECT_EQ(FieldDescriptor::TYPE_INT32 , foo_file_->extension(0)->type()); + EXPECT_EQ(FieldDescriptor::TYPE_ENUM , foo_file_->extension(1)->type()); + EXPECT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_->extension(0)->type()); + EXPECT_EQ(FieldDescriptor::TYPE_GROUP , bar_->extension(1)->type()); + + EXPECT_EQ(baz_, foo_file_->extension(1)->enum_type()); + EXPECT_EQ(qux_, bar_->extension(0)->message_type()); + EXPECT_EQ(qux_, bar_->extension(1)->message_type()); + + EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, foo_file_->extension(0)->label()); + EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, foo_file_->extension(1)->label()); + EXPECT_EQ(FieldDescriptor::LABEL_OPTIONAL, bar_->extension(0)->label()); + EXPECT_EQ(FieldDescriptor::LABEL_REPEATED, bar_->extension(1)->label()); + + EXPECT_EQ(foo_, foo_file_->extension(0)->containing_type()); + EXPECT_EQ(foo_, foo_file_->extension(1)->containing_type()); + EXPECT_EQ(foo_, bar_->extension(0)->containing_type()); + EXPECT_EQ(foo_, bar_->extension(1)->containing_type()); + + EXPECT_TRUE(foo_file_->extension(0)->extension_scope() == NULL); + EXPECT_TRUE(foo_file_->extension(1)->extension_scope() == NULL); + EXPECT_EQ(bar_, bar_->extension(0)->extension_scope()); + EXPECT_EQ(bar_, bar_->extension(1)->extension_scope()); +}; + +TEST_F(ExtensionDescriptorTest, IsExtensionNumber) { + EXPECT_FALSE(foo_->IsExtensionNumber( 9)); + EXPECT_TRUE (foo_->IsExtensionNumber(10)); + EXPECT_TRUE (foo_->IsExtensionNumber(19)); + EXPECT_FALSE(foo_->IsExtensionNumber(20)); + EXPECT_FALSE(foo_->IsExtensionNumber(29)); + EXPECT_TRUE (foo_->IsExtensionNumber(30)); + EXPECT_TRUE (foo_->IsExtensionNumber(39)); + EXPECT_FALSE(foo_->IsExtensionNumber(40)); +} + +TEST_F(ExtensionDescriptorTest, FindExtensionByName) { + // Note that FileDescriptor::FindExtensionByName() is tested by + // FileDescriptorTest. + ASSERT_EQ(2, bar_->extension_count()); + + EXPECT_EQ(bar_->extension(0), bar_->FindExtensionByName("foo_message")); + EXPECT_EQ(bar_->extension(1), bar_->FindExtensionByName("foo_group" )); + + EXPECT_TRUE(bar_->FindExtensionByName("no_such_extension") == NULL); + EXPECT_TRUE(foo_->FindExtensionByName("foo_int32") == NULL); + EXPECT_TRUE(foo_->FindExtensionByName("foo_message") == NULL); +} + +TEST_F(ExtensionDescriptorTest, FindAllExtensions) { + vector extensions; + pool_.FindAllExtensions(foo_, &extensions); + ASSERT_EQ(4, extensions.size()); + EXPECT_EQ(10, extensions[0]->number()); + EXPECT_EQ(19, extensions[1]->number()); + EXPECT_EQ(30, extensions[2]->number()); + EXPECT_EQ(39, extensions[3]->number()); +} + +// =================================================================== + +class MiscTest : public testing::Test { + protected: + // Function which makes a field of the given type just to find out what its + // cpp_type is. + FieldDescriptor::CppType GetCppTypeForFieldType(FieldDescriptor::Type type) { + FileDescriptorProto file_proto; + file_proto.set_name("foo.proto"); + AddEmptyEnum(&file_proto, "DummyEnum"); + + DescriptorProto* message = AddMessage(&file_proto, "TestMessage"); + FieldDescriptorProto* field = + AddField(message, "foo", 1, FieldDescriptorProto::LABEL_OPTIONAL, + static_cast(static_cast(type))); + + if (type == FieldDescriptor::TYPE_MESSAGE || + type == FieldDescriptor::TYPE_GROUP) { + field->set_type_name("TestMessage"); + } else if (type == FieldDescriptor::TYPE_ENUM) { + field->set_type_name("DummyEnum"); + } + + // Build the descriptors and get the pointers. + DescriptorPool pool; + const FileDescriptor* file = pool.BuildFile(file_proto); + + if (file != NULL && + file->message_type_count() == 1 && + file->message_type(0)->field_count() == 1) { + return file->message_type(0)->field(0)->cpp_type(); + } else { + return static_cast(0); + } + } +}; + +TEST_F(MiscTest, CppTypes) { + // Test that CPP types are assigned correctly. + + typedef FieldDescriptor FD; // avoid ugly line wrapping + + EXPECT_EQ(FD::CPPTYPE_DOUBLE , GetCppTypeForFieldType(FD::TYPE_DOUBLE )); + EXPECT_EQ(FD::CPPTYPE_FLOAT , GetCppTypeForFieldType(FD::TYPE_FLOAT )); + EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_INT64 )); + EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_UINT64 )); + EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_INT32 )); + EXPECT_EQ(FD::CPPTYPE_UINT64 , GetCppTypeForFieldType(FD::TYPE_FIXED64 )); + EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_FIXED32 )); + EXPECT_EQ(FD::CPPTYPE_BOOL , GetCppTypeForFieldType(FD::TYPE_BOOL )); + EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_STRING )); + EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_GROUP )); + EXPECT_EQ(FD::CPPTYPE_MESSAGE, GetCppTypeForFieldType(FD::TYPE_MESSAGE )); + EXPECT_EQ(FD::CPPTYPE_STRING , GetCppTypeForFieldType(FD::TYPE_BYTES )); + EXPECT_EQ(FD::CPPTYPE_UINT32 , GetCppTypeForFieldType(FD::TYPE_UINT32 )); + EXPECT_EQ(FD::CPPTYPE_ENUM , GetCppTypeForFieldType(FD::TYPE_ENUM )); + EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SFIXED32)); + EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SFIXED64)); + EXPECT_EQ(FD::CPPTYPE_INT32 , GetCppTypeForFieldType(FD::TYPE_SINT32 )); + EXPECT_EQ(FD::CPPTYPE_INT64 , GetCppTypeForFieldType(FD::TYPE_SINT64 )); +} + +TEST_F(MiscTest, DefaultValues) { + // Test that setting default values works. + FileDescriptorProto file_proto; + file_proto.set_name("foo.proto"); + + EnumDescriptorProto* enum_type_proto = AddEnum(&file_proto, "DummyEnum"); + AddEnumValue(enum_type_proto, "A", 1); + AddEnumValue(enum_type_proto, "B", 2); + + DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); + + typedef FieldDescriptorProto FD; // avoid ugly line wrapping + const FD::Label label = FD::LABEL_OPTIONAL; + + // Create fields of every CPP type with default values. + AddField(message_proto, "int32" , 1, label, FD::TYPE_INT32 ) + ->set_default_value("-1"); + AddField(message_proto, "int64" , 2, label, FD::TYPE_INT64 ) + ->set_default_value("-1000000000000"); + AddField(message_proto, "uint32", 3, label, FD::TYPE_UINT32) + ->set_default_value("42"); + AddField(message_proto, "uint64", 4, label, FD::TYPE_UINT64) + ->set_default_value("2000000000000"); + AddField(message_proto, "float" , 5, label, FD::TYPE_FLOAT ) + ->set_default_value("4.5"); + AddField(message_proto, "double", 6, label, FD::TYPE_DOUBLE) + ->set_default_value("10e100"); + AddField(message_proto, "bool" , 7, label, FD::TYPE_BOOL ) + ->set_default_value("true"); + AddField(message_proto, "string", 8, label, FD::TYPE_STRING) + ->set_default_value("hello"); + AddField(message_proto, "data" , 9, label, FD::TYPE_BYTES ) + ->set_default_value("\\001\\002\\003"); + + FieldDescriptorProto* enum_field = + AddField(message_proto, "enum", 10, label, FD::TYPE_ENUM); + enum_field->set_type_name("DummyEnum"); + enum_field->set_default_value("B"); + + // Strings are allowed to have empty defaults. (At one point, due to + // a bug, empty defaults for strings were rejected. Oops.) + AddField(message_proto, "empty_string", 11, label, FD::TYPE_STRING) + ->set_default_value(""); + + // Add a second set of fields with implicit defalut values. + AddField(message_proto, "implicit_int32" , 21, label, FD::TYPE_INT32 ); + AddField(message_proto, "implicit_int64" , 22, label, FD::TYPE_INT64 ); + AddField(message_proto, "implicit_uint32", 23, label, FD::TYPE_UINT32); + AddField(message_proto, "implicit_uint64", 24, label, FD::TYPE_UINT64); + AddField(message_proto, "implicit_float" , 25, label, FD::TYPE_FLOAT ); + AddField(message_proto, "implicit_double", 26, label, FD::TYPE_DOUBLE); + AddField(message_proto, "implicit_bool" , 27, label, FD::TYPE_BOOL ); + AddField(message_proto, "implicit_string", 28, label, FD::TYPE_STRING); + AddField(message_proto, "implicit_data" , 29, label, FD::TYPE_BYTES ); + AddField(message_proto, "implicit_enum" , 30, label, FD::TYPE_ENUM) + ->set_type_name("DummyEnum"); + + // Build it. + DescriptorPool pool; + const FileDescriptor* file = pool.BuildFile(file_proto); + ASSERT_TRUE(file != NULL); + + ASSERT_EQ(1, file->enum_type_count()); + const EnumDescriptor* enum_type = file->enum_type(0); + ASSERT_EQ(2, enum_type->value_count()); + const EnumValueDescriptor* enum_value_a = enum_type->value(0); + const EnumValueDescriptor* enum_value_b = enum_type->value(1); + + ASSERT_EQ(1, file->message_type_count()); + const Descriptor* message = file->message_type(0); + + ASSERT_EQ(21, message->field_count()); + + // Check the default values. + ASSERT_TRUE(message->field(0)->has_default_value()); + ASSERT_TRUE(message->field(1)->has_default_value()); + ASSERT_TRUE(message->field(2)->has_default_value()); + ASSERT_TRUE(message->field(3)->has_default_value()); + ASSERT_TRUE(message->field(4)->has_default_value()); + ASSERT_TRUE(message->field(5)->has_default_value()); + ASSERT_TRUE(message->field(6)->has_default_value()); + ASSERT_TRUE(message->field(7)->has_default_value()); + ASSERT_TRUE(message->field(8)->has_default_value()); + ASSERT_TRUE(message->field(9)->has_default_value()); + ASSERT_TRUE(message->field(10)->has_default_value()); + + EXPECT_EQ(-1 , message->field(0)->default_value_int32 ()); + EXPECT_EQ(-GOOGLE_ULONGLONG(1000000000000), + message->field(1)->default_value_int64 ()); + EXPECT_EQ(42 , message->field(2)->default_value_uint32()); + EXPECT_EQ(GOOGLE_ULONGLONG(2000000000000), + message->field(3)->default_value_uint64()); + EXPECT_EQ(4.5 , message->field(4)->default_value_float ()); + EXPECT_EQ(10e100 , message->field(5)->default_value_double()); + EXPECT_EQ(true , message->field(6)->default_value_bool ()); + EXPECT_EQ("hello" , message->field(7)->default_value_string()); + EXPECT_EQ("\001\002\003" , message->field(8)->default_value_string()); + EXPECT_EQ(enum_value_b , message->field(9)->default_value_enum ()); + EXPECT_EQ("" , message->field(10)->default_value_string()); + + ASSERT_FALSE(message->field(11)->has_default_value()); + ASSERT_FALSE(message->field(12)->has_default_value()); + ASSERT_FALSE(message->field(13)->has_default_value()); + ASSERT_FALSE(message->field(14)->has_default_value()); + ASSERT_FALSE(message->field(15)->has_default_value()); + ASSERT_FALSE(message->field(16)->has_default_value()); + ASSERT_FALSE(message->field(17)->has_default_value()); + ASSERT_FALSE(message->field(18)->has_default_value()); + ASSERT_FALSE(message->field(19)->has_default_value()); + ASSERT_FALSE(message->field(20)->has_default_value()); + + EXPECT_EQ(0 , message->field(11)->default_value_int32 ()); + EXPECT_EQ(0 , message->field(12)->default_value_int64 ()); + EXPECT_EQ(0 , message->field(13)->default_value_uint32()); + EXPECT_EQ(0 , message->field(14)->default_value_uint64()); + EXPECT_EQ(0.0f , message->field(15)->default_value_float ()); + EXPECT_EQ(0.0 , message->field(16)->default_value_double()); + EXPECT_EQ(false, message->field(17)->default_value_bool ()); + EXPECT_EQ("" , message->field(18)->default_value_string()); + EXPECT_EQ("" , message->field(19)->default_value_string()); + EXPECT_EQ(enum_value_a, message->field(20)->default_value_enum()); +} + +TEST_F(MiscTest, FieldOptions) { + // Try setting field options. + + FileDescriptorProto file_proto; + file_proto.set_name("foo.proto"); + + DescriptorProto* message_proto = AddMessage(&file_proto, "TestMessage"); + AddField(message_proto, "foo", 1, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + FieldDescriptorProto* bar_proto = + AddField(message_proto, "bar", 2, + FieldDescriptorProto::LABEL_OPTIONAL, + FieldDescriptorProto::TYPE_INT32); + + FieldOptions* options = bar_proto->mutable_options(); + options->set_ctype(FieldOptions::CORD); + + // Build the descriptors and get the pointers. + DescriptorPool pool; + const FileDescriptor* file = pool.BuildFile(file_proto); + ASSERT_TRUE(file != NULL); + + ASSERT_EQ(1, file->message_type_count()); + const Descriptor* message = file->message_type(0); + + ASSERT_EQ(2, message->field_count()); + const FieldDescriptor* foo = message->field(0); + const FieldDescriptor* bar = message->field(1); + + // "foo" had no options set, so it should return the default options. + EXPECT_EQ(&FieldOptions::default_instance(), &foo->options()); + + // "bar" had options set. + EXPECT_NE(&FieldOptions::default_instance(), options); + EXPECT_TRUE(bar->options().has_ctype()); + EXPECT_EQ(FieldOptions::CORD, bar->options().ctype()); +} + +// =================================================================== + +class AllowUnknownDependenciesTest : public testing::Test { + protected: + virtual void SetUp() { + FileDescriptorProto foo_proto, bar_proto; + + pool_.AllowUnknownDependencies(); + + ASSERT_TRUE(TextFormat::ParseFromString( + "name: 'foo.proto'" + "dependency: 'bar.proto'" + "dependency: 'baz.proto'" + "message_type {" + " name: 'Foo'" + " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'Bar' }" + " field { name:'baz' number:2 label:LABEL_OPTIONAL type_name:'Baz' }" + " field { name:'qux' number:3 label:LABEL_OPTIONAL" + " type_name: '.corge.Qux'" + " type: TYPE_ENUM" + " options {" + " uninterpreted_option {" + " name {" + " name_part: 'grault'" + " is_extension: true" + " }" + " positive_int_value: 1234" + " }" + " }" + " }" + "}", + &foo_proto)); + ASSERT_TRUE(TextFormat::ParseFromString( + "name: 'bar.proto'" + "message_type { name: 'Bar' }", + &bar_proto)); + + // Collect pointers to stuff. + bar_file_ = pool_.BuildFile(bar_proto); + ASSERT_TRUE(bar_file_ != NULL); + + ASSERT_EQ(1, bar_file_->message_type_count()); + bar_type_ = bar_file_->message_type(0); + + foo_file_ = pool_.BuildFile(foo_proto); + ASSERT_TRUE(foo_file_ != NULL); + + ASSERT_EQ(1, foo_file_->message_type_count()); + foo_type_ = foo_file_->message_type(0); + + ASSERT_EQ(3, foo_type_->field_count()); + bar_field_ = foo_type_->field(0); + baz_field_ = foo_type_->field(1); + qux_field_ = foo_type_->field(2); + } + + const FileDescriptor* bar_file_; + const Descriptor* bar_type_; + const FileDescriptor* foo_file_; + const Descriptor* foo_type_; + const FieldDescriptor* bar_field_; + const FieldDescriptor* baz_field_; + const FieldDescriptor* qux_field_; + + DescriptorPool pool_; +}; + +TEST_F(AllowUnknownDependenciesTest, PlaceholderFile) { + ASSERT_EQ(2, foo_file_->dependency_count()); + EXPECT_EQ(bar_file_, foo_file_->dependency(0)); + + const FileDescriptor* baz_file = foo_file_->dependency(1); + EXPECT_EQ("baz.proto", baz_file->name()); + EXPECT_EQ(0, baz_file->message_type_count()); + + // Placeholder files should not be findable. + EXPECT_EQ(bar_file_, pool_.FindFileByName(bar_file_->name())); + EXPECT_TRUE(pool_.FindFileByName(baz_file->name()) == NULL); +} + +TEST_F(AllowUnknownDependenciesTest, PlaceholderTypes) { + ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, bar_field_->type()); + EXPECT_EQ(bar_type_, bar_field_->message_type()); + + ASSERT_EQ(FieldDescriptor::TYPE_MESSAGE, baz_field_->type()); + const Descriptor* baz_type = baz_field_->message_type(); + EXPECT_EQ("Baz", baz_type->name()); + EXPECT_EQ("Baz", baz_type->full_name()); + EXPECT_EQ("Baz.placeholder.proto", baz_type->file()->name()); + EXPECT_EQ(0, baz_type->extension_range_count()); + + ASSERT_EQ(FieldDescriptor::TYPE_ENUM, qux_field_->type()); + const EnumDescriptor* qux_type = qux_field_->enum_type(); + EXPECT_EQ("Qux", qux_type->name()); + EXPECT_EQ("corge.Qux", qux_type->full_name()); + EXPECT_EQ("corge.Qux.placeholder.proto", qux_type->file()->name()); + + // Placeholder types should not be findable. + EXPECT_EQ(bar_type_, pool_.FindMessageTypeByName(bar_type_->full_name())); + EXPECT_TRUE(pool_.FindMessageTypeByName(baz_type->full_name()) == NULL); + EXPECT_TRUE(pool_.FindEnumTypeByName(qux_type->full_name()) == NULL); +} + +TEST_F(AllowUnknownDependenciesTest, CopyTo) { + // FieldDescriptor::CopyTo() should write non-fully-qualified type names + // for placeholder types which were not originally fully-qualified. + FieldDescriptorProto proto; + + // Bar is not a placeholder, so it is fully-qualified. + bar_field_->CopyTo(&proto); + EXPECT_EQ(".Bar", proto.type_name()); + EXPECT_EQ(FieldDescriptorProto::TYPE_MESSAGE, proto.type()); + + // Baz is an unqualified placeholder. + proto.Clear(); + baz_field_->CopyTo(&proto); + EXPECT_EQ("Baz", proto.type_name()); + EXPECT_FALSE(proto.has_type()); + + // Qux is a fully-qualified placeholder. + proto.Clear(); + qux_field_->CopyTo(&proto); + EXPECT_EQ(".corge.Qux", proto.type_name()); + EXPECT_EQ(FieldDescriptorProto::TYPE_ENUM, proto.type()); +} + +TEST_F(AllowUnknownDependenciesTest, CustomOptions) { + // Qux should still have the uninterpreted option attached. + ASSERT_EQ(1, qux_field_->options().uninterpreted_option_size()); + const UninterpretedOption& option = + qux_field_->options().uninterpreted_option(0); + ASSERT_EQ(1, option.name_size()); + EXPECT_EQ("grault", option.name(0).name_part()); +} + +TEST_F(AllowUnknownDependenciesTest, UnknownExtendee) { + // Test that we can extend an unknown type. This is slightly tricky because + // it means that the placeholder type must have an extension range. + + FileDescriptorProto extension_proto; + + ASSERT_TRUE(TextFormat::ParseFromString( + "name: 'extension.proto'" + "extension { extendee: 'UnknownType' name:'some_extension' number:123" + " label:LABEL_OPTIONAL type:TYPE_INT32 }", + &extension_proto)); + const FileDescriptor* file = pool_.BuildFile(extension_proto); + + ASSERT_TRUE(file != NULL); + + ASSERT_EQ(1, file->extension_count()); + const Descriptor* extendee = file->extension(0)->containing_type(); + EXPECT_EQ("UnknownType", extendee->name()); + ASSERT_EQ(1, extendee->extension_range_count()); + EXPECT_EQ(1, extendee->extension_range(0)->start); + EXPECT_EQ(FieldDescriptor::kMaxNumber + 1, extendee->extension_range(0)->end); +} + +TEST_F(AllowUnknownDependenciesTest, CustomOption) { + // Test that we can use a custom option without having parsed + // descriptor.proto. + + FileDescriptorProto option_proto; + + ASSERT_TRUE(TextFormat::ParseFromString( + "name: \"unknown_custom_options.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { " + " extendee: \"google.protobuf.FileOptions\" " + " name: \"some_option\" " + " number: 123456 " + " label: LABEL_OPTIONAL " + " type: TYPE_INT32 " + "} " + "options { " + " uninterpreted_option { " + " name { " + " name_part: \"some_option\" " + " is_extension: true " + " } " + " positive_int_value: 1234 " + " } " + " uninterpreted_option { " + " name { " + " name_part: \"unknown_option\" " + " is_extension: true " + " } " + " positive_int_value: 1234 " + " } " + " uninterpreted_option { " + " name { " + " name_part: \"optimize_for\" " + " is_extension: false " + " } " + " identifier_value: \"SPEED\" " + " } " + "}", + &option_proto)); + + const FileDescriptor* file = pool_.BuildFile(option_proto); + ASSERT_TRUE(file != NULL); + + // Verify that no extension options were set, but they were left as + // uninterpreted_options. + vector fields; + file->options().GetReflection()->ListFields(file->options(), &fields); + ASSERT_EQ(2, fields.size()); + EXPECT_TRUE(file->options().has_optimize_for()); + EXPECT_EQ(2, file->options().uninterpreted_option_size()); +} + +// =================================================================== + +TEST(CustomOptions, OptionLocations) { + const Descriptor* message = + protobuf_unittest::TestMessageWithCustomOptions::descriptor(); + const FileDescriptor* file = message->file(); + const FieldDescriptor* field = message->FindFieldByName("field1"); + const EnumDescriptor* enm = message->FindEnumTypeByName("AnEnum"); + // TODO(benjy): Support EnumValue options, once the compiler does. + const ServiceDescriptor* service = + file->FindServiceByName("TestServiceWithCustomOptions"); + const MethodDescriptor* method = service->FindMethodByName("Foo"); + + EXPECT_EQ(GOOGLE_LONGLONG(9876543210), + file->options().GetExtension(protobuf_unittest::file_opt1)); + EXPECT_EQ(-56, + message->options().GetExtension(protobuf_unittest::message_opt1)); + EXPECT_EQ(GOOGLE_LONGLONG(8765432109), + field->options().GetExtension(protobuf_unittest::field_opt1)); + EXPECT_EQ(42, // Check that we get the default for an option we don't set. + field->options().GetExtension(protobuf_unittest::field_opt2)); + EXPECT_EQ(-789, + enm->options().GetExtension(protobuf_unittest::enum_opt1)); + EXPECT_EQ(123, + enm->value(1)->options().GetExtension( + protobuf_unittest::enum_value_opt1)); + EXPECT_EQ(GOOGLE_LONGLONG(-9876543210), + service->options().GetExtension(protobuf_unittest::service_opt1)); + EXPECT_EQ(protobuf_unittest::METHODOPT1_VAL2, + method->options().GetExtension(protobuf_unittest::method_opt1)); + + // See that the regular options went through unscathed. + EXPECT_TRUE(message->options().has_message_set_wire_format()); + EXPECT_EQ(FieldOptions::CORD, field->options().ctype()); +} + +TEST(CustomOptions, OptionTypes) { + const MessageOptions* options = NULL; + + options = + &protobuf_unittest::CustomOptionMinIntegerValues::descriptor()->options(); + EXPECT_EQ(false , options->GetExtension(protobuf_unittest::bool_opt)); + EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::int32_opt)); + EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::int64_opt)); + EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint32_opt)); + EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::uint64_opt)); + EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sint32_opt)); + EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sint64_opt)); + EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed32_opt)); + EXPECT_EQ(0 , options->GetExtension(protobuf_unittest::fixed64_opt)); + EXPECT_EQ(kint32min, options->GetExtension(protobuf_unittest::sfixed32_opt)); + EXPECT_EQ(kint64min, options->GetExtension(protobuf_unittest::sfixed64_opt)); + + options = + &protobuf_unittest::CustomOptionMaxIntegerValues::descriptor()->options(); + EXPECT_EQ(true , options->GetExtension(protobuf_unittest::bool_opt)); + EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::int32_opt)); + EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::int64_opt)); + EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::uint32_opt)); + EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::uint64_opt)); + EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sint32_opt)); + EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sint64_opt)); + EXPECT_EQ(kuint32max, options->GetExtension(protobuf_unittest::fixed32_opt)); + EXPECT_EQ(kuint64max, options->GetExtension(protobuf_unittest::fixed64_opt)); + EXPECT_EQ(kint32max , options->GetExtension(protobuf_unittest::sfixed32_opt)); + EXPECT_EQ(kint64max , options->GetExtension(protobuf_unittest::sfixed64_opt)); + + options = + &protobuf_unittest::CustomOptionOtherValues::descriptor()->options(); + EXPECT_EQ(-100, options->GetExtension(protobuf_unittest::int32_opt)); + EXPECT_FLOAT_EQ(12.3456789, + options->GetExtension(protobuf_unittest::float_opt)); + EXPECT_DOUBLE_EQ(1.234567890123456789, + options->GetExtension(protobuf_unittest::double_opt)); + EXPECT_EQ("Hello, \"World\"", + options->GetExtension(protobuf_unittest::string_opt)); + + EXPECT_EQ(string("Hello\0World", 11), + options->GetExtension(protobuf_unittest::bytes_opt)); + + EXPECT_EQ(protobuf_unittest::DummyMessageContainingEnum::TEST_OPTION_ENUM_TYPE2, + options->GetExtension(protobuf_unittest::enum_opt)); + + options = + &protobuf_unittest::SettingRealsFromPositiveInts::descriptor()->options(); + EXPECT_FLOAT_EQ(12, options->GetExtension(protobuf_unittest::float_opt)); + EXPECT_DOUBLE_EQ(154, options->GetExtension(protobuf_unittest::double_opt)); + + options = + &protobuf_unittest::SettingRealsFromNegativeInts::descriptor()->options(); + EXPECT_FLOAT_EQ(-12, options->GetExtension(protobuf_unittest::float_opt)); + EXPECT_DOUBLE_EQ(-154, options->GetExtension(protobuf_unittest::double_opt)); +} + +TEST(CustomOptions, ComplexExtensionOptions) { + const MessageOptions* options = + &protobuf_unittest::VariousComplexOptions::descriptor()->options(); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1).foo(), 42); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). + GetExtension(protobuf_unittest::quux), 324); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt1). + GetExtension(protobuf_unittest::corge).qux(), 876); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).baz(), 987); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). + GetExtension(protobuf_unittest::grault), 654); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar().foo(), + 743); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). + GetExtension(protobuf_unittest::quux), 1999); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2).bar(). + GetExtension(protobuf_unittest::corge).qux(), 2008); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). + GetExtension(protobuf_unittest::garply).foo(), 741); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). + GetExtension(protobuf_unittest::garply). + GetExtension(protobuf_unittest::quux), 1998); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). + GetExtension(protobuf_unittest::garply). + GetExtension(protobuf_unittest::corge).qux(), 2121); + EXPECT_EQ(options->GetExtension( + protobuf_unittest::ComplexOptionType2::ComplexOptionType4::complex_opt4). + waldo(), 1971); + EXPECT_EQ(options->GetExtension(protobuf_unittest::complex_opt2). + fred().waldo(), 321); + EXPECT_EQ(9, options->GetExtension(protobuf_unittest::complex_opt3).qux()); + EXPECT_EQ(22, options->GetExtension(protobuf_unittest::complex_opt3). + complexoptiontype5().plugh()); + EXPECT_EQ(24, options->GetExtension(protobuf_unittest::complexopt6).xyzzy()); +} + +TEST(CustomOptions, OptionsFromOtherFile) { + // Test that to use a custom option, we only need to import the file + // defining the option; we do not also have to import descriptor.proto. + DescriptorPool pool; + + FileDescriptorProto file_proto; + FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); + ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); + + protobuf_unittest::TestMessageWithCustomOptions::descriptor() + ->file()->CopyTo(&file_proto); + ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); + + ASSERT_TRUE(TextFormat::ParseFromString( + "name: \"custom_options_import.proto\" " + "package: \"protobuf_unittest\" " + "dependency: \"google/protobuf/unittest_custom_options.proto\" " + "options { " + " uninterpreted_option { " + " name { " + " name_part: \"file_opt1\" " + " is_extension: true " + " } " + " positive_int_value: 1234 " + " } " + // Test a non-extension option too. (At one point this failed due to a + // bug.) + " uninterpreted_option { " + " name { " + " name_part: \"java_package\" " + " is_extension: false " + " } " + " string_value: \"foo\" " + " } " + // Test that enum-typed options still work too. (At one point this also + // failed due to a bug.) + " uninterpreted_option { " + " name { " + " name_part: \"optimize_for\" " + " is_extension: false " + " } " + " identifier_value: \"SPEED\" " + " } " + "}" + , + &file_proto)); + + const FileDescriptor* file = pool.BuildFile(file_proto); + ASSERT_TRUE(file != NULL); + EXPECT_EQ(1234, file->options().GetExtension(protobuf_unittest::file_opt1)); + EXPECT_TRUE(file->options().has_java_package()); + EXPECT_EQ("foo", file->options().java_package()); + EXPECT_TRUE(file->options().has_optimize_for()); + EXPECT_EQ(FileOptions::SPEED, file->options().optimize_for()); +} + +TEST(CustomOptions, MessageOptionThreeFieldsSet) { + // This tests a bug which previously existed in custom options parsing. The + // bug occurred when you defined a custom option with message type and then + // set three fields of that option on a single definition (see the example + // below). The bug is a bit hard to explain, so check the change history if + // you want to know more. + DescriptorPool pool; + + FileDescriptorProto file_proto; + FileDescriptorProto::descriptor()->file()->CopyTo(&file_proto); + ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); + + protobuf_unittest::TestMessageWithCustomOptions::descriptor() + ->file()->CopyTo(&file_proto); + ASSERT_TRUE(pool.BuildFile(file_proto) != NULL); + + // The following represents the definition: + // + // import "google/protobuf/unittest_custom_options.proto" + // package protobuf_unittest; + // message Foo { + // option (complex_opt1).foo = 1234; + // option (complex_opt1).foo2 = 1234; + // option (complex_opt1).foo3 = 1234; + // } + ASSERT_TRUE(TextFormat::ParseFromString( + "name: \"custom_options_import.proto\" " + "package: \"protobuf_unittest\" " + "dependency: \"google/protobuf/unittest_custom_options.proto\" " + "message_type { " + " name: \"Foo\" " + " options { " + " uninterpreted_option { " + " name { " + " name_part: \"complex_opt1\" " + " is_extension: true " + " } " + " name { " + " name_part: \"foo\" " + " is_extension: false " + " } " + " positive_int_value: 1234 " + " } " + " uninterpreted_option { " + " name { " + " name_part: \"complex_opt1\" " + " is_extension: true " + " } " + " name { " + " name_part: \"foo2\" " + " is_extension: false " + " } " + " positive_int_value: 1234 " + " } " + " uninterpreted_option { " + " name { " + " name_part: \"complex_opt1\" " + " is_extension: true " + " } " + " name { " + " name_part: \"foo3\" " + " is_extension: false " + " } " + " positive_int_value: 1234 " + " } " + " } " + "}", + &file_proto)); + + const FileDescriptor* file = pool.BuildFile(file_proto); + ASSERT_TRUE(file != NULL); + ASSERT_EQ(1, file->message_type_count()); + + const MessageOptions& options = file->message_type(0)->options(); + EXPECT_EQ(1234, options.GetExtension(protobuf_unittest::complex_opt1).foo()); +} + +// Check that aggregate options were parsed and saved correctly in +// the appropriate descriptors. +TEST(CustomOptions, AggregateOptions) { + const Descriptor* msg = protobuf_unittest::AggregateMessage::descriptor(); + const FileDescriptor* file = msg->file(); + const FieldDescriptor* field = msg->FindFieldByName("fieldname"); + const EnumDescriptor* enumd = file->FindEnumTypeByName("AggregateEnum"); + const EnumValueDescriptor* enumv = enumd->FindValueByName("VALUE"); + const ServiceDescriptor* service = file->FindServiceByName( + "AggregateService"); + const MethodDescriptor* method = service->FindMethodByName("Method"); + + // Tests for the different types of data embedded in fileopt + const protobuf_unittest::Aggregate& file_options = + file->options().GetExtension(protobuf_unittest::fileopt); + EXPECT_EQ(100, file_options.i()); + EXPECT_EQ("FileAnnotation", file_options.s()); + EXPECT_EQ("NestedFileAnnotation", file_options.sub().s()); + EXPECT_EQ("FileExtensionAnnotation", + file_options.file().GetExtension(protobuf_unittest::fileopt).s()); + EXPECT_EQ("EmbeddedMessageSetElement", + file_options.mset().GetExtension( + protobuf_unittest::AggregateMessageSetElement + ::message_set_extension).s()); + + // Simple tests for all the other types of annotations + EXPECT_EQ("MessageAnnotation", + msg->options().GetExtension(protobuf_unittest::msgopt).s()); + EXPECT_EQ("FieldAnnotation", + field->options().GetExtension(protobuf_unittest::fieldopt).s()); + EXPECT_EQ("EnumAnnotation", + enumd->options().GetExtension(protobuf_unittest::enumopt).s()); + EXPECT_EQ("EnumValueAnnotation", + enumv->options().GetExtension(protobuf_unittest::enumvalopt).s()); + EXPECT_EQ("ServiceAnnotation", + service->options().GetExtension(protobuf_unittest::serviceopt).s()); + EXPECT_EQ("MethodAnnotation", + method->options().GetExtension(protobuf_unittest::methodopt).s()); +} + +// =================================================================== + +// The tests below trigger every unique call to AddError() in descriptor.cc, +// in the order in which they appear in that file. I'm using TextFormat here +// to specify the input descriptors because building them using code would +// be too bulky. + +class MockErrorCollector : public DescriptorPool::ErrorCollector { + public: + MockErrorCollector() {} + ~MockErrorCollector() {} + + string text_; + + // implements ErrorCollector --------------------------------------- + void AddError(const string& filename, + const string& element_name, const Message* descriptor, + ErrorLocation location, const string& message) { + const char* location_name = NULL; + switch (location) { + case NAME : location_name = "NAME" ; break; + case NUMBER : location_name = "NUMBER" ; break; + case TYPE : location_name = "TYPE" ; break; + case EXTENDEE : location_name = "EXTENDEE" ; break; + case DEFAULT_VALUE: location_name = "DEFAULT_VALUE"; break; + case OPTION_NAME : location_name = "OPTION_NAME" ; break; + case OPTION_VALUE : location_name = "OPTION_VALUE" ; break; + case INPUT_TYPE : location_name = "INPUT_TYPE" ; break; + case OUTPUT_TYPE : location_name = "OUTPUT_TYPE" ; break; + case OTHER : location_name = "OTHER" ; break; + } + + strings::SubstituteAndAppend( + &text_, "$0: $1: $2: $3\n", + filename, element_name, location_name, message); + } +}; + +class ValidationErrorTest : public testing::Test { + protected: + // Parse file_text as a FileDescriptorProto in text format and add it + // to the DescriptorPool. Expect no errors. + void BuildFile(const string& file_text) { + FileDescriptorProto file_proto; + ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); + ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL); + } + + // Parse file_text as a FileDescriptorProto in text format and add it + // to the DescriptorPool. Expect errors to be produced which match the + // given error text. + void BuildFileWithErrors(const string& file_text, + const string& expected_errors) { + FileDescriptorProto file_proto; + ASSERT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); + + MockErrorCollector error_collector; + EXPECT_TRUE( + pool_.BuildFileCollectingErrors(file_proto, &error_collector) == NULL); + EXPECT_EQ(expected_errors, error_collector.text_); + } + + // Builds some already-parsed file in our test pool. + void BuildFileInTestPool(const FileDescriptor* file) { + FileDescriptorProto file_proto; + file->CopyTo(&file_proto); + ASSERT_TRUE(pool_.BuildFile(file_proto) != NULL); + } + + // Build descriptor.proto in our test pool. This allows us to extend it in + // the test pool, so we can test custom options. + void BuildDescriptorMessagesInTestPool() { + BuildFileInTestPool(DescriptorProto::descriptor()->file()); + } + + DescriptorPool pool_; +}; + +TEST_F(ValidationErrorTest, AlreadyDefined) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" }" + "message_type { name: \"Foo\" }", + + "foo.proto: Foo: NAME: \"Foo\" is already defined.\n"); +} + +TEST_F(ValidationErrorTest, AlreadyDefinedInPackage) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "package: \"foo.bar\" " + "message_type { name: \"Foo\" }" + "message_type { name: \"Foo\" }", + + "foo.proto: foo.bar.Foo: NAME: \"Foo\" is already defined in " + "\"foo.bar\".\n"); +} + +TEST_F(ValidationErrorTest, AlreadyDefinedInOtherFile) { + BuildFile( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" }"); + + BuildFileWithErrors( + "name: \"bar.proto\" " + "message_type { name: \"Foo\" }", + + "bar.proto: Foo: NAME: \"Foo\" is already defined in file " + "\"foo.proto\".\n"); +} + +TEST_F(ValidationErrorTest, PackageAlreadyDefined) { + BuildFile( + "name: \"foo.proto\" " + "message_type { name: \"foo\" }"); + BuildFileWithErrors( + "name: \"bar.proto\" " + "package: \"foo.bar\"", + + "bar.proto: foo: NAME: \"foo\" is already defined (as something other " + "than a package) in file \"foo.proto\".\n"); +} + +TEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParent) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " + "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", + + "foo.proto: FOO: NAME: \"FOO\" is already defined.\n" + "foo.proto: FOO: NAME: Note that enum values use C++ scoping rules, " + "meaning that enum values are siblings of their type, not children of " + "it. Therefore, \"FOO\" must be unique within the global scope, not " + "just within \"Bar\".\n"); +} + +TEST_F(ValidationErrorTest, EnumValueAlreadyDefinedInParentNonGlobal) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "package: \"pkg\" " + "enum_type { name: \"Foo\" value { name: \"FOO\" number: 1 } } " + "enum_type { name: \"Bar\" value { name: \"FOO\" number: 1 } } ", + + "foo.proto: pkg.FOO: NAME: \"FOO\" is already defined in \"pkg\".\n" + "foo.proto: pkg.FOO: NAME: Note that enum values use C++ scoping rules, " + "meaning that enum values are siblings of their type, not children of " + "it. Therefore, \"FOO\" must be unique within \"pkg\", not just within " + "\"Bar\".\n"); +} + +TEST_F(ValidationErrorTest, MissingName) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { }", + + "foo.proto: : NAME: Missing name.\n"); +} + +TEST_F(ValidationErrorTest, InvalidName) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"$\" }", + + "foo.proto: $: NAME: \"$\" is not a valid identifier.\n"); +} + +TEST_F(ValidationErrorTest, InvalidPackageName) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "package: \"foo.$\"", + + "foo.proto: foo.$: NAME: \"$\" is not a valid identifier.\n"); +} + +TEST_F(ValidationErrorTest, MissingFileName) { + BuildFileWithErrors( + "", + + ": : OTHER: Missing field: FileDescriptorProto.name.\n"); +} + +TEST_F(ValidationErrorTest, DupeDependency) { + BuildFile("name: \"foo.proto\""); + BuildFileWithErrors( + "name: \"bar.proto\" " + "dependency: \"foo.proto\" " + "dependency: \"foo.proto\" ", + + "bar.proto: bar.proto: OTHER: Import \"foo.proto\" was listed twice.\n"); +} + +TEST_F(ValidationErrorTest, UnknownDependency) { + BuildFileWithErrors( + "name: \"bar.proto\" " + "dependency: \"foo.proto\" ", + + "bar.proto: bar.proto: OTHER: Import \"foo.proto\" has not been loaded.\n"); +} + +TEST_F(ValidationErrorTest, ForeignUnimportedPackageNoCrash) { + // Used to crash: If we depend on a non-existent file and then refer to a + // package defined in a file that we didn't import, and that package is + // nested within a parent package which this file is also in, and we don't + // include that parent package in the name (i.e. we do a relative lookup)... + // Yes, really. + BuildFile( + "name: 'foo.proto' " + "package: 'outer.foo' "); + BuildFileWithErrors( + "name: 'bar.proto' " + "dependency: 'baz.proto' " + "package: 'outer.bar' " + "message_type { " + " name: 'Bar' " + " field { name:'bar' number:1 label:LABEL_OPTIONAL type_name:'foo.Foo' }" + "}", + + "bar.proto: bar.proto: OTHER: Import \"baz.proto\" has not been loaded.\n" + "bar.proto: outer.bar.Bar.bar: TYPE: \"outer.foo\" seems to be defined in " + "\"foo.proto\", which is not imported by \"bar.proto\". To use it here, " + "please add the necessary import.\n"); +} + +TEST_F(ValidationErrorTest, DupeFile) { + BuildFile( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" }"); + // Note: We should *not* get redundant errors about "Foo" already being + // defined. + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" } " + // Add another type so that the files aren't identical (in which case there + // would be no error). + "enum_type { name: \"Bar\" }", + + "foo.proto: foo.proto: OTHER: A file with this name is already in the " + "pool.\n"); +} + +TEST_F(ValidationErrorTest, FieldInExtensionRange) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name: \"foo\" number: 9 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " field { name: \"bar\" number: 10 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " field { name: \"baz\" number: 19 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " field { name: \"qux\" number: 20 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " extension_range { start: 10 end: 20 }" + "}", + + "foo.proto: Foo.bar: NUMBER: Extension range 10 to 19 includes field " + "\"bar\" (10).\n" + "foo.proto: Foo.baz: NUMBER: Extension range 10 to 19 includes field " + "\"baz\" (19).\n"); +} + +TEST_F(ValidationErrorTest, OverlappingExtensionRanges) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " extension_range { start: 10 end: 20 }" + " extension_range { start: 20 end: 30 }" + " extension_range { start: 19 end: 21 }" + "}", + + "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " + "already-defined range 10 to 19.\n" + "foo.proto: Foo: NUMBER: Extension range 19 to 20 overlaps with " + "already-defined range 20 to 29.\n"); +} + +TEST_F(ValidationErrorTest, InvalidDefaults) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + + // Invalid number. + " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL type: TYPE_INT32" + " default_value: \"abc\" }" + + // Empty default value. + " field { name: \"bar\" number: 2 label: LABEL_OPTIONAL type: TYPE_INT32" + " default_value: \"\" }" + + // Invalid boolean. + " field { name: \"baz\" number: 3 label: LABEL_OPTIONAL type: TYPE_BOOL" + " default_value: \"abc\" }" + + // Messages can't have defaults. + " field { name: \"qux\" number: 4 label: LABEL_OPTIONAL type: TYPE_MESSAGE" + " default_value: \"abc\" type_name: \"Foo\" }" + + // Same thing, but we don't know that this field has message type until + // we look up the type name. + " field { name: \"quux\" number: 5 label: LABEL_OPTIONAL" + " default_value: \"abc\" type_name: \"Foo\" }" + + // Repeateds can't have defaults. + " field { name: \"corge\" number: 6 label: LABEL_REPEATED type: TYPE_INT32" + " default_value: \"1\" }" + "}", + + "foo.proto: Foo.foo: DEFAULT_VALUE: Couldn't parse default value.\n" + "foo.proto: Foo.bar: DEFAULT_VALUE: Couldn't parse default value.\n" + "foo.proto: Foo.baz: DEFAULT_VALUE: Boolean default must be true or " + "false.\n" + "foo.proto: Foo.qux: DEFAULT_VALUE: Messages can't have default values.\n" + "foo.proto: Foo.corge: DEFAULT_VALUE: Repeated fields can't have default " + "values.\n" + // This ends up being reported later because the error is detected at + // cross-linking time. + "foo.proto: Foo.quux: DEFAULT_VALUE: Messages can't have default " + "values.\n"); +} + +TEST_F(ValidationErrorTest, NegativeFieldNumber) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name: \"foo\" number: -1 label:LABEL_OPTIONAL type:TYPE_INT32 }" + "}", + + "foo.proto: Foo.foo: NUMBER: Field numbers must be positive integers.\n"); +} + +TEST_F(ValidationErrorTest, HugeFieldNumber) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name: \"foo\" number: 0x70000000 " + " label:LABEL_OPTIONAL type:TYPE_INT32 }" + "}", + + "foo.proto: Foo.foo: NUMBER: Field numbers cannot be greater than " + "536870911.\n"); +} + +TEST_F(ValidationErrorTest, ReservedFieldNumber) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field {name:\"foo\" number: 18999 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " field {name:\"bar\" number: 19000 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " field {name:\"baz\" number: 19999 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " field {name:\"qux\" number: 20000 label:LABEL_OPTIONAL type:TYPE_INT32 }" + "}", + + "foo.proto: Foo.bar: NUMBER: Field numbers 19000 through 19999 are " + "reserved for the protocol buffer library implementation.\n" + "foo.proto: Foo.baz: NUMBER: Field numbers 19000 through 19999 are " + "reserved for the protocol buffer library implementation.\n"); +} + +TEST_F(ValidationErrorTest, ExtensionMissingExtendee) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " extension { name: \"foo\" number: 1 label: LABEL_OPTIONAL" + " type_name: \"Foo\" }" + "}", + + "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee not set for " + "extension field.\n"); +} + +TEST_F(ValidationErrorTest, NonExtensionWithExtendee) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Bar\"" + " extension_range { start: 1 end: 2 }" + "}" + "message_type {" + " name: \"Foo\"" + " field { name: \"foo\" number: 1 label: LABEL_OPTIONAL" + " type_name: \"Foo\" extendee: \"Bar\" }" + "}", + + "foo.proto: Foo.foo: EXTENDEE: FieldDescriptorProto.extendee set for " + "non-extension field.\n"); +} + +TEST_F(ValidationErrorTest, FieldNumberConflict) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " field { name: \"bar\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" + "}", + + "foo.proto: Foo.bar: NUMBER: Field number 1 has already been used in " + "\"Foo\" by field \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, BadMessageSetExtensionType) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"MessageSet\"" + " options { message_set_wire_format: true }" + " extension_range { start: 4 end: 5 }" + "}" + "message_type {" + " name: \"Foo\"" + " extension { name:\"foo\" number:4 label:LABEL_OPTIONAL type:TYPE_INT32" + " extendee: \"MessageSet\" }" + "}", + + "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " + "messages.\n"); +} + +TEST_F(ValidationErrorTest, BadMessageSetExtensionLabel) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"MessageSet\"" + " options { message_set_wire_format: true }" + " extension_range { start: 4 end: 5 }" + "}" + "message_type {" + " name: \"Foo\"" + " extension { name:\"foo\" number:4 label:LABEL_REPEATED type:TYPE_MESSAGE" + " type_name: \"Foo\" extendee: \"MessageSet\" }" + "}", + + "foo.proto: Foo.foo: TYPE: Extensions of MessageSets must be optional " + "messages.\n"); +} + +TEST_F(ValidationErrorTest, FieldInMessageSet) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " options { message_set_wire_format: true }" + " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type:TYPE_INT32 }" + "}", + + "foo.proto: Foo.foo: NAME: MessageSets cannot have fields, only " + "extensions.\n"); +} + +TEST_F(ValidationErrorTest, NegativeExtensionRangeNumber) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " extension_range { start: -10 end: -1 }" + "}", + + "foo.proto: Foo: NUMBER: Extension numbers must be positive integers.\n"); +} + +TEST_F(ValidationErrorTest, HugeExtensionRangeNumber) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " extension_range { start: 1 end: 0x70000000 }" + "}", + + "foo.proto: Foo: NUMBER: Extension numbers cannot be greater than " + "536870911.\n"); +} + +TEST_F(ValidationErrorTest, ExtensionRangeEndBeforeStart) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " extension_range { start: 10 end: 10 }" + " extension_range { start: 10 end: 5 }" + "}", + + "foo.proto: Foo: NUMBER: Extension range end number must be greater than " + "start number.\n" + "foo.proto: Foo: NUMBER: Extension range end number must be greater than " + "start number.\n"); +} + +TEST_F(ValidationErrorTest, EmptyEnum) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "enum_type { name: \"Foo\" }" + // Also use the empty enum in a message to make sure there are no crashes + // during validation (possible if the code attempts to derive a default + // value for the field). + "message_type {" + " name: \"Bar\"" + " field { name: \"foo\" number: 1 label:LABEL_OPTIONAL type_name:\"Foo\" }" + " field { name: \"bar\" number: 2 label:LABEL_OPTIONAL type_name:\"Foo\" " + " default_value: \"NO_SUCH_VALUE\" }" + "}", + + "foo.proto: Foo: NAME: Enums must contain at least one value.\n" + "foo.proto: Bar.bar: DEFAULT_VALUE: Enum type \"Foo\" has no value named " + "\"NO_SUCH_VALUE\".\n"); +} + +TEST_F(ValidationErrorTest, UndefinedExtendee) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" + " extendee: \"Bar\" }" + "}", + + "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not defined.\n"); +} + +TEST_F(ValidationErrorTest, NonMessageExtendee) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } }" + "message_type {" + " name: \"Foo\"" + " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" + " extendee: \"Bar\" }" + "}", + + "foo.proto: Foo.foo: EXTENDEE: \"Bar\" is not a message type.\n"); +} + +TEST_F(ValidationErrorTest, NotAnExtensionNumber) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Bar\"" + "}" + "message_type {" + " name: \"Foo\"" + " extension { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" + " extendee: \"Bar\" }" + "}", + + "foo.proto: Foo.foo: NUMBER: \"Bar\" does not declare 1 as an extension " + "number.\n"); +} + +TEST_F(ValidationErrorTest, UndefinedFieldType) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" + "}", + + "foo.proto: Foo.foo: TYPE: \"Bar\" is not defined.\n"); +} + +TEST_F(ValidationErrorTest, FieldTypeDefinedInUndeclaredDependency) { + BuildFile( + "name: \"bar.proto\" " + "message_type { name: \"Bar\" } "); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" + "}", + "foo.proto: Foo.foo: TYPE: \"Bar\" seems to be defined in \"bar.proto\", " + "which is not imported by \"foo.proto\". To use it here, please add the " + "necessary import.\n"); +} + +TEST_F(ValidationErrorTest, SearchMostLocalFirst) { + // The following should produce an error that Bar.Baz is not defined: + // message Bar { message Baz {} } + // message Foo { + // message Bar { + // // Placing "message Baz{}" here, or removing Foo.Bar altogether, + // // would fix the error. + // } + // optional Bar.Baz baz = 1; + // } + // An one point the lookup code incorrectly did not produce an error in this + // case, because when looking for Bar.Baz, it would try "Foo.Bar.Baz" first, + // fail, and ten try "Bar.Baz" and succeed, even though "Bar" should actually + // refer to the inner Bar, not the outer one. + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Bar\"" + " nested_type { name: \"Baz\" }" + "}" + "message_type {" + " name: \"Foo\"" + " nested_type { name: \"Bar\" }" + " field { name:\"baz\" number:1 label:LABEL_OPTIONAL" + " type_name:\"Bar.Baz\" }" + "}", + + "foo.proto: Foo.baz: TYPE: \"Bar.Baz\" is not defined.\n"); +} + +TEST_F(ValidationErrorTest, SearchMostLocalFirst2) { + // This test would find the most local "Bar" first, and does, but + // proceeds to find the outer one because the inner one's not an + // aggregate. + BuildFile( + "name: \"foo.proto\" " + "message_type {" + " name: \"Bar\"" + " nested_type { name: \"Baz\" }" + "}" + "message_type {" + " name: \"Foo\"" + " field { name: \"Bar\" number:1 type:TYPE_BYTES } " + " field { name:\"baz\" number:2 label:LABEL_OPTIONAL" + " type_name:\"Bar.Baz\" }" + "}"); +} + +TEST_F(ValidationErrorTest, PackageOriginallyDeclaredInTransitiveDependent) { + // Imagine we have the following: + // + // foo.proto: + // package foo.bar; + // bar.proto: + // package foo.bar; + // import "foo.proto"; + // message Bar {} + // baz.proto: + // package foo; + // import "bar.proto" + // message Baz { optional bar.Bar qux = 1; } + // + // When validating baz.proto, we will look up "bar.Bar". As part of this + // lookup, we first lookup "bar" then try to find "Bar" within it. "bar" + // should resolve to "foo.bar". Note, though, that "foo.bar" was originally + // defined in foo.proto, which is not a direct dependency of baz.proto. The + // implementation of FindSymbol() normally only returns symbols in direct + // dependencies, not indirect ones. This test insures that this does not + // prevent it from finding "foo.bar". + + BuildFile( + "name: \"foo.proto\" " + "package: \"foo.bar\" "); + BuildFile( + "name: \"bar.proto\" " + "package: \"foo.bar\" " + "dependency: \"foo.proto\" " + "message_type { name: \"Bar\" }"); + BuildFile( + "name: \"baz.proto\" " + "package: \"foo\" " + "dependency: \"bar.proto\" " + "message_type { " + " name: \"Baz\" " + " field { name:\"qux\" number:1 label:LABEL_OPTIONAL " + " type_name:\"bar.Bar\" }" + "}"); +} + +TEST_F(ValidationErrorTest, FieldTypeNotAType) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " + " type_name:\".Foo.bar\" }" + " field { name:\"bar\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" + "}", + + "foo.proto: Foo.foo: TYPE: \".Foo.bar\" is not a type.\n"); +} + +TEST_F(ValidationErrorTest, RelativeFieldTypeNotAType) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " nested_type {" + " name: \"Bar\"" + " field { name:\"Baz\" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 }" + " }" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL " + " type_name:\"Bar.Baz\" }" + "}", + "foo.proto: Foo.foo: TYPE: \"Bar.Baz\" is not a type.\n"); +} + +TEST_F(ValidationErrorTest, FieldTypeMayBeItsName) { + BuildFile( + "name: \"foo.proto\" " + "message_type {" + " name: \"Bar\"" + "}" + "message_type {" + " name: \"Foo\"" + " field { name:\"Bar\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\" }" + "}"); +} + +TEST_F(ValidationErrorTest, EnumFieldTypeIsMessage) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"Bar\" } " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_ENUM" + " type_name:\"Bar\" }" + "}", + + "foo.proto: Foo.foo: TYPE: \"Bar\" is not an enum type.\n"); +} + +TEST_F(ValidationErrorTest, MessageFieldTypeIsEnum) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE" + " type_name:\"Bar\" }" + "}", + + "foo.proto: Foo.foo: TYPE: \"Bar\" is not a message type.\n"); +} + +TEST_F(ValidationErrorTest, BadEnumDefaultValue) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type_name:\"Bar\"" + " default_value:\"NO_SUCH_VALUE\" }" + "}", + + "foo.proto: Foo.foo: DEFAULT_VALUE: Enum type \"Bar\" has no value named " + "\"NO_SUCH_VALUE\".\n"); +} + +TEST_F(ValidationErrorTest, PrimitiveWithTypeName) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_INT32" + " type_name:\"Foo\" }" + "}", + + "foo.proto: Foo.foo: TYPE: Field with primitive type has type_name.\n"); +} + +TEST_F(ValidationErrorTest, NonPrimitiveWithoutTypeName) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"Foo\"" + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_MESSAGE }" + "}", + + "foo.proto: Foo.foo: TYPE: Field with message or enum type missing " + "type_name.\n"); +} + +TEST_F(ValidationErrorTest, InputTypeNotDefined) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" } " + "service {" + " name: \"TestService\"" + " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" + "}", + + "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not defined.\n"); +} + +TEST_F(ValidationErrorTest, InputTypeNotAMessage) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" } " + "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " + "service {" + " name: \"TestService\"" + " method { name: \"A\" input_type: \"Bar\" output_type: \"Foo\" }" + "}", + + "foo.proto: TestService.A: INPUT_TYPE: \"Bar\" is not a message type.\n"); +} + +TEST_F(ValidationErrorTest, OutputTypeNotDefined) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" } " + "service {" + " name: \"TestService\"" + " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" + "}", + + "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not defined.\n"); +} + +TEST_F(ValidationErrorTest, OutputTypeNotAMessage) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" } " + "enum_type { name: \"Bar\" value { name:\"DUMMY\" number:0 } } " + "service {" + " name: \"TestService\"" + " method { name: \"A\" input_type: \"Foo\" output_type: \"Bar\" }" + "}", + + "foo.proto: TestService.A: OUTPUT_TYPE: \"Bar\" is not a message type.\n"); +} + +TEST_F(ValidationErrorTest, IllegalPackedField) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {\n" + " name: \"Foo\"" + " field { name:\"packed_string\" number:1 label:LABEL_REPEATED " + " type:TYPE_STRING " + " options { uninterpreted_option {" + " name { name_part: \"packed\" is_extension: false }" + " identifier_value: \"true\" }}}\n" + " field { name:\"packed_message\" number:3 label:LABEL_REPEATED " + " type_name: \"Foo\"" + " options { uninterpreted_option {" + " name { name_part: \"packed\" is_extension: false }" + " identifier_value: \"true\" }}}\n" + " field { name:\"optional_int32\" number: 4 label: LABEL_OPTIONAL " + " type:TYPE_INT32 " + " options { uninterpreted_option {" + " name { name_part: \"packed\" is_extension: false }" + " identifier_value: \"true\" }}}\n" + "}", + + "foo.proto: Foo.packed_string: TYPE: [packed = true] can only be " + "specified for repeated primitive fields.\n" + "foo.proto: Foo.packed_message: TYPE: [packed = true] can only be " + "specified for repeated primitive fields.\n" + "foo.proto: Foo.optional_int32: TYPE: [packed = true] can only be " + "specified for repeated primitive fields.\n" + ); +} + +TEST_F(ValidationErrorTest, OptionWrongType) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { " + " name: \"TestMessage\" " + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " + " options { uninterpreted_option { name { name_part: \"ctype\" " + " is_extension: false }" + " positive_int_value: 1 }" + " }" + " }" + "}\n", + + "foo.proto: TestMessage.foo: OPTION_VALUE: Value must be identifier for " + "enum-valued option \"google.protobuf.FieldOptions.ctype\".\n"); +} + +TEST_F(ValidationErrorTest, OptionExtendsAtomicType) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { " + " name: \"TestMessage\" " + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_STRING " + " options { uninterpreted_option { name { name_part: \"ctype\" " + " is_extension: false }" + " name { name_part: \"foo\" " + " is_extension: true }" + " positive_int_value: 1 }" + " }" + " }" + "}\n", + + "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" is an " + "atomic type, not a message.\n"); +} + +TEST_F(ValidationErrorTest, DupOption) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { " + " name: \"TestMessage\" " + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_UINT32 " + " options { uninterpreted_option { name { name_part: \"ctype\" " + " is_extension: false }" + " identifier_value: \"CORD\" }" + " uninterpreted_option { name { name_part: \"ctype\" " + " is_extension: false }" + " identifier_value: \"CORD\" }" + " }" + " }" + "}\n", + + "foo.proto: TestMessage.foo: OPTION_NAME: Option \"ctype\" was " + "already set.\n"); +} + +TEST_F(ValidationErrorTest, InvalidOptionName) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type { " + " name: \"TestMessage\" " + " field { name:\"foo\" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL " + " options { uninterpreted_option { " + " name { name_part: \"uninterpreted_option\" " + " is_extension: false }" + " positive_int_value: 1 " + " }" + " }" + " }" + "}\n", + + "foo.proto: TestMessage.foo: OPTION_NAME: Option must not use " + "reserved name \"uninterpreted_option\".\n"); +} + +TEST_F(ValidationErrorTest, RepeatedOption) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_REPEATED " + " type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " double_value: 1.2 } }", + + "foo.proto: foo.proto: OPTION_NAME: Option field \"(foo)\" is repeated. " + "Repeated options are not supported.\n"); +} + +TEST_F(ValidationErrorTest, CustomOptionConflictingFieldNumber) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo1\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }" + "extension { name: \"foo2\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_INT32 extendee: \"google.protobuf.FieldOptions\" }", + + "foo.proto: foo2: NUMBER: Extension number 7672757 has already been used " + "in \"google.protobuf.FieldOptions\" by extension \"foo1\".\n"); +} + +TEST_F(ValidationErrorTest, Int32OptionValueOutOfPositiveRange) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " positive_int_value: 0x80000000 } " + "}", + + "foo.proto: foo.proto: OPTION_VALUE: Value out of range " + "for int32 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, Int32OptionValueOutOfNegativeRange) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " negative_int_value: -0x80000001 } " + "}", + + "foo.proto: foo.proto: OPTION_VALUE: Value out of range " + "for int32 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, Int32OptionValueIsNotPositiveInt) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_INT32 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " string_value: \"5\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " + "for int32 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, Int64OptionValueOutOfRange) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " positive_int_value: 0x8000000000000000 } " + "}", + + "foo.proto: foo.proto: OPTION_VALUE: Value out of range " + "for int64 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, Int64OptionValueIsNotPositiveInt) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_INT64 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " identifier_value: \"5\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be integer " + "for int64 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, UInt32OptionValueOutOfRange) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " positive_int_value: 0x100000000 } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value out of range " + "for uint32 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, UInt32OptionValueIsNotPositiveInt) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_UINT32 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " double_value: -5.6 } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " + "for uint32 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, UInt64OptionValueIsNotPositiveInt) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_UINT64 extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " negative_int_value: -5 } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be non-negative integer " + "for uint64 option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, FloatOptionValueIsNotNumber) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_FLOAT extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " string_value: \"bar\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be number " + "for float option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, DoubleOptionValueIsNotNumber) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_DOUBLE extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " string_value: \"bar\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be number " + "for double option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, BoolOptionValueIsNotTrueOrFalse) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_BOOL extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " identifier_value: \"bar\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be \"true\" or \"false\" " + "for boolean option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, EnumOptionValueIsNotIdentifier) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " + " value { name: \"BAZ\" number: 2 } }" + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_ENUM type_name: \"FooEnum\" " + " extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " string_value: \"QUUX\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be identifier for " + "enum-valued option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, EnumOptionValueIsNotEnumValueName) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "enum_type { name: \"FooEnum\" value { name: \"BAR\" number: 1 } " + " value { name: \"BAZ\" number: 2 } }" + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_ENUM type_name: \"FooEnum\" " + " extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " identifier_value: \"QUUX\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum\" has no value " + "named \"QUUX\" for option \"foo\".\n"); +} + +TEST_F(ValidationErrorTest, EnumOptionValueIsSiblingEnumValueName) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "enum_type { name: \"FooEnum1\" value { name: \"BAR\" number: 1 } " + " value { name: \"BAZ\" number: 2 } }" + "enum_type { name: \"FooEnum2\" value { name: \"QUX\" number: 1 } " + " value { name: \"QUUX\" number: 2 } }" + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_ENUM type_name: \"FooEnum1\" " + " extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " identifier_value: \"QUUX\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Enum type \"FooEnum1\" has no value " + "named \"QUUX\" for option \"foo\". This appears to be a value from a " + "sibling type.\n"); +} + +TEST_F(ValidationErrorTest, StringOptionValueIsNotString) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_STRING extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " identifier_value: \"QUUX\" } }", + + "foo.proto: foo.proto: OPTION_VALUE: Value must be quoted string for " + "string option \"foo\".\n"); +} + +// Helper function for tests that check for aggregate value parsing +// errors. The "value" argument is embedded inside the +// "uninterpreted_option" portion of the result. +static string EmbedAggregateValue(const char* value) { + return strings::Substitute( + "name: \"foo.proto\" " + "dependency: \"google/protobuf/descriptor.proto\" " + "message_type { name: \"Foo\" } " + "extension { name: \"foo\" number: 7672757 label: LABEL_OPTIONAL " + " type: TYPE_MESSAGE type_name: \"Foo\" " + " extendee: \"google.protobuf.FileOptions\" }" + "options { uninterpreted_option { name { name_part: \"foo\" " + " is_extension: true } " + " $0 } }", + value); +} + +TEST_F(ValidationErrorTest, AggregateValueNotFound) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + EmbedAggregateValue("string_value: \"\""), + "foo.proto: foo.proto: OPTION_VALUE: Option \"foo\" is a message. " + "To set the entire message, use syntax like " + "\"foo = { }\". To set fields within it, use " + "syntax like \"foo.foo = value\".\n"); +} + +TEST_F(ValidationErrorTest, AggregateValueParseError) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + EmbedAggregateValue("aggregate_value: \"1+2\""), + "foo.proto: foo.proto: OPTION_VALUE: Error while parsing option " + "value for \"foo\": Expected identifier.\n"); +} + +TEST_F(ValidationErrorTest, AggregateValueUnknownFields) { + BuildDescriptorMessagesInTestPool(); + + BuildFileWithErrors( + EmbedAggregateValue("aggregate_value: \"x:100\""), + "foo.proto: foo.proto: OPTION_VALUE: Error while parsing option " + "value for \"foo\": Message type \"Foo\" has no field named \"x\".\n"); +} + +TEST_F(ValidationErrorTest, NotLiteImportsLite) { + BuildFile( + "name: \"bar.proto\" " + "options { optimize_for: LITE_RUNTIME } "); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"bar.proto\" ", + + "foo.proto: foo.proto: OTHER: Files that do not use optimize_for = " + "LITE_RUNTIME cannot import files which do use this option. This file " + "is not lite, but it imports \"bar.proto\" which is.\n"); +} + +TEST_F(ValidationErrorTest, LiteExtendsNotLite) { + BuildFile( + "name: \"bar.proto\" " + "message_type: {" + " name: \"Bar\"" + " extension_range { start: 1 end: 1000 }" + "}"); + + BuildFileWithErrors( + "name: \"foo.proto\" " + "dependency: \"bar.proto\" " + "options { optimize_for: LITE_RUNTIME } " + "extension { name: \"ext\" number: 123 label: LABEL_OPTIONAL " + " type: TYPE_INT32 extendee: \"Bar\" }", + + "foo.proto: ext: EXTENDEE: Extensions to non-lite types can only be " + "declared in non-lite files. Note that you cannot extend a non-lite " + "type to contain a lite type, but the reverse is allowed.\n"); +} + +TEST_F(ValidationErrorTest, NoLiteServices) { + BuildFileWithErrors( + "name: \"foo.proto\" " + "options {" + " optimize_for: LITE_RUNTIME" + " cc_generic_services: true" + " java_generic_services: true" + "} " + "service { name: \"Foo\" }", + + "foo.proto: Foo: NAME: Files with optimize_for = LITE_RUNTIME cannot " + "define services unless you set both options cc_generic_services and " + "java_generic_sevices to false.\n"); + + BuildFile( + "name: \"bar.proto\" " + "options {" + " optimize_for: LITE_RUNTIME" + " cc_generic_services: false" + " java_generic_services: false" + "} " + "service { name: \"Bar\" }"); +} + +TEST_F(ValidationErrorTest, RollbackAfterError) { + // Build a file which contains every kind of construct but references an + // undefined type. All these constructs will be added to the symbol table + // before the undefined type error is noticed. The DescriptorPool will then + // have to roll everything back. + BuildFileWithErrors( + "name: \"foo.proto\" " + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" + "} " + "enum_type {" + " name: \"TestEnum\"" + " value { name:\"BAR\" number:1 }" + "} " + "service {" + " name: \"TestService\"" + " method {" + " name: \"Baz\"" + " input_type: \"NoSuchType\"" // error + " output_type: \"TestMessage\"" + " }" + "}", + + "foo.proto: TestService.Baz: INPUT_TYPE: \"NoSuchType\" is not defined.\n"); + + // Make sure that if we build the same file again with the error fixed, + // it works. If the above rollback was incomplete, then some symbols will + // be left defined, and this second attempt will fail since it tries to + // re-define the same symbols. + BuildFile( + "name: \"foo.proto\" " + "message_type {" + " name: \"TestMessage\"" + " field { name:\"foo\" label:LABEL_OPTIONAL type:TYPE_INT32 number:1 }" + "} " + "enum_type {" + " name: \"TestEnum\"" + " value { name:\"BAR\" number:1 }" + "} " + "service {" + " name: \"TestService\"" + " method { name:\"Baz\"" + " input_type:\"TestMessage\"" + " output_type:\"TestMessage\" }" + "}"); +} + +TEST_F(ValidationErrorTest, ErrorsReportedToLogError) { + // Test that errors are reported to GOOGLE_LOG(ERROR) if no error collector is + // provided. + + FileDescriptorProto file_proto; + ASSERT_TRUE(TextFormat::ParseFromString( + "name: \"foo.proto\" " + "message_type { name: \"Foo\" } " + "message_type { name: \"Foo\" } ", + &file_proto)); + + vector errors; + + { + ScopedMemoryLog log; + EXPECT_TRUE(pool_.BuildFile(file_proto) == NULL); + errors = log.GetMessages(ERROR); + } + + ASSERT_EQ(2, errors.size()); + + EXPECT_EQ("Invalid proto descriptor for file \"foo.proto\":", errors[0]); + EXPECT_EQ(" Foo: \"Foo\" is already defined.", errors[1]); +} + +// =================================================================== +// DescriptorDatabase + +static void AddToDatabase(SimpleDescriptorDatabase* database, + const char* file_text) { + FileDescriptorProto file_proto; + EXPECT_TRUE(TextFormat::ParseFromString(file_text, &file_proto)); + database->Add(file_proto); +} + +class DatabaseBackedPoolTest : public testing::Test { + protected: + DatabaseBackedPoolTest() {} + + SimpleDescriptorDatabase database_; + + virtual void SetUp() { + AddToDatabase(&database_, + "name: \"foo.proto\" " + "message_type { name:\"Foo\" extension_range { start: 1 end: 100 } } " + "enum_type { name:\"TestEnum\" value { name:\"DUMMY\" number:0 } } " + "service { name:\"TestService\" } "); + AddToDatabase(&database_, + "name: \"bar.proto\" " + "dependency: \"foo.proto\" " + "message_type { name:\"Bar\" } " + "extension { name:\"foo_ext\" extendee: \".Foo\" number:5 " + " label:LABEL_OPTIONAL type:TYPE_INT32 } "); + } + + // We can't inject a file containing errors into a DescriptorPool, so we + // need an actual mock DescriptorDatabase to test errors. + class ErrorDescriptorDatabase : public DescriptorDatabase { + public: + ErrorDescriptorDatabase() {} + ~ErrorDescriptorDatabase() {} + + // implements DescriptorDatabase --------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output) { + // error.proto and error2.proto cyclically import each other. + if (filename == "error.proto") { + output->Clear(); + output->set_name("error.proto"); + output->add_dependency("error2.proto"); + return true; + } else if (filename == "error2.proto") { + output->Clear(); + output->set_name("error2.proto"); + output->add_dependency("error.proto"); + return true; + } else { + return false; + } + } + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output) { + return false; + } + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output) { + return false; + } + }; + + // A DescriptorDatabase that counts how many times each method has been + // called and forwards to some other DescriptorDatabase. + class CallCountingDatabase : public DescriptorDatabase { + public: + CallCountingDatabase(DescriptorDatabase* wrapped_db) + : wrapped_db_(wrapped_db) { + Clear(); + } + ~CallCountingDatabase() {} + + DescriptorDatabase* wrapped_db_; + + int call_count_; + + void Clear() { + call_count_ = 0; + } + + // implements DescriptorDatabase --------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output) { + ++call_count_; + return wrapped_db_->FindFileByName(filename, output); + } + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output) { + ++call_count_; + return wrapped_db_->FindFileContainingSymbol(symbol_name, output); + } + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output) { + ++call_count_; + return wrapped_db_->FindFileContainingExtension( + containing_type, field_number, output); + } + }; + + // A DescriptorDatabase which falsely always returns foo.proto when searching + // for any symbol or extension number. This shouldn't cause the + // DescriptorPool to reload foo.proto if it is already loaded. + class FalsePositiveDatabase : public DescriptorDatabase { + public: + FalsePositiveDatabase(DescriptorDatabase* wrapped_db) + : wrapped_db_(wrapped_db) {} + ~FalsePositiveDatabase() {} + + DescriptorDatabase* wrapped_db_; + + // implements DescriptorDatabase --------------------------------- + bool FindFileByName(const string& filename, + FileDescriptorProto* output) { + return wrapped_db_->FindFileByName(filename, output); + } + bool FindFileContainingSymbol(const string& symbol_name, + FileDescriptorProto* output) { + return FindFileByName("foo.proto", output); + } + bool FindFileContainingExtension(const string& containing_type, + int field_number, + FileDescriptorProto* output) { + return FindFileByName("foo.proto", output); + } + }; +}; + +TEST_F(DatabaseBackedPoolTest, FindFileByName) { + DescriptorPool pool(&database_); + + const FileDescriptor* foo = pool.FindFileByName("foo.proto"); + ASSERT_TRUE(foo != NULL); + EXPECT_EQ("foo.proto", foo->name()); + ASSERT_EQ(1, foo->message_type_count()); + EXPECT_EQ("Foo", foo->message_type(0)->name()); + + EXPECT_EQ(foo, pool.FindFileByName("foo.proto")); + + EXPECT_TRUE(pool.FindFileByName("no_such_file.proto") == NULL); +} + +TEST_F(DatabaseBackedPoolTest, FindDependencyBeforeDependent) { + DescriptorPool pool(&database_); + + const FileDescriptor* foo = pool.FindFileByName("foo.proto"); + ASSERT_TRUE(foo != NULL); + EXPECT_EQ("foo.proto", foo->name()); + ASSERT_EQ(1, foo->message_type_count()); + EXPECT_EQ("Foo", foo->message_type(0)->name()); + + const FileDescriptor* bar = pool.FindFileByName("bar.proto"); + ASSERT_TRUE(bar != NULL); + EXPECT_EQ("bar.proto", bar->name()); + ASSERT_EQ(1, bar->message_type_count()); + EXPECT_EQ("Bar", bar->message_type(0)->name()); + + ASSERT_EQ(1, bar->dependency_count()); + EXPECT_EQ(foo, bar->dependency(0)); +} + +TEST_F(DatabaseBackedPoolTest, FindDependentBeforeDependency) { + DescriptorPool pool(&database_); + + const FileDescriptor* bar = pool.FindFileByName("bar.proto"); + ASSERT_TRUE(bar != NULL); + EXPECT_EQ("bar.proto", bar->name()); + ASSERT_EQ(1, bar->message_type_count()); + ASSERT_EQ("Bar", bar->message_type(0)->name()); + + const FileDescriptor* foo = pool.FindFileByName("foo.proto"); + ASSERT_TRUE(foo != NULL); + EXPECT_EQ("foo.proto", foo->name()); + ASSERT_EQ(1, foo->message_type_count()); + ASSERT_EQ("Foo", foo->message_type(0)->name()); + + ASSERT_EQ(1, bar->dependency_count()); + EXPECT_EQ(foo, bar->dependency(0)); +} + +TEST_F(DatabaseBackedPoolTest, FindFileContainingSymbol) { + DescriptorPool pool(&database_); + + const FileDescriptor* file = pool.FindFileContainingSymbol("Foo"); + ASSERT_TRUE(file != NULL); + EXPECT_EQ("foo.proto", file->name()); + EXPECT_EQ(file, pool.FindFileByName("foo.proto")); + + EXPECT_TRUE(pool.FindFileContainingSymbol("NoSuchSymbol") == NULL); +} + +TEST_F(DatabaseBackedPoolTest, FindMessageTypeByName) { + DescriptorPool pool(&database_); + + const Descriptor* type = pool.FindMessageTypeByName("Foo"); + ASSERT_TRUE(type != NULL); + EXPECT_EQ("Foo", type->name()); + EXPECT_EQ(type->file(), pool.FindFileByName("foo.proto")); + + EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchType") == NULL); +} + +TEST_F(DatabaseBackedPoolTest, FindExtensionByNumber) { + DescriptorPool pool(&database_); + + const Descriptor* foo = pool.FindMessageTypeByName("Foo"); + ASSERT_TRUE(foo != NULL); + + const FieldDescriptor* extension = pool.FindExtensionByNumber(foo, 5); + ASSERT_TRUE(extension != NULL); + EXPECT_EQ("foo_ext", extension->name()); + EXPECT_EQ(extension->file(), pool.FindFileByName("bar.proto")); + + EXPECT_TRUE(pool.FindExtensionByNumber(foo, 12) == NULL); +} + +TEST_F(DatabaseBackedPoolTest, FindAllExtensions) { + DescriptorPool pool(&database_); + + const Descriptor* foo = pool.FindMessageTypeByName("Foo"); + + for (int i = 0; i < 2; ++i) { + // Repeat the lookup twice, to check that we get consistent + // results despite the fallback database lookup mutating the pool. + vector extensions; + pool.FindAllExtensions(foo, &extensions); + ASSERT_EQ(1, extensions.size()); + EXPECT_EQ(5, extensions[0]->number()); + } +} + +TEST_F(DatabaseBackedPoolTest, ErrorWithoutErrorCollector) { + ErrorDescriptorDatabase error_database; + DescriptorPool pool(&error_database); + + vector errors; + + { + ScopedMemoryLog log; + EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); + errors = log.GetMessages(ERROR); + } + + EXPECT_FALSE(errors.empty()); +} + +TEST_F(DatabaseBackedPoolTest, ErrorWithErrorCollector) { + ErrorDescriptorDatabase error_database; + MockErrorCollector error_collector; + DescriptorPool pool(&error_database, &error_collector); + + EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); + EXPECT_EQ( + "error.proto: error.proto: OTHER: File recursively imports itself: " + "error.proto -> error2.proto -> error.proto\n" + "error2.proto: error2.proto: OTHER: Import \"error.proto\" was not " + "found or had errors.\n" + "error.proto: error.proto: OTHER: Import \"error2.proto\" was not " + "found or had errors.\n", + error_collector.text_); +} + +TEST_F(DatabaseBackedPoolTest, UnittestProto) { + // Try to load all of unittest.proto from a DescriptorDatabase. This should + // thoroughly test all paths through DescriptorBuilder to insure that there + // are no deadlocking problems when pool_->mutex_ is non-NULL. + const FileDescriptor* original_file = + protobuf_unittest::TestAllTypes::descriptor()->file(); + + DescriptorPoolDatabase database(*DescriptorPool::generated_pool()); + DescriptorPool pool(&database); + const FileDescriptor* file_from_database = + pool.FindFileByName(original_file->name()); + + ASSERT_TRUE(file_from_database != NULL); + + FileDescriptorProto original_file_proto; + original_file->CopyTo(&original_file_proto); + + FileDescriptorProto file_from_database_proto; + file_from_database->CopyTo(&file_from_database_proto); + + EXPECT_EQ(original_file_proto.DebugString(), + file_from_database_proto.DebugString()); +} + +TEST_F(DatabaseBackedPoolTest, DoesntRetryDbUnnecessarily) { + // Searching for a child of an existing descriptor should never fall back + // to the DescriptorDatabase even if it isn't found, because we know all + // children are already loaded. + CallCountingDatabase call_counter(&database_); + DescriptorPool pool(&call_counter); + + const FileDescriptor* file = pool.FindFileByName("foo.proto"); + ASSERT_TRUE(file != NULL); + const Descriptor* foo = pool.FindMessageTypeByName("Foo"); + ASSERT_TRUE(foo != NULL); + const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); + ASSERT_TRUE(test_enum != NULL); + const ServiceDescriptor* test_service = pool.FindServiceByName("TestService"); + ASSERT_TRUE(test_service != NULL); + + EXPECT_NE(0, call_counter.call_count_); + call_counter.Clear(); + + EXPECT_TRUE(foo->FindFieldByName("no_such_field") == NULL); + EXPECT_TRUE(foo->FindExtensionByName("no_such_extension") == NULL); + EXPECT_TRUE(foo->FindNestedTypeByName("NoSuchMessageType") == NULL); + EXPECT_TRUE(foo->FindEnumTypeByName("NoSuchEnumType") == NULL); + EXPECT_TRUE(foo->FindEnumValueByName("NO_SUCH_VALUE") == NULL); + EXPECT_TRUE(test_enum->FindValueByName("NO_SUCH_VALUE") == NULL); + EXPECT_TRUE(test_service->FindMethodByName("NoSuchMethod") == NULL); + + EXPECT_TRUE(file->FindMessageTypeByName("NoSuchMessageType") == NULL); + EXPECT_TRUE(file->FindEnumTypeByName("NoSuchEnumType") == NULL); + EXPECT_TRUE(file->FindEnumValueByName("NO_SUCH_VALUE") == NULL); + EXPECT_TRUE(file->FindServiceByName("NO_SUCH_VALUE") == NULL); + EXPECT_TRUE(file->FindExtensionByName("no_such_extension") == NULL); + EXPECT_EQ(0, call_counter.call_count_); +} + +TEST_F(DatabaseBackedPoolTest, DoesntReloadFilesUncesessarily) { + // If FindFileContainingSymbol() or FindFileContainingExtension() return a + // file that is already in the DescriptorPool, it should not attempt to + // reload the file. + FalsePositiveDatabase false_positive_database(&database_); + MockErrorCollector error_collector; + DescriptorPool pool(&false_positive_database, &error_collector); + + // First make sure foo.proto is loaded. + const Descriptor* foo = pool.FindMessageTypeByName("Foo"); + ASSERT_TRUE(foo != NULL); + + // Try inducing false positives. + EXPECT_TRUE(pool.FindMessageTypeByName("NoSuchSymbol") == NULL); + EXPECT_TRUE(pool.FindExtensionByNumber(foo, 22) == NULL); + + // No errors should have been reported. (If foo.proto was incorrectly + // loaded multiple times, errors would have been reported.) + EXPECT_EQ("", error_collector.text_); +} + +TEST_F(DatabaseBackedPoolTest, DoesntReloadKnownBadFiles) { + ErrorDescriptorDatabase error_database; + MockErrorCollector error_collector; + DescriptorPool pool(&error_database, &error_collector); + + EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); + error_collector.text_.clear(); + EXPECT_TRUE(pool.FindFileByName("error.proto") == NULL); + EXPECT_EQ("", error_collector.text_); +} + +TEST_F(DatabaseBackedPoolTest, DoesntFallbackOnWrongType) { + // If a lookup finds a symbol of the wrong type (e.g. we pass a type name + // to FindFieldByName()), we should fail fast, without checking the fallback + // database. + CallCountingDatabase call_counter(&database_); + DescriptorPool pool(&call_counter); + + const FileDescriptor* file = pool.FindFileByName("foo.proto"); + ASSERT_TRUE(file != NULL); + const Descriptor* foo = pool.FindMessageTypeByName("Foo"); + ASSERT_TRUE(foo != NULL); + const EnumDescriptor* test_enum = pool.FindEnumTypeByName("TestEnum"); + ASSERT_TRUE(test_enum != NULL); + + EXPECT_NE(0, call_counter.call_count_); + call_counter.Clear(); + + EXPECT_TRUE(pool.FindMessageTypeByName("TestEnum") == NULL); + EXPECT_TRUE(pool.FindFieldByName("Foo") == NULL); + EXPECT_TRUE(pool.FindExtensionByName("Foo") == NULL); + EXPECT_TRUE(pool.FindEnumTypeByName("Foo") == NULL); + EXPECT_TRUE(pool.FindEnumValueByName("Foo") == NULL); + EXPECT_TRUE(pool.FindServiceByName("Foo") == NULL); + EXPECT_TRUE(pool.FindMethodByName("Foo") == NULL); + + EXPECT_EQ(0, call_counter.call_count_); +} + +// =================================================================== + + +} // namespace descriptor_unittest +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc new file mode 100644 index 000000000..c711a2da4 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc @@ -0,0 +1,558 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// DynamicMessage is implemented by constructing a data structure which +// has roughly the same memory layout as a generated message would have. +// Then, we use GeneratedMessageReflection to implement our reflection +// interface. All the other operations we need to implement (e.g. +// parsing, copying, etc.) are already implemented in terms of +// Reflection, so the rest is easy. +// +// The up side of this strategy is that it's very efficient. We don't +// need to use hash_maps or generic representations of fields. The +// down side is that this is a low-level memory management hack which +// can be tricky to get right. +// +// As mentioned in the header, we only expose a DynamicMessageFactory +// publicly, not the DynamicMessage class itself. This is because +// GenericMessageReflection wants to have a pointer to a "default" +// copy of the class, with all fields initialized to their default +// values. We only want to construct one of these per message type, +// so DynamicMessageFactory stores a cache of default messages for +// each type it sees (each unique Descriptor pointer). The code +// refers to the "default" copy of the class as the "prototype". +// +// Note on memory allocation: This module often calls "operator new()" +// to allocate untyped memory, rather than calling something like +// "new uint8[]". This is because "operator new()" means "Give me some +// space which I can use as I please." while "new uint8[]" means "Give +// me an array of 8-bit integers.". In practice, the later may return +// a pointer that is not aligned correctly for general use. I believe +// Item 8 of "More Effective C++" discusses this in more detail, though +// I don't have the book on me right now so I'm not sure. + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +using internal::WireFormat; +using internal::ExtensionSet; +using internal::GeneratedMessageReflection; + + +// =================================================================== +// Some helper tables and functions... + +namespace { + +// Compute the byte size of the in-memory representation of the field. +int FieldSpaceUsed(const FieldDescriptor* field) { + typedef FieldDescriptor FD; // avoid line wrapping + if (field->label() == FD::LABEL_REPEATED) { + switch (field->cpp_type()) { + case FD::CPPTYPE_INT32 : return sizeof(RepeatedField); + case FD::CPPTYPE_INT64 : return sizeof(RepeatedField); + case FD::CPPTYPE_UINT32 : return sizeof(RepeatedField); + case FD::CPPTYPE_UINT64 : return sizeof(RepeatedField); + case FD::CPPTYPE_DOUBLE : return sizeof(RepeatedField); + case FD::CPPTYPE_FLOAT : return sizeof(RepeatedField); + case FD::CPPTYPE_BOOL : return sizeof(RepeatedField); + case FD::CPPTYPE_ENUM : return sizeof(RepeatedField); + case FD::CPPTYPE_MESSAGE: return sizeof(RepeatedPtrField); + + case FD::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return sizeof(RepeatedPtrField); + } + break; + } + } else { + switch (field->cpp_type()) { + case FD::CPPTYPE_INT32 : return sizeof(int32 ); + case FD::CPPTYPE_INT64 : return sizeof(int64 ); + case FD::CPPTYPE_UINT32 : return sizeof(uint32 ); + case FD::CPPTYPE_UINT64 : return sizeof(uint64 ); + case FD::CPPTYPE_DOUBLE : return sizeof(double ); + case FD::CPPTYPE_FLOAT : return sizeof(float ); + case FD::CPPTYPE_BOOL : return sizeof(bool ); + case FD::CPPTYPE_ENUM : return sizeof(int ); + case FD::CPPTYPE_MESSAGE: return sizeof(Message*); + + case FD::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return sizeof(string*); + } + break; + } + } + + GOOGLE_LOG(DFATAL) << "Can't get here."; + return 0; +} + +inline int DivideRoundingUp(int i, int j) { + return (i + (j - 1)) / j; +} + +static const int kSafeAlignment = sizeof(uint64); + +inline int AlignTo(int offset, int alignment) { + return DivideRoundingUp(offset, alignment) * alignment; +} + +// Rounds the given byte offset up to the next offset aligned such that any +// type may be stored at it. +inline int AlignOffset(int offset) { + return AlignTo(offset, kSafeAlignment); +} + +#define bitsizeof(T) (sizeof(T) * 8) + +} // namespace + +// =================================================================== + +class DynamicMessage : public Message { + public: + struct TypeInfo { + int size; + int has_bits_offset; + int unknown_fields_offset; + int extensions_offset; + + // Not owned by the TypeInfo. + DynamicMessageFactory* factory; // The factory that created this object. + const DescriptorPool* pool; // The factory's DescriptorPool. + const Descriptor* type; // Type of this DynamicMessage. + + // Warning: The order in which the following pointers are defined is + // important (the prototype must be deleted *before* the offsets). + scoped_array offsets; + scoped_ptr reflection; + scoped_ptr prototype; + }; + + DynamicMessage(const TypeInfo* type_info); + ~DynamicMessage(); + + // Called on the prototype after construction to initialize message fields. + void CrossLinkPrototypes(); + + // implements Message ---------------------------------------------- + + Message* New() const; + + int GetCachedSize() const; + void SetCachedSize(int size) const; + + Metadata GetMetadata() const; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessage); + + inline bool is_prototype() const { + return type_info_->prototype == this || + // If type_info_->prototype is NULL, then we must be constructing + // the prototype now, which means we must be the prototype. + type_info_->prototype == NULL; + } + + inline void* OffsetToPointer(int offset) { + return reinterpret_cast(this) + offset; + } + inline const void* OffsetToPointer(int offset) const { + return reinterpret_cast(this) + offset; + } + + const TypeInfo* type_info_; + + // TODO(kenton): Make this an atomic when C++ supports it. + mutable int cached_byte_size_; +}; + +DynamicMessage::DynamicMessage(const TypeInfo* type_info) + : type_info_(type_info), + cached_byte_size_(0) { + // We need to call constructors for various fields manually and set + // default values where appropriate. We use placement new to call + // constructors. If you haven't heard of placement new, I suggest Googling + // it now. We use placement new even for primitive types that don't have + // constructors for consistency. (In theory, placement new should be used + // any time you are trying to convert untyped memory to typed memory, though + // in practice that's not strictly necessary for types that don't have a + // constructor.) + + const Descriptor* descriptor = type_info_->type; + + new(OffsetToPointer(type_info_->unknown_fields_offset)) UnknownFieldSet; + + if (type_info_->extensions_offset != -1) { + new(OffsetToPointer(type_info_->extensions_offset)) ExtensionSet; + } + + for (int i = 0; i < descriptor->field_count(); i++) { + const FieldDescriptor* field = descriptor->field(i); + void* field_ptr = OffsetToPointer(type_info_->offsets[i]); + switch (field->cpp_type()) { +#define HANDLE_TYPE(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + if (!field->is_repeated()) { \ + new(field_ptr) TYPE(field->default_value_##TYPE()); \ + } else { \ + new(field_ptr) RepeatedField(); \ + } \ + break; + + HANDLE_TYPE(INT32 , int32 ); + HANDLE_TYPE(INT64 , int64 ); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE(FLOAT , float ); + HANDLE_TYPE(BOOL , bool ); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_ENUM: + if (!field->is_repeated()) { + new(field_ptr) int(field->default_value_enum()->number()); + } else { + new(field_ptr) RepeatedField(); + } + break; + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + if (!field->is_repeated()) { + if (is_prototype()) { + new(field_ptr) const string*(&field->default_value_string()); + } else { + string* default_value = + *reinterpret_cast( + type_info_->prototype->OffsetToPointer( + type_info_->offsets[i])); + new(field_ptr) string*(default_value); + } + } else { + new(field_ptr) RepeatedPtrField(); + } + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: { + if (!field->is_repeated()) { + new(field_ptr) Message*(NULL); + } else { + new(field_ptr) RepeatedPtrField(); + } + break; + } + } + } +} + +DynamicMessage::~DynamicMessage() { + const Descriptor* descriptor = type_info_->type; + + reinterpret_cast( + OffsetToPointer(type_info_->unknown_fields_offset))->~UnknownFieldSet(); + + if (type_info_->extensions_offset != -1) { + reinterpret_cast( + OffsetToPointer(type_info_->extensions_offset))->~ExtensionSet(); + } + + // We need to manually run the destructors for repeated fields and strings, + // just as we ran their constructors in the the DynamicMessage constructor. + // Additionally, if any singular embedded messages have been allocated, we + // need to delete them, UNLESS we are the prototype message of this type, + // in which case any embedded messages are other prototypes and shouldn't + // be touched. + for (int i = 0; i < descriptor->field_count(); i++) { + const FieldDescriptor* field = descriptor->field(i); + void* field_ptr = OffsetToPointer(type_info_->offsets[i]); + + if (field->is_repeated()) { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + reinterpret_cast*>(field_ptr) \ + ->~RepeatedField(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + reinterpret_cast*>(field_ptr) + ->~RepeatedPtrField(); + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + reinterpret_cast*>(field_ptr) + ->~RepeatedPtrField(); + break; + } + + } else if (field->cpp_type() == FieldDescriptor::CPPTYPE_STRING) { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: { + string* ptr = *reinterpret_cast(field_ptr); + if (ptr != &field->default_value_string()) { + delete ptr; + } + break; + } + } + } else if ((field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) && + !is_prototype()) { + Message* message = *reinterpret_cast(field_ptr); + if (message != NULL) { + delete message; + } + } + } +} + +void DynamicMessage::CrossLinkPrototypes() { + // This should only be called on the prototype message. + GOOGLE_CHECK(is_prototype()); + + DynamicMessageFactory* factory = type_info_->factory; + const Descriptor* descriptor = type_info_->type; + + // Cross-link default messages. + for (int i = 0; i < descriptor->field_count(); i++) { + const FieldDescriptor* field = descriptor->field(i); + void* field_ptr = OffsetToPointer(type_info_->offsets[i]); + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && + !field->is_repeated()) { + // For fields with message types, we need to cross-link with the + // prototype for the field's type. + // For singular fields, the field is just a pointer which should + // point to the prototype. + *reinterpret_cast(field_ptr) = + factory->GetPrototypeNoLock(field->message_type()); + } + } +} + +Message* DynamicMessage::New() const { + void* new_base = reinterpret_cast(operator new(type_info_->size)); + memset(new_base, 0, type_info_->size); + return new(new_base) DynamicMessage(type_info_); +} + +int DynamicMessage::GetCachedSize() const { + return cached_byte_size_; +} + +void DynamicMessage::SetCachedSize(int size) const { + // This is theoretically not thread-compatible, but in practice it works + // because if multiple threads write this simultaneously, they will be + // writing the exact same value. + cached_byte_size_ = size; +} + +Metadata DynamicMessage::GetMetadata() const { + Metadata metadata; + metadata.descriptor = type_info_->type; + metadata.reflection = type_info_->reflection.get(); + return metadata; +} + +// =================================================================== + +struct DynamicMessageFactory::PrototypeMap { + typedef hash_map Map; + Map map_; +}; + +DynamicMessageFactory::DynamicMessageFactory() + : pool_(NULL), delegate_to_generated_factory_(false), + prototypes_(new PrototypeMap) { +} + +DynamicMessageFactory::DynamicMessageFactory(const DescriptorPool* pool) + : pool_(pool), delegate_to_generated_factory_(false), + prototypes_(new PrototypeMap) { +} + +DynamicMessageFactory::~DynamicMessageFactory() { + for (PrototypeMap::Map::iterator iter = prototypes_->map_.begin(); + iter != prototypes_->map_.end(); ++iter) { + delete iter->second; + } +} + +const Message* DynamicMessageFactory::GetPrototype(const Descriptor* type) { + MutexLock lock(&prototypes_mutex_); + return GetPrototypeNoLock(type); +} + +const Message* DynamicMessageFactory::GetPrototypeNoLock( + const Descriptor* type) { + if (delegate_to_generated_factory_ && + type->file()->pool() == DescriptorPool::generated_pool()) { + return MessageFactory::generated_factory()->GetPrototype(type); + } + + const DynamicMessage::TypeInfo** target = &prototypes_->map_[type]; + if (*target != NULL) { + // Already exists. + return (*target)->prototype.get(); + } + + DynamicMessage::TypeInfo* type_info = new DynamicMessage::TypeInfo; + *target = type_info; + + type_info->type = type; + type_info->pool = (pool_ == NULL) ? type->file()->pool() : pool_; + type_info->factory = this; + + // We need to construct all the structures passed to + // GeneratedMessageReflection's constructor. This includes: + // - A block of memory that contains space for all the message's fields. + // - An array of integers indicating the byte offset of each field within + // this block. + // - A big bitfield containing a bit for each field indicating whether + // or not that field is set. + + // Compute size and offsets. + int* offsets = new int[type->field_count()]; + type_info->offsets.reset(offsets); + + // Decide all field offsets by packing in order. + // We place the DynamicMessage object itself at the beginning of the allocated + // space. + int size = sizeof(DynamicMessage); + size = AlignOffset(size); + + // Next the has_bits, which is an array of uint32s. + type_info->has_bits_offset = size; + int has_bits_array_size = + DivideRoundingUp(type->field_count(), bitsizeof(uint32)); + size += has_bits_array_size * sizeof(uint32); + size = AlignOffset(size); + + // The ExtensionSet, if any. + if (type->extension_range_count() > 0) { + type_info->extensions_offset = size; + size += sizeof(ExtensionSet); + size = AlignOffset(size); + } else { + // No extensions. + type_info->extensions_offset = -1; + } + + // All the fields. + for (int i = 0; i < type->field_count(); i++) { + // Make sure field is aligned to avoid bus errors. + int field_size = FieldSpaceUsed(type->field(i)); + size = AlignTo(size, min(kSafeAlignment, field_size)); + offsets[i] = size; + size += field_size; + } + + // Add the UnknownFieldSet to the end. + size = AlignOffset(size); + type_info->unknown_fields_offset = size; + size += sizeof(UnknownFieldSet); + + // Align the final size to make sure no clever allocators think that + // alignment is not necessary. + size = AlignOffset(size); + type_info->size = size; + + // Allocate the prototype. + void* base = operator new(size); + memset(base, 0, size); + DynamicMessage* prototype = new(base) DynamicMessage(type_info); + type_info->prototype.reset(prototype); + + // Construct the reflection object. + type_info->reflection.reset( + new GeneratedMessageReflection( + type_info->type, + type_info->prototype.get(), + type_info->offsets.get(), + type_info->has_bits_offset, + type_info->unknown_fields_offset, + type_info->extensions_offset, + type_info->pool, + this, + type_info->size)); + + // Cross link prototypes. + prototype->CrossLinkPrototypes(); + + return prototype; +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h new file mode 100644 index 000000000..81dd2c639 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h @@ -0,0 +1,136 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Defines an implementation of Message which can emulate types which are not +// known at compile-time. + +#ifndef GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ +#define GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ + +#include +#include + +namespace google { +namespace protobuf { + +// Defined in other files. +class Descriptor; // descriptor.h +class DescriptorPool; // descriptor.h + +// Constructs implementations of Message which can emulate types which are not +// known at compile-time. +// +// Sometimes you want to be able to manipulate protocol types that you don't +// know about at compile time. It would be nice to be able to construct +// a Message object which implements the message type given by any arbitrary +// Descriptor. DynamicMessage provides this. +// +// As it turns out, a DynamicMessage needs to construct extra +// information about its type in order to operate. Most of this information +// can be shared between all DynamicMessages of the same type. But, caching +// this information in some sort of global map would be a bad idea, since +// the cached information for a particular descriptor could outlive the +// descriptor itself. To avoid this problem, DynamicMessageFactory +// encapsulates this "cache". All DynamicMessages of the same type created +// from the same factory will share the same support data. Any Descriptors +// used with a particular factory must outlive the factory. +class LIBPROTOBUF_EXPORT DynamicMessageFactory : public MessageFactory { + public: + // Construct a DynamicMessageFactory that will search for extensions in + // the DescriptorPool in which the exendee is defined. + DynamicMessageFactory(); + + // Construct a DynamicMessageFactory that will search for extensions in + // the given DescriptorPool. + // + // DEPRECATED: Use CodedInputStream::SetExtensionRegistry() to tell the + // parser to look for extensions in an alternate pool. However, note that + // this is almost never what you want to do. Almost all users should use + // the zero-arg constructor. + DynamicMessageFactory(const DescriptorPool* pool); + + ~DynamicMessageFactory(); + + // Call this to tell the DynamicMessageFactory that if it is given a + // Descriptor d for which: + // d->file()->pool() == DescriptorPool::generated_pool(), + // then it should delegate to MessageFactory::generated_factory() instead + // of constructing a dynamic implementation of the message. In theory there + // is no down side to doing this, so it may become the default in the future. + void SetDelegateToGeneratedFactory(bool enable) { + delegate_to_generated_factory_ = enable; + } + + // implements MessageFactory --------------------------------------- + + // Given a Descriptor, constructs the default (prototype) Message of that + // type. You can then call that message's New() method to construct a + // mutable message of that type. + // + // Calling this method twice with the same Descriptor returns the same + // object. The returned object remains property of the factory and will + // be destroyed when the factory is destroyed. Also, any objects created + // by calling the prototype's New() method share some data with the + // prototype, so these must be destoyed before the DynamicMessageFactory + // is destroyed. + // + // The given descriptor must outlive the returned message, and hence must + // outlive the DynamicMessageFactory. + // + // The method is thread-safe. + const Message* GetPrototype(const Descriptor* type); + + private: + const DescriptorPool* pool_; + bool delegate_to_generated_factory_; + + // This struct just contains a hash_map. We can't #include from + // this header due to hacks needed for hash_map portability in the open source + // release. Namely, stubs/hash.h, which defines hash_map portably, is not a + // public header (for good reason), but dynamic_message.h is, and public + // headers may only #include other public headers. + struct PrototypeMap; + scoped_ptr prototypes_; + mutable Mutex prototypes_mutex_; + + friend class DynamicMessage; + const Message* GetPrototypeNoLock(const Descriptor* type); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(DynamicMessageFactory); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_DYNAMIC_MESSAGE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc new file mode 100644 index 000000000..41b89ab52 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc @@ -0,0 +1,162 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Since the reflection interface for DynamicMessage is implemented by +// GenericMessageReflection, the only thing we really have to test is +// that DynamicMessage correctly sets up the information that +// GenericMessageReflection needs to use. So, we focus on that in this +// test. Other tests, such as generic_message_reflection_unittest and +// reflection_ops_unittest, cover the rest of the functionality used by +// DynamicMessage. + +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace google { +namespace protobuf { + +class DynamicMessageTest : public testing::Test { + protected: + DescriptorPool pool_; + DynamicMessageFactory factory_; + const Descriptor* descriptor_; + const Message* prototype_; + const Descriptor* extensions_descriptor_; + const Message* extensions_prototype_; + const Descriptor* packed_descriptor_; + const Message* packed_prototype_; + + DynamicMessageTest(): factory_(&pool_) {} + + virtual void SetUp() { + // We want to make sure that DynamicMessage works (particularly with + // extensions) even if we use descriptors that are *not* from compiled-in + // types, so we make copies of the descriptors for unittest.proto and + // unittest_import.proto. + FileDescriptorProto unittest_file; + FileDescriptorProto unittest_import_file; + + unittest::TestAllTypes::descriptor()->file()->CopyTo(&unittest_file); + unittest_import::ImportMessage::descriptor()->file()->CopyTo( + &unittest_import_file); + + ASSERT_TRUE(pool_.BuildFile(unittest_import_file) != NULL); + ASSERT_TRUE(pool_.BuildFile(unittest_file) != NULL); + + descriptor_ = pool_.FindMessageTypeByName("protobuf_unittest.TestAllTypes"); + ASSERT_TRUE(descriptor_ != NULL); + prototype_ = factory_.GetPrototype(descriptor_); + + extensions_descriptor_ = + pool_.FindMessageTypeByName("protobuf_unittest.TestAllExtensions"); + ASSERT_TRUE(extensions_descriptor_ != NULL); + extensions_prototype_ = factory_.GetPrototype(extensions_descriptor_); + + packed_descriptor_ = + pool_.FindMessageTypeByName("protobuf_unittest.TestPackedTypes"); + ASSERT_TRUE(packed_descriptor_ != NULL); + packed_prototype_ = factory_.GetPrototype(packed_descriptor_); + } +}; + +TEST_F(DynamicMessageTest, Descriptor) { + // Check that the descriptor on the DynamicMessage matches the descriptor + // passed to GetPrototype(). + EXPECT_EQ(prototype_->GetDescriptor(), descriptor_); +} + +TEST_F(DynamicMessageTest, OnePrototype) { + // Check that requesting the same prototype twice produces the same object. + EXPECT_EQ(prototype_, factory_.GetPrototype(descriptor_)); +} + +TEST_F(DynamicMessageTest, Defaults) { + // Check that all default values are set correctly in the initial message. + TestUtil::ReflectionTester reflection_tester(descriptor_); + reflection_tester.ExpectClearViaReflection(*prototype_); +} + +TEST_F(DynamicMessageTest, IndependentOffsets) { + // Check that all fields have independent offsets by setting each + // one to a unique value then checking that they all still have those + // unique values (i.e. they don't stomp each other). + scoped_ptr message(prototype_->New()); + TestUtil::ReflectionTester reflection_tester(descriptor_); + + reflection_tester.SetAllFieldsViaReflection(message.get()); + reflection_tester.ExpectAllFieldsSetViaReflection(*message); +} + +TEST_F(DynamicMessageTest, Extensions) { + // Check that extensions work. + scoped_ptr message(extensions_prototype_->New()); + TestUtil::ReflectionTester reflection_tester(extensions_descriptor_); + + reflection_tester.SetAllFieldsViaReflection(message.get()); + reflection_tester.ExpectAllFieldsSetViaReflection(*message); +} + +TEST_F(DynamicMessageTest, PackedFields) { + // Check that packed fields work properly. + scoped_ptr message(packed_prototype_->New()); + TestUtil::ReflectionTester reflection_tester(packed_descriptor_); + + reflection_tester.SetPackedFieldsViaReflection(message.get()); + reflection_tester.ExpectPackedFieldsSetViaReflection(*message); +} + +TEST_F(DynamicMessageTest, SpaceUsed) { + // Test that SpaceUsed() works properly + + // Since we share the implementation with generated messages, we don't need + // to test very much here. Just make sure it appears to be working. + + scoped_ptr message(prototype_->New()); + TestUtil::ReflectionTester reflection_tester(descriptor_); + + int initial_space_used = message->SpaceUsed(); + + reflection_tester.SetAllFieldsViaReflection(message.get()); + EXPECT_LT(initial_space_used, message->SpaceUsed()); +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc new file mode 100644 index 000000000..1a6f5dfc2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc @@ -0,0 +1,1464 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +namespace { + +inline WireFormatLite::FieldType real_type(FieldType type) { + GOOGLE_DCHECK(type > 0 && type <= WireFormatLite::MAX_FIELD_TYPE); + return static_cast(type); +} + +inline WireFormatLite::CppType cpp_type(FieldType type) { + return WireFormatLite::FieldTypeToCppType(real_type(type)); +} + +// Registry stuff. +typedef hash_map, + ExtensionInfo> ExtensionRegistry; +ExtensionRegistry* registry_ = NULL; +GOOGLE_PROTOBUF_DECLARE_ONCE(registry_init_); + +void DeleteRegistry() { + delete registry_; + registry_ = NULL; +} + +void InitRegistry() { + registry_ = new ExtensionRegistry; + internal::OnShutdown(&DeleteRegistry); +} + +// This function is only called at startup, so there is no need for thread- +// safety. +void Register(const MessageLite* containing_type, + int number, ExtensionInfo info) { + ::google::protobuf::GoogleOnceInit(®istry_init_, &InitRegistry); + + if (!InsertIfNotPresent(registry_, make_pair(containing_type, number), + info)) { + GOOGLE_LOG(FATAL) << "Multiple extension registrations for type \"" + << containing_type->GetTypeName() + << "\", field number " << number << "."; + } +} + +const ExtensionInfo* FindRegisteredExtension( + const MessageLite* containing_type, int number) { + return (registry_ == NULL) ? NULL : + FindOrNull(*registry_, make_pair(containing_type, number)); +} + +} // namespace + +ExtensionFinder::~ExtensionFinder() {} + +bool GeneratedExtensionFinder::Find(int number, ExtensionInfo* output) { + const ExtensionInfo* extension = + FindRegisteredExtension(containing_type_, number); + if (extension == NULL) { + return false; + } else { + *output = *extension; + return true; + } +} + +void ExtensionSet::RegisterExtension(const MessageLite* containing_type, + int number, FieldType type, + bool is_repeated, bool is_packed) { + GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_ENUM); + GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_MESSAGE); + GOOGLE_CHECK_NE(type, WireFormatLite::TYPE_GROUP); + ExtensionInfo info(type, is_repeated, is_packed); + Register(containing_type, number, info); +} + +static bool CallNoArgValidityFunc(const void* arg, int number) { + // Note: Must use C-style cast here rather than reinterpret_cast because + // the C++ standard at one point did not allow casts between function and + // data pointers and some compilers enforce this for C++-style casts. No + // compiler enforces it for C-style casts since lots of C-style code has + // relied on these kinds of casts for a long time, despite being + // technically undefined. See: + // http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#195 + // Also note: Some compilers do not allow function pointers to be "const". + // Which makes sense, I suppose, because it's meaningless. + return ((EnumValidityFunc*)arg)(number); +} + +void ExtensionSet::RegisterEnumExtension(const MessageLite* containing_type, + int number, FieldType type, + bool is_repeated, bool is_packed, + EnumValidityFunc* is_valid) { + GOOGLE_CHECK_EQ(type, WireFormatLite::TYPE_ENUM); + ExtensionInfo info(type, is_repeated, is_packed); + info.enum_validity_check.func = CallNoArgValidityFunc; + // See comment in CallNoArgValidityFunc() about why we use a c-style cast. + info.enum_validity_check.arg = (void*)is_valid; + Register(containing_type, number, info); +} + +void ExtensionSet::RegisterMessageExtension(const MessageLite* containing_type, + int number, FieldType type, + bool is_repeated, bool is_packed, + const MessageLite* prototype) { + GOOGLE_CHECK(type == WireFormatLite::TYPE_MESSAGE || + type == WireFormatLite::TYPE_GROUP); + ExtensionInfo info(type, is_repeated, is_packed); + info.message_prototype = prototype; + Register(containing_type, number, info); +} + + +// =================================================================== +// Constructors and basic methods. + +ExtensionSet::ExtensionSet() {} + +ExtensionSet::~ExtensionSet() { + for (map::iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + iter->second.Free(); + } +} + +// Defined in extension_set_heavy.cc. +// void ExtensionSet::AppendToList(const Descriptor* containing_type, +// const DescriptorPool* pool, +// vector* output) const + +bool ExtensionSet::Has(int number) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end()) return false; + GOOGLE_DCHECK(!iter->second.is_repeated); + return !iter->second.is_cleared; +} + +int ExtensionSet::ExtensionSize(int number) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end()) return false; + return iter->second.GetSize(); +} + +FieldType ExtensionSet::ExtensionType(int number) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end()) { + GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (1). "; + return 0; + } + if (iter->second.is_cleared) { + GOOGLE_LOG(DFATAL) << "Don't lookup extension types if they aren't present (2). "; + } + return iter->second.type; +} + +void ExtensionSet::ClearExtension(int number) { + map::iterator iter = extensions_.find(number); + if (iter == extensions_.end()) return; + iter->second.Clear(); +} + +// =================================================================== +// Field accessors + +namespace { + +enum Cardinality { + REPEATED, + OPTIONAL +}; + +} // namespace + +#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ + GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? REPEATED : OPTIONAL, LABEL); \ + GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), WireFormatLite::CPPTYPE_##CPPTYPE) + +// ------------------------------------------------------------------- +// Primitives + +#define PRIMITIVE_ACCESSORS(UPPERCASE, LOWERCASE, CAMELCASE) \ + \ +LOWERCASE ExtensionSet::Get##CAMELCASE(int number, \ + LOWERCASE default_value) const { \ + map::const_iterator iter = extensions_.find(number); \ + if (iter == extensions_.end() || iter->second.is_cleared) { \ + return default_value; \ + } else { \ + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, UPPERCASE); \ + return iter->second.LOWERCASE##_value; \ + } \ +} \ + \ +void ExtensionSet::Set##CAMELCASE(int number, FieldType type, \ + LOWERCASE value, \ + const FieldDescriptor* descriptor) { \ + Extension* extension; \ + if (MaybeNewExtension(number, descriptor, &extension)) { \ + extension->type = type; \ + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \ + extension->is_repeated = false; \ + } else { \ + GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, UPPERCASE); \ + } \ + extension->is_cleared = false; \ + extension->LOWERCASE##_value = value; \ +} \ + \ +LOWERCASE ExtensionSet::GetRepeated##CAMELCASE(int number, int index) const { \ + map::const_iterator iter = extensions_.find(number); \ + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \ + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ + return iter->second.repeated_##LOWERCASE##_value->Get(index); \ +} \ + \ +void ExtensionSet::SetRepeated##CAMELCASE( \ + int number, int index, LOWERCASE value) { \ + map::iterator iter = extensions_.find(number); \ + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; \ + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, UPPERCASE); \ + iter->second.repeated_##LOWERCASE##_value->Set(index, value); \ +} \ + \ +void ExtensionSet::Add##CAMELCASE(int number, FieldType type, \ + bool packed, LOWERCASE value, \ + const FieldDescriptor* descriptor) { \ + Extension* extension; \ + if (MaybeNewExtension(number, descriptor, &extension)) { \ + extension->type = type; \ + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_##UPPERCASE); \ + extension->is_repeated = true; \ + extension->is_packed = packed; \ + extension->repeated_##LOWERCASE##_value = new RepeatedField(); \ + } else { \ + GOOGLE_DCHECK_TYPE(*extension, REPEATED, UPPERCASE); \ + GOOGLE_DCHECK_EQ(extension->is_packed, packed); \ + } \ + extension->repeated_##LOWERCASE##_value->Add(value); \ +} + +PRIMITIVE_ACCESSORS( INT32, int32, Int32) +PRIMITIVE_ACCESSORS( INT64, int64, Int64) +PRIMITIVE_ACCESSORS(UINT32, uint32, UInt32) +PRIMITIVE_ACCESSORS(UINT64, uint64, UInt64) +PRIMITIVE_ACCESSORS( FLOAT, float, Float) +PRIMITIVE_ACCESSORS(DOUBLE, double, Double) +PRIMITIVE_ACCESSORS( BOOL, bool, Bool) + +#undef PRIMITIVE_ACCESSORS + +// ------------------------------------------------------------------- +// Enums + +int ExtensionSet::GetEnum(int number, int default_value) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end() || iter->second.is_cleared) { + // Not present. Return the default value. + return default_value; + } else { + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, ENUM); + return iter->second.enum_value; + } +} + +void ExtensionSet::SetEnum(int number, FieldType type, int value, + const FieldDescriptor* descriptor) { + Extension* extension; + if (MaybeNewExtension(number, descriptor, &extension)) { + extension->type = type; + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); + extension->is_repeated = false; + } else { + GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, ENUM); + } + extension->is_cleared = false; + extension->enum_value = value; +} + +int ExtensionSet::GetRepeatedEnum(int number, int index) const { + map::const_iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); + return iter->second.repeated_enum_value->Get(index); +} + +void ExtensionSet::SetRepeatedEnum(int number, int index, int value) { + map::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, ENUM); + iter->second.repeated_enum_value->Set(index, value); +} + +void ExtensionSet::AddEnum(int number, FieldType type, + bool packed, int value, + const FieldDescriptor* descriptor) { + Extension* extension; + if (MaybeNewExtension(number, descriptor, &extension)) { + extension->type = type; + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_ENUM); + extension->is_repeated = true; + extension->is_packed = packed; + extension->repeated_enum_value = new RepeatedField(); + } else { + GOOGLE_DCHECK_TYPE(*extension, REPEATED, ENUM); + GOOGLE_DCHECK_EQ(extension->is_packed, packed); + } + extension->repeated_enum_value->Add(value); +} + +// ------------------------------------------------------------------- +// Strings + +const string& ExtensionSet::GetString(int number, + const string& default_value) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end() || iter->second.is_cleared) { + // Not present. Return the default value. + return default_value; + } else { + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, STRING); + return *iter->second.string_value; + } +} + +string* ExtensionSet::MutableString(int number, FieldType type, + const FieldDescriptor* descriptor) { + Extension* extension; + if (MaybeNewExtension(number, descriptor, &extension)) { + extension->type = type; + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); + extension->is_repeated = false; + extension->string_value = new string; + } else { + GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, STRING); + } + extension->is_cleared = false; + return extension->string_value; +} + +const string& ExtensionSet::GetRepeatedString(int number, int index) const { + map::const_iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); + return iter->second.repeated_string_value->Get(index); +} + +string* ExtensionSet::MutableRepeatedString(int number, int index) { + map::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, STRING); + return iter->second.repeated_string_value->Mutable(index); +} + +string* ExtensionSet::AddString(int number, FieldType type, + const FieldDescriptor* descriptor) { + Extension* extension; + if (MaybeNewExtension(number, descriptor, &extension)) { + extension->type = type; + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_STRING); + extension->is_repeated = true; + extension->is_packed = false; + extension->repeated_string_value = new RepeatedPtrField(); + } else { + GOOGLE_DCHECK_TYPE(*extension, REPEATED, STRING); + } + return extension->repeated_string_value->Add(); +} + +// ------------------------------------------------------------------- +// Messages + +const MessageLite& ExtensionSet::GetMessage( + int number, const MessageLite& default_value) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end()) { + // Not present. Return the default value. + return default_value; + } else { + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); + return *iter->second.message_value; + } +} + +// Defined in extension_set_heavy.cc. +// const MessageLite& ExtensionSet::GetMessage(int number, +// const Descriptor* message_type, +// MessageFactory* factory) const + +MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, + const MessageLite& prototype, + const FieldDescriptor* descriptor) { + Extension* extension; + if (MaybeNewExtension(number, descriptor, &extension)) { + extension->type = type; + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); + extension->is_repeated = false; + extension->message_value = prototype.New(); + } else { + GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); + } + extension->is_cleared = false; + return extension->message_value; +} + +// Defined in extension_set_heavy.cc. +// MessageLite* ExtensionSet::MutableMessage(int number, FieldType type, +// const Descriptor* message_type, +// MessageFactory* factory) + +const MessageLite& ExtensionSet::GetRepeatedMessage( + int number, int index) const { + map::const_iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); + return iter->second.repeated_message_value->Get(index); +} + +MessageLite* ExtensionSet::MutableRepeatedMessage(int number, int index) { + map::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + GOOGLE_DCHECK_TYPE(iter->second, REPEATED, MESSAGE); + return iter->second.repeated_message_value->Mutable(index); +} + +MessageLite* ExtensionSet::AddMessage(int number, FieldType type, + const MessageLite& prototype, + const FieldDescriptor* descriptor) { + Extension* extension; + if (MaybeNewExtension(number, descriptor, &extension)) { + extension->type = type; + GOOGLE_DCHECK_EQ(cpp_type(extension->type), WireFormatLite::CPPTYPE_MESSAGE); + extension->is_repeated = true; + extension->repeated_message_value = + new RepeatedPtrField(); + } else { + GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); + } + + // RepeatedPtrField does not know how to Add() since it cannot + // allocate an abstract object, so we have to be tricky. + MessageLite* result = extension->repeated_message_value + ->AddFromCleared >(); + if (result == NULL) { + result = prototype.New(); + extension->repeated_message_value->AddAllocated(result); + } + return result; +} + +// Defined in extension_set_heavy.cc. +// MessageLite* ExtensionSet::AddMessage(int number, FieldType type, +// const Descriptor* message_type, +// MessageFactory* factory) + +#undef GOOGLE_DCHECK_TYPE + +void ExtensionSet::RemoveLast(int number) { + map::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + + Extension* extension = &iter->second; + GOOGLE_DCHECK(extension->is_repeated); + + switch(cpp_type(extension->type)) { + case WireFormatLite::CPPTYPE_INT32: + extension->repeated_int32_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_INT64: + extension->repeated_int64_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_UINT32: + extension->repeated_uint32_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_UINT64: + extension->repeated_uint64_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_FLOAT: + extension->repeated_float_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_DOUBLE: + extension->repeated_double_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_BOOL: + extension->repeated_bool_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_ENUM: + extension->repeated_enum_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_STRING: + extension->repeated_string_value->RemoveLast(); + break; + case WireFormatLite::CPPTYPE_MESSAGE: + extension->repeated_message_value->RemoveLast(); + break; + } +} + +void ExtensionSet::SwapElements(int number, int index1, int index2) { + map::iterator iter = extensions_.find(number); + GOOGLE_CHECK(iter != extensions_.end()) << "Index out-of-bounds (field is empty)."; + + Extension* extension = &iter->second; + GOOGLE_DCHECK(extension->is_repeated); + + switch(cpp_type(extension->type)) { + case WireFormatLite::CPPTYPE_INT32: + extension->repeated_int32_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_INT64: + extension->repeated_int64_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_UINT32: + extension->repeated_uint32_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_UINT64: + extension->repeated_uint64_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_FLOAT: + extension->repeated_float_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_DOUBLE: + extension->repeated_double_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_BOOL: + extension->repeated_bool_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_ENUM: + extension->repeated_enum_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_STRING: + extension->repeated_string_value->SwapElements(index1, index2); + break; + case WireFormatLite::CPPTYPE_MESSAGE: + extension->repeated_message_value->SwapElements(index1, index2); + break; + } +} + +// =================================================================== + +void ExtensionSet::Clear() { + for (map::iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + iter->second.Clear(); + } +} + +void ExtensionSet::MergeFrom(const ExtensionSet& other) { + for (map::const_iterator iter = other.extensions_.begin(); + iter != other.extensions_.end(); ++iter) { + const Extension& other_extension = iter->second; + + if (other_extension.is_repeated) { + Extension* extension; + bool is_new = MaybeNewExtension(iter->first, other_extension.descriptor, + &extension); + if (is_new) { + // Extension did not already exist in set. + extension->type = other_extension.type; + extension->is_repeated = true; + } else { + GOOGLE_DCHECK_EQ(extension->type, other_extension.type); + GOOGLE_DCHECK(extension->is_repeated); + } + + switch (cpp_type(other_extension.type)) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE, REPEATED_TYPE) \ + case WireFormatLite::CPPTYPE_##UPPERCASE: \ + if (is_new) { \ + extension->repeated_##LOWERCASE##_value = \ + new REPEATED_TYPE; \ + } \ + extension->repeated_##LOWERCASE##_value->MergeFrom( \ + *other_extension.repeated_##LOWERCASE##_value); \ + break; + + HANDLE_TYPE( INT32, int32, RepeatedField < int32>); + HANDLE_TYPE( INT64, int64, RepeatedField < int64>); + HANDLE_TYPE( UINT32, uint32, RepeatedField < uint32>); + HANDLE_TYPE( UINT64, uint64, RepeatedField < uint64>); + HANDLE_TYPE( FLOAT, float, RepeatedField < float>); + HANDLE_TYPE( DOUBLE, double, RepeatedField < double>); + HANDLE_TYPE( BOOL, bool, RepeatedField < bool>); + HANDLE_TYPE( ENUM, enum, RepeatedField < int>); + HANDLE_TYPE( STRING, string, RepeatedPtrField< string>); +#undef HANDLE_TYPE + + case WireFormatLite::CPPTYPE_MESSAGE: + if (is_new) { + extension->repeated_message_value = + new RepeatedPtrField(); + } + // We can't call RepeatedPtrField::MergeFrom() because + // it would attempt to allocate new objects. + RepeatedPtrField* other_repeated_message = + other_extension.repeated_message_value; + for (int i = 0; i < other_repeated_message->size(); i++) { + const MessageLite& other_message = other_repeated_message->Get(i); + MessageLite* target = extension->repeated_message_value + ->AddFromCleared >(); + if (target == NULL) { + target = other_message.New(); + extension->repeated_message_value->AddAllocated(target); + } + target->CheckTypeAndMergeFrom(other_message); + } + break; + } + } else { + if (!other_extension.is_cleared) { + switch (cpp_type(other_extension.type)) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE, CAMELCASE) \ + case WireFormatLite::CPPTYPE_##UPPERCASE: \ + Set##CAMELCASE(iter->first, other_extension.type, \ + other_extension.LOWERCASE##_value, \ + other_extension.descriptor); \ + break; + + HANDLE_TYPE( INT32, int32, Int32); + HANDLE_TYPE( INT64, int64, Int64); + HANDLE_TYPE(UINT32, uint32, UInt32); + HANDLE_TYPE(UINT64, uint64, UInt64); + HANDLE_TYPE( FLOAT, float, Float); + HANDLE_TYPE(DOUBLE, double, Double); + HANDLE_TYPE( BOOL, bool, Bool); + HANDLE_TYPE( ENUM, enum, Enum); +#undef HANDLE_TYPE + case WireFormatLite::CPPTYPE_STRING: + SetString(iter->first, other_extension.type, + *other_extension.string_value, + other_extension.descriptor); + break; + case WireFormatLite::CPPTYPE_MESSAGE: + MutableMessage(iter->first, other_extension.type, + *other_extension.message_value, + other_extension.descriptor) + ->CheckTypeAndMergeFrom(*other_extension.message_value); + break; + } + } + } + } +} + +void ExtensionSet::Swap(ExtensionSet* x) { + extensions_.swap(x->extensions_); +} + +bool ExtensionSet::IsInitialized() const { + // Extensions are never required. However, we need to check that all + // embedded messages are initialized. + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + const Extension& extension = iter->second; + if (cpp_type(extension.type) == WireFormatLite::CPPTYPE_MESSAGE) { + if (extension.is_repeated) { + for (int i = 0; i < extension.repeated_message_value->size(); i++) { + if (!extension.repeated_message_value->Get(i).IsInitialized()) { + return false; + } + } + } else { + if (!extension.is_cleared) { + if (!extension.message_value->IsInitialized()) return false; + } + } + } + } + + return true; +} + +bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, + ExtensionFinder* extension_finder, + FieldSkipper* field_skipper) { + int number = WireFormatLite::GetTagFieldNumber(tag); + WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); + + ExtensionInfo extension; + bool is_unknown; + if (!extension_finder->Find(number, &extension)) { + is_unknown = true; + } else if (extension.is_packed) { + is_unknown = (wire_type != WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + } else { + WireFormatLite::WireType expected_wire_type = + WireFormatLite::WireTypeForFieldType(real_type(extension.type)); + is_unknown = (wire_type != expected_wire_type); + } + + if (is_unknown) { + field_skipper->SkipField(input, tag); + } else if (extension.is_packed) { + uint32 size; + if (!input->ReadVarint32(&size)) return false; + io::CodedInputStream::Limit limit = input->PushLimit(size); + + switch (extension.type) { +#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + while (input->BytesUntilLimit() > 0) { \ + CPP_LOWERCASE value; \ + if (!WireFormatLite::ReadPrimitive< \ + CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ + input, &value)) return false; \ + Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ + true, value, extension.descriptor); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, Int32, int32); + HANDLE_TYPE( SINT64, Int64, int64); + HANDLE_TYPE( FIXED32, UInt32, uint32); + HANDLE_TYPE( FIXED64, UInt64, uint64); + HANDLE_TYPE(SFIXED32, Int32, int32); + HANDLE_TYPE(SFIXED64, Int64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); +#undef HANDLE_TYPE + + case WireFormatLite::TYPE_ENUM: + while (input->BytesUntilLimit() > 0) { + int value; + if (!WireFormatLite::ReadPrimitive( + input, &value)) return false; + if (extension.enum_validity_check.func( + extension.enum_validity_check.arg, value)) { + AddEnum(number, WireFormatLite::TYPE_ENUM, true, value, + extension.descriptor); + } + } + break; + + case WireFormatLite::TYPE_STRING: + case WireFormatLite::TYPE_BYTES: + case WireFormatLite::TYPE_GROUP: + case WireFormatLite::TYPE_MESSAGE: + GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; + break; + } + + input->PopLimit(limit); + } else { + switch (extension.type) { +#define HANDLE_TYPE(UPPERCASE, CPP_CAMELCASE, CPP_LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: { \ + CPP_LOWERCASE value; \ + if (!WireFormatLite::ReadPrimitive< \ + CPP_LOWERCASE, WireFormatLite::TYPE_##UPPERCASE>( \ + input, &value)) return false; \ + if (extension.is_repeated) { \ + Add##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, \ + false, value, extension.descriptor); \ + } else { \ + Set##CPP_CAMELCASE(number, WireFormatLite::TYPE_##UPPERCASE, value, \ + extension.descriptor); \ + } \ + } break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, Int32, int32); + HANDLE_TYPE( SINT64, Int64, int64); + HANDLE_TYPE( FIXED32, UInt32, uint32); + HANDLE_TYPE( FIXED64, UInt64, uint64); + HANDLE_TYPE(SFIXED32, Int32, int32); + HANDLE_TYPE(SFIXED64, Int64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); +#undef HANDLE_TYPE + + case WireFormatLite::TYPE_ENUM: { + int value; + if (!WireFormatLite::ReadPrimitive( + input, &value)) return false; + + if (!extension.enum_validity_check.func( + extension.enum_validity_check.arg, value)) { + // Invalid value. Treat as unknown. + field_skipper->SkipUnknownEnum(number, value); + } else if (extension.is_repeated) { + AddEnum(number, WireFormatLite::TYPE_ENUM, false, value, + extension.descriptor); + } else { + SetEnum(number, WireFormatLite::TYPE_ENUM, value, + extension.descriptor); + } + break; + } + + case WireFormatLite::TYPE_STRING: { + string* value = extension.is_repeated ? + AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) : + MutableString(number, WireFormatLite::TYPE_STRING, + extension.descriptor); + if (!WireFormatLite::ReadString(input, value)) return false; + break; + } + + case WireFormatLite::TYPE_BYTES: { + string* value = extension.is_repeated ? + AddString(number, WireFormatLite::TYPE_STRING, extension.descriptor) : + MutableString(number, WireFormatLite::TYPE_STRING, + extension.descriptor); + if (!WireFormatLite::ReadBytes(input, value)) return false; + break; + } + + case WireFormatLite::TYPE_GROUP: { + MessageLite* value = extension.is_repeated ? + AddMessage(number, WireFormatLite::TYPE_GROUP, + *extension.message_prototype, extension.descriptor) : + MutableMessage(number, WireFormatLite::TYPE_GROUP, + *extension.message_prototype, extension.descriptor); + if (!WireFormatLite::ReadGroup(number, input, value)) return false; + break; + } + + case WireFormatLite::TYPE_MESSAGE: { + MessageLite* value = extension.is_repeated ? + AddMessage(number, WireFormatLite::TYPE_MESSAGE, + *extension.message_prototype, extension.descriptor) : + MutableMessage(number, WireFormatLite::TYPE_MESSAGE, + *extension.message_prototype, extension.descriptor); + if (!WireFormatLite::ReadMessage(input, value)) return false; + break; + } + } + } + + return true; +} + +bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, + const MessageLite* containing_type) { + FieldSkipper skipper; + GeneratedExtensionFinder finder(containing_type); + return ParseField(tag, input, &finder, &skipper); +} + +// Defined in extension_set_heavy.cc. +// bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, +// const MessageLite* containing_type, +// UnknownFieldSet* unknown_fields) + +bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, + ExtensionFinder* extension_finder, + FieldSkipper* field_skipper) { + while (true) { + uint32 tag = input->ReadTag(); + switch (tag) { + case 0: + return true; + case WireFormatLite::kMessageSetItemStartTag: + if (!ParseMessageSetItem(input, extension_finder, field_skipper)) { + return false; + } + break; + default: + if (!ParseField(tag, input, extension_finder, field_skipper)) { + return false; + } + break; + } + } +} + +bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, + const MessageLite* containing_type) { + FieldSkipper skipper; + GeneratedExtensionFinder finder(containing_type); + return ParseMessageSet(input, &finder, &skipper); +} + +// Defined in extension_set_heavy.cc. +// bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, +// const MessageLite* containing_type, +// UnknownFieldSet* unknown_fields); + +bool ExtensionSet::ParseMessageSetItem(io::CodedInputStream* input, + ExtensionFinder* extension_finder, + FieldSkipper* field_skipper) { + // TODO(kenton): It would be nice to share code between this and + // WireFormatLite::ParseAndMergeMessageSetItem(), but I think the + // differences would be hard to factor out. + + // This method parses a group which should contain two fields: + // required int32 type_id = 2; + // required data message = 3; + + // Once we see a type_id, we'll construct a fake tag for this extension + // which is the tag it would have had under the proto2 extensions wire + // format. + uint32 fake_tag = 0; + + // If we see message data before the type_id, we'll append it to this so + // we can parse it later. This will probably never happen in practice, + // as no MessageSet encoder I know of writes the message before the type ID. + // But, it's technically valid so we should allow it. + // TODO(kenton): Use a Cord instead? Do I care? + string message_data; + + while (true) { + uint32 tag = input->ReadTag(); + if (tag == 0) return false; + + switch (tag) { + case WireFormatLite::kMessageSetTypeIdTag: { + uint32 type_id; + if (!input->ReadVarint32(&type_id)) return false; + fake_tag = WireFormatLite::MakeTag(type_id, + WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + + if (!message_data.empty()) { + // We saw some message data before the type_id. Have to parse it + // now. + io::CodedInputStream sub_input( + reinterpret_cast(message_data.data()), + message_data.size()); + if (!ParseField(fake_tag, &sub_input, + extension_finder, field_skipper)) { + return false; + } + message_data.clear(); + } + + break; + } + + case WireFormatLite::kMessageSetMessageTag: { + if (fake_tag == 0) { + // We haven't seen a type_id yet. Append this data to message_data. + string temp; + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->ReadString(&temp, length)) return false; + message_data.append(temp); + } else { + // Already saw type_id, so we can parse this directly. + if (!ParseField(fake_tag, input, + extension_finder, field_skipper)) { + return false; + } + } + + break; + } + + case WireFormatLite::kMessageSetItemEndTag: { + return true; + } + + default: { + if (!field_skipper->SkipField(input, tag)) return false; + } + } + } +} + +void ExtensionSet::SerializeWithCachedSizes( + int start_field_number, int end_field_number, + io::CodedOutputStream* output) const { + map::const_iterator iter; + for (iter = extensions_.lower_bound(start_field_number); + iter != extensions_.end() && iter->first < end_field_number; + ++iter) { + iter->second.SerializeFieldWithCachedSizes(iter->first, output); + } +} + +void ExtensionSet::SerializeMessageSetWithCachedSizes( + io::CodedOutputStream* output) const { + map::const_iterator iter; + for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { + iter->second.SerializeMessageSetItemWithCachedSizes(iter->first, output); + } +} + +int ExtensionSet::ByteSize() const { + int total_size = 0; + + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + total_size += iter->second.ByteSize(iter->first); + } + + return total_size; +} + +int ExtensionSet::MessageSetByteSize() const { + int total_size = 0; + + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + total_size += iter->second.MessageSetItemByteSize(iter->first); + } + + return total_size; +} + +// Defined in extension_set_heavy.cc. +// int ExtensionSet::SpaceUsedExcludingSelf() const + +bool ExtensionSet::MaybeNewExtension(int number, + const FieldDescriptor* descriptor, + Extension** result) { + pair::iterator, bool> insert_result = + extensions_.insert(make_pair(number, Extension())); + *result = &insert_result.first->second; + (*result)->descriptor = descriptor; + return insert_result.second; +} + +// =================================================================== +// Methods of ExtensionSet::Extension + +void ExtensionSet::Extension::Clear() { + if (is_repeated) { + switch (cpp_type(type)) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case WireFormatLite::CPPTYPE_##UPPERCASE: \ + repeated_##LOWERCASE##_value->Clear(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE( UINT32, uint32); + HANDLE_TYPE( UINT64, uint64); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( DOUBLE, double); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, enum); + HANDLE_TYPE( STRING, string); + HANDLE_TYPE(MESSAGE, message); +#undef HANDLE_TYPE + } + } else { + if (!is_cleared) { + switch (cpp_type(type)) { + case WireFormatLite::CPPTYPE_STRING: + string_value->clear(); + break; + case WireFormatLite::CPPTYPE_MESSAGE: + message_value->Clear(); + break; + default: + // No need to do anything. Get*() will return the default value + // as long as is_cleared is true and Set*() will overwrite the + // previous value. + break; + } + + is_cleared = true; + } + } +} + +void ExtensionSet::Extension::SerializeFieldWithCachedSizes( + int number, + io::CodedOutputStream* output) const { + if (is_repeated) { + if (is_packed) { + if (cached_size == 0) return; + + WireFormatLite::WriteTag(number, + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(cached_size); + + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + WireFormatLite::Write##CAMELCASE##NoTag( \ + repeated_##LOWERCASE##_value->Get(i), output); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); + HANDLE_TYPE( ENUM, Enum, enum); +#undef HANDLE_TYPE + + case WireFormatLite::TYPE_STRING: + case WireFormatLite::TYPE_BYTES: + case WireFormatLite::TYPE_GROUP: + case WireFormatLite::TYPE_MESSAGE: + GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; + break; + } + } else { + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + WireFormatLite::Write##CAMELCASE(number, \ + repeated_##LOWERCASE##_value->Get(i), output); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); + HANDLE_TYPE( STRING, String, string); + HANDLE_TYPE( BYTES, Bytes, string); + HANDLE_TYPE( ENUM, Enum, enum); + HANDLE_TYPE( GROUP, Group, message); + HANDLE_TYPE( MESSAGE, Message, message); +#undef HANDLE_TYPE + } + } + } else if (!is_cleared) { + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + WireFormatLite::Write##CAMELCASE(number, VALUE, output); \ + break + + HANDLE_TYPE( INT32, Int32, int32_value); + HANDLE_TYPE( INT64, Int64, int64_value); + HANDLE_TYPE( UINT32, UInt32, uint32_value); + HANDLE_TYPE( UINT64, UInt64, uint64_value); + HANDLE_TYPE( SINT32, SInt32, int32_value); + HANDLE_TYPE( SINT64, SInt64, int64_value); + HANDLE_TYPE( FIXED32, Fixed32, uint32_value); + HANDLE_TYPE( FIXED64, Fixed64, uint64_value); + HANDLE_TYPE(SFIXED32, SFixed32, int32_value); + HANDLE_TYPE(SFIXED64, SFixed64, int64_value); + HANDLE_TYPE( FLOAT, Float, float_value); + HANDLE_TYPE( DOUBLE, Double, double_value); + HANDLE_TYPE( BOOL, Bool, bool_value); + HANDLE_TYPE( STRING, String, *string_value); + HANDLE_TYPE( BYTES, Bytes, *string_value); + HANDLE_TYPE( ENUM, Enum, enum_value); + HANDLE_TYPE( GROUP, Group, *message_value); + HANDLE_TYPE( MESSAGE, Message, *message_value); +#undef HANDLE_TYPE + } + } +} + +void ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizes( + int number, + io::CodedOutputStream* output) const { + if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { + // Not a valid MessageSet extension, but serialize it the normal way. + SerializeFieldWithCachedSizes(number, output); + return; + } + + if (is_cleared) return; + + // Start group. + output->WriteTag(WireFormatLite::kMessageSetItemStartTag); + + // Write type ID. + WireFormatLite::WriteUInt32(WireFormatLite::kMessageSetTypeIdNumber, + number, + output); + // Write message. + WireFormatLite::WriteMessageMaybeToArray( + WireFormatLite::kMessageSetMessageNumber, + *message_value, + output); + + // End group. + output->WriteTag(WireFormatLite::kMessageSetItemEndTag); +} + +int ExtensionSet::Extension::ByteSize(int number) const { + int result = 0; + + if (is_repeated) { + if (is_packed) { + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + result += WireFormatLite::CAMELCASE##Size( \ + repeated_##LOWERCASE##_value->Get(i)); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( ENUM, Enum, enum); +#undef HANDLE_TYPE + + // Stuff with fixed size. +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + result += WireFormatLite::k##CAMELCASE##Size * \ + repeated_##LOWERCASE##_value->size(); \ + break + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); +#undef HANDLE_TYPE + + case WireFormatLite::TYPE_STRING: + case WireFormatLite::TYPE_BYTES: + case WireFormatLite::TYPE_GROUP: + case WireFormatLite::TYPE_MESSAGE: + GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; + break; + } + + cached_size = result; + if (result > 0) { + result += io::CodedOutputStream::VarintSize32(result); + result += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(number, + WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); + } + } else { + int tag_size = WireFormatLite::TagSize(number, real_type(type)); + + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + result += tag_size * repeated_##LOWERCASE##_value->size(); \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + result += WireFormatLite::CAMELCASE##Size( \ + repeated_##LOWERCASE##_value->Get(i)); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( STRING, String, string); + HANDLE_TYPE( BYTES, Bytes, string); + HANDLE_TYPE( ENUM, Enum, enum); + HANDLE_TYPE( GROUP, Group, message); + HANDLE_TYPE( MESSAGE, Message, message); +#undef HANDLE_TYPE + + // Stuff with fixed size. +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + result += (tag_size + WireFormatLite::k##CAMELCASE##Size) * \ + repeated_##LOWERCASE##_value->size(); \ + break + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); +#undef HANDLE_TYPE + } + } + } else if (!is_cleared) { + result += WireFormatLite::TagSize(number, real_type(type)); + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + result += WireFormatLite::CAMELCASE##Size(LOWERCASE); \ + break + + HANDLE_TYPE( INT32, Int32, int32_value); + HANDLE_TYPE( INT64, Int64, int64_value); + HANDLE_TYPE( UINT32, UInt32, uint32_value); + HANDLE_TYPE( UINT64, UInt64, uint64_value); + HANDLE_TYPE( SINT32, SInt32, int32_value); + HANDLE_TYPE( SINT64, SInt64, int64_value); + HANDLE_TYPE( STRING, String, *string_value); + HANDLE_TYPE( BYTES, Bytes, *string_value); + HANDLE_TYPE( ENUM, Enum, enum_value); + HANDLE_TYPE( GROUP, Group, *message_value); + HANDLE_TYPE( MESSAGE, Message, *message_value); +#undef HANDLE_TYPE + + // Stuff with fixed size. +#define HANDLE_TYPE(UPPERCASE, CAMELCASE) \ + case WireFormatLite::TYPE_##UPPERCASE: \ + result += WireFormatLite::k##CAMELCASE##Size; \ + break + HANDLE_TYPE( FIXED32, Fixed32); + HANDLE_TYPE( FIXED64, Fixed64); + HANDLE_TYPE(SFIXED32, SFixed32); + HANDLE_TYPE(SFIXED64, SFixed64); + HANDLE_TYPE( FLOAT, Float); + HANDLE_TYPE( DOUBLE, Double); + HANDLE_TYPE( BOOL, Bool); +#undef HANDLE_TYPE + } + } + + return result; +} + +int ExtensionSet::Extension::MessageSetItemByteSize(int number) const { + if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { + // Not a valid MessageSet extension, but compute the byte size for it the + // normal way. + return ByteSize(number); + } + + if (is_cleared) return 0; + + int our_size = WireFormatLite::kMessageSetItemTagsSize; + + // type_id + our_size += io::CodedOutputStream::VarintSize32(number); + + // message + int message_size = message_value->ByteSize(); + + our_size += io::CodedOutputStream::VarintSize32(message_size); + our_size += message_size; + + return our_size; +} + +int ExtensionSet::Extension::GetSize() const { + GOOGLE_DCHECK(is_repeated); + switch (cpp_type(type)) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case WireFormatLite::CPPTYPE_##UPPERCASE: \ + return repeated_##LOWERCASE##_value->size() + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE( UINT32, uint32); + HANDLE_TYPE( UINT64, uint64); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( DOUBLE, double); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, enum); + HANDLE_TYPE( STRING, string); + HANDLE_TYPE(MESSAGE, message); +#undef HANDLE_TYPE + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return 0; +} + +void ExtensionSet::Extension::Free() { + if (is_repeated) { + switch (cpp_type(type)) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case WireFormatLite::CPPTYPE_##UPPERCASE: \ + delete repeated_##LOWERCASE##_value; \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE( UINT32, uint32); + HANDLE_TYPE( UINT64, uint64); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( DOUBLE, double); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, enum); + HANDLE_TYPE( STRING, string); + HANDLE_TYPE(MESSAGE, message); +#undef HANDLE_TYPE + } + } else { + switch (cpp_type(type)) { + case WireFormatLite::CPPTYPE_STRING: + delete string_value; + break; + case WireFormatLite::CPPTYPE_MESSAGE: + delete message_value; + break; + default: + break; + } + } +} + +// Defined in extension_set_heavy.cc. +// int ExtensionSet::Extension::SpaceUsedExcludingSelf() const + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h new file mode 100644 index 000000000..ac1ada029 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h @@ -0,0 +1,904 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_EXTENSION_SET_H__ +#define GOOGLE_PROTOBUF_EXTENSION_SET_H__ + +#include +#include +#include +#include + + +#include + +namespace google { + +namespace protobuf { + class Descriptor; // descriptor.h + class FieldDescriptor; // descriptor.h + class DescriptorPool; // descriptor.h + class MessageLite; // message_lite.h + class Message; // message.h + class MessageFactory; // message.h + class UnknownFieldSet; // unknown_field_set.h + namespace io { + class CodedInputStream; // coded_stream.h + class CodedOutputStream; // coded_stream.h + } + namespace internal { + class FieldSkipper; // wire_format_lite.h + class RepeatedPtrFieldBase; // repeated_field.h + } + template class RepeatedField; // repeated_field.h + template class RepeatedPtrField; // repeated_field.h +} + +namespace protobuf { +namespace internal { + +// Used to store values of type WireFormatLite::FieldType without having to +// #include wire_format_lite.h. Also, ensures that we use only one byte to +// store these values, which is important to keep the layout of +// ExtensionSet::Extension small. +typedef uint8 FieldType; + +// A function which, given an integer value, returns true if the number +// matches one of the defined values for the corresponding enum type. This +// is used with RegisterEnumExtension, below. +typedef bool EnumValidityFunc(int number); + +// Version of the above which takes an argument. This is needed to deal with +// extensions that are not compiled in. +typedef bool EnumValidityFuncWithArg(const void* arg, int number); + +// Information about a registered extension. +struct ExtensionInfo { + inline ExtensionInfo() {} + inline ExtensionInfo(FieldType type, bool is_repeated, bool is_packed) + : type(type), is_repeated(is_repeated), is_packed(is_packed), + descriptor(NULL) {} + + FieldType type; + bool is_repeated; + bool is_packed; + + struct EnumValidityCheck { + EnumValidityFuncWithArg* func; + const void* arg; + }; + + union { + EnumValidityCheck enum_validity_check; + const MessageLite* message_prototype; + }; + + // The descriptor for this extension, if one exists and is known. May be + // NULL. Must not be NULL if the descriptor for the extension does not + // live in the same pool as the descriptor for the containing type. + const FieldDescriptor* descriptor; +}; + +// Abstract interface for an object which looks up extension definitions. Used +// when parsing. +class LIBPROTOBUF_EXPORT ExtensionFinder { + public: + virtual ~ExtensionFinder(); + + // Find the extension with the given containing type and number. + virtual bool Find(int number, ExtensionInfo* output) = 0; +}; + +// Implementation of ExtensionFinder which finds extensions defined in .proto +// files which have been compiled into the binary. +class LIBPROTOBUF_EXPORT GeneratedExtensionFinder : public ExtensionFinder { + public: + GeneratedExtensionFinder(const MessageLite* containing_type) + : containing_type_(containing_type) {} + virtual ~GeneratedExtensionFinder() {} + + // Returns true and fills in *output if found, otherwise returns false. + virtual bool Find(int number, ExtensionInfo* output); + + private: + const MessageLite* containing_type_; +}; + +// Note: extension_set_heavy.cc defines DescriptorPoolExtensionFinder for +// finding extensions from a DescriptorPool. + +// This is an internal helper class intended for use within the protocol buffer +// library and generated classes. Clients should not use it directly. Instead, +// use the generated accessors such as GetExtension() of the class being +// extended. +// +// This class manages extensions for a protocol message object. The +// message's HasExtension(), GetExtension(), MutableExtension(), and +// ClearExtension() methods are just thin wrappers around the embedded +// ExtensionSet. When parsing, if a tag number is encountered which is +// inside one of the message type's extension ranges, the tag is passed +// off to the ExtensionSet for parsing. Etc. +class LIBPROTOBUF_EXPORT ExtensionSet { + public: + ExtensionSet(); + ~ExtensionSet(); + + // These are called at startup by protocol-compiler-generated code to + // register known extensions. The registrations are used by ParseField() + // to look up extensions for parsed field numbers. Note that dynamic parsing + // does not use ParseField(); only protocol-compiler-generated parsing + // methods do. + static void RegisterExtension(const MessageLite* containing_type, + int number, FieldType type, + bool is_repeated, bool is_packed); + static void RegisterEnumExtension(const MessageLite* containing_type, + int number, FieldType type, + bool is_repeated, bool is_packed, + EnumValidityFunc* is_valid); + static void RegisterMessageExtension(const MessageLite* containing_type, + int number, FieldType type, + bool is_repeated, bool is_packed, + const MessageLite* prototype); + + // ================================================================= + + // Add all fields which are currently present to the given vector. This + // is useful to implement Reflection::ListFields(). + void AppendToList(const Descriptor* containing_type, + const DescriptorPool* pool, + vector* output) const; + + // ================================================================= + // Accessors + // + // Generated message classes include type-safe templated wrappers around + // these methods. Generally you should use those rather than call these + // directly, unless you are doing low-level memory management. + // + // When calling any of these accessors, the extension number requested + // MUST exist in the DescriptorPool provided to the constructor. Otheriwse, + // the method will fail an assert. Normally, though, you would not call + // these directly; you would either call the generated accessors of your + // message class (e.g. GetExtension()) or you would call the accessors + // of the reflection interface. In both cases, it is impossible to + // trigger this assert failure: the generated accessors only accept + // linked-in extension types as parameters, while the Reflection interface + // requires you to provide the FieldDescriptor describing the extension. + // + // When calling any of these accessors, a protocol-compiler-generated + // implementation of the extension corresponding to the number MUST + // be linked in, and the FieldDescriptor used to refer to it MUST be + // the one generated by that linked-in code. Otherwise, the method will + // die on an assert failure. The message objects returned by the message + // accessors are guaranteed to be of the correct linked-in type. + // + // These methods pretty much match Reflection except that: + // - They're not virtual. + // - They identify fields by number rather than FieldDescriptors. + // - They identify enum values using integers rather than descriptors. + // - Strings provide Mutable() in addition to Set() accessors. + + bool Has(int number) const; + int ExtensionSize(int number) const; // Size of a repeated extension. + FieldType ExtensionType(int number) const; + void ClearExtension(int number); + + // singular fields ------------------------------------------------- + + int32 GetInt32 (int number, int32 default_value) const; + int64 GetInt64 (int number, int64 default_value) const; + uint32 GetUInt32(int number, uint32 default_value) const; + uint64 GetUInt64(int number, uint64 default_value) const; + float GetFloat (int number, float default_value) const; + double GetDouble(int number, double default_value) const; + bool GetBool (int number, bool default_value) const; + int GetEnum (int number, int default_value) const; + const string & GetString (int number, const string& default_value) const; + const MessageLite& GetMessage(int number, + const MessageLite& default_value) const; + const MessageLite& GetMessage(int number, const Descriptor* message_type, + MessageFactory* factory) const; + + // |descriptor| may be NULL so long as it is known that the descriptor for + // the extension lives in the same pool as the descriptor for the containing + // type. +#define desc const FieldDescriptor* descriptor // avoid line wrapping + void SetInt32 (int number, FieldType type, int32 value, desc); + void SetInt64 (int number, FieldType type, int64 value, desc); + void SetUInt32(int number, FieldType type, uint32 value, desc); + void SetUInt64(int number, FieldType type, uint64 value, desc); + void SetFloat (int number, FieldType type, float value, desc); + void SetDouble(int number, FieldType type, double value, desc); + void SetBool (int number, FieldType type, bool value, desc); + void SetEnum (int number, FieldType type, int value, desc); + void SetString(int number, FieldType type, const string& value, desc); + string * MutableString (int number, FieldType type, desc); + MessageLite* MutableMessage(int number, FieldType type, + const MessageLite& prototype, desc); + MessageLite* MutableMessage(const FieldDescriptor* decsriptor, + MessageFactory* factory); +#undef desc + + // repeated fields ------------------------------------------------- + + int32 GetRepeatedInt32 (int number, int index) const; + int64 GetRepeatedInt64 (int number, int index) const; + uint32 GetRepeatedUInt32(int number, int index) const; + uint64 GetRepeatedUInt64(int number, int index) const; + float GetRepeatedFloat (int number, int index) const; + double GetRepeatedDouble(int number, int index) const; + bool GetRepeatedBool (int number, int index) const; + int GetRepeatedEnum (int number, int index) const; + const string & GetRepeatedString (int number, int index) const; + const MessageLite& GetRepeatedMessage(int number, int index) const; + + void SetRepeatedInt32 (int number, int index, int32 value); + void SetRepeatedInt64 (int number, int index, int64 value); + void SetRepeatedUInt32(int number, int index, uint32 value); + void SetRepeatedUInt64(int number, int index, uint64 value); + void SetRepeatedFloat (int number, int index, float value); + void SetRepeatedDouble(int number, int index, double value); + void SetRepeatedBool (int number, int index, bool value); + void SetRepeatedEnum (int number, int index, int value); + void SetRepeatedString(int number, int index, const string& value); + string * MutableRepeatedString (int number, int index); + MessageLite* MutableRepeatedMessage(int number, int index); + +#define desc const FieldDescriptor* descriptor // avoid line wrapping + void AddInt32 (int number, FieldType type, bool packed, int32 value, desc); + void AddInt64 (int number, FieldType type, bool packed, int64 value, desc); + void AddUInt32(int number, FieldType type, bool packed, uint32 value, desc); + void AddUInt64(int number, FieldType type, bool packed, uint64 value, desc); + void AddFloat (int number, FieldType type, bool packed, float value, desc); + void AddDouble(int number, FieldType type, bool packed, double value, desc); + void AddBool (int number, FieldType type, bool packed, bool value, desc); + void AddEnum (int number, FieldType type, bool packed, int value, desc); + void AddString(int number, FieldType type, const string& value, desc); + string * AddString (int number, FieldType type, desc); + MessageLite* AddMessage(int number, FieldType type, + const MessageLite& prototype, desc); + MessageLite* AddMessage(const FieldDescriptor* descriptor, + MessageFactory* factory); +#undef desc + + void RemoveLast(int number); + void SwapElements(int number, int index1, int index2); + + // ----------------------------------------------------------------- + // TODO(kenton): Hardcore memory management accessors + + // ================================================================= + // convenience methods for implementing methods of Message + // + // These could all be implemented in terms of the other methods of this + // class, but providing them here helps keep the generated code size down. + + void Clear(); + void MergeFrom(const ExtensionSet& other); + void Swap(ExtensionSet* other); + bool IsInitialized() const; + + // Parses a single extension from the input. The input should start out + // positioned immediately after the tag. |containing_type| is the default + // instance for the containing message; it is used only to look up the + // extension by number. See RegisterExtension(), above. Unlike the other + // methods of ExtensionSet, this only works for generated message types -- + // it looks up extensions registered using RegisterExtension(). + bool ParseField(uint32 tag, io::CodedInputStream* input, + ExtensionFinder* extension_finder, + FieldSkipper* field_skipper); + + // Specific versions for lite or full messages (constructs the appropriate + // FieldSkipper automatically). + bool ParseField(uint32 tag, io::CodedInputStream* input, + const MessageLite* containing_type); + bool ParseField(uint32 tag, io::CodedInputStream* input, + const Message* containing_type, + UnknownFieldSet* unknown_fields); + + // Parse an entire message in MessageSet format. Such messages have no + // fields, only extensions. + bool ParseMessageSet(io::CodedInputStream* input, + ExtensionFinder* extension_finder, + FieldSkipper* field_skipper); + + // Specific versions for lite or full messages (constructs the appropriate + // FieldSkipper automatically). + bool ParseMessageSet(io::CodedInputStream* input, + const MessageLite* containing_type); + bool ParseMessageSet(io::CodedInputStream* input, + const Message* containing_type, + UnknownFieldSet* unknown_fields); + + // Write all extension fields with field numbers in the range + // [start_field_number, end_field_number) + // to the output stream, using the cached sizes computed when ByteSize() was + // last called. Note that the range bounds are inclusive-exclusive. + void SerializeWithCachedSizes(int start_field_number, + int end_field_number, + io::CodedOutputStream* output) const; + + // Same as SerializeWithCachedSizes, but without any bounds checking. + // The caller must ensure that target has sufficient capacity for the + // serialized extensions. + // + // Returns a pointer past the last written byte. + uint8* SerializeWithCachedSizesToArray(int start_field_number, + int end_field_number, + uint8* target) const; + + // Like above but serializes in MessageSet format. + void SerializeMessageSetWithCachedSizes(io::CodedOutputStream* output) const; + uint8* SerializeMessageSetWithCachedSizesToArray(uint8* target) const; + + // Returns the total serialized size of all the extensions. + int ByteSize() const; + + // Like ByteSize() but uses MessageSet format. + int MessageSetByteSize() const; + + // Returns (an estimate of) the total number of bytes used for storing the + // extensions in memory, excluding sizeof(*this). If the ExtensionSet is + // for a lite message (and thus possibly contains lite messages), the results + // are undefined (might work, might crash, might corrupt data, might not even + // be linked in). It's up to the protocol compiler to avoid calling this on + // such ExtensionSets (easy enough since lite messages don't implement + // SpaceUsed()). + int SpaceUsedExcludingSelf() const; + + private: + + struct Extension { + union { + int32 int32_value; + int64 int64_value; + uint32 uint32_value; + uint64 uint64_value; + float float_value; + double double_value; + bool bool_value; + int enum_value; + string* string_value; + MessageLite* message_value; + + RepeatedField * repeated_int32_value; + RepeatedField * repeated_int64_value; + RepeatedField * repeated_uint32_value; + RepeatedField * repeated_uint64_value; + RepeatedField * repeated_float_value; + RepeatedField * repeated_double_value; + RepeatedField * repeated_bool_value; + RepeatedField * repeated_enum_value; + RepeatedPtrField* repeated_string_value; + RepeatedPtrField* repeated_message_value; + }; + + FieldType type; + bool is_repeated; + + // For singular types, indicates if the extension is "cleared". This + // happens when an extension is set and then later cleared by the caller. + // We want to keep the Extension object around for reuse, so instead of + // removing it from the map, we just set is_cleared = true. This has no + // meaning for repeated types; for those, the size of the RepeatedField + // simply becomes zero when cleared. + bool is_cleared; + + // For repeated types, this indicates if the [packed=true] option is set. + bool is_packed; + + // The descriptor for this extension, if one exists and is known. May be + // NULL. Must not be NULL if the descriptor for the extension does not + // live in the same pool as the descriptor for the containing type. + const FieldDescriptor* descriptor; + + // For packed fields, the size of the packed data is recorded here when + // ByteSize() is called then used during serialization. + // TODO(kenton): Use atomic when C++ supports it. + mutable int cached_size; + + // Some helper methods for operations on a single Extension. + void SerializeFieldWithCachedSizes( + int number, + io::CodedOutputStream* output) const; + uint8* SerializeFieldWithCachedSizesToArray( + int number, + uint8* target) const; + void SerializeMessageSetItemWithCachedSizes( + int number, + io::CodedOutputStream* output) const; + uint8* SerializeMessageSetItemWithCachedSizesToArray( + int number, + uint8* target) const; + int ByteSize(int number) const; + int MessageSetItemByteSize(int number) const; + void Clear(); + int GetSize() const; + void Free(); + int SpaceUsedExcludingSelf() const; + }; + + + // Gets the extension with the given number, creating it if it does not + // already exist. Returns true if the extension did not already exist. + bool MaybeNewExtension(int number, const FieldDescriptor* descriptor, + Extension** result); + + // Parse a single MessageSet item -- called just after the item group start + // tag has been read. + bool ParseMessageSetItem(io::CodedInputStream* input, + ExtensionFinder* extension_finder, + FieldSkipper* field_skipper); + + + // Hack: RepeatedPtrFieldBase declares ExtensionSet as a friend. This + // friendship should automatically extend to ExtensionSet::Extension, but + // unfortunately some older compilers (e.g. GCC 3.4.4) do not implement this + // correctly. So, we must provide helpers for calling methods of that + // class. + + // Defined in extension_set_heavy.cc. + static inline int RepeatedMessage_SpaceUsedExcludingSelf( + RepeatedPtrFieldBase* field); + + // The Extension struct is small enough to be passed by value, so we use it + // directly as the value type in the map rather than use pointers. We use + // a map rather than hash_map here because we expect most ExtensionSets will + // only contain a small number of extensions whereas hash_map is optimized + // for 100 elements or more. Also, we want AppendToList() to order fields + // by field number. + map extensions_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ExtensionSet); +}; + +// These are just for convenience... +inline void ExtensionSet::SetString(int number, FieldType type, + const string& value, + const FieldDescriptor* descriptor) { + MutableString(number, type, descriptor)->assign(value); +} +inline void ExtensionSet::SetRepeatedString(int number, int index, + const string& value) { + MutableRepeatedString(number, index)->assign(value); +} +inline void ExtensionSet::AddString(int number, FieldType type, + const string& value, + const FieldDescriptor* descriptor) { + AddString(number, type, descriptor)->assign(value); +} + +// =================================================================== +// Glue for generated extension accessors + +// ------------------------------------------------------------------- +// Template magic + +// First we have a set of classes representing "type traits" for different +// field types. A type traits class knows how to implement basic accessors +// for extensions of a particular type given an ExtensionSet. The signature +// for a type traits class looks like this: +// +// class TypeTraits { +// public: +// typedef ? ConstType; +// typedef ? MutableType; +// +// static inline ConstType Get(int number, const ExtensionSet& set); +// static inline void Set(int number, ConstType value, ExtensionSet* set); +// static inline MutableType Mutable(int number, ExtensionSet* set); +// +// // Variants for repeated fields. +// static inline ConstType Get(int number, const ExtensionSet& set, +// int index); +// static inline void Set(int number, int index, +// ConstType value, ExtensionSet* set); +// static inline MutableType Mutable(int number, int index, +// ExtensionSet* set); +// static inline void Add(int number, ConstType value, ExtensionSet* set); +// static inline MutableType Add(int number, ExtensionSet* set); +// }; +// +// Not all of these methods make sense for all field types. For example, the +// "Mutable" methods only make sense for strings and messages, and the +// repeated methods only make sense for repeated types. So, each type +// traits class implements only the set of methods from this signature that it +// actually supports. This will cause a compiler error if the user tries to +// access an extension using a method that doesn't make sense for its type. +// For example, if "foo" is an extension of type "optional int32", then if you +// try to write code like: +// my_message.MutableExtension(foo) +// you will get a compile error because PrimitiveTypeTraits does not +// have a "Mutable()" method. + +// ------------------------------------------------------------------- +// PrimitiveTypeTraits + +// Since the ExtensionSet has different methods for each primitive type, +// we must explicitly define the methods of the type traits class for each +// known type. +template +class PrimitiveTypeTraits { + public: + typedef Type ConstType; + + static inline ConstType Get(int number, const ExtensionSet& set, + ConstType default_value); + static inline void Set(int number, FieldType field_type, + ConstType value, ExtensionSet* set); +}; + +template +class RepeatedPrimitiveTypeTraits { + public: + typedef Type ConstType; + + static inline Type Get(int number, const ExtensionSet& set, int index); + static inline void Set(int number, int index, Type value, ExtensionSet* set); + static inline void Add(int number, FieldType field_type, + bool is_packed, Type value, ExtensionSet* set); +}; + +#define PROTOBUF_DEFINE_PRIMITIVE_TYPE(TYPE, METHOD) \ +template<> inline TYPE PrimitiveTypeTraits::Get( \ + int number, const ExtensionSet& set, TYPE default_value) { \ + return set.Get##METHOD(number, default_value); \ +} \ +template<> inline void PrimitiveTypeTraits::Set( \ + int number, FieldType field_type, TYPE value, ExtensionSet* set) { \ + set->Set##METHOD(number, field_type, value, NULL); \ +} \ + \ +template<> inline TYPE RepeatedPrimitiveTypeTraits::Get( \ + int number, const ExtensionSet& set, int index) { \ + return set.GetRepeated##METHOD(number, index); \ +} \ +template<> inline void RepeatedPrimitiveTypeTraits::Set( \ + int number, int index, TYPE value, ExtensionSet* set) { \ + set->SetRepeated##METHOD(number, index, value); \ +} \ +template<> inline void RepeatedPrimitiveTypeTraits::Add( \ + int number, FieldType field_type, bool is_packed, \ + TYPE value, ExtensionSet* set) { \ + set->Add##METHOD(number, field_type, is_packed, value, NULL); \ +} + +PROTOBUF_DEFINE_PRIMITIVE_TYPE( int32, Int32) +PROTOBUF_DEFINE_PRIMITIVE_TYPE( int64, Int64) +PROTOBUF_DEFINE_PRIMITIVE_TYPE(uint32, UInt32) +PROTOBUF_DEFINE_PRIMITIVE_TYPE(uint64, UInt64) +PROTOBUF_DEFINE_PRIMITIVE_TYPE( float, Float) +PROTOBUF_DEFINE_PRIMITIVE_TYPE(double, Double) +PROTOBUF_DEFINE_PRIMITIVE_TYPE( bool, Bool) + +#undef PROTOBUF_DEFINE_PRIMITIVE_TYPE + +// ------------------------------------------------------------------- +// StringTypeTraits + +// Strings support both Set() and Mutable(). +class LIBPROTOBUF_EXPORT StringTypeTraits { + public: + typedef const string& ConstType; + typedef string* MutableType; + + static inline const string& Get(int number, const ExtensionSet& set, + ConstType default_value) { + return set.GetString(number, default_value); + } + static inline void Set(int number, FieldType field_type, + const string& value, ExtensionSet* set) { + set->SetString(number, field_type, value, NULL); + } + static inline string* Mutable(int number, FieldType field_type, + ExtensionSet* set) { + return set->MutableString(number, field_type, NULL); + } +}; + +class LIBPROTOBUF_EXPORT RepeatedStringTypeTraits { + public: + typedef const string& ConstType; + typedef string* MutableType; + + static inline const string& Get(int number, const ExtensionSet& set, + int index) { + return set.GetRepeatedString(number, index); + } + static inline void Set(int number, int index, + const string& value, ExtensionSet* set) { + set->SetRepeatedString(number, index, value); + } + static inline string* Mutable(int number, int index, ExtensionSet* set) { + return set->MutableRepeatedString(number, index); + } + static inline void Add(int number, FieldType field_type, + bool /*is_packed*/, const string& value, + ExtensionSet* set) { + set->AddString(number, field_type, value, NULL); + } + static inline string* Add(int number, FieldType field_type, + ExtensionSet* set) { + return set->AddString(number, field_type, NULL); + } +}; + +// ------------------------------------------------------------------- +// EnumTypeTraits + +// ExtensionSet represents enums using integers internally, so we have to +// static_cast around. +template +class EnumTypeTraits { + public: + typedef Type ConstType; + + static inline ConstType Get(int number, const ExtensionSet& set, + ConstType default_value) { + return static_cast(set.GetEnum(number, default_value)); + } + static inline void Set(int number, FieldType field_type, + ConstType value, ExtensionSet* set) { + GOOGLE_DCHECK(IsValid(value)); + set->SetEnum(number, field_type, value, NULL); + } +}; + +template +class RepeatedEnumTypeTraits { + public: + typedef Type ConstType; + + static inline ConstType Get(int number, const ExtensionSet& set, int index) { + return static_cast(set.GetRepeatedEnum(number, index)); + } + static inline void Set(int number, int index, + ConstType value, ExtensionSet* set) { + GOOGLE_DCHECK(IsValid(value)); + set->SetRepeatedEnum(number, index, value); + } + static inline void Add(int number, FieldType field_type, + bool is_packed, ConstType value, ExtensionSet* set) { + GOOGLE_DCHECK(IsValid(value)); + set->AddEnum(number, field_type, is_packed, value, NULL); + } +}; + +// ------------------------------------------------------------------- +// MessageTypeTraits + +// ExtensionSet guarantees that when manipulating extensions with message +// types, the implementation used will be the compiled-in class representing +// that type. So, we can static_cast down to the exact type we expect. +template +class MessageTypeTraits { + public: + typedef const Type& ConstType; + typedef Type* MutableType; + + static inline ConstType Get(int number, const ExtensionSet& set, + ConstType default_value) { + return static_cast( + set.GetMessage(number, default_value)); + } + static inline MutableType Mutable(int number, FieldType field_type, + ExtensionSet* set) { + return static_cast( + set->MutableMessage(number, field_type, Type::default_instance(), NULL)); + } +}; + +template +class RepeatedMessageTypeTraits { + public: + typedef const Type& ConstType; + typedef Type* MutableType; + + static inline ConstType Get(int number, const ExtensionSet& set, int index) { + return static_cast(set.GetRepeatedMessage(number, index)); + } + static inline MutableType Mutable(int number, int index, ExtensionSet* set) { + return static_cast(set->MutableRepeatedMessage(number, index)); + } + static inline MutableType Add(int number, FieldType field_type, + ExtensionSet* set) { + return static_cast( + set->AddMessage(number, field_type, Type::default_instance(), NULL)); + } +}; + +// ------------------------------------------------------------------- +// ExtensionIdentifier + +// This is the type of actual extension objects. E.g. if you have: +// extends Foo with optional int32 bar = 1234; +// then "bar" will be defined in C++ as: +// ExtensionIdentifier, 1, false> bar(1234); +// +// Note that we could, in theory, supply the field number as a template +// parameter, and thus make an instance of ExtensionIdentifier have no +// actual contents. However, if we did that, then using at extension +// identifier would not necessarily cause the compiler to output any sort +// of reference to any simple defined in the extension's .pb.o file. Some +// linkers will actually drop object files that are not explicitly referenced, +// but that would be bad because it would cause this extension to not be +// registered at static initialization, and therefore using it would crash. + +template +class ExtensionIdentifier { + public: + typedef TypeTraitsType TypeTraits; + typedef ExtendeeType Extendee; + + ExtensionIdentifier(int number, typename TypeTraits::ConstType default_value) + : number_(number), default_value_(default_value) {} + inline int number() const { return number_; } + typename TypeTraits::ConstType default_value() const { + return default_value_; + } + + private: + const int number_; + typename TypeTraits::ConstType default_value_; +}; + +// ------------------------------------------------------------------- +// Generated accessors + +// This macro should be expanded in the context of a generated type which +// has extensions. +// +// We use "_proto_TypeTraits" as a type name below because "TypeTraits" +// causes problems if the class has a nested message or enum type with that +// name and "_TypeTraits" is technically reserved for the C++ library since +// it starts with an underscore followed by a capital letter. +#define GOOGLE_PROTOBUF_EXTENSION_ACCESSORS(CLASSNAME) \ + /* Has, Size, Clear */ \ + template \ + inline bool HasExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ + return _extensions_.Has(id.number()); \ + } \ + \ + template \ + inline void ClearExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ + _extensions_.ClearExtension(id.number()); \ + } \ + \ + template \ + inline int ExtensionSize( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ + return _extensions_.ExtensionSize(id.number()); \ + } \ + \ + /* Singular accessors */ \ + template \ + inline typename _proto_TypeTraits::ConstType GetExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) const { \ + return _proto_TypeTraits::Get(id.number(), _extensions_, \ + id.default_value()); \ + } \ + \ + template \ + inline typename _proto_TypeTraits::MutableType MutableExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ + return _proto_TypeTraits::Mutable(id.number(), field_type, &_extensions_);\ + } \ + \ + template \ + inline void SetExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ + typename _proto_TypeTraits::ConstType value) { \ + _proto_TypeTraits::Set(id.number(), field_type, value, &_extensions_); \ + } \ + \ + /* Repeated accessors */ \ + template \ + inline typename _proto_TypeTraits::ConstType GetExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ + int index) const { \ + return _proto_TypeTraits::Get(id.number(), _extensions_, index); \ + } \ + \ + template \ + inline typename _proto_TypeTraits::MutableType MutableExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ + int index) { \ + return _proto_TypeTraits::Mutable(id.number(), index, &_extensions_); \ + } \ + \ + template \ + inline void SetExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ + int index, typename _proto_TypeTraits::ConstType value) { \ + _proto_TypeTraits::Set(id.number(), index, value, &_extensions_); \ + } \ + \ + template \ + inline typename _proto_TypeTraits::MutableType AddExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id) { \ + return _proto_TypeTraits::Add(id.number(), field_type, &_extensions_); \ + } \ + \ + template \ + inline void AddExtension( \ + const ::google::protobuf::internal::ExtensionIdentifier< \ + CLASSNAME, _proto_TypeTraits, field_type, is_packed>& id, \ + typename _proto_TypeTraits::ConstType value) { \ + _proto_TypeTraits::Add(id.number(), field_type, is_packed, \ + value, &_extensions_); \ + } + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_EXTENSION_SET_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc new file mode 100644 index 000000000..2721f15dc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc @@ -0,0 +1,457 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Contains methods defined in extension_set.h which cannot be part of the +// lite library because they use descriptors or reflection. + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +// Implementation of ExtensionFinder which finds extensions in a given +// DescriptorPool, using the given MessageFactory to construct sub-objects. +// This class is implemented in extension_set_heavy.cc. +class DescriptorPoolExtensionFinder : public ExtensionFinder { + public: + DescriptorPoolExtensionFinder(const DescriptorPool* pool, + MessageFactory* factory, + const Descriptor* containing_type) + : pool_(pool), factory_(factory), containing_type_(containing_type) {} + virtual ~DescriptorPoolExtensionFinder() {} + + virtual bool Find(int number, ExtensionInfo* output); + + private: + const DescriptorPool* pool_; + MessageFactory* factory_; + const Descriptor* containing_type_; +}; + +void ExtensionSet::AppendToList(const Descriptor* containing_type, + const DescriptorPool* pool, + vector* output) const { + for (map::const_iterator iter = extensions_.begin(); + iter != extensions_.end(); ++iter) { + bool has = false; + if (iter->second.is_repeated) { + has = iter->second.GetSize() > 0; + } else { + has = !iter->second.is_cleared; + } + + if (has) { + // TODO(kenton): Looking up each field by number is somewhat unfortunate. + // Is there a better way? The problem is that descriptors are lazily- + // initialized, so they might not even be constructed until + // AppendToList() is called. + + if (iter->second.descriptor == NULL) { + output->push_back(pool->FindExtensionByNumber( + containing_type, iter->first)); + } else { + output->push_back(iter->second.descriptor); + } + } + } +} + +inline FieldDescriptor::Type real_type(FieldType type) { + GOOGLE_DCHECK(type > 0 && type <= FieldDescriptor::MAX_TYPE); + return static_cast(type); +} + +inline FieldDescriptor::CppType cpp_type(FieldType type) { + return FieldDescriptor::TypeToCppType( + static_cast(type)); +} + +#define GOOGLE_DCHECK_TYPE(EXTENSION, LABEL, CPPTYPE) \ + GOOGLE_DCHECK_EQ((EXTENSION).is_repeated ? FieldDescriptor::LABEL_REPEATED \ + : FieldDescriptor::LABEL_OPTIONAL, \ + FieldDescriptor::LABEL_##LABEL); \ + GOOGLE_DCHECK_EQ(cpp_type((EXTENSION).type), FieldDescriptor::CPPTYPE_##CPPTYPE) + +const MessageLite& ExtensionSet::GetMessage(int number, + const Descriptor* message_type, + MessageFactory* factory) const { + map::const_iterator iter = extensions_.find(number); + if (iter == extensions_.end() || iter->second.is_cleared) { + // Not present. Return the default value. + return *factory->GetPrototype(message_type); + } else { + GOOGLE_DCHECK_TYPE(iter->second, OPTIONAL, MESSAGE); + return *iter->second.message_value; + } +} + +MessageLite* ExtensionSet::MutableMessage(const FieldDescriptor* descriptor, + MessageFactory* factory) { + Extension* extension; + if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { + extension->type = descriptor->type(); + GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE); + extension->is_repeated = false; + extension->is_packed = false; + const MessageLite* prototype = + factory->GetPrototype(descriptor->message_type()); + GOOGLE_CHECK(prototype != NULL); + extension->message_value = prototype->New(); + } else { + GOOGLE_DCHECK_TYPE(*extension, OPTIONAL, MESSAGE); + } + extension->is_cleared = false; + return extension->message_value; +} + +MessageLite* ExtensionSet::AddMessage(const FieldDescriptor* descriptor, + MessageFactory* factory) { + Extension* extension; + if (MaybeNewExtension(descriptor->number(), descriptor, &extension)) { + extension->type = descriptor->type(); + GOOGLE_DCHECK_EQ(cpp_type(extension->type), FieldDescriptor::CPPTYPE_MESSAGE); + extension->is_repeated = true; + extension->repeated_message_value = + new RepeatedPtrField(); + } else { + GOOGLE_DCHECK_TYPE(*extension, REPEATED, MESSAGE); + } + + // RepeatedPtrField does not know how to Add() since it cannot + // allocate an abstract object, so we have to be tricky. + MessageLite* result = extension->repeated_message_value + ->AddFromCleared >(); + if (result == NULL) { + const MessageLite* prototype; + if (extension->repeated_message_value->size() == 0) { + prototype = factory->GetPrototype(descriptor->message_type()); + GOOGLE_CHECK(prototype != NULL); + } else { + prototype = &extension->repeated_message_value->Get(0); + } + result = prototype->New(); + extension->repeated_message_value->AddAllocated(result); + } + return result; +} + +static bool ValidateEnumUsingDescriptor(const void* arg, int number) { + return reinterpret_cast(arg) + ->FindValueByNumber(number) != NULL; +} + +bool DescriptorPoolExtensionFinder::Find(int number, ExtensionInfo* output) { + const FieldDescriptor* extension = + pool_->FindExtensionByNumber(containing_type_, number); + if (extension == NULL) { + return false; + } else { + output->type = extension->type(); + output->is_repeated = extension->is_repeated(); + output->is_packed = extension->options().packed(); + output->descriptor = extension; + if (extension->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + output->message_prototype = + factory_->GetPrototype(extension->message_type()); + GOOGLE_CHECK(output->message_prototype != NULL) + << "Extension factory's GetPrototype() returned NULL for extension: " + << extension->full_name(); + } else if (extension->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { + output->enum_validity_check.func = ValidateEnumUsingDescriptor; + output->enum_validity_check.arg = extension->enum_type(); + } + + return true; + } +} + +bool ExtensionSet::ParseField(uint32 tag, io::CodedInputStream* input, + const Message* containing_type, + UnknownFieldSet* unknown_fields) { + UnknownFieldSetFieldSkipper skipper(unknown_fields); + if (input->GetExtensionPool() == NULL) { + GeneratedExtensionFinder finder(containing_type); + return ParseField(tag, input, &finder, &skipper); + } else { + DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), + input->GetExtensionFactory(), + containing_type->GetDescriptor()); + return ParseField(tag, input, &finder, &skipper); + } +} + +bool ExtensionSet::ParseMessageSet(io::CodedInputStream* input, + const Message* containing_type, + UnknownFieldSet* unknown_fields) { + UnknownFieldSetFieldSkipper skipper(unknown_fields); + if (input->GetExtensionPool() == NULL) { + GeneratedExtensionFinder finder(containing_type); + return ParseMessageSet(input, &finder, &skipper); + } else { + DescriptorPoolExtensionFinder finder(input->GetExtensionPool(), + input->GetExtensionFactory(), + containing_type->GetDescriptor()); + return ParseMessageSet(input, &finder, &skipper); + } +} + +int ExtensionSet::SpaceUsedExcludingSelf() const { + int total_size = + extensions_.size() * sizeof(map::value_type); + for (map::const_iterator iter = extensions_.begin(), + end = extensions_.end(); + iter != end; + ++iter) { + total_size += iter->second.SpaceUsedExcludingSelf(); + } + return total_size; +} + +inline int ExtensionSet::RepeatedMessage_SpaceUsedExcludingSelf( + RepeatedPtrFieldBase* field) { + return field->SpaceUsedExcludingSelf >(); +} + +int ExtensionSet::Extension::SpaceUsedExcludingSelf() const { + int total_size = 0; + if (is_repeated) { + switch (cpp_type(type)) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE: \ + total_size += sizeof(*repeated_##LOWERCASE##_value) + \ + repeated_##LOWERCASE##_value->SpaceUsedExcludingSelf();\ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE( UINT32, uint32); + HANDLE_TYPE( UINT64, uint64); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( DOUBLE, double); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, enum); + HANDLE_TYPE( STRING, string); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_MESSAGE: + // repeated_message_value is actually a RepeatedPtrField, + // but MessageLite has no SpaceUsed(), so we must directly call + // RepeatedPtrFieldBase::SpaceUsedExcludingSelf() with a different type + // handler. + total_size += sizeof(*repeated_message_value) + + RepeatedMessage_SpaceUsedExcludingSelf(repeated_message_value); + break; + } + } else { + switch (cpp_type(type)) { + case FieldDescriptor::CPPTYPE_STRING: + total_size += sizeof(*string_value) + + StringSpaceUsedExcludingSelf(*string_value); + break; + case FieldDescriptor::CPPTYPE_MESSAGE: + total_size += down_cast(message_value)->SpaceUsed(); + break; + default: + // No extra storage costs for primitive types. + break; + } + } + return total_size; +} + +// The Serialize*ToArray methods are only needed in the heavy library, as +// the lite library only generates SerializeWithCachedSizes. +uint8* ExtensionSet::SerializeWithCachedSizesToArray( + int start_field_number, int end_field_number, + uint8* target) const { + map::const_iterator iter; + for (iter = extensions_.lower_bound(start_field_number); + iter != extensions_.end() && iter->first < end_field_number; + ++iter) { + target = iter->second.SerializeFieldWithCachedSizesToArray(iter->first, + target); + } + return target; +} + +uint8* ExtensionSet::SerializeMessageSetWithCachedSizesToArray( + uint8* target) const { + map::const_iterator iter; + for (iter = extensions_.begin(); iter != extensions_.end(); ++iter) { + target = iter->second.SerializeMessageSetItemWithCachedSizesToArray( + iter->first, target); + } + return target; +} + +uint8* ExtensionSet::Extension::SerializeFieldWithCachedSizesToArray( + int number, uint8* target) const { + if (is_repeated) { + if (is_packed) { + if (cached_size == 0) return target; + + target = WireFormatLite::WriteTagToArray(number, + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, target); + target = WireFormatLite::WriteInt32NoTagToArray(cached_size, target); + + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case FieldDescriptor::TYPE_##UPPERCASE: \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + target = WireFormatLite::Write##CAMELCASE##NoTagToArray( \ + repeated_##LOWERCASE##_value->Get(i), target); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); + HANDLE_TYPE( ENUM, Enum, enum); +#undef HANDLE_TYPE + + case WireFormatLite::TYPE_STRING: + case WireFormatLite::TYPE_BYTES: + case WireFormatLite::TYPE_GROUP: + case WireFormatLite::TYPE_MESSAGE: + GOOGLE_LOG(FATAL) << "Non-primitive types can't be packed."; + break; + } + } else { + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, LOWERCASE) \ + case FieldDescriptor::TYPE_##UPPERCASE: \ + for (int i = 0; i < repeated_##LOWERCASE##_value->size(); i++) { \ + target = WireFormatLite::Write##CAMELCASE##ToArray(number, \ + repeated_##LOWERCASE##_value->Get(i), target); \ + } \ + break + + HANDLE_TYPE( INT32, Int32, int32); + HANDLE_TYPE( INT64, Int64, int64); + HANDLE_TYPE( UINT32, UInt32, uint32); + HANDLE_TYPE( UINT64, UInt64, uint64); + HANDLE_TYPE( SINT32, SInt32, int32); + HANDLE_TYPE( SINT64, SInt64, int64); + HANDLE_TYPE( FIXED32, Fixed32, uint32); + HANDLE_TYPE( FIXED64, Fixed64, uint64); + HANDLE_TYPE(SFIXED32, SFixed32, int32); + HANDLE_TYPE(SFIXED64, SFixed64, int64); + HANDLE_TYPE( FLOAT, Float, float); + HANDLE_TYPE( DOUBLE, Double, double); + HANDLE_TYPE( BOOL, Bool, bool); + HANDLE_TYPE( STRING, String, string); + HANDLE_TYPE( BYTES, Bytes, string); + HANDLE_TYPE( ENUM, Enum, enum); + HANDLE_TYPE( GROUP, Group, message); + HANDLE_TYPE( MESSAGE, Message, message); +#undef HANDLE_TYPE + } + } + } else if (!is_cleared) { + switch (real_type(type)) { +#define HANDLE_TYPE(UPPERCASE, CAMELCASE, VALUE) \ + case FieldDescriptor::TYPE_##UPPERCASE: \ + target = WireFormatLite::Write##CAMELCASE##ToArray( \ + number, VALUE, target); \ + break + + HANDLE_TYPE( INT32, Int32, int32_value); + HANDLE_TYPE( INT64, Int64, int64_value); + HANDLE_TYPE( UINT32, UInt32, uint32_value); + HANDLE_TYPE( UINT64, UInt64, uint64_value); + HANDLE_TYPE( SINT32, SInt32, int32_value); + HANDLE_TYPE( SINT64, SInt64, int64_value); + HANDLE_TYPE( FIXED32, Fixed32, uint32_value); + HANDLE_TYPE( FIXED64, Fixed64, uint64_value); + HANDLE_TYPE(SFIXED32, SFixed32, int32_value); + HANDLE_TYPE(SFIXED64, SFixed64, int64_value); + HANDLE_TYPE( FLOAT, Float, float_value); + HANDLE_TYPE( DOUBLE, Double, double_value); + HANDLE_TYPE( BOOL, Bool, bool_value); + HANDLE_TYPE( STRING, String, *string_value); + HANDLE_TYPE( BYTES, Bytes, *string_value); + HANDLE_TYPE( ENUM, Enum, enum_value); + HANDLE_TYPE( GROUP, Group, *message_value); + HANDLE_TYPE( MESSAGE, Message, *message_value); +#undef HANDLE_TYPE + } + } + return target; +} + +uint8* ExtensionSet::Extension::SerializeMessageSetItemWithCachedSizesToArray( + int number, + uint8* target) const { + if (type != WireFormatLite::TYPE_MESSAGE || is_repeated) { + // Not a valid MessageSet extension, but serialize it the normal way. + GOOGLE_LOG(WARNING) << "Invalid message set extension."; + return SerializeFieldWithCachedSizesToArray(number, target); + } + + if (is_cleared) return target; + + // Start group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemStartTag, target); + // Write type ID. + target = WireFormatLite::WriteUInt32ToArray( + WireFormatLite::kMessageSetTypeIdNumber, number, target); + // Write message. + target = WireFormatLite::WriteMessageToArray( + WireFormatLite::kMessageSetMessageNumber, *message_value, target); + // End group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemEndTag, target); + return target; +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc new file mode 100644 index 000000000..000f846c7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc @@ -0,0 +1,642 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { +namespace { + +// This test closely mirrors google/protobuf/compiler/cpp/unittest.cc +// except that it uses extensions rather than regular fields. + +TEST(ExtensionSetTest, Defaults) { + // Check that all default values are set correctly in the initial message. + unittest::TestAllExtensions message; + + TestUtil::ExpectExtensionsClear(message); + + // Messages should return pointers to default instances until first use. + // (This is not checked by ExpectClear() since it is not actually true after + // the fields have been set and then cleared.) + EXPECT_EQ(&unittest::OptionalGroup_extension::default_instance(), + &message.GetExtension(unittest::optionalgroup_extension)); + EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), + &message.GetExtension(unittest::optional_nested_message_extension)); + EXPECT_EQ(&unittest::ForeignMessage::default_instance(), + &message.GetExtension( + unittest::optional_foreign_message_extension)); + EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), + &message.GetExtension(unittest::optional_import_message_extension)); +} + +TEST(ExtensionSetTest, Accessors) { + // Set every field to a unique value then go back and check all those + // values. + unittest::TestAllExtensions message; + + TestUtil::SetAllExtensions(&message); + TestUtil::ExpectAllExtensionsSet(message); + + TestUtil::ModifyRepeatedExtensions(&message); + TestUtil::ExpectRepeatedExtensionsModified(message); +} + +TEST(ExtensionSetTest, Clear) { + // Set every field to a unique value, clear the message, then check that + // it is cleared. + unittest::TestAllExtensions message; + + TestUtil::SetAllExtensions(&message); + message.Clear(); + TestUtil::ExpectExtensionsClear(message); + + // Unlike with the defaults test, we do NOT expect that requesting embedded + // messages will return a pointer to the default instance. Instead, they + // should return the objects that were created when mutable_blah() was + // called. + EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(), + &message.GetExtension(unittest::optionalgroup_extension)); + EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), + &message.GetExtension(unittest::optional_nested_message_extension)); + EXPECT_NE(&unittest::ForeignMessage::default_instance(), + &message.GetExtension( + unittest::optional_foreign_message_extension)); + EXPECT_NE(&unittest_import::ImportMessage::default_instance(), + &message.GetExtension(unittest::optional_import_message_extension)); + + // Make sure setting stuff again after clearing works. (This takes slightly + // different code paths since the objects are reused.) + TestUtil::SetAllExtensions(&message); + TestUtil::ExpectAllExtensionsSet(message); +} + +TEST(ExtensionSetTest, ClearOneField) { + // Set every field to a unique value, then clear one value and insure that + // only that one value is cleared. + unittest::TestAllExtensions message; + + TestUtil::SetAllExtensions(&message); + int64 original_value = + message.GetExtension(unittest::optional_int64_extension); + + // Clear the field and make sure it shows up as cleared. + message.ClearExtension(unittest::optional_int64_extension); + EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension)); + EXPECT_EQ(0, message.GetExtension(unittest::optional_int64_extension)); + + // Other adjacent fields should not be cleared. + EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension)); + EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension)); + + // Make sure if we set it again, then all fields are set. + message.SetExtension(unittest::optional_int64_extension, original_value); + TestUtil::ExpectAllExtensionsSet(message); +} + +TEST(ExtensionSetTest, CopyFrom) { + unittest::TestAllExtensions message1, message2; + string data; + + TestUtil::SetAllExtensions(&message1); + message2.CopyFrom(message1); + TestUtil::ExpectAllExtensionsSet(message2); +} + +TEST(ExtensionSetTest, CopyFromUpcasted) { + unittest::TestAllExtensions message1, message2; + string data; + const Message& upcasted_message = message1; + + TestUtil::SetAllExtensions(&message1); + message2.CopyFrom(upcasted_message); + TestUtil::ExpectAllExtensionsSet(message2); +} + +TEST(ExtensionSetTest, SwapWithEmpty) { + unittest::TestAllExtensions message1, message2; + TestUtil::SetAllExtensions(&message1); + + TestUtil::ExpectAllExtensionsSet(message1); + TestUtil::ExpectExtensionsClear(message2); + message1.Swap(&message2); + TestUtil::ExpectAllExtensionsSet(message2); + TestUtil::ExpectExtensionsClear(message1); +} + +TEST(ExtensionSetTest, SwapWithSelf) { + unittest::TestAllExtensions message; + TestUtil::SetAllExtensions(&message); + + TestUtil::ExpectAllExtensionsSet(message); + message.Swap(&message); + TestUtil::ExpectAllExtensionsSet(message); +} + +TEST(ExtensionSetTest, SerializationToArray) { + // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire + // compatibility of extensions. + // + // This checks serialization to a flat array by explicitly reserving space in + // the string and calling the generated message's + // SerializeWithCachedSizesToArray. + unittest::TestAllExtensions source; + unittest::TestAllTypes destination; + TestUtil::SetAllExtensions(&source); + int size = source.ByteSize(); + string data; + data.resize(size); + uint8* target = reinterpret_cast(string_as_array(&data)); + uint8* end = source.SerializeWithCachedSizesToArray(target); + EXPECT_EQ(size, end - target); + EXPECT_TRUE(destination.ParseFromString(data)); + TestUtil::ExpectAllFieldsSet(destination); +} + +TEST(ExtensionSetTest, SerializationToStream) { + // Serialize as TestAllExtensions and parse as TestAllTypes to insure wire + // compatibility of extensions. + // + // This checks serialization to an output stream by creating an array output + // stream that can only buffer 1 byte at a time - this prevents the message + // from ever jumping to the fast path, ensuring that serialization happens via + // the CodedOutputStream. + unittest::TestAllExtensions source; + unittest::TestAllTypes destination; + TestUtil::SetAllExtensions(&source); + int size = source.ByteSize(); + string data; + data.resize(size); + { + io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); + io::CodedOutputStream output_stream(&array_stream); + source.SerializeWithCachedSizes(&output_stream); + ASSERT_FALSE(output_stream.HadError()); + } + EXPECT_TRUE(destination.ParseFromString(data)); + TestUtil::ExpectAllFieldsSet(destination); +} + +TEST(ExtensionSetTest, PackedSerializationToArray) { + // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure + // wire compatibility of extensions. + // + // This checks serialization to a flat array by explicitly reserving space in + // the string and calling the generated message's + // SerializeWithCachedSizesToArray. + unittest::TestPackedExtensions source; + unittest::TestPackedTypes destination; + TestUtil::SetPackedExtensions(&source); + int size = source.ByteSize(); + string data; + data.resize(size); + uint8* target = reinterpret_cast(string_as_array(&data)); + uint8* end = source.SerializeWithCachedSizesToArray(target); + EXPECT_EQ(size, end - target); + EXPECT_TRUE(destination.ParseFromString(data)); + TestUtil::ExpectPackedFieldsSet(destination); +} + +TEST(ExtensionSetTest, PackedSerializationToStream) { + // Serialize as TestPackedExtensions and parse as TestPackedTypes to insure + // wire compatibility of extensions. + // + // This checks serialization to an output stream by creating an array output + // stream that can only buffer 1 byte at a time - this prevents the message + // from ever jumping to the fast path, ensuring that serialization happens via + // the CodedOutputStream. + unittest::TestPackedExtensions source; + unittest::TestPackedTypes destination; + TestUtil::SetPackedExtensions(&source); + int size = source.ByteSize(); + string data; + data.resize(size); + { + io::ArrayOutputStream array_stream(string_as_array(&data), size, 1); + io::CodedOutputStream output_stream(&array_stream); + source.SerializeWithCachedSizes(&output_stream); + ASSERT_FALSE(output_stream.HadError()); + } + EXPECT_TRUE(destination.ParseFromString(data)); + TestUtil::ExpectPackedFieldsSet(destination); +} + +TEST(ExtensionSetTest, Parsing) { + // Serialize as TestAllTypes and parse as TestAllExtensions. + unittest::TestAllTypes source; + unittest::TestAllExtensions destination; + string data; + + TestUtil::SetAllFields(&source); + source.SerializeToString(&data); + EXPECT_TRUE(destination.ParseFromString(data)); + TestUtil::ExpectAllExtensionsSet(destination); +} + +TEST(ExtensionSetTest, PackedParsing) { + // Serialize as TestPackedTypes and parse as TestPackedExtensions. + unittest::TestPackedTypes source; + unittest::TestPackedExtensions destination; + string data; + + TestUtil::SetPackedFields(&source); + source.SerializeToString(&data); + EXPECT_TRUE(destination.ParseFromString(data)); + TestUtil::ExpectPackedExtensionsSet(destination); +} + +TEST(ExtensionSetTest, IsInitialized) { + // Test that IsInitialized() returns false if required fields in nested + // extensions are missing. + unittest::TestAllExtensions message; + + EXPECT_TRUE(message.IsInitialized()); + + message.MutableExtension(unittest::TestRequired::single); + EXPECT_FALSE(message.IsInitialized()); + + message.MutableExtension(unittest::TestRequired::single)->set_a(1); + EXPECT_FALSE(message.IsInitialized()); + message.MutableExtension(unittest::TestRequired::single)->set_b(2); + EXPECT_FALSE(message.IsInitialized()); + message.MutableExtension(unittest::TestRequired::single)->set_c(3); + EXPECT_TRUE(message.IsInitialized()); + + message.AddExtension(unittest::TestRequired::multi); + EXPECT_FALSE(message.IsInitialized()); + + message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1); + EXPECT_FALSE(message.IsInitialized()); + message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2); + EXPECT_FALSE(message.IsInitialized()); + message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3); + EXPECT_TRUE(message.IsInitialized()); +} + +TEST(ExtensionSetTest, MutableString) { + // Test the mutable string accessors. + unittest::TestAllExtensions message; + + message.MutableExtension(unittest::optional_string_extension)->assign("foo"); + EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension)); + EXPECT_EQ("foo", message.GetExtension(unittest::optional_string_extension)); + + message.AddExtension(unittest::repeated_string_extension)->assign("bar"); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension)); + EXPECT_EQ("bar", + message.GetExtension(unittest::repeated_string_extension, 0)); +} + +TEST(ExtensionSetTest, SpaceUsedExcludingSelf) { + // Scalar primitive extensions should increase the extension set size by a + // minimum of the size of the primitive type. +#define TEST_SCALAR_EXTENSIONS_SPACE_USED(type, value) \ + do { \ + unittest::TestAllExtensions message; \ + const int base_size = message.SpaceUsed(); \ + message.SetExtension(unittest::optional_##type##_extension, value); \ + int min_expected_size = base_size + \ + sizeof(message.GetExtension(unittest::optional_##type##_extension)); \ + EXPECT_LE(min_expected_size, message.SpaceUsed()); \ + } while (0) + + TEST_SCALAR_EXTENSIONS_SPACE_USED(int32 , 101); + TEST_SCALAR_EXTENSIONS_SPACE_USED(int64 , 102); + TEST_SCALAR_EXTENSIONS_SPACE_USED(uint32 , 103); + TEST_SCALAR_EXTENSIONS_SPACE_USED(uint64 , 104); + TEST_SCALAR_EXTENSIONS_SPACE_USED(sint32 , 105); + TEST_SCALAR_EXTENSIONS_SPACE_USED(sint64 , 106); + TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed32 , 107); + TEST_SCALAR_EXTENSIONS_SPACE_USED(fixed64 , 108); + TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed32, 109); + TEST_SCALAR_EXTENSIONS_SPACE_USED(sfixed64, 110); + TEST_SCALAR_EXTENSIONS_SPACE_USED(float , 111); + TEST_SCALAR_EXTENSIONS_SPACE_USED(double , 112); + TEST_SCALAR_EXTENSIONS_SPACE_USED(bool , true); +#undef TEST_SCALAR_EXTENSIONS_SPACE_USED + { + unittest::TestAllExtensions message; + const int base_size = message.SpaceUsed(); + message.SetExtension(unittest::optional_nested_enum_extension, + unittest::TestAllTypes::FOO); + int min_expected_size = base_size + + sizeof(message.GetExtension(unittest::optional_nested_enum_extension)); + EXPECT_LE(min_expected_size, message.SpaceUsed()); + } + { + // Strings may cause extra allocations depending on their length; ensure + // that gets included as well. + unittest::TestAllExtensions message; + const int base_size = message.SpaceUsed(); + const string s("this is a fairly large string that will cause some " + "allocation in order to store it in the extension"); + message.SetExtension(unittest::optional_string_extension, s); + int min_expected_size = base_size + s.length(); + EXPECT_LE(min_expected_size, message.SpaceUsed()); + } + { + // Messages also have additional allocation that need to be counted. + unittest::TestAllExtensions message; + const int base_size = message.SpaceUsed(); + unittest::ForeignMessage foreign; + foreign.set_c(42); + message.MutableExtension(unittest::optional_foreign_message_extension)-> + CopyFrom(foreign); + int min_expected_size = base_size + foreign.SpaceUsed(); + EXPECT_LE(min_expected_size, message.SpaceUsed()); + } + + // Repeated primitive extensions will increase space used by at least a + // RepeatedField, and will cause additional allocations when the array + // gets too big for the initial space. + // This macro: + // - Adds a value to the repeated extension, then clears it, establishing + // the base size. + // - Adds a small number of values, testing that it doesn't increase the + // SpaceUsed() + // - Adds a large number of values (requiring allocation in the repeated + // field), and ensures that that allocation is included in SpaceUsed() +#define TEST_REPEATED_EXTENSIONS_SPACE_USED(type, cpptype, value) \ + do { \ + unittest::TestAllExtensions message; \ + const int base_size = message.SpaceUsed(); \ + int min_expected_size = sizeof(RepeatedField) + base_size; \ + message.AddExtension(unittest::repeated_##type##_extension, value); \ + message.ClearExtension(unittest::repeated_##type##_extension); \ + const int empty_repeated_field_size = message.SpaceUsed(); \ + EXPECT_LE(min_expected_size, empty_repeated_field_size) << #type; \ + message.AddExtension(unittest::repeated_##type##_extension, value); \ + message.AddExtension(unittest::repeated_##type##_extension, value); \ + EXPECT_EQ(empty_repeated_field_size, message.SpaceUsed()) << #type; \ + message.ClearExtension(unittest::repeated_##type##_extension); \ + for (int i = 0; i < 16; ++i) { \ + message.AddExtension(unittest::repeated_##type##_extension, value); \ + } \ + int expected_size = sizeof(cpptype) * 16 + empty_repeated_field_size; \ + EXPECT_EQ(expected_size, message.SpaceUsed()) << #type; \ + } while (0) + + TEST_REPEATED_EXTENSIONS_SPACE_USED(int32 , int32 , 101); + TEST_REPEATED_EXTENSIONS_SPACE_USED(int64 , int64 , 102); + TEST_REPEATED_EXTENSIONS_SPACE_USED(uint32 , uint32, 103); + TEST_REPEATED_EXTENSIONS_SPACE_USED(uint64 , uint64, 104); + TEST_REPEATED_EXTENSIONS_SPACE_USED(sint32 , int32 , 105); + TEST_REPEATED_EXTENSIONS_SPACE_USED(sint64 , int64 , 106); + TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed32 , uint32, 107); + TEST_REPEATED_EXTENSIONS_SPACE_USED(fixed64 , uint64, 108); + TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed32, int32 , 109); + TEST_REPEATED_EXTENSIONS_SPACE_USED(sfixed64, int64 , 110); + TEST_REPEATED_EXTENSIONS_SPACE_USED(float , float , 111); + TEST_REPEATED_EXTENSIONS_SPACE_USED(double , double, 112); + TEST_REPEATED_EXTENSIONS_SPACE_USED(bool , bool , true); + TEST_REPEATED_EXTENSIONS_SPACE_USED(nested_enum, int, + unittest::TestAllTypes::FOO); +#undef TEST_REPEATED_EXTENSIONS_SPACE_USED + // Repeated strings + { + unittest::TestAllExtensions message; + const int base_size = message.SpaceUsed(); + int min_expected_size = sizeof(RepeatedPtrField) + base_size; + const string value(256, 'x'); + // Once items are allocated, they may stick around even when cleared so + // without the hardcore memory management accessors there isn't a notion of + // the empty repeated field memory usage as there is with primitive types. + for (int i = 0; i < 16; ++i) { + message.AddExtension(unittest::repeated_string_extension, value); + } + min_expected_size += (sizeof(value) + value.size()) * 16; + EXPECT_LE(min_expected_size, message.SpaceUsed()); + } + // Repeated messages + { + unittest::TestAllExtensions message; + const int base_size = message.SpaceUsed(); + int min_expected_size = sizeof(RepeatedPtrField) + + base_size; + unittest::ForeignMessage prototype; + prototype.set_c(2); + for (int i = 0; i < 16; ++i) { + message.AddExtension(unittest::repeated_foreign_message_extension)-> + CopyFrom(prototype); + } + min_expected_size += 16 * prototype.SpaceUsed(); + EXPECT_LE(min_expected_size, message.SpaceUsed()); + } +} + +#ifdef GTEST_HAS_DEATH_TEST + +TEST(ExtensionSetTest, InvalidEnumDeath) { + unittest::TestAllExtensions message; + EXPECT_DEBUG_DEATH( + message.SetExtension(unittest::optional_foreign_enum_extension, + static_cast(53)), + "IsValid"); +} + +#endif // GTEST_HAS_DEATH_TEST + +TEST(ExtensionSetTest, DynamicExtensions) { + // Test adding a dynamic extension to a compiled-in message object. + + FileDescriptorProto dynamic_proto; + dynamic_proto.set_name("dynamic_extensions_test.proto"); + dynamic_proto.add_dependency( + unittest::TestAllExtensions::descriptor()->file()->name()); + dynamic_proto.set_package("dynamic_extensions"); + + // Copy the fields and nested types from TestDynamicExtensions into our new + // proto, converting the fields into extensions. + const Descriptor* template_descriptor = + unittest::TestDynamicExtensions::descriptor(); + DescriptorProto template_descriptor_proto; + template_descriptor->CopyTo(&template_descriptor_proto); + dynamic_proto.mutable_message_type()->MergeFrom( + template_descriptor_proto.nested_type()); + dynamic_proto.mutable_enum_type()->MergeFrom( + template_descriptor_proto.enum_type()); + dynamic_proto.mutable_extension()->MergeFrom( + template_descriptor_proto.field()); + + // For each extension that we added... + for (int i = 0; i < dynamic_proto.extension_size(); i++) { + // Set its extendee to TestAllExtensions. + FieldDescriptorProto* extension = dynamic_proto.mutable_extension(i); + extension->set_extendee( + unittest::TestAllExtensions::descriptor()->full_name()); + + // If the field refers to one of the types nested in TestDynamicExtensions, + // make it refer to the type in our dynamic proto instead. + string prefix = "." + template_descriptor->full_name() + "."; + if (extension->has_type_name()) { + string* type_name = extension->mutable_type_name(); + if (HasPrefixString(*type_name, prefix)) { + type_name->replace(0, prefix.size(), ".dynamic_extensions."); + } + } + } + + // Now build the file, using the generated pool as an underlay. + DescriptorPool dynamic_pool(DescriptorPool::generated_pool()); + const FileDescriptor* file = dynamic_pool.BuildFile(dynamic_proto); + ASSERT_TRUE(file != NULL); + DynamicMessageFactory dynamic_factory(&dynamic_pool); + dynamic_factory.SetDelegateToGeneratedFactory(true); + + // Construct a message that we can parse with the extensions we defined. + // Since the extensions were based off of the fields of TestDynamicExtensions, + // we can use that message to create this test message. + string data; + { + unittest::TestDynamicExtensions message; + message.set_scalar_extension(123); + message.set_enum_extension(unittest::FOREIGN_BAR); + message.set_dynamic_enum_extension( + unittest::TestDynamicExtensions::DYNAMIC_BAZ); + message.mutable_message_extension()->set_c(456); + message.mutable_dynamic_message_extension()->set_dynamic_field(789); + message.add_repeated_extension("foo"); + message.add_repeated_extension("bar"); + message.add_packed_extension(12); + message.add_packed_extension(-34); + message.add_packed_extension(56); + message.add_packed_extension(-78); + + // Also add some unknown fields. + + // An unknown enum value (for a known field). + message.mutable_unknown_fields()->AddVarint( + unittest::TestDynamicExtensions::kDynamicEnumExtensionFieldNumber, + 12345); + // A regular unknown field. + message.mutable_unknown_fields()->AddLengthDelimited(54321, "unknown"); + + message.SerializeToString(&data); + } + + // Now we can parse this using our dynamic extension definitions... + unittest::TestAllExtensions message; + { + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory); + ASSERT_TRUE(message.ParseFromCodedStream(&input)); + ASSERT_TRUE(input.ConsumedEntireMessage()); + } + + // Can we print it? + EXPECT_EQ( + "[dynamic_extensions.scalar_extension]: 123\n" + "[dynamic_extensions.enum_extension]: FOREIGN_BAR\n" + "[dynamic_extensions.dynamic_enum_extension]: DYNAMIC_BAZ\n" + "[dynamic_extensions.message_extension] {\n" + " c: 456\n" + "}\n" + "[dynamic_extensions.dynamic_message_extension] {\n" + " dynamic_field: 789\n" + "}\n" + "[dynamic_extensions.repeated_extension]: \"foo\"\n" + "[dynamic_extensions.repeated_extension]: \"bar\"\n" + "[dynamic_extensions.packed_extension]: 12\n" + "[dynamic_extensions.packed_extension]: -34\n" + "[dynamic_extensions.packed_extension]: 56\n" + "[dynamic_extensions.packed_extension]: -78\n" + "2002: 12345\n" + "54321: \"unknown\"\n", + message.DebugString()); + + // Can we serialize it? + // (Don't use EXPECT_EQ because we don't want to dump raw binary data to the + // terminal on failure.) + EXPECT_TRUE(message.SerializeAsString() == data); + + // What if we parse using the reflection-based parser? + { + unittest::TestAllExtensions message2; + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + input.SetExtensionRegistry(&dynamic_pool, &dynamic_factory); + ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message2)); + ASSERT_TRUE(input.ConsumedEntireMessage()); + EXPECT_EQ(message.DebugString(), message2.DebugString()); + } + + // Are the embedded generated types actually using the generated objects? + { + const FieldDescriptor* message_extension = + file->FindExtensionByName("message_extension"); + ASSERT_TRUE(message_extension != NULL); + const Message& sub_message = + message.GetReflection()->GetMessage(message, message_extension); + const unittest::ForeignMessage* typed_sub_message = + dynamic_cast(&sub_message); + ASSERT_TRUE(typed_sub_message != NULL); + EXPECT_EQ(456, typed_sub_message->c()); + } + + // What does GetMessage() return for the embedded dynamic type if it isn't + // present? + { + const FieldDescriptor* dynamic_message_extension = + file->FindExtensionByName("dynamic_message_extension"); + ASSERT_TRUE(dynamic_message_extension != NULL); + const Message& parent = unittest::TestAllExtensions::default_instance(); + const Message& sub_message = + parent.GetReflection()->GetMessage(parent, dynamic_message_extension, + &dynamic_factory); + const Message* prototype = + dynamic_factory.GetPrototype(dynamic_message_extension->message_type()); + EXPECT_EQ(prototype, &sub_message); + } +} + +} // namespace +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc new file mode 100644 index 000000000..a0dd75c65 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc @@ -0,0 +1,1228 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +int StringSpaceUsedExcludingSelf(const string& str) { + const void* start = &str; + const void* end = &str + 1; + + if (start <= str.data() && str.data() <= end) { + // The string's data is stored inside the string object itself. + return 0; + } else { + return str.capacity(); + } +} + +bool ParseNamedEnum(const EnumDescriptor* descriptor, + const string& name, + int* value) { + const EnumValueDescriptor* d = descriptor->FindValueByName(name); + if (d == NULL) return false; + *value = d->number(); + return true; +} + +const string& NameOfEnum(const EnumDescriptor* descriptor, int value) { + const EnumValueDescriptor* d = descriptor->FindValueByNumber(value); + return (d == NULL ? kEmptyString : d->name()); +} + +// =================================================================== +// Helpers for reporting usage errors (e.g. trying to use GetInt32() on +// a string field). + +namespace { + +void ReportReflectionUsageError( + const Descriptor* descriptor, const FieldDescriptor* field, + const char* method, const char* description) { + GOOGLE_LOG(FATAL) + << "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::" << method << "\n" + " Message type: " << descriptor->full_name() << "\n" + " Field : " << field->full_name() << "\n" + " Problem : " << description; +} + +const char* cpptype_names_[FieldDescriptor::MAX_CPPTYPE + 1] = { + "INVALID_CPPTYPE", + "CPPTYPE_INT32", + "CPPTYPE_INT64", + "CPPTYPE_UINT32", + "CPPTYPE_UINT64", + "CPPTYPE_DOUBLE", + "CPPTYPE_FLOAT", + "CPPTYPE_BOOL", + "CPPTYPE_ENUM", + "CPPTYPE_STRING", + "CPPTYPE_MESSAGE" +}; + +static void ReportReflectionUsageTypeError( + const Descriptor* descriptor, const FieldDescriptor* field, + const char* method, + FieldDescriptor::CppType expected_type) { + GOOGLE_LOG(FATAL) + << "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::" << method << "\n" + " Message type: " << descriptor->full_name() << "\n" + " Field : " << field->full_name() << "\n" + " Problem : Field is not the right type for this message:\n" + " Expected : " << cpptype_names_[expected_type] << "\n" + " Field type: " << cpptype_names_[field->cpp_type()]; +} + +static void ReportReflectionUsageEnumTypeError( + const Descriptor* descriptor, const FieldDescriptor* field, + const char* method, const EnumValueDescriptor* value) { + GOOGLE_LOG(FATAL) + << "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::" << method << "\n" + " Message type: " << descriptor->full_name() << "\n" + " Field : " << field->full_name() << "\n" + " Problem : Enum value did not match field type:\n" + " Expected : " << field->enum_type()->full_name() << "\n" + " Actual : " << value->full_name(); +} + +#define USAGE_CHECK(CONDITION, METHOD, ERROR_DESCRIPTION) \ + if (!(CONDITION)) \ + ReportReflectionUsageError(descriptor_, field, #METHOD, ERROR_DESCRIPTION) +#define USAGE_CHECK_EQ(A, B, METHOD, ERROR_DESCRIPTION) \ + USAGE_CHECK((A) == (B), METHOD, ERROR_DESCRIPTION) +#define USAGE_CHECK_NE(A, B, METHOD, ERROR_DESCRIPTION) \ + USAGE_CHECK((A) != (B), METHOD, ERROR_DESCRIPTION) + +#define USAGE_CHECK_TYPE(METHOD, CPPTYPE) \ + if (field->cpp_type() != FieldDescriptor::CPPTYPE_##CPPTYPE) \ + ReportReflectionUsageTypeError(descriptor_, field, #METHOD, \ + FieldDescriptor::CPPTYPE_##CPPTYPE) + +#define USAGE_CHECK_ENUM_VALUE(METHOD) \ + if (value->type() != field->enum_type()) \ + ReportReflectionUsageEnumTypeError(descriptor_, field, #METHOD, value) + +#define USAGE_CHECK_MESSAGE_TYPE(METHOD) \ + USAGE_CHECK_EQ(field->containing_type(), descriptor_, \ + METHOD, "Field does not match message type."); +#define USAGE_CHECK_SINGULAR(METHOD) \ + USAGE_CHECK_NE(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ + "Field is repeated; the method requires a singular field.") +#define USAGE_CHECK_REPEATED(METHOD) \ + USAGE_CHECK_EQ(field->label(), FieldDescriptor::LABEL_REPEATED, METHOD, \ + "Field is singular; the method requires a repeated field.") + +#define USAGE_CHECK_ALL(METHOD, LABEL, CPPTYPE) \ + USAGE_CHECK_MESSAGE_TYPE(METHOD); \ + USAGE_CHECK_##LABEL(METHOD); \ + USAGE_CHECK_TYPE(METHOD, CPPTYPE) + +} // namespace + +// =================================================================== + +GeneratedMessageReflection::GeneratedMessageReflection( + const Descriptor* descriptor, + const Message* default_instance, + const int offsets[], + int has_bits_offset, + int unknown_fields_offset, + int extensions_offset, + const DescriptorPool* descriptor_pool, + MessageFactory* factory, + int object_size) + : descriptor_ (descriptor), + default_instance_ (default_instance), + offsets_ (offsets), + has_bits_offset_ (has_bits_offset), + unknown_fields_offset_(unknown_fields_offset), + extensions_offset_(extensions_offset), + object_size_ (object_size), + descriptor_pool_ ((descriptor_pool == NULL) ? + DescriptorPool::generated_pool() : + descriptor_pool), + message_factory_ (factory) { +} + +GeneratedMessageReflection::~GeneratedMessageReflection() {} + +const UnknownFieldSet& GeneratedMessageReflection::GetUnknownFields( + const Message& message) const { + const void* ptr = reinterpret_cast(&message) + + unknown_fields_offset_; + return *reinterpret_cast(ptr); +} +UnknownFieldSet* GeneratedMessageReflection::MutableUnknownFields( + Message* message) const { + void* ptr = reinterpret_cast(message) + unknown_fields_offset_; + return reinterpret_cast(ptr); +} + +int GeneratedMessageReflection::SpaceUsed(const Message& message) const { + // object_size_ already includes the in-memory representation of each field + // in the message, so we only need to account for additional memory used by + // the fields. + int total_size = object_size_; + + total_size += GetUnknownFields(message).SpaceUsedExcludingSelf(); + + if (extensions_offset_ != -1) { + total_size += GetExtensionSet(message).SpaceUsedExcludingSelf(); + } + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + + if (field->is_repeated()) { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + total_size += GetRaw >(message, field) \ + .SpaceUsedExcludingSelf(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + total_size += GetRaw >(message, field) + .SpaceUsedExcludingSelf(); + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + // We don't know which subclass of RepeatedPtrFieldBase the type is, + // so we use RepeatedPtrFieldBase directly. + total_size += + GetRaw(message, field) + .SpaceUsedExcludingSelf >(); + break; + } + } else { + switch (field->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32 : + case FieldDescriptor::CPPTYPE_INT64 : + case FieldDescriptor::CPPTYPE_UINT32: + case FieldDescriptor::CPPTYPE_UINT64: + case FieldDescriptor::CPPTYPE_DOUBLE: + case FieldDescriptor::CPPTYPE_FLOAT : + case FieldDescriptor::CPPTYPE_BOOL : + case FieldDescriptor::CPPTYPE_ENUM : + // Field is inline, so we've already counted it. + break; + + case FieldDescriptor::CPPTYPE_STRING: { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: { + const string* ptr = GetField(message, field); + + // Initially, the string points to the default value stored in + // the prototype. Only count the string if it has been changed + // from the default value. + const string* default_ptr = DefaultRaw(field); + + if (ptr != default_ptr) { + // string fields are represented by just a pointer, so also + // include sizeof(string) as well. + total_size += sizeof(*ptr) + StringSpaceUsedExcludingSelf(*ptr); + } + break; + } + } + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: + if (&message == default_instance_) { + // For singular fields, the prototype just stores a pointer to the + // external type's prototype, so there is no extra memory usage. + } else { + const Message* sub_message = GetRaw(message, field); + if (sub_message != NULL) { + total_size += sub_message->SpaceUsed(); + } + } + break; + } + } + } + + return total_size; +} + +void GeneratedMessageReflection::Swap( + Message* message1, + Message* message2) const { + if (message1 == message2) return; + + // TODO(kenton): Other Reflection methods should probably check this too. + GOOGLE_CHECK_EQ(message1->GetReflection(), this) + << "First argument to Swap() (of type \"" + << message1->GetDescriptor()->full_name() + << "\") is not compatible with this reflection object (which is for type \"" + << descriptor_->full_name() + << "\"). Note that the exact same class is required; not just the same " + "descriptor."; + GOOGLE_CHECK_EQ(message2->GetReflection(), this) + << "Second argument to Swap() (of type \"" + << message1->GetDescriptor()->full_name() + << "\") is not compatible with this reflection object (which is for type \"" + << descriptor_->full_name() + << "\"). Note that the exact same class is required; not just the same " + "descriptor."; + + uint32* has_bits1 = MutableHasBits(message1); + uint32* has_bits2 = MutableHasBits(message2); + int has_bits_size = (descriptor_->field_count() + 31) / 32; + + for (int i = 0; i < has_bits_size; i++) { + std::swap(has_bits1[i], has_bits2[i]); + } + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (field->is_repeated()) { + switch (field->cpp_type()) { +#define SWAP_ARRAYS(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + MutableRaw >(message1, field)->Swap( \ + MutableRaw >(message2, field)); \ + break; + + SWAP_ARRAYS(INT32 , int32 ); + SWAP_ARRAYS(INT64 , int64 ); + SWAP_ARRAYS(UINT32, uint32); + SWAP_ARRAYS(UINT64, uint64); + SWAP_ARRAYS(FLOAT , float ); + SWAP_ARRAYS(DOUBLE, double); + SWAP_ARRAYS(BOOL , bool ); + SWAP_ARRAYS(ENUM , int ); +#undef SWAP_ARRAYS + + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_MESSAGE: + MutableRaw(message1, field)->Swap( + MutableRaw(message2, field)); + break; + + default: + GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); + } + } else { + switch (field->cpp_type()) { +#define SWAP_VALUES(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + std::swap(*MutableRaw(message1, field), \ + *MutableRaw(message2, field)); \ + break; + + SWAP_VALUES(INT32 , int32 ); + SWAP_VALUES(INT64 , int64 ); + SWAP_VALUES(UINT32, uint32); + SWAP_VALUES(UINT64, uint64); + SWAP_VALUES(FLOAT , float ); + SWAP_VALUES(DOUBLE, double); + SWAP_VALUES(BOOL , bool ); + SWAP_VALUES(ENUM , int ); + SWAP_VALUES(MESSAGE, Message*); +#undef SWAP_VALUES + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + std::swap(*MutableRaw(message1, field), + *MutableRaw(message2, field)); + break; + } + break; + + default: + GOOGLE_LOG(FATAL) << "Unimplemented type: " << field->cpp_type(); + } + } + } + + if (extensions_offset_ != -1) { + MutableExtensionSet(message1)->Swap(MutableExtensionSet(message2)); + } + + MutableUnknownFields(message1)->Swap(MutableUnknownFields(message2)); +} + +// ------------------------------------------------------------------- + +bool GeneratedMessageReflection::HasField(const Message& message, + const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(HasField); + USAGE_CHECK_SINGULAR(HasField); + + if (field->is_extension()) { + return GetExtensionSet(message).Has(field->number()); + } else { + return HasBit(message, field); + } +} + +int GeneratedMessageReflection::FieldSize(const Message& message, + const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(FieldSize); + USAGE_CHECK_REPEATED(FieldSize); + + if (field->is_extension()) { + return GetExtensionSet(message).ExtensionSize(field->number()); + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + return GetRaw >(message, field).size() + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_MESSAGE: + return GetRaw(message, field).size(); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return 0; + } +} + +void GeneratedMessageReflection::ClearField( + Message* message, const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(ClearField); + + if (field->is_extension()) { + MutableExtensionSet(message)->ClearExtension(field->number()); + } else if (!field->is_repeated()) { + if (HasBit(*message, field)) { + ClearBit(message, field); + + // We need to set the field back to its default value. + switch (field->cpp_type()) { +#define CLEAR_TYPE(CPPTYPE, TYPE) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + *MutableRaw(message, field) = \ + field->default_value_##TYPE(); \ + break; + + CLEAR_TYPE(INT32 , int32 ); + CLEAR_TYPE(INT64 , int64 ); + CLEAR_TYPE(UINT32, uint32); + CLEAR_TYPE(UINT64, uint64); + CLEAR_TYPE(FLOAT , float ); + CLEAR_TYPE(DOUBLE, double); + CLEAR_TYPE(BOOL , bool ); +#undef CLEAR_TYPE + + case FieldDescriptor::CPPTYPE_ENUM: + *MutableRaw(message, field) = + field->default_value_enum()->number(); + break; + + case FieldDescriptor::CPPTYPE_STRING: { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + const string* default_ptr = DefaultRaw(field); + string** value = MutableRaw(message, field); + if (*value != default_ptr) { + if (field->has_default_value()) { + (*value)->assign(field->default_value_string()); + } else { + (*value)->clear(); + } + } + break; + } + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: + (*MutableRaw(message, field))->Clear(); + break; + } + } + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + MutableRaw >(message, field)->Clear(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + MutableRaw >(message, field)->Clear(); + break; + } + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: { + // We don't know which subclass of RepeatedPtrFieldBase the type is, + // so we use RepeatedPtrFieldBase directly. + MutableRaw(message, field) + ->Clear >(); + break; + } + } + } +} + +void GeneratedMessageReflection::RemoveLast( + Message* message, + const FieldDescriptor* field) const { + USAGE_CHECK_MESSAGE_TYPE(RemoveLast); + USAGE_CHECK_REPEATED(RemoveLast); + + if (field->is_extension()) { + MutableExtensionSet(message)->RemoveLast(field->number()); + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + MutableRaw >(message, field)->RemoveLast(); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + MutableRaw >(message, field)->RemoveLast(); + break; + } + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + MutableRaw(message, field) + ->RemoveLast >(); + break; + } + } +} + +void GeneratedMessageReflection::SwapElements( + Message* message, + const FieldDescriptor* field, + int index1, + int index2) const { + USAGE_CHECK_MESSAGE_TYPE(Swap); + USAGE_CHECK_REPEATED(Swap); + + if (field->is_extension()) { + MutableExtensionSet(message)->SwapElements(field->number(), index1, index2); + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(UPPERCASE, LOWERCASE) \ + case FieldDescriptor::CPPTYPE_##UPPERCASE : \ + MutableRaw >(message, field) \ + ->SwapElements(index1, index2); \ + break + + HANDLE_TYPE( INT32, int32); + HANDLE_TYPE( INT64, int64); + HANDLE_TYPE(UINT32, uint32); + HANDLE_TYPE(UINT64, uint64); + HANDLE_TYPE(DOUBLE, double); + HANDLE_TYPE( FLOAT, float); + HANDLE_TYPE( BOOL, bool); + HANDLE_TYPE( ENUM, int); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_STRING: + case FieldDescriptor::CPPTYPE_MESSAGE: + MutableRaw(message, field) + ->SwapElements(index1, index2); + break; + } + } +} + +namespace { +// Comparison functor for sorting FieldDescriptors by field number. +struct FieldNumberSorter { + bool operator()(const FieldDescriptor* left, + const FieldDescriptor* right) const { + return left->number() < right->number(); + } +}; +} // namespace + +void GeneratedMessageReflection::ListFields( + const Message& message, + vector* output) const { + output->clear(); + + // Optimization: The default instance never has any fields set. + if (&message == default_instance_) return; + + for (int i = 0; i < descriptor_->field_count(); i++) { + const FieldDescriptor* field = descriptor_->field(i); + if (field->is_repeated()) { + if (FieldSize(message, field) > 0) { + output->push_back(field); + } + } else { + if (HasBit(message, field)) { + output->push_back(field); + } + } + } + + if (extensions_offset_ != -1) { + GetExtensionSet(message).AppendToList(descriptor_, descriptor_pool_, + output); + } + + // ListFields() must sort output by field number. + sort(output->begin(), output->end(), FieldNumberSorter()); +} + +// ------------------------------------------------------------------- + +#undef DEFINE_PRIMITIVE_ACCESSORS +#define DEFINE_PRIMITIVE_ACCESSORS(TYPENAME, TYPE, PASSTYPE, CPPTYPE) \ + PASSTYPE GeneratedMessageReflection::Get##TYPENAME( \ + const Message& message, const FieldDescriptor* field) const { \ + USAGE_CHECK_ALL(Get##TYPENAME, SINGULAR, CPPTYPE); \ + if (field->is_extension()) { \ + return GetExtensionSet(message).Get##TYPENAME( \ + field->number(), field->default_value_##PASSTYPE()); \ + } else { \ + return GetField(message, field); \ + } \ + } \ + \ + void GeneratedMessageReflection::Set##TYPENAME( \ + Message* message, const FieldDescriptor* field, \ + PASSTYPE value) const { \ + USAGE_CHECK_ALL(Set##TYPENAME, SINGULAR, CPPTYPE); \ + if (field->is_extension()) { \ + return MutableExtensionSet(message)->Set##TYPENAME( \ + field->number(), field->type(), value, field); \ + } else { \ + SetField(message, field, value); \ + } \ + } \ + \ + PASSTYPE GeneratedMessageReflection::GetRepeated##TYPENAME( \ + const Message& message, \ + const FieldDescriptor* field, int index) const { \ + USAGE_CHECK_ALL(GetRepeated##TYPENAME, REPEATED, CPPTYPE); \ + if (field->is_extension()) { \ + return GetExtensionSet(message).GetRepeated##TYPENAME( \ + field->number(), index); \ + } else { \ + return GetRepeatedField(message, field, index); \ + } \ + } \ + \ + void GeneratedMessageReflection::SetRepeated##TYPENAME( \ + Message* message, const FieldDescriptor* field, \ + int index, PASSTYPE value) const { \ + USAGE_CHECK_ALL(SetRepeated##TYPENAME, REPEATED, CPPTYPE); \ + if (field->is_extension()) { \ + MutableExtensionSet(message)->SetRepeated##TYPENAME( \ + field->number(), index, value); \ + } else { \ + SetRepeatedField(message, field, index, value); \ + } \ + } \ + \ + void GeneratedMessageReflection::Add##TYPENAME( \ + Message* message, const FieldDescriptor* field, \ + PASSTYPE value) const { \ + USAGE_CHECK_ALL(Add##TYPENAME, REPEATED, CPPTYPE); \ + if (field->is_extension()) { \ + MutableExtensionSet(message)->Add##TYPENAME( \ + field->number(), field->type(), field->options().packed(), value, \ + field); \ + } else { \ + AddField(message, field, value); \ + } \ + } + +DEFINE_PRIMITIVE_ACCESSORS(Int32 , int32 , int32 , INT32 ) +DEFINE_PRIMITIVE_ACCESSORS(Int64 , int64 , int64 , INT64 ) +DEFINE_PRIMITIVE_ACCESSORS(UInt32, uint32, uint32, UINT32) +DEFINE_PRIMITIVE_ACCESSORS(UInt64, uint64, uint64, UINT64) +DEFINE_PRIMITIVE_ACCESSORS(Float , float , float , FLOAT ) +DEFINE_PRIMITIVE_ACCESSORS(Double, double, double, DOUBLE) +DEFINE_PRIMITIVE_ACCESSORS(Bool , bool , bool , BOOL ) +#undef DEFINE_PRIMITIVE_ACCESSORS + +// ------------------------------------------------------------------- + +string GeneratedMessageReflection::GetString( + const Message& message, const FieldDescriptor* field) const { + USAGE_CHECK_ALL(GetString, SINGULAR, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetString(field->number(), + field->default_value_string()); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return *GetField(message, field); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return kEmptyString; // Make compiler happy. + } +} + +const string& GeneratedMessageReflection::GetStringReference( + const Message& message, + const FieldDescriptor* field, string* scratch) const { + USAGE_CHECK_ALL(GetStringReference, SINGULAR, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetString(field->number(), + field->default_value_string()); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return *GetField(message, field); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return kEmptyString; // Make compiler happy. + } +} + + +void GeneratedMessageReflection::SetString( + Message* message, const FieldDescriptor* field, + const string& value) const { + USAGE_CHECK_ALL(SetString, SINGULAR, STRING); + if (field->is_extension()) { + return MutableExtensionSet(message)->SetString(field->number(), + field->type(), value, field); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: { + string** ptr = MutableField(message, field); + if (*ptr == DefaultRaw(field)) { + *ptr = new string(value); + } else { + (*ptr)->assign(value); + } + break; + } + } + } +} + + +string GeneratedMessageReflection::GetRepeatedString( + const Message& message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(GetRepeatedString, REPEATED, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetRepeatedString(field->number(), index); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return GetRepeatedPtrField(message, field, index); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return kEmptyString; // Make compiler happy. + } +} + +const string& GeneratedMessageReflection::GetRepeatedStringReference( + const Message& message, const FieldDescriptor* field, + int index, string* scratch) const { + USAGE_CHECK_ALL(GetRepeatedStringReference, REPEATED, STRING); + if (field->is_extension()) { + return GetExtensionSet(message).GetRepeatedString(field->number(), index); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + return GetRepeatedPtrField(message, field, index); + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + return kEmptyString; // Make compiler happy. + } +} + + +void GeneratedMessageReflection::SetRepeatedString( + Message* message, const FieldDescriptor* field, + int index, const string& value) const { + USAGE_CHECK_ALL(SetRepeatedString, REPEATED, STRING); + if (field->is_extension()) { + MutableExtensionSet(message)->SetRepeatedString( + field->number(), index, value); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + *MutableRepeatedField(message, field, index) = value; + break; + } + } +} + + +void GeneratedMessageReflection::AddString( + Message* message, const FieldDescriptor* field, + const string& value) const { + USAGE_CHECK_ALL(AddString, REPEATED, STRING); + if (field->is_extension()) { + MutableExtensionSet(message)->AddString(field->number(), + field->type(), value, field); + } else { + switch (field->options().ctype()) { + default: // TODO(kenton): Support other string reps. + case FieldOptions::STRING: + *AddField(message, field) = value; + break; + } + } +} + + +// ------------------------------------------------------------------- + +const EnumValueDescriptor* GeneratedMessageReflection::GetEnum( + const Message& message, const FieldDescriptor* field) const { + USAGE_CHECK_ALL(GetEnum, SINGULAR, ENUM); + + int value; + if (field->is_extension()) { + value = GetExtensionSet(message).GetEnum( + field->number(), field->default_value_enum()->number()); + } else { + value = GetField(message, field); + } + const EnumValueDescriptor* result = + field->enum_type()->FindValueByNumber(value); + GOOGLE_CHECK(result != NULL); + return result; +} + +void GeneratedMessageReflection::SetEnum( + Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const { + USAGE_CHECK_ALL(SetEnum, SINGULAR, ENUM); + USAGE_CHECK_ENUM_VALUE(SetEnum); + + if (field->is_extension()) { + MutableExtensionSet(message)->SetEnum(field->number(), field->type(), + value->number(), field); + } else { + SetField(message, field, value->number()); + } +} + +const EnumValueDescriptor* GeneratedMessageReflection::GetRepeatedEnum( + const Message& message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(GetRepeatedEnum, REPEATED, ENUM); + + int value; + if (field->is_extension()) { + value = GetExtensionSet(message).GetRepeatedEnum(field->number(), index); + } else { + value = GetRepeatedField(message, field, index); + } + const EnumValueDescriptor* result = + field->enum_type()->FindValueByNumber(value); + GOOGLE_CHECK(result != NULL); + return result; +} + +void GeneratedMessageReflection::SetRepeatedEnum( + Message* message, + const FieldDescriptor* field, int index, + const EnumValueDescriptor* value) const { + USAGE_CHECK_ALL(SetRepeatedEnum, REPEATED, ENUM); + USAGE_CHECK_ENUM_VALUE(SetRepeatedEnum); + + if (field->is_extension()) { + MutableExtensionSet(message)->SetRepeatedEnum( + field->number(), index, value->number()); + } else { + SetRepeatedField(message, field, index, value->number()); + } +} + +void GeneratedMessageReflection::AddEnum( + Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const { + USAGE_CHECK_ALL(AddEnum, REPEATED, ENUM); + USAGE_CHECK_ENUM_VALUE(AddEnum); + + if (field->is_extension()) { + MutableExtensionSet(message)->AddEnum(field->number(), field->type(), + field->options().packed(), + value->number(), field); + } else { + AddField(message, field, value->number()); + } +} + +// ------------------------------------------------------------------- + +const Message& GeneratedMessageReflection::GetMessage( + const Message& message, const FieldDescriptor* field, + MessageFactory* factory) const { + USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE); + + if (field->is_extension()) { + return static_cast( + GetExtensionSet(message).GetMessage( + field->number(), field->message_type(), + factory == NULL ? message_factory_ : factory)); + } else { + const Message* result = GetRaw(message, field); + if (result == NULL) { + result = DefaultRaw(field); + } + return *result; + } +} + +Message* GeneratedMessageReflection::MutableMessage( + Message* message, const FieldDescriptor* field, + MessageFactory* factory) const { + USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE); + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->MutableMessage(field, + factory == NULL ? message_factory_ : factory)); + } else { + Message** result = MutableField(message, field); + if (*result == NULL) { + const Message* default_message = DefaultRaw(field); + *result = default_message->New(); + } + return *result; + } +} + +const Message& GeneratedMessageReflection::GetRepeatedMessage( + const Message& message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE); + + if (field->is_extension()) { + return static_cast( + GetExtensionSet(message).GetRepeatedMessage(field->number(), index)); + } else { + return GetRaw(message, field) + .Get >(index); + } +} + +Message* GeneratedMessageReflection::MutableRepeatedMessage( + Message* message, const FieldDescriptor* field, int index) const { + USAGE_CHECK_ALL(MutableRepeatedMessage, REPEATED, MESSAGE); + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->MutableRepeatedMessage( + field->number(), index)); + } else { + return MutableRaw(message, field) + ->Mutable >(index); + } +} + +Message* GeneratedMessageReflection::AddMessage( + Message* message, const FieldDescriptor* field, + MessageFactory* factory) const { + USAGE_CHECK_ALL(AddMessage, REPEATED, MESSAGE); + + if (factory == NULL) factory = message_factory_; + + if (field->is_extension()) { + return static_cast( + MutableExtensionSet(message)->AddMessage(field, factory)); + } else { + // We can't use AddField() because RepeatedPtrFieldBase doesn't + // know how to allocate one. + RepeatedPtrFieldBase* repeated = + MutableRaw(message, field); + Message* result = repeated->AddFromCleared >(); + if (result == NULL) { + // We must allocate a new object. + const Message* prototype; + if (repeated->size() == 0) { + prototype = factory->GetPrototype(field->message_type()); + } else { + prototype = &repeated->Get >(0); + } + result = prototype->New(); + repeated->AddAllocated >(result); + } + return result; + } +} + +// ------------------------------------------------------------------- + +const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName( + const string& name) const { + if (extensions_offset_ == -1) return NULL; + + const FieldDescriptor* result = descriptor_pool_->FindExtensionByName(name); + if (result != NULL && result->containing_type() == descriptor_) { + return result; + } + + if (descriptor_->options().message_set_wire_format()) { + // MessageSet extensions may be identified by type name. + const Descriptor* type = descriptor_pool_->FindMessageTypeByName(name); + if (type != NULL) { + // Look for a matching extension in the foreign type's scope. + for (int i = 0; i < type->extension_count(); i++) { + const FieldDescriptor* extension = type->extension(i); + if (extension->containing_type() == descriptor_ && + extension->type() == FieldDescriptor::TYPE_MESSAGE && + extension->is_optional() && + extension->message_type() == type) { + // Found it. + return extension; + } + } + } + } + + return NULL; +} + +const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByNumber( + int number) const { + if (extensions_offset_ == -1) return NULL; + return descriptor_pool_->FindExtensionByNumber(descriptor_, number); +} + +// =================================================================== +// Some private helpers. + +// These simple template accessors obtain pointers (or references) to +// the given field. +template +inline const Type& GeneratedMessageReflection::GetRaw( + const Message& message, const FieldDescriptor* field) const { + const void* ptr = reinterpret_cast(&message) + + offsets_[field->index()]; + return *reinterpret_cast(ptr); +} + +template +inline Type* GeneratedMessageReflection::MutableRaw( + Message* message, const FieldDescriptor* field) const { + void* ptr = reinterpret_cast(message) + offsets_[field->index()]; + return reinterpret_cast(ptr); +} + +template +inline const Type& GeneratedMessageReflection::DefaultRaw( + const FieldDescriptor* field) const { + const void* ptr = reinterpret_cast(default_instance_) + + offsets_[field->index()]; + return *reinterpret_cast(ptr); +} + +inline const uint32* GeneratedMessageReflection::GetHasBits( + const Message& message) const { + const void* ptr = reinterpret_cast(&message) + has_bits_offset_; + return reinterpret_cast(ptr); +} +inline uint32* GeneratedMessageReflection::MutableHasBits( + Message* message) const { + void* ptr = reinterpret_cast(message) + has_bits_offset_; + return reinterpret_cast(ptr); +} + +inline const ExtensionSet& GeneratedMessageReflection::GetExtensionSet( + const Message& message) const { + GOOGLE_DCHECK_NE(extensions_offset_, -1); + const void* ptr = reinterpret_cast(&message) + + extensions_offset_; + return *reinterpret_cast(ptr); +} +inline ExtensionSet* GeneratedMessageReflection::MutableExtensionSet( + Message* message) const { + GOOGLE_DCHECK_NE(extensions_offset_, -1); + void* ptr = reinterpret_cast(message) + extensions_offset_; + return reinterpret_cast(ptr); +} + +// Simple accessors for manipulating has_bits_. +inline bool GeneratedMessageReflection::HasBit( + const Message& message, const FieldDescriptor* field) const { + return GetHasBits(message)[field->index() / 32] & + (1 << (field->index() % 32)); +} + +inline void GeneratedMessageReflection::SetBit( + Message* message, const FieldDescriptor* field) const { + MutableHasBits(message)[field->index() / 32] |= (1 << (field->index() % 32)); +} + +inline void GeneratedMessageReflection::ClearBit( + Message* message, const FieldDescriptor* field) const { + MutableHasBits(message)[field->index() / 32] &= ~(1 << (field->index() % 32)); +} + +// Template implementations of basic accessors. Inline because each +// template instance is only called from one location. These are +// used for all types except messages. +template +inline const Type& GeneratedMessageReflection::GetField( + const Message& message, const FieldDescriptor* field) const { + return GetRaw(message, field); +} + +template +inline void GeneratedMessageReflection::SetField( + Message* message, const FieldDescriptor* field, const Type& value) const { + *MutableRaw(message, field) = value; + SetBit(message, field); +} + +template +inline Type* GeneratedMessageReflection::MutableField( + Message* message, const FieldDescriptor* field) const { + SetBit(message, field); + return MutableRaw(message, field); +} + +template +inline const Type& GeneratedMessageReflection::GetRepeatedField( + const Message& message, const FieldDescriptor* field, int index) const { + return GetRaw >(message, field).Get(index); +} + +template +inline const Type& GeneratedMessageReflection::GetRepeatedPtrField( + const Message& message, const FieldDescriptor* field, int index) const { + return GetRaw >(message, field).Get(index); +} + +template +inline void GeneratedMessageReflection::SetRepeatedField( + Message* message, const FieldDescriptor* field, + int index, Type value) const { + MutableRaw >(message, field)->Set(index, value); +} + +template +inline Type* GeneratedMessageReflection::MutableRepeatedField( + Message* message, const FieldDescriptor* field, int index) const { + RepeatedPtrField* repeated = + MutableRaw >(message, field); + return repeated->Mutable(index); +} + +template +inline void GeneratedMessageReflection::AddField( + Message* message, const FieldDescriptor* field, const Type& value) const { + MutableRaw >(message, field)->Add(value); +} + +template +inline Type* GeneratedMessageReflection::AddField( + Message* message, const FieldDescriptor* field) const { + RepeatedPtrField* repeated = + MutableRaw >(message, field); + return repeated->Add(); +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h new file mode 100644 index 000000000..b545fa1a2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h @@ -0,0 +1,424 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ +#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ + +#include +#include +#include +#include + + +namespace google { +namespace protobuf { + class DescriptorPool; + // Generated code needs these to have been forward-declared. Easier to do it + // here than to print them inside every .pb.h file. + class FileDescriptor; + class EnumDescriptor; +} + +namespace protobuf { +namespace internal { + +// Defined in this file. +class GeneratedMessageReflection; + +// Defined in other files. +class ExtensionSet; // extension_set.h + +// THIS CLASS IS NOT INTENDED FOR DIRECT USE. It is intended for use +// by generated code. This class is just a big hack that reduces code +// size. +// +// A GeneratedMessageReflection is an implementation of Reflection +// which expects all fields to be backed by simple variables located in +// memory. The locations are given using a base pointer and a set of +// offsets. +// +// It is required that the user represents fields of each type in a standard +// way, so that GeneratedMessageReflection can cast the void* pointer to +// the appropriate type. For primitive fields and string fields, each field +// should be represented using the obvious C++ primitive type. Enums and +// Messages are different: +// - Singular Message fields are stored as a pointer to a Message. These +// should start out NULL, except for in the default instance where they +// should start out pointing to other default instances. +// - Enum fields are stored as an int. This int must always contain +// a valid value, such that EnumDescriptor::FindValueByNumber() would +// not return NULL. +// - Repeated fields are stored as RepeatedFields or RepeatedPtrFields +// of whatever type the individual field would be. Strings and +// Messages use RepeatedPtrFields while everything else uses +// RepeatedFields. +class LIBPROTOBUF_EXPORT GeneratedMessageReflection : public Reflection { + public: + // Constructs a GeneratedMessageReflection. + // Parameters: + // descriptor: The descriptor for the message type being implemented. + // default_instance: The default instance of the message. This is only + // used to obtain pointers to default instances of embedded + // messages, which GetMessage() will return if the particular + // sub-message has not been initialized yet. (Thus, all + // embedded message fields *must* have non-NULL pointers + // in the default instance.) + // offsets: An array of ints giving the byte offsets, relative to + // the start of the message object, of each field. These can + // be computed at compile time using the + // GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET() macro, defined + // below. + // has_bits_offset: Offset in the message of an array of uint32s of size + // descriptor->field_count()/32, rounded up. This is a + // bitfield where each bit indicates whether or not the + // corresponding field of the message has been initialized. + // The bit for field index i is obtained by the expression: + // has_bits[i / 32] & (1 << (i % 32)) + // unknown_fields_offset: Offset in the message of the UnknownFieldSet for + // the message. + // extensions_offset: Offset in the message of the ExtensionSet for the + // message, or -1 if the message type has no extension + // ranges. + // pool: DescriptorPool to search for extension definitions. Only + // used by FindKnownExtensionByName() and + // FindKnownExtensionByNumber(). + // factory: MessageFactory to use to construct extension messages. + // object_size: The size of a message object of this type, as measured + // by sizeof(). + GeneratedMessageReflection(const Descriptor* descriptor, + const Message* default_instance, + const int offsets[], + int has_bits_offset, + int unknown_fields_offset, + int extensions_offset, + const DescriptorPool* pool, + MessageFactory* factory, + int object_size); + ~GeneratedMessageReflection(); + + // implements Reflection ------------------------------------------- + + const UnknownFieldSet& GetUnknownFields(const Message& message) const; + UnknownFieldSet* MutableUnknownFields(Message* message) const; + + int SpaceUsed(const Message& message) const; + + bool HasField(const Message& message, const FieldDescriptor* field) const; + int FieldSize(const Message& message, const FieldDescriptor* field) const; + void ClearField(Message* message, const FieldDescriptor* field) const; + void RemoveLast(Message* message, const FieldDescriptor* field) const; + void Swap(Message* message1, Message* message2) const; + void SwapElements(Message* message, const FieldDescriptor* field, + int index1, int index2) const; + void ListFields(const Message& message, + vector* output) const; + + int32 GetInt32 (const Message& message, + const FieldDescriptor* field) const; + int64 GetInt64 (const Message& message, + const FieldDescriptor* field) const; + uint32 GetUInt32(const Message& message, + const FieldDescriptor* field) const; + uint64 GetUInt64(const Message& message, + const FieldDescriptor* field) const; + float GetFloat (const Message& message, + const FieldDescriptor* field) const; + double GetDouble(const Message& message, + const FieldDescriptor* field) const; + bool GetBool (const Message& message, + const FieldDescriptor* field) const; + string GetString(const Message& message, + const FieldDescriptor* field) const; + const string& GetStringReference(const Message& message, + const FieldDescriptor* field, + string* scratch) const; + const EnumValueDescriptor* GetEnum(const Message& message, + const FieldDescriptor* field) const; + const Message& GetMessage(const Message& message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const; + + void SetInt32 (Message* message, + const FieldDescriptor* field, int32 value) const; + void SetInt64 (Message* message, + const FieldDescriptor* field, int64 value) const; + void SetUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const; + void SetUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const; + void SetFloat (Message* message, + const FieldDescriptor* field, float value) const; + void SetDouble(Message* message, + const FieldDescriptor* field, double value) const; + void SetBool (Message* message, + const FieldDescriptor* field, bool value) const; + void SetString(Message* message, + const FieldDescriptor* field, + const string& value) const; + void SetEnum (Message* message, const FieldDescriptor* field, + const EnumValueDescriptor* value) const; + Message* MutableMessage(Message* message, const FieldDescriptor* field, + MessageFactory* factory = NULL) const; + + int32 GetRepeatedInt32 (const Message& message, + const FieldDescriptor* field, int index) const; + int64 GetRepeatedInt64 (const Message& message, + const FieldDescriptor* field, int index) const; + uint32 GetRepeatedUInt32(const Message& message, + const FieldDescriptor* field, int index) const; + uint64 GetRepeatedUInt64(const Message& message, + const FieldDescriptor* field, int index) const; + float GetRepeatedFloat (const Message& message, + const FieldDescriptor* field, int index) const; + double GetRepeatedDouble(const Message& message, + const FieldDescriptor* field, int index) const; + bool GetRepeatedBool (const Message& message, + const FieldDescriptor* field, int index) const; + string GetRepeatedString(const Message& message, + const FieldDescriptor* field, int index) const; + const string& GetRepeatedStringReference(const Message& message, + const FieldDescriptor* field, + int index, string* scratch) const; + const EnumValueDescriptor* GetRepeatedEnum(const Message& message, + const FieldDescriptor* field, + int index) const; + const Message& GetRepeatedMessage(const Message& message, + const FieldDescriptor* field, + int index) const; + + // Set the value of a field. + void SetRepeatedInt32 (Message* message, + const FieldDescriptor* field, int index, int32 value) const; + void SetRepeatedInt64 (Message* message, + const FieldDescriptor* field, int index, int64 value) const; + void SetRepeatedUInt32(Message* message, + const FieldDescriptor* field, int index, uint32 value) const; + void SetRepeatedUInt64(Message* message, + const FieldDescriptor* field, int index, uint64 value) const; + void SetRepeatedFloat (Message* message, + const FieldDescriptor* field, int index, float value) const; + void SetRepeatedDouble(Message* message, + const FieldDescriptor* field, int index, double value) const; + void SetRepeatedBool (Message* message, + const FieldDescriptor* field, int index, bool value) const; + void SetRepeatedString(Message* message, + const FieldDescriptor* field, int index, + const string& value) const; + void SetRepeatedEnum(Message* message, const FieldDescriptor* field, + int index, const EnumValueDescriptor* value) const; + // Get a mutable pointer to a field with a message type. + Message* MutableRepeatedMessage(Message* message, + const FieldDescriptor* field, + int index) const; + + void AddInt32 (Message* message, + const FieldDescriptor* field, int32 value) const; + void AddInt64 (Message* message, + const FieldDescriptor* field, int64 value) const; + void AddUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const; + void AddUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const; + void AddFloat (Message* message, + const FieldDescriptor* field, float value) const; + void AddDouble(Message* message, + const FieldDescriptor* field, double value) const; + void AddBool (Message* message, + const FieldDescriptor* field, bool value) const; + void AddString(Message* message, + const FieldDescriptor* field, const string& value) const; + void AddEnum(Message* message, + const FieldDescriptor* field, + const EnumValueDescriptor* value) const; + Message* AddMessage(Message* message, const FieldDescriptor* field, + MessageFactory* factory = NULL) const; + + const FieldDescriptor* FindKnownExtensionByName(const string& name) const; + const FieldDescriptor* FindKnownExtensionByNumber(int number) const; + + private: + friend class GeneratedMessage; + + const Descriptor* descriptor_; + const Message* default_instance_; + const int* offsets_; + + int has_bits_offset_; + int unknown_fields_offset_; + int extensions_offset_; + int object_size_; + + const DescriptorPool* descriptor_pool_; + MessageFactory* message_factory_; + + template + inline const Type& GetRaw(const Message& message, + const FieldDescriptor* field) const; + template + inline Type* MutableRaw(Message* message, + const FieldDescriptor* field) const; + template + inline const Type& DefaultRaw(const FieldDescriptor* field) const; + inline const Message* GetMessagePrototype(const FieldDescriptor* field) const; + + inline const uint32* GetHasBits(const Message& message) const; + inline uint32* MutableHasBits(Message* message) const; + inline const ExtensionSet& GetExtensionSet(const Message& message) const; + inline ExtensionSet* MutableExtensionSet(Message* message) const; + + inline bool HasBit(const Message& message, + const FieldDescriptor* field) const; + inline void SetBit(Message* message, + const FieldDescriptor* field) const; + inline void ClearBit(Message* message, + const FieldDescriptor* field) const; + + template + inline const Type& GetField(const Message& message, + const FieldDescriptor* field) const; + template + inline void SetField(Message* message, + const FieldDescriptor* field, const Type& value) const; + template + inline Type* MutableField(Message* message, + const FieldDescriptor* field) const; + template + inline const Type& GetRepeatedField(const Message& message, + const FieldDescriptor* field, + int index) const; + template + inline const Type& GetRepeatedPtrField(const Message& message, + const FieldDescriptor* field, + int index) const; + template + inline void SetRepeatedField(Message* message, + const FieldDescriptor* field, int index, + Type value) const; + template + inline Type* MutableRepeatedField(Message* message, + const FieldDescriptor* field, + int index) const; + template + inline void AddField(Message* message, + const FieldDescriptor* field, const Type& value) const; + template + inline Type* AddField(Message* message, + const FieldDescriptor* field) const; + + int GetExtensionNumberOrDie(const Descriptor* type) const; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GeneratedMessageReflection); +}; + +// Returns the offset of the given field within the given aggregate type. +// This is equivalent to the ANSI C offsetof() macro. However, according +// to the C++ standard, offsetof() only works on POD types, and GCC +// enforces this requirement with a warning. In practice, this rule is +// unnecessarily strict; there is probably no compiler or platform on +// which the offsets of the direct fields of a class are non-constant. +// Fields inherited from superclasses *can* have non-constant offsets, +// but that's not what this macro will be used for. +// +// Note that we calculate relative to the pointer value 16 here since if we +// just use zero, GCC complains about dereferencing a NULL pointer. We +// choose 16 rather than some other number just in case the compiler would +// be confused by an unaligned pointer. +#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD) \ + static_cast( \ + reinterpret_cast( \ + &reinterpret_cast(16)->FIELD) - \ + reinterpret_cast(16)) + +// There are some places in proto2 where dynamic_cast would be useful as an +// optimization. For example, take Message::MergeFrom(const Message& other). +// For a given generated message FooMessage, we generate these two methods: +// void MergeFrom(const FooMessage& other); +// void MergeFrom(const Message& other); +// The former method can be implemented directly in terms of FooMessage's +// inline accessors, but the latter method must work with the reflection +// interface. However, if the parameter to the latter method is actually of +// type FooMessage, then we'd like to be able to just call the other method +// as an optimization. So, we use dynamic_cast to check this. +// +// That said, dynamic_cast requires RTTI, which many people like to disable +// for performance and code size reasons. When RTTI is not available, we +// still need to produce correct results. So, in this case we have to fall +// back to using reflection, which is what we would have done anyway if the +// objects were not of the exact same class. +// +// dynamic_cast_if_available() implements this logic. If RTTI is +// enabled, it does a dynamic_cast. If RTTI is disabled, it just returns +// NULL. +// +// If you need to compile without RTTI, simply #define GOOGLE_PROTOBUF_NO_RTTI. +// On MSVC, this should be detected automatically. +template +inline To dynamic_cast_if_available(From from) { +#if defined(GOOGLE_PROTOBUF_NO_RTTI) || (defined(_MSC_VER)&&!defined(_CPPRTTI)) + return NULL; +#else + return dynamic_cast(from); +#endif +} + +// Helper for EnumType_Parse functions: try to parse the string 'name' as an +// enum name of the given type, returning true and filling in value on success, +// or returning false and leaving value unchanged on failure. +LIBPROTOBUF_EXPORT bool ParseNamedEnum(const EnumDescriptor* descriptor, + const string& name, + int* value); + +template +bool ParseNamedEnum(const EnumDescriptor* descriptor, + const string& name, + EnumType* value) { + int tmp; + if (!ParseNamedEnum(descriptor, name, &tmp)) return false; + *value = static_cast(tmp); + return true; +} + +// Just a wrapper around printing the name of a value. The main point of this +// function is not to be inlined, so that you can do this without including +// descriptor.h. +LIBPROTOBUF_EXPORT const string& NameOfEnum(const EnumDescriptor* descriptor, int value); + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_REFLECTION_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc new file mode 100644 index 000000000..a03bcdb7d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc @@ -0,0 +1,384 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// To test GeneratedMessageReflection, we actually let the protocol compiler +// generate a full protocol message implementation and then test its +// reflection interface. This is much easier and more maintainable than +// trying to create our own Message class for GeneratedMessageReflection +// to wrap. +// +// The tests here closely mirror some of the tests in +// compiler/cpp/unittest, except using the reflection interface +// rather than generated accessors. + +#include +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { + +namespace { + +// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes. +const FieldDescriptor* F(const string& name) { + const FieldDescriptor* result = + unittest::TestAllTypes::descriptor()->FindFieldByName(name); + GOOGLE_CHECK(result != NULL); + return result; +} + +TEST(GeneratedMessageReflectionTest, Defaults) { + // Check that all default values are set correctly in the initial message. + unittest::TestAllTypes message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllTypes::descriptor()); + + reflection_tester.ExpectClearViaReflection(message); + + const Reflection* reflection = message.GetReflection(); + + // Messages should return pointers to default instances until first use. + // (This is not checked by ExpectClear() since it is not actually true after + // the fields have been set and then cleared.) + EXPECT_EQ(&unittest::TestAllTypes::OptionalGroup::default_instance(), + &reflection->GetMessage(message, F("optionalgroup"))); + EXPECT_EQ(&unittest::TestAllTypes::NestedMessage::default_instance(), + &reflection->GetMessage(message, F("optional_nested_message"))); + EXPECT_EQ(&unittest::ForeignMessage::default_instance(), + &reflection->GetMessage(message, F("optional_foreign_message"))); + EXPECT_EQ(&unittest_import::ImportMessage::default_instance(), + &reflection->GetMessage(message, F("optional_import_message"))); +} + +TEST(GeneratedMessageReflectionTest, Accessors) { + // Set every field to a unique value then go back and check all those + // values. + unittest::TestAllTypes message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllTypes::descriptor()); + + reflection_tester.SetAllFieldsViaReflection(&message); + TestUtil::ExpectAllFieldsSet(message); + reflection_tester.ExpectAllFieldsSetViaReflection(message); + + reflection_tester.ModifyRepeatedFieldsViaReflection(&message); + TestUtil::ExpectRepeatedFieldsModified(message); +} + +TEST(GeneratedMessageReflectionTest, GetStringReference) { + // Test that GetStringReference() returns the underlying string when it is + // a normal string field. + unittest::TestAllTypes message; + message.set_optional_string("foo"); + message.add_repeated_string("foo"); + + const Reflection* reflection = message.GetReflection(); + string scratch; + + EXPECT_EQ(&message.optional_string(), + &reflection->GetStringReference(message, F("optional_string"), &scratch)) + << "For simple string fields, GetStringReference() should return a " + "reference to the underlying string."; + EXPECT_EQ(&message.repeated_string(0), + &reflection->GetRepeatedStringReference(message, F("repeated_string"), + 0, &scratch)) + << "For simple string fields, GetRepeatedStringReference() should return " + "a reference to the underlying string."; +} + + +TEST(GeneratedMessageReflectionTest, DefaultsAfterClear) { + // Check that after setting all fields and then clearing, getting an + // embedded message does NOT return the default instance. + unittest::TestAllTypes message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllTypes::descriptor()); + + TestUtil::SetAllFields(&message); + message.Clear(); + + const Reflection* reflection = message.GetReflection(); + + EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), + &reflection->GetMessage(message, F("optionalgroup"))); + EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), + &reflection->GetMessage(message, F("optional_nested_message"))); + EXPECT_NE(&unittest::ForeignMessage::default_instance(), + &reflection->GetMessage(message, F("optional_foreign_message"))); + EXPECT_NE(&unittest_import::ImportMessage::default_instance(), + &reflection->GetMessage(message, F("optional_import_message"))); +} + + +TEST(GeneratedMessageReflectionTest, Swap) { + unittest::TestAllTypes message1; + unittest::TestAllTypes message2; + + TestUtil::SetAllFields(&message1); + + const Reflection* reflection = message1.GetReflection(); + reflection->Swap(&message1, &message2); + + TestUtil::ExpectClear(message1); + TestUtil::ExpectAllFieldsSet(message2); +} + +TEST(GeneratedMessageReflectionTest, SwapWithBothSet) { + unittest::TestAllTypes message1; + unittest::TestAllTypes message2; + + TestUtil::SetAllFields(&message1); + TestUtil::SetAllFields(&message2); + TestUtil::ModifyRepeatedFields(&message2); + + const Reflection* reflection = message1.GetReflection(); + reflection->Swap(&message1, &message2); + + TestUtil::ExpectRepeatedFieldsModified(message1); + TestUtil::ExpectAllFieldsSet(message2); + + message1.set_optional_int32(532819); + + reflection->Swap(&message1, &message2); + + EXPECT_EQ(532819, message2.optional_int32()); +} + +TEST(GeneratedMessageReflectionTest, SwapExtensions) { + unittest::TestAllExtensions message1; + unittest::TestAllExtensions message2; + + TestUtil::SetAllExtensions(&message1); + + const Reflection* reflection = message1.GetReflection(); + reflection->Swap(&message1, &message2); + + TestUtil::ExpectExtensionsClear(message1); + TestUtil::ExpectAllExtensionsSet(message2); +} + +TEST(GeneratedMessageReflectionTest, SwapUnknown) { + unittest::TestEmptyMessage message1, message2; + + message1.mutable_unknown_fields()->AddVarint(1234, 1); + + EXPECT_EQ(1, message1.unknown_fields().field_count()); + EXPECT_EQ(0, message2.unknown_fields().field_count()); + const Reflection* reflection = message1.GetReflection(); + reflection->Swap(&message1, &message2); + EXPECT_EQ(0, message1.unknown_fields().field_count()); + EXPECT_EQ(1, message2.unknown_fields().field_count()); +} + +TEST(GeneratedMessageReflectionTest, RemoveLast) { + unittest::TestAllTypes message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllTypes::descriptor()); + + TestUtil::SetAllFields(&message); + + reflection_tester.RemoveLastRepeatedsViaReflection(&message); + + TestUtil::ExpectLastRepeatedsRemoved(message); +} + +TEST(GeneratedMessageReflectionTest, RemoveLastExtensions) { + unittest::TestAllExtensions message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllExtensions::descriptor()); + + TestUtil::SetAllExtensions(&message); + reflection_tester.RemoveLastRepeatedsViaReflection(&message); + + TestUtil::ExpectLastRepeatedExtensionsRemoved(message); +} + +TEST(GeneratedMessageReflectionTest, SwapRepeatedElements) { + unittest::TestAllTypes message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllTypes::descriptor()); + + TestUtil::SetAllFields(&message); + + // Swap and test that fields are all swapped. + reflection_tester.SwapRepeatedsViaReflection(&message); + TestUtil::ExpectRepeatedsSwapped(message); + + // Swap back and test that fields are all back to original values. + reflection_tester.SwapRepeatedsViaReflection(&message); + TestUtil::ExpectAllFieldsSet(message); +} + +TEST(GeneratedMessageReflectionTest, SwapRepeatedElementsExtension) { + unittest::TestAllExtensions message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllExtensions::descriptor()); + + TestUtil::SetAllExtensions(&message); + + // Swap and test that fields are all swapped. + reflection_tester.SwapRepeatedsViaReflection(&message); + TestUtil::ExpectRepeatedExtensionsSwapped(message); + + // Swap back and test that fields are all back to original values. + reflection_tester.SwapRepeatedsViaReflection(&message); + TestUtil::ExpectAllExtensionsSet(message); +} + +TEST(GeneratedMessageReflectionTest, Extensions) { + // Set every extension to a unique value then go back and check all those + // values. + unittest::TestAllExtensions message; + TestUtil::ReflectionTester reflection_tester( + unittest::TestAllExtensions::descriptor()); + + reflection_tester.SetAllFieldsViaReflection(&message); + TestUtil::ExpectAllExtensionsSet(message); + reflection_tester.ExpectAllFieldsSetViaReflection(message); + + reflection_tester.ModifyRepeatedFieldsViaReflection(&message); + TestUtil::ExpectRepeatedExtensionsModified(message); +} + +TEST(GeneratedMessageReflectionTest, FindExtensionTypeByNumber) { + const Reflection* reflection = + unittest::TestAllExtensions::default_instance().GetReflection(); + + const FieldDescriptor* extension1 = + unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( + "optional_int32_extension"); + const FieldDescriptor* extension2 = + unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( + "repeated_string_extension"); + + EXPECT_EQ(extension1, + reflection->FindKnownExtensionByNumber(extension1->number())); + EXPECT_EQ(extension2, + reflection->FindKnownExtensionByNumber(extension2->number())); + + // Non-existent extension. + EXPECT_TRUE(reflection->FindKnownExtensionByNumber(62341) == NULL); + + // Extensions of TestAllExtensions should not show up as extensions of + // other types. + EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> + FindKnownExtensionByNumber(extension1->number()) == NULL); +} + +TEST(GeneratedMessageReflectionTest, FindKnownExtensionByName) { + const Reflection* reflection = + unittest::TestAllExtensions::default_instance().GetReflection(); + + const FieldDescriptor* extension1 = + unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( + "optional_int32_extension"); + const FieldDescriptor* extension2 = + unittest::TestAllExtensions::descriptor()->file()->FindExtensionByName( + "repeated_string_extension"); + + EXPECT_EQ(extension1, + reflection->FindKnownExtensionByName(extension1->full_name())); + EXPECT_EQ(extension2, + reflection->FindKnownExtensionByName(extension2->full_name())); + + // Non-existent extension. + EXPECT_TRUE(reflection->FindKnownExtensionByName("no_such_ext") == NULL); + + // Extensions of TestAllExtensions should not show up as extensions of + // other types. + EXPECT_TRUE(unittest::TestAllTypes::default_instance().GetReflection()-> + FindKnownExtensionByName(extension1->full_name()) == NULL); +} + +#ifdef GTEST_HAS_DEATH_TEST + +TEST(GeneratedMessageReflectionTest, UsageErrors) { + unittest::TestAllTypes message; + const Reflection* reflection = message.GetReflection(); + const Descriptor* descriptor = message.GetDescriptor(); + +#define f(NAME) descriptor->FindFieldByName(NAME) + + // Testing every single failure mode would be too much work. Let's just + // check a few. + EXPECT_DEATH( + reflection->GetInt32( + message, descriptor->FindFieldByName("optional_int64")), + "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::GetInt32\n" + " Message type: protobuf_unittest\\.TestAllTypes\n" + " Field : protobuf_unittest\\.TestAllTypes\\.optional_int64\n" + " Problem : Field is not the right type for this message:\n" + " Expected : CPPTYPE_INT32\n" + " Field type: CPPTYPE_INT64"); + EXPECT_DEATH( + reflection->GetInt32( + message, descriptor->FindFieldByName("repeated_int32")), + "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::GetInt32\n" + " Message type: protobuf_unittest.TestAllTypes\n" + " Field : protobuf_unittest.TestAllTypes.repeated_int32\n" + " Problem : Field is repeated; the method requires a singular field."); + EXPECT_DEATH( + reflection->GetInt32( + message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), + "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::GetInt32\n" + " Message type: protobuf_unittest.TestAllTypes\n" + " Field : protobuf_unittest.ForeignMessage.c\n" + " Problem : Field does not match message type."); + EXPECT_DEATH( + reflection->HasField( + message, unittest::ForeignMessage::descriptor()->FindFieldByName("c")), + "Protocol Buffer reflection usage error:\n" + " Method : google::protobuf::Reflection::HasField\n" + " Message type: protobuf_unittest.TestAllTypes\n" + " Field : protobuf_unittest.ForeignMessage.c\n" + " Problem : Field does not match message type."); + +#undef f +} + +#endif // GTEST_HAS_DEATH_TEST + + +} // namespace +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc new file mode 100644 index 000000000..76e547bb8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc @@ -0,0 +1,55 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include + +namespace google { +namespace protobuf { +namespace internal { + +double Infinity() { + return std::numeric_limits::infinity(); +} +double NaN() { + return std::numeric_limits::quiet_NaN(); +} + +const ::std::string kEmptyString; + + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h new file mode 100644 index 000000000..77ae10640 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h @@ -0,0 +1,82 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains miscellaneous helper code used by generated code -- +// including lite types -- but which should not be used directly by users. + +#ifndef GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ +#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ + +#include + +#include + + +namespace google { +namespace protobuf { + namespace io { + class CodedInputStream; // coded_stream.h + } +} + +namespace protobuf { +namespace internal { + +// Annotation for the compiler to emit a deprecation message if a field marked +// with option 'deprecated=true' is used in the code, or for other things in +// generated code which are deprecated. +// +// For internal use in the pb.cc files, deprecation warnings are suppressed +// there. +#undef DEPRECATED_PROTOBUF_FIELD +#if !defined(INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION) +# define PROTOBUF_DEPRECATED GOOGLE_ATTRIBUTE_DEPRECATED +#else +# define PROTOBUF_DEPRECATED +#endif + + +// Constants for special floating point values. +LIBPROTOBUF_EXPORT double Infinity(); +LIBPROTOBUF_EXPORT double NaN(); + +// Constant used for empty default strings. +LIBPROTOBUF_EXPORT extern const ::std::string kEmptyString; + + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_GENERATED_MESSAGE_UTIL_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc new file mode 100644 index 000000000..57d486f95 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc @@ -0,0 +1,839 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This implementation is heavily optimized to make reads and writes +// of small values (especially varints) as fast as possible. In +// particular, we optimize for the common case that a read or a write +// will not cross the end of the buffer, since we can avoid a lot +// of branching in this case. + +#include +#include +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace io { + +namespace { + +static const int kMaxVarintBytes = 10; +static const int kMaxVarint32Bytes = 5; + + +inline bool NextNonEmpty(ZeroCopyInputStream* input, + const void** data, int* size) { + bool success; + do { + success = input->Next(data, size); + } while (success && *size == 0); + return success; +} + +} // namespace + +// CodedInputStream ================================================== + + +void CodedInputStream::BackUpInputToCurrentPosition() { + int backup_bytes = BufferSize() + buffer_size_after_limit_ + overflow_bytes_; + if (backup_bytes > 0) { + input_->BackUp(backup_bytes); + + // total_bytes_read_ doesn't include overflow_bytes_. + total_bytes_read_ -= BufferSize() + buffer_size_after_limit_; + buffer_end_ = buffer_; + buffer_size_after_limit_ = 0; + overflow_bytes_ = 0; + } +} + +inline void CodedInputStream::RecomputeBufferLimits() { + buffer_end_ += buffer_size_after_limit_; + int closest_limit = min(current_limit_, total_bytes_limit_); + if (closest_limit < total_bytes_read_) { + // The limit position is in the current buffer. We must adjust + // the buffer size accordingly. + buffer_size_after_limit_ = total_bytes_read_ - closest_limit; + buffer_end_ -= buffer_size_after_limit_; + } else { + buffer_size_after_limit_ = 0; + } +} + +CodedInputStream::Limit CodedInputStream::PushLimit(int byte_limit) { + // Current position relative to the beginning of the stream. + int current_position = total_bytes_read_ - + (BufferSize() + buffer_size_after_limit_); + + Limit old_limit = current_limit_; + + // security: byte_limit is possibly evil, so check for negative values + // and overflow. + if (byte_limit >= 0 && + byte_limit <= INT_MAX - current_position) { + current_limit_ = current_position + byte_limit; + } else { + // Negative or overflow. + current_limit_ = INT_MAX; + } + + // We need to enforce all limits, not just the new one, so if the previous + // limit was before the new requested limit, we continue to enforce the + // previous limit. + current_limit_ = min(current_limit_, old_limit); + + RecomputeBufferLimits(); + return old_limit; +} + +void CodedInputStream::PopLimit(Limit limit) { + // The limit passed in is actually the *old* limit, which we returned from + // PushLimit(). + current_limit_ = limit; + RecomputeBufferLimits(); + + // We may no longer be at a legitimate message end. ReadTag() needs to be + // called again to find out. + legitimate_message_end_ = false; +} + +int CodedInputStream::BytesUntilLimit() { + if (current_limit_ == INT_MAX) return -1; + int current_position = total_bytes_read_ - + (BufferSize() + buffer_size_after_limit_); + + return current_limit_ - current_position; +} + +void CodedInputStream::SetTotalBytesLimit( + int total_bytes_limit, int warning_threshold) { + // Make sure the limit isn't already past, since this could confuse other + // code. + int current_position = total_bytes_read_ - + (BufferSize() + buffer_size_after_limit_); + total_bytes_limit_ = max(current_position, total_bytes_limit); + total_bytes_warning_threshold_ = warning_threshold; + RecomputeBufferLimits(); +} + +void CodedInputStream::PrintTotalBytesLimitError() { + GOOGLE_LOG(ERROR) << "A protocol message was rejected because it was too " + "big (more than " << total_bytes_limit_ + << " bytes). To increase the limit (or to disable these " + "warnings), see CodedInputStream::SetTotalBytesLimit() " + "in google/protobuf/io/coded_stream.h."; +} + +bool CodedInputStream::Skip(int count) { + if (count < 0) return false; // security: count is often user-supplied + + const int original_buffer_size = BufferSize(); + + if (count <= original_buffer_size) { + // Just skipping within the current buffer. Easy. + Advance(count); + return true; + } + + if (buffer_size_after_limit_ > 0) { + // We hit a limit inside this buffer. Advance to the limit and fail. + Advance(original_buffer_size); + return false; + } + + count -= original_buffer_size; + buffer_ = NULL; + buffer_end_ = buffer_; + + // Make sure this skip doesn't try to skip past the current limit. + int closest_limit = min(current_limit_, total_bytes_limit_); + int bytes_until_limit = closest_limit - total_bytes_read_; + if (bytes_until_limit < count) { + // We hit the limit. Skip up to it then fail. + if (bytes_until_limit > 0) { + total_bytes_read_ = closest_limit; + input_->Skip(bytes_until_limit); + } + return false; + } + + total_bytes_read_ += count; + return input_->Skip(count); +} + +bool CodedInputStream::GetDirectBufferPointer(const void** data, int* size) { + if (BufferSize() == 0 && !Refresh()) return false; + + *data = buffer_; + *size = BufferSize(); + return true; +} + +bool CodedInputStream::ReadRaw(void* buffer, int size) { + int current_buffer_size; + while ((current_buffer_size = BufferSize()) < size) { + // Reading past end of buffer. Copy what we have, then refresh. + memcpy(buffer, buffer_, current_buffer_size); + buffer = reinterpret_cast(buffer) + current_buffer_size; + size -= current_buffer_size; + Advance(current_buffer_size); + if (!Refresh()) return false; + } + + memcpy(buffer, buffer_, size); + Advance(size); + + return true; +} + +bool CodedInputStream::ReadString(string* buffer, int size) { + if (size < 0) return false; // security: size is often user-supplied + return InternalReadStringInline(buffer, size); +} + +bool CodedInputStream::ReadStringFallback(string* buffer, int size) { + if (!buffer->empty()) { + buffer->clear(); + } + + int current_buffer_size; + while ((current_buffer_size = BufferSize()) < size) { + // Some STL implementations "helpfully" crash on buffer->append(NULL, 0). + if (current_buffer_size != 0) { + // Note: string1.append(string2) is O(string2.size()) (as opposed to + // O(string1.size() + string2.size()), which would be bad). + buffer->append(reinterpret_cast(buffer_), + current_buffer_size); + } + size -= current_buffer_size; + Advance(current_buffer_size); + if (!Refresh()) return false; + } + + buffer->append(reinterpret_cast(buffer_), size); + Advance(size); + + return true; +} + + +bool CodedInputStream::ReadLittleEndian32Fallback(uint32* value) { + uint8 bytes[sizeof(*value)]; + + const uint8* ptr; + if (BufferSize() >= sizeof(*value)) { + // Fast path: Enough bytes in the buffer to read directly. + ptr = buffer_; + Advance(sizeof(*value)); + } else { + // Slow path: Had to read past the end of the buffer. + if (!ReadRaw(bytes, sizeof(*value))) return false; + ptr = bytes; + } + ReadLittleEndian32FromArray(ptr, value); + return true; +} + +bool CodedInputStream::ReadLittleEndian64Fallback(uint64* value) { + uint8 bytes[sizeof(*value)]; + + const uint8* ptr; + if (BufferSize() >= sizeof(*value)) { + // Fast path: Enough bytes in the buffer to read directly. + ptr = buffer_; + Advance(sizeof(*value)); + } else { + // Slow path: Had to read past the end of the buffer. + if (!ReadRaw(bytes, sizeof(*value))) return false; + ptr = bytes; + } + ReadLittleEndian64FromArray(ptr, value); + return true; +} + +namespace { + +inline const uint8* ReadVarint32FromArray( + const uint8* buffer, uint32* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; +inline const uint8* ReadVarint32FromArray(const uint8* buffer, uint32* value) { + // Fast path: We have enough bytes left in the buffer to guarantee that + // this read won't cross the end, so we can skip the checks. + const uint8* ptr = buffer; + uint32 b; + uint32 result; + + b = *(ptr++); result = (b & 0x7F) ; if (!(b & 0x80)) goto done; + b = *(ptr++); result |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; + b = *(ptr++); result |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done; + b = *(ptr++); result |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done; + b = *(ptr++); result |= b << 28; if (!(b & 0x80)) goto done; + + // If the input is larger than 32 bits, we still need to read it all + // and discard the high-order bits. + for (int i = 0; i < kMaxVarintBytes - kMaxVarint32Bytes; i++) { + b = *(ptr++); if (!(b & 0x80)) goto done; + } + + // We have overrun the maximum size of a varint (10 bytes). Assume + // the data is corrupt. + return NULL; + + done: + *value = result; + return ptr; +} + +} // namespace + +bool CodedInputStream::ReadVarint32Slow(uint32* value) { + uint64 result; + // Directly invoke ReadVarint64Fallback, since we already tried to optimize + // for one-byte varints. + if (!ReadVarint64Fallback(&result)) return false; + *value = (uint32)result; + return true; +} + +bool CodedInputStream::ReadVarint32Fallback(uint32* value) { + if (BufferSize() >= kMaxVarintBytes || + // Optimization: If the varint ends at exactly the end of the buffer, + // we can detect that and still use the fast path. + (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { + const uint8* end = ReadVarint32FromArray(buffer_, value); + if (end == NULL) return false; + buffer_ = end; + return true; + } else { + // Really slow case: we will incur the cost of an extra function call here, + // but moving this out of line reduces the size of this function, which + // improves the common case. In micro benchmarks, this is worth about 10-15% + return ReadVarint32Slow(value); + } +} + +uint32 CodedInputStream::ReadTagSlow() { + if (buffer_ == buffer_end_) { + // Call refresh. + if (!Refresh()) { + // Refresh failed. Make sure that it failed due to EOF, not because + // we hit total_bytes_limit_, which, unlike normal limits, is not a + // valid place to end a message. + int current_position = total_bytes_read_ - buffer_size_after_limit_; + if (current_position >= total_bytes_limit_) { + // Hit total_bytes_limit_. But if we also hit the normal limit, + // we're still OK. + legitimate_message_end_ = current_limit_ == total_bytes_limit_; + } else { + legitimate_message_end_ = true; + } + return 0; + } + } + + // For the slow path, just do a 64-bit read. Try to optimize for one-byte tags + // again, since we have now refreshed the buffer. + uint64 result; + if (!ReadVarint64(&result)) return 0; + return static_cast(result); +} + +uint32 CodedInputStream::ReadTagFallback() { + if (BufferSize() >= kMaxVarintBytes || + // Optimization: If the varint ends at exactly the end of the buffer, + // we can detect that and still use the fast path. + (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { + uint32 tag; + const uint8* end = ReadVarint32FromArray(buffer_, &tag); + if (end == NULL) { + return 0; + } + buffer_ = end; + return tag; + } else { + // We are commonly at a limit when attempting to read tags. Try to quickly + // detect this case without making another function call. + if (buffer_ == buffer_end_ && buffer_size_after_limit_ > 0 && + // Make sure that the limit we hit is not total_bytes_limit_, since + // in that case we still need to call Refresh() so that it prints an + // error. + total_bytes_read_ - buffer_size_after_limit_ < total_bytes_limit_) { + // We hit a byte limit. + legitimate_message_end_ = true; + return 0; + } + return ReadTagSlow(); + } +} + +bool CodedInputStream::ReadVarint64Slow(uint64* value) { + // Slow path: This read might cross the end of the buffer, so we + // need to check and refresh the buffer if and when it does. + + uint64 result = 0; + int count = 0; + uint32 b; + + do { + if (count == kMaxVarintBytes) return false; + while (buffer_ == buffer_end_) { + if (!Refresh()) return false; + } + b = *buffer_; + result |= static_cast(b & 0x7F) << (7 * count); + Advance(1); + ++count; + } while (b & 0x80); + + *value = result; + return true; +} + +bool CodedInputStream::ReadVarint64Fallback(uint64* value) { + if (BufferSize() >= kMaxVarintBytes || + // Optimization: If the varint ends at exactly the end of the buffer, + // we can detect that and still use the fast path. + (buffer_end_ > buffer_ && !(buffer_end_[-1] & 0x80))) { + // Fast path: We have enough bytes left in the buffer to guarantee that + // this read won't cross the end, so we can skip the checks. + + const uint8* ptr = buffer_; + uint32 b; + + // Splitting into 32-bit pieces gives better performance on 32-bit + // processors. + uint32 part0 = 0, part1 = 0, part2 = 0; + + b = *(ptr++); part0 = (b & 0x7F) ; if (!(b & 0x80)) goto done; + b = *(ptr++); part0 |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; + b = *(ptr++); part0 |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done; + b = *(ptr++); part0 |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done; + b = *(ptr++); part1 = (b & 0x7F) ; if (!(b & 0x80)) goto done; + b = *(ptr++); part1 |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; + b = *(ptr++); part1 |= (b & 0x7F) << 14; if (!(b & 0x80)) goto done; + b = *(ptr++); part1 |= (b & 0x7F) << 21; if (!(b & 0x80)) goto done; + b = *(ptr++); part2 = (b & 0x7F) ; if (!(b & 0x80)) goto done; + b = *(ptr++); part2 |= (b & 0x7F) << 7; if (!(b & 0x80)) goto done; + + // We have overrun the maximum size of a varint (10 bytes). The data + // must be corrupt. + return NULL; + + done: + Advance(ptr - buffer_); + *value = (static_cast(part0) ) | + (static_cast(part1) << 28) | + (static_cast(part2) << 56); + return true; + } else { + return ReadVarint64Slow(value); + } +} + +bool CodedInputStream::Refresh() { + GOOGLE_DCHECK_EQ(0, BufferSize()); + + if (buffer_size_after_limit_ > 0 || overflow_bytes_ > 0 || + total_bytes_read_ == current_limit_) { + // We've hit a limit. Stop. + int current_position = total_bytes_read_ - buffer_size_after_limit_; + + if (current_position >= total_bytes_limit_ && + total_bytes_limit_ != current_limit_) { + // Hit total_bytes_limit_. + PrintTotalBytesLimitError(); + } + + return false; + } + + if (total_bytes_warning_threshold_ >= 0 && + total_bytes_read_ >= total_bytes_warning_threshold_) { + GOOGLE_LOG(WARNING) << "Reading dangerously large protocol message. If the " + "message turns out to be larger than " + << total_bytes_limit_ << " bytes, parsing will be halted " + "for security reasons. To increase the limit (or to " + "disable these warnings), see " + "CodedInputStream::SetTotalBytesLimit() in " + "google/protobuf/io/coded_stream.h."; + + // Don't warn again for this stream. + total_bytes_warning_threshold_ = -1; + } + + const void* void_buffer; + int buffer_size; + if (NextNonEmpty(input_, &void_buffer, &buffer_size)) { + buffer_ = reinterpret_cast(void_buffer); + buffer_end_ = buffer_ + buffer_size; + GOOGLE_CHECK_GE(buffer_size, 0); + + if (total_bytes_read_ <= INT_MAX - buffer_size) { + total_bytes_read_ += buffer_size; + } else { + // Overflow. Reset buffer_end_ to not include the bytes beyond INT_MAX. + // We can't get that far anyway, because total_bytes_limit_ is guaranteed + // to be less than it. We need to keep track of the number of bytes + // we discarded, though, so that we can call input_->BackUp() to back + // up over them on destruction. + + // The following line is equivalent to: + // overflow_bytes_ = total_bytes_read_ + buffer_size - INT_MAX; + // except that it avoids overflows. Signed integer overflow has + // undefined results according to the C standard. + overflow_bytes_ = total_bytes_read_ - (INT_MAX - buffer_size); + buffer_end_ -= overflow_bytes_; + total_bytes_read_ = INT_MAX; + } + + RecomputeBufferLimits(); + return true; + } else { + buffer_ = NULL; + buffer_end_ = NULL; + return false; + } +} + +// CodedOutputStream ================================================= + +CodedOutputStream::CodedOutputStream(ZeroCopyOutputStream* output) + : output_(output), + buffer_(NULL), + buffer_size_(0), + total_bytes_(0), + had_error_(false) { + // Eagerly Refresh() so buffer space is immediately available. + Refresh(); + // The Refresh() may have failed. If the client doesn't write any data, + // though, don't consider this an error. If the client does write data, then + // another Refresh() will be attempted and it will set the error once again. + had_error_ = false; +} + +CodedOutputStream::~CodedOutputStream() { + if (buffer_size_ > 0) { + output_->BackUp(buffer_size_); + } +} + +bool CodedOutputStream::Skip(int count) { + if (count < 0) return false; + + while (count > buffer_size_) { + count -= buffer_size_; + if (!Refresh()) return false; + } + + Advance(count); + return true; +} + +bool CodedOutputStream::GetDirectBufferPointer(void** data, int* size) { + if (buffer_size_ == 0 && !Refresh()) return false; + + *data = buffer_; + *size = buffer_size_; + return true; +} + +void CodedOutputStream::WriteRaw(const void* data, int size) { + while (buffer_size_ < size) { + memcpy(buffer_, data, buffer_size_); + size -= buffer_size_; + data = reinterpret_cast(data) + buffer_size_; + if (!Refresh()) return; + } + + memcpy(buffer_, data, size); + Advance(size); +} + +uint8* CodedOutputStream::WriteRawToArray( + const void* data, int size, uint8* target) { + memcpy(target, data, size); + return target + size; +} + + +void CodedOutputStream::WriteLittleEndian32(uint32 value) { + uint8 bytes[sizeof(value)]; + + bool use_fast = buffer_size_ >= sizeof(value); + uint8* ptr = use_fast ? buffer_ : bytes; + + WriteLittleEndian32ToArray(value, ptr); + + if (use_fast) { + Advance(sizeof(value)); + } else { + WriteRaw(bytes, sizeof(value)); + } +} + +void CodedOutputStream::WriteLittleEndian64(uint64 value) { + uint8 bytes[sizeof(value)]; + + bool use_fast = buffer_size_ >= sizeof(value); + uint8* ptr = use_fast ? buffer_ : bytes; + + WriteLittleEndian64ToArray(value, ptr); + + if (use_fast) { + Advance(sizeof(value)); + } else { + WriteRaw(bytes, sizeof(value)); + } +} + +inline uint8* CodedOutputStream::WriteVarint32FallbackToArrayInline( + uint32 value, uint8* target) { + target[0] = static_cast(value | 0x80); + if (value >= (1 << 7)) { + target[1] = static_cast((value >> 7) | 0x80); + if (value >= (1 << 14)) { + target[2] = static_cast((value >> 14) | 0x80); + if (value >= (1 << 21)) { + target[3] = static_cast((value >> 21) | 0x80); + if (value >= (1 << 28)) { + target[4] = static_cast(value >> 28); + return target + 5; + } else { + target[3] &= 0x7F; + return target + 4; + } + } else { + target[2] &= 0x7F; + return target + 3; + } + } else { + target[1] &= 0x7F; + return target + 2; + } + } else { + target[0] &= 0x7F; + return target + 1; + } +} + +void CodedOutputStream::WriteVarint32(uint32 value) { + if (buffer_size_ >= kMaxVarint32Bytes) { + // Fast path: We have enough bytes left in the buffer to guarantee that + // this write won't cross the end, so we can skip the checks. + uint8* target = buffer_; + uint8* end = WriteVarint32FallbackToArrayInline(value, target); + int size = end - target; + Advance(size); + } else { + // Slow path: This write might cross the end of the buffer, so we + // compose the bytes first then use WriteRaw(). + uint8 bytes[kMaxVarint32Bytes]; + int size = 0; + while (value > 0x7F) { + bytes[size++] = (static_cast(value) & 0x7F) | 0x80; + value >>= 7; + } + bytes[size++] = static_cast(value) & 0x7F; + WriteRaw(bytes, size); + } +} + +uint8* CodedOutputStream::WriteVarint32FallbackToArray( + uint32 value, uint8* target) { + return WriteVarint32FallbackToArrayInline(value, target); +} + +inline uint8* CodedOutputStream::WriteVarint64ToArrayInline( + uint64 value, uint8* target) { + // Splitting into 32-bit pieces gives better performance on 32-bit + // processors. + uint32 part0 = static_cast(value ); + uint32 part1 = static_cast(value >> 28); + uint32 part2 = static_cast(value >> 56); + + int size; + + // Here we can't really optimize for small numbers, since the value is + // split into three parts. Cheking for numbers < 128, for instance, + // would require three comparisons, since you'd have to make sure part1 + // and part2 are zero. However, if the caller is using 64-bit integers, + // it is likely that they expect the numbers to often be very large, so + // we probably don't want to optimize for small numbers anyway. Thus, + // we end up with a hardcoded binary search tree... + if (part2 == 0) { + if (part1 == 0) { + if (part0 < (1 << 14)) { + if (part0 < (1 << 7)) { + size = 1; goto size1; + } else { + size = 2; goto size2; + } + } else { + if (part0 < (1 << 21)) { + size = 3; goto size3; + } else { + size = 4; goto size4; + } + } + } else { + if (part1 < (1 << 14)) { + if (part1 < (1 << 7)) { + size = 5; goto size5; + } else { + size = 6; goto size6; + } + } else { + if (part1 < (1 << 21)) { + size = 7; goto size7; + } else { + size = 8; goto size8; + } + } + } + } else { + if (part2 < (1 << 7)) { + size = 9; goto size9; + } else { + size = 10; goto size10; + } + } + + GOOGLE_LOG(FATAL) << "Can't get here."; + + size10: target[9] = static_cast((part2 >> 7) | 0x80); + size9 : target[8] = static_cast((part2 ) | 0x80); + size8 : target[7] = static_cast((part1 >> 21) | 0x80); + size7 : target[6] = static_cast((part1 >> 14) | 0x80); + size6 : target[5] = static_cast((part1 >> 7) | 0x80); + size5 : target[4] = static_cast((part1 ) | 0x80); + size4 : target[3] = static_cast((part0 >> 21) | 0x80); + size3 : target[2] = static_cast((part0 >> 14) | 0x80); + size2 : target[1] = static_cast((part0 >> 7) | 0x80); + size1 : target[0] = static_cast((part0 ) | 0x80); + + target[size-1] &= 0x7F; + return target + size; +} + +void CodedOutputStream::WriteVarint64(uint64 value) { + if (buffer_size_ >= kMaxVarintBytes) { + // Fast path: We have enough bytes left in the buffer to guarantee that + // this write won't cross the end, so we can skip the checks. + uint8* target = buffer_; + + uint8* end = WriteVarint64ToArrayInline(value, target); + int size = end - target; + Advance(size); + } else { + // Slow path: This write might cross the end of the buffer, so we + // compose the bytes first then use WriteRaw(). + uint8 bytes[kMaxVarintBytes]; + int size = 0; + while (value > 0x7F) { + bytes[size++] = (static_cast(value) & 0x7F) | 0x80; + value >>= 7; + } + bytes[size++] = static_cast(value) & 0x7F; + WriteRaw(bytes, size); + } +} + +uint8* CodedOutputStream::WriteVarint64ToArray( + uint64 value, uint8* target) { + return WriteVarint64ToArrayInline(value, target); +} + +bool CodedOutputStream::Refresh() { + void* void_buffer; + if (output_->Next(&void_buffer, &buffer_size_)) { + buffer_ = reinterpret_cast(void_buffer); + total_bytes_ += buffer_size_; + return true; + } else { + buffer_ = NULL; + buffer_size_ = 0; + had_error_ = true; + return false; + } +} + +int CodedOutputStream::VarintSize32Fallback(uint32 value) { + if (value < (1 << 7)) { + return 1; + } else if (value < (1 << 14)) { + return 2; + } else if (value < (1 << 21)) { + return 3; + } else if (value < (1 << 28)) { + return 4; + } else { + return 5; + } +} + +int CodedOutputStream::VarintSize64(uint64 value) { + if (value < (1ull << 35)) { + if (value < (1ull << 7)) { + return 1; + } else if (value < (1ull << 14)) { + return 2; + } else if (value < (1ull << 21)) { + return 3; + } else if (value < (1ull << 28)) { + return 4; + } else { + return 5; + } + } else { + if (value < (1ull << 42)) { + return 6; + } else if (value < (1ull << 49)) { + return 7; + } else if (value < (1ull << 56)) { + return 8; + } else if (value < (1ull << 63)) { + return 9; + } else { + return 10; + } + } +} + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h new file mode 100644 index 000000000..1b6b4e18b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h @@ -0,0 +1,1102 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains the CodedInputStream and CodedOutputStream classes, +// which wrap a ZeroCopyInputStream or ZeroCopyOutputStream, respectively, +// and allow you to read or write individual pieces of data in various +// formats. In particular, these implement the varint encoding for +// integers, a simple variable-length encoding in which smaller numbers +// take fewer bytes. +// +// Typically these classes will only be used internally by the protocol +// buffer library in order to encode and decode protocol buffers. Clients +// of the library only need to know about this class if they wish to write +// custom message parsing or serialization procedures. +// +// CodedOutputStream example: +// // Write some data to "myfile". First we write a 4-byte "magic number" +// // to identify the file type, then write a length-delimited string. The +// // string is composed of a varint giving the length followed by the raw +// // bytes. +// int fd = open("myfile", O_WRONLY); +// ZeroCopyOutputStream* raw_output = new FileOutputStream(fd); +// CodedOutputStream* coded_output = new CodedOutputStream(raw_output); +// +// int magic_number = 1234; +// char text[] = "Hello world!"; +// coded_output->WriteLittleEndian32(magic_number); +// coded_output->WriteVarint32(strlen(text)); +// coded_output->WriteRaw(text, strlen(text)); +// +// delete coded_output; +// delete raw_output; +// close(fd); +// +// CodedInputStream example: +// // Read a file created by the above code. +// int fd = open("myfile", O_RDONLY); +// ZeroCopyInputStream* raw_input = new FileInputStream(fd); +// CodedInputStream coded_input = new CodedInputStream(raw_input); +// +// coded_input->ReadLittleEndian32(&magic_number); +// if (magic_number != 1234) { +// cerr << "File not in expected format." << endl; +// return; +// } +// +// uint32 size; +// coded_input->ReadVarint32(&size); +// +// char* text = new char[size + 1]; +// coded_input->ReadRaw(buffer, size); +// text[size] = '\0'; +// +// delete coded_input; +// delete raw_input; +// close(fd); +// +// cout << "Text is: " << text << endl; +// delete [] text; +// +// For those who are interested, varint encoding is defined as follows: +// +// The encoding operates on unsigned integers of up to 64 bits in length. +// Each byte of the encoded value has the format: +// * bits 0-6: Seven bits of the number being encoded. +// * bit 7: Zero if this is the last byte in the encoding (in which +// case all remaining bits of the number are zero) or 1 if +// more bytes follow. +// The first byte contains the least-significant 7 bits of the number, the +// second byte (if present) contains the next-least-significant 7 bits, +// and so on. So, the binary number 1011000101011 would be encoded in two +// bytes as "10101011 00101100". +// +// In theory, varint could be used to encode integers of any length. +// However, for practicality we set a limit at 64 bits. The maximum encoded +// length of a number is thus 10 bytes. + +#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ +#define GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ + +#include +#ifdef _MSC_VER + #if defined(_M_IX86) && \ + !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) + #define PROTOBUF_LITTLE_ENDIAN 1 + #endif + #if _MSC_VER >= 1300 + // If MSVC has "/RTCc" set, it will complain about truncating casts at + // runtime. This file contains some intentional truncating casts. + #pragma runtime_checks("c", off) + #endif +#else + #include // __BYTE_ORDER + #if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && \ + !defined(PROTOBUF_DISABLE_LITTLE_ENDIAN_OPT_FOR_TEST) + #define PROTOBUF_LITTLE_ENDIAN 1 + #endif +#endif +#include + + +namespace google { +namespace protobuf { + +class DescriptorPool; +class MessageFactory; + +namespace io { + +// Defined in this file. +class CodedInputStream; +class CodedOutputStream; + +// Defined in other files. +class ZeroCopyInputStream; // zero_copy_stream.h +class ZeroCopyOutputStream; // zero_copy_stream.h + +// Class which reads and decodes binary data which is composed of varint- +// encoded integers and fixed-width pieces. Wraps a ZeroCopyInputStream. +// Most users will not need to deal with CodedInputStream. +// +// Most methods of CodedInputStream that return a bool return false if an +// underlying I/O error occurs or if the data is malformed. Once such a +// failure occurs, the CodedInputStream is broken and is no longer useful. +class LIBPROTOBUF_EXPORT CodedInputStream { + public: + // Create a CodedInputStream that reads from the given ZeroCopyInputStream. + explicit CodedInputStream(ZeroCopyInputStream* input); + + // Create a CodedInputStream that reads from the given flat array. This is + // faster than using an ArrayInputStream. PushLimit(size) is implied by + // this constructor. + explicit CodedInputStream(const uint8* buffer, int size); + + // Destroy the CodedInputStream and position the underlying + // ZeroCopyInputStream at the first unread byte. If an error occurred while + // reading (causing a method to return false), then the exact position of + // the input stream may be anywhere between the last value that was read + // successfully and the stream's byte limit. + ~CodedInputStream(); + + + // Skips a number of bytes. Returns false if an underlying read error + // occurs. + bool Skip(int count); + + // Sets *data to point directly at the unread part of the CodedInputStream's + // underlying buffer, and *size to the size of that buffer, but does not + // advance the stream's current position. This will always either produce + // a non-empty buffer or return false. If the caller consumes any of + // this data, it should then call Skip() to skip over the consumed bytes. + // This may be useful for implementing external fast parsing routines for + // types of data not covered by the CodedInputStream interface. + bool GetDirectBufferPointer(const void** data, int* size); + + // Like GetDirectBufferPointer, but this method is inlined, and does not + // attempt to Refresh() if the buffer is currently empty. + inline void GetDirectBufferPointerInline(const void** data, + int* size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + // Read raw bytes, copying them into the given buffer. + bool ReadRaw(void* buffer, int size); + + // Like ReadRaw, but reads into a string. + // + // Implementation Note: ReadString() grows the string gradually as it + // reads in the data, rather than allocating the entire requested size + // upfront. This prevents denial-of-service attacks in which a client + // could claim that a string is going to be MAX_INT bytes long in order to + // crash the server because it can't allocate this much space at once. + bool ReadString(string* buffer, int size); + // Like the above, with inlined optimizations. This should only be used + // by the protobuf implementation. + inline bool InternalReadStringInline(string* buffer, + int size) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + + // Read a 32-bit little-endian integer. + bool ReadLittleEndian32(uint32* value); + // Read a 64-bit little-endian integer. + bool ReadLittleEndian64(uint64* value); + + // These methods read from an externally provided buffer. The caller is + // responsible for ensuring that the buffer has sufficient space. + // Read a 32-bit little-endian integer. + static const uint8* ReadLittleEndian32FromArray(const uint8* buffer, + uint32* value); + // Read a 64-bit little-endian integer. + static const uint8* ReadLittleEndian64FromArray(const uint8* buffer, + uint64* value); + + // Read an unsigned integer with Varint encoding, truncating to 32 bits. + // Reading a 32-bit value is equivalent to reading a 64-bit one and casting + // it to uint32, but may be more efficient. + bool ReadVarint32(uint32* value); + // Read an unsigned integer with Varint encoding. + bool ReadVarint64(uint64* value); + + // Read a tag. This calls ReadVarint32() and returns the result, or returns + // zero (which is not a valid tag) if ReadVarint32() fails. Also, it updates + // the last tag value, which can be checked with LastTagWas(). + // Always inline because this is only called in once place per parse loop + // but it is called for every iteration of said loop, so it should be fast. + // GCC doesn't want to inline this by default. + uint32 ReadTag() GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + // Usually returns true if calling ReadVarint32() now would produce the given + // value. Will always return false if ReadVarint32() would not return the + // given value. If ExpectTag() returns true, it also advances past + // the varint. For best performance, use a compile-time constant as the + // parameter. + // Always inline because this collapses to a small number of instructions + // when given a constant parameter, but GCC doesn't want to inline by default. + bool ExpectTag(uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + // Like above, except this reads from the specified buffer. The caller is + // responsible for ensuring that the buffer is large enough to read a varint + // of the expected size. For best performance, use a compile-time constant as + // the expected tag parameter. + // + // Returns a pointer beyond the expected tag if it was found, or NULL if it + // was not. + static const uint8* ExpectTagFromArray( + const uint8* buffer, + uint32 expected) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + // Usually returns true if no more bytes can be read. Always returns false + // if more bytes can be read. If ExpectAtEnd() returns true, a subsequent + // call to LastTagWas() will act as if ReadTag() had been called and returned + // zero, and ConsumedEntireMessage() will return true. + bool ExpectAtEnd(); + + // If the last call to ReadTag() returned the given value, returns true. + // Otherwise, returns false; + // + // This is needed because parsers for some types of embedded messages + // (with field type TYPE_GROUP) don't actually know that they've reached the + // end of a message until they see an ENDGROUP tag, which was actually part + // of the enclosing message. The enclosing message would like to check that + // tag to make sure it had the right number, so it calls LastTagWas() on + // return from the embedded parser to check. + bool LastTagWas(uint32 expected); + + // When parsing message (but NOT a group), this method must be called + // immediately after MergeFromCodedStream() returns (if it returns true) + // to further verify that the message ended in a legitimate way. For + // example, this verifies that parsing did not end on an end-group tag. + // It also checks for some cases where, due to optimizations, + // MergeFromCodedStream() can incorrectly return true. + bool ConsumedEntireMessage(); + + // Limits ---------------------------------------------------------- + // Limits are used when parsing length-delimited embedded messages. + // After the message's length is read, PushLimit() is used to prevent + // the CodedInputStream from reading beyond that length. Once the + // embedded message has been parsed, PopLimit() is called to undo the + // limit. + + // Opaque type used with PushLimit() and PopLimit(). Do not modify + // values of this type yourself. The only reason that this isn't a + // struct with private internals is for efficiency. + typedef int Limit; + + // Places a limit on the number of bytes that the stream may read, + // starting from the current position. Once the stream hits this limit, + // it will act like the end of the input has been reached until PopLimit() + // is called. + // + // As the names imply, the stream conceptually has a stack of limits. The + // shortest limit on the stack is always enforced, even if it is not the + // top limit. + // + // The value returned by PushLimit() is opaque to the caller, and must + // be passed unchanged to the corresponding call to PopLimit(). + Limit PushLimit(int byte_limit); + + // Pops the last limit pushed by PushLimit(). The input must be the value + // returned by that call to PushLimit(). + void PopLimit(Limit limit); + + // Returns the number of bytes left until the nearest limit on the + // stack is hit, or -1 if no limits are in place. + int BytesUntilLimit(); + + // Total Bytes Limit ----------------------------------------------- + // To prevent malicious users from sending excessively large messages + // and causing integer overflows or memory exhaustion, CodedInputStream + // imposes a hard limit on the total number of bytes it will read. + + // Sets the maximum number of bytes that this CodedInputStream will read + // before refusing to continue. To prevent integer overflows in the + // protocol buffers implementation, as well as to prevent servers from + // allocating enormous amounts of memory to hold parsed messages, the + // maximum message length should be limited to the shortest length that + // will not harm usability. The theoretical shortest message that could + // cause integer overflows is 512MB. The default limit is 64MB. Apps + // should set shorter limits if possible. If warning_threshold is not -1, + // a warning will be printed to stderr after warning_threshold bytes are + // read. An error will always be printed to stderr if the limit is + // reached. + // + // This is unrelated to PushLimit()/PopLimit(). + // + // Hint: If you are reading this because your program is printing a + // warning about dangerously large protocol messages, you may be + // confused about what to do next. The best option is to change your + // design such that excessively large messages are not necessary. + // For example, try to design file formats to consist of many small + // messages rather than a single large one. If this is infeasible, + // you will need to increase the limit. Chances are, though, that + // your code never constructs a CodedInputStream on which the limit + // can be set. You probably parse messages by calling things like + // Message::ParseFromString(). In this case, you will need to change + // your code to instead construct some sort of ZeroCopyInputStream + // (e.g. an ArrayInputStream), construct a CodedInputStream around + // that, then call Message::ParseFromCodedStream() instead. Then + // you can adjust the limit. Yes, it's more work, but you're doing + // something unusual. + void SetTotalBytesLimit(int total_bytes_limit, int warning_threshold); + + // Recursion Limit ------------------------------------------------- + // To prevent corrupt or malicious messages from causing stack overflows, + // we must keep track of the depth of recursion when parsing embedded + // messages and groups. CodedInputStream keeps track of this because it + // is the only object that is passed down the stack during parsing. + + // Sets the maximum recursion depth. The default is 64. + void SetRecursionLimit(int limit); + + // Increments the current recursion depth. Returns true if the depth is + // under the limit, false if it has gone over. + bool IncrementRecursionDepth(); + + // Decrements the recursion depth. + void DecrementRecursionDepth(); + + // Extension Registry ---------------------------------------------- + // ADVANCED USAGE: 99.9% of people can ignore this section. + // + // By default, when parsing extensions, the parser looks for extension + // definitions in the pool which owns the outer message's Descriptor. + // However, you may call SetExtensionRegistry() to provide an alternative + // pool instead. This makes it possible, for example, to parse a message + // using a generated class, but represent some extensions using + // DynamicMessage. + + // Set the pool used to look up extensions. Most users do not need to call + // this as the correct pool will be chosen automatically. + // + // WARNING: It is very easy to misuse this. Carefully read the requirements + // below. Do not use this unless you are sure you need it. Almost no one + // does. + // + // Let's say you are parsing a message into message object m, and you want + // to take advantage of SetExtensionRegistry(). You must follow these + // requirements: + // + // The given DescriptorPool must contain m->GetDescriptor(). It is not + // sufficient for it to simply contain a descriptor that has the same name + // and content -- it must be the *exact object*. In other words: + // assert(pool->FindMessageTypeByName(m->GetDescriptor()->full_name()) == + // m->GetDescriptor()); + // There are two ways to satisfy this requirement: + // 1) Use m->GetDescriptor()->pool() as the pool. This is generally useless + // because this is the pool that would be used anyway if you didn't call + // SetExtensionRegistry() at all. + // 2) Use a DescriptorPool which has m->GetDescriptor()->pool() as an + // "underlay". Read the documentation for DescriptorPool for more + // information about underlays. + // + // You must also provide a MessageFactory. This factory will be used to + // construct Message objects representing extensions. The factory's + // GetPrototype() MUST return non-NULL for any Descriptor which can be found + // through the provided pool. + // + // If the provided factory might return instances of protocol-compiler- + // generated (i.e. compiled-in) types, or if the outer message object m is + // a generated type, then the given factory MUST have this property: If + // GetPrototype() is given a Descriptor which resides in + // DescriptorPool::generated_pool(), the factory MUST return the same + // prototype which MessageFactory::generated_factory() would return. That + // is, given a descriptor for a generated type, the factory must return an + // instance of the generated class (NOT DynamicMessage). However, when + // given a descriptor for a type that is NOT in generated_pool, the factory + // is free to return any implementation. + // + // The reason for this requirement is that generated sub-objects may be + // accessed via the standard (non-reflection) extension accessor methods, + // and these methods will down-cast the object to the generated class type. + // If the object is not actually of that type, the results would be undefined. + // On the other hand, if an extension is not compiled in, then there is no + // way the code could end up accessing it via the standard accessors -- the + // only way to access the extension is via reflection. When using reflection, + // DynamicMessage and generated messages are indistinguishable, so it's fine + // if these objects are represented using DynamicMessage. + // + // Using DynamicMessageFactory on which you have called + // SetDelegateToGeneratedFactory(true) should be sufficient to satisfy the + // above requirement. + // + // If either pool or factory is NULL, both must be NULL. + // + // Note that this feature is ignored when parsing "lite" messages as they do + // not have descriptors. + void SetExtensionRegistry(DescriptorPool* pool, MessageFactory* factory); + + // Get the DescriptorPool set via SetExtensionRegistry(), or NULL if no pool + // has been provided. + const DescriptorPool* GetExtensionPool(); + + // Get the MessageFactory set via SetExtensionRegistry(), or NULL if no + // factory has been provided. + MessageFactory* GetExtensionFactory(); + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedInputStream); + + ZeroCopyInputStream* input_; + const uint8* buffer_; + const uint8* buffer_end_; // pointer to the end of the buffer. + int total_bytes_read_; // total bytes read from input_, including + // the current buffer + + // If total_bytes_read_ surpasses INT_MAX, we record the extra bytes here + // so that we can BackUp() on destruction. + int overflow_bytes_; + + // LastTagWas() stuff. + uint32 last_tag_; // result of last ReadTag(). + + // This is set true by ReadTag{Fallback/Slow}() if it is called when exactly + // at EOF, or by ExpectAtEnd() when it returns true. This happens when we + // reach the end of a message and attempt to read another tag. + bool legitimate_message_end_; + + // See EnableAliasing(). + bool aliasing_enabled_; + + // Limits + Limit current_limit_; // if position = -1, no limit is applied + + // For simplicity, if the current buffer crosses a limit (either a normal + // limit created by PushLimit() or the total bytes limit), buffer_size_ + // only tracks the number of bytes before that limit. This field + // contains the number of bytes after it. Note that this implies that if + // buffer_size_ == 0 and buffer_size_after_limit_ > 0, we know we've + // hit a limit. However, if both are zero, it doesn't necessarily mean + // we aren't at a limit -- the buffer may have ended exactly at the limit. + int buffer_size_after_limit_; + + // Maximum number of bytes to read, period. This is unrelated to + // current_limit_. Set using SetTotalBytesLimit(). + int total_bytes_limit_; + int total_bytes_warning_threshold_; + + // Current recursion depth, controlled by IncrementRecursionDepth() and + // DecrementRecursionDepth(). + int recursion_depth_; + // Recursion depth limit, set by SetRecursionLimit(). + int recursion_limit_; + + // See SetExtensionRegistry(). + const DescriptorPool* extension_pool_; + MessageFactory* extension_factory_; + + // Private member functions. + + // Advance the buffer by a given number of bytes. + void Advance(int amount); + + // Back up input_ to the current buffer position. + void BackUpInputToCurrentPosition(); + + // Recomputes the value of buffer_size_after_limit_. Must be called after + // current_limit_ or total_bytes_limit_ changes. + void RecomputeBufferLimits(); + + // Writes an error message saying that we hit total_bytes_limit_. + void PrintTotalBytesLimitError(); + + // Called when the buffer runs out to request more data. Implies an + // Advance(BufferSize()). + bool Refresh(); + + // When parsing varints, we optimize for the common case of small values, and + // then optimize for the case when the varint fits within the current buffer + // piece. The Fallback method is used when we can't use the one-byte + // optimization. The Slow method is yet another fallback when the buffer is + // not large enough. Making the slow path out-of-line speeds up the common + // case by 10-15%. The slow path is fairly uncommon: it only triggers when a + // message crosses multiple buffers. + bool ReadVarint32Fallback(uint32* value); + bool ReadVarint64Fallback(uint64* value); + bool ReadVarint32Slow(uint32* value); + bool ReadVarint64Slow(uint64* value); + bool ReadLittleEndian32Fallback(uint32* value); + bool ReadLittleEndian64Fallback(uint64* value); + // Fallback/slow methods for reading tags. These do not update last_tag_, + // but will set legitimate_message_end_ if we are at the end of the input + // stream. + uint32 ReadTagFallback(); + uint32 ReadTagSlow(); + bool ReadStringFallback(string* buffer, int size); + + // Return the size of the buffer. + int BufferSize() const; + + static const int kDefaultTotalBytesLimit = 64 << 20; // 64MB + + static const int kDefaultTotalBytesWarningThreshold = 32 << 20; // 32MB + static const int kDefaultRecursionLimit = 64; +}; + +// Class which encodes and writes binary data which is composed of varint- +// encoded integers and fixed-width pieces. Wraps a ZeroCopyOutputStream. +// Most users will not need to deal with CodedOutputStream. +// +// Most methods of CodedOutputStream which return a bool return false if an +// underlying I/O error occurs. Once such a failure occurs, the +// CodedOutputStream is broken and is no longer useful. The Write* methods do +// not return the stream status, but will invalidate the stream if an error +// occurs. The client can probe HadError() to determine the status. +// +// Note that every method of CodedOutputStream which writes some data has +// a corresponding static "ToArray" version. These versions write directly +// to the provided buffer, returning a pointer past the last written byte. +// They require that the buffer has sufficient capacity for the encoded data. +// This allows an optimization where we check if an output stream has enough +// space for an entire message before we start writing and, if there is, we +// call only the ToArray methods to avoid doing bound checks for each +// individual value. +// i.e., in the example above: +// +// CodedOutputStream coded_output = new CodedOutputStream(raw_output); +// int magic_number = 1234; +// char text[] = "Hello world!"; +// +// int coded_size = sizeof(magic_number) + +// CodedOutputStream::VarintSize32(strlen(text)) + +// strlen(text); +// +// uint8* buffer = +// coded_output->GetDirectBufferForNBytesAndAdvance(coded_size); +// if (buffer != NULL) { +// // The output stream has enough space in the buffer: write directly to +// // the array. +// buffer = CodedOutputStream::WriteLittleEndian32ToArray(magic_number, +// buffer); +// buffer = CodedOutputStream::WriteVarint32ToArray(strlen(text), buffer); +// buffer = CodedOutputStream::WriteRawToArray(text, strlen(text), buffer); +// } else { +// // Make bound-checked writes, which will ask the underlying stream for +// // more space as needed. +// coded_output->WriteLittleEndian32(magic_number); +// coded_output->WriteVarint32(strlen(text)); +// coded_output->WriteRaw(text, strlen(text)); +// } +// +// delete coded_output; +class LIBPROTOBUF_EXPORT CodedOutputStream { + public: + // Create an CodedOutputStream that writes to the given ZeroCopyOutputStream. + explicit CodedOutputStream(ZeroCopyOutputStream* output); + + // Destroy the CodedOutputStream and position the underlying + // ZeroCopyOutputStream immediately after the last byte written. + ~CodedOutputStream(); + + // Skips a number of bytes, leaving the bytes unmodified in the underlying + // buffer. Returns false if an underlying write error occurs. This is + // mainly useful with GetDirectBufferPointer(). + bool Skip(int count); + + // Sets *data to point directly at the unwritten part of the + // CodedOutputStream's underlying buffer, and *size to the size of that + // buffer, but does not advance the stream's current position. This will + // always either produce a non-empty buffer or return false. If the caller + // writes any data to this buffer, it should then call Skip() to skip over + // the consumed bytes. This may be useful for implementing external fast + // serialization routines for types of data not covered by the + // CodedOutputStream interface. + bool GetDirectBufferPointer(void** data, int* size); + + // If there are at least "size" bytes available in the current buffer, + // returns a pointer directly into the buffer and advances over these bytes. + // The caller may then write directly into this buffer (e.g. using the + // *ToArray static methods) rather than go through CodedOutputStream. If + // there are not enough bytes available, returns NULL. The return pointer is + // invalidated as soon as any other non-const method of CodedOutputStream + // is called. + inline uint8* GetDirectBufferForNBytesAndAdvance(int size); + + // Write raw bytes, copying them from the given buffer. + void WriteRaw(const void* buffer, int size); + // Like WriteRaw() but writing directly to the target array. + // This is _not_ inlined, as the compiler often optimizes memcpy into inline + // copy loops. Since this gets called by every field with string or bytes + // type, inlining may lead to a significant amount of code bloat, with only a + // minor performance gain. + static uint8* WriteRawToArray(const void* buffer, int size, uint8* target); + + // Equivalent to WriteRaw(str.data(), str.size()). + void WriteString(const string& str); + // Like WriteString() but writing directly to the target array. + static uint8* WriteStringToArray(const string& str, uint8* target); + + + // Write a 32-bit little-endian integer. + void WriteLittleEndian32(uint32 value); + // Like WriteLittleEndian32() but writing directly to the target array. + static uint8* WriteLittleEndian32ToArray(uint32 value, uint8* target); + // Write a 64-bit little-endian integer. + void WriteLittleEndian64(uint64 value); + // Like WriteLittleEndian64() but writing directly to the target array. + static uint8* WriteLittleEndian64ToArray(uint64 value, uint8* target); + + // Write an unsigned integer with Varint encoding. Writing a 32-bit value + // is equivalent to casting it to uint64 and writing it as a 64-bit value, + // but may be more efficient. + void WriteVarint32(uint32 value); + // Like WriteVarint32() but writing directly to the target array. + static uint8* WriteVarint32ToArray(uint32 value, uint8* target); + // Write an unsigned integer with Varint encoding. + void WriteVarint64(uint64 value); + // Like WriteVarint64() but writing directly to the target array. + static uint8* WriteVarint64ToArray(uint64 value, uint8* target); + + // Equivalent to WriteVarint32() except when the value is negative, + // in which case it must be sign-extended to a full 10 bytes. + void WriteVarint32SignExtended(int32 value); + // Like WriteVarint32SignExtended() but writing directly to the target array. + static uint8* WriteVarint32SignExtendedToArray(int32 value, uint8* target); + + // This is identical to WriteVarint32(), but optimized for writing tags. + // In particular, if the input is a compile-time constant, this method + // compiles down to a couple instructions. + // Always inline because otherwise the aformentioned optimization can't work, + // but GCC by default doesn't want to inline this. + void WriteTag(uint32 value); + // Like WriteTag() but writing directly to the target array. + static uint8* WriteTagToArray( + uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + // Returns the number of bytes needed to encode the given value as a varint. + static int VarintSize32(uint32 value); + // Returns the number of bytes needed to encode the given value as a varint. + static int VarintSize64(uint64 value); + + // If negative, 10 bytes. Otheriwse, same as VarintSize32(). + static int VarintSize32SignExtended(int32 value); + + // Returns the total number of bytes written since this object was created. + inline int ByteCount() const; + + // Returns true if there was an underlying I/O error since this object was + // created. + bool HadError() const { return had_error_; } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream); + + ZeroCopyOutputStream* output_; + uint8* buffer_; + int buffer_size_; + int total_bytes_; // Sum of sizes of all buffers seen so far. + bool had_error_; // Whether an error occurred during output. + + // Advance the buffer by a given number of bytes. + void Advance(int amount); + + // Called when the buffer runs out to request more data. Implies an + // Advance(buffer_size_). + bool Refresh(); + + static uint8* WriteVarint32FallbackToArray(uint32 value, uint8* target); + + // Always-inlined versions of WriteVarint* functions so that code can be + // reused, while still controlling size. For instance, WriteVarint32ToArray() + // should not directly call this: since it is inlined itself, doing so + // would greatly increase the size of generated code. Instead, it should call + // WriteVarint32FallbackToArray. Meanwhile, WriteVarint32() is already + // out-of-line, so it should just invoke this directly to avoid any extra + // function call overhead. + static uint8* WriteVarint32FallbackToArrayInline( + uint32 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + static uint8* WriteVarint64ToArrayInline( + uint64 value, uint8* target) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + static int VarintSize32Fallback(uint32 value); +}; + +// inline methods ==================================================== +// The vast majority of varints are only one byte. These inline +// methods optimize for that case. + +inline bool CodedInputStream::ReadVarint32(uint32* value) { + if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { + *value = *buffer_; + Advance(1); + return true; + } else { + return ReadVarint32Fallback(value); + } +} + +inline bool CodedInputStream::ReadVarint64(uint64* value) { + if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && *buffer_ < 0x80) { + *value = *buffer_; + Advance(1); + return true; + } else { + return ReadVarint64Fallback(value); + } +} + +// static +inline const uint8* CodedInputStream::ReadLittleEndian32FromArray( + const uint8* buffer, + uint32* value) { +#if defined(PROTOBUF_LITTLE_ENDIAN) + memcpy(value, buffer, sizeof(*value)); + return buffer + sizeof(*value); +#else + *value = (static_cast(buffer[0]) ) | + (static_cast(buffer[1]) << 8) | + (static_cast(buffer[2]) << 16) | + (static_cast(buffer[3]) << 24); + return buffer + sizeof(*value); +#endif +} +// static +inline const uint8* CodedInputStream::ReadLittleEndian64FromArray( + const uint8* buffer, + uint64* value) { +#if defined(PROTOBUF_LITTLE_ENDIAN) + memcpy(value, buffer, sizeof(*value)); + return buffer + sizeof(*value); +#else + uint32 part0 = (static_cast(buffer[0]) ) | + (static_cast(buffer[1]) << 8) | + (static_cast(buffer[2]) << 16) | + (static_cast(buffer[3]) << 24); + uint32 part1 = (static_cast(buffer[4]) ) | + (static_cast(buffer[5]) << 8) | + (static_cast(buffer[6]) << 16) | + (static_cast(buffer[7]) << 24); + *value = static_cast(part0) | + (static_cast(part1) << 32); + return buffer + sizeof(*value); +#endif +} + +inline bool CodedInputStream::ReadLittleEndian32(uint32* value) { +#if defined(PROTOBUF_LITTLE_ENDIAN) + if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast(sizeof(*value)))) { + memcpy(value, buffer_, sizeof(*value)); + Advance(sizeof(*value)); + return true; + } else { + return ReadLittleEndian32Fallback(value); + } +#else + return ReadLittleEndian32Fallback(value); +#endif +} + +inline bool CodedInputStream::ReadLittleEndian64(uint64* value) { +#if defined(PROTOBUF_LITTLE_ENDIAN) + if (GOOGLE_PREDICT_TRUE(BufferSize() >= static_cast(sizeof(*value)))) { + memcpy(value, buffer_, sizeof(*value)); + Advance(sizeof(*value)); + return true; + } else { + return ReadLittleEndian64Fallback(value); + } +#else + return ReadLittleEndian64Fallback(value); +#endif +} + +inline uint32 CodedInputStream::ReadTag() { + if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] < 0x80) { + last_tag_ = buffer_[0]; + Advance(1); + return last_tag_; + } else { + last_tag_ = ReadTagFallback(); + return last_tag_; + } +} + +inline bool CodedInputStream::LastTagWas(uint32 expected) { + return last_tag_ == expected; +} + +inline bool CodedInputStream::ConsumedEntireMessage() { + return legitimate_message_end_; +} + +inline bool CodedInputStream::ExpectTag(uint32 expected) { + if (expected < (1 << 7)) { + if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_) && buffer_[0] == expected) { + Advance(1); + return true; + } else { + return false; + } + } else if (expected < (1 << 14)) { + if (GOOGLE_PREDICT_TRUE(BufferSize() >= 2) && + buffer_[0] == static_cast(expected | 0x80) && + buffer_[1] == static_cast(expected >> 7)) { + Advance(2); + return true; + } else { + return false; + } + } else { + // Don't bother optimizing for larger values. + return false; + } +} + +inline const uint8* CodedInputStream::ExpectTagFromArray( + const uint8* buffer, uint32 expected) { + if (expected < (1 << 7)) { + if (buffer[0] == expected) { + return buffer + 1; + } + } else if (expected < (1 << 14)) { + if (buffer[0] == static_cast(expected | 0x80) && + buffer[1] == static_cast(expected >> 7)) { + return buffer + 2; + } + } + return NULL; +} + +inline void CodedInputStream::GetDirectBufferPointerInline(const void** data, + int* size) { + *data = buffer_; + *size = buffer_end_ - buffer_; +} + +inline bool CodedInputStream::ExpectAtEnd() { + // If we are at a limit we know no more bytes can be read. Otherwise, it's + // hard to say without calling Refresh(), and we'd rather not do that. + + if (buffer_ == buffer_end_ && buffer_size_after_limit_ != 0) { + last_tag_ = 0; // Pretend we called ReadTag()... + legitimate_message_end_ = true; // ... and it hit EOF. + return true; + } else { + return false; + } +} + +inline uint8* CodedOutputStream::GetDirectBufferForNBytesAndAdvance(int size) { + if (buffer_size_ < size) { + return NULL; + } else { + uint8* result = buffer_; + Advance(size); + return result; + } +} + +inline uint8* CodedOutputStream::WriteVarint32ToArray(uint32 value, + uint8* target) { + if (value < 0x80) { + *target = value; + return target + 1; + } else { + return WriteVarint32FallbackToArray(value, target); + } +} + +inline void CodedOutputStream::WriteVarint32SignExtended(int32 value) { + if (value < 0) { + WriteVarint64(static_cast(value)); + } else { + WriteVarint32(static_cast(value)); + } +} + +inline uint8* CodedOutputStream::WriteVarint32SignExtendedToArray( + int32 value, uint8* target) { + if (value < 0) { + return WriteVarint64ToArray(static_cast(value), target); + } else { + return WriteVarint32ToArray(static_cast(value), target); + } +} + +inline uint8* CodedOutputStream::WriteLittleEndian32ToArray(uint32 value, + uint8* target) { +#if defined(PROTOBUF_LITTLE_ENDIAN) + memcpy(target, &value, sizeof(value)); +#else + target[0] = static_cast(value); + target[1] = static_cast(value >> 8); + target[2] = static_cast(value >> 16); + target[3] = static_cast(value >> 24); +#endif + return target + sizeof(value); +} + +inline uint8* CodedOutputStream::WriteLittleEndian64ToArray(uint64 value, + uint8* target) { +#if defined(PROTOBUF_LITTLE_ENDIAN) + memcpy(target, &value, sizeof(value)); +#else + uint32 part0 = static_cast(value); + uint32 part1 = static_cast(value >> 32); + + target[0] = static_cast(part0); + target[1] = static_cast(part0 >> 8); + target[2] = static_cast(part0 >> 16); + target[3] = static_cast(part0 >> 24); + target[4] = static_cast(part1); + target[5] = static_cast(part1 >> 8); + target[6] = static_cast(part1 >> 16); + target[7] = static_cast(part1 >> 24); +#endif + return target + sizeof(value); +} + +inline void CodedOutputStream::WriteTag(uint32 value) { + WriteVarint32(value); +} + +inline uint8* CodedOutputStream::WriteTagToArray( + uint32 value, uint8* target) { + if (value < (1 << 7)) { + target[0] = value; + return target + 1; + } else if (value < (1 << 14)) { + target[0] = static_cast(value | 0x80); + target[1] = static_cast(value >> 7); + return target + 2; + } else { + return WriteVarint32FallbackToArray(value, target); + } +} + +inline int CodedOutputStream::VarintSize32(uint32 value) { + if (value < (1 << 7)) { + return 1; + } else { + return VarintSize32Fallback(value); + } +} + +inline int CodedOutputStream::VarintSize32SignExtended(int32 value) { + if (value < 0) { + return 10; // TODO(kenton): Make this a symbolic constant. + } else { + return VarintSize32(static_cast(value)); + } +} + +inline void CodedOutputStream::WriteString(const string& str) { + WriteRaw(str.data(), static_cast(str.size())); +} + +inline uint8* CodedOutputStream::WriteStringToArray( + const string& str, uint8* target) { + return WriteRawToArray(str.data(), static_cast(str.size()), target); +} + +inline int CodedOutputStream::ByteCount() const { + return total_bytes_ - buffer_size_; +} + +inline void CodedInputStream::Advance(int amount) { + buffer_ += amount; +} + +inline void CodedOutputStream::Advance(int amount) { + buffer_ += amount; + buffer_size_ -= amount; +} + +inline void CodedInputStream::SetRecursionLimit(int limit) { + recursion_limit_ = limit; +} + +inline bool CodedInputStream::IncrementRecursionDepth() { + ++recursion_depth_; + return recursion_depth_ <= recursion_limit_; +} + +inline void CodedInputStream::DecrementRecursionDepth() { + if (recursion_depth_ > 0) --recursion_depth_; +} + +inline void CodedInputStream::SetExtensionRegistry(DescriptorPool* pool, + MessageFactory* factory) { + extension_pool_ = pool; + extension_factory_ = factory; +} + +inline const DescriptorPool* CodedInputStream::GetExtensionPool() { + return extension_pool_; +} + +inline MessageFactory* CodedInputStream::GetExtensionFactory() { + return extension_factory_; +} + +inline int CodedInputStream::BufferSize() const { + return buffer_end_ - buffer_; +} + +inline CodedInputStream::CodedInputStream(ZeroCopyInputStream* input) + : input_(input), + buffer_(NULL), + buffer_end_(NULL), + total_bytes_read_(0), + overflow_bytes_(0), + last_tag_(0), + legitimate_message_end_(false), + aliasing_enabled_(false), + current_limit_(kint32max), + buffer_size_after_limit_(0), + total_bytes_limit_(kDefaultTotalBytesLimit), + total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), + recursion_depth_(0), + recursion_limit_(kDefaultRecursionLimit), + extension_pool_(NULL), + extension_factory_(NULL) { + // Eagerly Refresh() so buffer space is immediately available. + Refresh(); +} + +inline CodedInputStream::CodedInputStream(const uint8* buffer, int size) + : input_(NULL), + buffer_(buffer), + buffer_end_(buffer + size), + total_bytes_read_(size), + overflow_bytes_(0), + last_tag_(0), + legitimate_message_end_(false), + aliasing_enabled_(false), + current_limit_(size), + buffer_size_after_limit_(0), + total_bytes_limit_(kDefaultTotalBytesLimit), + total_bytes_warning_threshold_(kDefaultTotalBytesWarningThreshold), + recursion_depth_(0), + recursion_limit_(kDefaultRecursionLimit), + extension_pool_(NULL), + extension_factory_(NULL) { + // Note that setting current_limit_ == size is important to prevent some + // code paths from trying to access input_ and segfaulting. +} + +inline CodedInputStream::~CodedInputStream() { + if (input_ != NULL) { + BackUpInputToCurrentPosition(); + } +} + +} // namespace io +} // namespace protobuf + + +#if defined(_MSC_VER) && _MSC_VER >= 1300 + #pragma runtime_checks("c", restore) +#endif // _MSC_VER + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h new file mode 100644 index 000000000..e9799d477 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h @@ -0,0 +1,64 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jasonh@google.com (Jason Hsueh) +// +// Implements methods of coded_stream.h that need to be inlined for performance +// reasons, but should not be defined in a public header. + +#ifndef GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__ +#define GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +inline bool CodedInputStream::InternalReadStringInline(string* buffer, + int size) { + if (size < 0) return false; // security: size is often user-supplied + + if (BufferSize() >= size) { + STLStringResizeUninitialized(buffer, size); + memcpy(string_as_array(buffer), buffer_, size); + Advance(size); + return true; + } + + return ReadStringFallback(buffer, size); +} + +} // namespace io +} // namespace protobuf +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_CODED_STREAM_INL_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc new file mode 100644 index 000000000..ff268ab9b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc @@ -0,0 +1,1131 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains tests and benchmarks. + +#include + +#include + +#include + +#include +#include +#include +#include +#include + + +// This declares an unsigned long long integer literal in a portable way. +// (The original macro is way too big and ruins my formatting.) +#undef ULL +#define ULL(x) GOOGLE_ULONGLONG(x) + +namespace google { +namespace protobuf { +namespace io { +namespace { + +// =================================================================== +// Data-Driven Test Infrastructure + +// TEST_1D and TEST_2D are macros I'd eventually like to see added to +// gTest. These macros can be used to declare tests which should be +// run multiple times, once for each item in some input array. TEST_1D +// tests all cases in a single input array. TEST_2D tests all +// combinations of cases from two arrays. The arrays must be statically +// defined such that the GOOGLE_ARRAYSIZE() macro works on them. Example: +// +// int kCases[] = {1, 2, 3, 4} +// TEST_1D(MyFixture, MyTest, kCases) { +// EXPECT_GT(kCases_case, 0); +// } +// +// This test iterates through the numbers 1, 2, 3, and 4 and tests that +// they are all grater than zero. In case of failure, the exact case +// which failed will be printed. The case type must be printable using +// ostream::operator<<. + +// TODO(kenton): gTest now supports "parameterized tests" which would be +// a better way to accomplish this. Rewrite when time permits. + +#define TEST_1D(FIXTURE, NAME, CASES) \ + class FIXTURE##_##NAME##_DD : public FIXTURE { \ + protected: \ + template \ + void DoSingleCase(const CaseType& CASES##_case); \ + }; \ + \ + TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ + for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) { \ + SCOPED_TRACE(testing::Message() \ + << #CASES " case #" << i << ": " << CASES[i]); \ + DoSingleCase(CASES[i]); \ + } \ + } \ + \ + template \ + void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case) + +#define TEST_2D(FIXTURE, NAME, CASES1, CASES2) \ + class FIXTURE##_##NAME##_DD : public FIXTURE { \ + protected: \ + template \ + void DoSingleCase(const CaseType1& CASES1##_case, \ + const CaseType2& CASES2##_case); \ + }; \ + \ + TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ + for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) { \ + for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) { \ + SCOPED_TRACE(testing::Message() \ + << #CASES1 " case #" << i << ": " << CASES1[i] << ", " \ + << #CASES2 " case #" << j << ": " << CASES2[j]); \ + DoSingleCase(CASES1[i], CASES2[j]); \ + } \ + } \ + } \ + \ + template \ + void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \ + const CaseType2& CASES2##_case) + +// =================================================================== + +class CodedStreamTest : public testing::Test { + protected: + static const int kBufferSize = 1024 * 64; + static uint8 buffer_[kBufferSize]; +}; + +uint8 CodedStreamTest::buffer_[CodedStreamTest::kBufferSize]; + +// We test each operation over a variety of block sizes to insure that +// we test cases where reads or writes cross buffer boundaries, cases +// where they don't, and cases where there is so much buffer left that +// we can use special optimized paths that don't worry about bounds +// checks. +const int kBlockSizes[] = {1, 2, 3, 5, 7, 13, 32, 1024}; + +// ------------------------------------------------------------------- +// Varint tests. + +struct VarintCase { + uint8 bytes[10]; // Encoded bytes. + int size; // Encoded size, in bytes. + uint64 value; // Parsed value. +}; + +inline std::ostream& operator<<(std::ostream& os, const VarintCase& c) { + return os << c.value; +} + +VarintCase kVarintCases[] = { + // 32-bit values + {{0x00} , 1, 0}, + {{0x01} , 1, 1}, + {{0x7f} , 1, 127}, + {{0xa2, 0x74}, 2, (0x22 << 0) | (0x74 << 7)}, // 14882 + {{0xbe, 0xf7, 0x92, 0x84, 0x0b}, 5, // 2961488830 + (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | + (ULL(0x0b) << 28)}, + + // 64-bit + {{0xbe, 0xf7, 0x92, 0x84, 0x1b}, 5, // 7256456126 + (0x3e << 0) | (0x77 << 7) | (0x12 << 14) | (0x04 << 21) | + (ULL(0x1b) << 28)}, + {{0x80, 0xe6, 0xeb, 0x9c, 0xc3, 0xc9, 0xa4, 0x49}, 8, // 41256202580718336 + (0x00 << 0) | (0x66 << 7) | (0x6b << 14) | (0x1c << 21) | + (ULL(0x43) << 28) | (ULL(0x49) << 35) | (ULL(0x24) << 42) | + (ULL(0x49) << 49)}, + // 11964378330978735131 + {{0x9b, 0xa8, 0xf9, 0xc2, 0xbb, 0xd6, 0x80, 0x85, 0xa6, 0x01}, 10, + (0x1b << 0) | (0x28 << 7) | (0x79 << 14) | (0x42 << 21) | + (ULL(0x3b) << 28) | (ULL(0x56) << 35) | (ULL(0x00) << 42) | + (ULL(0x05) << 49) | (ULL(0x26) << 56) | (ULL(0x01) << 63)}, +}; + +TEST_2D(CodedStreamTest, ReadVarint32, kVarintCases, kBlockSizes) { + memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + uint32 value; + EXPECT_TRUE(coded_input.ReadVarint32(&value)); + EXPECT_EQ(static_cast(kVarintCases_case.value), value); + } + + EXPECT_EQ(kVarintCases_case.size, input.ByteCount()); +} + +TEST_2D(CodedStreamTest, ReadTag, kVarintCases, kBlockSizes) { + memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + uint32 expected_value = static_cast(kVarintCases_case.value); + EXPECT_EQ(expected_value, coded_input.ReadTag()); + + EXPECT_TRUE(coded_input.LastTagWas(expected_value)); + EXPECT_FALSE(coded_input.LastTagWas(expected_value + 1)); + } + + EXPECT_EQ(kVarintCases_case.size, input.ByteCount()); +} + +// This is the regression test that verifies that there is no issues +// with the empty input buffers handling. +TEST_F(CodedStreamTest, EmptyInputBeforeEos) { + class In : public ZeroCopyInputStream { + public: + In() : count_(0) {} + private: + virtual bool Next(const void** data, int* size) { + *data = NULL; + *size = 0; + return count_++ < 2; + } + virtual void BackUp(int count) { + GOOGLE_LOG(FATAL) << "Tests never call this."; + } + virtual bool Skip(int count) { + GOOGLE_LOG(FATAL) << "Tests never call this."; + return false; + } + virtual int64 ByteCount() const { return 0; } + int count_; + } in; + CodedInputStream input(&in); + input.ReadTag(); + EXPECT_TRUE(input.ConsumedEntireMessage()); +} + +TEST_1D(CodedStreamTest, ExpectTag, kVarintCases) { + // Leave one byte at the beginning of the buffer so we can read it + // to force the first buffer to be loaded. + buffer_[0] = '\0'; + memcpy(buffer_ + 1, kVarintCases_case.bytes, kVarintCases_case.size); + ArrayInputStream input(buffer_, sizeof(buffer_)); + + { + CodedInputStream coded_input(&input); + + // Read one byte to force coded_input.Refill() to be called. Otherwise, + // ExpectTag() will return a false negative. + uint8 dummy; + coded_input.ReadRaw(&dummy, 1); + EXPECT_EQ((uint)'\0', (uint)dummy); + + uint32 expected_value = static_cast(kVarintCases_case.value); + + // ExpectTag() produces false negatives for large values. + if (kVarintCases_case.size <= 2) { + EXPECT_FALSE(coded_input.ExpectTag(expected_value + 1)); + EXPECT_TRUE(coded_input.ExpectTag(expected_value)); + } else { + EXPECT_FALSE(coded_input.ExpectTag(expected_value)); + } + } + + if (kVarintCases_case.size <= 2) { + EXPECT_EQ(kVarintCases_case.size + 1, input.ByteCount()); + } else { + EXPECT_EQ(1, input.ByteCount()); + } +} + +TEST_1D(CodedStreamTest, ExpectTagFromArray, kVarintCases) { + memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); + + const uint32 expected_value = static_cast(kVarintCases_case.value); + + // If the expectation succeeds, it should return a pointer past the tag. + if (kVarintCases_case.size <= 2) { + EXPECT_TRUE(NULL == + CodedInputStream::ExpectTagFromArray(buffer_, + expected_value + 1)); + EXPECT_TRUE(buffer_ + kVarintCases_case.size == + CodedInputStream::ExpectTagFromArray(buffer_, expected_value)); + } else { + EXPECT_TRUE(NULL == + CodedInputStream::ExpectTagFromArray(buffer_, expected_value)); + } +} + +TEST_2D(CodedStreamTest, ReadVarint64, kVarintCases, kBlockSizes) { + memcpy(buffer_, kVarintCases_case.bytes, kVarintCases_case.size); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + uint64 value; + EXPECT_TRUE(coded_input.ReadVarint64(&value)); + EXPECT_EQ(kVarintCases_case.value, value); + } + + EXPECT_EQ(kVarintCases_case.size, input.ByteCount()); +} + +TEST_2D(CodedStreamTest, WriteVarint32, kVarintCases, kBlockSizes) { + if (kVarintCases_case.value > ULL(0x00000000FFFFFFFF)) { + // Skip this test for the 64-bit values. + return; + } + + ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedOutputStream coded_output(&output); + + coded_output.WriteVarint32(static_cast(kVarintCases_case.value)); + EXPECT_FALSE(coded_output.HadError()); + + EXPECT_EQ(kVarintCases_case.size, coded_output.ByteCount()); + } + + EXPECT_EQ(kVarintCases_case.size, output.ByteCount()); + EXPECT_EQ(0, + memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size)); +} + +TEST_2D(CodedStreamTest, WriteVarint64, kVarintCases, kBlockSizes) { + ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedOutputStream coded_output(&output); + + coded_output.WriteVarint64(kVarintCases_case.value); + EXPECT_FALSE(coded_output.HadError()); + + EXPECT_EQ(kVarintCases_case.size, coded_output.ByteCount()); + } + + EXPECT_EQ(kVarintCases_case.size, output.ByteCount()); + EXPECT_EQ(0, + memcmp(buffer_, kVarintCases_case.bytes, kVarintCases_case.size)); +} + +// This test causes gcc 3.3.5 (and earlier?) to give the cryptic error: +// "sorry, unimplemented: `method_call_expr' not supported by dump_expr" +#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) + +int32 kSignExtendedVarintCases[] = { + 0, 1, -1, 1237894, -37895138 +}; + +TEST_2D(CodedStreamTest, WriteVarint32SignExtended, + kSignExtendedVarintCases, kBlockSizes) { + ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedOutputStream coded_output(&output); + + coded_output.WriteVarint32SignExtended(kSignExtendedVarintCases_case); + EXPECT_FALSE(coded_output.HadError()); + + if (kSignExtendedVarintCases_case < 0) { + EXPECT_EQ(10, coded_output.ByteCount()); + } else { + EXPECT_LE(coded_output.ByteCount(), 5); + } + } + + if (kSignExtendedVarintCases_case < 0) { + EXPECT_EQ(10, output.ByteCount()); + } else { + EXPECT_LE(output.ByteCount(), 5); + } + + // Read value back in as a varint64 and insure it matches. + ArrayInputStream input(buffer_, sizeof(buffer_)); + + { + CodedInputStream coded_input(&input); + + uint64 value; + EXPECT_TRUE(coded_input.ReadVarint64(&value)); + + EXPECT_EQ(kSignExtendedVarintCases_case, static_cast(value)); + } + + EXPECT_EQ(output.ByteCount(), input.ByteCount()); +} + +#endif + + +// ------------------------------------------------------------------- +// Varint failure test. + +struct VarintErrorCase { + uint8 bytes[12]; + int size; + bool can_parse; +}; + +inline std::ostream& operator<<(std::ostream& os, const VarintErrorCase& c) { + return os << "size " << c.size; +} + +const VarintErrorCase kVarintErrorCases[] = { + // Control case. (Insures that there isn't something else wrong that + // makes parsing always fail.) + {{0x00}, 1, true}, + + // No input data. + {{}, 0, false}, + + // Input ends unexpectedly. + {{0xf0, 0xab}, 2, false}, + + // Input ends unexpectedly after 32 bits. + {{0xf0, 0xab, 0xc9, 0x9a, 0xf8, 0xb2}, 6, false}, + + // Longer than 10 bytes. + {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01}, + 11, false}, +}; + +TEST_2D(CodedStreamTest, ReadVarint32Error, kVarintErrorCases, kBlockSizes) { + memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size); + ArrayInputStream input(buffer_, kVarintErrorCases_case.size, + kBlockSizes_case); + CodedInputStream coded_input(&input); + + uint32 value; + EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint32(&value)); +} + +TEST_2D(CodedStreamTest, ReadVarint64Error, kVarintErrorCases, kBlockSizes) { + memcpy(buffer_, kVarintErrorCases_case.bytes, kVarintErrorCases_case.size); + ArrayInputStream input(buffer_, kVarintErrorCases_case.size, + kBlockSizes_case); + CodedInputStream coded_input(&input); + + uint64 value; + EXPECT_EQ(kVarintErrorCases_case.can_parse, coded_input.ReadVarint64(&value)); +} + +// ------------------------------------------------------------------- +// VarintSize + +struct VarintSizeCase { + uint64 value; + int size; +}; + +inline std::ostream& operator<<(std::ostream& os, const VarintSizeCase& c) { + return os << c.value; +} + +VarintSizeCase kVarintSizeCases[] = { + {0u, 1}, + {1u, 1}, + {127u, 1}, + {128u, 2}, + {758923u, 3}, + {4000000000u, 5}, + {ULL(41256202580718336), 8}, + {ULL(11964378330978735131), 10}, +}; + +TEST_1D(CodedStreamTest, VarintSize32, kVarintSizeCases) { + if (kVarintSizeCases_case.value > 0xffffffffu) { + // Skip 64-bit values. + return; + } + + EXPECT_EQ(kVarintSizeCases_case.size, + CodedOutputStream::VarintSize32( + static_cast(kVarintSizeCases_case.value))); +} + +TEST_1D(CodedStreamTest, VarintSize64, kVarintSizeCases) { + EXPECT_EQ(kVarintSizeCases_case.size, + CodedOutputStream::VarintSize64(kVarintSizeCases_case.value)); +} + +// ------------------------------------------------------------------- +// Fixed-size int tests + +struct Fixed32Case { + uint8 bytes[sizeof(uint32)]; // Encoded bytes. + uint32 value; // Parsed value. +}; + +struct Fixed64Case { + uint8 bytes[sizeof(uint64)]; // Encoded bytes. + uint64 value; // Parsed value. +}; + +inline std::ostream& operator<<(std::ostream& os, const Fixed32Case& c) { + return os << "0x" << hex << c.value << dec; +} + +inline std::ostream& operator<<(std::ostream& os, const Fixed64Case& c) { + return os << "0x" << hex << c.value << dec; +} + +Fixed32Case kFixed32Cases[] = { + {{0xef, 0xcd, 0xab, 0x90}, 0x90abcdefu}, + {{0x12, 0x34, 0x56, 0x78}, 0x78563412u}, +}; + +Fixed64Case kFixed64Cases[] = { + {{0xef, 0xcd, 0xab, 0x90, 0x12, 0x34, 0x56, 0x78}, ULL(0x7856341290abcdef)}, + {{0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}, ULL(0x8877665544332211)}, +}; + +TEST_2D(CodedStreamTest, ReadLittleEndian32, kFixed32Cases, kBlockSizes) { + memcpy(buffer_, kFixed32Cases_case.bytes, sizeof(kFixed32Cases_case.bytes)); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + uint32 value; + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(kFixed32Cases_case.value, value); + } + + EXPECT_EQ(sizeof(uint32), input.ByteCount()); +} + +TEST_2D(CodedStreamTest, ReadLittleEndian64, kFixed64Cases, kBlockSizes) { + memcpy(buffer_, kFixed64Cases_case.bytes, sizeof(kFixed64Cases_case.bytes)); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + uint64 value; + EXPECT_TRUE(coded_input.ReadLittleEndian64(&value)); + EXPECT_EQ(kFixed64Cases_case.value, value); + } + + EXPECT_EQ(sizeof(uint64), input.ByteCount()); +} + +TEST_2D(CodedStreamTest, WriteLittleEndian32, kFixed32Cases, kBlockSizes) { + ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedOutputStream coded_output(&output); + + coded_output.WriteLittleEndian32(kFixed32Cases_case.value); + EXPECT_FALSE(coded_output.HadError()); + + EXPECT_EQ(sizeof(uint32), coded_output.ByteCount()); + } + + EXPECT_EQ(sizeof(uint32), output.ByteCount()); + EXPECT_EQ(0, memcmp(buffer_, kFixed32Cases_case.bytes, sizeof(uint32))); +} + +TEST_2D(CodedStreamTest, WriteLittleEndian64, kFixed64Cases, kBlockSizes) { + ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedOutputStream coded_output(&output); + + coded_output.WriteLittleEndian64(kFixed64Cases_case.value); + EXPECT_FALSE(coded_output.HadError()); + + EXPECT_EQ(sizeof(uint64), coded_output.ByteCount()); + } + + EXPECT_EQ(sizeof(uint64), output.ByteCount()); + EXPECT_EQ(0, memcmp(buffer_, kFixed64Cases_case.bytes, sizeof(uint64))); +} + +// Tests using the static methods to read fixed-size values from raw arrays. + +TEST_1D(CodedStreamTest, ReadLittleEndian32FromArray, kFixed32Cases) { + memcpy(buffer_, kFixed32Cases_case.bytes, sizeof(kFixed32Cases_case.bytes)); + + uint32 value; + const uint8* end = CodedInputStream::ReadLittleEndian32FromArray( + buffer_, &value); + EXPECT_EQ(kFixed32Cases_case.value, value); + EXPECT_TRUE(end == buffer_ + sizeof(value)); +} + +TEST_1D(CodedStreamTest, ReadLittleEndian64FromArray, kFixed64Cases) { + memcpy(buffer_, kFixed64Cases_case.bytes, sizeof(kFixed64Cases_case.bytes)); + + uint64 value; + const uint8* end = CodedInputStream::ReadLittleEndian64FromArray( + buffer_, &value); + EXPECT_EQ(kFixed64Cases_case.value, value); + EXPECT_TRUE(end == buffer_ + sizeof(value)); +} + +// ------------------------------------------------------------------- +// Raw reads and writes + +const char kRawBytes[] = "Some bytes which will be written and read raw."; + +TEST_1D(CodedStreamTest, ReadRaw, kBlockSizes) { + memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + char read_buffer[sizeof(kRawBytes)]; + + { + CodedInputStream coded_input(&input); + + EXPECT_TRUE(coded_input.ReadRaw(read_buffer, sizeof(kRawBytes))); + EXPECT_EQ(0, memcmp(kRawBytes, read_buffer, sizeof(kRawBytes))); + } + + EXPECT_EQ(sizeof(kRawBytes), input.ByteCount()); +} + +TEST_1D(CodedStreamTest, WriteRaw, kBlockSizes) { + ArrayOutputStream output(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedOutputStream coded_output(&output); + + coded_output.WriteRaw(kRawBytes, sizeof(kRawBytes)); + EXPECT_FALSE(coded_output.HadError()); + + EXPECT_EQ(sizeof(kRawBytes), coded_output.ByteCount()); + } + + EXPECT_EQ(sizeof(kRawBytes), output.ByteCount()); + EXPECT_EQ(0, memcmp(buffer_, kRawBytes, sizeof(kRawBytes))); +} + +TEST_1D(CodedStreamTest, ReadString, kBlockSizes) { + memcpy(buffer_, kRawBytes, sizeof(kRawBytes)); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + string str; + EXPECT_TRUE(coded_input.ReadString(&str, strlen(kRawBytes))); + EXPECT_EQ(kRawBytes, str); + } + + EXPECT_EQ(strlen(kRawBytes), input.ByteCount()); +} + +// Check to make sure ReadString doesn't crash on impossibly large strings. +TEST_1D(CodedStreamTest, ReadStringImpossiblyLarge, kBlockSizes) { + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + string str; + // Try to read a gigabyte. + EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30)); + } +} + +TEST_F(CodedStreamTest, ReadStringImpossiblyLargeFromStringOnStack) { + // Same test as above, except directly use a buffer. This used to cause + // crashes while the above did not. + uint8 buffer[8]; + CodedInputStream coded_input(buffer, 8); + string str; + EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30)); +} + +TEST_F(CodedStreamTest, ReadStringImpossiblyLargeFromStringOnHeap) { + scoped_array buffer(new uint8[8]); + CodedInputStream coded_input(buffer.get(), 8); + string str; + EXPECT_FALSE(coded_input.ReadString(&str, 1 << 30)); +} + + +// ------------------------------------------------------------------- +// Skip + +const char kSkipTestBytes[] = + ""; +const char kSkipOutputTestBytes[] = + "---------------------------------"; + +TEST_1D(CodedStreamTest, SkipInput, kBlockSizes) { + memcpy(buffer_, kSkipTestBytes, sizeof(kSkipTestBytes)); + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + string str; + EXPECT_TRUE(coded_input.ReadString(&str, strlen(""))); + EXPECT_EQ("", str); + EXPECT_TRUE(coded_input.Skip(strlen(""))); + EXPECT_TRUE(coded_input.ReadString(&str, strlen(""))); + EXPECT_EQ("", str); + } + + EXPECT_EQ(strlen(kSkipTestBytes), input.ByteCount()); +} + +// ------------------------------------------------------------------- +// GetDirectBufferPointer + +TEST_F(CodedStreamTest, GetDirectBufferPointerInput) { + ArrayInputStream input(buffer_, sizeof(buffer_), 8); + CodedInputStream coded_input(&input); + + const void* ptr; + int size; + + EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_, ptr); + EXPECT_EQ(8, size); + + // Peeking again should return the same pointer. + EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_, ptr); + EXPECT_EQ(8, size); + + // Skip forward in the same buffer then peek again. + EXPECT_TRUE(coded_input.Skip(3)); + EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_ + 3, ptr); + EXPECT_EQ(5, size); + + // Skip to end of buffer and peek -- should get next buffer. + EXPECT_TRUE(coded_input.Skip(5)); + EXPECT_TRUE(coded_input.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_ + 8, ptr); + EXPECT_EQ(8, size); +} + +TEST_F(CodedStreamTest, GetDirectBufferPointerInlineInput) { + ArrayInputStream input(buffer_, sizeof(buffer_), 8); + CodedInputStream coded_input(&input); + + const void* ptr; + int size; + + coded_input.GetDirectBufferPointerInline(&ptr, &size); + EXPECT_EQ(buffer_, ptr); + EXPECT_EQ(8, size); + + // Peeking again should return the same pointer. + coded_input.GetDirectBufferPointerInline(&ptr, &size); + EXPECT_EQ(buffer_, ptr); + EXPECT_EQ(8, size); + + // Skip forward in the same buffer then peek again. + EXPECT_TRUE(coded_input.Skip(3)); + coded_input.GetDirectBufferPointerInline(&ptr, &size); + EXPECT_EQ(buffer_ + 3, ptr); + EXPECT_EQ(5, size); + + // Skip to end of buffer and peek -- should return false and provide an empty + // buffer. It does not try to Refresh(). + EXPECT_TRUE(coded_input.Skip(5)); + coded_input.GetDirectBufferPointerInline(&ptr, &size); + EXPECT_EQ(buffer_ + 8, ptr); + EXPECT_EQ(0, size); +} + +TEST_F(CodedStreamTest, GetDirectBufferPointerOutput) { + ArrayOutputStream output(buffer_, sizeof(buffer_), 8); + CodedOutputStream coded_output(&output); + + void* ptr; + int size; + + EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_, ptr); + EXPECT_EQ(8, size); + + // Peeking again should return the same pointer. + EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_, ptr); + EXPECT_EQ(8, size); + + // Skip forward in the same buffer then peek again. + EXPECT_TRUE(coded_output.Skip(3)); + EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_ + 3, ptr); + EXPECT_EQ(5, size); + + // Skip to end of buffer and peek -- should get next buffer. + EXPECT_TRUE(coded_output.Skip(5)); + EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_ + 8, ptr); + EXPECT_EQ(8, size); + + // Skip over multiple buffers. + EXPECT_TRUE(coded_output.Skip(22)); + EXPECT_TRUE(coded_output.GetDirectBufferPointer(&ptr, &size)); + EXPECT_EQ(buffer_ + 30, ptr); + EXPECT_EQ(2, size); +} + +// ------------------------------------------------------------------- +// Limits + +TEST_1D(CodedStreamTest, BasicLimit, kBlockSizes) { + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + CodedInputStream::Limit limit = coded_input.PushLimit(8); + + // Read until we hit the limit. + uint32 value; + EXPECT_EQ(8, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(4, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + + coded_input.PopLimit(limit); + + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + } + + EXPECT_EQ(12, input.ByteCount()); +} + +// Test what happens when we push two limits where the second (top) one is +// shorter. +TEST_1D(CodedStreamTest, SmallLimitOnTopOfBigLimit, kBlockSizes) { + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + CodedInputStream::Limit limit1 = coded_input.PushLimit(8); + EXPECT_EQ(8, coded_input.BytesUntilLimit()); + CodedInputStream::Limit limit2 = coded_input.PushLimit(4); + + uint32 value; + + // Read until we hit limit2, the top and shortest limit. + EXPECT_EQ(4, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + + coded_input.PopLimit(limit2); + + // Read until we hit limit1. + EXPECT_EQ(4, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + + coded_input.PopLimit(limit1); + + // No more limits. + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + } + + EXPECT_EQ(12, input.ByteCount()); +} + +// Test what happens when we push two limits where the second (top) one is +// longer. In this case, the top limit is shortened to match the previous +// limit. +TEST_1D(CodedStreamTest, BigLimitOnTopOfSmallLimit, kBlockSizes) { + ArrayInputStream input(buffer_, sizeof(buffer_), kBlockSizes_case); + + { + CodedInputStream coded_input(&input); + + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + CodedInputStream::Limit limit1 = coded_input.PushLimit(4); + EXPECT_EQ(4, coded_input.BytesUntilLimit()); + CodedInputStream::Limit limit2 = coded_input.PushLimit(8); + + uint32 value; + + // Read until we hit limit2. Except, wait! limit1 is shorter, so + // we end up hitting that first, despite having 4 bytes to go on + // limit2. + EXPECT_EQ(4, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + + coded_input.PopLimit(limit2); + + // OK, popped limit2, now limit1 is on top, which we've already hit. + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + EXPECT_FALSE(coded_input.ReadLittleEndian32(&value)); + EXPECT_EQ(0, coded_input.BytesUntilLimit()); + + coded_input.PopLimit(limit1); + + // No more limits. + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + } + + EXPECT_EQ(8, input.ByteCount()); +} + +TEST_F(CodedStreamTest, ExpectAtEnd) { + // Test ExpectAtEnd(), which is based on limits. + ArrayInputStream input(buffer_, sizeof(buffer_)); + CodedInputStream coded_input(&input); + + EXPECT_FALSE(coded_input.ExpectAtEnd()); + + CodedInputStream::Limit limit = coded_input.PushLimit(4); + + uint32 value; + EXPECT_TRUE(coded_input.ReadLittleEndian32(&value)); + EXPECT_TRUE(coded_input.ExpectAtEnd()); + + coded_input.PopLimit(limit); + EXPECT_FALSE(coded_input.ExpectAtEnd()); +} + +TEST_F(CodedStreamTest, NegativeLimit) { + // Check what happens when we push a negative limit. + ArrayInputStream input(buffer_, sizeof(buffer_)); + CodedInputStream coded_input(&input); + + CodedInputStream::Limit limit = coded_input.PushLimit(-1234); + // BytesUntilLimit() returns -1 to mean "no limit", which actually means + // "the limit is INT_MAX relative to the beginning of the stream". + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + coded_input.PopLimit(limit); +} + +TEST_F(CodedStreamTest, NegativeLimitAfterReading) { + // Check what happens when we push a negative limit. + ArrayInputStream input(buffer_, sizeof(buffer_)); + CodedInputStream coded_input(&input); + ASSERT_TRUE(coded_input.Skip(128)); + + CodedInputStream::Limit limit = coded_input.PushLimit(-64); + // BytesUntilLimit() returns -1 to mean "no limit", which actually means + // "the limit is INT_MAX relative to the beginning of the stream". + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + coded_input.PopLimit(limit); +} + +TEST_F(CodedStreamTest, OverflowLimit) { + // Check what happens when we push a limit large enough that its absolute + // position is more than 2GB into the stream. + ArrayInputStream input(buffer_, sizeof(buffer_)); + CodedInputStream coded_input(&input); + ASSERT_TRUE(coded_input.Skip(128)); + + CodedInputStream::Limit limit = coded_input.PushLimit(INT_MAX); + // BytesUntilLimit() returns -1 to mean "no limit", which actually means + // "the limit is INT_MAX relative to the beginning of the stream". + EXPECT_EQ(-1, coded_input.BytesUntilLimit()); + coded_input.PopLimit(limit); +} + +TEST_F(CodedStreamTest, TotalBytesLimit) { + ArrayInputStream input(buffer_, sizeof(buffer_)); + CodedInputStream coded_input(&input); + coded_input.SetTotalBytesLimit(16, -1); + + string str; + EXPECT_TRUE(coded_input.ReadString(&str, 16)); + + vector errors; + + { + ScopedMemoryLog error_log; + EXPECT_FALSE(coded_input.ReadString(&str, 1)); + errors = error_log.GetMessages(ERROR); + } + + ASSERT_EQ(1, errors.size()); + EXPECT_PRED_FORMAT2(testing::IsSubstring, + "A protocol message was rejected because it was too big", errors[0]); + + coded_input.SetTotalBytesLimit(32, -1); + EXPECT_TRUE(coded_input.ReadString(&str, 16)); +} + +TEST_F(CodedStreamTest, TotalBytesLimitNotValidMessageEnd) { + // total_bytes_limit_ is not a valid place for a message to end. + + ArrayInputStream input(buffer_, sizeof(buffer_)); + CodedInputStream coded_input(&input); + + // Set both total_bytes_limit and a regular limit at 16 bytes. + coded_input.SetTotalBytesLimit(16, -1); + CodedInputStream::Limit limit = coded_input.PushLimit(16); + + // Read 16 bytes. + string str; + EXPECT_TRUE(coded_input.ReadString(&str, 16)); + + // Read a tag. Should fail, but report being a valid endpoint since it's + // a regular limit. + EXPECT_EQ(0, coded_input.ReadTag()); + EXPECT_TRUE(coded_input.ConsumedEntireMessage()); + + // Pop the limit. + coded_input.PopLimit(limit); + + // Read a tag. Should fail, and report *not* being a valid endpoint, since + // this time we're hitting the total bytes limit. + EXPECT_EQ(0, coded_input.ReadTag()); + EXPECT_FALSE(coded_input.ConsumedEntireMessage()); +} + + +TEST_F(CodedStreamTest, RecursionLimit) { + ArrayInputStream input(buffer_, sizeof(buffer_)); + CodedInputStream coded_input(&input); + coded_input.SetRecursionLimit(4); + + // This is way too much testing for a counter. + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 1 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 2 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 3 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 4 + EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 5 + EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 6 + coded_input.DecrementRecursionDepth(); // 5 + EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 6 + coded_input.DecrementRecursionDepth(); // 5 + coded_input.DecrementRecursionDepth(); // 4 + coded_input.DecrementRecursionDepth(); // 3 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 4 + EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 5 + coded_input.DecrementRecursionDepth(); // 4 + coded_input.DecrementRecursionDepth(); // 3 + coded_input.DecrementRecursionDepth(); // 2 + coded_input.DecrementRecursionDepth(); // 1 + coded_input.DecrementRecursionDepth(); // 0 + coded_input.DecrementRecursionDepth(); // 0 + coded_input.DecrementRecursionDepth(); // 0 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 1 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 2 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 3 + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 4 + EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 5 + + coded_input.SetRecursionLimit(6); + EXPECT_TRUE(coded_input.IncrementRecursionDepth()); // 6 + EXPECT_FALSE(coded_input.IncrementRecursionDepth()); // 7 +} + +class ReallyBigInputStream : public ZeroCopyInputStream { + public: + ReallyBigInputStream() : backup_amount_(0), buffer_count_(0) {} + ~ReallyBigInputStream() {} + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size) { + // We only expect BackUp() to be called at the end. + EXPECT_EQ(0, backup_amount_); + + switch (buffer_count_++) { + case 0: + *data = buffer_; + *size = sizeof(buffer_); + return true; + case 1: + // Return an enormously large buffer that, when combined with the 1k + // returned already, should overflow the total_bytes_read_ counter in + // CodedInputStream. Note that we'll only read the first 1024 bytes + // of this buffer so it's OK that we have it point at buffer_. + *data = buffer_; + *size = INT_MAX; + return true; + default: + return false; + } + } + + void BackUp(int count) { + backup_amount_ = count; + } + + bool Skip(int count) { GOOGLE_LOG(FATAL) << "Not implemented."; return false; } + int64 ByteCount() const { GOOGLE_LOG(FATAL) << "Not implemented."; return 0; } + + int backup_amount_; + + private: + char buffer_[1024]; + int64 buffer_count_; +}; + +TEST_F(CodedStreamTest, InputOver2G) { + // CodedInputStream should gracefully handle input over 2G and call + // input.BackUp() with the correct number of bytes on destruction. + ReallyBigInputStream input; + + vector errors; + + { + ScopedMemoryLog error_log; + CodedInputStream coded_input(&input); + string str; + EXPECT_TRUE(coded_input.ReadString(&str, 512)); + EXPECT_TRUE(coded_input.ReadString(&str, 1024)); + errors = error_log.GetMessages(ERROR); + } + + EXPECT_EQ(INT_MAX - 512, input.backup_amount_); + EXPECT_EQ(0, errors.size()); +} + +// =================================================================== + + +} // namespace +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc new file mode 100644 index 000000000..0f1ff872a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc @@ -0,0 +1,335 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: brianolson@google.com (Brian Olson) +// +// This file contains the implementation of classes GzipInputStream and +// GzipOutputStream. + +#include "config.h" + +#if HAVE_ZLIB +#include + +#include + +namespace google { +namespace protobuf { +namespace io { + +static const int kDefaultBufferSize = 65536; + +GzipInputStream::GzipInputStream( + ZeroCopyInputStream* sub_stream, Format format, int buffer_size) + : format_(format), sub_stream_(sub_stream), zerror_(Z_OK) { + zcontext_.zalloc = Z_NULL; + zcontext_.zfree = Z_NULL; + zcontext_.opaque = Z_NULL; + zcontext_.total_out = 0; + zcontext_.next_in = NULL; + zcontext_.avail_in = 0; + zcontext_.total_in = 0; + zcontext_.msg = NULL; + if (buffer_size == -1) { + output_buffer_length_ = kDefaultBufferSize; + } else { + output_buffer_length_ = buffer_size; + } + output_buffer_ = operator new(output_buffer_length_); + GOOGLE_CHECK(output_buffer_ != NULL); + zcontext_.next_out = static_cast(output_buffer_); + zcontext_.avail_out = output_buffer_length_; + output_position_ = output_buffer_; +} +GzipInputStream::~GzipInputStream() { + operator delete(output_buffer_); + zerror_ = inflateEnd(&zcontext_); +} + +static inline int internalInflateInit2( + z_stream* zcontext, GzipInputStream::Format format) { + int windowBitsFormat = 0; + switch (format) { + case GzipInputStream::GZIP: windowBitsFormat = 16; break; + case GzipInputStream::AUTO: windowBitsFormat = 32; break; + case GzipInputStream::ZLIB: windowBitsFormat = 0; break; + } + return inflateInit2(zcontext, /* windowBits */15 | windowBitsFormat); +} + +int GzipInputStream::Inflate(int flush) { + if ((zerror_ == Z_OK) && (zcontext_.avail_out == 0)) { + // previous inflate filled output buffer. don't change input params yet. + } else if (zcontext_.avail_in == 0) { + const void* in; + int in_size; + bool first = zcontext_.next_in == NULL; + bool ok = sub_stream_->Next(&in, &in_size); + if (!ok) { + zcontext_.next_out = NULL; + zcontext_.avail_out = 0; + return Z_STREAM_END; + } + zcontext_.next_in = static_cast(const_cast(in)); + zcontext_.avail_in = in_size; + if (first) { + int error = internalInflateInit2(&zcontext_, format_); + if (error != Z_OK) { + return error; + } + } + } + zcontext_.next_out = static_cast(output_buffer_); + zcontext_.avail_out = output_buffer_length_; + output_position_ = output_buffer_; + int error = inflate(&zcontext_, flush); + return error; +} + +void GzipInputStream::DoNextOutput(const void** data, int* size) { + *data = output_position_; + *size = ((uintptr_t)zcontext_.next_out) - ((uintptr_t)output_position_); + output_position_ = zcontext_.next_out; +} + +// implements ZeroCopyInputStream ---------------------------------- +bool GzipInputStream::Next(const void** data, int* size) { + bool ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) + || (zerror_ == Z_BUF_ERROR); + if ((!ok) || (zcontext_.next_out == NULL)) { + return false; + } + if (zcontext_.next_out != output_position_) { + DoNextOutput(data, size); + return true; + } + if (zerror_ == Z_STREAM_END) { + if (zcontext_.next_out != NULL) { + // sub_stream_ may have concatenated streams to follow + zerror_ = inflateEnd(&zcontext_); + if (zerror_ != Z_OK) { + return false; + } + zerror_ = internalInflateInit2(&zcontext_, format_); + if (zerror_ != Z_OK) { + return false; + } + } else { + *data = NULL; + *size = 0; + return false; + } + } + zerror_ = Inflate(Z_NO_FLUSH); + if ((zerror_ == Z_STREAM_END) && (zcontext_.next_out == NULL)) { + // The underlying stream's Next returned false inside Inflate. + return false; + } + ok = (zerror_ == Z_OK) || (zerror_ == Z_STREAM_END) + || (zerror_ == Z_BUF_ERROR); + if (!ok) { + return false; + } + DoNextOutput(data, size); + return true; +} +void GzipInputStream::BackUp(int count) { + output_position_ = reinterpret_cast( + reinterpret_cast(output_position_) - count); +} +bool GzipInputStream::Skip(int count) { + const void* data; + int size; + bool ok = Next(&data, &size); + while (ok && (size < count)) { + count -= size; + ok = Next(&data, &size); + } + if (size > count) { + BackUp(size - count); + } + return ok; +} +int64 GzipInputStream::ByteCount() const { + return zcontext_.total_out + + (((uintptr_t)zcontext_.next_out) - ((uintptr_t)output_position_)); +} + +// ========================================================================= + +GzipOutputStream::Options::Options() + : format(GZIP), + buffer_size(kDefaultBufferSize), + compression_level(Z_DEFAULT_COMPRESSION), + compression_strategy(Z_DEFAULT_STRATEGY) {} + +GzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream) { + Init(sub_stream, Options()); +} + +GzipOutputStream::GzipOutputStream(ZeroCopyOutputStream* sub_stream, + const Options& options) { + Init(sub_stream, options); +} + +GzipOutputStream::GzipOutputStream( + ZeroCopyOutputStream* sub_stream, Format format, int buffer_size) { + Options options; + options.format = format; + if (buffer_size != -1) { + options.buffer_size = buffer_size; + } + Init(sub_stream, options); +} + +void GzipOutputStream::Init(ZeroCopyOutputStream* sub_stream, + const Options& options) { + sub_stream_ = sub_stream; + sub_data_ = NULL; + sub_data_size_ = 0; + + input_buffer_length_ = options.buffer_size; + input_buffer_ = operator new(input_buffer_length_); + GOOGLE_CHECK(input_buffer_ != NULL); + + zcontext_.zalloc = Z_NULL; + zcontext_.zfree = Z_NULL; + zcontext_.opaque = Z_NULL; + zcontext_.next_out = NULL; + zcontext_.avail_out = 0; + zcontext_.total_out = 0; + zcontext_.next_in = NULL; + zcontext_.avail_in = 0; + zcontext_.total_in = 0; + zcontext_.msg = NULL; + // default to GZIP format + int windowBitsFormat = 16; + if (options.format == ZLIB) { + windowBitsFormat = 0; + } + zerror_ = deflateInit2( + &zcontext_, + options.compression_level, + Z_DEFLATED, + /* windowBits */15 | windowBitsFormat, + /* memLevel (default) */8, + options.compression_strategy); +} + +GzipOutputStream::~GzipOutputStream() { + Close(); + if (input_buffer_ != NULL) { + operator delete(input_buffer_); + } +} + +// private +int GzipOutputStream::Deflate(int flush) { + int error = Z_OK; + do { + if ((sub_data_ == NULL) || (zcontext_.avail_out == 0)) { + bool ok = sub_stream_->Next(&sub_data_, &sub_data_size_); + if (!ok) { + sub_data_ = NULL; + sub_data_size_ = 0; + return Z_BUF_ERROR; + } + GOOGLE_CHECK_GT(sub_data_size_, 0); + zcontext_.next_out = static_cast(sub_data_); + zcontext_.avail_out = sub_data_size_; + } + error = deflate(&zcontext_, flush); + } while (error == Z_OK && zcontext_.avail_out == 0); + if ((flush == Z_FULL_FLUSH) || (flush == Z_FINISH)) { + // Notify lower layer of data. + sub_stream_->BackUp(zcontext_.avail_out); + // We don't own the buffer anymore. + sub_data_ = NULL; + sub_data_size_ = 0; + } + return error; +} + +// implements ZeroCopyOutputStream --------------------------------- +bool GzipOutputStream::Next(void** data, int* size) { + if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) { + return false; + } + if (zcontext_.avail_in != 0) { + zerror_ = Deflate(Z_NO_FLUSH); + if (zerror_ != Z_OK) { + return false; + } + } + if (zcontext_.avail_in == 0) { + // all input was consumed. reset the buffer. + zcontext_.next_in = static_cast(input_buffer_); + zcontext_.avail_in = input_buffer_length_; + *data = input_buffer_; + *size = input_buffer_length_; + } else { + // The loop in Deflate should consume all avail_in + GOOGLE_LOG(DFATAL) << "Deflate left bytes unconsumed"; + } + return true; +} +void GzipOutputStream::BackUp(int count) { + GOOGLE_CHECK_GE(zcontext_.avail_in, count); + zcontext_.avail_in -= count; +} +int64 GzipOutputStream::ByteCount() const { + return zcontext_.total_in + zcontext_.avail_in; +} + +bool GzipOutputStream::Flush() { + do { + zerror_ = Deflate(Z_FULL_FLUSH); + } while (zerror_ == Z_OK); + return zerror_ == Z_OK; +} + +bool GzipOutputStream::Close() { + if ((zerror_ != Z_OK) && (zerror_ != Z_BUF_ERROR)) { + return false; + } + do { + zerror_ = Deflate(Z_FINISH); + } while (zerror_ == Z_OK); + zerror_ = deflateEnd(&zcontext_); + bool ok = zerror_ == Z_OK; + zerror_ = Z_STREAM_END; + return ok; +} + +} // namespace io +} // namespace protobuf +} // namespace google + +#endif // HAVE_ZLIB diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h new file mode 100644 index 000000000..65dbc5b55 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h @@ -0,0 +1,207 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: brianolson@google.com (Brian Olson) +// +// This file contains the definition for classes GzipInputStream and +// GzipOutputStream. +// +// GzipInputStream decompresses data from an underlying +// ZeroCopyInputStream and provides the decompressed data as a +// ZeroCopyInputStream. +// +// GzipOutputStream is an ZeroCopyOutputStream that compresses data to +// an underlying ZeroCopyOutputStream. + +#ifndef GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ +#define GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ + +#include + +#include + +namespace google { +namespace protobuf { +namespace io { + +// A ZeroCopyInputStream that reads compressed data through zlib +class LIBPROTOBUF_EXPORT GzipInputStream : public ZeroCopyInputStream { + public: + // Format key for constructor + enum Format { + // zlib will autodetect gzip header or deflate stream + AUTO = 0, + + // GZIP streams have some extra header data for file attributes. + GZIP = 1, + + // Simpler zlib stream format. + ZLIB = 2, + }; + + // buffer_size and format may be -1 for default of 64kB and GZIP format + explicit GzipInputStream( + ZeroCopyInputStream* sub_stream, + Format format = AUTO, + int buffer_size = -1); + virtual ~GzipInputStream(); + + // Return last error message or NULL if no error. + inline const char* ZlibErrorMessage() const { + return zcontext_.msg; + } + inline int ZlibErrorCode() const { + return zerror_; + } + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + private: + Format format_; + + ZeroCopyInputStream* sub_stream_; + + z_stream zcontext_; + int zerror_; + + void* output_buffer_; + void* output_position_; + size_t output_buffer_length_; + + int Inflate(int flush); + void DoNextOutput(const void** data, int* size); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipInputStream); +}; + + +class LIBPROTOBUF_EXPORT GzipOutputStream : public ZeroCopyOutputStream { + public: + // Format key for constructor + enum Format { + // GZIP streams have some extra header data for file attributes. + GZIP = 1, + + // Simpler zlib stream format. + ZLIB = 2, + }; + + struct Options { + // Defaults to GZIP. + Format format; + + // What size buffer to use internally. Defaults to 64kB. + int buffer_size; + + // A number between 0 and 9, where 0 is no compression and 9 is best + // compression. Defaults to Z_DEFAULT_COMPRESSION (see zlib.h). + int compression_level; + + // Defaults to Z_DEFAULT_STRATEGY. Can also be set to Z_FILTERED, + // Z_HUFFMAN_ONLY, or Z_RLE. See the documentation for deflateInit2 in + // zlib.h for definitions of these constants. + int compression_strategy; + + Options(); // Initializes with default values. + }; + + // Create a GzipOutputStream with default options. + explicit GzipOutputStream(ZeroCopyOutputStream* sub_stream); + + // Create a GzipOutputStream with the given options. + GzipOutputStream( + ZeroCopyOutputStream* sub_stream, + const Options& options); + + // DEPRECATED: Use one of the above constructors instead. + GzipOutputStream( + ZeroCopyOutputStream* sub_stream, + Format format, + int buffer_size = -1) GOOGLE_ATTRIBUTE_DEPRECATED; + + virtual ~GzipOutputStream(); + + // Return last error message or NULL if no error. + inline const char* ZlibErrorMessage() const { + return zcontext_.msg; + } + inline int ZlibErrorCode() const { + return zerror_; + } + + // Flushes data written so far to zipped data in the underlying stream. + // It is the caller's responsibility to flush the underlying stream if + // necessary. + // Compression may be less efficient stopping and starting around flushes. + // Returns true if no error. + bool Flush(); + + // Writes out all data and closes the gzip stream. + // It is the caller's responsibility to close the underlying stream if + // necessary. + // Returns true if no error. + bool Close(); + + // implements ZeroCopyOutputStream --------------------------------- + bool Next(void** data, int* size); + void BackUp(int count); + int64 ByteCount() const; + + private: + ZeroCopyOutputStream* sub_stream_; + // Result from calling Next() on sub_stream_ + void* sub_data_; + int sub_data_size_; + + z_stream zcontext_; + int zerror_; + void* input_buffer_; + size_t input_buffer_length_; + + // Shared constructor code. + void Init(ZeroCopyOutputStream* sub_stream, const Options& options); + + // Do some compression. + // Takes zlib flush mode. + // Returns zlib error code. + int Deflate(int flush); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(GzipOutputStream); +}; + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_GZIP_STREAM_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh new file mode 100755 index 000000000..6e8a09437 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh @@ -0,0 +1,44 @@ +#!/bin/sh -x +# +# Protocol Buffers - Google's data interchange format +# Copyright 2009 Google Inc. All rights reserved. +# http://code.google.com/p/protobuf/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Author: brianolson@google.com (Brian Olson) +# +# Test compatibility between command line gzip/gunzip binaries and +# ZeroCopyStream versions. + +TESTFILE=Makefile + +(./zcgzip < ${TESTFILE} | gunzip | cmp - ${TESTFILE}) && \ +(gzip < ${TESTFILE} | ./zcgunzip | cmp - ${TESTFILE}) + +# Result of "(cmd) && (cmd)" implicitly becomes result of this script +# and thus the test. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h new file mode 100644 index 000000000..7a7a4e773 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h @@ -0,0 +1,54 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file exists solely to document the google::protobuf::io namespace. +// It is not compiled into anything, but it may be read by an automated +// documentation generator. + +namespace google { + +namespace protobuf { + +// Auxiliary classes used for I/O. +// +// The Protocol Buffer library uses the classes in this package to deal with +// I/O and encoding/decoding raw bytes. Most users will not need to +// deal with this package. However, users who want to adapt the system to +// work with their own I/O abstractions -- e.g., to allow Protocol Buffers +// to be read from a different kind of input stream without the need for a +// temporary buffer -- should take a closer look. +namespace io {} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc new file mode 100644 index 000000000..9ab90deec --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc @@ -0,0 +1,199 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +Printer::Printer(ZeroCopyOutputStream* output, char variable_delimiter) + : variable_delimiter_(variable_delimiter), + output_(output), + buffer_(NULL), + buffer_size_(0), + at_start_of_line_(true), + failed_(false) { +} + +Printer::~Printer() { + // Only BackUp() if we're sure we've successfully called Next() at least once. + if (buffer_size_ > 0) { + output_->BackUp(buffer_size_); + } +} + +void Printer::Print(const map& variables, const char* text) { + int size = strlen(text); + int pos = 0; // The number of bytes we've written so far. + + for (int i = 0; i < size; i++) { + if (text[i] == '\n') { + // Saw newline. If there is more text, we may need to insert an indent + // here. So, write what we have so far, including the '\n'. + WriteRaw(text + pos, i - pos + 1); + pos = i + 1; + + // Setting this true will cause the next WriteRaw() to insert an indent + // first. + at_start_of_line_ = true; + + } else if (text[i] == variable_delimiter_) { + // Saw the start of a variable name. + + // Write what we have so far. + WriteRaw(text + pos, i - pos); + pos = i + 1; + + // Find closing delimiter. + const char* end = strchr(text + pos, variable_delimiter_); + if (end == NULL) { + GOOGLE_LOG(DFATAL) << " Unclosed variable name."; + end = text + pos; + } + int endpos = end - text; + + string varname(text + pos, endpos - pos); + if (varname.empty()) { + // Two delimiters in a row reduce to a literal delimiter character. + WriteRaw(&variable_delimiter_, 1); + } else { + // Replace with the variable's value. + map::const_iterator iter = variables.find(varname); + if (iter == variables.end()) { + GOOGLE_LOG(DFATAL) << " Undefined variable: " << varname; + } else { + WriteRaw(iter->second.data(), iter->second.size()); + } + } + + // Advance past this variable. + i = endpos; + pos = endpos + 1; + } + } + + // Write the rest. + WriteRaw(text + pos, size - pos); +} + +void Printer::Print(const char* text) { + static map empty; + Print(empty, text); +} + +void Printer::Print(const char* text, + const char* variable, const string& value) { + map vars; + vars[variable] = value; + Print(vars, text); +} + +void Printer::Print(const char* text, + const char* variable1, const string& value1, + const char* variable2, const string& value2) { + map vars; + vars[variable1] = value1; + vars[variable2] = value2; + Print(vars, text); +} + +void Printer::Print(const char* text, + const char* variable1, const string& value1, + const char* variable2, const string& value2, + const char* variable3, const string& value3) { + map vars; + vars[variable1] = value1; + vars[variable2] = value2; + vars[variable3] = value3; + Print(vars, text); +} + +void Printer::Indent() { + indent_ += " "; +} + +void Printer::Outdent() { + if (indent_.empty()) { + GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent()."; + return; + } + + indent_.resize(indent_.size() - 2); +} + +void Printer::PrintRaw(const string& data) { + WriteRaw(data.data(), data.size()); +} + +void Printer::PrintRaw(const char* data) { + if (failed_) return; + WriteRaw(data, strlen(data)); +} + +void Printer::WriteRaw(const char* data, int size) { + if (failed_) return; + if (size == 0) return; + + if (at_start_of_line_) { + // Insert an indent. + at_start_of_line_ = false; + WriteRaw(indent_.data(), indent_.size()); + if (failed_) return; + } + + while (size > buffer_size_) { + // Data exceeds space in the buffer. Copy what we can and request a + // new buffer. + memcpy(buffer_, data, buffer_size_); + data += buffer_size_; + size -= buffer_size_; + void* void_buffer; + failed_ = !output_->Next(&void_buffer, &buffer_size_); + if (failed_) return; + buffer_ = reinterpret_cast(void_buffer); + } + + // Buffer is big enough to receive the data; copy it. + memcpy(buffer_, data, size); + buffer_ += size; + buffer_size_ -= size; +} + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h new file mode 100644 index 000000000..5be48543a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h @@ -0,0 +1,136 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Utility class for writing text to a ZeroCopyOutputStream. + +#ifndef GOOGLE_PROTOBUF_IO_PRINTER_H__ +#define GOOGLE_PROTOBUF_IO_PRINTER_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +class ZeroCopyOutputStream; // zero_copy_stream.h + +// This simple utility class assists in code generation. It basically +// allows the caller to define a set of variables and then output some +// text with variable substitutions. Example usage: +// +// Printer printer(output, '$'); +// map vars; +// vars["name"] = "Bob"; +// printer.Print(vars, "My name is $name$."); +// +// The above writes "My name is Bob." to the output stream. +// +// Printer aggressively enforces correct usage, crashing (with assert failures) +// in the case of undefined variables in debug builds. This helps greatly in +// debugging code which uses it. +class LIBPROTOBUF_EXPORT Printer { + public: + // Create a printer that writes text to the given output stream. Use the + // given character as the delimiter for variables. + Printer(ZeroCopyOutputStream* output, char variable_delimiter); + ~Printer(); + + // Print some text after applying variable substitutions. If a particular + // variable in the text is not defined, this will crash. Variables to be + // substituted are identified by their names surrounded by delimiter + // characters (as given to the constructor). The variable bindings are + // defined by the given map. + void Print(const map& variables, const char* text); + + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text); + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text, const char* variable, const string& value); + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text, const char* variable1, const string& value1, + const char* variable2, const string& value2); + // Like the first Print(), except the substitutions are given as parameters. + void Print(const char* text, const char* variable1, const string& value1, + const char* variable2, const string& value2, + const char* variable3, const string& value3); + // TODO(kenton): Overloaded versions with more variables? Three seems + // to be enough. + + // Indent text by two spaces. After calling Indent(), two spaces will be + // inserted at the beginning of each line of text. Indent() may be called + // multiple times to produce deeper indents. + void Indent(); + + // Reduces the current indent level by two spaces, or crashes if the indent + // level is zero. + void Outdent(); + + // Write a string to the output buffer. + // This method does not look for newlines to add indentation. + void PrintRaw(const string& data); + + // Write a zero-delimited string to output buffer. + // This method does not look for newlines to add indentation. + void PrintRaw(const char* data); + + // Write some bytes to the output buffer. + // This method does not look for newlines to add indentation. + void WriteRaw(const char* data, int size); + + // True if any write to the underlying stream failed. (We don't just + // crash in this case because this is an I/O failure, not a programming + // error.) + bool failed() const { return failed_; } + + private: + const char variable_delimiter_; + + ZeroCopyOutputStream* const output_; + char* buffer_; + int buffer_size_; + + string indent_; + bool at_start_of_line_; + bool failed_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Printer); +}; + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_PRINTER_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc new file mode 100644 index 000000000..580a53da2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc @@ -0,0 +1,261 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { +namespace { + +// Each test repeats over several block sizes in order to test both cases +// where particular writes cross a buffer boundary and cases where they do +// not. + +TEST(Printer, EmptyPrinter) { + char buffer[8192]; + const int block_size = 100; + ArrayOutputStream output(buffer, GOOGLE_ARRAYSIZE(buffer), block_size); + Printer printer(&output, '\0'); + EXPECT_TRUE(!printer.failed()); +} + +TEST(Printer, BasicPrinting) { + char buffer[8192]; + + for (int block_size = 1; block_size < 512; block_size *= 2) { + ArrayOutputStream output(buffer, sizeof(buffer), block_size); + + { + Printer printer(&output, '\0'); + + printer.Print("Hello World!"); + printer.Print(" This is the same line.\n"); + printer.Print("But this is a new one.\nAnd this is another one."); + + EXPECT_FALSE(printer.failed()); + } + + buffer[output.ByteCount()] = '\0'; + + EXPECT_STREQ("Hello World! This is the same line.\n" + "But this is a new one.\n" + "And this is another one.", + buffer); + } +} + +TEST(Printer, WriteRaw) { + char buffer[8192]; + + for (int block_size = 1; block_size < 512; block_size *= 2) { + ArrayOutputStream output(buffer, sizeof(buffer), block_size); + + { + string string_obj = "From an object\n"; + Printer printer(&output, '$'); + printer.WriteRaw("Hello World!", 12); + printer.PrintRaw(" This is the same line.\n"); + printer.PrintRaw("But this is a new one.\nAnd this is another one."); + printer.WriteRaw("\n", 1); + printer.PrintRaw(string_obj); + EXPECT_FALSE(printer.failed()); + } + + buffer[output.ByteCount()] = '\0'; + + EXPECT_STREQ("Hello World! This is the same line.\n" + "But this is a new one.\n" + "And this is another one." + "\n" + "From an object\n", + buffer); + } +} + +TEST(Printer, VariableSubstitution) { + char buffer[8192]; + + for (int block_size = 1; block_size < 512; block_size *= 2) { + ArrayOutputStream output(buffer, sizeof(buffer), block_size); + + { + Printer printer(&output, '$'); + map vars; + + vars["foo"] = "World"; + vars["bar"] = "$foo$"; + vars["abcdefg"] = "1234"; + + printer.Print(vars, "Hello $foo$!\nbar = $bar$\n"); + printer.PrintRaw("RawBit\n"); + printer.Print(vars, "$abcdefg$\nA literal dollar sign: $$"); + + vars["foo"] = "blah"; + printer.Print(vars, "\nNow foo = $foo$."); + + EXPECT_FALSE(printer.failed()); + } + + buffer[output.ByteCount()] = '\0'; + + EXPECT_STREQ("Hello World!\n" + "bar = $foo$\n" + "RawBit\n" + "1234\n" + "A literal dollar sign: $\n" + "Now foo = blah.", + buffer); + } +} + +TEST(Printer, InlineVariableSubstitution) { + char buffer[8192]; + + ArrayOutputStream output(buffer, sizeof(buffer)); + + { + Printer printer(&output, '$'); + printer.Print("Hello $foo$!\n", "foo", "World"); + printer.PrintRaw("RawBit\n"); + printer.Print("$foo$ $bar$\n", "foo", "one", "bar", "two"); + EXPECT_FALSE(printer.failed()); + } + + buffer[output.ByteCount()] = '\0'; + + EXPECT_STREQ("Hello World!\n" + "RawBit\n" + "one two\n", + buffer); +} + +TEST(Printer, Indenting) { + char buffer[8192]; + + for (int block_size = 1; block_size < 512; block_size *= 2) { + ArrayOutputStream output(buffer, sizeof(buffer), block_size); + + { + Printer printer(&output, '$'); + map vars; + + vars["newline"] = "\n"; + + printer.Print("This is not indented.\n"); + printer.Indent(); + printer.Print("This is indented\nAnd so is this\n"); + printer.Outdent(); + printer.Print("But this is not."); + printer.Indent(); + printer.Print(" And this is still the same line.\n" + "But this is indented.\n"); + printer.PrintRaw("RawBit has indent at start\n"); + printer.PrintRaw("but not after a raw newline\n"); + printer.Print(vars, "Note that a newline in a variable will break " + "indenting, as we see$newline$here.\n"); + printer.Indent(); + printer.Print("And this"); + printer.Outdent(); + printer.Outdent(); + printer.Print(" is double-indented\nBack to normal."); + + EXPECT_FALSE(printer.failed()); + } + + buffer[output.ByteCount()] = '\0'; + + EXPECT_STREQ( + "This is not indented.\n" + " This is indented\n" + " And so is this\n" + "But this is not. And this is still the same line.\n" + " But this is indented.\n" + " RawBit has indent at start\n" + "but not after a raw newline\n" + "Note that a newline in a variable will break indenting, as we see\n" + "here.\n" + " And this is double-indented\n" + "Back to normal.", + buffer); + } +} + +// Death tests do not work on Windows as of yet. +#ifdef GTEST_HAS_DEATH_TEST +TEST(Printer, Death) { + char buffer[8192]; + + ArrayOutputStream output(buffer, sizeof(buffer)); + Printer printer(&output, '$'); + + EXPECT_DEBUG_DEATH(printer.Print("$nosuchvar$"), "Undefined variable"); + EXPECT_DEBUG_DEATH(printer.Print("$unclosed"), "Unclosed variable name"); + EXPECT_DEBUG_DEATH(printer.Outdent(), "without matching Indent"); +} +#endif // GTEST_HAS_DEATH_TEST + +TEST(Printer, WriteFailure) { + char buffer[16]; + + ArrayOutputStream output(buffer, sizeof(buffer)); + Printer printer(&output, '$'); + + // Print 16 bytes to fill the buffer exactly (should not fail). + printer.Print("0123456789abcdef"); + EXPECT_FALSE(printer.failed()); + + // Try to print one more byte (should fail). + printer.Print(" "); + EXPECT_TRUE(printer.failed()); + + // Should not crash + printer.Print("blah"); + EXPECT_TRUE(printer.failed()); + + // Buffer should contain the first 16 bytes written. + EXPECT_EQ("0123456789abcdef", string(buffer, sizeof(buffer))); +} + +} // namespace +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc new file mode 100644 index 000000000..513831d55 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc @@ -0,0 +1,694 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Here we have a hand-written lexer. At first you might ask yourself, +// "Hand-written text processing? Is Kenton crazy?!" Well, first of all, +// yes I am crazy, but that's beside the point. There are actually reasons +// why I ended up writing this this way. +// +// The traditional approach to lexing is to use lex to generate a lexer for +// you. Unfortunately, lex's output is ridiculously ugly and difficult to +// integrate cleanly with C++ code, especially abstract code or code meant +// as a library. Better parser-generators exist but would add dependencies +// which most users won't already have, which we'd like to avoid. (GNU flex +// has a C++ output option, but it's still ridiculously ugly, non-abstract, +// and not library-friendly.) +// +// The next approach that any good software engineer should look at is to +// use regular expressions. And, indeed, I did. I have code which +// implements this same class using regular expressions. It's about 200 +// lines shorter. However: +// - Rather than error messages telling you "This string has an invalid +// escape sequence at line 5, column 45", you get error messages like +// "Parse error on line 5". Giving more precise errors requires adding +// a lot of code that ends up basically as complex as the hand-coded +// version anyway. +// - The regular expression to match a string literal looks like this: +// kString = new RE("(\"([^\"\\\\]|" // non-escaped +// "\\\\[abfnrtv?\"'\\\\0-7]|" // normal escape +// "\\\\x[0-9a-fA-F])*\"|" // hex escape +// "\'([^\'\\\\]|" // Also support single-quotes. +// "\\\\[abfnrtv?\"'\\\\0-7]|" +// "\\\\x[0-9a-fA-F])*\')"); +// Verifying the correctness of this line noise is actually harder than +// verifying the correctness of ConsumeString(), defined below. I'm not +// even confident that the above is correct, after staring at it for some +// time. +// - PCRE is fast, but there's still more overhead involved than the code +// below. +// - Sadly, regular expressions are not part of the C standard library, so +// using them would require depending on some other library. For the +// open source release, this could be really annoying. Nobody likes +// downloading one piece of software just to find that they need to +// download something else to make it work, and in all likelihood +// people downloading Protocol Buffers will already be doing so just +// to make something else work. We could include a copy of PCRE with +// our code, but that obligates us to keep it up-to-date and just seems +// like a big waste just to save 200 lines of code. +// +// On a similar but unrelated note, I'm even scared to use ctype.h. +// Apparently functions like isalpha() are locale-dependent. So, if we used +// that, then if this code is being called from some program that doesn't +// have its locale set to "C", it would behave strangely. We can't just set +// the locale to "C" ourselves since we might break the calling program that +// way, particularly if it is multi-threaded. WTF? Someone please let me +// (Kenton) know if I'm missing something here... +// +// I'd love to hear about other alternatives, though, as this code isn't +// exactly pretty. + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { +namespace { + +// As mentioned above, I don't trust ctype.h due to the presence of "locales". +// So, I have written replacement functions here. Someone please smack me if +// this is a bad idea or if there is some way around this. +// +// These "character classes" are designed to be used in template methods. +// For instance, Tokenizer::ConsumeZeroOrMore() will eat +// whitespace. + +// Note: No class is allowed to contain '\0', since this is used to mark end- +// of-input and is handled specially. + +#define CHARACTER_CLASS(NAME, EXPRESSION) \ + class NAME { \ + public: \ + static inline bool InClass(char c) { \ + return EXPRESSION; \ + } \ + } + +CHARACTER_CLASS(Whitespace, c == ' ' || c == '\n' || c == '\t' || + c == '\r' || c == '\v' || c == '\f'); + +CHARACTER_CLASS(Unprintable, c < ' ' && c > '\0'); + +CHARACTER_CLASS(Digit, '0' <= c && c <= '9'); +CHARACTER_CLASS(OctalDigit, '0' <= c && c <= '7'); +CHARACTER_CLASS(HexDigit, ('0' <= c && c <= '9') || + ('a' <= c && c <= 'f') || + ('A' <= c && c <= 'F')); + +CHARACTER_CLASS(Letter, ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') || + (c == '_')); + +CHARACTER_CLASS(Alphanumeric, ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') || + ('0' <= c && c <= '9') || + (c == '_')); + +CHARACTER_CLASS(Escape, c == 'a' || c == 'b' || c == 'f' || c == 'n' || + c == 'r' || c == 't' || c == 'v' || c == '\\' || + c == '?' || c == '\'' || c == '\"'); + +#undef CHARACTER_CLASS + +// Given a char, interpret it as a numeric digit and return its value. +// This supports any number base up to 36. +inline int DigitValue(char digit) { + if ('0' <= digit && digit <= '9') return digit - '0'; + if ('a' <= digit && digit <= 'z') return digit - 'a' + 10; + if ('A' <= digit && digit <= 'Z') return digit - 'A' + 10; + return -1; +} + +// Inline because it's only used in one place. +inline char TranslateEscape(char c) { + switch (c) { + case 'a': return '\a'; + case 'b': return '\b'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + case 'v': return '\v'; + case '\\': return '\\'; + case '?': return '\?'; // Trigraphs = :( + case '\'': return '\''; + case '"': return '\"'; + + // We expect escape sequences to have been validated separately. + default: return '?'; + } +} + +} // anonymous namespace + +ErrorCollector::~ErrorCollector() {} + +// =================================================================== + +Tokenizer::Tokenizer(ZeroCopyInputStream* input, + ErrorCollector* error_collector) + : input_(input), + error_collector_(error_collector), + buffer_(NULL), + buffer_size_(0), + buffer_pos_(0), + read_error_(false), + line_(0), + column_(0), + token_start_(-1), + allow_f_after_float_(false), + comment_style_(CPP_COMMENT_STYLE) { + + current_.line = 0; + current_.column = 0; + current_.end_column = 0; + current_.type = TYPE_START; + + Refresh(); +} + +Tokenizer::~Tokenizer() { + // If we had any buffer left unread, return it to the underlying stream + // so that someone else can read it. + if (buffer_size_ > buffer_pos_) { + input_->BackUp(buffer_size_ - buffer_pos_); + } +} + +// ------------------------------------------------------------------- +// Internal helpers. + +void Tokenizer::NextChar() { + // Update our line and column counters based on the character being + // consumed. + if (current_char_ == '\n') { + ++line_; + column_ = 0; + } else if (current_char_ == '\t') { + column_ += kTabWidth - column_ % kTabWidth; + } else { + ++column_; + } + + // Advance to the next character. + ++buffer_pos_; + if (buffer_pos_ < buffer_size_) { + current_char_ = buffer_[buffer_pos_]; + } else { + Refresh(); + } +} + +void Tokenizer::Refresh() { + if (read_error_) { + current_char_ = '\0'; + return; + } + + // If we're in a token, append the rest of the buffer to it. + if (token_start_ >= 0 && token_start_ < buffer_size_) { + current_.text.append(buffer_ + token_start_, buffer_size_ - token_start_); + token_start_ = 0; + } + + const void* data = NULL; + buffer_ = NULL; + buffer_pos_ = 0; + do { + if (!input_->Next(&data, &buffer_size_)) { + // end of stream (or read error) + buffer_size_ = 0; + read_error_ = true; + current_char_ = '\0'; + return; + } + } while (buffer_size_ == 0); + + buffer_ = static_cast(data); + + current_char_ = buffer_[0]; +} + +inline void Tokenizer::StartToken() { + token_start_ = buffer_pos_; + current_.type = TYPE_START; // Just for the sake of initializing it. + current_.text.clear(); + current_.line = line_; + current_.column = column_; +} + +inline void Tokenizer::EndToken() { + // Note: The if() is necessary because some STL implementations crash when + // you call string::append(NULL, 0), presumably because they are trying to + // be helpful by detecting the NULL pointer, even though there's nothing + // wrong with reading zero bytes from NULL. + if (buffer_pos_ != token_start_) { + current_.text.append(buffer_ + token_start_, buffer_pos_ - token_start_); + } + token_start_ = -1; + current_.end_column = column_; +} + +// ------------------------------------------------------------------- +// Helper methods that consume characters. + +template +inline bool Tokenizer::LookingAt() { + return CharacterClass::InClass(current_char_); +} + +template +inline bool Tokenizer::TryConsumeOne() { + if (CharacterClass::InClass(current_char_)) { + NextChar(); + return true; + } else { + return false; + } +} + +inline bool Tokenizer::TryConsume(char c) { + if (current_char_ == c) { + NextChar(); + return true; + } else { + return false; + } +} + +template +inline void Tokenizer::ConsumeZeroOrMore() { + while (CharacterClass::InClass(current_char_)) { + NextChar(); + } +} + +template +inline void Tokenizer::ConsumeOneOrMore(const char* error) { + if (!CharacterClass::InClass(current_char_)) { + AddError(error); + } else { + do { + NextChar(); + } while (CharacterClass::InClass(current_char_)); + } +} + +// ------------------------------------------------------------------- +// Methods that read whole patterns matching certain kinds of tokens +// or comments. + +void Tokenizer::ConsumeString(char delimiter) { + while (true) { + switch (current_char_) { + case '\0': + case '\n': { + AddError("String literals cannot cross line boundaries."); + return; + } + + case '\\': { + // An escape sequence. + NextChar(); + if (TryConsumeOne()) { + // Valid escape sequence. + } else if (TryConsumeOne()) { + // Possibly followed by two more octal digits, but these will + // just be consumed by the main loop anyway so we don't need + // to do so explicitly here. + } else if (TryConsume('x') || TryConsume('X')) { + if (!TryConsumeOne()) { + AddError("Expected hex digits for escape sequence."); + } + // Possibly followed by another hex digit, but again we don't care. + } else { + AddError("Invalid escape sequence in string literal."); + } + break; + } + + default: { + if (current_char_ == delimiter) { + NextChar(); + return; + } + NextChar(); + break; + } + } + } +} + +Tokenizer::TokenType Tokenizer::ConsumeNumber(bool started_with_zero, + bool started_with_dot) { + bool is_float = false; + + if (started_with_zero && (TryConsume('x') || TryConsume('X'))) { + // A hex number (started with "0x"). + ConsumeOneOrMore("\"0x\" must be followed by hex digits."); + + } else if (started_with_zero && LookingAt()) { + // An octal number (had a leading zero). + ConsumeZeroOrMore(); + if (LookingAt()) { + AddError("Numbers starting with leading zero must be in octal."); + ConsumeZeroOrMore(); + } + + } else { + // A decimal number. + if (started_with_dot) { + is_float = true; + ConsumeZeroOrMore(); + } else { + ConsumeZeroOrMore(); + + if (TryConsume('.')) { + is_float = true; + ConsumeZeroOrMore(); + } + } + + if (TryConsume('e') || TryConsume('E')) { + is_float = true; + TryConsume('-') || TryConsume('+'); + ConsumeOneOrMore("\"e\" must be followed by exponent."); + } + + if (allow_f_after_float_ && (TryConsume('f') || TryConsume('F'))) { + is_float = true; + } + } + + if (LookingAt()) { + AddError("Need space between number and identifier."); + } else if (current_char_ == '.') { + if (is_float) { + AddError( + "Already saw decimal point or exponent; can't have another one."); + } else { + AddError("Hex and octal numbers must be integers."); + } + } + + return is_float ? TYPE_FLOAT : TYPE_INTEGER; +} + +void Tokenizer::ConsumeLineComment() { + while (current_char_ != '\0' && current_char_ != '\n') { + NextChar(); + } + TryConsume('\n'); +} + +void Tokenizer::ConsumeBlockComment() { + int start_line = line_; + int start_column = column_ - 2; + + while (true) { + while (current_char_ != '\0' && + current_char_ != '*' && + current_char_ != '/') { + NextChar(); + } + + if (TryConsume('*') && TryConsume('/')) { + // End of comment. + break; + } else if (TryConsume('/') && current_char_ == '*') { + // Note: We didn't consume the '*' because if there is a '/' after it + // we want to interpret that as the end of the comment. + AddError( + "\"/*\" inside block comment. Block comments cannot be nested."); + } else if (current_char_ == '\0') { + AddError("End-of-file inside block comment."); + error_collector_->AddError( + start_line, start_column, " Comment started here."); + break; + } + } +} + +// ------------------------------------------------------------------- + +bool Tokenizer::Next() { + previous_ = current_; + + // Did we skip any characters after the last token? + bool skipped_stuff = false; + + while (!read_error_) { + if (TryConsumeOne()) { + ConsumeZeroOrMore(); + + } else if (comment_style_ == CPP_COMMENT_STYLE && TryConsume('/')) { + // Starting a comment? + if (TryConsume('/')) { + ConsumeLineComment(); + } else if (TryConsume('*')) { + ConsumeBlockComment(); + } else { + // Oops, it was just a slash. Return it. + current_.type = TYPE_SYMBOL; + current_.text = "/"; + current_.line = line_; + current_.column = column_ - 1; + return true; + } + + } else if (comment_style_ == SH_COMMENT_STYLE && TryConsume('#')) { + ConsumeLineComment(); + + } else if (LookingAt() || current_char_ == '\0') { + AddError("Invalid control characters encountered in text."); + NextChar(); + // Skip more unprintable characters, too. But, remember that '\0' is + // also what current_char_ is set to after EOF / read error. We have + // to be careful not to go into an infinite loop of trying to consume + // it, so make sure to check read_error_ explicitly before consuming + // '\0'. + while (TryConsumeOne() || + (!read_error_ && TryConsume('\0'))) { + // Ignore. + } + + } else { + // Reading some sort of token. + StartToken(); + + if (TryConsumeOne()) { + ConsumeZeroOrMore(); + current_.type = TYPE_IDENTIFIER; + } else if (TryConsume('0')) { + current_.type = ConsumeNumber(true, false); + } else if (TryConsume('.')) { + // This could be the beginning of a floating-point number, or it could + // just be a '.' symbol. + + if (TryConsumeOne()) { + // It's a floating-point number. + if (previous_.type == TYPE_IDENTIFIER && !skipped_stuff) { + // We don't accept syntax like "blah.123". + error_collector_->AddError(line_, column_ - 2, + "Need space between identifier and decimal point."); + } + current_.type = ConsumeNumber(false, true); + } else { + current_.type = TYPE_SYMBOL; + } + } else if (TryConsumeOne()) { + current_.type = ConsumeNumber(false, false); + } else if (TryConsume('\"')) { + ConsumeString('\"'); + current_.type = TYPE_STRING; + } else if (TryConsume('\'')) { + ConsumeString('\''); + current_.type = TYPE_STRING; + } else { + NextChar(); + current_.type = TYPE_SYMBOL; + } + + EndToken(); + return true; + } + + skipped_stuff = true; + } + + // EOF + current_.type = TYPE_END; + current_.text.clear(); + current_.line = line_; + current_.column = column_; + current_.end_column = column_; + return false; +} + +// ------------------------------------------------------------------- +// Token-parsing helpers. Remember that these don't need to report +// errors since any errors should already have been reported while +// tokenizing. Also, these can assume that whatever text they +// are given is text that the tokenizer actually parsed as a token +// of the given type. + +bool Tokenizer::ParseInteger(const string& text, uint64 max_value, + uint64* output) { + // Sadly, we can't just use strtoul() since it is only 32-bit and strtoull() + // is non-standard. I hate the C standard library. :( + +// return strtoull(text.c_str(), NULL, 0); + + const char* ptr = text.c_str(); + int base = 10; + if (ptr[0] == '0') { + if (ptr[1] == 'x' || ptr[1] == 'X') { + // This is hex. + base = 16; + ptr += 2; + } else { + // This is octal. + base = 8; + } + } + + uint64 result = 0; + for (; *ptr != '\0'; ptr++) { + int digit = DigitValue(*ptr); + GOOGLE_LOG_IF(DFATAL, digit < 0 || digit >= base) + << " Tokenizer::ParseInteger() passed text that could not have been" + " tokenized as an integer: " << CEscape(text); + if (digit > max_value || result > (max_value - digit) / base) { + // Overflow. + return false; + } + result = result * base + digit; + } + + *output = result; + return true; +} + +double Tokenizer::ParseFloat(const string& text) { + const char* start = text.c_str(); + char* end; + double result = NoLocaleStrtod(start, &end); + + // "1e" is not a valid float, but if the tokenizer reads it, it will + // report an error but still return it as a valid token. We need to + // accept anything the tokenizer could possibly return, error or not. + if (*end == 'e' || *end == 'E') { + ++end; + if (*end == '-' || *end == '+') ++end; + } + + // If the Tokenizer had allow_f_after_float_ enabled, the float may be + // suffixed with the letter 'f'. + if (*end == 'f' || *end == 'F') { + ++end; + } + + GOOGLE_LOG_IF(DFATAL, end - start != text.size() || *start == '-') + << " Tokenizer::ParseFloat() passed text that could not have been" + " tokenized as a float: " << CEscape(text); + return result; +} + +void Tokenizer::ParseStringAppend(const string& text, string* output) { + // Reminder: text[0] is always the quote character. (If text is + // empty, it's invalid, so we'll just return.) + if (text.empty()) { + GOOGLE_LOG(DFATAL) + << " Tokenizer::ParseStringAppend() passed text that could not" + " have been tokenized as a string: " << CEscape(text); + return; + } + + output->reserve(output->size() + text.size()); + + // Loop through the string copying characters to "output" and + // interpreting escape sequences. Note that any invalid escape + // sequences or other errors were already reported while tokenizing. + // In this case we do not need to produce valid results. + for (const char* ptr = text.c_str() + 1; *ptr != '\0'; ptr++) { + if (*ptr == '\\' && ptr[1] != '\0') { + // An escape sequence. + ++ptr; + + if (OctalDigit::InClass(*ptr)) { + // An octal escape. May one, two, or three digits. + int code = DigitValue(*ptr); + if (OctalDigit::InClass(ptr[1])) { + ++ptr; + code = code * 8 + DigitValue(*ptr); + } + if (OctalDigit::InClass(ptr[1])) { + ++ptr; + code = code * 8 + DigitValue(*ptr); + } + output->push_back(static_cast(code)); + + } else if (*ptr == 'x') { + // A hex escape. May zero, one, or two digits. (The zero case + // will have been caught as an error earlier.) + int code = 0; + if (HexDigit::InClass(ptr[1])) { + ++ptr; + code = DigitValue(*ptr); + } + if (HexDigit::InClass(ptr[1])) { + ++ptr; + code = code * 16 + DigitValue(*ptr); + } + output->push_back(static_cast(code)); + + } else { + // Some other escape code. + output->push_back(TranslateEscape(*ptr)); + } + + } else if (*ptr == text[0]) { + // Ignore quote matching the starting quote. + } else { + output->push_back(*ptr); + } + } + + return; +} + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h new file mode 100644 index 000000000..8f759abbd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h @@ -0,0 +1,313 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Class for parsing tokenized text from a ZeroCopyInputStream. + +#ifndef GOOGLE_PROTOBUF_IO_TOKENIZER_H__ +#define GOOGLE_PROTOBUF_IO_TOKENIZER_H__ + +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +class ZeroCopyInputStream; // zero_copy_stream.h + +// Defined in this file. +class ErrorCollector; +class Tokenizer; + +// Abstract interface for an object which collects the errors that occur +// during parsing. A typical implementation might simply print the errors +// to stdout. +class LIBPROTOBUF_EXPORT ErrorCollector { + public: + inline ErrorCollector() {} + virtual ~ErrorCollector(); + + // Indicates that there was an error in the input at the given line and + // column numbers. The numbers are zero-based, so you may want to add + // 1 to each before printing them. + virtual void AddError(int line, int column, const string& message) = 0; + + // Indicates that there was a warning in the input at the given line and + // column numbers. The numbers are zero-based, so you may want to add + // 1 to each before printing them. + virtual void AddWarning(int line, int column, const string& message) { } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ErrorCollector); +}; + +// This class converts a stream of raw text into a stream of tokens for +// the protocol definition parser to parse. The tokens recognized are +// similar to those that make up the C language; see the TokenType enum for +// precise descriptions. Whitespace and comments are skipped. By default, +// C- and C++-style comments are recognized, but other styles can be used by +// calling set_comment_style(). +class LIBPROTOBUF_EXPORT Tokenizer { + public: + // Construct a Tokenizer that reads and tokenizes text from the given + // input stream and writes errors to the given error_collector. + // The caller keeps ownership of input and error_collector. + Tokenizer(ZeroCopyInputStream* input, ErrorCollector* error_collector); + ~Tokenizer(); + + enum TokenType { + TYPE_START, // Next() has not yet been called. + TYPE_END, // End of input reached. "text" is empty. + + TYPE_IDENTIFIER, // A sequence of letters, digits, and underscores, not + // starting with a digit. It is an error for a number + // to be followed by an identifier with no space in + // between. + TYPE_INTEGER, // A sequence of digits representing an integer. Normally + // the digits are decimal, but a prefix of "0x" indicates + // a hex number and a leading zero indicates octal, just + // like with C numeric literals. A leading negative sign + // is NOT included in the token; it's up to the parser to + // interpret the unary minus operator on its own. + TYPE_FLOAT, // A floating point literal, with a fractional part and/or + // an exponent. Always in decimal. Again, never + // negative. + TYPE_STRING, // A quoted sequence of escaped characters. Either single + // or double quotes can be used, but they must match. + // A string literal cannot cross a line break. + TYPE_SYMBOL, // Any other printable character, like '!' or '+'. + // Symbols are always a single character, so "!+$%" is + // four tokens. + }; + + // Structure representing a token read from the token stream. + struct Token { + TokenType type; + string text; // The exact text of the token as it appeared in + // the input. e.g. tokens of TYPE_STRING will still + // be escaped and in quotes. + + // "line" and "column" specify the position of the first character of + // the token within the input stream. They are zero-based. + int line; + int column; + int end_column; + }; + + // Get the current token. This is updated when Next() is called. Before + // the first call to Next(), current() has type TYPE_START and no contents. + const Token& current(); + + // Return the previous token -- i.e. what current() returned before the + // previous call to Next(). + const Token& previous(); + + // Advance to the next token. Returns false if the end of the input is + // reached. + bool Next(); + + // Parse helpers --------------------------------------------------- + + // Parses a TYPE_FLOAT token. This never fails, so long as the text actually + // comes from a TYPE_FLOAT token parsed by Tokenizer. If it doesn't, the + // result is undefined (possibly an assert failure). + static double ParseFloat(const string& text); + + // Parses a TYPE_STRING token. This never fails, so long as the text actually + // comes from a TYPE_STRING token parsed by Tokenizer. If it doesn't, the + // result is undefined (possibly an assert failure). + static void ParseString(const string& text, string* output); + + // Identical to ParseString, but appends to output. + static void ParseStringAppend(const string& text, string* output); + + // Parses a TYPE_INTEGER token. Returns false if the result would be + // greater than max_value. Otherwise, returns true and sets *output to the + // result. If the text is not from a Token of type TYPE_INTEGER originally + // parsed by a Tokenizer, the result is undefined (possibly an assert + // failure). + static bool ParseInteger(const string& text, uint64 max_value, + uint64* output); + + // Options --------------------------------------------------------- + + // Set true to allow floats to be suffixed with the letter 'f'. Tokens + // which would otherwise be integers but which have the 'f' suffix will be + // forced to be interpreted as floats. For all other purposes, the 'f' is + // ignored. + void set_allow_f_after_float(bool value) { allow_f_after_float_ = value; } + + // Valid values for set_comment_style(). + enum CommentStyle { + // Line comments begin with "//", block comments are delimited by "/*" and + // "*/". + CPP_COMMENT_STYLE, + // Line comments begin with "#". No way to write block comments. + SH_COMMENT_STYLE + }; + + // Sets the comment style. + void set_comment_style(CommentStyle style) { comment_style_ = style; } + + // ----------------------------------------------------------------- + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Tokenizer); + + Token current_; // Returned by current(). + Token previous_; // Returned by previous(). + + ZeroCopyInputStream* input_; + ErrorCollector* error_collector_; + + char current_char_; // == buffer_[buffer_pos_], updated by NextChar(). + const char* buffer_; // Current buffer returned from input_. + int buffer_size_; // Size of buffer_. + int buffer_pos_; // Current position within the buffer. + bool read_error_; // Did we previously encounter a read error? + + // Line and column number of current_char_ within the whole input stream. + int line_; + int column_; + + // Position in buffer_ where StartToken() was called. If the token + // started in the previous buffer, this is zero, and current_.text already + // contains the part of the token from the previous buffer. If not + // currently parsing a token, this is -1. + int token_start_; + + // Options. + bool allow_f_after_float_; + CommentStyle comment_style_; + + // Since we count columns we need to interpret tabs somehow. We'll take + // the standard 8-character definition for lack of any way to do better. + static const int kTabWidth = 8; + + // ----------------------------------------------------------------- + // Helper methods. + + // Consume this character and advance to the next one. + void NextChar(); + + // Read a new buffer from the input. + void Refresh(); + + // Called when the current character is the first character of a new + // token (not including whitespace or comments). + inline void StartToken(); + // Called when the current character is the first character after the + // end of the last token. After this returns, current_.text will + // contain all text consumed since StartToken() was called. + inline void EndToken(); + + // Convenience method to add an error at the current line and column. + void AddError(const string& message) { + error_collector_->AddError(line_, column_, message); + } + + // ----------------------------------------------------------------- + // The following four methods are used to consume tokens of specific + // types. They are actually used to consume all characters *after* + // the first, since the calling function consumes the first character + // in order to decide what kind of token is being read. + + // Read and consume a string, ending when the given delimiter is + // consumed. + void ConsumeString(char delimiter); + + // Read and consume a number, returning TYPE_FLOAT or TYPE_INTEGER + // depending on what was read. This needs to know if the first + // character was a zero in order to correctly recognize hex and octal + // numbers. + // It also needs to know if the first characted was a . to parse floating + // point correctly. + TokenType ConsumeNumber(bool started_with_zero, bool started_with_dot); + + // Consume the rest of a line. + void ConsumeLineComment(); + // Consume until "*/". + void ConsumeBlockComment(); + + // ----------------------------------------------------------------- + // These helper methods make the parsing code more readable. The + // "character classes" refered to are defined at the top of the .cc file. + // Basically it is a C++ class with one method: + // static bool InClass(char c); + // The method returns true if c is a member of this "class", like "Letter" + // or "Digit". + + // Returns true if the current character is of the given character + // class, but does not consume anything. + template + inline bool LookingAt(); + + // If the current character is in the given class, consume it and return + // true. Otherwise return false. + // e.g. TryConsumeOne() + template + inline bool TryConsumeOne(); + + // Like above, but try to consume the specific character indicated. + inline bool TryConsume(char c); + + // Consume zero or more of the given character class. + template + inline void ConsumeZeroOrMore(); + + // Consume one or more of the given character class or log the given + // error message. + // e.g. ConsumeOneOrMore("Expected digits."); + template + inline void ConsumeOneOrMore(const char* error); +}; + +// inline methods ==================================================== +inline const Tokenizer::Token& Tokenizer::current() { + return current_; +} + +inline const Tokenizer::Token& Tokenizer::previous() { + return previous_; +} + +inline void Tokenizer::ParseString(const string& text, string* output) { + output->clear(); + ParseStringAppend(text, output); +} + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_TOKENIZER_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc new file mode 100644 index 000000000..106d080ff --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc @@ -0,0 +1,766 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { +namespace { + +// =================================================================== +// Data-Driven Test Infrastructure + +// TODO(kenton): This is copied from coded_stream_unittest. This is +// temporary until these fetaures are integrated into gTest itself. + +// TEST_1D and TEST_2D are macros I'd eventually like to see added to +// gTest. These macros can be used to declare tests which should be +// run multiple times, once for each item in some input array. TEST_1D +// tests all cases in a single input array. TEST_2D tests all +// combinations of cases from two arrays. The arrays must be statically +// defined such that the GOOGLE_ARRAYSIZE() macro works on them. Example: +// +// int kCases[] = {1, 2, 3, 4} +// TEST_1D(MyFixture, MyTest, kCases) { +// EXPECT_GT(kCases_case, 0); +// } +// +// This test iterates through the numbers 1, 2, 3, and 4 and tests that +// they are all grater than zero. In case of failure, the exact case +// which failed will be printed. The case type must be printable using +// ostream::operator<<. + +#define TEST_1D(FIXTURE, NAME, CASES) \ + class FIXTURE##_##NAME##_DD : public FIXTURE { \ + protected: \ + template \ + void DoSingleCase(const CaseType& CASES##_case); \ + }; \ + \ + TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ + for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES); i++) { \ + SCOPED_TRACE(testing::Message() \ + << #CASES " case #" << i << ": " << CASES[i]); \ + DoSingleCase(CASES[i]); \ + } \ + } \ + \ + template \ + void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType& CASES##_case) + +#define TEST_2D(FIXTURE, NAME, CASES1, CASES2) \ + class FIXTURE##_##NAME##_DD : public FIXTURE { \ + protected: \ + template \ + void DoSingleCase(const CaseType1& CASES1##_case, \ + const CaseType2& CASES2##_case); \ + }; \ + \ + TEST_F(FIXTURE##_##NAME##_DD, NAME) { \ + for (int i = 0; i < GOOGLE_ARRAYSIZE(CASES1); i++) { \ + for (int j = 0; j < GOOGLE_ARRAYSIZE(CASES2); j++) { \ + SCOPED_TRACE(testing::Message() \ + << #CASES1 " case #" << i << ": " << CASES1[i] << ", " \ + << #CASES2 " case #" << j << ": " << CASES2[j]); \ + DoSingleCase(CASES1[i], CASES2[j]); \ + } \ + } \ + } \ + \ + template \ + void FIXTURE##_##NAME##_DD::DoSingleCase(const CaseType1& CASES1##_case, \ + const CaseType2& CASES2##_case) + +// ------------------------------------------------------------------- + +// An input stream that is basically like an ArrayInputStream but sometimes +// returns empty buffers, just to throw us off. +class TestInputStream : public ZeroCopyInputStream { + public: + TestInputStream(const void* data, int size, int block_size) + : array_stream_(data, size, block_size), counter_(0) {} + ~TestInputStream() {} + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size) { + // We'll return empty buffers starting with the first buffer, and every + // 3 and 5 buffers after that. + if (counter_ % 3 == 0 || counter_ % 5 == 0) { + *data = NULL; + *size = 0; + ++counter_; + return true; + } else { + ++counter_; + return array_stream_.Next(data, size); + } + } + + void BackUp(int count) { return array_stream_.BackUp(count); } + bool Skip(int count) { return array_stream_.Skip(count); } + int64 ByteCount() const { return array_stream_.ByteCount(); } + + private: + ArrayInputStream array_stream_; + int counter_; +}; + +// ------------------------------------------------------------------- + +// An error collector which simply concatenates all its errors into a big +// block of text which can be checked. +class TestErrorCollector : public ErrorCollector { + public: + TestErrorCollector() {} + ~TestErrorCollector() {} + + string text_; + + // implements ErrorCollector --------------------------------------- + void AddError(int line, int column, const string& message) { + strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", + line, column, message); + } +}; + +// ------------------------------------------------------------------- + +// We test each operation over a variety of block sizes to insure that +// we test cases where reads cross buffer boundaries as well as cases +// where they don't. This is sort of a brute-force approach to this, +// but it's easy to write and easy to understand. +const int kBlockSizes[] = {1, 2, 3, 5, 7, 13, 32, 1024}; + +class TokenizerTest : public testing::Test { + protected: + // For easy testing. + uint64 ParseInteger(const string& text) { + uint64 result; + EXPECT_TRUE(Tokenizer::ParseInteger(text, kuint64max, &result)); + return result; + } +}; + +// =================================================================== + +// These tests causes gcc 3.3.5 (and earlier?) to give the cryptic error: +// "sorry, unimplemented: `method_call_expr' not supported by dump_expr" +#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) + +// In each test case, the entire input text should parse as a single token +// of the given type. +struct SimpleTokenCase { + string input; + Tokenizer::TokenType type; +}; + +inline ostream& operator<<(ostream& out, + const SimpleTokenCase& test_case) { + return out << CEscape(test_case.input); +} + +SimpleTokenCase kSimpleTokenCases[] = { + // Test identifiers. + { "hello", Tokenizer::TYPE_IDENTIFIER }, + + // Test integers. + { "123", Tokenizer::TYPE_INTEGER }, + { "0xab6", Tokenizer::TYPE_INTEGER }, + { "0XAB6", Tokenizer::TYPE_INTEGER }, + { "0X1234567", Tokenizer::TYPE_INTEGER }, + { "0x89abcdef", Tokenizer::TYPE_INTEGER }, + { "0x89ABCDEF", Tokenizer::TYPE_INTEGER }, + { "01234567", Tokenizer::TYPE_INTEGER }, + + // Test floats. + { "123.45", Tokenizer::TYPE_FLOAT }, + { "1.", Tokenizer::TYPE_FLOAT }, + { "1e3", Tokenizer::TYPE_FLOAT }, + { "1E3", Tokenizer::TYPE_FLOAT }, + { "1e-3", Tokenizer::TYPE_FLOAT }, + { "1e+3", Tokenizer::TYPE_FLOAT }, + { "1.e3", Tokenizer::TYPE_FLOAT }, + { "1.2e3", Tokenizer::TYPE_FLOAT }, + { ".1", Tokenizer::TYPE_FLOAT }, + { ".1e3", Tokenizer::TYPE_FLOAT }, + { ".1e-3", Tokenizer::TYPE_FLOAT }, + { ".1e+3", Tokenizer::TYPE_FLOAT }, + + // Test strings. + { "'hello'", Tokenizer::TYPE_STRING }, + { "\"foo\"", Tokenizer::TYPE_STRING }, + { "'a\"b'", Tokenizer::TYPE_STRING }, + { "\"a'b\"", Tokenizer::TYPE_STRING }, + { "'a\\'b'", Tokenizer::TYPE_STRING }, + { "\"a\\\"b\"", Tokenizer::TYPE_STRING }, + { "'\\xf'", Tokenizer::TYPE_STRING }, + { "'\\0'", Tokenizer::TYPE_STRING }, + + // Test symbols. + { "+", Tokenizer::TYPE_SYMBOL }, + { ".", Tokenizer::TYPE_SYMBOL }, +}; + +TEST_2D(TokenizerTest, SimpleTokens, kSimpleTokenCases, kBlockSizes) { + // Set up the tokenizer. + TestInputStream input(kSimpleTokenCases_case.input.data(), + kSimpleTokenCases_case.input.size(), + kBlockSizes_case); + TestErrorCollector error_collector; + Tokenizer tokenizer(&input, &error_collector); + + // Before Next() is called, the initial token should always be TYPE_START. + EXPECT_EQ(Tokenizer::TYPE_START, tokenizer.current().type); + EXPECT_EQ("", tokenizer.current().text); + EXPECT_EQ(0, tokenizer.current().line); + EXPECT_EQ(0, tokenizer.current().column); + EXPECT_EQ(0, tokenizer.current().end_column); + + // Parse the token. + ASSERT_TRUE(tokenizer.Next()); + + // Check that it has the right type. + EXPECT_EQ(kSimpleTokenCases_case.type, tokenizer.current().type); + // Check that it contains the complete input text. + EXPECT_EQ(kSimpleTokenCases_case.input, tokenizer.current().text); + // Check that it is located at the beginning of the input + EXPECT_EQ(0, tokenizer.current().line); + EXPECT_EQ(0, tokenizer.current().column); + EXPECT_EQ(kSimpleTokenCases_case.input.size(), + tokenizer.current().end_column); + + // There should be no more input. + EXPECT_FALSE(tokenizer.Next()); + + // After Next() returns false, the token should have type TYPE_END. + EXPECT_EQ(Tokenizer::TYPE_END, tokenizer.current().type); + EXPECT_EQ("", tokenizer.current().text); + EXPECT_EQ(0, tokenizer.current().line); + EXPECT_EQ(kSimpleTokenCases_case.input.size(), tokenizer.current().column); + EXPECT_EQ(kSimpleTokenCases_case.input.size(), + tokenizer.current().end_column); + + // There should be no errors. + EXPECT_TRUE(error_collector.text_.empty()); +} + +TEST_1D(TokenizerTest, FloatSuffix, kBlockSizes) { + // Test the "allow_f_after_float" option. + + // Set up the tokenizer. + const char* text = "1f 2.5f 6e3f 7F"; + TestInputStream input(text, strlen(text), kBlockSizes_case); + TestErrorCollector error_collector; + Tokenizer tokenizer(&input, &error_collector); + tokenizer.set_allow_f_after_float(true); + + // Advance through tokens and check that they are parsed as expected. + ASSERT_TRUE(tokenizer.Next()); + EXPECT_EQ(tokenizer.current().text, "1f"); + EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); + ASSERT_TRUE(tokenizer.Next()); + EXPECT_EQ(tokenizer.current().text, "2.5f"); + EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); + ASSERT_TRUE(tokenizer.Next()); + EXPECT_EQ(tokenizer.current().text, "6e3f"); + EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); + ASSERT_TRUE(tokenizer.Next()); + EXPECT_EQ(tokenizer.current().text, "7F"); + EXPECT_EQ(tokenizer.current().type, Tokenizer::TYPE_FLOAT); + + // There should be no more input. + EXPECT_FALSE(tokenizer.Next()); + // There should be no errors. + EXPECT_TRUE(error_collector.text_.empty()); +} + +#endif + +// ------------------------------------------------------------------- + +// In each case, the input is parsed to produce a list of tokens. The +// last token in "output" must have type TYPE_END. +struct MultiTokenCase { + string input; + Tokenizer::Token output[10]; // The compiler wants a constant array + // size for initialization to work. There + // is no reason this can't be increased if + // needed. +}; + +inline ostream& operator<<(ostream& out, + const MultiTokenCase& test_case) { + return out << CEscape(test_case.input); +} + +MultiTokenCase kMultiTokenCases[] = { + // Test empty input. + { "", { + { Tokenizer::TYPE_END , "" , 0, 0 }, + }}, + + // Test all token types at the same time. + { "foo 1 1.2 + 'bar'", { + { Tokenizer::TYPE_IDENTIFIER, "foo" , 0, 0, 3 }, + { Tokenizer::TYPE_INTEGER , "1" , 0, 4, 5 }, + { Tokenizer::TYPE_FLOAT , "1.2" , 0, 6, 9 }, + { Tokenizer::TYPE_SYMBOL , "+" , 0, 10, 11 }, + { Tokenizer::TYPE_STRING , "'bar'", 0, 12, 17 }, + { Tokenizer::TYPE_END , "" , 0, 17, 17 }, + }}, + + // Test that consecutive symbols are parsed as separate tokens. + { "!@+%", { + { Tokenizer::TYPE_SYMBOL , "!" , 0, 0, 1 }, + { Tokenizer::TYPE_SYMBOL , "@" , 0, 1, 2 }, + { Tokenizer::TYPE_SYMBOL , "+" , 0, 2, 3 }, + { Tokenizer::TYPE_SYMBOL , "%" , 0, 3, 4 }, + { Tokenizer::TYPE_END , "" , 0, 4, 4 }, + }}, + + // Test that newlines affect line numbers correctly. + { "foo bar\nrab oof", { + { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, + { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 4, 7 }, + { Tokenizer::TYPE_IDENTIFIER, "rab", 1, 0, 3 }, + { Tokenizer::TYPE_IDENTIFIER, "oof", 1, 4, 7 }, + { Tokenizer::TYPE_END , "" , 1, 7, 7 }, + }}, + + // Test that tabs affect column numbers correctly. + { "foo\tbar \tbaz", { + { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, + { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 8, 11 }, + { Tokenizer::TYPE_IDENTIFIER, "baz", 0, 16, 19 }, + { Tokenizer::TYPE_END , "" , 0, 19, 19 }, + }}, + + // Test that tabs in string literals affect column numbers correctly. + { "\"foo\tbar\" baz", { + { Tokenizer::TYPE_STRING , "\"foo\tbar\"", 0, 0, 12 }, + { Tokenizer::TYPE_IDENTIFIER, "baz" , 0, 13, 16 }, + { Tokenizer::TYPE_END , "" , 0, 16, 16 }, + }}, + + // Test that line comments are ignored. + { "foo // This is a comment\n" + "bar // This is another comment", { + { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, + { Tokenizer::TYPE_IDENTIFIER, "bar", 1, 0, 3 }, + { Tokenizer::TYPE_END , "" , 1, 30, 30 }, + }}, + + // Test that block comments are ignored. + { "foo /* This is a block comment */ bar", { + { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, + { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 34, 37 }, + { Tokenizer::TYPE_END , "" , 0, 37, 37 }, + }}, + + // Test that sh-style comments are not ignored by default. + { "foo # bar\n" + "baz", { + { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, + { Tokenizer::TYPE_SYMBOL , "#" , 0, 4, 5 }, + { Tokenizer::TYPE_IDENTIFIER, "bar", 0, 6, 9 }, + { Tokenizer::TYPE_IDENTIFIER, "baz", 1, 0, 3 }, + { Tokenizer::TYPE_END , "" , 1, 3, 3 }, + }}, + + // Bytes with the high-order bit set should not be seen as control characters. + { "\300", { + { Tokenizer::TYPE_SYMBOL, "\300", 0, 0, 1 }, + { Tokenizer::TYPE_END , "" , 0, 1, 1 }, + }}, + + // Test all whitespace chars + { "foo\n\t\r\v\fbar", { + { Tokenizer::TYPE_IDENTIFIER, "foo", 0, 0, 3 }, + { Tokenizer::TYPE_IDENTIFIER, "bar", 1, 11, 14 }, + { Tokenizer::TYPE_END , "" , 1, 14, 14 }, + }}, +}; + +TEST_2D(TokenizerTest, MultipleTokens, kMultiTokenCases, kBlockSizes) { + // Set up the tokenizer. + TestInputStream input(kMultiTokenCases_case.input.data(), + kMultiTokenCases_case.input.size(), + kBlockSizes_case); + TestErrorCollector error_collector; + Tokenizer tokenizer(&input, &error_collector); + + // Before Next() is called, the initial token should always be TYPE_START. + EXPECT_EQ(Tokenizer::TYPE_START, tokenizer.current().type); + EXPECT_EQ("", tokenizer.current().text); + EXPECT_EQ(0, tokenizer.current().line); + EXPECT_EQ(0, tokenizer.current().column); + EXPECT_EQ(0, tokenizer.current().end_column); + + // Loop through all expected tokens. + int i = 0; + Tokenizer::Token token; + do { + token = kMultiTokenCases_case.output[i++]; + + SCOPED_TRACE(testing::Message() << "Token #" << i << ": " << token.text); + + Tokenizer::Token previous = tokenizer.current(); + + // Next() should only return false when it hits the end token. + if (token.type != Tokenizer::TYPE_END) { + ASSERT_TRUE(tokenizer.Next()); + } else { + ASSERT_FALSE(tokenizer.Next()); + } + + // Check that the previous token is set correctly. + EXPECT_EQ(previous.type, tokenizer.previous().type); + EXPECT_EQ(previous.text, tokenizer.previous().text); + EXPECT_EQ(previous.line, tokenizer.previous().line); + EXPECT_EQ(previous.column, tokenizer.previous().column); + EXPECT_EQ(previous.end_column, tokenizer.previous().end_column); + + // Check that the token matches the expected one. + EXPECT_EQ(token.type, tokenizer.current().type); + EXPECT_EQ(token.text, tokenizer.current().text); + EXPECT_EQ(token.line, tokenizer.current().line); + EXPECT_EQ(token.column, tokenizer.current().column); + EXPECT_EQ(token.end_column, tokenizer.current().end_column); + + } while (token.type != Tokenizer::TYPE_END); + + // There should be no errors. + EXPECT_TRUE(error_collector.text_.empty()); +} + +// This test causes gcc 3.3.5 (and earlier?) to give the cryptic error: +// "sorry, unimplemented: `method_call_expr' not supported by dump_expr" +#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3) + +TEST_1D(TokenizerTest, ShCommentStyle, kBlockSizes) { + // Test the "comment_style" option. + + const char* text = "foo # bar\n" + "baz // qux\n" + "corge /* grault */\n" + "garply"; + const char* const kTokens[] = {"foo", // "# bar" is ignored + "baz", "/", "/", "qux", + "corge", "/", "*", "grault", "*", "/", + "garply"}; + + // Set up the tokenizer. + TestInputStream input(text, strlen(text), kBlockSizes_case); + TestErrorCollector error_collector; + Tokenizer tokenizer(&input, &error_collector); + tokenizer.set_comment_style(Tokenizer::SH_COMMENT_STYLE); + + // Advance through tokens and check that they are parsed as expected. + for (int i = 0; i < GOOGLE_ARRAYSIZE(kTokens); i++) { + EXPECT_TRUE(tokenizer.Next()); + EXPECT_EQ(tokenizer.current().text, kTokens[i]); + } + + // There should be no more input. + EXPECT_FALSE(tokenizer.Next()); + // There should be no errors. + EXPECT_TRUE(error_collector.text_.empty()); +} + +#endif + +// ------------------------------------------------------------------- + +// Test parse helpers. It's not really worth setting up a full data-driven +// test here. +TEST_F(TokenizerTest, ParseInteger) { + EXPECT_EQ(0, ParseInteger("0")); + EXPECT_EQ(123, ParseInteger("123")); + EXPECT_EQ(0xabcdef12u, ParseInteger("0xabcdef12")); + EXPECT_EQ(0xabcdef12u, ParseInteger("0xABCDEF12")); + EXPECT_EQ(kuint64max, ParseInteger("0xFFFFFFFFFFFFFFFF")); + EXPECT_EQ(01234567, ParseInteger("01234567")); + EXPECT_EQ(0X123, ParseInteger("0X123")); + + // Test invalid integers that may still be tokenized as integers. + EXPECT_EQ(0, ParseInteger("0x")); + + uint64 i; +#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet + // Test invalid integers that will never be tokenized as integers. + EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger("zxy", kuint64max, &i), + "passed text that could not have been tokenized as an integer"); + EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger("1.2", kuint64max, &i), + "passed text that could not have been tokenized as an integer"); + EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger("08", kuint64max, &i), + "passed text that could not have been tokenized as an integer"); + EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger("0xg", kuint64max, &i), + "passed text that could not have been tokenized as an integer"); + EXPECT_DEBUG_DEATH(Tokenizer::ParseInteger("-1", kuint64max, &i), + "passed text that could not have been tokenized as an integer"); +#endif // GTEST_HAS_DEATH_TEST + + // Test overflows. + EXPECT_TRUE (Tokenizer::ParseInteger("0", 0, &i)); + EXPECT_FALSE(Tokenizer::ParseInteger("1", 0, &i)); + EXPECT_TRUE (Tokenizer::ParseInteger("1", 1, &i)); + EXPECT_TRUE (Tokenizer::ParseInteger("12345", 12345, &i)); + EXPECT_FALSE(Tokenizer::ParseInteger("12346", 12345, &i)); + EXPECT_TRUE (Tokenizer::ParseInteger("0xFFFFFFFFFFFFFFFF" , kuint64max, &i)); + EXPECT_FALSE(Tokenizer::ParseInteger("0x10000000000000000", kuint64max, &i)); +} + +TEST_F(TokenizerTest, ParseFloat) { + EXPECT_DOUBLE_EQ(1 , Tokenizer::ParseFloat("1.")); + EXPECT_DOUBLE_EQ(1e3 , Tokenizer::ParseFloat("1e3")); + EXPECT_DOUBLE_EQ(1e3 , Tokenizer::ParseFloat("1E3")); + EXPECT_DOUBLE_EQ(1.5e3, Tokenizer::ParseFloat("1.5e3")); + EXPECT_DOUBLE_EQ(.1 , Tokenizer::ParseFloat(".1")); + EXPECT_DOUBLE_EQ(.25 , Tokenizer::ParseFloat(".25")); + EXPECT_DOUBLE_EQ(.1e3 , Tokenizer::ParseFloat(".1e3")); + EXPECT_DOUBLE_EQ(.25e3, Tokenizer::ParseFloat(".25e3")); + EXPECT_DOUBLE_EQ(.1e+3, Tokenizer::ParseFloat(".1e+3")); + EXPECT_DOUBLE_EQ(.1e-3, Tokenizer::ParseFloat(".1e-3")); + EXPECT_DOUBLE_EQ(5 , Tokenizer::ParseFloat("5")); + EXPECT_DOUBLE_EQ(6e-12, Tokenizer::ParseFloat("6e-12")); + EXPECT_DOUBLE_EQ(1.2 , Tokenizer::ParseFloat("1.2")); + EXPECT_DOUBLE_EQ(1.e2 , Tokenizer::ParseFloat("1.e2")); + + // Test invalid integers that may still be tokenized as integers. + EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1e")); + EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1e-")); + EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1.e")); + + // Test 'f' suffix. + EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1f")); + EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1.0f")); + EXPECT_DOUBLE_EQ(1, Tokenizer::ParseFloat("1F")); + + // These should parse successfully even though they are out of range. + // Overflows become infinity and underflows become zero. + EXPECT_EQ( 0.0, Tokenizer::ParseFloat("1e-9999999999999999999999999999")); + EXPECT_EQ(HUGE_VAL, Tokenizer::ParseFloat("1e+9999999999999999999999999999")); + +#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet + // Test invalid integers that will never be tokenized as integers. + EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("zxy"), + "passed text that could not have been tokenized as a float"); + EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("1-e0"), + "passed text that could not have been tokenized as a float"); + EXPECT_DEBUG_DEATH(Tokenizer::ParseFloat("-1.0"), + "passed text that could not have been tokenized as a float"); +#endif // GTEST_HAS_DEATH_TEST +} + +TEST_F(TokenizerTest, ParseString) { + string output; + Tokenizer::ParseString("'hello'", &output); + EXPECT_EQ("hello", output); + Tokenizer::ParseString("\"blah\\nblah2\"", &output); + EXPECT_EQ("blah\nblah2", output); + Tokenizer::ParseString("'\\1x\\1\\123\\739\\52\\334n\\3'", &output); + EXPECT_EQ("\1x\1\123\739\52\334n\3", output); + Tokenizer::ParseString("'\\x20\\x4'", &output); + EXPECT_EQ("\x20\x4", output); + + // Test invalid strings that may still be tokenized as strings. + Tokenizer::ParseString("\"\\a\\l\\v\\t", &output); // \l is invalid + EXPECT_EQ("\a?\v\t", output); + Tokenizer::ParseString("'", &output); + EXPECT_EQ("", output); + Tokenizer::ParseString("'\\", &output); + EXPECT_EQ("\\", output); + + // Test invalid strings that will never be tokenized as strings. +#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet + EXPECT_DEBUG_DEATH(Tokenizer::ParseString("", &output), + "passed text that could not have been tokenized as a string"); +#endif // GTEST_HAS_DEATH_TEST +} + +TEST_F(TokenizerTest, ParseStringAppend) { + // Check that ParseString and ParseStringAppend differ. + string output("stuff+"); + Tokenizer::ParseStringAppend("'hello'", &output); + EXPECT_EQ("stuff+hello", output); + Tokenizer::ParseString("'hello'", &output); + EXPECT_EQ("hello", output); +} + +// ------------------------------------------------------------------- + +// Each case parses some input text, ignoring the tokens produced, and +// checks that the error output matches what is expected. +struct ErrorCase { + string input; + bool recoverable; // True if the tokenizer should be able to recover and + // parse more tokens after seeing this error. Cases + // for which this is true must end with "foo" as + // the last token, which the test will check for. + const char* errors; +}; + +inline ostream& operator<<(ostream& out, + const ErrorCase& test_case) { + return out << CEscape(test_case.input); +} + +ErrorCase kErrorCases[] = { + // String errors. + { "'\\l' foo", true, + "0:2: Invalid escape sequence in string literal.\n" }, + { "'\\x' foo", true, + "0:3: Expected hex digits for escape sequence.\n" }, + { "'foo", false, + "0:4: String literals cannot cross line boundaries.\n" }, + { "'bar\nfoo", true, + "0:4: String literals cannot cross line boundaries.\n" }, + + // Integer errors. + { "123foo", true, + "0:3: Need space between number and identifier.\n" }, + + // Hex/octal errors. + { "0x foo", true, + "0:2: \"0x\" must be followed by hex digits.\n" }, + { "0541823 foo", true, + "0:4: Numbers starting with leading zero must be in octal.\n" }, + { "0x123z foo", true, + "0:5: Need space between number and identifier.\n" }, + { "0x123.4 foo", true, + "0:5: Hex and octal numbers must be integers.\n" }, + { "0123.4 foo", true, + "0:4: Hex and octal numbers must be integers.\n" }, + + // Float errors. + { "1e foo", true, + "0:2: \"e\" must be followed by exponent.\n" }, + { "1e- foo", true, + "0:3: \"e\" must be followed by exponent.\n" }, + { "1.2.3 foo", true, + "0:3: Already saw decimal point or exponent; can't have another one.\n" }, + { "1e2.3 foo", true, + "0:3: Already saw decimal point or exponent; can't have another one.\n" }, + { "a.1 foo", true, + "0:1: Need space between identifier and decimal point.\n" }, + // allow_f_after_float not enabled, so this should be an error. + { "1.0f foo", true, + "0:3: Need space between number and identifier.\n" }, + + // Block comment errors. + { "/*", false, + "0:2: End-of-file inside block comment.\n" + "0:0: Comment started here.\n"}, + { "/*/*/ foo", true, + "0:3: \"/*\" inside block comment. Block comments cannot be nested.\n"}, + + // Control characters. Multiple consecutive control characters should only + // produce one error. + { "\b foo", true, + "0:0: Invalid control characters encountered in text.\n" }, + { "\b\b foo", true, + "0:0: Invalid control characters encountered in text.\n" }, + + // Check that control characters at end of input don't result in an + // infinite loop. + { "\b", false, + "0:0: Invalid control characters encountered in text.\n" }, + + // Check recovery from '\0'. We have to explicitly specify the length of + // these strings because otherwise the string constructor will just call + // strlen() which will see the first '\0' and think that is the end of the + // string. + { string("\0foo", 4), true, + "0:0: Invalid control characters encountered in text.\n" }, + { string("\0\0foo", 5), true, + "0:0: Invalid control characters encountered in text.\n" }, +}; + +TEST_2D(TokenizerTest, Errors, kErrorCases, kBlockSizes) { + // Set up the tokenizer. + TestInputStream input(kErrorCases_case.input.data(), + kErrorCases_case.input.size(), + kBlockSizes_case); + TestErrorCollector error_collector; + Tokenizer tokenizer(&input, &error_collector); + + // Ignore all input, except remember if the last token was "foo". + bool last_was_foo = false; + while (tokenizer.Next()) { + last_was_foo = tokenizer.current().text == "foo"; + } + + // Check that the errors match what was expected. + EXPECT_EQ(error_collector.text_, kErrorCases_case.errors); + + // If the error was recoverable, make sure we saw "foo" after it. + if (kErrorCases_case.recoverable) { + EXPECT_TRUE(last_was_foo); + } +} + +// ------------------------------------------------------------------- + +TEST_1D(TokenizerTest, BackUpOnDestruction, kBlockSizes) { + string text = "foo bar"; + TestInputStream input(text.data(), text.size(), kBlockSizes_case); + + // Create a tokenizer, read one token, then destroy it. + { + TestErrorCollector error_collector; + Tokenizer tokenizer(&input, &error_collector); + + tokenizer.Next(); + } + + // Only "foo" should have been read. + EXPECT_EQ(strlen("foo"), input.ByteCount()); +} + +} // namespace +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc new file mode 100644 index 000000000..dad6ff144 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc @@ -0,0 +1,48 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + + +namespace google { +namespace protobuf { +namespace io { + +ZeroCopyInputStream::~ZeroCopyInputStream() {} +ZeroCopyOutputStream::~ZeroCopyOutputStream() {} + + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h new file mode 100644 index 000000000..db5326f70 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h @@ -0,0 +1,238 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains the ZeroCopyInputStream and ZeroCopyOutputStream +// interfaces, which represent abstract I/O streams to and from which +// protocol buffers can be read and written. For a few simple +// implementations of these interfaces, see zero_copy_stream_impl.h. +// +// These interfaces are different from classic I/O streams in that they +// try to minimize the amount of data copying that needs to be done. +// To accomplish this, responsibility for allocating buffers is moved to +// the stream object, rather than being the responsibility of the caller. +// So, the stream can return a buffer which actually points directly into +// the final data structure where the bytes are to be stored, and the caller +// can interact directly with that buffer, eliminating an intermediate copy +// operation. +// +// As an example, consider the common case in which you are reading bytes +// from an array that is already in memory (or perhaps an mmap()ed file). +// With classic I/O streams, you would do something like: +// char buffer[BUFFER_SIZE]; +// input->Read(buffer, BUFFER_SIZE); +// DoSomething(buffer, BUFFER_SIZE); +// Then, the stream basically just calls memcpy() to copy the data from +// the array into your buffer. With a ZeroCopyInputStream, you would do +// this instead: +// const void* buffer; +// int size; +// input->Next(&buffer, &size); +// DoSomething(buffer, size); +// Here, no copy is performed. The input stream returns a pointer directly +// into the backing array, and the caller ends up reading directly from it. +// +// If you want to be able to read the old-fashion way, you can create +// a CodedInputStream or CodedOutputStream wrapping these objects and use +// their ReadRaw()/WriteRaw() methods. These will, of course, add a copy +// step, but Coded*Stream will handle buffering so at least it will be +// reasonably efficient. +// +// ZeroCopyInputStream example: +// // Read in a file and print its contents to stdout. +// int fd = open("myfile", O_RDONLY); +// ZeroCopyInputStream* input = new FileInputStream(fd); +// +// const void* buffer; +// int size; +// while (input->Next(&buffer, &size)) { +// cout.write(buffer, size); +// } +// +// delete input; +// close(fd); +// +// ZeroCopyOutputStream example: +// // Copy the contents of "infile" to "outfile", using plain read() for +// // "infile" but a ZeroCopyOutputStream for "outfile". +// int infd = open("infile", O_RDONLY); +// int outfd = open("outfile", O_WRONLY); +// ZeroCopyOutputStream* output = new FileOutputStream(outfd); +// +// void* buffer; +// int size; +// while (output->Next(&buffer, &size)) { +// int bytes = read(infd, buffer, size); +// if (bytes < size) { +// // Reached EOF. +// output->BackUp(size - bytes); +// break; +// } +// } +// +// delete output; +// close(infd); +// close(outfd); + +#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__ +#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__ + +#include +#include + +namespace google { + +namespace protobuf { +namespace io { + +// Defined in this file. +class ZeroCopyInputStream; +class ZeroCopyOutputStream; + +// Abstract interface similar to an input stream but designed to minimize +// copying. +class LIBPROTOBUF_EXPORT ZeroCopyInputStream { + public: + inline ZeroCopyInputStream() {} + virtual ~ZeroCopyInputStream(); + + // Obtains a chunk of data from the stream. + // + // Preconditions: + // * "size" and "data" are not NULL. + // + // Postconditions: + // * If the returned value is false, there is no more data to return or + // an error occurred. All errors are permanent. + // * Otherwise, "size" points to the actual number of bytes read and "data" + // points to a pointer to a buffer containing these bytes. + // * Ownership of this buffer remains with the stream, and the buffer + // remains valid only until some other method of the stream is called + // or the stream is destroyed. + // * It is legal for the returned buffer to have zero size, as long + // as repeatedly calling Next() eventually yields a buffer with non-zero + // size. + virtual bool Next(const void** data, int* size) = 0; + + // Backs up a number of bytes, so that the next call to Next() returns + // data again that was already returned by the last call to Next(). This + // is useful when writing procedures that are only supposed to read up + // to a certain point in the input, then return. If Next() returns a + // buffer that goes beyond what you wanted to read, you can use BackUp() + // to return to the point where you intended to finish. + // + // Preconditions: + // * The last method called must have been Next(). + // * count must be less than or equal to the size of the last buffer + // returned by Next(). + // + // Postconditions: + // * The last "count" bytes of the last buffer returned by Next() will be + // pushed back into the stream. Subsequent calls to Next() will return + // the same data again before producing new data. + virtual void BackUp(int count) = 0; + + // Skips a number of bytes. Returns false if the end of the stream is + // reached or some input error occurred. In the end-of-stream case, the + // stream is advanced to the end of the stream (so ByteCount() will return + // the total size of the stream). + virtual bool Skip(int count) = 0; + + // Returns the total number of bytes read since this object was created. + virtual int64 ByteCount() const = 0; + + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyInputStream); +}; + +// Abstract interface similar to an output stream but designed to minimize +// copying. +class LIBPROTOBUF_EXPORT ZeroCopyOutputStream { + public: + inline ZeroCopyOutputStream() {} + virtual ~ZeroCopyOutputStream(); + + // Obtains a buffer into which data can be written. Any data written + // into this buffer will eventually (maybe instantly, maybe later on) + // be written to the output. + // + // Preconditions: + // * "size" and "data" are not NULL. + // + // Postconditions: + // * If the returned value is false, an error occurred. All errors are + // permanent. + // * Otherwise, "size" points to the actual number of bytes in the buffer + // and "data" points to the buffer. + // * Ownership of this buffer remains with the stream, and the buffer + // remains valid only until some other method of the stream is called + // or the stream is destroyed. + // * Any data which the caller stores in this buffer will eventually be + // written to the output (unless BackUp() is called). + // * It is legal for the returned buffer to have zero size, as long + // as repeatedly calling Next() eventually yields a buffer with non-zero + // size. + virtual bool Next(void** data, int* size) = 0; + + // Backs up a number of bytes, so that the end of the last buffer returned + // by Next() is not actually written. This is needed when you finish + // writing all the data you want to write, but the last buffer was bigger + // than you needed. You don't want to write a bunch of garbage after the + // end of your data, so you use BackUp() to back up. + // + // Preconditions: + // * The last method called must have been Next(). + // * count must be less than or equal to the size of the last buffer + // returned by Next(). + // * The caller must not have written anything to the last "count" bytes + // of that buffer. + // + // Postconditions: + // * The last "count" bytes of the last buffer returned by Next() will be + // ignored. + virtual void BackUp(int count) = 0; + + // Returns the total number of bytes written since this object was created. + virtual int64 ByteCount() const = 0; + + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ZeroCopyOutputStream); +}; + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc new file mode 100644 index 000000000..1384c746a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc @@ -0,0 +1,470 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifdef _MSC_VER +#include +#else +#include +#include +#include +#include +#endif +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +#ifdef _WIN32 +// Win32 lseek is broken: If invoked on a non-seekable file descriptor, its +// return value is undefined. We re-define it to always produce an error. +#define lseek(fd, offset, origin) ((off_t)-1) +#endif + +namespace { + +// EINTR sucks. +int close_no_eintr(int fd) { + int result; + do { + result = close(fd); + } while (result < 0 && errno == EINTR); + return result; +} + +} // namespace + + +// =================================================================== + +FileInputStream::FileInputStream(int file_descriptor, int block_size) + : copying_input_(file_descriptor), + impl_(©ing_input_, block_size) { +} + +FileInputStream::~FileInputStream() {} + +bool FileInputStream::Close() { + return copying_input_.Close(); +} + +bool FileInputStream::Next(const void** data, int* size) { + return impl_.Next(data, size); +} + +void FileInputStream::BackUp(int count) { + impl_.BackUp(count); +} + +bool FileInputStream::Skip(int count) { + return impl_.Skip(count); +} + +int64 FileInputStream::ByteCount() const { + return impl_.ByteCount(); +} + +FileInputStream::CopyingFileInputStream::CopyingFileInputStream( + int file_descriptor) + : file_(file_descriptor), + close_on_delete_(false), + is_closed_(false), + errno_(0), + previous_seek_failed_(false) { +} + +FileInputStream::CopyingFileInputStream::~CopyingFileInputStream() { + if (close_on_delete_) { + if (!Close()) { + GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_); + } + } +} + +bool FileInputStream::CopyingFileInputStream::Close() { + GOOGLE_CHECK(!is_closed_); + + is_closed_ = true; + if (close_no_eintr(file_) != 0) { + // The docs on close() do not specify whether a file descriptor is still + // open after close() fails with EIO. However, the glibc source code + // seems to indicate that it is not. + errno_ = errno; + return false; + } + + return true; +} + +int FileInputStream::CopyingFileInputStream::Read(void* buffer, int size) { + GOOGLE_CHECK(!is_closed_); + + int result; + do { + result = read(file_, buffer, size); + } while (result < 0 && errno == EINTR); + + if (result < 0) { + // Read error (not EOF). + errno_ = errno; + } + + return result; +} + +int FileInputStream::CopyingFileInputStream::Skip(int count) { + GOOGLE_CHECK(!is_closed_); + + if (!previous_seek_failed_ && + lseek(file_, count, SEEK_CUR) != (off_t)-1) { + // Seek succeeded. + return count; + } else { + // Failed to seek. + + // Note to self: Don't seek again. This file descriptor doesn't + // support it. + previous_seek_failed_ = true; + + // Use the default implementation. + return CopyingInputStream::Skip(count); + } +} + +// =================================================================== + +FileOutputStream::FileOutputStream(int file_descriptor, int block_size) + : copying_output_(file_descriptor), + impl_(©ing_output_, block_size) { +} + +FileOutputStream::~FileOutputStream() { + impl_.Flush(); +} + +bool FileOutputStream::Close() { + bool flush_succeeded = impl_.Flush(); + return copying_output_.Close() && flush_succeeded; +} + +bool FileOutputStream::Flush() { + return impl_.Flush(); +} + +bool FileOutputStream::Next(void** data, int* size) { + return impl_.Next(data, size); +} + +void FileOutputStream::BackUp(int count) { + impl_.BackUp(count); +} + +int64 FileOutputStream::ByteCount() const { + return impl_.ByteCount(); +} + +FileOutputStream::CopyingFileOutputStream::CopyingFileOutputStream( + int file_descriptor) + : file_(file_descriptor), + close_on_delete_(false), + is_closed_(false), + errno_(0) { +} + +FileOutputStream::CopyingFileOutputStream::~CopyingFileOutputStream() { + if (close_on_delete_) { + if (!Close()) { + GOOGLE_LOG(ERROR) << "close() failed: " << strerror(errno_); + } + } +} + +bool FileOutputStream::CopyingFileOutputStream::Close() { + GOOGLE_CHECK(!is_closed_); + + is_closed_ = true; + if (close_no_eintr(file_) != 0) { + // The docs on close() do not specify whether a file descriptor is still + // open after close() fails with EIO. However, the glibc source code + // seems to indicate that it is not. + errno_ = errno; + return false; + } + + return true; +} + +bool FileOutputStream::CopyingFileOutputStream::Write( + const void* buffer, int size) { + GOOGLE_CHECK(!is_closed_); + int total_written = 0; + + const uint8* buffer_base = reinterpret_cast(buffer); + + while (total_written < size) { + int bytes; + do { + bytes = write(file_, buffer_base + total_written, size - total_written); + } while (bytes < 0 && errno == EINTR); + + if (bytes <= 0) { + // Write error. + + // FIXME(kenton): According to the man page, if write() returns zero, + // there was no error; write() simply did not write anything. It's + // unclear under what circumstances this might happen, but presumably + // errno won't be set in this case. I am confused as to how such an + // event should be handled. For now I'm treating it as an error, since + // retrying seems like it could lead to an infinite loop. I suspect + // this never actually happens anyway. + + if (bytes < 0) { + errno_ = errno; + } + return false; + } + total_written += bytes; + } + + return true; +} + +// =================================================================== + +IstreamInputStream::IstreamInputStream(istream* input, int block_size) + : copying_input_(input), + impl_(©ing_input_, block_size) { +} + +IstreamInputStream::~IstreamInputStream() {} + +bool IstreamInputStream::Next(const void** data, int* size) { + return impl_.Next(data, size); +} + +void IstreamInputStream::BackUp(int count) { + impl_.BackUp(count); +} + +bool IstreamInputStream::Skip(int count) { + return impl_.Skip(count); +} + +int64 IstreamInputStream::ByteCount() const { + return impl_.ByteCount(); +} + +IstreamInputStream::CopyingIstreamInputStream::CopyingIstreamInputStream( + istream* input) + : input_(input) { +} + +IstreamInputStream::CopyingIstreamInputStream::~CopyingIstreamInputStream() {} + +int IstreamInputStream::CopyingIstreamInputStream::Read( + void* buffer, int size) { + input_->read(reinterpret_cast(buffer), size); + int result = input_->gcount(); + if (result == 0 && input_->fail() && !input_->eof()) { + return -1; + } + return result; +} + +// =================================================================== + +OstreamOutputStream::OstreamOutputStream(ostream* output, int block_size) + : copying_output_(output), + impl_(©ing_output_, block_size) { +} + +OstreamOutputStream::~OstreamOutputStream() { + impl_.Flush(); +} + +bool OstreamOutputStream::Next(void** data, int* size) { + return impl_.Next(data, size); +} + +void OstreamOutputStream::BackUp(int count) { + impl_.BackUp(count); +} + +int64 OstreamOutputStream::ByteCount() const { + return impl_.ByteCount(); +} + +OstreamOutputStream::CopyingOstreamOutputStream::CopyingOstreamOutputStream( + ostream* output) + : output_(output) { +} + +OstreamOutputStream::CopyingOstreamOutputStream::~CopyingOstreamOutputStream() { +} + +bool OstreamOutputStream::CopyingOstreamOutputStream::Write( + const void* buffer, int size) { + output_->write(reinterpret_cast(buffer), size); + return output_->good(); +} + +// =================================================================== + +ConcatenatingInputStream::ConcatenatingInputStream( + ZeroCopyInputStream* const streams[], int count) + : streams_(streams), stream_count_(count), bytes_retired_(0) { +} + +ConcatenatingInputStream::~ConcatenatingInputStream() { +} + +bool ConcatenatingInputStream::Next(const void** data, int* size) { + while (stream_count_ > 0) { + if (streams_[0]->Next(data, size)) return true; + + // That stream is done. Advance to the next one. + bytes_retired_ += streams_[0]->ByteCount(); + ++streams_; + --stream_count_; + } + + // No more streams. + return false; +} + +void ConcatenatingInputStream::BackUp(int count) { + if (stream_count_ > 0) { + streams_[0]->BackUp(count); + } else { + GOOGLE_LOG(DFATAL) << "Can't BackUp() after failed Next()."; + } +} + +bool ConcatenatingInputStream::Skip(int count) { + while (stream_count_ > 0) { + // Assume that ByteCount() can be used to find out how much we actually + // skipped when Skip() fails. + int64 target_byte_count = streams_[0]->ByteCount() + count; + if (streams_[0]->Skip(count)) return true; + + // Hit the end of the stream. Figure out how many more bytes we still have + // to skip. + int64 final_byte_count = streams_[0]->ByteCount(); + GOOGLE_DCHECK_LT(final_byte_count, target_byte_count); + count = target_byte_count - final_byte_count; + + // That stream is done. Advance to the next one. + bytes_retired_ += final_byte_count; + ++streams_; + --stream_count_; + } + + return false; +} + +int64 ConcatenatingInputStream::ByteCount() const { + if (stream_count_ == 0) { + return bytes_retired_; + } else { + return bytes_retired_ + streams_[0]->ByteCount(); + } +} + + +// =================================================================== + +LimitingInputStream::LimitingInputStream(ZeroCopyInputStream* input, + int64 limit) + : input_(input), limit_(limit) {} + +LimitingInputStream::~LimitingInputStream() { + // If we overshot the limit, back up. + if (limit_ < 0) input_->BackUp(-limit_); +} + +bool LimitingInputStream::Next(const void** data, int* size) { + if (limit_ <= 0) return false; + if (!input_->Next(data, size)) return false; + + limit_ -= *size; + if (limit_ < 0) { + // We overshot the limit. Reduce *size to hide the rest of the buffer. + *size += limit_; + } + return true; +} + +void LimitingInputStream::BackUp(int count) { + if (limit_ < 0) { + input_->BackUp(count - limit_); + limit_ = count; + } else { + input_->BackUp(count); + limit_ += count; + } +} + +bool LimitingInputStream::Skip(int count) { + if (count > limit_) { + if (limit_ < 0) return false; + input_->Skip(limit_); + limit_ = 0; + return false; + } else { + if (!input_->Skip(count)) return false; + limit_ -= count; + return true; + } +} + +int64 LimitingInputStream::ByteCount() const { + if (limit_ < 0) { + return input_->ByteCount() + limit_; + } else { + return input_->ByteCount(); + } +} + + +// =================================================================== + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h new file mode 100644 index 000000000..9fedb0057 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h @@ -0,0 +1,357 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains common implementations of the interfaces defined in +// zero_copy_stream.h which are only included in the full (non-lite) +// protobuf library. These implementations include Unix file descriptors +// and C++ iostreams. See also: zero_copy_stream_impl_lite.h + +#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__ +#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__ + +#include +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace io { + + +// =================================================================== + +// A ZeroCopyInputStream which reads from a file descriptor. +// +// FileInputStream is preferred over using an ifstream with IstreamInputStream. +// The latter will introduce an extra layer of buffering, harming performance. +// Also, it's conceivable that FileInputStream could someday be enhanced +// to use zero-copy file descriptors on OSs which support them. +class LIBPROTOBUF_EXPORT FileInputStream : public ZeroCopyInputStream { + public: + // Creates a stream that reads from the given Unix file descriptor. + // If a block_size is given, it specifies the number of bytes that + // should be read and returned with each call to Next(). Otherwise, + // a reasonable default is used. + explicit FileInputStream(int file_descriptor, int block_size = -1); + ~FileInputStream(); + + // Flushes any buffers and closes the underlying file. Returns false if + // an error occurs during the process; use GetErrno() to examine the error. + // Even if an error occurs, the file descriptor is closed when this returns. + bool Close(); + + // By default, the file descriptor is not closed when the stream is + // destroyed. Call SetCloseOnDelete(true) to change that. WARNING: + // This leaves no way for the caller to detect if close() fails. If + // detecting close() errors is important to you, you should arrange + // to close the descriptor yourself. + void SetCloseOnDelete(bool value) { copying_input_.SetCloseOnDelete(value); } + + // If an I/O error has occurred on this file descriptor, this is the + // errno from that error. Otherwise, this is zero. Once an error + // occurs, the stream is broken and all subsequent operations will + // fail. + int GetErrno() { return copying_input_.GetErrno(); } + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + private: + class LIBPROTOBUF_EXPORT CopyingFileInputStream : public CopyingInputStream { + public: + CopyingFileInputStream(int file_descriptor); + ~CopyingFileInputStream(); + + bool Close(); + void SetCloseOnDelete(bool value) { close_on_delete_ = value; } + int GetErrno() { return errno_; } + + // implements CopyingInputStream --------------------------------- + int Read(void* buffer, int size); + int Skip(int count); + + private: + // The file descriptor. + const int file_; + bool close_on_delete_; + bool is_closed_; + + // The errno of the I/O error, if one has occurred. Otherwise, zero. + int errno_; + + // Did we try to seek once and fail? If so, we assume this file descriptor + // doesn't support seeking and won't try again. + bool previous_seek_failed_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileInputStream); + }; + + CopyingFileInputStream copying_input_; + CopyingInputStreamAdaptor impl_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileInputStream); +}; + +// =================================================================== + +// A ZeroCopyOutputStream which writes to a file descriptor. +// +// FileOutputStream is preferred over using an ofstream with +// OstreamOutputStream. The latter will introduce an extra layer of buffering, +// harming performance. Also, it's conceivable that FileOutputStream could +// someday be enhanced to use zero-copy file descriptors on OSs which +// support them. +class LIBPROTOBUF_EXPORT FileOutputStream : public ZeroCopyOutputStream { + public: + // Creates a stream that writes to the given Unix file descriptor. + // If a block_size is given, it specifies the size of the buffers + // that should be returned by Next(). Otherwise, a reasonable default + // is used. + explicit FileOutputStream(int file_descriptor, int block_size = -1); + ~FileOutputStream(); + + // Flushes any buffers and closes the underlying file. Returns false if + // an error occurs during the process; use GetErrno() to examine the error. + // Even if an error occurs, the file descriptor is closed when this returns. + bool Close(); + + // Flushes FileOutputStream's buffers but does not close the + // underlying file. No special measures are taken to ensure that + // underlying operating system file object is synchronized to disk. + bool Flush(); + + // By default, the file descriptor is not closed when the stream is + // destroyed. Call SetCloseOnDelete(true) to change that. WARNING: + // This leaves no way for the caller to detect if close() fails. If + // detecting close() errors is important to you, you should arrange + // to close the descriptor yourself. + void SetCloseOnDelete(bool value) { copying_output_.SetCloseOnDelete(value); } + + // If an I/O error has occurred on this file descriptor, this is the + // errno from that error. Otherwise, this is zero. Once an error + // occurs, the stream is broken and all subsequent operations will + // fail. + int GetErrno() { return copying_output_.GetErrno(); } + + // implements ZeroCopyOutputStream --------------------------------- + bool Next(void** data, int* size); + void BackUp(int count); + int64 ByteCount() const; + + private: + class LIBPROTOBUF_EXPORT CopyingFileOutputStream : public CopyingOutputStream { + public: + CopyingFileOutputStream(int file_descriptor); + ~CopyingFileOutputStream(); + + bool Close(); + void SetCloseOnDelete(bool value) { close_on_delete_ = value; } + int GetErrno() { return errno_; } + + // implements CopyingOutputStream -------------------------------- + bool Write(const void* buffer, int size); + + private: + // The file descriptor. + const int file_; + bool close_on_delete_; + bool is_closed_; + + // The errno of the I/O error, if one has occurred. Otherwise, zero. + int errno_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingFileOutputStream); + }; + + CopyingFileOutputStream copying_output_; + CopyingOutputStreamAdaptor impl_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileOutputStream); +}; + +// =================================================================== + +// A ZeroCopyInputStream which reads from a C++ istream. +// +// Note that for reading files (or anything represented by a file descriptor), +// FileInputStream is more efficient. +class LIBPROTOBUF_EXPORT IstreamInputStream : public ZeroCopyInputStream { + public: + // Creates a stream that reads from the given C++ istream. + // If a block_size is given, it specifies the number of bytes that + // should be read and returned with each call to Next(). Otherwise, + // a reasonable default is used. + explicit IstreamInputStream(istream* stream, int block_size = -1); + ~IstreamInputStream(); + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + private: + class LIBPROTOBUF_EXPORT CopyingIstreamInputStream : public CopyingInputStream { + public: + CopyingIstreamInputStream(istream* input); + ~CopyingIstreamInputStream(); + + // implements CopyingInputStream --------------------------------- + int Read(void* buffer, int size); + // (We use the default implementation of Skip().) + + private: + // The stream. + istream* input_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingIstreamInputStream); + }; + + CopyingIstreamInputStream copying_input_; + CopyingInputStreamAdaptor impl_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(IstreamInputStream); +}; + +// =================================================================== + +// A ZeroCopyOutputStream which writes to a C++ ostream. +// +// Note that for writing files (or anything represented by a file descriptor), +// FileOutputStream is more efficient. +class LIBPROTOBUF_EXPORT OstreamOutputStream : public ZeroCopyOutputStream { + public: + // Creates a stream that writes to the given C++ ostream. + // If a block_size is given, it specifies the size of the buffers + // that should be returned by Next(). Otherwise, a reasonable default + // is used. + explicit OstreamOutputStream(ostream* stream, int block_size = -1); + ~OstreamOutputStream(); + + // implements ZeroCopyOutputStream --------------------------------- + bool Next(void** data, int* size); + void BackUp(int count); + int64 ByteCount() const; + + private: + class LIBPROTOBUF_EXPORT CopyingOstreamOutputStream : public CopyingOutputStream { + public: + CopyingOstreamOutputStream(ostream* output); + ~CopyingOstreamOutputStream(); + + // implements CopyingOutputStream -------------------------------- + bool Write(const void* buffer, int size); + + private: + // The stream. + ostream* output_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOstreamOutputStream); + }; + + CopyingOstreamOutputStream copying_output_; + CopyingOutputStreamAdaptor impl_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(OstreamOutputStream); +}; + +// =================================================================== + +// A ZeroCopyInputStream which reads from several other streams in sequence. +// ConcatenatingInputStream is unable to distinguish between end-of-stream +// and read errors in the underlying streams, so it assumes any errors mean +// end-of-stream. So, if the underlying streams fail for any other reason, +// ConcatenatingInputStream may do odd things. It is suggested that you do +// not use ConcatenatingInputStream on streams that might produce read errors +// other than end-of-stream. +class LIBPROTOBUF_EXPORT ConcatenatingInputStream : public ZeroCopyInputStream { + public: + // All streams passed in as well as the array itself must remain valid + // until the ConcatenatingInputStream is destroyed. + ConcatenatingInputStream(ZeroCopyInputStream* const streams[], int count); + ~ConcatenatingInputStream(); + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + + private: + // As streams are retired, streams_ is incremented and count_ is + // decremented. + ZeroCopyInputStream* const* streams_; + int stream_count_; + int64 bytes_retired_; // Bytes read from previous streams. + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ConcatenatingInputStream); +}; + +// =================================================================== + +// A ZeroCopyInputStream which wraps some other stream and limits it to +// a particular byte count. +class LIBPROTOBUF_EXPORT LimitingInputStream : public ZeroCopyInputStream { + public: + LimitingInputStream(ZeroCopyInputStream* input, int64 limit); + ~LimitingInputStream(); + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + + private: + ZeroCopyInputStream* input_; + int64 limit_; // Decreases as we go, becomes negative if we overshoot. + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(LimitingInputStream); +}; + +// =================================================================== + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc new file mode 100644 index 000000000..e80125109 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc @@ -0,0 +1,393 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { + +namespace { + +// Default block size for Copying{In,Out}putStreamAdaptor. +static const int kDefaultBlockSize = 8192; + +} // namespace + +// =================================================================== + +ArrayInputStream::ArrayInputStream(const void* data, int size, + int block_size) + : data_(reinterpret_cast(data)), + size_(size), + block_size_(block_size > 0 ? block_size : size), + position_(0), + last_returned_size_(0) { +} + +ArrayInputStream::~ArrayInputStream() { +} + +bool ArrayInputStream::Next(const void** data, int* size) { + if (position_ < size_) { + last_returned_size_ = min(block_size_, size_ - position_); + *data = data_ + position_; + *size = last_returned_size_; + position_ += last_returned_size_; + return true; + } else { + // We're at the end of the array. + last_returned_size_ = 0; // Don't let caller back up. + return false; + } +} + +void ArrayInputStream::BackUp(int count) { + GOOGLE_CHECK_GT(last_returned_size_, 0) + << "BackUp() can only be called after a successful Next()."; + GOOGLE_CHECK_LE(count, last_returned_size_); + GOOGLE_CHECK_GE(count, 0); + position_ -= count; + last_returned_size_ = 0; // Don't let caller back up further. +} + +bool ArrayInputStream::Skip(int count) { + GOOGLE_CHECK_GE(count, 0); + last_returned_size_ = 0; // Don't let caller back up. + if (count > size_ - position_) { + position_ = size_; + return false; + } else { + position_ += count; + return true; + } +} + +int64 ArrayInputStream::ByteCount() const { + return position_; +} + + +// =================================================================== + +ArrayOutputStream::ArrayOutputStream(void* data, int size, int block_size) + : data_(reinterpret_cast(data)), + size_(size), + block_size_(block_size > 0 ? block_size : size), + position_(0), + last_returned_size_(0) { +} + +ArrayOutputStream::~ArrayOutputStream() { +} + +bool ArrayOutputStream::Next(void** data, int* size) { + if (position_ < size_) { + last_returned_size_ = min(block_size_, size_ - position_); + *data = data_ + position_; + *size = last_returned_size_; + position_ += last_returned_size_; + return true; + } else { + // We're at the end of the array. + last_returned_size_ = 0; // Don't let caller back up. + return false; + } +} + +void ArrayOutputStream::BackUp(int count) { + GOOGLE_CHECK_GT(last_returned_size_, 0) + << "BackUp() can only be called after a successful Next()."; + GOOGLE_CHECK_LE(count, last_returned_size_); + GOOGLE_CHECK_GE(count, 0); + position_ -= count; + last_returned_size_ = 0; // Don't let caller back up further. +} + +int64 ArrayOutputStream::ByteCount() const { + return position_; +} + +// =================================================================== + +StringOutputStream::StringOutputStream(string* target) + : target_(target) { +} + +StringOutputStream::~StringOutputStream() { +} + +bool StringOutputStream::Next(void** data, int* size) { + int old_size = target_->size(); + + // Grow the string. + if (old_size < target_->capacity()) { + // Resize the string to match its capacity, since we can get away + // without a memory allocation this way. + STLStringResizeUninitialized(target_, target_->capacity()); + } else { + // Size has reached capacity, so double the size. Also make sure + // that the new size is at least kMinimumSize. + STLStringResizeUninitialized( + target_, + max(old_size * 2, + kMinimumSize + 0)); // "+ 0" works around GCC4 weirdness. + } + + *data = string_as_array(target_) + old_size; + *size = target_->size() - old_size; + return true; +} + +void StringOutputStream::BackUp(int count) { + GOOGLE_CHECK_GE(count, 0); + GOOGLE_CHECK_LE(count, target_->size()); + target_->resize(target_->size() - count); +} + +int64 StringOutputStream::ByteCount() const { + return target_->size(); +} + +// =================================================================== + +CopyingInputStream::~CopyingInputStream() {} + +int CopyingInputStream::Skip(int count) { + char junk[4096]; + int skipped = 0; + while (skipped < count) { + int bytes = Read(junk, min(count - skipped, + implicit_cast(sizeof(junk)))); + if (bytes <= 0) { + // EOF or read error. + return skipped; + } + skipped += bytes; + } + return skipped; +} + +CopyingInputStreamAdaptor::CopyingInputStreamAdaptor( + CopyingInputStream* copying_stream, int block_size) + : copying_stream_(copying_stream), + owns_copying_stream_(false), + failed_(false), + position_(0), + buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize), + buffer_used_(0), + backup_bytes_(0) { +} + +CopyingInputStreamAdaptor::~CopyingInputStreamAdaptor() { + if (owns_copying_stream_) { + delete copying_stream_; + } +} + +bool CopyingInputStreamAdaptor::Next(const void** data, int* size) { + if (failed_) { + // Already failed on a previous read. + return false; + } + + AllocateBufferIfNeeded(); + + if (backup_bytes_ > 0) { + // We have data left over from a previous BackUp(), so just return that. + *data = buffer_.get() + buffer_used_ - backup_bytes_; + *size = backup_bytes_; + backup_bytes_ = 0; + return true; + } + + // Read new data into the buffer. + buffer_used_ = copying_stream_->Read(buffer_.get(), buffer_size_); + if (buffer_used_ <= 0) { + // EOF or read error. We don't need the buffer anymore. + if (buffer_used_ < 0) { + // Read error (not EOF). + failed_ = true; + } + FreeBuffer(); + return false; + } + position_ += buffer_used_; + + *size = buffer_used_; + *data = buffer_.get(); + return true; +} + +void CopyingInputStreamAdaptor::BackUp(int count) { + GOOGLE_CHECK(backup_bytes_ == 0 && buffer_.get() != NULL) + << " BackUp() can only be called after Next()."; + GOOGLE_CHECK_LE(count, buffer_used_) + << " Can't back up over more bytes than were returned by the last call" + " to Next()."; + GOOGLE_CHECK_GE(count, 0) + << " Parameter to BackUp() can't be negative."; + + backup_bytes_ = count; +} + +bool CopyingInputStreamAdaptor::Skip(int count) { + GOOGLE_CHECK_GE(count, 0); + + if (failed_) { + // Already failed on a previous read. + return false; + } + + // First skip any bytes left over from a previous BackUp(). + if (backup_bytes_ >= count) { + // We have more data left over than we're trying to skip. Just chop it. + backup_bytes_ -= count; + return true; + } + + count -= backup_bytes_; + backup_bytes_ = 0; + + int skipped = copying_stream_->Skip(count); + position_ += skipped; + return skipped == count; +} + +int64 CopyingInputStreamAdaptor::ByteCount() const { + return position_ - backup_bytes_; +} + +void CopyingInputStreamAdaptor::AllocateBufferIfNeeded() { + if (buffer_.get() == NULL) { + buffer_.reset(new uint8[buffer_size_]); + } +} + +void CopyingInputStreamAdaptor::FreeBuffer() { + GOOGLE_CHECK_EQ(backup_bytes_, 0); + buffer_used_ = 0; + buffer_.reset(); +} + +// =================================================================== + +CopyingOutputStream::~CopyingOutputStream() {} + +CopyingOutputStreamAdaptor::CopyingOutputStreamAdaptor( + CopyingOutputStream* copying_stream, int block_size) + : copying_stream_(copying_stream), + owns_copying_stream_(false), + failed_(false), + position_(0), + buffer_size_(block_size > 0 ? block_size : kDefaultBlockSize), + buffer_used_(0) { +} + +CopyingOutputStreamAdaptor::~CopyingOutputStreamAdaptor() { + WriteBuffer(); + if (owns_copying_stream_) { + delete copying_stream_; + } +} + +bool CopyingOutputStreamAdaptor::Flush() { + return WriteBuffer(); +} + +bool CopyingOutputStreamAdaptor::Next(void** data, int* size) { + if (buffer_used_ == buffer_size_) { + if (!WriteBuffer()) return false; + } + + AllocateBufferIfNeeded(); + + *data = buffer_.get() + buffer_used_; + *size = buffer_size_ - buffer_used_; + buffer_used_ = buffer_size_; + return true; +} + +void CopyingOutputStreamAdaptor::BackUp(int count) { + GOOGLE_CHECK_GE(count, 0); + GOOGLE_CHECK_EQ(buffer_used_, buffer_size_) + << " BackUp() can only be called after Next()."; + GOOGLE_CHECK_LE(count, buffer_used_) + << " Can't back up over more bytes than were returned by the last call" + " to Next()."; + + buffer_used_ -= count; +} + +int64 CopyingOutputStreamAdaptor::ByteCount() const { + return position_ + buffer_used_; +} + +bool CopyingOutputStreamAdaptor::WriteBuffer() { + if (failed_) { + // Already failed on a previous write. + return false; + } + + if (buffer_used_ == 0) return true; + + if (copying_stream_->Write(buffer_.get(), buffer_used_)) { + position_ += buffer_used_; + buffer_used_ = 0; + return true; + } else { + failed_ = true; + FreeBuffer(); + return false; + } +} + +void CopyingOutputStreamAdaptor::AllocateBufferIfNeeded() { + if (buffer_ == NULL) { + buffer_.reset(new uint8[buffer_size_]); + } +} + +void CopyingOutputStreamAdaptor::FreeBuffer() { + buffer_used_ = 0; + buffer_.reset(); +} + +// =================================================================== + +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h new file mode 100644 index 000000000..153f543ee --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h @@ -0,0 +1,340 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains common implementations of the interfaces defined in +// zero_copy_stream.h which are included in the "lite" protobuf library. +// These implementations cover I/O on raw arrays and strings, as well as +// adaptors which make it easy to implement streams based on traditional +// streams. Of course, many users will probably want to write their own +// implementations of these interfaces specific to the particular I/O +// abstractions they prefer to use, but these should cover the most common +// cases. + +#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__ +#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__ + +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace io { + +// =================================================================== + +// A ZeroCopyInputStream backed by an in-memory array of bytes. +class LIBPROTOBUF_EXPORT ArrayInputStream : public ZeroCopyInputStream { + public: + // Create an InputStream that returns the bytes pointed to by "data". + // "data" remains the property of the caller but must remain valid until + // the stream is destroyed. If a block_size is given, calls to Next() + // will return data blocks no larger than the given size. Otherwise, the + // first call to Next() returns the entire array. block_size is mainly + // useful for testing; in production you would probably never want to set + // it. + ArrayInputStream(const void* data, int size, int block_size = -1); + ~ArrayInputStream(); + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + + private: + const uint8* const data_; // The byte array. + const int size_; // Total size of the array. + const int block_size_; // How many bytes to return at a time. + + int position_; + int last_returned_size_; // How many bytes we returned last time Next() + // was called (used for error checking only). + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayInputStream); +}; + +// =================================================================== + +// A ZeroCopyOutputStream backed by an in-memory array of bytes. +class LIBPROTOBUF_EXPORT ArrayOutputStream : public ZeroCopyOutputStream { + public: + // Create an OutputStream that writes to the bytes pointed to by "data". + // "data" remains the property of the caller but must remain valid until + // the stream is destroyed. If a block_size is given, calls to Next() + // will return data blocks no larger than the given size. Otherwise, the + // first call to Next() returns the entire array. block_size is mainly + // useful for testing; in production you would probably never want to set + // it. + ArrayOutputStream(void* data, int size, int block_size = -1); + ~ArrayOutputStream(); + + // implements ZeroCopyOutputStream --------------------------------- + bool Next(void** data, int* size); + void BackUp(int count); + int64 ByteCount() const; + + private: + uint8* const data_; // The byte array. + const int size_; // Total size of the array. + const int block_size_; // How many bytes to return at a time. + + int position_; + int last_returned_size_; // How many bytes we returned last time Next() + // was called (used for error checking only). + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayOutputStream); +}; + +// =================================================================== + +// A ZeroCopyOutputStream which appends bytes to a string. +class LIBPROTOBUF_EXPORT StringOutputStream : public ZeroCopyOutputStream { + public: + // Create a StringOutputStream which appends bytes to the given string. + // The string remains property of the caller, but it MUST NOT be accessed + // in any way until the stream is destroyed. + // + // Hint: If you call target->reserve(n) before creating the stream, + // the first call to Next() will return at least n bytes of buffer + // space. + explicit StringOutputStream(string* target); + ~StringOutputStream(); + + // implements ZeroCopyOutputStream --------------------------------- + bool Next(void** data, int* size); + void BackUp(int count); + int64 ByteCount() const; + + private: + static const int kMinimumSize = 16; + + string* target_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOutputStream); +}; + +// Note: There is no StringInputStream. Instead, just create an +// ArrayInputStream as follows: +// ArrayInputStream input(str.data(), str.size()); + +// =================================================================== + +// A generic traditional input stream interface. +// +// Lots of traditional input streams (e.g. file descriptors, C stdio +// streams, and C++ iostreams) expose an interface where every read +// involves copying bytes into a buffer. If you want to take such an +// interface and make a ZeroCopyInputStream based on it, simply implement +// CopyingInputStream and then use CopyingInputStreamAdaptor. +// +// CopyingInputStream implementations should avoid buffering if possible. +// CopyingInputStreamAdaptor does its own buffering and will read data +// in large blocks. +class LIBPROTOBUF_EXPORT CopyingInputStream { + public: + virtual ~CopyingInputStream(); + + // Reads up to "size" bytes into the given buffer. Returns the number of + // bytes read. Read() waits until at least one byte is available, or + // returns zero if no bytes will ever become available (EOF), or -1 if a + // permanent read error occurred. + virtual int Read(void* buffer, int size) = 0; + + // Skips the next "count" bytes of input. Returns the number of bytes + // actually skipped. This will always be exactly equal to "count" unless + // EOF was reached or a permanent read error occurred. + // + // The default implementation just repeatedly calls Read() into a scratch + // buffer. + virtual int Skip(int count); +}; + +// A ZeroCopyInputStream which reads from a CopyingInputStream. This is +// useful for implementing ZeroCopyInputStreams that read from traditional +// streams. Note that this class is not really zero-copy. +// +// If you want to read from file descriptors or C++ istreams, this is +// already implemented for you: use FileInputStream or IstreamInputStream +// respectively. +class LIBPROTOBUF_EXPORT CopyingInputStreamAdaptor : public ZeroCopyInputStream { + public: + // Creates a stream that reads from the given CopyingInputStream. + // If a block_size is given, it specifies the number of bytes that + // should be read and returned with each call to Next(). Otherwise, + // a reasonable default is used. The caller retains ownership of + // copying_stream unless SetOwnsCopyingStream(true) is called. + explicit CopyingInputStreamAdaptor(CopyingInputStream* copying_stream, + int block_size = -1); + ~CopyingInputStreamAdaptor(); + + // Call SetOwnsCopyingStream(true) to tell the CopyingInputStreamAdaptor to + // delete the underlying CopyingInputStream when it is destroyed. + void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; } + + // implements ZeroCopyInputStream ---------------------------------- + bool Next(const void** data, int* size); + void BackUp(int count); + bool Skip(int count); + int64 ByteCount() const; + + private: + // Insures that buffer_ is not NULL. + void AllocateBufferIfNeeded(); + // Frees the buffer and resets buffer_used_. + void FreeBuffer(); + + // The underlying copying stream. + CopyingInputStream* copying_stream_; + bool owns_copying_stream_; + + // True if we have seen a permenant error from the underlying stream. + bool failed_; + + // The current position of copying_stream_, relative to the point where + // we started reading. + int64 position_; + + // Data is read into this buffer. It may be NULL if no buffer is currently + // in use. Otherwise, it points to an array of size buffer_size_. + scoped_array buffer_; + const int buffer_size_; + + // Number of valid bytes currently in the buffer (i.e. the size last + // returned by Next()). 0 <= buffer_used_ <= buffer_size_. + int buffer_used_; + + // Number of bytes in the buffer which were backed up over by a call to + // BackUp(). These need to be returned again. + // 0 <= backup_bytes_ <= buffer_used_ + int backup_bytes_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingInputStreamAdaptor); +}; + +// =================================================================== + +// A generic traditional output stream interface. +// +// Lots of traditional output streams (e.g. file descriptors, C stdio +// streams, and C++ iostreams) expose an interface where every write +// involves copying bytes from a buffer. If you want to take such an +// interface and make a ZeroCopyOutputStream based on it, simply implement +// CopyingOutputStream and then use CopyingOutputStreamAdaptor. +// +// CopyingOutputStream implementations should avoid buffering if possible. +// CopyingOutputStreamAdaptor does its own buffering and will write data +// in large blocks. +class LIBPROTOBUF_EXPORT CopyingOutputStream { + public: + virtual ~CopyingOutputStream(); + + // Writes "size" bytes from the given buffer to the output. Returns true + // if successful, false on a write error. + virtual bool Write(const void* buffer, int size) = 0; +}; + +// A ZeroCopyOutputStream which writes to a CopyingOutputStream. This is +// useful for implementing ZeroCopyOutputStreams that write to traditional +// streams. Note that this class is not really zero-copy. +// +// If you want to write to file descriptors or C++ ostreams, this is +// already implemented for you: use FileOutputStream or OstreamOutputStream +// respectively. +class LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStream { + public: + // Creates a stream that writes to the given Unix file descriptor. + // If a block_size is given, it specifies the size of the buffers + // that should be returned by Next(). Otherwise, a reasonable default + // is used. + explicit CopyingOutputStreamAdaptor(CopyingOutputStream* copying_stream, + int block_size = -1); + ~CopyingOutputStreamAdaptor(); + + // Writes all pending data to the underlying stream. Returns false if a + // write error occurred on the underlying stream. (The underlying + // stream itself is not necessarily flushed.) + bool Flush(); + + // Call SetOwnsCopyingStream(true) to tell the CopyingOutputStreamAdaptor to + // delete the underlying CopyingOutputStream when it is destroyed. + void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; } + + // implements ZeroCopyOutputStream --------------------------------- + bool Next(void** data, int* size); + void BackUp(int count); + int64 ByteCount() const; + + private: + // Write the current buffer, if it is present. + bool WriteBuffer(); + // Insures that buffer_ is not NULL. + void AllocateBufferIfNeeded(); + // Frees the buffer. + void FreeBuffer(); + + // The underlying copying stream. + CopyingOutputStream* copying_stream_; + bool owns_copying_stream_; + + // True if we have seen a permenant error from the underlying stream. + bool failed_; + + // The current position of copying_stream_, relative to the point where + // we started writing. + int64 position_; + + // Data is written from this buffer. It may be NULL if no buffer is + // currently in use. Otherwise, it points to an array of size buffer_size_. + scoped_array buffer_; + const int buffer_size_; + + // Number of valid bytes currently in the buffer (i.e. the size last + // returned by Next()). When BackUp() is called, we just reduce this. + // 0 <= buffer_used_ <= buffer_size_. + int buffer_used_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOutputStreamAdaptor); +}; + +// =================================================================== + +} // namespace io +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc new file mode 100644 index 000000000..5196d905b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc @@ -0,0 +1,850 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Testing strategy: For each type of I/O (array, string, file, etc.) we +// create an output stream and write some data to it, then create a +// corresponding input stream to read the same data back and expect it to +// match. When the data is written, it is written in several small chunks +// of varying sizes, with a BackUp() after each chunk. It is read back +// similarly, but with chunks separated at different points. The whole +// process is run with a variety of block sizes for both the input and +// the output. +// +// TODO(kenton): Rewrite this test to bring it up to the standards of all +// the other proto2 tests. May want to wait for gTest to implement +// "parametized tests" so that one set of tests can be used on all the +// implementations. + +#include "config.h" + +#ifdef _MSC_VER +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include + +#include +#include + +#if HAVE_ZLIB +#include +#endif + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace io { +namespace { + +#ifdef _WIN32 +#define pipe(fds) _pipe(fds, 4096, O_BINARY) +#endif + +#ifndef O_BINARY +#ifdef _O_BINARY +#define O_BINARY _O_BINARY +#else +#define O_BINARY 0 // If this isn't defined, the platform doesn't need it. +#endif +#endif + +class IoTest : public testing::Test { + protected: + // Test helpers. + + // Helper to write an array of data to an output stream. + bool WriteToOutput(ZeroCopyOutputStream* output, const void* data, int size); + // Helper to read a fixed-length array of data from an input stream. + int ReadFromInput(ZeroCopyInputStream* input, void* data, int size); + // Write a string to the output stream. + void WriteString(ZeroCopyOutputStream* output, const string& str); + // Read a number of bytes equal to the size of the given string and checks + // that it matches the string. + void ReadString(ZeroCopyInputStream* input, const string& str); + // Writes some text to the output stream in a particular order. Returns + // the number of bytes written, incase the caller needs that to set up an + // input stream. + int WriteStuff(ZeroCopyOutputStream* output); + // Reads text from an input stream and expects it to match what + // WriteStuff() writes. + void ReadStuff(ZeroCopyInputStream* input); + + // Similar to WriteStuff, but performs more sophisticated testing. + int WriteStuffLarge(ZeroCopyOutputStream* output); + // Reads and tests a stream that should have been written to + // via WriteStuffLarge(). + void ReadStuffLarge(ZeroCopyInputStream* input); + +#if HAVE_ZLIB + string Compress(const string& data, const GzipOutputStream::Options& options); + string Uncompress(const string& data); +#endif + + static const int kBlockSizes[]; + static const int kBlockSizeCount; +}; + +const int IoTest::kBlockSizes[] = {-1, 1, 2, 5, 7, 10, 23, 64}; +const int IoTest::kBlockSizeCount = GOOGLE_ARRAYSIZE(IoTest::kBlockSizes); + +bool IoTest::WriteToOutput(ZeroCopyOutputStream* output, + const void* data, int size) { + const uint8* in = reinterpret_cast(data); + int in_size = size; + + void* out; + int out_size; + + while (true) { + if (!output->Next(&out, &out_size)) { + return false; + } + EXPECT_GT(out_size, 0); + + if (in_size <= out_size) { + memcpy(out, in, in_size); + output->BackUp(out_size - in_size); + return true; + } + + memcpy(out, in, out_size); + in += out_size; + in_size -= out_size; + } +} + +#define MAX_REPEATED_ZEROS 100 + +int IoTest::ReadFromInput(ZeroCopyInputStream* input, void* data, int size) { + uint8* out = reinterpret_cast(data); + int out_size = size; + + const void* in; + int in_size = 0; + + int repeated_zeros = 0; + + while (true) { + if (!input->Next(&in, &in_size)) { + return size - out_size; + } + EXPECT_GT(in_size, -1); + if (in_size == 0) { + repeated_zeros++; + } else { + repeated_zeros = 0; + } + EXPECT_LT(repeated_zeros, MAX_REPEATED_ZEROS); + + if (out_size <= in_size) { + memcpy(out, in, out_size); + if (in_size > out_size) { + input->BackUp(in_size - out_size); + } + return size; // Copied all of it. + } + + memcpy(out, in, in_size); + out += in_size; + out_size -= in_size; + } +} + +void IoTest::WriteString(ZeroCopyOutputStream* output, const string& str) { + EXPECT_TRUE(WriteToOutput(output, str.c_str(), str.size())); +} + +void IoTest::ReadString(ZeroCopyInputStream* input, const string& str) { + scoped_array buffer(new char[str.size() + 1]); + buffer[str.size()] = '\0'; + EXPECT_EQ(ReadFromInput(input, buffer.get(), str.size()), str.size()); + EXPECT_STREQ(str.c_str(), buffer.get()); +} + +int IoTest::WriteStuff(ZeroCopyOutputStream* output) { + WriteString(output, "Hello world!\n"); + WriteString(output, "Some te"); + WriteString(output, "xt. Blah blah."); + WriteString(output, "abcdefg"); + WriteString(output, "01234567890123456789"); + WriteString(output, "foobar"); + + EXPECT_EQ(output->ByteCount(), 68); + + int result = output->ByteCount(); + return result; +} + +// Reads text from an input stream and expects it to match what WriteStuff() +// writes. +void IoTest::ReadStuff(ZeroCopyInputStream* input) { + ReadString(input, "Hello world!\n"); + ReadString(input, "Some text. "); + ReadString(input, "Blah "); + ReadString(input, "blah."); + ReadString(input, "abcdefg"); + EXPECT_TRUE(input->Skip(20)); + ReadString(input, "foo"); + ReadString(input, "bar"); + + EXPECT_EQ(input->ByteCount(), 68); + + uint8 byte; + EXPECT_EQ(ReadFromInput(input, &byte, 1), 0); +} + +int IoTest::WriteStuffLarge(ZeroCopyOutputStream* output) { + WriteString(output, "Hello world!\n"); + WriteString(output, "Some te"); + WriteString(output, "xt. Blah blah."); + WriteString(output, string(100000, 'x')); // A very long string + WriteString(output, string(100000, 'y')); // A very long string + WriteString(output, "01234567890123456789"); + + EXPECT_EQ(output->ByteCount(), 200055); + + int result = output->ByteCount(); + return result; +} + +// Reads text from an input stream and expects it to match what WriteStuff() +// writes. +void IoTest::ReadStuffLarge(ZeroCopyInputStream* input) { + ReadString(input, "Hello world!\nSome text. "); + EXPECT_TRUE(input->Skip(5)); + ReadString(input, "blah."); + EXPECT_TRUE(input->Skip(100000 - 10)); + ReadString(input, string(10, 'x') + string(100000 - 20000, 'y')); + EXPECT_TRUE(input->Skip(20000 - 10)); + ReadString(input, "yyyyyyyyyy01234567890123456789"); + + EXPECT_EQ(input->ByteCount(), 200055); + + uint8 byte; + EXPECT_EQ(ReadFromInput(input, &byte, 1), 0); +} + +// =================================================================== + +TEST_F(IoTest, ArrayIo) { + const int kBufferSize = 256; + uint8 buffer[kBufferSize]; + + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + int size; + { + ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]); + size = WriteStuff(&output); + } + { + ArrayInputStream input(buffer, size, kBlockSizes[j]); + ReadStuff(&input); + } + } + } +} + +TEST_F(IoTest, TwoSessionWrite) { + // Test that two concatenated write sessions read correctly + + static const char* strA = "0123456789"; + static const char* strB = "WhirledPeas"; + const int kBufferSize = 2*1024; + uint8* buffer = new uint8[kBufferSize]; + char* temp_buffer = new char[40]; + + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + ArrayOutputStream* output = + new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]); + CodedOutputStream* coded_output = new CodedOutputStream(output); + coded_output->WriteVarint32(strlen(strA)); + coded_output->WriteRaw(strA, strlen(strA)); + delete coded_output; // flush + int64 pos = output->ByteCount(); + delete output; + output = new ArrayOutputStream( + buffer + pos, kBufferSize - pos, kBlockSizes[i]); + coded_output = new CodedOutputStream(output); + coded_output->WriteVarint32(strlen(strB)); + coded_output->WriteRaw(strB, strlen(strB)); + delete coded_output; // flush + int64 size = pos + output->ByteCount(); + delete output; + + ArrayInputStream* input = + new ArrayInputStream(buffer, size, kBlockSizes[j]); + CodedInputStream* coded_input = new CodedInputStream(input); + uint32 insize; + EXPECT_TRUE(coded_input->ReadVarint32(&insize)); + EXPECT_EQ(strlen(strA), insize); + EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); + EXPECT_EQ(0, memcmp(temp_buffer, strA, insize)); + + EXPECT_TRUE(coded_input->ReadVarint32(&insize)); + EXPECT_EQ(strlen(strB), insize); + EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); + EXPECT_EQ(0, memcmp(temp_buffer, strB, insize)); + + delete coded_input; + delete input; + } + } + + delete [] temp_buffer; + delete [] buffer; +} + +#if HAVE_ZLIB +TEST_F(IoTest, GzipIo) { + const int kBufferSize = 2*1024; + uint8* buffer = new uint8[kBufferSize]; + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + for (int z = 0; z < kBlockSizeCount; z++) { + int gzip_buffer_size = kBlockSizes[z]; + int size; + { + ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]); + GzipOutputStream::Options options; + options.format = GzipOutputStream::GZIP; + if (gzip_buffer_size != -1) { + options.buffer_size = gzip_buffer_size; + } + GzipOutputStream gzout(&output, options); + WriteStuff(&gzout); + gzout.Close(); + size = output.ByteCount(); + } + { + ArrayInputStream input(buffer, size, kBlockSizes[j]); + GzipInputStream gzin( + &input, GzipInputStream::GZIP, gzip_buffer_size); + ReadStuff(&gzin); + } + } + } + } + delete [] buffer; +} + +TEST_F(IoTest, ZlibIo) { + const int kBufferSize = 2*1024; + uint8* buffer = new uint8[kBufferSize]; + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + for (int z = 0; z < kBlockSizeCount; z++) { + int gzip_buffer_size = kBlockSizes[z]; + int size; + { + ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]); + GzipOutputStream::Options options; + options.format = GzipOutputStream::ZLIB; + if (gzip_buffer_size != -1) { + options.buffer_size = gzip_buffer_size; + } + GzipOutputStream gzout(&output, options); + WriteStuff(&gzout); + gzout.Close(); + size = output.ByteCount(); + } + { + ArrayInputStream input(buffer, size, kBlockSizes[j]); + GzipInputStream gzin( + &input, GzipInputStream::ZLIB, gzip_buffer_size); + ReadStuff(&gzin); + } + } + } + } + delete [] buffer; +} + +TEST_F(IoTest, ZlibIoInputAutodetect) { + const int kBufferSize = 2*1024; + uint8* buffer = new uint8[kBufferSize]; + int size; + { + ArrayOutputStream output(buffer, kBufferSize); + GzipOutputStream::Options options; + options.format = GzipOutputStream::ZLIB; + GzipOutputStream gzout(&output, options); + WriteStuff(&gzout); + gzout.Close(); + size = output.ByteCount(); + } + { + ArrayInputStream input(buffer, size); + GzipInputStream gzin(&input, GzipInputStream::AUTO); + ReadStuff(&gzin); + } + { + ArrayOutputStream output(buffer, kBufferSize); + GzipOutputStream::Options options; + options.format = GzipOutputStream::GZIP; + GzipOutputStream gzout(&output, options); + WriteStuff(&gzout); + gzout.Close(); + size = output.ByteCount(); + } + { + ArrayInputStream input(buffer, size); + GzipInputStream gzin(&input, GzipInputStream::AUTO); + ReadStuff(&gzin); + } + delete [] buffer; +} + +string IoTest::Compress(const string& data, + const GzipOutputStream::Options& options) { + string result; + { + StringOutputStream output(&result); + GzipOutputStream gzout(&output, options); + WriteToOutput(&gzout, data.data(), data.size()); + } + return result; +} + +string IoTest::Uncompress(const string& data) { + string result; + { + ArrayInputStream input(data.data(), data.size()); + GzipInputStream gzin(&input); + const void* buffer; + int size; + while (gzin.Next(&buffer, &size)) { + result.append(reinterpret_cast(buffer), size); + } + } + return result; +} + +TEST_F(IoTest, CompressionOptions) { + // Some ad-hoc testing of compression options. + + string golden; + File::ReadFileToStringOrDie( + TestSourceDir() + "/google/protobuf/testdata/golden_message", + &golden); + + GzipOutputStream::Options options; + string gzip_compressed = Compress(golden, options); + + options.compression_level = 0; + string not_compressed = Compress(golden, options); + + // Try zlib compression for fun. + options = GzipOutputStream::Options(); + options.format = GzipOutputStream::ZLIB; + string zlib_compressed = Compress(golden, options); + + // Uncompressed should be bigger than the original since it should have some + // sort of header. + EXPECT_GT(not_compressed.size(), golden.size()); + + // Higher compression levels should result in smaller sizes. + EXPECT_LT(zlib_compressed.size(), not_compressed.size()); + + // ZLIB format should differ from GZIP format. + EXPECT_TRUE(zlib_compressed != gzip_compressed); + + // Everything should decompress correctly. + EXPECT_TRUE(Uncompress(not_compressed) == golden); + EXPECT_TRUE(Uncompress(gzip_compressed) == golden); + EXPECT_TRUE(Uncompress(zlib_compressed) == golden); +} + +TEST_F(IoTest, TwoSessionWriteGzip) { + // Test that two concatenated gzip streams can be read correctly + + static const char* strA = "0123456789"; + static const char* strB = "QuickBrownFox"; + const int kBufferSize = 2*1024; + uint8* buffer = new uint8[kBufferSize]; + char* temp_buffer = new char[40]; + + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + ArrayOutputStream* output = + new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]); + GzipOutputStream* gzout = new GzipOutputStream(output); + CodedOutputStream* coded_output = new CodedOutputStream(gzout); + int32 outlen = strlen(strA) + 1; + coded_output->WriteVarint32(outlen); + coded_output->WriteRaw(strA, outlen); + delete coded_output; // flush + delete gzout; // flush + int64 pos = output->ByteCount(); + delete output; + output = new ArrayOutputStream( + buffer + pos, kBufferSize - pos, kBlockSizes[i]); + gzout = new GzipOutputStream(output); + coded_output = new CodedOutputStream(gzout); + outlen = strlen(strB) + 1; + coded_output->WriteVarint32(outlen); + coded_output->WriteRaw(strB, outlen); + delete coded_output; // flush + delete gzout; // flush + int64 size = pos + output->ByteCount(); + delete output; + + ArrayInputStream* input = + new ArrayInputStream(buffer, size, kBlockSizes[j]); + GzipInputStream* gzin = new GzipInputStream(input); + CodedInputStream* coded_input = new CodedInputStream(gzin); + uint32 insize; + EXPECT_TRUE(coded_input->ReadVarint32(&insize)); + EXPECT_EQ(strlen(strA) + 1, insize); + EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); + EXPECT_EQ(0, memcmp(temp_buffer, strA, insize)) + << "strA=" << strA << " in=" << temp_buffer; + + EXPECT_TRUE(coded_input->ReadVarint32(&insize)); + EXPECT_EQ(strlen(strB) + 1, insize); + EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize)); + EXPECT_EQ(0, memcmp(temp_buffer, strB, insize)) + << " out_block_size=" << kBlockSizes[i] + << " in_block_size=" << kBlockSizes[j] + << " pos=" << pos + << " size=" << size + << " strB=" << strB << " in=" << temp_buffer; + + delete coded_input; + delete gzin; + delete input; + } + } + + delete [] temp_buffer; + delete [] buffer; +} +#endif + +// There is no string input, only string output. Also, it doesn't support +// explicit block sizes. So, we'll only run one test and we'll use +// ArrayInput to read back the results. +TEST_F(IoTest, StringIo) { + string str; + { + StringOutputStream output(&str); + WriteStuff(&output); + } + { + ArrayInputStream input(str.data(), str.size()); + ReadStuff(&input); + } +} + + +// To test files, we create a temporary file, write, read, truncate, repeat. +TEST_F(IoTest, FileIo) { + string filename = TestTempDir() + "/zero_copy_stream_test_file"; + + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + // Make a temporary file. + int file = + open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777); + ASSERT_GE(file, 0); + + { + FileOutputStream output(file, kBlockSizes[i]); + WriteStuff(&output); + EXPECT_EQ(0, output.GetErrno()); + } + + // Rewind. + ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1); + + { + FileInputStream input(file, kBlockSizes[j]); + ReadStuff(&input); + EXPECT_EQ(0, input.GetErrno()); + } + + close(file); + } + } +} + +#if HAVE_ZLIB +TEST_F(IoTest, GzipFileIo) { + string filename = TestTempDir() + "/zero_copy_stream_test_file"; + + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + // Make a temporary file. + int file = + open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777); + ASSERT_GE(file, 0); + { + FileOutputStream output(file, kBlockSizes[i]); + GzipOutputStream gzout(&output); + WriteStuffLarge(&gzout); + gzout.Close(); + output.Flush(); + EXPECT_EQ(0, output.GetErrno()); + } + + // Rewind. + ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1); + + { + FileInputStream input(file, kBlockSizes[j]); + GzipInputStream gzin(&input); + ReadStuffLarge(&gzin); + EXPECT_EQ(0, input.GetErrno()); + } + + close(file); + } + } +} +#endif + +// MSVC raises various debugging exceptions if we try to use a file +// descriptor of -1, defeating our tests below. This class will disable +// these debug assertions while in scope. +class MsvcDebugDisabler { + public: +#if defined(_MSC_VER) && _MSC_VER >= 1400 + MsvcDebugDisabler() { + old_handler_ = _set_invalid_parameter_handler(MyHandler); + old_mode_ = _CrtSetReportMode(_CRT_ASSERT, 0); + } + ~MsvcDebugDisabler() { + old_handler_ = _set_invalid_parameter_handler(old_handler_); + old_mode_ = _CrtSetReportMode(_CRT_ASSERT, old_mode_); + } + + static void MyHandler(const wchar_t *expr, + const wchar_t *func, + const wchar_t *file, + unsigned int line, + uintptr_t pReserved) { + // do nothing + } + + _invalid_parameter_handler old_handler_; + int old_mode_; +#else + // Dummy constructor and destructor to ensure that GCC doesn't complain + // that debug_disabler is an unused variable. + MsvcDebugDisabler() {} + ~MsvcDebugDisabler() {} +#endif +}; + +// Test that FileInputStreams report errors correctly. +TEST_F(IoTest, FileReadError) { + MsvcDebugDisabler debug_disabler; + + // -1 = invalid file descriptor. + FileInputStream input(-1); + + const void* buffer; + int size; + EXPECT_FALSE(input.Next(&buffer, &size)); + EXPECT_EQ(EBADF, input.GetErrno()); +} + +// Test that FileOutputStreams report errors correctly. +TEST_F(IoTest, FileWriteError) { + MsvcDebugDisabler debug_disabler; + + // -1 = invalid file descriptor. + FileOutputStream input(-1); + + void* buffer; + int size; + + // The first call to Next() succeeds because it doesn't have anything to + // write yet. + EXPECT_TRUE(input.Next(&buffer, &size)); + + // Second call fails. + EXPECT_FALSE(input.Next(&buffer, &size)); + + EXPECT_EQ(EBADF, input.GetErrno()); +} + +// Pipes are not seekable, so File{Input,Output}Stream ends up doing some +// different things to handle them. We'll test by writing to a pipe and +// reading back from it. +TEST_F(IoTest, PipeIo) { + int files[2]; + + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + // Need to create a new pipe each time because ReadStuff() expects + // to see EOF at the end. + ASSERT_EQ(pipe(files), 0); + + { + FileOutputStream output(files[1], kBlockSizes[i]); + WriteStuff(&output); + EXPECT_EQ(0, output.GetErrno()); + } + close(files[1]); // Send EOF. + + { + FileInputStream input(files[0], kBlockSizes[j]); + ReadStuff(&input); + EXPECT_EQ(0, input.GetErrno()); + } + close(files[0]); + } + } +} + +// Test using C++ iostreams. +TEST_F(IoTest, IostreamIo) { + for (int i = 0; i < kBlockSizeCount; i++) { + for (int j = 0; j < kBlockSizeCount; j++) { + { + stringstream stream; + + { + OstreamOutputStream output(&stream, kBlockSizes[i]); + WriteStuff(&output); + EXPECT_FALSE(stream.fail()); + } + + { + IstreamInputStream input(&stream, kBlockSizes[j]); + ReadStuff(&input); + EXPECT_TRUE(stream.eof()); + } + } + + { + stringstream stream; + + { + OstreamOutputStream output(&stream, kBlockSizes[i]); + WriteStuffLarge(&output); + EXPECT_FALSE(stream.fail()); + } + + { + IstreamInputStream input(&stream, kBlockSizes[j]); + ReadStuffLarge(&input); + EXPECT_TRUE(stream.eof()); + } + } + } + } +} + +// To test ConcatenatingInputStream, we create several ArrayInputStreams +// covering a buffer and then concatenate them. +TEST_F(IoTest, ConcatenatingInputStream) { + const int kBufferSize = 256; + uint8 buffer[kBufferSize]; + + // Fill the buffer. + ArrayOutputStream output(buffer, kBufferSize); + WriteStuff(&output); + + // Now split it up into multiple streams of varying sizes. + ASSERT_EQ(68, output.ByteCount()); // Test depends on this. + ArrayInputStream input1(buffer , 12); + ArrayInputStream input2(buffer + 12, 7); + ArrayInputStream input3(buffer + 19, 6); + ArrayInputStream input4(buffer + 25, 15); + ArrayInputStream input5(buffer + 40, 0); + // Note: We want to make sure we have a stream boundary somewhere between + // bytes 42 and 62, which is the range that it Skip()ed by ReadStuff(). This + // tests that a bug that existed in the original code for Skip() is fixed. + ArrayInputStream input6(buffer + 40, 10); + ArrayInputStream input7(buffer + 50, 18); // Total = 68 bytes. + + ZeroCopyInputStream* streams[] = + {&input1, &input2, &input3, &input4, &input5, &input6, &input7}; + + // Create the concatenating stream and read. + ConcatenatingInputStream input(streams, GOOGLE_ARRAYSIZE(streams)); + ReadStuff(&input); +} + +// To test LimitingInputStream, we write our golden text to a buffer, then +// create an ArrayInputStream that contains the whole buffer (not just the +// bytes written), then use a LimitingInputStream to limit it just to the +// bytes written. +TEST_F(IoTest, LimitingInputStream) { + const int kBufferSize = 256; + uint8 buffer[kBufferSize]; + + // Fill the buffer. + ArrayOutputStream output(buffer, kBufferSize); + WriteStuff(&output); + + // Set up input. + ArrayInputStream array_input(buffer, kBufferSize); + LimitingInputStream input(&array_input, output.ByteCount()); + + ReadStuff(&input); +} + +// Check that a zero-size array doesn't confuse the code. +TEST(ZeroSizeArray, Input) { + ArrayInputStream input(NULL, 0); + const void* data; + int size; + EXPECT_FALSE(input.Next(&data, &size)); +} + +TEST(ZeroSizeArray, Output) { + ArrayOutputStream output(NULL, 0); + void* data; + int size; + EXPECT_FALSE(output.Next(&data, &size)); +} + +} // namespace +} // namespace io +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc new file mode 100644 index 000000000..ffeec3c44 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc @@ -0,0 +1,112 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include +#include + +#include +#include + +using namespace std; + +int main(int argc, char* argv[]) { + string data, packed_data; + + { + protobuf_unittest::TestAllTypesLite message, message2, message3; + google::protobuf::TestUtilLite::ExpectClear(message); + google::protobuf::TestUtilLite::SetAllFields(&message); + message2.CopyFrom(message); + data = message.SerializeAsString(); + message3.ParseFromString(data); + google::protobuf::TestUtilLite::ExpectAllFieldsSet(message); + google::protobuf::TestUtilLite::ExpectAllFieldsSet(message2); + google::protobuf::TestUtilLite::ExpectAllFieldsSet(message3); + google::protobuf::TestUtilLite::ModifyRepeatedFields(&message); + google::protobuf::TestUtilLite::ExpectRepeatedFieldsModified(message); + message.Clear(); + google::protobuf::TestUtilLite::ExpectClear(message); + } + + { + protobuf_unittest::TestAllExtensionsLite message, message2, message3; + google::protobuf::TestUtilLite::ExpectExtensionsClear(message); + google::protobuf::TestUtilLite::SetAllExtensions(&message); + message2.CopyFrom(message); + string extensions_data = message.SerializeAsString(); + GOOGLE_CHECK(extensions_data == data); + message3.ParseFromString(extensions_data); + google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message); + google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message2); + google::protobuf::TestUtilLite::ExpectAllExtensionsSet(message3); + google::protobuf::TestUtilLite::ModifyRepeatedExtensions(&message); + google::protobuf::TestUtilLite::ExpectRepeatedExtensionsModified(message); + message.Clear(); + google::protobuf::TestUtilLite::ExpectExtensionsClear(message); + } + + { + protobuf_unittest::TestPackedTypesLite message, message2, message3; + google::protobuf::TestUtilLite::ExpectPackedClear(message); + google::protobuf::TestUtilLite::SetPackedFields(&message); + message2.CopyFrom(message); + packed_data = message.SerializeAsString(); + message3.ParseFromString(packed_data); + google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message); + google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message2); + google::protobuf::TestUtilLite::ExpectPackedFieldsSet(message3); + google::protobuf::TestUtilLite::ModifyPackedFields(&message); + google::protobuf::TestUtilLite::ExpectPackedFieldsModified(message); + message.Clear(); + google::protobuf::TestUtilLite::ExpectPackedClear(message); + } + + { + protobuf_unittest::TestPackedExtensionsLite message, message2, message3; + google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message); + google::protobuf::TestUtilLite::SetPackedExtensions(&message); + message2.CopyFrom(message); + string packed_extensions_data = message.SerializeAsString(); + GOOGLE_CHECK(packed_extensions_data == packed_data); + message3.ParseFromString(packed_extensions_data); + google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message); + google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message2); + google::protobuf::TestUtilLite::ExpectPackedExtensionsSet(message3); + google::protobuf::TestUtilLite::ModifyPackedExtensions(&message); + google::protobuf::TestUtilLite::ExpectPackedExtensionsModified(message); + message.Clear(); + google::protobuf::TestUtilLite::ExpectPackedExtensionsClear(message); + } + + cout << "PASS" << endl; + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc new file mode 100644 index 000000000..91e6878e8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc @@ -0,0 +1,318 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +using internal::WireFormat; +using internal::ReflectionOps; + +Message::~Message() {} + +void Message::MergeFrom(const Message& from) { + const Descriptor* descriptor = GetDescriptor(); + GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) + << ": Tried to merge from a message with a different type. " + "to: " << descriptor->full_name() << ", " + "from:" << from.GetDescriptor()->full_name(); + ReflectionOps::Merge(from, this); +} + +void Message::CheckTypeAndMergeFrom(const MessageLite& other) { + MergeFrom(*down_cast(&other)); +} + +void Message::CopyFrom(const Message& from) { + const Descriptor* descriptor = GetDescriptor(); + GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) + << ": Tried to copy from a message with a different type." + "to: " << descriptor->full_name() << ", " + "from:" << from.GetDescriptor()->full_name(); + ReflectionOps::Copy(from, this); +} + +string Message::GetTypeName() const { + return GetDescriptor()->full_name(); +} + +void Message::Clear() { + ReflectionOps::Clear(this); +} + +bool Message::IsInitialized() const { + return ReflectionOps::IsInitialized(*this); +} + +void Message::FindInitializationErrors(vector* errors) const { + return ReflectionOps::FindInitializationErrors(*this, "", errors); +} + +string Message::InitializationErrorString() const { + vector errors; + FindInitializationErrors(&errors); + return JoinStrings(errors, ", "); +} + +void Message::CheckInitialized() const { + GOOGLE_CHECK(IsInitialized()) + << "Message of type \"" << GetDescriptor()->full_name() + << "\" is missing required fields: " << InitializationErrorString(); +} + +void Message::DiscardUnknownFields() { + return ReflectionOps::DiscardUnknownFields(this); +} + +bool Message::MergePartialFromCodedStream(io::CodedInputStream* input) { + return WireFormat::ParseAndMergePartial(input, this); +} + +bool Message::ParseFromFileDescriptor(int file_descriptor) { + io::FileInputStream input(file_descriptor); + return ParseFromZeroCopyStream(&input) && input.GetErrno() == 0; +} + +bool Message::ParsePartialFromFileDescriptor(int file_descriptor) { + io::FileInputStream input(file_descriptor); + return ParsePartialFromZeroCopyStream(&input) && input.GetErrno() == 0; +} + +bool Message::ParseFromIstream(istream* input) { + io::IstreamInputStream zero_copy_input(input); + return ParseFromZeroCopyStream(&zero_copy_input) && input->eof(); +} + +bool Message::ParsePartialFromIstream(istream* input) { + io::IstreamInputStream zero_copy_input(input); + return ParsePartialFromZeroCopyStream(&zero_copy_input) && input->eof(); +} + + +void Message::SerializeWithCachedSizes( + io::CodedOutputStream* output) const { + WireFormat::SerializeWithCachedSizes(*this, GetCachedSize(), output); +} + +int Message::ByteSize() const { + int size = WireFormat::ByteSize(*this); + SetCachedSize(size); + return size; +} + +void Message::SetCachedSize(int size) const { + GOOGLE_LOG(FATAL) << "Message class \"" << GetDescriptor()->full_name() + << "\" implements neither SetCachedSize() nor ByteSize(). " + "Must implement one or the other."; +} + +int Message::SpaceUsed() const { + return GetReflection()->SpaceUsed(*this); +} + +bool Message::SerializeToFileDescriptor(int file_descriptor) const { + io::FileOutputStream output(file_descriptor); + return SerializeToZeroCopyStream(&output); +} + +bool Message::SerializePartialToFileDescriptor(int file_descriptor) const { + io::FileOutputStream output(file_descriptor); + return SerializePartialToZeroCopyStream(&output); +} + +bool Message::SerializeToOstream(ostream* output) const { + { + io::OstreamOutputStream zero_copy_output(output); + if (!SerializeToZeroCopyStream(&zero_copy_output)) return false; + } + return output->good(); +} + +bool Message::SerializePartialToOstream(ostream* output) const { + io::OstreamOutputStream zero_copy_output(output); + return SerializePartialToZeroCopyStream(&zero_copy_output); +} + + +Reflection::~Reflection() {} + +// =================================================================== +// MessageFactory + +MessageFactory::~MessageFactory() {} + +namespace { + +class GeneratedMessageFactory : public MessageFactory { + public: + GeneratedMessageFactory(); + ~GeneratedMessageFactory(); + + static GeneratedMessageFactory* singleton(); + + typedef void RegistrationFunc(const string&); + void RegisterFile(const char* file, RegistrationFunc* registration_func); + void RegisterType(const Descriptor* descriptor, const Message* prototype); + + // implements MessageFactory --------------------------------------- + const Message* GetPrototype(const Descriptor* type); + + private: + // Only written at static init time, so does not require locking. + hash_map, streq> file_map_; + + // Initialized lazily, so requires locking. + Mutex mutex_; + hash_map type_map_; +}; + +GeneratedMessageFactory* generated_message_factory_ = NULL; +GOOGLE_PROTOBUF_DECLARE_ONCE(generated_message_factory_once_init_); + +void ShutdownGeneratedMessageFactory() { + delete generated_message_factory_; +} + +void InitGeneratedMessageFactory() { + generated_message_factory_ = new GeneratedMessageFactory; + internal::OnShutdown(&ShutdownGeneratedMessageFactory); +} + +GeneratedMessageFactory::GeneratedMessageFactory() {} +GeneratedMessageFactory::~GeneratedMessageFactory() {} + +GeneratedMessageFactory* GeneratedMessageFactory::singleton() { + ::google::protobuf::GoogleOnceInit(&generated_message_factory_once_init_, + &InitGeneratedMessageFactory); + return generated_message_factory_; +} + +void GeneratedMessageFactory::RegisterFile( + const char* file, RegistrationFunc* registration_func) { + if (!InsertIfNotPresent(&file_map_, file, registration_func)) { + GOOGLE_LOG(FATAL) << "File is already registered: " << file; + } +} + +void GeneratedMessageFactory::RegisterType(const Descriptor* descriptor, + const Message* prototype) { + GOOGLE_DCHECK_EQ(descriptor->file()->pool(), DescriptorPool::generated_pool()) + << "Tried to register a non-generated type with the generated " + "type registry."; + + // This should only be called as a result of calling a file registration + // function during GetPrototype(), in which case we already have locked + // the mutex. + mutex_.AssertHeld(); + if (!InsertIfNotPresent(&type_map_, descriptor, prototype)) { + GOOGLE_LOG(DFATAL) << "Type is already registered: " << descriptor->full_name(); + } +} + +const Message* GeneratedMessageFactory::GetPrototype(const Descriptor* type) { + { + ReaderMutexLock lock(&mutex_); + const Message* result = FindPtrOrNull(type_map_, type); + if (result != NULL) return result; + } + + // If the type is not in the generated pool, then we can't possibly handle + // it. + if (type->file()->pool() != DescriptorPool::generated_pool()) return NULL; + + // Apparently the file hasn't been registered yet. Let's do that now. + RegistrationFunc* registration_func = + FindPtrOrNull(file_map_, type->file()->name().c_str()); + if (registration_func == NULL) { + GOOGLE_LOG(DFATAL) << "File appears to be in generated pool but wasn't " + "registered: " << type->file()->name(); + return NULL; + } + + WriterMutexLock lock(&mutex_); + + // Check if another thread preempted us. + const Message* result = FindPtrOrNull(type_map_, type); + if (result == NULL) { + // Nope. OK, register everything. + registration_func(type->file()->name()); + // Should be here now. + result = FindPtrOrNull(type_map_, type); + } + + if (result == NULL) { + GOOGLE_LOG(DFATAL) << "Type appears to be in generated pool but wasn't " + << "registered: " << type->full_name(); + } + + return result; +} + +} // namespace + +MessageFactory* MessageFactory::generated_factory() { + return GeneratedMessageFactory::singleton(); +} + +void MessageFactory::InternalRegisterGeneratedFile( + const char* filename, void (*register_messages)(const string&)) { + GeneratedMessageFactory::singleton()->RegisterFile(filename, + register_messages); +} + +void MessageFactory::InternalRegisterGeneratedMessage( + const Descriptor* descriptor, const Message* prototype) { + GeneratedMessageFactory::singleton()->RegisterType(descriptor, prototype); +} + + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h new file mode 100644 index 000000000..4bbc64183 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h @@ -0,0 +1,692 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Defines Message, the abstract interface implemented by non-lite +// protocol message objects. Although it's possible to implement this +// interface manually, most users will use the protocol compiler to +// generate implementations. +// +// Example usage: +// +// Say you have a message defined as: +// +// message Foo { +// optional string text = 1; +// repeated int32 numbers = 2; +// } +// +// Then, if you used the protocol compiler to generate a class from the above +// definition, you could use it like so: +// +// string data; // Will store a serialized version of the message. +// +// { +// // Create a message and serialize it. +// Foo foo; +// foo.set_text("Hello World!"); +// foo.add_numbers(1); +// foo.add_numbers(5); +// foo.add_numbers(42); +// +// foo.SerializeToString(&data); +// } +// +// { +// // Parse the serialized message and check that it contains the +// // correct data. +// Foo foo; +// foo.ParseFromString(data); +// +// assert(foo.text() == "Hello World!"); +// assert(foo.numbers_size() == 3); +// assert(foo.numbers(0) == 1); +// assert(foo.numbers(1) == 5); +// assert(foo.numbers(2) == 42); +// } +// +// { +// // Same as the last block, but do it dynamically via the Message +// // reflection interface. +// Message* foo = new Foo; +// Descriptor* descriptor = foo->GetDescriptor(); +// +// // Get the descriptors for the fields we're interested in and verify +// // their types. +// FieldDescriptor* text_field = descriptor->FindFieldByName("text"); +// assert(text_field != NULL); +// assert(text_field->type() == FieldDescriptor::TYPE_STRING); +// assert(text_field->label() == FieldDescriptor::TYPE_OPTIONAL); +// FieldDescriptor* numbers_field = descriptor->FindFieldByName("numbers"); +// assert(numbers_field != NULL); +// assert(numbers_field->type() == FieldDescriptor::TYPE_INT32); +// assert(numbers_field->label() == FieldDescriptor::TYPE_REPEATED); +// +// // Parse the message. +// foo->ParseFromString(data); +// +// // Use the reflection interface to examine the contents. +// const Reflection* reflection = foo->GetReflection(); +// assert(reflection->GetString(foo, text_field) == "Hello World!"); +// assert(reflection->FieldSize(foo, numbers_field) == 3); +// assert(reflection->GetRepeatedInt32(foo, numbers_field, 0) == 1); +// assert(reflection->GetRepeatedInt32(foo, numbers_field, 1) == 5); +// assert(reflection->GetRepeatedInt32(foo, numbers_field, 2) == 42); +// +// delete foo; +// } + +#ifndef GOOGLE_PROTOBUF_MESSAGE_H__ +#define GOOGLE_PROTOBUF_MESSAGE_H__ + +#include +#include + +#ifdef __DECCXX +// HP C++'s iosfwd doesn't work. +#include +#else +#include +#endif + +#include + +#include + + +namespace google { +namespace protobuf { + +// Defined in this file. +class Message; +class Reflection; +class MessageFactory; + +// Defined in other files. +class Descriptor; // descriptor.h +class FieldDescriptor; // descriptor.h +class EnumDescriptor; // descriptor.h +class EnumValueDescriptor; // descriptor.h +namespace io { + class ZeroCopyInputStream; // zero_copy_stream.h + class ZeroCopyOutputStream; // zero_copy_stream.h + class CodedInputStream; // coded_stream.h + class CodedOutputStream; // coded_stream.h +} +class UnknownFieldSet; // unknown_field_set.h + +// A container to hold message metadata. +struct Metadata { + const Descriptor* descriptor; + const Reflection* reflection; +}; + +// Returns the EnumDescriptor for enum type E, which must be a +// proto-declared enum type. Code generated by the protocol compiler +// will include specializations of this template for each enum type declared. +template +const EnumDescriptor* GetEnumDescriptor(); + +// Abstract interface for protocol messages. +// +// See also MessageLite, which contains most every-day operations. Message +// adds descriptors and reflection on top of that. +// +// The methods of this class that are virtual but not pure-virtual have +// default implementations based on reflection. Message classes which are +// optimized for speed will want to override these with faster implementations, +// but classes optimized for code size may be happy with keeping them. See +// the optimize_for option in descriptor.proto. +class LIBPROTOBUF_EXPORT Message : public MessageLite { + public: + inline Message() {} + virtual ~Message(); + + // Basic Operations ------------------------------------------------ + + // Construct a new instance of the same type. Ownership is passed to the + // caller. (This is also defined in MessageLite, but is defined again here + // for return-type covariance.) + virtual Message* New() const = 0; + + // Make this message into a copy of the given message. The given message + // must have the same descriptor, but need not necessarily be the same class. + // By default this is just implemented as "Clear(); MergeFrom(from);". + virtual void CopyFrom(const Message& from); + + // Merge the fields from the given message into this message. Singular + // fields will be overwritten, except for embedded messages which will + // be merged. Repeated fields will be concatenated. The given message + // must be of the same type as this message (i.e. the exact same class). + virtual void MergeFrom(const Message& from); + + // Verifies that IsInitialized() returns true. GOOGLE_CHECK-fails otherwise, with + // a nice error message. + void CheckInitialized() const; + + // Slowly build a list of all required fields that are not set. + // This is much, much slower than IsInitialized() as it is implemented + // purely via reflection. Generally, you should not call this unless you + // have already determined that an error exists by calling IsInitialized(). + void FindInitializationErrors(vector* errors) const; + + // Like FindInitializationErrors, but joins all the strings, delimited by + // commas, and returns them. + string InitializationErrorString() const; + + // Clears all unknown fields from this message and all embedded messages. + // Normally, if unknown tag numbers are encountered when parsing a message, + // the tag and value are stored in the message's UnknownFieldSet and + // then written back out when the message is serialized. This allows servers + // which simply route messages to other servers to pass through messages + // that have new field definitions which they don't yet know about. However, + // this behavior can have security implications. To avoid it, call this + // method after parsing. + // + // See Reflection::GetUnknownFields() for more on unknown fields. + virtual void DiscardUnknownFields(); + + // Computes (an estimate of) the total number of bytes currently used for + // storing the message in memory. The default implementation calls the + // Reflection object's SpaceUsed() method. + virtual int SpaceUsed() const; + + // Debugging & Testing---------------------------------------------- + + // Generates a human readable form of this message, useful for debugging + // and other purposes. + string DebugString() const; + // Like DebugString(), but with less whitespace. + string ShortDebugString() const; + // Like DebugString(), but do not escape UTF-8 byte sequences. + string Utf8DebugString() const; + // Convenience function useful in GDB. Prints DebugString() to stdout. + void PrintDebugString() const; + + // Heavy I/O ------------------------------------------------------- + // Additional parsing and serialization methods not implemented by + // MessageLite because they are not supported by the lite library. + + // Parse a protocol buffer from a file descriptor. If successful, the entire + // input will be consumed. + bool ParseFromFileDescriptor(int file_descriptor); + // Like ParseFromFileDescriptor(), but accepts messages that are missing + // required fields. + bool ParsePartialFromFileDescriptor(int file_descriptor); + // Parse a protocol buffer from a C++ istream. If successful, the entire + // input will be consumed. + bool ParseFromIstream(istream* input); + // Like ParseFromIstream(), but accepts messages that are missing + // required fields. + bool ParsePartialFromIstream(istream* input); + + // Serialize the message and write it to the given file descriptor. All + // required fields must be set. + bool SerializeToFileDescriptor(int file_descriptor) const; + // Like SerializeToFileDescriptor(), but allows missing required fields. + bool SerializePartialToFileDescriptor(int file_descriptor) const; + // Serialize the message and write it to the given C++ ostream. All + // required fields must be set. + bool SerializeToOstream(ostream* output) const; + // Like SerializeToOstream(), but allows missing required fields. + bool SerializePartialToOstream(ostream* output) const; + + + // Reflection-based methods ---------------------------------------- + // These methods are pure-virtual in MessageLite, but Message provides + // reflection-based default implementations. + + virtual string GetTypeName() const; + virtual void Clear(); + virtual bool IsInitialized() const; + virtual void CheckTypeAndMergeFrom(const MessageLite& other); + virtual bool MergePartialFromCodedStream(io::CodedInputStream* input); + virtual int ByteSize() const; + virtual void SerializeWithCachedSizes(io::CodedOutputStream* output) const; + + private: + // This is called only by the default implementation of ByteSize(), to + // update the cached size. If you override ByteSize(), you do not need + // to override this. If you do not override ByteSize(), you MUST override + // this; the default implementation will crash. + // + // The method is private because subclasses should never call it; only + // override it. Yes, C++ lets you do that. Crazy, huh? + virtual void SetCachedSize(int size) const; + + public: + + // Introspection --------------------------------------------------- + + // Typedef for backwards-compatibility. + typedef google::protobuf::Reflection Reflection; + + // Get a Descriptor for this message's type. This describes what + // fields the message contains, the types of those fields, etc. + const Descriptor* GetDescriptor() const { return GetMetadata().descriptor; } + + // Get the Reflection interface for this Message, which can be used to + // read and modify the fields of the Message dynamically (in other words, + // without knowing the message type at compile time). This object remains + // property of the Message. + // + // This method remains virtual in case a subclass does not implement + // reflection and wants to override the default behavior. + virtual const Reflection* GetReflection() const { + return GetMetadata().reflection; + } + + protected: + // Get a struct containing the metadata for the Message. Most subclasses only + // need to implement this method, rather than the GetDescriptor() and + // GetReflection() wrappers. + virtual Metadata GetMetadata() const = 0; + + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Message); +}; + +// This interface contains methods that can be used to dynamically access +// and modify the fields of a protocol message. Their semantics are +// similar to the accessors the protocol compiler generates. +// +// To get the Reflection for a given Message, call Message::GetReflection(). +// +// This interface is separate from Message only for efficiency reasons; +// the vast majority of implementations of Message will share the same +// implementation of Reflection (GeneratedMessageReflection, +// defined in generated_message.h), and all Messages of a particular class +// should share the same Reflection object (though you should not rely on +// the latter fact). +// +// There are several ways that these methods can be used incorrectly. For +// example, any of the following conditions will lead to undefined +// results (probably assertion failures): +// - The FieldDescriptor is not a field of this message type. +// - The method called is not appropriate for the field's type. For +// each field type in FieldDescriptor::TYPE_*, there is only one +// Get*() method, one Set*() method, and one Add*() method that is +// valid for that type. It should be obvious which (except maybe +// for TYPE_BYTES, which are represented using strings in C++). +// - A Get*() or Set*() method for singular fields is called on a repeated +// field. +// - GetRepeated*(), SetRepeated*(), or Add*() is called on a non-repeated +// field. +// - The Message object passed to any method is not of the right type for +// this Reflection object (i.e. message.GetReflection() != reflection). +// +// You might wonder why there is not any abstract representation for a field +// of arbitrary type. E.g., why isn't there just a "GetField()" method that +// returns "const Field&", where "Field" is some class with accessors like +// "GetInt32Value()". The problem is that someone would have to deal with +// allocating these Field objects. For generated message classes, having to +// allocate space for an additional object to wrap every field would at least +// double the message's memory footprint, probably worse. Allocating the +// objects on-demand, on the other hand, would be expensive and prone to +// memory leaks. So, instead we ended up with this flat interface. +// +// TODO(kenton): Create a utility class which callers can use to read and +// write fields from a Reflection without paying attention to the type. +class LIBPROTOBUF_EXPORT Reflection { + public: + // TODO(kenton): Remove parameter. + inline Reflection() {} + virtual ~Reflection(); + + // Get the UnknownFieldSet for the message. This contains fields which + // were seen when the Message was parsed but were not recognized according + // to the Message's definition. + virtual const UnknownFieldSet& GetUnknownFields( + const Message& message) const = 0; + // Get a mutable pointer to the UnknownFieldSet for the message. This + // contains fields which were seen when the Message was parsed but were not + // recognized according to the Message's definition. + virtual UnknownFieldSet* MutableUnknownFields(Message* message) const = 0; + + // Estimate the amount of memory used by the message object. + virtual int SpaceUsed(const Message& message) const = 0; + + // Check if the given non-repeated field is set. + virtual bool HasField(const Message& message, + const FieldDescriptor* field) const = 0; + + // Get the number of elements of a repeated field. + virtual int FieldSize(const Message& message, + const FieldDescriptor* field) const = 0; + + // Clear the value of a field, so that HasField() returns false or + // FieldSize() returns zero. + virtual void ClearField(Message* message, + const FieldDescriptor* field) const = 0; + + // Remove the last element of a repeated field. + // We don't provide a way to remove any element other than the last + // because it invites inefficient use, such as O(n^2) filtering loops + // that should have been O(n). If you want to remove an element other + // than the last, the best way to do it is to re-arrange the elements + // (using Swap()) so that the one you want removed is at the end, then + // call RemoveLast(). + virtual void RemoveLast(Message* message, + const FieldDescriptor* field) const = 0; + + // Swap the complete contents of two messages. + virtual void Swap(Message* message1, Message* message2) const = 0; + + // Swap two elements of a repeated field. + virtual void SwapElements(Message* message, + const FieldDescriptor* field, + int index1, + int index2) const = 0; + + // List all fields of the message which are currently set. This includes + // extensions. Singular fields will only be listed if HasField(field) would + // return true and repeated fields will only be listed if FieldSize(field) + // would return non-zero. Fields (both normal fields and extension fields) + // will be listed ordered by field number. + virtual void ListFields(const Message& message, + vector* output) const = 0; + + // Singular field getters ------------------------------------------ + // These get the value of a non-repeated field. They return the default + // value for fields that aren't set. + + virtual int32 GetInt32 (const Message& message, + const FieldDescriptor* field) const = 0; + virtual int64 GetInt64 (const Message& message, + const FieldDescriptor* field) const = 0; + virtual uint32 GetUInt32(const Message& message, + const FieldDescriptor* field) const = 0; + virtual uint64 GetUInt64(const Message& message, + const FieldDescriptor* field) const = 0; + virtual float GetFloat (const Message& message, + const FieldDescriptor* field) const = 0; + virtual double GetDouble(const Message& message, + const FieldDescriptor* field) const = 0; + virtual bool GetBool (const Message& message, + const FieldDescriptor* field) const = 0; + virtual string GetString(const Message& message, + const FieldDescriptor* field) const = 0; + virtual const EnumValueDescriptor* GetEnum( + const Message& message, const FieldDescriptor* field) const = 0; + // See MutableMessage() for the meaning of the "factory" parameter. + virtual const Message& GetMessage(const Message& message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const = 0; + + // Get a string value without copying, if possible. + // + // GetString() necessarily returns a copy of the string. This can be + // inefficient when the string is already stored in a string object in the + // underlying message. GetStringReference() will return a reference to the + // underlying string in this case. Otherwise, it will copy the string into + // *scratch and return that. + // + // Note: It is perfectly reasonable and useful to write code like: + // str = reflection->GetStringReference(field, &str); + // This line would ensure that only one copy of the string is made + // regardless of the field's underlying representation. When initializing + // a newly-constructed string, though, it's just as fast and more readable + // to use code like: + // string str = reflection->GetString(field); + virtual const string& GetStringReference(const Message& message, + const FieldDescriptor* field, + string* scratch) const = 0; + + + // Singular field mutators ----------------------------------------- + // These mutate the value of a non-repeated field. + + virtual void SetInt32 (Message* message, + const FieldDescriptor* field, int32 value) const = 0; + virtual void SetInt64 (Message* message, + const FieldDescriptor* field, int64 value) const = 0; + virtual void SetUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const = 0; + virtual void SetUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const = 0; + virtual void SetFloat (Message* message, + const FieldDescriptor* field, float value) const = 0; + virtual void SetDouble(Message* message, + const FieldDescriptor* field, double value) const = 0; + virtual void SetBool (Message* message, + const FieldDescriptor* field, bool value) const = 0; + virtual void SetString(Message* message, + const FieldDescriptor* field, + const string& value) const = 0; + virtual void SetEnum (Message* message, + const FieldDescriptor* field, + const EnumValueDescriptor* value) const = 0; + // Get a mutable pointer to a field with a message type. If a MessageFactory + // is provided, it will be used to construct instances of the sub-message; + // otherwise, the default factory is used. If the field is an extension that + // does not live in the same pool as the containing message's descriptor (e.g. + // it lives in an overlay pool), then a MessageFactory must be provided. + // If you have no idea what that meant, then you probably don't need to worry + // about it (don't provide a MessageFactory). WARNING: If the + // FieldDescriptor is for a compiled-in extension, then + // factory->GetPrototype(field->message_type() MUST return an instance of the + // compiled-in class for this type, NOT DynamicMessage. + virtual Message* MutableMessage(Message* message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const = 0; + + + // Repeated field getters ------------------------------------------ + // These get the value of one element of a repeated field. + + virtual int32 GetRepeatedInt32 (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual int64 GetRepeatedInt64 (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual uint32 GetRepeatedUInt32(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual uint64 GetRepeatedUInt64(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual float GetRepeatedFloat (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual double GetRepeatedDouble(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual bool GetRepeatedBool (const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual string GetRepeatedString(const Message& message, + const FieldDescriptor* field, + int index) const = 0; + virtual const EnumValueDescriptor* GetRepeatedEnum( + const Message& message, + const FieldDescriptor* field, int index) const = 0; + virtual const Message& GetRepeatedMessage( + const Message& message, + const FieldDescriptor* field, int index) const = 0; + + // See GetStringReference(), above. + virtual const string& GetRepeatedStringReference( + const Message& message, const FieldDescriptor* field, + int index, string* scratch) const = 0; + + + // Repeated field mutators ----------------------------------------- + // These mutate the value of one element of a repeated field. + + virtual void SetRepeatedInt32 (Message* message, + const FieldDescriptor* field, + int index, int32 value) const = 0; + virtual void SetRepeatedInt64 (Message* message, + const FieldDescriptor* field, + int index, int64 value) const = 0; + virtual void SetRepeatedUInt32(Message* message, + const FieldDescriptor* field, + int index, uint32 value) const = 0; + virtual void SetRepeatedUInt64(Message* message, + const FieldDescriptor* field, + int index, uint64 value) const = 0; + virtual void SetRepeatedFloat (Message* message, + const FieldDescriptor* field, + int index, float value) const = 0; + virtual void SetRepeatedDouble(Message* message, + const FieldDescriptor* field, + int index, double value) const = 0; + virtual void SetRepeatedBool (Message* message, + const FieldDescriptor* field, + int index, bool value) const = 0; + virtual void SetRepeatedString(Message* message, + const FieldDescriptor* field, + int index, const string& value) const = 0; + virtual void SetRepeatedEnum(Message* message, + const FieldDescriptor* field, int index, + const EnumValueDescriptor* value) const = 0; + // Get a mutable pointer to an element of a repeated field with a message + // type. + virtual Message* MutableRepeatedMessage( + Message* message, const FieldDescriptor* field, int index) const = 0; + + + // Repeated field adders ------------------------------------------- + // These add an element to a repeated field. + + virtual void AddInt32 (Message* message, + const FieldDescriptor* field, int32 value) const = 0; + virtual void AddInt64 (Message* message, + const FieldDescriptor* field, int64 value) const = 0; + virtual void AddUInt32(Message* message, + const FieldDescriptor* field, uint32 value) const = 0; + virtual void AddUInt64(Message* message, + const FieldDescriptor* field, uint64 value) const = 0; + virtual void AddFloat (Message* message, + const FieldDescriptor* field, float value) const = 0; + virtual void AddDouble(Message* message, + const FieldDescriptor* field, double value) const = 0; + virtual void AddBool (Message* message, + const FieldDescriptor* field, bool value) const = 0; + virtual void AddString(Message* message, + const FieldDescriptor* field, + const string& value) const = 0; + virtual void AddEnum (Message* message, + const FieldDescriptor* field, + const EnumValueDescriptor* value) const = 0; + // See MutableMessage() for comments on the "factory" parameter. + virtual Message* AddMessage(Message* message, + const FieldDescriptor* field, + MessageFactory* factory = NULL) const = 0; + + + // Extensions ------------------------------------------------------ + + // Try to find an extension of this message type by fully-qualified field + // name. Returns NULL if no extension is known for this name or number. + virtual const FieldDescriptor* FindKnownExtensionByName( + const string& name) const = 0; + + // Try to find an extension of this message type by field number. + // Returns NULL if no extension is known for this name or number. + virtual const FieldDescriptor* FindKnownExtensionByNumber( + int number) const = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Reflection); +}; + +// Abstract interface for a factory for message objects. +class LIBPROTOBUF_EXPORT MessageFactory { + public: + inline MessageFactory() {} + virtual ~MessageFactory(); + + // Given a Descriptor, gets or constructs the default (prototype) Message + // of that type. You can then call that message's New() method to construct + // a mutable message of that type. + // + // Calling this method twice with the same Descriptor returns the same + // object. The returned object remains property of the factory. Also, any + // objects created by calling the prototype's New() method share some data + // with the prototype, so these must be destoyed before the MessageFactory + // is destroyed. + // + // The given descriptor must outlive the returned message, and hence must + // outlive the MessageFactory. + // + // Some implementations do not support all types. GetPrototype() will + // return NULL if the descriptor passed in is not supported. + // + // This method may or may not be thread-safe depending on the implementation. + // Each implementation should document its own degree thread-safety. + virtual const Message* GetPrototype(const Descriptor* type) = 0; + + // Gets a MessageFactory which supports all generated, compiled-in messages. + // In other words, for any compiled-in type FooMessage, the following is true: + // MessageFactory::generated_factory()->GetPrototype( + // FooMessage::descriptor()) == FooMessage::default_instance() + // This factory supports all types which are found in + // DescriptorPool::generated_pool(). If given a descriptor from any other + // pool, GetPrototype() will return NULL. (You can also check if a + // descriptor is for a generated message by checking if + // descriptor->file()->pool() == DescriptorPool::generated_pool().) + // + // This factory is 100% thread-safe; calling GetPrototype() does not modify + // any shared data. + // + // This factory is a singleton. The caller must not delete the object. + static MessageFactory* generated_factory(); + + // For internal use only: Registers a .proto file at static initialization + // time, to be placed in generated_factory. The first time GetPrototype() + // is called with a descriptor from this file, |register_messages| will be + // called, with the file name as the parameter. It must call + // InternalRegisterGeneratedMessage() (below) to register each message type + // in the file. This strange mechanism is necessary because descriptors are + // built lazily, so we can't register types by their descriptor until we + // know that the descriptor exists. |filename| must be a permanent string. + static void InternalRegisterGeneratedFile( + const char* filename, void (*register_messages)(const string&)); + + // For internal use only: Registers a message type. Called only by the + // functions which are registered with InternalRegisterGeneratedFile(), + // above. + static void InternalRegisterGeneratedMessage(const Descriptor* descriptor, + const Message* prototype); + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageFactory); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_MESSAGE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc new file mode 100644 index 000000000..7c8f37dc7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc @@ -0,0 +1,334 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Authors: wink@google.com (Wink Saville), +// kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +MessageLite::~MessageLite() {} + +string MessageLite::InitializationErrorString() const { + return "(cannot determine missing fields for lite message)"; +} + +namespace { + +// When serializing, we first compute the byte size, then serialize the message. +// If serialization produces a different number of bytes than expected, we +// call this function, which crashes. The problem could be due to a bug in the +// protobuf implementation but is more likely caused by concurrent modification +// of the message. This function attempts to distinguish between the two and +// provide a useful error message. +void ByteSizeConsistencyError(int byte_size_before_serialization, + int byte_size_after_serialization, + int bytes_produced_by_serialization) { + GOOGLE_CHECK_EQ(byte_size_before_serialization, byte_size_after_serialization) + << "Protocol message was modified concurrently during serialization."; + GOOGLE_CHECK_EQ(bytes_produced_by_serialization, byte_size_before_serialization) + << "Byte size calculation and serialization were inconsistent. This " + "may indicate a bug in protocol buffers or it may be caused by " + "concurrent modification of the message."; + GOOGLE_LOG(FATAL) << "This shouldn't be called if all the sizes are equal."; +} + +string InitializationErrorMessage(const char* action, + const MessageLite& message) { + // Note: We want to avoid depending on strutil in the lite library, otherwise + // we'd use: + // + // return strings::Substitute( + // "Can't $0 message of type \"$1\" because it is missing required " + // "fields: $2", + // action, message.GetTypeName(), + // message.InitializationErrorString()); + + string result; + result += "Can't "; + result += action; + result += " message of type \""; + result += message.GetTypeName(); + result += "\" because it is missing required fields: "; + result += message.InitializationErrorString(); + return result; +} + +// Several of the Parse methods below just do one thing and then call another +// method. In a naive implementation, we might have ParseFromString() call +// ParseFromArray() which would call ParseFromZeroCopyStream() which would call +// ParseFromCodedStream() which would call MergeFromCodedStream() which would +// call MergePartialFromCodedStream(). However, when parsing very small +// messages, every function call introduces significant overhead. To avoid +// this without reproducing code, we use these forced-inline helpers. +// +// Note: GCC only allows GOOGLE_ATTRIBUTE_ALWAYS_INLINE on declarations, not +// definitions. +inline bool InlineMergeFromCodedStream(io::CodedInputStream* input, + MessageLite* message) + GOOGLE_ATTRIBUTE_ALWAYS_INLINE; +inline bool InlineParseFromCodedStream(io::CodedInputStream* input, + MessageLite* message) + GOOGLE_ATTRIBUTE_ALWAYS_INLINE; +inline bool InlineParsePartialFromCodedStream(io::CodedInputStream* input, + MessageLite* message) + GOOGLE_ATTRIBUTE_ALWAYS_INLINE; +inline bool InlineParseFromArray(const void* data, int size, + MessageLite* message) + GOOGLE_ATTRIBUTE_ALWAYS_INLINE; +inline bool InlineParsePartialFromArray(const void* data, int size, + MessageLite* message) + GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + +bool InlineMergeFromCodedStream(io::CodedInputStream* input, + MessageLite* message) { + if (!message->MergePartialFromCodedStream(input)) return false; + if (!message->IsInitialized()) { + GOOGLE_LOG(ERROR) << InitializationErrorMessage("parse", *message); + return false; + } + return true; +} + +bool InlineParseFromCodedStream(io::CodedInputStream* input, + MessageLite* message) { + message->Clear(); + return InlineMergeFromCodedStream(input, message); +} + +bool InlineParsePartialFromCodedStream(io::CodedInputStream* input, + MessageLite* message) { + message->Clear(); + return message->MergePartialFromCodedStream(input); +} + +bool InlineParseFromArray(const void* data, int size, MessageLite* message) { + io::CodedInputStream input(reinterpret_cast(data), size); + return InlineParseFromCodedStream(&input, message) && + input.ConsumedEntireMessage(); +} + +bool InlineParsePartialFromArray(const void* data, int size, + MessageLite* message) { + io::CodedInputStream input(reinterpret_cast(data), size); + return InlineParsePartialFromCodedStream(&input, message) && + input.ConsumedEntireMessage(); +} + +} // namespace + +bool MessageLite::MergeFromCodedStream(io::CodedInputStream* input) { + return InlineMergeFromCodedStream(input, this); +} + +bool MessageLite::ParseFromCodedStream(io::CodedInputStream* input) { + return InlineParseFromCodedStream(input, this); +} + +bool MessageLite::ParsePartialFromCodedStream(io::CodedInputStream* input) { + return InlineParsePartialFromCodedStream(input, this); +} + +bool MessageLite::ParseFromZeroCopyStream(io::ZeroCopyInputStream* input) { + io::CodedInputStream decoder(input); + return ParseFromCodedStream(&decoder) && decoder.ConsumedEntireMessage(); +} + +bool MessageLite::ParsePartialFromZeroCopyStream( + io::ZeroCopyInputStream* input) { + io::CodedInputStream decoder(input); + return ParsePartialFromCodedStream(&decoder) && + decoder.ConsumedEntireMessage(); +} + +bool MessageLite::ParseFromBoundedZeroCopyStream( + io::ZeroCopyInputStream* input, int size) { + io::CodedInputStream decoder(input); + decoder.PushLimit(size); + return ParseFromCodedStream(&decoder) && + decoder.ConsumedEntireMessage() && + decoder.BytesUntilLimit() == 0; +} + +bool MessageLite::ParsePartialFromBoundedZeroCopyStream( + io::ZeroCopyInputStream* input, int size) { + io::CodedInputStream decoder(input); + decoder.PushLimit(size); + return ParsePartialFromCodedStream(&decoder) && + decoder.ConsumedEntireMessage() && + decoder.BytesUntilLimit() == 0; +} + +bool MessageLite::ParseFromString(const string& data) { + return InlineParseFromArray(data.data(), data.size(), this); +} + +bool MessageLite::ParsePartialFromString(const string& data) { + return InlineParsePartialFromArray(data.data(), data.size(), this); +} + +bool MessageLite::ParseFromArray(const void* data, int size) { + return InlineParseFromArray(data, size, this); +} + +bool MessageLite::ParsePartialFromArray(const void* data, int size) { + return InlineParsePartialFromArray(data, size, this); +} + + +// =================================================================== + +uint8* MessageLite::SerializeWithCachedSizesToArray(uint8* target) const { + // We only optimize this when using optimize_for = SPEED. In other cases + // we just use the CodedOutputStream path. + int size = GetCachedSize(); + io::ArrayOutputStream out(target, size); + io::CodedOutputStream coded_out(&out); + SerializeWithCachedSizes(&coded_out); + GOOGLE_CHECK(!coded_out.HadError()); + return target + size; +} + +bool MessageLite::SerializeToCodedStream(io::CodedOutputStream* output) const { + GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage("serialize", *this); + return SerializePartialToCodedStream(output); +} + +bool MessageLite::SerializePartialToCodedStream( + io::CodedOutputStream* output) const { + const int size = ByteSize(); // Force size to be cached. + uint8* buffer = output->GetDirectBufferForNBytesAndAdvance(size); + if (buffer != NULL) { + uint8* end = SerializeWithCachedSizesToArray(buffer); + if (end - buffer != size) { + ByteSizeConsistencyError(size, ByteSize(), end - buffer); + } + return true; + } else { + int original_byte_count = output->ByteCount(); + SerializeWithCachedSizes(output); + if (output->HadError()) { + return false; + } + int final_byte_count = output->ByteCount(); + + if (final_byte_count - original_byte_count != size) { + ByteSizeConsistencyError(size, ByteSize(), + final_byte_count - original_byte_count); + } + + return true; + } +} + +bool MessageLite::SerializeToZeroCopyStream( + io::ZeroCopyOutputStream* output) const { + io::CodedOutputStream encoder(output); + return SerializeToCodedStream(&encoder); +} + +bool MessageLite::SerializePartialToZeroCopyStream( + io::ZeroCopyOutputStream* output) const { + io::CodedOutputStream encoder(output); + return SerializePartialToCodedStream(&encoder); +} + +bool MessageLite::AppendToString(string* output) const { + GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage("serialize", *this); + return AppendPartialToString(output); +} + +bool MessageLite::AppendPartialToString(string* output) const { + int old_size = output->size(); + int byte_size = ByteSize(); + STLStringResizeUninitialized(output, old_size + byte_size); + uint8* start = reinterpret_cast(string_as_array(output) + old_size); + uint8* end = SerializeWithCachedSizesToArray(start); + if (end - start != byte_size) { + ByteSizeConsistencyError(byte_size, ByteSize(), end - start); + } + return true; +} + +bool MessageLite::SerializeToString(string* output) const { + output->clear(); + return AppendToString(output); +} + +bool MessageLite::SerializePartialToString(string* output) const { + output->clear(); + return AppendPartialToString(output); +} + +bool MessageLite::SerializeToArray(void* data, int size) const { + GOOGLE_DCHECK(IsInitialized()) << InitializationErrorMessage("serialize", *this); + return SerializePartialToArray(data, size); +} + +bool MessageLite::SerializePartialToArray(void* data, int size) const { + int byte_size = ByteSize(); + if (size < byte_size) return false; + uint8* start = reinterpret_cast(data); + uint8* end = SerializeWithCachedSizesToArray(start); + if (end - start != byte_size) { + ByteSizeConsistencyError(byte_size, ByteSize(), end - start); + } + return true; +} + +string MessageLite::SerializeAsString() const { + // If the compiler implements the (Named) Return Value Optimization, + // the local variable 'result' will not actually reside on the stack + // of this function, but will be overlaid with the object that the + // caller supplied for the return value to be constructed in. + string output; + if (!AppendToString(&output)) + output.clear(); + return output; +} + +string MessageLite::SerializePartialAsString() const { + string output; + if (!AppendPartialToString(&output)) + output.clear(); + return output; +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h new file mode 100644 index 000000000..ebf4ba3c8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h @@ -0,0 +1,239 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Authors: wink@google.com (Wink Saville), +// kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Defines MessageLite, the abstract interface implemented by all (lite +// and non-lite) protocol message objects. + +#ifndef GOOGLE_PROTOBUF_MESSAGE_LITE_H__ +#define GOOGLE_PROTOBUF_MESSAGE_LITE_H__ + +#include +#include + +namespace google { +namespace protobuf { + +// Interface to light weight protocol messages. +// +// This interface is implemented by all protocol message objects. Non-lite +// messages additionally implement the Message interface, which is a +// subclass of MessageLite. Use MessageLite instead when you only need +// the subset of features which it supports -- namely, nothing that uses +// descriptors or reflection. You can instruct the protocol compiler +// to generate classes which implement only MessageLite, not the full +// Message interface, by adding the following line to the .proto file: +// +// option optimize_for = LITE_RUNTIME; +// +// This is particularly useful on resource-constrained systems where +// the full protocol buffers runtime library is too big. +// +// Note that on non-constrained systems (e.g. servers) when you need +// to link in lots of protocol definitions, a better way to reduce +// total code footprint is to use optimize_for = CODE_SIZE. This +// will make the generated code smaller while still supporting all the +// same features (at the expense of speed). optimize_for = LITE_RUNTIME +// is best when you only have a small number of message types linked +// into your binary, in which case the size of the protocol buffers +// runtime itself is the biggest problem. +class LIBPROTOBUF_EXPORT MessageLite { + public: + inline MessageLite() {} + virtual ~MessageLite(); + + // Basic Operations ------------------------------------------------ + + // Get the name of this message type, e.g. "foo.bar.BazProto". + virtual string GetTypeName() const = 0; + + // Construct a new instance of the same type. Ownership is passed to the + // caller. + virtual MessageLite* New() const = 0; + + // Clear all fields of the message and set them to their default values. + // Clear() avoids freeing memory, assuming that any memory allocated + // to hold parts of the message will be needed again to hold the next + // message. If you actually want to free the memory used by a Message, + // you must delete it. + virtual void Clear() = 0; + + // Quickly check if all required fields have values set. + virtual bool IsInitialized() const = 0; + + // This is not implemented for Lite messages -- it just returns "(cannot + // determine missing fields for lite message)". However, it is implemented + // for full messages. See message.h. + virtual string InitializationErrorString() const; + + // If |other| is the exact same class as this, calls MergeFrom(). Otherwise, + // results are undefined (probably crash). + virtual void CheckTypeAndMergeFrom(const MessageLite& other) = 0; + + // Parsing --------------------------------------------------------- + // Methods for parsing in protocol buffer format. Most of these are + // just simple wrappers around MergeFromCodedStream(). + + // Fill the message with a protocol buffer parsed from the given input + // stream. Returns false on a read error or if the input is in the + // wrong format. + bool ParseFromCodedStream(io::CodedInputStream* input); + // Like ParseFromCodedStream(), but accepts messages that are missing + // required fields. + bool ParsePartialFromCodedStream(io::CodedInputStream* input); + // Read a protocol buffer from the given zero-copy input stream. If + // successful, the entire input will be consumed. + bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input); + // Like ParseFromZeroCopyStream(), but accepts messages that are missing + // required fields. + bool ParsePartialFromZeroCopyStream(io::ZeroCopyInputStream* input); + // Read a protocol buffer from the given zero-copy input stream, expecting + // the message to be exactly "size" bytes long. If successful, exactly + // this many bytes will have been consumed from the input. + bool ParseFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, int size); + // Like ParseFromBoundedZeroCopyStream(), but accepts messages that are + // missing required fields. + bool ParsePartialFromBoundedZeroCopyStream(io::ZeroCopyInputStream* input, + int size); + // Parse a protocol buffer contained in a string. + bool ParseFromString(const string& data); + // Like ParseFromString(), but accepts messages that are missing + // required fields. + bool ParsePartialFromString(const string& data); + // Parse a protocol buffer contained in an array of bytes. + bool ParseFromArray(const void* data, int size); + // Like ParseFromArray(), but accepts messages that are missing + // required fields. + bool ParsePartialFromArray(const void* data, int size); + + + // Reads a protocol buffer from the stream and merges it into this + // Message. Singular fields read from the input overwrite what is + // already in the Message and repeated fields are appended to those + // already present. + // + // It is the responsibility of the caller to call input->LastTagWas() + // (for groups) or input->ConsumedEntireMessage() (for non-groups) after + // this returns to verify that the message's end was delimited correctly. + // + // ParsefromCodedStream() is implemented as Clear() followed by + // MergeFromCodedStream(). + bool MergeFromCodedStream(io::CodedInputStream* input); + + // Like MergeFromCodedStream(), but succeeds even if required fields are + // missing in the input. + // + // MergeFromCodedStream() is just implemented as MergePartialFromCodedStream() + // followed by IsInitialized(). + virtual bool MergePartialFromCodedStream(io::CodedInputStream* input) = 0; + + // Serialization --------------------------------------------------- + // Methods for serializing in protocol buffer format. Most of these + // are just simple wrappers around ByteSize() and SerializeWithCachedSizes(). + + // Write a protocol buffer of this message to the given output. Returns + // false on a write error. If the message is missing required fields, + // this may GOOGLE_CHECK-fail. + bool SerializeToCodedStream(io::CodedOutputStream* output) const; + // Like SerializeToCodedStream(), but allows missing required fields. + bool SerializePartialToCodedStream(io::CodedOutputStream* output) const; + // Write the message to the given zero-copy output stream. All required + // fields must be set. + bool SerializeToZeroCopyStream(io::ZeroCopyOutputStream* output) const; + // Like SerializeToZeroCopyStream(), but allows missing required fields. + bool SerializePartialToZeroCopyStream(io::ZeroCopyOutputStream* output) const; + // Serialize the message and store it in the given string. All required + // fields must be set. + bool SerializeToString(string* output) const; + // Like SerializeToString(), but allows missing required fields. + bool SerializePartialToString(string* output) const; + // Serialize the message and store it in the given byte array. All required + // fields must be set. + bool SerializeToArray(void* data, int size) const; + // Like SerializeToArray(), but allows missing required fields. + bool SerializePartialToArray(void* data, int size) const; + + // Make a string encoding the message. Is equivalent to calling + // SerializeToString() on a string and using that. Returns the empty + // string if SerializeToString() would have returned an error. + // Note: If you intend to generate many such strings, you may + // reduce heap fragmentation by instead re-using the same string + // object with calls to SerializeToString(). + string SerializeAsString() const; + // Like SerializeAsString(), but allows missing required fields. + string SerializePartialAsString() const; + + // Like SerializeToString(), but appends to the data to the string's existing + // contents. All required fields must be set. + bool AppendToString(string* output) const; + // Like AppendToString(), but allows missing required fields. + bool AppendPartialToString(string* output) const; + + // Computes the serialized size of the message. This recursively calls + // ByteSize() on all embedded messages. If a subclass does not override + // this, it MUST override SetCachedSize(). + virtual int ByteSize() const = 0; + + // Serializes the message without recomputing the size. The message must + // not have changed since the last call to ByteSize(); if it has, the results + // are undefined. + virtual void SerializeWithCachedSizes( + io::CodedOutputStream* output) const = 0; + + // Like SerializeWithCachedSizes, but writes directly to *target, returning + // a pointer to the byte immediately after the last byte written. "target" + // must point at a byte array of at least ByteSize() bytes. + virtual uint8* SerializeWithCachedSizesToArray(uint8* target) const; + + // Returns the result of the last call to ByteSize(). An embedded message's + // size is needed both to serialize it (because embedded messages are + // length-delimited) and to compute the outer message's size. Caching + // the size avoids computing it multiple times. + // + // ByteSize() does not automatically use the cached size when available + // because this would require invalidating it every time the message was + // modified, which would be too hard and expensive. (E.g. if a deeply-nested + // sub-message is changed, all of its parents' cached sizes would need to be + // invalidated, which is too much work for an otherwise inlined setter + // method.) + virtual int GetCachedSize() const = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MessageLite); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_MESSAGE_LITE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc new file mode 100644 index 000000000..33b9e77c8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc @@ -0,0 +1,281 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include +#include +#ifdef _MSC_VER +#include +#else +#include +#endif +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace google { +namespace protobuf { + +#ifndef O_BINARY +#ifdef _O_BINARY +#define O_BINARY _O_BINARY +#else +#define O_BINARY 0 // If this isn't defined, the platform doesn't need it. +#endif +#endif + +TEST(MessageTest, SerializeHelpers) { + // TODO(kenton): Test more helpers? They're all two-liners so it seems + // like a waste of time. + + protobuf_unittest::TestAllTypes message; + TestUtil::SetAllFields(&message); + stringstream stream; + + string str1("foo"); + string str2("bar"); + + EXPECT_TRUE(message.SerializeToString(&str1)); + EXPECT_TRUE(message.AppendToString(&str2)); + EXPECT_TRUE(message.SerializeToOstream(&stream)); + + EXPECT_EQ(str1.size() + 3, str2.size()); + EXPECT_EQ("bar", str2.substr(0, 3)); + // Don't use EXPECT_EQ because we don't want to dump raw binary data to + // stdout. + EXPECT_TRUE(str2.substr(3) == str1); + + // GCC gives some sort of error if we try to just do stream.str() == str1. + string temp = stream.str(); + EXPECT_TRUE(temp == str1); + + EXPECT_TRUE(message.SerializeAsString() == str1); + +} + +TEST(MessageTest, SerializeToBrokenOstream) { + ofstream out; + protobuf_unittest::TestAllTypes message; + message.set_optional_int32(123); + + EXPECT_FALSE(message.SerializeToOstream(&out)); +} + +TEST(MessageTest, ParseFromFileDescriptor) { + string filename = TestSourceDir() + + "/google/protobuf/testdata/golden_message"; + int file = open(filename.c_str(), O_RDONLY | O_BINARY); + + unittest::TestAllTypes message; + EXPECT_TRUE(message.ParseFromFileDescriptor(file)); + TestUtil::ExpectAllFieldsSet(message); + + EXPECT_GE(close(file), 0); +} + +TEST(MessageTest, ParsePackedFromFileDescriptor) { + string filename = + TestSourceDir() + + "/google/protobuf/testdata/golden_packed_fields_message"; + int file = open(filename.c_str(), O_RDONLY | O_BINARY); + + unittest::TestPackedTypes message; + EXPECT_TRUE(message.ParseFromFileDescriptor(file)); + TestUtil::ExpectPackedFieldsSet(message); + + EXPECT_GE(close(file), 0); +} + +TEST(MessageTest, ParseHelpers) { + // TODO(kenton): Test more helpers? They're all two-liners so it seems + // like a waste of time. + string data; + + { + // Set up. + protobuf_unittest::TestAllTypes message; + TestUtil::SetAllFields(&message); + message.SerializeToString(&data); + } + + { + // Test ParseFromString. + protobuf_unittest::TestAllTypes message; + EXPECT_TRUE(message.ParseFromString(data)); + TestUtil::ExpectAllFieldsSet(message); + } + + { + // Test ParseFromIstream. + protobuf_unittest::TestAllTypes message; + stringstream stream(data); + EXPECT_TRUE(message.ParseFromIstream(&stream)); + EXPECT_TRUE(stream.eof()); + TestUtil::ExpectAllFieldsSet(message); + } + + { + // Test ParseFromBoundedZeroCopyStream. + string data_with_junk(data); + data_with_junk.append("some junk on the end"); + io::ArrayInputStream stream(data_with_junk.data(), data_with_junk.size()); + protobuf_unittest::TestAllTypes message; + EXPECT_TRUE(message.ParseFromBoundedZeroCopyStream(&stream, data.size())); + TestUtil::ExpectAllFieldsSet(message); + } + + { + // Test that ParseFromBoundedZeroCopyStream fails (but doesn't crash) if + // EOF is reached before the expected number of bytes. + io::ArrayInputStream stream(data.data(), data.size()); + protobuf_unittest::TestAllTypes message; + EXPECT_FALSE( + message.ParseFromBoundedZeroCopyStream(&stream, data.size() + 1)); + } +} + +TEST(MessageTest, ParseFailsIfNotInitialized) { + unittest::TestRequired message; + vector errors; + + { + ScopedMemoryLog log; + EXPECT_FALSE(message.ParseFromString("")); + errors = log.GetMessages(ERROR); + } + + ASSERT_EQ(1, errors.size()); + EXPECT_EQ("Can't parse message of type \"protobuf_unittest.TestRequired\" " + "because it is missing required fields: a, b, c", + errors[0]); +} + +TEST(MessageTest, BypassInitializationCheckOnParse) { + unittest::TestRequired message; + io::ArrayInputStream raw_input(NULL, 0); + io::CodedInputStream input(&raw_input); + EXPECT_TRUE(message.MergePartialFromCodedStream(&input)); +} + +TEST(MessageTest, InitializationErrorString) { + unittest::TestRequired message; + EXPECT_EQ("a, b, c", message.InitializationErrorString()); +} + +#ifdef GTEST_HAS_DEATH_TEST // death tests do not work on Windows yet. + +TEST(MessageTest, SerializeFailsIfNotInitialized) { + unittest::TestRequired message; + string data; + EXPECT_DEBUG_DEATH(EXPECT_TRUE(message.SerializeToString(&data)), + "Can't serialize message of type \"protobuf_unittest.TestRequired\" because " + "it is missing required fields: a, b, c"); +} + +TEST(MessageTest, CheckInitialized) { + unittest::TestRequired message; + EXPECT_DEATH(message.CheckInitialized(), + "Message of type \"protobuf_unittest.TestRequired\" is missing required " + "fields: a, b, c"); +} + +#endif // GTEST_HAS_DEATH_TEST + +TEST(MessageTest, BypassInitializationCheckOnSerialize) { + unittest::TestRequired message; + io::ArrayOutputStream raw_output(NULL, 0); + io::CodedOutputStream output(&raw_output); + EXPECT_TRUE(message.SerializePartialToCodedStream(&output)); +} + +TEST(MessageTest, FindInitializationErrors) { + unittest::TestRequired message; + vector errors; + message.FindInitializationErrors(&errors); + ASSERT_EQ(3, errors.size()); + EXPECT_EQ("a", errors[0]); + EXPECT_EQ("b", errors[1]); + EXPECT_EQ("c", errors[2]); +} + +TEST(MessageTest, ParseFailsOnInvalidMessageEnd) { + unittest::TestAllTypes message; + + // Control case. + EXPECT_TRUE(message.ParseFromArray("", 0)); + + // The byte is a valid varint, but not a valid tag (zero). + EXPECT_FALSE(message.ParseFromArray("\0", 1)); + + // The byte is a malformed varint. + EXPECT_FALSE(message.ParseFromArray("\200", 1)); + + // The byte is an endgroup tag, but we aren't parsing a group. + EXPECT_FALSE(message.ParseFromArray("\014", 1)); +} + +TEST(MessageFactoryTest, GeneratedFactoryLookup) { + EXPECT_EQ( + MessageFactory::generated_factory()->GetPrototype( + protobuf_unittest::TestAllTypes::descriptor()), + &protobuf_unittest::TestAllTypes::default_instance()); +} + +TEST(MessageFactoryTest, GeneratedFactoryUnknownType) { + // Construct a new descriptor. + DescriptorPool pool; + FileDescriptorProto file; + file.set_name("foo.proto"); + file.add_message_type()->set_name("Foo"); + const Descriptor* descriptor = pool.BuildFile(file)->message_type(0); + + // Trying to construct it should return NULL. + EXPECT_TRUE( + MessageFactory::generated_factory()->GetPrototype(descriptor) == NULL); +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h new file mode 100644 index 000000000..60cd3994c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h @@ -0,0 +1,64 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file exists solely to document the google::protobuf namespace. +// It is not compiled into anything, but it may be read by an automated +// documentation generator. + +namespace google { + +// Core components of the Protocol Buffers runtime library. +// +// The files in this package represent the core of the Protocol Buffer +// system. All of them are part of the libprotobuf library. +// +// A note on thread-safety: +// +// Thread-safety in the Protocol Buffer library follows a simple rule: +// unless explicitly noted otherwise, it is always safe to use an object +// from multiple threads simultaneously as long as the object is declared +// const in all threads (or, it is only used in ways that would be allowed +// if it were declared const). However, if an object is accessed in one +// thread in a way that would not be allowed if it were const, then it is +// not safe to access that object in any other thread simultaneously. +// +// Put simply, read-only access to an object can happen in multiple threads +// simultaneously, but write access can only happen in a single thread at +// a time. +// +// The implementation does contain some "const" methods which actually modify +// the object behind the scenes -- e.g., to cache results -- but in these cases +// mutex locking is used to make the access thread-safe. +namespace protobuf {} +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc new file mode 100644 index 000000000..897c0d7c8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc @@ -0,0 +1,262 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +void ReflectionOps::Copy(const Message& from, Message* to) { + if (&from == to) return; + Clear(to); + Merge(from, to); +} + +void ReflectionOps::Merge(const Message& from, Message* to) { + GOOGLE_CHECK_NE(&from, to); + + const Descriptor* descriptor = from.GetDescriptor(); + GOOGLE_CHECK_EQ(to->GetDescriptor(), descriptor) + << "Tried to merge messages of different types."; + + const Reflection* from_reflection = from.GetReflection(); + const Reflection* to_reflection = to->GetReflection(); + + vector fields; + from_reflection->ListFields(from, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + + if (field->is_repeated()) { + int count = from_reflection->FieldSize(from, field); + for (int j = 0; j < count; j++) { + switch (field->cpp_type()) { +#define HANDLE_TYPE(CPPTYPE, METHOD) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + to_reflection->Add##METHOD(to, field, \ + from_reflection->GetRepeated##METHOD(from, field, j)); \ + break; + + HANDLE_TYPE(INT32 , Int32 ); + HANDLE_TYPE(INT64 , Int64 ); + HANDLE_TYPE(UINT32, UInt32); + HANDLE_TYPE(UINT64, UInt64); + HANDLE_TYPE(FLOAT , Float ); + HANDLE_TYPE(DOUBLE, Double); + HANDLE_TYPE(BOOL , Bool ); + HANDLE_TYPE(STRING, String); + HANDLE_TYPE(ENUM , Enum ); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_MESSAGE: + to_reflection->AddMessage(to, field)->MergeFrom( + from_reflection->GetRepeatedMessage(from, field, j)); + break; + } + } + } else { + switch (field->cpp_type()) { +#define HANDLE_TYPE(CPPTYPE, METHOD) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + to_reflection->Set##METHOD(to, field, \ + from_reflection->Get##METHOD(from, field)); \ + break; + + HANDLE_TYPE(INT32 , Int32 ); + HANDLE_TYPE(INT64 , Int64 ); + HANDLE_TYPE(UINT32, UInt32); + HANDLE_TYPE(UINT64, UInt64); + HANDLE_TYPE(FLOAT , Float ); + HANDLE_TYPE(DOUBLE, Double); + HANDLE_TYPE(BOOL , Bool ); + HANDLE_TYPE(STRING, String); + HANDLE_TYPE(ENUM , Enum ); +#undef HANDLE_TYPE + + case FieldDescriptor::CPPTYPE_MESSAGE: + to_reflection->MutableMessage(to, field)->MergeFrom( + from_reflection->GetMessage(from, field)); + break; + } + } + } + + to_reflection->MutableUnknownFields(to)->MergeFrom( + from_reflection->GetUnknownFields(from)); +} + +void ReflectionOps::Clear(Message* message) { + const Reflection* reflection = message->GetReflection(); + + vector fields; + reflection->ListFields(*message, &fields); + for (int i = 0; i < fields.size(); i++) { + reflection->ClearField(message, fields[i]); + } + + reflection->MutableUnknownFields(message)->Clear(); +} + +bool ReflectionOps::IsInitialized(const Message& message) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* reflection = message.GetReflection(); + + // Check required fields of this message. + for (int i = 0; i < descriptor->field_count(); i++) { + if (descriptor->field(i)->is_required()) { + if (!reflection->HasField(message, descriptor->field(i))) { + return false; + } + } + } + + // Check that sub-messages are initialized. + vector fields; + reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (field->is_repeated()) { + int size = reflection->FieldSize(message, field); + + for (int i = 0; i < size; i++) { + if (!reflection->GetRepeatedMessage(message, field, i) + .IsInitialized()) { + return false; + } + } + } else { + if (!reflection->GetMessage(message, field).IsInitialized()) { + return false; + } + } + } + } + + return true; +} + +void ReflectionOps::DiscardUnknownFields(Message* message) { + const Reflection* reflection = message->GetReflection(); + + reflection->MutableUnknownFields(message)->Clear(); + + vector fields; + reflection->ListFields(*message, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (field->is_repeated()) { + int size = reflection->FieldSize(*message, field); + for (int i = 0; i < size; i++) { + reflection->MutableRepeatedMessage(message, field, i) + ->DiscardUnknownFields(); + } + } else { + reflection->MutableMessage(message, field)->DiscardUnknownFields(); + } + } + } +} + +static string SubMessagePrefix(const string& prefix, + const FieldDescriptor* field, + int index) { + string result(prefix); + if (field->is_extension()) { + result.append("("); + result.append(field->full_name()); + result.append(")"); + } else { + result.append(field->name()); + } + if (index != -1) { + result.append("["); + result.append(SimpleItoa(index)); + result.append("]"); + } + result.append("."); + return result; +} + +void ReflectionOps::FindInitializationErrors( + const Message& message, + const string& prefix, + vector* errors) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* reflection = message.GetReflection(); + + // Check required fields of this message. + for (int i = 0; i < descriptor->field_count(); i++) { + if (descriptor->field(i)->is_required()) { + if (!reflection->HasField(message, descriptor->field(i))) { + errors->push_back(prefix + descriptor->field(i)->name()); + } + } + } + + // Check sub-messages. + vector fields; + reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + const FieldDescriptor* field = fields[i]; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + + if (field->is_repeated()) { + int size = reflection->FieldSize(message, field); + + for (int i = 0; i < size; i++) { + const Message& sub_message = + reflection->GetRepeatedMessage(message, field, i); + FindInitializationErrors(sub_message, + SubMessagePrefix(prefix, field, i), + errors); + } + } else { + const Message& sub_message = reflection->GetMessage(message, field); + FindInitializationErrors(sub_message, + SubMessagePrefix(prefix, field, -1), + errors); + } + } + } +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h new file mode 100644 index 000000000..355a0a5d2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h @@ -0,0 +1,80 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_REFLECTION_OPS_H__ +#define GOOGLE_PROTOBUF_REFLECTION_OPS_H__ + +#include + +namespace google { +namespace protobuf { +namespace internal { + +// Basic operations that can be performed using reflection. +// These can be used as a cheap way to implement the corresponding +// methods of the Message interface, though they are likely to be +// slower than implementations tailored for the specific message type. +// +// This class should stay limited to operations needed to implement +// the Message interface. +// +// This class is really a namespace that contains only static methods. +class LIBPROTOBUF_EXPORT ReflectionOps { + public: + static void Copy(const Message& from, Message* to); + static void Merge(const Message& from, Message* to); + static void Clear(Message* message); + static bool IsInitialized(const Message& message); + static void DiscardUnknownFields(Message* message); + + // Finds all unset required fields in the message and adds their full + // paths (e.g. "foo.bar[5].baz") to *names. "prefix" will be attached to + // the front of each name. + static void FindInitializationErrors(const Message& message, + const string& prefix, + vector* errors); + + private: + // All methods are static. No need to construct. + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionOps); +}; + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_REFLECTION_OPS_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc new file mode 100644 index 000000000..1cd56f1e6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc @@ -0,0 +1,405 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { +namespace { + +TEST(ReflectionOpsTest, SanityCheck) { + unittest::TestAllTypes message; + + TestUtil::SetAllFields(&message); + TestUtil::ExpectAllFieldsSet(message); +} + +TEST(ReflectionOpsTest, Copy) { + unittest::TestAllTypes message, message2; + + TestUtil::SetAllFields(&message); + + ReflectionOps::Copy(message, &message2); + + TestUtil::ExpectAllFieldsSet(message2); + + // Copying from self should be a no-op. + ReflectionOps::Copy(message2, &message2); + TestUtil::ExpectAllFieldsSet(message2); +} + +TEST(ReflectionOpsTest, CopyExtensions) { + unittest::TestAllExtensions message, message2; + + TestUtil::SetAllExtensions(&message); + + ReflectionOps::Copy(message, &message2); + + TestUtil::ExpectAllExtensionsSet(message2); +} + +TEST(ReflectionOpsTest, Merge) { + // Note: Copy is implemented in terms of Merge() so technically the Copy + // test already tested most of this. + + unittest::TestAllTypes message, message2; + + TestUtil::SetAllFields(&message); + + // This field will test merging into an empty spot. + message2.set_optional_int32(message.optional_int32()); + message.clear_optional_int32(); + + // This tests overwriting. + message2.set_optional_string(message.optional_string()); + message.set_optional_string("something else"); + + // This tests concatenating. + message2.add_repeated_int32(message.repeated_int32(1)); + int32 i = message.repeated_int32(0); + message.clear_repeated_int32(); + message.add_repeated_int32(i); + + ReflectionOps::Merge(message2, &message); + + TestUtil::ExpectAllFieldsSet(message); +} + +TEST(ReflectionOpsTest, MergeExtensions) { + // Note: Copy is implemented in terms of Merge() so technically the Copy + // test already tested most of this. + + unittest::TestAllExtensions message, message2; + + TestUtil::SetAllExtensions(&message); + + // This field will test merging into an empty spot. + message2.SetExtension(unittest::optional_int32_extension, + message.GetExtension(unittest::optional_int32_extension)); + message.ClearExtension(unittest::optional_int32_extension); + + // This tests overwriting. + message2.SetExtension(unittest::optional_string_extension, + message.GetExtension(unittest::optional_string_extension)); + message.SetExtension(unittest::optional_string_extension, "something else"); + + // This tests concatenating. + message2.AddExtension(unittest::repeated_int32_extension, + message.GetExtension(unittest::repeated_int32_extension, 1)); + int32 i = message.GetExtension(unittest::repeated_int32_extension, 0); + message.ClearExtension(unittest::repeated_int32_extension); + message.AddExtension(unittest::repeated_int32_extension, i); + + ReflectionOps::Merge(message2, &message); + + TestUtil::ExpectAllExtensionsSet(message); +} + +TEST(ReflectionOpsTest, MergeUnknown) { + // Test that the messages' UnknownFieldSets are correctly merged. + unittest::TestEmptyMessage message1, message2; + message1.mutable_unknown_fields()->AddVarint(1234, 1); + message2.mutable_unknown_fields()->AddVarint(1234, 2); + + ReflectionOps::Merge(message2, &message1); + + ASSERT_EQ(2, message1.unknown_fields().field_count()); + ASSERT_EQ(UnknownField::TYPE_VARINT, + message1.unknown_fields().field(0).type()); + EXPECT_EQ(1, message1.unknown_fields().field(0).varint()); + ASSERT_EQ(UnknownField::TYPE_VARINT, + message1.unknown_fields().field(1).type()); + EXPECT_EQ(2, message1.unknown_fields().field(1).varint()); +} + +#ifdef GTEST_HAS_DEATH_TEST + +TEST(ReflectionOpsTest, MergeFromSelf) { + // Note: Copy is implemented in terms of Merge() so technically the Copy + // test already tested most of this. + + unittest::TestAllTypes message; + + EXPECT_DEATH( + ReflectionOps::Merge(message, &message), + "&from"); +} + +#endif // GTEST_HAS_DEATH_TEST + +TEST(ReflectionOpsTest, Clear) { + unittest::TestAllTypes message; + + TestUtil::SetAllFields(&message); + + ReflectionOps::Clear(&message); + + TestUtil::ExpectClear(message); + + // Check that getting embedded messages returns the objects created during + // SetAllFields() rather than default instances. + EXPECT_NE(&unittest::TestAllTypes::OptionalGroup::default_instance(), + &message.optionalgroup()); + EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), + &message.optional_nested_message()); + EXPECT_NE(&unittest::ForeignMessage::default_instance(), + &message.optional_foreign_message()); + EXPECT_NE(&unittest_import::ImportMessage::default_instance(), + &message.optional_import_message()); +} + +TEST(ReflectionOpsTest, ClearExtensions) { + unittest::TestAllExtensions message; + + TestUtil::SetAllExtensions(&message); + + ReflectionOps::Clear(&message); + + TestUtil::ExpectExtensionsClear(message); + + // Check that getting embedded messages returns the objects created during + // SetAllExtensions() rather than default instances. + EXPECT_NE(&unittest::OptionalGroup_extension::default_instance(), + &message.GetExtension(unittest::optionalgroup_extension)); + EXPECT_NE(&unittest::TestAllTypes::NestedMessage::default_instance(), + &message.GetExtension(unittest::optional_nested_message_extension)); + EXPECT_NE(&unittest::ForeignMessage::default_instance(), + &message.GetExtension( + unittest::optional_foreign_message_extension)); + EXPECT_NE(&unittest_import::ImportMessage::default_instance(), + &message.GetExtension(unittest::optional_import_message_extension)); +} + +TEST(ReflectionOpsTest, ClearUnknown) { + // Test that the message's UnknownFieldSet is correctly cleared. + unittest::TestEmptyMessage message; + message.mutable_unknown_fields()->AddVarint(1234, 1); + + ReflectionOps::Clear(&message); + + EXPECT_EQ(0, message.unknown_fields().field_count()); +} + +TEST(ReflectionOpsTest, DiscardUnknownFields) { + unittest::TestAllTypes message; + TestUtil::SetAllFields(&message); + + // Set some unknown fields in message. + message.mutable_unknown_fields() + ->AddVarint(123456, 654321); + message.mutable_optional_nested_message() + ->mutable_unknown_fields() + ->AddVarint(123456, 654321); + message.mutable_repeated_nested_message(0) + ->mutable_unknown_fields() + ->AddVarint(123456, 654321); + + EXPECT_EQ(1, message.unknown_fields().field_count()); + EXPECT_EQ(1, message.optional_nested_message() + .unknown_fields().field_count()); + EXPECT_EQ(1, message.repeated_nested_message(0) + .unknown_fields().field_count()); + + // Discard them. + ReflectionOps::DiscardUnknownFields(&message); + TestUtil::ExpectAllFieldsSet(message); + + EXPECT_EQ(0, message.unknown_fields().field_count()); + EXPECT_EQ(0, message.optional_nested_message() + .unknown_fields().field_count()); + EXPECT_EQ(0, message.repeated_nested_message(0) + .unknown_fields().field_count()); +} + +TEST(ReflectionOpsTest, DiscardUnknownExtensions) { + unittest::TestAllExtensions message; + TestUtil::SetAllExtensions(&message); + + // Set some unknown fields. + message.mutable_unknown_fields() + ->AddVarint(123456, 654321); + message.MutableExtension(unittest::optional_nested_message_extension) + ->mutable_unknown_fields() + ->AddVarint(123456, 654321); + message.MutableExtension(unittest::repeated_nested_message_extension, 0) + ->mutable_unknown_fields() + ->AddVarint(123456, 654321); + + EXPECT_EQ(1, message.unknown_fields().field_count()); + EXPECT_EQ(1, + message.GetExtension(unittest::optional_nested_message_extension) + .unknown_fields().field_count()); + EXPECT_EQ(1, + message.GetExtension(unittest::repeated_nested_message_extension, 0) + .unknown_fields().field_count()); + + // Discard them. + ReflectionOps::DiscardUnknownFields(&message); + TestUtil::ExpectAllExtensionsSet(message); + + EXPECT_EQ(0, message.unknown_fields().field_count()); + EXPECT_EQ(0, + message.GetExtension(unittest::optional_nested_message_extension) + .unknown_fields().field_count()); + EXPECT_EQ(0, + message.GetExtension(unittest::repeated_nested_message_extension, 0) + .unknown_fields().field_count()); +} + +TEST(ReflectionOpsTest, IsInitialized) { + unittest::TestRequired message; + + EXPECT_FALSE(ReflectionOps::IsInitialized(message)); + message.set_a(1); + EXPECT_FALSE(ReflectionOps::IsInitialized(message)); + message.set_b(2); + EXPECT_FALSE(ReflectionOps::IsInitialized(message)); + message.set_c(3); + EXPECT_TRUE(ReflectionOps::IsInitialized(message)); +} + +TEST(ReflectionOpsTest, ForeignIsInitialized) { + unittest::TestRequiredForeign message; + + // Starts out initialized because the foreign message is itself an optional + // field. + EXPECT_TRUE(ReflectionOps::IsInitialized(message)); + + // Once we create that field, the message is no longer initialized. + message.mutable_optional_message(); + EXPECT_FALSE(ReflectionOps::IsInitialized(message)); + + // Initialize it. Now we're initialized. + message.mutable_optional_message()->set_a(1); + message.mutable_optional_message()->set_b(2); + message.mutable_optional_message()->set_c(3); + EXPECT_TRUE(ReflectionOps::IsInitialized(message)); + + // Add a repeated version of the message. No longer initialized. + unittest::TestRequired* sub_message = message.add_repeated_message(); + EXPECT_FALSE(ReflectionOps::IsInitialized(message)); + + // Initialize that repeated version. + sub_message->set_a(1); + sub_message->set_b(2); + sub_message->set_c(3); + EXPECT_TRUE(ReflectionOps::IsInitialized(message)); +} + +TEST(ReflectionOpsTest, ExtensionIsInitialized) { + unittest::TestAllExtensions message; + + // Starts out initialized because the foreign message is itself an optional + // field. + EXPECT_TRUE(ReflectionOps::IsInitialized(message)); + + // Once we create that field, the message is no longer initialized. + message.MutableExtension(unittest::TestRequired::single); + EXPECT_FALSE(ReflectionOps::IsInitialized(message)); + + // Initialize it. Now we're initialized. + message.MutableExtension(unittest::TestRequired::single)->set_a(1); + message.MutableExtension(unittest::TestRequired::single)->set_b(2); + message.MutableExtension(unittest::TestRequired::single)->set_c(3); + EXPECT_TRUE(ReflectionOps::IsInitialized(message)); + + // Add a repeated version of the message. No longer initialized. + message.AddExtension(unittest::TestRequired::multi); + EXPECT_FALSE(ReflectionOps::IsInitialized(message)); + + // Initialize that repeated version. + message.MutableExtension(unittest::TestRequired::multi, 0)->set_a(1); + message.MutableExtension(unittest::TestRequired::multi, 0)->set_b(2); + message.MutableExtension(unittest::TestRequired::multi, 0)->set_c(3); + EXPECT_TRUE(ReflectionOps::IsInitialized(message)); +} + +static string FindInitializationErrors(const Message& message) { + vector errors; + ReflectionOps::FindInitializationErrors(message, "", &errors); + return JoinStrings(errors, ","); +} + +TEST(ReflectionOpsTest, FindInitializationErrors) { + unittest::TestRequired message; + EXPECT_EQ("a,b,c", FindInitializationErrors(message)); +} + +TEST(ReflectionOpsTest, FindForeignInitializationErrors) { + unittest::TestRequiredForeign message; + message.mutable_optional_message(); + message.add_repeated_message(); + message.add_repeated_message(); + EXPECT_EQ("optional_message.a," + "optional_message.b," + "optional_message.c," + "repeated_message[0].a," + "repeated_message[0].b," + "repeated_message[0].c," + "repeated_message[1].a," + "repeated_message[1].b," + "repeated_message[1].c", + FindInitializationErrors(message)); +} + +TEST(ReflectionOpsTest, FindExtensionInitializationErrors) { + unittest::TestAllExtensions message; + message.MutableExtension(unittest::TestRequired::single); + message.AddExtension(unittest::TestRequired::multi); + message.AddExtension(unittest::TestRequired::multi); + EXPECT_EQ("(protobuf_unittest.TestRequired.single).a," + "(protobuf_unittest.TestRequired.single).b," + "(protobuf_unittest.TestRequired.single).c," + "(protobuf_unittest.TestRequired.multi)[0].a," + "(protobuf_unittest.TestRequired.multi)[0].b," + "(protobuf_unittest.TestRequired.multi)[0].c," + "(protobuf_unittest.TestRequired.multi)[1].a," + "(protobuf_unittest.TestRequired.multi)[1].b," + "(protobuf_unittest.TestRequired.multi)[1].c", + FindInitializationErrors(message)); +} + +} // namespace +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc new file mode 100644 index 000000000..09377742a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc @@ -0,0 +1,98 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include + +namespace google { +namespace protobuf { + +namespace internal { + +void RepeatedPtrFieldBase::Reserve(int new_size) { + if (total_size_ >= new_size) return; + + void** old_elements = elements_; + total_size_ = max(total_size_ * 2, new_size); + elements_ = new void*[total_size_]; + memcpy(elements_, old_elements, allocated_size_ * sizeof(elements_[0])); + if (old_elements != initial_space_) { + delete [] old_elements; + } +} + +void RepeatedPtrFieldBase::Swap(RepeatedPtrFieldBase* other) { + void** swap_elements = elements_; + int swap_current_size = current_size_; + int swap_allocated_size = allocated_size_; + int swap_total_size = total_size_; + // We may not be using initial_space_ but it's not worth checking. Just + // copy it anyway. + void* swap_initial_space[kInitialSize]; + memcpy(swap_initial_space, initial_space_, sizeof(initial_space_)); + + elements_ = other->elements_; + current_size_ = other->current_size_; + allocated_size_ = other->allocated_size_; + total_size_ = other->total_size_; + memcpy(initial_space_, other->initial_space_, sizeof(initial_space_)); + + other->elements_ = swap_elements; + other->current_size_ = swap_current_size; + other->allocated_size_ = swap_allocated_size; + other->total_size_ = swap_total_size; + memcpy(other->initial_space_, swap_initial_space, sizeof(swap_initial_space)); + + if (elements_ == other->initial_space_) { + elements_ = initial_space_; + } + if (other->elements_ == initial_space_) { + other->elements_ = other->initial_space_; + } +} + +string* StringTypeHandlerBase::New() { + return new string; +} +void StringTypeHandlerBase::Delete(string* value) { + delete value; +} + +} // namespace internal + + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h new file mode 100644 index 000000000..aed4ce9f2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h @@ -0,0 +1,1295 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// RepeatedField and RepeatedPtrField are used by generated protocol message +// classes to manipulate repeated fields. These classes are very similar to +// STL's vector, but include a number of optimizations found to be useful +// specifically in the case of Protocol Buffers. RepeatedPtrField is +// particularly different from STL vector as it manages ownership of the +// pointers that it contains. +// +// Typically, clients should not need to access RepeatedField objects directly, +// but should instead use the accessor functions generated automatically by the +// protocol compiler. + +#ifndef GOOGLE_PROTOBUF_REPEATED_FIELD_H__ +#define GOOGLE_PROTOBUF_REPEATED_FIELD_H__ + +#include +#include +#include +#include + +namespace google { + +namespace protobuf { + +class Message; + +namespace internal { + +// We need this (from generated_message_reflection.cc). +LIBPROTOBUF_EXPORT int StringSpaceUsedExcludingSelf(const string& str); + +} // namespace internal + +// RepeatedField is used to represent repeated fields of a primitive type (in +// other words, everything except strings and nested Messages). Most users will +// not ever use a RepeatedField directly; they will use the get-by-index, +// set-by-index, and add accessors that are generated for all repeated fields. +template +class RepeatedField { + public: + RepeatedField(); + RepeatedField(const RepeatedField& other); + ~RepeatedField(); + + RepeatedField& operator=(const RepeatedField& other); + + int size() const; + + const Element& Get(int index) const; + Element* Mutable(int index); + void Set(int index, const Element& value); + void Add(const Element& value); + Element* Add(); + // Remove the last element in the array. + // We don't provide a way to remove any element other than the last + // because it invites inefficient use, such as O(n^2) filtering loops + // that should have been O(n). If you want to remove an element other + // than the last, the best way to do it is to re-arrange the elements + // so that the one you want removed is at the end, then call RemoveLast(). + void RemoveLast(); + void Clear(); + void MergeFrom(const RepeatedField& other); + void CopyFrom(const RepeatedField& other); + + // Reserve space to expand the field to at least the given size. If the + // array is grown, it will always be at least doubled in size. + void Reserve(int new_size); + + // Resize the RepeatedField to a new, smaller size. This is O(1). + void Truncate(int new_size); + + void AddAlreadyReserved(const Element& value); + Element* AddAlreadyReserved(); + int Capacity() const; + + // Gets the underlying array. This pointer is possibly invalidated by + // any add or remove operation. + Element* mutable_data(); + const Element* data() const; + + // Swap entire contents with "other". + void Swap(RepeatedField* other); + + // Swap two elements. + void SwapElements(int index1, int index2); + + // STL-like iterator support + typedef Element* iterator; + typedef const Element* const_iterator; + typedef Element value_type; + + iterator begin(); + const_iterator begin() const; + iterator end(); + const_iterator end() const; + + // Returns the number of bytes used by the repeated field, excluding + // sizeof(*this) + int SpaceUsedExcludingSelf() const; + + private: + static const int kInitialSize = 4; + + Element* elements_; + int current_size_; + int total_size_; + + Element initial_space_[kInitialSize]; + + // Move the contents of |from| into |to|, possibly clobbering |from| in the + // process. For primitive types this is just a memcpy(), but it could be + // specialized for non-primitive types to, say, swap each element instead. + void MoveArray(Element to[], Element from[], int size); + + // Copy the elements of |from| into |to|. + void CopyArray(Element to[], const Element from[], int size); +}; + +namespace internal { +template class RepeatedPtrIterator; +template class RepeatedPtrOverPtrsIterator; +} // namespace internal + +namespace internal { + +// This is the common base class for RepeatedPtrFields. It deals only in void* +// pointers. Users should not use this interface directly. +// +// The methods of this interface correspond to the methods of RepeatedPtrField, +// but may have a template argument called TypeHandler. Its signature is: +// class TypeHandler { +// public: +// typedef MyType Type; +// static Type* New(); +// static void Delete(Type*); +// static void Clear(Type*); +// static void Merge(const Type& from, Type* to); +// +// // Only needs to be implemented if SpaceUsedExcludingSelf() is called. +// static int SpaceUsed(const Type&); +// }; +class LIBPROTOBUF_EXPORT RepeatedPtrFieldBase { + protected: + // The reflection implementation needs to call protected methods directly, + // reinterpreting pointers as being to Message instead of a specific Message + // subclass. + friend class GeneratedMessageReflection; + + // ExtensionSet stores repeated message extensions as + // RepeatedPtrField, but non-lite ExtensionSets need to + // implement SpaceUsed(), and thus need to call SpaceUsedExcludingSelf() + // reinterpreting MessageLite as Message. ExtensionSet also needs to make + // use of AddFromCleared(), which is not part of the public interface. + friend class ExtensionSet; + + RepeatedPtrFieldBase(); + + // Must be called from destructor. + template + void Destroy(); + + int size() const; + + template + const typename TypeHandler::Type& Get(int index) const; + template + typename TypeHandler::Type* Mutable(int index); + template + typename TypeHandler::Type* Add(); + template + void RemoveLast(); + template + void Clear(); + template + void MergeFrom(const RepeatedPtrFieldBase& other); + template + void CopyFrom(const RepeatedPtrFieldBase& other); + + void Reserve(int new_size); + + int Capacity() const; + + // Used for constructing iterators. + void* const* raw_data() const; + void** raw_mutable_data() const; + + template + typename TypeHandler::Type** mutable_data(); + template + const typename TypeHandler::Type* const* data() const; + + void Swap(RepeatedPtrFieldBase* other); + + void SwapElements(int index1, int index2); + + template + int SpaceUsedExcludingSelf() const; + + + // Advanced memory management -------------------------------------- + + // Like Add(), but if there are no cleared objects to use, returns NULL. + template + typename TypeHandler::Type* AddFromCleared(); + + template + void AddAllocated(typename TypeHandler::Type* value); + template + typename TypeHandler::Type* ReleaseLast(); + + int ClearedCount() const; + template + void AddCleared(typename TypeHandler::Type* value); + template + typename TypeHandler::Type* ReleaseCleared(); + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RepeatedPtrFieldBase); + + static const int kInitialSize = 4; + + void** elements_; + int current_size_; + int allocated_size_; + int total_size_; + + void* initial_space_[kInitialSize]; + + template + static inline typename TypeHandler::Type* cast(void* element) { + return reinterpret_cast(element); + } + template + static inline const typename TypeHandler::Type* cast(const void* element) { + return reinterpret_cast(element); + } +}; + +template +class GenericTypeHandler { + public: + typedef GenericType Type; + static GenericType* New() { return new GenericType; } + static void Delete(GenericType* value) { delete value; } + static void Clear(GenericType* value) { value->Clear(); } + static void Merge(const GenericType& from, GenericType* to) { + to->MergeFrom(from); + } + static int SpaceUsed(const GenericType& value) { return value.SpaceUsed(); } +}; + +template <> +inline void GenericTypeHandler::Merge( + const MessageLite& from, MessageLite* to) { + to->CheckTypeAndMergeFrom(from); +} + +// HACK: If a class is declared as DLL-exported in MSVC, it insists on +// generating copies of all its methods -- even inline ones -- to include +// in the DLL. But SpaceUsed() calls StringSpaceUsedExcludingSelf() which +// isn't in the lite library, therefore the lite library cannot link if +// StringTypeHandler is exported. So, we factor out StringTypeHandlerBase, +// export that, then make StringTypeHandler be a subclass which is NOT +// exported. +// TODO(kenton): There has to be a better way. +class LIBPROTOBUF_EXPORT StringTypeHandlerBase { + public: + typedef string Type; + static string* New(); + static void Delete(string* value); + static void Clear(string* value) { value->clear(); } + static void Merge(const string& from, string* to) { *to = from; } +}; + +class StringTypeHandler : public StringTypeHandlerBase { + public: + static int SpaceUsed(const string& value) { + return sizeof(value) + StringSpaceUsedExcludingSelf(value); + } +}; + + +} // namespace internal + +// RepeatedPtrField is like RepeatedField, but used for repeated strings or +// Messages. +template +class RepeatedPtrField : public internal::RepeatedPtrFieldBase { + public: + RepeatedPtrField(); + RepeatedPtrField(const RepeatedPtrField& other); + ~RepeatedPtrField(); + + RepeatedPtrField& operator=(const RepeatedPtrField& other); + + int size() const; + + const Element& Get(int index) const; + Element* Mutable(int index); + Element* Add(); + void RemoveLast(); // Remove the last element in the array. + void Clear(); + void MergeFrom(const RepeatedPtrField& other); + void CopyFrom(const RepeatedPtrField& other); + + // Reserve space to expand the field to at least the given size. This only + // resizes the pointer array; it doesn't allocate any objects. If the + // array is grown, it will always be at least doubled in size. + void Reserve(int new_size); + + int Capacity() const; + + // Gets the underlying array. This pointer is possibly invalidated by + // any add or remove operation. + Element** mutable_data(); + const Element* const* data() const; + + // Swap entire contents with "other". + void Swap(RepeatedPtrField* other); + + // Swap two elements. + void SwapElements(int index1, int index2); + + // STL-like iterator support + typedef internal::RepeatedPtrIterator iterator; + typedef internal::RepeatedPtrIterator const_iterator; + typedef Element value_type; + + iterator begin(); + const_iterator begin() const; + iterator end(); + const_iterator end() const; + + // Custom STL-like iterator that iterates over and returns the underlying + // pointers to Element rather than Element itself. + typedef internal::RepeatedPtrOverPtrsIterator pointer_iterator; + pointer_iterator pointer_begin(); + pointer_iterator pointer_end(); + + // Returns (an estimate of) the number of bytes used by the repeated field, + // excluding sizeof(*this). + int SpaceUsedExcludingSelf() const; + + // Advanced memory management -------------------------------------- + // When hardcore memory management becomes necessary -- as it often + // does here at Google -- the following methods may be useful. + + // Add an already-allocated object, passing ownership to the + // RepeatedPtrField. + void AddAllocated(Element* value); + // Remove the last element and return it, passing ownership to the + // caller. + // Requires: size() > 0 + Element* ReleaseLast(); + + // When elements are removed by calls to RemoveLast() or Clear(), they + // are not actually freed. Instead, they are cleared and kept so that + // they can be reused later. This can save lots of CPU time when + // repeatedly reusing a protocol message for similar purposes. + // + // Really, extremely hardcore programs may actually want to manipulate + // these objects to better-optimize memory management. These methods + // allow that. + + // Get the number of cleared objects that are currently being kept + // around for reuse. + int ClearedCount() const; + // Add an element to the pool of cleared objects, passing ownership to + // the RepeatedPtrField. The element must be cleared prior to calling + // this method. + void AddCleared(Element* value); + // Remove a single element from the cleared pool and return it, passing + // ownership to the caller. The element is guaranteed to be cleared. + // Requires: ClearedCount() > 0 + Element* ReleaseCleared(); + + protected: + // Note: RepeatedPtrField SHOULD NOT be subclassed by users. We only + // subclass it in one place as a hack for compatibility with proto1. The + // subclass needs to know about TypeHandler in order to call protected + // methods on RepeatedPtrFieldBase. + class TypeHandler; + +}; + +// implementation ==================================================== + +template +inline RepeatedField::RepeatedField() + : elements_(initial_space_), + current_size_(0), + total_size_(kInitialSize) { +} + +template +inline RepeatedField::RepeatedField(const RepeatedField& other) + : elements_(initial_space_), + current_size_(0), + total_size_(kInitialSize) { + CopyFrom(other); +} + +template +RepeatedField::~RepeatedField() { + if (elements_ != initial_space_) { + delete [] elements_; + } +} + +template +inline RepeatedField& +RepeatedField::operator=(const RepeatedField& other) { + CopyFrom(other); + return *this; +} + +template +inline int RepeatedField::size() const { + return current_size_; +} + +template +inline int RepeatedField::Capacity() const { + return total_size_; +} + +template +inline void RepeatedField::AddAlreadyReserved(const Element& value) { + GOOGLE_DCHECK_LT(size(), Capacity()); + elements_[current_size_++] = value; +} + +template +inline Element* RepeatedField::AddAlreadyReserved() { + GOOGLE_DCHECK_LT(size(), Capacity()); + return &elements_[current_size_++]; +} + +template +inline const Element& RepeatedField::Get(int index) const { + GOOGLE_DCHECK_LT(index, size()); + return elements_[index]; +} + +template +inline Element* RepeatedField::Mutable(int index) { + GOOGLE_DCHECK_LT(index, size()); + return elements_ + index; +} + +template +inline void RepeatedField::Set(int index, const Element& value) { + GOOGLE_DCHECK_LT(index, size()); + elements_[index] = value; +} + +template +inline void RepeatedField::Add(const Element& value) { + if (current_size_ == total_size_) Reserve(total_size_ + 1); + elements_[current_size_++] = value; +} + +template +inline Element* RepeatedField::Add() { + if (current_size_ == total_size_) Reserve(total_size_ + 1); + return &elements_[current_size_++]; +} + +template +inline void RepeatedField::RemoveLast() { + GOOGLE_DCHECK_GT(current_size_, 0); + --current_size_; +} + +template +inline void RepeatedField::Clear() { + current_size_ = 0; +} + +template +inline void RepeatedField::MergeFrom(const RepeatedField& other) { + Reserve(current_size_ + other.current_size_); + CopyArray(elements_ + current_size_, other.elements_, other.current_size_); + current_size_ += other.current_size_; +} + +template +inline void RepeatedField::CopyFrom(const RepeatedField& other) { + Clear(); + MergeFrom(other); +} + +template +inline Element* RepeatedField::mutable_data() { + return elements_; +} + +template +inline const Element* RepeatedField::data() const { + return elements_; +} + + +template +void RepeatedField::Swap(RepeatedField* other) { + Element* swap_elements = elements_; + int swap_current_size = current_size_; + int swap_total_size = total_size_; + // We may not be using initial_space_ but it's not worth checking. Just + // copy it anyway. + Element swap_initial_space[kInitialSize]; + MoveArray(swap_initial_space, initial_space_, kInitialSize); + + elements_ = other->elements_; + current_size_ = other->current_size_; + total_size_ = other->total_size_; + MoveArray(initial_space_, other->initial_space_, kInitialSize); + + other->elements_ = swap_elements; + other->current_size_ = swap_current_size; + other->total_size_ = swap_total_size; + MoveArray(other->initial_space_, swap_initial_space, kInitialSize); + + if (elements_ == other->initial_space_) { + elements_ = initial_space_; + } + if (other->elements_ == initial_space_) { + other->elements_ = other->initial_space_; + } +} + +template +void RepeatedField::SwapElements(int index1, int index2) { + std::swap(elements_[index1], elements_[index2]); +} + +template +inline typename RepeatedField::iterator +RepeatedField::begin() { + return elements_; +} +template +inline typename RepeatedField::const_iterator +RepeatedField::begin() const { + return elements_; +} +template +inline typename RepeatedField::iterator +RepeatedField::end() { + return elements_ + current_size_; +} +template +inline typename RepeatedField::const_iterator +RepeatedField::end() const { + return elements_ + current_size_; +} + +template +inline int RepeatedField::SpaceUsedExcludingSelf() const { + return (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0; +} + +// Avoid inlining of Reserve(): new, memcpy, and delete[] lead to a significant +// amount of code bloat. +template +void RepeatedField::Reserve(int new_size) { + if (total_size_ >= new_size) return; + + Element* old_elements = elements_; + total_size_ = max(total_size_ * 2, new_size); + elements_ = new Element[total_size_]; + MoveArray(elements_, old_elements, current_size_); + if (old_elements != initial_space_) { + delete [] old_elements; + } +} + +template +inline void RepeatedField::Truncate(int new_size) { + GOOGLE_DCHECK_LE(new_size, current_size_); + current_size_ = new_size; +} + +template +inline void RepeatedField::MoveArray( + Element to[], Element from[], int array_size) { + memcpy(to, from, array_size * sizeof(Element)); +} + +template +inline void RepeatedField::CopyArray( + Element to[], const Element from[], int array_size) { + memcpy(to, from, array_size * sizeof(Element)); +} + + +// ------------------------------------------------------------------- + +namespace internal { + +inline RepeatedPtrFieldBase::RepeatedPtrFieldBase() + : elements_(initial_space_), + current_size_(0), + allocated_size_(0), + total_size_(kInitialSize) { +} + +template +void RepeatedPtrFieldBase::Destroy() { + for (int i = 0; i < allocated_size_; i++) { + TypeHandler::Delete(cast(elements_[i])); + } + if (elements_ != initial_space_) { + delete [] elements_; + } +} + +inline int RepeatedPtrFieldBase::size() const { + return current_size_; +} + + +template +inline const typename TypeHandler::Type& +RepeatedPtrFieldBase::Get(int index) const { + GOOGLE_DCHECK_LT(index, size()); + return *cast(elements_[index]); +} + +template +inline typename TypeHandler::Type* +RepeatedPtrFieldBase::Mutable(int index) { + GOOGLE_DCHECK_LT(index, size()); + return cast(elements_[index]); +} + +template +inline typename TypeHandler::Type* RepeatedPtrFieldBase::Add() { + if (current_size_ < allocated_size_) { + return cast(elements_[current_size_++]); + } + if (allocated_size_ == total_size_) Reserve(total_size_ + 1); + ++allocated_size_; + typename TypeHandler::Type* result = TypeHandler::New(); + elements_[current_size_++] = result; + return result; +} + +template +inline void RepeatedPtrFieldBase::RemoveLast() { + GOOGLE_DCHECK_GT(current_size_, 0); + TypeHandler::Clear(cast(elements_[--current_size_])); +} + +template +void RepeatedPtrFieldBase::Clear() { + for (int i = 0; i < current_size_; i++) { + TypeHandler::Clear(cast(elements_[i])); + } + current_size_ = 0; +} + +template +inline void RepeatedPtrFieldBase::MergeFrom(const RepeatedPtrFieldBase& other) { + Reserve(current_size_ + other.current_size_); + for (int i = 0; i < other.current_size_; i++) { + TypeHandler::Merge(other.template Get(i), Add()); + } +} + +template +inline void RepeatedPtrFieldBase::CopyFrom(const RepeatedPtrFieldBase& other) { + RepeatedPtrFieldBase::Clear(); + RepeatedPtrFieldBase::MergeFrom(other); +} + +inline int RepeatedPtrFieldBase::Capacity() const { + return total_size_; +} + +inline void* const* RepeatedPtrFieldBase::raw_data() const { + return elements_; +} + +inline void** RepeatedPtrFieldBase::raw_mutable_data() const { + return elements_; +} + +template +inline typename TypeHandler::Type** RepeatedPtrFieldBase::mutable_data() { + // TODO(kenton): Breaks C++ aliasing rules. We should probably remove this + // method entirely. + return reinterpret_cast(elements_); +} + +template +inline const typename TypeHandler::Type* const* +RepeatedPtrFieldBase::data() const { + // TODO(kenton): Breaks C++ aliasing rules. We should probably remove this + // method entirely. + return reinterpret_cast(elements_); +} + +inline void RepeatedPtrFieldBase::SwapElements(int index1, int index2) { + std::swap(elements_[index1], elements_[index2]); +} + +template +inline int RepeatedPtrFieldBase::SpaceUsedExcludingSelf() const { + int allocated_bytes = + (elements_ != initial_space_) ? total_size_ * sizeof(elements_[0]) : 0; + for (int i = 0; i < allocated_size_; ++i) { + allocated_bytes += TypeHandler::SpaceUsed(*cast(elements_[i])); + } + return allocated_bytes; +} + +template +inline typename TypeHandler::Type* RepeatedPtrFieldBase::AddFromCleared() { + if (current_size_ < allocated_size_) { + return cast(elements_[current_size_++]); + } else { + return NULL; + } +} + +template +void RepeatedPtrFieldBase::AddAllocated( + typename TypeHandler::Type* value) { + // Make room for the new pointer. + if (current_size_ == total_size_) { + // The array is completely full with no cleared objects, so grow it. + Reserve(total_size_ + 1); + ++allocated_size_; + } else if (allocated_size_ == total_size_) { + // There is no more space in the pointer array because it contains some + // cleared objects awaiting reuse. We don't want to grow the array in this + // case because otherwise a loop calling AddAllocated() followed by Clear() + // would leak memory. + TypeHandler::Delete(cast(elements_[current_size_])); + } else if (current_size_ < allocated_size_) { + // We have some cleared objects. We don't care about their order, so we + // can just move the first one to the end to make space. + elements_[allocated_size_] = elements_[current_size_]; + ++allocated_size_; + } else { + // There are no cleared objects. + ++allocated_size_; + } + + elements_[current_size_++] = value; +} + +template +inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseLast() { + GOOGLE_DCHECK_GT(current_size_, 0); + typename TypeHandler::Type* result = + cast(elements_[--current_size_]); + --allocated_size_; + if (current_size_ < allocated_size_) { + // There are cleared elements on the end; replace the removed element + // with the last allocated element. + elements_[current_size_] = elements_[allocated_size_]; + } + return result; +} + + +inline int RepeatedPtrFieldBase::ClearedCount() const { + return allocated_size_ - current_size_; +} + +template +inline void RepeatedPtrFieldBase::AddCleared( + typename TypeHandler::Type* value) { + if (allocated_size_ == total_size_) Reserve(total_size_ + 1); + elements_[allocated_size_++] = value; +} + +template +inline typename TypeHandler::Type* RepeatedPtrFieldBase::ReleaseCleared() { + GOOGLE_DCHECK_GT(allocated_size_, current_size_); + return cast(elements_[--allocated_size_]); +} + +} // namespace internal + +// ------------------------------------------------------------------- + +template +class RepeatedPtrField::TypeHandler + : public internal::GenericTypeHandler {}; + +template <> +class RepeatedPtrField::TypeHandler + : public internal::StringTypeHandler {}; + + +template +inline RepeatedPtrField::RepeatedPtrField() {} + +template +inline RepeatedPtrField::RepeatedPtrField( + const RepeatedPtrField& other) { + CopyFrom(other); +} + +template +RepeatedPtrField::~RepeatedPtrField() { + Destroy(); +} + +template +inline RepeatedPtrField& RepeatedPtrField::operator=( + const RepeatedPtrField& other) { + CopyFrom(other); + return *this; +} + +template +inline int RepeatedPtrField::size() const { + return RepeatedPtrFieldBase::size(); +} + +template +inline const Element& RepeatedPtrField::Get(int index) const { + return RepeatedPtrFieldBase::Get(index); +} + +template +inline Element* RepeatedPtrField::Mutable(int index) { + return RepeatedPtrFieldBase::Mutable(index); +} + +template +inline Element* RepeatedPtrField::Add() { + return RepeatedPtrFieldBase::Add(); +} + +template +inline void RepeatedPtrField::RemoveLast() { + RepeatedPtrFieldBase::RemoveLast(); +} + +template +inline void RepeatedPtrField::Clear() { + RepeatedPtrFieldBase::Clear(); +} + +template +inline void RepeatedPtrField::MergeFrom( + const RepeatedPtrField& other) { + RepeatedPtrFieldBase::MergeFrom(other); +} + +template +inline void RepeatedPtrField::CopyFrom( + const RepeatedPtrField& other) { + RepeatedPtrFieldBase::CopyFrom(other); +} + +template +inline Element** RepeatedPtrField::mutable_data() { + return RepeatedPtrFieldBase::mutable_data(); +} + +template +inline const Element* const* RepeatedPtrField::data() const { + return RepeatedPtrFieldBase::data(); +} + +template +void RepeatedPtrField::Swap(RepeatedPtrField* other) { + RepeatedPtrFieldBase::Swap(other); +} + +template +void RepeatedPtrField::SwapElements(int index1, int index2) { + RepeatedPtrFieldBase::SwapElements(index1, index2); +} + +template +inline int RepeatedPtrField::SpaceUsedExcludingSelf() const { + return RepeatedPtrFieldBase::SpaceUsedExcludingSelf(); +} + +template +inline void RepeatedPtrField::AddAllocated(Element* value) { + RepeatedPtrFieldBase::AddAllocated(value); +} + +template +inline Element* RepeatedPtrField::ReleaseLast() { + return RepeatedPtrFieldBase::ReleaseLast(); +} + + +template +inline int RepeatedPtrField::ClearedCount() const { + return RepeatedPtrFieldBase::ClearedCount(); +} + +template +inline void RepeatedPtrField::AddCleared(Element* value) { + return RepeatedPtrFieldBase::AddCleared(value); +} + +template +inline Element* RepeatedPtrField::ReleaseCleared() { + return RepeatedPtrFieldBase::ReleaseCleared(); +} + +template +inline void RepeatedPtrField::Reserve(int new_size) { + return RepeatedPtrFieldBase::Reserve(new_size); +} + +template +inline int RepeatedPtrField::Capacity() const { + return RepeatedPtrFieldBase::Capacity(); +} + +// ------------------------------------------------------------------- + +namespace internal { + +// STL-like iterator implementation for RepeatedPtrField. You should not +// refer to this class directly; use RepeatedPtrField::iterator instead. +// +// The iterator for RepeatedPtrField, RepeatedPtrIterator, is +// very similar to iterator_ptr in util/gtl/iterator_adaptors-inl.h, +// but adds random-access operators and is modified to wrap a void** base +// iterator (since RepeatedPtrField stores its array as a void* array and +// casting void** to T** would violate C++ aliasing rules). +// +// This code based on net/proto/proto-array-internal.h by Jeffrey Yasskin +// (jyasskin@google.com). +template +class RepeatedPtrIterator + : public std::iterator< + std::random_access_iterator_tag, Element> { + public: + typedef RepeatedPtrIterator iterator; + typedef std::iterator< + std::random_access_iterator_tag, Element> superclass; + + // Let the compiler know that these are type names, so we don't have to + // write "typename" in front of them everywhere. + typedef typename superclass::reference reference; + typedef typename superclass::pointer pointer; + typedef typename superclass::difference_type difference_type; + + RepeatedPtrIterator() : it_(NULL) {} + explicit RepeatedPtrIterator(void* const* it) : it_(it) {} + + // Allow "upcasting" from RepeatedPtrIterator to + // RepeatedPtrIterator. + template + RepeatedPtrIterator(const RepeatedPtrIterator& other) + : it_(other.it_) { + // Force a compiler error if the other type is not convertible to ours. + if (false) { + implicit_cast(0); + } + } + + // dereferenceable + reference operator*() const { return *reinterpret_cast(*it_); } + pointer operator->() const { return &(operator*()); } + + // {inc,dec}rementable + iterator& operator++() { ++it_; return *this; } + iterator operator++(int) { return iterator(it_++); } + iterator& operator--() { --it_; return *this; } + iterator operator--(int) { return iterator(it_--); } + + // equality_comparable + bool operator==(const iterator& x) const { return it_ == x.it_; } + bool operator!=(const iterator& x) const { return it_ != x.it_; } + + // less_than_comparable + bool operator<(const iterator& x) const { return it_ < x.it_; } + bool operator<=(const iterator& x) const { return it_ <= x.it_; } + bool operator>(const iterator& x) const { return it_ > x.it_; } + bool operator>=(const iterator& x) const { return it_ >= x.it_; } + + // addable, subtractable + iterator& operator+=(difference_type d) { + it_ += d; + return *this; + } + friend iterator operator+(iterator it, difference_type d) { + it += d; + return it; + } + friend iterator operator+(difference_type d, iterator it) { + it += d; + return it; + } + iterator& operator-=(difference_type d) { + it_ -= d; + return *this; + } + friend iterator operator-(iterator it, difference_type d) { + it -= d; + return it; + } + + // indexable + reference operator[](difference_type d) const { return *(*this + d); } + + // random access iterator + difference_type operator-(const iterator& x) const { return it_ - x.it_; } + + private: + template + friend class RepeatedPtrIterator; + + // The internal iterator. + void* const* it_; +}; + +// Provide an iterator that operates on pointers to the underlying objects +// rather than the objects themselves as RepeatedPtrIterator does. +// Consider using this when working with stl algorithms that change +// the array. +template +class RepeatedPtrOverPtrsIterator + : public std::iterator { + public: + typedef RepeatedPtrOverPtrsIterator iterator; + typedef std::iterator< + std::random_access_iterator_tag, Element*> superclass; + + // Let the compiler know that these are type names, so we don't have to + // write "typename" in front of them everywhere. + typedef typename superclass::reference reference; + typedef typename superclass::pointer pointer; + typedef typename superclass::difference_type difference_type; + + RepeatedPtrOverPtrsIterator() : it_(NULL) {} + explicit RepeatedPtrOverPtrsIterator(void** it) : it_(it) {} + + // dereferenceable + reference operator*() const { return *reinterpret_cast(it_); } + pointer operator->() const { return &(operator*()); } + + // {inc,dec}rementable + iterator& operator++() { ++it_; return *this; } + iterator operator++(int) { return iterator(it_++); } + iterator& operator--() { --it_; return *this; } + iterator operator--(int) { return iterator(it_--); } + + // equality_comparable + bool operator==(const iterator& x) const { return it_ == x.it_; } + bool operator!=(const iterator& x) const { return it_ != x.it_; } + + // less_than_comparable + bool operator<(const iterator& x) const { return it_ < x.it_; } + bool operator<=(const iterator& x) const { return it_ <= x.it_; } + bool operator>(const iterator& x) const { return it_ > x.it_; } + bool operator>=(const iterator& x) const { return it_ >= x.it_; } + + // addable, subtractable + iterator& operator+=(difference_type d) { + it_ += d; + return *this; + } + friend iterator operator+(iterator it, difference_type d) { + it += d; + return it; + } + friend iterator operator+(difference_type d, iterator it) { + it += d; + return it; + } + iterator& operator-=(difference_type d) { + it_ -= d; + return *this; + } + friend iterator operator-(iterator it, difference_type d) { + it -= d; + return it; + } + + // indexable + reference operator[](difference_type d) const { return *(*this + d); } + + // random access iterator + difference_type operator-(const iterator& x) const { return it_ - x.it_; } + + private: + template + friend class RepeatedPtrIterator; + + // The internal iterator. + void** it_; +}; + + +} // namespace internal + +template +inline typename RepeatedPtrField::iterator +RepeatedPtrField::begin() { + return iterator(raw_data()); +} +template +inline typename RepeatedPtrField::const_iterator +RepeatedPtrField::begin() const { + return iterator(raw_data()); +} +template +inline typename RepeatedPtrField::iterator +RepeatedPtrField::end() { + return iterator(raw_data() + size()); +} +template +inline typename RepeatedPtrField::const_iterator +RepeatedPtrField::end() const { + return iterator(raw_data() + size()); +} + +template +inline typename RepeatedPtrField::pointer_iterator +RepeatedPtrField::pointer_begin() { + return pointer_iterator(raw_mutable_data()); +} +template +inline typename RepeatedPtrField::pointer_iterator +RepeatedPtrField::pointer_end() { + return pointer_iterator(raw_mutable_data() + size()); +} + + +// Iterators and helper functions that follow the spirit of the STL +// std::back_insert_iterator and std::back_inserter but are tailor-made +// for RepeatedField and RepatedPtrField. Typical usage would be: +// +// std::copy(some_sequence.begin(), some_sequence.end(), +// google::protobuf::RepeatedFieldBackInserter(proto.mutable_sequence())); +// +// Ported by johannes from util/gtl/proto-array-iterators-inl.h + +namespace internal { +// A back inserter for RepeatedField objects. +template class RepeatedFieldBackInsertIterator + : public std::iterator { + public: + explicit RepeatedFieldBackInsertIterator( + RepeatedField* const mutable_field) + : field_(mutable_field) { + } + RepeatedFieldBackInsertIterator& operator=(const T& value) { + field_->Add(value); + return *this; + } + RepeatedFieldBackInsertIterator& operator*() { + return *this; + } + RepeatedFieldBackInsertIterator& operator++() { + return *this; + } + RepeatedFieldBackInsertIterator& operator++(int ignores_parameter) { + return *this; + } + + private: + RepeatedField* field_; +}; + +// A back inserter for RepeatedPtrField objects. +template class RepeatedPtrFieldBackInsertIterator + : public std::iterator { + public: + RepeatedPtrFieldBackInsertIterator( + RepeatedPtrField* const mutable_field) + : field_(mutable_field) { + } + RepeatedPtrFieldBackInsertIterator& operator=(const T& value) { + *field_->Add() = value; + return *this; + } + RepeatedPtrFieldBackInsertIterator& operator=( + const T* const ptr_to_value) { + *field_->Add() = *ptr_to_value; + return *this; + } + RepeatedPtrFieldBackInsertIterator& operator*() { + return *this; + } + RepeatedPtrFieldBackInsertIterator& operator++() { + return *this; + } + RepeatedPtrFieldBackInsertIterator& operator++(int ignores_parameter) { + return *this; + } + + private: + RepeatedPtrField* field_; +}; + +// A back inserter for RepeatedPtrFields that inserts by transfering ownership +// of a pointer. +template class AllocatedRepeatedPtrFieldBackInsertIterator + : public std::iterator { + public: + explicit AllocatedRepeatedPtrFieldBackInsertIterator( + RepeatedPtrField* const mutable_field) + : field_(mutable_field) { + } + AllocatedRepeatedPtrFieldBackInsertIterator& operator=( + T* const ptr_to_value) { + field_->AddAllocated(ptr_to_value); + return *this; + } + AllocatedRepeatedPtrFieldBackInsertIterator& operator*() { + return *this; + } + AllocatedRepeatedPtrFieldBackInsertIterator& operator++() { + return *this; + } + AllocatedRepeatedPtrFieldBackInsertIterator& operator++( + int ignores_parameter) { + return *this; + } + + private: + RepeatedPtrField* field_; +}; +} // namespace internal + +// Provides a back insert iterator for RepeatedField instances, +// similar to std::back_inserter(). Note the identically named +// function for RepeatedPtrField instances. +template internal::RepeatedFieldBackInsertIterator +RepeatedFieldBackInserter(RepeatedField* const mutable_field) { + return internal::RepeatedFieldBackInsertIterator(mutable_field); +} + +// Provides a back insert iterator for RepeatedPtrField instances, +// similar to std::back_inserter(). Note the identically named +// function for RepeatedField instances. +template internal::RepeatedPtrFieldBackInsertIterator +RepeatedFieldBackInserter(RepeatedPtrField* const mutable_field) { + return internal::RepeatedPtrFieldBackInsertIterator(mutable_field); +} + +// Provides a back insert iterator for RepeatedPtrField instances +// similar to std::back_inserter() which transfers the ownership while +// copying elements. +template internal::AllocatedRepeatedPtrFieldBackInsertIterator +AllocatedRepeatedPtrFieldBackInserter( + RepeatedPtrField* const mutable_field) { + return internal::AllocatedRepeatedPtrFieldBackInsertIterator( + mutable_field); +} + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_REPEATED_FIELD_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc new file mode 100644 index 000000000..e7e1e99b8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc @@ -0,0 +1,1086 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// TODO(kenton): Improve this unittest to bring it up to the standards of +// other proto2 unittests. + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +using protobuf_unittest::TestAllTypes; + +namespace protobuf { +namespace { + +// Test operations on a RepeatedField which is small enough that it does +// not allocate a separate array for storage. +TEST(RepeatedField, Small) { + RepeatedField field; + + EXPECT_EQ(field.size(), 0); + + field.Add(5); + + EXPECT_EQ(field.size(), 1); + EXPECT_EQ(field.Get(0), 5); + + field.Add(42); + + EXPECT_EQ(field.size(), 2); + EXPECT_EQ(field.Get(0), 5); + EXPECT_EQ(field.Get(1), 42); + + field.Set(1, 23); + + EXPECT_EQ(field.size(), 2); + EXPECT_EQ(field.Get(0), 5); + EXPECT_EQ(field.Get(1), 23); + EXPECT_EQ(field.SpaceUsedExcludingSelf(), 0); + + field.RemoveLast(); + + EXPECT_EQ(field.size(), 1); + EXPECT_EQ(field.Get(0), 5); + + field.Clear(); + + EXPECT_EQ(field.size(), 0); + EXPECT_EQ(field.SpaceUsedExcludingSelf(), 0); +} + +// Test operations on a RepeatedField which is large enough to allocate a +// separate array. +TEST(RepeatedField, Large) { + RepeatedField field; + + for (int i = 0; i < 16; i++) { + field.Add(i * i); + } + + EXPECT_EQ(field.size(), 16); + + for (int i = 0; i < 16; i++) { + EXPECT_EQ(field.Get(i), i * i); + } + + int expected_usage = 16 * sizeof(int); + EXPECT_GE(field.SpaceUsedExcludingSelf(), expected_usage); +} + +// Test swapping between various types of RepeatedFields. +TEST(RepeatedField, SwapSmallSmall) { + RepeatedField field1; + RepeatedField field2; + + field1.Add(5); + field1.Add(42); + + field1.Swap(&field2); + + EXPECT_EQ(field1.size(), 0); + EXPECT_EQ(field2.size(), 2); + EXPECT_EQ(field2.Get(0), 5); + EXPECT_EQ(field2.Get(1), 42); +} + +TEST(RepeatedField, SwapLargeSmall) { + RepeatedField field1; + RepeatedField field2; + + for (int i = 0; i < 16; i++) { + field1.Add(i * i); + } + field2.Add(5); + field2.Add(42); + field1.Swap(&field2); + + EXPECT_EQ(field1.size(), 2); + EXPECT_EQ(field1.Get(0), 5); + EXPECT_EQ(field1.Get(1), 42); + EXPECT_EQ(field2.size(), 16); + for (int i = 0; i < 16; i++) { + EXPECT_EQ(field2.Get(i), i * i); + } +} + +TEST(RepeatedField, SwapLargeLarge) { + RepeatedField field1; + RepeatedField field2; + + field1.Add(5); + field1.Add(42); + for (int i = 0; i < 16; i++) { + field1.Add(i); + field2.Add(i * i); + } + field2.Swap(&field1); + + EXPECT_EQ(field1.size(), 16); + for (int i = 0; i < 16; i++) { + EXPECT_EQ(field1.Get(i), i * i); + } + EXPECT_EQ(field2.size(), 18); + EXPECT_EQ(field2.Get(0), 5); + EXPECT_EQ(field2.Get(1), 42); + for (int i = 2; i < 18; i++) { + EXPECT_EQ(field2.Get(i), i - 2); + } +} + +// Determines how much space was reserved by the given field by adding elements +// to it until it re-allocates its space. +static int ReservedSpace(RepeatedField* field) { + const int* ptr = field->data(); + do { + field->Add(0); + } while (field->data() == ptr); + + return field->size() - 1; +} + +TEST(RepeatedField, ReserveMoreThanDouble) { + // Reserve more than double the previous space in the field and expect the + // field to reserve exactly the amount specified. + RepeatedField field; + field.Reserve(20); + + EXPECT_EQ(20, ReservedSpace(&field)); +} + +TEST(RepeatedField, ReserveLessThanDouble) { + // Reserve less than double the previous space in the field and expect the + // field to grow by double instead. + RepeatedField field; + field.Reserve(20); + field.Reserve(30); + + EXPECT_EQ(40, ReservedSpace(&field)); +} + +TEST(RepeatedField, ReserveLessThanExisting) { + // Reserve less than the previous space in the field and expect the + // field to not re-allocate at all. + RepeatedField field; + field.Reserve(20); + const int* previous_ptr = field.data(); + field.Reserve(10); + + EXPECT_EQ(previous_ptr, field.data()); + EXPECT_EQ(20, ReservedSpace(&field)); +} + +TEST(RepeatedField, MergeFrom) { + RepeatedField source, destination; + + source.Add(4); + source.Add(5); + + destination.Add(1); + destination.Add(2); + destination.Add(3); + + destination.MergeFrom(source); + + ASSERT_EQ(5, destination.size()); + + EXPECT_EQ(1, destination.Get(0)); + EXPECT_EQ(2, destination.Get(1)); + EXPECT_EQ(3, destination.Get(2)); + EXPECT_EQ(4, destination.Get(3)); + EXPECT_EQ(5, destination.Get(4)); +} + +TEST(RepeatedField, CopyFrom) { + RepeatedField source, destination; + + source.Add(4); + source.Add(5); + + destination.Add(1); + destination.Add(2); + destination.Add(3); + + destination.CopyFrom(source); + + ASSERT_EQ(2, destination.size()); + + EXPECT_EQ(4, destination.Get(0)); + EXPECT_EQ(5, destination.Get(1)); +} + +TEST(RepeatedField, CopyConstruct) { + RepeatedField source; + source.Add(1); + source.Add(2); + + RepeatedField destination(source); + + ASSERT_EQ(2, destination.size()); + EXPECT_EQ(1, destination.Get(0)); + EXPECT_EQ(2, destination.Get(1)); +} + +TEST(RepeatedField, CopyAssign) { + RepeatedField source, destination; + + source.Add(4); + source.Add(5); + + destination.Add(1); + destination.Add(2); + destination.Add(3); + + destination = source; + + ASSERT_EQ(2, destination.size()); + + EXPECT_EQ(4, destination.Get(0)); + EXPECT_EQ(5, destination.Get(1)); +} + +TEST(RepeatedField, MutableDataIsMutable) { + RepeatedField field; + field.Add(1); + EXPECT_EQ(1, field.Get(0)); + // The fact that this line compiles would be enough, but we'll check the + // value anyway. + *field.mutable_data() = 2; + EXPECT_EQ(2, field.Get(0)); +} + +TEST(RepeatedField, Truncate) { + RepeatedField field; + + field.Add(12); + field.Add(34); + field.Add(56); + field.Add(78); + EXPECT_EQ(4, field.size()); + + field.Truncate(3); + EXPECT_EQ(3, field.size()); + + field.Add(90); + EXPECT_EQ(4, field.size()); + EXPECT_EQ(90, field.Get(3)); + + // Truncations that don't change the size are allowed, but growing is not + // allowed. + field.Truncate(field.size()); +#ifdef GTEST_HAS_DEATH_TEST + EXPECT_DEBUG_DEATH(field.Truncate(field.size() + 1), "new_size"); +#endif +} + + +// =================================================================== +// RepeatedPtrField tests. These pretty much just mirror the RepeatedField +// tests above. + +TEST(RepeatedPtrField, Small) { + RepeatedPtrField field; + + EXPECT_EQ(field.size(), 0); + + field.Add()->assign("foo"); + + EXPECT_EQ(field.size(), 1); + EXPECT_EQ(field.Get(0), "foo"); + + field.Add()->assign("bar"); + + EXPECT_EQ(field.size(), 2); + EXPECT_EQ(field.Get(0), "foo"); + EXPECT_EQ(field.Get(1), "bar"); + + field.Mutable(1)->assign("baz"); + + EXPECT_EQ(field.size(), 2); + EXPECT_EQ(field.Get(0), "foo"); + EXPECT_EQ(field.Get(1), "baz"); + + field.RemoveLast(); + + EXPECT_EQ(field.size(), 1); + EXPECT_EQ(field.Get(0), "foo"); + + field.Clear(); + + EXPECT_EQ(field.size(), 0); +} + +TEST(RepeatedPtrField, Large) { + RepeatedPtrField field; + + for (int i = 0; i < 16; i++) { + *field.Add() += 'a' + i; + } + + EXPECT_EQ(field.size(), 16); + + for (int i = 0; i < 16; i++) { + EXPECT_EQ(field.Get(i).size(), 1); + EXPECT_EQ(field.Get(i)[0], 'a' + i); + } + + int min_expected_usage = 16 * sizeof(string); + EXPECT_GE(field.SpaceUsedExcludingSelf(), min_expected_usage); +} + +TEST(RepeatedPtrField, SwapSmallSmall) { + RepeatedPtrField field1; + RepeatedPtrField field2; + + field1.Add()->assign("foo"); + field1.Add()->assign("bar"); + field1.Swap(&field2); + + EXPECT_EQ(field1.size(), 0); + EXPECT_EQ(field2.size(), 2); + EXPECT_EQ(field2.Get(0), "foo"); + EXPECT_EQ(field2.Get(1), "bar"); +} + +TEST(RepeatedPtrField, SwapLargeSmall) { + RepeatedPtrField field1; + RepeatedPtrField field2; + + field2.Add()->assign("foo"); + field2.Add()->assign("bar"); + for (int i = 0; i < 16; i++) { + *field1.Add() += 'a' + i; + } + field1.Swap(&field2); + + EXPECT_EQ(field1.size(), 2); + EXPECT_EQ(field1.Get(0), "foo"); + EXPECT_EQ(field1.Get(1), "bar"); + EXPECT_EQ(field2.size(), 16); + for (int i = 0; i < 16; i++) { + EXPECT_EQ(field2.Get(i).size(), 1); + EXPECT_EQ(field2.Get(i)[0], 'a' + i); + } +} + +TEST(RepeatedPtrField, SwapLargeLarge) { + RepeatedPtrField field1; + RepeatedPtrField field2; + + field1.Add()->assign("foo"); + field1.Add()->assign("bar"); + for (int i = 0; i < 16; i++) { + *field1.Add() += 'A' + i; + *field2.Add() += 'a' + i; + } + field2.Swap(&field1); + + EXPECT_EQ(field1.size(), 16); + for (int i = 0; i < 16; i++) { + EXPECT_EQ(field1.Get(i).size(), 1); + EXPECT_EQ(field1.Get(i)[0], 'a' + i); + } + EXPECT_EQ(field2.size(), 18); + EXPECT_EQ(field2.Get(0), "foo"); + EXPECT_EQ(field2.Get(1), "bar"); + for (int i = 2; i < 18; i++) { + EXPECT_EQ(field2.Get(i).size(), 1); + EXPECT_EQ(field2.Get(i)[0], 'A' + i - 2); + } +} + +static int ReservedSpace(RepeatedPtrField* field) { + const string* const* ptr = field->data(); + do { + field->Add(); + } while (field->data() == ptr); + + return field->size() - 1; +} + +TEST(RepeatedPtrField, ReserveMoreThanDouble) { + RepeatedPtrField field; + field.Reserve(20); + + EXPECT_EQ(20, ReservedSpace(&field)); +} + +TEST(RepeatedPtrField, ReserveLessThanDouble) { + RepeatedPtrField field; + field.Reserve(20); + field.Reserve(30); + + EXPECT_EQ(40, ReservedSpace(&field)); +} + +TEST(RepeatedPtrField, ReserveLessThanExisting) { + RepeatedPtrField field; + field.Reserve(20); + const string* const* previous_ptr = field.data(); + field.Reserve(10); + + EXPECT_EQ(previous_ptr, field.data()); + EXPECT_EQ(20, ReservedSpace(&field)); +} + +TEST(RepeatedPtrField, ReserveDoesntLoseAllocated) { + // Check that a bug is fixed: An earlier implementation of Reserve() + // failed to copy pointers to allocated-but-cleared objects, possibly + // leading to segfaults. + RepeatedPtrField field; + string* first = field.Add(); + field.RemoveLast(); + + field.Reserve(20); + EXPECT_EQ(first, field.Add()); +} + +// Clearing elements is tricky with RepeatedPtrFields since the memory for +// the elements is retained and reused. +TEST(RepeatedPtrField, ClearedElements) { + RepeatedPtrField field; + + string* original = field.Add(); + *original = "foo"; + + EXPECT_EQ(field.ClearedCount(), 0); + + field.RemoveLast(); + EXPECT_TRUE(original->empty()); + EXPECT_EQ(field.ClearedCount(), 1); + + EXPECT_EQ(field.Add(), original); // Should return same string for reuse. + + EXPECT_EQ(field.ReleaseLast(), original); // We take ownership. + EXPECT_EQ(field.ClearedCount(), 0); + + EXPECT_NE(field.Add(), original); // Should NOT return the same string. + EXPECT_EQ(field.ClearedCount(), 0); + + field.AddAllocated(original); // Give ownership back. + EXPECT_EQ(field.ClearedCount(), 0); + EXPECT_EQ(field.Mutable(1), original); + + field.Clear(); + EXPECT_EQ(field.ClearedCount(), 2); + EXPECT_EQ(field.ReleaseCleared(), original); // Take ownership again. + EXPECT_EQ(field.ClearedCount(), 1); + EXPECT_NE(field.Add(), original); + EXPECT_EQ(field.ClearedCount(), 0); + EXPECT_NE(field.Add(), original); + EXPECT_EQ(field.ClearedCount(), 0); + + field.AddCleared(original); // Give ownership back, but as a cleared object. + EXPECT_EQ(field.ClearedCount(), 1); + EXPECT_EQ(field.Add(), original); + EXPECT_EQ(field.ClearedCount(), 0); +} + +// Test all code paths in AddAllocated(). +TEST(RepeatedPtrField, AddAlocated) { + RepeatedPtrField field; + while (field.size() < field.Capacity()) { + field.Add()->assign("filler"); + } + + int index = field.size(); + + // First branch: Field is at capacity with no cleared objects. + string* foo = new string("foo"); + field.AddAllocated(foo); + EXPECT_EQ(index + 1, field.size()); + EXPECT_EQ(0, field.ClearedCount()); + EXPECT_EQ(foo, &field.Get(index)); + + // Last branch: Field is not at capacity and there are no cleared objects. + string* bar = new string("bar"); + field.AddAllocated(bar); + ++index; + EXPECT_EQ(index + 1, field.size()); + EXPECT_EQ(0, field.ClearedCount()); + EXPECT_EQ(bar, &field.Get(index)); + + // Third branch: Field is not at capacity and there are no cleared objects. + field.RemoveLast(); + string* baz = new string("baz"); + field.AddAllocated(baz); + EXPECT_EQ(index + 1, field.size()); + EXPECT_EQ(1, field.ClearedCount()); + EXPECT_EQ(baz, &field.Get(index)); + + // Second branch: Field is at capacity but has some cleared objects. + while (field.size() < field.Capacity()) { + field.Add()->assign("filler2"); + } + field.RemoveLast(); + index = field.size(); + string* qux = new string("qux"); + field.AddAllocated(qux); + EXPECT_EQ(index + 1, field.size()); + // We should have discarded the cleared object. + EXPECT_EQ(0, field.ClearedCount()); + EXPECT_EQ(qux, &field.Get(index)); +} + +TEST(RepeatedPtrField, MergeFrom) { + RepeatedPtrField source, destination; + + source.Add()->assign("4"); + source.Add()->assign("5"); + + destination.Add()->assign("1"); + destination.Add()->assign("2"); + destination.Add()->assign("3"); + + destination.MergeFrom(source); + + ASSERT_EQ(5, destination.size()); + + EXPECT_EQ("1", destination.Get(0)); + EXPECT_EQ("2", destination.Get(1)); + EXPECT_EQ("3", destination.Get(2)); + EXPECT_EQ("4", destination.Get(3)); + EXPECT_EQ("5", destination.Get(4)); +} + +TEST(RepeatedPtrField, CopyFrom) { + RepeatedPtrField source, destination; + + source.Add()->assign("4"); + source.Add()->assign("5"); + + destination.Add()->assign("1"); + destination.Add()->assign("2"); + destination.Add()->assign("3"); + + destination.CopyFrom(source); + + ASSERT_EQ(2, destination.size()); + + EXPECT_EQ("4", destination.Get(0)); + EXPECT_EQ("5", destination.Get(1)); +} + +TEST(RepeatedPtrField, CopyConstruct) { + RepeatedPtrField source; + + source.Add()->assign("1"); + source.Add()->assign("2"); + + RepeatedPtrField destination(source); + + ASSERT_EQ(2, destination.size()); + EXPECT_EQ("1", destination.Get(0)); + EXPECT_EQ("2", destination.Get(1)); +} + +TEST(RepeatedPtrField, CopyAssign) { + RepeatedPtrField source, destination; + + source.Add()->assign("4"); + source.Add()->assign("5"); + + destination.Add()->assign("1"); + destination.Add()->assign("2"); + destination.Add()->assign("3"); + + destination = source; + + ASSERT_EQ(2, destination.size()); + + EXPECT_EQ("4", destination.Get(0)); + EXPECT_EQ("5", destination.Get(1)); +} + +TEST(RepeatedPtrField, MutableDataIsMutable) { + RepeatedPtrField field; + *field.Add() = "1"; + EXPECT_EQ("1", field.Get(0)); + // The fact that this line compiles would be enough, but we'll check the + // value anyway. + string** data = field.mutable_data(); + **data = "2"; + EXPECT_EQ("2", field.Get(0)); +} + +// =================================================================== + +// Iterator tests stolen from net/proto/proto-array_unittest. +class RepeatedFieldIteratorTest : public testing::Test { + protected: + virtual void SetUp() { + for (int i = 0; i < 3; ++i) { + proto_array_.Add(i); + } + } + + RepeatedField proto_array_; +}; + +TEST_F(RepeatedFieldIteratorTest, Convertible) { + RepeatedField::iterator iter = proto_array_.begin(); + RepeatedField::const_iterator c_iter = iter; + RepeatedField::value_type value = *c_iter; + EXPECT_EQ(0, value); +} + +TEST_F(RepeatedFieldIteratorTest, MutableIteration) { + RepeatedField::iterator iter = proto_array_.begin(); + EXPECT_EQ(0, *iter); + ++iter; + EXPECT_EQ(1, *iter++); + EXPECT_EQ(2, *iter); + ++iter; + EXPECT_TRUE(proto_array_.end() == iter); + + EXPECT_EQ(2, *(proto_array_.end() - 1)); +} + +TEST_F(RepeatedFieldIteratorTest, ConstIteration) { + const RepeatedField& const_proto_array = proto_array_; + RepeatedField::const_iterator iter = const_proto_array.begin(); + EXPECT_EQ(0, *iter); + ++iter; + EXPECT_EQ(1, *iter++); + EXPECT_EQ(2, *iter); + ++iter; + EXPECT_TRUE(proto_array_.end() == iter); + EXPECT_EQ(2, *(proto_array_.end() - 1)); +} + +TEST_F(RepeatedFieldIteratorTest, Mutation) { + RepeatedField::iterator iter = proto_array_.begin(); + *iter = 7; + EXPECT_EQ(7, proto_array_.Get(0)); +} + +// ------------------------------------------------------------------- + +class RepeatedPtrFieldIteratorTest : public testing::Test { + protected: + virtual void SetUp() { + proto_array_.Add()->assign("foo"); + proto_array_.Add()->assign("bar"); + proto_array_.Add()->assign("baz"); + } + + RepeatedPtrField proto_array_; +}; + +TEST_F(RepeatedPtrFieldIteratorTest, Convertible) { + RepeatedPtrField::iterator iter = proto_array_.begin(); + RepeatedPtrField::const_iterator c_iter = iter; + RepeatedPtrField::value_type value = *c_iter; + EXPECT_EQ("foo", value); +} + +TEST_F(RepeatedPtrFieldIteratorTest, MutableIteration) { + RepeatedPtrField::iterator iter = proto_array_.begin(); + EXPECT_EQ("foo", *iter); + ++iter; + EXPECT_EQ("bar", *(iter++)); + EXPECT_EQ("baz", *iter); + ++iter; + EXPECT_TRUE(proto_array_.end() == iter); + EXPECT_EQ("baz", *(--proto_array_.end())); +} + +TEST_F(RepeatedPtrFieldIteratorTest, ConstIteration) { + const RepeatedPtrField& const_proto_array = proto_array_; + RepeatedPtrField::const_iterator iter = const_proto_array.begin(); + EXPECT_EQ("foo", *iter); + ++iter; + EXPECT_EQ("bar", *(iter++)); + EXPECT_EQ("baz", *iter); + ++iter; + EXPECT_TRUE(const_proto_array.end() == iter); + EXPECT_EQ("baz", *(--const_proto_array.end())); +} + +TEST_F(RepeatedPtrFieldIteratorTest, RandomAccess) { + RepeatedPtrField::iterator iter = proto_array_.begin(); + RepeatedPtrField::iterator iter2 = iter; + ++iter2; + ++iter2; + EXPECT_TRUE(iter + 2 == iter2); + EXPECT_TRUE(iter == iter2 - 2); + EXPECT_EQ("baz", iter[2]); + EXPECT_EQ("baz", *(iter + 2)); + EXPECT_EQ(3, proto_array_.end() - proto_array_.begin()); +} + +TEST_F(RepeatedPtrFieldIteratorTest, Comparable) { + RepeatedPtrField::const_iterator iter = proto_array_.begin(); + RepeatedPtrField::const_iterator iter2 = iter + 1; + EXPECT_TRUE(iter == iter); + EXPECT_TRUE(iter != iter2); + EXPECT_TRUE(iter < iter2); + EXPECT_TRUE(iter <= iter2); + EXPECT_TRUE(iter <= iter); + EXPECT_TRUE(iter2 > iter); + EXPECT_TRUE(iter2 >= iter); + EXPECT_TRUE(iter >= iter); +} + +// Uninitialized iterator does not point to any of the RepeatedPtrField. +TEST_F(RepeatedPtrFieldIteratorTest, UninitializedIterator) { + RepeatedPtrField::iterator iter; + EXPECT_TRUE(iter != proto_array_.begin()); + EXPECT_TRUE(iter != proto_array_.begin() + 1); + EXPECT_TRUE(iter != proto_array_.begin() + 2); + EXPECT_TRUE(iter != proto_array_.begin() + 3); + EXPECT_TRUE(iter != proto_array_.end()); +} + +TEST_F(RepeatedPtrFieldIteratorTest, STLAlgorithms_lower_bound) { + proto_array_.Clear(); + proto_array_.Add()->assign("a"); + proto_array_.Add()->assign("c"); + proto_array_.Add()->assign("d"); + proto_array_.Add()->assign("n"); + proto_array_.Add()->assign("p"); + proto_array_.Add()->assign("x"); + proto_array_.Add()->assign("y"); + + string v = "f"; + RepeatedPtrField::const_iterator it = + lower_bound(proto_array_.begin(), proto_array_.end(), v); + + EXPECT_EQ(*it, "n"); + EXPECT_TRUE(it == proto_array_.begin() + 3); +} + +TEST_F(RepeatedPtrFieldIteratorTest, Mutation) { + RepeatedPtrField::iterator iter = proto_array_.begin(); + *iter = "qux"; + EXPECT_EQ("qux", proto_array_.Get(0)); +} + +// ------------------------------------------------------------------- + +class RepeatedPtrFieldPtrsIteratorTest : public testing::Test { + protected: + virtual void SetUp() { + proto_array_.Add()->assign("foo"); + proto_array_.Add()->assign("bar"); + proto_array_.Add()->assign("baz"); + } + + RepeatedPtrField proto_array_; +}; + +TEST_F(RepeatedPtrFieldPtrsIteratorTest, ConvertiblePtr) { + RepeatedPtrField::pointer_iterator iter = + proto_array_.pointer_begin(); +} + +TEST_F(RepeatedPtrFieldPtrsIteratorTest, MutablePtrIteration) { + RepeatedPtrField::pointer_iterator iter = + proto_array_.pointer_begin(); + EXPECT_EQ("foo", **iter); + ++iter; + EXPECT_EQ("bar", **(iter++)); + EXPECT_EQ("baz", **iter); + ++iter; + EXPECT_TRUE(proto_array_.pointer_end() == iter); + EXPECT_EQ("baz", **(--proto_array_.pointer_end())); +} + +TEST_F(RepeatedPtrFieldPtrsIteratorTest, RandomPtrAccess) { + RepeatedPtrField::pointer_iterator iter = + proto_array_.pointer_begin(); + RepeatedPtrField::pointer_iterator iter2 = iter; + ++iter2; + ++iter2; + EXPECT_TRUE(iter + 2 == iter2); + EXPECT_TRUE(iter == iter2 - 2); + EXPECT_EQ("baz", *iter[2]); + EXPECT_EQ("baz", **(iter + 2)); + EXPECT_EQ(3, proto_array_.end() - proto_array_.begin()); +} + +TEST_F(RepeatedPtrFieldPtrsIteratorTest, ComparablePtr) { + RepeatedPtrField::pointer_iterator iter = + proto_array_.pointer_begin(); + RepeatedPtrField::pointer_iterator iter2 = iter + 1; + EXPECT_TRUE(iter == iter); + EXPECT_TRUE(iter != iter2); + EXPECT_TRUE(iter < iter2); + EXPECT_TRUE(iter <= iter2); + EXPECT_TRUE(iter <= iter); + EXPECT_TRUE(iter2 > iter); + EXPECT_TRUE(iter2 >= iter); + EXPECT_TRUE(iter >= iter); +} + +// Uninitialized iterator does not point to any of the RepeatedPtrOverPtrs. +// Dereferencing an uninitialized iterator crashes the process. +TEST_F(RepeatedPtrFieldPtrsIteratorTest, UninitializedPtrIterator) { + RepeatedPtrField::pointer_iterator iter; + EXPECT_TRUE(iter != proto_array_.pointer_begin()); + EXPECT_TRUE(iter != proto_array_.pointer_begin() + 1); + EXPECT_TRUE(iter != proto_array_.pointer_begin() + 2); + EXPECT_TRUE(iter != proto_array_.pointer_begin() + 3); + EXPECT_TRUE(iter != proto_array_.pointer_end()); +} + + +// This comparison functor is required by the tests for RepeatedPtrOverPtrs. +// They operate on strings and need to compare strings as strings in +// any stl algorithm, even though the iterator returns a pointer to a string +// - i.e. *iter has type string*. +struct StringLessThan { + bool operator()(const string* z, const string& y) { + return *z < y; + } + bool operator()(const string* z, const string* y) { + return *z < *y; + } +}; + +TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrSTLAlgorithms_lower_bound) { + proto_array_.Clear(); + proto_array_.Add()->assign("a"); + proto_array_.Add()->assign("c"); + proto_array_.Add()->assign("d"); + proto_array_.Add()->assign("n"); + proto_array_.Add()->assign("p"); + proto_array_.Add()->assign("x"); + proto_array_.Add()->assign("y"); + + RepeatedPtrField::pointer_iterator iter = + proto_array_.pointer_begin(); + string v = "f"; + RepeatedPtrField::pointer_iterator it = + lower_bound(proto_array_.pointer_begin(), proto_array_.pointer_end(), + &v, StringLessThan()); + + GOOGLE_CHECK(*it != NULL); + + EXPECT_EQ(**it, "n"); + EXPECT_TRUE(it == proto_array_.pointer_begin() + 3); +} + +TEST_F(RepeatedPtrFieldPtrsIteratorTest, PtrMutation) { + RepeatedPtrField::pointer_iterator iter = + proto_array_.pointer_begin(); + **iter = "qux"; + EXPECT_EQ("qux", proto_array_.Get(0)); + + EXPECT_EQ("bar", proto_array_.Get(1)); + EXPECT_EQ("baz", proto_array_.Get(2)); + ++iter; + delete *iter; + *iter = new string("a"); + ++iter; + delete *iter; + *iter = new string("b"); + EXPECT_EQ("a", proto_array_.Get(1)); + EXPECT_EQ("b", proto_array_.Get(2)); +} + +TEST_F(RepeatedPtrFieldPtrsIteratorTest, Sort) { + proto_array_.Add()->assign("c"); + proto_array_.Add()->assign("d"); + proto_array_.Add()->assign("n"); + proto_array_.Add()->assign("p"); + proto_array_.Add()->assign("a"); + proto_array_.Add()->assign("y"); + proto_array_.Add()->assign("x"); + EXPECT_EQ("foo", proto_array_.Get(0)); + EXPECT_EQ("n", proto_array_.Get(5)); + EXPECT_EQ("x", proto_array_.Get(9)); + sort(proto_array_.pointer_begin(), + proto_array_.pointer_end(), + StringLessThan()); + EXPECT_EQ("a", proto_array_.Get(0)); + EXPECT_EQ("baz", proto_array_.Get(2)); + EXPECT_EQ("y", proto_array_.Get(9)); +} + + +// ----------------------------------------------------------------------------- +// Unit-tests for the insert iterators +// google::protobuf::RepeatedFieldBackInserter, +// google::protobuf::AllocatedRepeatedPtrFieldBackInserter +// Ported from util/gtl/proto-array-iterators_unittest. + +class RepeatedFieldInsertionIteratorsTest : public testing::Test { + protected: + std::list halves; + std::list fibonacci; + std::vector words; + typedef TestAllTypes::NestedMessage Nested; + Nested nesteds[2]; + std::vector nested_ptrs; + TestAllTypes protobuffer; + + virtual void SetUp() { + fibonacci.push_back(1); + fibonacci.push_back(1); + fibonacci.push_back(2); + fibonacci.push_back(3); + fibonacci.push_back(5); + fibonacci.push_back(8); + std::copy(fibonacci.begin(), fibonacci.end(), + RepeatedFieldBackInserter(protobuffer.mutable_repeated_int32())); + + halves.push_back(1.0); + halves.push_back(0.5); + halves.push_back(0.25); + halves.push_back(0.125); + halves.push_back(0.0625); + std::copy(halves.begin(), halves.end(), + RepeatedFieldBackInserter(protobuffer.mutable_repeated_double())); + + words.push_back("Able"); + words.push_back("was"); + words.push_back("I"); + words.push_back("ere"); + words.push_back("I"); + words.push_back("saw"); + words.push_back("Elba"); + std::copy(words.begin(), words.end(), + RepeatedFieldBackInserter(protobuffer.mutable_repeated_string())); + + nesteds[0].set_bb(17); + nesteds[1].set_bb(4711); + std::copy(&nesteds[0], &nesteds[2], + RepeatedFieldBackInserter( + protobuffer.mutable_repeated_nested_message())); + + nested_ptrs.push_back(new Nested); + nested_ptrs.back()->set_bb(170); + nested_ptrs.push_back(new Nested); + nested_ptrs.back()->set_bb(47110); + std::copy(nested_ptrs.begin(), nested_ptrs.end(), + RepeatedFieldBackInserter( + protobuffer.mutable_repeated_nested_message())); + + } + + virtual void TearDown() { + STLDeleteContainerPointers(nested_ptrs.begin(), nested_ptrs.end()); + } +}; + +TEST_F(RepeatedFieldInsertionIteratorsTest, Fibonacci) { + EXPECT_TRUE(std::equal(fibonacci.begin(), + fibonacci.end(), + protobuffer.repeated_int32().begin())); + EXPECT_TRUE(std::equal(protobuffer.repeated_int32().begin(), + protobuffer.repeated_int32().end(), + fibonacci.begin())); +} + +TEST_F(RepeatedFieldInsertionIteratorsTest, Halves) { + EXPECT_TRUE(std::equal(halves.begin(), + halves.end(), + protobuffer.repeated_double().begin())); + EXPECT_TRUE(std::equal(protobuffer.repeated_double().begin(), + protobuffer.repeated_double().end(), + halves.begin())); +} + +TEST_F(RepeatedFieldInsertionIteratorsTest, Words) { + ASSERT_EQ(words.size(), protobuffer.repeated_string_size()); + EXPECT_EQ(words.at(0), protobuffer.repeated_string(0)); + EXPECT_EQ(words.at(1), protobuffer.repeated_string(1)); + EXPECT_EQ(words.at(2), protobuffer.repeated_string(2)); + EXPECT_EQ(words.at(3), protobuffer.repeated_string(3)); + EXPECT_EQ(words.at(4), protobuffer.repeated_string(4)); + EXPECT_EQ(words.at(5), protobuffer.repeated_string(5)); + EXPECT_EQ(words.at(6), protobuffer.repeated_string(6)); +} + +TEST_F(RepeatedFieldInsertionIteratorsTest, Nesteds) { + ASSERT_EQ(protobuffer.repeated_nested_message_size(), 4); + EXPECT_EQ(protobuffer.repeated_nested_message(0).bb(), 17); + EXPECT_EQ(protobuffer.repeated_nested_message(1).bb(), 4711); + EXPECT_EQ(protobuffer.repeated_nested_message(2).bb(), 170); + EXPECT_EQ(protobuffer.repeated_nested_message(3).bb(), 47110); +} + +TEST_F(RepeatedFieldInsertionIteratorsTest, + AllocatedRepeatedPtrFieldWithStringIntData) { + vector data; + TestAllTypes goldenproto; + for (int i = 0; i < 10; ++i) { + Nested* new_data = new Nested; + new_data->set_bb(i); + data.push_back(new_data); + + new_data = goldenproto.add_repeated_nested_message(); + new_data->set_bb(i); + } + TestAllTypes testproto; + copy(data.begin(), data.end(), + AllocatedRepeatedPtrFieldBackInserter( + testproto.mutable_repeated_nested_message())); + EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); +} + +TEST_F(RepeatedFieldInsertionIteratorsTest, + AllocatedRepeatedPtrFieldWithString) { + vector data; + TestAllTypes goldenproto; + for (int i = 0; i < 10; ++i) { + string* new_data = new string; + *new_data = "name-" + SimpleItoa(i); + data.push_back(new_data); + + new_data = goldenproto.add_repeated_string(); + *new_data = "name-" + SimpleItoa(i); + } + TestAllTypes testproto; + copy(data.begin(), data.end(), + AllocatedRepeatedPtrFieldBackInserter( + testproto.mutable_repeated_string())); + EXPECT_EQ(testproto.DebugString(), goldenproto.DebugString()); +} + +} // namespace + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc new file mode 100644 index 000000000..caf968ca5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc @@ -0,0 +1,46 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +namespace google { +namespace protobuf { + +Service::~Service() {} +RpcChannel::~RpcChannel() {} +RpcController::~RpcController() {} + +} // namespace protobuf + +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h new file mode 100644 index 000000000..a6a7d16de --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h @@ -0,0 +1,291 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// DEPRECATED: This module declares the abstract interfaces underlying proto2 +// RPC services. These are intented to be independent of any particular RPC +// implementation, so that proto2 services can be used on top of a variety +// of implementations. Starting with version 2.3.0, RPC implementations should +// not try to build on these, but should instead provide code generator plugins +// which generate code specific to the particular RPC implementation. This way +// the generated code can be more appropriate for the implementation in use +// and can avoid unnecessary layers of indirection. +// +// +// When you use the protocol compiler to compile a service definition, it +// generates two classes: An abstract interface for the service (with +// methods matching the service definition) and a "stub" implementation. +// A stub is just a type-safe wrapper around an RpcChannel which emulates a +// local implementation of the service. +// +// For example, the service definition: +// service MyService { +// rpc Foo(MyRequest) returns(MyResponse); +// } +// will generate abstract interface "MyService" and class "MyService::Stub". +// You could implement a MyService as follows: +// class MyServiceImpl : public MyService { +// public: +// MyServiceImpl() {} +// ~MyServiceImpl() {} +// +// // implements MyService --------------------------------------- +// +// void Foo(google::protobuf::RpcController* controller, +// const MyRequest* request, +// MyResponse* response, +// Closure* done) { +// // ... read request and fill in response ... +// done->Run(); +// } +// }; +// You would then register an instance of MyServiceImpl with your RPC server +// implementation. (How to do that depends on the implementation.) +// +// To call a remote MyServiceImpl, first you need an RpcChannel connected to it. +// How to construct a channel depends, again, on your RPC implementation. +// Here we use a hypothentical "MyRpcChannel" as an example: +// MyRpcChannel channel("rpc:hostname:1234/myservice"); +// MyRpcController controller; +// MyServiceImpl::Stub stub(&channel); +// FooRequest request; +// FooRespnose response; +// +// // ... fill in request ... +// +// stub.Foo(&controller, request, &response, NewCallback(HandleResponse)); +// +// On Thread-Safety: +// +// Different RPC implementations may make different guarantees about what +// threads they may run callbacks on, and what threads the application is +// allowed to use to call the RPC system. Portable software should be ready +// for callbacks to be called on any thread, but should not try to call the +// RPC system from any thread except for the ones on which it received the +// callbacks. Realistically, though, simple software will probably want to +// use a single-threaded RPC system while high-end software will want to +// use multiple threads. RPC implementations should provide multiple +// choices. + +#ifndef GOOGLE_PROTOBUF_SERVICE_H__ +#define GOOGLE_PROTOBUF_SERVICE_H__ + +#include +#include + +namespace google { +namespace protobuf { + +// Defined in this file. +class Service; +class RpcController; +class RpcChannel; + +// Defined in other files. +class Descriptor; // descriptor.h +class ServiceDescriptor; // descriptor.h +class MethodDescriptor; // descriptor.h +class Message; // message.h + +// Abstract base interface for protocol-buffer-based RPC services. Services +// themselves are abstract interfaces (implemented either by servers or as +// stubs), but they subclass this base interface. The methods of this +// interface can be used to call the methods of the Service without knowing +// its exact type at compile time (analogous to Reflection). +class LIBPROTOBUF_EXPORT Service { + public: + inline Service() {} + virtual ~Service(); + + // When constructing a stub, you may pass STUB_OWNS_CHANNEL as the second + // parameter to the constructor to tell it to delete its RpcChannel when + // destroyed. + enum ChannelOwnership { + STUB_OWNS_CHANNEL, + STUB_DOESNT_OWN_CHANNEL + }; + + // Get the ServiceDescriptor describing this service and its methods. + virtual const ServiceDescriptor* GetDescriptor() = 0; + + // Call a method of the service specified by MethodDescriptor. This is + // normally implemented as a simple switch() that calls the standard + // definitions of the service's methods. + // + // Preconditions: + // * method->service() == GetDescriptor() + // * request and response are of the exact same classes as the objects + // returned by GetRequestPrototype(method) and + // GetResponsePrototype(method). + // * After the call has started, the request must not be modified and the + // response must not be accessed at all until "done" is called. + // * "controller" is of the correct type for the RPC implementation being + // used by this Service. For stubs, the "correct type" depends on the + // RpcChannel which the stub is using. Server-side Service + // implementations are expected to accept whatever type of RpcController + // the server-side RPC implementation uses. + // + // Postconditions: + // * "done" will be called when the method is complete. This may be + // before CallMethod() returns or it may be at some point in the future. + // * If the RPC succeeded, "response" contains the response returned by + // the server. + // * If the RPC failed, "response"'s contents are undefined. The + // RpcController can be queried to determine if an error occurred and + // possibly to get more information about the error. + virtual void CallMethod(const MethodDescriptor* method, + RpcController* controller, + const Message* request, + Message* response, + Closure* done) = 0; + + // CallMethod() requires that the request and response passed in are of a + // particular subclass of Message. GetRequestPrototype() and + // GetResponsePrototype() get the default instances of these required types. + // You can then call Message::New() on these instances to construct mutable + // objects which you can then pass to CallMethod(). + // + // Example: + // const MethodDescriptor* method = + // service->GetDescriptor()->FindMethodByName("Foo"); + // Message* request = stub->GetRequestPrototype (method)->New(); + // Message* response = stub->GetResponsePrototype(method)->New(); + // request->ParseFromString(input); + // service->CallMethod(method, *request, response, callback); + virtual const Message& GetRequestPrototype( + const MethodDescriptor* method) const = 0; + virtual const Message& GetResponsePrototype( + const MethodDescriptor* method) const = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Service); +}; + +// An RpcController mediates a single method call. The primary purpose of +// the controller is to provide a way to manipulate settings specific to the +// RPC implementation and to find out about RPC-level errors. +// +// The methods provided by the RpcController interface are intended to be a +// "least common denominator" set of features which we expect all +// implementations to support. Specific implementations may provide more +// advanced features (e.g. deadline propagation). +class LIBPROTOBUF_EXPORT RpcController { + public: + inline RpcController() {} + virtual ~RpcController(); + + // Client-side methods --------------------------------------------- + // These calls may be made from the client side only. Their results + // are undefined on the server side (may crash). + + // Resets the RpcController to its initial state so that it may be reused in + // a new call. Must not be called while an RPC is in progress. + virtual void Reset() = 0; + + // After a call has finished, returns true if the call failed. The possible + // reasons for failure depend on the RPC implementation. Failed() must not + // be called before a call has finished. If Failed() returns true, the + // contents of the response message are undefined. + virtual bool Failed() const = 0; + + // If Failed() is true, returns a human-readable description of the error. + virtual string ErrorText() const = 0; + + // Advises the RPC system that the caller desires that the RPC call be + // canceled. The RPC system may cancel it immediately, may wait awhile and + // then cancel it, or may not even cancel the call at all. If the call is + // canceled, the "done" callback will still be called and the RpcController + // will indicate that the call failed at that time. + virtual void StartCancel() = 0; + + // Server-side methods --------------------------------------------- + // These calls may be made from the server side only. Their results + // are undefined on the client side (may crash). + + // Causes Failed() to return true on the client side. "reason" will be + // incorporated into the message returned by ErrorText(). If you find + // you need to return machine-readable information about failures, you + // should incorporate it into your response protocol buffer and should + // NOT call SetFailed(). + virtual void SetFailed(const string& reason) = 0; + + // If true, indicates that the client canceled the RPC, so the server may + // as well give up on replying to it. The server should still call the + // final "done" callback. + virtual bool IsCanceled() const = 0; + + // Asks that the given callback be called when the RPC is canceled. The + // callback will always be called exactly once. If the RPC completes without + // being canceled, the callback will be called after completion. If the RPC + // has already been canceled when NotifyOnCancel() is called, the callback + // will be called immediately. + // + // NotifyOnCancel() must be called no more than once per request. + virtual void NotifyOnCancel(Closure* callback) = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcController); +}; + +// Abstract interface for an RPC channel. An RpcChannel represents a +// communication line to a Service which can be used to call that Service's +// methods. The Service may be running on another machine. Normally, you +// should not call an RpcChannel directly, but instead construct a stub Service +// wrapping it. Example: +// RpcChannel* channel = new MyRpcChannel("remotehost.example.com:1234"); +// MyService* service = new MyService::Stub(channel); +// service->MyMethod(request, &response, callback); +class LIBPROTOBUF_EXPORT RpcChannel { + public: + inline RpcChannel() {} + virtual ~RpcChannel(); + + // Call the given method of the remote service. The signature of this + // procedure looks the same as Service::CallMethod(), but the requirements + // are less strict in one important way: the request and response objects + // need not be of any specific class as long as their descriptors are + // method->input_type() and method->output_type(). + virtual void CallMethod(const MethodDescriptor* method, + RpcController* controller, + const Message* request, + Message* response, + Closure* done) = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(RpcChannel); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_SERVICE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc new file mode 100644 index 000000000..7b15be44d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc @@ -0,0 +1,377 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include +#include +#include +#include +#include + +#include "config.h" + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN // We only need minimal includes +#include +#define snprintf _snprintf // see comment in strutil.cc +#elif defined(HAVE_PTHREAD) +#include +#else +#error "No suitable threading library available." +#endif + +namespace google { +namespace protobuf { + +namespace internal { + +void VerifyVersion(int headerVersion, + int minLibraryVersion, + const char* filename) { + if (GOOGLE_PROTOBUF_VERSION < minLibraryVersion) { + // Library is too old for headers. + GOOGLE_LOG(FATAL) + << "This program requires version " << VersionString(minLibraryVersion) + << " of the Protocol Buffer runtime library, but the installed version " + "is " << VersionString(GOOGLE_PROTOBUF_VERSION) << ". Please update " + "your library. If you compiled the program yourself, make sure that " + "your headers are from the same version of Protocol Buffers as your " + "link-time library. (Version verification failed in \"" + << filename << "\".)"; + } + if (headerVersion < kMinHeaderVersionForLibrary) { + // Headers are too old for library. + GOOGLE_LOG(FATAL) + << "This program was compiled against version " + << VersionString(headerVersion) << " of the Protocol Buffer runtime " + "library, which is not compatible with the installed version (" + << VersionString(GOOGLE_PROTOBUF_VERSION) << "). Contact the program " + "author for an update. If you compiled the program yourself, make " + "sure that your headers are from the same version of Protocol Buffers " + "as your link-time library. (Version verification failed in \"" + << filename << "\".)"; + } +} + +string VersionString(int version) { + int major = version / 1000000; + int minor = (version / 1000) % 1000; + int micro = version % 1000; + + // 128 bytes should always be enough, but we use snprintf() anyway to be + // safe. + char buffer[128]; + snprintf(buffer, sizeof(buffer), "%d.%d.%d", major, minor, micro); + + // Guard against broken MSVC snprintf(). + buffer[sizeof(buffer)-1] = '\0'; + + return buffer; +} + +} // namespace internal + +// =================================================================== +// emulates google3/base/logging.cc + +namespace internal { + +void DefaultLogHandler(LogLevel level, const char* filename, int line, + const string& message) { + static const char* level_names[] = { "INFO", "WARNING", "ERROR", "FATAL" }; + + // We use fprintf() instead of cerr because we want this to work at static + // initialization time. + fprintf(stderr, "libprotobuf %s %s:%d] %s\n", + level_names[level], filename, line, message.c_str()); + fflush(stderr); // Needed on MSVC. +} + +void NullLogHandler(LogLevel level, const char* filename, int line, + const string& message) { + // Nothing. +} + +static LogHandler* log_handler_ = &DefaultLogHandler; +static int log_silencer_count_ = 0; + +static Mutex* log_silencer_count_mutex_ = NULL; +GOOGLE_PROTOBUF_DECLARE_ONCE(log_silencer_count_init_); + +void DeleteLogSilencerCount() { + delete log_silencer_count_mutex_; + log_silencer_count_mutex_ = NULL; +} +void InitLogSilencerCount() { + log_silencer_count_mutex_ = new Mutex; + OnShutdown(&DeleteLogSilencerCount); +} +void InitLogSilencerCountOnce() { + GoogleOnceInit(&log_silencer_count_init_, &InitLogSilencerCount); +} + +LogMessage& LogMessage::operator<<(const string& value) { + message_ += value; + return *this; +} + +LogMessage& LogMessage::operator<<(const char* value) { + message_ += value; + return *this; +} + +// Since this is just for logging, we don't care if the current locale changes +// the results -- in fact, we probably prefer that. So we use snprintf() +// instead of Simple*toa(). +#undef DECLARE_STREAM_OPERATOR +#define DECLARE_STREAM_OPERATOR(TYPE, FORMAT) \ + LogMessage& LogMessage::operator<<(TYPE value) { \ + /* 128 bytes should be big enough for any of the primitive */ \ + /* values which we print with this, but well use snprintf() */ \ + /* anyway to be extra safe. */ \ + char buffer[128]; \ + snprintf(buffer, sizeof(buffer), FORMAT, value); \ + /* Guard against broken MSVC snprintf(). */ \ + buffer[sizeof(buffer)-1] = '\0'; \ + message_ += buffer; \ + return *this; \ + } + +DECLARE_STREAM_OPERATOR(char , "%c" ) +DECLARE_STREAM_OPERATOR(int , "%d" ) +DECLARE_STREAM_OPERATOR(uint , "%u" ) +DECLARE_STREAM_OPERATOR(long , "%ld") +DECLARE_STREAM_OPERATOR(unsigned long, "%lu") +DECLARE_STREAM_OPERATOR(double , "%g" ) +#undef DECLARE_STREAM_OPERATOR + +LogMessage::LogMessage(LogLevel level, const char* filename, int line) + : level_(level), filename_(filename), line_(line) {} +LogMessage::~LogMessage() {} + +void LogMessage::Finish() { + bool suppress = false; + + if (level_ != LOGLEVEL_FATAL) { + InitLogSilencerCountOnce(); + MutexLock lock(log_silencer_count_mutex_); + suppress = internal::log_silencer_count_ > 0; + } + + if (!suppress) { + internal::log_handler_(level_, filename_, line_, message_); + } + + if (level_ == LOGLEVEL_FATAL) { +#ifdef PROTOBUF_USE_EXCEPTIONS + throw FatalException(filename_, line_, message_); +#else + abort(); +#endif + } +} + +void LogFinisher::operator=(LogMessage& other) { + other.Finish(); +} + +} // namespace internal + +LogHandler* SetLogHandler(LogHandler* new_func) { + LogHandler* old = internal::log_handler_; + if (old == &internal::NullLogHandler) { + old = NULL; + } + if (new_func == NULL) { + internal::log_handler_ = &internal::NullLogHandler; + } else { + internal::log_handler_ = new_func; + } + return old; +} + +LogSilencer::LogSilencer() { + internal::InitLogSilencerCountOnce(); + MutexLock lock(internal::log_silencer_count_mutex_); + ++internal::log_silencer_count_; +}; + +LogSilencer::~LogSilencer() { + internal::InitLogSilencerCountOnce(); + MutexLock lock(internal::log_silencer_count_mutex_); + --internal::log_silencer_count_; +}; + +// =================================================================== +// emulates google3/base/callback.cc + +Closure::~Closure() {} + +namespace internal { FunctionClosure0::~FunctionClosure0() {} } + +void DoNothing() {} + +// =================================================================== +// emulates google3/base/mutex.cc + +#ifdef _WIN32 + +struct Mutex::Internal { + CRITICAL_SECTION mutex; +#ifndef NDEBUG + // Used only to implement AssertHeld(). + DWORD thread_id; +#endif +}; + +Mutex::Mutex() + : mInternal(new Internal) { + InitializeCriticalSection(&mInternal->mutex); +} + +Mutex::~Mutex() { + DeleteCriticalSection(&mInternal->mutex); + delete mInternal; +} + +void Mutex::Lock() { + EnterCriticalSection(&mInternal->mutex); +#ifndef NDEBUG + mInternal->thread_id = GetCurrentThreadId(); +#endif +} + +void Mutex::Unlock() { +#ifndef NDEBUG + mInternal->thread_id = 0; +#endif + LeaveCriticalSection(&mInternal->mutex); +} + +void Mutex::AssertHeld() { +#ifndef NDEBUG + GOOGLE_DCHECK_EQ(mInternal->thread_id, GetCurrentThreadId()); +#endif +} + +#elif defined(HAVE_PTHREAD) + +struct Mutex::Internal { + pthread_mutex_t mutex; +}; + +Mutex::Mutex() + : mInternal(new Internal) { + pthread_mutex_init(&mInternal->mutex, NULL); +} + +Mutex::~Mutex() { + pthread_mutex_destroy(&mInternal->mutex); + delete mInternal; +} + +void Mutex::Lock() { + int result = pthread_mutex_lock(&mInternal->mutex); + if (result != 0) { + GOOGLE_LOG(FATAL) << "pthread_mutex_lock: " << strerror(result); + } +} + +void Mutex::Unlock() { + int result = pthread_mutex_unlock(&mInternal->mutex); + if (result != 0) { + GOOGLE_LOG(FATAL) << "pthread_mutex_unlock: " << strerror(result); + } +} + +void Mutex::AssertHeld() { + // pthreads dosn't provide a way to check which thread holds the mutex. + // TODO(kenton): Maybe keep track of locking thread ID like with WIN32? +} + +#endif + +// =================================================================== +// Shutdown support. + +namespace internal { + +typedef void OnShutdownFunc(); +vector* shutdown_functions = NULL; +Mutex* shutdown_functions_mutex = NULL; +GOOGLE_PROTOBUF_DECLARE_ONCE(shutdown_functions_init); + +void InitShutdownFunctions() { + shutdown_functions = new vector; + shutdown_functions_mutex = new Mutex; +} + +inline void InitShutdownFunctionsOnce() { + GoogleOnceInit(&shutdown_functions_init, &InitShutdownFunctions); +} + +void OnShutdown(void (*func)()) { + InitShutdownFunctionsOnce(); + MutexLock lock(shutdown_functions_mutex); + shutdown_functions->push_back(func); +} + +} // namespace internal + +void ShutdownProtobufLibrary() { + internal::InitShutdownFunctionsOnce(); + + // We don't need to lock shutdown_functions_mutex because it's up to the + // caller to make sure that no one is using the library before this is + // called. + + // Make it safe to call this multiple times. + if (internal::shutdown_functions == NULL) return; + + for (int i = 0; i < internal::shutdown_functions->size(); i++) { + internal::shutdown_functions->at(i)(); + } + delete internal::shutdown_functions; + internal::shutdown_functions = NULL; + delete internal::shutdown_functions_mutex; + internal::shutdown_functions_mutex = NULL; +} + +#ifdef PROTOBUF_USE_EXCEPTIONS +FatalException::~FatalException() throw() {} + +const char* FatalException::what() const throw() { + return message_.c_str(); +} +#endif + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h new file mode 100644 index 000000000..7f5fd4d2d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h @@ -0,0 +1,1211 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) and others +// +// Contains basic types and utilities used by the rest of the library. + +#ifndef GOOGLE_PROTOBUF_COMMON_H__ +#define GOOGLE_PROTOBUF_COMMON_H__ + +#include +#include +#include +#include +#include +#if defined(__osf__) +// Tru64 lacks stdint.h, but has inttypes.h which defines a superset of +// what stdint.h would define. +#include +#elif !defined(_MSC_VER) +#include +#endif + +#if defined(_MSC_VER) && defined(_CPPUNWIND) + #define PROTOBUF_USE_EXCEPTIONS +#elif defined(__EXCEPTIONS) + #define PROTOBUF_USE_EXCEPTIONS +#endif +#ifdef PROTOBUF_USE_EXCEPTIONS +#include +#endif + +#if defined(_WIN32) && defined(GetMessage) +// Allow GetMessage to be used as a valid method name in protobuf classes. +// windows.h defines GetMessage() as a macro. Let's re-define it as an inline +// function. The inline function should be equivalent for C++ users. +inline BOOL GetMessage_Win32( + LPMSG lpMsg, HWND hWnd, + UINT wMsgFilterMin, UINT wMsgFilterMax) { + return GetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); +} +#undef GetMessage +inline BOOL GetMessage( + LPMSG lpMsg, HWND hWnd, + UINT wMsgFilterMin, UINT wMsgFilterMax) { + return GetMessage_Win32(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); +} +#endif + + +namespace std {} + +namespace google { +namespace protobuf { + +#undef GOOGLE_DISALLOW_EVIL_CONSTRUCTORS +#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName) \ + TypeName(const TypeName&); \ + void operator=(const TypeName&) + +#if defined(_MSC_VER) && defined(PROTOBUF_USE_DLLS) + #ifdef LIBPROTOBUF_EXPORTS + #define LIBPROTOBUF_EXPORT __declspec(dllexport) + #else + #define LIBPROTOBUF_EXPORT __declspec(dllimport) + #endif + #ifdef LIBPROTOC_EXPORTS + #define LIBPROTOC_EXPORT __declspec(dllexport) + #else + #define LIBPROTOC_EXPORT __declspec(dllimport) + #endif +#else + #define LIBPROTOBUF_EXPORT + #define LIBPROTOC_EXPORT +#endif + +namespace internal { + +// Some of these constants are macros rather than const ints so that they can +// be used in #if directives. + +// The current version, represented as a single integer to make comparison +// easier: major * 10^6 + minor * 10^3 + micro +#define GOOGLE_PROTOBUF_VERSION 2004002 + +// The minimum library version which works with the current version of the +// headers. +#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION 2004000 + +// The minimum header version which works with the current version of +// the library. This constant should only be used by protoc's C++ code +// generator. +static const int kMinHeaderVersionForLibrary = 2004000; + +// The minimum protoc version which works with the current version of the +// headers. +#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION 2004000 + +// The minimum header version which works with the current version of +// protoc. This constant should only be used in VerifyVersion(). +static const int kMinHeaderVersionForProtoc = 2004000; + +// Verifies that the headers and libraries are compatible. Use the macro +// below to call this. +void LIBPROTOBUF_EXPORT VerifyVersion(int headerVersion, int minLibraryVersion, + const char* filename); + +// Converts a numeric version number to a string. +std::string LIBPROTOBUF_EXPORT VersionString(int version); + +} // namespace internal + +// Place this macro in your main() function (or somewhere before you attempt +// to use the protobuf library) to verify that the version you link against +// matches the headers you compiled against. If a version mismatch is +// detected, the process will abort. +#define GOOGLE_PROTOBUF_VERIFY_VERSION \ + ::google::protobuf::internal::VerifyVersion( \ + GOOGLE_PROTOBUF_VERSION, GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION, \ + __FILE__) + +// =================================================================== +// from google3/base/port.h + +typedef unsigned int uint; + +#ifdef _MSC_VER +typedef __int8 int8; +typedef __int16 int16; +typedef __int32 int32; +typedef __int64 int64; + +typedef unsigned __int8 uint8; +typedef unsigned __int16 uint16; +typedef unsigned __int32 uint32; +typedef unsigned __int64 uint64; +#else +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; + +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; +#endif + +// long long macros to be used because gcc and vc++ use different suffixes, +// and different size specifiers in format strings +#undef GOOGLE_LONGLONG +#undef GOOGLE_ULONGLONG +#undef GOOGLE_LL_FORMAT + +#ifdef _MSC_VER +#define GOOGLE_LONGLONG(x) x##I64 +#define GOOGLE_ULONGLONG(x) x##UI64 +#define GOOGLE_LL_FORMAT "I64" // As in printf("%I64d", ...) +#else +#define GOOGLE_LONGLONG(x) x##LL +#define GOOGLE_ULONGLONG(x) x##ULL +#define GOOGLE_LL_FORMAT "ll" // As in "%lld". Note that "q" is poor form also. +#endif + +static const int32 kint32max = 0x7FFFFFFF; +static const int32 kint32min = -kint32max - 1; +static const int64 kint64max = GOOGLE_LONGLONG(0x7FFFFFFFFFFFFFFF); +static const int64 kint64min = -kint64max - 1; +static const uint32 kuint32max = 0xFFFFFFFFu; +static const uint64 kuint64max = GOOGLE_ULONGLONG(0xFFFFFFFFFFFFFFFF); + +// ------------------------------------------------------------------- +// Annotations: Some parts of the code have been annotated in ways that might +// be useful to some compilers or tools, but are not supported universally. +// You can #define these annotations yourself if the default implementation +// is not right for you. + +#ifndef GOOGLE_ATTRIBUTE_ALWAYS_INLINE +#if defined(__GNUC__) && (__GNUC__ > 3 ||(__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +// For functions we want to force inline. +// Introduced in gcc 3.1. +#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE __attribute__ ((always_inline)) +#else +// Other compilers will have to figure it out for themselves. +#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE +#endif +#endif + +#ifndef GOOGLE_ATTRIBUTE_DEPRECATED +#ifdef __GNUC__ +// If the method/variable/type is used anywhere, produce a warning. +#define GOOGLE_ATTRIBUTE_DEPRECATED __attribute__((deprecated)) +#else +#define GOOGLE_ATTRIBUTE_DEPRECATED +#endif +#endif + +#ifndef GOOGLE_PREDICT_TRUE +#ifdef __GNUC__ +// Provided at least since GCC 3.0. +#define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1)) +#else +#define GOOGLE_PREDICT_TRUE +#endif +#endif + +// Delimits a block of code which may write to memory which is simultaneously +// written by other threads, but which has been determined to be thread-safe +// (e.g. because it is an idempotent write). +#ifndef GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN +#define GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN() +#endif +#ifndef GOOGLE_SAFE_CONCURRENT_WRITES_END +#define GOOGLE_SAFE_CONCURRENT_WRITES_END() +#endif + +// =================================================================== +// from google3/base/basictypes.h + +// The GOOGLE_ARRAYSIZE(arr) macro returns the # of elements in an array arr. +// The expression is a compile-time constant, and therefore can be +// used in defining new arrays, for example. +// +// GOOGLE_ARRAYSIZE catches a few type errors. If you see a compiler error +// +// "warning: division by zero in ..." +// +// when using GOOGLE_ARRAYSIZE, you are (wrongfully) giving it a pointer. +// You should only use GOOGLE_ARRAYSIZE on statically allocated arrays. +// +// The following comments are on the implementation details, and can +// be ignored by the users. +// +// ARRAYSIZE(arr) works by inspecting sizeof(arr) (the # of bytes in +// the array) and sizeof(*(arr)) (the # of bytes in one array +// element). If the former is divisible by the latter, perhaps arr is +// indeed an array, in which case the division result is the # of +// elements in the array. Otherwise, arr cannot possibly be an array, +// and we generate a compiler error to prevent the code from +// compiling. +// +// Since the size of bool is implementation-defined, we need to cast +// !(sizeof(a) & sizeof(*(a))) to size_t in order to ensure the final +// result has type size_t. +// +// This macro is not perfect as it wrongfully accepts certain +// pointers, namely where the pointer size is divisible by the pointee +// size. Since all our code has to go through a 32-bit compiler, +// where a pointer is 4 bytes, this means all pointers to a type whose +// size is 3 or greater than 4 will be (righteously) rejected. +// +// Kudos to Jorg Brown for this simple and elegant implementation. + +#undef GOOGLE_ARRAYSIZE +#define GOOGLE_ARRAYSIZE(a) \ + ((sizeof(a) / sizeof(*(a))) / \ + static_cast(!(sizeof(a) % sizeof(*(a))))) + +namespace internal { + +// Use implicit_cast as a safe version of static_cast or const_cast +// for upcasting in the type hierarchy (i.e. casting a pointer to Foo +// to a pointer to SuperclassOfFoo or casting a pointer to Foo to +// a const pointer to Foo). +// When you use implicit_cast, the compiler checks that the cast is safe. +// Such explicit implicit_casts are necessary in surprisingly many +// situations where C++ demands an exact type match instead of an +// argument type convertable to a target type. +// +// The From type can be inferred, so the preferred syntax for using +// implicit_cast is the same as for static_cast etc.: +// +// implicit_cast(expr) +// +// implicit_cast would have been part of the C++ standard library, +// but the proposal was submitted too late. It will probably make +// its way into the language in the future. +template +inline To implicit_cast(From const &f) { + return f; +} + +// When you upcast (that is, cast a pointer from type Foo to type +// SuperclassOfFoo), it's fine to use implicit_cast<>, since upcasts +// always succeed. When you downcast (that is, cast a pointer from +// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because +// how do you know the pointer is really of type SubclassOfFoo? It +// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, +// when you downcast, you should use this macro. In debug mode, we +// use dynamic_cast<> to double-check the downcast is legal (we die +// if it's not). In normal mode, we do the efficient static_cast<> +// instead. Thus, it's important to test in debug mode to make sure +// the cast is legal! +// This is the only place in the code we should use dynamic_cast<>. +// In particular, you SHOULDN'T be using dynamic_cast<> in order to +// do RTTI (eg code like this: +// if (dynamic_cast(foo)) HandleASubclass1Object(foo); +// if (dynamic_cast(foo)) HandleASubclass2Object(foo); +// You should design the code some other way not to need this. + +template // use like this: down_cast(foo); +inline To down_cast(From* f) { // so we only accept pointers + // Ensures that To is a sub-type of From *. This test is here only + // for compile-time type checking, and has no overhead in an + // optimized build at run-time, as it will be optimized away + // completely. + if (false) { + implicit_cast(0); + } + +#if !defined(NDEBUG) && !defined(GOOGLE_PROTOBUF_NO_RTTI) + assert(f == NULL || dynamic_cast(f) != NULL); // RTTI: debug mode only! +#endif + return static_cast(f); +} + +} // namespace internal + +// We made these internal so that they would show up as such in the docs, +// but we don't want to stick "internal::" in front of them everywhere. +using internal::implicit_cast; +using internal::down_cast; + +// The COMPILE_ASSERT macro can be used to verify that a compile time +// expression is true. For example, you could use it to verify the +// size of a static array: +// +// COMPILE_ASSERT(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES, +// content_type_names_incorrect_size); +// +// or to make sure a struct is smaller than a certain size: +// +// COMPILE_ASSERT(sizeof(foo) < 128, foo_too_large); +// +// The second argument to the macro is the name of the variable. If +// the expression is false, most compilers will issue a warning/error +// containing the name of the variable. + +namespace internal { + +template +struct CompileAssert { +}; + +} // namespace internal + +#undef GOOGLE_COMPILE_ASSERT +#define GOOGLE_COMPILE_ASSERT(expr, msg) \ + typedef ::google::protobuf::internal::CompileAssert<(bool(expr))> \ + msg[bool(expr) ? 1 : -1] + + +// Implementation details of COMPILE_ASSERT: +// +// - COMPILE_ASSERT works by defining an array type that has -1 +// elements (and thus is invalid) when the expression is false. +// +// - The simpler definition +// +// #define COMPILE_ASSERT(expr, msg) typedef char msg[(expr) ? 1 : -1] +// +// does not work, as gcc supports variable-length arrays whose sizes +// are determined at run-time (this is gcc's extension and not part +// of the C++ standard). As a result, gcc fails to reject the +// following code with the simple definition: +// +// int foo; +// COMPILE_ASSERT(foo, msg); // not supposed to compile as foo is +// // not a compile-time constant. +// +// - By using the type CompileAssert<(bool(expr))>, we ensures that +// expr is a compile-time constant. (Template arguments must be +// determined at compile-time.) +// +// - The outter parentheses in CompileAssert<(bool(expr))> are necessary +// to work around a bug in gcc 3.4.4 and 4.0.1. If we had written +// +// CompileAssert +// +// instead, these compilers will refuse to compile +// +// COMPILE_ASSERT(5 > 0, some_message); +// +// (They seem to think the ">" in "5 > 0" marks the end of the +// template argument list.) +// +// - The array size is (bool(expr) ? 1 : -1), instead of simply +// +// ((expr) ? 1 : -1). +// +// This is to avoid running into a bug in MS VC 7.1, which +// causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1. + +// =================================================================== +// from google3/base/scoped_ptr.h + +namespace internal { + +// This is an implementation designed to match the anticipated future TR2 +// implementation of the scoped_ptr class, and its closely-related brethren, +// scoped_array, scoped_ptr_malloc, and make_scoped_ptr. + +template class scoped_ptr; +template class scoped_array; + +// A scoped_ptr is like a T*, except that the destructor of scoped_ptr +// automatically deletes the pointer it holds (if any). +// That is, scoped_ptr owns the T object that it points to. +// Like a T*, a scoped_ptr may hold either NULL or a pointer to a T object. +// +// The size of a scoped_ptr is small: +// sizeof(scoped_ptr) == sizeof(C*) +template +class scoped_ptr { + public: + + // The element type + typedef C element_type; + + // Constructor. Defaults to intializing with NULL. + // There is no way to create an uninitialized scoped_ptr. + // The input parameter must be allocated with new. + explicit scoped_ptr(C* p = NULL) : ptr_(p) { } + + // Destructor. If there is a C object, delete it. + // We don't need to test ptr_ == NULL because C++ does that for us. + ~scoped_ptr() { + enum { type_must_be_complete = sizeof(C) }; + delete ptr_; + } + + // Reset. Deletes the current owned object, if any. + // Then takes ownership of a new object, if given. + // this->reset(this->get()) works. + void reset(C* p = NULL) { + if (p != ptr_) { + enum { type_must_be_complete = sizeof(C) }; + delete ptr_; + ptr_ = p; + } + } + + // Accessors to get the owned object. + // operator* and operator-> will assert() if there is no current object. + C& operator*() const { + assert(ptr_ != NULL); + return *ptr_; + } + C* operator->() const { + assert(ptr_ != NULL); + return ptr_; + } + C* get() const { return ptr_; } + + // Comparison operators. + // These return whether two scoped_ptr refer to the same object, not just to + // two different but equal objects. + bool operator==(C* p) const { return ptr_ == p; } + bool operator!=(C* p) const { return ptr_ != p; } + + // Swap two scoped pointers. + void swap(scoped_ptr& p2) { + C* tmp = ptr_; + ptr_ = p2.ptr_; + p2.ptr_ = tmp; + } + + // Release a pointer. + // The return value is the current pointer held by this object. + // If this object holds a NULL pointer, the return value is NULL. + // After this operation, this object will hold a NULL pointer, + // and will not own the object any more. + C* release() { + C* retVal = ptr_; + ptr_ = NULL; + return retVal; + } + + private: + C* ptr_; + + // Forbid comparison of scoped_ptr types. If C2 != C, it totally doesn't + // make sense, and if C2 == C, it still doesn't make sense because you should + // never have the same object owned by two different scoped_ptrs. + template bool operator==(scoped_ptr const& p2) const; + template bool operator!=(scoped_ptr const& p2) const; + + // Disallow evil constructors + scoped_ptr(const scoped_ptr&); + void operator=(const scoped_ptr&); +}; + +// scoped_array is like scoped_ptr, except that the caller must allocate +// with new [] and the destructor deletes objects with delete []. +// +// As with scoped_ptr, a scoped_array either points to an object +// or is NULL. A scoped_array owns the object that it points to. +// +// Size: sizeof(scoped_array) == sizeof(C*) +template +class scoped_array { + public: + + // The element type + typedef C element_type; + + // Constructor. Defaults to intializing with NULL. + // There is no way to create an uninitialized scoped_array. + // The input parameter must be allocated with new []. + explicit scoped_array(C* p = NULL) : array_(p) { } + + // Destructor. If there is a C object, delete it. + // We don't need to test ptr_ == NULL because C++ does that for us. + ~scoped_array() { + enum { type_must_be_complete = sizeof(C) }; + delete[] array_; + } + + // Reset. Deletes the current owned object, if any. + // Then takes ownership of a new object, if given. + // this->reset(this->get()) works. + void reset(C* p = NULL) { + if (p != array_) { + enum { type_must_be_complete = sizeof(C) }; + delete[] array_; + array_ = p; + } + } + + // Get one element of the current object. + // Will assert() if there is no current object, or index i is negative. + C& operator[](std::ptrdiff_t i) const { + assert(i >= 0); + assert(array_ != NULL); + return array_[i]; + } + + // Get a pointer to the zeroth element of the current object. + // If there is no current object, return NULL. + C* get() const { + return array_; + } + + // Comparison operators. + // These return whether two scoped_array refer to the same object, not just to + // two different but equal objects. + bool operator==(C* p) const { return array_ == p; } + bool operator!=(C* p) const { return array_ != p; } + + // Swap two scoped arrays. + void swap(scoped_array& p2) { + C* tmp = array_; + array_ = p2.array_; + p2.array_ = tmp; + } + + // Release an array. + // The return value is the current pointer held by this object. + // If this object holds a NULL pointer, the return value is NULL. + // After this operation, this object will hold a NULL pointer, + // and will not own the object any more. + C* release() { + C* retVal = array_; + array_ = NULL; + return retVal; + } + + private: + C* array_; + + // Forbid comparison of different scoped_array types. + template bool operator==(scoped_array const& p2) const; + template bool operator!=(scoped_array const& p2) const; + + // Disallow evil constructors + scoped_array(const scoped_array&); + void operator=(const scoped_array&); +}; + +} // namespace internal + +// We made these internal so that they would show up as such in the docs, +// but we don't want to stick "internal::" in front of them everywhere. +using internal::scoped_ptr; +using internal::scoped_array; + +// =================================================================== +// emulates google3/base/logging.h + +enum LogLevel { + LOGLEVEL_INFO, // Informational. This is never actually used by + // libprotobuf. + LOGLEVEL_WARNING, // Warns about issues that, although not technically a + // problem now, could cause problems in the future. For + // example, a // warning will be printed when parsing a + // message that is near the message size limit. + LOGLEVEL_ERROR, // An error occurred which should never happen during + // normal use. + LOGLEVEL_FATAL, // An error occurred from which the library cannot + // recover. This usually indicates a programming error + // in the code which calls the library, especially when + // compiled in debug mode. + +#ifdef NDEBUG + LOGLEVEL_DFATAL = LOGLEVEL_ERROR +#else + LOGLEVEL_DFATAL = LOGLEVEL_FATAL +#endif +}; + +namespace internal { + +class LogFinisher; + +class LIBPROTOBUF_EXPORT LogMessage { + public: + LogMessage(LogLevel level, const char* filename, int line); + ~LogMessage(); + + LogMessage& operator<<(const std::string& value); + LogMessage& operator<<(const char* value); + LogMessage& operator<<(char value); + LogMessage& operator<<(int value); + LogMessage& operator<<(uint value); + LogMessage& operator<<(long value); + LogMessage& operator<<(unsigned long value); + LogMessage& operator<<(double value); + + private: + friend class LogFinisher; + void Finish(); + + LogLevel level_; + const char* filename_; + int line_; + std::string message_; +}; + +// Used to make the entire "LOG(BLAH) << etc." expression have a void return +// type and print a newline after each message. +class LIBPROTOBUF_EXPORT LogFinisher { + public: + void operator=(LogMessage& other); +}; + +} // namespace internal + +// Undef everything in case we're being mixed with some other Google library +// which already defined them itself. Presumably all Google libraries will +// support the same syntax for these so it should not be a big deal if they +// end up using our definitions instead. +#undef GOOGLE_LOG +#undef GOOGLE_LOG_IF + +#undef GOOGLE_CHECK +#undef GOOGLE_CHECK_EQ +#undef GOOGLE_CHECK_NE +#undef GOOGLE_CHECK_LT +#undef GOOGLE_CHECK_LE +#undef GOOGLE_CHECK_GT +#undef GOOGLE_CHECK_GE + +#undef GOOGLE_DLOG +#undef GOOGLE_DCHECK +#undef GOOGLE_DCHECK_EQ +#undef GOOGLE_DCHECK_NE +#undef GOOGLE_DCHECK_LT +#undef GOOGLE_DCHECK_LE +#undef GOOGLE_DCHECK_GT +#undef GOOGLE_DCHECK_GE + +#define GOOGLE_LOG(LEVEL) \ + ::google::protobuf::internal::LogFinisher() = \ + ::google::protobuf::internal::LogMessage( \ + ::google::protobuf::LOGLEVEL_##LEVEL, __FILE__, __LINE__) +#define GOOGLE_LOG_IF(LEVEL, CONDITION) \ + !(CONDITION) ? (void)0 : GOOGLE_LOG(LEVEL) + +#define GOOGLE_CHECK(EXPRESSION) \ + GOOGLE_LOG_IF(FATAL, !(EXPRESSION)) << "CHECK failed: " #EXPRESSION ": " +#define GOOGLE_CHECK_EQ(A, B) GOOGLE_CHECK((A) == (B)) +#define GOOGLE_CHECK_NE(A, B) GOOGLE_CHECK((A) != (B)) +#define GOOGLE_CHECK_LT(A, B) GOOGLE_CHECK((A) < (B)) +#define GOOGLE_CHECK_LE(A, B) GOOGLE_CHECK((A) <= (B)) +#define GOOGLE_CHECK_GT(A, B) GOOGLE_CHECK((A) > (B)) +#define GOOGLE_CHECK_GE(A, B) GOOGLE_CHECK((A) >= (B)) + +#ifdef NDEBUG + +#define GOOGLE_DLOG GOOGLE_LOG_IF(INFO, false) + +#define GOOGLE_DCHECK(EXPRESSION) while(false) GOOGLE_CHECK(EXPRESSION) +#define GOOGLE_DCHECK_EQ(A, B) GOOGLE_DCHECK((A) == (B)) +#define GOOGLE_DCHECK_NE(A, B) GOOGLE_DCHECK((A) != (B)) +#define GOOGLE_DCHECK_LT(A, B) GOOGLE_DCHECK((A) < (B)) +#define GOOGLE_DCHECK_LE(A, B) GOOGLE_DCHECK((A) <= (B)) +#define GOOGLE_DCHECK_GT(A, B) GOOGLE_DCHECK((A) > (B)) +#define GOOGLE_DCHECK_GE(A, B) GOOGLE_DCHECK((A) >= (B)) + +#else // NDEBUG + +#define GOOGLE_DLOG GOOGLE_LOG + +#define GOOGLE_DCHECK GOOGLE_CHECK +#define GOOGLE_DCHECK_EQ GOOGLE_CHECK_EQ +#define GOOGLE_DCHECK_NE GOOGLE_CHECK_NE +#define GOOGLE_DCHECK_LT GOOGLE_CHECK_LT +#define GOOGLE_DCHECK_LE GOOGLE_CHECK_LE +#define GOOGLE_DCHECK_GT GOOGLE_CHECK_GT +#define GOOGLE_DCHECK_GE GOOGLE_CHECK_GE + +#endif // !NDEBUG + +typedef void LogHandler(LogLevel level, const char* filename, int line, + const std::string& message); + +// The protobuf library sometimes writes warning and error messages to +// stderr. These messages are primarily useful for developers, but may +// also help end users figure out a problem. If you would prefer that +// these messages be sent somewhere other than stderr, call SetLogHandler() +// to set your own handler. This returns the old handler. Set the handler +// to NULL to ignore log messages (but see also LogSilencer, below). +// +// Obviously, SetLogHandler is not thread-safe. You should only call it +// at initialization time, and probably not from library code. If you +// simply want to suppress log messages temporarily (e.g. because you +// have some code that tends to trigger them frequently and you know +// the warnings are not important to you), use the LogSilencer class +// below. +LIBPROTOBUF_EXPORT LogHandler* SetLogHandler(LogHandler* new_func); + +// Create a LogSilencer if you want to temporarily suppress all log +// messages. As long as any LogSilencer objects exist, non-fatal +// log messages will be discarded (the current LogHandler will *not* +// be called). Constructing a LogSilencer is thread-safe. You may +// accidentally suppress log messages occurring in another thread, but +// since messages are generally for debugging purposes only, this isn't +// a big deal. If you want to intercept log messages, use SetLogHandler(). +class LIBPROTOBUF_EXPORT LogSilencer { + public: + LogSilencer(); + ~LogSilencer(); +}; + +// =================================================================== +// emulates google3/base/callback.h + +// Abstract interface for a callback. When calling an RPC, you must provide +// a Closure to call when the procedure completes. See the Service interface +// in service.h. +// +// To automatically construct a Closure which calls a particular function or +// method with a particular set of parameters, use the NewCallback() function. +// Example: +// void FooDone(const FooResponse* response) { +// ... +// } +// +// void CallFoo() { +// ... +// // When done, call FooDone() and pass it a pointer to the response. +// Closure* callback = NewCallback(&FooDone, response); +// // Make the call. +// service->Foo(controller, request, response, callback); +// } +// +// Example that calls a method: +// class Handler { +// public: +// ... +// +// void FooDone(const FooResponse* response) { +// ... +// } +// +// void CallFoo() { +// ... +// // When done, call FooDone() and pass it a pointer to the response. +// Closure* callback = NewCallback(this, &Handler::FooDone, response); +// // Make the call. +// service->Foo(controller, request, response, callback); +// } +// }; +// +// Currently NewCallback() supports binding zero, one, or two arguments. +// +// Callbacks created with NewCallback() automatically delete themselves when +// executed. They should be used when a callback is to be called exactly +// once (usually the case with RPC callbacks). If a callback may be called +// a different number of times (including zero), create it with +// NewPermanentCallback() instead. You are then responsible for deleting the +// callback (using the "delete" keyword as normal). +// +// Note that NewCallback() is a bit touchy regarding argument types. Generally, +// the values you provide for the parameter bindings must exactly match the +// types accepted by the callback function. For example: +// void Foo(string s); +// NewCallback(&Foo, "foo"); // WON'T WORK: const char* != string +// NewCallback(&Foo, string("foo")); // WORKS +// Also note that the arguments cannot be references: +// void Foo(const string& s); +// string my_str; +// NewCallback(&Foo, my_str); // WON'T WORK: Can't use referecnes. +// However, correctly-typed pointers will work just fine. +class LIBPROTOBUF_EXPORT Closure { + public: + Closure() {} + virtual ~Closure(); + + virtual void Run() = 0; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Closure); +}; + +namespace internal { + +class LIBPROTOBUF_EXPORT FunctionClosure0 : public Closure { + public: + typedef void (*FunctionType)(); + + FunctionClosure0(FunctionType function, bool self_deleting) + : function_(function), self_deleting_(self_deleting) {} + ~FunctionClosure0(); + + void Run() { + bool needs_delete = self_deleting_; // read in case callback deletes + function_(); + if (needs_delete) delete this; + } + + private: + FunctionType function_; + bool self_deleting_; +}; + +template +class MethodClosure0 : public Closure { + public: + typedef void (Class::*MethodType)(); + + MethodClosure0(Class* object, MethodType method, bool self_deleting) + : object_(object), method_(method), self_deleting_(self_deleting) {} + ~MethodClosure0() {} + + void Run() { + bool needs_delete = self_deleting_; // read in case callback deletes + (object_->*method_)(); + if (needs_delete) delete this; + } + + private: + Class* object_; + MethodType method_; + bool self_deleting_; +}; + +template +class FunctionClosure1 : public Closure { + public: + typedef void (*FunctionType)(Arg1 arg1); + + FunctionClosure1(FunctionType function, bool self_deleting, + Arg1 arg1) + : function_(function), self_deleting_(self_deleting), + arg1_(arg1) {} + ~FunctionClosure1() {} + + void Run() { + bool needs_delete = self_deleting_; // read in case callback deletes + function_(arg1_); + if (needs_delete) delete this; + } + + private: + FunctionType function_; + bool self_deleting_; + Arg1 arg1_; +}; + +template +class MethodClosure1 : public Closure { + public: + typedef void (Class::*MethodType)(Arg1 arg1); + + MethodClosure1(Class* object, MethodType method, bool self_deleting, + Arg1 arg1) + : object_(object), method_(method), self_deleting_(self_deleting), + arg1_(arg1) {} + ~MethodClosure1() {} + + void Run() { + bool needs_delete = self_deleting_; // read in case callback deletes + (object_->*method_)(arg1_); + if (needs_delete) delete this; + } + + private: + Class* object_; + MethodType method_; + bool self_deleting_; + Arg1 arg1_; +}; + +template +class FunctionClosure2 : public Closure { + public: + typedef void (*FunctionType)(Arg1 arg1, Arg2 arg2); + + FunctionClosure2(FunctionType function, bool self_deleting, + Arg1 arg1, Arg2 arg2) + : function_(function), self_deleting_(self_deleting), + arg1_(arg1), arg2_(arg2) {} + ~FunctionClosure2() {} + + void Run() { + bool needs_delete = self_deleting_; // read in case callback deletes + function_(arg1_, arg2_); + if (needs_delete) delete this; + } + + private: + FunctionType function_; + bool self_deleting_; + Arg1 arg1_; + Arg2 arg2_; +}; + +template +class MethodClosure2 : public Closure { + public: + typedef void (Class::*MethodType)(Arg1 arg1, Arg2 arg2); + + MethodClosure2(Class* object, MethodType method, bool self_deleting, + Arg1 arg1, Arg2 arg2) + : object_(object), method_(method), self_deleting_(self_deleting), + arg1_(arg1), arg2_(arg2) {} + ~MethodClosure2() {} + + void Run() { + bool needs_delete = self_deleting_; // read in case callback deletes + (object_->*method_)(arg1_, arg2_); + if (needs_delete) delete this; + } + + private: + Class* object_; + MethodType method_; + bool self_deleting_; + Arg1 arg1_; + Arg2 arg2_; +}; + +} // namespace internal + +// See Closure. +inline Closure* NewCallback(void (*function)()) { + return new internal::FunctionClosure0(function, true); +} + +// See Closure. +inline Closure* NewPermanentCallback(void (*function)()) { + return new internal::FunctionClosure0(function, false); +} + +// See Closure. +template +inline Closure* NewCallback(Class* object, void (Class::*method)()) { + return new internal::MethodClosure0(object, method, true); +} + +// See Closure. +template +inline Closure* NewPermanentCallback(Class* object, void (Class::*method)()) { + return new internal::MethodClosure0(object, method, false); +} + +// See Closure. +template +inline Closure* NewCallback(void (*function)(Arg1), + Arg1 arg1) { + return new internal::FunctionClosure1(function, true, arg1); +} + +// See Closure. +template +inline Closure* NewPermanentCallback(void (*function)(Arg1), + Arg1 arg1) { + return new internal::FunctionClosure1(function, false, arg1); +} + +// See Closure. +template +inline Closure* NewCallback(Class* object, void (Class::*method)(Arg1), + Arg1 arg1) { + return new internal::MethodClosure1(object, method, true, arg1); +} + +// See Closure. +template +inline Closure* NewPermanentCallback(Class* object, void (Class::*method)(Arg1), + Arg1 arg1) { + return new internal::MethodClosure1(object, method, false, arg1); +} + +// See Closure. +template +inline Closure* NewCallback(void (*function)(Arg1, Arg2), + Arg1 arg1, Arg2 arg2) { + return new internal::FunctionClosure2( + function, true, arg1, arg2); +} + +// See Closure. +template +inline Closure* NewPermanentCallback(void (*function)(Arg1, Arg2), + Arg1 arg1, Arg2 arg2) { + return new internal::FunctionClosure2( + function, false, arg1, arg2); +} + +// See Closure. +template +inline Closure* NewCallback(Class* object, void (Class::*method)(Arg1, Arg2), + Arg1 arg1, Arg2 arg2) { + return new internal::MethodClosure2( + object, method, true, arg1, arg2); +} + +// See Closure. +template +inline Closure* NewPermanentCallback( + Class* object, void (Class::*method)(Arg1, Arg2), + Arg1 arg1, Arg2 arg2) { + return new internal::MethodClosure2( + object, method, false, arg1, arg2); +} + +// A function which does nothing. Useful for creating no-op callbacks, e.g.: +// Closure* nothing = NewCallback(&DoNothing); +void LIBPROTOBUF_EXPORT DoNothing(); + +// =================================================================== +// emulates google3/base/mutex.h + +namespace internal { + +// A Mutex is a non-reentrant (aka non-recursive) mutex. At most one thread T +// may hold a mutex at a given time. If T attempts to Lock() the same Mutex +// while holding it, T will deadlock. +class LIBPROTOBUF_EXPORT Mutex { + public: + // Create a Mutex that is not held by anybody. + Mutex(); + + // Destructor + ~Mutex(); + + // Block if necessary until this Mutex is free, then acquire it exclusively. + void Lock(); + + // Release this Mutex. Caller must hold it exclusively. + void Unlock(); + + // Crash if this Mutex is not held exclusively by this thread. + // May fail to crash when it should; will never crash when it should not. + void AssertHeld(); + + private: + struct Internal; + Internal* mInternal; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Mutex); +}; + +// MutexLock(mu) acquires mu when constructed and releases it when destroyed. +class LIBPROTOBUF_EXPORT MutexLock { + public: + explicit MutexLock(Mutex *mu) : mu_(mu) { this->mu_->Lock(); } + ~MutexLock() { this->mu_->Unlock(); } + private: + Mutex *const mu_; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLock); +}; + +// TODO(kenton): Implement these? Hard to implement portably. +typedef MutexLock ReaderMutexLock; +typedef MutexLock WriterMutexLock; + +// MutexLockMaybe is like MutexLock, but is a no-op when mu is NULL. +class LIBPROTOBUF_EXPORT MutexLockMaybe { + public: + explicit MutexLockMaybe(Mutex *mu) : + mu_(mu) { if (this->mu_ != NULL) { this->mu_->Lock(); } } + ~MutexLockMaybe() { if (this->mu_ != NULL) { this->mu_->Unlock(); } } + private: + Mutex *const mu_; + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(MutexLockMaybe); +}; + +} // namespace internal + +// We made these internal so that they would show up as such in the docs, +// but we don't want to stick "internal::" in front of them everywhere. +using internal::Mutex; +using internal::MutexLock; +using internal::ReaderMutexLock; +using internal::WriterMutexLock; +using internal::MutexLockMaybe; + +// =================================================================== +// from google3/base/type_traits.h + +namespace internal { + +// Specified by TR1 [4.7.4] Pointer modifications. +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { typedef T type; }; +template struct remove_pointer { + typedef T type; }; + +// =================================================================== + +// Checks if the buffer contains structurally-valid UTF-8. Implemented in +// structurally_valid.cc. +LIBPROTOBUF_EXPORT bool IsStructurallyValidUTF8(const char* buf, int len); + +} // namespace internal + +// =================================================================== +// Shutdown support. + +// Shut down the entire protocol buffers library, deleting all static-duration +// objects allocated by the library or by generated .pb.cc files. +// +// There are two reasons you might want to call this: +// * You use a draconian definition of "memory leak" in which you expect +// every single malloc() to have a corresponding free(), even for objects +// which live until program exit. +// * You are writing a dynamically-loaded library which needs to clean up +// after itself when the library is unloaded. +// +// It is safe to call this multiple times. However, it is not safe to use +// any other part of the protocol buffers library after +// ShutdownProtobufLibrary() has been called. +LIBPROTOBUF_EXPORT void ShutdownProtobufLibrary(); + +namespace internal { + +// Register a function to be called when ShutdownProtocolBuffers() is called. +LIBPROTOBUF_EXPORT void OnShutdown(void (*func)()); + +} // namespace internal + +#ifdef PROTOBUF_USE_EXCEPTIONS +class FatalException : public std::exception { + public: + FatalException(const char* filename, int line, const std::string& message) + : filename_(filename), line_(line), message_(message) {} + virtual ~FatalException() throw(); + + virtual const char* what() const throw(); + + const char* filename() const { return filename_; } + int line() const { return line_; } + const std::string& message() const { return message_; } + + private: + const char* filename_; + const int line_; + const std::string message_; +}; +#endif + +// This is at the end of the file instead of the beginning to work around a bug +// in some versions of MSVC. +using namespace std; // Don't do this at home, kids. + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_COMMON_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc new file mode 100644 index 000000000..4109a52cb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc @@ -0,0 +1,357 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include +#include +#include +#include + +#include +#include + +#include "config.h" + +namespace google { +namespace protobuf { +namespace { + +// TODO(kenton): More tests. + +#ifdef PACKAGE_VERSION // only defined when using automake, not MSVC + +TEST(VersionTest, VersionMatchesConfig) { + // Verify that the version string specified in config.h matches the one + // in common.h. The config.h version is a string which may have a suffix + // like "beta" or "rc1", so we remove that. + string version = PACKAGE_VERSION; + int pos = 0; + while (pos < version.size() && + (ascii_isdigit(version[pos]) || version[pos] == '.')) { + ++pos; + } + version.erase(pos); + + EXPECT_EQ(version, internal::VersionString(GOOGLE_PROTOBUF_VERSION)); +} + +#endif // PACKAGE_VERSION + +TEST(CommonTest, IntMinMaxConstants) { + // kint32min was declared incorrectly in the first release of protobufs. + // Ugh. + EXPECT_LT(kint32min, kint32max); + EXPECT_EQ(static_cast(kint32min), static_cast(kint32max) + 1); + EXPECT_LT(kint64min, kint64max); + EXPECT_EQ(static_cast(kint64min), static_cast(kint64max) + 1); + EXPECT_EQ(0, kuint32max + 1); + EXPECT_EQ(0, kuint64max + 1); +} + +vector captured_messages_; + +void CaptureLog(LogLevel level, const char* filename, int line, + const string& message) { + captured_messages_.push_back( + strings::Substitute("$0 $1:$2: $3", + implicit_cast(level), filename, line, message)); +} + +TEST(LoggingTest, DefaultLogging) { + CaptureTestStderr(); + int line = __LINE__; + GOOGLE_LOG(INFO ) << "A message."; + GOOGLE_LOG(WARNING) << "A warning."; + GOOGLE_LOG(ERROR ) << "An error."; + + string text = GetCapturedTestStderr(); + EXPECT_EQ( + "libprotobuf INFO "__FILE__":" + SimpleItoa(line + 1) + "] A message.\n" + "libprotobuf WARNING "__FILE__":" + SimpleItoa(line + 2) + "] A warning.\n" + "libprotobuf ERROR "__FILE__":" + SimpleItoa(line + 3) + "] An error.\n", + text); +} + +TEST(LoggingTest, NullLogging) { + LogHandler* old_handler = SetLogHandler(NULL); + + CaptureTestStderr(); + GOOGLE_LOG(INFO ) << "A message."; + GOOGLE_LOG(WARNING) << "A warning."; + GOOGLE_LOG(ERROR ) << "An error."; + + EXPECT_TRUE(SetLogHandler(old_handler) == NULL); + + string text = GetCapturedTestStderr(); + EXPECT_EQ("", text); +} + +TEST(LoggingTest, CaptureLogging) { + captured_messages_.clear(); + + LogHandler* old_handler = SetLogHandler(&CaptureLog); + + int start_line = __LINE__; + GOOGLE_LOG(ERROR) << "An error."; + GOOGLE_LOG(WARNING) << "A warning."; + + EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog); + + ASSERT_EQ(2, captured_messages_.size()); + EXPECT_EQ( + "2 "__FILE__":" + SimpleItoa(start_line + 1) + ": An error.", + captured_messages_[0]); + EXPECT_EQ( + "1 "__FILE__":" + SimpleItoa(start_line + 2) + ": A warning.", + captured_messages_[1]); +} + +TEST(LoggingTest, SilenceLogging) { + captured_messages_.clear(); + + LogHandler* old_handler = SetLogHandler(&CaptureLog); + + int line1 = __LINE__; GOOGLE_LOG(INFO) << "Visible1"; + LogSilencer* silencer1 = new LogSilencer; + GOOGLE_LOG(INFO) << "Not visible."; + LogSilencer* silencer2 = new LogSilencer; + GOOGLE_LOG(INFO) << "Not visible."; + delete silencer1; + GOOGLE_LOG(INFO) << "Not visible."; + delete silencer2; + int line2 = __LINE__; GOOGLE_LOG(INFO) << "Visible2"; + + EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog); + + ASSERT_EQ(2, captured_messages_.size()); + EXPECT_EQ( + "0 "__FILE__":" + SimpleItoa(line1) + ": Visible1", + captured_messages_[0]); + EXPECT_EQ( + "0 "__FILE__":" + SimpleItoa(line2) + ": Visible2", + captured_messages_[1]); +} + +class ClosureTest : public testing::Test { + public: + void SetA123Method() { a_ = 123; } + static void SetA123Function() { current_instance_->a_ = 123; } + + void SetAMethod(int a) { a_ = a; } + void SetCMethod(string c) { c_ = c; } + + static void SetAFunction(int a) { current_instance_->a_ = a; } + static void SetCFunction(string c) { current_instance_->c_ = c; } + + void SetABMethod(int a, const char* b) { a_ = a; b_ = b; } + static void SetABFunction(int a, const char* b) { + current_instance_->a_ = a; + current_instance_->b_ = b; + } + + virtual void SetUp() { + current_instance_ = this; + a_ = 0; + b_ = NULL; + c_.clear(); + permanent_closure_ = NULL; + } + + void DeleteClosureInCallback() { + delete permanent_closure_; + } + + int a_; + const char* b_; + string c_; + Closure* permanent_closure_; + + static ClosureTest* current_instance_; +}; + +ClosureTest* ClosureTest::current_instance_ = NULL; + +TEST_F(ClosureTest, TestClosureFunction0) { + Closure* closure = NewCallback(&SetA123Function); + EXPECT_NE(123, a_); + closure->Run(); + EXPECT_EQ(123, a_); +} + +TEST_F(ClosureTest, TestClosureMethod0) { + Closure* closure = NewCallback(current_instance_, + &ClosureTest::SetA123Method); + EXPECT_NE(123, a_); + closure->Run(); + EXPECT_EQ(123, a_); +} + +TEST_F(ClosureTest, TestClosureFunction1) { + Closure* closure = NewCallback(&SetAFunction, 456); + EXPECT_NE(456, a_); + closure->Run(); + EXPECT_EQ(456, a_); +} + +TEST_F(ClosureTest, TestClosureMethod1) { + Closure* closure = NewCallback(current_instance_, + &ClosureTest::SetAMethod, 456); + EXPECT_NE(456, a_); + closure->Run(); + EXPECT_EQ(456, a_); +} + +TEST_F(ClosureTest, TestClosureFunction1String) { + Closure* closure = NewCallback(&SetCFunction, string("test")); + EXPECT_NE("test", c_); + closure->Run(); + EXPECT_EQ("test", c_); +} + +TEST_F(ClosureTest, TestClosureMethod1String) { + Closure* closure = NewCallback(current_instance_, + &ClosureTest::SetCMethod, string("test")); + EXPECT_NE("test", c_); + closure->Run(); + EXPECT_EQ("test", c_); +} + +TEST_F(ClosureTest, TestClosureFunction2) { + const char* cstr = "hello"; + Closure* closure = NewCallback(&SetABFunction, 789, cstr); + EXPECT_NE(789, a_); + EXPECT_NE(cstr, b_); + closure->Run(); + EXPECT_EQ(789, a_); + EXPECT_EQ(cstr, b_); +} + +TEST_F(ClosureTest, TestClosureMethod2) { + const char* cstr = "hello"; + Closure* closure = NewCallback(current_instance_, + &ClosureTest::SetABMethod, 789, cstr); + EXPECT_NE(789, a_); + EXPECT_NE(cstr, b_); + closure->Run(); + EXPECT_EQ(789, a_); + EXPECT_EQ(cstr, b_); +} + +// Repeat all of the above with NewPermanentCallback() + +TEST_F(ClosureTest, TestPermanentClosureFunction0) { + Closure* closure = NewPermanentCallback(&SetA123Function); + EXPECT_NE(123, a_); + closure->Run(); + EXPECT_EQ(123, a_); + a_ = 0; + closure->Run(); + EXPECT_EQ(123, a_); + delete closure; +} + +TEST_F(ClosureTest, TestPermanentClosureMethod0) { + Closure* closure = NewPermanentCallback(current_instance_, + &ClosureTest::SetA123Method); + EXPECT_NE(123, a_); + closure->Run(); + EXPECT_EQ(123, a_); + a_ = 0; + closure->Run(); + EXPECT_EQ(123, a_); + delete closure; +} + +TEST_F(ClosureTest, TestPermanentClosureFunction1) { + Closure* closure = NewPermanentCallback(&SetAFunction, 456); + EXPECT_NE(456, a_); + closure->Run(); + EXPECT_EQ(456, a_); + a_ = 0; + closure->Run(); + EXPECT_EQ(456, a_); + delete closure; +} + +TEST_F(ClosureTest, TestPermanentClosureMethod1) { + Closure* closure = NewPermanentCallback(current_instance_, + &ClosureTest::SetAMethod, 456); + EXPECT_NE(456, a_); + closure->Run(); + EXPECT_EQ(456, a_); + a_ = 0; + closure->Run(); + EXPECT_EQ(456, a_); + delete closure; +} + +TEST_F(ClosureTest, TestPermanentClosureFunction2) { + const char* cstr = "hello"; + Closure* closure = NewPermanentCallback(&SetABFunction, 789, cstr); + EXPECT_NE(789, a_); + EXPECT_NE(cstr, b_); + closure->Run(); + EXPECT_EQ(789, a_); + EXPECT_EQ(cstr, b_); + a_ = 0; + b_ = NULL; + closure->Run(); + EXPECT_EQ(789, a_); + EXPECT_EQ(cstr, b_); + delete closure; +} + +TEST_F(ClosureTest, TestPermanentClosureMethod2) { + const char* cstr = "hello"; + Closure* closure = NewPermanentCallback(current_instance_, + &ClosureTest::SetABMethod, 789, cstr); + EXPECT_NE(789, a_); + EXPECT_NE(cstr, b_); + closure->Run(); + EXPECT_EQ(789, a_); + EXPECT_EQ(cstr, b_); + a_ = 0; + b_ = NULL; + closure->Run(); + EXPECT_EQ(789, a_); + EXPECT_EQ(cstr, b_); + delete closure; +} + +TEST_F(ClosureTest, TestPermanentClosureDeleteInCallback) { + permanent_closure_ = NewPermanentCallback((ClosureTest*) this, + &ClosureTest::DeleteClosureInCallback); + permanent_closure_->Run(); +} + +} // anonymous namespace +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h new file mode 100644 index 000000000..822d60501 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h @@ -0,0 +1,220 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// Deals with the fact that hash_map is not defined everywhere. + +#ifndef GOOGLE_PROTOBUF_STUBS_HASH_H__ +#define GOOGLE_PROTOBUF_STUBS_HASH_H__ + +#include +#include +#include "config.h" + +#if defined(HAVE_HASH_MAP) && defined(HAVE_HASH_SET) +#include HASH_MAP_H +#include HASH_SET_H +#else +#define MISSING_HASH +#include +#include +#endif + +namespace google { +namespace protobuf { + +#ifdef MISSING_HASH + +// This system doesn't have hash_map or hash_set. Emulate them using map and +// set. + +// Make hash be the same as less. Note that everywhere where custom +// hash functions are defined in the protobuf code, they are also defined such +// that they can be used as "less" functions, which is required by MSVC anyway. +template +struct hash { + // Dummy, just to make derivative hash functions compile. + int operator()(const Key& key) { + GOOGLE_LOG(FATAL) << "Should never be called."; + return 0; + } + + inline bool operator()(const Key& a, const Key& b) const { + return a < b; + } +}; + +// Make sure char* is compared by value. +template <> +struct hash { + // Dummy, just to make derivative hash functions compile. + int operator()(const char* key) { + GOOGLE_LOG(FATAL) << "Should never be called."; + return 0; + } + + inline bool operator()(const char* a, const char* b) const { + return strcmp(a, b) < 0; + } +}; + +template , + typename EqualKey = int > +class hash_map : public std::map { +}; + +template , + typename EqualKey = int > +class hash_set : public std::set { +}; + +#elif defined(_MSC_VER) && !defined(_STLPORT_VERSION) + +template +struct hash : public HASH_NAMESPACE::hash_compare { +}; + +// MSVC's hash_compare hashes based on the string contents but +// compares based on the string pointer. WTF? +class CstringLess { + public: + inline bool operator()(const char* a, const char* b) const { + return strcmp(a, b) < 0; + } +}; + +template <> +struct hash + : public HASH_NAMESPACE::hash_compare { +}; + +template , + typename EqualKey = int > +class hash_map : public HASH_NAMESPACE::hash_map< + Key, Data, HashFcn> { +}; + +template , + typename EqualKey = int > +class hash_set : public HASH_NAMESPACE::hash_set< + Key, HashFcn> { +}; + +#else + +template +struct hash : public HASH_NAMESPACE::hash { +}; + +template +struct hash { + inline size_t operator()(const Key* key) const { + return reinterpret_cast(key); + } +}; + +// Unlike the old SGI version, the TR1 "hash" does not special-case char*. So, +// we go ahead and provide our own implementation. +template <> +struct hash { + inline size_t operator()(const char* str) const { + size_t result = 0; + for (; *str != '\0'; str++) { + result = 5 * result + *str; + } + return result; + } +}; + +template , + typename EqualKey = std::equal_to > +class hash_map : public HASH_NAMESPACE::HASH_MAP_CLASS< + Key, Data, HashFcn, EqualKey> { +}; + +template , + typename EqualKey = std::equal_to > +class hash_set : public HASH_NAMESPACE::HASH_SET_CLASS< + Key, HashFcn, EqualKey> { +}; + +#endif + +template <> +struct hash { + inline size_t operator()(const string& key) const { + return hash()(key.c_str()); + } + + static const size_t bucket_size = 4; + static const size_t min_buckets = 8; + inline size_t operator()(const string& a, const string& b) const { + return a < b; + } +}; + +template +struct hash > { + inline size_t operator()(const pair& key) const { + size_t first_hash = hash()(key.first); + size_t second_hash = hash()(key.second); + + // FIXME(kenton): What is the best way to compute this hash? I have + // no idea! This seems a bit better than an XOR. + return first_hash * ((1 << 16) - 1) + second_hash; + } + + static const size_t bucket_size = 4; + static const size_t min_buckets = 8; + inline size_t operator()(const pair& a, + const pair& b) const { + return a < b; + } +}; + +// Used by GCC/SGI STL only. (Why isn't this provided by the standard +// library? :( ) +struct streq { + inline bool operator()(const char* a, const char* b) const { + return strcmp(a, b) == 0; + } +}; + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_HASH_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h new file mode 100644 index 000000000..f5c9d6b6d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h @@ -0,0 +1,119 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/util/gtl/map-util.h +// Author: Anton Carver + +#ifndef GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ +#define GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ + +#include + +namespace google { +namespace protobuf { + +// Perform a lookup in a map or hash_map. +// If the key is present in the map then the value associated with that +// key is returned, otherwise the value passed as a default is returned. +template +const typename Collection::value_type::second_type& +FindWithDefault(const Collection& collection, + const typename Collection::value_type::first_type& key, + const typename Collection::value_type::second_type& value) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return value; + } + return it->second; +} + +// Perform a lookup in a map or hash_map. +// If the key is present a const pointer to the associated value is returned, +// otherwise a NULL pointer is returned. +template +const typename Collection::value_type::second_type* +FindOrNull(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return 0; + } + return &it->second; +} + +// Perform a lookup in a map or hash_map whose values are pointers. +// If the key is present a const pointer to the associated value is returned, +// otherwise a NULL pointer is returned. +// This function does not distinguish between a missing key and a key mapped +// to a NULL value. +template +const typename Collection::value_type::second_type +FindPtrOrNull(const Collection& collection, + const typename Collection::value_type::first_type& key) { + typename Collection::const_iterator it = collection.find(key); + if (it == collection.end()) { + return 0; + } + return it->second; +} + +// Change the value associated with a particular key in a map or hash_map. +// If the key is not present in the map the key and value are inserted, +// otherwise the value is updated to be a copy of the value provided. +// True indicates that an insert took place, false indicates an update. +template +bool InsertOrUpdate(Collection * const collection, + const Key& key, const Value& value) { + pair ret = + collection->insert(typename Collection::value_type(key, value)); + if (!ret.second) { + // update + ret.first->second = value; + return false; + } + return true; +} + +// Insert a new key and value into a map or hash_map. +// If the key is not present in the map the key and value are +// inserted, otherwise nothing happens. True indicates that an insert +// took place, false indicates the key was already present. +template +bool InsertIfNotPresent(Collection * const collection, + const Key& key, const Value& value) { + pair ret = + collection->insert(typename Collection::value_type(key, value)); + return ret.second; +} + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_MAP_UTIL_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc new file mode 100644 index 000000000..5b7af9ce9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc @@ -0,0 +1,88 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// emulates google3/base/once.h +// +// This header is intended to be included only by internal .cc files and +// generated .pb.cc files. Users should not use this directly. + +#ifdef _WIN32 +#include +#endif + +#include + +namespace google { +namespace protobuf { + +#ifdef _WIN32 + +struct ProtobufOnceInternal { + ProtobufOnceInternal() { + InitializeCriticalSection(&critical_section); + } + ~ProtobufOnceInternal() { + DeleteCriticalSection(&critical_section); + } + CRITICAL_SECTION critical_section; +}; + +ProtobufOnceType::~ProtobufOnceType() +{ + delete internal_; + internal_ = NULL; +} + +ProtobufOnceType::ProtobufOnceType() { + // internal_ may be non-NULL if Init() was already called. + if (internal_ == NULL) internal_ = new ProtobufOnceInternal; +} + +void ProtobufOnceType::Init(void (*init_func)()) { + // internal_ may be NULL if we're still in dynamic initialization and the + // constructor has not been called yet. As mentioned in once.h, we assume + // that the program is still single-threaded at this time, and therefore it + // should be safe to initialize internal_ like so. + if (internal_ == NULL) internal_ = new ProtobufOnceInternal; + + EnterCriticalSection(&internal_->critical_section); + if (!initialized_) { + init_func(); + initialized_ = true; + } + LeaveCriticalSection(&internal_->critical_section); +} + +#endif + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h new file mode 100644 index 000000000..0dee40766 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h @@ -0,0 +1,123 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// emulates google3/base/once.h +// +// This header is intended to be included only by internal .cc files and +// generated .pb.cc files. Users should not use this directly. +// +// This is basically a portable version of pthread_once(). +// +// This header declares three things: +// * A type called ProtobufOnceType. +// * A macro GOOGLE_PROTOBUF_DECLARE_ONCE() which declares a variable of type +// ProtobufOnceType. This is the only legal way to declare such a variable. +// The macro may only be used at the global scope (you cannot create local +// or class member variables of this type). +// * A function GogoleOnceInit(ProtobufOnceType* once, void (*init_func)()). +// This function, when invoked multiple times given the same ProtobufOnceType +// object, will invoke init_func on the first call only, and will make sure +// none of the calls return before that first call to init_func has finished. +// +// This implements a way to perform lazy initialization. It's more efficient +// than using mutexes as no lock is needed if initialization has already +// happened. +// +// Example usage: +// void Init(); +// GOOGLE_PROTOBUF_DECLARE_ONCE(once_init); +// +// // Calls Init() exactly once. +// void InitOnce() { +// GoogleOnceInit(&once_init, &Init); +// } +// +// Note that if GoogleOnceInit() is called before main() has begun, it must +// only be called by the thread that will eventually call main() -- that is, +// the thread that performs dynamic initialization. In general this is a safe +// assumption since people don't usually construct threads before main() starts, +// but it is technically not guaranteed. Unfortunately, Win32 provides no way +// whatsoever to statically-initialize its synchronization primitives, so our +// only choice is to assume that dynamic initialization is single-threaded. + +#ifndef GOOGLE_PROTOBUF_STUBS_ONCE_H__ +#define GOOGLE_PROTOBUF_STUBS_ONCE_H__ + +#include + +#ifndef _WIN32 +#include +#endif + +namespace google { +namespace protobuf { + +#ifdef _WIN32 + +struct ProtobufOnceInternal; + +struct LIBPROTOBUF_EXPORT ProtobufOnceType { + ProtobufOnceType(); + ~ProtobufOnceType(); + void Init(void (*init_func)()); + + volatile bool initialized_; + ProtobufOnceInternal* internal_; +}; + +#define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME) \ + ::google::protobuf::ProtobufOnceType NAME + +inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) { + // Note: Double-checked locking is safe on x86. + if (!once->initialized_) { + once->Init(init_func); + } +} + +#else + +typedef pthread_once_t ProtobufOnceType; + +#define GOOGLE_PROTOBUF_DECLARE_ONCE(NAME) \ + pthread_once_t NAME = PTHREAD_ONCE_INIT + +inline void GoogleOnceInit(ProtobufOnceType* once, void (*init_func)()) { + pthread_once(once, init_func); +} + +#endif + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_ONCE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc new file mode 100644 index 000000000..b8f86a0fc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc @@ -0,0 +1,253 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#ifdef _WIN32 +#include +#else +#include +#include +#endif + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace { + +class OnceInitTest : public testing::Test { + protected: + void SetUp() { + state_ = INIT_NOT_STARTED; + current_test_ = this; + } + + // Since ProtobufOnceType is only allowed to be allocated in static storage, + // each test must use a different pair of ProtobufOnceType objects which it + // must declare itself. + void SetOnces(ProtobufOnceType* once, ProtobufOnceType* recursive_once) { + once_ = once; + recursive_once_ = recursive_once; + } + + void InitOnce() { + GoogleOnceInit(once_, &InitStatic); + } + void InitRecursiveOnce() { + GoogleOnceInit(recursive_once_, &InitRecursiveStatic); + } + + void BlockInit() { init_blocker_.Lock(); } + void UnblockInit() { init_blocker_.Unlock(); } + + class TestThread { + public: + TestThread(Closure* callback) + : done_(false), joined_(false), callback_(callback) { +#ifdef _WIN32 + thread_ = CreateThread(NULL, 0, &Start, this, 0, NULL); +#else + pthread_create(&thread_, NULL, &Start, this); +#endif + } + ~TestThread() { + if (!joined_) Join(); + } + + bool IsDone() { + MutexLock lock(&done_mutex_); + return done_; + } + void Join() { + joined_ = true; +#ifdef _WIN32 + WaitForSingleObject(thread_, INFINITE); + CloseHandle(thread_); +#else + pthread_join(thread_, NULL); +#endif + } + + private: +#ifdef _WIN32 + HANDLE thread_; +#else + pthread_t thread_; +#endif + + Mutex done_mutex_; + bool done_; + bool joined_; + Closure* callback_; + +#ifdef _WIN32 + static DWORD WINAPI Start(LPVOID arg) { +#else + static void* Start(void* arg) { +#endif + reinterpret_cast(arg)->Run(); + return 0; + } + + void Run() { + callback_->Run(); + MutexLock lock(&done_mutex_); + done_ = true; + } + }; + + TestThread* RunInitOnceInNewThread() { + return new TestThread(NewCallback(this, &OnceInitTest::InitOnce)); + } + TestThread* RunInitRecursiveOnceInNewThread() { + return new TestThread(NewCallback(this, &OnceInitTest::InitRecursiveOnce)); + } + + enum State { + INIT_NOT_STARTED, + INIT_STARTED, + INIT_DONE + }; + State CurrentState() { + MutexLock lock(&mutex_); + return state_; + } + + void WaitABit() { +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); +#endif + } + + private: + Mutex mutex_; + Mutex init_blocker_; + State state_; + ProtobufOnceType* once_; + ProtobufOnceType* recursive_once_; + + void Init() { + MutexLock lock(&mutex_); + EXPECT_EQ(INIT_NOT_STARTED, state_); + state_ = INIT_STARTED; + mutex_.Unlock(); + init_blocker_.Lock(); + init_blocker_.Unlock(); + mutex_.Lock(); + state_ = INIT_DONE; + } + + static OnceInitTest* current_test_; + static void InitStatic() { current_test_->Init(); } + static void InitRecursiveStatic() { current_test_->InitOnce(); } +}; + +OnceInitTest* OnceInitTest::current_test_ = NULL; + +GOOGLE_PROTOBUF_DECLARE_ONCE(simple_once); + +TEST_F(OnceInitTest, Simple) { + SetOnces(&simple_once, NULL); + + EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); + InitOnce(); + EXPECT_EQ(INIT_DONE, CurrentState()); + + // Calling again has no effect. + InitOnce(); + EXPECT_EQ(INIT_DONE, CurrentState()); +} + +GOOGLE_PROTOBUF_DECLARE_ONCE(recursive_once1); +GOOGLE_PROTOBUF_DECLARE_ONCE(recursive_once2); + +TEST_F(OnceInitTest, Recursive) { + SetOnces(&recursive_once1, &recursive_once2); + + EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); + InitRecursiveOnce(); + EXPECT_EQ(INIT_DONE, CurrentState()); +} + +GOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_once); + +TEST_F(OnceInitTest, MultipleThreads) { + SetOnces(&multiple_threads_once, NULL); + + scoped_ptr threads[4]; + EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); + for (int i = 0; i < 4; i++) { + threads[i].reset(RunInitOnceInNewThread()); + } + for (int i = 0; i < 4; i++) { + threads[i]->Join(); + } + EXPECT_EQ(INIT_DONE, CurrentState()); +} + +GOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_blocked_once1); +GOOGLE_PROTOBUF_DECLARE_ONCE(multiple_threads_blocked_once2); + +TEST_F(OnceInitTest, MultipleThreadsBlocked) { + SetOnces(&multiple_threads_blocked_once1, &multiple_threads_blocked_once2); + + scoped_ptr threads[8]; + EXPECT_EQ(INIT_NOT_STARTED, CurrentState()); + + BlockInit(); + for (int i = 0; i < 4; i++) { + threads[i].reset(RunInitOnceInNewThread()); + } + for (int i = 4; i < 8; i++) { + threads[i].reset(RunInitRecursiveOnceInNewThread()); + } + + WaitABit(); + + // We should now have one thread blocked inside Init(), four blocked waiting + // for Init() to complete, and three blocked waiting for InitRecursive() to + // complete. + EXPECT_EQ(INIT_STARTED, CurrentState()); + UnblockInit(); + + for (int i = 0; i < 8; i++) { + threads[i]->Join(); + } + EXPECT_EQ(INIT_DONE, CurrentState()); +} + +} // anonymous namespace +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h new file mode 100644 index 000000000..a2e671bb7 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h @@ -0,0 +1,121 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/util/gtl/stl_util-inl.h + +#ifndef GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__ +#define GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__ + +#include + +namespace google { +namespace protobuf { + +// STLDeleteContainerPointers() +// For a range within a container of pointers, calls delete +// (non-array version) on these pointers. +// NOTE: for these three functions, we could just implement a DeleteObject +// functor and then call for_each() on the range and functor, but this +// requires us to pull in all of algorithm.h, which seems expensive. +// For hash_[multi]set, it is important that this deletes behind the iterator +// because the hash_set may call the hash function on the iterator when it is +// advanced, which could result in the hash function trying to deference a +// stale pointer. +template +void STLDeleteContainerPointers(ForwardIterator begin, + ForwardIterator end) { + while (begin != end) { + ForwardIterator temp = begin; + ++begin; + delete *temp; + } +} + +// Inside Google, this function implements a horrible, disgusting hack in which +// we reach into the string's private implementation and resize it without +// initializing the new bytes. In some cases doing this can significantly +// improve performance. However, since it's totally non-portable it has no +// place in open source code. Feel free to fill this function in with your +// own disgusting hack if you want the perf boost. +inline void STLStringResizeUninitialized(string* s, size_t new_size) { + s->resize(new_size); +} + +// Return a mutable char* pointing to a string's internal buffer, +// which may not be null-terminated. Writing through this pointer will +// modify the string. +// +// string_as_array(&str)[i] is valid for 0 <= i < str.size() until the +// next call to a string method that invalidates iterators. +// +// As of 2006-04, there is no standard-blessed way of getting a +// mutable reference to a string's internal buffer. However, issue 530 +// (http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#530) +// proposes this as the method. According to Matt Austern, this should +// already work on all current implementations. +inline char* string_as_array(string* str) { + // DO NOT USE const_cast(str->data())! See the unittest for why. + return str->empty() ? NULL : &*str->begin(); +} + +// STLDeleteElements() deletes all the elements in an STL container and clears +// the container. This function is suitable for use with a vector, set, +// hash_set, or any other STL container which defines sensible begin(), end(), +// and clear() methods. +// +// If container is NULL, this function is a no-op. +// +// As an alternative to calling STLDeleteElements() directly, consider +// ElementDeleter (defined below), which ensures that your container's elements +// are deleted when the ElementDeleter goes out of scope. +template +void STLDeleteElements(T *container) { + if (!container) return; + STLDeleteContainerPointers(container->begin(), container->end()); + container->clear(); +} + +// Given an STL container consisting of (key, value) pairs, STLDeleteValues +// deletes all the "value" components and clears the container. Does nothing +// in the case it's given a NULL pointer. + +template +void STLDeleteValues(T *v) { + if (!v) return; + for (typename T::iterator i = v->begin(); i != v->end(); ++i) { + delete i->second; + } + v->clear(); +} + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_STL_UTIL_INL_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc new file mode 100644 index 000000000..0f6afe6dc --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc @@ -0,0 +1,536 @@ +// Copyright 2005-2008 Google Inc. All Rights Reserved. +// Author: jrm@google.com (Jim Meehan) + +#include + +namespace google { +namespace protobuf { +namespace internal { + +// These four-byte entries compactly encode how many bytes 0..255 to delete +// in making a string replacement, how many bytes to add 0..255, and the offset +// 0..64k-1 of the replacement string in remap_string. +struct RemapEntry { + uint8 delete_bytes; + uint8 add_bytes; + uint16 bytes_offset; +}; + +// Exit type codes for state tables. All but the first get stuffed into +// signed one-byte entries. The first is only generated by executable code. +// To distinguish from next-state entries, these must be contiguous and +// all <= kExitNone +typedef enum { + kExitDstSpaceFull = 239, + kExitIllegalStructure, // 240 + kExitOK, // 241 + kExitReject, // ... + kExitReplace1, + kExitReplace2, + kExitReplace3, + kExitReplace21, + kExitReplace31, + kExitReplace32, + kExitReplaceOffset1, + kExitReplaceOffset2, + kExitReplace1S0, + kExitSpecial, + kExitDoAgain, + kExitRejectAlt, + kExitNone // 255 +} ExitReason; + + +// This struct represents one entire state table. The three initialized byte +// areas are state_table, remap_base, and remap_string. state0 and state0_size +// give the byte offset and length within state_table of the initial state -- +// table lookups are expected to start and end in this state, but for +// truncated UTF-8 strings, may end in a different state. These allow a quick +// test for that condition. entry_shift is 8 for tables subscripted by a full +// byte value and 6 for space-optimized tables subscripted by only six +// significant bits in UTF-8 continuation bytes. +typedef struct { + const uint32 state0; + const uint32 state0_size; + const uint32 total_size; + const int max_expand; + const int entry_shift; + const int bytes_per_entry; + const uint32 losub; + const uint32 hiadd; + const uint8* state_table; + const RemapEntry* remap_base; + const uint8* remap_string; + const uint8* fast_state; +} UTF8StateMachineObj; + +typedef UTF8StateMachineObj UTF8ScanObj; + +#define X__ (kExitIllegalStructure) +#define RJ_ (kExitReject) +#define S1_ (kExitReplace1) +#define S2_ (kExitReplace2) +#define S3_ (kExitReplace3) +#define S21 (kExitReplace21) +#define S31 (kExitReplace31) +#define S32 (kExitReplace32) +#define T1_ (kExitReplaceOffset1) +#define T2_ (kExitReplaceOffset2) +#define S11 (kExitReplace1S0) +#define SP_ (kExitSpecial) +#define D__ (kExitDoAgain) +#define RJA (kExitRejectAlt) + +// Entire table has 9 state blocks of 256 entries each +static const unsigned int utf8acceptnonsurrogates_STATE0 = 0; // state[0] +static const unsigned int utf8acceptnonsurrogates_STATE0_SIZE = 256; // =[1] +static const unsigned int utf8acceptnonsurrogates_TOTAL_SIZE = 2304; +static const unsigned int utf8acceptnonsurrogates_MAX_EXPAND_X4 = 0; +static const unsigned int utf8acceptnonsurrogates_SHIFT = 8; +static const unsigned int utf8acceptnonsurrogates_BYTES = 1; +static const unsigned int utf8acceptnonsurrogates_LOSUB = 0x20202020; +static const unsigned int utf8acceptnonsurrogates_HIADD = 0x00000000; + +static const uint8 utf8acceptnonsurrogates[] = { +// state[0] 0x000000 Byte 1 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 3, 3, + 4, 5, 5, 5, 6, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[1] 0x000080 Byte 2 of 2 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[2] 0x000000 Byte 2 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[3] 0x001000 Byte 2 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[4] 0x000000 Byte 2 of 4 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[5] 0x040000 Byte 2 of 4 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[6] 0x100000 Byte 2 of 4 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[7] 0x00d000 Byte 2 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +// state[8] 0x00d800 Byte 3 of 3 +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, + +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, +RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, RJ_, + +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, X__, +}; + +// Remap base[0] = (del, add, string_offset) +static const RemapEntry utf8acceptnonsurrogates_remap_base[] = { +{0, 0, 0} }; + +// Remap string[0] +static const unsigned char utf8acceptnonsurrogates_remap_string[] = { +0 }; + +static const unsigned char utf8acceptnonsurrogates_fast[256] = { +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +}; + +static const UTF8ScanObj utf8acceptnonsurrogates_obj = { + utf8acceptnonsurrogates_STATE0, + utf8acceptnonsurrogates_STATE0_SIZE, + utf8acceptnonsurrogates_TOTAL_SIZE, + utf8acceptnonsurrogates_MAX_EXPAND_X4, + utf8acceptnonsurrogates_SHIFT, + utf8acceptnonsurrogates_BYTES, + utf8acceptnonsurrogates_LOSUB, + utf8acceptnonsurrogates_HIADD, + utf8acceptnonsurrogates, + utf8acceptnonsurrogates_remap_base, + utf8acceptnonsurrogates_remap_string, + utf8acceptnonsurrogates_fast +}; + + +#undef X__ +#undef RJ_ +#undef S1_ +#undef S2_ +#undef S3_ +#undef S21 +#undef S31 +#undef S32 +#undef T1_ +#undef T2_ +#undef S11 +#undef SP_ +#undef D__ +#undef RJA + +// Return true if current Tbl pointer is within state0 range +// Note that unsigned compare checks both ends of range simultaneously +static inline bool InStateZero(const UTF8ScanObj* st, const uint8* Tbl) { + const uint8* Tbl0 = &st->state_table[st->state0]; + return (static_cast(Tbl - Tbl0) < st->state0_size); +} + +// Scan a UTF-8 string based on state table. +// Always scan complete UTF-8 characters +// Set number of bytes scanned. Return reason for exiting +int UTF8GenericScan(const UTF8ScanObj* st, + const char * str, + int str_length, + int* bytes_consumed) { + *bytes_consumed = 0; + if (str_length == 0) return kExitOK; + + int eshift = st->entry_shift; + const uint8* isrc = reinterpret_cast(str); + const uint8* src = isrc; + const uint8* srclimit = isrc + str_length; + const uint8* srclimit8 = srclimit - 7; + const uint8* Tbl_0 = &st->state_table[st->state0]; + + DoAgain: + // Do state-table scan + int e = 0; + uint8 c; + const uint8* Tbl2 = &st->fast_state[0]; + const uint32 losub = st->losub; + const uint32 hiadd = st->hiadd; + // Check initial few bytes one at a time until 8-byte aligned + //---------------------------- + while ((((uintptr_t)src & 0x07) != 0) && + (src < srclimit) && + Tbl2[src[0]] == 0) { + src++; + } + if (((uintptr_t)src & 0x07) == 0) { + // Do fast for groups of 8 identity bytes. + // This covers a lot of 7-bit ASCII ~8x faster then the 1-byte loop, + // including slowing slightly on cr/lf/ht + //---------------------------- + while (src < srclimit8) { + uint32 s0123 = (reinterpret_cast(src))[0]; + uint32 s4567 = (reinterpret_cast(src))[1]; + src += 8; + // This is a fast range check for all bytes in [lowsub..0x80-hiadd) + uint32 temp = (s0123 - losub) | (s0123 + hiadd) | + (s4567 - losub) | (s4567 + hiadd); + if ((temp & 0x80808080) != 0) { + // We typically end up here on cr/lf/ht; src was incremented + int e0123 = (Tbl2[src[-8]] | Tbl2[src[-7]]) | + (Tbl2[src[-6]] | Tbl2[src[-5]]); + if (e0123 != 0) { + src -= 8; + break; + } // Exit on Non-interchange + e0123 = (Tbl2[src[-4]] | Tbl2[src[-3]]) | + (Tbl2[src[-2]] | Tbl2[src[-1]]); + if (e0123 != 0) { + src -= 4; + break; + } // Exit on Non-interchange + // Else OK, go around again + } + } + } + //---------------------------- + + // Byte-at-a-time scan + //---------------------------- + const uint8* Tbl = Tbl_0; + while (src < srclimit) { + c = *src; + e = Tbl[c]; + src++; + if (e >= kExitIllegalStructure) {break;} + Tbl = &Tbl_0[e << eshift]; + } + //---------------------------- + + + // Exit posibilities: + // Some exit code, !state0, back up over last char + // Some exit code, state0, back up one byte exactly + // source consumed, !state0, back up over partial char + // source consumed, state0, exit OK + // For illegal byte in state0, avoid backup up over PREVIOUS char + // For truncated last char, back up to beginning of it + + if (e >= kExitIllegalStructure) { + // Back up over exactly one byte of rejected/illegal UTF-8 character + src--; + // Back up more if needed + if (!InStateZero(st, Tbl)) { + do { + src--; + } while ((src > isrc) && ((src[0] & 0xc0) == 0x80)); + } + } else if (!InStateZero(st, Tbl)) { + // Back up over truncated UTF-8 character + e = kExitIllegalStructure; + do { + src--; + } while ((src > isrc) && ((src[0] & 0xc0) == 0x80)); + } else { + // Normal termination, source fully consumed + e = kExitOK; + } + + if (e == kExitDoAgain) { + // Loop back up to the fast scan + goto DoAgain; + } + + *bytes_consumed = src - isrc; + return e; +} + +int UTF8GenericScanFastAscii(const UTF8ScanObj* st, + const char * str, + int str_length, + int* bytes_consumed) { + *bytes_consumed = 0; + if (str_length == 0) return kExitOK; + + const uint8* isrc = reinterpret_cast(str); + const uint8* src = isrc; + const uint8* srclimit = isrc + str_length; + const uint8* srclimit8 = srclimit - 7; + int n; + int rest_consumed; + int exit_reason; + do { + // Check initial few bytes one at a time until 8-byte aligned + while ((((uintptr_t)src & 0x07) != 0) && + (src < srclimit) && (src[0] < 0x80)) { + src++; + } + if (((uintptr_t)src & 0x07) == 0) { + while ((src < srclimit8) && + (((reinterpret_cast(src)[0] | + reinterpret_cast(src)[1]) & 0x80808080) == 0)) { + src += 8; + } + } + while ((src < srclimit) && (src[0] < 0x80)) { + src++; + } + // Run state table on the rest + n = src - isrc; + exit_reason = UTF8GenericScan(st, str + n, str_length - n, &rest_consumed); + src += rest_consumed; + } while ( exit_reason == kExitDoAgain ); + + *bytes_consumed = src - isrc; + return exit_reason; +} + +// Hack: On some compilers the static tables are initialized at startup. +// We can't use them until they are initialized. However, some Protocol +// Buffer parsing happens at static init time and may try to validate +// UTF-8 strings. Since UTF-8 validation is only used for debugging +// anyway, we simply always return success if initialization hasn't +// occurred yet. +namespace { + +bool module_initialized_ = false; + +struct InitDetector { + InitDetector() { + module_initialized_ = true; + } +}; +InitDetector init_detector; + +} // namespace + +bool IsStructurallyValidUTF8(const char* buf, int len) { + if (!module_initialized_) return true; + + int bytes_consumed = 0; + UTF8GenericScanFastAscii(&utf8acceptnonsurrogates_obj, + buf, len, &bytes_consumed); + return (bytes_consumed == len); +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc new file mode 100644 index 000000000..90888885a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc @@ -0,0 +1,40 @@ +// Copyright 2008 Google Inc. All Rights Reserved. +// Author: xpeng@google.com (Peter Peng) + +#include +#include + +namespace google { +namespace protobuf { +namespace internal { +namespace { + +TEST(StructurallyValidTest, ValidUTF8String) { + // On GCC, this string can be written as: + // "abcd 1234 - \u2014\u2013\u2212" + // MSVC seems to interpret \u differently. + string valid_str("abcd 1234 - \342\200\224\342\200\223\342\210\222 - xyz789"); + EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data(), + valid_str.size())); + // Additional check for pointer alignment + for (int i = 1; i < 8; ++i) { + EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data() + i, + valid_str.size() - i)); + } +} + +TEST(StructurallyValidTest, InvalidUTF8String) { + const string invalid_str("abcd\xA0\xB0\xA0\xB0\xA0\xB0 - xyz789"); + EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data(), + invalid_str.size())); + // Additional check for pointer alignment + for (int i = 1; i < 8; ++i) { + EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data() + i, + invalid_str.size() - i)); + } +} + +} // namespace +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc new file mode 100644 index 000000000..ee07ce759 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc @@ -0,0 +1,1173 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/strings/strutil.cc + +#include +#include +#include // FLT_DIG and DBL_DIG +#include +#include +#include +#include + +#ifdef _WIN32 +// MSVC has only _snprintf, not snprintf. +// +// MinGW has both snprintf and _snprintf, but they appear to be different +// functions. The former is buggy. When invoked like so: +// char buffer[32]; +// snprintf(buffer, 32, "%.*g\n", FLT_DIG, 1.23e10f); +// it prints "1.23000e+10". This is plainly wrong: %g should never print +// trailing zeros after the decimal point. For some reason this bug only +// occurs with some input values, not all. In any case, _snprintf does the +// right thing, so we use it. +#define snprintf _snprintf +#endif + +namespace google { +namespace protobuf { + +inline bool IsNaN(double value) { + // NaN is never equal to anything, even itself. + return value != value; +} + +// These are defined as macros on some platforms. #undef them so that we can +// redefine them. +#undef isxdigit +#undef isprint + +// The definitions of these in ctype.h change based on locale. Since our +// string manipulation is all in relation to the protocol buffer and C++ +// languages, we always want to use the C locale. So, we re-define these +// exactly as we want them. +inline bool isxdigit(char c) { + return ('0' <= c && c <= '9') || + ('a' <= c && c <= 'f') || + ('A' <= c && c <= 'F'); +} + +inline bool isprint(char c) { + return c >= 0x20 && c <= 0x7E; +} + +// ---------------------------------------------------------------------- +// StripString +// Replaces any occurrence of the character 'remove' (or the characters +// in 'remove') with the character 'replacewith'. +// ---------------------------------------------------------------------- +void StripString(string* s, const char* remove, char replacewith) { + const char * str_start = s->c_str(); + const char * str = str_start; + for (str = strpbrk(str, remove); + str != NULL; + str = strpbrk(str + 1, remove)) { + (*s)[str - str_start] = replacewith; + } +} + +// ---------------------------------------------------------------------- +// StringReplace() +// Replace the "old" pattern with the "new" pattern in a string, +// and append the result to "res". If replace_all is false, +// it only replaces the first instance of "old." +// ---------------------------------------------------------------------- + +void StringReplace(const string& s, const string& oldsub, + const string& newsub, bool replace_all, + string* res) { + if (oldsub.empty()) { + res->append(s); // if empty, append the given string. + return; + } + + string::size_type start_pos = 0; + string::size_type pos; + do { + pos = s.find(oldsub, start_pos); + if (pos == string::npos) { + break; + } + res->append(s, start_pos, pos - start_pos); + res->append(newsub); + start_pos = pos + oldsub.size(); // start searching again after the "old" + } while (replace_all); + res->append(s, start_pos, s.length() - start_pos); +} + +// ---------------------------------------------------------------------- +// StringReplace() +// Give me a string and two patterns "old" and "new", and I replace +// the first instance of "old" in the string with "new", if it +// exists. If "global" is true; call this repeatedly until it +// fails. RETURN a new string, regardless of whether the replacement +// happened or not. +// ---------------------------------------------------------------------- + +string StringReplace(const string& s, const string& oldsub, + const string& newsub, bool replace_all) { + string ret; + StringReplace(s, oldsub, newsub, replace_all, &ret); + return ret; +} + +// ---------------------------------------------------------------------- +// SplitStringUsing() +// Split a string using a character delimiter. Append the components +// to 'result'. +// +// Note: For multi-character delimiters, this routine will split on *ANY* of +// the characters in the string, not the entire string as a single delimiter. +// ---------------------------------------------------------------------- +template +static inline +void SplitStringToIteratorUsing(const string& full, + const char* delim, + ITR& result) { + // Optimize the common case where delim is a single character. + if (delim[0] != '\0' && delim[1] == '\0') { + char c = delim[0]; + const char* p = full.data(); + const char* end = p + full.size(); + while (p != end) { + if (*p == c) { + ++p; + } else { + const char* start = p; + while (++p != end && *p != c); + *result++ = string(start, p - start); + } + } + return; + } + + string::size_type begin_index, end_index; + begin_index = full.find_first_not_of(delim); + while (begin_index != string::npos) { + end_index = full.find_first_of(delim, begin_index); + if (end_index == string::npos) { + *result++ = full.substr(begin_index); + return; + } + *result++ = full.substr(begin_index, (end_index - begin_index)); + begin_index = full.find_first_not_of(delim, end_index); + } +} + +void SplitStringUsing(const string& full, + const char* delim, + vector* result) { + back_insert_iterator< vector > it(*result); + SplitStringToIteratorUsing(full, delim, it); +} + +// ---------------------------------------------------------------------- +// JoinStrings() +// This merges a vector of string components with delim inserted +// as separaters between components. +// +// ---------------------------------------------------------------------- +template +static void JoinStringsIterator(const ITERATOR& start, + const ITERATOR& end, + const char* delim, + string* result) { + GOOGLE_CHECK(result != NULL); + result->clear(); + int delim_length = strlen(delim); + + // Precompute resulting length so we can reserve() memory in one shot. + int length = 0; + for (ITERATOR iter = start; iter != end; ++iter) { + if (iter != start) { + length += delim_length; + } + length += iter->size(); + } + result->reserve(length); + + // Now combine everything. + for (ITERATOR iter = start; iter != end; ++iter) { + if (iter != start) { + result->append(delim, delim_length); + } + result->append(iter->data(), iter->size()); + } +} + +void JoinStrings(const vector& components, + const char* delim, + string * result) { + JoinStringsIterator(components.begin(), components.end(), delim, result); +} + +// ---------------------------------------------------------------------- +// UnescapeCEscapeSequences() +// This does all the unescaping that C does: \ooo, \r, \n, etc +// Returns length of resulting string. +// The implementation of \x parses any positive number of hex digits, +// but it is an error if the value requires more than 8 bits, and the +// result is truncated to 8 bits. +// +// The second call stores its errors in a supplied string vector. +// If the string vector pointer is NULL, it reports the errors with LOG(). +// ---------------------------------------------------------------------- + +#define IS_OCTAL_DIGIT(c) (((c) >= '0') && ((c) <= '7')) + +inline int hex_digit_to_int(char c) { + /* Assume ASCII. */ + assert('0' == 0x30 && 'A' == 0x41 && 'a' == 0x61); + assert(isxdigit(c)); + int x = static_cast(c); + if (x > '9') { + x += 9; + } + return x & 0xf; +} + +// Protocol buffers doesn't ever care about errors, but I don't want to remove +// the code. +#define LOG_STRING(LEVEL, VECTOR) GOOGLE_LOG_IF(LEVEL, false) + +int UnescapeCEscapeSequences(const char* source, char* dest) { + return UnescapeCEscapeSequences(source, dest, NULL); +} + +int UnescapeCEscapeSequences(const char* source, char* dest, + vector *errors) { + GOOGLE_DCHECK(errors == NULL) << "Error reporting not implemented."; + + char* d = dest; + const char* p = source; + + // Small optimization for case where source = dest and there's no escaping + while ( p == d && *p != '\0' && *p != '\\' ) + p++, d++; + + while (*p != '\0') { + if (*p != '\\') { + *d++ = *p++; + } else { + switch ( *++p ) { // skip past the '\\' + case '\0': + LOG_STRING(ERROR, errors) << "String cannot end with \\"; + *d = '\0'; + return d - dest; // we're done with p + case 'a': *d++ = '\a'; break; + case 'b': *d++ = '\b'; break; + case 'f': *d++ = '\f'; break; + case 'n': *d++ = '\n'; break; + case 'r': *d++ = '\r'; break; + case 't': *d++ = '\t'; break; + case 'v': *d++ = '\v'; break; + case '\\': *d++ = '\\'; break; + case '?': *d++ = '\?'; break; // \? Who knew? + case '\'': *d++ = '\''; break; + case '"': *d++ = '\"'; break; + case '0': case '1': case '2': case '3': // octal digit: 1 to 3 digits + case '4': case '5': case '6': case '7': { + char ch = *p - '0'; + if ( IS_OCTAL_DIGIT(p[1]) ) + ch = ch * 8 + *++p - '0'; + if ( IS_OCTAL_DIGIT(p[1]) ) // safe (and easy) to do this twice + ch = ch * 8 + *++p - '0'; // now points at last digit + *d++ = ch; + break; + } + case 'x': case 'X': { + if (!isxdigit(p[1])) { + if (p[1] == '\0') { + LOG_STRING(ERROR, errors) << "String cannot end with \\x"; + } else { + LOG_STRING(ERROR, errors) << + "\\x cannot be followed by non-hex digit: \\" << *p << p[1]; + } + break; + } + unsigned int ch = 0; + const char *hex_start = p; + while (isxdigit(p[1])) // arbitrarily many hex digits + ch = (ch << 4) + hex_digit_to_int(*++p); + if (ch > 0xFF) + LOG_STRING(ERROR, errors) << "Value of " << + "\\" << string(hex_start, p+1-hex_start) << " exceeds 8 bits"; + *d++ = ch; + break; + } +#if 0 // TODO(kenton): Support \u and \U? Requires runetochar(). + case 'u': { + // \uhhhh => convert 4 hex digits to UTF-8 + char32 rune = 0; + const char *hex_start = p; + for (int i = 0; i < 4; ++i) { + if (isxdigit(p[1])) { // Look one char ahead. + rune = (rune << 4) + hex_digit_to_int(*++p); // Advance p. + } else { + LOG_STRING(ERROR, errors) + << "\\u must be followed by 4 hex digits: \\" + << string(hex_start, p+1-hex_start); + break; + } + } + d += runetochar(d, &rune); + break; + } + case 'U': { + // \Uhhhhhhhh => convert 8 hex digits to UTF-8 + char32 rune = 0; + const char *hex_start = p; + for (int i = 0; i < 8; ++i) { + if (isxdigit(p[1])) { // Look one char ahead. + // Don't change rune until we're sure this + // is within the Unicode limit, but do advance p. + char32 newrune = (rune << 4) + hex_digit_to_int(*++p); + if (newrune > 0x10FFFF) { + LOG_STRING(ERROR, errors) + << "Value of \\" + << string(hex_start, p + 1 - hex_start) + << " exceeds Unicode limit (0x10FFFF)"; + break; + } else { + rune = newrune; + } + } else { + LOG_STRING(ERROR, errors) + << "\\U must be followed by 8 hex digits: \\" + << string(hex_start, p+1-hex_start); + break; + } + } + d += runetochar(d, &rune); + break; + } +#endif + default: + LOG_STRING(ERROR, errors) << "Unknown escape sequence: \\" << *p; + } + p++; // read past letter we escaped + } + } + *d = '\0'; + return d - dest; +} + +// ---------------------------------------------------------------------- +// UnescapeCEscapeString() +// This does the same thing as UnescapeCEscapeSequences, but creates +// a new string. The caller does not need to worry about allocating +// a dest buffer. This should be used for non performance critical +// tasks such as printing debug messages. It is safe for src and dest +// to be the same. +// +// The second call stores its errors in a supplied string vector. +// If the string vector pointer is NULL, it reports the errors with LOG(). +// +// In the first and second calls, the length of dest is returned. In the +// the third call, the new string is returned. +// ---------------------------------------------------------------------- +int UnescapeCEscapeString(const string& src, string* dest) { + return UnescapeCEscapeString(src, dest, NULL); +} + +int UnescapeCEscapeString(const string& src, string* dest, + vector *errors) { + scoped_array unescaped(new char[src.size() + 1]); + int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), errors); + GOOGLE_CHECK(dest); + dest->assign(unescaped.get(), len); + return len; +} + +string UnescapeCEscapeString(const string& src) { + scoped_array unescaped(new char[src.size() + 1]); + int len = UnescapeCEscapeSequences(src.c_str(), unescaped.get(), NULL); + return string(unescaped.get(), len); +} + +// ---------------------------------------------------------------------- +// CEscapeString() +// CHexEscapeString() +// Copies 'src' to 'dest', escaping dangerous characters using +// C-style escape sequences. This is very useful for preparing query +// flags. 'src' and 'dest' should not overlap. The 'Hex' version uses +// hexadecimal rather than octal sequences. +// Returns the number of bytes written to 'dest' (not including the \0) +// or -1 if there was insufficient space. +// +// Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped. +// ---------------------------------------------------------------------- +int CEscapeInternal(const char* src, int src_len, char* dest, + int dest_len, bool use_hex, bool utf8_safe) { + const char* src_end = src + src_len; + int used = 0; + bool last_hex_escape = false; // true if last output char was \xNN + + for (; src < src_end; src++) { + if (dest_len - used < 2) // Need space for two letter escape + return -1; + + bool is_hex_escape = false; + switch (*src) { + case '\n': dest[used++] = '\\'; dest[used++] = 'n'; break; + case '\r': dest[used++] = '\\'; dest[used++] = 'r'; break; + case '\t': dest[used++] = '\\'; dest[used++] = 't'; break; + case '\"': dest[used++] = '\\'; dest[used++] = '\"'; break; + case '\'': dest[used++] = '\\'; dest[used++] = '\''; break; + case '\\': dest[used++] = '\\'; dest[used++] = '\\'; break; + default: + // Note that if we emit \xNN and the src character after that is a hex + // digit then that digit must be escaped too to prevent it being + // interpreted as part of the character code by C. + if ((!utf8_safe || static_cast(*src) < 0x80) && + (!isprint(*src) || + (last_hex_escape && isxdigit(*src)))) { + if (dest_len - used < 4) // need space for 4 letter escape + return -1; + sprintf(dest + used, (use_hex ? "\\x%02x" : "\\%03o"), + static_cast(*src)); + is_hex_escape = use_hex; + used += 4; + } else { + dest[used++] = *src; break; + } + } + last_hex_escape = is_hex_escape; + } + + if (dest_len - used < 1) // make sure that there is room for \0 + return -1; + + dest[used] = '\0'; // doesn't count towards return value though + return used; +} + +int CEscapeString(const char* src, int src_len, char* dest, int dest_len) { + return CEscapeInternal(src, src_len, dest, dest_len, false, false); +} + +// ---------------------------------------------------------------------- +// CEscape() +// CHexEscape() +// Copies 'src' to result, escaping dangerous characters using +// C-style escape sequences. This is very useful for preparing query +// flags. 'src' and 'dest' should not overlap. The 'Hex' version +// hexadecimal rather than octal sequences. +// +// Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped. +// ---------------------------------------------------------------------- +string CEscape(const string& src) { + const int dest_length = src.size() * 4 + 1; // Maximum possible expansion + scoped_array dest(new char[dest_length]); + const int len = CEscapeInternal(src.data(), src.size(), + dest.get(), dest_length, false, false); + GOOGLE_DCHECK_GE(len, 0); + return string(dest.get(), len); +} + +namespace strings { + +string Utf8SafeCEscape(const string& src) { + const int dest_length = src.size() * 4 + 1; // Maximum possible expansion + scoped_array dest(new char[dest_length]); + const int len = CEscapeInternal(src.data(), src.size(), + dest.get(), dest_length, false, true); + GOOGLE_DCHECK_GE(len, 0); + return string(dest.get(), len); +} + +string CHexEscape(const string& src) { + const int dest_length = src.size() * 4 + 1; // Maximum possible expansion + scoped_array dest(new char[dest_length]); + const int len = CEscapeInternal(src.data(), src.size(), + dest.get(), dest_length, true, false); + GOOGLE_DCHECK_GE(len, 0); + return string(dest.get(), len); +} + +} // namespace strings + +// ---------------------------------------------------------------------- +// strto32_adaptor() +// strtou32_adaptor() +// Implementation of strto[u]l replacements that have identical +// overflow and underflow characteristics for both ILP-32 and LP-64 +// platforms, including errno preservation in error-free calls. +// ---------------------------------------------------------------------- + +int32 strto32_adaptor(const char *nptr, char **endptr, int base) { + const int saved_errno = errno; + errno = 0; + const long result = strtol(nptr, endptr, base); + if (errno == ERANGE && result == LONG_MIN) { + return kint32min; + } else if (errno == ERANGE && result == LONG_MAX) { + return kint32max; + } else if (errno == 0 && result < kint32min) { + errno = ERANGE; + return kint32min; + } else if (errno == 0 && result > kint32max) { + errno = ERANGE; + return kint32max; + } + if (errno == 0) + errno = saved_errno; + return static_cast(result); +} + +uint32 strtou32_adaptor(const char *nptr, char **endptr, int base) { + const int saved_errno = errno; + errno = 0; + const unsigned long result = strtoul(nptr, endptr, base); + if (errno == ERANGE && result == ULONG_MAX) { + return kuint32max; + } else if (errno == 0 && result > kuint32max) { + errno = ERANGE; + return kuint32max; + } + if (errno == 0) + errno = saved_errno; + return static_cast(result); +} + +// ---------------------------------------------------------------------- +// FastIntToBuffer() +// FastInt64ToBuffer() +// FastHexToBuffer() +// FastHex64ToBuffer() +// FastHex32ToBuffer() +// ---------------------------------------------------------------------- + +// Offset into buffer where FastInt64ToBuffer places the end of string +// null character. Also used by FastInt64ToBufferLeft. +static const int kFastInt64ToBufferOffset = 21; + +char *FastInt64ToBuffer(int64 i, char* buffer) { + // We could collapse the positive and negative sections, but that + // would be slightly slower for positive numbers... + // 22 bytes is enough to store -2**64, -18446744073709551616. + char* p = buffer + kFastInt64ToBufferOffset; + *p-- = '\0'; + if (i >= 0) { + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + return p + 1; + } else { + // On different platforms, % and / have different behaviors for + // negative numbers, so we need to jump through hoops to make sure + // we don't divide negative numbers. + if (i > -10) { + i = -i; + *p-- = '0' + i; + *p = '-'; + return p; + } else { + // Make sure we aren't at MIN_INT, in which case we can't say i = -i + i = i + 10; + i = -i; + *p-- = '0' + i % 10; + // Undo what we did a moment ago + i = i / 10 + 1; + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + *p = '-'; + return p; + } + } +} + +// Offset into buffer where FastInt32ToBuffer places the end of string +// null character. Also used by FastInt32ToBufferLeft +static const int kFastInt32ToBufferOffset = 11; + +// Yes, this is a duplicate of FastInt64ToBuffer. But, we need this for the +// compiler to generate 32 bit arithmetic instructions. It's much faster, at +// least with 32 bit binaries. +char *FastInt32ToBuffer(int32 i, char* buffer) { + // We could collapse the positive and negative sections, but that + // would be slightly slower for positive numbers... + // 12 bytes is enough to store -2**32, -4294967296. + char* p = buffer + kFastInt32ToBufferOffset; + *p-- = '\0'; + if (i >= 0) { + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + return p + 1; + } else { + // On different platforms, % and / have different behaviors for + // negative numbers, so we need to jump through hoops to make sure + // we don't divide negative numbers. + if (i > -10) { + i = -i; + *p-- = '0' + i; + *p = '-'; + return p; + } else { + // Make sure we aren't at MIN_INT, in which case we can't say i = -i + i = i + 10; + i = -i; + *p-- = '0' + i % 10; + // Undo what we did a moment ago + i = i / 10 + 1; + do { + *p-- = '0' + i % 10; + i /= 10; + } while (i > 0); + *p = '-'; + return p; + } + } +} + +char *FastHexToBuffer(int i, char* buffer) { + GOOGLE_CHECK(i >= 0) << "FastHexToBuffer() wants non-negative integers, not " << i; + + static const char *hexdigits = "0123456789abcdef"; + char *p = buffer + 21; + *p-- = '\0'; + do { + *p-- = hexdigits[i & 15]; // mod by 16 + i >>= 4; // divide by 16 + } while (i > 0); + return p + 1; +} + +char *InternalFastHexToBuffer(uint64 value, char* buffer, int num_byte) { + static const char *hexdigits = "0123456789abcdef"; + buffer[num_byte] = '\0'; + for (int i = num_byte - 1; i >= 0; i--) { +#ifdef _M_X64 + // MSVC x64 platform has a bug optimizing the uint32(value) in the #else + // block. Given that the uint32 cast was to improve performance on 32-bit + // platforms, we use 64-bit '&' directly. + buffer[i] = hexdigits[value & 0xf]; +#else + buffer[i] = hexdigits[uint32(value) & 0xf]; +#endif + value >>= 4; + } + return buffer; +} + +char *FastHex64ToBuffer(uint64 value, char* buffer) { + return InternalFastHexToBuffer(value, buffer, 16); +} + +char *FastHex32ToBuffer(uint32 value, char* buffer) { + return InternalFastHexToBuffer(value, buffer, 8); +} + +static inline char* PlaceNum(char* p, int num, char prev_sep) { + *p-- = '0' + num % 10; + *p-- = '0' + num / 10; + *p-- = prev_sep; + return p; +} + +// ---------------------------------------------------------------------- +// FastInt32ToBufferLeft() +// FastUInt32ToBufferLeft() +// FastInt64ToBufferLeft() +// FastUInt64ToBufferLeft() +// +// Like the Fast*ToBuffer() functions above, these are intended for speed. +// Unlike the Fast*ToBuffer() functions, however, these functions write +// their output to the beginning of the buffer (hence the name, as the +// output is left-aligned). The caller is responsible for ensuring that +// the buffer has enough space to hold the output. +// +// Returns a pointer to the end of the string (i.e. the null character +// terminating the string). +// ---------------------------------------------------------------------- + +static const char two_ASCII_digits[100][2] = { + {'0','0'}, {'0','1'}, {'0','2'}, {'0','3'}, {'0','4'}, + {'0','5'}, {'0','6'}, {'0','7'}, {'0','8'}, {'0','9'}, + {'1','0'}, {'1','1'}, {'1','2'}, {'1','3'}, {'1','4'}, + {'1','5'}, {'1','6'}, {'1','7'}, {'1','8'}, {'1','9'}, + {'2','0'}, {'2','1'}, {'2','2'}, {'2','3'}, {'2','4'}, + {'2','5'}, {'2','6'}, {'2','7'}, {'2','8'}, {'2','9'}, + {'3','0'}, {'3','1'}, {'3','2'}, {'3','3'}, {'3','4'}, + {'3','5'}, {'3','6'}, {'3','7'}, {'3','8'}, {'3','9'}, + {'4','0'}, {'4','1'}, {'4','2'}, {'4','3'}, {'4','4'}, + {'4','5'}, {'4','6'}, {'4','7'}, {'4','8'}, {'4','9'}, + {'5','0'}, {'5','1'}, {'5','2'}, {'5','3'}, {'5','4'}, + {'5','5'}, {'5','6'}, {'5','7'}, {'5','8'}, {'5','9'}, + {'6','0'}, {'6','1'}, {'6','2'}, {'6','3'}, {'6','4'}, + {'6','5'}, {'6','6'}, {'6','7'}, {'6','8'}, {'6','9'}, + {'7','0'}, {'7','1'}, {'7','2'}, {'7','3'}, {'7','4'}, + {'7','5'}, {'7','6'}, {'7','7'}, {'7','8'}, {'7','9'}, + {'8','0'}, {'8','1'}, {'8','2'}, {'8','3'}, {'8','4'}, + {'8','5'}, {'8','6'}, {'8','7'}, {'8','8'}, {'8','9'}, + {'9','0'}, {'9','1'}, {'9','2'}, {'9','3'}, {'9','4'}, + {'9','5'}, {'9','6'}, {'9','7'}, {'9','8'}, {'9','9'} +}; + +char* FastUInt32ToBufferLeft(uint32 u, char* buffer) { + int digits; + const char *ASCII_digits = NULL; + // The idea of this implementation is to trim the number of divides to as few + // as possible by using multiplication and subtraction rather than mod (%), + // and by outputting two digits at a time rather than one. + // The huge-number case is first, in the hopes that the compiler will output + // that case in one branch-free block of code, and only output conditional + // branches into it from below. + if (u >= 1000000000) { // >= 1,000,000,000 + digits = u / 100000000; // 100,000,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt100_000_000: + u -= digits * 100000000; // 100,000,000 +lt100_000_000: + digits = u / 1000000; // 1,000,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt1_000_000: + u -= digits * 1000000; // 1,000,000 +lt1_000_000: + digits = u / 10000; // 10,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt10_000: + u -= digits * 10000; // 10,000 +lt10_000: + digits = u / 100; + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +sublt100: + u -= digits * 100; +lt100: + digits = u; + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; +done: + *buffer = 0; + return buffer; + } + + if (u < 100) { + digits = u; + if (u >= 10) goto lt100; + *buffer++ = '0' + digits; + goto done; + } + if (u < 10000) { // 10,000 + if (u >= 1000) goto lt10_000; + digits = u / 100; + *buffer++ = '0' + digits; + goto sublt100; + } + if (u < 1000000) { // 1,000,000 + if (u >= 100000) goto lt1_000_000; + digits = u / 10000; // 10,000 + *buffer++ = '0' + digits; + goto sublt10_000; + } + if (u < 100000000) { // 100,000,000 + if (u >= 10000000) goto lt100_000_000; + digits = u / 1000000; // 1,000,000 + *buffer++ = '0' + digits; + goto sublt1_000_000; + } + // we already know that u < 1,000,000,000 + digits = u / 100000000; // 100,000,000 + *buffer++ = '0' + digits; + goto sublt100_000_000; +} + +char* FastInt32ToBufferLeft(int32 i, char* buffer) { + uint32 u = i; + if (i < 0) { + *buffer++ = '-'; + u = -i; + } + return FastUInt32ToBufferLeft(u, buffer); +} + +char* FastUInt64ToBufferLeft(uint64 u64, char* buffer) { + int digits; + const char *ASCII_digits = NULL; + + uint32 u = static_cast(u64); + if (u == u64) return FastUInt32ToBufferLeft(u, buffer); + + uint64 top_11_digits = u64 / 1000000000; + buffer = FastUInt64ToBufferLeft(top_11_digits, buffer); + u = u64 - (top_11_digits * 1000000000); + + digits = u / 10000000; // 10,000,000 + GOOGLE_DCHECK_LT(digits, 100); + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 10000000; // 10,000,000 + digits = u / 100000; // 100,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 100000; // 100,000 + digits = u / 1000; // 1,000 + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 1000; // 1,000 + digits = u / 10; + ASCII_digits = two_ASCII_digits[digits]; + buffer[0] = ASCII_digits[0]; + buffer[1] = ASCII_digits[1]; + buffer += 2; + u -= digits * 10; + digits = u; + *buffer++ = '0' + digits; + *buffer = 0; + return buffer; +} + +char* FastInt64ToBufferLeft(int64 i, char* buffer) { + uint64 u = i; + if (i < 0) { + *buffer++ = '-'; + u = -i; + } + return FastUInt64ToBufferLeft(u, buffer); +} + +// ---------------------------------------------------------------------- +// SimpleItoa() +// Description: converts an integer to a string. +// +// Return value: string +// ---------------------------------------------------------------------- + +string SimpleItoa(int i) { + char buffer[kFastToBufferSize]; + return (sizeof(i) == 4) ? + FastInt32ToBuffer(i, buffer) : + FastInt64ToBuffer(i, buffer); +} + +string SimpleItoa(unsigned int i) { + char buffer[kFastToBufferSize]; + return string(buffer, (sizeof(i) == 4) ? + FastUInt32ToBufferLeft(i, buffer) : + FastUInt64ToBufferLeft(i, buffer)); +} + +string SimpleItoa(long i) { + char buffer[kFastToBufferSize]; + return (sizeof(i) == 4) ? + FastInt32ToBuffer(i, buffer) : + FastInt64ToBuffer(i, buffer); +} + +string SimpleItoa(unsigned long i) { + char buffer[kFastToBufferSize]; + return string(buffer, (sizeof(i) == 4) ? + FastUInt32ToBufferLeft(i, buffer) : + FastUInt64ToBufferLeft(i, buffer)); +} + +string SimpleItoa(long long i) { + char buffer[kFastToBufferSize]; + return (sizeof(i) == 4) ? + FastInt32ToBuffer(i, buffer) : + FastInt64ToBuffer(i, buffer); +} + +string SimpleItoa(unsigned long long i) { + char buffer[kFastToBufferSize]; + return string(buffer, (sizeof(i) == 4) ? + FastUInt32ToBufferLeft(i, buffer) : + FastUInt64ToBufferLeft(i, buffer)); +} + +// ---------------------------------------------------------------------- +// SimpleDtoa() +// SimpleFtoa() +// DoubleToBuffer() +// FloatToBuffer() +// We want to print the value without losing precision, but we also do +// not want to print more digits than necessary. This turns out to be +// trickier than it sounds. Numbers like 0.2 cannot be represented +// exactly in binary. If we print 0.2 with a very large precision, +// e.g. "%.50g", we get "0.2000000000000000111022302462515654042363167". +// On the other hand, if we set the precision too low, we lose +// significant digits when printing numbers that actually need them. +// It turns out there is no precision value that does the right thing +// for all numbers. +// +// Our strategy is to first try printing with a precision that is never +// over-precise, then parse the result with strtod() to see if it +// matches. If not, we print again with a precision that will always +// give a precise result, but may use more digits than necessary. +// +// An arguably better strategy would be to use the algorithm described +// in "How to Print Floating-Point Numbers Accurately" by Steele & +// White, e.g. as implemented by David M. Gay's dtoa(). It turns out, +// however, that the following implementation is about as fast as +// DMG's code. Furthermore, DMG's code locks mutexes, which means it +// will not scale well on multi-core machines. DMG's code is slightly +// more accurate (in that it will never use more digits than +// necessary), but this is probably irrelevant for most users. +// +// Rob Pike and Ken Thompson also have an implementation of dtoa() in +// third_party/fmt/fltfmt.cc. Their implementation is similar to this +// one in that it makes guesses and then uses strtod() to check them. +// Their implementation is faster because they use their own code to +// generate the digits in the first place rather than use snprintf(), +// thus avoiding format string parsing overhead. However, this makes +// it considerably more complicated than the following implementation, +// and it is embedded in a larger library. If speed turns out to be +// an issue, we could re-implement this in terms of their +// implementation. +// ---------------------------------------------------------------------- + +string SimpleDtoa(double value) { + char buffer[kDoubleToBufferSize]; + return DoubleToBuffer(value, buffer); +} + +string SimpleFtoa(float value) { + char buffer[kFloatToBufferSize]; + return FloatToBuffer(value, buffer); +} + +static inline bool IsValidFloatChar(char c) { + return ('0' <= c && c <= '9') || + c == 'e' || c == 'E' || + c == '+' || c == '-'; +} + +void DelocalizeRadix(char* buffer) { + // Fast check: if the buffer has a normal decimal point, assume no + // translation is needed. + if (strchr(buffer, '.') != NULL) return; + + // Find the first unknown character. + while (IsValidFloatChar(*buffer)) ++buffer; + + if (*buffer == '\0') { + // No radix character found. + return; + } + + // We are now pointing at the locale-specific radix character. Replace it + // with '.'. + *buffer = '.'; + ++buffer; + + if (!IsValidFloatChar(*buffer) && *buffer != '\0') { + // It appears the radix was a multi-byte character. We need to remove the + // extra bytes. + char* target = buffer; + do { ++buffer; } while (!IsValidFloatChar(*buffer) && *buffer != '\0'); + memmove(target, buffer, strlen(buffer) + 1); + } +} + +char* DoubleToBuffer(double value, char* buffer) { + // DBL_DIG is 15 for IEEE-754 doubles, which are used on almost all + // platforms these days. Just in case some system exists where DBL_DIG + // is significantly larger -- and risks overflowing our buffer -- we have + // this assert. + GOOGLE_COMPILE_ASSERT(DBL_DIG < 20, DBL_DIG_is_too_big); + + if (value == numeric_limits::infinity()) { + strcpy(buffer, "inf"); + return buffer; + } else if (value == -numeric_limits::infinity()) { + strcpy(buffer, "-inf"); + return buffer; + } else if (IsNaN(value)) { + strcpy(buffer, "nan"); + return buffer; + } + + int snprintf_result = + snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG, value); + + // The snprintf should never overflow because the buffer is significantly + // larger than the precision we asked for. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kDoubleToBufferSize); + + // We need to make parsed_value volatile in order to force the compiler to + // write it out to the stack. Otherwise, it may keep the value in a + // register, and if it does that, it may keep it as a long double instead + // of a double. This long double may have extra bits that make it compare + // unequal to "value" even though it would be exactly equal if it were + // truncated to a double. + volatile double parsed_value = strtod(buffer, NULL); + if (parsed_value != value) { + int snprintf_result = + snprintf(buffer, kDoubleToBufferSize, "%.*g", DBL_DIG+2, value); + + // Should never overflow; see above. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kDoubleToBufferSize); + } + + DelocalizeRadix(buffer); + return buffer; +} + +bool safe_strtof(const char* str, float* value) { + char* endptr; + errno = 0; // errno only gets set on errors +#if defined(_WIN32) || defined (__hpux) // has no strtof() + *value = strtod(str, &endptr); +#else + *value = strtof(str, &endptr); +#endif + return *str != 0 && *endptr == 0 && errno == 0; +} + +char* FloatToBuffer(float value, char* buffer) { + // FLT_DIG is 6 for IEEE-754 floats, which are used on almost all + // platforms these days. Just in case some system exists where FLT_DIG + // is significantly larger -- and risks overflowing our buffer -- we have + // this assert. + GOOGLE_COMPILE_ASSERT(FLT_DIG < 10, FLT_DIG_is_too_big); + + if (value == numeric_limits::infinity()) { + strcpy(buffer, "inf"); + return buffer; + } else if (value == -numeric_limits::infinity()) { + strcpy(buffer, "-inf"); + return buffer; + } else if (IsNaN(value)) { + strcpy(buffer, "nan"); + return buffer; + } + + int snprintf_result = + snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG, value); + + // The snprintf should never overflow because the buffer is significantly + // larger than the precision we asked for. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize); + + float parsed_value; + if (!safe_strtof(buffer, &parsed_value) || parsed_value != value) { + int snprintf_result = + snprintf(buffer, kFloatToBufferSize, "%.*g", FLT_DIG+2, value); + + // Should never overflow; see above. + GOOGLE_DCHECK(snprintf_result > 0 && snprintf_result < kFloatToBufferSize); + } + + DelocalizeRadix(buffer); + return buffer; +} + +// ---------------------------------------------------------------------- +// NoLocaleStrtod() +// This code will make you cry. +// ---------------------------------------------------------------------- + +// Returns a string identical to *input except that the character pointed to +// by radix_pos (which should be '.') is replaced with the locale-specific +// radix character. +string LocalizeRadix(const char* input, const char* radix_pos) { + // Determine the locale-specific radix character by calling sprintf() to + // print the number 1.5, then stripping off the digits. As far as I can + // tell, this is the only portable, thread-safe way to get the C library + // to divuldge the locale's radix character. No, localeconv() is NOT + // thread-safe. + char temp[16]; + int size = sprintf(temp, "%.1f", 1.5); + GOOGLE_CHECK_EQ(temp[0], '1'); + GOOGLE_CHECK_EQ(temp[size-1], '5'); + GOOGLE_CHECK_LE(size, 6); + + // Now replace the '.' in the input with it. + string result; + result.reserve(strlen(input) + size - 3); + result.append(input, radix_pos); + result.append(temp + 1, size - 2); + result.append(radix_pos + 1); + return result; +} + +double NoLocaleStrtod(const char* text, char** original_endptr) { + // We cannot simply set the locale to "C" temporarily with setlocale() + // as this is not thread-safe. Instead, we try to parse in the current + // locale first. If parsing stops at a '.' character, then this is a + // pretty good hint that we're actually in some other locale in which + // '.' is not the radix character. + + char* temp_endptr; + double result = strtod(text, &temp_endptr); + if (original_endptr != NULL) *original_endptr = temp_endptr; + if (*temp_endptr != '.') return result; + + // Parsing halted on a '.'. Perhaps we're in a different locale? Let's + // try to replace the '.' with a locale-specific radix character and + // try again. + string localized = LocalizeRadix(text, temp_endptr); + const char* localized_cstr = localized.c_str(); + char* localized_endptr; + result = strtod(localized_cstr, &localized_endptr); + if ((localized_endptr - localized_cstr) > + (temp_endptr - text)) { + // This attempt got further, so replacing the decimal must have helped. + // Update original_endptr to point at the right location. + if (original_endptr != NULL) { + // size_diff is non-zero if the localized radix has multiple bytes. + int size_diff = localized.size() - strlen(text); + // const_cast is necessary to match the strtod() interface. + *original_endptr = const_cast( + text + (localized_endptr - localized_cstr - size_diff)); + } + } + + return result; +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h new file mode 100644 index 000000000..4a79c2240 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h @@ -0,0 +1,457 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// from google3/strings/strutil.h + +#ifndef GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ +#define GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + +#ifdef _MSC_VER +#define strtoll _strtoi64 +#define strtoull _strtoui64 +#elif defined(__DECCXX) && defined(__osf__) +// HP C++ on Tru64 does not have strtoll, but strtol is already 64-bit. +#define strtoll strtol +#define strtoull strtoul +#endif + +// ---------------------------------------------------------------------- +// ascii_isalnum() +// Check if an ASCII character is alphanumeric. We can't use ctype's +// isalnum() because it is affected by locale. This function is applied +// to identifiers in the protocol buffer language, not to natural-language +// strings, so locale should not be taken into account. +// ascii_isdigit() +// Like above, but only accepts digits. +// ---------------------------------------------------------------------- + +inline bool ascii_isalnum(char c) { + return ('a' <= c && c <= 'z') || + ('A' <= c && c <= 'Z') || + ('0' <= c && c <= '9'); +} + +inline bool ascii_isdigit(char c) { + return ('0' <= c && c <= '9'); +} + +// ---------------------------------------------------------------------- +// HasPrefixString() +// Check if a string begins with a given prefix. +// StripPrefixString() +// Given a string and a putative prefix, returns the string minus the +// prefix string if the prefix matches, otherwise the original +// string. +// ---------------------------------------------------------------------- +inline bool HasPrefixString(const string& str, + const string& prefix) { + return str.size() >= prefix.size() && + str.compare(0, prefix.size(), prefix) == 0; +} + +inline string StripPrefixString(const string& str, const string& prefix) { + if (HasPrefixString(str, prefix)) { + return str.substr(prefix.size()); + } else { + return str; + } +} + +// ---------------------------------------------------------------------- +// HasSuffixString() +// Return true if str ends in suffix. +// StripSuffixString() +// Given a string and a putative suffix, returns the string minus the +// suffix string if the suffix matches, otherwise the original +// string. +// ---------------------------------------------------------------------- +inline bool HasSuffixString(const string& str, + const string& suffix) { + return str.size() >= suffix.size() && + str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0; +} + +inline string StripSuffixString(const string& str, const string& suffix) { + if (HasSuffixString(str, suffix)) { + return str.substr(0, str.size() - suffix.size()); + } else { + return str; + } +} + +// ---------------------------------------------------------------------- +// StripString +// Replaces any occurrence of the character 'remove' (or the characters +// in 'remove') with the character 'replacewith'. +// Good for keeping html characters or protocol characters (\t) out +// of places where they might cause a problem. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT void StripString(string* s, const char* remove, + char replacewith); + +// ---------------------------------------------------------------------- +// LowerString() +// UpperString() +// Convert the characters in "s" to lowercase or uppercase. ASCII-only: +// these functions intentionally ignore locale because they are applied to +// identifiers used in the Protocol Buffer language, not to natural-language +// strings. +// ---------------------------------------------------------------------- + +inline void LowerString(string * s) { + string::iterator end = s->end(); + for (string::iterator i = s->begin(); i != end; ++i) { + // tolower() changes based on locale. We don't want this! + if ('A' <= *i && *i <= 'Z') *i += 'a' - 'A'; + } +} + +inline void UpperString(string * s) { + string::iterator end = s->end(); + for (string::iterator i = s->begin(); i != end; ++i) { + // toupper() changes based on locale. We don't want this! + if ('a' <= *i && *i <= 'z') *i += 'A' - 'a'; + } +} + +// ---------------------------------------------------------------------- +// StringReplace() +// Give me a string and two patterns "old" and "new", and I replace +// the first instance of "old" in the string with "new", if it +// exists. RETURN a new string, regardless of whether the replacement +// happened or not. +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT string StringReplace(const string& s, const string& oldsub, + const string& newsub, bool replace_all); + +// ---------------------------------------------------------------------- +// SplitStringUsing() +// Split a string using a character delimiter. Append the components +// to 'result'. If there are consecutive delimiters, this function skips +// over all of them. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT void SplitStringUsing(const string& full, const char* delim, + vector* res); + +// ---------------------------------------------------------------------- +// JoinStrings() +// These methods concatenate a vector of strings into a C++ string, using +// the C-string "delim" as a separator between components. There are two +// flavors of the function, one flavor returns the concatenated string, +// another takes a pointer to the target string. In the latter case the +// target string is cleared and overwritten. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT void JoinStrings(const vector& components, + const char* delim, string* result); + +inline string JoinStrings(const vector& components, + const char* delim) { + string result; + JoinStrings(components, delim, &result); + return result; +} + +// ---------------------------------------------------------------------- +// UnescapeCEscapeSequences() +// Copies "source" to "dest", rewriting C-style escape sequences +// -- '\n', '\r', '\\', '\ooo', etc -- to their ASCII +// equivalents. "dest" must be sufficiently large to hold all +// the characters in the rewritten string (i.e. at least as large +// as strlen(source) + 1 should be safe, since the replacements +// are always shorter than the original escaped sequences). It's +// safe for source and dest to be the same. RETURNS the length +// of dest. +// +// It allows hex sequences \xhh, or generally \xhhhhh with an +// arbitrary number of hex digits, but all of them together must +// specify a value of a single byte (e.g. \x0045 is equivalent +// to \x45, and \x1234 is erroneous). +// +// It also allows escape sequences of the form \uhhhh (exactly four +// hex digits, upper or lower case) or \Uhhhhhhhh (exactly eight +// hex digits, upper or lower case) to specify a Unicode code +// point. The dest array will contain the UTF8-encoded version of +// that code-point (e.g., if source contains \u2019, then dest will +// contain the three bytes 0xE2, 0x80, and 0x99). +// +// Errors: In the first form of the call, errors are reported with +// LOG(ERROR). The same is true for the second form of the call if +// the pointer to the string vector is NULL; otherwise, error +// messages are stored in the vector. In either case, the effect on +// the dest array is not defined, but rest of the source will be +// processed. +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest); +LIBPROTOBUF_EXPORT int UnescapeCEscapeSequences(const char* source, char* dest, + vector *errors); + +// ---------------------------------------------------------------------- +// UnescapeCEscapeString() +// This does the same thing as UnescapeCEscapeSequences, but creates +// a new string. The caller does not need to worry about allocating +// a dest buffer. This should be used for non performance critical +// tasks such as printing debug messages. It is safe for src and dest +// to be the same. +// +// The second call stores its errors in a supplied string vector. +// If the string vector pointer is NULL, it reports the errors with LOG(). +// +// In the first and second calls, the length of dest is returned. In the +// the third call, the new string is returned. +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest); +LIBPROTOBUF_EXPORT int UnescapeCEscapeString(const string& src, string* dest, + vector *errors); +LIBPROTOBUF_EXPORT string UnescapeCEscapeString(const string& src); + +// ---------------------------------------------------------------------- +// CEscapeString() +// Copies 'src' to 'dest', escaping dangerous characters using +// C-style escape sequences. This is very useful for preparing query +// flags. 'src' and 'dest' should not overlap. +// Returns the number of bytes written to 'dest' (not including the \0) +// or -1 if there was insufficient space. +// +// Currently only \n, \r, \t, ", ', \ and !isprint() chars are escaped. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT int CEscapeString(const char* src, int src_len, + char* dest, int dest_len); + +// ---------------------------------------------------------------------- +// CEscape() +// More convenient form of CEscapeString: returns result as a "string". +// This version is slower than CEscapeString() because it does more +// allocation. However, it is much more convenient to use in +// non-speed-critical code like logging messages etc. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT string CEscape(const string& src); + +namespace strings { +// Like CEscape() but does not escape bytes with the upper bit set. +LIBPROTOBUF_EXPORT string Utf8SafeCEscape(const string& src); + +// Like CEscape() but uses hex (\x) escapes instead of octals. +LIBPROTOBUF_EXPORT string CHexEscape(const string& src); +} // namespace strings + +// ---------------------------------------------------------------------- +// strto32() +// strtou32() +// strto64() +// strtou64() +// Architecture-neutral plug compatible replacements for strtol() and +// strtoul(). Long's have different lengths on ILP-32 and LP-64 +// platforms, so using these is safer, from the point of view of +// overflow behavior, than using the standard libc functions. +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT int32 strto32_adaptor(const char *nptr, char **endptr, + int base); +LIBPROTOBUF_EXPORT uint32 strtou32_adaptor(const char *nptr, char **endptr, + int base); + +inline int32 strto32(const char *nptr, char **endptr, int base) { + if (sizeof(int32) == sizeof(long)) + return strtol(nptr, endptr, base); + else + return strto32_adaptor(nptr, endptr, base); +} + +inline uint32 strtou32(const char *nptr, char **endptr, int base) { + if (sizeof(uint32) == sizeof(unsigned long)) + return strtoul(nptr, endptr, base); + else + return strtou32_adaptor(nptr, endptr, base); +} + +// For now, long long is 64-bit on all the platforms we care about, so these +// functions can simply pass the call to strto[u]ll. +inline int64 strto64(const char *nptr, char **endptr, int base) { + GOOGLE_COMPILE_ASSERT(sizeof(int64) == sizeof(long long), + sizeof_int64_is_not_sizeof_long_long); + return strtoll(nptr, endptr, base); +} + +inline uint64 strtou64(const char *nptr, char **endptr, int base) { + GOOGLE_COMPILE_ASSERT(sizeof(uint64) == sizeof(unsigned long long), + sizeof_uint64_is_not_sizeof_long_long); + return strtoull(nptr, endptr, base); +} + +// ---------------------------------------------------------------------- +// FastIntToBuffer() +// FastHexToBuffer() +// FastHex64ToBuffer() +// FastHex32ToBuffer() +// FastTimeToBuffer() +// These are intended for speed. FastIntToBuffer() assumes the +// integer is non-negative. FastHexToBuffer() puts output in +// hex rather than decimal. FastTimeToBuffer() puts the output +// into RFC822 format. +// +// FastHex64ToBuffer() puts a 64-bit unsigned value in hex-format, +// padded to exactly 16 bytes (plus one byte for '\0') +// +// FastHex32ToBuffer() puts a 32-bit unsigned value in hex-format, +// padded to exactly 8 bytes (plus one byte for '\0') +// +// All functions take the output buffer as an arg. +// They all return a pointer to the beginning of the output, +// which may not be the beginning of the input buffer. +// ---------------------------------------------------------------------- + +// Suggested buffer size for FastToBuffer functions. Also works with +// DoubleToBuffer() and FloatToBuffer(). +static const int kFastToBufferSize = 32; + +LIBPROTOBUF_EXPORT char* FastInt32ToBuffer(int32 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastInt64ToBuffer(int64 i, char* buffer); +char* FastUInt32ToBuffer(uint32 i, char* buffer); // inline below +char* FastUInt64ToBuffer(uint64 i, char* buffer); // inline below +LIBPROTOBUF_EXPORT char* FastHexToBuffer(int i, char* buffer); +LIBPROTOBUF_EXPORT char* FastHex64ToBuffer(uint64 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastHex32ToBuffer(uint32 i, char* buffer); + +// at least 22 bytes long +inline char* FastIntToBuffer(int i, char* buffer) { + return (sizeof(i) == 4 ? + FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer)); +} +inline char* FastUIntToBuffer(unsigned int i, char* buffer) { + return (sizeof(i) == 4 ? + FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer)); +} +inline char* FastLongToBuffer(long i, char* buffer) { + return (sizeof(i) == 4 ? + FastInt32ToBuffer(i, buffer) : FastInt64ToBuffer(i, buffer)); +} +inline char* FastULongToBuffer(unsigned long i, char* buffer) { + return (sizeof(i) == 4 ? + FastUInt32ToBuffer(i, buffer) : FastUInt64ToBuffer(i, buffer)); +} + +// ---------------------------------------------------------------------- +// FastInt32ToBufferLeft() +// FastUInt32ToBufferLeft() +// FastInt64ToBufferLeft() +// FastUInt64ToBufferLeft() +// +// Like the Fast*ToBuffer() functions above, these are intended for speed. +// Unlike the Fast*ToBuffer() functions, however, these functions write +// their output to the beginning of the buffer (hence the name, as the +// output is left-aligned). The caller is responsible for ensuring that +// the buffer has enough space to hold the output. +// +// Returns a pointer to the end of the string (i.e. the null character +// terminating the string). +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT char* FastInt32ToBufferLeft(int32 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastUInt32ToBufferLeft(uint32 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastInt64ToBufferLeft(int64 i, char* buffer); +LIBPROTOBUF_EXPORT char* FastUInt64ToBufferLeft(uint64 i, char* buffer); + +// Just define these in terms of the above. +inline char* FastUInt32ToBuffer(uint32 i, char* buffer) { + FastUInt32ToBufferLeft(i, buffer); + return buffer; +} +inline char* FastUInt64ToBuffer(uint64 i, char* buffer) { + FastUInt64ToBufferLeft(i, buffer); + return buffer; +} + +// ---------------------------------------------------------------------- +// SimpleItoa() +// Description: converts an integer to a string. +// +// Return value: string +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT string SimpleItoa(int i); +LIBPROTOBUF_EXPORT string SimpleItoa(unsigned int i); +LIBPROTOBUF_EXPORT string SimpleItoa(long i); +LIBPROTOBUF_EXPORT string SimpleItoa(unsigned long i); +LIBPROTOBUF_EXPORT string SimpleItoa(long long i); +LIBPROTOBUF_EXPORT string SimpleItoa(unsigned long long i); + +// ---------------------------------------------------------------------- +// SimpleDtoa() +// SimpleFtoa() +// DoubleToBuffer() +// FloatToBuffer() +// Description: converts a double or float to a string which, if +// passed to NoLocaleStrtod(), will produce the exact same original double +// (except in case of NaN; all NaNs are considered the same value). +// We try to keep the string short but it's not guaranteed to be as +// short as possible. +// +// DoubleToBuffer() and FloatToBuffer() write the text to the given +// buffer and return it. The buffer must be at least +// kDoubleToBufferSize bytes for doubles and kFloatToBufferSize +// bytes for floats. kFastToBufferSize is also guaranteed to be large +// enough to hold either. +// +// Return value: string +// ---------------------------------------------------------------------- +LIBPROTOBUF_EXPORT string SimpleDtoa(double value); +LIBPROTOBUF_EXPORT string SimpleFtoa(float value); + +LIBPROTOBUF_EXPORT char* DoubleToBuffer(double i, char* buffer); +LIBPROTOBUF_EXPORT char* FloatToBuffer(float i, char* buffer); + +// In practice, doubles should never need more than 24 bytes and floats +// should never need more than 14 (including null terminators), but we +// overestimate to be safe. +static const int kDoubleToBufferSize = 32; +static const int kFloatToBufferSize = 24; + +// ---------------------------------------------------------------------- +// NoLocaleStrtod() +// Exactly like strtod(), except it always behaves as if in the "C" +// locale (i.e. decimal points must be '.'s). +// ---------------------------------------------------------------------- + +LIBPROTOBUF_EXPORT double NoLocaleStrtod(const char* text, char** endptr); + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_STRUTIL_H__ + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc new file mode 100644 index 000000000..b9c9253b0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc @@ -0,0 +1,83 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace { + +// TODO(kenton): Copy strutil tests from google3? + +TEST(StringUtilityTest, ImmuneToLocales) { + // Remember the old locale. + char* old_locale_cstr = setlocale(LC_NUMERIC, NULL); + ASSERT_TRUE(old_locale_cstr != NULL); + string old_locale = old_locale_cstr; + + // Set the locale to "C". + ASSERT_TRUE(setlocale(LC_NUMERIC, "C") != NULL); + + EXPECT_EQ(1.5, NoLocaleStrtod("1.5", NULL)); + EXPECT_EQ("1.5", SimpleDtoa(1.5)); + EXPECT_EQ("1.5", SimpleFtoa(1.5)); + + // Verify that the endptr is set correctly even if not all text was parsed. + const char* text = "1.5f"; + char* endptr; + EXPECT_EQ(1.5, NoLocaleStrtod(text, &endptr)); + EXPECT_EQ(3, endptr - text); + + if (setlocale(LC_NUMERIC, "es_ES") == NULL && + setlocale(LC_NUMERIC, "es_ES.utf8") == NULL) { + // Some systems may not have the desired locale available. + GOOGLE_LOG(WARNING) + << "Couldn't set locale to es_ES. Skipping this test."; + } else { + EXPECT_EQ(1.5, NoLocaleStrtod("1.5", NULL)); + EXPECT_EQ("1.5", SimpleDtoa(1.5)); + EXPECT_EQ("1.5", SimpleFtoa(1.5)); + EXPECT_EQ(1.5, NoLocaleStrtod(text, &endptr)); + EXPECT_EQ(3, endptr - text); + } + + // Return to original locale. + setlocale(LC_NUMERIC, old_locale.c_str()); +} + +} // anonymous namespace +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc new file mode 100644 index 000000000..b542aaa41 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc @@ -0,0 +1,134 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +#include +#include +#include + +namespace google { +namespace protobuf { +namespace strings { + +using internal::SubstituteArg; + +// Returns the number of args in arg_array which were passed explicitly +// to Substitute(). +static int CountSubstituteArgs(const SubstituteArg* const* args_array) { + int count = 0; + while (args_array[count] != NULL && args_array[count]->size() != -1) { + ++count; + } + return count; +} + +string Substitute( + const char* format, + const SubstituteArg& arg0, const SubstituteArg& arg1, + const SubstituteArg& arg2, const SubstituteArg& arg3, + const SubstituteArg& arg4, const SubstituteArg& arg5, + const SubstituteArg& arg6, const SubstituteArg& arg7, + const SubstituteArg& arg8, const SubstituteArg& arg9) { + string result; + SubstituteAndAppend(&result, format, arg0, arg1, arg2, arg3, arg4, + arg5, arg6, arg7, arg8, arg9); + return result; +} + +void SubstituteAndAppend( + string* output, const char* format, + const SubstituteArg& arg0, const SubstituteArg& arg1, + const SubstituteArg& arg2, const SubstituteArg& arg3, + const SubstituteArg& arg4, const SubstituteArg& arg5, + const SubstituteArg& arg6, const SubstituteArg& arg7, + const SubstituteArg& arg8, const SubstituteArg& arg9) { + const SubstituteArg* const args_array[] = { + &arg0, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &arg7, &arg8, &arg9, NULL + }; + + // Determine total size needed. + int size = 0; + for (int i = 0; format[i] != '\0'; i++) { + if (format[i] == '$') { + if (ascii_isdigit(format[i+1])) { + int index = format[i+1] - '0'; + if (args_array[index]->size() == -1) { + GOOGLE_LOG(DFATAL) + << "strings::Substitute format string invalid: asked for \"$" + << index << "\", but only " << CountSubstituteArgs(args_array) + << " args were given. Full format string was: \"" + << CEscape(format) << "\"."; + return; + } + size += args_array[index]->size(); + ++i; // Skip next char. + } else if (format[i+1] == '$') { + ++size; + ++i; // Skip next char. + } else { + GOOGLE_LOG(DFATAL) + << "Invalid strings::Substitute() format string: \"" + << CEscape(format) << "\"."; + return; + } + } else { + ++size; + } + } + + if (size == 0) return; + + // Build the string. + int original_size = output->size(); + STLStringResizeUninitialized(output, original_size + size); + char* target = string_as_array(output) + original_size; + for (int i = 0; format[i] != '\0'; i++) { + if (format[i] == '$') { + if (ascii_isdigit(format[i+1])) { + const SubstituteArg* src = args_array[format[i+1] - '0']; + memcpy(target, src->data(), src->size()); + target += src->size(); + ++i; // Skip next char. + } else if (format[i+1] == '$') { + *target++ = '$'; + ++i; // Skip next char. + } + } else { + *target++ = format[i]; + } + } + + GOOGLE_DCHECK_EQ(target - output->data(), output->size()); +} + +} // namespace strings +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h new file mode 100644 index 000000000..2581793b5 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h @@ -0,0 +1,170 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// from google3/strings/substitute.h + +#include +#include +#include + +#ifndef GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ +#define GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ + +namespace google { +namespace protobuf { +namespace strings { + +// ---------------------------------------------------------------------- +// strings::Substitute() +// strings::SubstituteAndAppend() +// Kind of like StringPrintf, but different. +// +// Example: +// string GetMessage(string first_name, string last_name, int age) { +// return strings::Substitute("My name is $0 $1 and I am $2 years old.", +// first_name, last_name, age); +// } +// +// Differences from StringPrintf: +// * The format string does not identify the types of arguments. +// Instead, the magic of C++ deals with this for us. See below +// for a list of accepted types. +// * Substitutions in the format string are identified by a '$' +// followed by a digit. So, you can use arguments out-of-order and +// use the same argument multiple times. +// * It's much faster than StringPrintf. +// +// Supported types: +// * Strings (const char*, const string&) +// * Note that this means you do not have to add .c_str() to all of +// your strings. In fact, you shouldn't; it will be slower. +// * int32, int64, uint32, uint64: Formatted using SimpleItoa(). +// * float, double: Formatted using SimpleFtoa() and SimpleDtoa(). +// * bool: Printed as "true" or "false". +// +// SubstituteAndAppend() is like Substitute() but appends the result to +// *output. Example: +// +// string str; +// strings::SubstituteAndAppend(&str, +// "My name is $0 $1 and I am $2 years old.", +// first_name, last_name, age); +// +// Substitute() is significantly faster than StringPrintf(). For very +// large strings, it may be orders of magnitude faster. +// ---------------------------------------------------------------------- + +namespace internal { // Implementation details. + +class SubstituteArg { + public: + inline SubstituteArg(const char* value) + : text_(value), size_(strlen(text_)) {} + inline SubstituteArg(const string& value) + : text_(value.data()), size_(value.size()) {} + + // Indicates that no argument was given. + inline explicit SubstituteArg() + : text_(NULL), size_(-1) {} + + // Primitives + // We don't overload for signed and unsigned char because if people are + // explicitly declaring their chars as signed or unsigned then they are + // probably actually using them as 8-bit integers and would probably + // prefer an integer representation. But, we don't really know. So, we + // make the caller decide what to do. + inline SubstituteArg(char value) + : text_(scratch_), size_(1) { scratch_[0] = value; } + inline SubstituteArg(short value) + : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned short value) + : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(int value) + : text_(FastInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned int value) + : text_(FastUInt32ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(long value) + : text_(FastLongToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned long value) + : text_(FastULongToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(long long value) + : text_(FastInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(unsigned long long value) + : text_(FastUInt64ToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(float value) + : text_(FloatToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(double value) + : text_(DoubleToBuffer(value, scratch_)), size_(strlen(text_)) {} + inline SubstituteArg(bool value) + : text_(value ? "true" : "false"), size_(strlen(text_)) {} + + inline const char* data() const { return text_; } + inline int size() const { return size_; } + + private: + const char* text_; + int size_; + char scratch_[kFastToBufferSize]; +}; + +} // namespace internal + +LIBPROTOBUF_EXPORT string Substitute( + const char* format, + const internal::SubstituteArg& arg0 = internal::SubstituteArg(), + const internal::SubstituteArg& arg1 = internal::SubstituteArg(), + const internal::SubstituteArg& arg2 = internal::SubstituteArg(), + const internal::SubstituteArg& arg3 = internal::SubstituteArg(), + const internal::SubstituteArg& arg4 = internal::SubstituteArg(), + const internal::SubstituteArg& arg5 = internal::SubstituteArg(), + const internal::SubstituteArg& arg6 = internal::SubstituteArg(), + const internal::SubstituteArg& arg7 = internal::SubstituteArg(), + const internal::SubstituteArg& arg8 = internal::SubstituteArg(), + const internal::SubstituteArg& arg9 = internal::SubstituteArg()); + +LIBPROTOBUF_EXPORT void SubstituteAndAppend( + string* output, const char* format, + const internal::SubstituteArg& arg0 = internal::SubstituteArg(), + const internal::SubstituteArg& arg1 = internal::SubstituteArg(), + const internal::SubstituteArg& arg2 = internal::SubstituteArg(), + const internal::SubstituteArg& arg3 = internal::SubstituteArg(), + const internal::SubstituteArg& arg4 = internal::SubstituteArg(), + const internal::SubstituteArg& arg5 = internal::SubstituteArg(), + const internal::SubstituteArg& arg6 = internal::SubstituteArg(), + const internal::SubstituteArg& arg7 = internal::SubstituteArg(), + const internal::SubstituteArg& arg8 = internal::SubstituteArg(), + const internal::SubstituteArg& arg9 = internal::SubstituteArg()); + +} // namespace strings +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_STUBS_SUBSTITUTE_H_ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc new file mode 100644 index 000000000..af8b3909b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc @@ -0,0 +1,2854 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifdef _WIN32 +// Verify that #including windows.h does not break anything (e.g. because +// windows.h #defines GetMessage() as a macro). +#include +#endif + +#include +#include +#include + +#include +#include +#include + +namespace google { +namespace protobuf { + +void TestUtil::SetAllFields(unittest::TestAllTypes* message) { + message->set_optional_int32 (101); + message->set_optional_int64 (102); + message->set_optional_uint32 (103); + message->set_optional_uint64 (104); + message->set_optional_sint32 (105); + message->set_optional_sint64 (106); + message->set_optional_fixed32 (107); + message->set_optional_fixed64 (108); + message->set_optional_sfixed32(109); + message->set_optional_sfixed64(110); + message->set_optional_float (111); + message->set_optional_double (112); + message->set_optional_bool (true); + message->set_optional_string ("115"); + message->set_optional_bytes ("116"); + + message->mutable_optionalgroup ()->set_a(117); + message->mutable_optional_nested_message ()->set_bb(118); + message->mutable_optional_foreign_message()->set_c(119); + message->mutable_optional_import_message ()->set_d(120); + + message->set_optional_nested_enum (unittest::TestAllTypes::BAZ); + message->set_optional_foreign_enum(unittest::FOREIGN_BAZ ); + message->set_optional_import_enum (unittest_import::IMPORT_BAZ); + + // StringPiece and Cord fields are only accessible via reflection in the + // open source release; see comments in compiler/cpp/string_field.cc. +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + message->GetReflection()->SetString( + message, + message->GetDescriptor()->FindFieldByName("optional_string_piece"), + "124"); + message->GetReflection()->SetString( + message, + message->GetDescriptor()->FindFieldByName("optional_cord"), + "125"); +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS + + // ----------------------------------------------------------------- + + message->add_repeated_int32 (201); + message->add_repeated_int64 (202); + message->add_repeated_uint32 (203); + message->add_repeated_uint64 (204); + message->add_repeated_sint32 (205); + message->add_repeated_sint64 (206); + message->add_repeated_fixed32 (207); + message->add_repeated_fixed64 (208); + message->add_repeated_sfixed32(209); + message->add_repeated_sfixed64(210); + message->add_repeated_float (211); + message->add_repeated_double (212); + message->add_repeated_bool (true); + message->add_repeated_string ("215"); + message->add_repeated_bytes ("216"); + + message->add_repeatedgroup ()->set_a(217); + message->add_repeated_nested_message ()->set_bb(218); + message->add_repeated_foreign_message()->set_c(219); + message->add_repeated_import_message ()->set_d(220); + + message->add_repeated_nested_enum (unittest::TestAllTypes::BAR); + message->add_repeated_foreign_enum(unittest::FOREIGN_BAR ); + message->add_repeated_import_enum (unittest_import::IMPORT_BAR); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + message->GetReflection()->AddString( + message, + message->GetDescriptor()->FindFieldByName("repeated_string_piece"), + "224"); + message->GetReflection()->AddString( + message, + message->GetDescriptor()->FindFieldByName("repeated_cord"), + "225"); +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS + + // Add a second one of each field. + message->add_repeated_int32 (301); + message->add_repeated_int64 (302); + message->add_repeated_uint32 (303); + message->add_repeated_uint64 (304); + message->add_repeated_sint32 (305); + message->add_repeated_sint64 (306); + message->add_repeated_fixed32 (307); + message->add_repeated_fixed64 (308); + message->add_repeated_sfixed32(309); + message->add_repeated_sfixed64(310); + message->add_repeated_float (311); + message->add_repeated_double (312); + message->add_repeated_bool (false); + message->add_repeated_string ("315"); + message->add_repeated_bytes ("316"); + + message->add_repeatedgroup ()->set_a(317); + message->add_repeated_nested_message ()->set_bb(318); + message->add_repeated_foreign_message()->set_c(319); + message->add_repeated_import_message ()->set_d(320); + + message->add_repeated_nested_enum (unittest::TestAllTypes::BAZ); + message->add_repeated_foreign_enum(unittest::FOREIGN_BAZ ); + message->add_repeated_import_enum (unittest_import::IMPORT_BAZ); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + message->GetReflection()->AddString( + message, + message->GetDescriptor()->FindFieldByName("repeated_string_piece"), + "324"); + message->GetReflection()->AddString( + message, + message->GetDescriptor()->FindFieldByName("repeated_cord"), + "325"); +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS + + // ----------------------------------------------------------------- + + message->set_default_int32 (401); + message->set_default_int64 (402); + message->set_default_uint32 (403); + message->set_default_uint64 (404); + message->set_default_sint32 (405); + message->set_default_sint64 (406); + message->set_default_fixed32 (407); + message->set_default_fixed64 (408); + message->set_default_sfixed32(409); + message->set_default_sfixed64(410); + message->set_default_float (411); + message->set_default_double (412); + message->set_default_bool (false); + message->set_default_string ("415"); + message->set_default_bytes ("416"); + + message->set_default_nested_enum (unittest::TestAllTypes::FOO); + message->set_default_foreign_enum(unittest::FOREIGN_FOO ); + message->set_default_import_enum (unittest_import::IMPORT_FOO); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + message->GetReflection()->SetString( + message, + message->GetDescriptor()->FindFieldByName("default_string_piece"), + "424"); + message->GetReflection()->SetString( + message, + message->GetDescriptor()->FindFieldByName("default_cord"), + "425"); +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS +} + +// ------------------------------------------------------------------- + +void TestUtil::ModifyRepeatedFields(unittest::TestAllTypes* message) { + message->set_repeated_int32 (1, 501); + message->set_repeated_int64 (1, 502); + message->set_repeated_uint32 (1, 503); + message->set_repeated_uint64 (1, 504); + message->set_repeated_sint32 (1, 505); + message->set_repeated_sint64 (1, 506); + message->set_repeated_fixed32 (1, 507); + message->set_repeated_fixed64 (1, 508); + message->set_repeated_sfixed32(1, 509); + message->set_repeated_sfixed64(1, 510); + message->set_repeated_float (1, 511); + message->set_repeated_double (1, 512); + message->set_repeated_bool (1, true); + message->set_repeated_string (1, "515"); + message->set_repeated_bytes (1, "516"); + + message->mutable_repeatedgroup (1)->set_a(517); + message->mutable_repeated_nested_message (1)->set_bb(518); + message->mutable_repeated_foreign_message(1)->set_c(519); + message->mutable_repeated_import_message (1)->set_d(520); + + message->set_repeated_nested_enum (1, unittest::TestAllTypes::FOO); + message->set_repeated_foreign_enum(1, unittest::FOREIGN_FOO ); + message->set_repeated_import_enum (1, unittest_import::IMPORT_FOO); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + message->GetReflection()->SetRepeatedString( + message, + message->GetDescriptor()->FindFieldByName("repeated_string_piece"), + 1, "524"); + message->GetReflection()->SetRepeatedString( + message, + message->GetDescriptor()->FindFieldByName("repeated_cord"), + 1, "525"); +#endif // !PROTOBUF_TEST_NO_DESCRIPTORS +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectAllFieldsSet(const unittest::TestAllTypes& message) { + EXPECT_TRUE(message.has_optional_int32 ()); + EXPECT_TRUE(message.has_optional_int64 ()); + EXPECT_TRUE(message.has_optional_uint32 ()); + EXPECT_TRUE(message.has_optional_uint64 ()); + EXPECT_TRUE(message.has_optional_sint32 ()); + EXPECT_TRUE(message.has_optional_sint64 ()); + EXPECT_TRUE(message.has_optional_fixed32 ()); + EXPECT_TRUE(message.has_optional_fixed64 ()); + EXPECT_TRUE(message.has_optional_sfixed32()); + EXPECT_TRUE(message.has_optional_sfixed64()); + EXPECT_TRUE(message.has_optional_float ()); + EXPECT_TRUE(message.has_optional_double ()); + EXPECT_TRUE(message.has_optional_bool ()); + EXPECT_TRUE(message.has_optional_string ()); + EXPECT_TRUE(message.has_optional_bytes ()); + + EXPECT_TRUE(message.has_optionalgroup ()); + EXPECT_TRUE(message.has_optional_nested_message ()); + EXPECT_TRUE(message.has_optional_foreign_message()); + EXPECT_TRUE(message.has_optional_import_message ()); + + EXPECT_TRUE(message.optionalgroup ().has_a()); + EXPECT_TRUE(message.optional_nested_message ().has_bb()); + EXPECT_TRUE(message.optional_foreign_message().has_c()); + EXPECT_TRUE(message.optional_import_message ().has_d()); + + EXPECT_TRUE(message.has_optional_nested_enum ()); + EXPECT_TRUE(message.has_optional_foreign_enum()); + EXPECT_TRUE(message.has_optional_import_enum ()); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + EXPECT_TRUE(message.has_optional_string_piece()); + EXPECT_TRUE(message.has_optional_cord()); +#endif + + EXPECT_EQ(101 , message.optional_int32 ()); + EXPECT_EQ(102 , message.optional_int64 ()); + EXPECT_EQ(103 , message.optional_uint32 ()); + EXPECT_EQ(104 , message.optional_uint64 ()); + EXPECT_EQ(105 , message.optional_sint32 ()); + EXPECT_EQ(106 , message.optional_sint64 ()); + EXPECT_EQ(107 , message.optional_fixed32 ()); + EXPECT_EQ(108 , message.optional_fixed64 ()); + EXPECT_EQ(109 , message.optional_sfixed32()); + EXPECT_EQ(110 , message.optional_sfixed64()); + EXPECT_EQ(111 , message.optional_float ()); + EXPECT_EQ(112 , message.optional_double ()); + EXPECT_EQ(true , message.optional_bool ()); + EXPECT_EQ("115", message.optional_string ()); + EXPECT_EQ("116", message.optional_bytes ()); + + EXPECT_EQ(117, message.optionalgroup ().a()); + EXPECT_EQ(118, message.optional_nested_message ().bb()); + EXPECT_EQ(119, message.optional_foreign_message().c()); + EXPECT_EQ(120, message.optional_import_message ().d()); + + EXPECT_EQ(unittest::TestAllTypes::BAZ, message.optional_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_BAZ , message.optional_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_BAZ, message.optional_import_enum ()); + + + // ----------------------------------------------------------------- + + ASSERT_EQ(2, message.repeated_int32_size ()); + ASSERT_EQ(2, message.repeated_int64_size ()); + ASSERT_EQ(2, message.repeated_uint32_size ()); + ASSERT_EQ(2, message.repeated_uint64_size ()); + ASSERT_EQ(2, message.repeated_sint32_size ()); + ASSERT_EQ(2, message.repeated_sint64_size ()); + ASSERT_EQ(2, message.repeated_fixed32_size ()); + ASSERT_EQ(2, message.repeated_fixed64_size ()); + ASSERT_EQ(2, message.repeated_sfixed32_size()); + ASSERT_EQ(2, message.repeated_sfixed64_size()); + ASSERT_EQ(2, message.repeated_float_size ()); + ASSERT_EQ(2, message.repeated_double_size ()); + ASSERT_EQ(2, message.repeated_bool_size ()); + ASSERT_EQ(2, message.repeated_string_size ()); + ASSERT_EQ(2, message.repeated_bytes_size ()); + + ASSERT_EQ(2, message.repeatedgroup_size ()); + ASSERT_EQ(2, message.repeated_nested_message_size ()); + ASSERT_EQ(2, message.repeated_foreign_message_size()); + ASSERT_EQ(2, message.repeated_import_message_size ()); + ASSERT_EQ(2, message.repeated_nested_enum_size ()); + ASSERT_EQ(2, message.repeated_foreign_enum_size ()); + ASSERT_EQ(2, message.repeated_import_enum_size ()); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + ASSERT_EQ(2, message.repeated_string_piece_size()); + ASSERT_EQ(2, message.repeated_cord_size()); +#endif + + EXPECT_EQ(201 , message.repeated_int32 (0)); + EXPECT_EQ(202 , message.repeated_int64 (0)); + EXPECT_EQ(203 , message.repeated_uint32 (0)); + EXPECT_EQ(204 , message.repeated_uint64 (0)); + EXPECT_EQ(205 , message.repeated_sint32 (0)); + EXPECT_EQ(206 , message.repeated_sint64 (0)); + EXPECT_EQ(207 , message.repeated_fixed32 (0)); + EXPECT_EQ(208 , message.repeated_fixed64 (0)); + EXPECT_EQ(209 , message.repeated_sfixed32(0)); + EXPECT_EQ(210 , message.repeated_sfixed64(0)); + EXPECT_EQ(211 , message.repeated_float (0)); + EXPECT_EQ(212 , message.repeated_double (0)); + EXPECT_EQ(true , message.repeated_bool (0)); + EXPECT_EQ("215", message.repeated_string (0)); + EXPECT_EQ("216", message.repeated_bytes (0)); + + EXPECT_EQ(217, message.repeatedgroup (0).a()); + EXPECT_EQ(218, message.repeated_nested_message (0).bb()); + EXPECT_EQ(219, message.repeated_foreign_message(0).c()); + EXPECT_EQ(220, message.repeated_import_message (0).d()); + + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(0)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0)); + + EXPECT_EQ(301 , message.repeated_int32 (1)); + EXPECT_EQ(302 , message.repeated_int64 (1)); + EXPECT_EQ(303 , message.repeated_uint32 (1)); + EXPECT_EQ(304 , message.repeated_uint64 (1)); + EXPECT_EQ(305 , message.repeated_sint32 (1)); + EXPECT_EQ(306 , message.repeated_sint64 (1)); + EXPECT_EQ(307 , message.repeated_fixed32 (1)); + EXPECT_EQ(308 , message.repeated_fixed64 (1)); + EXPECT_EQ(309 , message.repeated_sfixed32(1)); + EXPECT_EQ(310 , message.repeated_sfixed64(1)); + EXPECT_EQ(311 , message.repeated_float (1)); + EXPECT_EQ(312 , message.repeated_double (1)); + EXPECT_EQ(false, message.repeated_bool (1)); + EXPECT_EQ("315", message.repeated_string (1)); + EXPECT_EQ("316", message.repeated_bytes (1)); + + EXPECT_EQ(317, message.repeatedgroup (1).a()); + EXPECT_EQ(318, message.repeated_nested_message (1).bb()); + EXPECT_EQ(319, message.repeated_foreign_message(1).c()); + EXPECT_EQ(320, message.repeated_import_message (1).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (1)); + EXPECT_EQ(unittest::FOREIGN_BAZ , message.repeated_foreign_enum(1)); + EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (1)); + + + // ----------------------------------------------------------------- + + EXPECT_TRUE(message.has_default_int32 ()); + EXPECT_TRUE(message.has_default_int64 ()); + EXPECT_TRUE(message.has_default_uint32 ()); + EXPECT_TRUE(message.has_default_uint64 ()); + EXPECT_TRUE(message.has_default_sint32 ()); + EXPECT_TRUE(message.has_default_sint64 ()); + EXPECT_TRUE(message.has_default_fixed32 ()); + EXPECT_TRUE(message.has_default_fixed64 ()); + EXPECT_TRUE(message.has_default_sfixed32()); + EXPECT_TRUE(message.has_default_sfixed64()); + EXPECT_TRUE(message.has_default_float ()); + EXPECT_TRUE(message.has_default_double ()); + EXPECT_TRUE(message.has_default_bool ()); + EXPECT_TRUE(message.has_default_string ()); + EXPECT_TRUE(message.has_default_bytes ()); + + EXPECT_TRUE(message.has_default_nested_enum ()); + EXPECT_TRUE(message.has_default_foreign_enum()); + EXPECT_TRUE(message.has_default_import_enum ()); + + + EXPECT_EQ(401 , message.default_int32 ()); + EXPECT_EQ(402 , message.default_int64 ()); + EXPECT_EQ(403 , message.default_uint32 ()); + EXPECT_EQ(404 , message.default_uint64 ()); + EXPECT_EQ(405 , message.default_sint32 ()); + EXPECT_EQ(406 , message.default_sint64 ()); + EXPECT_EQ(407 , message.default_fixed32 ()); + EXPECT_EQ(408 , message.default_fixed64 ()); + EXPECT_EQ(409 , message.default_sfixed32()); + EXPECT_EQ(410 , message.default_sfixed64()); + EXPECT_EQ(411 , message.default_float ()); + EXPECT_EQ(412 , message.default_double ()); + EXPECT_EQ(false, message.default_bool ()); + EXPECT_EQ("415", message.default_string ()); + EXPECT_EQ("416", message.default_bytes ()); + + EXPECT_EQ(unittest::TestAllTypes::FOO, message.default_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_FOO , message.default_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_FOO, message.default_import_enum ()); + +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectClear(const unittest::TestAllTypes& message) { + // has_blah() should initially be false for all optional fields. + EXPECT_FALSE(message.has_optional_int32 ()); + EXPECT_FALSE(message.has_optional_int64 ()); + EXPECT_FALSE(message.has_optional_uint32 ()); + EXPECT_FALSE(message.has_optional_uint64 ()); + EXPECT_FALSE(message.has_optional_sint32 ()); + EXPECT_FALSE(message.has_optional_sint64 ()); + EXPECT_FALSE(message.has_optional_fixed32 ()); + EXPECT_FALSE(message.has_optional_fixed64 ()); + EXPECT_FALSE(message.has_optional_sfixed32()); + EXPECT_FALSE(message.has_optional_sfixed64()); + EXPECT_FALSE(message.has_optional_float ()); + EXPECT_FALSE(message.has_optional_double ()); + EXPECT_FALSE(message.has_optional_bool ()); + EXPECT_FALSE(message.has_optional_string ()); + EXPECT_FALSE(message.has_optional_bytes ()); + + EXPECT_FALSE(message.has_optionalgroup ()); + EXPECT_FALSE(message.has_optional_nested_message ()); + EXPECT_FALSE(message.has_optional_foreign_message()); + EXPECT_FALSE(message.has_optional_import_message ()); + + EXPECT_FALSE(message.has_optional_nested_enum ()); + EXPECT_FALSE(message.has_optional_foreign_enum()); + EXPECT_FALSE(message.has_optional_import_enum ()); + + EXPECT_FALSE(message.has_optional_string_piece()); + EXPECT_FALSE(message.has_optional_cord()); + + // Optional fields without defaults are set to zero or something like it. + EXPECT_EQ(0 , message.optional_int32 ()); + EXPECT_EQ(0 , message.optional_int64 ()); + EXPECT_EQ(0 , message.optional_uint32 ()); + EXPECT_EQ(0 , message.optional_uint64 ()); + EXPECT_EQ(0 , message.optional_sint32 ()); + EXPECT_EQ(0 , message.optional_sint64 ()); + EXPECT_EQ(0 , message.optional_fixed32 ()); + EXPECT_EQ(0 , message.optional_fixed64 ()); + EXPECT_EQ(0 , message.optional_sfixed32()); + EXPECT_EQ(0 , message.optional_sfixed64()); + EXPECT_EQ(0 , message.optional_float ()); + EXPECT_EQ(0 , message.optional_double ()); + EXPECT_EQ(false, message.optional_bool ()); + EXPECT_EQ("" , message.optional_string ()); + EXPECT_EQ("" , message.optional_bytes ()); + + // Embedded messages should also be clear. + EXPECT_FALSE(message.optionalgroup ().has_a()); + EXPECT_FALSE(message.optional_nested_message ().has_bb()); + EXPECT_FALSE(message.optional_foreign_message().has_c()); + EXPECT_FALSE(message.optional_import_message ().has_d()); + + EXPECT_EQ(0, message.optionalgroup ().a()); + EXPECT_EQ(0, message.optional_nested_message ().bb()); + EXPECT_EQ(0, message.optional_foreign_message().c()); + EXPECT_EQ(0, message.optional_import_message ().d()); + + // Enums without defaults are set to the first value in the enum. + EXPECT_EQ(unittest::TestAllTypes::FOO, message.optional_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_FOO , message.optional_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_FOO, message.optional_import_enum ()); + + + // Repeated fields are empty. + EXPECT_EQ(0, message.repeated_int32_size ()); + EXPECT_EQ(0, message.repeated_int64_size ()); + EXPECT_EQ(0, message.repeated_uint32_size ()); + EXPECT_EQ(0, message.repeated_uint64_size ()); + EXPECT_EQ(0, message.repeated_sint32_size ()); + EXPECT_EQ(0, message.repeated_sint64_size ()); + EXPECT_EQ(0, message.repeated_fixed32_size ()); + EXPECT_EQ(0, message.repeated_fixed64_size ()); + EXPECT_EQ(0, message.repeated_sfixed32_size()); + EXPECT_EQ(0, message.repeated_sfixed64_size()); + EXPECT_EQ(0, message.repeated_float_size ()); + EXPECT_EQ(0, message.repeated_double_size ()); + EXPECT_EQ(0, message.repeated_bool_size ()); + EXPECT_EQ(0, message.repeated_string_size ()); + EXPECT_EQ(0, message.repeated_bytes_size ()); + + EXPECT_EQ(0, message.repeatedgroup_size ()); + EXPECT_EQ(0, message.repeated_nested_message_size ()); + EXPECT_EQ(0, message.repeated_foreign_message_size()); + EXPECT_EQ(0, message.repeated_import_message_size ()); + EXPECT_EQ(0, message.repeated_nested_enum_size ()); + EXPECT_EQ(0, message.repeated_foreign_enum_size ()); + EXPECT_EQ(0, message.repeated_import_enum_size ()); + + EXPECT_EQ(0, message.repeated_string_piece_size()); + EXPECT_EQ(0, message.repeated_cord_size()); + + // has_blah() should also be false for all default fields. + EXPECT_FALSE(message.has_default_int32 ()); + EXPECT_FALSE(message.has_default_int64 ()); + EXPECT_FALSE(message.has_default_uint32 ()); + EXPECT_FALSE(message.has_default_uint64 ()); + EXPECT_FALSE(message.has_default_sint32 ()); + EXPECT_FALSE(message.has_default_sint64 ()); + EXPECT_FALSE(message.has_default_fixed32 ()); + EXPECT_FALSE(message.has_default_fixed64 ()); + EXPECT_FALSE(message.has_default_sfixed32()); + EXPECT_FALSE(message.has_default_sfixed64()); + EXPECT_FALSE(message.has_default_float ()); + EXPECT_FALSE(message.has_default_double ()); + EXPECT_FALSE(message.has_default_bool ()); + EXPECT_FALSE(message.has_default_string ()); + EXPECT_FALSE(message.has_default_bytes ()); + + EXPECT_FALSE(message.has_default_nested_enum ()); + EXPECT_FALSE(message.has_default_foreign_enum()); + EXPECT_FALSE(message.has_default_import_enum ()); + + + // Fields with defaults have their default values (duh). + EXPECT_EQ( 41 , message.default_int32 ()); + EXPECT_EQ( 42 , message.default_int64 ()); + EXPECT_EQ( 43 , message.default_uint32 ()); + EXPECT_EQ( 44 , message.default_uint64 ()); + EXPECT_EQ(-45 , message.default_sint32 ()); + EXPECT_EQ( 46 , message.default_sint64 ()); + EXPECT_EQ( 47 , message.default_fixed32 ()); + EXPECT_EQ( 48 , message.default_fixed64 ()); + EXPECT_EQ( 49 , message.default_sfixed32()); + EXPECT_EQ(-50 , message.default_sfixed64()); + EXPECT_EQ( 51.5 , message.default_float ()); + EXPECT_EQ( 52e3 , message.default_double ()); + EXPECT_EQ(true , message.default_bool ()); + EXPECT_EQ("hello", message.default_string ()); + EXPECT_EQ("world", message.default_bytes ()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.default_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_BAR , message.default_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.default_import_enum ()); + +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectRepeatedFieldsModified( + const unittest::TestAllTypes& message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + ASSERT_EQ(2, message.repeated_int32_size ()); + ASSERT_EQ(2, message.repeated_int64_size ()); + ASSERT_EQ(2, message.repeated_uint32_size ()); + ASSERT_EQ(2, message.repeated_uint64_size ()); + ASSERT_EQ(2, message.repeated_sint32_size ()); + ASSERT_EQ(2, message.repeated_sint64_size ()); + ASSERT_EQ(2, message.repeated_fixed32_size ()); + ASSERT_EQ(2, message.repeated_fixed64_size ()); + ASSERT_EQ(2, message.repeated_sfixed32_size()); + ASSERT_EQ(2, message.repeated_sfixed64_size()); + ASSERT_EQ(2, message.repeated_float_size ()); + ASSERT_EQ(2, message.repeated_double_size ()); + ASSERT_EQ(2, message.repeated_bool_size ()); + ASSERT_EQ(2, message.repeated_string_size ()); + ASSERT_EQ(2, message.repeated_bytes_size ()); + + ASSERT_EQ(2, message.repeatedgroup_size ()); + ASSERT_EQ(2, message.repeated_nested_message_size ()); + ASSERT_EQ(2, message.repeated_foreign_message_size()); + ASSERT_EQ(2, message.repeated_import_message_size ()); + ASSERT_EQ(2, message.repeated_nested_enum_size ()); + ASSERT_EQ(2, message.repeated_foreign_enum_size ()); + ASSERT_EQ(2, message.repeated_import_enum_size ()); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + ASSERT_EQ(2, message.repeated_string_piece_size()); + ASSERT_EQ(2, message.repeated_cord_size()); +#endif + + EXPECT_EQ(201 , message.repeated_int32 (0)); + EXPECT_EQ(202 , message.repeated_int64 (0)); + EXPECT_EQ(203 , message.repeated_uint32 (0)); + EXPECT_EQ(204 , message.repeated_uint64 (0)); + EXPECT_EQ(205 , message.repeated_sint32 (0)); + EXPECT_EQ(206 , message.repeated_sint64 (0)); + EXPECT_EQ(207 , message.repeated_fixed32 (0)); + EXPECT_EQ(208 , message.repeated_fixed64 (0)); + EXPECT_EQ(209 , message.repeated_sfixed32(0)); + EXPECT_EQ(210 , message.repeated_sfixed64(0)); + EXPECT_EQ(211 , message.repeated_float (0)); + EXPECT_EQ(212 , message.repeated_double (0)); + EXPECT_EQ(true , message.repeated_bool (0)); + EXPECT_EQ("215", message.repeated_string (0)); + EXPECT_EQ("216", message.repeated_bytes (0)); + + EXPECT_EQ(217, message.repeatedgroup (0).a()); + EXPECT_EQ(218, message.repeated_nested_message (0).bb()); + EXPECT_EQ(219, message.repeated_foreign_message(0).c()); + EXPECT_EQ(220, message.repeated_import_message (0).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(0)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0)); + + + // Actually verify the second (modified) elements now. + EXPECT_EQ(501 , message.repeated_int32 (1)); + EXPECT_EQ(502 , message.repeated_int64 (1)); + EXPECT_EQ(503 , message.repeated_uint32 (1)); + EXPECT_EQ(504 , message.repeated_uint64 (1)); + EXPECT_EQ(505 , message.repeated_sint32 (1)); + EXPECT_EQ(506 , message.repeated_sint64 (1)); + EXPECT_EQ(507 , message.repeated_fixed32 (1)); + EXPECT_EQ(508 , message.repeated_fixed64 (1)); + EXPECT_EQ(509 , message.repeated_sfixed32(1)); + EXPECT_EQ(510 , message.repeated_sfixed64(1)); + EXPECT_EQ(511 , message.repeated_float (1)); + EXPECT_EQ(512 , message.repeated_double (1)); + EXPECT_EQ(true , message.repeated_bool (1)); + EXPECT_EQ("515", message.repeated_string (1)); + EXPECT_EQ("516", message.repeated_bytes (1)); + + EXPECT_EQ(517, message.repeatedgroup (1).a()); + EXPECT_EQ(518, message.repeated_nested_message (1).bb()); + EXPECT_EQ(519, message.repeated_foreign_message(1).c()); + EXPECT_EQ(520, message.repeated_import_message (1).d()); + + EXPECT_EQ(unittest::TestAllTypes::FOO, message.repeated_nested_enum (1)); + EXPECT_EQ(unittest::FOREIGN_FOO , message.repeated_foreign_enum(1)); + EXPECT_EQ(unittest_import::IMPORT_FOO, message.repeated_import_enum (1)); + +} + +// ------------------------------------------------------------------- + +void TestUtil::SetPackedFields(unittest::TestPackedTypes* message) { + message->add_packed_int32 (601); + message->add_packed_int64 (602); + message->add_packed_uint32 (603); + message->add_packed_uint64 (604); + message->add_packed_sint32 (605); + message->add_packed_sint64 (606); + message->add_packed_fixed32 (607); + message->add_packed_fixed64 (608); + message->add_packed_sfixed32(609); + message->add_packed_sfixed64(610); + message->add_packed_float (611); + message->add_packed_double (612); + message->add_packed_bool (true); + message->add_packed_enum (unittest::FOREIGN_BAR); + // add a second one of each field + message->add_packed_int32 (701); + message->add_packed_int64 (702); + message->add_packed_uint32 (703); + message->add_packed_uint64 (704); + message->add_packed_sint32 (705); + message->add_packed_sint64 (706); + message->add_packed_fixed32 (707); + message->add_packed_fixed64 (708); + message->add_packed_sfixed32(709); + message->add_packed_sfixed64(710); + message->add_packed_float (711); + message->add_packed_double (712); + message->add_packed_bool (false); + message->add_packed_enum (unittest::FOREIGN_BAZ); +} + +void TestUtil::SetUnpackedFields(unittest::TestUnpackedTypes* message) { + // The values applied here must match those of SetPackedFields. + + message->add_unpacked_int32 (601); + message->add_unpacked_int64 (602); + message->add_unpacked_uint32 (603); + message->add_unpacked_uint64 (604); + message->add_unpacked_sint32 (605); + message->add_unpacked_sint64 (606); + message->add_unpacked_fixed32 (607); + message->add_unpacked_fixed64 (608); + message->add_unpacked_sfixed32(609); + message->add_unpacked_sfixed64(610); + message->add_unpacked_float (611); + message->add_unpacked_double (612); + message->add_unpacked_bool (true); + message->add_unpacked_enum (unittest::FOREIGN_BAR); + // add a second one of each field + message->add_unpacked_int32 (701); + message->add_unpacked_int64 (702); + message->add_unpacked_uint32 (703); + message->add_unpacked_uint64 (704); + message->add_unpacked_sint32 (705); + message->add_unpacked_sint64 (706); + message->add_unpacked_fixed32 (707); + message->add_unpacked_fixed64 (708); + message->add_unpacked_sfixed32(709); + message->add_unpacked_sfixed64(710); + message->add_unpacked_float (711); + message->add_unpacked_double (712); + message->add_unpacked_bool (false); + message->add_unpacked_enum (unittest::FOREIGN_BAZ); +} + +// ------------------------------------------------------------------- + +void TestUtil::ModifyPackedFields(unittest::TestPackedTypes* message) { + message->set_packed_int32 (1, 801); + message->set_packed_int64 (1, 802); + message->set_packed_uint32 (1, 803); + message->set_packed_uint64 (1, 804); + message->set_packed_sint32 (1, 805); + message->set_packed_sint64 (1, 806); + message->set_packed_fixed32 (1, 807); + message->set_packed_fixed64 (1, 808); + message->set_packed_sfixed32(1, 809); + message->set_packed_sfixed64(1, 810); + message->set_packed_float (1, 811); + message->set_packed_double (1, 812); + message->set_packed_bool (1, true); + message->set_packed_enum (1, unittest::FOREIGN_FOO); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectPackedFieldsSet(const unittest::TestPackedTypes& message) { + ASSERT_EQ(2, message.packed_int32_size ()); + ASSERT_EQ(2, message.packed_int64_size ()); + ASSERT_EQ(2, message.packed_uint32_size ()); + ASSERT_EQ(2, message.packed_uint64_size ()); + ASSERT_EQ(2, message.packed_sint32_size ()); + ASSERT_EQ(2, message.packed_sint64_size ()); + ASSERT_EQ(2, message.packed_fixed32_size ()); + ASSERT_EQ(2, message.packed_fixed64_size ()); + ASSERT_EQ(2, message.packed_sfixed32_size()); + ASSERT_EQ(2, message.packed_sfixed64_size()); + ASSERT_EQ(2, message.packed_float_size ()); + ASSERT_EQ(2, message.packed_double_size ()); + ASSERT_EQ(2, message.packed_bool_size ()); + ASSERT_EQ(2, message.packed_enum_size ()); + + EXPECT_EQ(601 , message.packed_int32 (0)); + EXPECT_EQ(602 , message.packed_int64 (0)); + EXPECT_EQ(603 , message.packed_uint32 (0)); + EXPECT_EQ(604 , message.packed_uint64 (0)); + EXPECT_EQ(605 , message.packed_sint32 (0)); + EXPECT_EQ(606 , message.packed_sint64 (0)); + EXPECT_EQ(607 , message.packed_fixed32 (0)); + EXPECT_EQ(608 , message.packed_fixed64 (0)); + EXPECT_EQ(609 , message.packed_sfixed32(0)); + EXPECT_EQ(610 , message.packed_sfixed64(0)); + EXPECT_EQ(611 , message.packed_float (0)); + EXPECT_EQ(612 , message.packed_double (0)); + EXPECT_EQ(true , message.packed_bool (0)); + EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0)); + + EXPECT_EQ(701 , message.packed_int32 (1)); + EXPECT_EQ(702 , message.packed_int64 (1)); + EXPECT_EQ(703 , message.packed_uint32 (1)); + EXPECT_EQ(704 , message.packed_uint64 (1)); + EXPECT_EQ(705 , message.packed_sint32 (1)); + EXPECT_EQ(706 , message.packed_sint64 (1)); + EXPECT_EQ(707 , message.packed_fixed32 (1)); + EXPECT_EQ(708 , message.packed_fixed64 (1)); + EXPECT_EQ(709 , message.packed_sfixed32(1)); + EXPECT_EQ(710 , message.packed_sfixed64(1)); + EXPECT_EQ(711 , message.packed_float (1)); + EXPECT_EQ(712 , message.packed_double (1)); + EXPECT_EQ(false, message.packed_bool (1)); + EXPECT_EQ(unittest::FOREIGN_BAZ, message.packed_enum(1)); +} + +void TestUtil::ExpectUnpackedFieldsSet( + const unittest::TestUnpackedTypes& message) { + // The values expected here must match those of ExpectPackedFieldsSet. + + ASSERT_EQ(2, message.unpacked_int32_size ()); + ASSERT_EQ(2, message.unpacked_int64_size ()); + ASSERT_EQ(2, message.unpacked_uint32_size ()); + ASSERT_EQ(2, message.unpacked_uint64_size ()); + ASSERT_EQ(2, message.unpacked_sint32_size ()); + ASSERT_EQ(2, message.unpacked_sint64_size ()); + ASSERT_EQ(2, message.unpacked_fixed32_size ()); + ASSERT_EQ(2, message.unpacked_fixed64_size ()); + ASSERT_EQ(2, message.unpacked_sfixed32_size()); + ASSERT_EQ(2, message.unpacked_sfixed64_size()); + ASSERT_EQ(2, message.unpacked_float_size ()); + ASSERT_EQ(2, message.unpacked_double_size ()); + ASSERT_EQ(2, message.unpacked_bool_size ()); + ASSERT_EQ(2, message.unpacked_enum_size ()); + + EXPECT_EQ(601 , message.unpacked_int32 (0)); + EXPECT_EQ(602 , message.unpacked_int64 (0)); + EXPECT_EQ(603 , message.unpacked_uint32 (0)); + EXPECT_EQ(604 , message.unpacked_uint64 (0)); + EXPECT_EQ(605 , message.unpacked_sint32 (0)); + EXPECT_EQ(606 , message.unpacked_sint64 (0)); + EXPECT_EQ(607 , message.unpacked_fixed32 (0)); + EXPECT_EQ(608 , message.unpacked_fixed64 (0)); + EXPECT_EQ(609 , message.unpacked_sfixed32(0)); + EXPECT_EQ(610 , message.unpacked_sfixed64(0)); + EXPECT_EQ(611 , message.unpacked_float (0)); + EXPECT_EQ(612 , message.unpacked_double (0)); + EXPECT_EQ(true , message.unpacked_bool (0)); + EXPECT_EQ(unittest::FOREIGN_BAR, message.unpacked_enum(0)); + + EXPECT_EQ(701 , message.unpacked_int32 (1)); + EXPECT_EQ(702 , message.unpacked_int64 (1)); + EXPECT_EQ(703 , message.unpacked_uint32 (1)); + EXPECT_EQ(704 , message.unpacked_uint64 (1)); + EXPECT_EQ(705 , message.unpacked_sint32 (1)); + EXPECT_EQ(706 , message.unpacked_sint64 (1)); + EXPECT_EQ(707 , message.unpacked_fixed32 (1)); + EXPECT_EQ(708 , message.unpacked_fixed64 (1)); + EXPECT_EQ(709 , message.unpacked_sfixed32(1)); + EXPECT_EQ(710 , message.unpacked_sfixed64(1)); + EXPECT_EQ(711 , message.unpacked_float (1)); + EXPECT_EQ(712 , message.unpacked_double (1)); + EXPECT_EQ(false, message.unpacked_bool (1)); + EXPECT_EQ(unittest::FOREIGN_BAZ, message.unpacked_enum(1)); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectPackedClear( + const unittest::TestPackedTypes& message) { + // Packed repeated fields are empty. + EXPECT_EQ(0, message.packed_int32_size ()); + EXPECT_EQ(0, message.packed_int64_size ()); + EXPECT_EQ(0, message.packed_uint32_size ()); + EXPECT_EQ(0, message.packed_uint64_size ()); + EXPECT_EQ(0, message.packed_sint32_size ()); + EXPECT_EQ(0, message.packed_sint64_size ()); + EXPECT_EQ(0, message.packed_fixed32_size ()); + EXPECT_EQ(0, message.packed_fixed64_size ()); + EXPECT_EQ(0, message.packed_sfixed32_size()); + EXPECT_EQ(0, message.packed_sfixed64_size()); + EXPECT_EQ(0, message.packed_float_size ()); + EXPECT_EQ(0, message.packed_double_size ()); + EXPECT_EQ(0, message.packed_bool_size ()); + EXPECT_EQ(0, message.packed_enum_size ()); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectPackedFieldsModified( + const unittest::TestPackedTypes& message) { + // Do the same for packed repeated fields. + ASSERT_EQ(2, message.packed_int32_size ()); + ASSERT_EQ(2, message.packed_int64_size ()); + ASSERT_EQ(2, message.packed_uint32_size ()); + ASSERT_EQ(2, message.packed_uint64_size ()); + ASSERT_EQ(2, message.packed_sint32_size ()); + ASSERT_EQ(2, message.packed_sint64_size ()); + ASSERT_EQ(2, message.packed_fixed32_size ()); + ASSERT_EQ(2, message.packed_fixed64_size ()); + ASSERT_EQ(2, message.packed_sfixed32_size()); + ASSERT_EQ(2, message.packed_sfixed64_size()); + ASSERT_EQ(2, message.packed_float_size ()); + ASSERT_EQ(2, message.packed_double_size ()); + ASSERT_EQ(2, message.packed_bool_size ()); + ASSERT_EQ(2, message.packed_enum_size ()); + + EXPECT_EQ(601 , message.packed_int32 (0)); + EXPECT_EQ(602 , message.packed_int64 (0)); + EXPECT_EQ(603 , message.packed_uint32 (0)); + EXPECT_EQ(604 , message.packed_uint64 (0)); + EXPECT_EQ(605 , message.packed_sint32 (0)); + EXPECT_EQ(606 , message.packed_sint64 (0)); + EXPECT_EQ(607 , message.packed_fixed32 (0)); + EXPECT_EQ(608 , message.packed_fixed64 (0)); + EXPECT_EQ(609 , message.packed_sfixed32(0)); + EXPECT_EQ(610 , message.packed_sfixed64(0)); + EXPECT_EQ(611 , message.packed_float (0)); + EXPECT_EQ(612 , message.packed_double (0)); + EXPECT_EQ(true , message.packed_bool (0)); + EXPECT_EQ(unittest::FOREIGN_BAR, message.packed_enum(0)); + // Actually verify the second (modified) elements now. + EXPECT_EQ(801 , message.packed_int32 (1)); + EXPECT_EQ(802 , message.packed_int64 (1)); + EXPECT_EQ(803 , message.packed_uint32 (1)); + EXPECT_EQ(804 , message.packed_uint64 (1)); + EXPECT_EQ(805 , message.packed_sint32 (1)); + EXPECT_EQ(806 , message.packed_sint64 (1)); + EXPECT_EQ(807 , message.packed_fixed32 (1)); + EXPECT_EQ(808 , message.packed_fixed64 (1)); + EXPECT_EQ(809 , message.packed_sfixed32(1)); + EXPECT_EQ(810 , message.packed_sfixed64(1)); + EXPECT_EQ(811 , message.packed_float (1)); + EXPECT_EQ(812 , message.packed_double (1)); + EXPECT_EQ(true , message.packed_bool (1)); + EXPECT_EQ(unittest::FOREIGN_FOO, message.packed_enum(1)); +} + +// =================================================================== +// Extensions +// +// All this code is exactly equivalent to the above code except that it's +// manipulating extension fields instead of normal ones. +// +// I gave up on the 80-char limit here. Sorry. + +void TestUtil::SetAllExtensions(unittest::TestAllExtensions* message) { + message->SetExtension(unittest::optional_int32_extension , 101); + message->SetExtension(unittest::optional_int64_extension , 102); + message->SetExtension(unittest::optional_uint32_extension , 103); + message->SetExtension(unittest::optional_uint64_extension , 104); + message->SetExtension(unittest::optional_sint32_extension , 105); + message->SetExtension(unittest::optional_sint64_extension , 106); + message->SetExtension(unittest::optional_fixed32_extension , 107); + message->SetExtension(unittest::optional_fixed64_extension , 108); + message->SetExtension(unittest::optional_sfixed32_extension, 109); + message->SetExtension(unittest::optional_sfixed64_extension, 110); + message->SetExtension(unittest::optional_float_extension , 111); + message->SetExtension(unittest::optional_double_extension , 112); + message->SetExtension(unittest::optional_bool_extension , true); + message->SetExtension(unittest::optional_string_extension , "115"); + message->SetExtension(unittest::optional_bytes_extension , "116"); + + message->MutableExtension(unittest::optionalgroup_extension )->set_a(117); + message->MutableExtension(unittest::optional_nested_message_extension )->set_bb(118); + message->MutableExtension(unittest::optional_foreign_message_extension)->set_c(119); + message->MutableExtension(unittest::optional_import_message_extension )->set_d(120); + + message->SetExtension(unittest::optional_nested_enum_extension , unittest::TestAllTypes::BAZ); + message->SetExtension(unittest::optional_foreign_enum_extension, unittest::FOREIGN_BAZ ); + message->SetExtension(unittest::optional_import_enum_extension , unittest_import::IMPORT_BAZ); + + message->SetExtension(unittest::optional_string_piece_extension, "124"); + message->SetExtension(unittest::optional_cord_extension, "125"); + + // ----------------------------------------------------------------- + + message->AddExtension(unittest::repeated_int32_extension , 201); + message->AddExtension(unittest::repeated_int64_extension , 202); + message->AddExtension(unittest::repeated_uint32_extension , 203); + message->AddExtension(unittest::repeated_uint64_extension , 204); + message->AddExtension(unittest::repeated_sint32_extension , 205); + message->AddExtension(unittest::repeated_sint64_extension , 206); + message->AddExtension(unittest::repeated_fixed32_extension , 207); + message->AddExtension(unittest::repeated_fixed64_extension , 208); + message->AddExtension(unittest::repeated_sfixed32_extension, 209); + message->AddExtension(unittest::repeated_sfixed64_extension, 210); + message->AddExtension(unittest::repeated_float_extension , 211); + message->AddExtension(unittest::repeated_double_extension , 212); + message->AddExtension(unittest::repeated_bool_extension , true); + message->AddExtension(unittest::repeated_string_extension , "215"); + message->AddExtension(unittest::repeated_bytes_extension , "216"); + + message->AddExtension(unittest::repeatedgroup_extension )->set_a(217); + message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(218); + message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(219); + message->AddExtension(unittest::repeated_import_message_extension )->set_d(220); + + message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAR); + message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAR ); + message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAR); + + message->AddExtension(unittest::repeated_string_piece_extension, "224"); + message->AddExtension(unittest::repeated_cord_extension, "225"); + + // Add a second one of each field. + message->AddExtension(unittest::repeated_int32_extension , 301); + message->AddExtension(unittest::repeated_int64_extension , 302); + message->AddExtension(unittest::repeated_uint32_extension , 303); + message->AddExtension(unittest::repeated_uint64_extension , 304); + message->AddExtension(unittest::repeated_sint32_extension , 305); + message->AddExtension(unittest::repeated_sint64_extension , 306); + message->AddExtension(unittest::repeated_fixed32_extension , 307); + message->AddExtension(unittest::repeated_fixed64_extension , 308); + message->AddExtension(unittest::repeated_sfixed32_extension, 309); + message->AddExtension(unittest::repeated_sfixed64_extension, 310); + message->AddExtension(unittest::repeated_float_extension , 311); + message->AddExtension(unittest::repeated_double_extension , 312); + message->AddExtension(unittest::repeated_bool_extension , false); + message->AddExtension(unittest::repeated_string_extension , "315"); + message->AddExtension(unittest::repeated_bytes_extension , "316"); + + message->AddExtension(unittest::repeatedgroup_extension )->set_a(317); + message->AddExtension(unittest::repeated_nested_message_extension )->set_bb(318); + message->AddExtension(unittest::repeated_foreign_message_extension)->set_c(319); + message->AddExtension(unittest::repeated_import_message_extension )->set_d(320); + + message->AddExtension(unittest::repeated_nested_enum_extension , unittest::TestAllTypes::BAZ); + message->AddExtension(unittest::repeated_foreign_enum_extension, unittest::FOREIGN_BAZ ); + message->AddExtension(unittest::repeated_import_enum_extension , unittest_import::IMPORT_BAZ); + + message->AddExtension(unittest::repeated_string_piece_extension, "324"); + message->AddExtension(unittest::repeated_cord_extension, "325"); + + // ----------------------------------------------------------------- + + message->SetExtension(unittest::default_int32_extension , 401); + message->SetExtension(unittest::default_int64_extension , 402); + message->SetExtension(unittest::default_uint32_extension , 403); + message->SetExtension(unittest::default_uint64_extension , 404); + message->SetExtension(unittest::default_sint32_extension , 405); + message->SetExtension(unittest::default_sint64_extension , 406); + message->SetExtension(unittest::default_fixed32_extension , 407); + message->SetExtension(unittest::default_fixed64_extension , 408); + message->SetExtension(unittest::default_sfixed32_extension, 409); + message->SetExtension(unittest::default_sfixed64_extension, 410); + message->SetExtension(unittest::default_float_extension , 411); + message->SetExtension(unittest::default_double_extension , 412); + message->SetExtension(unittest::default_bool_extension , false); + message->SetExtension(unittest::default_string_extension , "415"); + message->SetExtension(unittest::default_bytes_extension , "416"); + + message->SetExtension(unittest::default_nested_enum_extension , unittest::TestAllTypes::FOO); + message->SetExtension(unittest::default_foreign_enum_extension, unittest::FOREIGN_FOO ); + message->SetExtension(unittest::default_import_enum_extension , unittest_import::IMPORT_FOO); + + message->SetExtension(unittest::default_string_piece_extension, "424"); + message->SetExtension(unittest::default_cord_extension, "425"); +} + +// ------------------------------------------------------------------- + +void TestUtil::SetAllFieldsAndExtensions( + unittest::TestFieldOrderings* message) { + GOOGLE_CHECK(message); + message->set_my_int(1); + message->set_my_string("foo"); + message->set_my_float(1.0); + message->SetExtension(unittest::my_extension_int, 23); + message->SetExtension(unittest::my_extension_string, "bar"); +} + +// ------------------------------------------------------------------- + +void TestUtil::ModifyRepeatedExtensions(unittest::TestAllExtensions* message) { + message->SetExtension(unittest::repeated_int32_extension , 1, 501); + message->SetExtension(unittest::repeated_int64_extension , 1, 502); + message->SetExtension(unittest::repeated_uint32_extension , 1, 503); + message->SetExtension(unittest::repeated_uint64_extension , 1, 504); + message->SetExtension(unittest::repeated_sint32_extension , 1, 505); + message->SetExtension(unittest::repeated_sint64_extension , 1, 506); + message->SetExtension(unittest::repeated_fixed32_extension , 1, 507); + message->SetExtension(unittest::repeated_fixed64_extension , 1, 508); + message->SetExtension(unittest::repeated_sfixed32_extension, 1, 509); + message->SetExtension(unittest::repeated_sfixed64_extension, 1, 510); + message->SetExtension(unittest::repeated_float_extension , 1, 511); + message->SetExtension(unittest::repeated_double_extension , 1, 512); + message->SetExtension(unittest::repeated_bool_extension , 1, true); + message->SetExtension(unittest::repeated_string_extension , 1, "515"); + message->SetExtension(unittest::repeated_bytes_extension , 1, "516"); + + message->MutableExtension(unittest::repeatedgroup_extension , 1)->set_a(517); + message->MutableExtension(unittest::repeated_nested_message_extension , 1)->set_bb(518); + message->MutableExtension(unittest::repeated_foreign_message_extension, 1)->set_c(519); + message->MutableExtension(unittest::repeated_import_message_extension , 1)->set_d(520); + + message->SetExtension(unittest::repeated_nested_enum_extension , 1, unittest::TestAllTypes::FOO); + message->SetExtension(unittest::repeated_foreign_enum_extension, 1, unittest::FOREIGN_FOO ); + message->SetExtension(unittest::repeated_import_enum_extension , 1, unittest_import::IMPORT_FOO); + + message->SetExtension(unittest::repeated_string_piece_extension, 1, "524"); + message->SetExtension(unittest::repeated_cord_extension, 1, "525"); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectAllExtensionsSet( + const unittest::TestAllExtensions& message) { + EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension)); + EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension)); + EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension )); + + EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension)); + EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension )); + + EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension ).has_a()); + EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension ).has_bb()); + EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension).has_c()); + EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension ).has_d()); + + EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension )); + EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension)); + EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension )); + + EXPECT_TRUE(message.HasExtension(unittest::optional_string_piece_extension)); + EXPECT_TRUE(message.HasExtension(unittest::optional_cord_extension)); + + EXPECT_EQ(101 , message.GetExtension(unittest::optional_int32_extension )); + EXPECT_EQ(102 , message.GetExtension(unittest::optional_int64_extension )); + EXPECT_EQ(103 , message.GetExtension(unittest::optional_uint32_extension )); + EXPECT_EQ(104 , message.GetExtension(unittest::optional_uint64_extension )); + EXPECT_EQ(105 , message.GetExtension(unittest::optional_sint32_extension )); + EXPECT_EQ(106 , message.GetExtension(unittest::optional_sint64_extension )); + EXPECT_EQ(107 , message.GetExtension(unittest::optional_fixed32_extension )); + EXPECT_EQ(108 , message.GetExtension(unittest::optional_fixed64_extension )); + EXPECT_EQ(109 , message.GetExtension(unittest::optional_sfixed32_extension)); + EXPECT_EQ(110 , message.GetExtension(unittest::optional_sfixed64_extension)); + EXPECT_EQ(111 , message.GetExtension(unittest::optional_float_extension )); + EXPECT_EQ(112 , message.GetExtension(unittest::optional_double_extension )); + EXPECT_EQ(true , message.GetExtension(unittest::optional_bool_extension )); + EXPECT_EQ("115", message.GetExtension(unittest::optional_string_extension )); + EXPECT_EQ("116", message.GetExtension(unittest::optional_bytes_extension )); + + EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension ).a()); + EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension ).bb()); + EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension).c()); + EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension ).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::optional_nested_enum_extension )); + EXPECT_EQ(unittest::FOREIGN_BAZ , message.GetExtension(unittest::optional_foreign_enum_extension)); + EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::optional_import_enum_extension )); + + EXPECT_EQ("124", message.GetExtension(unittest::optional_string_piece_extension)); + EXPECT_EQ("125", message.GetExtension(unittest::optional_cord_extension)); + + // ----------------------------------------------------------------- + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension)); + + EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 0)); + EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 0)); + EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 0)); + EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 0)); + EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 0)); + EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 0)); + EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); + EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); + EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); + EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); + EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0)); + EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 0)); + EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0)); + EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0)); + + EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); + EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); + EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); + EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0)); + + EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0)); + EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0)); + + EXPECT_EQ(301 , message.GetExtension(unittest::repeated_int32_extension , 1)); + EXPECT_EQ(302 , message.GetExtension(unittest::repeated_int64_extension , 1)); + EXPECT_EQ(303 , message.GetExtension(unittest::repeated_uint32_extension , 1)); + EXPECT_EQ(304 , message.GetExtension(unittest::repeated_uint64_extension , 1)); + EXPECT_EQ(305 , message.GetExtension(unittest::repeated_sint32_extension , 1)); + EXPECT_EQ(306 , message.GetExtension(unittest::repeated_sint64_extension , 1)); + EXPECT_EQ(307 , message.GetExtension(unittest::repeated_fixed32_extension , 1)); + EXPECT_EQ(308 , message.GetExtension(unittest::repeated_fixed64_extension , 1)); + EXPECT_EQ(309 , message.GetExtension(unittest::repeated_sfixed32_extension, 1)); + EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension, 1)); + EXPECT_EQ(311 , message.GetExtension(unittest::repeated_float_extension , 1)); + EXPECT_EQ(312 , message.GetExtension(unittest::repeated_double_extension , 1)); + EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension , 1)); + EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension , 1)); + EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension , 1)); + + EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension , 1).a()); + EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb()); + EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c()); + EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 1).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 1)); + EXPECT_EQ(unittest::FOREIGN_BAZ , message.GetExtension(unittest::repeated_foreign_enum_extension, 1)); + EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 1)); + + EXPECT_EQ("324", message.GetExtension(unittest::repeated_string_piece_extension, 1)); + EXPECT_EQ("325", message.GetExtension(unittest::repeated_cord_extension, 1)); + + // ----------------------------------------------------------------- + + EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension)); + EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension)); + EXPECT_TRUE(message.HasExtension(unittest::default_float_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_double_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_string_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension )); + + EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension )); + EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension)); + EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension )); + + EXPECT_TRUE(message.HasExtension(unittest::default_string_piece_extension)); + EXPECT_TRUE(message.HasExtension(unittest::default_cord_extension)); + + EXPECT_EQ(401 , message.GetExtension(unittest::default_int32_extension )); + EXPECT_EQ(402 , message.GetExtension(unittest::default_int64_extension )); + EXPECT_EQ(403 , message.GetExtension(unittest::default_uint32_extension )); + EXPECT_EQ(404 , message.GetExtension(unittest::default_uint64_extension )); + EXPECT_EQ(405 , message.GetExtension(unittest::default_sint32_extension )); + EXPECT_EQ(406 , message.GetExtension(unittest::default_sint64_extension )); + EXPECT_EQ(407 , message.GetExtension(unittest::default_fixed32_extension )); + EXPECT_EQ(408 , message.GetExtension(unittest::default_fixed64_extension )); + EXPECT_EQ(409 , message.GetExtension(unittest::default_sfixed32_extension)); + EXPECT_EQ(410 , message.GetExtension(unittest::default_sfixed64_extension)); + EXPECT_EQ(411 , message.GetExtension(unittest::default_float_extension )); + EXPECT_EQ(412 , message.GetExtension(unittest::default_double_extension )); + EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension )); + EXPECT_EQ("415", message.GetExtension(unittest::default_string_extension )); + EXPECT_EQ("416", message.GetExtension(unittest::default_bytes_extension )); + + EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::default_nested_enum_extension )); + EXPECT_EQ(unittest::FOREIGN_FOO , message.GetExtension(unittest::default_foreign_enum_extension)); + EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::default_import_enum_extension )); + + EXPECT_EQ("424", message.GetExtension(unittest::default_string_piece_extension)); + EXPECT_EQ("425", message.GetExtension(unittest::default_cord_extension)); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectExtensionsClear( + const unittest::TestAllExtensions& message) { + string serialized; + ASSERT_TRUE(message.SerializeToString(&serialized)); + EXPECT_EQ("", serialized); + EXPECT_EQ(0, message.ByteSize()); + + // has_blah() should initially be false for all optional fields. + EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension)); + EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension)); + EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension )); + + EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension)); + EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension )); + + EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension )); + EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension)); + EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension )); + + EXPECT_FALSE(message.HasExtension(unittest::optional_string_piece_extension)); + EXPECT_FALSE(message.HasExtension(unittest::optional_cord_extension)); + + // Optional fields without defaults are set to zero or something like it. + EXPECT_EQ(0 , message.GetExtension(unittest::optional_int32_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_int64_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint32_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint64_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint32_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint64_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed32_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed64_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed32_extension)); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed64_extension)); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_float_extension )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_double_extension )); + EXPECT_EQ(false, message.GetExtension(unittest::optional_bool_extension )); + EXPECT_EQ("" , message.GetExtension(unittest::optional_string_extension )); + EXPECT_EQ("" , message.GetExtension(unittest::optional_bytes_extension )); + + // Embedded messages should also be clear. + EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension ).has_a()); + EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension ).has_bb()); + EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension).has_c()); + EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension ).has_d()); + + EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension ).a()); + EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension ).bb()); + EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension).c()); + EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension ).d()); + + // Enums without defaults are set to the first value in the enum. + EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::optional_nested_enum_extension )); + EXPECT_EQ(unittest::FOREIGN_FOO , message.GetExtension(unittest::optional_foreign_enum_extension)); + EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::optional_import_enum_extension )); + + EXPECT_EQ("", message.GetExtension(unittest::optional_string_piece_extension)); + EXPECT_EQ("", message.GetExtension(unittest::optional_cord_extension)); + + // Repeated fields are empty. + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension)); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension)); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension )); + + EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension)); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension )); + + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_piece_extension)); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_cord_extension)); + + // has_blah() should also be false for all default fields. + EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension)); + EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension)); + EXPECT_FALSE(message.HasExtension(unittest::default_float_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_double_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_string_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension )); + + EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension )); + EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension)); + EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension )); + + EXPECT_FALSE(message.HasExtension(unittest::default_string_piece_extension)); + EXPECT_FALSE(message.HasExtension(unittest::default_cord_extension)); + + // Fields with defaults have their default values (duh). + EXPECT_EQ( 41 , message.GetExtension(unittest::default_int32_extension )); + EXPECT_EQ( 42 , message.GetExtension(unittest::default_int64_extension )); + EXPECT_EQ( 43 , message.GetExtension(unittest::default_uint32_extension )); + EXPECT_EQ( 44 , message.GetExtension(unittest::default_uint64_extension )); + EXPECT_EQ(-45 , message.GetExtension(unittest::default_sint32_extension )); + EXPECT_EQ( 46 , message.GetExtension(unittest::default_sint64_extension )); + EXPECT_EQ( 47 , message.GetExtension(unittest::default_fixed32_extension )); + EXPECT_EQ( 48 , message.GetExtension(unittest::default_fixed64_extension )); + EXPECT_EQ( 49 , message.GetExtension(unittest::default_sfixed32_extension)); + EXPECT_EQ(-50 , message.GetExtension(unittest::default_sfixed64_extension)); + EXPECT_EQ( 51.5 , message.GetExtension(unittest::default_float_extension )); + EXPECT_EQ( 52e3 , message.GetExtension(unittest::default_double_extension )); + EXPECT_EQ(true , message.GetExtension(unittest::default_bool_extension )); + EXPECT_EQ("hello", message.GetExtension(unittest::default_string_extension )); + EXPECT_EQ("world", message.GetExtension(unittest::default_bytes_extension )); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::default_nested_enum_extension )); + EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::default_foreign_enum_extension)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::default_import_enum_extension )); + + EXPECT_EQ("abc", message.GetExtension(unittest::default_string_piece_extension)); + EXPECT_EQ("123", message.GetExtension(unittest::default_cord_extension)); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectRepeatedExtensionsModified( + const unittest::TestAllExtensions& message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension)); + + EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 0)); + EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 0)); + EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 0)); + EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 0)); + EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 0)); + EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 0)); + EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); + EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); + EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); + EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); + EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0)); + EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 0)); + EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0)); + EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0)); + + EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); + EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); + EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); + EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0)); + + EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0)); + EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0)); + + // Actually verify the second (modified) elements now. + EXPECT_EQ(501 , message.GetExtension(unittest::repeated_int32_extension , 1)); + EXPECT_EQ(502 , message.GetExtension(unittest::repeated_int64_extension , 1)); + EXPECT_EQ(503 , message.GetExtension(unittest::repeated_uint32_extension , 1)); + EXPECT_EQ(504 , message.GetExtension(unittest::repeated_uint64_extension , 1)); + EXPECT_EQ(505 , message.GetExtension(unittest::repeated_sint32_extension , 1)); + EXPECT_EQ(506 , message.GetExtension(unittest::repeated_sint64_extension , 1)); + EXPECT_EQ(507 , message.GetExtension(unittest::repeated_fixed32_extension , 1)); + EXPECT_EQ(508 , message.GetExtension(unittest::repeated_fixed64_extension , 1)); + EXPECT_EQ(509 , message.GetExtension(unittest::repeated_sfixed32_extension, 1)); + EXPECT_EQ(510 , message.GetExtension(unittest::repeated_sfixed64_extension, 1)); + EXPECT_EQ(511 , message.GetExtension(unittest::repeated_float_extension , 1)); + EXPECT_EQ(512 , message.GetExtension(unittest::repeated_double_extension , 1)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 1)); + EXPECT_EQ("515", message.GetExtension(unittest::repeated_string_extension , 1)); + EXPECT_EQ("516", message.GetExtension(unittest::repeated_bytes_extension , 1)); + + EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension , 1).a()); + EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb()); + EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c()); + EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension , 1).d()); + + EXPECT_EQ(unittest::TestAllTypes::FOO, message.GetExtension(unittest::repeated_nested_enum_extension , 1)); + EXPECT_EQ(unittest::FOREIGN_FOO , message.GetExtension(unittest::repeated_foreign_enum_extension, 1)); + EXPECT_EQ(unittest_import::IMPORT_FOO, message.GetExtension(unittest::repeated_import_enum_extension , 1)); + + EXPECT_EQ("524", message.GetExtension(unittest::repeated_string_piece_extension, 1)); + EXPECT_EQ("525", message.GetExtension(unittest::repeated_cord_extension, 1)); +} + +// ------------------------------------------------------------------- + +void TestUtil::SetPackedExtensions(unittest::TestPackedExtensions* message) { + message->AddExtension(unittest::packed_int32_extension , 601); + message->AddExtension(unittest::packed_int64_extension , 602); + message->AddExtension(unittest::packed_uint32_extension , 603); + message->AddExtension(unittest::packed_uint64_extension , 604); + message->AddExtension(unittest::packed_sint32_extension , 605); + message->AddExtension(unittest::packed_sint64_extension , 606); + message->AddExtension(unittest::packed_fixed32_extension , 607); + message->AddExtension(unittest::packed_fixed64_extension , 608); + message->AddExtension(unittest::packed_sfixed32_extension, 609); + message->AddExtension(unittest::packed_sfixed64_extension, 610); + message->AddExtension(unittest::packed_float_extension , 611); + message->AddExtension(unittest::packed_double_extension , 612); + message->AddExtension(unittest::packed_bool_extension , true); + message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAR); + // add a second one of each field + message->AddExtension(unittest::packed_int32_extension , 701); + message->AddExtension(unittest::packed_int64_extension , 702); + message->AddExtension(unittest::packed_uint32_extension , 703); + message->AddExtension(unittest::packed_uint64_extension , 704); + message->AddExtension(unittest::packed_sint32_extension , 705); + message->AddExtension(unittest::packed_sint64_extension , 706); + message->AddExtension(unittest::packed_fixed32_extension , 707); + message->AddExtension(unittest::packed_fixed64_extension , 708); + message->AddExtension(unittest::packed_sfixed32_extension, 709); + message->AddExtension(unittest::packed_sfixed64_extension, 710); + message->AddExtension(unittest::packed_float_extension , 711); + message->AddExtension(unittest::packed_double_extension , 712); + message->AddExtension(unittest::packed_bool_extension , false); + message->AddExtension(unittest::packed_enum_extension, unittest::FOREIGN_BAZ); +} + +// ------------------------------------------------------------------- + +void TestUtil::ModifyPackedExtensions(unittest::TestPackedExtensions* message) { + message->SetExtension(unittest::packed_int32_extension , 1, 801); + message->SetExtension(unittest::packed_int64_extension , 1, 802); + message->SetExtension(unittest::packed_uint32_extension , 1, 803); + message->SetExtension(unittest::packed_uint64_extension , 1, 804); + message->SetExtension(unittest::packed_sint32_extension , 1, 805); + message->SetExtension(unittest::packed_sint64_extension , 1, 806); + message->SetExtension(unittest::packed_fixed32_extension , 1, 807); + message->SetExtension(unittest::packed_fixed64_extension , 1, 808); + message->SetExtension(unittest::packed_sfixed32_extension, 1, 809); + message->SetExtension(unittest::packed_sfixed64_extension, 1, 810); + message->SetExtension(unittest::packed_float_extension , 1, 811); + message->SetExtension(unittest::packed_double_extension , 1, 812); + message->SetExtension(unittest::packed_bool_extension , 1, true); + message->SetExtension(unittest::packed_enum_extension , 1, + unittest::FOREIGN_FOO); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectPackedExtensionsSet( + const unittest::TestPackedExtensions& message) { + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension )); + + EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension , 0)); + EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension , 0)); + EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension , 0)); + EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension , 0)); + EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension , 0)); + EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension , 0)); + EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension , 0)); + EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension , 0)); + EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension, 0)); + EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension, 0)); + EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension , 0)); + EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension , 0)); + EXPECT_EQ(unittest::FOREIGN_BAR, + message.GetExtension(unittest::packed_enum_extension, 0)); + EXPECT_EQ(701 , message.GetExtension(unittest::packed_int32_extension , 1)); + EXPECT_EQ(702 , message.GetExtension(unittest::packed_int64_extension , 1)); + EXPECT_EQ(703 , message.GetExtension(unittest::packed_uint32_extension , 1)); + EXPECT_EQ(704 , message.GetExtension(unittest::packed_uint64_extension , 1)); + EXPECT_EQ(705 , message.GetExtension(unittest::packed_sint32_extension , 1)); + EXPECT_EQ(706 , message.GetExtension(unittest::packed_sint64_extension , 1)); + EXPECT_EQ(707 , message.GetExtension(unittest::packed_fixed32_extension , 1)); + EXPECT_EQ(708 , message.GetExtension(unittest::packed_fixed64_extension , 1)); + EXPECT_EQ(709 , message.GetExtension(unittest::packed_sfixed32_extension, 1)); + EXPECT_EQ(710 , message.GetExtension(unittest::packed_sfixed64_extension, 1)); + EXPECT_EQ(711 , message.GetExtension(unittest::packed_float_extension , 1)); + EXPECT_EQ(712 , message.GetExtension(unittest::packed_double_extension , 1)); + EXPECT_EQ(false, message.GetExtension(unittest::packed_bool_extension , 1)); + EXPECT_EQ(unittest::FOREIGN_BAZ, + message.GetExtension(unittest::packed_enum_extension, 1)); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectPackedExtensionsClear( + const unittest::TestPackedExtensions& message) { + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension)); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension)); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension )); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectPackedExtensionsModified( + const unittest::TestPackedExtensions& message) { + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension )); + EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension , 0)); + EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension , 0)); + EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension , 0)); + EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension , 0)); + EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension , 0)); + EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension , 0)); + EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension , 0)); + EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension , 0)); + EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension, 0)); + EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension, 0)); + EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension , 0)); + EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension , 0)); + EXPECT_EQ(unittest::FOREIGN_BAR, + message.GetExtension(unittest::packed_enum_extension, 0)); + + // Actually verify the second (modified) elements now. + EXPECT_EQ(801 , message.GetExtension(unittest::packed_int32_extension , 1)); + EXPECT_EQ(802 , message.GetExtension(unittest::packed_int64_extension , 1)); + EXPECT_EQ(803 , message.GetExtension(unittest::packed_uint32_extension , 1)); + EXPECT_EQ(804 , message.GetExtension(unittest::packed_uint64_extension , 1)); + EXPECT_EQ(805 , message.GetExtension(unittest::packed_sint32_extension , 1)); + EXPECT_EQ(806 , message.GetExtension(unittest::packed_sint64_extension , 1)); + EXPECT_EQ(807 , message.GetExtension(unittest::packed_fixed32_extension , 1)); + EXPECT_EQ(808 , message.GetExtension(unittest::packed_fixed64_extension , 1)); + EXPECT_EQ(809 , message.GetExtension(unittest::packed_sfixed32_extension, 1)); + EXPECT_EQ(810 , message.GetExtension(unittest::packed_sfixed64_extension, 1)); + EXPECT_EQ(811 , message.GetExtension(unittest::packed_float_extension , 1)); + EXPECT_EQ(812 , message.GetExtension(unittest::packed_double_extension , 1)); + EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension , 1)); + EXPECT_EQ(unittest::FOREIGN_FOO, + message.GetExtension(unittest::packed_enum_extension, 1)); +} + +// ------------------------------------------------------------------- + +void TestUtil::ExpectAllFieldsAndExtensionsInOrder(const string& serialized) { + // We set each field individually, serialize separately, and concatenate all + // the strings in canonical order to determine the expected serialization. + string expected; + unittest::TestFieldOrderings message; + message.set_my_int(1); // Field 1. + message.AppendToString(&expected); + message.Clear(); + message.SetExtension(unittest::my_extension_int, 23); // Field 5. + message.AppendToString(&expected); + message.Clear(); + message.set_my_string("foo"); // Field 11. + message.AppendToString(&expected); + message.Clear(); + message.SetExtension(unittest::my_extension_string, "bar"); // Field 50. + message.AppendToString(&expected); + message.Clear(); + message.set_my_float(1.0); // Field 101. + message.AppendToString(&expected); + message.Clear(); + + // We don't EXPECT_EQ() since we don't want to print raw bytes to stdout. + EXPECT_TRUE(serialized == expected); +} + +void TestUtil::ExpectLastRepeatedsRemoved( + const unittest::TestAllTypes& message) { + ASSERT_EQ(1, message.repeated_int32_size ()); + ASSERT_EQ(1, message.repeated_int64_size ()); + ASSERT_EQ(1, message.repeated_uint32_size ()); + ASSERT_EQ(1, message.repeated_uint64_size ()); + ASSERT_EQ(1, message.repeated_sint32_size ()); + ASSERT_EQ(1, message.repeated_sint64_size ()); + ASSERT_EQ(1, message.repeated_fixed32_size ()); + ASSERT_EQ(1, message.repeated_fixed64_size ()); + ASSERT_EQ(1, message.repeated_sfixed32_size()); + ASSERT_EQ(1, message.repeated_sfixed64_size()); + ASSERT_EQ(1, message.repeated_float_size ()); + ASSERT_EQ(1, message.repeated_double_size ()); + ASSERT_EQ(1, message.repeated_bool_size ()); + ASSERT_EQ(1, message.repeated_string_size ()); + ASSERT_EQ(1, message.repeated_bytes_size ()); + + ASSERT_EQ(1, message.repeatedgroup_size ()); + ASSERT_EQ(1, message.repeated_nested_message_size ()); + ASSERT_EQ(1, message.repeated_foreign_message_size()); + ASSERT_EQ(1, message.repeated_import_message_size ()); + ASSERT_EQ(1, message.repeated_nested_enum_size ()); + ASSERT_EQ(1, message.repeated_foreign_enum_size ()); + ASSERT_EQ(1, message.repeated_import_enum_size ()); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + ASSERT_EQ(1, message.repeated_string_piece_size()); + ASSERT_EQ(1, message.repeated_cord_size()); +#endif + + // Test that the remaining element is the correct one. + EXPECT_EQ(201 , message.repeated_int32 (0)); + EXPECT_EQ(202 , message.repeated_int64 (0)); + EXPECT_EQ(203 , message.repeated_uint32 (0)); + EXPECT_EQ(204 , message.repeated_uint64 (0)); + EXPECT_EQ(205 , message.repeated_sint32 (0)); + EXPECT_EQ(206 , message.repeated_sint64 (0)); + EXPECT_EQ(207 , message.repeated_fixed32 (0)); + EXPECT_EQ(208 , message.repeated_fixed64 (0)); + EXPECT_EQ(209 , message.repeated_sfixed32(0)); + EXPECT_EQ(210 , message.repeated_sfixed64(0)); + EXPECT_EQ(211 , message.repeated_float (0)); + EXPECT_EQ(212 , message.repeated_double (0)); + EXPECT_EQ(true , message.repeated_bool (0)); + EXPECT_EQ("215", message.repeated_string (0)); + EXPECT_EQ("216", message.repeated_bytes (0)); + + EXPECT_EQ(217, message.repeatedgroup (0).a()); + EXPECT_EQ(218, message.repeated_nested_message (0).bb()); + EXPECT_EQ(219, message.repeated_foreign_message(0).c()); + EXPECT_EQ(220, message.repeated_import_message (0).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (0)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(0)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (0)); +} + +void TestUtil::ExpectLastRepeatedExtensionsRemoved( + const unittest::TestAllExtensions& message) { + + // Test that one element was removed. + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int32_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_int64_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint32_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_uint64_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint32_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sint64_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed32_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_fixed64_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed32_extension)); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_sfixed64_extension)); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_float_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_double_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bool_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_bytes_extension )); + + ASSERT_EQ(1, message.ExtensionSize(unittest::repeatedgroup_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_message_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_message_extension)); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_message_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_nested_enum_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_import_enum_extension )); + + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_string_piece_extension)); + ASSERT_EQ(1, message.ExtensionSize(unittest::repeated_cord_extension)); + + // Test that the remaining element is the correct one. + EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 0)); + EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 0)); + EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 0)); + EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 0)); + EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 0)); + EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 0)); + EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); + EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); + EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); + EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); + EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 0)); + EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 0)); + EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 0)); + EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 0)); + + EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); + EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); + EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); + EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 0)); + + EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 0)); + EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 0)); +} + +void TestUtil::ExpectRepeatedsSwapped( + const unittest::TestAllTypes& message) { + ASSERT_EQ(2, message.repeated_int32_size ()); + ASSERT_EQ(2, message.repeated_int64_size ()); + ASSERT_EQ(2, message.repeated_uint32_size ()); + ASSERT_EQ(2, message.repeated_uint64_size ()); + ASSERT_EQ(2, message.repeated_sint32_size ()); + ASSERT_EQ(2, message.repeated_sint64_size ()); + ASSERT_EQ(2, message.repeated_fixed32_size ()); + ASSERT_EQ(2, message.repeated_fixed64_size ()); + ASSERT_EQ(2, message.repeated_sfixed32_size()); + ASSERT_EQ(2, message.repeated_sfixed64_size()); + ASSERT_EQ(2, message.repeated_float_size ()); + ASSERT_EQ(2, message.repeated_double_size ()); + ASSERT_EQ(2, message.repeated_bool_size ()); + ASSERT_EQ(2, message.repeated_string_size ()); + ASSERT_EQ(2, message.repeated_bytes_size ()); + + ASSERT_EQ(2, message.repeatedgroup_size ()); + ASSERT_EQ(2, message.repeated_nested_message_size ()); + ASSERT_EQ(2, message.repeated_foreign_message_size()); + ASSERT_EQ(2, message.repeated_import_message_size ()); + ASSERT_EQ(2, message.repeated_nested_enum_size ()); + ASSERT_EQ(2, message.repeated_foreign_enum_size ()); + ASSERT_EQ(2, message.repeated_import_enum_size ()); + +#ifndef PROTOBUF_TEST_NO_DESCRIPTORS + ASSERT_EQ(2, message.repeated_string_piece_size()); + ASSERT_EQ(2, message.repeated_cord_size()); +#endif + + // Test that the first element and second element are flipped. + EXPECT_EQ(201 , message.repeated_int32 (1)); + EXPECT_EQ(202 , message.repeated_int64 (1)); + EXPECT_EQ(203 , message.repeated_uint32 (1)); + EXPECT_EQ(204 , message.repeated_uint64 (1)); + EXPECT_EQ(205 , message.repeated_sint32 (1)); + EXPECT_EQ(206 , message.repeated_sint64 (1)); + EXPECT_EQ(207 , message.repeated_fixed32 (1)); + EXPECT_EQ(208 , message.repeated_fixed64 (1)); + EXPECT_EQ(209 , message.repeated_sfixed32(1)); + EXPECT_EQ(210 , message.repeated_sfixed64(1)); + EXPECT_EQ(211 , message.repeated_float (1)); + EXPECT_EQ(212 , message.repeated_double (1)); + EXPECT_EQ(true , message.repeated_bool (1)); + EXPECT_EQ("215", message.repeated_string (1)); + EXPECT_EQ("216", message.repeated_bytes (1)); + + EXPECT_EQ(217, message.repeatedgroup (1).a()); + EXPECT_EQ(218, message.repeated_nested_message (1).bb()); + EXPECT_EQ(219, message.repeated_foreign_message(1).c()); + EXPECT_EQ(220, message.repeated_import_message (1).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.repeated_nested_enum (1)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.repeated_foreign_enum(1)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.repeated_import_enum (1)); + + EXPECT_EQ(301 , message.repeated_int32 (0)); + EXPECT_EQ(302 , message.repeated_int64 (0)); + EXPECT_EQ(303 , message.repeated_uint32 (0)); + EXPECT_EQ(304 , message.repeated_uint64 (0)); + EXPECT_EQ(305 , message.repeated_sint32 (0)); + EXPECT_EQ(306 , message.repeated_sint64 (0)); + EXPECT_EQ(307 , message.repeated_fixed32 (0)); + EXPECT_EQ(308 , message.repeated_fixed64 (0)); + EXPECT_EQ(309 , message.repeated_sfixed32(0)); + EXPECT_EQ(310 , message.repeated_sfixed64(0)); + EXPECT_EQ(311 , message.repeated_float (0)); + EXPECT_EQ(312 , message.repeated_double (0)); + EXPECT_EQ(false, message.repeated_bool (0)); + EXPECT_EQ("315", message.repeated_string (0)); + EXPECT_EQ("316", message.repeated_bytes (0)); + + EXPECT_EQ(317, message.repeatedgroup (0).a()); + EXPECT_EQ(318, message.repeated_nested_message (0).bb()); + EXPECT_EQ(319, message.repeated_foreign_message(0).c()); + EXPECT_EQ(320, message.repeated_import_message (0).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAZ, message.repeated_nested_enum (0)); + EXPECT_EQ(unittest::FOREIGN_BAZ , message.repeated_foreign_enum(0)); + EXPECT_EQ(unittest_import::IMPORT_BAZ, message.repeated_import_enum (0)); +} + +void TestUtil::ExpectRepeatedExtensionsSwapped( + const unittest::TestAllExtensions& message) { + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_piece_extension)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_cord_extension)); + + EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension , 1)); + EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension , 1)); + EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension , 1)); + EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension , 1)); + EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension , 1)); + EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension , 1)); + EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension , 1)); + EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension , 1)); + EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension, 1)); + EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension, 1)); + EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension , 1)); + EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension , 1)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension , 1)); + EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension , 1)); + EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension , 1)); + + EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension , 1).a()); + EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension , 1).bb()); + EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension, 1).c()); + EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension , 1).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAR, message.GetExtension(unittest::repeated_nested_enum_extension , 1)); + EXPECT_EQ(unittest::FOREIGN_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension, 1)); + EXPECT_EQ(unittest_import::IMPORT_BAR, message.GetExtension(unittest::repeated_import_enum_extension , 1)); + + EXPECT_EQ("224", message.GetExtension(unittest::repeated_string_piece_extension, 1)); + EXPECT_EQ("225", message.GetExtension(unittest::repeated_cord_extension, 1)); + + EXPECT_EQ(301 , message.GetExtension(unittest::repeated_int32_extension , 0)); + EXPECT_EQ(302 , message.GetExtension(unittest::repeated_int64_extension , 0)); + EXPECT_EQ(303 , message.GetExtension(unittest::repeated_uint32_extension , 0)); + EXPECT_EQ(304 , message.GetExtension(unittest::repeated_uint64_extension , 0)); + EXPECT_EQ(305 , message.GetExtension(unittest::repeated_sint32_extension , 0)); + EXPECT_EQ(306 , message.GetExtension(unittest::repeated_sint64_extension , 0)); + EXPECT_EQ(307 , message.GetExtension(unittest::repeated_fixed32_extension , 0)); + EXPECT_EQ(308 , message.GetExtension(unittest::repeated_fixed64_extension , 0)); + EXPECT_EQ(309 , message.GetExtension(unittest::repeated_sfixed32_extension, 0)); + EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension, 0)); + EXPECT_EQ(311 , message.GetExtension(unittest::repeated_float_extension , 0)); + EXPECT_EQ(312 , message.GetExtension(unittest::repeated_double_extension , 0)); + EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension , 0)); + EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension , 0)); + EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension , 0)); + + EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension , 0).a()); + EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension , 0).bb()); + EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension, 0).c()); + EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension , 0).d()); + + EXPECT_EQ(unittest::TestAllTypes::BAZ, message.GetExtension(unittest::repeated_nested_enum_extension , 0)); + EXPECT_EQ(unittest::FOREIGN_BAZ , message.GetExtension(unittest::repeated_foreign_enum_extension, 0)); + EXPECT_EQ(unittest_import::IMPORT_BAZ, message.GetExtension(unittest::repeated_import_enum_extension , 0)); + + EXPECT_EQ("324", message.GetExtension(unittest::repeated_string_piece_extension, 0)); + EXPECT_EQ("325", message.GetExtension(unittest::repeated_cord_extension, 0)); +} + +// =================================================================== + +TestUtil::ReflectionTester::ReflectionTester( + const Descriptor* base_descriptor) + : base_descriptor_(base_descriptor) { + + const DescriptorPool* pool = base_descriptor->file()->pool(); + + nested_b_ = + pool->FindFieldByName("protobuf_unittest.TestAllTypes.NestedMessage.bb"); + foreign_c_ = + pool->FindFieldByName("protobuf_unittest.ForeignMessage.c"); + import_d_ = + pool->FindFieldByName("protobuf_unittest_import.ImportMessage.d"); + nested_foo_ = + pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.FOO"); + nested_bar_ = + pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.BAR"); + nested_baz_ = + pool->FindEnumValueByName("protobuf_unittest.TestAllTypes.BAZ"); + foreign_foo_ = + pool->FindEnumValueByName("protobuf_unittest.FOREIGN_FOO"); + foreign_bar_ = + pool->FindEnumValueByName("protobuf_unittest.FOREIGN_BAR"); + foreign_baz_ = + pool->FindEnumValueByName("protobuf_unittest.FOREIGN_BAZ"); + import_foo_ = + pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_FOO"); + import_bar_ = + pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_BAR"); + import_baz_ = + pool->FindEnumValueByName("protobuf_unittest_import.IMPORT_BAZ"); + + if (base_descriptor_->name() == "TestAllExtensions") { + group_a_ = + pool->FindFieldByName("protobuf_unittest.OptionalGroup_extension.a"); + repeated_group_a_ = + pool->FindFieldByName("protobuf_unittest.RepeatedGroup_extension.a"); + } else { + group_a_ = + pool->FindFieldByName("protobuf_unittest.TestAllTypes.OptionalGroup.a"); + repeated_group_a_ = + pool->FindFieldByName("protobuf_unittest.TestAllTypes.RepeatedGroup.a"); + } + + EXPECT_TRUE(group_a_ != NULL); + EXPECT_TRUE(repeated_group_a_ != NULL); + EXPECT_TRUE(nested_b_ != NULL); + EXPECT_TRUE(foreign_c_ != NULL); + EXPECT_TRUE(import_d_ != NULL); + EXPECT_TRUE(nested_foo_ != NULL); + EXPECT_TRUE(nested_bar_ != NULL); + EXPECT_TRUE(nested_baz_ != NULL); + EXPECT_TRUE(foreign_foo_ != NULL); + EXPECT_TRUE(foreign_bar_ != NULL); + EXPECT_TRUE(foreign_baz_ != NULL); + EXPECT_TRUE(import_foo_ != NULL); + EXPECT_TRUE(import_bar_ != NULL); + EXPECT_TRUE(import_baz_ != NULL); +} + +// Shorthand to get a FieldDescriptor for a field of unittest::TestAllTypes. +const FieldDescriptor* TestUtil::ReflectionTester::F(const string& name) { + const FieldDescriptor* result = NULL; + if (base_descriptor_->name() == "TestAllExtensions" || + base_descriptor_->name() == "TestPackedExtensions") { + result = base_descriptor_->file()->FindExtensionByName(name + "_extension"); + } else { + result = base_descriptor_->FindFieldByName(name); + } + GOOGLE_CHECK(result != NULL); + return result; +} + +// ------------------------------------------------------------------- + +void TestUtil::ReflectionTester::SetAllFieldsViaReflection(Message* message) { + const Reflection* reflection = message->GetReflection(); + Message* sub_message; + + reflection->SetInt32 (message, F("optional_int32" ), 101); + reflection->SetInt64 (message, F("optional_int64" ), 102); + reflection->SetUInt32(message, F("optional_uint32" ), 103); + reflection->SetUInt64(message, F("optional_uint64" ), 104); + reflection->SetInt32 (message, F("optional_sint32" ), 105); + reflection->SetInt64 (message, F("optional_sint64" ), 106); + reflection->SetUInt32(message, F("optional_fixed32" ), 107); + reflection->SetUInt64(message, F("optional_fixed64" ), 108); + reflection->SetInt32 (message, F("optional_sfixed32"), 109); + reflection->SetInt64 (message, F("optional_sfixed64"), 110); + reflection->SetFloat (message, F("optional_float" ), 111); + reflection->SetDouble(message, F("optional_double" ), 112); + reflection->SetBool (message, F("optional_bool" ), true); + reflection->SetString(message, F("optional_string" ), "115"); + reflection->SetString(message, F("optional_bytes" ), "116"); + + sub_message = reflection->MutableMessage(message, F("optionalgroup")); + sub_message->GetReflection()->SetInt32(sub_message, group_a_, 117); + sub_message = reflection->MutableMessage(message, F("optional_nested_message")); + sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 118); + sub_message = reflection->MutableMessage(message, F("optional_foreign_message")); + sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 119); + sub_message = reflection->MutableMessage(message, F("optional_import_message")); + sub_message->GetReflection()->SetInt32(sub_message, import_d_, 120); + + reflection->SetEnum(message, F("optional_nested_enum" ), nested_baz_); + reflection->SetEnum(message, F("optional_foreign_enum"), foreign_baz_); + reflection->SetEnum(message, F("optional_import_enum" ), import_baz_); + + reflection->SetString(message, F("optional_string_piece"), "124"); + reflection->SetString(message, F("optional_cord"), "125"); + + // ----------------------------------------------------------------- + + reflection->AddInt32 (message, F("repeated_int32" ), 201); + reflection->AddInt64 (message, F("repeated_int64" ), 202); + reflection->AddUInt32(message, F("repeated_uint32" ), 203); + reflection->AddUInt64(message, F("repeated_uint64" ), 204); + reflection->AddInt32 (message, F("repeated_sint32" ), 205); + reflection->AddInt64 (message, F("repeated_sint64" ), 206); + reflection->AddUInt32(message, F("repeated_fixed32" ), 207); + reflection->AddUInt64(message, F("repeated_fixed64" ), 208); + reflection->AddInt32 (message, F("repeated_sfixed32"), 209); + reflection->AddInt64 (message, F("repeated_sfixed64"), 210); + reflection->AddFloat (message, F("repeated_float" ), 211); + reflection->AddDouble(message, F("repeated_double" ), 212); + reflection->AddBool (message, F("repeated_bool" ), true); + reflection->AddString(message, F("repeated_string" ), "215"); + reflection->AddString(message, F("repeated_bytes" ), "216"); + + sub_message = reflection->AddMessage(message, F("repeatedgroup")); + sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 217); + sub_message = reflection->AddMessage(message, F("repeated_nested_message")); + sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 218); + sub_message = reflection->AddMessage(message, F("repeated_foreign_message")); + sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 219); + sub_message = reflection->AddMessage(message, F("repeated_import_message")); + sub_message->GetReflection()->SetInt32(sub_message, import_d_, 220); + + reflection->AddEnum(message, F("repeated_nested_enum" ), nested_bar_); + reflection->AddEnum(message, F("repeated_foreign_enum"), foreign_bar_); + reflection->AddEnum(message, F("repeated_import_enum" ), import_bar_); + + reflection->AddString(message, F("repeated_string_piece"), "224"); + reflection->AddString(message, F("repeated_cord"), "225"); + + // Add a second one of each field. + reflection->AddInt32 (message, F("repeated_int32" ), 301); + reflection->AddInt64 (message, F("repeated_int64" ), 302); + reflection->AddUInt32(message, F("repeated_uint32" ), 303); + reflection->AddUInt64(message, F("repeated_uint64" ), 304); + reflection->AddInt32 (message, F("repeated_sint32" ), 305); + reflection->AddInt64 (message, F("repeated_sint64" ), 306); + reflection->AddUInt32(message, F("repeated_fixed32" ), 307); + reflection->AddUInt64(message, F("repeated_fixed64" ), 308); + reflection->AddInt32 (message, F("repeated_sfixed32"), 309); + reflection->AddInt64 (message, F("repeated_sfixed64"), 310); + reflection->AddFloat (message, F("repeated_float" ), 311); + reflection->AddDouble(message, F("repeated_double" ), 312); + reflection->AddBool (message, F("repeated_bool" ), false); + reflection->AddString(message, F("repeated_string" ), "315"); + reflection->AddString(message, F("repeated_bytes" ), "316"); + + sub_message = reflection->AddMessage(message, F("repeatedgroup")); + sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 317); + sub_message = reflection->AddMessage(message, F("repeated_nested_message")); + sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 318); + sub_message = reflection->AddMessage(message, F("repeated_foreign_message")); + sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 319); + sub_message = reflection->AddMessage(message, F("repeated_import_message")); + sub_message->GetReflection()->SetInt32(sub_message, import_d_, 320); + + reflection->AddEnum(message, F("repeated_nested_enum" ), nested_baz_); + reflection->AddEnum(message, F("repeated_foreign_enum"), foreign_baz_); + reflection->AddEnum(message, F("repeated_import_enum" ), import_baz_); + + reflection->AddString(message, F("repeated_string_piece"), "324"); + reflection->AddString(message, F("repeated_cord"), "325"); + + // ----------------------------------------------------------------- + + reflection->SetInt32 (message, F("default_int32" ), 401); + reflection->SetInt64 (message, F("default_int64" ), 402); + reflection->SetUInt32(message, F("default_uint32" ), 403); + reflection->SetUInt64(message, F("default_uint64" ), 404); + reflection->SetInt32 (message, F("default_sint32" ), 405); + reflection->SetInt64 (message, F("default_sint64" ), 406); + reflection->SetUInt32(message, F("default_fixed32" ), 407); + reflection->SetUInt64(message, F("default_fixed64" ), 408); + reflection->SetInt32 (message, F("default_sfixed32"), 409); + reflection->SetInt64 (message, F("default_sfixed64"), 410); + reflection->SetFloat (message, F("default_float" ), 411); + reflection->SetDouble(message, F("default_double" ), 412); + reflection->SetBool (message, F("default_bool" ), false); + reflection->SetString(message, F("default_string" ), "415"); + reflection->SetString(message, F("default_bytes" ), "416"); + + reflection->SetEnum(message, F("default_nested_enum" ), nested_foo_); + reflection->SetEnum(message, F("default_foreign_enum"), foreign_foo_); + reflection->SetEnum(message, F("default_import_enum" ), import_foo_); + + reflection->SetString(message, F("default_string_piece"), "424"); + reflection->SetString(message, F("default_cord"), "425"); +} + +void TestUtil::ReflectionTester::SetPackedFieldsViaReflection( + Message* message) { + const Reflection* reflection = message->GetReflection(); + reflection->AddInt32 (message, F("packed_int32" ), 601); + reflection->AddInt64 (message, F("packed_int64" ), 602); + reflection->AddUInt32(message, F("packed_uint32" ), 603); + reflection->AddUInt64(message, F("packed_uint64" ), 604); + reflection->AddInt32 (message, F("packed_sint32" ), 605); + reflection->AddInt64 (message, F("packed_sint64" ), 606); + reflection->AddUInt32(message, F("packed_fixed32" ), 607); + reflection->AddUInt64(message, F("packed_fixed64" ), 608); + reflection->AddInt32 (message, F("packed_sfixed32"), 609); + reflection->AddInt64 (message, F("packed_sfixed64"), 610); + reflection->AddFloat (message, F("packed_float" ), 611); + reflection->AddDouble(message, F("packed_double" ), 612); + reflection->AddBool (message, F("packed_bool" ), true); + reflection->AddEnum (message, F("packed_enum" ), foreign_bar_); + + reflection->AddInt32 (message, F("packed_int32" ), 701); + reflection->AddInt64 (message, F("packed_int64" ), 702); + reflection->AddUInt32(message, F("packed_uint32" ), 703); + reflection->AddUInt64(message, F("packed_uint64" ), 704); + reflection->AddInt32 (message, F("packed_sint32" ), 705); + reflection->AddInt64 (message, F("packed_sint64" ), 706); + reflection->AddUInt32(message, F("packed_fixed32" ), 707); + reflection->AddUInt64(message, F("packed_fixed64" ), 708); + reflection->AddInt32 (message, F("packed_sfixed32"), 709); + reflection->AddInt64 (message, F("packed_sfixed64"), 710); + reflection->AddFloat (message, F("packed_float" ), 711); + reflection->AddDouble(message, F("packed_double" ), 712); + reflection->AddBool (message, F("packed_bool" ), false); + reflection->AddEnum (message, F("packed_enum" ), foreign_baz_); +} + +// ------------------------------------------------------------------- + +void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection( + const Message& message) { + // We have to split this into three function otherwise it creates a stack + // frame so large that it triggers a warning. + ExpectAllFieldsSetViaReflection1(message); + ExpectAllFieldsSetViaReflection2(message); + ExpectAllFieldsSetViaReflection3(message); +} + +void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection1( + const Message& message) { + const Reflection* reflection = message.GetReflection(); + string scratch; + const Message* sub_message; + + EXPECT_TRUE(reflection->HasField(message, F("optional_int32" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_int64" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_uint32" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_uint64" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_sint32" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_sint64" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_fixed32" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_fixed64" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_sfixed32"))); + EXPECT_TRUE(reflection->HasField(message, F("optional_sfixed64"))); + EXPECT_TRUE(reflection->HasField(message, F("optional_float" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_double" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_bool" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_string" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_bytes" ))); + + EXPECT_TRUE(reflection->HasField(message, F("optionalgroup" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_nested_message" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_foreign_message"))); + EXPECT_TRUE(reflection->HasField(message, F("optional_import_message" ))); + + sub_message = &reflection->GetMessage(message, F("optionalgroup")); + EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, group_a_)); + sub_message = &reflection->GetMessage(message, F("optional_nested_message")); + EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, nested_b_)); + sub_message = &reflection->GetMessage(message, F("optional_foreign_message")); + EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_)); + sub_message = &reflection->GetMessage(message, F("optional_import_message")); + EXPECT_TRUE(sub_message->GetReflection()->HasField(*sub_message, import_d_)); + + EXPECT_TRUE(reflection->HasField(message, F("optional_nested_enum" ))); + EXPECT_TRUE(reflection->HasField(message, F("optional_foreign_enum"))); + EXPECT_TRUE(reflection->HasField(message, F("optional_import_enum" ))); + + EXPECT_TRUE(reflection->HasField(message, F("optional_string_piece"))); + EXPECT_TRUE(reflection->HasField(message, F("optional_cord"))); + + EXPECT_EQ(101 , reflection->GetInt32 (message, F("optional_int32" ))); + EXPECT_EQ(102 , reflection->GetInt64 (message, F("optional_int64" ))); + EXPECT_EQ(103 , reflection->GetUInt32(message, F("optional_uint32" ))); + EXPECT_EQ(104 , reflection->GetUInt64(message, F("optional_uint64" ))); + EXPECT_EQ(105 , reflection->GetInt32 (message, F("optional_sint32" ))); + EXPECT_EQ(106 , reflection->GetInt64 (message, F("optional_sint64" ))); + EXPECT_EQ(107 , reflection->GetUInt32(message, F("optional_fixed32" ))); + EXPECT_EQ(108 , reflection->GetUInt64(message, F("optional_fixed64" ))); + EXPECT_EQ(109 , reflection->GetInt32 (message, F("optional_sfixed32"))); + EXPECT_EQ(110 , reflection->GetInt64 (message, F("optional_sfixed64"))); + EXPECT_EQ(111 , reflection->GetFloat (message, F("optional_float" ))); + EXPECT_EQ(112 , reflection->GetDouble(message, F("optional_double" ))); + EXPECT_EQ(true , reflection->GetBool (message, F("optional_bool" ))); + EXPECT_EQ("115", reflection->GetString(message, F("optional_string" ))); + EXPECT_EQ("116", reflection->GetString(message, F("optional_bytes" ))); + + EXPECT_EQ("115", reflection->GetStringReference(message, F("optional_string"), &scratch)); + EXPECT_EQ("116", reflection->GetStringReference(message, F("optional_bytes" ), &scratch)); + + sub_message = &reflection->GetMessage(message, F("optionalgroup")); + EXPECT_EQ(117, sub_message->GetReflection()->GetInt32(*sub_message, group_a_)); + sub_message = &reflection->GetMessage(message, F("optional_nested_message")); + EXPECT_EQ(118, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); + sub_message = &reflection->GetMessage(message, F("optional_foreign_message")); + EXPECT_EQ(119, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); + sub_message = &reflection->GetMessage(message, F("optional_import_message")); + EXPECT_EQ(120, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); + + EXPECT_EQ( nested_baz_, reflection->GetEnum(message, F("optional_nested_enum" ))); + EXPECT_EQ(foreign_baz_, reflection->GetEnum(message, F("optional_foreign_enum"))); + EXPECT_EQ( import_baz_, reflection->GetEnum(message, F("optional_import_enum" ))); + + EXPECT_EQ("124", reflection->GetString(message, F("optional_string_piece"))); + EXPECT_EQ("124", reflection->GetStringReference(message, F("optional_string_piece"), &scratch)); + + EXPECT_EQ("125", reflection->GetString(message, F("optional_cord"))); + EXPECT_EQ("125", reflection->GetStringReference(message, F("optional_cord"), &scratch)); +} + +void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection2( + const Message& message) { + const Reflection* reflection = message.GetReflection(); + string scratch; + const Message* sub_message; + + // ----------------------------------------------------------------- + + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_int32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_int64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_uint32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_uint64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sint32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sint64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_fixed32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_fixed64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sfixed32"))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_sfixed64"))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_float" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_double" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_bool" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_string" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_bytes" ))); + + ASSERT_EQ(2, reflection->FieldSize(message, F("repeatedgroup" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_nested_message" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_foreign_message"))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_import_message" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_nested_enum" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_foreign_enum" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_import_enum" ))); + + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_string_piece"))); + ASSERT_EQ(2, reflection->FieldSize(message, F("repeated_cord"))); + + EXPECT_EQ(201 , reflection->GetRepeatedInt32 (message, F("repeated_int32" ), 0)); + EXPECT_EQ(202 , reflection->GetRepeatedInt64 (message, F("repeated_int64" ), 0)); + EXPECT_EQ(203 , reflection->GetRepeatedUInt32(message, F("repeated_uint32" ), 0)); + EXPECT_EQ(204 , reflection->GetRepeatedUInt64(message, F("repeated_uint64" ), 0)); + EXPECT_EQ(205 , reflection->GetRepeatedInt32 (message, F("repeated_sint32" ), 0)); + EXPECT_EQ(206 , reflection->GetRepeatedInt64 (message, F("repeated_sint64" ), 0)); + EXPECT_EQ(207 , reflection->GetRepeatedUInt32(message, F("repeated_fixed32" ), 0)); + EXPECT_EQ(208 , reflection->GetRepeatedUInt64(message, F("repeated_fixed64" ), 0)); + EXPECT_EQ(209 , reflection->GetRepeatedInt32 (message, F("repeated_sfixed32"), 0)); + EXPECT_EQ(210 , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 0)); + EXPECT_EQ(211 , reflection->GetRepeatedFloat (message, F("repeated_float" ), 0)); + EXPECT_EQ(212 , reflection->GetRepeatedDouble(message, F("repeated_double" ), 0)); + EXPECT_EQ(true , reflection->GetRepeatedBool (message, F("repeated_bool" ), 0)); + EXPECT_EQ("215", reflection->GetRepeatedString(message, F("repeated_string" ), 0)); + EXPECT_EQ("216", reflection->GetRepeatedString(message, F("repeated_bytes" ), 0)); + + EXPECT_EQ("215", reflection->GetRepeatedStringReference(message, F("repeated_string"), 0, &scratch)); + EXPECT_EQ("216", reflection->GetRepeatedStringReference(message, F("repeated_bytes"), 0, &scratch)); + + sub_message = &reflection->GetRepeatedMessage(message, F("repeatedgroup"), 0); + EXPECT_EQ(217, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_)); + sub_message = &reflection->GetRepeatedMessage(message, F("repeated_nested_message"), 0); + EXPECT_EQ(218, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); + sub_message = &reflection->GetRepeatedMessage(message, F("repeated_foreign_message"), 0); + EXPECT_EQ(219, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); + sub_message = &reflection->GetRepeatedMessage(message, F("repeated_import_message"), 0); + EXPECT_EQ(220, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); + + EXPECT_EQ( nested_bar_, reflection->GetRepeatedEnum(message, F("repeated_nested_enum" ),0)); + EXPECT_EQ(foreign_bar_, reflection->GetRepeatedEnum(message, F("repeated_foreign_enum"),0)); + EXPECT_EQ( import_bar_, reflection->GetRepeatedEnum(message, F("repeated_import_enum" ),0)); + + EXPECT_EQ("224", reflection->GetRepeatedString(message, F("repeated_string_piece"), 0)); + EXPECT_EQ("224", reflection->GetRepeatedStringReference( + message, F("repeated_string_piece"), 0, &scratch)); + + EXPECT_EQ("225", reflection->GetRepeatedString(message, F("repeated_cord"), 0)); + EXPECT_EQ("225", reflection->GetRepeatedStringReference( + message, F("repeated_cord"), 0, &scratch)); + + EXPECT_EQ(301 , reflection->GetRepeatedInt32 (message, F("repeated_int32" ), 1)); + EXPECT_EQ(302 , reflection->GetRepeatedInt64 (message, F("repeated_int64" ), 1)); + EXPECT_EQ(303 , reflection->GetRepeatedUInt32(message, F("repeated_uint32" ), 1)); + EXPECT_EQ(304 , reflection->GetRepeatedUInt64(message, F("repeated_uint64" ), 1)); + EXPECT_EQ(305 , reflection->GetRepeatedInt32 (message, F("repeated_sint32" ), 1)); + EXPECT_EQ(306 , reflection->GetRepeatedInt64 (message, F("repeated_sint64" ), 1)); + EXPECT_EQ(307 , reflection->GetRepeatedUInt32(message, F("repeated_fixed32" ), 1)); + EXPECT_EQ(308 , reflection->GetRepeatedUInt64(message, F("repeated_fixed64" ), 1)); + EXPECT_EQ(309 , reflection->GetRepeatedInt32 (message, F("repeated_sfixed32"), 1)); + EXPECT_EQ(310 , reflection->GetRepeatedInt64 (message, F("repeated_sfixed64"), 1)); + EXPECT_EQ(311 , reflection->GetRepeatedFloat (message, F("repeated_float" ), 1)); + EXPECT_EQ(312 , reflection->GetRepeatedDouble(message, F("repeated_double" ), 1)); + EXPECT_EQ(false, reflection->GetRepeatedBool (message, F("repeated_bool" ), 1)); + EXPECT_EQ("315", reflection->GetRepeatedString(message, F("repeated_string" ), 1)); + EXPECT_EQ("316", reflection->GetRepeatedString(message, F("repeated_bytes" ), 1)); + + EXPECT_EQ("315", reflection->GetRepeatedStringReference(message, F("repeated_string"), + 1, &scratch)); + EXPECT_EQ("316", reflection->GetRepeatedStringReference(message, F("repeated_bytes"), + 1, &scratch)); + + sub_message = &reflection->GetRepeatedMessage(message, F("repeatedgroup"), 1); + EXPECT_EQ(317, sub_message->GetReflection()->GetInt32(*sub_message, repeated_group_a_)); + sub_message = &reflection->GetRepeatedMessage(message, F("repeated_nested_message"), 1); + EXPECT_EQ(318, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); + sub_message = &reflection->GetRepeatedMessage(message, F("repeated_foreign_message"), 1); + EXPECT_EQ(319, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); + sub_message = &reflection->GetRepeatedMessage(message, F("repeated_import_message"), 1); + EXPECT_EQ(320, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); + + EXPECT_EQ( nested_baz_, reflection->GetRepeatedEnum(message, F("repeated_nested_enum" ),1)); + EXPECT_EQ(foreign_baz_, reflection->GetRepeatedEnum(message, F("repeated_foreign_enum"),1)); + EXPECT_EQ( import_baz_, reflection->GetRepeatedEnum(message, F("repeated_import_enum" ),1)); + + EXPECT_EQ("324", reflection->GetRepeatedString(message, F("repeated_string_piece"), 1)); + EXPECT_EQ("324", reflection->GetRepeatedStringReference( + message, F("repeated_string_piece"), 1, &scratch)); + + EXPECT_EQ("325", reflection->GetRepeatedString(message, F("repeated_cord"), 1)); + EXPECT_EQ("325", reflection->GetRepeatedStringReference( + message, F("repeated_cord"), 1, &scratch)); +} + +void TestUtil::ReflectionTester::ExpectAllFieldsSetViaReflection3( + const Message& message) { + const Reflection* reflection = message.GetReflection(); + string scratch; + + // ----------------------------------------------------------------- + + EXPECT_TRUE(reflection->HasField(message, F("default_int32" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_int64" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_uint32" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_uint64" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_sint32" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_sint64" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_fixed32" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_fixed64" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_sfixed32"))); + EXPECT_TRUE(reflection->HasField(message, F("default_sfixed64"))); + EXPECT_TRUE(reflection->HasField(message, F("default_float" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_double" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_bool" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_string" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_bytes" ))); + + EXPECT_TRUE(reflection->HasField(message, F("default_nested_enum" ))); + EXPECT_TRUE(reflection->HasField(message, F("default_foreign_enum"))); + EXPECT_TRUE(reflection->HasField(message, F("default_import_enum" ))); + + EXPECT_TRUE(reflection->HasField(message, F("default_string_piece"))); + EXPECT_TRUE(reflection->HasField(message, F("default_cord"))); + + EXPECT_EQ(401 , reflection->GetInt32 (message, F("default_int32" ))); + EXPECT_EQ(402 , reflection->GetInt64 (message, F("default_int64" ))); + EXPECT_EQ(403 , reflection->GetUInt32(message, F("default_uint32" ))); + EXPECT_EQ(404 , reflection->GetUInt64(message, F("default_uint64" ))); + EXPECT_EQ(405 , reflection->GetInt32 (message, F("default_sint32" ))); + EXPECT_EQ(406 , reflection->GetInt64 (message, F("default_sint64" ))); + EXPECT_EQ(407 , reflection->GetUInt32(message, F("default_fixed32" ))); + EXPECT_EQ(408 , reflection->GetUInt64(message, F("default_fixed64" ))); + EXPECT_EQ(409 , reflection->GetInt32 (message, F("default_sfixed32"))); + EXPECT_EQ(410 , reflection->GetInt64 (message, F("default_sfixed64"))); + EXPECT_EQ(411 , reflection->GetFloat (message, F("default_float" ))); + EXPECT_EQ(412 , reflection->GetDouble(message, F("default_double" ))); + EXPECT_EQ(false, reflection->GetBool (message, F("default_bool" ))); + EXPECT_EQ("415", reflection->GetString(message, F("default_string" ))); + EXPECT_EQ("416", reflection->GetString(message, F("default_bytes" ))); + + EXPECT_EQ("415", reflection->GetStringReference(message, F("default_string"), &scratch)); + EXPECT_EQ("416", reflection->GetStringReference(message, F("default_bytes" ), &scratch)); + + EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F("default_nested_enum" ))); + EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F("default_foreign_enum"))); + EXPECT_EQ( import_foo_, reflection->GetEnum(message, F("default_import_enum" ))); + + EXPECT_EQ("424", reflection->GetString(message, F("default_string_piece"))); + EXPECT_EQ("424", reflection->GetStringReference(message, F("default_string_piece"), + &scratch)); + + EXPECT_EQ("425", reflection->GetString(message, F("default_cord"))); + EXPECT_EQ("425", reflection->GetStringReference(message, F("default_cord"), &scratch)); +} + +void TestUtil::ReflectionTester::ExpectPackedFieldsSetViaReflection( + const Message& message) { + const Reflection* reflection = message.GetReflection(); + + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_int32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_int64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_uint32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_uint64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sint32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sint64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_fixed32" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_fixed64" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sfixed32"))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_sfixed64"))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_float" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_double" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_bool" ))); + ASSERT_EQ(2, reflection->FieldSize(message, F("packed_enum" ))); + + EXPECT_EQ(601 , reflection->GetRepeatedInt32 (message, F("packed_int32" ), 0)); + EXPECT_EQ(602 , reflection->GetRepeatedInt64 (message, F("packed_int64" ), 0)); + EXPECT_EQ(603 , reflection->GetRepeatedUInt32(message, F("packed_uint32" ), 0)); + EXPECT_EQ(604 , reflection->GetRepeatedUInt64(message, F("packed_uint64" ), 0)); + EXPECT_EQ(605 , reflection->GetRepeatedInt32 (message, F("packed_sint32" ), 0)); + EXPECT_EQ(606 , reflection->GetRepeatedInt64 (message, F("packed_sint64" ), 0)); + EXPECT_EQ(607 , reflection->GetRepeatedUInt32(message, F("packed_fixed32" ), 0)); + EXPECT_EQ(608 , reflection->GetRepeatedUInt64(message, F("packed_fixed64" ), 0)); + EXPECT_EQ(609 , reflection->GetRepeatedInt32 (message, F("packed_sfixed32"), 0)); + EXPECT_EQ(610 , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 0)); + EXPECT_EQ(611 , reflection->GetRepeatedFloat (message, F("packed_float" ), 0)); + EXPECT_EQ(612 , reflection->GetRepeatedDouble(message, F("packed_double" ), 0)); + EXPECT_EQ(true , reflection->GetRepeatedBool (message, F("packed_bool" ), 0)); + EXPECT_EQ(foreign_bar_, + reflection->GetRepeatedEnum(message, F("packed_enum"), 0)); + + EXPECT_EQ(701 , reflection->GetRepeatedInt32 (message, F("packed_int32" ), 1)); + EXPECT_EQ(702 , reflection->GetRepeatedInt64 (message, F("packed_int64" ), 1)); + EXPECT_EQ(703 , reflection->GetRepeatedUInt32(message, F("packed_uint32" ), 1)); + EXPECT_EQ(704 , reflection->GetRepeatedUInt64(message, F("packed_uint64" ), 1)); + EXPECT_EQ(705 , reflection->GetRepeatedInt32 (message, F("packed_sint32" ), 1)); + EXPECT_EQ(706 , reflection->GetRepeatedInt64 (message, F("packed_sint64" ), 1)); + EXPECT_EQ(707 , reflection->GetRepeatedUInt32(message, F("packed_fixed32" ), 1)); + EXPECT_EQ(708 , reflection->GetRepeatedUInt64(message, F("packed_fixed64" ), 1)); + EXPECT_EQ(709 , reflection->GetRepeatedInt32 (message, F("packed_sfixed32"), 1)); + EXPECT_EQ(710 , reflection->GetRepeatedInt64 (message, F("packed_sfixed64"), 1)); + EXPECT_EQ(711 , reflection->GetRepeatedFloat (message, F("packed_float" ), 1)); + EXPECT_EQ(712 , reflection->GetRepeatedDouble(message, F("packed_double" ), 1)); + EXPECT_EQ(false, reflection->GetRepeatedBool (message, F("packed_bool" ), 1)); + EXPECT_EQ(foreign_baz_, + reflection->GetRepeatedEnum(message, F("packed_enum"), 1)); +} + +// ------------------------------------------------------------------- + +void TestUtil::ReflectionTester::ExpectClearViaReflection( + const Message& message) { + const Reflection* reflection = message.GetReflection(); + string scratch; + const Message* sub_message; + + // has_blah() should initially be false for all optional fields. + EXPECT_FALSE(reflection->HasField(message, F("optional_int32" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_int64" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_uint32" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_uint64" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_sint32" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_sint64" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_fixed32" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_fixed64" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_sfixed32"))); + EXPECT_FALSE(reflection->HasField(message, F("optional_sfixed64"))); + EXPECT_FALSE(reflection->HasField(message, F("optional_float" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_double" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_bool" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_string" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_bytes" ))); + + EXPECT_FALSE(reflection->HasField(message, F("optionalgroup" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_nested_message" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_foreign_message"))); + EXPECT_FALSE(reflection->HasField(message, F("optional_import_message" ))); + + EXPECT_FALSE(reflection->HasField(message, F("optional_nested_enum" ))); + EXPECT_FALSE(reflection->HasField(message, F("optional_foreign_enum"))); + EXPECT_FALSE(reflection->HasField(message, F("optional_import_enum" ))); + + EXPECT_FALSE(reflection->HasField(message, F("optional_string_piece"))); + EXPECT_FALSE(reflection->HasField(message, F("optional_cord"))); + + // Optional fields without defaults are set to zero or something like it. + EXPECT_EQ(0 , reflection->GetInt32 (message, F("optional_int32" ))); + EXPECT_EQ(0 , reflection->GetInt64 (message, F("optional_int64" ))); + EXPECT_EQ(0 , reflection->GetUInt32(message, F("optional_uint32" ))); + EXPECT_EQ(0 , reflection->GetUInt64(message, F("optional_uint64" ))); + EXPECT_EQ(0 , reflection->GetInt32 (message, F("optional_sint32" ))); + EXPECT_EQ(0 , reflection->GetInt64 (message, F("optional_sint64" ))); + EXPECT_EQ(0 , reflection->GetUInt32(message, F("optional_fixed32" ))); + EXPECT_EQ(0 , reflection->GetUInt64(message, F("optional_fixed64" ))); + EXPECT_EQ(0 , reflection->GetInt32 (message, F("optional_sfixed32"))); + EXPECT_EQ(0 , reflection->GetInt64 (message, F("optional_sfixed64"))); + EXPECT_EQ(0 , reflection->GetFloat (message, F("optional_float" ))); + EXPECT_EQ(0 , reflection->GetDouble(message, F("optional_double" ))); + EXPECT_EQ(false, reflection->GetBool (message, F("optional_bool" ))); + EXPECT_EQ("" , reflection->GetString(message, F("optional_string" ))); + EXPECT_EQ("" , reflection->GetString(message, F("optional_bytes" ))); + + EXPECT_EQ("", reflection->GetStringReference(message, F("optional_string"), &scratch)); + EXPECT_EQ("", reflection->GetStringReference(message, F("optional_bytes" ), &scratch)); + + // Embedded messages should also be clear. + sub_message = &reflection->GetMessage(message, F("optionalgroup")); + EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, group_a_)); + EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, group_a_)); + sub_message = &reflection->GetMessage(message, F("optional_nested_message")); + EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, nested_b_)); + EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, nested_b_)); + sub_message = &reflection->GetMessage(message, F("optional_foreign_message")); + EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, foreign_c_)); + EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, foreign_c_)); + sub_message = &reflection->GetMessage(message, F("optional_import_message")); + EXPECT_FALSE(sub_message->GetReflection()->HasField(*sub_message, import_d_)); + EXPECT_EQ(0, sub_message->GetReflection()->GetInt32(*sub_message, import_d_)); + + // Enums without defaults are set to the first value in the enum. + EXPECT_EQ( nested_foo_, reflection->GetEnum(message, F("optional_nested_enum" ))); + EXPECT_EQ(foreign_foo_, reflection->GetEnum(message, F("optional_foreign_enum"))); + EXPECT_EQ( import_foo_, reflection->GetEnum(message, F("optional_import_enum" ))); + + EXPECT_EQ("", reflection->GetString(message, F("optional_string_piece"))); + EXPECT_EQ("", reflection->GetStringReference(message, F("optional_string_piece"), &scratch)); + + EXPECT_EQ("", reflection->GetString(message, F("optional_cord"))); + EXPECT_EQ("", reflection->GetStringReference(message, F("optional_cord"), &scratch)); + + // Repeated fields are empty. + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_int32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_int64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_uint32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_uint64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sint32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sint64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_fixed32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_fixed64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sfixed32"))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_sfixed64"))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_float" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_double" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_bool" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_string" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_bytes" ))); + + EXPECT_EQ(0, reflection->FieldSize(message, F("repeatedgroup" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_nested_message" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_foreign_message"))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_import_message" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_nested_enum" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_foreign_enum" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_import_enum" ))); + + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_string_piece"))); + EXPECT_EQ(0, reflection->FieldSize(message, F("repeated_cord"))); + + // has_blah() should also be false for all default fields. + EXPECT_FALSE(reflection->HasField(message, F("default_int32" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_int64" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_uint32" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_uint64" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_sint32" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_sint64" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_fixed32" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_fixed64" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_sfixed32"))); + EXPECT_FALSE(reflection->HasField(message, F("default_sfixed64"))); + EXPECT_FALSE(reflection->HasField(message, F("default_float" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_double" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_bool" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_string" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_bytes" ))); + + EXPECT_FALSE(reflection->HasField(message, F("default_nested_enum" ))); + EXPECT_FALSE(reflection->HasField(message, F("default_foreign_enum"))); + EXPECT_FALSE(reflection->HasField(message, F("default_import_enum" ))); + + EXPECT_FALSE(reflection->HasField(message, F("default_string_piece"))); + EXPECT_FALSE(reflection->HasField(message, F("default_cord"))); + + // Fields with defaults have their default values (duh). + EXPECT_EQ( 41 , reflection->GetInt32 (message, F("default_int32" ))); + EXPECT_EQ( 42 , reflection->GetInt64 (message, F("default_int64" ))); + EXPECT_EQ( 43 , reflection->GetUInt32(message, F("default_uint32" ))); + EXPECT_EQ( 44 , reflection->GetUInt64(message, F("default_uint64" ))); + EXPECT_EQ(-45 , reflection->GetInt32 (message, F("default_sint32" ))); + EXPECT_EQ( 46 , reflection->GetInt64 (message, F("default_sint64" ))); + EXPECT_EQ( 47 , reflection->GetUInt32(message, F("default_fixed32" ))); + EXPECT_EQ( 48 , reflection->GetUInt64(message, F("default_fixed64" ))); + EXPECT_EQ( 49 , reflection->GetInt32 (message, F("default_sfixed32"))); + EXPECT_EQ(-50 , reflection->GetInt64 (message, F("default_sfixed64"))); + EXPECT_EQ( 51.5 , reflection->GetFloat (message, F("default_float" ))); + EXPECT_EQ( 52e3 , reflection->GetDouble(message, F("default_double" ))); + EXPECT_EQ(true , reflection->GetBool (message, F("default_bool" ))); + EXPECT_EQ("hello", reflection->GetString(message, F("default_string" ))); + EXPECT_EQ("world", reflection->GetString(message, F("default_bytes" ))); + + EXPECT_EQ("hello", reflection->GetStringReference(message, F("default_string"), &scratch)); + EXPECT_EQ("world", reflection->GetStringReference(message, F("default_bytes" ), &scratch)); + + EXPECT_EQ( nested_bar_, reflection->GetEnum(message, F("default_nested_enum" ))); + EXPECT_EQ(foreign_bar_, reflection->GetEnum(message, F("default_foreign_enum"))); + EXPECT_EQ( import_bar_, reflection->GetEnum(message, F("default_import_enum" ))); + + EXPECT_EQ("abc", reflection->GetString(message, F("default_string_piece"))); + EXPECT_EQ("abc", reflection->GetStringReference(message, F("default_string_piece"), &scratch)); + + EXPECT_EQ("123", reflection->GetString(message, F("default_cord"))); + EXPECT_EQ("123", reflection->GetStringReference(message, F("default_cord"), &scratch)); +} + +void TestUtil::ReflectionTester::ExpectPackedClearViaReflection( + const Message& message) { + const Reflection* reflection = message.GetReflection(); + + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_int32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_int64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_uint32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_uint64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sint32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sint64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_fixed32" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_fixed64" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sfixed32"))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_sfixed64"))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_float" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_double" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_bool" ))); + EXPECT_EQ(0, reflection->FieldSize(message, F("packed_enum" ))); +} + +// ------------------------------------------------------------------- + +void TestUtil::ReflectionTester::ModifyRepeatedFieldsViaReflection( + Message* message) { + const Reflection* reflection = message->GetReflection(); + Message* sub_message; + + reflection->SetRepeatedInt32 (message, F("repeated_int32" ), 1, 501); + reflection->SetRepeatedInt64 (message, F("repeated_int64" ), 1, 502); + reflection->SetRepeatedUInt32(message, F("repeated_uint32" ), 1, 503); + reflection->SetRepeatedUInt64(message, F("repeated_uint64" ), 1, 504); + reflection->SetRepeatedInt32 (message, F("repeated_sint32" ), 1, 505); + reflection->SetRepeatedInt64 (message, F("repeated_sint64" ), 1, 506); + reflection->SetRepeatedUInt32(message, F("repeated_fixed32" ), 1, 507); + reflection->SetRepeatedUInt64(message, F("repeated_fixed64" ), 1, 508); + reflection->SetRepeatedInt32 (message, F("repeated_sfixed32"), 1, 509); + reflection->SetRepeatedInt64 (message, F("repeated_sfixed64"), 1, 510); + reflection->SetRepeatedFloat (message, F("repeated_float" ), 1, 511); + reflection->SetRepeatedDouble(message, F("repeated_double" ), 1, 512); + reflection->SetRepeatedBool (message, F("repeated_bool" ), 1, true); + reflection->SetRepeatedString(message, F("repeated_string" ), 1, "515"); + reflection->SetRepeatedString(message, F("repeated_bytes" ), 1, "516"); + + sub_message = reflection->MutableRepeatedMessage(message, F("repeatedgroup"), 1); + sub_message->GetReflection()->SetInt32(sub_message, repeated_group_a_, 517); + sub_message = reflection->MutableRepeatedMessage(message, F("repeated_nested_message"), 1); + sub_message->GetReflection()->SetInt32(sub_message, nested_b_, 518); + sub_message = reflection->MutableRepeatedMessage(message, F("repeated_foreign_message"), 1); + sub_message->GetReflection()->SetInt32(sub_message, foreign_c_, 519); + sub_message = reflection->MutableRepeatedMessage(message, F("repeated_import_message"), 1); + sub_message->GetReflection()->SetInt32(sub_message, import_d_, 520); + + reflection->SetRepeatedEnum(message, F("repeated_nested_enum" ), 1, nested_foo_); + reflection->SetRepeatedEnum(message, F("repeated_foreign_enum"), 1, foreign_foo_); + reflection->SetRepeatedEnum(message, F("repeated_import_enum" ), 1, import_foo_); + + reflection->SetRepeatedString(message, F("repeated_string_piece"), 1, "524"); + reflection->SetRepeatedString(message, F("repeated_cord"), 1, "525"); +} + +void TestUtil::ReflectionTester::ModifyPackedFieldsViaReflection( + Message* message) { + const Reflection* reflection = message->GetReflection(); + reflection->SetRepeatedInt32 (message, F("packed_int32" ), 1, 801); + reflection->SetRepeatedInt64 (message, F("packed_int64" ), 1, 802); + reflection->SetRepeatedUInt32(message, F("packed_uint32" ), 1, 803); + reflection->SetRepeatedUInt64(message, F("packed_uint64" ), 1, 804); + reflection->SetRepeatedInt32 (message, F("packed_sint32" ), 1, 805); + reflection->SetRepeatedInt64 (message, F("packed_sint64" ), 1, 806); + reflection->SetRepeatedUInt32(message, F("packed_fixed32" ), 1, 807); + reflection->SetRepeatedUInt64(message, F("packed_fixed64" ), 1, 808); + reflection->SetRepeatedInt32 (message, F("packed_sfixed32"), 1, 809); + reflection->SetRepeatedInt64 (message, F("packed_sfixed64"), 1, 810); + reflection->SetRepeatedFloat (message, F("packed_float" ), 1, 811); + reflection->SetRepeatedDouble(message, F("packed_double" ), 1, 812); + reflection->SetRepeatedBool (message, F("packed_bool" ), 1, true); + reflection->SetRepeatedEnum (message, F("packed_enum" ), 1, foreign_foo_); +} + +void TestUtil::ReflectionTester::RemoveLastRepeatedsViaReflection(Message* message) { + const Reflection* reflection = message->GetReflection(); + + vector output; + reflection->ListFields(*message, &output); + for (int i=0; iis_repeated()) continue; + + reflection->RemoveLast(message, field); + } +} + +void TestUtil::ReflectionTester::SwapRepeatedsViaReflection(Message* message) { + const Reflection* reflection = message->GetReflection(); + + vector output; + reflection->ListFields(*message, &output); + for (int i=0; iis_repeated()) continue; + + reflection->SwapElements(message, field, 0, 1); + } +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h new file mode 100644 index 000000000..25165f3ad --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h @@ -0,0 +1,174 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_TEST_UTIL_H__ +#define GOOGLE_PROTOBUF_TEST_UTIL_H__ + +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +namespace unittest = protobuf_unittest; +namespace unittest_import = protobuf_unittest_import; + +class TestUtil { + public: + // Set every field in the message to a unique value. + static void SetAllFields(unittest::TestAllTypes* message); + static void SetAllExtensions(unittest::TestAllExtensions* message); + static void SetAllFieldsAndExtensions(unittest::TestFieldOrderings* message); + static void SetPackedFields(unittest::TestPackedTypes* message); + static void SetPackedExtensions(unittest::TestPackedExtensions* message); + static void SetUnpackedFields(unittest::TestUnpackedTypes* message); + + // Use the repeated versions of the set_*() accessors to modify all the + // repeated fields of the messsage (which should already have been + // initialized with Set*Fields()). Set*Fields() itself only tests + // the add_*() accessors. + static void ModifyRepeatedFields(unittest::TestAllTypes* message); + static void ModifyRepeatedExtensions(unittest::TestAllExtensions* message); + static void ModifyPackedFields(unittest::TestPackedTypes* message); + static void ModifyPackedExtensions(unittest::TestPackedExtensions* message); + + // Check that all fields have the values that they should have after + // Set*Fields() is called. + static void ExpectAllFieldsSet(const unittest::TestAllTypes& message); + static void ExpectAllExtensionsSet( + const unittest::TestAllExtensions& message); + static void ExpectPackedFieldsSet(const unittest::TestPackedTypes& message); + static void ExpectPackedExtensionsSet( + const unittest::TestPackedExtensions& message); + static void ExpectUnpackedFieldsSet( + const unittest::TestUnpackedTypes& message); + + // Expect that the message is modified as would be expected from + // Modify*Fields(). + static void ExpectRepeatedFieldsModified( + const unittest::TestAllTypes& message); + static void ExpectRepeatedExtensionsModified( + const unittest::TestAllExtensions& message); + static void ExpectPackedFieldsModified( + const unittest::TestPackedTypes& message); + static void ExpectPackedExtensionsModified( + const unittest::TestPackedExtensions& message); + + // Check that all fields have their default values. + static void ExpectClear(const unittest::TestAllTypes& message); + static void ExpectExtensionsClear(const unittest::TestAllExtensions& message); + static void ExpectPackedClear(const unittest::TestPackedTypes& message); + static void ExpectPackedExtensionsClear( + const unittest::TestPackedExtensions& message); + + // Check that the passed-in serialization is the canonical serialization we + // expect for a TestFieldOrderings message filled in by + // SetAllFieldsAndExtensions(). + static void ExpectAllFieldsAndExtensionsInOrder(const string& serialized); + + // Check that all repeated fields have had their last elements removed. + static void ExpectLastRepeatedsRemoved( + const unittest::TestAllTypes& message); + static void ExpectLastRepeatedExtensionsRemoved( + const unittest::TestAllExtensions& message); + + // Check that all repeated fields have had their first and last elements + // swapped. + static void ExpectRepeatedsSwapped(const unittest::TestAllTypes& message); + static void ExpectRepeatedExtensionsSwapped( + const unittest::TestAllExtensions& message); + + // Like above, but use the reflection interface. + class ReflectionTester { + public: + // base_descriptor must be a descriptor for TestAllTypes or + // TestAllExtensions. In the former case, ReflectionTester fetches from + // it the FieldDescriptors needed to use the reflection interface. In + // the latter case, ReflectionTester searches for extension fields in + // its file. + explicit ReflectionTester(const Descriptor* base_descriptor); + + void SetAllFieldsViaReflection(Message* message); + void ModifyRepeatedFieldsViaReflection(Message* message); + void ExpectAllFieldsSetViaReflection(const Message& message); + void ExpectClearViaReflection(const Message& message); + + void SetPackedFieldsViaReflection(Message* message); + void ModifyPackedFieldsViaReflection(Message* message); + void ExpectPackedFieldsSetViaReflection(const Message& message); + void ExpectPackedClearViaReflection(const Message& message); + + void RemoveLastRepeatedsViaReflection(Message* message); + void SwapRepeatedsViaReflection(Message* message); + + private: + const FieldDescriptor* F(const string& name); + + const Descriptor* base_descriptor_; + + const FieldDescriptor* group_a_; + const FieldDescriptor* repeated_group_a_; + const FieldDescriptor* nested_b_; + const FieldDescriptor* foreign_c_; + const FieldDescriptor* import_d_; + + const EnumValueDescriptor* nested_foo_; + const EnumValueDescriptor* nested_bar_; + const EnumValueDescriptor* nested_baz_; + const EnumValueDescriptor* foreign_foo_; + const EnumValueDescriptor* foreign_bar_; + const EnumValueDescriptor* foreign_baz_; + const EnumValueDescriptor* import_foo_; + const EnumValueDescriptor* import_bar_; + const EnumValueDescriptor* import_baz_; + + // We have to split this into three function otherwise it creates a stack + // frame so large that it triggers a warning. + void ExpectAllFieldsSetViaReflection1(const Message& message); + void ExpectAllFieldsSetViaReflection2(const Message& message); + void ExpectAllFieldsSetViaReflection3(const Message& message); + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ReflectionTester); + }; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtil); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_TEST_UTIL_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc new file mode 100644 index 000000000..d7140e0ca --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc @@ -0,0 +1,1502 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include + + +#define EXPECT_TRUE GOOGLE_CHECK +#define ASSERT_TRUE GOOGLE_CHECK +#define EXPECT_FALSE(COND) GOOGLE_CHECK(!(COND)) +#define EXPECT_EQ GOOGLE_CHECK_EQ +#define ASSERT_EQ GOOGLE_CHECK_EQ + +namespace google { +namespace protobuf { + +void TestUtilLite::SetAllFields(unittest::TestAllTypesLite* message) { + message->set_optional_int32 (101); + message->set_optional_int64 (102); + message->set_optional_uint32 (103); + message->set_optional_uint64 (104); + message->set_optional_sint32 (105); + message->set_optional_sint64 (106); + message->set_optional_fixed32 (107); + message->set_optional_fixed64 (108); + message->set_optional_sfixed32(109); + message->set_optional_sfixed64(110); + message->set_optional_float (111); + message->set_optional_double (112); + message->set_optional_bool (true); + message->set_optional_string ("115"); + message->set_optional_bytes ("116"); + + message->mutable_optionalgroup ()->set_a(117); + message->mutable_optional_nested_message ()->set_bb(118); + message->mutable_optional_foreign_message()->set_c(119); + message->mutable_optional_import_message ()->set_d(120); + + message->set_optional_nested_enum (unittest::TestAllTypesLite::BAZ ); + message->set_optional_foreign_enum(unittest::FOREIGN_LITE_BAZ ); + message->set_optional_import_enum (unittest_import::IMPORT_LITE_BAZ); + + + // ----------------------------------------------------------------- + + message->add_repeated_int32 (201); + message->add_repeated_int64 (202); + message->add_repeated_uint32 (203); + message->add_repeated_uint64 (204); + message->add_repeated_sint32 (205); + message->add_repeated_sint64 (206); + message->add_repeated_fixed32 (207); + message->add_repeated_fixed64 (208); + message->add_repeated_sfixed32(209); + message->add_repeated_sfixed64(210); + message->add_repeated_float (211); + message->add_repeated_double (212); + message->add_repeated_bool (true); + message->add_repeated_string ("215"); + message->add_repeated_bytes ("216"); + + message->add_repeatedgroup ()->set_a(217); + message->add_repeated_nested_message ()->set_bb(218); + message->add_repeated_foreign_message()->set_c(219); + message->add_repeated_import_message ()->set_d(220); + + message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAR ); + message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAR ); + message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAR); + + + // Add a second one of each field. + message->add_repeated_int32 (301); + message->add_repeated_int64 (302); + message->add_repeated_uint32 (303); + message->add_repeated_uint64 (304); + message->add_repeated_sint32 (305); + message->add_repeated_sint64 (306); + message->add_repeated_fixed32 (307); + message->add_repeated_fixed64 (308); + message->add_repeated_sfixed32(309); + message->add_repeated_sfixed64(310); + message->add_repeated_float (311); + message->add_repeated_double (312); + message->add_repeated_bool (false); + message->add_repeated_string ("315"); + message->add_repeated_bytes ("316"); + + message->add_repeatedgroup ()->set_a(317); + message->add_repeated_nested_message ()->set_bb(318); + message->add_repeated_foreign_message()->set_c(319); + message->add_repeated_import_message ()->set_d(320); + + message->add_repeated_nested_enum (unittest::TestAllTypesLite::BAZ ); + message->add_repeated_foreign_enum(unittest::FOREIGN_LITE_BAZ ); + message->add_repeated_import_enum (unittest_import::IMPORT_LITE_BAZ); + + + // ----------------------------------------------------------------- + + message->set_default_int32 (401); + message->set_default_int64 (402); + message->set_default_uint32 (403); + message->set_default_uint64 (404); + message->set_default_sint32 (405); + message->set_default_sint64 (406); + message->set_default_fixed32 (407); + message->set_default_fixed64 (408); + message->set_default_sfixed32(409); + message->set_default_sfixed64(410); + message->set_default_float (411); + message->set_default_double (412); + message->set_default_bool (false); + message->set_default_string ("415"); + message->set_default_bytes ("416"); + + message->set_default_nested_enum (unittest::TestAllTypesLite::FOO ); + message->set_default_foreign_enum(unittest::FOREIGN_LITE_FOO ); + message->set_default_import_enum (unittest_import::IMPORT_LITE_FOO); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ModifyRepeatedFields(unittest::TestAllTypesLite* message) { + message->set_repeated_int32 (1, 501); + message->set_repeated_int64 (1, 502); + message->set_repeated_uint32 (1, 503); + message->set_repeated_uint64 (1, 504); + message->set_repeated_sint32 (1, 505); + message->set_repeated_sint64 (1, 506); + message->set_repeated_fixed32 (1, 507); + message->set_repeated_fixed64 (1, 508); + message->set_repeated_sfixed32(1, 509); + message->set_repeated_sfixed64(1, 510); + message->set_repeated_float (1, 511); + message->set_repeated_double (1, 512); + message->set_repeated_bool (1, true); + message->set_repeated_string (1, "515"); + message->set_repeated_bytes (1, "516"); + + message->mutable_repeatedgroup (1)->set_a(517); + message->mutable_repeated_nested_message (1)->set_bb(518); + message->mutable_repeated_foreign_message(1)->set_c(519); + message->mutable_repeated_import_message (1)->set_d(520); + + message->set_repeated_nested_enum (1, unittest::TestAllTypesLite::FOO ); + message->set_repeated_foreign_enum(1, unittest::FOREIGN_LITE_FOO ); + message->set_repeated_import_enum (1, unittest_import::IMPORT_LITE_FOO); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectAllFieldsSet( + const unittest::TestAllTypesLite& message) { + EXPECT_TRUE(message.has_optional_int32 ()); + EXPECT_TRUE(message.has_optional_int64 ()); + EXPECT_TRUE(message.has_optional_uint32 ()); + EXPECT_TRUE(message.has_optional_uint64 ()); + EXPECT_TRUE(message.has_optional_sint32 ()); + EXPECT_TRUE(message.has_optional_sint64 ()); + EXPECT_TRUE(message.has_optional_fixed32 ()); + EXPECT_TRUE(message.has_optional_fixed64 ()); + EXPECT_TRUE(message.has_optional_sfixed32()); + EXPECT_TRUE(message.has_optional_sfixed64()); + EXPECT_TRUE(message.has_optional_float ()); + EXPECT_TRUE(message.has_optional_double ()); + EXPECT_TRUE(message.has_optional_bool ()); + EXPECT_TRUE(message.has_optional_string ()); + EXPECT_TRUE(message.has_optional_bytes ()); + + EXPECT_TRUE(message.has_optionalgroup ()); + EXPECT_TRUE(message.has_optional_nested_message ()); + EXPECT_TRUE(message.has_optional_foreign_message()); + EXPECT_TRUE(message.has_optional_import_message ()); + + EXPECT_TRUE(message.optionalgroup ().has_a()); + EXPECT_TRUE(message.optional_nested_message ().has_bb()); + EXPECT_TRUE(message.optional_foreign_message().has_c()); + EXPECT_TRUE(message.optional_import_message ().has_d()); + + EXPECT_TRUE(message.has_optional_nested_enum ()); + EXPECT_TRUE(message.has_optional_foreign_enum()); + EXPECT_TRUE(message.has_optional_import_enum ()); + + + EXPECT_EQ(101 , message.optional_int32 ()); + EXPECT_EQ(102 , message.optional_int64 ()); + EXPECT_EQ(103 , message.optional_uint32 ()); + EXPECT_EQ(104 , message.optional_uint64 ()); + EXPECT_EQ(105 , message.optional_sint32 ()); + EXPECT_EQ(106 , message.optional_sint64 ()); + EXPECT_EQ(107 , message.optional_fixed32 ()); + EXPECT_EQ(108 , message.optional_fixed64 ()); + EXPECT_EQ(109 , message.optional_sfixed32()); + EXPECT_EQ(110 , message.optional_sfixed64()); + EXPECT_EQ(111 , message.optional_float ()); + EXPECT_EQ(112 , message.optional_double ()); + EXPECT_EQ(true , message.optional_bool ()); + EXPECT_EQ("115", message.optional_string ()); + EXPECT_EQ("116", message.optional_bytes ()); + + EXPECT_EQ(117, message.optionalgroup ().a()); + EXPECT_EQ(118, message.optional_nested_message ().bb()); + EXPECT_EQ(119, message.optional_foreign_message().c()); + EXPECT_EQ(120, message.optional_import_message ().d()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.optional_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.optional_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.optional_import_enum ()); + + + // ----------------------------------------------------------------- + + ASSERT_EQ(2, message.repeated_int32_size ()); + ASSERT_EQ(2, message.repeated_int64_size ()); + ASSERT_EQ(2, message.repeated_uint32_size ()); + ASSERT_EQ(2, message.repeated_uint64_size ()); + ASSERT_EQ(2, message.repeated_sint32_size ()); + ASSERT_EQ(2, message.repeated_sint64_size ()); + ASSERT_EQ(2, message.repeated_fixed32_size ()); + ASSERT_EQ(2, message.repeated_fixed64_size ()); + ASSERT_EQ(2, message.repeated_sfixed32_size()); + ASSERT_EQ(2, message.repeated_sfixed64_size()); + ASSERT_EQ(2, message.repeated_float_size ()); + ASSERT_EQ(2, message.repeated_double_size ()); + ASSERT_EQ(2, message.repeated_bool_size ()); + ASSERT_EQ(2, message.repeated_string_size ()); + ASSERT_EQ(2, message.repeated_bytes_size ()); + + ASSERT_EQ(2, message.repeatedgroup_size ()); + ASSERT_EQ(2, message.repeated_nested_message_size ()); + ASSERT_EQ(2, message.repeated_foreign_message_size()); + ASSERT_EQ(2, message.repeated_import_message_size ()); + ASSERT_EQ(2, message.repeated_nested_enum_size ()); + ASSERT_EQ(2, message.repeated_foreign_enum_size ()); + ASSERT_EQ(2, message.repeated_import_enum_size ()); + + + EXPECT_EQ(201 , message.repeated_int32 (0)); + EXPECT_EQ(202 , message.repeated_int64 (0)); + EXPECT_EQ(203 , message.repeated_uint32 (0)); + EXPECT_EQ(204 , message.repeated_uint64 (0)); + EXPECT_EQ(205 , message.repeated_sint32 (0)); + EXPECT_EQ(206 , message.repeated_sint64 (0)); + EXPECT_EQ(207 , message.repeated_fixed32 (0)); + EXPECT_EQ(208 , message.repeated_fixed64 (0)); + EXPECT_EQ(209 , message.repeated_sfixed32(0)); + EXPECT_EQ(210 , message.repeated_sfixed64(0)); + EXPECT_EQ(211 , message.repeated_float (0)); + EXPECT_EQ(212 , message.repeated_double (0)); + EXPECT_EQ(true , message.repeated_bool (0)); + EXPECT_EQ("215", message.repeated_string (0)); + EXPECT_EQ("216", message.repeated_bytes (0)); + + EXPECT_EQ(217, message.repeatedgroup (0).a()); + EXPECT_EQ(218, message.repeated_nested_message (0).bb()); + EXPECT_EQ(219, message.repeated_foreign_message(0).c()); + EXPECT_EQ(220, message.repeated_import_message (0).d()); + + + EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.repeated_foreign_enum(0)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0)); + + EXPECT_EQ(301 , message.repeated_int32 (1)); + EXPECT_EQ(302 , message.repeated_int64 (1)); + EXPECT_EQ(303 , message.repeated_uint32 (1)); + EXPECT_EQ(304 , message.repeated_uint64 (1)); + EXPECT_EQ(305 , message.repeated_sint32 (1)); + EXPECT_EQ(306 , message.repeated_sint64 (1)); + EXPECT_EQ(307 , message.repeated_fixed32 (1)); + EXPECT_EQ(308 , message.repeated_fixed64 (1)); + EXPECT_EQ(309 , message.repeated_sfixed32(1)); + EXPECT_EQ(310 , message.repeated_sfixed64(1)); + EXPECT_EQ(311 , message.repeated_float (1)); + EXPECT_EQ(312 , message.repeated_double (1)); + EXPECT_EQ(false, message.repeated_bool (1)); + EXPECT_EQ("315", message.repeated_string (1)); + EXPECT_EQ("316", message.repeated_bytes (1)); + + EXPECT_EQ(317, message.repeatedgroup (1).a()); + EXPECT_EQ(318, message.repeated_nested_message (1).bb()); + EXPECT_EQ(319, message.repeated_foreign_message(1).c()); + EXPECT_EQ(320, message.repeated_import_message (1).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.repeated_nested_enum (1)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.repeated_foreign_enum(1)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.repeated_import_enum (1)); + + + // ----------------------------------------------------------------- + + EXPECT_TRUE(message.has_default_int32 ()); + EXPECT_TRUE(message.has_default_int64 ()); + EXPECT_TRUE(message.has_default_uint32 ()); + EXPECT_TRUE(message.has_default_uint64 ()); + EXPECT_TRUE(message.has_default_sint32 ()); + EXPECT_TRUE(message.has_default_sint64 ()); + EXPECT_TRUE(message.has_default_fixed32 ()); + EXPECT_TRUE(message.has_default_fixed64 ()); + EXPECT_TRUE(message.has_default_sfixed32()); + EXPECT_TRUE(message.has_default_sfixed64()); + EXPECT_TRUE(message.has_default_float ()); + EXPECT_TRUE(message.has_default_double ()); + EXPECT_TRUE(message.has_default_bool ()); + EXPECT_TRUE(message.has_default_string ()); + EXPECT_TRUE(message.has_default_bytes ()); + + EXPECT_TRUE(message.has_default_nested_enum ()); + EXPECT_TRUE(message.has_default_foreign_enum()); + EXPECT_TRUE(message.has_default_import_enum ()); + + + EXPECT_EQ(401 , message.default_int32 ()); + EXPECT_EQ(402 , message.default_int64 ()); + EXPECT_EQ(403 , message.default_uint32 ()); + EXPECT_EQ(404 , message.default_uint64 ()); + EXPECT_EQ(405 , message.default_sint32 ()); + EXPECT_EQ(406 , message.default_sint64 ()); + EXPECT_EQ(407 , message.default_fixed32 ()); + EXPECT_EQ(408 , message.default_fixed64 ()); + EXPECT_EQ(409 , message.default_sfixed32()); + EXPECT_EQ(410 , message.default_sfixed64()); + EXPECT_EQ(411 , message.default_float ()); + EXPECT_EQ(412 , message.default_double ()); + EXPECT_EQ(false, message.default_bool ()); + EXPECT_EQ("415", message.default_string ()); + EXPECT_EQ("416", message.default_bytes ()); + + EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.default_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.default_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.default_import_enum ()); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectClear(const unittest::TestAllTypesLite& message) { + // has_blah() should initially be false for all optional fields. + EXPECT_FALSE(message.has_optional_int32 ()); + EXPECT_FALSE(message.has_optional_int64 ()); + EXPECT_FALSE(message.has_optional_uint32 ()); + EXPECT_FALSE(message.has_optional_uint64 ()); + EXPECT_FALSE(message.has_optional_sint32 ()); + EXPECT_FALSE(message.has_optional_sint64 ()); + EXPECT_FALSE(message.has_optional_fixed32 ()); + EXPECT_FALSE(message.has_optional_fixed64 ()); + EXPECT_FALSE(message.has_optional_sfixed32()); + EXPECT_FALSE(message.has_optional_sfixed64()); + EXPECT_FALSE(message.has_optional_float ()); + EXPECT_FALSE(message.has_optional_double ()); + EXPECT_FALSE(message.has_optional_bool ()); + EXPECT_FALSE(message.has_optional_string ()); + EXPECT_FALSE(message.has_optional_bytes ()); + + EXPECT_FALSE(message.has_optionalgroup ()); + EXPECT_FALSE(message.has_optional_nested_message ()); + EXPECT_FALSE(message.has_optional_foreign_message()); + EXPECT_FALSE(message.has_optional_import_message ()); + + EXPECT_FALSE(message.has_optional_nested_enum ()); + EXPECT_FALSE(message.has_optional_foreign_enum()); + EXPECT_FALSE(message.has_optional_import_enum ()); + + + // Optional fields without defaults are set to zero or something like it. + EXPECT_EQ(0 , message.optional_int32 ()); + EXPECT_EQ(0 , message.optional_int64 ()); + EXPECT_EQ(0 , message.optional_uint32 ()); + EXPECT_EQ(0 , message.optional_uint64 ()); + EXPECT_EQ(0 , message.optional_sint32 ()); + EXPECT_EQ(0 , message.optional_sint64 ()); + EXPECT_EQ(0 , message.optional_fixed32 ()); + EXPECT_EQ(0 , message.optional_fixed64 ()); + EXPECT_EQ(0 , message.optional_sfixed32()); + EXPECT_EQ(0 , message.optional_sfixed64()); + EXPECT_EQ(0 , message.optional_float ()); + EXPECT_EQ(0 , message.optional_double ()); + EXPECT_EQ(false, message.optional_bool ()); + EXPECT_EQ("" , message.optional_string ()); + EXPECT_EQ("" , message.optional_bytes ()); + + // Embedded messages should also be clear. + EXPECT_FALSE(message.optionalgroup ().has_a()); + EXPECT_FALSE(message.optional_nested_message ().has_bb()); + EXPECT_FALSE(message.optional_foreign_message().has_c()); + EXPECT_FALSE(message.optional_import_message ().has_d()); + + EXPECT_EQ(0, message.optionalgroup ().a()); + EXPECT_EQ(0, message.optional_nested_message ().bb()); + EXPECT_EQ(0, message.optional_foreign_message().c()); + EXPECT_EQ(0, message.optional_import_message ().d()); + + // Enums without defaults are set to the first value in the enum. + EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.optional_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.optional_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.optional_import_enum ()); + + + // Repeated fields are empty. + EXPECT_EQ(0, message.repeated_int32_size ()); + EXPECT_EQ(0, message.repeated_int64_size ()); + EXPECT_EQ(0, message.repeated_uint32_size ()); + EXPECT_EQ(0, message.repeated_uint64_size ()); + EXPECT_EQ(0, message.repeated_sint32_size ()); + EXPECT_EQ(0, message.repeated_sint64_size ()); + EXPECT_EQ(0, message.repeated_fixed32_size ()); + EXPECT_EQ(0, message.repeated_fixed64_size ()); + EXPECT_EQ(0, message.repeated_sfixed32_size()); + EXPECT_EQ(0, message.repeated_sfixed64_size()); + EXPECT_EQ(0, message.repeated_float_size ()); + EXPECT_EQ(0, message.repeated_double_size ()); + EXPECT_EQ(0, message.repeated_bool_size ()); + EXPECT_EQ(0, message.repeated_string_size ()); + EXPECT_EQ(0, message.repeated_bytes_size ()); + + EXPECT_EQ(0, message.repeatedgroup_size ()); + EXPECT_EQ(0, message.repeated_nested_message_size ()); + EXPECT_EQ(0, message.repeated_foreign_message_size()); + EXPECT_EQ(0, message.repeated_import_message_size ()); + EXPECT_EQ(0, message.repeated_nested_enum_size ()); + EXPECT_EQ(0, message.repeated_foreign_enum_size ()); + EXPECT_EQ(0, message.repeated_import_enum_size ()); + + + // has_blah() should also be false for all default fields. + EXPECT_FALSE(message.has_default_int32 ()); + EXPECT_FALSE(message.has_default_int64 ()); + EXPECT_FALSE(message.has_default_uint32 ()); + EXPECT_FALSE(message.has_default_uint64 ()); + EXPECT_FALSE(message.has_default_sint32 ()); + EXPECT_FALSE(message.has_default_sint64 ()); + EXPECT_FALSE(message.has_default_fixed32 ()); + EXPECT_FALSE(message.has_default_fixed64 ()); + EXPECT_FALSE(message.has_default_sfixed32()); + EXPECT_FALSE(message.has_default_sfixed64()); + EXPECT_FALSE(message.has_default_float ()); + EXPECT_FALSE(message.has_default_double ()); + EXPECT_FALSE(message.has_default_bool ()); + EXPECT_FALSE(message.has_default_string ()); + EXPECT_FALSE(message.has_default_bytes ()); + + EXPECT_FALSE(message.has_default_nested_enum ()); + EXPECT_FALSE(message.has_default_foreign_enum()); + EXPECT_FALSE(message.has_default_import_enum ()); + + + // Fields with defaults have their default values (duh). + EXPECT_EQ( 41 , message.default_int32 ()); + EXPECT_EQ( 42 , message.default_int64 ()); + EXPECT_EQ( 43 , message.default_uint32 ()); + EXPECT_EQ( 44 , message.default_uint64 ()); + EXPECT_EQ(-45 , message.default_sint32 ()); + EXPECT_EQ( 46 , message.default_sint64 ()); + EXPECT_EQ( 47 , message.default_fixed32 ()); + EXPECT_EQ( 48 , message.default_fixed64 ()); + EXPECT_EQ( 49 , message.default_sfixed32()); + EXPECT_EQ(-50 , message.default_sfixed64()); + EXPECT_EQ( 51.5 , message.default_float ()); + EXPECT_EQ( 52e3 , message.default_double ()); + EXPECT_EQ(true , message.default_bool ()); + EXPECT_EQ("hello", message.default_string ()); + EXPECT_EQ("world", message.default_bytes ()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.default_nested_enum ()); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.default_foreign_enum()); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.default_import_enum ()); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectRepeatedFieldsModified( + const unittest::TestAllTypesLite& message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + ASSERT_EQ(2, message.repeated_int32_size ()); + ASSERT_EQ(2, message.repeated_int64_size ()); + ASSERT_EQ(2, message.repeated_uint32_size ()); + ASSERT_EQ(2, message.repeated_uint64_size ()); + ASSERT_EQ(2, message.repeated_sint32_size ()); + ASSERT_EQ(2, message.repeated_sint64_size ()); + ASSERT_EQ(2, message.repeated_fixed32_size ()); + ASSERT_EQ(2, message.repeated_fixed64_size ()); + ASSERT_EQ(2, message.repeated_sfixed32_size()); + ASSERT_EQ(2, message.repeated_sfixed64_size()); + ASSERT_EQ(2, message.repeated_float_size ()); + ASSERT_EQ(2, message.repeated_double_size ()); + ASSERT_EQ(2, message.repeated_bool_size ()); + ASSERT_EQ(2, message.repeated_string_size ()); + ASSERT_EQ(2, message.repeated_bytes_size ()); + + ASSERT_EQ(2, message.repeatedgroup_size ()); + ASSERT_EQ(2, message.repeated_nested_message_size ()); + ASSERT_EQ(2, message.repeated_foreign_message_size()); + ASSERT_EQ(2, message.repeated_import_message_size ()); + ASSERT_EQ(2, message.repeated_nested_enum_size ()); + ASSERT_EQ(2, message.repeated_foreign_enum_size ()); + ASSERT_EQ(2, message.repeated_import_enum_size ()); + + + EXPECT_EQ(201 , message.repeated_int32 (0)); + EXPECT_EQ(202 , message.repeated_int64 (0)); + EXPECT_EQ(203 , message.repeated_uint32 (0)); + EXPECT_EQ(204 , message.repeated_uint64 (0)); + EXPECT_EQ(205 , message.repeated_sint32 (0)); + EXPECT_EQ(206 , message.repeated_sint64 (0)); + EXPECT_EQ(207 , message.repeated_fixed32 (0)); + EXPECT_EQ(208 , message.repeated_fixed64 (0)); + EXPECT_EQ(209 , message.repeated_sfixed32(0)); + EXPECT_EQ(210 , message.repeated_sfixed64(0)); + EXPECT_EQ(211 , message.repeated_float (0)); + EXPECT_EQ(212 , message.repeated_double (0)); + EXPECT_EQ(true , message.repeated_bool (0)); + EXPECT_EQ("215", message.repeated_string (0)); + EXPECT_EQ("216", message.repeated_bytes (0)); + + EXPECT_EQ(217, message.repeatedgroup (0).a()); + EXPECT_EQ(218, message.repeated_nested_message (0).bb()); + EXPECT_EQ(219, message.repeated_foreign_message(0).c()); + EXPECT_EQ(220, message.repeated_import_message (0).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.repeated_nested_enum (0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.repeated_foreign_enum(0)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.repeated_import_enum (0)); + + + // Actually verify the second (modified) elements now. + EXPECT_EQ(501 , message.repeated_int32 (1)); + EXPECT_EQ(502 , message.repeated_int64 (1)); + EXPECT_EQ(503 , message.repeated_uint32 (1)); + EXPECT_EQ(504 , message.repeated_uint64 (1)); + EXPECT_EQ(505 , message.repeated_sint32 (1)); + EXPECT_EQ(506 , message.repeated_sint64 (1)); + EXPECT_EQ(507 , message.repeated_fixed32 (1)); + EXPECT_EQ(508 , message.repeated_fixed64 (1)); + EXPECT_EQ(509 , message.repeated_sfixed32(1)); + EXPECT_EQ(510 , message.repeated_sfixed64(1)); + EXPECT_EQ(511 , message.repeated_float (1)); + EXPECT_EQ(512 , message.repeated_double (1)); + EXPECT_EQ(true , message.repeated_bool (1)); + EXPECT_EQ("515", message.repeated_string (1)); + EXPECT_EQ("516", message.repeated_bytes (1)); + + EXPECT_EQ(517, message.repeatedgroup (1).a()); + EXPECT_EQ(518, message.repeated_nested_message (1).bb()); + EXPECT_EQ(519, message.repeated_foreign_message(1).c()); + EXPECT_EQ(520, message.repeated_import_message (1).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.repeated_nested_enum (1)); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.repeated_foreign_enum(1)); + EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.repeated_import_enum (1)); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::SetPackedFields(unittest::TestPackedTypesLite* message) { + message->add_packed_int32 (601); + message->add_packed_int64 (602); + message->add_packed_uint32 (603); + message->add_packed_uint64 (604); + message->add_packed_sint32 (605); + message->add_packed_sint64 (606); + message->add_packed_fixed32 (607); + message->add_packed_fixed64 (608); + message->add_packed_sfixed32(609); + message->add_packed_sfixed64(610); + message->add_packed_float (611); + message->add_packed_double (612); + message->add_packed_bool (true); + message->add_packed_enum (unittest::FOREIGN_LITE_BAR); + // add a second one of each field + message->add_packed_int32 (701); + message->add_packed_int64 (702); + message->add_packed_uint32 (703); + message->add_packed_uint64 (704); + message->add_packed_sint32 (705); + message->add_packed_sint64 (706); + message->add_packed_fixed32 (707); + message->add_packed_fixed64 (708); + message->add_packed_sfixed32(709); + message->add_packed_sfixed64(710); + message->add_packed_float (711); + message->add_packed_double (712); + message->add_packed_bool (false); + message->add_packed_enum (unittest::FOREIGN_LITE_BAZ); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ModifyPackedFields(unittest::TestPackedTypesLite* message) { + message->set_packed_int32 (1, 801); + message->set_packed_int64 (1, 802); + message->set_packed_uint32 (1, 803); + message->set_packed_uint64 (1, 804); + message->set_packed_sint32 (1, 805); + message->set_packed_sint64 (1, 806); + message->set_packed_fixed32 (1, 807); + message->set_packed_fixed64 (1, 808); + message->set_packed_sfixed32(1, 809); + message->set_packed_sfixed64(1, 810); + message->set_packed_float (1, 811); + message->set_packed_double (1, 812); + message->set_packed_bool (1, true); + message->set_packed_enum (1, unittest::FOREIGN_LITE_FOO); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectPackedFieldsSet( + const unittest::TestPackedTypesLite& message) { + ASSERT_EQ(2, message.packed_int32_size ()); + ASSERT_EQ(2, message.packed_int64_size ()); + ASSERT_EQ(2, message.packed_uint32_size ()); + ASSERT_EQ(2, message.packed_uint64_size ()); + ASSERT_EQ(2, message.packed_sint32_size ()); + ASSERT_EQ(2, message.packed_sint64_size ()); + ASSERT_EQ(2, message.packed_fixed32_size ()); + ASSERT_EQ(2, message.packed_fixed64_size ()); + ASSERT_EQ(2, message.packed_sfixed32_size()); + ASSERT_EQ(2, message.packed_sfixed64_size()); + ASSERT_EQ(2, message.packed_float_size ()); + ASSERT_EQ(2, message.packed_double_size ()); + ASSERT_EQ(2, message.packed_bool_size ()); + ASSERT_EQ(2, message.packed_enum_size ()); + + EXPECT_EQ(601 , message.packed_int32 (0)); + EXPECT_EQ(602 , message.packed_int64 (0)); + EXPECT_EQ(603 , message.packed_uint32 (0)); + EXPECT_EQ(604 , message.packed_uint64 (0)); + EXPECT_EQ(605 , message.packed_sint32 (0)); + EXPECT_EQ(606 , message.packed_sint64 (0)); + EXPECT_EQ(607 , message.packed_fixed32 (0)); + EXPECT_EQ(608 , message.packed_fixed64 (0)); + EXPECT_EQ(609 , message.packed_sfixed32(0)); + EXPECT_EQ(610 , message.packed_sfixed64(0)); + EXPECT_EQ(611 , message.packed_float (0)); + EXPECT_EQ(612 , message.packed_double (0)); + EXPECT_EQ(true , message.packed_bool (0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0)); + + EXPECT_EQ(701 , message.packed_int32 (1)); + EXPECT_EQ(702 , message.packed_int64 (1)); + EXPECT_EQ(703 , message.packed_uint32 (1)); + EXPECT_EQ(704 , message.packed_uint64 (1)); + EXPECT_EQ(705 , message.packed_sint32 (1)); + EXPECT_EQ(706 , message.packed_sint64 (1)); + EXPECT_EQ(707 , message.packed_fixed32 (1)); + EXPECT_EQ(708 , message.packed_fixed64 (1)); + EXPECT_EQ(709 , message.packed_sfixed32(1)); + EXPECT_EQ(710 , message.packed_sfixed64(1)); + EXPECT_EQ(711 , message.packed_float (1)); + EXPECT_EQ(712 , message.packed_double (1)); + EXPECT_EQ(false, message.packed_bool (1)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAZ, message.packed_enum(1)); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectPackedClear( + const unittest::TestPackedTypesLite& message) { + // Packed repeated fields are empty. + EXPECT_EQ(0, message.packed_int32_size ()); + EXPECT_EQ(0, message.packed_int64_size ()); + EXPECT_EQ(0, message.packed_uint32_size ()); + EXPECT_EQ(0, message.packed_uint64_size ()); + EXPECT_EQ(0, message.packed_sint32_size ()); + EXPECT_EQ(0, message.packed_sint64_size ()); + EXPECT_EQ(0, message.packed_fixed32_size ()); + EXPECT_EQ(0, message.packed_fixed64_size ()); + EXPECT_EQ(0, message.packed_sfixed32_size()); + EXPECT_EQ(0, message.packed_sfixed64_size()); + EXPECT_EQ(0, message.packed_float_size ()); + EXPECT_EQ(0, message.packed_double_size ()); + EXPECT_EQ(0, message.packed_bool_size ()); + EXPECT_EQ(0, message.packed_enum_size ()); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectPackedFieldsModified( + const unittest::TestPackedTypesLite& message) { + // Do the same for packed repeated fields. + ASSERT_EQ(2, message.packed_int32_size ()); + ASSERT_EQ(2, message.packed_int64_size ()); + ASSERT_EQ(2, message.packed_uint32_size ()); + ASSERT_EQ(2, message.packed_uint64_size ()); + ASSERT_EQ(2, message.packed_sint32_size ()); + ASSERT_EQ(2, message.packed_sint64_size ()); + ASSERT_EQ(2, message.packed_fixed32_size ()); + ASSERT_EQ(2, message.packed_fixed64_size ()); + ASSERT_EQ(2, message.packed_sfixed32_size()); + ASSERT_EQ(2, message.packed_sfixed64_size()); + ASSERT_EQ(2, message.packed_float_size ()); + ASSERT_EQ(2, message.packed_double_size ()); + ASSERT_EQ(2, message.packed_bool_size ()); + ASSERT_EQ(2, message.packed_enum_size ()); + + EXPECT_EQ(601 , message.packed_int32 (0)); + EXPECT_EQ(602 , message.packed_int64 (0)); + EXPECT_EQ(603 , message.packed_uint32 (0)); + EXPECT_EQ(604 , message.packed_uint64 (0)); + EXPECT_EQ(605 , message.packed_sint32 (0)); + EXPECT_EQ(606 , message.packed_sint64 (0)); + EXPECT_EQ(607 , message.packed_fixed32 (0)); + EXPECT_EQ(608 , message.packed_fixed64 (0)); + EXPECT_EQ(609 , message.packed_sfixed32(0)); + EXPECT_EQ(610 , message.packed_sfixed64(0)); + EXPECT_EQ(611 , message.packed_float (0)); + EXPECT_EQ(612 , message.packed_double (0)); + EXPECT_EQ(true , message.packed_bool (0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR, message.packed_enum(0)); + // Actually verify the second (modified) elements now. + EXPECT_EQ(801 , message.packed_int32 (1)); + EXPECT_EQ(802 , message.packed_int64 (1)); + EXPECT_EQ(803 , message.packed_uint32 (1)); + EXPECT_EQ(804 , message.packed_uint64 (1)); + EXPECT_EQ(805 , message.packed_sint32 (1)); + EXPECT_EQ(806 , message.packed_sint64 (1)); + EXPECT_EQ(807 , message.packed_fixed32 (1)); + EXPECT_EQ(808 , message.packed_fixed64 (1)); + EXPECT_EQ(809 , message.packed_sfixed32(1)); + EXPECT_EQ(810 , message.packed_sfixed64(1)); + EXPECT_EQ(811 , message.packed_float (1)); + EXPECT_EQ(812 , message.packed_double (1)); + EXPECT_EQ(true , message.packed_bool (1)); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO, message.packed_enum(1)); +} + +// =================================================================== +// Extensions +// +// All this code is exactly equivalent to the above code except that it's +// manipulating extension fields instead of normal ones. +// +// I gave up on the 80-char limit here. Sorry. + +void TestUtilLite::SetAllExtensions(unittest::TestAllExtensionsLite* message) { + message->SetExtension(unittest::optional_int32_extension_lite , 101); + message->SetExtension(unittest::optional_int64_extension_lite , 102); + message->SetExtension(unittest::optional_uint32_extension_lite , 103); + message->SetExtension(unittest::optional_uint64_extension_lite , 104); + message->SetExtension(unittest::optional_sint32_extension_lite , 105); + message->SetExtension(unittest::optional_sint64_extension_lite , 106); + message->SetExtension(unittest::optional_fixed32_extension_lite , 107); + message->SetExtension(unittest::optional_fixed64_extension_lite , 108); + message->SetExtension(unittest::optional_sfixed32_extension_lite, 109); + message->SetExtension(unittest::optional_sfixed64_extension_lite, 110); + message->SetExtension(unittest::optional_float_extension_lite , 111); + message->SetExtension(unittest::optional_double_extension_lite , 112); + message->SetExtension(unittest::optional_bool_extension_lite , true); + message->SetExtension(unittest::optional_string_extension_lite , "115"); + message->SetExtension(unittest::optional_bytes_extension_lite , "116"); + + message->MutableExtension(unittest::optionalgroup_extension_lite )->set_a(117); + message->MutableExtension(unittest::optional_nested_message_extension_lite )->set_bb(118); + message->MutableExtension(unittest::optional_foreign_message_extension_lite)->set_c(119); + message->MutableExtension(unittest::optional_import_message_extension_lite )->set_d(120); + + message->SetExtension(unittest::optional_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ ); + message->SetExtension(unittest::optional_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ ); + message->SetExtension(unittest::optional_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ); + + + // ----------------------------------------------------------------- + + message->AddExtension(unittest::repeated_int32_extension_lite , 201); + message->AddExtension(unittest::repeated_int64_extension_lite , 202); + message->AddExtension(unittest::repeated_uint32_extension_lite , 203); + message->AddExtension(unittest::repeated_uint64_extension_lite , 204); + message->AddExtension(unittest::repeated_sint32_extension_lite , 205); + message->AddExtension(unittest::repeated_sint64_extension_lite , 206); + message->AddExtension(unittest::repeated_fixed32_extension_lite , 207); + message->AddExtension(unittest::repeated_fixed64_extension_lite , 208); + message->AddExtension(unittest::repeated_sfixed32_extension_lite, 209); + message->AddExtension(unittest::repeated_sfixed64_extension_lite, 210); + message->AddExtension(unittest::repeated_float_extension_lite , 211); + message->AddExtension(unittest::repeated_double_extension_lite , 212); + message->AddExtension(unittest::repeated_bool_extension_lite , true); + message->AddExtension(unittest::repeated_string_extension_lite , "215"); + message->AddExtension(unittest::repeated_bytes_extension_lite , "216"); + + message->AddExtension(unittest::repeatedgroup_extension_lite )->set_a(217); + message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(218); + message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(219); + message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(220); + + message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAR ); + message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAR ); + message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAR); + + + // Add a second one of each field. + message->AddExtension(unittest::repeated_int32_extension_lite , 301); + message->AddExtension(unittest::repeated_int64_extension_lite , 302); + message->AddExtension(unittest::repeated_uint32_extension_lite , 303); + message->AddExtension(unittest::repeated_uint64_extension_lite , 304); + message->AddExtension(unittest::repeated_sint32_extension_lite , 305); + message->AddExtension(unittest::repeated_sint64_extension_lite , 306); + message->AddExtension(unittest::repeated_fixed32_extension_lite , 307); + message->AddExtension(unittest::repeated_fixed64_extension_lite , 308); + message->AddExtension(unittest::repeated_sfixed32_extension_lite, 309); + message->AddExtension(unittest::repeated_sfixed64_extension_lite, 310); + message->AddExtension(unittest::repeated_float_extension_lite , 311); + message->AddExtension(unittest::repeated_double_extension_lite , 312); + message->AddExtension(unittest::repeated_bool_extension_lite , false); + message->AddExtension(unittest::repeated_string_extension_lite , "315"); + message->AddExtension(unittest::repeated_bytes_extension_lite , "316"); + + message->AddExtension(unittest::repeatedgroup_extension_lite )->set_a(317); + message->AddExtension(unittest::repeated_nested_message_extension_lite )->set_bb(318); + message->AddExtension(unittest::repeated_foreign_message_extension_lite)->set_c(319); + message->AddExtension(unittest::repeated_import_message_extension_lite )->set_d(320); + + message->AddExtension(unittest::repeated_nested_enum_extension_lite , unittest::TestAllTypesLite::BAZ ); + message->AddExtension(unittest::repeated_foreign_enum_extension_lite, unittest::FOREIGN_LITE_BAZ ); + message->AddExtension(unittest::repeated_import_enum_extension_lite , unittest_import::IMPORT_LITE_BAZ); + + + // ----------------------------------------------------------------- + + message->SetExtension(unittest::default_int32_extension_lite , 401); + message->SetExtension(unittest::default_int64_extension_lite , 402); + message->SetExtension(unittest::default_uint32_extension_lite , 403); + message->SetExtension(unittest::default_uint64_extension_lite , 404); + message->SetExtension(unittest::default_sint32_extension_lite , 405); + message->SetExtension(unittest::default_sint64_extension_lite , 406); + message->SetExtension(unittest::default_fixed32_extension_lite , 407); + message->SetExtension(unittest::default_fixed64_extension_lite , 408); + message->SetExtension(unittest::default_sfixed32_extension_lite, 409); + message->SetExtension(unittest::default_sfixed64_extension_lite, 410); + message->SetExtension(unittest::default_float_extension_lite , 411); + message->SetExtension(unittest::default_double_extension_lite , 412); + message->SetExtension(unittest::default_bool_extension_lite , false); + message->SetExtension(unittest::default_string_extension_lite , "415"); + message->SetExtension(unittest::default_bytes_extension_lite , "416"); + + message->SetExtension(unittest::default_nested_enum_extension_lite , unittest::TestAllTypesLite::FOO ); + message->SetExtension(unittest::default_foreign_enum_extension_lite, unittest::FOREIGN_LITE_FOO ); + message->SetExtension(unittest::default_import_enum_extension_lite , unittest_import::IMPORT_LITE_FOO); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ModifyRepeatedExtensions( + unittest::TestAllExtensionsLite* message) { + message->SetExtension(unittest::repeated_int32_extension_lite , 1, 501); + message->SetExtension(unittest::repeated_int64_extension_lite , 1, 502); + message->SetExtension(unittest::repeated_uint32_extension_lite , 1, 503); + message->SetExtension(unittest::repeated_uint64_extension_lite , 1, 504); + message->SetExtension(unittest::repeated_sint32_extension_lite , 1, 505); + message->SetExtension(unittest::repeated_sint64_extension_lite , 1, 506); + message->SetExtension(unittest::repeated_fixed32_extension_lite , 1, 507); + message->SetExtension(unittest::repeated_fixed64_extension_lite , 1, 508); + message->SetExtension(unittest::repeated_sfixed32_extension_lite, 1, 509); + message->SetExtension(unittest::repeated_sfixed64_extension_lite, 1, 510); + message->SetExtension(unittest::repeated_float_extension_lite , 1, 511); + message->SetExtension(unittest::repeated_double_extension_lite , 1, 512); + message->SetExtension(unittest::repeated_bool_extension_lite , 1, true); + message->SetExtension(unittest::repeated_string_extension_lite , 1, "515"); + message->SetExtension(unittest::repeated_bytes_extension_lite , 1, "516"); + + message->MutableExtension(unittest::repeatedgroup_extension_lite , 1)->set_a(517); + message->MutableExtension(unittest::repeated_nested_message_extension_lite , 1)->set_bb(518); + message->MutableExtension(unittest::repeated_foreign_message_extension_lite, 1)->set_c(519); + message->MutableExtension(unittest::repeated_import_message_extension_lite , 1)->set_d(520); + + message->SetExtension(unittest::repeated_nested_enum_extension_lite , 1, unittest::TestAllTypesLite::FOO ); + message->SetExtension(unittest::repeated_foreign_enum_extension_lite, 1, unittest::FOREIGN_LITE_FOO ); + message->SetExtension(unittest::repeated_import_enum_extension_lite , 1, unittest_import::IMPORT_LITE_FOO); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectAllExtensionsSet( + const unittest::TestAllExtensionsLite& message) { + EXPECT_TRUE(message.HasExtension(unittest::optional_int32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_int64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_uint32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_uint64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_sint32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_sint64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_fixed32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_fixed64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed32_extension_lite)); + EXPECT_TRUE(message.HasExtension(unittest::optional_sfixed64_extension_lite)); + EXPECT_TRUE(message.HasExtension(unittest::optional_float_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_double_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_bool_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_string_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_bytes_extension_lite )); + + EXPECT_TRUE(message.HasExtension(unittest::optionalgroup_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_nested_message_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_message_extension_lite)); + EXPECT_TRUE(message.HasExtension(unittest::optional_import_message_extension_lite )); + + EXPECT_TRUE(message.GetExtension(unittest::optionalgroup_extension_lite ).has_a()); + EXPECT_TRUE(message.GetExtension(unittest::optional_nested_message_extension_lite ).has_bb()); + EXPECT_TRUE(message.GetExtension(unittest::optional_foreign_message_extension_lite).has_c()); + EXPECT_TRUE(message.GetExtension(unittest::optional_import_message_extension_lite ).has_d()); + + EXPECT_TRUE(message.HasExtension(unittest::optional_nested_enum_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::optional_foreign_enum_extension_lite)); + EXPECT_TRUE(message.HasExtension(unittest::optional_import_enum_extension_lite )); + + + EXPECT_EQ(101 , message.GetExtension(unittest::optional_int32_extension_lite )); + EXPECT_EQ(102 , message.GetExtension(unittest::optional_int64_extension_lite )); + EXPECT_EQ(103 , message.GetExtension(unittest::optional_uint32_extension_lite )); + EXPECT_EQ(104 , message.GetExtension(unittest::optional_uint64_extension_lite )); + EXPECT_EQ(105 , message.GetExtension(unittest::optional_sint32_extension_lite )); + EXPECT_EQ(106 , message.GetExtension(unittest::optional_sint64_extension_lite )); + EXPECT_EQ(107 , message.GetExtension(unittest::optional_fixed32_extension_lite )); + EXPECT_EQ(108 , message.GetExtension(unittest::optional_fixed64_extension_lite )); + EXPECT_EQ(109 , message.GetExtension(unittest::optional_sfixed32_extension_lite)); + EXPECT_EQ(110 , message.GetExtension(unittest::optional_sfixed64_extension_lite)); + EXPECT_EQ(111 , message.GetExtension(unittest::optional_float_extension_lite )); + EXPECT_EQ(112 , message.GetExtension(unittest::optional_double_extension_lite )); + EXPECT_EQ(true , message.GetExtension(unittest::optional_bool_extension_lite )); + EXPECT_EQ("115", message.GetExtension(unittest::optional_string_extension_lite )); + EXPECT_EQ("116", message.GetExtension(unittest::optional_bytes_extension_lite )); + + EXPECT_EQ(117, message.GetExtension(unittest::optionalgroup_extension_lite ).a()); + EXPECT_EQ(118, message.GetExtension(unittest::optional_nested_message_extension_lite ).bb()); + EXPECT_EQ(119, message.GetExtension(unittest::optional_foreign_message_extension_lite).c()); + EXPECT_EQ(120, message.GetExtension(unittest::optional_import_message_extension_lite ).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::optional_nested_enum_extension_lite )); + EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.GetExtension(unittest::optional_foreign_enum_extension_lite)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::optional_import_enum_extension_lite )); + + + // ----------------------------------------------------------------- + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite )); + + + EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension_lite , 0)); + EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension_lite , 0)); + EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension_lite , 0)); + EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension_lite , 0)); + EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension_lite , 0)); + EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension_lite , 0)); + EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0)); + EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0)); + EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0)); + EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0)); + EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension_lite , 0)); + EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension_lite , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite , 0)); + EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension_lite , 0)); + EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension_lite , 0)); + + EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite , 0).a()); + EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb()); + EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c()); + EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0)); + + + EXPECT_EQ(301 , message.GetExtension(unittest::repeated_int32_extension_lite , 1)); + EXPECT_EQ(302 , message.GetExtension(unittest::repeated_int64_extension_lite , 1)); + EXPECT_EQ(303 , message.GetExtension(unittest::repeated_uint32_extension_lite , 1)); + EXPECT_EQ(304 , message.GetExtension(unittest::repeated_uint64_extension_lite , 1)); + EXPECT_EQ(305 , message.GetExtension(unittest::repeated_sint32_extension_lite , 1)); + EXPECT_EQ(306 , message.GetExtension(unittest::repeated_sint64_extension_lite , 1)); + EXPECT_EQ(307 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1)); + EXPECT_EQ(308 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1)); + EXPECT_EQ(309 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1)); + EXPECT_EQ(310 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1)); + EXPECT_EQ(311 , message.GetExtension(unittest::repeated_float_extension_lite , 1)); + EXPECT_EQ(312 , message.GetExtension(unittest::repeated_double_extension_lite , 1)); + EXPECT_EQ(false, message.GetExtension(unittest::repeated_bool_extension_lite , 1)); + EXPECT_EQ("315", message.GetExtension(unittest::repeated_string_extension_lite , 1)); + EXPECT_EQ("316", message.GetExtension(unittest::repeated_bytes_extension_lite , 1)); + + EXPECT_EQ(317, message.GetExtension(unittest::repeatedgroup_extension_lite , 1).a()); + EXPECT_EQ(318, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb()); + EXPECT_EQ(319, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c()); + EXPECT_EQ(320, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAZ , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAZ , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAZ, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1)); + + + // ----------------------------------------------------------------- + + EXPECT_TRUE(message.HasExtension(unittest::default_int32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_int64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_uint32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_uint64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_sint32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_sint64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_fixed32_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_fixed64_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_sfixed32_extension_lite)); + EXPECT_TRUE(message.HasExtension(unittest::default_sfixed64_extension_lite)); + EXPECT_TRUE(message.HasExtension(unittest::default_float_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_double_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_bool_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_string_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_bytes_extension_lite )); + + EXPECT_TRUE(message.HasExtension(unittest::default_nested_enum_extension_lite )); + EXPECT_TRUE(message.HasExtension(unittest::default_foreign_enum_extension_lite)); + EXPECT_TRUE(message.HasExtension(unittest::default_import_enum_extension_lite )); + + + EXPECT_EQ(401 , message.GetExtension(unittest::default_int32_extension_lite )); + EXPECT_EQ(402 , message.GetExtension(unittest::default_int64_extension_lite )); + EXPECT_EQ(403 , message.GetExtension(unittest::default_uint32_extension_lite )); + EXPECT_EQ(404 , message.GetExtension(unittest::default_uint64_extension_lite )); + EXPECT_EQ(405 , message.GetExtension(unittest::default_sint32_extension_lite )); + EXPECT_EQ(406 , message.GetExtension(unittest::default_sint64_extension_lite )); + EXPECT_EQ(407 , message.GetExtension(unittest::default_fixed32_extension_lite )); + EXPECT_EQ(408 , message.GetExtension(unittest::default_fixed64_extension_lite )); + EXPECT_EQ(409 , message.GetExtension(unittest::default_sfixed32_extension_lite)); + EXPECT_EQ(410 , message.GetExtension(unittest::default_sfixed64_extension_lite)); + EXPECT_EQ(411 , message.GetExtension(unittest::default_float_extension_lite )); + EXPECT_EQ(412 , message.GetExtension(unittest::default_double_extension_lite )); + EXPECT_EQ(false, message.GetExtension(unittest::default_bool_extension_lite )); + EXPECT_EQ("415", message.GetExtension(unittest::default_string_extension_lite )); + EXPECT_EQ("416", message.GetExtension(unittest::default_bytes_extension_lite )); + + EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::default_nested_enum_extension_lite )); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.GetExtension(unittest::default_foreign_enum_extension_lite)); + EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::default_import_enum_extension_lite )); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectExtensionsClear( + const unittest::TestAllExtensionsLite& message) { + string serialized; + ASSERT_TRUE(message.SerializeToString(&serialized)); + EXPECT_EQ("", serialized); + EXPECT_EQ(0, message.ByteSize()); + + // has_blah() should initially be false for all optional fields. + EXPECT_FALSE(message.HasExtension(unittest::optional_int32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_int64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_uint32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_uint64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_sint32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_sint64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_fixed32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_fixed64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed32_extension_lite)); + EXPECT_FALSE(message.HasExtension(unittest::optional_sfixed64_extension_lite)); + EXPECT_FALSE(message.HasExtension(unittest::optional_float_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_double_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_bool_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_string_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_bytes_extension_lite )); + + EXPECT_FALSE(message.HasExtension(unittest::optionalgroup_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_nested_message_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_message_extension_lite)); + EXPECT_FALSE(message.HasExtension(unittest::optional_import_message_extension_lite )); + + EXPECT_FALSE(message.HasExtension(unittest::optional_nested_enum_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::optional_foreign_enum_extension_lite)); + EXPECT_FALSE(message.HasExtension(unittest::optional_import_enum_extension_lite )); + + + // Optional fields without defaults are set to zero or something like it. + EXPECT_EQ(0 , message.GetExtension(unittest::optional_int32_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_int64_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint32_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_uint64_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint32_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sint64_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed32_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_fixed64_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed32_extension_lite)); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_sfixed64_extension_lite)); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_float_extension_lite )); + EXPECT_EQ(0 , message.GetExtension(unittest::optional_double_extension_lite )); + EXPECT_EQ(false, message.GetExtension(unittest::optional_bool_extension_lite )); + EXPECT_EQ("" , message.GetExtension(unittest::optional_string_extension_lite )); + EXPECT_EQ("" , message.GetExtension(unittest::optional_bytes_extension_lite )); + + // Embedded messages should also be clear. + EXPECT_FALSE(message.GetExtension(unittest::optionalgroup_extension_lite ).has_a()); + EXPECT_FALSE(message.GetExtension(unittest::optional_nested_message_extension_lite ).has_bb()); + EXPECT_FALSE(message.GetExtension(unittest::optional_foreign_message_extension_lite).has_c()); + EXPECT_FALSE(message.GetExtension(unittest::optional_import_message_extension_lite ).has_d()); + + EXPECT_EQ(0, message.GetExtension(unittest::optionalgroup_extension_lite ).a()); + EXPECT_EQ(0, message.GetExtension(unittest::optional_nested_message_extension_lite ).bb()); + EXPECT_EQ(0, message.GetExtension(unittest::optional_foreign_message_extension_lite).c()); + EXPECT_EQ(0, message.GetExtension(unittest::optional_import_message_extension_lite ).d()); + + // Enums without defaults are set to the first value in the enum. + EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::optional_nested_enum_extension_lite )); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.GetExtension(unittest::optional_foreign_enum_extension_lite)); + EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::optional_import_enum_extension_lite )); + + + // Repeated fields are empty. + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_int64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_uint64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sint64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_fixed64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite)); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite)); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_float_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_double_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bool_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_string_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_bytes_extension_lite )); + + EXPECT_EQ(0, message.ExtensionSize(unittest::repeatedgroup_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_message_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite)); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_message_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::repeated_import_enum_extension_lite )); + + + // has_blah() should also be false for all default fields. + EXPECT_FALSE(message.HasExtension(unittest::default_int32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_int64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_uint32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_uint64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_sint32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_sint64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_fixed32_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_fixed64_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_sfixed32_extension_lite)); + EXPECT_FALSE(message.HasExtension(unittest::default_sfixed64_extension_lite)); + EXPECT_FALSE(message.HasExtension(unittest::default_float_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_double_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_bool_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_string_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_bytes_extension_lite )); + + EXPECT_FALSE(message.HasExtension(unittest::default_nested_enum_extension_lite )); + EXPECT_FALSE(message.HasExtension(unittest::default_foreign_enum_extension_lite)); + EXPECT_FALSE(message.HasExtension(unittest::default_import_enum_extension_lite )); + + + // Fields with defaults have their default values (duh). + EXPECT_EQ( 41 , message.GetExtension(unittest::default_int32_extension_lite )); + EXPECT_EQ( 42 , message.GetExtension(unittest::default_int64_extension_lite )); + EXPECT_EQ( 43 , message.GetExtension(unittest::default_uint32_extension_lite )); + EXPECT_EQ( 44 , message.GetExtension(unittest::default_uint64_extension_lite )); + EXPECT_EQ(-45 , message.GetExtension(unittest::default_sint32_extension_lite )); + EXPECT_EQ( 46 , message.GetExtension(unittest::default_sint64_extension_lite )); + EXPECT_EQ( 47 , message.GetExtension(unittest::default_fixed32_extension_lite )); + EXPECT_EQ( 48 , message.GetExtension(unittest::default_fixed64_extension_lite )); + EXPECT_EQ( 49 , message.GetExtension(unittest::default_sfixed32_extension_lite)); + EXPECT_EQ(-50 , message.GetExtension(unittest::default_sfixed64_extension_lite)); + EXPECT_EQ( 51.5 , message.GetExtension(unittest::default_float_extension_lite )); + EXPECT_EQ( 52e3 , message.GetExtension(unittest::default_double_extension_lite )); + EXPECT_EQ(true , message.GetExtension(unittest::default_bool_extension_lite )); + EXPECT_EQ("hello", message.GetExtension(unittest::default_string_extension_lite )); + EXPECT_EQ("world", message.GetExtension(unittest::default_bytes_extension_lite )); + + EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::default_nested_enum_extension_lite )); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.GetExtension(unittest::default_foreign_enum_extension_lite)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::default_import_enum_extension_lite )); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectRepeatedExtensionsModified( + const unittest::TestAllExtensionsLite& message) { + // ModifyRepeatedFields only sets the second repeated element of each + // field. In addition to verifying this, we also verify that the first + // element and size were *not* modified. + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_int64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_uint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_fixed64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed32_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_sfixed64_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_float_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_double_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bool_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_string_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_bytes_extension_lite )); + + ASSERT_EQ(2, message.ExtensionSize(unittest::repeatedgroup_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_message_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_message_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_message_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_nested_enum_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_foreign_enum_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::repeated_import_enum_extension_lite )); + + + EXPECT_EQ(201 , message.GetExtension(unittest::repeated_int32_extension_lite , 0)); + EXPECT_EQ(202 , message.GetExtension(unittest::repeated_int64_extension_lite , 0)); + EXPECT_EQ(203 , message.GetExtension(unittest::repeated_uint32_extension_lite , 0)); + EXPECT_EQ(204 , message.GetExtension(unittest::repeated_uint64_extension_lite , 0)); + EXPECT_EQ(205 , message.GetExtension(unittest::repeated_sint32_extension_lite , 0)); + EXPECT_EQ(206 , message.GetExtension(unittest::repeated_sint64_extension_lite , 0)); + EXPECT_EQ(207 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 0)); + EXPECT_EQ(208 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 0)); + EXPECT_EQ(209 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 0)); + EXPECT_EQ(210 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 0)); + EXPECT_EQ(211 , message.GetExtension(unittest::repeated_float_extension_lite , 0)); + EXPECT_EQ(212 , message.GetExtension(unittest::repeated_double_extension_lite , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite , 0)); + EXPECT_EQ("215", message.GetExtension(unittest::repeated_string_extension_lite , 0)); + EXPECT_EQ("216", message.GetExtension(unittest::repeated_bytes_extension_lite , 0)); + + EXPECT_EQ(217, message.GetExtension(unittest::repeatedgroup_extension_lite , 0).a()); + EXPECT_EQ(218, message.GetExtension(unittest::repeated_nested_message_extension_lite , 0).bb()); + EXPECT_EQ(219, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 0).c()); + EXPECT_EQ(220, message.GetExtension(unittest::repeated_import_message_extension_lite , 0).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::BAR , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 0)); + EXPECT_EQ(unittest_import::IMPORT_LITE_BAR, message.GetExtension(unittest::repeated_import_enum_extension_lite , 0)); + + + // Actually verify the second (modified) elements now. + EXPECT_EQ(501 , message.GetExtension(unittest::repeated_int32_extension_lite , 1)); + EXPECT_EQ(502 , message.GetExtension(unittest::repeated_int64_extension_lite , 1)); + EXPECT_EQ(503 , message.GetExtension(unittest::repeated_uint32_extension_lite , 1)); + EXPECT_EQ(504 , message.GetExtension(unittest::repeated_uint64_extension_lite , 1)); + EXPECT_EQ(505 , message.GetExtension(unittest::repeated_sint32_extension_lite , 1)); + EXPECT_EQ(506 , message.GetExtension(unittest::repeated_sint64_extension_lite , 1)); + EXPECT_EQ(507 , message.GetExtension(unittest::repeated_fixed32_extension_lite , 1)); + EXPECT_EQ(508 , message.GetExtension(unittest::repeated_fixed64_extension_lite , 1)); + EXPECT_EQ(509 , message.GetExtension(unittest::repeated_sfixed32_extension_lite, 1)); + EXPECT_EQ(510 , message.GetExtension(unittest::repeated_sfixed64_extension_lite, 1)); + EXPECT_EQ(511 , message.GetExtension(unittest::repeated_float_extension_lite , 1)); + EXPECT_EQ(512 , message.GetExtension(unittest::repeated_double_extension_lite , 1)); + EXPECT_EQ(true , message.GetExtension(unittest::repeated_bool_extension_lite , 1)); + EXPECT_EQ("515", message.GetExtension(unittest::repeated_string_extension_lite , 1)); + EXPECT_EQ("516", message.GetExtension(unittest::repeated_bytes_extension_lite , 1)); + + EXPECT_EQ(517, message.GetExtension(unittest::repeatedgroup_extension_lite , 1).a()); + EXPECT_EQ(518, message.GetExtension(unittest::repeated_nested_message_extension_lite , 1).bb()); + EXPECT_EQ(519, message.GetExtension(unittest::repeated_foreign_message_extension_lite, 1).c()); + EXPECT_EQ(520, message.GetExtension(unittest::repeated_import_message_extension_lite , 1).d()); + + EXPECT_EQ(unittest::TestAllTypesLite::FOO , message.GetExtension(unittest::repeated_nested_enum_extension_lite , 1)); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO , message.GetExtension(unittest::repeated_foreign_enum_extension_lite, 1)); + EXPECT_EQ(unittest_import::IMPORT_LITE_FOO, message.GetExtension(unittest::repeated_import_enum_extension_lite , 1)); + +} + +// ------------------------------------------------------------------- + +void TestUtilLite::SetPackedExtensions( + unittest::TestPackedExtensionsLite* message) { + message->AddExtension(unittest::packed_int32_extension_lite , 601); + message->AddExtension(unittest::packed_int64_extension_lite , 602); + message->AddExtension(unittest::packed_uint32_extension_lite , 603); + message->AddExtension(unittest::packed_uint64_extension_lite , 604); + message->AddExtension(unittest::packed_sint32_extension_lite , 605); + message->AddExtension(unittest::packed_sint64_extension_lite , 606); + message->AddExtension(unittest::packed_fixed32_extension_lite , 607); + message->AddExtension(unittest::packed_fixed64_extension_lite , 608); + message->AddExtension(unittest::packed_sfixed32_extension_lite, 609); + message->AddExtension(unittest::packed_sfixed64_extension_lite, 610); + message->AddExtension(unittest::packed_float_extension_lite , 611); + message->AddExtension(unittest::packed_double_extension_lite , 612); + message->AddExtension(unittest::packed_bool_extension_lite , true); + message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAR); + // add a second one of each field + message->AddExtension(unittest::packed_int32_extension_lite , 701); + message->AddExtension(unittest::packed_int64_extension_lite , 702); + message->AddExtension(unittest::packed_uint32_extension_lite , 703); + message->AddExtension(unittest::packed_uint64_extension_lite , 704); + message->AddExtension(unittest::packed_sint32_extension_lite , 705); + message->AddExtension(unittest::packed_sint64_extension_lite , 706); + message->AddExtension(unittest::packed_fixed32_extension_lite , 707); + message->AddExtension(unittest::packed_fixed64_extension_lite , 708); + message->AddExtension(unittest::packed_sfixed32_extension_lite, 709); + message->AddExtension(unittest::packed_sfixed64_extension_lite, 710); + message->AddExtension(unittest::packed_float_extension_lite , 711); + message->AddExtension(unittest::packed_double_extension_lite , 712); + message->AddExtension(unittest::packed_bool_extension_lite , false); + message->AddExtension(unittest::packed_enum_extension_lite, unittest::FOREIGN_LITE_BAZ); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ModifyPackedExtensions( + unittest::TestPackedExtensionsLite* message) { + message->SetExtension(unittest::packed_int32_extension_lite , 1, 801); + message->SetExtension(unittest::packed_int64_extension_lite , 1, 802); + message->SetExtension(unittest::packed_uint32_extension_lite , 1, 803); + message->SetExtension(unittest::packed_uint64_extension_lite , 1, 804); + message->SetExtension(unittest::packed_sint32_extension_lite , 1, 805); + message->SetExtension(unittest::packed_sint64_extension_lite , 1, 806); + message->SetExtension(unittest::packed_fixed32_extension_lite , 1, 807); + message->SetExtension(unittest::packed_fixed64_extension_lite , 1, 808); + message->SetExtension(unittest::packed_sfixed32_extension_lite, 1, 809); + message->SetExtension(unittest::packed_sfixed64_extension_lite, 1, 810); + message->SetExtension(unittest::packed_float_extension_lite , 1, 811); + message->SetExtension(unittest::packed_double_extension_lite , 1, 812); + message->SetExtension(unittest::packed_bool_extension_lite , 1, true); + message->SetExtension(unittest::packed_enum_extension_lite , 1, + unittest::FOREIGN_LITE_FOO); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectPackedExtensionsSet( + const unittest::TestPackedExtensionsLite& message) { + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite )); + + EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension_lite , 0)); + EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension_lite , 0)); + EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension_lite , 0)); + EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension_lite , 0)); + EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension_lite , 0)); + EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension_lite , 0)); + EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension_lite , 0)); + EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension_lite , 0)); + EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0)); + EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0)); + EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension_lite , 0)); + EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension_lite , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite , 0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR, + message.GetExtension(unittest::packed_enum_extension_lite, 0)); + EXPECT_EQ(701 , message.GetExtension(unittest::packed_int32_extension_lite , 1)); + EXPECT_EQ(702 , message.GetExtension(unittest::packed_int64_extension_lite , 1)); + EXPECT_EQ(703 , message.GetExtension(unittest::packed_uint32_extension_lite , 1)); + EXPECT_EQ(704 , message.GetExtension(unittest::packed_uint64_extension_lite , 1)); + EXPECT_EQ(705 , message.GetExtension(unittest::packed_sint32_extension_lite , 1)); + EXPECT_EQ(706 , message.GetExtension(unittest::packed_sint64_extension_lite , 1)); + EXPECT_EQ(707 , message.GetExtension(unittest::packed_fixed32_extension_lite , 1)); + EXPECT_EQ(708 , message.GetExtension(unittest::packed_fixed64_extension_lite , 1)); + EXPECT_EQ(709 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1)); + EXPECT_EQ(710 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1)); + EXPECT_EQ(711 , message.GetExtension(unittest::packed_float_extension_lite , 1)); + EXPECT_EQ(712 , message.GetExtension(unittest::packed_double_extension_lite , 1)); + EXPECT_EQ(false, message.GetExtension(unittest::packed_bool_extension_lite , 1)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAZ, + message.GetExtension(unittest::packed_enum_extension_lite, 1)); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectPackedExtensionsClear( + const unittest::TestPackedExtensionsLite& message) { + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_int64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_uint64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sint64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed32_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_fixed64_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed32_extension_lite)); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_sfixed64_extension_lite)); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_float_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_double_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_bool_extension_lite )); + EXPECT_EQ(0, message.ExtensionSize(unittest::packed_enum_extension_lite )); +} + +// ------------------------------------------------------------------- + +void TestUtilLite::ExpectPackedExtensionsModified( + const unittest::TestPackedExtensionsLite& message) { + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_int64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_uint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sint64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed32_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_fixed64_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed32_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_sfixed64_extension_lite)); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_float_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_double_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_bool_extension_lite )); + ASSERT_EQ(2, message.ExtensionSize(unittest::packed_enum_extension_lite )); + EXPECT_EQ(601 , message.GetExtension(unittest::packed_int32_extension_lite , 0)); + EXPECT_EQ(602 , message.GetExtension(unittest::packed_int64_extension_lite , 0)); + EXPECT_EQ(603 , message.GetExtension(unittest::packed_uint32_extension_lite , 0)); + EXPECT_EQ(604 , message.GetExtension(unittest::packed_uint64_extension_lite , 0)); + EXPECT_EQ(605 , message.GetExtension(unittest::packed_sint32_extension_lite , 0)); + EXPECT_EQ(606 , message.GetExtension(unittest::packed_sint64_extension_lite , 0)); + EXPECT_EQ(607 , message.GetExtension(unittest::packed_fixed32_extension_lite , 0)); + EXPECT_EQ(608 , message.GetExtension(unittest::packed_fixed64_extension_lite , 0)); + EXPECT_EQ(609 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 0)); + EXPECT_EQ(610 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 0)); + EXPECT_EQ(611 , message.GetExtension(unittest::packed_float_extension_lite , 0)); + EXPECT_EQ(612 , message.GetExtension(unittest::packed_double_extension_lite , 0)); + EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite , 0)); + EXPECT_EQ(unittest::FOREIGN_LITE_BAR, + message.GetExtension(unittest::packed_enum_extension_lite, 0)); + + // Actually verify the second (modified) elements now. + EXPECT_EQ(801 , message.GetExtension(unittest::packed_int32_extension_lite , 1)); + EXPECT_EQ(802 , message.GetExtension(unittest::packed_int64_extension_lite , 1)); + EXPECT_EQ(803 , message.GetExtension(unittest::packed_uint32_extension_lite , 1)); + EXPECT_EQ(804 , message.GetExtension(unittest::packed_uint64_extension_lite , 1)); + EXPECT_EQ(805 , message.GetExtension(unittest::packed_sint32_extension_lite , 1)); + EXPECT_EQ(806 , message.GetExtension(unittest::packed_sint64_extension_lite , 1)); + EXPECT_EQ(807 , message.GetExtension(unittest::packed_fixed32_extension_lite , 1)); + EXPECT_EQ(808 , message.GetExtension(unittest::packed_fixed64_extension_lite , 1)); + EXPECT_EQ(809 , message.GetExtension(unittest::packed_sfixed32_extension_lite, 1)); + EXPECT_EQ(810 , message.GetExtension(unittest::packed_sfixed64_extension_lite, 1)); + EXPECT_EQ(811 , message.GetExtension(unittest::packed_float_extension_lite , 1)); + EXPECT_EQ(812 , message.GetExtension(unittest::packed_double_extension_lite , 1)); + EXPECT_EQ(true , message.GetExtension(unittest::packed_bool_extension_lite , 1)); + EXPECT_EQ(unittest::FOREIGN_LITE_FOO, + message.GetExtension(unittest::packed_enum_extension_lite, 1)); +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h new file mode 100644 index 000000000..ca35aaa47 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h @@ -0,0 +1,101 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__ +#define GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__ + +#include + +namespace google { +namespace protobuf { + +namespace unittest = protobuf_unittest; +namespace unittest_import = protobuf_unittest_import; + +class TestUtilLite { + public: + // Set every field in the message to a unique value. + static void SetAllFields(unittest::TestAllTypesLite* message); + static void SetAllExtensions(unittest::TestAllExtensionsLite* message); + static void SetPackedFields(unittest::TestPackedTypesLite* message); + static void SetPackedExtensions(unittest::TestPackedExtensionsLite* message); + + // Use the repeated versions of the set_*() accessors to modify all the + // repeated fields of the messsage (which should already have been + // initialized with Set*Fields()). Set*Fields() itself only tests + // the add_*() accessors. + static void ModifyRepeatedFields(unittest::TestAllTypesLite* message); + static void ModifyRepeatedExtensions( + unittest::TestAllExtensionsLite* message); + static void ModifyPackedFields(unittest::TestPackedTypesLite* message); + static void ModifyPackedExtensions( + unittest::TestPackedExtensionsLite* message); + + // Check that all fields have the values that they should have after + // Set*Fields() is called. + static void ExpectAllFieldsSet(const unittest::TestAllTypesLite& message); + static void ExpectAllExtensionsSet( + const unittest::TestAllExtensionsLite& message); + static void ExpectPackedFieldsSet( + const unittest::TestPackedTypesLite& message); + static void ExpectPackedExtensionsSet( + const unittest::TestPackedExtensionsLite& message); + + // Expect that the message is modified as would be expected from + // Modify*Fields(). + static void ExpectRepeatedFieldsModified( + const unittest::TestAllTypesLite& message); + static void ExpectRepeatedExtensionsModified( + const unittest::TestAllExtensionsLite& message); + static void ExpectPackedFieldsModified( + const unittest::TestPackedTypesLite& message); + static void ExpectPackedExtensionsModified( + const unittest::TestPackedExtensionsLite& message); + + // Check that all fields have their default values. + static void ExpectClear(const unittest::TestAllTypesLite& message); + static void ExpectExtensionsClear( + const unittest::TestAllExtensionsLite& message); + static void ExpectPackedClear(const unittest::TestPackedTypesLite& message); + static void ExpectPackedExtensionsClear( + const unittest::TestPackedExtensionsLite& message); + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TestUtilLite); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_TEST_UTIL_LITE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_message b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_message new file mode 100644 index 0000000000000000000000000000000000000000..94898e494a4103086e83b2d53f1d9e5e0265017a GIT binary patch literal 487 zcmXxfKTK0m6bA5nzH?tGo1-HmBk#|Bn@P1ZgJH#iL1+LOG@vrQD8q|WDI`1#B$cTl z6j~-iQfZw8Y_tsn0&yS?#K}a4j+|S|$<6P6=icF-n|}Ua^5N7_Zn#4uXY^=BDfM_( zur>NZcske1N!f#!{cX_b_pOmWMM}L$W0_knl z(e7!aZ=%yXvnlM~x1iKmR*crOZOKy6bml(2%AAAFp{~K6Yee5Qe{2p#-wpqvi=T80 zyVr4xcg*PvvVO(~@sg}ZD2P{NZ6IM;Twq1gdU SJG41$Vq;=t*u}=g$_4<-G94WN literal 0 HcmV?d00001 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt new file mode 100644 index 000000000..feea8f7bb --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt @@ -0,0 +1,116 @@ +optional_int32: 101 +optional_int64: 102 +optional_uint32: 103 +optional_uint64: 104 +optional_sint32: 105 +optional_sint64: 106 +optional_fixed32: 107 +optional_fixed64: 108 +optional_sfixed32: 109 +optional_sfixed64: 110 +optional_float: 111 +optional_double: 112 +optional_bool: true +optional_string: "115" +optional_bytes: "116" +OptionalGroup { + a: 117 +} +optional_nested_message { + bb: 118 +} +optional_foreign_message { + c: 119 +} +optional_import_message { + d: 120 +} +optional_nested_enum: BAZ +optional_foreign_enum: FOREIGN_BAZ +optional_import_enum: IMPORT_BAZ +optional_string_piece: "124" +optional_cord: "125" +repeated_int32: 201 +repeated_int32: 301 +repeated_int64: 202 +repeated_int64: 302 +repeated_uint32: 203 +repeated_uint32: 303 +repeated_uint64: 204 +repeated_uint64: 304 +repeated_sint32: 205 +repeated_sint32: 305 +repeated_sint64: 206 +repeated_sint64: 306 +repeated_fixed32: 207 +repeated_fixed32: 307 +repeated_fixed64: 208 +repeated_fixed64: 308 +repeated_sfixed32: 209 +repeated_sfixed32: 309 +repeated_sfixed64: 210 +repeated_sfixed64: 310 +repeated_float: 211 +repeated_float: 311 +repeated_double: 212 +repeated_double: 312 +repeated_bool: true +repeated_bool: false +repeated_string: "215" +repeated_string: "315" +repeated_bytes: "216" +repeated_bytes: "316" +RepeatedGroup { + a: 217 +} +RepeatedGroup { + a: 317 +} +repeated_nested_message { + bb: 218 +} +repeated_nested_message { + bb: 318 +} +repeated_foreign_message { + c: 219 +} +repeated_foreign_message { + c: 319 +} +repeated_import_message { + d: 220 +} +repeated_import_message { + d: 320 +} +repeated_nested_enum: BAR +repeated_nested_enum: BAZ +repeated_foreign_enum: FOREIGN_BAR +repeated_foreign_enum: FOREIGN_BAZ +repeated_import_enum: IMPORT_BAR +repeated_import_enum: IMPORT_BAZ +repeated_string_piece: "224" +repeated_string_piece: "324" +repeated_cord: "225" +repeated_cord: "325" +default_int32: 401 +default_int64: 402 +default_uint32: 403 +default_uint64: 404 +default_sint32: 405 +default_sint64: 406 +default_fixed32: 407 +default_fixed64: 408 +default_sfixed32: 409 +default_sfixed64: 410 +default_float: 411 +default_double: 412 +default_bool: false +default_string: "415" +default_bytes: "416" +default_nested_enum: FOO +default_foreign_enum: FOREIGN_FOO +default_import_enum: IMPORT_FOO +default_string_piece: "424" +default_cord: "425" diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt new file mode 100644 index 000000000..057beae89 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt @@ -0,0 +1,116 @@ +[protobuf_unittest.optional_int32_extension]: 101 +[protobuf_unittest.optional_int64_extension]: 102 +[protobuf_unittest.optional_uint32_extension]: 103 +[protobuf_unittest.optional_uint64_extension]: 104 +[protobuf_unittest.optional_sint32_extension]: 105 +[protobuf_unittest.optional_sint64_extension]: 106 +[protobuf_unittest.optional_fixed32_extension]: 107 +[protobuf_unittest.optional_fixed64_extension]: 108 +[protobuf_unittest.optional_sfixed32_extension]: 109 +[protobuf_unittest.optional_sfixed64_extension]: 110 +[protobuf_unittest.optional_float_extension]: 111 +[protobuf_unittest.optional_double_extension]: 112 +[protobuf_unittest.optional_bool_extension]: true +[protobuf_unittest.optional_string_extension]: "115" +[protobuf_unittest.optional_bytes_extension]: "116" +[protobuf_unittest.optionalgroup_extension] { + a: 117 +} +[protobuf_unittest.optional_nested_message_extension] { + bb: 118 +} +[protobuf_unittest.optional_foreign_message_extension] { + c: 119 +} +[protobuf_unittest.optional_import_message_extension] { + d: 120 +} +[protobuf_unittest.optional_nested_enum_extension]: BAZ +[protobuf_unittest.optional_foreign_enum_extension]: FOREIGN_BAZ +[protobuf_unittest.optional_import_enum_extension]: IMPORT_BAZ +[protobuf_unittest.optional_string_piece_extension]: "124" +[protobuf_unittest.optional_cord_extension]: "125" +[protobuf_unittest.repeated_int32_extension]: 201 +[protobuf_unittest.repeated_int32_extension]: 301 +[protobuf_unittest.repeated_int64_extension]: 202 +[protobuf_unittest.repeated_int64_extension]: 302 +[protobuf_unittest.repeated_uint32_extension]: 203 +[protobuf_unittest.repeated_uint32_extension]: 303 +[protobuf_unittest.repeated_uint64_extension]: 204 +[protobuf_unittest.repeated_uint64_extension]: 304 +[protobuf_unittest.repeated_sint32_extension]: 205 +[protobuf_unittest.repeated_sint32_extension]: 305 +[protobuf_unittest.repeated_sint64_extension]: 206 +[protobuf_unittest.repeated_sint64_extension]: 306 +[protobuf_unittest.repeated_fixed32_extension]: 207 +[protobuf_unittest.repeated_fixed32_extension]: 307 +[protobuf_unittest.repeated_fixed64_extension]: 208 +[protobuf_unittest.repeated_fixed64_extension]: 308 +[protobuf_unittest.repeated_sfixed32_extension]: 209 +[protobuf_unittest.repeated_sfixed32_extension]: 309 +[protobuf_unittest.repeated_sfixed64_extension]: 210 +[protobuf_unittest.repeated_sfixed64_extension]: 310 +[protobuf_unittest.repeated_float_extension]: 211 +[protobuf_unittest.repeated_float_extension]: 311 +[protobuf_unittest.repeated_double_extension]: 212 +[protobuf_unittest.repeated_double_extension]: 312 +[protobuf_unittest.repeated_bool_extension]: true +[protobuf_unittest.repeated_bool_extension]: false +[protobuf_unittest.repeated_string_extension]: "215" +[protobuf_unittest.repeated_string_extension]: "315" +[protobuf_unittest.repeated_bytes_extension]: "216" +[protobuf_unittest.repeated_bytes_extension]: "316" +[protobuf_unittest.repeatedgroup_extension] { + a: 217 +} +[protobuf_unittest.repeatedgroup_extension] { + a: 317 +} +[protobuf_unittest.repeated_nested_message_extension] { + bb: 218 +} +[protobuf_unittest.repeated_nested_message_extension] { + bb: 318 +} +[protobuf_unittest.repeated_foreign_message_extension] { + c: 219 +} +[protobuf_unittest.repeated_foreign_message_extension] { + c: 319 +} +[protobuf_unittest.repeated_import_message_extension] { + d: 220 +} +[protobuf_unittest.repeated_import_message_extension] { + d: 320 +} +[protobuf_unittest.repeated_nested_enum_extension]: BAR +[protobuf_unittest.repeated_nested_enum_extension]: BAZ +[protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAR +[protobuf_unittest.repeated_foreign_enum_extension]: FOREIGN_BAZ +[protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAR +[protobuf_unittest.repeated_import_enum_extension]: IMPORT_BAZ +[protobuf_unittest.repeated_string_piece_extension]: "224" +[protobuf_unittest.repeated_string_piece_extension]: "324" +[protobuf_unittest.repeated_cord_extension]: "225" +[protobuf_unittest.repeated_cord_extension]: "325" +[protobuf_unittest.default_int32_extension]: 401 +[protobuf_unittest.default_int64_extension]: 402 +[protobuf_unittest.default_uint32_extension]: 403 +[protobuf_unittest.default_uint64_extension]: 404 +[protobuf_unittest.default_sint32_extension]: 405 +[protobuf_unittest.default_sint64_extension]: 406 +[protobuf_unittest.default_fixed32_extension]: 407 +[protobuf_unittest.default_fixed64_extension]: 408 +[protobuf_unittest.default_sfixed32_extension]: 409 +[protobuf_unittest.default_sfixed64_extension]: 410 +[protobuf_unittest.default_float_extension]: 411 +[protobuf_unittest.default_double_extension]: 412 +[protobuf_unittest.default_bool_extension]: false +[protobuf_unittest.default_string_extension]: "415" +[protobuf_unittest.default_bytes_extension]: "416" +[protobuf_unittest.default_nested_enum_extension]: FOO +[protobuf_unittest.default_foreign_enum_extension]: FOREIGN_FOO +[protobuf_unittest.default_import_enum_extension]: IMPORT_FOO +[protobuf_unittest.default_string_piece_extension]: "424" +[protobuf_unittest.default_cord_extension]: "425" diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc new file mode 100644 index 000000000..e224781db --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc @@ -0,0 +1,176 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// emulates google3/file/base/file.cc + +#include +#include +#include +#include +#ifdef _MSC_VER +#define WIN32_LEAN_AND_MEAN // yeah, right +#include // Find*File(). :( +#include +#include +#else +#include +#include +#endif +#include + +namespace google { +namespace protobuf { + +#ifdef _WIN32 +#define mkdir(name, mode) mkdir(name) +// Windows doesn't have symbolic links. +#define lstat stat +#ifndef F_OK +#define F_OK 00 // not defined by MSVC for whatever reason +#endif +#endif + +bool File::Exists(const string& name) { + return access(name.c_str(), F_OK) == 0; +} + +bool File::ReadFileToString(const string& name, string* output) { + char buffer[1024]; + FILE* file = fopen(name.c_str(), "rb"); + if (file == NULL) return false; + + while (true) { + size_t n = fread(buffer, 1, sizeof(buffer), file); + if (n <= 0) break; + output->append(buffer, n); + } + + int error = ferror(file); + if (fclose(file) != 0) return false; + return error == 0; +} + +void File::ReadFileToStringOrDie(const string& name, string* output) { + GOOGLE_CHECK(ReadFileToString(name, output)) << "Could not read: " << name; +} + +void File::WriteStringToFileOrDie(const string& contents, const string& name) { + FILE* file = fopen(name.c_str(), "wb"); + GOOGLE_CHECK(file != NULL) + << "fopen(" << name << ", \"wb\"): " << strerror(errno); + GOOGLE_CHECK_EQ(fwrite(contents.data(), 1, contents.size(), file), + contents.size()) + << "fwrite(" << name << "): " << strerror(errno); + GOOGLE_CHECK(fclose(file) == 0) + << "fclose(" << name << "): " << strerror(errno); +} + +bool File::CreateDir(const string& name, int mode) { + return mkdir(name.c_str(), mode) == 0; +} + +bool File::RecursivelyCreateDir(const string& path, int mode) { + if (CreateDir(path, mode)) return true; + + if (Exists(path)) return false; + + // Try creating the parent. + string::size_type slashpos = path.find_last_of('/'); + if (slashpos == string::npos) { + // No parent given. + return false; + } + + return RecursivelyCreateDir(path.substr(0, slashpos), mode) && + CreateDir(path, mode); +} + +void File::DeleteRecursively(const string& name, + void* dummy1, void* dummy2) { + // We don't care too much about error checking here since this is only used + // in tests to delete temporary directories that are under /tmp anyway. + +#ifdef _MSC_VER + // This interface is so weird. + WIN32_FIND_DATA find_data; + HANDLE find_handle = FindFirstFile((name + "/*").c_str(), &find_data); + if (find_handle == INVALID_HANDLE_VALUE) { + // Just delete it, whatever it is. + DeleteFile(name.c_str()); + RemoveDirectory(name.c_str()); + return; + } + + do { + string entry_name = find_data.cFileName; + if (entry_name != "." && entry_name != "..") { + string path = name + "/" + entry_name; + if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + DeleteRecursively(path, NULL, NULL); + RemoveDirectory(path.c_str()); + } else { + DeleteFile(path.c_str()); + } + } + } while(FindNextFile(find_handle, &find_data)); + FindClose(find_handle); + + RemoveDirectory(name.c_str()); +#else + // Use opendir()! Yay! + // lstat = Don't follow symbolic links. + struct stat stats; + if (lstat(name.c_str(), &stats) != 0) return; + + if (S_ISDIR(stats.st_mode)) { + DIR* dir = opendir(name.c_str()); + if (dir != NULL) { + while (true) { + struct dirent* entry = readdir(dir); + if (entry == NULL) break; + string entry_name = entry->d_name; + if (entry_name != "." && entry_name != "..") { + DeleteRecursively(name + "/" + entry_name, NULL, NULL); + } + } + } + + closedir(dir); + rmdir(name.c_str()); + + } else if (S_ISREG(stats.st_mode)) { + remove(name.c_str()); + } +#endif +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h new file mode 100644 index 000000000..a6b1c7641 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h @@ -0,0 +1,83 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// emulates google3/file/base/file.h + +#ifndef GOOGLE_PROTOBUF_TESTING_FILE_H__ +#define GOOGLE_PROTOBUF_TESTING_FILE_H__ + +#include + +namespace google { +namespace protobuf { + +const int DEFAULT_FILE_MODE = 0777; + +// Protocol buffer code only uses a couple static methods of File, and only +// in tests. +class File { + public: + // Check if the file exists. + static bool Exists(const string& name); + + // Read an entire file to a string. Return true if successful, false + // otherwise. + static bool ReadFileToString(const string& name, string* output); + + // Same as above, but crash on failure. + static void ReadFileToStringOrDie(const string& name, string* output); + + // Create a file and write a string to it. + static void WriteStringToFileOrDie(const string& contents, + const string& name); + + // Create a directory. + static bool CreateDir(const string& name, int mode); + + // Create a directory and all parent directories if necessary. + static bool RecursivelyCreateDir(const string& path, int mode); + + // If "name" is a file, we delete it. If it is a directory, we + // call DeleteRecursively() for each file or directory (other than + // dot and double-dot) within it, and then delete the directory itself. + // The "dummy" parameters have a meaning in the original version of this + // method but they are not used anywhere in protocol buffers. + static void DeleteRecursively(const string& name, + void* dummy1, void* dummy2); + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(File); +}; + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_TESTING_FILE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc new file mode 100644 index 000000000..cd094d0cd --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc @@ -0,0 +1,254 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// emulates google3/testing/base/public/googletest.cc + +#include +#include +#include +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#include +#else +#include +#endif +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +#ifdef _WIN32 +#define mkdir(name, mode) mkdir(name) +#endif + +#ifndef O_BINARY +#ifdef _O_BINARY +#define O_BINARY _O_BINARY +#else +#define O_BINARY 0 // If this isn't defined, the platform doesn't need it. +#endif +#endif + +string TestSourceDir() { +#ifdef _MSC_VER + // Look for the "src" directory. + string prefix = "."; + + while (!File::Exists(prefix + "/src/google/protobuf")) { + if (!File::Exists(prefix)) { + GOOGLE_LOG(FATAL) + << "Could not find protobuf source code. Please run tests from " + "somewhere within the protobuf source package."; + } + prefix += "/.."; + } + return prefix + "/src"; +#else + // automake sets the "srcdir" environment variable. + char* result = getenv("srcdir"); + if (result == NULL) { + // Otherwise, the test must be run from the source directory. + return "."; + } else { + return result; + } +#endif +} + +namespace { + +string GetTemporaryDirectoryName() { + // tmpnam() is generally not considered safe but we're only using it for + // testing. We cannot use tmpfile() or mkstemp() since we're creating a + // directory. + char b[L_tmpnam + 1]; // HPUX multithread return 0 if s is 0 + string result = tmpnam(b); +#ifdef _WIN32 + // On Win32, tmpnam() returns a file prefixed with '\', but which is supposed + // to be used in the current working directory. WTF? + if (HasPrefixString(result, "\\")) { + result.erase(0, 1); + } +#endif // _WIN32 + return result; +} + +// Creates a temporary directory on demand and deletes it when the process +// quits. +class TempDirDeleter { + public: + TempDirDeleter() {} + ~TempDirDeleter() { + if (!name_.empty()) { + File::DeleteRecursively(name_, NULL, NULL); + } + } + + string GetTempDir() { + if (name_.empty()) { + name_ = GetTemporaryDirectoryName(); + GOOGLE_CHECK(mkdir(name_.c_str(), 0777) == 0) << strerror(errno); + + // Stick a file in the directory that tells people what this is, in case + // we abort and don't get a chance to delete it. + File::WriteStringToFileOrDie("", name_ + "/TEMP_DIR_FOR_PROTOBUF_TESTS"); + } + return name_; + } + + private: + string name_; +}; + +TempDirDeleter temp_dir_deleter_; + +} // namespace + +string TestTempDir() { + return temp_dir_deleter_.GetTempDir(); +} + +// TODO(kenton): Share duplicated code below. Too busy/lazy for now. + +static string stdout_capture_filename_; +static string stderr_capture_filename_; +static int original_stdout_ = -1; +static int original_stderr_ = -1; + +void CaptureTestStdout() { + GOOGLE_CHECK_EQ(original_stdout_, -1) << "Already capturing."; + + stdout_capture_filename_ = TestTempDir() + "/captured_stdout"; + + int fd = open(stdout_capture_filename_.c_str(), + O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777); + GOOGLE_CHECK(fd >= 0) << "open: " << strerror(errno); + + original_stdout_ = dup(1); + close(1); + dup2(fd, 1); + close(fd); +} + +void CaptureTestStderr() { + GOOGLE_CHECK_EQ(original_stderr_, -1) << "Already capturing."; + + stderr_capture_filename_ = TestTempDir() + "/captured_stderr"; + + int fd = open(stderr_capture_filename_.c_str(), + O_WRONLY | O_CREAT | O_EXCL | O_BINARY, 0777); + GOOGLE_CHECK(fd >= 0) << "open: " << strerror(errno); + + original_stderr_ = dup(2); + close(2); + dup2(fd, 2); + close(fd); +} + +string GetCapturedTestStdout() { + GOOGLE_CHECK_NE(original_stdout_, -1) << "Not capturing."; + + close(1); + dup2(original_stdout_, 1); + original_stdout_ = -1; + + string result; + File::ReadFileToStringOrDie(stdout_capture_filename_, &result); + + remove(stdout_capture_filename_.c_str()); + + return result; +} + +string GetCapturedTestStderr() { + GOOGLE_CHECK_NE(original_stderr_, -1) << "Not capturing."; + + close(2); + dup2(original_stderr_, 2); + original_stderr_ = -1; + + string result; + File::ReadFileToStringOrDie(stderr_capture_filename_, &result); + + remove(stderr_capture_filename_.c_str()); + + return result; +} + +ScopedMemoryLog* ScopedMemoryLog::active_log_ = NULL; + +ScopedMemoryLog::ScopedMemoryLog() { + GOOGLE_CHECK(active_log_ == NULL); + active_log_ = this; + old_handler_ = SetLogHandler(&HandleLog); +} + +ScopedMemoryLog::~ScopedMemoryLog() { + SetLogHandler(old_handler_); + active_log_ = NULL; +} + +const vector& ScopedMemoryLog::GetMessages(LogLevel dummy) const { + GOOGLE_CHECK_EQ(dummy, ERROR); + return messages_; +} + +void ScopedMemoryLog::HandleLog(LogLevel level, const char* filename, + int line, const string& message) { + GOOGLE_CHECK(active_log_ != NULL); + if (level == ERROR) { + active_log_->messages_.push_back(message); + } +} + +namespace { + +// Force shutdown at process exit so that we can test for memory leaks. To +// actually check for leaks, I suggest using the heap checker included with +// google-perftools. Set it to "draconian" mode to ensure that every last +// call to malloc() has a corresponding free(). +struct ForceShutdown { + ~ForceShutdown() { + ShutdownProtobufLibrary(); + } +} force_shutdown; + +} // namespace + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h new file mode 100644 index 000000000..71444c960 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h @@ -0,0 +1,98 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// emulates google3/testing/base/public/googletest.h + +#ifndef GOOGLE_PROTOBUF_GOOGLETEST_H__ +#define GOOGLE_PROTOBUF_GOOGLETEST_H__ + +#include +#include + +namespace google { +namespace protobuf { + +// When running unittests, get the directory containing the source code. +string TestSourceDir(); + +// When running unittests, get a directory where temporary files may be +// placed. +string TestTempDir(); + +// Capture all text written to stdout or stderr. +void CaptureTestStdout(); +void CaptureTestStderr(); + +// Stop capturing stdout or stderr and return the text captured. +string GetCapturedTestStdout(); +string GetCapturedTestStderr(); + +// For use with ScopedMemoryLog::GetMessages(). Inside Google the LogLevel +// constants don't have the LOGLEVEL_ prefix, so the code that used +// ScopedMemoryLog refers to LOGLEVEL_ERROR as just ERROR. +#undef ERROR // defend against promiscuous windows.h +static const LogLevel ERROR = LOGLEVEL_ERROR; + +// Receives copies of all LOG(ERROR) messages while in scope. Sample usage: +// { +// ScopedMemoryLog log; // constructor registers object as a log sink +// SomeRoutineThatMayLogMessages(); +// const vector& warnings = log.GetMessages(ERROR); +// } // destructor unregisters object as a log sink +// This is a dummy implementation which covers only what is used by protocol +// buffer unit tests. +class ScopedMemoryLog { + public: + ScopedMemoryLog(); + virtual ~ScopedMemoryLog(); + + // Fetches all messages logged. The internal version of this class + // would only fetch messages at the given security level, but the protobuf + // open source version ignores the argument since we always pass ERROR + // anyway. + const vector& GetMessages(LogLevel dummy) const; + + private: + vector messages_; + LogHandler* old_handler_; + + static void HandleLog(LogLevel level, const char* filename, int line, + const string& message); + + static ScopedMemoryLog* active_log_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ScopedMemoryLog); +}; + +} // namespace protobuf +} // namespace google + +#endif // GOOGLE_PROTOBUF_GOOGLETEST_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc new file mode 100644 index 000000000..a6197854b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc @@ -0,0 +1,73 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2009 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: brianolson@google.com (Brian Olson) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Test program to verify that GzipInputStream is compatible with command line +// gunzip or java.util.zip.GzipInputStream +// +// Reads gzip stream on standard input and writes decompressed data to standard +// output. + +#include "config.h" + +#include +#include +#include +#include + +#include +#include + +using google::protobuf::io::FileInputStream; +using google::protobuf::io::GzipInputStream; + +int main(int argc, const char** argv) { + FileInputStream fin(STDIN_FILENO); + GzipInputStream in(&fin); + + while (true) { + const void* inptr; + int inlen; + bool ok; + ok = in.Next(&inptr, &inlen); + if (!ok) { + break; + } + if (inlen > 0) { + int err = write(STDOUT_FILENO, inptr, inlen); + assert(err == inlen); + } + } + + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc new file mode 100644 index 000000000..9133275c8 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc @@ -0,0 +1,79 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2009 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: brianolson@google.com (Brian Olson) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Test program to verify that GzipOutputStream is compatible with command line +// gzip or java.util.zip.GzipOutputStream +// +// Reads data on standard input and writes compressed gzip stream to standard +// output. + +#include "config.h" + +#include +#include +#include + +#include +#include + +using google::protobuf::io::FileOutputStream; +using google::protobuf::io::GzipOutputStream; + +int main(int argc, const char** argv) { + FileOutputStream fout(STDOUT_FILENO); + GzipOutputStream out(&fout); + int readlen; + + while (true) { + void* outptr; + int outlen; + bool ok; + do { + ok = out.Next(&outptr, &outlen); + if (!ok) { + break; + } + } while (outlen <= 0); + readlen = read(STDIN_FILENO, outptr, outlen); + if (readlen <= 0) { + out.BackUp(outlen); + break; + } + if (readlen < outlen) { + out.BackUp(outlen - readlen); + } + } + + return 0; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc new file mode 100644 index 000000000..1494ebd78 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc @@ -0,0 +1,1285 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jschorr@google.com (Joseph Schorr) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +string Message::DebugString() const { + string debug_string; + + TextFormat::PrintToString(*this, &debug_string); + + return debug_string; +} + +string Message::ShortDebugString() const { + string debug_string; + + TextFormat::Printer printer; + printer.SetSingleLineMode(true); + + printer.PrintToString(*this, &debug_string); + // Single line mode currently might have an extra space at the end. + if (debug_string.size() > 0 && + debug_string[debug_string.size() - 1] == ' ') { + debug_string.resize(debug_string.size() - 1); + } + + return debug_string; +} + +string Message::Utf8DebugString() const { + string debug_string; + + TextFormat::Printer printer; + printer.SetUseUtf8StringEscaping(true); + + printer.PrintToString(*this, &debug_string); + + return debug_string; +} + +void Message::PrintDebugString() const { + printf("%s", DebugString().c_str()); +} + + +// =========================================================================== +// Internal class for parsing an ASCII representation of a Protocol Message. +// This class makes use of the Protocol Message compiler's tokenizer found +// in //google/protobuf/io/tokenizer.h. Note that class's Parse +// method is *not* thread-safe and should only be used in a single thread at +// a time. + +// Makes code slightly more readable. The meaning of "DO(foo)" is +// "Execute foo and fail if it fails.", where failure is indicated by +// returning false. Borrowed from parser.cc (Thanks Kenton!). +#define DO(STATEMENT) if (STATEMENT) {} else return false + +class TextFormat::Parser::ParserImpl { + public: + + // Determines if repeated values for a non-repeated field are + // permitted, e.g., the string "foo: 1 foo: 2" for a + // required/optional field named "foo". + enum SingularOverwritePolicy { + ALLOW_SINGULAR_OVERWRITES = 0, // the last value is retained + FORBID_SINGULAR_OVERWRITES = 1, // an error is issued + }; + + ParserImpl(const Descriptor* root_message_type, + io::ZeroCopyInputStream* input_stream, + io::ErrorCollector* error_collector, + TextFormat::Finder* finder, + SingularOverwritePolicy singular_overwrite_policy) + : error_collector_(error_collector), + finder_(finder), + tokenizer_error_collector_(this), + tokenizer_(input_stream, &tokenizer_error_collector_), + root_message_type_(root_message_type), + singular_overwrite_policy_(singular_overwrite_policy), + had_errors_(false) { + // For backwards-compatibility with proto1, we need to allow the 'f' suffix + // for floats. + tokenizer_.set_allow_f_after_float(true); + + // '#' starts a comment. + tokenizer_.set_comment_style(io::Tokenizer::SH_COMMENT_STYLE); + + // Consume the starting token. + tokenizer_.Next(); + } + ~ParserImpl() { } + + // Parses the ASCII representation specified in input and saves the + // information into the output pointer (a Message). Returns + // false if an error occurs (an error will also be logged to + // GOOGLE_LOG(ERROR)). + bool Parse(Message* output) { + // Consume fields until we cannot do so anymore. + while(true) { + if (LookingAtType(io::Tokenizer::TYPE_END)) { + return !had_errors_; + } + + DO(ConsumeField(output)); + } + } + + bool ParseField(const FieldDescriptor* field, Message* output) { + bool suc; + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + suc = ConsumeFieldMessage(output, output->GetReflection(), field); + } else { + suc = ConsumeFieldValue(output, output->GetReflection(), field); + } + return suc && LookingAtType(io::Tokenizer::TYPE_END); + } + + void ReportError(int line, int col, const string& message) { + had_errors_ = true; + if (error_collector_ == NULL) { + if (line >= 0) { + GOOGLE_LOG(ERROR) << "Error parsing text-format " + << root_message_type_->full_name() + << ": " << (line + 1) << ":" + << (col + 1) << ": " << message; + } else { + GOOGLE_LOG(ERROR) << "Error parsing text-format " + << root_message_type_->full_name() + << ": " << message; + } + } else { + error_collector_->AddError(line, col, message); + } + } + + void ReportWarning(int line, int col, const string& message) { + if (error_collector_ == NULL) { + if (line >= 0) { + GOOGLE_LOG(WARNING) << "Warning parsing text-format " + << root_message_type_->full_name() + << ": " << (line + 1) << ":" + << (col + 1) << ": " << message; + } else { + GOOGLE_LOG(WARNING) << "Warning parsing text-format " + << root_message_type_->full_name() + << ": " << message; + } + } else { + error_collector_->AddWarning(line, col, message); + } + } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserImpl); + + // Reports an error with the given message with information indicating + // the position (as derived from the current token). + void ReportError(const string& message) { + ReportError(tokenizer_.current().line, tokenizer_.current().column, + message); + } + + // Reports a warning with the given message with information indicating + // the position (as derived from the current token). + void ReportWarning(const string& message) { + ReportWarning(tokenizer_.current().line, tokenizer_.current().column, + message); + } + + // Consumes the specified message with the given starting delimeter. + // This method checks to see that the end delimeter at the conclusion of + // the consumption matches the starting delimeter passed in here. + bool ConsumeMessage(Message* message, const string delimeter) { + while (!LookingAt(">") && !LookingAt("}")) { + DO(ConsumeField(message)); + } + + // Confirm that we have a valid ending delimeter. + DO(Consume(delimeter)); + + return true; + } + + // Consumes the current field (as returned by the tokenizer) on the + // passed in message. + bool ConsumeField(Message* message) { + const Reflection* reflection = message->GetReflection(); + const Descriptor* descriptor = message->GetDescriptor(); + + string field_name; + + const FieldDescriptor* field = NULL; + + if (TryConsume("[")) { + // Extension. + DO(ConsumeIdentifier(&field_name)); + while (TryConsume(".")) { + string part; + DO(ConsumeIdentifier(&part)); + field_name += "."; + field_name += part; + } + DO(Consume("]")); + + field = (finder_ != NULL + ? finder_->FindExtension(message, field_name) + : reflection->FindKnownExtensionByName(field_name)); + + if (field == NULL) { + ReportError("Extension \"" + field_name + "\" is not defined or " + "is not an extension of \"" + + descriptor->full_name() + "\"."); + return false; + } + } else { + DO(ConsumeIdentifier(&field_name)); + + field = descriptor->FindFieldByName(field_name); + // Group names are expected to be capitalized as they appear in the + // .proto file, which actually matches their type names, not their field + // names. + if (field == NULL) { + string lower_field_name = field_name; + LowerString(&lower_field_name); + field = descriptor->FindFieldByName(lower_field_name); + // If the case-insensitive match worked but the field is NOT a group, + if (field != NULL && field->type() != FieldDescriptor::TYPE_GROUP) { + field = NULL; + } + } + // Again, special-case group names as described above. + if (field != NULL && field->type() == FieldDescriptor::TYPE_GROUP + && field->message_type()->name() != field_name) { + field = NULL; + } + + if (field == NULL) { + ReportError("Message type \"" + descriptor->full_name() + + "\" has no field named \"" + field_name + "\"."); + return false; + } + } + + // Fail if the field is not repeated and it has already been specified. + if ((singular_overwrite_policy_ == FORBID_SINGULAR_OVERWRITES) && + !field->is_repeated() && reflection->HasField(*message, field)) { + ReportError("Non-repeated field \"" + field_name + + "\" is specified multiple times."); + return false; + } + + // Perform special handling for embedded message types. + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + // ':' is optional here. + TryConsume(":"); + DO(ConsumeFieldMessage(message, reflection, field)); + } else { + DO(Consume(":")); + if (field->is_repeated() && TryConsume("[")) { + // Short repeated format, e.g. "foo: [1, 2, 3]" + while (true) { + DO(ConsumeFieldValue(message, reflection, field)); + if (TryConsume("]")) { + break; + } + DO(Consume(",")); + } + } else { + DO(ConsumeFieldValue(message, reflection, field)); + } + } + + // For historical reasons, fields may optionally be separated by commas or + // semicolons. + TryConsume(";") || TryConsume(","); + + if (field->options().deprecated()) { + ReportWarning("text format contains deprecated field \"" + + field_name + "\""); + } + + return true; + } + + bool ConsumeFieldMessage(Message* message, + const Reflection* reflection, + const FieldDescriptor* field) { + string delimeter; + if (TryConsume("<")) { + delimeter = ">"; + } else { + DO(Consume("{")); + delimeter = "}"; + } + + if (field->is_repeated()) { + DO(ConsumeMessage(reflection->AddMessage(message, field), delimeter)); + } else { + DO(ConsumeMessage(reflection->MutableMessage(message, field), + delimeter)); + } + return true; + } + + bool ConsumeFieldValue(Message* message, + const Reflection* reflection, + const FieldDescriptor* field) { + +// Define an easy to use macro for setting fields. This macro checks +// to see if the field is repeated (in which case we need to use the Add +// methods or not (in which case we need to use the Set methods). +#define SET_FIELD(CPPTYPE, VALUE) \ + if (field->is_repeated()) { \ + reflection->Add##CPPTYPE(message, field, VALUE); \ + } else { \ + reflection->Set##CPPTYPE(message, field, VALUE); \ + } \ + + switch(field->cpp_type()) { + case FieldDescriptor::CPPTYPE_INT32: { + int64 value; + DO(ConsumeSignedInteger(&value, kint32max)); + SET_FIELD(Int32, static_cast(value)); + break; + } + + case FieldDescriptor::CPPTYPE_UINT32: { + uint64 value; + DO(ConsumeUnsignedInteger(&value, kuint32max)); + SET_FIELD(UInt32, static_cast(value)); + break; + } + + case FieldDescriptor::CPPTYPE_INT64: { + int64 value; + DO(ConsumeSignedInteger(&value, kint64max)); + SET_FIELD(Int64, value); + break; + } + + case FieldDescriptor::CPPTYPE_UINT64: { + uint64 value; + DO(ConsumeUnsignedInteger(&value, kuint64max)); + SET_FIELD(UInt64, value); + break; + } + + case FieldDescriptor::CPPTYPE_FLOAT: { + double value; + DO(ConsumeDouble(&value)); + SET_FIELD(Float, static_cast(value)); + break; + } + + case FieldDescriptor::CPPTYPE_DOUBLE: { + double value; + DO(ConsumeDouble(&value)); + SET_FIELD(Double, value); + break; + } + + case FieldDescriptor::CPPTYPE_STRING: { + string value; + DO(ConsumeString(&value)); + SET_FIELD(String, value); + break; + } + + case FieldDescriptor::CPPTYPE_BOOL: { + if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + uint64 value; + DO(ConsumeUnsignedInteger(&value, 1)); + SET_FIELD(Bool, value); + } else { + string value; + DO(ConsumeIdentifier(&value)); + if (value == "true" || value == "t") { + SET_FIELD(Bool, true); + } else if (value == "false" || value == "f") { + SET_FIELD(Bool, false); + } else { + ReportError("Invalid value for boolean field \"" + field->name() + + "\". Value: \"" + value + "\"."); + return false; + } + } + break; + } + + case FieldDescriptor::CPPTYPE_ENUM: { + string value; + const EnumDescriptor* enum_type = field->enum_type(); + const EnumValueDescriptor* enum_value = NULL; + + if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + DO(ConsumeIdentifier(&value)); + // Find the enumeration value. + enum_value = enum_type->FindValueByName(value); + + } else if (LookingAt("-") || + LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + int64 int_value; + DO(ConsumeSignedInteger(&int_value, kint32max)); + value = SimpleItoa(int_value); // for error reporting + enum_value = enum_type->FindValueByNumber(int_value); + } else { + ReportError("Expected integer or identifier."); + return false; + } + + if (enum_value == NULL) { + ReportError("Unknown enumeration value of \"" + value + "\" for " + "field \"" + field->name() + "\"."); + return false; + } + + SET_FIELD(Enum, enum_value); + break; + } + + case FieldDescriptor::CPPTYPE_MESSAGE: { + // We should never get here. Put here instead of a default + // so that if new types are added, we get a nice compiler warning. + GOOGLE_LOG(FATAL) << "Reached an unintended state: CPPTYPE_MESSAGE"; + break; + } + } +#undef SET_FIELD + return true; + } + + // Returns true if the current token's text is equal to that specified. + bool LookingAt(const string& text) { + return tokenizer_.current().text == text; + } + + // Returns true if the current token's type is equal to that specified. + bool LookingAtType(io::Tokenizer::TokenType token_type) { + return tokenizer_.current().type == token_type; + } + + // Consumes an identifier and saves its value in the identifier parameter. + // Returns false if the token is not of type IDENTFIER. + bool ConsumeIdentifier(string* identifier) { + if (!LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + ReportError("Expected identifier."); + return false; + } + + *identifier = tokenizer_.current().text; + + tokenizer_.Next(); + return true; + } + + // Consumes a string and saves its value in the text parameter. + // Returns false if the token is not of type STRING. + bool ConsumeString(string* text) { + if (!LookingAtType(io::Tokenizer::TYPE_STRING)) { + ReportError("Expected string."); + return false; + } + + text->clear(); + while (LookingAtType(io::Tokenizer::TYPE_STRING)) { + io::Tokenizer::ParseStringAppend(tokenizer_.current().text, text); + + tokenizer_.Next(); + } + + return true; + } + + // Consumes a uint64 and saves its value in the value parameter. + // Returns false if the token is not of type INTEGER. + bool ConsumeUnsignedInteger(uint64* value, uint64 max_value) { + if (!LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + ReportError("Expected integer."); + return false; + } + + if (!io::Tokenizer::ParseInteger(tokenizer_.current().text, + max_value, value)) { + ReportError("Integer out of range."); + return false; + } + + tokenizer_.Next(); + return true; + } + + // Consumes an int64 and saves its value in the value parameter. + // Note that since the tokenizer does not support negative numbers, + // we actually may consume an additional token (for the minus sign) in this + // method. Returns false if the token is not an integer + // (signed or otherwise). + bool ConsumeSignedInteger(int64* value, uint64 max_value) { + bool negative = false; + + if (TryConsume("-")) { + negative = true; + // Two's complement always allows one more negative integer than + // positive. + ++max_value; + } + + uint64 unsigned_value; + + DO(ConsumeUnsignedInteger(&unsigned_value, max_value)); + + *value = static_cast(unsigned_value); + + if (negative) { + *value = -*value; + } + + return true; + } + + // Consumes a double and saves its value in the value parameter. + // Note that since the tokenizer does not support negative numbers, + // we actually may consume an additional token (for the minus sign) in this + // method. Returns false if the token is not a double + // (signed or otherwise). + bool ConsumeDouble(double* value) { + bool negative = false; + + if (TryConsume("-")) { + negative = true; + } + + // A double can actually be an integer, according to the tokenizer. + // Therefore, we must check both cases here. + if (LookingAtType(io::Tokenizer::TYPE_INTEGER)) { + // We have found an integer value for the double. + uint64 integer_value; + DO(ConsumeUnsignedInteger(&integer_value, kuint64max)); + + *value = static_cast(integer_value); + } else if (LookingAtType(io::Tokenizer::TYPE_FLOAT)) { + // We have found a float value for the double. + *value = io::Tokenizer::ParseFloat(tokenizer_.current().text); + + // Mark the current token as consumed. + tokenizer_.Next(); + } else if (LookingAtType(io::Tokenizer::TYPE_IDENTIFIER)) { + string text = tokenizer_.current().text; + LowerString(&text); + if (text == "inf" || text == "infinity") { + *value = std::numeric_limits::infinity(); + tokenizer_.Next(); + } else if (text == "nan") { + *value = std::numeric_limits::quiet_NaN(); + tokenizer_.Next(); + } else { + ReportError("Expected double."); + return false; + } + } else { + ReportError("Expected double."); + return false; + } + + if (negative) { + *value = -*value; + } + + return true; + } + + // Consumes a token and confirms that it matches that specified in the + // value parameter. Returns false if the token found does not match that + // which was specified. + bool Consume(const string& value) { + const string& current_value = tokenizer_.current().text; + + if (current_value != value) { + ReportError("Expected \"" + value + "\", found \"" + current_value + + "\"."); + return false; + } + + tokenizer_.Next(); + + return true; + } + + // Attempts to consume the supplied value. Returns false if a the + // token found does not match the value specified. + bool TryConsume(const string& value) { + if (tokenizer_.current().text == value) { + tokenizer_.Next(); + return true; + } else { + return false; + } + } + + // An internal instance of the Tokenizer's error collector, used to + // collect any base-level parse errors and feed them to the ParserImpl. + class ParserErrorCollector : public io::ErrorCollector { + public: + explicit ParserErrorCollector(TextFormat::Parser::ParserImpl* parser) : + parser_(parser) { } + + virtual ~ParserErrorCollector() { }; + + virtual void AddError(int line, int column, const string& message) { + parser_->ReportError(line, column, message); + } + + virtual void AddWarning(int line, int column, const string& message) { + parser_->ReportWarning(line, column, message); + } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ParserErrorCollector); + TextFormat::Parser::ParserImpl* parser_; + }; + + io::ErrorCollector* error_collector_; + TextFormat::Finder* finder_; + ParserErrorCollector tokenizer_error_collector_; + io::Tokenizer tokenizer_; + const Descriptor* root_message_type_; + SingularOverwritePolicy singular_overwrite_policy_; + bool had_errors_; +}; + +#undef DO + +// =========================================================================== +// Internal class for writing text to the io::ZeroCopyOutputStream. Adapted +// from the Printer found in //google/protobuf/io/printer.h +class TextFormat::Printer::TextGenerator { + public: + explicit TextGenerator(io::ZeroCopyOutputStream* output, + int initial_indent_level) + : output_(output), + buffer_(NULL), + buffer_size_(0), + at_start_of_line_(true), + failed_(false), + indent_(""), + initial_indent_level_(initial_indent_level) { + indent_.resize(initial_indent_level_ * 2, ' '); + } + + ~TextGenerator() { + // Only BackUp() if we're sure we've successfully called Next() at least + // once. + if (buffer_size_ > 0) { + output_->BackUp(buffer_size_); + } + } + + // Indent text by two spaces. After calling Indent(), two spaces will be + // inserted at the beginning of each line of text. Indent() may be called + // multiple times to produce deeper indents. + void Indent() { + indent_ += " "; + } + + // Reduces the current indent level by two spaces, or crashes if the indent + // level is zero. + void Outdent() { + if (indent_.empty() || + indent_.size() < initial_indent_level_ * 2) { + GOOGLE_LOG(DFATAL) << " Outdent() without matching Indent()."; + return; + } + + indent_.resize(indent_.size() - 2); + } + + // Print text to the output stream. + void Print(const string& str) { + Print(str.data(), str.size()); + } + + // Print text to the output stream. + void Print(const char* text) { + Print(text, strlen(text)); + } + + // Print text to the output stream. + void Print(const char* text, int size) { + int pos = 0; // The number of bytes we've written so far. + + for (int i = 0; i < size; i++) { + if (text[i] == '\n') { + // Saw newline. If there is more text, we may need to insert an indent + // here. So, write what we have so far, including the '\n'. + Write(text + pos, i - pos + 1); + pos = i + 1; + + // Setting this true will cause the next Write() to insert an indent + // first. + at_start_of_line_ = true; + } + } + + // Write the rest. + Write(text + pos, size - pos); + } + + // True if any write to the underlying stream failed. (We don't just + // crash in this case because this is an I/O failure, not a programming + // error.) + bool failed() const { return failed_; } + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextGenerator); + + void Write(const char* data, int size) { + if (failed_) return; + if (size == 0) return; + + if (at_start_of_line_) { + // Insert an indent. + at_start_of_line_ = false; + Write(indent_.data(), indent_.size()); + if (failed_) return; + } + + while (size > buffer_size_) { + // Data exceeds space in the buffer. Copy what we can and request a + // new buffer. + memcpy(buffer_, data, buffer_size_); + data += buffer_size_; + size -= buffer_size_; + void* void_buffer; + failed_ = !output_->Next(&void_buffer, &buffer_size_); + if (failed_) return; + buffer_ = reinterpret_cast(void_buffer); + } + + // Buffer is big enough to receive the data; copy it. + memcpy(buffer_, data, size); + buffer_ += size; + buffer_size_ -= size; + } + + io::ZeroCopyOutputStream* const output_; + char* buffer_; + int buffer_size_; + bool at_start_of_line_; + bool failed_; + + string indent_; + int initial_indent_level_; +}; + +// =========================================================================== + +TextFormat::Finder::~Finder() { +} + +TextFormat::Parser::Parser() + : error_collector_(NULL), + finder_(NULL), + allow_partial_(false) { +} + +TextFormat::Parser::~Parser() {} + +bool TextFormat::Parser::Parse(io::ZeroCopyInputStream* input, + Message* output) { + output->Clear(); + ParserImpl parser(output->GetDescriptor(), input, error_collector_, + finder_, ParserImpl::FORBID_SINGULAR_OVERWRITES); + return MergeUsingImpl(input, output, &parser); +} + +bool TextFormat::Parser::ParseFromString(const string& input, + Message* output) { + io::ArrayInputStream input_stream(input.data(), input.size()); + return Parse(&input_stream, output); +} + +bool TextFormat::Parser::Merge(io::ZeroCopyInputStream* input, + Message* output) { + ParserImpl parser(output->GetDescriptor(), input, error_collector_, + finder_, ParserImpl::ALLOW_SINGULAR_OVERWRITES); + return MergeUsingImpl(input, output, &parser); +} + +bool TextFormat::Parser::MergeFromString(const string& input, + Message* output) { + io::ArrayInputStream input_stream(input.data(), input.size()); + return Merge(&input_stream, output); +} + +bool TextFormat::Parser::MergeUsingImpl(io::ZeroCopyInputStream* input, + Message* output, + ParserImpl* parser_impl) { + if (!parser_impl->Parse(output)) return false; + if (!allow_partial_ && !output->IsInitialized()) { + vector missing_fields; + output->FindInitializationErrors(&missing_fields); + parser_impl->ReportError(-1, 0, "Message missing required fields: " + + JoinStrings(missing_fields, ", ")); + return false; + } + return true; +} + +bool TextFormat::Parser::ParseFieldValueFromString( + const string& input, + const FieldDescriptor* field, + Message* output) { + io::ArrayInputStream input_stream(input.data(), input.size()); + ParserImpl parser(output->GetDescriptor(), &input_stream, error_collector_, + finder_, ParserImpl::ALLOW_SINGULAR_OVERWRITES); + return parser.ParseField(field, output); +} + +/* static */ bool TextFormat::Parse(io::ZeroCopyInputStream* input, + Message* output) { + return Parser().Parse(input, output); +} + +/* static */ bool TextFormat::Merge(io::ZeroCopyInputStream* input, + Message* output) { + return Parser().Merge(input, output); +} + +/* static */ bool TextFormat::ParseFromString(const string& input, + Message* output) { + return Parser().ParseFromString(input, output); +} + +/* static */ bool TextFormat::MergeFromString(const string& input, + Message* output) { + return Parser().MergeFromString(input, output); +} + +// =========================================================================== + +TextFormat::Printer::Printer() + : initial_indent_level_(0), + single_line_mode_(false), + use_short_repeated_primitives_(false), + utf8_string_escaping_(false) {} + +TextFormat::Printer::~Printer() {} + +bool TextFormat::Printer::PrintToString(const Message& message, + string* output) const { + GOOGLE_DCHECK(output) << "output specified is NULL"; + + output->clear(); + io::StringOutputStream output_stream(output); + + bool result = Print(message, &output_stream); + + return result; +} + +bool TextFormat::Printer::PrintUnknownFieldsToString( + const UnknownFieldSet& unknown_fields, + string* output) const { + GOOGLE_DCHECK(output) << "output specified is NULL"; + + output->clear(); + io::StringOutputStream output_stream(output); + return PrintUnknownFields(unknown_fields, &output_stream); +} + +bool TextFormat::Printer::Print(const Message& message, + io::ZeroCopyOutputStream* output) const { + TextGenerator generator(output, initial_indent_level_); + + Print(message, generator); + + // Output false if the generator failed internally. + return !generator.failed(); +} + +bool TextFormat::Printer::PrintUnknownFields( + const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output) const { + TextGenerator generator(output, initial_indent_level_); + + PrintUnknownFields(unknown_fields, generator); + + // Output false if the generator failed internally. + return !generator.failed(); +} + +void TextFormat::Printer::Print(const Message& message, + TextGenerator& generator) const { + const Reflection* reflection = message.GetReflection(); + vector fields; + reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + PrintField(message, reflection, fields[i], generator); + } + PrintUnknownFields(reflection->GetUnknownFields(message), generator); +} + +void TextFormat::Printer::PrintFieldValueToString( + const Message& message, + const FieldDescriptor* field, + int index, + string* output) const { + + GOOGLE_DCHECK(output) << "output specified is NULL"; + + output->clear(); + io::StringOutputStream output_stream(output); + TextGenerator generator(&output_stream, initial_indent_level_); + + PrintFieldValue(message, message.GetReflection(), field, index, generator); +} + +void TextFormat::Printer::PrintField(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const { + if (use_short_repeated_primitives_ && + field->is_repeated() && + field->cpp_type() != FieldDescriptor::CPPTYPE_STRING && + field->cpp_type() != FieldDescriptor::CPPTYPE_MESSAGE) { + PrintShortRepeatedField(message, reflection, field, generator); + return; + } + + int count = 0; + + if (field->is_repeated()) { + count = reflection->FieldSize(message, field); + } else if (reflection->HasField(message, field)) { + count = 1; + } + + for (int j = 0; j < count; ++j) { + PrintFieldName(message, reflection, field, generator); + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (single_line_mode_) { + generator.Print(" { "); + } else { + generator.Print(" {\n"); + generator.Indent(); + } + } else { + generator.Print(": "); + } + + // Write the field value. + int field_index = j; + if (!field->is_repeated()) { + field_index = -1; + } + + PrintFieldValue(message, reflection, field, field_index, generator); + + if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { + if (single_line_mode_) { + generator.Print("} "); + } else { + generator.Outdent(); + generator.Print("}\n"); + } + } else { + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + } + } +} + +void TextFormat::Printer::PrintShortRepeatedField( + const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const { + // Print primitive repeated field in short form. + PrintFieldName(message, reflection, field, generator); + + int size = reflection->FieldSize(message, field); + generator.Print(": ["); + for (int i = 0; i < size; i++) { + if (i > 0) generator.Print(", "); + PrintFieldValue(message, reflection, field, i, generator); + } + if (single_line_mode_) { + generator.Print("] "); + } else { + generator.Print("]\n"); + } +} + +void TextFormat::Printer::PrintFieldName(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const { + if (field->is_extension()) { + generator.Print("["); + // We special-case MessageSet elements for compatibility with proto1. + if (field->containing_type()->options().message_set_wire_format() + && field->type() == FieldDescriptor::TYPE_MESSAGE + && field->is_optional() + && field->extension_scope() == field->message_type()) { + generator.Print(field->message_type()->full_name()); + } else { + generator.Print(field->full_name()); + } + generator.Print("]"); + } else { + if (field->type() == FieldDescriptor::TYPE_GROUP) { + // Groups must be serialized with their original capitalization. + generator.Print(field->message_type()->name()); + } else { + generator.Print(field->name()); + } + } +} + +void TextFormat::Printer::PrintFieldValue( + const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + int index, + TextGenerator& generator) const { + GOOGLE_DCHECK(field->is_repeated() || (index == -1)) + << "Index must be -1 for non-repeated fields"; + + switch (field->cpp_type()) { +#define OUTPUT_FIELD(CPPTYPE, METHOD, TO_STRING) \ + case FieldDescriptor::CPPTYPE_##CPPTYPE: \ + generator.Print(TO_STRING(field->is_repeated() ? \ + reflection->GetRepeated##METHOD(message, field, index) : \ + reflection->Get##METHOD(message, field))); \ + break; \ + + OUTPUT_FIELD( INT32, Int32, SimpleItoa); + OUTPUT_FIELD( INT64, Int64, SimpleItoa); + OUTPUT_FIELD(UINT32, UInt32, SimpleItoa); + OUTPUT_FIELD(UINT64, UInt64, SimpleItoa); + OUTPUT_FIELD( FLOAT, Float, SimpleFtoa); + OUTPUT_FIELD(DOUBLE, Double, SimpleDtoa); +#undef OUTPUT_FIELD + + case FieldDescriptor::CPPTYPE_STRING: { + string scratch; + const string& value = field->is_repeated() ? + reflection->GetRepeatedStringReference( + message, field, index, &scratch) : + reflection->GetStringReference(message, field, &scratch); + + generator.Print("\""); + if (utf8_string_escaping_) { + generator.Print(strings::Utf8SafeCEscape(value)); + } else { + generator.Print(CEscape(value)); + } + generator.Print("\""); + + break; + } + + case FieldDescriptor::CPPTYPE_BOOL: + if (field->is_repeated()) { + generator.Print(reflection->GetRepeatedBool(message, field, index) + ? "true" : "false"); + } else { + generator.Print(reflection->GetBool(message, field) + ? "true" : "false"); + } + break; + + case FieldDescriptor::CPPTYPE_ENUM: + generator.Print(field->is_repeated() ? + reflection->GetRepeatedEnum(message, field, index)->name() : + reflection->GetEnum(message, field)->name()); + break; + + case FieldDescriptor::CPPTYPE_MESSAGE: + Print(field->is_repeated() ? + reflection->GetRepeatedMessage(message, field, index) : + reflection->GetMessage(message, field), + generator); + break; + } +} + +/* static */ bool TextFormat::Print(const Message& message, + io::ZeroCopyOutputStream* output) { + return Printer().Print(message, output); +} + +/* static */ bool TextFormat::PrintUnknownFields( + const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output) { + return Printer().PrintUnknownFields(unknown_fields, output); +} + +/* static */ bool TextFormat::PrintToString( + const Message& message, string* output) { + return Printer().PrintToString(message, output); +} + +/* static */ bool TextFormat::PrintUnknownFieldsToString( + const UnknownFieldSet& unknown_fields, string* output) { + return Printer().PrintUnknownFieldsToString(unknown_fields, output); +} + +/* static */ void TextFormat::PrintFieldValueToString( + const Message& message, + const FieldDescriptor* field, + int index, + string* output) { + return Printer().PrintFieldValueToString(message, field, index, output); +} + +/* static */ bool TextFormat::ParseFieldValueFromString( + const string& input, + const FieldDescriptor* field, + Message* message) { + return Parser().ParseFieldValueFromString(input, field, message); +} + +// Prints an integer as hex with a fixed number of digits dependent on the +// integer type. +template +static string PaddedHex(IntType value) { + string result; + result.reserve(sizeof(value) * 2); + for (int i = sizeof(value) * 2 - 1; i >= 0; i--) { + result.push_back(int_to_hex_digit(value >> (i*4) & 0x0F)); + } + return result; +} + +void TextFormat::Printer::PrintUnknownFields( + const UnknownFieldSet& unknown_fields, TextGenerator& generator) const { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + string field_number = SimpleItoa(field.number()); + + switch (field.type()) { + case UnknownField::TYPE_VARINT: + generator.Print(field_number); + generator.Print(": "); + generator.Print(SimpleItoa(field.varint())); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + break; + case UnknownField::TYPE_FIXED32: { + generator.Print(field_number); + generator.Print(": 0x"); + char buffer[kFastToBufferSize]; + generator.Print(FastHex32ToBuffer(field.fixed32(), buffer)); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + break; + } + case UnknownField::TYPE_FIXED64: { + generator.Print(field_number); + generator.Print(": 0x"); + char buffer[kFastToBufferSize]; + generator.Print(FastHex64ToBuffer(field.fixed64(), buffer)); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + break; + } + case UnknownField::TYPE_LENGTH_DELIMITED: { + generator.Print(field_number); + const string& value = field.length_delimited(); + UnknownFieldSet embedded_unknown_fields; + if (!value.empty() && embedded_unknown_fields.ParseFromString(value)) { + // This field is parseable as a Message. + // So it is probably an embedded message. + if (single_line_mode_) { + generator.Print(" { "); + } else { + generator.Print(" {\n"); + generator.Indent(); + } + PrintUnknownFields(embedded_unknown_fields, generator); + if (single_line_mode_) { + generator.Print("} "); + } else { + generator.Outdent(); + generator.Print("}\n"); + } + } else { + // This field is not parseable as a Message. + // So it is probably just a plain string. + generator.Print(": \""); + generator.Print(CEscape(value)); + generator.Print("\""); + if (single_line_mode_) { + generator.Print(" "); + } else { + generator.Print("\n"); + } + } + break; + } + case UnknownField::TYPE_GROUP: + generator.Print(field_number); + if (single_line_mode_) { + generator.Print(" { "); + } else { + generator.Print(" {\n"); + generator.Indent(); + } + PrintUnknownFields(field.group(), generator); + if (single_line_mode_) { + generator.Print("} "); + } else { + generator.Outdent(); + generator.Print("}\n"); + } + break; + } + } +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h new file mode 100644 index 000000000..03c049102 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h @@ -0,0 +1,285 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jschorr@google.com (Joseph Schorr) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Utilities for printing and parsing protocol messages in a human-readable, +// text-based format. + +#ifndef GOOGLE_PROTOBUF_TEXT_FORMAT_H__ +#define GOOGLE_PROTOBUF_TEXT_FORMAT_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + +namespace io { + class ErrorCollector; // tokenizer.h +} + +// This class implements protocol buffer text format. Printing and parsing +// protocol messages in text format is useful for debugging and human editing +// of messages. +// +// This class is really a namespace that contains only static methods. +class LIBPROTOBUF_EXPORT TextFormat { + public: + // Outputs a textual representation of the given message to the given + // output stream. + static bool Print(const Message& message, io::ZeroCopyOutputStream* output); + + // Print the fields in an UnknownFieldSet. They are printed by tag number + // only. Embedded messages are heuristically identified by attempting to + // parse them. + static bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output); + + // Like Print(), but outputs directly to a string. + static bool PrintToString(const Message& message, string* output); + + // Like PrintUnknownFields(), but outputs directly to a string. + static bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, + string* output); + + // Outputs a textual representation of the value of the field supplied on + // the message supplied. For non-repeated fields, an index of -1 must + // be supplied. Note that this method will print the default value for a + // field if it is not set. + static void PrintFieldValueToString(const Message& message, + const FieldDescriptor* field, + int index, + string* output); + + // Class for those users which require more fine-grained control over how + // a protobuffer message is printed out. + class LIBPROTOBUF_EXPORT Printer { + public: + Printer(); + ~Printer(); + + // Like TextFormat::Print + bool Print(const Message& message, io::ZeroCopyOutputStream* output) const; + // Like TextFormat::PrintUnknownFields + bool PrintUnknownFields(const UnknownFieldSet& unknown_fields, + io::ZeroCopyOutputStream* output) const; + // Like TextFormat::PrintToString + bool PrintToString(const Message& message, string* output) const; + // Like TextFormat::PrintUnknownFieldsToString + bool PrintUnknownFieldsToString(const UnknownFieldSet& unknown_fields, + string* output) const; + // Like TextFormat::PrintFieldValueToString + void PrintFieldValueToString(const Message& message, + const FieldDescriptor* field, + int index, + string* output) const; + + // Adjust the initial indent level of all output. Each indent level is + // equal to two spaces. + void SetInitialIndentLevel(int indent_level) { + initial_indent_level_ = indent_level; + } + + // If printing in single line mode, then the entire message will be output + // on a single line with no line breaks. + void SetSingleLineMode(bool single_line_mode) { + single_line_mode_ = single_line_mode; + } + + // Set true to print repeated primitives in a format like: + // field_name: [1, 2, 3, 4] + // instead of printing each value on its own line. Short format applies + // only to primitive values -- i.e. everything except strings and + // sub-messages/groups. + void SetUseShortRepeatedPrimitives(bool use_short_repeated_primitives) { + use_short_repeated_primitives_ = use_short_repeated_primitives; + } + + // Set true to output UTF-8 instead of ASCII. The only difference + // is that bytes >= 0x80 in string fields will not be escaped, + // because they are assumed to be part of UTF-8 multi-byte + // sequences. + void SetUseUtf8StringEscaping(bool as_utf8) { + utf8_string_escaping_ = as_utf8; + } + + private: + // Forward declaration of an internal class used to print the text + // output to the OutputStream (see text_format.cc for implementation). + class TextGenerator; + + // Internal Print method, used for writing to the OutputStream via + // the TextGenerator class. + void Print(const Message& message, + TextGenerator& generator) const; + + // Print a single field. + void PrintField(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const; + + // Print a repeated primitive field in short form. + void PrintShortRepeatedField(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const; + + // Print the name of a field -- i.e. everything that comes before the + // ':' for a single name/value pair. + void PrintFieldName(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + TextGenerator& generator) const; + + // Outputs a textual representation of the value of the field supplied on + // the message supplied or the default value if not set. + void PrintFieldValue(const Message& message, + const Reflection* reflection, + const FieldDescriptor* field, + int index, + TextGenerator& generator) const; + + // Print the fields in an UnknownFieldSet. They are printed by tag number + // only. Embedded messages are heuristically identified by attempting to + // parse them. + void PrintUnknownFields(const UnknownFieldSet& unknown_fields, + TextGenerator& generator) const; + + int initial_indent_level_; + + bool single_line_mode_; + + bool use_short_repeated_primitives_; + + bool utf8_string_escaping_; + }; + + // Parses a text-format protocol message from the given input stream to + // the given message object. This function parses the format written + // by Print(). + static bool Parse(io::ZeroCopyInputStream* input, Message* output); + // Like Parse(), but reads directly from a string. + static bool ParseFromString(const string& input, Message* output); + + // Like Parse(), but the data is merged into the given message, as if + // using Message::MergeFrom(). + static bool Merge(io::ZeroCopyInputStream* input, Message* output); + // Like Merge(), but reads directly from a string. + static bool MergeFromString(const string& input, Message* output); + + // Parse the given text as a single field value and store it into the + // given field of the given message. If the field is a repeated field, + // the new value will be added to the end + static bool ParseFieldValueFromString(const string& input, + const FieldDescriptor* field, + Message* message); + + // Interface that TextFormat::Parser can use to find extensions. + // This class may be extended in the future to find more information + // like fields, etc. + class LIBPROTOBUF_EXPORT Finder { + public: + virtual ~Finder(); + + // Try to find an extension of *message by fully-qualified field + // name. Returns NULL if no extension is known for this name or number. + virtual const FieldDescriptor* FindExtension( + Message* message, + const string& name) const = 0; + }; + + // For more control over parsing, use this class. + class LIBPROTOBUF_EXPORT Parser { + public: + Parser(); + ~Parser(); + + // Like TextFormat::Parse(). + bool Parse(io::ZeroCopyInputStream* input, Message* output); + // Like TextFormat::ParseFromString(). + bool ParseFromString(const string& input, Message* output); + // Like TextFormat::Merge(). + bool Merge(io::ZeroCopyInputStream* input, Message* output); + // Like TextFormat::MergeFromString(). + bool MergeFromString(const string& input, Message* output); + + // Set where to report parse errors. If NULL (the default), errors will + // be printed to stderr. + void RecordErrorsTo(io::ErrorCollector* error_collector) { + error_collector_ = error_collector; + } + + // Set how parser finds extensions. If NULL (the default), the + // parser will use the standard Reflection object associated with + // the message being parsed. + void SetFinder(Finder* finder) { + finder_ = finder; + } + + // Normally parsing fails if, after parsing, output->IsInitialized() + // returns false. Call AllowPartialMessage(true) to skip this check. + void AllowPartialMessage(bool allow) { + allow_partial_ = allow; + } + + // Like TextFormat::ParseFieldValueFromString + bool ParseFieldValueFromString(const string& input, + const FieldDescriptor* field, + Message* output); + + private: + // Forward declaration of an internal class used to parse text + // representations (see text_format.cc for implementation). + class ParserImpl; + + // Like TextFormat::Merge(). The provided implementation is used + // to do the parsing. + bool MergeUsingImpl(io::ZeroCopyInputStream* input, + Message* output, + ParserImpl* parser_impl); + + io::ErrorCollector* error_collector_; + Finder* finder_; + bool allow_partial_; + }; + + private: + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormat); +}; + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_TEXT_FORMAT_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc new file mode 100644 index 000000000..00ea8c3c2 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc @@ -0,0 +1,1141 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: jschorr@google.com (Joseph Schorr) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +// Can't use an anonymous namespace here due to brokenness of Tru64 compiler. +namespace text_format_unittest { + +inline bool IsNaN(double value) { + // NaN is never equal to anything, even itself. + return value != value; +} + +// A basic string with different escapable characters for testing. +const string kEscapeTestString = + "\"A string with ' characters \n and \r newlines and \t tabs and \001 " + "slashes \\ and multiple spaces"; + +// A representation of the above string with all the characters escaped. +const string kEscapeTestStringEscaped = + "\"\\\"A string with \\' characters \\n and \\r newlines " + "and \\t tabs and \\001 slashes \\\\ and multiple spaces\""; + +class TextFormatTest : public testing::Test { + public: + static void SetUpTestCase() { + File::ReadFileToStringOrDie( + TestSourceDir() + + "/google/protobuf/testdata/text_format_unittest_data.txt", + &static_proto_debug_string_); + } + + TextFormatTest() : proto_debug_string_(static_proto_debug_string_) {} + + protected: + // Debug string read from text_format_unittest_data.txt. + const string proto_debug_string_; + unittest::TestAllTypes proto_; + + private: + static string static_proto_debug_string_; +}; +string TextFormatTest::static_proto_debug_string_; + +class TextFormatExtensionsTest : public testing::Test { + public: + static void SetUpTestCase() { + File::ReadFileToStringOrDie( + TestSourceDir() + + "/google/protobuf/testdata/" + "text_format_unittest_extensions_data.txt", + &static_proto_debug_string_); + } + + TextFormatExtensionsTest() + : proto_debug_string_(static_proto_debug_string_) {} + + protected: + // Debug string read from text_format_unittest_data.txt. + const string proto_debug_string_; + unittest::TestAllExtensions proto_; + + private: + static string static_proto_debug_string_; +}; +string TextFormatExtensionsTest::static_proto_debug_string_; + + +TEST_F(TextFormatTest, Basic) { + TestUtil::SetAllFields(&proto_); + EXPECT_EQ(proto_debug_string_, proto_.DebugString()); +} + +TEST_F(TextFormatExtensionsTest, Extensions) { + TestUtil::SetAllExtensions(&proto_); + EXPECT_EQ(proto_debug_string_, proto_.DebugString()); +} + +TEST_F(TextFormatTest, ShortDebugString) { + proto_.set_optional_int32(1); + proto_.set_optional_string("hello"); + proto_.mutable_optional_nested_message()->set_bb(2); + proto_.mutable_optional_foreign_message(); + + EXPECT_EQ("optional_int32: 1 optional_string: \"hello\" " + "optional_nested_message { bb: 2 } " + "optional_foreign_message { }", + proto_.ShortDebugString()); +} + +TEST_F(TextFormatTest, ShortPrimitiveRepeateds) { + proto_.set_optional_int32(123); + proto_.add_repeated_int32(456); + proto_.add_repeated_int32(789); + proto_.add_repeated_string("foo"); + proto_.add_repeated_string("bar"); + proto_.add_repeated_nested_message()->set_bb(2); + proto_.add_repeated_nested_message()->set_bb(3); + proto_.add_repeated_nested_enum(unittest::TestAllTypes::FOO); + proto_.add_repeated_nested_enum(unittest::TestAllTypes::BAR); + + TextFormat::Printer printer; + printer.SetUseShortRepeatedPrimitives(true); + string text; + printer.PrintToString(proto_, &text); + + EXPECT_EQ("optional_int32: 123\n" + "repeated_int32: [456, 789]\n" + "repeated_string: \"foo\"\n" + "repeated_string: \"bar\"\n" + "repeated_nested_message {\n bb: 2\n}\n" + "repeated_nested_message {\n bb: 3\n}\n" + "repeated_nested_enum: [FOO, BAR]\n", + text); + + // Try in single-line mode. + printer.SetSingleLineMode(true); + printer.PrintToString(proto_, &text); + + EXPECT_EQ("optional_int32: 123 " + "repeated_int32: [456, 789] " + "repeated_string: \"foo\" " + "repeated_string: \"bar\" " + "repeated_nested_message { bb: 2 } " + "repeated_nested_message { bb: 3 } " + "repeated_nested_enum: [FOO, BAR] ", + text); +} + + +TEST_F(TextFormatTest, StringEscape) { + // Set the string value to test. + proto_.set_optional_string(kEscapeTestString); + + // Get the DebugString from the proto. + string debug_string = proto_.DebugString(); + string utf8_debug_string = proto_.Utf8DebugString(); + + // Hardcode a correct value to test against. + string correct_string = "optional_string: " + + kEscapeTestStringEscaped + + "\n"; + + // Compare. + EXPECT_EQ(correct_string, debug_string); + // UTF-8 string is the same as non-UTF-8 because + // the protocol buffer contains no UTF-8 text. + EXPECT_EQ(correct_string, utf8_debug_string); + + string expected_short_debug_string = "optional_string: " + + kEscapeTestStringEscaped; + EXPECT_EQ(expected_short_debug_string, proto_.ShortDebugString()); +} + +TEST_F(TextFormatTest, Utf8DebugString) { + // Set the string value to test. + proto_.set_optional_string("\350\260\267\346\255\214"); + + // Get the DebugString from the proto. + string debug_string = proto_.DebugString(); + string utf8_debug_string = proto_.Utf8DebugString(); + + // Hardcode a correct value to test against. + string correct_utf8_string = "optional_string: " + "\"\350\260\267\346\255\214\"" + "\n"; + string correct_string = "optional_string: " + "\"\\350\\260\\267\\346\\255\\214\"" + "\n"; + + // Compare. + EXPECT_EQ(correct_utf8_string, utf8_debug_string); + EXPECT_EQ(correct_string, debug_string); +} + +TEST_F(TextFormatTest, PrintUnknownFields) { + // Test printing of unknown fields in a message. + + unittest::TestEmptyMessage message; + UnknownFieldSet* unknown_fields = message.mutable_unknown_fields(); + + unknown_fields->AddVarint(5, 1); + unknown_fields->AddFixed32(5, 2); + unknown_fields->AddFixed64(5, 3); + unknown_fields->AddLengthDelimited(5, "4"); + unknown_fields->AddGroup(5)->AddVarint(10, 5); + + unknown_fields->AddVarint(8, 1); + unknown_fields->AddVarint(8, 2); + unknown_fields->AddVarint(8, 3); + + EXPECT_EQ( + "5: 1\n" + "5: 0x00000002\n" + "5: 0x0000000000000003\n" + "5: \"4\"\n" + "5 {\n" + " 10: 5\n" + "}\n" + "8: 1\n" + "8: 2\n" + "8: 3\n", + message.DebugString()); +} + +TEST_F(TextFormatTest, PrintUnknownMessage) { + // Test heuristic printing of messages in an UnknownFieldSet. + + protobuf_unittest::TestAllTypes message; + + // Cases which should not be interpreted as sub-messages. + + // 'a' is a valid FIXED64 tag, so for the string to be parseable as a message + // it should be followed by 8 bytes. Since this string only has two + // subsequent bytes, it should be treated as a string. + message.add_repeated_string("abc"); + + // 'd' happens to be a valid ENDGROUP tag. So, + // UnknownFieldSet::MergeFromCodedStream() will successfully parse "def", but + // the ConsumedEntireMessage() check should fail. + message.add_repeated_string("def"); + + // A zero-length string should never be interpreted as a message even though + // it is technically valid as one. + message.add_repeated_string(""); + + // Case which should be interpreted as a sub-message. + + // An actual nested message with content should always be interpreted as a + // nested message. + message.add_repeated_nested_message()->set_bb(123); + + string data; + message.SerializeToString(&data); + + string text; + UnknownFieldSet unknown_fields; + EXPECT_TRUE(unknown_fields.ParseFromString(data)); + EXPECT_TRUE(TextFormat::PrintUnknownFieldsToString(unknown_fields, &text)); + EXPECT_EQ( + "44: \"abc\"\n" + "44: \"def\"\n" + "44: \"\"\n" + "48 {\n" + " 1: 123\n" + "}\n", + text); +} + +TEST_F(TextFormatTest, PrintMessageWithIndent) { + // Test adding an initial indent to printing. + + protobuf_unittest::TestAllTypes message; + + message.add_repeated_string("abc"); + message.add_repeated_string("def"); + message.add_repeated_nested_message()->set_bb(123); + + string text; + TextFormat::Printer printer; + printer.SetInitialIndentLevel(1); + EXPECT_TRUE(printer.PrintToString(message, &text)); + EXPECT_EQ( + " repeated_string: \"abc\"\n" + " repeated_string: \"def\"\n" + " repeated_nested_message {\n" + " bb: 123\n" + " }\n", + text); +} + +TEST_F(TextFormatTest, PrintMessageSingleLine) { + // Test printing a message on a single line. + + protobuf_unittest::TestAllTypes message; + + message.add_repeated_string("abc"); + message.add_repeated_string("def"); + message.add_repeated_nested_message()->set_bb(123); + + string text; + TextFormat::Printer printer; + printer.SetInitialIndentLevel(1); + printer.SetSingleLineMode(true); + EXPECT_TRUE(printer.PrintToString(message, &text)); + EXPECT_EQ( + " repeated_string: \"abc\" repeated_string: \"def\" " + "repeated_nested_message { bb: 123 } ", + text); +} + +TEST_F(TextFormatTest, ParseBasic) { + io::ArrayInputStream input_stream(proto_debug_string_.data(), + proto_debug_string_.size()); + TextFormat::Parse(&input_stream, &proto_); + TestUtil::ExpectAllFieldsSet(proto_); +} + +TEST_F(TextFormatExtensionsTest, ParseExtensions) { + io::ArrayInputStream input_stream(proto_debug_string_.data(), + proto_debug_string_.size()); + TextFormat::Parse(&input_stream, &proto_); + TestUtil::ExpectAllExtensionsSet(proto_); +} + +TEST_F(TextFormatTest, ParseEnumFieldFromNumber) { + // Create a parse string with a numerical value for an enum field. + string parse_string = strings::Substitute("optional_nested_enum: $0", + unittest::TestAllTypes::BAZ); + EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto_)); + EXPECT_TRUE(proto_.has_optional_nested_enum()); + EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.optional_nested_enum()); +} + +TEST_F(TextFormatTest, ParseEnumFieldFromNegativeNumber) { + ASSERT_LT(unittest::SPARSE_E, 0); + string parse_string = strings::Substitute("sparse_enum: $0", + unittest::SPARSE_E); + unittest::SparseEnumMessage proto; + EXPECT_TRUE(TextFormat::ParseFromString(parse_string, &proto)); + EXPECT_TRUE(proto.has_sparse_enum()); + EXPECT_EQ(unittest::SPARSE_E, proto.sparse_enum()); +} + +TEST_F(TextFormatTest, ParseStringEscape) { + // Create a parse string with escpaed characters in it. + string parse_string = "optional_string: " + + kEscapeTestStringEscaped + + "\n"; + + io::ArrayInputStream input_stream(parse_string.data(), + parse_string.size()); + TextFormat::Parse(&input_stream, &proto_); + + // Compare. + EXPECT_EQ(kEscapeTestString, proto_.optional_string()); +} + +TEST_F(TextFormatTest, ParseConcatenatedString) { + // Create a parse string with multiple parts on one line. + string parse_string = "optional_string: \"foo\" \"bar\"\n"; + + io::ArrayInputStream input_stream1(parse_string.data(), + parse_string.size()); + TextFormat::Parse(&input_stream1, &proto_); + + // Compare. + EXPECT_EQ("foobar", proto_.optional_string()); + + // Create a parse string with multiple parts on seperate lines. + parse_string = "optional_string: \"foo\"\n" + "\"bar\"\n"; + + io::ArrayInputStream input_stream2(parse_string.data(), + parse_string.size()); + TextFormat::Parse(&input_stream2, &proto_); + + // Compare. + EXPECT_EQ("foobar", proto_.optional_string()); +} + +TEST_F(TextFormatTest, ParseFloatWithSuffix) { + // Test that we can parse a floating-point value with 'f' appended to the + // end. This is needed for backwards-compatibility with proto1. + + // Have it parse a float with the 'f' suffix. + string parse_string = "optional_float: 1.0f\n"; + + io::ArrayInputStream input_stream(parse_string.data(), + parse_string.size()); + + TextFormat::Parse(&input_stream, &proto_); + + // Compare. + EXPECT_EQ(1.0, proto_.optional_float()); +} + +TEST_F(TextFormatTest, ParseShortRepeatedForm) { + string parse_string = + // Mixed short-form and long-form are simply concatenated. + "repeated_int32: 1\n" + "repeated_int32: [456, 789]\n" + "repeated_nested_enum: [ FOO ,BAR, # comment\n" + " 3]\n" + // Note that while the printer won't print repeated strings in short-form, + // the parser will accept them. + "repeated_string: [ \"foo\", 'bar' ]\n"; + + ASSERT_TRUE(TextFormat::ParseFromString(parse_string, &proto_)); + + ASSERT_EQ(3, proto_.repeated_int32_size()); + EXPECT_EQ(1, proto_.repeated_int32(0)); + EXPECT_EQ(456, proto_.repeated_int32(1)); + EXPECT_EQ(789, proto_.repeated_int32(2)); + + ASSERT_EQ(3, proto_.repeated_nested_enum_size()); + EXPECT_EQ(unittest::TestAllTypes::FOO, proto_.repeated_nested_enum(0)); + EXPECT_EQ(unittest::TestAllTypes::BAR, proto_.repeated_nested_enum(1)); + EXPECT_EQ(unittest::TestAllTypes::BAZ, proto_.repeated_nested_enum(2)); + + ASSERT_EQ(2, proto_.repeated_string_size()); + EXPECT_EQ("foo", proto_.repeated_string(0)); + EXPECT_EQ("bar", proto_.repeated_string(1)); +} + +TEST_F(TextFormatTest, Comments) { + // Test that comments are ignored. + + string parse_string = "optional_int32: 1 # a comment\n" + "optional_int64: 2 # another comment"; + + io::ArrayInputStream input_stream(parse_string.data(), + parse_string.size()); + + TextFormat::Parse(&input_stream, &proto_); + + // Compare. + EXPECT_EQ(1, proto_.optional_int32()); + EXPECT_EQ(2, proto_.optional_int64()); +} + +TEST_F(TextFormatTest, OptionalColon) { + // Test that we can place a ':' after the field name of a nested message, + // even though we don't have to. + + string parse_string = "optional_nested_message: { bb: 1}\n"; + + io::ArrayInputStream input_stream(parse_string.data(), + parse_string.size()); + + TextFormat::Parse(&input_stream, &proto_); + + // Compare. + EXPECT_TRUE(proto_.has_optional_nested_message()); + EXPECT_EQ(1, proto_.optional_nested_message().bb()); +} + +// Some platforms (e.g. Windows) insist on padding the exponent to three +// digits when one or two would be just fine. +static string RemoveRedundantZeros(string text) { + text = StringReplace(text, "e+0", "e+", true); + text = StringReplace(text, "e-0", "e-", true); + return text; +} + +TEST_F(TextFormatTest, PrintExotic) { + unittest::TestAllTypes message; + + // Note: In C, a negative integer literal is actually the unary negation + // operator being applied to a positive integer literal, and + // 9223372036854775808 is outside the range of int64. However, it is not + // outside the range of uint64. Confusingly, this means that everything + // works if we make the literal unsigned, even though we are negating it. + message.add_repeated_int64(-GOOGLE_ULONGLONG(9223372036854775808)); + message.add_repeated_uint64(GOOGLE_ULONGLONG(18446744073709551615)); + message.add_repeated_double(123.456); + message.add_repeated_double(1.23e21); + message.add_repeated_double(1.23e-18); + message.add_repeated_double(std::numeric_limits::infinity()); + message.add_repeated_double(-std::numeric_limits::infinity()); + message.add_repeated_double(std::numeric_limits::quiet_NaN()); + message.add_repeated_string(string("\000\001\a\b\f\n\r\t\v\\\'\"", 12)); + + // Fun story: We used to use 1.23e22 instead of 1.23e21 above, but this + // seemed to trigger an odd case on MinGW/GCC 3.4.5 where GCC's parsing of + // the value differed from strtod()'s parsing. That is to say, the + // following assertion fails on MinGW: + // assert(1.23e22 == strtod("1.23e22", NULL)); + // As a result, SimpleDtoa() would print the value as + // "1.2300000000000001e+22" to make sure strtod() produce the exact same + // result. Our goal is to test runtime parsing, not compile-time parsing, + // so this wasn't our problem. It was found that using 1.23e21 did not + // have this problem, so we switched to that instead. + + EXPECT_EQ( + "repeated_int64: -9223372036854775808\n" + "repeated_uint64: 18446744073709551615\n" + "repeated_double: 123.456\n" + "repeated_double: 1.23e+21\n" + "repeated_double: 1.23e-18\n" + "repeated_double: inf\n" + "repeated_double: -inf\n" + "repeated_double: nan\n" + "repeated_string: \"\\000\\001\\007\\010\\014\\n\\r\\t\\013\\\\\\'\\\"\"\n", + RemoveRedundantZeros(message.DebugString())); +} + +TEST_F(TextFormatTest, PrintFloatPrecision) { + unittest::TestAllTypes message; + + message.add_repeated_float(1.2); + message.add_repeated_float(1.23); + message.add_repeated_float(1.234); + message.add_repeated_float(1.2345); + message.add_repeated_float(1.23456); + message.add_repeated_float(1.2e10); + message.add_repeated_float(1.23e10); + message.add_repeated_float(1.234e10); + message.add_repeated_float(1.2345e10); + message.add_repeated_float(1.23456e10); + message.add_repeated_double(1.2); + message.add_repeated_double(1.23); + message.add_repeated_double(1.234); + message.add_repeated_double(1.2345); + message.add_repeated_double(1.23456); + message.add_repeated_double(1.234567); + message.add_repeated_double(1.2345678); + message.add_repeated_double(1.23456789); + message.add_repeated_double(1.234567898); + message.add_repeated_double(1.2345678987); + message.add_repeated_double(1.23456789876); + message.add_repeated_double(1.234567898765); + message.add_repeated_double(1.2345678987654); + message.add_repeated_double(1.23456789876543); + message.add_repeated_double(1.2e100); + message.add_repeated_double(1.23e100); + message.add_repeated_double(1.234e100); + message.add_repeated_double(1.2345e100); + message.add_repeated_double(1.23456e100); + message.add_repeated_double(1.234567e100); + message.add_repeated_double(1.2345678e100); + message.add_repeated_double(1.23456789e100); + message.add_repeated_double(1.234567898e100); + message.add_repeated_double(1.2345678987e100); + message.add_repeated_double(1.23456789876e100); + message.add_repeated_double(1.234567898765e100); + message.add_repeated_double(1.2345678987654e100); + message.add_repeated_double(1.23456789876543e100); + + EXPECT_EQ( + "repeated_float: 1.2\n" + "repeated_float: 1.23\n" + "repeated_float: 1.234\n" + "repeated_float: 1.2345\n" + "repeated_float: 1.23456\n" + "repeated_float: 1.2e+10\n" + "repeated_float: 1.23e+10\n" + "repeated_float: 1.234e+10\n" + "repeated_float: 1.2345e+10\n" + "repeated_float: 1.23456e+10\n" + "repeated_double: 1.2\n" + "repeated_double: 1.23\n" + "repeated_double: 1.234\n" + "repeated_double: 1.2345\n" + "repeated_double: 1.23456\n" + "repeated_double: 1.234567\n" + "repeated_double: 1.2345678\n" + "repeated_double: 1.23456789\n" + "repeated_double: 1.234567898\n" + "repeated_double: 1.2345678987\n" + "repeated_double: 1.23456789876\n" + "repeated_double: 1.234567898765\n" + "repeated_double: 1.2345678987654\n" + "repeated_double: 1.23456789876543\n" + "repeated_double: 1.2e+100\n" + "repeated_double: 1.23e+100\n" + "repeated_double: 1.234e+100\n" + "repeated_double: 1.2345e+100\n" + "repeated_double: 1.23456e+100\n" + "repeated_double: 1.234567e+100\n" + "repeated_double: 1.2345678e+100\n" + "repeated_double: 1.23456789e+100\n" + "repeated_double: 1.234567898e+100\n" + "repeated_double: 1.2345678987e+100\n" + "repeated_double: 1.23456789876e+100\n" + "repeated_double: 1.234567898765e+100\n" + "repeated_double: 1.2345678987654e+100\n" + "repeated_double: 1.23456789876543e+100\n", + RemoveRedundantZeros(message.DebugString())); +} + + +TEST_F(TextFormatTest, AllowPartial) { + unittest::TestRequired message; + TextFormat::Parser parser; + parser.AllowPartialMessage(true); + EXPECT_TRUE(parser.ParseFromString("a: 1", &message)); + EXPECT_EQ(1, message.a()); + EXPECT_FALSE(message.has_b()); + EXPECT_FALSE(message.has_c()); +} + +TEST_F(TextFormatTest, ParseExotic) { + unittest::TestAllTypes message; + ASSERT_TRUE(TextFormat::ParseFromString( + "repeated_int32: -1\n" + "repeated_int32: -2147483648\n" + "repeated_int64: -1\n" + "repeated_int64: -9223372036854775808\n" + "repeated_uint32: 4294967295\n" + "repeated_uint32: 2147483648\n" + "repeated_uint64: 18446744073709551615\n" + "repeated_uint64: 9223372036854775808\n" + "repeated_double: 123.0\n" + "repeated_double: 123.5\n" + "repeated_double: 0.125\n" + "repeated_double: 1.23E17\n" + "repeated_double: 1.235E+22\n" + "repeated_double: 1.235e-18\n" + "repeated_double: 123.456789\n" + "repeated_double: inf\n" + "repeated_double: Infinity\n" + "repeated_double: -inf\n" + "repeated_double: -Infinity\n" + "repeated_double: nan\n" + "repeated_double: NaN\n" + "repeated_string: \"\\000\\001\\a\\b\\f\\n\\r\\t\\v\\\\\\'\\\"\"\n", + &message)); + + ASSERT_EQ(2, message.repeated_int32_size()); + EXPECT_EQ(-1, message.repeated_int32(0)); + // Note: In C, a negative integer literal is actually the unary negation + // operator being applied to a positive integer literal, and 2147483648 is + // outside the range of int32. However, it is not outside the range of + // uint32. Confusingly, this means that everything works if we make the + // literal unsigned, even though we are negating it. + EXPECT_EQ(-2147483648u, message.repeated_int32(1)); + + ASSERT_EQ(2, message.repeated_int64_size()); + EXPECT_EQ(-1, message.repeated_int64(0)); + // Note: In C, a negative integer literal is actually the unary negation + // operator being applied to a positive integer literal, and + // 9223372036854775808 is outside the range of int64. However, it is not + // outside the range of uint64. Confusingly, this means that everything + // works if we make the literal unsigned, even though we are negating it. + EXPECT_EQ(-GOOGLE_ULONGLONG(9223372036854775808), message.repeated_int64(1)); + + ASSERT_EQ(2, message.repeated_uint32_size()); + EXPECT_EQ(4294967295u, message.repeated_uint32(0)); + EXPECT_EQ(2147483648u, message.repeated_uint32(1)); + + ASSERT_EQ(2, message.repeated_uint64_size()); + EXPECT_EQ(GOOGLE_ULONGLONG(18446744073709551615), message.repeated_uint64(0)); + EXPECT_EQ(GOOGLE_ULONGLONG(9223372036854775808), message.repeated_uint64(1)); + + ASSERT_EQ(13, message.repeated_double_size()); + EXPECT_EQ(123.0 , message.repeated_double(0)); + EXPECT_EQ(123.5 , message.repeated_double(1)); + EXPECT_EQ(0.125 , message.repeated_double(2)); + EXPECT_EQ(1.23E17 , message.repeated_double(3)); + EXPECT_EQ(1.235E22 , message.repeated_double(4)); + EXPECT_EQ(1.235E-18 , message.repeated_double(5)); + EXPECT_EQ(123.456789, message.repeated_double(6)); + EXPECT_EQ(message.repeated_double(7), numeric_limits::infinity()); + EXPECT_EQ(message.repeated_double(8), numeric_limits::infinity()); + EXPECT_EQ(message.repeated_double(9), -numeric_limits::infinity()); + EXPECT_EQ(message.repeated_double(10), -numeric_limits::infinity()); + EXPECT_TRUE(IsNaN(message.repeated_double(11))); + EXPECT_TRUE(IsNaN(message.repeated_double(12))); + + // Note: Since these string literals have \0's in them, we must explicitly + // pass their sizes to string's constructor. + ASSERT_EQ(1, message.repeated_string_size()); + EXPECT_EQ(string("\000\001\a\b\f\n\r\t\v\\\'\"", 12), + message.repeated_string(0)); +} + +class TextFormatParserTest : public testing::Test { + protected: + void ExpectFailure(const string& input, const string& message, int line, + int col) { + scoped_ptr proto(new unittest::TestAllTypes); + ExpectFailure(input, message, line, col, proto.get()); + } + + void ExpectFailure(const string& input, const string& message, int line, + int col, Message* proto) { + ExpectMessage(input, message, line, col, proto, false); + } + + void ExpectMessage(const string& input, const string& message, int line, + int col, Message* proto, bool expected_result) { + TextFormat::Parser parser; + MockErrorCollector error_collector; + parser.RecordErrorsTo(&error_collector); + EXPECT_EQ(parser.ParseFromString(input, proto), expected_result); + EXPECT_EQ(SimpleItoa(line) + ":" + SimpleItoa(col) + ": " + message + "\n", + error_collector.text_); + } + + // An error collector which simply concatenates all its errors into a big + // block of text which can be checked. + class MockErrorCollector : public io::ErrorCollector { + public: + MockErrorCollector() {} + ~MockErrorCollector() {} + + string text_; + + // implements ErrorCollector ------------------------------------- + void AddError(int line, int column, const string& message) { + strings::SubstituteAndAppend(&text_, "$0:$1: $2\n", + line + 1, column + 1, message); + } + + void AddWarning(int line, int column, const string& message) { + AddError(line, column, "WARNING:" + message); + } + }; +}; + +TEST_F(TextFormatParserTest, ParseFieldValueFromString) { + scoped_ptr message(new unittest::TestAllTypes); + const Descriptor* d = message->GetDescriptor(); + +#define EXPECT_FIELD(name, value, valuestring) \ + EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ + valuestring, d->FindFieldByName("optional_" #name), message.get())); \ + EXPECT_EQ(value, message->optional_##name()); \ + EXPECT_TRUE(message->has_optional_##name()); + +#define EXPECT_FLOAT_FIELD(name, value, valuestring) \ + EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ + valuestring, d->FindFieldByName("optional_" #name), message.get())); \ + EXPECT_FLOAT_EQ(value, message->optional_##name()); \ + EXPECT_TRUE(message->has_optional_##name()); + +#define EXPECT_DOUBLE_FIELD(name, value, valuestring) \ + EXPECT_TRUE(TextFormat::ParseFieldValueFromString( \ + valuestring, d->FindFieldByName("optional_" #name), message.get())); \ + EXPECT_DOUBLE_EQ(value, message->optional_##name()); \ + EXPECT_TRUE(message->has_optional_##name()); + +#define EXPECT_INVALID(name, valuestring) \ + EXPECT_FALSE(TextFormat::ParseFieldValueFromString( \ + valuestring, d->FindFieldByName("optional_" #name), message.get())); + + // int32 + EXPECT_FIELD(int32, 1, "1"); + EXPECT_FIELD(int32, -1, "-1"); + EXPECT_FIELD(int32, 0x1234, "0x1234"); + EXPECT_INVALID(int32, "a"); + EXPECT_INVALID(int32, "999999999999999999999999999999999999"); + EXPECT_INVALID(int32, "1,2"); + + // int64 + EXPECT_FIELD(int64, 1, "1"); + EXPECT_FIELD(int64, -1, "-1"); + EXPECT_FIELD(int64, 0x1234567812345678LL, "0x1234567812345678"); + EXPECT_INVALID(int64, "a"); + EXPECT_INVALID(int64, "999999999999999999999999999999999999"); + EXPECT_INVALID(int64, "1,2"); + + // uint64 + EXPECT_FIELD(uint64, 1, "1"); + EXPECT_FIELD(uint64, 0xf234567812345678ULL, "0xf234567812345678"); + EXPECT_INVALID(uint64, "-1"); + EXPECT_INVALID(uint64, "a"); + EXPECT_INVALID(uint64, "999999999999999999999999999999999999"); + EXPECT_INVALID(uint64, "1,2"); + + // fixed32 + EXPECT_FIELD(fixed32, 1, "1"); + EXPECT_FIELD(fixed32, 0x12345678, "0x12345678"); + EXPECT_INVALID(fixed32, "-1"); + EXPECT_INVALID(fixed32, "a"); + EXPECT_INVALID(fixed32, "999999999999999999999999999999999999"); + EXPECT_INVALID(fixed32, "1,2"); + + // fixed64 + EXPECT_FIELD(fixed64, 1, "1"); + EXPECT_FIELD(fixed64, 0x1234567812345678ULL, "0x1234567812345678"); + EXPECT_INVALID(fixed64, "-1"); + EXPECT_INVALID(fixed64, "a"); + EXPECT_INVALID(fixed64, "999999999999999999999999999999999999"); + EXPECT_INVALID(fixed64, "1,2"); + + // bool + EXPECT_FIELD(bool, true, "true"); + EXPECT_FIELD(bool, false, "false"); + EXPECT_FIELD(bool, true, "1"); + EXPECT_FIELD(bool, true, "t"); + EXPECT_FIELD(bool, false, "0"); + EXPECT_FIELD(bool, false, "f"); + EXPECT_INVALID(bool, "2"); + EXPECT_INVALID(bool, "-0"); + EXPECT_INVALID(bool, "on"); + EXPECT_INVALID(bool, "a"); + EXPECT_INVALID(bool, "True"); + + // float + EXPECT_FIELD(float, 1, "1"); + EXPECT_FLOAT_FIELD(float, 1.5, "1.5"); + EXPECT_FLOAT_FIELD(float, 1.5e3, "1.5e3"); + EXPECT_FLOAT_FIELD(float, -4.55, "-4.55"); + EXPECT_INVALID(float, "a"); + EXPECT_INVALID(float, "1,2"); + + // double + EXPECT_FIELD(double, 1, "1"); + EXPECT_FIELD(double, -1, "-1"); + EXPECT_DOUBLE_FIELD(double, 2.3, "2.3"); + EXPECT_DOUBLE_FIELD(double, 3e5, "3e5"); + EXPECT_INVALID(double, "a"); + EXPECT_INVALID(double, "1,2"); + + // string + EXPECT_FIELD(string, "hello", "\"hello\""); + EXPECT_FIELD(string, "-1.87", "'-1.87'"); + EXPECT_INVALID(string, "hello"); // without quote for value + + // enum + EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAR, "BAR"); + EXPECT_FIELD(nested_enum, unittest::TestAllTypes::BAZ, + SimpleItoa(unittest::TestAllTypes::BAZ)); + EXPECT_INVALID(nested_enum, "FOOBAR"); + + // message + EXPECT_TRUE(TextFormat::ParseFieldValueFromString( + "", d->FindFieldByName("optional_nested_message"), message.get())); + EXPECT_EQ(12, message->optional_nested_message().bb()); \ + EXPECT_TRUE(message->has_optional_nested_message()); + EXPECT_INVALID(nested_message, "any"); + +#undef EXPECT_FIELD +#undef EXPECT_FLOAT_FIELD +#undef EXPECT_DOUBLE_FIELD +#undef EXPECT_INVALID +} + + +TEST_F(TextFormatParserTest, InvalidToken) { + ExpectFailure("optional_bool: true\n-5\n", "Expected identifier.", + 2, 1); + + ExpectFailure("optional_bool: true!\n", "Expected identifier.", 1, 20); + ExpectFailure("\"some string\"", "Expected identifier.", 1, 1); +} + +TEST_F(TextFormatParserTest, InvalidFieldName) { + ExpectFailure( + "invalid_field: somevalue\n", + "Message type \"protobuf_unittest.TestAllTypes\" has no field named " + "\"invalid_field\".", + 1, 14); +} + +TEST_F(TextFormatParserTest, InvalidCapitalization) { + // We require that group names be exactly as they appear in the .proto. + ExpectFailure( + "optionalgroup {\na: 15\n}\n", + "Message type \"protobuf_unittest.TestAllTypes\" has no field named " + "\"optionalgroup\".", + 1, 15); + ExpectFailure( + "OPTIONALgroup {\na: 15\n}\n", + "Message type \"protobuf_unittest.TestAllTypes\" has no field named " + "\"OPTIONALgroup\".", + 1, 15); + ExpectFailure( + "Optional_Double: 10.0\n", + "Message type \"protobuf_unittest.TestAllTypes\" has no field named " + "\"Optional_Double\".", + 1, 16); +} + +TEST_F(TextFormatParserTest, InvalidFieldValues) { + // Invalid values for a double/float field. + ExpectFailure("optional_double: \"hello\"\n", "Expected double.", 1, 18); + ExpectFailure("optional_double: true\n", "Expected double.", 1, 18); + ExpectFailure("optional_double: !\n", "Expected double.", 1, 18); + ExpectFailure("optional_double {\n \n}\n", "Expected \":\", found \"{\".", + 1, 17); + + // Invalid values for a signed integer field. + ExpectFailure("optional_int32: \"hello\"\n", "Expected integer.", 1, 17); + ExpectFailure("optional_int32: true\n", "Expected integer.", 1, 17); + ExpectFailure("optional_int32: 4.5\n", "Expected integer.", 1, 17); + ExpectFailure("optional_int32: !\n", "Expected integer.", 1, 17); + ExpectFailure("optional_int32 {\n \n}\n", "Expected \":\", found \"{\".", + 1, 16); + ExpectFailure("optional_int32: 0x80000000\n", + "Integer out of range.", 1, 17); + ExpectFailure("optional_int32: -0x80000001\n", + "Integer out of range.", 1, 18); + ExpectFailure("optional_int64: 0x8000000000000000\n", + "Integer out of range.", 1, 17); + ExpectFailure("optional_int64: -0x8000000000000001\n", + "Integer out of range.", 1, 18); + + // Invalid values for an unsigned integer field. + ExpectFailure("optional_uint64: \"hello\"\n", "Expected integer.", 1, 18); + ExpectFailure("optional_uint64: true\n", "Expected integer.", 1, 18); + ExpectFailure("optional_uint64: 4.5\n", "Expected integer.", 1, 18); + ExpectFailure("optional_uint64: -5\n", "Expected integer.", 1, 18); + ExpectFailure("optional_uint64: !\n", "Expected integer.", 1, 18); + ExpectFailure("optional_uint64 {\n \n}\n", "Expected \":\", found \"{\".", + 1, 17); + ExpectFailure("optional_uint32: 0x100000000\n", + "Integer out of range.", 1, 18); + ExpectFailure("optional_uint64: 0x10000000000000000\n", + "Integer out of range.", 1, 18); + + // Invalid values for a boolean field. + ExpectFailure("optional_bool: \"hello\"\n", "Expected identifier.", 1, 16); + ExpectFailure("optional_bool: 5\n", "Integer out of range.", 1, 16); + ExpectFailure("optional_bool: -7.5\n", "Expected identifier.", 1, 16); + ExpectFailure("optional_bool: !\n", "Expected identifier.", 1, 16); + + ExpectFailure( + "optional_bool: meh\n", + "Invalid value for boolean field \"optional_bool\". Value: \"meh\".", + 2, 1); + + ExpectFailure("optional_bool {\n \n}\n", "Expected \":\", found \"{\".", + 1, 15); + + // Invalid values for a string field. + ExpectFailure("optional_string: true\n", "Expected string.", 1, 18); + ExpectFailure("optional_string: 5\n", "Expected string.", 1, 18); + ExpectFailure("optional_string: -7.5\n", "Expected string.", 1, 18); + ExpectFailure("optional_string: !\n", "Expected string.", 1, 18); + ExpectFailure("optional_string {\n \n}\n", "Expected \":\", found \"{\".", + 1, 17); + + // Invalid values for an enumeration field. + ExpectFailure("optional_nested_enum: \"hello\"\n", + "Expected integer or identifier.", 1, 23); + + // Valid token, but enum value is not defined. + ExpectFailure("optional_nested_enum: 5\n", + "Unknown enumeration value of \"5\" for field " + "\"optional_nested_enum\".", 2, 1); + // We consume the negative sign, so the error position starts one character + // later. + ExpectFailure("optional_nested_enum: -7.5\n", "Expected integer.", 1, 24); + ExpectFailure("optional_nested_enum: !\n", + "Expected integer or identifier.", 1, 23); + + ExpectFailure( + "optional_nested_enum: grah\n", + "Unknown enumeration value of \"grah\" for field " + "\"optional_nested_enum\".", 2, 1); + + ExpectFailure( + "optional_nested_enum {\n \n}\n", + "Expected \":\", found \"{\".", 1, 22); +} + +TEST_F(TextFormatParserTest, MessageDelimeters) { + // Non-matching delimeters. + ExpectFailure("OptionalGroup <\n \n}\n", "Expected \">\", found \"}\".", + 3, 1); + + // Invalid delimeters. + ExpectFailure("OptionalGroup [\n \n]\n", "Expected \"{\", found \"[\".", + 1, 15); + + // Unending message. + ExpectFailure("optional_nested_message {\n \nbb: 118\n", + "Expected identifier.", + 4, 1); +} + +TEST_F(TextFormatParserTest, UnknownExtension) { + // Non-matching delimeters. + ExpectFailure("[blahblah]: 123", + "Extension \"blahblah\" is not defined or is not an " + "extension of \"protobuf_unittest.TestAllTypes\".", + 1, 11); +} + +TEST_F(TextFormatParserTest, MissingRequired) { + unittest::TestRequired message; + ExpectFailure("a: 1", + "Message missing required fields: b, c", + 0, 1, &message); +} + +TEST_F(TextFormatParserTest, ParseDuplicateRequired) { + unittest::TestRequired message; + ExpectFailure("a: 1 b: 2 c: 3 a: 1", + "Non-repeated field \"a\" is specified multiple times.", + 1, 17, &message); +} + +TEST_F(TextFormatParserTest, ParseDuplicateOptional) { + unittest::ForeignMessage message; + ExpectFailure("c: 1 c: 2", + "Non-repeated field \"c\" is specified multiple times.", + 1, 7, &message); +} + +TEST_F(TextFormatParserTest, MergeDuplicateRequired) { + unittest::TestRequired message; + TextFormat::Parser parser; + EXPECT_TRUE(parser.MergeFromString("a: 1 b: 2 c: 3 a: 4", &message)); + EXPECT_EQ(4, message.a()); +} + +TEST_F(TextFormatParserTest, MergeDuplicateOptional) { + unittest::ForeignMessage message; + TextFormat::Parser parser; + EXPECT_TRUE(parser.MergeFromString("c: 1 c: 2", &message)); + EXPECT_EQ(2, message.c()); +} + +TEST_F(TextFormatParserTest, ExplicitDelimiters) { + unittest::TestRequired message; + EXPECT_TRUE(TextFormat::ParseFromString("a:1,b:2;c:3", &message)); + EXPECT_EQ(1, message.a()); + EXPECT_EQ(2, message.b()); + EXPECT_EQ(3, message.c()); +} + +TEST_F(TextFormatParserTest, PrintErrorsToStderr) { + vector errors; + + { + ScopedMemoryLog log; + unittest::TestAllTypes proto; + EXPECT_FALSE(TextFormat::ParseFromString("no_such_field: 1", &proto)); + errors = log.GetMessages(ERROR); + } + + ASSERT_EQ(1, errors.size()); + EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: " + "1:14: Message type \"protobuf_unittest.TestAllTypes\" has no field " + "named \"no_such_field\".", + errors[0]); +} + +TEST_F(TextFormatParserTest, FailsOnTokenizationError) { + vector errors; + + { + ScopedMemoryLog log; + unittest::TestAllTypes proto; + EXPECT_FALSE(TextFormat::ParseFromString("\020", &proto)); + errors = log.GetMessages(ERROR); + } + + ASSERT_EQ(1, errors.size()); + EXPECT_EQ("Error parsing text-format protobuf_unittest.TestAllTypes: " + "1:1: Invalid control characters encountered in text.", + errors[0]); +} + +TEST_F(TextFormatParserTest, ParseDeprecatedField) { + unittest::TestDeprecatedFields message; + ExpectMessage("deprecated_int32: 42", + "WARNING:text format contains deprecated field " + "\"deprecated_int32\"", 1, 21, &message, true); +} + +class TextFormatMessageSetTest : public testing::Test { + protected: + static const char proto_debug_string_[]; +}; +const char TextFormatMessageSetTest::proto_debug_string_[] = +"message_set {\n" +" [protobuf_unittest.TestMessageSetExtension1] {\n" +" i: 23\n" +" }\n" +" [protobuf_unittest.TestMessageSetExtension2] {\n" +" str: \"foo\"\n" +" }\n" +"}\n"; + + +TEST_F(TextFormatMessageSetTest, Serialize) { + protobuf_unittest::TestMessageSetContainer proto; + protobuf_unittest::TestMessageSetExtension1* item_a = + proto.mutable_message_set()->MutableExtension( + protobuf_unittest::TestMessageSetExtension1::message_set_extension); + item_a->set_i(23); + protobuf_unittest::TestMessageSetExtension2* item_b = + proto.mutable_message_set()->MutableExtension( + protobuf_unittest::TestMessageSetExtension2::message_set_extension); + item_b->set_str("foo"); + EXPECT_EQ(proto_debug_string_, proto.DebugString()); +} + +TEST_F(TextFormatMessageSetTest, Deserialize) { + protobuf_unittest::TestMessageSetContainer proto; + ASSERT_TRUE(TextFormat::ParseFromString(proto_debug_string_, &proto)); + EXPECT_EQ(23, proto.message_set().GetExtension( + protobuf_unittest::TestMessageSetExtension1::message_set_extension).i()); + EXPECT_EQ("foo", proto.message_set().GetExtension( + protobuf_unittest::TestMessageSetExtension2::message_set_extension).str()); + + // Ensure that these are the only entries present. + vector descriptors; + proto.message_set().GetReflection()->ListFields( + proto.message_set(), &descriptors); + EXPECT_EQ(2, descriptors.size()); +} + +} // namespace text_format_unittest +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto new file mode 100644 index 000000000..97ec67475 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto @@ -0,0 +1,630 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// A proto file we will use for unit testing. + + +// Some generic_services option(s) added automatically. +// See: http://go/proto2-generic-services-default +option cc_generic_services = true; // auto-added +option java_generic_services = true; // auto-added +option py_generic_services = true; // auto-added + +import "google/protobuf/unittest_import.proto"; + +// We don't put this in a package within proto2 because we need to make sure +// that the generated code doesn't depend on being in the proto2 namespace. +// In test_util.h we do "using namespace unittest = protobuf_unittest". +package protobuf_unittest; + +// Protos optimized for SPEED use a strict superset of the generated code +// of equivalent ones optimized for CODE_SIZE, so we should optimize all our +// tests for speed unless explicitly testing code size optimization. +option optimize_for = SPEED; + +option java_outer_classname = "UnittestProto"; + +// This proto includes every type of field in both singular and repeated +// forms. +message TestAllTypes { + message NestedMessage { + // The field name "b" fails to compile in proto1 because it conflicts with + // a local variable named "b" in one of the generated methods. Doh. + // This file needs to compile in proto1 to test backwards-compatibility. + optional int32 bb = 1; + } + + enum NestedEnum { + FOO = 1; + BAR = 2; + BAZ = 3; + } + + // Singular + optional int32 optional_int32 = 1; + optional int64 optional_int64 = 2; + optional uint32 optional_uint32 = 3; + optional uint64 optional_uint64 = 4; + optional sint32 optional_sint32 = 5; + optional sint64 optional_sint64 = 6; + optional fixed32 optional_fixed32 = 7; + optional fixed64 optional_fixed64 = 8; + optional sfixed32 optional_sfixed32 = 9; + optional sfixed64 optional_sfixed64 = 10; + optional float optional_float = 11; + optional double optional_double = 12; + optional bool optional_bool = 13; + optional string optional_string = 14; + optional bytes optional_bytes = 15; + + optional group OptionalGroup = 16 { + optional int32 a = 17; + } + + optional NestedMessage optional_nested_message = 18; + optional ForeignMessage optional_foreign_message = 19; + optional protobuf_unittest_import.ImportMessage optional_import_message = 20; + + optional NestedEnum optional_nested_enum = 21; + optional ForeignEnum optional_foreign_enum = 22; + optional protobuf_unittest_import.ImportEnum optional_import_enum = 23; + + optional string optional_string_piece = 24 [ctype=STRING_PIECE]; + optional string optional_cord = 25 [ctype=CORD]; + + // Repeated + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; + repeated sfixed32 repeated_sfixed32 = 39; + repeated sfixed64 repeated_sfixed64 = 40; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; + + repeated group RepeatedGroup = 46 { + optional int32 a = 47; + } + + repeated NestedMessage repeated_nested_message = 48; + repeated ForeignMessage repeated_foreign_message = 49; + repeated protobuf_unittest_import.ImportMessage repeated_import_message = 50; + + repeated NestedEnum repeated_nested_enum = 51; + repeated ForeignEnum repeated_foreign_enum = 52; + repeated protobuf_unittest_import.ImportEnum repeated_import_enum = 53; + + repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; + repeated string repeated_cord = 55 [ctype=CORD]; + + // Singular with defaults + optional int32 default_int32 = 61 [default = 41 ]; + optional int64 default_int64 = 62 [default = 42 ]; + optional uint32 default_uint32 = 63 [default = 43 ]; + optional uint64 default_uint64 = 64 [default = 44 ]; + optional sint32 default_sint32 = 65 [default = -45 ]; + optional sint64 default_sint64 = 66 [default = 46 ]; + optional fixed32 default_fixed32 = 67 [default = 47 ]; + optional fixed64 default_fixed64 = 68 [default = 48 ]; + optional sfixed32 default_sfixed32 = 69 [default = 49 ]; + optional sfixed64 default_sfixed64 = 70 [default = -50 ]; + optional float default_float = 71 [default = 51.5 ]; + optional double default_double = 72 [default = 52e3 ]; + optional bool default_bool = 73 [default = true ]; + optional string default_string = 74 [default = "hello"]; + optional bytes default_bytes = 75 [default = "world"]; + + optional NestedEnum default_nested_enum = 81 [default = BAR ]; + optional ForeignEnum default_foreign_enum = 82 [default = FOREIGN_BAR]; + optional protobuf_unittest_import.ImportEnum + default_import_enum = 83 [default = IMPORT_BAR]; + + optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; + optional string default_cord = 85 [ctype=CORD,default="123"]; +} + +message TestDeprecatedFields { + optional int32 deprecated_int32 = 1 [deprecated=true]; +} + +// Define these after TestAllTypes to make sure the compiler can handle +// that. +message ForeignMessage { + optional int32 c = 1; +} + +enum ForeignEnum { + FOREIGN_FOO = 4; + FOREIGN_BAR = 5; + FOREIGN_BAZ = 6; +} + +message TestAllExtensions { + extensions 1 to max; +} + +extend TestAllExtensions { + // Singular + optional int32 optional_int32_extension = 1; + optional int64 optional_int64_extension = 2; + optional uint32 optional_uint32_extension = 3; + optional uint64 optional_uint64_extension = 4; + optional sint32 optional_sint32_extension = 5; + optional sint64 optional_sint64_extension = 6; + optional fixed32 optional_fixed32_extension = 7; + optional fixed64 optional_fixed64_extension = 8; + optional sfixed32 optional_sfixed32_extension = 9; + optional sfixed64 optional_sfixed64_extension = 10; + optional float optional_float_extension = 11; + optional double optional_double_extension = 12; + optional bool optional_bool_extension = 13; + optional string optional_string_extension = 14; + optional bytes optional_bytes_extension = 15; + + optional group OptionalGroup_extension = 16 { + optional int32 a = 17; + } + + optional TestAllTypes.NestedMessage optional_nested_message_extension = 18; + optional ForeignMessage optional_foreign_message_extension = 19; + optional protobuf_unittest_import.ImportMessage + optional_import_message_extension = 20; + + optional TestAllTypes.NestedEnum optional_nested_enum_extension = 21; + optional ForeignEnum optional_foreign_enum_extension = 22; + optional protobuf_unittest_import.ImportEnum + optional_import_enum_extension = 23; + + optional string optional_string_piece_extension = 24 [ctype=STRING_PIECE]; + optional string optional_cord_extension = 25 [ctype=CORD]; + + // Repeated + repeated int32 repeated_int32_extension = 31; + repeated int64 repeated_int64_extension = 32; + repeated uint32 repeated_uint32_extension = 33; + repeated uint64 repeated_uint64_extension = 34; + repeated sint32 repeated_sint32_extension = 35; + repeated sint64 repeated_sint64_extension = 36; + repeated fixed32 repeated_fixed32_extension = 37; + repeated fixed64 repeated_fixed64_extension = 38; + repeated sfixed32 repeated_sfixed32_extension = 39; + repeated sfixed64 repeated_sfixed64_extension = 40; + repeated float repeated_float_extension = 41; + repeated double repeated_double_extension = 42; + repeated bool repeated_bool_extension = 43; + repeated string repeated_string_extension = 44; + repeated bytes repeated_bytes_extension = 45; + + repeated group RepeatedGroup_extension = 46 { + optional int32 a = 47; + } + + repeated TestAllTypes.NestedMessage repeated_nested_message_extension = 48; + repeated ForeignMessage repeated_foreign_message_extension = 49; + repeated protobuf_unittest_import.ImportMessage + repeated_import_message_extension = 50; + + repeated TestAllTypes.NestedEnum repeated_nested_enum_extension = 51; + repeated ForeignEnum repeated_foreign_enum_extension = 52; + repeated protobuf_unittest_import.ImportEnum + repeated_import_enum_extension = 53; + + repeated string repeated_string_piece_extension = 54 [ctype=STRING_PIECE]; + repeated string repeated_cord_extension = 55 [ctype=CORD]; + + // Singular with defaults + optional int32 default_int32_extension = 61 [default = 41 ]; + optional int64 default_int64_extension = 62 [default = 42 ]; + optional uint32 default_uint32_extension = 63 [default = 43 ]; + optional uint64 default_uint64_extension = 64 [default = 44 ]; + optional sint32 default_sint32_extension = 65 [default = -45 ]; + optional sint64 default_sint64_extension = 66 [default = 46 ]; + optional fixed32 default_fixed32_extension = 67 [default = 47 ]; + optional fixed64 default_fixed64_extension = 68 [default = 48 ]; + optional sfixed32 default_sfixed32_extension = 69 [default = 49 ]; + optional sfixed64 default_sfixed64_extension = 70 [default = -50 ]; + optional float default_float_extension = 71 [default = 51.5 ]; + optional double default_double_extension = 72 [default = 52e3 ]; + optional bool default_bool_extension = 73 [default = true ]; + optional string default_string_extension = 74 [default = "hello"]; + optional bytes default_bytes_extension = 75 [default = "world"]; + + optional TestAllTypes.NestedEnum + default_nested_enum_extension = 81 [default = BAR]; + optional ForeignEnum + default_foreign_enum_extension = 82 [default = FOREIGN_BAR]; + optional protobuf_unittest_import.ImportEnum + default_import_enum_extension = 83 [default = IMPORT_BAR]; + + optional string default_string_piece_extension = 84 [ctype=STRING_PIECE, + default="abc"]; + optional string default_cord_extension = 85 [ctype=CORD, default="123"]; +} + +message TestNestedExtension { + extend TestAllExtensions { + // Check for bug where string extensions declared in tested scope did not + // compile. + optional string test = 1002 [default="test"]; + } +} + +// We have separate messages for testing required fields because it's +// annoying to have to fill in required fields in TestProto in order to +// do anything with it. Note that we don't need to test every type of +// required filed because the code output is basically identical to +// optional fields for all types. +message TestRequired { + required int32 a = 1; + optional int32 dummy2 = 2; + required int32 b = 3; + + extend TestAllExtensions { + optional TestRequired single = 1000; + repeated TestRequired multi = 1001; + } + + // Pad the field count to 32 so that we can test that IsInitialized() + // properly checks multiple elements of has_bits_. + optional int32 dummy4 = 4; + optional int32 dummy5 = 5; + optional int32 dummy6 = 6; + optional int32 dummy7 = 7; + optional int32 dummy8 = 8; + optional int32 dummy9 = 9; + optional int32 dummy10 = 10; + optional int32 dummy11 = 11; + optional int32 dummy12 = 12; + optional int32 dummy13 = 13; + optional int32 dummy14 = 14; + optional int32 dummy15 = 15; + optional int32 dummy16 = 16; + optional int32 dummy17 = 17; + optional int32 dummy18 = 18; + optional int32 dummy19 = 19; + optional int32 dummy20 = 20; + optional int32 dummy21 = 21; + optional int32 dummy22 = 22; + optional int32 dummy23 = 23; + optional int32 dummy24 = 24; + optional int32 dummy25 = 25; + optional int32 dummy26 = 26; + optional int32 dummy27 = 27; + optional int32 dummy28 = 28; + optional int32 dummy29 = 29; + optional int32 dummy30 = 30; + optional int32 dummy31 = 31; + optional int32 dummy32 = 32; + + required int32 c = 33; +} + +message TestRequiredForeign { + optional TestRequired optional_message = 1; + repeated TestRequired repeated_message = 2; + optional int32 dummy = 3; +} + +// Test that we can use NestedMessage from outside TestAllTypes. +message TestForeignNested { + optional TestAllTypes.NestedMessage foreign_nested = 1; +} + +// TestEmptyMessage is used to test unknown field support. +message TestEmptyMessage { +} + +// Like above, but declare all field numbers as potential extensions. No +// actual extensions should ever be defined for this type. +message TestEmptyMessageWithExtensions { + extensions 1 to max; +} + +message TestMultipleExtensionRanges { + extensions 42; + extensions 4143 to 4243; + extensions 65536 to max; +} + +// Test that really large tag numbers don't break anything. +message TestReallyLargeTagNumber { + // The largest possible tag number is 2^28 - 1, since the wire format uses + // three bits to communicate wire type. + optional int32 a = 1; + optional int32 bb = 268435455; +} + +message TestRecursiveMessage { + optional TestRecursiveMessage a = 1; + optional int32 i = 2; +} + +// Test that mutual recursion works. +message TestMutualRecursionA { + optional TestMutualRecursionB bb = 1; +} + +message TestMutualRecursionB { + optional TestMutualRecursionA a = 1; + optional int32 optional_int32 = 2; +} + +// Test that groups have disjoint field numbers from their siblings and +// parents. This is NOT possible in proto1; only proto2. When attempting +// to compile with proto1, this will emit an error; so we only include it +// in protobuf_unittest_proto. +message TestDupFieldNumber { // NO_PROTO1 + optional int32 a = 1; // NO_PROTO1 + optional group Foo = 2 { optional int32 a = 1; } // NO_PROTO1 + optional group Bar = 3 { optional int32 a = 1; } // NO_PROTO1 +} // NO_PROTO1 + + +// Needed for a Python test. +message TestNestedMessageHasBits { + message NestedMessage { + repeated int32 nestedmessage_repeated_int32 = 1; + repeated ForeignMessage nestedmessage_repeated_foreignmessage = 2; + } + optional NestedMessage optional_nested_message = 1; +} + + +// Test an enum that has multiple values with the same number. +enum TestEnumWithDupValue { + FOO1 = 1; + BAR1 = 2; + BAZ = 3; + FOO2 = 1; + BAR2 = 2; +} + +// Test an enum with large, unordered values. +enum TestSparseEnum { + SPARSE_A = 123; + SPARSE_B = 62374; + SPARSE_C = 12589234; + SPARSE_D = -15; + SPARSE_E = -53452; + SPARSE_F = 0; + SPARSE_G = 2; +} + +// Test message with CamelCase field names. This violates Protocol Buffer +// standard style. +message TestCamelCaseFieldNames { + optional int32 PrimitiveField = 1; + optional string StringField = 2; + optional ForeignEnum EnumField = 3; + optional ForeignMessage MessageField = 4; + optional string StringPieceField = 5 [ctype=STRING_PIECE]; + optional string CordField = 6 [ctype=CORD]; + + repeated int32 RepeatedPrimitiveField = 7; + repeated string RepeatedStringField = 8; + repeated ForeignEnum RepeatedEnumField = 9; + repeated ForeignMessage RepeatedMessageField = 10; + repeated string RepeatedStringPieceField = 11 [ctype=STRING_PIECE]; + repeated string RepeatedCordField = 12 [ctype=CORD]; +} + + +// We list fields out of order, to ensure that we're using field number and not +// field index to determine serialization order. +message TestFieldOrderings { + optional string my_string = 11; + extensions 2 to 10; + optional int64 my_int = 1; + extensions 12 to 100; + optional float my_float = 101; +} + + +extend TestFieldOrderings { + optional string my_extension_string = 50; + optional int32 my_extension_int = 5; +} + + +message TestExtremeDefaultValues { + optional bytes escaped_bytes = 1 [default = "\0\001\a\b\f\n\r\t\v\\\'\"\xfe"]; + optional uint32 large_uint32 = 2 [default = 0xFFFFFFFF]; + optional uint64 large_uint64 = 3 [default = 0xFFFFFFFFFFFFFFFF]; + optional int32 small_int32 = 4 [default = -0x7FFFFFFF]; + optional int64 small_int64 = 5 [default = -0x7FFFFFFFFFFFFFFF]; + + // The default value here is UTF-8 for "\u1234". (We could also just type + // the UTF-8 text directly into this text file rather than escape it, but + // lots of people use editors that would be confused by this.) + optional string utf8_string = 6 [default = "\341\210\264"]; + + // Tests for single-precision floating-point values. + optional float zero_float = 7 [default = 0]; + optional float one_float = 8 [default = 1]; + optional float small_float = 9 [default = 1.5]; + optional float negative_one_float = 10 [default = -1]; + optional float negative_float = 11 [default = -1.5]; + // Using exponents + optional float large_float = 12 [default = 2E8]; + optional float small_negative_float = 13 [default = -8e-28]; + + // Text for nonfinite floating-point values. + optional double inf_double = 14 [default = inf]; + optional double neg_inf_double = 15 [default = -inf]; + optional double nan_double = 16 [default = nan]; + optional float inf_float = 17 [default = inf]; + optional float neg_inf_float = 18 [default = -inf]; + optional float nan_float = 19 [default = nan]; + + // Tests for C++ trigraphs. + // Trigraphs should be escaped in C++ generated files, but they should not be + // escaped for other languages. + // Note that in .proto file, "\?" is a valid way to escape ? in string + // literals. + optional string cpp_trigraph = 20 [default = "? \? ?? \?? \??? ??/ ?\?-"]; +} + +message SparseEnumMessage { + optional TestSparseEnum sparse_enum = 1; +} + +// Test String and Bytes: string is for valid UTF-8 strings +message OneString { + optional string data = 1; +} + +message OneBytes { + optional bytes data = 1; +} + +// Test messages for packed fields + +message TestPackedTypes { + repeated int32 packed_int32 = 90 [packed = true]; + repeated int64 packed_int64 = 91 [packed = true]; + repeated uint32 packed_uint32 = 92 [packed = true]; + repeated uint64 packed_uint64 = 93 [packed = true]; + repeated sint32 packed_sint32 = 94 [packed = true]; + repeated sint64 packed_sint64 = 95 [packed = true]; + repeated fixed32 packed_fixed32 = 96 [packed = true]; + repeated fixed64 packed_fixed64 = 97 [packed = true]; + repeated sfixed32 packed_sfixed32 = 98 [packed = true]; + repeated sfixed64 packed_sfixed64 = 99 [packed = true]; + repeated float packed_float = 100 [packed = true]; + repeated double packed_double = 101 [packed = true]; + repeated bool packed_bool = 102 [packed = true]; + repeated ForeignEnum packed_enum = 103 [packed = true]; +} + +// A message with the same fields as TestPackedTypes, but without packing. Used +// to test packed <-> unpacked wire compatibility. +message TestUnpackedTypes { + repeated int32 unpacked_int32 = 90 [packed = false]; + repeated int64 unpacked_int64 = 91 [packed = false]; + repeated uint32 unpacked_uint32 = 92 [packed = false]; + repeated uint64 unpacked_uint64 = 93 [packed = false]; + repeated sint32 unpacked_sint32 = 94 [packed = false]; + repeated sint64 unpacked_sint64 = 95 [packed = false]; + repeated fixed32 unpacked_fixed32 = 96 [packed = false]; + repeated fixed64 unpacked_fixed64 = 97 [packed = false]; + repeated sfixed32 unpacked_sfixed32 = 98 [packed = false]; + repeated sfixed64 unpacked_sfixed64 = 99 [packed = false]; + repeated float unpacked_float = 100 [packed = false]; + repeated double unpacked_double = 101 [packed = false]; + repeated bool unpacked_bool = 102 [packed = false]; + repeated ForeignEnum unpacked_enum = 103 [packed = false]; +} + +message TestPackedExtensions { + extensions 1 to max; +} + +extend TestPackedExtensions { + repeated int32 packed_int32_extension = 90 [packed = true]; + repeated int64 packed_int64_extension = 91 [packed = true]; + repeated uint32 packed_uint32_extension = 92 [packed = true]; + repeated uint64 packed_uint64_extension = 93 [packed = true]; + repeated sint32 packed_sint32_extension = 94 [packed = true]; + repeated sint64 packed_sint64_extension = 95 [packed = true]; + repeated fixed32 packed_fixed32_extension = 96 [packed = true]; + repeated fixed64 packed_fixed64_extension = 97 [packed = true]; + repeated sfixed32 packed_sfixed32_extension = 98 [packed = true]; + repeated sfixed64 packed_sfixed64_extension = 99 [packed = true]; + repeated float packed_float_extension = 100 [packed = true]; + repeated double packed_double_extension = 101 [packed = true]; + repeated bool packed_bool_extension = 102 [packed = true]; + repeated ForeignEnum packed_enum_extension = 103 [packed = true]; +} + +// Used by ExtensionSetTest/DynamicExtensions. The test actually builds +// a set of extensions to TestAllExtensions dynamically, based on the fields +// of this message type. +message TestDynamicExtensions { + enum DynamicEnumType { + DYNAMIC_FOO = 2200; + DYNAMIC_BAR = 2201; + DYNAMIC_BAZ = 2202; + } + message DynamicMessageType { + optional int32 dynamic_field = 2100; + } + + optional fixed32 scalar_extension = 2000; + optional ForeignEnum enum_extension = 2001; + optional DynamicEnumType dynamic_enum_extension = 2002; + + optional ForeignMessage message_extension = 2003; + optional DynamicMessageType dynamic_message_extension = 2004; + + repeated string repeated_extension = 2005; + repeated sint32 packed_extension = 2006 [packed = true]; +} + +message TestRepeatedScalarDifferentTagSizes { + // Parsing repeated fixed size values used to fail. This message needs to be + // used in order to get a tag of the right size; all of the repeated fields + // in TestAllTypes didn't trigger the check. + repeated fixed32 repeated_fixed32 = 12; + // Check for a varint type, just for good measure. + repeated int32 repeated_int32 = 13; + + // These have two-byte tags. + repeated fixed64 repeated_fixed64 = 2046; + repeated int64 repeated_int64 = 2047; + + // Three byte tags. + repeated float repeated_float = 262142; + repeated uint64 repeated_uint64 = 262143; +} + + +// Test that RPC services work. +message FooRequest {} +message FooResponse {} + +service TestService { + rpc Foo(FooRequest) returns (FooResponse); + rpc Bar(BarRequest) returns (BarResponse); +} + + +message BarRequest {} +message BarResponse {} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto new file mode 100644 index 000000000..a610785f1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto @@ -0,0 +1,366 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: benjy@google.com (Benjy Weinberger) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// A proto file used to test the "custom options" feature of proto2. + + +// Some generic_services option(s) added automatically. +// See: http://go/proto2-generic-services-default +option cc_generic_services = true; // auto-added +option java_generic_services = true; // auto-added +option py_generic_services = true; + +// A custom file option (defined below). +option (file_opt1) = 9876543210; + +import "google/protobuf/descriptor.proto"; + +// We don't put this in a package within proto2 because we need to make sure +// that the generated code doesn't depend on being in the proto2 namespace. +package protobuf_unittest; + + +// Some simple test custom options of various types. + +extend google.protobuf.FileOptions { + optional uint64 file_opt1 = 7736974; +} + +extend google.protobuf.MessageOptions { + optional int32 message_opt1 = 7739036; +} + +extend google.protobuf.FieldOptions { + optional fixed64 field_opt1 = 7740936; + // This is useful for testing that we correctly register default values for + // extension options. + optional int32 field_opt2 = 7753913 [default=42]; +} + +extend google.protobuf.EnumOptions { + optional sfixed32 enum_opt1 = 7753576; +} + +extend google.protobuf.EnumValueOptions { + optional int32 enum_value_opt1 = 1560678; +} + +extend google.protobuf.ServiceOptions { + optional sint64 service_opt1 = 7887650; +} + +enum MethodOpt1 { + METHODOPT1_VAL1 = 1; + METHODOPT1_VAL2 = 2; +} + +extend google.protobuf.MethodOptions { + optional MethodOpt1 method_opt1 = 7890860; +} + +// A test message with custom options at all possible locations (and also some +// regular options, to make sure they interact nicely). +message TestMessageWithCustomOptions { + option message_set_wire_format = false; + + option (message_opt1) = -56; + + optional string field1 = 1 [ctype=CORD, + (field_opt1)=8765432109]; + + enum AnEnum { + option (enum_opt1) = -789; + + ANENUM_VAL1 = 1; + ANENUM_VAL2 = 2 [(enum_value_opt1) = 123]; + } +} + + +// A test RPC service with custom options at all possible locations (and also +// some regular options, to make sure they interact nicely). +message CustomOptionFooRequest { +} + +message CustomOptionFooResponse { +} + +service TestServiceWithCustomOptions { + option (service_opt1) = -9876543210; + + rpc Foo(CustomOptionFooRequest) returns (CustomOptionFooResponse) { + option (method_opt1) = METHODOPT1_VAL2; + } +} + + + +// Options of every possible field type, so we can test them all exhaustively. + +message DummyMessageContainingEnum { + enum TestEnumType { + TEST_OPTION_ENUM_TYPE1 = 22; + TEST_OPTION_ENUM_TYPE2 = -23; + } +} + +message DummyMessageInvalidAsOptionType { +} + +extend google.protobuf.MessageOptions { + optional bool bool_opt = 7706090; + optional int32 int32_opt = 7705709; + optional int64 int64_opt = 7705542; + optional uint32 uint32_opt = 7704880; + optional uint64 uint64_opt = 7702367; + optional sint32 sint32_opt = 7701568; + optional sint64 sint64_opt = 7700863; + optional fixed32 fixed32_opt = 7700307; + optional fixed64 fixed64_opt = 7700194; + optional sfixed32 sfixed32_opt = 7698645; + optional sfixed64 sfixed64_opt = 7685475; + optional float float_opt = 7675390; + optional double double_opt = 7673293; + optional string string_opt = 7673285; + optional bytes bytes_opt = 7673238; + optional DummyMessageContainingEnum.TestEnumType enum_opt = 7673233; + optional DummyMessageInvalidAsOptionType message_type_opt = 7665967; +} + +message CustomOptionMinIntegerValues { + option (bool_opt) = false; + option (int32_opt) = -0x80000000; + option (int64_opt) = -0x8000000000000000; + option (uint32_opt) = 0; + option (uint64_opt) = 0; + option (sint32_opt) = -0x80000000; + option (sint64_opt) = -0x8000000000000000; + option (fixed32_opt) = 0; + option (fixed64_opt) = 0; + option (sfixed32_opt) = -0x80000000; + option (sfixed64_opt) = -0x8000000000000000; +} + +message CustomOptionMaxIntegerValues { + option (bool_opt) = true; + option (int32_opt) = 0x7FFFFFFF; + option (int64_opt) = 0x7FFFFFFFFFFFFFFF; + option (uint32_opt) = 0xFFFFFFFF; + option (uint64_opt) = 0xFFFFFFFFFFFFFFFF; + option (sint32_opt) = 0x7FFFFFFF; + option (sint64_opt) = 0x7FFFFFFFFFFFFFFF; + option (fixed32_opt) = 0xFFFFFFFF; + option (fixed64_opt) = 0xFFFFFFFFFFFFFFFF; + option (sfixed32_opt) = 0x7FFFFFFF; + option (sfixed64_opt) = 0x7FFFFFFFFFFFFFFF; +} + +message CustomOptionOtherValues { + option (int32_opt) = -100; // To test sign-extension. + option (float_opt) = 12.3456789; + option (double_opt) = 1.234567890123456789; + option (string_opt) = "Hello, \"World\""; + option (bytes_opt) = "Hello\0World"; + option (enum_opt) = TEST_OPTION_ENUM_TYPE2; +} + +message SettingRealsFromPositiveInts { + option (float_opt) = 12; + option (double_opt) = 154; +} + +message SettingRealsFromNegativeInts { + option (float_opt) = -12; + option (double_opt) = -154; +} + +// Options of complex message types, themselves combined and extended in +// various ways. + +message ComplexOptionType1 { + optional int32 foo = 1; + optional int32 foo2 = 2; + optional int32 foo3 = 3; + + extensions 100 to max; +} + +message ComplexOptionType2 { + optional ComplexOptionType1 bar = 1; + optional int32 baz = 2; + + message ComplexOptionType4 { + optional int32 waldo = 1; + + extend google.protobuf.MessageOptions { + optional ComplexOptionType4 complex_opt4 = 7633546; + } + } + + optional ComplexOptionType4 fred = 3; + + extensions 100 to max; +} + +message ComplexOptionType3 { + optional int32 qux = 1; + + optional group ComplexOptionType5 = 2 { + optional int32 plugh = 3; + } +} + +extend ComplexOptionType1 { + optional int32 quux = 7663707; + optional ComplexOptionType3 corge = 7663442; +} + +extend ComplexOptionType2 { + optional int32 grault = 7650927; + optional ComplexOptionType1 garply = 7649992; +} + +extend google.protobuf.MessageOptions { + optional protobuf_unittest.ComplexOptionType1 complex_opt1 = 7646756; + optional ComplexOptionType2 complex_opt2 = 7636949; + optional ComplexOptionType3 complex_opt3 = 7636463; + optional group ComplexOpt6 = 7595468 { + optional int32 xyzzy = 7593951; + } +} + +// Note that we try various different ways of naming the same extension. +message VariousComplexOptions { + option (.protobuf_unittest.complex_opt1).foo = 42; + option (protobuf_unittest.complex_opt1).(.protobuf_unittest.quux) = 324; + option (.protobuf_unittest.complex_opt1).(protobuf_unittest.corge).qux = 876; + option (complex_opt2).baz = 987; + option (complex_opt2).(grault) = 654; + option (complex_opt2).bar.foo = 743; + option (complex_opt2).bar.(quux) = 1999; + option (complex_opt2).bar.(protobuf_unittest.corge).qux = 2008; + option (complex_opt2).(garply).foo = 741; + option (complex_opt2).(garply).(.protobuf_unittest.quux) = 1998; + option (complex_opt2).(protobuf_unittest.garply).(corge).qux = 2121; + option (ComplexOptionType2.ComplexOptionType4.complex_opt4).waldo = 1971; + option (complex_opt2).fred.waldo = 321; + option (protobuf_unittest.complex_opt3).qux = 9; + option (complex_opt3).complexoptiontype5.plugh = 22; + option (complexopt6).xyzzy = 24; +} + +// ------------------------------------------------------ +// Definitions for testing aggregate option parsing. +// See descriptor_unittest.cc. + +message AggregateMessageSet { + option message_set_wire_format = true; + extensions 4 to max; +} + +message AggregateMessageSetElement { + extend AggregateMessageSet { + optional AggregateMessageSetElement message_set_extension = 15447542; + } + optional string s = 1; +} + +// A helper type used to test aggregate option parsing +message Aggregate { + optional int32 i = 1; + optional string s = 2; + + // A nested object + optional Aggregate sub = 3; + + // To test the parsing of extensions inside aggregate values + optional google.protobuf.FileOptions file = 4; + extend google.protobuf.FileOptions { + optional Aggregate nested = 15476903; + } + + // An embedded message set + optional AggregateMessageSet mset = 5; +} + +// Allow Aggregate to be used as an option at all possible locations +// in the .proto grammer. +extend google.protobuf.FileOptions { optional Aggregate fileopt = 15478479; } +extend google.protobuf.MessageOptions { optional Aggregate msgopt = 15480088; } +extend google.protobuf.FieldOptions { optional Aggregate fieldopt = 15481374; } +extend google.protobuf.EnumOptions { optional Aggregate enumopt = 15483218; } +extend google.protobuf.EnumValueOptions { optional Aggregate enumvalopt = 15486921; } +extend google.protobuf.ServiceOptions { optional Aggregate serviceopt = 15497145; } +extend google.protobuf.MethodOptions { optional Aggregate methodopt = 15512713; } + +// Try using AggregateOption at different points in the proto grammar +option (fileopt) = { + s: 'FileAnnotation' + // Also test the handling of comments + /* of both types */ i: 100 + + sub { s: 'NestedFileAnnotation' } + + // Include a google.protobuf.FileOptions and recursively extend it with + // another fileopt. + file { + [protobuf_unittest.fileopt] { + s:'FileExtensionAnnotation' + } + } + + // A message set inside an option value + mset { + [protobuf_unittest.AggregateMessageSetElement.message_set_extension] { + s: 'EmbeddedMessageSetElement' + } + } +}; + +message AggregateMessage { + option (msgopt) = { i:101 s:'MessageAnnotation' }; + optional int32 fieldname = 1 [(fieldopt) = { s:'FieldAnnotation' }]; +} + +service AggregateService { + option (serviceopt) = { s:'ServiceAnnotation' }; + rpc Method (AggregateMessage) returns (AggregateMessage) { + option (methodopt) = { s:'MethodAnnotation' }; + } +} + +enum AggregateEnum { + option (enumopt) = { s:'EnumAnnotation' }; + VALUE = 1 [(enumvalopt) = { s:'EnumValueAnnotation' }]; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto new file mode 100644 index 000000000..fa1762594 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto @@ -0,0 +1,50 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// A proto file which imports a proto file that uses optimize_for = CODE_SIZE. + +import "google/protobuf/unittest_optimize_for.proto"; + +package protobuf_unittest; + +// We optimize for speed here, but we are importing a proto that is optimized +// for code size. +option optimize_for = SPEED; + +message TestEmbedOptimizedForSize { + // Test that embedding a message which has optimize_for = CODE_SIZE into + // one optimized for speed works. + optional TestOptimizedForSize optional_message = 1; + repeated TestOptimizedForSize repeated_message = 2; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto new file mode 100644 index 000000000..ab12d1fb9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto @@ -0,0 +1,37 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file intentionally left blank. (At one point this wouldn't compile +// correctly.) + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto new file mode 100644 index 000000000..bc0b7c16a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto @@ -0,0 +1,1046 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// A proto file that has an extremely large descriptor. Used to test that +// descriptors over 64k don't break the string literal length limit in Java. + + +package google.protobuf; +option java_package = "com.google.protobuf"; + +// Avoid generating insanely long methods. +option optimize_for = CODE_SIZE; + +message TestEnormousDescriptor { + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1 = 1 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_2 = 2 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_3 = 3 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_4 = 4 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_5 = 5 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_6 = 6 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_7 = 7 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_8 = 8 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_9 = 9 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_10 = 10 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_11 = 11 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_12 = 12 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_13 = 13 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_14 = 14 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_15 = 15 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_16 = 16 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_17 = 17 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_18 = 18 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_19 = 19 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_20 = 20 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_21 = 21 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_22 = 22 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_23 = 23 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_24 = 24 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_25 = 25 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_26 = 26 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_27 = 27 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_28 = 28 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_29 = 29 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_30 = 30 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_31 = 31 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_32 = 32 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_33 = 33 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_34 = 34 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_35 = 35 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_36 = 36 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_37 = 37 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_38 = 38 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_39 = 39 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_40 = 40 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_41 = 41 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_42 = 42 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_43 = 43 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_44 = 44 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_45 = 45 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_46 = 46 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_47 = 47 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_48 = 48 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_49 = 49 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_50 = 50 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_51 = 51 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_52 = 52 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_53 = 53 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_54 = 54 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_55 = 55 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_56 = 56 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_57 = 57 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_58 = 58 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_59 = 59 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_60 = 60 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_61 = 61 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_62 = 62 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_63 = 63 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_64 = 64 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_65 = 65 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_66 = 66 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_67 = 67 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_68 = 68 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_69 = 69 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_70 = 70 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_71 = 71 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_72 = 72 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_73 = 73 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_74 = 74 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_75 = 75 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_76 = 76 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_77 = 77 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_78 = 78 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_79 = 79 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_80 = 80 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_81 = 81 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_82 = 82 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_83 = 83 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_84 = 84 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_85 = 85 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_86 = 86 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_87 = 87 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_88 = 88 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_89 = 89 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_90 = 90 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_91 = 91 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_92 = 92 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_93 = 93 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_94 = 94 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_95 = 95 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_96 = 96 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_97 = 97 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_98 = 98 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_99 = 99 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_100 = 100 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_101 = 101 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_102 = 102 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_103 = 103 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_104 = 104 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_105 = 105 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_106 = 106 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_107 = 107 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_108 = 108 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_109 = 109 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_110 = 110 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_111 = 111 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_112 = 112 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_113 = 113 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_114 = 114 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_115 = 115 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_116 = 116 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_117 = 117 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_118 = 118 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_119 = 119 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_120 = 120 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_121 = 121 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_122 = 122 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_123 = 123 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_124 = 124 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_125 = 125 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_126 = 126 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_127 = 127 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_128 = 128 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_129 = 129 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_130 = 130 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_131 = 131 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_132 = 132 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_133 = 133 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_134 = 134 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_135 = 135 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_136 = 136 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_137 = 137 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_138 = 138 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_139 = 139 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_140 = 140 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_141 = 141 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_142 = 142 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_143 = 143 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_144 = 144 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_145 = 145 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_146 = 146 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_147 = 147 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_148 = 148 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_149 = 149 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_150 = 150 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_151 = 151 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_152 = 152 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_153 = 153 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_154 = 154 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_155 = 155 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_156 = 156 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_157 = 157 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_158 = 158 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_159 = 159 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_160 = 160 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_161 = 161 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_162 = 162 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_163 = 163 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_164 = 164 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_165 = 165 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_166 = 166 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_167 = 167 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_168 = 168 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_169 = 169 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_170 = 170 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_171 = 171 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_172 = 172 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_173 = 173 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_174 = 174 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_175 = 175 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_176 = 176 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_177 = 177 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_178 = 178 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_179 = 179 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_180 = 180 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_181 = 181 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_182 = 182 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_183 = 183 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_184 = 184 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_185 = 185 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_186 = 186 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_187 = 187 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_188 = 188 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_189 = 189 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_190 = 190 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_191 = 191 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_192 = 192 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_193 = 193 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_194 = 194 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_195 = 195 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_196 = 196 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_197 = 197 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_198 = 198 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_199 = 199 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_200 = 200 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_201 = 201 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_202 = 202 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_203 = 203 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_204 = 204 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_205 = 205 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_206 = 206 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_207 = 207 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_208 = 208 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_209 = 209 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_210 = 210 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_211 = 211 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_212 = 212 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_213 = 213 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_214 = 214 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_215 = 215 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_216 = 216 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_217 = 217 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_218 = 218 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_219 = 219 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_220 = 220 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_221 = 221 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_222 = 222 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_223 = 223 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_224 = 224 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_225 = 225 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_226 = 226 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_227 = 227 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_228 = 228 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_229 = 229 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_230 = 230 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_231 = 231 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_232 = 232 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_233 = 233 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_234 = 234 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_235 = 235 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_236 = 236 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_237 = 237 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_238 = 238 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_239 = 239 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_240 = 240 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_241 = 241 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_242 = 242 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_243 = 243 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_244 = 244 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_245 = 245 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_246 = 246 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_247 = 247 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_248 = 248 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_249 = 249 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_250 = 250 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_251 = 251 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_252 = 252 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_253 = 253 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_254 = 254 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_255 = 255 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_256 = 256 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_257 = 257 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_258 = 258 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_259 = 259 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_260 = 260 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_261 = 261 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_262 = 262 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_263 = 263 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_264 = 264 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_265 = 265 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_266 = 266 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_267 = 267 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_268 = 268 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_269 = 269 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_270 = 270 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_271 = 271 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_272 = 272 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_273 = 273 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_274 = 274 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_275 = 275 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_276 = 276 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_277 = 277 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_278 = 278 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_279 = 279 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_280 = 280 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_281 = 281 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_282 = 282 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_283 = 283 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_284 = 284 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_285 = 285 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_286 = 286 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_287 = 287 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_288 = 288 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_289 = 289 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_290 = 290 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_291 = 291 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_292 = 292 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_293 = 293 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_294 = 294 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_295 = 295 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_296 = 296 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_297 = 297 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_298 = 298 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_299 = 299 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_300 = 300 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_301 = 301 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_302 = 302 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_303 = 303 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_304 = 304 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_305 = 305 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_306 = 306 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_307 = 307 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_308 = 308 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_309 = 309 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_310 = 310 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_311 = 311 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_312 = 312 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_313 = 313 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_314 = 314 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_315 = 315 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_316 = 316 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_317 = 317 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_318 = 318 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_319 = 319 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_320 = 320 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_321 = 321 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_322 = 322 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_323 = 323 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_324 = 324 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_325 = 325 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_326 = 326 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_327 = 327 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_328 = 328 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_329 = 329 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_330 = 330 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_331 = 331 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_332 = 332 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_333 = 333 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_334 = 334 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_335 = 335 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_336 = 336 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_337 = 337 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_338 = 338 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_339 = 339 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_340 = 340 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_341 = 341 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_342 = 342 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_343 = 343 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_344 = 344 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_345 = 345 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_346 = 346 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_347 = 347 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_348 = 348 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_349 = 349 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_350 = 350 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_351 = 351 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_352 = 352 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_353 = 353 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_354 = 354 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_355 = 355 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_356 = 356 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_357 = 357 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_358 = 358 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_359 = 359 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_360 = 360 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_361 = 361 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_362 = 362 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_363 = 363 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_364 = 364 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_365 = 365 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_366 = 366 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_367 = 367 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_368 = 368 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_369 = 369 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_370 = 370 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_371 = 371 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_372 = 372 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_373 = 373 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_374 = 374 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_375 = 375 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_376 = 376 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_377 = 377 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_378 = 378 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_379 = 379 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_380 = 380 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_381 = 381 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_382 = 382 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_383 = 383 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_384 = 384 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_385 = 385 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_386 = 386 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_387 = 387 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_388 = 388 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_389 = 389 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_390 = 390 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_391 = 391 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_392 = 392 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_393 = 393 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_394 = 394 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_395 = 395 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_396 = 396 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_397 = 397 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_398 = 398 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_399 = 399 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_400 = 400 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_401 = 401 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_402 = 402 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_403 = 403 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_404 = 404 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_405 = 405 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_406 = 406 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_407 = 407 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_408 = 408 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_409 = 409 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_410 = 410 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_411 = 411 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_412 = 412 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_413 = 413 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_414 = 414 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_415 = 415 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_416 = 416 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_417 = 417 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_418 = 418 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_419 = 419 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_420 = 420 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_421 = 421 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_422 = 422 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_423 = 423 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_424 = 424 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_425 = 425 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_426 = 426 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_427 = 427 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_428 = 428 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_429 = 429 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_430 = 430 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_431 = 431 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_432 = 432 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_433 = 433 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_434 = 434 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_435 = 435 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_436 = 436 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_437 = 437 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_438 = 438 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_439 = 439 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_440 = 440 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_441 = 441 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_442 = 442 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_443 = 443 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_444 = 444 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_445 = 445 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_446 = 446 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_447 = 447 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_448 = 448 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_449 = 449 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_450 = 450 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_451 = 451 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_452 = 452 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_453 = 453 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_454 = 454 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_455 = 455 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_456 = 456 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_457 = 457 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_458 = 458 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_459 = 459 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_460 = 460 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_461 = 461 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_462 = 462 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_463 = 463 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_464 = 464 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_465 = 465 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_466 = 466 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_467 = 467 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_468 = 468 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_469 = 469 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_470 = 470 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_471 = 471 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_472 = 472 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_473 = 473 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_474 = 474 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_475 = 475 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_476 = 476 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_477 = 477 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_478 = 478 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_479 = 479 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_480 = 480 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_481 = 481 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_482 = 482 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_483 = 483 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_484 = 484 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_485 = 485 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_486 = 486 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_487 = 487 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_488 = 488 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_489 = 489 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_490 = 490 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_491 = 491 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_492 = 492 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_493 = 493 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_494 = 494 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_495 = 495 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_496 = 496 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_497 = 497 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_498 = 498 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_499 = 499 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_500 = 500 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_501 = 501 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_502 = 502 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_503 = 503 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_504 = 504 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_505 = 505 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_506 = 506 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_507 = 507 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_508 = 508 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_509 = 509 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_510 = 510 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_511 = 511 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_512 = 512 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_513 = 513 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_514 = 514 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_515 = 515 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_516 = 516 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_517 = 517 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_518 = 518 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_519 = 519 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_520 = 520 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_521 = 521 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_522 = 522 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_523 = 523 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_524 = 524 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_525 = 525 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_526 = 526 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_527 = 527 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_528 = 528 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_529 = 529 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_530 = 530 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_531 = 531 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_532 = 532 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_533 = 533 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_534 = 534 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_535 = 535 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_536 = 536 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_537 = 537 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_538 = 538 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_539 = 539 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_540 = 540 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_541 = 541 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_542 = 542 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_543 = 543 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_544 = 544 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_545 = 545 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_546 = 546 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_547 = 547 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_548 = 548 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_549 = 549 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_550 = 550 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_551 = 551 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_552 = 552 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_553 = 553 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_554 = 554 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_555 = 555 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_556 = 556 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_557 = 557 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_558 = 558 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_559 = 559 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_560 = 560 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_561 = 561 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_562 = 562 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_563 = 563 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_564 = 564 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_565 = 565 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_566 = 566 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_567 = 567 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_568 = 568 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_569 = 569 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_570 = 570 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_571 = 571 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_572 = 572 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_573 = 573 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_574 = 574 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_575 = 575 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_576 = 576 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_577 = 577 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_578 = 578 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_579 = 579 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_580 = 580 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_581 = 581 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_582 = 582 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_583 = 583 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_584 = 584 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_585 = 585 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_586 = 586 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_587 = 587 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_588 = 588 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_589 = 589 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_590 = 590 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_591 = 591 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_592 = 592 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_593 = 593 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_594 = 594 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_595 = 595 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_596 = 596 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_597 = 597 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_598 = 598 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_599 = 599 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_600 = 600 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_601 = 601 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_602 = 602 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_603 = 603 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_604 = 604 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_605 = 605 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_606 = 606 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_607 = 607 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_608 = 608 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_609 = 609 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_610 = 610 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_611 = 611 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_612 = 612 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_613 = 613 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_614 = 614 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_615 = 615 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_616 = 616 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_617 = 617 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_618 = 618 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_619 = 619 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_620 = 620 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_621 = 621 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_622 = 622 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_623 = 623 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_624 = 624 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_625 = 625 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_626 = 626 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_627 = 627 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_628 = 628 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_629 = 629 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_630 = 630 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_631 = 631 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_632 = 632 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_633 = 633 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_634 = 634 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_635 = 635 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_636 = 636 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_637 = 637 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_638 = 638 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_639 = 639 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_640 = 640 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_641 = 641 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_642 = 642 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_643 = 643 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_644 = 644 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_645 = 645 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_646 = 646 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_647 = 647 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_648 = 648 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_649 = 649 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_650 = 650 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_651 = 651 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_652 = 652 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_653 = 653 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_654 = 654 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_655 = 655 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_656 = 656 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_657 = 657 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_658 = 658 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_659 = 659 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_660 = 660 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_661 = 661 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_662 = 662 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_663 = 663 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_664 = 664 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_665 = 665 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_666 = 666 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_667 = 667 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_668 = 668 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_669 = 669 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_670 = 670 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_671 = 671 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_672 = 672 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_673 = 673 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_674 = 674 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_675 = 675 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_676 = 676 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_677 = 677 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_678 = 678 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_679 = 679 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_680 = 680 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_681 = 681 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_682 = 682 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_683 = 683 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_684 = 684 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_685 = 685 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_686 = 686 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_687 = 687 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_688 = 688 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_689 = 689 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_690 = 690 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_691 = 691 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_692 = 692 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_693 = 693 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_694 = 694 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_695 = 695 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_696 = 696 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_697 = 697 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_698 = 698 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_699 = 699 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_700 = 700 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_701 = 701 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_702 = 702 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_703 = 703 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_704 = 704 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_705 = 705 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_706 = 706 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_707 = 707 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_708 = 708 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_709 = 709 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_710 = 710 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_711 = 711 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_712 = 712 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_713 = 713 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_714 = 714 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_715 = 715 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_716 = 716 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_717 = 717 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_718 = 718 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_719 = 719 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_720 = 720 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_721 = 721 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_722 = 722 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_723 = 723 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_724 = 724 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_725 = 725 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_726 = 726 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_727 = 727 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_728 = 728 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_729 = 729 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_730 = 730 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_731 = 731 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_732 = 732 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_733 = 733 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_734 = 734 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_735 = 735 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_736 = 736 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_737 = 737 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_738 = 738 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_739 = 739 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_740 = 740 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_741 = 741 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_742 = 742 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_743 = 743 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_744 = 744 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_745 = 745 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_746 = 746 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_747 = 747 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_748 = 748 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_749 = 749 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_750 = 750 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_751 = 751 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_752 = 752 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_753 = 753 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_754 = 754 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_755 = 755 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_756 = 756 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_757 = 757 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_758 = 758 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_759 = 759 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_760 = 760 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_761 = 761 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_762 = 762 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_763 = 763 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_764 = 764 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_765 = 765 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_766 = 766 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_767 = 767 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_768 = 768 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_769 = 769 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_770 = 770 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_771 = 771 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_772 = 772 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_773 = 773 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_774 = 774 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_775 = 775 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_776 = 776 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_777 = 777 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_778 = 778 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_779 = 779 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_780 = 780 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_781 = 781 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_782 = 782 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_783 = 783 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_784 = 784 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_785 = 785 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_786 = 786 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_787 = 787 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_788 = 788 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_789 = 789 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_790 = 790 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_791 = 791 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_792 = 792 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_793 = 793 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_794 = 794 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_795 = 795 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_796 = 796 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_797 = 797 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_798 = 798 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_799 = 799 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_800 = 800 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_801 = 801 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_802 = 802 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_803 = 803 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_804 = 804 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_805 = 805 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_806 = 806 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_807 = 807 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_808 = 808 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_809 = 809 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_810 = 810 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_811 = 811 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_812 = 812 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_813 = 813 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_814 = 814 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_815 = 815 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_816 = 816 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_817 = 817 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_818 = 818 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_819 = 819 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_820 = 820 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_821 = 821 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_822 = 822 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_823 = 823 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_824 = 824 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_825 = 825 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_826 = 826 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_827 = 827 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_828 = 828 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_829 = 829 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_830 = 830 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_831 = 831 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_832 = 832 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_833 = 833 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_834 = 834 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_835 = 835 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_836 = 836 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_837 = 837 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_838 = 838 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_839 = 839 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_840 = 840 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_841 = 841 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_842 = 842 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_843 = 843 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_844 = 844 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_845 = 845 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_846 = 846 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_847 = 847 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_848 = 848 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_849 = 849 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_850 = 850 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_851 = 851 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_852 = 852 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_853 = 853 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_854 = 854 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_855 = 855 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_856 = 856 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_857 = 857 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_858 = 858 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_859 = 859 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_860 = 860 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_861 = 861 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_862 = 862 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_863 = 863 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_864 = 864 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_865 = 865 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_866 = 866 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_867 = 867 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_868 = 868 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_869 = 869 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_870 = 870 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_871 = 871 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_872 = 872 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_873 = 873 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_874 = 874 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_875 = 875 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_876 = 876 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_877 = 877 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_878 = 878 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_879 = 879 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_880 = 880 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_881 = 881 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_882 = 882 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_883 = 883 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_884 = 884 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_885 = 885 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_886 = 886 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_887 = 887 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_888 = 888 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_889 = 889 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_890 = 890 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_891 = 891 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_892 = 892 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_893 = 893 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_894 = 894 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_895 = 895 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_896 = 896 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_897 = 897 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_898 = 898 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_899 = 899 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_900 = 900 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_901 = 901 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_902 = 902 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_903 = 903 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_904 = 904 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_905 = 905 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_906 = 906 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_907 = 907 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_908 = 908 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_909 = 909 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_910 = 910 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_911 = 911 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_912 = 912 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_913 = 913 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_914 = 914 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_915 = 915 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_916 = 916 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_917 = 917 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_918 = 918 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_919 = 919 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_920 = 920 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_921 = 921 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_922 = 922 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_923 = 923 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_924 = 924 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_925 = 925 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_926 = 926 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_927 = 927 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_928 = 928 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_929 = 929 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_930 = 930 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_931 = 931 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_932 = 932 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_933 = 933 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_934 = 934 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_935 = 935 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_936 = 936 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_937 = 937 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_938 = 938 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_939 = 939 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_940 = 940 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_941 = 941 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_942 = 942 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_943 = 943 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_944 = 944 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_945 = 945 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_946 = 946 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_947 = 947 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_948 = 948 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_949 = 949 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_950 = 950 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_951 = 951 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_952 = 952 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_953 = 953 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_954 = 954 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_955 = 955 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_956 = 956 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_957 = 957 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_958 = 958 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_959 = 959 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_960 = 960 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_961 = 961 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_962 = 962 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_963 = 963 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_964 = 964 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_965 = 965 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_966 = 966 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_967 = 967 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_968 = 968 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_969 = 969 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_970 = 970 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_971 = 971 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_972 = 972 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_973 = 973 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_974 = 974 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_975 = 975 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_976 = 976 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_977 = 977 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_978 = 978 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_979 = 979 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_980 = 980 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_981 = 981 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_982 = 982 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_983 = 983 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_984 = 984 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_985 = 985 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_986 = 986 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_987 = 987 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_988 = 988 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_989 = 989 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_990 = 990 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_991 = 991 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_992 = 992 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_993 = 993 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_994 = 994 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_995 = 995 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_996 = 996 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_997 = 997 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_998 = 998 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_999 = 999 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; + optional string long_field_name_is_looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong_1000 = 1000 [default="long default value is also loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong"]; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto new file mode 100644 index 000000000..cd533ecd3 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto @@ -0,0 +1,61 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// A proto file which is imported by unittest.proto to test importing. + + +// We don't put this in a package within proto2 because we need to make sure +// that the generated code doesn't depend on being in the proto2 namespace. +// In test_util.h we do +// "using namespace unittest_import = protobuf_unittest_import". +package protobuf_unittest_import; + +option optimize_for = SPEED; + +// Excercise the java_package option. +option java_package = "com.google.protobuf.test"; + +// Do not set a java_outer_classname here to verify that Proto2 works without +// one. + +message ImportMessage { + optional int32 d = 1; +} + +enum ImportEnum { + IMPORT_FOO = 7; + IMPORT_BAR = 8; + IMPORT_BAZ = 9; +} + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto new file mode 100644 index 000000000..ebaab5c05 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto @@ -0,0 +1,49 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// This is like unittest_import.proto but with optimize_for = LITE_RUNTIME. + +package protobuf_unittest_import; + +option optimize_for = LITE_RUNTIME; + +option java_package = "com.google.protobuf"; + +message ImportMessageLite { + optional int32 d = 1; +} + +enum ImportEnumLite { + IMPORT_LITE_FOO = 7; + IMPORT_LITE_BAR = 8; + IMPORT_LITE_BAZ = 9; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto new file mode 100644 index 000000000..cca6b497a --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto @@ -0,0 +1,312 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// This is like unittest.proto but with optimize_for = LITE_RUNTIME. + +package protobuf_unittest; + +import "google/protobuf/unittest_import_lite.proto"; + +option optimize_for = LITE_RUNTIME; + +option java_package = "com.google.protobuf"; + +// Same as TestAllTypes but with the lite runtime. +message TestAllTypesLite { + message NestedMessage { + optional int32 bb = 1; + } + + enum NestedEnum { + FOO = 1; + BAR = 2; + BAZ = 3; + } + + // Singular + optional int32 optional_int32 = 1; + optional int64 optional_int64 = 2; + optional uint32 optional_uint32 = 3; + optional uint64 optional_uint64 = 4; + optional sint32 optional_sint32 = 5; + optional sint64 optional_sint64 = 6; + optional fixed32 optional_fixed32 = 7; + optional fixed64 optional_fixed64 = 8; + optional sfixed32 optional_sfixed32 = 9; + optional sfixed64 optional_sfixed64 = 10; + optional float optional_float = 11; + optional double optional_double = 12; + optional bool optional_bool = 13; + optional string optional_string = 14; + optional bytes optional_bytes = 15; + + optional group OptionalGroup = 16 { + optional int32 a = 17; + } + + optional NestedMessage optional_nested_message = 18; + optional ForeignMessageLite optional_foreign_message = 19; + optional protobuf_unittest_import.ImportMessageLite + optional_import_message = 20; + + optional NestedEnum optional_nested_enum = 21; + optional ForeignEnumLite optional_foreign_enum = 22; + optional protobuf_unittest_import.ImportEnumLite optional_import_enum = 23; + + optional string optional_string_piece = 24 [ctype=STRING_PIECE]; + optional string optional_cord = 25 [ctype=CORD]; + + // Repeated + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; + repeated sfixed32 repeated_sfixed32 = 39; + repeated sfixed64 repeated_sfixed64 = 40; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; + + repeated group RepeatedGroup = 46 { + optional int32 a = 47; + } + + repeated NestedMessage repeated_nested_message = 48; + repeated ForeignMessageLite repeated_foreign_message = 49; + repeated protobuf_unittest_import.ImportMessageLite + repeated_import_message = 50; + + repeated NestedEnum repeated_nested_enum = 51; + repeated ForeignEnumLite repeated_foreign_enum = 52; + repeated protobuf_unittest_import.ImportEnumLite repeated_import_enum = 53; + + repeated string repeated_string_piece = 54 [ctype=STRING_PIECE]; + repeated string repeated_cord = 55 [ctype=CORD]; + + // Singular with defaults + optional int32 default_int32 = 61 [default = 41 ]; + optional int64 default_int64 = 62 [default = 42 ]; + optional uint32 default_uint32 = 63 [default = 43 ]; + optional uint64 default_uint64 = 64 [default = 44 ]; + optional sint32 default_sint32 = 65 [default = -45 ]; + optional sint64 default_sint64 = 66 [default = 46 ]; + optional fixed32 default_fixed32 = 67 [default = 47 ]; + optional fixed64 default_fixed64 = 68 [default = 48 ]; + optional sfixed32 default_sfixed32 = 69 [default = 49 ]; + optional sfixed64 default_sfixed64 = 70 [default = -50 ]; + optional float default_float = 71 [default = 51.5 ]; + optional double default_double = 72 [default = 52e3 ]; + optional bool default_bool = 73 [default = true ]; + optional string default_string = 74 [default = "hello"]; + optional bytes default_bytes = 75 [default = "world"]; + + optional NestedEnum default_nested_enum = 81 [default = BAR]; + optional ForeignEnumLite default_foreign_enum = 82 + [default = FOREIGN_LITE_BAR]; + optional protobuf_unittest_import.ImportEnumLite + default_import_enum = 83 [default = IMPORT_LITE_BAR]; + + optional string default_string_piece = 84 [ctype=STRING_PIECE,default="abc"]; + optional string default_cord = 85 [ctype=CORD,default="123"]; +} + +message ForeignMessageLite { + optional int32 c = 1; +} + +enum ForeignEnumLite { + FOREIGN_LITE_FOO = 4; + FOREIGN_LITE_BAR = 5; + FOREIGN_LITE_BAZ = 6; +} + +message TestPackedTypesLite { + repeated int32 packed_int32 = 90 [packed = true]; + repeated int64 packed_int64 = 91 [packed = true]; + repeated uint32 packed_uint32 = 92 [packed = true]; + repeated uint64 packed_uint64 = 93 [packed = true]; + repeated sint32 packed_sint32 = 94 [packed = true]; + repeated sint64 packed_sint64 = 95 [packed = true]; + repeated fixed32 packed_fixed32 = 96 [packed = true]; + repeated fixed64 packed_fixed64 = 97 [packed = true]; + repeated sfixed32 packed_sfixed32 = 98 [packed = true]; + repeated sfixed64 packed_sfixed64 = 99 [packed = true]; + repeated float packed_float = 100 [packed = true]; + repeated double packed_double = 101 [packed = true]; + repeated bool packed_bool = 102 [packed = true]; + repeated ForeignEnumLite packed_enum = 103 [packed = true]; +} + +message TestAllExtensionsLite { + extensions 1 to max; +} + +extend TestAllExtensionsLite { + // Singular + optional int32 optional_int32_extension_lite = 1; + optional int64 optional_int64_extension_lite = 2; + optional uint32 optional_uint32_extension_lite = 3; + optional uint64 optional_uint64_extension_lite = 4; + optional sint32 optional_sint32_extension_lite = 5; + optional sint64 optional_sint64_extension_lite = 6; + optional fixed32 optional_fixed32_extension_lite = 7; + optional fixed64 optional_fixed64_extension_lite = 8; + optional sfixed32 optional_sfixed32_extension_lite = 9; + optional sfixed64 optional_sfixed64_extension_lite = 10; + optional float optional_float_extension_lite = 11; + optional double optional_double_extension_lite = 12; + optional bool optional_bool_extension_lite = 13; + optional string optional_string_extension_lite = 14; + optional bytes optional_bytes_extension_lite = 15; + + optional group OptionalGroup_extension_lite = 16 { + optional int32 a = 17; + } + + optional TestAllTypesLite.NestedMessage optional_nested_message_extension_lite + = 18; + optional ForeignMessageLite optional_foreign_message_extension_lite = 19; + optional protobuf_unittest_import.ImportMessageLite + optional_import_message_extension_lite = 20; + + optional TestAllTypesLite.NestedEnum optional_nested_enum_extension_lite = 21; + optional ForeignEnumLite optional_foreign_enum_extension_lite = 22; + optional protobuf_unittest_import.ImportEnumLite + optional_import_enum_extension_lite = 23; + + optional string optional_string_piece_extension_lite = 24 + [ctype=STRING_PIECE]; + optional string optional_cord_extension_lite = 25 [ctype=CORD]; + + // Repeated + repeated int32 repeated_int32_extension_lite = 31; + repeated int64 repeated_int64_extension_lite = 32; + repeated uint32 repeated_uint32_extension_lite = 33; + repeated uint64 repeated_uint64_extension_lite = 34; + repeated sint32 repeated_sint32_extension_lite = 35; + repeated sint64 repeated_sint64_extension_lite = 36; + repeated fixed32 repeated_fixed32_extension_lite = 37; + repeated fixed64 repeated_fixed64_extension_lite = 38; + repeated sfixed32 repeated_sfixed32_extension_lite = 39; + repeated sfixed64 repeated_sfixed64_extension_lite = 40; + repeated float repeated_float_extension_lite = 41; + repeated double repeated_double_extension_lite = 42; + repeated bool repeated_bool_extension_lite = 43; + repeated string repeated_string_extension_lite = 44; + repeated bytes repeated_bytes_extension_lite = 45; + + repeated group RepeatedGroup_extension_lite = 46 { + optional int32 a = 47; + } + + repeated TestAllTypesLite.NestedMessage repeated_nested_message_extension_lite + = 48; + repeated ForeignMessageLite repeated_foreign_message_extension_lite = 49; + repeated protobuf_unittest_import.ImportMessageLite + repeated_import_message_extension_lite = 50; + + repeated TestAllTypesLite.NestedEnum repeated_nested_enum_extension_lite = 51; + repeated ForeignEnumLite repeated_foreign_enum_extension_lite = 52; + repeated protobuf_unittest_import.ImportEnumLite + repeated_import_enum_extension_lite = 53; + + repeated string repeated_string_piece_extension_lite = 54 + [ctype=STRING_PIECE]; + repeated string repeated_cord_extension_lite = 55 [ctype=CORD]; + + // Singular with defaults + optional int32 default_int32_extension_lite = 61 [default = 41 ]; + optional int64 default_int64_extension_lite = 62 [default = 42 ]; + optional uint32 default_uint32_extension_lite = 63 [default = 43 ]; + optional uint64 default_uint64_extension_lite = 64 [default = 44 ]; + optional sint32 default_sint32_extension_lite = 65 [default = -45 ]; + optional sint64 default_sint64_extension_lite = 66 [default = 46 ]; + optional fixed32 default_fixed32_extension_lite = 67 [default = 47 ]; + optional fixed64 default_fixed64_extension_lite = 68 [default = 48 ]; + optional sfixed32 default_sfixed32_extension_lite = 69 [default = 49 ]; + optional sfixed64 default_sfixed64_extension_lite = 70 [default = -50 ]; + optional float default_float_extension_lite = 71 [default = 51.5 ]; + optional double default_double_extension_lite = 72 [default = 52e3 ]; + optional bool default_bool_extension_lite = 73 [default = true ]; + optional string default_string_extension_lite = 74 [default = "hello"]; + optional bytes default_bytes_extension_lite = 75 [default = "world"]; + + optional TestAllTypesLite.NestedEnum + default_nested_enum_extension_lite = 81 [default = BAR]; + optional ForeignEnumLite + default_foreign_enum_extension_lite = 82 [default = FOREIGN_LITE_BAR]; + optional protobuf_unittest_import.ImportEnumLite + default_import_enum_extension_lite = 83 [default = IMPORT_LITE_BAR]; + + optional string default_string_piece_extension_lite = 84 [ctype=STRING_PIECE, + default="abc"]; + optional string default_cord_extension_lite = 85 [ctype=CORD, default="123"]; +} + +message TestPackedExtensionsLite { + extensions 1 to max; +} + +extend TestPackedExtensionsLite { + repeated int32 packed_int32_extension_lite = 90 [packed = true]; + repeated int64 packed_int64_extension_lite = 91 [packed = true]; + repeated uint32 packed_uint32_extension_lite = 92 [packed = true]; + repeated uint64 packed_uint64_extension_lite = 93 [packed = true]; + repeated sint32 packed_sint32_extension_lite = 94 [packed = true]; + repeated sint64 packed_sint64_extension_lite = 95 [packed = true]; + repeated fixed32 packed_fixed32_extension_lite = 96 [packed = true]; + repeated fixed64 packed_fixed64_extension_lite = 97 [packed = true]; + repeated sfixed32 packed_sfixed32_extension_lite = 98 [packed = true]; + repeated sfixed64 packed_sfixed64_extension_lite = 99 [packed = true]; + repeated float packed_float_extension_lite = 100 [packed = true]; + repeated double packed_double_extension_lite = 101 [packed = true]; + repeated bool packed_bool_extension_lite = 102 [packed = true]; + repeated ForeignEnumLite packed_enum_extension_lite = 103 [packed = true]; +} + +message TestNestedExtensionLite { + extend TestAllExtensionsLite { + optional int32 nested_extension = 12345; + } +} + +// Test that deprecated fields work. We only verify that they compile (at one +// point this failed). +message TestDeprecatedLite { + optional int32 deprecated_field = 1 [deprecated = true]; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto new file mode 100644 index 000000000..d52cb8cc3 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto @@ -0,0 +1,43 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// +// Tests that a "lite" message can import a regular message. + +package protobuf_unittest; + +import "google/protobuf/unittest.proto"; + +option optimize_for = LITE_RUNTIME; + +message TestLiteImportsNonlite { + optional TestAllTypes message = 1; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto new file mode 100644 index 000000000..3497f09fa --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto @@ -0,0 +1,72 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This file contains messages for testing message_set_wire_format. + +package protobuf_unittest; + +option optimize_for = SPEED; + +// A message with message_set_wire_format. +message TestMessageSet { + option message_set_wire_format = true; + extensions 4 to max; +} + +message TestMessageSetContainer { + optional TestMessageSet message_set = 1; +} + +message TestMessageSetExtension1 { + extend TestMessageSet { + optional TestMessageSetExtension1 message_set_extension = 1545008; + } + optional int32 i = 15; +} + +message TestMessageSetExtension2 { + extend TestMessageSet { + optional TestMessageSetExtension2 message_set_extension = 1547769; + } + optional string str = 25; +} + +// MessageSet wire format is equivalent to this. +message RawMessageSet { + repeated group Item = 1 { + required int32 type_id = 2; + required bytes message = 3; + } +} + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto new file mode 100644 index 000000000..cffb4122c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto @@ -0,0 +1,52 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) + +package google.protobuf.no_generic_services_test; + +// *_generic_services are false by default. + +message TestMessage { + optional int32 a = 1; + extensions 1000 to max; +} + +enum TestEnum { + FOO = 1; +} + +extend TestMessage { + optional int32 test_extension = 1000; +} + +service TestService { + rpc Foo(TestMessage) returns(TestMessage); +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto new file mode 100644 index 000000000..feecbef8d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto @@ -0,0 +1,61 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// A proto file which uses optimize_for = CODE_SIZE. + +import "google/protobuf/unittest.proto"; + +package protobuf_unittest; + +option optimize_for = CODE_SIZE; + +message TestOptimizedForSize { + optional int32 i = 1; + optional ForeignMessage msg = 19; + + extensions 1000 to max; + + extend TestOptimizedForSize { + optional int32 test_extension = 1234; + optional TestRequiredOptimizedForSize test_extension2 = 1235; + } +} + +message TestRequiredOptimizedForSize { + required int32 x = 1; +} + +message TestOptionalOptimizedForSize { + optional TestRequiredOptimizedForSize o = 1; +} diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc new file mode 100644 index 000000000..e1f8b838f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc @@ -0,0 +1,204 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +UnknownFieldSet::UnknownFieldSet() + : fields_(NULL) {} + +UnknownFieldSet::~UnknownFieldSet() { + Clear(); + delete fields_; +} + +void UnknownFieldSet::ClearFallback() { + GOOGLE_DCHECK(fields_ != NULL); + for (int i = 0; i < fields_->size(); i++) { + (*fields_)[i].Delete(); + } + fields_->clear(); +} + +void UnknownFieldSet::MergeFrom(const UnknownFieldSet& other) { + for (int i = 0; i < other.field_count(); i++) { + AddField(other.field(i)); + } +} + +int UnknownFieldSet::SpaceUsedExcludingSelf() const { + if (fields_ == NULL) return 0; + + int total_size = sizeof(*fields_) + sizeof(UnknownField) * fields_->size(); + for (int i = 0; i < fields_->size(); i++) { + const UnknownField& field = (*fields_)[i]; + switch (field.type()) { + case UnknownField::TYPE_LENGTH_DELIMITED: + total_size += sizeof(*field.length_delimited_) + + internal::StringSpaceUsedExcludingSelf(*field.length_delimited_); + break; + case UnknownField::TYPE_GROUP: + total_size += field.group_->SpaceUsed(); + break; + default: + break; + } + } + return total_size; +} + +int UnknownFieldSet::SpaceUsed() const { + return sizeof(*this) + SpaceUsedExcludingSelf(); +} + +void UnknownFieldSet::AddVarint(int number, uint64 value) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.type_ = UnknownField::TYPE_VARINT; + field.varint_ = value; + fields_->push_back(field); +} + +void UnknownFieldSet::AddFixed32(int number, uint32 value) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.type_ = UnknownField::TYPE_FIXED32; + field.fixed32_ = value; + fields_->push_back(field); +} + +void UnknownFieldSet::AddFixed64(int number, uint64 value) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.type_ = UnknownField::TYPE_FIXED64; + field.fixed64_ = value; + fields_->push_back(field); +} + +string* UnknownFieldSet::AddLengthDelimited(int number) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.type_ = UnknownField::TYPE_LENGTH_DELIMITED; + field.length_delimited_ = new string; + fields_->push_back(field); + return field.length_delimited_; +} + +UnknownFieldSet* UnknownFieldSet::AddGroup(int number) { + if (fields_ == NULL) fields_ = new vector; + UnknownField field; + field.number_ = number; + field.type_ = UnknownField::TYPE_GROUP; + field.group_ = new UnknownFieldSet; + fields_->push_back(field); + return field.group_; +} + +void UnknownFieldSet::AddField(const UnknownField& field) { + if (fields_ == NULL) fields_ = new vector; + fields_->push_back(field); + fields_->back().DeepCopy(); +} + +bool UnknownFieldSet::MergeFromCodedStream(io::CodedInputStream* input) { + + UnknownFieldSet other; + if (internal::WireFormat::SkipMessage(input, &other) && + input->ConsumedEntireMessage()) { + MergeFrom(other); + return true; + } else { + return false; + } +} + +bool UnknownFieldSet::ParseFromCodedStream(io::CodedInputStream* input) { + Clear(); + return MergeFromCodedStream(input); +} + +bool UnknownFieldSet::ParseFromZeroCopyStream(io::ZeroCopyInputStream* input) { + io::CodedInputStream coded_input(input); + return ParseFromCodedStream(&coded_input) && + coded_input.ConsumedEntireMessage(); +} + +bool UnknownFieldSet::ParseFromArray(const void* data, int size) { + io::ArrayInputStream input(data, size); + return ParseFromZeroCopyStream(&input); +} + +void UnknownField::Delete() { + switch (type()) { + case UnknownField::TYPE_LENGTH_DELIMITED: + delete length_delimited_; + break; + case UnknownField::TYPE_GROUP: + delete group_; + break; + default: + break; + } +} + +void UnknownField::DeepCopy() { + switch (type()) { + case UnknownField::TYPE_LENGTH_DELIMITED: + length_delimited_ = new string(*length_delimited_); + break; + case UnknownField::TYPE_GROUP: { + UnknownFieldSet* group = new UnknownFieldSet; + group->MergeFrom(*group_); + group_ = group; + break; + } + default: + break; + } +} + +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h new file mode 100644 index 000000000..84c2e2b60 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h @@ -0,0 +1,268 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// Contains classes used to keep track of unrecognized fields seen while +// parsing a protocol message. + +#ifndef GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__ +#define GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__ + +#include +#include +#include + +namespace google { +namespace protobuf { + +class Message; // message.h +class UnknownField; // below + +// An UnknownFieldSet contains fields that were encountered while parsing a +// message but were not defined by its type. Keeping track of these can be +// useful, especially in that they may be written if the message is serialized +// again without being cleared in between. This means that software which +// simply receives messages and forwards them to other servers does not need +// to be updated every time a new field is added to the message definition. +// +// To get the UnknownFieldSet attached to any message, call +// Reflection::GetUnknownFields(). +// +// This class is necessarily tied to the protocol buffer wire format, unlike +// the Reflection interface which is independent of any serialization scheme. +class LIBPROTOBUF_EXPORT UnknownFieldSet { + public: + UnknownFieldSet(); + ~UnknownFieldSet(); + + // Remove all fields. + inline void Clear(); + + // Is this set empty? + inline bool empty() const; + + // Merge the contents of some other UnknownFieldSet with this one. + void MergeFrom(const UnknownFieldSet& other); + + // Swaps the contents of some other UnknownFieldSet with this one. + inline void Swap(UnknownFieldSet* x); + + // Computes (an estimate of) the total number of bytes currently used for + // storing the unknown fields in memory. Does NOT include + // sizeof(*this) in the calculation. + int SpaceUsedExcludingSelf() const; + + // Version of SpaceUsed() including sizeof(*this). + int SpaceUsed() const; + + // Returns the number of fields present in the UnknownFieldSet. + inline int field_count() const; + // Get a field in the set, where 0 <= index < field_count(). The fields + // appear in the order in which they were added. + inline const UnknownField& field(int index) const; + // Get a mutable pointer to a field in the set, where + // 0 <= index < field_count(). The fields appear in the order in which + // they were added. + inline UnknownField* mutable_field(int index); + + // Adding fields --------------------------------------------------- + + void AddVarint(int number, uint64 value); + void AddFixed32(int number, uint32 value); + void AddFixed64(int number, uint64 value); + void AddLengthDelimited(int number, const string& value); + string* AddLengthDelimited(int number); + UnknownFieldSet* AddGroup(int number); + + // Adds an unknown field from another set. + void AddField(const UnknownField& field); + + // Parsing helpers ------------------------------------------------- + // These work exactly like the similarly-named methods of Message. + + bool MergeFromCodedStream(io::CodedInputStream* input); + bool ParseFromCodedStream(io::CodedInputStream* input); + bool ParseFromZeroCopyStream(io::ZeroCopyInputStream* input); + bool ParseFromArray(const void* data, int size); + inline bool ParseFromString(const string& data) { + return ParseFromArray(data.data(), data.size()); + } + + private: + void ClearFallback(); + + vector* fields_; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(UnknownFieldSet); +}; + +// Represents one field in an UnknownFieldSet. +class LIBPROTOBUF_EXPORT UnknownField { + public: + enum Type { + TYPE_VARINT, + TYPE_FIXED32, + TYPE_FIXED64, + TYPE_LENGTH_DELIMITED, + TYPE_GROUP + }; + + // The field's tag number, as seen on the wire. + inline int number() const; + + // The field type. + inline Type type() const; + + // Accessors ------------------------------------------------------- + // Each method works only for UnknownFields of the corresponding type. + + inline uint64 varint() const; + inline uint32 fixed32() const; + inline uint64 fixed64() const; + inline const string& length_delimited() const; + inline const UnknownFieldSet& group() const; + + inline void set_varint(uint64 value); + inline void set_fixed32(uint32 value); + inline void set_fixed64(uint64 value); + inline void set_length_delimited(const string& value); + inline string* mutable_length_delimited(); + inline UnknownFieldSet* mutable_group(); + + private: + friend class UnknownFieldSet; + + // If this UnknownField contains a pointer, delete it. + void Delete(); + + // Make a deep copy of any pointers in this UnknownField. + void DeepCopy(); + + unsigned int number_ : 29; + unsigned int type_ : 3; + union { + uint64 varint_; + uint32 fixed32_; + uint64 fixed64_; + string* length_delimited_; + UnknownFieldSet* group_; + }; +}; + +// =================================================================== +// inline implementations + +inline void UnknownFieldSet::Clear() { + if (fields_ != NULL) { + ClearFallback(); + } +} + +inline bool UnknownFieldSet::empty() const { + return fields_ == NULL || fields_->empty(); +} + +inline void UnknownFieldSet::Swap(UnknownFieldSet* x) { + std::swap(fields_, x->fields_); +} + +inline int UnknownFieldSet::field_count() const { + return (fields_ == NULL) ? 0 : fields_->size(); +} +inline const UnknownField& UnknownFieldSet::field(int index) const { + return (*fields_)[index]; +} +inline UnknownField* UnknownFieldSet::mutable_field(int index) { + return &(*fields_)[index]; +} + +inline void UnknownFieldSet::AddLengthDelimited( + int number, const string& value) { + AddLengthDelimited(number)->assign(value); +} + +inline int UnknownField::number() const { return number_; } +inline UnknownField::Type UnknownField::type() const { + return static_cast(type_); +} + +inline uint64 UnknownField::varint () const { + GOOGLE_DCHECK_EQ(type_, TYPE_VARINT); + return varint_; +} +inline uint32 UnknownField::fixed32() const { + GOOGLE_DCHECK_EQ(type_, TYPE_FIXED32); + return fixed32_; +} +inline uint64 UnknownField::fixed64() const { + GOOGLE_DCHECK_EQ(type_, TYPE_FIXED64); + return fixed64_; +} +inline const string& UnknownField::length_delimited() const { + GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED); + return *length_delimited_; +} +inline const UnknownFieldSet& UnknownField::group() const { + GOOGLE_DCHECK_EQ(type_, TYPE_GROUP); + return *group_; +} + +inline void UnknownField::set_varint(uint64 value) { + GOOGLE_DCHECK_EQ(type_, TYPE_VARINT); + varint_ = value; +} +inline void UnknownField::set_fixed32(uint32 value) { + GOOGLE_DCHECK_EQ(type_, TYPE_FIXED32); + fixed32_ = value; +} +inline void UnknownField::set_fixed64(uint64 value) { + GOOGLE_DCHECK_EQ(type_, TYPE_FIXED64); + fixed64_ = value; +} +inline void UnknownField::set_length_delimited(const string& value) { + GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED); + length_delimited_->assign(value); +} +inline string* UnknownField::mutable_length_delimited() { + GOOGLE_DCHECK_EQ(type_, TYPE_LENGTH_DELIMITED); + return length_delimited_; +} +inline UnknownFieldSet* UnknownField::mutable_group() { + GOOGLE_DCHECK_EQ(type_, TYPE_GROUP); + return group_; +} + +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_UNKNOWN_FIELD_SET_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc new file mode 100644 index 000000000..1235c9ee6 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc @@ -0,0 +1,512 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This test is testing a lot more than just the UnknownFieldSet class. It +// tests handling of unknown fields throughout the system. + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace google { +namespace protobuf { + +using internal::WireFormat; + +namespace { + +class UnknownFieldSetTest : public testing::Test { + protected: + virtual void SetUp() { + descriptor_ = unittest::TestAllTypes::descriptor(); + TestUtil::SetAllFields(&all_fields_); + all_fields_.SerializeToString(&all_fields_data_); + ASSERT_TRUE(empty_message_.ParseFromString(all_fields_data_)); + unknown_fields_ = empty_message_.mutable_unknown_fields(); + } + + const UnknownField* GetField(const string& name) { + const FieldDescriptor* field = descriptor_->FindFieldByName(name); + if (field == NULL) return NULL; + for (int i = 0; i < unknown_fields_->field_count(); i++) { + if (unknown_fields_->field(i).number() == field->number()) { + return &unknown_fields_->field(i); + } + } + return NULL; + } + + // Constructs a protocol buffer which contains fields with all the same + // numbers as all_fields_data_ except that each field is some other wire + // type. + string GetBizarroData() { + unittest::TestEmptyMessage bizarro_message; + UnknownFieldSet* bizarro_unknown_fields = + bizarro_message.mutable_unknown_fields(); + for (int i = 0; i < unknown_fields_->field_count(); i++) { + const UnknownField& unknown_field = unknown_fields_->field(i); + if (unknown_field.type() == UnknownField::TYPE_VARINT) { + bizarro_unknown_fields->AddFixed32(unknown_field.number(), 1); + } else { + bizarro_unknown_fields->AddVarint(unknown_field.number(), 1); + } + } + + string data; + EXPECT_TRUE(bizarro_message.SerializeToString(&data)); + return data; + } + + const Descriptor* descriptor_; + unittest::TestAllTypes all_fields_; + string all_fields_data_; + + // An empty message that has been parsed from all_fields_data_. So, it has + // unknown fields of every type. + unittest::TestEmptyMessage empty_message_; + UnknownFieldSet* unknown_fields_; +}; + +TEST_F(UnknownFieldSetTest, AllFieldsPresent) { + // All fields of TestAllTypes should be present, in numeric order (because + // that's the order we parsed them in). Fields that are not valid field + // numbers of TestAllTypes should NOT be present. + + int pos = 0; + + for (int i = 0; i < 1000; i++) { + const FieldDescriptor* field = descriptor_->FindFieldByNumber(i); + if (field != NULL) { + ASSERT_LT(pos, unknown_fields_->field_count()); + EXPECT_EQ(i, unknown_fields_->field(pos++).number()); + if (field->is_repeated()) { + // Should have a second instance. + ASSERT_LT(pos, unknown_fields_->field_count()); + EXPECT_EQ(i, unknown_fields_->field(pos++).number()); + } + } + } + EXPECT_EQ(unknown_fields_->field_count(), pos); +} + +TEST_F(UnknownFieldSetTest, Varint) { + const UnknownField* field = GetField("optional_int32"); + ASSERT_TRUE(field != NULL); + + ASSERT_EQ(UnknownField::TYPE_VARINT, field->type()); + EXPECT_EQ(all_fields_.optional_int32(), field->varint()); +} + +TEST_F(UnknownFieldSetTest, Fixed32) { + const UnknownField* field = GetField("optional_fixed32"); + ASSERT_TRUE(field != NULL); + + ASSERT_EQ(UnknownField::TYPE_FIXED32, field->type()); + EXPECT_EQ(all_fields_.optional_fixed32(), field->fixed32()); +} + +TEST_F(UnknownFieldSetTest, Fixed64) { + const UnknownField* field = GetField("optional_fixed64"); + ASSERT_TRUE(field != NULL); + + ASSERT_EQ(UnknownField::TYPE_FIXED64, field->type()); + EXPECT_EQ(all_fields_.optional_fixed64(), field->fixed64()); +} + +TEST_F(UnknownFieldSetTest, LengthDelimited) { + const UnknownField* field = GetField("optional_string"); + ASSERT_TRUE(field != NULL); + + ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, field->type()); + EXPECT_EQ(all_fields_.optional_string(), field->length_delimited()); +} + +TEST_F(UnknownFieldSetTest, Group) { + const UnknownField* field = GetField("optionalgroup"); + ASSERT_TRUE(field != NULL); + + ASSERT_EQ(UnknownField::TYPE_GROUP, field->type()); + ASSERT_EQ(1, field->group().field_count()); + + const UnknownField& nested_field = field->group().field(0); + const FieldDescriptor* nested_field_descriptor = + unittest::TestAllTypes::OptionalGroup::descriptor()->FindFieldByName("a"); + ASSERT_TRUE(nested_field_descriptor != NULL); + + EXPECT_EQ(nested_field_descriptor->number(), nested_field.number()); + ASSERT_EQ(UnknownField::TYPE_VARINT, nested_field.type()); + EXPECT_EQ(all_fields_.optionalgroup().a(), nested_field.varint()); +} + +TEST_F(UnknownFieldSetTest, SerializeFastAndSlowAreEquivalent) { + int size = WireFormat::ComputeUnknownFieldsSize( + empty_message_.unknown_fields()); + string slow_buffer; + string fast_buffer; + slow_buffer.resize(size); + fast_buffer.resize(size); + + uint8* target = reinterpret_cast(string_as_array(&fast_buffer)); + uint8* result = WireFormat::SerializeUnknownFieldsToArray( + empty_message_.unknown_fields(), target); + EXPECT_EQ(size, result - target); + + { + io::ArrayOutputStream raw_stream(string_as_array(&slow_buffer), size, 1); + io::CodedOutputStream output_stream(&raw_stream); + WireFormat::SerializeUnknownFields(empty_message_.unknown_fields(), + &output_stream); + ASSERT_FALSE(output_stream.HadError()); + } + EXPECT_TRUE(fast_buffer == slow_buffer); +} + +TEST_F(UnknownFieldSetTest, Serialize) { + // Check that serializing the UnknownFieldSet produces the original data + // again. + + string data; + empty_message_.SerializeToString(&data); + + // Don't use EXPECT_EQ because we don't want to dump raw binary data to + // stdout. + EXPECT_TRUE(data == all_fields_data_); +} + +TEST_F(UnknownFieldSetTest, ParseViaReflection) { + // Make sure fields are properly parsed to the UnknownFieldSet when parsing + // via reflection. + + unittest::TestEmptyMessage message; + io::ArrayInputStream raw_input(all_fields_data_.data(), + all_fields_data_.size()); + io::CodedInputStream input(&raw_input); + ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message)); + + EXPECT_EQ(message.DebugString(), empty_message_.DebugString()); +} + +TEST_F(UnknownFieldSetTest, SerializeViaReflection) { + // Make sure fields are properly written from the UnknownFieldSet when + // serializing via reflection. + + string data; + + { + io::StringOutputStream raw_output(&data); + io::CodedOutputStream output(&raw_output); + int size = WireFormat::ByteSize(empty_message_); + WireFormat::SerializeWithCachedSizes(empty_message_, size, &output); + ASSERT_FALSE(output.HadError()); + } + + // Don't use EXPECT_EQ because we don't want to dump raw binary data to + // stdout. + EXPECT_TRUE(data == all_fields_data_); +} + +TEST_F(UnknownFieldSetTest, CopyFrom) { + unittest::TestEmptyMessage message; + + message.CopyFrom(empty_message_); + + EXPECT_EQ(empty_message_.DebugString(), message.DebugString()); +} + +TEST_F(UnknownFieldSetTest, Swap) { + unittest::TestEmptyMessage other_message; + ASSERT_TRUE(other_message.ParseFromString(GetBizarroData())); + + EXPECT_GT(empty_message_.unknown_fields().field_count(), 0); + EXPECT_GT(other_message.unknown_fields().field_count(), 0); + const string debug_string = empty_message_.DebugString(); + const string other_debug_string = other_message.DebugString(); + EXPECT_NE(debug_string, other_debug_string); + + empty_message_.Swap(&other_message); + EXPECT_EQ(debug_string, other_message.DebugString()); + EXPECT_EQ(other_debug_string, empty_message_.DebugString()); +} + +TEST_F(UnknownFieldSetTest, SwapWithSelf) { + const string debug_string = empty_message_.DebugString(); + EXPECT_GT(empty_message_.unknown_fields().field_count(), 0); + + empty_message_.Swap(&empty_message_); + EXPECT_GT(empty_message_.unknown_fields().field_count(), 0); + EXPECT_EQ(debug_string, empty_message_.DebugString()); +} + +TEST_F(UnknownFieldSetTest, MergeFrom) { + unittest::TestEmptyMessage source, destination; + + destination.mutable_unknown_fields()->AddVarint(1, 1); + destination.mutable_unknown_fields()->AddVarint(3, 2); + source.mutable_unknown_fields()->AddVarint(2, 3); + source.mutable_unknown_fields()->AddVarint(3, 4); + + destination.MergeFrom(source); + + EXPECT_EQ( + // Note: The ordering of fields here depends on the ordering of adds + // and merging, above. + "1: 1\n" + "3: 2\n" + "2: 3\n" + "3: 4\n", + destination.DebugString()); +} + +TEST_F(UnknownFieldSetTest, Clear) { + // Clear the set. + empty_message_.Clear(); + EXPECT_EQ(0, unknown_fields_->field_count()); +} + +TEST_F(UnknownFieldSetTest, ParseKnownAndUnknown) { + // Test mixing known and unknown fields when parsing. + + unittest::TestEmptyMessage source; + source.mutable_unknown_fields()->AddVarint(123456, 654321); + string data; + ASSERT_TRUE(source.SerializeToString(&data)); + + unittest::TestAllTypes destination; + ASSERT_TRUE(destination.ParseFromString(all_fields_data_ + data)); + + TestUtil::ExpectAllFieldsSet(destination); + ASSERT_EQ(1, destination.unknown_fields().field_count()); + ASSERT_EQ(UnknownField::TYPE_VARINT, + destination.unknown_fields().field(0).type()); + EXPECT_EQ(654321, destination.unknown_fields().field(0).varint()); +} + +TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknown) { + // Test that fields of the wrong wire type are treated like unknown fields + // when parsing. + + unittest::TestAllTypes all_types_message; + unittest::TestEmptyMessage empty_message; + string bizarro_data = GetBizarroData(); + ASSERT_TRUE(all_types_message.ParseFromString(bizarro_data)); + ASSERT_TRUE(empty_message.ParseFromString(bizarro_data)); + + // All fields should have been interpreted as unknown, so the debug strings + // should be the same. + EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString()); +} + +TEST_F(UnknownFieldSetTest, WrongTypeTreatedAsUnknownViaReflection) { + // Same as WrongTypeTreatedAsUnknown but via the reflection interface. + + unittest::TestAllTypes all_types_message; + unittest::TestEmptyMessage empty_message; + string bizarro_data = GetBizarroData(); + io::ArrayInputStream raw_input(bizarro_data.data(), bizarro_data.size()); + io::CodedInputStream input(&raw_input); + ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &all_types_message)); + ASSERT_TRUE(empty_message.ParseFromString(bizarro_data)); + + EXPECT_EQ(empty_message.DebugString(), all_types_message.DebugString()); +} + +TEST_F(UnknownFieldSetTest, UnknownExtensions) { + // Make sure fields are properly parsed to the UnknownFieldSet even when + // they are declared as extension numbers. + + unittest::TestEmptyMessageWithExtensions message; + ASSERT_TRUE(message.ParseFromString(all_fields_data_)); + + EXPECT_EQ(message.DebugString(), empty_message_.DebugString()); +} + +TEST_F(UnknownFieldSetTest, UnknownExtensionsReflection) { + // Same as UnknownExtensions except parsing via reflection. + + unittest::TestEmptyMessageWithExtensions message; + io::ArrayInputStream raw_input(all_fields_data_.data(), + all_fields_data_.size()); + io::CodedInputStream input(&raw_input); + ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &message)); + + EXPECT_EQ(message.DebugString(), empty_message_.DebugString()); +} + +TEST_F(UnknownFieldSetTest, WrongExtensionTypeTreatedAsUnknown) { + // Test that fields of the wrong wire type are treated like unknown fields + // when parsing extensions. + + unittest::TestAllExtensions all_extensions_message; + unittest::TestEmptyMessage empty_message; + string bizarro_data = GetBizarroData(); + ASSERT_TRUE(all_extensions_message.ParseFromString(bizarro_data)); + ASSERT_TRUE(empty_message.ParseFromString(bizarro_data)); + + // All fields should have been interpreted as unknown, so the debug strings + // should be the same. + EXPECT_EQ(empty_message.DebugString(), all_extensions_message.DebugString()); +} + +TEST_F(UnknownFieldSetTest, UnknownEnumValue) { + using unittest::TestAllTypes; + using unittest::TestAllExtensions; + using unittest::TestEmptyMessage; + + const FieldDescriptor* singular_field = + TestAllTypes::descriptor()->FindFieldByName("optional_nested_enum"); + const FieldDescriptor* repeated_field = + TestAllTypes::descriptor()->FindFieldByName("repeated_nested_enum"); + ASSERT_TRUE(singular_field != NULL); + ASSERT_TRUE(repeated_field != NULL); + + string data; + + { + TestEmptyMessage empty_message; + UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields(); + unknown_fields->AddVarint(singular_field->number(), TestAllTypes::BAR); + unknown_fields->AddVarint(singular_field->number(), 5); // not valid + unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::FOO); + unknown_fields->AddVarint(repeated_field->number(), 4); // not valid + unknown_fields->AddVarint(repeated_field->number(), TestAllTypes::BAZ); + unknown_fields->AddVarint(repeated_field->number(), 6); // not valid + empty_message.SerializeToString(&data); + } + + { + TestAllTypes message; + ASSERT_TRUE(message.ParseFromString(data)); + EXPECT_EQ(TestAllTypes::BAR, message.optional_nested_enum()); + ASSERT_EQ(2, message.repeated_nested_enum_size()); + EXPECT_EQ(TestAllTypes::FOO, message.repeated_nested_enum(0)); + EXPECT_EQ(TestAllTypes::BAZ, message.repeated_nested_enum(1)); + + const UnknownFieldSet& unknown_fields = message.unknown_fields(); + ASSERT_EQ(3, unknown_fields.field_count()); + + EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number()); + ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type()); + EXPECT_EQ(5, unknown_fields.field(0).varint()); + + EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number()); + ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type()); + EXPECT_EQ(4, unknown_fields.field(1).varint()); + + EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number()); + ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type()); + EXPECT_EQ(6, unknown_fields.field(2).varint()); + } + + { + using unittest::optional_nested_enum_extension; + using unittest::repeated_nested_enum_extension; + + TestAllExtensions message; + ASSERT_TRUE(message.ParseFromString(data)); + EXPECT_EQ(TestAllTypes::BAR, + message.GetExtension(optional_nested_enum_extension)); + ASSERT_EQ(2, message.ExtensionSize(repeated_nested_enum_extension)); + EXPECT_EQ(TestAllTypes::FOO, + message.GetExtension(repeated_nested_enum_extension, 0)); + EXPECT_EQ(TestAllTypes::BAZ, + message.GetExtension(repeated_nested_enum_extension, 1)); + + const UnknownFieldSet& unknown_fields = message.unknown_fields(); + ASSERT_EQ(3, unknown_fields.field_count()); + + EXPECT_EQ(singular_field->number(), unknown_fields.field(0).number()); + ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(0).type()); + EXPECT_EQ(5, unknown_fields.field(0).varint()); + + EXPECT_EQ(repeated_field->number(), unknown_fields.field(1).number()); + ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(1).type()); + EXPECT_EQ(4, unknown_fields.field(1).varint()); + + EXPECT_EQ(repeated_field->number(), unknown_fields.field(2).number()); + ASSERT_EQ(UnknownField::TYPE_VARINT, unknown_fields.field(2).type()); + EXPECT_EQ(6, unknown_fields.field(2).varint()); + } +} + +TEST_F(UnknownFieldSetTest, SpaceUsed) { + unittest::TestEmptyMessage empty_message; + + // Make sure an unknown field set has zero space used until a field is + // actually added. + int base_size = empty_message.SpaceUsed(); + UnknownFieldSet* unknown_fields = empty_message.mutable_unknown_fields(); + EXPECT_EQ(base_size, empty_message.SpaceUsed()); + + // Make sure each thing we add to the set increases the SpaceUsed(). + unknown_fields->AddVarint(1, 0); + EXPECT_LT(base_size, empty_message.SpaceUsed()); + base_size = empty_message.SpaceUsed(); + + string* str = unknown_fields->AddLengthDelimited(1); + EXPECT_LT(base_size, empty_message.SpaceUsed()); + base_size = empty_message.SpaceUsed(); + + str->assign(sizeof(string) + 1, 'x'); + EXPECT_LT(base_size, empty_message.SpaceUsed()); + base_size = empty_message.SpaceUsed(); + + UnknownFieldSet* group = unknown_fields->AddGroup(1); + EXPECT_LT(base_size, empty_message.SpaceUsed()); + base_size = empty_message.SpaceUsed(); + + group->AddVarint(1, 0); + EXPECT_LT(base_size, empty_message.SpaceUsed()); +} + +TEST_F(UnknownFieldSetTest, Empty) { + UnknownFieldSet unknown_fields; + EXPECT_TRUE(unknown_fields.empty()); + unknown_fields.AddVarint(6, 123); + EXPECT_FALSE(unknown_fields.empty()); + unknown_fields.Clear(); + EXPECT_TRUE(unknown_fields.empty()); +} + +} // namespace +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc new file mode 100644 index 000000000..831a57945 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc @@ -0,0 +1,1069 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace internal { + +using internal::WireFormatLite; + +namespace { + +// This function turns out to be convenient when using some macros later. +inline int GetEnumNumber(const EnumValueDescriptor* descriptor) { + return descriptor->number(); +} + +} // anonymous namespace + +// =================================================================== + +bool UnknownFieldSetFieldSkipper::SkipField( + io::CodedInputStream* input, uint32 tag) { + return WireFormat::SkipField(input, tag, unknown_fields_); +} + +bool UnknownFieldSetFieldSkipper::SkipMessage(io::CodedInputStream* input) { + return WireFormat::SkipMessage(input, unknown_fields_); +} + +void UnknownFieldSetFieldSkipper::SkipUnknownEnum( + int field_number, int value) { + unknown_fields_->AddVarint(field_number, value); +} + +bool WireFormat::SkipField(io::CodedInputStream* input, uint32 tag, + UnknownFieldSet* unknown_fields) { + int number = WireFormatLite::GetTagFieldNumber(tag); + + switch (WireFormatLite::GetTagWireType(tag)) { + case WireFormatLite::WIRETYPE_VARINT: { + uint64 value; + if (!input->ReadVarint64(&value)) return false; + if (unknown_fields != NULL) unknown_fields->AddVarint(number, value); + return true; + } + case WireFormatLite::WIRETYPE_FIXED64: { + uint64 value; + if (!input->ReadLittleEndian64(&value)) return false; + if (unknown_fields != NULL) unknown_fields->AddFixed64(number, value); + return true; + } + case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (unknown_fields == NULL) { + if (!input->Skip(length)) return false; + } else { + if (!input->ReadString(unknown_fields->AddLengthDelimited(number), + length)) { + return false; + } + } + return true; + } + case WireFormatLite::WIRETYPE_START_GROUP: { + if (!input->IncrementRecursionDepth()) return false; + if (!SkipMessage(input, (unknown_fields == NULL) ? + NULL : unknown_fields->AddGroup(number))) { + return false; + } + input->DecrementRecursionDepth(); + // Check that the ending tag matched the starting tag. + if (!input->LastTagWas(WireFormatLite::MakeTag( + WireFormatLite::GetTagFieldNumber(tag), + WireFormatLite::WIRETYPE_END_GROUP))) { + return false; + } + return true; + } + case WireFormatLite::WIRETYPE_END_GROUP: { + return false; + } + case WireFormatLite::WIRETYPE_FIXED32: { + uint32 value; + if (!input->ReadLittleEndian32(&value)) return false; + if (unknown_fields != NULL) unknown_fields->AddFixed32(number, value); + return true; + } + default: { + return false; + } + } +} + +bool WireFormat::SkipMessage(io::CodedInputStream* input, + UnknownFieldSet* unknown_fields) { + while(true) { + uint32 tag = input->ReadTag(); + if (tag == 0) { + // End of input. This is a valid place to end, so return true. + return true; + } + + WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); + + if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) { + // Must be the end of the message. + return true; + } + + if (!SkipField(input, tag, unknown_fields)) return false; + } +} + +void WireFormat::SerializeUnknownFields(const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + switch (field.type()) { + case UnknownField::TYPE_VARINT: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_VARINT)); + output->WriteVarint64(field.varint()); + break; + case UnknownField::TYPE_FIXED32: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED32)); + output->WriteLittleEndian32(field.fixed32()); + break; + case UnknownField::TYPE_FIXED64: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED64)); + output->WriteLittleEndian64(field.fixed64()); + break; + case UnknownField::TYPE_LENGTH_DELIMITED: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); + output->WriteVarint32(field.length_delimited().size()); + output->WriteString(field.length_delimited()); + break; + case UnknownField::TYPE_GROUP: + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_START_GROUP)); + SerializeUnknownFields(field.group(), output); + output->WriteVarint32(WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_END_GROUP)); + break; + } + } +} + +uint8* WireFormat::SerializeUnknownFieldsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + switch (field.type()) { + case UnknownField::TYPE_VARINT: + target = WireFormatLite::WriteInt64ToArray( + field.number(), field.varint(), target); + break; + case UnknownField::TYPE_FIXED32: + target = WireFormatLite::WriteFixed32ToArray( + field.number(), field.fixed32(), target); + break; + case UnknownField::TYPE_FIXED64: + target = WireFormatLite::WriteFixed64ToArray( + field.number(), field.fixed64(), target); + break; + case UnknownField::TYPE_LENGTH_DELIMITED: + target = WireFormatLite::WriteBytesToArray( + field.number(), field.length_delimited(), target); + break; + case UnknownField::TYPE_GROUP: + target = WireFormatLite::WriteTagToArray( + field.number(), WireFormatLite::WIRETYPE_START_GROUP, target); + target = SerializeUnknownFieldsToArray(field.group(), target); + target = WireFormatLite::WriteTagToArray( + field.number(), WireFormatLite::WIRETYPE_END_GROUP, target); + break; + } + } + return target; +} + +void WireFormat::SerializeUnknownMessageSetItems( + const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + // The only unknown fields that are allowed to exist in a MessageSet are + // messages, which are length-delimited. + if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { + const string& data = field.length_delimited(); + + // Start group. + output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag); + + // Write type ID. + output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag); + output->WriteVarint32(field.number()); + + // Write message. + output->WriteVarint32(WireFormatLite::kMessageSetMessageTag); + output->WriteVarint32(data.size()); + output->WriteString(data); + + // End group. + output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag); + } + } +} + +uint8* WireFormat::SerializeUnknownMessageSetItemsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target) { + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + // The only unknown fields that are allowed to exist in a MessageSet are + // messages, which are length-delimited. + if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { + const string& data = field.length_delimited(); + + // Start group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemStartTag, target); + + // Write type ID. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetTypeIdTag, target); + target = io::CodedOutputStream::WriteVarint32ToArray( + field.number(), target); + + // Write message. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetMessageTag, target); + target = io::CodedOutputStream::WriteVarint32ToArray(data.size(), target); + target = io::CodedOutputStream::WriteStringToArray(data, target); + + // End group. + target = io::CodedOutputStream::WriteTagToArray( + WireFormatLite::kMessageSetItemEndTag, target); + } + } + + return target; +} + +int WireFormat::ComputeUnknownFieldsSize( + const UnknownFieldSet& unknown_fields) { + int size = 0; + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + switch (field.type()) { + case UnknownField::TYPE_VARINT: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_VARINT)); + size += io::CodedOutputStream::VarintSize64(field.varint()); + break; + case UnknownField::TYPE_FIXED32: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED32)); + size += sizeof(int32); + break; + case UnknownField::TYPE_FIXED64: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_FIXED64)); + size += sizeof(int64); + break; + case UnknownField::TYPE_LENGTH_DELIMITED: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_LENGTH_DELIMITED)); + size += io::CodedOutputStream::VarintSize32( + field.length_delimited().size()); + size += field.length_delimited().size(); + break; + case UnknownField::TYPE_GROUP: + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_START_GROUP)); + size += ComputeUnknownFieldsSize(field.group()); + size += io::CodedOutputStream::VarintSize32( + WireFormatLite::MakeTag(field.number(), + WireFormatLite::WIRETYPE_END_GROUP)); + break; + } + } + + return size; +} + +int WireFormat::ComputeUnknownMessageSetItemsSize( + const UnknownFieldSet& unknown_fields) { + int size = 0; + for (int i = 0; i < unknown_fields.field_count(); i++) { + const UnknownField& field = unknown_fields.field(i); + + // The only unknown fields that are allowed to exist in a MessageSet are + // messages, which are length-delimited. + if (field.type() == UnknownField::TYPE_LENGTH_DELIMITED) { + size += WireFormatLite::kMessageSetItemTagsSize; + size += io::CodedOutputStream::VarintSize32(field.number()); + size += io::CodedOutputStream::VarintSize32( + field.length_delimited().size()); + size += field.length_delimited().size(); + } + } + + return size; +} + +// =================================================================== + +bool WireFormat::ParseAndMergePartial(io::CodedInputStream* input, + Message* message) { + const Descriptor* descriptor = message->GetDescriptor(); + const Reflection* message_reflection = message->GetReflection(); + + while(true) { + uint32 tag = input->ReadTag(); + if (tag == 0) { + // End of input. This is a valid place to end, so return true. + return true; + } + + if (WireFormatLite::GetTagWireType(tag) == + WireFormatLite::WIRETYPE_END_GROUP) { + // Must be the end of the message. + return true; + } + + const FieldDescriptor* field = NULL; + + if (descriptor != NULL) { + int field_number = WireFormatLite::GetTagFieldNumber(tag); + field = descriptor->FindFieldByNumber(field_number); + + // If that failed, check if the field is an extension. + if (field == NULL && descriptor->IsExtensionNumber(field_number)) { + if (input->GetExtensionPool() == NULL) { + field = message_reflection->FindKnownExtensionByNumber(field_number); + } else { + field = input->GetExtensionPool() + ->FindExtensionByNumber(descriptor, field_number); + } + } + + // If that failed, but we're a MessageSet, and this is the tag for a + // MessageSet item, then parse that. + if (field == NULL && + descriptor->options().message_set_wire_format() && + tag == WireFormatLite::kMessageSetItemStartTag) { + if (!ParseAndMergeMessageSetItem(input, message)) { + return false; + } + continue; // Skip ParseAndMergeField(); already taken care of. + } + } + + if (!ParseAndMergeField(tag, field, message, input)) { + return false; + } + } +} + +bool WireFormat::ParseAndMergeField( + uint32 tag, + const FieldDescriptor* field, // May be NULL for unknown + Message* message, + io::CodedInputStream* input) { + const Reflection* message_reflection = message->GetReflection(); + + enum { UNKNOWN, NORMAL_FORMAT, PACKED_FORMAT } value_format; + + if (field == NULL) { + value_format = UNKNOWN; + } else if (WireFormatLite::GetTagWireType(tag) == + WireTypeForFieldType(field->type())) { + value_format = NORMAL_FORMAT; + } else if (field->is_packable() && + WireFormatLite::GetTagWireType(tag) == + WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { + value_format = PACKED_FORMAT; + } else { + // We don't recognize this field. Either the field number is unknown + // or the wire type doesn't match. Put it in our unknown field set. + value_format = UNKNOWN; + } + + if (value_format == UNKNOWN) { + return SkipField(input, tag, + message_reflection->MutableUnknownFields(message)); + } else if (value_format == PACKED_FORMAT) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + io::CodedInputStream::Limit limit = input->PushLimit(length); + + switch (field->type()) { +#define HANDLE_PACKED_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + while (input->BytesUntilLimit() > 0) { \ + CPPTYPE value; \ + if (!WireFormatLite::ReadPrimitive< \ + CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)) \ + return false; \ + message_reflection->Add##CPPTYPE_METHOD(message, field, value); \ + } \ + break; \ + } + + HANDLE_PACKED_TYPE( INT32, int32, Int32) + HANDLE_PACKED_TYPE( INT64, int64, Int64) + HANDLE_PACKED_TYPE(SINT32, int32, Int32) + HANDLE_PACKED_TYPE(SINT64, int64, Int64) + HANDLE_PACKED_TYPE(UINT32, uint32, UInt32) + HANDLE_PACKED_TYPE(UINT64, uint64, UInt64) + + HANDLE_PACKED_TYPE( FIXED32, uint32, UInt32) + HANDLE_PACKED_TYPE( FIXED64, uint64, UInt64) + HANDLE_PACKED_TYPE(SFIXED32, int32, Int32) + HANDLE_PACKED_TYPE(SFIXED64, int64, Int64) + + HANDLE_PACKED_TYPE(FLOAT , float , Float ) + HANDLE_PACKED_TYPE(DOUBLE, double, Double) + + HANDLE_PACKED_TYPE(BOOL, bool, Bool) +#undef HANDLE_PACKED_TYPE + + case FieldDescriptor::TYPE_ENUM: { + while (input->BytesUntilLimit() > 0) { + int value; + if (!WireFormatLite::ReadPrimitive( + input, &value)) return false; + const EnumValueDescriptor* enum_value = + field->enum_type()->FindValueByNumber(value); + if (enum_value != NULL) { + message_reflection->AddEnum(message, field, enum_value); + } + } + + break; + } + + case FieldDescriptor::TYPE_STRING: + case FieldDescriptor::TYPE_GROUP: + case FieldDescriptor::TYPE_MESSAGE: + case FieldDescriptor::TYPE_BYTES: + // Can't have packed fields of these types: these should be caught by + // the protocol compiler. + return false; + break; + } + + input->PopLimit(limit); + } else { + // Non-packed value (value_format == NORMAL_FORMAT) + switch (field->type()) { +#define HANDLE_TYPE(TYPE, CPPTYPE, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + CPPTYPE value; \ + if (!WireFormatLite::ReadPrimitive< \ + CPPTYPE, WireFormatLite::TYPE_##TYPE>(input, &value)) \ + return false; \ + if (field->is_repeated()) { \ + message_reflection->Add##CPPTYPE_METHOD(message, field, value); \ + } else { \ + message_reflection->Set##CPPTYPE_METHOD(message, field, value); \ + } \ + break; \ + } + + HANDLE_TYPE( INT32, int32, Int32) + HANDLE_TYPE( INT64, int64, Int64) + HANDLE_TYPE(SINT32, int32, Int32) + HANDLE_TYPE(SINT64, int64, Int64) + HANDLE_TYPE(UINT32, uint32, UInt32) + HANDLE_TYPE(UINT64, uint64, UInt64) + + HANDLE_TYPE( FIXED32, uint32, UInt32) + HANDLE_TYPE( FIXED64, uint64, UInt64) + HANDLE_TYPE(SFIXED32, int32, Int32) + HANDLE_TYPE(SFIXED64, int64, Int64) + + HANDLE_TYPE(FLOAT , float , Float ) + HANDLE_TYPE(DOUBLE, double, Double) + + HANDLE_TYPE(BOOL, bool, Bool) +#undef HANDLE_TYPE + + case FieldDescriptor::TYPE_ENUM: { + int value; + if (!WireFormatLite::ReadPrimitive( + input, &value)) return false; + const EnumValueDescriptor* enum_value = + field->enum_type()->FindValueByNumber(value); + if (enum_value != NULL) { + if (field->is_repeated()) { + message_reflection->AddEnum(message, field, enum_value); + } else { + message_reflection->SetEnum(message, field, enum_value); + } + } else { + // The enum value is not one of the known values. Add it to the + // UnknownFieldSet. + int64 sign_extended_value = static_cast(value); + message_reflection->MutableUnknownFields(message) + ->AddVarint(WireFormatLite::GetTagFieldNumber(tag), + sign_extended_value); + } + break; + } + + // Handle strings separately so that we can optimize the ctype=CORD case. + case FieldDescriptor::TYPE_STRING: { + string value; + if (!WireFormatLite::ReadString(input, &value)) return false; + VerifyUTF8String(value.data(), value.length(), PARSE); + if (field->is_repeated()) { + message_reflection->AddString(message, field, value); + } else { + message_reflection->SetString(message, field, value); + } + break; + } + + case FieldDescriptor::TYPE_BYTES: { + string value; + if (!WireFormatLite::ReadBytes(input, &value)) return false; + if (field->is_repeated()) { + message_reflection->AddString(message, field, value); + } else { + message_reflection->SetString(message, field, value); + } + break; + } + + case FieldDescriptor::TYPE_GROUP: { + Message* sub_message; + if (field->is_repeated()) { + sub_message = message_reflection->AddMessage( + message, field, input->GetExtensionFactory()); + } else { + sub_message = message_reflection->MutableMessage( + message, field, input->GetExtensionFactory()); + } + + if (!WireFormatLite::ReadGroup(WireFormatLite::GetTagFieldNumber(tag), + input, sub_message)) + return false; + break; + } + + case FieldDescriptor::TYPE_MESSAGE: { + Message* sub_message; + if (field->is_repeated()) { + sub_message = message_reflection->AddMessage( + message, field, input->GetExtensionFactory()); + } else { + sub_message = message_reflection->MutableMessage( + message, field, input->GetExtensionFactory()); + } + + if (!WireFormatLite::ReadMessage(input, sub_message)) return false; + break; + } + } + } + + return true; +} + +bool WireFormat::ParseAndMergeMessageSetItem( + io::CodedInputStream* input, + Message* message) { + const Reflection* message_reflection = message->GetReflection(); + + // This method parses a group which should contain two fields: + // required int32 type_id = 2; + // required data message = 3; + + // Once we see a type_id, we'll construct a fake tag for this extension + // which is the tag it would have had under the proto2 extensions wire + // format. + uint32 fake_tag = 0; + + // Once we see a type_id, we'll look up the FieldDescriptor for the + // extension. + const FieldDescriptor* field = NULL; + + // If we see message data before the type_id, we'll append it to this so + // we can parse it later. This will probably never happen in practice, + // as no MessageSet encoder I know of writes the message before the type ID. + // But, it's technically valid so we should allow it. + // TODO(kenton): Use a Cord instead? Do I care? + string message_data; + + while (true) { + uint32 tag = input->ReadTag(); + if (tag == 0) return false; + + switch (tag) { + case WireFormatLite::kMessageSetTypeIdTag: { + uint32 type_id; + if (!input->ReadVarint32(&type_id)) return false; + fake_tag = WireFormatLite::MakeTag( + type_id, WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + field = message_reflection->FindKnownExtensionByNumber(type_id); + + if (!message_data.empty()) { + // We saw some message data before the type_id. Have to parse it + // now. + io::ArrayInputStream raw_input(message_data.data(), + message_data.size()); + io::CodedInputStream sub_input(&raw_input); + if (!ParseAndMergeField(fake_tag, field, message, + &sub_input)) { + return false; + } + message_data.clear(); + } + + break; + } + + case WireFormatLite::kMessageSetMessageTag: { + if (fake_tag == 0) { + // We haven't seen a type_id yet. Append this data to message_data. + string temp; + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->ReadString(&temp, length)) return false; + message_data.append(temp); + } else { + // Already saw type_id, so we can parse this directly. + if (!ParseAndMergeField(fake_tag, field, message, input)) { + return false; + } + } + + break; + } + + case WireFormatLite::kMessageSetItemEndTag: { + return true; + } + + default: { + if (!SkipField(input, tag, NULL)) return false; + } + } + } +} + +// =================================================================== + +void WireFormat::SerializeWithCachedSizes( + const Message& message, + int size, io::CodedOutputStream* output) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* message_reflection = message.GetReflection(); + int expected_endpoint = output->ByteCount() + size; + + vector fields; + message_reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + SerializeFieldWithCachedSizes(fields[i], message, output); + } + + if (descriptor->options().message_set_wire_format()) { + SerializeUnknownMessageSetItems( + message_reflection->GetUnknownFields(message), output); + } else { + SerializeUnknownFields( + message_reflection->GetUnknownFields(message), output); + } + + GOOGLE_CHECK_EQ(output->ByteCount(), expected_endpoint) + << ": Protocol message serialized to a size different from what was " + "originally expected. Perhaps it was modified by another thread " + "during serialization?"; +} + +void WireFormat::SerializeFieldWithCachedSizes( + const FieldDescriptor* field, + const Message& message, + io::CodedOutputStream* output) { + const Reflection* message_reflection = message.GetReflection(); + + if (field->is_extension() && + field->containing_type()->options().message_set_wire_format() && + field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && + !field->is_repeated()) { + SerializeMessageSetItemWithCachedSizes(field, message, output); + return; + } + + int count = 0; + + if (field->is_repeated()) { + count = message_reflection->FieldSize(message, field); + } else if (message_reflection->HasField(message, field)) { + count = 1; + } + + const bool is_packed = field->options().packed(); + if (is_packed && count > 0) { + WireFormatLite::WriteTag(field->number(), + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, output); + const int data_size = FieldDataOnlyByteSize(field, message); + output->WriteVarint32(data_size); + } + + for (int j = 0; j < count; j++) { + switch (field->type()) { +#define HANDLE_PRIMITIVE_TYPE(TYPE, CPPTYPE, TYPE_METHOD, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: { \ + const CPPTYPE value = field->is_repeated() ? \ + message_reflection->GetRepeated##CPPTYPE_METHOD( \ + message, field, j) : \ + message_reflection->Get##CPPTYPE_METHOD( \ + message, field); \ + if (is_packed) { \ + WireFormatLite::Write##TYPE_METHOD##NoTag(value, output); \ + } else { \ + WireFormatLite::Write##TYPE_METHOD(field->number(), value, output); \ + } \ + break; \ + } + + HANDLE_PRIMITIVE_TYPE( INT32, int32, Int32, Int32) + HANDLE_PRIMITIVE_TYPE( INT64, int64, Int64, Int64) + HANDLE_PRIMITIVE_TYPE(SINT32, int32, SInt32, Int32) + HANDLE_PRIMITIVE_TYPE(SINT64, int64, SInt64, Int64) + HANDLE_PRIMITIVE_TYPE(UINT32, uint32, UInt32, UInt32) + HANDLE_PRIMITIVE_TYPE(UINT64, uint64, UInt64, UInt64) + + HANDLE_PRIMITIVE_TYPE( FIXED32, uint32, Fixed32, UInt32) + HANDLE_PRIMITIVE_TYPE( FIXED64, uint64, Fixed64, UInt64) + HANDLE_PRIMITIVE_TYPE(SFIXED32, int32, SFixed32, Int32) + HANDLE_PRIMITIVE_TYPE(SFIXED64, int64, SFixed64, Int64) + + HANDLE_PRIMITIVE_TYPE(FLOAT , float , Float , Float ) + HANDLE_PRIMITIVE_TYPE(DOUBLE, double, Double, Double) + + HANDLE_PRIMITIVE_TYPE(BOOL, bool, Bool, Bool) +#undef HANDLE_PRIMITIVE_TYPE + +#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: \ + WireFormatLite::Write##TYPE_METHOD( \ + field->number(), \ + field->is_repeated() ? \ + message_reflection->GetRepeated##CPPTYPE_METHOD( \ + message, field, j) : \ + message_reflection->Get##CPPTYPE_METHOD(message, field), \ + output); \ + break; + + HANDLE_TYPE(GROUP , Group , Message) + HANDLE_TYPE(MESSAGE, Message, Message) +#undef HANDLE_TYPE + + case FieldDescriptor::TYPE_ENUM: { + const EnumValueDescriptor* value = field->is_repeated() ? + message_reflection->GetRepeatedEnum(message, field, j) : + message_reflection->GetEnum(message, field); + if (is_packed) { + WireFormatLite::WriteEnumNoTag(value->number(), output); + } else { + WireFormatLite::WriteEnum(field->number(), value->number(), output); + } + break; + } + + // Handle strings separately so that we can get string references + // instead of copying. + case FieldDescriptor::TYPE_STRING: { + string scratch; + const string& value = field->is_repeated() ? + message_reflection->GetRepeatedStringReference( + message, field, j, &scratch) : + message_reflection->GetStringReference(message, field, &scratch); + VerifyUTF8String(value.data(), value.length(), SERIALIZE); + WireFormatLite::WriteString(field->number(), value, output); + break; + } + + case FieldDescriptor::TYPE_BYTES: { + string scratch; + const string& value = field->is_repeated() ? + message_reflection->GetRepeatedStringReference( + message, field, j, &scratch) : + message_reflection->GetStringReference(message, field, &scratch); + WireFormatLite::WriteBytes(field->number(), value, output); + break; + } + } + } +} + +void WireFormat::SerializeMessageSetItemWithCachedSizes( + const FieldDescriptor* field, + const Message& message, + io::CodedOutputStream* output) { + const Reflection* message_reflection = message.GetReflection(); + + // Start group. + output->WriteVarint32(WireFormatLite::kMessageSetItemStartTag); + + // Write type ID. + output->WriteVarint32(WireFormatLite::kMessageSetTypeIdTag); + output->WriteVarint32(field->number()); + + // Write message. + output->WriteVarint32(WireFormatLite::kMessageSetMessageTag); + + const Message& sub_message = message_reflection->GetMessage(message, field); + output->WriteVarint32(sub_message.GetCachedSize()); + sub_message.SerializeWithCachedSizes(output); + + // End group. + output->WriteVarint32(WireFormatLite::kMessageSetItemEndTag); +} + +// =================================================================== + +int WireFormat::ByteSize(const Message& message) { + const Descriptor* descriptor = message.GetDescriptor(); + const Reflection* message_reflection = message.GetReflection(); + + int our_size = 0; + + vector fields; + message_reflection->ListFields(message, &fields); + for (int i = 0; i < fields.size(); i++) { + our_size += FieldByteSize(fields[i], message); + } + + if (descriptor->options().message_set_wire_format()) { + our_size += ComputeUnknownMessageSetItemsSize( + message_reflection->GetUnknownFields(message)); + } else { + our_size += ComputeUnknownFieldsSize( + message_reflection->GetUnknownFields(message)); + } + + return our_size; +} + +int WireFormat::FieldByteSize( + const FieldDescriptor* field, + const Message& message) { + const Reflection* message_reflection = message.GetReflection(); + + if (field->is_extension() && + field->containing_type()->options().message_set_wire_format() && + field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE && + !field->is_repeated()) { + return MessageSetItemByteSize(field, message); + } + + int count = 0; + if (field->is_repeated()) { + count = message_reflection->FieldSize(message, field); + } else if (message_reflection->HasField(message, field)) { + count = 1; + } + + const int data_size = FieldDataOnlyByteSize(field, message); + int our_size = data_size; + if (field->options().packed()) { + if (data_size > 0) { + // Packed fields get serialized like a string, not their native type. + // Technically this doesn't really matter; the size only changes if it's + // a GROUP + our_size += TagSize(field->number(), FieldDescriptor::TYPE_STRING); + our_size += io::CodedOutputStream::VarintSize32(data_size); + } + } else { + our_size += count * TagSize(field->number(), field->type()); + } + return our_size; +} + +int WireFormat::FieldDataOnlyByteSize( + const FieldDescriptor* field, + const Message& message) { + const Reflection* message_reflection = message.GetReflection(); + + int count = 0; + if (field->is_repeated()) { + count = message_reflection->FieldSize(message, field); + } else if (message_reflection->HasField(message, field)) { + count = 1; + } + + int data_size = 0; + switch (field->type()) { +#define HANDLE_TYPE(TYPE, TYPE_METHOD, CPPTYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: \ + if (field->is_repeated()) { \ + for (int j = 0; j < count; j++) { \ + data_size += WireFormatLite::TYPE_METHOD##Size( \ + message_reflection->GetRepeated##CPPTYPE_METHOD( \ + message, field, j)); \ + } \ + } else { \ + data_size += WireFormatLite::TYPE_METHOD##Size( \ + message_reflection->Get##CPPTYPE_METHOD(message, field)); \ + } \ + break; + +#define HANDLE_FIXED_TYPE(TYPE, TYPE_METHOD) \ + case FieldDescriptor::TYPE_##TYPE: \ + data_size += count * WireFormatLite::k##TYPE_METHOD##Size; \ + break; + + HANDLE_TYPE( INT32, Int32, Int32) + HANDLE_TYPE( INT64, Int64, Int64) + HANDLE_TYPE(SINT32, SInt32, Int32) + HANDLE_TYPE(SINT64, SInt64, Int64) + HANDLE_TYPE(UINT32, UInt32, UInt32) + HANDLE_TYPE(UINT64, UInt64, UInt64) + + HANDLE_FIXED_TYPE( FIXED32, Fixed32) + HANDLE_FIXED_TYPE( FIXED64, Fixed64) + HANDLE_FIXED_TYPE(SFIXED32, SFixed32) + HANDLE_FIXED_TYPE(SFIXED64, SFixed64) + + HANDLE_FIXED_TYPE(FLOAT , Float ) + HANDLE_FIXED_TYPE(DOUBLE, Double) + + HANDLE_FIXED_TYPE(BOOL, Bool) + + HANDLE_TYPE(GROUP , Group , Message) + HANDLE_TYPE(MESSAGE, Message, Message) +#undef HANDLE_TYPE +#undef HANDLE_FIXED_TYPE + + case FieldDescriptor::TYPE_ENUM: { + if (field->is_repeated()) { + for (int j = 0; j < count; j++) { + data_size += WireFormatLite::EnumSize( + message_reflection->GetRepeatedEnum(message, field, j)->number()); + } + } else { + data_size += WireFormatLite::EnumSize( + message_reflection->GetEnum(message, field)->number()); + } + break; + } + + // Handle strings separately so that we can get string references + // instead of copying. + case FieldDescriptor::TYPE_STRING: + case FieldDescriptor::TYPE_BYTES: { + for (int j = 0; j < count; j++) { + string scratch; + const string& value = field->is_repeated() ? + message_reflection->GetRepeatedStringReference( + message, field, j, &scratch) : + message_reflection->GetStringReference(message, field, &scratch); + data_size += WireFormatLite::StringSize(value); + } + break; + } + } + return data_size; +} + +int WireFormat::MessageSetItemByteSize( + const FieldDescriptor* field, + const Message& message) { + const Reflection* message_reflection = message.GetReflection(); + + int our_size = WireFormatLite::kMessageSetItemTagsSize; + + // type_id + our_size += io::CodedOutputStream::VarintSize32(field->number()); + + // message + const Message& sub_message = message_reflection->GetMessage(message, field); + int message_size = sub_message.ByteSize(); + + our_size += io::CodedOutputStream::VarintSize32(message_size); + our_size += message_size; + + return our_size; +} + +void WireFormat::VerifyUTF8StringFallback(const char* data, + int size, + Operation op) { + if (!IsStructurallyValidUTF8(data, size)) { + const char* operation_str = NULL; + switch (op) { + case PARSE: + operation_str = "parsing"; + break; + case SERIALIZE: + operation_str = "serializing"; + break; + // no default case: have the compiler warn if a case is not covered. + } + GOOGLE_LOG(ERROR) << "Encountered string containing invalid UTF-8 data while " + << operation_str + << " protocol buffer. Strings must contain only UTF-8; " + "use the 'bytes' type for raw bytes."; + } +} + + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h new file mode 100644 index 000000000..c75392508 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h @@ -0,0 +1,304 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// atenasio@google.com (Chris Atenasio) (ZigZag transform) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_H__ +#define GOOGLE_PROTOBUF_WIRE_FORMAT_H__ + +#include +#include +#include +#include +#include + +// Do UTF-8 validation on string type in Debug build only +#ifndef NDEBUG +#define GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED +#endif + +namespace google { +namespace protobuf { + namespace io { + class CodedInputStream; // coded_stream.h + class CodedOutputStream; // coded_stream.h + } + class UnknownFieldSet; // unknown_field_set.h +} + +namespace protobuf { +namespace internal { + +// This class is for internal use by the protocol buffer library and by +// protocol-complier-generated message classes. It must not be called +// directly by clients. +// +// This class contains code for implementing the binary protocol buffer +// wire format via reflection. The WireFormatLite class implements the +// non-reflection based routines. +// +// This class is really a namespace that contains only static methods +class LIBPROTOBUF_EXPORT WireFormat { + public: + + // Given a field return its WireType + static inline WireFormatLite::WireType WireTypeForField( + const FieldDescriptor* field); + + // Given a FieldSescriptor::Type return its WireType + static inline WireFormatLite::WireType WireTypeForFieldType( + FieldDescriptor::Type type); + + // Compute the byte size of a tag. For groups, this includes both the start + // and end tags. + static inline int TagSize(int field_number, FieldDescriptor::Type type); + + // These procedures can be used to implement the methods of Message which + // handle parsing and serialization of the protocol buffer wire format + // using only the Reflection interface. When you ask the protocol + // compiler to optimize for code size rather than speed, it will implement + // those methods in terms of these procedures. Of course, these are much + // slower than the specialized implementations which the protocol compiler + // generates when told to optimize for speed. + + // Read a message in protocol buffer wire format. + // + // This procedure reads either to the end of the input stream or through + // a WIRETYPE_END_GROUP tag ending the message, whichever comes first. + // It returns false if the input is invalid. + // + // Required fields are NOT checked by this method. You must call + // IsInitialized() on the resulting message yourself. + static bool ParseAndMergePartial(io::CodedInputStream* input, + Message* message); + + // Serialize a message in protocol buffer wire format. + // + // Any embedded messages within the message must have their correct sizes + // cached. However, the top-level message need not; its size is passed as + // a parameter to this procedure. + // + // These return false iff the underlying stream returns a write error. + static void SerializeWithCachedSizes( + const Message& message, + int size, io::CodedOutputStream* output); + + // Implements Message::ByteSize() via reflection. WARNING: The result + // of this method is *not* cached anywhere. However, all embedded messages + // will have their ByteSize() methods called, so their sizes will be cached. + // Therefore, calling this method is sufficient to allow you to call + // WireFormat::SerializeWithCachedSizes() on the same object. + static int ByteSize(const Message& message); + + // ----------------------------------------------------------------- + // Helpers for dealing with unknown fields + + // Skips a field value of the given WireType. The input should start + // positioned immediately after the tag. If unknown_fields is non-NULL, + // the contents of the field will be added to it. + static bool SkipField(io::CodedInputStream* input, uint32 tag, + UnknownFieldSet* unknown_fields); + + // Reads and ignores a message from the input. If unknown_fields is non-NULL, + // the contents will be added to it. + static bool SkipMessage(io::CodedInputStream* input, + UnknownFieldSet* unknown_fields); + + // Write the contents of an UnknownFieldSet to the output. + static void SerializeUnknownFields(const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output); + // Same as above, except writing directly to the provided buffer. + // Requires that the buffer have sufficient capacity for + // ComputeUnknownFieldsSize(unknown_fields). + // + // Returns a pointer past the last written byte. + static uint8* SerializeUnknownFieldsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target); + + // Same thing except for messages that have the message_set_wire_format + // option. + static void SerializeUnknownMessageSetItems( + const UnknownFieldSet& unknown_fields, + io::CodedOutputStream* output); + // Same as above, except writing directly to the provided buffer. + // Requires that the buffer have sufficient capacity for + // ComputeUnknownMessageSetItemsSize(unknown_fields). + // + // Returns a pointer past the last written byte. + static uint8* SerializeUnknownMessageSetItemsToArray( + const UnknownFieldSet& unknown_fields, + uint8* target); + + // Compute the size of the UnknownFieldSet on the wire. + static int ComputeUnknownFieldsSize(const UnknownFieldSet& unknown_fields); + + // Same thing except for messages that have the message_set_wire_format + // option. + static int ComputeUnknownMessageSetItemsSize( + const UnknownFieldSet& unknown_fields); + + + // Helper functions for encoding and decoding tags. (Inlined below and in + // _inl.h) + // + // This is different from MakeTag(field->number(), field->type()) in the case + // of packed repeated fields. + static uint32 MakeTag(const FieldDescriptor* field); + + // Parse a single field. The input should start out positioned immidately + // after the tag. + static bool ParseAndMergeField( + uint32 tag, + const FieldDescriptor* field, // May be NULL for unknown + Message* message, + io::CodedInputStream* input); + + // Serialize a single field. + static void SerializeFieldWithCachedSizes( + const FieldDescriptor* field, // Cannot be NULL + const Message& message, + io::CodedOutputStream* output); + + // Compute size of a single field. If the field is a message type, this + // will call ByteSize() for the embedded message, insuring that it caches + // its size. + static int FieldByteSize( + const FieldDescriptor* field, // Cannot be NULL + const Message& message); + + // Parse/serialize a MessageSet::Item group. Used with messages that use + // opion message_set_wire_format = true. + static bool ParseAndMergeMessageSetItem( + io::CodedInputStream* input, + Message* message); + static void SerializeMessageSetItemWithCachedSizes( + const FieldDescriptor* field, + const Message& message, + io::CodedOutputStream* output); + static int MessageSetItemByteSize( + const FieldDescriptor* field, + const Message& message); + + // Computes the byte size of a field, excluding tags. For packed fields, it + // only includes the size of the raw data, and not the size of the total + // length, but for other length-delimited types, the size of the length is + // included. + static int FieldDataOnlyByteSize( + const FieldDescriptor* field, // Cannot be NULL + const Message& message); + + enum Operation { + PARSE, + SERIALIZE, + }; + + // Verifies that a string field is valid UTF8, logging an error if not. + static void VerifyUTF8String(const char* data, int size, Operation op); + + private: + // Verifies that a string field is valid UTF8, logging an error if not. + static void VerifyUTF8StringFallback( + const char* data, + int size, + Operation op); + + + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormat); +}; + +// Subclass of FieldSkipper which saves skipped fields to an UnknownFieldSet. +class LIBPROTOBUF_EXPORT UnknownFieldSetFieldSkipper : public FieldSkipper { + public: + UnknownFieldSetFieldSkipper(UnknownFieldSet* unknown_fields) + : unknown_fields_(unknown_fields) {} + virtual ~UnknownFieldSetFieldSkipper() {} + + // implements FieldSkipper ----------------------------------------- + virtual bool SkipField(io::CodedInputStream* input, uint32 tag); + virtual bool SkipMessage(io::CodedInputStream* input); + virtual void SkipUnknownEnum(int field_number, int value); + + private: + UnknownFieldSet* unknown_fields_; +}; + +// inline methods ==================================================== + +inline WireFormatLite::WireType WireFormat::WireTypeForField( + const FieldDescriptor* field) { + if (field->options().packed()) { + return WireFormatLite::WIRETYPE_LENGTH_DELIMITED; + } else { + return WireTypeForFieldType(field->type()); + } +} + +inline WireFormatLite::WireType WireFormat::WireTypeForFieldType( + FieldDescriptor::Type type) { + // Some compilers don't like enum -> enum casts, so we implicit_cast to + // int first. + return WireFormatLite::WireTypeForFieldType( + static_cast( + implicit_cast(type))); +} + +inline uint32 WireFormat::MakeTag(const FieldDescriptor* field) { + return WireFormatLite::MakeTag(field->number(), WireTypeForField(field)); +} + +inline int WireFormat::TagSize(int field_number, FieldDescriptor::Type type) { + // Some compilers don't like enum -> enum casts, so we implicit_cast to + // int first. + return WireFormatLite::TagSize(field_number, + static_cast( + implicit_cast(type))); +} + +inline void WireFormat::VerifyUTF8String(const char* data, int size, + WireFormat::Operation op) { +#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED + WireFormat::VerifyUTF8StringFallback(data, size, op); +#endif +} + + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc new file mode 100644 index 000000000..d347d1169 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc @@ -0,0 +1,359 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { + +#ifndef _MSC_VER // MSVC doesn't like definitions of inline constants, GCC + // requires them. +const int WireFormatLite::kMessageSetItemStartTag; +const int WireFormatLite::kMessageSetItemEndTag; +const int WireFormatLite::kMessageSetTypeIdTag; +const int WireFormatLite::kMessageSetMessageTag; + +#endif + +const int WireFormatLite::kMessageSetItemTagsSize = + io::CodedOutputStream::VarintSize32(kMessageSetItemStartTag) + + io::CodedOutputStream::VarintSize32(kMessageSetItemEndTag) + + io::CodedOutputStream::VarintSize32(kMessageSetTypeIdTag) + + io::CodedOutputStream::VarintSize32(kMessageSetMessageTag); + +const WireFormatLite::CppType +WireFormatLite::kFieldTypeToCppTypeMap[MAX_FIELD_TYPE + 1] = { + static_cast(0), // 0 is reserved for errors + + CPPTYPE_DOUBLE, // TYPE_DOUBLE + CPPTYPE_FLOAT, // TYPE_FLOAT + CPPTYPE_INT64, // TYPE_INT64 + CPPTYPE_UINT64, // TYPE_UINT64 + CPPTYPE_INT32, // TYPE_INT32 + CPPTYPE_UINT64, // TYPE_FIXED64 + CPPTYPE_UINT32, // TYPE_FIXED32 + CPPTYPE_BOOL, // TYPE_BOOL + CPPTYPE_STRING, // TYPE_STRING + CPPTYPE_MESSAGE, // TYPE_GROUP + CPPTYPE_MESSAGE, // TYPE_MESSAGE + CPPTYPE_STRING, // TYPE_BYTES + CPPTYPE_UINT32, // TYPE_UINT32 + CPPTYPE_ENUM, // TYPE_ENUM + CPPTYPE_INT32, // TYPE_SFIXED32 + CPPTYPE_INT64, // TYPE_SFIXED64 + CPPTYPE_INT32, // TYPE_SINT32 + CPPTYPE_INT64, // TYPE_SINT64 +}; + +const WireFormatLite::WireType +WireFormatLite::kWireTypeForFieldType[MAX_FIELD_TYPE + 1] = { + static_cast(-1), // invalid + WireFormatLite::WIRETYPE_FIXED64, // TYPE_DOUBLE + WireFormatLite::WIRETYPE_FIXED32, // TYPE_FLOAT + WireFormatLite::WIRETYPE_VARINT, // TYPE_INT64 + WireFormatLite::WIRETYPE_VARINT, // TYPE_UINT64 + WireFormatLite::WIRETYPE_VARINT, // TYPE_INT32 + WireFormatLite::WIRETYPE_FIXED64, // TYPE_FIXED64 + WireFormatLite::WIRETYPE_FIXED32, // TYPE_FIXED32 + WireFormatLite::WIRETYPE_VARINT, // TYPE_BOOL + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, // TYPE_STRING + WireFormatLite::WIRETYPE_START_GROUP, // TYPE_GROUP + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, // TYPE_MESSAGE + WireFormatLite::WIRETYPE_LENGTH_DELIMITED, // TYPE_BYTES + WireFormatLite::WIRETYPE_VARINT, // TYPE_UINT32 + WireFormatLite::WIRETYPE_VARINT, // TYPE_ENUM + WireFormatLite::WIRETYPE_FIXED32, // TYPE_SFIXED32 + WireFormatLite::WIRETYPE_FIXED64, // TYPE_SFIXED64 + WireFormatLite::WIRETYPE_VARINT, // TYPE_SINT32 + WireFormatLite::WIRETYPE_VARINT, // TYPE_SINT64 +}; + +bool WireFormatLite::SkipField( + io::CodedInputStream* input, uint32 tag) { + switch (WireFormatLite::GetTagWireType(tag)) { + case WireFormatLite::WIRETYPE_VARINT: { + uint64 value; + if (!input->ReadVarint64(&value)) return false; + return true; + } + case WireFormatLite::WIRETYPE_FIXED64: { + uint64 value; + if (!input->ReadLittleEndian64(&value)) return false; + return true; + } + case WireFormatLite::WIRETYPE_LENGTH_DELIMITED: { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->Skip(length)) return false; + return true; + } + case WireFormatLite::WIRETYPE_START_GROUP: { + if (!input->IncrementRecursionDepth()) return false; + if (!SkipMessage(input)) return false; + input->DecrementRecursionDepth(); + // Check that the ending tag matched the starting tag. + if (!input->LastTagWas(WireFormatLite::MakeTag( + WireFormatLite::GetTagFieldNumber(tag), + WireFormatLite::WIRETYPE_END_GROUP))) { + return false; + } + return true; + } + case WireFormatLite::WIRETYPE_END_GROUP: { + return false; + } + case WireFormatLite::WIRETYPE_FIXED32: { + uint32 value; + if (!input->ReadLittleEndian32(&value)) return false; + return true; + } + default: { + return false; + } + } +} + +bool WireFormatLite::SkipMessage(io::CodedInputStream* input) { + while(true) { + uint32 tag = input->ReadTag(); + if (tag == 0) { + // End of input. This is a valid place to end, so return true. + return true; + } + + WireFormatLite::WireType wire_type = WireFormatLite::GetTagWireType(tag); + + if (wire_type == WireFormatLite::WIRETYPE_END_GROUP) { + // Must be the end of the message. + return true; + } + + if (!SkipField(input, tag)) return false; + } +} + +bool FieldSkipper::SkipField( + io::CodedInputStream* input, uint32 tag) { + return WireFormatLite::SkipField(input, tag); +} + +bool FieldSkipper::SkipMessage(io::CodedInputStream* input) { + return WireFormatLite::SkipMessage(input); +} + +void FieldSkipper::SkipUnknownEnum( + int field_number, int value) { + // Nothing. +} + +bool WireFormatLite::ReadPackedEnumNoInline(io::CodedInputStream* input, + bool (*is_valid)(int), + RepeatedField* values) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + io::CodedInputStream::Limit limit = input->PushLimit(length); + while (input->BytesUntilLimit() > 0) { + int value; + if (!google::protobuf::internal::WireFormatLite::ReadPrimitive< + int, WireFormatLite::TYPE_ENUM>(input, &value)) { + return false; + } + if (is_valid(value)) { + values->Add(value); + } + } + input->PopLimit(limit); + return true; +} + +void WireFormatLite::WriteInt32(int field_number, int32 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteInt32NoTag(value, output); +} +void WireFormatLite::WriteInt64(int field_number, int64 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteInt64NoTag(value, output); +} +void WireFormatLite::WriteUInt32(int field_number, uint32 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteUInt32NoTag(value, output); +} +void WireFormatLite::WriteUInt64(int field_number, uint64 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteUInt64NoTag(value, output); +} +void WireFormatLite::WriteSInt32(int field_number, int32 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteSInt32NoTag(value, output); +} +void WireFormatLite::WriteSInt64(int field_number, int64 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteSInt64NoTag(value, output); +} +void WireFormatLite::WriteFixed32(int field_number, uint32 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_FIXED32, output); + WriteFixed32NoTag(value, output); +} +void WireFormatLite::WriteFixed64(int field_number, uint64 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_FIXED64, output); + WriteFixed64NoTag(value, output); +} +void WireFormatLite::WriteSFixed32(int field_number, int32 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_FIXED32, output); + WriteSFixed32NoTag(value, output); +} +void WireFormatLite::WriteSFixed64(int field_number, int64 value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_FIXED64, output); + WriteSFixed64NoTag(value, output); +} +void WireFormatLite::WriteFloat(int field_number, float value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_FIXED32, output); + WriteFloatNoTag(value, output); +} +void WireFormatLite::WriteDouble(int field_number, double value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_FIXED64, output); + WriteDoubleNoTag(value, output); +} +void WireFormatLite::WriteBool(int field_number, bool value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteBoolNoTag(value, output); +} +void WireFormatLite::WriteEnum(int field_number, int value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_VARINT, output); + WriteEnumNoTag(value, output); +} + +void WireFormatLite::WriteString(int field_number, const string& value, + io::CodedOutputStream* output) { + // String is for UTF-8 text only + WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(value.size()); + output->WriteString(value); +} +void WireFormatLite::WriteBytes(int field_number, const string& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32(value.size()); + output->WriteString(value); +} + + +void WireFormatLite::WriteGroup(int field_number, + const MessageLite& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_START_GROUP, output); + value.SerializeWithCachedSizes(output); + WriteTag(field_number, WIRETYPE_END_GROUP, output); +} + +void WireFormatLite::WriteMessage(int field_number, + const MessageLite& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + const int size = value.GetCachedSize(); + output->WriteVarint32(size); + value.SerializeWithCachedSizes(output); +} + +void WireFormatLite::WriteGroupMaybeToArray(int field_number, + const MessageLite& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_START_GROUP, output); + const int size = value.GetCachedSize(); + uint8* target = output->GetDirectBufferForNBytesAndAdvance(size); + if (target != NULL) { + uint8* end = value.SerializeWithCachedSizesToArray(target); + GOOGLE_DCHECK_EQ(end - target, size); + } else { + value.SerializeWithCachedSizes(output); + } + WriteTag(field_number, WIRETYPE_END_GROUP, output); +} + +void WireFormatLite::WriteMessageMaybeToArray(int field_number, + const MessageLite& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + const int size = value.GetCachedSize(); + output->WriteVarint32(size); + uint8* target = output->GetDirectBufferForNBytesAndAdvance(size); + if (target != NULL) { + uint8* end = value.SerializeWithCachedSizesToArray(target); + GOOGLE_DCHECK_EQ(end - target, size); + } else { + value.SerializeWithCachedSizes(output); + } +} + +bool WireFormatLite::ReadString(io::CodedInputStream* input, + string* value) { + // String is for UTF-8 text only + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->InternalReadStringInline(value, length)) return false; + return true; +} +bool WireFormatLite::ReadBytes(io::CodedInputStream* input, + string* value) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + return input->InternalReadStringInline(value, length); +} + +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h new file mode 100644 index 000000000..e3d5b2d8d --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h @@ -0,0 +1,620 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// atenasio@google.com (Chris Atenasio) (ZigZag transform) +// wink@google.com (Wink Saville) (refactored from wire_format.h) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. +// +// This header is logically internal, but is made public because it is used +// from protocol-compiler-generated code, which may reside in other components. + +#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ +#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ + +#include +#include + +namespace google { + +namespace protobuf { + template class RepeatedField; // repeated_field.h + namespace io { + class CodedInputStream; // coded_stream.h + class CodedOutputStream; // coded_stream.h + } +} + +namespace protobuf { +namespace internal { + +class StringPieceField; + +// This class is for internal use by the protocol buffer library and by +// protocol-complier-generated message classes. It must not be called +// directly by clients. +// +// This class contains helpers for implementing the binary protocol buffer +// wire format without the need for reflection. Use WireFormat when using +// reflection. +// +// This class is really a namespace that contains only static methods. +class LIBPROTOBUF_EXPORT WireFormatLite { + public: + + // ----------------------------------------------------------------- + // Helper constants and functions related to the format. These are + // mostly meant for internal and generated code to use. + + // The wire format is composed of a sequence of tag/value pairs, each + // of which contains the value of one field (or one element of a repeated + // field). Each tag is encoded as a varint. The lower bits of the tag + // identify its wire type, which specifies the format of the data to follow. + // The rest of the bits contain the field number. Each type of field (as + // declared by FieldDescriptor::Type, in descriptor.h) maps to one of + // these wire types. Immediately following each tag is the field's value, + // encoded in the format specified by the wire type. Because the tag + // identifies the encoding of this data, it is possible to skip + // unrecognized fields for forwards compatibility. + + enum WireType { + WIRETYPE_VARINT = 0, + WIRETYPE_FIXED64 = 1, + WIRETYPE_LENGTH_DELIMITED = 2, + WIRETYPE_START_GROUP = 3, + WIRETYPE_END_GROUP = 4, + WIRETYPE_FIXED32 = 5, + }; + + // Lite alternative to FieldDescriptor::Type. Must be kept in sync. + enum FieldType { + TYPE_DOUBLE = 1, + TYPE_FLOAT = 2, + TYPE_INT64 = 3, + TYPE_UINT64 = 4, + TYPE_INT32 = 5, + TYPE_FIXED64 = 6, + TYPE_FIXED32 = 7, + TYPE_BOOL = 8, + TYPE_STRING = 9, + TYPE_GROUP = 10, + TYPE_MESSAGE = 11, + TYPE_BYTES = 12, + TYPE_UINT32 = 13, + TYPE_ENUM = 14, + TYPE_SFIXED32 = 15, + TYPE_SFIXED64 = 16, + TYPE_SINT32 = 17, + TYPE_SINT64 = 18, + MAX_FIELD_TYPE = 18, + }; + + // Lite alternative to FieldDescriptor::CppType. Must be kept in sync. + enum CppType { + CPPTYPE_INT32 = 1, + CPPTYPE_INT64 = 2, + CPPTYPE_UINT32 = 3, + CPPTYPE_UINT64 = 4, + CPPTYPE_DOUBLE = 5, + CPPTYPE_FLOAT = 6, + CPPTYPE_BOOL = 7, + CPPTYPE_ENUM = 8, + CPPTYPE_STRING = 9, + CPPTYPE_MESSAGE = 10, + MAX_CPPTYPE = 10, + }; + + // Helper method to get the CppType for a particular Type. + static CppType FieldTypeToCppType(FieldType type); + + // Given a FieldSescriptor::Type return its WireType + static inline WireFormatLite::WireType WireTypeForFieldType( + WireFormatLite::FieldType type) { + return kWireTypeForFieldType[type]; + } + + // Number of bits in a tag which identify the wire type. + static const int kTagTypeBits = 3; + // Mask for those bits. + static const uint32 kTagTypeMask = (1 << kTagTypeBits) - 1; + + // Helper functions for encoding and decoding tags. (Inlined below and in + // _inl.h) + // + // This is different from MakeTag(field->number(), field->type()) in the case + // of packed repeated fields. + static uint32 MakeTag(int field_number, WireType type); + static WireType GetTagWireType(uint32 tag); + static int GetTagFieldNumber(uint32 tag); + + // Compute the byte size of a tag. For groups, this includes both the start + // and end tags. + static inline int TagSize(int field_number, WireFormatLite::FieldType type); + + // Skips a field value with the given tag. The input should start + // positioned immediately after the tag. Skipped values are simply discarded, + // not recorded anywhere. See WireFormat::SkipField() for a version that + // records to an UnknownFieldSet. + static bool SkipField(io::CodedInputStream* input, uint32 tag); + + // Reads and ignores a message from the input. Skipped values are simply + // discarded, not recorded anywhere. See WireFormat::SkipMessage() for a + // version that records to an UnknownFieldSet. + static bool SkipMessage(io::CodedInputStream* input); + +// This macro does the same thing as WireFormatLite::MakeTag(), but the +// result is usable as a compile-time constant, which makes it usable +// as a switch case or a template input. WireFormatLite::MakeTag() is more +// type-safe, though, so prefer it if possible. +#define GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(FIELD_NUMBER, TYPE) \ + static_cast( \ + ((FIELD_NUMBER) << ::google::protobuf::internal::WireFormatLite::kTagTypeBits) \ + | (TYPE)) + + // These are the tags for the old MessageSet format, which was defined as: + // message MessageSet { + // repeated group Item = 1 { + // required int32 type_id = 2; + // required string message = 3; + // } + // } + static const int kMessageSetItemNumber = 1; + static const int kMessageSetTypeIdNumber = 2; + static const int kMessageSetMessageNumber = 3; + static const int kMessageSetItemStartTag = + GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber, + WireFormatLite::WIRETYPE_START_GROUP); + static const int kMessageSetItemEndTag = + GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetItemNumber, + WireFormatLite::WIRETYPE_END_GROUP); + static const int kMessageSetTypeIdTag = + GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetTypeIdNumber, + WireFormatLite::WIRETYPE_VARINT); + static const int kMessageSetMessageTag = + GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(kMessageSetMessageNumber, + WireFormatLite::WIRETYPE_LENGTH_DELIMITED); + + // Byte size of all tags of a MessageSet::Item combined. + static const int kMessageSetItemTagsSize; + + // Helper functions for converting between floats/doubles and IEEE-754 + // uint32s/uint64s so that they can be written. (Assumes your platform + // uses IEEE-754 floats.) + static uint32 EncodeFloat(float value); + static float DecodeFloat(uint32 value); + static uint64 EncodeDouble(double value); + static double DecodeDouble(uint64 value); + + // Helper functions for mapping signed integers to unsigned integers in + // such a way that numbers with small magnitudes will encode to smaller + // varints. If you simply static_cast a negative number to an unsigned + // number and varint-encode it, it will always take 10 bytes, defeating + // the purpose of varint. So, for the "sint32" and "sint64" field types, + // we ZigZag-encode the values. + static uint32 ZigZagEncode32(int32 n); + static int32 ZigZagDecode32(uint32 n); + static uint64 ZigZagEncode64(int64 n); + static int64 ZigZagDecode64(uint64 n); + + // ================================================================= + // Methods for reading/writing individual field. The implementations + // of these methods are defined in wire_format_lite_inl.h; you must #include + // that file to use these. + +// Avoid ugly line wrapping +#define input io::CodedInputStream* input +#define output io::CodedOutputStream* output +#define field_number int field_number +#define INL GOOGLE_ATTRIBUTE_ALWAYS_INLINE + + // Read fields, not including tags. The assumption is that you already + // read the tag to determine what field to read. + + // For primitive fields, we just use a templatized routine parameterized by + // the represented type and the FieldType. These are specialized with the + // appropriate definition for each declared type. + template + static inline bool ReadPrimitive(input, CType* value) INL; + + // Reads repeated primitive values, with optimizations for repeats. + // tag_size and tag should both be compile-time constants provided by the + // protocol compiler. + template + static inline bool ReadRepeatedPrimitive(int tag_size, + uint32 tag, + input, + RepeatedField* value) INL; + + // Identical to ReadRepeatedPrimitive, except will not inline the + // implementation. + template + static bool ReadRepeatedPrimitiveNoInline(int tag_size, + uint32 tag, + input, + RepeatedField* value); + + // Reads a primitive value directly from the provided buffer. It returns a + // pointer past the segment of data that was read. + // + // This is only implemented for the types with fixed wire size, e.g. + // float, double, and the (s)fixed* types. + template + static inline const uint8* ReadPrimitiveFromArray(const uint8* buffer, + CType* value) INL; + + // Reads a primitive packed field. + // + // This is only implemented for packable types. + template + static inline bool ReadPackedPrimitive(input, + RepeatedField* value) INL; + + // Identical to ReadPackedPrimitive, except will not inline the + // implementation. + template + static bool ReadPackedPrimitiveNoInline(input, RepeatedField* value); + + // Read a packed enum field. Values for which is_valid() returns false are + // dropped. + static bool ReadPackedEnumNoInline(input, + bool (*is_valid)(int), + RepeatedField* value); + + static bool ReadString(input, string* value); + static bool ReadBytes (input, string* value); + + static inline bool ReadGroup (field_number, input, MessageLite* value); + static inline bool ReadMessage(input, MessageLite* value); + + // Like above, but de-virtualize the call to MergePartialFromCodedStream(). + // The pointer must point at an instance of MessageType, *not* a subclass (or + // the subclass must not override MergePartialFromCodedStream()). + template + static inline bool ReadGroupNoVirtual(field_number, input, + MessageType* value); + template + static inline bool ReadMessageNoVirtual(input, MessageType* value); + + // Write a tag. The Write*() functions typically include the tag, so + // normally there's no need to call this unless using the Write*NoTag() + // variants. + static inline void WriteTag(field_number, WireType type, output) INL; + + // Write fields, without tags. + static inline void WriteInt32NoTag (int32 value, output) INL; + static inline void WriteInt64NoTag (int64 value, output) INL; + static inline void WriteUInt32NoTag (uint32 value, output) INL; + static inline void WriteUInt64NoTag (uint64 value, output) INL; + static inline void WriteSInt32NoTag (int32 value, output) INL; + static inline void WriteSInt64NoTag (int64 value, output) INL; + static inline void WriteFixed32NoTag (uint32 value, output) INL; + static inline void WriteFixed64NoTag (uint64 value, output) INL; + static inline void WriteSFixed32NoTag(int32 value, output) INL; + static inline void WriteSFixed64NoTag(int64 value, output) INL; + static inline void WriteFloatNoTag (float value, output) INL; + static inline void WriteDoubleNoTag (double value, output) INL; + static inline void WriteBoolNoTag (bool value, output) INL; + static inline void WriteEnumNoTag (int value, output) INL; + + // Write fields, including tags. + static void WriteInt32 (field_number, int32 value, output); + static void WriteInt64 (field_number, int64 value, output); + static void WriteUInt32 (field_number, uint32 value, output); + static void WriteUInt64 (field_number, uint64 value, output); + static void WriteSInt32 (field_number, int32 value, output); + static void WriteSInt64 (field_number, int64 value, output); + static void WriteFixed32 (field_number, uint32 value, output); + static void WriteFixed64 (field_number, uint64 value, output); + static void WriteSFixed32(field_number, int32 value, output); + static void WriteSFixed64(field_number, int64 value, output); + static void WriteFloat (field_number, float value, output); + static void WriteDouble (field_number, double value, output); + static void WriteBool (field_number, bool value, output); + static void WriteEnum (field_number, int value, output); + + static void WriteString(field_number, const string& value, output); + static void WriteBytes (field_number, const string& value, output); + + static void WriteGroup( + field_number, const MessageLite& value, output); + static void WriteMessage( + field_number, const MessageLite& value, output); + // Like above, but these will check if the output stream has enough + // space to write directly to a flat array. + static void WriteGroupMaybeToArray( + field_number, const MessageLite& value, output); + static void WriteMessageMaybeToArray( + field_number, const MessageLite& value, output); + + // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The + // pointer must point at an instance of MessageType, *not* a subclass (or + // the subclass must not override SerializeWithCachedSizes()). + template + static inline void WriteGroupNoVirtual( + field_number, const MessageType& value, output); + template + static inline void WriteMessageNoVirtual( + field_number, const MessageType& value, output); + +#undef output +#define output uint8* target + + // Like above, but use only *ToArray methods of CodedOutputStream. + static inline uint8* WriteTagToArray(field_number, WireType type, output) INL; + + // Write fields, without tags. + static inline uint8* WriteInt32NoTagToArray (int32 value, output) INL; + static inline uint8* WriteInt64NoTagToArray (int64 value, output) INL; + static inline uint8* WriteUInt32NoTagToArray (uint32 value, output) INL; + static inline uint8* WriteUInt64NoTagToArray (uint64 value, output) INL; + static inline uint8* WriteSInt32NoTagToArray (int32 value, output) INL; + static inline uint8* WriteSInt64NoTagToArray (int64 value, output) INL; + static inline uint8* WriteFixed32NoTagToArray (uint32 value, output) INL; + static inline uint8* WriteFixed64NoTagToArray (uint64 value, output) INL; + static inline uint8* WriteSFixed32NoTagToArray(int32 value, output) INL; + static inline uint8* WriteSFixed64NoTagToArray(int64 value, output) INL; + static inline uint8* WriteFloatNoTagToArray (float value, output) INL; + static inline uint8* WriteDoubleNoTagToArray (double value, output) INL; + static inline uint8* WriteBoolNoTagToArray (bool value, output) INL; + static inline uint8* WriteEnumNoTagToArray (int value, output) INL; + + // Write fields, including tags. + static inline uint8* WriteInt32ToArray( + field_number, int32 value, output) INL; + static inline uint8* WriteInt64ToArray( + field_number, int64 value, output) INL; + static inline uint8* WriteUInt32ToArray( + field_number, uint32 value, output) INL; + static inline uint8* WriteUInt64ToArray( + field_number, uint64 value, output) INL; + static inline uint8* WriteSInt32ToArray( + field_number, int32 value, output) INL; + static inline uint8* WriteSInt64ToArray( + field_number, int64 value, output) INL; + static inline uint8* WriteFixed32ToArray( + field_number, uint32 value, output) INL; + static inline uint8* WriteFixed64ToArray( + field_number, uint64 value, output) INL; + static inline uint8* WriteSFixed32ToArray( + field_number, int32 value, output) INL; + static inline uint8* WriteSFixed64ToArray( + field_number, int64 value, output) INL; + static inline uint8* WriteFloatToArray( + field_number, float value, output) INL; + static inline uint8* WriteDoubleToArray( + field_number, double value, output) INL; + static inline uint8* WriteBoolToArray( + field_number, bool value, output) INL; + static inline uint8* WriteEnumToArray( + field_number, int value, output) INL; + + static inline uint8* WriteStringToArray( + field_number, const string& value, output) INL; + static inline uint8* WriteBytesToArray( + field_number, const string& value, output) INL; + + static inline uint8* WriteGroupToArray( + field_number, const MessageLite& value, output) INL; + static inline uint8* WriteMessageToArray( + field_number, const MessageLite& value, output) INL; + + // Like above, but de-virtualize the call to SerializeWithCachedSizes(). The + // pointer must point at an instance of MessageType, *not* a subclass (or + // the subclass must not override SerializeWithCachedSizes()). + template + static inline uint8* WriteGroupNoVirtualToArray( + field_number, const MessageType& value, output) INL; + template + static inline uint8* WriteMessageNoVirtualToArray( + field_number, const MessageType& value, output) INL; + +#undef output +#undef input +#undef INL + +#undef field_number + + // Compute the byte size of a field. The XxSize() functions do NOT include + // the tag, so you must also call TagSize(). (This is because, for repeated + // fields, you should only call TagSize() once and multiply it by the element + // count, but you may have to call XxSize() for each individual element.) + static inline int Int32Size ( int32 value); + static inline int Int64Size ( int64 value); + static inline int UInt32Size (uint32 value); + static inline int UInt64Size (uint64 value); + static inline int SInt32Size ( int32 value); + static inline int SInt64Size ( int64 value); + static inline int EnumSize ( int value); + + // These types always have the same size. + static const int kFixed32Size = 4; + static const int kFixed64Size = 8; + static const int kSFixed32Size = 4; + static const int kSFixed64Size = 8; + static const int kFloatSize = 4; + static const int kDoubleSize = 8; + static const int kBoolSize = 1; + + static inline int StringSize(const string& value); + static inline int BytesSize (const string& value); + + static inline int GroupSize (const MessageLite& value); + static inline int MessageSize(const MessageLite& value); + + // Like above, but de-virtualize the call to ByteSize(). The + // pointer must point at an instance of MessageType, *not* a subclass (or + // the subclass must not override ByteSize()). + template + static inline int GroupSizeNoVirtual (const MessageType& value); + template + static inline int MessageSizeNoVirtual(const MessageType& value); + + private: + // A helper method for the repeated primitive reader. This method has + // optimizations for primitive types that have fixed size on the wire, and + // can be read using potentially faster paths. + template + static inline bool ReadRepeatedFixedSizePrimitive( + int tag_size, + uint32 tag, + google::protobuf::io::CodedInputStream* input, + RepeatedField* value) GOOGLE_ATTRIBUTE_ALWAYS_INLINE; + + static const CppType kFieldTypeToCppTypeMap[]; + static const WireFormatLite::WireType kWireTypeForFieldType[]; + + GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(WireFormatLite); +}; + +// A class which deals with unknown values. The default implementation just +// discards them. WireFormat defines a subclass which writes to an +// UnknownFieldSet. This class is used by ExtensionSet::ParseField(), since +// ExtensionSet is part of the lite library but UnknownFieldSet is not. +class LIBPROTOBUF_EXPORT FieldSkipper { + public: + FieldSkipper() {} + virtual ~FieldSkipper() {} + + // Skip a field whose tag has already been consumed. + virtual bool SkipField(io::CodedInputStream* input, uint32 tag); + + // Skip an entire message or group, up to an end-group tag (which is consumed) + // or end-of-stream. + virtual bool SkipMessage(io::CodedInputStream* input); + + // Deal with an already-parsed unrecognized enum value. The default + // implementation does nothing, but the UnknownFieldSet-based implementation + // saves it as an unknown varint. + virtual void SkipUnknownEnum(int field_number, int value); +}; + +// inline methods ==================================================== + +inline WireFormatLite::CppType +WireFormatLite::FieldTypeToCppType(FieldType type) { + return kFieldTypeToCppTypeMap[type]; +} + +inline uint32 WireFormatLite::MakeTag(int field_number, WireType type) { + return GOOGLE_PROTOBUF_WIRE_FORMAT_MAKE_TAG(field_number, type); +} + +inline WireFormatLite::WireType WireFormatLite::GetTagWireType(uint32 tag) { + return static_cast(tag & kTagTypeMask); +} + +inline int WireFormatLite::GetTagFieldNumber(uint32 tag) { + return static_cast(tag >> kTagTypeBits); +} + +inline int WireFormatLite::TagSize(int field_number, + WireFormatLite::FieldType type) { + int result = io::CodedOutputStream::VarintSize32( + field_number << kTagTypeBits); + if (type == TYPE_GROUP) { + // Groups have both a start and an end tag. + return result * 2; + } else { + return result; + } +} + +inline uint32 WireFormatLite::EncodeFloat(float value) { + union {float f; uint32 i;}; + f = value; + return i; +} + +inline float WireFormatLite::DecodeFloat(uint32 value) { + union {float f; uint32 i;}; + i = value; + return f; +} + +inline uint64 WireFormatLite::EncodeDouble(double value) { + union {double f; uint64 i;}; + f = value; + return i; +} + +inline double WireFormatLite::DecodeDouble(uint64 value) { + union {double f; uint64 i;}; + i = value; + return f; +} + +// ZigZag Transform: Encodes signed integers so that they can be +// effectively used with varint encoding. +// +// varint operates on unsigned integers, encoding smaller numbers into +// fewer bytes. If you try to use it on a signed integer, it will treat +// this number as a very large unsigned integer, which means that even +// small signed numbers like -1 will take the maximum number of bytes +// (10) to encode. ZigZagEncode() maps signed integers to unsigned +// in such a way that those with a small absolute value will have smaller +// encoded values, making them appropriate for encoding using varint. +// +// int32 -> uint32 +// ------------------------- +// 0 -> 0 +// -1 -> 1 +// 1 -> 2 +// -2 -> 3 +// ... -> ... +// 2147483647 -> 4294967294 +// -2147483648 -> 4294967295 +// +// >> encode >> +// << decode << + +inline uint32 WireFormatLite::ZigZagEncode32(int32 n) { + // Note: the right-shift must be arithmetic + return (n << 1) ^ (n >> 31); +} + +inline int32 WireFormatLite::ZigZagDecode32(uint32 n) { + return (n >> 1) ^ -static_cast(n & 1); +} + +inline uint64 WireFormatLite::ZigZagEncode64(int64 n) { + // Note: the right-shift must be arithmetic + return (n << 1) ^ (n >> 63); +} + +inline int64 WireFormatLite::ZigZagDecode64(uint64 n) { + return (n >> 1) ^ -static_cast(n & 1); +} + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h new file mode 100644 index 000000000..103b0bd0c --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h @@ -0,0 +1,774 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// wink@google.com (Wink Saville) (refactored from wire_format.h) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#ifndef GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__ +#define GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__ + +#include +#include +#include +#include +#include +#include +#include + + +namespace google { +namespace protobuf { +namespace internal { + +// Implementation details of ReadPrimitive. + +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + int32* value) { + uint32 temp; + if (!input->ReadVarint32(&temp)) return false; + *value = static_cast(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + int64* value) { + uint64 temp; + if (!input->ReadVarint64(&temp)) return false; + *value = static_cast(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + uint32* value) { + return input->ReadVarint32(value); +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + uint64* value) { + return input->ReadVarint64(value); +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + int32* value) { + uint32 temp; + if (!input->ReadVarint32(&temp)) return false; + *value = ZigZagDecode32(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + int64* value) { + uint64 temp; + if (!input->ReadVarint64(&temp)) return false; + *value = ZigZagDecode64(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + uint32* value) { + return input->ReadLittleEndian32(value); +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + uint64* value) { + return input->ReadLittleEndian64(value); +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + int32* value) { + uint32 temp; + if (!input->ReadLittleEndian32(&temp)) return false; + *value = static_cast(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + int64* value) { + uint64 temp; + if (!input->ReadLittleEndian64(&temp)) return false; + *value = static_cast(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + float* value) { + uint32 temp; + if (!input->ReadLittleEndian32(&temp)) return false; + *value = DecodeFloat(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + double* value) { + uint64 temp; + if (!input->ReadLittleEndian64(&temp)) return false; + *value = DecodeDouble(temp); + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + bool* value) { + uint32 temp; + if (!input->ReadVarint32(&temp)) return false; + *value = temp != 0; + return true; +} +template <> +inline bool WireFormatLite::ReadPrimitive( + io::CodedInputStream* input, + int* value) { + uint32 temp; + if (!input->ReadVarint32(&temp)) return false; + *value = static_cast(temp); + return true; +} + +template <> +inline const uint8* WireFormatLite::ReadPrimitiveFromArray< + uint32, WireFormatLite::TYPE_FIXED32>( + const uint8* buffer, + uint32* value) { + return io::CodedInputStream::ReadLittleEndian32FromArray(buffer, value); +} +template <> +inline const uint8* WireFormatLite::ReadPrimitiveFromArray< + uint64, WireFormatLite::TYPE_FIXED64>( + const uint8* buffer, + uint64* value) { + return io::CodedInputStream::ReadLittleEndian64FromArray(buffer, value); +} +template <> +inline const uint8* WireFormatLite::ReadPrimitiveFromArray< + int32, WireFormatLite::TYPE_SFIXED32>( + const uint8* buffer, + int32* value) { + uint32 temp; + buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp); + *value = static_cast(temp); + return buffer; +} +template <> +inline const uint8* WireFormatLite::ReadPrimitiveFromArray< + int64, WireFormatLite::TYPE_SFIXED64>( + const uint8* buffer, + int64* value) { + uint64 temp; + buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp); + *value = static_cast(temp); + return buffer; +} +template <> +inline const uint8* WireFormatLite::ReadPrimitiveFromArray< + float, WireFormatLite::TYPE_FLOAT>( + const uint8* buffer, + float* value) { + uint32 temp; + buffer = io::CodedInputStream::ReadLittleEndian32FromArray(buffer, &temp); + *value = DecodeFloat(temp); + return buffer; +} +template <> +inline const uint8* WireFormatLite::ReadPrimitiveFromArray< + double, WireFormatLite::TYPE_DOUBLE>( + const uint8* buffer, + double* value) { + uint64 temp; + buffer = io::CodedInputStream::ReadLittleEndian64FromArray(buffer, &temp); + *value = DecodeDouble(temp); + return buffer; +} + +template +inline bool WireFormatLite::ReadRepeatedPrimitive(int, // tag_size, unused. + uint32 tag, + io::CodedInputStream* input, + RepeatedField* values) { + CType value; + if (!ReadPrimitive(input, &value)) return false; + values->Add(value); + int elements_already_reserved = values->Capacity() - values->size(); + while (elements_already_reserved > 0 && input->ExpectTag(tag)) { + if (!ReadPrimitive(input, &value)) return false; + values->AddAlreadyReserved(value); + elements_already_reserved--; + } + return true; +} + +template +inline bool WireFormatLite::ReadRepeatedFixedSizePrimitive( + int tag_size, + uint32 tag, + io::CodedInputStream* input, + RepeatedField* values) { + GOOGLE_DCHECK_EQ(UInt32Size(tag), tag_size); + CType value; + if (!ReadPrimitive(input, &value)) + return false; + values->Add(value); + + // For fixed size values, repeated values can be read more quickly by + // reading directly from a raw array. + // + // We can get a tight loop by only reading as many elements as can be + // added to the RepeatedField without having to do any resizing. Additionally, + // we only try to read as many elements as are available from the current + // buffer space. Doing so avoids having to perform boundary checks when + // reading the value: the maximum number of elements that can be read is + // known outside of the loop. + const void* void_pointer; + int size; + input->GetDirectBufferPointerInline(&void_pointer, &size); + if (size > 0) { + const uint8* buffer = reinterpret_cast(void_pointer); + // The number of bytes each type occupies on the wire. + const int per_value_size = tag_size + sizeof(value); + + int elements_available = min(values->Capacity() - values->size(), + size / per_value_size); + int num_read = 0; + while (num_read < elements_available && + (buffer = io::CodedInputStream::ExpectTagFromArray( + buffer, tag)) != NULL) { + buffer = ReadPrimitiveFromArray(buffer, &value); + values->AddAlreadyReserved(value); + ++num_read; + } + const int read_bytes = num_read * per_value_size; + if (read_bytes > 0) { + input->Skip(read_bytes); + } + } + return true; +} + +// Specializations of ReadRepeatedPrimitive for the fixed size types, which use +// the optimized code path. +#define READ_REPEATED_FIXED_SIZE_PRIMITIVE(CPPTYPE, DECLARED_TYPE) \ +template <> \ +inline bool WireFormatLite::ReadRepeatedPrimitive< \ + CPPTYPE, WireFormatLite::DECLARED_TYPE>( \ + int tag_size, \ + uint32 tag, \ + io::CodedInputStream* input, \ + RepeatedField* values) { \ + return ReadRepeatedFixedSizePrimitive< \ + CPPTYPE, WireFormatLite::DECLARED_TYPE>( \ + tag_size, tag, input, values); \ +} + +READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint32, TYPE_FIXED32); +READ_REPEATED_FIXED_SIZE_PRIMITIVE(uint64, TYPE_FIXED64); +READ_REPEATED_FIXED_SIZE_PRIMITIVE(int32, TYPE_SFIXED32); +READ_REPEATED_FIXED_SIZE_PRIMITIVE(int64, TYPE_SFIXED64); +READ_REPEATED_FIXED_SIZE_PRIMITIVE(float, TYPE_FLOAT); +READ_REPEATED_FIXED_SIZE_PRIMITIVE(double, TYPE_DOUBLE); + +#undef READ_REPEATED_FIXED_SIZE_PRIMITIVE + +template +bool WireFormatLite::ReadRepeatedPrimitiveNoInline( + int tag_size, + uint32 tag, + io::CodedInputStream* input, + RepeatedField* value) { + return ReadRepeatedPrimitive( + tag_size, tag, input, value); +} + +template +inline bool WireFormatLite::ReadPackedPrimitive(io::CodedInputStream* input, + RepeatedField* values) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + io::CodedInputStream::Limit limit = input->PushLimit(length); + while (input->BytesUntilLimit() > 0) { + CType value; + if (!ReadPrimitive(input, &value)) return false; + values->Add(value); + } + input->PopLimit(limit); + return true; +} + +template +bool WireFormatLite::ReadPackedPrimitiveNoInline(io::CodedInputStream* input, + RepeatedField* values) { + return ReadPackedPrimitive(input, values); +} + + +inline bool WireFormatLite::ReadGroup(int field_number, + io::CodedInputStream* input, + MessageLite* value) { + if (!input->IncrementRecursionDepth()) return false; + if (!value->MergePartialFromCodedStream(input)) return false; + input->DecrementRecursionDepth(); + // Make sure the last thing read was an end tag for this group. + if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) { + return false; + } + return true; +} +inline bool WireFormatLite::ReadMessage(io::CodedInputStream* input, + MessageLite* value) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->IncrementRecursionDepth()) return false; + io::CodedInputStream::Limit limit = input->PushLimit(length); + if (!value->MergePartialFromCodedStream(input)) return false; + // Make sure that parsing stopped when the limit was hit, not at an endgroup + // tag. + if (!input->ConsumedEntireMessage()) return false; + input->PopLimit(limit); + input->DecrementRecursionDepth(); + return true; +} + +// We name the template parameter something long and extremely unlikely to occur +// elsewhere because a *qualified* member access expression designed to avoid +// virtual dispatch, C++03 [basic.lookup.classref] 3.4.5/4 requires that the +// name of the qualifying class to be looked up both in the context of the full +// expression (finding the template parameter) and in the context of the object +// whose member we are accessing. This could potentially find a nested type +// within that object. The standard goes on to require these names to refer to +// the same entity, which this collision would violate. The lack of a safe way +// to avoid this collision appears to be a defect in the standard, but until it +// is corrected, we choose the name to avoid accidental collisions. +template +inline bool WireFormatLite::ReadGroupNoVirtual( + int field_number, io::CodedInputStream* input, + MessageType_WorkAroundCppLookupDefect* value) { + if (!input->IncrementRecursionDepth()) return false; + if (!value-> + MessageType_WorkAroundCppLookupDefect::MergePartialFromCodedStream(input)) + return false; + input->DecrementRecursionDepth(); + // Make sure the last thing read was an end tag for this group. + if (!input->LastTagWas(MakeTag(field_number, WIRETYPE_END_GROUP))) { + return false; + } + return true; +} +template +inline bool WireFormatLite::ReadMessageNoVirtual( + io::CodedInputStream* input, MessageType_WorkAroundCppLookupDefect* value) { + uint32 length; + if (!input->ReadVarint32(&length)) return false; + if (!input->IncrementRecursionDepth()) return false; + io::CodedInputStream::Limit limit = input->PushLimit(length); + if (!value-> + MessageType_WorkAroundCppLookupDefect::MergePartialFromCodedStream(input)) + return false; + // Make sure that parsing stopped when the limit was hit, not at an endgroup + // tag. + if (!input->ConsumedEntireMessage()) return false; + input->PopLimit(limit); + input->DecrementRecursionDepth(); + return true; +} + +// =================================================================== + +inline void WireFormatLite::WriteTag(int field_number, WireType type, + io::CodedOutputStream* output) { + output->WriteTag(MakeTag(field_number, type)); +} + +inline void WireFormatLite::WriteInt32NoTag(int32 value, + io::CodedOutputStream* output) { + output->WriteVarint32SignExtended(value); +} +inline void WireFormatLite::WriteInt64NoTag(int64 value, + io::CodedOutputStream* output) { + output->WriteVarint64(static_cast(value)); +} +inline void WireFormatLite::WriteUInt32NoTag(uint32 value, + io::CodedOutputStream* output) { + output->WriteVarint32(value); +} +inline void WireFormatLite::WriteUInt64NoTag(uint64 value, + io::CodedOutputStream* output) { + output->WriteVarint64(value); +} +inline void WireFormatLite::WriteSInt32NoTag(int32 value, + io::CodedOutputStream* output) { + output->WriteVarint32(ZigZagEncode32(value)); +} +inline void WireFormatLite::WriteSInt64NoTag(int64 value, + io::CodedOutputStream* output) { + output->WriteVarint64(ZigZagEncode64(value)); +} +inline void WireFormatLite::WriteFixed32NoTag(uint32 value, + io::CodedOutputStream* output) { + output->WriteLittleEndian32(value); +} +inline void WireFormatLite::WriteFixed64NoTag(uint64 value, + io::CodedOutputStream* output) { + output->WriteLittleEndian64(value); +} +inline void WireFormatLite::WriteSFixed32NoTag(int32 value, + io::CodedOutputStream* output) { + output->WriteLittleEndian32(static_cast(value)); +} +inline void WireFormatLite::WriteSFixed64NoTag(int64 value, + io::CodedOutputStream* output) { + output->WriteLittleEndian64(static_cast(value)); +} +inline void WireFormatLite::WriteFloatNoTag(float value, + io::CodedOutputStream* output) { + output->WriteLittleEndian32(EncodeFloat(value)); +} +inline void WireFormatLite::WriteDoubleNoTag(double value, + io::CodedOutputStream* output) { + output->WriteLittleEndian64(EncodeDouble(value)); +} +inline void WireFormatLite::WriteBoolNoTag(bool value, + io::CodedOutputStream* output) { + output->WriteVarint32(value ? 1 : 0); +} +inline void WireFormatLite::WriteEnumNoTag(int value, + io::CodedOutputStream* output) { + output->WriteVarint32SignExtended(value); +} + +// See comment on ReadGroupNoVirtual to understand the need for this template +// parameter name. +template +inline void WireFormatLite::WriteGroupNoVirtual( + int field_number, const MessageType_WorkAroundCppLookupDefect& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_START_GROUP, output); + value.MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizes(output); + WriteTag(field_number, WIRETYPE_END_GROUP, output); +} +template +inline void WireFormatLite::WriteMessageNoVirtual( + int field_number, const MessageType_WorkAroundCppLookupDefect& value, + io::CodedOutputStream* output) { + WriteTag(field_number, WIRETYPE_LENGTH_DELIMITED, output); + output->WriteVarint32( + value.MessageType_WorkAroundCppLookupDefect::GetCachedSize()); + value.MessageType_WorkAroundCppLookupDefect::SerializeWithCachedSizes(output); +} + +// =================================================================== + +inline uint8* WireFormatLite::WriteTagToArray(int field_number, + WireType type, + uint8* target) { + return io::CodedOutputStream::WriteTagToArray(MakeTag(field_number, type), + target); +} + +inline uint8* WireFormatLite::WriteInt32NoTagToArray(int32 value, + uint8* target) { + return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target); +} +inline uint8* WireFormatLite::WriteInt64NoTagToArray(int64 value, + uint8* target) { + return io::CodedOutputStream::WriteVarint64ToArray( + static_cast(value), target); +} +inline uint8* WireFormatLite::WriteUInt32NoTagToArray(uint32 value, + uint8* target) { + return io::CodedOutputStream::WriteVarint32ToArray(value, target); +} +inline uint8* WireFormatLite::WriteUInt64NoTagToArray(uint64 value, + uint8* target) { + return io::CodedOutputStream::WriteVarint64ToArray(value, target); +} +inline uint8* WireFormatLite::WriteSInt32NoTagToArray(int32 value, + uint8* target) { + return io::CodedOutputStream::WriteVarint32ToArray(ZigZagEncode32(value), + target); +} +inline uint8* WireFormatLite::WriteSInt64NoTagToArray(int64 value, + uint8* target) { + return io::CodedOutputStream::WriteVarint64ToArray(ZigZagEncode64(value), + target); +} +inline uint8* WireFormatLite::WriteFixed32NoTagToArray(uint32 value, + uint8* target) { + return io::CodedOutputStream::WriteLittleEndian32ToArray(value, target); +} +inline uint8* WireFormatLite::WriteFixed64NoTagToArray(uint64 value, + uint8* target) { + return io::CodedOutputStream::WriteLittleEndian64ToArray(value, target); +} +inline uint8* WireFormatLite::WriteSFixed32NoTagToArray(int32 value, + uint8* target) { + return io::CodedOutputStream::WriteLittleEndian32ToArray( + static_cast(value), target); +} +inline uint8* WireFormatLite::WriteSFixed64NoTagToArray(int64 value, + uint8* target) { + return io::CodedOutputStream::WriteLittleEndian64ToArray( + static_cast(value), target); +} +inline uint8* WireFormatLite::WriteFloatNoTagToArray(float value, + uint8* target) { + return io::CodedOutputStream::WriteLittleEndian32ToArray(EncodeFloat(value), + target); +} +inline uint8* WireFormatLite::WriteDoubleNoTagToArray(double value, + uint8* target) { + return io::CodedOutputStream::WriteLittleEndian64ToArray(EncodeDouble(value), + target); +} +inline uint8* WireFormatLite::WriteBoolNoTagToArray(bool value, + uint8* target) { + return io::CodedOutputStream::WriteVarint32ToArray(value ? 1 : 0, target); +} +inline uint8* WireFormatLite::WriteEnumNoTagToArray(int value, + uint8* target) { + return io::CodedOutputStream::WriteVarint32SignExtendedToArray(value, target); +} + +inline uint8* WireFormatLite::WriteInt32ToArray(int field_number, + int32 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteInt32NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteInt64ToArray(int field_number, + int64 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteInt64NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteUInt32ToArray(int field_number, + uint32 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteUInt32NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteUInt64ToArray(int field_number, + uint64 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteUInt64NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteSInt32ToArray(int field_number, + int32 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteSInt32NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteSInt64ToArray(int field_number, + int64 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteSInt64NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteFixed32ToArray(int field_number, + uint32 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target); + return WriteFixed32NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteFixed64ToArray(int field_number, + uint64 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target); + return WriteFixed64NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteSFixed32ToArray(int field_number, + int32 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target); + return WriteSFixed32NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteSFixed64ToArray(int field_number, + int64 value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target); + return WriteSFixed64NoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteFloatToArray(int field_number, + float value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_FIXED32, target); + return WriteFloatNoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteDoubleToArray(int field_number, + double value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_FIXED64, target); + return WriteDoubleNoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteBoolToArray(int field_number, + bool value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteBoolNoTagToArray(value, target); +} +inline uint8* WireFormatLite::WriteEnumToArray(int field_number, + int value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_VARINT, target); + return WriteEnumNoTagToArray(value, target); +} + +inline uint8* WireFormatLite::WriteStringToArray(int field_number, + const string& value, + uint8* target) { + // String is for UTF-8 text only + // WARNING: In wire_format.cc, both strings and bytes are handled by + // WriteString() to avoid code duplication. If the implementations become + // different, you will need to update that usage. + target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target); + target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target); + return io::CodedOutputStream::WriteStringToArray(value, target); +} +inline uint8* WireFormatLite::WriteBytesToArray(int field_number, + const string& value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target); + target = io::CodedOutputStream::WriteVarint32ToArray(value.size(), target); + return io::CodedOutputStream::WriteStringToArray(value, target); +} + + +inline uint8* WireFormatLite::WriteGroupToArray(int field_number, + const MessageLite& value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target); + target = value.SerializeWithCachedSizesToArray(target); + return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target); +} +inline uint8* WireFormatLite::WriteMessageToArray(int field_number, + const MessageLite& value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target); + target = io::CodedOutputStream::WriteVarint32ToArray( + value.GetCachedSize(), target); + return value.SerializeWithCachedSizesToArray(target); +} + +// See comment on ReadGroupNoVirtual to understand the need for this template +// parameter name. +template +inline uint8* WireFormatLite::WriteGroupNoVirtualToArray( + int field_number, const MessageType_WorkAroundCppLookupDefect& value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_START_GROUP, target); + target = value.MessageType_WorkAroundCppLookupDefect + ::SerializeWithCachedSizesToArray(target); + return WriteTagToArray(field_number, WIRETYPE_END_GROUP, target); +} +template +inline uint8* WireFormatLite::WriteMessageNoVirtualToArray( + int field_number, const MessageType_WorkAroundCppLookupDefect& value, + uint8* target) { + target = WriteTagToArray(field_number, WIRETYPE_LENGTH_DELIMITED, target); + target = io::CodedOutputStream::WriteVarint32ToArray( + value.MessageType_WorkAroundCppLookupDefect::GetCachedSize(), target); + return value.MessageType_WorkAroundCppLookupDefect + ::SerializeWithCachedSizesToArray(target); +} + +// =================================================================== + +inline int WireFormatLite::Int32Size(int32 value) { + return io::CodedOutputStream::VarintSize32SignExtended(value); +} +inline int WireFormatLite::Int64Size(int64 value) { + return io::CodedOutputStream::VarintSize64(static_cast(value)); +} +inline int WireFormatLite::UInt32Size(uint32 value) { + return io::CodedOutputStream::VarintSize32(value); +} +inline int WireFormatLite::UInt64Size(uint64 value) { + return io::CodedOutputStream::VarintSize64(value); +} +inline int WireFormatLite::SInt32Size(int32 value) { + return io::CodedOutputStream::VarintSize32(ZigZagEncode32(value)); +} +inline int WireFormatLite::SInt64Size(int64 value) { + return io::CodedOutputStream::VarintSize64(ZigZagEncode64(value)); +} +inline int WireFormatLite::EnumSize(int value) { + return io::CodedOutputStream::VarintSize32SignExtended(value); +} + +inline int WireFormatLite::StringSize(const string& value) { + return io::CodedOutputStream::VarintSize32(value.size()) + + value.size(); +} +inline int WireFormatLite::BytesSize(const string& value) { + return io::CodedOutputStream::VarintSize32(value.size()) + + value.size(); +} + + +inline int WireFormatLite::GroupSize(const MessageLite& value) { + return value.ByteSize(); +} +inline int WireFormatLite::MessageSize(const MessageLite& value) { + int size = value.ByteSize(); + return io::CodedOutputStream::VarintSize32(size) + size; +} + +// See comment on ReadGroupNoVirtual to understand the need for this template +// parameter name. +template +inline int WireFormatLite::GroupSizeNoVirtual( + const MessageType_WorkAroundCppLookupDefect& value) { + return value.MessageType_WorkAroundCppLookupDefect::ByteSize(); +} +template +inline int WireFormatLite::MessageSizeNoVirtual( + const MessageType_WorkAroundCppLookupDefect& value) { + int size = value.MessageType_WorkAroundCppLookupDefect::ByteSize(); + return io::CodedOutputStream::VarintSize32(size) + size; +} + +} // namespace internal +} // namespace protobuf + +} // namespace google +#endif // GOOGLE_PROTOBUF_WIRE_FORMAT_LITE_INL_H__ diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc new file mode 100644 index 000000000..867970c49 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc @@ -0,0 +1,905 @@ +// Protocol Buffers - Google's data interchange format +// Copyright 2008 Google Inc. All rights reserved. +// http://code.google.com/p/protobuf/ +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Author: kenton@google.com (Kenton Varda) +// Based on original Protocol Buffers design by +// Sanjay Ghemawat, Jeff Dean, and others. + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +namespace google { +namespace protobuf { +namespace internal { +namespace { + +TEST(WireFormatTest, EnumsInSync) { + // Verify that WireFormatLite::FieldType and WireFormatLite::CppType match + // FieldDescriptor::Type and FieldDescriptor::CppType. + + EXPECT_EQ(implicit_cast(FieldDescriptor::MAX_TYPE), + implicit_cast(WireFormatLite::MAX_FIELD_TYPE)); + EXPECT_EQ(implicit_cast(FieldDescriptor::MAX_CPPTYPE), + implicit_cast(WireFormatLite::MAX_CPPTYPE)); + + for (int i = 1; i <= WireFormatLite::MAX_FIELD_TYPE; i++) { + EXPECT_EQ( + implicit_cast(FieldDescriptor::TypeToCppType( + static_cast(i))), + implicit_cast(WireFormatLite::FieldTypeToCppType( + static_cast(i)))); + } +} + +TEST(WireFormatTest, MaxFieldNumber) { + // Make sure the max field number constant is accurate. + EXPECT_EQ((1 << (32 - WireFormatLite::kTagTypeBits)) - 1, + FieldDescriptor::kMaxNumber); +} + +TEST(WireFormatTest, Parse) { + unittest::TestAllTypes source, dest; + string data; + + // Serialize using the generated code. + TestUtil::SetAllFields(&source); + source.SerializeToString(&data); + + // Parse using WireFormat. + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + WireFormat::ParseAndMergePartial(&input, &dest); + + // Check. + TestUtil::ExpectAllFieldsSet(dest); +} + +TEST(WireFormatTest, ParseExtensions) { + unittest::TestAllExtensions source, dest; + string data; + + // Serialize using the generated code. + TestUtil::SetAllExtensions(&source); + source.SerializeToString(&data); + + // Parse using WireFormat. + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + WireFormat::ParseAndMergePartial(&input, &dest); + + // Check. + TestUtil::ExpectAllExtensionsSet(dest); +} + +TEST(WireFormatTest, ParsePacked) { + unittest::TestPackedTypes source, dest; + string data; + + // Serialize using the generated code. + TestUtil::SetPackedFields(&source); + source.SerializeToString(&data); + + // Parse using WireFormat. + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + WireFormat::ParseAndMergePartial(&input, &dest); + + // Check. + TestUtil::ExpectPackedFieldsSet(dest); +} + +TEST(WireFormatTest, ParsePackedFromUnpacked) { + // Serialize using the generated code. + unittest::TestUnpackedTypes source; + TestUtil::SetUnpackedFields(&source); + string data = source.SerializeAsString(); + + // Parse using WireFormat. + unittest::TestPackedTypes dest; + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + WireFormat::ParseAndMergePartial(&input, &dest); + + // Check. + TestUtil::ExpectPackedFieldsSet(dest); +} + +TEST(WireFormatTest, ParseUnpackedFromPacked) { + // Serialize using the generated code. + unittest::TestPackedTypes source; + TestUtil::SetPackedFields(&source); + string data = source.SerializeAsString(); + + // Parse using WireFormat. + unittest::TestUnpackedTypes dest; + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + WireFormat::ParseAndMergePartial(&input, &dest); + + // Check. + TestUtil::ExpectUnpackedFieldsSet(dest); +} + +TEST(WireFormatTest, ParsePackedExtensions) { + unittest::TestPackedExtensions source, dest; + string data; + + // Serialize using the generated code. + TestUtil::SetPackedExtensions(&source); + source.SerializeToString(&data); + + // Parse using WireFormat. + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + WireFormat::ParseAndMergePartial(&input, &dest); + + // Check. + TestUtil::ExpectPackedExtensionsSet(dest); +} + +TEST(WireFormatTest, ByteSize) { + unittest::TestAllTypes message; + TestUtil::SetAllFields(&message); + + EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); + message.Clear(); + EXPECT_EQ(0, message.ByteSize()); + EXPECT_EQ(0, WireFormat::ByteSize(message)); +} + +TEST(WireFormatTest, ByteSizeExtensions) { + unittest::TestAllExtensions message; + TestUtil::SetAllExtensions(&message); + + EXPECT_EQ(message.ByteSize(), + WireFormat::ByteSize(message)); + message.Clear(); + EXPECT_EQ(0, message.ByteSize()); + EXPECT_EQ(0, WireFormat::ByteSize(message)); +} + +TEST(WireFormatTest, ByteSizePacked) { + unittest::TestPackedTypes message; + TestUtil::SetPackedFields(&message); + + EXPECT_EQ(message.ByteSize(), WireFormat::ByteSize(message)); + message.Clear(); + EXPECT_EQ(0, message.ByteSize()); + EXPECT_EQ(0, WireFormat::ByteSize(message)); +} + +TEST(WireFormatTest, ByteSizePackedExtensions) { + unittest::TestPackedExtensions message; + TestUtil::SetPackedExtensions(&message); + + EXPECT_EQ(message.ByteSize(), + WireFormat::ByteSize(message)); + message.Clear(); + EXPECT_EQ(0, message.ByteSize()); + EXPECT_EQ(0, WireFormat::ByteSize(message)); +} + +TEST(WireFormatTest, Serialize) { + unittest::TestAllTypes message; + string generated_data; + string dynamic_data; + + TestUtil::SetAllFields(&message); + int size = message.ByteSize(); + + // Serialize using the generated code. + { + io::StringOutputStream raw_output(&generated_data); + io::CodedOutputStream output(&raw_output); + message.SerializeWithCachedSizes(&output); + ASSERT_FALSE(output.HadError()); + } + + // Serialize using WireFormat. + { + io::StringOutputStream raw_output(&dynamic_data); + io::CodedOutputStream output(&raw_output); + WireFormat::SerializeWithCachedSizes(message, size, &output); + ASSERT_FALSE(output.HadError()); + } + + // Should be the same. + // Don't use EXPECT_EQ here because we're comparing raw binary data and + // we really don't want it dumped to stdout on failure. + EXPECT_TRUE(dynamic_data == generated_data); +} + +TEST(WireFormatTest, SerializeExtensions) { + unittest::TestAllExtensions message; + string generated_data; + string dynamic_data; + + TestUtil::SetAllExtensions(&message); + int size = message.ByteSize(); + + // Serialize using the generated code. + { + io::StringOutputStream raw_output(&generated_data); + io::CodedOutputStream output(&raw_output); + message.SerializeWithCachedSizes(&output); + ASSERT_FALSE(output.HadError()); + } + + // Serialize using WireFormat. + { + io::StringOutputStream raw_output(&dynamic_data); + io::CodedOutputStream output(&raw_output); + WireFormat::SerializeWithCachedSizes(message, size, &output); + ASSERT_FALSE(output.HadError()); + } + + // Should be the same. + // Don't use EXPECT_EQ here because we're comparing raw binary data and + // we really don't want it dumped to stdout on failure. + EXPECT_TRUE(dynamic_data == generated_data); +} + +TEST(WireFormatTest, SerializeFieldsAndExtensions) { + unittest::TestFieldOrderings message; + string generated_data; + string dynamic_data; + + TestUtil::SetAllFieldsAndExtensions(&message); + int size = message.ByteSize(); + + // Serialize using the generated code. + { + io::StringOutputStream raw_output(&generated_data); + io::CodedOutputStream output(&raw_output); + message.SerializeWithCachedSizes(&output); + ASSERT_FALSE(output.HadError()); + } + + // Serialize using WireFormat. + { + io::StringOutputStream raw_output(&dynamic_data); + io::CodedOutputStream output(&raw_output); + WireFormat::SerializeWithCachedSizes(message, size, &output); + ASSERT_FALSE(output.HadError()); + } + + // Should be the same. + // Don't use EXPECT_EQ here because we're comparing raw binary data and + // we really don't want it dumped to stdout on failure. + EXPECT_TRUE(dynamic_data == generated_data); + + // Should output in canonical order. + TestUtil::ExpectAllFieldsAndExtensionsInOrder(dynamic_data); + TestUtil::ExpectAllFieldsAndExtensionsInOrder(generated_data); +} + +TEST(WireFormatTest, ParseMultipleExtensionRanges) { + // Make sure we can parse a message that contains multiple extensions ranges. + unittest::TestFieldOrderings source; + string data; + + TestUtil::SetAllFieldsAndExtensions(&source); + source.SerializeToString(&data); + + { + unittest::TestFieldOrderings dest; + EXPECT_TRUE(dest.ParseFromString(data)); + EXPECT_EQ(source.DebugString(), dest.DebugString()); + } + + // Also test using reflection-based parsing. + { + unittest::TestFieldOrderings dest; + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream coded_input(&raw_input); + EXPECT_TRUE(WireFormat::ParseAndMergePartial(&coded_input, &dest)); + EXPECT_EQ(source.DebugString(), dest.DebugString()); + } +} + +const int kUnknownTypeId = 1550055; + +TEST(WireFormatTest, SerializeMessageSet) { + // Set up a TestMessageSet with two known messages and an unknown one. + unittest::TestMessageSet message_set; + message_set.MutableExtension( + unittest::TestMessageSetExtension1::message_set_extension)->set_i(123); + message_set.MutableExtension( + unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo"); + message_set.mutable_unknown_fields()->AddLengthDelimited( + kUnknownTypeId, "bar"); + + string data; + ASSERT_TRUE(message_set.SerializeToString(&data)); + + // Parse back using RawMessageSet and check the contents. + unittest::RawMessageSet raw; + ASSERT_TRUE(raw.ParseFromString(data)); + + EXPECT_EQ(0, raw.unknown_fields().field_count()); + + ASSERT_EQ(3, raw.item_size()); + EXPECT_EQ( + unittest::TestMessageSetExtension1::descriptor()->extension(0)->number(), + raw.item(0).type_id()); + EXPECT_EQ( + unittest::TestMessageSetExtension2::descriptor()->extension(0)->number(), + raw.item(1).type_id()); + EXPECT_EQ(kUnknownTypeId, raw.item(2).type_id()); + + unittest::TestMessageSetExtension1 message1; + EXPECT_TRUE(message1.ParseFromString(raw.item(0).message())); + EXPECT_EQ(123, message1.i()); + + unittest::TestMessageSetExtension2 message2; + EXPECT_TRUE(message2.ParseFromString(raw.item(1).message())); + EXPECT_EQ("foo", message2.str()); + + EXPECT_EQ("bar", raw.item(2).message()); +} + +TEST(WireFormatTest, SerializeMessageSetVariousWaysAreEqual) { + // Serialize a MessageSet to a stream and to a flat array using generated + // code, and also using WireFormat, and check that the results are equal. + // Set up a TestMessageSet with two known messages and an unknown one, as + // above. + + unittest::TestMessageSet message_set; + message_set.MutableExtension( + unittest::TestMessageSetExtension1::message_set_extension)->set_i(123); + message_set.MutableExtension( + unittest::TestMessageSetExtension2::message_set_extension)->set_str("foo"); + message_set.mutable_unknown_fields()->AddLengthDelimited( + kUnknownTypeId, "bar"); + + int size = message_set.ByteSize(); + EXPECT_EQ(size, message_set.GetCachedSize()); + ASSERT_EQ(size, WireFormat::ByteSize(message_set)); + + string flat_data; + string stream_data; + string dynamic_data; + flat_data.resize(size); + stream_data.resize(size); + + // Serialize to flat array + { + uint8* target = reinterpret_cast(string_as_array(&flat_data)); + uint8* end = message_set.SerializeWithCachedSizesToArray(target); + EXPECT_EQ(size, end - target); + } + + // Serialize to buffer + { + io::ArrayOutputStream array_stream(string_as_array(&stream_data), size, 1); + io::CodedOutputStream output_stream(&array_stream); + message_set.SerializeWithCachedSizes(&output_stream); + ASSERT_FALSE(output_stream.HadError()); + } + + // Serialize to buffer with WireFormat. + { + io::StringOutputStream string_stream(&dynamic_data); + io::CodedOutputStream output_stream(&string_stream); + WireFormat::SerializeWithCachedSizes(message_set, size, &output_stream); + ASSERT_FALSE(output_stream.HadError()); + } + + EXPECT_TRUE(flat_data == stream_data); + EXPECT_TRUE(flat_data == dynamic_data); +} + +TEST(WireFormatTest, ParseMessageSet) { + // Set up a RawMessageSet with two known messages and an unknown one. + unittest::RawMessageSet raw; + + { + unittest::RawMessageSet::Item* item = raw.add_item(); + item->set_type_id( + unittest::TestMessageSetExtension1::descriptor()->extension(0)->number()); + unittest::TestMessageSetExtension1 message; + message.set_i(123); + message.SerializeToString(item->mutable_message()); + } + + { + unittest::RawMessageSet::Item* item = raw.add_item(); + item->set_type_id( + unittest::TestMessageSetExtension2::descriptor()->extension(0)->number()); + unittest::TestMessageSetExtension2 message; + message.set_str("foo"); + message.SerializeToString(item->mutable_message()); + } + + { + unittest::RawMessageSet::Item* item = raw.add_item(); + item->set_type_id(kUnknownTypeId); + item->set_message("bar"); + } + + string data; + ASSERT_TRUE(raw.SerializeToString(&data)); + + // Parse as a TestMessageSet and check the contents. + unittest::TestMessageSet message_set; + ASSERT_TRUE(message_set.ParseFromString(data)); + + EXPECT_EQ(123, message_set.GetExtension( + unittest::TestMessageSetExtension1::message_set_extension).i()); + EXPECT_EQ("foo", message_set.GetExtension( + unittest::TestMessageSetExtension2::message_set_extension).str()); + + ASSERT_EQ(1, message_set.unknown_fields().field_count()); + ASSERT_EQ(UnknownField::TYPE_LENGTH_DELIMITED, + message_set.unknown_fields().field(0).type()); + EXPECT_EQ("bar", message_set.unknown_fields().field(0).length_delimited()); + + // Also parse using WireFormat. + unittest::TestMessageSet dynamic_message_set; + io::CodedInputStream input(reinterpret_cast(data.data()), + data.size()); + ASSERT_TRUE(WireFormat::ParseAndMergePartial(&input, &dynamic_message_set)); + EXPECT_EQ(message_set.DebugString(), dynamic_message_set.DebugString()); +} + +TEST(WireFormatTest, RecursionLimit) { + unittest::TestRecursiveMessage message; + message.mutable_a()->mutable_a()->mutable_a()->mutable_a()->set_i(1); + string data; + message.SerializeToString(&data); + + { + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + input.SetRecursionLimit(4); + unittest::TestRecursiveMessage message2; + EXPECT_TRUE(message2.ParseFromCodedStream(&input)); + } + + { + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + input.SetRecursionLimit(3); + unittest::TestRecursiveMessage message2; + EXPECT_FALSE(message2.ParseFromCodedStream(&input)); + } +} + +TEST(WireFormatTest, UnknownFieldRecursionLimit) { + unittest::TestEmptyMessage message; + message.mutable_unknown_fields() + ->AddGroup(1234) + ->AddGroup(1234) + ->AddGroup(1234) + ->AddGroup(1234) + ->AddVarint(1234, 123); + string data; + message.SerializeToString(&data); + + { + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + input.SetRecursionLimit(4); + unittest::TestEmptyMessage message2; + EXPECT_TRUE(message2.ParseFromCodedStream(&input)); + } + + { + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream input(&raw_input); + input.SetRecursionLimit(3); + unittest::TestEmptyMessage message2; + EXPECT_FALSE(message2.ParseFromCodedStream(&input)); + } +} + +TEST(WireFormatTest, ZigZag) { +// avoid line-wrapping +#define LL(x) GOOGLE_LONGLONG(x) +#define ULL(x) GOOGLE_ULONGLONG(x) +#define ZigZagEncode32(x) WireFormatLite::ZigZagEncode32(x) +#define ZigZagDecode32(x) WireFormatLite::ZigZagDecode32(x) +#define ZigZagEncode64(x) WireFormatLite::ZigZagEncode64(x) +#define ZigZagDecode64(x) WireFormatLite::ZigZagDecode64(x) + + EXPECT_EQ(0u, ZigZagEncode32( 0)); + EXPECT_EQ(1u, ZigZagEncode32(-1)); + EXPECT_EQ(2u, ZigZagEncode32( 1)); + EXPECT_EQ(3u, ZigZagEncode32(-2)); + EXPECT_EQ(0x7FFFFFFEu, ZigZagEncode32(0x3FFFFFFF)); + EXPECT_EQ(0x7FFFFFFFu, ZigZagEncode32(0xC0000000)); + EXPECT_EQ(0xFFFFFFFEu, ZigZagEncode32(0x7FFFFFFF)); + EXPECT_EQ(0xFFFFFFFFu, ZigZagEncode32(0x80000000)); + + EXPECT_EQ( 0, ZigZagDecode32(0u)); + EXPECT_EQ(-1, ZigZagDecode32(1u)); + EXPECT_EQ( 1, ZigZagDecode32(2u)); + EXPECT_EQ(-2, ZigZagDecode32(3u)); + EXPECT_EQ(0x3FFFFFFF, ZigZagDecode32(0x7FFFFFFEu)); + EXPECT_EQ(0xC0000000, ZigZagDecode32(0x7FFFFFFFu)); + EXPECT_EQ(0x7FFFFFFF, ZigZagDecode32(0xFFFFFFFEu)); + EXPECT_EQ(0x80000000, ZigZagDecode32(0xFFFFFFFFu)); + + EXPECT_EQ(0u, ZigZagEncode64( 0)); + EXPECT_EQ(1u, ZigZagEncode64(-1)); + EXPECT_EQ(2u, ZigZagEncode64( 1)); + EXPECT_EQ(3u, ZigZagEncode64(-2)); + EXPECT_EQ(ULL(0x000000007FFFFFFE), ZigZagEncode64(LL(0x000000003FFFFFFF))); + EXPECT_EQ(ULL(0x000000007FFFFFFF), ZigZagEncode64(LL(0xFFFFFFFFC0000000))); + EXPECT_EQ(ULL(0x00000000FFFFFFFE), ZigZagEncode64(LL(0x000000007FFFFFFF))); + EXPECT_EQ(ULL(0x00000000FFFFFFFF), ZigZagEncode64(LL(0xFFFFFFFF80000000))); + EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFE), ZigZagEncode64(LL(0x7FFFFFFFFFFFFFFF))); + EXPECT_EQ(ULL(0xFFFFFFFFFFFFFFFF), ZigZagEncode64(LL(0x8000000000000000))); + + EXPECT_EQ( 0, ZigZagDecode64(0u)); + EXPECT_EQ(-1, ZigZagDecode64(1u)); + EXPECT_EQ( 1, ZigZagDecode64(2u)); + EXPECT_EQ(-2, ZigZagDecode64(3u)); + EXPECT_EQ(LL(0x000000003FFFFFFF), ZigZagDecode64(ULL(0x000000007FFFFFFE))); + EXPECT_EQ(LL(0xFFFFFFFFC0000000), ZigZagDecode64(ULL(0x000000007FFFFFFF))); + EXPECT_EQ(LL(0x000000007FFFFFFF), ZigZagDecode64(ULL(0x00000000FFFFFFFE))); + EXPECT_EQ(LL(0xFFFFFFFF80000000), ZigZagDecode64(ULL(0x00000000FFFFFFFF))); + EXPECT_EQ(LL(0x7FFFFFFFFFFFFFFF), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFE))); + EXPECT_EQ(LL(0x8000000000000000), ZigZagDecode64(ULL(0xFFFFFFFFFFFFFFFF))); + + // Some easier-to-verify round-trip tests. The inputs (other than 0, 1, -1) + // were chosen semi-randomly via keyboard bashing. + EXPECT_EQ( 0, ZigZagDecode32(ZigZagEncode32( 0))); + EXPECT_EQ( 1, ZigZagDecode32(ZigZagEncode32( 1))); + EXPECT_EQ( -1, ZigZagDecode32(ZigZagEncode32( -1))); + EXPECT_EQ(14927, ZigZagDecode32(ZigZagEncode32(14927))); + EXPECT_EQ(-3612, ZigZagDecode32(ZigZagEncode32(-3612))); + + EXPECT_EQ( 0, ZigZagDecode64(ZigZagEncode64( 0))); + EXPECT_EQ( 1, ZigZagDecode64(ZigZagEncode64( 1))); + EXPECT_EQ( -1, ZigZagDecode64(ZigZagEncode64( -1))); + EXPECT_EQ(14927, ZigZagDecode64(ZigZagEncode64(14927))); + EXPECT_EQ(-3612, ZigZagDecode64(ZigZagEncode64(-3612))); + + EXPECT_EQ(LL(856912304801416), ZigZagDecode64(ZigZagEncode64( + LL(856912304801416)))); + EXPECT_EQ(LL(-75123905439571256), ZigZagDecode64(ZigZagEncode64( + LL(-75123905439571256)))); +} + +TEST(WireFormatTest, RepeatedScalarsDifferentTagSizes) { + // At one point checks would trigger when parsing repeated fixed scalar + // fields. + protobuf_unittest::TestRepeatedScalarDifferentTagSizes msg1, msg2; + for (int i = 0; i < 100; ++i) { + msg1.add_repeated_fixed32(i); + msg1.add_repeated_int32(i); + msg1.add_repeated_fixed64(i); + msg1.add_repeated_int64(i); + msg1.add_repeated_float(i); + msg1.add_repeated_uint64(i); + } + + // Make sure that we have a variety of tag sizes. + const google::protobuf::Descriptor* desc = msg1.GetDescriptor(); + const google::protobuf::FieldDescriptor* field; + field = desc->FindFieldByName("repeated_fixed32"); + ASSERT_TRUE(field != NULL); + ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); + field = desc->FindFieldByName("repeated_int32"); + ASSERT_TRUE(field != NULL); + ASSERT_EQ(1, WireFormat::TagSize(field->number(), field->type())); + field = desc->FindFieldByName("repeated_fixed64"); + ASSERT_TRUE(field != NULL); + ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); + field = desc->FindFieldByName("repeated_int64"); + ASSERT_TRUE(field != NULL); + ASSERT_EQ(2, WireFormat::TagSize(field->number(), field->type())); + field = desc->FindFieldByName("repeated_float"); + ASSERT_TRUE(field != NULL); + ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); + field = desc->FindFieldByName("repeated_uint64"); + ASSERT_TRUE(field != NULL); + ASSERT_EQ(3, WireFormat::TagSize(field->number(), field->type())); + + EXPECT_TRUE(msg2.ParseFromString(msg1.SerializeAsString())); + EXPECT_EQ(msg1.DebugString(), msg2.DebugString()); +} + +class WireFormatInvalidInputTest : public testing::Test { + protected: + // Make a serialized TestAllTypes in which the field optional_nested_message + // contains exactly the given bytes, which may be invalid. + string MakeInvalidEmbeddedMessage(const char* bytes, int size) { + const FieldDescriptor* field = + unittest::TestAllTypes::descriptor()->FindFieldByName( + "optional_nested_message"); + GOOGLE_CHECK(field != NULL); + + string result; + + { + io::StringOutputStream raw_output(&result); + io::CodedOutputStream output(&raw_output); + + WireFormatLite::WriteBytes(field->number(), string(bytes, size), &output); + } + + return result; + } + + // Make a serialized TestAllTypes in which the field optionalgroup + // contains exactly the given bytes -- which may be invalid -- and + // possibly no end tag. + string MakeInvalidGroup(const char* bytes, int size, bool include_end_tag) { + const FieldDescriptor* field = + unittest::TestAllTypes::descriptor()->FindFieldByName( + "optionalgroup"); + GOOGLE_CHECK(field != NULL); + + string result; + + { + io::StringOutputStream raw_output(&result); + io::CodedOutputStream output(&raw_output); + + output.WriteVarint32(WireFormat::MakeTag(field)); + output.WriteString(string(bytes, size)); + if (include_end_tag) { + output.WriteVarint32(WireFormatLite::MakeTag( + field->number(), WireFormatLite::WIRETYPE_END_GROUP)); + } + } + + return result; + } +}; + +TEST_F(WireFormatInvalidInputTest, InvalidSubMessage) { + unittest::TestAllTypes message; + + // Control case. + EXPECT_TRUE(message.ParseFromString(MakeInvalidEmbeddedMessage("", 0))); + + // The byte is a valid varint, but not a valid tag (zero). + EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\0", 1))); + + // The byte is a malformed varint. + EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\200", 1))); + + // The byte is an endgroup tag, but we aren't parsing a group. + EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\014", 1))); + + // The byte is a valid varint but not a valid tag (bad wire type). + EXPECT_FALSE(message.ParseFromString(MakeInvalidEmbeddedMessage("\017", 1))); +} + +TEST_F(WireFormatInvalidInputTest, InvalidGroup) { + unittest::TestAllTypes message; + + // Control case. + EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); + + // Missing end tag. Groups cannot end at EOF. + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); + + // The byte is a valid varint, but not a valid tag (zero). + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); + + // The byte is a malformed varint. + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); + + // The byte is an endgroup tag, but not the right one for this group. + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); + + // The byte is a valid varint but not a valid tag (bad wire type). + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); +} + +TEST_F(WireFormatInvalidInputTest, InvalidUnknownGroup) { + // Use TestEmptyMessage so that the group made by MakeInvalidGroup will not + // be a known tag number. + unittest::TestEmptyMessage message; + + // Control case. + EXPECT_TRUE(message.ParseFromString(MakeInvalidGroup("", 0, true))); + + // Missing end tag. Groups cannot end at EOF. + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("", 0, false))); + + // The byte is a valid varint, but not a valid tag (zero). + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\0", 1, false))); + + // The byte is a malformed varint. + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\200", 1, false))); + + // The byte is an endgroup tag, but not the right one for this group. + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\014", 1, false))); + + // The byte is a valid varint but not a valid tag (bad wire type). + EXPECT_FALSE(message.ParseFromString(MakeInvalidGroup("\017", 1, true))); +} + +TEST_F(WireFormatInvalidInputTest, InvalidStringInUnknownGroup) { + // Test a bug fix: SkipMessage should fail if the message contains a string + // whose length would extend beyond the message end. + + unittest::TestAllTypes message; + message.set_optional_string("foo foo foo foo"); + string data; + message.SerializeToString(&data); + + // Chop some bytes off the end. + data.resize(data.size() - 4); + + // Try to skip it. Note that the bug was only present when parsing to an + // UnknownFieldSet. + io::ArrayInputStream raw_input(data.data(), data.size()); + io::CodedInputStream coded_input(&raw_input); + UnknownFieldSet unknown_fields; + EXPECT_FALSE(WireFormat::SkipMessage(&coded_input, &unknown_fields)); +} + +// Test differences between string and bytes. +// Value of a string type must be valid UTF-8 string. When UTF-8 +// validation is enabled (GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED): +// WriteInvalidUTF8String: see error message. +// ReadInvalidUTF8String: see error message. +// WriteValidUTF8String: fine. +// ReadValidUTF8String: fine. +// WriteAnyBytes: fine. +// ReadAnyBytes: fine. +const char * kInvalidUTF8String = "Invalid UTF-8: \xA0\xB0\xC0\xD0"; +// This used to be "Valid UTF-8: \x01\x02\u8C37\u6B4C", but MSVC seems to +// interpret \u differently from GCC. +const char * kValidUTF8String = "Valid UTF-8: \x01\x02\350\260\267\346\255\214"; + +template +bool WriteMessage(const char *value, T *message, string *wire_buffer) { + message->set_data(value); + wire_buffer->clear(); + message->AppendToString(wire_buffer); + return (wire_buffer->size() > 0); +} + +template +bool ReadMessage(const string &wire_buffer, T *message) { + return message->ParseFromArray(wire_buffer.data(), wire_buffer.size()); +} + +TEST(Utf8ValidationTest, WriteInvalidUTF8String) { + string wire_buffer; + protobuf_unittest::OneString input; + vector errors; + { + ScopedMemoryLog log; + WriteMessage(kInvalidUTF8String, &input, &wire_buffer); + errors = log.GetMessages(ERROR); + } +#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED + ASSERT_EQ(1, errors.size()); + EXPECT_EQ("Encountered string containing invalid UTF-8 data while " + "serializing protocol buffer. Strings must contain only UTF-8; " + "use the 'bytes' type for raw bytes.", + errors[0]); + +#else + ASSERT_EQ(0, errors.size()); +#endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED +} + +TEST(Utf8ValidationTest, ReadInvalidUTF8String) { + string wire_buffer; + protobuf_unittest::OneString input; + WriteMessage(kInvalidUTF8String, &input, &wire_buffer); + protobuf_unittest::OneString output; + vector errors; + { + ScopedMemoryLog log; + ReadMessage(wire_buffer, &output); + errors = log.GetMessages(ERROR); + } +#ifdef GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED + ASSERT_EQ(1, errors.size()); + EXPECT_EQ("Encountered string containing invalid UTF-8 data while " + "parsing protocol buffer. Strings must contain only UTF-8; " + "use the 'bytes' type for raw bytes.", + errors[0]); + +#else + ASSERT_EQ(0, errors.size()); +#endif // GOOGLE_PROTOBUF_UTF8_VALIDATION_ENABLED +} + +TEST(Utf8ValidationTest, WriteValidUTF8String) { + string wire_buffer; + protobuf_unittest::OneString input; + vector errors; + { + ScopedMemoryLog log; + WriteMessage(kValidUTF8String, &input, &wire_buffer); + errors = log.GetMessages(ERROR); + } + ASSERT_EQ(0, errors.size()); +} + +TEST(Utf8ValidationTest, ReadValidUTF8String) { + string wire_buffer; + protobuf_unittest::OneString input; + WriteMessage(kValidUTF8String, &input, &wire_buffer); + protobuf_unittest::OneString output; + vector errors; + { + ScopedMemoryLog log; + ReadMessage(wire_buffer, &output); + errors = log.GetMessages(ERROR); + } + ASSERT_EQ(0, errors.size()); + EXPECT_EQ(input.data(), output.data()); +} + +// Bytes: anything can pass as bytes, use invalid UTF-8 string to test +TEST(Utf8ValidationTest, WriteArbitraryBytes) { + string wire_buffer; + protobuf_unittest::OneBytes input; + vector errors; + { + ScopedMemoryLog log; + WriteMessage(kInvalidUTF8String, &input, &wire_buffer); + errors = log.GetMessages(ERROR); + } + ASSERT_EQ(0, errors.size()); +} + +TEST(Utf8ValidationTest, ReadArbitraryBytes) { + string wire_buffer; + protobuf_unittest::OneBytes input; + WriteMessage(kInvalidUTF8String, &input, &wire_buffer); + protobuf_unittest::OneBytes output; + vector errors; + { + ScopedMemoryLog log; + ReadMessage(wire_buffer, &output); + errors = log.GetMessages(ERROR); + } + ASSERT_EQ(0, errors.size()); + EXPECT_EQ(input.data(), output.data()); +} + +} // namespace +} // namespace internal +} // namespace protobuf +} // namespace google diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la b/spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la new file mode 100644 index 000000000..3edf42541 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la @@ -0,0 +1,51 @@ +# libstdc++.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.4a-GCC3.0 (1.641.2.256 2001/05/28 20:09:07 with GCC-local changes) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# --- +# NOTE: This file lives in /usr/sfw/lib on Solaris 10. Unfortunately, +# due to an apparent bug in the Solaris 10 6/06 release, +# /usr/sfw/lib/libstdc++.la is empty. Below is the correct content, +# according to +# http://forum.java.sun.com/thread.jspa?threadID=5073150 +# By passing LDFLAGS='-Lsrc/solaris' to configure, make will pick up +# this copy of the file rather than the empty copy in /usr/sfw/lib. +# +# Also see +# http://www.technicalarticles.org/index.php/Compiling_MySQL_5.0_on_Solaris_10 +# +# Note: this is for 32-bit systems. If you have a 64-bit system, +# uncomment the appropriate dependency_libs line below. +# ---- + +# The name that we can dlopen(3). +dlname='libstdc++.so.6' + +# Names of this library. +library_names='libstdc++.so.6.0.3 libstdc++.so.6 libstdc++.so' + +# The name of the static archive. +old_library='libstdc++.a' + +# Libraries that this one depends upon. +# 32-bit version: +dependency_libs='-lc -lm -L/usr/sfw/lib -lgcc_s' +# 64-bit version: +#dependency_libs='-L/lib/64 -lc -lm -L/usr/sfw/lib/64 -lgcc_s' + +# Version information for libstdc++. +current=6 +age=0 +revision=3 + +# Is this an already installed library? +installed=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/usr/sfw/lib' diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h new file mode 100644 index 000000000..2c64450a1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h @@ -0,0 +1,29 @@ +/* protobuf config.h for MSVC. On other platforms, this is generated + * automatically by autoheader / autoconf / configure. */ + +/* the location of */ +#define HASH_MAP_H + +/* the namespace of hash_map/hash_set */ +// Apparently Microsoft decided to move hash_map *back* to the std namespace +// in MSVC 2010: +// http://blogs.msdn.com/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx +// TODO(kenton): Use unordered_map instead, which is available in MSVC 2010. +#if _MSC_VER < 1310 || _MSC_VER >= 1600 +#define HASH_NAMESPACE std +#else +#define HASH_NAMESPACE stdext +#endif + +/* the location of */ +#define HASH_SET_H + +/* define if the compiler has hash_map */ +#define HAVE_HASH_MAP 1 + +/* define if the compiler has hash_set */ +#define HAVE_HASH_SET 1 + +/* define if you want to use zlib. See readme.txt for additional + * requirements. */ +// #define HAVE_ZLIB 1 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh new file mode 100755 index 000000000..60eccaf3e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh @@ -0,0 +1,20 @@ +#! /bin/sh -e + +# This script downgrades MSVC 2008 projects to MSVC 2005 projects, allowing +# people with MSVC 2005 to open them. Otherwise, MSVC 2005 simply refuses to +# open projects created with 2008. We run this as part of our release process. +# If you obtained the code direct from version control and you want to use +# MSVC 2005, you may have to run this manually. (Hint: Use Cygwin or MSYS.) + +for file in *.sln; do + echo "downgrading $file..." + sed -i -re 's/Format Version 10.00/Format Version 9.00/g; + s/Visual Studio 2008/Visual Studio 2005/g;' $file +done + +for file in *.vcproj; do + echo "downgrading $file..." + sed -i -re 's/Version="9.00"/Version="8.00"/g;' $file +done + +# Yes, really, that's it. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat new file mode 100755 index 000000000..386d2040f --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat @@ -0,0 +1,43 @@ +md include +md include\google +md include\google\protobuf +md include\google\protobuf\stubs +md include\google\protobuf\io +md include\google\protobuf\compiler +md include\google\protobuf\compiler\cpp +md include\google\protobuf\compiler\java +md include\google\protobuf\compiler\python +copy ..\src\google\protobuf\stubs\common.h include\google\protobuf\stubs\common.h +copy ..\src\google\protobuf\stubs\once.h include\google\protobuf\stubs\once.h +copy ..\src\google\protobuf\descriptor.h include\google\protobuf\descriptor.h +copy ..\src\google\protobuf\descriptor.pb.h include\google\protobuf\descriptor.pb.h +copy ..\src\google\protobuf\descriptor_database.h include\google\protobuf\descriptor_database.h +copy ..\src\google\protobuf\dynamic_message.h include\google\protobuf\dynamic_message.h +copy ..\src\google\protobuf\extension_set.h include\google\protobuf\extension_set.h +copy ..\src\google\protobuf\generated_message_util.h include\google\protobuf\generated_message_util.h +copy ..\src\google\protobuf\generated_message_reflection.h include\google\protobuf\generated_message_reflection.h +copy ..\src\google\protobuf\message.h include\google\protobuf\message.h +copy ..\src\google\protobuf\message_lite.h include\google\protobuf\message_lite.h +copy ..\src\google\protobuf\reflection_ops.h include\google\protobuf\reflection_ops.h +copy ..\src\google\protobuf\repeated_field.h include\google\protobuf\repeated_field.h +copy ..\src\google\protobuf\service.h include\google\protobuf\service.h +copy ..\src\google\protobuf\text_format.h include\google\protobuf\text_format.h +copy ..\src\google\protobuf\unknown_field_set.h include\google\protobuf\unknown_field_set.h +copy ..\src\google\protobuf\wire_format.h include\google\protobuf\wire_format.h +copy ..\src\google\protobuf\wire_format_lite.h include\google\protobuf\wire_format_lite.h +copy ..\src\google\protobuf\wire_format_lite_inl.h include\google\protobuf\wire_format_lite_inl.h +copy ..\src\google\protobuf\io\coded_stream.h include\google\protobuf\io\coded_stream.h +copy ..\src\google\protobuf\io\gzip_stream.h include\google\protobuf\io\gzip_stream.h +copy ..\src\google\protobuf\io\printer.h include\google\protobuf\io\printer.h +copy ..\src\google\protobuf\io\tokenizer.h include\google\protobuf\io\tokenizer.h +copy ..\src\google\protobuf\io\zero_copy_stream.h include\google\protobuf\io\zero_copy_stream.h +copy ..\src\google\protobuf\io\zero_copy_stream_impl.h include\google\protobuf\io\zero_copy_stream_impl.h +copy ..\src\google\protobuf\io\zero_copy_stream_impl_lite.h include\google\protobuf\io\zero_copy_stream_impl_lite.h +copy ..\src\google\protobuf\compiler\code_generator.h include\google\protobuf\compiler\code_generator.h +copy ..\src\google\protobuf\compiler\command_line_interface.h include\google\protobuf\compiler\command_line_interface.h +copy ..\src\google\protobuf\compiler\importer.h include\google\protobuf\compiler\importer.h +copy ..\src\google\protobuf\compiler\parser.h include\google\protobuf\compiler\parser.h +copy ..\src\google\protobuf\compiler\cpp\cpp_generator.h include\google\protobuf\compiler\cpp\cpp_generator.h +copy ..\src\google\protobuf\compiler\java\java_generator.h include\google\protobuf\compiler\java\java_generator.h +copy ..\src\google\protobuf\compiler\python\python_generator.h include\google\protobuf\compiler\python\python_generator.h +copy ..\src\google\protobuf\compiler\plugin.h include\google\protobuf\compiler\plugin.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj new file mode 100644 index 000000000..2966c979b --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj new file mode 100644 index 000000000..65bd6abb1 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj new file mode 100644 index 000000000..d55e24e07 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj new file mode 100644 index 000000000..f66556ab0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln new file mode 100644 index 000000000..567dee62e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln @@ -0,0 +1,92 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libprotobuf", "libprotobuf.vcproj", "{3E283F37-A4ED-41B7-A3E6-A2D89D131A30}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libprotoc", "libprotoc.vcproj", "{B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}" + ProjectSection(ProjectDependencies) = postProject + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "protoc", "protoc.vcproj", "{1738D5F6-ED1E-47E0-B2F0-456864B93C1E}" + ProjectSection(ProjectDependencies) = postProject + {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} = {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tests", "tests.vcproj", "{4DF72760-C055-40A5-A77E-30A17E2AC2DB}" + ProjectSection(ProjectDependencies) = postProject + {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} = {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} = {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} + {3AF54C8A-10BF-4332-9147-F68ED9862032} = {3AF54C8A-10BF-4332-9147-F68ED9862032} + {CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32} = {CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32} + {1738D5F6-ED1E-47E0-B2F0-456864B93C1E} = {1738D5F6-ED1E-47E0-B2F0-456864B93C1E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "..\gtest\msvc\gtest.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main", "..\gtest\msvc\gtest_main.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862032}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libprotobuf-lite", "libprotobuf-lite.vcproj", "{49EA010D-706F-4BE2-A397-77854B72A040}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lite-test", "lite-test.vcproj", "{12015ACE-42BE-4952-A5A0-44A9A46908E2}" + ProjectSection(ProjectDependencies) = postProject + {49EA010D-706F-4BE2-A397-77854B72A040} = {49EA010D-706F-4BE2-A397-77854B72A040} + {1738D5F6-ED1E-47E0-B2F0-456864B93C1E} = {1738D5F6-ED1E-47E0-B2F0-456864B93C1E} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test_plugin", "test_plugin.vcproj", "{CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}" + ProjectSection(ProjectDependencies) = postProject + {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} = {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE} + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} = {3E283F37-A4ED-41B7-A3E6-A2D89D131A30} + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} = {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Debug|Win32.ActiveCfg = Debug|Win32 + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Debug|Win32.Build.0 = Debug|Win32 + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Release|Win32.ActiveCfg = Release|Win32 + {3E283F37-A4ED-41B7-A3E6-A2D89D131A30}.Release|Win32.Build.0 = Release|Win32 + {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Debug|Win32.ActiveCfg = Debug|Win32 + {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Debug|Win32.Build.0 = Debug|Win32 + {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Release|Win32.ActiveCfg = Release|Win32 + {B84FF31A-5F9A-46F8-AB22-DBFC9BECE3BE}.Release|Win32.Build.0 = Release|Win32 + {1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Debug|Win32.ActiveCfg = Debug|Win32 + {1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Debug|Win32.Build.0 = Debug|Win32 + {1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Release|Win32.ActiveCfg = Release|Win32 + {1738D5F6-ED1E-47E0-B2F0-456864B93C1E}.Release|Win32.Build.0 = Release|Win32 + {4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Debug|Win32.ActiveCfg = Debug|Win32 + {4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Debug|Win32.Build.0 = Debug|Win32 + {4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Win32.ActiveCfg = Release|Win32 + {4DF72760-C055-40A5-A77E-30A17E2AC2DB}.Release|Win32.Build.0 = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.ActiveCfg = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug|Win32.Build.0 = Debug|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.ActiveCfg = Release|Win32 + {C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release|Win32.Build.0 = Release|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|Win32.ActiveCfg = Debug|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug|Win32.Build.0 = Debug|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|Win32.ActiveCfg = Release|Win32 + {3AF54C8A-10BF-4332-9147-F68ED9862032}.Release|Win32.Build.0 = Release|Win32 + {49EA010D-706F-4BE2-A397-77854B72A040}.Debug|Win32.ActiveCfg = Debug|Win32 + {49EA010D-706F-4BE2-A397-77854B72A040}.Debug|Win32.Build.0 = Debug|Win32 + {49EA010D-706F-4BE2-A397-77854B72A040}.Release|Win32.ActiveCfg = Release|Win32 + {49EA010D-706F-4BE2-A397-77854B72A040}.Release|Win32.Build.0 = Release|Win32 + {12015ACE-42BE-4952-A5A0-44A9A46908E2}.Debug|Win32.ActiveCfg = Debug|Win32 + {12015ACE-42BE-4952-A5A0-44A9A46908E2}.Debug|Win32.Build.0 = Debug|Win32 + {12015ACE-42BE-4952-A5A0-44A9A46908E2}.Release|Win32.ActiveCfg = Release|Win32 + {12015ACE-42BE-4952-A5A0-44A9A46908E2}.Release|Win32.Build.0 = Release|Win32 + {CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Debug|Win32.ActiveCfg = Debug|Win32 + {CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Debug|Win32.Build.0 = Debug|Win32 + {CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Release|Win32.ActiveCfg = Release|Win32 + {CBBD34E5-02B0-40D5-B6D8-BFEA83E18B32}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj new file mode 100644 index 000000000..17e8474e9 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt new file mode 100644 index 000000000..288345ad0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt @@ -0,0 +1,114 @@ +This directory contains project files for compiling Protocol Buffers using +MSVC. This is not the recommended way to do Protocol Buffer development -- +we prefer to develop under a Unix-like environment -- but it may be more +accessible to those who primarily work with MSVC. + +Compiling and Installing +======================== + +1) Open protobuf.sln in Microsoft Visual Studio. +2) Choose "Debug" or "Release" configuration as desired.* +3) From the Build menu, choose "Build Solution". Wait for compiling to finish. +4) From a command shell, run tests.exe and lite-test.exe and check that all + tests pass. +5) Run extract_includes.bat to copy all the public headers into a separate + "include" directory (under the top-level package directory). +6) Copy the contents of the include directory to wherever you want to put + headers. +7) Copy protoc.exe wherever you put build tools (probably somewhere in your + PATH). +8) Copy libprotobuf.lib, libprotobuf-lite.lib, and libprotoc.lib wherever you + put libraries. + +* To avoid conflicts between the MSVC debug and release runtime libraries, when + compiling a debug build of your application, you may need to link against a + debug build of libprotobuf.lib. Similarly, release builds should link against + release libs. + +DLLs vs. static linking +======================= + +Static linking is now the default for the Protocol Buffer libraries. Due to +issues with Win32's use of a separate heap for each DLL, as well as binary +compatibility issues between different versions of MSVC's STL library, it is +recommended that you use static linkage only. However, it is possible to +build libprotobuf and libprotoc as DLLs if you really want. To do this, +do the following: + + 1) Open protobuf.sln in MSVC. + 2) For each of the projects libprotobuf, libprotobuf-lite, and libprotoc, do + the following: + 2a) Right-click the project and choose "properties". + 2b) From the side bar, choose "General", under "Configuration Properties". + 2c) Change the "Configuration Type" to "Dynamic Library (.dll)". + 2d) From the side bar, choose "Preprocessor", under "C/C++". + 2e) Add PROTOBUF_USE_DLLS to the list of preprocessor defines. + 3) When compiling your project, make sure to #define PROTOBUF_USE_DLLS. + +When distributing your software to end users, we strongly recommend that you +do NOT install libprotobuf.dll or libprotoc.dll to any shared location. +Instead, keep these libraries next to your binaries, in your application's +own install directory. C++ makes it very difficult to maintain binary +compatibility between releases, so it is likely that future versions of these +libraries will *not* be usable as drop-in replacements. + +If your project is itself a DLL intended for use by third-party software, we +recommend that you do NOT expose protocol buffer objects in your library's +public interface, and that you statically link protocol buffers into your +library. + +ZLib support +============ + +If you want to include GzipInputStream and GzipOutputStream +(google/protobuf/io/gzip_stream.h) in libprotoc, you will need to do a few +additional steps: + +1) Obtain a copy of the zlib library. The pre-compiled DLL at zlib.net works. +2) Make sure zlib's two headers are in your include path and that the .lib file + is in your library path. You could place all three files directly into the + vsproject directory to compile libprotobuf, but they need to be visible to + your own project as well, so you should probably just put them into the + VC shared icnlude and library directories. +3) Right-click on the "tests" project and choose "properties". Navigate the + sidebar to "Configuration Properties" -> "Linker" -> "Input". +4) Under "Additional Dependencies", add the name of the zlib .lib file (e.g. + zdll.lib). Make sure to update both the Debug and Release configurations. +5) If you are compiling libprotobuf and libprotoc as DLLs (see previous + section), repeat steps 2 and 3 for the libprotobuf and libprotoc projects. + If you are compiling them as static libraries, then you will need to link + against the zlib library directly from your own app. +6) Edit config.h (in the vsprojects directory) and un-comment the line that + #defines HAVE_ZLIB. (Or, alternatively, define this macro via the project + settings.) + +Notes on Compiler Warnings +========================== + +The following warnings have been disabled while building the protobuf libraries +and compiler. You may have to disable some of them in your own project as +well, or live with them. + +C4018 - 'expression' : signed/unsigned mismatch +C4146 - unary minus operator applied to unsigned type, result still unsigned +C4244 - Conversion from 'type1' to 'type2', possible loss of data. +C4251 - 'identifier' : class 'type' needs to have dll-interface to be used by + clients of class 'type2' +C4267 - Conversion from 'size_t' to 'type', possible loss of data. +C4305 - 'identifier' : truncation from 'type1' to 'type2' +C4355 - 'this' : used in base member initializer list +C4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning) +C4996 - 'function': was declared deprecated + +C4251 is of particular note, if you are compiling the Protocol Buffer library +as a DLL (see previous section). The protocol buffer library uses templates in +its public interfaces. MSVC does not provide any reasonable way to export +template classes from a DLL. However, in practice, it appears that exporting +templates is not necessary anyway. Since the complete definition of any +template is available in the header files, anyone importing the DLL will just +end up compiling instances of the templates into their own binary. The +Protocol Buffer implementation does not rely on static template members being +unique, so there should be no problem with this, but MSVC prints warning +nevertheless. So, we disable it. Unfortunately, this warning will also be +produced when compiling code which merely uses protocol buffers, meaning you +may have to disable it in your code too. diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj new file mode 100755 index 000000000..44a18c3e0 --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj new file mode 100644 index 000000000..6f730289e --- /dev/null +++ b/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spotify/main.cpp b/spotify/main.cpp index 6405a4856..a18ed871d 100644 --- a/spotify/main.cpp +++ b/spotify/main.cpp @@ -24,10 +24,16 @@ */ #include +#include + #include "spotifysession.h" #include "main.h" #include "spotifyresolver.h" +#ifdef WITH_BREAKPAD + #include "BreakPad.h" +#endif //#include "appkey.h" + int main(int argc, char *argv[]) { @@ -37,6 +43,10 @@ int main(int argc, char *argv[]) */ SpotifyResolver app( argc, argv ); +#ifdef WITH_BREAKPAD + new BreakPad( QDir::tempPath(), true ); +#endif + KDSingleApplicationGuard guard( KDSingleApplicationGuard::NoPolicy ); QObject::connect( &guard, SIGNAL( instanceStarted( KDSingleApplicationGuard::Instance ) ), &app, SLOT( instanceStarted( KDSingleApplicationGuard::Instance ) ) ); From da2289f6b3d1ec3c31d949ecae08dbd7c5aaa485 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Apr 2013 11:00:09 +0200 Subject: [PATCH 082/597] Added build to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c3e40b19f..d2ac2327b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ Makefile* moc_* *~ .DS_Store +build From 2ee303e3dc2ab7bf2afd2ad546ad947085422269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Lindstr=C3=B6m?= Date: Wed, 17 Apr 2013 11:34:57 +0200 Subject: [PATCH 083/597] Find CoreFoundation on OSx --- spotify/CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spotify/CMakeLists.txt b/spotify/CMakeLists.txt index cfaa7b085..1a8f53371 100644 --- a/spotify/CMakeLists.txt +++ b/spotify/CMakeLists.txt @@ -48,6 +48,11 @@ set( tomahawkspotify_SRCS ) IF( WITH_BREAKPAD ) + message(STATUS "Build with support for breakpad.") + if( APPLE ) + FIND_LIBRARY( COREFOUNDATION_LIBRARY CoreFoundation ) + + ENDIF( APPLE ) LIST( APPEND tomahawkspotify_SRCS BreakPad.cpp ) ENDIF() @@ -63,7 +68,7 @@ ENDIF() add_executable(spotify_tomahawkresolver ${tomahawkspotify_SRCS} ${RC_SRCS} ${tomahawkspotify_NOMOC_HDRS} ) -target_link_libraries(spotify_tomahawkresolver qxtweb-standalone ${BREAKPAD_LIBRARIES} ${QT_QTCORE_LIBRARY} ${LIBSPOTIFY_LIBRARIES} ${QT_QTNETWORK_LIBRARY} ${QJSON_LIBRARIES}) +target_link_libraries(spotify_tomahawkresolver qxtweb-standalone ${COREFOUNDATION_LIBRARY} ${BREAKPAD_LIBRARIES} ${QT_QTCORE_LIBRARY} ${LIBSPOTIFY_LIBRARIES} ${QT_QTNETWORK_LIBRARY} ${QJSON_LIBRARIES}) SET_TARGET_PROPERTIES(spotify_tomahawkresolver PROPERTIES AUTOMOC TRUE) From 3b19caa80e8d2881a6caea06d162192fcbb8bd06 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Fri, 3 May 2013 17:32:48 -0300 Subject: [PATCH 084/597] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8d7c36d98..a421d0221 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ Supported resolvers are distributed and updated automatically through Tomahawk's Settings dialog. To manually intstall a resolver: either -* clone this repo, -* download the .zip, or +* clone this repo, or +* download the .zip (see .zip button at the top of the repo page), or * download all the files within the individual resolver folder you are installing. After you have the files locally, open Tomahawk's preferences and from the "Services" tab click "Install from File" and select the .axe or .js file for the resolver you are installing. From 79af2f50ea092f298bc964805e16d73675f1faa2 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Fri, 3 May 2013 17:33:45 -0300 Subject: [PATCH 085/597] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a421d0221..331e4039e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Supported resolvers are distributed and updated automatically through Tomahawk's Settings dialog. To manually intstall a resolver: either * clone this repo, or -* download the .zip (see .zip button at the top of the repo page), or +* download the .zip (see .zip button at the top of the repo page at https://github.com/tomahawk-player/tomahawk-resolvers), or * download all the files within the individual resolver folder you are installing. After you have the files locally, open Tomahawk's preferences and from the "Services" tab click "Install from File" and select the .axe or .js file for the resolver you are installing. From 9e9ea3770e0ff82a1419104774562d969f8ccf03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Lindstr=C3=B6m?= Date: Wed, 8 May 2013 20:23:13 +0200 Subject: [PATCH 086/597] Update to libspotify12 and add version arg --- .../linux/create_synchrotron.rb | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/admin/spotify-synchrotron/linux/create_synchrotron.rb b/admin/spotify-synchrotron/linux/create_synchrotron.rb index 49d13acf4..db0fce26b 100755 --- a/admin/spotify-synchrotron/linux/create_synchrotron.rb +++ b/admin/spotify-synchrotron/linux/create_synchrotron.rb @@ -6,24 +6,24 @@ # require 'pathname' -LIBSPOTIFY_VERSION = "libspotify.so.11" +LIBSPOTIFY_VERSION = "libspotify.so.12" -if ARGV.length < 6 - puts "Usage: ruby create_synchrotron.rb [x86|x64] /path/to/static/builddir resolvername_tomahawkresolver metadata.desktop private_key_file /path/to/tomahawk-synchrotron" +if ARGV.length < 7 + puts "Usage: ruby create_synchrotron.rb [x86|x64] [version 0.0.0] /path/to/static/builddir resolvername_tomahawkresolver metadata.desktop private_key_file /path/to/tomahawk-synchrotron" puts "\n" puts "If you don't have the tomahawk private key and you think you should, ask leo :)" exit end -fullPath = File.join(ARGV[1], ARGV[2]) +fullPath = File.join(ARGV[2], ARGV[3]) -if not File.directory?(ARGV[1]) or not File.exists?(fullPath) or not File.exists?(ARGV[3]) or not File.exists?(ARGV[4]) or not File.directory?(ARGV[5]) +if not File.directory?(ARGV[2]) or not File.exists?(fullPath) or not File.exists?(ARGV[4]) or not File.exists?(ARGV[5]) or not File.directory?(ARGV[6]) puts "One of your arguments didn't exist!" exit end -libspotify = File.join(ARGV[1], LIBSPOTIFY_VERSION) -resolver = ARGV[2].split("_")[0] +libspotify = File.join(ARGV[2], LIBSPOTIFY_VERSION) +resolver = ARGV[3].split("_")[0] platform = "linux-#{ARGV[0]}" puts "Creating zipfile for #{resolver} in folder #{fullPath}..." @@ -37,19 +37,20 @@ `pushd #{folder} && zip -r "#{tarball}" * && mv "#{tarball}" .. && popd` `rm -rf #{folder}` -signature = `openssl dgst -sha1 -binary < "#{tarball}" | openssl dgst -dss1 -sign "#{ARGV[4]}" | openssl enc -base64` +signature = `openssl dgst -sha1 -binary < "#{tarball}" | openssl dgst -dss1 -sign "#{ARGV[5]}" | openssl enc -base64` puts "Signature: #{signature}" -fd = File.open(ARGV[3], 'r') +fd = File.open(ARGV[4], 'r') manifest = fd.read manifest["_SIGNATURE_"] = signature manifest["_ZIPFILE_"] = tarball manifest["_PLATFORM_"] = platform manifest["_TYPE_"] = platform -manifest["_BINARY_"] = ARGV[2] +manifest["_VERSION_"] = ARGV[1] +manifest["_BINARY_"] = ARGV[3] -resolverDir = "#{ARGV[5]}/resolvers/#{resolver}-#{platform}/content" +resolverDir = "#{ARGV[6]}/resolvers/#{resolver}-#{platform}/content" `mkdir -p #{resolverDir}` if not File.directory?(resolverDir) File.open("#{resolverDir}/metadata.desktop", "w") do |f| From ed3082752de0c091a2651d343072d1d38f2f0de7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Lindstr=C3=B6m?= Date: Wed, 8 May 2013 20:23:35 +0200 Subject: [PATCH 087/597] Add version arg --- spotify/spotify.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spotify/spotify.desktop b/spotify/spotify.desktop index d9ec6001f..2e08d6c57 100644 --- a/spotify/spotify.desktop +++ b/spotify/spotify.desktop @@ -14,5 +14,5 @@ X-KDE-PluginInfo-Name=spotify-_PLATFORM_ X-KDE-PluginInfo-Category=BinaryResolver X-KDE-PluginInfo-Author=Hugo and Leo X-KDE-PluginInfo-Email=lfranchi@kde.org -X-KDE-PluginInfo-Version=0.6.1 +X-KDE-PluginInfo-Version=_VERSION_ X-KDE-PluginInfo-Website=http://gettomahawk.com From 70ca3455164992afccc5e240ffb1d48167317b86 Mon Sep 17 00:00:00 2001 From: Roy Sindre Norangshol Date: Tue, 14 May 2013 21:27:05 +0200 Subject: [PATCH 088/597] Use proper value for album name in subsonic rest search (search2.view). --- subsonic/content/contents/code/subsonic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subsonic/content/contents/code/subsonic.js b/subsonic/content/contents/code/subsonic.js index 6c07ee6ab..ba7904848 100644 --- a/subsonic/content/contents/code/subsonic.js +++ b/subsonic/content/contents/code/subsonic.js @@ -281,7 +281,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { { if (albums[i].artist.toLowerCase() === artist.toLowerCase()) //search2 does partial matches { - results.push(albums[i].title) + results.push(albums[i].album) } } } @@ -289,7 +289,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { { if (albums.artist.toLowerCase() === artist.toLowerCase()) { - results.push(albums.title); + results.push(albums.album); } } From 883e73f57b5a5b037d65053265251bc3e5106431 Mon Sep 17 00:00:00 2001 From: Roy Sindre Norangshol Date: Tue, 14 May 2013 21:28:22 +0200 Subject: [PATCH 089/597] Add 1.9.0 to supported API version . Available since subsonic 4.8 release --- subsonic/content/contents/code/subsonic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subsonic/content/contents/code/subsonic.js b/subsonic/content/contents/code/subsonic.js index ba7904848..e2f435b49 100644 --- a/subsonic/content/contents/code/subsonic.js +++ b/subsonic/content/contents/code/subsonic.js @@ -100,7 +100,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { // We need at least 1.6.0 for resolve operations (JSON API support) // and 1.8.0 for scriptcollection - this.supported_api_versions = [ "1.6.0", "1.7.0", "1.8.0" ]; + this.supported_api_versions = [ "1.6.0", "1.7.0", "1.8.0", "1.9.0" ]; this.subsonic_api = 0; //let's ask the server which API version it actually supports. @@ -127,7 +127,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { if ( typeof Tomahawk.reportCapabilities == 'function' ) { - if ( that.subsonic_api != 2 ) //version 1.8.0, scriptcollection support + if ( that.subsonic_api < 2 ) //version 1.8.0 & 1.9.0, scriptcollection support Tomahawk.reportCapabilities( TomahawkResolverCapability.AccountFactory ); else Tomahawk.reportCapabilities( TomahawkResolverCapability.Browsable | TomahawkResolverCapability.AccountFactory ); From 9390a89f2559f243d89842418f1e9b7c703dbbdb Mon Sep 17 00:00:00 2001 From: Roy Sindre Norangshol Date: Tue, 14 May 2013 21:49:22 +0200 Subject: [PATCH 090/597] (subsonic) Don't spawn error bubble in down-left corner when there is no search results for an artist --- subsonic/content/contents/code/subsonic.js | 23 +++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/subsonic/content/contents/code/subsonic.js b/subsonic/content/contents/code/subsonic.js index e2f435b49..606e87dbf 100644 --- a/subsonic/content/contents/code/subsonic.js +++ b/subsonic/content/contents/code/subsonic.js @@ -234,23 +234,24 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { var doc = JSON.parse(xhr.responseText); Tomahawk.log("subsonic artists query:" + artists_url); Tomahawk.log("subsonic artists response:" + xhr.responseText); - var artists = doc["subsonic-response"].artists.index; + if (!!doc["subsonic-response"].artists) { // No search results yields empty string in 1.9.0 at least. + var artists = doc["subsonic-response"].artists.index; - for (var i = 0; i < artists.length; i++) - { - if ( artists[i].artist instanceof Array ) + for (var i = 0; i < artists.length; i++) { - for (var j = 0; j < artists[i].artist.length; j++) + if ( artists[i].artist instanceof Array ) { - results.push( artists[i].artist[j].name) + for (var j = 0; j < artists[i].artist.length; j++) + { + results.push( artists[i].artist[j].name) + } + } + else + { + results.push( artists[i].artist.name ) } - } - else - { - results.push( artists[i].artist.name ) } } - var return_artists = { qid: qid, artists: results From 8cb23a5229a98428b63bee332a36e027b62914a2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 May 2013 21:22:51 +0200 Subject: [PATCH 091/597] Allow 1.9.0 API and higher in Subsonic. --- subsonic/content/contents/code/subsonic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/subsonic/content/contents/code/subsonic.js b/subsonic/content/contents/code/subsonic.js index 6c07ee6ab..7854bf1e1 100644 --- a/subsonic/content/contents/code/subsonic.js +++ b/subsonic/content/contents/code/subsonic.js @@ -100,7 +100,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { // We need at least 1.6.0 for resolve operations (JSON API support) // and 1.8.0 for scriptcollection - this.supported_api_versions = [ "1.6.0", "1.7.0", "1.8.0" ]; + this.supported_api_versions = [ "1.6.0", "1.7.0", "1.8.0", "1.9.0" ]; this.subsonic_api = 0; //let's ask the server which API version it actually supports. @@ -127,7 +127,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { if ( typeof Tomahawk.reportCapabilities == 'function' ) { - if ( that.subsonic_api != 2 ) //version 1.8.0, scriptcollection support + if ( that.subsonic_api<2 ) //version 1.8.0, scriptcollection support Tomahawk.reportCapabilities( TomahawkResolverCapability.AccountFactory ); else Tomahawk.reportCapabilities( TomahawkResolverCapability.Browsable | TomahawkResolverCapability.AccountFactory ); From 290d34137b80eebbd985a6ff189297f5fc47ef65 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 May 2013 21:23:25 +0200 Subject: [PATCH 092/597] Bump! --- subsonic/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subsonic/content/metadata.json b/subsonic/content/metadata.json index 0e9f2d65a..fc06b328d 100644 --- a/subsonic/content/metadata.json +++ b/subsonic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "subsonic", "author": "mack_t and Teo", "email": "teo@kde.org", - "version": "0.5.1", + "version": "0.5.2", "website": "http://gettomahawk.com", "description": "Searches your Subsonic server for music to play", "platform": "any", From 4fa3af81be11927f1c18dedb49beeef3c92557a4 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 19 May 2013 17:47:24 +0200 Subject: [PATCH 093/597] Rename beets-resolver.js to beets.js --- beets/content/contents/code/{beets-resolver.js => beets.js} | 0 beets/content/metadata.json | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename beets/content/contents/code/{beets-resolver.js => beets.js} (100%) diff --git a/beets/content/contents/code/beets-resolver.js b/beets/content/contents/code/beets.js similarity index 100% rename from beets/content/contents/code/beets-resolver.js rename to beets/content/contents/code/beets.js diff --git a/beets/content/metadata.json b/beets/content/metadata.json index 0b9f3b981..0b1d43177 100644 --- a/beets/content/metadata.json +++ b/beets/content/metadata.json @@ -3,12 +3,12 @@ "pluginName": "beets", "author": "Adrian and Uwe", "email": "uwelk@xhochy.com", - "version": "0.4", + "version": "0.5", "website": "http://gettomahawk.com", "description": "Connects to a beets server and resolves tracks", "type": "resolver/javascript", "manifest": { - "main": "contents/code/beets-resolver.js", + "main": "contents/code/beets.js", "scripts": [], "icon": "contents/images/icon.png", "resources": [ From 3e31b2d9e28602c9a3759567f8e1070c644de498 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 26 May 2013 18:31:42 +0200 Subject: [PATCH 094/597] Offical.fm results do not need to be checked --- official.fm/content/contents/code/officialfm.js | 8 +++++--- official.fm/content/metadata.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/official.fm/content/contents/code/officialfm.js b/official.fm/content/contents/code/officialfm.js index 01db89913..119406d6c 100644 --- a/official.fm/content/contents/code/officialfm.js +++ b/official.fm/content/contents/code/officialfm.js @@ -24,13 +24,13 @@ var OfficialfmResolver = Tomahawk.extend(TomahawkResolver, { weight: 70, timeout: 5 }, - + spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, init: function () { this.secret = this.spell("yptuKlFHC3azLLcBNYoCHW6t30I1M5uy"); }, - + asyncRequest: function (url, callback) { var xmlHttpRequest = new XMLHttpRequest(); xmlHttpRequest.open('GET', url, true); @@ -86,6 +86,7 @@ var OfficialfmResolver = Tomahawk.extend(TomahawkResolver, { result.duration = track.duration; result.score = 0.85; result.url = track.streaming.http; + result.checked = true; resultObj.results.push(result); } @@ -127,6 +128,7 @@ var OfficialfmResolver = Tomahawk.extend(TomahawkResolver, { result.duration = track.duration; result.score = 0.85; result.url = track.streaming.http; + result.checked = true; resultObj.results.push(result); } @@ -137,4 +139,4 @@ var OfficialfmResolver = Tomahawk.extend(TomahawkResolver, { } }); -Tomahawk.resolver.instance = OfficialfmResolver; \ No newline at end of file +Tomahawk.resolver.instance = OfficialfmResolver; diff --git a/official.fm/content/metadata.json b/official.fm/content/metadata.json index 289b74a1f..d8bca1e6c 100644 --- a/official.fm/content/metadata.json +++ b/official.fm/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "officialfm", "author": "Leo and lasconic", "email": "lasconic@gmail.com", - "version": "1.0.5", + "version": "1.0.6", "website": "http://gettomahawk.com", "description": "Searches Official.fm for playable tracks", "type": "resolver/javascript", From 4cb0219949d191ceeaa84c2f38790e616436dd94 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 26 May 2013 19:07:57 +0200 Subject: [PATCH 095/597] [exfm] Return all results on resolving without checking * Remove async.js * Use Tomahawk's internal result checker --- exfm/content/contents/code/async-0.2.5.js | 955 -------------------- exfm/content/contents/code/exfm-resolver.js | 26 +- exfm/content/metadata.json | 3 +- 3 files changed, 2 insertions(+), 982 deletions(-) delete mode 100644 exfm/content/contents/code/async-0.2.5.js diff --git a/exfm/content/contents/code/async-0.2.5.js b/exfm/content/contents/code/async-0.2.5.js deleted file mode 100644 index 3ebad60c5..000000000 --- a/exfm/content/contents/code/async-0.2.5.js +++ /dev/null @@ -1,955 +0,0 @@ -/*global setImmediate: false, setTimeout: false, console: false */ -(function () { - - var async = {}; - - // global on the server, window in the browser - var root, previous_async; - - root = this; - if (root != null) { - previous_async = root.async; - } - - async.noConflict = function () { - root.async = previous_async; - return async; - }; - - function only_once(fn) { - var called = false; - return function() { - if (called) throw new Error("Callback was already called."); - called = true; - fn.apply(root, arguments); - } - } - - //// cross-browser compatiblity functions //// - - var _each = function (arr, iterator) { - if (arr.forEach) { - return arr.forEach(iterator); - } - for (var i = 0; i < arr.length; i += 1) { - iterator(arr[i], i, arr); - } - }; - - var _map = function (arr, iterator) { - if (arr.map) { - return arr.map(iterator); - } - var results = []; - _each(arr, function (x, i, a) { - results.push(iterator(x, i, a)); - }); - return results; - }; - - var _reduce = function (arr, iterator, memo) { - if (arr.reduce) { - return arr.reduce(iterator, memo); - } - _each(arr, function (x, i, a) { - memo = iterator(memo, x, i, a); - }); - return memo; - }; - - var _keys = function (obj) { - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var k in obj) { - if (obj.hasOwnProperty(k)) { - keys.push(k); - } - } - return keys; - }; - - //// exported async module functions //// - - //// nextTick implementation with browser-compatible fallback //// - if (typeof process === 'undefined' || !(process.nextTick)) { - if (typeof setImmediate === 'function') { - async.nextTick = function (fn) { - setImmediate(fn); - }; - } - else { - async.nextTick = function (fn) { - setTimeout(fn, 0); - }; - } - } - else { - async.nextTick = process.nextTick; - } - - async.each = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - _each(arr, function (x) { - iterator(x, only_once(function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - } - })); - }); - }; - async.forEach = async.each; - - async.eachSeries = function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length) { - return callback(); - } - var completed = 0; - var iterate = function () { - var sync = true; - iterator(arr[completed], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - if (completed >= arr.length) { - callback(null); - } - else { - if (sync) { - async.nextTick(iterate); - } - else { - iterate(); - } - } - } - }); - sync = false; - }; - iterate(); - }; - async.forEachSeries = async.eachSeries; - - async.eachLimit = function (arr, limit, iterator, callback) { - var fn = _eachLimit(limit); - fn.apply(null, [arr, iterator, callback]); - }; - async.forEachLimit = async.eachLimit; - - var _eachLimit = function (limit) { - - return function (arr, iterator, callback) { - callback = callback || function () {}; - if (!arr.length || limit <= 0) { - return callback(); - } - var completed = 0; - var started = 0; - var running = 0; - - (function replenish () { - if (completed >= arr.length) { - return callback(); - } - - while (running < limit && started < arr.length) { - started += 1; - running += 1; - iterator(arr[started - 1], function (err) { - if (err) { - callback(err); - callback = function () {}; - } - else { - completed += 1; - running -= 1; - if (completed >= arr.length) { - callback(); - } - else { - replenish(); - } - } - }); - } - })(); - }; - }; - - - var doParallel = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.each].concat(args)); - }; - }; - var doParallelLimit = function(limit, fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [_eachLimit(limit)].concat(args)); - }; - }; - var doSeries = function (fn) { - return function () { - var args = Array.prototype.slice.call(arguments); - return fn.apply(null, [async.eachSeries].concat(args)); - }; - }; - - - var _asyncMap = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (err, v) { - results[x.index] = v; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - }; - async.map = doParallel(_asyncMap); - async.mapSeries = doSeries(_asyncMap); - async.mapLimit = function (arr, limit, iterator, callback) { - return _mapLimit(limit)(arr, iterator, callback); - }; - - var _mapLimit = function(limit) { - return doParallelLimit(limit, _asyncMap); - }; - - // reduce only has a series version, as doing reduce in parallel won't - // work in many situations. - async.reduce = function (arr, memo, iterator, callback) { - async.eachSeries(arr, function (x, callback) { - iterator(memo, x, function (err, v) { - memo = v; - callback(err); - }); - }, function (err) { - callback(err, memo); - }); - }; - // inject alias - async.inject = async.reduce; - // foldl alias - async.foldl = async.reduce; - - async.reduceRight = function (arr, memo, iterator, callback) { - var reversed = _map(arr, function (x) { - return x; - }).reverse(); - async.reduce(reversed, memo, iterator, callback); - }; - // foldr alias - async.foldr = async.reduceRight; - - var _filter = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.filter = doParallel(_filter); - async.filterSeries = doSeries(_filter); - // select alias - async.select = async.filter; - async.selectSeries = async.filterSeries; - - var _reject = function (eachfn, arr, iterator, callback) { - var results = []; - arr = _map(arr, function (x, i) { - return {index: i, value: x}; - }); - eachfn(arr, function (x, callback) { - iterator(x.value, function (v) { - if (!v) { - results.push(x); - } - callback(); - }); - }, function (err) { - callback(_map(results.sort(function (a, b) { - return a.index - b.index; - }), function (x) { - return x.value; - })); - }); - }; - async.reject = doParallel(_reject); - async.rejectSeries = doSeries(_reject); - - var _detect = function (eachfn, arr, iterator, main_callback) { - eachfn(arr, function (x, callback) { - iterator(x, function (result) { - if (result) { - main_callback(x); - main_callback = function () {}; - } - else { - callback(); - } - }); - }, function (err) { - main_callback(); - }); - }; - async.detect = doParallel(_detect); - async.detectSeries = doSeries(_detect); - - async.some = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (v) { - main_callback(true); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(false); - }); - }; - // any alias - async.any = async.some; - - async.every = function (arr, iterator, main_callback) { - async.each(arr, function (x, callback) { - iterator(x, function (v) { - if (!v) { - main_callback(false); - main_callback = function () {}; - } - callback(); - }); - }, function (err) { - main_callback(true); - }); - }; - // all alias - async.all = async.every; - - async.sortBy = function (arr, iterator, callback) { - async.map(arr, function (x, callback) { - iterator(x, function (err, criteria) { - if (err) { - callback(err); - } - else { - callback(null, {value: x, criteria: criteria}); - } - }); - }, function (err, results) { - if (err) { - return callback(err); - } - else { - var fn = function (left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }; - callback(null, _map(results.sort(fn), function (x) { - return x.value; - })); - } - }); - }; - - async.auto = function (tasks, callback) { - callback = callback || function () {}; - var keys = _keys(tasks); - if (!keys.length) { - return callback(null); - } - - var results = {}; - - var listeners = []; - var addListener = function (fn) { - listeners.unshift(fn); - }; - var removeListener = function (fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } - }; - var taskComplete = function () { - _each(listeners.slice(0), function (fn) { - fn(); - }); - }; - - addListener(function () { - if (_keys(results).length === keys.length) { - callback(null, results); - callback = function () {}; - } - }); - - _each(keys, function (k) { - var task = (tasks[k] instanceof Function) ? [tasks[k]]: tasks[k]; - var taskCallback = function (err) { - if (err) { - callback(err); - // stop subsequent errors hitting callback multiple times - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - async.nextTick(taskComplete); - } - }; - var requires = task.slice(0, Math.abs(task.length - 1)) || []; - var ready = function () { - return _reduce(requires, function (a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); - }; - if (ready()) { - task[task.length - 1](taskCallback, results); - } - else { - var listener = function () { - if (ready()) { - removeListener(listener); - task[task.length - 1](taskCallback, results); - } - }; - addListener(listener); - } - }); - }; - - async.waterfall = function (tasks, callback) { - callback = callback || function () {}; - if (!tasks.length) { - return callback(); - } - var wrapIterator = function (iterator) { - return function (err) { - if (err) { - callback.apply(null, arguments); - callback = function () {}; - } - else { - var args = Array.prototype.slice.call(arguments, 1); - var next = iterator.next(); - if (next) { - args.push(wrapIterator(next)); - } - else { - args.push(callback); - } - async.nextTick(function () { - iterator.apply(null, args); - }); - } - }; - }; - wrapIterator(async.iterator(tasks))(); - }; - - var _parallel = function(eachfn, tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - eachfn.map(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - eachfn.each(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.parallel = function (tasks, callback) { - _parallel({ map: async.map, each: async.each }, tasks, callback); - }; - - async.parallelLimit = function(tasks, limit, callback) { - _parallel({ map: _mapLimit(limit), each: _eachLimit(limit) }, tasks, callback); - }; - - async.series = function (tasks, callback) { - callback = callback || function () {}; - if (tasks.constructor === Array) { - async.mapSeries(tasks, function (fn, callback) { - if (fn) { - fn(function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - callback.call(null, err, args); - }); - } - }, callback); - } - else { - var results = {}; - async.eachSeries(_keys(tasks), function (k, callback) { - tasks[k](function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (args.length <= 1) { - args = args[0]; - } - results[k] = args; - callback(err); - }); - }, function (err) { - callback(err, results); - }); - } - }; - - async.iterator = function (tasks) { - var makeCallback = function (index) { - var fn = function () { - if (tasks.length) { - tasks[index].apply(null, arguments); - } - return fn.next(); - }; - fn.next = function () { - return (index < tasks.length - 1) ? makeCallback(index + 1): null; - }; - return fn; - }; - return makeCallback(0); - }; - - async.apply = function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return fn.apply( - null, args.concat(Array.prototype.slice.call(arguments)) - ); - }; - }; - - var _concat = function (eachfn, arr, fn, callback) { - var r = []; - eachfn(arr, function (x, cb) { - fn(x, function (err, y) { - r = r.concat(y || []); - cb(err); - }); - }, function (err) { - callback(err, r); - }); - }; - async.concat = doParallel(_concat); - async.concatSeries = doSeries(_concat); - - async.whilst = function (test, iterator, callback) { - if (test()) { - var sync = true; - iterator(function (err) { - if (err) { - return callback(err); - } - if (sync) { - async.nextTick(function () { - async.whilst(test, iterator, callback); - }); - } - else { - async.whilst(test, iterator, callback); - } - }); - sync = false; - } - else { - callback(); - } - }; - - async.doWhilst = function (iterator, test, callback) { - var sync = true; - iterator(function (err) { - if (err) { - return callback(err); - } - if (test()) { - if (sync) { - async.nextTick(function () { - async.doWhilst(iterator, test, callback); - }); - } - else { - async.doWhilst(iterator, test, callback); - } - } - else { - callback(); - } - }); - sync = false; - }; - - async.until = function (test, iterator, callback) { - if (!test()) { - var sync = true; - iterator(function (err) { - if (err) { - return callback(err); - } - if (sync) { - async.nextTick(function () { - async.until(test, iterator, callback); - }); - } - else { - async.until(test, iterator, callback); - } - }); - sync = false; - } - else { - callback(); - } - }; - - async.doUntil = function (iterator, test, callback) { - var sync = true; - iterator(function (err) { - if (err) { - return callback(err); - } - if (!test()) { - if (sync) { - async.nextTick(function () { - async.doUntil(iterator, test, callback); - }); - } - else { - async.doUntil(iterator, test, callback); - } - } - else { - callback(); - } - }); - sync = false; - }; - - async.queue = function (worker, concurrency) { - function _insert(q, data, pos, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - var item = { - data: task, - callback: typeof callback === 'function' ? callback : null - }; - - if (pos) { - q.tasks.unshift(item); - } else { - q.tasks.push(item); - } - - if (q.saturated && q.tasks.length === concurrency) { - q.saturated(); - } - async.nextTick(q.process); - }); - } - - var workers = 0; - var q = { - tasks: [], - concurrency: concurrency, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - _insert(q, data, false, callback); - }, - unshift: function (data, callback) { - _insert(q, data, true, callback); - }, - process: function () { - if (workers < q.concurrency && q.tasks.length) { - var task = q.tasks.shift(); - if (q.empty && q.tasks.length === 0) { - q.empty(); - } - workers += 1; - var sync = true; - var next = function () { - workers -= 1; - if (task.callback) { - task.callback.apply(task, arguments); - } - if (q.drain && q.tasks.length + workers === 0) { - q.drain(); - } - q.process(); - }; - var cb = only_once(function () { - var cbArgs = arguments; - - if (sync) { - async.nextTick(function () { - next.apply(null, cbArgs); - }); - } else { - next.apply(null, arguments); - } - }); - worker(task.data, cb); - sync = false; - } - }, - length: function () { - return q.tasks.length; - }, - running: function () { - return workers; - } - }; - return q; - }; - - async.cargo = function (worker, payload) { - var working = false, - tasks = []; - - var cargo = { - tasks: tasks, - payload: payload, - saturated: null, - empty: null, - drain: null, - push: function (data, callback) { - if(data.constructor !== Array) { - data = [data]; - } - _each(data, function(task) { - tasks.push({ - data: task, - callback: typeof callback === 'function' ? callback : null - }); - if (cargo.saturated && tasks.length === payload) { - cargo.saturated(); - } - }); - async.nextTick(cargo.process); - }, - process: function process() { - if (working) return; - if (tasks.length === 0) { - if(cargo.drain) cargo.drain(); - return; - } - - var ts = typeof payload === 'number' - ? tasks.splice(0, payload) - : tasks.splice(0); - - var ds = _map(ts, function (task) { - return task.data; - }); - - if(cargo.empty) cargo.empty(); - working = true; - worker(ds, function () { - working = false; - - var args = arguments; - _each(ts, function (data) { - if (data.callback) { - data.callback.apply(null, args); - } - }); - - process(); - }); - }, - length: function () { - return tasks.length; - }, - running: function () { - return working; - } - }; - return cargo; - }; - - var _console_fn = function (name) { - return function (fn) { - var args = Array.prototype.slice.call(arguments, 1); - fn.apply(null, args.concat([function (err) { - var args = Array.prototype.slice.call(arguments, 1); - if (typeof console !== 'undefined') { - if (err) { - if (console.error) { - console.error(err); - } - } - else if (console[name]) { - _each(args, function (x) { - console[name](x); - }); - } - } - }])); - }; - }; - async.log = _console_fn('log'); - async.dir = _console_fn('dir'); - /*async.info = _console_fn('info'); - async.warn = _console_fn('warn'); - async.error = _console_fn('error');*/ - - async.memoize = function (fn, hasher) { - var memo = {}; - var queues = {}; - hasher = hasher || function (x) { - return x; - }; - var memoized = function () { - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - var key = hasher.apply(null, args); - if (key in memo) { - callback.apply(null, memo[key]); - } - else if (key in queues) { - queues[key].push(callback); - } - else { - queues[key] = [callback]; - fn.apply(null, args.concat([function () { - memo[key] = arguments; - var q = queues[key]; - delete queues[key]; - for (var i = 0, l = q.length; i < l; i++) { - q[i].apply(null, arguments); - } - }])); - } - }; - memoized.memo = memo; - memoized.unmemoized = fn; - return memoized; - }; - - async.unmemoize = function (fn) { - return function () { - return (fn.unmemoized || fn).apply(null, arguments); - }; - }; - - async.times = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.map(counter, iterator, callback); - }; - - async.timesSeries = function (count, iterator, callback) { - var counter = []; - for (var i = 0; i < count; i++) { - counter.push(i); - } - return async.mapSeries(counter, iterator, callback); - }; - - async.compose = function (/* functions... */) { - var fns = Array.prototype.reverse.call(arguments); - return function () { - var that = this; - var args = Array.prototype.slice.call(arguments); - var callback = args.pop(); - async.reduce(fns, args, function (newargs, fn, cb) { - fn.apply(that, newargs.concat([function () { - var err = arguments[0]; - var nextargs = Array.prototype.slice.call(arguments, 1); - cb(err, nextargs); - }])) - }, - function (err, results) { - callback.apply(that, [err].concat(results)); - }); - }; - }; - - // AMD / RequireJS - if (typeof define !== 'undefined' && define.amd) { - define([], function () { - return async; - }); - } - // Node.js - else if (typeof module !== 'undefined' && module.exports) { - module.exports = async; - } - // included directly via + + + + +` + +var tokenTemplate = template.Must(template.New("name").Parse(tokenTemplateHTML)) + +func handler(w http.ResponseWriter, r *http.Request) { + err := tokenTemplate.Execute(w, r.FormValue("access_token")) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} diff --git a/beatsmusic/authproxy/index.html b/beatsmusic/authproxy/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/beatsmusic/authproxy/jquery.clipboard.swf b/beatsmusic/authproxy/jquery.clipboard.swf new file mode 100644 index 0000000000000000000000000000000000000000..ed962a56d1173f1cef99d0c2a61e21f9aabae46e GIT binary patch literal 1923 zcmV-}2YmQLS5pqQ3jhFk+I?1AbJN-t-dmQmCHWHDNlXYg1A$ynVmsk*4k6?ad?A4Z z(>Q@s%EjCAmaT&#xsseqFH`2s^e6P4zVxYY{Q>;}o#`lH+P?Rp)BcIlCD}Of>1jRj z(psOswf4G6@gd^>j!@!v2u)yAN}Wdt{c7}27@-xXsV{GrD%rz5({h)=xFZ-o7x~~r|Xzu$flNKCfj3{=jI9v1qjsCmUY|Nquwg*bWB5|LAc!EyxX?5cL#Kz z&Fdz0+bg+KV&LN$p2=3%ns$R_D<(V4-p;O_`iJZuB_KCX6J0%1CJnq7GFeg5AT)gMmG~A9!kHlKX zF+3(Vx}IlSk_N0DcIYYJx?3;?lWjDWy&yQaYwzSxt?n~N>S<=e+_5k2aR2@PC3_JiCg^;TD$q ztziz)JjaAICAV$pLB7J8 zJ5qZ49-I`1tv%gSspZg4+t6IO!60PCFij=Q^@Y*&+R;#5XGW{-Nlk|yY(xD}LZ?k7 z+H4lvhS?N~n;XR^Nif4!Y#NXtbXeJ{?$*k0tIx~Za$nuu>4T-}i>Fdg-F=qmxAPDR zw5XXX_myxaI_ya_I0-6hQ0*Nbv_-7-wgeur!FEcpX&n=q#CyTB2=6Ys4O`8EZV3lL zEn+(?gNKfrBj1}^d}zR_|5}I44{uRAgEM?anUDn}O=YG9bPi{3P0Ew%|L=5iStnBEeUQc!Q7`f@cYyljktO1-SrnQC`Fs;JQTcZG!I*{1u7Z zC3uv3=Brp<3Fd|8eq!dPS8Y5*Cqv#k$F~pCH z7@x-(k;CX*DuO3cJcr|$z|Q(Ws+MDvV)v<{CxJ;8n520U(he^;`iL&j?-y`J|63r=w*;sXcpvE zdTk16!pV1fk&Zio%xGPr$g@FxvkzfP|&ibCoipFT;VBz%O}5g{TgA2`1!p2yWMaHvh8 zx%v(L4t&3?e#HZn!}RX!Wl*Zi0izz#@A-PHy2AC0`@S9@7^}XX7#Lss`pCd|;Oj{+ z>TBw_ucxaI18vOLQ#~!?>!YCg>T^i8GJ&dN988BNoUF|G`FhdUm1+t5>W_n3)R!Ou zfr@s4%mLX~aa#cofd`MIpZC>dz^qK*UL9e=@|C1~Ep5 zaG3*~0Dc^%paiB2rY;}TB>~^(Xnd1b^S4OW~(YfSMi+es&H29D4xB Je*oi0MM?K&#aaLW literal 0 HcmV?d00001 diff --git a/beatsmusic/authproxy/js/jquery.clipboard.js b/beatsmusic/authproxy/js/jquery.clipboard.js new file mode 100644 index 000000000..16fbb5315 --- /dev/null +++ b/beatsmusic/authproxy/js/jquery.clipboard.js @@ -0,0 +1,1110 @@ +/* + * jQuery Clipboard :: Fork of zClip :: Uses ZeroClipboard v1.3.2 + * + * https://github.com/valeriansaliou/jquery.clipboard + * http://www.steamdev.com/zclip/ + * + * Copyright 2014, Valerian Saliou + * Copyright 2011, SteamDev + * + * Released under the MIT license. + * http://www.opensource.org/licenses/mit-license.php + * + * Version: v1.3 + * Date: Sat Mar 1, 2014 + */ + +/* Component: jQuery Clipboard */ +(function ($) { + var $clip = null; + var $is_loaded = false; + + $.fn.clipboard = function (params) { + if ((typeof params == 'object' && !params.length) || (typeof params == 'undefined')) { + var settings = $.extend({ + path: 'jquery.clipboard.swf', + copy: null, + beforeCopy: null, + afterCopy: null, + clickAfter: true + }, (params || {})); + + return this.each(function () { + var o = $(this); + + if (o.is(':visible') && (typeof settings.copy == 'string' || $.isFunction(settings.copy))) { + if ($.isFunction(settings.copy)) { + o.bind('Clipboard_copy',settings.copy); + } + if ($.isFunction(settings.beforeCopy)) { + o.bind('Clipboard_beforeCopy',settings.beforeCopy); + } + if ($.isFunction(settings.afterCopy)) { + o.bind('Clipboard_afterCopy',settings.afterCopy); + } + + if($clip === null) { + ZeroClipboard.config({ + moviePath: settings.path, + trustedDomains: '*', + hoverClass: 'hover', + activeClass: 'active' + }); + + $clip = new ZeroClipboard(null); + + $clip.on('load', function(client) { + client.on('mouseover', function (client) { + $(this).trigger('mouseenter'); + }); + + client.on('mouseout', function (client) { + $(this).trigger('mouseleave'); + }); + + client.on('mousedown', function (client) { + $(this).trigger('mousedown'); + + if (!$.isFunction(settings.copy)) { + client.setText(settings.copy); + } else { + client.setText($(this).triggerHandler('Clipboard_copy')); + } + + if ($.isFunction(settings.beforeCopy)) { + $(this).trigger('Clipboard_beforeCopy'); + } + }); + + client.on('complete', function (client, args) { + if ($.isFunction(settings.afterCopy)) { + $(this).trigger('Clipboard_afterCopy'); + } else { + $(this).removeClass('hover'); + } + + if (settings.clickAfter) { + $(this).trigger('click'); + } + }); + }); + } + + $clip.clip([o[0]]); + } + }); + } + }; +})(jQuery); + +/* Component: ZeroClipboard */ +/*! +* ZeroClipboard +* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface. +* Copyright (c) 2014 Jon Rohan, James M. Greene +* Licensed MIT +* http://zeroclipboard.org/ +* v1.3.2 +*/ +(function() { + "use strict"; + var currentElement; + var flashState = { + bridge: null, + version: "0.0.0", + disabled: null, + outdated: null, + ready: null + }; + var _clipData = {}; + var clientIdCounter = 0; + var _clientMeta = {}; + var elementIdCounter = 0; + var _elementMeta = {}; + var _amdModuleId = null; + var _cjsModuleId = null; + var _swfPath = function() { + var i, jsDir, tmpJsPath, jsPath, swfPath = "ZeroClipboard.swf"; + if (document.currentScript && (jsPath = document.currentScript.src)) {} else { + var scripts = document.getElementsByTagName("script"); + if ("readyState" in scripts[0]) { + for (i = scripts.length; i--; ) { + if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) { + break; + } + } + } else if (document.readyState === "loading") { + jsPath = scripts[scripts.length - 1].src; + } else { + for (i = scripts.length; i--; ) { + tmpJsPath = scripts[i].src; + if (!tmpJsPath) { + jsDir = null; + break; + } + tmpJsPath = tmpJsPath.split("#")[0].split("?")[0]; + tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf("/") + 1); + if (jsDir === null) { + jsDir = tmpJsPath; + } else if (jsDir !== tmpJsPath) { + jsDir = null; + break; + } + } + if (jsDir !== null) { + jsPath = jsDir; + } + } + } + if (jsPath) { + jsPath = jsPath.split("#")[0].split("?")[0]; + swfPath = jsPath.slice(0, jsPath.lastIndexOf("/") + 1) + swfPath; + } + return swfPath; + }(); + var _camelizeCssPropName = function() { + var matcherRegex = /\-([a-z])/g, replacerFn = function(match, group) { + return group.toUpperCase(); + }; + return function(prop) { + return prop.replace(matcherRegex, replacerFn); + }; + }(); + var _getStyle = function(el, prop) { + var value, camelProp, tagName, possiblePointers, i, len; + if (window.getComputedStyle) { + value = window.getComputedStyle(el, null).getPropertyValue(prop); + } else { + camelProp = _camelizeCssPropName(prop); + if (el.currentStyle) { + value = el.currentStyle[camelProp]; + } else { + value = el.style[camelProp]; + } + } + if (prop === "cursor") { + if (!value || value === "auto") { + tagName = el.tagName.toLowerCase(); + if (tagName === "a") { + return "pointer"; + } + } + } + return value; + }; + var _elementMouseOver = function(event) { + if (!event) { + event = window.event; + } + var target; + if (this !== window) { + target = this; + } else if (event.target) { + target = event.target; + } else if (event.srcElement) { + target = event.srcElement; + } + ZeroClipboard.activate(target); + }; + var _addEventHandler = function(element, method, func) { + if (!element || element.nodeType !== 1) { + return; + } + if (element.addEventListener) { + element.addEventListener(method, func, false); + } else if (element.attachEvent) { + element.attachEvent("on" + method, func); + } + }; + var _removeEventHandler = function(element, method, func) { + if (!element || element.nodeType !== 1) { + return; + } + if (element.removeEventListener) { + element.removeEventListener(method, func, false); + } else if (element.detachEvent) { + element.detachEvent("on" + method, func); + } + }; + var _addClass = function(element, value) { + if (!element || element.nodeType !== 1) { + return element; + } + if (element.classList) { + if (!element.classList.contains(value)) { + element.classList.add(value); + } + return element; + } + if (value && typeof value === "string") { + var classNames = (value || "").split(/\s+/); + if (element.nodeType === 1) { + if (!element.className) { + element.className = value; + } else { + var className = " " + element.className + " ", setClass = element.className; + for (var c = 0, cl = classNames.length; c < cl; c++) { + if (className.indexOf(" " + classNames[c] + " ") < 0) { + setClass += " " + classNames[c]; + } + } + element.className = setClass.replace(/^\s+|\s+$/g, ""); + } + } + } + return element; + }; + var _removeClass = function(element, value) { + if (!element || element.nodeType !== 1) { + return element; + } + if (element.classList) { + if (element.classList.contains(value)) { + element.classList.remove(value); + } + return element; + } + if (value && typeof value === "string" || value === undefined) { + var classNames = (value || "").split(/\s+/); + if (element.nodeType === 1 && element.className) { + if (value) { + var className = (" " + element.className + " ").replace(/[\n\t]/g, " "); + for (var c = 0, cl = classNames.length; c < cl; c++) { + className = className.replace(" " + classNames[c] + " ", " "); + } + element.className = className.replace(/^\s+|\s+$/g, ""); + } else { + element.className = ""; + } + } + } + return element; + }; + var _getZoomFactor = function() { + var rect, physicalWidth, logicalWidth, zoomFactor = 1; + if (typeof document.body.getBoundingClientRect === "function") { + rect = document.body.getBoundingClientRect(); + physicalWidth = rect.right - rect.left; + logicalWidth = document.body.offsetWidth; + zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100; + } + return zoomFactor; + }; + var _getDOMObjectPosition = function(obj, defaultZIndex) { + var info = { + left: 0, + top: 0, + width: 0, + height: 0, + zIndex: _getSafeZIndex(defaultZIndex) - 1 + }; + if (obj.getBoundingClientRect) { + var rect = obj.getBoundingClientRect(); + var pageXOffset, pageYOffset, zoomFactor; + if ("pageXOffset" in window && "pageYOffset" in window) { + pageXOffset = window.pageXOffset; + pageYOffset = window.pageYOffset; + } else { + zoomFactor = _getZoomFactor(); + pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor); + pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor); + } + var leftBorderWidth = document.documentElement.clientLeft || 0; + var topBorderWidth = document.documentElement.clientTop || 0; + info.left = rect.left + pageXOffset - leftBorderWidth; + info.top = rect.top + pageYOffset - topBorderWidth; + info.width = "width" in rect ? rect.width : rect.right - rect.left; + info.height = "height" in rect ? rect.height : rect.bottom - rect.top; + } + return info; + }; + var _cacheBust = function(path, options) { + var cacheBust = options === null || options && options.cacheBust === true && options.useNoCache === true; + if (cacheBust) { + return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + new Date().getTime(); + } else { + return ""; + } + }; + var _vars = function(options) { + var i, len, domain, str = [], domains = [], trustedOriginsExpanded = []; + if (options.trustedOrigins) { + if (typeof options.trustedOrigins === "string") { + domains.push(options.trustedOrigins); + } else if (typeof options.trustedOrigins === "object" && "length" in options.trustedOrigins) { + domains = domains.concat(options.trustedOrigins); + } + } + if (options.trustedDomains) { + if (typeof options.trustedDomains === "string") { + domains.push(options.trustedDomains); + } else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) { + domains = domains.concat(options.trustedDomains); + } + } + if (domains.length) { + for (i = 0, len = domains.length; i < len; i++) { + if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === "string") { + domain = _extractDomain(domains[i]); + if (!domain) { + continue; + } + if (domain === "*") { + trustedOriginsExpanded = [ domain ]; + break; + } + trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, "//" + domain, window.location.protocol + "//" + domain ]); + } + } + } + if (trustedOriginsExpanded.length) { + str.push("trustedOrigins=" + encodeURIComponent(trustedOriginsExpanded.join(","))); + } + if (typeof options.jsModuleId === "string" && options.jsModuleId) { + str.push("jsModuleId=" + encodeURIComponent(options.jsModuleId)); + } + return str.join("&"); + }; + var _inArray = function(elem, array, fromIndex) { + if (typeof array.indexOf === "function") { + return array.indexOf(elem, fromIndex); + } + var i, len = array.length; + if (typeof fromIndex === "undefined") { + fromIndex = 0; + } else if (fromIndex < 0) { + fromIndex = len + fromIndex; + } + for (i = fromIndex; i < len; i++) { + if (array.hasOwnProperty(i) && array[i] === elem) { + return i; + } + } + return -1; + }; + var _prepClip = function(elements) { + if (typeof elements === "string") throw new TypeError("ZeroClipboard doesn't accept query strings."); + if (!elements.length) return [ elements ]; + return elements; + }; + var _dispatchCallback = function(func, context, args, async) { + if (async) { + window.setTimeout(function() { + func.apply(context, args); + }, 0); + } else { + func.apply(context, args); + } + }; + var _getSafeZIndex = function(val) { + var zIndex, tmp; + if (val) { + if (typeof val === "number" && val > 0) { + zIndex = val; + } else if (typeof val === "string" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) { + zIndex = tmp; + } + } + if (!zIndex) { + if (typeof _globalConfig.zIndex === "number" && _globalConfig.zIndex > 0) { + zIndex = _globalConfig.zIndex; + } else if (typeof _globalConfig.zIndex === "string" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) { + zIndex = tmp; + } + } + return zIndex || 0; + }; + var _deprecationWarning = function(deprecatedApiName, debugEnabled) { + if (deprecatedApiName && debugEnabled !== false && typeof console !== "undefined" && console && (console.warn || console.log)) { + var deprecationWarning = "`" + deprecatedApiName + "` is deprecated. See docs for more info:\n" + " https://github.com/zeroclipboard/zeroclipboard/blob/master/docs/instructions.md#deprecations"; + if (console.warn) { + console.warn(deprecationWarning); + } else { + console.log(deprecationWarning); + } + } + }; + var _extend = function() { + var i, len, arg, prop, src, copy, target = arguments[0] || {}; + for (i = 1, len = arguments.length; i < len; i++) { + if ((arg = arguments[i]) !== null) { + for (prop in arg) { + if (arg.hasOwnProperty(prop)) { + src = target[prop]; + copy = arg[prop]; + if (target === copy) { + continue; + } + if (copy !== undefined) { + target[prop] = copy; + } + } + } + } + } + return target; + }; + var _extractDomain = function(originOrUrl) { + if (originOrUrl === null || originOrUrl === "") { + return null; + } + originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, ""); + if (originOrUrl === "") { + return null; + } + var protocolIndex = originOrUrl.indexOf("//"); + originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2); + var pathIndex = originOrUrl.indexOf("/"); + originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex); + if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") { + return null; + } + return originOrUrl || null; + }; + var _determineScriptAccess = function() { + var _extractAllDomains = function(origins, resultsArray) { + var i, len, tmp; + if (origins !== null && resultsArray[0] !== "*") { + if (typeof origins === "string") { + origins = [ origins ]; + } + if (typeof origins === "object" && "length" in origins) { + for (i = 0, len = origins.length; i < len; i++) { + if (origins.hasOwnProperty(i)) { + tmp = _extractDomain(origins[i]); + if (tmp) { + if (tmp === "*") { + resultsArray.length = 0; + resultsArray.push("*"); + break; + } + if (_inArray(tmp, resultsArray) === -1) { + resultsArray.push(tmp); + } + } + } + } + } + } + }; + var _accessLevelLookup = { + always: "always", + samedomain: "sameDomain", + never: "never" + }; + return function(currentDomain, configOptions) { + var asaLower, allowScriptAccess = configOptions.allowScriptAccess; + if (typeof allowScriptAccess === "string" && (asaLower = allowScriptAccess.toLowerCase()) && /^always|samedomain|never$/.test(asaLower)) { + return _accessLevelLookup[asaLower]; + } + var swfDomain = _extractDomain(configOptions.moviePath); + if (swfDomain === null) { + swfDomain = currentDomain; + } + var trustedDomains = []; + _extractAllDomains(configOptions.trustedOrigins, trustedDomains); + _extractAllDomains(configOptions.trustedDomains, trustedDomains); + var len = trustedDomains.length; + if (len > 0) { + if (len === 1 && trustedDomains[0] === "*") { + return "always"; + } + if (_inArray(currentDomain, trustedDomains) !== -1) { + if (len === 1 && currentDomain === swfDomain) { + return "sameDomain"; + } + return "always"; + } + } + return "never"; + }; + }(); + var _objectKeys = function(obj) { + if (obj === null) { + return []; + } + if (Object.keys) { + return Object.keys(obj); + } + var keys = []; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + keys.push(prop); + } + } + return keys; + }; + var _deleteOwnProperties = function(obj) { + if (obj) { + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + delete obj[prop]; + } + } + } + return obj; + }; + var _detectFlashSupport = function() { + var hasFlash = false; + if (typeof flashState.disabled === "boolean") { + hasFlash = flashState.disabled === false; + } else { + if (typeof ActiveXObject === "function") { + try { + if (new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) { + hasFlash = true; + } + } catch (error) {} + } + if (!hasFlash && navigator.mimeTypes["application/x-shockwave-flash"]) { + hasFlash = true; + } + } + return hasFlash; + }; + function _parseFlashVersion(flashVersion) { + return flashVersion.replace(/,/g, ".").replace(/[^0-9\.]/g, ""); + } + function _isFlashVersionSupported(flashVersion) { + return parseFloat(_parseFlashVersion(flashVersion)) >= 10; + } + var ZeroClipboard = function(elements, options) { + if (!(this instanceof ZeroClipboard)) { + return new ZeroClipboard(elements, options); + } + this.id = "" + clientIdCounter++; + _clientMeta[this.id] = { + instance: this, + elements: [], + handlers: {} + }; + if (elements) { + this.clip(elements); + } + if (typeof options !== "undefined") { + _deprecationWarning("new ZeroClipboard(elements, options)", _globalConfig.debug); + ZeroClipboard.config(options); + } + this.options = ZeroClipboard.config(); + if (typeof flashState.disabled !== "boolean") { + flashState.disabled = !_detectFlashSupport(); + } + if (flashState.disabled === false && flashState.outdated !== true) { + if (flashState.bridge === null) { + flashState.outdated = false; + flashState.ready = false; + _bridge(); + } + } + }; + ZeroClipboard.prototype.setText = function(newText) { + if (newText && newText !== "") { + _clipData["text/plain"] = newText; + if (flashState.ready === true && flashState.bridge) { + flashState.bridge.setText(newText); + } else {} + } + return this; + }; + ZeroClipboard.prototype.setSize = function(width, height) { + if (flashState.ready === true && flashState.bridge) { + flashState.bridge.setSize(width, height); + } else {} + return this; + }; + var _setHandCursor = function(enabled) { + if (flashState.ready === true && flashState.bridge) { + flashState.bridge.setHandCursor(enabled); + } else {} + }; + ZeroClipboard.prototype.destroy = function() { + this.unclip(); + this.off(); + delete _clientMeta[this.id]; + }; + var _getAllClients = function() { + var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta); + for (i = 0, len = clientIds.length; i < len; i++) { + client = _clientMeta[clientIds[i]].instance; + if (client && client instanceof ZeroClipboard) { + clients.push(client); + } + } + return clients; + }; + ZeroClipboard.version = "1.3.2"; + var _globalConfig = { + swfPath: _swfPath, + trustedDomains: window.location.host ? [ window.location.host ] : [], + cacheBust: true, + forceHandCursor: false, + zIndex: 999999999, + debug: true, + title: null, + autoActivate: true + }; + ZeroClipboard.config = function(options) { + if (typeof options === "object" && options !== null) { + _extend(_globalConfig, options); + } + if (typeof options === "string" && options) { + if (_globalConfig.hasOwnProperty(options)) { + return _globalConfig[options]; + } + return; + } + var copy = {}; + for (var prop in _globalConfig) { + if (_globalConfig.hasOwnProperty(prop)) { + if (typeof _globalConfig[prop] === "object" && _globalConfig[prop] !== null) { + if ("length" in _globalConfig[prop]) { + copy[prop] = _globalConfig[prop].slice(0); + } else { + copy[prop] = _extend({}, _globalConfig[prop]); + } + } else { + copy[prop] = _globalConfig[prop]; + } + } + } + return copy; + }; + ZeroClipboard.destroy = function() { + ZeroClipboard.deactivate(); + for (var clientId in _clientMeta) { + if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) { + var client = _clientMeta[clientId].instance; + if (client && typeof client.destroy === "function") { + client.destroy(); + } + } + } + var htmlBridge = _getHtmlBridge(flashState.bridge); + if (htmlBridge && htmlBridge.parentNode) { + htmlBridge.parentNode.removeChild(htmlBridge); + flashState.ready = null; + flashState.bridge = null; + } + }; + ZeroClipboard.activate = function(element) { + if (currentElement) { + _removeClass(currentElement, _globalConfig.hoverClass); + _removeClass(currentElement, _globalConfig.activeClass); + } + currentElement = element; + _addClass(element, _globalConfig.hoverClass); + _reposition(); + var newTitle = _globalConfig.title || element.getAttribute("title"); + if (newTitle) { + var htmlBridge = _getHtmlBridge(flashState.bridge); + if (htmlBridge) { + htmlBridge.setAttribute("title", newTitle); + } + } + var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer"; + _setHandCursor(useHandCursor); + }; + ZeroClipboard.deactivate = function() { + var htmlBridge = _getHtmlBridge(flashState.bridge); + if (htmlBridge) { + htmlBridge.style.left = "0px"; + htmlBridge.style.top = "-9999px"; + htmlBridge.removeAttribute("title"); + } + if (currentElement) { + _removeClass(currentElement, _globalConfig.hoverClass); + _removeClass(currentElement, _globalConfig.activeClass); + currentElement = null; + } + }; + var _bridge = function() { + var flashBridge, len; + var container = document.getElementById("global-zeroclipboard-html-bridge"); + if (!container) { + var opts = ZeroClipboard.config(); + opts.jsModuleId = typeof _amdModuleId === "string" && _amdModuleId || typeof _cjsModuleId === "string" && _cjsModuleId || null; + var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig); + var flashvars = _vars(opts); + var swfUrl = _globalConfig.moviePath + _cacheBust(_globalConfig.moviePath, _globalConfig); + var html = ' '; + container = document.createElement("div"); + container.id = "global-zeroclipboard-html-bridge"; + container.setAttribute("class", "global-zeroclipboard-container"); + container.style.position = "absolute"; + container.style.left = "0px"; + container.style.top = "-9999px"; + container.style.width = "15px"; + container.style.height = "15px"; + container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex); + document.body.appendChild(container); + container.innerHTML = html; + } + flashBridge = document["global-zeroclipboard-flash-bridge"]; + if (flashBridge && (len = flashBridge.length)) { + flashBridge = flashBridge[len - 1]; + } + flashState.bridge = flashBridge || container.children[0].lastElementChild; + }; + var _getHtmlBridge = function(flashBridge) { + var isFlashElement = /^OBJECT|EMBED$/; + var htmlBridge = flashBridge && flashBridge.parentNode; + while (htmlBridge && isFlashElement.test(htmlBridge.nodeName) && htmlBridge.parentNode) { + htmlBridge = htmlBridge.parentNode; + } + return htmlBridge || null; + }; + var _reposition = function() { + if (currentElement) { + var pos = _getDOMObjectPosition(currentElement, _globalConfig.zIndex); + var htmlBridge = _getHtmlBridge(flashState.bridge); + if (htmlBridge) { + htmlBridge.style.top = pos.top + "px"; + htmlBridge.style.left = pos.left + "px"; + htmlBridge.style.width = pos.width + "px"; + htmlBridge.style.height = pos.height + "px"; + htmlBridge.style.zIndex = pos.zIndex + 1; + } + if (flashState.ready === true && flashState.bridge) { + flashState.bridge.setSize(pos.width, pos.height); + } + } + return this; + }; + ZeroClipboard.prototype.on = function(eventName, func) { + var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; + if (typeof eventName === "string" && eventName) { + events = eventName.toLowerCase().split(/\s+/); + } else if (typeof eventName === "object" && eventName && typeof func === "undefined") { + for (i in eventName) { + if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") { + this.on(i, eventName[i]); + } + } + } + if (events && events.length) { + for (i = 0, len = events.length; i < len; i++) { + eventName = events[i].replace(/^on/, ""); + added[eventName] = true; + if (!handlers[eventName]) { + handlers[eventName] = []; + } + handlers[eventName].push(func); + } + if (added.noflash && flashState.disabled) { + _receiveEvent.call(this, "noflash", {}); + } + if (added.wrongflash && flashState.outdated) { + _receiveEvent.call(this, "wrongflash", { + flashVersion: flashState.version + }); + } + if (added.load && flashState.ready) { + _receiveEvent.call(this, "load", { + flashVersion: flashState.version + }); + } + } + return this; + }; + ZeroClipboard.prototype.off = function(eventName, func) { + var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; + if (arguments.length === 0) { + events = _objectKeys(handlers); + } else if (typeof eventName === "string" && eventName) { + events = eventName.split(/\s+/); + } else if (typeof eventName === "object" && eventName && typeof func === "undefined") { + for (i in eventName) { + if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") { + this.off(i, eventName[i]); + } + } + } + if (events && events.length) { + for (i = 0, len = events.length; i < len; i++) { + eventName = events[i].toLowerCase().replace(/^on/, ""); + perEventHandlers = handlers[eventName]; + if (perEventHandlers && perEventHandlers.length) { + if (func) { + foundIndex = _inArray(func, perEventHandlers); + while (foundIndex !== -1) { + perEventHandlers.splice(foundIndex, 1); + foundIndex = _inArray(func, perEventHandlers, foundIndex); + } + } else { + handlers[eventName].length = 0; + } + } + } + } + return this; + }; + ZeroClipboard.prototype.handlers = function(eventName) { + var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; + if (handlers) { + if (typeof eventName === "string" && eventName) { + return handlers[eventName] ? handlers[eventName].slice(0) : null; + } + copy = {}; + for (prop in handlers) { + if (handlers.hasOwnProperty(prop) && handlers[prop]) { + copy[prop] = handlers[prop].slice(0); + } + } + } + return copy; + }; + var _dispatchClientCallbacks = function(eventName, context, args, async) { + var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[eventName]; + if (handlers && handlers.length) { + var i, len, func, originalContext = context || this; + for (i = 0, len = handlers.length; i < len; i++) { + func = handlers[i]; + context = originalContext; + if (typeof func === "string" && typeof window[func] === "function") { + func = window[func]; + } + if (typeof func === "object" && func && typeof func.handleEvent === "function") { + context = func; + func = func.handleEvent; + } + if (typeof func === "function") { + _dispatchCallback(func, context, args, async); + } + } + } + return this; + }; + ZeroClipboard.prototype.clip = function(elements) { + elements = _prepClip(elements); + for (var i = 0; i < elements.length; i++) { + if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) { + if (!elements[i].zcClippingId) { + elements[i].zcClippingId = "zcClippingId_" + elementIdCounter++; + _elementMeta[elements[i].zcClippingId] = [ this.id ]; + if (_globalConfig.autoActivate === true) { + _addEventHandler(elements[i], "mouseover", _elementMouseOver); + } + } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) { + _elementMeta[elements[i].zcClippingId].push(this.id); + } + var clippedElements = _clientMeta[this.id].elements; + if (_inArray(elements[i], clippedElements) === -1) { + clippedElements.push(elements[i]); + } + } + } + return this; + }; + ZeroClipboard.prototype.unclip = function(elements) { + var meta = _clientMeta[this.id]; + if (meta) { + var clippedElements = meta.elements; + var arrayIndex; + if (typeof elements === "undefined") { + elements = clippedElements.slice(0); + } else { + elements = _prepClip(elements); + } + for (var i = elements.length; i--; ) { + if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) { + arrayIndex = 0; + while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) { + clippedElements.splice(arrayIndex, 1); + } + var clientIds = _elementMeta[elements[i].zcClippingId]; + if (clientIds) { + arrayIndex = 0; + while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) { + clientIds.splice(arrayIndex, 1); + } + if (clientIds.length === 0) { + if (_globalConfig.autoActivate === true) { + _removeEventHandler(elements[i], "mouseover", _elementMouseOver); + } + delete elements[i].zcClippingId; + } + } + } + } + } + return this; + }; + ZeroClipboard.prototype.elements = function() { + var meta = _clientMeta[this.id]; + return meta && meta.elements ? meta.elements.slice(0) : []; + }; + var _getAllClientsClippedToElement = function(element) { + var elementMetaId, clientIds, i, len, client, clients = []; + if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) { + clientIds = _elementMeta[elementMetaId]; + if (clientIds && clientIds.length) { + for (i = 0, len = clientIds.length; i < len; i++) { + client = _clientMeta[clientIds[i]].instance; + if (client && client instanceof ZeroClipboard) { + clients.push(client); + } + } + } + } + return clients; + }; + _globalConfig.hoverClass = "zeroclipboard-is-hover"; + _globalConfig.activeClass = "zeroclipboard-is-active"; + _globalConfig.trustedOrigins = null; + _globalConfig.allowScriptAccess = null; + _globalConfig.useNoCache = true; + _globalConfig.moviePath = "ZeroClipboard.swf"; + ZeroClipboard.detectFlashSupport = function() { + _deprecationWarning("ZeroClipboard.detectFlashSupport", _globalConfig.debug); + return _detectFlashSupport(); + }; + ZeroClipboard.dispatch = function(eventName, args) { + if (typeof eventName === "string" && eventName) { + var cleanEventName = eventName.toLowerCase().replace(/^on/, ""); + if (cleanEventName) { + var clients = currentElement ? _getAllClientsClippedToElement(currentElement) : _getAllClients(); + for (var i = 0, len = clients.length; i < len; i++) { + _receiveEvent.call(clients[i], cleanEventName, args); + } + } + } + }; + ZeroClipboard.prototype.setHandCursor = function(enabled) { + _deprecationWarning("ZeroClipboard.prototype.setHandCursor", _globalConfig.debug); + enabled = typeof enabled === "boolean" ? enabled : !!enabled; + _setHandCursor(enabled); + _globalConfig.forceHandCursor = enabled; + return this; + }; + ZeroClipboard.prototype.reposition = function() { + _deprecationWarning("ZeroClipboard.prototype.reposition", _globalConfig.debug); + return _reposition(); + }; + ZeroClipboard.prototype.receiveEvent = function(eventName, args) { + _deprecationWarning("ZeroClipboard.prototype.receiveEvent", _globalConfig.debug); + if (typeof eventName === "string" && eventName) { + var cleanEventName = eventName.toLowerCase().replace(/^on/, ""); + if (cleanEventName) { + _receiveEvent.call(this, cleanEventName, args); + } + } + }; + ZeroClipboard.prototype.setCurrent = function(element) { + _deprecationWarning("ZeroClipboard.prototype.setCurrent", _globalConfig.debug); + ZeroClipboard.activate(element); + return this; + }; + ZeroClipboard.prototype.resetBridge = function() { + _deprecationWarning("ZeroClipboard.prototype.resetBridge", _globalConfig.debug); + ZeroClipboard.deactivate(); + return this; + }; + ZeroClipboard.prototype.setTitle = function(newTitle) { + _deprecationWarning("ZeroClipboard.prototype.setTitle", _globalConfig.debug); + newTitle = newTitle || _globalConfig.title || currentElement && currentElement.getAttribute("title"); + if (newTitle) { + var htmlBridge = _getHtmlBridge(flashState.bridge); + if (htmlBridge) { + htmlBridge.setAttribute("title", newTitle); + } + } + return this; + }; + ZeroClipboard.setDefaults = function(options) { + _deprecationWarning("ZeroClipboard.setDefaults", _globalConfig.debug); + ZeroClipboard.config(options); + }; + ZeroClipboard.prototype.addEventListener = function(eventName, func) { + _deprecationWarning("ZeroClipboard.prototype.addEventListener", _globalConfig.debug); + return this.on(eventName, func); + }; + ZeroClipboard.prototype.removeEventListener = function(eventName, func) { + _deprecationWarning("ZeroClipboard.prototype.removeEventListener", _globalConfig.debug); + return this.off(eventName, func); + }; + ZeroClipboard.prototype.ready = function() { + _deprecationWarning("ZeroClipboard.prototype.ready", _globalConfig.debug); + return flashState.ready === true; + }; + var _receiveEvent = function(eventName, args) { + eventName = eventName.toLowerCase().replace(/^on/, ""); + var cleanVersion = args && args.flashVersion && _parseFlashVersion(args.flashVersion) || null; + var element = currentElement; + var performCallbackAsync = true; + switch (eventName) { + case "load": + if (cleanVersion) { + if (!_isFlashVersionSupported(cleanVersion)) { + _receiveEvent.call(this, "onWrongFlash", { + flashVersion: cleanVersion + }); + return; + } + flashState.outdated = false; + flashState.ready = true; + flashState.version = cleanVersion; + } + break; + + case "wrongflash": + if (cleanVersion && !_isFlashVersionSupported(cleanVersion)) { + flashState.outdated = true; + flashState.ready = false; + flashState.version = cleanVersion; + } + break; + + case "mouseover": + _addClass(element, _globalConfig.hoverClass); + break; + + case "mouseout": + if (_globalConfig.autoActivate === true) { + ZeroClipboard.deactivate(); + } + break; + + case "mousedown": + _addClass(element, _globalConfig.activeClass); + break; + + case "mouseup": + _removeClass(element, _globalConfig.activeClass); + break; + + case "datarequested": + var targetId = element.getAttribute("data-clipboard-target"), targetEl = !targetId ? null : document.getElementById(targetId); + if (targetEl) { + var textContent = targetEl.value || targetEl.textContent || targetEl.innerText; + if (textContent) { + this.setText(textContent); + } + } else { + var defaultText = element.getAttribute("data-clipboard-text"); + if (defaultText) { + this.setText(defaultText); + } + } + performCallbackAsync = false; + break; + + case "complete": + _deleteOwnProperties(_clipData); + break; + } + var context = element; + var eventArgs = [ this, args ]; + return _dispatchClientCallbacks.call(this, eventName, context, eventArgs, performCallbackAsync); + }; + if (typeof define === "function" && define.amd) { + define([ "require", "exports", "module" ], function(require, exports, module) { + _amdModuleId = module && module.id || null; + return ZeroClipboard; + }); + } else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports) { + _cjsModuleId = module.id || null; + module.exports = ZeroClipboard; + } else { + window.ZeroClipboard = ZeroClipboard; + } +})(); \ No newline at end of file diff --git a/beatsmusic/authproxy/js/jquery.zclip.min.js b/beatsmusic/authproxy/js/jquery.zclip.min.js new file mode 100644 index 000000000..3548cc2ae --- /dev/null +++ b/beatsmusic/authproxy/js/jquery.zclip.min.js @@ -0,0 +1,12 @@ +/* + * zClip :: jQuery ZeroClipboard v1.1.1 + * http://steamdev.com/zclip + * + * Copyright 2011, SteamDev + * Released under the MIT license. + * http://www.opensource.org/licenses/mit-license.php + * + * Date: Wed Jun 01, 2011 + */ + +(function(a){a.fn.zclip=function(c){if(typeof c=="object"&&!c.length){var b=a.extend({path:"ZeroClipboard.swf",copy:null,beforeCopy:null,afterCopy:null,clickAfter:true,setHandCursor:true,setCSSEffects:true},c);return this.each(function(){var e=a(this);if(e.is(":visible")&&(typeof b.copy=="string"||a.isFunction(b.copy))){ZeroClipboard.setMoviePath(b.path);var d=new ZeroClipboard.Client();if(a.isFunction(b.copy)){e.bind("zClip_copy",b.copy)}if(a.isFunction(b.beforeCopy)){e.bind("zClip_beforeCopy",b.beforeCopy)}if(a.isFunction(b.afterCopy)){e.bind("zClip_afterCopy",b.afterCopy)}d.setHandCursor(b.setHandCursor);d.setCSSEffects(b.setCSSEffects);d.addEventListener("mouseOver",function(f){e.trigger("mouseenter")});d.addEventListener("mouseOut",function(f){e.trigger("mouseleave")});d.addEventListener("mouseDown",function(f){e.trigger("mousedown");if(!a.isFunction(b.copy)){d.setText(b.copy)}else{d.setText(e.triggerHandler("zClip_copy"))}if(a.isFunction(b.beforeCopy)){e.trigger("zClip_beforeCopy")}});d.addEventListener("complete",function(f,g){if(a.isFunction(b.afterCopy)){e.trigger("zClip_afterCopy")}else{if(g.length>500){g=g.substr(0,500)+"...\n\n("+(g.length-500)+" characters not shown)"}e.removeClass("hover");alert("Copied text to clipboard:\n\n "+g)}if(b.clickAfter){e.trigger("click")}});d.glue(e[0],e.parent()[0]);a(window).bind("load resize",function(){d.reposition()})}})}else{if(typeof c=="string"){return this.each(function(){var f=a(this);c=c.toLowerCase();var e=f.data("zclipId");var d=a("#"+e+".zclip");if(c=="remove"){d.remove();f.removeClass("active hover")}else{if(c=="hide"){d.hide();f.removeClass("active hover")}else{if(c=="show"){d.show()}}}})}}}})(jQuery);var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"ZeroClipboard.swf",nextId:1,$:function(a){if(typeof(a)=="string"){a=document.getElementById(a)}if(!a.addClass){a.hide=function(){this.style.display="none"};a.show=function(){this.style.display=""};a.addClass=function(b){this.removeClass(b);this.className+=" "+b};a.removeClass=function(d){var e=this.className.split(/\s+/);var b=-1;for(var c=0;c-1){e.splice(b,1);this.className=e.join(" ")}return this};a.hasClass=function(b){return !!this.className.match(new RegExp("\\s*"+b+"\\s*"))}}return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(d,b,c){var a=this.clients[d];if(a){a.receiveEvent(b,c)}},register:function(b,a){this.clients[b]=a},getDOMObjectPosition:function(c,a){var b={left:0,top:0,width:c.width?c.width:c.offsetWidth,height:c.height?c.height:c.offsetHeight};if(c&&(c!=a)){b.left+=c.offsetLeft;b.top+=c.offsetTop}return b},Client:function(a){this.handlers={};this.id=ZeroClipboard.nextId++;this.movieId="ZeroClipboardMovie_"+this.id;ZeroClipboard.register(this.id,this);if(a){this.glue(a)}}};ZeroClipboard.Client.prototype={id:0,ready:false,movie:null,clipText:"",handCursorEnabled:true,cssEffects:true,handlers:null,glue:function(d,b,e){this.domElement=ZeroClipboard.$(d);var f=99;if(this.domElement.style.zIndex){f=parseInt(this.domElement.style.zIndex,10)+1}if(typeof(b)=="string"){b=ZeroClipboard.$(b)}else{if(typeof(b)=="undefined"){b=document.getElementsByTagName("body")[0]}}var c=ZeroClipboard.getDOMObjectPosition(this.domElement,b);this.div=document.createElement("div");this.div.className="zclip";this.div.id="zclip-"+this.movieId;$(this.domElement).data("zclipId","zclip-"+this.movieId);var a=this.div.style;a.position="absolute";a.left=""+c.left+"px";a.top=""+c.top+"px";a.width=""+c.width+"px";a.height=""+c.height+"px";a.zIndex=f;if(typeof(e)=="object"){for(addedStyle in e){a[addedStyle]=e[addedStyle]}}b.appendChild(this.div);this.div.innerHTML=this.getHTML(c.width,c.height)},getHTML:function(d,a){var c="";var b="id="+this.id+"&width="+d+"&height="+a;if(navigator.userAgent.match(/MSIE/)){var e=location.href.match(/^https/i)?"https://":"http://";c+=''}else{c+=''}return c},hide:function(){if(this.div){this.div.style.left="-2000px"}},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide();this.div.innerHTML="";var a=document.getElementsByTagName("body")[0];try{a.removeChild(this.div)}catch(b){}this.domElement=null;this.div=null}},reposition:function(c){if(c){this.domElement=ZeroClipboard.$(c);if(!this.domElement){this.hide()}}if(this.domElement&&this.div){var b=ZeroClipboard.getDOMObjectPosition(this.domElement);var a=this.div.style;a.left=""+b.left+"px";a.top=""+b.top+"px"}},setText:function(a){this.clipText=a;if(this.ready){this.movie.setText(a)}},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");if(!this.handlers[a]){this.handlers[a]=[]}this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;if(this.ready){this.movie.setHandCursor(a)}},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(d,f){d=d.toString().toLowerCase().replace(/^on/,"");switch(d){case"load":this.movie=document.getElementById(this.movieId);if(!this.movie){var c=this;setTimeout(function(){c.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){var c=this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=true;return}this.ready=true;try{this.movie.setText(this.clipText)}catch(h){}try{this.movie.setHandCursor(this.handCursorEnabled)}catch(h){}break;case"mouseover":if(this.domElement&&this.cssEffects){this.domElement.addClass("hover");if(this.recoverActive){this.domElement.addClass("active")}}break;case"mouseout":if(this.domElement&&this.cssEffects){this.recoverActive=false;if(this.domElement.hasClass("active")){this.domElement.removeClass("active");this.recoverActive=true}this.domElement.removeClass("hover")}break;case"mousedown":if(this.domElement&&this.cssEffects){this.domElement.addClass("active")}break;case"mouseup":if(this.domElement&&this.cssEffects){this.domElement.removeClass("active");this.recoverActive=false}break}if(this.handlers[d]){for(var b=0,a=this.handlers[d].length;b Date: Sat, 8 Mar 2014 02:30:01 +0000 Subject: [PATCH 165/597] Beats API does not cope with "//" --- beatsmusic/content/contents/code/beatsmusic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 5b3b5e0a6..8a918e241 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -22,7 +22,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { // Production app_token: "<-- INSERT TOKEN HERE -->", - endpoint: "https://partner.api.beatsmusic.com/v1/", + endpoint: "https://partner.api.beatsmusic.com/v1", getConfigUi: function () { var uiData = Tomahawk.readBase64("config.ui"); From ba948d0ab06cb75a82b3105912e9131beb020453 Mon Sep 17 00:00:00 2001 From: Leon Mergen Date: Sat, 8 Mar 2014 15:25:47 +0100 Subject: [PATCH 166/597] Fixes bug where Beets didn't return any results Beets' web plugin requires you to omit the 'album' part of a query if an album is empty; otherwise, it will search for tracks that aren't on any album at all (which is not the desired result). --- beets/content/contents/code/beets.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/beets/content/contents/code/beets.js b/beets/content/contents/code/beets.js index b0669f6f9..8d60eceaf 100644 --- a/beets/content/contents/code/beets.js +++ b/beets/content/contents/code/beets.js @@ -59,7 +59,11 @@ var BeetsResolver = Tomahawk.extend(TomahawkResolver, { // Resolution. resolve: function (qid, artist, album, title) { - this.beetsQuery(qid, ['artist:' + artist, 'album:' + album, 'title:' + title]); + if (album == '') { + this.beetsQuery(qid, ['artist:' + artist, 'title:' + title]); + } else { + this.beetsQuery(qid, ['artist:' + artist, 'album:' + album, 'title:' + title]); + } }, search: function (qid, searchString) { From c3c0689860f1e1469530ea4a67cc4738f5a51541 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 9 Mar 2014 08:00:41 +0000 Subject: [PATCH 167/597] Bump Beets version --- beets/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beets/content/metadata.json b/beets/content/metadata.json index 4995431f1..c31f77a9b 100644 --- a/beets/content/metadata.json +++ b/beets/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "beets", "author": "Adrian and Uwe", "email": "uwelk@xhochy.com", - "version": "0.5.3", + "version": "0.5.4", "website": "http://gettomahawk.com", "description": "Connects to a beets server and resolves tracks", "type": "resolver/javascript", From b54c86e9845e853ebc181c31505130f8a9253cb1 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 12 Mar 2014 20:27:11 +0000 Subject: [PATCH 168/597] [beatsmusic] New method to get stream URL. --- beatsmusic/content/contents/code/beatsmusic.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 8a918e241..e974ee3ec 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -130,14 +130,12 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }, getStreamUrl: function (qid, url) { - var headers = { - "Authorization": "Bearer " + this.accessToken, - }; var trackId = url.replace("beatsmusic://track/", ""); - Tomahawk.asyncRequest(this.endpoint + "/api/tracks/" + trackId + "/audio?protocol=httpd&acquire=1" , function (xhr) { + Tomahawk.asyncRequest(this.endpoint + "/api/tracks/" + trackId + "/audio?acquire=1&access_token=" + this.accessToken, function (xhr) { + Tomahawk.log(xhr.responseText); var res = JSON.parse(xhr.responseText); Tomahawk.reportStreamUrl(qid, res.data.location); - }, headers); + }); }, search: function (qid, searchString) { From 7d0a3981739d3db726a1d65680471e5e92c47239 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 12 Mar 2014 20:30:21 +0000 Subject: [PATCH 169/597] [beatsmusic] Rework resolve to function with new API * currentyl get streamURL here to work around that getStreamURL can't take rtmp:// URLs --- .../content/contents/code/beatsmusic.js | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index e974ee3ec..9eea4139a 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -102,31 +102,31 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { if (!this.loggedIn) return; // TODO: Add album to search - var headers = { - "Authorization": "Bearer " + this.app_token, - }; var that = this; - Tomahawk.asyncRequest(this.endpoint + "/api/search?type=track&filters=streamable:true&limit=1&q=" + encodeURIComponent(artist + " " + title) , function (xhr) { + Tomahawk.asyncRequest(this.endpoint + "/api/search?type=track&filters=streamable:true&limit=1&q=" + encodeURIComponent(artist + " " + title) + "&client_id=" + this.app_token, function (xhr) { var res = JSON.parse(xhr.responseText); if (res.code == "OK" && res.info.count > 0) { // For the moment we just use the first result - Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res.data[0].id, function (xhr2) { + Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res.data[0].id + "?client_id=" + that.app_token, function (xhr2) { var res2 = JSON.parse(xhr2.responseText); - Tomahawk.addTrackResults({ - qid: qid, - results: [{ - artist: res2.data.artist_display_name, - duration: res2.data.duration, - source: that.settings.name, - track: res2.data.title, - url: "beatsmusic://track/" + res2.data.id - }] + Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res2.data.id + "/audio?access_token=" + that.accessToken, function (xhr3) { + var res3 = JSON.parse(xhr3.responseText); + Tomahawk.addTrackResults({ + qid: qid, + results: [{ + artist: res2.data.artist_display_name, + duration: res2.data.duration, + source: that.settings.name, + track: res2.data.title, + url: res3.data.location + "/?slist=" + res3.data.resource + }] + }); }); - }, headers); + }); } else { Tomahawk.addTrackResults({ results: [], qid: qid }); } - }, headers); + }); }, getStreamUrl: function (qid, url) { From 6d53972945350b978f26e732f250461e064bf3e1 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 12 Mar 2014 23:50:05 +0000 Subject: [PATCH 170/597] [beatsmusic] Add json callback to authproxy --- beatsmusic/authproxy/app.yaml | 3 +++ beatsmusic/authproxy/authproxy.go | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/beatsmusic/authproxy/app.yaml b/beatsmusic/authproxy/app.yaml index 4fc1616e4..11bf83413 100644 --- a/beatsmusic/authproxy/app.yaml +++ b/beatsmusic/authproxy/app.yaml @@ -17,3 +17,6 @@ handlers: - url: /callback script: _go_app + +- url: /json + script: _go_app diff --git a/beatsmusic/authproxy/authproxy.go b/beatsmusic/authproxy/authproxy.go index acb50e1e9..c93f6c6a7 100644 --- a/beatsmusic/authproxy/authproxy.go +++ b/beatsmusic/authproxy/authproxy.go @@ -6,6 +6,7 @@ import ( ) func init() { + http.HandleFunc("/json", jsonHandler) http.HandleFunc("/callback", handler) } @@ -61,3 +62,8 @@ func handler(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusInternalServerError) } } + +func jsonHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Write([]byte("{ \"access_token\": \"" + r.FormValue("access_token") + "\" }")) +} From a798d8fec6916b368958e2f30f4a35f008784a49 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 12 Mar 2014 23:51:40 +0000 Subject: [PATCH 171/597] [beatsmusic] Change Login method to client-side --- .../content/contents/code/beatsmusic.js | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 9eea4139a..e05168bfb 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -23,6 +23,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { // Production app_token: "<-- INSERT TOKEN HERE -->", endpoint: "https://partner.api.beatsmusic.com/v1", + redirect_uri: "https://tomahawk-beatslogin.appspot.com/json", getConfigUi: function () { var uiData = Tomahawk.readBase64("config.ui"); @@ -54,6 +55,37 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }, + login: function() { + this.user = userConfig.user; + this.password = userConfig.password; + + var referer = "https://partner.api.beatsmusic.com/oauth2/authorize?response_type=token"; + referer += "&redirect_uri=" + encodeURIComponent(this.redirect_uri); + referer += "&client_id=" + encodeURIComponent(this.app_token); + + var headers = { + "Content-Type": "application/x-www-form-urlencoded", + "Referer": referer + }; + + // Keep empty arguments! + var data = "login=" + encodeURIComponent(this.user); + data += "&password=" + encodeURIComponent(this.password); + data += "&redirect_uri=" + encodeURIComponent(this.redirect_uri); + data += "&response_type=token&scope=&state=&user_id="; + data += "&client_id=" + encodeURIComponent(this.app_token); + + var that = this; + Tomahawk.asyncRequest("https://partner.api.beatsmusic.com/api/o/oauth2/approval", function (xhr) { + var res = JSON.parse(xhr.responseText); + that.accessToken = res.access_token; + that.loggedIn = true; + }, headers, { + method: "POST", + data: data + }); + } + init: function() { Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); @@ -62,39 +94,11 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { var userConfig = this.getUserConfig(); if (!userConfig.user || !userConfig.password) { Tomahawk.log("Beats Music Resolver not properly configured!"); + this.loggedIn = false; return; } - this.user = userConfig.user; - this.password = userConfig.password; - this.loggedIn = false; - var headers = { - "Authorization": "Bearer " + this.app_token, - "Content-type": "application/x-www-form-urlencoded" - }; - - var data = "uuid=" + encodeURIComponent(Tomahawk.instanceUUID()) - + "&device_name=Tomahawk%20Player" - + "&client_app_version=" + Tomahawk.apiVersion; - var data2 = "login=" + encodeURIComponent(this.user) - + "&password=" + encodeURIComponent(this.password) - + "&uuid=" + encodeURIComponent(Tomahawk.instanceUUID()); - var that = this; - Tomahawk.asyncRequest(this.endpoint + "/api/sessions", function (xhr) { - var resp = JSON.parse(xhr.responseText); - if (resp.code == "OK") { - Tomahawk.asyncRequest(that.endpoint + "/api/auth/tokens", function (xhr2) { - that.loggedIn = true; - that.accessToken = JSON.parse(xhr2.responseText).data.access_token; - }, headers, { - method: "POST", - data: data2 - }); - } - }, headers, { - method: "POST", - data: data - }); + this.login(); }, From 509fd1e1888a9ee7bd20906e1326f9b82f8c3833 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 13 Mar 2014 12:54:04 +0000 Subject: [PATCH 172/597] [beatsmusic] Fix syntax errors on login --- beatsmusic/content/contents/code/beatsmusic.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index e05168bfb..004d01e7e 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -56,6 +56,13 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { login: function() { + var userConfig = this.getUserConfig(); + if (!userConfig.user || !userConfig.password) { + Tomahawk.log("Beats Music Resolver not properly configured!"); + this.loggedIn = false; + return; + } + this.user = userConfig.user; this.password = userConfig.password; @@ -84,19 +91,11 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { method: "POST", data: data }); - } + }, init: function() { Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); - Tomahawk.addCustomUrlHandler("beatsmusic", "getStreamUrl", true); - - var userConfig = this.getUserConfig(); - if (!userConfig.user || !userConfig.password) { - Tomahawk.log("Beats Music Resolver not properly configured!"); - this.loggedIn = false; - return; - } this.login(); }, From 7e05865d6ea480bfe876a2ca272b2708a210e57c Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 13 Mar 2014 12:54:44 +0000 Subject: [PATCH 173/597] [beatsmusic] Use new urlTranslator scheme --- .../content/contents/code/beatsmusic.js | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 004d01e7e..8c7af7b52 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -96,6 +96,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { init: function() { Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + Tomahawk.addCustomUrlTranslator("beatsmusic", "getStreamUrl", true); this.login(); }, @@ -112,18 +113,15 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { // For the moment we just use the first result Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res.data[0].id + "?client_id=" + that.app_token, function (xhr2) { var res2 = JSON.parse(xhr2.responseText); - Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res2.data.id + "/audio?access_token=" + that.accessToken, function (xhr3) { - var res3 = JSON.parse(xhr3.responseText); - Tomahawk.addTrackResults({ - qid: qid, - results: [{ - artist: res2.data.artist_display_name, - duration: res2.data.duration, - source: that.settings.name, - track: res2.data.title, - url: res3.data.location + "/?slist=" + res3.data.resource - }] - }); + Tomahawk.addTrackResults({ + qid: qid, + results: [{ + artist: res2.data.artist_display_name, + duration: res2.data.duration, + source: that.settings.name, + track: res2.data.title, + url: "beatsmusic://track/" + res.data[0].id + }] }); }); } else { @@ -137,7 +135,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.asyncRequest(this.endpoint + "/api/tracks/" + trackId + "/audio?acquire=1&access_token=" + this.accessToken, function (xhr) { Tomahawk.log(xhr.responseText); var res = JSON.parse(xhr.responseText); - Tomahawk.reportStreamUrl(qid, res.data.location); + Tomahawk.reportUrlTranslation(qid, res.data.location + "/?slist=" + res.data.resource); }); }, From 322815d175f4cd805cb335bc574dfa504ea7b1cb Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 13 Mar 2014 15:02:49 +0000 Subject: [PATCH 174/597] [beatsmusic] Login needs to be refreshed less than every 60min * Refresh it every 50min now --- beatsmusic/content/contents/code/beatsmusic.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 8c7af7b52..d13a0a0ba 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -98,6 +98,9 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addCustomUrlTranslator("beatsmusic", "getStreamUrl", true); + // re-login every 50 minutes + setInterval((function(self) { return function() { self.login(); }; })(this), 1000*60*50); + this.login(); }, From cba60c5189607b7a67b2e99fb722281f32faa789 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 2 Apr 2014 20:29:10 +0100 Subject: [PATCH 175/597] [beatsmusic] Convert search to new API --- beatsmusic/content/contents/code/beatsmusic.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index d13a0a0ba..33eb7d367 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -143,12 +143,9 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }, search: function (qid, searchString) { - var headers = { - "Authorization": "Bearer " + this.accessToken, - }; var that = this; // TODO: Search for albums and artists, too. - Tomahawk.asyncRequest(this.endpoint + "/api/search?filter=streamable:true&limit=200&type=track&q=" + encodeURIComponent(searchString), function (xhr) { + Tomahawk.asyncRequest(this.endpoint + "/api/search?type=track&filters=streamable:true&limit=200&q=" + encodeURIComponent(searchString) + "&client_id=" + this.app_token, function (xhr) { var res = JSON.parse(xhr.responseText); if (res.code == "OK") { // TODO: Load more metatdata @@ -162,7 +159,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }); Tomahawk.addTrackResults({ results: results, qid: qid }); } - }, headers); + }); }, canParseUrl: function (url, type) { From 3775826f435aea33ba3cc1fae5fbe8f60f756686 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 10:21:27 +0100 Subject: [PATCH 176/597] [beatsmusic] Adjust artist loading to new auth --- beatsmusic/content/contents/code/beatsmusic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 33eb7d367..454abfb05 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -204,7 +204,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }, headers); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/artists\/([^\/]*)\/?$/.test(url)) { var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/artists\/([^\/]*)\/?$/); - var query = this.endpoint + "/api/artists/" + encodeURIComponent(match[3]); + var query = this.endpoint + "/api/artists/" + encodeURIComponent(match[3]) + "?client_id=" + this.app_token; Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); if (res.code == "OK") { @@ -213,7 +213,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { name: res.data.name }) } - }, headers); + }); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/tracks\//.test(url)) { var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/tracks\/([^\/]*)/); var query = this.endpoint + "/api/tracks/" + encodeURIComponent(match[4]); From db74a61e532fb903777844037f882cc406fdc3e9 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 10:21:55 +0100 Subject: [PATCH 177/597] [beatsmusic] Adjust album loading to new auth --- beatsmusic/content/contents/code/beatsmusic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 454abfb05..e305a3d29 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -216,7 +216,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/tracks\//.test(url)) { var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/tracks\/([^\/]*)/); - var query = this.endpoint + "/api/tracks/" + encodeURIComponent(match[4]); + var query = this.endpoint + "/api/tracks/" + encodeURIComponent(match[4]) + "?client_id=" + this.app_token; Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); if (res.code == "OK") { @@ -226,7 +226,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { artist: res.data.artist_display_name }); } - }, headers); + }); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/playlists\/([^\/]*)\/?$/.test(url)) { // TODO: Use user's access token if we have one to retrieve private playlists var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/playlists\/([^\/]*)\/?$/); From 788bc32d22d85dc998d3556783c6c0effda55be9 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 10:22:22 +0100 Subject: [PATCH 178/597] [beatsmusic] Request high quality audio --- beatsmusic/content/contents/code/beatsmusic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index e305a3d29..21f927e25 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -135,7 +135,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { getStreamUrl: function (qid, url) { var trackId = url.replace("beatsmusic://track/", ""); - Tomahawk.asyncRequest(this.endpoint + "/api/tracks/" + trackId + "/audio?acquire=1&access_token=" + this.accessToken, function (xhr) { + Tomahawk.asyncRequest(this.endpoint + "/api/tracks/" + trackId + "/audio?acquire=1&bitrate=highest&access_token=" + this.accessToken, function (xhr) { Tomahawk.log(xhr.responseText); var res = JSON.parse(xhr.responseText); Tomahawk.reportUrlTranslation(qid, res.data.location + "/?slist=" + res.data.resource); From ae9c0b7dabb7d86048b57239daf9fbf62d22cf28 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 10:23:37 +0100 Subject: [PATCH 179/597] [beatsmusic] Adjust UrlLookup to new auth --- beatsmusic/content/contents/code/beatsmusic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 21f927e25..e7985fd7c 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -191,7 +191,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/?$/.test(url)) { // Found an album URL var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/?$/); - var query = this.endpoint + "/api/albums/" + encodeURIComponent(match[3]); + var query = this.endpoint + "/api/albums/" + encodeURIComponent(match[3]) + "?client_id=" + this.app_token; Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); if (res.code == "OK") { @@ -201,7 +201,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { artist: res.data.artist_display_name, }) } - }, headers); + }); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/artists\/([^\/]*)\/?$/.test(url)) { var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/artists\/([^\/]*)\/?$/); var query = this.endpoint + "/api/artists/" + encodeURIComponent(match[3]) + "?client_id=" + this.app_token; From eb849b58f95bf2daaaa806d91bbbfff46c6d4caa Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 10:24:15 +0100 Subject: [PATCH 180/597] [beatsmusic] Only logged in users can load playlists --- beatsmusic/content/contents/code/beatsmusic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index e7985fd7c..4efc11ac4 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -172,7 +172,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { case TomahawkUrlType.Artist: return /https?:\/\/((on|listen)\.)?beatsmusic.com\/artists\/([^\/]*)\/?$/.test(url); case TomahawkUrlType.Playlist: - return /https?:\/\/((on|listen)\.)?beatsmusic.com\/playlists\/([^\/]*)\/?$/.test(url); + return this.loggedIn && /https?:\/\/((on|listen)\.)?beatsmusic.com\/playlists\/([^\/]*)\/?$/.test(url); case TomahawkUrlType.Track: return /https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/tracks\//.test(url); // case TomahawkUrlType.Any: From 2fb4b0972d98f1c7b421fa7af720bf346c5945d3 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 10:48:21 +0100 Subject: [PATCH 181/597] [beatsmusic] Adjust playlist loading to the new API --- beatsmusic/content/contents/code/beatsmusic.js | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 4efc11ac4..d36a545b5 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -184,10 +184,6 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { lookupUrl: function (url) { // Todo: unshorten beats.mu - var headers = { - "Authorization": "Bearer " + this.app_token, - "Content-type": "application/x-www-form-urlencoded" - }; if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/?$/.test(url)) { // Found an album URL var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/?$/); @@ -228,9 +224,8 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { } }); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/playlists\/([^\/]*)\/?$/.test(url)) { - // TODO: Use user's access token if we have one to retrieve private playlists var match = url.match(/https?:\/\/((on|listen)\.)?beatsmusic.com\/playlists\/([^\/]*)\/?$/); - var query = this.endpoint + "/api/playlists/" + encodeURIComponent(match[3]); + var query = this.endpoint + "/api/playlists/" + encodeURIComponent(match[3]) + "?access_token=" + this.accessToken; var that = this; Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); @@ -239,13 +234,13 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { type: "playlist", title: res.data.name, guid: "beatsmusic-playlist-" + encodeURIComponent(match[3]), - info: res.data.description + " (A playlist by " + res.result.owner + " on Beats Music)", - creator: res.data.user_display_name, + info: res.data.description + " (A playlist by " + res.data.refs.author.display + " on Beats Music)", + creator: res.data.refs.author.display, url: url, tracks: [] }; async.map(res.data.refs.tracks, function (item, cb) { - var query2 = that.endpoint + "/api/tracks/" + encodeURIComponent(item.id); + var query2 = that.endpoint + "/api/tracks/" + encodeURIComponent(item.id) + "?client_id=" + that.app_token; Tomahawk.asyncRequest(query2, function (xhr2) { var res2 = JSON.parse(xhr2.responseText); if (res2.code == "OK") { @@ -263,7 +258,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addUrlResult(url, result); }); } - }, headers); + }); } } }); From 02e10492d9e472501640ca5bf7bfc9441f44d796 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 10:48:35 +0100 Subject: [PATCH 182/597] [beatsmusic] Remove debug logging --- beatsmusic/content/contents/code/beatsmusic.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index d36a545b5..ba6642f23 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -46,7 +46,6 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { newConfigSaved: function () { var userConfig = this.getUserConfig(); - Tomahawk.log("newConfigSaved User: " + userConfig.user); if (this.user !== userConfig.user || this.password !== userConfig.password) { @@ -136,7 +135,6 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { getStreamUrl: function (qid, url) { var trackId = url.replace("beatsmusic://track/", ""); Tomahawk.asyncRequest(this.endpoint + "/api/tracks/" + trackId + "/audio?acquire=1&bitrate=highest&access_token=" + this.accessToken, function (xhr) { - Tomahawk.log(xhr.responseText); var res = JSON.parse(xhr.responseText); Tomahawk.reportUrlTranslation(qid, res.data.location + "/?slist=" + res.data.resource); }); From f752f6a962df23524a9262e02fdd86df6861735c Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 12:29:49 +0100 Subject: [PATCH 183/597] [beatsmusic] Remove trailing comma in dict --- beatsmusic/content/contents/code/beatsmusic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index ba6642f23..0ae3372d8 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -192,7 +192,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addUrlResult(url, { type: "album", name: res.data.title, - artist: res.data.artist_display_name, + artist: res.data.artist_display_name }) } }); From a7e551395c0032a4cee45016256966fd712185e1 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 23:18:49 +0100 Subject: [PATCH 184/597] [tomahk] Fix indentation --- .../content/contents/code/tomahk-metadata.js | 80 +++++++++---------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/tomahk-metadata/content/contents/code/tomahk-metadata.js b/tomahk-metadata/content/contents/code/tomahk-metadata.js index fe85aea05..9a9fe95d7 100644 --- a/tomahk-metadata/content/contents/code/tomahk-metadata.js +++ b/tomahk-metadata/content/contents/code/tomahk-metadata.js @@ -20,57 +20,57 @@ var TomaHKMetadataResolver = Tomahawk.extend(TomahawkResolver, { timeout: 15 }, - init: function() { + init: function() { Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); - }, + }, resolve: function (qid, artist, album, title) { Tomahawk.addTrackResults({ results: [], qid: qid }); }, - search: function (qid, searchString) { + search: function (qid, searchString) { Tomahawk.addTrackResults({ results: [], qid: qid }); - }, + }, canParseUrl: function (url, type) { // Soundcloud only returns tracks and playlists switch (type) { - case TomahawkUrlType.Album: - return /https?:\/\/(www\.)?toma.hk\/album\//.test(url); - case TomahawkUrlType.Artist: - return /https?:\/\/(www\.)?toma.hk\/artist\//.test(url); - case TomahawkUrlType.Playlist: - return /https?:\/\/(www\.)?toma.hk\/p\//.test(url) - // case TomahawkUrlType.Track: - // case TomahawkUrlType.Any: - default: - return /https?:\/\/(www\.)?toma.hk\//.test(url); + case TomahawkUrlType.Album: + return /https?:\/\/(www\.)?toma.hk\/album\//.test(url); + case TomahawkUrlType.Artist: + return /https?:\/\/(www\.)?toma.hk\/artist\//.test(url); + case TomahawkUrlType.Playlist: + return /https?:\/\/(www\.)?toma.hk\/p\//.test(url) + // case TomahawkUrlType.Track: + // case TomahawkUrlType.Any: + default: + return /https?:\/\/(www\.)?toma.hk\//.test(url); } }, lookupUrl: function (url) { - var that = this; + var that = this; var urlParts = url.split('/').filter(function (item) { return item.length != 0; }).map(decodeURIComponent); if (/https?:\/\/(www\.)?toma.hk\/album\//.test(url)) { // We have to deal with an Album - Tomahawk.addUrlResult(url, { - type: 'album', - name: urlParts[urlParts.length - 1], - artist: urlParts[urlParts.length - 2] - }); + Tomahawk.addUrlResult(url, { + type: 'album', + name: urlParts[urlParts.length - 1], + artist: urlParts[urlParts.length - 2] + }); } else if (/https?:\/\/(www\.)?toma.hk\/artist\//.test(url)) { // We have to deal with an Artist - Tomahawk.addUrlResult(url, { - type: 'artist', - name: urlParts[urlParts.length - 1] - }); + Tomahawk.addUrlResult(url, { + type: 'artist', + name: urlParts[urlParts.length - 1] + }); } else if (/https?:\/\/(www\.)?toma.hk\/p\//.test(url)) { // We have a playlist - Tomahawk.addUrlResult(url, { - type: 'xspf-url', - url: url.replace('toma.hk/p/', 'toma.hk/xspf/') - }); + Tomahawk.addUrlResult(url, { + type: 'xspf-url', + url: url.replace('toma.hk/p/', 'toma.hk/xspf/') + }); } else if (/https?:\/\/(www\.)?toma.hk\/\?(artist=)[^&]*(&title=)/.test(url)) { // We search for a track Tomahawk.addUrlResult(url, { @@ -88,18 +88,18 @@ var TomaHKMetadataResolver = Tomahawk.extend(TomahawkResolver, { } else { // We most likely have a track var query = url.replace("http://toma.hk/", "http://toma.hk/api.php?id="); - Tomahawk.asyncRequest(query, function (xhr) { - var res = JSON.parse(xhr.responseText); - if (res.artist.length > 0 && res.title.length > 0) { - Tomahawk.addUrlResult(url, { - type: "track", - title: res.title, - artist: res.artist - }); - } else { - Tomahawk.addUrlResult(url, {}); - } - }); + Tomahawk.asyncRequest(query, function (xhr) { + var res = JSON.parse(xhr.responseText); + if (res.artist.length > 0 && res.title.length > 0) { + Tomahawk.addUrlResult(url, { + type: "track", + title: res.title, + artist: res.artist + }); + } else { + Tomahawk.addUrlResult(url, {}); + } + }); } } }); From e1da0df8b948c07e7a1539f98a456777ccdd4eb8 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 3 Apr 2014 23:20:27 +0100 Subject: [PATCH 185/597] [tomahk] Fix indentation --- .../content/contents/code/tomahk-metadata.js | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tomahk-metadata/content/contents/code/tomahk-metadata.js b/tomahk-metadata/content/contents/code/tomahk-metadata.js index 9a9fe95d7..cf7a9a50c 100644 --- a/tomahk-metadata/content/contents/code/tomahk-metadata.js +++ b/tomahk-metadata/content/contents/code/tomahk-metadata.js @@ -54,23 +54,23 @@ var TomaHKMetadataResolver = Tomahawk.extend(TomahawkResolver, { var urlParts = url.split('/').filter(function (item) { return item.length != 0; }).map(decodeURIComponent); if (/https?:\/\/(www\.)?toma.hk\/album\//.test(url)) { // We have to deal with an Album - Tomahawk.addUrlResult(url, { - type: 'album', - name: urlParts[urlParts.length - 1], - artist: urlParts[urlParts.length - 2] - }); + Tomahawk.addUrlResult(url, { + type: 'album', + name: urlParts[urlParts.length - 1], + artist: urlParts[urlParts.length - 2] + }); } else if (/https?:\/\/(www\.)?toma.hk\/artist\//.test(url)) { // We have to deal with an Artist - Tomahawk.addUrlResult(url, { - type: 'artist', - name: urlParts[urlParts.length - 1] - }); + Tomahawk.addUrlResult(url, { + type: 'artist', + name: urlParts[urlParts.length - 1] + }); } else if (/https?:\/\/(www\.)?toma.hk\/p\//.test(url)) { // We have a playlist - Tomahawk.addUrlResult(url, { - type: 'xspf-url', - url: url.replace('toma.hk/p/', 'toma.hk/xspf/') - }); + Tomahawk.addUrlResult(url, { + type: 'xspf-url', + url: url.replace('toma.hk/p/', 'toma.hk/xspf/') + }); } else if (/https?:\/\/(www\.)?toma.hk\/\?(artist=)[^&]*(&title=)/.test(url)) { // We search for a track Tomahawk.addUrlResult(url, { From 173932b0ac281d55a4c2138b808afe8752a6cc2e Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 6 Apr 2014 17:10:23 +0100 Subject: [PATCH 186/597] [beatsmusic] Add semicolons for better codequality --- beatsmusic/content/contents/code/beatsmusic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 0ae3372d8..b2cf0567f 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -193,7 +193,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { type: "album", name: res.data.title, artist: res.data.artist_display_name - }) + }); } }); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/artists\/([^\/]*)\/?$/.test(url)) { @@ -205,7 +205,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addUrlResult(url, { type: "artist", name: res.data.name - }) + }); } }); } else if (/https?:\/\/((on|listen)\.)?beatsmusic.com\/albums\/([^\/]*)\/tracks\//.test(url)) { From f2b4b82f627d8675e6eb03b7986c380f183c0762 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 17 Apr 2014 21:04:46 +0100 Subject: [PATCH 187/597] [exfm] Skip result if no url provided. --- exfm/content/contents/code/exfm.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/exfm/content/contents/code/exfm.js b/exfm/content/contents/code/exfm.js index c2b61af4d..74fac6e42 100644 --- a/exfm/content/contents/code/exfm.js +++ b/exfm/content/contents/code/exfm.js @@ -64,6 +64,10 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { // check the response if (response.results > 0) { response.songs.forEach(function (song) { + if (typeof(song.url) == 'undefined' || song.url == null) { + return; + } + if ((song.url.indexOf("http://api.soundcloud") === 0) || (song.url.indexOf("https://api.soundcloud") === 0)) { // unauthorised, use soundcloud resolver instead return; } From 53c9fa02b116496d2febaadbd275b820ad639bdf Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 17 Apr 2014 21:05:41 +0100 Subject: [PATCH 188/597] [exfm] Link to source (fixes TWK-1412) --- exfm/content/contents/code/exfm.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/exfm/content/contents/code/exfm.js b/exfm/content/contents/code/exfm.js index 74fac6e42..e7b57dd75 100644 --- a/exfm/content/contents/code/exfm.js +++ b/exfm/content/contents/code/exfm.js @@ -83,6 +83,9 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { if (song.album !== null) { dAlbum = song.album; } + if (typeof(song.sources) != 'undefined' && song.sources != null && song.sources.length > 0) { + result.linkUrl = song.sources[0] + } if ((dTitle.toLowerCase().indexOf(title.toLowerCase()) !== -1 && dArtist.toLowerCase().indexOf(artist.toLowerCase()) !== -1) || (artist === "" && album === "")) { result.artist = ((dArtist !== "") ? dArtist : artist); result.album = ((dAlbum !== "") ? dAlbum : album); From f690ef8165a6d2e84d9e4c517b4ce91044fb1fcc Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 17 Apr 2014 21:05:52 +0100 Subject: [PATCH 189/597] [exfm] Bump version --- exfm/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exfm/content/metadata.json b/exfm/content/metadata.json index d012a3a1e..450bf0b27 100644 --- a/exfm/content/metadata.json +++ b/exfm/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "ex.fm", "author": "Nicolas and Uwe", "email": "uwelk@xhochy.com", - "version": "0.3.2", + "version": "0.3.3", "website": "http://gettomahawk.com", "description": "Resolves tracks via the ex.fm API", "type": "resolver/javascript", From 197a88849897ec5cba8900d7aa29d8608d51093e Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 15:33:48 +0200 Subject: [PATCH 190/597] Start capability table --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index e3c76c1e2..32ab83555 100644 --- a/README.md +++ b/README.md @@ -11,3 +11,24 @@ After you have the files locally, open Tomahawk's preferences and from the "Serv Since March 2013 Tomahawk resolvers have switched to a new directory structure for easy packaging. Ideally, you should download nightly .axe files, if available. For developer documentation, see [HACKING.md](HACKING.md). + +## Capabilities + +Not all resolvers feature the same capabilities, this is either due to the lacking capabilities of the service they connect to or that the capability is not yet implemented. +Some of the features need authentication (e.g. being a premium subscriber to this service), some can be used without any subscription or authentication at all. + +**Legend:** +* ✔ - Supports without authentication +* :lock: - Authentication required +* ? - Unknown +* ✘ - No support for this capability + +**Notes:** +* Some services can search without being authenticated but only resolve after authentication. At the moment, we do not support this in Tomahawk but this may change in future. + +| *Resolver* | Resolving | Search | Open Artist URL | Open Album URL | Open Playlist URL | Open Track URL | Collection | +|------------|-----------|--------|-----------------|----------------|-------------------|----------------|------------| +| 4shared | ? | ? | ? | ? | ? | ? | ? | +| 8tracks | ? | ? | ? | ? | ? | ? | ? | +| ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | +| beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | From 601065482d5d4e133b5dd7e721b48ced3bada7bf Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 16:09:50 +0200 Subject: [PATCH 191/597] Update 4shared capabilities --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32ab83555..c5146f3e0 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | *Resolver* | Resolving | Search | Open Artist URL | Open Album URL | Open Playlist URL | Open Track URL | Collection | |------------|-----------|--------|-----------------|----------------|-------------------|----------------|------------| -| 4shared | ? | ? | ? | ? | ? | ? | ? | +| 4shared | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | 8tracks | ? | ? | ? | ? | ? | ? | ? | | ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | | beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | From 5942fa2ab5e7e0c27062928bc99e6e5c62650355 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 16:11:03 +0200 Subject: [PATCH 192/597] Update 8tracks capabilities --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c5146f3e0..8dc4e1d89 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,6 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | *Resolver* | Resolving | Search | Open Artist URL | Open Album URL | Open Playlist URL | Open Track URL | Collection | |------------|-----------|--------|-----------------|----------------|-------------------|----------------|------------| | 4shared | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| 8tracks | ? | ? | ? | ? | ? | ? | ? | +| 8tracks | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | | beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | From b419aaea9c8a6122bbb83eacab35ef0ad7d1afcc Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 16:20:52 +0200 Subject: [PATCH 193/597] Add beets capabilities --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8dc4e1d89..53f8979d5 100644 --- a/README.md +++ b/README.md @@ -32,3 +32,4 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | 8tracks | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | | beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | +| beets | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | From 0ea4ea5f7eb9c8dc2434bd9dd44e8dc5fad692a0 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 16:22:32 +0200 Subject: [PATCH 194/597] Add deezer-metadata capabilities --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 53f8979d5..bfafe5e62 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,4 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | | beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | | beets | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | +| deezer-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | From 373dcca63b3ca0b031870893404304e0f106fb0e Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 16:39:05 +0200 Subject: [PATCH 195/597] Describe available capabilites --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index bfafe5e62..70ca97839 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,15 @@ For developer documentation, see [HACKING.md](HACKING.md). Not all resolvers feature the same capabilities, this is either due to the lacking capabilities of the service they connect to or that the capability is not yet implemented. Some of the features need authentication (e.g. being a premium subscriber to this service), some can be used without any subscription or authentication at all. +**Available Capabilities:** +* **Resolving**: Given a tuple of `Artist,Track` (or a triple `Artist,Album,Track`) return a stream URL (and some metadata about it) so that one can play this track. +* **Search**: (Fuzzily) find tracks, artists and albums on all services matching a query that can be streamed. +* **Open Artist URL**: Given an URL about an artist of a service, return the information about that. (This opens the artist page in Tomahawk). +* **Open Album URL**: Given an URL about an album of a service, return the information about that. (This opens the album page in Tomahawk). +* **Open Playlist URL**: Given an URL about a playlist of a service, return the information about that. (This imports the playlist in Tomahawk if it was not previously imported) +* **Open Track URL**: Given an URL about a track of a service, return the information about that. (This opens the track page in Tomahawk and plays it). +* **Collection**: Browse the collection of music stored by the user in this service. + **Legend:** * ✔ - Supports without authentication * :lock: - Authentication required From 3e010a7fd6e78ad932edfa149080e07aea68388a Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 16:49:02 +0200 Subject: [PATCH 196/597] Add exfm,dilandu and grooveshark capabilities --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 70ca97839..9521d403e 100644 --- a/README.md +++ b/README.md @@ -43,3 +43,6 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | | beets | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | | deezer-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| dilandu | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| exfm | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✘ | +| grooveshark | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✘ | From 9c6dceade83c92a987373497fa3e0fc4b5ced6e8 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 18 Apr 2014 17:34:11 +0200 Subject: [PATCH 197/597] Add remaining resolvers to capability list --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9521d403e..caa904b4c 100644 --- a/README.md +++ b/README.md @@ -39,10 +39,25 @@ Some of the features need authentication (e.g. being a premium subscriber to thi |------------|-----------|--------|-----------------|----------------|-------------------|----------------|------------| | 4shared | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | 8tracks | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | +| ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | | beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | -| beets | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✔ | +| beets | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | | deezer-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | | dilandu | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | exfm | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✘ | | grooveshark | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✘ | +| jamendo | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| jazz-on-line | ? | ? | ? | ? | ? | ? | ? | +| lastfm | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| muzebra | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| officialfm | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| qobuz | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✘ | +| rdio-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| soundcloud | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | +| spotify-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| spotify | :lock: | :lock: | ✘ | ✘ | :lock: | ✘ | ✘ | +| subsonic | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | +| synology-audiostation | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | +| tomahk-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| vkontakte | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| youtube | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | From 98a69898150e17e4827b2a9e4645f8a85c0d7d29 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Sat, 19 Apr 2014 17:54:05 +0200 Subject: [PATCH 198/597] Search not (yet) supported for last.fm, sorry. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index caa904b4c..2ea2e9807 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | grooveshark | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✘ | | jamendo | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | jazz-on-line | ? | ? | ? | ? | ? | ? | ? | -| lastfm | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| lastfm | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | | muzebra | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | officialfm | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | qobuz | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✘ | From 39fea7c5e72ac84ea02a16f789412c82b03875da Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Sat, 19 Apr 2014 23:04:37 +0200 Subject: [PATCH 199/597] Fix YouTube resolver. --- youtube/content/contents/code/youtube.js | 2 +- youtube/content/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index 4606df2cc..b4c51fb60 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -283,7 +283,7 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { } // Now we can go further down, and check the ytplayer.config map - streamMatch = html.match(/(ytplayer\.config =)([^\r\n]+);/); + streamMatch = html.match(/(ytplayer\.config =)([^\r\n]+?);/); if (!streamMatch) { // Todo: Open window for user input? diff --git a/youtube/content/metadata.json b/youtube/content/metadata.json index 40d9e7ba4..17e152a5e 100644 --- a/youtube/content/metadata.json +++ b/youtube/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "youtube", "author": "Hugo, Leo and Thierry", "email": "lfranchi@kde.org", - "version": "0.9.9", + "version": "0.9.10", "website": "http://gettomahawk.com", "description": "Searches YouTube for audio content", "type": "resolver/javascript", From a1e376707e9d288224ef3133aae02df903f4df1a Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Mon, 21 Apr 2014 13:55:08 +0200 Subject: [PATCH 200/597] Apparently, some attribute values contain semi-colons. --- youtube/content/contents/code/youtube.js | 2 +- youtube/content/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index b4c51fb60..7ac5c5a12 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -283,7 +283,7 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { } // Now we can go further down, and check the ytplayer.config map - streamMatch = html.match(/(ytplayer\.config =)([^\r\n]+?);/); + streamMatch = html.match(/(ytplayer\.config =)([^\r\n]+?\});/); if (!streamMatch) { // Todo: Open window for user input? diff --git a/youtube/content/metadata.json b/youtube/content/metadata.json index 17e152a5e..d2d9c2d77 100644 --- a/youtube/content/metadata.json +++ b/youtube/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "youtube", "author": "Hugo, Leo and Thierry", "email": "lfranchi@kde.org", - "version": "0.9.10", + "version": "0.9.11", "website": "http://gettomahawk.com", "description": "Searches YouTube for audio content", "type": "resolver/javascript", From e55645c3289cf187f35ccaa7d15f1c7679e0f47e Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 25 Apr 2014 14:40:42 +0100 Subject: [PATCH 201/597] [beatsmusic] Add Access-Control-Allow-Origin header for CORS --- beatsmusic/authproxy/authproxy.go | 1 + 1 file changed, 1 insertion(+) diff --git a/beatsmusic/authproxy/authproxy.go b/beatsmusic/authproxy/authproxy.go index c93f6c6a7..8726bbfad 100644 --- a/beatsmusic/authproxy/authproxy.go +++ b/beatsmusic/authproxy/authproxy.go @@ -65,5 +65,6 @@ func handler(w http.ResponseWriter, r *http.Request) { func jsonHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") w.Write([]byte("{ \"access_token\": \"" + r.FormValue("access_token") + "\" }")) } From 212317b9adcbc8c710a443ea1355eaa8b65268b8 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Tue, 29 Apr 2014 20:49:47 -0400 Subject: [PATCH 202/597] Ensure Jamendo icon is transparent png --- .../content/contents/code/jamendo-icon.png | Bin 10732 -> 8404 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jamendo/content/contents/code/jamendo-icon.png b/jamendo/content/contents/code/jamendo-icon.png index cc3e18538aed39fab94d662ed9bb5f12bb3ab64b..e36934cecd8d7c951e4ab0f6dd8fa706f1b2459f 100644 GIT binary patch literal 8404 zcmV;_AS>UAP)4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_0K*JTY>22p zL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr?{oLrd!Mx~ z03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE@L0LWj&=4?(nOT_siPRbOditRHZrp6?S8AgejFG^6va$=5K z|`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t74chfY%+(L z4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AWE=!MYYHiJ+ zdvY?9I0Av8Ka-Wn(gPeepdb@piwLhwjRWWeSr7baCBSDM=|pK0Q5^$>Pur z|2)M1IPkCYSQ^NQ`z*pYmq4Rp8z$= z2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV=Mor9X9@Wk zi)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3F4znTKoQsl z_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZXRY(gmfXpBU zWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6qn9`(3jA6(BtSg7z~Dn(ZN_@JTc*z z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW#Hr%UaPGJW z91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5YU_t_6Gogae zLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*CkMxR6CTo)& z$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4=0!`QmC#Pm zhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`hkG4N# zKjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=?H;57x71R{; zCfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV4H2`e-B#~i zJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOjV`f+`tbMHK zY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9k0dT6g(bBn zMJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3sdQ;h>DV6M zJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP-cdbwfPG-_ zpyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1@Q#ce4LsV@ zXw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy`y}IJ%XeDe zRku;v3frOf?DmPgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3e|F(q&bit1 zspqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bETE}(E>+O9O zeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$cQ|r*xkvZnNio#z9&IX9*nWZp8u5o(}(f= zr{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8{*wQ4;n(6< z@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh;dbp6hu<#rA zg!B711SuW>000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQ zO+^RZ1Rek{1hm(!=Kuf}CP_p=RCwC$op*dyRkp`}=bYQpd+&{egoKg+p+o3Ffng9q zMFrcuVbqVlDYg+*bRP4b znsWEO!K}|GpCpjG_u1#W*V=2ZT^2(KL0^<)CPKL?{ri~;g?yJ@tA}30qo$&+%jJX) z3<3Z+yE~)xa@+4>M?~-Li|>Q!3m~&I^5zmz+ErUohn9vbsH><)TT2^^MggrYZ4itC z1cMQ+E$v+{+ttej0AORMf{mR`=l77PAUJzC!#mImFAaG?wU6xM`$2YD+me+Zoc~Z? zaJCR-1?6Z~x1d?wg4UKc=rlUCwX}ofSTGF0vMj(brk^>s%XNu@1OOmJ0+9$LiGWB1 zuAVNiu~)&t*#T~zE^u&hz`*zc2#yLyji*4}=U1#?Wzttp=*aK~@x3 zky9xdD85jFs*5$KuT+EA^WZoRoSXy4aaPmo1wn))h!6x3_D**25A}tYzZat8BQa!b z90DW!ncp19?6h2R{Ku0hFRDaYK{+(78pz}_$Ye4wtkqern?w>N)7UJCaPe@4f2c18 zjfh6#wBZ;KM_)^+gX{oUkXeLF1r;EKK(3HeF_-2v!-7G8Tp>qrR3O3!g<|{zV-TAd z!`ycui?T{c%D0C*0fJ#5SIEFH4DJ^p5`ocR1ONm_1!DN5c+6Zh6&`->OrHlC!^9|7 ze6o^1bua_PS)~92$QAPY3gAsZi3zAoCPQ>W6cVQn$AeGIWcn<~?DSl+=Zk$fpPCJw zMh}JZ{swp}4dwMboZOr+a&iKaADxDXxG<(qf!zM-E^_?GRFvdggvv(Qr^mn^kD-DH zNt6&C8;Y5aOvTiPk{GK8nX>)pkb-jsnaB60La)_Bp;Vw>Oy<_W8{y{Vf=P46XJbc|4s{(mq-zoCL zrk{|VmIIZo>NhnOc6kme5r~3-xWqwtZpBgrg!wU60rKSjH1fr&EvPN8gUVLfPwE~` ztzO3?E-?mAzy1Wm2Zb^g1=#^nUEKh=Le@{Hi=x-^h#D4wc~8&An3;);ML_mL>>c5C zJiG(Fv10wJ@DKCt7R+vYBdI^7la2q}0(G^zA7T$hX`_U?T8-6zUyG`XHG~?-lH7~r zi&bBtzDf>wLz8p)dF>-!;^K~%OXWSz>vhW9oh znThC<*VrYS_#l&DJNmyCq2OE*ls5g|skvZgp2))VzrLggz?elNf4}M_P1>Q;{SeJ8 zEXU&K?~Y;5#(kvMH8TCs8S>NCL*QhbRW_aw0>LOk5=BVT)qOY;fgp(28Y|;E7p*y& zX$j359W{nwAXCV&ZS_vX3?E3sVnXh!nfEmP$j-={``PmKyQ<4-ttRXyi4qLF0Y;+$ z(I`T$l*7x<15R#EaB_3J>J2L3<>%S?nfhuqc%8xYbCnvrmPbW#6ru87Nej)tL5=T0jH!T0N9DN{pU96441!h#EQoAyI)~&A7WxuhrvHK?O?l z%5dsn2F@Kj4~Au+vQ=5k#KtDZ;GHku=pM*@TMm*>m#?#kNfitN1fzhV;|F8HgJUsl z{9w3wxl(_Q%91K%rRC!2?q863G7I*Ob{28?BvHbO4XY5>w({;}^tr`p(8H0s?nummm!>ndX5Ec`Hkf=ZeMg(Bz=X+3^ zTLv3DdZw0P7!+m}ea`s8X^D;jE}^#Z!SU7 zya~{0^i;L7G_MT#=L*SPK{5cd=gWOm2Xt+_wiBY8w=4RB1V#klsaGGzuyJwV^#-bS z?^^dG?h3Lr?~+tiT21Yt47?Gerj5YTJ_NBt+`L`!%-@$FI5H68b)i6WYvuWqS!k|n zZn-1Kyohv7etj+SGYetR8xauhhwzwCOnGP$ zf+GW|!%Ti;DlVMNLR!jcDpR(K;!4z2)D!POFXkqVOg)fJ?O>@-us7!aVNSO{pR)Zh z4(~pWrn(liw`!1`mW$mRe#Dv;>v3Y=DT`?4<9~jHTJ(t!f)o4FZf#o6963kjA$Yw3 zkG!}5w)VE&F5|$qpJC@)3RFS*h4^6B;u#Pq z)XOjo&i!)!W{^$w&7`TmnM#902L@x@tkFFxqrS4?mW@-{s?b!|f^R@OXL0E`VE!Tp zIJrNK8c2I5d(3)lI+f{&UaQCc^!3^sK<1?9QE6yIY#2sPN$3^RayQS;-pLMGr*g3F zy-oP`(_Pf&deaw9hJ&*M74Nn1eDRH@wIH*Y$^boa&Ny%sw~LreZ8Nt1XFFEEu@>b; zl~lBH?5t5#+E;P4JuCnWVkX%))Ha&G2QduB%os`Co9r;Pd%rq>HE*p)>Vb5#*EwU+ zR4PtS?wR~+Aomt-YNKIx!eT<2_%i(0AVp9uvY0X zwR<-1$7gSCKw3&huXbQ_OUs>AFj zlY1QP3JCK>`hs+r+Rg8OgN>`UpuVc1N9EC&ZfV^<>l{b_UElFuLVo5r`w<}3CprjDCIbHFauxyb4$0& zai!qwXxg;&Kz4UKhb4t!7}(m|VE@(>6lY)TRv9#gEtX}$)>ouZmnD$A#2v z>$V`5n_JN@clQcupY`Z6$OS`|+4rNm14Kf=ax8{V8fM)fFWluwb8ksQO=F*gXyA>Q zyL1-31HHOE&Qj@Yv|dWhrP@9PQ7{V7YkACFG7AfzpWp3rXgE8Zj03eZbCx>o+a1ws z^>FcU!2^%a!2IXt^eDPRBWmUwZRxRR2#o&R(GcaNH z*dCWjBaZFr?da;JT|OX%5AJ|GW)ahI^G1* z%iq)NAe+^ft=N?EaPe@)tjDHf&eB=1weP(sRB?8x*`MF1!?ZfOn1AbD&gp!s14syg zrcH~ukujLHcseG|8Q1IO)9}{413gV3y#vf2*sZUuho)6S^{Do}n9^wvC1LiGWJL6m zDZO5*F4my^ipK1>h1omWn?SmGn}4ZACYPZgvk37MEWdBZWJ;Zo{OB~yed>W8ok6*i zWT)j)x$-SA+}{K;Ak2@-3p{)Lf<-|RLZEHaV$g_a%vwAhlje>$YklXAoi}@%L{WsZ zyW@u}064olen?|8?dij3Eow@69givVC*ir}OUw>Yuhk>>Y=PO^<>cxFzfivySpe`0 z^?T97*WK)us;e7Nl6#RlM7@rOgR?yrz3>qJ_|DUahzmD+ov8=Xp{H=;N5@{MP6Hkt zA4O%H{C>k;$`gDIqJ~Cb=_`xz*h>$aZ9M$7?B9|?WqcekIQ&MC;jwh?w#oSUEY#Hv zJuc@?$Lg*(rIY7P#B*;hMbf+p)H+Z>W)aHrFPXg_NsnP(NNQ~&{beWz)jboNRk9in--BnBCzz8$FTV2g|Kz7r3$g=LJ7{NW>ZSzIIePj?9Q^iYv)}B&ax9MhZ~~)ejzr>=;oT}@;_R^~ z%e#d9bA`!7C24j;Gul;_#c?w}Bsm2Ts z*XcAmDm}{G#|`goS<$0guL?7Z0054zjuzdiSCV}ZZ!UQkypE?*U(kR+{A<^HovMF> ze_Te6=!cFUOyxlshCyw4J=VXwsYk2mkwXU{a_9hyLTs#S#+nuDq3yv&=B|3HV`e1Y zXytzWM>7{qg^@Q>c_4*Sjw8E|;hT?kP`jw1w?(JXVg0+Ckbka-+KrkDrQ)VT!#9D9 zj*nz~DV}4rbF{xVmVWcM*@2~Y_kh)#%tPmmXLN00!p;E(gD zzEp)ufv-Q@j%^=*2fbF`Cm=S}HDlBJ-(c6eAE++PF${w_OOkK?cWb!{n-Btn-hc<6 zn2Fg-X2GYM+YhNYHaQou^YcA8`0Zghx;Rih!0R98hyUzZb#GT;6LLhDwjha0r04pc zrcf#H-Dlt9^OYNM=IA-A11O0iQV*nK&58{;yz>~GTpg)G808fqF*lvRrC^jwtY zltF2u==({|I%M@5YspXF9I}eEg9hFJ18)S&vIvauM_`0My!<>77~v1OQVwS~CjfxQ zZLSY9@4H0`my+;jzPm)oJPYCuIv6)K8MsR!jMIg~0T6iUnIkmhwf7Qeg@5C7@+ zJxe~ zwYSCF8(+u0q~^V6^%^-Pftj&ridBcvI&vn<6*Ab^+1&C=WvlA^8*A>6EX(5IW%KR{ zVwXSyz;}Q9z%Fsh@IDhp>#HJ(5~eLk!t5uL@42TjUG+vAY8uJE{`@g=Pv@KNqv@Ak z6}?uE5lQjbxM8hL87aGGjp?%I;^FJgEL-_3y!<_3G#LBed@nwDLLlhxvBfjqdU6cg)O01_0Ui z$xf8!lu=tL@9WYLc8nV}sK*ey<+a{Uax(JB=6`KN)~Ot*Y*jtZv~#~tF9bnA!o*=% z`s(6tjfrLh2>_L))nxPgTXE({CPY!Bo-w^Ih|yq#%2tJO$)gZ8ENbY~hbH#QAxfsV zS2bdo7{y=y=QaMw_s7vx-vWhFZnY56h!cP1A+zwV8rAE1cdqbnkl6UvO`j~A0{XFrz7`FK6LFmD3l5? z_pvi13L*@=5zg*Th)IaTv;~vRqJ`8!nqa03X>MrCJbN?~#aX2$bEA+^O9e~?peVwi zHvx=@4MY6+Ay~8YW7R&g&+G?67}{GnDvGPf(eHmjPDUQ8F4o|3<7LPda&R)PPdY`W zHBbRYg8&x~=T3k&_VS@qADVie)^jkH+KW?BTt&{G$U;_H4$2BDpsrGb5CTqa%9(8K z@I*m`U=+cyfPbhTf+K?v9Un;@pv6IUNHUYGeC3BX^x0`SC@-o+eU%#Zm1=M@88{gW zj^nJtK@vp~q98#OM6etKFMlt1`FkKZG7v+?#9_qbc#E17i-Y{Nmgb);K>pbx)K@j2 zMcs@hbqm@rw}a(aup9@DW5FcMJ2qF<8fe=%!4jX$F9Go5C=;8oZPZxwl1tDZ$5EzdAUF?YH z-PZQLtQO?2B|9T;E)k_&wH0+}X}E&AihAfYI_NZd7!3m2F1L05ZEH&#ggY#)+1RUY z*lgU9WW~Y70dlzvAyGka_Hc%Gpcf3h!79P^S&(-E?B(mRtG43WmD9BqbAYkxmf=k&q5qLOP^FN~8n?q@_zhy1S8XDd}(i z=R135?>V#Q+?}~|@4V0Rdv1i5h7vw5H7)=E_$tZ@I$(?Z@4&_czq_O?2fzl?N=-=t zc>M2^+ftMWp22ZeHhd2NcqIQFC_qLgC3q6cO+_7!wS-4Zh)PsSx~B&K41kJ)te)5W zp}(h_Nw4>@)4K&z?n=9+_Pk&qTosj}15;mxS(YTPghiFyQE))xK;%az?e%pQGq1}* zsz?=WZ)A2Jd;BZ4D%@|1>5RWvbq?rSu9o+$797tW47h6mlt>I;6xGc4m*Gfq&#mFB z+kU?@veoGZ!FMsn8~-&&Kgc+8lWzR8$E(TAzxgu>Z{(?s=rj1*Oh-SqwfU}U+!o(c zrFI><&Mob{J?yNt3MLH7A4CUaoDC|?C~|Mz?YvIdCj3)%BIR_#{bxP#fa;Ms;~%L< z7|>UHg<&<*wU1u8P14mB4l)PF)Cx|%yzb&lnAXk~jky%$5$}i+bh~AaM+H%lL4>Fd za?Ah&Y!>^r`0JvLC&CqVJ2JMOe;S=@Pi@3{6fUvYrjjYDQo7c&1~`rn4GXSPf*lML{an}(u1Zp8l4(SboqC*CdF!YmZI%VwK zVop6c27;Xwo(`xYIgr$-=iS6~1P&(5{HaA>E8eft2g?WVrLJUCBz+>U&mkN~2LxH% zl?M#}U0@=4*TQ_l#(DkBNaeBTppoMwzu45q<|aQL)tOC6?OEs{PzGFA(aC9hEm^JK zmVAdTSkH@M1Gvfw5V#J58ow7^+-fDm6tRsZIJk@sa7;JMB?ru}4{>wXhIA-B$h~jA zC$%U@-kT<)#tF>>N%g_$$`ubGPbUs3!^qe|9{1va5N$GyAPu1R{nMlAv{_+PT!c0> zf>@y*JxdnJ@myKGU-?zayFR!=v`v7of3K#{Vr_~di%}^`ZvFQsL@p^6JOF=u1g;U^ z5ACJHmWX4Cwt-gHiN7NbYJ2>V8Yy`Ng)#F=hanVR*kYE%V=cCK*K+4vftGt>2*k%7 z@-O|IL2{^X7CQ|RTI`9&Q}gv}r)!-Wu6{cz%8m#J+}*YS$R>K;JA0Je^B1C3Fa4og z5Bv1yg5^I2+V&4R-pdvg4UCyAC@yKlV~ahd9T`&N$sya7K`~5#Ho|uxVi`%v%75|n zt%g#P>-?SQqkZ+{*M(k^0wXr6LF~OM(Zj%G2%~RoDdyL}*Uv^6ylGs274D_vHqmo2MdEJz@1(nS#1VCKBQ66xFa_Vckq1(XN$xl+JDy8O0^sUefd z$bfEK3A6c|;YWTI84e8g;*ydO!k~|HzZ*7MFP?LbWqfK9YdSp7j`}xT7p4_=^BD{H zesLJC8G!*De7Hz#+V7`+@Y+>S$#tAnGz`VC?3;-_d5MOOKzu7HuIzz-BJ<>akC}E} z>T&mPO$XRH+)+}9_MV>U7`#M_3vi9>F6s`_G179Ys=4^LJi(hS=_lp<)+@S-Ta7X$ zo#A1~YVNl8i`(^67)0J6g$0}z=Q~Fmp&4rK^wXp>g4(L}3f*aAMk|V2wdf*0uAUnj zr)ic(+1Crs)U>)@o_q|?v;L(;n(Qhe9C2cKs$QwZXtMqKi#@QeX`u+iywq!6+Z43$}_8 zDssq^xfl?tnn1ed+F(Y!v>u0^brSDcv5gO~5XGI=zYqE)IAv+hjPBaiG5Q z)MA9Gv;v+$F_%+&C;YcvncckGuGep_A}L7{ZR2Sf@9Zq5Yz{{SeK<=U^&T0`PK8e2fc3WHI%H6JP?* zU)GOOJgx<3xql1gho~8({Dk}A$3|5#gOzXc;Lp)Nj1>2P>;0mA6pJf|oYic$qjP!y z9JM&a=TtNx`}WM7C0gW9)wsZ>EJM5B#@(FJfFD|or({Wp+tf&ty{5(PTqMr=alnZC`|F?m44s5x^x@KiZ0%Rd?kzd#e&j}f z=>5`NlnvyVwF}v(%&UP9JSe7X1sx005ws3gp-gmz7?A&ygCAR5H;4cb!a2-302+j{# zy-$@^%>6AgJ2&pwdbw?~5V{xZ@4EMJWqz~seY(+uFjR{_3_I8D4maKJw3?B_xoPQ> zf~McoiVe%U&@NJHblo%@hVF&LAc0J=vN#TR~Duq$+=E!I!nSS?;!7#*)K#bq z@cr@AEw8{{lk3Z(VYUcjT5ApVsvs>jY~l%GLMn>D%5YfPcPKVr7z3;i+d7;m1ZE+M zS*S&Fjv@vi2iAIaM!}l*v4ov+k0$g_%ILy!*qEib&wS(9)O_&P9(i<(Snk9bj1vDn zb<1A59jS^-2He@ALr_CTck1!f%ag)<4bLwqqe{I#+TH9>s#g2C3vs( zVT3-f6oO4xb&d8c{GhVWIiFjjGw2+>yP%sTvx!+sS)Dh3@O6)@&`!M};pWXoXnGH?;TVEr~ z+KC-m15QU)jtv_`-soCrSzMPXBNMu8KUKSseYp9aW4n7{a$R8kOK%iML2XhqtM`qk z9I*{EcQpKO9y9l#hU{xI>O7L~gy&)}VxBdxT_bQ+5};AU2SQl$G-6sW=aG8}VtS@! zvYN(EAc2^as1OpFtf&^ECB~MG2mBD7S9e42rAv6gg1jg=H}eEp7wXZ?(z`x>nou)7 zu^Hg^xVhxL0hTMGt19*`zAc$oCg}Ws$A7p^@aJ#kGfWbrT3fW+P{~xwhU{iT)%Y_B zD0~)fwLA(@;cTkfrg~A!!&2yB>8uCn-&ul6iowOJd4KqIduA#9v88=AH{pduxavWp zl%|D=D>r+=7Ml2zfQrI=9!+h%e!LJn_wV~nfjnV&+`UkzF5pyk}p z+UkQnH-%9q>s|!19f8=m1R;VvsD@np&JWd5BL1rq86_D|5)82x*shKe-bG&}gw~qC z$XKVXxu|6Y6<}-3QA%@v4O9w9UkU+3Ub)VG@y6`wVajQ;BEQuoc#;}NRWn%*DK0(@*YM@OKuYlVN9RU)taVu*D_Xy z6Mv@^YZXt2C&UvZa^^l41y$h&4#&w49*Q_xzBd^8TfCh|E5`yc1hFAO>s1UIZN5!< zWO-`fO%T^FRTF%sZ>AfI&`$Mt;?c;{)s%s*b@VM%qC-=(6cj$Yyd6=2T;R)(;#p8C z3aEf;H1t+UZ{gEnx$f;qGgfZ%Un@cWv+)X9RISLz@TicXt>{O;t5dcTo=I-7CfTL? zZmWNfjILb`ly1WM@1Iia1~N%Lh%x*t$%cUoaD2T325B_*U8QtK!W2jdUnrwwv-oG- zWAlB+ynK4A>!MI&bDkj)NVgdSAivUoc*t5E&1EwsNG&NCehC&!?k-~Mp8J(1EaRv1 zA%ySyn$L%BBQ1Cd2dAAE@4cX{*Z01Jm(Hr+mg^Ne$XH|;-=P6+LY|VJ z)2OdfTe9wxEGgTZny;=C*qOK)Aq!9MG3%ssV6u0mMAt9ZdA{G>w2mV;4HnP-2$juc z#39=O_Nu(O-G~j*=Lq30VzP&t9k<87B?uW3NmSt9YTK0v7muEN5yjoGtJykx6>5uY zJ6JKCXTBPDxV#J)5cwrdV5rY9fUAdS8MK?wp{5K*JsCA$JpP6PD__2AiN!HS+Pu+4 z;Kd$DX#lyUKW_&R$g4O_I*|dc1W4@mb3QW(g~T6j@;paAWrRUy4Tatds8%a zabuk166N2ja&q>I%qvKJj}XuD%5bg4+ex8lNObO<3ClT(k9s~(v7us(5D2|d0s!rZ z=~8iw=ZN}d{z>8U?Wt6IhG+`azgIz~9uzv{ENh=vnrNuhCJH5e&4=vD-u7@kUOf?c z_|1`&$*E**BVgpPV1X+P?WUC|)yQ)|31aDoAP}IUge+7#_HeRQOCCF~!1SF=lOH>Z zn$`nO2h9Ea5P-oC=ZnkG$gP8pY-qnL_i6p9@KJkvij!k!N|-QegA~u<@zeI~nJdf3 zrX1OXR}ES3+-lvvg2FjVJ!{pAfGW(L zJuW^Y#FF#z1?O`ilMP{*jaX|=`ztg*tRcAVk>V*(4yMyk zNd6BZad3Hc;ALmXy=wMJ6Q*b@Ex@90yTmaIIC9jZn36*vhGbT=n5^G$rZ^g`M{J$q zNS@7Pa(7vIS)do#axnvTUyI89aP5liOun$IG8E(*Irq$l)2Rvnu^NkvrtvsukHj@h z;2CNDSd>pYP(?{oyD@sJblMxR5@8)6hI3o&kBV+&u+`ko1iCiR_;el;-v=nQ6Gq2G zL;0RP9FV~&E0~N!UvwG$4e*3T;PwBVMIexnxU6v`&Fp#-X?w*|EjwL zvx?&HZ~VqDrWFjsdcKz2j@?tKkXv=y3b@Sut$A0#sB?@xu3mQ4=d(%NDHsO zqR{qhc2hP_h@AaHSzNLgAlP2jE%Zv>R3+G25lD&?NAC60klhwrH&2!Xgzb>W*Gplg z6g#)QJx}(-Xl|D$^n#p2)=$8ZxN%zU0R4<5O`WM(=dUL^3_h}?`fmq=7j`ejzw&W+ z>{Q~{7F;Bz`4a=!Q0G}w8vMXejCZNVBuXEl?Z}UF9I%Y&jO?Knli^AT1jVOeiI|7B zB_xaY0}_-qismmLZC0`zokI=f;?LmTCT*>}U9d|0xGyEeiWfGQ18&3iW>|2)%O1h^%D? zgY2}X9+e!&SmZ`=#`5yHFKlX5fMQ-J${%s_ps72phjS0$rj!i?f)4uq$fDl6d`^sk zs!^H?$|L%YA}9Lpfi^FEmLgR?A^RNkpt)HJ^EMfe59Flq(UB*d?UZGwH2v>>3 zkPsgab6wNMCe!sJjo^5j(1JaF4B3XS8lQxdW&mJ-E~sm%2T9 z5Ak@iUfzor-{M2`j|MwqO@zRb=*xqXJDTR!r-8K$LsYw85lN__GQq6NJ#*-&U9fCy zj^w-@J*tP3#RZYeqD0{uPuh`AVw-6h48jIe#zy0&3JBm>uEYVVbIPr)Z!FJuliJ?{ z?9}}6pdbeUDMCEAfMU#h5lmlvNDZQP(r^m+NSJXS0*c~5Z&0oE~bA%arGC3$zu{L={s z_@cTdHeCB9lG_VDoiO7t+#{Cb4^+JJdnr0hhzl&a?_?rfgWXP$%hL2eY zwxeH-Y>P>lzor0?MbDqInlhNCek@$eD8fK?9o-%7jP76$R6*Xwl&-V3lYHzx<+k!m z(BIzw@AsFP&y=Gc-)Q=p$LRYQx<#FhV>v(TPGzCu9}s}iRJw_Roo|MDJQxk50~0lpw>?;NnT{1D2@#JvBuYS^&&qhh{P*IF=U7v zC6DAQY*G3k0>|QxCU1Qcvs&zrD?IIg7g8DRBocNN!??L9 z_vrpMp);K5nYzrG3ZOCY^PtA^v6&Fm2N0=XD`H9}i*A?pUAfj+58|}QhN(YU4)kqn z!dIcfNhK?4jQ3VZ6>+KFIlda-#V{aYw8aFWot=&#K>&Uz;be+X`=RT~iQW1s=Ez-#^MY2TDOiP5@*qzaNb6E zLl$F7`9R0Cl92W9dD@V)VB0CJ%XxB8vVkS-)|AYLD+N6x=ryK{m!1fE;0&uZIr<@f z7KobAq{HH6TS2Bo#uG-Ps0;ij;g^r!$@{6&LKIufnUlM=WaQzAD;2+b>0~A?CKG2d z#u}+m2%8v;Y+=+gl3h;jC=%oxVIZaEHcQ^b2~V>wPgTH4FqSh><<<|d#=xy}%B*8u zdpj&HWTiB9y+`w&(X_S(C4MnMk`wy3o7w%~R$fo;kGD#aiQa`14d68IvHL9&M=Io@SmGOU74T92=SpdW)sPPYmkg$)t0M zg_4uf5~Vs8h1>t0o`Spqp-q@<0q?ksnLRz1@B3{I@kcIKBrCT#>>uuQ{gkJ;e@eQc z-X-u69qRvv6A$?D`$sBT`|SXni{DT;O(n6$rezE{fi?W)d#kmFNQ_UO*=zgrKNp+6 zcmnyG+}$lJOQE-Ip28qMws&Q|kZJ;rGD}fE2+`Xp3PB2&(HZn9J=MdI^vI@)O@KG% z2?1UZH`n9}O-B`EeqUVM`wMj}UoXBIiYgDqMWV1=Aop)VH;KQ(741yY9|%Dn$~Z}! z_ggaDGd3_=78I<(jz;{S(loHV?x`k*fOJ#fhD}>rb$0> zSF%bV`nc@oA)t}AT>6S!1Z0_Z;&HLbL6fpQA#eVBA zq)AX}eBwYRs(+dmFKj5#+E-%@WWzHBxXmm0xcHrU2*W;ul-PzOgF!^1nz_>ko0DJU z`!HS^P>wf-h3AEXzmzptr{e))#*J;X0AAlAfV^#O8cIuPA|&{%J5{ouoJ%n}HXFE9 zaU^>^*YAMZF61~6xQ=rq~vtw}0($V(XPfJ1o6OH-| zP)n;#zZM325ifc}&c_5)rFb)%IyE`nD^=ySj_hM>DYm%1bbK;;TEiEbyQhP{{IA~A z`JoTqkah&4og-=#FXj&k;y#@prARy zZKVhRGWS1K4H&yPmo%?u)cBB&3s7*M0`Vq8hz=iwSV{ij74g+mWIU=F)U)heF~R zrN%BhEnh_f{xIG&VOl(=a%xDMyg0~O&b1w!KG^`_O*wS{9=G9V0j468HJYvwKX~%BgEsM{3PEdvh4(G}T%rJm`j?OG&874?hNxI+VGiA4Rtlqvo z4#@Ig1AU_NVKk5HkZ;?X{baadtsMX~9(opnwManaN)-0AHm%lregmT_CYQ?Oy z+;tB6`WIl;3)L`5iIQ)}ne>-88=S3y85L+) zJMbpzqub0X&32E$fOUbzD%Tf4q}pryRgoen97c5(LO-3Xs(d@n@OVOhtb7@qBRy4V zKT)L=)D=A9?IT0qA_YFOsZ+c@gL=q_#9f@B58X>Mx2hyuRLvT{j&En+b%XIoH+Q(4 z#{=UlZWVbeABjBTGHhI&yF9f%ZumTVs>=q%wTJfpc=QO$CFje!E0cpDPc6ZpZ*iPcUDW|nK z)#hWY6VKRRc#&)Vz;4jMkzBYadc+$X<$hHK9Ys_ykFHcOCbS|@M2-Q3NWv$SlqpE$ z3(kHx%q%}@Jc5`rsU(;4U(!P9{ zq=#4@{+P0CgXu&nCEu0?vVR zAE?J|TM-;CNwmnGWK;B0^_^;Vwx?ss*0K=#022{C~w0POu?SE;#0(11{-j?%c z6cXlu>|ckR&9cUteXVWe&URmrYH>!)d+ao!ZwzXDg%@ze&#ax-EwF_F6kgzK#W~5w zOJXMYd>lW>HWrIR>2-}}lTH{s(8+cHynqUw;4ztpqXJt(JAOsxLbh|$fyVNARZdA` z6u_X0rzp%ay<7dsBBm_#@BBFizv;hR6{hG%YN=mQLm>!<hO#=kFmJvzDrmAAE;pQ_k*=a-L-D1P93&jv>=pPd%2C)(Va-%fpg z0b)Ed^lUG2tL11o!}eJkLn||=_8Ywr>VBazu4-C{IK(Bt`M^%zH4h9PO zpobd$yKwfQy=qYD`-LN@%qPf!WujEtsKnc01{;_0CVa9OF}Qw!JT{-OzK||9?bsf{ zT`Bipw(yFQ=bny2bALyB9`2rTJ%(ELH96wbg{!sxNNEyY{9!pXjrcFWRT)dOn7trrP*F0gg6kB;tNTG@+sWI``mwQdYJ@Pfd0Br&c0IxR-Ryd{U?lB| zZ$=r{U=au?;!?7{-(8X14u^mdv380L_JB*G&&@JwXL6j^@fYU#M=oEVURbqrhW3_dh(~@&LiiapN zZ~UZBtIErU95jAkf0X>HdgVC0x}HqM31o`<5pfA^UAvopI9@cU^k=eH+iT%nc>)w& z=BTLlN1GGoP~Tc!6d36`x=6au(uQo#o#x_gaiN5M)9&U(K*iw2NjlYnnfbgbEWgtu zT5NjzQ^42r&)SdI_vWx+qBat95*!$U+DlfJgT?8-w>)I9U^mPm(ms*rgIV-+sK=C$ zL{D)QY6k;yqv6d+pKz4rHeD5S*QQ&r4V54xYmf?vH$lzrUcxDzl~$K~UFSQk?<4vY z$r_SF0{EeXps~-I0f4jUB9{iei0!J^(YCz5JPqgY%P&70F_s)#N(R=f3}P|ZPFDTa zkGB%t(l|I(;>ncrAn+8+=TuY0UR;Su>Dan)t>?s(nk_PQfF>H!SdILj>z{Dd|f8d z-cU_r`vqk%s6Y>>pR8dMnyEXm`|cP6`4E=8}T}?oa_*lWkt0z_(wWp$&cTsUW?>ja&9@8580YoLv zvsupKOM3B=U*1IKX>^~VB#PVcZ$QljT54xVl>BcDic5+TOTu=G6e%4$8tyAOphYN(Nl*k58D&xM{Gqb$4dMK5J*)q%e$%RA(A3I^~lIL z5wrJ8n#mOn2wPVCC&Z8>! zo4@{VHGQ8jS~G2LO0AG?mmXc38CWwFZp^MuH`e74Ttdos4-Y&qJfGyXIUpNN-(_z! zi0Bq`xEDLwt)Ii5!yxrbk{|NYtQrD?Yz)yuDJ{=cPEny`xq6%Et#LL~e4J7V3O(>n zTDtNlwIP``J&F=)*i`9_b>POtKC^VeViVy1t$T0VS!OA{ Date: Tue, 29 Apr 2014 20:52:06 -0400 Subject: [PATCH 203/597] Update both instances of the Jamendo icon to transparent one --- jamendo/content/contents/images/icon.png | Bin 5689 -> 8404 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/jamendo/content/contents/images/icon.png b/jamendo/content/contents/images/icon.png index 1b0bb15502808e60c37f82c029d9b8d49626bc5c..e36934cecd8d7c951e4ab0f6dd8fa706f1b2459f 100644 GIT binary patch literal 8404 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 Date: Tue, 6 May 2014 22:06:25 +0200 Subject: [PATCH 204/597] Put a fabulous magic spell on the app_token in beatsmusic.js. --- beatsmusic/content/contents/code/beatsmusic.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index b2cf0567f..01276e017 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -21,7 +21,6 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }, // Production - app_token: "<-- INSERT TOKEN HERE -->", endpoint: "https://partner.api.beatsmusic.com/v1", redirect_uri: "https://tomahawk-beatslogin.appspot.com/json", @@ -92,7 +91,11 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }); }, + spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, + init: function() { + this.app_token = this.spell("s4fw8if4jfwxakawi7xud55c"); + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); Tomahawk.addCustomUrlTranslator("beatsmusic", "getStreamUrl", true); From 569d47a4f6637dd9553064de0aa7096ed3c30c7d Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Thu, 8 May 2014 16:48:10 +0200 Subject: [PATCH 205/597] Improved beatsmusic.js. Results contain proper duration value now. --- .../content/contents/code/beatsmusic.js | 49 ++++++++++++++----- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 01276e017..68bc9e7ef 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -146,19 +146,46 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { search: function (qid, searchString) { var that = this; // TODO: Search for albums and artists, too. - Tomahawk.asyncRequest(this.endpoint + "/api/search?type=track&filters=streamable:true&limit=200&q=" + encodeURIComponent(searchString) + "&client_id=" + this.app_token, function (xhr) { + Tomahawk.asyncRequest(this.endpoint + + "/api/search?type=track&filters=streamable:true&limit=100&q=" + + encodeURIComponent(searchString) + "&client_id=" + this.app_token, function (xhr) { var res = JSON.parse(xhr.responseText); - if (res.code == "OK") { - // TODO: Load more metatdata - var results = res.data.map(function (item) { - return { - artist: item.detail, - source: that.settings.name, - track: item.display, - url: "beatsmusic://track/" + item.id - }; + if (res.code == "OK" && res.data.length > 0) { + var results = []; + doneCounter = res.data.length; + for (i = 0; i < res.data.length; i++) { + if (res.data[i].result_type === "track") { + Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res.data[i].id + + "?fields=artist_display_name&fields=duration&fields=title&fields=id&client_id=" + + that.app_token, function (xhr2) { + var res2 = JSON.parse(xhr2.responseText); + if (res2.code == "OK") { + var result = { + artist: res2.data.artist_display_name, + duration: res2.data.duration, + source: that.settings.name, + track: res2.data.title, + url: "beatsmusic://track/" + res2.data.id + }; + results.push(result); + } + doneCounter -= 1; + if (doneCounter === 0) { + Tomahawk.addTrackResults({ + results: results, + qid: qid + }); + } + }); + } else { + doneCounter -= 1; + } + } + } else { + Tomahawk.addTrackResults({ + results: [], + qid: qid }); - Tomahawk.addTrackResults({ results: results, qid: qid }); } }); }, From d28d87a6d22a33cecdcceefef80d064441205b5c Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:11:25 +0100 Subject: [PATCH 206/597] [beatsmusic] Optimize PNG size --- .../content/contents/code/beatsmusic-wide.png | Bin 18351 -> 14630 bytes .../content/contents/code/beatsmusic.png | Bin 30620 -> 22150 bytes beatsmusic/content/contents/images/icon.png | Bin 30620 -> 22150 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic-wide.png b/beatsmusic/content/contents/code/beatsmusic-wide.png index 5287fe54a2bea872e15ff12310e2ede0b1c017bf..ee117951a259eea6cfb79cd81435797269bbaa01 100644 GIT binary patch literal 14630 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 literal 18351 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 diff --git a/beatsmusic/content/contents/code/beatsmusic.png b/beatsmusic/content/contents/code/beatsmusic.png index 36ca7a48a6f55c7462b9c4d4e08b95cdf02835a3..79c22b87524a90986079c740724142030eb70802 100644 GIT binary patch literal 22150 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 literal 30620 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 diff --git a/beatsmusic/content/contents/images/icon.png b/beatsmusic/content/contents/images/icon.png index a7435553363d3132f8afabf3c6d4018976e55fd0..36b747c1a8a4a296ef5d0d39bc99069b554e1739 100644 GIT binary patch literal 22150 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

OeG8EQii60 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 literal 30620 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�I?c=>kwKQ?M{#+J?Lur%Z9R6h1>8 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 Date: Fri, 16 May 2014 15:13:53 +0100 Subject: [PATCH 207/597] [beets] Optimize png size --- beets/content/contents/code/beets-icon.png | Bin 6083 -> 4775 bytes beets/content/contents/images/icon.png | Bin 10657 -> 7274 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/beets/content/contents/code/beets-icon.png b/beets/content/contents/code/beets-icon.png index b649527e8435467a66f280e5407bb3ab08a3cba7..27fdf82cb719def41617676beff089f2b76e51cc 100644 GIT binary patch delta 4731 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 JPDHLkV1i~|^acO` literal 6083 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 Date: Fri, 16 May 2014 15:15:18 +0100 Subject: [PATCH 208/597] [ampache] Optimize PNG size --- .../content/contents/code/ampache-icon.png | Bin 12169 -> 11781 bytes ampache/content/contents/code/ampache.png | Bin 20443 -> 18077 bytes .../content/contents/code/owncloud-icon.png | Bin 13389 -> 9383 bytes ampache/content/contents/code/owncloud.png | Bin 8999 -> 7526 bytes ampache/content/contents/images/icon.png | Bin 12169 -> 11781 bytes 5 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ampache/content/contents/code/ampache-icon.png b/ampache/content/contents/code/ampache-icon.png index 6c4155f069422cda3d198d550d841dcb501387fb..f555e5dbe8ca6fccf54a36336dcac66dc462d11b 100644 GIT binary patch delta 9109 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 Tp_&bk00000NkvXXu0mjfZz$-< delta 9500 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 literal 20443 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 h1s*lVk++;mD_nc?% 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 X;lQy&J_PiCATT*8WyyMRlhFSG>t#bB diff --git a/ampache/content/contents/code/owncloud.png b/ampache/content/contents/code/owncloud.png index f6cb20720181e2a9d4c85654166221e41e44b3a3..4b44c3daa9a08d2f772f0c1bc126069ee24ab5a9 100644 GIT binary patch delta 7506 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 AGynhq diff --git a/ampache/content/contents/images/icon.png b/ampache/content/contents/images/icon.png index 6c4155f069422cda3d198d550d841dcb501387fb..f555e5dbe8ca6fccf54a36336dcac66dc462d11b 100644 GIT binary patch delta 9109 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 Tp_&bk00000NkvXXu0mjfZz$-< delta 9500 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 Date: Fri, 16 May 2014 15:31:35 +0100 Subject: [PATCH 209/597] [deezer-metadata] Optimize PNG size --- .../content/contents/code/deezer-metadata.png | Bin 738 -> 723 bytes .../content/contents/images/icon.png | Bin 962 -> 923 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/deezer-metadata/content/contents/code/deezer-metadata.png b/deezer-metadata/content/contents/code/deezer-metadata.png index 0421faeabbfff510367c69089f374a1167e7bb67..9ed15cc478be3b52de9adc9e274c7a5337205dce 100644 GIT binary patch delta 290 zcmV+-0p0%M1=9tPBmrfyC20W!hA4Vgla&ECe*pAJL_t(|+U?U>D@Ab_M)8$WA{i3- z0;X_nN*q&4W+|DaWR~*zUH_l<#ZKCFPV0C5UaX7v0ZEc1Ns`prx`P1*G#=0soaH|n z3GfJLIXM}U@VMQUX2IGTg${`X{zoI%!I%GfB^=~&XwjXulhnS ze@q9UKR9up(17*`SXeAARbH)xWmpYBS8(FBtgV+?u(4U%f}OApy8+k>1{hE)VE>?W z2uH`I6F3W}a2|k*;KXaWyeeJ8&28xp9>P652H+{U0t4FP3HAI^dWE<5(g%EnPxubN oPjCeWv`2s>Ns=TyyeBmro#C20W%BwA%P-FzjJk^wh=0RTxvK~#9!?bFFhLs1Y#(Ssm} zA~uM@AFx9m8zZ8zLlAorM2$%h#4bv}@AppY@CKJ44_?@7ToijyB>?~c004mDHfjhU zp!9$-!(0BNX){&!4G=)UteGjCnln5vM@Yah1=P%Z;nafRd9y4oMa#K2uxbXq0RjkE zTaPw>3a2K_xU^!@)TH6XIYI)e5wKa0whE`VO+(r-X==pq;#qe0qNcQe5FJX#=14j* zY1gSCfPk!kv-9Xey1a_6rCW0&-I=uO-tgjC9v-77sr4MSrLO5nFDC7JHGBa9)i^@D zy+4~kppfy8<~ZzH%RZ^DE<4}-saMM zjXW+hJ~LhGe||o$x~JBUi2(&1us6*t$~{%VZ%`VQyNiK|L!kjeJigL1b8BQC_koDZ zX1g7uUvGYPX6;$&ZpK^B%`@bmA78*w4^w-fh4;e71&;2oH;d`5(k=VUaBS8&RbH#; z`CCgOb9W{OFfg(RI6#Qi1_wT@jfjlC`fJ6ytGv4=Evfd+&7G8T_t&j9LGBHO!MUG3 zUKYLWLJEfZ*RQtT`l@oWclOq3Posj}2OTEe*%`fiy2{S_ z{|mld;Nv$ClCxcB>p97$HmrJ{O0&KckJ`!8;ajhJPBPEWe*cCM7D^2aW{wPP@Bg;n zI<9hZ`T4E-oYMM3tXESAV-L2Mc?k9+XG|b9%h%8OrRhRQPT14FCyn Nc)I$ztaD0e0ss|5)XV?? delta 567 zcmbQueu#a;bjErnQBN1gkcwMx@3y)V363JnZQ9ALu0 zFYQdv*{ok|jBc;z#4a|jzdmQ@#!6rN`Zp1~o?U-&>i*Sf#}~j9D>!Uq+$DbH#ku=i z3j%WrFY|L7M4g``W&3mYG`()!{9lR3gZ>z5z|9WGX?PUh+Gw^VDK#hb->R$GS!>oU ztGa&d+S1t9=10u7=^R*gcBAgk)t~wf?pwPtH}m=t*=DG-6zUrojUt0I*zZZ8x(i|I6>$%I$&FP)Hx{dApb%{00^kRBqy~Ov_ zsFsC7wFAwlZ>TSQTlL0m)~-tJvfWZryMmKf%-U70UuGZs;o#vLi>I+NXxw_NzHxcx ztDB#1bZ2G!NbP-?_3G;D8?#FeZhxQjK3Z(SkMD5v7TjStx}TFt`j7ws From 4f3dc2989316044e89b8fcc7f2d3f9a326236810 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:31:59 +0100 Subject: [PATCH 210/597] [grooveshark] Optimize PNG size --- .../contents/code/grooveshark-icon.png | Bin 4803 -> 3726 bytes .../content/contents/code/grooveshark.png | Bin 3637 -> 1895 bytes grooveshark/content/contents/images/icon.png | Bin 4803 -> 3726 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/grooveshark/content/contents/code/grooveshark-icon.png b/grooveshark/content/contents/code/grooveshark-icon.png index 0aabe3cd9c322bffeabfe5848cde7e9ebfafad0e..c089882500b4259c8528effafb43887fbb97613f 100644 GIT binary patch literal 3726 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 H+pzxutL?L{ literal 4803 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 Zz5%4QI=(Y(0P6q%002ovPDHLkV1n9DXNv#; delta 3590 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 M07*qoM6N<$f=Ji#xBvhE diff --git a/grooveshark/content/contents/images/icon.png b/grooveshark/content/contents/images/icon.png index 0aabe3cd9c322bffeabfe5848cde7e9ebfafad0e..c089882500b4259c8528effafb43887fbb97613f 100644 GIT binary patch literal 3726 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 H+pzxutL?L{ literal 4803 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 Date: Fri, 16 May 2014 15:32:18 +0100 Subject: [PATCH 211/597] [jamendo] Optimize PNG size --- .../content/contents/code/jamendo-icon.png | Bin 8404 -> 6754 bytes jamendo/content/contents/images/icon.png | Bin 8404 -> 6754 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/jamendo/content/contents/code/jamendo-icon.png b/jamendo/content/contents/code/jamendo-icon.png index e36934cecd8d7c951e4ab0f6dd8fa706f1b2459f..a69cd9171ba63535e08f0cbc72e9850be6712dcf 100644 GIT binary patch delta 4103 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 Date: Fri, 16 May 2014 15:32:35 +0100 Subject: [PATCH 212/597] [lastfm] Optimize PNG size --- lastfm/content/contents/code/lastfm-icon.png | Bin 14813 -> 12714 bytes lastfm/content/contents/images/icon.png | Bin 14813 -> 12714 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lastfm/content/contents/code/lastfm-icon.png b/lastfm/content/contents/code/lastfm-icon.png index 982d86383a6222b5b570da8043796366a7e9cce1..d9df3afdf5e4c2b980b24ed026419cb4125518f1 100644 GIT binary patch literal 12714 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 x)~Q0nLEXUsik-F8BNQ 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 x)~Q0nLEXUsik Date: Fri, 16 May 2014 15:33:16 +0100 Subject: [PATCH 213/597] [officialfm] Optimize PNG size --- .../content/contents/code/officialfm-icon.png | Bin 12297 -> 6666 bytes officialfm/content/contents/images/icon.png | Bin 12297 -> 6666 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/officialfm/content/contents/code/officialfm-icon.png b/officialfm/content/contents/code/officialfm-icon.png index 047d9d7e7096150d406823311bfa73d738431be0..98645d560eee270860521623e1966d1f9e45145a 100644 GIT binary patch delta 6661 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

N4v;?@hTt;#u_&zXrRI93p;;JRL? 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 From 7fb768c5edd73f067bafbe759d826706670cbbcf Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:33:45 +0100 Subject: [PATCH 214/597] [qobuz] Optimize PNG size --- qobuz/content/contents/code/qobuz.png | Bin 21142 -> 20622 bytes qobuz/content/contents/images/icon.png | Bin 60703 -> 56392 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/qobuz/content/contents/code/qobuz.png b/qobuz/content/contents/code/qobuz.png index dc5743161fc48ef310f89ccda2ba3aa4dd56e9a7..d23da48688be63c68bf7f7bd99c5288d457ae192 100644 GIT binary patch literal 20622 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�*zSoL#9M+H7J;NTW7C~M7no;Z=@9N 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 Date: Fri, 16 May 2014 15:34:22 +0100 Subject: [PATCH 215/597] [rdio-metadata] Optimize PNG size --- .../content/contents/code/rdio-metadata.png | Bin 301180 -> 272369 bytes .../content/contents/images/icon.png | Bin 301180 -> 272369 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/rdio-metadata/content/contents/code/rdio-metadata.png b/rdio-metadata/content/contents/code/rdio-metadata.png index 093d371890b6760cd2a59d86f263897f05a783bd..b3955242e0082b7d49870dcb42b55df3afb5a212 100644 GIT binary patch literal 272369 zcmaI6by!>9)-4=@ySoKOrk+{XK@E(f|M|tD^zL3!TV^>~khGuV6M+lV%L?S@;_T`v=_kYdFJ8%~_CIC;X3)P}yqsj1|0gJj zrVi+Z8w?71&i{ryBr3`;B=THTREQTOEGQ%_Ao%na}EC%}D7xR-E z%+^j)Pf_`QwVrx1%nn{&?vermzP`TvzR&pGVD{~e~M0Tb}Eau*Qd7yKus ze>-Yw{=Z#aT>j(j>7@t#Kk@!wi9HSc-Jt?{P)|2+n9b9~*|Gd1gVDcqSquA+P*QUg2r@pNotC8>{GMZ*cnU_~pQ-)-P4&M` zPxbRp^FM|A)cH^8LtUTh9rje%YnsTnFv|@wz_o<(B7aP~Um8FP8DHBhml~ug8rW*KAw}ZU&csI8g2nuDOnxBpw?KcoK9(4XsAS;&vDBNu|D|7p3|JYtj z)jlyT5mY|4*Pxi{KCl0ce4+wdK1KeI(vquuBXaRcW$0fj|KyXh5PS$2{_@`Ue_Ui~ zacq2_uygdB3-rAI%Bk(}0^i{uJ{4e2djX-+{J+9!TDi>QmkwqF*j;@^-s)p=5RxYJ z{g1}eFzj6l%8&gMtVR0TmORSveMrpIza?Km1F0;3f1UW_2>>kW-TFQq8j`|?Y z7G&KTJG}p$BdW{hCRb8}+xyMqeC6Wb_|1TvY*Y&iY=?#54w~0DKRjP7O40VLG%&de zv>p0BZh5|#w|K>$&A05>eAD6M-?DVXc=;o`rEBGK5!$t~dm8EFE7wV7i3Xq{y@~y2EHWsZrB#6z)P#s~gA)8+U&oOAK%Q&A;pf??vl^8HdY5p z&v%-$iwFlP$J=_(ccw1`#XGCy2G!c=II=HpMLL3hWiBN*EnSLsbsRJ|XAWjon}-@V zw{*DWG~KTuFK-qvNLyX3o3rn;s+W&OJ%2RKX>QeR!|p>2yRvr@mPWUCc;`Oc7zVmr z+#Y&w@8q`sI=pIWc{AS8(doJ^x^Q;c)VMNo-tXV`V|>y3$!GJeH+i$SF{%zw((aV-i&w?B-hNj6uB{7 znJ*k(w;t5UT3nJFHQn6Kf4-HvHe9mzPxN=W`ab{R;KRYv=sxF_CrE8~|dm}#ro z>-4*%2x*Q>+HFbcU&BrxYdj`H_^)E`0*6*vMjrN$>&x!>w{Et-65zHSY=zuO{oLQl zKJ#@9eRcQl?<3pX`qdzkZD^Gk$)9~{G8!!N@O$)<>L5Eb`OIR-&t+St<<0TS6aWMz_x`l4vcG1Qt15!Bcb2VKWMJ0j;>I)Vc&77E?Q_pZ)bg8Y8{=)yc)He)zGF5K_j zyYX)8YUwCil?(KOtCNBCx<@Qf$*pi{>djuuE8jzDPb%RhcPKc3)+MkSI{(FO1CFwL z*KKgk;gU7!n=jh|W+vCBj z$KRxlGpFF-}W{<)&Qa!SDM@!ccv-C`(SCmLRLF<3$M0s5C16uI&_GEyD)Kz zj@FE6N(x$zc&iN1FXKKNNiPQ0b3Ipq%I%C3qBlCb2_Tqoa;S0OTyv8yun zK!*Z&_L<~Jm^A>48<{_JPF~A`SsvidWJ$c|O&M?!3*hpU$oaA8iBH-VDq}e!UoGo8 zOW+goi@;SE@dDwECx})%6S3A#U)BLg7jeVFJQ2D{= zs7$Twz4ln(TJ?pvTR@9i6Mdk z8p6LQ;~B`#A14H8bz=XD`2v;e+sBuuel?>P%v=%uia^Vwf^!7O@qlx2snYgo*0SeB zvj=~i7^e*m?{IH4G&sP4xB#&R^cOclzjOHn0m>LC)Z5RJqp%p309wd{?D2bee~dGP zRYF4a>!yyB=ECJfzBb9>5j+ga>Rw#-#Ok6HVqy< zUPO1^q9aCWUt8P$odCZ?;X18E$pi{E4PIIW{-SCc+-Jf{iA5j6f^c0`uM(oiWE2q! zV7w0bGMBluct7e5Wt5MB!vf9kM!j`A?F-ySoj5_z8kF}c_DReK!?oxPH%GY-bdj3F z$V76k1hrOvTpg}C^4gNBctI{LNH)xL!5)PLfd;C&#L%ZJ5b!q+((RI;#y5?KB(uwlmfV`!d7bhcv&F~XO(Gy$h zg<$BDB%|dVWFyV7JejM8b=wLM?qs#F8CiF79V{?PzFrtUKx@J6#uDe5Fx~T7B8NwE zam^(ZCQd=etIv$Epvq+09CrY_zS(L{T7Ah!xb+*nm*&KV2v~W-%PPw|Wwt zdI!uc9M{NG_xdziyTpY`OmP%W?5YH_+57K@@T$*)xpW8FhsC*D9(YvlCy5X>{==r* zZ`pGJmcI2PRUCC^0VCLIh0RCN5Ui@9ef3PE^;8J105Yj3O%X^FPz3BmYk}*=T6*r@ zj9|OvEDd|5+;5=0&J8mRHHWHfeYHcujCIv^vUzzof&e}vwEz$!v=RFlo)J4}I;PYB z*j)gC4&Bcd$ZE;HF#^_yify%`FofUT*N%g(xHx+H z2Ssxd*Ggn&54l)OSK}0<|l|@eSfGbu!P{(5#fa7KiSF;4e z=HV}8g+Y2K;~`5U+g4rg+E&8Cs5tZ!Ks$@ISDZrJzL9*b(-tl1x;po4-a+SPwB1-Q z^yEi>wE{BEM>@&CX~(k7=p6V%iYR>0(1#>J-kwf)$fwZuo?>T4%44^_b9DrEAH*%~ z=J!riXv+g(uT9tA>Z91?`{Fj_AN$f;CN+3Cr6?hFF_BntWwIvd+ z3Cd9E3QF}IYb7+xa8$~Wfd^7fQ;A9?x*=QJ(ozP0zTyZJ$li!X-6_Ktyfu^a^lT=aN+EV_w?j&nKWn~qLKGnY*wzOBAf_uvJ z0}g=5FeWUt@SaH^;4W&yij!eYfOr0$N2@GP2}|SR0&(o%7I`PO5U9V#Pr?1@QDUuIQ6P>)Y+UR)wwmkR->!aH8ZZ2b4Qu zoKIsIROIbf*vk=2TjM~mHago`?wl@ZT^>U-*NXsSO0FXy`m(ailKxy#Ta%B^u;|1swkvUy2RCSy;$}&i2--%B~aqxaC`(>0?un6 z0BiVKv0-e<3$?_MfO5cglnBRIfq^?o*CA%7WIOUz*Rz$I!y=j^X{3N2^@jtuu$~8F zRF1O_LG~pv#p%eHiZXa4XErG~Mv$T9yCHm9R@ysMg>s}2P&^}14FGWjq@(f0!AUtR z%R}Z7^F!P~XRHCyRB&vs&y2;Zo?ZLdFY)t)y45b*%q%&7qV%dlU>`Bl6+hPw6q<3} z(?TB#9Qn<22@>MTc;}_1!qA5&WT%_KT_kqNn#K>v zOJ_A9R#{_Tx8!%KWnQA+2eyBePQ(*2;rwSvdubV-d z@tkjE&C$>I9Di7QYr&ZFUNwMHyOiTTA4?F`Gjf%lhIO_@kp{^MWFE`-*|k08C9SoP z&V!zL-DWd0ow!1Qp(=Ul{Hsw9AcX?T8!Q3}OD9IQ2N8IgaVPihF!3D*TZBm@su}MX zsyqXt(FKQezp=(Mm3&uOvug3o@#7& zM(9COfg*dVSk5?JdBQ;TvkrJ1$dYB0>SIy_R?c;V=pssd_$gsyAwUekZFqH78Dyx# z%&ShKsgBNq#4oeVK-EdR((vu6irdq>T)N{KRmHSKKTu~kA9;bn+3cvb2N`^P$I;0v zefi$)T>EY|Ir@I*0s1qIuHa(`D>f%KkiTG8D{cAdTne;puVu1;YqYu|G14Xzq%VgC zge+2mT90*dDQ=1lbX`yhK52JXVtz((P*HW#qfU<%&M=`1n*@u@l5qUcYAW~n3pbgNa+QVyxv=EPQ5xoW)Z+oMew8$m=D zCj6eLH_L?^ygKM0C~FtB$dsBg22bSWcz~1@qCQKjTY-TS%q&z1vA_rRGF`{3)Jaq! zW&#fH5Q{r{hoFc#vyd*U*x<9n!yPL}Pz9!1lbj$I>R(pgzvdR+ctj0)07z9ic3%j* zd)NszasHLrqGxh$t-OdPfc{%o)V(>qQET73_ z@8aP&PtqwM!j=XJen~3yDgDZ8x>y8}V$g`Y0zoc}AGQ>47MsqKVL8+R!jjOD_yKPIDu$5K1@&xcER>E*5j&fjU@ z`2`&dgqmJg5C$#qZN5iZ8C%HqGTY=b=NZcL!DDJUsaK(Y^_A);KJM-gs)n(eWJuC1 zK0Cxo4(};NGmvfzxy;*CSs*jZs?+}F1ZVpdHLZfcuj9IA5mXKHyOe#-NeI+&t>t)- z3O#e{Ck#3eU%mfp{K3p68Blq21$<7NAG zZ$;b&#aV0wMUdHwyG;|pt4LC<-11Txj-G&;LoypFVhOg%Di0&7eGZ_!U8F8p+v*Y` z+KTni-NA#rJ(Cn;-%YGySupc02Ewtf25mCKdV-ZTl9L)8SkY#OM^_zFMq~f-*~lbG z=4Ew^#^qKH?3y>N`a4=%jBnV|pI($eRSqz7%D$~C5gL)X$7(%-XC;-)t?)QEiswNG_D| zWc2$z?=sFL5CQd9f};a^acwsGQB1$`k>`kj^#G&r*uKfAa6<9WJ#kfK6$?Zxso)kC zS-Fau25p}esnSc5D9uwt)j*4`SL}*aLz>P`x1{t}%Pz$jUy39jB#0`MoOQ3Po`ss!0;uEECooxqHrBx2{c|7V9XOmSAaZ~ zPjCcdL9BRFVjv*=)7$MzY^VJz8!J84_%tQAsY}PK^-sRJP2^D=KIlAAk|ufc_oVx} z73|EOq&E6qW2kNQbaa+n1k;n_Xpq_fScyy61U`kWg_=Bs66#DE#V>mCST2btZ9ZtE z%CVTHYC}m!#nYfKPaFxqzoT!si6L+PB8m=3aTiS$r}!%s(kZ{aS)4$cmyk#@c_GeZ z#funItw>d&(!HmI5&h!N09BKX(zy?E}1WgwFlH=KY5F4zCVG*wOp|Eg8>K zAAQL{C0ZeLn5M@pz`R>cLiROI}pWiO#@QESu1`~5%-z+dnh+7Z)WLS8~VK*y3} z5GwuUfq(iXYU`+l7cQ+QvxkdC9xfI^%O^IJbcu$3WjIT+;x=_aLvHW@=^qn!I-S#_ z66{ly5^fs>6VZFwKT%)5`H}n<8=aSE>FiKZyTstk?v(vuV^v z#8N7=;iLoKz3j_)F(9L520qobHsFqDc8)_9Z-4N!dbu`BogA=XZeu0M7iUK4VT>3- zt>qNJExxV^oGT(sejJgyd$;;hxWbkenf2HnS@br4` zX2cPYaXVisDrz099*$2{!Z%f6;BmC2hY}}8Hb>~(C;TavH3^^829on-i(DZuPq3*} zHhIw{)+Ll^UI7t@N0#8F7{3AKKZsPDL>)*_{8-EI3G_qJC#=tBZ!!1MpVORRWZ4L= z3s5J)6;`b4t&&p>ufNQ=So1FEy`elTTT?XEF>x|Oyt`I;_`cv|3T(-Z;lSS3@%z`)5* z&Q&jo!5c$tea!P`eqEx?T4V^4ZI5jjI@f4Zayyg!$>Jrh5u0lOMRb3wD-=F38r=OG z49|U`|eM9{U?GWc@(ybXS`a9P<_EPVo=EjM1mo}#I}1f2A#UEDRofN^0kAREZtY3 zfW$O#WN%rrBO<)EkoHpUe*JIf>)`0nrK^XVXaK}wiir%Z%C_#g6!mEzYC=@riRciP z16X#1!O@U_Hg%1VCgrrmTy5jd-%DAJZMw|1;GnrZ!&>f=Y}W`vfzE>-wo-RMhDqB1 z$P8PSS^u(K(w+xkYd@?Lz)yZW^BwG1efTap!etGCr$^WkyRsCCe)@<&$+EUG;zotd z4~S6+< zJsbp|_kym4p@hF)@`b~BLF~hxYaXd^yc`l05IdIB<{;i^Tx1jM5p0Qpq}@HWLKDCC z?LAIW)h<0M%Zx2L4W(8tZ2$)ph0Q zisqX``F3ox165fIj@fgZ7U#5NUmKQ+v70XWRyCuuc+?X%i;V;-6IaE482^xM6JC_x z$(HsTZxD!eKrc|pPPtNtI+zE_mXRQgM^Mm6&}|yvemE+|{T>%?IyLRB6{7ruOt=K0 zz#-X5D8jGDmmtXRajf4({p*}(_3+oj{p;H|Knkok@8AT{y5sMmpA~nFi7Ii}w~OD^ z;0~=5RR$q$^m8wz6i#QNENvDzZ8()yUvn;08!SBv^+{ zhAoX}fOv13v44&w1wqwPOF9WRMPA}r2=ydhl+&!`Y#Ne7a0OwKy_{k!))h(ie${n0Q!;ARt20k+D#SD zu49AbV$yer7HOW9xzg7Pvh0UI78QUfE)XJHlBQ@~ESpG#&yQ6B@>+4@83X*$JN4cT zzpeZoc7%3`y;D4^F;=F~4+F(Z<|^+`4Ng5Kio%ty=)5t4+(}iVLnYSs<&s>R6h?U2gn!&4}Yx>^Tj}-#c3;C<=j7+dAdL#^`)(=i>JpmsHlsaEYozdH9b5H9T=bXDPliD7Uzg~m|$$_?w z;PopH3CP0N*I6gs+7Hr@)OG=l;rDPtK`x}GTlma8Ua&ef>S2D0Xm1lPPkn;x$w0!O zGVvS!k<+L>{WuCX`CeuU8Aj^b`V1wY=^Je}tZy%P-;yJy zgs4B~kD*1-{-tWZ^#0~tyWMOF+}I>X-UnE=V{~p7F@rxe1rjmylgr17x|h{Tt=LeF%#o3^r8>@0;!2Uk`usf#DVF1ntmKFU5xDfS1%qMj z;NzcIOIM=!P_N0T){lY|j1)igQb+T`gzJo*i#?J}646r}RCMajQJg{9;DZoXYxQ6i z%&c!E#2+T`U#@SAq&Y-&ZmZsD7;Um**2VZghe{^A!`yUbNW^DM467}1dgdMfeo&P? zy%YW_GwId0(o}64^eFs#^~Q8nRBHbP%tFUGyZ|dj#uU||j~$YqW!Il4_l|J(C6Jm) z8CgN`PzEFl5r9S(?9$wy-h*Y9TO?v)gU>D`#4^I_>jrOAFBKn+MiR_^4ifkU=gWqK z5`lOWxleK)4!eaT zD&Z*o;H>c|w~*6DQ4s&(ssSa~Dud-ZBYmFRk?eHKPM6tFUfNo?f_#CLt zj6Kj8q=VLAY;cHUBBH!Ff^j~EX2Z=ZCF}N?SiPWn|w?L8r33tJq$v5%6 zMeNxfR9Zci!trMId`uKG4ZkJESbHoSeku)n)imq&$ngAY)hWW1bvkTxgsbMlO+6Jc{Y+9y3dYXRB- zwbxf~=kqcXOZQf7r=Rgxe54Lzwl-KZ*f=#{t;UOx^L|zR1^EVbwwKq1w~t=a@=m-` z8@&-N;b;Fd8YL@UG*H5f%~2Z60A=kDEG2|nZm?w}a!X5bFBSF*G=~3@wA6`^f}BQK zJ>qgjm7;18S`=S~hrb*_)}{UD=eO%zQ*;cy8X*jYN>(b%-Ti^hJwcSxpkE>ZTRv4_ zrJQ|n^+N&@)Uf{I`Ze>jtMb|ONEX`lIdN=FQpz>YlY`@dtI)0cb(iB?;kxHtv4GL| z#0ZO7POK)|-B;2$m{E>g8%sfGQVkODf|;KN-G`-i+6IO%8o z<%YBFY!tntXeIyjn2cXEzit{PL4gY74{-b}r`|E6hZG9>wrCLvG#Ni>sQ7=2}?(_ zPFp_ECt8F0&M#0ojHv=_$q9wK?16v`3GWZQ_{FS}#E95#7Dfu0k{$G@&{(6cW*pXj zjJUt^s`%fWxsI&2Uj^4$mLdDMzb?L6_|v1H-x3JfPgPMc_-O^dS=)LQ^G2-0h=mwz zm4#YLSGGrE*`jCJUBmR{;I!pkRH-CQiS7@0*9SNn02j_8N8`DE^OYqA@I%nLToPAg zp{9+PWbo1Li(7(=bUBW1m=nu>E2)$;z`o>u>*4}`PzPj=JrG4lLRHxlw%ErV~Z*UgnZpXDuCx;d<1g|Ny7&1EjxZw#ZI$~uvW$lKVSgbf84}tRrj}zHv zt%fz9-AgM2x){)Ft5p{96R1@^H=?{J^yFoUJpoGr8Hx3Ery9(2+8yJ+3zIabE@9|? zJpM{JPJlIr;K7Byj=df$=Lp@<+n$U zL{@+%L1N61#8%|OsM9p1RaN%TaFl@+2DK}iAeCSnG5iPX$?Ol7*m--Rqn%mPsA4HW zxP#3P9v%rrj+87Wy%jVH04f!U2fk91xIT(i#mw$lxL-oS$b4>KyADJhUVdb6hs&YD zH6Noo1Q4BO*meJnqu1QZR+xxcxR{lxi}E7E=Cn^Fh625Xj_HaF-==z408G=@Cm;wrO{)5%? z%Hu{=HD68y0Vob{2?S87loo-&y-%Ba4Ed!TI1V3a$R=Cx>R(s(r6>5*+f^2b$sbO( z4y^F#Ws8L}uk#8+#ARQrsBQtLICs?^<;R}IMZOIP#zEHUmKW<+-^>%xK==&bA1~8H zqiDS;*($^2P3^|bB;j_!<6$eGtk}-{T~k?#iCI>j7%ljs#xuZp@}szqqVqHcG>&b_#rKeapC79d%s*<3VuuyfccllCTLNr3#e2rlB&mq-&gRV+ zUw`SElc@+2xZ-Nw7k>#(sApVS^6Fzr0%=aJq^Lr`(MbvJdKSi`^&Frb6}-f_*jKDQ z=J^$a`gfhBkDu9hnBV)Ey#i2@B>rvuV!80)@~xqplkW@{I*Mq69xv80@0gzJ5DILf zW$j)%f%nW~(iGVZ37|Ij?smuJ5x2!;I7?b?w^t->y#abhKqnC*1Dj7<$)L+3Q!B0! z{bz|~EUl!UO=Cte?M3X;mVk9*g-h!m2L)8Lq(UZ?vnKj&(7(T6M#X&6#}sMAxrQ5L z-v=pF-V=;V6tnL!Abm*iZz`fkwe4WfNrJQRSDQ7LS1Y(x>jkk_u`pOQF2i# zgOZt)1sG59jic)(V-3ZNQhQwpg_`2vCS$Fj8Ui&tw{8>D)6<)VH}It}L6)PHl|6uy zs?BdN%p-4F0qTdFkKDPy#iE8r6%2W7P;MPSemP%#C%et;CPQ?pJL7Wnz;vkhnGG_& zwFqB^DN{oZ_tgTR8pnuOn6+cNL=y&3;Y?J9;-ZiqN+RFgFRDNM zjWh>n4SrdER>uX%2IR74leWgvyo8O zsxmd&W0s08hEc+z`<0Wz!&aBTq*C1pTEp>ah4vyZ;eZwm77x0hvS>1)K!(W+tb!8NnUgCq1Yz%{9ZQ^}* zh4)O#@}$MC#lg5D&*2c*O$)Kk`cQBrI~zTUIrlyZ zrvhV%$q%i`l;%_QHz5tV&m9*lywkvf@fw&xZisEYK^Z#bp9}HO%P-Y~1|%^Ne$0|9 z0sfrR)~s=wBD2_|vSD5+(uplcQD4OWY)y_+*?@$6ASO8`%^P-SrrkL+{sL8(ysF=Zyq;sb3RU=!94pEHjneDzN}9UZr^S zd~RiuaB%8X(kOFwMp9e-J}?Tmz9TmR4W(p~kj#ym%klQ`Qy7u9N#=;cu)RYu?1d9c z7e#(oLgKihhjs7O-r@hNB zMPOzV*OykblNVj zH27WT_e?1J%ag)ODwicnEpv+7KfB4lrO!>blTmuZ0{>|E9On-P!r)U-)$`dy+aWy8g?}X`DTDpO-|Yit*6Q zM7{-Cecq6cvt(?hV-e&}GFq-Be%6r2mEsIZ`RQYIM5Q9S(-%I^mgtEF!Q-*vMVNq- zQ?(N^5s%Gc6u-g66uG=~1lf)TWXhU9 z_AZU7L29tas^bq29aW2;$}dQuPj~CB&C(pIa>}V$-6{tNQwB!$!>lYW2|(W1y2`|o ztuw|d9pKq-&KtL&0~fkh;B&g9GyR#VF|MY*+xpIa78~>cN*KBltL-b0=X;Mka)b_G z2W&z{mo1}my&vj&^>`dUE2>#`CV|_Kg({_9ls=Tr!v!y`XNb0a{!0v3m`*m6=_CBNh8LG+R~liZqRwK>dl_9!Z9Zmaer7T<3~t(k zdhJ@mG1_uWPUazejgj>z$rvg?e`-DlF$CqLdv^dA8l$`&_MB&vsPxCD=%2lYxPkf4 zN~etQW4bY2;yUpGSsGT(ySp(ZSBP%b;cgX|#0)`dWy7<)U}3R%Rx?Gl-AzUBzsA+W z?pLap!)a*}#_mIKdq;B_3l+u0djyJ{4tTMaHF~mglH#ufM@l`q2x-c0y|x2g@d5`f z4$fwdABu_CQ@?;zMKXmTh<8j4HARoncS`F?fjL24;zkS(zO=Je!wC2?V&J?R0K@s? zY2Z_lXvaNKi5K7Aq`4%Goro$TRDV2lg<4EBfG+p+82qTNg)iAjnjnVB>#KElmUUNI zrZv{J;Yo3={tmP13JT5291oN^_QL2(3 zIm@F9ZhHSTCZ%PNqPU2}O2r-QjFO8K`#P{|v5(LztnYvwzgqNN=T7;_)YVK>8w%Zz zji_Rx5QXgtX2h1C3RC7OtJf$^umZI6Nb~iQO1E#eTOflnY3fo~I;R=VpG!<)!w@~X zPU`Fwjj_&|AUXR#fN%yO;`}rYOMQOt&7_vv$3N#M^V6#qKf<2=ka%XRXSNo4vUG4< z>bPIkufrwb4CRyB-X}V=!d{$IkA3&i%z59@^nUR+&QZ1u%HFlKArFo@`j&9TQA+hf zw4y~f!4x?DGEf^UvWAKmF?`yUD>CnlafFqIFsjODK@L0Wbao0j|IP$_Kb>;@i?+eeO&GRU;>9=wA4*Bojz%&m~JHi}*%wT(dwI@yhYok*3AJS*aazrdu2$*ka_(4QIL zRZ+(0g8C4%jQ*SfNg||PDP_t7pX1z0W#9}y<6nq#0J)1L#S^%mVPtdLOtrLFZ0hE$yL+S)t${@F<6;KOK7K%-2=`7N827R) zi<;QdADohAQLK7W-TSKRaQy96(3beYyL%zHqGHv3XQKDS+~(!?kc9m>zggU3E`=re zBe~t(im*&x<`1AhbrHL|0MVYX=d7si4yg6EA3)2RE>2VL_34G9T`psCf&|=V+!a5* z9n8v3VpUoy>v=`9Y$T^3!%G>}w8(h^ie!;-I8xCHj-q z#15Igm^gNZjUS>#xIA3pWx$V<;vCaq}Dj}kLba%itpVI(IkZ^26__B zxT*1m_VTE*0_kckJ|auM3{$6NIF5#0fj&nX_O`syp&=fWG5-i_Jd z5rF}1GYKM<$Jd&8?A3aUe`OR?_1suc68R0Yd)9hXoyt>h-NUc};5a@JUaBQOt>(=A zv#GwOD%yCGjF?oX;^1NdER@7lB!VKNT(R5T9ou^SnFd#fPe?;BJyZHbO{En;i)re! z`_VM07~OGU4#+;7#0JBa1>7Ro>C(cldDVDkO7#lIC8-okS@)%}FH0 z#^`OEK;ZJZLMa0}*ZThI1?5U$=q4udFQexikPWbh2(Tdvag>j-7B zT1F`@3K1j>m4)aBhKr)>?7F;3>cVz}1dHNV1|(0h%I}2T!;kM2ngOJWzxH!f6iu)v z$4K*&fs-mDTHSseI?c(V%;UWL-@cpG?1iL6mt5>mC3ZKwRy4>yMg_;dlsoGC9w+W=4iL4$gl}I}m zj%%;@iLc*$j7n#WC2r=@>j5b!YmUg8E(#k6&xS7({CV5R0wC-doR0#$!fu=?GA z)NATr$U4S;RePd$L!dR*SY`C$K6$g3B_=JQ;i62h4T!6;tp!A4MV*MuP`RjYGhV!` zys&@rXb`cPP05U4s%Wo`aaF4DJ_ zuqvE5KKbu7tt1wKK->F>T5;r4Q({ut8a>=W3&Z48#aivJ2M_6F4_kWMT}I%DkGT35 z^v#V(c`L*^E2Gi^F2m}Oryo!WM`5-?0(;*gbR))FP2|fkkoP12h6y|RNKX^Ws2w^z zf>EtJ>sZU^{4T2tACYYGf$L85aDes)>`#C5@*A0ye(B_aQ2JhFeoz918;{_a6RE?C z_ZGS3uMyZ|PJC2AWeY`LYwg^I1!=$qGDu9&yD?RTKu}#hlL!Zq{~afB{j%q7mfBamCZz+|LS=Ij~`S*v8-Y$~W$1!cA%d*G@`V@5IDLdS@jp4#E zjktj=Mw6GYuWa$9m_Hb6IV>S*6V9mQgzO|g379JrRVqx^C77>nE7LJesJR%oIH7`E zslRrU6pe!ytG=sr00@*0$)?Tp36;{r;bMn#;LE2?JlP?h9EBDi=uEjZj4`E zxl%iWy=}m?YCX;y(7@h;%=eF_O|?^)Uve~Jm8QojpX&$7AaIPPtN3*1hDRdvV0%qQ|rlQsscFbgAkXQV+&Zc?bGN{95HQ$Y8-6^;on_qi$< zi{!jsLw^vEfRl*CSzk!)ZRzPsCgFPSONHxm61~{}Z6_uw|B#7ePwx%fj`B|M5aQ0J zX(|++DjC!8#I$Rz=XvH75`BZvO<||YSUx6IbD;erE=y-hVC0#e=g6#EY+tB@Qk{^{ z=zDancaaFtHT-hYZ66{WbUyi-IQ7t!fdb+&b*Ml7{{dJ)r@!rmlqfdkM@ggNsU11I zbeP)%ft2uf_y6kfzK{JhTs;ZV_xoq&-Z`ML515p_GwJMU>+mXt*YGSsu!w7Nh*fz6CDvP4clL&)l6qWp4v)BSregWp~6QrK9~>f0a*|` zGBd^{EGe>kZaqDTER-GrZIbbjRyPB%H0z;bO=x7ZxP>)=P!SrKu`P7fN0x_G-y-x)xHz5{4fg0B_F3L3Wfe1Hqx;ELD5s5!gU5J8`nRSd+yE28sagQ4okWrjL zHKp_YF^!Ah(~YOv>GsE;|S~si0xc+&E6sX8}$S>=qAt zA#E*y5>PXs0hu#VWDKN2+QZh>1F>u-z!K4biN_Lnf$K-xmXCMlb;81`9wO%1sdg`gb0p<>k&6Q~B#xG<=|N#4nI_4-p|Mld>wr#2qRwEuhx z5Y+ZDjC3q4l&y@$={;pUlDLQb$^Z}xaP_sZpcl`LR9ym11C7rD*_{FIV5zn`0UMhQ z)TvaRIO}^|hD$oJ6k0A+`M$C z6>=(r0)aaT$lbgblVih(#?d&)Q_hMVBWDquoPJ{1erF$;;S zAi7fPvLJK>x48*5BGY}NWtuyHA%p6o_W5&#uX$*mX>dD43X8ofA*z6X#9 zoTWl~5j@s!Op}sHD*{ka!Nba2ISz631Y8p9N#r^Rauu-1zRF|E&t;3U`HkhTKrmZ_ z>P}_sb9&F*Rpq|&dwBZYShO1%$ZW2=$42O2mdqv@C~=gfl89A`6pn}gS0vD=Jw+?a zw}FKjmU4jCKw6c^X~hs@OP>>h1a+*r>|JND$yX~eH5+qCoaLrm>PV;);%eVj1OMFY z4dw(cKCQH%blXT;7Ot2$*%uCWR%NQz2)y9w$`P$stkrg0=r;0n*`x)m)Nzj#ziM(VrG+~=S9ruwXwch*M(S$_oFvo+ z3W$SgBZ$W0lY~qaB+(+p7PCL}`bgvQAk0iYw%co3?LlL2 zP$Xr6ZZb9!i?Wj$qyr#1GQlit$WG>wj?!pVoGW%?r`BZIr=V^m%??yFnB)V1RN5p; zb+~|#r=o>hXh^12M19_w^74{76`o5TWF?$BY)2Tpik7Dgv+W>P#kcpQmt zRr7IbE|_kFvk}k%P0Yp^kTFwJ0nElgQw1B)(2x~5pW6KckC#TT7r>@V!Nv7-U)9i% zhQ-t0B@nxnHe{jZ--(J0BMEu|R?X_&MnInPX@p_%E6Ti)_bJ=c0XQLw9l(IB`uYS- zr(Ira!QvqARc`9md>;WYUCHLkvWC>rL!S#j7Km#ke_>Fpg*j04Kw28J7@+MU7f@LC z0(mD|l}PafI5zk>1wl%y`at@(IP0Skl4#`;32hxUI|r)sh+J?gH6l@txzMlZHp;bf zQ_iC@!EMH|7lp7CzBwG5AwtV%CpNy1qG#bu73fv8+C>(~p5z8jqzV<}eBd{K$o(h( z&7XUiV5PAtXQ;z@M858}kIKX(CBx zNdny>wIpYu#sdD4aQYlJMn#*E(S|HRZRx0uel)Qb+7lEF9+(2#X|BqJDY~g0xrO#z zYW%XrDL24lb4w9qQK}){6$NH& zxuz<4{IB!C)8kn9$Y)h>G=pJ)M~z-n!sLuo-^WtlNsk0AKF8J08 zQoipO-xKdX_s2o>C6yg1U_ih~Ch=@Mv{YFg`5c-qB}nUWa|tyoa=?aYeR2ADxOol? z#0)a}$q3j1P@(T?FFqtu(~*sjqS}%vp;nRcxrO`4TvE}suq$3ltir??mkNHUj4;kn zXeb{75!V7-Bu#I;(tH%oO~FB6nD({jVQ!fQ_^{V;6z0mHPN%&M*=pUTJ$Y^|rdks( z!n%kYl=)~JBifWez(j+n;38P|Sq?1xLn5uGazZa*ZW_V{YP-D7vBi_Z;l^1NIMC;D ziYTm`lqQ-8m<%{+u=|KxmAkAD%Na>XOQl>94NqH{-X)M_H`2+PExZv$ft%}2ixNj# zl5}dXA)kyGjJ1WTIRYJOJ1)Rt#B_K9Gy}3&cr--dNApnRwNyZ~F^3KwQvnx^hLlYr zEeiB65u+vnj>FoRmHK*-&`XR8=f8we9KVf=U~3i-Lm_QpL-hkRe&PT*)+=$kEwgF^ ziEY933@a1f`VmkGT`a$dv87KcQzXAf_RnqUw3KKYc+?5j1iC5&wsF0KIDcR%=CDO| z^PuE#aj6a@b@?p%CiFx)G)EaLes0-Lj+hlKMJ0g3&O{BYgsTw?H0b5H5gy>0V?AJT5Ux>v=Fy&K+VX4 zeuI=w`GX4+OHKNUZvdP$rC8@9SeP$N5iU$iIyUDKo(D>CFH8%1eLy4DA~B>ZPVGbJ zsYQ8E_m3&){lszu9EH0jWmYZ~ka*FOI1YYepn??4xg}I)T0KRI&d0d?#c;4J!JHUJ$jy(+`fsPeEHfeHc|o{~b-s?Rh5P(emU+;Ewnb-#3_ zcO!QW;@p_4Vo!D9QnrPG##5DuS&#k>VAKG}NJPs{vdEo7XrEqO5d#L6?n{JIAp_}^PIGUfMZ z?SpBl0N689Z8;E;v?^7*vbM^AF0P-FZNaK|loig9V0#P8vM}wLld&+@V|Wt8htY9@ z3r`arJG$|+XjC%YKhLevT~lfGSa@X%IApOv%Q7)$1;KYs2z$~pEvz{+h2wl_yW zj}%aOd2GrHft1oy@P+<=`9I(8p8Vv6yYpNVwu+u4N-RD^w77ntKA$K;*vf(+M*r@a z>Q#b_d;*Plk^mOgrXWM5QE2BTo~0Q5!q8-j#aGvm#N{_o(n8&`Sjh&_uONEACfZJW zJ95w#&IV@iCdQkWXPkA6Gqc7{KN5AhDRlr^$LgtC2$5+rH)h4rc!vYrFtVwF*`>K}@~UrUjj|d;BzPcKf>XNs%GeTG-JzE! z5E!ultD8;-&mcztOLg-g1Z-(RZ5=JYqC&rwxpVxAM6nyoG)bIq!Y#!dvA?152yD5m z`w%N^zQIh8b4BzRU{d%b8|ma7I5>_pC4+#4bTW3<^glC0;z)PmDSIWc!)Mc{<-*m2 z+Y*hB>hEzn)}#<)GP=K~6k8r&IT93?>+{KV2eQJ+y}Mb)cB0o zmPn|~j8>u^B-OPntp};S2W-q!M>FI1(8`=&03vXY4bsn}R%3df2I{a%E3+^U3(Eq6 z!^f{~+M5-iP&N@KIO99|vJyFgsvuU_&w)PIVQzUU2!7N$jZtS9LLvv)i|4ku@)-Xt zEH5QdVPPHBQ2rB+VUat?rj+6h(1KnwjERJGR@QoI$43+x#)&zC28ds077^i&sr*(z zNtT|UK+*x6SCD24Cg0=(l3aV#z>AZ_+FDR6EPj2S{ZCzl@A%=jmvb$31HBYjc`4iS z>mH&a0%#^FTLGGPV?YI>1;; z?Ujyy5{-Wta*{7b)+gYcAfrKyxvzv}4x;bI$+>*-agtoFI%<7DYf0>pMJUoxpix z&BZq6VdeuTc8qfH^Ozy&9=9^B%udFW$;e;9hx3U@vgv$-fEBf3S=+Rsj0VkdqlQ;q_ zX+`ck${o^$#mJEtk)_0ih7i0?Nu&=3nA+G8pRbMWG9Jp*#@?~NQ_-QwaWPCOFs>8S znwD=2Qar`rhhs~V1b6degoZ2S|*o}9E@S=^);2_4&cAWtqOwxS*Pk>$lKy*skx z^YFose<=J9PkfCO8FK6L>lUm$sCae^Qa*pkpYz4(JsZ=!hCirDU2BZ z%*geleH#~I3A|KBC5v#DGY(V`N5CYGC|qVyv~x$?2m_cDIlv9`7hpjMSR}9?qp&Jo zNp|6E1YA^DI5!&nhO1{u?YyK1h^zi&5-6oMj;yC?q*(x187LVR4j*V%GERycJAo%k zmqn%u+m2o5M6uBZTWL9)rL5xf>COBR9h<2B<6f5x8%FvP9Va25rGfytd_s)Osey-d z(gPG_lIS^xjpc}- zSs5+@lbM+oVX8O{SogiU?z(+AWtW+_GztoY8%-O#H~c=dabzaOF0Bo8;Bf;tfRmt> zN2Qh(BxBMM=+}`J0h6v3T{^fBE5OW0N=YpbJfiOh#>*~UM@ z2$LN;F3ftYkqmPKCTdA0d$L!}ipBP;PGx$bi^;@I%@fn8sDxl*vHNPFh7*(uYmv3( zq$3W7jzLOr>v;^!K2^D(W3C2^zW*ctw48G#W95awN_@S5mHW}9yckG6xwuXKn3N2U|EopqQK-3He%7cNKOhgDGrhNhpl)p z$eRhe5CD_v;9-3Vr4zbidqb%fMPl={aO#jWFY?BU;`CvM4+ORKz64SfRnN?p93~f5 zNe=39eyQUgd{97@LOfep4$`1#q1UWGfF#K$NOPlOJq0AS{vHy{BDf8KZ40h^w-pl< z{1u?gZAFC4lsXn#NUZqWMmeaOuLsSg3GpIXjF};E8tZ*&I`^mD8L~fz6g?b?Svd0LC z1-de>Dq9$7W76rUt(gS4k%3L=QzCJ3;$lZs2e3{2WMmVk{1r|I?rh?me#@na^!{M? z7rK=IMj}@YtnB^9`W3%2N0|z+X>5eCPb4r73v(b*ZKm|vj+N{z$O1w}rJrtT;H0_w zEL|Eg1;|cv3u9LxxKAAVh;a`RvFGMGOvLg=upv{*S|LF$SQg}|z%`^+Wno!R%v#4j z$I=#m+~V`ogd+8+Q_ah9c|goQhs%+87OA!B@Fa~3^okK3Zxbu9^)&ve3*$puC_9oP zU{S1YqQ{%v6mD&@9aj z!KSn~kGXifJO=kuOENJkX{G;_w z7GH$3k-&=HPGUAk{XJecQ}G8{@kHwPh(z(G5kQF;^C04$J9U(KX&|PH_nuQ%k97Bp z=j+U#C>6dk(IMxbfHp^qG1_6-t&wlBlR{?zVB@*iZf$yyO8X7!&&fSuK+FY{ zm<3{CD@EC7%1Q}fN>1A4EFc76V_>aH$1oYtU~4sl78U7|duSjraIFoXpFIhbGl3f( z839z{?;K8UX1u7_c4Z-W`NTxY7z0KEon3zr+Kv$#NX#4_A6ffEAcd{Z+EXO21t5J` zn)YfyBe__NAtc9GG?TvTMguuMJ0ybF(ayMmoGjFQ9AM$B1IvMUe&|*Z0H-ngy=dQK z3?vSqG|El!(*Eve=K4`%fiTen2V2f4*ph^}^>|!f!{k!OL;xKg3Erwrp>n~)b1jV3 zk-x-8VBs5&&3KWI%ngKyeP&KH@J!RD_9~VjfBF;p8BaZ z6`TFdC_(-C_(E0QUf2+PkU&eiQ8Y}CB2saVQxG{^fVO|O8RT& zc4BmONGoy_`qnSZo;=L^QnN_z9=L#_94rw61x*UXwviiY5!X!z)v)X<>_Llbxf>;X z;$RF`1P6OZ$+DeBfL5Z~(*vgl_tQw)Y1U#p5#5rQGM-Qd2{aUIV^(mYjAO@-oY)-& zk%8?{tqfa=Y0TjnOq^Wn>lik6;?9(Qi~HmEFi~y;5jvg`aDbCM!q-?o19m2#8lw;d zxcC#h98T@I(usj2ME0xYnzb(ij8dnUf$;X8f|Edcm$pAEaAdnSyN=SS{ckLx_o}mg zLuV95**9FyIIPB&=5~FS$7j;O;JuOv@D8gUfN4~{JJsBY20E)B#4KOwvXhY^2LIE+3Bt+k((HE*un>ju%bJ02MZ} zTBx&UiUu7uXeJ5*N|IElLaQSi=Qwc>!3M`ZePv@tqOVL@DOD*i zgsYz3ud+v3YDvYX~L#x9QM*iM1e9EFrHBw zSmU^_J31OGzPP^KrQj&!4FPVfUD3o&toGJ@ZiEK7aVa3hlt-fDwINq>Ir1&>>V-u~ zv~nIO*)-CL3@5+(JS4^(vlD3~Tvctx+8jNsA;Eo-L!zS9jWsVv0SFjd;G{f^+lb{h ze_|t>AmbtcjLICG8n_7Dd@QfQ%kz3>WKQpO00+;3eFd^ddjPb}Jr(6f0Yzz)se-=? z?yJeSCp}}*EaKOFs_yzq8IvTek|V%?j22HeWF56phf(CQ6M;;OW;~_yIs&l(y;gFG zlvxAOf!?p4+-qP@^6I)1g^xc6o<>5iqmFH_67(`f%T z;)S~pxhZbZYgUF)96uH=NdQim_lqO|l7UJL-N-PYEzL7)W)7660?^{MY57tCiIWAT z9|>%|m?&_pR^7^sM7Oed&6KU8WB;;n7T1r*_#fww!#6SN6(;SUtB5wr8v#+qnbHGMD&=VOgEvoQ zZICD^&YnDltqtsoh-&$bJvF~R3v=7}r@f(vYF!4(x3pQzMKc8&X?6;AU))f;GpjQ1 zqw}>rb#6Tz1FP?YK+jpjY#nYapz+)UG)wfER{jVC@dQ*TBF;8fR6ourUCuRShQwTv)r}h%L+;`&>A31!V#=c>i*=zE(ld zsI+5U*uK0p0WIrSQ0|$RR1ZKsL!4<8Wu#kQ>*89|YrB+cw64#IS(#sT;~O`p&N1lq zDAFJOKaOn5+VoBd+*+ zJF@(&NX!arCZmXKlNR5$^A;Apz!%!j;0;a9YG_srt)Web#_k`d5`QPAGGCd<~=+_dUry44O$c1dPnz?|p-k=+m!3C{EOI2!$gktKOpQur2u z5(shC2|*(p?&9fMlgIJ%I5F0fh{fLPegI6?Ha6hKVhCQ-iP>zs`1!S+NO?pO2_$%8 zR&WxJClq@RhGi_A6~+YDt2P72s3BSw=_b1ac?FtoV(AAxDm* zgy%l7=juj6%(lpNw~Bi4de=Q$5l1W(a#k2P-VpWD-^|hfH4(d%ICXezX%;hmy}_A8-h!g+tBn@uqlJY z>ubf!2cP+n`_I4mFW-`{@?v1+H9G=&Xd@r@-9LXf%UGu{BAE&Wp;0LeOJPzfn{xL| zaqC$ti( z%BY~tSm%xnoOl#YVU~GhMO50dd2FIAO*WMNh=kk}iE;+b7`T&%g58{0inYf==Bs(u zM@e%oN|G?RFz-8i089WX+6Nw*6^WacEyFrY`3QdWbC9U*L?ap;s61PcDa1`3J^Z)@ zi}d=^G`Ja%beYHr0d^uwNuUO!QOc~RaZld#OpEFbHuiiRDX8Aa=#T3TwL(TB1C8v_D~*bzr3d4L_&uCO2#AmAw; z&$N9Ga&pI*B|c^Q9neH9BO^SXfe*7AD)v3;*_=Q+6zEJGjgks00}Tx`GoD1cnMOd7 z#x^F}9gW&({Dg5(((pQB#~|uuT@X2f60tO%Zu1+fEWjv|ZRs4puVW(a^VwK5f830c zhVg$_#~F#v*Va6q7z|0KO2=NV%(l#*M`c16mWhP&Lg-tDMPEi5M6c4swr#Vth0oQQ}vPYt~I36&8NXn`U{@6 zrP2Bsr_LI18E8eLsk1WnadM!^5}S=2mbfy2!D2d1ot3bsF6Mq=Gw~Npo#kGiMIThv z&Fle2mVKv+T9cVw(e_&a21*R2{i@rAQ)h9)THA?@S&^*v-)l-(ZPy19!fMN}rpj7+ zECio7QfE*4RXzX;z=oc**X_g|$;G2C7L*QdjP39Qb`tH|n32z@m{zqPUXQFbKA z&*Ahl-AO-}>!_y(qZ9ny>IwWQ?9ZG^09W}b16OX->tw*b45T*!lcPZM)J9k=(DiI@ zR$;7F48Tp4h$X}S7$YHORtBy)zxuY1i^ zpj?%%f&wEJ8Ve<~mai#wc7Ca%^?}9gt6sOF`=l{%pu*57`jaTEXp+WdPaQy9Sjgic zPhpdRg5BUe3}jud-)EHV1b5=p+TB^RlBU*&rcKLJvneOdTDg*A^o6o5X+}xnIED** zj#1Efl+R7eHFZ{FEY5Wy3@1>~SPT2^4@u@AW)60*2Au24Yv2F$@40`t{<_f!=yM*m z5zxaJ`IL@#u3TKIHe5&8;N4(y+rj%*}^2z{u!^TftJaQUcP=lD`n1P8H+1u!kt`vCR^!9H#j zpC8Fifm*P=EkH%Vp1xYfjE!GMqXytJle_B^r}uD32gHmLN#(a zw1czJ;gMqPwU>v+K3MU>)x#@J)(kjiUgYE-S2iNh0JjYVr>!kmEzuYzp5E(X?Z=6+ zi5xZqk9Aa+VkdiM3Lq+t|07rY=XY}?0BI?g_ zUAd2f6>{?gVs-#z2G($FfsnQ?%RT@k3W&k$hBhV;z)~x;h+n;qrtT@rl4%Tu+wiv? zHr7itwnlR@Fta3)!sC>!A@DMcTwQ_2L@cOIBTF-DRvPPaPy2z~x)+2e0y>(aEI@sr zw&p0Lrlw#JGgAzS zMQAjXBq|?nLma>S)EE^k%)IFPA{hxHffjXA&XKEPqxLA{c-5iE7{7+HO)W!(7pF-9 zjOZYbFS`3dENkWrIS)-+d12Hf+)Itd&=?F6+?Ml|nm`WCp{hlO@BXzPE9YoAS3isq z&}))S8Rw-XWyd3vG2Zi(L5@ZxJQn=mFpJ{U?tN-qWUDQSA4)MU3xnAnFh zElh07b?8vkyU~XmfF&w(A~r_JV2C25)qNo{dr1kC5YowpvNW_Jv!xLtJPnkZTPKfG z3$g^lX^%;7x8$VEI7+TXU{+lB*3DsMI*~xVJW9WlxN%rs(fyhpC7#?<3#pfr3n#le z3J43Mz%n;#1`Z>;?LhrB15#d3%r>jz0%8I(xnCkN3vSeS>}fRND4o`y+DYG2hDiYn z%5*$MK;x7~M|h30DM;CF?6~oAorbb)FSqLisGQpM6<|GOEKI%cre|m(01yG6Kx|B6 z-3>-@qRkmJR^I>$vr%A99JMf8(A#wvAjerZnsUqO!2n-mC5Dqnom@H+x>gG`su$wM z0Jx`4CV0MLhcUet#mZ>EvLkY=*K8G9q$;Z-BcD9wxP97=t>88a+fu=c=7OE8W_vDWIYV zV+$Y|wx9)Lpa{l9z(2#RTo->R7VSPyRs5O0V-fk)HVp6%#5nr8Q?6NWjcz> z$1Mr0ppa}%Ntg@k78!@OCCX{IRntNvB6cEZSIWW~kHhk&?j)`)#y(N}y&HwR6^b4y zqlvOP)WLy}H!v@V%qKTar)eQEXQnMOyTPGn>njB+ev}G}Y!rTsjw3eaSOIgQc_#!c zB7uzxQcj8W0P_G%$Wsl3FlZ|GMVa5g{X7^CZ9zmE(-@;t0S7cKU}S`~ai=D{#qZ?l z@#Qtd(HIG@6RZqG%*cER^4b%<_C%nJZQvN)bea}+T&Y0#=9rDcxiocaSF8uBnuAZR1JRw5TQ7EXQ%v*Gs6Tg#@{YiV}IGn$|Y1P27JapTirD zJQN=;Zqc+XZ_~6~Dx*3GXi+ikoQ^{a(zML!cqQKl8tnkYL}5%Spc%I^tApr56Synj zIi};T#^zt@vDQt^t?4N(oX0wP%%AiN)8Uw0KCEdGT?-@w+OT{~x|L%#c$jX|VKIMX zi*HoN;2h}R|IuG^|H0S(gU95{jW zDj3_qhOCLR;t;BCA5kwS0W6s^OaM;Gs7IssW$feS=Q`fmKkplpsk|_;9ht1kabi{4 zh$vQ@^P!atA~`Tm%%-MInP6BZgpQ||swauaRXG}EqbMCnfk9LIaAa9YKulX1m8wg* z)FQx0s|iOj&S^nCKB{gv%bkY}Z_!t**8>FN@@IV@69>5|8$%&)1J8+Dj-=%9RA9zlb%?dOyC4S1>HP2Cf7v^Mu z21Q0II?55I#Gl?XPyv>MfA>>MluZIW%J+d8rl%S+0^4$`VCFM+!q^x*s02q`g?wvt9e=bz7SI0kd7!54J zR@1vD7uu|hEUGxQW36@qO)bK|nitCXipKal-Z{3hPKG1%=%S0+&r<^(tb2s)z)B3Q z6gM7Q-%vcV%9q+@hwL%bxfHPST|e`#a?U1U?Td|oUK7IF`yKhbXl9E4>;L0d#3!El zXzawWXBy^K?Z^8q4&U#cX&SAT6EcXP@lX&Jg-Zx4f;^OQ&!J_az#*imw1~_f363y6 z%EEeRXbwuA4lh(V>ydPO++y;h*pUREET;L#o2>Z$N(0GSdhAsnTY6hMk62rD4v>;!J=ex z_juR}m(ZrjcxPb|+i_`%ea=mRi^o%sNSC@P?t=)bcxB0)UY;wiEK_1w_BLfu-;TtF zRfI^ZO>RSu9W8G0@Y<4mBKO%?4oFxt?N8bTIRPPhJ#Q>8B%Ji^!GnN`K;m5!P)f+y z#%#V|J0fdFHutp4hxI1VXQb0!2#ZmV7qC%I{)J6RG`7JQ2l|kD`%`us0D~j<(9n%| z?$OBR+V)v~U(uTAI7dJQK#6KrXtcyxEVeIWSUhQD97M<`2GR-;3*>MbRHRF+64eA~ zz?}U3oxB$^l_@%6MB>SHHy#R{mdoQG(!pSa!$pdkKD_GnDz$H_eEtZiu!aS>Dk_#8 zB`fEZjdcLp#{qC$UKmN270DG;N2$Vqpb=T^%<>tI!j#~1o|k=_IkYOUCTnmU_5SD> z2ZDQY@(dK%hJ}_I2IkbLOs&U*91A_MDiyF0>r#(}lBePYaAX1~Nd>nO9f5S&ndx9u zf5I)xIuf$6Pp45t$frDCBH2KeMKDSW(WneX9XG2!DKyebw(IiQSRfae5{^_)n?8Lu$!a|Ch+uO~VPbqj6Y8B# zY>9F~Ae0m?*}8FO+Vt) zV03SDU6_(6ehT!@$ms03NeWGrCF5#+m0A<0gn zwqL@+B=t>J=a}KhPdd@sJH(~9uX*u0@{p{l+ zto_2*y0G@;2xu9kfKB=Qipaj^8~)?)#K%8gqVbFFqO94A zgp3Rbp%4WJ<0#l2S=eXqUAOa&;K>h2yjUVR^FPPAc78S9E?A(5JKX`EVV>E-;#EiB2H%gyJNwom6Ybwe_;% zX%|svJ?Jtb6=duc!8g#uN0Cwlt)I}c>?nPB2Ul*Yjacg!PQ?+pFpR!*{6x}arO1%0 zprF$cnWQl769uUs(1mA!Q6zvAdfGnz`QP}B@TdRFKY^*rXJxALNmoF>Cqm_IrYYZ` zapdq5fBUalYUi26k_l@=0*5i=mh2&EmaWKK7by-OK(}UM6=c4O6HZdHbsi9Tk4ea} zn}`@k&PS3r$JB-(9U7k^{`g*>4J9mo7n`P_AvqWrZc)<{o>*+o4ASRg^g=w5C#Ymj zSb`c}ZQ8Qt#nBcono6Vv%@XFNd)(Cn^_0$P`!=>9k6nO=BOB9F&tF^4VNW z3axdm@C{;xJ{K$FYof+aI!2$p6i>ncS<6C??TwRnk5@7hrA-nME>h+fl-Y7vyc+X+ zD+@f_cZS&c-_x!)%W~D?6OlV#$#fB4-rhw(l8K9b4gx?|H|8agDG0^FB!=5=DzoQG z=Ala!C7J%jy|1pOokQuWcw0tKOR?#Qb_p%!T#B|Ni6jE)qO5{4zqfQ7sbShEw_}n^ zI6G;e1Q+qebS=@{bM8)>oR<_((8Q0Bj3=bvECDpEK{ff-Rx;Z@t{gVf5H12F0T@>_ zjYnd%M3X0}u~45&c%s{jYu`yI)|{{`oj{8*Uwe8uZ6QY`oqGq+gmmIW_7nw=G%s@{ z9#%t>yj(nXL~p4isW{HEo}{jw6t0D_J|R~#t*1LFEDCV^HgSi+c53I9SBBaT@GvqE z62X^O{@zw3v7ApYz>{WYV; z5|fWuar39VCm4N*mkfi?^xjJ^Amr3U@cM1aag4RmbB`M{-b~@cJ|6N`0#-*&aJ&#g zZCm@iTt;LfP$m{QA?jR?Uv+A9{&!`g@~H#X=){f+@j3O@%m83q7-+P7K``}GI^*nX zGko#IG>;TpSs)4w!;l1;UrZH%BAt9>c3$xNuYCnHoyxR@CNmreEWRgwK4I-<+62!? zl*CUHI2XS1Nx*b-%A)I?B+h?|kur4mREZTgAe58}7VgkD-sh8)0WnNcI9bV-X1Fu1 zMV2Th5BO%>6$VO?lOf0S?Q!J(RdDKh!pRmD9ylDfF1WXob{cwiCLzHVVT2S}Z7iaM zv{GRaP-3^gnlj+tOLq9i1t)21u)x#g_K>IcF;X`aQ3hl!so z!X=!z!Ip14Cy}cXfY6|&fp6RrbODk19QyOW{%hg8f9MB>xboM`ROQo7Q@-xeH03Y- z!jI8^!pTX*iifKml4vPrBB`^&J86&_M3b`=5Js43+vo}(7o>ie_$e}JNm5kU6yyBI z5h`t0fh``D2v`o)s(DvVxF=jDDg{ppmP94#bI35mI^4}0l&Proc65XUu( zB3vkPH@fn*5${Xi$pnI8l5ynx@x(FYS>Jxl7hgSh(x9id%J1M@~x^XiPvE%mh2+lr2@aUQ+Xc-|+?nz0j z${OK%#sF^*VnlVpP#^>%CoP)tfoYgRffI=&E1=TxRD3GZPRs|~7NVn2q)0+2;b&-{ z+ur-_cfKZyTQ?EwTF6YQ@;$21Wa(3}71q{8pEXcl>U2gDOM5~2Z~KJPM0O6JCwpK0 zs4%Te9HF^6VS-j6ike`-)GkQBP|&hWtdfd)SuSN-f*3r7xxJSvh@|`=u756MT5?JA zx{46#2C{}^@vgA@M_%_y#77ihBRhi%iPBO?SQ%HoV46$AFv(}+$5iS)kGO|^oriECz#Vd)AUXtDZE`87 za`wG!e5|fhlp+{;H#*+?%1OS?4jRAjom@HJno*Mi#xVB+WV7kQuAih7^{8O_G06(4 zVlvTu9ynpoQ;rNlKx1o>b;^YGNE9=ztz{r$Xh{qj zD669&9*xF1f!N6+kobRT>nn<}-CdUmqSvMzBxSVsbr+-6S&~qbmLDpoMPu1aDqY_7 zoR-~vx1Q^|hm_N@>${f9&V_0eC|ni4QP#DOdS15o-Ad6sP+RYwD%O(hf~F{6g?*MZNrC5Wf z;BvCYE?8@Gx}v~0s~cIniFSfG;pEu}x2NbHI&-5fW6Nzlf9jPdb}l%(F~BD$De2VH zpO*f?`GiDTPUs6wx8$XWLD&2#?6U(tqv1WYs}912?}_LLfAiP=-h3{{IsG$VOH-9M zou*Kvd_4d$OVa1RKK;@B?1O(r6Rb{E!n*){K!U$7ZJLr$N=PwcD;&e;zp|-{t%r^z z1%&%$P-lan^C?_1{3eOQhSb>?3(T#+M`CFn8f?*`+)TB{E^5+=uXiTWXJy6X?`0&X zDWDTq#mOK*Fi)NN6V`ekRvaH<-9%LLsic4;>u(0Kl_!6!ND!VBdlBM=Sz?gU1SiuJ_Vr{jy{4|O<}pZYfr;IksIU~!*7+yq zN!hw5rR;k%Y=+3lg2HbnUTGKZNUk`s7Wuc)VGj@H(^ytKo~D^_l75r|IygO+V#N%w z2U(x&pGX18`Y0YG1+@3LaDw27dwOf`Y|0Y%_d^Qk&L=eTf2McGQb6)Em%UF^C?vQ- z;WUUQUSCs53P?mt)Z~t)fTV*d4`4p6HpucfFT(_e&n>HY=u$xU-K2#HpeBTb_Y(#v zoTY%ICZcWzaW5;@Jahx)QT)p!r7JhQa6@g@Y78kEWg3to#TY198&`^%^{si|ECodI zz!cEh>pc2EfJ5M_AQ^O`+@*k40?It~bvV1%+-vySQ$T1|W`V3vO;9eoau13f_X&hM zl@yS5{Jb7gKnqSI9!a&!(U1b_$_oABI~{o~OtU?Rv3Buke())4xd=~qmCYde-Jg>d#5jc@D}P42AOq2c@8 z*s)Ng@Jm{e*?=0P0^UGVg2`tSa#WUrQY^(xJ8AjgMvBcYmn$}ojH?KqB(OI6RCr~Y zH`0QUSq`Rge zk{e_a&`xer1jy+Jn~SqeCLYYMGVOYzt3lHCns}j5z=`#+Oc-=k6CoPtk>P~JiU&pD zQ0%m?L#QN9L^$2q`=o?jLQx{oNhTo)w@E^-O^2SzQV%Z9qD*PbH)Ano{9onk%7KYu zcCNC{GEubmR9BJJ9j7J+!jn3Kx*ur1Tc79^f%j3YbOvrr|0>b^V&*2Uzlhf=%bF<4 z^FCb4ibs53CiZoDxfxhU!)tkJ&B$IVYBbt&pTb0TcwJ~CI*hr-Qn~BiieUEVi?*uM z-3vGM=L?^vRKPBywJAF{#nwA0U}eiZSLIVzH?mBvSyUKBu+T3^zsV%&pM|M{W_t!C z=y&8rEqN%y*^2P26f(Dty|TqFka3Q2NU2|7Q>^fOmoY`*_92~k5;p(!|6@0w(}k<@ z`#x3qIHB_8rYYY9lHDH)fBG-{sqpzP-p;hyg^lvT(#NAKA7Q3MtbST_`T4RM$^vyu zg3O;qgOv|5LBuE)=(8E-*o8>@3P~X3&*@2NCZfeSo7v|hJG+D_3Oz9_9-L4(XuK3C zR*ulvrGj2cba{s+V~M2Z0rHk*1;mrM zg3G$-@?H`>Y63kB(dElKTX86mt@C-9q4eGuA$l@q;)Y(5Cc+`W7qt53+j|)Tr z*GKL51%Xtq9^`wtDVAbF4Y3p%`Rbu7IBfrBu_C^Ik^~UN3fD>%!X#qVl@FdAN=nb& z_wCC?#8Hq4b~cgXJ{O8YPL_%aAr+SzU6!dul-qbyvkTce#JJ1$?s0T^J4BavE@Eu8 zh!Rar898nFzU!%4{8xxBUpy6Eehhqzo8Cwpfd^26?cyi9?N~_O3xpL8jtlkDy=mz} zxJYa|g9b+S@=kYR62YS{yo@l(+NYdK>Xp`r z`L+76pxTk#rXo8tGN$f1klQFG&!)(HMa4}o?q$GfH$Vm#zGn8DgNwl;lf#L5P9ps^x0AZM|APp5JCsl17e-_*|F@ibA+;_Z30HX-^bEqqJFF z^U%y&_G5I~4Y>x!lQmexdTiqFkLjbW`-PNe6GWV_9MW2yr8&8K9w=)^CM#hpM(?c% z<4vCwqd2zY&(QGwsFiu^v}UeLgH}guda`r8;AF+UEZt<~{LT`2O!eq=l&@>;4x8|L zpU%B0JzhB7+9t4A8L=3(s|BHl4#<2vme6EN#Qk|6b1rhhXGN^1%kec!$iRXI5?L<7 zSFz3>vQ$p}f>DbKxf;swqJ&eqIF(*FMe0XM`S6@H6KLBM9~bD^0v}6EIf`(hr?T>V zC%zR^Inh5rPR z*FIIS`E6Bnqm_nioeU^|S z8fHV+2jtK;vIh79&N592@_3x2>*INA80NeHV?Cz|{kQ0I=Qv`~Qq=3d~oOkF)bGAVL9kJrl7a$`syvDY(Rh zq{vz-5%W*#GGK5vX`yjeo0jpqA?T1vpv;zWh!jpj(nSxAQ!kmXbiIEob_UuTYe;XR z%bpXMG<~vh|OL2%>eJNf#QEK*Cqii$62qo-M~- zPF509!;XY9av;{`miT5WWALGO% zpf>taSUea6EVoQ$79mpw3^xIt-;o<3b|&$#sBz7DdgyC8_vX{-{I=tv(Am#}k+Byx z9$l=L5_4oZ;bp(`o_KH*TBhOiFFd&uMX(ex`i<#_G{V{>Ws_Lwce&6!ii zo_rWTC2K{~L7m}ptH3aafmJb=x~L@RfBj*ii(uo zV~DOzSovBLYbe?#C@G4xvV z^#1Y6C(G|7V*FcCMP7~mh--aIiAT{ z9>>{?bdb`-+2zKmN<9^1g(ZBJ<9uXS+lgP)W}+;J&zAs3M6!pJ^r}8dBzpo=vGk#w zir>=Crw)NjFMj)9hX3Mc{_K2?$GQHUx1`nno=j8zz%Wf=B>B7ZPyW*93eosL;&Ym! z{*+37il%$;)}|@X7SD>2XrH~bKA*NiI@UGND=RnTRK*CjFMPT}RK77(P6l%<3AM)q zp?2V`L^4#4ef^WDY)?E=#xWk(M)i~o6_y5m^aO+#X2R%>(X=4Kg&h$Sp0F7{6oNX%S2{uTHwiGA1hoywTmCVStNbXyX-= zHY9V@`-o7B&l4C|jgc}SzQri3@yfXIMr7NeZ^t*s-xJ10$X3R5#Ujc|sl`-E9(`T zoLqT=#|j2zQW0d*l82RznQnLZe_uWL_vHN#i-=M$N!01hc8L&|D@h$)`P3pwVyLBw z_WnDoR}bCKM;=R7oIWNo{C!#TviyEM_Uuy}o6Zc=5l&qunOc;?K&ah$UsDoa5Dm6< z*BiK__*_O)cGd}>d|dExBh+r4xNLnwRRxk!tsMNv8)qXKm&t>W>)NDqY%lgKIMn|Y!JBq=4D=TSW zUiDQZoN5ylQC6>eLhY&hPGX0ecQNH4@lntL z)a(j4N76D8kG(gKNd7|a%KTVA^|wC2etQ)^k5@Jkk2#T-GC!_NQRrD|_c=hs zh(P1l_*fJ?5#Nj7$8IML$`+xP`hYCIk94@V-(?X&*F)=&bi&`kCR`-`VogMGrO7E< zk7;Z5R=p@bwX^Q0%UeXw`-pqGbeb*Av}&p~;Grgi04=1CC3ovlDNNknb*Z2r)0NS$ zLeavD3{F2Hyee7E?&o)1xnL0A8ht1<+DDcPvf%W>k2QRsFWi6|w0IE5GV3`z7f>7~ zEnE-f0Rl(QV3mHMO5-g$)btokZ(mq>u`4ek4Z2Ctr>^-|un$PUq6lXtV5MWJpp{Qb zh`^vk>KY81qoL`&tE;ZKhUfBv;X8D%;$KV>%V0Hzq z(So;6Na_@>eqI2pk2rEZqBy~h4pW*ge=fZTh3lK+$C-2*lqOD1PF;A|z7WEO-jXEa zJ(39L&(G^7Q_vt1ww2HP@k+`DNk8lai;p6?CYnw?LPxr6Sv_{Nvuvwi1=OY~JOHe3 zI%Z0eF>1Q-2}}F=B$CX7K#+2=EZhYiyvR79lRwM2H;PcPy|k7MwktE-pWGB2V51=L zlU(K5)!x?21mnf6O+L)?A<^O@35ujfM4`_{NdsBG4i4%QuWVtMoVG*LFhq)qk^&z^ zk88&XUd*uOM-d|?MM?WUOwVB5p`H_s0CQTBg;!EUNJPQ#Tbk#}S3B+FErdpw9>R&2 z(cG(t&L7eV2MCbnFFA;iImpj~-_ay-?JNwGgeeToxW;(trb^3WH{Z_Hu&N>_M&NT* zfOM0f`e|0?N~)5L zs{)x~B+06iuLY)uIPFPd9xviisd#-+Z-^v`)4=ZadSR4P9(}=I$h+#lKhl( z<`B-h_F_WPY-tlP!)=?Izc%1oE6IibF^aLa((|&CvcXdaySV^)W&TN)=F+2*PF{DO zO7*Pd0jJ+C+@Jl{zX<>7fB$F1RQnldfRCH1e8tv3Z?g6orz!09`S!N<`5*q*pH3jq zazzt`okH?#(IP^cY@a(Pr9AhPP=4;9wuOHJFNsW3l)XZc(bhv)>!cT6yp*IVS*xw- zaS6xLDk=Vy1&)K!8%cl1%i~Tb+VKOC0u${7mI|jSnd=%cF0mDPqGHAiAe_ANa;#HX z?W_fZPjDPYj#eZnUKL{noZZ@pF(Y2b-ijtluydV-O1?YP9&)OtgtfANo=@ zjQwD(%LL3>C$%Vntz$BTC=azA|k!u-myO0SRZz5G%~O-E%>3oKmFDJ^A~5x8@(nG^jU)0*wsV7il>1b{AO*+&lVBD z*5r&SN+kep{$*mVlcW)ODJpzz-V|oRi$sQ#BzdAtPbgN{fZV9Fw(GkA`Oi~6S<0m* zjMtd(v9c&Ush9$)B5JZ2ZLMGm1X`{4&dlnIan@Esn5r=OLr;s55oJWlt_ypEd6saa z#jE0mGGeG(#Ez!3bAO>LGbNwjpds0Ne3mv;FBFXE<{(v;2NyP^7D@Aj^PaB|H?rc{ zh#?PA$2Pq<_x=&(r;w7#ae2M;1ME_Je`jK3jB94;$zd-~5)*Egt7najF4+5_{deak z+KGTUrHl$AgPUc^^H!+hX1(YQf6ovJYG)jHtMp+VR zxe_XSHyG0s#9Dy>uaOF)B;dR#aqlFx0~5G6Q6^z=>*n1oYaa^Av~y1iS4}2hw|yPM zQi$j&o}@%vX=K*q8B=T-qND%}N3(dBq8kzXm%buZ)==8qb=2pj6cn#X@taICF=fPf zEH32xg4=Qh%nP2l_F9gXEJPKDT~u92`e!ZoB@}M$YoS7M1Hlm24uYepwlKbI?eqOa z+Ezfawhz*#%vDfC+x;vmDxjTYsA%D=u7DJoKQUf>3@*y4r%c%aL>mFSm&$kPymQ$6ls;Tx(go;Lzm7Vg3r?30W52l~{;!UL| z<+(6a=J$ZR&C`^O1W*!2N|J;R4Yji%sYl*=oD89lUm8|E#W4E#evBr|8i?GKDC`s> z@hMs~bS$RJzQlCvjN^DI{!3BGzxqPLd-xwq`PlJV_~Hh1yPMj!~XC ziJ@3gfDoy)YghP5Cokeb32R>wE%Cc$e3@nMn`O;I*jttnXpyGm8Qx^;p80WvGO40R zdwP^in>M|1&J3`G#PRCu!tX=cY!>5QmRkEV95@5_*F2ER3a6P@DP%;nBq@B;4i#SA zF0tNay%Tqj5$86^+4kdnJBjRihQ>6A8cXbG8K4?BclSb@#m~BP5L(e_v3V`rTVh66 zOfpn-@c;8@1tWeCGo#X9aquaLevkP?UAc4JkR)nJC&Q&sq;0krgUXXw*IR3*AKHEK@(k zT3EsEjd@TMtp-@x?2l>b>@Vzwp-N`7xSdS9Ww6 zX4$TQPy|wx=yH{G4|{)-LflULeMXL*_3i}vx|YO2zU(`Bc#teIIVotQjT=eo zFwFzu(l`?vG}mhCLdxGbrKp6sNmopgiHQ12!mdZ(*N$lFD;PuRZynY~SXq=tVl%?x zL>)U%gg;gg!)VwICR&{I4Rf!81!mTOnDHcL-9-er_y}^s4~!mjwY2j|M80x?5-`=V z^~?Nb0>j@2M5`%e!roUnT<1_|(PL8}Qe50fT50d*;5ry@SruT#jY9nmVn!|^Dp@>O zWje!%c$G?n!qpZgGLr$}$Zm0;3KKz`h(#oLs(7Xti??Z=P-$%)v~|L*uZyGu3Tw^` z41d5-dI%l# zMy^T{dbx=f5ib-b77W2UD4xps3X$Uo?@ED1Kk>JIZl0pdf}^c|EOrd93f4a?AY{^~P_R7rwN8OhnILMc zOz?$ISD5-S0_>4@{S;-UV2aY#LKIBE=4VOvSpR{LXU+9I`%aF$F}baT#5ZDbWHB){ zb1xrn<o_SGLkryRLl)MUP;sZdp zNg~SHe?d|$U(ET!U&xByPlCIq_aw*!B|^NgizAE4wl%6Uj(jd_p$i=7*1rCUY)Pfi zX&>WiPxuW*0B$_EwgcOx8*I%0i;2sG;z7nV%gzf1qw*%iM7vByZY>fVai!_&7p`^S zalyErtClK&FB)3yq_(~9XtY5&8Uya0C)XlVlO*exymwBEUFC24*m9DSZN+MZq9hGH zJXKac5mSyVQ;%6tB$`>USoB z4FJb}sIG3I?*&?>DYuK~NeHxDX-?ArquoDBU$(-*3t9>96SdmqV#!=`^mrcb3^*)ov*g3_HEWaO#95Oihnf!^?&rs#!Zo? zWWw7jOtXcno%eb}ZS%B1$SlNK_oo;)<=7`GMJ6iwSSBn-12+YNCCj>}69DHk5uOE$H+G4ojzR!YWxm_ns73Ygx(l?|_qI&KP_ z_GQy2ddx@%e+qZhNsV?JFBI&!Dcc@MrA@Gk{pNZnZk-O>aZ@nn&RdUj60nuvKdHOB zZmObJqZtXGxOMaF=tWtss3CNAz7irF?h!WySNj^FHT?VGp<|pd4$BEcQqG8ph2@G~ z*DjrpwNwUhtwR>b(EDW4*)Y@+fr#7OSo zK8O}mJ#)V)Q8xp^;mO>=iBLF5A}tAvI$5zRfc4{PO5jNHTzo1Q9_O0?bt9ZDi|MuE zK%qjU9W;;#sB9{hueXB`CoHlS(#eVMx^KG<5eG;~x<~fYTpQ(K<-@l+z^Kv?Jzk8q z_dTaVBFbt~R63}dAJcd{x$2!q`#d4htV!V7NQBjHp2U-mMPel`D_}N7+>>8Y_Wi^_ znI=&wwIk;Qs~}sqz_*d5lZVFDq7x1gK+C$wzZS95p)ld+^R7Oh%zsz;J<{Mii6NIlr!duIoE4v*Fg{IR z%e3oTu{nw1)NO(hyAI`*);Gn;pH?+U8mL3>GqolS-n>t`bithM_geH@SRViP8DhxU#vtd-Cg5D79H4%&hJRvVty6wA?HgMI>-bsj3yOs$dZS zruqA1rBhI3$d-Ade&eFB$~uZGpf(X-y|%Vx!r%&8m3dK0&tg6Efi>giKS zCyvk$O{gHzbNtHSZ$-XtH8b-?G`0=qRe`Ct2&KIVo1g#U&3w+sx&IFe{OyyNYTsC> zJmpXMBx|2h5d-97O z@|Jb&bHsu|h!m`brWc;l;WVW=ml?T&c$p;4QCTVTlV&3H?!ea69FJ5NSIqB!#+7;|G)Nb_#m^$GKgq{#tgMBD25mgv#>f>7h1JIk@4r2^TzOy>|Z!?`OhGraDQ#7lfFafl0vC^pbLD zXg*dbUKAs;3ezY?=1D~_o2?J%*pZb{5jdW$a3FNDFm~+yR-UiQ_@Vd^PZbTYw#K}4 zk4q5-OA*XJMMu>X+&o!qufJQHWY(>l+3jQa#^Qzh&8kF}qj<*XPnj;frXvqxhH>R0 zjq7H@U3 zP0t+>!P*oHUSO3&dq7el!eo#Y7z+9VK@clAl%%O6I*)qeiXK(4hI_T>fp44 zYoR=(3TT{VS4rTA805}uk>bS^Sipjqg-9I`_Z?q?23y(nYhogqK^D9E9S-I@pTOvT zKX%g*8dMj?NKta@{=tl#U1W9dNcIInc5iElcJhNMlYS2~lMdw6vAj=tC&|EOceWDY zGo8>p`fnSDr=+a^k08;bg|vUAz09xdQQ#4+C=r)21@i2q=(`^j*fVqxg{6o5V>; z5EMVBDun;p=cPsY5p#u9TNUN|K1$y)S0uiihseEhR9d9DT@2h?=N4a^p0>NS35x>Y z9NOr{cwGsZm*v87`f=k0h6ann@rlQux^V+7y(;zGy(vXH$~Ylb_+*x8in3a&loeLN z=jWkuIiI<|Mg1;q0>hR40O)L!azvJS(Mq365TRme9~RlNnfcTS=u1=?$x^O4dM(MfK`PM=>;^M#D-nZ9 zElTO&qpl8gc`*6IDKkV{};G)-A0um?wsF+YV zDK;Sy21OC3h3@@%e`{jidTAi1BUVgk(dIj!Tx{>V2&*+3KWgQ@cYv3ziFy-m7ST}# zKSn<2>Zt#o6dh3_$VC!3Zit1+_u%4$6A~*XycTooL50bZUg0F9TQ?oV3=8kcvf6Pm zFzr3L6U3Ct$16xDCHcQ+nV{5bH~MCXDqlyr2=eun|87Uf-K6noNlev&a$Ci8YttQy zUP%FYleGJh%)okh=o*x>tnlJMBaU4v%%6+3gTO7%VXkQEZV~icc}|+#5ny2$L{L&6 z7;aOxZjg<#W;M2vw4AdeC@Eh5($NCEs3A9rA6G&07fA~iAz%mLuQUTLr^y!tMMBi9 zZ*29Q6symRIu;XN$VH$Q6RthVT!wWzMT%Z9W*j^7nHY0dzTz+NwOHgBz|X*rA5dz` zs>kYg#e{NkZ1x0f7R;V-3eV=L6cb8{)rjvrziBbyiFX2ppZPm$_*7U@_?eGE>X)}! z|GbSq<+I{X`GNd5{;$8!exGE(Hb#|S`LqLTmkhBoJzqd>G~W{J*48t#s5y32egf6D zO*1gLY2883U&2hg2%RD%**b_7PF^0ZaQMeUI;f(&$(+$At}@9nDblIHouKXp1J*uT z8dZm+4-L1Gj|0z2IlU1gt<-i4qS5^6Z63+&aIXoS-=6 z&_s)|RJK?hNIW=V5}}@xjFT~MH*sAd9*&6V0H+xyd?Z2B46Jst7r_9tYrv$1X`5;9 zl-mjcLN7{!;Hg&+oe?)m3W!3+rZh^>z4p(mK+4x{sx8-jV#uhrc+5zD$o{?)E=h!p zC7sNx^I$E{nvA0VXWBnyTz1sHdr|I;L|bL@mBpy5lemKJAo`TdFiQir7;@=VQEwFs zFd320yZer!tm~dEOcky*tyO&6L*N3YmO=Wfv@A4GUynr98ukg9bU zVydNwrHH`cg$<`CY;Y&KKS;ZBmUVU-koj%p%{FBb5dj_(PNP+zw$WuYM*ZeCSJ|sF{^qJ@!WAigizBycx-!3}9Q}_n=7#9|u9}o00aTkC_># zAEjXGqQE!%0}4*RtQ=Ep<2R;kq{}BsyQLwI#kI{5U)xKbIq)Y6RWMRfpDm&#YD9S@ zojr`-L7*rxFwz0^(+d_xhtFJ`Fy2??1>R!CB1)QYko(iTroNOSQNuV~0fnL0 zrz6U49M7GkERAH?!Wi_NV3yQ8uck8Xlm7ho2quSLyeF=BoevAo6Tl=uPrh~BEo0y0YB1OFxaw63} z91|lr;akJCR_^VyzNc3d|j2H--^9J34E0$=8Q7W zoko$JwK5GIKwR54Kbppp`5I>J#zlWoWAxgKzRa|q-}a@Z8)Ect95ji-)QDpgd&=l% zA@GgUX!{z8wX$B1Lif&VXRQ>jdw4;*W?UJ!TMeE-;nq@SuXbL7k>TaeD0Sv<B>PY^ZjpSr?lb@C?51m~9-uFXlEZ0+M@Q=hRovQehMOQb|zF+^uLoeRUFic?G z-tqey-ELl)z57$D{9o$9O}A`LHo>ALhg|vXy>XcWMN?#zUZP7kZ`1peb|Xa4QTh== zWu(zsYE3*?oG$Y95H5XfrDVlD7pauZQ7b%{rw z0Gf^vN@;Xj5Ncn1@H^rAfA~+%8erh5yiNDdS3H*dt;kUSk?BW%^3Ts{pZG3Xh+n+2 zQbLNBa^!~E_Aw?aG}4kry8z?dyONLHU>l^v#~LCf0zEOlJjaD8Bsji83aGLJh@`$3 z*u`ln(}^31EL$#PHA2~}DOpRVOx3=!kIguXsM(~=%BN15<#;a(OC_F-oRnMhudt^l z4ExX^4s#VQGKPtM|Q588WiaVs!491zyth#W8a;=v4zHF4J(LF9pjR9c#BS>v9q z59HPlEFwOVl#`K=8DxyC1!lUgVPsj`ka>035o-sZiZ#aW`Z#CvnrKpD*I)g%=GmOISMnjESrA@x3M@eiU-r^^I^37;3be*aQ*uCihED@MDY#eoG>f(Xw{qtgf~>9U+@#va}>n{TH`Z z7Ml=1X1^LQ1g)9`sh=WY1vA{LRbaJr{cxg^PQ7TB{Xgt`c*xY7G0Ju zxs3E_Fu~%rFWeGv1=KiSV1-2nQciJy6D_Y`=>6#Y`RD$}KMzCgcRb-!`HHN6-bAR3 zvEw94HUsBwcRt|jjhN`?--b8 zh?v<}k5ObR$zmfikoKoHhG9;?G8eueX!K$i#2U9VGZ;kB+TG{nd_YWJI5wYxrJ2w$ z%52k=GlwK)HLvNEMo{=|%q!zsMdfq9%woc3oYRBW`K_&cOw3&NJMkoBOhTe~wO1rg zNg`(wUPKk)!N%fAx_%hj?AJi|eac6;6?HEsjGZI%v#>LaiLsZ7#@-313K-LIzZzvN zN;?=n(-WXFjn(FX=$ble?1LfVvv^06PEiiNYT|mvQZka{NxBANJb5tOwu!`*uWu9< z$LS6~KOH=Z%=c|dapB)d}Zep z$+z^Za7`nIa;|>b_oBe3Pe!LBn_DxqPXdDD#l-|8JW&I4XIL7%D)|X-N|tp|RB<8~ zLtOQA>=j|7ECyRCC_L*63@5C++4>$=if?eS;$1+_T8SWkC&5Q>O<%N{WELQ6PkENL z7tCfNDj-s<+sA-ynA9_@(bhPxO_1=MG?6%Kkhhz5zN5F2JwVmEfN;V6;*}+g!trZs zTc-V?y?u1<7enp0iBS0@G38GsRNlm&^37_bO@H|pKA+I<6JJOR@_SCEWr}A)`o}yd zXilbwWn#Sfg;Qwjv2#>1M2P*O*qr>rCn!dxJ@MPcBZ(Vhghh}I!8TUFBx{^_;)$Ok z5wOCdL8#J%Ji1O}ibR!z7@RCdwsNxU(g%dmnlvP{0W+Stc{X6b$>~YO3xa^RgfU~5 z@uWhBh<2WZ%Cs5`Wcat4%p}H~NRZ|J7V8&|S%Wm1(z&lblx(m!FA`hW27YB!F5EP$ ze1!>I6>=HKS!knV@ENLrrLq_UlaObv)mVU6)`rZ3?N-<-`<|iFx?4c;WR$ZAqI}x= zRd$hdPWxF9H;zd5WFetO5h*ss5Fx^dvx3L6p!R8o?Fg!br{Tm|W#UjJsS{+HLKA8h zk6q?g9lGfH?JKyRAr30M8B%Mr= z6CsJJCkS6+^Cv04vk=jSO_So#}DbT^L*d@ML$P9L572Se>Qf2DmYpG2s9DSyg0i;?z^ z#h?7;oqJDST3d3FX5`3X!sqT^iAt^o1TF!cZ$*U=EJ^$+_VMwu%Hf2isBnRb=#L;%>sDSRZ{Ek!78V$y~k&w z$(A%i(r4GgPFZ_|jw;`-1f&p)FUWl14aoVt2fal}`><#*1NN3+xSeoSVPGa}NcO8C zer*y|b`l}OluyJJRHo@w+LCSWy%FOqcHiBqXX|U8i9Qv4Od->Zv1CAqPk`VmjU+2~ zqR?kDcvGw?Sok8CP}C@ z0368b%el$z3T#iN(KaC^L_cT5>c?p9-Ffb#_dor2b|BQ!Q2WiF(5LdoLgh;tX+O@N zVno`O`1zmy_g^ZQjued}KLZ|o<6P{*cN$|w2(+5?=_1K;MQR4ez4xpb|6=PW8+uPDVAxWu-9KDC)L~^5 z_m0vxK|CBvkTrpE-A_5DgWpG|7#ZFZBhX&= zD^hymUf2L@;gd`dAVb( zV8U3%k5y$7*+dPa#L{iWX-t4v@#gWR05MAkP?n1jzMiLzuY75aH^!0(6`htOnXc%^ zRlI6N4F6@*Pj)$pN$3&c@lJhsMW!i9i&({n5~Ycr$8N6GleF4*j1{blviMOlyfKqR znC+r<<^4Ntl5+gYdVtunJYljjNyl8#N*7+NBgjF|i}@&z)qBb9!Hp$;c=2srcxY5^ zTZzB=4}S^CA0^a&oKNM;8EW6!NUQ!7CVu80?%&Cu`^Uc$-u=L0$W5HQx3nl{;_=^G z47Iirdd5kM3mZ;SlC62XDY*%oBcGsHiU-Lb_WlHf@{q zF-)a-^vWF5M)PBZHiStP!I1@FTp&uC$iY;l2^M}HsUDULrq228BS3=QnC_u*w(FcY z8;FM%SspqkFxF(!hpCmp7Hu3U9Q&#O^uv<3cr8L{8l zWF)I$bKe^yiD_r!F&lDu1y0Ir(p1R4@2^pezD`|u!i;8I?Ztr=5Q-NhU%MgHAZ$G0 zUb(?EVckOU5r%0-q-j=!K%2f?xv@41O_qWq%6f>mZz4#hI)=-qh!L}`u5KpftZ>RB zcz^ZH@c-F~HW4f3`k_lAWmz%td&Hq_ISSb}4b)nSmaHo^B)ZyT3)rvh$7vfufqe-k zg>fLEczf3Y2O}`}*4DirN)0gq9F5{u7r`RVjRO;{J8Rn`_4)B6vH!Gjb8QgN+k^|6 zNs@nTQ`U)VW+lfZXx8FGE1RBj+f7z*p=5BlbDys8!i(>DQO5TcOIB0^j*GV1;jvYE zfXJ&#axrPJH=_8F_>5+*eQiF%!s9;I{_r!l3C_yRvz(yNK$}FUF#Thb6{by(`mjd= zj$pO<;xwWh*LVdEwvu)nA!40JH#;Kci3OQyXeOt&#SfA@MWUJpa4lbN}~m z>dI#pAJa2W{cw$wk4U6ljI=@EaAd16{X<{Ngy~9r0Urv>2%o<+W(raHSupxp);p7A zzcVH(0INV$zt-b(?4zu#Yo3!EBlbl`wm5l#Fv%1pyx%FlF8F+MQ6}BqS;l)g~KQ@2usCFv%E>!FwNpcnGE{oR}ZW>PqI29nQ``&FnY`vTZhG` zp>}=SLzi#`!W}ZrwHdMDqP!G{8`5T(>fv~p%o8g?<5ij_2zXEh-dii{7Y2my(6f?a zw;uJR;0f~iu`fkgDnX*kY3~ymkCwV2QYRfesU%5!6yco&CC^?xbdhJSS+cDr)Lh$} zXrm@+u6;6Ks}A-AaT2okiHfab4t^4+$0W+yMyDhcDVo-?sRBdyr+>_~HLa1xgU|tVg09B&TufdhPra^_)-``S+KW>Z{&2!*taoQz;fC>gtZuo(!K* z6@xRUXjKTfS}YlM(v&Ui6$%};Gq-58Oyg{o(-jl;P2V)o)}4wQ7|6ww!jG*-XzN~; z45O~CfXF_<t3SY%A4!9UBLzfz-D&$x#llIp`o3bM$tZ5n3mYJn8w<#0wHc=!< zXIzx@XtcO7f*G1d9gMc@y`$iujUixKLfi(YFB7B6IF}OT5q|#v`OR4aKnrN{=bf*F zq4tvsm8bkEpOwVV983D4@cCbV&}2_VsUYdG1w>iG-dH%OblI7;GXD~ck%Fm8q`&2b za#LP;zYm2C`+J_#kMg=JH7p?N*>nY?tAZ&Dfi{tbUBtBJ&rO`RV6vhy<%r41e4FXS zIV?ehNH`@x&buC{h9ix(CmgN8mjWVf1Y5--$wb&oheXy6AL;aoYY`QUBa34_tc5nK zJQVSy`h=+`5FviHsEi7pA?h zJdLKj!&C4riKekA312k2R7E2#!oq{Jv0%$81Tyu~id2 zC>c2XNt>0C`YFQ{C7tw7Ag+9jqay8?&C!j|Wj1Yc#K+O#*=-kJ(-lyLa4BmSDG6eS zA|iGDfa-;2_vI_QD&N(?&%~-+;_i zPoY@g)zqaBFgFk^gtjqKxkWNas_e%~dmVAxR7A=O-8g&a#@Vfm&t>J4V2b3FBxBT1 zu~OkFnDBj;w`ELUL7laJA4}KVgK^@-TAQxOReHDPF%F1a`Ab?wlPM}-BICJ-Wpz=d z>6q&eE&nTnK(Uj!tZsq`k9NXVQG~~}^$sR68NwxUs=}0#JZ7dS;l$)xSSW+RHVOPK z863{dzClEpBk`5V(j)a-%=p?pJyBLq!B{N{zVjqcRBEjVO`n>%0huk>0Ui`9Jd`MV z#q^CU#0c&V+qBJ-!d0fE(I%OyP=Fi2kWAk)IL(NDN5?bskMwRQ@oHxHLZJc z?d(aJr0g|oY*~)QMao|pj>wEF6X1C!V9!-wSeqmvG#$(N<>d9Fb5Fo|s(Dw~MRz1! zbmV|R2vrst0-qmnvChXLy**2DZ-czANsY7=D&P6h+rRzM z+rOXQ{jJ~0g351G6=9_mM2{&t!a$<6w9hPLj+~(~w_#&$j73SHI20`G`7u=r8f`fBonAflULPwTB*^FZl>y_5 zh!KtiX_(D|Xik#)sViybRN5@nIxzWF9P9JvGWMX8VV`g9YJ#aAM(^ljVd-F$#88mb zP97j_Ww@frI;qE0Flax<`E`E=VNWe2|q7rXe-~!CRJ9P7+26MU5tP zsu*V}bj%kcM%+nOKT$+S?tbom!ZHm2Ih`tbT-qmCoTfzSA_{w%m{|9c^aNdbIw(lb zP_e(&A|#4T%#0?y^YThg-%Kd)q>cfPW9uI_D04lDf5%Jdq+)^QwqJ{Cv0;$%PZRoN z5y8U}t=ngL?OL<4baB}fW#h+!Ahi~8)ALy7<3JVO62(io=qcCqlF*aVZbPQih2Ni( z6bDyIzfWh#bzcf=LK2RTK~k1w?S-y}*2i?6NC-|~vM^OhDK{c53TGQT>-2SBv4ROo zJaO{5LPC>R5g1jjr#(`?1xg@r;)$=5GC`)Oq+w(^;4u;@?nfR-NzZ@#cV-O$E%2Qp zRNmB3`>{gh(-3LNP%)uW-u>-=9iL00M+ylSQ|(Jb;#(;p#7Og+-?BmlP1#E5|)kr9tM79j9L)QrfhHjmJ{16h)}Cz1#6?Gau3U%ymx|aYC{z_m1|5 zm*(U$ln+kU!{7pjNg%RQBA%#x(k3acG6gPZd{PgiOj7ds_yQ6{v`j;Sj4sto#;XYS z{qTis_33NBI#JSWk}H-dy*`UD>BY^|u3qjsJihh)$jZk|vK!$s@QP}C*MXiUX>x7# z^SWEdLATg$-O=A23=3-`76CqLpyjAt#6~?hY%3oG+GQZG-VjUrY=Vh43Nyu6D7cNK zNz^pE*A>FOlVZi}nq>-5L{t=*G1U{&drA8A4W|%I2&oU{s*f2{Y;Xd?DMjkMDEBrs z(Z`Mu8s(}_4n+|%^sz7ooh3$`WVKTuV)Wl!RdGtgGR7qSmMmNsWxvF$hi_`*fBcuFnK9h4@H3BNNl(5z=?GI91Ae@ z`3L`c5GsH06C{7W-1_H@h00SzS`{jDe)>=3_dfVtcKp=mE<8x5omW2<=^v(k6rEq- zMVZi^Y~BxC zL#FvlO=0F%A6)Nj7G1`xcSdw(S*Pad!T@j%~|e z_^_>+f_K{bB!y(<#_^GevJq#6s}eSMU3)mA{A?nxSQ8PBXeL`t^vQcIBc*tmg$XZe zlK9{3HGZ+sY$FV@gjIHFLOC|Yk=-P#X!=eHdd?zNKa+S=l#fCaEsvp91WS?PLR%TF zZo2!b&m=G@Di^ACha8l$~;k- z;8&rCMb|(4xCs`xinY9uDIW@&dhF>QGF14r_Bm$8MSM)0vK)J~ii)rZt=2k(I6C9n zNer|d;7!a*Mez9ArkvPri6_~lWm0ri)9t-lc7-;TS$nxv2Y3U4wjhC%SKf@AR{jF9 zwod}y&ikg&tWC+fcfH__74SFk1~QlgYQ!}$BC)?DMm3$Fd`Z9?M#E(@0NyrtPXpez z0+70V0`Ru=Xe48jM#w~b*{%j5 z6U)wv?t*$4P*CRpGl{m29*QSUqItl{KLWg&|Kz?0yvdXy4v}GgZ92HfQEYw`fig*- z4~2viaDAoI{e0IV!shP_;i3Yj1H8$!M!hMT2(o03FkN`xECMPCgii7Kov&r60*H#| zA8u2w-E_+can&~F&KL9G=^Tr&KXen6Y3CD}i0O>2f%XrA-M_c>4~fT|_OaSQp>So_ zH-xj}$_(f13t}~dbWs`I8Sf|Q%*v9q3s|M5?ErYwM)ZqYG0*!1hWG+bXFI^#xu<=e z`n;uc&ZWQ*MXBbO6EB|j05N)82I4H&<@5w*S+OU<>d(jIdhUQY_Wdvo#EVl#mkZxx z{WAfXL1aaMU`eOF&?%>0db{{a++R|dHadRQ8E7*utUYA%$|_+JSSr~da1KtL#N+wV z`+p-s<+}v>_BP3%PnG!j`oT#1EdaZGH-5PPfVA20?n|4J&`jH=D$f?NV)12t|Lhfj zZ$2%_B3jHK`<&~dmrbb9NXt&2_Ps!`%|~8D*lv$svL<`TIB7ov%L9qrCjdu`Nd;3G ziVy?f$X?K*%EzzdN#tUteNQn&u_?LzOtPmetG;}YFNlICG8;NgY~YEXrLnVE1M;#K zssn9S+mNHYkSAV6a0E)haduS1)N0#Vvz_k`7Bu? zqXEDNUph|VX$+#sQx#Gm#y1FnSFA!nhE z)s2zU3j-U5)OV3G@xon;dTFmXUfPs1F6L(qAavSqher798=&-`O#ZxWH2INGnIp$O zQ33F+H7I}Z|Ixcrz(z4zEj~|XN>gpme5K>j;zg9i=f3g@8c{|vrwJm^Yv{KIpS6HmPbv*5`x>ElqGv?tlE zxxEv2m?$3%r(R0Pks+rn?Zts9N?fsrLTH?mAj z;)O(uhpU)$(T`l+oqubqpbUdt-t=|ve6wh=6b}X|Ahc-l=B_jQWj)9u5v0aJEi+uq zuy@ww!>I{c^KII*%LNdwr{HWTsZ&B}z4DT}sL2p`8H`YSaIZ)h zOrmD!9HuV3Z9ELoVksL82lsIVF{&o@gd8MVd~gv`pYWmtnJxtF^m+foCQSG~<9+-1 zqqq9ezYV4a5i@^2Hj(48U`}8r0np7;7z!EwEJmQcevIcIMTRAMu7>hLmJCWdD2t%W zVrvd8~dd ziWaV`WO@>{%ya8dxCzGsPBaSyOO(}X66!R?iedD((zXo$O6F<@s~?5DRRK!UR7<06 zmi3Uunm5t|M7Sl};3c&)A1|vkEe8=Y=2O9Yh8Fmq)0QaH?aB$v%5f70_T+6={paH# zWER_iBv$b~XenqOONte;!A||$WPVFA*5+fGmhhZJ0VE}bG~Uv?!oWz|5`1}~@(o`J zq4K8DnF!?AHCl*m|LS^Bqv>qVxP@cPqR{MWgPS|!|$IDyhDhRY$riqfKe_+)0 z)XqzT+2{%=Ngh1o@hKW6L*|P>;p7JKWBUW1yt2L?3Xv**?2L2|`+rR3vT_?Mo@`LJ zTia76hzer&jZg@LvL<^fjIura?X~SlE&oqE^F{yS>bL>x$GtvL*Exc@W}zT~OZ9TN zYQe!G%hx#SrI)2Bh@2=w5443i2%cJTM^p5jg^C}geYt{-d5wFu_bms+NNKn z@XAqQo<)lU@qW_eg?I*va8WqA4-_wCZS4CtWH0i&7aA(QuW>)d;y^!nPVmTNN$x}> zfJz5y^OXbrBNQ)XoQPcaQ;Mh@6p0O2tY>DyF^do5vxuKWfpZB{m05gD?Ib@7lMn6x zG+p%~CE;sL+^833zQ5j%g5rIwjpqLw|3B~d-WO%DM6R$f`KZ^A+nyPHR^JOfKb#OT z0c8Jw`i&UzRx0g5nwt+El>^%79G?~ara60#ku}Hf2x%>5k91|&A^q6U_^9VLng5Nj=IdjfRV0veWGEXu| z&w|;X!Ed(SY15WP>|{xlMhFTbFoHBH7fex@JY_f}$T`s_G{-zYzLvF+ZwlsfX~peW zEi-F?HxMeHIHLS%gvvKPAymGHLZyl^mi`p;l)ywwuv@hESPkivMEZa%rc4oX{2G+n zCGlghH?|?O<R_Y8bnGIGcCJ)k|YMW4yrO8A*S07 zoH#&MWvFcLx;=bRbiTwlIYFT~$-AC8kALZ?|d~n)p zldg-PY2PPMG<8GqVunsJlm;mdRKE)2ym?rMcv8k!JGy>Ja`INOvxpZL6I|oWpR4ct zB}_zUoQ0<*Fy+c1_M#51k)L+oy|w_=>>w3RZwz`xzLH^xEy6#oME- zG1;zd&_P1r)SSy{$|YApB2@MQPPCQLy>V5T6f$m+FjRO!&@Mhq=-i8`-GxYdJtIY= zFh`q~$oj{c(J#IKixU%0Te9?s6=9@QNiUjcS-VGtQ;j0HeNLOlQdS-pBae?-R7g>> zlF0GeJ%t{4@O6y>;Q~cY>v+4d)eTE-d48}9*Oj9$bOl7i>;$_4(fj;-1<0+CK&#PZ z!rdB63?+pqG9Et1Rn&!>?Rc=82JcF{I>he1fz{B?O6Xe$t!f9zUa;idosF<<%_BY* z>*!HX)?PY%4$inJDl*8&*gO17vFeO4JAXyuv@$t~S6+bE8C11wPp;C#zBkBb5g=+F zRikVYUr7|xXhd?wJSOuAe-;UnYzg8I$%B~4SmQKdAxWMHaWQ|MlM20`O=hkh^G>+x zDqIV_|DpX~Ch@bB_kGP|(PiqxPRnZ39`C0Q?2+_l5|>WbiW9(mXj4u9kY~t zvRkWMIu0Np{nNU&Hg2eG#f5U=k%SD*DQgjGb=EF0=?qKfo+{*I*LhAuV=^h(EKt4Z zNwsb5zVYK_S-Yo?y+46sLjn)H$O|&z<}q07O{$g|0y$xj&a<0N>?G1_TLsIl`C6=| z1uLD>i4{!y2_ltqkP+17;#h48LHJ^k=ThQ1PMuh*ZOXF-5TWvipbBOnD z3UsR{iy0^p?soFp$_x`kij_1W>J@~YQbd7fapbre~L{~P=-ab7IXSuO@8Ah+Vvn<)($nwxNTR5&b|u~DnSYgNr0Si z5a5Bu#0k27bYGlAj4+N^Hqz-MsUOzClfBTcm}s7z57hI|r^%nKdsKK3jM8VqlEDl% zL>7}^loe1?N+;oJ_?(ptO7n4rUmzJ~-y_2`Gqw@`PU6W|eVJf9cu^t6LB_g(DW597 zi6#topsr$Fq5che8R#A1N~!DOx$^W*67uVWl?jDUecw%~HVwJv5eB zHw}{)EjJ9;exC$iice$UN0}!v6mhZ^vilt5``R>U`Mlj;7%;j9(#Gd7q^Y99FMqBzyY`SvUmz5T|%_QboGM(7@ z!!C3YAX^dsCtE$LAk1!)Ibs6@c4{5Ms$vq1dQWC|Fw5xTn)5rhtyT9l4_2 zu|OC^0^{%tD?*k{#z4V3NbtW+6*7tpp)w(kl^|g9v3DS3_9r0eV`H*YpV07eqxAW( zfN(ky`Yc9pRdVo6t*&p(JjG%{?S^1fnQ5OTbH9k4dgg^#QCimvRm6*mO{`&&LDg@gq(-y)`NnwvB zR4}oT| zQ8N)TWTj+u`?PTyqhV0lmE4oI%DFYlt-;-3vZbod;z|!^L$04Mp4ClHNtCMq3Ykih zBiBC=DJ03Vx2IsVN;+d6(mPfF2JwM&oH#prAtvpQk%>V>gfr_l;M*f2B=a=1CCNIq}*BP!ksTSteOWnQ{01 z4?7-8hG!+p#3e|pbo&`$Fm4kO6>l2Bmfw#~S)#IQ4x>mSO?P14?4{ID(pFWbUh&YU z!@{ugv4-iL(1;IGqA4PWEETd@CV8II02?rkoWw|OQ<&|Y2$7yw#E+|re1pQ>+C_wU z$+q5bUWBERWTHwUwVLKLxhm&AWuZT1o^Ff~Nu3I-sh<~3G}TstzA?$Dl_54s5e^ln zCRuzc^XDf78sgfkP4d86;qkeh1I`KbWJSs{F%JWlf|K{csSVE^e1k}tbkagXEd&W~ z!;-=*5oI;sTJlGXwCc}{c45Apn?He2`NmH}r+r&0ErrVW;)nZ>RG`%7z~}>|PiD%z z4ys2kRLoF&^d*e7Nc+%VLSKp*YjHa>)^hRz;%pN1`e+trn$@7dIu1&MFQT11h#0y5Rj zQbK0+$qvBugfGCzh#f|u9DzP+7nQD!EUO$X87yM9<$;8b`y}nC^-@zjcOBt2f>z4{ zLLR&-S3DQ&5pmP3F(0<~kHm>W-GZ2B&8M=xw>IP?YoLfyxUlu9Nf0Et8Ef|v9o`S6 zhY%!L`g}43PrY)XVqHPzlkiE2nqj+@ff{RReBHZ$g|M^E7osh|*H0L0d4hibLupH1 zL`uQRh0~FIP4p#hWrwzz8nCN(a!K>RBc$uWic0VnKRP5|H`HI3}+Um+~$jcKhUEJ!4aq zV;3p$8C7x!`}a$B?|M*+ZvVx?=serhnMz*+z$qGUFVK?c7Am3C*;BFb2j5V>7ZTPIQ{?;p!&{ z!-SlZ4tGD6^2ww{L2z~8og^{AX5pbExla=a@RH0TBSD;aocO+rKJ)&iTm3BejhMIu zCW5X%^r?lw*|LZeKF%UoK9qR0uawj?Gg&&xe?Js8ReFBt?=g0YOiz*+c&EL`jkAz~ zxlW7H5A;ZIUOD`YJ|;$(weP1;e9+u_crfFwnY-C7g-IX(Z9P%i48E0;&HXY-D<{&oq>O| zRDUG72&=#>6ls6Y(k35pQMfe7qlH-n3Q68Yj;%ZfTgZXHHu10|xhQ2o!pmrv_fhZ^ z3{(UyxIJ_9zFpJ`mn*O%NE?+|zT2VnZ>*~>%DJxKYqU#n!lG2#3E;P{C86@pAXL8N zkx+qOgmAaOs4*LipS|oN%o+ZaMU1?(1W-a}Pkcej?D7^#oP`^?9s$#jkMr>$UYI^Q zrdWAx=GvAU7vdiMDpB@x5#ufcydAq4sXaci#4=UkC@rl7xcp1}<461Uh-cv4`O3XP78jYgbQ*!M%aXp*j%JhUXIy~mA{taOTaC+I0Y0U+eVYh*x5YS}v$iH}k4odXp*F^&%v*HGZE-afb1QOp9jEOVB{1c!ehxO zn7i_h7+VeP?z;x$4qbofrvYhbIxY%yJKWnzoW2cD^5Exv|HE!#F%3+X&gd$lK_@CE zK(Gd)KxyJbRz2a06P4vY5$l;Og2%+f`^#FV4uU5@kZ8iEYE&Ax3CeAOAPX=LTgT90 zC_Wtegjm=ZrSFIIS)Yu+ILpo-u7>uqZo(8NV5P&Dvaf%7ifwp;cpUdy>)_GkC~L{d zR-8_-T|kL<-Fmd_AFqIlh?%*p7pnzjOg=et;k6G&|^}N@`-F#Mk0v9MO%@%3Tjwi z_*f<});7ew^#r+@mS0cswiGe_(5YOp0-|fV7}Ulale_qp0B~%#$JNhDD!EDfqnIIB z2V=L4M$5@6yj}ekBM&+zKUv(^S3gxJDz@eUs|7ELNqT;aouZZHq$Cd2)8J2`fT4J4LWhP|M46KcmV2=rq-zKrJWKd$HBoD}uK;nTQkzgKzf*@}p zAOQ+576=3g1Sk)Q-~}Nhz`?zDT~^hqb*ojik7bKEj$_3HoY;x6Pxm>e&!x|OSFO5i zcelIU@ul1DD$WMU zDyle8vot1Jt6>^Q{;p)gZpn0ufqc~qEf;t#LpH&zn%Y{voCA&r4flv2Q$Rw=wG*pR;odg{E6PQzoF{NW zj9xjMm)wMq`Et?T98!lJ&QS-J1VVTOeoVDM$W#V3GUfc7MT(qHMX3Bs1EKPV|G){A z@X%N&Ue-H}^#7C<5H}@5oJhZqikF8~)L`WUpGqT1AWTlcO>syH$;74=x@;?L$sp%} za2qHij&@}xrhGu|=ZV2{bf1T0&;(g@GtB~x4{_q91+(n;#G8UAqgHxj z=h#!!?~3MfL)a)kLH1 zdtI*dAk^SMB2ND5?60Fc<%4H@VzenrI5k*W zq(VMDX`l7GeXy2jslO*``sG%mz7QwrQJ*+lRx1K4^Ex51G!CXIn6{`W5zhuZEY^_x zr1!OkF#bF}3G~>G*G3R2=jI<#qOGKcc=hv?KSx$n?ySG^!Zap5vPdze9+4WD!`UDS zM8EIAQ!pU+C7GoH^3?vWiB@o);^>8Ld}@<2N0Ij^yd9XfIgzH%`E`xALri;`td!SD z{an1j1WFev?vEn&|c`;$78*-Z&ryY zYbOYu-%p|PUH>pbCGOR-!Qw@c2IY3XJ+5wX(9TQ7#%pz-9#I$801mi(#3gYq~B zwZ%9opzT5%9dU!7MB9`P`$?Zbuo@tS%QR*0LdRVYN#TGH`C_7lGa5yOnhYXuOPpAH zWtfoYAa{2>wxkb=rLgY=cDa~xm2h~a$~g|ED_SvrY^xu<0I&wqCpt!#6jw&v&hym* zrG9izTSSPpA_p;}wM44b$TF7^O1Yt@s&?-10Y?D|A4j$CI8eo-whh$QN zTdV7#C%SS{&rR+~dSnJyB&ImR9O?J#dfuVBN=h_oiL@??=QdI4^$QVYSf?P&~W zLv;-Bt+ZUAi4sDJDn}75&A`XvDN+oEOH1bPEVR>-)mN@21@whc>0r{w6Jc_4-MiRIZ0-jeg?UX_`i-vpk9O8mh>;+Mf`UyYpn365C;_6@^y+VdqIOlx%mEv6e{2K|AkQb?hiFl$&j}PW|%E}l%Zb*;I}=z zUy=CgSHWZi0_3564Qn62M}CzD{lUbAx4HRJ;|FRO9ElC0wrI~ zSyoMs7EgT<$%_}|Tj6BjS0Phu5FzuFUqwHx|<%tWG4z?@n=1Fou^@vJRi?Sc28LV;H09Wc)IW+*BJMG7gpYp5d z)Wkq;@F?{BDyP=tIhrqn{>VZ zWl2+;CHYkr8Y`1b@>>3U!JlIxhA6DziQ-s*#CGq$vpuwrH5|`BmgXPW>t* zPHF_%j^TABztQxMKOXp1POg-{m5!{?(1}>VR0QR=L8dNIOto56h>6NUUEd&asyGeZ z5NwqF1@RKd-r&Ri1GU$TBv;Y@4ryVB0ze4GDoG6&Y!3l{fi#(t$Any zgr_KR&%7#{6xy=_!XzRCDy#13dmg1-iA;Qvj9dG$CZ& z37C)|(G!Sp>tqEKfjgEbOPZLv4U>KuVHD+yiHegE9L!aHhqyg?8T1y8HoeBpATJIm ze^ib86Z5d#8CHv)w(a&I5GB)D+9dY zAj_*C#gVUX)u-aAfmRbjB0SmwE?@EJl-h`dS`Q>bn0Oj#O#>0rj=MG{EPFCPo z@#p4cQNk^!hR*v~ex3m7YKXN_Obz$ofqOU_1Rq40GzC{7WN{{vi#ZmY6)yruFFNI1 zk$UN$3q8N67@1Hxp{#-;7%USLC?%09309r{%SCuSKW?OM=0c;&)&pc4iu)r}J|fZM z!b=hJtn~S)u@+R?2PR4qC4ju}Q|hWmei;vH#2M=!6de|U^3dw0qqH372}(TV-1mjX zlC`>8l0VIX(e^OjLQcGjjg4l`8(keqis;}{Tafb~w-;k3Q*9u>3Y^;Idu7My#3&W9 zXQcaiAo2lb10YCLb%D5X0%%HH6*M3dbr#02Kyf?lTYCgXB{W`XABJNSn}{MmKvxH@ zL!aAv2)kn?)53=`!}}&!0x=S_@_o@a(DDsc@j-XrHyU${Le2Da@C*c^a+2i1{k7dy z4$=iHE@SP6h@NVmrRhpsqbb?Y=DfyHcpR7L5f25XNR0Tk2oHwPfyt6rJnpQ&(ov?z zIrC6%G_~UB>u5EG=cFY+2Mn+cb?GDmu<@kCD=>{XDU`>A>%U=-HF4MTJkF~ey6jk&Ak$ppoW z2}cq)HPu*(t9A5@N0e~+T`;ZMm=8hYY0nKsZ1MQg}U`jo{erGnVI;wqszF<}F^ zTe+$bk;45No>xPJ#E&9Ww91`sxRPoqX6Wa}QQ%Gx9K;lfjjKWF7g5oIgCMPU%45LD zCk1M#laExm=EyV%Pl}ciuB^x{%9veEw6foa_XJ`Eegnin)1cFZdwjxaAC=B1{IE8{ zY#5ke;c;Mi7}gDqdLcyoP)ddSZeUn#xMPPPYU&}OsIf9ldN8$HCB*8a1@{%9QGF&i z<$Yc4kmp4OhD<%;xlKQmno9|v{Qnl8vwutZp69?zu}KUB4F3Ib#O#Y(Oa7Ngf-6!y zTYvZGPkP-%aj@RuwVGd>Q5s^TA>u9kEP+!(r?n!X9VCcQr-0{EL&+ViCh@#-1U2-; z_~FiFJRMtXd55UE30!U6$rC_cg-mIw}>GH`1g%B#(5+s7ZdF=$+ z^kU2LfW4iP`XS$E*-)5J`My8MLgo9jIB9<9U5O_P4qv7pC?HIP&-b$a$-<>2<7}bQ zN>5PPg#qq%P~R_EZm?6NJy};pk_>A0D^JBASn3B6<+@js-k*a@y^rhBYAupgP{a8? zWn6ZtP03y+DuHOXTI4jL5#2=mDHzvrPW|{w87l6`fIxws+`8JKuc0;^!pG7;272T6 zPDI`!w|t^ClyAL_dT?77J{o&En)a`8khnb)~~XC{nZ;kCVg$12Szo=k*PV zEBV=&&glCb*@hrt#>%;^tURTK*sp@VAcMa>=?M<3b5Q))vZrNjP&iO|z4CKzOo*)O z-yQ;|mkfdr2L2}E@Hko1IO>?<)glsQ5aLLzCBf!HglKALK?ylEl^dbC2TmLS;mV|w zcquAeM3D3gL*+5B>LIaGjI(ny%4+-Zf+ndaCQPt)PIK!3N+eh!l^G_!;F@wH{H7Nk zNDwMVRyTsAq!Mh8YfoAtPm4m|WCC5*KxNHyX~*>=@tpwjNgY7w_({O=ldlmMxWHL7 z;)9F?hYK`yfej%XZ4}v|ZOSmsl1~L&1aQTI*dfrkoQ<{U&Xd*8_umVl!d*X@oB)X* z_RO17(mzy6SiCEe{6P~k;4+SciF#6`5joN{B^+F;NI}x4Oj~4{0xn7vygt@NFbO$D z3)eq5vgeTsnov?01b$477>Ngy2R*Z7RO) z?fx5Kp(KeKM@sWVLYoKre!sS>UN2Y8e${U$=Cp@C)>*$GFp^0&o%cF3Y7G56n91+Td#v{ zvgyT`i*a~_~nyv&&tun<{+mxjyrnmk9Q*2+( zorK~?G2y)tD)6FUl2XM=osI-*Om6oq=@VtLl0c&sI9!q`Nsv`f_O77gN0UE${SKg# z0s`ob?yKSklM^W`4Ey%6_5cYUSQV#KTzi4FDdbK5s7Mew0=s#%B#ZgBtbr!TuV3~A zh{OJGic#NYbVunlo-ET7f&>Mmg~TcD1X6^^0Fpp$zg&V4IieQjsm1F&nQz01)tnb` zQp{rL?b+y630}-k#r|ejy=LWxqRJ2{k;b_o(yA|IZXl=yt! zDnj#Opk>1!KyKK<^Fdi@wWqggk~I&?t%0y;bgm_XFxN^$vW?v(X~Qcdxms4R7lFSV ze@<2f4U-#lbB)$z2435%4<>N;rat6YMZ+c&e77zU~n8x(DEa!&bXNoRXS_YYW zqLY$x9}Q~E~%i)6qptK5~nhOHXohAuEH4a5do zkBb;K(TeE68o42eTbdh4vIl+>QGp9A9QSm(a?%$eb>(wi);tP*n_cw`vRIYlSXwRu zDQ@iXc}$?i0^nr2g5(e5D_WYQ6hVRH(9y=YTVSCO{vz?(XJVZ`Sp9JA3*N_+#9`wg zY1S}U`&c>QrZUSWN~XOZLdBtIkVHuoQmx~7@}9+xJ(4~L{REH#-z3hQAVg%^!UDu$ zT_jD(iE#Na)?%Hbpf^tLAkHiVK8ue11Q_O^`|!B@_mH6-T672pABEn^S8^)^bX!S_o@1>pBI#88j|{ivqt2jI$C|b_8%^ zj6Nofnw%5Ed3$P87ft#Qy*5xRxtG|ZgdZ+I8mY`cDXAk6BuA9XaftkGrRQfxX~P*^ zFfEMxq>~dlJ|!+m#W8MPk8zH~NupBLFlbQ5w7Qk#PojynqAFmp#kt}b5IDOC#mA1O z@|p;u_G3+=%Ed1SGI{|HIR`nxXMm*ws{)ax8g;4__!xfD#WceBmT`E7-W$Ma?Dae$)Nnwb$YUQ zA$v9}8-&}r2pC!GXa%pV?gB28A@#DH*!DSP#w7{a)v{b1QyQvO}{j9OM`5oJtO zJVAj#GxW0WG*cFh5eHzQATc_9;fzdGAXHj0lEHAMQxjV0sO$cOnn)MctAQ84vQQX_ zzp&De`K$x&tNg^;J z#6y{0pBw+Ht2_i;5Ul}boMfB9KA!!89jZJLa8PRw#DS6cI>nW3yfyV`FrX*cK zCSq*8;|4Ie#M71Yet!|xGdbd|wB9rG3H8bxM^O2RrdAp+2HAFy4oWf!OXrw~fm&;% zTTjttc&VZQ+fXRd4%Oa zrYB0M-LE8C)VyGF(unD{SQ+>}Xiz@1B&-t)hCjS#tDlO=e_RqiXiE-KQV4)s@u#3! zS-@}^pAVFNkZDWxtkj4y);NVmD+XHjuJ{8Z(*`skqp)ydNZ>NkdU&B;6+CWzY$;rt zR8azBE&EZxOaUXMp%Ow+YoT6SQnRY0d-dE`)nMC0=*zfIMt-eKN5D&ge+7HZ246#6 zI3;~Nf6uJ{eStUt`hqzzLs*>I6eSW_w)cXR*j}O<_1+X^W{d+Qeqf|!(;N2B8V|(i zcF>>-$Xi3LtN9?*!q~U6)sI{D`+)FqG2~$i1HvtJ{BWZzjJfJx5v;y8AY;TWCjm9Z zuGmOxYaYhq;{=7P;RKWA>PB046Ls+b{uRoaNTwnpLb5NWoZv;EK#XLukmM}{gp+AU z$nP&VRb+JU7m<+#MiC%aMPOu6lEsOWucz|3SLLRHB;V&;gv$AKc^~&HZ_m2txCj^A z;(7hNr^l;;sS2O+_~&(UqT)#eRI|QTVUr$_??Z$~BWt9x_BgMr8mx#KF~MS0l!(_- zCNGc3CqrMuGz7^bPp!|jKH#PY$phUt|9h|oQtk~UfWrCHAUp`vp7Hk7L`GTT3S4gigRM+b zyi83vxmRAtBwV;oLwk6ZeIsp}(=nzTckJRwlZI0=+w!z{v13|{35}3xgVMb>)$2lj zlqAVXPl?J_gbh|bdYl!}(h98>jI1(om#H@><;=)J$_KUqOiUnF%6aOzf1w+D)09om zcY^pb)~S#)3}RHDca$w-TS zAMvN;Uy81V_AOrAqOo!B>8>BFf0D3GqLdS6PYb3pjSy*_eC#N4>?ML6W#0zmy=Rev zKkCE`Na4Ub6Tn$MkQ=S%_IPq06Dogl**D7`Syi}t zQKp+7vKj0YIM(%hryF&*mnZq$t|AoHCh((3rZPa?5(yIsmPD26abbKFyx%T}n=-eZ zGazr^E-3JcRx&W)0qB$lYa1{Y$^lmnjy<1?OiLh4AXFSpQj{67>Jw&p{WCdK`|FGLXJsfQOaQ6?cp zcvOLrg#o^|k+)GqLJ=l%e|NeOvC=*NR^9Vtd09Sg&*ZVY&pWxr{B~9E=hs=F&<4eFQ+82nhLoGr?f(T`c=ly=6mi#P!ePdIUHTh7u&VWtNr#ISK&4gR_qiEAL36^xm6k=Qb zxKm5@=xXt-UuM{zS>h*%=ymKtSra=2apjeja7LOE_6t2BOw1Ps?7cqz(op(kRWo3( zI5N)rnN3B?gl1_xBu^7qjVqIXrIF(cL*B~zXJ#o!Om=Y`bF|he$Db2hS0kp3V_%-U zq`?XZ;snzgRFwo;3zfvBAS96L^deTkzygidQ#2XJ{U|jmpp|J+Kc>*m5j~E_ zcA;$XV@srhAEus4D%~wp6l^C-x(9tf8>7S@nve5dt$u*d$6HTRl}4r}5jR5QW93r} zu7t`@GF@po{Ud^>tb_KeC`m{F;q$#-p9{m`OHWV>NDbCG_=61!36td3BO!(Tq19=t zW130{*=-#`1soV{eVMpiDMBAHG-TxCP(>Gi3r$k8dZkqm5tENedA6&5{HqlBn8EGH*QWC9p6bdC*Ry{8XuCO>| zKR47KD_$teO)=D#5-Jg`t%nMi^85Jtm9DI#x~j zgxlmv$?97D1VKcGTV0hkj}x)svpA4xNd8(7p^*heem@IRx{@c5h$kUL!Abug#BjueU;J;z?@p4+c=2iopuoxIsS zSKjRYX76;r<4c+1;QwJ$MbcSaD>?ah^8^OMtUas0m%J)!MY!bkQdw7>*Z40;y70gF zM+TOIsaC1C!0xY^=R%M=GVeAN(@r#fQ3StCJvg%5>Qu%)@79LGcW2C8G0~DlXei~D z3K5m1Lp~Ho!j@Z=9pUt0!1Yw$;L&^xp@I|;ULz|^5pBAXdbC@M6Z@q#Cg=M!gv}4s zt>wrxkBbjK@UE0&4PCe>a(`iF+eod;abYoJ1G!x(ONA%6EqUnFhXRp;>%B;~3QYI)^@l#ru~=!PdI zR9=Ww56(?Vd@4!OKS;%@Z)Lwy-2+9HOMl;eTKzal`6Myay3ADpK7Y>&3elk4?hm?r zWSUZ@A^^7K{vS+H#P<@ZJ=sc7o>X{ znW$g_GZZIIJSvDjw$$y@0-G`Facw91xa^+C^S8U_ zz#HB3;kE9$-3f*L7rWO@CmY_|zvXF@~mGNg+x?U=imou9XVd{cOiA1ulK=7$R#DIsQX7=k|DX1fYbR-INgNZ3kNU^R}+U&xj&^UIq zOKVv6G+E)P3g046TWFG^$4R=6o0(A-DIi|sB!XmOa_xv9uFdjH2p3=~W55$}qbXe|*`47D7P?P(OkE zJoThh)ff(~#L0@7E>)xiq<1DXt&wR?qfswH6i@mEg;?=mbcgJEp#7ubk+Bwns^+$2 zDj`&M%8^0dyi8XRLk1)ctDk22G@VwR>$7WPsfZ5-Q<8Qt7KLX;k@#pMB?E0DY<{5k z+qvQKxx2%Ycmen+$w9286hR!sj9aGA!qh4vMB|c35Ybg#P-85yAJ(@$guX)FgqxzV z&(nUoC(4ur##s-fIbX>Z)(Qxq*Md67M5g*myi80&_K~cv^j5^mGOt%etSq|c@a*j} zrEvSNbkFG*y9u+uUtDm{r{%M7v&RUr+A4f=ZpH%`2%mto+W4RC-Ci|0pB!M zED4|@Ha=3DjGZKez(PSh*^9u5`-m!ES`QF}2?WQUO(?*S$szvL(hAN~BE36?zC z@)%=DF1(Dn_5}R4hwmRWN=|Im6G@;T_NA+zW9#fm0~dB#EeW{C$%G{yS!*(r3Zbwu z7Hp@6TgK|9ol-?OAZ@cgI$zPwCx(9ZCq|^z7u=k9D1g1mi`J7TCGu{UrX>x3UZ*No z)~$hq$*f;E=qc@kw>TJi^`Q`d0meJ5e3nL`4YbCIa%Bh6g8R3p0LR^^2ZmvAk;(zH_~9ev#cT{Pfk+zwv~xWTIU1Z+uify z_3k*!GW1UfBNIKlax4Fa5pS?b$oOvVG-q?`_}v`ui#XvLIlg!J-5rg5SsY z;A4D0K8LqMLBb*gUmO11T|bk54nB`*4gRg4`|>xoKl`cQ*zSMgv)ljt?_6#F)DOSj zy`G=%UYjp<&*#_5Dk-iWmx)UwJ{a8c)WsvcBqrUG#yO`(=0`@U1#m7B9oG#=ya9bk z)c>Pj2lD@{dRGbr?~xg2F%4;%@Jk#VB)}p?mNlxp9!y)#E%gK8v$Lv!){ijN7C+63 z$g^uC-)^aJ)25G@Ffwp!j~1!>dZIKSTQQ;`d~IOME=jdEnuZ&1L&TG5^#Fsq0} z%YKwVA&PWjRB{z8M@*!Z+mTIItOH1@Tn_3)r9C$LLEuh0cq@;r_9YF0ZNMrCdQk!qX<@Q0-WF*>M(Z&kZviVHNdxt!GMK3BJ??i9 z?8`3`V7UBmnOthePiCv=ROZl(w)i6??m>W3Jv4-Vq!!AcMp=uD!5Etq@MEhUjPjy% zHB{J}f!w&`$B_c}3JK~*ke$|r%d})_oRk2k`H5AMV|3|H$Uw_o7+3+7s{^AqHf*NN zVut&9`0AuPa6q{DIhoz$;1q~Vt5-&{lTHgD^Kbf7ndOZUFIRn@14hv>LrhNcx~5sxiHXmmWLbqsT-8ZQ z6!UA!UXqiyyXV+z-D~N^?H_vh(e1zSqi<~g`=9^C?T=ml+V+$0eXS=LSR}AW8H$53 z!2w|~6cb}pli_sa!w8Y#`}nur^|&lz`2Pj(|MoY(wSDoI-`gH`;^hba@6Gm4EMM+k z>o0V#!B@JI)mz>3;-XAeTBMX@9h7fg0CQ+_4ns^nH8&?DhR%(p0-zpxfshJnsCC&3 zAdXwB)47>i9l_xOLHQiP_l7{ec5P^V#_=nw=k!L~xIJje#PLa#1gg(nizp}RuX4l* zVv~3jUWz9%uTvR9?BliA(EFSUYVg{Zazk`;B`{ZLN`gW{rcFmWhF}t_bX#Ed=T>}* zK!8qVX4kzwGQH4Z;M0$WPsoc{L2OxlgqN}& zGLeGgyQgA85X$4!Ch@Jrl#3vd^Ap|=#7K!EUa$#JK_gLQFu)=)T8f?FpkGc{xndgw zzuhM@Emk~H%(P{C@sW2G>IOW1!o&q>paU3a1>8odpD1uQCk@I0?&Ey|wb7a<5$gmX zIQ0BPX+?HIy45yi`Q^9bZdT)L7CET9KC+$zN8_;42P8tJ1ycW*z&lvwfE*~ww_!B$ z#2nq}$owe@LPbOgKBue{_))~~q8WYamcVGzYc79d?Z$%2&tuARB_LiDKcg1Vxpiik zZ-t_Q5Dzn$XywXdF1;DlYHCK>tDajQ$h7U+7!}Rps=i&q5GukX3zem;a+cKyn@+1x ziL-aQzujxa$of48AKU)C&3jID{r)XWS8VYh6TCK-qHH zA*FdVf-DsbVDESkl-G6rnD5t~5<7*=;4M0*PH&Y`oA1-eTQ%8Y!l;ZCYFt*|*Y(q2 zMOp0xiYdGK!1&Is=v;j>w#AVo=C-J z99gxC!r~5$%@X87yb<97uckZfCuP0T+c)adykBNo!R6zvPEiP}?`gFI_6m%&Q5YwU zm~tUT5RYnQn&KbU!a_%Wlkzh~sBq7Z67}{j2n8$xMARk92a8C;$ZP*XRb(qWJw%o9 z7LYeLvAD7yfOoVt8NCY=TJazYFHUb{>J#lJHD-Kdz7!M_!lUA$u+a-d5jn(@(XiYO zO0~2B^n_YN@iS-kBK9&xY2<~;1luZpHdYR%MT0h$^%N(B;Ap8Wxr}gW@2qAzI*{Rj zmsZS7sbywyI9)lt=|SEaxe~;>$BWm+ubz%rHWWifoRWKfa6<~BG{&xJwUa$2c|wvS z#;Ynu^2fdtCvkNpw=6*4?4FM=Z`%jYZ~x4XzOnsZU;1(1l|sX2Mdrf z0Wn;=jID)+B4+r#V*-Nzt;5w53n`w`3BlIQG+PEi`d=eOi-al>}(bBe5=82~N~ zjJH_zw3Im0PAIH}mKI+QGC@I4l}=l9l5(R0#!)Ix>9lL|eNpdL^@d&dSw;+3q^Tzt z5;nTly;3tRUgxFCVo61XGvg~Up*GI@y+4VB4yf2VEsh)C`jSAo!lypP^ECzBLZ zz_ehi$oUC;FL!9kRo)B$m*4DLwG7~HLHsG`{HfvvQ#mJfZRdUvna08W?FskfZ~PBr{6CrC2h=h}*YzNK9M6GYPutspG3iBQcF1W2!Qt z@<4c8kOCsO4vb9PREa)@AQ*j}q|lSkD@IvBZ_G-eCd@|sC_pbG>eiC6D~MO6MCW8O zqGQb&IniZu(wtoNjJb)3j0xC#cuS_%g#lzf*Qh6Ar+DHT;7X@mSieuZv=MGT0Km)|0HxJ!h^3Lew*)!Y2KpF+Si2F6&Kq@=as^NT21lezYk2%W@dsUDN- zGBK&s6XA<2>n$$x-}3cNjK8$~-oqERKk&CNw?Dr5_3h_>`x{RQhFz}TQshQesLLK+iC!^a$3D-HiYcCD@W=eY;J(ETkgt8Ycjwn5-= zr4B$6Ii3J;UMRMR8YhYrJ3#o(q+$BJkJm?0B33|!GQ6f{>oef;Z>(YYtY27&*m5FI zOCrAt-hyK6Wb)@J+U!^CN4e2kT$`5)X#8H;rdCAQYoJvUtucYXT~X7zh<`_`R)`Hp zrgtwXpWftCu=;2~57M@b>Wkt@gYh0~8@YgK=KXa|Sdd?Z(m$!U+SwTMM4I3OuX`xr zi0=*JW5J5tp8&aFtDhjE1s!Xcsua;Ot>Pm}(4ob|L@qpw$(HaFn4kcokK?|I6SWT5 zMX-Y3j;-((a8Zbsq`a<;H76e#PCrh}pArY&6_oVq%IHvN?E*(F=gIpbR4@g}>z`6A zNa%bRX@Sv?Fwx2l6PN~u+`Q@$e+tuS5nGPh@gu-E8Aatu3j|3k`R-QNJE9ULUWF-1 zkd7a$c8d8(u=((;AeyD)FB!2Z01iGDCea>V_Etb31hN6j$=WA~@L&O=9X*r&>L;=D z`^XxUE4g;lLo~-JAaEvpyd-`6)UF1!()@%*o^+gZHmxUvKB>^zM z(!DSv_7j<9`N~PbZ!(ENOLD&Ias%!{pvGiP7o7HaDlM&obTV^l2U|-f*ofPcaH$9N z8@+1Gf&`=Ow1Us1ij)Ll09G^} zT_^3~q+?eCXKb=E6f`Ux#-=QM-=PV1*W=&iRT;bQn6Y;FbH*kvL(zlxQ3CoeM+JQtDsXc#*$!2TV;CKUceoYfzY0}WkWF-zLwIFJ% zxt4r&X<<}uPh6F9!FGJ5p#p>ww1PxRVOvR1HdFHiBFgOLeI$X<|AQJ7M^ssVY;`G( zoL`EOR?roZjI^Hd76cs)D9x2R7fkrMA1ED}7(rwiwJ}yPvk~0KM(q-O1H|;+#gmch zfd@qk3W=ctGi`eSc8c5(Vb)0Uh4lPf61A2HwOIdvmy*Rz`MLmWXw9QtKQhjWDpcwy z3(jVU7;`ww&zKPCO(MxrSSnVTy-~EjJFwkg5h8k%b(1`~YShdKgIN7|GEX6A51f8` z(l^i|?glqHOkAxH5rJmLzO|XwF{PI)gBI9(isdyY7SCfMEmB3bCxa#|bU*f{cpN;4 z2pOmiRfP`7lb}b6sA#ES6|qH6>=f*~lca(QUjd|9uvb==NMHaJjDS%_;hwHG+m#VI zORQLKTF!P_&9HGPNP4*y?@5l#9=+K;Z$G~M=O!<1|JzQS{K99xSQsS3ll4%f@W*$> ze8(mbyAnElVjm`Zb{S~L?mzbZcX>^QE2>@ImN8*97Ka`RCQb z`6U_G7e<2CB#=x$;XMNfsU&rzmAOo4vMF|Hz85VEo%b(flu~k{l|^j=lyh*QNMg>dtBMt~Q=$UGG~HM>{>Y-un)<=`@5Hz%Fv=FL z3K0!aKnS(2M%ojD5GAB_M9D|09(OQ%%}kUy<_FA;k>c35LTG%)eLnN+o=Cy{BDwaX ze61x+K2Z8d?6_e$+48z)y2F8vDYV)rg3_}E^@;GBh!P5ZVF{hEv=X;+0uawhHs_Yd z0Wmh4VDrQz3zJ0^C*?MKw|kzxy8Wm3KDzyjf9qoVQ#Zf9{pJVX9yP(#Fs;_9P*}Th6Pq1Z}C33C+V!;f*iOHNZxm6*71|h zpKj0gYs2H?-+VsR)zF&-=z&O$5y?`J>(w6sn3?Nef$VgA0Y@ z9{_M%ErRI>e1I+E^rvQ^Z3ZQ=!01DW_#-PTgcqfyI5PxF0(Kwg4pS2i42e)axP8xY4sD(?*lK2M3Y&Zgoj3=^$*O0 z0@z!GQrkD=J=Q)g0B$hX>g1(D;2OZ-P*8Y4U^Yz$8A3lBY0-B8*jto3>s}F){Na!@ zZ<$O>d35%rB>8$vdqj-jlB{h!MsUYA-t#h%DJ_?>rU9L{Jti~k(PfWDt2gTS32=;` z^drh%Vs8Mwfl3R(;>A3hAW+Z;bV6;VQz`))h!u=t(}16%hBOrrGEpH6wx_NRjEO;< zOe^!Hc&>&gb1m~%yoi)QcJzdIP73gaX{&cY@qQ4F%- z=#B3A{^IsuIeTq;@aku`U-;@bcbX`k^F+38UjPb9rw+(n8Y+F6r|oC2pOb8(Fq5!1G>4JP+6e}AK>!?5z-xz z(p%aRs1*T*S(&H=IVU>AmSv)naIP#Nl*jj|>qktqn5uAtGNu~szV-e%S^+_*v}iUK zFAAED6MQVOcRUj@LoR^pf~k_(dFDd4r0uum47LWXsR zuWi5UBOl%V!2fx<{rE5c)>G4iAvfeZ(c#DkOJY>)TAsEn}*`}*6U+2d@rKK z5eXWgwmb#VX7baUUJ4J1pup=}_|tGf!!czP5>njQ(OVQ1_Sen*mUf5~rDJ32i(a1D zRj(6BjkG70VAK_iydOxk_?e|BwNY7)xj`;0_m5Yjtsp*#)Ltes=>Fkz?0s7Ogon1`!FmQl z1)s}Pk5*Pee$U#IwdY5sBpgTf)P7tNL5ButgFw+H$cNV96AmtvnwKB5)kv~2Sfct; zE|rgx;3d(B@}=$oYun_dO+#Qvg2_mBdI9@DVyFPZ1Lf;P4JU#9AdcpwoG^(WrH=VF zeV+;ntOUz!##umwjFN~LbD|fMr{qtZlPH-PE*i-ln8tXLf?kX=;>1>{ zxl7#ankeo1o$g8p@%QG5N;7}Ed#=3O{VluK^}2igoJo`P`L(t$BckjFUKLMq<>FV7 zw|UYMvD(q;h^&#spbL|0&{pL-F)2Q%vnQJF3F1GoM36C4Ab@%+ATF|8*Y;$@k@e@D znnBkKIIahJqr$>S_sa>`D(%9iDD8sE3CjhMT&#$HF3Pb8o|Qx^Y8`p_Ari>y^vTi~`M+yqdgl6DR3DkWMY2{PlZ>CrwP@qKJk$nyP z6m&KKG#4rVjwfLS_{azjJI&*bs&lk(Mj_KG^%g!9DkW6D3L&4JfQmF;r?KPOB#K?F zz9@vFU^1h6%b;g9r@b__7Ex@k-?+kov=WiFG z;ui0AC*EwTy(~VJy#5KfVfj%_{sdXkI9c&{>F41Ukd_vn0TOppd?Z1HNM^L;iAt_V z$RflGvn9VR_dBZ-jx1Dy2$g1Fn)S5i0SwMzJ;VlDqR~b%*uu1n{vSv64HikhRl&lX zm9Qpm(CMvIM%<{87LybwYg4o*w<>nbSnJ5--V(J|-(S^Q40uz@`etPpA%01oG%!)- zwh~5M8OILrn9#l+A>svpl-bp*rtrPoUEO+KAYpmvf61eK>;%V z&{~rt3ZstU`mRs7sBtrktZ_jV(mq^J z6N*2@OUI8AY?(?sKvScfu#qWEq;ahyiljC#a|sz%II}Bt|F;Bz^E4JtVxVm(9Tbo> zSXL8lpd>XjqlK5e;0Jv;qPeI z^n~v>OeGD4*oQ4$EUBNx+r?1pmhW~~{M|9&^s=mevY9rVL#)*9A4esHFxH~~rxqX6a+f?amGQg>n$$~bH;=f-lp zUG!@(q9pm85Nfd!N(+O$6@%^U>Z#IFOk|Cra&5h0v+KS%A>)6dR(BO7vmFFmz1X`p zAD*nifzRhoHLT}*q;Q&iM=B&N6L(tEw^~wIzrQ)M*fCP0=#X=i+9?;Uhr;B7@F0|a zr0IXeb^y_4c^n||IZzToutnfR&XJ7_4&1%+s643ClST-$S){b&S;_CW@;MY0Y6sAP z8Ei{>M^ZiL`3cmRTyFc9+U*0DN)W(X5D^2gn@(R8`UWy>?dkyz7yuhD3>K_(;^BpH zQREMc_!oMHg2amf)oF#FHGR z*)+2>Pnwy?!Bi!Yffk;aAjMl?s>InS-|R6-c& z>Pca6n2ZQRAq->5G+pu3oNSoyYZ)n9_fO`ZBSu~!7;P#*aTxJZiYX1Y<+bXXl^W0eb;1W z*YA#}PrUkxCvSDn!FRg9`@7xqp$e5;R9L4S-3cKle;&!nUqnj2B@rs<`ay~(7BlUw zg5v7LqkGQny|CSU;Vav}^!IPJ-?jJA?lt+kbUa-Zp;91oV&ct)-aJ)t>q^QE>)JV# zM6^U&9X0D)jU=bFnQI-4vn!jNpeqO|Az<^lmkOOf+8K0e5JT<&f>`lFfQEmiqCs~vx7b#6+=YPMhyri z&gxx}3o@8&HPuJ}OeYtGpwkALNGtJn2+bAkemlR8+V}L|Iw^l`QtdDnc+_DMf-1JTj#zN)GX3#FR;36jWaAU9eo*i2 z1)XnEHEK#OO8e5P!e_=*X$G-mh!*Tl0eo}E)X#&|(9B+(!;vUonc&52EEQ@hJ+T8z zT=Zd0j-YRWu53_J*aH5<2c4zW#CshT-}I=mDn!785Hqc%4QkZ5l}So21Wb$WcRhWl zd)~dg{r(?*efx8t`pr@E=oo}-SA6%b$nITH<6V=9;fjMJy2EwRP+ScCAiGvCW0Q~J z*LO{ISbU5{r0+^KJ!?hutd-JOlBi5nW^Z+W<7%kQjmmCSS3h~0k`1*GD&Utupr|+H zQUB(V0K(gKUGv0FoP6fs3_uMWnEtERnz{TrNxxlpc|+| zjLEZDL-#l+w7PDHREw2&narFR8-)v38(hf2_cy0Dc?Q4X`(OUAB5u>dL1~K^_?VZJ79RBw&)5Sn>6q7X`i+h!vTxFd@&QNJ-K> zrS=-DpdP7qqf->^F_;kKW@0g8CzMGsXAO;=G@9D<41T_A}F=8%E8q@_LwMQUjzr<<`-sJ|4fZNpke~XTE42l zB!=Ahfemf4Gp;UtVve07-e!t$T zNw(h7A{Sh~y8RaxuWWx}^XuDh4HzGH!OF(cGv6`R{=qQTri{?fLS_DT_uPB8dv075 zpGs-0KCjb_x&jh!h;;oxtf2o#y()R4l5c0VC#Vu&s}ChScz*ld*Wd5`n?Lp5*S7!3 zPj|2NPB6ve*NaHW)0}WxeNgGFiWUf&M%F=?u;BfMiV6MNQb0iF`%^&Kgtr2~8{lx1 z_zCoJc`FkceT>z$BJU9|W^_KFaJp_1P@<=T!ax@gE%{ZD-0NLzs8@_h(lL1m_h zABLu`%v-?}1_?qhX~eoJGM`E>6d+TORxYjz5gXk;R3DbI9c0=D!eVN^$5uQm+9yZAwXK3K05wABiicLB1O+AmyzfP9?&ql|LkB#1ormAzI|~>8QW|^Y|kk^wU17T6KRY zs~?Q<)I@t_`^953(*pRzz7;iEm1&EN{>a3Y$e^VeegeM%K7{e4nrm?tAdt5>w{pQm zl-h>kdy(RP4NX)6Php6e;^wycQMl9G#<)q$v}&Riob9AD8vxc9|c$8fDuoR1RO;{*i+hwtFvsrlferRvo(#_QUDH(4#V3Y3%Z>+_mx; zPA`UiKw~D|v7a^k{4R6vP#_J>vv-vvj)CmP{4c})pu5sLW52sy0J!1r#b=>1f2+H_ z(>*WVt-U|%%OVhpKjl1Q^t+Q2JSu0#LeX+U>HcYjlj3FNwuG7W^)OaHk(oc=r_qj|Yn!y3)Ty##K9p3A1X_F7m~y>% z3nz9=^zya^R|=CH3OGa&DoL>UFxDn2DO8HBOv)9jFZ>io<%F2XYmZz>`CMtrClc_@ zi!GtiejYnV`9tga;R|oBdua|0Zd!&2G*Jmcc)vdrl^>FZ-A}= zlrYJJB}hYZB1&zN)lZQ31DR_zo_uH?lp;tTK30B8q{#~WDb=aG(FSFu>m8VCjM9bR zCkDM~!A+T5_Pi(Y$T}5*nr$yMx9*S31Xcd1^n^2L&z0^gF&$BCzV0!vwD$*3XiQDY zcuI&WNxgKz<7N!rSS{h3+N4;0xkz@ z<%-D9uljiWxtVE!*hVaw(c4HD;Pcp}Bf1<5cKb@0E7gaRIVfHxDY=Iy{?%XD{+B;} zwf($MWXGteW9yiq&txbvb~Oo)O$~laDjG$r{H$G@&wPK+d<^_4Fqnz1F?nU+rEm?{p{Z{9L>&Z*8)2CBBvJ zb+*11-bq~r6+<|&S&A4z<1%6Q;a_RtRau!>fq^!zt*B6^Elgu3dM&W}WyN}GYoTJ~ z)sn&iDqp-On$$TpgDppjAxcn2+R{WP%CVr4<3S^lW92MSQ?i$fr)uEucl&4qJ0>GU z(}pqD(;6qr@vP;x_?e|3!JKL&`Qs#B9EnUDsM5p}`wE|nJRzTMq&H||$9baD!k>aP zPb0BoN9!AW9h{T|lKF(rXPiiti}Q$8j~45icSQxuK?R;-!{CIWQn4QOZF`?MDxlG3 zfs&h)OF`j7D;h*k51Ny!;kK@e%%^f$*G2mmw*EnjvP@N?VD!C+mB7(stbHV!?8OMw z>{pOmk~L5rZCz>+Q=sA{jxi^RYeAIw1MByRKn^p-mSW0IMrQg4KQ?4ORB@6gVIqT6 zg2|RzlQ~NtNrfA+_R^q1Q1D=-ObL%qsAoi%i>HLHBAh6FWebf%B}Mo?V5Bcl8^M{o9AD zFFx7x?{t@#!sBEzt((2MZI{(d8^lbT&8%6Zv%~GZ-c^xSNs3e1A!cq;b z#5_4SA)=xK#epJ9B5_j!nQ!qHQ`iT0R$Ch~si2qKu9ij^b7;=>J|$VDDb z`mi9FW*zpTLPrcUo1#RDI6H|hdl_Z6#82_WM)5oynQrU_PSccz%xAh1g1}i`s|YDA zrsU3VwUkhV3YaIrYA*=Cy|ja3n2QHRyeV!jNuF$$mACHTwe9!peQf*i<`#rO5(&lMNPJlZ2~lX7jl$;GVxE=G zAbj2l=q->C@=Sx4t}FoG0Fv{}E?Sw##4T(M1hRDCHIRDIu6x}+y)+=D0|VjnnO2L5 ziX!z-uKMXkO6in~E~yn!P#nA`Sp*EZD#WH@E|n&KP6!Ku=?9Z(k2ihs0_=nU-x3}B z+Y?&-$YbICW@1s~c50nJC17!Ip^eHx5gGNOn%^%*T4AB!f;@2y8O6SIA52uN-1j~S zm50VdLEle&SW`cUE2G6Y0hMe7QRYz0#f79~bXR$hXrvT}kUYVJS4*)4CGEI;eP8 zay7&$$_>q{0-S!JbPjwfB@MK^)|F3Xu?S;@OtPTRf>MjLP$?5!-UuL0{9%I&2M87| z4_)3UrItH?B4GxS3Y8lbFlGI+xG~?zoQenqiGT?%XxE-rJq=BDy#xXpNjfU?X@1qi z=!ZcuA>K##PYaW+T=;2o^2`bb%jDz4dVf$#h@x1}&^N$6i%sBClbl%P;FymRLadEo zn2qqTpkwaXV#$opkL0Pe$-hu#4{fs2NB||uO}7ooVS!&o47<{qcdxpBiWyc!NECsQ z_AV5u-->Y2w2uJcH1(7HEC-kU&L5zA#YF2lrYv3cZbQOYrj21gwN&o?j6lMlm(yN@g zft_$`m(=egrZ|lca)F>6sFGI18~IX`LgICatARk7<-h-{+wVPiVf)uFe(iVVa~NBN zJgb-IS+U!pSh?$Qca;wA^3jZ?cy{qvK1|GdtmXMx9Y)NJ87nDd@y8-%*Q93nI~wa1 z8jD!Nqmum~1^TvnTvtC?1gxu>7F|DCeB>z#Ry|J4v-H$F_hg$MJm0w^|$hY8GJ9TcS<87ZJvQb3rn1OVJ5AvDD3!-T8QxK%CqjHlLip0Fk= z#{e_Oo7d#ZPz5qUO$2jvv@Z7KbHVBdojC*>0;o@z;!82av10F!t5Cu?FHmzPCM}+`^GBCzxb@Ti)CGpw zhEe@AT6A!o²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 XaJlm-E3QHhK)N2N>)o$Zg}wYgocDyh literal 301180 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 OZPxhQu8{dMW;-evIQlQkzH^h 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 z z2kZbF)#^<$9VEapyGHcr3yG2sYE#aGB;pd>)v!=>t5NP)eNVI~tJQ9zvtb)`(Mmm` zWE*q<+#L3wBOCx0L=?_u>lCkh?~Enap<3zV(n^ks1t5PQ1NS6qfx(JY(zAH+oD(;M z#MG}C!}qE!YN~= zU)m@}rVyH&_C(^lw(-bJ%lxK#DKA%*k)SFLCDq3;8*7RvlJ?+A z0k7vQ*&+CRDOjYtE!}H#-3yy^9m%Olv_25_5n|s+9DihV0^eKr8gnU}OjC(NxIH**tYDW6oq7@xa!^@zOFenxm3HoJSo9 z*&WTp6;`z-CW|h`>e)RZERjO>W|h?KN-W1SICFAZ zaR5eGBhdCC1(J&9d0=bJkCbZixW+_Ew^CDm_MTrEzw{4(>za7> z*{sO(9vzn3c2jO$#5_o$@?5(rcEj&I{GIrNw|~rj_;0_!U-p`x*sY0U&4Ev_@n3gmDbJ`7BF5W{jVosQE?}u$@893IXd#m-* z5G2_iUCKSOftsW!b_YjW`=8HM7W&h=Sbgo}IL7@%&Esm_&J&LrB)_17TJX?_^_x;XuIaNb2P zF|48(*!_tD5cckAgU_y@IE03fk0X=I7i5r~l}k~Tc5~6SIhalCQg_7`U=&pXX}IgC zy@K9|8l%l4F$`P;4u?CdY&2(xA-_LZJgnbA#}l1b8LNN;5;tR=u9Irp(XG(m+axHE z$?s`7&-*H}lSII1>gZ+(c}+y+%!gxE*nlIFok@kcMJlj75d$07QIo75CQ(~K`D_Y% zDyrDeZXG&=8_f!C89BgAx?2Ah1^fK?W4|$f_CNb&>7so5n#*V2a`bbXZc6+`bX0EI zRk_#q-ERbR{mraH|0h52c>AHh`KUemiq~H@f``1|XiP#a76+`lwUgvzhKb3v9A`VO zmxzij#`e;1*a9FQ*b(@9=O)JSOuKed{rn>a1ztfFH}(N|qh=BLrZ>#brCOi=7ultn4` zNh^&ga%wH2tMK7zK5_8~V``!=*iUV1{)SC{R{NM1K@q@36v&A&%Di-)dLb*CZpUIb z5=OB!GURSB`e3KZX7D36-a;y8MaRvqiw!nmdwgFePOZ#KBvO~9D(^*=rh$^T%x_wL?c7fM12Wtjtn6>Fo$yXsG!r>~SP_?78)^MV9Ff~+w zXaeEe&}kTQA05DDk*xfcGsMCUhYfNucwpfPo1@gr_n%HJS0Li=>5`(uWixK_>vf(- zv29q}=Qu7|ArS8)x!ExurH{4Y#7kxlgD4XchfVQ>P1K<6VwRBgRkU9^H7;R{Od}=) zQu#vDDs?v1Ul}+#hNO8? zhD~4+1&)?CHbh-kx`T-ddZ1P5fiV=bP=uG@GB#ijXpKN5R{|~cGX!L5rM1#8OgY_k z$?yrh1*SM}uo7MZ;wDa|seKt(9I#1DY58uV;n6nyh_XKOMA4!|sR367gV-Fn?SSH+ zpB;t3>7=pM9opF0K+szg0k63@JLb%Jy(O-C>2ac=xY_SXT*HiGU-RT-%6M(=99ec@ zYLLwAR(gqDAPMaVwJtm*vxsyV36bEsNlTm?^@fd{?gM9*5xNz0%1lX7o>QKkQCg3~ z=GiLgw+Usl!?uy*OYmywMly__&LNBm6a(j3>DP|Vi+MrycH4ULLzZr8q4d{i=hE%j zyBN)~lhjc}rGV3Lk0wpH79a)@@)R3FljZwhjYLgUj)d5qL`DzcYpoM3Xq6RYMLeCe zPyrmfY|t2NTT8+0fC8Oe5V}qrtyaR+_`y#Z*)Th)OG^0^T^A1^nanJ@zeMXtk*E#V z9PO$!IB*?Wu1HJBXu{A&W(RYrw|M$OWPkiJH&r^|dKMHL;AKjJbqfohD zSLJ?%%Kg4q-;CRrKlg3>>K8s^uX@9a`=c-YL9#0L(;kB2$OlL+hGd*HqS~eE+`o2( zj1Mo?!Z0~?XA1E;4O|w()+^&-znuou^c%7=MjRHZAv1Z}Vq-EhqTpqh_dzWSXSxfF zBy>ulnT{w>RE|S3sLBuFYz(zxyL4K$_#+5OL$M~-IJctJGT&~>X=I9J_dwTes~viI zsLxTMceAKT*=AKP#eg7gFp)KM@oq_ZG|tW~%0@Zs#5S$OWG+-l#usd@?k={0_i;?r zhBy@g3GE6Oq)xtv%)wI#jB9=6Y@=7pI+6a20}uuaN10?Sbe`UYq}wK2(N-r`j>gV2 zSs6~Tv#nGAgzz$i+RCm588-<93p-%!H>-s2w9EFQ#!fd0YFix*I^Me3!O_7S5?=m( zZKEe_u2scao1I_*8Z4~rSn(br1dfaj<{C{IpQ#Rr89?N}BxH<2Un@&BH^hF85=&Rz znWG1J-x+X6C>RQc-pUDM*YdestiovMuGfYRViu$v&7l*aT_#%76L5FAMpjl^c4bVo zVJ0--U~nJCi@g4W9Y-)>$ae~7;n5DPARb_>dv-~>K(sQ?%jX9zOGt zWMFWAcnIl!z#g>hJ`+D*^zZfAc!3Wk0o`Y1KIIq*&Y~fNZE~{`r6D_6=KpL$sg?0g zK#OxJJ~!eXgsHXP_XC~nSREKwMhy=OUZUqffwQl-Pd)yB+i(AqH`>SE{aMkaJezp- zxr~0E*KW#f3zY}$s`xGRDt@E!(HH;p>;BEJd}h4-hhO54zU&7WaZb)dmmHj_0bIzp zXy|yHvg_iKfDFzEDrHurJVls@MIxj-xP!8Y2#`jcJretnRxzjJ1C_bk=(dn_Qa7S@NTtyLO z2VDzZ#LPA;#E_?}CP;S2=)gT8dizHK9osKjs76(_mO{}HV z(U4}FzY}`04QaWZGbJw(VLNbFq&wgu-n~2O;*tr+9cK_G$NVTnaGYmh6|{rA7s4Axm|kl`z{WSV07qm<(%HZG_`kB>{a=1L z{^++qdClRYBc6+b+b!Kafs$3M6NS`>=f(c(!klRBu7TQS8c#F;J~CPZIz<75YF(J3v3$6c5& zxv5IFMxI2G#yw>t=80;F7Ms|hCj^v{)Y?w^C544k0>605maa*@SAyGkGRBFU9U!JB zukVQrVq28tB~VSS2F6-BVh|DK1X-5dDHb#=lC0GjD(F;*5)tNzV$8h%Hkq5d2!Kh= zO&u)7mlSViQg1ns_D)WdQLJz@(jg&*0o&#sm9Sb_6^TD2^_pGNy^F^K3>-E^diO(@ za7T5Zd+Ao8jH>u%7wHTaQ0XO#SCKYb?0P$3jUz5twN0)s^;SH%>?Zsvsh3h70djU5xY}7fHL_$3Cp*GmSjoK`)HLjym9Wpvg zdM^1S%%;JZh2u%W{HECDyB}SQM#o}8_X6Dpy`BsrwCp}PbZkb=kSkme7>8YtrH&$5 z6Qiix*#%@Q$2g`ZZ?yXNf`+myPH11oM$mmG-Q9HUkxPZ5BosC&VqwMgJ39X3sZYFX z{?7mU%kjZ~@ktaY-@Hqaa+9vf{LAR3JV>E(o36@DEY5zz0_Sc&E8?k-e?6Xl>XUbh zl}G(WulS)zo&nn1mm8e|tvG5m8a~M6hma6z73oeZ=Q9-6rZe@j%O)(XJBlAmo2*Ml z#-xppUxzAxmc>8Y?6g-DNXYWkwQC+O->zPF?6!!5B788zcW`WK>iZZFF0br#MY(j&82{}$ zBKOpAMCS68{)AA%JZ!=R*4ZsZw<8phtGa<*4z~?DHZx0I4aYz=lJaD|OmVC>rD8`>b+gNK z5!gQQ(Rcd)@lSp^KJ?q4k^<%1LY;j!m(NW`KDV(VKPTtU^I51oTZiRAEX(&p?bjst zi+}nJ`@-Xo+bdrGJ@&#^zW!2}Pzac$!#n@~5J-Xz!3q@AF~Z!D$f{|$34p^KQi5C# zyoH@(G40THTTm&>@HG}gnutk9O-J0g!(x1yLuS@bt0YaHw$d9f3k;R{Gqn<)Gp`2A zbp>V?i@`PTr4`p9q^)`gqazp!)q0XyL3iCjXN)l?IWcNhyhEsFA)e1kQ1lWAvkQkG6F5Ao;k|OD5SY|rbR#9CH5ECvBvTt~JxFlaw=nRp2qVXf((yQyR zio}*e+bevAp-TliBAaL-LX?ad)nIk9KXDCUCkh>_%Nns4wz~_i7)d9<93utvEuCXk zXaW3ab{N+!mQ&>bhhL5 zYjlS(Wn4(Amq+>%ld-$21XZ6#OX1G&IYw0cyf2VVRt*V9YXka^Wd2 zb6d;~EqxVg@uA&As$dONk>W0By_zX5O)#9?RgF%JS*M;%1>QJ=qFQ#~281bRg2s z3?Q_0k9FKH6dfDM%3eifv*SsgnyLy&jHR1tO=1?vn29Vhf*YB)(kOV%*x71lvEIEP zgA}Mb7VZn~G{Ny1kH6Pqe3_8?z;w#nPfaF-J=9V`dhuLTDe^ zp2yly8+a$O1SR-TI&IVyb!_MfQKK~+-H!xrvEWK!H#-zA8XT)`YOG{t=2A6eD>ZZ? z&Q>YQOZaLDRBOpD^1RO+>EKK9HL?E1qIB;YAuQV_t|9V-n7lA%V%}MlIt0rMIOQ|S zH6#%NILOeY!!bMIjwj7a6WtiQ5xW5bdb2Y*RVXqa>NURWJbbde#eK)IF>|;%BBJ%( z#BNV|?FGD9*-^Q9eq%iG(Jx9Ti8%k3V2%CGOHu zsf+W?ub%A#|NDphwSVnwFMibzc-tQ4h93gTp+Jobaz<&BbmF#o`zVBu`qPJp54^}XOt&B z6!UjEVN&onBzTS^-6pvj8)N6i9g>|5(TU{Dlph!=qRjjOn5%RfdXtDaI4W<5ObC|_ z*qkMXB`XKbhFqv+1YRV}LFibyAI^wNPgj%ROQvif-Ai|KNG;_iu1p^R`h^{{n+7@^ z6Jd`-3J2o%CpKRSGb>HGE%u97v9=dFC~~T`1N{rcy&Z*8xD}!sMPF-0M4cviG+ywk zjsoZmZO2TKYz1k0W2cAK>j|6CGemDlq3>GW5Pb1DAKaU-ZedC3wo`AfG zqy7b&#<5m*bY;9YJQ<4UzF2m8JtQ!)Rnd}TV9|n|sM*7ae2RnW@>!j>f(J$tTx<~!TaKFeHg=Ph<>we6)BDMIU%gQ*EDDi9RjU>5#n&<{0(mosv#eHMKoHC5K z^8jOIw@!2gG&4;!aU*J!G_M^xTre1!DFrJ$3y9!2NYl0@pfFJj!sj>uEnen`r~r^RC?Dpa{}kdv zZis}Q?VC3k6AgMQqUKhfFeM1$rHR*gj_bUb6YNk6wi9itVb}H zhlK%?L&c#)d#&kQJhJ%mbS?Q3{RK2F0*4xGy)xJfo0np9n|yXzsGwc6#z|zP$a`XV(b!$0mX9tbQ{Gc#XAXn=dfUuaw0{)!V zej@lU|DIzsMi;Ofl+Rs3vDm@jA%v&tMtuvpKq8=bjDv{q?~D()Hmc=lW7l&4bKoTW zs_O_sWU~tKJYxj8)|vHr7ptX}p2dqjW6~{C7gLkx+T{B~+&weX#7p2m;q;+?hHkvD z3V38!;_`W=lLrS8>b`hjVZp+Cb$A5@rufxFE5h-sba|=G*w9%CbaghT?rTBN25|~V zbLSXJg1`?tqJs?{T~>DX9Im-3ddI!1ejsYg8ZV3)f(z3TH?_N4iOuGAAk?ypH2K~* z0>`t&vFLs+zxL%%#)p3USL03p<=dr$!Xo8v)Y-UCH)Y0M?f`TO&e*#Wvp5ThkWY#s zPA(D)&LYL72x0X6c~(f8$I%X&Stys+bv0MZy^G6;_RUt5+G&=>!(bcJ1hOXMEIt4y z7E3b9O4L8PNOY;>2qYvy8l91e4VN&t{cw*grkMe1EGSA7vo9bhzDzkUsqZfyuo-C1Oi;{PB12CX(y{`Sl8COpLRk;}!%fd>eY~?ywNw#etsa^4N z$M4xs*&?=GBd=L38W2^92IuFMx-BpP*2%tAMv~+h5qie(I*PsB>-o!tJeJ700o#6t z<*VE~5`-Cxh0$c>Gm?LVj!TN?p%sc6#qvHJqTixGm{~C#rR|B!I~>r{5}rB_;PKZr zYnA+Lb)QnincX;phR#dC%tO%d3es%IiSa0Y04>1Oz)TT6uZ$eHw!D^D!qP$t7?NXK z^Jnl?LWH`8`~NLqhzA(L+1N$nC@@mkUw8qIX)?k? z(%=K@Mx(9;9m5$F^2)6wO%ufbV|32$R%j9GwRUmj%|qD^7UUQZTE5Hs9U&o-nE{8Q z3ZLp2_lX&sETT$WR1E$-(LIZjEGW<1%(vyj7&TLg1L$ z!&6)`G|nY9blM;VZbtF5d;Khv*7b;rUKq19Iqa<@skZlZzoKB6p@yvWTj#bI*0%`Yw7U>V+WZp`+X09oe*A_yhU;y#J6gQ$E$>_Y2!YZZ}jSgG~znU~;RMAK8^ zk$dBa!1L=7HJaiHe`k6m^p4@EmUduj;P%2qm`EwEj?!_d>xKf`eN&#iW&#|8b(&FR zM8@;pVJ;dAs|E*2po7QF)iceyWp|VJr3n*?!g^O^y%ntSB1GOT?UDnQ;6#jkx^z2u zD4SB;Fng#;2P;Q07hPWGsIdT$#=;rypi{4uWQG;0{v!`6L)@SVz*?$G6#$ZW`*3YB|}fbQqy@mmxu*EK7Cmy2xn`NzK&kNx_;X|H<2H|#~<|Eky? zdQ?e01QiiYUJHY#Z8Q)PwhJwVILM@9!qXhDfXoNCN=4PImVMs6Rj`#Omw^^Y%kIqr zthIbd0$BGUC$cGaJ#UwaS*%b|+PP26XrdU-`>uiI%%$(Uq)?mY3v(TE*f9obF{l$8^Imgbf0!XC+ z>m^UnTm;#XB6zM*cai9PNpFqSQJEB5Y6`5C;KrRoTrUnq=IscOkYSMQl=XI4_l<(c zy41-|;izkZtVMl+()-d$GOe^QRtWI@bzB1ZTICJ(j3y|aP6u*-V;Zy9=IQ|1WzZcu z7<*zcv?JkOg2wQ&@YCjN)k)ky*yLz3#m33)DF@WVh|utvP)wSke$+!z+r}QPD`y-=;3r`{X~X}QWvA(yY>4C zqr zt}#+rq|9sGl(=Dm@*qOl_-=Glo{vK1`5FP;q`&L@EsrbhaY*$zxVqd z@kd_rnnty?5%rBCWlCF^i25nIByLhTA!8CBH@>%o$ znOQOQKq&s*VTC-2wj&o2{48oG8Yq-p`1gkb?u|$;iDyS+sw0Rq**Pl=kK-Sy7W=gW zl!<0!cV4s-rBcu~As!}9n47q;M)pVl8{=F)3B&+6*$|`yh$67M1E| zFq|&k5wSM$wZVBp&gg1Lor>42-Uy0I&4y)!!bsbE3Gn8SlP^wZX*;||HcfkR6xGrt zK+e&MH;7Zu2(nw$TnI#?MoXtghXGFg!sMZQA{a|Axh#6KOwl}yw2-wF`B@MQ76-S{ zM$si&94lmVjqG+^(Xb#;64?%rXW9e4xuS$OAyKHX;rM3%e*ROgp** z3w#&pFgj}3Ea|8eK$GU%o2OuuBPIv8Xn*f48sZ|3Zpn%=$<%3NN(n%6`f>c2oF6Xq zEYifJz^ooV-v$N~$FjqY8CH97FgRviqoaLEITw4Rq0@Ky2+#bz0Pk?EW|xihYm-C7 zNe)&Ugw*`(Q=`~wFX7snu?TaCWV^6m1`f7o6nY(97cQ<{V0QLrpMGpU_SUz|-}rCe zdFK~s7ln+J>!R8Fq4958tUTz*C;qYvmFHswbg#d2lkt!KbDcW9rZ}H?-{<3rk9@>l z`l_q##jkj^_0z+J-SD)`tuaaY-%0f37-D}I&lRlJ^Ajk#W> z?U*b7feFr$&LOxsrnI2pt|8|kW6zQA!nS=EpEAgk*)+f}A03ChjNU8)Q*I_*Tx+%lex+IypB(VG*UX@K$a8CUa?njqe;e z%|KVna+9A-`XRp~si=_@$;rfPYJOUE(=vdP|3co1j6kS6Xd({IEFM@^yZa#lmDXK$ ztC#{Et@JcQSTdv^uX{FdooJ7ZqUAPjl$Q4>t@IX=V(wi_kvU0L{0*k!X4*7*a`|7ba(I*t5oS1!r4a6$aPQ7QDNN zL}!x4D{;x zN`~uIQNZ!r*+hh%kq({-;3LYSpKcuL=Olb_;4^Mfdb|8Rd!ljVA%i+17l$KLx$W9W zGshqVOj56BM$*ZT>eQj8EF$9n8fVb^8ssy)j!yE!3YuIfwT@|YADcyq* zB(h;c&a9Y_4@Se=@F2M{6}IN+Iu3CZEfY3K!w7`7;l>9l#dqB1nEdCgD^siy)K zYDm&G8ErHP?qb1{VnBQvEM&S^a6M1Xo}x2-y{akjR@pNdVx7#II)%9`vRxcLwAZpg z?HHvo9)UAqE~W(MG21BAS%FGy!s%dw@}D5dPOFsI3^%0KM;HnuZw@=sFZZHj;$+Gb zV2*hpHojO&K|#H|hfTuTIA&Nv!&Y5C!tzj9oOpe$qUQ;wTZL`ujWz^LGG#XKv$?sN z*9PeV(qcMq6U!MCl7cM`4_vPi#bMGmWO7zaLQuI-Z9d-ZEC578AapHVg?5m=96_4 z;0Ioil^$=uU#&#f-j3UVlN;28Tq|6mKn~d&ftQmerX4|s0x4uM$WPw0T?QnJ*8 zab%o_6sPvhQ{%;gaHVHg+(;7*9h2c{WJt$5_YLCozx=5W%n!WnE%Pn^)jRI&WnX!g zBIRzP*}D}fH_@a_yIErLcWvbJd>1OW9Rb~>JL320uH37@QGMt$E_8hCJx};&Kln%E zg|GN#d-UZmxBk$h2@=Bt&R%+AwK-C0CZT498DQK=?%=Y4@W`s9m2Klky6MexAm$n4Q5=*ln9Q9d$w5dxG6o;Y1OjOGeXqnrIa) zG5vHO?SQ3Lb6_0>Z6F<6<~~I(A_to*7WD37uZ${?PS_l}3)~4C)tRxyRTt)GbYfaE zLltKs%#-aRxbun5ADzVPHuc2qGu1m1)!l^iVo@oxlj!ms1q4QEEiLQ~E(%4W)3G%n z5UrGJXgVZ>5y#C{tcnno_oo5w*H~0}2^@36mR=< ze*dk1d`&QWT{L^PO5?amk#avx%5Cy{;=9pJdA5snD<|8kA?VZJ`H$k{lVQpzy^FxputK=dZQVi(ny(goEu9qnRfG)%X z6Fmgg^TbSZQ&^b)(yMSDJ?*$@ucCw^9i&5jhnvN_aTJ5beb zo*9Qg$B~t$1=sBa@t{OwrYmB%4_l$evoMfZ_HH-T&Q`0i!!8BoUdTxf4QKwmXZ8h| zL4;AxGNSm2fj6}4sS~IU8a6*{5_B9y0>fI`r90g*X&G%9K4)^h8v$$$gxOIenlmuy zEX2;to{^lDEKz?>aW(>4M5da6qfjpX@t)zYPAC4+{&!^L-c|Du7!{T*zq<^P|gGD8? zV!XP*9Up`?C@y0w#yF5hn?e@cN9$nbshi+ELi?|WB`-xsnb}?NazQoGPMzhxcf3Dp z$&z;jty@!s0Y^=!D7fZzI5qQNA{vuGrFJPk1`3uYXSQC2Bun?qWT_;a6cdpe{r*=u0)f&!*!fuS zH^zr=t#H%qB5X|*{9f(wE@5;@Z@l~*B<&{cRfL%?1)3v8H;8kl3x(;uur+(Wp2GNB zuf--Lmn9RL@gPspd<42I`ze2xWs;62uSo(3x0bAx$pl=y?n}2~;@Tvm0U)hu*EBF< zVK-R}H>*wAO~StjVOqX$2qQfmV8Ohj)IrpkjT<~qd35ZYr3FmQ0mX}(h!2@z)fgPe z5uufRn?mUgV@ng{KDjj1w@?E_2Za0DV5!>)FF`72@Fq?pCc^FlUyL0GqKR8uf=-G+ z>9FJHaz=7-a#c`$UB2%uf>DkHr*t-U(ke!a>>_X^#Ezu+QYtB#!II;`!R`R;(b;DOHUJqYAc-%#KzJ7XlHv9&Kqq zj}k&_F=5s1-A6A1Hk`6H#VlxFqsSb3mW<mLO`<5r{CHBs%irH5bWp{V>^d}x z;^r|7FDZ)= z&rZXBjVICkYov0v($aJggxOKb)~?9{f%oTL z-jlo?2$+Y}=1Ams6MfAF)cP5P+2*1>nw53aB|(^|wyRr>1iRPBBn83{pL%Nt(AB<($N$IP)%8erUDbWgz15zK zzsKQY_yfH07aTiJ*a7hi{KgwdVC4Z6A`#&bWTXf%@eGz7 zk8ol;@ki`rY)|a*N8NJ{bMM`2?_HIuu6u7)kGp2}mRi%(UEN((_v5Uy_S$P14HZC< zxjppLKbdtFeOpr8lOa|&8-y;Dj+Di~%|9>$L&nTav}GE*#o|m24um6gkmmwub6zS zL_65Gz(b|49SQfC93pts810Ys0fILav}Y0p0pF^^CYs1(V{^X3HWC1X$U+0q#d*3qXH_s z6xWVrWx@cUvaDax1Nh;4b9(Mye^g%i!P#))`t$Y4>rbSE>pqQ9Hc)llE|$z#C|HcB zH!bFK{AB3N1z}fgM*cKZBbdD9OlL0O(sn z)Jc|xH0@MrW}TkE-?Gyp=*4!6E~kdVKLzQhfnRJQO+3Yf(suoK-v$wFI8-6IQy%mNWf#in58G?=k480YhhX*xs{h)G@h9mi$oG=K@xwg`F* zIQNqoo5xsfktrelU6gD=w)T~Bu1rvJE!CB7_ECdUgT)de;3OD?1%s4Z^ zQ-SHD(S>BwS`G%_7qF0(vSD~orEdwxD_|VAh;YBE;4ZDMvamLYprp-!!AyPm`w&Bj znn|xuWS(K_u)B`oNSk$92iJa8Srb2HYYL_Wv2khH@ggR&vhY;=Jh9osW`!>N?1%Y< z|M*t<)?YtSzW;Y;FReuvSAZ1Q;16L@#xN*DOx?;S1yYU-sML?0q5S0IL-Z=U0xM%d zOIg#y>ks;cw?3q2zw=`L(SJWf*PQ%$J~&zD6F1!6`57Ri12-AA(x1ge1m3IJb?zRc zg#~K;g$$tnf;=!=yTop|u&A~Qak9H5yZfRd^klzl5;4Bovy-ab;mrU*5xIp>WUMnV zy93u&6&Z)v$K7|JE%k!id6p1avQiG>MFSwj0uqS#bo3dNv-)8K(tM8@FP`1hNz@$) z#%^n|Bv%_um{dU|7){Dy#in&N#Il$S;NO*u3-FB5LIUf7072YL(S{%sp2&KPXd~Yl z6a>4&W7f)Mo=B^MjkF+kg{fJ^qo5VW9QnM1*wps(5#(5cnO+Gx#RNj8M&BRo04=rz ziwTokm^w510!9;yo;IQ<&|DXsV+(GoA(*&&U5Epfg~hLD2-zYZtv7a1h1;tg;mu}} zt46>a#$nkXMADQi6CNsa)`VX%nNdNF<^b$*snX$by}-&9ppd({$w-8Bx4R;!yb(}4gR z#LR3bd@VYa2~g3srbyfUGc#Qz_o@ZAZIWFJh6p5U2;X}5wg1g8JoV4%pZ@9z`u^XZ zr3-KV@({7?d;^Oz6r5}WQVs_skDe*?eqR3mp>NZ*r~Zxp;LpEO?)~!bG`HUOrK+BNN&*WDb+O_IhMTuZ zype>C7X4|~5!{S1K6o;iNd)X_X0x~?tl<$p=tG!pkE|#c(H(pusCQ6ISv3g>85_7s z7gd^fMnjQ*wkTVZ`KCcKn%WyLH2i`aFd97hgB%lCR5@|X0RSW(BLtg} z*@Um*-!+3fCFj00%$L??;-(XEO8$UOE##zAL-r&{JYm&@AnhGEhR$Ko#@_ge4ZbQI zQ_BwVLefN?Hp0S#$qwS1bKt24uo*gT4OR`}#i*~P(#57>)}RSGjR7ZKuwlq=s&GLt z@aRT0nN^qp6eXqZGjuWwf^TI7BTwOkk|oGc9C}#;1=rCAL6+#r8$Ab^1s&{^$hIoO z;PFU*7gLe?gkf0)QhyBUiX$yL3SL_i?YU3|Fe&Ws!iyAw-Vl4xrzzt-%Hk1(TSX4q z?g=8MZU5C!!+>j$pKoEmAu5{MUHF*7l~}+Hf|iXq8G~-3P2r71Q;g>bn<1)Wap|5@ z`#vP?DU0vYywOP_(PY4r#yD>ivtV#G*{rA=gMOwcQ*w2_n zO?;nfnY+mMJ=1081*hMf6n|L3rb(XYxx=Kb^k&_z z#{v@D-f32VlObSa6EGPHQU`)2qMtgD2vw{;?-S%PYfnQ z)=U>@5*p5%Dh8rgQA6*@(9!bTlV;ykX8g4nJ&4i$iZ&vvlth$?Fx9HWm!!yaP39G@ z*9EEfiG7{YDr0-+R)5r3TmPaq!&$s;NC72`u)wMSKtVW)wnAaOkBvB}bOI{yqEGx@ zwwr{8d#Z>Y$i?V_y4O*pg%G$MInVtymazfhiSf>|AQ!o|qunK$_yRIhE;fxE6Up6* zkTgmIzoTU#4=z1&PQBo`u5(+xA-Mx zJ!fZTvm;~CRAjMC#*H^Kcz~{@d%dZ2hyYAVWqf~<0oC?(Mp#zxeKH83y7V(_VpH)r zbrp3&jedFlmGtI|XT!OtevtnCZ=N%oVhc>{X1Q5v?W99|PmYpB8PxKrzHzqq&iA!Iv%tyWALjX&-=k%%gyMJ=J-1S?h>D1j1R3}c}jC%&a zLT6=u>CV|1{nXm~hX+dwa+1*wsMRws^t|f8Pz=5n6$e`-?rnE~ghy6uF*V|>B1Egl zKAfx9a}>>!2)Y<2&iVlX!n+#LxGe3gvD=RZ ztRe7E4Ciu@-5(YSE4(G+`61?9yh=9OX%KO6Z#CbWOhJGrVP{5f0XzLHw7Z(Q6$%R) zj>_Hz;6GC7h;z)nK4?}OV?BZkYX5UB%hBz6%_IpP8&@<;7fgc^@?A(gC%Roa111@D zmc>UG8k{@D9Pez-9qi7#v0)<`o);xY#n>*Zo`o2+!i6&~nZ*D+MU$^oqFSP76D~*m zyU~FxdW!Z71-DH4%pTp@5=NYh3A;3gYlVMtTv{k~2dv4tgJ5i^gMP`53{D zq??;27|?zt_9O}EJXt=lX(vyM7HS$-DR8$Tg9tB1Iz`|rHO%XFwq@d zi-SW}Erp%UCPf9VB#HDQishCt;w54W3ix$)B5p#UX8*S;2AM%LHyFR}U-OJtZ)+MC z&HDj!&cq-h@i0JQ#<=i#ZZ~vwQ1eXU>ka?~=569JWvl~=0Z$zxJ&SUWX;PNw6Vr!p z(_1e;pI?3MYdXUi*R&o2R#X2r*0*7s#gU~(iN0jdyH?dyP=;N;B-Cq0Wx zb5QywA@UUqZR(kdl+{oxvRi9=CqVATEFdh4WT%ph8PtrCem7=WRP8P!lZlo7=El@r zwB1gFZx*2kD$AgX3RC$Oj0KaWgWYq}zZUT)F*GkojCqrJ$6?Z_kpK*eHTQP@Rn6i? zP7AFdLPNqU%#|c>#wh;Hdt94wP%P^3TPWP`r>J7g!ZGy#5MT=69BN~DWTML$tu5@P z*`c_xj2kD$Vh4<42+xdM7DuAR^_P3y$QqH19y`eZmc>jcbzkRWBbto}W{ZI`C>(Al zRu&jq{S^B7CZ`2{8IqzM)cC9OQsKv!th@Crw);i^YJizs{Kg45M5K@_aI{I|foXVn zh}bq*VwSVpg>!4INy-G&Q9)d?(;!$d;aLJV(e^x!L6W55v`h?crR@OYMrNX-aU8|@ zg+%vm>d1Hnfu-qmU^AGWv84cFJ@}Y6c^U9#b!&wu5Z@D`VH_|*KW7FL8n+69?yLg? z6%P;KcQy?8+YQj1!A8dvvBh*6MNJ(q-Cz}Art^mqpkP`pm5=e>agxox|CyYw{muH1V zfOkjw+L3~lDS&19^HmJXGGM6~sKh1EB7i2`|JB>82mkQ%blY#-A8xtpbLHAw?k&a@ zG$-X)BU&~l&6&*DYv**EH2D`EDVbXz(57^PO$HYgdrBZtwwQEOwU^hak&K0z$D-#1 zwY<93LS#lsTU1o6=Ze|IVOLdHRLhGq+A*@|@r^}NUJcN|;wmGb(DSf2L4(+VRJx>R zGE{st+M$4KAZTfLiV0I3VqMM)m1QUF0;z0{O`$C^0fMO+ur(FmZQ2Eo_eJ@_tdMGKK~xo*UZ9K{`A-5 z-KRfGx88eSyy^CP;>nvn({wVto_%PAxN~`;r4wE?7{lef79jtoXc{y0A{|{zb_ZM-C}EqrXceAF z1K`o*W7X;eBw`0m-);e6yYa&KePnhqivU{zOUD@UwGDM__uexYC-wtr|K^Mr&1}FU zbSQPr@evSgv(~I4ZTk|RM^s=c);}-e`vHRS8cv{|C#8gv=*_g9(J(kF4YPN#7pzwm z1gbcXr~}_J7TxJYh?A6cgx><0&hrV{AO3wUV3l^aba{g^WRkwDLk8kc!r%@X69B!y zx|V2MrEyO~8z^$77DnNtZO1dKQn9OW1Dgh%mmOQ3Qh5KJpEmEl@e2Lom6zxzXMddk z^NIhX=A$`jbXZyv!!|2`Nm|mNYyuf$K*<=7lp$`jE7xO8EaLdZ7}l-z$5W#s_Tvbk zYN^48PKN={V^coRGO&mP7?vT7%clRY(z2{#TJ#@;I!S8VCzgIRymvx^9BOf4HT=N-HiU4o{@u8(-)DHz5_Z)`;}OhgzP zjE;iTl{1hUdQ}K)GX`2B{^Ok(EXFh3G8@&XW6}j6NvL|#NC3O-s4T2zkzHd%ywHG% z_>cM9Kb8e}?;K`vT*IQN=` zlxPUXbt1`%>pOi0gJTim;#}nS7MOBw?&tV{^jdlOnV*(t zzw;_B2LCOCk7f;HvPyeWHn1mS0LeOll9yPMtwBn~Eg!_P1n!;YNA^Uc()y?rJ~72Y znr~EVT0m343JnA(V?awd1o*51E!9$sD6Ro1wRwE?D{ZEm?>ZUo`|@q!*3aHTH{Nk7 zUVrMQa^i*?!-;EeDD{c!N`1{qst!I?>iU|xstcusP$MeYDyWzR|Zgw0T;ZL;{FfoV9mOJcO4^G$ojQkBJI7+I6FI_elEsCetk-U70NTEpyCP9pIx z8{%XD7+F*x`ZZH7m=Hn`W-dA*)pryYTRfR5`fMFJxxWK#2J(eu5()Y$-(0M?82 zJhFy_GXO_SUm2AwT3i4N03?W=5KR)P-;Ozr`JC>r6^O}^PbF>8c7!`bGl`_5t30H{(^ObWCft7w8W5#w>dzDPBXZ7=Ji z@Z8{B8yM&Xux3b$j--GCVpP(+ErR&f2w`gm%8hBk2A+PbjLD^)1Ve!6+<-5=_KNhC z>gv*$Q*JK386RJQgde5({DboG2N&ZUB`>vf5)F5T9ST&|{hlGo$J3dV$Ig@(mOQ@r#7p}krrqN2jsYuE zv@1h^$|kU~3|MG|5I3#?G0UGv16)@9{^i#l$;->j%WEepg*A)xszrWT^78T;ys)kct=*&vSr)vOr8Z77|I&)zK?8t9-r{Rhv?%3}_vBcBl;g0#O#v&1 zu_~LuOC0(2!@fr}Of$2|aE?}dei*9~j?wY+^78W9N5E1BuqkA~hy8p=`tUknLL&gm z5Z%d8_GC=-{l2r)a=_x{ z<>fVQu^loIH1yvot)H==WfNPoi9I>?dX#-z+@`jI4g&~NK?~9DTR&mLYZ%L{IC$~$ z@^Vlz{qgJmzYe(Us`WDk%nW%B>t4fNfs}n%$ad8Vq75KoY)fb8&u;=LVZ`fk5aQ+K z<#jY*ri}P}2vFEXD~JYwlU=bW#}=gQ%VIZ1pRtLp*hbGnG``g{7Nl&`{&C>q<>loy zeDNLI_89_J#4^_H{Aa7OZRwST=!}DJ;rVfZ|}p%gf7acWlaG|KBCMLbN?Vxhg=)zAtn~4OoT% zjxpccmQ5LRyd1!Id3iY?8UMH`tjZXGG4*>_B|y1S7PPV6BHI9#DPU#O-T1uA~KT>@>`-0n60KP6a9sR=m8tymkjtrT~?xAY<16 zW$f#6pmK~~%Qk>zTd*<&u#5#N4pzLpyu5Y;Qid=TQ(2X%KxSKjaz%iYD|Mke3cxZ2 ze2f*%x^Ie?mzUQk2Udpqs*C|Ey8tCuEkL;%7Q0;nmQ4U;%=b3|76&O_US3|u6ReB{ z7h}Hf0OcxP@U{gkQ@}@<@VhoWUk4{%US3|82eeFOSGN7!0m@ar_=Sm&83Qz?GAO$M zCk|x1yu7@oFW}qytV{(nQ^Cm<4^Xb=#cfxBWm_;Z#V5tVh?kd_*X02*W7|Mu!HEMD z2P!*z?P22AraorMad80S<>lqIn?-#pvoiHDW1eHV8V{f^aKqn+F`!}>kM-l@<>lpd zJOIrYaIx)U9h~?=xRdu|3b@#YJ@Mn@<>lpd`2osQps@=Bw&I7z7r&G$;)}7@*6-6USrR`+US3{a#~-Xr1se`dd=Wf0@0pJpdwF?zT{)m- z8<64P#23W9dJp{=czJnwT{+;zfr$f^tM+~MW98-L<#oIOh=URbD*k?Zd3kwxT{R%b q%NI^R9$sEvUS1AF_No3~fB^tdYfXJ7SWKD#0000K diff --git a/rdio-metadata/content/contents/images/icon.png b/rdio-metadata/content/contents/images/icon.png index 093d371890b6760cd2a59d86f263897f05a783bd..b3955242e0082b7d49870dcb42b55df3afb5a212 100644 GIT binary patch literal 272369 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²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 XaJlm-E3QHhK)N2N>)o$Zg}wYgocDyh literal 301180 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 OZPxhQu8{dMW;-evIQlQkzH^h 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 z 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 From 02f97f4f0109a73b378bcba6fb8cf068bbac49d0 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:34:57 +0100 Subject: [PATCH 216/597] [soundcloud] Optimize PNG size --- .../content/contents/code/soundcloud-icon.png | Bin 14198 -> 14186 bytes .../content/contents/code/soundcloud.png | Bin 33082 -> 26366 bytes soundcloud/content/contents/images/icon.png | Bin 14198 -> 14186 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/soundcloud/content/contents/code/soundcloud-icon.png b/soundcloud/content/contents/code/soundcloud-icon.png index 4c2dd89ab4def721d2b517e28435034e269221ae..35933bb85718abf38d344913a4f66fb4bf463d0a 100644 GIT binary patch delta 35 pcmeyC_bP8fER)&yjqxlBoAVXEiwPuG|M0d)ISdS9-#uL%LpCQXd>0e=a%0&H1|aZs^>bP0l+XkK D#HSIz diff --git a/soundcloud/content/contents/code/soundcloud.png b/soundcloud/content/contents/code/soundcloud.png index 3155f60257e83d9fa7f3621f35aede4f63215a74..7b86a0bfd45bc5f8eb9541e422c8005e5373b736 100644 GIT binary patch delta 20526 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

G{BcRU2uFGviWV|xpDBkdIgW)U1C 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∾|=W?&S$e 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 SX=(=auqn!`yeXG8@&6xvvUGz0 diff --git a/soundcloud/content/contents/images/icon.png b/soundcloud/content/contents/images/icon.png index ab6a1bea395d23cf14f5452210a1a5d716b09f9d..bffff05900992dada69d23edb8115dd07e5a7112 100644 GIT binary patch delta 35 pcmeyC_bP8fER)&yjqxlBoAVXEiwPuG|M0d)ISdS9-#uL%LpCQXd>0e=a%0&H1|aZs^>bP0l+XkK D#HSIz From 7f1689de8fc759116ab6b62608264fce1738a6c5 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:35:44 +0100 Subject: [PATCH 217/597] [spotify-metadat] Optimize PNG size --- .../contents/code/spotify-metadata.png | Bin 381916 -> 330067 bytes .../content/contents/images/icon.png | Bin 381916 -> 330067 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/spotify-metadata/content/contents/code/spotify-metadata.png b/spotify-metadata/content/contents/code/spotify-metadata.png index 8d147f4fb5df7edaa47e2ad598dc864018508cc1..13cc7208e41768e48d6d41c6f19fc4b5128a8596 100644 GIT binary patch literal 330067 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≧v~JYk3sP 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 P`EN}%Jyp2!)A0WfS0_?7 literal 381916 zcmYIvbySpZwDk-OJ;cymQc8nJmwVsZ1j`2{kE~_f7qsK z%8CHg-Ct(Y&v^6`JVzB>X8?eJ?Cu8yq@+=!AL4vg)lkA&z$T)=$NCniX8-^&15_2| z-?-22HF^BUHs!K$xj?5o5m|h&Lnz0;h24i;8)ysAfRQIc#1leNRif<0PMOFbzqc+tbHdfO+gl&HLr-FB`<(ZRM};P}6h7G!Dw(Rpk|tmS`IrHuThI8n zs`4+3zqlcKydX5mUz1~#A+c%`my)g9`M(Ex!>ITdy)I#NOBBMGEI}ksaao!k?4U$8 z{f3YPa?ApSy5{)I0F&Nk4w2TKK363Z%b3sl3@uA7d>Ddc)<}lQxy`uC>$T&h1v@7m zS{aM|npC?)NJf^UH!G`U0XrvSb9Yj#fvGNS)J{~rCMK+Y-#$?!rZq_)hsYkuEe-ePB zXel58jZh%Yo2;=JNHd2`*_aCE*wxv`*#O7Xd z9zwd6?_>Y&@#8o6^WAw!{DBbNKznKHg{1y-EB*-L+Mwu6F`0 zU@DE`0F~fl{3L$fii^Ls6gv6Eu`L_p)OCHsy5`d^m>D}1HwIU9m&$Q_mca27!BB1% z?jyURC}FCM05TjEP-ciuv01!En>e6~+KNvmoVv`<@S{K-k<(a?v;!@s6QSFo6u62O zR0HHv1Y1Iw3u0FS)l0t|>DRvY;)+Dt@C}+1SNd}P%O4H3=lEOyPH*i`-D#=N zfx%{W&Vq~AZb>R)5d%-0(yRYm3Gel_Qpj|`Jsn*A1^Be`J6yKGep9wkPhnx9yT4zv zovrtrk_REr^i8mh?MU@CQK-q!=6U?lR)%af@ z^6Ptv(6JJIgeJE_M~sjzAZH5sFDm42c9P&=7E)kZM{%;~dx?DcLTnWVxT_3q|`fIbtW_5JHg z3O5HY%vE;^2-Hlm@L{?BrtQJ~JAa9`1O2tI&E&fGT=`+29!Pm1nPp7{)^bw6`WtbWC;K{ zd1#~to6+)e3=#YZ&&-g1;nX}BM@N_x;LO)VL-J=>nC^8(Q~LZHf%A!XW%zB6nVmiq zP;cY{eqp}D?3A~_cQQ~W7a6kqQ%pp8@Ew3VNA)@h009$G+B!p%HM|5Ro9JFwo}>CD-W`Z+Ug09&}oYCJfHN<8_m#t^WPmJ2Yn8UbzJ4 zeR)SyaCk081IqE4$qTxiu81!3utrh$xY44b?9c9o>>)E-Sf7Idlq}svj%0GFM(5TG z7z)zn^EMxkF>o`Bx5fTAQ6@lDt1%)Z+u3?C3b*2GYB6a-W`${?z-h(1UyF3X1Y zTD7GHpRNi|iC`F%eiIyTI)Bj{<%W^x(Vvn$=w@m;#x0POT57X#u0?%e>jfBNy*iim za^JO*{W!%OqeQ0r;Y6Rxki4U@?Z>3hJ>&$j?Y{XR^r3TvB=res`WorQZS8UjA_`Cw zO9m~5Ey1VS&7pJE5d>2i?SoewL&gXh^~R)c6zZ>c$yzK_Oo60GjU$H|junZSC{|f4w-250Zb59$E@0vbM3JLX-V~5(QAuF!E5%%WFoU6s+cFK|Pt zO?QfX+Ql(h_oiL>tAD@PTl8dlvdiN-+(?@0LWewdkd->!B&ek!N>BbDKrYMv0ex}b zjW#jxvyf~O<_>g)`fURVkyX3_(>;rY4=1-T`wzpHTG;xgT3kP^I|X9gHIm%}Y`#Tz zi3c%M#&r0JiRM9nr9sTt4lEC_g@f|})%epKd-I;S!u5obHH_^He1MYY3XXwjIL(^LXnfNZ}VIfD~WyU1n!NIsnkfTXqOYfbeE z)L;%bZlKyhSWSJQA|JR%t$bqm|5WH%Q_v2po{I;sc@al088W))@GGr}3o~S7jNZ*= zk;wMCTUY;AM*DTa@apd!af4bUPw~81a6!#*tHq={$KX>BVO4q6&*UQylj6@^uItBr zmEQ)g6ELqfQbZO6?><{5=*P&%5SAmgp-Bx;rI(s!sCJkQo!R!87IBuX*4*zhtSD(y zwsm5=GVc1tsLj(ZzxV6T07Y5$E%|R91nr7>h4-E{Y zBNO=|Jl;n%D1EzxAGm8~t{)}UPTJ2UyM-BoRnANBG*i~O(7 z_xt}P{3G)aevG8UlyD+*rLxXy`GD+i8jp-0#~L@eJZknl1sm0WqVKPHvGS*i>gc5E zur2&)_M8Bfhy3u4wUZM6H(e4GJrtJ}>dg0gnha_~expwMZj3d}`gln09dja(RPSMF ze5_Gs@lTl)87G!3YU@|GkI99wpwl~AZAL4dZXat;~kzbkaE(K$rr!&VS~a1 z-|h=#V4WT7-y4*n(kkjg{#k|E!0r4XRU8o&?6deHF?2_5sAyJ3#=?E+0ClSn)%ipSXNs!5rc~J(27(RZisQ5CF zfR)7{dyp`%?nuzc3_#$m2w^8_E?VTo+3S?yqj}6q26kgIzn6F5(BjAO~vSzJ`oxpyW%U$-uEdui<9z7a2L zJ;fBP&fs5k@tEVE060lV{GYVEF?uQjPvch&VymE6o+vdZ5!QwBpt@(SZqKb8FK#Nt z{1EV3cLa`3oyTtnrN8AVjcUFQLes=%LmOrudLRXXqmnzTXBF#oMPb z5^r)>(pnPYSHD9qRdDFXE7xgY!!x9=2%vXUrV6&Gm@44Ue$*BK-xF4)bg~hz!x@j#pKIk@1 zZ{MxG?A*@I+r16ddiuD`yEkH)kS^@|mQ@EI>!}Q^F|lGH#N?5AjU^1~$+AG;O(e$< zpkZBI#D?LW-Xf0mx%`07IMGM}`Oy_AK_L3|6^nEoedFyyf6DU=nhYDk`>Km9z$9XuYQ&t3d#Ty`(^cyv2a7kfdyBV^_L4oMU5DvO z(@pM=68FFGAv9A!^O(kq^BI90Y*Q?5)ib;8<#gQCm_`-(sR3N{P#!Ft)^JnU;J5}C z^Fnx}wIIPmJhH($4($Sjzr=uVx_z!Wu%cT&0%fdFDUEBQ%yq|YVZ)lonDqOEj0Lq` z4D%NPu7mXL>AWRv2a*RpEz_QUk2B6yHM@Tc5Lrr3(#`BH`abd)rY&&^w1BZ$^~^ot zd=uCP#?-uvQ{A#x6?k7bWHnIL2*(s%)+kJQ=3!h#m}!z|?f5DH@MkqcjujV=nSh1U zn{k7Zr5;ex5E0TeDIlV~PadQ&xw3$1#>~=6sH;4)40VFwG zK%aMaF&C=Us#jLVW%>mC565XM6ppBeMI_@#DIFZL=p{ zer%0mI7L_^MPM>8rSJ#o%OMM2#?Sswwz&uTCVz8fmYiOh4Dg2hCY^5Dhw)3;J|eN& zzIx0sXo|WJH5*QtGF_U)IZ8E_7CPU#BZbs&-whtlQSV7yK62&?~j51;7WZFpQBHRc=bgC=*9IzFJ-^To%*uWI87+4=9%TpOozCnE-elhGgJ~iVlr&-^Qm)Y;;I~L^_bCM8#f|-rnW}*~lztbW?T{!>BRA{B2hT;lK zLt$E%e7ezQDD!Of#;@sC@wS88FECL%y}N%Zy>0O7IoHW1!C5jE6{cWbRsr)taL$qE z$ln`^kvaTL4~(-~s_jA@xuq?P%kRP`S7zf=nr*w1nkG~>-l5D-)5uvUGW;2{La2x4 zG?N3{mjoUkSHGc!v-Z5MDyntv_Ytc_$nPz=f^e*eZK&CWP3u*9c{CkN_{?{-%zLc0 z#5nIF{{AfO{~}K2s8VJ7D;u$#lhKtBOzeHW(^n9^_Ty`h)4^;-%#kZWdn{gKqIe@6 zEU8s1G_PI#mD7R)9kim;l)>o1^PorH+qEVA3rfJw_*)C2nn0iIEU3}q`GRj@IKTyI znJJz}4QiGNRKyofj8bOB#|fnl!NnE~hJjbv=D}Z9G8zTL@LcVsg97KGOiy?b5_? zf+2zB_$m)h6=~dUD95xcCSmb|Q)Vlc%b?r$(UaC?5*C^YMbBu?o}7lz0ebn;fpK#H0NJdV(C{h3)mGLJU5om);NGnsp~d_T@2E;-{L$~(Z2baHjy37EoM{-f$!me}hC_!gnvt(mAl^r<>v&;U)k|t~ z8%45`b`Prl$iK0J#~|xp_g~YW-Ja1V{yi`IjdhV<(vrQY5aQK5H;Ah$9X>O7X@c6r z6sz5Tk9HA+U2SLiHP$@qN1r8l?o{x-@BUD6T^aUyw=s5x@=g<|cpNkQLy@xv=n-w1 z2;=B*7!9wI)L6i$^1MZOT-m(=h zNMH#EGl#V46LmVutdXidtIhrxN`%13RZ7B7-RAMFpeJ+K99;Tj&80o zK0ns>@f31l9iV>$6!V|8v~4nzycm`V!kk+QYMP6pU#jy!DG0EhZ%ux;9h+>|v$`%XWi7=t7S5JY?0ZLdKO%&qL%s^ZybCUl2 z8^?9CcumU4T>9rqu$K;9wN7U30+=_`KU=pt>qKFib9MQNfVj z)xk%E$ks>r;G1-SF={}vh93TQ{`m%p$xF&o=yg=`Msp4ihPy(NmAeZmI$yr0{I4#% zF@DNrGGqnPn`iq7;Ef)EJx|faHJ9atrs;?uyfE^i=jUbWQA=dRxpU+4<-H+EiUKg8 zV1}Lj%Tim&ch!iE7V11BX41d7(;ei!&zvqAaMSj^SLT|279KvxkwgV{LyFoz&J>pY zXT2>;_gv25@;q<)X*b~Qv64#1aSD+1VH#|ubLs3&Q1*`fzq&Yy_?PcDMsjSFd?dj z@Z}{Ma_OsVeWt3L_a|FHZI3cnpb zRD4|#WYGFo`pEQm1r?JMXNgSICcjibLCp|Lf&?qqGCk>WXC3t-k0{YxK33MF2l)>| zA_8Z~nTI%=U<5Q@b=Q*QDU}e7$rzq<9mTDfsis#q-}S+-JYq-iFPmxzzw}*=bohc< zbAOusdX(n8q6|d)sf|7aAV(rrd|`i8Fa*oss`O^lJC0LtoTl2L8RzoA7w6!c_!qcq z%WFGTw134QGRjU3HeH$I`&Xm?H8f`5%dZ%uHc6JFe%vvqWpv7TRO>q`mYeW7t5qf= zchJvbsSqZEt4HcsLmv8+%pu87!WWDbRf9eqTBPG{^8IZn5D!yaK_o!RXjx;ZR^eo$ zsX?dZg)g7+#6&i18GJ^aOqQ(iwZ6DrU&{4?Ra)CT^L)GMpriDHfa+n9XJN0eUria? zX|r$8S?B8S%s(?zT2{t(d0XVTKmoG!zY>!F3sdo(tvt4ZGJ`)>Nof_6! zT>$4>PJ6`U?gixhI{E#3GGEZV#7~OXvKu3%z_-K2~Khu^)n4eBe^Dj@m ztjFdf2gJw!hM&=!knff#4I9@WM~e=t7pb>IUhLGgY+fuKz0v4#r7sJ9Gclz-DsKMT zj+@Bd54U9Y*!8wsm?_QY>YJ+_W8}b@R%-`oYT0D=RCuW8P0$1>NO|!3GWmT%x-Q8Qs2>=`kYM2f?&^PPVFSxn0|ns_2pi=hlr8SrRMVTWR1!200Lt2 zqLGkhgV_^YYI!UP=|jNd#9x)>wKgVe<~pQ^Dm8LA+}C)_d7ZDteP1r@e<(AU-LFDa z4v75;6zA9g#pT}2)L7s<91ZutTB8^OhX!?dpi*ut5Vw;ZCn>k%ew{ieBFf-w$4Pf} z#veR!>W~TPr zNn4}hm?ZNp>TKNUqKao#ryr*ojx$uB>%LaJBSe$N-g5V9OSfdq+qskp->(`%#|EDY z=I&1zWaLx_j05_6BAe`A?)lq%Io{{hURN9}8mvDrnC#x>3Mg0Y)vSmw$` zF(~7_`<9Kv(J?8idbQc`u-&HtNrXJlXm-BHKn579ZVdil58sHg+!$ughbIp&eZhua zk01Pq{dH%L#<)=HzP=}RlPjQ%*+x&b1hzS;tLA*|#{=w)rA#S_lE_5V#_3dg%dLht zs@)hHG9j;+3VK`CeaInb^4f9Lq&6~Tys>lzJaP+e`$YA)k68Y&mpe|>)c=>de_bJK zszvpGCZA{4^zbw5{pqxa)v$bCrhlQJJ{fs(!W~TJ4V9+9TY_ z&9H$^h~wXt`z}v&?mZY6cHqfyXNJmGENb4tsy{c|#J5eTWO>!ErHm>3TJKpbk6ceEC&cPytj-OgL%0 zJrO~tiHA?vH)9_R*yytxE#xJtTQ9{r(}dLwcy*5wQen} zvpx5;1Ly^!`QuRCQl7Ju#1#7lpCk5Lf8k*CFc~bOff$V!=Y^9eP?tK-*&J;w9Cr9G zIP@HBBk(i&?6(`${uOw}sK~!A5=2%Omc(+(bv4WE4aq)b5T3uySzCF3_BhPA&gGHs z!RiC|oB2e?l?`FX;;7!-CbGgpR*FtID>s|v@EquBo2u)PRrs!neaNpN7TAnL#gd?EaxCH8oNnuOUrtfyC!>*p$zQz)K8_(LA^=uj3oP}_^evfS^kOJ3mV%N~E8Oqs zea?mnD_W#>4jWyeju6hqXd|G7AQ6I1-bQW+)q&>qY`3ud)`4+7NS^99R{Qc?PIJ2} z0D!1|Kcs!}68w1{Jw!WV<$TbQHA^S=*3cMX-c40+35#+dW6QMKESyYjj;v0QnHy=` zCm?qzPZ*FLEaHUamT1b4EM-NRf~pN9R{e zS>Qe475W`6rg%U=q6?)dBtv+NC!)RdxkToovq#pR-g#n=%xS2%HvzdxLePMdeeQ{9wQi;9lCNSv+VJ( z$Wg?%Nu9!ls->GnBUskEnz4ABmwD!m}2>ebv3_`}bFnTnfMbL2NI1(eKLJ zr)~_rRI4zuhsEwS>-oslUIH zXL@8fg;8gie!l0y1jaq5RE+XGQ0$CP6%wE^0TGpkFB{8LYbQKU6dzT6u;x^`VhZ_d zXH*7FpL(Zs+u0+p@)P=kBiV^$q@l~CPh{~xdI5A{RBbpkRKgT}dqK%BF2Y07L1OVS zKxdj?o+lhDDNv8FWFGNuzGaQ!%F6h*uP6hNXQ;M;iU~-UajFh8IgP9HxNjSR_)Gr+ ze~=myh#z~Ekt-zrRCl;@QOSgLspV?@s;+;j6Ae@m`o|WJ%QpsOf$3K%us{NQt0x3a zEWgFh5}ZVJCO!Bu6i-b-+rFaBo|PCkT#7rs_~cP~icEgMZ+K}rN}QgDp>I1Y=g#L< zrI@3)o+9?k$<~ZXbRQn#6xv@^}@i?m_&c0uIvYgguBXeOl%$AX`r*d zVF7-Q%w24z^oS*2oh4o!SIDRkk8Xt2#GlK{l;Tw9QRI~~=GMSv$ZUqGuO6Q6wyqb| zv0ngMqMAyiw9y^hs5TxKU#?tQ9@vC!qvgHFBI3bayd?jCQpM7wD^3Ars zmA$OjHuu%!FTY4M3CCP*H-jSs9kKKLh9vd5-V_pz;bH_A_6a#ikeOutHtp|m`%VW8=_OB)hYsY2uH*oeJJL0p-?WKIZVwa|a}%V2Tg9T{G+hxR&Dvok|##chCC7)nbWKMn@^oXF(TqYojKsz z`#4`W&G&V~<+|q)rIb9Kq1@r+hbI!VZikuB#q(24gC(SJ+k{$ndW}eL?Xmz1hNq?R z@1|d|OJ1~IF_3wUl}>q$tnEk#B?gQzrqhXbDZVPlA6GwrchV5qqPckk+~;ax3BEkQ zN#z*drFaK3f)Vro(jHSIE34M3R3B)fmYozBj*=|wQk=I+xW1%gBbE1FJ&8Y%+(gmK z*4~O3=o>!M$gXBwFV+CaLV03lsER68KD_sT_v|N~Io6((P4J5nDtoo5CZN|bp!n>T z+;Y5r#2oL|Mqg8O{@SLRE4zBd~F+HlYS_^5Q~Fh9!nqXx2NhersaP zvoiHFWvDBP%gApE$I0ZPG)#_Covq9>wv+yuA~@uSS+=wDw&9G3&DTn~hdOC@79@>S z^S=Q(SRn8wJA;r#`VH#8&IER{O8n*5&4YN9F4vR%U78sv0`JRp{`c1xY9!+T?a=(p z0}$)G6sbv)r-e#qF$25ng;>uiEJArQFS*?>%|?ZAm8PulX-)|~m=SEfY=f~sS-Ga$ zT{PUgeJ36T?ppnE6qV@a+u!iUd{ASvyDsk4To*7*ae4j`nhN#oUV4+1%pqj<<{PyK z+l#KuvT?ILUI}-BH+Bnjz+pFDZGA5+A`t_UX9X-uSa3C|lk5lPALW~>67%IsV}|j z7f3DdH^MCicn9Bns7so5o31jNkC69(sjnCJ!G6fJZ%;1H;-G1a1u87#tGJ%_yCG-6?nZe1AKY=H&WLk+Bg`lOmV7gnc6fS zv$am0|NEI+9%1k*)W;$K5PO?}E54=i@X83mfH*_zg1j6^nc45_F z$Lbw6IpD6@Hm~vDqp1pt>;o5W3ieOdPam&q;gd7`%MDaA(bH^K^mHaKakmh|FUr{g z6*D$0r!x-=OQ8l`*;&e2*-C}fd;QNI#9X{mEcsUZs+w8yT1jTA1`rjY|8u88_+vih z@@e|A)7Olwfc*y()o$r>XXA7MT+G&;nmDk0oqdFzt%RnF_;QN$c<6^5ds(#Ja0KN)3^{ zXXRG>!i?#Ygz+(b`b}5!UxKZ-`UY>fGpQ)V9%gDj$r&;kMtz>J%7b4NKwRvW1?{&s zTUNnmuBSS6jN4c?^m$mYn&nU;^Yk~b6-m%?=GS){{HnhbwAC7i9jO-xav4OTY!$-I zZ?gD`brZe&sqoU-@_v~M(PQ;b`ZtT$oz(hl&Ql$IOKb_M?@S^MPR3-$ee%Q6QQ+70 z@|4=T<0^VxAgqliVEWM;dT=c9mo7qjs37_M3=IHv)_3t&&{dKv@OU-&mgB0N9}nsYJ_1>Cwya(TIToPV}s) z6S_B>=Q239m$RsYQ)S3>cLq9n!^}G+Y;O3%(fWu}HUD$2DJ^(4X9m4drt^5Z5n#%Z zKt4^{l@sRJ`3^mlZ? z?(22(T#+j1v-NksHn2?nf9M$kAvW1n2B83?gk9F>fPa4NCyIKrSOy1gr@T%6?bKgm zLSun~-nGWc5T*?9+0*2WweegHavS3!WIf%=Xe9D#N-~FXS(!gG+HJTZ;&7?TX33~$ zUcP2&3H!6{TqQXA?Dksuz1*WTFTc|oDhu79=O}mKKhanR{llzGW zEH&sPw~F*$71F)Y{&&~kUN}Xt<3?fsn$xq>^JcCE#A0O>*rSCQqBB%;Dnp_v=;x3R zM0CwY0LH>P(rGn5P6ZqUwdRnlMeH=&fEM4iHJB2g-mcNz0`&KF^=c;int!MRKa6AC z)DrydisEC!|C?hm?*RSs&ZMN-jYvVxL9}=yvP?lz)?(P0caHnurLhO}Fi{FQ$DA#| zxm^}c!z@B=DkfpiI>}aP*|3t`;qON29xDVfaJg}K|y6Em%DU%_5ahwh$Hlx z>lLKD;E(!eo{0Cr@I2(7bTdcF}b;*J)ScmL${J-&odBcZS=6TxA-#dPzgRhS2 zy8e}iYhALRDvP7`!)MgOGa*@?q-}STPd|$s+TLfEr-6CYep7JZ$;sHfYjuQ!F4Mt| zG+Yn?Nh%dq;n4lwIo&(s|GWO=fGnA5vg2^wz6ZZUWzh<12Z2^lshl#QX#WJ`3D!&g z^bVSAl7M=W50B^#aMN>s{~Z2=wb0$U6sV>36)-y7<8{XD;A7mf|M&w$ist6zSIq^F zT2z4^GpBjlLt3VD*&D*kgptw%6w%ICnFI{a(EWtb1e@p@dV)g5UhSZtlWBf&#f&s0 z@TWQ9>5Qo!HO{FRT0MJbGL7ep(Q9sghX~;egGxGOjk8GTAdE)%ZYj-H#l`=Q8pOCr z4SGNfK_OVjjOnCB^AZ&|SKI8~oAbuYAq|jDEgWG5HVkJBDjE>B$Z^|;Frf)@3{em; zdp_IN5Nioyo_YB|>vDF|qnc-bQIrP5Gl#e8r`viCW+gidU2x-7ULpAA<=5=uXJ`99 zU_ObBP5TNo#-E+bl>dR-j0G^Bu$KOvY!Rv6q{RSaiZHv%4U$L(KFth+^pk^}+*{r| z+u<1bZF(IaAv5Y5eLN5OA~w+k;Ynfny$g!Abe5kUkC4EAXNTXmf9+ZA(L_8%a~f^O zRW0Fjr79u$7BZYFT5>^pRsi1vo1mxJ@0wb5Ha6zMn^a5rLtGwYy3HZ~>Qq+#Np)Ym z9rDf=B=0RK4`e12_l}=eKxY|b1S(V6Q2FiK$ z9_*0&Hl$5CM|0p34xTzVBzp%&Kz`uiV$xe#G-WSe@M;74=bCrRdd_aHP4&4O5IUXC zm57oZg#O_!Dj$BhB{lBlgRMjmsm;gP=ROZdp_%9JX8Bki+xn6RH;2X&%jeE$6U50K zMbCIebqKRHdIJ(17+IiOkcHfVO3UWtpP!vP;wsL}cT&*~p?PQK^y<9OV$m~z_DTU_ z*(3;J&5l;oVZqrfv~(sJ?(Zy7E4i{d$e~~qRieYU5N2}ZW2G;(1poo>YE7kSTDKiCMM4(~ls(s{ zroyn!E_ztZTnLl#Tx}NvMfZI9kyEnBF5Vtw_(Bl-S4$J!Hg6*y>OPeU%rD_uJZLR0 zB)IE$5AWTvN?|vdHZM(1`9Kq_}1 zw`=v>##zk}`^D?jJ@DtyY>fKUtwn)+r17K&Q!wz&jHzc$HP@r;XahNi(nqP8HE^hb*Sm(Z)`mK7|XF<6Wl9Nr23FZfY9v4R~y($wXt-B ze{IMwT!Eiq6I2g_$-GgkeyzlO-dH7bNbX~|L!`jKlEZ&yJ&Mtc!GX#B0~=0aLEqhG z%FqrD74puF`Z8AeuLqb(X*^6|PO1oK@rgFm|qa z3_d9zf`89|W$&WA1s#2?N~3SQ&txT{6RXrp);uJ=5`8xk+uTY!uPX+tf0K{V_2}&< z{Y|+r&JsZL zomQnIApC)2tJ-8(TxzB}zly<{(^Z=%bCV%j2W2Ynnz}#9iKxs1yLgO!;NFLm?T=#g zH1idsa@Smbq>cG17OXCb=)J7ndi})1?(N3;#1-GZC!)kkFS=&wIIG6VGE6uf?7P=A zfTgsVHgES%(9g13H# z@T)!4?fV9MIk4^8+J4APa$k7i&_A_@&=|1A>_|=_jBPWv z*wW%D-j;*ulP^7rJ^aLhVx(UzV-TT5aKV&#YM4VgQm}w3w=2D^n?X<8xIL77ahPmE z-t6b(K@CfXqkllt7rgyXN38b+2GqJsvTi+pD=zbdXsT*a?+D`8b;51z=lVgD%qB!Z2`Az6)9{e;tN( z(vHYc1~$f%#2L0!+7v8awit8ciT;P2(1bUXZKDurO93>0#CNA|FX(~^F4(ff_nEY3 z9VXM45)h*iyi)kD&Qc0JQ46gPf_BUNDk1LdsGGeBtEQa`n*3HH|1PytWWUZCY6C&0 zXzIRT$kgih>2TO|b6lGACRj%$>In6NePztW;>JytyI+6p5Pdk6;A6sjFr?5B90b02 zMxCgIO)8LhD-D^aVm?_~lp^z6|I4&Glh_ibV}_f{QcW9hKy4Z!rp!#20G%emDAXM< zYR~Zs0G&ypN8peVoOn=WrLS-jAWQu4+h<_YfQ@wwl zZROT}%KqjJucvqMD#Y{+hGz-mb};-e2yd&I*F0}ZsTdk10TM}~VTCjv3|+3;;rKx+ zQZH0kLqx;Zk*|r$^Gr`E_l#mFrhqRYhr7yx=!U7n{y%4VTZ-QBEPUG+2hRBmF~obu z4RHLlUUs$1DFdS_mWk>WPg2sd3o@sS2$0Z;@405iP{fLp-*uu)%WMG6Ti_h+8}Z3Q zx2ohm)T|wHu)X=|v;hl5=bQ4>u$OdmTKw8gKeMs^XMsoFL~a4)8ZAo z2TEF>c+Kt-$x1ZDNJO)Z3|I1}Ia>b!JaihQSmc>ZV1A{|EuCbO>moP-^Jn&rJi7;kj9@m+gk}gub zGOe&?V}s5i`m}MmX>QYN#x*@g=+Uu(msEH5{*2mLiJAAcO%_Pba15h^azwQZY4A9( zDNiZ7<7yG`YjyU3Gkw=$?-S;sYBZcVFcRLx==>7m6DR#gk_lF++wdhX8V014PiuPv z5c3=Q#_}`>QQ^=%XLNijR(dYqH(QI#+>@ZVxxw>d=kMb=;8P_MIxHeIUwd2VC*Feg zF@Ko{=myO;GMi&R1YlBPRYN=5*Z=-DI~IN6i_Om`i#`2VkubMFZV%H9qShqzjXDj8 z@1JyC`%4jM+B))i--!x$HdXO`vH`GZVRH&U^N(NZe~ha(#_wAarWuv6!bV}69(E!h zP@^Npt7%WTE!$qrEBN@lmXe_!Fl&C_1|f8OYrbS{=7aUs$0w0txbEd(p3wC1#-Qkr zOH{<>(%uEkJf}vMh{gl;giQ9C+MeHw9v{Co1>kts%A%d}Q8lJ)G$zXfX23GWIwy7@QXh4|X1x`QWiD&r= zdM#)`YyN{MnLV5slff`t@Pl#tbqvPUEqLrg_wt*JXgY?c-v>>EsTppG2jfQ5MaB^C zzJz_j7x3>$z8I<>g%^j7-%OQ^oOwSedZc52T!?5IQzIRbY%0-?K8q#TvTOdSuATip z2(=I;Ae71Hk`bI9wMlF5{fK@wL@geV$X+slN&Kh+y|nvYH|T@u+8_7!(bOiu%8D{R zJsK+>h5L!!zbVTIYxmdfR#;87pXPnmx-{21zpiPGub9exgrLo^Fo2VzDUu8Vr4GA2 zt<`#+N3CuurvCo3_$O;zz4YNau!-nP0Vq|~;zdz(tMnY>{v=gk<&*$=)C;?{Chn2l z{;OO1_Y!aaxbb4@@-$dm2vVW&9w=?)KF}baWHlOn?#x?bvzDzC5o)*p=kR!aP)TW1 z${7o;>@VIz?{~Ix?l9%b1bQW`BmESFX-*;7$*GbU=0mJTGX@L zFf4&cf3bL%{MbZMTOAgkPz7#U*-eXYHTZwosUSs9U8o!=04s37>S?cQhR#1rTkfoDy=SdO{93oM^fr(9 z$^bk;o93)F!ME~O=56@;zVH-w1=F^O4nI4Ef8V&jn9+fLrJ@vc=RJ_`pHZo-o`#wUF_tWG` zW2=AH;FO@k7#l1SATB(0GZPbJh${`yu?0MoK!O2b) zYuG@QFecLl`fQmQoshlx^J??Q2t^7V(+`?fiRn!>hS7*xnbGXQGzX-Xp362T<&pi>_{Nh%?zy#RUj~1C%}XVJL%L$2jwhgWT+P~aJNSF zxaxuMG}>pVH2j~_p&d=WR$Jg|#ZVVG!AI(ehpp>Ne-Gi-7sXPR#MaJvjR zl3Yn(z@qD(PdFsCTxmHrT1!(saFWv5CO4k)BRF`ls{LX|n?A3Yzajmi=JnjAo_Wat za^m7VfM&Vgzql4#V)1E>Y$*$`d>M9Nb9KaVV)#2AwuB{0Yl`}#IukIqcZ&3Jv$mLIuw zG*J7Par{HPqR|-GaEvrrc|Ee4ee_lA7^6N)$&Y$zQE#NZJ6}e&YnHzXH`ZyJIB?(3 zqsc*x)l(MZ|IzeS0c|i{)3`jiyIW~-io3hC6e#WvMT@(;6nAT(6n7`MYmq>a;O-DS zF|_1TIZ99X%O{wr1}w%XCN*Q9wDVGx7Ir-BHBULS)Zc{2gX zamOw-#2eZpY4Xu#aFmlsct|BEykROWwjWIB=IaJ;l&kcG(bp|FiZb8!>NYI6{J6^> zBMLWK^*q0aO^0jp7SdeMXND7!U)`{UD-&Mk4o!LvHGbV*t%QE)$g$vOg?gh_U~$9j zgGqj}jOMtLlS||hZ1opmE$uDLx;AdF?3h|@(^%a}@o1VLaIM)hV8tX=$lWfNRJHCW zEG%jXv-b+CIi&w>%yU-8zh*`~RrXRK3T<*S!@01R9TIrKpNmm`!rB?h(%V1R-II^ISlI}J zTOpkrNiZ09Uv57l;2Wr4w#lFA97<+usI#r}(G-Qz$KPfF3jg-36P^AlIt{ti|0HwU zx$A+||6q@^H>P!(D=whU{J+nX)IW%#Rr?0%csS`rT>DyvoEN3c$Yl)gl}+sj2$siZ zuX6_7;WCKcvM9oICi#o6&rYjl{hFNuyqPF-vet^78)DPIt}3xS0^kTA?-AKP;jDn$ zGbS9>%zj*4z}_#Sh=nc?O5a|S z)M%Wb04pIG#KKUy5y1mPCU>_BibIQlx&7`iv|}q}6iC$$3Kc84)7q=S`A?^z-1}F; zKpXIZ7o|w}yTFQ5iQS0X(~kBE*K}e|n9IWbfgheOyh>L#0FJi9_M1LAC&FjUS61s} zSZWlm!iR1>5A75fsAAo7*P;Ogz5c;5ft-*?MEFA94#JgdaT!E-;>}E8)`+MX?!_LQ zfGYK5|Gb(UdFcaen)G2g?~#pXSF9d@Qj1aN{UdOjcDo%LdQUHk%TocL=m7x;p4C?F zcAR*e-HG4rnw0OnFHchlJiihQuN^4R7}?89IuWh`38`YWeE`G)#IIPp4%VVLf_4UN zwoRVd*US(mr3i5&`UZpLqLqgM^1bNa{z}mu{j@Q#VD1Upg#)YJ&*T+vQ6l=wf_-{i z-Wa$_#1e!?=ltic=iwNM{_*NeINO{GMwDpYEO{=^dv-&oOKpq&;1)vxfvc_kL#O7hb@;<-g!u z;`qHVQn`e07;-c32q;wp0mjx)RA-(whea?cHJ8Swx?QFd_^o7axQl|gUKklh~%q`pVtTv>Lm`fh0cF;DvB+I zwjXybkvdwOmdOiio2_GVrwur>YxF)8|LhewdXrQeTIm6qo4V-8<xW29qMb&$t*l1_hSe?)FiIwVIl(- z6YAq0TAH%;InVNYVcX01fSVs0I}z#5(p*@s+^Sgie1rP;a@n|#@l>+2pGeXA3qP-# z{s6(*p?y@`f@@XUJ+1fFy?{S+2?LAvm1dri5KL3~vO_9}nvy8&K@LFAFTobEZmagQ zHwNDoPuu3=Hl=X}%-is%`vm7X#EASLZCCzNt-wxMB^Y-6{@9a3M=OiWo)|XgS)v`ydcJbUwedQhwB6eh z^@%n(8}Jp^9?g}Q7Pi4ZYyXnbWUz3*Oh#f1ED@haETdeCwme=ve+Og{k0_rBKxgJ) z$F<+4JvObO3yHQXdy^xrEyIQ1N`xb9b(Wys^p?5co+&SrXmkHet8j!@k=Sa+>7$uo z6;boZA(98M9?~E!|9rPNd3C4D=q!f5YjsP)Gr1w|vzrhHG1NFa6aVh_uEK)~V@ZD& z6SyI#Vy_`k@~-RD@wSKE7Y1FeE9xmQ7>(X=pgFcKWu%9N!d}NZPojQ#1G63p;0OJOg^>xR(N?0b|NF~o^vV%o(>4Ty?)9big2d1#D8uS& zBdSFAH8@jz5sj?~m#>!$4y!Lpicz_7YSCW&a8}#aD8$xDlP7Q1tEh$4<=ZJQDLZ#> zwe;pGi;5c|LdP8`Wvkys8~WiC_0}V#T)PYRq?^wdTtZc2TN6+SEis^Bsn4K3Om(k` z{V1C8n`0+rg338}1e@KiaGXlO;J&=@tnI&=Iv(WPw||7aa<$ira8@asoaC8U+rx)+f!p-r%ef$&` z6Xj!s#Knmb%)U9NrE&%8y0u&TS?hr=NhC>Stca7YxMhl9Tawd?u6G@NI~Q{hMuagn zCG3o4s=`69U$(3lLu%qyKf5t$NG^+{u>G1O@ce%Iy<6!~FCb^Z?L5!@z8j*&imQ7reS7v`KW{^I$YX0bGnbX1ddgI1D^ zPy~^vksOD(0}GmKUoK6yhtdHNf*}=jI<#&OWQ^)!USw)40pJjHW)T}^ z0E)j~yPs%t-(SSTRPVnntXg6E-uVD!^y!M1Q-m!;+N_!hW^WlVQk60>7O?~c5%Q#4 zwxAJzW9k+;2K~YSa2oX7o-t9Xx$=7!c7D-jZ&izXdi}l z@al)53=%n>@J(&EP<1EJiICDpCd6b5N|J)VTC!4Rm4%UH52$^78oeuAx>K7j&whcz z9tB)r*VATsSQR_Yt5Y2h&lb4S()4Rop!{+Ru5d zjXRH<{`~$9=Yj|12Mg^q&WJysLgJ|WGHGI5ypCSJM;$%B8TP#F6jz{`pPym&`(qj9 z1mdb#O>K5SBNw-RRHBQzI`doZTC&uZz@Y+`-}~3(?djM+6+6gBNODkg*P5A6o-9PF zDO(F)VSybGlyt*q9-1Nn(Ks}d?iG)Y8E5l=zmt^xWL=($CRGW54KxfbHSp$y)M&mT zOy!%yj4tL0uu18Y#+YDFK9Op4pp(NJ;bDM8t_G@zyBy?R4Lu^l9ax1inidc=WCu_B z1pDJjXCuSov1m0`qkQQy6%oDhFEz6@MbWMLjqJqd;g{<#JkIbc6INGs({n|kBBnwT zANS)WC-(`jJss^Qw1-nBSpoZZ6ti7<#s~2`hH%zzyE4O+)^Yn6zt?=g7YlA!JMS|V zt-Ns`-RX_EW4wYLLc0mg)CtslYKF5~hC+jKgvX%vRZMxo`R zcceXgu_VM}>`3}VMuzEnpZ+fPP8!`KLb^EXR|qpb9@_~MHKnHKsrONE=Jdn36lkEj z(9iQ#mnKL|ooXY(kjFADY#(LRnrk#}lJ_mo5)Xb>0bB?I*`nFl|Ei7i+B<8mdqx@|Yg6XA@uMT(aRj zBvbe>+HV7jD4~4=oc@?SHxtH@4%Ane8PbkOZ?7*aCKW;2JVwQuZ(33dKOp@3&~M25 zlWRG=B=?PNVTe)t$?eD#xD|rB<_U`8dS`OLTw;|VFP&0UKo_AA?ml%LS31g3Q%4<8VcpTN(R_lVP$k=XX|&y*vJ$#LsT-1Qf|AE?}I9 zM_(|po0)V0jrlN{Z0rUSqfm|agTPK<;3HtDl%pp{DVP9ta3nEKvS~P5x>(ckU7Dos z8^YKM^26()8T*wC`UE++V8FT8VW^4EFoik*%F9A)h`W!1840hNh)E`iVvg2N7LGY+ zxj8AxXd(n{)?^6(NuKd3)%&|E!HO6jLibs#+QB_x!}JP|_nxHQcjnoZhA$2jk4@gy zolXhA2@dD&OGwS%rHM-1&$dbo+Z08vm;`1|8aAp7kKgGAF?_S0dBiE}oKENQR^g237EL;{;}L<*5lsJ=gl=8ODM%=Ws<4rMRN{u;CEtB)L#0Fg4m= zkRPVJx=*(SAjx@jw5f;)iAps(#(y_4`TuWXSptQWhz3J8=R^zK3aT@7;1TTg%8WfD z4p-7ODGY)qgKy|RBH^(@>ClVBlZL}IV-^|p*}z>`u~O1Td}u4K7=S0%Z~4JlrL0=S zY5%DexdcpJ0S@lG_zK-1KZ+T<=_yLblaEhSD{`)(0Pa#4_p`(c7Vw7@Ag69mbg1|$ zdLIJ?qZ_|G9$u;Zfh>A$+$}AaeRAr9k zJS|(WX&wFg1uI4W-S2$(cTq{l;4(R$N*-;l4jSfg*_RjPP=sY=cT>w>jW@oYP`Cg| zob^#cdt?uNdpD_1aZGBM%u8qAV32YSbRDr-V`FJ{I(S5le?vs42f4A=-#XvC4u88ICFh?#k_PySQe(q=(1N+8eWOOM_bTRGcZ>UTI}dJx z@0r*n=wtd2&fu9d*!_ zL?3U@3yaI%03alT8!kEyrF00&LOFxP;uh>p(`&qfT2X>tg{4FU8~LQPeJO&io52i6 zR(^(CoIFyVJ(V8go@s>k zEh_Ii_k7P)Cu$;U2b!F~y8)r&8~=f2;@Zb7fqfupV&?#SJX#?%k+z+Xq-}PZC#9E_ zG2rOQYbXbD$Q?W-suczlKs$qR`g`LT9+?QraC!v)9kv9Ee2o9WNvZGwV`#&l#|Bvp zc;vpGD6yCIe3Nv*K?|r)&;36}xqUJ`IW+x#j^40w*4-ip?5E)x*A1W`n|yCxiK@!z z)3arM`EOoN%w>VxSf@LT!*`VgegRtafssLmY&?p3FL&kJwmXJS()Jc{Im+Q};|`6o zs)p@l)ABgZKI=@m?@vyCJ9<EduvbR6d|oQ^LsVI&>dn8!)6?n zh~`OdiTG28;qcsiUv9i|9==4StCkyt8-B;&tT0hz46~?F zWqn-pMLwBRK3tW{AoH96*vvHWwBeu zNF9F{8XkaqfgmUd2if5sje-}J^1Hs4*yud$1RO7xi+kJ`hON+MhF0zPqxSnK71+Sj zbxDMXvzZa;wESqbjKe>iCPYl)N_ybhGkoHC_+y+akZ^PCq}*b)Ip~lVORK%S3M|mh z@8w9SrBR5G^vbuHr>-VAgh}CQy(iDtN>uesHp51Y#J%K8^5@uq#uP%nWlCV&hsk2A-CHhPG*#r zmv`3@j)4|Gc`TX0rO$_C%Ygb`S`^|+GmX@_S2tc({E6JE7&E!O!0f*WX>QT~L0>)Q zWy7`5oKyLR&Fj++l;m94eg1lJmVPn3Pc}kC9mSjn7XuE_?Z4ni)>V8xaq1|285b5i zd384QeM-*bM5Q8Ui~Yyr*Qu%Lr_d+!pzNg+{zr|~g0CAbpmHHjrr=hL2BH)9PiP*6 zLdc+U>F-HYCW-km)TxphbSm62cP3#MUl-7C7s(gLmp{FH#gmdpkVdh9Gkfdr%ewI< zUj~lY(&qyUB!wgZx!`fIu$L%PJc4c_lp6t;K%RMf*Etf-bUZV$%>_H_23{Bge>k302o0s(9X->@p0tD99SCq*@>-{zi6E#g zkj-;=G38H_v>8cuvuAY3m#m#AEtD+W$ia?@PYc!=lyt}hp5@4$b*;2u-WHoNxAdGh z&y}Z#Q2VK+;vL%F4IEz|R?bO8KILHRt>zt^WFJ;4pIRdIBhYc6yCYyE%k)liS;H8F z8*cbM?P>5hx9Hv#XYYw~(9w^e7fc~UI$YU1$tH|B=90gABky1F@BVn_YN8Cn!s$jB z*}BHHjBNP^+j0eu{m0U@w6kL~-4icEQ?)}7kN@;~5c?@ZZ%iN9cz7|e=YUj!^O6pv zMa|PUm*8oqu(U<^CHy+Q^=Wg@7>B$lV+XxP9sk-nF+g#yV&sW|SkP>btP12_r;n#t z>s1^2HlwBvd>k?6PQDvtAyx)|zczQ5^t=W&e#|Pvr!GEm04!N7%xVzvX2TD6_`65) z180u&^o|h?68<<=aVAw=;M+L~9==YvGi*-M$Wr6^f3G=dUydhDkTXhA@x!4Gfp0#B zS1@=-hZsgiJxsE_0_>vH4Lb6&UL-}BV7sNCUM4B&wkrEuK;C?m{D<1nR+{xQa#Pag zp~-MUKNVj$5a+0+kV2oQHy$6oHg4lg+(rUuq>Zh=;|61f3Z<)erl6_4DKGrmlT-Tq zxiwqzVxp&^y(bO60Ln8$H(Q=+*KJ(((}cs2A!^OGN*qB9S#WG4_w7;#97~fJ|9$IX zMJb|^dXaOxKmD+Vb??>ES;jM&l|qs3*OJPW?FAq^afoqxT=eJsi(+xvWJ+e)BH&C2 zU0dAcH;xb{f`|$7BOxBM-MlUIOn<6^n_bzXcWHjJNI`Dob<{4FTd?0vXG#O=(F}{86k{Xj%JJVrws@cyN^9 z2~-QhO4d&1>CN5`sUQ2|~b| zjsDLMqwCjLjV3||qm$|%jw23m8xglDNiK)Hk1c}WKyE{EJkr?#413UYy`zaXnZH-~ z3ZnH75$Q+cd1xb}6_MgRHo>Pje-1PXpGY1})}P+B9rUHrn(ZQ4noE9@u|-9oEvL-3 zgd>Y)CB5fDD7m=jK&HbLig%<}TH9Y0=(d0PomDN4A7TvcY;pJYM#vX9#J=aFbY+1( z!&1A5X~%A>#94qfdSJ&W7d>2d$pIb) z>ORuL|78KLfScJGFX*CMzss$cQR@sWi%G107lY?uRDfQ)>wh;MDSPgB zDX|PvD5cFNQn;yNFb$NTYEMX?iA8XhvI84We)h^+ICZ&Aw*~T-b$G}Bj9}_6+OXXVKi}*Kr8y;@__E zqiGraUsgbSzeHH8_FJ{iCYV5|*gN5R_W;Cn;eUI--Cg)N&<`nh{O|{v3`wY#9FLoa zG&Srq?P#y1jLYDFM}tiTlb{C+g8@1MPinHAWA+H0O0 zw5UTxkDqu5=lk1)S1L8S$u`!>7w_TfDvvHwE>-n&qB%0x8-_jIN<3*H7lCxoDL~t@5f=~B4R;293@%&B<+JrK8$`81Z)6uo*Tv7@vvItDibc9( zH?x?x1t0VLiFp=Uhg(zGK!rlz%if$WREqMXX z`vrQ?aANR9VXIDI9{%+Fmm&o&qh5U>8&_1i>bXdi7zf={Kx3n>wQ$Ew8-(5zrtf`@ zZ81ZLq($WwjX!?!L+L*m1#GlbAwizuy=nt(u&DSiPM%CJi{k>i^kPC zdS!*XcG+#4eK$>44(d>g5WHLG1T&Yk><%m=3FDYknA?A<;^thkrtHo=Moe8+Gzl%` zMEp||zNm>-n=i)UZ(pPvV~wZBj|cWy9g}n@(%rid+29AzJ-xbslR_uj2YoDhm!R*d z9W)O`@8dbApFQMmG~s;aNYL3L;>XhbfW4-3_f{>pCLEh_S5vw@Xc_^h7)_CXB?QJ8 z#QzZ~{-6R{*i)9$=<9mVR!S49-3QCeq8MB7#h-D%W#`9D=F!PaD!_ zvy>{jK>RG2Eh}q9b;F~)azG&gS$y;pzmfO9D%Q&4b{REXc$YTGYP(MRF*Vy}N38=> zS4V1_4-;$*+&8G}|h&vlck*fYY+O#ya<#o%Q?$MPUs}dWw}d z=xM1!7qVUW(SPoNe=wBx_B19XXOqUi``w=0>1`q6fy8>eM=quxK~9V@%kbC~jxBlV zgiJFX+AXfg$J!Y2rhqyc3-a1F4uSi!tN4}ah=)6tE?no%7w<@AO2oHsmx!Rc-}dBW znC+CwKf;R-oT5BuG7@-GZO?oA8+L@d=wa zE=qF(HuyPt$Gt75E{A7jf>0mV#P1mEJCg8%-h26Q84CvxqTlkb0-Xd_PP$a&iaHBK zjL0_5I|zdSE63TDg(-QGweLy6l~G@UhzFZ7#CLZ4?hd3g0$!8w`s3XunFcI4dQfKC zk8Li0#?`D82XHr_>fs*l>12Yv6_ox8n6^nc|2xMVykp^FXr5Es;E@12-=#A^3UulW zkTA&=O`L6DbwV#=%8lECK^rykWgYukRC(Wr$s6N8xXxE0m#N6=uha$Xr^Yw@3Fi-D zEZ&Rgk}JPZ&5uGmv#aL?f2dXBCn z;+>%lByLj47TK7e7}1DG4D)gk4$=P>qtZ({SZ%5wf;FJ%o>=f6ltrEDAoH51&7{4c z=L%@~&oM>!V4i5Y!5!8ENKTJPq%*9-H; zZ68UF-*nz2Ja+@zN@%Do2|b-D&Ue&0ShZ;?Sp1(BLZ#C%Ilhdzez`5Mck#OG9P(Lb zMaT`!G(DncRF=-Ns36#0?^!g3%-Ax7FTFNPpNstCjc7I|fmIP_j#)FL=SbTT@R$ef?!q;>Ain#xX1HxPAPJ7nE-@Tn+tp!`PB2C_X_6`-4bNZ)d@seYi-z@uU_)-K16q9SFTx zkD8q5o9e=Yw9{wOl98)fs34y{CK%T7Ev!#?hpupAlC0ROtVbAVRFG5d6Ok zVJ?>9i(l!>*%=@t&)Sp}mj~^d#~V+R3>RjV>~vLyO%DNvT*AAtMCY!*+SBm7Z!9*`Xzk*)6aS54fK}@SFsw&A8P7L3;+NbDKKmkXdUihIZPrs? z0ijyJ26M@I+i0uZ>l9Mr5hJl-8DF0kyRpr5Phb*eab`xDSB76<+*YT-Vj z9^&vH`NYCNm`kWh=n@d={NnQ!a3SVl%Ev8=z4nCzukXC!3!Q`I+fN-yk+(-)wGaX3 z(Q>8yVrt`UyZQ3lIYjlQnU4a*)#J`ioO=9vg(M%a;&Cx4M9)K6w)B8q2ubaSZ%az- zna+Oq$NYNBFa?+GU|6B~W?I{p-~;Tp@Q`|rlistY`Q%X`p`MLfhhrYxM!Og{EEG(N zwi~%xI~sI>D3Le=dPWac7MP!HAdIaY5T{hK{I>D#JNl1k_!J4B9@_@K#iwC9tl8){ z{V$j~1e91~uqw?6kwFWk#Myu>C&E7hRB+BA_(X0(}) zz!gy<(S~jE;uH*C1a2x^3KTv$!3P`R7njVm5?{Q z?uv{@vM@u%lxF9~FEUo@;hCFcnYPKj@ZVJHW6BvRptDzlAM8JpXB>%Q`|^JOvCc1` zSAs>x#bhKw^L*&0LGZZXv3TF|o1^D-Y@fs%|JjF6UAgLlZfB>@aa1}n;FS@>LfvP@ z(gRxtMSfa=+5K%omj+pu;I|KB~n&E@kME zsG(pdnugyCU|2xx9JNAG{_Uu{t^41@ooMl|u~Q(zxb~m>V0;%-->UK~&4>y|g&MG) zds!zS0R|QJoG*Z+1QA0d%RHpjQ0NiO;p3&cJz4YwPh`W3-*kTBn;9WBaGvEWc8x^( zHSvr*)L}R3&Kp{=Jn6n-*=&5$6_qS@Fy6GVyWf%sv6Q`dU_5(yqAo%bNL;^u!T(dI zl6YOFX=WRmSZnMo<3=DPDscqzvc61>L>0a#{kr|tm&KtlLG4$PWr<}Y$+NX!J~siy zs$2Kym+nDLyj8eS+epJ{;uTq|#<}^M`3IU-h>iaXMi5ImC^3%ib~9EKC=9FG+mv_n z|C(7!GXmWnx6eI+-f;a_CDTH1c`q-WyEE!N*f{(5VbRIiWcwayVPv1-rY9SyZTR90 z(So^t*2esV=~^o z|00VWe%n@S?EWAixqaGv6%*L0yRDUJYv)Vb@M;4#DMu+sC5+)+Xyrp(x31Fuw(eMA z{C=WPHwbizqPST0snN-z|8DJOMiNJau3sfz_9;LW`tBpKFZc8ocr_5``fZuw;`0E{ z`R7v_dIU@CexC^~zH%AMNLX>-6%6uZE$~~M+0IdTv1*ADJGCcQMW*}Jy2H0+ zmzB({$-dFptGZrXNudxWQ(9U}Ts+bOi%1NYH#l3BoX_fA*Umv#+c+=Dd2)3Tt{I|?QyQ_8OVo~sgmSj;)(rqsK5 z{E$NR5l3@A+(CQ?!w67N$7l|x%QEAHu(%ly4ngBi%b8%1$hViynFkc3CA8fODIetA6 z{TP#b3!a(a;Q$70W4Y~61;K@p@qE)k_1yBl!&3y;+=D^ir$hzD>KNt`doc@4in}4oh#$+pf@AZp0$F7^$ z^)jjLUKL9ZpsDBD>pNOPV=+h|H>xJSu4Z&Lb9To$=)iM)UuQbc0@ia^Zz_a=yp!K0 z9zN*P)xrc!s00sYPKTRn>V)at=9esDV0vr^KP=bN&)ZzxqoSsT*Vj)Uk6rwa@ANXtfsbWQq52j*^jA5u?xEfVchJ^b2m) z*kt7ueSYMaWRhl!l{u0x#nCo?Q6xbZvn_k>us!}s)JY!3V=S1mC0(+0vGWp@65HsN zzRD!`wN=9VnlHH+pzDbEg#OTkg*_GgMAQJ3;jNAerwG~LNFc?Ll-?V{TN;qP`@OV# zvRU}Buv;J;(j%@;ZiTa&z@A`ZoVju>+QK+X0yy$Ty!k+49Cly~aT7f*aqvV#rsKfK zpp+Ga+ag86ZJeaT6Kf;-Z^-k1wcdcjl;q1FvpKv#=Q*kZDL>rPeca7q4Zup*0fX~k z_9L04W$&nI?`TCgN_};uQINJ9>3=h-MPsJVvEC!f1YQ-nIc<7V4p(AV1}Djvz8${5 znN1qkS4D%3akb$Uz6t1alx)T#=)u0D}~XElSbfUg@FXLprodqOO+W{W;289E1u}` zxAr*NS$+#KN^4VuX?Dpgs#X0ZA>4xYrmngxW`$!IPull!fU{^H=3bh$j%Th9Tuxqn z_t=5|b|SW#}_eF^E02-#~h_C8@^YsRvpNjL$rII@f$U*Iy?jlceM#&Khq| z=u~75-Jzd6-*pYQOXH15*)~#r@GRUz?7!QB2AMFHxVTZyF?8l3b{~9u+ZOe}5$?E-l0RW1ZxC;hPc9<=ywUnd< zHp5D!%!ZEd&{ChOT2XB%#WMw_N)akQrW}S{!Os|52wjW{+)|oS#y82G z$Z3$rIEnGi%@q7cInl^9+0O^TG%Lp3;jcyR<(8 zJuVlTJDRmz%%q-i^6{wDsLSI(O}~4MuMqXuIX<#2ec}!d7Th`(Mn7C9W|-X5LR9tF zWmv`9#sS@6-$c>)vYtO|k4Un?*>KUDj;F|QjbIal4KQ2l^Y7 zFi|^`E+9rOuEGsaP7d>2lG__rj73yThKYe4@~*Ug^P$fR9KW#foVDETrkuSlPdabE zn|(Z*pWnJ?6Ivz2!r!T$U%qb2mjSOGz>n-%#8vW}8$kM4&r0QZ!A{X?)@dXayJ>VY z`=;EqW8A5jj&5sT_e%vIE;Y7f3Il97+P(z3gp$$=UTMoJ7r+_`r%3C+{RC@Pi5223 zGB)-b5l>Y&wv*gUXpbZLf2SrIBobh5fD2UNqLZ2pnUw=+_l+^bsmg90D>rm~~)H4Hp)KP88AS~kha0oXO^*`YBuFOLcq;5G5Lq>Fv| z!l=aa1D{jPFP2Rm!|!=dc%(izz9k>$ERe)2PwdPsIi&>7}Cw(tbyU@Hw~=a9ge1QS_WEp^}wy5O+6gyPU!i3 zD=F@HMumAa?eoXA7hhN^V<3R8Ithk0WdVVdZ^UP`iPAH7zkU2ew`vITC-oxiTw)qY6!mj)#tWd^Nc zwUoxZsd%RFBzL5WYI)U>b;jE4eHdj~1zJI){^ayLCctL8`FkP^b7yGIArN_Y``Bm6 zKeFF~pu#R6A&%sQDgX)RgAAA*%HSo8tup zxJoZ~e(DFoS#qWF45Y{EBGX|;vO09#rfLMhd!$S1UatYn4)s?uNJF&5f*a7jJ%>j6 zMrt1zmPGsxMCv$OQ#D_=W#)=s{Jg`5r506X6~7q8=9%#54VFxbUo>t+Ka^2vYDyQX z%k0G8jm198V(dHT`Du;cIrD`bnm^_v5$T5uxtq8Xon#@T(K#?%N2-VY3m*Nf)@UK( z{_+LWAow-s&VK%JlfHBp$v2heP;c6b&zNb>3H`PQRYMlZ0<)JF&CN1WDh<)pe~6)n zhz7E7(z8o6^G)j`qms7q2P8Xm5?Bu8?BQSHh`S8$msJ7Kp&;{z>fZUhz{Kj8CuIMv zOKeSbTGHLYh%k*ZZ|yq9p(&nzo&@#vakx97E_1o2k<6L~E!LI`z}ar3hVJEXCIZnXtaY15V)FYnqw$4Bsip^X?Af?gn#Nf7|+oK@)Lc2$^r&{#K3;cN*qR z5_h-#ul}))ko=?7tfZyd`$D#6+2g<21=jB5eeP{G!u5gt(?S?WcpO#bgqA6>agS2+k`4Khse?f`@c`7&#>28ys<2H@D640 zX9BVxPT*TyJB)QxTPuPUlG`WrqcUxeAo3vWoVGBL^Cw4wVcQa+*SzPY55D&U`qmy( zWfAGAq|-f)?-$vij?BNxoyZzI8+NeF+mg^!S)u$ZmzNJ*S#37Lvu z=RL4oZxU_Z|78Ji(mov|fhnk)KmRiR9T6VKtTSphN}Ecxi+f6n$ji$$8oai-TKn?B z|D@AIaDaOZ1K()U`bhn6!u+HEzZN_zQfQn0=NsQ96V&l9PZ)+Ck3wXd(LA2{HWTng z)I7iY7S`XH{K0tSdC9POgWW?Fv9r0~u=ub100n~rZ%#OUS9?U!Lf-tHG$_N=!Grat^)4=wdPm8b zd^1C6|6RX0s27T+DZFfU!mEFXPldtx@-D)^z^WP3EYSg$hSZk4$pezy7 z9sZKmof08#irvHO5-r~gMV~Ae&KB&a!53uFS@J&N=ha^xmBZLm)J4|#XUhDXCbAnp zm+v?KmphQM6P__wn+)H{&grR3+x0PKoaXTUtLy1{ACn>2%=R(vi(&v@lcO{zleb}OG;3l#83^}l9BoRBi&$u?pSj^#gO187% zS0(7;-N;U9CWnpZ&yCy!k*tl*j`Nik?muayO2*qi%ts*OtWHmZ;to@Ich;RRWq$JD z6;6EGa{Dl_5NY^@_qNK_?L^WXJqJ?shpue4IOq~{DeOm4JtPo^#SugiSfWqEK5O>m zpl*vr2TML<97IcAo4E7=gHDMazZSj#!p3gw7@SbhQAzLVOF63Se$sQD=PH)zo?-&V zL}wdDd#N1ON0v&#n49$T;Ggez)|Lc>TjUCAuFodmXbuw6wLJx51XB;bwmWL|+SnIv zG#}TMYPICAUPpfNr;4Sx7D(CU0JoQa2_p%ti@wU>X8}H*C8TB`iI8y-;lMzm5Bhv% zG7$8<%sC2pBrud*wn-lCAsm;+4Z&sgfgNdiF`9pR~)A?mC517JOCOI9Yd28|x zusQ4*&#Xz~dtouS{agm_0AqeHzNbJPw>ZSS#WEs-1~`_=G-RBKinh~3r*P)b8adWTEuH{K{U>kg00;xq%|F;V^>O=rOs<<~`VNGW6>#Vtx{*d2hDM~MyQFjI?uMabh#}tbzt;N&X05r;UH6`|&u{N5A|*nr z=P^PqMc_Yz&)K%dI`gQ%dYW&fVWi=V2f}CGL|uF1Vk<%P!4yDY+=U3EP5M zqq{yj= zop8IEm9|pdCcAv#Z91z@>t2tzmU_n)`1Y7)!zg%Ep?GMlw7++^%wC8n{ZaeSLk}I0 zdr^~SBoM8rFNjr;Lq28(%LC!?uQQhhFX_x$3ku}W5&K7$N zEN4+ORN3_V5>ZB(yb;!=Hx9nOWn3>L`H8`s^{n?wP|v**odlc$5Dom$6cx&Cf`&uk?5eVN;t66xt z$3wH0KN@>c`9eE0LO!Enfc>?98OGhO3*$&-v|g43<@jSj%$<#*GBlj{8Y6Oii}whB zA0S&w!ytHL>v|rq_O*w_ZiDTbJEr@)`n1Jsv+_!~Pf6x;_T7&^9IVwx?9>~katOk~ z0XWXD@Z?e*w?aCHQAUPDwt_?TkLl?D=5e-QLZ1dD3_Vwfs~j0GwRw@7;$ueMKR{UN z4R1V3mHHacAJzZ+!#&=Px_TQ)=x&zoxKy5Y^Ttp|C>;@{JNQnS6w0RuS`9 zSB9<3zwRE>GxPNLh2LF3b0X3zz_!rU$-cX&vpc;zee`&1|Ist}?chAaO5_w9$Z-tB z=c)H>L5Y_CYuJVLPE7NW8sy<4n#5zQ?U(qT2Cri-;^L2bWjRaN8udfevpAQp)(yf& zVEWDcVm-&~`<&I)9!c}@G4vnx-nzmi;1`BIK|GfJG6edyc%)gYQ-1H6GVH#fhiyi zEx@{I{C3XRHdV9~h`t$Fngh;TJV(gZNBQ}nI%bB$wI{EyI8&XU_3vW(x54j%^EPWe z#x3=<#vW_Eh-s7f=39Ni=(cWfKg0=0`3IXnbrfwlU3JvqRGZD!Fqd|S=XINb@18c} zG>m~WMgMT5$=?y8SbxNu_1IVUat~;gf){SYp*_P;`3c#P2$aCcJ{y*ML2Fv4Ntbk| zf<%AqV_$ypk#)Cet7E>1e~QJp+bA=WmC|b@zD*0@;Y}qKWtJDbqqIWm39H`QF>8yE z({`5de>cZ}m;rr9fFC^An!pRib;vTO+b;#_#Q5pKKs(m%@dkJ!q0@doJiyiRA_!Lm zL)`x7aJH>Y#g6Q;WR=4{7=3Bv>oOMD!gqlETqiy5#^xx$?Q>)uT2AU%~qF; z`pOw6out=6WF4uh9{vhG&xa2eViFuURt@+AfCIj`Pm(x&((7i)nQU*nYVHH?z1l>T zcSP*!kpjhualP-|C3%;@A5E{;L$?#kA1AEVAQ0~n`E&5OiRs~BJSRp7yWHpQyy@ON zq30u6_^CD=E=YnCio^P^s1&ax*Z>mg$$$GICI3mrG2+HyOS5>#3((D`Q-s%X_j?$(XK|+K(r@oHPttG z=?2OrO_u^OIo?rYYvWvA)dFAcC64tV*%t)%A)vK{c(3xL0^{xy`;z5a{X@3U(buoO zgv-UgnNLj)F-@Z%YVaE)_K-H$OHLmcF>P zYtb{^M_0|1GCsVZbAQD+mVR<8U~zUqu=?P7kqo&P@aAc!i6z&?O*%TZz9Zi=je00V za`DEb*Wne(TOPwGy-ux7N=A#d_~Cxs4eoaDQzou98fwcd`|g*y>Yn39Vx zMnN^px6`<y}nWx=;#Fi>Rh(MbgHfaB~NGZ|uC7QYQJql}kw zOVzm$F47^8$R}xPr^NiR8%tM2NqW|E6V2R)VSN2-*FhSR{N6Bl!2)F%fa6+_KNopB z{!aNHv17PN_aBhdjwSo41*@K)0jV!hNir#*G(HlyGYR?ZjIc3NgwhVizQszPXTZ4> zCQrAF7l4vVyPgIHp<+85BlFcUda-LqWp}qKPL>(b(|8X*4j{b-_Uue&Z5NDVcDr;n zYFnhfKTalVkI6~Jq^JdXT%wNSaGaz6d8cq2Y3rb>>zI z*6MvfG&Pn+-Ls=}Z<8B3G_dVIpuuf|>^c)(b`xejHju7~wcj&-8sS`JJ}vL?8}!aO z2R&>4uOIhoQ2MtwUYg5)9{rFy^|t+z^zyW#;lAK{#q|j*3BQ00Ex|-BAeB&VLI}r& z5o6=0m_2i3U5L0FEv+|pe4>THm-t83!$;L7jZb3TX%2H;Fdvl!t!Wf4z}g`@Iyym#`rh$M-?sz z8?ls~)k^{2OOa>waZ)D~T4q{yif9e*c8}=B(mzi=JP4&@=Cz5=-ZY03?v&7IBI+be$(yK@=mNUPcxMd%RzIzSECurbd)3ae9_o zfPk*dGJ3_Qu|ZHt-l^?){0*h%>7Ns11_*i_i&o6ZIU%lw&t(I)i(nM0yf2ucU9}4? zzWK3E?1(RUB|SGsUc{xzwtC(hKU&ND|4h2*GSxDTQ(5C6@+l&ZZldW)?nq>>;{{e< zH`{RSR@J-^yx3=QF?$w$SjnXI+yPt-L40$sfHW4Kzu!FRPN>EKv@fpM8+glL&(K}< zx%z&OR?oOETKCR%_vs{rkL#0IhGbBq1v#X=mPiG-JVm)bUQz|N747#^@i<*@N>i@79(|N66 zrmg<)RvRU(XJiwUy1lfzMX4@rDPGx=OL7^Cqf!-v(BO`0R#{$4xX18XMM<%qOGcfl z1nk_=%AtPlB!rBgHYoTozCc`D1H;G zbB7tk6!iY~AN?Z5Yv5s!vDuOt>2UOut7jH);K4^nhHXyM-E2WT{_XG|fO>ou|6g%} zf#|Nm@|Z318EQegRYP(DbhG1431zv(vC{RXxJEt`E! zuox#*(He1F3l-~+ZPVYAzFXm6K^`Z7zU57$00|y{wSK{h*XwvJkO@9B!acB@9Vn*f z7sg#7#|t}r5f`*p8y`W2yN!A~2G4hB%kVVq+tAlVu$jiXof1I|&xf=eg1;0;>T+mc z@DIh3N^6~AeoTLSQ$GUKYOT_A`?wm5L8e0nr2Dmn@T6r!e*U}Z)z@kBPc{Ga>{Cg= ze|&Lk2-*+{d#r`%Cr!ltt=-88`iynB}=UkQO+@xS4VWQ%x}-qG?qHsEP-8FAfb~ zW(rjLXvwb>C4ga+H-7oosOr$GR-1<8*`F9O9VK-gg#*_0WtG+HZCg6Od_PJ+WR7W^ z2((>(`|QmBsBG?jQJ+--aIy@2I6~jlBn7g2kJjB@|Lk+fg5=v|eZ2_Dueh%N>MibyULI7f1oIS#*( z01mTsb?~HfCN1$x)`Nl9#mU!zOL8RG$_2QJ^IAn8ZcAy~2>Ormb z;_cKJrCCeYUuR|;^*K!)s)M%cgBD<@ z!pdi{mg9?o!wfq$dsehlsuNcgnXOdkY6v#yi8I}4x=|eFV>5%Z=l7on z=MwY1_Ls@oJEeBQma0-mO9>DrMaC!HPpu9uN}f91Y~1sQk$EW4&Z9=MUVL&_E)@3G zuw+Y(Ej3@wPGlO?6lyhU9l0Q<*FB(TP79chI+^&By31;U8GrTB1RpN-VcQUdso$y) zQ0i3l8?T^S{{u&(-P+9rGrkwP6dN*iL6`pd$GT#10$_ClszvO_qwzMZ5~XbQv29)Ph#(vn zvSF)S+@lIA9Vo%24nU91>d18y#H+X}WQ0at>*G<~Pb*{F5pvb~)s&f9182-eiqwzG zH^bj&ffAeNSxPoO2$l~%!@Y_vs_&NX^I@h5q_&o1StG;|@ikP&aRwGu<~aNX3ot@f zf@apDNs^!xeItOGk)5IIwmGFFG_$!6 zUOTiF`^?B0;xVs8aY%J&eT*T#?ftXAQD!36$oKb?nJ*S>Bo6 zYgv-gOkzkspe;(88Iu^{K;$72QP_Zj2czis&3;$6>12%eZ{7u4oZ?DnH~*-J6t5rn z>}dS-=d->U(O#4)tyfx56A`8?ouEH;we65)f`(&Dh%F&*-pf5OqIT(NMGlUQ;fcE; z{_}B>(B905>yDM21%T5cWnza+8opxqwzd7e*@NMc&HdaqXzGMqToH>( zZP|PZDgF=K0H+NhqR4`$*B-4^)dxVp{brYB()Ts~0<`%3Wiip7S(YktlK0uc+6bRT zHl)I5tJeKkpkhOQ>Qk0r4P|w#AcZ!|E2^`^e-}uu1PY`7S_7fvgV5O@w)R_Qb@0LC zHEA^KNaqVI?FI%zE80=hVM_85Ob~rn_F8Xt-SNR?74&WV?)a;IXUuFt{KpL;RsYY1 zXv^*uI?r<(Tkj+ECf#&I;4jhO7aO$C^I)@-@5?b+2b^eHV_ih}80)m6&6tUGAnDk+ zp+w|$7@oiDGt=NBnnyI;B%R|TOvIWqs00^6=6po{Z9b}1*1Qpa94IO?WDOndg^4o7 zDt6-ijjq*gsZY7u7iDsbeiMMaRDEOmzY_!va?Jp0>&O+86VEoK|q&()V!sFHpQ1gl`3at?276{tskWq z(J1+ku71kg6R%VX8OF%Jn?=?~gUN#|Wmges`E|HH?H=|T{k`~XaZxItLtgGxvB&+< zkG#^~kTuU11Ey2j8BBlXf0-!pq}IQL{iBI<;70W2t2M=bshCs&NoVoc45!^7aOBZY_F~uC99$m=P1@7DdS`=u^Y6n7B=)ARlq1& z#G&5m{7mY0MlOaacX-xZp(jlC9=qVX@n?`B?rUPlbp|qNwSSJwd4Fl6Jqkxd*LCfi zHX9%OWT5lwm$5jVuUy6>iIwzFkSk?t{NI&ZMuO(N2uAwh5&h6j)C;NiiRhTPNxZUu zh82uscOyI8tsV2yqQqXKfqyaS_qd~_hX_u2;U*a?Ur4Vi$X(G2y!HpU?s#}*+sy1( z5NEsnv_E^hI;x7cET8-<$H*a5T>WcNO9iP+won{Co~qJpOmeBBPT}kJkQV6#3Qo{Y zgQ1PemcOm?6<&xD?@F-BH7&fgaNG)d|O+xJ-@Q@>7#s*m|zVEJ7NPUU-Nis3d2W(g(a4l<)Sw$;07C{(#4 z8b;1_a&Z%h$;cfAg&|zs7wzW)4d?No{-lblu>WQy)dmTy6JA7?SUPrHqU=Ae<#G@X1$ zKt?ug<#5l2M88%touDq_%7A16*LiK@*aCJ{A)swTrD#I%19!`u>+f~)-*DRfC>nRO zqVmO}QU_+P*rFZoJ8VJ6ekE!;HlY3oxw6B+7d-PIM0exPqi2-!raR!%b)$OeH=;c+ zml4kg=o(YrD}F2dm3Hv;MpoQuNL#b`-lBWQ+ShA?UGg(K<>c0uG%T;OK)WTAmaVSw zt+8E5N~Oqw;{zVFGJ!A4Wu)Y^Hs;Z)g=Mu0m(~2Mzqy3bXO>sH@BVG5Q9I%exmaT6 zj=t#kM!ljKD85(WPv!u3gn>iK2pv-wZjX(9w#eKm3!aQn*99Gpvs=|dZzrC!PG%p! zJX-5PztGP&l@9kJEU=L%srpPEt2Fk|A2*>3;Pdg&(p*TZ&DI#mKnG zGsQ4OaUygIE~tiY>9{jPizM%iHx^2a{vsoSkhYFwHu(-dzO|-}9+nXe!ul7Oy?ry@ME~GuA6w#2)Zo9*+x8{(l~h0l zZMM4w31Nq7v=+mxLax+TeNNu`r0o=K-JaI5B>7B9E&{IY7n`fzf@iCK8ZTkdId27w z7DJN7fBlH6e%h*X8@Tl!X*6RKnNL}obxw!(g<$Uf@DSv>a~*MNxjwF6ivgT}xBz=y za-+;~#SbeZScL2Om-Ag zf%huhw`c z-h@!*uxd95kDa+P!D7<4x%ruR1U2qaM{NIsV%Q8I?`VWt;uK6Mc#ocajQb_&kL6@5 z!5jtecNoZo1yi_IG_0FYqO7f!P)rtVusWz0C1wbP!T)^cl0AIOJa@AH*Ze8LQuoP{ zJ%!;?hFFh!qDJ7+GIF0)t#7T=c?#FPVm(g!8^H@QT$$01OoF8V&^`02*Im{mGoBhD z=?eyA9)pyeqamc1?bR;#znP?P5eEwPT#-TBDexAua<5N03VlVj6Big}(qTeI#_N|6 zI*ei>ttMg_-$_feRQZOfL!eU)7?1^*mflKhA&GvHA}<7@eq403-Ptch@Abmd`pIk! z@GbEG!c}$ccyADVVzu!XUfD(zpav;TzxF$8tMFl zH5~9a*Zis~ym!QQPj2R5eyObQs{hb3n=p|(4x+CAEv7}M_s8zkz!ww?wBjMqsjEqqnQFmaaUKas-TRQJ{-#clVH=x)@oSkIYG_)cr;s{FLYrr#+Ko8c4_1$Q}?(caXIxIQQ+&s3{~a zr?+i+KZZ!kxil3UVGBC8(D)zZ!=hy4Cn0NT}6Zr3jkTGV=DVKDrm zEnSu|jI90^<4}U8SrLr6;EHR9Sn`(wQGCcWHcu^IVcE#441UN}XkN8i6s=Ivu01M` zJC;W#y0q=y6B8E}t+)IfdG;;8@zYl4vIKq7YC*Y;R-Xj=c7iyu#Gy**fj#!wqC##F z{TQ$!6?utpELL$~c)F+;R5l!+sZ6UCb#IW!I(}p@)Md$~*TaqM{v#6PDiz;FNNYlf z+je%oiHyuL{)^Vh7hDCS-4sGcS}F4WMcaHq)br3_?V)^$pk|hTVnfBC<@{Rn&JO7y zYuPM(aZUg}ZWkgVFAq|vN)`B75c?f#Df5#Ze!Ojfn`=X)ahPUu@L~Xlq-~f+ZUM)b zQyF+poYbt5zVOTd%%J+jHe(8F@&H$tuTq^?$NLI&2}xTfoMhP1#5z}e_pSSEoG^BE z1$yVdNrduoQzD?w7>Fi_+HTR9v{AaICN{3vaeW)32fK5Y{Ht%6>~Sb4!NXqvH~rJs zxe6G94>pyz{VpEz2tTS1&a+4;Zfi;2rY`rL4eipu4{1ritb0^0>Cs=6Ao{aO2A;CD zzDL$3B}1t;Kfa2WP(Z=ogi+-Kc7~%7P^0L_x(Rt`iNGUbEBVV)U&hdvr<;Qs=z9xx z3(C!VSj2SD-%GCfeRWt9Er$2QTSy?18heiBha6~?TjWjRzWCT`&HEc8UB*E!=cT_) ziC z-&Cc!=eeD3FHm+P#W#LwHwiF7BEf9^PGD8F9O1#SUs5@9Unmu&(~um0UA;1j_2)mr zJz8gALRnh5SRl$Zz&-iaU)k9EAQ}r4Y#NZG{kFakYQ8*dULO8_#~o7ATX%G2V3W%g zhM`2$Uywg5Q?;qHna41{tJtMU7i11DgMFn8+|NHTPl9Yz7Wat0xVFq{-m|(&Fnvh) zaQ&JSu0B+&c40yZ0tVTFSp@2{UPUsi}l_D7=0N-PF~ZuA2C6T zV9cu9rrTpFIV{@W=A=?$t5NB?fL3Z7>!go+;A@{VHCYQ>eE&n4;Yzc3Sz3hWU)EQO zi@}pboX>kmKqh{F2o@F@k#k<`AGu-53bBSsAademrycW0tfw1ZabaJSRI;s>cgDQh zRpKq(p+l|RsavWvVL{I@%#!VKfUA#Z*FWufR$zj1gr7m54IrS_?jJV5wJ9g1W$r1A ze!;u- ziBI2pg2_N-aVyTiZe_|-)}smb-#&;rjuYY9F|aek=RH(m+IdwWrB^sJtPSgdQCl7bo}IXF%#4B zJoEy~#2mkn+_BV%am5l%qPN6fn|_ip(gGW8x$&jdaIK0`c9GtqaL$qjgOT=0+RniO zgY%w;N~z_`%g$tJU_(j(0H zS_$#rBJJ%}pvcN7<=d5H*lhn1~p zU%w>cS}N)nfZDV(2Pn0z)4D$6miho zw@}fn?_B2FVtvS73DPRcAYsP-F#0Zs8iqRh3CCF>M3!fcPO2kilbzSRpoNTGN-Y%S zXw5_C0k;i44&7vQP($F(Pv3og-t#gTsTTDJg4U|Ul{GIiEHMU@t%8)Ko>qar!cQ=R zM`Glilo5D-{?k&>gfDR2gBvG)R9G9ExVSt z4^Fcu6>|G|1w4!9rdib}_`ND9{Uzbv)?&H56Pbo|P{qM>sId6B|8@+4lT))5-L8P}FJ}{lX z7Q$!}hULcN3lp^`oNk-)r>mqINs*}!Dql-b?dhC9If0cgjzm-Zk$9%?1mr^zA zq4`^$b~ey*R%U10?UzgjI!gQI78g{~84CF>?Dr<9PY!yG7aB2e>@_+XxA@F<`RnG* zgXfr%oKZz#ye{TNIjU5s)BJ09>~n?k6*w% zLWCK8u&ga~_8Y9}7P+HZj7Vi?X+-0ST)N8hm(%O zGP1)rz1l6yd_X$3HwqKfq_&5UBrpj(%_39Rwj1zzPe#!jmebrz*X!|6y!-9Ys`>{* zrJbgD@SrX)dP=Eo9y>(3zvEBmtP$K${3H!xk+X4SuQ!8?O6q2hU#U@RlBsO{Zv`*$ zfmAihxsbURor=E?qT0-! zC+HI)Qnk=rf;cciKNAe+?fNpct*UrV3)C>-MyP54mcO6y` zs!Grdye}&B;BU_v7{8QEGW<6jytt+^j{QN2b2$c1ODjL~pyBxyZbRVT=IzI=iI%CV zIq{5}_N|HK@EPG~-iy<)7Zu%JT%Ma1WT=en*Z?IYBoaeF5IOV7agJoKcko>@^ zEXSiFVy$)KzF?z*H0!N{be60Uyt(0q6?#{Rb?kAOOIUod;M3_RjyDmODrm@=W9D&YrEDwN>5$q6oA;R zBuOuGxnHV((2-G_6j8%sWz$;d7}{v2PPD>}R$bV3CmSNgDSvu)47S3zQA|%`#djstG|_ z>u(L~CFG#@W22i2%Fz)K{MRs`s7I_0S-zumSgHFOX2EN@kU?k&P(V(AyZ>+K6mBNEs%$hfRyD>Hy)-VGDPcpzOV8XroY~1T}!79=j zF{dasO|CrOCEL`}vSONMwHQ8sS5|p5{uQ$}sXeg60SN@SPM*vy^v(Q4uS9L3;yb`L0l5P!D;gnd6oaUgv$m$n9 z>{FC5qg?3xHh*R}Qf-(PBzSZp6geQ<-B$CeM2kE3J9y3Evqp7Urfc0MI)!uOa;HPwT!h)i?CKgy&C?R=1e6!=?jt zU$50~i}Cu;ap#!ya6{%WFYGCe*w`XX6}aEKZ>{&J=%XieVEpJ~Q|sUgAT14gZ1dM8 zv((ii^g=^Ls|(DL%;=^bNP5{z!On+c!tFVqq+i7-R@Y?E`>~zDWp>%?vElmj^6#b? zr(=<8O>G2oa>4OQ$!{mZB`Z5i49zjLdQx%pWpUg25<)7vOG`pHUk zNLYbp^AJYCMHK)%>$*6t4@v^kGS4UWOWYhdsj*g41_5A%7Ix-aAu|E0jV*heo=KzdpT+IZ2D33_J?0 z@dBrO>DAYk_%nF6af6m+?uCXER9&mWkGebHynegkcZtl(K6`WhNO%lzD?#aw+z<}z z{F7NX%3_EcQl_b+uu_Z2s;-B5(cHYx$Dtc9&;l-zea^|i%1lS^h@)x{{g!ma=C%Hc zGkrRfQ%4Hndft4uKbo=YAIf4UKJ4P8>rv|-RcEoOCpr+rjwX;?`v#En?k7}7e!Y^q zK}7ph8$eJI{O57qhbBCX0w>@^duv)`@n*mGrplu857pwVpmO<$U8 zJY#Pf&kHC3fLvd2)OkJTQG!O@Xqe}^A&uw5Q*Ik8Zf156MCTsgHG@^NU@Csz3B zv>Kwp3w1(w4b<1lus*L3T#UTNF8dx~K$F^vn zJX|-aUt`x}*_*3&aQ2|(H9snBz)1!uV4nIpTNI~yphqkPJd}$*MFlEfh+VpO63d5Y@S4!L-nU}$<377IHH?#WqLcN#@;eQ&>d&a zG>=Yez||jZ{Pb;qm)qZz#;N6|K%J7rQHv)|A#&=@WP{qD>1lQOL*Mive~n-p^7=ky zcfLm_Zu6kO_ch-?=lbx&TkQQ9rJGAN7o!KLQG(CM$;3#bj)C^id4vS#J!#ywN>RT1Q{SWd zk{8?!1EUEi(XYxEU;4+rJa+_Xpy^=B{3|ltO=)!*l#O&0(SlT(JPcI)J^TU&o6FWi zvI{JNr?i%9EfCL#cn2VpRjAXVFfIb0yVu#Zs24J4p%OS*F!iZ}qi@|v`grk_Z?r{J z&}K0{-F-?n5V{kXV!1d25x1Q9E7msB)7UxwiFF{ZZOCdC_FRvg%jQXJOEhzCM?7Ly zKiV^|URdK~8MC-AkdVaM6StdHiCib9pyA;${j5>(u_ObH=;IoS95Wvl7ebP%*OLM_HM&+!OmOV2& zAuBXiPWcJPC|oqFj;*(Hr|Op0qUn5<#eOEGFw~8srC}ehOp!|gL@R8oMJlpu^ZMzzJWpJ@OxT_#IO%SLLWZR$B+WWOA zOI0-%aGa+szOEh|DxGiI?~$Tpn-bIh3jlp&A7jX)SN#) z?N5qeKdE^Enq`Rq??BT~6CCG2Q$vun`d5W*SL}_zzp8IJ(!NfNvu?oJAFXz19)~&B zg1DJ`cub2PTm}a&*sblI3Y(Y-n!HRYZ!W&=iqU!)wG}RF73d9b-FkK)AF7yZOIk!Z z^X#p=HQH5z1dV=|_A7jsCqQWT#CTnK%kar?hSOZqdh!Ht#p)O)CPGDiF4i?0l~=BL z1!PaX)c;v5FxZwPr_xcg+n@b`HAv}W#VZt zrJ60%`0|y{Rij|S7OXyB2EX4^#E{Loc55-gQBeZOG!EQO^)fy=cJ*H5(yK;erL*Du z4MlN?XvDVcR{DfunjgOL*2M+KpXVCso_U;S=^r8}Wf zEe)d{%x~4(pn+Su-h5r)5|c|_g56lZcz36B{g&FiEN#Y~6((Dnyx7vfkbS`NBPh+c z?VQ{Ws02(W{DuedoIaUIsoK3yXM?YBs2v#vFN!9QGqf#|d8bEm^%cGG(yDu;lwTB? z@czKi$~ENr^J!nqw+uQFO0&Y_U*7cYsgn4Sh~MgA&Y|E`;7D>sTS+wVlyX=P-TDJD zq4CIdWGQGqGV8(aW|8Z@5<`Oytyq9efQ$*RL`sOPcgfISjy19|BHc#g!z)qWhuMvr zvLX<`cXj?+YM+dVP>PSmYGgHt(dJc?yvZ1fk#x(J$6mq2*w$^VHW}C{3xuey8O)fe z@SQ!Y5o%amHprUdq2Zlc@EWSN+4g8`)P*_yzA&^^KVQo6aCik zaC#pc!^7U}PH@!B8Td-|X`eY~$*6NEf8kak zo)PeL#&SN=0S^p8SKW48u~C1sVmtX^(4(#2!bOPnsXBVp z+Pc+lg2dqDil#*luc?+JOXhn@ruHQiG`NpKa(Hj?N=j5n!-KALF4F81Q`bV0KlMMv zhJSso2A|mKCAE3f3C@E;$} zHGs_A2-xO=78uF3> zyuMd=?tjxF9qoU0WnD~2m|SwbH7@ATgG_#Vp4`NC4BjdbWrhN6D+2))rSd~obtP`# zXIs5vo<*ZnD(yjM1v*2h*QeqzUXEKROe7cxZ;49H@dUd? z^oTz+evU|~efUj)h5U)gck?^njDQ~PJ9vW2*Q7wiqy4R4UbkDlR@K?Ew&Sd2I@^=V zG$NUZz*fk6hbN=A;5&Pz@Co>`L=$53JuU0iC}&j=vxns;;3e zfpIqQmM~L8Q_9%k1rVY7bR^kyxvxy%ALr-7!P-J1rF{$1vZg#(lV zR7ATRBggX6ZY%3x`}@sJ$s8nT*vJ+}Z6YtUIrNi8=%xdDL`Ne#l<1K3J^d)GUGXOf z^SH@Z@U?-2t+D^t++U)`KnVY?JoI~WF(Hv9cKMpqE=}*M`v8H_{ROk+-NF+l*PYIX z`Bo}zRUBGI!qV|yo!o^LW_MQHm%+K`;)@(PC_LNqP6hWT*q6PF`yspD>jZ$uxr8D* zQAM->KT;g5+2@zV3}axnv019ca(qGUPb>l=y-Nsj=NHkNc(lmB_Vv+QSfv@OW#av@ zVOK@Di;mpZrJ?rg4%N;r4QWcZ6lGG?t!UR=RilHgu`)D?ay8XPw9K%8Yd=$BoQXV) zdfy^OXxEy;K9N}~A}M@q*KLu{Ogp>&=w$T7_@Z6moP_F^VFXWzc6OicDqTU-F=CdL zu!Jbl=k?z5W#4T3`G^p|RujJ$CFjq*098>^NbiYO1@b|N*0))evet}EpdT#6LtHvN zu#ew8*&3e|(0V9y`%W`pZIlGQ$E!xZ=LVNViDA4IGii|&xNp1gx9~!!HFNF8#iaP8 zkmj!(`?N{>F z&Jy*mv9-#(iogmkfi3U4f$EPE(|Oe(o@`rZQ2v{hPc@J^Y0R|1eUs(Kq7SqTjktxh zpRu=>_W9A3PUm_MXDv{~D(C%jg0rftih>6n^{_t=S?{H98QQYR-efq6MFxkQ-v`YG zeZx-h<@tl-5E#q-eqVk2QEeysIkfX{`umjH2u#yd^NkkeXP)&ZIEa87<}g#r8MYW% zBBM^CaP(G~mn`U2kfV$8{v44Dp`Jh=P~XRuR#wBm&Zw1mzK&_;=t#3BN1x z%O9HlNaFsI4Qhe1Z};ecF!dr@3 z-0FeiO)7U+xH-B12gc3D zyR5j-kd;$-Wo%h%l4rKEd#sdjCYu-k`ashs6S`u*2Vcs}*IO@b|GBzusw_w(fG-Hb zrr|Vy3_0g1ax^Od89iuZuJ=Rfqr9-Oh7{*%7EcGnAC^{T3iGS;m$zI+>KdL;8nf3T zOrE89Oh=<@7zWe#Y$#T%kU%BDn4tFSX<@Ik8paX45Z1jvs{Wm0C4J57W0|7#k25FU z_K)ypAME5U9BiD#9TbM$(k*H94gjUY1Q>XXt#*l#uxmC(tpak2KQpJ7@ze6r)=Rd_ zu1z_=`4VLp<}#=DoY+YR&oVuP+U)6(^4SPv@n&O8_tTYbTnO0J+L`0K?x!k6rCjw9 ztc#q*^iqIg7!Ldl#pA%?7d^1F>~}z{pGVT`MOyhmw4_%baL5AKE|^c@UdB;Q$$+Hz z6?6Q!PHuWj!DpDV75GQFrhBGpi;nQ~{oBRkyP}48qi1ZgVLF1Ibkg+Ij<%+IWKyMK zQD9HX=ELlyV){XT2CxL5y7MS2QRva};0N7FLDI%_^K1o-B8(_}stfMAE805WNINnG zuED#O#dH1dJA2KNNpA)ly?qMo9E!O?cRxBGo|`=E82zLnZDYQw?$sKvDE?U4n^8hI zq@iJX*NYGQJyxU=nH~iaR?p+0elutVxyMtF|FQL&)mqJD@PV2n*0GI;8>ylV$lvcs zJmFfk@9ge0jPhb&c3FS3`5yp9LAt&i=mtYL?f}h74MTyR-dw=ZdHiwh$6VUDcSVtgPdN7bJv!XZ~$l-G*!L)9U}iX zvBS?pS7M(Ny5StD{WlNoThq$xzfH2x#)ZAknZC~VI+Xx+mBV#^0_bVV+OSO=i|-nv zPlKV0y&1Eq>-fE8_W9Otb~{J|<){B; z5qI`(Gx}aD*5%<|Y5kZPswtk5i};Oue+cI;omMRVp+pHd1X+I1VCZ?TGZ+jVQKD_p zJ3uo)r3eoXHQTk%UA$l3de3WcH9ZejK=Cw~x&68>Sp{Ke@Y#=}w=yEcYEZSE0df35 zNFoN%95gO>KG`a{-2Fs}KR;;K&!}H>!YVDm0P;+-3~U;whofE{CL*wgf5uc38}1q_ zSWnVh(tH~s`GL4=QhWQtl`6SxJg|(oWjGa3v%1+bjFohZvB$*w{9Ta0q4ok_D!!)i zh~qvmtna$bep`6V5+k-+rxqGZ7q%@1F6NCDczXUc-hST?o+CEeH@=%MfRAHM{x-EdB@WYsJV-&fb@vd<=~q4MuLu1(&{ zV&SQi9J$NQI#(<8mI!f8o;%H-&1-mAj?-(iXKokGq+Z;q|s{ZkyquKLj75M z1HR|QKZj>u_X0w8(JN<^H5d#-#@7ae!D$1`{+IPO&(a~Jz^NnRvzH%~Q+K@@SFSt- zB7*Q02njf^yh_oWJU6T+N{Ux3CrBcV%lkcQ*GPw2pRV8Rx;Ax{=TlCe`>sJXZ433L zA60tan_cnIMT%SP?D9DYva0j0$@BhcP3kKE)mchiFa6uzxXb&y`x-Oi5J|~k&(@dz zIUVE`FPAYoR-(u8Uqbf=4x5`j2(arad|mzM)ioa8{>nskdNOu1hz^rRSf8ovGux71 z;GFwBt<_`b46HLeCFd8F=uoIyZGpkC)BC%@uilkl16RjE7u%I?qRrSU$8Q3MC4I}-zBqAH;y@pcpPYKM z4?b6nb?anhi0jI`Se;!y5U}d=-L;`pwRqz^-*CDf0LI?n!Du@|(BaRL(2>%0|*xqB3^OnUz>Csb8+qd;ls9k5Oh+Vo@L zcMmdY8HLA~vRvF!+$R5uh@e|ie6cbwB%orpm60Y{9ziA3gs10E;_Y|88n1lu=@i$& z0w;r^FTFGlbc3O3;{vHd0pk3>lz`*_q$f%BP>D`vWMe`Aedh9MdB@$a!6kVDEbWa# zla~EWc|3ymcp0m&W-9kIi+Jx2IF^p+kWD>BR@JfFJ; zrBH8O@5+(h`o3Db?D_muZ^t!vzL#^=_(^MXN>RoK<*d5XabNU}r=@3^YW1H)oc+FR zF1hpbN(aB9JI6c+$?y8}S8>R9*=skRC)EEZsq{O1$FqKLS@+y=t#3c}-zVmrA~$;3 z^s=z`o{+6yf@8;y;UB)}O?dY4=g$;K?*PsIUs5@#1V9B@|29hi8Vm!+-v+~;1aMjM z{4n#;i)wQ@Ne4JoqLbMsO(4*ZzKf3E@{xazC+8P7HbTR;u790_LfD18PDpk46t6&r zCeMeMx2di-_wZfo$qo1Sv}z`Xt{?ST?-;zK#er%4_sU2bC7!F=eNHWTzTe0W(4{w7 z*TMB^82dBWm^8*`sMp{7tZeX{dEOM8@njIVw(T>}6&lFETXi{!acyci6@zKa=6gP}o1_z=L!y!spn=XDvo1kUHmcSuzQaa+)?EAtmFbKQey*T#Bv z`b_Lsflfrh_P*c1UIvv~vQEo}6+PjB~*%xS4EXD zbEmm>^E0$|FLV7a=~=c~<)cK4vo25T?_aKO_c`^Y`slj?y-t4HD$t|p`^XjOo8zLW z6i#DQp!>w0Q>;KQ+xspR=qq$r1bor8&&NHt|LXDY{t;aHdO!)9s-2b?3=v{TOQ0JJ zO+NeLn$sbO4|2B>Me-cbgI}U+zx1!Y{L9j^Z3G^7%=dly$eOD>*M8;9~J)2d8)bif7 ztN7fHopJp<^37%kB+xB+9?$k0b`RZ>=)03ZFOn)g6dfT6^o{X3_$o0dU79P;sb&6j z-XyAB6)svM9GO0nwn=}Fm#P0ErD(@xTp#fRFyK? z%q)3M^pdyYnpeO02QEJLkhS$^+oc5h(2bea9E{rJ$L9O0DhT7-8K2K;O`xyquV=&7^(sHs zcym9UFxW?0EqQKeOQ`Tba?1lfkEbS5we6_<{Fn)J2Y+RlCWh29f8`rY@e=4|Y2rw0 z8z+I@{nNT|d#_e%kDoxVpMmaG=&nBB6cgy7`dF?;AKQbl1bRyXodtvhlHc@Pc@C0A zK_7|Yxi`EJ_kQA6Zg}J0(+i;Na-UVA8w^wS5DkVc24yTOM3h&aE8#;*GXQw$2XWo& z^5nT9MS^6pi4iG;=go-@5}V+O8?=z*d6$57(z>A2Tc19X=S=}m+{9l0+waiH^LiPn z8;7Ef&ph_nyYiBE4Q^b0Doc|;qJYeI1fa_=657xTC|pW`=*j2;*_B%XX_w@8SEBtH7I#Y4gZ zW`nz2y2|Es?d>48ugz9C*fJk`6DzqI*5i&U?SGL(cb|9Ki-5UmKBiEW>nnR4Vecx- zZ@I~4)oXkgjk8w~Q?9>uVE@g=WbtyhNF#x&X1A7@aPG;E;kqyXfeYXF7P^)IbG8hI zpt#Z~TnvUL|CtWU4MRcn(huUg?>heS^Jg!A6odqvQkF0$0SiNjL8Ks2lyA^hRi3vs z3E58ymu?C4z8Z#xIF^;X=Z?Xv-xn20>Z+zs0RfeSJ%2fnsk&;*qdV|YDZ^FGD?9Pt zSH36g+O?0&H;uWuS(Mu~-n!C!@h?n-bA!Te>L>^dsyG@R4(yt z@h(ufG}?F)B$^=23&1!f2wlZc$2*fh=jXT zZ5+*!66lc~W7qK%0n&P)6x0OOJ;Vh2CM`UghK8&^kvct3U6OA7s&ieUfO`l)cx@bw z*R5OUbD5y!O1+@Q&&}pg8|H6w45|udhD(KeXae2qeI;FUp*~Q`63ij;?P}l4ayV?# zSOTQeCCM$81UGcwy;p1>N0#Mg*%pfHpLLDJs(eS+&rbl~ebm2lTuW?r{bn((StlW@v`+VN;Nn^_I#yUG3 zs(8ssV1m8#0ajxIT|M+Pu6&0i(%WKHrTF?AtfxMC0p*SHuDqYJTk(uJNEy$2&Nt)l zfB8=`m6lqwlS?LK%|(so#b9vXpA3fm0;z)Xf1q<{wqYDBdXX;^?4-cu({H%?;N!m! zK#-DO18YkZOj;0Z3L=MScI~pinQe3M-LF0OyGBii5AG&&>kx>Nlf(l14 zgWxJ2KKlW@`+=K9^M0b5!BpD35suP=uiCuUOpYg>WV}0UE zOaHEVW&4XyrS#-Nj~%)FO}f2);Lh7d?XK$~F;l;`UZT#$l#}Omd4VEt;PU>(oTW=% ze5GeXNpSa>+wks(Zcb6O8ptcp_r9C1!Qf<5jKamR-zqR$ZW_7UUNj8NInM!=cb|Tv z-gD-5C<~4WL6IVL+`v{GlC=tjViTNdvYb0`Om=l4QvbeePA3vT z=K59FM6Grn3%#c96fRwC{<;kIBWqm~3+(mzR()=WiKPwX9%Q?3kE89GS~QBfy|2Qg`9nBIwRmWo`?#7ut$hXC zhryF?!v3j z2lX#|q*m!8DcClLV{D2M>Zf z%kkuP;;yuR>%OUjeRHLA>0__enreF@mvK?;_}ZVxvUYv@RUA$Ct28xkImR~aW!=}N zUy7veR=9s|`>l=RN;!w@079XfLXl!d03iXT30P)e1vHrP$H0~ zFc=I`_A7&7=WqyO0_f<75|HXmCvwhnJ;C>!eXrj3u{Y#SJA#!3Qiml?$+r0OKIP=O1UtlIRTssk!Ra?xuB+yru>Eow+(fE0`%RvQ zguuI%a4_s!7{ngdY~oKdvBXcGht@GFsQtzl_8?QUe}(_O=;^Zd>J|%3xmZYgmBZ;e zITE0UIyqSmjT_tMVHb*^hzN-$P*pHJ1JD^nmYnDXkGd)WIzvK=_dM_~anHG1HRo}$ z6GMZc(N5T17=xh*mKK~}_ndvN-uA%FNSOgiL6qddNzN(91cA10v`Nb^>;eaRSOQ%e zozitDDRvsG>MCd#zij0($_ez5Inb*DOjrJMe@C(#_j&y_O^sMHBvE~Tc`u<+Zu>Oj4P;$EM{l@6n5K);UE*REFhDa!4K&g#J%6N?W$`<(p4 zL@I0~)%tdudlqesuRbQ$)_u-@o%^xM?Vr2KfgY2?JDbN4Pt9G++Qz;9S>ma?K3v&Z zrEj+$C4FuqhQK@@t+2#qhj03$wepD4Hr7H>bvf1W5nO?}p zOpoDjz3@lyHP89>1W>y=Z!pxxo0dQ~?7o=uA%KHyyH_G2%>|zTQbOr(i5|WDK>F(+ z{(b<@1fd%R7!d&^U}*_}SXL4&qt6u8UvaH+IzmtCslx}jxRkzZjH}L|PvRyEu`4Uj zV^poSBx%4!8$s8`p-$tg(c!wL&>QpXo5xz4$CwG^m7qyO zQ#3x3W7I8%ap0F=k!X4lyD(z4L8^4p`PI*9wr?xVu^VjM%IB?pR$YQEB$2K}UVDT( z?o;dIa*vCb345tH?ru#03pLK~RI*nhva+7;{+s_|$4sERd8lrYM3sEBJ%8Q!>fZ0F zpFuH%a_JCCJ?u~0!Bkir)~%sv;6YYPJgd}Q-g?u;vLDxyUuZf=&1h*Ai7 zDXu1hV=3eN{^~E|*~eeN#hkn!l-y{X=mtYj{A@665r{#mC!wMQLgs(dA&3Fs1cG7VNFRxzNq4i7j=!o;z(&TV3DjDfM&WUYdTb1M+ zfhuToeqtoNb(A@q;#vi@-f^IBE-79qbwXxnv zlix36VtF%W3ggyJ^X!vE?z30bkoIs_^&=@!x)kd=OJ_(4_|1D>hjSNC3n)8CxDh(1 z#nl^P5X`AF>@_TbZrEuYW`2U+1WFE-0Hp*_ISCaI=oB;shymhrmmbvLxaU=PYJLH8 z?UvwOY*-$Sap&ewTfMQ{&6nK>8YJjBrs0HFkIN-c=u3=aHSk5`^8f%K07*naRMRS2 zEpg3jDl$o`gC^4VHK9BFK4Sr{Vb>uO(Y44na&aNA+fLEge`Tb(>C<=Ol^u8Ye9ocv z&SCt$;n&D+`}ZZ6`{iTA$`=$=E-6y5GC*?(XY z4kk3lcX*2Ac^8MWe}m;Wral{FwFNS5&QbR!Q2Vn%#o$7pW)s{geAn>8)F{6bto9qS z$?xi36O!mLx6!aI{)XoMhKwNB67f0u*=J&XW-&hUaA<>@dOHn$xbYMcv`f~pl7gpH zMeU{o(s?fX)kME>?NZH8x45O>3E&|46ffUu7vPgSSlH)E>M8;B86YG`RiI2@N--1Q zvRuM{`se{(@>aSIr22kEqIu5b)X{+@&<*?TU)rgtVfUpR1f_&X(*={8E?feA{k!P; zuXx@o&OdhPesHQtXM{w6lmYVWp|O6QwT+`}YDt|or#L3(xo?xWA(H350p;Rx>eexG z6H)K+IdU{^@>;vH7fPqK8Y=P24o-iQ9CjaP7zcW+`I88`Q}tbitf&fz>UhF|_GWAG z{Eu4O6rw{tbD($Uj_)U>5ZemdO(Vk;u*xAmlx|3Luf;cBYvVvCByOMW;ioP>$HDhe z8e;A1{=RzeQtHNm9VAE z^6^K11W#IHQG+2ot~MAZ4&epliSKc`rNv*pm-r&fY9bnx`z@ z$@7K7vLn2P@pB*I%23+qxlWIfdxweI~a;z~E65ZXmltIQCYp3hOSDuvb+c9p*o?#dtxSQ<9?Qyg9=l^SK zysopt0+j?rgj5NV0tqOibI}B8{?DVA9>5#F?PV8#=2vlDZuQK$GweMqfo|AosHz?= z{y<5QJV(YPqW}0GzTwi@%lAVhJAD<&E5}KpaBm{&dwq4%dv4FPBzEg1p5s0CT-I@G zZwnLXMn&F;0S-^t7OcONnyYoDnmlzHmt(SMwDENeD7X7L42G%8;~o^|wb;dKihzAs z`~LRwDIBT~$$`G>`%crLgkk^U;r<_Bd04WpAF2vYvcfjv6lpSt5QAlgL^A7>kb+5Z z?(vV~uYB_x&M!aLlIVv0#>}R`u+y6#K$0-M(&p|R!jpd3i!QygdXJj~K{+2#25PX=S1p$-vT z6UJbvHyCz(&xxPz%jk5ROigcQlWP@iS}Gn67Ep-4I$Y|_S?^X^@I+ zOkLNb-V2ispH<>Uh8vAo>(42+SJ(bY-hBcB#--H$-RqQWow&JciToqPA0>asU(XS= zmfbomHOG+EcD{=pagUG3%AurjV@+P6$U8*w{_|uzYnDV803UkzZTRrH zTT}@+1Th_Ic5ZoqyaTB!$f|PtMO5~+^4_nL-WvL(U!v(!%aDLNR-uP9JdZKc^|sD` zEj#P^j_;Y-79dC|1=BMiBzQ^{zkC1B;rM62Pyi%)0EK43LY7Jg-J!%cLgzM%hFygn z1R8c93RNXK`yCI=Z#n(586P8#L05Lm&9;Z);gs+EMyg@S^J&eIVz>&U{sZR5pZ7TJ z(@ZJ2(YLr(e38{qL6r)EKutheXy}sYxVP`Q}mVRjl}<^f_I0a5=uX`+rxi%pb(^y=bwIRPZic+fR>cAqu72LJ0<{XD+#`sZ_2g-%S+tUgh#53XT% zVHN0x-3EbP@)o-G-4Ff@F3&Fl;Ox2@69j4ZkKKVp!4N0yA>58rN}jJcAT;fRbysJO zysKrW%zZ9fS3SZ5>Cq7OAsgCiB~tA1_OiC+3iB>{U3y zshTqHdHK1@j(Q(gYkk*dlC&NZ*mQ^6c+1HGw)_@S2=#%f_FH6n0zQ&kqRl11tB}s=ZZvmCbSdiQP?vaHF1uucPa& z&~X(=I{VUnJ=YlW?HeEOY9gI6hk$cS#!G)sXDIG~aH=?a=^=dO^ImrTSKo?fLh~k~ zC$0M2u>1Rl!LYOV$Itoc^N&9HQK%A9UT*S?1f&fY_#&D9^{&|KFN0yKL1vtdW4sEe zwyUVSnfO!0=cOd)dECe3xj)+Ee?rNymI~Cm^)_li!**BuKc{Jiu!7qXEVO?PWngE z+uE*wE_bfhQb)Ookzjzcj!YvdVlYg_y~NO-Wu)8(?>s?x^axg=ngAC^C3 z4~GS++R0beo=s7)rmJ&SKacCC*?w+fPM&c?CVMAxp}k%q+x4ehp&b$hsuc) znik#e4nd3~(B1#!w)E~Zw{4$7?&)?igdy6-#87c%uAW2L(A7D#`7{`|*ESjq+omI7 z{#~1w6rqtXiLI>#-kbB|!R>8+)&B0kLp;a6CatEJ8z2P|$qGVrCJ+|fefAdIeeS&q z%KypA4OO%A2r822WM;y!?K){wVA%34n*rjZQ^Z6>2c-Jo-~9dgtsi@1%Z}5HLSolA zU$aIaOCGoNS2u_^hhy8%1M4V&9XaUk5}br{^hs~;8EXR?R)=Lnmiv0{_@BGvbyXGg zLlF~qU8irKWq?)ezP}j^hS>ViUt&5Mw{nlkb0S*a+MK?Zg)X-hUH9j{ddP53GS}ui zjtjEgUy<)gyn6~X zhK?`#IRO@D`VAKY6oa;9yPeUo*I2w<(O3!0_KJJI1mP4Ds~q{Wcwl*%q)rW3K^bbV zty0fmn7DU2IURMYLU;DRbYQ=;;Fh1tc0o-P3_8g%hWc-P`j7s8R*i&5|F3($ z9+$ammcK2HITp_p_AD`C!@e804qZhZ-Bt(M;uI+WMhXQZK_atk-kEUQ{r?v}bMdsi zACxSzAqLIBuhWVm5bF!b-@a+JT>o;Q#@YTCK8^ans+-ejMwYa!(jJp*e!{9U@?JHP4W7oM75fKXn!!0}wkzOJC|Qt~{u>po^65bGLdY^QWej?DInED*a@#;yI}%s*lK(WXa)dZ@Wub)@iUiC z=bqgR%7jFkw`8_6(5SA?`oyS+ zW*lHs+!E>**|Rk>I2mTk4fPz40CW}#O%2Nw>p z6=$%AprSm6J}Tn5JOkA7^G;5^b{v=6&-!7l^Kd3Y*SvT?3Cfh+3%R1^;JVz9wfOI* zCavBc+Yt@KCacVrEG`Hr)&msZGlG3Tor$=s-%kP1othsp}gv}pd!?o-_L$l zCx2D)Rt~Vc&Lz2O{=(t!`FbuTUSq-Qp<66DPl;^fB5xkm=@8a!O_wd>DJD0!jb2zfP zM%>~%yZOoOx=ZeIjaC14;c3L&%asQ|{d1Ls`fd!LZLZy!iKcrcfOAlid&hx>xEByK=mR^SbT&xs&p4F`r>dHbS!E z8zeJ86z@KLGd}smhZRsEfS?3|>K&T#p`W6xIP&O-5~u~02D4KJLx@9=HJ-@+Km-th zaPIQ=rtiG(CvYVJNN3qeXu?2}HL?)YRX0pf3Dx-6V;iWDL?kIDOJUGdeI7ILp6bTn z)AVxR0>dfE-;ncYhc^a;VQiaNhs}#CF?|be-OIOe&ZaRYpC*|55rp^Qd-d(p#nUj^ zJDtb|Cf#om2E<{OoZ7a0fmE!2f*Bzzo2M&a1>W(olX&dn>HG;)6wn)?^FtIB=fo#Y zXbR&%il)P)qF#VsEq9K0XbJ@@+WzHt8OGx>%hP$r}*U}mT!0L?+l!NEk* z_nCf=iCQA+-6`!t;nKfj6xJwcC4nC6D&*QayN++2CZjEZ*?r9=XpNR*?3cpD_1T=~ zw-{efdLBx#(sz*7c168S{`wfNkN#2Lkwo4=a6#b`-9Gk5;j-01yTPzU@Q-d%rRDcnb__B&Vg&UgG0L4TFp zXcs%l-}-xE$1Q>SmyNGqUqd>LtKTv8LE+NNIydYEO=BmaL%#iB=kX*Av`rO)gB824Wb4)7?>-ViinP^0Mt2h8>^gNkYMr zQ?>kx=N?x*TUQQA+g$sRzu@n)^L&HBu*GmomRMfE_J%!LJ4Zh)TjSU_G|I2cPhI-0 zCcneQNBvGfH-FpgaPy*v&5sg;a11FiQe4drEOds)pZYBRr{ga>PbXC~W&zc#8l8w1 zhQX5OhH1kR=!S_$Ba|qhhagrc-TJ`ISI<8AAXu|1b0G$C-q1#7P|N^ks1lT$6FyBz z^leU_596?jw*xv<@;qqmNG40)(iWh{SZ{`H3S(@nV;p*Qm6x*o#Vp{l1j+bG4THfj z6o&URw*AKORQHHJiZ7;~J<>heK4SUBTkGQl#zjkCV_He{Y+TZ-UD$d*G31t~C9 z<`ATLoO1;r!K0Txfm=`CEYSQS0D(Y?1I>yi4-4vEgJDPFe1lpg$?Uw>$|4I7$AOA(9xRQyjXwE5@LTC=UNg=8#%$KMt*1EnF>%JngUq9082Pi*Wb$DDJ`@!ee<4kQ1d}?kQA<5*S2P;%ki~8T+!&V zuHog7h}|?)BI!mwwUe$G8UjTe>OI_Zqu2kuJ;MLJl~Vgh=gs zgt7+OuH!5Jw8M-%H4|Q;+)}FCD{DWE>OYIMs(D;T&#mkSc=+6X zAKVt>sLmjBkDQFGe%bwwO^m%V@;4l)baYEC~I4W>N2?3;ZNH6^$ zUH|{w{{}oQ=Wz@vQly}H0!b7^$@VGSo}O0?VQ983DWtTlG*MO9VP;(C&gL^rmt6HJ z#v#-cljl>noUVI`CCd$l;q2x%j48%Ah4y=0&90hXHnv^awwr%L=*+$*wRj6@TLlD8 z1W(Cj-1flF;PvmK>!IMIqh)f30J;M-1A#Q-Nmomr8>Std84N>hsvrQwN{0l6;zZ7e zg#-Qm&;N<@XD*)x5n(Rbm7s)*t`pK|n!B7u?^<=9Ql6;Q>Q|R7&v!Frho1-5L7?yE zG<~dzYrrv0NR+kTr$ok1+wcIM$1d-iGN0y@WzY1&VAwr?a zgr@lnvl4Lb2pPqT7U#A!gEbj7j0_V%!??~U4mqQ2QGuQm5a5wJX)NTZm+oaI{+Imak*VvXno*D z6C2NPcG+Ms79?Ett<{H2Z9|fI@wbX4~L&@II z@ndMwQ;gU$)ILV_Z>N}JSo68#&yj#gK{*xS$It&M-uKX(1a!!UAkOka&=WUhzd!(G zVxx1iCZmRtVF`4@$T+E>LoQAeNr983de@nEr+@tEQy^goJ)IlbY=f9lnX@hy3tIJt z5o=T1jX*@U=8E#J1aEsCyzaPrH1ztq&F2Ison-5%TkM*;!C=@0`!s~_I^~-?>m1%I zKcm%G_zll~eTcED(D%a!l*#F?`M$p6kzQnYNI8z4Z&>rc!7w6bHU)-Jol_7&RX|`Uu|nn13lHi0KKg${ zB|*YhpmZ#2qJpdml28f|z!Hy#k%)Rro*U}7)X^wDrkE$(3V%Qb`3~3hacxGmuWMb* zWBs?$+FW|tZ|YB%lmOa>Ais{EbfU6pw{;ALes#+Z&~_v~SzE{TX3y72wRqAM9QhU_v|L#|ve)#%DzGT7E=T3Pe-&uqDWrh?!7 z_%Gq-k3TT~qU&D3P{Kjhe3r8MbCpa{)vlx(Muk73(`hd zQEU?*|5SCW&US5sp4j*d27}pw-I%AQ15yjjcT3KQ;`!n+;;(Yze3}y`qsxXwkk3^r z7d!lnxpvDuj8y0dgLIZhPBVZ6%7m-wx~eZL|hfDSdQLbsJL zj0sDi8^$%n1&nXh{Mb5ETCQ<_&d&M>DGk|(7^07e3&)}&)w9br2*Htb}e zW{&q{0?(bXm1LIGU@&a)zG!o5u=$JYBRL%24Canbpf}C76l86Eh!A#jRp{la2rg4>P)vtRyyx6a7DDE;q$`ekSv7A>0Y*Frne+b_XMJ67SmbgQ zva5b9?SspjmFHx*iYI5;9g6>48N|9)F}eLJiU0s007*naRO4>RR29rzQ#IC2FRDK) zu$TG)bfVP^FE%)9F*m|G9kp&yCM^@y$wW(&gZ_{GPgT zmgi8!uMdz8)C98Y=f+HjmFIFXXBsx{)e2z_I$W2Mywt~H>@}AXL64jKdVy|KNq4!i zTKh~f;ven4E?w2Z*DsdNdPPC{;1Zw5whQH=3zmLsWK(pda&aHmH~z)Hk8l05SF#c) zn=q9{?#O6d3?srS&<#C9g$R`GB}9s>87P&qHU!|_v+t2V{PYn>o&nXY9G%3((~Qub z#O5syacnxC*yA(!2Qbb&g8h%q7Rc<4!C)}NwKE=DOL3??hHcvR%Frn{VYR(6uI$-5 zTgWvA|mFqG#W-!k2U$mm_M%>V@j42$aX2|MrQ5>O);2|N$ZC{c89yY zyD&*KS+pS6U@%P6s}i$O>;9nG_1@<(j?cA!1*hAsF)3LCRY;ZBU8AnU&mZeptpTax3v}TwaUh^`K&_g z&f2gPE_HL>KZQ%TryVK?@}qF6et+N1ZG9+QhMYGJ(5d=)n-+yju-!8l_Rf(l>0OKd zj7#CNv=P-5F52mPx=^@u_V82(p>XjTj|=76rvE(*g-h4Z?<*Z$^sMSk-&5lc7u24e zHNt_y#b+KRq8_iyFKKBWs|ss8{IgyuTq5XSHol(eR6C7p`zTzZu5YA0p)-YxGL!|R zf*YRs7xAZ``OWKo@$cwmfS5>CjR)N@A}oqB^olz`Go{1K)aA6lcP!+N_(#9=HJ8p` zehkXb0AUU=A<=o(k-5W`SDe1OBtfj2WE%}i_x+M|dRKLauWl0W@zsxu7fzI6H(*!6 zcYAFO2E#Oy5eCD)CIG7TruzL#BF{kil~uV@PB=QMxuGe<3q!_Nx)-v(TTZ3)yk=SQ zT#51c)1St-e%Wg;5rK}5auOGVVMNSq3JiVXM(7*>(IGf%9jdqym;=D?J@l{BhtB^t zm|eltM$pfT}UQOEg3vi@;qqmX!=(`U8@oLZm`?@{?*mqtVG}C za8q{3K2UAoVhPvqB!IzS*x|&%WRvRLvQPOmNZwCWRgn5tp_2|v!Bz#w}g=XblE~VfWBhP0j$)>Fqr<&BW0* zR)kKzLfQ6lgTc@#)@2ZmfssOa4h7@32X4kIzxtsR$1O!<7*jrN^D=}vKvZ-?K02c0 z#0gEazXKJGLIL0=P;!bCFTInl{d>oM@cd^lejLhIuzrT)?@%`<_v)(BsrW%)1&y#c ze`hR*vuVDn8qstO%6uJi?yzcpv)?61$S5i*E6`(9Ppy5XZ&M#;w`OE3+=tp_2Bp(F zxmT%mn@esfA}BxqdUd|bT*s^0;f=ZE0KJW;6YJmOr}O2&n;IIP#SG4Un)uQ{*NVC} z4{g_vnDu>u%|mw};bJgs6QNFj%1U(d~Fq8{|3JdYG%9^JgY@>jXaU$g!?$VJZ- zRKBvlI=+5<<{_Jjw#DP?Kkw6?R+% z*qYbgoj)clypu5HUPxE0M$p$Wp&!Nv*EZ$rh3YNlfyYHy){1bYuh8Wb)|8XY* za-lMrp{$NHH)5!UrV_2j5z3!lJis$Q@3NaNA3bk!1IypxrK%uZk>*a!)UKIZ`KV6u z2VjaFfGBsQUl059dQG0DxhJD07cmd>d?;moZ0SE^mOr<#;#57X@~^qKTDj4x2r^Dj zFD5>yCr;G`7>}D@sxEJKg*T5Nwpap`38%9mnNb!J9XN9xqW#7;3%RF~A<%chga}CO zR7NkW#;vQ-Rcjq$;KA>)f{;!Nf}@Wc>aWvZ^qFxLL!jEzj{kTikqB(uy(R4o8=hV& zMnn0zWo}0jqzEkCC9+R7v-h9wyAeZ*{@|HH)TR>(@l?cKe5p=n!$PB!f(F2427De0 z+%7*oe>$JM_!yL8i;x`U+on)*Be!>tR3jNb)Hk#-d}gG<(TXJJzBC3rb42a&gb0_4 z@<131?s5A_51h%&d)bMx{*Kg1*l-{~!j^liznICT|Ek+BJ?u5M*AmS?`rXX7uju(Q`y3n=+Of3%le!jNh)s8Q#9p6>uz0YMhytVjAIh?Z?E0Syw{$TVa z!~+wzu8SwPa{@-onb3lAl?VoSq&RR^9^^wvje21)=f2@$^Nxq-D)qyo1#HDP4fSGw zP$*{8i^C`BL6g3*FQWPE&W7XX8JAM%X&h3>J0G1w>zrRwOM_RnlE61vvyJJAXK zvX#QPp-pk(OSxGp2~G!U!Khw%h93^hI1jXat0)I6BvvDpMTqznbp*VBmMU z^9(B`?-M2eDX98AR#vl0aJl)~b(NV_GNLidw48feuWmHFK5_eD?48$stp`d|y>HV^ zq3vo9R2=3e5y(l1r3k^W%9gOP(3D7?eEaS7UuT=YQ-|P;GEB2&i@Q$^72^=HSCN0# z6eHV?=(fuHvQGI|`JB#=v$DEwTAhze(yw19PDOjwpBYeolvbrm+#_H*508E8er47h zFoi7y&xrYd;#o8uI|#AXNqly|(ZcKrGrc;;3b2D(_vpyzITy2fSLcQPi0moS?K3Gv z&+g@@$IQB+uw7WC7YfQ22sU{{IQvy36G0G~%&Z(nei5?%y}4eUs(xRSZaR==pq`9m z;nJVAzd1;ag){|KBKdTV`eAB}31{)k3`GT0veUZ!>&C$tb&_X zQZgx%JN|1KJ`&U+5D9c|9|*B^gmG=W!Es36aom_XQ=HRK%F;Zdgyd+n6US{9I(DI? ztcA{eu@=LUv#PJHD&J|=4hgo=-OK|)4c*KR(JUI#7Q7Zi0*)qyzL*gNP!!OKJHzGJ z*Mx?jWl`EY|BR$aU=-+t^(ZEXfx~D5tn4^%53Ibvz&EwaEu|la)SvnB&QTX`e%1e(YWH!?-z#aYF|shr zg9zTBUoE3=h`*okqMl)Oao85Bn_QDrdm~}2JQ*_3$orE+1t06(mr z-y=;JHuubgkM^u#7LBG8Tmzt4U6Q8*PLWrCB;JMO_~O&Fiq-$FK$E;}LRBYS=Q%gq zjMU4Q9kK#DEFD7d226^7jvT;}h7UKa?#AIUnRod<7;w?dPxr7|67HGD!jB^=W9}P!^rSleazmbDOF2Ai+jq8*&Q+0mW5U zsF(Yp*NBFbn-p5`zgaBuL!r#94{HP!(04vCf0I}n6J|&i%Jx(kI*b1C%eb2dc1x%D z+6Cogx##4!cw9zXQ&_;Ne9P>2A9IKQHuDVeFUM~xTP6b^R+hy^tJl*}vn`kj&-;M>9Eob+(Uf(OvynQ_0=(gYJgaZ0+wxrzrK9J(%AFrkByPT=&<%OkTHKM1jq@x24kCMnxOJ5K~sfCl5k>XI{uq6ByxN zB*T$h@kR=?!Y(Cr7RN}$Z+o5nz11Dm0>GOY7n5Lh6Wku=dRpd&GhaESnSbt>D<7!K(@T$5CzZq;31$ zLh&iKT3Fz6Es)gQPhd_0_qN|>aXM-QPyBaBqC z29drl1q&%)4g3HZc;NLihNxjm@^_du#~UjE}e(51fDZ7Kg58Jm>< z$3BbiBG+4=gm68yY6*I-SMnFagB{^q{5%(M8MAc-GXx?uo>WH&78+wp=w*zy{qv1b zigsL)4*KUA#xI&{?r$;FpeUe5AstTMnYvSTb*Hxr9;{Wk7-45$D4RpW0RzRdERO+Z zD9RM)8%#? zv0vB$W^O-+0R%t*UVExl=_3x@5WH?PzLUqf^OvY&r|gsI`aN2F|4#hLr9?^LjTDKo zb@n3XUU8`7=Rnq64pXo?;(m)I#X@`GBG!EC*nN~zoyYS5_Dx1hKMadz5;-E*Hx8F- z6t5PGKX&H{BTg6p{Ed5XGd*G!=^FD=km=?IJ^H=Ld*1aNM_0&2iNBCS^hE~Sc1t}X zpEIMliruCZO%;%r*bG#;y8>Guv5&P4-CtnAxvBGp&;<90RK2|djsDf84p~2eiU;g4 zfqB4?#;EaE;SBgs}Bln%0B57V)ZGPJG>kB-20(d z&b31(jHC{cMX?9(Hr@umWZ_Ul5JYO`vz6fx44@;KipWs=c7Hu9XK?q2NMIxof@X^*>zmceJPpAps?0%_GSGJO_~IzvSYzq>%pN8r6(tytiNYD10<;ZWww5*gh_<9}e1>Z1}7j z25h!JRy?k4{{Eq8wZ=VHHn|F|`rj`8?{xD%m-LI<;cX0!Tu!1hu$j0vD`E>n}am# z?U^@c9-9wzRv{Opq4d55s9uT_yA%u3gdoBc=tP%tJLfn9X-E>AXxg}je3!xZ$Ezl83$CYlX zX!IGitOW$bq#FZ)4k6iIS&+)RcHra+rq{jO_kR3=I!s=o-lEA~i#*1BxK=)#lrU2P zG8s|2WY2@#6ARAE_aUP*9C2~79c3oGF%*sj1&mjX_hL`au{VT7ii|5ab6*qfZ-H_} z_XoZYaQT1FZoBeS`o2X=T~v|&uZ5i4NPlgNjFFc*e|dP0b0EdUbcLySw}M4>FR_&T zP)SEkj=^0joj54t9By)V#P*zqNs4*Rez!QdYh+y(nYZG z$!F(!WQFWt{)K5Rh~SZw>3VT4tApY3INxV{L^q>R`?;QCblEptL8hP8@UbhQESSd- zg6p-T&7f0$e~lB|XmQBmEIl*)8&{oDAgO|{XJ{z*e1wZ~*Rdn3UU{%O=u))y%cW)I z-+^aKL1$?`>$Bqi`09YVU017!|Fs`Dc z$qK0LSGoKi+ox#2m_I{&g)7#X9qZn*K4V^Y@k-kqgi#$A_H79o7NVT?eHGrL|94Yl z{Lav263T{MLX1`Ou^NjuP{n^7>?~ei)e|Qt-Dalc1~o4kEs+SA96@FQU}ZIdYe7y7YsJe zu}T?uY=-~PP8<&;t=#OmG*0f1@S~b8kJS}~rC6_Kx(=F{`zm<5$F!Z5(*+M`25SMB zfx-41aofnFE=u`S2&C~uNhsHY8@C?S+3hzJX&9oW(fPb?laP^R(`_C!yefTIM-8lk zvU+~Dm;6<-Oc8FS;uooe_-$p8HEDv)bJa0HTIMx6@eHbwyexzUcWiE=Z9Zs(Y~6Jg^+(7Q-VRN*ix z_@;zYH%gs1={_nkaeHD)q;j`;`}!>;LEAhzr}*gixu}1K*qmH;_Dwnq$soL=qYz5z*)VCVg~@P zJ!h_5wA1&Y>F##&t-XeFQ2+cvla0GR$=q5@8NIm`=I=%AYIfpn6hX$rfQk)|^4fI0 z+C076d#f3L*~Dn@vqnM-eaT3gdDbg42)8(Ab)tGK?KfWAKC(O{=+_$Dv&;Mupb$#QL!D;bQX%g7!!aZ0B=sy(5TkIW4l&?O>5y8 zmn?W{ab<5rvv_%O6IOh6dGI$U;{%iBQfL08rn<{wM<>XX7E?1$GwW3UW-hX5jE!Z5 z3IRK&fNmc#kmfzQEaml^iyvXtHzv0nNgH2D-rzMW81o=1Qu#qnf5-X8Hmh-3fX*KA zLiFqjwzJx*lr?$=r#|xYY18ax)Ih=GoBsOqw~m1BH(4{sKYOCLtvrsJ&26=Jz-D0s zIrJs0pU~t&J+B)dn_KOUACufE1!+YP!2FsE2Cvrr8iYH0*eo@$W?f(jIw3)O;pe6c z>Q4$lwg01L3BOl|fFy;kg5$Vpoc-E%h3RU5*~oFgVS5Vqz-bN20?!wgJt`Gh{4jF` zW2oolJDG=4Ggpz#@fVLphxCPio6Fn9^?NPdHFAx-%sDl3#T@tZixch>bwB90nu!0N zQ|u)k%0>bBwy#l4S3fi9bQzc_C8KugQ|dJKy;{TNiw@qk{PVNEMR4VNH_}fGB2p+} zmWLr2i<-Wbv!U+X_onV4$|%s@!58{5CrNRb*fZO4R6zQjY66ZBWiI>*i4fjn0^T=| z!E{7WJ5)wAfyy!ca}&yC8GQgeg3HoXJJ)ggsnTxf6l+X8&0G(6s2Lmo1OM-?#!3y% z!4?|H6?56Mc43}*H4k3fZq2p)ngSNG;zhS*4W1pZt|~21&*!a>?KDvR_Z$KSI#?9)5UooF1`y9HTh$cS?0&kFvK&*T1Gcr6e;9*C8WQ$w zJchoaRWi`tdT@(-9a#Q9h!c4g|(- z;h_BnIQ)!2=y*)=*d5%w9=*PX1M5Hod_;Y9YKABG5F?Hsg)Cl(A9sPc|Tvw@4iJ1 zSZQMt>5o8oFhE_~8hcKAzc;pZ@;ek0^*+Iiju@P}Qqzm8DbUoSB7n zE3t?$OFm$?twim$>b~;H2AC_l>?@8b*%NB3J66pYp3QzVG*(AlR96~Y^b9bO6Qyza zFIx@?p)&bG2M=)8sYwX#UhYf`{3~1Jw*7~m?Wsfjx}ou1F~45m|6>7OJqJh!d+_7^ z)6>};zI|mgm$2M~iigS!6BbztQsDo70+sY8T5EM_P0|Z@4Za?2Ac}c1h3_-K1naR6cUGFcbbRFAC9P=YzL~lh(=`=a0;C zwGRuz(L1lQ1sv&PUyXOyHX~u13X;-)3zo2I@4@)|S?Kq4Vo^LZsfIxtQbdPC#u+@> z>On-SvDy(i`TD=d5&2)EyPX&Q+_h$p39;Lu{-L)?+(3dBs>N^7a(Gvn_hFoMlmEJB zKUnGjeOAY5(^e*YDcgzl-ln}dTh*)JL2zXLsO28aLMTKu#xF~co2oIHSSeh+f?qPr z(Nr_2wt34&a7jnFc(HKMs*$VNUfsWTU_W`qh@*NfGHC>y0&ARv=?4PKh_r5-~neLo~Smjbh;>D90~yN`BdBar&`Y+0TPutXxoPCtB!$()$iX&T4^|1 zyFhPDnJ79_u0o(UFN^@k7d;cm_KANQeum008RMODWk6o_{CDfuwfnC}=NX`dysVWsptoWiW*Q1upFi> z%jU@|AZC%C>4m`jV>J&llJLsQdBGx)zQaM93<-cCc*_@qQ6ZC9in>2 za&~2^;VL>s11PtRGn8&`x>u@VJ(opvqRuIxryiHr?IiAb&@+VTu`6_MimV@(?kyD1WD#oI`Uk^&{SidbUlTov2l3}1Nl%~ZL3i&V?ZyhEq*u8&k6Z) zY0QS|(h1Rj2zUN)^n?oxb;3^>$2ZuMx)8Uda}*)pL2e45Z}4HGABSB)a?Uz5O59E4 z{gB>dIpKVfvYj-_BS({1JDlbG@S{w>z>^~vrtW-rGMv_A$_|=w3v|!zA;J13WA&#?#rVrNj-;pC0@yA5O_GW1^wl)+5i*$i4t6N7aN6tx=JAr)2T2SxmdT&~#V6OyZu zC?uspF~**8`v=DI)Auio>dZR_acj=05b z&UGJ}Q*t!4kYT+wZ%JYn8pax;*g7RCEJMotHByrLYy|zkrTZ^>HvHMuY#Quh%`V#T zz2p0gGBFjZ-^sDfF`&aQkf_b6C;{>sEJpd78D4+zc_;BeI4MY$MkrU_G}EGJfL;n2@i(y#ryVH~bUiSAIq7Euc%c!f z!Hog)rLJeEz-V<1`1p+(Fr}ceU#^C_ot3fdm<>2m{;!0kz;F{h)@ks`LP7@T4%JwK zX3%j1?08xWNvNc1CC2bHfODlwWNzAfKIrA1Y7&WnP&h6Wg?|O8sZZ*8%6(it=LF5* z{3Hx-JsL-MSE6+#Cc@%rgubvaJJ+^vFXWHq%$CpVY9$b%(9ZGE$8Fs{=K9TwGp2x# zRDN@e#Obe|?J=93JV%ocgH2f)oEsPmKoLm%0JEg;Y#;`FSIF`|v@*;qmI}oP6cv$y zvu0DFggxr}{=>x>{!X5YU4#~~2DXPNDezTDoU8qF^5ZbRZX>AA(sF0d%a=JQEXk~P z@42ovdY2Zf1kbL$Voacqm*S88geDsMQX2kWbd%OWFqS1(@vJLg(cgHJ=gwgS-G*Ov zZFPQZ!e{{pUQD}dCvS(u;pZg(wFtj6;h+#oJ0zusRi7?2M3DNSt2U<{l3al!n942m zVgev|g)QiMymf_H^3vs{0CWc^OJxtXwb|(S79fcvZ~ivXLILRr7|(%Wx|NcDBOAOg z2t2A#v8Z8?K=OeVS?!!iYm)_UQS6_r6=8O6yV#=(v74i4@gw{e_gA4wueV7AT&|k^Z{qyF z_7O4g1tN|+ierdp^5L0BG$1nr4vJ8Fp0oF#(xY*`4gA7OpX}Ok@v6yC7=IEra@kQ8 zCbV;cdF?@e*vxEP-Z4Z{GuBqQ{7*4%wZH7F$bxIk1K}Q9epC)&y{QIIguaj6IbZvI z2yW%;*Iwp;3X&! zPzk->HokTu1)qFKJ9oV!L7tP^kd!Tm&yjuWT`@(alj#zh6rjPbCKS#!qDcZ)@CC*? zOU}Welx+)$Iin%LAYvfNqPTFH&o8Utjc7L8C*dPeVZ($x_i_4z3;)iL10)XsAR2TU z!2B1&Qry+bHV@dAK`ir?8vM|ahA41YCc+6FwMd&3_Qz|5phx@q_dj57ZYrbDH^aA= z5F@Hz-ZWpda6|>I2jZ!wp@G3P35hfa+jXexmAk1GEmdWdmU_iiz3IpUr@(`Ib1A&>UDgGeXTO<9C@98hHh#@dSFg_c z!MGE@j+#Fs3-Z2YCGa_x*n-9v*>evUe6_J^7QN}!%WKjNTjG0*2=MIBDnau`I19Xj z8qmrXF^Lqdr9P{@s)Ajt=!W0d=P#Eg>fX0YK84Bp6iS;$bm(R14QblGpH?g?!C?t4 zUfF$_ydJ`Sekh!eno5t|tfN`3n_RIs*1y%Ni+!v+v&dH;v{Fy<&Wwg(iq4_U7y0cG zH*1|9xp?WNkKSSy+8;orQPMiaq!tvG^GVThc@sCXURWW$&cm`ZkPnIpl@K~bfy@#_ zhIEAt?b{aa^I^nj4Qrj`zrQttmx*?RjU)`DI?%$`IGA#rU18$^t1V>lISCBPyJaZi zBiTBpaz&R7?adpV&JRrPNQLC-f_2;D6ou~VrBn_Vgk61hnDB!+!bC6IP?fQbjEKWW zpd;X&%BI4y{fvAcMrHx>05@gKWgJm=fbq9XpuQor2}&$943tOEuZ8?Rrs01`pdh{< zD=uUL8A@lByo*LS3AGA~Z&XSxID|3XzGnEH>L=6YalQGqILohT)+@lZHup4?}` z^Q&Nra(XzuZ%W|eSBS@{Ov2&yWyH4;Hali1PP%J5Y1dwoemfA8-Km?{fMa<^oG$6a zpT2+QH{y8MHQfAnXCd4k_k1r9T~NxDt=-`3;B+l`^b-&)N_ODbe(8_d^C}6r23NmY zf(7HacbOp)C)6EIORhL8cUqnm?wFC9${gCs|DjAeQbU7_yLOZVSZMg1Xm!c%lL?71 zx;di{iT!)4I}?YB-4=Yw>`|f%@1BIL*)4Ztt#`Z^8-0L4Q#6oaj->!Ci1@!`RDGbFte6v z?BW6hH4X}fCj)4viAvGcgl_woc3<`ow%~!N)nB6la2QTs!_lQOkv9f-t!>dO{)aWY z5)n_{#6_}&PN<}zh%lcwTQFj-kXzJ=wqBy?ZACl+^EN7hxO?ueIeZTyP$5Z1s~uWp z*urd}sJ@UuE4yx`6A67z?yD;LqA5UsRYCir#=*k49H7a;J-WLq6T?7Hg6P1sILN>{ z6_ou)&jYi1P*#pJ@y~8$60v3xhNI z5dy zp^Bb=h+S`_KMfDxHx_^2tL+r7)yx;DIQ4&LwDvVz^W3m}o>BDz&QIJK?qBEfc>VSy zG+z+bDApXmEWFf>6{zF@{V)_EWu~PXTe=Sx`Yisyew)%48c?G75?^K`RTjpd^`o#_ zh+$_L*w>@*`bI1y%H{X5`bjMXq4rhV%F-odb;}Z5wevsirNI}GD=BF3i>Sm;P%K~HvZ3euEd5&rxiA$x>gXOu5 zRjzCZj%`tI(H0Hbf`bWFg0lM**FOUE{_(a%MX?5 z_{!XI(?9H;xp;KznDeZLA$kw2^lriQ#q&oVw;A?GToB8N7#Y08YxTdAL{Ra?hCeG;_))3|E9Ou=o^_jk;8zO) zVY(wiO!(PwYW{$rSnEQqt(tc2q>;orjT3Q^LyQHW78Yt1@>+K8lzr-jK=;4YZv&7K zH6oBjO1WsVMz$Z8z3bx(SGBaiRSwu1Oc>2?ecQ05Qu&1*4(P zaI*WDE$)=2Xp^hQ=~K5+qc@ap%7otIxEAp>$Lq#Xf~6|t_A8qEjSN?!_-4upUfx?2 z$EOa5YuCqatJUN0*fhd!2STK@P%b<3bR$z|>h>}A9!ogH0^%Uq zHo$$Xk2Ut*TwH}%k2%fNNp3P99dK9j( zGetwYos{m=gdtWS=C)_1N1x&YK25PZ5hCeyA|Q4I%7vSTMrv$IGTUwn1#i{{yYX7% z%em3w4q%`%oPW;8?x0Yfv5)EI{K%*EUvA~V0T~IB%Or5;l1m3zW;oprR#K2~wp-vB zg!l5GT5P;D>^=YGwK1VaN1_j}XpLYRF+r^F#kyo%UvbEIjs}x!U;dc$^#!^^#+@pu z*C2E}orQo?w@pEW7%_D?8+mcAzBcv>9>LG^xSs{&7;{1)Tk~My;1&9yMkfjjprDN` z81hpA_`%$EW8}2VJC&dWHtYJvFSgHO2I2DGG&qnTW|%EF?c#G3jX8cXcL7bHYa#uA z#uLF_1G90(e{OzGY{Dk(^tEVxoxTq{4hk|Q?t9LnGl8V}c>iBf?W3mv&E3dY7(*ll z^J>3s%8ejNo&7c3gT)s1lQKD^{D9w5>1HI>=ZD^IPDU(8e98npml{Ct#^#WM%O#pV zM$&zQ?RImx)n4njT8eOnCax$(W&HO?233~@bxdf@7l%@o9KBQAdQ8si=9HLvl7H!r z=~DE)&1;dwF<>>gn28d1r&f4O8TAVx-QVgj!Kl@Bo83*VO=s`s)rJB3oT+>Hbz4`9$hv&hXl1dd#-|%d1uJ^J(Ekt8`hFOKqZBYlfGgA($=KH|vJGEZd)? zUyY!J=C2k-SbsBHi$W&cnM##KpLL~4=gbc);#;){zl^?x?T_>rTkTk*6U%(P3FA_4 zHt*V`F~{Ldt|*}t7r|Waswmflx;+cMWw9YBQ6+BSL2j38+ozl5S;3i?bbB&yp&`=3 z1)e{iwFvhdS4`(aJG^5vf?|r0N)e%v7|pL9$Dq&il+UXh^%h`19KmpbFgH(Y!4uKlrfFiBPfA)NeN z`NGfYGA>n_jFGLZL+!XbNj(e@h234!V@%12R=D?Bw~XN;*NEqL#6YWjlC#o%RgueI zG^C$#l9))`V!Y>-Kb77GP1-Osh<({N7vbanBf@k3Pi_(+`7Nq0r`$mplJdhd6Yh99 zz=4%ZKa0P@lzR7ZA*OiO2RWx8xiZRJ3w78I-F3f7vC^^ZqITIEgkKD~`q!^(9`rbM1 zsE|d~v7IFp@N8S{i$(4n=qaqPbhIbZgLZTNOoWYd+(GVc$ zgL3m_uM?fsp$XNdQD*vArYK%m_4)ijfy3``QkbzXy4 z@kkiBNLSv2YxbUBps6^QL6t5`h{HGY8sC5TXlFj>KJR%QUm}Bw+9q+UZi_1Ww=162 zr`>RoDt+74v85^S9XTmS({3(`eY}#SGBU*tlZdtTjq~RI))!$&VESDTv;(txPAMp+ zheNhVWS-8N{2@N?{pgAnzHSEOAdsRp{XEf(IZ^rMCFrW<%Jzol3z(Ot2(r}{VlV- zi)s99*LN%9aY{p6zQdWHf=S^$?}Y`M(MulKhZpK_d6 zM{@?tA=#cTXY%LEB!xZG>GGJ0MCaJn_y}PqC3Sx92al_jX>EuHvQ{jBVJKApunQ}- z_ZBlk>ird+I3@|?`$mp0oM}6{xGe53!WzgCq?o74c7!bqv?jG(GdV<1Iz5c7A!W@& zME>8$PKtNdr@j`B5soB=RS0F8yX8@_Su~PQzSSVkG(VzD1=h4pfi>t>8J}Uo*FmVo z7~7nGoSigDu+^#m^^4VKn$3k}%8~2+NIK zV~v=qy)_-%C811a#|z!G&i+4UUv<%okU5@$V^2{LC*-a_THR7;%Bx$qIP^(`)DsNt z_lw8zteXUjf?b{aFSkQA=}w_qkCw}+h!am6ZOqp61kg}wvNG8ytKT%bGCcg*I1O?*z7HQ(YzdH;(s5w0oaxD4)IKDe8G_Y&($nuV{A~+_iMnuAcs{pd1 z0Uh8+CV#Q;f+)!qEkYp!;9Ai?*x~Iiu@f!`6&d~~Al((;vQOHuAe)&Tfzl@x6W;N-=c%<+-#U$t7B)CTp|({O{n0+B ziLwCs2+t*(#xnaRICS7d*;yJ0LHGJ)Q@QTC5RFCxmQU?tB<^EnKjidKcqz!Kq)X#R zh&p&MO{Wi}<}U{Vx6c_F)`HD6Zlc9@wK#Az>Znq0{j>vm6AoZPSctXk99hbZ3E7i( zwvM3R6a(&q=(R_%-VtJq)Q>{KBzWjO&O&~jLE~Y=1o}~u1=0{)<$+&xM{oIgImLhh z8A$-##pXbo|57VnmseTucsf`kEpp1K7J869nQ#PySfoK80@DlGX2xu1Nnp%s#B1I7 zI7(7-wiD0R85lDT?PNgi!?7Y~8*WpP*cz}#?ETtDrg=|@wgz6w4m(9j&=C55u4rXeG5)!diPjhnw)>12HEA2W8>=xl|Ft~0d^lq+u z8B9)MwXzwu0v2_HLA+{W?>3JR=uPSGIS2qhh>`{EM^soN*)O?1lahtwhnNA6aB@B- zn8>EM@H?k?yU>s52i{4r+4&`0M34e=A8*Ah!P?Hv9|&E*U?^AMuMiTaJU&lE|0Xsy zUD>cAzH+v+L$0ur3^$uyE9MHNxZkM8OG>WooSMn}lY(Kx8F@b6I{qly=hql`=RKxP zVEr@>C#?%k%DV!5Wz-W4V-kGKr3p0%=M)xeVmoj}w&qQPyysyg=%DF*xbKX--aAo2 z{>DZP(cm`nK0 zd75Q2s^LC9XJCoEXnE+YC+RN@Q~!HMr>Z{9z5JcPwQ`(NJ4WBD z`^6`v}HF3+z;0|`@S9p#lW z4(%#Yi}O1Ejtfi-FVVN1Vczj=zc(DlpHovf{ib!8Vw1z!BONUSH8rm_4|x5C9GgG) zX<)2f9oM1^4G2c7&ho@<8|wvsXn!)B2A1uG-CS-f>=#?f)~h+`k0qDE8dH1wLv$_e zXI#x*zDQy_@O>Qcsg$EJkXhyA`9PwDsC}Jr?UgYCi{8P;AWT!`MoMzi!IGI3I2Sux12>vYaV#&Fp+&7xn zLx{xf$c1Kdl>Ik{aMkS?Jf3T15ixI5jo(oR%jyueY~Dz$CpY#-A~8 zX|CI-G2+qU|6>7;uzKaretb@5R%(#f0*mts`ukOrfB98@)2;nqy7!~Ko0))zjEGYG zyaMG6(2o<~dhvL5)~yLG16=>A#4RYI)K7!~IHzuy1dT_hBdHTO_Yd#=f`jPl^nB@6 zA`)3!f*Dc@{^l?t$Lfi4w_gc?4~r;+WNUuOCwo?z^QNetUtdIyY>$okNMp()c1@#|$)Kwc4J#1d033-bLHd7|2EYZM2!_K0(coT{>GVmd zjbQ@j!Jkf27%qCxlN)e1V|ia>s|e{mM>zQi;)X~m(K*AgzvH(r3E{|rRT*1mZp6ArCh$T9=Yy6%2ank20$z;>yL^D$3*t`J^wwlroxv^3Q** z-DthsJAX%v5@Uv2Z9PKrjsj6RwkaFZubFY|2$!4xYee?9fGQ)=F_oer3wV4=&};T)d-LD*8V{gx zMk_K-s^_up)ho5M6y@pJcP9JK1KX@lF!!PkxwYg6#qlag#Mr#FTF!qv*Du6E%HY!V zmNeWcJ>lKz$fbYfL2HqUbGh&vcm3`$E`IyhvBi1w?HM_vQsjLN#znshd*olrp@`cu zQgaqDdBdB0Lxn*4%_yB8w?6*)yKV0l*DT0^h*nf&z1)1W8IFqJxJ`BffqSbHuF1O>LqJ*4irm#vv{2F&(l zFASSwnwQ{1BpcOB2{Qn`8%0{_X+aPMi9D@?|C17dobY2zhdCO~G8#iKd|+9bQX#UM zI#@YN1`Oy2JIm3;YTqwFSgfu#nlEiY6jwgZ1_v}P^K$TEuaJZ^N~tG=T<*VIHM?_W zSg29HQ8hnzZKbkb()>iX&MHB2E~4SjNtM=%vdI2a7)l>7`1uhgvwr~0D$YN|HJ-DLjl@zgr0nwj}KP; z1+Ey;Nlu`I=m5o##!c+Ih8Ajn@3o$dQfE?NB-xNdS3Wjv2zl`XLh^n%6?iF3*b#@i z*R3?_-ORlGN}|t}>%_OHirdds+_-gXRtzy-HS5U0sazHqeHeCLrs5f1Sn^-J(qmdz z&8$A#tbfPl)hDlTDpR6*+jhz6N`1QF3wk9&1pZ3N)ukM}Jt2HmE>JQ-OA{TdkP#{o zx_KvVb8>RUQUdh_HPA?XSK>lIPD;t`l8>kk$y-+t_|5M=JzcjK`5UEo046^}@W8xt zk}7U>*}S}&E$svEk6-=Xb3P9zpSc#r?Y;dj?@Hgdzq>AYl8zR>inyDOJTH@UX^X;8 zze38w$Op8bu~8>?u1@x=GpV=)NRTizL#7;x zCAlh`fuIhCqQ>Gv5E$*GQhNH9-w@u~k(k#W>!?J>~mr8*LX%Kl+2na1wKmEdW_#g5TDk=-^a~xP7xR zdo-Uo5AULJ#ZBeoj`o=fqI=vg_G~kpgG+LlW9JopWc9gBCmn`>hGWw*vpAA72|wRp2L?~Ja zTp^wpf-*rN2^e%zG0yr=Ld*~^5L2nhuPFTLlTGoX$9^gvS`pM=ZW*NVHw26wFm_U4 zq8IkBHBim|r1Mft7yo}WePci+?h|gCZEv>QY}>ZY&9-gZZLSTw*|yD7ZLX7zdw&0W z@3+33>dZUu%rnnB^9*4*G6PoL?%@YH#a~V?b_#{}r)#!Zf2`D=={B>2M%l0Y0M7?Z5tf$*(Q>R7 zwi?@X5hsAgErZFljOB-n!?d}PMgN~_QGggQJ1aDu;)Sr0s)0YFOb-X{3^5L ztdVA9frrv-xjLcp{$-KwRig0tL~v5^O#X{e>lB%I+8yAiqT$Iseela4QkH&4rBYm} zmp&k)Hnn&W>vLk) z9R@XlVWgqU>>OQzyQZ4w9I_&Px;UgW>mng_6rj7zZvT97e|(olvp#Wi@7ioFR!wEx zysP#2zHU|UFtOw4F-R(h(meL56v)Ml$X{vhN~U1DxWxVM#DL7F>*9}WqO8@5u0CzO z=;^Eqln;{)Q(8}jungM+-5b-O{zsz@(ccrlAo0lcE!0)I~ zYI`d2-CFwrMBPV(n$>qXNwn{;Kc(by;5-y%F;CHv%Tr-^0p+el ze)Tjwd#0m}9I%L6#w~|jXyM`5Za;v7Ig~ji^fPrdSgRF1%UeXdkcGQKa+xa2pQl!# z&uV4kq}*Sy-3d)gC|y+0zj7=?%Tm6duRo~2ci!sn%4qaYsVy<gmb8_ci6TWz38xN%Cp5ZnVxe zprn!T%KI~%?bUxqVCJf3w7a1_z#sS9IBW=w6)cKLWb*Nl$NR9*L+^g%)jNuQ8CGd7 z>CBh?34|nIfiLQ*NEH4R#^}=v^PX0mgEyh4`}ag9e9fq?B?#63QP!kfK2c4nElgHd zLWhTAgbr8JEzi|Q50B#~gt7UXlDpSEYECB8ls!g?6?#yr!t^6CbpgPJQ8ag$5+&?( zy>oDK0y~!vMS875#lkwwk@C(&R!KYmWfmnpRBD(p2kNqKZZlD3z8T4ejGy(}nMOpq zdpg0{vU}Gj626Z2@F2)4JyBX@QH>KR!;Qyv5bx(4;eVzurnlYsH9oM0!E&U;AUDFFmU z0UcSC1j#UVxHAJEYO{qM5Bc;_-Hg!TIc zCN#fGQPXFA6ZmHAk@|MJbo%T-kt2k`_$||eGCGLm$Jo~+N)tk4(90(~^*GGvmpc&caOy;v}+&ImY zKgkeH^;t)jIw!6o{Pty_*wYY*`gROUoE|- z2`b3GecgS@aqap)83i4~Nd{nYjK(Cq;>)d|gH!$Yo9>Z-P^pdLGOm&1-0F6t8i3U3 z$U+j{fT657juNhHaZVD7f#zuO3WTWzzNFB=N+=>!VX4OG=K4 z@3Ft8-;XwdX=fB)FTBWZ3G-B$zpM87r1$--3c0$CANXW2W>wo>`K$jh2uybUst7R^ zTjAg3hd-D`7-g@QFLWTt;j|$n{+3EZB4c10-NW~3-?icwA!_VHPNL8x=i=ex$wjd* zc1y6f4#M1CY(odna8|N|$_Rg7niTKM5B{r1BB&(8zTt;bk%w&{z-^aD3G+r!!(jJo z8NL4W+gmQ|fU1U>hZ$Bq{s6VgZX%QHxfNpiny?QhC}jjjJr`RMU!w>;H98S!;~7J{ zslpz;dbY(Tcz(Sf$EHH_FW)m7Wv{)ixw_@Ec4TqBpG}hO+K2+0rWmt(GMH&6UK07f z$ZRN3+=Wt?o2OS2T5=BlxfIF$vohd;@saG|mSx56G5LGMT>E7i9napbb=ZNlTwOe& zs}Zs;ZB0QH%@|!%GWg+ilziKQDND;`mzP8(U$jp~7gHIM2e|{0N{$nQm*(UJ85QPS zAkR+~nO0kMzKR)!h6!#Nt<5Dlzi8pzQ~tv<#qnMmb3R=;VlY`{MvaK;7~v}c185S* z%3pPeK9O+28|zMg%5d~n30IcD`jpOzGChegtNn#&=nc_t^RZGl+pl8k_lj#ryqs-w z%loF!1iIj<*Xa2aNqJe+_w?-k(_R5qi73aM;tTFnB>NQWv+~M#5*5t1tJ6kCB4;kt zaEe>F`7X+l^YxLgnE7Sb+|GjztSb(XagtSj;k$g&T{ftRp^5|D60AhM%-839eJ`{D zUb5U*1_Pu*SWDBti(~!%+SH%86udlRN_+fdY?3&|eQS4Zvu{5i2%K#YvURT`Ri(ym zpFKZGsMkieXn(wufq9jw+G;3x>n2h|TDP0tWZiEj zdi&16_CXnc^UaqHHj*a*ru1Sj!QTiB@ z3aw^^c)tW2G3M{3E$>80(akex@|;Lyy~QNJiGA`I6lL+6s1a!>s^P$B!!d#z8Q?6u z)(_n2RR&cd4FkaB3F>pjSplAO_~@G@!cC|9VBffTq|pvV_e2!Y>z``02IuuPQ1lbI zP6k|!{M-q)wMgbwV8aHzE{I@?z)g*xw7m>H`mU~6f~ZJt*VZk#xnz|r#d9si*FV9e zU*WA=g42W~lA-^W0lH&f3DQ0V0`$ZKQ+ud8h#yE+!jLQ4UXqkFWhFJos++m`8T3pt zP3TFrE#cJXdVet^od=VuS=R0EsAG|vc&Yk54DXK2cAe%$ju50-ioZor&gsd;)13;^ zDtd2aTEfASP%cLnzVhf75QI%|OTuciE{V564PAcVvJ(XYe3X zp)oTRtVXQHPIH2bS{jX9&CnuMxL|3sL7U~0ycz&dQub($7-dBR8M!K&qLl9BhMN)^ zFmNp>7l?L|I6|-|t5Q1h1DOsJUti8mUs-D2StQ|vzGOlZiUOb6d?a#@#889)CKxe3 z)#R|m+)P?q&BcYJIzj^z-yosXHx5WD7?1AAD~Ox!;@eQN#k^<;0YM{zKf^{ z{R3{=(}|!puMMGf$IS}FOF`I>pcRcetzJ3~Hg4wv{D)#0Atl#vxt%YN+7ABu{-Ryo zHwnkS5-RA0LcT8f*B(KZuF2!+#0YEX{eefIXc)`AV8C8)a>%5BeEr(rd>sI8iNooI zdU&?5jC1|^Cv&gw^c0c+uwQ=H=JpS(62XpY2ZT3R?Z*7sEK)`xnFZ}^M*Aoht%Sv$ zK5Sdigu@2utMus>^W_MCT~h zIcv~zIft_k!cjX+;lFBhKw523#GIU{l-raGp-kw=v=p;Et7fF-G&wyUF1>b$aunY| zg-vlUCN^iAy7vn0yh1h~j57u*?&={c5$_$#`!Em%PO^k%+4{u!eOkm$D9ZT)TvbD3 z1LmCQaPNfj<67$z;rB(~B3c+OIi+w3Nj$eK4a1G0t4P2DdE`U3c(uSPD~*24s9#5= zAQyb5EnEqwVNX$Xe%=`z8hqS6do?8mI;lHX z?qIU}BanK=DWTw0{{ZC^Zina4Ec&@BiUO@7*#@R%kU%({iM4E9UpD#Le&6-lb~~D9 z58yJ0JBSL`1jlnLfZ1WKo$~G@taa;Q(3miMsDL#O+_C$dFqk!B-yC1cM@E!`u_^lG zSwLO2f1=nntJEN=Qpa*lKI)i-TxvoM?}{DJLD;P@P%G^^T^9R!!4|Dnc9%2fC+*O4 z=O)7c?-{1=Oc2JI>1aR_Wk#z%tv5!oG#6e2O%afj|Kug5V zxxZcu4{4&%b@6_w>gFEyPS8>!Qm|B3O}PvZ5>s!5#!(YUspR@79x9cFdH9iq|A^rn zL!DSKn;;j6+MIs)<#>ALb1n>67=k%*sEr>e2c|ny3*n-&FY) zN&=enb#$P^CtLE^yGGDKXKnYpgYf{5ZGkXc?tAyj$QN>`u(B#Q&F8D{7xPxY1-YU# zdQg3im`f>Wd*IIpUrPuj=M=D#)L@i+qSqCObjNS)L-+5fO$sP=@xZR%+eiDD^887N4$@Z(`X9zAqfo6e0|fay(kMEOyiOZ` zf3M&J+(W_OF_nU*lRP=)M$%%5z=f~|#LZnoq zVMlRerNbP@H1QJBbZR+2kK&taihswFvO_PzvO*JiUzyDT zHy0Nx6mR{X)~BBEzqFxzCP5SO5S4VKDe9zTyuSZrysvAB!O%cz4mDsGWK8R6Ovc#? z;<5cQ=|CfWux+N`9Z#r^-wf|FmZb3-MaQZ52J}?gP_G2pP4M?8cZ~FN2eOBA%BpM{ zWmOTgDs4Y-=$65M#uS3>V7zCsWP_zPnzEu*#{I~a-=k&;bd~KC7N-q|ZK06KG*OJI z9$aikoJMF@jxV=3@2ovFy6vQSQN&0}0CR79L)wisE5!f{+H~mn-nw(m2^M0;$F+C0 z*~_dx9kXB0*Mlv}+})^r${&GtJ-AtY1XpL#c%q4$9RKY8F` z(e7DZOlD%eHQTOPI|*uAH>O2rdZP2uq@z1Px1Z?9sQ3*2w$+%NLX13@^Y`I^r+MzI zq9ZD0+z+sX5iRG>2WsI9K(zDcas|s{CIE{&Pk(^EK?tf1PTk{Xi{5C``H$MrLxH`E z3Y}+l>YOjNtv-HE>aVU_fTnvjsr`GiamTA`hpE4hQ`CN#r|fD|^LMwaMhrlJ6gdo+ zY8%>~{*ERV#*u}O`QM*>Cb=S4ebP-2_8t{ooh{EYsp1}J0L#ipR~QBQ*WW4WC#QAKVMbl zLC>(DqlWa^89x;zYG=nqTF#P^0gy{GgqLPlu5_0f z&L7>d`S?fCYE zAH!8p{aGp)$_2OZ5qf(vHHs_|l+WcRFaGO7K5%u#By2{&_ZMOgl8-NsVqL1#ON}Kj z&13|z-d(N;XZ1P>{e&mi8qN(wVdNn1BtZHId@NH08|ER%6`@RuGVlfONERY<1Q!Gv zv3Xac_x}9@6@R1v3mKdwhfG*Qch!BF|11Z5=Iffje}o89X=_=%?t;Ohpih6E3U7Gc zZM)a@sm10io{1D)XlNIU{{OuIP_;q3@i}#M*E4$XUR$9K$v2?EtO!7ev)6X$GT^!c zoOb|ph8h%bw|ia|U*BQsbkWCbZ7h^jfQr;bGyp-(bc!})1^&^Xgd+6M&y~&{kVMYG zkU`tOk=CH->ygb~7-|oPZ?p&Xn>z_+oz$!f%(2sMF@E#T;JiPn=n&FPmW!B5+=Z4x>lnUY(%c3vM3pPssIwp~Xdvi26zwVVJOI#K9MM*eUx zTC<`oBlI{0gMeoa8iE3WFYDV29l@*XSvNJ#`n5tuHyN1}vJbxwnJlXHY%#X|^VJcs zpmVL!cBG`|j?#J9QUerAW2@2Nd{e8;{@S&5_xKo;hzQ>3A0TGsMDfK*Fxch?F7#25 z9D#lR%iNue%=JZh!~Rr1F@l4CBoA`;h>&LRPCre^W4bkS(&#=$;5*mh3qqnK>7#v# zDFG z&LQ;(in~?^2)>x-Otz8YW2CGOYT>4Ml5^<3pBB-_Wogw7+YWU0F}KQPOw#B?qV4cQ z6b+T^ov(Q%hX}tChs&q$2TCFHu{6{~F+Poi!Hu|Z>H40dNJ?;td6U4TB7>qL!n~K% znc27bA>Gm_geNb|)}6bXVkY_w6lDe~?7P`qm*}<+o==cK0sJY*8PT!pqtn^Xjm?2z zJB|<7hC|WWcK!$)zRAyBfL~(VTLTgFHS#54Uj#1@d4ZQYUib(5%dTx+mjp#|$1_6E z!)Q!~0*SGiv!P>RMQqi5<@d*?X3Mv;X>UyyJ$2^Rg$aZxK%Rhs;3W_pgoA$7sq>{Q zTtfLsFNaq;{((tb(A15&@HQqGDgT0EAt-T$xRlpcYg6tzLrgSroAM~ZpTCQ-`~*Bu zGg%C{BfGiHhS#G*6Rf5xQYh4@k#N@MYpVH6lTW7ayBxfz)IG9RYxpjMB8xuOKFHbUb{Ubk0I}COQC|ZLkT{U)59{` zTLTL`55?c^N60>}b|Rpj>m4=V3??v~oKuLTdUT;-A!;W!TKBdUr1sJcaY3)5AO3kU zEcFmR+6!KiA7<$B%b~KN`3+-05jf~k*Gkny^v;3gPH?JIIJvoDFB-%)9(q9lYI_uG zce=NmxrfXQ3)Lzn@xbGaLj3wIYh3^XEnPeSOVm%Z;h!0WK+qPj96WSz;`97|=maBm zki?C1W9*@v4`%G;^&?UEOqivC2d;>3-c_bag>0W~d31fK;|P2{OGrSWK^p?*ZVcX@i014F2>k)B;TE9W-$9L|(u5$N}C!O%$ApTX`h?yxif%I~WPXvPd z*9f=cTDM*xgjFAi1HO(wr%N6R_R?1iN0S4waF_~5!)uPgpbLbaX!^nsGL1&c&u7If zaEeN$twz3=_M0Sd$uw`BoxZW3tXZ3}DkfQ^+7f7u(mQ!Eo{SCJ0fq+78(4sgtwvZ(7P6cEEmC#Zp3qb|4&*o0{V!2hj4Drh(1qQ5PBZYFyJ!L>1gk~#H%%yOkJ~b zPv9C3p-6Y39El-#M{r=Td#?{e{bt-MP+&jvUPYY64@T=UX>?^^%X3hF`^O&{fo&j( zB2k45M9>lxNbwV1PX=KeEX2GzS`|ORT1f?t4n98d+3xp~R3s^BfY(oOv_2zZ6IQfm z8NZyq@G#!aN>S3Zs?HNDGMFe+NEk0DZITk>1R$}Ds3gUfYn$dhL5{bfyD|6wPURtj zYd_=rP6(ev0D{L0=a&EIrZDS3w`VWLKfnFO2YOn@aIp3vZ^5~hs4qV~ufL$NPFsO6 zW%v9``o2@R#!A_^lBE5a&ED^Qo(GJc=J;=)r-j1uNabM2qd3=R;Xq+&r_To~r=NbH zSXwyx&#qzbY@V{q<=T9tAPh;2I~*3`0#N$h+3EC@3cSm*Qct>XJyj^?O~`|Vzy+8C2(y0a{)s)dqO!S zYR~|oqS0^ewv2N5lvYBsv19uO|L*t&NOZKZxql93ALIT8x+g_+IoJ!bpA-avOWU4c zG^C$&234$3tExqx(!EeL!*`%FgdKrYaKg3KuXU?L^SiuWm~m*37*49*JbRs7Uo*e8 z6>zlTp`bTe?+#1$1d*30fud(LW<&ldBw&%^95#8VQVUM3G9)x$rpjshsLaO4PF^R) z=w9P2>;3b^#;lrN#2#DeJjJCZ&(=5vr3#Np{3uw*h%5WfFBES{GCtx;RPe_H;-Z7f zmfySw^mgBof5$liw}H@iXjdICN(V!YxlYG*j-%1rxpxp$YGtE%^+5C)`)_Ht1Uolx zVkr^9;Qnk9e*K#M)<1Axr7{+cSo!sn9b{i&mG{5Hn&Q{5S;nDbNum<$f`(ikMm!-P zx9&!sNG@ZORNSk*KGR3RsJ%{?t(^Q_g0zqeMjpnY2=sX(W3`xspK0b>(dQ$e6n${~ zUH=k?gmr5VY5W7zE~ZdnvjPv>vxXtV7+W)A_2BM;u2d98Od<%Us+cjc@`NcRL^+1# z>+G|ZYV>8eA0wGrqYRV1ubqbbAf;(fBxn%eDT{u5xl^^np0=nty0h+Vt6WnWH2p7G zY6l;SO8B;WZxU4#h2<;z&wz(VRzo-;&Jyt_IQG2$KKuUkd{4Xo2Bx9G95lP!w7{DoPNfwvZWG+KfgBM)}@*C)A^hd`~xHzHMBC4B8c7IJY4L<0F>7 ztp_f!yN5CoT##HvMR2kx)z|*3%O%|RAkUs+dJh)FWT(3c-VsGS#oVY!D@Rf5cb@e( zg$@qFWl54oBZVnQ54C&bFPOXl6)*(gDu_vC4V|QIpACZi7AjLkK)@CVPJgh&^?@oK z>%*IQta?CuTFkSx&6Xihxw=$oqTQTh{aIkW{1eoh zVDnA)Z}An`7qzA(+C#J?&r^%2@8^-xZ>+phl-wgE6eDNuo)|5|K>SrI7_XOoF6YZ@ z*apLQ?0O=DA$k}kF`f;O>cRc5Yc!~g&Cps50Q?J4@}q4t z0`&7yD%^MiNxopue4g2Zyr*Fv&ktJxxwe!qz9DXAd$N{0;H$hK%)r{2pkXpZcT9Xn zyFf(s%l_q2kuJLx!O2Ll;cGkNkuZ>pO|^^bK$!U`qS~p*Go2KV0j9%+2A3q{nP#>R zKPS2xhW20u!xPZ!4-|4Pi~8$f_Q{n5g0LX{sn&GIO1fYo-&3~R*@AcDJ#lj+sSlel zcSYwVx#xA2g*u(PjJ8d(=ds2^Jk~<0S=ab&c1SC-kelSa6V&Siv=OPk`DEd)kdrSf z;B+WOXZ_vGE)R32E`E2=36?ec+?q@fSep*I%-F4TNv*{QIYNuQS_T&KB07&p93em= zAk3uWY50h;8t2w{r#l+s-BT; zSKw~68~AUswzj)Ev-(a#%1y)K$d?(|3EXk*dD{jqsgy+WEZ03{luGOueo~nqj&J@| z=G5H+6WS;a*GD!A7l7)!flnPTchaeua#z_$EP$Pw=3z#SF*Qj31>bX{wN zEOWEnaOj$3+;}RAn+k9>+2$jkZ^UCk$*_>iNyK&>s=KSOl?{85LYf3Hy`&kla3q&IO#Lm6H@x9gyBO@ zml)WzR8Gppc2~VP_Xs|=6Z9yh`Xi9Bn0eH4NjgEj`V10(dwyy7c=^HO%S4HVrwvmU z!LZu1S_SUkoPG?YAKc^RYls4WA7IMUE*Jmc}~UGi-*xMQ_f= z?mbWt=v|PRV>iJf!PZTp)`{zh!t7J%{Qu{&Kq z?|*^Ev&N>aHQMb`foftRqFAb~{J1mQ{}Fh4!%jH*I^w_BV+W7v0TX(qq~%Ykn8!zu zV3*zgFk}}xTGrob2j7`_#ocxNP;U9RfTiozu#{p2hPbqeJ4gDq{gHA;si1h-JF+ph z!P(}BAk%6zD^GB;JUbd!h$=lZ9Jdr+hry7LLZ^2vWLry4!mPWoExj|wmV>eeDo0GV zj%dvG2m4k{(WOqAVLyRWH{BeUs6X=R&S#nDXwV}+3B6j8<4|Z@!MTx+<}tjRRuRg3 z9{n6wHmNhz>p-kwH+Xkj!quC*!ez_)!RCffdPbwnVSLkVdz_{VUT4J9&FRyZ&opZ6 zpcMn1ZuLB&T?qZ$sz4tCbHaz>^K`bec+<(C^|uyi&PW+o44D;$SJ|Fl`)$7n=SJ_( zVKy+1BKcDe>by(0(Qh>+?RxUzokt*z7}Laoq60<1<3laG@m_vxg7^bEs&O((G5NLD zH=4nCm4pl5wB%Q!$E)`ETq#G3;}gRvTbVyZ(E6TSYn4>(WO9(x0ume5g*wu64253S z|FW>iq+T1uP8nHcciVlxJh=%HYBI{wCoZa=UR2Fe9^moKjk z1ZovAuZqG_-BLK!&hpXd9Inp>K1ltv4Ir2@rA8(cRTvjluh*X}vTeUZ(ycNi4kk+9 zp*O&r;`CkCiUA2^XuoM}R`>jxCRkQQdC*coIUFkK7 zV$Bb27*y%eeIc5(Nfb;)=GLxws5p)+<9|4U?n;4{?p?Yd5jx=K`~iQ%ee~@gw~RPm zX=&OhZPb zBk0(3@Zx_Bm;B-o<5)&xQRrm$#W7bXKRslO{^>Z<|Bx|a{FHU zuPisW8A@keyD2Gk!;knrK8tw8ujkeqE^65O{nrtr-z&tI2>i|h*2#G!{aj|E(nVFp z95qp^69Y2OpD}JyOETuXuR152t9*5FML66)41=Q5)v}HQjH{GG8m|fQA{1@DttVL3 zol%OEuqQp#uZ_^)cnBJk%Lh0@|Nb?Kk?kMs8!E!$UFw{)K;(Ou3($ut%Gbx$%Ef72 zimUhKWF0EsJaJB{0cLqEc{o@?bbPFJVL8J3e!dY|wDp9F`CeH73;1yBq~6jU$ac01 zh_|OL`aIo4w*esQYZ1r4qDDG;M-AR8^JwYGRvm3-dimaJ>=gLN(k~w4b$X@9H9NB0 z%-FQ1;*MtnSL}f(=26KPbA;zX7$=jS!i|Y~KL*9ce^ZB$aBzv&PA`5{MBcuIZM{7SX+K}Mhs3c`as}jbwQ)aTW281X{TJBl<1nIL36}9q ze}X#~>uH$v+cvu;;A=}0U8dMuiQ++oz2G;ydaE{$dh2t{;j*5^3wM()+2X|)dpFe@ zM&q#lR`#ig*lF-5ckW0v>Z`8=Qe`mrG#b|RvVL;^$0`nNt@ z&f;JlyVdDbAXu->{vt^I{kK6(6q6P*`#s9qzjm=EW!jyJbhCeiq(EUiO`B<$4MteT zeulwUghzC`>L)jX#jG-FG9mRC1IutLo?wy*=>w|A%br*W->dzj`A~ulR}^2*-EpS_ zDj$S#EDF&I-|cAq-{O^0q9uHEZvLJyf08lIkU?LkZNmFBq>X22*iND6NHu#$lY2K8 z&(V;3#?LCI(Q{{Spj<1!0QsPhkEvEydIJW{Cfgynw^$0Fg)^CqP<-DY2E}Q=gQXS$ImpywU>&kxU7$M?Fgj zvZu2<%Wuwv5gwTd2>`*E=~2D^#6y9%5EDsm-(@R5IQSF6`-}@X2Y9CCESvW~f(q&c zSMMuEs)nxVmnz2v+i6qGVR;zsb{k39ZwkIW>~7IvN%d@yW)4(W^0AQdrYnjCXCTDK zp6X)Itc>mZCux{$@3iwF$s^-$1EUGBi7wFne=bTupQvVSwp5x~<32`lAZPW-f%4Hm z%Idup@{=ny4k-fTgkIR~8mqBwTSO4S+dij#VQ@OdLpdLCC`Vf58>;sGB2|LAXKji zgE@~#u3S2@v)$V4I~ss|*_B8hNn|>E{qtg@5hsLdG+puCkL(HIOP%&ot0nSBRJa7C z0~d87LLz!nij#DikJ5aL1?G{K68rvt;YG=RT>ee>uglp=4Kwu-SsbJwFStCQ)J_wiMRj!`f^b0h! z$V#^>H{|QAj-3G)yjk7|aepoNI6h}23Z<&C$)^?a@YJ>*rN0or_l z2k=1_xzedNv2gQTCkKf_CPHuNsW0j6uJcAT>&Qd6JkZHxqEQ16JEiU6awzql2sjF> ztu)bB*i7H~Nw9?MaS$@kIL{r3(@~doE;Cq#aIB}{@-Pg_xEAS-m=iBJLzxh zdIVU%uN?A+FLkheFVCKQ{_`1oW(F&ZIU$s%AqLg1NI|{KIkvB-jUM&muAP_J821yG zolF02?Ft8XCfCo)RUXe%ET-u^6Z=~Ws$Ygy_5PH@q@?-nm5nLx4dI-k*fQ=qSyEX# zTp9CiceOjpIY^bu@kglaIW{I;O5P3$;DmRH$(o7%l)W9j;+gzsXk==I}l*@EWZ~bv0QpnIA7{HwcHFN$4 zNW*D;WKu{;O8(Vi9dkf4aN-P0VhkE!lTuy|zzf`Yy%5%n4pmVBlB?&K(ua> zwOeu6|NDXBviS)!*^U|fGGj5q)H87!eIO4qye;S>W}_^Z#>L3^sFOj~6_ygtx7Da5 ziif8_o}&LyW%I4BM!asFWZk#;Ulgi@;x%DeO)PG;2R>BpAdE2Rj5Oi{id9L&U?i~8 z`LV86-X`y(u8(inW$wcfg4y+z*)3~Bu-DB-FRmsX9B5ca^!g@xbqnqS{qwe%P2Kq> z0#;WVMVW!=<*6wOj@UXzLG_by%o?f&oQIuZO+PhDz}h<0OMadq!#93=vMa?zoTM1G z2;nxS9$(-p>TIcVyUdkm58xD6x>o*cP#c}p%6fF1Hlts}kvU%g#9l?8eoKS?wyb;4 zy1cKO8Zg!3H)5JV@a6Fq?Ah#l=;5&Gp7z1DJ9+uG8>(H$uyIP!@?UBu*yI^ZU|A^7 zh8v+aGPA#>9H}rodOxI>S5Pt@o?)S{{nrt27flp)>AR>v z^4UX#3Nfo~&M-oOYFwdS<4c8!mu59xh-0kW7oTldE zPf<3NgL|%dRup{eIc>W(lWvyT4O}ao&^bI1f%^@;UqaRCjtRf)sIdAg+s7wWK{fd; zd0Pk+g)OU5*0cU|LmfgR#_RrcQ)up>v%zs5GZ4g^bqRn7m(sXD&ja=YF7A27Sj-x=~UJ|6q#fG^l5 z5ZP0D{BIG1`3DEr%-S$UUgtf!)kqKAiln&mq;QS-uk>Mggk+y|ek~2&pT&#FQ&Zw0 zgf*lazj&66E7yy5rfiT~$7>U^P4IohMFhHplQ1#X$-+FVS=7qGVxYc}*%i0`(LM;hgufTLJb}MIqvg^GCVF+qdBpA>xP=cUDy%Wp zFdRb%Fm9Vg3u5p|v@8y`{*G{?ebe>FOL3!oKz}GH z$@#7S$;o>5<6_sH3&v4!qTk@@9+pbhrTapudn2R3&YiO3e;%6f?T>^hS^j<|MNk(g zJ3SAl#wqnow97HyJszIx=LqITo$~T%j$rGmctsMhhi)|;b`nWIu=LoHr=W?(xi`sM zBg5DtmGe-rxg{JjOt zb;}QOveD7NR)OVDA+>LX3_nfW%0tW`I`#f!)zlbs64Q-`Zb37m+L{gC_S9r3RsA-jjKuEiKXNdX4WU!Tj!~6zq*%cBU%&#)36k*)Q%C@S_s99< zZ)-eFiM|dW(s*K1Ge&^-e_D9H$B;Noy(4RU)I5PV@zR==#v-H$kg=T?>P-tr<+Z++ zA=PLhCWKj?d1w@6S(0P6lBHGbQbjwk>^ULUofHtlK9{-_WrPt1w|xw{|0Gz#R8bc+ zlEoi9L4Ui=@EMFa6}mOKbrODKl>M?VhSe35YV+93WWPDs-&sePVJ52aJ*yqwACEh@ zr-UfVc;v?MQ-L8e362AioIWP9LBl~kYRzQR!I zKAttFA-yPEo=(1ZCJw#-0JxcDt22sSeZ!~DBNd820!}p)69WlFQYZ}|n)$H^>r(X) zM3JV`wr+7TzL%F9?4Vil{a`bbnMzV=fU#A;#gC9=Q?8N2B*_Y~h&uYWZ0sylWs+{% z;GM}1q#e7O3I>_*bL3dNwg0Xy{BqyyvFTDR>4dT(>2BcVD>3rXKQO2DV8^p!MhlvH zF7w=LUf#&C^WE?B97rJ5g!o4hzt4qujNp4_8+W~T=ab|5AA%z*V~3TKDY#2bWKy|+ z!VJtq{BF+JpU$?Ba@DkKAuXjw-l(>8aZ4cleryPeX<37O!2RofDH~1?<8R`zSf;d} zlqtO=M~kmcbYyhPq<$nOg4U@gMP+OMnF)FH5jiI2qCJYGL&#HwauH_)ci75d`w6!7 z8_N3V1Wt@;`7yN-VC!%)4>W3k?V^4bg^#VeKpBEHxuQi$m3|4!f|K~Tp zpbCcwdCQNzD&Gh0B7{GY!rT4aP&M~^<1d!7S&yGa9R(#U&hhM>#sAI`rOER7LA)R6 zK8oP!!HPF)FVi4OV>^|#iIx?zuLkG*k(R~jm+}Ml7bW|M9Vz9(>m?FlABjV3zbBvqoOFX2+a1jk5?g z|A!tOk?v#nzYySTu=t(yN?ZAo2{G4wTZdse-}k64a4_GuMCaka`OQa#XbW$Ka!*1$ z^C#(H{P+Q2wdbalMBBpGIG4Ys^krhh@f;h?AU8Y~2kp`kMepFjU>V>wiG?f$zhaJX{a(IKK@4Ej_#HXZhskaZ=^j&aH)5x4pKKA+x5c&J)2}V}C5>is4NI zI3Ii@>xe$)GU*x4B*eR;PHb;AnaMyuauo>Z^cXR268}|3n@^9U-TWI>>3&}QAargS zK?aE-4_@eXZPo7oNY?qnWF)5MjPM(9rYDHCP3DciEeCp;&^& z%^q)pm|7;Ac_WTnmJgA0ZJk7Ow4<0)>$F}oXH{B}x@I1=!wIcg^8s!?Qp|<_c1o$+ zVmn{QCg^w?Y59I3^901ElPH20a&21h&C0wSABxZ5+n{WyztT;Z@w; zce;#7*)7e=!`Q6)w;V7sZ;C>S*uRXwvLKt}OD^Tuey}q%3Rj8D8HN-ZM^Tg*-kKL% zL5#a6m*up|>g%Bg4L@LW7A@2n462IntdPvbc6tA?nbjnp%k0HB(E852DyUe5@=Bza zDr`jWXwrlX-Uj@P?3pxV7Qi00N*Vjf2(#$k3g{?Ip3V~-bOE2^hAA2O$t5tAC~yxd z=@-2Avz!h|N^oQSP`6)4?r?{7 z+n%HCgS-E{YX|QxBuSK!J)sKD6$D_fok(%UV?9!;W zK7f@#g2&J2&0FS=C@Y$AcdTd0oJwP0`RR^~XzWijl$rk2J%Sk$VfGdqJdZO~~3N2K$hnx{%ELr#$Nrg|3hGjytR=AF4%tiMu^E{IbFc z`Y~yhFZ<794n~X&7jW71vSoHEc5xR0ps=r^wF3PmPca(`)dMSM)ivfx<10gBV{XCz(~u=0@GnTHYjVYxy5MlN&8vGITD5_!}XHbq<{ zGbAHMTSPhMA%Cj}DB`gDL;?vFUUljkr_?=l>dMUOaSCZgWk|A$+~1_$TK)Sd791&E zngnuE#Rj!DG$zTYip`s{DBIY(XkI->Y>t4%R-xoFR)gY}QbZLslOs;?$)d4|+b&Ud z`!zaU`DHg8_dmR|hFI1v9ZnK#HTxlTQBasLa%u>0*0J}6>WGSZU>GFR-tzWz{;a!3 z2z-aTt&Nx$RX_ueNiuUjA9NY*1%S%p$TqtUMXjQzeBdi+_fBi3!v&bQ%^<52!JdIo+>n6J=`OgQkRcVv*?o0gH#yF+1=GO!y-grQb}+#fN#>&(H^I)ZS+M zP$N`IPNx%Is(A>KFzLGO2lJvP6=YGU8tpd6rAgnCjVhPZi%m*-%Ge_z{&b`R&quO# zlpKuxZ)!F2#U}FmfeF2K_j9G7ObMlMjLlSHTud^POpV2d4JP<@E7W*!ER;)i$>2cDF0lkl zwK+6kVO9}z+p#co0_o%2b175wgcC~lPN`6Pp+}~p?uvmrelj(9(Xx<(v$5#yU3S)N z{m;LF)J=6?OlAoIPh^8&`@bvqOmwyNM0&OMM6?w16pWTq=)DY+3hzy{eBM}jExMU; zb^ISc_#d{Qw*u1+h3!=Jr5b8u*r<2=66E;!kG#GedBMrb;vYY4Jci3Tc|O!&GWhWI z%rqGmg%*wb!tgG|W6v3xi<&10k!-emQca@P9G|QfzaCiA&9F{#XSe#Jd`{QIM?IG> zY;@}EW8?(xf3TJsf3Bri)KDn04iDKuc9>F%4T~Nghyr~37O=O|TiR$JrPsy~{?iel zy5y(Cgi57EFo@dC@5?D9_{o<=lazS|`G2_j%BZ;3rr99D-Q6X@HMqM&Ah^2(*TLQ0 z-8Hxe4-UaSIKh2z8SGBZd*oYptpWZqkL>QQuCDG))emV!zvZ@Rd@z-20tIngr^dkjZ zoQIJ?4gcgiF-<09Tc0cqHWp_;Ra6M3I8HI)KN#Pkidy7^aX_EC7&ZZO5akDCn{0!> z%zOSh3-=fj{ao;FBg;p8$jl40mZp~v^5ulGeg zYp;D71{8=0-_l*t$cl~G=~P0x*AO;hYJ`Cm6r1;l)wiJbfO`7rj)T=)gd5Q>B#1%# z7lCcXzM&~tYj?hX46Tm-POy%C=f+3Z zFUKyk7EDvQ2e%PB*(83s5o4RCr#Y%JF*36y?(V#I!=YwO>Jchm3c&UkTC^wEWh7AV z>PIJ-j-=fK>0|h#-O{C-h0X1KJGd&xs|Z8{r@@@B9OQ|@jM*<4xO2@xhnRf4g# zvKN&B7@wf=9a&5?rsao8m{70#YgXRKX?mq;+SeXirF_KCSjg0uMw^`EMM5{nsQS4; zc}j}iMGdq<+Nm`8l0SA_8i zIOwBukR}Bl{mUFg0`HUi=A<6%#_){J#uPE^rdXq!YT98c1w_;>t7!#fo)170$o>Tj zb;2vQzI}e+FLWQ)&&rLYGY-Ryz9A!TE3im+gV>=VJIoONty25!agkb4$vdcCZgYEn zK!Zo%b;6W$#6L-kLDycZLYcX9f$^A?qCk+yk|U%5yPGVL{Iw5qEb!9lBg!CXv$6d|>tlredX9_0ayu4ZF?c*C zswyvnma?GtQ{3gRggj*cygSIoo^DqSahsTy)k(QA=Ag(6zyf^W*Ls zp0QR1izZ@#;045HC-65kZzZZjs`XTJ>y-7Rvk&Is`bibcfgW~Ld|A&SMc$lj^*a+g z0&`|DFUcbpNZBUvcooQcYInZv0Z;hX0@aH&ckur{j8_+8MPt`BeKg4oMrXcdRhC#7lEw zQPtk`dl>K%oA~k;2{4W;y3_iwj-c@-y02y`gCvIpY67(;d$Z!44mPBCJTK7Cd(QZ# z8|psW8-1XBRK-bK(eVHIw;}%42|yruA76CU9W;F2O^G zN8se&gHg=4-){t?&KQ||1C48qnRj%C0CxtK9a!KaU#I)qy@h5rFA{pO=6l1{)wJ&+ zh@V+@Lyd&)PxD$U7NO(s`Q^cOZ9CFK01c8%I#_sWKf^v$N83@)ZHBw+KuNKhR#;>N z@Uie!kL#-QHnOI-8sE;c#q--bV^5>Cq9g>E2TvOnw9;Uo=>uQLz?iO?lRSgwl0;ZrV{07(aZ zr%jH4*~4+Ok1Ug{Drke2l!-IENX;s)l;ODN0Qj=~h5L>0T@p>bvG-8kaA- zINMGdOHT=GRv*GHsYLDrbN_}(u?iDph*`-YWdqV;%3 zvrIO(ZX;?PJhvtG`BeARWk0s~(UdujCZk<_ZrjKOPFusXQK!RC6h!}4u|y$^q46g# zEH6DlEbh~V3Ar`?F4*Zo9NYV7f%nXHoii9qSjQKot3lNsVyVg)k`e_UX}oI+gL|;K zUE-cQ3G8_6hb*KhOl^@6u%Z}dp`C689Aavyjh`+VJnO`VSwcXV#eH1_ z#`>2c_kCX7+;K45n6k(?XopN`m>8gS!^`abGiX+M=Uj($rx$z-lVYg#Uc1V&?4nxF zsFh&Dj$+Qftd6~Ats8F#}? zD+=|<^1}xq=R}fgv!CMD?rTsH)3pk?BqZ{3)2qvmk9$=5fOxI-R&F&~F5^=;s1SCTbb5!qg`K1MgZC4}SV# zxBpdVzy?&`8=uSFl9ql*OHpE|Qw$QU_|-KMICZ`XzF0X5H(ya!3*pq|;h zHJ3xBcAjIy#M6HPF?&8P=?0Jl?e%?=5Z~TbX=>{;z9nC|cGwGK6`E_dho`d)_Zg=` zKTAuq}TfcQQ4UusbEQ{(Px#y`*O<; zA$Pue9VaS|Mx&*-K+=&s!{BOH7rpEJ5BVT%* z?xHt-wr;-lcRt+>e+RgbO1GVi{S$c|z6!7D*DkfaEe?BZEylgeGqwg1)yDbdsN#0_ z$ywwYed>|_=``{7Ib6hhm{)I`R(WM8 z+%$ZDAm&B1)m+7!boMCndzGj!VhTmYABX<^6%E!4oKfk#S>4z3{gx4rlX$GJn;5;Z z%@@XHLo3i0^x|@pkl6*P`KOj%{qTN^)dHTGKq{H^HC$11PJGrx(yY z;%bli-m_lx8(ctBHx^dPkNMRAdR#UtRX84e{5CkrFak-tzNhn7Uy`mTukSXSl$W`( zOugKb(bw0FQvR+|||?x};V5SacAOU~qFFqk?azr;~-ftF^FG&9U@XqO|0q z3+7##{!}5CP+KD*1q{p0(_Qgu&UV|9dYX4OU+}I2_x4N7T4m5@4wqGHQj=4e0tJOG z+nyU~-&iRm;R58XgMYEmUvu>Yz~3x5w}LT<8HP3}SC15jDFq^6vC7F2Nwf^_d5-g& zAx-q6{WdtJ?st&9I@)bG%C%#hwS;^D#$X=)9ZFG#Lwi4G+rlIwk4rIh9qeW>J0JIH zc=&Ad(9jt4BL(7REEIav?B;*QA*lv^3o^2vC+t%w;sh(YV#q0JsVD?!lJ$&zl<$5~ zr$i*vboj`+*LBG|>r&R{8h$;uW?|h^L2Vw1=&|PlCivTJ;Hsll-3J{z{ef z!4+aAF31~Zto8a?XBB7j^Z59-JSaFq9Mk)x^ZAZ+W%Z1Gp5u{E?$RHYjZOYaQ|-p{ z)!HWgbinq2$n346KxE_q3Ye|B(kMPfUy)EIDlQs?O7!CUIxm)IcpnRe2SbrSTIy*F(c@YvRbthhx(MRMR><0IOi|-VUgr2cZ(!eX3tU3d zPCg5QNBi>H>vRPYvMF~b6vN90SL&e2e^js~H*D)yU zL9q5lY6;;LZZiqRG9owrcut8PjUXsUqRbp5<8moCS!)COc)x|c^1|K|F)lmwvJ@kQ zlpuw2Vk043R@Vssw=-^ETq-SU>w3)jZW@+zWsVHbF8IQ2WI7VK-q@Y>AS+Ad!eTI27LEAHowLA2bqgUL#-xT_~h0XgH>IZ}W*j_+*ilh6zd(7P-8yOSx z^Biu}T++M!`3FbE?ptbo(l>;iq}pNmc6n%qWh|F#{zm1|s9^2&a#Yw*sg(WjffIy% z947j90Ew&!F)M7B*fT%9{CrB z=EK#k5>b}do4OyQo-3hNJFeaYcdv(quBF0o${^B+gzyT#$Dz`t1?kf&(t^8(`Ck&g zKW6!rGMU2|^n3dTu#xT&n>P6>$eaf#jgx2I`1RDGOc|V>XJtORPmOU*5o#_;QYgAn zm2^dMR-s~1Ff!USo`t}C8?dyV*7HTEV}|E^7SLLC7~Oto!vz!2z2%`X3c6bXlPwzL znlCRa53kKCXF80a4)ihxoX}5EpXfoqW#Ml$pXv^nHL98QF)4gF=@Gxh5A9j5W?km` zknZ?(J^{_mY-MuQl1%PQ8%BIFW=xD*7U1u|!6}VEvrLB{>**$`VP_HeIyol0*eWVe z9-!`lLpzO2oUZPiQ`t=iE?VboIS0vax5%-HIGa5;q3y?@NGdoXnH9Grk-m;>?yrZD z%8`rw_;TSR*8YzcVE14D>?W$o@x;Qe*m)ZU<}^7Kb6+UIqEPJXGDGRoV4`3mO3LB# z2ub?%?Q0687-&g1II({GOjltf5lq(fQwut}xzD}$UqwjPia^PhN*~oH4#4G>NL&ZV zt~W34fOBZj{{7%dhOh>!HneprHMS>_4tvns=QsO~?q}NXeX8O7cE91pV+BIQ6B;ZD z5^{ul>U+ooOBBo##G5P>UlLz7GW?WU0!60aZ*Je?T4&imDf}EXZuqUA6yDzIIXq&Ba;1p_j)H1BGqI~Vwvca_DPd? z9Ixkwx7Of+j=A#=Fxlk{xlrR1t<|7LMu)f1Zt8(H$WS)JA?Z#aMk!eh69U&|O{_va zB@sp1>^;HI)|5#j;ngAf^~gV4eJN*$DaXAwMi|v*{LVA(H@MDpzAh_$W22BynDx=A zLk0e3TN@l+cC+bi@!urnsrR-nmy>DVkHH_2HJU+|E4qDGC$MN%`}*@pZlH1#_M6)th{h!?6M?H9akVxrP0(cOu2 z$j7BF>vaD(1mo_sove4y9k_2x4sKU~Kyy_G)?%`kK4;GVm#x4w7#%^t76h=s!# zDQ=#{=6>&U=2dGQ8L;cqSt|*ok56zp<{{zSTN*&>7XH_}KidTx`MXyr+G*Gv=Md=j z@OYgtdFx$sQvzHD=ZN$7tw7)Oo`)?V4RUo%#+cS@;Z501Hal8wu9wdbOT&JVnKCz~ zN#5XrobWd>_#0p=>13=$2*~Y!Tw-&wQE7xBh9_!&6cl`{_mgexF6!hn2dtQXw0zv_ z3I~s$`5%E*PdsC@{`t9HNJ?6W5D!4LOkF%>4i)z_nZl~i^Mo|jbGI6;&@BsFRB8x_ zElhWb*vh3SFfT_CM^8J=mB=4A>;~!c0+#!@V^z0` zRQ=#xS%bd`IY}bJNf=W=Pnen{-HxfOB4u#??v>fz_^lr`aNJ){B`dD|J94n@8V~Q1CKyc z`@n$T3&!F5(Y90>yED^^mC+-@2;o}rE3der+tEj6?_05&7SWw1^S-RiK@^A1{9Y75 zz0l|Z=CLK8gkM}6 zTuu#0nMFS@K5$4~U$K+>ONVP&VMt~wlkelEULhTIuH4_({E|+aSkg$;LS>>j#$g)E z1!jVecoeRxY@!w=U}JONW)HPi3an|jSiF9&E>%KlZwct|`P6Apd%?rV&?b-js2^Z% zLOZPVycpZz8@){XGq6yJ&h4vQ<ywUB$fn;J?sl;;WMWbj6X+fI`q0HX zFc0OLkA~0>Kl7r%uz_Xx&ax+;*X%Hzb{4zbFPFLxEG#+PO6@b$vDXU+|IK`LsRz7U zWZ&WB9#k+9CnyU!-dT0Kf>1pktA$K!IHP7_B_tQ>rYCkJ7!w7|FDb>cb{5bnA%jT}S!#q?j&(^R!EE#eDF}<^eU%kUq+U8`9A2 zXe?~qPm_7OVqqk4Ko40qlGaY^qlPc_j10PH4{a7g=o`6yNxaPsL2d(J%bYJ*2lKQm zE=3HwkYqSQn zq`I~Y7%HS~JX6q43HG;cJYzJTSv65@LG=ccvEpJhYJP7TpK%U#C*X5KxGfM(U@9pj z{?N4|N5P{tt>#{Nup6N>k~)zKUdnFw&L19KE@v1V@dV1~DW+5Y$VEXxJ>SgD>-Tq) zAcx1{Zy5dORGEL(c0O?VBQ^S4-_XptJi&5}(-F?X-vofm(3hXq;UERxSx1@$#1k3` z?wqmnkk?{TIXvulJnr7VsvgG}%^yS8b9!$5>o`${hxWv}1|<(e)0*97Ssy{^NEf4? z!SB&?gd2(2185Mz`I6@!4-#Mr!VllgPl*9pCAw@Qp14 zmAC8GS6|=l93fG-e8~~)g@#bvPdhW~vzVsJN2Q53DexR`R)SFR&14U4;jdR{Ev zpe8^l1KVEjo%h=Qag4veONJMFEc~QiDMqWD#t&DIxK@jwzhYX>)%QIDhyIDio~hAB zCHAH6=#VNkX`Hsk3W>{XQR$B+T@d|60mOXdHUmPDrs;dotaZ_%ziV#vqrCE&o%q4A z{)VcmYa&OO)FYSBU)Vs2&kj7>3_SRR7#7&|xcZpj&c${L|NaCmDxw|oMRG{ZX3h6? zSqL`Ks36FaaZwBFq~f@%&PaVZ9xQnZ{!^?xlGOT+#T!%MXlBl4NU=7Lx5w;vn&;?o zFR*T0Afu^rQ&2P6_pcFg*HB~d*ovc+9!KQ*GP=bfVhlQ_(uv4y4J?-d9w#gwK+9zr z_6n2*A86=&c&d$Y7`5ct!Ai)kj~13--7T8vJGr*5_vDpS!74dSQTs=gqgCL@v-6lO z><;NualJ+c4a#p>lcxrSYJJB`hfa?6zdS;HrRyLFV;lHdnRM{3x%%~eT$~TnhD4)u z;QbY~|WdDmwbRa|@YQF_yv}xD|Jgvwlm9Dvad&E$g|^4W1BHK$1oGcm!9^fSg61 zxu-9Js#rBlDs7;2l7(kJyM-=T4dJZ=mM-EgXUq|y%pU``gW7S}Pr&bq0H>Iep)&5U z31&l=^;6fs61d-$vSHN-_at0`Ymq8hnK@)sQw_!q9Al~>_IkyCZlnf`wZPrU8>NJM z0g7<)ov9)$^2tKC8+lt^B(HLMgFM(J0BzRf;&X@p6QI6(et=5{zh*1z;_l$Xi~bSf zrbhAC&)QW3Z$Z6s7Cqw;>~Aq?ll=YiHlOxlqE3D|7p}{haMzjOBE=F1UMA%)$tcrYAP(@w8Vr!98vup zV&82chwL^Ow2!&tCiYo*mq$whUS#J^0)Cghuf+Yh98c_4<#pTr6$(5mINMVQ%)tL0 zyjSVnj}s+ArGJF;%>a3xZP&aW_|mPEu4glZb_cQyc6T$%;CoqCN`49)r>qErS;Y)` z2QyyEO8ovJhdHKcPvMf#J^Vrd)nc`zVyrdQ4uWfIsCFlgUO9Jj^1-lfPnWV4xVO9o z>6@;;P^&xTg|~UACZp_w!YHKoOW#4;Jr3d(mG!Wv#=BMw0E*5~A9doP5``xcA_Ya- z{!~cb%TCV^>!rK$d(Y;x9YQYcfbNEBCv(U| z%6Zx5AoS^Ya%=f)j4K{EI`1nJp?*Ct(f~C>TAZc-_8of`jfUt?K}O6lj}`;ib+O6( z^Hev|<{E<~34!<&x5=>g73S5*5nGd)EDiJ)4>Z$ARB*=ehysz$(>0()EGk1B88`N2 zmM0v|41`5S-P9*RjYf@{vI$q!6=$9r%Bm$}!=xvfY5$OBH;gXpmn-edy0MlRhF!7B zO$8)z@cXN+3uS&XKhMMZfdeAcOIHORw-|xFod=tboaT3LqFwetK_l~-n6*>X$rp^$ zobSBb4r}@0!GL=U>Fz6Qd4teN@6$`tHlWlWa@tWTWv?7>HD9vsUzg;NjMr(RgMNet z-=JOSid8gWxkE!D0Al^~LsK>kI6B3B1a3Yk>1Gr6Gl(_C;JGjaF^I`0#3xN5Y7Cv| z=E8Bf3t!XVt)Lf@)qe2(2D2L+FV7)&sTZn6G2=OZh5uF9mO0FXuc#f$%=Lry2k;A^ zN`w`#5Qzg9RmL7c0|$?XXMP_!y+w?)!l~LVIp)4!F0AT^1~8G`y&v6G(#|~%+dasA zxiS|JFE8H`%Mth4lm7NOIl^FJgQwf- z#>XX@{49Je8cn7In`VATrJrCz{B5f{t4DA97sg4nU2~fm;)vQ@i+|yL#>h48tMBPU zVk35|p$GbmEgp2}AtyD)$ZEh?5@&MuJ<;n2px`qeG?aq=5ryW}ecx z9Q>|+(t>JqtQC7VcR*Y168Q6_)sOFf^Yv`J>kWZ+l7FIA@eP7G=Y|)4dFK+XB_88th<5rtI+PeRgZJ+VgO;+*XR~?HD!9sqzR<%bpO6q( z@mjm5>cKuUpJ3n}%`~h6Ry&GWYt@xGmNm={c*;`O4nxN`uPNZl!N#|mX^{#Yh&o6W ze~K0eBf?8)$ZX}l-vVEwV+2Uc?&UFlT}!UpZyf9Z?x;3?8GrkV6l8y*YHm$fyIJfygMu{+#$9V(_dgng^x)uCBAvG>0A?^sA(>BG=rrQq1@=Nu>l#$mIwu!I-vKkV(}dTbG9P zZ2rXf>}`fVoYON@&jfwrlAVGzeW1#<3UszI2u?IZSv#+P<{PV70^YSByzvV?2j->q zp%hG8hcH7YEghWb$#0^O94>sj4|}^}_cR8fNkWmIJi<6Y_*i8*<4#-9<7VCCXYQG; zgdAP|xP_gw<`Xq%{V}Ey9`S*^vClOR~W?Z$){GQsFFE5hbeo#(rNRgDHSC;V9 z7ak3&oW@dk!2SFY&+=Vj6vk;l^yAmG#wjcj1M%;zH~!PC8VjEsyH46V`~`>awI4yd zkRXiI62wEf&##Es(^F@BablZq5nnAX&)o3c(v*v3^ntc-Ll?rE5{6~Vlv2RC9y_7| zON?UFFa2kIIj(vgVv41KR!yKhZkV?B`d)jsNK3l>?nJ|me|@yt;0YXoUbpp;G`ClB zzTx!Dujr*$n5Tg4YyKu6$sMU5Ka4~|$~FM2HY@!-jUvL1Nq~0s(DWxW%SI8nj}Jdt z5QF0jW`8s(!WCQIn9^nqFeQB5F*|c6vRHR`zG3yfJAC0ekbx<6!#%}7B&04l480J3 zqxkG4a9Bq2()GL=CKMzi+!PS3Jyoel5+F!O5tr}ge2)=NZYW(Vc0`nTZSSqcg;-i093fuDCw5j^ z9ni;E(T7kL(|IeND>YsT?b<=OdjIF3Ra{Dk(6BF^UeyJW@FayclVJipR}ZxD73|XCn+cF?$MDxOjb`O>m_rjNR!ThLT9(_#LlF<1eQFmfR1k#> zaHm%%r{3RCe|!r;ILr@!|0>g6x2MYWYcyS4%@o&Ri5GXuC`ddX%KNOXr^PE5B*u1? z%tKf_4upu)_*pXdYRZ|Tq@zb}$RyX@IXy;r3UfrK!l2{BuJyZ^IM?$}0> zI=k!XNz=TP$99NaWrb%e7SCfcFOoM7uegr24G{P&|sgFV=8C#e{|Z5+a7 ziMkH3y(xIZ#|tfA%XwNp!-G@mQ1ejBe2qL$-08Fy9(M?z7N?9_f4g1CG9?7s9@tvI zp6&BPr7v;g*6Zs(o`st}yqP1My;G7Esh**mX+kRo?O=aYOmEgEj|7k|@FX|^73aq! zNQ#u=Ux8+cAxbud+`vtU%xU5wXJ{#h(o9pTg>_gGA(hX3b*=aJp}-*R$MLhX~QKO`$&EeQk53D;RkBh zZrSJ9(^cduR)ywxv&-L=7 zw%+wZR2*6KM#w&sLQ8;#Y=OuYp-3v_MTveG)tsX=YRVa6z%hGa5RNFrI~oepE6I== zLf#fi+`bm`ElhKZB3$cP$P7ng4p#D&9b!Z*Nn2lx!BFIL>B*ogg>&r?lOJ)pWcCyn zi2rueB3zVN{Fg)M0nTTK>J%Xh$6F;17N5@^gVzSbEfcFclw71_|81a+he-NklSUb^ z+CXg8S=2D!p1syZ0CQwFvDGkzM zV1K=Cy`v~1-QW9Q`hZon!TVjHk%-DDJfU)@UfbkYQPvVd84cFJ_d9B?F9aMtg8y6) zH=#`*>EO-SR8OXkfe&rZV@ups64&!5Tw5P>3Q3aWcj4wGzicyE1=fe_#dyN*-VaH# zebt7;vy2Qy<)QhAvO!Qz)8l517r?L8h6lh$qNNbfS>>G^G6FQGDk|7hGAd^*z;leU zba%Z0m%n_n=~(RYK&i?@3hvmpmRPplbPU^ryQ&V#Tj-gA4}=~d;P_H5u~P@AeOJ9K z=t8`%T|QN!iiXgkP3i=HxNhE?*L2-X z5b<1c-wR$jlB|KF8G?v4tMM0tc-Rp(7L#pp!)Fi4w|rKQNe-xf{8D@jqy?Jbs%#Z& zRe1dLJww;x?OxsWmvfcF*hZpz5KKo;F*@#@8c$BnZfa28&ya9gyUWu2-14rraE3jsO~pTIj@Hwq8Fm+)W)S&Q71N`kTY?JO{JSD{9FJ-mD~2 zD_FSyw~Jra#PkqhY=Y)QG@K#${amf#Foyd2iL~>q@%dNfE8{8*Q(skpcBmNyXFtQR zIIESDC*8rrYjgsw(X(dkzF|nR@k}ALX$VEUEAreo$y_h2cIUh4iioz?SwdDoWqiT6 zQvpYznJ3-8p$E5<5Ixp>A`!Gkd$QZ5vy=(28Un)@Qk|CTGtTPaE%oPBmIa4L_2N!) z&9Pl%%THT-%nt>3Kb%qDIsCg?uOzRFzu#a>)M^B&L*2G(QQRKsu{H2{Z$!PzS3s+CMR^&+|)=!|ye%wENG4 zftFSdXH~dtl_F^J*8IM^g1bOd)i!+XU7^%e9aMxm<#C#zk6;O8L zq;pdf%3m7AYoH~sK<{S|&eTwcsSiLd($;X*AH+^=_Qe5hL|QjEC%=6?n7zJlASw=x zA8wI_v~NG_j?LWUc`yb+U&hrj6!$3 zZF$YS&+w#RW?6Ka{uM8zR;QlCERG=V)V~y-=X&hW`D^7}E9>~iUh{3d=z zc6q%xheh~8dYsc^@SH7Z?5HfWMBm4Ykup|xua4?BxEt5sj>e7^eec>5m<>Z?qWuhZ zdgKK~$S74=W_}ff8{)wA;xrQ+aN7jzf86;gXD`hqijs)FRIVrd4_t#he$4tu3oyK_ zj78W!sO^```g0Ujj~DVivUt-Cm*3-{P~R9c2wjpE)e%UUXF8RXXY|dH;`|q_Sk$2l z`jvUoC1pT_2`5ZwOn@`N{E6$gdatuoCcA@eZaL2}d$P)63Q}s35k_S(ZjSo2eoUob z!(od(!X0;CxIcEp6NHj;?UNZz{Z>j#8wRg2+b`ZJWKP)q*C4F#zE<32damVcv7e~W|%a&cAX1TT)74$1`*VDnyc{>;{Wmd0XlCJ*Vt z<#9b&^h4I1n;O}nMX9(o`(Z*@2PsO6ohFVml|zKXCWoWD%A_|y)Yl-u)4xd=chvAW zS~&aA=YmML*52STH{Jd}r|#!9W^fs5vpH(`rtE1j-d3_})?}5t#Pcc9(UMf2xOT=8 z0VA`7v^_kz*RT{)y;8ggR-XD53%!*j;GCN<^DuzKy*F4{N?F{nsVy%mZf&VtGU$AR z@oZwA*YFJSkfxy#?wV^H?eYAwwzx9M3)yuMfM`P8T968rx8LNn9BVVyGuG-+@h{ro z&Y2tQ!=ZRA)SwiNLVl*`;}OHX3{86>B5i-^aay$z9BB)}CHs(3(q@%fL@?;Y`FlWx z`^shL65I}N6*IGs?Z_XjELlLQ5DgQa3NKTknZ_I2$og>wT7*@VLE2g>SW3~m{;b)3 zO$B>WVJRqHUk5d9iz$eC$a$gl4LwN6s(9C?H6Hmbb6)FePWb(qi^T+n@Y&Q zuOx@{&WF|S_B{jK&f?XJFoPcv%Np{>Ry%kU516V_m$X1gI{Ol_5;RW80z=L=CAlFI z1O8(SxZ>l}vF)5bhJ>Ww_v}CGDMFFpPX6mav)Pr$c}vnaydrhTsXonPOuyGUfqz@{hHJ$ay&6LAy#s?0 za|H%l8K>+R|8V8zPh9Migx%Sq9QIy09dG{`1iNLb;Gr3r2Z++ng=yg0^yKp-BQ`Xo zYl|&!oR0prPUn4U$K$2O3(YD_>#%SgzZ?!D0-cJBE#5FH42poQJkeA=KN(J;gW|@g zG+T)xzSu_egeF6D(eRj90*tF)+jyq}m+!lc_!`x-gqs8En%`a)gHTh*0xtrTSUYdC z35Ty3C>x1VGSH{Zc7W)IT|PqQ^gSCFa5s)Ck-P8eLsu!3t%DcOLv4ou!ZX}9$GK{?GgwM03+3jR_+E4Bm=TgJfVEScVNdBFLeV=m9mp@q;rAd2o%nh+Cfag%Kp!-Qth(;lRG=MPq|w7 z)MOjDO|n*^hO``n{BTX{i7@Cq@;kuYeCTmpH?t4mr_-Zbp^3Io;C3D7zDsu478WKX zN4P4i-s+}kD~DVB=z)`mi-b8S+UVWY2!bA{9b8^(87H@=$7z-uElg2Wo~LT24wc?w zwtpS>0I^_3_3<1nHygYyK{%#}S#Nrr+b3FnO|MQ$G8meiT7IW_>QAr|9u)pvQ+#9m zp*yPf>gr$I>bMAk0>6(RfmGR46aq4E*D~<<>}dc9GJ7 zywaj@!(ooTe8?!gG2={Ud(=8oy>MMOo`igVGy1UBJ>KT8H!c;n&5tUtk%_hb)qvV< z*Fq6s;>=M{%t7g0V#xp|`M~_l@2bgdqUTqggK)Ug_=RNtv#^AB08G(yDCqyfQOvjj zBOS{D(%IG`uqWyMZD4)PWnpSA4>=Id5+$)a%53S;YA_yMFGd)1=Vfk z|FaH6%wK4>n&a9=MTMpxmh?b4z9+Ws*K=I2OlkTq#0AlG8dxKv0ntNEte+@|ybC8Q z>b0M<`Q?n;jRwM9iX$qDH+}3*xleNBh2M-JMc;AdI}7bhmVm>SS?@%+xSV23u* zF=Y&)LinCT~dn5(fWant+Y;x&BU!;52!r5yU~yg7`Eep0zMPz+*IKgyFiObsDUrRQc5>ITHxt8Wwi$0VW688;KG;ze7DSW6^YGP#jIrs}QblKQ!;>o>z-p*4|LA)|l?Z=Ry8rj8#Cgo*y ze^?rl#w67+<%k%E+(c<<<$;D9Y@9pJeUmtfhL$9CEd3R896o}qT7?M=2FdUiUk10- zlbqzaB>!X~IbWzuLx^NFE^TnnO)K!fwJ%~g#xf5onN8BA_?1jsLc?8VIEOLspMeqA z=Hs%GX_#IGcuE~y2&dkzNmt_0XQ8su3)h3ZSWoaHlY+OU&kEK2(TVJ`==GFKprVQv z5o29vEd~7VAtf|?rJpt+-5=6;h6MKP?W}oEFwbd_iZ=3B2(b1EaP?3NUYTflFV>GP`lLje|Q0l7wfh#9q&; ziF!#{>kSL+IHP?2)eJOSy^u)8_=0w|n-GhzBgKXygq_X}W6r9r7r^j=6LUcOb7Fc5 z-|zwf>w#vu(Y}ba?NZ;$n``!7txKj$?Jo>|r<*ajK4N!Grjs8-W()6K(9s9vg@55+ z(?gwZFfIp-(%y*gIADx9|M-cCQo~eJ{bX2V`=Z6l+YnWoqciv4y{AUw`4Oz_|A6wz z0-U9^UTo;RM(WsmpdKI_z{xzsl3PTki=gaK2J}CHcmQf5$j#cIfp-Kf4YQ%x;Ty-o zxd(edMMT`G)tOH+W4OAhnYyA*xDkj(m}RKWTe~I%Z*GWbZG_6~MIXx31DadBT20+M zeaZy94;zn4TfkVnT^tM^J%LS;A+SmF(!>fY3ci#0JJoiQkC$AwTMQ2BkXHJjc3xVAro5R(I{77R<7-^JLa*R04YTaV2 z9byY#j~uPf3`LrfjqxUc$^I~*v_u+d+v>d6eMOhQ?++0`@!JufBnoFqws-$yyS;rqC8@+IN}WGlCA^Ozn_1w zgZE7V-_h{^2&2+GqcSzrHHS1F8d)56(9vH2YXCL4f@Io!ByO!oe|Fdl9$c>y|~pGECRJnIfC8~ zM^>a&hB5>)S$u~iqW>livwq<8paK>J0|n#H!~=+shse~s{j(Z(rmL<4TU)=2u;u0# zLFxhXTmA{$641=0boNXK_dEt)YJMi-_<)57#4Jf?s7IPjSv#;Oz9~f|O6Bodg6JI1 zfq;l%m_^^jz=bD%@HR)b8E_rpb6S-CZlB{T0Y?;p-v^V$X#VNO3SA)1tOFE%@d#}7 z;l|&jrDNRN{%baNZ1C?8U=?Bs9qC9>{;2J82{+ZGYC2vo*dAAFyi-+d-tl*#Ek>zA z;eA{Xe>nb(jrL=L=P?e&LaM{D*j9gQF_4+%?wNl>VgL=gxLis#+N;eRaOfq*} z1eAlUZ_fzc@LZTb-aY725L7(gxql36S+M>T>mJu_;B8*9qUny-!1*>F57P_E)FOX3 z5-=e;>9D9H287B7WDqR%k&u4@_V-V|>+=8iro?`i5VUgKIAFW`)Z*>Kt?5c~V$+kR zCBU-LoXF%4Jp@KO=&(FR*|=W?kVGI2rj({X6+i_E2=>(nMFfM5S*;oJ=Vaz_%@QyW zW&;BYu+S@Iqj~xx=D;1J*s{K@hft<#dZ1T#f9w1i*eYYhApUKiRvI6-BaIBUJtfYr z)SgxOi*8_I&$NtXF1P6$S#+KwHu`@JI~-x&=)>>-uR2b7+PX#D{9N5KSX;#9uXjZR z%F|};14)pocfCh0tEDPz(MhBK`=izwA@H2+GO)+SiN` zsT(pw9{0;WC^JV5oeRK@fF5kcX`AUj#JADtEF|h^O4OR4B%@0s1D8{b#Ar;k%l*Hx z7zaEYN%gN{tx5D?uvK+y#M71|TT9Pn3y0mdV6A9|(ZmG3LZ*z#xqi%dxx?(tk%&>r zy*q{kiycRO1!{Deg!~LH55FoHgG11n`2h9UaqNjyl=(AB!+{m4E>4tYs>cy|JS*N zL>5!YRMjgnez)3yMV2`UwS7ji-EFP`KXo6Z?w49fu1o}kDZx75lkK-hqmjYiW<>cb z5ylLS+rx{$xjmt{W{Yg}pz+@_s<)fufSLBSh<*labdVxX2rq8Jwy<(5f+4!zCOwTF zCfp3mGg=mw-7mXy{;LKB*KNs+>+Y6X3vHP>IDxF@|GRO>lz|jh;)G_u*F8+pHsqs* zX)f>aj`0s+)p~;9*In88fQ1J=pa)Y}fk`=eJ(>W>Ph#}Ni@}wdz!sIW8)y-o%7UJc zV>Xix>A>)7*zpJC&87-F^No(HUtG5{A9e@n_vO)5aY2HR)t<;wgul)}DN2kN=g*e7 z5AtN{D(s+ZR(&2m{?b=a;ceTtAa0 z9X=hVzxw%no{)ii7{&yWbB2M6#R3ok1x^O$6$uL@8XYKod5yf(lk-}B({fQ7m8F3+ zf(vSBC4?D`XL8WIzG*_CgNFj=CGey+V-trkvpG30c}s$Hla}U<2Mk{GVp>gp77u0G z+cs+6@oJauN&dk)e|2Vx2vIzk)RI)xwt{mAMsyImeeNsDf)$z3oubf=&JVBmiN#l7 zOTj2ix>5cQat@Rt5XLNny)mkJh5gs$>OS=0gBRM9g9Ks-z%bKu5aD={(fbx+5*v@! z5|~g|rZ+-Pd;Uc9eE6=0Yj%M=?|%R61N?r&^_0M>r9gMQs~45-1X7KmuT|QgbnPc4 zNkoDG(`a7!<}%c#%V8}o#ACBQVu07#H}v~v7o-5+1K8wPyl$zh*{IB~?X#{@L{63?|%VKZS5uLL+9WnPdcdLu&LQC1v zDwh90NK2M39E33Ph^CG!vqsyscj0|@68|vG@4i2qsrI{3CKjefW@s395yOh{zQ*2j zLG+;oA##Ce&T&<~O<)_iFy|Eam0ZLN{S)5DFSo%kY2g6`2l)Hoj1}Urp5O>TBbj=$y`98q0rQDIty+X?TO^#{Hls%!Gdub*8dOI;NY2mid3mw2%yPt^qzq| zXh-kP*m6J1bG&1@Dz4%62kVz-gw&U5%wY1RroW|@jy3uHOm3_Th;0CPF%0)>jxC7;p^VKEL_)%o1KY?m)V08Z{Rg5a)wN1aQ8|1$*Y}36NKJ5K z-6OvN5fsQO+p3M`srGKxBWcLQwGQ!%+cwVOwtX}AE$h4@sp}1pOzh*#M*#ZN3sTNO z<|*b_ZIbDl)gPD1^f<(P*B7l09I1?tpr+Ej3HJ_~>e&B)_Dt}_EOE4tu1S6DT2TB) z%3Sp7_=l-W8>4Tw9~g9<*OtjRumS#r7#TmYlExBB&$2NBIxR+LMda%Y=aoLy7p62S z>CK+boEE3EDxc~e6*tjPWgJ;XVFDr1wmZbSlP~AgG2A*osDaZ@8Qqn?DFtt82BgDT zIekXRN<X6ZG9v*pjTye}6z&$)n;!9I31YGzR8TQ2k z3zGW`P)H}ufolc4tyEgW$NkI+qItokvzrqYB)Om|$+2x;u)01<>+6-6(`U@ZXn=Sut?^NbN z_RihQU>4s*$JTpZ+x|M0IfgzakzlUy$Y>G^9FL08Zg>J4Y^83rr@Y}`b3)ah;oXd6 zwlk;C>x|_?CG@_h5ahDB^*Mtu098JT!$@iei8fy|s9D#EF0m^y3nW2RSy9kR_u`tp z%1Jbmew1A98v#G{UUbWko5e}&>{+*ESTmV2jThiuaa>a52>;LY`4CeVO4(gQUe zIzaDC-10ulyH*0CD^4xBQvJ#Nv8JMn*6}PUNn%W*xrimQtVSs9>NrxF@oGO=M0^Jj zykWK*r|YJMuBwon5D=2PhP(T8be#7W3|Hj({#GKDGXoNa{v> z%f)=*$>OIOzeZ+nMXIQ&d1M7rDS(KGJNvDyl+a;i(+$}@ z4J+q{_+SAFn$wnp=KR(a(Sjyly=sqp7h4M&=K)Clg-a3HstK++JhON-K5@qPmbz@( z9;%WN3+-R$0jOutDuY5TnwfCKckCQuIW+!#uyw+J;yZf zuW_H4c5R1g7(m7h$AXN7k-2mQ?6GA5_D5?1KHQN31XM=QUls$Xf=iw5u};kfXm0IL zEXqa5LY}5F)-%Z_JrbmvO~o7**-8+B5$}h34Bk7?wm40dq3TSwCZpexGLxCsNmC(z zGbN56stbuHm8WQeL~11*UGXV*#Tp14E<;zu4HAiES6W^jv>T&48yx9~R%_J!Zdksh ziS4L;#qlrbj(Q$ETPd+YB+ty-Uv8!$3HVNvwp&VkOH;uBIJD~+RP@j)=bO7L9QjUq}c zLSlEgm5@CehA0R<3=C#JW~vfExa|y>-x)dXPeGm_$nLB3J@n-<&d%hW7%2bFe4)&} zrOYZ?q@%8z2x5@tAjf26zU>|Qv)M?qUm5~rKGW$jgb+RSrz<_cjZjdJ`YzvJ{}&kI zylhg442+#8$j8GS#QwnpGV**$*|@$p?;6&i6IS>_9bMeaeZs|Xvc|CcqAPx*#$sbml32mNh&-i9 z%qiXY>QoU8E;{^l_X7SEXvh0$;TREtK45@A}CoE{>CM_?eh!-sU<-y z7yUp!lC7_}e(sF)wP$_Tx*WjNF?hc~H-pmWey zZ#!mmfS3CkCnCVe)E~=mjsml#=lyH@MXUO8v}upsDjY>acSGB3fnujPuSG+7Vk5LE z`0mt7iKMo1;2Akd&QWuCEZ`4Ov;-Mb2mKW5n=}p35KA>^YqF)z>0QgdWX69 zl|j}>^Qf;%&8VbGS$}bOyTl3eln=c!j#|_P$p0{&+KWzrt4iCTmm4{vvpDz|p^|Xa zp#um@wdd8+8BPlRPxR-+c+)I^N(O)Ho`ATBMkQm)c2slbCRGn zqyVqDfVblCXG<9q^f;cB5{0FFpX5ScARUe@&c;AuUVYLS)YC;Fq(U~=YG=K9rI1m8 zV1WZ7S9)u#J4kRc-14%5MRA^1^07ZgZWkve1vSsphnS7b^}(~=Xu$+wuIcxHM;l~; z>EJq5g03_j%1{D%U*|H1dcP1#Z~<55nbmTEK}Eb66?nO9FoP!XAFzBXQ?M#!jC=)J zQ&XJ|ZBMUtPgD1K=G~z5%fn8V1lrs3bhEz zOy-#1)NCVN{s$v6;Ai3jy%HXeFP*6=5m7~snDYuTFpd;3`=B#P8>81I<-C8YJ?+nN zVion1h(fabj<6sAYFF(5Uyr-v99K_(znR51z=Bq!%z*RNgD`?I>zT%NHHSwvZx~vy zbbqS7fc{p=9ikuOu)i;~Um#$MSycKsYo0wMoMDM~w7=hwPVpqKi98)m{y(ID+#)gh-Ok(9Gb>k*gW-#EfEar3ziCRRpadip-$P`qqIcDzQor1aN z&q!J(E@e!|i$6x;#3W!IxS*+UCQ+*={-%>l>=Eg%HwChb`MTUZVs+>(qh&0qQcK5M z)Oca>q2oP$dWXiTt2YlBb)bMcW`<)Y$}IQ9VCu0>V3U+u|3*9AqzFE$wZzrs`*ux* zSWcWdr^Xdl6_f@dieQxg$sKxj1eC;)W_P=zqIxI*QGKFt{!gJ$)URjpb}%8$I@I>m zk+%&E|IR^1)8AtLf-cX%nnz{L3to0`2d4#mk-)nzaKQ-Beea$HeYF(JuMmz=5H<&8 z3He+#-Ml;P(Lp9Q(uk-6AtK^}ZG%?Y%})G4jyuWYxu$Xwow0P3)%z1%n1kHcMwaiS zs;=>lWZ;7B?gGlTg zIyVg|zczG;j)yM!I_nH0Z)MzdS1;SCC%T4j-SebfEMQNMvtA@t3l#Q!~XsLc`qXmG{+QmPBgi3T)7==*X>S=Rl^yB?Q z?JFD{Ze0%0SVVIGIW}3g@croATpk;NvHl)&W|k#b{&4j~nQG77$-qaKEyjqJLAmmS zg{kt{6S6ivuG{Fsi2=H65+1ZF9~#vYYc20&?vTyT+HYFXqkt|Vy?f-wO{-S2j=ruK zv>l0B(_?sR@4@Sd#cv|E7hQ7vyv*mZS<#El*rd~iWavg*jx@=GRp*ld}=L3f%%cSXZ1$ew*J6mbL#t|M59H0r3=tzYfrp@=*f>Xdikx` zc&2qXhW@PFxbk|JW2jd_z5vga(6V2I^PFTRl!TgD$2uD?0HhKv#Fv!)KSWN__l;6o zDL{bZ|M0#<-F z41>`%j>+9)85>wdLBY(eC|zSfEaG6`l!7UK|CAVZ21B(L6{zRns>6*%kfz|x`rh^< z0cp}>epcJqi}YPs3IgD$0-jEnJ1ryV@4dUNC=Hln=KJ;F)qWVAPpR_+>hCC(=Ucd| zv@Z-K;j!}qB5y*B8oSRMHs2Mv98c=%u}OuGKa+imm%7K=JXuzWn=G?jmDS+W>n-i~ z$~$Y=fg#W*A`bVf;wDil9wsi*eQ4x`(_w~hUIcT;Al9jOx6rnSGHUN|WRb~hritLz z`Pwg!qs4pFgFG0ViBPVhc2d*dGcASN5$Ulc!r@c8Nl7h)8Ft~4ErUG>#(V@!g`ff5*6~%}(-IWS#{ZhY%(npWPpz?A>y5NL zpN<_Xf?J(SC7zU}IERDzY$?(h{RFITYJD88rStao{vqIIDd|=4Di+ZBFYiHqy*^tn z6mu`->Eg<$g4s^J=by3O(1 zQ??BemKnY4pq^$(@>*5`F=iBBCgtc(6Hy%-{AggK-#z5(wP&PT?T?{0eI~zX%+SWt z_>g=|hyZi8^2pDj5*J&3p#e)a9{uLhh4d}X3RUfO2I?;oZLx2nV<_whRE=I zZrQ&vzJ|n|P8j2VX@A$6Zr18-)Llc`Dl)6L;0ML+{&8`o5S?%X&QRrGy}KsOH1%BG zADzPsk-_Nr4#KQd%Nc;fwEHM)L!c;ip$nI4U}{`AK=HiKWb5K+QBs`j(2A%iI6*PQ zf-qWGyL9-GQ>aHBwy4iN@+Kk%_eqxfj^CBi#Y28th61h~A9Qk+U6 z{3U<%F?jBEv&RCc4^ZJxHW48ni#yvfAcM?>iC)(AY`k@hu6e{p0Td>uSwVaRjyUsZ z_H#CCsHh9+RQZ=UsQm*cwH>r2L42xjbt?Un5*)^&Kl@%u%_C2cXgA-XY$428VMiMF ziu~>bpKR2Qu5*qNQkV)6NrK75YC$i6M~$ zxb0G<{?!vzU(^d2iX9{oc~baUOcKZSP{&bEkyj#L8WTi=hBRbH+?UjMaVh8kt%q8s zj+l}y#)v&(Y9W!AQFPz<3R-WaTY)&@Imxa~aWvYh1rWpp;K6#mRweWV;T6`P(dE;{ zY}CN>w#PVUo1fTK+&3&QsUc70Niz| zH`{nq8aGOYsj%50a)QxMGtX}WeEKA4sq64>ZQq@0B>e@SXf&cuTRfHQ?eMW)^Wi4? zZH~KE+KIBm<;ItMRkNr8joa|aoy(;0;!gN1CeV$hSA>*QI9ngP!t2cv=s2|Xloe~EK0p?)!z0x3T?V1DtN|XVXAS4N zV=Nsy8ryx4jt0g;?yD8}zR?0Mt~hg}W*vl8*?r zwkzQdEyLP}1EgKg9-Qx2MQK)PrV)=!cd8tJ-j?h10TN)kv9D1c#HY9LO+$aDK6xgd zN27IQcU(=m7NLb93z8*zuD1+i%@Y0gZpjZvvDhc|TuT$TMUDX1jQ4wNDr)aU*@z$k zTl7rCa7HadY&36lgrmMQd?sd?7(Q8=sYS1`fw zVE4bHuhr#alV7Y2E^al^YnM23&}cV?m~f}3m!TCczSqm&D58^+yp^2RK~<#An(^TF z8y~hdq`zYqbZkf?)y2$#tt6l43QF;cBVMWGJw63X2pgKtduEB^vUv{l7KoS z;#nh5fWPG?QY*DTGsU?s)J&)N`s^)x&2mq&LdB5c#ii!?x4r1^M<+f{GupVf=?Y7t4XBJWm+}GSctcZ<_Ah(31{;R)101JS2+r&rH=*0D z;JToW2hY+ph3SaLO^l$AyH2eR;Qqo@Cl`%w>TI_OuZe0Cr+Rc#q%%i; z`VG_4JLMXr!tbNRgipWQgsaYOW7XpPO4(P5+4$)gu? zgXUm=7mtMHN}fiYRp|#4ryFw9*M(pY(EM{Imx(_|^ID($4$tJgL;H?_I?rz@PPz!Y zg|6wbFN)zEQ_RTqZTDwz0d93hFPNNBH1&2|{jr@*+X0(z+RN>{&6*N|6;3g>PH}^p zPLHS0fQ$P-iBH;U$0g%_DdkaDWj%OSf%6n0_bE35X{c+O2vt`1boj6S7hEqc^fJ2^ zc8JF|=;+|IfP9FWBirh~>1&Fu&9A0lNv2KztmymthfkJjmBTP&dOX{tbOXLq zr9W!8X|nVY#zu^#&@ps`;pvJ-Pg`n~tLYtw$-wv>ge+?hCvSat^yC9rTK*k5##3%w zC{0$_o^kx0*(WT#`V$+tk*)C7X$b0Bkvj4ReA4Pbx}o~}Iiuv@59i?wrwL6ckWt59 zP>>?nHuom|*=+Yjp>NGh%01yWS-OILU*EVwt8K1^txexH76X-UbsC=xx?q}rePpS; zR$$tktxKo?lTCI*l%L0YgZJ&{7bG=tDdgW0-{n_OVs+g5PL{l1=$=Qpd9D7uaU3z6V*aKHi29}gK+rezFbV8ah{j05B?(nwdv)8i#VE%7e&gw2;F;BwcMG*?l&&yk`t zt#{vdDlp3Oh7Y@Ot#REEzc*E7^LdkMSfrp90YofwWMHavRFn&+E$-TF@+QqsoUnBa z=lXO_cGQlWgT{fcUmO*+%b4osw;yVq8NJ;!-shWJChZ#hf39-oI8Dk--SoKv^4SEg2W zl60Sz#vaIJqz?RCNT<%WF-!M|7l=njbJGmGKEXod-J{F*2C}kz{RJ~u@nII!{I#uB zdel^1Lt0NV<|2ra#4oQUWlov;iWWi*C=t9$<|%@$8N@gSq{IL!#i{yxsxxGc{%dOo zn;XT)rG_4TJc%*j*uWHHWB7J6_hCppx2TRplT2Lq*^O>gpyxO?uV!^4np+a7G>mZ} z-cNS7V-suK)@Yd(dUWgVSeX@sBN%PoC|qeO&vnyA!4#6pLFSVBZ>&sM8{Y|l^KDa` zqbero$tjwIZ*e@md7F1v7(6_ZdDe!jSTNQsQ(K#1p(m|(Y9v4B9_aaQfZH?LNI-gt zHePCBy9%_FM|&FI!@;irbe(HX$|lq3z9Ey9BReXB{H4E{5VvjQU;JM$UU}4Xii>-! z&l$)=DX0MShWI1U*9->`pYGv{7E(lKnT^p~mN~D)|U?+NUK` z^J#Q5=G;Iw9Hy8VY|e!0vE3 zHS&N(G#cNAUQxz2e7jzNdD59k{fuhWKR#f9(#7KMS{JoTNo{LfL8e5HU#kMNuK=gp z_Sntv8IH@Gz~0tphF=<{Ke&cUhY7$&Vsgb6x8WcGTdmd|%v?fiP6h&e**jcL5jLpA>e*n-gI zi*#@OxaYubKCl*MZTGiD`kRS?2|{Q-MS7$=ZbSD`8^@K6ib}t_7StC=>XC>(bDSd~ zs36NG=lDL)`xwXjclkspT9$8kWYn&p&>^V9^n~a2tKsQT!BuC;%+mx84aneK;Jd`zFf5qbd--72Im3d9QP!M&SUB{ew5mqW@aI_~L^ zvtf3p3y5;sZ6DMWk{Sy5)#Jg#Vwb{(d5Jn74@5J2X_SC^{)H`3^3nCi2UGNg;&LUT`aTVh6q({rD^|~n;3xY zv9+Lkh48t_<(qSH=0_;-M0_r`as*z-^ad1hgd4=?{7C43642S~$akTV8HrJ0 z3v_ap%4gGp@sZn(=C@m`eIV7ywFlMN)voaDbP{(}UnYM~>H124v-^l2#19Sl;fd+d zovgdl*JOm#^N4a()Ajd#w<5d86^2g1QN#>EXN>BvQc9VW?j)`s(!+QbzEw@aLqR*Y za;BNr+}p1yiO+gZo;wmGlE||0iaG2j*O`bVj(Y*5;~b2GKwW7Kuvf|M0f_s{?;E0t zozFgdt)}~1`MY5PMbTh?>3i?ChzB;)A-(jsw}h0&1vU!IHB*k_WFvql1g)c8uc`J!=)9EYf50m z2-x( zQI7-P7oGU_;B!8CvY}DyBht8+&yTB$KV!Iv=6ueeY6Xg{Bhu=s`RTC61yp7tt~|53 zFq!n)FRSgWV!uwizOp-7y13YN$`P|Yl&GWtLs$kn9yp^==YsvLDX)1fi!SKcSts== zn)ADNFIP3|+@m2O=(^>fSO-NvPUKnt%!rwiv^%f%7fI~@hV|}D z?!*P&E;jt-C*o8pWliRxA3>ay?5=kU6PK7n;RNEPULUMvwZ{AHMT+J2-(=k;Q9;(~S<>)ODb>{*%xRPfRL+osLy^5WTZei*Qu!RMsEW zc^w#`d+7(>=^n!re{p;4Gw{9)$Q|`;wnMX8t9Ftpv`e48@>C`7IS+~h9n=+0a)g7xI0>6Ys={ZeG&Y`bQ1J37YHb)&MxJZ1 z6jHR*soT{9p=>?&zK|?2cHa|9?i+V5`2?u)p|JEs;SII8LXls-g5T9J1%+UP0%Ad> zfd9$uEO*6Lh(U2jg+y1DDQ7D$RxuTWW!pVx3wa zY6hk-qf45Z12*P|*w?F_05>P10#`k@WtSt-BoUcGuKl zxKF6l)O5a_TGy`Os)|6ps84^s+aSA|R*6a4vAczo}ZLrB^U?%$OgDgxJS z&ANFCm;+%rymunm6Zy&#UEA7$+lWo9cRz*r5+K$)Jz~W2J`{LgWxg`CmM&nmrk4Js z!0thluP~e%?oAzY%`eC@6aFAiOE|3)3Hh6XP2Ot1_s@q82Y@!xV()|XOA!XC%3l{I z70?hKNFaDdNhA^RQ5}sRvSjHUwt^y$C1Y{Ch!;lJQSAoU!F89@78D#bE|Qh?I4vw9 z4qAh+fw}UgRWa{Z1$HHam8?D3?5VLED3%=}L1JA75@3zt&NfOaLVobnAO4OfvcBryf9c=Ut8(+g=b2E&6ns6Gx7SZ%0V{&MO_0?!4yum zV+hPiLLvM&+1KFs@4m5lUb#ZU_`_b)znQF-UA<6KvLI5HpS}-ZI1ANC$%S>@3jxog zZ)Z+VSnmrFcfW33fEh7G&gX;t9r`Gj-=PdzOkCS~WR5bx7KyeB*)hrfWWR)5tBd0HVI6DgFFhFeFWpSHW2DuB3zlO6~H2(>;EB2~Us+D=|Y}KAt2bKA%4N+9) z+QC}r`%7V}&7!%kO5so&czOP*0|fS>wb|V&oBde{o5R^FaA?Z_9^2G*T&`f0u`Sgw z`W%aQIK>I&KS^EZd0W5X&QGPS%{j>L11Q$}5|ZSeSO4K^uu%f=XC6my(qEG4`<;AW zRrKtOM52wwCng-YzMjtvP;u(s+0@z^?4N#D7Qs`kfhkEiCSV3oeceWFbv3GYiT{FI zNDc-gfhEjmL8Re)8GB5(ipjyI z=y%hO{%EbeW;8?Z9*U@tb9!7gprz{+R6&P+B#J<_+kt4aYH!hzE~6??YF5fuETfOh ztAKM6FoKtG;Piy9gaPd`?diy2qkQ^kuWkDv2_XA1d0C22@@jcjnIOzITZaMiC=O^2 zXDZ3TIR6Dg<>Xsp0K25(P7bSb(rpWKx2(&3`h(m8(BcC3utJ>gAU5m(1MF7Jf$o znO|T7RZF%q(hTd?;B*PnZ0nA!1@u$b3t5~P*rAA9xH4B<0Aa?jr_}&mjboizob~!f%hbxpB1#LOMe|Wa025DJ}?H9?kMnOzgI?3 zoL3VUe%api>&voziC4*w?)}|`N+RWY-zO2u8tlj?M&}7-`ZUIyC$kP6wvRM z9APVj*?WL@W^?DW083)WcMZFI(><&jxg&6d#^^zE2G+#9xuP}3$+}~rV9W%ZJpl> z0FH(CS_G2ul20qCd|r?69j!hjd5`1r=?5_nrR#AHMvR96w;i#wTkm1eYj6dUP@G|Z zsUQKlI?&^^-vXUg*UM-K8X}f!SIguWk`~`L1bLhBFnCols zK{5WK!9o?F(^_5-j<{Bio@C9vS)-yysruv#JQ_Xj?|L~A5YL7O9IhQ9q za`~QUuOKEV`J*7xaf@baY^(FDG%?!mvL#vy67_gD_@nGk8g)(_`WHva{ywrFk23q1 zbfqy2^pZz~JTpdU3^6*MnePqCmhV%X(|CIal($`(>K_vdTGndCkr8yRdM$A{olA8V z&Lr(LStdx_RMI&?GOxq|zcb`vPp6C`eYZi zs6Jr$f>?R0-p>@popLxhw9?k$?5$A41Fs_5taAb8t%=Ry>NfC|=1<<{svfQZKCC&} zQN_z<-e4?;P5#`Pk^Hx3mAXL-V9SD*b>w=33;+JD=j9*|s2v`X#l~%AYUYSZ7i19q zolYD~1~qJN0eYICjQ2LYH4J~TTMax#K7dwMUIk<&&Up6%)baL|;VTN0ONd*ovB9&$6Mu1f1+RDJys@e+j7;~2hoC+B#3n`Dl%LOT^?e&NK;axt&)hu>~% z3a$pUE9Ya)v(eH?aqQ5R9)o7sPM8WHHaYzW-CxabcY0O?l*u)Qpt-6^ttCjH-G7~ph7o9sv(g8kf16E<60%gSZ}%Wwb*(iuPtp1Urxd^>@6<6 zy$Dt+H&_AxY)SU`2Zy`>)}Oh5NXMzuTzbCm`iOmkww%Y0b~Qyppw1FX+_fA2EByJUdkeAl9=mvJxRA2Q-mc<(#fY@$I~zKm)A`mu zh#XO%+;QrDhGdE@})}k= zA@3QphRfMe;@n9Q(V;;MIceY)Dv`JYv=6C&&`ngYOer`F&kHmv&D;I@oQMO3T)XmbYB(5c#R%vg+X8kRheys> z_>}J8Q%VnkQps1XcUN~)OFjc9-#D+6O9EmE${@tN%->D=h)S45bY zC1$L_k1!>_zSgm}5H}hH@Kw1 z5BSz#uebjH>J(UK@+H1Quy!Sri1-0{R3!9hgFjcfGxs*T0mWlu09zJxz8 z(r#nl{#PK1O&M#&N;#Djx%Kl(5r?0SPk)|Qu78G*h! zN6?Bl=tul9=>)p^1Y`*`L7gIASYO%1|N8FVO2Xs${-PWWhCrQXdNV2_a^mU{|L?0; z@+B%HQQOYGmJu!QCHW zZDlss-tNT#P23!3TIT{c{3VW^{W7O+`~|OFJjm6X=fXH=`sGOl?|n$@;zJ|F;dK#V z260uKf@*kJp|0jkLZb;msDx9?V?=&UdZk$I@F};6qfT^BNYkwC#~N%W@H7|0@cZlZ@w3LJn9-rtMtDBR-M6M7^agADM(7H4x}1M;c&v^OUM5M2Ty&9ci!Td@PZRTbqSX}0rr5CLi4U62WUpt^>>U%m_%=P{%xJ~e;#T<<#IyL#@=A)M*=5p z+q_BKgD%zFM?n%v^w_5*#*ZT4eK=94s-Y+#&kmD3kqm^o=BL84#_CQ5WC@joD>qLt zzjT5Z&WFF6N#@wG=>cw^dn?=5y^)=B4}vB@6~ub<7z~DKc2Kd8S;oUT$6tHr5A*fc z9_QNpybCqUE-Q~`r=*2RxO8#-3|r&2M+t{EX4b{>>J-nGwXfq_?)dL`(=8v0 z@*_fBlc(ZQAC@EahSe&uVtaN$qu)=@Whr8s7t?%ziHyBeBITBHLML++dN6Bz1G!zMwSQ_wK4TZ<_c%|L9(u6?bp*Mr zV*JrbENBF}VIuZti*?*mo<-e?{$LdB+%ypA#W=yIO2xTcD%6W-=iJ-aJ@*i|ZG4Db za}UJ6JmaU6k0)d|O zQWuA)qUfcYr}W?c#rLD6Er}K*(2YRPuiFUpF6O(>1bUo@G;a`<1~Q${u4&E8X71VY zF5b5Ld)dDJp2$RN&B;+TyaoMqFHr-$mBB7Hi0ULki5i$Wpwtua_FP+jJei+|^(6#r>340i*#)#LC&vObcR-z+hoBD3nnf*6lfkvoKZxRVDtI9AK z42B{2hiIdM7J5P|gh$36KJ~?q@s(qrVaHucQi=H|35X{}sb~^;(EX`;L$(e`qh+;TRBN{5^U(*J|%cOiK{@Wq~eiE zf=@k(rolOTVTKvbUOU2>>mTO}FMgc6w!Mctwmih1&F^Ewx^1|OJl8;M3)N_TinOfD zlcLaY%0XVizPyT@n81YBXx-1HPQ5*=4ln#2o~3kw7cYE)7X=j(i4~?Q+&Z_HU9)fH&aLlY*W8;~mu#-v!P)u=k}LIk zlG1dY6^Zch8t;8wReAmItDqHBmN+&4HD0@Xh*#$ia^mt+C<(|CP6YLWNIVWKq2Y=r z&F@e3sE@DIJG@KleXD3t z9?WD~bOyw;#%*NR=C`qX_HDd=%e&aPc6Y%w`_KnR>SNJm!KuMuFbosRs-MCGz^@+r z48Q)wPqKT@2Atf4_;693AgQ$GM@+({tGuwZ_`o#KqfZx*lvISoI}p#Nbvya7cYMkz zXeQYrAo~&7R}z6e>-bT|2^|v%i5$Vbj{%*tPjBY+m;|?%enmX4l=u#N zM!D9YQ^g~=yn}c!IEDNq2wUQ$pj9fc=&y6(%3;o4Kf>i3CpbC(Rn9IPLtQ02wUjE5 zAaXNLmVzeB3`h#<5Cn${RZR#aOW+fHJSwcdf7#J!$y?MOgj!pyE+Z~6qH%oI`(Ty? zBfzhWaz(AdzzFV-e*T@I!?9JVb;!|L5k`mvfo8R78{U+#KnOoK|{Qt!=_r3QwdMHLlwLD z8Me>e&U&|vjq7$Ww|)oWXGlEk*z%UpT{%vbmq6)XT=)hz(i?cGvbc1U3)c>#PB?Mt zt9a*8nZc>gkFbf>&$*C2ZLh}lmLP?uDfxcVq)?Hbl@+Do-h5L3o*nMH;*-`!60x24 z8cYRx{T^>Frqk|vowN#cS9d?FHWe+gp=kEwe)lLFqZ=S;2d7lyexu9n&*+OI5i86vdSZSqN zkZDoS1l5#VHtc2R+=JY??fvYY{ia%x2Pue2xEKtEVIq_~dC~?+sah%2FMaNx@ZzOE zW9v?#Dk;u~o?j}}))}5vpm*)FtOC8+=d_N$>T`9+l2&of;k=NFClR4aD8l@{`+t(X zw|u;!Jd&2xIJAgL?*p5a#|Jk4v14DUOTNpz+Kjj>{KV{ILl8flO1^p$X{v(x7DGLZ z!qeP{iPnPtu4gt@U)QZOx9oRXY@|euRE`~n3)dy}2GWP7OSmP@U3&?53FaFv;zXP4 zKYQ9P!LW*EmEn{v2S=u*^(|BR$B)E03ZNK zL_t(pfZB{m_fjswKB^6L`%L}OI{(`oOD#IhmN5g|GB~% zlos}Rg$#VPeb+LnD{;>*(_o+ClIB*nrRIyI7Pn=bu~_5nY4>9L{zTu zdtcX-blK|+27{rE{AhVUhMN8Omb*X9bB}+CR0O9WF2zg8%_n_a4C9_Zr6f^0Tw~&t zs^-$bM=n2&-jb2$AO~=|F9ri85bC8h5slof{@T@-sXg^7H`=qK#Rfxr`$RSBr`VP; z^u=)*2EVa&q!<)u&#$K*MFLU^$Ak0V7YOjC@!JXyAuZN3w6*?PkgCfFb{*eS6KY#x z;dvxFTm{vA znQBTo)#xP<=%ImVrqb|JmkuH>JS|sE5J`L7;31i6+PKePFf`wlwqGWK92gBEsa^xU zAMZOolRBPy=w(-%w_5j^4V%h+UpzrF1~zI{e0SNU2NZQU-oI# zouc!FqL)xu7uRUBhmXz*WDEvF4?IBv9^QDzdpNQ9B`Py1q7@|Zc<;?W8pay0Ts#zY zVLq3@2Ye75*V3qr5(sq7mBnAV{G|UCDyUWw=$SlUzS(Uv8^*{v4VfovXTR8C&|xnU zKb7{)2(liGN)suUK@tmtB+{pSjg&9PG~ne*($+k$_;WK6hBj@*N-J=j_q^J?4&1+W zc7Z_)z2YP%oT^$yMDV@}k|3cw5N8*@!TIZl`O3+E$NFS5w{3ejcW!(;w{3kNYu(0B zP3~%QF8I9XS6$`01Zf%zp9}^=&v2eM-|=3KedBS~Ziw=xUZR~bBV!m}q~dt#(jouL zTRxD4a*6|PKl_1l0*jI)T*Ms^^E-7u`=cp8#G%{AGw zAM{v-p8f5R&h!tm8r}9tZJ@P@Um5iW4Bj_yu3T(LWH5BUK{B}u9sB*An{?X}L-A?d zz>$JL)hi;E*xt?z zvJSBS9`Pw&6jkBu_2)Tv<1kO2`ZeZewsG60Z|3z| zKEQ1o-@;5~BdRGvk~cUP!N_xi!B9%(zjbyOn`U-^oI!mBCqCF4YvOJgV~7`Cx%@Qm z)bABUy(kjZ)~X}YMD&2be)$}@Q&*3HQ=EFdCUNWa9thb{Zi5jbE5SvbM0-$W=*Rk6 zzTWIyQ5TN9pb_1V%KMCbnN%-nF~I1q>u%<9r3WL$@2xuB(9T*~ZM~Sy81Fe9`D=9v z>SIGtl9-Zva1v5;aR?P)5wwCsP^sd*;+#X&;U()Crii9oT|CG0=O5#_bB`ekcW!?d zyJp|cUEAKzY~>c5Bt@MUgTY|v3Z78tDgt|Mc?YlXSj_SgypiXIu}@Gur>-600I*L* z6!oB`kmmr>bFdPnk}fWs^8fZLf19dvR8Ue4I&I|7-n&o0R70@QGa2u7gl2HEY4NSz*Zu>*a-H(1#OLMP)`9>Ljr!;j%r6qiGe1<5wwnBfd%9rb!Y znOzQcuY_?aIqWKHz4ZRz$Ms}?TEBab^C;1OQQu@y%378xb(M>5fNpKjGA>4jE#J?> z9+OT;%avly;_Dm#)+(S3tFAvUZQF=ZB-ra70GN4O)lT#ay;YzW9t5f&8mi4jB*?Yk zAg1k^@fI9DyehZl;%do&_tntck19|>J-9?sUt#;~UUtoW6ZhWoSJ}RPuPqjX!O%nI zT|3D7)uW%`v#)%NbsGeiDn60cwz%KvqCy%n#shtD6h7P`r~Gzs9PwCU`--)Xm4qV8`R z0`ZRH!4~mDGcEQy8*2o9ZwYjV1q#d7h`Lp)%*$SXL*2{MzLbWL>-iqXU$O`&Z%ZP% zNfzST)%ponG>-`~gPp~{LGL`t({m9)lJI+Rp7RUObMD%6eErmKFf+53J)1tj?OWc* zo!j0S@(-=l`GoN9)mQ~zj2mNtTkI34nifbAlZG)ErU8PFr)1!DTlV0OICOm#?`GnI zyb*Iy4e@|s%GYm0{N7kj=cu9zr>-4=^*a$&)kh`aVYCb)y#xst^&sxVm0!j=hi2EL zV#$ZWU>HtPFOwlNvQn@x+#teaTnse=!WxQ>kiC%cYGBFf>en zp9fCQzl7?0Mc5AyqloGO6}NBL8t4ZQhbV7&=Eq1iIA(`OMQryO3o5(H7ygu&FFnrZU;Y@|*WJtB zTmKvG+WdYttlf!7fJLjCmgyc&v!1op~PEe3ZSMw8sZXUHV`3HR4M(MX4Yz#d~lB85R`}T4DQ! zJGgE3TiAQ+cW}$>UhuJRO4MV|QsazdHy8|4Vt=Cv3NoLb-+c1_;>E?^4OQvPv_9cC z=={1t!o@Vur&|MkrTffzXLYDkNFD$5+x{rYy=Uy*sXda)y-T==>goBT{ui7gg@JYI z(8SwGe}lm=*q}fNM^}yf7`sHen}EV3L=1-Mg!il4c$c&wxV#yUp2C0We0)270BjG* z42I?f6iOA53POr{C5h#ADk-WCVUcqSFL3_)i#&7gKQUL?#ogOJ$evq1$o38QkX56* ztO7ljo%^WMZadFlm|&Zd+ZF)FwhcQuc0*7E#3Yyv;zyXzO840(q_)n~F_?UL#O^DPoMq-8`kaQbsHbzjxF!u4O`!rHxvYq(|CSdObgv$ zm=2qqvSagIaM6>vq-Ak}!7vU!(}|F#o|6kl*fAFmU8t~vw;M{_Oo z!~S);F1r0Zi%ZHK-)67vRzrPM=SIy0mA)s-@<&5i3nkxbkZvjDPF_fygrIJWgxCF&>?dB;C-}o%gpZ^SNl8xN4<=eP>%lml4)_2z$j@oiH7^cD| zizKXNGpIB2+%OSvQo(DLM1&Jpzk#Z%#Gq442t;}&&;`|By!bzXhRS$}N5Djavo;tE zhQXi@8OuloIKxb5j6@&XwKF7b(?M6G5BlC<{O)huNc3(<*Rt%Yh*$w}N%PlEU!HdJ z86(dPo!aSfT?@?%j2uL5ViixSE>?VI2eW3|v+hgb?Z{$(tICeuav}*X<49gS~c-# zSXbSWKg}A6w)0+f6_rh1-g@1+HujG%ys|f0U0bu!<16?%zAIC~q- zsKAEzl~xiAW5l+0qOII3#)UX<+Pr9$^*L(O-S2s9eE;TT)oO1r<}q%cn}BsPf9<|@ zlunw|H3_w+EuF{uWW5O47+ouk4I{a05uH_12wMPyn|X6 zYlVBg;ji%gxli-_xlgku*~p#S-@{#-KENBcerrQ~m$i<|eipu0&3eeyeqOVsR)}FR zj8>3U^JKGY<_bSfR%{|#<4vZ>e~sV+@?L#vvj?=zdTq3hlSdPYDybx>R5`J56bRDqW-{?qEO%8%kC%C$t%c56RkFbs!qu%qYGG0&q3 zOOA%SFm$9My-BV@pVTBlY`!`eFtc|C!zg0pG|#&*tiz7wm#SAea_0AW{>&e-E?LK2 zTR*^^Ti?l@TfQymt!L!8hS*OeBjN>cSx?e}opdNBw`MSmTHcoL$aDshrC@t(n@(p~ zyNcf#CyptNe#VPO)bYy2r_$GNd%($loT~O*{nC;^m%=k`1x3RDa{yroc_%dah(;x#>t<3N2TGOW4im;}mNA1oWX zOEks-Hora2uMOYG?GZm|bJD{D@y76>)3?&7g`QAl$zSCg=ReK!XCGr-Wi5AXdp~d7 z{vmeFJw(lnL}?gRkOB)(Y-XKRysNYQV=#=Et-f{Z?VP>xk|{_`Av!q)I2N(5OTeeW zFKLyN*N^b}M;>%MtUf5I&|e7`%};;F^W}=}M;!YAQ91SeOQb3!;t@&k2$063A4cjK z43-oRD;k)*>cDX#Y(PlI8=aF+5F@{UQ7A{c!# zx%Qycmww-qz2;hJ%k_N!txC`)oFN^gE_yH5HV)%Awn6l?ClQ9W*SAh?A9Ay66E>!U zhzl#JqN-tE$P%K8P$Bh8kR*s-;_A)QJagugJbmuh**LR^Q?IczkG@?UXa~F9GoI!&=JIq1FU?@O}jH zT%3eTbQIOksU+vV@WIePR2>zG4NJV$of{0J=q0VFcm;Rb|E{q~0TTTy*Mv`1t2cLLx#6 zNa{Fy?Rh?cRQ@ECruU521iBLYc8h!TQG|zs9~I!GOHVC5&Obn;5|8VrbsMq-jdp{< z&=E{FY0{mWksjSA*kc(J_K`#%20uRxO>~2ypNXfzVE%4+_c?LV^oTsoQJ;cT(72G) zgHwk{g0hs4kcg1V5>g4(<*Bc5cHt=JUivujv)s1j9o)11uW0Yn zyun}?L_kwelCaZ6(;UNQb3e|UgU8`C#c6_fDIVpQFFmy+TXCwrpEc~rd&RQ%_^1kZ z>iA*QR}c}rOF;!uP#h}pqOB2u!C)}-p3IE2LmTY}H(8QBdZa>|<2GR=dRcQ}50nfB zgQ2;+)Iy7<;6O(%9?*5BuFuOo&&J-=TTShWgp z8-Je|I97>UAOy5n%tA`+8&J{1+ap@Tg5K-VkkuG z67>B2b)}sst>15$!G4DZVpRO?q`)^>IK?Gl<7^m}xV9-TIibsQ5dN-CH+Nhs6Mf9;Vof56c*f6UCx z4EJsOF!$~FYiwJ0H$pX3yVu2zvC*i85Je<5AcaDc(#BZRhcT4IL}CnvR{J~Vs2ZF4 z3JI!;Dv2Jo=cdsCV;z+zlopSu@i`m`xOi;V_ z201hk6+!kX{?SJfM7gr~n%N(NVRX_a8-fYLYEEpWq;+(XSzC{W7V(W`xCVp4Fp^j; zmKb(|Jt@9JRSOTYC*L88gyOoTr6ry|^BX+!weRPVXZ{w4&i)rJ-#mjTi2Cqvc0x}A zc}^tLMFDlF)Jj0|@gzvhSpOq~p^Y3(f*f?%Yt=xci&*|<7<*Ktg5nWLaM9OZS$vHH zQqJOT{U&n2)f_zv;vRk&J)puXXTLVU0M0V)ae@&eqnGd)#y8>Uv>IvH>tLFNyHxs< z2RA0!T@x6hBh{GH%i#S*Mq1R77lu;TzsmA)wsAM~b007JlK$Caizyk(J|2d@7=}MB zYg~uF{+maGN($mha9p}^oG-odZ}{ZX-^+hJ{P%hO+#j%%UL~t654D0mbYqi92MCC| ztRO!Bto&AO&l?PFphDK^5Uo%p!E1H2vN&~vJvnZenAk2DS&t%cNqgshR?cFcRN?KQv>M0}f zA0;k*n52l=%>M0x)xHb{TVEp_DwQlFGR{6?B_CRLz%YE-mi|S7!OsRc7ZF9g0uB)& z(HR_Y>dI4m?$}TBYfpcK&mH|3$L9}%^Qa~uMYTB}V)#^aHK1dPF8XlWy;#uFal z`|}IWBP5_B(BM~mUA{h!ak>?Y3~~9m;BPbq=N#TwsU|6>uDwt#@M98E_USA zpoWf~S$F}T3W=SQGSs2g6tA0Lx2FGRBiU=>V`yAlZlcKZ(QwLcRU1(Dz1q6Yv}cX< z?a#Q{`Z5^C#>d%qow9giQU`ZB7ILG14K;ZoE?1WDI1~j}Wih?ZvllIdk3@MJV#_Hb)4y#@&46f^mT@s3$M zFoPs1>ILU2c&eP5f03QDdwPEVHcE!Y?JsU4MUeyU8fvLe@SlRwW2_#ZP1TP6b1#w{? zjzcayj`_P`P!N!%d@YCOxQ^2cM*-=XplIU_g8G;$xs(gKpOe=PBbp9u5r&0m5wpQy z2HWOzMR(DKUbc>d4%+zUU$FMs93eDUR<Dy zr*R4K1cyC9X+$^bDO?JXa^vOe`9{MCtu@`XKpM7I67!0Fq`^G)_FT?f@dmOU- z)|5)i&JVNy@_2Qj5I?S&L?o)DyPSZ)DG60l0s>BCZxbPq^aC;s*MQj*rM0qeTAihfC9QcH@^GC^w z!^`nxD<|xcwnsqy0mPkOIR50#^vb|ap5>P?#6(ymXhI=A3e%5PfIC_m!M>b@KY$7X zhYvxVlw0Z2?#awz6TdP}bCx;(ek9g*?@w>*j(iWRn|JoP@k_n5bwqBZit^Pe&AX{s zU%vLrkzfhCtGJeYkLw}oTjtl->TB4RuqH>5*=g1GB`S*Z+-wb~XXWN&ofx3vR}>r{mY`nn!E@w2sLfAgYLJ{@Z4Mr5fmPr!M4e>cY>Z!s&&heD1}M@gEO<4}Ws( zW1P8uB$DSL-qgnU(?{#0#h5fks*3p*!?bvsT-ZT@bJva{qNGwmm|5wN*xVZo?S*NjCi&yE##Ja?_NF8Rvc2t4xr?=YCm5P>pgp zQbn}Fjr1zdUHDy|zxWw$S-+RJ?EDCKZF?_kl8t~1h2}zDah|=GSF1laOc4amU3(=y zP%;ADFj)u%-7c7-XSl^7szGtJwPR{Ypl2++)RdC^<;DNOj-MF}BM*nw zfLRhe8tX6wWEPh7fBs9WL?6{4NJnRn8JRxj`=u4ZZuZ0m$mZDqy_4r^vMpt=JEsKN zLlkx3J&1FmxLkvJy0V0mHQ=k9yMB~Ee(_(h_T^dLu>Ji!u=68q+i*`bW3dul((s*B zY=R6^!V|!i8)vwYUd>INJsdZTzkf*!jihTu-y*_=8?R*lEs-q``f9NPEjuv2+WWVq zfet|%1{D$1{p6JwafvIViK(H_!HFgKhOy3BOe?bOeLju*eH^7+`n^v|uS6d)jGC;A zt-r}dt7dY=c^{W*_F`ge1o`yF45JiZjePaF9aYKasSKZ6)|yLQ6(@pL6GVlIcv3GU z2#BZZ7IA(ps#Vk_;Z&|Fi+Y3S&ioF~pZ$Gq+w>Ohzva8Q_m&Su3MJAaYWB}CJvejy zIZ{bu(?zR7H;g}A7F#q(r+M|9yLyUmMrKrXDRSICvM6nn+ijjuQokP&P=8|ng(``s zYI|#B0%0Q<4daMTauQqT{Ygkf>%Ua$zb5_u$9@myaa(!-03ZNKL_t(V0%$FvR}i5mnqOaj~g#5a47qs#h~_dHc!3ISDE)N>QFC;QxH$8 z3T}z2+@y-&dX!KJou?<>qO#m4@l?1^NHL zD_6c6PIO3O17nytBr#V`?c&BU%hdX zRKdB5>4O;z27{pubmuLGmEezSVqZ+q`#E;w_JGA;7)U}Yc5Md3IPF*47vl?2EgsNE zBtg_6>TpQjxIIx%;zJy&0ysf60US;p;*}eEiN84h%Y5R{NBR9D{|6`L58415rUu6^ zJsb9nDpq}Nm=F(-hyo7p(`9VLj!5;7um39G z5naTS;B2D}H-K2>=y)f`%8Reny6JEAmn*jdba;Fh#94kVGJr<4@%>jkme^%C>imdo zi#?d%>xdRG`nvfn*RX}eMcNogDHy}vs&}$vNz`>cx22APm%4S5FgoIwH!YnS_B`Hc!6IRZ+ALwN%H&e_PoH*XDSHdo6FZ4oVuNC=ubhJTKgAp0l5c^!N}$ znpd`GKW-%x(=rBWInI`Vl!LQ|g0h zm5%pky?^S$Cw1VLiwD7rbK#J-_G5l~Ub~9l%0zd*)i)UzSK3+(98TBZFQ>o>sb<x>D zRa6ocO@Hm+K}0KfSH*cuBh0X>@#|)Nn0C9N+l0t4UT(KsvS7SN!=qi3=(b;K0kbm` zVK5k`BpzBRR-SnBydNl0>%6}B!!YVGWHVe|Jk6iJ@Y8&Wb=<$}zva!l{sx<8Zl_rL zqZ0m8Gz~;Nm3aO?Hgu2IsOs_HkQ=EE`MeG5OVUls; z!gEoxNUQt7?NgDgXq+~*(A(G@;SB^$0WL0`#!&@Lg6^2X(63-w&3GI7nSD<7`Wj{O z)c56nWgtn_SgiriischsKcvhA^9`%+J$u+^Fc^mE=gkiF7c2Tul{VXuwdZO_yamWm z{bE1Qk%qQ%ODwX$!Bd~)*Pr@+e(&gyb9~_t8e>iYR8x?o7K4h9WV$b`mD>Bd!YMw3 zVQBl2B>;|I{5;N8!g|$8D3TS+qYRUc3yZICK!T@M_LHffM(10G2717LL`31r_0u`= zq~4yN8Vu7Guo^}wgY(_XzYH1uNqojT==1&3S!j}N_iPtNGy}}^>n%Jn7z`8b{$tOJ zvG8pZSbaXR&Aa=Ca^tgpi!h2y<2A89a%&VVXMFFk=L#d$5PS0m63lZ`9a&$3?;5clY#h<2D1x7;BD z!Xx7Lq5kEI&-j!S%_`5$2^g9#q23Lz5x?cmPgAW{8(+hi+J{ND8$PORmN_Pt*bfKU zdNhA#Fc=1DYeq@7Wu(dTGEY=RA8WS0E4pFy@=%|k;=mu*PpPQ+&dnNB8R9g`h@@A$6!%%G>oLM-=jipQZ!&t$C6YFni=*IPp zSFY_+UcPv!itOj%kE)MC>4Epw)|CnEd6m+i- z$7ZmCYD$8Vpg0m#z$e0u>NURn>M!w$XCCGcUi=uR7mnuFV#8w?%iOtrW1nzw@ikyyCdTDO^6nNb4RqU{M?~b};wivI zXP6yZG8ha7gJE(5fk}`9F%o?==D;e_4F*GBZ2R)et?)HkHgK{gU~($Y`xWnui+2IMl_iqgG&M z7&59zSf^42JP86xijrD2BwP%JF-WY&y%NUIeX=qwb8qW>Wk~FdQokb6`GUyw^(xk0Ob~YYHgh1bmv$uc$|LhD3twUP=W~$I1DpI6i-fO*6ZA z+v|Ra`)~a#ID$@ku8Xd2@&hEpNaN)TPq46b6?F;X9g;e#m77%j3~KzIVd9hHCC!oW$i{fj~>I{h&Xz!s%kn1g@&AiTOakGSyqK=X6L;3c<-C8sdnB!d!Oa& zwXCDFj%M%bx?JatK%EMOh3od@O@-Jn|n>V`;_2C+q`PY*Cd)fU^1|9RL zN>B1FeuW$)eDyzX4s+=cNow=zGF|jIH}T(m?wyjx*k^w66rVf#FZiXee3&mE|7C9Y zg}5GFfuIa`Q#&Epc=s#)YcRChKpK}*6Dy+d)P>K)(-qaQCfy9e z6{hN|$c%tooIet}QA;dbm(&c@n7}F`36-F*%^p+kE*M?``UVQ z79|_ngNsc;z0@@KHPGpomrnEAnaAFLSpvKFbx}o^YbroV80~$_hrY` z+OH08>qXxzT0MRBs82~qNP<2R)ga?CPQj;f$OgkiB$1N>8Q_?W?zp*f663ME?-AHb zer3nl^+VTwmi?8K)Q+;Qy{%b;!C*F_9|2cqW4NLZj3>AZ1M=C+;zBnT`&85+B2=U7 z%XNR1ubulnKKbO|<`0kkH0Q1!3#7RQ@-l=@kx&N|7ry{W3a=gAF))nKdJKyaTsTSL zSpoq;c=Gt8R3$}ZEh&n!6xOT@8tCIuVQw(=#yxlkKl~4mEbR*oL{-Dl=xVJ}ydCCZ zRi}W?r&sV&MOE-rNN~6@d;&VnBzhJM+Hvu*jOBX_>?UjB_jUc6_S-}`$nxZ7hU2dW z(xj!y2lTwZWc2;ZD3j^tpA81XsM&#LvRGr$WV;K0)O76o?2N~~G26JuT&2z>;go(N z4t#>(5vrsD&z<`{9{KtY@?W3*F;2{Xy)gGaFrQKlLX}GRJB`AXB2kpd@)Scmb}wr0 zD>!CQRc@s7eB0T$JN}`+H zHW;QX6dBPX7eDQxgi2py>G5~LMw-{f+2?CVFFd2?ugu)>`-96P+)wN~5chB*Ud+%E^Ush&SW>#fY-GeAh zbynuf_wI7;Ip6*6cOa4#A5)Hr-2n{B!{R=1#Z-?{aHad_E;`3Tv|gPghk}XTYmQG| z|93N%MwuQQmSe9vrXrXTM0YmHvM!T9hoeP{c39{2fdzq_INp0+t!mJ zoytJ;pV9ibJvV47FSOECeEFTvf+az&c}|XTPUMRhlN`EJ>(Qchn*m6$)LH;uAg@X8 zfO8r^VRzt_=>FF2yb?7lAjGgSfr}O`TC@Y3tPhfRmVe5}i^mgR@kBlUksKd;ctkzM z=sWA5c$zF)w8LXjR&m@7tYZPsqwR-{J~r%(MLOf%VPi}p1=MLvt5FCUz-C}!5G79U zTnvN_tfvUCrg!lB*M1J4`N~ziw)i^*4>;(ft2)0Cr6!~G^?%X@1HO3Y*Rd{ZC=@FE zri>6&8Xz=aKp>dde$fuKi6?_EZQTK`LW!JbRd-mU?+Va=MIsQOa`(Y&AX0a%!&ixB zjz@?N3@8#U+L(gSXweTuJHRn^35eYffHs2Y(V|6*7Hv0c$2ixI&JB*bH8Wa_Gkdjx zC;`-PW5y~-GB7pVxW$&!J7)!yk>mirD?GZ|x{cqv{&V=%mwyz0@%AraOV=DNl423j zXoKhbqOKS%AZTan_>0^BFN^@f4mc;)T=Seb1=K=SVJOb!Xoo%db$Ir@^=|;AzJMr7 zZ1g@KA7sJ%zSro)4=sNGs*r-E0in!Etg9Kgkf>Cq^zMU@>PK9i>b~FYKa*G3gEjJse%IS|}wyAS6_hub9&&C<2wzE^tHBi`i?Z9iz6hU8#0Ynco+ z4!W1-i3wRpme5RW%;3l2j-NBk6OyhzA4Qv~stfwZmQYIVIFljApu1lg;0m&{wPnx4 zmmYQeEZY*!p&dG$3x%wKW?0*ZhmMX1vTjUQ+|%( zGsE5cpzf@kS9ktCwtf}LPs|LL-)Vl&P8N!H=dbc6AI_iV?r%U6SLgT34p)ruenY@- zG(Lao&%Q?=C?VHD@5e$Ph=Kn9%)Pj3)d1S?yPpgwAr|S47VRKe45Fe%i#9}n6m4Sr zDfU&gXmOrKi)&xZT@HtlG8$w+VzFV@@u#;wjbDBFZ{g2x{h!#9H4pEwZyr~d&W+ka zxRr{_= zpI0)=TX#X^3Jiz{3<#_YVmU&M95o7~#iSrw91DAG<6C9ohEm@#BIrrQ*fo1=RJyc# zG4`nVIY@Czv}n=dygUj%ZOjkwIRIj`4{uDN31q#RBBqDz<0e)o&OuZ@}(ccmu`Iu zsjT_&EFhF(eg&X_Di`eZ0HQ}b^!dI4@cQxq0zv)0ALHhOFQb73Bo-MdSevnVq8(`? zGR{p?hLzR=RLLOUI`6-Q-gkBSI8+uN-10g(j)AVKunH*C5oqAJO*^auj~2&uv_lRO zL=gS(_H8aq7k$P-1JOHwqD70gck?ZR=La*8iN125#$arMYI~?-3qw;dX#tF58l;Y4 zzNO3f)3^UGeEQ`d!I$3oB(`KDXP^V@hBUeQaRhNdJm7TGqaE&;9YEV|;CHV5oIfd| zATj_XaMPnjJJLqv&i34X@FoDw0AlE10#^fgP~uHpb`^R<0Yp*|HK2O5CtwV+q8&^- zJb_c(2$-zgbMzSNc*kl476+SO5kxN~wFgb&AX>C&F&2rwtbYK5!3&s0+wVN(@Wbr} z1ciknfvCE|fk>d5K}kTG0AxVQXlGma;@h9bXI}hI@ugdzavJIIN-YjChiZ^>Nuz|z zkywiapL^q1chd7}9|*}y6QVvs6815J*;Zz8DPTKX!)0;FjJX6K&F_pmF} z>*s*_$>=YmMT_%klKtDBe*Gb3p7)ANLfkS@_qwB;@n~?>Efi1#QUb%k3A6<8oRP5r zYQaQMq-dx`YFF{+w?2u_y!26g`Igg2ciO({)zAfmM&v>q>ipgni+yeB3wZV2-vkRg z271C!3os{Ojkrv-qds2jW*OKsGOTho}`*iB+RkcJQ)&4;M zZSVYvuP?u7KmFDJ8YJo&bpj7XsB zrTIf6`2NuZedBBWaDTL;&*bxSRQ=T1?|Zy!uO!>Hz_9)zw3YL#RsXOXKQUUrv5gNI zW8itv*-hm(AGH7K=S)#(DvXD&-?{ql>bNz&qBu}(z26*k{&%)l@6C~-eQc>6P0x8+=xtWV;f_5K4NxX*G~;W4rkGIU+6;cwb3w+GSq$6e zy<%aJ(dO$t+jGc#g8&E-lm*9V7T^8Y-^csregy2aU^>#Qa&b|olTICY!6^(!RG{wApuR8Tn` z-Lwz#gef}CXwjk_goHR+v^Z`Cd+xetCkBY!W;xiEo&rwX7VY1^L= z(mzW3Bu*TLqjtH)Z<#yY9N`25{x4`nhngwC#1ef1(|9zg|Z!iR;4z+lY_5#XgPg zcIb^21Pd06O`GELZ~Y>E<>im!8+U&TfedL0PzW@Dmp+c85^bvjZspNJWH9f$OAPS{ z6I@vCVw2C`{Aaki@?vbD!{m1({5tyi!wRvK6H2$#>!ADWv#)#g&M_BF*V5`pM0EGT zt>Vi>!O9@zJ!fJ@+vNbESXDk+41y1CfV6kxVKT==0IUK4R=hgCIZ^$tgBWP-G}sD2 zQuqmgx5u9yaIM9^A?g?rfsO0|>wLW_Gm%R`b|(l@2CwRV&+jE?GqckK4WK;4eXj@3 zdmY19)#91J4(wNgMFBcnU#?5Ysf6}|PAf2K9}Qs_GdU&?iGoC7K>nmmp+&p>T&m-UxF69(7e|Pe?eW|rDuGRC17YXgz|2ls5`7rD8bj{ZTUc0HI( z|9a5;K|vH~0BD0@u-sa}AH4NX@Tr&o7GAsiZ(x928peeM7Mk~kREY;ZG9vf_rqL#3 zZVJ?c=U>0~JNVMuzn*V|M2ogp>)b)a!I%@5E3o43>g&J`B7>3#EI#zY3uLZdb-wps z|K%;0gpfj&U`pqH1hG8iK^rXb6hX8CV3485L-YaB_9Ivv*VwE2NX9`1$-*h!egH!! z@aX?i`kVBWaDft38RS{sDgekyM5&V7mzQqfJTKZt=w>-FAP(sU5$6T46q#p0srw88 z>>0&{6iG?yN&%ZofN{|n{$5lq2uc2tyk?97)+(|rgUa?vV!GLzFT9 zScJ&<{^@4_6EPh7J-ik+O_29vr?g6E3{&@e6@Zt@^@@9BxNfojecW-KaBRPKn@5W_ ziFT;K@*!F0wP5ESX8MPVHMn#6)Isux=vT)%0NJ;*f|wxcbkr4s_4YgX{cHa#Uc2}E z_~0Xd2ale3-Y>x>S9GC3#-#Fps;@=c?>+{UT&}XX@diHk=Kl^u7C?f7xb+*!eFrnw zJh1VSWRB1zisjZqIS(N1GZ>S)H(tF84S@P;`qPz!M@4;N8@*?=y?3f{+)Z9Ue5gV6 z&XYE@znbV{$x-8+>hd*5rA_K3HS&>B@eiF^-l_^E2cC;6C`hO%puzwtMAIBJCM{`- zlg;N3cd&%113$@GPehKj4Th>gYb!;e*=-;eux$_AYXRz}X$ot_&s73Z;u+R}ZPz_p zkR~x0egmab8l?;@H$cPEASo+7YXE{v8y?(GL(t}cv3uU~28k~mU+Ix%N1HS&*J36l z4S?C?dnbSc-;=}v`$c;Qm-&R70_5p*_cp^8>lhMS?2cb>e920+P(4W2wGAu#>S=?Ox zGH$HCgvU-kgYSCe@8Qvt&qH9r?BbuYq)Q&sP)UC~+Wz$~ilVZsTles5U;7x^*#^`w zP$4%&ix#arl4lTGh`5|=rL}~g1@XtBQ05(Sr_*?2%C zTC`{-NMREELELEBc_MJ|5~lGp!$$?83++K6o)PtbD70AskOKJPvJ%=OB#s1toE~{T zRzv{~#W&$4N|Fj_PGkTjWEmq%1qKWeAZ>fSYBf+Lq^X5imm&}~kflJD*nmRjQn&)38n(H%XOZ+;|2y^Y8$0o4Jb-7cg1ZjDwIlJEgo0UL2Lk5^cCXJf4KVl1 zmByswHH(5d?lw5mHuCYqZ1Ms@Md9ko7Kvwqi|FqA`?wjB#8sr+2ZEvE4a1#5Ahx6eh7c%@t?r)#+(P- z>-tElZ1iaR<3j;}1Z}&8fA!6u!G>K0h(Q8J6oHM66fIhx{LH|>s>RaQO?(2XA6FtG z^ktw^_3!Qww$F?4B~bEPfA|CKpmhldSQ*MrJCk<+V$^YVc2m5EdFQOz5Lo8HgzU1y ztg6>8)q;sSrfRt33Iy`|-{E%+7wk&cqCRM_-x&ZpaHe#kmJ?WSh|?V-MelogZaC zw;##uAikn=J#hann7id-lHD~m5+_CCWjfkh?o~sCv@Nii(=@f2BFhwFz215`5%V%1 z81hxOCtwzU=C z6E;K!@$vQFTi*^zgJF!*={H8vXc_&i0yHPe??r)s2QrU8xYkzw z`yiSgT(pmCf|Pvn001BWNklE4B+D$yGY-dXMUOK%C;jj?k5qbVGN6+dc zSV$8v6i@?b=H=BAkl*4VG7tfn4Ad&f5dQMc@8FGlU&Ql|d=&4y@Ha4PP9vP&bH&^( zKqgLzeYAG^0KfL?$FQ*RCK3Rm1Y!X+gL3q7htBsRZeESnmwWk0IH^&qz?}#GB*Tf% z4%EzvugOLDM4?EhKKr_6S0UmOolv#QLc!LZ?C!;`8g!W)1heT(G{vHF%zU6Asn=LTUN6jS7#{~wRKQtx>(mj`U%hDMQXQTi*hWSk4HwFQlwjcMo57`g>^FH5^ z-~KL7uyj6uufE^?m?-?;aAY#>as9%#?4~#R?^tt5Cp!GQkjjwSPZY8pHXjG>TRs7--V*(0q;^@ zf$?Dd4wlz%LpAf)3*V{v&^63Cd#}8FlS)ZTzv^og45m=THVCS7E*r!|P%kSZMI~5- z!l4RsY^)Al_yCea$#3u!e#%W*cWNTbGKh7oLk`dFrGr#TbCccYW@cS+HfA81$^dPk zF_pm>1CU~7HjH0Ck2FE&+00@+CMeo|lPIZrEE1@glHAZ>z)sgG53l!MEB#Z7zlwOL z!yl1!tWR9Jw(YY{a1ReWOe{lVnL(3glfX0&W5V`ppMAd9AVxYayt5n^O-doPQL)Z@ z<;lZ>$I>UJ8$|{YHh*ac1F$Z}Eyr4wTwb{nckeddF8t@1^1Be5Nmx^StRB zYX|EiShsGrWDS3M^Ox|_+n>dUF8?IHG#adS=z&j@#w_y+S0H3lD!UMb1nEV#G9LuS=feLj+2|s$IiFAPzLF?LM7o0YHkM zrVOZn)ZV-K>(P%zn|O-_Zlc9;vpd^v6QLI%bC_ieDnWn;L|t-#LTlR>7t~6i*}aTY z-KJyZs9Nc$WNrB20BWaQNgj08Tw)~zdszzD43JEbwG$9$*j#to(_#&>tjP5ocd{K&Tr-+s{qbJO-{&@a%j|RpvA6_F2+Z(+cmfH} zLIQ~T`zt_y@|)hq5F`^En>mMbXC4M&22g@QiqpsEaPs&?uo|eiK0AGU9w(2_IRFru z(?iD;PR(AxiR0(}hNM8@bRx;K+^eI2OFV81LZdYP3t+Z*Un$@PPZ(XqCo=xFFP;CO z+tlcvfp;Wf+hQ6PCRuAG5DZd1l}ve)xZJa7>D(`)vF{AV5L zCdyzF!2h7ru8!QG0!0I)Zc}G-BLiUk7!Mlz4L{y}dvSs!G2mt!P+)r2jk!kCf{lV1 zXikZjBQn1IGpH0yeP{wAL3w|!9u!ASQPl8X$pQFsu~hBOq#zVFpezhZvQAx_yWv{e z^Hf7;;xfp(+<&d%L%EjMX;@E+OiO+rF@!o~b~H7uV=k~=L~PKKHGJ;c|BNqR|0I6k z>Hh(b9DfE%83+lKeF1qTKYYS=wA)#Zr#m762hb=0Xs#W~ zr?84zAwBQ3LP}R~%^jE9R)mnYTu|KJaNu}*!+oaRDi@P*Y+%(4L0g(!1u0NqgXYKC z$?HvL?oNq)F-8YYG8tG=0EuHfsAu%%g+$dec)2Ru652u?_->dyNGTwHTzF>sG|rvA z1mi*X`BUG9spc#o1fmAcpM4a^rcZdl-r(Y?%b1=zhE6Tkg5_$u+D%J|NtyNDjTSpV znaSkL<<4}bBym;zLDG@Ii z%9qbSQ@T#@Lv_h}U|hL>udXj*dF@WVxwW1y(m=&}y$?@%}X^wV^VF2kY-( z<-r0dkzCO*6kb(Tke`Dpj*adlgEAP?fCzy}JzGz`P@@4;0+kd@Zl0+>4Z-BYXX8Nn za8lB$`eLnagCR`?NZoU#8@?Tx-Mm2nwGF0bobPE)GeCsK6krm7nUGAoteQGbXjVb- zqUE~%WpT=*{$!%>tB{n7!1xW4iZAHuuQDLz>J{~#2hwLfDxX~34kSNZLA}JVYxqR( z@P6H%mnTt36Me@A4{KPI<-n8G%ReZU80eg5%|gY@aaw59^ZHzqM%p%Dt#}qWLsNq^_5Zex zu^l8-+{ARB4?wksK-tSdxc>0eXEh~|Ij~$Dds?h}E@pNN7G*FuAezC#I(9M(V4DD0 z$EdY_1HrSgPnZF$Jvt?p&2mKJcGHjPe5UjNCS^v`~U)2ohJvCBhXc# z3{sW8DZ8e;eZ@1zOA?O|x(k>0qDo8vzGa`Vc?8)2W z`+x>WaJhDd6&puX0l-}%s5SC_Tv}I(b}Gg!*MGNXz>}X#r;g3z)Uo->{k->)kJQMM z_(#hb+zG(I%{yO(AcFoZKd_VNc2kHAV_o$z1)wB&ckNAl_SKJJLs!wT z2`rZiZ<4rEqX@EwHa2UtXxq&?1AkJQz2sGK74^=yG@)a{o}qSCNGt zEgJeHztL*_Mg-1}z=L-eD-8^su0^sWUtzRc)c zNZ6$KhB8223A7n176b-S21t;ja4cyyPSac&02wI4JthuJga=dE>vn4cpe?{Q@WjRE zz}mocV+wQUzYP$@$>Z}ldF%oj+{CGwa}L0)Xzz1P@);O4>MExwmzXu>L6RgwTKATS=k@B#l!0?4!O_<84;$)Ce*I=y}8Yp|3-NpN%F>wvM?*xJD2{nwxb zwA&k4Sb7~qDWDC&gWZmWo_XXm=+26t8%{0>@XU2e^G%$f&##c8$ZIYqUjW?%!q%EX zDZ$o;fGEN0eFePK5K)5ZSqGa>PbW|aW{))>+A08cqS9%XaQ*J~aNkM!iIeUap>Cr^ zcCqFJaDI?Dg>e)#MCyR^Xgz|o*giw85r?7ecHlx{{96P5g$x1z=p96Nm%;|6jfLZ}B_d z{CP0BlVQSANV|DSxv*hgsYeuZ$!O8)$E6fGTZn5P*kuf=f0X2PHq`x6mVH^-d^fgm zv}nNRL8i1MRIb1mVI9M8( zKX(aJ$qCFfPvHF7%P=ntAY7tNeY?ax-L9@A#fbf?q zfKH_fgSgt4WpK9q8kaW1xn82B^LHxgb9%TuFtSNYqTr&QR z0P;@8Mq6<@!dC99U?KM_Qp_do?CR!%8wR~TFO_Qq@VsD#bLliixF^%`-8QF@hZ6wB zxT$J)7yUz}2j>o8zN}Bre#lT|9F|${!5*FaK;Gw1JoLfR22p6g%x|71j zFeph#0R!x~i0C+T%xKXjcl{HviZ6)HSlwC*SvdnLeeeQ@ockDE%OCnjpZ{xG7u2!B z7kV21?qcmxJdz>4SF1_Kc8xQFXB*}yA+hGibBIUdgt|eBoq$V2EyepXJ#$<&|qdUqw(I;0(cJ-XS{8O*jJF9c|`@ZsZ_OAV8;BhFW_A?+~ zh{u!y(9{(m)C6hE=29zJ3Z!WUyOs3rk{yoHa(f0aijd{3&j8?x64g;#bPR4O3m{!)Y_Q5_m z{psD*Q11df2kPN&ZE`m@sYcVelXcy#_3VIhlXr5bgvi8rzaj5OYsRv6j&ad$%6Z-{ zK|&~K^K)r@D7sHCbgC;_XeqU3r6g>ui5uL zRoeDm#@#-0;7>sC*!yuWbkCJ`mv?vjc-`CiGJz*r%WcUZWTapvkg6k;Fo29eocX24 z0AyVqk;GvB`1|pZOaBn(XWuhGEOq3)e>EloLE)qU1%kEKJ^bs}eg^l}-vEn+vOz`` zMh&0}B^OuaF|By!I;mr)?*Krr#W;o>pN=I@`{vh1;Y)TszlYesP$7Syb^j$}2l0tS zG&I7evOoEgg@S}2K9*+{=wJQ3`FJ1j-1$D2L^8pPd#X!URyW?U|Jz^u80wlO0_ej7 zR0CmR5kMc>B7i=4|BPxbM*w{vY)AmT^RvBP9|oYGQ~*8rL)HZCmW8#1wC#1s+YO{! z?XCdE6{lo??Y8~l*rnTO1$T{9cR$PtrW#GmpZN|n8#9m*$qWaUp>>}ZRO>*q%=Alz%G1IZ4bvlp{pO00W# z-R`m0eT|z7Ux6CM;=A9(X1b1*jeA&HzlqKEI_@sL39zjN$Ah*xn7Vv<{yftCdgpr- zPWr}OE6BINf$E0PoK+a3Xfz2)Ltzq>=K3T_8BHjBG6Z-&s<>v{$@N&jU&f!qZ9m&1 zfIfKUx3>Vg3l(-B5BG|JM>=0796)!mE_t@I2WtJgtit}i-rq9;HUlF8MDg^+AHrXI z{HKtZW~qJ*9f??JN9k#~E|8ByEP&S+|1Ey+#xJ04H(`}vC@}y1+R8yP($z7_LGuzu zwv%}s0rdLuzw7xO0rZ_e^B(&J3xaA2R)!GgvH4GZ_pjj8%v|3aNdVx57eIOy;*Wq5 zNcG+OFS_HUT0hamM=r^Ms}$jOQg@Ru?tO4bwLsLk65>G}%kF@%Zixlfoh1_e^)=dnj| z_Sig5%$}<-oQDq_d7Bwg){&+G#s}}{_wscs``|>o7^_vVd$+T@_%5!kqe)cPHg)aG z69Z|s$V&~taB+q;K?CNEX_9{QC0ICu1 z+i|QvZrW6@J|Uukf`e-8THOpE#hlx2{wOA(&Soi(>D886B2}mc0z-GePNH5P-G$uW zxbwSsbLk8C?#KQPo}2rq7al8gx~rSYQu5Xzr#U#AuDyMcucOnMH;LQaE;jCq;;S37 zj?caRkMY{Of07d?O*!8wh3N{5Tv|=3f=3MGyG!{ikHgjLc|tJ{&6;Lz%!L5K3U6SZdwGshPR{?lWhg6IAmaBL2p`FWP_c^`Gf` zfn>}YSEFa3V_*P%lndz419_JW)4Jyw_PF_|nCN=}pqp`rC_@71eL*ALTW2x~0DbtS zY#a&L2(LB40QxwR?#^*g2cXyan7VtYzE_ZV34$)I*Px-O+#?;UV>%ZsnIL&$Ta5Nr z3dyFBwt@DBmi(V%!V)Au`UqtxXJATPaO%PCT!KOheQ;3bitw>QELWJ9h8?r{iMbD= znM`B;{F9hUj^p98--c!~i;HKT$~Ck*XG>(~M2i+}7+FZ8J%U~QD8VvUz-$VQ7F^@l?@vb2g4WRF0 z?B>_eDsgA0Z8%B*{ctnT9cG|PPP&B+NGv}3fq#r|Klix1Z#;5GR zyY=b5jTZs*JsQX(0?>PbU^{ESpk(@J5JvkV+LzdAK*kTfhzBg6D`0&W0FBOok_I;c)a zz-nsNs%iosmPx8KPMN7kJ=V(M8R(M^pdT1rdZn>QY7EjohnabIFaHCaYCKZPU$`XeCjKXx5Q_dza-(j&_nfF- z-pH-wknZxny{j=w}P4&3dVHzJgw&Q6> z+fUSKMpnRduMr-WAtEXU*TGUAgs4CL7K-vk~Eke6xq3sklOY+aD zWL4msGheumK}@dRA#8qacQ2vVgfD8T3Z@2B6v`Gv86KbeE}S`b0q2fChPhKuVY)ek zOBbKZWxUu*mHrp#$Sh|jt_1jq9xBxiND}uhe*G>m{ zUu-=vum10ZtxXGT0z^|-1pskAdTJIhhS6v;8q+|dDPZG1!_x4DpGpr(00NU<6(+3F z1fXVvH7Bv@t#WzDm?k7c#=?e zNI_U`-@%{X_#|Gv`&&>}G^FVy(nLXq{O98`aHN;OSbTkq^H%{22(d4h;Z9pR{Cj{R zqHrv9^^=~|N5r3b`KR>S$}8x%w;UPhySV>d-Sp@g=(}&fVZJ#s&SsB(UtQBlMNRVZUYzxRzf=C#n z0+2w(I2jhQ5D^eHkh55{2{ozHW(52Ga-g}0fDHTZPQV~sJaY-tjnjDI;r!mzy?iWibfmGFkoIP8)#4-t*!bByYE9kQ$0yfd2McaK`6;9+-UITl-Rh7J| z6v-7T7RHL?iT@{sqNi1j;CGkb#74G?n+vaCJzc@V{nxO#@;WwKTa{wJ06?5UC2_t_ z7{ua1^#mdSGw09XWM9aiI+FZJ^0>k%np1>EgJ7moG#UoYDFZfTo%QfAbrLVz)&0<2 z7hc;<@_W>afcC$^?T@g>BB8@Y<)i9<*{3XE6b$t8SaLBW?cMyE020n90ouH7M*eT{ zq#1T{h?GG!15tvenZfgOAI1A0{wQYn7>J7X$`zZJd>uFl>u=rMB40<4I*ODpwHEN= z%}?W%yT1!)>i$Lz-#(65Bw_Pmn?8yR^uy0UALf1{1ATk5(0mLPZDw%g~|J5l>>X<3wZR*dvWr_Lzp}LBnp;D0F1oPg!lqIjDnr$ih%}cAavE1@P(IZi)M0B zs4p)DRI0dM@z-%7jutIiue3b`@LXGrv|5bK7ceHc%}00!JJ-jEL_s1Z@l3)(ii${a z?(}7xC&FXrpY@+{AURlYku!aB?=HVoer!4tfU}v zr-X`ANUrFqio4GsttFPQwE?sUP)+jtVM9n7z|=I*oB~V&G^QGUlUYlNb_tBvGV8oE zMu>7-`PQk0KL&ob2YXA(VcoBz-7?A(8XDRTlKzm_TE;B-N`hLKx4!uvL#5`9eNL$fv0j(_{Z41(M>UpnWEEaz&F&c9j z7*l{lL8=8U00xiEKZ|q69>J;Ei@0?0S)8AJ1gDPAxuDb&WfZ;j@e3|ZzoY$CX6B%6 z9yc_jMT<6^gDyMFZhy3W99GD_R2b>rR})diSNhYf_1~fH6{0G?yUfB(1V z+`RJ=Hro$y>;4;fcljDx>9Pk*$ro4?zqnUxXegBnMt85jZnLx+cQ>a9jcG;FuxL&@ z=DL%X)zWjLrXl+;?y*SdxNfXIzUcMZ7}M)R?%3wn zJ~Plq-Iiqrda>bEEFh#omP7$&zlvC>GMZ)v?>YYi_|8ZEbDVC@c~5*WWVO2QO&k=b z4S;}aOMi?n-To}zdGHEUtt*yo-Dz88>!i&z1yLg}!mVm^iOXJn6&dJ}fxg{!A_IMZ z_{{>!>I#V>gHQuAW(xn^hkmm^1HJ2&t1e>LvTcvWM+Qc;Xh$X=j|`t^9SdWxfS_}% zI8ei_7b1c*O<^|^WG(f8xdN6ut{V~-%Jpyy5J!t*b0O%?zbj}A3ND;^59ZH5i8IIM zae3}poSA(br;eZNC_*Gf!7M6Xr<&wEXJFO@W!r)0g;g2sz1orJ08~ke7A@KYJLtmq zQl4ycAOBQ-Pw>ZuG*tymr_w2!?GjZIaM<7sz7(FD;|s(Q2xn#=#+liNap|FF3f8(B zw6b+9+`op!<=3&iehZ6B*Kqg#TUbw*^Y0EU#%i(kDQmw7WtE*ZM%uD-uVrDeevJmu@leY+b{euo;vekB&ON5$vJ6YdKXC%78@H6 z@XFF};I+ly#`4x}C^Y~Om<-fru$1IAqQX{PsP&|SnC!^#VFa(GzMz*Zd!cU zL)6{L)_4LhhlO^Gg}q>xgzwCYrAf8*G^w1}agrqdC_ZbKZ{mu6p=Sg7Y`t*e%8UdgIxql653TdPdj5kekHBLc2QuKd%g~WN#?nvyn3$uQA0b^*)#^R& zx5jxnKd8x7b%cG@seeA~MpwxFE}#28Jazi}arxZ$Vw#Q@xKO8$?0|!+CrG((Mp-$n zU-sW9NIcy+R`psd?c2Ea?w{c6i@%Gztye)}YR7PBmqCl9DvimX4?8~V@Q+f?ws$AA zc%*)1PzHCW!o#p@c31!IvVZoDflfoMpZUojp<1Pkac`1^G0KV@uW)0Q@n3z!^^C=@rvCZtn25-_7h8$|#_z96O7%yxd! z0A%xJ&N283UBRM4d^oPpP?D0bC8%buun!fiaBG2d-7(7T8X;{LQY!AVQYx6~q+FPb z;KB;PY;vg}_udqN{m8<2;^FVasbdf0;WJNR?(9=|V($GQBtHK2Kt}BSXwjlYJG3^{ zn8KyGXK`unS+B?L)`+!@dstb!iMQ^)g!`+DSXliQ7MI=#dR!nC7-4@jSA8+mzzz&~ zgN48VFb)SG#m1^)Yt1v+VZf}InkG!mD3ZWbpK^(o3PY$Uc&dT0pC=fuaGr|#q(l8x zeWEA|8#Hgcl4d;dyT{>E%s+;<$k#6FAx+$PswLJOocvoz@y5~@aBb<|!@N$obpEg6 zk>l^frBffo`PnBsq~wx3Tb6!ojnPk_kk zSI5FY-HqisjCHR^>pwsyST{^!7she32hVY2jKoQupeW#@%AV!mYbda~au=$8u}ECi z8`S8V!-A-R_NGO;sYo{s+ASx;l8HM7L_XjY5fG^_3`$;l#oZ4BASEZK>x*XwJYlMF z0vFG{2bbrb!Rgs~JaYC5=FUD{EyP(i21FT5K_4*!4$-1Ti*_iNG&KA=4$nAu82QO# z=W+7bSv+##c@PDbpkVRcx3IEx8w<;?;l}M(u(Y{=l?MwT7Kj>uop36u&{x-RDw2&q zapiSAMXE@4hC?AyRxChMmQM5U$0NQXTg$Q`_-sfGSx4 zS~MFc@c8lX!ntEt@W|=sac<^GOq&x0S;%ir(zc_wQ_9TyUGj1>a2ul_cfG~6*YWP= z8@Rji4cuG1hMTKj=}5s8Oa?-Lutc)v5%aSVmppj=Mnr%i$AV`8G=oYLN;Cb}7j@MO zBuKabDu49GXY_M7Kjp!Y{VgIIn3WY;KkEo2NREbtOTQw3!?od{Ar|jj*cByQh6|5J zxgbmi)H$AojyjL`?bXpuCP1{i$gqT?Rn{32jGv#Nx^|+*o)S_cv~0ap@Wsm#t(cxwa6`a`iW62^98pFNrdMlB71u4* z03kDWkZOO!G1~Td#v$QyxG;Mj>-dln-_MAL%TVKBT!2jVg$W^ebmYF{DIQvm+(+p7 zNx@oZsk^$Q3^ss>E%^$@OmYfmW*)=onM*j{xPVjB7jb<0JV>T+a{2;JOg&UD$)XIU z3=7L&cV(JbaC_+`w3)HI{wD6XZ{gnR>wsa12#i0qYyCxnT$rks3R`mR42lvid+!H# z>Q{Cm;WCN-V=pCKMp1lqza(5NwA5Cn^xY}``eQ$Vk6iijeiAP3;Gy5JQ&nO$p9GOD z1&;d}V08~54Wc!>93bJi)lss}b{bl%Y2Y^ORlq79Z8{jidE7$Z(R|qJfLX0S0v>`E zAJkL|ZkFacIaUP0vE|ZDSKza~1*BUHn-NF|YdM$z?>per;_fDQE9&R1TmHXmOu@Z2wNM##u{P8gDac>)3b_3lQ1;{G@1gKkT5cc zn(ny2PuvO}aIO^7KC}T7Mh}?p6ex){>UkP1+6ZwA702if(v51s>?9&HA+Yzg;(hX3 zx{M83!8;GWmgg@3{ApRq0bP}0=zA+V}2{s_FPVs`2j=FUEaOBbKP!>6Cd#WPRh?D31G zDn8vuCAHHB5W6?$th)?ENiO-~%%GEv7%f_~XweR{`Sqi+p7?dHx)A!eYp#V3W-n=0 zTqk_yv5U{*F+2<4hkQ%`+`WGd@2q?a%j>ss{mx6cz4T4A(=E?>B)EKqf< zb(e%0S7$^8nhG|S3$`b-qB#XLXBEvU@p|eef5sraMqa#^4(krF(!S)CM+rRNyY`K7 z*ufeYqh+6udz=|!SPQ5TN3M||3#l;VFl;BIK=~Tr-vSWjdgc;}Gkc&{nkclmX!wN{)|u8>nvli~<4V7-QV0-~&tBeR69O<-%YC{AY@gho>_JqyoL zS1{Aaj=t-pL_Q_dF0vC3UamX=!^Vwa-Tv>Djt zp`^%xZ-gW3jy<7J%%6E0^XIPM;;HxI^2HBe{_GQB*{Cu0$LT`|++F*is_R-X0x3TV zS^k{l0dZcG%?IRE`h2u#(V|5=jO!cxrYdTDJ$J;qUSg%AUPb`U%Q3NAhfvz&g+IC* zK9}U!bcICX3e?|I}y_^^NP;{9v5yYwyGT6qI^?|%a~Zhr-8tYem78fQ-bcfBC#bLXLuPipc@#IYFqjey}n!QW)Z{`6O{# zMT>R-%-7dsC)=c26quI*>U)x_R_p|6iHH=6pZnt^Ox-J~m0@Qi!vKF-K$l=CsxKGCZ784z3C{w4OKg{^y z9ew-GKeM~`?r#4<5z$zEG*r?;_~abzW8MZpM(5qH22;hCxad_(4g_rxGBO) z+vg#2;0ad!BH!}38E;$5t|Iu+^zW`eUjjAD<8@S<2Yu(jeisof<+;0U%euKfZf@mn z@;(`||LXJH{q4VT6%Q5vT&yD+U!}2LzSr?@B=Elam%6^$DLzv9{66}NUcPes_8U!+ z?{OCq?d+4f0=LC`TujwyH1IRu``he_A81y0-6V{n7hZr-R~8=aKYRdUcg!U+0HQ^U zcI5Kn9W5Xs&-x-9Q- zybPQdz&p8H0C^G5pdGA3$4Akk?d$ZU{V7&^6my|y(V{$EWmFtmuf?T6(c;cv#i2-X zcP;Mj#ogTOmR~c&(0RLCyTcx`Dco|PC~zQ@jQQZKoMc4k&O6$H!A7B)1scQ8j(r0M(L-KbZEW4ZQu zTbWKRb@K>WtE&yTZ1~Z8_QG<8{^rf(DB$)?$N>wR%UZynM=0_l(d^Ode=hET4aP5} zVS_~>-(~vPLquQM9vd>hc)75u-xt%y^mX4p-skFsGo&FCx!lwBYa4FQ{MRdM_Le&z zEBrKWI9WM5{5tuRn5p1=-H7aZijf0Wo{k{Pl}A|@76TvSsqDsQV!u6NZ9llD4Hlpq zCO8vy85@Mh8o%86_Q5buL9@9R4v5rH8{4iS-|9VnPmgJ>I*~TXjYE^e?eIIAXX1hU zYnpf5Ll+?4@ovdy-}~ox(&=wxisa-BJ~Z%C`tAYa^JP|c^j(EHo{wF3*9_=_7q&|q z@@_!veqvC4*_a%H|HjccSjIpL;n|!sP2`s;I)7|f>|i6HREpt68;)Xggu7i?B^9uc zLb`5Jzkpc55TJ3t`}=`6NqAm3!I^Mka?Qb1KKFN;4dKvQ%UG--|2uD`j(epDXZsXI z)d{dUi1>eAmmfo?=~8RscCOz?;HKB#J9^@7y-lZ~=|}JzYCn`oBegl-eQ$*{>*>ON z;1&j3RB#63mpMYrGV&}N92Gi{gR}B2;&b>w4r?W<0e8}po}d>Id5!wxv=aQ((8R|S zpXe>vf@DoR30W^ih+8FKoD`sFEdEtvz>TUePZYwZ-J%yf1=H21fI2jWoI2S_W%bvC zn;5Gd@B=}2`L~&8Tl=DAr0nDqiYgE?=^9}VFBC|BsL#kXa7UqH)=4!jA0^EQ(-yfrMaG^ojumM2Dw*I8_3Q z*55cOU6ZXSdKh4#66PsKUU`jMf*euiD4y3Gkcs}hIl=x33YNhgO8JJh)zUYL1jp?F zRRVM0^7*g~#BqZp9>w8Hx40aOZR3aYmc9CF`bX1UR%(bXh{dh zgh72IOJhBP1S1?5jgnM4-jVYs4D{OeuHLS^DHt6f%T9uBXV*O4~u-yKSoH` zzZGhC2R$QGMu7L9#}@8&Qmv1%9fXjz}tZ(cuv|G834R}4wF##DI<7Gaorl*CSw=gGx1JlO}-j8uRBzbxqQn<0WJIa{BpA7Gq+KZR0$ZI3H?@u=`s zW5{m4kp%zQPH(}Tkq6=D6 zXI5r>WOb5dVK;`{#XUavjm$6fm`S%rLN19Swkb6J{(k*G_O)u)h2^7EKdk{-?xyb3 z*7o$7|LW=@q|EYQv^ptj4B`0j!zEh0a70}bKeQ@zcK|O2CqDSQjxy%WpDWOnme;^q zfU0l-%Z2kB5aUrIsM;t6EHHkz1~(xGmXR9LY5paOD%Tfe zH7?qD$EHnOU25sL7o!1IlfrIQKfOonK_t)M(&4W~2>9_%w=rKK6p39Oxsn5n-B=iUA_c%44u&gAibX6w#{y^u#ikr>CiKU^KscP6%q+@ z2cW;O8a)3DLC`Z-Z)BCh;*uXCUI59Vn%;zvLc&fUV9=mG!@!anv0&#d8tPMT5$55G zbES6YoK-QXCE3fPsY)pzUBZYV!wdgSC^tuS%gbb-?$Z(u#`*@Uiy)6v-c51!qeDNR zMQmgpUGQOF$E*go!6vqW-?(5@Z#4y;Y!=iTv|qNk_8}|yVpxL*#a!t;ZY1NiMX#`c zMB(n6!~&B@?50kt*Wt5K$!O(}6uaU^RCPO-m4^Q9DBFOy5QF=>Y8EQl*e5^MKqu;x zNINKhG3%h}hC#_iyhfXV%&Gw~X+fxaiM(_?s3hv)^6v3D7G4&RuTJ{Atq%7)Au<2E z=%>qbds8u%HD>V=ziZ{26kICt|HZ4tF8gnvfaj{!ED}1%BQ9H+kJFl}9&foG{)u$EzO#_j5w$~|@FJz0@n+K3fNCkL7_a4;M?KUji8NA>PY@=DKE1)zj1A&*Df4{Lfu zVEH?fsO*)%(t4dIy%T5-Jz)IUAYoXM_s7R{;v>cWNW?u91BN3F-8smsSrD-fh@kB^ zSi;yufcr-}hHA?H7mxft({2~!^OnT2d&OGNJc})72&#&N*v*lkC^BmQ3%5ZY`v=b4 zrhV=kYr*Q|mH^gAVV8006H1HJT1oE_^X= ziGygl_FZcrYD3>Z{Wuoaus{xwpjk+v9808$Cl&h%fKciUa!1E)H-lrFW#gM&pH=mk z^leVp)SRDRSJnOd^8jahmTz4(IUVHl23m8fY>qgoY7IK6Y7aZ9>I_OReVnX?jTiS| zirwV`e>xC#1*~6cb=p&~6o1Wn*!mv4uDw(~vltY)WbfL&A`0+c@#*nBV%cSTKu%;~ z1Zi~YMNY!}5+;rM`HokDKM^H-lW$KruP!y+Q$fB_U3QNTM*geyRuG6zK zc6}B%fL^g{6VnuKPVR4!a#Vf{n30d%lMaMK4w?KWA)~GNTo^>NaYM>Bd5Obc_9fC~ zaGD==L5{O+{K4_nt&RO<)Nj!w*-t=T(D5#q!wZd9Ci)R0YRVvzO;jz7cNN!bN#B%{ zeqqjF86W#TIG)MEHw%F^OV6DtLs^(DB_W^MNbTeMZiFQxSMy4nAE(btQU{?Ol(pf5 zyg6`#K0lv*ZXW8Dqp&qjbr&*_HRsy2I8>$wY}OvcOjdhKf??)!r3X2UE00AOCYBw* zU3U4NK}JDKmD$;CWkm-tirh2eMd}C3{HF!TB|iy&*BN6|H_BafA?f4Q<|}4!IW^U& zU(Y+|K5Xq&q&74%%5_^%)jhMFW0|5PIj0v$Swkntg83vyAF4O95G*r>h?B}%D+86{ zZ;~sFfM|k8F06JdG>f}K33`&Q?`ex`&mpL64_n=EB9ZvGskkA9UL%+5rqRut?Wyuo z&|__ZSGM`ryoAMeBJFF@i#o_ab@HMLwc$TAS5E_bP415s)DPPu)b4kGKwrJKQRs1v zq)BtBG{SQ%GDtmev1ik6=Pby{gAK;V5od3h*^LV=brve%amK174j`B_8ra1_bJqz7u>_MgR(05 zliIcu`SR6@BUmC!5sw z|HdRsH4n_~Qg&i&YO?skWJ_?N9ayQ`Uq3;UP;B-0Wc8LScE`jK)QO!AYElz2ho zg|sYcDhjzM_Fo2jmOUMv5FfOoK2zB68TNHW8->`KWx;>6sx63Ob%N}$y|Sce``sSE ze^xz$Gj;NvEr~qWu2f>l7HdkR!ey>%fBNKLoxd_#UoebSJ#$pUdCm~V8NvIJ!Y`iG zEY4T8x5iirjj1=gxSzQbZaAVS^_C7}U7S)dpit+EXp7 z*=eA|OZ_DkvmYt|871_Op+@}@VQv5*M^RXC__t%tM-SV>RJEGGXwT+SEfUEKgSqCccEezwNJ zoQzE5h;D&3bS0iS>fVsGYazguYl$;9Cgnc&Xal?XvZd!&_SF1GMlQW7AugY{$I}lY zzSy(8EbT5?Ba3Y|;uMVW=`Os2)iZNZ@dym^`2NXABQ5KLKq0`dE=pt6=1U*q zbo(37=5vGJt6U^B>`+wo)gL{wW;JOtk%P4>JL0rATu2ZyJKO_P72c?`{mxd~9gn3_ z)S1M8*5P*+wEBLGv=DZc($rF(>|&72VCEr7%dlqQ%poN!TdPtFe$*=)_FbqJTiZ~I zs?e^us;`}_*j$>nSyz3n$t^>%k1t*uWz?k}J-A2i1XNQqfXDaCMz^NM3(=p!@l&hy4aM7%q%<6q!( z$aJhR#|;tuq;8Ztp*ym^_zrN>d&fZ!!aUI1YT@jhWUJzz)Hc`a)}W9SCRW8_hqe^E zaF*L`Wf^O>-;kW-f=ET3aex*oX~powDn^= zUXxg*U7Bry<3I;4uGUYA#;Shvv;AuR9_tchTbZH_VOqb*+K+ft5GU<8PS3V=w14F4 zZJgwj*gtS3G>ezXFLs-^Dg>8;2I6hlS+6W2LyJV%6&fDb(3a-%`Ala0S^UF{D1E#| zpmb>HgXPT;eN+2$-c4q5{AP)j!~B0@gF*BfHZ_xpz?kE6LJ_qPVSI!{aV5p{brM0{4#_;@sxh|ZnSl_D?` z+in+HVK&45mHxGQ@K#opuqiSiGxxXP0-Kr5b_hS>w`&?+AV~K4H_OIlwkb>v5M)HK zvXnNw-H$or`h~I5ciY21O zuK)Zu8-daG%qDyOLCbznnp*6NCh>qW+Na^*Sv$>W2R#7%FDYg;sEYUi#3o%3+4VQ881 z2Q4>;&}$C2kPj^G)>o$4UT4<4PA?~!8s5Y;wDIgJut>s~l%$fs3XN!lQ%vcZ@W;%H z6Y59C%bA_J!Kwj34eO6$SV@GIcw*1;#rrn*^WN?A3qQTEpW8c+G((K5dCS{`|?+hgy+Xi!#~Ymc0pj}ERz_TwE<9cPbFl4O!R zzG}z^P?`ys${_%jNv7VA*-%r5t#2_Ke+K zHtuiA8`V7a8>+5GOQ}8X=LO7KT(Uz4c?Gef$G-*k6SAvusni?X3HJ_AiUqQ;*e`;ESMcd-+fxqbgG{Br7E%IIqY)*-lknfj|zK z?0utvjJbQc#_oN3-Zg2n_y%i6aH9*dArj9CM-yJT(-}ZFhWy@x63){rA?RfRb#f~G)0(&UGE-K*MB~jX zIb&Nm{~T5-0R>0zlaegV*lunZL<(YR%J%6`e>r1UL^d)+L^B3#eE5f9A_3s*1>ZvD zCaX@=9%5p{nhaJU#ezp0U$ERtw8B69ZY3sC_Mp0+~(wk&a*MlcFv+V&JNa&ZDs^AkxLikSgn<1EX_-03v62=4#QpTd9X9tlChD-`t z`DUX0a)@uF2+YM zySHezMX=ttCLZbV7u+>ds-H${%aB-%R}K$P!xVv?w=m8$b=?aVb2KUBJpC`>NsP%X zCGds-fLXWJmvB)*HsaH*L^f zzI%d62O2DbO_*K%INfZE!RLiXGW~)*4~tPy$hAw@e%1DnE&m|A9si(}QwaEfO(ki6 z!UeX!p)l%d^%SaB-i)sle+a@&OJEP#8wlPLqm+d;+mAlNGrsps8E?o>G&|dr#@>P>d{SXVXsZq> z@GY)wz~6dYut~nFV>MGrG`JnpvlFZurJ=D;0eeB3*Y&Qb776Hn=$R z5@fbUm)y0|WmO3_unEiVZ7DZqXUgdMRh?7oct*l4?;JPSV{-EiMZ438#;b5p;cn@iRvi$$6n7OX7PxIrK2lhO zVGpiwtQhKqj(u&+x;|Uz<<9m~r|Mfpi8 z4-cfgZ&h>UGayPFQ97gg;Mg*hv+qJ}miY49hYZB4-ap(&XyU_Jf0#ha^Nn=g#BY+g zC(sV-!oi4j3ad`-r~(UzqT8onNfkGi9a?6;Jp1nI{_g>X<(U>zR z>QrZ0ZOr{ow`KBtd)SoI{tvX@Pxy;RvB`?et@K5b-BKLCxTeYW_|@Q+RGtdnQ$6JE z8CD9D!O@W5Jxb%NLKYs*f!hG8IwZuj_;iB^!wl+VR5<*_Uk(lU`MH*wl$w?=+T@MK z5;rcX^LeXh;NLX~Afu5Cl7Q$(jrNSLF*UG3W>QRFH`@M^n&?w~HT8 z*bS{O6k5YOgyoFkuolFLHCvz1=ogO>YdB#O^N`6FxFU*3(Z_iCm;nlL@vP;HkK{Dk zOkgk!P*8e#P&dYb0+*n#^_Q`Z>WV6)?z{gh?1z?rTHuL`i+=s$^@*hQ$oz3iE@%HG zM7iA^TvEE9o$$UMb5<8JqbN^Np``Z$`c%kpGZ5*(EdvlfPt4 zl83{_t9eK-0E9*)%d3S-0iB?RLsuJloP{LhL7{45ptd;z4(({+hWY2`WtfTfJ^;oiHU!8zni3iR zTtvyi70T_?GFk>3bW}7-fZ3YcDvR$9@SUL?Bd}=Pi{7Sh^k0JnIR`6Pyh}T-nlNbZ zx2SiH$k_RX9q2t%(Sb2bry^h76B#8D5|Uz|98oZ__tv|2JdlNFQy5kj6JP>^WMW1t zCj9gQsQ)m6+e`S}RyA7B9$#&Iz1({coyuqo*hGYV_CdSek)!}=^V<J^gXK0MI z6u{D%%EgLoZBc}j>n`ux&OdbbroClP0fxQC~oAbm2G%`Z6G&RcW^H(j$()@&7n{nLyR^A`Yxhzrt!jCt0G z#rks7DJf2evb&@Lj|cBmptVcP9|X)T4JHFVxj()p68(cld=kaJl|+FuFWN|Cu+YiT z2YP;)=5Yd(sIh)o^ZNsl9q9RTpYmz+BE|AsY|6&z0ps-D1@rwNU8HG%5aAafs`K8z0x)2VpzETe*d2oI>R8yK5qRtIN(UQPzE~hpu zcZBqDLpT&8c)phCO!-rF?jF=X0D1ih?Rf=SGcYedoXP_pPgW3>%voi)8Rj;h4100& zo~tGf_V(CzbrR{YAVYYuY1zf)80rZPWO}ml&F>D)Vj55wXok^OZ({${T-*3rQgN#L z(^gr=N*-*z&o-tLtuJdMXE+c_Q?q98O#Q)uiVH?t@P6Q48|vi8mfL9B^rp4&!W@G zGUmoTJbCE|>c78uDF|K=5>TBy>IhzFlP%@CH2d?XI8qYe-O@7a_$c?daQ3PjGGm z+fc3Zgfc$%kbDO9k_aWZEQ&?KaMW?;OGV;u9;58)Yu!w|x2S0fr~!ki(!|hp7LG<@ z`Us4HUjjHcA76F#o0}4D3Xl=#KPf$+?9l%8aU!TC% zg{dbhO~I-@S64_MYoFXoY_%|dJ#`H$oGG^`e`17Ryw}rig@Xl93&-x2JJ9m&i7IS0{tEH_^_VPK+8L@oWl zAZFMmO+1Vy>58D(3 zH^*bk-*`VW^uXTUJxMI0AkQ;W%Lt<0d7`)ZpF=&l3XH+tu9M}$lbQ7TIRW1%5`qNq z>HS1bpU5rAlqwoiu0Q6%KxusV0{# zxGxtpN2mAN*#Ghyrw7e+r49x35ZwxQeh!R?Lm%z2IYgwXB3b{V8H#_|SW@N?<{kl} z^r61MLY7s8(V(d5UREAGPV~o<3n~b++rL45y%^`%Hy*!56NLT|dysdK0UU7pmxhQQ zc5vvJA4sMuDgz2p3BP*t2{?e5dilDBwWEMHe{Q<^Q1$+rM&VEPL4dF`Co5?bR3CnM zIjkBsnWZT37CIGa#$r$2%u<$Dnuf^wx2tx_!EL18^$47TlE$Z_P@q69yKfBANlfDH zd=U}WJuoysE@Z^2asA$Vbr?^}9K0nwfSYgf#KNb*J~ax+$d~Pcd|!QQIkXrotuFQP z1OnHSvZkVou&h<`eMKI(^#y)L3)h#Ts$z9X@lM$-IIg1qk0B;E&aOuS0U(yo_&8`l z2czQ)I=k%CsaJ*}nPEeNC>F3lk2nl-_6K=c$(L5RjA&9GwnHxC>^d*!UWY7F`}?oh zakE;(Xv%6S7>tY`AP1n@4=%xvjwvhgRxw`C_x~yQhgQTYQ-8)2?oAl8-N{2;>!%jD zbOV>99-Z$q7gyhp()GA9(RY7YBcl{RwWds4^>}F9B#@eT ze7{pkoDorKBedt10!5!KGnma;dS#5^@(tu?#R^<-O)?TlG=5E~bedd`$Q$bAVASE7 z<%mR8iuV^=Z_f;fIoFNhntf_zQ6lvDL2HnaIYtbIa z!vMyn0GE{_5|1w;@9~d=!h}uZG`(5i3i$6pDt0$IFxLKuhuITFnBR}Gi$^8m_5-`C z{pEuP1%-EPFd27I%fL~>L?#Qzh&0~u4-IaR5kL81NDZZ2$LyERTt_OYC>s+Dmu^~L z7$ON(NR&s?u(+a`$Y*FCJJaZ(GgR`-d+lqZ-g&fh*GiCM{S3rua9kC%`wV+aU!Iaa zhIA#PBj-vL>=1G2HFD!?-eyPW-pDuxK?PXY87GKmXNwOGG0Et9iqJRowIZuZ+o3Uz zt|5Ncm&m~XpXU+|l`cUOVR(W(+3fF3o352X>!bQRQM}JjobLPcc9*>;n>#zlM&`DR z(12VxjNtvxnI0l!2siM-=|K!;2R}rk%XLl~xhvDd|K#cKG`RK3;uYB+7H1Dx5uL}q zSvMANa+OE{gnp4fjm;wuKoBPdbqRr+SA; zQBj9Ma%()m1qm}zWHt?M1``~NFD(1N@Lyu!-w|G0(RU>lvh^nQ8Ta$KrqsT0wC#) zAHBDBX0XV*Z-oZ~`h>ZY(S=FrDkZw-xWO#=io2x+jVlsv!KJd>^T6r%Vkg6Qre%2I z0Ymb^_>L*JwP)`OmPu{~G3OX``N5(Z)uFFM%rG$)q0$DHdjLZE8~{l@-q499_iLB?riU-+OM)@pAoYz$y!Z=-b913eVHEd`q#C$p5Yv3#EqK>bKHZKz< z53M3!?J@B`WiOZf`ib%qFPT0Bo9N6#EAQ8pii;QKrp}u_dQQKH1HD({Y>zWk_w#u> z^h9K3if{uf(&=s-Iczos27a`LpK~gE0#I(jQ`!q=5xa7;ji(LiSZ^yDz z2jADzbYa%h-?p+3CoAnhBFIE$EVTFXR5ohMZ=pRq*Wit!;C;4|85i)wBt}J?C7N(E z*fStw<7FnjLl^TKA`}~RpQZtki_XP!xl$>w6o;l)gWhFM6dOD$hV!nwS?{gTuxrS+ zOAeq&qYCTHMe;-3KS(ecToG3KXEi}sWXhG*D~Y&Kd9}uvQFp7dAZM$RfWK#S1q0Z5 zkJ9;S-Zk>`AUlW@+<(f}mjF=V*yw)96tFp5MO1deyMd2M_lW-z)#A^)7Qu#=Wn=2+ zp0j92pn$(SgV|oewMy&}Su@yM+3toeGD4F%AtoBlG{#a_j=W7yCZ>v*x1^NnlPWsr zka<<>Ej0BhFT`Pe`{%<5$+KMmw(y4{!429>3aOXh0-VwRtIcEUHe=o^m1Dn^OUOWL zLzW_(Y3-lTrWQZqySN@hxDmZ#xe>o&MUB~A2Bmfl>@s;L-^dg*XS8&arfIwoVgy!9 zYuQ%2D^=GIj0^YvZ9fo%v&?{qJHIk#u%2D5=AqEoXj_2o({Z4L{`+d^J3L3g>LZ%7 zKL{Zdqp+tSj(jLq%!9BKnHR%2mtbje905`kHo-ry#3F|?8TA*G6^o%Xf?;$>qI&$m z(%CTcCyL>Zr;RqxzKa90vjMRKHuoSsKZ4ugbsFKIXo`BpHI}k%Vcokr+c1s#lzV*! zV}g9X`3`-v6bJ@@KYpRdyHyAbi-zZ{Mc%jq(I2MGcS-=Xj4-iRtr(@8$i_ZKYdPM3 zNRlwMxLNe%S4yu?lp2BDMJTgeg40c<9Y%;hd55@~Xzzd{PH& z^X*FTuO(V7s`nY^o@ktTTY()63<;2%tl%3dDjz&P*#W-ljB_w_wW?$r2GzSZu@MBc zJun+;%oWJU!3+T!b>mgW`>N`N!*7q` zoxrW*fVvyGX!)v@o<`Hckm^vYx20~dl*Ej_Go{v((I7>1ng*9DfWCosq(n0DeNBd| zX^n-l9=4FQ0nuls@21+8r?z?V72ABp1)m9X$U&SlB@Hj7-u-rZQdbn3?$ht0jgs;o4^Il}l`z-9?3iSnp39Oa9Xusuox$Jj~2m>1De`BKvj#hy! z>>0hrFQY@uv|{DVVRqvp%d#PFakCo70VFrn?{nzXp1Y~?RM`^P&GqhAN1VGhl0|dj zof6|DyG0RiM~G(W@|a%#c>PZcp#CYZ1GEh{KXYvf)>)K4gTT4te5bVCzV;grDo3_G z-sJfq@8o%UE_KnW)wFA(zh<-zqmU-|ydZ;+g~Mr|zVP+Z{?$^Mzvi9)zk$4aidcvt zMG@(LC2*q*@4k75di6#?yz_Fc?G1X|+#5;t3#-G?qX5&r&kX%gLWybNU%oUq|ETeX z#8*}x*EbudHv!}Y>_d5A2?_5VsD&Bmy%MlNHJ{P-U2@X?#WwEUMc}qCd*TmJAFk~Pq6;9x+(Ocv+RXEad!8gbr z7AKruntmA4XPvbX}&;Jj3gQ>&W&sA-4x~9ow=(>w7V>j=V_w(X668`sy_oOyk z_xSXq$A?Z*8kTc6UfXPc{0a8m(-EqwE*NupnhCHpV$3N?%nlS!Lj@@eMJ9A}*RmJu z`YlPlKI-7-4-}U37NqjKl}s=MHN?!$J^S%@b1FU6!Aq=7c z%b!uOie<75EcAib9{Vdr@dgcS?mt9OGf%(pF|Z;UfOlM_RXg&7KWO-)FQ#CKk7kDb z1zsNFJI>3UBa<7xsRdScD<}KR9aFX{!?w{L3 zS$?UDM6Yu;Vo#8DD<9dhhQLp7>z7p-Lr#Mm6Iij~b zZi4zk%k+y{u8?2=z1Af*&LKwd@*uC<#wF?B^B3LE1fJ!xea}wl^|<76VQH)q!%Slq zr>MYt0>PPSd=d!>K4j2a_6t5A5PI5L%u%Ql79g@JZ>w+~J&}=m&F^*Xc{ad(YKTJ$ zcJ$cO8#3;FL?tchwe?06;pX6YS6NrHohx9L9FFMo5g0&32#usLzlowGNAG7$Y00H! zYi=>E-5+^J6rXL=Fqskb7!Cguqz+UDE;^M?t2M*B7rXB_@pONT#N!WRV#P~Wx4^>% z-rED;2>rKo{oSsYVfE&-)@P?Yh1DF(D>~9}s`5;n4c~S58`HgB%_({z05lev5TI0y z*P(61!If#lFY7h7WKZ}>ePJTp6d~2`p4txwNqAWG#vnJs|9&$d61n0tsqwMGc%=6$}TTiB~R`7Cu3ee zY0jQLu)E^bHLGI7-3l%ZQ~0#qsr4(5_e*}+Uc(a_ez;`tOJ6R1ymR?UfZFMH@UMe; zh;)qovU=~b=A%z$ufw`m6qIba1COD{TtIbeyhF3VcVhkbp04e+nV)E^;~3+t!MskT zA9OG#bFi=#Xm8*#_EBk-ofu>birX}?lcKP%mV*qaelBgy%u-d(RvuYixMEKNN|}DH z9u;&v4D*Y4Y3#i&w-ubQ)!57_zxSPd8n{`=8Ivhm_wA)wDOKgT6<^B=95_%ay|9E^ ze<*9ri@h4_9ei~o*qxKV5L3Bp^L19L3HY-qH`b$qW|?Yt_uPE2DD=f}8aYXPZvS+w zn_@nphG&8fK-V|jvCb2B_;8`(C_6N z|EB{*XwLOh9Y9Ls6eHrj)u?cDVEb&T$A4AKdo^Qsvvy@yTkA=N6RKr`p}s{fUfo@E z(|i0C0mb+{vimfz*_IOpHxy<(7l~+P!<&zvJe50LIhFKt1W-+91lgWGFEw& zxj~{GH*7vI23ban_ld^wRO1e$L7U5@#~Tv+{$c2>%WmccT& zwRfd9-W1R6^-yHIIP4Pl;NM7ND{)Yu9TwN-Y;t3WGSr~Ae@%9C1fSZc03`7A%Axc1 zw(4eK=O!FZR!a~X(?Toi3(OZ84Nv8k%M@lG&B0znW2==Z)|x~JGS4FGNXgJYEJpbn zN;%Y*8)engt2_i*a7(iTRvY`7PfxMCcgxwz+b;vk-uD{B@_E9vxjFj$A%Lsl6vT$m zq@@U{-!z<3?dV@8<@0`{X%!~cy7MzS@_VoLWeq9*Yu=%w*#(B+YvE?ws3Wn5Ph)GYbKfWduQLZVrYtc@sdQnNPYJG|Pmgww7pYtnWR?|1sg*EX{+ zFhxa(bU19b?fb7fjrIWjwdeDce;Dj8vT#jktZRho=_jENEFD%dQZMTbVRn02ppD+* zg_OrS^{&aLoL7_$u4j63L}BQnh!4R!w-b!8lkIr`snInu4X$!Y5f+(%!!#V>$lpc_ zZK`tHzOA+T51D4P1UJ5!!-BM`fV7sA2!7a7t7gDy(}>9}=KNFn;(5Z^ zcW(dE8A*dZLP86|t!x64$o!Uwvj6w@YDnZjMXDRDh>e2~T{GHw=)J2ZGF0Wta2PPz z((yT@^4;Hfj|f{}yzH0h8f(gaT+HmU4-^zOi-Z}*!ayv+v&J#l6CQmOAMD-kUK4_} zB%gu6_(8>J8(TwGO(G^}ryslfot5?Dwrm#KOhBiXkR8sSmNVL)pK4J7sM97U%? z2Z)5lOeyw%Lu;BI6tY9<2R?AOiBK+0v&<0*d8LjK(%dut!wz`$#p1|&U37S=6zET{UxOqCsBKh>jC-h`d8_zubHd~ zUJOCjSkqpV?eiJjexL(M_Q#^bsS(#Pklhahvtihh86FA$rLDWhERYbPLS*#^5y?a_*Tn^(L4f%T7 zoREM{KdIXB0kD39gp5dhFzn!pfEm&Nm(jrGIdSGszDK^!H}zl2s6{?}IJOaQ{KKp0x%qMr>Kx|X%AnTZ?*Z?#lTVTsKv3NY-@Yyey% zB`!|x5L~jJYuxkL*=azS^Nte->jE_K^-^gO?HOhk``rguSFe_V?^k-9Nm2$jE-?j* zYkfM#*bRbcIFtYV6|5+o$N)$TBgb!hDb^Re`_=;eEk#K$J)n0yVEYqFN?nwJ+*GuR z8MC#~XAAH}k7WC8=fSl+S~FDB!dYwuQR^88)|D^W7&uBsvY_#^U}U?^}teITkYJV3Dm#JD(iDsy+jyvg^3=(1rZRkf%4~pMMAiSCSYNOMm1K zakXIzYj{Q;drASP3!KNcoHv)ZC?3BAy8X(5!h{0_B#jwSO3!%flv-~N`{TXn0nXqB z)^H8pJp2z#u5=BNnT-Qk}(h8pB2F*Xp#X)HBI44_I zNIsG9r7F?0ioBR((Tp3xT#t*pQwW^W8EZcJ%_EpN3CPzA{VysFPe9mc`Ljtdf@t0J zA^=FRLf+%t=fb=h)RD8jhpBKqVNSf4u1*5|O%#K50fCH+EhxU)8&WORz>1sMXGw!A z9>Q8M@!nyQt1Hqj&0?%eDd=um98~gyzDF7gDx7B4|dEIElOqEe&T@ z=*YWIWwr-TV6pG*0O!M#@_V2F-y5#=1om(1U>*CoK=0n`B6h|s$rg8R<8#HWZnEmB ze)<8?cmToX^p0-G=?%w`jgj5f&g;fe5;wZ>Y_r&H2MP3gul=$!$Y-cJdx(N+%&VCp z-;4J)1HQ1b_EfL!djq6VPqX9OugRW<=z#N@|9A5Ig?9vvPHE0-_roj>gGavB(xC3W z8;OTfuXlK2t2d%fP;b|PHt>yLQpY>XfUF5G0|tFqkimZ2MuR(v#jm>O#ZYL5$_VnN zd7RJYS}E^Sl&51(haPpO(5a@KjLWv`JF$(@*_)*y@Z#>w1Cr0PT^g7bk!AnrmiZdu zIB&{XAfC;O6&)W}#vk$DcpadG5IxiID=wo&(It@Ox|&gOpC`kT-u|Lus2Q{n=JC`p z^tjK~)iY+t2Mg5$m0?n3L7P$Syr7}=z1E(_)V0TA+>6M0ZYb?fFsfre4A6uvNFK>W1~W+u>k@YvM+|maR5n&O?~X5L zDnoOZ7rer5JFE1Xjvc0a^jBlp1%7KB8e1w*X%BT1c#>gWn+7ecqDogKK(6+|5g!rw z$X9o7htOT`=CGvX%eLnP{Yx!Q6+C}_%R2xTxo_M#UA1a&fk4q;8!RH1)u;6ho_z9|=FoGWbu!L?wmM?s62wY{xoWzt~)83*_uTwNHZpqtu=0N$MMdI;Pf zMD+h43EceTwSPWH%i%_#vGC=Xhx*JA4Av6v-k#u5>y2vgFNQZ#MW!3%OQ!e_xSxKG z41uZO;*eqnEcJ&vte<(xT(Uae2UKUB^{&UGtu04< zQgmCmoAxZc;HafHW=yw3Eiv;T6q^7BG{^rtj^OedT1i=x(^O1y$6yz2JDlp}d3ZR> z+1t?eO)1uYhVy%v6WBdNs!Et4oyJOv7FGTctv05?4T&QUzt0r53@x1qNHZxK%7f4d zjrSs(=^ZrmJByFuEbXm54>DilBeJLCGxAHVYN{gpsUC-b^&H_W;2e(&*P%5Hu2v=H z(pwc+9vHKoUgzEReX1}hY7!sj|E)_iJB+ZfBLs^m@B<7z+@TE3tg_qUd=uN^_`B( zH``!;1e#8t@Ztb>w?2nI1pZew-_Ko>OrZK$J7=@__gZJh;&z!KHtBegaO!)JfNvFH zDRf@iJ#NT!!3Q7KGscr4Fa+Y$QDZP>EA4+Q94DESEJkSnbaI=peDp*gHC1sfZ9#!9 zzyfx7ODu3sbQeW6Qf+fj-mfTDZJs4LI4DE%anPtoXZ674y>g&EZnZ7r&cH~m@FYDR zp^~Wmhp4EP@9d%|^$3(?g4^jdiiLU6T6)BhV$mm6o&pyw#~=9}hYs9N72aU|o<9d&a}Zq&7j)NI6U9L}qD z{n_!L%s>k7U(^yrX4L2ERoHxn?YvCaKLB^4VwX#y!vidcW%+PR{LOT@7kB1lP~^K7 zavMGyOweSi_co;1RqMY%!_`Jqy0m$PqxI-#anjpDQinFWh##r}fjC}> zOwTH<=k{9bKa?x#B=7lSJ|8?rD%DQ{_>cATOv_I735 zE^x2?f2w5H4ziSfSC|JP&lGfk^us#z=-?nnW)UnqNg3Y`cUt~KQ>j83rg%B$;ND-q z+i5~&6w<86?Lq&jJg;AI-uT|PpWlNAikgful-LwS5O7CVB5UtQv0^kenuXIe<6XV= zA~ieN!~)flu`U|-58&7Bw0^FjMlL* zLke)%B8dkG3>5_#{PR0g{1COUV3z**wtAzv7zwh$P~9AU+9A<@mt;8o-WjsA7$;k7 zUk!Gia~{r@ip7POdRdEMr^zBN>#a}{YZ8f$T7m9GZlIm6-QPete)09euKh;KRXh7! zyX|^VZVOt9BK6??LfLul)E5G>YBk$ab7(c z@`F$LW9yNuPC3(@I+UXtI|D?q{f5av_>F;3fz&d#7+oy15WrZxB$l)pMkXqCA)*zW zhi4r2@ZzBw8trx;mH`CK$(;O?r=RkKB(^D*oWnYBweFEQsWB`!$(v%V$GYVbuAT5I zP8!bvB-pCmE*HHm22E{jxwXH3IGCcBt#33~trFCKl5=OL+P>f&Yob)@5}A|+O&dyD z5>uCXgP5MMxUuG7>}=kHLCZxDuzciG6qJJ^V)jeRMEfW8u-6Eez7NA+x4JyhKwjJe z`mn_N@curMcN3o|I=(+YCy&}fe(*Rwu1+?jfg!2roVu9A+<$ej{`VZu_*E>yYYaBx zPUN!>mB9Vik;?9Pl=ps%p1gfkepkzS>b{H(i$O{e?DwI;h8 zH2O@{hAcnztgpm;`=<%;Slm70!7G$p*#A+4MD>p8i1*sYzkI9tPQMt!|5|K=+x)AR zk7Tc2?~m;BQ+5B7x61yAqs{uY?_9&DWPqg7U{m`kMw*G3=m zd2MS%+Wh{7_WvI!h_2mGDhh`GzLPtca?~91!bhOaBjCoF-TdD_^kBG!lKrC5aXaHn zTKnDeYvj?xThEe<$Bo?K!zKQ=7SsWXs2LtPJoz;+0I1(tLZ`r%hc+(#`t~I)3RJ{+ ziu(Oy^?{FUys$CUKnpIijUoT`wTf@j0gFFt>4cx8q(Mvn>H>|t%vUyhpF;1bX#Hi$ zY+|(Ex^a~zcshUdq4R?G*X($pOWrp?U^LRSqqwHE$9E#~vpzHO<~uY%^9BpSyTBlr z=+z)cS9+w8$&lbZ|A{#)hE>C=ZILCaRdxm(XYdwY2lO`*3dYDQv?RTV_F5x?Ryw?h z|2?j|)egCWn-3DqJtYY{$SbDSFbUM;$bAsW%!J$9uN{4mjlR+Lg0J>Z6A_;zqvNLN zb#>Y5>4BOf%iM{#g?faZ(miJoxL=A}orRG~8mu1{pLndcUT!WE%G8NDyuAo96m_;< zh;|q*zs1q4$`1{88i%2TKe&$Zs6Fbm&H!(9LI$6=haR2@>sHsqqp!B@KM$u14EjdMStE~h=V!soCFLBiMxzfwky>rG+_rhdCNqfYq zT%Kl3GeJo$V~*@5YYxxZ7+n1?MYy1~_%MkD9Y~)tqVDG4s7enRE)OZENso8?jegS~ zE)=?IeD*>S9-*=OB#bH^l~c?`^^kyA*8Td-t-euzMETJaDYW(}dW385xsCkz0+z^8 zoiSH`+oFp%PH<$lGj{^D+=6NLw;?+#iuD(}V&`v~NqRxX%W|#r#H<&u^C71zXR${4 zAM2-;^Pl)7zl#@A!UiYzE=!DYHc1%H z<_bAZ&L;7=SMwNPAPsM3<;^U4bi8Fh?8;T&!_)f~(VnJA^BAj5!1TjQ6am*sm}cGJ zgh9PRW6H0AYE+*38}iGPcCrDw1OcVFE0b3T=xR1wM6$u&Maa( zeirH8ww|f@yD|NF9tp1n#pd*n(92!8uT9h9$5SFO)8GS)9rnc`wnha7w@%q(fJ;_0@Me*Nz=U8Y>B(~ zq|--YL|lqIw)UWEE+&nLHiudr_W!?*63;{vs%%PH+RotR6K}`WmDclhtI*)s9k_0B zT#(ttHZeefV=*!x1D?iUtjXmE%dk^7%_;f-X|Owdvn?~h${X+)gWuU_RXOUCN`KTL z;~sD)Bh_Qfuct6ZROAcHP|2WmSN};vSVFr3z}PF*Ii*+K?gOYFk~plGv7`jwAmI8 z2{g>O+`wE2&E29ed#e*&30!x`KrF6S_IoRaW%=y_?g}QIZ0t%*olDWhiTq}va20?5 zeF|bO`ngSG_h}vThQMPsKrlgGu$P)?ul*}Za#B>IA@@WEs%~j`3hJ*kM-RBDg*XI3TSIgEE&PFt zerL*PgWdHJG`H2f9oOEbxpv4#ez&_7w7F9Z_eVR5jSEoZ03yhqkuspZ*8cGYze5$m z3Z5p}Fm&Qj(px0H+SB5HhN%@^S`(T_cB+96w_s44brx_KJba$%{Y*n41fl)_m;Vy) z5s`=l%{%uDYpG6Tu+-EaBq=%Dz1Q9U*^w{1wJuy9Vq!WoGiQ#1ZY|y9x&M(xcrq=- zb$Vz_LvU#aSIfHMe(7ZowQ&tD2hvP$o0j#kzApBzP6K0v>Rv1D{vWJp8UMrR5{%m_ z;C6<_NaO_t?Jp8(DwN4|mHPTA-QjSy*nB80EK2X2nTjSBUk6YWs_7|57!Jq*&Eib|6deJZ&GaecFuoyg8 z!za_tSfxodrp^0O)?DHOlLW6Y{XA#E>F|KayVq zm*)4L{UwxseIT7YrM0-M^u(?lL17k%Z4ALSqm}6p0TP=3sn+2uz4tw}|Co*v9))Qp zIe!9O%3JTpEL{QAy*nmO3G$YOF54EW1_JGTvKw^TZSHE5awW}q?F&Cj>pYXMVXPIo zbHAYZ13%daVLq~6{h@d=BgSD=@2%E#s@GRf`sH|YD=S?{)(V_GiVY$BOGlXHtH*oa zR_&t8syL*;m3da@9DHVNQZ^cJk`Ec_8C}-9tIvu_phFpee7+-ekBp@PAxGMKBE0>x zH28;dQC7)9&AJ-Yyc&G(xlgIp59}S>SX!&!P47d z`9Nmm`TeF*45@fF9Bl=oh;|_XeRrBnMd)o2CEN`bB@`0m?D3w1DbF|cvW%aKmHt2) zflWb=z71U$MJKQ9rVku+1L0eV3{*zRf2b8-njJ@1?w0MHu_H{E2qAk-!sJtPp#@?< zg{y&di{jM9VwFM~|uQ`3vuN!sPL`-RGva)-5Oa(^aOwEi4W{U}NADVnI zRY;V@a8;Tc>7f#pg&hmLvK}O=#LpWtEEnw^OJ}8^C>7e$9ZGHA)8w6mn0*2SRJsN) z?Z;qO4U2rcx*PreSa-U~()oVTK^U?6NWM{61rB@ImI|T-gEQ53!BY$8(*;uU=U`cj z($oLo&}=-}FaCLByh+G#3DP0B#L#Zv7 z!H}hjl9~V+eD)0?cfZWe?C9H4%5Kf-W7Ly*Yqu;zWO>%(>43s{GYRNeS8w^j8GTRs z+fQkqJ~)>CD(MkCzsgXHaP3wTF*}B+ixgR-jMy%zWyh%U$MDh9Rx6&Y7UBp;feo%U zews^i2KB9ZXJx0}?bp1;zh7$}T$o)3m#ug0Fk+C9r34)Jw}AJtjoXG-}uq&<=$75A<73`|dw8KjMvP4TF&3>9WflVr={IKLB3fq9av?|kq>2j%>P6nX*+*wP z)hm}D6nvboX=O0u{j4<6!Z0E=CYag>bY1b0hY#opzw}@-Y1ap-m*Sy4US{xt@_Ga3 zhN~Hb9s6VRU)Su*RR)*uR*)y-zhN2GlT?WwwTM=oL4P6!6tm2pP ziQK=X6s&RaDj9=69x)=UEYNXmWO~;e=f7;{HzmJBFFKM&S>YDSatb1hKTn%`N`>>h zY72@s*{}~=R77-xul{?WGCCx1G{oTcrK%D~LvceN|62<3F(kaTto4zy`Ens_a=k`N z`8~~EonWdZ?9w4GJDyvx&7@irSjig3bRp0JeA<)<74Wo>)B%Gxzb2K}~ z(!3WN-029_F>ucsbT0tcU=;t2`M7rJt=_j9oxS`KiK^OH!)TtZD9n$mL+_*MHKt`? z_@b1(+iHT(4HJie;|Pf$EaZ5w6oQkB8T!fH74+(&3A9=9Bww0 z)*(X~Pqh;ZH^Fg_&j1!3@nZqfNWN*Q3bJWe?>GAC&{xhR?)V}{;a9wVE zGhFFmK@BTRHStvRNKw># zw9VT)l@XFA(Q6I@aqB7naZDY&r8P}KiMDlEF8V@%j2LCW3WBCC%aUHdp{#@r!_&Vu zA$U8i_U7#{)E{N#?wUUpsAx`eJIVxpNJcIQxO0Z5lxF<&q>ZS)(XB4T&c0I=W2B1( zTs~KpEf7U%SLZkufQZ9toNw&penf^xq&6s${93btt}uy%|N3dv#v%I)SueMIOmRK5 z1akK_gru|-r8I;GTmS`|LA%Q6bON^D1XO$eeV(8Df;0TI{3iOhaMw@njnUr8H*iCb z1C%CR1CjcG>81O8K*?FRquzdBQ`eeDujMY^L-Ys&m% zZwv3q%$>Hu<99KzhOYTGQGaOCvhoNna=jy+b)j<&oKB&g@RH&K2A}1vU)Z0k_+e8z*{fVyPA@YW7lkwJZDh4}?^M%xSK z`*M9XOYB)q5+rUZ+L$PHr+0RJhVN4BU9As@2YdQ#saQI<6Ug5LaPsE8s7n4?m$iJh zOb(~Dr-grlBL47$XcWF-usn8{W#G+aW#&-iGR%63R*&Qu*bUJ;}$S6xy{aQ?%xuPRRj4 z+Lw#h=U8uf2aS`mKx`J1d7kTHCes?6ldWPpu}%=&3y4pZX=7i2*QB>5MnFA!A>Fe1 z!N1}%ZdH}fU6@shk{G;A$#2ynUVkW}1_o*$<$z4%kSg*++i>39+&_O6N`Wqv>py;? z!*%p8!0Io8O7g6V=tQP9APp26bi0^P`&Y4Xy4qA z|NXOzpwvG2XX1=YYr385llFHsNml-X%PwtGhBV{DyK&s0;p_LY$jg4PRcd>HJjb!B ztKy;x9rK*Uxkk->$HI#hO3^TP4=3=-zc@lrF%z-`}Fd`lmTIrFWy)k_Q0cR*ZhuC135X#B5s-hEDiXU;CXo(X5XBVW}$sxa{BQ$a(v z9}$?!lWDa(%?!!q_1klO2vrPr6*bH$D<2oX;lXi{MQM^*j)kkoDs^!4iFvK|a*+KY z+XAU1B}2e37Ay;v!2dY&H_I&hDgG5Lt@WpouwDY*1{+E32_SFq318knMJEMAa1LEtkivo$>wT<80nMECD}B zFFNqMQKvDeg=vk3`@I;a#cHup__c0Hg7|InO#*E4_m?5dz($EQOGMR|d7HCIK#R;b zix+RKLa$MqTm5Rvd=-!2eD-ae9qMGqjJEqO<`pgGkjrCzN2EV$PpAKH}WCgpJD^_{1-#vV>; zL3&3(&ip1;_r;O^(Pd|ZdT(E5-4#Vf;8Z{3PCO@res=>iQp75OkOakvmaM6CbJsk1 zvp^)gm+z|DNfAA74k3YQ!=Z3$-|vsZXeRfG%} zFLS>Vggz+~CTu*gs-j*{BQ$zd%fkuNvG6>Pb8OXXxdVwFC5Sjg#)8 zlY&xXrHnO!;*h3g!XTVM%QOySA<+QR4seedNMCI#KB2Uvi|MZpf~AtTfo3 z=ave=Sf$aaGE+Hhvix_`$bwH-SlKY#NXjB;SyF8A{vA0P306&3GeT?n4;J@~a0D)$ zgS-5^A_>AyZw|fR)Hma5^D5yq%bXz8YBaBgjVRd!kX|P;fYHlrGpV{;jU+x`Ev-Mj zxXVO0Kkg;js#jh1J<7atm%i28--B9ox9iqSm9_gnGnU;xv79fW{mt4^iNdp8XnRW% z40#Uvyx0|Zm^pmft@KUUzlr-=_CU`b%HmtmvmX(>yxz07fE%yA_K~>1Xt2|*i+&9< zUBcb+0GsHoJw7W4HaEZtvaQIspx=rvJbAT6? zdHCA^i%hD@@;6*!DK>Si-9<{&fO07q{5uP-qJFOk*5Z6h;B%?{)m^jjK{>xqQQDMw z7dbc&3Ktu@cR3|xqM74Xl6j(8yntzILCXQw6fV{%!L70})%M;_d>JKThMspU*3Z4Q znTQIcC2ruDd>P!2g6$$O_XsUO&>h8oMvy2YCV;8mkosk{CH! zm~ITZ3Eh&!&rP(=NKWNI^t>fXrzk7g?=*;QLZ47Z?zY#ghXfl>5{i*6);HJ#xt0ye zo5TO`0Iz#Q3VrcsX&sQg?sm3XrRpard6Js)!@r!=niunTn9?>w{>zUHOMJcJj^;VV z7!MuGC5|CUB}Gk7$`bCcqe`Fb{lxsU7N4<@TOF z?5;j-JyGxb?1<*ToNR8eH?w%ws6~iL{{CtNYeGJWvs<5ukcKqZXwN1gKXC{&M@kix ztccK}&afqv5+Onlmet7@izxW-f?nvs27X66yw)TsP2gZ84Pa7&>}8ISi93`qp6qVY zKEL~k#_(7vPmCHR(B=3B7XSDLw7U9`iatwimg=3$q-UDj2&mEO$!nG7zQ-%LOtbuvn_M9&=0%%HC5(lwpa@WbBr`r@>XbDa3YKnur-(5!`%*6 z{E$@okmH`J>Pu zW%&inGQYZX?_Ujcbz+Um$yLRg!(Zr-SSu=H$j-x59Chn((a|?&dwtWQ{Wae>HCe1m zKE!X!97T(HHjM(qHACB6;`q1ZQ2pZ({{#$VXulQcB@ev9;{i-YU0oCGj86ANspV?V zvOEa%av5#1+bH5A<3@-e9sZYeHT%A)o!jrqh!tZdyNl2>UnaL}BI^}C-0nVp zpg*p?y?cLzDPO%6(}Y3=LTQ*H^(HCunbFamZ$CGwH4^gR#uBa-fpsIIiK z7t@gcw5I&+OI;8&_r9n*F;9nEwW68C`w9QA8(_ucTk-JiXTJyzn#WQ8X1`T`Vm8}S zpB7hQ(&Rz4C$C&-q-K_$TUJL~)Du$^jra#fiEkk-g z4g9quDrgx-jg^8|lA~@^nBTiFeaf`cJZEFu4z^80Eze|uCT)+EB)3r2lQi*{fOd)k zeYGm&6Ha3F1~(dZN|+U(Oy2STbgeA?rr8m>Eel&iFsMkP)4o^;D=AGHt(_@#RNKqW z5iKvbeX^u8Sg_2Hz=#PA3>>8|)M@iXXns?iYq3JxO^;KuU+&#Y5tv@+(;L6-INJ8oyR9nT4FU!!Aw4r<=8&Q3WCF zGk2WNpZwz^@>&Kva!#ojx0^=WD>~Sf9TQl{Iar!0_f?B_EUbo&We|RC=GzGH5Zqo}9pS z@5^g4>|!L@dNEFG?}04qrGqPECCl&g*Y_&tABtw!NbIqMAIvt{@yzDtfsy05lf7`i z7KFrSVO*#2l4ed)>%+4V0aCBj=Rr*EK(;%t+?*e)ARY<^%iK)C(%j|eth4E1w}zQz z+mea6s+3$HRRMRU9V&CEkX7^is%$WLiKBrHypO+ z1e@*<5V9FtZ{&A?P7WTV9>k0gQXT|ZIMX<&u9$I zYeq<_T7Av93GOi2K!n!WYWq7j)eo9!bvC^vP7o|V^*0t{*DCYV%(4DO_IgvT19Ns+ zh%l?PgZ$b&sR=MOQ&~Ca`*)%e{A&)gA881vucL?BFWrVvh}breI+6+6?S}UiSCAn> zV{UExgU@4&AA)~~Uy)*|mxi>Mse?xnLuUuc&0OKsS}RPEH#y6R$96WQx=O}H+z76+ zfdFps-*9Yw?V0xJr98qYHm#k=?bt5d%iB~EE%_htO~JVx8G~(3$HRNO(!Rk04p|#6 z?Mex%ra6mMI`!$m4H6j7cSt+|$V_U|NbHNi;2?j4y~A(pkf4;zA1@3r<06gJumLvIXyCjk`@LE0&VgGh{@@Z|2ZKFgo$)Q~jpZF{6 zt1fV~yM~@H0L2E~SSlF^oN%+jwh%CvtK93Q5wVpLeZWZt>(8(A9>F=MbMElbFBiL}Q(+cTW`JrJHv29p=u?(D|S-tng#@VdnA#?7Ap zA5)^&+jw|GGK}GN;**T{XSSVu6OfArhH3Wei>>8S@;eKoDA7<26L#=^p4)v}p8j)t zb4;UOiCh{Ao&K;NYV6v`Ry{9!VHwATQ*Xc`rCB|vCVV0U1U)Yn80W~_U)E}$qCl?S z>z&--6K#$ieBD0aTgaObQ68M%dqH-6NsYoidKS<*#XTArWza3Y+7>6-FDQ3A#66lY z;g+7u{o|h`GNK{U!_$pd@ zy}ShG1qjxyiUM%mcSe#O;Fp+^S8JEzej(Mgr0{#N2z3>#gzB^U60|~W;zP_ot<*y_ z^r?2QK=zQ-jhgIC4DMR56RrkjVk3sMalgL_Rqs47A%qoHx zXusa~Rf{ZLN)n>M&>sKxkSD{APt;9;2b#CW%6CKkeW!XY82E*rd~TB@9P|TMyj(}+ zj9M`p!qAHfJsm8-SY2&;M>j|YE+BbNZr`_(TQDucR;zXWQtW1WnNZHI<+vOi1?}~CN=@>Ad^q( zpwc_|M%ZsfnQ8emB`264ihjUl%4IKdB6H=LqUn$ zJp7+UtqqaJw#%7p5&iB-RD1{Ecp~UF}uu(o|B{p4)HR{h*fj2PAecZ2EH(D-(4 z$^IK!>{H%GSgPGCOP6Q(mLDtpfGRTYT(l)hGHlU#o@Wkar_d;h8SQw#fug>Oo;Yi` zUc z9tm-w$^kpN{SWV9D|H060V7l5R9_T*UM3-LGhLl-RQf6f$YhQYWzlKgSfbhW^>1Iix^a;u<7qZ0BJl45~8hzy64)9 z0Wp{dB(4LcO5n3{7TNg=3DoJZl`O30y6CU0@5w?C8WPdpry+A6d^N)!LEE6kQ12@% z=;68={IB@_z8wc^94L!^Yv(P|7+Oi57~0y^@J6jA{z_#Zopkj4fX5yw{K68v6U;>7 zwZSeLRO|ELGCPZH!}tV+R6mt|FKS4In#+a5eSzpc&N!x^ zM?5Mp5XbV-DeZ1~$naw4Aao2!`#=OJtfiNzhDM(<!VM-kz2EN1#qMyxgKTB;(1hLx#2Im+fC1*HO{3cXGeWl%tNKK| zjFXR=^Gq;=ev@}FEXfB}bhc-BA7#<_C@Gw32}>)xnUm7#6&Uj+ITIHbmoB$s%}@B` zm$kNOw~O&;t;j%mwmVcad-Adu^Zb(2c>Y+E1xexrw``3gWN9Qu~ z#NKlpcAWwY1ia-D7AZ&xn`89LT2JSYAA$5UptL{(yVE7$@ncGok&lMo25Qjc;(fgK ze#YA73xb<0V{Szi>(RrMM$3L*K9l2Vzrw5>C)s~X1Z3#E&@&}Zz9_9g{40}4R{f_a zRgN%_l5weQ1u=?ADy;~UVUEs{c41F-$ox*6e}bP98YyDAzyfjfOlk)O_ThSI?*e{D zj!{1G;J>vFdq&LGTncB+Xw@gL+w4IUW`gk>fBcQYD)c+A;Yt1Mt)srD;+*<^_0{LZ zt0AX_x_{rZ1r6S@Uq;{Ssj9&6Me*tqHz@R{8fz;_TEeW z%T57NNzV>k@&8m6OG08cK4mq_U#W6W7%lA?KZqN3;x3bWp&CyL7>(R?`TNC2)!vW#Pd* zBOYPF+UW^6{Ftn2lm=-biK4y;ubAw%+fDSrS+ekrsfHHbBGv7^p4yDoH?0gE-ht>Q zmPfL@DG3*Kusf-;+rLKHjWaG~rKALcsO^Ti^bN4bKdZ#D!jqN4`YaE^Wg4U~N;Hb3 z05R4)O9kqtq6IVb>WeigbcpLkmV5*yS;7OySE?Z81*jG4`iO2B2&~=@+mIz84+5`2 zd$ZHKa+`F4ql$TT0>S@_kugn;>86FOGz9g1I8u+}QV#59r*pP1DreUF`B-?%$&~mv z>4}INeRN6z|cnWV)# zSP3-iPB+94|IhPVk}ABEAkq2^=)7|y=mI~FJWibBHUVu3&2?#tswTtX<~pxWDW@&o z(3F;%6cZv~>t^SoNNY+!rxy4OZ+`%(>--8X^%`S)W!hmn?0O5ZsT@oo<6FH<;L1?- zToLIo6#wBypYqy+J#C_y6+nhWJs9CUfa|!Wz#2Gzqe$>kfh}W+q+9d}X6f#z-ShxM zbC|t#HlNJn{EVl>EFev;r3d48|J9H$(>T`1Vg0u-@_7K-&H>U95JhtXR8Z3Im-auxCzpAtP=}s=w=epe-+`3P zO6#IP0c+2NMPvBXzzF*S?@ce^3=n=BYdGK3@(MMmrrao|Dx}Ms20-HkXCnP*!Q|jTZMZzu1q&^LXwT>Z!EhevXw&t8bvwuJ7tUw|;@% zw)aieyz*M?3Bc~YvJkS}r+Q@R*mNk)B=Np~$R`y}(gb?3;wU>BxOL(&QO}$b8FmJ` zD6;6^xKS*qM1+EZLP?w^Ww5E%iEZmk8nC1Fi9y$!P#?&nXKxd2@H;6FUq0?u@Tu9R zifphJnZBmw9^vN-Vf4Z|atJH6`6S#ef7t$>p)Yd!+X-QJwqJ$q*H*q#dB%^N%VeSBKfM(>{%9X6N+Jpd>AE9iSH)VF=-`Uy$`E|SET=0HEXNm%P=aP94Ir2lOUUhERqj)GW z=9Lt9v-`KUbqg4s6N-v?78=9&!i$u~R;WJ~({xSD1|DjxPe@y-zd5XrHCDSl*wutH z=sP>#I|j$h5-52!7-?Q6N8OMAU#G>FRqY_aie3V1v}gbJO&H}9@e2(xoTC2oL+i#h zw>p$k*UY9P3>1&i77sjFPi$(|iN7@rLmfCQp44U?4GEq@!~2DYtX-H`q7NJU|JW zG^`D-aEG<|G+>|dDhC+|7xr5vU*vE?wqpx7tnoa4D~Nu#^4<%jCMPc`S>AkRz6;9} zt{h|%4BLa4c>!x&B=rQFN~hW)z!fRvp-ol-yVKk(<(UFJf#0QhOq+ud-G^18?3N(o zBWp6m>Y}rrrSf$tuU(%;_OlmhQ_3{m(ZE$Mqo~^Ci19X$9Pi_}@6M=Y=zAwD9{w?* zB`bi?L}OSW=_+^$(@C*|vVQMQEw?2s-uXKJC);A@w0ho>2$qBLc#iV=e!LRRSMI8bd(rbhvV>g z#J+O2S6Xs>eR;5USdLi{vQcTixM9|?Jg>e8=g{YAj{TPsuj+(D4r3}sCSg{d`L@{H zC%V(;RoL9s+Yq<42jc8Rc$odD4JKVCkS^gIqSDYaZIM}cBrHgpxA84}Gt!$~I?OLo z!2~v}minKP8rOQ!njTWH1SSOPpq+bY8B1$HqT$u(NmV-KfWd zD!?CAeE?c~CH{?3gSJ~rI=E1=ZdWJ22aSY<-S@ z75R?D9tX2qOFIg>nA~m|F=?|qf_3k?{WSH41UJaJ(hQw{uR{mR>kJI=4DKVbc|MA zaC&1L!rp_zhcBtEh}I^x9*pxj$@;e(lCn)n>O9p?$VyBCC!q_8I$8iAb{%+fLLQ*B82uLVCZ%*oMmO+P1aPrclX zpsRZxQX%z)-(4RjI--8YH?j*h5Ru(Tr052#{fFD{1*JxuzB>ux5BVH)@jc?_kI5Hi zAIAHBM0`=901hcx71A_RS3_mZ{P<*-x7MH<@d)8IHbFQ8$K#W03slwuYkFS3V%zITmvNk_&eMfE! zvmA0-rHZu2utzVrqyA1Kh@I^t{|+3DF}+i)3c1KqE^XojJ8B1?Ds_x7+tr^XUPD$21C5 zNdhkanb|$CAafZKsi)kT-H=s#POblyhfjqX7C~KaMc=dff|JfKU6i_<#Ofe%x78FvJRfH3T5p{geH~gZ=0n4|n~~^c6WEEFVTh zdG~v1F{ZVxP#hZk$c6*X`E*5z)#E_tLZRA+ixgiU5u~lv1Rv#Q00* zO#A3Xg4&u*onh!1o6O`Bw8-omzsM|fvAm%aqCZzXN>nPa{_<-NBv)l*Jsu@x6YryG z@E>-|drl5?!prKslQc;AWK-#;qbAT-&b_rocQwLw*L?OKm)(7LIRYW?r=`R zQL$c6J>7*JQ$7!-ul7#1XMjquV8J$SJmg$TjH}x*yz8F7&GgJ3{_EF&lcn-JHZoMM zmbh>Nwp~{tioLJ#V5-ZfT(zl)8Opw9A(sd?%5yDLqW0frC-?YV5K&idZ&N83$v>1M_H~cV5Ed-1<{B^Y&OZo z`sc33$>oSHh)=E99 z9g1qS(w#3kasFBU)1Ulf7OpJ-7NdqObFl5YTwX#6q~Z?uh*tG}>$y}*(=XR01AS2U zy)Nq=1AXJ}*o?!@iED+{U;U$v|(G54HQfi(sI;&+C#&-v$G{5!R(f z`Ou+X<(92)H>#SF%{679*8u3R%pcW{KlYD&C}xO!bDm~SrN%)O4xr~c*>`i94nxR6 z1L)}jXxbcYKw9Yi0&9xCpH2XVego)34a|%XfS&4a8-(#_nnU}3oOj;vQ*P_=GA`B! zhLYcxRBM{{4mSBVs{+^Bz0>A=N?nzPCP0LutmqQ2Egt3N^N(<1{z(>BPJl)rNp>++ zi%N`|gg8liE~xYCD%osJnIyv&?hgfs9su;=+dot=A^@jnwzg9^$&0L)-HK`la9(734OJqEwIpo1q-&8 zxhmDPKZII?3;Qc5F@ojf`Iq^`7k-Hgm(O7V;TjWjFba-w?>zZ4nd1=K_yM#7ps#g9ZCRA+P9=M5j`j$I$1hPCCB zP$j|S8dnb1(nQzRf#W$w*(wcmGTFkj%P;Zrg@<@;@lj4(d>W11!K1N}FQIhB;EqwA zzT2VmwFTd;((|DSTZY7cS+4`R#(W=jK)uWLJ1QFKjrx*|g0%`PP2ivg3)Yu)nEDJ? zL7Fz#aur=h5|qTnC|D!|)zdP>3Zk)V_NM|8p(I>Cdx(8Ahq!6`yV}FJfXg@ql^c@(#Ra zu~f1gYg7UBgi&H3m?nAUI)_f0$D4xy&{cKl@~K`m53S}Q!vUbLhkahe`Y{FdA7}-j zH^Qn@De{lp{qK0wj=PK(2|&EOfhsDh%7YI|bmWL8_ai3x;&&$^g3;!SuMvQ*Vpj!g z-2muX*F8s(^t6dXxAQ*lkP4kD zo;j+(E ztTIvB%AV;vxncI(*gtca9g{bM)PY`2a++Ylf(2_HNFtr~}}8t(!D^!k2K{RYsB7~}N<=wcJ(eP51#Iqec5s%Z5~c?lP%=W@Sb z>=)mcpaw(Qe9pEA9IF62bwE(J0D4uYc>Ojk0J>7$klOl68vsDh;dhW$kjFc)yVMT}6WE=`%^hGtqr=S`xUH2pT0|gssu_+yQW_$P zR-SF{g4qNm_P+Z3(kr~W@C}|l_vgH^^gPBGG_g(OC?eD+){YILHHp25cwKmtRkSo} zn%L?39ZbRaV4FQ|dH}t}_ZxH*scx9%8v%d{4E12adbw+_PEu?0iE34uO|rsT2e_+2 zs5otOYe6E!B-O)nzjo6-+%eaU+q)?-xn&zSPJcUl=ibV`nR}QW+n1AkF@b>|ELgBM zVg%opK@(R2LtIQ$4Jkpgf zZj@uLGyYERGXUrTK<_5LZvXM6dwjjzWB|~6381f)o?3DEvA*~7(Jw2ipa|j`CHt1| zH8&^7eP8&1bqgeED~ap{fbJNjsiaE(0Q5Y-v^o&(7Ut;;K$oc5#MyWNdPAMsAq3Dn zy(a^L2QB=Cu6duG|QW}-pf7vkFay% z;1Fh*F8QsXoH+kgp1Jf8rxu=K{@Mw*mJ;_IOzJ1|j5krothcs?nVsN%p1v;MW-P56 zGL2?q2Mlz(Mkv?g5T@sTtRsIA0Q8>t@qPusJ+DOT_5544F56?M2PS&3V4cN^t&-?e zbfUh)jpq8Q z4;C!gn$feg{Qc_a{^Z4%`1harS*~4Mq=GUrYuL6=Fp`jI7MuQRpce(8=kIYe0Q9vg z+(#Qgua^!{D?=5R_ZmP?S75e|T6|u=0Q5$LyGAzZ0J>4Q?|ok|qW6pP%O2Fkrp-h} zRlPc{M2IH8_SK)T7q6Tpl7w~`=;{MMl{_3n%bRQe6-@NY001BWNklCOP8ro}ppVav@YckhM26}#) z57VYy!$5EJEV=~+4My|xdZTNkce%bt ziRHaE({zJB#&z#~t^9jvau}@p_^Igmr7|k((xMuHNgUIi7`Q^DW9-^`m|N%WW$)bG z?3lRCv(tgBx;X8QVj9FIjbj{D5MSNqWM}G|mD<%!&VvODHp2e3wucl7DivON;~9SI zv;TmKREUV#cAa5-HUTRn#uC{+_|abEpE=NO7;^E(*nsKrQ?HX7TSxp?DEqwN2a$fi zRu!0y@U31P0=couV}1VTiFP*DJ;*1U9ip^)PdAS&!ym15HRhTfOwh1jXDfJl+xTvN z_MM-KKvRaeI0+Z0+7g49Bd%3M1(4avJP%Ra83J;V*Ohq+K zUAMiaiJ=d$GH|;E12?ZtDizemh%bjMSC)Bg;V7>!KE|t;j&kA3E0BOOF%?!2Q=-uU zZni#E0>f-*owe7#6&uE41Ma_RrP`Y8(_q1Z1?zQuBZ^h=4M-~(#z;swd+8{r=Z^xG z*vxVBj(2nY%v~JV_FhU7BL>$5TgbYSSHW)|*J$;3;9rZWR=CywKL5J`iMj;~7OW^U zbyz{V-eYdscLzW69ek!`vbEPQICKQwN!hrr1AoI9qRNgHLH|`C85{9^)#Pd1L-*&ab?|`Q>kM zZsApbLR$7fyLFN*lrbjuO+K3gbQ*%wA)k0A0O%Vwz^#>g3)VUT4;C!UucG~sxFOJV zED}@=A`uDKP#wpJ!PC)t=4fq2N0@_ z1#1}QLZ*@IquAUt32Q%Cu+jH1E)UOFn+SlGxcAN<=ft@e`Nm6sik2(PpBZEOzA_>) zHf@AFO5fEEA9~zR7W^<)UNx3B>CQxlzshX0r}s`NV6YDuxj5f5ZneB(~oHGKzL;u2!x zmgDf+!c(NWrPf{pV&B)nfKeD>9Dy_hCjRYl?>CAvMNHB<$F+@2aJuuIM1=}bwPc@!Nb(M3~C<;IJ&Y$7r z`4@TP(lM?rBwU+=u}LsQSVjay&!jIlZ}46ZD0hSZ6a`MZ0}a^(<1QoN3;Jhf0H3+q zwodKJe}Aq2w|ECBX;;zDzw+D3!^eLQ65CcHxEA1-0zuvRwfqOHAGC`)oS;P~!PQ28 zw(6YPnn$ggS{66KnrVM`0xA@3MKhi|0=IJdNvjz8h1&3f(e=Z>N}GPjHPF+0mQ2^q z)@a>ltbd#M=Pigj-=|`H(=R8(Vr_*ecFI?(2}snsr-3A(QC(v&8t8;N$t-uAVzQ0Z z^f{p07-_He%#U|G_vo$(=g3=^>w6Tz=#2!R*Ea#{YCjDYY{)@_cIW-@SSq`sb#X=Y z=hen(G;aO(Ow=OAfGWEtZ|CN1_j2=&?_&GJ&7OT;tp>G@Yn9?>S&x`hADxDp z>cN5q+ZbkZ`Hah0PF^_9um0B$W7IM>ZP;8SI@qjZhNbv%P2&HAQPLPSA!4Kz?&5 z20+-n^SalvHF@^A`?otvQ{M?Fab5 z!yn-@NB9RtgFQdG7vdHrJ1QZ+#Ipt=HL#5G>l7)%97sMyFiVNU$oj9dCg zOAL}~h&l$m`<@oTVr7hkO4giIa+`=H!4UbNH6Tr+>|e5~hoFl-TKn%Bb7!rl-u>Q3 z2fZJxdwfHR7Hp97Z{*i!O1?}d`y;BLc6M@aF2Qf@{2GH^rl-MaudX|c zPIPsW4jWCUYcn@PtZp_zGqRTfV1AxS+A%pB`oxtbYt|meKN}0W0#>t)LmihKgS3|C z$b6^;Dz4!d7AuAX#bQuRF#fYMy-|PNSfj8;3iU5CMC*N%Ka&lxi=|CO>zj$DhjwAj zwvh~@YyJrq=0}(xYx|%yuE-AAt*fjvrVJiD&-*CF$SN z@yCqOI>X+q;Y62TJO${T@JxbbeE@pmhj6tPdgBw2qEA|~Yo#YS>Cf8$;i`<;S`biG zGYzF)X`vVS+V#9Y)xcV%z1`=)p?4crUNpnx)=w(vF<4-|`DwrFwi?wxk9Ag_^tu!; zT{kIEUIo!z8FH-}x%dTIO#+=KwCi9@R-dh8%|dJg{qw5dO#fXw_QrSRwmqMh8>_MC z>Hwg2>;@<6;_hXGYos^1|F&oE2uAez`DLwb`nz^@6$jlEcaZyIw@*JLgacmw-Aeon z2!$PngU)t+g3ATc_`o69ilEjYMpuntz84D^#MmqybUlYO3(CY_FMkc!%Ly)Ad65fC zFYx%82bmh*&GoZ~xn?zGOn> zYOr7fj%_lcq)J9f-@olv-gD>Q;-P0AR-NRWYFk6lOvWkIK6m5-FK4F~F_K+3 z|K7yY2-0{%BqE{AxQ!4#7^yyx0CJyao~Oa7s45>sq6g3fVE>~s`FG~uzXa~#nl=F5 z{9x5fxR`?I`NlZ5X8yC*Bj>UffL`xR`VpW>yW?Yo+U9t*Wk-Vo(EGk|ciWV%(_w1a z#I@UR)@T#7-3JPNvS?NPR%Z^~n(BA$+g#F7F5R|$U8ftdE@IFCdPn|WH+N->OnLsWwt~!TsQr8Zr=88 z4s5@dv3RC22&14cxpy%=zR$%lV$fXdE30B*56soY$FeHX409-0uz}_yzORpB5OwlUe|q#| z{MqBb!_=f<_9hUUAR3bxOKeM6DR=j&?E>g6^3i0ZWWf3dpkq59mm>FiRqbi+GiU%E z(_DAIUGUs(fx`!&cY5wo51?z86Uj;r8}@TZjILt*n_NYIm3i)@>#SIeTJC%Am(rQy z2f7NNi=;oi--RI$J}8lb8aqxmAf62PA@(|P9c&^fn=)!Fs*I-7wb{(U27TL*+@}G^ zV1uY&gY+le--ucLCs?os^E9um9`>L1eS9~6!uW;p>(?4@wAP2+(!MZAgrVf+@GKTZ z#Sp3G)$m*at`=wDX>0eW)vfvo6VeSMAHdx=4 z_Ej*R3=*NLy!);rOvh7PU5-dr6nt}G$EYrcSU2R-t@EN@?pr!oa>ZJE`!MbM{k|9N zd(aq@AQG0dV2>&)ii#7`_Q<+m{=?CKn4Gxuq`OF)K>Dgv zhk_aC)yrzz+M$gs>M-gW76!VAv~W^dxI-99DVKt&${meaUCCK74D_ZeY9uyJQ!j@y zLJahdpMS%rRK0*1Kt?A$jsiA%h&xO!Zq=jAbwA&<)@{Yn5Fd&+)IMx-|LwdsSn&yf z+2kl)w+F;wo_6O88qME^CEo)Y=d9FUs;t3G>)a@6C1Za%wrY$KMXa)Q`Zn&`{XOiN zeFwWH4*F~P2B+EV%dNm1<2;bhg9RHF=apcIFj4_xw_~XCg~va}XO4c7t$Qt#+Y-+0Ky#TPhL|Cm=9}H;nn_0P_d{@Ff!(w zVkcf=(&dn8E-4Z@?N@6N6LDerMIL(j1;i+`<9oPi+k3ce*AK9J;-E*!>!PVz3cBAc z!yXwd*x-^LMNLH7@y;D=Srp}+cOK!PZ~XyF=jNH*<_^}dmc$Hx)s7B!RQyO43U=DuIR`EZAT-h*fJ-y(apWv1#7@mcP#Dj{ZL7s|jOUs;t?xa<-L!3wh!2 z>_t7=Ksv5k--t0*Q$6${!8qF?{8*u5yf~{?6QOH8|3xuncVO=i<;4o) z@l^WV{kO_D5q1AIAm%=Y!P_H8G!ay{&mM54HXTglW)4j{bd1B~NcuT(+dWa*%mDdN zB(rOj*96VaU^Y8JhIjZOq=Xu7YnJ0c1k0{!O!Mw8I!HB7jxv zgJJBNx`)+=AWdK%@rzFjbz;NBKoXJM`A`2BT-Ld{!F&*r9yz~SDVKWfra_yP+Ep%? z&iWpB|I+MrS(Qq`?5eC(x*jY@*I=7nx(6-UVr>e-^=3WTCbMxP0vC<_x(>w0RK2>b zStpw>;_vc%4>%(2G`{HMb$O7j)%(^0@Vi?d8#`f?O@64hnK1D6%<*>DRWmK~RS9&b zYfA@V+}Iv& z-}S@Xw(I+t9p6)(paM!c$Hq6*6^k~BYz$EGua}yNYsFn4KzzZ1wY5=JvjeGS3v)9& zdFz|r&2wkJg6>Gb8Z@#PHRxLMq-tF5*QI-_$&uAmg{dlT=cGPG+kirbPD zE^7SpIH8s7!4!h66`;saxc<3PvoY0N->w#SX&5*7Dh?MvbpQQoG{~FWTPr-Y5&OIy ze5&^IyI)7?XR4~3Nn&fRT|b^yyf0EA!d4xFC?#urAdtN~o2>Vt_C6qn`vvY(FN|(M z%y?AM&M1l7_0 zE~qft!HS6^*3x3{B<>3PU$D)vUe>!#LbXV7RxvRpQ8a=1m9u>9#DC`NCw`kf6Swo` z-QUN-?eAi`v=^b2V(t!p7eLD(r3Mc(0TK6FjWfL7)eokGrqHG|Sg`KRaL?`E!;`N) z1W620g4)P|=Z)k$2I%9%9;g97>h&1Q>iA)^&&xqpfV;!16xA>uM70pXuGs@E-yfs* zSp@Nby@J}w(xX_Dc;G!6N~bK+{~)!OEG&1br0v~94O3k%8JM)gw+{d6qM;KF7nyKgzD@1KhU#M>x3sT~%f}0Hv&{A=ZGg zK7WdQwP9`_#b6Ok_DsUQ8Z1~5cIOT6Vrp!TYfFoa&k05?h6pQ3fAU<<)(ts*aeG&9 zK0m~h!;(Mre?FM5KX*OrNL3*+kdzTAfh6uaR+x$>+qr8o>S*d2+BG5DQ7zRrsA(h6 z85LXiKo8t}P-mN;*lZeIKs5u=P!nxFAA%<1>Sr`^w>;v{P_;iS^z_e$ow_*|;ZQVj zk>Fo~^=_W8rL*2_{s%@^u#GVP+x>YvYb990@irC2Sdhr+rmKQgga}o|h;nZ66~1!( z-|@ST|4lyg{4eqBna^<5F61h5txuf{B9S91dB%AfqdF40KQy;&@aQI3uzsyy*C*kQ zH{Hv%tAc8R6H7=!4mu?HZAPpZ&~~P(o8mdGmA{D&{y=>YpWjR}rejQ^gIlka@Q$zv zL?$Ott}!aYWHi_MTA((SdVBCei2(M_9xx*1j=xa9K=dL4*LDZI{{Q&~shu&qn%QjeZw=Nw8q+pZl%W*GBXsef?e< zJEDvxUei>-2-d3^yL(W?l(8D|;`}50=_~(=-}%N5^C!>$Q;yAlnS?ma`kY8hrgiQm zB+`9U9jKSK3=6(5Sg>x*g23H3eitjt>Ignk39;*du#QIleUJ^mgO44Kv8azJo zR)|%*qYQ&=MZ3*ygKhFz+r>N$@+`rEtv|U9Yo|azW;A0ciU`;QNE~wv;}apLWv+m+ zil{5YK6dF5j$M3+l9}L^?eF8xT|daa*}JkvZlXA}+;8!&;yP_QCgC{-3syuf0^D}v zcM?A`O(e@$O|Zr`%;hrdsKEGk^Z>!)4i{R%cLUEOHpxLsQ>?B--T7V+G&jp3Mk9YC zQgQ`pkpLB38&EKn7*!%%m+`e%s<`Sk0j;Dg^c!{_9>U3O2KwN88Bk?%0n+|G1Q2Dj zIo{FQY|cd~>5H7pCQ0K-Ps)ZR*a(s?!PZPl{GV0~(q?SZW(-pi$^HZj zwjsRx8gqKBwb9m^%B{s<>xlPMoP3M87N2S&)Cfv~vEsGOl>~A7p+s0QCmTR9uO?pPzUJin5XT^)`c|?Y$LCaX6vA% zc^~rP?y^2n)IubJigo(r;`Uz^%}Sm{9O#``#TW;yi>V+OtaV^rEO2?{HIBaVX`VRs z0NW;S;jKHqpM!gTfGyDsU=cM`t3AV^N3dYs`&id8>6U$mdHwaTc%PUcMgnjcEaa0z zxCSy^{DH*y{Zw0Ud%P8c!BEizF-p|tBZ+;HT-N6t#Gq>Tyl^weFFjTBHLTZ+>qtgH zjn}TLUdhUOq!`@$)AxxLj2MzGn^7bvM%zmg^T0{B@-dCZDZ8AA>m1+KVoN8wsqJKJ z{NJ|uM3goZdYXO5b{AH!B?r<*q9Rf=$NB|w_4+eJ>jU|!b1_)ACP!d%5Ys?%0S0o!mp+OVlWZk}YWda&zDn#{BMb+K6) zkX?RnZ4t<|^8fi|*EdE{mp-u*P_cfW?Q}nE#&T~zxv&jAPXPCaJxR1}?HH}*LO1iR zRg7539FqRa?sejGTCT4F?;B}+Z#9>!Ln;Bf6Uiz9(3)+N{9v=KY8G!i!+%Jcd-4 z1Fl=1(;uGI`1aH<$f%7|u{mQiAT;~`IxwuF;#e)9A)!@bT#+$u)A_N+7+Gm=ebry9Muyv_{Ycbbs`Gd$FB@KuEu|80&3ua$i?JoF zNiZmu7_k-h&Kzj#v*WbqxIfcZe-rYhmw%T89~2C8P`>G76=^H6?WH3OHb8J_1fOBG zdcua%=3aY;K3B^G-qtYr2HP6k3F|Ldfq{3oiCwozXRy%(3)VZ=x|v7ekR_NAK~*?* z@h^Dk;#Zi6X1HVbk8tbG?_=lWO}Sjjco0NtFqtgrmk6Icd-7B8OTmIUAMJV;?B4b! zN@fOQ7d_~$bd6R1|Lnba&?VP(AND)v_WQoU>@%1d%wS)*S|Uh_iYzNpqFAzGNu|;X zh_)q1mdbIJDwbr&siab>08lBkMaNZ2#qlDG3rJgv0MW9Qk_3R-ELi|W5*rB;TmTZp z0GPqd5WsA}eBbLnCx6`A>+AQr`*rtw{oZ$v>WPDy_jS3B)!J76@#~6l0V3!!}6KnMrg|7)d}?REZyd z>1u$?V2>cCAe?tlUY4(i(~>*tQ9)OV54;Ybw?YBK>h&M66 z@v^n&!Sfv-;CCGm*9~B^8+&zw`>y=5mtn+5T_i+x^=M`i=WWgo*3SsQCJ0*~GI%|@ zh{sO-I-WT78#uh@&3N0`YxdoY*XT(AK%}Oh)uD{lS9mPF001BWNkl29drmAv8MJx7tWCvR#FGCz?_ zK7eC|J13Eqd zxsnATi+|>M^Mg(|W(PJ`%fM?$hqcYq=NQ!OtJD~4Xn7ft5QGhYLMRhR1p>m=dybH%aWF*lZ8rBZzh(BTY|VKJm)?WUoxaXy(QXv~T;?<9 z9Y1g1hCBaF{=IB{H9h6v?UR?OIs&mgwUNNMu$mMgWyhZi03n`x?LXnGul^AZZeEXD z5B@j!#%q57`!}w0JiBav7t_4N{g_siV$qA24gm_Jn@YgJ&1<0-wEG;;#j)Pr%?7&X z0nfWW(KOWR^M(2yt*@)@H6M|fIFepU+0S#_O_vi zfIv0=UmcWwCH67U0J&;A}1V%btjToKI}03-56B3^d9 zWKJCuaCq-EfO1+$HK1H_c+%W{tOj_#Zu#_#+^gmLCVjKlBxdQlsG+OtF#x6jky;4- z>HTjS)%+bX03;M{ZcE@UsBH2@lc+Cchp)+j?g zS!y34LZatG3wm-ux|i;fw^^T^qV?`XUh!mJUEp%szfA*PJrKG+@j%o0teA+J|FuqK;tWj>}Szca77?WMAty1QrZdYxH^ zecr1nJ>$IBZM@RRt~U_@5n-1(fd7^>s)wSKLjVL2A3Jz!ziVp+gMBYvX0Jx=+`zA6 z((J|0!@3F)TQ54~b5|ZbX&t-x)l*$rTm@XV1vNd8zS?>-Z^BeZpJr|3c)js<%qGC@ z_&RF>Brpsh1SJ7E?q)E7SOF1RmF_57R2AFd>v-zSefY>{?!a$8^)vY5xsPKzJiqkg z>0Z1HE5{J*8tr$Dd%KN6J$Syeb5D=0414|b1)g^i0mK`8#0n+Fk^Q$qm8gyb4*<*4 z;+l_8Z9LQ@59}zc&+4Th2G# zHIMMbwG!u2H9qd&MeQ6?k%zl1WL{S*kn*Z6tI9}eHf+{?lfS%v<{J18fuf(vbzR-F zbFm7cMNrkmF12+mnv8zCL0)FV$Gm-zUe=71XzNZ2Mzlb$HH7NNG}yEa&}Oc?4%g?( z`joO^sr&N^BTOv~R@QzjBZ*kHK2N)UZGOoar^fsVvNC(NnjG~*n#(TNtV-MXV`p!q z+VLY7&{^(sTOFIX@wsuGg z1D*98>t4!pa<0hf+r;(VJTtVm9IsS>mTk1V@Sc0DD2nKVD%F%BrRhmKTiLvW3tL@){%A%Ilt zG@31Kcv%%0GNp;v%N?wj zeh3D(82wRxFFQHGC-0}`^wmD*_OjFcrfLLGlu6tpfDEpLui@F3AH;8b_V41ipZ+;~ z;gyH%cO?ZBNVCOdF4HGL3ZBQsK(^Uwyc=(Szv4ZRyzEe6?B2Zx%nXS-T#f_w)#BZx zkDaXL_HlMHF2nF$iU?4KZ~%g(ZoBEo?SR$`ZUYcV^)9jh>p*lj@qufwVs}8CV^`w_ zLtO{cp+F+Gny!08Dl-?z&?;Mq%XebCu6!QayASEvG!y79O7~+uT@`1Y%ux}%+vydr zJ9yoAS;CyB8~C%=p_c^(+0z5hS@Y+mo8W$x67!*rm6v8Vw+s6KPZQF!!k3@W%Fdw$ zv~6B2G6rBkJVK-)gcvVgcmgk-e*%B@-2a2O9sBFJ{n!uVz^>y^kgb4ATao2}1N8eXq` zHa^%*im5=l7cV>BN9|nkfVmehlYX)+g0a3m01!b{02mliC<(v;u0-eY#OZ&BCr;gm z8}_{$x1ac7+;ZsKZA7G$0*VTNZFPE*+H2$r);OhbQTE}pmlcqdj);h$Vk~uC2T0>; z`sePmo>@bws*TM=mmsjJ`a-y5DQL4f=vlp&gA;P6_s!vLjaQ;T*lz3z7zT`+kK7Jd zPG0$t0q7o9y-SFQR8`&oMo@rXRj^S=Bv5s`-XwMxkqDyIrXU8!OSzCU_*of$aU-sE zwUNiV1^i8cjaiDhV}RSlSX1jt%3P&M&9TdUk9PQ6G&ZhYmK)gl%Hw{8CYme`+lCe& z-=7d!w0)eZP2P5T-{i+&ZP&M#zTI(qe-`J)wlQtoL|p8NXfTKjG!l>@gc2ZN!pVz| z;pD}~uy6A^y#2^`;@v0izy|NP6}2QFFksnW+;iGLXkzo@+{XJ~FGH6}J+(amq*eT= zsw=pGw0Q8``?p0-F9Fl~rZoU~{mIgKGV6KPP5>YTL!inKjA5XF+5=)$AUZ?u5?g_8 z`;Mx$N&yIT%b|BMq7a5`^H59YV$vO@Il)Onf8gP|Em$954`=MUHfr5oZ;}&{)$91m z>+r%I>0%Qy$$WN}t0xRG`d9M7n-?D=c%S6Q$cvXMzZes%*tH-qtd>esM^FjuiBtv1 zC{!Z^%uv}%nt)!qavGm}@gw-vPklfB;H&=_FJ62ck%j;)bqg!Q zfNRyi7?z zs-j0PD`)H04H)s#*ZTG+!iL}nr^YNIAj7WckfF(RMJ}rs2O6-=u!R5`xl`OgL=o80 zy*z#P_wc!M58&ADoAK`BKaRIv{auI%U?Pyj`K_^)yAXf^KS5pwEm_bk#w5rkWdwuX zIV!wV+P7i|=?iG)({q8YETdMPJXC0y%hjG{$^2QhK642fsEBPtf(V=D0PX~t`v678 zn@R>E z(1fi-_kffaFUwCLy!f&5;-yjYp3t@cN|dWskBA*8VR_31kt_0wpb8iPCaD^DfvHdsWey9K{RHLdUfOXw=C@d*eRz+nW?#5{j?Zi_A10Zx=ORH2N z%VEx1s17ZutjK=9?ookwXEXjCfg#DYrLjU3tM;djVf^=TH|gYiBv7HwDw<--99v*d zt}A=HE9Q3{+pU7)&Q)W6U(wuCEUFSLe*fN$aQuE${%+!U`@1b95iPrB zQ{$TG5gJlM>1^5>Vd>T2OUe4l&ShJDUS5GIyTni{ZEyEu+JCq)yf7wBF!E!%WDY}` zJ#v2Uv+V%4(?qQ>=)^urojE=g@tq$Z@?+EE`s~|2c&QlPVkFRTx~zZ97E|feoHDLD zSB>f0wBTPg1sMsr5?;o`FZ~-l^5O^a)??p=w;%a_T)+PvNaz~liohHfdR+1DnvQBV z*XHC2DdwN{OW8}W62ieuhG(@8HaDr_9I8W2iMdy#R@UTwvGU_%D zYlDX@)SS0q!RRwz)dWl~2k42WHy6!)&#_}0BD)DeX!WiMQ-+R7m+UN~l6{>jeC+Y##Sh{l=v-C< zxS5P%JcpzgFJ8QO@v^4=p9}&BR6>A_t4buiwtW(hy!Zip`h^eTEl0l>-+aSQ;?Tx5 zu5c_!PI4wxEiQtJ8;}y%0_*T6#Jns-p)E}U7?-Y`g_6JsSK>Q5)Xs$q6E4jw>*o#C zIch(7OaGZKxqcHfzoYHPsP$Mh0ME4pdpzs?7QLRbn+RpiJ?F-EV+^_k&ufD9#3ut( zBLE{D-F+M&(06FPy}e2Rec$NnCkf#@feqVQ)JVcptiri!(MAL7rm=`C76-I(B{*fM zRN9)Z26QReiKS`(Hm{-}Rg^M=P`poF1JN}dNg0SwBTPwnNjs)JCqt!?Isf>j>o3jeop&StI@SvQCrDE2opHTTlw1 z6ab_k5|C?JsuCe0!spNZKAt}NySQ=xyYbD}{}is@|4!KMJPcA!3#MRu4B5O}Z1YlY zzP&5#Eu(N5;G@9#o-3rYd zU(`4$tPLnp=6b(mPIRvIGw)hqMW%Uh{k1vOniSa|TH?h3K_~)Y1R%tLjcZ)f5>knorU~M_VD_x* zWkKe8hn`XcMrQUiP!9%Ws618iwQ0%VbQJ|m_hZoS`}R@Yy)a;=XRwdgE<=%}gJwIq zW@_korDysX+Js2Y`sfiDFRKka^m_we;XA1Lrd85Mo2eKAR2Yg7%%@sGzXmta^*{4!fFn43*D#6ymBx*r%vI^XVy`D^1rQ&^hPN3uC8PrcQ-4uYV z3XpTx%XIDS3qT-I=#;ASsuKVP)Y{3DIIcPBPZzl7rnJ54Z_6=hq;EY1Q_BD?m&u9V zHzXkozF!^v&)X?o*!pPiAAAD2+zF@=zqI(h2hhE&G`Le0|Fu2A<^lBO&M&Q^E>h0d z3k+Zc9L4@rp^la^ufGw9jHNjz!tPy1@eNmhKi+ZO4`4SPfRF{vNh1KpHxc!+5RsIv z7$+}2j{Bba`P#N|H34*XmABJ#|0el+lV{E5;&p!0dVFKPZg*p;Ft{{NZ^4f3cwDV- zuR8<_n63lK%txIki+zALdH3wxRm3mVlrmEDzLa^_d_&W=Yj@TOld1m(&gd6`RB-&j zt@xS$;sdOzdjI`o?zlrM55NS~Zw}r4_wPDtSjhtB3tF6cqWP$@rD=m7Bm#sITh~T#EBPoRNLzEvS~-w8F<(!q1y^IfEa>`BVv&_=Zee9N0#HEFa#kA4r{ed0&3 zZ{s+W4B#nTyevog+R-{M(iho3NbTc)b!`sMMn)xhU#E;9VLT6`h z*RQeY5Nig@{Ke$P)9}Fb(qp07ss~@8+4BT&ufMMhV|)d>mj&C!X8KRdU0+^W2Dp>H zWcXF*G^I&+`F90sd0gD<#!yK5o>XdUZJf-w5?#WRr|-j)r|-ktkA4rn<%XZafsLan z>OxhK7MK5<2jIQbiq<*7ATDg3MhF7~MF6$=b4gCuRpt5OBVz6V0zv)0G_Gli73J?M zQ?aNh9+{T@D_7W~RNMB}?R}TWr{;J*&0k9kux-6-=5eul@5lu_l&0eYI{mIqw1`Wp z(b;jZ=f)gnhP#nce59_vPw1+o1n5~DvhMmQ1J7%Z$FyxMa$8j_p6lgMWwS)c@OJG(l30{SxixIRl5Ph8z zWs0eSRxoj0$ExjVrw6<&Fdbi!aZmhu)zLu@uzT_1#fz7^zF=j*^9ARtVvhzBF(87c z&pv?9oqY&5?0*OT^7TKB>s-T8LR=MSTm`#@7bYnVGymKg`tW4w+UfhanvCepr)z%fy>FFF7my1uGgC*X3kbXEr`+e1DKR|aU8yZAJTJd7F z0QBQ~-vSr`!V$n@KpCp!8k%GcpQR8P0+5ircgNsD>x%XP#T`Z6P@=h-iVkh@)Hz19 z3SeeGAbRz&u3>u#9-OYNQsUM}fE*`Qb*l=zbno*tJ^nN3@lQ{5aW!D#Wyc5o-j;a% z@Zu%$4Mo4PLcn>k*kBPLx*Zoqq_#qlRAC@^@xl|h|LLE{P5W=hd#?LCxN-lxkn*C7 z%Q`qyWgZjRaq{OO<+5Ieylw&22q1$OFFpl=K!l(qc|KnlP3eCKufR&&o!m&NK0r)`$C;&99!=6zKKtFWVF+?FDU;)%5 zw^sGZZi%Maz+z<+Kgua?n_a`98`fn#U(-e(Jv;$c8bt3y7h1Z>y4-K;%N?Eq>5G)U z>0DOBYF!T5HZ3x!>cbiC zxS(kYm+H#un5S&7=Ve`#iC0$t^DxHZ;-nD-0)-fR!dN08Bmtl>0;m~* z5#jvyOZdI7-h&T4`8VAx(x_$oqlL)W@)d;Ez z=H;yCE^}2@PCh$1KVOBu6J2EdLw(OCZ?aQ2GqiN_2r7V4#i7mPaU)B2tnKdV^ zG6n-6aKvCya4@z}k{bK>650F$3?l}Y-Z+DgKl{u0$YXyCkG}jLuq_uXn2yl4e56cn zMaJu=mkRvBB+KCBYoCEi2xj~DDq)htEy`c4N*>*1&cEz;o)?Gd(!S5DTRXAHQkOjD zeaEvCZ%c|BuD;!thAXsg1JM}msJf*n8#b@J4hVFI{-l{*4+CLVy>$pw}%oT^@EYX`^T5r(IvO z;V4Zl^sQT5I^F;93a&<7h#wtZ&RITJthVFF9&->NRU#r#{oQV^RzDEo9zL?~CZ}-Z zjG_Qa1Fmph4uDffan`Ler*9qbAo}_S_^WA*y?9v}>*9h)zlOXF$fm=$3-jXj$jch) zq$-AU0*q|0G7?v5ZXhHOiZCVzt}8$sAOwNgfFU3uuo#TTZ{Xn;=L>Kll9sUfz^@@r=wwzNM)06B_b4OTwqTUH*;0~sD)o%RgVxc*w|cj>+2_iPK^ zi>uJ!;xorb%PO|5llwbQA`{vrwSKQP<~MTRXHEZY-uE|%pOXe)!y_-%zDqfQ+=TtaK*d~I{lHZqyVaxY6= zRclA&b;d|C&4A0SR@L1ogI^I*YNIP`W>vaZeD;a!wJ^z9n?CC~>zI9Vo1x`CNlN?& z7v52Ff8WN}lq|Jmn9A_Q>;j03s;Nq6=Wgtq&${D&8KBv^I`z4G7S27n;K;^xX@gaD z&~uHYSnbKwzS+Tz>tRUTFd6q_U;EKyQRl$(mGO@2KQBA^*?HBcSh+j!eA%zEhGJIP7cXAw1^_i}@e;uEb&a{Y z6oWCwED#Pr(HP_KB0h2QgZSv<@5Li8d=%T!>mZ12E~;v|tu+F`cG?p?aOtEU@AZlS z5d)PGfDk|kQVZI~vHw69ojp zfnC?S(=qBW^m^cD?XBQj4*y~Rv0Dm6@v#-zF^jzq#nJ(f#kwq{x}4O-u^Fn9P}RGKJ=G<)v*vs_>0R*K18{ z0+uTRK#bFY_+&8fDa8_Z-wRr1nLG z-MnY90)O}kB`f2W!}kQLptxYXE)RO8CAj~75D28WUk~iM7Q_M)1@r8mcL`j#nbe4Z22Mb`Oz?l^S(fgSDK0tKeRJ2)R(RJSt@F4oo006>p_*xei7kKgF#fukj z$LEOZknJt9&M_Nd4CvTqhH5EU7z$DaL-B@Oz+b%h0o?o8kKvIQ@5NSl*~VF{36-e= z5Hb)%AQFi9GlA=)A8BN*P}>-k;OKh*V!`7teGDWcM4X|#P;JihJM;dlFGJ0hWBQh? zt<#mLl<&qrt#Xdn7Q0xFxL^iO&A`50$Dz1iE$6w)J)oGMiRZtvlRNH=S)f%8?miBQ ztWkuT3Kz(o4`>_ZPL+vw?1JiIQLS?zzs&I&29=8ECLGEdUFUV`ZO~A4ZVhzLbE13k z;>C-%%{|0qv5(v-LQw!R426Lr0)!!LXg+j242 zf5!k|HGndRIn#T|%W6x^nar+_m{_6$08qi{%g^HFOV2<#veoAq&f`AUkx*ZNH1}d# zBGj)wUnEx0bdJcUc7yR(P1L{3>hrct7u{m4v!6*-apG;O+)nFO}ASZ1XX_ z6J(C>yUjKgP=in-RPX-{HDKa}D)Ow!%k~>xzESL>Dj;rNx7>hfo~Eb^*UAAnAMQEH z(S_^uFrRnGdbkMtyUcggYjVOxamcaTIkE3H+<#wMZGN{q8gow_e?Hs1%04sTowC_^*?Gp|Gw(WHCu zl0&YtNnB=A(SkZG0bw1+2`wHJmYJ2&56FKqiKDD=(+&?>r3ZJCllA@ zC$P)qME8e?XM3&qlNKL+_twPDZb;n4})afe3t z-%kbr?t%(XuM)jR1v&_HHvr(+zMH{ndDazCH6Yo6LiGv0Eecrod3^UHvC{yOzTY)( z_!i@^{kquU$@LCSqC9}_#fuj&Uc7i2Y8+vRz-qv-Rpw#{fI=cb8~_lgK>z|oYy(jM zDgg)qw&VgHdFft!=<&aSr_TMZ1AgrH$VWhHp@9TAM2{0~R1$ph`FkNo5wX<~XaFSv zD1>6%tLFBRyO!n1URsXn%HTM|0newd#5rh)y9CekW5J!hPoF|WICkI`5I}d_p>B7N zYCk;H8*E}g<$w7d+IQ97zj{GHU_=m@$|`i~cw4IJ~I#3#Cj9y4vO?WIYkI4!<3YUy2IfCJ__ z{FNJj0&hF=JvN?jL!FMeqzx#Ozm!xjNqm$xsHo7QLAEETBsSsV)+zkjr+?f6=9nK~ zY?>o>pRe|-Yf(jpTL&M=ekUGhq4x197uI?aGs)su#W*_4bzhph4a9Dj<-hen<$B|q zoc`|My^}_+73)PCEP}28^yDU1=?}^4;YAn_A_^-F%uWT+vx~?^_0noEL*JRG7 z1!$ek zp05rYK%Zv6x(3ion>~5}y;gpq9aC0SUTFycdO~kBFaSM%u0&6X>}IZ$-J@OjU%&l# z$^DycC2GIPa8xdxVg<+c-3CDI&f^l2>9zx$a=P+DpOtDXig^|pEp*J=u|XH#Z>ik$ z9ncRo2`2kGj#AdadlAm6cb!8!p0A;EH&cssxSrHS%{bB5u^M`{00u8!ym;}lbBzCF zGf?l_yv$B~A{b&QLI@iG0@VnwZlA`-pZ#Ur|M|a-^6!td-Lg!!1h5bj(=j`ZTWy|g_Lrs0h01c z*EHnETpKHKY~Y3zq%MNPe^E}e?AhnP7bl;%q3FC-?#161pGg-m4pZlmmdn9Nt=Hii z=I8?e(FLBPyv~~PfP)t=UcBre+rMVOx%Xww;-cpI5;$&j0w5q&m}mr6+kEuYg~#z* zPyGY@))#&jCoesjQ1U4Njw{RsAjuZJ2~=rexs;cRc-=^v&nWQ6&;4I8I%-5EG1t9I z^6Rpkvu)1WwM3|AbDG|Nk@$j_VfwPg3wM&AcOO$&{3;m}cLR%ND^vx5;@bUh#U$r> zeGYW4KRHl9< zs>K+T1)8H?WlLS@L-?f&xjsZOc>d_AkKyEnC!rE9MmGz&WLG)rB66Eq@#Q?=`Lb{j z8ibjoDY?t~fHnb+}g2s8Q^r{>^cO` zwPmVBK1VCnIp6Vq6_cs;v*!x7$CESk1zx;(@v@fU>|D|At;>d@r+#Y~zqifnnV=Ft zID%5jl+Ci~=0hPt2!((l`24y54KvRrGYl5bS{1>2NA2siO?0j zgoj`FK)lcvULe)BKx;BL?Ka+4Zz=jA?WH41oSuwz=k!qCRG0u_KkAZQZTab&MU zG6Iu9^I)oUZy3^r2{~km8|d-iPgQ3lT+# z=|B6-zxo4?3-k{I%6Gj?<{wiTT6@}ITLx~RwML>@J~Nc@=!d=~uLC)z4;R!hjd0VU zZ(snpJKm1Hk2tMWudWbpkPWKfP8HC7vUm42R%vNG*GnyZ$t`&6dVQ-Xwbj^nH7@?B zeJW88TQFVgZ!xec1{FWDvV5?ZGj@Hld71sscn739K925IFKNloGt?8~ z#phxQ?4~Ul?A>z^YCVeF9dE*+f)@U^kDUz|pHtxP9VLtw2C}FiP`Q zY$ny7qV_YjWn6b{~hhyL41F9A8%D?r= z3SxQ#oi#Hg^{Ara@74Xj7cX9Rt~9k5CEw4*3w3PS3W5xEPe4ugW9=%`+xp%9&V06y zb>f)2PW-H{h>vUuc{<(^0Er5jc4(V}!T_+nDM^7>w@>4NXWoZMh zrH#3z5O<6H2bb#$)EBz6)Dnf|wvPw>?B%cEk>@{v?I46kX{;B{SU-*Own8p7Eq`p= zSIhpE8$VxNo7BCHQ$$KROaV3X$E<%K*5p(45%b!&c>K!pvlKsSpBK&=*E&N^s-Qw1 zowdS~I=~<@rTRfSnUA*3ODFCzMJF|jHPwj+YG<=D^Apb_gPe_>&sTQ6HX>CBfItI) zZBG+J_Ot>KA);*@8C{icD_#cVR?{ZUy0JDh5d9i^+Yf>{rkd-39>lVG8yE!iPG90qe5(Kn%< znr{~4wW>LboZ6n>I*0q8`XBMJ&;J}wU;bjc`J)k_072}whZgjn;3|;V(a3neTVKRM z=58Yb45)(KCdU=IhzFi|KdywAF%koq2qIlz3tpCDGd)FNPWKm0Z#=I*^DAx2_+c9m zO$(ICHV;(^aQ)$Tw7!1jYM}`$sB-PT+h8jurJ*7WadC3yligkEw+5hUVd%gChjj}M zt9HS%74EAL7_1`K+M=I%oj~+rclVu;ye-QTjNUrnY2HN)eECZN8HADjUSJ&0eGjpY&ujZzht2vL%pWfg z&(5#7Q(SSs*KJI~g==$0X9PwAAYu@2G*Etb3>`Qv`=$n*R=~bKIv;Mimew;_9@ZwT z2h->GGam5p;>C-Xev{L62F|@NS*MtVOXfEM44{$NTtRIGp)ld;mmkE3o_H_*;-wGU zSeXDJP3c`U03m>C1R_^QEda>CHY@cyQ+rMv?L(AFO#b96{~TX>?N2}wB>ASrHQea} z4LZ-2=go(gk=xFLanyOIF6e5?ACy-rZ|uk953k5qJH!aO9jEDIRhyov=NAwFtj7JB z5m5+G1ZaS(uR68>Z6U=UgA9@LQABiX?=4IUcVMbt1)XLjx(W)r3clufmLb`xRSrPA z0?(UNq4%=bdjQdUF`dfE$IE(4kqf;GzV+^$_wc}UFJBCk@`i!dU7sCZbJ9MS|J}3#;AJs1 z=+udn99@`_fR%8~-Z!;g^ju@KTg_-fotAGaV`f@>bz-f z7UC?USpQx72*1efBvPyAUz-4zx?K~!?N+a0Le`f9Y?I10)$c`vkju7tLjzzv4sC2CQn|xc=1vNeiUe0*0t)~^D3`)Y|=DdQzaN;L{LOf7>r@Wg0x@*<^Ze# zE^nX0Z-3!`!*6}zXL0t8uOK-$FRm%1En|n}HFl%nlcJglh*&BDwL|*ZGY{aQXWj>b zK>$n5OJe_5Rlx}DCdUqqhMS%$Z<5P*KE001zVBSF%WKC?qPrS_A?Md!-@ostU$%dq z0QEWRZvbY7fN|sDcfyjZw3B)q=nB2#&a|269d|$vZ`{}d)E-je$o(3MCKV)0^pT`k zY9qd(R3Fx@LifRZcfp32dh4@klCrS1JD_TGf0TRWv>RzPIwn5rChHDxdGX@K+mr6{ zf-;|wtu*(tI&-O|G286$E`q>T4T1@gG6Vq(LQrV08IfQc1`NWIHFxU`C70e8T27tlg&Eq}ZwGhEr z5Se{3?jnk z&ip<;_{4kh_{k4hltKZJfXF}*CjafFYPQJkGbr%X*B`)x&%O_&0v!{`xSWOwq67m% zqy|t1K|0Cb`pW}(i8#jqb5kFR4?33~rjGIotQ|$93T8l6KpcV*;hO!o0MOPBAgHsj z$b#q!wSNSl*I)G}M8q&;c}(FNN2ueQN&XI+gGJR|tDEW5>4re#BS#hYVrWXy3eJQ( zQp@4T{J_%(kgGj}b3)lrtFNFiR(N)^GWqQ8$Xm^wIVE+wlT}}V5f7oiNyYQ=7`&}6OMQ-<%Xgn38)H;>Q)x44pkCEwSPNWl{C+nE-oug?G@r^ z84yy&hRyaL)z6{R*LzmaDUD$iCilB$_nTO)CF`?re+m*mI5B#CB>c*D4BWMgKCH@r zR*glLf41!TX^Q`hpG#el#;p4l?~%rzoZPeQU9>R1@pp2+_u{3o$&Ax&rkEwh$#InQG7iHfn)U6

tECHMb9!1nke{`AFr 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%0AE7@;dbUDb>q-R;JV&2XcD- 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

kv?OF9>HmV*{0BKl<7H2QpYZ0QO#eVOua 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 diff --git a/spotify-metadata/content/contents/images/icon.png b/spotify-metadata/content/contents/images/icon.png index 8d147f4fb5df7edaa47e2ad598dc864018508cc1..13cc7208e41768e48d6d41c6f19fc4b5128a8596 100644 GIT binary patch literal 330067 zcmYg%cR1T&_kODswJF*vN{!a64tu2bUe(&8MQw@@VpSDI?U5>C@6}o%f~u-jVwKu8 z6EjAvAo+#9@9+D{l`FaOhwFUKInRC0eV_A0>FcV|T)TDc(xpo@8tTf1moAYFp1&!s z5`TH#=bA|TpnRil>V4@F71R0q@}<)=n|lN&8lAoi{x%mnGYDN|1zC(0flfmm8L`6Hn(wf-Y%BfXxl zF0(cbviN65>D7dn?h8KOz=g91t?Jh)xA~H4{E`F1(SK@$`;w5+1r#SF@7}5>j>Z<) z&)y$SQrC!W;A=0qR?$zPA6FFq4AicVe)F~=6L(HGi! zJ$%ti&eSs$TWt>F!)FUs{M|_QL-(@WQWndaYGD z^vv&(_iTSxDhR<}x*2yPb4m{fX;s4S|A2JoCLbm!iO$F@aCXOA;mvnPAgw<*2;;`B z0FDh<_W_=ILjFbzyZfD~G(1&Eo1(8!e**iNxT)W9On%$mTry`HHk`qlhk)Ca%ZD8% zakia;HZXI|Up%k`85}{L@ZcmwKJcZesWj+qroT&KW^xo`5|GTrpCz=|JKf)#EYIzkQI-E$8D}Y)PdOXj0}N&ciID#kPSU0 zIqvBZ^)fi^mDA?&E}iC?iV&^|DqU=KOJ?sF^6t25Yu={e8z(<21{Mwq?wV(rkanyY z_u#CXK#hzKjk~h7%zT}`A*ayMN((`qu9MDIQyd%?haiXM;?ES|1cG8!Eg}15R}hpy zaC0Ec<-@eFCxdo#AV>RoF3$^$LvHLN;0>bhXabfXGGib^*E3$WQJJc z!8Jv3EuebeiQoG|-6kI10guQL?1JEl!R))_T3ztGHxBU;!Zv66_^T5l| z1Y2Ub+igy{-yfN6?9IfluA@&D);CS@-n+@hcqs2lh}W)_F&tw{%nrqY_+XBzGd%T< zO4B19?y`{g+8EUXjGEQ7C&roL#UyZMjkDfJ?&5jh0?02uU5pA&NS`eY0F63T9k55? zuy`>s{BV7CVj&fI&%$ww`@>TzySbrQXvK{Dr{%o;H(fdam}zfDAv6-^c{M4;XXJP5 zgVug6qk!zYOAUe_()~E!c>ZEq7RIdmD}Iu1T`KBRahBofSoPNKrDOcz)44A^OLo~5 z-ABk?2v}*g*Vu36`B_LsvGA3BSA`67;>C6XJ*mOp-5PJ}Kk@bz*$J7-;_eg;vQF=2 z4RP??`F?g-Na=Tg65h#<3{u1JMOxv^caM5Rlkwp}LNoZ?dh4&*)mr1m6v-=j7&*Ss zt+{#n3Qn^d>&^e3_Yw*F#dH4{v;0s-HOtGvxbn<;cHwlWkgdxk1k^3!d?aydbp zHtSTTh7jItDK+V9|G4@r$H_se|CiySQD)2!*ooP}&U}1hsh4$5v|ST_NuhFMW<$}d z48C7iRvk=9wB7}2KhTONdp4F2i*!IN9W>m#zbTJonv3ntB>|(}zNicQ(eidM!Leyy z2(iF>bT%LFVV(30FMK%H4%xt-2x;wqBa3?brY*L3_C#lOZbYZOuQY@U6&d_IF4Mxn z+7`R_U3w+55+EHM+*4gK5rQRfQHc`d{1<*#C$xvF{XwpHcvK{4Nf`GOb9lNlQ|`O} z`0@;@2r09_c=${IiT>Nikh$WT%xk;e5|Ex%7)#IghSivhPPtL=n^SKKM>yjcWL8)s z0fva%U>`Pb8_SpDt6H{eN?5j1G-I5cMFnVh+#lN52RB>0tcr^`K>Rc(^;G6q)L#a) z{OxGKI^aT7x4qf6x?(@z(vChuG$TG}QhHXmS)OK*p9b`_sj*idPP5Lzj_(KSIjUIz z6GUHi6UJ=spEd+Ye50Nii^rdCpM);8O_^e>FEM zvc#41R7^ec4K&0dRVZ5y01XH-R!@MXd{yBItJg@&)(ajgo_}%jL5Asd4=6q)jq<<& z>AojDA=(m@vOVX&dU$U%UnH2Y6ukcx{Amyam-IdI=;*pkKvH2F`mFED8Zoo}^Y(wN zsNm8JjO18kbhD@nC;PF6OT8jY(~@-hzIme@mwHO$nuXKRQ^oI z3tbp;rx_xDi}52(wb|WFfyg`LE=qN5fq$V!0z-91?@2xNRPaT-eQ zw=)Ghehyc(BeQ9*0TZ3sA=q)k;x#FdcWQ-|*&Sroj0S#xSu{DU9Mr5N8K%T*Z@^K& zfQCmrAZLodVWLU?9h@raR(;S#XmQfI;y7g`mnb@Eu3a-Smm4PPYNzCteX=R;gyZg9kT;H!%me*5vp3)I35ZVu<7!P9S`yxpDM$*19pNi|G{`irRQ{Ib^X#%Qa_ye($8GS}!C_ z==O;$)AH2STDz0^o5q14k`CtO6d?%8B8{9pprO%`j>lyxcP;J4Q;sy0>DvOb=ls7O zoqmkIT!6Qk{CnqF?^yds{((+R)REkE(3=nQjrh*;t0!6etwkrdj`LW8Hpsi=m52{u zZnrvpnb_AnY}%P+USMbA7X8v>C|5MuQy$bVcI(3IfAE+C4&~7N+(pfdHOw3K=ClUN zD+_X1HE!SCoo?D(>JkkK-9RIgDm&sI?C|k-o*DU1CHq<=ARDWfuP`)KEcW~X@RDf_ zMN@m zb_Z&cTv$(!zWDgfz_{#Hlj&+9S|C;VI;V8_k;j<~oAgobc&j4q?Xv=-`~|JeO~nl)x`noh@FU&e561jm#w% zPFbYOFCG*ikFrrO*n6_|Tx?3z50laOa8a|xhsd?m?`<8s?048pNq*{;2e2YkL-?}X zw)>3R2IB5I%$o6dw1y=9{?^!)@3df3a_@gqw8jjv`^hw`0u9apLRz_^n(pNMz_7S@UP+PDVW z3;0IK-4ujHER7iVg+u38L8u+q9!ouxc>k3s%~IV^rK~UB`itS;(K+u@25dK2Qb2 zZ%BeVu(r7RDq^36@Y;tgHO+0=)C8hzu4q-c@7uwo`0~QwnwPV8Q88S}F3eMepbEmV zW;=Fgo}VAX&JJmajnix69-o!cfzLyMo)y6Ou=$sTUS}yxsjjT?;m)?-yGFi^D|S+! z+w&hd)wKNP7k2Re_91B#&j&bd`Zc55q!A%F#Sg*m#<#9b`l!fm-Yzmk_sTdlK!f-E zYk)6Blb>;ONw+`qlqlEsbQ9jJ657U%h&;8fYVQ!&0ggk}oVy7Nn= zsB|nF1G5m5P2TL_$)P$ZRmf6OeZbP% zlROoCCBC>bT=_V!AoBrdGHT<7wDgMaSxj=fUGrUKIlGJQ|G#c4bxT~19hu%j%Y{6%x4<$d1=gEqux$A`MEe-CFMjLdj4_` z2h4Hpm(&jU9uC|%z)V42bKZu&teygYB4iN${&DE3Mh3i3P~Hfclh(M^8k2;m;N+HSs&0>uMU9Q;-RBAG8D1NU0M7 z;0)4oF?E#F`b^K77i6yR31`HD^5Gn&Y^QN$!8QwkL zvMqWe+Drf}n;*Yv)fz@~zwq~Sl*jF5#USk>nP>At>lrHlEzbewRqc<>N^zYi%#Gc6R0JX}T3(fD72o+S0#uRT^%KKEpk~Vq zT%~fr6#_Ny6!g@ke z_1=gnhYxq~=S8G7_caN=$#S@vvp?4(kd)zw_ zkF~-wFR0tU{QknidVQS)w%RpX;df=F0J_^f9^tVEQfS5F$##c-^Y>H-?+JU^EGJhu zhf`(+ccse44%ybqvZudYOK9ySfA^W?L&W;?=wOwkk$s8R+8s^zs42U|7l~u9nW?m$SQ(?I z@O(7qL7J3S&%E@630!CW+?h*w1uQ-g`~x~U3b0a$WlSrSNk=qxLW)s`pnqN zW?$4~xle06SalYRSupU#+n}z&;sgUW&a0A2JX{=LheLHBr6nn z56k@GYTsl)KR*rBIi(*-QRoX)l#_H(Oj`}~^PVan!)@&#lN_w)G=uk6xF;GrkMADe zRzwQU{3wtLaWj@iUZmAOB={!axur#=;rww%QIwx5EL)AY=a@~c=kG!=u@MgF8MB(w zN;-LdS@@wsrv1XSRz^UoaPXWI+dJc=J2jdKrhJ1sMy@%0odZ<#0@>Eig}=;L&&dXu?!jz2YcJ9Shg>WQ`(=-R2~*Txc3f}`@7{EnAlBhi+{D6 zl+D|vy0GkD0LP3PANUW^U^8SWEz#H}5dKXR0=S7{mQ4I?qyflzJoV4{6|4u$0^3$ET4sCPBoURCq4_^}OK zpZ#*`V}D+FqH{_#*+c;-p*%Qf^b4ABIFha|v5#@k=>q@WW31uOx)u#=5{NKv`WSbp zmA{C8DUY4dONSwvqkdSb%Uq?w_=}9lY_Y5NfAbH88aqm#h4(3NOUyPa=dE{Kg!dn6 z=)Vl7V&DF0FU^VdU8z(_dsuwG-Ob4NQ2dSQEXMD?qG!3hR%UHMlVE@Py&c}3Q$u}s z@^FyMHiB@Q^-1t|v0?yBBSEhbfV}INs0ovhb6;~AKO_0z(-ogbVhMI@y$+tz$~+-; zFdAGW&>s3!2ohDZASgZRH1Hcnb%FK8SxlLBUNedncYI>qm?3*I#lAFZj%3WtzX{4X5nCI#LcpeAMc*{%X=z+ydo~N@ zRvr9(nV{)#tM6oXsel2eh30G2mvjol1!n6@8pnqkXNOPxA{B>`?ne%@qZsQkuIz>v z>ZxMyjlyU8KneU-Cl2R;Ng=1_<5U^*cxh6G?k9E2fnd+HOvQBB4T67Mh^`N(5(x*< zkN*M=m=QEa4?fZO^emB{m+r`=I8%g@f&_OEOOVuwvyxRN_7#up)UprLM(lD*9C}2C zGA?UVrHdWgl>%VAFQHfzxUhK!CsqxDST*=J5)D2|H>5fWRteWV_&p8Fdp=0SJ%t<&6lTd zYO5$b8e!uOtY|)Ef9JNQWhHsH3dj59-#e}jGY%&Yn3Y3IT|brF@0D#$EYy*peD4{sbsYI}6O(#&msQSz;i^fyYm3Rv#(zQ5vaY`RW*%}SoekKX*6!B&2mPd+32hp=q%)YHXKCH0PNq7& z&h?G!uNwneI@rqRIYRqa!f+;c+i4uoGtx*&vqECV8Nw&y5Ty*~pFR=ZjWKT1)U^nB zciO>+dSRM0a@f*zC(#M}?PSCx?0wJTYaZ^R`VOSG88Y}ifYQ?hAEns!;jWBig^3dPv)%rj5!@sp6yJHVU7^K2= z0|u9S)805pKV>|x_5V2oIyUt}u7A@<*EKVVok4fx+twoqZ5!8B@1{G$D^Pv(GpS&< zbZh6YDN^OGH-CNULa$5Zj}J~QIT4yNHumhBtwOC#wv8SuS8s)}#f&y+rvW@FJjc=i zNV5?`NN7VL2PT^K=@b1OZcssOe1IDatepvYJ>6VBojcyr08vJPjO%C8ITotQZ_2;N zqOB9}LV^KRZ6Q%m)rs4Qe^u6wChng5@jnpVe}<}hT%3VV?W0->=)zC71hp(buloRI zX`4bYdCHuAB($m@?00VK@A&*Os{PTs7fsew2AGpt8r7(Rm=2K;>3~(|1B2A;6T@J= zM;sEG3M=-^Xv*qGo?A9@XrmM@lr+Y@l!G8Yn}9KzC_-zDE= zxKx*)8BHS6?eGxT{d2!Jj*jMu!MNdbvUYJuBXSQPEG2Nu>$l{`)@tflr(J;vzPvm# zqx<8}LxRgSyVcmqqp4YR1KcJ($7E<<7%|x9joFtQEplh~MQ2iVs-Q7#N9jZU2a!uZ z1B^d3+6ZS?J9)sT^F@&CH)V<=uclte4HvC}$=(N@dZVU=!;}Eaayv_#kxgI72$Jba z{~zur`RtrMMCv8D?h^dA69Dkg#CUe0DE$@I01f9QY0 zgbIE&GqD?jABu9(gNFh9`K8*}x*lq)=`ny59K0MO*n#f3I z8lFNMG=L|(PFE`Cxe9!4zWR(ksc2qMabf?sOd_`~RpNNdvP#wVxd_*)JpVv85U~0t zLSvs;VH1n>LNYROGmi>n#9?-_{v5Y;&j-_&E`ntvyfFJ+*x6jxK*XnD*a(+8*QN=T zYmVKJKAn>-?f=n8zg#8c@LO0ZL=t^q)z#7;Xz|t|ku(+iSuX(~x?Atch~C$`Sx)(P z#wD{}WU!BeyUdm)v~&>?OELqr27|-3^czR^MA^rLi-(uNtUJ?zZSAvL(x(Qy)9W%l zm{~cdlvQ2Uec^M1{t;vn*c-L!vX)3m&PJkmSmWg%dfVjqJ?v&SMr*avY6P-scq?uU zMv*Qr(sPC^hCv)Ove_6=1|&t-o<4gAKnnDfm$-|GmXtGRu8{3a@|~TyoRD1)U|bUb zm0z#)D{TS99|fQ*ff^b)%^=WF%;@b^?tOHSwD)_(&SON0_TCS0sM^<)?P?bcUA{vcx2kX z3|>`Ue`G<+d#AB&LR2)=ssx01724{Jl`HyG<~Z^7@gn1y^vJ`YN-7|QPi<5n1@MUz z2SMtzF<0QPEy3cj(U>h%im`XG(*d~`bA|=652`+9$C)plV-KI{| z{b_1Y-C06kS;h_ISzozuEeWvJDk-{g?xv^7>uKc`%T;G;vx_qsFmIsmRYU$(XXlI| z2j)LUZZeCSs`v;+khZLOR*EQT_S4<$A5VuK2DS#QiZqBwhAfsqG$G|y2-xE+d9ZtE zrQE`}z);rud656r1I-c}%4i@AX#t*|s*}d+>raAo1Zp;j*}pV>2uGE)H` zJ#1n37Bg$z(?a?O49H20m^B2IhdjN?dYDWsl-dX|tD41^LvbvAvLhhV>KA0)x*&J? ze@xTN(QDT5YE4i5(R5dSC1b`3cL2pmhXgK6CU3B~!Jp1P+-M9_$T0Nq{~8MJ3 zyw4og|kpb;q-K8 zwH$v>olngQ*J%=ESwZbR_q|1sSzj+NCtQfj7pFnrndFSZQ=T3s#mqJ#h=KCyWgYWP z_$<+SJVJDCia{ddqvVbFem|l)*4BeU%!cyJ-x}Q;bW0|7X*jZ@s*Zk510sYG&ibkR zD6j&B;7um`EHv zq~HQ2a!xt0Lm}|ID*HOILN?;OZ1{LFwNHVESQQ>sjA#C?#V)r#!+A!^@h90YG`Mk% zmuqKvSUaPb(DoGc9jQW2hWDo4w(asXpHaF|04cCIeBh{MjsvIWt)Pu^#6stffoDb0TTkMCudkhAl0An5X6?U|-Z=u#cGpjF^F40B6)a*HI zcAK+cbZ?dGkXWOMi{i{1k`{FVIqSlh$>V@N!$*H2IU1i;DmBo&Hs#K$7L~^1UOjk( z3vo)mBACr12%%+=4hZ*C8fYHY_pX>Z&+mVsBpsMD;XT*Vm=-e9E8GLv9H87DJ2WEe zLYwNPH8&5$Fw%41)-6>ttUPQhzFaO2A?Li(P|SBZ>_Ce)+8{Je02} zfFs}8NoGbp9h1o5pxNl7T5QqanYU-Ix4*&~ZGDMz1A3pN%~3(AVP8CW||zj)LflrVg>0kR$BVd769n{K-bTK!?IBp(&kKdVn=~3 zSS*gS^(!QiTV5~K0*;Wh+=Ty`U2%Z~cLhLcxtWzTId4~jh(mP#^XVd^dZv~OKiq0k zefkOW*e7BHFSz*ID5>^JZ$y7~cGYeYx`3@w`1t#jXo59jSJbYx%OhyE=0~!bV$MjY zg<{U0vhi~tVPbj_d#yc6?6ruuX;M6o``*aS^k4;&QO)DT=}iIDwcQBcr_a7*uXrV4gx)VnB^CjR)%Q-OU?zb%zPA^6|wO381x)%cC zkKthQSn+xz1jSQb86;|{dCYMaF}L7yTcS``p~wT~w=cr>2eo0@l#$tZz;k>$emrRK zSsoMZ|Ioyih-m*#0iS-}$gFpD$4Gh+?7qSY&bMZLTdgN8H~SYOo91W5;v@^6{^d~? z9j_=FhnplVDbT%Zq+n;~Ky?1Yqem{>Gwz{KorLubK%_DmJ-RbwJUZ$CObJZ2{jw(3 zwnhq0Gy=;fRy73MECl|c#%7cM0B6%)&$4%6mmaa-0~r18-+q#K(v+b_h?j|5z= zrh4`Xh*R+;ssDnR&9Ls9t!@3GMUCWVDEF$QF6-lL*L-z}h*^DMCtD3pl+#`j|5%4% zK!Pd-tErwtreLjRKO57Vgh*NInbqH5UmW;UV2 z7q8T)seFFC(Z?Uj6=y1NWKL-vv}_ZXaC%-*pwohD6J$m6F^H7jv|AL|y6R^w0EsCl zce78Jht#Cfq~I(v@b7mmCJyjco`B~hmWRjrRU~p|1(0SDjb!xWbX`;zHFArW4JH|) z{A19!dZm+fMY&?gB#UDwROoyZcF~)b%zMD$&*sfoOe^+K6RNQ^R}0Tp&g+u@_IB3k z!Sdy{{ZBOH?2ikcn)*h03mT%*D1kG>Mbpk{5sZAxQp_dvOJ(oixj&#Ck5ml^dt84u zS<3=*Z_)J-!HS;Ch3FL$5Q21@ooT?m4W3B#G7aO82 z7b*bYV2$N|{Zet?#8nq*1Xr`)*}Zkt^>>-Ah2Jd@7@C2+7HA$*9nin3t;}8<3K@Or zZkSUX)Y>vU4Sg>qV3yZ?_d_z-9*9;V#m~{{=RK#8Ryd#<=32dmnhWgI>R4;fH^q<) zd(xH~<*==(>6QE5*UIzo?x4&Fpz&ygo2Z>_{0`xAm^0^>4QG8&dP({5fz-b1cg?K{Na~ruVUL{ z7WLJ@=5?JRP^=lG@TfR!j*+Nd-pKyw=@&UOy_uD&+@oyd7S3CV$|!H-J+4EI@Q&to zY6qS2Ei4iCG=QT1TmK08g{0E${mzWv{mee9VCaN!)VP;RoR!-Vhu*VAvF@XexG28C z@W-s&Gn~H5FJO&qPZQNeYu7DM5&qga87!B`NRJ0{^%6&$oPA=BxpIbfEg+Z7*LP(l zu}O!%f?A8W*_YQsUX&YZhg8?~24dE$vbc(!NG!+68XuNf8j%GgdWWt_6&r^$+Q zChy%)Wz8j%H-8-w&WfH1zRqHp;EXM?V}0c4%Z|Ty6RH3}OY8osU|_WT?DB}_;sE`7 zgfMgmFw@6_Fuyz1vKP=(wH%))ti}0~O;Vso<+}w>pVMxp#-2Voyu^zk<5vxNgzB~J z!iLX)YQ;-8SkMB@qQ5DzuS$0xKaJqZdKy|~JSzT>0{z&P75$okpJdu`vB-%W@+a3~ zX0$9MAhxC2eM3cZfm`vWGAVK1keQig&Sfjub_vK;?++{TRFWgby_8MH5`hbgr5KPwrxki{PaKzc@qO93lji}xcm zH}z!d4JXVfb=)jb&yDLo(ce}f^<%kwH-_oy*R|A*>N&R?zgu57lQxFFuk-4R{%ivc zOlngoip-8v7^hC!-Ltoi1V0a29Wu1sfA=yP5HHE+AcZ%+|5uP{i?%AxM996X0!Vx?eRqx*dM`~t$9RY0!ZOxicdm{bBE z0r5WtOeH-Ihb_-V*!K$%mC0FTei=(Oi`b`12=(!a_}ox~oI8WHD8 zDk)u5*c6VFIRR1+A3gB;-o&~qMp0y0_2UHT}9d_x@^|LB!k>E{I@Q?A4 z41k9j1W-b}lstdz~a=)F*xaywDNo6AYNX}}9yU$1B%Y4H9iuV7uuqCFE z{$F}K^{9_CIN(q77EZr1S^w=QDiPw`rH%fUjd2C~>oKU~2gVm_YmjCO zaZ0RG$|=tb<7>JrXH}$DX<5dAekD$mZN7MwC&Hb(W$tDrd7Jt`+a3w!c;jF_51W8! ze-C93)`{S*Ms)4Pb_9T3_kkrhf7rA%WGlsDo~RQM#h!(C2#`$j;^WjG;r=p%sTvX% z-2U<&I^kN+Ty|xVSEmk0!Jjv}Gn6In_Qv#hk7TU`ICCK#7!4|4Xg~^_nT6DI%7a3* zeSYy<-|4}liq8TkMTQQIrql5`g&k_OP(5b|K<@|#PDbmvNDnrtXD41wz=3WKSAX@# z2Kl+x$;*oJ4y!z|G1Q?FIKL%w!3|2R$-!Sv0w?8mD%$*lQcwR9uMPxad>axcrx#c6 z4*AHlYG&15hu8IJYUMyif~v&apboZfQGoaWON05BwmMo2p{-rJc8v|uES>M)?4l%? z+R|v-o5#rff4`GETmPiq%?`Wwb;ZreOy28%XwbUs zAIw(W=w{5*Kk>R(Cokq2E4W;A1~|l(w~#jH9Dsaskm)d^?K1tXn6KM5qRn0>i?!0d z)G)_klfsH>SN6GnkxynZEralj`aDrC8rPDy_eBPuNsm1XmS4BHoUfFJYBDh?QWy1# zyXPfhD2Gbr8@xMk3>L5~+f;I>IeimTNp?Jm)XAgEm_@lJZauc+iWx!;?%!?k78~>z zksf9bfzpo65q*8pQjOM-&#*f2G)5_KHTuD7xH3^;!io+*5?{-Nf}0a`WF;0RA1fPvrXbcL($Bz_^{w z22BA=qk^VgsZz~Q`R*n@6X$?Gp8!zqekoxUwVy}<8XY}=2){S)h=U(7vLBOLbLzNp{k z%Ej73xiJNF83Ij3;k18#hp;cROCg#wquHj}lGtmM|va zo=LuaIT6Y;ww!w~APp?}|3EDCbjw{jP;5YgFLz6$;qq$S>~NO|@xp|HtiNdU6G-%) za2Sm?bcBWuf@Vu0#f@ECGpl>iKyCJWn#9UR-Ep>RZ=ho{v)Abo7L)k&qB^-fmj z?PnIWdg!=dXcb|v-?yZA#z|~dNqxjY^`0g+i4?ryuWOJ48OyDz94<7)!8KKKMr4>! zGfQB*`WX5}*O}hsqj%U=KdTCt3A3@pZ#Yh349-dN+X~=}m4>L#)_ae5W>~*(vGOa_ zX)JRZ#iaJS=?ynlJU%l60BIKH8rZy!cB+0()as}yo}^2{)N+syqWRwUF`|o@*1ow9 z3%>njWn;jyaX&<1C!o=n4BiBX2%%EAnID)U<9l~4Y60U@u~wXky5*@a zZne&=W;gHA-DFP6tafUCHvjg6dRAXG*?%+GPT}cCac1K7Na7aXK=JZt7Tm%2ep|cw zPEj!p-DfKco6`$dtD7_VhuF4k28#-J5v7$?oxsSZ`=K2BfhmDsv_7pvQ2Xl=zMcMK z*P{RQUXx>HeQt~}(rbRjXP#3|_*hDbt!T3@QURxjsr@DmkYbdJ2k0fOd7{*Xcc&8o z<6I;8V*qhY;B3YgvTJ_5KP_9Gm0K=BopW6)`(PY?+T@@bA3GbW{9np&$2urxE`X!L zo53lIm?ACnIYx0KvA?dIv1nyJd&zN|zLPw{okLtmCwqNU3Mt29R11)JvR&&)GV}4C z1VpwvAAtNlfBSxCEtPUX3D+PI6rQC44ta5tjOZcmnNzY+1oJC@@?@5#uyS1zxk}EN z&)0E-oQl1uH6WsyeKp4*c-%HQ3ix7kVT^jWUZ~B*P*oQCc<$W1ZxZLlZJ2(j)FyB)#D!A$!q8WptO~-XY2ssdr`4awtkTqR zg;wR~b-M1#ng@Mby0&L?&Q0T4f_3PoA}vU4fa+yy2}5F`94xE*n#EI+u0|?3s8TnBjp;oWQ zo7VUq-5Km)Gp8ccW8FU{6o$j!Sn+hlK$9u|az zXd6=$8dH-+?!GSlM2RSRy$Yrc;eS>TgMW#MqEUk!dP+$zmcdqe1<}BX8peIOZk5yK$9Ll;;vU+dm|pt zd@jm0C1rY;iI3<+Wo*4_O?$)3Tz@h>%aN6IrY~X(vgLs6)Av%OI5RxHTIU6<+P<%PbcVQ86L!9g@JvNqy@!l!u0f8CESKxvsGP!P^CMYE|RCstaNo ze$&kBAeShwTdUu7Y%vh~{5Of5&m;38`a#(Y|I}*`A?63i$x9PVsInP^BI%}pI@CFp z`<;M`z4GLPL2h=WOTO*&#+-+BXT?6IZH?aSH|>7o+)M@Qx3Yu<|G0qH(!*?01FSvO zk1P#duVq%aQ8@Lwl(V2!#sWLZV;k;H_#EjD%fPZ-WfucYDuTkY(7SLc3%3tJL?pRr zJ3dw5y(BD0d?c>!R+cS1L7WVwr>Wo+T)o^ki6p>RIEctVD&2PjM{Lr9WV7!e$$V+A z#U`OPqlmjM(t{)Nb9R<71GzaXr0`p&OchRsL0-g7KjN;S&qG3^gu&4G4cx_A0iB51Bt+mgki)D|h^N+t$u+>rU>v75w$A`k&8#vG|ssQ`*YSnwk(`a}4 zb?AV-zqv+c*EL`&P1WVlDnTbJow=q-fId4(OYh5^6j^3^Q(ns|uIOmW+4_McDl9np zU@r@$XqYzFQkPrs@_SdQhYI5SZe-a-CkJ!I#cYr`)fPW=_{4*{zsHx3>93jHBgfGwd{xRWR#HsYKV0@VT617r z_D`I*^kG1&B(1LHO7Jw{GkOvp_v?7q>I&n%l#)5-~I)4*}5N)Cp zGNXIOokl*>z2NCl{=v=bt3Iq~+%Wn;3;Wj=Ka*m967rLTi%!U=yXa*`rJIDPyUn^4 z?lUJl;h_{^K!5?{26h7SoZrbjr_r& z1B_-tm*`$rFDvfDaJT6VQSKEf|GprCES+q2azHv}q@J z8g3-3i^&Vj8GnfxkrDKNQ?NM`+M{wJH1W_e!8!{bKe%7RDjWKL4o?TL4qNab2|J!B zrLbD^cd(k_*zaE!-EI+k0eAScUIy~e9fgb)=K$6k@c6XW*F4RQUO>E~aW@Tn>c)un zCym)8k@NTtL@4GlKb0>vu6!&Zqde?uO66&p9a3I)HBPm7XePSI{wYE^Ufy>bS!HcFPJXJ2IziFV!-Id~ ziOTXt^Q_G?aD83MK`w4!G%+SVR=f=qM`LvD;W{1trVpZ@bjI<+lKr1c+Ug0>^^2IatJ}) zZDi0TJ>2v{yJLafx*y29D%7o!}oW8FkA>J_;@s+-`o$lsgIKhH)MWKqIq`j8?IwO3Rt1&Fhr5&ls-ymj_s?E8YHK}Xe)5_O z%rI|dl%p1fEwNR%hyLKRC6w%?cC(RveOw0As5edXRxtKBKf6o;8wybi*un-84#UxZ6!eigl()bj$ zwstjz(^3?|vWHdhS6XN)z~Qrb(y%{0y#0H$*D7^$B=%{kDot`&D?LkF(|7}PVw^(V zy*^o`yCnDdj=zY4{{smbtJg5^EceoJcb8M36vF(Tj%nL5pa!o8Y1ssvk z^QBW6ZX&86X$GPj*gSNx%=}<>eueZRKd5i#m}+)nv@A^Cj4|m!o4sbtb3nxdhzb5V zsa?v3oVK>MP|=NSkD3AR$)Evp9?x9)?3ZCSik~yq<;R7PTJ&hsXO2$qrsYFt9~e#$ z$F&E8;07q~Q9feQDY|!Ve1`dtF*Jd}Pf2v6KhiOK&)pgocxX zSE5-*lvMXBtREldO&P8x2@NNYcbT&~%p_=L%*@=s8b7?h-%-v+nI*$Bwk1S*cNpc) z%^q<3KT@5|!&r{ivys)Bt}4U{+wQqQK8+EiPHjtKYi526)7bl4J)U<|J^00wlqRdEnE`pU#6;=+Hu{D+S-{ZTNrA08RL0^b z8CZ(DrCZG0GEbtS%FDo#HHCN3XB2MqRaFS8tXK9X5z6V?T{Qdg#J@K1Y}zG3i62j% z>;2)qBuME&0*dJAa{(6+LK1{%2=DcV4cnh(%PvggHavVAJDxT@n0x&Hi2Ck$D*yL? z83~2VBt%A;B_fWIy;o!&T9jQJ;~XOrLfP4lJrpqQdy3p9hSpv}DdM zWx26%sE+<4a-mH;)V@4snh(cmSrjk(#AYYnIFlOmPMR7OL`U)p?!?71y)Gf=^Y_&F z4eFq$1TlFUurY?l#zJh&Zl0w8=0=AT&-s{DoxC18NMpxFgVK{BO3~wpy*sv^Oin)! z(ML|)`y(&gH=_coc(ZlHU+bQ}mqoJS=y+8`rMADG zUuQ-+le&mx4I(bAw>-o4K^du>v;f8G6{7~(KDl@oBnwsfrj~G?H zRI`eBRZG^TRTe-ytdz9Ql#CxVy=LVsVm32pi0+)q2TK3l%irUS`&g8MdW(Z7!5k~r zLsAxc;F7DZj4VK%pF{w!o4%EG`tjjJrae+}n_Re!i z+!y}5#Xg8;DDP{dQHv6-J2izE(Vwyf*fO1bPYD_G`t*R05@UF>q{&sM+|j5x#e@4^ zy9W${)wF*Uu$nqfi?FTNmKkAe#gK2jK;b`Yx{oEWpT5bLIj*ocz=!c#e0AX@!s5o= zA=)=PlXBWIuY&b&8aA@A;}n|eO{!`%a>N9& zr1F{m=sIE51FvERjdVR8+K+tT^I+c=r$xT58L!`>>>Cda2O?(|m z*ILLoSPW8H4?{8F;?P#}JMY>4_j4Qedz;P)j5fcYl0^fKn>gM>Zm-i2Db&i_!*loY z-|LeXw%e?uK{>1FEA1W!z^p^d+^R`O`9l4gZUnl*> z7yAOMsxVbFDbT9)1?LK7J4=wUE+E!Xf+IDmG%1zli6uhV%zm%wkyoZIcal8JE zR))@h+?_1v%dVVHH|MKZXW~7)cD8BH+*GMKOZ#`zyG3%Y<;)Ly_Cb%ChckegrNrfl z?Y8pS8zU;p8-ed_FsPKXnv50ulsa?tT5V`-|umOZ02ISdxc|ufBvh8 z((Bm|D@;T8M$o&(K}`j>$dh!C z3SDyHs52R1;3;yEYu#TLa&V`@fNdwHo+-PZ1l@DR;BypqBuNHUs1LCf#`sL{R#+m+MjL;M z3}u?xNCS9AKa-RF(LK69Z8=QmE{4XgruJPXK*h>&GzT9ndJam7c90yjD?jF0N9DSY zq%Heq?*|)K5@O(Gh4Rbh&{S*Bbt9@fq;_jRL$rfj)6XY9Qi>^?g4&YGT5px`L&?*j z$}qpHha&%VqYznPv}RCDUF>YfKA{E;J^sD6{_=^$0c$rhGx&!iY`A}t!<8B}^zrG% zQo1|CEI}0_=)8z`zqz+3^vdl^o=NDNo&)}uhA@9?zEW%X?f>!;s^DyMNNHHPlMhvQbhW=ht_m^Y6Y z!i(t0>-y^usE13~OH~BXsBDFq;8W#7$3XUt|O+~YT z@U^S64>lZF7=B|ZTi+;7$he96W-&O=CcL*=W4ao}9aeidMDm5>E6n?{_2i~sSBhfV z(L7!d^ZMlb;t}FAbe(V_FQtpa!gM)AsTyaLD~rAP=1qz% zuf_BO6V1qu$`i8m^T4(2yV`bMj~d=ZiWV`D)0ubl^Ebz=)&+)!6^8b0s9|)jf?#zm zpNkxW`ZxdyWiM(fICz&;&UJ%}GJzBZJnr8DR>B`%fi^VZeBvtbm}kZM^D0#-LHv1) zmFM3$oe$L=By7+4DQSC3MPbVi^jeK|xjrSFk$bhFot|?xrdSlSZk+AO-3XQ;XOHV3 zUQAqkF=0?9G`MpCl6f#l66&=z>w%WN0zXKP^3KLp+V?pgJ9NHRRq=nm{@5N-^|2CS zyZU$`)>hXK^NmNY?wZu{v)9>?A2JA9Xjrf%Slu96b#I>74Kqg-SIiy9lFz3*EHy}~ zD4YnX?J=n(lA1u(>T`H?V2kq19eq|v#1%qNy785A)XB=gI@2H7cS7ng{9dAayHX%9?0;a;XBAG<4Yv-069Bdp^%DU(P!F#ta`YnI~Nw zS{FeMb-z|u@Dk;@1&CGu#NRSkyEGYmU)&ZsayT3HigX3KM0hblnI;*%;+}5cwf9#b zy- ztQT6TUz^GHAwa|c5od{zas61T3Mj=yxN1`atCBIL(t*`Y2Z({1@}ow8E*HcM+dnJ- z8k6!slJd9^Hb!Wmt}1<0%4L9TbyEzkh_zwuJ`;DcVxk!BXtSdM&5*V)SgLtv>0F4XvXjPR0Q6}acB8l5IEtS*9LSH*0WauJRKyR_nV z!;1kIu71ufA-A05B)k|}6Wq)4I~A>)8$6?*SI0HBv1W2;riZ(z%~1yE&bp&m%8 znQzRd6_m%X6jP1|c$Vv78GnFP@u_?v%wFNi2M9}vP4Se#j~K?wmvr{7(nB&M-uL4P zZFs+DJa`3a*jHk-E;(QJ@eU8(v9eF@(*Eq{vR5ljf3pNL^j@6fwk(c=Pj!&rBs|PJ zjwnw2)&b;5{QI2sUT;8V`Z*$*=nI;RaWcKe4kuS_e+^0aYB4-{vnBTKzH#Co&D;8^ z7d;o%vV*1{)9pwP<4ud{$@eSNzz?-y374LJx#YB3=!?M#V|Ma~NIrr#XTv4lodb8O zKsf_7cd)~8vttjZ%xYBmrl_^sBwe*jfm5-qibVm3h+WZ?MQJ+Jo;K9pQAywQOGy(f zAGt)97HL;+pEU>bKeN?7uwf<4UloPEf7u8K2*9kiq8i7;lHn6%TBtg1hR2QJyzL>` z8JdLyN`#eAwuYS+&StK427>+D_RS$3mN$%5;ckEM0fFd0zy282daW>j;l1?VyFo;| zq?G8q=Jg*+N1Z7MKeqy)SD)AS7Bqnig$<^a)v+X}s?_Zj~an4dTK0IgytQCSkdJcy&Yn1S6SLm?MUHjWuUUy7y-Oj!a5FwM2&4w{Y zrDAp;L`G5-2|95J#N_;#D7AbM9tV;38%oDdAtyGe;>3`8Sq*1(4ccznaHq>_)?@Ec zW4YcOzQ}=q(9gWN5d$#> zzOMOg*L_eA&&Cp8@i|>yE4RdbEHXond`SConi6b(JCmKzz0|TY>peQ;U9oK!rfNL- zLpUgy0}!Gb3n~}vBwoWik(w9C4QALx@$1WQ=cER)!G4;Je32gyX^x|>HjcOZbB2jt zRdac!rnHL8b@`;v!@6QEYM-1$=yF187~9f*s}S3+G&G=x?0i8km&@VBlL_<3s`jBq zn@%&0fwa~wZK|l;po^)5r+kab8}TL07-rxh&Pe3mTeueSq8RBw!FllAnRNX$vEhB3*KN}kaow+{-+|^Vx;)5j$AnU1oEbF=slgNt(E$`Xa6V=~1Z(|$ zVdD53=Th*MURHdi6<^Z-jT+Y(7#N0N3Amqt;`r;rNsMFZJ)7KU3|&*)QknMxoY@hfb?|X z8YRy^TmtJY9;DkT@A=*wOm5?p&x_r06v9|2Vtw=hHGx#lUd}<-7&o(?`ecDe3S$SX zdtww)N5*SH^8`k^#DwH7WiI`S$q}~HK1}<$L8|fiKmSO4QAc>8H0pV&-~4sfWw!^D zoIVnlE*Wv{AunyNx1{qIY(RR=B=_Ap)jzD>Z zEP!JElFObGYHyC58hHTDuXMzTS@Bx0+)TLln2l$3mwBhvIiOpAY%$M88#evALsDIf zPeu?sOpR(wskTRq>mbYe$VQLX-D|m(23(KZd&^Z`^v%?P-gxlQ?dAF%EB}9KA=;wZ zE*O7te-?{wX)?OkMy3V7i$3x8#7?))*p@#6Kywn_(ap^Kp82zFyTxB+;*?6x6lu5+ zlduK}O^q`?yHy8mk2Nz$YkF9$g&5ZszbCdXUuE-Ir534oFWtkH7ATQx^KQuQ6qNiYF_+C5ed_yG zA;@oayR|CeSmY$b&3;;y_sWmvn4wD^r;odcipFIo36UrMO(rRcAkV9;zeV2$O;uMI zBBrdcEX->(5g{x3IZgFG*_-{U)^F`D!Wn$mge@6B^;t&jpCk$c23ZgLQx)^#Xq*&s zA1eMx4O%O=x+Pq_L+6$KR_PQ!Wgl8M_w&!B8~CWS?woM0Si6;%(u$RbeKr1m>iVNJ zuEbywt48`%qVeQUzkoF{g*n~NW*v{DUhP-#Y z!H{#qa@qre;#)->=Dsf3FnDH6_is=QiCUA|gf;Q|&Xkaz=he;fB`!)bw>KR%0M1Zt z1`J~o-s@=?)3P(^3#i@5BUDn#ANY}fPhMej*^0*q0H3Rj9M;GFld3VRxOEwI?FBOG z()q!=;&+Tz(^Gz1SmuB0g9g!UDbSH)8{Y-YD*FaRCO;Cx_(YKp%u)H4ZM{8#!*n|! zy!6gIav$&r@OWrSVr(t8kh;L3dpwe_!L%u|O%Jh|uXV)y3dqLpnV7d@WE2?KG=1_S zclG{PIa#TVP5w3s;kps2%6lB4L-qcr-w!!^0bfupjZm4}RwACq)4y2debFc95Mwxv z`={-|NyG8GP*2s z_zo~y352I$XHOAWU2?-4`Rb(IgZXHut6hV$FSkE`u3&$LQPA=UJxBz_JJe=q}Tgn zpLddaC4C{fD<{b>%oQjInlfobdC&OB6sIfB>Z*Bw1z*(0TyZGKd1Ji6YV=8^)eOtt zeh0>#=1SE~XQ4cCOqq}k0w2Fp!pS?rvbHNSLgXKIXD2vE?fiP(21Fu^l5Acl%!+Cv z%Y-oxg;13{mLC%dKJh@`fyuXYIR1IzR#jIb*Oh+|7P%>)&-q5@=yqaT4j^p&dzPOY z-kZB!k`C0hahzE@K+yAHl6ICYQ}$nJqU@XuIWn|X)6p|56~x)~!0`@T6Op;8kQx~= zX*Gdt*_{4%-ss^b^m1rr(dP6A(6~_l4jp-^l2m=&SWnGJtp_?w4Lb=Yz=VF(U6>Wj zRo?$;afd3jQX4sCGoN@bPzF#kO8N7w(E+Q@kV6_6QfIv71UDVy@vK1K`jCRZ`{AAl z4&2}!cIlbYDp_*cFwA5_L2|EJbWZIhY5~?m^urCdv*y!VQLGE zcAFa$Sor&314o4lzZTDWxr6R9ha2Qd@S4=Qf5YtU8XkgKc#L}C(5$>#hxZcemnpUz z9I+t&udH0#6(83cwGWOE;1*T9bBfdN4br3#+K{P6FCH(AV#QkkGvRit8(^B^cixe3 zW~cOFAuJ0I>l}IdIAM<@E8UI!%F3zqkKn-F})8G+VMayB=R4 zh|c`3fVOyd*oZ~iX(Cc(1!asK^{0s>w?~E-NZ>B6f(~zBtaZfYM+S-oH{*l=Cc))B z7^nladZhMS`3!B(%~ampe}4j)eHu7ez(L^UZyFW)xE5)2OB%e@@WKv~n3V5hlzT2OBl1J(1qjp-HTp~8 zXX6*-w!OyqiPrDA;JT0RTVcna6FZq$Jtx4Qb4`+tfb9A+kgf`)t;P!c*blKv>zfG# zz=_RBvmIQKkjFER7a`Q3CbyZ=pF;4;?3UXm_e+j z;1wdmGm`O8YLvKkEn`7hovM@qHKfXG0pvgl){caF#kIIdb0xyu8T^&NE1EPYBlF;K z5le)~#VZol2>gAA(o38cwjylc95yi1gg9oP(mTD*02#S=14@IMPU3Abz8W;B9UB~L z7qrJV<6>C%hlPD9_VCe+t z%xjThG%8F@u_oqgIm3tm1Fm#w-%fYCtync~N`68B0~GBYU*`r?N<^akxDa(eGXZ2F z&nh;M=do9%msNIwj5Hg3SO0MRrc|QdcoIdVsy2;*?IFgLJ0hOrIJ+uFHB}Rat5L3; zEhq(cI-WO2QA^f&Y`QtAz?=xfcB4kLLhZF!lqCNoX@Aq!gUEfT587XRzKk>O zeJe6B(N^N~<+%dW-H%E@V*VK>G&w+EN)QJ4n7TKC)B6}>hy6Fl_9Wg-g*aBc*W0%D zs*xbiRo!gjPk%>dg6NKflj0ER63tA-ZSj$O5Ly%y#Fgk!46>`CmgXNEU?V87{I(Xg z*?!beY|$FhpyY3U0xeU>g>S|(fjdb)fHz!SD=F@9f73-;2)maofE{&&%?hF#uX3^y zn?q-G$qG7T0ZJu3WXye2NH3w#J_&TvufmGjWMP-Ut(EvJFg}q>SN_;8_Ft(MeSG8f z*kOCX3Bp9-mlGbBy%ai|QxiU07%FoC^1A-!HQ#zV2nmee#+Y!6*^bagq};+-nBi+d zXaSsi3O?XswD&z#8FjVWX@VD{lW&%oX@^$c_=uV_3x&h)8M9_F6F$3r1@G~&xlk%) znv8D+ILL+a`WT=mW8gHb&Sa$&eKN?ew?v0*mEe)CDiu)uGC0b9NLj7-l|`u0@_vw# z!iQug-U3X}cni07l=#q!^2ZtWwV`~kYqTps)X^FDW}d94vK-wuFfjn*(D+6jMdhZI` zf-nmKc(6phA0n8kh7|n1!qA|3JsT&!*y^0G#kaJ-_tBPHIPqkioaa$+pRw-0_$7l} zDeqEcz7z>8iSa&@CF-UhlADDf>Lcl>Pd<`vXSF)aT+_1T(K-kTu#}o|z~ZOlR`4Lw zfv@zVIW;kRlX=SjNKi$M18yKNmiPXFwd7F1rCA@NhnMr3$h*C?-zZE0r<{aYo#gF7 zCWgTrkd)sug#2w8k2=RS3M<+Ls1I(ja_z7oiu8X;YyTGuUp!HNeQr{egXT58zz zRgu?*GBVMm25Aa z7a2l0o)_7}LJzM9|L+^8r;UO)?=HRUdPNI#pW?z8`Gg3>LKgkb;UPE3*@)B6xk+kL z00X^Rklu0_==#ycwx5GA|Ixudl=l-(S_o4oge^6O6WIu_Z;?f*4>~9*+d-F8z+X$~ zKQ~9mAk}$$B9+HlOP8@Xc7z8`=WMvtY+_YCmstoX+E0K9=1`oOu!ROv67K0htn*(e zb!Ku9UaKj^s2V2|I2g#HiG+z(Or|}{%%f1F^rA2M!C`J2b3?lpI>Kl!Oobd2_e&zY)zO@z;FMk!H$>C-0T3dRhNu-d$WLb-q0KPffR76}zIi z43Rne&&UDNLducx;$U68lOgMvJ~9rdfbKqW{ah1Vw- zuNw)di*z582m!1s&ENKT_^fmbqhm>HZ)?>VE6>*$eU@yx;=?)LNbm3XD6?D4_EDHh z5v^rUP1%A_>*Kl11Z0<{`-)DSqSUv!f@H`BS57;Bu|t7=*==jumba@qS?1chN zYqV z!%F!0etx8{tBiOH!(Bj6KKnH|365heKdf(JyAHVkZ8RoLWqBia_u7O`Wk*0p@7t`6 zO_Yb~D%XNR%!9n2+*JSOiR(g8AfJ1-=NT9}G}0fgZjTD}$=dUH!8d%s@dz*pI_haZ z2VZvrn>><0_KCFT9`=Yj` ztbm0NCtxOa6KA8xE^!bJRSu1%=McoWvl7233gAQ|CIRb9tqwZ4Elneo*U$cf!(&6e z+@hRRvSsUYrOi?%c6TnrydvG#z;b5)W7C?-24HO>K_iagVhKIOG^cORsLriQYtKnr zl2^b0p$LX6`-Q_E{{l4i|6bj;Aa0@}X!xSdgtW~|tohe}u9)G}&Q)D6&$N$X!z+t{ z^Wz5KX-D1oqD$Oh*KIrfRlA<=x588{OFXf2u9cPu{7mnrs09K|t&_Oe$Uv6wOK!-s zs&t*`TuUs&PrH2uwJ+K=JiGe#+S_)I_LcdZ&7-H;C-!&hA%#u!F=PRUhsxiT+(I?t z5|<_t2_G>nH?0xGM1m-O`UqeS4dQGV*y)6>uoA)u4F!OBjnX0i@FOrzmIR1rsB(sB z%Izu4p7sF!Rb+eJL6PsbKsL4G{j&wFf6Q#fSD{jpop}DNKVJ6Cc5K~mH_~A8#EA37 z+8y2Kn5(JHn&2_|lyW3^4ueT)7?qfGvAxIu`7{FcN2Fwcj5(Jb>B!p=@9s%6cxNvC z=z4VNVnYd%hLXqNshX1OYMZRRe)8giIXfj7A8$Gp+XJAvz_&`!pD!nX=m|=2r$!t- zn?bFr)U)d13=OFld;;J6v5Y?V{l9Ho+!(ALXGk#Gb0=5MZ?5FV- zoksK}g_PawvOZG2VJxr!g@f|ST`>p4iR^>|->jlu(qp8QgOEOtAng9vw*F|2(fW-^ zpuEQZQK;h(v&TtYD>zjaoWUkoB2p!=izfyEd*tt{HP)Y69}C%Ud$hYR8>8{2S}h9R zw9tJX*ssEyMQB(itz>_m{qkH6#v96Ov7)y3yuLAfj(_?WyJTKF*G!K)@3AfR7pr0M z9-8m^yTPW!12m5gfX~mm^mBqbemhH;nV_1k1jLUV{S`YMUYGH#*1V!Gg^}rcI;Edp z*KL=xhZqj$0yhszcwEs}X9HiK%m6h7KYlsw)Mr8qQw?S!^^uD&<=z6OTvELrlvf0^ z7*Uh1o89#AwiKq!AdU0#D{Gp7d*?iwRGZv;g*8x)Z-W|2mhp$zTc`5a#ik4)`9$TE zZ#)i(03v50SmRx&MSGrZ=9hXjzfAE7iJC_`-y%1+lFe^pLnW(dMf|FZ_klU_IKl2z zz(uy3_v2oUTyJ32;J5n>Ac=eJiqU+E!BQW|-QI)uVj29TaZdqr7m9%G-yFCK%FvEg_UuW?5#v79*FkS!F zQzoxuFcY8=5f(L}gP zFKluu0C^j)=(D4|4zBw77c;Lgk?%G8(R*GA0(IH@%@Iyl=CQ$>xYjBx_?JSB9N^~y zh>FjXU%45(JO`3m*HNLjh(|#OSC)GV__}@5@VVtfpQULdep{z;CjE973iXhFQfV`h z*vLO32THC}%)2dRGmcaclzGzw^?&@bR+ST}{yl<`6cjm?1*BZG-%6`=H{Fy4mie~B z%A6r~YX)g$!NH|haz4L(9zel%ht40 z(Xus^N>0@;m!4h5YXeqCi*Y6_=k|_8v!E_noOpMUT`IbrVCuRc@OHY~pvf;TsZoX1 zyZk8K;?nMEeIPWn_fTzjOh2ErhfQMqH=P;0l3?J(fALWCGx-2WDZcPGL2=###`gOn zC3As*!tU+mYI_~?i3Sxl=zkgTO%lr0;;0o zS9^_8DWM*X7U*B+l_@=u1ybIuW1V$-n%a7BqQfh?fbVWumopOJ5lRKxKQNN3HPEg1 z>Z}ptc|!%(wxLFc=yX-TJ(u#`g3i!(<1$5+Q*S&+B&4V<2+8?1vCHy5sxPfNngjJ~ zYnak53&=8;j3``Lw477Y)}P zZeq%k39E-vesOYXTLHs|^|OuLbZK)_&pP(~+z40Hfrx&nc~FD7xNY4ljDt^nTm`Q2r-P8TTuSs5%y&6aYi?Sj?&eZ`lJPE=+rn!07dcxCXezEE&BQgXyX)Xq!@73H(^c~%f$n1C7Cwa#{? z*0DO&2Qj=S7uV5~$thP2%R5CQt zD4+nSM=15flP9@O-7Vr1OJCqn8rY24^0`MDAM_$zE4TQOnx}SKo{ua;c~6w|V9MgS zm?MuK@b$Z3B7oN5miZ!J!PvmI6w3Boam=D1%>QG7Y&ZbMntZB@rLaUHj5E$|ZKqhi zXoUo*tVA=Yk&wc=W>K8V&ZO|aMy$05WX1rz-|emKEJ^=ZW<1qAKN1Md)L`U2EPunz zr_Wap6@5~(u4137YWZmma;~=<+Jo!xmW9IWb?@+Fd<2IU;o}l$zWPU5Xn(;1;uQ}Z z0QikluDO>j?*|v4Qrv(Oh~K{<#zRb86#fRiMafOsjyrv0TrH;Os~9l4I83lMJ5xch z3=yN_&GmQtwm{pUl|W7{<<##M`4+cudy+}F3b6szkWS%uVX_TVMSD!Bb;?~ZCser>?EINUE)8TsC5RDRm_RmV+67O?= z_Zamy#@4%@5@)`fWDf18X&+i&uFe^4@X3?|J{sIAtKu0*dj^2C>z$E66PYAg6r#%j z1Gk5%F)JS0jgnHD{7#LEzCA92sT*sgremme!`Z!WPVxC97FT{ROxirujK=HHmy4ku zkKjF*QHR$VZNIe~9cC5b9NYFl{%yCFp37|FQ>1Wp+4{B9nid+!;qd}G2v5+;0X0m$ zOjQo9C5HjJn8;ZdgPXT((WgF8{L`V6Gu#@F=THk3|7+8kC)f8oWdReK^^`V*A#peM3i72x$xKia*qL%UEa+`JcZE6(D zoNe~#ff9ET!CEt5f@dYF)9*`+eXThk@quwX{^Fi|ZRZ~z>A`P{vw$;MfL+qGPIW;L z1+;#P`~l)+FpClz9Mta&iJ?JN_(+}v=RIpz<@DnjZm|T`iC*o6@N!RI<=ksHw)S#( z6QR`Te?sxULDN2@9t${X6DkF@H6ifPnSyoZS=slJb2zsE>7 zIOVfJm%q$d^jK5hZbvOk+_>u11v>e$C$ml(x+nr(M$elEJVsNnpC|Q!;g_~$SU&wM z=VX*s&aZn%_@dx9qJK}v_wT+y6>9S0#7--nj@vKtF&)h#x2|2`AyTh8lZ`g`^A5du zQ};eiN5N%&Dj3E0WZ&pPhf6p*!|_>FsFRzx82Agr0)^)??m@*5tBD+hsR;K9;@?_e z)(*(8-SdX1tbEx0Bv350u3rG-JZYBmADRDzB$)j-z=(zl4YYU1ELzn6*&ux+?)S`; z0Jqr~0=TL7TZ@h)W{P|rQ$|#>+)!@PLEu+Zn;sxCe;NP|J*{%pxFl+T3H%8BSiadW z%5GyMFjIGs;`Z=J8kkA%KIP2IRXbBB4kLk1W(kb9NIpNtRRlw&Li>oGT--t0O#`8~ zThnJFm1pAslWP&r4IfDUrWmyPrF|%TKd=QPi8W+^SR_=oeiiaC2}r3{=b=$3a(CxD z$Y+2k1d``Jwe~Ih8C`C~=O<1xc--fY+AxR|R6H9$f%0TR6D%9!7w$lYw^C^scWmj8 z`5Bd26C|K(kJ{{e$~@+&K+Pi@Rh|ROSpG|WT^epw1XW&?gJz@au}~kwCiUhh=ysp zud7>5w2nML)G4NGpXMm0Zd{iF?hcuG4`Z2`NEQo8ACQmn_fc~= z&5L&bwe)enSEd`gh_!E-O)t1xL2BVazaoaA6_P1g$m?Tif2oa{<{AvdJ6dvK5mG> z^CYJTbCyHm5%Dzob#G8dn-~TXLw5k-@?+(^4E`n5T|-ae3uC z%LWHM*+5=w(L4u0J9T=SfEt8SywxH`vb!t zBYLMY8)<#=6;o?yPt%jo%7-DD@hgP|t)J+~f+hBd?Sklx)O!1!H5Mg%_!*0yEQOhB z5rlC-;dr}SIWeT{u7S%dOoe)o2A9-7HU>Um%M?{98@!p;Cwe?@ie!Mw9>tXY zJxWixxRXm~a?;YOVkiIX4A#C^KVvw&UGcwDiaqzuI46!ns6NtTYMaMiX`qnb5bk;1 zJBGX2U~_Ir6BaiYY#FXDZ2Er5X32ZvPU_n0;y5Ft`naqwAq3-a;l?5dkIt0+ca zzoIDc%_o``tz2NCZt6PV?$Nl$DvdVNX;Ci(^sE$uvmeXKWx@nnQy1SXz>?h|X^0>a z^notTZ9{`{xvJE5UObNqd~(nY#K(xy{#)!>PcL0l#XqQsb>LJuIPp~3HucKdLsoHq zZ4Z}|Q&ap7&_Sfk=2>JR zGDgTu0Dfqq+Td6rY~6cOIj~{qgIK3*H;A&|eQY{Kt-$&_jOz`2jIdt#rCbEJGUxir zL*?=UNd7rnz<;0R=U2EaNzmVg8$W|i&Rpdx0sA>=f@hm-5_TKJElrCRhEirt&M;K| zed9oxXTvMjoV|r+c-^KFmrmJ7xtpMk9cL#U3Nr1)f8zWiKV7@aEM`obZgy-l|;L}>|c3hQ%t{sh2zwHri*_a=d9S%tw(Ks=;g0` zp-k>!`Z^Sy{M(V1my1Dy!^)PXe8#ddLo<5DEg^`%0XgmdCE_s_xjy z$xsjJ^n6xa|7s#H`k@<~^|gSJ2Jr93YXK6&e9@2oe$jiG7MJmX3!HOvGtlw-;u@3K%+He{_`dCPV44|Hj1DjP5RBENxby=U0Yr zHWjAgT>JRX6dj7}x!ae{VS?NuTF(V((i5b095ht@!tq|J<2-COm)MgRTZ)=flqqJO zXthXSBmu$KediLPQhKCe5e%Y)9s48hx|#b_6Lc~XX0`KUZov=xjmFPGPGm=0JJcvq z68WvMubeBpC&zqiC=OUTh%cu$yeLp$>;)|H?lG|{Sn_aLr8Bd}sk%)}Nou!^+V^>W zp2}gdp2j7l^6hW-=$OzSoAH=O*DbHGT=lwM z?4ul^?GNV;RcfV<`-fciw^+wF z(7^{WQ(P(r=4mmEs@l0G6c9FgM;muJ$=Wg&|E_n}slDbLr z!;o{P04IAlSC%gb24Z(C*gHokjNcHx0hVHI7sF}N;-=1j*iDF%etNC4B zT#&ypBgv}t9Yh}KdyKvJeAAoh@6TO%#g^<8KdoV>s+G47`5=D(;1dCvnakWZv5{+K$xU(miAW0k6c<#Wt zOVhR7pO+rvjv9i3EJGpOAik@J%!_njHdQ|+JO~jdyA{aM4Woi+nlMfHcrXz76{~#) zWPN)+;EfbU+}{LWjEwWut!y=dcm64*nP&QE% z*<&XYWxqy;0qK zrlKQ_(WO<;B&}Z?Hr`m~ywr<7`Ad7Me28mG3fR|46%1H0;aYyH_P-AK$d`lNS)=g{obxQU`%h%$?YsCj}^t^&rQChi>SPCR!Y z9CD%Q(L1i+cXAsD0T=18?Nq3t?rY;=T2zocvG%HE$@I#_t3>n72=WM24wfdLS~Ip^ zz7BGwBCsQ+Tq|kRs8F^Vmez|6m2`WQR47&rK8cG+xxFWAjLWYAzUrR5Kpc)XwDq|h zz6#!hBzz3s8aqu%ICig@Q?gn{=1~E!`CoyZXT~T>B*nA%{5{LXBo(S_p)XXNi=Uw;@g0yYd-p5)ypZ;`5d% z5kG~(9#g;+5Ju!04rJNq7LRuW;>bfI}&2|;hP_jH)m`ws53EHfPZC#?l(6J$*fD27PyBb zEh9|WuX}ckyS*gz+T!=EE8XrWRc(Yi9!0b<^k#Cc=GOj@f-Gf~X*Fk6jS99ltJJLB z<{K47)A2epGAy@hh}bPr#x2)D2@i6oInWG{ql3Y=z;90R+e%B`_KQ{vQ9;%cdRcd+ z4gxP>z?yXFPGs%bPeV*>?0l}M$fz;={d&GbvNw*12)6gGt|MeI-@6gSf!X&i)a^md z#+x3?h7Dyb-U_=f<@0#c=HZ|KYUN-^hP&MdQ{2^19h|J+U$Hp&cv=F{+NVA~;l0xl zISo%P4u-iVx9`q6I0gple_hT^t-8VYzXNfRPUt?~vQm)N6`@?QdHlC#1u5WQcWtiH zBP?%bc`Av9nryDvq3Iavni-(X6avr@BNLC)7h9AOhd+P#QXNFIVI1QtsR;a$p{3VR zL-82WkbsSrM8Q;$G6SJ5dqs%?_4p?8mO|q~i-_tt*Y>RdzCQt1xK?YZ4ld@?#`%=Q z-Y^8=&w+WciY7A`Fzay>h4{;Sc$pdRLb|L-N{Fq_I1R+Ckf@ln^L#DDV+y<>J>+=# zT=s8dQfpDuSnZaHd$} z7wH(+ngQkUi65wF@5|><9zFX%#y5!Ho4(NzIF+bivmZ+oWa{t#@ie=5lqnzP{Y=%5 z8ee%{Zt{6Xrf)7)Yh)N9n`(khN;Q)Pyybm^6GxrY;L=_`n zcC>S7?zMD&@NTX2J`I6i^?@t)cx&?z+&6tPUrV0%HVyv)@}wnyN>BULDCs@%*@O$> zhwqA@fv~=BA@E?P6b3DxfOtWBvA@rUc+i)lLKv5L&sP$spZsFLtjw^VpR4oKsGVv^!%Ov`+4NOkVeZq81JEy6|~#3v{Ad5C6mb>V&8Ti7()KNS$-x8U9ZP#9uG4m znP(6G80~&*I3#J(v`BYm<9?8|~_@T1q@S8`|-6 z@ws^LtJ!cu;B1T0a|Vn8qxdGwm~`A2_QdDhF*gvh=k#|kih!Omp(2mTa~6ecRDR`0 z&Fq^%DlJ<6g3ldDTPnD|e-*#MjnVwbj!GxkpPOO9f`22aushK|c9DipsnHDbQYv!C zd%{&JHK&h#@q8!Gv~~xW9QVtsU7BxRJoj(9Dh?Nu29X<>PNWrE8Z!LSJeOmxB+~UD zvIGux^L@KdzHN9(g=utsYy5B{%$wBa%@0%`Re6G{r$^ef9|FDL&lfU;&uBV_T6LeT z{mC&}2^kLw=Jx`Lyc*Ku#2kJj%|5fesNmnKFys#0J~7rs1ns3~dr%U}pHe{f-Ya8E zt3%-D)yWK0G>~n$q^hTb{x|03h4UCk*Kaq03EBRhDUBfMi1g=@cdrr(TKJGN7J{*Gx@*&Z|0CNNi652Qp%Ky%&?qGIlM~}qm#%v8)Hr@ zIVB`T#b!qFNhosIFqMR48*+*v(r)LpA?M$%zP~@~@uw}%>UDL5yRk=b_D<67@l zGW63n@)u!^RGl@TNFh1!R2h1CM;z(zQ1R9Np!4pkjK>YOy${kya9#X~wd-C$QmI;z z)HxYP$r#hDy)|oW$=-8CTM+4uMF!N=25G6_ZS5TqY8%fcwjD6YDEb+A&#;v}qg~}M zS)=#FlU~*+sAY(yyy%1A6}HO24Cjb38QRZ;#oeSddV&85WauQlalYWvTKFof$g>Xw40*Jk@!W0@$$Mq5H40l>!nW;`c3 z6@MkhGAD8@Z9KZ*M~`>-)Xg-bg~vg|`)O|fD%ZWTUVGV~4pwQLX8fOYRE;TXU;M^u zeO;E(;>0GRubBEcctUYM*xf7t1W5xo{l53Q4=$}ji2W};{Xa2TY8kM+`e?J z^b~w~sZi{GC67{+9Ujb@2l3?f>8ql^x?#KDuLxCWWP>cVX2KlAX8bk}&7?Km#1M5Z zz-ImqT;NAXX=c?mxO9_KO#k*Atqk{JSU$fN?X2nC9!62Vs=2Uw#F@AOf(Xr$$Y+$* zQzc7@+{Y(j3?Fn)i?E~^@V~BKoL*fPS6X~t3^3NU@PyV4?j3x5t0W09oVkT2Iv(3y0%EpIH}!0?7=z-Q{&2h<4>D`rwfIFk=%N+cq;kZf<< zA@{lzUv;fK<+OY$Bw~3k-D#FRxCG3W1?6BvC`q()|5v;k9Xwcy(`a^0TlxIN5A49D zg>>lvk5u=X9JtLD*`}7OmsKI$#^TtrlBAswqZ7}>gzzgf{50JslS0J8BsH~o7nXnli#yn%JkjcmQwZW2l7Gzj5eUQA2*7|R)UPy%+Ux3no8F$EG+1hrgIl=k26<>=MOE({m9At%U&FRq>LvD>HNx$ z%-$pB7QUh5Rb@~YWNT0KJYN4&)uEgI>YKciKZB+D-{DO4WlIi_p*lC9K`l?V15wD0 zqae-=+L3fJ!bYE(%2QEGN`F8jmAfqi0cvv$#KUnLPRh}^J#-g%j|<%=~VI}f2UEU(k=3ixm+ z7v3=q#qMQ2_w(b30Lb4R9tkBuR_IeGnk;nAMX^1T!}bCIN6!nG8o3l zG&WwFJuP~#5#J*}fIZYbfLe?z|3!p_Xqg*UpDvBOJ*p%bQd69pk~ z#JP`7pItZ?DK4)_w!gB)@Cvk=`~D8M1?JeLwIX%&i7lK{*ZY=&zKpiz6ur z4B=_Asxn9O&dyASu-Yk0yaBaHojCfZ-lT=)o?|WvT$`0a(sJ{3%|UhwO)Ih-0lT~& zI>6`G<;m_{Bvxe36KJH_(N7*}5c0r#?D3r9A8E)vYLUx?50}Z2DN{8){F)E#w^ROg z4ZC`(7(JW6cVTt!!!Wl=Q=RYGBTFD1)nhv~CLUGb)_x-=K;K(m60B*)Rj@_$;%Z{i zwWFBDH&D(rW=N@XWJu%NuY_ORLyYHez|P{>{G#W3tlexBY%z{{UtW?1c@ONfv4~l3Pi%?r$zBu`!o6Q_{0S$uy4-K57ApRYm!4kn&ZV_ zmS#fBvKc0>e)3r zx7}mmNJQ`j8Noh-Sq1ak9ld2B*kW01ME1fF*JG9#o(%W;&g#!1A(^BS#>^2I{;2h$ z2yo#6^B2kZzlmc##Xp%kakpu^tv%V!2vp5v)=d54g>n#c?pZ-NJ#^Pz98Y{D4*x&u zso}F-tuTB1@zjV`NYw6qIW7e`8^aB1H!@#nPAapC?(=h@#Pae1F=~#U>;7f-t~1kd zarfT!AE8eATjC*Hy-Eu)PO$z%Pa`PfKz0$294~^;!QL%_)Y*CcCxqvo%!NZE*MHRp zn2YAKZS)yFn4ZLo|EU~8DVrnM`M-=VGweVDV!ilV@?eOS;sGVJ$>eK^wfh?8n$Kat zi^&T*BxGp4F}1*9H^avo0VUQZFdv%m7QVjnS^wd7T4t?IdZ;-l(8W^*X|qX!lfa=M z!m|2Uo@=l6mBz{0XaRAdcd%eTC0%wgkvsOgvP|J{0BM;9B}RB5<8hBA1+41F6bQBe z#Dry;{E#U>wxt@|fRf^Z(GTVY64tz`SKVsIb*S)vfAD;u-WoS9i*7dz+ zius1`obL5>15Hf@8^vlv8~BCyO#wGNcm{C^w7)%mtiWwV^zH>NFnLURtzvQg-pEo* zaf8Qo35Dw)eyx5DSycgi?eF_m-#>`SDd^4MkV;T{&R0zi_+R#Nvr~W&f%my*(E&H8 z`cSNAy7ti9)MV(I>5ov`%W;nPpYl+JW5;G|G1ZsEeDmLEM=`pfJixwZ#ehGU7=^1i zHylHajJ}xaMDR}nq(USruw5}*E*AC<4+)oq}jD&vyhffT?Po<^8 z=&Epog~B0i+_`-t12qo_Sb5A z@gvHUKGT?-ZEiPmt>6H*vyU50E%@+-nG2Va5&^WhC~P1I&U5a`v*)2$LJU`*+HYn# z0m=jVdzP}b*3G2>l`RD@pk&Tfq;svY?)>3!dSPSiTrOrMn@5|3FtljttAaw1&w0mp z813~D1*Q`yie$qN1X@3oaq6xO2)sozK8XT;4@!cZJhovpxh*giEvh~JwX=_>MDQrq-BX}iuU6ZEL~Rl)G)ZZ(3ozR z>Z8s+RfjTKq6}Pmt~sT!EdVaXEw(qRTslL8N^ z3))bT3!#H`M>>=J4Gtb~dZX=^b-A6_w=au*R4OeD9J{d(ZZRDgp@YJYJ!9!Sjma;3 z&j8yyLJZw!`f>1%_b~%LWQ8v(UhAvLGTKMBl`K37robloRhn;C-_LNae3MM-+E`LI z?3#>r`#ofIevrAE^9H<*^WDoyLYtK(@o93&w&{^WJlD~S{~Jt18dD}si7QK%aA2Rx zI6~Qzrq7;7Q<8?U9$1I^%K`B}v?evU^H2P;lUSEJZL*V!<`+xCF|*&oeZ6LaO@nEZ zQ%hIx2Y+82h%i%XShyCRJ|*bhv$DPteM)8x)M}b{kVab9a*tQ1x%0MR2lmGDnx}MdRQ~9GxLm!vp+i6LNjd zuY{QuUg?sNZ%uo+hyZS$ihErsfvGa#JsGA4U^2NkyAjl!bFOOhA^>*sZ0Ef17ZRnX zm(dUbBh83#_$B-ZHQUAM&eYUdTNBE3YD?_>D`D-&sy-f8IimBAObPyOKrnQA z_(-!esJHp?!It-kp;e80KacSuQU|muUkC$7KG5OR#k9y0p&tb+pN$qJffCW!WvD<- z8{@>?wydbE)z1lekCFx^%*+~ssYM^|N>PfS#EqxCTnP63KGKXK&EulO?zQ!>RTv{R zI+_r@kr~c>t-h=vN{u(iyI=^o!Eq%{nEC8IZ=aaoKN&Oy1y6}_a6JN321}^BSzZb1 z%8`;gjHVBO)m?ts9$F_pzGNH`YwQ_);SP{5OP(5Yuja=)Yt!UH|8J7Bx)sP|`S*V= z#bmO@Dbb6?vVCugSMNsPYZzr*XPHsDc1qR{O1$c>XM|^|KA|94b+p&7CNL9}_s~_- zs8l7+B$tO(!ahD5?1hg0bmiw#SpV(ZI1-YDP8DVcB{whl{G%y z^p^YB`s@cdN5?88p7eS4&Y@*%fuZMCKtOPxKXK%u`6Ac|c@$%iiB{t7;8+kE=;n9? z2}!wfZ7^ANM|KSxqCq7t^cC@ zQ0PpEHP8!QDTsk`+uqqnVtV={m*3$Y0~x);1IMZT7i2HoIBBGcacbmqK-^;Qbzeq1 zGcUncL7uV##pA5&2NHp`cl50{>3;zjggRs9 zmqQMydXrgUWD&u-bVR!2@JBO}x4G|pAl;$!% z+&X~HxBETwdo9iMZBm#Rs03G;^rTeifI3^)QHBSoIh#6Pf$?LbC(>QQrGl98RsnU65|+8&F|_^)DmAGVf?14vU>cq zU7I1>BPlpu;eMskRt0K}!cLUoF>uffXuxHu(|(^_>{aAAUZzT;HD7-KncJf8x#^+9 zuE%Fxk1uAwGbo~;#6@1O8!-E{R69z)L?OD9W>h;Iqr0(RBpyIfMN9}+C*MxeuwBUk zxw4P<5D!T}nq=}PA=onrX&JdI;HW$ELIQifq`QWx%UL>JAErs1$nPJB%x=A7QSFQ1 ze-7c>;-lCs4b&Q;*DY^0df_MU0PX*u;KB?^LFVtGHnEF8K?SKGlvxL^3gt-%2bDe7 zyt=i$sN!I+83f<{q3JlKCdL0vYRHi${x;Ig);3V-@G6%(N=+&QQT8wsvUX=5HOtIg zQJ52UqBMr6Oe&GQ{F2OLK_VR$IBT#Pzj%81b*%7V{f1yi^QxpUnGNMX$$sBAvi;JK z`?$ablK&mR0kWKbo0s?di62OwwN8#hQ0>zYY-P&M-Bc5~Z5(oNp4AqhGNGhgQ;15C z+)kcpZ&@efY5b>vZ}a}vlb-DHsOaTI{P+T|Oswi*_?10>YwaaKE3KCFd(SEOBk)G* zhcOkg{z6K8k$L+X~?qLO{ci8BW^xQ7wkvBM6IXAsl$KRv#0Ts>2F%Ds?S z*rXFO4FLQng~aeaH3R%Lf@5(6$(H~$ zcp!txn*hZc#mVhQsrognvyAIz@2;I8!Ih;A?&5Djum+zR1Dm~Gk^DPyL4%2o5GNdp zKWD8!Zr$UYglaQO-NuQW4LA?218)QuVg%NMi}A`&Aifpb#--T0Yb2~s9ZbD$vQkjL zwmU2Jlj3YIcjA}a-?G*g%nJ)Hv+-huO$(ohL@)HTXd(xQcPZwnex;AvwUdMZ-`m&k z{nXtvdk+t#5(2jQ&JEny^+<}c0uzjV+jl{P<2dRDMSW7SD`LyWuXE^6sT z0xfC872n+q0b}MFdafW%L|(L#1_pdI7e6^3niR~Z8!kG)szX=!eakj2Ms$R|$-BUR zCAuy8Q`mnPgGPZ+`>A5YlXXsdi&3Uq*uU*qstg-!Xc+^1DJwIx zvt?}Z2)zJ~AHr^~lXk?hu_5H6XwBz_JI=@P&L)6dYK)Ym<2zjE3{DhyKeuZ6lHw52 zsX}c^;Du$Z+UyFuU40+1J?<9Uqe2NmJn! z$x-y}-X*K&zIh+!g)#9nP#DytxWE`mB7cSpLqaG&?oUK z*j_rAau3RJ?2$rE%7COn&0vR>-~_Zzt^@mOhzunvN>QC2FhfZ!GZYjbH|8NnV%?yU zd%r00SZ*6<7S^pm7$>W`+x0I%J>FD*+3|++tqu)#%dQ8D>*H-xMd8vvE;Gr9y5OYj zW8;bVVp+~Ltn%G)V>PRlZtJx5FyM8g@zukKh6?6I4~dYFd(P zX>~|T$T(Zr60b(G?LJ;2vzEP=mUHCGNhb?@JEMEt-oa^-FnNWhQA!4sAox5Qm-lM4 zb_(UrQUXG7m`$sJ23Ehs_(9#`cd{f%9Dq)oLW5b1oi~Z~YgNsdcre^|_MC@r>l+ng ze#GNJmIa?9x&e^qOAr0ca;#y69peiF-}8{m@9lT#K_WR^AO(umM;J-w+vPWyJ3`2g1bO0wa=RnD z9Grd^KN#1)xH6{uxzUJP1AZOFo|_0p>wL{#s#5~<1j%-R_J)wlhnXLEHk;hqlPJMa z&ofN_jht^ogu!GVws*IgmLR8=C!EBYzm*I@owrVa|&Zi`%IUIhQ~t*_eD0$V8A3dGmk9V|2G za?gtmtSfZ+oID9>CMcONIZm?@1(=`{dZx(~Lj002sH}B5J~0T#_A;Loq#f&eL-%TW zvEi0FYt-CGr~W&992(3t>2_{@Yj!Y2f0CR!dj_Gnh~xeod3HM}#FYC#r>Q=kFSNle zAY**k-igdBxn=Z+!>NQ?ZnYnrS6!*abf*Sbp`)nPjC>sEzf15k3PoF%HQ|)&UJFphb1Y3nW^*Ku;l|=c<_QNEV+msS??nYvh~6JmB)C7o^(Ol#k5ya~nBRFRIZv4yD)9$(c`LB@X zy(^!Ch7=5``iuOBkHI8KANe=ar)_L6)|m@MemR*F zl`;@gaclZqn7KsFUK<$}6o|U&;wr=lo(YpC%|u@=R0CP)r!FTjPM~fr1-yWnbwP|u zsU+3Q*8APtN^t2&CkV=W3rW>R(!SX`GfY&ldV*VfuvwI2b(B2OoiG?Qm=sp+)x&A8 zoIjmIDuIo^fimVUx2rlvcu9Xh^!)8c5>jvv*$aT<`W~{cAS~POUuLtzzB7#paFscP_v?)*{)+(RVEPhPwM)AV2 zgpjWXsa06PGXf@{)x-%ZAR34YQY4zpHkt1wTf95TzigpH3~y-e6e|c5#+NzW>Pno^ zlC8TJcFPd`D1PB&2vwiv5~gwaR%t4BE$5&)TWZ8!K|vz#}4r0aA(5P}%po|G)v-ObpL`PvzzWSP5{pWna3) z;$HqpxTlxD`ZG8RYIOVqA4N?)79al^vTqk<$hxaMZWA^R(^qq#_bKrw^VDS`jTxN& z6m3Co9_k{VcxF{`gwhhauDBk@-(~o#{#jEn_j5 z-?wu$^)vbL!;{}aE`1WTO9?gZ*mmQQaCV7sxf^(a;g67L6C{XEu1b@6SQM%H>M>$3o4lViZL$+!qdNP{A;XhW+78~46YO?9hpz(YZWE)H z0~v|<_Abu|8yzp^E>hGBeT>s=$HQPs(_rMx&kGA*w`|rz71vcB`QRvhH#K_nr?=*V z+)-sR4};G!iAgV1uPc{`BuYBeUF4O?a;09_y@J#kn17XQUlUr6P1x=F>_G{GDV_*~ zgqEZNW@3V!zd7;3K)X5-l*-M_EfQ=gytc4-oVgCF{fPOFzpy-wK-D~s@eEy;R;zn# zRJr)S+WrW};ayL8g8b^IIjbphw~!xtGic4Hj)q_YYz;H9a|CiEII|2^yq=WfU=LCM zn&ps?$OR+5IM9~DH-@g=i3j965A`8`+0UW_%rfVw5b_6ugLWj<#Rv8{jM%Yj&0fkd zAB{xZ_msUXM!N<~P(h9sq#64UDKNBu6u>Yzj z#tnXy^eVSVkAx4u42ow`Ly_yiPb~{Ut!!k)7jrAof2~L~Etctqr>3)Tpkc1kAa$nupyLN4G z%Io=bVNM$)&a7pzAD|2^(^#0m5iC=zZAM?%BV(!%u;)}>p}9e@a_y(0h{s6AhW3Jv z^=1WX`fPOkCR_vFdd~Fqx4m zZ-jqtaoo53WN>MHa}0W|@OLJk&$#6V7d`vAIwMB1HK}QDcdV^0yPmO#Idb@z$ViG;S2nloOTezM^G>1*YcH24^qi(KCOU;l85X47rEjOSW!Sv&odX_nQpPoyw zJRbNfrtMUt7K|wu{A3pR%#QAc)hTt)FWyImvvyv?dWWyW)gI7=67L(;ZRnIs8%LxM zH=Z1k)$wS_4fd96*}nUq|3r@Z@cFlCd%QhBoKsBpGq861YXr|>uJ>1fw{Hrrz=%q( zl$xr{g#j#?=ST97<3&Na@@z*amL79Z7gUPmy(NIRhJiV^;}k)e@Uth>s1#tZrQ+^> z#+<3J38vuKx10AH4pVZhGfPG-)JXnG019z(9#V%9C|&b0@2Pu@-h&AUd0OR>@8t7z z2?{FE1Sq5YjDWJq4njciCqV0lXos&(6qLJ1>(UDXlb#2?-tV&>GfUm1#XldU;K+bD zqQ}(E8nghuskb%0HQp7ELl2=qBeQ}bOaSbQ_Yq>WPVrAbjE=h%vS8G#hNZ%zqqQcO z(inr4YWn+QPyv(A3LbUwh1Tgc`-!q@ensrQi|engFI8mRs+epYe0t-<*B5+WXIyq&O zr+n!1NrpHz9mw3?QLvGc=^u?;F|pl8aA!YsZz=m>p9uPJH`TJGFM6Kro+R~Lg;ZXr zG;`C9J2K7Yz0vN!`P8PnI~EDTu|uO^Cuy_M9v#r9utToqecYEoUo2n)tZn6S>7J3T9Xg} zS~s;2To8CgQcELmd?6t}TW5N_uu&4+tNE_OjXJS1g=^uWDem-#%6I4f{bJ#o#6dsG ztx(FLwNHY4{P%7iaO(b`Ud7Wq{jmHPQz-C>q-xf)OPPxp zgc$9h5Mav}4>B4N)JeRfx3omp^ftMVl@RuAUZI}3^gK>UjmnR)h=DPLXe+a(Y6Qq~ zuM%|@oCJ10>uydal49^V?k_3TakSOaPNbp^t$*-VN0=*}?u{7j5EgiCt2>AQ z?e2Z_Q?s=hiZI4jT8)U{O}Z_fTwyyzT7Ps6;}}gDfPfjiD=JZ;%mAMDb_ovX`Ppc84;xKH-wp z)sw`5oA{@^?l;=I(TfmZ&*H$o71u{=*36uP=m3BG@=0($N)nB|2f-rPVOYVaRMs`VodR#e^%`-FP+zWvp%nIfX0#u8 zVK-!_+YTDD|Gh&7Y)q+?B-vP#%sa%-{`A_nao&!SUmE@DOP*`Fc^E&@u=s z;)Dhe2(}rX<_>=n>#xMyt^vkRQSWgw)X6VjACTjHHL#~KLpkPKfNMo3^Nzqkb+ASV ze@S8sV0_J04+4OF@L8DkJ&%Qb(*uIDT9sSTcxU9xa?6({X z`0r=?`Jk=9Cpa5-L`18P=U#8nuBz+(EfQ4u9HhBCS)aqR>wKa24xk&$>iz7C(De{y zGJtJJbUC^D0`+2Ygua#9I&^fra3T_m1^hfRV~ua=o%yQvI;n_me5A#c*JJ!*@^!h& zULiqwc&j28DEIj<{S1EW3N8Ga{-!;24Z^5_&p&uDSm7iW$(&uQ%8>B2yHT5)IQ~() znfv>CHIP#~7wx%QEO)}Ou-^^oqY%B7p zJyd5FHEDbg_;~c=*}JPg|Bm9RZAPaaev|7t2(rXuIxPa+kGsFghMK^s1j*6Mn!8;v zsUn|2gZQtjF8}dj%*fyAFie0cD8apaQ1Z>sSQ+D#dJPOzY+<#z-EFTCK-h^zUEqXMN#d3rY<2BjV)Q2Bk87d|8L-HEn`Mq{f|ev*Mh zFZ2TT3;z?KUmpK3WzFJ%64D_V0FeAI8I{&atz>ScL{c>5%~)lGlEsd7BHJiZXX ze;jTr|6r6RIXBQHRP70ROnlxz@tsmm)))kQU^|3icPt>oH^yHd{Z$Q2m>o%haa?}Y z%5|xLuKY#1iT$D!=s2mOk^uNgqdj1u&s#C9~PLn8Wc-oEI_Lg z;>C)}es5`D^%Ckdrs|8S=gKbkl~>H)oPJKkYZ4NJf0oXCS|8$D)O<>3Hk++Zj>ws1 zo&+y9x^c4GI$;aqZ`-Y~s{TsplzhE+{l}a6g~qbU?CeL)i3!I3Lj__0O7nvV4Buxe zPV$!qbkS-;pySr}N+9cV$gV<3j@ii4(TDx-rsrJ6IP(m)Suh1O1R(G9KRS>tUA___ zjJ6U{+W%6Or>ktPKW(nh$hv_c4Jzxt4C+bW((WgA53a(g>DDHKWR=u7YSJjud{GRj zBm)pZTDL05duGJCg=E{QiBry*4_yLdi6I%dyk6Iql(QSQmFxT^UDk6iRkX0iUn|t3 z4vd35_hD1z^_HU9dTV||bK+00TUW2LTg)eIF`6*LGj?|+pr8=4`+(HFpR8XIgfs~E zY=q5zaF9!RE&(vFUcz5>9q?PIfnrUV9y{!OlTJk>?bA&JMYyJ(O>g}>-1%m-z~THY z3v~_b+tjn72_=fW5mojiiN!LU-~#iw$0%9>M37-PZ%v;uH}OmaJP+YG!93x{t$>~b zk||Rs)!DxgSHkC5%pqfh1vD@7)`in>UVdM|@}lGSW$(nPAN)hCv984pt%IKRdx3x0 z@lk$vl0R-M&v*Cny5#ZPn7>)It2lEzy*-Rr(g~x!9Zn&RS6yARw_Fp$_mFv@ME~~i zu|}La(dw}ISNC=L#uSbKHbnXXYL%4qJeW%Y69j%$*~%Q9>C{X9NtqzLlmLuxw;ZRg zOj<6sCmTut7`O8gB;uLJcIuVXD30{d{*-IZ_dTJ zkTugL9(TxpMwK%k_fg~>f0D})%)9(Fc;7}`|I{o_k(T55jT+b&>KzMUF0^Hh4@2sf zRqQ}&Pj68O=%h6zrN$LZ4S>U|N;SsBm;6JRa` ztcJ(I0m;@=ny8`MgS9ry&lWlBD!!4r8td;zKn5BNa#Xx)KQ!rDVvyu{puM))*zR5v z!I)`gccQ6M`k>TSIXP$u@y@jdv%QVBci-$H_FpyCYa9UE?hnf3o$$ybPrL^Q_rLe= zZw!#25=@r`Y>U(L8J*6@dbqx?tf6aDgJrtelL0Tj>HEA?s{gsqUhX3p@ z=(jZ=>AV0ZIe##6=VBi@LR9P9pbZ^$dd>9CPD0)fNmCwTMjb6JNs3*4ga0|QXURB4 z9lNNUOQdup1<5oqvg?h%pPpX*oYMf>LiDQjyRF-xlfQihQBZ6o)vJe58P0trJHFec zUaZe-s(TUX9ZFGrPj8`|4WJhGg9x78beE^aklJVKWmw{5m0dLz%! zIm~JOt()n-zX)Aho|5V8cB=B@>xjB)#-{4 z2l$vx9)G(i_ya<*1^j^kgCPUo6@*sZ|=pAqOOwa^J?iQ3%$xNI0SkCP=%6Q5%O5?Nk7;tfL;N!l;B|Zi5gb z^1e;;ZQAcccnISwB4nRML{jg5YkkyhoUZ*N%yOQEF=}abG+g>W^Md5q*xd7kaSaWX z*bnYP-r$y9g-1L#y{J%}p!=kIMXl~>q{poOcuT_$cAvP-k}$$~vmog=;vkGch{ML; z?DWg516lpI&qA%4c;RNBDxya>lL&vgL0Y!M^z)eMS{0xw9J+0HrJ9koniZdc|wcK?D1UMCov zV|eOZQBKwoWd6>VvgRg?a@1PDI%Z*}sWdajg1;1KP^j650>LwgJiSYBZRz(ds+C`r zypVt3hR=`wPW+u%-eY2hW3|XRKMP<6_Zm{0GKzmHaqMPoAMvM6N9m{5!+K1+=0}|L z&p9AC7E19T50vc*lBAnWDB({gIM7Q>5au!FX;B z$EwZ@WUA7yJ(0l7Y9Pqhb3sI8t-$FD;`BqYi?vFI)bisG_D{Nc_&v6o(hhg$J(ZHh zwhQ4^+vDND3ul12=zb%VvQ=j7>w;GalDy$^mbx2MuvAl_C%%RzsL9 zN9XLuq3IYiFjloS+vj`Ou1){RY)ZF1x$>RM`7<$=4eS1rFpjeU44>>TFs|Wv@Jb$# z21Ul-fDcHM*z-+Gm|6u|k>bJgiw%x!tFJ;}W_vRM7*SD$)`|i_1{U05Q7eQpv3~?o zUeQh0T=E8V3*BEiNYDk~@{El@UAj_?g#);l!rLM0-S|7s2$lWapw&EjGeC+6Fv(UK z!sflvo)R`Q(afxKOZ&hpeyy+|MLh?Jc*h6@bG}+iVhEDzR+b;w zhQcJFKnaSC1;;qHPVk^&DIBPz^H4A|Y;X=pb$|}m=m)A>*-p2s3Y#I3KjsJ?+x;F% zGzj!CP7{`(gNMdQX^QjGPX7( z<9B}6v@VhVj2&+8LMufs&uhB7wK7*erQJ{ZBtpvr3IDIIo>Uyn%y}OwY?YN|Rc*`f zQf3o0!{EyqC-D-X9e`mW*MU&sIF_-_4o4h;M27t#Mfv&O=Pm7v+Ahoy*DI8Ulie|d zzDUpsssrOVK=9H8pFg*8>)~0d?hMeRgg~VN*e37d(X}>^gKoto54*}qP$fX3WCjEc z8lazTt*9mp$^q@EAMM-2px_Iq#&sPValLR;p4b=bW?p;vj7cRZu0P*s%(6O4bTWac zh`4_QYvPe@b@y>kRsZNm2i-QMSKr{j&+jZsl0Ab+ND3qig|i*B_dN}K!R65!*_^nz z?lQJfNCIG4@yoqIXCSLDxou())2uIVr|`(P0e9iQ7lF3-)I#?bv80Bh-0a+|xCtq- zU43DedhL1%Op}{GDqeI9TyVH<6FIEtj^*;^@8fiTojw04uq3U#^%_Hq8ohSI?IkHc z=Qi_nk<#?k@bpqYGCn@!%9S-7#^wBKjQMobx{i&G`B_>L{${Hw0oyTJzU#jt@#%dH z=97CVZ`6$glJ_`9u6HEA{8r9U;&rc`3WK_US2(>KxQ(1St!8sNI{8C4D*xG>HWq^{ z@=gHCK;+UjpF8vHyh^91jYzA7Gq7(mJU}K*er1=-P68Cbg4KM9_tL$y$Jni3Zfn7C znrq_;EksM&+So>fdXW|V2VqHbG7NWh{mAbQ@R!@+-5W}Ir8CFnfrFw`W7mZZ@Q^)% zaS$+$hr|My0R)qQ8kiogGL++4!+C4?JsTvi6*wMdreMrZ6MWE%Hjp}%x8ERKESRz) z=xhH{J|3U~$U>H>kjUL4_`3a>6Rtc2XFktWUXH`Q`AYhlC_ep}K4u6)6}ugbAVpop zoqrd0MZ+b&ywk;}uXu4Idw(l*dz#H~c1V7w0q)e2vgqFu8dJP_*)}fz28a&{QI*bc z_GPE@7U0`LQ20(WL4Vb!nlSZ|pM}^O!gz;cHvQAjb3vul><5a`xEI`y6GR_Au;Ln) zJ|qrkjLzVepY46rFU0WvL6V{1+#8zcg?ZiHhrJ|@p4btZq9~MKv$B>b#mT8Z5+ni0 z-$H`_RSGaoDoFt})M=9x7q=|6 zoFpFM45E`huWv-RWyR!M2B+(ryhC`NHGRuxvL)6+$DbcE5RU$<-mAlibALcXeOafI zT0Wh(^p2CbjTQVdj)#*3Dr3y-l#p?&hrawbnv&EDT8svNn${i6X&2?N&BX!l(7}o$ zzVZ-k{R%iM_U!spIXR#=TLlI5%*=RD4)kr|cRVdsG&2?qz4?(?8pJJ_f`pPS08;ec zJqS6w6s*mC26Z|Zr&t`;n(#EX1Q$z&<;JGO@*Yl7XAYKyxG&0BIyM0di=U zS5#2=Q_%VHgn3C%ZM$`}@9g^2TIyi_Q($wE&%_&gLg2|wPr?&tL?{@_oF-D>6CnIVpm~AQ#MSdF?_lH9P28rdtLWv3# z5^hNWj9Vg-9I5z(Psu!#b;1nptG!I!BrkjiAoM62B=A75%VQ1fnYeqEc$!n1w#N6% z;Cc|G;-Qz{(v0_DGK)R@EYnLZhLIl|P(kDcK1qX%Z|9i)qZeCk{R`fv z_>B#vA5*3Dx*nXqJ_@qvpcrtph`~vJz8i^Pp2KB zmf!3)6UAprh&z)jFA6u_`s_Ij(35hX_SZ9s^hCG`y!PP$z%n6y1)~ zK!b6Fl$R20ao@ziR+G2RlGa~I*3?7Z2?;asZ)V^!sg+5$x1*_6xhbhHH>H4=ysViM zx^scxH}h8;y-JBS-hnYesDnFXGKq<|=HLJv)qc%Ppxgnbbi-%C?mdpy3|;q_YS#i6o(E_ycJyZKnKdq;1Bd_W*orrdsvi%8k9XHU7hCpzhEL)B zc&GE($f-?K2@G$2Q@yFZ=SvN{$zcrK?!Zp~ZIKlAPfC#xV`93xQt5eRVMZ^Avp6hV z-zT@)zS7}Z3E7DppOKHdp^Vc#ny`cGbwR^mY7_cu|04-=Y23-FEd6s36oKVH%z;wf zzo{L_wiGo;}AS(5lV|kf@JnH^d$`84sc{FH??>hcB!r(6a>GR1|giaYdTIL zPz|^ceUp;{wsGbFmPKym+)mkCtQ1o`%e-}86=>l|WJJ2nq7X15f>tC%>;;A2**l=MA2%ZgZ3&`F3kwCjMM*Nk4z4FBP2LxXtG9dRMS#4 zq4H;^#W?*vnOdZE5d4vh?J=`>5zxRw<~4D> z!Uys-g`@x|b+c8U|6yiY>Us*^Eq38Ym2_H6SnQ9o38v6Nt#R?w<)(Q=+~*SpbDiH* zBwF{a42Wdc#Lj<3E)J+aDEbhFC?t4fgO2No7w`8}dN_-7Vs{yH3m;B=!~8GAaxQgY zzbX<|C-H^t6H@U%tEywrE3f3ZBWS*Bfq%YR-ladfiFSonRUg5KAppDJP$>G^aKb!# zy|RDEV}0?0rdXZ9`A6Mtj^zg1UWAs|Gub+F_Y02lPx^+3G<3ZTM2 z*gGI!uKeU&^q-V&%cZqVDC=GtXk_zf^}jwPo`EFqEp*pxu#^SYqisH;W6r!Ex5${~ z$3KRB)FLufzs8FKxnRUy6i|YK(X>D>>CNdEg0FK);s$5HIM7WQCn4Zu?l&+&+P=1G z+ygc0GKRN7h|M$L*~Wg21j$StxFmS3XjgFFZwN4b!uS}5EyLBJ1{~T?P1;r$fYFTm z4cz#?zb1VO@Ta7&gImjP$USswOCAe!z!(1gR2wS5D+!R&gmvZsuz>Z|G2J{HIN;r2 z>N#8+cJS*vD7nrbSCplL9t!LY^H&_&u0+)zx(4T=NdCGf@XlelPEb{DbKePG0|9zN z>H%fWLF-b&c-xH}P?TY!_H%`Z34i3TgCXP+XkD~90{jhYILVN;jE&}^D-gyi?Tt1y z>yZ}K-Tq?q6A01iYto@ljrw4ELR2tD-L$*xgISD<3BEdOGK#Y5JR;v<%1M z!Jxui*;-2w)0L7)$uP5Y-)L%kbvLNnkEM_LP`U}|Ue2nG%XK3PncIHlo_rF z3nbuRiqNBCl)jS_IT|NJ4Hw;o;PNDEe>~XS4oBO$ix|FF7n6gB5WVHbI{FW{Qy_JT zKsh22+*qJzJ}Zi^-Qdu}ob@YPP(QumdEXawj!IU*fz(=XdbbXBr2*GNLN@VlLl{j!#y)BdfX)#Sh=Y_$VKbELsLDthy48-k+KzF6 zFi_xrJ^H>U`s}1P(B;_MP{x{l`vVYp3v+_E8C}3E8rgr9Z5Q6$l0vT&* zhbJ9{f!tA-w~#v0Q*|iu44t=^DzW>Z{eJW6k6Qp)c!>?Y*V&Mp(5EUYbop4Cd)`7 zDoP^jF)BroCCk{_q=-2P*^@HI9y9js_l)=FdtJXjySgrp=RD`N+^_q-Uzx3Tmibel zXfl(c0FIy!zB18&+~A9w5U}&YZ4ux4PxEpc%`zTNt4Err3kG-eNp30R7iaybu96YtXJ4PTW|+fL10E@!?@AM0%L*_fUMML;KJsXeP}K1fb9yU^(}8&pHpvyt4@ z+4KueL)CG2JEB&nZhi+u=_8$5P^^kGDWU|6=VcQwF{=DW@{XrXw=2)gt(Wf42JMZa z+Oq&-N~g=jabS|b2Hnh5$nA@fVrk2W1ExwXe04W&j1VEue&6<7P%v4xgKpH(Iru}U zKzkkwkmRKW=hloL3T8vV4(u^WSdQM2k(x%lLVjvsDM6mm8@+1TJlN8Tw?>UDz3rBkcDuI#>s_nwF8SNesUr32-puD(M?6; z)=r zPhZFquiB_J%J``7PYpy55-xhOvFv&NyJp^K+0yWChPCLY>T4Ig-y=dmWv$Q7DYqmM z!}0i`%5v6k)yIx1zt;W#*>={Ai-v8dXZm^;J0a3<|`F-H-|fYH}Ma zWnBMkW!P+DIG1oB&Zs=kN}Ov25xPLALfWdzMdsD!#3F(Q8Ihq8KzfTz9Lwo-yh?1ckKWs211Fc{?(^+%~(Xj)5w{2tS-AfRFsh0vjjHq@f(|44@cC ze*q$c@gVI67ASV=FLfP@=8L*!EZGZPL)Y zpFtW%j8`Ynb=52WK)?0{EChl3QO9p1vM9Z=sQ_mEJWTS|v{L6H114OvnhF}dq5X-o zS(luFT5Uw5iS}b)>Oj3k1ei!P0uo^~)BlO1ogSVxyD=n(#_^8(p(!Hm-$r9RCc7q)%=sPpVMkhSWh;HhPUMBgZqPz8Mu4HK7UfiDOBfnAX=IUS z#E`{MlDQZ~>u3_&E{|-*jwew4)>y+-SF(%pjNgj#Ze-vaooW3(snHsiknG}U*LnAsIj!hg$t*dXLm z!NkT0q}Yp~SLz(tLll7fT~LNBxL2|m+<^dmB5(UQ(peO7O>$n7WDcOOrIituPCC2k zBR=2p#ZRKc65n9mV5y(N%!Fxs!9Q+j=sZ{Ya+|nm;eKjovb4C!DcSI~~>aV`a!8(t%rtAi8k59FgrD1BA#bqGBQ%Tu(fLRPQphp-U8VFcj?x>mO*o;hSe%>sNj_1M_?ICJxX@+wc^wY1b9wzm`P zFIi0cQ}rGnycT0^V@mOi8azn<`Q%|cJ6TMOGGOZ=FP>F=Ml1apMboGt>&*I|hEPt& zA{}ZCuKjzSy%EW&&g4$)qjMj3n8pp=-G9dF=@Xw{XOH>cIrrybiq4_r$X0q~*RRaP z$Cs#4S&EONiSn(5%NJGa<-f5HHhQxFKm8e;oAKv)OZTkyb~Qv^JI%n^SuQ#K8*J(SUS8pDA8a{uZOjriNZYCI zjvwBELb{_3F&K(xE+<|KL$D3wL=AGmfw8yyScvyRq_9xUv@RB0_f1sYmSXDJ1LVSw zfQ_OvZ3I4|Nyo8QzcP2?ZA3K-#NT1@v!HUo9sK`0pTR&=;De!HXiT43w8mL6%)s`S zGo@29UN2o$7`vXv*tkCP*hzL|UInFBl(v<^_?0)he-;eZK1jnqp8!{-^3lve4kMo0 zY3z8(xmF+|wR8JLYI6z}9sbQh)shIx&iGOZT0lq6!ON)C()qDxym*fcEfi4%&)X5& zh6Y+?!2X^=o0BSj=#|5=qaR|e#YP;c`c{so< z&ihd;^TxN~+8vFn--f>_4EGN(sIMXoxv7T^s7R{d!Z(|Sx9VPJhi6+Jq8`&rBz)8P zk!%ernVJ&c!b#3H&yte*qK@u?oN%n}(zY#@1y{rw&O(i2nypXqi|M9lXL znhnVJiHIMDQkYA=j0%_E0ZqyP(X3Pp{%m`8w+2M_QFTW z-iGJcPxQSnoUKdJdn}Lb2~amUah_w>qf_q>!wIG$Vj$1h4Jh&4k{~zGN9=oT7NsFu znnLCIKCqalA_+5N7Xb}k#`*%=D!|^ zg&_P=$wQ%!D-ljtbbSca>BMsMAnljs>I!>y(+=dy<5Ti+Lk18=|E!_`D3bxpRs>yl z0Heo_?=fbGFj?BYIM`kJ)%itI{cm~R!E#PO1?V@eW{8jO+6AxlM5lN)c*;=XiwS|b z(ixjsbZICuHJ_kB4bx_k7ip z@ed1sx<~wB*3j=q+7+@wiijlX!%!-4H?eyv#zXky8#fFA<^s%6Jd%nbbh$EIhp;0gQ^;6`Z7jW83Xh_;Uhxy z7W;PGZ+j4*evkvx$_^Gz1gxYO&1)Z4fBYw_EKW!*sj};0jf2H29u1>%(Jr|IDNDC+ z{jX#3MfV=eI%d#Xv@7Dnz`LKCO>{wvIptT$wWm_TzK`vDT{!wp`E}yeaia=#gA1aE z-8qo1I}y(;%bp^#mU5JlT&;b(?@p*4Ecp7^ojQDRe~rG!+yK|-g4}0|%=WqA5liP; zMbnEa1rcTNq$Hx^;!u8U{mF>TS>R(m6R_*kU0xJtD6a6mdluhGjr;MaMnXStC%Ik}51#1C4y@+{i zT+m~4EAJ)Cvwj<~()zYC#0sm>bEUVrm<6cDmVxWej7*2ip(|>w@0xkmf7La7)oIo0 ziC3YAkrYwko9J*1No5MyEDzpTT8Y<$3WMn=*wF)WX7B(O;p#0k4$o{2*VqZOS;zyF z?22WRCYo1xEU-w-JJ%0rf}Sh&c{Xx(12vlZv5VEKmbqa(Q#jbR;yHhjlmiy zZ;sp<<8}LX?B{k=ip!)=T)Vu{ov}4XO|EGhSUw$e-OH%#?TICA@qM|%BfAu!n=Sf@ zBHM%hfjK@V=GX6_xc1G!x!r^y3Q@gHgm%KC(E+KX8SxGvgxx*x10BuqK3L;s*cQwkDU8MPA=BI zx#8^LyiEV2GInAo@H7Gk9IDb0YR-;->_|I#Tw#A%^sm1?^(S2HAIyY3k|XLH$x#io zfZc-O0V{Tgq-X=wpfVKuKHxk)ReAl&INpbccOHWrupw*Jzd&wNX#MA?_wNBvAJJ0$ae?I~xCWx^^^rvIf zy|l}D_G5x@D8wxN1BPOT=5PKmfGj|b%LaLUuK7nZ(KF)ZMD_s~GEo}7;o?w>p+uWA zM3_{svL$X&*qU!JEDlLa2oUXjd~3FDAtXCCf^8d#y4E&%$`1l8u9L#6lUr3M=Q4SC zl;KPX3ELULyS~~b+9e<9p=^xv{d;H%a{w|ruba37-uS(8eFn4<6s}gcr1~ACh^vu7 ziZ6MfrnIP;0NcKF}!HN+4 zqz~WjXA8Rj)PoE!6mVOa;b@OW1ABkxgZTW}K`Bir*tj~)14^W;FtXHrDh|pyZq9h9 zdQ1ZPAoH-ZBh7u@oosG;zAcYFU}M1iaOZ2RPtCfY}xVuJ>2$S=Cym`bhy&ZE#TmGNRt_c2BabXql!IO&7BLKC7+#7PM-P| zZU3!~IuP-!>QS1IEzNqovEntbq}r=wqmVYw`Z1-lzocp^z?PlZL+d)QkRIuMXXe$& z<6sb`Z_U1{fu@^}3STDbJ!%~O1xvuGf-PLF)-{jP#SdC@1*eAVXQP>XNLoT^f_M9O z&%b>5$7>UN`kwEUz9D#%V1}GvpIjE=Sw@i+9}maNb2=_kWrR_^#(2PH)qW8hM|gNE zv}NU!^;mUtsD%cm&WI6C4_FJmuW?H|J2B=yi%DFBi5t?Q{%J2~A_ns%cf9#{IT|v@~J@J&`i7u#VliUJdk{v?TQ7{HRwf$aGd$_o@kSjKLWJ_=tsVA~Dy>pvt9?ASHmAr4TXe*_h}0DQ*$C$5@CNtzL$+U`!^&zx=J zg%X5@a3S6Xy5-LJo>ui>P*nAdX%RoXpq@o^%y_n>-*~_4mBnEQKd$?Fo3^ zhcQK*w64+5+8~MxeB=vbAquoxXPG=0AKlfqvh?t2=yUlS_e+BfBJ^B*oj$Xv%J&*# zFB6!&DN>5W6@C?_%g^l7jp1((W{cV}!|hq07?7!)!w+bHiy8w|3SUhWkAfU);o33< zTiW9dBn2R>7TIzU% zQ9gh|5JF9H;&RRS4MgZwb7Gt0*6GDbi+xLnj66aS z-=oYgFm9bbvBLPJ5#Gj*3!}eNeG<~<{Xv^jRuICO2)tdjf7Ya*s}m4{H{7y;ds~KV zt`y3Vou-GPAoK!G*OZt_6)4B=4lMzL=<86|0A!Pd0)ZpX^5ta=B@6ua0BYSROTHFS@8t*79FsmO>loZtZS^<@;5?%cP84#L$&X=TmgYkk@Z1Uf;Zu_B z8D7;#nNK~W1!?hT&8Wq1e6d7r+$|jS1f!hCfIc;I#F6A=T=hez{c8LNo`istua4Z< zNX@_cnDf4$EmKfRdLYJ1wxNn5?tV+f^9Sctl6(RE$BNW-Z^f*{70Y4GR)qcU>N?n?*n zr2yvr6fyRGx_>@@TU7VsoyA|E-sKo6czc~au0RSh!wW|R{~;CKJg#ZVD5o!K7(^TP z=NC-|W+r;ne3A@K%W%(1O)Dxnl-;Ul^XA&I&Bq_#!v!;C?0&$BH{N$V-Y0aG=v1$H zQy(3^7;yEh<0btf!Ty&v;*09TUxgD}X)2c;cD7khn22$?G5N@dh`f+QIdmJB}-g*k=e_!?29Q=ciNXmZe9;Y9$*~KNyY_0tQp=3-a(GMnW zt~I2B0TuIGj3?>)qmaBRv}4)Y01sS)jR8ItZaIJyjG^pk4aC9GqoI#UL)}sOclXAl z0dNYKItbI-#rPT%X%m6OFC4{7Yoi$aAX+8UKu`L^v zWr5x;i@-F2U**GGEiYd6_YOvE+>7?6N|YLt*NGZ5fO^RGa%h6%iO4T|$O+vZ>#M+6 z#WPN$a3^`Pu^I(;p~H8xf+`D?7l110!QJ%!cFgyIK0!QG$XZRbR}#uNLns-h+t=<(l#?D53i* zPzURu{-FU;BZe*GfK&u%Se(#VYx*c)8o&_H5hx~^*BeMGo$`k(yPHLX)9>nsZc&R}InYtaj^ErQC$2d~BXj(@ygk9Gu3ChuAQFVj`&rnadNw$kJ}^NBQ4K>+wlB2q+~=47=H0kg?0D1g z@(1A~XM41d1ujc6U;0`s^1i!Ym~*cMJ-RPQU$mDSDs(8xG{76Yd&7>54bn!3MjXly z9d4w9BWjQ(zi3y^MTOgn!~KU3qme;U+b`XU9jV<^;M9~mC-J{e1ys0K6^KA=Sl1@1 zW6V%tVro+G;GWe|H{sRr3yuiRSHFRzGOV!3J+67vC#6nDjnv4>D0#wt)|s4^t##wk ztSMJK;l)$?D_Pv|b5AKZ`T8`M4C0V*2U|XK>?X9d7 zoYO%fEO6i6FmVk^J|B6;%2B+uc)A#lck_LD5=;4JQYG3>wrk~%RNxtyV)yqDMbIMy zz;w6t`?|#4BntrSD zfMVr+e|}6&jV_@p&|aX)_|nk9NMC(>;tFksJwB-QLI)c|^hEGGpIux68lUJt#2Ou& zDu1$2yazbTXPO}Zhi|&d$|)@liCLmvQQw_^a_GHkEZHgNK+5q zRoE9vvlmT$;Y;$_t?X>JT*Uk-4-S8%Pob)_&D4#QOD`d&C=nWQ>o&*>kGV5Se z_%dlmw0-|GP$CuBBDuhcpra8ij^KuSSCgDgl>K9I&3#tIX8hdzUgC5a7O-zjnq#T^gFy*sFT(^78}!X{nhl@ zz`)|8mL>M?$49l<2u%tkm?RZ2Q(c%QM9ZSJvWcM_cft#rySB5HBy)tk-2sCwgQ<;G zgu!o~4c?9yUY85BqmlUy+ng*UKWh(Vt8VQV%F*&NI?KvVGf=A6;dvzc@AF&3ybbAU zJw!z_o(oxs1Q>&Y^#AzGn^c?8N6)o3FBeX!D}oEb~l!J1V z=QsqG_Z%m*JCSerT)s8_0adr`!2s)m?j*3^_3xEZgv?6ea12gO=~1+K8Em_6)g8Ct zQQVO>(i6EUT~>Nl-Ec;md30Nb$9a_u)@Xp`+#>~jI&M*Vk3LSXoeZ;@)Hj&(k9dC= z!%#!%?ZWp||9vBjPaUbAjQItM>%Q;+;3%zig`O17ylDT;8ze~CEHF(JE-nTf=&8{P zTO9ZUDAU=3B>n4n1>;Ta&*TR)5B8^*c?w^#7Oz?IFxc{$UC-nZe14Mi+d1pE2F#q# z-~N%(;(=A%8yf=Hjo1cziOkP)2N(L?uhXerJa4D)4mu}ht1{$T4|j!ofO1p!a>t{v zdLJOFLT*Too#Izf5e{;A_j}n%DU5eZtRXEWr5A>42|_c0c<1id75DFi?fDp-+)@x~ zud?6S@R$pVL3bGc6za6kwN4wD41_p{GvVf*WH?ky;tk`rxAmL920QekwQ25@C!+cm0BY(>pOOW0BPt zKUe&*rI`lv^pG5apwe&p&Q^HZ!vUZQ6%(7_gj0^dH&KL?7-Sto_e}71O-DWM=L+=769mg^(2BQ)9hfPGxcH^rO+^Cq@hBqyR?8E$okzMY*294`WlKML2cUjRqcZJsdoP~ ztQ_++08bdaIx#@_$wICHQegyeUUv^gC~;B;fX(abQE+J__V&G-1t+Mo{%m^fl^dY9 z85IXZiSr}m46okC{v2w=X!RfO?z`F0c180FMT~fVg6D_#<)``)vu~Qr6b(v`kg~&ZB~K+ zm|7Q?2MKaZ!c-8{E7X*k@rt=iml^S8QI4vZK>~NbFjRb$jWGE1%m+|VOUahOTI!3H z?s0&7{;lUA$YFbcV?a}d!O4u{7T)=cm8{5h3sEnX7+xkM&Vw%w%#+@m*hE!e5{qP} zamDyB(EpvGPto6edPl9E(6wp(k`DID8WVVdf;3bLSR6XM*JdX~%yHm*FocLQbyZS? zzCV5`206=u!|E|lj9E5huz;TL%%SiqlKul6Cacz>{*L1VU`)Kojw7|*xod(&8ka;5 zLp37%3NXl&7a7aovFy1!5%@H=4V5Lo-?Fps)Xn+|gY+li*IPP!8k1&f3t(&<{w!sS0K^IvjAo>SKKaPEu&2OCE2`Aept9&FJyurix-(2=)6GytCc+Psg5bnvPNovlSk}S zfW6U@=!jek^@z07=)R9J0D!Hl78L>JQ`g#oGD=`(Hyj?E&C3U8933=bj4d(lBPN50 z1ccE(`|>SG>O7W6XMwmODuL;B*+(mV&-4-AzyPt19xFsG+9?VZ7O9Qn0wNoiRZeA* zCnvnF{s4|2m<_)sQ3M!>a*WFU8!#3Ey&})J$~^Ts$z06X_I3+c`DPmLnOZ!fm$We& z8L73W^||dM>dx;q9RUXpoEK+~W`CPh{lUhqbM$M~Z#8rl`iItsiUEpOd}9IZDcEGF zj6(LzCbxp_GXaqE<&$P#x!eSNrPnCO+sO6Y*#m2tVak)cCX{+jPPj$?2)+l5f`{sk z+0+EqS^)a25*j_YcdM4gFQsVKPn}=ojh_l@M^vVw)ggSM#>eNOOW!R)cl+%P%F!k6 zW$h1Yj|$T$-e43=xPk>M-q1sIZET&pv3FNd3=@}l_UvF@ob^2727cI}S}gjQ60g??{s#w9D8G?N%g9_dB+1`mTE1++1@$SObe@7N?RP$mXF4 z>+%P~N-poTVFKurnGR8Vu>Ah`yZqZpvj)pZO7m97tNY`HuTbdg0d;Jvy{4AuZy2K}H}6GUQF}>*^_$g?0EQ_m zG#u>uXGy=u_$LW&@%Z(h8BiDsXDB1O{`Cl)(dhEy=lQUN;WkEvN?^~hbWD7udt}bV zfrmN62~4BXp=jLWHNc;s-||fI^uz-{$E9~Fo=#P>Vmy7qkk;sW`ef~x*J7~AM9PYc z<=_I4akaed=V%OU=8P{)o!uC}+Iozv;!g!~J8K6M<^BQ5Y)=001JbUi-e!KT=34?Y zncogSliGpVL-O21<=5l8!AG3?$iv&7yQP2k zN&TbvrJPXU@v(S`2fyU33w25mI%4WIz%;{r-ki`8UZ2unBBeSMk#@rNVWjy81J4e+ z&{5UPBatYc_57U7d{N6kGRNWduR#&NcIX)GCJnJ8Gn5WMt{vZ@)BXnSI5!zsgTMa! zl7kG;+UDFCNbh?ca4YeKoU_qI0Gtke|NK}mAzBT?D6s)c(;g0KK0EEuXtL!lz_rh~ z%fS65F#DCyy4|`Y!bDuPPpb}_U2(lQD3Ox%jOA~{T-fes;*Ma|2cea02?z~9s*3Xr zet@of!u%q z@5Y0SJvV@BZ-qC&C!!I-WL; zjR1bULb1>0pDRInW)aV)@L)EuzB_Vfg5zxXvPsZ&`l0(im!o%|xNQbPy8%8mlB$FS zgF7vOLD$?8Pk=+drhK8VU?F(kx9rk1?(&?Z5BdsoPNR$;Bns^ z_{^+qGOU7A5{Uw>K3(4(JhsAz-uM%QyN=IqSKc33+?@F}M|l>XUp!lMR(y|% zNuI++Vd5hu0={gPHhHQP^ZV6@Z?f~ti~~7&qzHnS_N=}t1-`1eyIM)unznMSH?RnI z-AeGQ#ngqr8_zzcOq}dmepajZC@4F*N0SKf>#JpBuk2q)4!B|P~$?`6=)%P0&kxMgPyV?9;RmblWCs+iqb_2kVuhq(BQ_dHkpMzjG4 zL`XQ5$+_K3<$yJ&nv2X1SPAMu^TXghGwWhzjf@JPLv0WM@l!+uN5Cu0fj`}%w=)`} zhX=kpqLziHw6~#H{YcV~8Nti~th>_PO;W)UvH(`bSnO}Xq7julacz3gO+0vlYsb)a zdS7;co)0_)D`V_e2#O*FRZeRF-pv7{9BE)+0jh*89>SA{5x2R7lsiO+HX9H00`J>n zOi!nb&VAM$56#s!__%g~+1YZECDH9(!<9u>e<~QBs_^n~QBN*v*I37JUyKX%Rb&n? zd{|!&l~U12H27^`lB-G5zqdnJoP>t#Wk7@V?mf`0|K9-x;JI~*8 zoRS)|A%N~aM+GhiBp^F=G^|G>SYS{Ce4?W$uu(b>tSLC4 zQ=Ouf(($5mJZI^qkDgP4zpNzf;7AnJlsO9risYGx1H|K$)~lym#_aC?4PC010^k@> z{B^P`M4~A6cpnw-Kmcn45EIMbXg3xI`4Z*G276J>POwtQW75>Y55O)B{6D~9crtl~ zVVg|mR2D;$k^)jhfQ8~d#t?rtGlpH>{44eIcC+^?7vFf}>_ja!xz|E;d9Mf{A2DBc z+*-`Oz_Hb>`K_|x9B1zVkNRK7&e7dJW~JU-Z1@>mBWG!ir?+YARH)Ohm@bBdxff5r zqs{a^k*5ymT)2=h^hl6; zL5^yY3Tk**J28plO#FSzg%8oQpK{hGj7j08FL2Za|9yPS@8LcNB0Gb+!-i~TIiZMt z_#WySF9n4>M-l&_BW&>~ypIgNSfV{RQ)?bWDc%F(<#ED)9~j_WbscKIfM#4-Tl~vH z5!=Us_W|t6rcD%MoSmU9(H5#e*;xA(fN}eDHFab5t^2yONO`NLPvW3J9@hPGk|IEx zTuDXdowGMeow>#=X>nfzCa&O%jH`}5v*o$WQT0nkqIW71Ar+3aWBW$vqG+6Y90jUHe zq8J(b*|)&GUHS4fYOJ^9pofC>@LA%=Xcz28bwjlreIqXVj6j#cn9jH3r1@mg_gv(^9)2T5M1go;gAw}t- zdGXgYbj!1g1y*x_j8eKSp{_@$fHsn zK4JoivcaiUUf=%Idx$@iXG z-v=rn1Qp2QzGK<1l!c|u=!UxZSABT#%K7fjk9(ew=E&Y_S@wWeczTewQh&7_EM4FMAjlpxQG4w+uw9mO5R-)K09gzR z^$5eZ@rJ>D`sSId+M#1SWKID2UW0fTX*%!mYq*`U3nP=_(+ZU3zLUb@w+}sf)>gj1 z2m_f)!G$YgKM75huaCOSfh?_4jbbRGiJQeT#l@GmFQL?5S@H^ns&-;`*Dg}FfX$De zq@vAjO?xxRNd>%Uy0pC!3yg^{(L?DiSCwt5sl0mtD3%slQ01H}wmS{yA1+|Z(Ad4k zNdSM^S#C=OTS5Y2l=Dh|qeG{|V0HeCho@q6z~XJNlTwaz@V^MD!AjVwxTauZz_xuH z;GqCNP&atg0rmFfJ~l>X75NK0;}j>jgT=sS!y((zE_n}hghC?eMtl{K_HA$e{;U#)nyc6AseUP_jS@SM)sWW!gL-7vLN+^b^CRR?|?CY zZuH=qlCF;|o|o9l{2TIEkiV|EJp%B7C`OmH4DmV1Y25Er8H#Ade)j?f`D;{%g1st9r4hz4_={iN4 z0a#z%VWY%-kdEdT3Ux*I!?S?U-=B^}AzuL+m?!pp#MN4twz{=ttyP&by!}(Wv zBBOq-(5{m_DQ`S!U&{0n^W zEQAOAR#Eg|++Hx`#eqj)Mkg$!^%LKoITHW?K#iji)_AvuEL7H`X#KxqaSFz#8WcYv zIhlbD0Rso1!U;Tq`P}@mx^iOYZIdS!TX+T7?=pXVa+FlSoj4~ji#B*F{32O*%>hNx zIb>zvJn>^>97Q+Y)98GuSJV8ySS?50+ey_wuP5Ti^4#0RbGAyI7T6hg61`tF@<2YO zZy${>62lVeN5!pDa;u+~xkxSkgK3xoDc>TVXB?8(W6oD&W5g%TT1)A|gV<5AAhEZ=g_t|azExuUyy-x$l$M|o zp|G(OE;O8%5&v4PYZqx0oa9g_ajB=Gr}c%^@GGsCsS{UfT>%hn?ncx3a=Xrv5+0Ws z=cXV$7>N5R4-8IYoXMTxL;7@SlPi&*>W_cSXGtt)BZt;o{16j`11R6bCE)x#4D-FH z3c@|iQXR#(1B|`x(3Jf1!j=i~N|{(gVs0DV7svcRW(iqGH1g30(@sPXTv|OPlDD7N zq=d$@8#}Fe@JUX6&SuZupUwp#Znj6V?f?xC2riulMn5*x4`>EZ4_NpeoE0%6qV$}> zQgBWC!j8_7T+4>1h?-}YqbzgNa&h@RSrHi^f`)L0Tumd6l( zmN3Cyq6>y{7FZ0gMW7hX=(?gY+yyJ;hPSUSOE zAw%aYmp66NB1!7aKoJgh@xI0iijwrU^?)_PB^k}h)vN@${><>_uC6>(J!(&sQ@4#3 z3ejL=9IBzx8$y}kKLt$;*&c6dsX|!m^KQ`O*O$f)sP?n>*^vctDNqGC;4N5SPWRlN zdQQCpl2bSj(F;R-!ya!U4!6QJ%;*zgHBz=jm` zzLR7UMT~cJSbW)BjhVw9g@O}Xb7S&fXYNS7##eV1t%v=d?-%FE2gPQDOQ}GrH~8?X zZl>HMDW2_d=NlAqS(ezzy-Rr~9EH4OM=>Z|y#Gb(l%QNwQMlz8;|Uu>?$b$Nlwh`p z3yG2(?*ty`WMLLUP_-34rzn^FoR*Veevi}30f-O3cMHw8>@#SX7)bQ|aOdanAFl`| zY~Oj|_sO*Sil-EldyZyq@ zM3FeD1=)CO(`wJqc09qV9If|D&EY)2^0&Jah78`KToVA2taxX!b38=lJ9jmepaVue z1ibShIUF@qVbwRIT+@(iw`A6*WEqjyi4L>5JL5NEyn^0?F}TvMz|oe%Hib)V>X#P( zbp5Ke-QzHS1(?^X<9T^I?RjDP^v|*W-v5pwkd=W_=ao|A!1GQWw;?^qCBM8wVhl9- zOoN0mbchr&1dvsbzPVumYYZ{hCE?T|5DNQBR8e(@$dz1BV)HRF7u?CxR^8Cs6ZqiE zH2p^Tp&Rp)-eC(ouRi3ek!?lfzzEwIs&HQAoqHwRP8aFioXXYL*4@udWL(kc_1v7IKM&P6&dL6eOD;gqKf=LY z*7cJ0{=r5IS-nt!R9h=vT~)B7Mel8hK5twq@qNkS>$BayFT?&C{Ikg&3HHbn+r*Xv8?-Ig2_Al*&zO z{%LYLoBhL{l-Tp-Qw)QShBKcxFZ`b5l5Dj&Hzg(9_AnVll^9k;eUDH=E1d0ngdNns zi*+TWv69@}#pJYHAP4t&YSy;0OSVqTwb(e!>@jMP9=I1pj0pivM+Ph0W5tHdM41P$ zP(})&$y*g@2n4~JuN9-UAG}t{GS`N~XA(c{m{>H01LR(T`Zwp5l_5359yuE+9M>~94$>5^J;ozQa0}aU>?a%V%UWr z$+Ja;Q=B82&q4G>!<@5J3dt!%2b6{UgYoL1)y~JlEv=e16^#d5XRpey^u7IR>T#hd z>_HSxhr0d%9A+A=@#Ua!FF82(lRm&rl$3%J^-FBHr9(yrEMB!lpw9yn%x}F<&Hs%z zOw~3!7id8?50JkY;x9|s-}${ohP-tddUc+CR==1N#0W!HM#x`M(I~U&9>SBPZvXAX zA{ru!c3f0`(OdDS9Lxq$dN^vA|D71->2>lTefmS?EUQ&OAJ+@VNp&fvnxGkEmBWBu z7;}r(wR&;?bA{t^kK=aN`OYYCErl#qCm@H(qBEe{j#)N)EKKggl6sgL>X!^z6W4x0`(kWL6J?zz8QdwRE`u1j)%;z|!$S zvE3oi7CA{lM+BM!b0P5AiQxLWs|{~Ak_`5*2oMg+TAZ0Pdg7@x;hjCZ`u|NuWiA=Zd-N4~r6nQ5uVJD7P z4P-X#B&VevsaLTKf2ht^XqAAWNVl)3#p^oV<%0SFfPdR;Kgmg%oZ8Pfk?8l$>uTd` zfV$_Gf{U)p-I8M@k{&s0T%3`Txe zBa4ANFMIgmPa-m)nvlm=ib=y=ZJxk6_^eykPFUPOPI0@A4?fHv&)B}h`e+GCu~@DSAu?bC$XG$Yk7 zr+Qv@Omoi~{~b}|d^5Apcx>gg50 z^63^{6(id>zj|ALd^h7(koa@Ny2yNA)cQeH;c*?NF&R20D62S9y;_GPG83-VAL-qRp%^htzy{S5g6gN$ zIZpIAFC-nusHwdC8l1ayMqW3u3D#FvS{_iJWEuM)4d2a)l_m3I8FPp9Ewv6Hc#Fqu zw09rD3mS;jAJ%tqGN$RXFhQ3|Jc}iymA7La#~J% z_wfHQb=`qb|Kb0RxXP-Ok(r8AMv-xxQ6wpnB70<&%^7!g%1EIU70yLg8HJ2HXJm!k zojuRyjWfSvXob2LHUa=raWbV#8CSm{t{XuPf=xMIpJGhc4?#-T~mF zgWx<3Mg|{z-M^VKa4YJ<0m0ydh7zJnB0`M;?5ew)r-nQlHUbdrAawa*G`&L=@H9n- zc@M6Jw+2CA_P+bG`de>}s;?6gvHSY?__*}08c(G#HH2<{nHiL`@r0pG6 zDK($;wU~!|&VQi|1^Vz&1~mZ4L%_7+64`^oft6o;5Lm(<0SuVZ10kk*g*aHaJXTv{0JsSuHYTa}-4X(_FKiA(R?hPo495+A{&m1TjP6=?%HIyw^@F>z# zebLR1i`A>=mY_}u-OJV5;LT^Y-~0^bqnR)fLubH9&JR)Y_9w%v9s`gUq>wetiZeq| z4J~kr8A%Mkr(OT$?`J>)J!sJYUS>d8GlbCYM?PmFn)4D_GJyCDxn}zgYd!cf%<5?m z3s8u6A;a83#Iu}~pIS6&`e=f(@C{m;hpM*z&huyw6pIK8I9cTIl(8H)O3_Y4cmb( z#jZnYr%z$(+z8*#(UPYV;5mKss+sr?6GtS@;C#+qTSx<@e9VGrSr4mhqh3$fg}IlV zL(~25|1}4o7Quw&_cFspp9vTx>4t(~*jzm7%!JpfAl-Sk? zRA?}u?pH#m{A8h-&DXv-OxcNh3e-YX7d4z9W`A!-FcO4Qf39>yRQe+D1-92@wzhMZ zt46|vX`c@8w!ly;Di}FyN@?e!?0DU>2V3stn+dBNm^M%!mS&}W>V~CejBhHu`SjxO zS>V&$mR44k=SlG*55+sL42X2Y!!*bGbW3?(4%SxEC(50_Y_XjiYRWS_TgvOMo&c#< zegG!_WTKtVbZm^Su5x$iE~8g*3Q^uWvhMgla!HG@;!jOR+8irF1~^MXZbDO&hh7wN zHvCe`z2rCcq2>gL=6xo(^H`5)n6U9Xy?`(i0RWeO$P10QV;XF9q*nT3>K&hrNB83k zPCKGDT~1}09;zgfjUNW!7kOXw4ZIx{czT%f-bMw;uOSr8`WvyNB5#c%SL=!(jlN4k zTALy%50F7dMVvIVGf)-rg1!}xtmD#)KL9POu=p1rnU+4!M_KjXJKJ+kihO15)_dW@ zQ1!WLJpLi2uIpTbL&q`f6fKxG+o!1ZQ0^FM#wZ~Zl+ z$iL?lK#jZx5+C^If6B1$U>F!U{$vhH2fx{)p~J~R(VV;5FM4fJDrEF{cV=>DS-W!T{{-U1H!! zVel{ezMll?=ps0Kd5=&>+iM_@|NX-U&;k%;Potx_Mc%juXzAR9Ud)e9GMhkH|5Mrm zMuVILBeR;X{WTvP>lNw8K8HSWa6YI5U z9OO`K%S@kKpKcKFmzY$k{`H>7uP;S&Mq5)pttGgW;@#>HWGF0&-zBvuDx*t(Ne=vQk;}7m})8U zUdJbnV+GBe!}0(Xae=GJ2ed?8!tKa~z!x9C60Z`L`_qmH9cCkWyPL2N3Nb~apCy)XaHE1gR(b?0AXBI3|VO3kCXUsLlvTU*e`{0_erS-t6$+| ze_D24s{;5Wz#zDu<-n8xS2n7eQ~Ir*11jZtkWmzv(!oRv@~8&l2{R37xjXpUH^9gx z`wTEJZ#g>d`cF6+u})Adr~mhB0ATqd2uTB3TCk#ZP7xzg^XJ|+DTX$jBzN%`pvMfQ z&tC34uRTkJowKvpee+i$7y{naT>+xaN|D=li94IQlGXS(Wd{IgRfkjo3neCr8SWK$ zMkAd=BVHbz0{jFF4xfQzYGYM2(8(e0g^V;Y8h7eTo5n7^FEa4601wIE^S=0HvJD+a*I-@S`T>nsXJun<^)bk9{q4?d<=s|R@6(?H8;~6j@1QH$jgPA<^ z<{K+MqWYpKu!6P67j42c1)??0Yn0C~RD~_7Q{q+8in3oW{XWVhC4`3`a>>%Ci5_A( znwi?%_#nf^DkL{vyI?M2W?Z#~w!3y)g<$GdV{^C71hxYHA*{=GAh1}i5h09oHY_nN*NRrcuZ0!?`wN!)SPptZ-6EE3(1JP#ob&|sO=O3hnhS`;DasMiG zNw++f;HGZK!*1>y>(P=7_>=gnz^VRs%pM8)G+?RBF&OVJGpSY<&$w3eqri>_7_IrQ zZ^$Y5i(o>~fcr_2VxjchtT@R;69teZ9T6fT@zTco-{UpNx)K-_sG9y{!g&X)Tuml3NY}vi%b;Xmu|B~fv$R2wf>@2DZmJG zhW0=H3W_Gz1939~1l9Y(=avaL8~vk%G*%0~OF;9({+l7?BC%tO$02fN(BI*qpu%LC=h!3xM^B^6<+@Bw%yf}cbKw)@xPbKZO{!tmy zO(R9FV;-#z$BEGZ`J))TEke1nJ{D@zyPNr=#`4-8_Xq-y5@hdG&WJy)+M0#BBHd^u z3p#)orY8^pD=JH%8eDQfWhbnLPVTb*O5kP(RFxWr+a)IP`_J(t;jPgJ%+jw; zg^f%Bqa(UvTw~q{?0Q(ISC7&Tj2tTQIyUC;v^4BhlSV{VhutoUPD6`WRgmPXX*Kd zhiF<i}~MT)|f8(XB&UysSO z>sWLA_({~+F=k-u9B$S9IO<+%P*h$sqzxiNAf7@{;ReweXi-MIEP)px+BhkNV&m# zh=SJgdSl5{-a*8=hjq($bdXAaS7NXgGTS~c%&Mi&2TZxC4Vj-FLuB*9U-h*ygxET$Z42msjs{{s-MR5>w+i-6s+<=!a7|>J-&+PVY^27~P{e@ZbLX)u^HD6AoZWfs3t+^?LjK zuKg74dgetu0%6{tV7|&Ittnaa?_kr2!>@_)lPd{n_RgM#A^P^kgiBlZe4${{{zz`9 zXL~h+MT4u*dvopCRifU2b-u@Qz3qCfOE1>Y7s(apMptxO!mPe|FwwsnH@~0%;EMqV zS0)87suykw(@o-Lv)p-2HOlv40jI)gHb%F5Tt7G;L-pl%yl<>vkBxRpioqLQ>Xh7> z!p7fftZ1+o$N1Me&kJt>KBi7Dq+P6cQMDpahB1OTalqhYy?^7seE46Z)BzR)2)IuV zM2^Ev?}^2d45Hj$%&`+5<_$6FMfgTeR)(RLAKC^Koy=c#`a)kB`ol)fx~bI7x%c)V zr@H*hz5P=+s8zBH%yU8NZJ}z1v3g)nmR%MPNc8_p+D2Bxs!I=}O^g874uU&Gd>u#v zBTX=`A0wBt_Qy;qCkRWnLbFH{phFo>NPWE&ivB<{)mHwhwbD2U=Ysnc-yQ(AH-Aw8jEnuR#b>0=mwG3 zbnmzD2rHG#aIrTy)>#4XWq5HpbaH#&va{7;J?{*QKX1cSFWgAe`MG7I%Gbu6VRgIpI^ng8WbX^%lN}S! zN`PwTJd>ZNA~KIOyL|>%Fz>!*kt@H(gsiiGi`<0x<zjRC+K=9H-n5+xk@z8nye}d6BgY6M=EgOi7x=~>&wXK(|`eBEVH{_;M+YL&~aB{ z=IVcO%8=Bq>+elT#lQ^shqTo$XBeNsBH|@-o;)0Rg?`0uDX4hRre?9Ie3Z8@Yk}Oe za<1rM^W~78-I$XFYP~lJLS@#0o6QTwT#g(3`ajy*HgcR>+QfaAcGYtOiNDR+T62Sj zWQISYx0y?(5pp&u0UdVgk2|F6CHJR)Ikc>fs&6708=Y-a>N=_MT^Xd3Cj(Y=hJB4C zZjj>~%MiwCGl#HlvCA`#%R)mS zjSW*T{G~QkA;dLbT;`$?aKsuo%!7c3yRYF7EC&|$ z)hLqsqNgFkonsfBJIyCH`iSlEOM-)hVmQ5?trC1JGe zSq30sx*VsUleePMXpbW;W9*@G1$7I`C2l+Jyqdt=`7^2P>r(u)4m z*W($lO3l{!*qNo<_xeDW5;2g4w06xzjGtN6);74SQtB{nAh^*DiSTgROt0w**%!QX z>JV-C=-x+QFX*C8N$gy911+FMqX<1{&Gxd#{cL&ZQ0ydP*rZX^60-grLhsox&)vOH z<9x4sA}x~aw7nlUUzQ~!_odt-S6w#6Sol-B%5EP@-eI8V+KnS4!G!9&wa}&V{-V4g ziBV?#t8`ba6T70UZR{4cVPoO^msocxum!fDo_8^t|FX!d*Nw~mFTO3yipUu>b zq4?P6>%G;-VRf}D|G-cCKRyV=ikb|v-j5nn?-@w<=irwOsFP{l#nK>B>p)Rkcwq z)#eo3JVZkgHfDXSIvCJNkf$TyER-tM{hA}Dm87ka^z`4e-J90Dv`riJz-_gz1yp%# zBV}0{F>r-o=XvN?ir~b-J@f{{UQu`eRU6n+^gqSOL997-Qsnf-tAt9SIX^|a)teSG zF$7d)`ktHEM)|Ta0DUr;@fm)?BSpaznPjd;M^5X}3un#GeTc`8Cj^TrMhlEyBag>V|KK zhKDlAV?x79xZB_po)L(bSg`ZD=mnlKyNMtmR`$z!Ll_n=OJ53p`V&zq?j5U{8?znf zq+rg(4BopVE4Z!m5zw6z-2=&`26s9Cq(%5~oI@PR)o)#$xHg23A2`~^4`-Xl_Z|QAi4X+9JZ>d*idj9w zVAq%fe5WUVii|ug$8rw3N2yY8l7(hZ^hSg@t^^3Q4d7#Ey~tPT{*DRNp0fN~J~;Js z-xl-LCHqw~L~V${phu0!LJ4L2?1sybS43}`?34BwB{${7iDf(}g#P?|$q2`r^^h}l z25E)GwZj4Nxp%W)bZ{^rBHF}tSU8?lR5^)C93wkUYO%R&w8PbKo{i@SSCa2(4hVvC# zLd@Eyh&}0sD!1YlGWzQIzB0iJnB30)Vb!4*kH)@KbmS??YvLC_?HpJvkfy2PbMumgGqWR*Ymjk_{Pla+U4Z8RXp>$omFbA9bR!A^ACK( z2voVe`f7Kp&}UFq_7D~3wKyTBulyN=A=~9g+~DD_-&AKKmcH~pM3sgbr`}M(rk8hF zxVBvxk=}4(+u~6-88zO8oyus2g)R7%37pup)H12Si{gAd%Z6_*xf`sg8^rs0U9q%- z?eCu&x=dPQ9`u{5>5BUtHIGc#F@Rklkc-}!D4fcBeJ!uUMDfM_vqgnDZ~7FB2Gv4$ zJH6)wcKqiA_BhrD_Lqhh=2X_P&mNxqyOb zhOZbeM+ps%E}7Ez5ix5XHc-S0VSwNixp0{`gp|M-7I8_WNP~L$!@l0w)UHq2FRb5s z(ApliNox8Gvle^}==Mk`=7y&q@*_rcc{`>-ru(Apzm|pHF9P-Y-IBj$Yc^03T7qG7 zLI=(gv+o3$Q4VtlKT0N{UMm?@9sfb`B|H3p{t@`BgeoU=OA}m8geV(s^pUxYxYDgJ z(RVwhty^p?DZcX>MdD=#JjY+4tdcpH6rk#15ew}%$`KH64DNn%Pp49(JtEVp${FvX zItx$5epnpIE;RD24!Hx5D$*4worrcw)@@KnD;FItK>yBj@~2o$rx4AwAINa8oWpXW=Tep zcXmU%3eQRLeGe#5TL!JC?g+UFA^QtQJIg+g5;s2Yqj65W#N|r@%3CN*F{;x<;qZg% z;7%@vVKoBvXS{xAzYA=4Q)y?;k#lF4_Wmy1vnm1^ zCGus@cEy%OWkFzX-+5s#G~@in`Mr|iOI-kL7I!FsbEbGQZE~|P zaC`gw#w2Y(Gko6F{72enaE;<9=|zBEM6jIbb#c)yl4dX?M0_9neMot)jf>+^GW}~X ztGcECvxjf}F|l>uj*Lt%id4*@=`2QmB`M))eZIH!yCFS&{9flXfP+Ii+1Q`{k zm7E4Jp1-WzKXo*KaTNjz$?FLtTVW%Ok1g-y2m~+nuzbM~9#gIZk@&Z|7}rv{$d8He zA?atk138+4_^!}qb;(ao04XhMnB*k?cIt*!4mY8#j%MbN-Us}D0LFU|-$pJAQQUtp zcW{uau1H@Td2xo$N(cHPH}V40?I5`&4yCbd)T8*G^*v_Fwag>Pkp7U=)T;>B)|ZcU zfz3>pVl$PNPKem&NXCqN@z&9~ivx$pDi&-Mv6jy&nMW8&T~7*aEYCpqKOP8=Jk{TphiMHJ^nfLJf4X zlUm|t@8V}wL<~BA4)M;ORzLOOHVxN3!!E;HCe%dAAjbTFrG6$DZN8WJ=Tp|P{HTe=U`?9-hNtr<|k^;3zE>(c z6;SdvnVq1ry?s)Lh6E$4DM|OixZR?)JXh;6s^6X!J%pHGBM0 z2Dg%1x)qWfMwy$Tz;x3?*ENq2`41I;)Bv?Za+N7*5u_K!;>1AyHYz^l&8z$nVfFU= zE*eO2DtPIRc-OK0(aKT2->gBuy-nz##(kCQZ^0pNz0?W~_fIa7K4fqKv4$(KaNp~h zc+uk28^!rb+0`8=(reypPUOC!0$1l-u#sOwjv&Rjw%R^<79NLPk#pYzmLRzczTQ%H zrN!(guEvsB5QzptB7Xcb&YYLlbg1B=)N=fyw}pd6q9Q%;s-~4Ny|h zHg!OiE>Ozp)$wAHlkK79?0k3nYy8#L0YA>T^po`p$%3*^>e`Nc+P8ZP^%JLjtgf(R zjq)&FP+_MROFq8;_Oz?H@E<>-xnI<`A*HZ3>19s-oX)(n7?G|us~l*T!y>|3pg?_9 zZxA`5X%$HDB`&|0609dwU#Z1bBm5U%OYY2Ii;ntlJF@u(V~-0BT(@iqIYi(A84`jQ zlX}-vxnU=|fgYD3A82+-_t&=gKR=n4JVQg8)})v>+*mjF&+bDc!ERfq=6j3jUgcvD ztsSFCSW&>8_GWH4BcA+Z;GtJ3L0@ z5AL{h<1)r;#ez}uSF%7eW~Mcif{;HZMGx-8&RfGolM*n-KV=zAT6*dmZ}0eqc$srh zZS;+TgBDzXw7V+xjKD+`$QVr1%(xo(Ta6U5GOC@k{acU@c3&HzH1KVQtn7flC|_BKP++U*`*HuF2D*~V#J>RF`8W_1<8t3*BQq*NG|T2}#mI9-!} zdr7uWrNQ^nQUXP-TxJ?;d9#>(N6d`%t{c(m88T8hTS`JC!%adY`?HC{GW+s)o4}#S zQQ;gH#T<%zoTSsyiO-y)btLS-OK25NJgsA>Ef^iF2r^|3aX)b^tC5f1f5x|{VqH^v7ir7DEvg_ z)NlXvf1EmtJP!~|3ScyV9vuknSZKG8<4$Op^z{@dC-K`2PL%au>7DuWXgFls*1Pix zFz=3%r0#SdQ_Qy#PahgAv^rOc*5mAY-5 zIZAPa&@1Xemt;4S<7Qu!84kthd$)moHXop&LvcV2EbuBenwP((czfzb)dp(zi&3(+ ze1nS!${X5Hv$vr)N^H9`^2*tx2`(<*0MEShGW>D2=*>Xe9e32{_lHUaletUn!i@#<}(M9gg_qBTP%8@?3KogwglzPb;a$oW&550sOm! zYR5G~wX>IvH6r>9R+}2hKIpn6=cfF4*<#~nyoYULEq1W(Kqvi|16M$&|M-UieFvx> zl!y7dcs8})2Y4~?4hJl~0NPIehVSQ+LGS5J)bLu+L&BMiJqavSYU7#V-ZHT@GI}QP zNB(JIv;B)hWIcUz)K^lw0kpG&!95bynG*7R}zJn@{YSw5R= zsv2A2>RirZiP3z>N0E2hopwb_I{~5*9w%kKvJjgK!vE#0J2{$WHL~;Q{v^X zDs|(VzJ!u42Z$EV^J)vWKTu!d3DuOhIxy$aH0PO~$97eGOYsRSBPN`iS^D;EvkX!mYTd~lqh+pE}!*-p#r zEHu!qB8TUC*ANt6p>wU=Qg>!wUtSTzXJ#r^uO3rw;k%+J6d`UGT4$GSTMk?zt%~1k zed;ME5#*!4bzVNu0^wE(E44Gx6f0a;@Rv#YXRXus?X>$VXE==db&Mt*5@13>k9{?a$osGDH3znN@Wr z{^A{w#eexDXmIN{kLi@bdVBT;IDDq=p1V>#bRc*=n#Vs-Ci0uBkNO9~&!WKbvCteT zi4X&s*Z#!3Hkf=+Uew6;784||sD}RM^(jMA_r;95C(G@JW)vRV+S>NGBWkifH(zpK zE?@*=7%f=U8b&J?f^et*c1g)ynu@5(WV~SP|A|VH7IgKg3%nN}p&LCEJTSN8r@E@$ z=GixCoqE~dl+DjnUurn*%3d3CYCVY>&*$s<^eUC8@R*(BCJ9nuL_B-bTTy(RG z!3rzzjrKV?YFp7$1Z{el|8mws4Gf0zwa28pcb9 zFi1JHx`j2`NHe!Q!dD_{gE6_58@hF75I)a)qL$l?7b6L6Tj<)xP6+-oMPypfQ~ks( zpm?nT2b`~>l(C57pdr{7rug|iszxrAEJw$C0?D=Av zsZy#k?YL)()_UIaoLI}zn`0G$r`abZ|4QKB-8v9F0>#gVu<8RnN4y3EBRu_!WO!!h zR%)5`w$KrZn}4mUxWSOmM2;bd_T-OdD8t|^zV8C`A?y7HfJ!(6G?&jnXl6R)0Easi z?#@$@9?URp5a3?M3iD+}$&Nb^w&_%^YO zYxCCMUN?haF!>XfsYCt(`XD+fs89})x_1|@2 zIo$4j+YiK!b^2cBnlszfsgrlvKmc(>2jH56*D6eT&}4%8zl;q~d1Qs5%zP#dQfIl(?F}>+N`a6@V2m;h zkoKRs1~g)1`6ZYrT<%_Wos5DXC)pw7h=drvB;NUEqEC)vSLb6^DP`CD%_t?`h1;E7 zxFek71|EtCSUt2Yki_W|IsBE`LcIt|5E2|cbK8RFhm;S*QP18V+d6O$e^(+zB5e0P z2YjxT6|=E&&JydZMl2L!_ZKt1S_Kz7dT1>_6m28U8+QTS(iJhixU2{s z%*CiTR5QXO_~s3T$$gt;_YQS~&|o%Xfssk@8p%X8h0)H{CBHKWg)01fxf2ztlM=_c z6SgIMgZiL+bKFlt=z?{rT%(71MKdh}V?2WQZEJCK^16EY_Dy?SN>yTTNX_Y2pU~6v z`OUouo&x3L$raMjS_X--eYKmE>XUivRHP4&a{a}(0alG;L^Ed0b=qoVe9~yRn&rVT zfPVn`br9*Pv<5kC#yf%XU0#Qu+^H-U`LgiS)|JH8kE;6?OHiOp0l}E|!&K4x69p08 zI|b*}S*|wN53{n;%zgp1ix(JYta9a`jdN$72_j;p+E)aOk6~(^ESl5Gj z_#tZk?y|o3$V2yZr$_jNRAyw+_`8TH6)ke*P_VQ#!9jGy#p`n4Sre_z%8Dx2rT8aZ zF;TO%+o#}jtK!JX2wUW4(|J@Mb%|#a{w!I*?HGIjGOBF(;Z(Tsk+g+Jz;o@!`WRo{ z9dV;$qrN_yA(TgRicha1^w)M_3q$G^z8^>ETdI%^+P4(vW@1FQ&qVUojYe-w`>A)- ztKF((PsJ%fz6_P6dV5`D0eoyq?EKL+18@K8;0_>GrPzy zc-ldO93bqaA;U$u#6o*|(02TfT?6vn-;QX#bN-hNpFzLj4eMKUYT#?4%x(NvB%01E z9B6Xm51~uUVA}+D&JK#;zzek;TQIKoKs?(7qMdTO3_|KLBggUZ_kq=eA@2D~PgdPm zS?F)Of2hokDau4n7JpOC?OqV9<4^T4=y!mUA2wGC4A`xFIK@hx-(`ym)r2+gr$rXJ zW|Vl$fAROY+aX~c@<3Mqg%0N}`y&rfwW+I}qOfDZs-ekuYDZ(-HiLzo2}*`CVLpK8 zo;?NMcQH~}qFOE92D*dW)VKV3-@u7+7};EBTm2kk3;z(gAJ6+_cO8tX8}VN~Gw3U9&yYTV$yqE_mePyrCd^S={syG}Nl}k0e@%(@bmeuH0f(c zl3~$Ncjx%lLej23#O16d?PwJV6D@DakQ3{^qpSGPQ7khd@=hK~RoAbt18VLL=_2zp z%&^NE*1k>4q6qi%q#;7PpI@0tT1+wv<+5EPXnV2dcYp=8SH&)}-SU;>3(RoHP{ zLpqKe3pZ@U4nY>=9yI6#eO z^c_U`tcj_m&HYGChR51%=AG`Mj;UmcA#pxLD(p^o4E)Ux>3rzV=;Zg4>S8je0|}K? zlpVLrPY4MH&9|B~!aTv0b_iw9z!h-Hv{n_OkAD)&R|$t{szQ4E z_)y@eMOdHzj_H->WU}e}QDy|z7zI>0+(*pd{c1{~rc+TRTkmqp`Dxt>v1cnUD0;tm zj93yx7As1ws5Zu?@dAf@LxW?p8s~L|y}R1I{>P}{QeLw&rPC2P%{aq3t>5R{OJCo8 zmGe+GV$t<7@Z>*XfirNo^Ow?^Hh@g}m0CqGO4@2vC$q>s!!k3zGyC!WYaaG5N%_O413# zQxrynU+fJf6$d`xBe@y4UxP*C-MQZM9-|KO8-zjGd{ea>ThUCYJNxNh*@$&N&9)F=@J%8Hf`hj=}b46ddu(p*=VS8 zRUZ|HcA6?e)ul$lg-c&^lJz$$Ed}d(KpjW1{~%2V8ScT$^8&MIXX4K}C?a1Pzus?{ zz3%k7P8OIsvk>*X39jX@{*xKLfD&?c*@x;~cvXih%+}&sXo#7rywuSgu zXP(G0H(^=cp%2AaRmq}qYjwX71A#c$9lAt%W>?YD7izh5Cy>GpGebte9;5WD&T@EJ z0y}B_5hev|9&kaB=io8MjSZ)?xYtBEOg$;P*MQvfF!+(~&)8tW>~tLCupYRBZAPIB zZq#r;D&!FI{T}3GL52E*aYNikCao3)OP8=+EWUmggW_O1&Y~~O0UZv3~Kscs{>9h*7J!^QMrLiR3dzK#`f6)U~~_DeEiCm z7Hanx=vD8x{yy|5`xsSe=}yXS9l)x^zwFu$`rEH}aPZ_djd*g5XNL;$XWLajho65m z$tuGe;HA|wi9AAOxs#12VR8vm$1fSU#u8#+A>YHVwv6I@QPtZUdInJyOiTIPRd2mc|M7_=I;_)!mMofn9XwA{->dLJ^+sc; zasyRq)E&t0-5QiZe2;GA;_kM%B{n#`erGR6dQgofQaYbiL-vw!kHbvg@S*QY)6obb z+^5Ikl7GLf$pcaQWKNFsmCH68xjr%{I2b%&RR4yH6T<4)mSv zo-!vy@P&;K!%%BY2U~5T2E(mfD{|Q=u8?%w?UzP8QmXbfGgYql0&Dn&^ZXOB@24mQ z^%aV3RqZjJ2)h)4`qe)h%B4HCggpPPH*E!`uzg1f^3>hNU>W~u($`e@sH6D~R-q4sko;6<#?0yJg{e}l0 zS;3wtwJ*YP!5_fCd8ootGRs=;_hIpk_d16)Gf;fIpq*0iPSeVvfA1zBr9Me~7{sR6 za*w0>j}(Fz$qwAvA_)517SBh425+LttNmCysAs|)eql)qXnF-9HUADK`Nl-Ex3Oqj z%i+i=2^#-=$hXS*9zBe0GXH^oN9^k?K^;&3Xafw>YhT)N$C`s$<+R;_C0Kuh!JxE9c|i4$ zoYmL{&UB^;W3Rg8H8LcJP#G#Q-KV>YFZ;}SRPU#b)F9sAElJwV*-2dhzuQ?N!?>4$ zsr7>SSo)&Y+9FEQF8fB# z%v%5wHZC;VU$Of?R#n1;-25##;#=q_xBBH(spdC{y%!CtI()!H1pO>A3+WN)EmFNC zxl52y*8=UpcFlu_Sv5SwGzfni%#hc@78`!_*U*i`rIhSMDh45$23(J5TYj-;w5CDZS9tZ_Vl0!;7=J+oK2XEjIX6e; zfs{b>*vODB9T_OjODSnwVPZRYTrfyLo`!N-tCm5kTjN=LeYXP_V4Ln^>9g_AT7pA2 zIAEN2<3OP0d+ixaxh`(Uq^*|a@OMJkkSXa6u2R-ec^f(m5G>Vbw%10oojii zDRj#3gG-k?+e28oMpiB2-a}S$U0C78QMOOaL)SvW3pO~=sft-oM}~*5mMZFzd*0w<$hvgdiL7lAJIlE{yg0GVJ?JYCxBtm64Q1eDErbS$iGZo24s7t3 z2Y4Lt{KUT<<)qJl6M(PR8=ekvILi?SyZwzzbdG6zT%rR(q@hqsG?QyhNN-!d#BXiuZ4a5jY~Ju zg%tZN<`iz)BKSP35uF7{Csgt$V0u3=Ev4@aPEf-sSr0lR3F)j?3vm&ohLm&(U zbY-E*pB{YOK4W?MyvzK;y9h0ojC~=P;!>vKvjU;=%zKwgqViMia2M-XXE%-VR%sAY7BE}taCiuGTq?LZp&oG^U8(x;9^PMxAij`>f4)h5>oifS znuc!FVZSovBdZ(lc8#)9peylm`U;))Lr51{n*4cNu)}L{tTGIK3ik^V)SADRGf!1c zO1IWc^bpC2SHpeczP$)Lyy5>Tw#c9NrOjVo55&cv?^VpT*pJre?c_fgDcGx%ylp*j zi}`VU=Ne@1BRP*i79vYRS_ULzqih@3dg)q=P%J7O6T2WO5rr$UhUd%lJ9GeGV@S`H z*xuLY^2n+4*VAuRT#>GNtjZrfrAeYRYN%fL^q&AHlbOPLF#4t3ESotknVFLPIQbia z@lGk#<@K)W731Yt3>j^buj%vp;^5ac~!C^N0Z zE5|79)D0iS!bUY%;)#K22*;=L<}VTp5n8=h_WH}t!7x1&0eF>Gezb=#wiywnjIHh? zV*W^#V}rgiHkG$74Z;-C#YYEpM1psc_~vHWFJP&{YmPWRl&{3=n1!Pm(7#z0kMXyn z;XCV{Xa-?4NV88J1waS1j)PPIs7~c;)MvG-zw7&q_~H$?&HlvBHsEsczL8X>kwkrn ziq1NTH9pidxHH2yGxC*HOl+ZdTvrlr_w+jSD?bZ4D(6MO2AB6<6ICG*sf z5v{*WfpZS;Tg;v2pR)NX5Ij&#$l&EJrJ*$mTpvrvOUGwEUJ~VM)$YTzrM-e%=Rp6RXN5cod1?HT z(#}q4JO)fiBgIqFiuNXQYh^%^|W??u86?DQW9;~^zLz6oZZVf5w2>qQ77}Sb+`y1 z6`VrPI){oG9qYthFo3Uhl|PvyF~e!UjspCdrZD{%6i=Fm^Zr3JW9F=qh347u%D=dV zzxjTbKbM@ zoZbrJd&2G|Syxj&==xX}Q)2eMFprBlYE$L=fDt)uvZG1fz{JXCQ1EoPb@YX#axS7y zDAGvy-HGY83xq(~PwT?{b0o5<0lD(!<#yyE70@O8&4U2vdX#nL)v&?u06*2z;FF^v zcNEZDinELNZ5mP?sftTgy1YdTylHbcYJ4Zm`z71-P0|4A4I&wnSR!n}KBlsB!Y_}) z8<@TnklH)YEDW2Jyb|uQqAj-WKM#{N4c;x7+# zA*^t>gPSTQQ<7~HH@~q>^_PD8GXG`}8wfY`bkiWE$D1%9*>?CudT+l&&4pY8kC~hy zF=q1D?!;@VN-`UEMrY7N9!&WefHWo};1Mv5@f4BSzqnK=JJqd+bA&(E_!U2DVcj+z zrRq~DrQ%>yy%nvQCKD5$ezc9@xoDOCR(ZzkPV79?DMBrIep?dAL2f)Q;^>S@ubQp* zwz>A7OBm2I+F~bV0ZOrK9}~!vrAp4YIaL|UMjTB*8nr2bxFYK$MBRNCfwX{Um$sjH<@i%*_gl*{G^}dV2KQnqXry2k-BNwYjU< z_z1FhSYE}*TT$WUT&Y4ITaxor4QmzDSkGLTm0&+0{eA(g`vW1bx!0Aku@QZjIWxoW zE8mxl(2BV9&`VpWLr?cN<-u=v5A1a3jRqCM&=W^&R}7~JE1LK660`Q_O3Y%DiHG5) zr@)d1ujj}N&}GR*oB`7g6lPXKfIm+7CUk-8)wi^3F;kcNw@VgBsmg9n?&oXbwb$YY zA$J0$kj3%S2?8e?5^2sw(U!-BrZ?PhJg{O|i@`&$d!s1N#gbJb;mOj})lWfmS;p+Q z_+iRP-1NnW=#zgl6d*^LGrmdH_n)+RRPw8DH27wphvk>?ODRvtvpUWzi*)68CH=g@ zj84TA%siv2P)KaU!76?F8C1s)VdatQNRbbrrjS-SaD(KoKRBIye^W;CsAOF|)w{kR*ahQUEg!!;(j9%?4sXF#*idMU=P z!>=shTw5;R&cJ%HHi13*3`+HXn7ZzGsQ*8Hl2LZzvO}eelgJ(?t3pvE<6iU1vllepGe`(iT0mro)jx)?rDgI>!YkID zytZMvJxdO|Dg_IGtS`{_S^S+3c_l);1ul_zO858~#x$mLE?`tcPWv6gCI(L+Yzlqb zyfYWuQ8x%CRcwbcy(Twb2_MXnkoBm;iKdLDli>NLl`V=8)PNA{R?r!fsM;idodLiTa#CR{nR^r^s-hp>*5bT zpn&-}`aFbG*dO;~oZInk_Vw{=27&@LrdJd&;2a&j?XPE*swCf9ex{pQR^(cK8yTQn z+WM&+0>^nl{U>@%nJ+I2fW&IQC1wIEv2a3OJ zm46FnXWdwR`_O=QOxzl_D7tI=XzrFt#VQ2{K_JikT$-nPDzendV%V9x|KexQheq3$ zFjCzM#Vy;-n6u8ZVv@bab98DRBcY@iw>9;e;*Cg}K0_M+D!bqMRUa5b-A@H|RfLw& z<4l3^ba4;k?YtAZb5(+Nrq5DGpTKrSySYziTCJdq#P`Y|b2*(qX@=}G_Re$Ze$soY z{TV^3_dSL(JDr-U@eat{^Ld)v3OHvPlY!{~bw; zh%gL&ZR8>3+$1u~cxj-l35bltH^Tv{bjyp*3Ofpmqx{&wQgw2Ca8d~=tTsB>GK=Uk zh?@4U9BW-42CrWCi{C}*r-v%L_*de*=(lgw>KAM%azm$N0WzS!4rNx`r=RCitN8=_ zAo%ROigQ^&NP6Z7$)b<$m1I)wk=*uBY*tWy0<|V@erv#?`L`N3QSby|zmk2e8KO|G{KKklQO^!1uD!)k zy`HAAv|`O0v9OEPQ+fS<-_u>roD~W_W?Vd8e-9OLUeMo}0_IcO?v1Q!nu@-HS75Bs zZ)&&RmvgN6?T zLV)MsNRaa0BDHQqK(x8CWX>SpL6b)CE@Jr}froeoZCD@cZLa0*6*P1wJY~6xSUY>g zMB(ucbu`{PgGLJ&rTZtSz(N67NTLz|QII$er5;%QfM;*e6d3~)ngCfJaIxH>KG?cZdiaj#@J~#H zmhS5sE$>NU$$!6^fCIV; z?3X$$Hu&>}8(T{XM76z3Oyx!vm*uI~vP9Qyn^Z;O(;18FC^a3y|MF|o@pK*E;}QxY z>{|BgtQ?ueOOB#Sz?7lYg<*>m9YA9<6Kfpqx%ac4vlE0XGAIr2*HtvB!Zht4m-btE z(>5bFJXjhAabmHW^~vF*zZ<;X8Mcb=+5)@^U;P?>2DYYs6?*xehfXQOY-$?o%Bmoj z(tYi2yJhZ`M#?#-5N~Ov0O4C%G_2%)NI36=uzsNFz0B02)9ri{uV*&f+3(Nz1O7ST z%Yl^JV@OsAfi`G;UU%g@ZHr<>`M*ES7DFx;NbSbSSIHit!)jA_2X`Ks zQ+okLS$^SOxst550AZM({*!_`qHTsXh9=fJlFTOU7DLj;-*p)7_lUx`%$ zO-zN7qCDJ-sL~jAp(^O{DMLEcH;SuKPmDwi}a; zR!aJjT(%L|Qv2IccRywz29et-{q?l`4L~rCi>_Pq9K7Cx-AG0K5KnCS%TD7Y zN#Aj=Xg;4!DJTdpT zEnnhEpDrYtDq=EocUYD3^37mJX^{l(o|;nzb`_!lm=YvlOcc^DR9u<-s%N}FBvCL> z`~Nj1B3AJuCyd7HH!kVcS7cE4CG^frY&-gv&X^g<`1eu*Ic24e8tYbyiM|` z9%#ybiA(1dN!A~FI(G&Hlu+y-%P}7mw=sd7CGkK-gFQf+3~*))Ifz~nG#ejg#~DJ9 zfg>DUwYrwOm6qWsCKK`;f(WrYe`uf3QL)bwgICOZBXsd+p!SXLHPvfl_^m0eu_)f6 zj+(9BqMWJn1g*yHN1uJlg&1f4h<$k>xPKzZV5DDlF)-34cozaB?7=JCe$Uxg_XA2c z#^H}(UPYMXXyv=!<(LWn@`H5c7Rbx+-CngzCCav)@oOVzFhDK1Knf6JaeapN+T&)%y0a*g0qH$Wz|Ug{>iA_6!S+r`OfIuYQlz{JxLvyzHR% zq5h)^EG;8W5#GQ(PC9waR>=^@x$54k^axlSs&;9}D7D;TE0k2UtEqr^J)rL$abDit z5$CMlFIE+Qe(ug-ZOGNPyi?6}ILt-taT#GIf8KTOOQ!+B9OA_0M-scQCcAof6k1-t zS$%(SDTI^X_Dw}v#vrcrq7T44rTjg@N&#||E#G^K5Sq_xcDzH5TA!m;^ZW_5@9d&x z6#LB1*S22=!w6RR)P2 zu|ND{=|mW+$O#ESu<30r;;5+?@NG*^@qlg9rXsGKdW|9rAIW}=Z`!xN*IwWjb>+K> z?F$l^c@v}+X3^$4mNZw4rg=fq#XYk=W#Tgmm&eIuSNTfFioXKh5{S%lVq?1}0mkn8 zovHxK9EE=YGpx|Lyl+R)#p!xYPql2*N@vR})-i#onC5s~C|am#Ac7C!+&H>e{P5P#cjsRnipw=(4RPbeC=a+RQ{T|4+r-AE`i!Lj8Kz5l1`2D4{Wgcu_C_K_U0!I;=VxmvI3EDbPWnu4l(C)E>Oq&geNCx7?rmxRmGcXb(Dd&Z!G8s<5zG4Hr-Kb+A z%IO7LsyG-#xMS8Bs8r*oMh%o>YH%sJTE0?UGE>2!f>-{$r|1Vg#33YTZ)J$QNK-`o zxno$pg~j|z)Mt9N0r9$@5-`c5&Y9{izIAwD{_;WA&7UNAG7u^4-C@2r_y#>=(Z9(V zDOt?;bUjAh9+=WoE6)T_Me*lR0ohZk_|!*We?iN0`jGg(=NJ7V7>TdNl1~tK-pk*_ z40SK6sPOO*V4ZT>mnRiPxnhpUJ#lwg#(J#~rOMaczbLY2A`I6%jB! zr}!R74^g6;0D2^Vd0%B#@s7y%lbH&|E={!+8`_b&{{DLKw4>a%A9{y59?ZnqjES_A zh`Qh#3r5rncP+*}RAWhavK35&r z_DQj#^~VrHJi4gHMfX|OuMc&S;*B29F0=i2xaCIDvw5i7CU&@}!1D`S2i2S3)BqBa zse&T!hm0vzUH&QZTn6vlU|#QiM#mtN83oBgI+IzYR|6+}%_u!ZT-$acPf3<*!{Era ze~oM)+^-KMc=Brz+-`y8=g+dZC}w>#&lKFZnI%nJe4bCcR)=3XiIsK3$Os_CkYguxFi=hvyj3gbB8Gj({c1h z-$ZdLI%`X!TQ&RvV@5S8GaZaRs1OtWOYTQOWTA%FHoQJn>%ZStptDKw3>e>1qeFv| zEsOeLaWG38&a^QVEw+pyKrSkqb^x z$@4;X)y9?4>!@hugMI2L3L_XqRRI`mDM{tM{MUFdFBi5T)hJ3DN6b&v4%uy@-orMt z2#v?Vv6h!z#0a$`CZ&&ptyO(FBT4XeoS_j)nD;2ps~EF#7aNwU<4^jmAwJx8ox5FV z{0zdS7j;TI^KXb%X$IlaZort-`&Ea0TwM(YNbgN(v11>{J=atYzkF~`<<0ZERvFP& zQ!v2|U)ziTSZfiJWEKcr!i9wjXVKEuA1q?^(xznJgj-8Y$~t@p3(h%_c0e^%$=F4^ zBHpmSdOLz`@l1~>$COv?7gCJTtD)L}waV$%$;hwre44vx)kUu0O!np70N%CU#ujGE zTUj^3xH!o93GxpVr#foR?Zx2pYwdT|GvV=*CQs>>O#U%CkBtj;3K*x5TSqMVZEW;Yzd?{o3Y9xvTKW_7FB0@fy=Hw7EWp=Ip&_6*T1?yMWzS zsVVTa>8hXHv)^9{_aKZ8_1q}Urm=<^sJE4`##B0*5DP4&Z>0)9=$+Nynr zVBhog=)1L<*=3n57kCXT4F0ZW^``6?oOI28I#gE4r!x^or2adl1laJ>d$I=iD?IMu zi~K8TKn*cBUCy@Vj0_ivxCXO2SP zce$P&e%J4MN0TY8Wc_oUp5dbfZO)|gy3>Z1w9tZk-9v*eLDMtUE5r8%2;9F*4}O2V z|M+Oq2meyswQt9Vu`ix1NRh@HnC?@)ZBl>kllY`7Zk?67M9FatLS}e*4V=|h_s!4U z#;&OHT*?wH`jcI%m(Gwj#iwnLd0+D%PcK7jKRC(lY7L@fTC(mPk7S5#RJFn1B0EvZntbYrI;U_*QEh)Y<}->q(|GX zMU&=*qFNTyg^zc0MlEaguU067shxmIy+>~MzCV|_eO3J~?r7L)^#gBk zwDQhO!unG7R2^%~Ur(mI+{Dhd!LI6BFD}ky|IYX$KJoE=va|dF9#kT?ugyE1mj~;= zqP9^an@MM8$Fs0ZUTBnNT;{1;na!}KR#HiEi%bM~kuYC3yk-we;rEvmWqh|#lX1NC zc-%?y0MN=pMebz@LQzbBkYFfqt&(|&@0P|P65{s?y`OVR1v*!;&Nc@b!gFJdU!EBN zc*PP!?o?93zSUM^%&xClAD%jmQ3gDOvslNS6C=Y2m;O`O)}WN~JLLP9ls>i2*dIpm zhWq4Hea)pomw2FbD;=s6RaXCBLN^sBBsVV4atnT*ddLP_oC-XWgZUF^6a4)&Z^%)? zCzH^5X5P_hsYNzI{&n>qP&>biB~=j1;uF{5jMrN5!@SGX70aJEn{YDUI6b3Wu%B)tkP$70@((h2E<{bGK{%p^f zyGmSBgGy1~Q!k{XX4G+`$G<-x&!z1}#p9(0KdWi``MGq;k2M_zzc!bj(9pKnuYh`_ z#~kXEsRCUmSzXJDlv`UXr(V~=#s?+ZJ^E&=J!GdB6pdPLQoZAH38V}6tn-M9rXD!L zOlCA{xfecZe6qajcIPf;NA{>SF!Q~b?PHtUrKHL(*o3F<*!-er4_U{#sBEzkHZMH3 z%zlHGp8DJ4deG>wD7|_4Nd2Sg)ic8%PB>XtBf!uz=Mt~wu&%PNY1$OLx-wt7_lZy7 znt(^Fj;;FsO#I$0KE<3<&=7!l6r>b&ULNoPPy_JlH&2CMhjABFwLRLn6UQwWTeI7V zf7`xX+xrMkg6kyPX*o3criAbdn`nO!|LXKb4)`;F2qk%QrL`J=KRl&BnYK;N@vMn8 zDUGy4!?_!bSRFS>eQZK{aZ~hu)Op&l1cz9bfJs6=@wF!dBl>RB#W)?u&_Q;z33dK1k1~U6&?% zc?ZVLHQNA6@_JP8sIS?#+WL{r^5@R(_*?=V^zKDPfEE*YYIc}GyY#@+Xmt}Bj4EN9 z^(_xuiE3A}vQ%*B1)WdGTF~N|LP{iIlj{{ia=Qes9=Z9ttp3uRS-sE_#;D4C^7vQpdBvqOA#zkWB}SpVQFj{2)%~l= z>Ib4S2j60=os5P#R%RlJCUbNarTjPFGg904#UM@+TY++Tq9-j*y0mf->|jY@QN2R8%1hP;3}h zg%Uf$$ZyYCpycwBos}6Bjk^4*?rkVwcM`}dOMxNx@%EQZ9{ePEzSd@etf(=J2SI-L z#w5=IT|Ph#05qY@ihi^U5XCl-<5lS#H2SdMcMPLHzm_eK8caE55@fl4pTX~wc*B*l z@!mX3;_5q&CkB*@cBRs|!$G#{#g#U7UinzJ5gz25fCELKX(_LZ`pw`kQ%jOg*{-@x zLDQrqEohQ$&P`GIoR1NUxP;1=T-3(l@d+J2RX#`pkl!GY&n%vEIv-mj{fqa4Q2`yu zpI7U1x%TN#@Pj6UN$zR^v*F__qjW@pN_#M{So6q#z5?lV&cw+U&`=>6GDrFWZ}dw> znEtF+?=io;+KQ~gS20gZZgTfj;maTKXAwfktm|Z_6N`c=B7oVgg@(zV8XV1`}J<%<}0nwuX-q< z;)%Pv_*)!9&GH?QHiv%09t8kZERrAsCDin6TMY0^7nE@`;lg%74G-_%zzjv&&wicq zAox8cZSde|D^35!7urtLc#kHVdXAf}=i<1G?uo*t14$9U1VSwf<7c&P$X&fz6iM&R zUEOFDV*QK{a#b@j4j5@rE7CQR-CjPs4;GXOARb`S=J7+8qsJPx2f`m~9xe{v%8oF{ z=lj`Kt^)IlCR1G}4<+eJsxBtu`O3nGYfWd5-^=d=c1#0K7f}CEEZC%8=%)DKQ~O|8 zV&}HvcS%fsZ|hfYt!c$SPZt~lXvjrPphh z@~%)4y~R6%?ATwlD{m{Q_r?HnO7Pm4jQ(|^`W5zB;d#DFdN^Z;=??&ZFh{gtwuyUN zF45-2ENf!)*%mv~VO7S(&s>uNiht&*{R1G(ue2X!slk0N`S)usG@reYn()leX)*o1 z5V7G?vccLG=1B*M*#{|!076$MO9~6D%n{;7hu+bHybRcs6e|&Ygv^=iONKphE_Ho& z)My~l{`;w#SHElgRQn}}DBLrPZ{VLnZ^(g;;Y4N4E6ywOsgdCO#HR%6V`URe3EyaN zb&_dfZ3DiV&XE&Ud`YLM(WTm3cqKBIC4eBc=U>4?)9@i*&eilYg_fCA`O6F4cTXT2h)4?DoV8Mv|P$HbP zp+0@A=Z+tLWlDIf-pKxGPnhIn=XC8|a`s6mW@EJXKznUknrel~w0Yz9vDBPshgwX{ z6j5zbixo3?Ac8+M4SKjH2INS-vWHb_ufCf>w7F zHy8lPR2A7i$ONMEG4AYFZ@x_A=q zOMzcUvGW3Lo))d?OcICR!oiJ4PS3`(f5B{dl7E0jS+QmzuyjhIBqbqzH&o}M)b=q+7YMZk`Ck{1wUNZSj{s!g&8E`Ny6jw1G0V}=#tS(rWkz%o9?>h;Up zthgN!vFa*!ezCERabjz;U*i%BNjc<+Q4Bnv#?~8!SnS$*N}S)OA02+!?TIsdPDis? zS#eo>&|Zr7s!Zzabt=87UNk7k{sAaR-j@-8(o)a3^zt}kE^r?Mwr5jPGLkLZ@FHc; ztS!>6Al*I>q{MiW@OUl-!8YHF*xhl>uzyFLS9qGb9IXCQZ>2{O=~BhCup((oMTM=J zJr->ROY|gA z`dElc3*I}F-85IeU3XV>PFKtD5{h)w0`>l(=Q|oX8*xY4-Y&jfzYW}wJTE(GV=ED! z3r?R^Wo*`9?L|DD304krH2rWt=)IhUn6=u!SaO4k2!!!YUcGxATGK1v-F9!*H3xPh z^J@yO{zfFhK$a0s(bFa6tL*QZCj7dYiUw;)fy6K%(5cQFp7y1r78j%Rr8H+ac;&i% zaGa`me*|&nqcUCQSdZ5q=nKP38zekKz$y9#rS18eWNs^^#$z4%4!?&jh_}Z2k33P^ zT(9Yw?MOHYvSWmkbX*g>G9}BMRX4VfCkafZy0`ALO`SN_XQz&uA!m z=6#0t+j_Zne$;1+Qxl&RbS5(&NGgIsI^wj5!;?F_Qf+t%8vpcVP{7RlmFoJ7pyU5B z#R#WH1EZxRu@QUq>kktZFoYqhg@brqtEog&kxM)A{C_kI*6f~?%jeybwHYaz3yndv zwu4Nwg8klyV(;XC7CiSj)u&x|!2Lm7x(&Q~YTX{pwt4T zawk^(TAj=yo zEblSN2z${GxiG$6ViSr#Cj^|r9aZ?evfV6$9oWH63s^Fy8t~h|$k=%`E48t+NbpjN zBI?aypGNOhe$KheF1-3uJiomJVA1wyH8QPF>PAI0_^OaX*G0ysM{9@YHet#-btb=v$iGyTvburaOzIBgl2BHm%M6WH?ksBSY<#Dah$xfQ=8N zBJw-7uVYd}zEol;>-{cwE!Uomrm1aPs8Hwe3 zcwvUMV1F=4%zqPmlvJ*0uj*wN@xlLzc&zW0ydGU@pEr`xhwt)}iuwL=V&VaFUKVFZ zht=TdjpO}fRmEXo*YbWU`=AOzC%AYq zVknP^m#6)9NNrD+4=-=Q`2WcBwc^Wiz2@AJTjHg`ngN`tKkZXn1NI->k?+z4pP#@~ z^*S5*CqCejvY$OgT^%79$Rz6=W z-w)mH3?eT#o!ZL%MGWAu(b)UJvS zby$w8GWL!|Uo+xNW=)o3Njm@dgn;s52YTZ*!~=&q`B5_;ZIy-7bjV@8tZg0J%nI+< zNIL_~L6i47>%P8IZyn;C$g&;mR`^DX9t*nB1r76kuHPe|G=zXanf^#a5prD|=P5h{hYzytaWUA1>uJ z`q@%}FmLs^i67)kNrWHu_rmeXzpZmdtRcK>7k^&tgCy}yLxShF+|o%t+c?L+3KZGh z-suwK3*Cr*IuCI~k#5^*r}qVamek3~9=)?PxpxtxVfQ6)0ew|W+VND^U4p*2(`)|1 z)ob?iH2Af-Q`0x6M&DSO-l&c+Ji(y;$4KkrobKiR(Gou$q|VStb1Pwj8j4AmS^JU^ z)Rg=>H=l^+I|a%tM)xf zS24H2wM2?jxar?92SC0GDPiZ*rWc^LSI-=P46jq4aX1eYnf`N%E(r89rSCs~ z$=&Nt!KzDDC1y4~WK&)hY)g;LPnB`2@$++pLRY?DZEC2u-C}|CJ)lO)DO~vxN$eOT zBNV-UW>Ug;TBs1pWAx=z?#|S zS1rSNHv}Ym4aLU5$d7y++}G%YP!=~l{;3=13I>!fj8YQS@}JAtvI#xj7&+!Vz3@f>8U5>*Sc1D&qE z@ICH7=U=R+D&M!VH`~84Z#laD)s;$WO0cpwwetg6Lm|Anc#@kWe7)_U+Se!A?v1NU zN{{APvcd$0E6!y_O4J^Wzw$_#N6P0e(1Z&WH$%7-umM97H*Zi7MPBpfvWZckZHGSY zhjogkm`2hA@D2Yolf@yQm%juSjM^EAV_R>5xK?8PFL)JRh@#kanjoZ~BnqRbKuQ`c z5C9b`DOKLADcC@6+sfB3t3<4YiCVkW$6-jkB6HAY>6c zGJ|W4s*b_I-h9DHHvCfFA5Tm*f(pxVttNicX7xSoh~C8hQCq-lzqbotNf5!P+TM;u zY@8!cqplf$wf*aE9xRd@yxBW>zC?bm#tcsqg|n;)See(KuLbKJL$|mS!sS9c8iZBi z_kVd#I&)s)8`aD3Y!y($^KYl^b_kEXUaktY5&}a+lrztmOzua!`;dZI#K9jHX(juF@tZK5q`*jJ>u7! z6KukZVNwfLKoEP zJk5)@T^(=GZM*xRPlP78V*>|vPvb4TxQQ=^e3_O@2zm=HC9l^URBu_UU~bfa{GvdM z>;?&}|9B-;pox4CRx&-5_w3r}HIAoiqw%?v0^eJ;{P^Zy@QL>dVIKUlpLAbW`u3n6 zFfFR{S8E2N?v31A{Pn{L>^}`6_dm`7u#6IFvE`Dub-kq8JB4}b#2-7z0C}$>E1OwK zfS|kXq4V;nd>U+|k}sp;|3JOA9}F1irwgl09@=4h8!lF_yQN7>fwe&{*pzrZdUYeW zV;NNv2l;1S27}1t6Yzlq58IdRH|%D|c0;;?vjXoXuBw8_Iw>a!PW!vVwk3Y{F_Puk z;j4Q0QaON{Y$QPdYEdZzEoypF?eppv?Kt5-$$TH}s5k>!j`!1-fS)Vv?vQEIB!-uY z8LSP?jt4cui=w?OS;PTCXF|bH?BfEFNy!8+u2@<1Aqo`RY@Y4!7#bzAh#I+6Lzf$K znX8gug66AwB@}MP*L3qKJ-Hj|DM6b3VFq{G>{0Oct2#+sQ>jizY@}J~O&X@VaKAgU zyhzsvc;geg9EF|PC!h&bL@pCGJQ*?mYeelMf0l(cHes72>z#6m<-g55>4)&4E2x^) z+&HS+{{D8aS9KC@@EK$LA=Z-dfL)Q$qqU?hYh&?gN|AJ+?unEn$WbmjYtrl0WG;9p z(@gL}VPAcK=o=&Ub7xjUygNJAp=t*e0gS!CqyZ~K@z@XafGFLj>t~UkNh)2c; zs{D%qqcU`T8pZHO2u`Z13kxX?en4Y)=aZC2rz&5Vzhg3mzy||gwKcSllOq&>OGVo3 z8%+qSerpKb5L;yyi_o$A=xG2+j=2fk2Q$LUe$s0ch10}a*v)3pOV#FGc$hY@q_pgC$ zfO`W5LQo9x=fD!?!C#Pk-?h|byueTzy+09F+Au|a`PwqG_=kOlFZF}uB1f7yd-7Gkaj#@9(XW;A1IAq|dB62WIR8Ztg?7J`S5>zWHdd_y1DRg3P@6^08oNnImDV-zl;)c@C=77c~ z817u*dWzPs&STm+|3*qOgLAVV&^#`IQ8U^AtX}(7qAYUf){yI=)7_v%xg>Ay!= z7jrorFWUI#%H?$om-fyEt)|F0@#rIZTc+8Mlu=ZN2Fx@s@fT(7FNfl9+e6UiqIRhi z-@bjmz=&ZzL4+h`$B9>S<&A|r0>GT(@L}0?nVAnB0II%^bABW6T?2(3`6U!IFueDF zcJYl=tzG+&uG=PN;2&}eDIzebZb!Fzcz*AC-h1KMdcj-!Nm*>qS2YFyBUmIh z%I|5{GdU2p!3<23k@b16d%O2-NKAn%8aH|%4L@0JlU;HQYvBQ8(%~;wToL~`{m)~B10J8YXVDE=A zNxIBQIEmzG4b0d$7EmA>WQdP%Hu1E3)bNQSXy?9)MnwSi-_^`N7r-CsxAuw^D?efM zhw$WmTvgQ2UVH}BAqOGU$Pr$aj5szR6x@bPO`!U`m)TZ*_2#6pQwzK&h7|d46mJI@ zml;MoTlatwC33tkgYy|RB}X;mex>Ue4)q*ukW%{hTp(M-KHba}Jvu_*MuwcZgeipl z2dJ+YZaI*g3^!Mc?XbOl{y-yv#+Df+bSRh{*u1SWX$2HI}0pP#aq>t+!7q=C`= zCuo3iMW8vKU%OBK)Hv10Iv0@0T`>V7UU|!99ez-6X&+0H7w@2##ax5tT#*GFKvo)5 zw_*(;`R5ZyWrjxt`oCDv$)n-q#v6C%MGsDB?%OSv4J-6#-;#t+d_gI7xClxmC;(Jd z&DSO`ezV+t(LiD1C#%C{5(^-rfXKF4)W5snM-Pnh?Ts+MA+t(9_4COOMLsLDb)m*L z8p8(~thg7(z#J+-ReD}*ZuQ8POq+zbG{Cq!ZK~Bj_wB5l$LNLZxFMvaY3yVDoa!sCU(PqR$;U}cu>k!S zP>dtOWwNP$o<-P|aqS%Vo*b~gx9{VWnmnMZY`O{9YwscW2Nf9#w1;-Lt;5L=x`a*4SYNo1uLA8;Wppw4 zeEQO%h$lD_sAT^|;Ejy%&)!JAO?Cz)>(XaQW)RH(-hweE+M928o zyqo=g7+zLJv@XQ&{nskb$DVlWi>|j{52s!js={pU6>z<7qauohc86}zQ;=;`11dp5 z;ews5<=>~|H|&-({@b{S{L8q6ZC9L-kPmjfAz}S;YU@YKQy2zDY&sY0I#19}_<3gs zhG={qH?j?d-BBDt7(m@TcNjlrX1!-bkb2}_%=5@GV3lNX-4y=559V8!Uf2e3P%h}6 z;*7igLs^nt#FymJVHM@dl!ze&Kx=_xWc6bSjBsB%R2wv=vEZ->%`uzoTsaWlF!OR| zgC19CC^b=_95_*TxGEVAP3^K<(QJQQL}r7V`vbl9ej&zqc?^rzo z<}MR3bXB6zlz%mZ+-1aZ5QNNCb-WBHMOa4_gKeW9$~h;_b@A65>Mm_3M0VIEVB|fB zI6_UdLfK#F%p@$0-7pwfENUn^vbUh5`EOgPa-#?AUo9L5Hspc;=9r&nfie$-IUgPe znfa9V$v0J1gpp=vtr9U!jnSGKcd6?siOhFa?TSN3W+<<;PP>-=+U$>807Cj;ZNU94ZX{Zq;cBz z%dns%VnE2hk!MvZK`m+dr1z^vPf_AL1s?&wDj#-E-Qse-8GFY=FiB_1@V1EZSzS%B z#7W*WHDk?a-&Dr3hk&Cpa$_4vN>xxHvTq|wTQ;6u+VC^I{lwP^ahYkH@Jd@(-I-9k z%I`9@o&4K1uwAuq3HB2Ks(+G!@p%aI%b*D*v=xjKtsK=L^4D4|PNbE8t67j&Yp<@3 zx|L7t4&I-a}pCIVo>j6ql7mTud-$K|jOJpERk#SiFdRW4HvY57=>>GSnsIvF+v zv2IyhX9`V1W2Y;Y#3)FxB`L`#9qCvZpk|AIIU(z1#k1GK~%kz2Z;1-JA`7ri=Ng;m( z`vWeirtcr*lM;X;j=Zd3#@_cP^yyxusVn!iSaE><9jH#HgaebHZ8?YnF!i6X@H(uF z*U__^30r`>f$IGA>;>T6<0XofefKg&2#VKx)P6%7E|kRUvKnya)PKmX7kb6&&}Zty zErz_i4hSVHv7&y@1=@ynG%NS(jqiDYcIjOiyI8+qKc9Qv*-2U*BA?(XAw`e_s@AYC zXMxhSx2^&X6!5MKup4T#;ArOQ7Z2gF(N30V&z$5?^sK1~z2lo_l5CbHgJzvkY`R~K zub=sifgFfQ$ZcC>)dH8P8t88dT2*iQ@*<~$Ue?`Mf6RlC1sFI1E3%g}#{&7#LEPtL zUlXtd;^{JNV2?zIBu)&B3OM$3gB*ZHvFvPm_(9`w%wVf6Rpwtce3 z<zdF+yuW3Q#z@ySAf2k_7nE*xDO& zr>#Vul@w(7XxgCtVuYYM&HxPs0MVr&c#032H>VEW!%+E=-)W<-q)u&E^*dgJy6w(+at>%t4+}ay^QN zljFR3x|IvX!ehyhqK}dP7^QYp*cIMXHvH86h`>z4xFe_xiILUsaW3JGw0~(mEl&NF zkNHIlLi^6CwM05YS6fDS+D-Rg0x|u1#DUyXkVk> zZ_ntP1VJ_GqJ2}Tye^(8q_YF!SJWkni{SG5o|!{;AYSi^bV{ezzv zbSOFxmCOp$@HUcSzu$%(yD(002cei4;WAKy_kqlAuyt^Bh`5oHtk~}ekO&LJ`>>YV zm5upeCXRJj<^MKIw>cCY`7EEV9Q``3bY%NNPnj4ybA$9ZLGyD4Ar%k4kTvQktMS%N zP7nusHuBSXwBJAGToolz6!qrYwOgq&QNLDX0*s%>evb)iq!E2Uk04pL$r!cA@kP0c zrar36y8<*`BFukr5Fcz{&xkZeFqoE+zGSof)h{QFe+Is|Db2>F3egwoy(rwX5R@9< z`#R{ZyA}#T6yOTd*By3%qHHV@2Lpu#%rZHME)RLjVStDpKUE-Nx7T6x!0L-Oc$IAG zC5oYt&noKDLg12RScael~ke zhVYTvS5W^S-+kl+oGWcfe?pWsYwZya@}=O%lOUza^g@0tJhL{5s|+Vreaf;|Ej7dxF*XHC8p!jrrjoT&!K zIZ0jSS>QJ@v%|*X%l8|umbgmEUY_b_hfA>h*IFo)ny`!>m%fP)s8bptV@AMsZ`yzR=13Gtby^vq38$g3yx8u z+A2(`cP(vV87Gd5VlFsa^k3o4(FH6;2y`g*E)4)=jkSKa>n?~{!SV`o^#2PdoVVvp zr|GK!`p&@ty?s zY1fRJ*r3KRIv9K-`&L`<-;zA$lNW`?-X0zdU-z%`yG}zC70kNMK7WTSufhlUz=(S> z!T(P2o{nKj@aQmm;k$U`yiQHNd9_H_tbt+XuVW`2cVlSNkOwEOC|wG@BL(|{7!8=$Oy%W8O@W1n~exsOXLI~Q#H61RI50G&5r$JkoQ zAZ4Godrxkur491P*b7Dx&REs#TztsX@fkekWqw_E_V}J1XZ({FqTQY_u3ugSGQjuK zLBx%llIE<}uvF?tj~;#e1vR;C^IZFuPTy~zp_UqJ3{=GsiK1xgo9>~1b7IK3Q>Y+Y zpJn&0H%kZAyDLSXxw35YW1~}<#Xd;;K9=_^6c3QO>8K(pd({pH={QbN9K&y0iq+Ru z*h96>P_(baH7soN_7Z02**!b%-lUMa#Db*FX2vuYl0`L>AA4pEtZt1591m^*(lva!f&4y4rq>{?=C- zdJkojoOm6!drm?Lo0~n#!miRGfhKAOlV|V5ZYc6m?CKn~gRpdT$ff{G<=R=3VGd7% zvFHCOox(Z7`mlVSy`MpUfwf#kcY;qFvG0)6|H*bf`9?##y2V2<`yDt*lL>bmpYb!8 z%QyO{vvTtv&ou`f;o>H=n<`T$rw-PK*t#L#OP+3nxE4N3xrdWA2nGSw1$)8Ml<+b_ zS`QxwfFTrQW|fygAy%T&HB^wlWiIDwZ)YMM$IYPRQ_i8$jnUUvwhkoZvDLSwz$FqN z_$i6qxrc!;1R=jn`S5BK@pR&Q>imCj{*(=}W>^Bk7gQT@R`PL6B=uA{6%)40z$K18 z2&^XeKbEdKtjYKNZlp+ybP0%{Nasd}fFDT(L8Jr`k!GVtO;A8mrF*oBf`oKRN^GNZ zq_EN5^?ULAyLMgthmPmHpXWW#xz9Pb)x?%8TzQdD+ihaHFa;)ThyrBQ1^}X6%wJJr zpYh!w!(z;p@5{^^HUo>YvnI#?hTFe7*2*R+BkwEQZLM5%NXl4ew9c;Cox*CX`pyq| zvkh^pv-f9|2T5eq21Ras*iF$aFb#9jl}qeza_rBONuZCNq>sf%7@U#E+}=|V_l`wx z$p0fM43_qQ%|Fq>7Ck~ncwZ|9^s`B{llIkgKXy-x$DXGVoyld|<(2a&SK3Ew+8O^k zaYjyaee8J$$c5xoykRX-A$uHdD9JnK{bp+Hb(y!z*up2ys!?EQQ27Y^uaKGH|Ehgm z+sv1Fcl~RkTwb&$T>sZcz`Q^KuR~eA|rTJ!ruYAB?5r8M*=C7PmAF&b?syZUz zJTqv~i#Cjik<|Dz+1_X+lQcjQPmHRQ#ImYbONAL%czM=(p_QC0BcwDbjj0SHB z@7nJnFYRq zpoQ2T^|`msXy?yfZ@fiiwYg@U^5qc@G z`|I*UjQLUSv1MjvnUc~e)vthGYTx6s5si9d2q?t7uT!6TIJH%lusa7m+3B#ClDdFc zb++0n`ge_)Ht~!kI9(2eYQi84ZqD|ewof@d&7bLaqAyco zGB1g_xgeKRoV8n24Sq{AukH1}lIE}asoT^GY5&5hf{XiX7QP*=b2X7x9)ApZz1xVp z;ZeRg=3Ha`qsBZM@_mCzeZP7zk*0PLHhf6>gdDS=P(rj^YTP@AI6E$@7$qd5RRaVM z+-q%l8c)wh4?}%Rw{eQ96ApozRBPPqJ~1&gXXF9!ISABiPMJWcQKm3ZuE@}%UKcA$ z)uZ0XiJajsnA@hgP^@ur(JzTT!1hgAnfVs{1$PuGINTI?)w%r9TbLnZrB1K9{vVsW zV?86ga%%LPvB9OB!?=)F;2Vz9!$NH5uHd zq$CiI?W=c>x0=g2yd+inB2)>fnJAJ0nW^Gs30H6B`>0>3BNn|$<1I`3Eb~ehV0L8r zB4WMs`#LqG1rj#bU*Rhanojioh1daOvLS7&7ABvs!s9ZIBVAGe>MCc( zzO+Be7Q)oPh#JlcFX|huOzu48bOR3LFph;3mpiG>NVJcbBiFr?mx*rW`+mftadG_2 zVk%Yg1^0RyT)EPga?5-j%`TsP|5BhOci(E<{7tbKUqK2W{sZn1q=fI;+Qxok{y%bR zx-`pOaGV}lhoQFsC7Ggt&`NNPFROMvbmCEA$>tnACslBj<+C1K^Y8U@fj4sdk7yEE zo1e};SJ^_PKfV75=>{%|B)Pd+#sf(!u$E2}LHU+?a+mtwT9T=YMcg;8Eq~5EqCHx@ z2pyd*_QBaSZs_3`Zv1?%eqiP~T1z$?C%g}J>hwGL&pWtt$Y@s~aob}^o-0@WK!zB< zaa>yL5AO2)8`bC^wP2x?NmZ2Ve%ai?a#p}lb)!2Wp(lGC!48A9;S4a?1mb%oV z1Ls=*t%9)ls8#=SauMK{8X+(3{&B|`JEREJ2)~gFQ^>O8}wP>#4hp*y!ciV;QFo@_tH=>KxzvYHl%FY`NC%~sfe&u zW50}T<|g3En||H$sr@fj=b_dz632#EYX zi<`Yp-+U&-H#u(LBlY5N8~*iOM)>*pvyKPzI+3@}CjV(EQux>COWTJlKaIN54s66S z_wVk%phRIx#P8dm1mj+qoqx#UzI1&}{ozio#6SXM5b|gXw8l&H>XnlXbb~%NmQZC& z6+c*-{PH+PCKkN4eDt|JrQ)>6A>}Q;^zflE6XHMX6R9(pnbOJ&O+8_is@(eaYUB!E z75Qxq6Ef$9`hrEzca*U7xUTP?YNVsBhPy(uDM0WVqG!w_@v3{bg)%^jmVJL|`z%<= z31v4fUi7#lxyoOBJj{S-=u1rMyvqLJ$m{|K4@Nqyb<%4os2NR~YQ@R%(WqjF>X?Sm_R#y8vWX5+{=!b zQ|VC3JFIE9y`+Y{t``4dVw&@>G0vD*qOQ*YI_3rK7&Ph5;3^p)#WDzsB8%mJP|~9W zi2LKZy+qp{uRel~;o4C(9<{3?-ZB}Bb-UrL<)#%;5v4DTM=dn!OqmqCyOedP3j#_uQ!1(F>SQhtTRia#ZKO?)_Q19Ha&T&_~wSox<@t-+fk0q1EYB152rd_Vveo#Y- z0i^g$59+7%JSPDLeRSum6a8I&fyVE5BG_p&YkZP=n_P{!CxTXbPncnwG z#tA)-tDbP`Wl^~up4iycJpuxC2zLBmiI(pT@b@p4lVa_kmwV<2P)?2S0-{f9N5O6v zZq6?sb%FWG<&EJ1XDsb4w@LCf=_zge-m+2N=TCn2U4DQxr^jCQJ;ae3h{rv33omWLZFXH!K z70#p!B--|@5$?^4-{Z(TOs?_^p>Y%OXd9%(4z62g(V$kv#Vi+11KCV10oP^1{EeC; zg;C2(r9CL;iH)Upyu!ADV@5b#&8b3%rnK|==fm={)%E~Lc#^J3tmTm;XH!M^A-grr zp{T3WK$nj)t{Mhi`ukkr&Fbla&fEzK?eo9cyMJemVnfckukH@d_Y}}F zLv|?0h}9#}^}u+hAxfX()F_EBja$MYPi4t8L=chG#m{;pndR(z?D&HD0m&-8Z6P}U zG2`UtFRBTuFli%@V&R*6KGUC1uC0IVP6J1FWcNBXL+i`%ZWQe%<^T4?yv%zE(VM>q>vw4 zu$%H`mpOZiHSb%!{#^ITv(_g{LmMS*eb=vXm))ux?s}@kg+V5vrc+-@n+q3&*k3Sn zUST&YKsG(0Pi;Jyz-{L6vLaSs>K-c&;$`%@!QBp$t$Pf@&wnSpBl3>{A>8Z??av1uOn*uV~g?75r3HX?%BD$YG6U?H_@Qz$QrUC^#>haw58b9#HSjoX$TTEz8PlzdyZvpp zI=OS!duZE~;ctvcwYb-(;uz0C=Fx-4o3ma}_nLH?j7!P&%d=4qGnltr$ZWCA&r@pH zMH+_>rGbd~98usTs$M&>A)N?slbZES{(S0_izuHpBy3qR)Gez#I|9C}CsO+!r`!Mv zSVnZ%m1diH4h*PbM4E@^cj^K;{sLZpeZtV4RVe zdgKVr9LtHm&Nm{7AdAIZO4*Zyey-E|Rg9GM?#DJf*HRmJMUrz}^xvHR@lx9QmDT|F ztj|J_7x{kg&MwDbTVR-Lc<(~c?Dg>H$SLXdJ{RXkctq1U>)&D+W7F@XI6V&;k*T=} z_-bk7k-~-np01(G-+$M=VljcTp`i1lxQOM}1kkvAQwQVu&EEi0{CbVKgh)k8clX#g zAoF_O>aOrlXYl67g~ln!20eYQepMrk%S738~+#8N+I zTRz4@HeOfkk`osq@ALO2tSlDS+1Uxu>VF%EoOmq z^tbsHBj30*tU#Xepyn*WE@w0z8#x?!Po6H(B#(T-avxnp4N}C>>>0UNS3r8pDX?)i zCH&%B=5JyBr)BRFpBFgNpPyg6_wYz9m)z9Abj8I#WJaimY^riAZqKHUSZyVIvH+5m zxEKa*o|Sr)8Y3w@bx!OR{r(%$--*5DiM92+i1qv9HQK8* z+(8toe>S(EIoIwedW9SF`o;&cG^xx)dG5YS?^V5+ODSBQJytgB7vux#uJ-a*db&GqFx(bS)4Hi@EO!gDgEZfvjwN zVbYQub8-FRDjgEdEX$WwREgh|yFI!);@Mf3xr_D~Gv3p&;D&WEZ;$%U4#jc&tO~SH z6$mSGn5|QX2ULW)LE0TSy=@c6+7K|9W}4C@H;fv!Ep^KV~~ZF z469(K?%}cdYu*)7Y+T>nCw&^@r;O-bUL_-yhV^bQ%99$|2|AKKl05x^^AGZH&x$13 zQCks@Oy$50)^DrFtYJe6nh%0EWox;Ys%B;ZZ)vpTm-AQl;UVj?P$D)KX7vQc4R|EG z9=>`>rz%M@eYf_3OHG8UVY4}8fK-Rp%-Z~|pW;S)Cf?gFUFep@T7(+~5vsFB6a>AO za*bIwy;5mr+SJEcnt6D(ip~4wwovnroTmtN5iLJ4_vR9nYSP|waXoL!Ztu><4pY3p zwqqchm*!}7YJNoLOXRr~A@{AaVNX(#&*0$OO{Kg~{ef&vvVx~ZA1k>@c0pH=P4{cj z??0aJjoTQv3F+TNff0JQoP9PA_eN7u&xmp)WlsS1o&1qO0+otBvj!&NPR=qJ;e!ai zeOcnOyHZAr_lT}WoFs2&7@mjrum-1Hp|)cq9W8y+Zedi5Tuy`8KSdx@;bk2bP?LXw zO3n(Ub*dmH4Tv$yC2mh&CEt+-50nzinpQp)K;-5ohrE$_$%r{uw4nINC6DVdR+@ZVybCv~1^LuU4m`UV z{RL(GELy=`nq@!2#$DdO|J}{^5hfBV1^CV0ne`cn#~68M9bvL`dd#`E!d=vIfuWen zdsOCuGbU#`cFu((jLI8;Qm@TG-1L))0lK1($Ppiz*{ync5aA=g;&-NBmsFex$4#dK zKEJ@PF>Vi8K4RK#rKqzK%H2`+ObH%a)j0l+_AvH^Vi&IDh+r(gLX|4w zl?PUGv~)=8%t;0J2Y);sVy7GG`HH6;r1-CyEd~m3uFH~T!UgPjPq3~(4-2J6^HC5{Gk+8)%P~&hen9jzD(V2c$gO998D=|K^Wbj?I&hd6;i5yO ztFDWP`{$Nx%XLHKXiY&l>OR1{M2%vHfU&sZ9iL}QAcEk~UjDqp_a&zH20-SB? z^A!%c-UahyVhg!}5RRM@2MX-O(v8!I!;zn$)vG28DHV2AUr{Sv_>r5)ytzLu9B{%I zU85IKXnX+eA5RIki{>}-`iweM zRDf_o0_^Wog>+5*eic1JMEWQxV1hTPC;J}%YN9{g6nSYuUsktS2zQzl9ojSI-=}rP zf3o1S73dSjymM536KsPXL%3Y-#r@t^t)15ATWWKKudLq%HmVde&G$BOK!rHMaXG)r zWLCE7PMLQJpa)UTt>;*Cjhc6#Ba*MQJNo=8S=4?R-74$GxBZ+veDt0&ov0hJ=xP|- z8_m?iM$?w_ndX#4_1#Dpud8HH{L2*5msOd;vgJ@a3G$pI7)}~9wt!jU=>bV+(?TIJ zDYcqL!opP1pBOT>9Ilw%=ZD1u04us5SRSHOw5yh?3KTAv1o^4a6ip|a*F8$8awAqRWsQ8B!rWT#)6ARC@9+ za3a$MY1uA;ffCj8$wqqk{@TUEy=|r#ZNaL`Mr{nY$E>Xf7^n!%&D6AG>yzGL4zDYc z5G5|T7?EOB2tISMcx$vaxZ+n)a%Jkm?`M{`rxvFaxqiCrI$VDTGx7asx$2WVy>>lK zeNH0iN2}R$fKVT@?DR>O^@|FCQJ5%71!>sl$(o1u8e|lzjEK!0B_xL{{ zHgyMb!uUHN&F91UPavp*16ATEEBo0w@WRYAy(csg)DUpMx&~885!Y_}<7O=HJCeUF zUM%l7UdJE{v`AtR#T%%Fq^ARQ_Lp6`Pgw-py zA>u*W}=o8szJm$V3>YXF#8s)pP>I3S6wOrO=;%l8XJFPL9E=FDpvdH?#jA33c3 z&smfOLhuHN1Fa0mORmie`MYj<2q&Kxa@YswZm#dT^;s&;+W5|N0ij_#h3y1m#gw^A z4cP?X^0%jKixb(6eff<@MPE`QYhEi*Mny3R1chamtiL?A59C_@ZN4l}?DRQP;9B<( zjb$4cjK-%}CcNgV`dW03RuH&4Wcgw-wP}yX1mq;NZyeAuwq-bR&Jdrle zi{xWge1^=lr&IhC&OS8dm8|a_{P1#m6wcf;*&Z_mBR4m>)lk^gts48mc>dW+DCwvo zZiOR<{i&^uQb}Fc{icKZ2RojMI(4T(nw?}9z}I{_@TY~1jdindQrWT`N1$mAi~Kn9l-3;X=@%%O-YIZW?n7*4Ejq~N|tjLohA55TqJ)a;=hVl#8|~9&>3;K z6^H=z{~SUHq%_zfGh&6ybgi0-NDlZ@s=Tb4K$cT3gN_%_$plc3;%4 z@))pPFq_)g{SJbYb}@XF0`09YL4k+Mt>8Tq0}hu26MT&Z8{eIV?QDoVx3R!zLUDP=-c_|nhY#6iu z$#BV(TR;Qo&yw_6JZq5Q^}3lnZLY4m-@=U^9LTurvLM{=w!6p#+28voVe>%gw`!4Y z(d6Gm3ABfdZ)s5M$8hjWzTXhKg%l}wn1&omBxH!mN!jaa26`;U*GRjI!`Tb;Jl zk`jH-{_K!Olu+>U2#)7uC+yA&+mz~NRzT=CKQ2$Zc>Gh}SE>35wp^X>U8Ha5R?NT5 zt4oV3D4W&LFNR|k6P_pxTPu=L2~eiuUxU@~5S6Ue8LQEm%8XU69Gn1mwk>et#gxeQ zw{t6@00b=j=sZwulv&fZasge`Hm?{inJPT}D{3t09nj@iqDMh5>Q2rdAOf|*Gm9v8 z3UWlH-$8mUN75j&}RhEN|J@HJe7#1c!F2j~qGeVi>$o zS%Tt8k^~%OQTR(fLq&8x;H4@b8YE7Wzf4G!R^l~@QUyB6HGtRSpVU176yP|z0AELw zM#t+Vw?1@7zI&IX_ET_-u|Lg2uVL_kh&}NnMI?Bcz7Nc^k6WjNUre?Ro$PBOF82m2 za!)tkm)8S%D;c~J-H{gVLhk|8ECK{Pgb>Dw2reHpulWS>+ zda>T|X@S&iF1h{N0Wv>7>d|bXgl1$1#?I-f-R1Q?CQk#{PPFZ{t07zuVam!T`o;{wJv;LnG;xh zm1%dTc0Fo5?y)^O9w+{%CfnNs!z-soHacIwJj?N%z4;#Y#qErI#P_2QdCP%nIeMbO z;w61b=RFRWg+nqs%VRRA&qXZ9$EFGTJYi1SU7Oi-TwsEJ68(KAGn&@jcp!L1<)2mO zCKxU^_|H#Cj*>5%_|@cm;deW%e);a@53%n6du)o^pYf3##5X{L72A|oOcsa_l?Hd(jsixKG(z|_$nV+5FMo{(+n)K zM-NF?M^DT1rTV!n??r~Duk&n(*?;tZ)H(AE>F<~p{@VA4qTshym*zhzP~sI*YU~q| z{y_@tAoU>76_B^Cb-MM1jr3Ldt9TxzPB0YY?;`s)V^>_meP?=jrs|^Z3GQw|x#m}= z+N0>t3mIVQZ$%6+RoL^3=O=#$)K=K1^jdSz;XyV!PM3TW#*T*U@qY4Hehq-tI^?@j zUfc)6eQk!6rXvm3wJ3e#DSOndhPJN#Sp43K3FGbNw{H3OYycJ{+46IW7fLolDYZ8l zx4j?O{qh20_vHhD*iTRNMhd>nSJ3fJw{`7G_5T7MGPwXlTLU_JY1d`lKR(ozHksY* z^s}fSkVNP?yZVB9utdhXSW;%S^UvhfwfqVp(2_3=7RTwkfg1A_n|UCP&Bv)6*Ixs| ztvRPgk7O9$7vEYIk=~9Yv-J>(qtVGjpy& zVWw!5f5@@TZVU4gE8h0#r=J7-d^SkS@pw{l=pzY-`}v{ekssLnX(IsE0~lAPSW&y! z1Vf^mfyjt&!81vKrx57fB2vM?U9*b(XoubO4&u;uZ~q6^`hck54Cgg**8B-ok)q9x zro8e|+5v$i6YMnRGTL(U+F;^=jU~s&D)uF@+p|7l@Qmlie?co$6_WUxaA%5|#NEha zfLL)fF>E1%Q|5Uy7T(M$WJeL_U}#WW!V&Kf|4*F78t(RNbg9sDeQEu`CeVs( zpy}v9jDtW*j1~C4?H6YY6jCg-#HH{MqonJ4aHdn+9+}sw@DkEDZV*Lz2!W*v-720v zag>-$?|bqLzgFrLhQNwvh?=Od5&%>LP~Jcq*c1^#vfGRt-phj8kLY{okk1~B+1Xz_ z!9Nkqzoe<|e4rC)#r_8EQRBo(ys+ezU;JDt(>(Fqa-DF`1MH*Ti#Nc1>```7E=+GM zKiphy-Nih<>|)RgSBvY^Fl%@^`!*(g?L*ChB&J74y}w5RV{{B?p9{dp}$RxIB{9$Fbi-R~&BZ%18|p1oK^ z>4QmM=Y7T(GN!+kqm@XvLIOX;0?I%3BX;fsm#~%iyOGML{M5f{b0~4a$D>LC3AI~=oE#iHfI=!_X)KcU_X94~(&UNiNzO)un34saUa*8K z#gzelere7vJ??P*%9JlA+nvido)M_@gj9-S1sE6SQ=5JWiFq#G(#WFhdthu=SNg>y zxBq1`=TwuR(HlLa&x1=HZwcPXCgyUbme(#J(@Og{10;Ti>sigHx8@dVFqJgw-z>M1 z5|>Qk_ub6BdVNpVibHiCc`0iKjT@>(9wrQ&EYV@q^+~0GgARtwB)R1syE@1s3jcv=-eSQLpF$QDc{+CoFq3Hq~yog&F=KB42X=oBcdY1p* zXwGOaO=ojJspGQ>*Kx6w*3+yv`GE}0tEFeP&%XK>F_j>!;g=|)J)iO8!J3m@E>zm) zr}OE^BAA906|Ax;=w#;0cF}*eTjx9{8)$yNOMy4+G@mE^qI^!7a-Ik)zs-0I+|170 z9R`;J_RMvWmS1QFzr}`B6#uv~e*ww1P*_&^X$Bn)yd#Y@%;oi#qV_TU+;31VXbIsX zpC+T=_2&(fnO9DH_kQtL-4|CS1^k)7WbME1BH(HB3j697ckGLryj(+k3vIRUnqEXv z%hO&c?1wVtx4K)W!~K>k)n>ZnXr;c~CvcVG5D&(p&qW|b_m7#1Nc25BP{W||u3XYx zBoJe^S3@*VPTj1qV09yWMkNz^J%J5yA?}XH?<;kwB8&0mMRF;eYXSRgJBL<(D>gR* z;$tj*Vh~}K{iDiK{pVfPUdEQUUs?T;u?I9DYO&czuQ|GaKxZj@w8hfq^2uSKRuGO0 z)lLoWH;{VJFMI_>#)%0$LX8hfUv*^ozKhg(kUbUaMqdmg9T=~0**VW!Sdo{wG=Dkt zQ`Y?AnQ3wI-~Z1y1zd(F6JAX$uGAm2lgcRxon69{)WT^-9Uic1KS6ZMbE8=2ez{sx znR&O=AXrhDeSed;9?>rPmh-&IROn3NpgAmqGW?(R6z{}!0yx!{yEXOgfB<6Pk1j}E zado{Oo~es0zI@epaOfI#JY9K6a^%{u-*`XSWel=%4`cDF)Ff@PGW3bQK~ECnUVGQ` zJzNHu{#>oJk$5Lrq?@?$`RQ}|BLx7W{M}s0pHn({(#h` z%>9X8q#eXez0{8lV1&wskWQ8U(7CXIJX~Hkop_$GN;n;HNMH=e=vRxyr;Xg@U!#V z%C*M{$G%PyR(xsbf`)(-hgx4(4QRj}r!cxnL9IV?EJXJOXvv}dKTbp7Z?-_3O3GQ4 z-b!zZH^U%nueQ=#w)>p##qhUf?=!&!Q9h;bmfCN833F=hd*N3~oP)myP=)^l<;)@) zm_JeQz7(2k5o-CgDE#A^Ip2FAXbArM8%`S7I>hu{B;&4)Jhpu^mwKAipLtS}v$@Id zM0N;J)KL3-hj(mJKaLXOc_Tl>Sqx_ZN+WeQqAMu(Om07Hn|@i1b^yr2yMpueWP~1l zh2Ibf+a3kpDUQa09Za5_)Z(Lek@~skRC%<~w5B33t{L96&~KBxv{!eyhM!=>2@>%J z1oh6YN{byWE?|t5V=f2KSnnkGP1EB?-U1!JBq!);y`@Dy*`A1dgy_X`1q@lx+W z=Y1OhbqVCH-$kqI@A(2sgfByY%XJ4`=#h(;2RJVGr$jOGL3ma=6EqBu@AKhm zo6?uuejI)&;|_z2S9vlUwtlsGypSYB*z;sP&5^Yv5L3Y|Q_x!TXz!q*0fpaB82(NPBuuRklWT;z58)|jHx5B_!z-r0p)E&jVk2N1tG*9^=1M`Y!QHYz%K9*l@G@OgBk_(;FK(Wk{X!B|O;`4RZt zSMUa&%J0lK(~n`BOLk*HgM-{or)qNag214wu%6c?9gwz9~6| zEcYQ&UB$?V2edUl6?8AjxAL+P|J(I@@b)C@%S|Z)wkD{sv1nLIY65Uw>AtcOf5koG z*d+G34KUK6bQs`uDP{QiQ$qUf@kT4d)pPKx{5|jXri&NpM?9yEG~K{f6N{ z@z%ceN@B`1v@6w3im2hNl>)jwtod!-FSzcHtb}#(?7xu|-$01Zbc(|uMFzS6y~S)t z7mPVMA%!GX&`1fGi*l*-iawVFnfWH1Yj#p&_%9BZd?!GKlxT*eVZ3CTh(m zi_Eji<%maW7K#S|yT?wQz7`WU6K$CfTv^P{Dy>E5BaV;|%ioz6j7&!fUS^g>a z@>u(SCmRQ((HfJw=^W%NPXiHc1>@U#>2*`<{du$oydtQLcN?F=sSo*XdMb$4d9GfF zWw1?X0pPWnJ-}rJ;O_AKLc;A8dA2k&MGh}Cqe>w|J#*`Au-@t;@ z+oC>nm2)o1oNOImqNZES*f>^qyB@~2ncro_py;FRm%`ocu2!i9>B31#d3c<6AX!!T z_4CDJ_Piu^VkV6B28;$f&WK+ELXiN2wLL0Q+bsm2^;{1QOLu=QTXbMJt{_l_rYEoM zQehTd`TMJt3Ba&dAB+{Uu~@yW%IFu9p>Y_=iZFO$?9J2X$#nxo&@%w=g?nY4P-7lm zy6;prY(F)@Xj-_X)$^M3x^w>h5Zme9s8tx{%EMMauCHq%^VoT_L~dxhtEDo-Zo>uC zJ)-&zTubvCNQiDqwL@m!^~nU}i4@71K%vSaUdXWOlA)g0pn>Kn5DW620AtN8pBOp! z_KZQ zI1CMx)Z%XW0E+~)erE2Ey8lur^>+W61z^`F<2)@ABgvh+ROuzoSMmG*8+?FxNBIak z2Wl{E-o0Mlok|6Tctm~gVsh9J8KjS6hzWK~8?ZLPp^NA)! zkL~as@V#DD zPcRu7UY`a3D|=~Y2#LGF|LmEE!A~OC9sb8HpMP+Ce=XEgrUAx`u&@3gxrw}o0x6VW zY(ei;45+@GY_%M=7@sih!Ob9xoxd^1?%QV;LCC|(k%yG@$PEe%J(eD;&N%nDv$o%X z3BkE`hG6@$Eci+L?|a0=d$gFM1`?fl(>M5Uh5J_1pRZr85w1Rql!RzSP4k{JCHjS& ztb^srlN<^3dz1v}p^|Q}Jg)eX-5Giz|5{O*8$Gig%AGj_`(X1Bvh;AmP+@V4Nt)@; z{LR(ROs<{z=5se6o9 z0@q4+^K&4%MDL=Ka{Nj6kh|C(PHYk5Kx=%QxwaRS_x@8L<&BPByZz|6SX0UboZhH+ zH(XBwLlOT(hq+YvZ2v(f&F$X9g+u;PNuQGJDxT_Ti8D$$pMwB7-vD_9e~-R+zT`w| zo}~c8L+Wa`x!=aY2_9pp%Rn}09rMM20@o`~T_gmjISOIDv+_ra4p_NIRD`{X4A1P* zRZK{R{_o(oGr?~czb~Yl7axjK;){lHcH#vs)Z{U`7TQ9Gjq5+j>QJ>rTG=25u0`*D3Gg}siZvT%&9VG6P z;78Zv(OzEi9tWL6v~KGg*P<*ZuXEy=o0s~7LLW4cw8p{d?nS=h*|Ol{Gwbq=Sg0@e zFTJP{o|n@D2Ush}&#))Va@|Dvwd~G=YdQPrv5`_n75{-6%KuGsgckTLp(ceOOtNR_$E=?Y83hOdfKQ=KR2+Zz^zPfgk&(Y0VPz203 z+ZEgCrv$!JAh1ua5!^RZ2uegy-=5si}?riA=kSYW2$h&Xsf+@`)|Z449a)jzvt^ zKhHBIjPHU1Tw*)E$u2!1M_}!4dGq9}RSM@S5X$_`G2wc(bEh|ai4m385g!R<3O&l& zqeKsm{pI_AU^$J_DSg*$;CXd#N!1W`_IZBm8W`rGjIsh<)}iovQ?AA!b65{f0z(<) z(!!HH_jXt9-k@XJC~uI40Az(^xk=$rgrlyM)aBC6tkLhYweh`-yA$mht9-{C*G2gJEX#g_2#4rz2U{e{0x?6%~z4-ZH$Z z6guLQT3gq*Y~nNu9#bVQ@ENl39df_7F9)Qy^uIR-sI?$PT-4{yu8tvkY=c(yEmV>$ z>hvu^Ripa;HZ}Iw3NbvZ4jTzbur=ZD_I6@?+*d&d18wXYnpwYt85PdYMHm*8f?B9se9i*pZH-=COmU zEo3itVdl2l$>a`k%v-nj>Aq8lI(%5Y>xYMWWdaM|qov9%SI(?-7GKko?vl%J^~@X6 z!5M8Itm@^7_Hz~#9xE45cixB3@S3mii4|W?$fWqWoWHwT?IH?nk6rj{IiOG)*uWV) zh(+Ss1?vGdU>x*7B$&{y0bf(|j`gM>2EFp*DpuES=y14o!*=nQCNy{&@|G2EOiFm) zNFyPo-`t)3?jn_YF`tU9Fhti;Cq(a$^TSU)z#gXwEh!G(*woeTA)qo-|kx>z4$}Ata2LjIiR$4*|c?2)Yo*Zu22(Bg0VWz~EGH^-` zWPq?=B|Hm&ql%P*aP04Dqe1DF>4#C_#z;hHPUMuSh!9|{vLUC-kFGtjU%mP6@hThU!@ zj&5RjQ}e%vHWnU(+~CA6`!edtmmWn%-0`inJJB2SL_{-#o+9`WR= z{AxUU_cz$$jE@J!2YkpUKLBqyE*0k35TNigsj+tGf1BkR6boA?L&vAY0B6cq4=`*E zctnTn*!I<*&0E97Z^#fvUWG;d&QyK51>o8Fi;719vjS)Cmx(X@lp}+9GFIjFE`V%D z%=^tixsa1E;9CYiO}&gwr^y_r9HbE+Odf65yE-3wE}%`NL*dIQZWX*f zVJJi7^=o}>qVGwYJcHOTTOu#utNM|{3$0Rl$l<@fi*1m0;^Cb_6~q<`#zfkpcTmq; zrtP%_KpP{UHuBXi8mvrh&7!{`4Gf+omgv@aCff_0aXy909p;`+?RzGe zWS3mt8;X1~(4e<535OHGGt;i)n>LX*`*gU=J@d;o_r-T*Jn0zbTWe9a#|BtiQudGxl<8= zrwM-*@$O-^(EM*>VGF`pto>gT%~t#Sr|HSP>6TXowL=c~nDBa`n7!goZ~bZEHY8t( zik0y9;gFWK`QWy!-NygXbR9rVeNUGp^j^f!5l~T)B1IsyNL5h~{3$3Mq>1#e%p=q2>_J@o(0o6#9Y$<2ND?w&n+c6aZL`q3HS6aPJG zJgU-?nD)=C_)PXXYxoXR9|2xRk4i{N;E=wdXFfYNwZ!c~XcXe8EeV|rQW=(5J{bDC zw)5a^b3hE01*_QHfpFK4y)ZuC+b>=(RE~Ha`lP-;o~4Z}Ez=tMIMR2&XPp)BtDjy< zQOZKF6+4o=cNhNwUoB?Rd7Ausi^+D4?X&d73EHC4JP;i%_9;y?eTG{T* zz@;CZ{d>}*K^DPrz{pHhd6Xrys$V!IT&}Ox?msGwSWZ;&6+ytnr+bs{;Re^^Zmt+c zg${-i8EFuQg8w!7TZ+PgaSuz^rYVOT$JD?66F)Fsf~lt?&M}M`9{Q2$O4!{r_TSk& zx^h>gx1aIdSn?^_C#GkzkR_}9L8T_P-JC*?cYmUzpEDtIZ8`y_DgIi1O5N2|*%&d25i;6U>~P`g?MM)Dnv3{# z^Izz7`e!5r`N1^p50%>4r*P>9dkmy{QDh8AkS_LxqF5cLn9N4UUED_rzT|Q5sOq86 z$!Avgi>-(y)7X8vsD_9uPS#Gq;eT^P8$Nv%lDV8Fb0?8MUHzv@??L=j?lhLA{a9!e zXBfHZ_c%Zi8%~zz68w($oceSYF8+vQWwB_T+M9L?mZSsW?tty+`jMmOzCy=2sre!% zJlcyv>v`9)H>h=R{M#lMn(XQml#mwO?*^iQilC@nseWv| z4iW^S50xin#&mJC*9y;o)KdLkRGTQ_b_D5dmJKS8Yo}H*j7zW`dXhxcAz+!hGBUp< z+W)9n3+76g-%ypl=JDF%dXDA0ghK(=%q&*u3WC2#H;QQ*Kv;bs3udUgpR2qg^z;O< z1<+#Qlse)(M8}V#J?TCe~~(C9(&VDdK zjhbQ%MqbyJmc`gzg!vZQ*@$55-q<5zvrv|QT#%QkEXEzk@Niog`A&mJkqROHNC|UisePR5W=v?$f&e|~4FjoKyWuqr z#_w*D{{&trs@}a4{4Cq~igZcanymw7lg*SZ*>g*E)P874F1x<&Az3r@Eg0tT&jr%r zTiyVjj^S)tG_PYUSyA)5U*b~{!=xV-=^CJaCdL?qtQRD|0h6-f zfOq)>Mo8p9nMol6&!gz^9K8~s*{w?1+X27k@iMH24o*;niVAN^59hzxh5Z+7%KKm?SdaU;G{{g;M`I;et0?r(${ z%S5_GO<|-(cnX2k5-Y{nQZHi;Vn~CD%Krty+wTB2^XgSJm~u7q zbh&d!GxmPUAM*hLOIx+}-D`nQPHxu;#)oDfc+O1q7f(LFKN(DGn5A+3MNBi#%L`KG zHef{Eb>Yz1QF>pD2_43)3wCKBHtmI9w3FbnrlTC}ksi!*F`8`;7_|XwXkiLUBE>#I zIcb?m277I(?gTvzG-l=GHst%CF9*Px4BSLmJP0Mkrht(al)qw*652s~^RZ(bwJF)A zg&e`<$E)$DmLxI~<<_?Ol#24lD(f~CiFcdsB`fKJvOHgK$TN&n+^T-*Vr%=WgU4rZ zE~LiZIf#N6fAvu|Q_9rzj$q-NDvwBZe5F7rWS%n6+-><6$UA(np`q*>_}(^0+CsmR zLu7CMcWt>5l-XKQ!c5txkFyh2l6500emA!n|M*5-7!G|PgN{0b?_f(7*0>o7#_sck z0G+lQ{``=3*ywtH43?IIL+7|_ANcQhM;8i1bfC{MK{|kn&7PY4cBMemzkXe6T789Q zh341t7!PXb3^QpyEa&kf=ChJ{5Vd}g$GM0O+DFyFhZr$Sna=!g-u)cTrR+Z?6pQi) zdL=I;I;~H!jZarccZDpgnC=MQ{;u(4(lPhI`-s8Rd)A&*uf$e=FeQMepQog2*OvL< zFOf|PK1$oFsJNeRDy&|(Y@c))uL>lh8PCTH; z)QBKIf-H7(KW_ME;K9h66atG@Xpl_WR+hV_L{ys8YTpE)dzkn1x%IM zJ@;ibda*#`&Di^d28J&jwU@NC7u!d2%|&Mxw%+x@L_FZo%8vu|X}4(*L@P^r(hUd} zLTG-42W)Hk1hzhNqs*nDn44;zXw?2ne`t7r<#yxu(kR+@1w1SH7G$bu;s;}X!&=C9Y`KRIMj{e8!YcvMmzGtFb1R*l4B=Wt>h!^fdgl&WML}4O zNl}Aa1phS_dBla&fY3q&xENxSo3xU@hA3x&qy>!BHnj>%s-?I$JgzreAEFP?2ap@kfDzQ zAKam-2loqGVx&SyCvvG`9EC3N-FdC=1A!6FHr@y94UJ$y zwv`&Op>s;S082(k0&SNIFj}*i$%+@;szdCNsm>RQv$7e|$Lc{e-o^J=Be?t%$|jFEROM z&osaJdX%AePOYF|_Jlf4-Y3`3j05Jel@XKYU`%x&N+wkJk0|D$W2mb4h=h%w9$0aaw4~$)= zstE@X*tD&_hO(Rzcctw3E*4x1nACbqFq2o^0TgC0o{3?IDyIL*wN^xPmWJvJyc|zO zi*ranIeCSCHI^8)+#X6-;IUUF_o#%S?g zuepfDf7#Y(HMY8osO+4#S5)Z|t~@`;OkPp?Pks_|D4-sKZxnhlZb9us?R%BlE6(L| z%gUyvN_ViX_deg(Mql>TdrZ=)HOpDfG|Nn~{)zqlzaumvTO2jQ-)jWfz4R+>t;_R2 zaeX}Uf%(E+n*&(U!Yz+vVxsw&?u?nk_CQkx`mss|llbLVxI$rRVZCN%$^z}_+xXOo zs9)|$aj|~NN^H9;*0pFOuzPljGo}_UVsS!6jmJ$2Za*gi`I=Qgybf@W|DFgs3J(~` zjuQFdWcSc`NU|&OS ztN@@(sYxt{Fh-JmbL()(`U;1Boc>C(RJBf}NA_w}l>zNHF-#N`?|lPs2c3ZOQH}5P z6&F$w+_iUT$-Q_HY!-)fMP;apPYxYDxi!xJhIV@=?=T&cg!bB1IC^f9t$~gMr_VRS zc^z2y$ViUO2EZM(msgq8AB3L4y(w(WSJkli!S*V6R6$E4s>Sg`%X0fx*R|>3?F!$G%ElF%d`7%k^>emcC?Iik{_Z z3ir2cYtcNSMQC7g9WLcKl+Z+Q#-FtyUOg`m(KgE%gYCXe9P423``R9ASkveH5W5iN z%!Ez>LV>DJ4EU|`suPp>CC^jO$p}J_e+%?g25pI$${f-tbhZvLBOrK@Z-+mHN$2nX z^X4+AP`$2`st#{Jv8Ga6Q98p2QcJJ&I2er)Y8J`mSqzWlT^zPac<|^gF`Ew2um<=9 zsA@s}YQLOnaajI-!@B6vWb<&^g@g24e9M|^8RH2Vua-a4h0;d#7)Ak{`3&Aky$v8j z7ar|ojX$X-5^fDi{dMf$y5K;5t0zU2L#iv`P{Vpv9x$7{g$HM*L=l!6!KK-*;NZTL zYY?>olz|ZRuZaiMl}d-9(D^@!+31H{7{@5e0u@5y!@*#TkS4rcB-hlY+giHa-0P6< zp<=p;JoL9ftO@}^oGnZ6%lgKb&K zvCiZAoW7YzNPT_XP{60tc>i0^xO3X^wF3TA)ZHbFAK8O(eTbz``zWXpal#@Rn%i8x zq`3pdix}gCDWehJ|65%g19*I(E^s9g002S`aQCHkR#FZ-J`-f|UlGbJa^(+P%@ppZ zN9m-c#95Fa-1so`+|G!&`NP{Nk_wx3 z5HxsnGklu*H*_np;GkhJc=W>bb@}-V4xRc|a=VPo<`yhFp|xQl37?TKqBq&8F>#EZSAjh8H`)cg7ij zuYDVCvcpF6oasFD;JepPCt($7JIj5}B^W0pSJ>=o_F4}3JyXvIESO^c zJ%|EiT8d{X9A(LiLStAasekd0&T!&em+R{Zcasiu7)Y{obrbi`B7Nad{~kj&tEVq+ z?WX|dt`op367Hre%p?GLg|B7U`ucqq&qKAqugkY zGC&p@^cedXj}Gzr){j5zs_m+v@|Es(bZQDkndEBU!m-j?RT%!L4Ph3wn}pNSq4N$z z|5kc(<{F?ul3>0kq^rcXm2^)y%A)?C+2h?br&T?B7L{ zN!^wU8SCb*vdnz=&F9{Mzf-AkpK0(qb46iCuphd5JZ^s|R?vf&P`vyn;g@_BjokX=7di z#1U(+ccjnhe;fx94&X)_R0LM?Twn>Ai0U=2)2SN;3EluU_VZ{-ty6^N5fz2XlFhZa zhMok{t^5%rMtIn@&{rWaiiI^l{nNj`PZ!#KW%dAsbCr!UUpf% z!9}4S;pEeuy`c$kPNC7345-sI5wKuD=f{UnV-?LgW#sK_0PgT0hA0Zo&qG<#`deOs z?|4t@Eu{c7<8f}a&q*5E_@*$MKJC+`%Ef*s$=-&^desw-asQw;YI0u7(9LJJ7#_5X z2-xuesJ9ir=6`m`Y(*q)krDMZZ7=}H59Gt(d#L+4Q5XqV3fq9qKc27z^`L$$OO zv;2kmMrUMI9AtF?6#@XA`0yP}V!#ChVf|~Lf++dH07;h^ZNRp2#3T9+7+K2v?GpkH zpz?Tjd}&EZ^GJXt0VQP_6%IzM?+sg81q;yv?n40XH+qt9S`>QMUW-xi3SVxz!D@@4 zeLrJe_x9Y7U;vB3_$bb}w?B0%=MuTZ_k361P@Ym07pL{yCzF zWYjNlad0{o(EK2_no^lh*am$j&K4BR4Tf3%RD5iWk`mIe25{+b4m_aUc`Gq*JOQdL z*|3Xtl1V}bDlDiJ>h7gS_4HP!drVwX|DaC;B5$~U3_ujpr6`b@=k8n5h(-&+i; zo}^o-KZi`PAm^{#YcB#wv8w=S4KD=_ieCUca8$( zjP=ywGO|q~MhHH#OcujBACK}q;A}!YUwa;2RgxZ%4+bIfFTZ_QZI4+j2LKokW~fDJ znqaw!Qv<`aU!2=eoV`&{zCOO``+|5L1sG3NDvP5q-MR14DY2 zInEN)ctDLfdts6)^ZBRAApaNhSzN$mS3`KPUhSbQzUH6k1(5&!ing3U)tB5v6*=TY zvEgTcsdW4gw3tAIBdQ4&ZpIY@Hb5=N^g)cr*2X4Mu&0X=zZvJ`iFDmu+=7DCR4~$) z!Kd^~#gQ8<=)Z`ziA(WeA{c{r4yg<6A#^==qsG{9GV&%hxPILz4?ck_@gvezwUYap zIfqjhXmGRJEkx+IgiZ8g#@}**cDlp>dH}5ggo-~r^sRc&S3SgALG$r93gU{YSs z1pfyDv5mbquYi#sLp-=^!T`j~TJb1LpnZvCi>hjL{W)!JdJL2ch>jq%2nDXX4Qy{P zgu>~Q3mB!A1afqgscAHkn{BQYu$r_lXhEd8`YhY-tlm#T_||&GcrS9ioc8JgL*!Ou z&_Pj(d-Lyuc5V&m9?9-y_&d4&{txs#=2fy(*bClShoJc=BAd16iG)mnBe)Ab)WGHp zMMA$bc)mQnGGsy0ETy?lBxypD?xjPb=Q=aV75cE3Z4m#k%hr5X+yo#paEg}IU}Sax zU>ur&qBt%1(Ipm;+8Df-5x8SsJ`m)b2-b>jEldQ-3qq!=^l@;OmazZ&%!q5DC%F~B zR|iJuOa&-Fu-XXEYDK9{d`D8RPMrb;Vbfp<`63rQ)}i?4Fw>VQWYim1dLoeK2(O$a z7wnDk>=((e+hDGFw<{|!rA8S5zxdRX@&L@cll+7HnQ7QPVhA5ZCm2NeS!H2`3%}*+ z$x14xM5MaVAv=#i4Wn$XH<6r8@}>*SOS#hvKf;S^qN#Ga^#*- z%zV&E79w9d8&hO-)5>plb&B#;O-iu!vRE6<1;Mnmvy?J033;?jQD0Vf)Y1x=uck1> z=fENtg;-88Ofx9+cTuq;7;v?Pjk`>i>;ySXvEWhcbMJ7{c@bV(BKpklrlrjN8P3)KJ4`f#etnxn_-) zC^Xy2cU|4h>y=b^cJki$ow$vS;cM5`&vuOyT|!YpvC#*MV}tRBv<8#IOgKrNr%y0; z&zYpyAlgmLB(MR;Nf-TRTP zE5VxbbQaQl#BdHNAf8(fI(=Kb7;!*H#g1>CIc1sx10<@YwY1g1NL}C?0Fn!U(*?fC zr9BuYJ0^Ar-jLgWg&Q9+>?olK!2B`jI~d-@6p9UDZrko~i5pv}6cJAJ`3MwZz!37F z#l&L>5SK6*8nbZ#txOC^&SI>j_ENnP>p#!|Zqw)b=F`N20CFI?(D5)KHNib;>R*d0(?QWr;UU%>jcEPXU9;ddRV#Q_->=(li#O*fEI9x@ z&vK{YjXoW=pUvNs9Y`~Xw_LqBB2#k*=u9@C20;puRxUsYiK>(}ICh>XZ%jt*&Kv2% z6hY5=$m;7TOQ#sA_vgecWCj1@W+gvP?F_;zS? z4*)l(yNmNzi_-c3S~pQvR{Aug8%vdE!e=Hna7;1O^6oo6KJ)9gc5B9f!L_$=IHas_p2#EMW-0HX{DgA*aqwp9DC z8mTO_;5#0u)fZeeeg$bDOq#?8v4^(68l%)dwX(r?L~>fmVTA6D$Ab^0IUbX)9R!hx1M~NmH5!zqm!` zTvPQfd@t|%5!XUGpwpcWc!L0Dm;V)ps9^vZ6}*@ejx!Dsgj2JS^n+*-tAOy$vXiv| zNG6NI&YnFx9YDj%;KR$qM_F|FxXph!>b@>9sR{^$)G-GNpKk({p{_>^GrP|xUijpt zEShYeywcq7C$jCKdS3_l=Lx7Yrmg_|+tWvm^{aV%^WK3^ZF~)x0m5(nukz&gc$lT0 zBl6XzAoM+bKto>7G35dzcyql24|oLH=!F96zK#?ZQpUY?l-mNp$V$Dc8S8Q<(sg-x5j#gG%C3xiu)1}?~>h&DX*XZmRD_Ird)~f7&-XG43l|{ zz;Nkjj}R^1DgL#1#ny25KZ!ToYPNS(lJtXO#o^*N7VeK(ei$J>iN56Qmv-u8fe1+q z*vbZA@{fvT^51}k0%)nU0l6T7L#+~G?DBvULl;gOQQx*cYb||k?RDVLDtZORP?LHt;@=PPS3=@2kB2`p=y~;$Bu9W zoJbCcz{qq4ddMTXz=4+&`TI}Ko&_WAL9o_MQ7WuI%lEo^Zn6(INKF`?7)gtd7?oC( z#pkLvx2oRxPjWQ52=SpmffC|*^))^e9ipq!7kWnn)A%m+hE)2LaYrW6FiY)4>rpXZ z!i{M&ZUG zl}gO)$D&T@@tQgMfXm=O``zk+)v;sN_l?|^ac3(f8Ks>)f4gKSSw8%wJmH$s$fLVTJ>(^$RG+zLj76Im>7Igb-p^2FS1}| zyC6&rT;bD4?F(u}91WOGHq3jDIwTc=w}<5kCQ*?mrC@OL%nc=E*Cw_27oztK_N_gZ zft%5#!OS#H8I5DqbE(VI*l~|h%MmK)tr7IifH!Cj2#1>6*%}4x`WwApweyz9~ky0oqu1*pMR zuLD+G0G?(sO;4%^!2+1yed+7ydr-e$f4}1f?lOc>v`pQvBK0f@CG|20E(*xqrsyah zKY*Y*iUm*Hb^;O?R3xTYYSMz);}#myAmo#+2+|&o?15;iJ!yIe>!o`tFv*#5a7uJWd+m!X4K1W5s`9QGm$)B|EO zzQJ3iL9*bUR`L@-nh8d1MG1faHc4#>aD+f^)Aw9t^opY{R;?nEJM1aP%=DQl+h_ex zgsM@jeY|(GZEt$FvGMk5!bWmG7+1zzH6L6TDkn_vRp*57@?B6NTpse9`{Qpi{K$Y6 zRuck_h1v4DOoT{!FUPhV9xudGW~RSQqd%b%8fv5-F6G#gFE>*tn#(bri162`5@JjmcL_uMy8 z*HhCIC>=Z;^GOk}e!EoHrE3Mx z;=Xt76W@Him~!AQJL%Rb&M^0F>)I>Uw3NfmUX2xT&-D7tspD>f=h5W5*R;Z+d=bil z)Z^_>6oj7KZ1^JAfw2S!Pk9QK#fF$_sBxyPD=!3;YoVv?;@b<)0?M7Mda66dBedF3 zLHzgHO-2xb7w|N=D<%LX<;N<9iM@!?srzy%FE%@`bDgG|&{KTeeJ=CclDBtUEFaW1 z7TNTmj~Q_sS#>h|;aKg2QOoJbMfJ1Uzw8B$)aN5pEqCMY`wT0^ec^jJQS-LB@h~?8 zx=X?;eextx0PmuVF-#&}Yo_^U|9G@9+ZYlQ>Q)aVKom-H1J_!N%Gnqn8ujI~Oli$*v_B zt)a0B3|sHz3n$a9b$Z-i_V(Z6w>$h65~5{30W`y*dZy#G7(m=$B*k3KzbxZ^R22z< zg?Skbx}t^bQsz;!o=kw!?&3i(Ll0A&A_nM%X+jgY?w;o+M${O6+*PwYv$igE)VL;h zv~yJd*wh1c)ca&gBwkdN{K~5Dnoz3W5T14Cj+TCDivZJlEdpgp8Q%mB%|{R+D>%^> zP>GkJRw~?=9BGubUnAc3+r2$LzYKTGcV8^NmSl1AnCY1Y!huoMADKCaE+7nCk0g*p z7BoZm53k859t%0_{9v|gWc{1;TaqHYMFDX8{?NsVyW{Vbs)(!z7h=Hkvf@QHS?c5l z5o;-IPrOYIply={lp4E(!v3cjsMDvE%Ss&(jS1j+bD$yY5?7Wuq~^PHpED_!*Uu41 z{~6+0*CLnqL8kBPH|rC*$>4&_Nfm{`%cHw{L#NupsdJ zX!Yz4?X24cbzzqnR!XzV$V^cvGiJB;nzub2<=KOuM=2Y}%wt~(t0Qo$O^-U#%OR_F zzY9wB?f!_n8OKvE4ndBO90gK++njb(VpBbZv|o}eUGG_vo`I+-_o%Q@BSL_Z@OZ`h z3p=ynUM2Cn2dN^T8EF;g3X=CrFLmgMSJlH$kkU&DEn%DYr*18X z{L(fN5mdpol!x#HQZMR;;IKUhRosZ7rlq0{KtqCL10#1qb@x=I6)=WRWA)+UW1?%L zu?BKCET}9n0kbp#LVqG3M%N-1o0RuK+CxBKdHEEw{(HC~B(LFnBq|Fv%r|#Hr~$<@ zq)Yeu)iOj&KO3@Mspm`ouE^-U^Hj!8k#1eE{M*4nOT1^DZS7`FD*Drfq;z<7H8U_0 zRxtwE{e0;u?~saXq8!Sv${<+%>W22@AZMCAHiMh? z>K+JQMTSNt_-uJ?C#LXj%7Gf9zjbU6zZL4QUPK4qEqI1F5sL)vY%fnwx{aph#bMrV zDaTSj_JE(%4fD--%0>T86xh%r)(tKd_{&mL4yl5jtpm>6b2n9w1h%k07Rle~@Uj~) z1;zzx!mZTM37{7j;O4pT1wh7uk+ikkUBU0Kt*jin*u=XQP8|OwRyL+;%r?`#AQV7e zBIL?^lyv^w@%0u=`?W1LgzrgmqRoMl&^qC9KWtd>#n8qKe_2wyaYME~&>mMY=it#S zw66cUl_k{=rrX6vA%HH8XJzP|(YL$*`M-EMZ^G+YtC0+(K9HC~IwxsFJAnnaspGSy zer$sc^_0@TI(KH~+n0tm1iYijZY*^n?dt_MeYaepZYf?FE6aBZqHW4i1itq+!c$UvkEX7I6_Z^0+ITs>vbK>vxjA zK4K^A)dm?ze&G)?)_>iC$Y?>B`+hQfob@w$VX6Mw%Ze+FDFW-47Z)*Pd=_S}Q3W3a z)IhQx>SzQ*1{aBDtcNOPf>t!HxsrI_XDlkA&jiaBiDP>2F+K=|G9j~D#V$kc-s`>^ z=2gm!PTD3KZ%sd+`T_$ zwG*g|fKqKGG{=;1t{0tM{tl<^lk)0U(fn8aLc`&6bs@QYC$@j8s@PQSreh|VXFc1^ z{gItn?@@j#c=1Ojs(V4#wfB}^QDiTNQABB@#tjiwxc%46NrHw=!A36eKYaV~zo*s{ z0v2?mYC^`cvo2NM-x%6*HPA99(3U!Nt0h?s}eiO2b^CRBRALuRSIz( zL5D5pj(#lHA@1dWrBQn`pGm%a&~0Q+!$PM({8jMU50rNattc31pkX z7e;?n#sv1$L;2=jeT5LNyS^5~*4M3evYtXcJOs=C>6F+2G#{2>C^y1KzfNtx&X6zv z!4HyER&TP0EWR6qzz6@Ef0@I+CvyhohMY^fJUv?g=Q!MJ|Vg=&jdLdk1%B~9^WH;3MHyYR8dak`Pkf4)W zSiU-fA+rl5#T2A&?^5mr6kH~@pFdH5>iEv3xgT7qEj+}!ynZ06M5#JSNQ19BqoqX zvb44nb01uN9TjpDh=l-I;KMgS#m7kn7L-ZM-|YIObwXt#9M?B=R91g-UM6kXEbmQI zu0VhPPqO9qub&Mm0S$e_4V)30{kMrH{iVW~01BH-h*cF()?H`=^5E@@E)nOv?g;tPEL)f1TkjKN$aKqw&hK*);h z9JiK~W(a9d40dDvLIRzS!yS{Fw%=WCB}Tutx19?%`s|B*Yf~!qxdg26XCod3zAAIc zK*Xiw-23Y5;(dr7ZiZ*r_!-Y9e81hdNaJOg_dwr};Zs+Fdx%-gOwfCQ!H;n4Xn>Sk zR|z_IzpZfTHoAJ*q-6h3mNU_-KU>lI1TQ++tM)C`*Db5IPq%3cyo?r#6xUFf@tgPw zVJX2>dX}UDLny2NEVVd$pf+E3xn|X%s{390r-4EN=`+jv$Vi&uX3j<4sq=@y@5}qbj zM8Rh5Yb`B(I#Tu0&O<=8yKX?BrrT0lQr){4w9}%@MfHB?yYcYL70-_cM&vSktGm+XRk9e16Cf-~ncam(?&KhI8admo&E;}j}Rp)Q~b%QU?Xln++?GBA_=5-uQ%w@>Y2 zvNqcJ)h_-|l4>H48T*cBYTA5Bi|}!jyW=k;g9!v}mjJzZl2!%-q;AK%T(ce{;f-_6 zGGGJ0dZm1?LIY+tS#@o;)ma>ZQ}dK2N|dEkDt?E(d+O_3_fbOCIngNDA3a-z#@J^J z#YJ;-I)A(T@yE9x*3;ro0tE@z_qcvhc~1nW5c`L$x0)1fmYXzM5+8J z^ue(hQ#QHrJwAx!YU;gf$Xs;`3JVo~fpYg8fjK>VQt+9ubT#LLL33?#HM&HnH7POQ z&2evqL7C^lkB*<9lKs7pS)>E88iq1G^1Xq8K$l&afvlSXidufJeUq7jpj6UHHO@-& zcm+4OO7#Tmf+a{*;}7n&T|M&LBqv{>%M^Z(ywc}>^(&nC?@w~xQ(46LdImAc@70sz znrmAW$^s8(a5FNlz+9e6o)$$NV%5_0yh4m`ic5lwluafICY*Y?F~c{t^86D7Q;gA` zbp)-jTVYD+72&dhzC<8OyP3A<|4za{CS%sZ-R(f)SHnfZlwJ?e;ao9ls&9Fw3^F_( zp4r)Fl;VJT+cVLd5vYjh9Cuyey9S;&eN)EkK=Zs{X$qa->%Qm@C766Ho14kk3>ui< zI;Z%iI&gf3`1W@GlDlC=V?Ec0_u1;p{z>FxcekVCd+v(54VKOYtGsiGuvt6vYR|a2 zj!C|pKNFs>5Ljtj-nFO+6n9`K&d%ZKoq$Eo4tq;vbDei)JD%t5>byv?Zcm_QQ;^Vo zyD-1=fx!hYNy`kTavQY% z9U6}D#3!gr9XIG)&cd|kcaDI=_WutzBgt)NecyiyL^;ece`X{ZY}CIc`mObyh1Anl z%yEFPUI4V3_B+7Pg!+nGFFZ_@b8C0EXD_^xYin!J<35?jAchL^2 zsgKBeq<{`7k|*MeXHGUIoqy;ok{**(%Hwl(Bl%m_NMtQ8`FFXu&pf|VU{TV`qWjy; zI(d^mL9o|AaH6PsY|xev$I?Em=9c;+`W9idc2I@lsLW-0)Y|<$O`N z0_qanFmJAwA#t_eN{e-&VG?Fr^7ursDix8z7Vp=60ZLdD<+5mX_fsAE_HgCTmj?uo zdlGzN7(Kc9SAZT)eKY70$JDrU0~bgw6rP2v+0#LEX(G|~xv^tXdF{csocQ+ilum-9 z3Wj{m-}(*TxfZy8GAeZyHFA{qJqUbM>EKi}q8f%kN4Z8jt*`%0x_y>5#Gnk+rAl4B z&{c{M%F;C{j%zXl?0z!_wpX0bTM?ERvOR=PeCZ- z>=yB^Hg9KU;up7y_kfDLGr!XoRPy6pucZf`qy4_!X0u=5=`?IP!#ta6;3aJj6o(l} z+!BH&Tc;aLsXFlORxia4*(`@C+Bi zf?ux4j(5nI_x-L%tgb#W@18X@efFw16P=Vv{xV~cLF6gUcp2muwmf+MtVAy2dl#$k zAjt4VW=O4>#-&Lu+RTLpwi4g`5u{HWbLH7svYFkW`>&oEs32EAsa7DD2ibP0a(JW=j1_ypm6u^rLdo zy9=m4<`N`nPONIw({hb1{L|%prouD*0tz^!-QkrJL#{Px*{4-eu?IOz+vkT$El!k` zzMN#F*koq4T6bK=1$?8p{KkN9!WXAmFmrlx8jff8stBq~j zJD4qht};P0I;dMhV=I3yYcJObT;@%-v&x&9dq4j(ApTAuAoyhUy!?eKUiV1G{NUER z|Dh?*?dB?l4pf*ps2X3Gmz_3>;Q&0pvV_MTph%oXqLxrT;! z&caorqUQ8T{DLHgz15})eov`0gMqos12r=xC*$(|*S8~j?`Dc5eEp=-bN7I5$tUYD zHnYA|_$=#TMzd0YqMDXhywGPHdEUw3T%BV$@2{Fo{_}suJHU|j9JA@hcdd)0059Zf z6#pMyeC4Th^OvSZs9(BKf&TpGU2l?uGz0BKP;DhTB3E#suB(5B{DGHGv62D_~`J2<1+kM<^ zE`Kp5TGLJh(Wk8|HwusWXh9QsxyjuSF| z(%|n+KbrV8yn<_y%p6fpcXBg~(72W-aQi77*-X1Q?Yptfn5SY>vlNo1ynHRaUaiB< zhBAcG;=8(h({%dbO^W_Fc=4SvEgtJr#1GL{aEu$QES3$vvpqb$uD#uJER?MksYwW{8Qyd&f`V z?{~r5$(T*t@{2QIB`7^QYUoi@hNx=st17!z2$q8&%ATnjwdqG!2Z1fa73Z?_+A^_( z6mB35{r`^y6rbq@H0>dfk(I;H+?=Zy^Kr|Kmr`x+6=Ef&L@b(XLqd$)na`HB+6>mO zudNgJUD^`P^A}aC_ZZq;y%LGqg$46hf5{3NHWuT^XbO;w+N7?t^v&8_@w!%aKi*1& zN9RwbZ&GC)(^v6_H*jP_rzb7tDpnGLvzHSsCV>~zJhu#2|N7*pA5@4;X7%Od*0QyI z$JW4bU-8GCy~TN(|D)-;BiUZH*hKmz7vBx;iZUFrRY&wPluwEzgWk!-)i?fG#?Rw=`tw3{laqa*-(iFd|$Aq;}y|j0xS$h`?VqRr;ImvV7$(RSBpDM z5HacvvZ0Z#=Y;q&oj*#Mb2)#M0H`7w$0Xsk+#d6QdMQ3FzKT3n`}xpFAZkvzOJEf}h<>Ul>l*zf|`oX@DD7sfwC!3#Bn=f)aDv`(^VK zjlK@V+w3oVk6GN_t=Rzj12(UHt+1647nQ}$xs=y2w-jt-e=M0u(6O(Nd-}5rUcF&W z-L-FL4^@amS+H$VO)O}wEoMGQA=RDw`Ty~GI;v%EQrS|++0%VqPcX2Q%azix+Qh@B z;Zo$T+P(T_U<`ffG{;vg&+sw4R71vQ`K3nGzBkirHasNCk;>>*)RvDkNDCxmJ^W_@(Mjp08E2s5yv z>I6ZB3=m}TAdIuP>Ex=_*cNEHOWJoR4GR>Y>lg=aHD9InVBjAa(LK4A;cxnJ z4`{P75$!S?kH!)XSO@yE-f;dHo%Zrl>Xx5m!@g`#51GhbEuA^u9gEnL={HPfReJMA zSLg&75*bGABq`8bYvc<8A8Wn}RHQ?*`G_aoQhL{DSDokj%mX%IM-E4= zKg-@LQWhUE(a&$N{LGbQ>9+FjHO9fdHCp>!McYs!IGEOyfq(*Fn==7gZ;fSVuK*?# zBkX?suEueLLslWmVW+(gwktK`B3kLEW$8EaPQE8Ncq1n*?jPF ztn0lraVU1Rc;FV#H{$*7(@|X2hbca*8}i``K&VPi{Z@I(sD0ANN3zoE;h?OkdCxxM zAy9TtcY-o+H7;AL{P;~y!IHPbRQE{Phm%q~f~b9=yFZigfO0MUTSIu!2X>RMZ92Ad zXn_z-$*Flgr2L7b<>aVLsOPN)#DikWUU|c0jHl>_XV&Ip9M4V90|9yp;BsLa0O>YG zeI^O->~6~+TSsg!SpkliG^T@=cq3`ZN%29-+%YpU{qVxD!>VU5)q69i*W6uPDQ4e# zstUjUW|FhUY|h3RnEy$&qkiK+`D(xGa9$@S2-89Kue3eE!Lz5Ib$w0;wDh$>-{2 zE%d4hmoH7sV7AY7%=!Kn0v&}Lq5Q8aa1_$s``xa z4=Fe13fy?kmcd3uWov%sd!re+yMr}`ZP4w$ZHgRD-02RS0XXmNBtYH4Q<()k;{rFR zvD-;;vXGAR94IY(GYiWb6X85y<4{nJ?@UXX+fAiDIjuOUE5Dp$cbew2a;!Cu_)Zr) zE0!{K?-n**q9XLW%$6#DnHCAxvGH%MA(Ym)rJ!og?F8l^DWl? zAp;{2qE@>qFi8xcL^Wv5iDiu$LMof1+oN$3DGg8Z+-_V84(%wrmWcgX z>r}5dR(El{V>e3aSkZCo5e>|lE69(b*@I~QbI%Ju?LDYRzc1}wHieOMLth8h z)n5_ya&vV*K6%d4S_8MSk6z7`<2k*5sL;MOA%@ISwPJj_b&O>HA%BZIjiCu#S##Pm z>f|gWj^_7y5$%4`nexh)k>(DU!{jJy-;o5E)ExcOao5N6Y=Com+QR|R7ezXwvS=bj zHlkQSMAK~r7HS3Qjo!86&wvIgnVh^88!ew^j|1Ua6+nt!!g0T5m6T!op|0%Nzcqggi<(KY-(&?PRGe~8^Jj5BdA z@O5bmCD#&tUn?}fF=K#!jedez*?Y%vP9}i*=UF=bc~<0;Au$wnq`-Z}D7ei7cu{;# z7(Xi4z~!hpi+hg0(b}G^UDRq~-FslKD-!iom*J-EZs&`8vJtkIr&hdeMUT~Ep8K{} zzYqRy&BLE8@LGC(Dt$zQ^qw5yRe!xa8NefyT&?f>*cxVJ^S`b71SrrL#Qwpq*Hk5|12Vxr>S zT^6UwM-G+_wE8_D)Y+tbDIA8NW`{Qy)Bzc0dt9vkdo@89j>$#1KZF{9Oh z9TJujQl#0h_q>jr4RF8e0F&F2Aq+P0{<;F*QTGnJ4J8)5d^{VZ^to7A8&IQWpg_YG zU^mYuVDAEzbe@LRF>}>8>A6ds4t^p2OL6e@e}Vu&GhaeE+3 zMq}c6>?1}V>~llb@a8!VY0vb^-Uk$86CfSN|GfnpS-Q?xbQ*}F$%-+#hY0-%Yc`X^MAQNDNWzxDwV6?mitqeNU&i84Vh zWr{ry7ZB(z^mmdK84k`=t;M(IgfVjruw}(N?nHT0Hi9si%eP8QOG)0bm7=@nL2@Th zFAy;Ic#c?ixAqksK1vtRzKwAckVHe-=9uJw$w1yCf!58yy*jxjp(k_QdAyi`Zl_^k zk9?y5EeBfb9}%qy8&n6bSKGI|(-*g!$X3WZI(W2^lNs|SE0?%e*bIJQnGq@c6H1;# z#bs-~HFgGv+o_GNi^rv!@)fc57~i|JXN?4`q~g_1l{m6&+Vd*zq|=))zg}#D4}329 zNqL*)=D|)4ZI`qiWs{7?6&wAkw?3wXMZd46hWCv!8b3LP=IG%!Wo=pY@0&v018qna9^#rLVzX` z=!)?tl&NjGW%Ko$#1HX|A|$`(zb)@ttm1JCQA6DDxkO3V7G z5{^T}U!%zjZ8OZK^7xo@F!!dDX}OZ^FF6!DZMX2n41i_`KsWQa0|dlhxY z(vT0BTzwK;a{6j@@e-V?(5m14!hZZyEkHZ2K$?<9&Qc=MYO?T>#^fcvT!W|5hkoml z&$ep5E-3OQg(84gS)=EliW};ZAbzwfKYrhPTKVT?+rnE(*ERQKvElg5j|Cirg$S+l zVrXF@ZwI%ta>-y>gfz9>U&<_C)neB(`dLdWTOoiP<`Q$etK52gM*5=u58oN7qQ|rX zpIts!h>0Gpv#*--kHwQdJ+B&`_8iRDs-KV^!5<|19!ts{+SKvLj4Elo~*7uvx{B~r{?wqnBfO0qkAm;@^9~%Oy=oHIYVIX{{RVBxc zT;L_>_jxXPykWHZHKv^KSuZysCkuwVP)xh>NBGWdp2kUed{h+i3-8$uZ38XGEp)OY zx@agC`Pw3P$KOR`MG`B|Q8=?qCoeH+qNVfugzsu>sHt;ArN*z76sG2PZ)TS4$!XT5 zwA=ceN?VWi_H#U|*Z|jQGUaH+YKw3unwyc4ijZye@>y{9*v45g(tLDUk0BUIk>+fvoTVq85kH!i$O<6B|=+2j3R#+F@5c?H1 zy}7b)vp_s-#3TLbBsh_f0+$oEIOm8VR#@bskQzZQWRJDWBkMy`PSSEYY11=k?aGnW zrqao7?H9FfJ!#Bbe?_gy zKjL&&v;wfzp|aWvXF~-PFfHx1P)oKT2wM$pv_vh6be~Vdw4An=%I}-1+}n?Lw7YN-l5p)zZVF5O0qZVz|C?VKh1r1%L;fhg3%KL z7Y-}Vt5q-2tUaM2(&O3zrI`&M!Ldb!-GjG?aOu4=>zu=ekPO6o5gmA@F$<4YO9t() z$MwSkxgHWWap?)1L=V5=&X43<=GxoiNht$Pvrg06WZvG>h^!V2IoAetS742Lq|N7m2dNynGZq@YA#@a!xcVxaqWEpM?uHctQw93wijqr+;zDnB1n$-Lb%(rb*3Z@kC<7n0h{J90QEs1 zFVWZTov=-?Wlb4vJOP9}wr&FbQRbo0?|*CSexfj@oM62rqn-MP=x_{i>N!;E$%tL| z#kk8DK>wN+{(2|?5OFrTn%r^y$ z>7CGpoOpm;4<<;D_63s^Ts3C)bNBE zV1UM95CxKz-DBYdpl;`yfA2C3W|Wv8aKfxm1wJCg512@7kpZtB9l{E{8z1t&dkv5a zK2x8NA^UIF1d1Qg{WuIp<|vn0fDpT|lDTG|&v6dN9cJ@1-}<=p^Iz}G_bA;*l)Mvy zNxX*%o_4%mIHAJXVzFI7@i9bSJYBxhF2B63y&hXrYdW)fajIkE>%2Dgir9fqsak6W z?Z)piS(UdLN#8^az%!E;T44cv3p1W#kwiTu-;4U2FKOuGBw9n)?=1l8FuJa1XBH?5 zr5B(|sLf*!*PZFW@e$JBIxx;>VdVMJhss#b*bSivY!sF#zrOI-1EuMhyJzs(F#jdV{Xd~z!U#C!Gj7Y3J<|PJv zGlJQL9cEn*nA-oE^eitV?nF<)c%Y{k+A$IkeA@IhQ-y(z9^sb@z!b^P3@+e5UD*bJ+Qr zZ>HY$pScGB5;dUZMY)5P#}@;VwVr=LF91m&dJA;5&)~2-cVdR*QpTUDGtSViTw782 z#pEPGNWMDCt~&n(#y%Oi_Ro9hB+^v{&LDy|@)o9UB>}Sjf(887k?ELz&es7wnMO)P zy+*B!>?y{O)#F@ID|s;Kl~C|q<5QG%I?c7Xa{8T>XBf?;jOMZT+VR%wcw9QXIDm;V)Xnp0XRlfq9b(m%zWdXz#1&5Y1CL2JJ2e67>2tHFI zy;UyCEdtbFyC#$D#&7># zj1#}t<+$f|OY#%Xw+YkL*W+G9v>zXVf7NsJ3Z%s=cr-rMP>;^yzb{-J??m1`x0s@2 zwJ2Ej{7?4$_P0wiexxEhbehaX*)lEYpHvml-$Sy{mZ)4?$;K_+tW48bSlxnciZh=r znR|3Id-zd1X2d9$X%x@}7n>4&1m3Qy57476aE@yIAtLb9QgMo&ksuz_dDrT~gPz^nY(0O-ngmL7nKfgRNe04N%9#%8%~W3?PYTvYd!xnTo{C5m{E~y%^80oPewgb&>DSUf2@(1$<1ozHH z(I2-1whjRP;~U-A@~Up#c%s~SxVe)gznd9za!F$*5w$OUE&5y%-$_-3RbsRH6$2j) zn!2n6A{;ieyd^!>GOStJ_PTvb1=lUKz2QA4Dk`mMuFmEnrahH2jkNFdI;&33fK2&F zWx{o=_TjuPY5k)ws~7dB(i(wU5|PE<^9$!5o$xEku-V+qmG_Ir-+k5JdF2lIz^Dmn zkTOy)$4H^mm^n5}hEoGmAx-H(X<3HkS<6T-nMd$R)Hr#tPDh+QKrv)Q-G=WMp2vGo zc#`kdQ{`+N()Xwr1l1$5e8Th_=603J?fs#!a2 z;Knlx4Mp+}zFOF&x#!qBHiv|3J)w^+lPN11>_j*8=#<7UgfvUpNyKHWB$r05KDkq) zD`93p^U^7{XVXK9_3@%l7W!~`ouQd##>^?mWh*0yu$mCG_^^A?%WB*(jk~&Xy$?$I zB(f>{UG{I;)|SXnF!Zon*rP_Fs>)}XmzY)kCn&w?^*a92r|L=vsdBXuU<3IV}q72^&@e zWQ6b`uSt(OYMutk_5BnA>Za57x_>fH!zj};fw3&}w7y+& zdnktX9(UoKyYX?pWW#X-eOUMvG>i(r@s}kA2wHDS@8F>`~mD&EMr-j9W{X_7+zNI957{$(+u zs1l2q%n|->BE_fC{$NCFH-bI);gb3VmYTa3PnyY=A!6*g^~)K>u0R0bK*MNo$%#Ce ze?*{01@Mf$5OA-~igSzzO8EP;XjT{mKZPp|M$Y z+Rhz+i7>!9QEjawBu)ioy?LYM^_1YMInlIQX=R~|t6cS$du z9+nA{zUZb@{7lAAA7$Tsw~QTAyB4(zSKRQ&Z}@Cyd95e3|NYRwo7hC6^W2*a&nc>j z4*9R0OChtq2)fveDMUhuwT<9XUh@MX7KEj}xv=HYE8#iGm zLb?o^bie{8QhxMM7%SzGp7wKQe2JFBi3yWWYG(WR<%Xl2Pp@dLf6VKs=7)fH-nG;{ z8rsF-MBp{IkxE4XnIHPIH@QJa#)-5@@uJ`~xHxG}1QFN>I*uU*1|ji0*kAq3v166a zKgs*AN;~J>M&9l$@7szK;3S9z_F!>xpIQ^N<3-){KIf+^e7L}V?jdDBg(K;G16`2k zJBwNO1LYjTu-C!fo~*%k=YLDJa7#zAAD&stkK1e;OP06T!jnBcJ>0Um75a;n{no?h zX7>#+!GsHVqwh%#o_TpEi!)zD3BA{EZeFwf{GiHIj5QyRc`oW4Y*u(3w%br!+V_k* z+^A&CG0rfCjj-k<_<1TLfgA1&_Z_C33R3aCU(sLL+V}?`cg8$iLU6F?OVn_U9Z}7N zD#dQOI`2{|{|+&FcwQ%qZ8<80;H}EJ$rwFOM`#@1 z%c`V7d8Xg%d|Tup*%WGpzIQ=$tkl?h$0?F<4LYL^{kuow;2AnVLWvaTF2E0m@oY9+ zwP}j|aiQYiVpGVZOGcsW$`L{H^~-lplU{RDO-c%5y6#R>vmFRj58d>bb<(PS+lzn` zC!ak%T+UtqGFGjt$KwcnU&l990 zwwG3~`oY-D-~a2F+d>7+bhOK35mtN;pB+Xi$oeXHnFSw3DmLe363B3drkKIdCb7$x zXEKVh6(fbt1LoM->o@IVTB!rL-?sV;4y$PC%p@gh!2?A3N~IHdsSDD;jRzsO0kKI4 zPL4qk4P{+;$Negq0e#Fi6O7`bMJGQ;*@^*b(d9zR+;w#mL3Vh}${v-d^u20gvY*4n``RrECpL~p zV1T(%9J+6mfc@p^MosuL(I?-x3XFr9I3uzhE{v~BH* z46eF>8OgtR%QZ0Vn|_JHW=mfi%>MAGeF*A$rxyQR|^srGY}O4du?C>_+LI?%yBQ zC^8@KH4g`53JARa>RE4Gy@lNJOfGibf40^15wqpFU(dCM1c@_P-@5QdqfHXqc7_n$zf&Pv@*_xu7vB{pY;12cP{ky<(xj+Owv&7Nhkx3 zd7+h5)yzitQJq~v!a#^%YqSA<+d2T0W%|(rtFP)Jf!eh8i8+Vg{l?bS@+B++!{(8aJdesuLa5AWXztQe)6ao zfa(pmsvtAuD4$oknq{mwY7f4ra|8F(^(t80Ev*{*DjY&cY@T+K#j{ClX+G0Yw4P1Q zZQk-v^5Wje5gfx7eYla1j(sN;w_A})a>|RPa;Y{C5jz(Q*ifgLO!&`X9JYKi?$<%@ojQdP^hg<23 zpB43|qb^S58WZ$CMQuJLxCysYEj*7CRWS1{8UP`~=Z#rFm@UxER%cEOP#V~BOge%T z9Rr8%gBp`GRg1yIeAO2)GNOgscYDxLpJJR`dibxvoT1&4F6aBVPpj1Dfn21OTJqt&#WxgqPNn@j^Yndf2$4zgszR+y2GysYaI z&9EE<+JxS3NmTlIc#8BtaQ5SsL7TbVA(7_UQNA2DhOXp{mL35Iwe)H0;TQUv&I_tx zz_RcZU3;UnHu*eO?A8PsS}~p!+Qbp@?HsGu@sS8j;G{#o>a^urTFojIMX#&|Vbdc7 z;<5bHj9c%#3EYeE&#xY9j~|VSTD^NUb;he&$(W(kS${@hl@QW*kRoeQNxKJC;|Vb1 zj9Blrh7enWNNP|bB?uY%`>MYWJ<8MpWojSyAhUAqc#H;~9mu01H1wbjXUK(lzS0)q z4Dh|R5R~nyG@0CJ`dfI_Hhj{kN6W&ze+#S~j5+ zM!wVvM$|Y=$C1GS4<-J{y|?xkP{M@j7;=2nuW$@GQ2?}qp&&kBM{h*|_r&^2vgRGm zLjpCr=IKwNm0!n3Hg^~Cjd5w}c}x5sc;U&o)jmZLLKqF;L`;vGEdvGc2pAJi+|ud= z)#9Z)?Gzv@CRg6wZE?tx~cB&XuuPPJKoO$6At z(9S_^={nuP&5JiIaTAZ?Tn_h++_a|I&S#tE0_sVi8AfZfP3fziX`!1(?Iii0{CB^^ zn|N#NR8_&qR8-^Sjs1{RI%*%fBdVcA3igPP$56{A&~9u{?aXxih7En2)hgseEFyBN ze%L*;(x23EB9_+g-amHf;{ZQokt4%5W3Bcn@3!t7}F&mC^gt=z4bzeh88l(th) zx6hNSoF|tQOu+SPH+vCoaLVp;H3pb7HDV6k65k4E5-{Q>n2`x3rm9No{GnMX!j-Lb z%l;Xs9i-d>8P=&`polKBH)K@7&qT4QTJ!d9K)W5&jgPgE8GhSMW>yi&wtNc}Uon&^ zg@T#Xiv$ohPuD8M&4d2gpz%l;Eg~RRh%mFPH0ok{USjSXB;|NUwaU1Jw=Sh=X=Kc_ zW?q3?RU|X0I=%OCXax5M9WYYqjqvlHDAI;YY4$ZRE|l2>cgJNQ;z(NB5rrk0t?{%` z{M`mcKtcHeM*Kr~DJ(n=kY+IJdKt^!X#(y1gyEt%#V_AT! z{Z_g9w6!|rNb1!_zpZO>{?^c$T94EpeZQb>0n4JP5cHk1g&O_}GVv%-x2b=%R*~JC zxNbJkgfkfE;e1)mb9hw(7(}-I6!C%9b6LyG5-VU(cyP4zh3u2IsU>z`RNp zv)={Raf1TfF#Q;jRBt%12;))-!b5iJYLbhvdvBL_O_VLm==rK*6UR#UQQw!ipOonA ztSx@U_-U^vF;9gBXWS$s4aLvShf2Q|zOlxt>Ndv%fq_@X$_*CU^5`Wq+2r1%MsJimojp0k9S6u7& zK#C1~IlEAN2-z|n1^!Ni^9M6PX|#+TL}Y{#13PO$=wk@JH;gawR$aAPL&D*a_e0g1lqtVGEi|ra9Ts2DVXGx2fqU2MTQV0%pZ)Jbe7NOR zgD7M-i7s}(HTu~tetPTIu1D4WkXBZvurYDtMrUa2&V%)@@7j01Jn!}xsxxZLv~J)m zG^k0nY*lna2Iye06cRS{o|Hpusy3o^Z;tErL5c^_q{&ubJGZGpjlX^Xzx3RoRbp19 z1a@r~G=r6L0ZwtGo7<*Rjf}7JtEeY_*v1bnvPM1EVP|#3HVFB#DJ`4~4W-7*Q+}s6 z7lwKd8n(2^PD!obxg$Zg@z7OAsYLMZB8FK3mobx7zV~1mf~lPe+!|J``pj320+vQtOW_s<;QfCMFr zuM^K~^`yjF={@rD)12m*%D?b5yK#gA7U+nN43xeWM_58jOT)E6Xz6o+XJ*!!UHd&4 zy6_S;y4Vx6qjMQ4OTW`N*KjxZt-5O#1mE#myJ@5PxsfWOw=duu+(imyN~cQzz%!8gz5`OWrN+&XErMtXU8VGiKSP1cor6MbeOG2iU7cg~9gP_OS ze7Ot^_N3(C`{GR$AVnFaMScY+yp#(q-t=q>)R@7Q9UT>KEm1gqE;%Wz?~B+})3YVA zMc`Aiph~#A0>0ZKP+ZqlT>uQblzGN){(|=sT0|0Btv-(1S|s<*Y@Q~uFDPs=O|0Ck zwi=zB8)(Hz$ywA!Ic7+cGk}_tcA@C7qM`gd1L+a zAjO+Lr$`lBE{^+9I20Zy2WNOrKdk{$togtXLgqKb%u&J_Vqm?eS@~o;pUs4?dGEZsE4iMW%dB>Tq4saIC6|nxw&dwLxUtS5 zele<5&)bGZ0p_5J`~#Eo{K@0QnWE`2=NsMCux*T}5zGwPNg-Qfs>S)-YuSmN5d-bW zp$H%%h!{wQXa>~1fZssG7%Cu+L`TVkF&7t}I}bfLO37M$DaoBMKOm&H&#&%$rRVZd z&|X@@Wu|ch2E0`wJ^ti$SqQL_@=*#xlrpP*;Ab;j4smz!X+kTTvO_U(+;9?9^^kht zm>I0Hz0FBfzX=yk551LKhe-D@SK@INd1zEe2%t*CJV24CGIK4imvV*7j{l@R@jv#v zf^zy>h@fAOo@Em3onG7SB;}{6t8NsyL-))a6lPPOAiTS~;=im&HN-X@_)5f}LT=bz z1u^vjd+FWBq*O^r6npTc2&DU3pUClQzkhXEC@rVUzq(r(q|9v5>iNmLd=k|N%Z z3m1V^-Sd^{SlJ1@Mb^O?EK2s8W8phYwe(ujxYPCBV)y7WNpj-yi)@_iQ#P5gAbD{G z^-515mpCzrWCbaCn#u2S1;iG3*b2A!(rCieDe$r;E{9=QOOan8N$HGN%``sGCK!Cu z@%wp)4DP~;nzaFffebtupP_=FAN;&=laRrXF_?5USGhCW<`?F@JyTDsFU)~!mvuLw z`mQ9!MN{{s`2Tjj#4+r6x8A^ZzL>7cy{p+Umh`?yt!9QOw)r@_p<459gDbj8NvqUZ zyvS0!ICzCajXTzj6+6oI81`o7^^%~hkIP6}JksV-Njrao zXwx-G?wZ{>V&_Kji+g1+TCo4h&r2LxHkC)12C>`HE@lOJHZ?Sd+7~;fXMnal zjU%DHbQO$*Z%@;prR_=hBEZNg*XR-z`uHMnJApog3U20mF!$qJa*Pl|yp`OXZ3zIL z*9G0J33p7n5Jt>b3d#xGxB9!0AVq_!c`~9__q33DRl0SRsufn)Bv4EnOsNSGoRhEZ%O>C+o=qR>-V#TB4i)G zmVfg%l?J1&7YJT?-p5Uho>%YWA=bVJBE4Pd`=<_4B0Y7t{l6rpI?ImA-Zz`Fmb~GV z@4MCY!Lsz#;%Bc#T{eRIQ_$|kJ8{G3(fn(`FyVVU+gD(u4wht1MpThJ@5F~HA-$Vy z^SJ7Y%8GLXqot!Diml1|#!;j9AMes%+$60E0Vee;->GN?d-DBJCCzw1iqzrSnj;@I z%JhNFJP}wMI8bDW3h%gE$a$pG_;88;G1C_xXu76pnmu1GwCMMp1C2A@CpS4-74%z4 z=tkZ~5UBrFe&>fp=ch4!qQxf8w!r*pG*V_rJT_-xm2_;YjuaM}+=CW(7ul+Ql)jwV z>ON?|uCN!{(Oh=?6f#)1#VezcoJycA0>C-S5ilN%&!fdVxz5&tOtPcYgpWD?)#`(c z!qZP@Z!^>_)R7Ty_F7?<;mHF+eG%AE^?=}KV8o#UEue|GJZKCuc^PeNqYl~u?sMRs zgI{2bEzb@1*Y2*^(PJhFivae<>C7d`rd|%6M&QwuH2*qt^x zpZb`UCfH)?YH1;JP>6>Ms-%5mUIk-zNccj&<_X3_`W3yCU%~_2LI5-Ll{pYGv9tOW z1ODWpF9===LkS~;tMOaheD;S>Z4`EG?Q`jUIeg)!_OBZwLBc4%8&Gr@%iI+gqkh%1 zH3B+Iz#Pm9ymQwMjFmq)-MDe=zsA?@o)xt`==3tDo?+A0BPY7^n~BMt&xVW#vVV6; zCq8IbK{rrq4A}`D-*B^fU1BVMkDJR>OTGGct9u^5T@U7cq*r;K*^4ZU?;m@Q0L$Q& z0KA&|eis;D?D~G4haJ?|1UmYDpKRwE&_w+0Hda9=@JJ8W&Mu>8&pK`A{i83gUunZP zH+p@w=dnM>)3hbcD~sQS@lgw1}htjYDYB6W;SPC$;w4QWd{J zMCWguOA$ta+uN6R!07ZYyx{dWS*2~1L@VhFnq5vdsAbjcCe5$a(d!y`(##4Px&E@y zY;*1rGrNd2{aOD3d^g?qDA-~(eF%J_*%5z<55~lXPn~%~pVI0scZv@g?C`68Qa@s> z|4Dqa@z^Z2deKxrW&PG2lVDdD)a<2akJWYNjlI$Jt<~Hp|GUo~zX1C-ePb#9O}5@G9-x!@kdhAR?t4Lsu+go%@^cQE2OSXup^sy0Ou98YMdEbB< z&#Ow<&d3jaMcdEIZM~k)SNx3@(OJvJ&Hvf=`j>D8#4`NP9^gVdm1{IM5f9v0CHQ{v z+v{ij*#v0Do#LhhH0qNbu_2BY`Qe@_@VT{I35Ofd8U@aO4Y|tsrJAShx{ZbO9-qyc z_INkkWrhs%bVHJ(y)D+`$1X`&d1}BtJq~-+JTmG9ReFz~D{yDF|Fi(N8ql+or7+aE zw_q*J2P4SX2<2%lB+(2)AWH~=B6CHP4BuFZWBz|a<{7eO}8SRA- zgWbfHv~FPX?=I&EqE2J#AR#N*`$>BRWW;4DMkfSn6RNr|2sGM?GH0M@TymgqrtCMX zm^&~I4g9MSflURQ^8wwX%0rpQHJ`iHUrWEspX zgUn!}p1x5DqBj(qL{`B6bz_#iAKAt62k0z%T5C7p+WfW0(_UHpG*Yz7TDz1WqGZ1u z6b@9+*p(C&$v=)#z~g*^FbH`7YP^6oj02hMejEO%fD&dskRDSOq{ZW=IlN@>Y^*L) zP+;v5VB|u)Bm8_L7L3V;1fh8_eVSXW;R68pN{{REOy#eWY|hW#GJx=Hi7A{|}T|3%eH&-nqBoB042>L$XuTh|to3W};qTry~OgpInO1x{T z{bsv??G`>HZA@PdS7L+Wy5<7(;B;`2Fb{niJg-7Bk9^+&%V7quB>l)k(QPleK+k$g zywjT!+oRLU8EQ0cT3SB@NVfgd_=$3R2D~1KXhpX3kdjO#Xy;K{xUlF;0)I+;iLh~fJ#VVTUWG?3t*yCmcT+?H-4pT-q)8Tr4@i*E+ z3GdU@Hy@ih$qtTHxtC$h_%KkQafUPIIj=&`ctf{+6Ywc%hy^JQc?n4VoibJ{$-AjgE#N!|OpPu3G>k_Pr` z=p6LFQ>7%h?j|o7B`U6yg!vn z5r)$jtB8xNjZ)|JViEEyXJA*Ogii^CbiIvK1li$PnQVf1>?rdszN}oiboG#5VnWwXEBHF>-*NipZS@di=5o`Xkn0zxJ5k`^Euwo=safT^u6N~o zN2L4PpTc@F=F+y$T#A?VwFeVC#nMhpGm?I&Z&T*QP~$_w-R-8$o4*(Bb!ZhBU}w%oc{0?A3#hiG_jTm zS;d$PKA2TNJTFxd@#42#o8%|1Y1>4o3597_i{Ae)R-us>Jj%@Kyk2{8ncgOiD)X5i zPD%-m^5(;jF3^;Tzrkj%vwxTPb0;Keuj7jh%tl`>D)6nFNME^dHNV1sa;z8CmyYUM z7u2*veKy*-X?8h;(S_;RIkW+&FPV;wR~9GeozWEl-cSkg7`Q3H^=!{~f{i#iJv}y_ zggR8k4+tGcqX`_P1L?*Pjt&*K)baLN=>?*!ik0FAibKza? zh=N=)9V4FKZ>Dm%JZeWbSXuqj>FXO?ym>*2pT4nB;;#}!8CcQDmu3bvKqjBg@Sw9V z11LV9CIEL>BLT%ga-$NR%o^+&_sefU&i+OdC^1n6kcMxE5am?ksNq}lA*mP4ZoR=q z(z%X%X#M~mib(VqXWo?y`*H5t@=*VGh3G)oFK#6$BAcoA=3H*Pjh7DL9`2_P3_KLi zk)^#ELj%J^`j_(@PwJ=DNNTC?v)>S$q3UUbBL{B))-N701~hnwcb=vqAjLNYIT1G& zd;uRU;}kAUKxx|l4AWPW1PWo1{k_G zG8UrfOwaLd*n<8$3tcCwd$DuE?Idok5vuPn7Bq4qL{ z2@3KzI-8Q*uBl($dy<+|_e!X_&ON$%2bU|$&P8xWfcu$0@&SsW0h)qw{;8EhD(ZV3 zwpN%JeR}q3H|+dj&mAYOH}(A=Yh5%|fw!UEb3pn7DtOAj0Y?smaRFuibh|->EC1xS zx7m9^TX6O<2oPfbyCAIA4-j#r9&hORUT->7$=e`U9#{C;@15C4>Y9Ir@A+ZJo_D<> zZ7vFLa$Zknw%NJ^n4lce8rE31E=%7R%5G9SXef2`eq_biU(z&RswsPpDo1H3Dw+voaU{b|-))H+Fwjy)`JX;v9TS;WVS& z_v{5~lahF-B?mlzLPCk)fHHmR_7Kq8&EuH6HQRi-D}HiriVz~@hTP~z278gZ;f(sf zxOvY0f|Yw`-NYw9T7~C#b~Hx8(}pJXei2@@BKe_Pr&$F%)$$yxb@aP3nx<1~l{KBV z-CXShI>S_XLgA+OHa$QH&WvMJxEG@9QdrKPp02#S^iS=r}#~pmWKa z@glVqxTyi)qbNer29r8fvtXq8`9>bcId}vx3zHxNoLKi4H=lnhqM^_Dfo1+9aq(QgK+vQQs2tlpKtNhv_e66yByFgrek1oAy5D)O`$Z`Q=`LBm5{;I?gD6 zsxL>Av~Kasf=#_deC<*H{Luc%YhyuoShvTYK%mJwrAnyJ>|=spY@4#8c#s66RRH!lWiMdiQs4 zU2&H!sl{=?C*cn10+h(?N4KmB>%SMzQKW4I%QNt1 zUa6!XJFVBk2-E)~>bv8q@c#erwQjO1S(%Y+64~Pl2_Z%HC<)o_wXRJ=A(gmgUMrOy z8J9~E%De~}m&|)n*SHtizvKP>yuZIkfAr|D?&IEbUg!CGj@K)bitD?Hb7tj%*}qO?sp4&D2Mje!CsMUiFNw^Lw?zypr_cUPX0Oh3Qsi=7wQp}A$;)a`GGh?8 z;sF0FT>eRbK>XCL!A1)d5iyRfcgoS^48VHeav@l&?hw_=IfdZEN3_UcxgWHcT8#o_ z)>IqP#);_}h6VB;2np2iq^l4l4Dj)C`Cos5499J1p6Usw`eh!icrDd?!lJ@8y=X-QS{at@x0!E>6X zuH!SI{%H>#BRd9GGvXI$N$Xk=WE2$j=>#sIHq=`Pz{phEC&-taTcREJ)@UZ<$Dbb}Cl^}B(bm||>i_ou(tTcr0OQC9gIeTmmxnabVkU{f)XNxkkKPLEs zZ0^U)<&EQ}QRA%>Bt!KXQEzd-?iyN*x|1jV4N<4PM(-pB1_iJI$nnPWS_fYcS#I+c zvcOybBRMXLr$UgNOr{To?eEf>^F{+spXU?X_(O6N8-yTuB*!ez(SjnH?F(sPFjdgL zhNoU?M%Wu2kN%HzNHt3E>W>K>cD(EG%i%IL(X+@Y5@!Mo75!66hdGL$#CkIlE^euI z84zWulMezuR9z`Jvez8+(#Z%qSIU$IJxJ)j41==)bBlp~z5o9}_AC^cWo!kWH-Xl_ zDxdJL8zB*AdPUYEZO*3sSm-@rg>K8xq~5AaYrTCWKN_yhJpNs&zSjt=RoI$5cMq(D4zu7kP5&H*wU-N@?`MA zB==*Y^zcJ(b|77)*Gm{OY4@Lbn*K?cpIA@ws*lyjkys2|X>YKkRqY2v10NQ4d1DAM zxjhpfi{KnTbs9{lX_DI7;(rb6=2A%zu7Xbk|}JN z#^-I+nx(Unm+UR4+M%eVu-mu5)Ej&I*Wce?e_)(XgXDj`tbO<2a`y|m^QA>aM)8of zBk(+l9H%bp#>_|hw{n~~ZTQTme!xbfdyx`ReSf5i^J?;70l9#NC@qzxyD{Vqz?-V? zSieyh!%Q_2j(CxQ5aV1E&c(9!c~|@c)#Z-$L-7%GBwE9x|IG=44FD)e`8=Er2n{cw zSgxz(m*88m;B7F6k``7b%D8b&6aa7(Z1^+(CwkK9T(ACCPe%-B)Drf|SRV0p$nDuj zcnt4!c+8}qd%Tc>vJF+jvJ5|zis($gmA)JKQjPVistWOWrVh2`wKzlXsJG0fs|}U| zf_u=O3%c{TL>~{puV|?N!UY-KJ8K8QFKd1grH>Xk0WW{M$3XIl7nm~?gy0f8w!}!O zY&WWxt(656-P%ZY^)~;)T%lu6pIMwyF_tdZQXXVFcVI> ztwl9BH>2&gn&;)Q@m}a|2^bpRD0WZ3x_WFC5O!?sC#G+>L<{Kq3EbKYy$PkJAN2^l z^q4SF)VJT13pVAvd0h+`fD&JA#Fd<@`G=Mw3+iq8?C?;ZfX`NahefZbDFcH*C%;f4 zKlzhJl@df_Eb;Unb%JJKdbS!1f|_ zztw~WW7Ti-(=1wmP7jExU|{M5y1 zoO}DxtTm&i01sT}eXMkIGxQTfC7`D^$UqfOJ_9!!gG4w1zXMsszJ!}=_f*{7$u8ET zHU!`g0l%+{f10d5E#&fW|Bu=c5}(b-s2+kFK2UboGDNOQ~D= z)i^f$m$kd}2IU}{CG@ucOZ%Johxo>U^@~ZjTvP%rO6#1mXSY{0w#q7m?bqukMuW6} z2HHRz$j6R)07KBufua#C^D`r_PnP6itkyv6XZEl^N&NO7l~mzCiTH zLXshqe#;Ng)laD?+Cns$iS;btDgrVSMk3GAL#XTNPmEwFa77oxZhY-zY2szWSf#}M z(=E}E+JvprfyA_XPKPKf*yW!afA*67f3@?6HJt+l@vLt{ntSMhqV5(MAQ-pc^-Scj z^{W^J!(hD>PTi2b;Rws@Q3DtD0^DNLs2$Q)sBZS>3ErhG2A|zKj`3oY1&@3fYBV)h zPRg3o0~ab6Ee6fd4XVWn424*I5l_%|Kf)>45k^J;YaD{}RoaIk|Mww6m^CwczTZHP zXP(JDqCkeq+&qA;3GQC$`Fwx!WjFW{zpJ}p=y^)fEi5*T)%t}j=e3cRI%E!v3}<7> z?#N)sge__vJ*Xhh-^d8g*)cT!FCeE^ef?Cm!<*BeDAB^VMA&fIP_e` zA!FmcnrNE$zlY>U^y&n5z~YUYilN&w&!77i-j2?H0?14LM*t}}3qcG`wl7gQA;ME=2p#-GGn`+1?QvAp|+4 zN6ggKU!ikQtdkrK=yV|{(KVSQ2%i50KZIaj9(k&kU#u~nPw~HEfN3{B@1`HOyt!H8 zYL2dyy?AM#IF1JVkUh$kutImOHqXHtET_BmHQ~YUs+za%-*p(e1an2>yfxSy9#5#A zz?FRtMM8J(06<1ddT9qas*{X(R|-Ddxxo;E3TuTT4@%>um~f|}d)Eh#juXIfyzwQ6 zzj^v%s>UN|{zvm%-t|%ooFHVq(0XIgcH3@YHV~r_ zEn5ZbpmHl>?sB%jD_Nh*=wLTY^d&66^Dc*E271Ko)0)|GM2hqW2sm9TU;{F~|3%89 znZjs=+*H#__)g=!i#%tk zED!(p?7b6@vZ{#C>k%^z$7OLg?mA`uYP9=`^{ew4q9!fayVc${sIxXP2zA_X?w-Eh zC&4(e@u+}P#qFg0P;7wQF~KW$6X<@lZOQDZ#X^bSKYtFDKn#cPei&Hjj`@rbB<_{7 ze*H7ca?bOfVhLY5uVoA(*tbcDH~tn4o|YITs%=nMhM-hN&=eTg*cvgYC5K8l7s$S0 zvimOlF`y+>Udw?yTR}iJ+2$e~%_gq5HX8Y*)NzkqJi2UO%y>U7k6TX;))+=hy)!>i zJLa@1WWTh*jNjl7yj2U1weBr zJ<;|&HvQsVK8DRIZN4JQhV0og3L{QFJE?cZ;p>glUDw=%A`UwIq1`;E1-(9DKCuj? z-Xw7BelZR%-G%gdjw)7bL<^MdhWEoYPKP*t-&0Cd4Y|ID0Xvi>PecnG*C_uILv~B; zl+1cGbN9O_6dRCh_07%LwdvUa6x-K}(A0U@viTCaL)~}b050!WTw%~XmfKS*)~2gQ zz-DDi1-A0}gFFkGeot0>!mFHRwY(1m1-<^af!&v*I-b_6L{-<9s+Mv^3`B3VO-E|JE zgXP92b;9jM-8n5Qk`}o9htl_)M=e_MHXm={~{bmoUtVaq26l zo8N0shB^?-xViRWjy4R~M1R9nW_+8n;`^r#za!^M!uBg0YUeE^#GXqk;P=1j0#TXLxBKUCb!l#~V_<(+<+!5JOn52pGm@$w0A=h_8F_IkJek7_ z>)?v!3Py*C7A1a4ocnXU0L=_keUr6;5keu~vVJG7oVT$7F>L(asA@0}*4X*W-<34? zYWE_v_}(A6Qly_FQ?%o6-uFUzcRr||?OB#8Z!|5@QR0xP-F{@XXRK=Z`?XF(f3ar! zc#gKi=Rj7m|EoT2L`E{*w-Tn0Zap3L4Tv|Bi#hu24a{ezT<`_tSKkbjjp5YOCU-{{ zm&d?c&LCqZ#_>7LI5nwPXy-X(-1Ia5R^?LpsGE?ylx=%RX+}68D&^eDR=Bj^J#w>P z!V}Ja4+u>zmzN4WU4G+zSf*PB`m+RoqXHX+Drxr2Rwu2VrK!05#%OiM&9GFT^Ky(B zBH!IUYqvi#hYtaBx_1wQTNi&#qaFQH4!ZjHHu`3jk&NISXW#;G+^QUzR)%lQ+TjAA zsM}%si+UmBDZL|C0Dq} zzinx$m|{+b#)0w=X4^{|TXz(1e?fqEnlXMv0Fx~9MLZ?kMgk`DFn=L#ZkyZZlKFHh z4YIAtp)qW1(x3}Ua^X@h-8mLO!B<6Pt25Nm*iJ>G3TcuY8&thH& zJQ-)Dh71C=ucbcGUP4s3`qgob;>OPHU?6mNj&ydppJ4{`tommhVnsM-5`kT#crLfl zZ{!9)X=rVFa|wcF=;zUJ``r*8-J7=iHE!r*>|ajbXmW45AxBAo5H>7KRGV}|y(#U? z^eO%5vM5~+Zg}|xT_B2t1Jzg04We1hg5uEYi~iRg4_?PtY31)0Fs~(We>FJFxt>FwR*>T|W|W}o>zZ!8NGPz4 z?v2@=G~n0`q5)>Uch(OQxRT0GXPb>@Axj#jG6R}jos++BEm*N@IfXtju4JZeHkuf3 z*IdSjMY%qo81bT9EWR-k+IAvBh&kHPQKbKZF>sQ5O4}Nt$#Q~T5Hu;J+V3e zbpfYeT9?d~Hy>O+%2QYkYqs!{G&&2VzE=&1UI(qC^q6aJZyjV2{4KQD3GeICMSmu+ zRO>fkr|t6bZD*B_vuI%3=s$Nw*jx8Y-Ji5CdEu5_A99)}b{`e{aA7|E-2VN)iwzBp za+c-~J~k)mdM<0oag}j>Fbb{U&9kD#i%O#>?9w}Ut{2?^RTJQSxF!VDxg$C$u6{2}uFdTT4dUSe%m7l4~79pK%8UF{WPMl`Yb95?mRA=LPR> z01LoV)CGEy+SVpN#)_qXE4h@E^nniZcveqt2Cf|S!l^P6&>QCd3xI!~GA$f!LyC;>v|eHyUOop1aTeGP+4q(T!v~vyOQ-*XOUKr2+K7C2 zo~?J`GOBm=lzXgq&m}Dz_1F2lc+opSnr&eA)HF;{evNoXV34^)RP7p&H+Ti|M$g`% zQ81$ae<1T4s0DRMt!S-4v#${Bx7UXMum!yH186Uhk*6&%IEJaRJ=~_ScGREgh|T@K z6DD*-_}F|j(Ucw*HJ*{Q8TESQT98~jL6Yv&FX5G(e5g9W6)w!TI1oB1k3SBAX4wi{ za<$*Z{w2F5AUNC`fUw0OS(iAIj>CzB0N_-kCy`TX$k*6t3Jj)cD+C~Fyy31Ka((eJ zl87+K|6OAX+KO!5!Fi6VyZQ}$PWm@Tv`uHjnCGu>rOr7=gqvmF^D-I8i|{93bz?DT zed=e!Ck|J>ECV76+fWE9f`)1XgW@;-rU^mRy0qBnFjhNv{%|d^!QGx`T1G&T`)H?< z5e0Z(Xp^lfo=K5ogYBQFKm&}9`~g*QTeEMd!O1Re$lM#B-a`7nM&uVH^x4JUeXpWq z>$|1dCd>uebtWr(nKB>yfzK9XI%2464vhWCA0>-+Gu0tciD|4~6Jl5H0aclX0=5$M zhsr}x4p5}_sI?3fn{pNqGfepT*`hkI5rdRzX8^?<)d~pJNM;w*ZXQ@H9qIccT2eSJ z4Wh{gxSR5`aAkCdoc91jv4|wof1gT7T*Eb_pnzpmVN64GmS*iv=$~FoR8bUbaQ^aY zrp)#q^10xGz5@(SoOaTpM1`E!=+qf0o?u2cQ~KTBOYSA85uMdxq*Hkfv-W$50TM*IX(FS3dHup+ zvK0#im75YQLd>m7*M5$S#B=RN%eg_W8?u{IG!Mt&i8Ya`--Q=Mf*8~QY5C)M%D`UK zI8X8ukD9M83#zwjGDlLrztIRIulP#@7X~%C1>&ii@j@pV_T7j>xJ|Md)j)slx4%kasGx@{5IVv1VI@ysd}F2oHQtVwc#`hyj*3c{F?aSPK4H+b_iwipF+J#Q8qG5DN$T zluvMf**X3Vx{CSFRy;NwbE;sDr>K)r-B!=f>l17Am*0LFNzG|k)>huvT;CJU|G8o? z9J+e>FnIs)c>IyNkjmDtaIUFZbZ4=b!?r3oFCMXY-|88aF^dsZX$LfGpPj}m#-;0( zvNX@-&LsBFRDbdodY}IMscYUnh-M<-XX)@6^hd#{)_^RKwv8;1{c#5P8FK#NA$z7q z_Ya?BE!nBSi_#uvLI{m(!)tE3^rY@Gr!3dz@Mv-oMT093ePa40h~bLRAn6BqIWZ%T z*>MXXSqYYwapo&%3!Wp09t(%+05<{x>UF->1KqKI%4__Bx*gqht94rgdqw4ZNA@nw z9@L)p>AfN^dSdxC;CSO!3bWMlbNIs4tv0z89(>O}dTjsjyKS=I2Hjtu&rZzt>P^Us z&gCs3Plx_F7UjkqIog2!xGs@1{^nX!AII7@a@fxl^2 zXh}_0f)J25E!m4D0*BG;?78S|?i(j%k7LZD+=u#!9_>Dwu!xe`Uk9|*%3P2Y$+wg2 zx!jjyLl;f9V?eq0=-upRAklt520^MD0~3{NP@KR5S?>W8-K7aVg`W&9Z|t#|-#Mc{ z@`yqDm@o>HklN=N^_f;#EJ`(P;~O~=+iT=QuvYrYll8CO9FL|&RT~h(0h#`?y>jAL z__Ueoz5&r4V`~&iR%@qO=p2>mAg!q96#4_5j+^ftMKo^lmg&x1(n6+ta3Y9{^Sz}E z*!8I3hQxc5hP4kjs~Cun0X>D8e;apo>;x8h(*LPz=vaV08#h znB3h{MXgYsJTh!nvQaUU`!gP6D6AhYc<0TRz@?~x-J9Yk&~Fd{Pk9#(DGZI#E%X|G#l4Dw!az0rvY5eP0G6M)@Yv_{W*Y z>kGM1|595T>g68Y3^q(HNbQLd$y)1Hr}i(uZ+jJxE0sPOvB#5MW7l|MpPn8aGwEaL z4TAL-01?+>FaaYFBO?xjuk zx)r&ER3AIBK{LM{xVCv48?sF2P`4qG)f^b#^mkjAiMiSEv21WZzD;&4!bj=x$V${2 zpSR`)A1-W1b!>h9(4d(0@YyY9u@Icnx%>Lq9{cug*9k0tQEKa>K=pfsk@Mt10jqbn zSUWzsjCDA7L=f!dEXq0Fr#>EY-*zrWmCmTT=qDFH)1LTnpzZs*{HBlF^6#e9MT71Q zC4^n^ri!Pgx7K;@GPdeL^_+dHvCTGx>UoOWB5shGq}}RC8pr@YCHn9ht5ZnIGe>(9 zx5&wk=ES;i3O9^m)w7W(5*DE-_NaY#tKh*@Zpp|>?g*Fi5m{>S=%bRJpy<9rV(Q;; zHR?uC`c|)?G#3^^+?zz%4pI9otL^6K&8v*?>o7+OUkp5`tSEB#~D|qtV1`9q3 zpAQtR1cW98DRva*1Fw_WXi7nLexJN;SzB!#1Vwy7w3tj#t7GVjgOFz09>MUGeS9k& zX}k3>rRg&D2vu|_(Se}_r!ZCPg^W+VuG+Q;Jz#nH)1PxQVO%gf%lH9_^Vt2@+xc9t zPQMWKf%(g>?yZq+$RYQ7iB%&zBz&9W8EoBC2D#Ea0&yYW*zP2{uYY*(Fy)qD*i%O{ zF^@L9_Q2EWTee!61wc($KuN;{n&t1}jVKfOab65hMNhb`qNlX?j!m8Ktk~i;U3Fo) zo>f6M{y==*AxV#^+UJ?$6q>wV?q5h>#$;)JEZfxmdczPsHi0&zDa!UUf}v~Pn{ju; z#UJm}w9+`Y8$dewCnzz>Mre|EZL%^aE<9pgi(%ge_f{u-mnh=A|JLl#iTn;NyBEi$ zR+k_7cVHR$H#~W}As{*`G+=(g92-gGJ9OxJ$1pS+i+6}YgvT%)J$0hQx+{XqcNNBn zi3~qMM`(D|GkGj$&wUQJ5AN>0x?+T{D?4psot0-JcuwVNZAOw3*do|Uc}Iin$gK5% zVyAiGeH}i>*Z7*D*s1fty9QiF3ZTaeZCGAK=*ez@;E0#YRzH`=x&UXpk2Or0hL$9K zvpuqMnudxw^OVz5XzUvV_iL7y0RsZY98hWAwfIhC&mJJyy(&6%Og_xFP7r zKp|PDIMzl4q={kep&jl*Bhg8Kxjn0VXybL}$O=lJzUQF++*eA*xKhNX+ZbwxhjnTz zJEKM9KC2Tc&#c_5fT@wivoUsqF@j=!!Dd`}zjNY~9O+)`RcFe@10|@^_BSAAJJ)G(9-`=55+n@IMDk87g zC(pqk$C8Jn(eA2DJI`P;y1ajGligxj&+L{1`E?qQRpUI**#aja!x#|SZgY4pd@jCX zLt3hgnZt|=sxj^Seo6-~zc^lcCZvpybn6umnX1Mg%lY~-n^xUAkB#JsYCkD^OlJf3 zDwWo7Ua>*!9?xUMaCTzS!nMy9_i9D##8AmR* zo0Csyhq|)&QB0l41*JLK#&)KfCd*of36L+k$>5BeME|K~_Zi7ELd1_4hqkWYU)lg8 zb{^fJ4o^?v)8zDicR!O88^|^G?SGNr+rKDSYxic=U~!V5(_~T9)-MefOb5N5Rc(r5pl<8} z`HA^s)n@xn{zZS=OrP1e1^RJ$+v0KGq~)>*oZE|r{$cRntzDf;<$<&K55Lqi)NMJC zUdA>M&Av=EBj(Q;hIAPbjwg%PcrXS@F_vAFuOBrpf=LM1c*lqdytGnT|x0w<4CK^>` zsrH|<%|o-$KJg4MO3p6ew@t?myAWq1MHomgiWbIZ`R<3?l`xT+MAY)@=F?fcG(*T+1tSbhlBvNfXWn8N5WMu zA3=q~v}Xh5qrA`F)=oyN&wlG2nhBsx$#t>Rd=k6fe`!b6u{38g4tnbn+fGfR0v8juj0N&R9)0$n9}lgiRA>zl)UQrpy^*>-)NS+ z2(iRd>BMNN#;V5e_S}DUnIR~3G{Q8RT<35q%!@f%_AKf>EA>7^&G=gA?$>L@PsATD z)SKu9M~zF|vD+NmCT>fUAtZpLY_x)x>EULaUS22Z;K{a?Y(24pdpfk#1Ma9sWFD}I zr-?=F!IzzL`lAKUuU&UIN#%>r3T{qh>Hgk-PCi*=Xj%#F7pX|BIQ3|>EGW-dnay8C zE8L&Mx1fH%%TPnBkVq0#VYW|u=Kl@n^$ku^+0x#+vgKhJ#Iz! zuo#!Ty|o%l*=nM!YWJtf<>a!N?W_A1bf&+HM9gBggF_$q5SnN1ryB`GP1RR8w7kw- zD5@ti@V+HRzCdqvsepU%ZEEf8_hK)FdY3E9_dl1H3lwf=9Qq0@e*p_wh{A#naH@Y6 zWBNwq)4n3^zvK(VAij5OqNjzpe2_f*!jQ1DAp*B%uWLh5AXH)wMQ!)!dNSc7Vu;d8 zbvnOPfkgobAeFOi5UgTK)VhP%+FwpbRUVS!y{US~^h$NhQ}CQT*F4b47jiUnf*IM* z1w^9-48>3nAlT*;npg;dJ?}9+UdFFi0pA1VS0BzhsH86RYg^BDoa`uEweejRpc^XP z6&IWkK4@6sXqkC1`z1@Vy!+d#3L|H60C_AjTR!qvgKPE14@C9B++jsa9Ydokx3aGs z|LHfgzXO~XINf%~>ZcfB3m4-uOXb`;@O<+-YndHN?(~Q}I};&&_Fn6r=};FM>Uy-A zQ0Pe*cK$N)&1P#JV=>{c#U5+I-WFZ(`>NgF?!wddXclXIc1zuPVzaEToow(ZeB%;R zO}W~h9cm>Zs%Xnh)3_BqmDdWuvvF-QrTyI~O{FA{oN~R3_WndlWx2)oyAD=w?*`nC zV5~UeCnVkW&>JdtZa*xa1SE$1?KVxX-1Ik4QbWA0LcNzV1suA2uW6jxfD64|uwKR2 zo%@da zz6)P!{KV$hiZ0~chF^SNZox729pgey9 z{oH zk3kQ&$1Q-GUv~Ww{N}fPMy~lEqX}lPRE+bF)}%4u&#r)^iF9=KsY+RgyiwAFKrp$; zKo1L6gn#kKmL&s+6&ojJ*OAP8Bbq+_4wq(K8*Qv>U zy@frX=Tc_fPm6O}Si0wj@=$AWxn&`J9P!L2fhT)<;-d zG$`q)wk`j2vTI}V%1Tz`qe<-zt20eMdNTGL8v_#~vAYi!?*EuZy?r3JGtu+psKI{P z5s!WHg}<$^3D>Q*>FV-zxmK>fy=jy$J$d=r+PrZVBXqC_l`Ca>bLtY&Vwc(WOH9a( zy52#5gG}Sn8M~jEY!KY`1hMfx4`Co05)qW6443PO=>2)u1%hmOiW9c!WFU&(!>p)} zn5Y4V8Y!$7IZ%yDUeDq=5^T;0fgxC3v+sRRONQJuhLS!mL4gedFyc(QNNp{69&`T& z8wKdUO)>iKogE+)rRmFpr%m*@-n!&fz6)(Q46jYERuFr{=R8)%eC)$x#+TVQeav2l z{OH_>G|GvJ(^6GVR?3RBjb1{=rZIP9u?9$;de}lL6wB`l$-G8nub}i@mOIP}i;@YC8DJ0{IJ!(dvMrsUGxhiG+Ve#nIEQ8M#3=Qjbdp`}A6(ArONTkXAv@kE~s$T_8uCVa0IW;rc{N;-CmwIpMB!X~{9*yJCrfjQDXN ztd9mvy%BiXql@4pd9@xOJWGCZ>i!(|JcjRj2z(kFQ2glfdk%OX7ZJpl2+)3A8q#m> z?nR-IdM1LJY}nq%>5j$r{jPLXk$e{67D+Br0&G5#VF*yLb<%SmAAfzA@G6%whipKU9^`D>#0 zvadXsi*;7L|F?~ES7P=MhY+knrzlT|f_ZaBJW3$nA|50kHw7R6&42T0>X>wI;k{^r zM$2|;;JjO=@x0*qE0f|}3m>12!Nh5Qx;o_DlAdveTNKj1)?e6dnooFA7L#uc)AGH% zRWqCL>Kc97)$)!I<+(1-iH=3SJ61mr!ndRy8Ute=$u_o$SWWKlP4QpXcxuTk1as(w z=D_T^XbJHlPab*VoY{M6cE3OcBVZs2Z^$}4bzx*`n<_`0Ty&F&*p}H@fBXlzJ#4!!*9+O% z(o7`7u$XuJ;M8WVgmrJegHb?s2frT<2%SECD@Kq1IC5~Spee)miOq4FmBKvJOU@?> zE106z`;6xmnkq3(L5I`9PD#1-x4u{xS6wzQ3~2uh!3K5<<=avBH&n<0G4&bB#_qi> z_4IS1uhExWYMm$CeE80~v76USu3ztJPm2AJgInWyydeFhEi$hXLOKgt;{f2c@}$Fy zq{ncIg8gnbPWz2!RD9+6Hk$_(O79ipUy53B`?k|oEVK12ypBRTlkG>EOL+RT#dMXU za7IL5{`uZ+wx&$@ve|)Da2SR3DmQA*)Nj;+9fG?EGE#Hq4~RWXc;ny_beJ{-^|do# za=9$9|J=sO)cxLGg!Gk#($?l&Zzm1oh$)%3B3!7&nLn+2OT0LV_aZNa>}JsE!>ZOw z7kgCy5Zw!YZ39sA?xdnH!u}$P);({W&8PnnZTb3DG-G$fBs&ovG4bJC(u(PTah73v zy^KB+Z0t1LtqjRpx=WCyzOtmrOW552DUvn_$|B>T8joHbM6(<4=nNps4`wsT3c3_M zsfMxQH};$B59*mP>KE~L0y_&khCP8=w*mz>J~k{v9HtyWa$w~cdI^fU_(~it4)mn6 zs8>*wg)yr@9t2M;x~VbXI*L!Bc75ZYuk&--Id-X}_uo~NJfRu$wxH*i9#LM- zTR6j^y`_TT?X80y&x`l3v=OR5BnAbAEiV>%Y}Jn<=kAEXmcb8WKR03eOil&?se|bU zD_xPHTadz`K=4rfKJDEumAnk25;?v;N7XA*wTG5<_%J=Kovz|jd?m@tiX&m{if%iCVsdlpXCl?8Ay#M-RW+lG&wSX-!4#a`isI)iY@KXt)ZV5 z@W3?o9E)G!g`WnfM7eg;sWA54-lkfensz%S-!mFsu_E0S+(H8jO7&N^X@H^ z1vDcdV)Ua08mb|NZA+Hqz-QOg8bB+#mbfu( zoJDP88{f8s=kJ}9f9d(!BEv3$HhV6>z5J=Lh~D@~*{ zTL^MgrTQck<>O@>Hp&91jxHE!$)A(Gd6i=L(Sa!Aa_*|{be6uId-owG?eJj?Vs!hJ zATl^i7bww@5bE7?Y8=Y4@N%~2j+A3uluD+aEl1UU*d64-g5kBOjN_Ovud2>R=XhTD z`$QCfIlw8S&`k}2uO7)E`^AV0{n(VKQ-0wW+8k!2WA$I<8o~Xf`X&O<4I(ylLdk0# zOIvdMUR_U+P_X(`guqXvQASzI%cO#SP}mVNnr~eibS{BoUN}li3I>kTcy!}XWf>eh zufnz4&UeC*e`L(ykkDW2y|>p_ywA%}YY~SfEqQH#a7rS!lAR z2C_d1vV0b?#9kZK6!Fk;>Ok6rbj{`j;VJUAGfu&9_Ev}c@UsGT=Pl1QS!pRk$+Jii zMX>Y${MH6cnV`o@t>6ZsJ}B5*Yac^lfRIWgV~CbeB=9)M914A|cNdU^t0kRO%qrc> z7P$3>D8O==0;NjOLr|*MHGxUfcTm0V3Lu@e=?*#|z?MFl2qEyj^N*gKDyu2wMrD?1 z)?NE{!JEM~ATusp#`xI+Qo1TrCpDLnRSl?)9}(1Magt0--8UJoU-mRJqH#gl_15hr zMkK`o)8;_* z^2i?NmUh$DUAT(Y77S|sDKKj;E4kn*?y9@qQb&{@-LEOud>`}oR^VZ$ZYgU~L!;T{ zJ>}#*cJJL8o-<8#Pn+tSk|P`UKc&K?bzVjm+CHi_o#WPqpRm|E0O}3zL0j&De%|bT zej?XnF*&}1(G`uhD*PLftX71;pO;XVuIs1)2wPR{cO~ZG;!T zH6!deQE&>lHGtX{7%dwXbI|lqpm$2IT7M3cu#o$RW)AhhnDxjvBR7&dSpspmj5Kg_ zkf9tqYNB6&4AMb?0#k%gJ6coh;IfEFt$eJHT6Aywp$Kwqp{TK*Xh2*TKv9BkZ%0Q@ z@q5H6>)C2`-?5^j4#(8|QLC-$4D8sx!RnKuv1|{&%lmx1qk=GR9QdtUXxF)9eSXH^c{jr!+nrH{9L2Q#Uky$I9kUD-Bt}xev3`Lg`vuUa1{S4(`Lhi#6G<>IXg9 z(lbm$dzZ}s&4;^lsZu*e_wosJH!#8KR2+@{LfXuI(?$#7=Fb}T*E2=5`w#+qh3!vm^OFQDO&%od3l2`z zZ9biJmy0JqT5dWNo_`;ZXYUn~joizPH)3EIG*;!&KSV!5)j3vgDLW09 z1n2i95(|q)8)0JD?PXWB{e4!oRl@Nx>UQ(s(-s3n=8U6g*8G8GNo1bQW%rAcyh)u; zZBxuEaXla0mCuzB?kk|~ml z+KG;=qqt_T>Ad}huIF*{vd->sy|m?a;6n3D_k=~*u|vuq;~%)NQ^|?oCXKsfSXVl-K>BWK7jY-GRjkacH{k07W zcpjz^KB91Y+r_M9$bN1pET>?xGgNE%!wwi(qkL+E31bY-{$vQm;SfU$59XiRuM(b8Z4xpv6G)?ZnH42{4!pea4;XjXl9=(Hlt{3o zVjp*HFqV{>yoSvh18D4rPLIYN0@0z=d#;_Zd->(PkdOk?}{A6&Lp zOh;o3z&r*RV046RnWD+22dhjNCK##?645?s;4yh1256hgU-fBYU!XhfU?gAF{0H{F zQM2lCF#YB9(U>JRb}-JNzsnblahrSxaftj0#Sn*M59+`G?z3u$ysEC>L6MgdbSWj{ z{fXNibhjICPB=tvxa^R+`D`hpQH6zZE*^}1>}F3ziPWCg?s~+0@?>KdOUj!jf=%|C-J{)^f$UIo9?K*-6te)a|h+@U94FC=2HFV zhr$ua%-Y?C5SoJD7(DX#%kFtNKYH2fW+*HCf_RLO_+{V;dYh>)a*kR`ZZkM8Z-6FSa|;p)81b_P6n4R`D(XvO*S?BwOf z`x=d!(`mKUY5iWAh35)Qka*Z&q3z>IMZ*U5#``m+F37pgD`T4*bhe=+!|a>A7!}@d zGSQ>!OMN=KKBzvY{qN(dRh`cEpqBC{^2D2}-;YeCzNy^Qhk|^}c#0 zhkKRdLJph>VK3{+(tTNksjxkXvD=Z3{7rv@u>q9Vl&2-q@8wpib}X&#tIq6)E@t^M z=$ts6{!!H>tX@-B+2;^m?t3U@QUQjajfw~7^D5?w8CC_I1Je#$`O3xkdFCTOgR#OS zTBNdIKbTyEBZYhNow-iI8`Ys#PT=IU;c`XIcS->uA0_$-*yD5>RN%o{?U*tVx#x;+ zGS19ezZ^ENCX%A!;Tr_Q)HpInJMj5}IWk+NH)&~+f?1^b?60jcq<$EQ^|?R|Eg1PH z6>J6#Jop<#hP$D+DqZ`YXs=yEPBZI1Fm{jgi}XOX%Zs}?IZg=TOhCI>m`l+-(*8Z( zsD5+2=-gKJdbx{XEVFDq=7DA2s8}57)a$O@*CJVQK@?(7`om!wjJmJ`NSzKp6cF`e ztq>smp7e38f6<__ANB>i*6);c05>JC=_MHY|DU z1VNmkThvm~{*-KCpxB{hg2U}zf5t8cynVvG7vn#$+Y0xdXSM`PUrzQ+eJ8IGtdE6Y zM!EwX`Xy?-xk`ne*~y6K93N1lHr(%HrUbW=heM_<&0n zO^?^K*~+f0KKQE0iq|}=<}~_q{Xzp`t2S#m;j}FEeOS^_o}b_hlx9~Qs)oF5&oR8z zlOQm6Ogp-a;kvAt8bagebItQ-64H0e0M=|$5Uc!nmfIrf;Y9xj>jVWrP{#EMN`JER8Ma;S)^?G8f1*V$j|kGe8$hMd03W%9T~s27@AIv6vA=p+IHN3x ze^Z>(UpJ4xRe!X2)|? zXMseCRova{G;4IhFUCy~JpHFe?1}zj%(c$-gE*gtAEOi*fupfga@t(D7Z9~flDNgT zxops0qQY2PuW_H2BLulyAg6Uk^Z6Fr;`YTnW) z(fGLyY5nIqny}2}ICZOJ*XJh~VfBGC)9Uy@!X-|Y4{zLG$w6JrB^nt33vBrVRwRbU zb$c5O=LFcQ*mId0T(OY8Gy0LCWzOqf+U&W$ExI>+#3w)AEW_Lnm8IPOJkdt@^+2}o zFvWwEdjI=%_|C_(t%ui;!3c9@B!hE#aUvD<&AeQ8rm&{|hqwhrb%XwO6ouqV%9j%x z{9f#P1ew*KX?xs3Y!GWN+w&P)$19CG*nt0uzFg1Jc8Ss&L9zjxmskB2|;e&5&YInMJu&p`!gZL9m1Z;U*DW2066 zfV9*8j9mGgS&ZCnvf;#m+6ZFi{g6^=W`$XQHUIFG*J8p7lv@_16B9X}WU2Td*p6wu zZ~vuisrGe0@%MzavV2M4H{*5esiIVQk270nxSxoDeHD3IYQ3zHhb%^p57qFj<#hJeU=)AZf*U$eKw; z@ObJ%!kXV2&kg1tK-Ux`0!4v< z-rmRBYwsc8VM9Sc!eIPw&h6UqZU>th%r+yF)q$c_y`QBU@uZc9Zn0BBUhk0pQvbsM z%wv#*YldQ;U!Ad4qqN(&7vCt$#gi2mDC(TP`L#n4wG*z*Gy__u0}*kfX68&RtGAm@ zp=b)Y^N%h731j>E=-Wt8;|O{*P}ZR9$Qx>`_u^2;FPi{BF-#ck5WySw(@%^VC6*O+Q3?Lh;!S2Z)mzxZ{|em ze0A{_^HGGLb9B>!jkzIB@Y0L&Q(O@KNcBi4>G5K`6#QDnQd#YXUcV3zJ>KBMX>vbl zt3z&O{v-PncF)RN%Xf0je>;K0VyX&FT5x9ey5eOY+Oqn^cJYujrZ1HeT->I16ko=e z*{GLn6YK3ov?LD>zkw0Mlb)SBj~`7uR(gcZF_obLOdKADz$lZ;c|W^(VrW~Xrf!2O zYQ*j|;GGaeIrr6ZZ=&$kd&@p6UihA)o2bZisf-*uE6xvS)-dyKv|^8sZT(1N zg1fV~tj&}>vVlm)}3IhjD|`FC~i6g@UM#jyfcV!#D@IqsGB zh`xf!go{}I$kJR!|FM0njHJ^&L#Ocj@6w2OaTdMn7mBLfH*-RwqTm(zJ+(>C*d%0? z`Z>ZDlqP~z%#}nJT7KVu{67t^nnpy zepS%#{I7tKh!u$J{Zo*WynfW-o5_Ul-?+t+14gnQzuaRwa7;x@dW`WsNzsXj$F7JY z9;==WIWz0RGh-jplFFh0K72A04So%JpeDyIzMG7{0Y&tv%Nbn;f8!c^epMU-nX7u4 zC*i+}t>w)mzLI}zAJl5JRego{Pok@|I_!4>?O;_7oB}QvIH?zGZsxqFL>i*W!!4#d zEiSD;amy!BOkHmalqzZzG9#WbDHd=}y=EA2o3b?1B3y(KnV3nuBJ=O9+k!ry31Y9E zza${d3E!!My^%1AUoHSmBVsTtk3$Qh7Zv_vTjR>NTRAUqcA@wqhw<5IS|#=DAT4A} zXh7Tx+&D2q2gmP}KHLvlo(|9Y8rWk~Zb{Jzau|55c>m!=aF5T2ZRGXh#4102v`0x< z)nSVhZ;p;^k=RmdE&8Weh5nz;`Q1tKDTK0T3_+_9``(d5kKSkw8S`hyPXxFBe`key z7Ua^MQ@D#1-i+U-0!)Kxfj_EZH!VRKJsViyjr|*+Vzim z6Ko(j=h97k=NByXcB2u4I{cq(X2{md z*KkL6bQsjrBn7t6gfrF0f6s>#o_{LE*DYOlu8x`U^y;cd;iOtC>@6I(58jn%*DXGD z{8!}i3eCTt=35>)4TY$hl&tn(MB} zJ=>`Ny03xz1CJX<_5Fv3V*f?7@vDx*uu?bk=11gIP(c~5WpSo1Q4trfn+Er-sP3BG zVK_HHBW-jeUEmtBKf~dnWI&?N_h+tKjcCx@OlZmHl4@T{A0sJ#DMxX(z8^Bxrv;W= z4~jF)prqn;LlWwhAN;?5i{~j7T6Hl>X`t?SO2j-BxIuaJ4P2n_aK;kPU`$m1bWpm( z0VZ%DB2Y5_nF&VH_bUMnLCk3es>2e+Y@mdZ1Z{eZL&-x1Xu! zo_)oI@Yib$e06c+3m+{fVDB^9k3}2;OSP_3KU=oS+d4GtNu`QE#@s(ATHVcHJ$^i~ zE8@o0{Yz`Xn0xd>f7ptDqrPi(U6cnnW#EBQgp!lhBlO=RTc#H*W{q|7Ueb{xUx@zp z7XK3rKsF{5J)8=%7A~?aU8wRMtZp%Z4o`@Y(Y(=rrbJJr)|D0049_Ugsk+dyONUf+ z-~#SHRZ^d;``z!#zwB-;B~F;Tj<0qBVAk!|5Ul-`?YkRGn|~p_>M$}ykrBJ0&{a+a zR<|GsKubDS`i}_iU(o?HV|&(RL9PtSg?xaxw06H*z%n5{pj*^-Tl`SS@+EjKgO((} zQ3F01m21z_!KH=_B&g$BIm)K>Pj0!A1#2y-32JLfc@Zxw(5>|D+Ny~9nw)*COynqx zWViRW`R1dWo;s*uM5?GH4}#T$CMqh!WF>s&bXaGizjyiZveG-J>lK&lBBl{s3$9Ojx9W@lH5w%2kTGwiqG!SHCw2YEB1#f3r3NkxXaC* zRrAVY--SH5m7;#?sFL9Vg1zxGPJ?^0MA=SWH=-$R({iM}yPK?mskou;L)!Z3X@6eEkPEQ>lo)2hnpP6v;a|n3x zaRM{ZTsC9N>+oFrL*eU)tJ2A~v~RE74yUGt@gQYfO4yi0B)Lh{-&|U0uZF4NyC)?; zV?ZIp1nzbPNym*x&+ptS?!M`yr5)_k6;MnA1lKti!w?GZU6@a*5|}BEFEg?)xdVmD zCl-rQZk?gj7>%YpMG|L1uOy`DN;S+X`{m7oc}BJeudZA~eCsG+pHlZ*NJ$RQynu9$ ze*MX)?Z-84T&(;=2 z^;?)P@7!RTvl5}zLcL#W$QyG&&t+a@+v9xeLFFwQ47KNplVIZ(QJJCvagMI98p>`D zeEnp`Q&s}`wD+9*ZO-`I_;M>cOPW8=tq&C79X2gRh}^j z{F;f+c|lIw>g>R6ktJr>2t#9CJHLu_hMXq~SE`g9IywVcZn@hBGs5doz4JL&w0^OR zWB7gczUkGu;b{Y&-x#u_yszYvDoLQf_bxGKGr_l|t9Pimu9j)|?K?og`%eG+fL#4O z5!#{ZN6jJ_uM)PI`9Dgh^dgKA1-F*T8yKyuye zpq+`tFS7eg>s+lrw+Y;@&P|8up+Lnr;-BR>9bmYRL>dW_`VQXlfzxWGG$_C~km`>Y zrJ;naOgx8ah7lRW`|d!eo@YmjHB%eGJWQ_OhJ=p1wB$p%xIF63Ir!BO-nPa(2 zX>;0I`zTZAi)Y-)S(DkTTwUF^Y&$LX4Xu6jS=?t!3AASrI#!DHd`|;>C4fe;nsrxc zDDFC;Onm(x|M-IC)bE_rV^tMfMmG0|IIk6kR^J6`&4M4a z-ofq)zF6k!?@e8<3uJW&uA-rcV(O!Ke$@#!?L5>YD|o2*`*;JhMO;doJxX+|Q7gQb zUEM0&S#d65xP{GQNK>H5`Vb{^Wr^V8pOBEk^lx{zg+;d*-fTEKB z?s&jZ&M5KSlyq#)C~-%LiV&LmycsO5w@8cF>04Lx9O(dwzuVAH-1P-~U#v4_0zI(G zhpaHoAQHi5H}S{0(AvAo_!nw~=g8y;@XmdJ5grR*r`^Lf|yg*^&`Ec#HEG*N~qnb?&-4IHFw zt&E<@HSWzlJm^VtHjv}wPehf}KJO#no0AR6Sgo6VsqZXyPbb2OUFB#|Z1S^K_za`j zY_s$4Q^T9b0rbG&cB2JExx({j#}1)CyWLAe;{og_Km184)~uV~f|b;9iH3@BW@{poK8?eAWTjWo_q%e_6MMSJ z>_S#QmKxc?;FbhX&x|IHd1qr^C?Z8K8*b=q^xK=S)+7Z|H49}{dgCfD=ZlswrDhr{ z@WA7+*7V5aV?F{6>2no-8M|UfJQZ-Uvv25&1HW0#yycI6RH6O!v<#40xpvKMYj(JH zogbRNIgB&+Ly2F>9sCb_A;@-i#a{xxzAIahyIzOjA zeR$7MA^;SxiNw4TvTP&}kEz#W>-9m)eq=@fJu!g58fS~DJkPP-cl?vT(EQBXB zkgPPcL?8%>2fR;ib=|yH7!ULKPDFW=N=B*;jhpNyYt(Z$pUr*xZp;tJ);Y@?B5}jx zpYJ64OXkh&1^P*87g=#2sL+ozE0=|*X`oHQ2vWP!s39Gtuth`Dw*2b*RhL)u5OfDE zxn|8JSU=fa*}zi=o_l>rNS8=7fBb4U)BD9s;Oh&_%cUaKLeJ#JzZ;m_7;jF?rjW3^ zhm1PDdBW98ahNt5PD_MHx0WX5ouqu2&DXvCGnPpiFZ-ie>zvPk z_0X){>iJ0AjeBL`u~@_#I4#g8lbqxuFmeC0Q^ka*sayl`XV8nT7vNhlW#xxjohg4> z{Z7xheJG3<{^a09w}@i~e$C(|FAsBx-7R>c+gbma*`NP`gJXe|?I=J%4-MBQ?$&to zuN#a4?j2otvS|0#;@TOsz*(+sNn*wU8}(Tn%vD+$z&-QmBc0r4eFsZj(W8?WZu9^R z3>Cr+y1^6Z0c-6iSCO0X=YZl$J}DtfY-bHc@phBr*SwkU(32CRWD})L-qpzFxhDq5 zw9zo4+dx>SJTaL^nhK%aJxE6lv$)>u9)ld z%S*JK?H}14JB_qT&qZxp6njRVIKTT=Z`Ab&74OdKIus$d^M+YK1e{TqmB&wIR8RV7 zwo5BtX5qB-`g!}pR86Dw=W`)a_%`K0c)|RSWaQ|fj9?1mSrUSZ>bn}lSHyUlfLjJnu#SI3km%+FGS9%%*RjIoR=ori5{^RX6B#A zJf+nyua*0%OxGS1-d4X|EzWLLCsF0mmwi(2<(L%GL@OAArn>93*7xvkJSoijWfqWO zk%y9M**a5tawLJ#U?jCu1&(7kn6o#Tk>tQ6?6e40rSuA382^F_{Uql9{l4KW0|n|q zie5S{nn)d_gv#sa!>nZVu+9^mEmBF^IS%eByJxaWXv(JTzT$qHpu}e6nq0-9+o%c8I(U3k)Sa>fnM4_2-4`vV~8H?hTI5VZ2vRzxrqjo=4@G%4i}^p;AL6w;_ZIWNX=>Y|z@g}ux@`U&QKeTl)XdLw_XC=i+*c7+?ftPz#I>gytwrQhd ze_N?}e`T*9~uy!T&dPzx^X91Gu*gvJ7bZzX!Kym(T; zPnM<{`aNSI^(%#A;lia}+$g83jp99I@}$dkMS_#rnhSV7cR*7Qb7ZoVycso$`}54T zH@wVEt(+to9deLF2g<*Rb~c^uS-bBu@?z)-vhsI*s$c#-%ZW0D$=m^U6ifp;UcNPE z09+Z_6Bz)aTK*I*a7Sujp;7XHX$*;!fa80R6d(iWSXH-~nR^?bm#^lMfSn$}!mXpW z;q+VdvpB(_3q?}O$uXyR6X{JbSs2mJ`-r5xR)nDiXzq8`U7R z|D{C3I|CMbZEcHRT0(YcdS|xxy~yvZ184D{B!Ec?P2?s$QsVx8&}1X(?HIWx?zW($ zQ6L;faw>eQ38T=ubCCHr3wN?-oCj>fuOHsy>mLhBW=3U|r`i4z9%_+p2^zM`Erm=y z>#Gf!n_>huO8sc^oe^ecdUR;ka<@qN@8uIvoH+;o3O&$4OF_n3qRnU8gWYWdTmPgmgxGi=g7ouLU}m#h zgAUCmbpK@A((sV~@yyRD@?#i6|CKH?a5E~3gP&9{Qwu|pF~E+1eTt#IrEbDuYphLJ z06FMq0!p&Qc8dHb$|CtBQw90^O1>)<`m9a+xl+F{K2`PQ^<4QYcxQ0TBF9HAuAQP^ z34WqLg_Z?x<+MT&(ERVQBWX}AWY+z|E3!olz`=3*jLoZ%nGb27lcsNPyB9FvuxJ(y zKdP0#8n(jIOKl%A!~V$de%+Mc?)L)16E6<6(<`hYyBJYmoRV#O?-Xx4j{_VpZ>5c@ zMmKl0umpHI2a&IyW%uU3{@jvwk#rd1Cig9GMt2|ZWx#aDAC$VY`&2yx$t5x_vP z0(2ukS+q+{5u`&wbv|TmSKV--Fqomg=H=4^1JJ2@wM8*%6g9=;r-lx4(*WcX3Eat1 zeJT9%sr7#cpNAVe$14PN9nV*a{qme2tsLpyzpe6!q9!GX``9C!;QJ`I4^CbS^x?1H zd_y}?e0ENIW`>@#C3y5z^7QxrJ@$irg)CFsKC#P!9^6$7lp*tERoVb1%C|3e4%q8s zqr5CLvD5x7tWc|)cpbl2-)R@p-O}Wgj9?_IAb_|S%LhRSGV?gT_g4D#M@jX^bGdW) z_)`OcG6{9CDe|z(0K~?ZKBW4#35*HND=798-~7?gr0aK21nn}_DYE>4cf;Ti73%b* z9s{Xeh`g7&#Ja54xK?9=D6cI0xsfihzwc=N zl*X$%kEBfF_*WDletg$5OA!3>6HdjoYd(qL!7(|HaLi+R4PEV%6{gXbCqg<4*EVCv zF3$ekeAcxc`f^ld^1OMa%_qWu#ot9Wn_T8f@dL`H!-{%>cQ3_=ZkunZ@5dD!pt%e^s4^iIK@pfhc9zV?u z0J#f|hRp@t zb*Ua$Ug+pntMn7cr)ppbAS`jek==?GpT%o=<4p{?g9;^HZAkF|Gn1;xPiI+#f02GH zw#{}5g(f*v@ZCn0PyZ+v7&!;T7cM}Ri*aOE=Uh4{ zdUZhDx?O{fWJ*W5Y+%GmVj8^%?biywc21P?g5^P~k*XLn;?RZ)PJv~H@UXGK7B z97VM_wC~&w0<@qgwt)iXOMM)q7s}DG<7N5~tNWtpY(~^}U)P~_1Qre^8ux|eScm_eoj z`KVDZXbHu32~S}_DQ)yJ6G@rZnhDgmo+;-c75L}&Ku|s2FWASt_>{;v@>N%-0o^`n z51(R0Jh)q4W3}lbo1bs5pRAZhai<4imk`(fzgThL_`BvKHhYg6+ z1Ks(S_I8B+JY#yWi{~N_KE~!u7^2FP1k`V`*Em8IsSpq4AZW|Wo0MJM!q-g#a*|EY z=ypGN4h`*AK6vz}$B|~QQIXRy)SvZf#NKt%~ttks) zrCk_bMc^NBa);CxRdTYDhG-7YQ=y}U5b9u7dSbOo4?Lm=Mk=gW9GQS+-`fPD9tT3) zLFK2murm&;U^6q+R*+iNSCSTO(?COOBoWSFZj=d1eA5_S~_iWeHCHi>ex7U8K!B?S8b}$ro+pYiYlvk(}j1&o(?tl#`fsfLM@q*#9I$RJ%DKy zfLPNT2C!TF_f0r$>ih)bR|G-A25yoQp4&g$!Oua5@Wu~Hh5nBjHEvgtK?ae!G8oQA zdpb*wryj^ELYGf$!~F&`Dr|I!s)t9Rt-ONDFdL#}RaD}6D*&u((;6Yu8-(c$rVNMBvxY zy9S+c<>G~Fs%26Zw?6Vw@UPh?<`aRdM(|Bu>RURG6<%fL2J1-98P_M{LR7ObKxO zdq2X@@EP~A!bhf5u?tW48v@!hjC7_3;P%Xs{T=pniqeutU?bD`EC|uM1p7HBF zD2}UtU$H@XztJk(W?(ybEYJ3Uh}aKanX@*^l4@a2B%dFWP_mR_%+^u!`TS>ZJnJ{O zKeEi)KUHrf&Df_Zn5p4e<&xg}H(Nt-U_WP^s~LtP=lCK;=T_*5%5BmrU0B2O(54NG zb%=5z5k-xP#9CvSs3nlKm#7fT99l^8p;yz)>a4%mNSB<7qa%9@xku9brnw(4c%Shv zG;bh|JXxX2KGBMp&Ee4LKAmO;2SFw3(9<>UJoYBn%Rvl{1p`@oTz-G7!5;0(H>b{n zvIE+8jR!Dj)2;5kvpCRWKpjHpEjW4WpG&4D;Q}{G|A&?vQ31prCm3M}HvvURdi=*1 z`0c#HI*35bNlk>wrAE`Cd{Q5Z+*D{1@9-ToeFg$4p`L-= zsQsMkiww{vTx1~*^=WRZAV+%x(=2res4Gc}P*Q{I58IrmH$sJE2I7wNBKuhg8|mY& zVl3*z(9k_;ecZ|9VtaJ)^uaj;8}#`KxfbaHt0!ogpkjrVUeggtT3SxaY{5J30*8^8 z#_m)A^o}S0*+bD*j}?S19D{W1l}69p!FG4>qrnAGFYx0F;ki7$-nRjT zqBN+P-klU|vu(*;Vap%B^R-!WlMI5E3g;eb1T|dAUyKr|(`#&hUsk-%zbFaC&DHag zoYc_c*osveK3)=x6-)*=jzhB{?9NrJz;U1U|C&xtI+9fi2oQL~`G3Xc)XJx|>VnCe zPyGp&*6le0#NzKU7>8G#soXNx;A_R5sd`=d} zD^4YIdO!&-&w}0fS|^Vs@*BTZEn)(`M8{-mXs}Zu!ggqcees?#PI<}56^koS+*0Ew zX#Ul1nqD}?iSCq+3cUes8Xbt-_*>u<`eTY7xWj6-Yz&6$WH{;^mRMGT&2chUq#__R z`(+A+@jXxqtH$al*e^l&gS>0`e$I?+iQ{2OI#~G-!MIURtx6`-s&&=kkep?FR=ZZu z*IQs#U%Oj5Hmz}vpz5=@IoDdB=(T%9gZ-6oX=(5q2iQBa6(lqtE#E8`@cfbJwGB?b zVT51Y*bT`nLy?>=D9SI;T0aM4xb+ub#6gN=-v7kGLr21eYm$>)?t_{l1HuqQOAaH8 z$RU}9@2?Kkyj%w@%D-9KZT5TR8!EI-8^o%SAIx-U71pLetOwW&Vsp6hl>+U|sOoU7 zvcpYHovX<-2E6iLQ3`nHsi4jM6V{JAV71<4NMQOsL3PI_+0Q*9etVqNCiUo8?rcha zbYXecq-!(EdjAQF(#cWiH^DP-j5$;Hk_}#GOHnvs{oopoYTgvBf=zjXTKQ$in_p67;1{+U+%V|pFRBf{&}(4MEFX*bDEjeRuX8>B zfAljRe><5s?^c{X_2w@h{Ga1jcF$+LCS&-I)$r`_+ND0H=1T6d4IZ2 zg(gNNfPEc);j*bFg%!6D1HOGLCZL8nq%1X;T}-&`1X}t%oII-p!~! zC)YniZVHxuf#wVQ_8v2ae!}_VqhXZSipSYA-iv=0Ht0FV6Nv?uJPK5lsEe8`ymPNP z@^ua!3Se58qSGfa)5?xhZ{ z^`aZ?;;u}#^0Jnh%YLa4i^(V*xKhYC;6_2*@p{wJqJmze1A!^Jxo&gLz9`=~K!t1C zhssf(+W!x->wWqwxKWE=*4e4e_meiE*&xbX9*z#US=GNo3xowuL$NtmkCkrXYh{)q zu!auSQRsU;*Vy3g#WgzdUN?5bKf*9%;$Yt*(YYcUZ>o13%%~fp$<74qOjM6~vSB$XZaM9E2>DKAGod2p2IFy5@{NKg4#w+n+aV2Sz4s4>su!N71;w{I^l%}& zy_;klt|0vJ3-_@iHm8a2*%qo&M+B#(Ts0;U93?gP(Jnq1Y`ia`1sR7G;E zV0hRReLGV*zYBYK2kCh%@WE4bd&8G}EOIi=cc*l$H9MfFDuMC^x-KSl@>A}V>GXhX zenXa+K0p@Ni9TW)er$Q3eNKqE6?61);s!od4Fp}ss0gEeI2Cy_8ob0(%|l}(d2CVb zSB7I};a#N7Wk$%70+7dBsmFI{EI~s#ZL_{Sjk)#4W0_W<0>+p6@f6&Fm8585N@^t=#e$65I&-@E^5>RU|Tz?_&-$7A;fH~lB zeQQOIa}uT{3FA-u=2yVW2KPLDIUn?z@n1QL;`Vr>g5URN#OuWR{=9`xRmj<4=?x2N z{}Tcms)g-)NfMPOuWIli?cl9j83X44=dbT?eW)OdfjJ>jbmW#&&8^0gxln$jB`_jDvS32SYP>|)lV zMu~}uS<)?iXm3ox5`BJ+nfS^C{==zTgUDsDNrrbL$1 z6c_&HwB&;8tkWC|)u$Qh%nO2}n}W?&TCqNCHidVYo8--^9{g6-q*`p7BJcJVSpK$? zSgj&G_+GEshEhfDC;7e#`fZ*WUGno5``}O4*WF&NF3u42u_1V7{bD?D`>ks?n1roA zdFkHZ;9x%de*cwsj@`hcTJIWu&8oq!Tb;6MG&O?9lK%)+%{leYQoY<K z)e%LUN5EaL5VlqSnuJa*i;U*Z3@}t0BL%|-Yt^0cbR);P zO@=#mN7~Ej_l3nii8R(g+G^8GKM*?FO2!*B;P>V^rNSt%K8q&-lcy5?EYL~kX7 z50*a%4JqXfAZ}9tB_wpy_YZaJZqjP%81#b^`hU<42gkpkR0K<Gjh;X+-rP^lkG-okkzS-KTLCZ3+K zr4Y*pHDtegw!WP3(b2gCueQ5_B(~q5S%0vRB)^GZl!|3kvYPiRvxZ$b5mU@umG{kT z?F^J0{pIDC`hIGv$y*h+J`h z1p^UrC8O1QKG3FV|6jIGG&ClH9Qlwe>Xh42-2%cvd-Z)O4vRT2U`KqnOq?{sZ`lm8 zmm6qHzH zHIZFOdqBE8aD0i$RQF5%eV#e{%jiitp2s81vr8>2ARw)GS0NjW`}xB83;+5w@Q(lc z!N-#+rzBSs5J*;l`ug(-i{dTH3fN@(NH_ z$UCF1^0nUo#FSw3)u-H^nU?A1rQ>%iAog(sFPia_qf10-)3?M>pYLks!_%NA*DhJ^ zww5gF){`YCKTTmAp#=IBlM}OR_y$(xBHoEFL$Nk2ePO3+CkpqaSw=Ae=Sg~s$KjPH z5&l_2%&04JMMfpRuWY@hjrsB{y+q(tuwL#H*uSb7Gfj9d1ke4p?!9pL`}VQ2TGQ07 zkK0dZ;;$1r8IfDpn_n_ptUqjJ;oGQ=E2pry#gH6-R!WCTpm1DPQhPT$T;|FBhEA4eFD*uV zjNgrF?W+6acCe{U_QRV>ami7B4~qwAWmI+iK#AUnpGeUf<jjLoGJ0+X`CU$|QV1&$0f1o&Qq z*|3-a^VZl-*6|@1V zq7NzPH2R7wt(yH8*5v*&rZ<>U3i)#>aIrcR3nR;Z8(HIYAuE7Phu3+k5R zc?)&e(bgFBk^BMw`K6sGH`>h6Uivf@7%4S4f0hO?={{r`JQY-VvfX8&^u2q(!~e3p zs@30NU8a(W9ztS(KS3}`Lcy5ffj&rq9+Ma~n0&~*ERYs`cyTxixX``EZrgH~p}$GL zk2a#)5X$>fNB*zG6H$bO=<89cTX(Y=+B}?pLMVS&`RU@9-AFEKxB0`)K?R`#w^$%a zBi`KPLpopak#(x=l4^4!iO5^1Sr^kEqg$K&dxFw&kYxS3Q{U~sTVsh|t1|!ie&pYs zDK>3V{lH9G+N{!nq9oktBX$Zm=Dgl~;s-)%cGMWpdY*)vP4NKqrlXre<~O`b*T;zoq&tJvk^LKeYp4}}J|{cro^G<&fz32zieUgGn-;QzmKW%n zsTD2Yt8W_}^A#;**Ee-!SKN-ZvAoiLyp!oy_uKI2!U;Q;yF5zAza)TGlPX@E|GED3 z>mE!3?nihuyE|7}$`tw6VX@6wee5!Y-nvVy^y{85_-DPrk1-%epPF)g8yuGX2URX% zpW>JS)x9vc$XLTK{XcJf{u8^?4|{WT4@vfh$3jmgi$%wVN7^jFDLj1No{n&7=`}y- z$m@vow6J@5=1T>%y%MXYek+dGSyAto!k1}MzEKgrh=JvlfNb}BU#PN$u8z{ErPb5O zmlXfmxR~J)4Fk4VwjbUxq7|y+Coed}7nJU4IxDR54c~hDrzi6#kJA30`_}1*EA6s4 zTOW>p^`5!8q%3~nf`82QL$9dp|1j4GsyYOsX|EDEVAJ{h@>8Hkk4hS7jMUIy1w$#k z<-p%++o8uc-xkHf+4~XQikUTFyjM4WYN~p zDYsS^lP@;^2B&PK&#a`+AXoDhT|^NSa68=812jc5Ru}*BoNT&H1!njcdMfToY!SOE zzray!{T3V{HR@dr;B05XZ_pm53AS-`Ww2$_OWdR?Kqc9Y2`pGv|0;lG7gpdmxP)*p zKj-!TkHpzOg(VJ|#<+(1p9uXXSpwQd5I~GQ>bmj=mGPkI+Xxab$XxzGlb@9VC{Rjcb1$(KUs&@Pm}lvMx>Ndt zTCoi;66)EI<`|y}!Q+0o-;w{(xZaw=M_g%Ezk8n<3!}jq>-1@0E!*1s4+S!wD2cOI zgx67b)b^%Jqz|yvep}t9E$8`2!qkr}>>7Y0dzT6-5^g`02{6HlV33u^npGvOI}|9! zgc`|`khfurw6WDrjK>l!vl!XLp_7g%eE)exU1>gi+L1Gp!Hl64@wgY7-^gpljDK;@ zK>QiqQ9cAou7kU!yELd8mk}69LmQgrG=Ssm`N~EZdKCwp|3V6qwc-26M+JeIF%7VI z`@QtATwPin*>8FU%XvJ*az?9I7PlAjZuhw5($xI|D}cA?Y5Vw3fk&00?$b}ds5gM| zy>qEh_yl-Qo&{kA+M=1;gdun6O5N-Qc)ONO4tl}-)3Z10yyZM=?^B5Tb8+KA6-D)Z zH$lABuSFWFOy4=7QZ%^XD}FIOfEO?Eh8oD9Tc#m#%F{;sG+b+5r}e#oC9bZF9`|`R zwmQ80z)#}+44H}rf~Y8$H94c-(L#^Z^AwfuA)RYS-oOaEH*#fASGMCejh$gfV9M48 z0p(WQzmK^j1A6A6lx8yb$`_AP1G|$v;hD$}s_xNia?PK@t|$Ao(WHU;NDy!y zX?LvE*_`Dr_yLO}2SHHwbU_e`eDj5I_cy2<-^#n=-qWBbkBxkJayUS?&_aJt_Rh;q92pg%$OED5?_EtVD&FNjBmo)$@bnb#Dv})QSl&!T3ps z8K{Y}iNqRa%kN_i3x1Fx+wN546KU^AC|a+Z)nq}fNMfU!iN&gQ$00(r`f_o*=0`C~ zrjA~cm-joJ{rW#@`F6;uGepLK`1Gw0()pJ26|*;pf=`DE-8*Jn)D7~OZ$37G3zh81 zJ>mA8ys0=a1Zb04Ki(9?_IRz;z{q1w256zN~I)>1apyr;}{HpFr8+P_fF3I{yxWvEY@cOBwb z2n*Lyl*;J{dA031^Q9vA6nD%hU74Yw8N`8RBM_&OKVI8WDyNC?kCatmtC38xRaD-r z%PsHJ9Fx83=~co(zoO4PqHH|XGx|FGFkjYdBbF@Ldq*Hs(Lm;EW>(crQ(DyLD8dR?9 zh88tSLUS`af%1noUZ|)HN-q8dKm-DZ` z$2R+vs~i1nzH-6?RURaflpts>n-wsE@Wk%s>bTbmRJj)w}@i_OqgZ9G=1jsi3@g^AGVn^OPwiBuggvMJldSPv&qNUvC89{u||jPY7cpTl30vS~Ek&b}D7v%AnF zy&M@(7(ZdkVkD{SJOIDvOsNJJMzzXKux0}>>PG8-UUosOkS8w5%x%izk0Jp?o zieKl}K(%(wQM=A*n0CXKUBMeui_TV)6UQj)&eNIavXb5JQ==kk9$gDD{o(6+ZWN@8 znm#Jnbf`=(x!bk#fS($u$o?-ILKri+9vJhd-Uk;(KBPj8zsiA-3i1dbrN*@@7+#!a zn#!G1))`_@@`9sZsn&-i!pP>7sy7DnR1Tr*<(1AECh<*d8NamxLSh6seyylp2xY8n zXEGB)6CqO=-hT%Wi~|Kigi<+gYRVs|RRqP5noaeb`*$4K;96_) zn>FiUeh%8vCxMCihlCprTq}i=j;Q=-48*A4e6CifnZ-en8H_$#=a;GBjCSwpO0%vSRB z1_~X5$5947K({89Q*ef^%CP~LzaRx?;w?WAmf44clRZs+DWAMrX4oiBdRnXDQ!i-b(9ucuzytN2 z<;Sx#wfDk7XwTud%zWXvAG;mDj=$|44q_cD8HTh0%kW2jSUHn5WOH$>N@|34|3{H~ zkl1v-{fNXSJ8-v5mh1+W|02|Z)hhcgGhm{#jkvZJ6eXax*V!?tMNKGj4yXU5E*_ja zzDjOmkgc?OXcP5U8E3CK>hj=z&Wgo}ko2Gu>ho14e^94@vH`D0f^1YyvpjwKDNAxQKzDxCy(FzO5; z(s~2n{CD`NB4jV`8ZzSwDP=S;U&{3G=Z>Vc3R>$6hy(##Afy zpyhWViCxL{w4I-yQ%aI>c~yAAXCH0wRAES^O&h3OFLa2KbDalk@|S&Wx9az&r;p_V z=VMj1rs&%d&*r-yrtu$mJtq>lKmFxkK%@A@ZGJZeN+@4tLm#iyx&1VhQIeBH%%~2B zZ_B@%d{F1`mOzhCy_Oqk$V}GY`bcF`^t@z>-_$i`#W9b(>6KDFN+xEHUMuXBrz0-e zX?vx|;OU4;`PyI45%9V?gu z3dPS672vPW$Hl}<+=UB%RzY;~7g>(4DBrrYrMYaauXu8DH{ik5@R_^x8}`fhp4s?Z zi{EJ4(&jqz_?w5!-)Rt|Cw{VK#i1Xc19DZb;CYgWxFoMW(7!Bj4)}yd#MkOIL0yEL zGhU;020{ntJB&5Lph8Mix0A#T4!*CYtT+?)x!paGOF%LJ&g<7Sc1-!=4sCcU{Zuie zC7x?2X3hc}G9^j8?ggzE%jkRw0@_gk<3LW(lOK;-ZWH|G8d->oZf$t*30ws_v~>|2OQ zUj`gt@0EHdt@NJ`HQ0{e`!)!_4K0qiI63__Q6 z*Nh~#zN@sio&E6xsy>e*5cabu4u^$@#T$j*TI9fEr?`Zw(=U_4PeAM_v@6w=eL+}7RycIx9F_le*N6~6w{=?mqe$-F{77u3arBJV1dr4PsVYMROG%UwXk3EbQq)JkT< z;f;tus#i{*1R{!gC7Hy&3qqN=Mafa`I-CJ>+@3m|B^4 zjph=-tTVgyg-}V9f1)P09K*_&n_(ywx;8FzRCe4X|GduWTw%knj>5)Orz|lF>5ufG zwJZUWNNElrrw4Zus>wv3>T0zEA-nUG()_5%;hS|ppvkYu>0e|9a} zj|O{ZKE|mia&IHMeWmZKUmTRc4L91es>&_NHUOf3+5{|LSw3Kp)`8_EiV(U|v0~}f zkyG~I+$#4EAY=@-4~W@Zdb-c(CaiA^7|>xk4A)x1pvK7eKZG?)qd72UNv6JFTuTi= zsw!43pK-K4sHV*Z6pYHG*Z+q1cPfl%iAnEX^sR?i$5BOP@QkCH>itmcQx z+uWEAOc)K%J@RSEyYL{jP-ZPcyFLo5dh(GmAUKY$f*lt^Llt|y%s2!nf*thRmDtI z=IE}5g=}QEKXHF^J-k<8q5pn83-S<`4BTC|_AFTX97jU1C-3m#8a;pW9)E?vkH68q z)Zba1SCq*fg5+qEzY;4TWO$ny8uJLq)9KK{N@uPDX9{eA_!hupt5=WxB(#8#wY0f# zl?{k!Q0vQsxU0~{GFF&l{Fi-}-i`VVTR!8;a0Zn#@D$sB1CXCxrkVjMp-6Yb2nLnN z_vG-m*RLW6muMp*_wWOSI!)IlECA=KOxm&Te*2QmGyd)kzNbGG#jeomn8FGz`Dn6g z9>}A0?!8W^sDuqy{8dP)ynrHb?K>>^a0IT8YW@`#c!jdhF%>MdQ&IWT#rD}jSIo}d z-u{M-Evy3=k;QX{Ef~sfK_1*hPX5jE&pfMN_+8ZS^SE5pJSRckdOWtt(@L?>26yrC z?^}sSc@;A`)I3XB=Q?zcZ3|QO%`itbxR;|UgPj3+19J@DTvU|g?jWQzibp=M z-`%1KdNWdQ|Co097x5+!|7KD!Kn6mm^Owa53L;nGyj4tdQGy*pon&W;Mt;Ig;L*Bk zbIk=WEe0aIitTyj6t`NJc->V47_>VMUi08Mzp&-a8Qq0EqzAlst>8Ip6Oi@RZ74S0 zbL$R}ioK4=jt4SuwgO;)8iL{jsSUWp26d7b`sU@~f`Q&b!q+%C(<=Pqdi-;fu^HAt z(9D-h{%6U4cs1F^L zr>E(%lXg9C@<&;HPQ2uw7F1`iF9MPARlVM9xMZ+`)pzh5--M}4ZqFNUi`Q^GBW^W# z5ADZ_g{9yY`MDttrfLYnn_>qP1v`QnkvL^|pBp2|hN0Npc`Jj7;qtzSka|pv6Jx^g z{2RII=@N4QRL%2>7w|mBLO>HW(*wairR2FlheO(di!Dbi<3Ud#l%6K^BK+FF`>hM8 zR<@GyI0*1KXtK!u#i8i75t2)<^ynuJe{(gP(vgU*!|)ij()4z-g)mP|WO%Pw0;lVS z6YDj3lko2C;_ebP#EeFKb$;ajPO$D}=PLH#pM_i-$KM|m>;VZ6y*FNc7cjYb*Tm8F z)~l6SO9dui)KdT;Ap?<%gID?neWA2aTVmItXH-jsSK|e*NJyG415&zRJl^m4h*0~L z=H!(9X)YbmapEiFz`1j}ZnXy~0&9i$hoDlti1I;gDVo9o!P|fC!&_AV3l5Zc3Pz@h zL-igev*PAn193~>1qTYAzyf8O5OxgY0ZDm7NmNU>?^chW!hd-~Y$5;aKlCgGz#@yd zjQaMLX}aW@|XrG)XhP8@G`fW{M_iyYR}8GxKwK1`Na$D!bcx*VlFM3J@yS z$B7Y_@G~G^58w}@H^POaB8OCvU3?fmxt}pP`HICOMlj#Z3GPZ2S`?k)&a4G8la2ib zmf^FP!8wenUelgcfE3gghPWm);zy5rzIX44751r9dux<+>y`{cFZZXwXQqFu5BptI z7BK6i4fz{y(`T)xg8$M(ORRhcyZ5g`{ZOZli}eS_xjy@lhtCsGv?$%?q3Pq>6?{_J zDXq>QtQ$Nl?nSDPvY@thY}?n`^1kck6JBt=#TkmAOI(>byKY>>1XqTQ^>+tT4m@QY ze246R`xw#3j-vf!ls@VZ@#CsQZ>Zaw|gXXCU0$xN!EmmNHUs%i1rXYzElINm?m-~)Kh;Y{HR&u{1v zwA?k;qD&kYiljTWw$9_Ofz|LUp-aJeAhoyt@7G7~fWr&Sw*3H^;^*EMxTGpr`zb78 zEcbq@Vv{G;PGFsFIO>>;#ih^D47dFdz5!)ud~;2O?94yjqY;)=zXhbN=T)j`Fny(r zx4~+jeIOVWQbPl)ufaT~Cjv+JJz$Z9bK!Z6>Rq&xX+PYktQlmj1r6N3gS~=LeE6~s znA~H&S65%e02jg;SzjHbmOMi@4J49xlx6OWzjgb{JBK?t-WPPtuGOrv)sre8^O*PV zcFIl)6H3Zi_<0fKs#A~YD3o~T{buSdtJi68RTS3A+#gP|9mzS~si-8aJbAzVG$>vLC4ei`ZY%-_w0^U33>YZe@N8|JxiT|l!f~Q9y z50AfD0bThsb34%&`1Ch;`Pae{=3b=Op9wACec#r*%2KJHq6E1{b3u}dBG!j6;z#!I zmX{CHhs|!Dyu>={4r&jJh6LhMOt!-eo(cn?8RAFIOOA5GVjyEo-kr|RUoWWn&rAIw zjS0^tO>}?F+KG5if4=(`#Yb^tA^EiB)Mb6`^iQxg=5T$dclh$&>G4XV;6RX#eQQ1; zG^2r|wRAFEF$lsnN%>y=obBYDG(?Fc1d6p0(oKBPL25;Bs#HC%kcbD`a5uP*Il+G4O>OA> zMrDMET7C2|tdj}#{l*TG8IyaA-3O~}z7>Zc$}3uE04vO-60Oc!#6e|1r)a7X>=g!3 zlYp)t$W9jcNTG9PSWeug%HHyo{Q)I$I82Aj6R2-GdV-9Em)~MnmYz&k^lIsgIOGw6 z$rS!m6~3oE?b>h0z{$IZ+^4?#;}8v}NW&>a3k!lwp&o5@9Z#8?kM8r!4uu~K?Nh2P z9W9GlGlh1XGB-{_sRp})|6;RKagMz44~rfQ4rI@9?2r1203X4fk5&pNO9}yW+Zo{X zxPhC6Tr8MxyYF`}k1WVX=W#w@RN4#kFSns=yn?p_^0@>sPG)u&`t|3wABZMStk%(& zc$JJrc@AiC{j$+$3)$|u^CfpPqLXvPVN2U=HU`hQ$qt@tX?rckl?l&#${BJA7%Dsh zh6*EKH8fv>&}Zy94CN{?FF=Wrh-9!XR=3vFq=k8knP8q3YmqL5u1FRQ1+IMs% zhMrc=@QE4a5xT!V7_3A;!?6bNKzs6KLtEGMliLam&)pL__wodlIFq%ou+P0t7_(|% zqaTkJZ*Od}@>^dP>YX8t9Id<6!Iz^UgCpMSxGtLqER=xV6o zCErc-x^<|f!h?G{g~TMb*1`z8HoJbSgL3Y0!P%(!M?i=WoV$Q##i8B+Zp*7k@r7Q1 zsj+sakDf?odn+!+0#*YfdV-4*X>dB)K!+xz4Y;i5fL+rJkI?~QJ`5VnpUohwYgLUY zH|{9N!q=SiEcO+EKWBIijSFl{0Y_E+~=(IB1QxO6iT8?%CtoH zhO?*dCdCjO5Yd@|)tXNyp*@azk>^V_l-=bs8-hen9!}~sV#N6Nu@h~L2ZuL;98OBt zsTUL7c_f}Z6rIC~vmJ7>0)n$TaB=PYT>)@Vv)cq|pbh>2M$UXb00G3FVL)GF2dhyZ z>cvI>tDnpXc0e?<+&u$_3B)=5`u4^)JM9}kW(Z9ft@y{lQCqOhk`HrkR=!?m4EJ%l z8NzEKc^_nbs;2`Dtl|bd6&Z1Yk-cBiE))jxBCvp~uo5Qnh2x@{2asy;ca(Nj3@mh+ zC;;~E;ak@7;&`Mt`N+#qH?q@jM?KmgY%r6n#Neb==DP6I%t($S(mB*~^|(S*l@do3 z`2Akc{F~S5*NRV_SDux#RX6fmlKi=$3K5cRzW#Np$lmDok%=q#cd%>HyMWw(rEmG% zS>6|~)egtkOn?dWA??75VCL)H?BI3+!lS&!{p=gB6chH4gxaT9yJ5Q3)ePOxJVoSF|+T`L5%$()fo{z zU4%QJxrMidPKY@F3V>?#AIyLbYP_8ud(Rg-Y)cI;@)%`I=CPIjPo5z@4H3y%oE~L! z^7QL}$iBR2o2{t7# zrVt8pPRAK^CKoL-%H8n^AKslh+X;H>&Xy`Q-4EuZqQPlKO## zA(+FuUXu4>^O3)5g{Vg7X{p@XeWtvPsB^|<1(E6W2DTMXQrga(4mxz%DyD2p&Zu-N zX2~DzDN8bt7gv>nbG-q>b_UwPMo{&nYOmwR3g+bycVk$Qo3ItyRt=oo`qz;_`e#4|A-`(`e$jRG z?p?dy9h0LjZBsnOIrKd_3y*nZN;YSNEcyK1n;%xBwNQ@AM zi`DHb2pNz4^&~+K0*m62uqjQP|5d`pD!&+s7o#MqS==bOR>+U;Q(QN;TU*um?#{Eq z_%;(4cH;UBE=hINIR}dfB}Ck!J#nA}-a8Zf6Gmft2Ri9Xiwo;Qo8iN{+W5iNym^Fw z_Kjghgj>d&yi``zScwyo%AiV{8MCQ<7oyc>&donWDy-mTd*G*^q}hcDL%Y_{X6H1~ zSE*aXnYm_^CmeQ}-=)ECzJ6}fvz_%7DFFAaI0KF++Dvr7cWSqw1_O zr@^IE-Z+OVGMS`i1AH)Bd}qTK0XW&s7;y&|)ovkx#Ftu9 z>Q@kKIprq6!pl2{Ag~g@DB}Qh(|6a$gxJ0jeT~=%`_C@)aL+1H+k7Spc{Gda}ie{+<&Nbok zqyA@BKBeqy4&;cq&bEE+7@{<$a+#%3AYOE?{gJ$(n#4maU*c_sg#M(!?`obOt%#ER zN?E$B4Zedf>2vG!6P&F$8S`RB)vtpkkB#?CWXcKD83K3OlFzvBeZ$BNp%J@U{Yr=o`IvsmHFz`*6iq!tb^Sp}UP`ktG{0i0{`s*hq$9-tfOVs*cwO;rSndR;k!p6|do_#|%>2PRO z!O^R~o;iesG3_DslT*;eF;Gv{+aiODfX2hQeZJ>ffsQy$H>B|Oucp1h-36lvHr6v& z@i5AeJg?tRiMef~QXeV9z*&QVJSoq)-|Q@7G`q9@E`g2Q4Wloc4hF2>-;uaBGaK|S zt!O4^955!?FGqV+Q-8D--Bm<~^NSy7?@<P&$z{&(uFxf{n8Hf|Rt)m6Df5UhY}N z3b=aghxHX8U9e60aeYaTSphV&*Gk-~mVfBm7@Gv;`naT*t{7iyPwlRtE{C2C-DK9) zA3@Vt;X<~_!OwWnK9GrQEF_f`7W)2PAtf4x?@ddA4?ZS0)I&#$+omDmeESK zrJl`<>9jTVB>Zy)IF0Tb>Y~VtDX#EV4kvTPuZ%%nYw@c4;a$~K#fG*AZunsrem)E?OLq`a*Mb7itz&0(J{LqZ6DaCs<8(k|P+| zcF%b3gdDWh=9@-R1HH0Y{2I&z=5Sdo4ay;epzLOWDMP<;3UXLE$?I0=YSrZ6Bt0dN z2nwKj^}?-cyT+B8vESH0FFB{OhufTUv2#b4XIz*_H%R4UlV`77Zdc=)R1%qm*){Jx zjb(n}r1dbEO4U_A9lvY$$+nvz^AG)(6P9N;xY7Hwj&@}k`;x+{dJ)4NWx}I?MhAco z^T_TZSHj83UMrP?{Mv^OUq61230N`z4|Hp#^3c#^_=em1@M-arqh=O zI^s>z@}mV`2yb0`)FGb1o`g*wn(~@-I5Ns3AM%;mZJ)AENguLR&@RvpOF$xqxw%Js(%~Y6>l%hgwc;6Rtu7yP!-r1|*6GKMisqNSSvfxBrT`1nTo$ zy?qWd91$`ada&`x9J(tXo3aidn2cf1X+tu&BF(h{Kd`K}86bSJaQF+9U1lEvtWgnO ze|5OU{xE9kn6h%~K-u!+@C<_{Dnm0n?gusPvx(ckC*_~<|6oi>XdLn~-phs=eajvn ztjb*&XcEEyI$7&mKu`PJwcj4{eASlFvhOn<_6zyf)S^d484Fz+FDdfgT)zLzMbc=?pC4_L62c=PBe{i+L;) zRT2695ZEywp`8VGI@L6dLZ`Rs{%U&^5N0!{J@a^Tx9iadx5ysab|k*K zXF*WCt7hE8kMBWty`f$W9#2kLiDf*8nhn{B=IN%XsA`A8m))%p;vbUTb|?5~b4!YU zZov>-on4RiIwK9Htx#lNs4m9p^{55~wuJ^X*FL#4Arlb6=bmvQIVW}1Vo$ug)nlgA zr@QX*6^tn>iv%zPP4wtP(pskp^$n^6B5EfqizyICYPYg}Z4d;+!LuAA!tu3}_jF+i zfIc6!%@pUg4u{extnlv=WtXXNfYoK)1Yg5Q`Dd0ne2~JH3W06(JP+t<3AU_i}On>4HBx% zgl>;GzoZ7!^|-7S2ApMA^$&GBbZRqe3QQ`T~!Uv#41>|R@K z4fOb~)qHN%3EZ9df^#L}X&{nghwZD zqC||D5#$2d7!RlPG;}P!`R3i#Q-*#qDV;}&HM?IlFDWq0wj^|3zcYwvO z*z6qebpd-9YN{RncKc*2N3SoXDp-*`s`1|vRZVRVP9-(J)V39U_sm4<=4-zfT+0@} z;yEo(6N*G~!Oas_c3)$ym>=svhvg9>?tuXh6BH4FXaym#Urn-RZ2Txc@jLy1p<>O5 z84sy+T>dOSCE1?&i`Z${2_tb|&6 zM*!iWldx&%qxxOV$o0;XVZ}e$Aw9vOi%njF$L79JwrmdoWxNuQA4r4H18hbhwaa-u zAYzO%4ea=q2sm>y6BJ)11Ix37w$oz~0*0s&ic<&RQNc(zsjyzdmu|v!J%7Dvv-BMXliJ~0dRQzrmkj{9LH@}c01u}B#)F&$cStfl&R-?p z?{JE(q`N_%7AB)VPLEqAj(v2nT2F>uL?nD#hME9UkMGq749I@_Lid=raKW8KWjAPp zMp|rqp2}x4j%y*jahUZ65mcI(xZD?m+z2&`?<`l=uHN$)`)WBNu2#_;#y6mXjaFyO z7>-)TcBkVmqwrr|U*a;laE{wo3FaQaN$~RL_i*KL=Y6>-{4X zV|p+4c;7L`pq84R{PAVpeW~+;E!lU*?y8qco^9R;WY%duE<^7u{8?PNq6Y}A0k0Oi z9of0h?5rvDKxiFHT_q&c%}@rrilnK(Yo+B-pI(tyqDk$Jp%Le{Y)%!^);yW71OUWG)T!m`|lj*b{30)?YP}^t6)}VD^)r< zEYrieN>&?dy_F@ApvE-^U`M_(v$4>_D)8NeXO$~vmjV%lZNDPfY)6%0P0@wup9J$N z9_-JC#QTaWO-b$Kbw`cZrCPql(@(B{TgNUOtBXZE8q^?i!RJmPJkRi+0W14$IZgDX z>dMSoScP^GJ?goqNv4DLU&@K$CI|9Es-omOb+_yBgt`?=#B4au#~YQPMOmuk+~l#uYORa!r7~2&YA>qq0a!eyGvs@ z7MjUgQhXk566R;Y-EScul~btP;jS0<_M2N+HY(L>TNAr49@vb@u~s;HBh;=%_AF{z z9Ok!q;8)K0w#|nsJw&-VwL?=fY&lDUaHD@*K2ct4S z+n*gji&z*{T3+J#vlQ`xYRD`!1J>%PZ%2#x$5uZ`^Drpo47ab_4{rjoi87Hvg(w#87jc%>O!EN!yj=YqW_@o|Bb#MF` zvH7>@LfSV#AcwjtZFRb=_UEqA!gc2gT@ZnGF>SB)7a!d-!ChC_6i)H-#=>ck#yPTp zXhgrtV9ykFV)JeQO!(fxCk~dk*y{t~O|6Cx>~pE}{lve-8fHh!=Xlz(Zh{;ju!BM@ z%k^<0H6ZKPgc63W58%0(YW*i)Cb+W%5K_bkd4Ph>bOVHJC{S?s6YiuzZa;s2j@>E~ zut8`{sTa1K1jf!PrkpaY!hFrIip zI-HCG;#6U9RBZHn6nuUTjvu_+V01XS+#yrJJ#IHLpe7d?MwK=FbI+&-b?YU|f3JHv zhUnKFE?;QMnf;p=RW@OPUNNgTPoLY_7G!HY#e1A|ccn%e7d;W2_v32`dd|_}>md8C z^+&>5j4cElNm=(hGxA8ki6pdom~Vnd?O#=^Ey*u08k~`@^Dj@o0&@g=|#6PO=~E^>5W>=UAx+M3hG~OYAMr5SBI?Jmd6|s44!f z$uHMQc7_nt_j!1kAx(@$DD-(@}z91UnV({TH8jSU_(8f9#?#{hY9X^-80!2_8Zkf@P~-69Hg~saM@WTIdS@2J@bQ_-247Jb1m>T= zTI#1{`z%A!nPFXMEQVQ6cHr*3w~2+8ZZIj?kKv7=kwJ6V?Y!gc7K3=9fUO91e?OPr zt)>I5)Z=R{_kwZ7Q-nHUv!koSS9H0Km(y=cpINZ1tC_|$B~OZl_A85Wg?Bh>?zE^nd z#V%mw%MpUcvwh7N{d1bBXM^F{bs1-D0fQaT2?3jxBR}_|F_wM>%2Iw8%TfmL{;J zm7qI#Ca`~hS^urzkDmrcrOL1T6$_h=qS_`0(>${SSAH1seeKge{M%IcK)mJ#h0=V) zViPe^a*vE&UVKzV*$E)8*6?lR97&dU7*8;(C?a|~{DwYd=E-eA5|;{W*d-|p5|asI z-h6Exlb%`jadGttLurZFU%_PI8#&`IsK=)i)a79VyY}EVZ*?{}72|fsNMP7{iaoYF zdY4rU7YvAh!3oc6HkFyYvI}@&8m%qOk zbgcgJACxp5{GGMvn@X$MoCy_YSo9xp5+rqZI5pthNYzes(H(Qen%?`9Nv%|C_2Q17 zT=zMfbc>#zR~k9>qHR@%+`Y(EWHJT4$GTRR3Tzw!FaPbxZlTTXsh#!U!?_}mRR1#$ z4fq0{!UL%xnZXvaq8^Qk*ywmLq&l!KCHiCc*1?tPxmlue@0a8mH0m)n%z5iA($(SCpqgUJ2W%lv{f zXUyMl`rXF@AsWxB>|8u&qnq~vD+?#YI_5^?m!CDLlh8%)n4d_-4H)-^yQBA4X9s1l z75fMUaK>PsbKNvP&$9#RnG*|ikq^iW?WwzJ<2c#GRTij-&{Kc#WUanQ6Ea-5WksP{ z13B%U9hG4^3>)co=0utTqUXLSE&ytrma-&0l+k(b6YYt&$R$MT<<#J4|EuaKKfuX3 zR$<`%BngC)a~lrL=7zKJ8mlWH6hHp!1{z!nO4)FEasJOQu07U0{-!~)!DiW-h?CD>9(6ZP`pLCT}R<;g~ zzuMG_pRtaOk@{#qFDu{ZqBqU{_3@8zL)G3}v1S#O`yNiT-?-ybGd`&@I6rylB7pEO zD$fc0LO9*8VV`&$v!;6XY5k@~C@$iyV=>d=ze&ZCluP2ZC+flDk{7+`e|gD`NceQz z2uzXu1^SVQ1}C$1nLivP3+29MlN5~ZaGbFtx$!N2N43GP3{x@NDlYMr)3G0ALgoVkj>D79>^ji5x6C7T7Gk-7i-mZ}sf^xAOE&wX z{Z<;fI)YM?jjV0X;lJos8T^XsRlF)BEPYkZJk9Hx@!Q!F+JYY zOn$Y&kJ;E6!$Yyhde^|#zlB2cz;j6(z={{qLW3|`)66$EEHMs3`mJWYP!L{g8O91FSH$^V1=@y7x-B8nuu=}JT;PH{be8vdNIraxGvKEaEy(P=pQ+?Ij}Ek z6-2q{CC4(U?&oDr(Sl7h(*UD~g)95Ixg+tV}qWS~O+ZE`c8R`(1NL#XEu# z4Kc<#Bye-YZgr%T4z`2(Ie3ekh z81uN0iC?~#nrn2=EJN+8FBp(a?e>M%+ha$gaDFv8NMd*eGv%ZV<2J`5EZcf7c??$R)7J(`|x}vyN>mr0vQg4%9{KxNH z&1yWAEvsxN0p051;ToD3Ta4^8pu5QXEWZtd1HYzv5)Lc*4}H0MYP6#c9JEvz?C6MS zzDu_o?iEo;59(On1?AmFhz>!35WEEolYe*pWp+&0`841fna}f`jS>V%9ZSJgLozGB ztjgcI1Kxz*gqh=muHoS*@Vv9T!Pk#P%tXM6Kp2hIkk0cK`Fqg>00r~k;U&c^(G%x? zJ@H&&KEFq)dvNcafeO5G?EM#6Ivjm)lhZ3ht^$YnC zR_z0UjJH2HM5tD*Vp!ED4qPYw!2Gtg?SjGIrv*TNJFAE66LM)1l&wMNhGvKMu-6h+H^nz~wkLbFhL=O3;}&7!9^YRBCC5i7y}8d~+^Q;{qa z_bp+MH{Y2JRjy;^T>sD`vn2{rb8-ja=UwqePyaYcLQw((-awMwA)umR%gF1Qcr2%$ zpNQjJ?7rgQVf48j)@ns{IC=YzPBJiwjJN8in<(3@U-ydsw4A#cgd zoE%bMy*X2n<1enRTPtiI5XQHzu2oo9Rt+=e`Hh>|r<*vodt6RT%)pZc|Ql>yK9lnqDM zheB9!B7m0gu7>p`L=Rq<4Mf!80jo5JHyfXfgOG=PPQDQA6)qsh8X^b^KfWfRfEb7m z_%0IW0uH%LpYU|3pB{sHpYuGeN zSERgn`PuqPr0>qK_vWY%w@MRBK$2vXo(&~4v(!jBhxO6t+%12R3!k0yMhp6H)+Ct9 zCM+aF1bOBkJ__%fm#N^r6=)4hm=)uE=ewZ*-39j80^Si%*_C$89gwvR?c~AtBe>Du zTmtCdew+}%%c?*AJkL#G>^?mX6$KaUX?nig^dc}U2v^7rm#ifN7IeR1-6e3YIq~;O zApBia!2{4-m;lG+Z4768Fo={cw_Ka_WZlHkNvb z6~LhZOn-A-(ZPn6ft_~;_q0 z4knMfVX9?yKjxdm^ zz2&yfSr30%YD{3EWwe2KWf0evOx2dfdr~|VE6+RmWBuyxpGw#xMWnovJnQ1gLIXGO z^)@0bgH#HG6~QXg3>(_ehF!(aY`Cxm9a)0oqCi@gY(^+Wx|B2 z(qQhhpxVw2MirDqg#4+BG~{a|V4{qcE%g~r0FWC1#_ZJq+|@BBV9L)0Q>TBCA=Tp2 zv8dLd-ub9jX-z@oWql$03D207$XwEep=TDqi$9vh20xt!wzONduy!6GA3miIS$vfG zeX&YH&diV7I_t@dSqbW%^3(55p{3Cqzq?yAW%12RyRpP8CrOk2_lF`gaOM;2%|9b_ zKUjFKrxPUoC~kQct&bPZTh`k~>qLI(Y{|XSNV=b>TXGuWXVEL92oICpy69qVQ!j1Z zwyj7DNh(?Hy{kwc&6}QTp7ta1C?Dt%e_iAc4iw5k!DuRN&qhVKxPet{z-hE91e(&2 zKE;ha@m?Jlys(u`ng>&i!xy%txtf99WTg&u2~)YAYhTT*Cf}1KroQgJJ1h8~#pp*| z=sO(O(4c6B3u*qy7K9`lTn`dbQ^-q-R`9yAsF3P8i+|IHe9AQ@|~IN zu5QEb)sKl~$o?kUpK)P-;NdO0@2%I6~`)q($gq$ViviP zyM4z6wG0i&`{4;|Og-XywFwl&`+g_&lLn^d$`y>(n=~oOX0KcJYl0&vucsz#ez)OW z`S=|5j)BAk5MO(O4lZ$%MK{x95_e9F-n!ohHf1aY^8%b6g4NvKqu?8EL0=vK>>OKG zzG>lrFXD7C71CY$F92XHT=yZ9v04FjuzBMC>!Zbmjz~cXibPOX5>r5~D}#zz_$cQY zX54u2ZwSrCKG=F*+62f|3Es@QM;}7>k8*&jB54%su3wNdh6|E7>@^;mvEZV-_8h5v z7jMTl!c>50ijLQ0lu@9tuK2cZkyZ{YCB6YGupF_7-$W>)t1@vVRc}h33miKLoCLUf zFYG!$S^O;R302;Z#!jzPM7Jz=`*8e{m+i^v2$|c~Y;*CGg4FFQOa;HV)e_<^p3|hn zl5b7+%WmZGUOW2#C;uVqGebpsw)6GhW(!s^Bn=hDe{xxF(SRK#;mn?u2jymI(eB5& zt9dZqH|f`~RVry-HG<>*?iWs#l{Y^HW`d~4vGQ^KH=Vt5wo5>0xRq>kpQ6#!_nA#y z7wilRnK&S$2ho!=Q@vU@I-#Yx(%F;~&p83d&*tMKp;b5Dy4^1#KvfaUuS*9r9g(;PHxfo#6a^&Cc~)PW@}U*XI$5Cm>b3sVuo>eK zpT__dWgBPvk6;_*cMjOZXK)^S8>Dutuo-M^(+7p^%b1G4dJf0?1Py^ROMn8)$-hVs zK!nC+9xnxB>_%FyAt$@7McFtH|Cl$dD5>6{Rhi@ufZ>Adlm%9my93Zq6VJ}JQ5)$T zW=Q-k$9yVgs}irV8nN-?WK80^j{ckS-CL7i#~Qqv%g}12W($7do3l2gj~=?wQLpJ_ zZ(NVY-tJ{|ch_&1eUg+Sk_VFg!~*=9a*|FJy|l42721x6v&jNTY;EcgGMB zl}1!Lr6o6N)MyX^1?d_kC>duQlnadzV+O za%U5BR;9Kai4I@NUf8BQRSGp~N_9nTV2IGv3Co453yYWmd81;_`Y~M39BG?MRuzl$ z03&MY_tb1bHmiY?Ab2kMyd@aD`HNsm4_{Yt-66P)hhX@v=henN6s{N;IPJ9tPBp`k znEUM?znrGpZ90EBDX|s9ap^v0ZAaHIlx?3r`3WV0rvBg{;bpy@O zjoue39S`48)Y>bS@(nuK)S@f;S=lu<1^ck~sIZ8~Xz?(bp4%m;p39&98_wHd#~*@q z<zOp5_6Q5IBsrk0PemmM) zcI{6X3w7M>w`91Z*zJRI+@j0qXZ0iR-og}vZ!T4LG|$7B+nfBk$WuE==SXNA4vH2m zl{da<+bGU$0ee~^g63Z}YZS-8S1xqs1VU{pk0iH8?Z36tri6ze^l5xcPy4|R|G?uz=-ftt7R(ewy;~9 zBguO)q=f8G%P)jhE@+TiZAVgWqXE+J8gW$b6kJo~2QI2yT}2I+?j8Ago&_z~MG2mB zhzWJ=nBK7d!)d0OxZ{1}fgxKJFv23*9bf7IMicx@NQl;eeyJ%VnFLzLQrgFjI;HE~ z1Y^H-)d21%!n${o8^FRbTZiFaU$qAs$7G(u&Cv;6{>vP$f=GW^+c>4+_e1-Ezco&k zjo_<4R#b*J?fK4)PA@2ZT2E1wxA4CCNk}0rRhd$MycL|b#4x|gFy1{^yLoYZa*`kQti1)lohB96re|nIbSJW z_pt-5DL)g%x~G{e$eljYf%>=}#2gq6<5qUZ5bTjfk~CP+CG%I!BU`jsPcJ?Wz;Czg zWE;<#72zm^qJ6V;GV&zq?hEFO#%ZXWv+ULh1iqy6IVU!9yX5lDDoy!<)E^{bfTbd*1v*X7q}pMm zS#{HT1#28)!SdQp<}RPNq$&%Q|7or+P#%z9$n(1U`Q;y0&QG`+%jT6M?Bu0DKxXlo zKTCUCzz-6=GovGl>m?Omo$hcVOh9Y30fYoLgU%h^<7gmG2)qAjrF>i)BJFm%J*}ZS z*i0vhIOHq}k8wKnxgONye-4NuW>r(w0@n2#^Hayj%d=pGSN*C-8XX;<^{FH!yGIDp z3@*qWZnvpC;~2JV-cUdmre5IyqaBevKE}56W_@I+(5?`FFoI=KjRRSfOb4y&O?<D@m8mum30vhJG@vJK{UAcSfC2p}ij(P%8dmA`c>Ca+Go zFbckAdSvBIV9_tDQTZmq!;YsH4fEh=ZaZJic+5XqPY+u*l?0Ej&|;lcM=M#Ot|J*# zm`6`bm^;O96YrAZD|px@%wK1}1Jhrg2Obf72ei|k*{f$c9#sBXzoFxxYQL#t%{ zoOUR3Z78aU(Y|E|UhOk%ag@=QF8hVj*k_x+P5X)lKU5c~F$wIz?F<1T-`U;LW;6t@ z(IKvQGnF68))h1hLbtdUsv(PXkrLOtbyf=(k6@{s|KIfXg=UeW3 z8!HB9he<6bt7Dh%&-QXF4E@%{rbvB@e#hZ&@ZDq-6R0du^L|X>Ns9hcVP|2n#v9Sf zAYrH4SAb+K%efPz2%LDy^7|V;E|y5WDa|s9NIM=&T0pP(9kO0?{Z?|o$3?`G@64Bu zF@fas`F4!RlWU&BXm_<0$S0MU65VP4^lHq`Aa>0grMKevB0x>HC_sJQhW(^z|7Ea; z>n9)mdxFw$1fN%Bd&po47uDLE*9G-*WQC>wkPbyojC8DG*v>Jp>9^FfmsGM9BH7HL z*W!(D6<5WEnEezpE84OqqK{%Y@Oz7JDONSNiEFJxnD0DIudg53;#qLqU-}jk zBHO)|OL|IQCZ)AdWOdu@N)s7C52o&ujL`DN$fa~r(iVn{t0oeHvn z00zUQI^WIAbTYCL5Mn?H2wl9T9lL4p>(D$t)5$mQH~K!QF0I|=iQm$(6Xq_;YgKhT zJ1VPD_Cu9!LWty=o0AcwrC+c^qncm*X?CS}utrOU^6-5P<+k$0S@K`Ql9%GGO+G@z zh-orcOd2-q2V|BYPhIN7`4?d%E#Y*sPv;<;8NKa0)M0xYws>}1l9BdX%> z)E#g;J1~)W%p9FqX8jaIbdwofA;DHh;bnlm^pn64t2MC+L>$X(;9CE}ukI?2tMzLy z5QEYFdOI^4ze@c5R9X4GuW`&;sJ!`XMjYA9cB}u61kSgh%l}J(^J`abdV=!yp-iCr znda`9IGj!*mPA+8&Gz^}HM=lmN$2R+?~K%O+__P;E)arQL@**9btfCR8Q=9m>FLvX zS(j9_>{uK!z;^b1J2n<4;8X}Yh_eA!<)9{xNLz}MLs3I0NvfDuZ;wvoto zwPytEKVXE$I;aiU@ysl?;bfhILrHSlk2G?`_p+lxWu2!F4xJi2<8k$1gt!HM&3~+# z3?FfM?W!_1B*OF_QXE!GT;S6DoO^z0=X8n5^t5&<=^V&Vk-@Lii zBsv*1=i)Qi=zC^%)hR|=k15Gk%A1ALf|m9Ql(6^tO{E_es>M$*7g|s+v$Yq*Rn%3a zoQHELa4Bf*zM_4`;W{c=-XvOJ7wIy)#mbNh?|Q(YR=l|bdjx9xE>!XgSaQ6T3Wh$( z4yq+DqWIQa1ut&F&5W(@GD3(_v-}=No_~^45n6Trtj zsr|i;X3^h{g1$%8x$$U8Y*{vrw4VIlF#t{32IYcC8}&_;giP3Dzl zZ()v!4=5gB^=aX&9x&Vh0v(~M(5ov46NRrMSomz>INO+zJ8C+{uuhnz6FcV{D+3)_ ztVft)u}V&qVBN+Cd)25#cj`{pe9)}-dT!Y_?sd%c)pa2porWvpKkb4Hk~@*K^EtsB z^O}te-m_@OXmCe=WV1_gMiyDxZCG(4D`&ftHO=4rl)kRec;vaNFKW8#YJyx{z8L-; z92Adkd;I4&j(1U#?e0<`|48?^&zYh*wnTLnHx#8&2nh^S^^)9m(LrRW9jBA)1#&ty zo^w3oV&z(2LHA^0U=yQpMO=N#LD{O=f)pM%|Akrypf(d2W@Z3H6hLEo6lfnoMwo$l zKLy^rvu|nrax&1g;?r3R5ir_LKad4fsBmR_#DY$zqsdQ=ogQ8ki6OWs-Mg7B9?l>F z!5e%e!GAwFgPfK{<24N7K^h2kkVEhXg)qgF*4h_5fW>hg`HhSB_{Ngdk_k&8k z^MX{!Iz3ZuYEXiDeVW) zFyP8bEelQLhvMpV0(j61;a(as21bX+iN8ChRSOkPS33)O_J3H((BCuUh?*f%G#>icN@ec3BahY#$-q!*F( zLE$<%VC=XdHFH~Bc(xsrx{gVEM?%2A0#<{l)wqjJg*Xaq-#o?oLiJ-SM zb%&y>{SGT*mh3gm^^;j~bcni_JW1iWbfLse1C0faNLIrFP133M4iWv%(WR8X^^zGs z2mzVU?C_^PNedcnVuK76;|;C&3bkM}?+x?QsqG6@C+`QI3hva%Q6}oyvB`vZyyf?GAX=~~g~EhD zsF-Opxyf#SY=^4DZT~suzS}j2!}3bw033n^kl}YIvz-H;35)Qew#F7iv_ZtB0!5$q zz1+d?V-o#ISjY=wt^*0b)^SmH@iXD*?=(d(i?XFTZ8e1}ythOom)Do=ke!8c8_UeA=H;eRQX5~lu< zxM2B+!e28T#b@*v`)k*Jaam}s*xq9{C7+NtpRQ1?A7eAl@m9RK_A-2Fu-Do>O*&#@ z*xX_xzgPBgg9&87D;qr*_WE`JbB)j9%kxCGFBvlcbR+>TbPoxfzFRa7cb@`ZZ?onH z!5{A4(|}eIeDBi}%7K~M!)7%X<{-e1|EQG(dh}I_MsP05Hm*kv1F``$4FOju&axM{ z6U;;^X2a>nZdjAHw33ad%rIzgM)WPT&Rk^o;5YyZ)_5#VINZUdC(w|Cf@|8PpIf!d+vc_3nwN@!w{h&|I zcC71Of)e{1j|oN)Y*I{tQa{zbMy_?2SemF`oJVT6Im3%C{IAt6G<$UKMNbvD=v4EG z{fjK$Ep@3RZb*|g5vNA%SBVnAewVxk=0ysG@%tKx?-*m8^2VIXutD*Rm&*4>4>?2c zNv*wV3;lA4=H9i-RjYQpBz=3|n_yB@0DYIgMz+d_K+gjX$J^^E@y?6$cr3~cQ z?eE_#FZC_bBggM#e$g*`C2^~%ZUz7B`e1ASml-`U{vZK=ruUEbu`>zrxfX&dQ9?rR zZfvqde@GD_4lfcUHUL6%mJX`K)x-;l__+(egOoCx8`g0$^O~055@yHOP8Y{1TQ$#E z2gzMNt=<2W>DB(H;*yfPjRv(FBk||gSi+l`8hq?>TQ|GSeAN{J~H9^jh(!cp8 z?zy^HC5F(CJheW5@FHJxzK!mtY^uLY_KUQLQOxeY&#fwKOncexisR_9{>ICTEGNA3(pX3%{!jIi-xb8?|)i+QA* zjm_wf(jfJVSINvyQ?bqF??Nj5ZtlbWeVXaCBWM)@B0?OO*XeTdt!wEO921M(w3t^^J0}igSTEKG#Of7iZ(Azrf}^9zWk}y`C2% z#ElwsW3rS)^4tuTn2VL;;8tV9l~?yofZ$gRZhN|brAhFUay0L+q7s&j17dJjAw*{& z_so+3RUi|`0zOM9K`Vc?xY3-RDDV_T15(di?%KZf^UmuDwyCtyGE&mK42CG3W_;G1 z1|U4kiZA`n$a#OURRk&V_$!@`CAr(r z%;i$G-b}p@2g_nj{@y4LP$K5&awnR}39?lqN9Y1_G>wMR6wM4d>+QkAOG<)@0dl^7 z4%gdMG58{^1QQTgsGxq+_k4|3EL2q6;Y4=DHV92Q1+;U0o+ajFt$zLdl?*kQfU|hv z^;Q-tNjBnqH~3^&$C(7qpq9;2B2ueMrWPdkhbt8mZmSHP5&_{216i`P-;(2bRy+V& zlWqiHcM3dvrB4f_oykW#S`Qh^Es@c%^*cuCBsL$02v>q2qsmHlV|^O`e2X#2;#A)N z9KAVWUDXfb@kt>3u?PrpkRtLdxG3YNzS*quqZaM=PbuC}qn^k#C6YiTGb<&WKuv*4 zBs8HiQZO2K&_J1`Iec&^RZQ&Xi75WuK3_Vd%|YMs$J4BqfAG#F_#8Sb!WxvOIc;lb z_oJKE|LWqBJTbpwb^1k$l{rC$YiwF-Q~i<&OT+vlP|p!fV+s|?!6ff)SW)3c?A6QC zt_(?c?7j=Dn^uDs@loEjzAt0K6d#LWj8l!I$UBJqeofC$g>? znV}Lis8B~M7BKt~;6Mq-2(M}rtrHtAs=@eUW6=4nl@LD=e()@v_Z{#@fP`rIqD!s) z8v`mMzVLt?PYfVR-$dxyF`KI^g#y&%)CwIo4xhyWE0ld%gg|N^q?W<(yt)Or)ifK& zHg|+JP&6}}90qNS72;Fqu!O51_V4b{3$Y@JnlCB|n7GBmZ8s2WT}5T(=Sm zbkw>+GQ}7`Q+oP>{m)v(ROEf>T4t!w)=QVT$vu+&QC-q zuc8`hhd#^#=VB{k-g0V9evjdV$&77jS$vtZyoCbHJ!Qp@9C22!K}+XD%x|4ma2 z6IA4!o1gY9`jd&!ZHfJnn@-JfEq1PpnbPi^$BrqF)XSxq0)WcVQ)Ck)`SJbt#&?w8 zusO%~RGh;a*dN_sXoG7|^_OZ;*9NOJpZ9)k*jpJ1@?B5+3+z}#;+goDg~b1f*gh1@ zQEH}8p`XmU4<0xJrQ+q4tNW?m!_w|bS{W-HgauZ#v6ycGM2R+Fu@ zI^H<*JKN9Y=NL3qN!MIF9m#lTBvHh7pqDye}5&%FWLL!bK-+>DkGB1kv%nCdqezD!>H?!k4Ky$y-N={!pvLUE~c^HsI)uPZNPm$*!bzo-~ zxz@omF%QXxxy`4j_Fsh?Qq>u2g|coMg=oxF#|33rz_u93H1T)HLQmEveqt!Aww#?(&z`AEY zDSmS3h?5;9n`p~}O2!ZnV4~@;whrbo&|qk@sM-PH;e{#mSaCKqy`8lxl?fD<_%o^~ zI?LUY{`}@TboU7vHs6uv|9Qan%FH{IV?AKv{_veLQoM*3nyAFqF+LD`EvpHjbzVux z82zU4FR5dnB2BCtooabjoa!oUuHC}YU=jSE0%Z(^WR&r zUVr9+k(o3CdQ_?jQ=RGC9i^#+<7oaug&Tr{Xo6IwsFTavjMIGku0U?fd8|X5bdd{& zu+g5nn<8{)L9Vx9B7mVPRVJ`v?3A;@1aC%;_o4%h^mHDafQVcWA_!SaT~JMqci>2P zOo1Jgr>1-E-9JT(Eq=#@l4N-3!2dU{<^D1yQ_BX7uhISQv?CeBXTuFoeBN+;i}H3U z^SN}BPVp*n*mYqZUC#l-g9?&AN!oYV%0rJ%``+PsGk8;|kJIcf^@$Gv3j^r^!3a>> zGItFGX}bj~|EUkZuwFBf0Nj4XZ<5SropZ#j=cf!F3aubG9`F1S2OvQWe>}_FzfC-V z0nwQVnUg(z*R(@IKAvRAl%r8kZE1Uvd38mmIP1#6SZ0~>1`YbhKABBO@O}ktO>ob( zC)|!70M4$trJ(nXxi_rPhGz-mt?r))q%>VATR>Ql5s(VlM3Rg)^}r^vvkst)Ij5R| z2vB>2YlB+AvnzRFNQs4j zBDH_f5hqIb>dXy}YBMn0Xrc;OpQlhNpGptsEaHbU#Qp_FKl9^Ma!YIeuwDh(2oct3 zLzb)ONac)H7F#P!Kq^T-*CQv^RB>X#hL?LKLL6&Mu1E>_UO~KBGNq&SES*kSEIyNj z7*-CNtBZjbfDn&#tAQVVKq2@U1ZQWI=-RT6Y5%

%#fm;`(lZJl&l1r#!Y!l=^Dq)%Ww_F3mS=npA-Dr4E9Mx02$g4kGA0mO@yU zLJGl%Tfq{l(Xt-FK$_x$W;~`$^zh~e_0=buJe+H4)_CU6KzimkNI*jajm>-VSxigy< zB^#oYTMTMlH@xz)4GT7G+|7Sx#7$B($kCj;Gn+H}Vr(`>^j9}2M>zQv1d~AOTuOCZ zC?ok`9`dj$daP(MOb3j0{+99`=#mUmKKMWpGOWG!I5@cW8#Stti=G@mNdB2}DP+Ej z>5;FVAjpRNQvUl#_g}nG${0>y1~(GR>1xS6Dn1-@@*0E(T*aQYXQWeMtE2I23ZV4s z2%WvKMC30%Mf8GHsLrkn?>E$+ef5?U|2KJ)+tX3*E=N^$O|>{|i)rmYo0vt>nqvEvVnr^c!Kd_vRjR-P;`n zya`21S3mq(v$Ob60EN?!y+4Da#q>DSC8o3D1Vd#$cq8RlCpX9RKfPMEyn>q2+%1^; z`RbX#@a-89cn&|bju(o91$2`|uOB#kpR&|p2+ zBNOttK!rNxcrgWp2nb$wSYSc&c-(j;eSbaP{e}qFRi(p8EhGAqv79v&1(>+$fOwcI zoE=7#AcAh5$T)-;Q!L}lYzDl{&lNW@E@hdjW6sK>$Ejj&uB?ZN{uNgWN%l-t7rtLn zb)O`8EzEbq;l$VB{WP9?&M}PjeVGCAaCu5Dr&*`$x46+WOiyU>P6O9tyyU;YmpV?Q z@;*&@q~Pb8(x2`W)r zMlFkI${!mC{D=O!MF`MqoV3jSm~|8IzJEt$RwAn<b2@npG;9lnMr=^-8nJ2 z=lCpt@_Ng~5KndzE@ucB+iI$Ts`W3*nekW*URzWW zsA(H`8`jS#Ap-iFT}kojV8j~d&Rq(8c{eR+nHIaI1vmI-WgIWaPMUsDhac`)+2%;` z&TSE-(RK~o!?KR&#L@qkV}%=AUDsYY8&0XXcVApoQY`)zl+gSnd_ZX@+*ED&B$fk2 zj=*vUEgT$iIh#r=_A@sslR}mycI*X_zvd(U&F@c{2ACDwqN0DyUlz{lE-I09r#^Wv^X1rZ$C@XZJSU&RigqG zT1)ISPB|QnP2AFMKODb$#i99nva&Y+ohGbitoc@o=C9_X%g!4HFEm@7?c?FdTBg#| z@MDoAzmm27+jR_3yLFP$xj{4Um#c~_0Y#1zRX{6_4e`DbHOY(`jKUB38Ro^+^7LPe zfiB-u90)eT1-iaH4f|gFxBC3Ntt9DtdMto>`QMwG{V*H!cKYcYu*P_Js&1|wQdSw% zC0nPy>?ZL5bsSyW%6^<4AjfO-NuFjfa0{z~>go-GvEaQ6{(0zTXs?p6zLhe=Qg8Gj zzT7Bn>&wd7yhzk>;30wX>fKvyV7w#fcD_Xj+`iB*ds;)Jiyab=WP zehU0juwfVoAslQ=2DMXg1|c2-tCoHvT?DhGyoa)wBf=I}aNrx!YsPi7M3ztbp@6C- zW5&)_^*+oqQ82Q9aRQ82W3agjWuP0i(d|qJV?_b|1~Zglyj)uW=w6SNd3-OWE^WZc zjn>@0IDNu?nbDw7={}B)n`7uo(_D})G$SM6Y-pkXA56*|r++iam#T6O&BomS+si}5 zKN(#wGlCmdrrfm{5%vH(K;-o)? zxQlc-mbwdxqwsb*_>SJ#ZT-fD29D^&Xj$%!COD5xWQU z@7nc6pd+CmM1{faN4kw>G}yN*voCzEceaKYD|&lQ#I;X183ylPDd#~IO<=ED-E<=eK1|k)w(~dYmMb3w?lYt|NlJz@$G;%bbOme zx2@GKm&`_+Q+XrMbi4&~43YDvK0^WXg;(=ZTntQu@g1;53rEM_)(HgQ^X6M`{ zc(1r#LFod{zwoxO(kCKdd%>ZpcN<%!FIr*st_J&3?PPyj=0L$~j&WnI|?e`GxSA zMMEgk8hd^g0nIdxx`zoNHtd`Cg8EwbEI-X%tLDYp_axHwh4hRHphtkfR1ShmDm|gV za+}0Z*0{Bko<}6ub8yHusL;%8&zc-+C&Z4La@*Q4)Obn(zD{8w*7E#UOjmj6+yo zkQyzZ$()hx7bRD&__tUEK7Kv;)({D`2H%{s^%YtB=SRP0)_XKs{9ov_J`1H>Z*+D0 zL<7cuI@}`pgg<0+&fWaWO&ZU5%6lVJKnI`@=eR4Si?nS%4HE$oKVW{}CBuj9 zB!ajBof}|FFz-i#FA%ge5ld}Pz8)%v2B}2h02*ojZfS@cPoCC~-_yrasBdyE8G1a- z^l#l3L!JVgKR7y5uY?_~JTjjxuH@wjhnYQwwkFek91KUI%evzU3F7-kYwg2>;Vst9 z*H0eyZrRNji&_;etTdSTKC>2xK0wjA1Y>JYpP6~>iBq6Lqf{i@wcob4s(z5aYNmW` zx4rIBh`TAdLj7~d(Ne2PZ_uGV`MMXT^Oxq9@8Q153%9>5!oS?N>RZLlz7|FIuY>Dt zvh4S6cDC|s7vfh{z+1~Q`#EuvoKB19$|~exh#NHdy>ganoP|%Td^iS2oiXHP?9+Fi zYiPKtOPb}5(9u)@<{!)NetrH#MJKmqa#efJp>3a||7Qi)7%nWk&-p^A`cJFb!I|Qx z-|u^y+f~b~=_9MecU#r;N1n`a$+_j4xq17G|E?GCA*_T*e7Sp#Yt1)i^3g4F;bbke zK^x}Xi!>QZNjbXruNHs{($4V*9m3;w&%{!?vw3!p>=`on9(;UXK<7RpQ!f$`j0nd@cKv0EA z)vd76Rt2rTCoc!^*2F8rC`1B1O;9LU@1>`7~Gq)Mg3z z7-P>(MVHC2;mc1vgqJmLdK1<)3VS1%UGyc6BF?y=cT#RUkzlEmaL01IcHEy+g{o=< zCk}mZC4+zr>9O&!oh`U`iW*qbO$t2mt8uH*3tSo8m18we;-D)v`Cl^&FVrhIJUqsnIN4=|Vd*Hygaes<-h zVLYeIzYb=J4eI+S?kuQq7a{Z#zGy2bH6|-hzQ4!1lHN3`%*9rB^C~JMhU7QEMAV={ zMO5L#ra8Blf}HH|n! z;2bMso~`W{6b2NCBAGd(cAmH_7JV}0j`{=acm`UNjA5bU)06O6nv^6hq-{R4&5O7s zZYYC?L=+H_RFZt%qbK=$@3>oK^)^~}giPkR%rSEr{C(^|D6CRSO8A2P!|GpVOiY@W zE!=?k-W*;uicqGWBS{_-&VIqZRVwW}--SF;L*$laCj%AO8%@t|=xOB*g<5q)GD@p+)tJJ@Qb%YqV zN;er80hG#Vg{NFg%DrDEAXwm`rhu@Xu1aWrXQ&{|Uygwe3FJ9yLwTeG1g3k~EQhQG z(%_FF?S%+`#*+S{3Y4>lPLppU#>qN0tXY)_u;6Yoo7XoJhdzM}dy?VT_*5XoX)wIQ z`5|yS*~KrfaV+fP#H`y7*$b^-C9xhd==>L#CB@jff*H?3J7xx{5UlIDdtp%)PnA=`q_Z?fE4tFv#{o8xH^fCvFA9ynBT0t6FZbX$m<8BoKctfO zH6S$?SF-L6d`mSLM~U4c!RpD=A0)daK~TwCc^;rShv+wrys`YaP}KaQ8UksEYNo;@ zofaU8TbkA;3wI_|==g9ai?ELne1wUF{P{Rtu7OSuP#S^pMN_eV^WX~*;%(Hm5V~@Q zi4*lp$Cj-B&%IPAeCM(ir0j^A)y>uD)}MTV=R=th+oyvQne+Q&3*8XNkin6%IQ8VX zREN6PT*Q7RZOz7HjT+JP7{>+hTs~pQ`FM~`e=8kW1p=qX7ORwh1JD3dObrJrTd&sb z8U=#aoonFxw=(PY)88W4KUov6lYM`Gr_sGoZP;M=Kwqu46+eB@pMB>!$=urQM$M;f z>*-`8G4)vIqWz_*MU11zO~G=Z1*gOKq=Zfwe(|BA6URn&W3KhF1-+b_Wcm4L@`7(s)s zX0oaKzw~Y<2U#>fi8<(TukIK2p+)e@9>Kf#;!x*W~s3idT+Sv#>z~n1G@t`A0NiJ#%tEn?oG8{kAaF)?_^dN-~=M z#_awX<~&r#@EUn3tgO!Mu);b3YABtx>BTqD>^a$*rP(1#k(_e$dbNmI=>1$=j}ii2ghK!eEsIoYp0+X_|dpKymhSe?~=x2U_TL zrG4`)awYVeQiKjY!Q(nYkp4i5-K&~}ocg_V0)DN4Ry2if?=Q%}?a+~~{}*(GXQsXJ zW1rI;rb;qD{Hn0a@0=aF>oesxJD34zwLZi-SB&f`tZUS{I&Ay)LIByItgm;E-_E@t zmD+Kla>|l%-S8w&LIL3cUyE5VaFvsMu37HT?migdJ3(7CDG;!- z?|grRq&cs2hyY9<=?B{mR2V+g6ac|Zhe;SL@86&p(HNY?y+nY(Xp?O3VrSo$srcDd zI?oNo_otulHYHXv1siJq^JvytfwDW9ua%3XPJqVdZV{Rn$^a91-wv|z7Z`fU$_O2~ zMS}lqR-qap&nRj5Qi9~2D$t{bU8Xn6Vt+Jt5;?98kB1G9he}g&|1Us!crd~Jgx#!< zfA4r*)A-E!{nwd#Kq)hu%JALYq3&7wlwS19!5@VjaT|JpYYqX$F7m8%Qt45ZeKH^1 zzXld2d&42q8~Y#Sq6ws3gaAiHe!zojo%j4zuCWT=XVX-LMi?;~gvSJ09@O zenNs(RsuqSPHOK%?x*tSH38~3phsyQ{i4+#wAcvHoDB46ZEJF#YIT($`Ji z;el72C><%a`Zeo+>pBt8RvOa0q{iy0{+zS3?~wd-I_SkM&G9aBYW^-5KRc-bES=}f zN{IUP?zy(lk8dC}bE)L~`>qmZ^={g?d~%FBx_<{GfRHxv`YHZfDZl0%$4w5+`{Sc* zM;Dx)Vgvavm|o83zPVEPm1KXAY-ap}V+TEFZ=UcyAI@QOY01)4YtoH}S5Z@(rGUR8 z(2~sL3x8ip1c=SrS_|C3K+f(f>gXAf^*W#y#f14=fYjeP_Jj9BmvopGOtoV5%%^Qc zJ4E{!MBfUdnx7%P1=Fw9wFK;4LKe^Es9Jkz;fF52lpEsF!xr{xq2p}25Ntk6c!ZKoLrfw;`%DptDZ*L19jb1B{`d`WwX7LcIzS3%aP4wd6(0N+Al_~4lrTmcll*3Mz zSV~~74@m@mS3Ffm<+gEyg3)}E;q@RAxAo5Y zi4_%!+rXW*MlzeX=nm4>dncF6*P8_1Y<)XfxL)T81RV};ywm<^=%L~KBYM=SbK&4q zco*ik$Fw8qqV-~}DHmRV+QpY#?r0t9>qw4ym=h)OeWOmdB*eHeRY7d$RPemBKfjlI z17PlczLPJo6NfU8udWTWbiK+vVtLeH`mwocuIAHECIVWnFI+SM#@IAlmJ;!5^G-Gh zD;_MtYS(B|9e5F=%*(`mH^WWiKU(6pvY8kftlDz6R5>H%?@}pU8E#W2_?SK1 zFf?oZjjS%3+z9Ueffzvd^F;_(nx}(-E{sJ))C;5R%^EfBatzs_thS|-)qAvMzG1pX zo>srfUY!mH+#@ZPse`+GCFJU=-h6c_8L(N7cu|!Fj|UZfOWspFTA8ce`4F-O^fVqR zuMLZU5%1MSPlqUXZ3FNB*~{%nWpWI+qbYwQ9XKResRX@TSTH;v(PL1%7j-;#LE-S5 zFWI-mXBL|A=rf4O7d$WaHX4iwKowrDOwbSJzgEG3d!HZsZM%MOZ)%?-#NUaTvCNSFw;67OD}ZNv_O@cLF!A?{~D{e z4Q#GjZ~OlGUAo}(V~$Med`(KNW7m&kSEibuu0b{Ln*PmNVk+0r&X6%+{+@q?#|8=; z5k|d&4&leCyE0ehp+-04d<2j?fd#rtDr}9j6?zGACZ*(tz=s`mY?3Pwwip|T-cOM%#>rRGp$zEfi3gZ!L$zmF}j zNh{raeEn5zi)$*M$A_9)U0sVqXLbG`!M=T0`iM+Yi7o4Q-z#1_n^TrRE?ci?SXPqZ z{@Aw}+A7Zv_I+^kai8_bG*^I}^Lls<^#p?9BtvD~&Dm);Hn~l#f;PXCebY0P8N;U{ zTeo)m$#ioEEt2QzSr!@Ac{S-2XfCtk9rP=;&S`JKGJv3P+pik|NF7{szKAfRnCbPi zyns&X^sJJ6N)uKZ5YQ||27lzuJB6PJJzumAljUC8|LjuM!fz|0)XlU5r~J{ZeW+=m zbBXM=H>g3SXuVzQs%*gv5=x(D5hnPP7DE#=*YlC ziLG&@TV`i5tCPI%4edCyr`KqK7Z}DrM`HiOz0`sfO|U#b#c)+AxRpDro#@%pUzMAQ zfg;FVm|uENWYoER@b~HUe&c?(wu$qF=@s=I=24lvB(>;o&*P*$=FH=>?9BA7OG2*Y z6v+XzW1koHtLD}tUWvqtkZ-_GLZx+dH~u-?#dK}*WSmmYt7!#kwJ=NnW>m) z9o=aHsJfTzGq;QEBoGy7;f>8ws{w!G`&{2?FofH7LuyE^Jz=d_6y91JbFPt6BO=F0)Z>ukqo%=UJW`jMTgSe6#&SlNkvwGQhLO_bTp^~ zba8&b@?!fiC{Ups#v%}!z#Gw?`ceG&N@Uw{!_S_J-gdD3lK!}}hO2(F&HAnm#q!wt2OdvHt z1_0sXQAHLdu+5*dp=$m(tgBSM@nkwT&;l^IC~d@97(+NeTP`oHkH99y=p!((0(f-U zKcz@puv>t9{2A7H*Y_WHLrmGXesa7>+R5o{Vm(O>ZJPkeJw$k{yn$dXal6u0c`<~s zU-^G{f#m_YCY#U0m)`3YR>o~0TrF2j>cvfWdKJIY5zmp)du(H2uT{sWj3Z0+Vw`=P z?azI)y8Ri=X86?g_-+5mY4pCLzP_mTj2@A`6v9=2i@;h7L67n&?q&uR0b^oimK;nd zy?A^?%>YBuY3_YJ9iBn4V?fp9hHU?IsdcTbiA2nPxFm!c8?_U5U3~lkaSAh^(3Qak z47T&Ktlij-*&2CtWzh5@`McOLO&t@8!nrg%;GHTIZHe6Rw$GEJK=4E0xg? zDSRdpTYVQaV%vjc-LS0``TQ5}0L4v&a=sHOHpcK4RYuZIV~KFMivE5B_7MawC~vI^ z@K&G|TV44r0g}&;VIMwwD0!||xjOXy&OKc1y-vFM|IwO*55d^FIIA<7Y`9Dx*>--F z$h{p8j3?FmkKTVx<5!Vkp8bQ{K&pXXk9#vYsM28@MZR@Y&W(G7l1`T~FTpQYm+c3W zx*7mu%iM0f<3J4-i9Uw>ZNXeka0bI8gNx*VY=?T7SS#25jiM@h$>Ba3ewZ4h;#~P0 zd=mdVGPY>^?PZdTqwb0^DSlq@2H6q!pFbhMw1y_CogHA|*sru%DBr2$L7hhJdw|i3 zmBFuU{_M&fli;E4yTDG$|B653 z$!=JOIaHxn;OOf6zNAqJp?i`nOQ$VCs3SKDxeg-drrOQDupL(NG1nj$w^^E`!0S_N z+x^{nS`E3veh>K77|4b>ZxPfCcL)dor@$~k0hU|M91L)kq4`O**T(eMUy31jd<*nQ z@eb^dauQd7hw4HGnp=JYeCK?c9cWYOD4=kPx3o_fNX}Z>K80~N`zhd3Ph`w_zzAo6 zFCUD_0><90>bj;s2vsHtC*bo&=#8|IJW@*Uo}RyVQf6IRRypul9W*SCFL7j5`A?M( z%s^C#kVXfn42Yd*)(WG?QnobDi0ZA8hkP}NgQHJf_yX||jxCvFG`8W5s!dFD;n!D1 zagUv9nF9Dn1!7>pMY&m9!J_trVY19O_wPB%NEV2I=D2Ax?jU#aLx4%<3MP$5bWop- zk@4HeT5^e}3RwdFXav3~#mh`9rT21#4O!^_rteJ{^w?s>^ZH^_$P ze~QV{#HGY;rFF5=rq`RBmO;JWpMyI@M$v9G< zpxUsBc-@J<6XaoJN~LRo*u{aZ=*`$|_Ck^bIbMm3BjgIW^|G0)JWS3uz!w)lVaD zBmbsKSuz?=#x;KQmq3l_83EdZ^ZmZt+EqAFE_%uV?dQjhdkE`r zs%1-dcGQMH8Gdm-e-;ESkyDLbft-bw1!pTU-`q}W$JKiW#QeK^{%dn^K{-6x%%7k$ zQ~Uk5*NuYguJmYoXteUiGGi^a(B7&Hgh>U;!Q`h6VoYVRoSW9_-9H8`CK&yX+_}kw zmHW~#BJ%tU_eNGS0dI)%YA&ETd*JH2zfz*ihD3hOf@bod9Y8F0Jynbcm1wD_2$NwL zIQSD>AOJgRG}PNEAwkKkyU9i{)mPNXJQS!YF^rX|$OFQThZG;TeUXt!*&C-{^XE7{ zKW~#PZ^lJ)Bcvsm8h^-yHGtp>21H|!)eAW+ImquSH=75wL2G!>JwlEJq)-qLHxfhjSW_w zQ(_+8jSV98Thl8Mfp}^mkY==)jN6p>J~G8F_s`fnaxP^m=YfKvX@Y<)JkrCIj^TAp z)Z$T&SgSDM42J4^l~yiBT0J zPOlR`7Iy7Sg)bT@a_t3N`@h1dX8t-8R_dt%sikPEE2R4cI{0jJrEs@xw(AQa$05H; zkGOWHcqR$H*4-v)Kd}h>+k^4KxnzXz4HTnbWy2ps5b9Df78I3~+p=iBM!)X}L3d;x zqJpsI@{D7J*^~?AqeLLUaS*%WbU=c~e)z3(lf*CJ?=01|nYL*hc-+^C!ThfX@REWt zTOMCK!e#+Q{wmG0bB$*$#rxKWczzu!IDw56PhX%zhsj`YWsCz9?d=-hsz3vPfKg{o zO7zLZL+%YU<=&Ofo?kJk^0NN_FX=DIs#uCXv3yXVl#&YB*5*E;r)xes%ohl)y-P&i z<->DP4$^4tbYn^~R-v6iLE=j;{AfGNLJy({i1_sR)5+(&6W4%ImE<*#6{I_pSI+{zt0+}=m{!|cF@s7PQ1p)WC(^Ja<(%CCtpa0>I{8L6ol0On8 zC?rm&`HLnQiO;chrQ*tiFSJi*yZ)7Vg=v<=;4OXa74b)6J@LX}Sfu1nZePZAZ2?`A zIBQz&3ckOiei7p(=})s>KdHa0#&|(FUi`j`gZzi!|IPa&)E>ia|12ijm>Oe7UkAP~ z3qn)W#h)0F&^=`*MX?51^T9l`_CdMa$-v|7)(*)orS~%~yBA>y+r3~EO#(rc+kT_< zBHNRjaJ`eTAbxTzP;FQM3r*tZ^Y`0RAgas{`rk4kV*QOM;7<^Q9jPvs@}sh&=ob`T zuNjxacbBZ2gR%p?Jg@Vvk$-08I2{OVt`QUZfAga={$xs1Ux5%-Sv%L#hT>cO*%kbpM3cq=7&t1-H&11h}rtc%=m$Z z)7e`FoG}E!k!85K(N8|fU$P9C4ZibW;65_Ynxm_3qC>946`7Ywke$u@&(hhHa8D_R z16Q$v`!V8}laU>mp}v%(5z{K++m|m#1CCYQH3?Wl|l0wr<}CIA-=mA6*|-9dD9V%(Un#S zCQxhHfOmOZ_ryHCeDgf`icrDe3npz~?=;Xr@V`&yueH1e!!b8b#uR)_Q~>o!Bm@Dy zz3)*Pyd{}{=d9^!gujKFgUxlF)JF`MC|mH>$^AY-R6Syr;buaU#N8UPBi`M%`ru4@ z1cpMO#ajHJpfEJ5#npvl7jC5^5Xx`18@W_;rDk|2fQzn7qeJc&8`lXyND6Yn`= zjs}c${)IIgcRasQ_RM86^62!rq<^O`<U-&(zI(tOyh3J(KR||y@|bSS*z&k>&>+pb17>jm3@hmc@cJ2K)kb69^mBx-H=ty(V0fs_gan;Y|iic?%n+IR6m4Xmy% zN%2P6ou;B|LDn7?*Q{{iyA9T$8K6tci8?D2TMrsom*5})DygwFdJHuAp8cX)U{xt< zWzb^M*1$ClqYc6*-kQqQn4|MKBaRi4lNoNT>CU7Ae#)S2^Ui(G2TG%l?=^pJ$!Xo= z`uT@SAA#O6VgTBBrovb!E}KVxK{L5^ra%PnZ;TYJ7|@n|N&-I+g#MQiDWD~$ALMZ! zI)XDbW205L$%&@BRQZVRiQgu#ZQa=GY$Hd6s2@uMboKwNvi>d7e@$OvH$&jni4+wr?tV zmKg+PMm~JKZg*__DC^Z+*zNf`SHx_N7D8=Ta0yM7d{z7}{~_}B^_H{O@zZhHeZs=+P3k33G?0vEHhzcS$f!}oLa2`u}<|(^2*eztWAGvD@ zcri(^*&putDS)7ol1!nYxdoR0^cJT=W2^s81pYo@!k8s%k@ZJ`RO&WQdNijPXoaNi z0Szz(1sGZCQxXz5N5fR4P*DF9ZybWop)K@S#PV`m*%Ix|COr#bbAZbZ!<_aC<#74Z#<=-!~RWyRpFWlzBfx|3}DoYU}0cIRC1*+=g)am&+f zw(0Y=uRSztM;6q5mUM?925M=qZ2M}M3~V>qfdcJBU{&(znNT>hG4BT4aNBOr-r*U< z2hJfmarkE9rM#FH`cB~KrU3){R(D(0jbsI;mHYb`H}X|#3;<(G9X3^XN0;eq4TUjf znVE5qTpQMtzuhmG7XLcMJ)Rnsu{ohsa{t;)!8Mc;kji);ayt;^HXLTKeYJS1(-QI= zAhl%Zy#hfUUeoQy6s#Upzm52*iPODj#J&Rj^)_%v0e)ItF#fX^GQ2)!RHp|f1!EtQ z_<6rMCd}-(Gu;G?T&~?Hic6UYrtLPRK(!*&Sz9vGt#fFgJNaxQhK3baZ?{MqH6E3x zPFHVm!2&nvlb04K%&0)Z*{VZ#nJQnD(u}4S<-1Rp+|5-Xxahld{*ZiTAVJ5|X<;o{ z$Cd%m+i<%pn~K4f{h8EN&5AJWyi~=b zWr?SRolCxk(~K(;Rf9go*`bL|sM?9=o#Pd{JBN?OC=Qo8SKiV+TR1N(Wcy>&aFS24 zk|_FKX7TVJgsb69g`Z&+JXFkF+b5EG5xy_Vt2}vMLnYB0TSi$38FlmsWKVB0XbDDk z*8NOzelJg5CICxSWXAqV zG?w=J{>9~2-~BS2c(=6YVdT8*RqKBjay_7}6-6&%;IYTFUzJdtFV|pLAlq#NtEYE6 z5;o5rw#G|ye+2)R)tyA_HnbaBoN;)+tiV4yzdY6`$=1@%kL);MzwNz`{Awlcs~SYw zmu>OXo6AwQCCaAj(-57Rl{qfBqkEtZ`G;dR(N$qZU3=T&eXh$0T+&*I7JA{ zoVWB(!z2_u`{ab&Q2V_ty!oZT{|T3k@6w@5rgmZMm`-~|}Z$)D2 z%`nLf;(F!PG{JTSX%d8l3)0+`{!WF5m|hNU8QOZ!$z&4FZTm^O0AcqVGYUvbMp@yp zq(qePXTX-$%a`XXmhHRgu)%wu*> z3x%6Z7W5TJ@dS=(<0>e^!!t6Ie)m)vxQFe;M{8otJE zUH(JB$h0$41kOMC-$v)F6f(?(`_-=wgePVQr+{pmz=!`21aG>Huzq;e4A4jBzP7%w zPU%TVEqps2CO5xdRy9wt`ej_{nm#=+Z!?^jXKQ4`+H+6I7t<4F3&0(UZotcQGL}gR zUqLFK!;dIY-(v6@f>16NnM>7Yr=cZM3a+__Y)oATGRBegRmFPqFBq`EGXrnt&FL@np zvulTP-l%RQ$>zf#ZoglTgR<}K|6HnbFC4NXOE&*|n+l)*O)r#|bYFHiC;X89^)nXb z;pB2~f!BE84fn8!DeO{9MGOiYAA6?Mgm_1_+L({Wp`)1b6dUATl;UQ1{OX` zWkJ>FPD!s0I_FTizxIC=Hy}5oziTjmPPYTq8hAhM@1sZ`wkMhV7VLhWXIbmdwten3 zGI!V7&kD_#uSWH4v#UP)8|n5KP~JXf_q*ooBH+^OoWhhtwW?n4LvKBOCZ6nbLz)=O z#{~zE`F&Z!xY>%^VL(G0N3nhAT^^TFC%=+IAJO2YApSVceM$8tsN2c14)Aj%)hT?1Q!jQmt zIN4<0x3xehYh6w3O{ngiOrKK$7UZW>sYXf!_AMo{lw=#ulW1MfH*i7Cg5p#?zN)=)M=#B(+~|p2Muoo zA&sJvuv}QVRd~fQYT)qYnO?8t&3UhxIEK2l4sXe&2Ac*ElnEl&VP6lijQ+kxTB69; zL7w!i-&gUkNA@vOWq3pUB|oFmEv-QCSQtrYBMCfH^MSQ=(@lGR7v`m>vZ8o{45)1@ zFRpVb)qw(3p1EO*30->a!5@Srj}7T`CEtLYwUY0PRu%)GR4UaA1HBeNlCJ@&koQN^(@3^s zr{4+bq|TDr`A6zt&^PM~DT+1noPmNp>Cy%KW*_+DOm6gQ&5xgVMct`ge^)P;en!2_ zu}$KN@qdl`$`h>(!nDgXC3C=(p2ROi7|(?H zph=`IwESc6P+QpO$Y6L$EA={T;5Q?xhQHew(eIgx+>yNqq2_oLe<$ukiam90nyRVH zv@#`!r$BUJ#$n5Nv~8{9GD3FGMaBVu=$&CuW`oj)jOFacukO$sH zba~(AnK?9S$l%#`vct??b8=QmI-_a&q(B2ZzAF_3bFM=;=eQVFrn(2Z6s&*#{g5C# zdXy19pi>1@CiayZ!vc1j-#m_Y_dRIGE9NfSrUqb$t#iG1&r8NR0G*UJW{ok(gM_H7 zGvu&nE|#pF@iHW?6U`h4a9s6;t^OQLJd^)e^Ek@!4BRnVif3oUVu7h(kW>&VqZ^Vc z1}qfqzuyc+U;=;cQxCW~>&R9O%#=!f0p-f}$AM1&8D-M<#JdW-<7=jqPp! zys*qH#Q-}c$t_`hEnhYy;E6#o-RbATw=y^0mBl~@ZjoR?+>*SD`!AVjSGj2?rhNqo2BfYR?PVd_ux|;=|L&Gv~j4ms?Du z(6H05>-9S_weaDWx_3=0SjhPv(R)?2 zcw;3QrqkGxRuS7~w64WOIpvTmA{vu%{e-2M-j5uwkj~fM4*FT;T|zP0w^MMPAf(*E zH+T2OktO*CZ@TBl<09eDzx&MwCJlUt@(ud?D~0SWF-UpoU-PH6a{MvP*6cj?ZO8FH zbC1-Va19lz1=zXoEBGBdpq9LId?M$y-1dZatYY?Lm@2)VJ09?7n0_JKE#FuqsS9zM z&Ysh#6WE!3t&|F(B3$OkX~1Xw3gvWE>Yx#^loIfX!>rEgk4wxdF)o$8z7dtV9AEcH z;HFq92+~9W7Km>5cO-1jSM>p889wJjoplJ4xpm}sIWP#S_x!$li={jz5HSPS@ToWR z0N~xI;W=0vcbsTPq`~Y1LZ4o1*xY4Mbkj-VX%bUiptc}{>6H0@b?Z;0ME0ddk;hxN zWJ3#|86wJ6+V1ni#==ys(h>wqQAY@ux%u#J%p%6tCCh)?vT0 zutg~_vc>!JYvHkJ(uKAOMon!vPwdQ3Blk(y05{d{-=V~xT_e)y!7?1Rw~WDV#e`s3 zgRZ$@=L%v>+)}L1AhszeMG@Q>M7URbLNKe{)5?G3cpTj7ZxxrgpEI)>5!0hI7eSF5 zmdGi;;{|j!1L5rKTcfsp%sf%dZwyYee%^YGla&3;OB`he{2{AGht;%Xm|S0sr;;Ii{ z{8OO+?%{N~HB`I zcoilQvE4{+2zsbmdtXe6e40_w`GflSVnlNlxcIC|2sp$jEswWFaxUQlK;!%Mg|k_! zgqT1SPBgro+c!N^UL|Kn79-#R2YT_`HR_ zRF2kTv)oR_RlZu{%q{L#klK_`bCY1eXLxJiGc)4M>UHQ;lMjzYb5*MsN0R1Eoqy&X zhKh?;pTdEcd5pe_&Mu$m{_5lneTYt1;)2v<#ix8Oi`rgBDc8&BWYlD0eT49$_7tlQ zV?w?k&NTLocN_f83$N?GOmvMsiF5i8lDpTZ%&`z$Mi_gV{37e|C%Y1kPMrO$q^X<) zE=06p-P+$;)HJhokcCgu^1lJKov|?UTx*KCZy$~xKgWFdqd`{pZEuzceIUbeFo5_? z)z|a^z}c%ekqc@t++*E@#hNC1|4lUx^$J#3bv5qvxBi-sH>JSy7JM6zt5q^xNR=FA zLS^{8>8h)9u{FUiQ1ca?|hH z3j^xEMS(u%Jg_6!2xl7r%T_qQa0IDpIwZB^Cx_@x_r8Vrcd{OxrZZi6;=u~6ozfnW zCJ{4C9G*F-NQQvwQ>(eCWJO+?bY<~1s*&ik#B#F4=hxf$rhyN``|h2}KOF3b#)u=e zSvr8uh(r%KSF<7vTvZwk*5joao^0E<+=B{5Q5hjJ6IkfpI!JI$HBan2KN~FYPzy`)b=C`kUE2QY{l;q#2X;B&> z9hog4+}2=R8Z7QE)D1fQ8F3Z5KKJ&ReLwPjf+x`O5I|U8d;tUDy+9MAkz&<<2s2dp zgV{AFfB~eb)%(Wde%%|#Px&ry350^|ip6E<1gq-Xd=5R^B|;{9g7l;C0UvwzG8vuL zr2w41O0YDzZfEhJ&};kD?z9np(JM6W{rod{Z78}YXXU4>9G^Ml^tBRUxm<$hv)PkK z5cKmdFCYU)M0^y@!9U9DW>H21`<`c$o6g{J>A2W_?IBYH6;wE2yr;-!_`!beH$}RiR&#rrObBzpC>iAcyWf641 zHN{!luW;4luQ5u^_aP&DLr(0kC>07^X=}+u?X>*0%9uj^(c}2k{Fh$2$?|g$X@+~k zeac7PNF9p<5MCD7TeJ`?3xdC?d!)M^tQ%Brc75;LwHyLIeVru8o{aeWLe7>YH6A?f z@Y|Es?6gp(_!2-cBz!9d5VdPs5iq}^9kr@ay52DE1j^sFdX5N#8}Qt$g!F;x{W)79 z7}KoXsngFrUSFCC{K0FyY*yU6adw|mONlVUB#q)dZ`ZdFU>7Nx_)o_Dgm&BCEk(03n$`b)7DigG{>TL9w{O6QBhm3D1`>lF94 z2@c8_D{pC$ZVI^ZQN($lxa9hf1SPO}^Z+d|W~=)()9VPhA1K#3e~fY{O6lWm5|xS) zgV=YC?eqygZ^v#nsCi5OVrtueQpF`ZFR~}~P1~uZyM5>jYvV?gjyS#Go8h&%c9TD> zWZ1;tvOQvaSkSQJHpxz48O2djSLnrsv)6V-;jsSYXy#2!*f|R=Do!GywsS(u&==(W z{qA*=g|hbQ?CJjfOHTDf7I?^~?7#I5-TpURY*?fEGqct(I?*)^21+PXPU z1IF*cvPo&XlkJGh-VzA-#8n`Nt~PcVmx<3Z*QuK@$Ef1Z}G!= z9~#`44-(rBF)9%uAwHisPr49D3nd;@Tt#Zv_D;MjhJ}gx7dgAA{S%Loa53kVLf<$2 zvV)EKnz{Dn_=RBT3@*HG8R$s-Z@=T$@9IBEu;gnVk{jqGjq(51wSW&(7H|3D)xndcMqwCm$uA>?1gfMN z{r!$QvOZPj~>ScSS|spB4Z^th?OP;dgi(-@r^#h&{XYUJNla?y;pp5T_42 zl*~EZus&Yx2dkcb6*o75I#XV6bY=sjtk<;zbk#J!pGwYlm51%Fk+^JM{>n^Nn~A|Y zb@ZHP6t}Od_4UI9dOkMVolmbm{RGhc`U&Dzc#j~!6C(2=nBNc~&4m0$2CVn>`>%U^ zK48%R#;~nI)Awcu)}-O31A?CdA_Kq;F?vb;uiqa2_+0RMYEapO9M95(VGC{tOp>1% zL(iYT{6}y#ya{|&H@-TwKT%?H`tZ_(8ULz9X`zbA^ zpff}}^3)62WGHMCpkkoz%rNpu*EfIaq`_%B_$^6Rg=YkPar3N>#z{YG)q>%UdM~I3 z)Oo*Hxo6&?=a!bhfO$qic8;E_%Vxs7C~o7KTzY^5N;P-oJWvt550UZ$dcl5Ro>Wn$ z0%4dL-5(Z|J*yE*g0F4AdWcR0`A}wmzG`EhwBgV-`v^&ARsRa-Oe-3 zOD9%x6LO-=d%9?$Oy~;-mR^jJ3LR!!#k}4t1VGFMu3jybWcZi%LI|JmaIbu7^>aU- zS;#(pvX>oJdPpDT;rt1RO5Ih4PA_+Ba9GVxpzHs&jx40<%Ioc)tv#iK+py~Gy8m46v{D6)ENV?+P7&o3U zszk23F*=t?`c3M+KTpBZ^KBxJ;WAI>uPH@JC>K0!s=ENYEeGfG%|b><`2?WP6*k$H zOiF9n7G(u$a#x>w<0WT5SLUb;`4WR)&J0EC8IU|lUAFA^>7y9*)jX`TtO+(2gqMLD z_cY*TZyJcFEO(Rw>LS6hiyc-?0YXv;PnJp?uZJJwINzB57&vmdzc%A1+3ZwvHWUf+ z|A9;{3?BD}i}IeH8}9xMjGYGrPAmQFy-gXm+h9gNS@%|07y&QM8=r+b zT15G}BvG6f-@R~R+e8n^puzr0mQbS}?oe>CWz6IiW_ihe$nEHI;3dkD@>7x63A z{q91MmDhZlLM36iS!3!!8bv*g;M^T!)t854>)R{gN6#u%gv86~KPNJdyyj56^?_`c zkL8AA*87CyTkUL$;9OT0xlL8=OZB{nqn-H!!_{`6OSM*gvE7(`i83e%sW#tNdwnea z-j(hQ7&q~cDg5-V^e3mmZfqzqxWWN%8AVF4qf9HKhLYCC>c^sAqzL|UdY`9(-w_Fv zAw;bnxLjM8UNP_#;1t-2V^@L&mHl+_z!zCB=;eti#4gG^YG7k*cot zZ7d&6&nIW(QBOdkj=+qjg(CxMdH|)@`{x{eZ2m5|KWLNQWv#EBz^N!wi*Ssnf~)zzAS4>r7pt6hpHcA8ferdx zf1^JR81!GP+Hx%?{M^=mOOrwsl(^f<3X$$8eow+2F#X>P^xha?rs-9pvO9h*<}ald zw(Lpqrq6P^gR4I)WL*uM=>vk-JyptTa3#N!0)oP+8pM=TOEgIjQD;4*gE|UwJWw5b>pwoE*syFP^z@j?NVLI8 z&|Amf^^9`VZx)dZgENR3pX2M}1wuW2=lhd7yRAhtyZsX*yWL+V{N8CzYrXUt?y#-f z3oa8-@a+nQbXRgw$Y$lgy&eAj7B#k5(NqV4Y!EH_pfbvW5@SFm=B24JYRBr^gC#Db zr^CY+&2~p8qVITz^H?^7^~TIc7Z7aAgLkJ$m(MT1GV%k7Jb&^T{$~+{iim)!~3{F$m$-||G z_*gC8Ve+gY8Eem3m35ZWb^|upfMGCj)M|M;Ao{-^3h(|a%Y`gE4oXG(gp-ewm9e@x zK$>F47qs~5#Mf1U>t;lA*UNq;5w^tHq0Pi<`@E(=UR$knO-0DfgscKM;JjYCqvw`1|N=1?95ABW7iP$HG zTsfRG4TJ{s0ARYKP+6J3w23Jz7b==^1(PG5K+06VEmUt!`8|*w8z#D z)L5qhQn`DJRrFzb^FG%2)k}fOg@0Xbd9I7&Y@@6|19ZdFav!;drfDi^z_cBMU(b5m z$%=Z$(*exYdIQj318mnx-~e@$gQr}J4<`h$Q%hszIf|0+>zB;BDhh_3Eh)UTwrX(h zsx`+7N8h?zx93~v>#_}&nkDd)Odp@fhWdn&$H@4#eiL(U9b#p&NK02(0`t7#*->|E zc!4wjv1%0T`|7Pi{?8Lm(&@f<%E;SpQaWg-75i@To^Y?w+scDcD7dkms^%V$?0L!u z&}!0lV7O$1usnN3p!Xg@YmbVZMc)3&_`cTZ&S0%}NDWkhLNhp^XC|BIbZgQX zte-^{Wu-Oa591^Z7?rq`a;-LtT?r_py3f>wkipeAKkuIJ1+e2}HwM5TN06~PN^X^2 z#guN03N(G=zE8GKp0bu_bVF-$*H7OA%-O8iPCC>W`;<_ma!N^gye)Fd07S%QZPdrYA5=c#3UW#|lr4Su&Aex|sCK8K_iKhM&T0 z)P`gG)q{XMfT&hp0x0)MylBAz0v|pPGz9>>Q^u4d#5GRZ5u`);cGD zdhFz~xus8_S#iRvb;HtaS?*=>gdWyzL4sT@Wjb&v_M6w?l=r_&Nkz^_iUHmeh3LgH z;UNl+;92tNrxSYr?U`BzbbIuZt~CJu=WVB`Ti6ACS?uGel`lYVwz9!!dY$^u5(P%0 z-`tG%M$}`sGz>G>3DLLv`wm^ITjufAM97$!YJ%zxq2zbNp1ZZ$-Z=y7Uc&^3VTa(s z7n9-@E_KSyaq5PqBzybKU(QSMVWZUQRc9zVSDsI!MHKuz5Hdx<-D6qVPPsEqd`Qiy zP$dgBS7kCY=UwX8?jjbJl5b9zk-ep*-Cw)W&Q6X`E(~^;EYJKla?lRp>(BD$oPJ(? z*S9k}-3{JHKh9`4JRC9FcGeL_%+y0ew*vFd<@ZX|k2=}V$J<=AYvze*t?)llY7Zb@ z^c=M<_oG{*Uz<=u9@*$@Y-C)>an6NqF!T-Z_QZ*-U z;ky8hRjK=8R&0P=+Ug6Cl`~KtL&gfcbiI+;G?O!P{OT~tb#d`3?n^hnWnGM7Ld~I-&!LG{Ykl{sC`Fzc<0VE|@n;X@jFf^5OBunM zRG5%Pjb$bNE9KL^>>hD;OSc{^=lL`9bCJ3Gq&;TXNr_ktQ{DxwZaS5I?khIth`dNI z2$*_MllXHA^k(QMSRZu+!Kkf6JHyKd^k1D4o&PH2%C8w0jc@BPH3D zBr;@)#cywLC#L@A5%i7H12BPB+AA^5?r>~sol#pvYUtAXw754N>xkHyH!{`31V0TZ{Lm-imnxV-4`I9kr z^ucLAN1DIn{1YB=-I|hd8*yR)uV(HRPyvPIX-&&8Ifr#0=eblL<0V7#68r z2pS|o;iP`0_?N&*RNNV}4rdNXTlh&==}S}LFz7oqrq&}P(&hN|-yw7J&N|p5gHRf& zoKsQn5*u_V0N1meFOYl1uU`-gf*=3#Yz}0Zkt3+P_!{LrXwLp>bdI-UQ*y3RQKq2(X7i&~GL!Tki7Qwl z=pgygoW$g^0!@J!bek;fhn+upkuXf?PnkVA7;fq7dY!#qO+9yf+YYgghnnF3G!G`fe-Gw}qq9 z)qQ%kDT$tAZ&n%`B-S??tRi}IvgH@v zBH(9@(H%8^x4_&US5j{O%(K*BL1gmS$ynxwGHxNb;z#v;gJ@jWre`VZn+Pjed+M8* z>s9X&QzCMFy=eHaAO*tbT5Pa91NFAz_-wVQzpnvvo32v+X$Yg{yzCYdmpx==ij+0SK4i65< z!s}7jJ0&Yzd=Cc|#Xp>GpQrZL*9|L%?~AAexhr4iznnP0Y~a6CM$PYOEbr`HrTY^* zpUI${!>`0&e1y;K$)L!3w!I3zXOiwNY+WoLigSey(flbXHuVOfib4C;;6ZyqK9CAX z?*X32T8avD$oRxYMN@I?}T{x~7y@{2zw_ZvW_LQ3S5^i7M&yfW@#HJJk(%@|K%5Z1`Uy*jpO?LKaGCS%J@#k zsGferrl=q|qliekE_2o(y|KBIY3>B)$PgKBzUXkq#4GWytoCj2-sTW#WWDxcjXA8v zsw-{%rEyBc4x)ZXY^lNFTy>}Ues(CbiRq#zz6{T!Q?WO=l6_&y=-phAQV_4;i5W1K zZZdF`KYE=Xj<9BW;Ax+RRlIEtLXp9!5FVnI2nDO(* z8X*K*(XZCFX1#bPXS=*nJ8pCS1az|NIj=i!`!2~pJ0ZVH{Z(w*&X?SB4?PrmGDS5>~VxW22FzI z_CkKT^9vZD^bY--97xqutdQW1*`$4)eCno)cu_~8j}_}XQ#}P{J3(Pb=l*zgDCR_v z3~%>_k(PtZ_4sCGd3mfV&(*=i#camMO_&le8%Bne1g-#p!L$s03MHnF?PbOb(t^mx zeekLG88>APILEmz9-dewUPUxtBV`q}cN zK$5Stk0RGCm0%a)2Logng64s4Iq1_A={SjPH4mzN&Uxr4F7h<;S6>IPgQ}3MwO?Gi zOR#;G8=-sF+c37k-g&U){9^n5fd;;VA>x43 z`f6?P8UC62nI}GG$3y!W&}nZv<>R<$R-YeSb+ckhufMdHq_CENnB~x>w)syuuYRS% zkL2P&n5w#0kERMhpAy4x-a*#n0CCYoR2G~D+!S5}X*dQn&fv=J@x=oMf^9FD0u|vo z0rn=a@Mmq!z~7j7K3u>}eZAPTV5|^pBP-J=p>fs&^e38T1xN zIo{iW+m>9dqmM6EF7V9}T}A(8M64HBsc*#~z;vSCFht5{TF;!+mKgYQKhGN_OF& z6i4s}Vb%`Z-STvl29$??w@ZP9iXO585X*uoDhvVnBWS*8FsYz93@R13Om}60T|D-D_VE?F`hzT>i;>(KIVXe~8?VpaT9Ay4DrRVo*kCj2f`t00zaZ+eE=g0>SxE=Wt&4S?bOhJtzvFqe z%!aCeyVx3BC#r|?d!eM|8FHHsqzdvoKGQq9f%VPq*9;(xz1B=NI7(;#MQ(u4Tv3 z@u^~KW>-)ZhS{opsZ zkLnl^O(sQWIWy_x7*_BaFEA>3x-;j4B1>b~fhRR&$4@!zVX=iY(FuqyIuy$NIPA8w zV>LQ2atg*4(k19cC(_0tr;|(>A1JY)s@klw++y)>MbMkMNZ>e_%_H?Q1H+D}(V0N=0So9o-L_<`R+N_LL@jqdfR&I^goVty*XUeVL4Oz_rP?TLUyTB}{j!&eqf@WkjPd<_SZTkTLpC2V_bVaYJxzJg!dtpb7w5AY!k zyUOIjTna;(oIF1_dmf*8FXjm3*n|2hx9L9-ymAefcca2DiH7MgrkkT?Jz|)?{eq*U zSbW(FWm*s)E$`aA@|dOhh-M?sYQdR99x}VE-Wg8GG1NGpCpMM^oD*vqOqJGJfw!3I&(f%A6>f|KlvDe_G8()TDwZAo`wGR4zDyD zp`cPZUc9vPp{e4=bp7x*!zm#y)LD~nBomb3JusamDBLu*`aTmZu#60!*{2Bvo1X7C zJQ)8@&-CLuYR43W(Umit0nLPLufCW))rdTuToZUMsXDmkrOj@jd5O;S9JK8x$=x-Fqd_Zs0vyOYLTT2%pb7 z{&O+(kWZbYpDE$RP+?^%FWGtg#h9GlJ9LQ?rZr>qYvRzF-AJAXF0e6z3q)xh2JlWWmE z>rMh+?NR;jWm*TYMy%& zxhEj3f4_M@S0A6gX8nd5*WYIP<)vNoLrTE`Ip-34X%olo`#6ur?*Bv7nMXtUzj6Pb z8BBJeWN)#{Qi+Uh>_v8xVkng@OBve;BMD!j5VDRTdt`}>T_FiG*6bu^?8}UOd+vVE zdCv2vV>#x`XYT9zysy{wevh72K9f0B(R8{uG)L{bWp|U$e$U5iZ*y^uObL=dA6trb zZv=MEJf^>!fjyaH|6%Ya4hpJorf)t-%;BH;$7=t)JELV&yi_?966CAldiK7@Wuy}^ zUDEdTNx{s~RHn*mnAhUp1-K+_rWFanm~Ym1fK$ZNI>Xssl5E6@djKK!3BCyYMnCDs z4J9zsWNC9!9qYlTLk|7&0cj_f&hW|b8CDh(bf5bQK+MKH^#x&oi4vEE36mF0GRNCv zl&zW&F6?^C8TQ;V=Dym`1$Q&=O4IS1$vl!FFFjzp0F?BSZm6HlK|?54HI#L=MB%Cp4{O{XDhmf)y9tIHORH2d@j^@?&O$nlLfmDG1$;oHu`fb!SeZ`*Ksvry2@LE+$c6bMfQAj~3ba*);YaC;@PX7f0 zN*Lqs^zR>thQs#(gfHIB^Rg=w(uDt@pK5*$CoT7nWKrnr7cbNp2Y^&K%@;dB;Ij+1{1ki@&l;ND7cI2E^=)O;J z2KyT7>)Dl*qXKwiok)~%IB1RIH2DO7to7&ya?0jhB&eBDJ;t@8d@kIy9u;O{{xF8nPQ`G>FCWu;An0`Hc}YCz6J`ydP*@E=bd zfEjAGQ9>%++UR@Tj@PxA0l>RE%pu}s1^lhk5Xs*)!+naf=GE!;L-D9wD3p?b(mJ}Y zaYBdL4Zlx{4!QA1TSq|A=|3Lz7=E9uFu0&B>$R_^dU|ll!ZOA<{-%E2kPwX_u~^QS zuF%I{)@|o^Ck6rxGS+R?kbYeIVV!B-O8lAm)MVTLP`cB$O30}~0JQm&-!;D1TPH*Z3!l)%-SuaNn zwsj<(^P$(Nfngc}e&QwgA^R;>!x~rvkFr|ym=8MfY$zp1=(ezE8RLKKFQ z+ppPy2^O$nNz_&PJZeG7tPov@EQ$d#{A%F9#1}doJPdKT1KxjqkhBsJRS}}3?J%r4 zA#18euM3UM&64Q|k>W zf4BaU756&PEF+%wTZwXRcAL8yaUpL+`g_w=dR**=EYudj#v&-W>w>9}(Z|ZUspmi%22iq14CfKqg) z1I}R8)yWuOf*$L^gv?qE*iX8G?wCD+Z{A(Dx)H=?q?2YUST*z8Ee>Z_N$X-e8+)ZH zXh^c;*@g3{KCP~^w(oxG&KF+lMAq*gRID2Z}z9o2Syq2jHsB_ z%BwYo#i>javO~?kF49pBffDI#i+X~l>*(64T4Dt3*tF31bKqm9+co0Z9(VW}Bwl#d zZPUju=ZTK%OP_6aNJx8HbbRa}h$jB8N;dAwfFhLmC0FJ=pIT0{2l8>W16y;oKdEA; z{jlp^SEkbUt7?&tUi8-W`h62TxXPl_C+IlD(lHtwLU!Oy}KE>GB9J5T;h3p zqvxrfL0Y8xv-t;1#3;f?7|*p0Zyo$Nu7WVp;(2F1o$*^w2MVG+201)Sv>_!=SqhD_1 z4nu9>ST@ieEomz*y^#7_f^g7jlKsVcRhulA!B|PtB))n!Eq$d`$b}oSGHn_Wef>Wk z&yh^^;8X4mf!skWPP--7l~i2*IT5VA1BlVT&fEs48R=wjGoH{<8pdNPS#seAanqREAQJ5j!<*Jp(c zfqi4$HNgoi1)zkdy=g~iff>4lZzfAxsOq{}kBsO}K#hI+PM&`!glJ?@2OzDJO|410 z+^O-Hxv!?7o z_A1wo6}pF-3SPT7>Pxv-wGyFxT?Xv5T5q5*trHhP!?pD2EE6c@Pi@&;50x)9q8g4X zp7Hpw22Oj)gI^us`>S(c=0hV3=AVN5&2x z*z;H+X}PaY&nc~%MV2;4%X;N5K`D!T(TLU#OBju^=6p$qr`5vA)JV4uqqVK|s&TQqYWV;W#>j$C_8aT0A5y3%Rn3?V~@v8Rraf^0CM`%P{ z`;8!giRUX=o3))xSk_LwT%hg^2Xc;#=CpKSUgs(oXZ0zQuembc!QfsfGP%&Z1yExmX$Nn#@&{c(S~HMF*t(@N@}G6WDI1V* zHn3OP&s(y^!$w7Z%XEcj!g196_b<67F5@!kE2E|CM)Q0-T^*P>dba6QxD}{RuORJL z`g)&jxt2i+4Qt#`*Ualb?Od00OCt%!*@xvBujn~V1x)&Vk=IAS-qMaA-^~8jcJZ~4 zL=;MSNBVyq%~F5ED1@LdD_j7$r*BPc$vTu7-7}RF%ygrp;4}4Xs4O;Ac8i%>40ctFwo@?>PSFe@e);xSDYe|3+_=*8Ypq2vFHNQ;yrbGO%|ImB9)$FrNG{c7i30O*QT-Ig=A- zWh5NmLlCG_?q0ZPYuD?5U3ibEOjM>HOvV>qOi!`DPkHV4RN&@td6*SFapb@PyXs0$ zG3u)oX)u{T7(PWb8m>)YBzBYP5{*8>Ea6|l!wgnTyRMU!;+z)9(3j$%FQ*$D{N5w_ zuH4N(=$Ua#62$wpObdEaH)b`Cwz|JXZF0jefftmvYCSxRaL9Jz_jg1X-*l46#Xr^F zUdIO^4D5xrjh0i<0P9iY4jCjP&Gw&1K#~}g7UWiS z`z6K3K>&-frE*#|0O|d(&ok7}UbuReYnHHaN5)oYn_NNoJDoAlhe|B8- zJk-S-#`W)JFZ#cmy$1_!R#^t1Jp|OE@?Rc{uk5avXlTK;|NP@(7?kR3px z!^AI&7J1zoy+V;Xywuqn7GbNTKx9fzmt7h}%l?7zj=jO z6}y>~+n0b0JOWT9Pp)KlI`g3;(3m|mVeO)^BzDWxbY&~KYg9dPGB)5A8q>74l2)o$ zBeO#a5^ux?Z`HY=7moZ6#bQ{@D{|McwSC&3gC;zYe1QgkC$Y@7QV3feR!?!^!;7Pp zMD}nqFA2wo-Hff5z)=|K8D@eSaT}Sb%=7<>a{N({KO5h_qRb@?Co_EP>5nJ7jEhBW z{Qwpgq4-VQK{xZ!qf&8_cV>j+=H-MdrlWH4jUB!v&6x+%oXAF>nR~Q3yA1ZK3oerw zY>$HM?zTx*26Bu%(YoN>4-hbst3zzW9R8ttHd;Mk=f-DeO7Qzy#K3&Z=@2z8mU;iwg0D=t#g!O~S=G^jUVdxLu&A9g@sSoVD0|1H- zfQ|w8(Ezm`jSlCjAG}5NVr6L~w@Xh}YRA-el<6t2%ArV42QD-9aP`BfJwvD0%*}TT zq9nrRUhI#HU`r>z-f=uAE1cONk0qU=-gUIhRtZgn|<2{qYI3e1dJ=m1J1Zfn9rX z$exVSbvMeaVZd>D32kn2yzlzaVB(=W=5)|n6_C`Z3$BjdTkw?(qjb|z9;ZGSc&}sq zMf*CFUm@V6C4f@hj6Qu?sUzP*94W^%;8W zeC+9h(mqqiRmGAb<~p}ClOLq8q`=DrkButTs@!*fXN!C4yeY1}5-=%??de?UOb+^5 zxlyZhhqOKNkT}kbZ8W@yoN~E>G#P8ob8n7bK3}y*ye>|f3q_0jAn{;M1Q9siR+Uq`>5taCtHko9#X#Fu`J=RJA<^5Pw!ubb2x&RG zd-pljgcoQy+gjRUJ7@x=|%@gA74D z$vJk*Uzplj9(g~M-#Z2&*5+ISl?uJ%jj=oGJcgP2ni$Tz!wkf0=Lsd395z^A^8#uv zms00`{A4Cp`f?)p|NA4DGhs~o>J;m%0#^8?mlPi;?fVoQ$QWpx^N^BP5`Ts=xfoQT z#Z-R^36K0&^q79iVr55nI0{xjlAdX0i1-Z`NDFF2Y{~wPGu}Q;hYwsUU&a;kh!K}O z8>U?pT1~yD`)NK&T(6mJ|9&LGtsj=t);_uKq($sUQB%K2KN0^27;OO)MwH&i`Bab` zV))p5EwIN0-0m34<@=|j4>)qzT}8@4dqW2zJuZ zm|)d|l^TtY4-Xgq#OUNOJD^*}m8Zl-edtq`TmZ^*O#%z}U%#EFr`Sx&%$_H}``kg< z>)$mU^w3Q}%lfdVUkH`$eK+~&Z7>q-(V6<)P3yjMrUIkjTl@w-yH{gpHppU#cl0;r zT#!~PZ7G@FpqOX*vyY^S9n2f zK>``~I?bA;B(HMvjZhX8jdkh7& zw8{engm7|jpM|KaFAipmk&MGaZWj_hwu=y$u)$qkNG>>~^ek4E8DH7dn?#2Z45Na! zmd;ueEb>CCu?aymg+0u9jJcMY+_^I7fIEazbb&ze1N>jTbQRMnb4!bVuR{)D(58kJ zdmQ?lOXs>dNkxs#I;aJ)gl&!8aejF8uh!r5-y5SGe!TXejR6Wr*mC<58~B$WMdYJ` zK;&4JjU~oq&rMhJEI2~-7ZUmZg}$(xktSkH1V`m()$-G%lu|kg%T|jrJ`4mCH zM&CE}!8?C^C|wl?S7NJQb}`WMtOZuXewYV_)54)_4Oy7Yg`JG}2bNylzoPL{PWPJY&)^mtXf%&cVr(C@pMB3Xwoe9e4 z8xYv6+l2~9RNj9I0-xd^$`xghAlbK}yFQw}*gaE4?Ipsr|5&w26x`W*pVB-!_~`y| zzx~83ZC;q?I-`|Z zwVXdt^Kj}OrYuMezJq%&bn_QFVAihA9#G3@@`qjja9djL4VXcL3sjyQaXM zEvi4{0W())4A1gPWsrh;-AA;A*=eN7y=g0-txwghN-&(0kjt4O+rOZ*`eSPlMZ(4p zd>56;IGjEQ+F`jE zJth68sN)L(%%s*@t(1T1SzLZMf5Lo*E4ikEJR7`e8z!r$f%IeEO6q!^+4Wa7U?yOr zsC~F1xRK?&9CW-3N%e{e|HV(1Ylv+QVgoIu*+$o=E8)cI8K$p6)nva+QRdM%7S0d4 zD&HEo%cc??&`vEDx8v=zJaghtxKnQ2R04x5OzaKJ>nKtajOdZD*xiFd#Cy4r!3CYN z`x~5}N?x%V4oVcW+{{$4>Ae3{*^;IfE%9X85I;6|t1Mmz{u$Na^{t8aThi-29S z=6PORGT8#;IrV;6DY9SwCQ`{s;r_lu4C`Id{#QAgLM8l(5Zr9|Obyxi?e|*t+I-2| zQ`c*BnUHc7%{(%LQNFcoh5jFK9=FB{Q=mj2VMy}U@t+o>AfUm3C*aI zD!12C(Tzk;F{BB6A%T-?(Z)69GLDU-&;y$ZX|7${#BrZzq<`#t#%BHjzquf8HfS){ zPZ3z%Dc_+ysagXw2@rx!^G^BOpc#zDY;E!IH}$2KGgB@`$bBGD)~j<(H)}mLa?^1- zNVNTzPwd)U&oxY+fgCcfSI#JneT=TRE3b>%?BO!4YSH%ahOqRh@6mM6c@s*0o&#Bg zIB-5~h~D*by0qI1!FBM(OdkBb^SmnjCGE-|ohjvh@yV>JR+p{Y5vDpn<-UkyLHiUz z$DfwclCy+IPJC_>6%>l{#m2kk=A6(&hx}3z?Jw=uCte!)|0*V!C{5&l-DW$9`Fb~} zpkS$9#>c_N>_L;e!HP!TmVJJua^^`LE_Wc8&R(56QHFl0KKKeW1+jbE|-V`<-Q-Vo1Di3J;i4jDC#<7 zY#@u}ncH85Z~6-Wn3kWb(CIfjqPFU?z6yb81%!4ySL57o7Rnz47^A;FLJdhGHU8|6CaF!P zylX*^O$Xeo7@rSFI)#fqaC_!${0%}lRS?k{$mFlZja+&p0*>lA-MOwp0?!V=8QQoO z_t2b>eJxfGtWmkdnNv{mrt;TAmqpF2Jbll0r}2l(_spi%av*rJT}y(oGz5!MK{|oE zy_@Nt7x7%U2$OdfH;DI^_eC+m53e*7LAOfCywg@zHes&EUk(&RTB9wk{A1mw)~Re( z%R3_ZePeI$fP(`IVBnGQO;o`xDPY}I!~V|^WL(Q8LCX3CgYgpNMf)~yUC)(s`)CjNf`!r#B_`heks*ndJ_-5FrawF7xT4{c6@A3meZ$gq`m(Cm+-+ zU`B0XbUTKn+Sf+BWBv{&W=y5Ph_lq2f`FP^k8OZ@PwyTW>8)VJY*s6QCFcP&TL=l- z0Phc;e-V=n*IHGT}ro|9$lVDdOx%ASp_<87RJ2s36jgNIQ^ z|E+q2Au62NIIEHYKgs*yk!}5-Cq)n=DCOdbe|!S?)GScP3i-tQeKNr%)E>ReVM%9( zU>H(LdmiqiKF|}r`OjAH`Q1xG?$pkrIk0C z>JY+TeP$ALre0n^xQHMumLrYOGYMiFWkt^m?~Ut)wzv?kpe>}C`UA*!(2n{2ZC1XH z-AccIz<%qhd@=w8HL9l{txi7{zEH-}#}kd#@pHAV`@v`VpWv$rgD{T|Fk0@_(*@K* zw9SIg@syOSJf8yJ$C#UY!%$O`(lFF}qoRZSZ8GpTK@!0;hYcDDeMzU1_=)lP-IGM< za~ILwQugO34E1v2-8bW&>YY6Q!$AAlCVuqlN|s`t*U?oMMZ~EERQ+&i<$de(&6DwT zh}Y!98(t3|S7sT2H!UlA+oEsicgz!S0^X)S$yO%EF=$dtlyB?>F>|MP(aj#uiUxjl zS=zY6@z-%)o(Nr0 z;05JX)j6YrXkV|Z03wWHBx8;*(XCrVbS$A5W|#dn&2GySB#r2XAlZ3htj4ONUqX{Q3ky1o*N zTlssB3avR`dBI zv$)v6r!UqU;l0BR@FDH)o1s}Xv(NVruT(jO(@R2QqFudEk8ayDq~`~a+|e0M?@I!T z*o+LFOJ&VQ%o%WLY<)SZH@`>sS;~9_5JR8j+oI__o>UwNq$&Cusc`28GPw$unCy@` zgce?WH%SX*;%POE*Z~K^$er^TC)m_&TDB8AE~Ap|lgMy@aU^PqDd!xHJc4|`fd?6+ zXaM~#q+~PJ!t5H?AcvYKzWF$IW8~-A4{yP_i85Bm^~TSSq`fh-24;YUkvcsDL3#>J zTU3=GU7(cLa>4)+l(?;u&#?4_%{8+weDg{$W9i>;A1|Tt#~oeAEYBSf1J|0mU&#uY zvWKDboz)fqvIc{AdqM^5QiRL#QHZ_G=o~2M00!ekrQ)24q_#5{6nw)~e2!JML zpVIC$Hy5aCYTTkM%aHwne?km9DdL~Wj~mN#pNXeP)sr9Z>3~ha!*9LS0L=xylESZD zm*+gC|LaCazJ>vIKP|cEA##x);co%&uLY11Ij7K}({Tj?tKcE4WvmMF_;tVFWq6kY z*7y#SActKmgOqQUe{tUh!r+2;3!8ziwL9MXgWvn>99GOELFpHiMI-?fxj`Ha7|K~! zO}%aMJh!Gh2E}tzBLxznGl_2ezbH5;Tnv@%pOJ~`a{5`V!JN6KQsJ^2Ogk@Sm|+s1 zmF+?clD0lryRIxyBScGBvO{-}+(@m3o_K015z4n6UA4o){gJ#roq3#0nZLHC^KhTK&_teSU(?Y+HTwk}85Vj^Vvu zKxk9)ppmqDR~Y-quVQ@lw1O^O2xSB8D4IKG-+=5?tnY1=D_GPyyqm4&Z3aqf2Y@pS zrzkGk{-+S-VqVdzhei2a40Tajb&0DKq&`koD`E#==23bWY)q)4Ha6O8@!k(7$CKhsH`@~$pFI1jy0T>{5%>v0c`&8SKrTrwc7K)# zL2C%gK9Cg*V&7~O;BmePj?1QHKqMSX)zN+l!mMq}Xejy*Qdqswz5PO=cOMe{Q&X-f zKw$4pBAf#BKydo~J2!@T^BUuh8VAab9zCdv%U>J%B4#kZVKdN8T-I2Pr0M=xvLoqOPt%c=Zzw&x_ zf9Yo3w;g6+B5@_l`M{Re?A)gggrV^+7v7GGng+$YiTzx2+n&+OdDJxb{NU;SIEYx} zFt26M2N}-FEm0bFrY<&wQ)c{jdN8jrUu|dCSt)1jhb*VX9s)B>o1yA;re$>CkZL-{VdA^nxwo zNA2QNubPoLMI~?IoN7L^W0RL7>7Lq6YN!7A&pSh}C8!b(?XS&zw9RZd)D~(*{AHQJ z!dL&b(r-x8RjO|hkxn5&EGIxmz0dcaOs9VGUif%tsJVW@gBF$e2s1gKeRzaN`E2v9 zCp;6%?eDN7)+gT1=rXQ|K+ACgq+=G=m(Q_GZ#kHl*v`)p=_Rdg&X7C@Kg->mbh?sZ zl+|o`_&cX}Z5xST+5~N1x881q69#G-aycF-i9C<}s#iX~bM-LO`1pa%{Z`ezJ(OPO zvrOxZ{DR>xe?8B+##2?@*o=awywqb22S>;kGMm3`w5_{0-S*AwRpz~1utqNzo!{+P zV({d1V%VHdZ7;9=_u)TP0i0>e-ort(zBH4Zlp#JQ0HYomd!(MhYMHra>$AqC1Oi7l zq8edkFZ?yrre1o8<*U*_9IFDARh${g0|j^wst~BlL0}M55@6x)>+{4~8Dm zVT-ZG-y5U>6!1G62fQWI|9z?w?+cXuY-u8{@KsBG+>&KH$aa2k)0kVxjrR1)3l0Ct zt>7VD_9mp}z5~Y)_SMm7rbdugo40!yLpz-nb4a~obCCFs`c}UUAc4SD-f^jNv9B| zYkz4PPwHqT{M#XbA+1@#bfZgcWl_gtAFAnLwCY;olB;6T&->k$atW!Ni+!31ijN`nWu}LPPtEw8A^%>3vtF`Ze`F-F~^-#3wm0ZkHRF0Dtm- z@_Q^iT%44p3tK(me!Z@4++axTQffrXpgj0E%4B{(c&!{9DRX(0vBxImO7ux0JtgXm z0p~%H#e_K+N}HEm$#x4rRlUhOpgD`GBtC0Z4`qZQO+I}CcYMN@daNF#7>n+8*r)Nz zKFWEdIi~mhd` zZ8$IYsUh2)r_g)iH+FWkiyKTw1x{2tk6(N=nO5G$&*tUqIzWS2A&Xr>G)kx1zxjPY z@Cq=*_BC=J3t#jqREz4F3jQ-FoKRjZ1K9b!?U2BFq*aG|>M#Kfra7kk5CmIpDjhL; z?8?6L7%e4P9qt3RW1N6ses|c|Asns7uymdnE(Srjt*fpvly-8c zx#{N_k*}^vxtveUk21I(xq7$o`Mc|0*9CDVmwhbyDMg|CI#Kg@DS&V)H)0ZgNYR6C zh4HRSGelf;Av$YugD;mm5qunnXjRzl?&LpJS$av{+*T`P@4Iq&YV9P@?q2cJDI@kw z&cUulu}zzqXKgvXCjZJl9j{Yg)n?Es96!9LusAbFe@EZ|I;xbe@|%T7WkBDCQT8&( zv0&)L<-66tcgXwqW@^C#z#shc6}eiRxFo9{0HPrMdHA3z$5Fx6E{*6?eG#48G?{0g zu5$x49q?kUJsxFjVt>A-L*I_-iWIbuP+n8uHMZ@yD%fm?ytqu{SX&X;OT}Dk3z=G>%U`Cnxivw zeIJY_R~OkY-oz&xo9ihs!*5GtQ%p^_-iMC8I%0(X#*b-{w&i=>EVn+JRyJj4K|F;1 z3sqM67P%7Py#L~|f6sx6*d4{d=8VRU#RaezPL|^^4Q$h|ev4Epj*~dnlg$~H&CH!` zOjmeeho#}LFF^C^Otpk9Xc>9b7xX93D) zbmowJ$l~z~lTwa(Zzpx6&Dxt)KD@4q;|o4uo;Y)0*#+IAhl@4V}*51c#}WOOULOdH-L;9R4Be zEluh}6E5=$I#Ow-CZumSL)}tS&uej679i5Rr0yRxDKI9*3-oRrJVk{(9T%VJ6(VM{{S?wP=-->He6{;Ox9;h}-n*{#cJ_F13C~6e%1&chKaCAZ+VY5g104D;o{YAc$t#<`V`s== zgEA@h4~rR$(gGKgHhO-nhg?#>83DzjtfpGWk-L$HyGt3v)m0K{x&!4a%jT*=f_X}5{4(MCYQy2R6FAz*>(QBWw+@A!^9 zMEHCDD9-rBnTF>xw|ZnMR#gbk%JXu^?X7ya8w#xe=GFYL+vb*z9UX_vE*;DhHGo z-^6{+jGNX53GRk=HEfTXV#p%LnRS!6HURS=(t`uZgCKz?y&9x3^MpaJ8l=y^fEMRkC{vt%khD3sj})>iIEs@^Bf5QvoU_T(GJ#}4%Q2I@0bJ6vM+o5u~9lN*Z=z* zCmGSjy5hHf6!l(K65Mg_m1^ilMQ9$(*n8-DHu{OJXRv>D^SzE0%Y6>)pLy=}r?t+B z|iWd|`4oha@sq$?e?1oEU$GveQ^DA{fjy0r&K2-iP8=IafeGC$*Q5+2tNNf5&t`K$w zPWNzWwQ@#DYJt8~D(*TP=S!Gi5%@FN)9G7E9H06hHOS(_e(tGay$8=v2p->ep@%np zaLtd~z8r^-`eFthDwjT*NjMjKl7SQ#jRkRjsQ-%}{Z=vF1z zfM~dwnAgd#Fc;YWf-gPJPCoHI&Ds{4cLw?B=3AwbZKYkn?Ea3lh)<)U0pEY|$1);O zjUSrPEJHi{jObA>+VtuD-G4SL_tb(k2!_i|K#8u} zD~! zg-AA@2xBClBGsUYufKf{=+X3s4nn|=J~vx=>4KW9t1i3tU zfjIbYbsmk_Y~=~|IP=I@&&uJ4ZOj2LZp7aACDq(1({6e(JL8pOwvMxItlv2vqX>r_ zyC{@bjR;f!Ji8|3y=qqE;lhvPX#txc+N-_VB0c=$l+fGFc6G3zB*kVrtdNs$tsq5R zbuDM*+WnjRhp8Z%=io0iXmOy9mH_d0*KrM|Z?+VXQ1$wtqjpe1E@-D$;>vjbTcy>j=XNN-M@ z%#9EEKMHRacWusmu~~|zBkr~53}m2KiyeZ|gp-cJ_@n@7%z-QAIL` zSX8Yjp|SD`TW>a~wUq(5gZLx1PfPa8hsvvuqFeT2N8~+@ zRMWTH2X9@nwID%4bT26T=396)u3D?eE^Qo4lBr#l{g2*+Yur~95_7E9Roc1XYtrV5 z0LLH|^M3cb(wM;yn$3DWi@5w5TnDca$WWPALusv_)x?qHGqP_CukP%H1lLnfw_c5k z=Q}3{pxZ{1p8a8ZC`o&U;a3TJ9oO54mJ6MuNyJ50v+_Kzcj#xxQIm#XPUV7jfdNYK zMsSLa%CF0jrIs5N(*>SC@Bj|XZ3AaC5f3nXqizmVvoQc;XQa;yvTB&OL-2x9Sc&k{ zP%X#4hwNLyVQIHp$pyiCsg^hngZ}aXGdLuXpRs3e0~-<&B~|Oi7c|u;QG4=(dO)nR zmSu2pWB3UVGli;@1iQ>WR!eLSnf;VN+5Y0z0OPcLua){$*5~M%NEzFBP65a?|D5-e zlJb3WJrgF~SNUkKr}74t^*uX|Y;idMM2Gbi`64zm-}iQ45FcaCa`v9Z&ZQv*Zjk40 zr$f|D@U~32^6E70D`l|HawFC>*^&Mle|6+wBsY7PGf)~H86~$@NO29#}7=0occ;Y&w)Zv?95(;;So6#o}r;_3KC-o9P+p} zU4PkE3#s!XkI!LiiRonu{;Ovf-&spIj3E6{cj#kUlo=Lke%XH;CtuRcF?Fa1CvGZ4 zwIJr<4`;Q}CgiIX>wjR6E<6_W2*0(t5D#wJl!1pRH=`g)@IcENw3J-XkwZ+od2lw^ zCYW(S2vPECg`EYikv+u^bnYcj`&z$^3=<)+7V#uVCsxS3)ANXzW%zkm^`h#Tc*!@A z5>PsAWRUL1#UFNXFgJ6^^|F(ulwNYVFxzBDB<#%-GJrEZwBPt|sFRU|8PKVW> z0n~E6Z1h7gCvlX_{6?LQf^WSXD!rY%PYVqlXhLh=PfQyS$lfV|f#bgc&%8WRsrAmB z4PdlNPLXKgEoUfyAoVMSj$$-S z01Yr;xGv~|nZJ<9*C@dSpchhL2&V|?Wc`|njYV`q@Y?S~XLOUk+@g@y9FAkHWw%jAt^i+a#A+a9YN!c6~9` zaIGPHHE7W@BFijG(NnFpZ$6#+A|Mgzb6C6f?hnFK@kT!3?7M2+lILatisi9Fwz+2y zj%~;2{7ac|vqEUsnSe5G)no>uC=zYa9B>-s>|*bVHv}FhP@0as$(O30IXlrEf|}fx zq^;LC)9*f?w&KRodcUDj6I#ENs~j;bE9Xkb|EAuE{0`cZZ~a! z2~Wi$B>9i_n!VZcS@T!Kx3HN3+poU+lz1T7$Hp&HNOE`f#)` zQfp!doryv#s1PG(xXAwIy4aaIhns5h7d0DY85VZq>Mk-YFY8bGFNyr`y1$)%H!lmK z4z%X?%)w}xXsk!xj;f3L-+T1LYh7twU^=zUx^2zDIJdtCXxkzEO!gs0SF3vW3q(J+ z(Qxg8TNzPGs1*O!!Z*lLwDjA)BA#)s*9b4=xv1ob*EW-10kkUW_APDg;h5g!t03J@D2sBZipmcBcl>i7Ns zb?j`}Te4+jWOJ;Ltn5Mqq3m<4lW`;=qRi}LWcH>gvR9~#bC6_{aSk%iDOv=uLdP;=gkvgKqUs+z{xpsUPQTm)Da`?Jp>nTw&4j5^-{c0NIT!SUg zzEP71lT9gptqPY@)NZt&9KD1V&`{*T-eq5NtP96G5)aDCvBW?D7Qq`Z+(VCtl50ep z-ukE^Rae2yS8L~4`*tVpGy8B|v&M%LaXm@50RCBPKmSvOuZ?!T!)GOmPG*oEV-!Jf z2k`%!g(?WOe3_qlHW=+9ZUD@4op+ol4Vc<${c!{yrV)4OzzuNoXW!pY4&$^l?iZFq z%R@h47)5k}O1_Inw^OD*A8qQ&AN#&Dv!(Wi6W!1WogdHp-B_i+6-I8S-PY@PbZo;s z`G8MM+i88akJ$NMGJYH}6&ope%~R~r zcH8D6tH>DmPl3lk%>=zB>*zNzu{UN90?%Qb3O9JAcroIYW2s25sy{uw{glpuQP`I| z*k6uCu8QGNN3Wyc+l+J1(8#fH!bZ__jHh};D1KQmb410y=J#FI;EpA#Ox6M2ddpNj z@ueRawTHhcP!=@UTnNXSwsH<3G+h+-hQ*6vXC~Ozbo`qdL}JS~9kJZ}wL{D=PTDQw zo>)q9_3YoNf3*I=NONDUUqXW|FD0gr5^Cl);;{4ZRVY~)clu<10_ioN;* z$P#b^aFQ5|)GVYv(lprel{bFfviZ{m6iQhpx?s~7ON}$5UVE2N=MFi4r_g4CbLx`h zLkVQ@mrK70bedFLLNk8lFn-n8dcA1cSn11U#@F=a}>C0 z(f)WReUjxNXa;@%?Oem`&|W}G!rn&lpDrBOMQJ81s(Sr-#*ZH;@g(cndmXzKq z;f8RhM%l^(J3y??gq8CAs7qo*RE;;8W+QMJeS%kqH3xk`3>!y}t#Xytzu0P6>^KK* zmWz@S{YRMrQ>yRDhxCDq3vX3=>__6lofUJx(I6OSn(rsEQ1L%f2X?V9q5`qOeju) z9V7mnTmjZtDmJIk$G|0A4-Bci6`T5)Bf5_p`5gL|K-$>$0Vi&aPCUu9pcWy;NjoZ6 zlDJ)9$n+Pb16yusOV{$^Q0FUI>UUVewI#ZI4L?wm|1j{WIQOMyEfp^JC)`gRo-%Co zg)bvlTm^jRdrY=4)P;gHvi5T)nVp57AB_)<7@RU&W7L=8rj4gs`?+P0mJeM$?z6Kqwmj@8A z7|{T_XfEZU#<8yUSMeldX4mHq@V?RnxSJ9^?8fPE&*5$gs=O>P%!5 z@(N;|i8iN;R?m-L7<+Iyl_q_fMqj@H2y~;CN?ygzHnYW5CX!TKUKv!AK~Si1a)V-1 zBu*OrYe!8lb!Kk!{`WIO`xtDi&MljfvgWfj&O%)s9R!zi=)U*DRnD?cVZC3~vF$N< zx&Y$u&(r^va7K1Ki`<)GOcnCz)ZA9RT%Foq9vI!kAi54vLZvglXHj#3?sSLwJ%?2k*4hd&acSnXQc z$bPOjd3?G$bN=XWB!Uif4@&}s`)iR+kd_5m8-weA4X4a%@)!xczFF0`%D`(#nc^ zC=XsE#EsWy_F0Ei=kzRER-UEH8VaGT&^1nL#bg-q3KtvIe>71?jbHyCypV`pxp|&Y z=|!sf04itY>qp5IlDL*{bU1fipR-yn%x&^jQ9Fm(-UNxFh^Wpdkb zx0b4b87}nJ@5>ho_jeF2`(NaWnylybb`Y4$s`gjk3ZuRUkcm20$T34M{Dv49DW??PU z%x%qw0&`DDVVQNJOodidSY>jOu&v!9-%2dFPA7$*5~j;hgcX&PlFkrDZw{#0N3bI5 zTO952?xvt-M14rQM5<~bKPze^u?!b+J5^G7BJB~yJ2C@KjqeCJ(v0yk|CfLF3Zi&= z%h1BKq`!^urxT$@{`cNju%x_i`+fO#rmGe`&bjv4@x!8=3>)eLMqA3q`gN@ljKt89 z(}b^Lg=Q4^Zz<-piyz+#=FjX4i2DZ6*T+rFJ2X*6{Qbn>`KQ;fXgsUK=wwaq@2;wP z#G)$d@MLWHh$L7j(s=u9=^S!zNR)J78i(7H-Y*fwi;B*)Xj=wkRa5E~+k{>*yg~QbLFyCyok1{w-tmE;Ga6D~HR@FC|8~J$3 z#juL|{G^zrrO!*r_PQ~EZ)3-{=DBe@uJ=SFRy+JxccF`Tx&1=Mo#|h&ViV>F ztHreDT|nqiuZv29P^0Ef1D*GZs`)Y1kJk>N=7BZmoI*I(_sSGK+Sl~FbAzjG8I$wO z3!nEhm4}wk5hCPlPg5DXV0qKd#ix1|=PG_i*o`kAKA~Jgd}j-iqi)=neRqGcgoKhb zezp`K?`!iFQfim^R&^=mDf)0r^iQM>R*zjqOK^%hB@7->3Bc)UFUAMA(<~z(XK5i$ ziuXTUr&d3TuFjd6=V!qP*A~J`P5x<<6Ik!HP;R~Zi1@0D|BK`Z8w{ZMH*Ho!>Mou! z(=Wk73Gk(0*x0$(v{_zLmhVR(=PpTAt9Tc;9=?_ioF6;9madpJf1tIxHM&CfRRR6* ztPN&PTL(pifXvd2Y@L^w5_`L`!&{zK8ba!p)c7|CFe)8}4 za}zyF*|OZ#v(2s9-3X?1YG~$>w^u#Ww_PF${}`V@wn{_!%b}w#j(nRfwME3;JTh2S z_C7AMHj8Gyr_w33LXH*F*b^Z8{exRH@|N}L<%;26PRrSfddgWqr8+=n4&f z1YS-+x{p-Z|R0skfmz_9Gf7n?Ca7l;?tXao$$FrEb!W7&mLCoOp( z_4Fa&)7J5icl-5_{JqJstL^c-R*&$6KkrznU`Vq6vQ!RTWyx~wuU=&Md7PIjYT5GQ z@teWaYJ7DUM4ja7g7tOqd-Ln#Hx=FC?;5V?7O z*hfL7f&qiS%#<$CAy^1I%9Ma(U2{HD5PG_uMz-5jTkj9DD1j~cX6>CWfx~~u%NB5E z^C_JCd5AsEwk5^el8`B-8QDt8`HA{|D^giuO=eetzg0HxE{+is4c6t(H^PDm#nI9K zN2ll)^xuWgUi;7VDfw)$5o+AT(9y`92aSC^6(ly9`@`+MakrBrnLL@vkIIveUz~2f zZW=d{8h(h$e8T|6Q-XiC@4LjUP;TCZu_lNw$IqpX%gcWCZ>a0n{`&ae*8};POE!OB zO)S4xlT74^xj%F+NOUk!iC&cW&~MJiI?d9`eeZ=@qyHCVK5Iu9nZ+oqhuH2yF)#+H zKib}mto@`-jn&#dq+gYuD3<$+9j2D|XcZV?mV@E*J0HUUF1s#F*FZfw;c|8vY&KqG zxV04OS=3a`qQ>kVfW6i+ZcM z4qcFHtO>sU>a|p8-^a9NUd&n_9*_}W2H2;nCT7>hV9fvg$|NMllMyVx#wl^rb%o$8 zZI964CO_5}T(0ecBHnp`&~A!ffN{g2**F>D!ckDaTI54XFsuf8=Ca|+t?V4>h9OlF zsv*VB;xE@D*{dfQUm6VgBTDpKJk#OP^TD`e&Mlx|Hv-I9b{H~}QmLlWlN@T^WVm|B zAIU$bdV9ByIdsE2q&Sf`N&UODv(0spI&s6p^H;;f?)Ze1=BC?$t!Elf)2f-pebIlM z4qaW{mGS?Oio*wM?!GOq)Fup`G_;*g0`U1X-aN2K-s62TRq8J}Dq=GpZj`m8S>-)4 z*&{6-=Br2-|Cpq?(3(^uIvys=jmf3Jg4>{m`4`)%W1ayZY`vJ~!nj6;PVeDIg#YBZ z;+rNO2IRp=J^9Zu{xJ01=cDoMtT<^3ALzw@0c-3ohkEWe_U{4&o4lBlny`r`7$Rk> zbk$*m#M7HONnZsl#U486;Eg88$MUaHLe43!&eXt4iAgtA-Vde8`@b)uYipL>pSt>T zGk7$zUN+RFyrdPFPbBp?DJwNjBMO)>)vq?boe%Fu^ioc6h0am@>*-kj`CyAH@PJdI z6lz{os!JAw7=)dZ`(#3@Ou6ys)BBi$(^=YL2K{~`y|*)_h5w9Q=P=#c!hy*6(vgni zMBbB(i%f7i1`yhiHT_n_5}z9M)zO)GRgxX*`Gxt3OHeVV(sF_=CdR~>; zdJZ`aYks-YDh%&G;#k$~-~QlJmbi7=Yxn76@x0Qvf5dR`*-DvS-Kx-NuLk{&1&zk~ z{VrrKOg)j#CI413gMU<$ zD11iok@4Sa%a$tcXHDE>`Vs6@x|#~Z1#NF5$q@jMjlr8&=i`eDZU*%ra$zX$AXCxp zuz~;G6BL>r;mqX79QBZq;Yq7vKeeDU?&U|r8lS=ht`%9o0^V@IZb>XcpyL!*Pfbhy zzqL{0ot2DHQjr22IIpks9s&faD!s)7$`@oi>}Y&S(VRNQr%2WIv!i5#6GGC#j&?Li z1A9o+ENF*wjB>kIPOmT3uF>jR<>>IU$y-`lUa`;iakT5!WFUz7)Drnrflb|&OVnuD zj)Nw&fBPtK_>3dA0t(&|eMm+n(PkTfVdlO@3qi9Bty1ugu;3(B>?zw(dZIwMuV7Fi z^^PXlu;B~~*n{=%_ zoy&5{z~%*@hY((l?f;@Cn8VNlU_^ijS6W6gfO5^vW%K&&`KZ4QEp|5 zn-_lvm8ON~D#(gnF6wtDeH)X5ycY}O46 z{*It2N){_>hBa@_5tY!%VM3LY+Rg5Nc#uOi!_;sr8N~mrTKsnYt~Ej9ezR`>Y&v_Q zE_j1cJjPitT(uJCbKuTcj{DEF7>gGa`W8UT&wFPa$k_d*f(US@{BlBLFM ze|R%Ri>tp8R|T_Jop-#OwvCHmTpJ3=12wZOMgO-5mI$yvM0#^7 zK4@6E1ULDotjL`wmV=IK)u!P+RFIYm4LfdfMHX-sxXOl}e2^Sf{kESM!u*d2YI)!} z8a<9>>0qJ4x7_bDZk)}%pFha{2HZ_G?|}i}6%HS21G!>^l}k^@VrH-Qe>v145CGY4 z+FW<~nO5@?iU5o9hgCqvo^KhVc#VEU+^)G4`U!5B%4*VP8Ysp89k&IOkqT^Gtv)O` zQGkdZF=bf6l3Ibz{u}Os%F~{|GK29eT*td~NoAPu3b7kWJ_L?DfFk-$_Jbah zYLu5?AV)hooet-0GYZ`sPo`+zghvP$?Lm3X3+676$dOAOAO6L^x3Eg%u8RsBJJnu2 zRSU_hoWmpr$<+0wi1iS?l@m*x#%_RgZ$uMdlReC~UmeeBFr2=p09RozD2E|OmcoDm z;*EuktYNJlNZt4Rkw>YOgerh;^%**z1Q;~qBk@1%P*Z*H6`d~he-3(i(H3wf^hu-6 zrF8!)GZ-Qe{IMg11{qR=yyVr0{a%5Pw?0F zL`{=_{YHhD_@FJp(PqdX#ewW zAV=miw|yQiqBWifc+#{6ES!PzXrAJ=>HA>0rpSM*6kmjt7Mc9Y)cq@0U+7TQ`EZhgDrbbDUf6HiLZ}yUbzEzjuQmt9C>IIWrh! zHKtVvVyb_z;I+=zIxi_qgrkS`!HFKCBCwjy+L4o56S@;}Qq!{k_AM&JOPj293#5pD z;|E6`)Q$`?WHvQTkdKGBh{zz&sJJHsC=M{PN>F_V2OR+LDYW>mmGzAQYX*V(PTL); z`Ou0Ucka~{_5ynf!mGb`1-MpXwG}BMf${#c8nz{oggNd*rm_FE+?h(O3=pdDP3WiR z+V!zB^CmTE7f`8>B&*+5urNDk=vQ}+e4o)sn_*Drljco)M#W-ccEgaIbrEh@$C)3E zoJ(}c`e~?sJ%t|Q6{I+mu&TnplB@9rX~O~BdRR4$Ur!f3m1IcPgbHkat4NNM?>I;m zh%M=AkyEnUml`YvH46Qb4ft*{i^@pabak}!tFCVK@gf$(VrP5aN#3qPH&yMHsP{Le zwU~HTT%ueZ5wLxCOq(tfw))BhC{YF<`FL^N6bW$Y3lKn=yDwPjAI;$1+~-T~+_9zj z!aYx?SD(Ilm+|1AQJTCdCAiuocC+9qVnKcH@SZ(Dx)Q;u?o!l%rIOEg78m_SL_)rz zfU0;X)ez(5>pG%@KKsy%d~M2MlcnbWOpjQm#JyrIaR_VXXE3rg3xB3dI$`|;O!nSS z{8+Y=s}_UMj3&Vn6-opdvUywO>tJMaSH1+{e0FoPGpthFG|>g;CLFtO z0oFVnmN*!ZJ15TuHUFeQ)$|obptLqHKJ~Y7LyC-dBm0L3g_kKGX0LLGN;>T28!?VtAdufN3#wsDTo>khpV>JCd z^t}iJQmSWcBrFC_#0tHpMIeINwcIRj!RTU9UQ7!&Li0s2QC$ z^70{WO^*c9!e`r#cVJRxZKKeXW5VUqjik-^CzN-tXvLcAA*|Zh24xaYSG}BWj1m@% zs9yg(kq~ zGZx`^Uh=maaRplFh9P8}v~3|5fyGtso{(~!FS+IsRydh51c zF8cK`t@qtP@Fm9eqv+bAJz*f$rp2CXqWEi zAUJON;}}>`xr2wGI$|baYm)lS8m@~^UH_a8!|CGhQNwF#z2BIY8eKcl3Ze9JL}S3m z%}v|`b++r0MuS|LPs#?gV)hhooBM`bRj$P6T;H<#Ds9kX#9Ua7>zTbW$^91lT?VVz zfuSC3^?A5o=#l0Fw-*dp?%JL&h$=S$UmXse=riI{ehS1y2_ADjhZSDxFI`vp!?z_C zJsW^He{m;#I%%mEt@^y(2Q?V89tcCdPW}Wo>ZwD9?lDMyqlzFsQZr0F>L%u#kaOFx z=wEbOC0f(3w~a7vVdZ=C{Lq!R1(a^y)CAkV?G8&iU09={7Y$SimX;i6su ziG6DDi&~$O)&B{0o%Yq9Uo^xX-d>;KZIt`-=6gf@@ZN7${K54*vBL;(;6)840-iPj zXF1-22}+#)$(zRwqD=7eo$$n{sI6~WuPBn`$Ja>?d?z!^d|K|B23#de*hBkuRE z$taxP9#7m2zf?lJT?Y%4@AEbtBJrV}8Q~#77YM!xVHcv&yJAChzz%29flmu59@&d1tt&tubnlyunxX@8P z*w9z3X&|?BUHo-d;?~6DTmt?fnN7-u^D~CkTrym>GB>-lQ?Oi+e#Sl}+1TtEganS!o-av*=%I^pf>d`#Lo8=CaS^cKM(q%gOd)qkh@O4L5%H zLqF@az+?V2cIgLD*zWH0s<$!D&oYIpID(Q9Y2kQnO?#y*)^oEsGA16ir>Z0w{}K;NWQyFGZTn^hyld zbk7Kp5w4FtKIXdjqW$61Zp7eT{L`=;h2|*jcGfU>Fu4dI2I-qz$1Jh04~4ksL~V?U z6KK^}a5ZfR*H{R}9WT45%S}1T-c5WjRURbizZ_cR5fQ@*EJOc>+*P?f#O%y|ovAGZ z49bK1wlG}1Sl5*+l9W5blU6RcBJW4_T_D8CI{J~4m9I-TUllk~#8axZpL^$A)4tcf z-@H1$N$wr9X;*Kg_x4{<=KDNKdcaAGpJg8^4ZDIEDNJ8DrNaQWGP zPYl^*Tfe^k^|VVh-i2JVw!!tm6@wJz=aLXE*6fZAL-*TZ_jmKgMyP3_=Bi@WeuCr> zs2<-b0DY&Y`U2GEy*pru(RgX^h_xod8#3_M+(%QtgnnU|9Cw#@3b2H|FIh2S zsFw-^k|-Hs@nR2drK?cpOM_ZZu?~g+c4*chRD0uEG@cD(-LJM7tjK6m;u@M~BRJhDPM=7blh)Gpp@sWtIDjp2nZ!+nSv)&1BFvVo<4c$; zk=<8K{{bs}MNvzmv2oKkD8H$w>PxwgndbBqh0^u`<^*6rov8j(yYRl5{_z+f`PNFjZv988x>%?f2pS4KUUypB)F=RJs0Aog@ z4p>i85ysgOD_u>`k1~GZTBi=0zU<^dNQU*yZw4q}4aFD=yx+RhX}Nel%^~I(N0z?H z+&Wp1z8`wU$3p_J3$fnNM`g2+y{4#?>jb-A;>@h;^Q)WjGx%})@v zHJgmmA$J#xu0QB#;vIeS+46%(7s9%$XmDlf&u^)t#?C7iiV}j!O(%802Z1~86)vRj zO=**KIS(1`P^`$rgAoKK*ysjW@Y#@7Vy+TBhByQ#k|8gvG9B=m74Dxbt69tc zB^(S%;FJJg5(1ExC0GZyGgT@E{tNV&tqXNtp+FTd#7g{Ea8RJ^P58g-WX`-Q5?ymo z=!M6f80n)HcczcN*&#%Ye@Pu+3Mz15HFf?cS&uz8UpF7%t}12BF<=?~`7GRk+4%~v zZD1Dvcw$Jck=j0gQur{k;=zNIXwPQ8hG+;(iMMF6yqWNn^_vHWIi3X>%KKFyL1*Uj zw&qx77$N|@b&~-Xac9;N-R_D?`XT)GFJJjEw{b_%qB`LHl72;j8Rt*z4wOHRSMLo<)-!wA{ zGADhNbej4PUCC(H?DBz?%glyis}7w}(N%N~;;ov^Xz>2};|vm-=$NIVG~GKuEB{^2 zML(Wzy=IL|!n3DfKZp)o?8WNrgwtewH3*wJNg5nE2wT1CqeGWA3LJq_Jwx<0yS z1m)n9MoI|=o8byS4xXoYHL^F>vQt-#qVDsaWjj*;mmf(JjpqZ?t9eG^#C0}ulHs?e z_2iN$BPH4QCecgeM4vgUcRp%%J5szailNzk(@M?96%RZt9aC9W*Z80G>&}m>*dIxOExS7@@m!I1 z0;PlC9;u|l=LbwVp;4)i0caq&KZ<8m>yAwUzN8&mQ7c2$p(B*I3{LG)m5H>Li?8J7 z+)8FDttpc=<$f>$04dsPbL!%kI7)HFrn`^MYwhkIrctW|1>S9GHqU5QW!> z>v_7aC6-%l*S)!JzNWq-fKHZSd4*+RI@;M^>?```Q!-LkwDba;c*fVg(Oa*v3A_me zryB8zl(Qp7RQf|y5_&1$+7-rC7(}Zv`rki_cUA-Is}N-}(jOoRfHgCXGVBy@Tr2Gd zE_ook?J0O=V3>(q%i44#XpqM5p~qr>=DLl@hh{!=QlbtBfbJoXPWwuwwg?T?Sn z)XgUqoUA;Wi$qWxka{h`O9<{)HEg)tRLzSy?vPW!c~`NvX~IKv*NRIgJ&z&v&fn{u zPBvA1*oG_c*au7oS#91MPC$%74v#AhJKb@@AG9=x6(yq1<3}MB-3J)}HmcCE_YlJ& ze(B7Bz3~0+4}`ymjl*&0dNx3|T@3j@h(+vgm^gZMselPo%U_eqWCOb_vQyX7^VL&{ zG>+`?zVcumvX_7nL}v(f7n+A+sCmzW7^+tHceghd>_X0K{bsY|hooy6-CAYIY--cc(JJSB!0?#-a6_Dg$SyPi^OzfX$xhC1@;PPW5 zMvt;(SYLu>P0Ut4Rd3kyLMV2AdXaCiw;=mxgH)}ro6U&JeJemF;a5}qI{9*BM<9ePwI{-X9BpIcKO^;sgU*hEIL9YpnJU`6Nlx-G14cNE_?3Teq1?5h~~ zkP+0NmezbHz#kJeP-#x6$m)xCX=KG{P(mp1)&G_D3A!z$dQMuT9Qu}o^@XD+k5_K@ zs?$PRF8{yY1K)AYGfwKAYpY*OeBb#$Xt9dje4#L3()w((aOwC_Ml#Vi zcK7+0s?6oxwXN627cGYhi0ZJgd^5eYJ7EH7-;fd<5M^RVSRK3cbnL<&{kImJOMJ#L zhXDAHLWfDUW~(IaAkn|(7gZ7CriQASezikkQjyxDs2NS<*|!VV*Jw≧v~JYk3sP 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 P`EN}%Jyp2!)A0WfS0_?7 literal 381916 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

tECHMb9!1nke{`AFr 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%0AE7@;dbUDb>q-R;JV&2XcD- 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

kv?OF9>HmV*{0BKl<7H2QpYZ0QO#eVOua zd_8=tIkSxiyg0;MyVSDr7VCR=m>UEh63?6^IWiPCOJj+tn;}pT)&dav<@mm zd*38#>9_y@AOJ~3K~!b2O?LT^vYwLEy1%M(!4~aa_g_=8h(Myx+j9?n(bqgy9p6@( ze+e?f+}DSe%H|OIr_Xv@QZI}#_4b@%R`(@Xv~p~yASkk!zs&w|%?uX&Ty(_ebMW~! zCk4~xEL7YP(PerxUvew|H+9cHCs{8lM_21N*UU-X_!i2S1I|Rn?VNPxmZV<=2dUN1 z0tg{oDOMq{CPF}h7v213-1*p-2hqqF<_ga zvVhDZFsos3ZsM4Z!GH?rD9S*`G2IPazxau7K%i>?AtZ>HqUad20^s=HW&!t9#?XZU z8eB-0lXhGu4VKvZw zpP+aH5d?~RF40EuD)gIwj!xck?MokcD7+sb2murd0qY7OOH8KMh1flm3j1rphzGE+ z9kp!JKihr0=3y5R&Gwjm9r?T&mlB6{toPp3kYnAc=f1?6=>2NLij{q6Dd!Dl#20sZ zA>+Ah$iTAFWIdOeSknat-$;s~WP8jtxEFJ@r*UY#w@)^XgX;qBETd!j-&3wZ5*}TS zN_BKyoH%oNuWFRt#Da9^8O9Mvg+z0xer?3m^;l~@9QC?H2v7}ia&;L#fB!o!{~une z4}b_q3OckJ=<|+8&EU>rni!OH@_-(L_%NP50QjR%zFYp;AATQ56v{zt1Qp8KfI#1M z<61ch>^Gs&n{cTbjIs`xEyu7Ai9Y8hZH;Q7>+}TrCfl6+v2`xrKY8b^EH(`|WYoFw z0j&LMtkVf9|Y`V_$;>mO6%Ep|NygOGXiMf2%F_NSN?#c7Y@vY!6h7ihxK=+L%ZcCsS z4?~lR0U<&LSP$^3ryk--k9jslshuj@e+{#Z|7{3-XAD4q3N+EQ#78&+A!;motVB<~ z`p)2{(@%-&I%=erg#gx73o+nMI&*J>{%-4Yu9R4{g3f7|=zrvOBup+MKzTvIpM z8@I%QRL)_#cDgD-pqpzijHtRi%1kxa{t+!zm!Z7_IOiJr27|4S`Rng}4)FTe_b%h- z)?e`pXqVkWibK&@H623bSP9?w#P7k0gDU_4 zfoj}9bUlhr-8&L}G;fFZ>verHvZ)&9`G5Bl(o$}XVlWt{cIwIqzoBY0OUY+h_PN2= zfLR>Kf8BaBOE{1(YMZ2n*4D7CFS4xQT)FrK*glR3k(p!fF`QZSaABesrPnC#0b8F%ZyVK0-O z^Oyb{v9&k&+8a{8%_*jI?~$~#&-t+3f}>Hf5-v-?%7$Rxh?=zG2$ zjIc7O$t#@1dCHSRUG!`IzHNy65hQ+8525Zo>vurA>)0{I*p+kB^x1vTUrB>epNQZw zvS_0BmE3$##XK&j$!MY{T?d`6n~d(g{j3?^x(rP7fP1c^$>UpFKm8_fTAOF<&+YmX zPkpXMMQ{`Pw`2J+W1wx5(1h>XWUuZ)=J}?+w~lLh%QB@KB}=(%6iVaFL08S(_XK0>r}6k5Fr8tSVM6T_W_eYp%Ng_HQw;7dvWISn+XJhLO1^+%iS5~ z3ClpAyVDTu0dlMygy?4emmm0F{B~!qZ+YTtmKr!^1;4j zVkwQ!T#cL|+%-;|J9(bSXuJ2|!Je@^rs~IAl+Tx&ShLAE3>lL(9rqv}Kqi3-gM#Q8 zgcWywD9%3Gc`(wh>_Kybwo}5Q_3i5k+Du6e$IDxw zULJ!VE6X`8->n^>4F!jMz2(&dt_# zJ9)0<6B_aoz24Db2-lkjsySg;#9?Lc#WjDg5D_o}tSQPyS0y~+(yQ?MA9?$!pL?}_ zN#na9>X^1BB2ooe{qqIHhi0&6KZOZ}rJ!RbJyfM*`p9Qr7XHM0-;5x2$Ux)Gt}Q9h zL|GS?U8t(nS7t~W*Qs)m(M--(P~{EM{@oDowIytm+V*uN2;8pk=>C$Es{x0Xx*c(y zvP?+w%tQobKWyX_rFK-c_K5%7o8C?>V*{+bpVR)Q=wDVV!5M9_}YzBbDs(MeIpsFVv-$w>6M$Kghx&wK(mdDI$lnYv{}e(8_?q5j@q{t8q>5Jl%k(#9kDr#M@A z+r%pzR3Q>kVHfT?1vi9anpT!wGvoUhB1(}}P5-R)_n11zH15OZX)`xzk5pPyr-HQq zx~*DMN$Hxl^Imnda}Ks?yIIohS?i7*PJO((?)iM5qap`+NZn)vyTM?Xt^Y7!_+I8~ z&%r*-)&6#UzAdThKY?C0M{Uc3WMomf@Z{uBe$7~Z`4VFlC-=_GCwuh%@fj=8PP9Vd z?ooSeEK z5L7j;f4<2^XC+9QuQSXKMxf7r2IG24NbhD511fL*AL-;3cf9z43l}cLB)X=Q24@vT zMGf?--MspvS+e7#c;#I4hy=Pu|JTlGigrcvw@5Pj^G0i0hs-Ymow1+!%$W_Ugy0>z zS4>ffmJW?n%YvXe*`;K2(x(7YmdIm#i+u zdw%1WPrl;_4-+)J?>zCjvnq(jLX(8oc<|H+^m)Sw^o8S3KlPjX_V<4uqJFV!94K&s zI40AB#w9+w%SkbT?wj1@GvkL_V8y$nsj#EgC>GT@Yn#bGWtclnCESO z>fEcfr{2=Zma5;zu)Km3im zR!@A)bHGp#1-L)}BZzj*FiitsUrB&bo2v})Or+aOX?yt^Fis%{QgWH{n>YEeanPY& zk>`nA?+ekHY>1{$78!<@rR1_PHW=n>v(jt1OphAOUM(Fy`fan4WA!6xijmE7FN(8_ zUvSGa6p`nnK&Bh#vFiFq?&4Djiv0 zx%&lojYhjTD?G{D&z}Hj@7#rh2dh5WtnzYHQmEgUm$hxfJ?qymoy4dc2M&zHF&GRT z^~;{OAnR*qgqAlRzLcvN)6dMy!=@ZY!}xX%zGf@G%#-+LY*Kf3zWmBS&zHmP8>egf zEPGKsa95}5)xV^rAy&f9hBs{+g%SlIUFYt{04q)er*QuR@3{OQy;Sdy6;E7R*+}#y z!wB>}!Eb%^7xiC$;BAPDHGxSX+ML+xCnu8moHU^}bv^XL`;U06GifZ^*^qL*0riJW zm&pmUbbWN6986zJ@C?z!ceCDU*l2$)O-9r8;%Q-Bqxv=(H3HoTbc4arQNI|0-pjr$ zk3gSC^VY%q%c2sO;yzi!cfWni_(lrG#SdNJFL^$M+$1&6tIEU-Js-Z2=k?Dr41rE` z5NF)4Q=cnfB7`8k_?9=|S=XKA%s6HG5*n6>l?}nNK|r7&edhJbfAYKkRzC9A{~kn& z3ka~H5b0{%?#;RQ)j+huNQ~wTWZP%=Gaz*xr9Bw(!se4BJ2j;KG$5OLPR5drsCg3& znvw2fFNJ#9Cjhc}?xkg<4;>&c9d+(?b^}Tq$^6)LmJJ5OaC$P6MO@>A?)wJizT1~< zgG|D{B|PRcdXomBqlIjH4nN6r|LUF(8(+m~cj`li|M>cT$Y-eSF{Au1oYa^f zKDK{Z=jlzJ{@Lf$n6(*vPGl}+Tbk>kCb~8KdtrRKg%N^q0T-P(g;zZ3dp5a?N!fEE zE8Vgmme;UsoTmU#IXWar6H!pMHpyvbqv7P>+_bY4kU9Y-B{EIXSqn_Oil2N)o?Xwro$!I)K2Nx&4`kDmoRQvNO+fQk>vban6=W_66%y(u-^GY?gTYgMkYBs8?hnHdVHj@y zdu;u(R4mOtrR{)7lyzP-&%SP+3|;Fy?MIIK9-cMv%wJPB@f>?S%muqL(|#@J$nk6P z+(qR195!gn)@ZwDPh!-BH&cj)V7(a6yW!Qi;*zUKp$e!V$&WJIyB9D5ed#!>;k!Vq z!+3GudELwDx<@`WRxI78zqd7XKNPT!qcD_%R#mcT za~yBRBzoQb^6yo=0hyJ8CFwsS*qad|Z7#E)2E#Jed|&;r?-}U(XPrV$76I|$ z{CG{{7+-3gCr>-|yw#1tCO+$3_JlGlK!(tDbjmy(TaGc#bsK+qUvr3(Jx%pT)Ic3j{O#;%DzC~2bZoZBVLdD;>2<@jS!c0sy4&mx-{DOWg4!#YZ; ziV*58dA>v)+GYN%rmq|M=({mBm5iAjEK?q5{oDn{*fy6;-!IihCw|jd&e zHb;HcI>^_}MS850+U17s&TO9`YN%tlwVl?z9^XU<$_~j;^o~o{mzMe5Z|pY5+d)y) z#)j*cIQtnEKpU2WXy3&>^05U!}JwD}9Q!tQvxo40MiqR$YJkskrmHR}vACnu6JD7(cXlr~t%A z1l>3w5i`4b>1}@(7oWHct1yV0*oB}t12p7tq|WZ;ozv4b9;Z~~nPa*mb)rsZ826cm zO~!IXCb~D0>H)hyc4oIAoAJ&q=XFUA(`KzJZ!ZhhG*%l z?DH|3P!|#9%`?y4%K{TYmB1hf6c-9bN)&D7 z>-v$Gfbah3H_1Cc_>-WuKzI#C097EM6CfJv@K&M-WfmERq$4^NnVa;iCpm*m^oT^4 zaf9fRVJ9s=zUabq3wCKz!Lm{0G-cL)(g}=)m5I4zGVeYg$C<-f$za~ky>KI6+R0BB zxld;UY6xgrKi6nNvJ?%&V7jl1=UaCV8RQwu?AN~QC)3Z>IyLK2`rQQ7<@|0pYIzgq zv3}sw?*fCN8bWabtQRIQ zSd2MQhGP=Z$$>EHNTP4*W~WGWV0t3GxFi5)0^F%d^f4UR#EH$9jq%aJEoyq}{-$vj z66@gd=X20n{(PMJ9dqLh-Slo--5SXtWgLuF%3}KH)G#OLw1?p9)<^z$xn)!vntOip z)N9VLN%^Pt$RnANI~aJU(?%a5+d<02mZJ41t0g(01wU zw4!SW1v_O%Ptp60dBiDyd~3*ZE}8F@oMax;fcE*FvBux{jA6&9XiXLAkK|_(B6H0m zFdSG1rpGP%IY9*RB@kK8xdox>%g|k>^XsnaDw4ZK^B2ow*GpBQV)M9nb|#+pzVg$? z1{KM6-MYyCZP~gp?5BQL)mRp>xwd^x>Sc0H_N3GJ2yL#qwOO?849kpre9@g{adA{C&1nLp)a*FV*z3*F-o_!lir?Z~5*2?qtNDfbKhQXDbZ=nUl8{(;W2$ zjqA85lC<c^QH=mh)C#rsq2}3Mr&U@E60o;{v$$x%bZS*m@r8iqh#yf|N)h3?MTw0>;UxHzeMp8AdCC++SR z|J_d9?`nQTz0)t{@|S3Ttrw_J5sKu|pb(IKgl9+TqG(mVDT zMxYx25Q9|z_uu;m^2dMmZa@-hJ={@Rk;0KU3m|B15W5^3Pn-BOG31l%5|I@=;tOXcz*8h&BXm z=;>*`^!pR->fSnndFccQiT0Auwgj}nFJ!VAji7HH;9A%?8~Jvr-;|fF-`d*8BEsB9 z1aSl*RPW;qE|1EC)iC#UoT~`XG2()<_<$>Z$A^=)+xcW~=C5d6HuKt>fTm3pUlhAJ z;}k|*H+5w)^BamoY@oE!D-q8HfP>Bb8F7_!08hO7F1+fg$E*Y#YeJq!)g8>k*l$>x z+MeV5c?t+hP@*?~=)bw_621sb3MGz}x5UJYZffnS5{QDW;&G(d$_%WpM~=pfzlXY2 zRoylp$sZr)J#lIzb@?QNLv(lCWqbILqTYc?UqSOA_T2tk5V+?808moX zO9}YsXaBwYnatm2Zlz}5OTDo6n`qaY^Z{FN@?|pI6lJ8Tx2l7{JjkjlNPAZCerjGR{CTzP&qHrQ`SsP%8qXwBMO+C9>r7J8ibdflW=@C!)a%W)fwxgCc+WkxjC_tNZvxHv6lJS*+8ELotKQ1B-AG7!qF)megNL{1o>#V(0T+oji!v7JrZcy_3Oz zQ_td6r>{6dgrr~kAet9hx&Vh4-3Jzu*t+bfMX^4wjdex{+Fr8Fw6vVI{h-l=>HoO^ ziSee(e{Cop5g`XDj4mE1laGH5Aynm4qLOl>RBDoF0G6qLXdizvPveo2lkg%!4C^+k34? z2*R~%yVckAKDid{z>0;seWeE>9XJo+RrMDKcwPQ#mjV>h`Bh-{9GLnX70m$UeK&IbtOF6UF{ul>Z5jX zrza^{z0583U1*k)1N3G<5>|;<;TeA0abN0&(K7gjLBmgs=3Y%k6nGzpTO>;gu+%wv zy}-y6?|3Bdkzt35xScHgq%JTX6z)2_49b0f`-II86)}VhpqJN;t;-IVt2&EJ zBC*Y)Y%WeogO_PCzY(8tBkt6{XtE2Er1-TRUuNc8;GM9;SNu*l-y?OYG{!QqN$Lo( zdT(q%dI;jN!$^%fJx6YifyHCa*Ywd|Go#Oh?Us{IdEHTyj^>Ek8PYM}cy6=2fwKU5 z!>vTXIghRLf3_+fNWGEG%+-w;a!$AM_*l#4+3`@J$5q?ko5l{7=H4gvl3Db{FmN3g z4ji*F9q8eLYsTukPN+U&TMrjYdvZ6DRq7OwBls>%i=ezNx-8YgiPne9xrq8GTB`$| zc1~h79u|QfPpZb=H|KAr4Tkyc3HRIsH=Xn2xVLF5aRh1C>#(mGpi@aFDNcptN_br8 z+Oq~a^xJME7;&lBzSnHc)#UBzR1=*T#$UQQROoHJih$P(l7&I*-ho(y1xO41AopCf z?GTDN>zu@TM)84WHc`S1CVuwD92pu5Q>Dke**D660pq!a8NRAj5Z@rgND;_JQg+Cp zIX3s(p;CA5r@J1VVq5M`=7vdyq7ZQikp5Xs!a0j0Z$6g0o-lWR!jhXdkq4a?g_|v} zK@@)@T8I&O#?W>0&PGaJjKRM5#Y>+n!#EjX@Y%^qPaD*K-FFDM~m_S6`OI zoa@OgF{|SDgvHJ5GnvlYX0LyFWop1Fi*?{FWeH4oOO@VB$)NKF(n*v7p)ha7$Rzyc zXr{Lf-b44)JYF3Ho-1l^7(>4P>gCcwLcS*XJb1h}^EvcH+cjcYU$~p1UCP)~cNdTM zp(Z0OYYeL2qiuCdEwEj7n${=1$#r0yQcg%}H$zfasjX!;Z-e2!5%0(7mm|Kk3CaAD z((<43yx;kQNR>GInMrVnjckhG1_?8J==hj8{BO+S1`QNmkCSE=Z|Ou_3gOd+#}UVfmWgPwB=tu8yteE5E_56GiOc=de*L~P ze`@__SPJbGKCHm+s!(UX2(~=-kRAuF5-Z4R&b{yIkbHt&#=Ilx-(vX`=x_pk%MyhP z)I((JWl~jT8}NVqzJP4jwPvr{j|6*i;GVo$Ou6N~Vnr+r%5SZ5M*I@A{(89? z777lZTkW=?^-bZ*3MFNr!;_*&j6ws;b+-!_-G*z=cKeDKj)1Y$6x{LNOtqO>R0zc- zYh-dDu#uHy1dSW$?N!_A3nT9O+mzml<1FFOTZo1io-;RrIe7BLQAqAPK^xT!vcm9s z-1VyL9*c&HKDm>b&)+T5-;c+KLcMH4{+lKvO{S)0Jc|WCZ&WmO@`_UtMMx>NEdZin zk%8k^C1&rq)dKD=p!0eVMht-P#QQLOI$I+gKcY{-L_9c)z~8nkDQ;w1-6Xc*ZFBg8 zurd1 zF4dIB8VTW_uogupmw1Ud%t}{GXR^raR(Gn(VTR}(qvT{(!^&v=xci3Xx$u&B2s`fDoUhof_ zT?}KGfxJKq_={Buh#}Q-*O$jv8OZwnJVNeeq;-&><+(diy9{w z{h2PDaHYAv`OY&-=qgPGs%XeuBf$YXXisK7s5X&t0#ufxab0C#spBrbp~P>Gz`_lf|mw z_EEeDC)w>D-3O;3a>nsZ4lz7C_0V4!XyL;!Yr1ds|5H2y%}t3&k^0@)V8kI}P>i9= z96sFTbJW(0pH|0h3u?Omt@RcFV8JXx5FHTBY)Woz@B8tdv>wqIYiv|JJ}cMnIq4F7 z5)odfGaeL>;7z8*Z2ByBaYe_MGyi3(ik7`qY1g{A7+i%Zvp7UjV zA8tQhSGV&d0!r)1gpcO+iT{>jJXC z{!R1k;?Q{ue@HxIa=aF@uj56BGT^oW)$G8v)oEMBf6gcagi${)&F=1~689q1pgdo{ z23#P<$K9N8rABbxIAUCZ`7eRJcQ=qZW&Wg;!Jl@pIm4`xJx-`){CJBD=?S|_ z=j)cpY>e+BMFoKa;Tinm(BD6YsZ9(AUxIC`*Xs)v{j9K1}`FLjqlq|SJA2-Sjr0MA-m;tL^HZ0BqU|r8lPsAWqMH4>TYOgpPGg^n3^i+$Q)NOqBUF{u?>6_WJugiWg9z3aC_u3@A@48HF@R35EpK`J3@sXS!C@ObTj=e^SJq829MbEyj z8Cmy>gZTmdVx*LC>1fIWobX~SP~2HQ^!oO5R$2%_J*>OLKIjGwqwgHJ6AWzfMG;HN zw9*>zWO+BRBu~8zOz?_gbQRO3P|5&vIFJEA6h!Y&$k~NQQC8bF4>_f>VMy=J^|1Cb zCK*%F%aZ1aYs*ZbH|!c+&*}YV&!BPf^kD2RsMin|=zXU=dwKB?xxB@~x;3*Q8Tjbs zeb_L`t^MUdRcWGLrA*-|&sg}-Qx@b$IUoyf6~61J3Z|$gJ~4jmFeK;wN27|er1gWt z#G0jX>O=N+ses-OA+ra|91f?-%f7aIkUXEg-qUP8K7#!6w8cT&B3NWV7O|>uP#6Jp z&gOm9T>Nv?&cieX|D*HHoyj5{v)Uzwii`uN*b1pqZZdQ9{=|&!2L7*m6>{T&N%;6K z$JR?HRgRDqbj6NB#Q!#@L6MwxFjd>c3?uQ8tyx~yyWOAe#HrE0@AxE(UZ<^57zUE}c9#NM>{781MelC7ixA^p7x?Egr z*3h8Y=LOxDsYN_d)ryILWtH4uM~h8tzZl+Q!qm7!cwxyRghs&VjM|4a9FicTA3cOr zJl?jn9$KKEnZaYk_M(&^tdWQzNG!-fO&+EeW=>L{_xlFYvNOa8xr{TOn<|ZJ>DL?` zKaMHC>jSp*TS?fo@1`uc^33PnZtChve03`@x5&e|%@JRFoNn+mQh2$IX}&w_NM#Z> zrA((=;GW12)03)*jWcR(1s}f6GX&lqiq43ufQs3tH42RjDrSt;kVCra%|x5?Qvne1 z0kWCgd_Rx!0Rv{6p^;lRgP(7axt>StpoFp_xrB3ti&$gU6SNRkN_c}Ln(g8{n1YM%XT zYX!B3HJ-Pl`rQ6<(!RUo%G1h7P=0to;g3=-$$~XqcN|Xldftjrt3DS*h0-OTDoDzhw_%b zjiH^od&k48%9=DpzpZ-RXS4glDr<#n- zMzQPKRV)mvtVy&^tZTmKr%*;RQu^RUB1*5t3YmUCIp_vQ^|(`Q>7Fq(9VW6MxG|^% zQlVhdr#6}nG_d$a7U*|-NXO&JHAl2&Xy1?%EyCS`S=%yzD0-j!xg(tP=)DW>A*zlx z;#;bQywEy;{^EcURY1fACr%EY)i;5-ugxLWJEr@Yh>Kw zduwCs3BTDp%*FN*<~e&qCqzuMfz$EJ{Dc2~V3Y{r_BKhYJt6j^RT*vQ`eO~1rx zG;988Qmpm1?WCZc>t6-Tw{Z!mARN+40A+8=;S2~6NIP)8?d!{m@s04 zmBcyb=~Z}np6j(Ya-s_~g3?I>WmaCe-a1-3@;_v$Oltgwwdq2FdE{$sH&E{ELbi>6 zpyQwHo_WZ~Bg^aE=O*BeWeAla)WEXh)G%)P6#~{+Q-0h>N5gV{FHqL^Uj)>K%;3wU z>;B`c=5=R}@%g;WRSlpt0q3c(P#DyK->blpCPv{b;!YZq-Z==?_wAOXFShfMvBiGp z7SsjT;~_pDWh5{s6_b%fz8oh_WK|ul1F57TnrDjfC}}qI6U$z$q$)Q4dq1yv%K3sR zi<;+A!*}v>I~b>Irh48}0uk6_^M05CLtK}4EIOWQoy4d~2)@Yc>?fe{ihLu~u=~V{ z>M$FYxLfPa;z2q#6RxpoZae*wDy%VLWsF>X!l z%4{w9mKgJlqcn8%hhj3dtB!`HR2Od+sTotr@UC5N(};kfO^ zE>?jE=u_J)2as-$BF{S5osCg5g(6JzE|r#dLK#c39YSd!8+Df3czDx%CY>N#XVWYe zW3Er#F2xFzC5m-{eE!4w&n94MU^jw#K7f^~D!ziAV}O;F$hN>rttSLtE2DP?ayXA? zgNuGkOgUIAR`iYL@}*Y|78cfUlM9n-8ZS{^CiO|Kyp~n0X&q@0j|^KEuVmhc+Bbyj zVakwYh5HMdX_0F;OdYlGpCyQWS88V!c_YVWU#>#AKQm-PW|$jQ03LvfpN2hf>!tkj znDP!T&-{>!@u|@1KdX`EqNFP2hOB35FFWHdm+|GVjt+Q0^DRwX}Ym(Ta08Sx~$D`Kjm2=!vqSSI?ZraU_WHo{p)_GyN&ls zGuvXneS`qI2*H9Gc-xnvR%PhYR3Bdc12Rbx2>GF+nA-$)o($EUZ!jTZm{MTNJR{3A z8l$vDTu6`MbR1}-`Q{H>!^Df`swP^STu-r z1H1X#A-?aG&v%%z-6)(oOjT!n`a|CZ_TaI6c5AMA+^@i32qsK;UJJW`{rLInD1*8A~FsEH=jiwf`>5pSLW84w_{# zA7FnP`?vh_44%33lgu5U96~O^vO~Ssq}VD4t48f|!p`}CeSnM6>{h;>_lm3i?-c$! zFAlfW<~G+6`7b%Jnv|JnH_RF|SNeS4jzMxIfAE(j*(X<4QDfxpHD}_{@%~JHFtwx7v_T_lD7-;`GM1X1;HaL7+Sh^}b+CI7q*4Br3z-QR9JXPqUs|4#x(YrKlF_ zj=AJFSv-8X<`Qj2vU-M4ZARbF_S3|0Ku5*~PwdaLk6y6S;?kfY&RJtMR{t_bC7{7f z(0-Ck_J?HR(R{SXBP)Qxl8+yHCov_S3Z@L(xgEI$Bb}J-Huab!k{cnwOl)g=-=X*K?|Iwd6W)?C z5EnuWix%1t0EUoko+8wg;0nk^1~Si_fSq!5Ed*^`lh$bn2Ur9pT(jsap~lo8@EZT= z^Y6Evzat#V;bomoEX4w&c+P~%#^F~>6#}i%dBMihOLipZOyZ;Xo zSu92_6w|j@DS_sW=W?^g@K~}jnEEI8uGjDUuo+5>L9itSN8eC~7tZK!UiX_7cj5yT z-N~ey$9DCQH63NVezXE7kEiawGp!cv;^?^My34@Sp3c4Rt}2r&GA!%Ntz+ul-@r1x z%)%R!EbRal{rfL-ZYxd8dj?J*?Z{is#C)&C*8=`F*9!PVBBe_Zug6)#vlz>_ZKGP! zRWM|TRQ%cu_Ctfg z5kY{06Ui4Nw1X%nFr$Pik5*YrVh~CEp|_R_zsIbFHLRA&Xa3vAwRHcuBU*i@Zgc)E zdCK%}pgP@N_n@zuWH~e>im5CXz*JqC4QHVJpRR7Q8=jQ{ z_@)wA(_}0CSt+lCb9{wdUY0f27>{GqFzR*StN9UH=tjZtne|GP;p~(6$o$(uU-gIG zt&j_q!U2;(D|J3!pNIUTJ_cy!?=Vq;^?2Nie;AvGkkgoY0i{gx(O|IB_QWVbp6`tw z!;vdmtqpF)nn-zB?EiBCNFmVFjM_^>EWpe|7?O2dYKitJSx|%<=F2tehUbY2O?5aX z3j?lI9Gf&btS3>FXMmZ!8GHF7lk#}I1LnL-`utnX_mE)dESS&~GG5-ogNpxZNQC#U zYd20oJ&N-9KN&7fX?(rI|NV84Gwp)|Hyxw9;9VFEDmrM5gj|-q#H6A{07fKGDjD3F zzukLYcJ8k0BrA+!2ljp^GTP5F@?hN`8P*(hM>wjIU3W+q_W8^W7QSAy8x-Gpk7p-G z=z|D?BE{>hGhZ!ha=B{9qfDRAn-+xZ4DaV304PZn$eEQcu{5`C3S*v3sB2=fXIA|; zKtrKJxas7(cGB{7LeBTr+?%?Qx`#3q^Yf13?!34@w;%lkjLLpP)|lUtlCz04FYe#Y z3uRnxVvZA~k6p3Q!(g;U9cE7`^&g{1`qIbk$Ri?};^L2Ba*ZtXU`W1bI`_enW<^*2 z1W3FH2sy1xzTGQ%P{4^c1dfIqq4r`NEjDz|EVfLs;%a+{m&pHAPiEKt!zi3hGRm3S z8;oM^fu}1Euw(uY@|%!zrTHkfH@a2gU*V3a`GL#Ym4@ivwWKcb__P`Nd>t(?9lJO6 z)t^2Mvm&Ub{of>-JIV~$&?iLa2ytA5Tb?06UReW}cl}|ae!^l&oUcq?VDLOMJyPRy zlne9%7NAn}KrF)5Wz>#*Ytu|;fGo%VY4s~M+ab3`Nk%Sp2qsaJ6}}7F+eD>|8>Q9g z%`gx$5fu#C<-XY69Lhaj(Jfzbyf<&%)ID84S_AQg6$hD_(%EHGm9LFsTJHb2F3wU! zS`Ivb!Y~cI-??}GE33ifm7%<`(xHH_X>Q0?)0+?8hS&$d-KMmEzeT>kAG95f%I{L^xvbT^NUBGp~ZNI%PVZj zl3Taoo%&j8eC4{KNJH{^WcS(!4jnAg1=(^kbUryEN$z<)dFc@2i{jHu7*0Z3GM!D( zgJO~dK!SqSa97pdwAh`vVyp3mv8Yg}Hah|oIfpT1c4SmF1|dB-w^nA=)?w7?&h|Kr?;V zF}siAbkiC@1&Q!3dRe1;%L4`Vrc4olL}8b$EI>iwk7$C(3zo~1fzjhra;&aYGye_M za4`xI!CVqBhyW8<3NE?Vnmp?yd}?b|n?}s#1;@@y(5m`_7vml{Z|vbL^$1D2cYt?> zPywq~G>3Y7AvWJ8atD%Ab^j0r8}IJ*AC32y@%g*=z{K8%qJcLPbW&Ihrn5AHYFQ4& z$G-6U_RFyEA^-JuFsxro5F$e$twb3_5)=*BkiV3!{Cid*(-f1!hFM^$HwU-gRPhW% zb$RqfsBw2@ao79m*o4A)3xPmR>B5uM-2RB+GO9Bb&+AF_&?9SrSJLyPUPLebzC0G- zd;rGy_oSlZY*DJ(i7WOrYB(RsXMxcsO5Ga%A-@7Y4M?T{P=P~QWGE;i9Uup;McRCh zqHb4w=61TGHlJ6VK=~S1dE4qgqDd+^+R-9W?p%ukW#G)$^!&sElF(-|o7!Xlc>@}bosX_BC{Xs~LEdo#5#Ry*6gu~G^GY0R{YJKB@ zVdKfASs^V{vH<`v2&xwJ(L2|Lno8V0b`u*C{)#S_f&0d#0#nYH?@XS-;7kGpeLk3d zlwMU&zrzN>iSm#{3`4L4NNZ9_gaLYoa1JTs@qPRgzjc^nKx{N&Ja;3dQ>u)Op&Klzu6ig$Iz zcRSscHDZHXFDI-cV@?DOY7x95vLtwe&;84R$j!TKcD}+N_=h2M#y`akud@2!lC<-I ze55Yk;xZ6k@5!G*T~|+AM^eO3jBwa+n1(+IW#N9pgmG0X#|zXiG*}=t?lMR1E5xj5 zhc;#Tn&z5i?zeUu0vZ~MS?}%{)0%>UFCkL@E8qCCM-8GO5#&&mOwewEy{O1m=H^v) z#HzS4I@8LBa(eFirD=Ga9ZK8J{$_d3{x!Gzn4C5#>mk@?3!l2n=X-K~uN{V|#5g}% zJT=lUlwEH?^9K@B$92Ycl8<(&Pxc^45lr?VZIgy0Hz+kTXXDOEncJrXCfRnfcNHCf z{lXJt`GjvdlsIyEp6G@I0w^Fp*^V-h$XvG7&)g83oNgf+>J-AFDC7)@$d&y3h4qL- zt#p&|da6?!EykWD$Vs{!%1fM{`fDsGY=zC?rDxm_MSN z)$4%^zmKkYRTaZd}K-{nQE~XEyW%UNogHDWp z`uT&^NHxZ*CKUpwA9#^t;MG-)v>3Mj!*!6Usvoy_>biaZ$Qt})0W4&2;?mmq7{-g(>!l8MimQf(6Im1+BiN zdWOdyp`cADFA{Le?_p+2zw&2H752N_QMJV`_ZpRyJ%$$zgX)p?mMIsyJgg)0YL%kg@2eJv~5AQ zEY^4@nsK&b0YGRqvv~-En+(f4z@Db~m1A zkRh70K#Jyx!AX;GC>qap$X@MWk6mX*l;}X6Czvi;Qu0BiuaSD=b3z!UMP%c0VR8J^ zsA!g9S$^C2cs7>l@VL!8*DbT$wfI;&NHt==Z6+m6FWI1^pSgYed(-7Q0T{N#{w6T7 zeze-Y{Kyl#y0I02B083awx^7@luUBdr2% zu-s#*M1nj>&6YRF!wL-Y40Wv`)=>jvX@=wp<><1tn`36=jk!AAhn zkkTJ6Q}aWs(iDNqHteW#D|IYH+B7@};1?*jT}iF&*v|)rVckzY^7RUIxn@Gr#TY@b zMz0_HiLer!->n6uA0TXmW(msm{w~!Z|6RY`{iN2mz4p=V`!WNG`Y9uk!t?hagO|t| zl}osFkNj^jzMy{3FnLqEG$!KxEP-alE4tUA#Xw0nS9yC~AVU8|!QbJ8B6M(WMCP0Q z{i9u!+vB#I|H1&dP)gg~sU@skaVST2vqg?KyU6#R#$CvI!JV&w@GfLY7PnSB2RUyvhM^Rss& z3FBy`q)aNH(Ct3jZjfrY8YQgYosLi<?PjvvPIr+Ks)lOBUBANh1+Px-1tTQ%*gT8P9Ufu)KBy#rKc4`Agsf3ZzhS zPnJOUOxoZ%6GSbiN&PfagzDGMkaR)Vz~K+U(lL$|fw%$nFUaCIHvKKPxg{3j8cW&7 zEN#Etvjluj`a7GFZDcei=A1E(j`w-@I<|4U4u{qpR_ZDXETc63wZ3{x%>+J8QSH_g zrTB5k;|>uc&rwTDf0c^&LR3e4{`byne>_Vw$1V820GF>F2Q&mhTOsF|AdcAI2MA0h zZE@P16;sps1kxJc*x>y_bf!kjR#<#0vIKDk1hnG3Z0V_hT80aE+LBc<&S)IDg`d%q{ z_4)5#O^-{dej6anK}#x&Kcrg&wKR@E&kMK?7B0w$HT3ZuTS{v7CcZq9m;VW0jryvnDX=a z+l^PmfhEgbyATyY`Y-t^DY;goFG^dDF#bjJFcY7+T>Y`gg#x)_Z%|5WUHG_pobdOv z!bso!!8&<_x}GTD7j?j@cpi|H>JbEi z9CwYgr2|p@>5oyM1QZ8+$9v&{crvi(VO(9khGjSYXA5n{M@>H;O%Y)NjfUT(plPy9 z6ju@s8kdmnKhcnzAELvwy9H-5x*P>j41cl5S)iP-yx$e7a9J-@7j3Ux{ClegaE<6%lDp#lkpd zvHryWNngLdO&p#c8!el6#@$0dvH?57*&xiQs>ICv>y;1hHBs`^mV9XlAPO|6N7LVS*@ykG2z!Ze;I#p@5&wHM_7PENi(>%*MyCF2C ziL^)yDNo2{+ck~-%~P`T!yLOW=DAD1K9zc~QzhvvfFG%83KU z`xa;7I1zY#Ke!~^=6xRrr9U>?2L{0F+7qneRg zuanofyHZV+b@9o2)~&bkHFy>*D63CK7TceRms@u)3*#AU4&F+d=1NY1!p3B~I3yYs z9-9p&v!mArnrhAFMiL5X?vj^<3g8ArAF@8(v?xwnB&qqygU#;KLN3C{Fx=BzH$FLI zbR#VIpQl`{e)OUisBun)Kg;N~AHi!E0_Zgz-MkmU+|88NDu$Y;OkT;xea82ti{p&r zu4;|W`|!FHs#)OHWrjAq!?Fu+n?)T2O==X!lkM!_c!GsES8LK)GcA{piy5EkH?)1j zYf7)tVatN4k*hqp-*^yrJoU{Jo*+YWo3onw6BkPOc@-g7u5yO=bxdgIY;MXE+}a9k zTNv8*(QV$j?0n;O)Y!#zn5}5~Yk|Jgqfcm432j>O=BLfGYpNvXx5>v$^e;GiQNnay z!W!S4e@i4Kbn9ZLAsZIDcST|n$mCRp_z^>lB2`4-;pU?UL5(5SvUUASuNlTN_#gzT zJLhh5OlkdPgz2yD1D`tlLXaZO^w)T*=?t^nn~xt?f+W6(Vd7_np8E*U7WS({SSXda+`ugf+^ri9a|Q(wrV%KMHabo~EwHUJ;^f zrp2kL>q{vTjC&e?dipFpW9GDhXKBq}K|eG8=DzuQqd14$`PIGOGeuI+<*PM0HtF2B zFzr8#LcXSzX2HR%&Z~^CQA_ouX^Df1LaTNa-I_8~-WYhZPw|vnTKhGcTZg@GiYoO! z5Mp_Veu2_yrVvL+H7yTP_WkAUkVg=^Mec9v|Ans8T5xLBOyl<*Psg8SQ{`RB_qzJZ zJNM1ic1b7O3y~-2FEKEhUIb2=Tv@UBR$JzdD>s)Mra?Au*q}y3N*mb8NjEM;sCuVQ z^_MzLSF^9Bnb5) zN<4xDjo8XKPjk?!(U8HJ!hblMzBp^t&augUtX$#_|NGN#2=53+htpsxoF@nSIfr5! z7Y*DK6}@bKH2-NBJ|f9ZIE1&l9Q#c59d|-5{P9W@I{MF|3Fo*aRnIpO$|HOK8RS$* z>wp3ni%35s8{h>X6$2{BYz6MoJ9c&K$b=`m z9O5>MqW}K7PxDNHORM)|E5_4~3$w)+3ybW>?t|BX!ChaDe}h&{lE)b1^J~x^FI94T ztPcknW7X`f$Nkb)g-hNa?y=^{93)JdbaFY600wbq2y$pLz%h85F6{cxRowM|rrjF? zr7#brZ96$-bLQ4>LPN4c6aaxccpg)nLt$fr1q*lIYrH88Tvy~+5X}HkQGf{0K+HT0 z!KxqQR_lS{o5czojp%&p@Z<@|^&!7^hYvzUgQk=H-moyjgodK0LyLgmmN9UX1umFU zA4BRvm$=z1l=+lsXEgvVF>8k7BR5=A0Srf>W18pZA^^6S}w!%ms02g!FbnMmF0;%1SK zP>2FCr_9}WH7y7Cgf_QvQ>Y?oPDN`4P>wG09A>4Fwk&5%;LF#t4f$n+tp)LT3rJc6 z+P=N&^YpUwdU#I~ICIp}RDjuSh%%-e$ zUBhZfiMmX~Uj>?i0dEDcZf2zGHfOY&lZ^3?%@iIl(;eo$@&e&BJtnvUw_GWnNS(93 zeQ4_I^u_lQgPU$Qxv~z=HTY=Cn;n~LR?Sxf|Ij5NYy2^;QuP;G?)qq0>hw?{QAwKA z@T2y;p%cb~9%i8CiaVFkq|b&%rEk=8wiS5+h?-Vx!XBz17BWp#8blg)!8uTFthH|f3d7Nv)P9vBNqCq5&z3dAhLo^K(WDot1 zXJ8aVsn_@8ieJfV7xoT~oLpjVIpGjSoc{x?P62@QdDN7z0`5PF$pr2kDn_a*ujM zE7`Ss_Y9?W!(e%PI+9@_-wCZ7R=pgl8=vo6o|*tpB(k%T$86r!lU#rdTWDJqOcCN*6o0UOw?MBS58(fc^LL-d<6CNV=S#B;kSqP(T=lz*@jEClnCdP)N0m zp9=-;Vo&;8Mp_l6^;qmcGznDIh@=W62?@gqBF3}&rMcM#MT|{2iIVrbA$=px=Umaf zS~vCeUu)|{c`CDgg}y;>=j<*%`|+*YS*_UV;<>kqwKgs)pLnO=iHX+XZr)P-Oby_| zB!Y&(*8W0Kwd8w*FhX&dZ1waYu|N0HR*}Cs!B)MkT>td>nc2_F|DowB!=mWF_OdLU z(jwi`O7{{PqtW@p~rd={oPaa4&D++#N1yEC}ESpc#CkVAeH4OH+_2H%TiuyuM<<}mS}rv zk&k}6jr&_lz_i|d0W^Pn$-fF4ZFW!Oju)R&FX41+1!b}&2Ljc#tl8D7vA7k{LlfQt z0|)hx_t1~wWxk&OQ4BeI>N1Fu+%fv)G7&!l({NB=!cp?Vx!B1~BI+vW_}RTFG2Xq& z@~Uo_DvCSyn3JoI44$t9Pgv$_AN4eDT$WN-rUQ&V&Irv}xV)oCzCC*Uam$a<{_ybV zb8jh|{SH0UvI2NA|3dkYd$(p@RKJ38-rx(y!)uX?#HW(?M zflv5DVTiI3q1e+&aF9`Gf;X*O5{n;1qvm5t~X=w_NGPny`*oq(6d$WO@8-|Ujh5~06-!F^bK}4;i zVK83w9p&Hb(& z_Rc^{QCX2>-L(F*ftQ+dnS2x0DCoTZKy9V1oW+Z0QBRGhA+_-!y&o~odFT*FP|0>wY^`jnR6EUE;XAowmI4-RINN(oqdz4LR z5uL~#4=77~J!Pg>OA@>to<}uqkh@xB^eB+mw_n|UNb(V%>i{7GFew1zP|`kkkz0D* z9gieIq;N<aI@{u^O znP9SR04(E1^!urUfgQ&vhJv&t11|mnjsNAcf@cCrVIhC5z++M~z1t=BXg~kX>q}f= zF;m*JLN6;CMSZ?X2koeH2=YLe{_RA`nk0YT&*E!jW?Np-$tDksotRGy9?9UgjC~80 zBGw=g4cLfISh({$k!;r{>(FW4JBN*7=EFLd;*tjBlwlz|UiAG|sp(b0)pH{E<`5KT zgkiG`Qexw3VxEu;v?b=DJF7la`=tC0`YKE|F{s)p;=ie@W_nr`6--%&U4b4>MYFMZ zES4(RbtgmD!Nl8*Ho%3}z~~&5$703}LKG)71M(MXOpCOi8XO6ny--e~E1`(;!vhgU z_`pQJ;ApffX-q((NfHw-NaWDq1Sd+iUpn2gDBqeN^|<$SqnGLfBO^~wd?hf&pYJc7 zS6xMf6-PaZdol>d;a9w?$eZ8J+jc4(>*5zn_jncUp20q_Qw#oyjB&-%1GWmWWiOc> zmWiw{=OH8*7r%Ln202I*VhN5i%Y|;q?u@zf){2^o_&rXi?)Ld=fM{l*Lz=g=N)A#= zDh#+l<@P5n`(9J}s%>~$m1%7A?vMv@*n;@or#c${o=I2Y54lbgK3%2e!WU*BRPfti zgkD1|^Z=`7^whMsf5dtM3f=A&+?IIQxiq9nOP`MUAM8d@SKGZ9%cO4Ruu4Nmt&GX5 z8&s$}nBafCU$vB_x?(Mrqh4L0@v8DYo~Mf(eeO*O6+oTKI0`AG5t9DC-^Y$Rdq5=0;+T6O~eaR3f>2r?I#0#4uK1Z%5Rb)5)XA#wUG zoPS$VAYoi63_xP94}-wQIXwcWUs`!$uvx1s4U8sq6(P`VglvdaXy6n@Y)0W$%Sr{r zL@vzK?wT*lvP_hA8PtwerP)i^4mDk#|3P3_`$Kwas_n;!F`MX6|5*{lA$OMFg3U^o zyTMSmx%2<0ZWad&k_PcL%S8cYYCvivX#n4^X zKi0NS7uPINQ90`%hND(J<-=(%kIaUl-CU0g&9kWIv@LB91Ht$s*dl=M2y~ovA1Jh~ zh#?6{1HSGYTdJnQtZo|E`C@Fr*w_>xx{Va`E`o)u)`&bi31o?~GBz3vNCcofmy2k* zT9MliJ+vxHu#^f=3PvGsIa}y+_j|I931t8<=eCE1u(BJMFqKH;X14IC<3Ai;(cCO~ zv^vOhf>gV5N@XU>vD0M2-)R&oo+6v5%3nv`x<_M0CQL;ro_l&<1y&UHqg^$YuoqpY zYlnC?c}!jJ^QC&S81$J08R@he+z7(*>=mF5%L`mBojL1vSiB*OSD%lZ#b44(z-cE# zb&b1+G6bPz#|4q(iWI`bR>6;)^oQI)`N4SCvau`Ub$;%FhKA`!Era?&qW5Y*_7F|O zP_Q^4P^YQ`gD0~+;l<9m+(n+Zgh6?xBKB_Iesi?Z^$&8B1 z=ZySC$NRnEFAxP^|F>J+9BXa=H{iBM%P8OiMY z78uSEBP4T$!dy(9XfO}@ssUXru`w*9%eR#mm$tSD8%>r#bCjG{ZZW?C60X=xE53kzyXpZ;rLQ51K?7)oZ?C%^uxaGlJ1S!lBIu_ zU`y~U#l^Obk(;M??1U8EY6Wx>)DS+|rGj1MjlH619ugYQRC8-f@9TbRrrixL&6a(R z;s(LyJ@)IpKbN~&Zb6IY>pw6?=1p$S?Y_2|$6akLjof zkPXq_R7dgn`i$f;^NYsIXV7mAvzD+%K2U6rDq>EomorW#>-8z+J1i-lzyhvttNb=) zzq-CUt1N2(MIm}pr%rh4K6dOb{sT&|@*9YhD(L=7M@2Dh4yWgLc)Foe8{uJ z_!IleYLX2P;((>6G+3?Ob)MMWJn!_{8~U0qNN*$lz9Dd)*NCKqGkKq3s}367^b{@| zdD^5E=#zG2?flb!cFC{Nu-sPgM`Y0GiJ2NX@eZ~cJm4GbeY8y%%wcMYgMSo5Qee#T z2kR~O{+mfOa!m1IY*0<}UI5lUEM`-HAbhb9ugZG-Zva9*u(t`PBvrN!M&<-4~iY?)KKJ_1As|M#bQnHLUxbcO-W>@P95O zrJcW8mu%&dOzaULzes&(D7E`+YfMG|=-oUsb87kU)o#va;ZKLqFy{E`$la8TG(lIB zQrnf_NW-b^$~S}YmW+=quG{m-ELMl_6!4M{7Ij{3dESv%8rUm+jrPD{_P`K3x~$V*4hx1P(v7xoSECQ)J^IkW+yz7*(elI=X8?iX>_G3UhUx(fdIOn*eFYX}J9c!? z4D6K+rR6LvlRy>nI@8H*2jC$yfEoPHQ`u(#a3AssHnENT39y4HK>7)*!tk|fU-&4O zMI|OtWWLT))~ta<;NAO6W#Sg()wgBfme#6!*fZAc-=*KYt&JrmRd@#Vb4TY~JBX;$ z3X>XenzAms7TZW({w`{U(oGy)ijc~1NI%DSlhtQ{cf0n;jcw+i?Tki49`GfgFolvsT&x-OCIQ~jn^`QtKkt>Sp$2AZ}qR;KAuc<6O4 zACFHv(b^LZ8<9ts9Y7x)oc-y(jE^@h&Czi`K|9=)e)zW^dm8=jFGN+!jD3KOSz)6h zbEYZ_Y^tzWM8ZoMtgV9My%HK-CxtV!oAIN&uKb7GGPAtCWj}aK2FhLvKrr?`F!F6M zh$C1DqnpBerp~S}I@J%JDI9F)kh#VO1QVwCe;^7C_;+fGBk|d>>E(E#a?S|-N57i- zn;<4Q1I+%Jxsf3u$Y42tr325-dk|#_va-`3d!1nt+=7Nso%l>yQ$p8?3^%jt%5TFD z-Y3FH#;#jgrL=_M7Fv@MQwzYl*w%n>qjnF?+uO~(1&z&l&hru>-;cGn+5`8)oit&u z$LhF~t+=KcXzLH2q_iVj=2^3rC1fuzm^i_;{dE%;AyIzZ_F=;Jsbx2kC{>rb;{GTV zlmKmRbk|xIHcUK<45pN_lG9Kalgy5e{IBKjlSHwD1SL9aP3Cp(t>yS%_R>yiy+IaL z>*0`Oq|p|9#&!6k-?wJN6%fumf^SOXs^3uR@1JQ_B#aa;9KZ70dJ=!DFedtYsPJ(a z--4ty4@ad*uga^)J9K41q=&4at;a+&I7!bcMFB&*&89}mrG-bKZ%=ncgym$uZug#9 zDcz^LxQ!#PXN@d{iu!g17#2**ml%rNW3`eOcbgjRKfa5tX!w>WS0c}SliqBuIlC#g zj4f{5om*?-tEx^5;0pf!SdHT_+EDGBvFFm=-D&-Hm&Vu?x-9V)edSFD%!Xeq%fOWD z{vP3Q+Q((96bqrG+J{Bcj29gw1Kg)fGehPAP-H90DYSbM7k$4sD^sD6q1vUx0gr5;+3$B}LKPEP3!$HZm-Z%5)U8+2bXJw}{wj$21Jvp=pu zf2)1LZWdLZnBBug5q}SmqHw_9Cl3C)!?9j(MO21#+L2bLD&)?Gv>-8S$c~Qi@7xP5 z;{MmQ9R=cn7Kl{yC=iakMEsGhm zqI%g1G(AtB>=OAXoR<}H3LfnDpvj^$)mna!_hBuzTcsImlpCw8f082Uf9Ws;sM6|e ztNs?eZn$%*Rz;h3r!+cP5i+wiAxzl$xPf{Mt+sBDIrGP0#@%a8kKi(e?)PP@e|Wpm zi*|EKTsr7=SwEh-UXaqr`-4l#jFOiIJ4DH~wz%4RFm|(*zB5=iP}dZ50{|*&zSO0~ z5haA7Mm>fCYOo5!D;sbszNu#ffk;SJ!qft^*I3!l+P^@WU^o=8rayaMpxC}iF}*t# zoz{u-5DAX?q>0|oFQpN>N#SP1v@M$IT=t7{-DVJ5L~5l_`A5<=^`QHzvF>XWx=m}a zb!No`t}5zM`dIjHj}5Ok3Zf(gL$*v>y*Ip8)XsWhV6nIdk7BtHfa!Nc08x{!*UCo^ zVfTVQq{6buZpiMZ{&U9|sZ{MxhPEGt#CFQdCjNKh8TGJDv@j5nKcZFM z(>3>DXijI zw(j>r(%%Je5e;r@!Y<93g4*$CR{jag{w_6*w1q*{l{Ll!Ilz+OeE}Q0xJ!lXpoU?Y zOadVU*fiayu>UkreRqa;aCF}(n%2ISPaU-esb@;o_$s;cX%@bzydYkm{zAjWyYA5b zk^J1sF}Ezzr3|9t==wykBg29w(;vi*eO&mZ41^zJ$a#`@zEo;9>=ZnE+Xd(~Nsj#c4 zxjhCmtPFnZ_^kc!X)^9o_zr4K`nk^R5u7zYcJ*zA#eM?42k~k`TxYV;zDfN)eFAP6 z5;+M>Ix&0g{wYDCMZ>u!|9X{2 zUr#MS-#crj6wJm*5ZN`pEDoK?If_l=;i1=lKobM}LC}0-%fOC@PB(DxjaTjYqPUTO ztHI9aLx8}iBJ)tM{xOi?ttGuLa7+8hmgbaptj5ej$OS{Spo8 zpZ!C=h#V2e-+BV#4s|0iksn~NSA5Q65P2^l7CDmS+#aeM@kYE^qf8UdwS3%z%S|-; z<&wvkL{u4>H~roZGEZ+GU%DsgTS8Zw`y|x0$Q-{^*|GA);%UXK*}mb9*t=|F0VXI@ zXf5{qo$7k$Z^QklHnp4PMc1@Y51p!Fd~Ru-UhA<&3VrVi1|5ea z2veVULl&B$?!v8NqaB_vE<4!mQ!k%Rm?p7$kO9gJe*vhJN+c@+F=t=bbQ}-wk_9zj z3f&N~2yodb$Ir(6x99~<%Kr}FE%|N>aV@wF^bc9;%0RNaUh{3j(-$Mb)~_JuW8w%9 z4%e6o_Io@I-l=+{ph?C}rDBoP7p*R77b2f>I8OR1SzFGQ|g zNh%`Z>`4NIuQT$UN*(dWvW4}c5a8-7T|F5ch9~DhJ1EAetS2&BbgQKh@-k933_VZV z`8q#sSJm=Yp$Cb+Y}_lWuCVCuGGBo3hwRK`JG}RHG6Gy{ImbqGsfuikLzXm?l$62n zAWBhb038VmYk#@DHxsLnBbRuDZn@5vNjQHWdG&(F1;hozMOp#eW^S-Z~-pCbRN_=~a<6MA0lL#U#xCTCFcY6m5_B!{>_g;hy%lpcuG4@PbHBgG(n&(yn6rZ1%H__83{Q6v zzs1(jJkSAA-@)e`>y7OTsQhqUiZII@JOg=>g-uBqq;*0877v-K9W^_s=y&+BQvLULI;VULnWOg%%YM zN9?_SSs-P@u=oy8q}l5`{n51gXcADt5}}GTKDapHyu3V;DYi^uI9lgTuV9avY(ya^ zw|8*+*qiNkdFaWMRCOXiQ)K7I@-T|PIMRg~tH+zzD#$lCfjpfOa#&Q+u)$JMpZAgZ zxZ~ivWA*lVzaQWqG@)guzY*iE+v!}$x{Ce4I4Hl~@I+lcu+9B2Sm$Z3ePQz2Ocf0w z5r@1ZWT?#Y{&oLcIDWr>Rnkk&flP^(iyqn>`PGy`?A8E?9GEy%-9Pd4=N~ip{J@a( zrH(Su;sepsZa7S)qrq@pZ4kz`_PitztMB=Q8f;h+C68VsrrC|dlZ1jD9O*yHvWhF4 zmgG3n*x&wrYP`{ggbo_5uT?=1-da80f zC44P6+_?$#%{%mh@qxcrwy2#(j8Da{aqd1H%SB?fdAy^8+~hbsHSJi6D2v=n5N_pc z`Ru*>UT$s))Kp$J`Rt~fNobBp1v(~5;S>r`yE!p}h60&Y=)&Y_%6`@37`J*#@^=7w z1I(q)4yQS5#r_q2!Q>jybxr!P=<|9e5R=3ILIeJCiSrq))n6?aEf5hk9Bor9IBWQv zXpYwh*9#I7&TOFdB~^~S^zd>ZH`7W9E9hyzvt3|$>943gn1jFZgr7UxJz|u4C_TsC zoyx~YpM~k0377r1&};URyaof<4=BE-&Jl0t+|kyg+p%1&V|=mt;k^c--c|boL*^9j zbn=kj&+DGHi=wf0jYcJUk7sFvR6_fEB0{@EVgfuMB^=4n5gPLFfDH&HPFYXHI z7(72M*9}{IwwA=yaslRrQ@HEME$p(^SVv&Z$gLkcXe_4wyY5SGhWFnQQfr3~OVKx9 z=b&cKBnE`pGc?>5y&YCQ{tA0Emhpw7hh8&G#NSC3uX%^2V>6w1h3&l+xPFKb`T>~_ z+l3HV_2~y1O6&$-&N|j0*^)nA;KFsCl~4hCX?{FJf`23aF+lCv`6Lswnz89F3TLgi zf#(Ic&vXQMn}Vp=tcqSJ-Eb6DWuKdc-&@Hhg`tE-R+m(S$1Y=LPw&`< zL}Hn$s>kk+=G7Ms2a4rVe_p9n6(2e0CUim6hWnpv%OoE!p%#~%RnRz@&^=q!3driM zU{-?XUJ-_MShlL#@tN$9G7-oTe_wf1H`!qo*C3G1YyRC|eK2wB=Uh%Ge61fL5!+SI|+bYD?=)@Qwm znM~MP?SU=iO=WWHHX&22a!euI3B{2GY1%lYdLND<;_)_0dD z#K_;tSKfSTST|agk#Dy=Cw2$A2)#&m(7%x^id54cl)8_F4rQs54zelrP&rIM8T!TG z1#ctP{WWy2Gy#wR99+D#@_jhGNCW_h=H+k0H2>IolenIZTbgK7-HpWvTq)HIrawo* zH&K7id>;tkAaaD01zIBRQ-b0v!rZ8V&`CHp`upjO$sthn^w5Q8$g#^){w!J8^46ck z6ZeX=xr%3Ot}nwrKU--MXZ|Coh4g&5Io8eJIvO!$e$9uuOA z(R#P2aoBd&LfQ`}B?kEBk1vh6(1^1d)}4zc{nPrm?z7z|Rs33F{IL{uwf?i5+~Q(I z>1%lnvl5z5^*+P8?#41vmp82#H}25TmrrF}nmf z3+*b~)OZ#k!?eF5_xkltMpSl|itigpWpf!Oth$Ov?DqSyWae4+1WrJsE_z`D#nytk z`MvF>AiYxi&r#0>p)>=8@sVW`PE!Z7HUszkXXFd7cmtG0@(OkIz%37kBOkjmGIza~ z*5AR>4>nV$^h)pW_Uo6uaY9sRrf@VGN6>Sz3zctLKI*^x+n=Dy^C1b?8}J?1Qn>+? z*~6}-`ELSp{3Y7%r*gnF(IwH}A!_zNEr8zvH4<-FSbjS~n~a7!a+I}2J|!4V%#>a1 z?5wiFNm#n|L5j5sbIOu2e3&}d6{SVPIKAoZ$AQlUGLuF1{k(5?TLY|2L--jWDCG1L zsmqCj)v&QH?*PXrjlDG!b46RHigIF_)<}4KJ9AJ~fi6FBWUpPuW}VN^R1N_4`rU4o zV50au4&q+G&kWB4A>RTpsaZw(?(443W9`3kRNY;ge>}*6`y1+W`se}RMD z&Y!o(CRWBi*Z=jJSMIMAWFp?^N}q``#VOELV#+2)p5LL-L&V0ICWmPMeB8e=86n}| zsgk)sQ+Z3&FWQ5bc+m1!t7O(x^};9&ERK>EQOr1v@m4dWb#K3^zh>N$qR&N14Q{C* zs75q<@@m~Q{d>DuoJ&;;wDbP+U?b)2Wx9Qex}~D-mf+di&&_nfjw|gDSsH&Q7H3VL zv5qCHEY$01jMB(GlJ8Wr3<~Ik03>A+{LQD1s0*P9FD6z2H&ZZ3NNG}74NOsDPd3s3 zgGVewb6^x~Uy>FNEWhGAj&GPEncv5bhe7h80YY8WI75PuL?GG)Y^M2JL?i`hC6d!- z)Tq-t;Of2KWpagJ#H+9VOrHr3|9u8AGbNV|y4JrOW(wtah3Cblo(*yY7O$JLEsSiH zw~SUa3p=LgK9zEvZcBf!cKrj@*)9b=I_2G3Xa$??bX8yym_0g4uGk%AS}`b<8U;lt zI8PKH28c)K+zeE`JAJnvI2t1oLS00#S^~eojRzQ4VQ;cDW0%Y9`tMb{&=NE^^qXsd zg6&}mEey(0*%hTi zsG2O6WAzW6tcg>c9NHGXD6j=0CCrSavEeS_w)cYr)>&C#&if#PIlzQf7VBJ?4RbIV zDgP@E5jt-1x^pO*ghU#zFqzvB4>|14a{PuaMq`9g3#_rcy`Ct$VF=}_Dxq&aPg2+*$q3dyAnnMPjxtKei8|FS7E~OeIE9mPw;}k|H zinH9m!CN)E7d?{hM{9wRghZKx8oSl?<*47+Fz@{y10-sI1U2cI6u1LEU|kK^5pGfx zOXa4ROZcXZ_Q!a$pWXS!z}Rt@TQDwcO}t?lWVz zF)*CTo*~MZjIy&HW0h_!WE{8Tg;qZl(@u__aVg~98bh~eChIPyh$VkT=tZtUzxibh zsp^jV(FzU9aM`pPlPnDik3!>6t3>WqyhmZu8SLEF1PjLy8|T2!pKQl5uxCwR=}!k& z|J{#H)Hds_5SBN1-Ff0flRYTEzbsIc7bzcrg9xqxbQ=aF`j$!!Lf-tM+EgwP@Kk)G zFOM@DQ(wy1om3vLUo4_oT$1f=&@TExp9(ym?S8pj*WYTP+OvXCBSS^HigRuo;bX87 zGeNQDzoO;f8kh&oLX(q*32xM?Al98`@SS~(zjUe(AozRFp!2?$DaO_?@8YU@e8HR4@%WH*s_VR?b%n@1oLn&lx_Z+zN>U$3||3F@|qDa{OxwZ%=e-| z*7q2D=dfA|y#?qo7oe&%(6sc_>}39e$-(>P6|baB6bQ*%Ul*>Q{T|!|Uy8!01F8MT z!Ety?FnBmfokuiN3D|LXrEQ>^WHLG<$3|7{inH$vmdUwwIV~uD9vqWAQfL25LUBuK zzXvIR_RC(i2t7U3(!lil=fCV>ig@pim^LhyE;2io_2Fgt`;TO!UKjPf?W|apE1Vpn z0JT)V-v*uY_x@M*`=C~dh3c@XG?16u?_lDnN8iqq@*bLmrW*m^jd?}4%;Vv?u?HmWG&siq#gI0L}3 z3H5pk7|;N&d$?MmnRMRKc9J@3guOG{i5|-lT`G^2#>nq@i6<8%3r+Roa4)OmhmCi>0Royu}4M^DA$4!DV?^J zixOXro$Kb#AnLjBN{B#&5QSY8qGm%ky!D&*rj6MjC8v}!+4M{k1fnOO>gO&1C>9b{ECLriVFj{Btb2tbMwcvDMlB0KPfVv|tl&Yg+ zbNpg#L=)P@@pfg|?PNL-sp)`kYQdb=R@vIODsQdMQbgT`^A{{3VLc6iKfL8E-MN?| z5YxD;&SHp5TfH(YZ+zcx^IAlAA;12c>zOap!xp{-muDUZMCHQ$K_S!))mU{9P#|r~ z0O-*q>;e4w@_#yKK!do68Z$#+t2ru>KEQDz0f2gLn+H9yBrSV)JCZr*fV5BVx&9!4 zftYyRHo8t-0frp!&RserVZ$$2B87N&nXOrr#@#pKesyHt9 z+EEUuF{wn9?#q@H9-X-^3!w#b%WKjkg{QT_u&yvD)t_A+J~0gAd-*48Rp za`aQSon9m{eF53)b}$Gk!GW2!Am=(g6BdaPUjKmXeseu5ro-}Lc0#_e;3V1EAC*9Q zb4K4;I5=Uh?b~a}{;f+F+O_|S5Oc$a{J)!IW!Z{T zUJ^88NBmA#-j91_*wb`B^xycM4cwi$Kkxs@SsOA2%?)cXi+GSdyRWY{ zxBi47Q8kq?vrA8nb)xY2GcD)Jn$KBm2)WP3E8rTtkOMm;j(@v7e?&izJ4ZdSk8)%# za`7eytmxBK;S_ur-PbJK>hoq`-l~xBBnADAs6Bf?wijPI2E2HeaB0Lk%v&aK%puq0 z{WV9o_*O_lb+U?&y8-0M+H`u->T&&8>iJYiJ5f4>(a?$^rs|W2$epu;0=DAuP2MU% z58QYdHGl~pT3A}@J}Z4^Qi@uO{2sx8$1DGhW3pLk4CV_W|0kg9(9%G-5o@~hj z)7z~c8n^vYkBw&w!Kt^ZErMmV&e{)Afd##@bH9U(XBAjWh}Jr{v>|y z^I%F-PiNx06W6U!-k0G)%xBuh7JvAkhuW61vjOk}OxgGRy6%VX-~(lInZo@|ceAm1 z(2MxWS#fu*_K+|_ZTF112QWfcT>%c4F^+-HiGEjp2W&82c&94P1XH4eGvgDyN1kfj+u`=*^)1HAg+6|9<{P56I;PX>CK{H z!_Q9JIi)oQm#4wh%h2j71)(ov1cBf!v#^R?n6x@TkN(n7&;Mv5D>IxCjW z6gz)|HK)1H_4hT~{I;Ces1Zy%TCLh4rE*4Y-l3EA#Ka1AqvtelX&3P|$uy=d{eVO4 z5>t_5xIKkRe<|0@7)qf*-B^#S0{97tXv1>E-yJ9Hej-30mN%520dg9d|M>P^_2bAF>L%aHb2vbdvx$cuLY% zD;Ep^f79pPM=Eunm&(?hIpvsE;Wu(|!fyh?DmK{6;|GI4J9;{N%80!k78kvTIj>ah;!zuDZe%-b`*1rd4DzTPJkh^<8Md7}Vp-6wWzPO)7R|g9I{)g5uy( z)|pK!A3Wt4_1rTxMx14qFe&|~f!!XHO1~GGwzhvToog6eloR^RJyyFU@3DF)__J^=d4az2Rln0q z&TB)kICZv5K$aO*l%^WyCMu4sC#A<_ZP*KLskz|Q9(dngd&8_DR{1i$x{|T756?kZ zA?@1`l73w==;2)Bew#Stl__Gf%s4d9C&wjIv=9)_nz&a^F6B}J zQWhKTUiX_Gb-bE+eOvj(;P#J%1k)0MA?@mykF1D&3X&TC&``JEC=$^Udb^q74*u{Y zh9aVvr!8mCp1Zj26iN$3VfCE^`h@x-^>WfvLP=bNw!})NuVxS&p>&Dyg-^PQyoy2r zWb5MUy=F&yWXc8pEq~g_K`VOjH65lONgX3D=xlJXX<6mS+?eua%3Bmu})Vd+1I)f?CM2+5^6-?Ws5&_{TG!L{mLm;DnHh9?3W=q^G9uKLb)*6kj;L9sL+>q8{+^hxaH~ z6Ye7b-P`u=&qL^-5oMsT5-Y89sb z3xfNH5E4<9ri6=0hwe-20wn;#uXhHceoyBjL(f=#h=pSbij5IGwI~$!v%xU)H$*K@ zfA4l!1zqPyGYyN29^xR*erVN^Y;S1Fh_kG+UE-_KY--<;GfVl?w@98i70WdPs6KcM z_4otEBEFF3tP=`2>nbvGeI1>Y|*b;N0CI zpvNU_pSzWlkdZ915B}>rfgajY>j}E)a&F3>ob)9eS5`wa&n6gFphqaba)P@jtzL9d zgZ=upQ6uh1;nTIkcPVkdmFwqh;X1f&Wc0-C6j?TXNnphu0cGEcfoWjJlW%cKcKK*i zt@JKedcw}c^Pimi+c&e9&Zb*)VG^?V6C*Rc>k_Y_t+mOOLy8C+FpDb?g916P-w=ZW z4`?(iixOs-ElL$XUE;HIb#d|dGIp`jrA5w7Zo^Kr%yRbcV@2Pg#B8AmgW-<6Aue;b z&lifLNUxWxX%Q5KQn*4ih6K-qD(^2Q8+r>>6upB%4@x<0tN|Ou+etx8$OkSs`=8)6 zAp;YId-|dwo{+2YwU6kKzu)_Ob(Mia3LV>!MI9A8q#n9o!nB$|AIY4@3^oIZ#llJ6 z2ao{?dvDdv){c*Y+*Z2+oOqTOgYSeJY>1+#zfw@K`@H2{XUy*c)QbR5S?Y=brko8y z*k5W`bNj2z3ExnFR0gkdo>1G5E!WAF=tcQq9q2#1HH;~6!v?$$x2WnCR)dRfOTY!g z;F0IcP7x0QGJz*SA~>l5(zXI2_K-=OP&Im9;xaKGqCf`gg-Q41A#Feghw#X)39UmT zZ9sNAIhA&2?JY0YNb2XmA}&bl0g3cJ+q994)hRdDW!R&Yb}Y3+Pi;R1zX|b_&9{}( zW{+k|ion8za%ac%j)iz8{K0xoC~&yg<5c(J-q9s%!=nbCG_%1T9NV)x(~~yX#oi6_&^Idf5){o$M)lc>K<4=iX13zIy3i?uICFo zkv8l9KRH@nuav-3ztByX1f&K95sZONHc;(1TlN23Ihw#WF0L6-lu zfTpY0+hYApIe67l^f%&*N(#8@4|c~+P7Ks>tPAHtO;2c{O!)KjFUh~tBC{_-EFwnx zp3-~=DR){e(^Y^9|L;_W8^dcKyl-I{2SI0khsR8cLHfuTl@GrS*~RO&OZ%#p;?d_*3fH#34-i8sM~ zm2bS*;3tUTQN#ge}l)5bkS1_T0LlLHhDM{B8NM9-WfXMy^VkL#VADovkR(>k&r$zv;u$8eDU}= z?24mYCi~nf%s;1)OAim%H6Lt;a;=NgDIRe{iMyX94V{(Gy?txaF!fVjw!*wF6z}~3erg9`~-Rr~(hEbm^$#Z+I!|HnSi&S5l-$&0; z1vV=@74iU~smN8!{=>c}U9V@U>!;eLo_lm1qY~mT6ZJ#L4yq{E`5vhiyZ<>A4Re?E zYb-C@OV_J(jMmT`kD>@q0TULiqtl?{=Z*!BmyzfYBi#Mp!|h=Txol@S+Ltq^BeieE zNH&p?VGKwhd+Te}{S~PT&A)aLn=d zGO>y5A~0;BUFO*|yf2)~54rE+H+-o<3c7cY2Xc`Iw)49`)ZF3LAPw!rh1rW=nGdB6 zU0SMC<}BwC4PWJ*7dA=^tVk$e+w?Sku_07+YOcK^9vz4bHAg})vxvB2K8&BSC9#4D^@H*V?QtOG@XctPZLk=Ym+nX5+eUJ~bF`eO z>zTJ8I9}xtm@R|Q5Hz_zOxbeER@9?o`*P$#{LM)Ldl#~Cn-3*IfVaHNd3kbeNzA?8 zo5SDi)WEh3x~<9{XjJ=QPWy56n$tN?+`6KKI#Zrr>oP&2P(2U!trlZhLXk;^$xC(` z5YMYHP}Jt074!i4GP`U{BMCeHhtE}#9KPDFV$R9o3M-O_KBSQfDJo8Cy4|%S5?^sG z+XPiDM&s*pBqfj`-4t;jllp!1rC`?2EVzKp?Wyu}1Cd*RBJUXvcf>!&h-NXg8wQs3 zHR`sDOI!oNFUPeduWh%Tds&h>&iC?FEoj!WEJC8+da>msN#5ooq=|tssrTxiX{BY3 z*rw;uHo0+A4BYQ4`W>fDI0~4RU>dXkplT%|xr7_2Bz`Xt{I!3g}ZX!cwt zJr_wq>ga3OY_N0tdYpRW<9De#dg!b&uI3(D&I}OOf`R|7QanvI1@XG^AhI^g-09ZL z(YOV*5^3v8p(Ximw&h?X8i*-m*1KNm&deZgIdAVw%d*U1o11Pkz)Qlb)$Wt{w+_BhTfkcJKKCg*;el z@2$6B^(}399z)3+t0wZeX#e}w?83xPRm5b|K;IOJ9Ry!vUB-7^FcqWteT#)p@$BuO z>zIe|0yMh2m@xk&V^PuanXN7C5HW8?KDW)QKt(u7Zh80h{!fly6{k#L2ag-Dih&o=lP!A&GiI4a{d$I7%obAo5S3%MEvm;AXybi z(T>*8_Zhy@gzt~5DF-- zXU6R%Wwy>L8V^;8kWgF04+>Y#p_;2_FwY0Gzd0 zIh%%O!{h#`HCF6d_qouB5xKbY6IpTZR7^GgTxLFDM$8La04ZJ#;|L02e|3;>Aen8% zS0o)kCm&*b3G<0Sg&en{-L8j`oOvvtQz2yY`1zdRTtfoVPG=O?edY&u)r6&B{m0}& zr(3EbILp`xJ1rwzzpQ5ut)TbrMXlU1GuoHc0t{&e#@YO5$a!1tCp-pbl$umWK zCquig!?@mjBlSX>=<w($2YTz=Yz_~for76{ zH~^PZk0RJF%k-~8FuEGKUotleTLP65QL0--q}v)Qamx{qO`Fyy)wYd@gin01RNdt9 z?0|o(&Fi*8@n_mxi62{B>(RWRWo=_j`1_QaW%QuP1l=O+>!A^{IMEVp^s^ce_}+r( zbST`mR!=+0#HWBSzDE0!kjhLR=(PY{Cvo&+UDQpC7RnLE-IpJXQ^Ter+us-XpB4bT z(Q5N2a0%h-5{E&MdDm7E9H|AKir5)&>_t&!Nn@C#A4wTrnJW;MJAt?*@n6?}qKB*z z!N*)a`@wtwF0(MIT*eR9ZH0ARhS~QS2>zuvOs51RJF?8a)6l4oXc$z;<*}}%&64)^ z4eYe>|B1UFBEkP6bm8aozO1$udp`|q}de@GalP%0852-b7QR&G>B-@8}4tZ4cGw zDzDz%zGOeI=pcU(dX1NSf&V|6zA~zplLgW0c`0||A?0;t_4u}&n6WfUwu`ji( zh6*B`IB6jR6X=UgUZW~^OtMn)5GmUcO-k~1Fco^B#MG!v7+}~MX$?Z6Y?b%eiSrm$$9#`c7zYgNLv>diSKlu{vqH~j5TnVk z##5hf>)RfDLB27brf*9=rd2+1O1PPJd24*WLr3J8MCWn@PWJXqfp62E-ewI?I~7q0 zC`Ve&{r`Vq98BaEuY+?GuW;pn3Ba7r)&|_;2=jg2Bnqs3+s-4zKjnbj?my3maFGobYI(>Xd{*C^#+Mv^+!=0n)Y%q<~uKK(< z#ZJHE&Wf-^G+tVls&V>zJO5bA%A96c*7 zw-PNvQ zt?ME!dQ}%HF|HL?=hB~;W-m574(?Lx8Gq|s_JlB0Y_Xvfp(BVC4T(hulf;MnJseCKb*Rd1z2daKnpodG4e=g(=w556${ zXwY}H2M?5b4UdyILc)x62do1cyp%Te^aNEaIC4~u<9nAwo737>f@VUCt;)XDtr{17 zqA$9a>pY$hXe0S7z#Bvn`G@aeUg-BYiL5(8lg|r{)5>|}Yz74ebp39&!KThf9+C-m z)MUyp2mKO*I6_k?Y{vEX`HCrHlKxl+rAB0TE-IWhuJ(0a>{xVCadz|!gHkNKq*!hk zdn_`Az|6ZmMZ*s>)3kSdoJQiusvtfJxIQBIFw++ufh%RP4MOqn{p0RY(^pOhuZ}%} ztld8w7dh|SGSelc8d6V4pmB&liwKj%x!-woD2at{l~v3AT)ee1oe2%bbFpLnw1l@v zO^i$*t8sXgazi_wvG_m>M=JUB_tCdn4an{I!EAyK>X~pMwng9eB)iuv4&R*jb*uip zBTMD_lK$uTiQV~T19BbqzCYRow7{n!xS~7Kjlu*6bSL4wcgu-*g+6l4S@8Lfd`G=k zqR>JY!VKjnzVq~zd$Q#Bu4$FC;hR|KW&zr3_d4Y&ydXWV)5{-*Wk17*|>PvY17^vCaeLsaDYVi46LmzakGP7``9#C4rwCcQCp z645VV-@QAQ6BMMc^ct|NYc=gpQ;B`cycLd;h%euy7J9Axtc?EN_+jBpp%HXqlj-)? zzINx5u^B15VG>=ong0yO%ehNO?a#y){-WrJ&u=tnl_Pl%bsm2WB?~i*$=6I%W&BRu zNwHr*?AUtD>3;yrQS5plyeP(ig_xV}I=sFNj+9(^Fcl^$Mz>$^a(;4Zhh9cnb$OxL z$W4$X@8IIxl~S?H6xXTEMJkmUo}=k#rNuY+pI2Ylghe`!s3zUn9m|FPEN}-AsoS@b zb(wf0n**9&qw@<-oy)G<{9IU7f8Ci_3Jn3-(kUj2LZS>luRZ4C6k0dt?< zjb58&$8}3roWHk+{NSl|+!^4TU+);!vu(U4Anc*3V`kh~s!$Qea_Z}~mFiFhObI3i zmSjuLX&fB1`cdnf3*p^L{@3*K z1Hwk!C)ElUu8j{52G>w}q>v>h(!Ovi5BYTe4>9P*p5`twWOZ`WyVSePM|EEEBj<~2 zs|^p0EV4n_kmS|fU-#9zO{_)2qHKlEZ!biX#hv=w5cdKmu)k6-%nM6ODSOY}8ZIb? zlBpIIJ|I)3n!|e1g$4agecmgy<_YM|*H}9?Ry(i9r&bjMIfK|kDI(n^lOM~7hn4U~ zzN;XyDxZ~z`fB+j+#N>VtxvMj@SjNBqenmNqxSCHMWt_JEAXvYtlcDgYJt=GvLwQ! zM4X2I+4LP~)MBkPwC zYJ7#yPSEi@iMTVW@rkqdydDI9$a%P9Ho}17*@ZlF8D0|?S3!%U(-iOUT zF#D2R)55XBu!|#d6>DnKPjxE;6@(gbZq^GK{#7}>MGw<&iV8+A5N#C)Ftd_)jqy3* zJsJ~5o&naNl_f;o?!h9*pMeW9>)K`MU*w2hBXg$)__M>0 zp=9}9C^)to`_mw1DrqMBwvTPe^}&ygNMw0V=FUh%G3a@Hu+eGVO!c`RCy2I+nMhEK`(^dt_G~lJSJYN*b-oM^N(9ZGh%dQ zklzKeU{NmBdSjqsZ)|DCC`!i9jH_K1l6MKr*E>6y2e0Nl-ZltY&9!ny%ObuueV`{- z9vP4q1e-#2oNYr!d%PQKh=Q)r^v(Bkdzc;9)rB)|Y{Fc;1QP5XLfz7iZD<%T;~Em} zpPFvXflDi#?nG9$C>?)53>nC8)-`$H%V-aaou61@%TSYFoFE{YLSbb_P+LCbN&at= zwcuLp=B2>GyDoPxu)}T@lFV;gQytbF(jh)f2vPYnb#JUCbTcb1)B?|V}pcl>>b<_&p`_nBS zcHXGfymgJ3x0=i>wsDC4^`9WA(Yv3c?O>o{TJ11nY#_@YXK|xKSmQHP1si_xpes;n z8vbYt>g;)Q=zVFrXYPNGHFvgjuOYyOuiwsR7pa!>D)f0Z336nI%y#D>HHmX_RCNGX zYC|q(uQbBlQ03Sva@X2{k-S)(*-jU63z5gYc}JIHt0EVLbDHD#j#6yo0^2Fuu_Gp4 z-`Xzu@T<~cmA8>u3EXnpFY;rBDz5rIXiu2zqi_vXmsqz;L{?~X&V_%b^V~BX*?7G0 z7bLG0ol~Y}A`|3R6V5WRlg3n`I*0dWke_7vrG&4a7_$3Njr0u3&S-I#>kxUDrbj&f zpl~}%T4e6?p;DOFL|W?Qw>NA))Z=Gen2ASpqa?ptm@6DrEp5AX9JrIOemY6C+p=Sy zZ;QyUfF5N0cTJyiKjSx<$BZvo2fa*Q?R{@-p+`QEhj%?R2%qlYu0hGtmBfo7?|EXD zF$YaFi1WVm$4XO@I+t06>B6)6J$fLhk`vz!L0 zOEAW+!r*quyNNBiqW51CcOG#)3VnE)Ed<1eh{B7vG_{?>N3g?=B>43Jo{PnO*oP0k zkTWqBk}VY-5p!upE-3nOBzIua7y3S=Ya#6~ZBkAb23vbE_g2Lm2XJm%DGPxl z389$$&xUvdbBUtkS>@0)?hL1|9J(E;Nf;u+?6%egw4NRA4UbBLDd|C+(8(?HLGL9T zE};9iEgu25#5v!i#YNg$X8A?Y(3PX|OW65n(jjJ$o5xH=yXq4leP@l&4_91fP|mk; z6570mp=4(D zUkxippo2aSvhliJ=sCZR`pFg1M52Kvvzj;&jPHS&<9}sdEJByG_0rr0xQX-Md$&by zRKKWik=Ja9eOEuyxpf>H?|<6~!@M}FY;sD+iNT9t|KhSP+(iV=07+mIvOSXYM&Vp9 zz;aeR01IpQPfegASE%?HOZGl~AuEt|RLWa!PYRJRGyRzD;nkb7^JEl;2yf=fhJ2To z|GO3TS03jV<+$DrHN+Z|N4D+i-pnx7JlZGE-`8?9yyrI9Tce$;gzn|9h8)8joryNf zGw#JT7FcURXFeb?|M$7^xBd|`$8q+J8QbTwCOeA5t(p#ZjkhdQypI{{zWr?c9``Od zkcx=A1?Lkla|{6gxU|_VnSXSvU)QJFPmw8)l;p4#7(zwP2zt*X%BAqv%SeZRNk^RSfB5)B$cG#|<}&; zW;D`+xn3~$in4pjK0|<}0N!1^owamlCxPZ>x|$)G+Rst7Ij_v)&(6BMRk|GXUclI1 z{+v7T5=swr#5u?TspD@a*(tq==uX|}F%aDRPt>2c+G^DF)nb;Aj`!MEAcOWTEf77{ z4kN2a{uR}l{i>cXvAtUU#vQ|vYC=@)w=-XjBKEwax$Hc@rwd|vuAvs)cWoM$smh7S$kqwjG zu=+vrQoo_nOZgS-@6F-D(5PxDuE6sr^|M+Yet+WO`thpv)!p0AO4K7-KVIDC z;Psoj_K(bQ!A214+c#?m!^)#h$ByQWK9N70HY#9nv;P0AM!#{yc1Suw=ybi5Gix{9 zuU86K6%GqI5p~qSl`nj#M=b=w7U%UJbY7--35KTHwkfLxlUb?phBQqk^c2m17|ymf zRV)!zdQgbf(3agUcYo04&nTpC25QHCuO_~1l{mp6Fvmy``$|ULdWQ*_>B{J{;+lKK z7}V@VzLysrWMjJU?(>-nIWm2uEn+W`>7q z)bfQP|8kBKHg5Ysn%zH{E`;aEAI!SUh|s=$Ijs941%G^Buc`09yq8d|q#mFNfO~`y zy<_jo7Yqbtb&0fj4`E=FPV$&h9yCiFMVBE=o?%;r)WQ!I*iEk31r6P+%3+$z;0@ng zs_t4j9H*As_nyFMIf6Y5vi*5rzH{l>K(nI$q)Oc(z_BHd6Xnr42;Aju*;c!H%}}Y; zD{@HuG=tvQg5P&9xZ3HPB)9aK%b|6gq%#B;!mbLkOg>l%CsXFX`2q^pt+ep-m{Mpa z9+TZxZolfrv?G7n1hC`scPnZo<*Pz#fun#-MC^SKnYBi%0&J&%4+3{ctl7DlTr^~|UpBnC`*QT|(e(nk1q?`q=FJ!1Dq^i?Gd6jHen8_CY~99wby8zh zYKb<-k6qnPRo>G+fz9PtIXyusL40;R2m)sz!TWHbJw-zZ+1kyqfKp&@d$4AagV$LZ zJa86%`MWb~_-%;ubV1jXJThcTC&Jr6)T!3!qZ+MWJv z8ebk-RXQPW7bBReI|?p7{y2z7c%tm(h8KcVa{@Z%=f52x?x+Nwg(iI2Rtp7j8A4Jy zBon*H6ZExKkCyz!tE6}CC9Q@@h8MHhmdJ6=TMX@-3D{|7{iksSLJj9|gzH5-gMK;w zq3z6r?R7VvN0a(dp&khhZsePlKi9&8RN51S?h#S|AuSUy3q(Gxred{p`ZT&(kfebw zesh)Ye#>GzbSL(3vA-vRDW`xHW0i1ednP~L)C<7r#f7Vf!>sixX2v3OrpFAoDn>aTxwn z9K{jWBWw!K!fxkD9ox;{t}79}%}ln=Ur$mk9|#c=blI1%S)n8m-c zL8}HZxM17&Om%M8$(vuV+K;Yonx-(sBySheRdZ9w5;#(m5znL{6k4kOw*|`q(e!Bu zy4WkEfc)?>cP4H7s`@gYtJxP?D;K_A&c_P)ze80ub395Ad%f~9NZ;xRppp-2g{=ao ziUqM<*Mzi3hAvcPaI2X1dZm%SgZM)YU#m5vd2xn8z7tHhs~4z)aK;Dxoy7Czm|8Li zO^TP+)_4qEWCe)jAJxACvfbudujkLuoN==v~I>d3$sZ+`tNj%Mh6ow8lnR_zZu7UE~w5L%-JjxX`9tHAW6Sp)|>IXBS=LT?vVE`hBw%Nr0oyXZaIkvRAINh{Uf%%F zNO|HTBK$~qkiJHQmGx8CwxP`YNQ_e4y#~s6f+5%C?mB#L_4a0C6pKBSZWR4X@W9fc z+vM=VY5m?dJlQ(ebFpdHqmcS1d=C^;>dgGb3Aa}|n5PE&M2v0R!Y$LMul2gD-v44u zLHauM%wYYf?ZX_hY(@e2F}M4qK)`5+R%(9J;ORBPGMX9ot~UvM-bpWh2J8g^?WydE z4wKgnD26u^H-xhWdr*3}R6as`grl&YFBjoab-rI#5JW#&tw~O^|0&e3kN^>EiSdYNjl1<-9`ngL?Vx!Gq z)bwW>R#yxT-t$v$YqbF&yXW|~k#xjz^S22piJOk4_tHRlHA;79XvzH z!**4xJEPckk2;?_drQ%PV>_eClp}+Z&HsV#(>ChITFYM}_I=oX(-cgA$(ounV#t{l zS+-mdl+9uApJ!NJyoV~>*!xWL$)EN%uI8(kmP7Y| z*Pf?qK}G6Gau+O0F9N#nch;}q`E&8&-|jOgG=jlu!i7*VCS7T|W61-FlLh8#QT1g1 zNqdDabfE7j(e!>`D&X6e0&sc@-Gx}8zEWr6%;jvqlke3HSEysPtqe9uq=Q7`VIj+| z7;`7z`!5C?Y!abVz}rkBKjP8P1ksnS>+S9`=0Q>9amPw5(-(Q8Dp2-fM|gubQ5zZ` zi8%X2NtLAwS~82f8C!30-jO-kT2z1y?a7$s^qr~}a9+KUW&LIY`U9m>j$}XNqgPUf zPB?yP@GGi_S3bV>8Bl$)EsJ;LdmDGMCxa0>T*lC?;cN5=;B-K8#f&R;Vhyvypyx-c zv7#)2Q=>Th4>kmSfETtPS--_U3Qe84lw7&cL`B5A2MBiFTbdq$ z0v5r$CC`W(L}X)FohQk6Y-p7!#@>t@?BA0ocr*Mq(WV6!C-DA%U^OsQ$$x641$SOm z@2$KtBW=b$xk#nW0;O#U7lJEZyT<(t>ya^Jx+bJSp6GpW`(R8pxIdbgDTLQ*kIC@# zJn2)kE>Qqm=x?Wyo%Pj7SfFxpq~|BKtlf`TNzY(d7KXls7uoMzMM+@`N^_3RZ7AI3T)Lu?UEjm2Ao|e421X|M+NP_7uF)@XLI2o#=}xHSlUE zWxOn$bNSe7?N5E`WmbLvv*0#flsRabb3<*}zv_t0Du!hGQ#EOHQ>WmkwwOv*GIX{tJ+UCd=CO9qQ5CrT^_tq z{Mf0()n_HC7Bc$H+lZCM24>oFx$E0vNV`~)db!Ad(N+)fDN8=f4CS0rssr8qEt_4_ zEHTpzjV>i)OC<71=Y-cg2n|8r5idPdg^` zNOU~P9Cjb#wOb~$_VA5sE+V90$%|N(d^`h=I3X#1dhP)e6qiI;H^J5B(G(N?R+6gy zY4Eq^(H)&*uZ?Tkkdq6Yd+%7O)fIF4J1<9+0(o-ZBuIlKxHL|Ga3Tg|5NKki&aD=1 zin88K`)7ZHy=8}gbBTvW=yyh_bpq?utN$GsbC6k^*leCYry#jX?csj0rz`6GQKXWP za(v1+yG6hceSo3%y;2Z282gN5cyFrM9GAmR4)Y&4G-Tf8CEUG#+VWhHHhP^()6w4! zmW8}lf{FLG!r5(Y7%>A|KAitSGna05emRpM)9o(!F^~bk8^a|PX59!tM`21uz zYGq+?h;u6Fy$DcD^_4oP($gtJbso;lq?&j#C!^yPZsySNj$^IFw^4mqAgsi$MDZwN zk#^>AZ14eF@|wmVMm1JsdPE~Eu)p@6yWvVy@GTT8>yS3wFt@z_tdUeZtMb&t;(>E1 zcOO^yVmOZSnJ>jzo2jv9hth1(Ky(Cfx#76x74khR|BR;QqHxs@@+GXMd#=Ok?}{6x z#qZcDTdI4%VP_9)Jm0 zf?aobN|*Q%$*0U=h9j%LDixcMyc@a1o8{uHh|zUHOoM3j!(7B$|FfbR`U93OinVOW z$Kbv|P=s&P_ZO1Lllqg(`hVr%-|Ke%j#|@(Rv=G9u8$vU1EY~42$=crY)*^ZeTI`i z6mjS)D_ubZQWjWPA{LA2T{DcxyT;Kl{&IJZzgN$ZK;)rkF@baG2=OrvipeVhj-k+F z?y@rt^DeWAORPg-RX4^pW5mcE42XPxdHbgQI6kEMrKnyc|e$`r%B)2b*%@126i8fLVq-I+oiH2jj?)hB0!LS+R2t_q)?1%sV~?jJ?z?gSj*j>!Sd~YN3Gx z68GH*Yu4Sp%CWyz`2SP|oR<|uhU}pacL|6?IBA${(oWt~xTHBPT;U}#9^Eo8HD5V$ zbt{3gxBOn|1bO2>m8Qn~{#OI-*byRDo%sGWNlK#Bk9@C}j}V{kS1Hp=@>>pqb|c0h zH|;maqnp-q56|xIrydb8;hclK@Sg${*IB8n%XAt%ijzcYjOm@(i6|ef-F)+t9=#%G za^=YUh5CQkpPx$T_C5rwfqzppt2F!4?_{q!jPdx6*$>mTnTsb${1l&MMu`uc{c0zA zQB6y#!I`kF-`tom;$0Q04H5bFwq3o(GrES*fq6EWq;(|g%i~Xp?UtD0+cwF2g`>{w zKi3o?SAzqyi^|7N$OYiye+xn>4-RuRV*}W7=bjD{3O9f{PuFX>3Dpy=O-`-Y zTrK%dHJxd-@Ux(aLS3JGcsaNDYV8?R3|nif+nMEh`j3QQE$>YnpcZ3G7mh1{(9_+^|^v1F-Zn% z!$}z=ZRZW1JlO9W@w!UW}=YQ=~S`pF0qa|xG>AQ)Y z;|oNnl;3>8saWHQ3Gk20wX(L2*4s*wV{aJ2fW%htf~CYIMi8egiwj&3dnsl+JJ2a1VR>=54j;C;P*Gw5OZuDhpiR9kN zne&YiJZ7^wyJGPI2%`v%f34uWX-|3Ugi@Cr4L3)E-@)nPqnw*r6+AGEPI{}ugbQ3JW$QD69X!wRspZmgu_Wh;uks6- z)z<@0p<{q9#NU-`K8B!XkxpIbwg`8B>t+%<$BId&GCVHBU|$ej-McOP1Z-h0XHqr@ zgp$eSq}FSb_qfNqx+UhKj5Z8tgVHbp|C;x03lY4zwQC!z+trmT5jZlB@kDp4^}`(x zzAn#K(Cb~p;BFPrXnwuL#3|jcm2nPr>0jBZ=dT8R&sK##$DLc^xJ@|p(M$JtKLh^s z%ji>r-SEpN+)uUc>jTm5a4<#QF!b&{~af*M*0YS~)7`0(vyK^8_$&K|;1< z7r`Vy#d0k^?nXPM;9$g2`^ST#l8y)wo%~+!@E5YcHhVY08wP+f`IF!pmwmX8ncEN+ zwCC63z@(*b#i&h%79qdO?1PiF`l~>8RbdO>?+F_=*wJH<(RJZeJV`aO?x|6wvVho& zogjDDu8P=QwjZ17BmogF6VJ&kSWD_qUqBA-OQzO_zi(%k0iH-2%YEm;E|L~n1t^22^#f= zq54)G;t%A2o0_BRi9mqfWuCkJHExgH{5l_$YnKG?Lj@my)RPB>mtq04SiZ+6j7N8J zvTYa_GJIty8~#`5OMCK9-^j*|+pE&Y@?*Oee|HneNxrX?P>Rie<Yy~*_{p=Yf=$Yr8~?>sPBnjlA~2hA$BCG3 zPyf(>wHy~WS$DU~4YHhdm%OH3y<6XL!i;Hp@xn-;yj|Rqy23H7FV$$la+r>KojK&R z&Or&Z>}hZXGtFB?QcdNcMkdCBVGJXKys@=5bRuf|$;a;p+NcWwv3q});rG7`j$~Jq z2~j^*MOyM=W#&RVVC(Ax_5g|Zy=mj3+8@s!vk7+|(kz!GJIgFc7q7isZFu>ZbRJF} z1XOHi`+UO>fifv<1((Pz0OhcBdsNAK-K`+^pVaG-1h2@RCtrW0zH-Hu3D^3$W9y)RBx zk&Zn!o547eZ&(q)9_4uTULU~>_A~Vn>6b#J)=fgG{a?Je>$P8iu!v6Gig-ftdUj6~ zTX48oxKAy*NOMl~O)fgFST_`qsPa|%mx@}$ES#fHo&ykZn((jajQ$A*xg|{Z6o4*S z<|ySo5$@Nwl+E3W*a(7X9|A9Y3!Hbl?viV`lWQ!BeJ1;yt}#Bb;*T%?u3hjMXj~sm z%2Uko44rh|mJYfKk=LZFSeXzp2FV@HG08(rAU=5m-|p7)20W`T^`9&(@d%@1OTBPj zG^ED$lO5cJdU=ViOUv?ujhvy0YmI|up~L29(bv5p@ml(Hc&a9Rj+#s<*zc3VzXKx~ zcA7t!q;9~I3E|Xq1#MJ*vHE7==4a=od!wX&M5`$D?AlPDu3EP&4Z~=>=MGMmRiAgv zTT(V=mapt^eb#(SLUNcPn3(g$`@X;e^|<>=iv7x{G~vgh7@ zwtAdhU;?=X)IhUnQ#S>#*JXh}=Z%k6=6I}W#_>VPJy|t(PYYEUpSW}2W4Dl~Cw48vr!i>;{}+qb=sxc^r| zsy+pHb7lTR674bF)asV{mlpl41XeiNB_8Zb>S^Y%Yxg|?V3LDqzs4qdx)0{oN_bm} z|I2aWnG(aYh!FA3{VnZy0p8H35PRf@D^7(=ihe=%78oXSB9gIkz(~Q$-0yhz4i@Vz z67Txy1VP_HS1Kj`E@udi^sXTN{I)u4t+V^c&Xd!61oE>jLiAI$?o8z+xHloN+32g#0y+R*85oIPI!m>|N#)!$t}aN;b3K>0+s1j=SF z#m@Xvlf0~s9wxBqcgvusNB4H%_vG!)7Nkq~>QtlaAKeTqu(8$g;|Rj#tXEY}Tvz`5~23!mBtB$?Poq& z)6TevyNwL_|L#&ceK{`;vcqmDWM6l2MGw8;Aq!eLus4=UH2v&$MG-W8)CgA0M>e`% zJy$&D0EIpvuhLn|_#S8`N{8|dXv;65py_`I70;xTc=^20OkRD{Z{(ohZZ_`k_G}B+ z!T!fK78HB->xN&Kj99=NEsD@naC670-RB_t>ZX(5O%_D~q^6lyR**)forxn;W9zzh zrjX~*ng=Z}{*|a<=jJwnP+%Ys&I}(`kv|n>^L6fL{zONpS4w!re%);ZiNyLQcQE`?9X z>;GVSD-r)`sZWg|4-?Jw)$RAo!{zCH$+hGAck6#j7xt>)ulY9 zKFZ9qsAh{R2Y9E$)x=!9Da)>nwEl$2j(UMQl>I5jH=l?K=(0i_IY7)Jp6~p{F88qF zQMAV$ES|Er-iAX=vdMvDKRO8o0?V*!UK&=r4yAKW4qk4_P_ZG|J2a}L{+!J&kXZ$P zn0QYy*RL)5I))a1_bdkcKdVM>xXyOR*jUre=pcVC5Fe2}QcF zYWct(5fzT5J5pR%M~mN9d@$-K)9Q{&zum_LSXxyXTrIc9a!YFXa~uRXVA!e}5uNSh zB9A%@cEpI*S|({ZHHWpA0b1SdDdg5IF;E@>ET=!CXPr7ZNjIeHZi7O(0FGNQnmk2uX|{Zp^<4i#XW; zwjijcX#gAKA>dm|Z4^~KhuWZApFt^v%dnt72?$k@zr;`F>?+rJ#U)Ybk+y;p{)1BH zW%qCp)4Y5rFn#d*q46=%#XX+xcaRPvm5={0oN0Jru3T=SD(=PNtso8sV$&e<Ei_tQn;@48%I$*a)jjjvNx-HFC%uAu7Igv++E8qU-wNs8Y`b*_B>_4`nfntNU> zV9WbJ-<6EZT4glx`@0`HziZ`Lw><8YL-?Jd6&C#mIdj6;)jZVmWTVBkbPHMD+)z}c zqdxn{y!+t%!Bwd#ozxA=)0{Q62%D-x$uD%uG$&!7D+8-Zw9{2eTr3^1rSQs6lPTJi zJpFc}QrJQ1HAoQLt%QyJKqFJ~>P^ZGJv_orOd8+w^;tF_ z!#^rig08_D&Njo(-^sTL^_?aosxDcL7N{s+A+n-fCs zUg<(`)fEY}h>o5<{&Glo_@DYusjpvb8TZuiyvD0nA6-N@E_Xe_j@b9dKLl2R>_66s zPjLCB9Hm420}D|}aN*(VgZ)8y231BQoZ8o=-ODa${FL?B60?whc1|Chv?LCO#K!@n zM&f?upmb-mCc1GQ-&cS;?hXfh2Xg`2AL-B+*^>B|Tu$dHB1$|@exc;FQ41L`f;n2j z!~t|HwNMyr+9YLyH(inH4;1_SJ$c)=z!j~aYO|G$4=9!@)c=MSibDZRb@#ZXm6P#u zmc(QJ(P%rHRVod|_-<-2UJ6OSeVjLzp#LbmD-o}sX{T}5B^gvrjl~W9j&H8|1kwQ{ zTZmzk>?q;0pSU%EFDl)sBUypqDgKo<>vF)_dBcfVz06{C$*m)Wg28d2`T~;ADZ2UC zzV7~|@BTwh=lX84fNeiJ_$67UUi^5mx3PL_L45{(8}f4J+0$Y^)t7o1O=OD^no5(6 zL)lTe1R{e(2F%t>2l0MA6I1r=+Kd)|-C`aKX)x0xI*TUOkDLu(cL~%lK4zCU1jz*& z1>O8>o_i>(`vAqvQLnsjn1XqSpjfsK6=36oFJ<@uxA+p#4Z-ZDxU5ZTnPe=%R!f>p zeSRY>hqqM{*rbi$<2HlTqe6@5;79nW(z5K4pqBorA;;X54U{l!XF|@bH=L=!RNUNC zUD}3SW#e!_{^PV-77MWFqfgp%E}m`NxIr})eBDXQU=#_mcGgK*k z8OdcP0k*}VA&R3QS#XmSl)A73EYMtB@!DwvBpX6gNIPk0N=Elyi6i`06a|1 z1=c~d%pTN2mI&th&(D#~E(gBx=sD8PyAF5{IwdC}2>L2im*53+ICm)jV`idSwld!* zIX+zjOMjwRF2Qk&w9a?6gk%R&2hnJ{7NXWKKM;g1WNPq`2f*?A`bdk!ETr zG%XaUbTPshho^aOF!CCT^~-gA+s&U|`8w*l@TVB+qI9R1aOeVS#k5f67pHZ8*s zh29z1*xOq?;kI~?O=&JR*iRiR4;W2(g=Hg&4>Zv$f>iMvGoN)QL8NRNWahBHgzL#p zFgoAa9FPh`otp)$7Dx#dHYDKMhB`}91o8#~8m`)ExxLK%B7;F`qBXCnq+**xmA2?{ zK=dBjZ*$0-`*&5dffO+GEEnJJhjJ?|hOE_?W{nIgs={3;@+1d`ja!#c(r37~+Px=a&zOX)W{kO8u(OE?Nz=PgG@MF?(M!#P`ktyQH3ziG(J@&eG1&-#- zZtmS{^;kH!6RGnSJB#E)LfFH)$tSTJwEghvRj9}PKj)LAJTp*6{!xR!$|GdQeTrVB zT4*2a$(gYl3a^&X{{Iq-xPp=r+w~Ly_W|v}~=|_vc zDXTuK>L*#YM^WT^EM5G!nQ?aA6YbX@YK7Xjt-c)|JoJK}FHlS?n|``;5(z&#rpYt2 z&3X2T)~YrkK)k=nNjht~T|#1YjRXswWj0y070{+6i$~zJN{4T&xKEv$WJTh}>EWnA z>m-W|=pEw}s(EXv{n>$dsgbZ-PRL@Dy_r~vL*ATnfjah|xsL#I#Q<}s=7aX*4uDzF z?!)dx!rjw565o@(HooS7E1?sloO#@a6osT2q?L+U^ZOc0u^-G7?Jt8TIh=Gf zH0l4@`sh3;Yk?-G0D3{6{+MDiES2zY0Cj`;PyX7xUbDBDJ2swPhNou@#&OkPWb~Ib zPw)x0S=8R!F+lWS(sK5^{dUNel7sQihK$dq!iu`wDDxHo_P68Mm$o2bop(BjG-+ z)cq~uy|wqpp5g>0%W>hJzNQMtjSmLRUV3W)44;)?0_IJZyd|o`)lllEUgcL}97R+O z=>n2`swrRzLPxX%-xp}P{^Pkm6cShN&km_5{`dx@N zZR@6}0=^s&g!sW0Qp{8V**{FR7;$??R~ioLx11a#I{Q6kkxDl(VIq=Exl%F9c-iZgyJ8~Qy9Q)4aijbVjL}#cV6%)niq5&w@L2q z_#e3nEqy*7JUM)!709bpY!v4fQol{7rY`+0sytZQ&ihYEheBNh-DmrlmpO&+9)e*5 zwul5so9n`+I>e_otvyhF^x_5j_37zH`p7| zKgf^|fH$LbuLH6N?h?}wIQp+mL?!wdolglK7CXFbKtIj@tIDU=*q$O5SfD+$u7h$3n2acKL{ah$B4C z*#CQ%{ARt~Z}P+O>x_@@I|ABn)Tdw5|5rd`w?r&zW{m%5szFFYT&+jqX^~7Y4+s$J zPlC8;1VX4L)IQ@1^IPsDR`=iV+=)5*Y-N0-)))F3iEoq%w7F{}4{}Rl8yx^oh@}57 z{@wLIApJ#5#8xw$TpPYT67|yidvCo}fiq;)d;jPJ&T`LxbazB+QRE&9kp2Yx-$7@o zoj9Onkm31Z1?Zy*?oghYkdO3axR}tW+wHkd%O!>Ijvrc6D%fWp$!n$heONC4J%nyPsvqMVZhB+^9H*fb>e?1}?H9~wrjfBZQM?^pnA7jg(@w4aY2Gq6Y~^e$a@6F-wDNFHeA8ROAAnnsiEd8~&Hb~| z);NRwDDqWa2%A!cbPI&k)@-nn6|;ws3pl%<-NZv(v2}sXA@m?~yfikdb*Ae`>~oV( zL#iWo|XSR6G}c872p?Aht;Uc?D@@8fSoWdD>|LTADInzP%9 zyXoWkBQ74Ek7|&dUlORK9Orn2kZG@~0kk!Bp5TBqjB7@V`i9o3^i;I#oEUZ}q%sS7 zCbfh%6-IHyt0AaO8mYb@? z1c7?%{RBKAhz|fUwPs-zepK2FGo|A<^LjzuN7B(I?!rP|7w71~-W1lKU{CowoI^rH zZ%B~Y3Dd4=A71zo#HWp^uH$aYav9?ophCWHRk{a=G=B`i$$Aq=q+k&=<89N5dz;vX zXZ_u7$h{*$~}cej1i7#R9Ei_a)kI$=j#NT&5`8DT8> z{>7z%shu3K*;X@mg!C? zHsnQun6)?93kO9^C`m~28Lhjq8Q$IhznZQxAgXo=)7_1fGzb!cgrt-pr6Mg2OLuom zgMgGvD2;S3-61XA9ZTa9yVSy6^t=1({M$M6PCPU7ymKZn=@N28j&rtPfe-fjl@H%L ziggiPQyIYzA4m~}g3i0Br$~b1xdlV*Lx)Yx3|>Hkb;t9F_CU~DHCW*4pa=B5+nuFE zGs})CN{X~wHp`3NboCuGv5b8TK4T{dYUj}!Qn#JlFRhrE8SMQwIhgyiZ7nyJYy^=y zBeyL0$BAVv$Le9Wsf47k20RqWizGatg1M8Z3{5uD9}IbBmfeD;hM9r#0}WG}o6%hO zdfc~9-?_`#u}kSqmMW1)4HQAJB+8BR&&PU<1u>1tC?mP+zqpw#M{?*boW^TBC2u#g zod)u92Ivy}=*N#ABtyiOQT7-WoOEN=*kwi-zriac&$tw-im;qm>bT$fe~ylwd2jTk zj&dU}%b56vNDM>3Nw6QmiAsvCxrcr)>AfMI+qa*@C-)0vvlZStbUX-U)MM6t^ATpN zo;TXfny=#AySwGI%2nBUUFpS4u;%jVLv75mtC(V*E<&GHa>NMU5Tda)QJGTh@)0+w ze2F7s{-znjxiRx5Giol&jeP9YF1{A&5FK}q zmUg6%m?A=IqEVr6CImS^hI^Mn=dw0R6NziJgv#1bF$M{CvPRl|w_fxoWk52Na@MGq zg!nwhCl*B+pTnENdW;OwcOuE_Z$%LR1`t>O06OONzUR%=J|7Y?091;OMc@Y>vZK65 zbaOoQqP8#k!EdOWm-n|n@Y>#$DWrQIW5$%|MY60CNe6|Kb)~)IEYI7<7RNU>o&Rdr zhhEu?C*`rJDRQuGR(=$VK22jsyL)X&=8Zs)GIjM_kF>t9-yZYt-U)svG-H+9pyg+x zlZNu5@TE%l?NBNG<5+ziBL{3H^x~ znbv6HNZ#Z=fu#)7WpU7)1cMO}{0i0@To^o`WR-aPvpnP%OK*yAop!F=oQGPxrPWtUrB<=#N?Da1Np-!vVXZo7GXJ9ig;h~Cz4C+*euKXuMG+P5gDH(%lQ z!zacdQsUm-x4yL5uRhiw!j4=g&}%rIYh!b$);$2-)rN#(VF~`Gjc{BHJ~z6i$UGk! zcA9=IrcxmFc;ftyr;oE81efus%J^7O@M=^dFlY4=zT^yJ7VeP<&kI8vxu@$pM|#5- z63kbL#DSa&An?NevnQf1CvNN<^7~ufwC@iM7T+S;qaGTqCpU;KIF%V&=3j-MVn*{Z zGza(lqJ9$$`_i3s1wu?SBxIqcTe+mA~KLuaIApD2P`(o3KY&ps?hE9G-k(LbcVq%w=^IKPX>UFuLkTvFS%l|FaP(;K$?HO}c5<~@gz zEsZ0{#=n`VTdn@|1aeYbg_etwgq1D#enmq0Q#O-MXX>O!rf)a!PhMps?Et-x3*5n& zU)>ujFl?z-hN1(x>u&=jK9-Q1#|DoRG%Wu9I11xfp5Yi*`67^B>(|F?efJBbpaM_C z-q?0%8?cnvs)}qvjE9j|<}FK5(G;(XP+6yBE>r$Ynm}dREWAFCXtI11e95K4X@lr* znEfW>l5Z+sIBcE~>h_z5+b-XZR~^gdhP)NmOeIlZdOB(sLV|)4i(vIXede5_j#P*} z<~^hDv^(M0Y3upPiU3ije_Gu^&R)@GeCOeUjx;OH?fb-WctG_X=cmVdg1_nSyiz8z z+OAsns}A%O@u@El5z#;CwWJxe?&+Ed2;q#a_r0L4R3NX^#asX~ZwP&P7)7p#8NIN` zy2WoKW6fLyPZ5j%{{Nber=uvlA13xdTsQO5Bb_pn^LhD0+0c#5!nHz#Zr*nt@~0kQ zG1~O^3|FLOW>9WN7*y6aX%WQqE^8v0HFnvEwtO>B5Xe6&iA21ESM2o@z ziDB?wsq_%k|nZ7>=4^aGb1l03T(%$RFi76@v$EB`PESv{r-2b81Lt9B zNW8llC0M`A3>hNL*}~vTWyjB_cD!)-78(Po6Pdy-;0&<0n3HITAVdE9t>T7ajqfJs z^9HZTTgRbvdiJNt>mnixAp-HY&Y1zzhtB=ZQid+(gO70+i(mhw>2J=>ty-#^aVcPC zOzfuXAN1+xDv_<<#Dh`;jmIr_!=%-z-rf!UoB3%?nT z2A|F`9Pf|ui~)ZKHU8(TR~SJEnvbHi2$$C=zf^E-0^B+Cc1T#8c~og~OIJX2{qgk6 zym$ZQ3mL~5{60k`FSpK8izC|a25?EcYr<3b2rf+gS_(2M0qRj|#7wu~2}Ghz`AKvT zYq2d}1Tq zaGp5a;BU3_;CMP>dek^}cYmw4QrKAARNSN(-Dnk665e2EW;fnhmH5&t!N)!CbBr8LHuwZWS%E1-Q=cB8 zE7t);td{AyMo8Ug*6(V6%t$A^7xAdCGaQO5W z9pd8+iTli-jsw)rt@~$mDrz^e1mp$w|WF+9jCVO zUH>hD=`5vQb^&d}qu@Grt@}_JQE)9Yi1%02 zUt{Bc3LftI;%Yl~v=46Unzp>2U0GwGP13oqOIFY$?k$Dsc%#uFmN^lbvJ`|^)emh< zaO>846@;*Co$U(jceMrZjb9(!gTYPr%gjbq9T142*CFu1c50*O9vjosU&y=lbHH=* zb@Z-RgEUb3C@zPXK7zE0Ye_;trTKbvr2S7}1&;&S2B4?+P{^reH*My_v%^|}B-EA+k5ms%-u{N@gcc(94 z5#_V$_(#8;Q%ut& zBQ!U~?$eqZ+F_t}_nn#AwVis;2L^gPW;WZf?lkr767G5X{hiH#tjHfMgBwu3Zu)VC zU-wZn{s9J}3b6X7`K%R8$xe)~N4ksPMJ74+cSLkD8{+&B>g?5P>w8GY-DLj*q$QxB zx#$}VuW*udXpq@=X&4T##@hYoi|`g2wrRX;B=Bgy0(>d z&g**FUogS-Vvb%WNHeG3v*qfzV%$joyIoY2J4F8E!$V@wJ)`6IQhn(T@ErJUAQIg{ zPnrc=600&r0x~Y~`L7#OOhQ%K?FG7=4crHC3{Z^@$`$mowxw)_4}*Ia#VgROQw-mY zaMke;*#V(znX^H{e&6G?$2vUi(()Hfg|mM%|p2B8u-#oYSX6m>uMb1AVhu^ z?=xDVN58RP-X9Wn!ER5@Dl$H%g4eH+Cn#gs4MWIJnTsc^;p>Y7k+{Eyh_r6s-!_Lj zv|lElfHzu}AT0+0BoyOe&Ys*~(HLwoo|QH6TA-eF`CGLmurH+^1l0YgO=S0klc=lu zWhb{tNS+&qsWM!u5#S5uVD@;wy{SK{QR?m&qMU2^LkjW_UV^V?WC{c~{Sncm`o zl8_~Mxq_+|MUI^CS%ajC#lhUUTSkc+m;0ic+mB^!F=RajQj1Lnve!Q6<>MSSjHpzU4C}aL4=^}MKF)JU z?jR)QnJ@0LA)g%xOAv8~xQlz#yxY*t=SUJ&X@FIw%e(Qq{7w|o#K0ox5~s9Q?rw>Q z^i?vU%T34*YX7v5iC8ko*k&uw9DI9k$Rq1N+jcU1q9t94Y03o=UyB|=VO85;trnEo z@UEJTDtM2^o=OxW{S^C4a_g`jVG=7cq+ThJ!EioWb(LY@@ZAG=cAIj zbMs^$8%45w zd3Ic^C>uO{c28FJ)}YLfXdWU%^DB0&!fK^*SiVR+71c`!d}P zEx!BMHV3@tJ-4W+W)JqC23B5_Cn`|ya@}6UDaK8iV`}aCMv|5#qq*ZQG#7Nrs0?$= zH+TrEpInnA#4&8HS5&$$7n*4rw-|hC;T+34^_7)vs8CXPlv3xykK>Va9;TD^TADR= zuG0F&DMoZG+YiR^V$idYU#~!_rY28#N2@A;{+C0LvlI=)oy#%!*Ev9-4rPddW8tnW z8jW)5p$LU|8+bZ=Jylrx!!6>()KXg>;wZ55Z{&07r*jwqw19TO;>By1jRvmacQ;y`_rhA1Y7@IP}ECbEj!^BxTH;uA3I+s;or zhQ%5>6`CGroCpT&>wY|aBDB-1Zfy1d*(P*s^*&*5mAnlU_1&RDV-}Gc`p8|Ux&GWf z&v=>yDFWSHIO<3yGNr5PY5T`OAse{;%RhR%ICBb^ye7ki&e`9t#1rg&QxlHvwz}MuAnotfy7@iczst1MpJ8}W*Z?x*z$ zD0^{LCCbqfIjP*x>F(&#=qiW)fi(V;SGHM^;f{?r1}JDCC>%@fPYdsa3uqH+1JmeO zy81n$;PcQc5zxt}aceNPHE#R{Zis$%yAZf~bZb_TRb5e=(I!Sv<9H`3Sp%N3Giq7F zI2GMro#~OW;7WD)7{`a$d{gm+h`zOQ>hh(TrPswp>P3H+76jZpj%V#XQ>4%{lC)_j>wiuHH)tUgs{DG; zUsHOsoc%ljvR$EG6L^<=wB}q~%-!R*`v|V9?Z*FQB&=#YM#W)*LfqLM?ZDEO6QesQ zjJLyMGlEtECJyG!>55TQ8l=ivKn4`7y;!g#H0H;a zK+TO8<)6fQ1LH=bfz*Z~&PE}{_xX1qO&DA9nqs%t?Tsg9wB$+21OE1X3Km-Hfo~}B zFk9(bq-=LnwFNv>yaA3d$MvFX%<({vVNm;C+6NME-gOP<&S;B%92Z8UyesK++ug=w|ZSBrdkEc+Q{Meaa@MV>gl}v)9ybQH=SG0bl8D zA>u6Iw8D|P5bXL>d*yeI7V=u?2i#Xl)L$9=kQ!(sTDwlyYom$6sYVaCvMs;sOL?Yc z^{rX+WAAif8%{I%hMD*51Y4=*9G--I5twtGy-vMsS-4#npq;;QhB^kOLh4)k)4MV* zYJLuz0Cv4x9$a8OIuNp}kBdL=h8}h99JnR*7c7S9%o?+Bt|7Vci;0A)HVEM1_l(9H ziGOJKzxR&M4#>y@2aLqsqa>!k7z<^0?vH&D5@Eh)N+5@6YiIJ|#7Co1Q1kV38{~kC zka|KZvGTd-`>@6q+x^hi&wgmn=dzO4t=Zzy+56{p^t~0Kx+y8jR)-73L(^-YnMR59 z^zBSe0?8!wd6`PlKL^+*O~ zv3jXExvKznsJ9JLqrnjHJm{FHGC@iR+SDBA=&xQXHNHlrvFkner$hu1jLcI~46S#k zD9kqy{8NN|FfcscxIyGvIDvF$b9#Nz77Z0(u#Xk{@CPQI%EGu7@1U$Om?>nVmozQ@ zM&B}EWN_H=44RRa4wO=r;wBQ8wkAVYO#OUV~WtSut75?c|cQo2Lr&W>@<= zm0=1_{6}{wTadklG!dT-*7$7yD1o#DGrCZcSFsZ?+c35FF?*Un#6g5Ps8_z^(ki7}tQ5x1#V5m-0BQ>r4+XGk|*3yqi;zJCvO2!wVwT(&d_`8yw^ z6e5bUg?uj(UTMirOPg>nbja}mRPI047|_|aN41?G+NIZek0;>^D@_ zzI(?3z4?~)Pkl$xVm{Lwh{<*+S)caMrGM$ECu&(jA3yX&pXH~o_}qwdj|cmU&S-b|lr>1F9LHM&|JW{N{P zdWf%btBsw-BKo`F#Jcn*f5gY2*(JTSOogtbA6{favi*y!MxT|;< z_;dDDH!VZ73H&5{Lqz`U8(qlHNNLtx`KhxfsOEtu{!S=$W;<*=A*zw z4A6l$|4HnQOq8C?6$N0pJZ%iOtmtUr^WCs~jKZ~P@lF>PTuSdiL20bBN~WG0)f5d} z@9Ao&6oTako|8y?T$6d0k|s%sji9-gMed;ZQP4(;WXUg;!z4bZa6WmqO$G}hw=N=S z<1weTZmY2DA`7z#D!0RN)5A2y4o1@2G&I$kM)g4egb7TeP%$|b_!<%t@oOcy*B=|- z$hdFFE5l=9{I85zzXtn@y;rIz&5e|0a>x=yP6?w&sRuX3HIpmY@)UEN zlk33O+>{*AA(Lh#Gs-=S{-NH+bM5tl|FoEi8XZnSzgf`L$FRQIBMvE38 zwLxZyj(4oEzlmmyjJ(9(l<2d+NA!3mrY|Qc#%+Utab35jT^JrJcrhKFvD0$XVgS3g zXuyV%wXTk5wXVFbo14TupCsg!a^9hFFw=7@sm@}mZ)nB(W1)K?r=s!jn%xM$$|9=C zYbhAl4cpU|vwg8(7VF-B5dCTu=8QPW%J}nE)9M#HZiMq?LHZe(TTJv~>7ov-L{3aU zG^&Vxgl_m_F;d?4*3^GQ-bKT;(`|{#0unkI-wGTpT(NX?Y`ueM-kN!WP$C5csFDqO zicCp1id;^U0o#o&`Um|Z`j?z%?FTrdkKynDXYK3b)g}Zep+X7oLdlPbNz&607NBHO zT}Yp~S+9QPaC0$dzZD2Si%DA*y(OWnU;xke35$B)D-OvJrZ%YLNJCXYxvO=)4Ng>l zo(o|J{v0Bt!w{bc*U83=>>HkDTN_4>jlm%Yg4>^ZN%$5#;c%s>nn%W|LVrrqmJG=I z%Gv^w=sJn>UAXB)^Y!$L9fxNnlt1(d&PCt~f-6`rf=YgdD!uU5K%4#+F#aKMr^mmD z+W;XkR`t!M(f@sfm?+f6D8lz z#Vy~wX9PB5L6^x9cGx@U6ioE85}g2UV}b+~@qu_uC||WTudk3)m!qAOAoQ3zb6NYc ziqGOiV2Z*ptGC7a7f%j zSM%I_)Fxe$7!1b=y8s8Rsho>$6wC%7xLSd5AdYD{zjz^k!EmE$gF zo9|ae&tDXQ1N-}~Yu&YedTZ@5Vju8ZRADChD-T&w%9PFDvwxg(zx`3>eau*6v4SQx zd%QVeKMwg_2)EPk03wV>=cO+j`RfWm*LHTvisuZS_Bkj+_u%}Su5jqW_GJU^)7jJd zuyf?5Q};)!e*Fyh2%Z4WQ{u&FKF3Y>z_5DmGvoNp z|5BqiWXpjntFD0chyk&}@F!biQj@d zLt!keJ`4YddTpRW6?6W+lUXHJO64>s&}HlNf#*EbKjAj_zK5o?M377edt1m{82uQz z!vxt6V)xCkv&i&-p{Nz^{hx89BqaP3mr;R74tE{0U%AvTb#->0ruNAv#&r%L>J53W zX6Oav+UYaj*)&(*4$2@_Hv8VbS2gb-JaMnTVcd&7`-6_TS&WhLS(rI*a{C(4y_D&5 zN_~ySsq)ToY(%Si$rqb8$C&`lQ}7(>{hyiJp8G$h;X)9vQ1+XZ~t)?V>a^1oQ~R!l;^lYyLBw-bi#SRNZWf^se-aNd&rq1EtJY2&JIO z!|c2rgDLmq2*+gtS7e(z+>=dEBoU>fw=eQ^o1W>%GhY9m&duAEe z64s+LiM3CkbYf}I=72?o&IA^ENqJq^g-NjZb*$$>@HY?OPYnNMMl|N#)3><# zOR);XigPN4Qa%iRc($O8Pvc0u^K~X6m~)c7%wm$=g;gmAK-k&v!;Tq^nqMC{8T(^e zwr7UTLghse&tOVl7D{WS)+4yX;(rS%{Rc@S-{a3di90`2x?+i$nwAXal^hW0&EFoU*MXxQ8lBkpoQR&&tC3zVvlbRjv2VW6F?p zn_2a$;+U#9jPzveoDkut=L{TnN9ly6*DUA37)8x=ugk)6}Mo`qo{) z3Ha<{RWs2zps3Lz854=84J(bvSi<*xbyc-^~a zy!wPA+S;FcaJD`U7wuG_{e-c>VSaRM6m$N!?!d`tLT!J8lkukKt1-6)D23wz^Yp^8 z!VpJgTc58^=L-H%g9_rK_W=F>`#OJsCdT75ma#Vy!$#HRz`jPK)NXDgw@CH7Hr$>? zH8Y=XailK1Cz*cSFiXPoeh~r@aFqhT^$uQeJ>@&4M3gZRrMPLe;$A_JVF*`t|Ox^CT@WNfess0c>>lJRgu?-nRd}`d(07ufg zo&N}qX-4lK#VCFZ^XjFc<~S2;=|cM7oG!CX=%y-BE5ZFzD;zcc$}=95(i6?5G^ASz zRg89KbEy%!4E+oB?oz-x)he?U2iuB_w;1Y@J2N#I)OIeD!@(-&&5f4+m)A+B$(0?! zun%2h9*m}sIR%TKY2yDbkwVh+5@i|jqJurUe&Sr*ahmvt&}T@ zM^9C_Arw#I!$t)ap6x?wa5}g z`OVGw99T5)*nr1COm!{JbNudWfOF`%wwmk4!JroZK!ek(tHm1TI{jpMZb@;p1QBn5 zjFtFt+^5V`lx~?bmhsga01+GmD11jv{|Q9LyD<@!K$=@?-$T&P;FW$!SY|d?7`Pa` zKi^ljG(^i_H6^RN8XDqt`>I&(&#wQl0-tr;v*Fg1^6bhUgclR2``8_j)d3>557n~~ zOJ@*=%eB4#Zy?6l`!;IX#xa@|y%YI|<6!LKTcmsnTulGjQwOP^JG;^d_)|(IZ>vAj z>JLR9z}dY8i@0xqziPRRA|6gGMd;MlynxDSyGfY7f9%#0Q((b%9@QjK6xdDcc9DGT z8zv29OK&#_|Eyo-mGRD+5g?d~-OXcqA(+t9t5JTiSYopxc=A}XKG9H-dbLEWbK6{_ z&b128+x{8jUX8@_P){kuo21iswqUqxacC!%Ql%K$GWL$4`SUk;^K~a;_a5SHbP5Of z{$*(*(_WcrB($F4qIL(G``ffYmy-O>P)Lk`6r;~;^I$}MHew(arJtX_JsocL=`aTw zMa_)ROfyk&c=Ne=OvXpMnr9(;QRhuW=3M%cx(Yvbs) z5=g|ef>jUc0f#qPXdSQFE5I9c>Lvg(*33Tp69=E!sI;eFwIubPQyfVXwVNJ>dv zKcRPE(NFwT>=v*gZplN-yog^FQWHzoXZ(7aMG=I0Xd?^^DFG;9d3q-8c;*m^f$rew zYWoZ9;tw~ATek!?r&;JSdxC~%-teD|Z1T^Bo(y4nIo+AeR<6Xtlo7S(efJyo>|739 z@p$6nSMq#pLQ?&oO>y}NS?p++x?w`6fyN{qCV*M@G7Hw}8mS*w{PP2laB~SkYd*TE zi?BKk0ne|4&mTh!WA6*`oPS&$1kDJ+6o!^y;Ku#ZyKWUe#n+oKC%op~)$*WCP4yzg zT}jn;Uj+>L2oLqU0QUU_ibQ-bd%OFtHRLGxXqbIEB}{+xnzDO?fM!}m62^cL*tiSy zPK(Nj3D?!`qa!9A3KxO!%&kvHVH0ZV?HjLzNlaH|%N18nSpW-4- z7_mXJ)FT2~8BRcanlRApVN*shwGQEjS$Ab_q2-or!Q;1u9*zxZ;v?0FC@|9HH&h<8 zA)&l*ibwvgo^NVV_>W@JoY|shLOqf_NSLp(*EI;xcF?h8*|GeS!>)Fvk3w`m-Pjr_ z=u3O0GV2{I_Dh*dD=oK=bys;>n`!f@5upqACZK&Bg(b&w*JJ ztFNT4zjHs|UhB;+8rthPU*q_vBYz)?_kM_NUkF1}5Yj2{U0M8Gu#>n_gR2y1N$jZ< zd^2Wm?4y%zBR}k2vY}B;vWXdX^D0J6w{6+*X<*L4rcfx_@mlj&_PfcBz^k^`Qs+?1 zsqfNyhPM-z9Tx@hmcGVaBX&ODzRWuMX6Ho^|I3<-<1GK7hu&x$W6ZEQmOrb8vG!q` zEOM}sjA-S+3RX54mP*0#s?BYTz&2&z>4&9`9tJy4t|3C7FTSla5Zy)L0PNt_OCWnS vAO5OW4=-!$+L0$AB}q#0W0j3~nTQ8MRxX_6qiR=fB*afiUQMn-#yI4Epj-ok From 4227b7245764be4b5f2d2db930bf6fb69f73db6c Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:35:59 +0100 Subject: [PATCH 218/597] [subsonic] Optimize PNG size --- .../content/contents/code/runnersid-icon.png | Bin 92393 -> 91115 bytes .../content/contents/code/subsonic-icon.png | Bin 12192 -> 11259 bytes subsonic/content/contents/code/subsonic.png | Bin 12932 -> 10936 bytes subsonic/content/contents/images/icon.png | Bin 12192 -> 11259 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/subsonic/content/contents/code/runnersid-icon.png b/subsonic/content/contents/code/runnersid-icon.png index ef2379d45f149541bd7765dffc33728b1cd05d0d..6f32fe6ab2bba8bdf9d89be3a431caff5d273080 100644 GIT binary patch literal 91115 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

}&&f$A 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%0D+w>UDDYY=IBJfAPnj9c6+??sem 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 z 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�)0$F+ThC6U-0iVw4eTHlC(X z_dV`zR`~JHZ)EfL|NhON!QLRCU)we~d-MeFZ&tXwUxS%4;*XqK6g7ESEAYg^)%dT- zLENqL!KJx>X(E-pAX59FYn4m`j(z6XKxxM5A3L2+|0@9e_CNg>{N2*q&=n}l3ISHRGJzr)J;d3xs94wt{cyJe4H9TqcJCDRrsU)GR`>7>Eq(V5e!*z$;D?BzS9|Ql0^|o4 zL{!8*rfD&qkFhvih%}eDNMvKguqhoP*$Fgn|l_;rWV=VuBGN>veq&{|{g*xqmP=CAL-{Z1Hpe$aK5 zIQ=c)#yEa*jL(1l2<^Dlz1-5C6;mhQECG0wG0!8LJ-ZBBvCueOm}16>vy; zG9gMoL+Q|9);YbNN-5CNG<$%YIy~yF>UI82ux^I1U1q~kV@w$hC4K#;gT_ib6ZL@6 zwAJ-phi%U|JRB9%lgL?~nZP+~44z-iF*w5g%4>p;$+p)?SQ0}7n+8WG)1v$5BExJO zVX-Z5)|y76*3`N|()%K%!2*y&z*)G~$>Btm$G?u=Mq`KQBf=2(8HcLRH!6l{XJgEd zW|$w(Fq*VzrwxpC>i18%-}l=N{jSp#CfV503lXMY59n7NV&AL7ju+kl`;z#i+=Y^W z!xc+DAO3|5ky9F)0Ouf)P4~fFPQ3QCk%$STKA2Ql%v@ zEJ&^B*8@UiG4l)&+%`%QdZ~2YG9og`#rG3dA}Mc2!nJ~A!IP%*5aaq~!0!i-U;pMD z6P|!w1BVDEu_`kp{1GO?ub&>{Y%#*W{_!2Udr>r^+h%|T9PsAFI~<n>m1Vz*l9nu?m(GXlE?aAS-PW_bGL zDaPY=4~U~6D*`&>k72-@AD6g!^&aRq0{DeNe{LcAFnu`i`Nwd(+@Xz_u@umsY9nFne=eq{P_*$iwP!Em&a?y0D*;L@cfH2 ztk*kiZ$ox3lJQyzPGx4_INiU~w{sv4XX@#!9FrRq-U1mwzoH zl0!hlGrd@F#Td|Ud-SU<`knT`LF}{$CHKiLIG6aEF?c%D8VNN58n@X z@y!jkw>Lny0}s2svY)dz<9?(HJ|5>$x%vhS!+^(+A7eD0;M*5(vD*z`H~}z8=J}CR zxo`G}c*)icrr9GJapn0acv~p@mX)zXUY2Mvb^+V6{%k)cL3)hh0YQ4~=&W#n-L>==`SQ*7_vtLuB#6SP%ujFvkXK4)(9MH1EZ~pNqe*Z54{aw0=WxSXH zTvahr^+ny>YyfL9nYiL3S5b$F8PkKY3Qe?JPDw$=?BBy_A#uu1(2*Jk3_Fjzn=OXj zPJ3%D^JC1LVqfR5pJ+@dxBtGoW0iG~LNau8EbZZrZlQE_T6UCsYiWrkaJj960 zSGW4JWU?WrO^eZDhKpwlj3%va{)%$#2dyFk*n4c(JzjqM9>Ypz{5*6(=yR+#)w+j| z+IT)#Yf2&tet_?LoSk1_dT@jvUcAD3vlUH&_h6f*YRTo-$g1=m*timVp7vB_e_jGV z#Bz^}D<&nm>L&F)q$-(d$cMlD%=oEfAT8LJ+cw;s8-O`H7QwemKSPfBFT!d%eWlw=3*cTe(?4 z*sMJM@~1cWhktsm<{x4_ih)24VN8Ute)|-E`nT8c+l_wtp#ZE2lQ32@-7VU-!EPJS zj+-3OMO8LVw&?=pTixXI!PG;+64O;N2Gazf>pXlPg;pH`Oz?T^NtK>~_~C(q4;EHk zno4*q?YEjRh)`UK9LQNr4kuMWOR*OduS>?=-44fRG9vWMKx{#+!|BBgM`yDP{ATn= zIT^wkkm=3xy2IP=uYi7|s=k!p7fRKOpJw@excS8+(GLSo&dzXfbck1PE^&9ikFAy^>kToH(2buPRTe4CE zno0wW;_auF%#_9lp;v3Lq)-cGEEk0xD4z6Qd;gdh2(c}yL828Dn~Ig5CX1ZB6k(CGe?(pu9%|iUW$JrXccfzx7z%?eOd0oMAc{!GZyHNuC0N zQKg-v1O4W+Q~dJj32xV0+%C5me8gtcV;BPNmpdGt%wf+f3=u#1jOk+zxKw2!reG3{*e2VcowRuT#W9?I=48V~*?7cYb8{~YL2ENl zU^Z`Y_VfV8sXCLB@rZg1=(L4HfFA-bU#+pax&ifDrS|qJ>Ggk?s_#Q}-+(amI66AS z;mIl9yt~59?MglUNN?WsOdO)`!Q{lB0AfaxvIqr(Yt;oiC@r5W3*(v>;&UKx;Yp{p zB9d;|w^7G`N(8Dg0Ir)#E;#_K8+|WJECyllY0r@cR1)LW$QUE&9GqN6HA%%qu(hm~ z5up}hB#S&M-P915k|8Gy3MLM)euxY_%kTO53I%5v&JU{00HZF z0sp$*;j^zU@aTL7IEG;hn;B)2uV>T)U^KFLJU+z1Y>MT&gFlpB&=1LHuhB;;0Glxe z-WV*72>;=qKgZ4cm7wl1W={YibTRe~^D9T(J%^nSdml1XwC|Ngc;5wdyB*ru2(EQS zHJC^?iC)V=L8@5sK0Y*TCwwZ~ktM;G4q)3Rt3gRwpaup^ zjNSbf{dUml52I-teDS-duuk!Wq(V$4pDbh{sP2BZ_IUU5PD_66_k#kP`1@3Sdz+ud z)WiE8i-Q9kpFhF7%lEi?zm!{F4RO+i7eh+b60kjzt-gcw_?j~5(J21S## zqErv56cb?{DJH}!6e?Z|r~+g69D!8!JM4-$s7f6X)s`!EVR;G=K}nRLBf@>aAyIQl zEqp{yE4gk>4ml(%W(ctA7hq))kxKOt2I0z>27_B*x@fSuzs`N7(@G#OdiogxA~Hf9 z_A2*PuKo}QeDnJrcfUBpXU~o>nY3U4mLuRCG-n9OSj7NX%tlzuCs?j`xLf6_7@ddq1MeP5j8sNDmB1YgztYZ$Ongigc=^GkQCj;`s3#&8UTKT)Fux zPQbA1u({i24gX|5K{K+&ttj7)F$;twOjD5l<#mti*Egl)_cF#zfhB(rufLFdJ{ z?ls`jW&p}KlNV#~J*;bmGHi{;RLjPfRHFc6EjlyB{K#UxyxjW&jdj|F;BOxSoUEq= zd5;MIVp%{}-+3&rR`}wp3!I%!z_vk*4Cmy@i8m7K7*o!}G6lBMA`gEuDi_y&3uaUXLGa@afBwPc>y^n2H4(j zuvu3_Y6~&4Xr!ibn+a0Df^0oKjt7VM6ZtBF7xS!7%{VAaH<xLX=2j^HVFY^O(4PYJp9fyE^ zu|^$?qAq4-!1cl7FaOfv{gYFC@wrw5>e(Kh1+!JpcBr6;;GDtHVv6~Eiq*Qq?ad0u zrw3pQI1-1VNHX7U$l$$lg)qjYz8+OYXCwgj_JV>UcbG<_07HN?2|LRkeyf^k2v(Xg%iyTDHfno`skGq=SnIw zha%`oH+f>-TJ_e5LutjCVVb5I0hYbYkyWa{fAG1z<65t=k`SyVeAX4)TqR@yLKJlt zYz0*5&p^`kn^-D~$Xf0v8e{Snv^gHT_~dE+Kw!Xl1ZrT&Aw-5DhA|c!j4(fbg!Sz^ zW!23DR&h-sO3=^vqP0(xPDNaIh*cmJ2HdTgw0G8*oW1A( zHwHChwDTEGpHAV%W7wvJ8@1~1*AyzX#-x4qpTANBU$y#4n-IK=)nZWof=37gHuoMk zZ&&c^4QSZq@gC_kgC6)W{QWn-S4#AN$B&<4G#TUN>r31&SE`**B3bfG$g=Mw>(HJ* zN`zeUi-4;;kc03<>l@p3AB1O+%EtgzK= zBVR5x*r37W_%XWMx9GAkSZw)O!!GFO90K4RtVtZfJ}QgQ%Zxbm`2NowuHGHu>1W3{ zKb;|h(P$1mLvaLdU|D?qm@PmNqt@o+8Xpx2&+It@5YUW)i>D`e{o)F%n=OXkW9WML zog~~!-&)*glJ)c5RgVQ9pq-8~F=UUUY6y$d8E~`1PQkPiOI}PkxNus_rv3oqMQKl`D5pVKD$ca(0qr)fY@86)?6<BbPW(1`OGnTP#CZtI{amM zkE=(=c>eqd2lI*aT`|Hs(RMrMU}8jLON_Qyk14H!3Bj0>>R}lc(zZN$ev13$26wkx z00G>qgjh#bx%5@`C7Xb|%UdkYj(r2(}$nsXkOqH?-7Ga^xTtK-5Dx29G!h zjn@wzw^tq3H^SkUjbCN-#ahMpci#Gyq&EqNz>KHQKLZ(yZ(h8`cC$v*XBX7~H|I5~ z$p|YWmdOYkFc!oPXQI$@b$A!>1aa)j0+Y|&ljjC;{29H+doe|_(5Jwor z94JK9LX*}940sPijBapf7LO5E@6hj7l10c2*QlehF+Xoi_z)mWQrqaIm-GY354d^J z;pW{ECr?iB`Dcfij>oXh!!`{<@UW&qXaby-F=EUnm+B~-7Nu3@8WUh6Y_$05AD>}< zFu{-CzJvDxWCytbJTlu)@EXpS^8M8L(0R8v;lP$u65PXbbJbC^(LS%gR{Y&inKKJJ# zjrmewM*{!y1#GjUR5I@5q`BcJm9A|v&p)QgOX%}-EUEbfT2T)H)2M5giqq00O*ejy zlLu#G6jpF)_!h(ITIgSae@Hv}21B!b=6HuMK z_}0bXv)#5J*S645^@Jm3=)rp!YqB3+?*rP|V_j8t-Qx7=F`hm?z;rf3aIG8$-oZNur-B@p?5y=Y7%i)r2-YwV4XhPo zlk>+%m@P*5=8vzjSxW9;WOdPq;R7@u%vj&7LDph4SLt+O4w{q@Y;^o+fJpk)CVxIP z4?(q|>)XB5oYn8hlyPWs54i?#BTN<}9Gs2e+6LCOFiwuhhbI5ap*wS$r;6rXe4>Ihlibaf6eKBRqe8fZ1#W=Y-(WH1fLP|8MWxUL{MjyngH3 zdq(V`C_cZM=BaDJl^CJD=fS}-uApQfsPUb(LtuP??(D(-kzWV08iGt7r z+Jz4@t%C#FjaJt!Gb=OCHR43X-uwHO59{)+9p_|aW_8O5cG5*<^*IqIPQylunJam_c5 z7>6FW4sPMzgNIlyuked6o?#rv(Ct=6rEOK@Y&7bVpoyVm2~byaPOkWCI+Co6T8S@K zF9@m0g6NqfQyJh5(s5fb)h^0X@)|r0&RMf zb`JCdmdy-DcOT;7@h9^7s~!y2cX6;7X>;`qT4 z9y~a}@$nwUwn5u<7#nd;PL#xrw^6=BaQ$sngq78kzH3^%_rWpl-M@v4^DC^E0~Y63 z*sOYty;4`XsykC^usjzF_uX4_Z#y_OvOQ4%QYvcJ(lp>AgSgbpP}&`F5^^KSpx5BH zy;cjULEAM*vxKfA%yt^g_5|=_CZx$=y@m%Fr!L2?wWxS~x%CGOs{zZ4f~)hD2fc}N zB9AUaLO~7qoBna}&XRr7fB*h{>>V88`SX`}_VQeC{kk3%CZBC*wX8>yL0idn6TmF` znnmNnss*dMo%JW~TQJ}c0%FhpA=E*;Px-Y?ZQF|GjjmqfC_zsO}w<{*LeZwL3IOK|HU{DbrmwMfo85VhU{;WiC7xs zGpUXmbg+^j{Szs0iE_ck8rZx25dFmqY&Hup@1o_RRYFqngDQc`{Ce%y@$8JDCqkEn{~!!CB~IkR{|PYFGpOQtwBw~-ocIvZXkH=khR&APUYET^MV8(oTRMKtupA`MgzGF0L^6R>moX(ZrK7mu)fK*Ezs{FQ|;ERT{4i{ zjjF(AC=lF4Y&~bb<6yxWQ#*YT4yjbxnlfNpYY^6-A68}| zMXdo!!PFz_RG65h&E|?DO|91-)&thdg4Jb@(hF)&boi_E*d*{@cjMFBO!?(Cnofr7dU+~ zN4L9!<9oMo=gux}-P(~>fEuJGyapH8VfSZ9U@^`>8_wq~II%*1iu(R4;5&T~> z1N6kFvxYqO=(-LMA3g*%Gkp5_Q=DI1DqA%LV<%Q24`oj3>oC@=nB54>8_6usNA-)4 zuRB=B#5)S6!OzpXhpi%j!G}xu9mBcE96);k#}T00#vtS%8GeH%px$Dp;irNO(zo{- zkR}+Kt8);v$Ke7rmIzvRFP#n=Ycv_0m`!5L#YRURLP6-qdDKa!2q=)c6muCs=$uLA z7Rfof&Nkpe$fVHLoN-xzS$Bwo{fvv#m&oIYZl2MW8K{+NAVu|IeuGu3WF@{nD>RR-h4$m(x@w{!(%v$Up-omY;IrjEi?Co{B#v^T0xGLqS&HyGb zQHW-NT8H@nw$P+hk5ljBc=1wo|F`76s^u6@KeMewV!Q(D@AJqQdSL7so2!g6=-N() zcx>P%b<7oop3|@JT3DUBMe#fLvdU_wYKLNH)Dk@Ns9K{#Qw&ruO+kJk&4+Qu3?3 zQ4=)J%BXMFpp((I-e6^v^&wcxUPZ)d$zIg4n3PZ<9)GOrsX!qClq3~KENUs<_lzNT zIKKNn#;a4TSC=T`F51})=w?9Exg|B}bKg6~0JCQ8e0n8-H-^iBOf zeGRv5;PkXl; z6@fI9TPacW1*kD7Fe=N;ET%iJsOT+FYd$y9aZ0 z^BHD44dy$7v6$~jzu8bDKY{91NJ%ZbeQ#X^!ip#a5?z0a&J%KV+tu??^zSO4hhYQc zv0xku#!cjuvOx7oq_Ms1_b4NAE4N+KAQeK!h)n^8p~J1)50QoimWu`QY((45(01Au7*#a_ zh;Et>Y#&CR(vJOTrmFTs$YT3!s~erJmp&;>SaHf@7$N4|e| zul1>Lw?kDIUk9xm%IoSd%oE$~ep7#mej^pY*cbH-$ll*uP+L--0CRkR7m`VAFJjQ+ zhJU|Sl<(%ihe>o70TYcwkG)&BaOd{BU=Tk4;u%ga7DCK1D|ncYYp&p)aR4{1wm@xw ziMPRGO;LN<0BwUN3{~wRAMWea*(slwN^;bQP3D%&zrvr}ckH8Yi*1JEbw&`jT~ ztYRW;Wt9D*MOR8iNH#DGfuPLFxRJGBYN`&KQ+>svJCPVoW{C1o;es-*aj__9+Zk@Z z^FFT5USM;zK%VWOoz0M19nLk4l6!*9@^&I%T(1)fcCl zB!uRv2+l+pk&qXX?bnpd*g%tN)d6^YgqiN2sO%U)#f4+Jx*17O=cyYI;@21xJ$k<3 zXMc12&NVJ4e5aq?m#=MGy!+kNGa z$s66=1O=WFb4*4UR=zkG2h{`6esP;@+KsJmnz)s6=v7%C+xiV&S%yQP8!KR<$n9<7 z2sXvF*ILv=O%jFnOIDTG4Wu+zQW-DG85vn&1xe=vQq7byViQ4%Y{XZ~EtJqy}$FtnM7dr6LLQ00MCL&Ry&s z9$~p$;mc1x$GRWYj6)~-DqU|kcnPxRJdVzFk=CH~o0(Y*J&S|l$T|9U)3O7`%JgO+ z_Q^jPNe4xt_Ie?jDwo~XNoHj7BbqAnZSyds8gJ1>n9D>kq*D1`r3c_hBn{M*Dj+C= zhByZ(;@0E2gzr~5D8J#VZ8#`>O>~%&X%>C^XqBY?0w5cPSnHtuSqh~NH6lxmQG%#Z z(~eR#{fc_{iKSNoCB|yK!FtU&IJ}Q}Q*e3m5@X+^o6XR4Go+^TwPA{hfPMux8gC^B z3TsBw^&`4I1siD!2J)d`dc}Br>qio{ZfN!m1M^ndjx8b*UU9pB15EynRntw%WSWEu z7hmfYwe&hXI>y1#F@|Blr(b*}tGzO6$uA=|-`6wTrc0>2x$0YTwPIt_w1_IZrfBWK zMU&y9@8MPL2PUp#Yk?3eH1WIS3Kh0NIW;oa^(q{ob{@+5G({MiS`ak>CX81l0Gd)i z4P;;_BBuqnfsd@F3+>EHKG6>euwe%_B=E4&6&}~0mk{{NRFQvHjhNSYFo~4TqEXO| z_DV|70q5XUSJ%0pAV#_ zb2Oo?b?9vmJYEx@+Z%;fPQ%mmnxw6d^@d=aq90#fqSJP;f8A~Ux|{oLli&@dzEf_U zI3$u^hsU>ZaCn4V7*C$P!0Gu?fK4fZiwuV4@4e&iBMAtuFQW$jCpUgHKBTISez_mXVzv6w$77yFEwYTWKz&|HJlnB3epw`XiE>E zxEQ9F^J-bmT28s%AJu@292q!6L1p`G4)l`88mP8VL)oCcw14McQLoQxWnMz5 zuXJH>#=+qc4sYK zT$8hFd=+Po*P?D6ggl)4A2OloHl_g8HG|KhErM>+{5ZFrLg}@FD9ZOwGvU7wO$f>fAD1pabdz2p2Dq~Fqr6|&j zrkOInF=}YQu38-2iK!LP5Ul@K6d*w``J_fAXsf0{X6MKI2b$Hs%01UwWgMzjUTVR^ zfR|?rqy*f#`vF?&ad~=z&9FhEiJ)maVZyPx8FQ*V`zQb)0-Ho5P*!@WNjN?}#{S_UN&%idKgG%E8FC4RCkD+W<1YxUT|iRo#u}!3Db;{V zb!)pTlH4<8$hM&q;@WOcl0#9dZoucPOUSn!qCQN9FJK`mkq*3GoV-M$ z7DvYqu-5{YXD_f>E=1_EYh^}YTZ2@^IVRZozmPxtisd@KVfOgHkPNsAt=erLOZ~2! z;r9J^u)DX9&3c0`pPk_B>|8w#QK$Nx>X0uR27-LokCL63Ch;j#{$ffzWvpVScK&UC z~Ln6zeT-Q&0-Y!95~`tub53Xu+OSo^G$8chO?D-|&^PEXHp2EzXS z0q!2pF>IE&ytn|7Rs~I4hlNceErtyo|3Z=hee>bmH!3CGFhOhuy*cel;0up_Z+8y| zhxgIW=eWAs;1{1g!R6x8(Tx)LRJr=3jzLcTu?+|L4e!D=SprcuPss%}Ae|+AYC8vaG6%;%=Kd1 z(sXn`&ubL`husT_l(lg9HET82OKS#dbdL^Ym-*zsmi|sgK$(6olUpET>lXBcU=vjc zgKaXEvKv@ikE$F*)tHn~fka_C&bq2B!$t;x6ftsJ=rlkLP?QD=0<|qNXAoNP79^QJ zq(sQbxLPq*t2LUY#jX8A+`ID*#(sh2#RWE-wG0fKcG@1O6;|c?$LfIJu;hN*(*AX_ zS&Zvo{8vp1>CIl(mf$F>A0n4n<_~DQ4hIK^*x%bln$2;wT;hu-FK~W&4(7(iJJ^wJ zx{ufQEBC$YAKJMV_hqZGEg8TSrX}$kM3(|(mn-1M25qq=s3mj_z>?JsxYVBCE>8#0 zrLFZW2a+77{XeQ^LtQPVfE6gABCqoRPQlp=hC}sSy;Rc?BfP`esg91am)1i&Dyfv-1HL7guQ8gxg0C zu{&?DSzThaTw-&zQdOYNs{&Hqz9j>%3=k~AUnyZmZ`q^MD*~Oj*fsPT&^^5hol~{` z+#^DJdWQ=a*Zym}7W;eqI5<2)({)&0E%DXa66fd7FpRpgD>)<(?bWG8!2lyb6m1Cw zV%`VG!z6A(JSwD@tHl^aHsh#gSW$g;Mnk|`sV*wMjZ=5)c}-O&--S2_c^@40S?W5F zRJPs_pr}ksN5CRgevY=UY-S_IopHovo^C31J3+oyyon9S>_VOLi{vm^h)N{IS9>0W zCKIhpg&3TS;w4WliE_mn7z)q;EUEQF<1oiE$P|`yFdwmur`e5KS5_e-AvqMX(UlyB z=WA5WbpuMR@*i5=xoVoUr^jZhB1CF+{W(S9;j`xS}yR_$r;WsuF#KzV)8j8VnLTm zuV3lu^53SSi#j{f)>R&xRm-TVP05y4h;JUiI(RFFOjR7ee9Z#B1eSEEErWw?g1AQ+ zz^RcK(6ys|esadTkR($b=rM1t4vlj&OmqRcnFYqlhyl3|l%pos@6eiD&?6!rU^mw_$# zFMUlrKtbyL1_WMEsBv2~4&WRkcxlj^T=i@=!+d8CJG*{05QE0s_>!}^GP$G*Oi53+i;mWNpqv*0JMu79^w*hgkeUO4ON@*0irzM>V ziL$Z^rLD?Ub_)i`2;K%Hw?)n*R_7D@Ce7|#WKT=2YVxUX8#)jJ0~MSv7Pwd}!C>s~ z?qYA}5O;6yp`{W1rpJ1<#4z;OtVY!hOjV~K#koP4AH-z9)dI}Xk2fFzc^j|K>}WU1 z!8{Fmo(6q2^pK!$yAHGY3_G(O%y)Oubu;9gakUw6c6o*6SEsnTx~gI>st7HExYosA zSj|pJ^&yNJTUn&ys9V>0f=-1pMdfBDokNjSa;X(YVP`fZWoHtCQPE*(az)q(WDy1<=M3UTs-4kPi*;S3dJ30|B^Fm#pqHnh)L=eq zu{+MsIB<)xl)5P)R}C`hBk=CQY#ahyh=Fc`&1$ zb!eLwUAKeTYzMRX4Bbqmr#G7o)|-s;lMAe_R#^9gE9>~@?PqpSP?t$p+489B7s~%M z;OuqgibE-*$jAAH$zkB^Q+)V;;rj+B%}jas29 z&02NaP@T7fPN41jy=OOWKvQ`HWq^t6dTTjBeU@5%htJSocTj*jK0d;Fy|4%Vyan)Q z0DkZM^f}(S{}7*i{xm>IZU3IUr{XdwVku-ej$DBhObHbD;A@$pVjz;$1aL8%stQBk zz8vw;u6;JTx+=#KDhwDcNwKe8)JA*Uh$@iwexkcA=8UY)DQuz&4S6Nv3kVf+V9t6j z$pt$}Km3A9BB3&ZQ>VIx)h`Y#GXl}GFMeYr==@?-Bb8Ecwc22{>2Y$g&=#b@d^W?* zyu*Cw7`NsL-E0SK0>*xWVHioIN!I&4%{QtmIO4)Mc0N(&rw>$y%G^d2_yhTu)lyHdWll<3jWrIgi@M>&0hs z`YKs>O~25Ia&RW8ECiAZdZ?1C0?|ZLOor`NeD{Lt^UHNq2coem1FIf@Q~XnPczSUE zE>6Dqxqae))&lr3fPeJ#v;T$f{k3lg`eEz+iEjq%X;J|Gm{yuwga!B5GSt;e(m`AR zKv2wXQ1J^cTdP4Uow|y*PED0kLI51;l-P+wO7dZA1FR#=S~@l@c$A*b4hSi7ktvY- zBlX#Ksd=oj*oJZp*ljuB;{Q%X`nP0zUCNc1q?J=~IRM2b7>6RW3q+)pvC1P>S6YE+ zi4b}o_u1j=*M(?e0&SQR{(bZ z`rrEdcy_kJC!akDu-rgtbVO4)JSI+Ig9qaS80#-JftE;t0vVpugS?qij(q@06OaR| zDzNqS^2;Ki81-h>VNKl{l)BX*DFrFfmfsqC>1M9A2ry%SRI!*U^x4cCO~1`HD!M~2#3Em-ZR_h zFG3#XeQCeHPUdqTAh%)8mD-A*w=?b>l|cV>N$vpLG3@|U3A`;y>@CVS`DZ!#tdJ(u z_WGD{x)D%^6Og9UV533;(-+QJeqpL=J(ZJesJ|TEyyAlp+v(Q{r>dn+w9Q#P(2~L?HNaq! z=Bn>+Z;mA&rw40`qBoIEh-;8EJ~{QtE*ssHeQ4;uaAox8Va0Ka_MCVb6tjy~Ycfkt zMFmV{GuEr}tXfX#Yb&}lFI-T{fXsx#K;a~R&qcNSNBRGAR>Dj{&INfGHm2ZW{~7@8vH6WTH*C$)k5GLHgxQi z^a+5>yf;e52k+j)7eD){Me)CS^ytyTqWTX3ES`P#b6lJ}!*758yHyOtfjOhT$kt06 zQznVP1^0{A_XHSim0mWZ3f1E?Xb~H>Tpe-?2xY8rRW5_7^0L#I1-CAJWHHfA4OIC# z1{UDtUU6`-!(IBP;oj{Gy_XY<`H@AUTXMMHL7A@7%1~*~wi4x7WmJV& z-YVPJs`QsjMqiV7W`~)Ilad;4>ftG7$rkk*zQpMbt@Olm3ZzFyGeWw_8c6sY)L0`*sGu1R;nH_jZq-hGHHMVE~%##lPTrS(e zI|%286tJd3o=p>2uz~V!)vBF6+rc-nT~1ph9uXk%!Loa9mQY<6k26YvSK!qLf?YeQ z5>ZG_gss4@KjXu1zmNOJd-(Z(`_I^{769-s9zA;WN0`?2_(K4He*WSqe)gw-j1S&@ zi0^#(?Rv0%2vQ}E$&^f(LqLUIT6qB1w6Z;6q&nhFArV9hFk_mnRgHM^Tm}&~8PKM! zvS9vlN*(B#w;^cCtRg$ivNfm{X>}mz&giMtn@9cNO+!H;qD-~ab@y9NDmktCbEvDS zQX*(2Bw4#D3nP!cK0cu!ArEUU&Bq$hMfmK@jjWQ2PT)0={PlWCt}vgLwQFXS}ov)=`+PrQG zT#v%&yXJ4<$)lN`K}XKj8`hIN#oc<*N;nP{1HV6%|Gp|mm<4UGUfs`cM05x8ErHW~ zV@u9qNT0&ja!qdbyk*39e&bvC;N5%p*-!ryE?zzbfIrt*hgSdq@X<#fjURvf@xKS~ z4_B9G`^)ne_~0-7Chp(4gJ;iACX>{PmSLa#)*qVd-_=27nhjA`7!he`Mi91g)ZSWl z+Hoh!-kPuqe@+lq9N1IT)Lm@M*c@+xigSn+3i}TFYSF$ds|4Ov~My&yKUfYYk)>zixqu zitJ>U%g)ZNs8(gDYrddlD{DFSVU%e|aL)CX*JNpHG3K#?beyckQwki3Ij3V)lr0xm z#x+ThUnFF$Y8iCk%2P!p$G>n@F-~a$=y5@sZP8Ogu>R5wLsX|ys=Cbte1#mGh3h%b z)45cvzMWeWjCJCGS1-@s{hhyz!@Uka`;#Bz6Q?I3Om_Ga zu~u(&XcBh-;ltl}AHVbc?_j+=!_WTok8%Fu2>^Tn;O{}p2abZrb=OqrdBWf>V1ELU)1!*3q=fmx|0>H;UPx}ES(%!euDykRZ zHqu_y!_Jl{r?5P-+TP{@zZNmv6~WrCV^c5 z{}{j@0N4e9qkHe+`2Kr1zW+Xm2>XY})1c!(I4N~NQp*_B^3@LF)~!D!`Je_xqTm-- zsw5IkZ$c{?WeQUtD`i!q?cp0 z8dr%yvTJ&#I8@T%qKR0WG-Y3c>uXzHoPasw?D-R%J^#XPeB1T^O921u@#Dv<8%gA^ zN&s8cz&{1>4*(qD*MD9wlJy44KCk+ouY2q_{o0#+Kfk4U$Jc%TH~HF|{QS3ljsGA2 zIS24>0Q{4iZvD4P03i{~0Q^3HzYXB`WW%ZzhuM5Us_Upe6 u`nUS?Qw2o-1i-%o@E;yOe%!yw1OE>zfm{u1^n+0V0000ft$nJhNsS!>#i~AMpMCaT zd;RzC|9%%^tbqS>@*Dp>k$!seL;pQ~{J8p^-}#-dEiNwp!>z5YFX3^c(dbqD?VNs8 zPISb-%hx~4Ylpq3e?RTLr(MI-{{C5x`z-H2?Q?0}JFj`~;b;A?JojOr|FmoVyZoou zKYkyd^}i6pfpZ=9@1u@;+GqYgk2~y`pXI%u_47Z=HOqf(uh;u2{vHm8Z=F7U`rrTd zZ~ykUPn|l|>PON~lYU0&X9th#?1w@D;D3|y<5VI1(I5TMsXzO(Kl`7yx3~X`bnNWk zRX9GY68QU25`SL;|7i;DuxtA?LHiF8#G{nN&w71_o$EhTkUwq1e%iV9y;9JR+VoF5 z=4ndlvkKa$3F-eIO5kS^{?EFW={c`YOicXQFaF{${;$9O>%ab})Vt|tTND9(q*MSX z+yg!G?YG|^e&ZY8_!nzyYrm2HIfbu1^V}7<^umj9;qnz|ql3AHlcXm?Y}5a%q-p~2 z9`oi>xU|vm!W`(u>HB!B9_JwMP5e93Yx<(I|3x`xg?DSm=Fd4fhCl1%p7ndczDGWb zznzo6O96?+v4x_+?{spsv%}1F(wF%EUOpf4dKA~HAC56ypS*925QCgpkN2vr<(N2j zKVTPv$B>6{K=5P!9=%3qXL*`<(|77u)3W3B>6+@_Ths-p4oK z-mU9!@AeIS?pxE-)Bo3R{^oD~?_d1l7k7$>x}Sd5OAla5+t3l}8nx z*0-VuNgK7QX>q;0#)?8D%8OzkS)wIQ$M*^$>J^IZb zr6bZgD^>;g08MDqdD8Vp6}@zhNcZRI{2`s!o3)pljiUVMVRjXXPoEDV%3&>3Rh1ty zUPF`y*7E?K~Kczw>1u>E{(DWL`fx~$GvcTa)S2MspC`WcMW^%%W(DW z@4zS5KA=yf5aCC^^h>|=-~PsL{6^^wphDO}1<+4_%;~GY^;^I7TC)ECGQED`^!bbM z^?&-yaO&Jec#wqs=AA`Y-PwoD?Hw4Un`-t)$rHfaj`sZVB7M?O5f^}jzU57T${{wg zd3nP-yqP4FuCUtj!~rVLmJ1iGuGo6vxp1R;pFMzzg)-uCB+P1+To!J%g6Z?F*Grd? zug#@%(}S;Te#o*JJZgNrDRef{@l~%TAw~gmy^1YDgP-^GkX+@mcOWiyJ8F{Bk@Hs- zU!y3Um=vk&S1eSaHLro5E#40*inL}ShOF2E3vX3>+F)MKiTBd7QX<8r0#g-M57!Jo z)8jQ7?KRLJ^hjCaXX&}6&$cZqO%f!!|FntIeUidM#ns|7^RyQD-L42F$R44N$Bj>? zY)t?`-ivDCL9HwBb>VlT-~nF`2}{#*MyeHy>zsH1V!hkI_eEAz9g@f%Lfg=Lbc}kU z=`~d_BxLEC(=*1`WsOJy;P-k_T+N8y!?ni0fdo9zv#0L{RYa}m3(rDdC@YqM>Rd{3?za<7N+3eqzHkK62_k-; zA3rN9Q|h9)RcWc^!!>D1Py#>eD9<0gf+m<@QTLk^f_#r!P4dz-bV83bY6vB6b<09; zMy6#e&-)fc=!(=ZU!mLo!ppD2Kl`=+4jwMA!n-%`!_w*|Z13$u(=@ix zXcMDAqIEzwTU>3kuDZCbSaWfufi`5FFIt7yJM*{jeT~CNLEv}vd$x&i0e$VwWdl_x z>EFH<0VCn{_OS69DDf3U`+62Iw#s55Md%_u6mJnI2|tLNteaNu(aVNX8O8_Ql4sz^ zf|GT^>+;bAfMR){H;Jh5bi6!7a+_V}eP3=YwAM9yS*ldbo)+c6PHz|uYy&o%f_?z@v8=@Q|;a1I7FmP}yAyfb{l@|Jtk%+uj4GNBDm$@a+ zL7!P5x7a7o3_T|DIQC_4@WWz3CxyZu16f~jzwvv?^Jv8-cUC^I^=kL|ydd695D$VZ zHwkn_$KZ1gO=Cs@l>&$IoIi=;IiUAO$5i4~s5e-N$3f4aB}GPx5$}ukxIE7gb6!Nl z7VpSqyM|a@y#un`E?(?GQ#&p@O zB#q@czQ>2C4+a;~d6z9N9$wXQ&m0%AVJnh-@^8oHh0f10y~L!IY%a&|lM5Vja?wd_ z&9QFGpAS(ah+Vm;E}kqpy{8_HcpBICcE!TjbXC=iR0fhigVtKtTvaD>avmo>J zqaf7c$&gYAa@{dn2tpPIzl#!2>>gXb!?6;o$klIQIOvP}=b*;$Ktdwg?D)HOIl(B( zn8FXAy*3MSDJ+Y2FKs%$5)0Xm0$bT+8As#+M%W**@9ruw9EBdgBZxqta`2+$qg+>LEe~o|RHa~)tYTGj(kN00;j%DOC$?d9_faj_! z@uKAWM=f8kCH_J-JhC>l7ads|sS_|a)q{_|^Z&rslSeQ;J^jD^$)Ehm?}F-<-~avJ zKfAH9@!#X$U;EF088-J?c<07Fc=Tigc9Uid4$OMdZ>Mp1up||bn>3ObjkOS3<`^|r z2^1#<(OM)jY%)zNg2vtS9=oYQVk1<3q-`U|U$jB@o1F2b#0w`Q0X27EB|z2;KZ{x$ zuK}+SH&xnrqp=BZ~Kjul16$7$hY#nFM?~3H#hc59TL_>46SmetHt7QXD@) z$J8k_&xu94M=vQnah0Q3C{kM9fkxu&PP4li#NDJss?Qdu>U%QoXh`w9Cepc%4QiO3 z?8Awf$#h+PIG%p+I;Ya>!^%-Sii!#En-rT^P_p>w#h@Z{F(+n2$oU)>bAs1v0<7h8 zq&05SbHtnh32TGrYp3q0?7ie?CrL(CV0ayx zQ1_MXTM$ozl%>cP%IW=;HP{OtF1-E~y0*>D&Hv%|e((3rnos%7Z+`Qir#Gfv`rMmv z{M1?a;nh!Id2I{!11~hl!fNt@1TnO-u(=fFG%KpRS=h-Fq%-1`=xwOdac1^ zSjbkHltf)g7M}M8UfXckBjqrY6xD3H7rc+TnRNZ>??JjRyev#&S}0TT2KHhETu`OR zE-pQHQm8S9*ItexrN!P1?Z=q2=%5uKafdb6!b!nsC16q(xMxIZa5mB9Duv4-BkeWa z*Fn|*JzeK*Z8XP4ArkHzy?)oJL9*K}*UidDJTM0mZm^eNRVMGu(6NwLtT^R6)x%|F z;7wjZ*5dk|hcI>WEX-Ya99fcY&1`St(plo``-L8wZ>~@EwwmoDL}#o(xG}@kkW{j zipJ`(K^7%Q0z_SUdU)~xIipOl0Xz%-M>8*?>f~?v3AlKq5xfgGq zqqApF9813&QRcb_y?DND&NDf0_y_tMjj?wYt~jk$$VPT`PmFFw+h^|NX?T3=eGJ=P zJ#*&F|A|}p*OE){%a^Xa3|GGJ6?p4|Td=mZOADmgTTY4OGw)P6d zDeB~gRDuqcg*U1!gkyLTYrhh$M)%__R;LO<$VF1F_e*S~4_D%N(#qajOk`!puObmBEwKCEeMk8l#Z*Nyp07=Y%KH1@YLs2GP>fZ50ssjX~^&vs*T z3oe{JO?iO5&9(a0ty@>?_4W0y;_=U3c?FhNH(_IAJB7U?1EcXtwdU<|%x?*+N^%}- z;he=SWl1k`;t4ml)6$#XVAj^OSumLrr3SmVPl?5-KpO!_a1t*Tbyg__fh6g?v!o3_ zC=ujV$|#!02&}-^Woy`b5QSukJ#xd+1}$Q-O0_=Zj4sBZD99C^!{z#S6Je07`w%UB z`X0{2i;`-1V_NA?>b*XQj@)JYt;nE)!clt1-lz-FxuaPy{!${Nk1q& z8&8%2MtPHMu07$f4np2sqG+o+c_PP-n`ecaac1rm{d+h$1O4grGn|HrsR@{xpQRX| z>*pMoQ)NQy^BAg(0_Ts!vg4)?@+@iHD5+3kQwdC^_a=rcWV`A4?(Ocwo(o(C3=P$| zF>Y=xNfyisdk$=PJy9t&@~mhNu(FRD7KzZr{f76W!ugs3l|x^GFDtU?!@bsPbR{NP54KJ?JxdDyl(M&=Zw}!7w#Z!cflo*Id4g zt;lO7A$nt;U=X0rDBb_DGnZg}@eZu6uKq&3x3~8)e!=XCQ*iI`I_!*E6Bw;2a!uBo z%V9N0$)YPVirq_%JBx$`o(HwOlx1SWZVSGL50>4RhTWjFxRiCrhf!t3nU$K%6)Mop zJ|pjfB%5>*sqB+BSS6sCSR~zWQGCTglL9fPF3L5bpM!~G z^DsSo9H!^b!sP5U%qHbP?zh}F3Ne>l@ikG_(OG`R;#mn-`ssj)nMneg?TnHlXa;HH zHe8aedGqHu*};A~rt*U9OjbTr9MXY=3M4$02sU9eM(n95Iy1_7#WN)5vf&Wag`70x zMBj+_xt0VWBNO#}hV>vYPn!{v7PffW=kyG!TJ~xy2BmP14Tn%?xs$lxO5GsnR`n?K z|KjmdSRe>nRJc#pw_$4TBpo#xjb5qSwtbG^f|FD5=wOS|^O0*{;`V@~X zSykQ}MTrKA8+HuorO#z-Dx>mff!pl1peCboMw@X2R0{06Iw2Gg;HV%Ej$0YEmXn3f z%Pmles*%v&bIqBOX$4x0TzGLMCF{%{oYwPwE;AZ(kad5u-O1XgpJ5Mru43%JcT!TS z%pIicvuJqAzLSf~$vsWp>~3zulg0b+$r zniVuu>a+(HRb}77>1QPn@_y9kDd3wF@x%JsI;=lggT>gIFrXmLoH&^j!bzArbAjT{ z;jwA@ZUXiN#n!qE4sx=W0%IJ4WcVkl0SpOlUc-Lc6FYk&Xk{;=cZtfcmfQ|1VL}tC zw+5Uj4YpsUy5yZGvqoJ0XvxhO3nU^MrRdEV(zRAntM}}JGfu!|qX!D*=BgE=C;50Z zM7cLcz*Mm)6;i&fl{^b4+qKkg885jGXJ|vOdr0h6a%!OlJ}p6*qSH)2sDlbFL*=CYDz)s>S{1zW?snE^6*!zn~{Bxo>vUGM`= zf#gk*T=Meo3OX=M-*fhmbHj_1Qj_{u!N4OLQ?h%{;Ec-EWJMzGD2x$DtW~w5;H(xc zFj}AM^<1W7U%lV&!$gl`T1A$z!jP=GAn_b!)M>Fv36TFJaq;@f6Ii|XNfP>du(ouc zTzOn)uRRXc1Yd`*$ooV=7?02dL9M1F-{8(eTHVL6iyu zJ@b%4jkTn>R^Y)$AJFl=;Q)>;oQLCQ&XH1>SvW4rxqvRK=hn7`!sk8FL!3jBw#n%U z*iE6~&R&x&|A?vw;z#j@cR2w}`$3_>`kGl_4kKL@D=qtt%cHViY40_;d8sWdxR!Yp z^4=;MG3N;krmUW-$P+8!Y@w}3N&!Qvh`i5UTjcUKD-?#*Q|M4j2+@KiiOFkGxmBpS zK)w+-(HqQZg=(gjUH}-SIA6s%%cb9 zxx~ec3ds#ck`>sZrE~6&A}l2Z_vp?oI$wV{gcIj3!u*Bj;l$a~P!0NwwE#&LlH%me z97SUx%p!AAw(J@d4^*JZIq~SN!ob$Q2)HEli<*xxC^J)WaCHT;mmuDQd37Na5PN3; zGfqHj#ODenR6xno->ruA?7{Y}eGd^>qZCWog-e{Q^~a2rFS6(=_(iL%zD9`>sV$pl zskQ&It5svMn9*1iQ;WMb-p=WYG8Ma!&T#lnKoG2zE7SU{9r?Z}w(oNj2;Z6rx@MOt zTP=wu?Vf9cDPc@}O%7_9NLHU5A}8PxV6Opd+_bn2yN6z^0AA(Z#uhBy{0JW1yG2$W z-FHU$B}<=NT@vn!JuD|e?IdBDg}Z=F7Xshq0C3|(0EfQi6gAm-!ynoaeE16zF1g(G zX&yqwZlnuRHK7DmPr|~G_F4;zAK!onX+2O$%$+=!l)+^<{rvOETNs)EMzNTRy?263 zpzlo2a@g;|Fg>f?v}ZQA_jo-8%8lV(#)mLa$SG7@vh)<{u0Un3Ys=jXZ1B{OmzoV8tir3{!^MDwcp_nXx@pLGI7i#E@!8 zEhSannrW@X0>MfvAaOcfcN46X#>qOy>U*ga==HlQ=B`0}4@)(Qu_sr(f@uWfcxP1t z_QES`pH(b^kK9>@4`j5n1B*AV!{V(EU}I$oQ|qLGt9nA*`AQI7E_(pRQQ)(JHBJFH z)^B~7jK;BJ`)&LX8Qx9aUs{@Bs9-oXgq>u-wvr-fqvV2QT|)}< zoB)^D8x)*?R1dflk{f*}3|9}f5;xuue=&!Y8oRq(#>1S1S1gLfg6%1chokv-heb!_ZRftrJXg8n23!%+uzYyid zLU)rCHCRoqIM*eZP@#!pmGQ!I#K90;&NoC-P8194{gZWd*@Mt-G>Ii`;bI1~(Bh^I z;Deyv$kmV5z!9{*jrSY8;pDNuda{=`*PtgZy|j`BZ&eO!zK{+;R7Oi5e+>6O`e}0S zZ*!s!@2?(;l~=(p8kQW_sXLfpgGxKIQ1K{%b_b>QY3woG3P3!<(m$Oi&=YH_ag!=Uf_Cd%O&5j~3yhAASc;rZD03^RK~)3uhS}N~aK)L&8rNqJh4K zX-)e{5$q-fzP;O8KFDc;G6)Eb5QNhEkvu~34C@{Nakx2XpR@gqT5QPOh^18)57uN( zO3AptsPCihWqg6U>7@my!jiP~CZmaoLQI1CVqd5`PsT+tB1O-ECJ>`EGFcVCP;Eu- zMxfXS6aYlcs5cp^s~typ^|TlxBf>CmvDM?p+!C^)BX*gnX6rfotyxi*-3AiK%5{64 z^&HY1!iuvcOH82%)U;W=>w$1U6UPu(6hvKW9I3BS`n)TA}$%#P< zl9J%Z4Cvv9P!+CshRyD8Y`}vXAHsu=-h&Y~h@iDkLhr=tvvscogU;V-3P90f1-nl{ z+}3@N-5%gW1kxQEw|5VZPciv_C$_-M)N|l_$C!^u(FSfwA&;=7Y6$oA_tHNbc>M4o zEIqgbgWeEMKldV>Nk9FWY1#Wx@G35cfN15?n-l40Fjd2TQzb>P4gheQAl^0B|ms6obn~S(Qx*4;F)&lf>g5fYi_pYD(@;&4~#SE{=+%2}t*3 z6hxA`GHshJK+G0^Eo9A^VkdE$CL;njghXkh)TEYcqjhfSYY1ZTX<=1akj7ScZ^Z(} z?YdCJKMYOvmI0UhkOU0HfkJ17T7PEPqs+b+*d>K)am@V`^c>a7mma~LpS%UDi+7PM zfL;2uVZE#A!8*0{Ua@!HTvOMPD+<56V<_jFgm zSr1xTmmtYkd98RION>rB=VIuk@VkLKSAPn(KX?aDoH_>=Uj7`+o;jDjZwvF995Q>X z%=Dl)Rl!~olFhAM66PS7f+$Jf=!6(VLeD5A(O7tV4DJ!|4<3iT`Dh#*mt>>1%8Rx4 zMj;kuOFKj78TD7pKs3-cWc4&e{z|Z$^V%$zk+U3n)&`YVFpz@8oRsvn;=l&aAL0QN zIDM8G#1!un8cemARyJZmHwB7Amh2^Kz^drekA*AKayDEnup$Q)!b@Ng-S66W?}Y%P z@>Yi@ZLNLm+L(e`TpK-VJx?ST)47Z@h)P`++T4hO*PFh7dSU`5`n4rzg0}QpB9yPa z5)jIxTQ}j}hd+X?wN-iukm7nmWjV3-SV17G@5Q|@xeFmDFpZ?+NVdl#WOU4pk4Jd} zr98*a;L=-G>d?gBX9)$4E-8-33(hjy(fIgWE?c4^@PU*&Rcn$mc(S|%E8qS%Ff(@o z&c5&pEL^-SbYood(>;$Kqh{y(=~-acB32BxcK29_1M>?;C#X6rcemmV3sHzYFP}LW zd}T0T+V7R{5la6+3IH;Xq*TTTnq!Gv$qLHA6y-jt6SBz(Z^g1G z0In?Gh;{UXnMZg_3(Cuc%@?xQiK=-cR2%JvmAJ^dR?& z3+}B7B8f<9)@b0twfEre2S0-Sy*)xQLN#E)mt-C(7|G<98T|u78{*+EyBkZk9a_qR z?m8S!1AH*Pf9gkEmoRi(VZ@&y8SoTEHvU>XEI(1gJ*l>xyaIw+V+$?{ZADmvYj1rQ zZol&bIQ!D)QiyQH6aiUKgq34QD=6f41QUZk^lAs&J0sYQt&|!Y5twMb0b-u>HF_nH zg{&MEe5Uv1pbM3kOutg6DQK)@r;38=%jmw!SdvVEA;|k+D+GiBDx&s2-?o5nL?Dt9qG6d;mjDePf@Z)!XkQDQ~aPGy=!>Q-5 z&~pjGFysuWiathwI(>d-GKB|CmAru#MzJjzcMISR;yH9*8tk_u+u+_6ZGy8>xi%%W zt!3Tq`MX>yjD-PJ(%F)zRZEgsoxpqo_7a$pl;aIE;|mT=$Q^`?g9#>=Y@G5luREON zMn|MUR8_bRF2^H;Oe;tZtq$3;%OUX?mSQU4{s4k@`Z`04B{t5S?`^?U?Fvey9E+lG zlS{2xcR@oDAcGn?vckZJUBzfF69p2|uYku-4=1P-4>@f?*jt%nuQuu`O%Oe}@d4a< z|A$HNchmb=4H)pk*FDkH+%S~M8vP*~K0YNY?>jPlB?IDgv^vE>|5!x!enA-Gr@?s`t4}ny!6hnnW8$NospIATWfQ< z7whqj$0)PhMyRonf+;|{l8Ed;8x9nIUlgTj!F_G#@XA&bC8j}qce9@qXwSI(qp-rF zRd2DouFe!=taNH=w{@BNN%{<6q~M=6^Xo}o!WnO#OA!Q;RSb)6#mW+rO3|zl=#z){ z;O5(Z1-n~Y+@)7d@ONMXllS@aq9DC<2g{+|!3Lk|0mP%Mv(8Y^wrH~`a1aR?$H78n zU3e_t5EPy`7W>CB1yH_59->&y+!~rgj#%U*;%D;`;%D(DEEOYNkd!p+v0}%)gS`}0 zAmZAaDJ(!3^0S}&d6+wUk&C`!tbEm{{1#t-1CzZP`stioX}|7`_9T%lF+VoPf$~-= zY=kW<3Gk=@>r|CM=`~T@3dMZC>v|iimG zu0DaAKmKb%>yhC12HeV7)m@8U@E(*US2rHN$Is&CkH1i2`U}v9;r(5K5Cn>eb;IcE zneDh>jB(?rzc`ld9|O3A!u8b*b0sx(B@xl%LA=0NcnmH;={d(3kEkvjp%RX$ctoWP zi(LJoXA&yuD)scNcK3GS!@vC&oH%n9F1-3h7|tHEEjCSDOyMLQv{rA(qd!&h7a-Ezt`DEl?beW|!7KxvyCB5B|v9{}?yA%ZE z3(Jn-6FFlF7Rr4B;0vKo!qA`S)4zND^mo6u_xi)iNItXYFkVq`u(P?J+oIFv-QC`! z>)b`67|Kq!hTyZ3_?MOR)U#U%|QOUx9Nkzn<2p4>knGGoJ-@8>DNl(_WoTVZp}seo_KlKBj(todG2I zAf@*vczJAvQ((jjLMJn6NLpojGvfk~NkAY3vQT)~PL-}wh>OQedj5#l7g}?Kf`}vN00=Fm)g7_| z!t)q-Ltrt!80^t$a#6qpYg+8*#%nNszk>Cbi9dJ%24cKtrYB*DHGMj#;QKwF%iOH= znU%XYle_;NsyD0PJI zC!ja1nKX2!M;i|ZeQ3C&G}_L*0dF${)JyOH9Zx|$z2gf-IoL*RWntajZV0`$y|GWQ z>Ybz*uzi_my`xZtwL$tUn8*bb#1h-gq~inxRE7;l!kZ7%1hG@`uxSvK_(Mo<`l+#c z)KJIg{hQZd>FzCf_H_&kp0%$G(k#TRjV&dIXC?+I90;(ryG>OGn^x2m8T|+uDM)Nn zRe|b^Rz$I4in1GVR$J=*ttIk|OGEH8hrC-rQ@o&D6z3iyx0mwFL8&AN{(66B z18$`_e|7Ob34Vo{eTwlb0YZ6Ja)-6r9<@!wQHQ7-A9HWN^JX=`gj|6`HT^x9oPgo< zFj?><@CZ^G_Jrolnc&)BQsDv6-`?d6F%1ZjkVr!(5AMLcLsup&WA04T&}(XDK=&{^ z7onWeH`;ArH@VN7Ydf&LwF6s^*Rs&Jt^G|F+O-*ELp*zJ?%5C7$tx3$pPox_xl=J< z<)C6kAV^TG8XyPZ^&kER0S3L8Jc3EsND2O|q0W35?akw`}BJXTVn&P^k0C$Ts&>-J$PX>hLh`@DzB$v;WcFW&kPK6&?h>Or0B!U7~R zPJbw>W_~<5SlR13H-Qtff>98~;0z|J4J)qf!g@?uf02vO6a*txo+72878~VC0A~e9!C}on=0Is( zu_$XeVN&f(w3WVR&E7kSi!JUch201w+Dw?CEtye<9M%OGNJ0iD?Usb>6Fz>byB5F* z5XM?X2u@8*B+XsfAWIPPPMbg+ut{SVZs5$cM{M;`36a}hOL9-qdro1)1$k)ky*cw2 zyIH_88|!j%(=g+XOPNq`>>UMF!$3&NoXrlP}!^6T#8nJ z5AhN}TVV2|lone9?3fo&R4bJDl-Yi3HjHgkAX)`?qWOlR>4)R|#t3luomRY&aCk2O z6eJsp*SF0iF^FZERT%`1^9ond(lV%uKubWAF4U~|fk?Fma#PqoJMkC3TiUxI@ zTcF>fO}+QlZHW)5S1H~;WKK6_?M;8LKfVt)zW*(nXpGr?5`0DRiOb)~rXL1%k6i_1 zC@m<sHij-GZAXEc?FW!i6uj=@F%!pKA|=+mx?cHet{Eyb-xFLq@Wkh%%^Ai z3_M98!pfsnRt9^!Y~>o6(?FT(P;gAfyl-RZBG{qGDZ*G2RndPy3Qfmwkuq-Rda(_8 z^E-bIm*4m@OfQ^gHsYeKNyeDMppR|blf@d14+nx!uY%~90yMl z)`>=PkG?MQAl}%DSqTVEM$6Us-56>hTtDsOsL4GFr3Dp>uhRgNg4m>ljF&(l7loH! z(MhExr+(OrO z(T>XJ$84FS)Zm>l_;}hV+768O(;H5}u~V}!Ge4ay{eZ92`!V<3Ww^A)-W^7+V89#W z;d6Ob0*Re9ps?^GmwufrZJVy4k2r`*t6o4G;hU7H%-u@ zWp!T3Ok77n;5w9E)XB4bQU<( z9gNeW>NK9>n6nSR_g8T4@)bDy(i@gIW%ph8FoSMqDI{oMuWbtyZIyE++UKwA&(=tU z6MpwuW?I3pSbnjVWSuvX7R-+^j-bxLmd+;7SrCF5V5Z?%dzmglm8EP1xC7OG7U4i5f( zm?BU%UN0y@Y@~8>?wS?A%)&7^wveuMZkiM(%@?RxQBY$P6r6~%&R#O+mXB-N%tkB2 zD7Yn+8@AUrr5zW~vj-~= zS70zTpurxPJD8jvBuieyaI#OsPO6%_kvrFU2|OKrE8QjGR@l&?pD%Sl_P(9M^}YxK$>uVWnPYUH~$lwT%rcL&v(KAe9SW z`TLZSho;)J#<#B-VPhMmQkJwY>T$w77Hmem(u@~wPGlku5cVLd98}qz)&^vy(AKU% z#`8lG`~eIHoJ?d823{T}W1JC{tUkI2H{SY|^zjc(_`M|Fpooz=Xj+#ETn?1=q~k0~ ztFtx%#Y)eK=TAa2Ie^)d$6@aD4D|W~ZbYgp8zRAjK0N8$TB{@?+}4L8LrTy!MqzG} zh2GoRg}o%4?S6ortsNTNN$kd<5Da11HMVhANrIDW!UQ*Uf+X`HQ?^I2KJ{MOw$*<{-E{-d=bXX=kNt z-P+oM_rLw;@cbKJf$1|B&8VZDpg9fI0T2vIN!kh=j< zz-uKW1;H(-{FKmf37ch9JWnu^;i7G8vf827E7`JK7o8R@A%B1n1S}yDL&5r^t-ikK zQEnTfSLQ{QzHQAq7Ci#7yhso@y!t@y5lZ)et4&_)c;8XvF0 zGg=VKb|=oBNLKb3Cm7TB;lyDgDa8rCgd)r!CL8voY_3u+qoI{J3M&c5*6K!bkJn&- zcaN#W30RT`trFFh!Y5P_X!3`=CS0QdRUCrO6SR&qCrmqyS=T5GG!xT9m`fqca&pf( z6Wy9;x4*fYegL+X9XzIIR1y2{^zm7^_`*4uIX;yvX!iV~B_Sm=5UWawzsNj{L3r@7 zGH~j`sT3ldfX($yxcl)UEPnDZxib4~gwP^79mE>UMK_mRWB7QmV_KC$j8L@OI!Vep zVUla$!ykMXF23{%oV@(1foeL?Ya}zKk{E#6w$Hy9~S_IS=w4s9&K+NXU9( z5*E(Qk>FDw1G>mP4mAjY=XtYmDamCHO+i6wnUN^UXbMgP&E6h7`gjR8RyP?AO%q>Q zNp9xB6i%(aDzK=jCP~zhk>P6yK@|XAPiy5VYdLy~Le-N2uc82xQaF~@ za3(30OIOap$Jg(};%!j`GME!&|2WrlAjj?q1i^SEH(Kc;kAo+*oc7qAkFLVz+A3U5 z-T>|&tS+^xX(Kn6^^yXc2?JQ)-jkNJg04KPNaeC0<#}+b5bi?tI8DVL4Z_f zRK(?Sf*RDBn>K?Wj3^gCWGE4PXeu$v!3Lmec!A~aGF#fE1oPh9Dh0}T-|JFH6)}I* zSrR^Ty=ncP2USW=K)MSp^iZHn+ls~Slg4v`dA2#~4fpwbX@J15nZdq&D)W_{ldYAs zM!TDE^>6eIeaG3oQ0g0G|*d`_L@UhO$%`jl%iS$en@6nPo z3(no^cVXr68oc`RFTv!@lmStk&V#f>AsEt)@*c?C+ayKhgE0JXS#B!rgIC{}f@hyU z2e(NPJOJ0AN4ihK&(^Y4wU?*%90Jn_h0udLXbZ@<&J~n=R!p8Oda&HVSQnF@ z^9Va7+acTn9;-PtO4^U)d;&u@e8IQ^P@sq=oTD~zG=!7(>NZm~pzaPQlnv=5X%P#K za;7eV%;ID0Hax0`PGV_ALYt)BcciPCd1!xo6F&IPzlOct z9nSFAO4QLa{61+db^DIU^M#TmMJc>ADMP~FPn)C`O|Z z=3Il*an9fc%dMlNT%Kc(@%?C@T0F6jefiE3EZ>*dH;g#h(-tMMu?{`E{+N@qmiQ)1 zf$=Ms7K4tyZk2kAT}_1bq6femyjxbreTOlAgauf|OuftTEI$t!kO?tkHqyT~SGV9t z-+l*Pdh^BP(w`=UL!L)euEvaUVA2&Y^lXumylwJYD#45(UI0CpsTmJ1zwsPA^ZZ%3 z_LJMNw)i+b)?@`y5oiU$)+v~mb(FG?1s2A};&n=bZfq<_5nYD_Qe%3Z5y-A5^W6gREH4t7?T;luC#n-seRj`_)R=yCtP3US#U zdql&DsVB#ic`0Vsgdv^}1${6HXD*+DV<%^bsDToT=sH$C7W|4c=Dx>Z8|@Tp4bJHd zY(u3RD!+}$@;5uXuylI~)|S@D%{AfITCs~6DXG^u22U7c6wOn0o%|MeyX2cgO8Ctu z>y%tXLAMHll~Q@*OwLY`u0|z*73<5Rsv+k|LT_8L}i^p6;U!drFiWg{n?Nb}SuIegQiGg@iW4hrQu@ z4weC(mr1CVApaWqOkG$R0q{`Mfs`#;1|Gl|)R()TG^dd%!338@I00u3IokW2=MOUR zsH50PoDOa|byc%EE?sU0AXtz+$JJmzM!E{&QsQhnZ&t*EQy6 zivvLMHOvVpL9FW4{^SJohg>S`Cu>-zzXuZo@{D%2ao*t*IC1(!Cb4a0PNRW}_!+gr z799-7sRF~tVD3VDRZg5d4qyI9Z@}G;m*Do*+tBW&SiJF6El}m@jOU=sh~SQBFEBe{ zRg1pN1{uNo-}_5=`O9C2{>%y4=aR<~C4dHCdJ0GhQ1opLP>NcVJ_zx2X=tho8NW=` zvuKoh2Bgz6x0fJ{j9pI*vn2Ye$|_T_pe@S-cDl^lbqV~l_&~>SYYf=w*;m&?K@tSW z7Xr^V1^Nq`sezb8Ya1Q_{385HPkP}*5?u*H#8f1oF8MIkht8suQ4{pNEAN-Y2 zaQB(1m2wJIreJc1@aZ3lE6-f)d`&%w{XU(yH#H6Co;w4x^Hb^jdvyH6=nCb|Ssg{WS$PVTz#=MvV=y^A%%Dft4U{Hv*k`)m{oQ?TQcB@jf6zA! zy^g5T>BclhAzA*dWTmm=a^dU(b?Q|q9BPxbMeiUK%}rSD+*nzKnPbVz8uU8+l02OP zSGp1K7UvQ!Ca-M%)GXY%dIy&8J%qSlQ3wUp4Jd8QpN$-`h>P}3D7ekYG&mQ4V1MC!ak9C(kcXT^u((W%#xKfD(*estn%h$vYc6u$DIPy=$Mq zOaIa52>25u)>pS52S z4vq)6I5<6nl}As~vB#+l=!%ZPa+KI)3KcN9SMrRw1KfoQDQ5Q`z1saG6ifFO;pEv< z0E0-S!d6CmR}y#k34<^T5AQxCerhJ8nM`59t6z8?R?_qO z@WokeEsacY9R;3^X$X5AN~zI_r@1t_RJ;mO2l$2&qWFw zrZF5yVI89irC9BK(b4Cai=c8vq*6S0Z6TIXXKJXNl+roGELoW<^V~xj0%z!C;~45N&^)4YHA6W}SCQBrq)Xk^pI;!jA54rt&u#<%U z&eeO#TJ6wArHpn6IW!u#{4US>&3u5+;Z8j09mG7H#yaJkQEFXl|l4cDC6%;TVejx9DL~?egUri^kZ1Q^B}D)UeTyX zj_;_45DI)cGpzQvTl*#Ow1$gGgv*gy|Jy#W@2ANsdTLxQQ>Lyw8 zjVIe|)g!ly&YnC$v9QJ40>HtzA2;F7`Zj!$gg>MZfJZzxQsRpyoMn7p*nAto)x9Nu z1Ph7J&r8Wcvfvlw@i zWqf>ZDJg+@QUYXnM9D^}4opl>z|77xtgo#TGtutmE({T2d3?GcZ`G=jRD>|WkgV?@ zo#53slQ(c~0j~b&1~j{ytYFE4yL>Ta$n-R(F0mq}~rjHT>45#42OXp$!%rR0_l+CX> z_G8Y1k{3GANcF`}9y9zE!<3d69no;Z$)OQ8D5oO*jchvT_P>9Z`4>p|M|tei_y~b` z(8YI$ZdP|N6i~!wLH}h9IyRe-51XEuhWhy`Bjwa}hX~za;_=|M2pf$~g>vA=#tYR})sglRExeezpokGk8*uJ zEf6Y^q)>+QbMWj-7h!5<$XR_9ek|`fpJBoUkKNLvRk(ZoQL-$%$zAQksb?1GGKMKO z9?VRzz{`VW^j)C)#kqmEuihoNG9~&noKnubGKb<^L5Y3vUfdDX;<4ZZu*tD9n=$&_ zYpyAL0t)rhYr9gS48idFq3q3Y?qJHX7?z>&=st!x*tf7Zf>E;cnD^M?8r|C1Jn><;qf>V*Uv@b#^X!YJ&p10b-$9 zun?Gp{R*G|%8T&vwaN6%?y#aBc}lpl_dJHL__UOfpqhBr1;+akZoU5wypYy->g;n| z`j+Pol8?fl$%zyW?8IDdRyLnvV5buDfDoKkND;0hyAEeEVFzMVGV?W+%A~n}&h-f%y18a)`uDyE$Ui$nCyel!1Y5tKl|cLycG3>8#&c5-MbLfHW!Hc5W4My`<>aXgM)}2^fE+Sn)7L~Vd4PLu z4wt0=LHPrMk#=NQanTFR23Xje=o%>Q$Cl+$hWQdSrzgz8PC#hPw-66w1d576>VPNI z{m%&n{2~Gy)OFEo+-6=oWdzoQ1(6hZOLjP)Czv{^A`B<`)KsD4x1F%KNWK-;9^9sE zKM6llbgS@JKa22ZmR)lBaqc`;5Bfv6@XBR4b729heg(D9Bff$RT%f_RLKSuY-U>Xt zaUWVN@6hHBhA?cK9t=~=>U|y#5e4z3F7@Wh2233rCKq@MMtkEutDzI&A8_Rlz!ozj zvbCbdf{et=++#|h)G(2(=;Z7q^iycU)eiO6+?bP}p~Sf(t!Nx?0`%(2lt3ma;+S@t zFa$I3_`!-81jtOnp!INRR%&H`r0ul$$s!Dg1Gx0kMawx<+SHUjGL^3V#W$XV_rHHl z08A}Iq#F-+uic`Cr7N#pg1M7(;+cX~gGf-&J59%)JUdSb#gBe^3$~V)nJ*IdB{>+L z!UJ(wIKb5TtU}Q%jY+w@1+RR00R3YN++nEQwQ}Bm@;H%EXm4+iL1ENa!=196%V1BF zb&)qtOJ0XIw^P#=8)bPlWe!CzE%R3u}w|SCTd8Y8U_DEDlJJ#SBZ5;Sw zMp{~t)Bi@vo!?p8g0;u%Nr`PjlU(^hQg+S~Q{LF1@NWc4Vb2D#1v_o|72JG>(#@!O z`KH!Zw~|2^CM7c28KtEZ^wUWRU>Ja?#VEZbQ5vN1`WNp%AvEam6SMLRGij<$^TF#y z2IcwFbFi^Fg1zlsM*emB1`eYbI*JF<A(?lYsb_WDcH8Y#R8Io7B5d#0>0$$oO~7(BfC!*LHFhz86A zkGkPnq#d#io#&79oU+Q2C=_!PAO&6vmtB7c(nrAB4libE*q8XI01yfMbZ=`Du7B^} zGTL8;bMR=c$_8{i-SUqMe@&L()k7E@I|f(2a2aOjX33kWb&R){E;Rrv-7PNSppe@s zT-=11;&*6wttHk8Q}XPo6Df>1EsZW?h52+pxXJc5cjO@fu@+;A>&e3vhA&GGxeeba z+g3^t&H-FQ(GVh&ikNS}6Qmc(MRBy0S7BGEa?Q%tsKAOUfT9j@4#3{VP6~OpfG{^s zxd0sOtZ&eBnmaw8yEh#Zw^Gh09X6dj4*dQ2{v+l=P-tu?+05V+BI|7V{%*eiG0YsF zPS0khBZum#TzUO6JXv}IduxrHDlnJ6W5nORYqv>Jz4CJ}CWSH8NrG0?G205v*u&?) z{1ROINgp14e3$bkO_Xq;EWZXgoF&E?Sjg)96tVOP#d-Dne+4gp^*>35Yl6$aHaC!C z`H4YI14tU0H7RB2*vLdW?X2}eL*CffJ?7I?WNa_D0!xXAhxGUyg2;p-GBgUcANK&B zd*c`2PTGvEJbWDp%1u619(oyy*hQInG(51FIpq0hLX6;a^9t3>sr#?;#>sD} zw&hjHfwqQ`z+?K8eX_2(wCakaQO3S&xzbpQg>47pJNiBhXD~EEk17e?^!zlza*egZJ!(4qus^AJ3dYizFX!l`p7>AAR~TA@kv>0?vy@ZOTN zB@1h@wnL}SkM>5%8+c40q8Vgia&-o436?_#tDIPv0Y4bR+RB=&y>JVZdkM_bS; zv~5RuOrH_i29sF?T9qC^M*)2DXoboxAX9v~d|Y*>qZS!=C)$W7^3*mNHL5n#l7^N0 zl+eQ^?U#g(`l)3TiZb!CfY-nGP1s&v<(MBW7$W?Xyt6ZdFCO9c3%JLtD?Fr!Jh?Cr zuYc(Z3@0a(@b^gppy1cFbnpq46*k5E`1?0t6%&1J+PwSw)F?&pO)WQJSu-vAGsz+$ zKAu{Er5BqzD^cx@T3CDZM3SqT6fCAVp%O@O@BV(UjB%;FqW3}@t^gDTE>_Gs<2k-Z z!5_>{z;v>jI2ovtPDHZyRb}ozHnj|=rU+hZUX;Z9s}Gmq;jR0`?;nJFz(#<%*opNO zYcV3;0w6kYSGe4oj=;as-LBGF?{4kO^}B*{T^r9pW;d|%7>z;-yLRF9`BP%az;Zo! z3XI{KWUbd$H)Ks?W&di7ECev@agef}wD~eOU&~D_z_a>z#+W9Tf@nFO{KEr6eX%BO z0V)#rO&W&=>0CXT@~eyLTDg(*-u?G~02_}N+3iP5<+R*)nDDzpV6T+{jx^@SWZ%h4 z=i#N-pCe0+@qR6BySgFNxqi5~4DY@55z{$IjBat6t7ZRke0@B*@h48ri=|@WM{BD} z=mLIIZ;=M<3_Sv%;G$Y71yfRD{K3-gbosG2= zK{$%F$7itM3lDBRfX&rSc=Ky-!o|P)v!izyWhn4{|KDjc;FEhhN5%A2bq$9k%O!0A|d15HL`J!d^ ziK!R3oP%6y$TU>Bz7c&YMfKXl+wkC{pAhi^q5M3w#DYY`;a}#H=*c*?S(2pFWY4z&cH@0VPT; z8HtL&@!?~e^yG<2_B`Z!ohSx%!Ih67E6+NQJX6rA844jiaf}()P3$0y!DTfGoL}Br z+oH2AoIh!O15BLLN@6To+2hCP8XqT5!x__X?BW|W)RFwgM?bj4D8GJ z@s_$TgBxWOsjG9ICon!BDmRBxi=l@XT4}MYjF*!MNSR=_GqVH6hl6(6=JVuSXfhO0 z;|bx`Qy#!5H^LcVMF1RUJ@&18N zYbKKGz&)Jq{p$C>3$Olze?o?hIwYG$Q22Z4Z0u`ekB!_-HT|#F#nQb&`oIs9}m(^rUg6&)+nk)+(K{o{Si)FZ}(4 z^aDu;M{e*TM<%&Gw|?;NnEa&QNv$NOb%AOx*EevJhv^&$G)f zi9WP|m0cp!{iuK_XQDj zUfW83NBbQtL5Q27-v*=qwpx7b;(=rF9E@ZWB)MfuK|GR*`4dT~YHuUlT_&Zcb?i+I zp`Pf`tUGQm)r}tu?0;tRVZ|xuhf18UZe^wm%w)HBI5kh;f^5QTZnb)>{`43c20cxnpqU=UyNs5GBEg4QUWU zE@2)y;yiXn;E@i16hgQAaN|ecg)3kFx`E&*mjpaew@Uv&C4lo4!6tJ<2K~r@+9;)W z9braQH*Bw$2B)e&$oT`UR#lbt4}dX1$8IwaqYvBMG3Kh=OcvUV9oL+JjskP8)5*jv zJW9b@5eo{oat;x$DWD9^S5UWKdhPCe--F$)El&8={XDG0zza_q$mx7H=I>*|ZvtL? zGYLO+oAoK)uS5Z99PF)kk;hLj5^7uxV|V>7(X0omtY(a8e!PUciKH6kAER6Mc~*s1(FH*6^gsTc7>XG35usDag4Lt~v$7nuI)! z*F{r?R)=@xJVR$tcl;bxex&yU6V!7H$Ki#~UxMrJ-prI<&Aw6LXQk|(&NHCY@k!Hc zZEeER&7Z>j<<|@(X55pggmElcmAua;_X}wEEOKl{<3XDTGF+O_cH z;U}>4$#t5{OMU&WC)C}A@W-RkSjKmTa7bbSo`lPvL*bvNOuupSStUZoDf^h65u6#A zgnd7GA_#J6TfX;JA9BS#=->-BVF%stBxu8rc54NpR#bpTrX7#5fbhxaD1(VahC@dK z$;573uO`7ZeidVLpVzEkU0!}M_6Og zG)0PD`5n@pUr1pQQi5SlfNm);>vXORd|LlN!N=fv|KGiN1CF0M2X1PPo^^1(7^0KH zBcGPA^8VV0I|3c zURx1#DB}-hWAQl_GVq#=O7>n_*d?y2dq&tfsJ#teFp@@@q=Iqw?RUS&ARnqz3)_yA ziQK0FeT47N34sS%{xg>^!o>^oT;fBTu1e!dO<%FQmQJdKjt3u z!ou>50-r~5DPKI5YBF1I(1seZse+(nvGcTHzGjlHthyXR3lIPz! zyb3Z|Sy7}>+S+n=f>ie`=tpvoR9pq~0nCj5l zz)!0$r+@b<93~S|ud6qo%$QC~|G#?HVbWPKm(4#e|iavVX?vXnVpM3)`i?8UL@Z-*zfkxq4nVmfQ20AJ044Gu`lPDM17Mq8Ew|2Z7pyVy`vr;Zb&i>o zrusU)M>3%{BR!q)(Z}z@#>ygv2vj97`fe~@^&{P@GUHEGgCSH?v+&%D=hDJ4vX8j> zY*JB6n{_{F#+{vgY2Zo1FXOh5qmRivLNV1vv(gOgsRw;(OEuSAtU)V8A8SjioXBgV zoJVTC!q@Ml^HDc5SS;*YLLoLiX=u?rmb}}@ zg^Wrdv-mm_fguBk&_$j)K4aaQ5%PCZ`E_~K)`(A$6$%1~>ZR@MC?GD}>&uIauyE!M^ybfVE=<^Zn9#F=e!rzw^X$PC zyw8rwM2$*Mt$S=cd@Q-X2f3*aDfAK2-X#UC1@`L&tt4<@*PW0${Wwaa5yyh zs2BHKnTZjV_x-nS!5%6A;pXESX(LS~jcs=B9@OkPE4LTE@B&OD2cC~c&Ooky@)#c7 zTZB(O_{18f;*nIdUQn>EX!CW@pXkBdnfVMQjhT?L!x0zQS|HSQYjqv=cbg){g)w6A zGGQr5|72Otzw#VR&oS601OWl1&Gh8KQnGN5NLj^Vif``pJqUj3#_jP?%cuWMrL{YG zZh_TEl@pbUWW&#ItZb&WTN2XH_AL_=Qk znGlSG4S_S12D*zrhyD0)=*w~B3RA-i&GXcJl-jSTi|6#l9N z(CA4CvX~6S2^2#65fLX880(TcIA&~m!4E*AxdbW4u0Nui#M&cTux13C7gy)*dvD2x zWSB1{|BlT1AB_7cr$E9#Ou|12mtT7hPM$h$czyyfDS>EuK%=xcKmOqzntxv)j3elZVswE}WcaMxILW3re^G%t{o`MtF38 znW^JLzCXs4VAZ}4pIpBSFT8%49Ll!liVn>SNI#cedKMnsUd+6K>AI0Z?9_z?uI$)= z(=H|Y`syYu-CrT%lJl2N+sp-!_#H#CUO&R~uRjYP{9q57?E(%EN}$lEvr#eLsh_;g zUATMoCouoQYXoiP2}`YE6fhJBp`Z3|E0qWiy+XsY5@`0O%Hh|H-4xLzs zzPk-@*m&^BjHgvq&;}Q?oI_?*01xqlN@AKg#x zmb(6Rr^WH<*54VjjRtij*MI(*vvBFTQ#>+E5pP3iKwC>U*E+={P)w3 zZxeT|w5P7Qy8kloj5U2^h8>|Tu1LA(NLD%82zx!+ zgS$WdJ`eBk+@?ycqT1ot>9QL8@zO0sZM}VJ?itP@^M!(s2(bk)8G!(_=|oA4K?(7ytgP2Q2t9#fN?) zkQ^UQ6jmG;?T1H0JL=e*J~3$%Ux+~$A6_FvKpXCLX9blJgLr#W$0w2k)pA&CHE_;M z$#6{>0;<+r2{|I=EgHI)(8y3wona3$^(pdq(|yK9N?)zI2au--7e7SM(HcvV4l?Cy zZwSJQ#HToHa|MN4fL1}ihrf%jeR^hs`t=1xBZUa|+HgHvq*WtouZGAqLTEeFfS-Bk z84}oIX^l@_n3tRa&qNHdl_V_>WLaNXh2^{Vxy>8*N3zOy(z#ccS4n9Ei}Bf|M%JO3 zxhXhv*_BB? zjR~0>Yfy^Put5Vu(^|})JWk*w#Z6EaICy#V-SM@#iU1jzha=LDO~PgqD2Ztm*0ISq z7D|LRdl4-Ui42nI4j?pcMqnC>Mjh@2h=;M|YDugth1rZUMXy1Z9aw7NTWjm|eJ2*? zC^Oz6|A?$4F=v3+xk3X;84JJyGNSj_me-Qy-bg}zjHt$a%ee(SVweQ;xmTYPC#ua8 zcw{D`Ch<1cHee-r6Q;0e-?ntmAH8!EUi`vyFg-hM926i3%b0}o%!L!w1F`XNQ5b-O zubPSCu3= z>*Sse;druaSfXUX%yDB7&w@ZmDaJ$E@CISXN+&K|bXr-U#M<%66jKnmZu)LyMqa_n ziR4n4G*zs)D59yEX_!B=z~P<%xl|G0Y=!$DKg>NEhQHvonaBFQ?w_C~&WxMbSlxmr z_aE7KapLB~-{^T^n6$SGH$S*bWG?J|IrcdhT+0BL5)v_>1pXi(kstzz|A3J4 zmmf$V!4DG=exL{xNF;Dfh!Y&_#Bn^}vF*0q?(V7{s$5lFx9W~(KKqYyZhOq?pF`6)I zduBoQ1|fB+mc)FSdZwX$c^OBLP@XZEs3k8t7MBqIwu(cz8Fm}9`J7XI*R-bX_u!kq z!+7<`%032ZT&GyCKYHSpNaPvA?bly{S6{tB*$2UUiQbw`-u(3B0>1SJ4@%9yK+-xy zG2I|~Gu`auRDBr97K9pO2BGsB;V?Hw0 z+?mqJPoOC`gQkrwegW9r!5es7g4bDDpvO;7XrZ%!XsY6xLf^*MMP=Nkbz&is!9a9i zd>P?t;L8dk>asZ$>qg>*#9$*TS)iu;rkSTY0bWhlQe2nDI;31s@C=p|z$fnP@VEql zeYw88s5w3FZm1Wn1jmoeEm5GbvWBB0PpHQ&xioLDRwQ>dDfrIkE0n3TQifaQf|yg_eU_udO8UO zvk!S@s;6SN8LM2u{MnrswfuJA2j70J zWE(>h@z4_#-#04ky!*~0NEh=e9H}*CVjg-D3uQkds~Y;ubi~Z!`mH_41|@f+v9bW4 zJvx-pVP~?MEN-Ix3ZdPWQvtQ@x32FP;|!FYCCIxZvv<_BJA85k%kvr6sPj2#39iIQ zG)q6gGX?Q8O!vk-X$f(S>DSk+$iah$vd#Q+_UbXdcIds76En#*>yZX;|7XHweq5*n zLk=F?SC}21a1hwQuhZ8-SK{k;Z?l`OTCSJpKnJGB)VxzxU7beY*YVbvc>*@-FXabj z9@vA>6JI~GnB0&Ae&UG^j?+$_?!zY^JuQKm!CqDn5xJ@@S=bibdi@@;{6G|;`uE{^ zW5HmD4L;YWAAbn#@OhhY0MiBq7wA+JHI7*bVG66t@PO!75{u9 z59k780QlmcdJ87wA)R{BflBC_ln?mr_nwqRb;Le<;t-pXs@x>=SnF?o?-ax(&yA9* zkHcdPzkG+mqgu#FjYSC|-aUr{{27PDCV} zP{T|bh#mO{&N%z9W?;5#O`mGID=tZ4T_w3%gNN*A-g(X9EBEI9AZ|ObHkl2ff0708 z8#^0RHaJ5e@5*k_)|4zGI6ppxqbJV*u2AQvAW$->>m?J&>P{`%l-RwWW3V^eP<^wb z$(S=Zd5&4hs`ei~mW-;iprK|)aPahyuYZ>;V`lsK7Vf-u6NcN{ z1V@K3=qYEt3^qU~PuR=)&ewheMgzH?>Hr+H#uumNM%1+o=$0h#2q{kbK1Ql4>*xZt z2V+}%dp-crNg&NWgPMx&nBvznA%0iZVJG4Na0G4DBLFXo=;{-zt$cm*(K}=a88k(T zt&CQJJBcG%5#|6aUuh_uht)2Li zd8F)k3%P3JE2duGXYzif*==Oq%ufE?1p%!^%_dF=HMa3OX+V~Hgr16MInF4@Y>#Y? zIHereo0hO9fe6QD0>iBxc>C?oPy>ygD@Na9hS_Wm z@4xdH8WcvvnJ9VfB~F!`2}hJBR+>72zf z6O(e3BhO8^wru(-+`M<2y0_F<0Ec{YhMb5_#Lb^d>L0Rh_-d-kWjAlARO-;#(V4+U z>xPp-u0WU3nFyi9dJXHGeeDs~WUW1O1!_0n|1b8MgLUQ)zBYBQVLGk89@d}9(E=d> zey}lkata4e4r@OqRa`6cF&o(0-GLkB+6HM1ZtZQsXgJ~$FgXQbS*z2nDV!b5O4fGl z?pZd?PY9tZB)d;Q|3p8_ScKK=96o;UF_&TrC=wD52Hl-frrdn}F0EBUxT;-U2=M&> zMgE_ZHb{s6;GJ*479Je5NU9D8UN3|)H<86_d9QLaktn~x0nS!S!|+_-`qHujYCwuT z)QF5im;jWW!9?Ty`;>ztZlj3$3svqoNNS?Yt!E#+L!Iov-{?)aW{IXa6!8c{Z$I6ieE980jh+TnUW!V>V zCtTzgv>$%OhTz%BnFy3f%56Q0AZ?5QqY?z-P#UeGf51&i!Eg|jwBL`)Ya*8w_~ROY zA@w!);u@b<-ZL+h+*51rL4~soJSDrVh`$R80teLx&;6W2s8NLV=A9d~`BCtb5RzvL zLIV1>mijDkik*AzaQzwuOd&a|4u8nPOG#Afq15-u{sBDwWMAOp+5H|fPVc;0GQLvo zQ7O=JscWpO7hnTGfJS(KkR^Nk@FU~21R2$8CO3$6)XQadt{xAW$w68ktc09K%|PgS zJ-65w7}TyWtG5s&SZl)MJm6AiGj5X8ZU<%zq9c|dY{5r=_)R%k+bS(CBdQmr{#m;I zDCd3c{#~N@wq@fJ%TM0AcCO$5-ZMBoJmFbCxy39c?Ozhzw^Oe>P%k{D^=9!pOfkwR zi$`{t{^uBsdal2Uz@PoHIAOIkdM+Pskr0xo%zN|R^*RR4H2^3n1;2;sD865|1m`Y) z766TM43ZFjvRFLYnMsk*7lT zR%5y8dkE&f7NpgaIbUkTIb>1oM*BzTiM9#PTW`j4W26_rzqOFBe)DFGxZt? zNC-h*H>R*v)&YUvnn5-6cu_-8-&d3@pnR6YPd_GhtBQc)V4O| z17+LMj8+312C(3XW4#_gLyHNd!-?K|EI!DC^Eeq3ai#G&-2OIC~$;fvE5Q*Egs<3?(m zfIGBbs#6iA&Q!m4gaErZz2Le2nlOk}+A&f;gPfkSYsot+u_U|+%}%mPQoHeRmae|H z^s1x7>>7L0Q^>(afq7lV%tS@BIoR(z@bzXG@$8s;0yb?3`re#rsS^UaAUbn)hPM1( z@LrPBP~+C1WPGN8lpSs(2M?sEGGo#}JUcjnqsK>;I!$M1!)v^}#$99-3OI=OO}jQu z+5FJ{R}{qSN8f!Hw#I5!GoaT(0}$+uU@ssD)EZXm-|6~!<$=_9E(sK=+nCEY1%T}I z>S&RuvyVF1gizUOSXZbz3^n_ecq71!7%gQ!{PcaoC9`C;)GXc*udth2x(w?OQGv++R0ShXy9QJ8)-h_R-m8`!M6w6VW&or$zx_F+3cE1Z1^t<9!90YH+=>vFpM0j`>T1$jkcf0~ zHaBZCf2iW)W?4tH7F$+L4l(u*<{0cfu`RqfM2jdWy=T1c9b-$LJUpa~BRd#0H?GT? z*crp#y&IIK2T`C7=9mOmKlI;azhD+{e(;!Bw45A>eVnY@R$%wROm{TPJu>n1$891@yUDd@XtzP%+q{*rrP_n zxa@+Qs<}kE&wcS#67}RMLLkU5oz8%gMjd?T-KX3jlP)rWAf#?%TV}Aa2-nC$j7T*V zqV!6}N;mFatBSfR8A^t45e_~*5ZSL}CD6E}*cdR(CSBEj6G-it$Z6-`(LSu^bJHBi zGJZ=c`Vs1N0gne9p zJAL{IoX<|A_HViS?4`ZKW)$&?@b=zD{p(AIv)NtB=^V*uVb~LmdjzU-Sa`Hbp z5PWu5>)hb#uv7S>tHh(yninLsB}~%NIPQP$k^gk;XhtD9_b~xIna$+M@@xHs>_kk}DqIVCrUr$d)_z;>9AIh3j7vg zW%`x+>CGRwN5-8r_ZLYky(x%kMw~ZNVu_zX(qp0SrR@3Wl4R!Cd(AqLXz2Av(=C{w z%8Xik89@kOztnr(QskG)&rh%ImYV-Y6)(-v)UR>l6FVGz0rwBMi|aN`xCD3g2DHuu zBspGRaE-VWs$W2=PR$qu(9zd${fhgx?zzHFD_ACFN8Zb|93WxO)IX{!S~&2(XQ$Jj zotS3|wQr$40X?NtEh9`E)fphs?;3NG@6ULOwCP=*Vz_atW>A{7Fr65vmxYW|eeINW z3>aYN#*SpNJf6$o?a%ZSjTVe`y++0Nt2~MX=EcPlW>|uC&Ywbc7}00q_BJtJ$)zgR zz|)6FuI&dyTr}o$@!$`?1Jj{=PrED9cOdS7=O~n`LdZyR_0og8V8kUkhy@yY6eZwuxEQ1JFnx z0QLS@fH9CB9Xi}_z!OakHKml3sl${1DUS;Y*$19SFSA=Of1<*YIL|dXTu-E_QrFOv zX%k4R;1Z}DIGfQ}F$r5tefY97yG-jY27Y>w{i$8kdQJ>_kU-0HKvHGipZyFcLuD^= zic`T&efqL9myr}0i9kCyw&l>2tf#9)s4OGUL?cplTjFu8&QwBBE`JFolOc?^M%7Ba z;dtdIEvG%9ul91K%1@BmNlZ6UfRWvHqZ>W)k7L?( zv0z^Fq|`=le(5g!;nyCNi*wGf;HE-ctCdvlTh-($tbnILLQ==>lx}S_01tzOmSr;^ zK06S#nk~3~XO|Ztok%s+O%fo{S@`7O$odf=>_G$KYm-*UOSZujOeGp_l{gek-wslC zf|jbt!-D)Fa*c>Ld4{&#$fr-Dz^o0k)Kn#72`tI5`JK$-lfgwp_SdU(9rM(q`&9X_ z{=E+NyGf)L0+`@>4i-2w_)#Gv;>IN-!(dCFDdlQ56InJZXx0%~W{&jmQNR-r6f`5# zR7E*b;gVV9dF$FXoFAP@jUV&^tc^Lr){dXhWJ$4wcp`wHL}I3+l0CMqvuFz}sB^7k z0SBLqO2WL5$y5iu@yJVX1u$cI`tb)ax%Vc_7ojR7VNgPKrzUa_sQmrnVp-XMYDObX zLgK;1wJCs@%~|ASAF^OBwOmJZtg~0XqD~p5|CYja0{mIPA@cpBz#s)03on%UQn%Tb zMt_5?Ex3Jam(4aq)y`+ULV_c7qZRQ3{P$7G1m1Z2F5?Es{Gq9t40t=KP>pIrbw9%Q zIVk1CwHtfF<_lF^5m0#IkclPJF#%7M?ZzcoO~>(uBSiQZ)BY7>%~f$%-FLGi-UQt! z!I^VtI;(2Hj#yJW{2nKes_mBO=ivfdE$1{sOWlH1f2aYJYU3{DwML&(JVH;O-#5qX z?|S+=1)l6UB)Lm&R2b~{gG<*9N0D;vi$ImT9&K&2PGSHXQ6?GbQeZ{yz!4LO2-7d{ zTm>#+2C!OmHW4t{2Qn$$mMKqDU67nydqoDh@+MSNVa;I5$v@*v18eR%mS47{rCE*T z>#(e?`!@^|P!Xap5W#UYczk^F(fhD78AxDC=HZB+foS*<=)QN#)j_TbxblFuc`M(C z^(jDg`cViWn=eFT|It~Ay5m9=QkyWQEp~AF_+yGf?B+W#ZgjZ(GHV)t(o7ui>HpeW z_hE!w?#LQ{F8L!y(`>PnQ9h?R%55dfbHU8Vvpb zT0o`0_sobRrygEH)ppQ`V^j`+DW3dLo09rIR${1%NXp|9m}lkl9X;BY%w4U8)yz=U` z>JaN_rg*X(9iMUAM(57b;J_P>bME_Z-Q!V6bU5sF)R%VL^`tN9|MuP%p9b=}xemLD zrFZ8ucR`GHgas*J717RHmbB}joJI)+M>9iq37p{}pw1P^HcRRw;tUF%a{shePk`(_ z08-TfG{+|9J}}jFNd%&E>>@8N*zrg-_!K#qOe-$hD6*$>Z^D_Kf|=!ioqNC8Aj^IV zpbpcOXZ(LmbJCFEh)B>2orD@rv4WvXC)}_6E+`vEaxZ36a>(GGn3>S zs|(E$8Z2x|F6X2aKuyK1asLFy=3@+A^vG=6vT_Jwt|BS=vnt9ekn9-(vrJZAdRDQa zhV}04T|OMupE5un|DccTzG~k}nwB5G_bnKU$ceQiGb459!reB(A*j={vx-bQEY~0u+l$7fPP7$!sXtSfb*S;{t2_p1aPJdKy z9imH+oXnm({^Z~o-h2N^ubx+#Cv3!Eq{mF)-kbMWtWm@`_-oZ249<;~Mw-|F#POJ< zZN_pbUyz-44dup_f1oENDFgB8+?7=G;PF1=`i*0*W1~7_>!-q1ki%@Na`h3kpqEpx zL*HY$WXA{;4nf83Ykj()x(~7S-K+$sr3i77?_=uGVB6gZFW4jtILDe%I9h8ZKxEtG z*;*lKZKhtEhU;QDRsWC!?r4lP|8CW23N8T3{2e>)NXXGLK!si~2;jK2lO`8_cH{wsL_}-2}&vK9a6wYh{FXJD z^G*XXM!NdvDM6@8lVvyI^b}l(!wJ{?>k>xx{)p{&Q4X2IN|o;T^AP~7d_6D0`uNGAC@1l$jLu0aat)XyBjaT!NwG zh0f}pUhi4i{A8y_(qonE!htJTDV4#wWM_7?jW!*r^Kw74clg|T_x0YwRQT6!m%t&;HU=_wpNI~L`hOnwb`IAp8p z`9wzDJd_Iyv3gM&4@H7Owh2}=PeV}s3J+@QY5bLJ7&9#kHbN6`nA*OLYpr1sS2MzK zDA|oX8O6znP2IzfKZNaaXa&ijR^`R!81(31C|PJDzKg=z4TMDGjDe;Ap}ounz>S-| zwN%4QCh8Q*X->0t(EzL~5Ie5tFgtoC#F$tCHn3Um(+r}W9$F}A|DD&a(-bW-Gv zGyoy$57M0d*^!t1@CkhUhYYe=t%MT0>Us)2sOWq5je8KW;X^lokyX&Bc3&emWh&@K zQJHCi2&AH(=)&mHIb?TgmXrU{J{yd{$_Zz(Mu31dE4z;ZYjX2!C%g&TRqq5;1@+%O z)m9XN83`w!Ijd5zgVrWN2s&Q?=7aO^bmV|sUM;hl4pVpqrYf1yD$NAXox&8M)RAlOB=t4YmQ&=PM_dD%x*ae_`L(!{7X`B?N)O*{Nyow{QeW_QKZF6MsdNb zDZ`*-0C!QPWjLag&t%CYOCcqfQg@QENu!_-o_?UXXjr$x66Kv|51*F$?_6Aulk0}( zelllv)v^GygV912;ncJ}tEID3=c;veaA|gOzY9H;;2xe`rvqYJ-aEa4IS6PENZ1K+ zE}~3eP|AUO*GayegLz})uR0E_BRqYmxoZ8Mo1bganYo`rY5%Rgnw>?lV*|19E}s`W z>$9UH5q7Pw)7v7-&QuNrj^|EJXiBhJu_T<(rh3RL?R(WM!Q9C{Zk{({5H;@CuF}f6NFznf+^1Wi4J_qCN+4 zUPa2}&HFb?x!!W0frJ)=`MrID4Yq|a5%uPGtk81&_$hq);2Dn}15Y6AAq=eHs04x6 z?w71omjz|>Pj{z;*3#ZZ)P-1n51T5%Ww$!^L`?wYo%b(ljpoKIw{%w0;84+( zsw0@qeyZvD>}Bxjc5)K~PP2Uqo9(HS|I@0TT);DS~qMOv|5a*M~4h z23JklJ@IW2n>sBCv`*JGEgk)= z-&dakh5t$q315er(#s_`m1$iC#;ue;?_J*#IC5JL(<_?gxo5r_3}*b~;RBeI%=Y49 zF3s}X6R@fMCoxMABz%UxGE>`ga8=y1`3q-(#e&V_4X!Caj_LQs@gZs8sUBVo%~}-A zE|vuo(O|s5kQUf0uiapYZ#@0mMnE{M$@aYu4jGr&lqK>4g=Pd4We+#jQ2|tRx6o$SbaE9jeD&utfsG;i#ib_BpJR zJ*pFvtbo9}h`HfD2=fp+`a9mI$^AQU{-9)9o!WsTT)C@ra780lepRhygENy29At;s z?JwCyXe!VvEA5u9T>}?~XCxP1l^a{>Q@Qb%93slhqza!>2d`&aGQ;T(e~PomM-&u;j1GIQ%z52+G0FyJ$a^&CuJ*plYah*E2O;D5o`oTZ z5czg8fYEdci$y7E<5H~M9DA{65Wnt@#e3|ylmX;x3CT=9K@LHzW>)xG1Xf(}wZcAC zJ21woUbnXI3!tZ1b_*QDg_PmI*yYBwkeiET^U>+A9`up{#Au|dOUMRI|CK6SHsN@0 z8+K915>q59Bcuet=Hl4}T%4CkIx2NjYAc|jTZxPn*Wa^~b9h>A^c{4AQ8Pp#ROm7t zm)E=h=4+`4?6lCe0-<}{Gr zT0?z0!)u5R1bH>kqE2MHO`D))IP3I{yKw&TvvR7<T#F1D1PRoJE8ftX`cTp3=#0!2^Sr=-z=`TeU1xMk*NGSu!l)p#Y`h=kgY~ftRD0 zSG5Q_8j<10bZ48^_vzDP!g1iWjoI@dsxpv~+Nhiy(DMZKDu{K`u>a{Z*t>U=dL=d) z6OO>vjV)N5ot7nofhsz_M1ZRbXX7-K4{$!mX83~=z^)PT30unCGXb%nPn;D?sfT7d zVij$fY|k4ofMTLWWmLv}K``54AS0m|r7YkGdi?a0zMj7M*@x%Yq-Lp^%FQoP={gE< z4!H3b1&OEN@{iGa3!k-RWnkuJcO=tHl|WdKW*{!))8iTa>|OMr54A&UpRjD25z04z z_AY$-;bRIilbszAU#JZr>i(b4E29wc{b<-xN)ZY!GEb&c2N!Y{v?R1O-4-`@^>L?^ zIp&@oe?34uH(>~MT;?9BXTj%Y@Qxja=`{%7o+l6f8ZcXtr41BG24ovv#Y*`)1Q>8{ zgK*}V$Wj;_w%)u4vyUD_H(%5mGgN{PmoUul*M;ZDz^I!)E~Q>p1?j+QL>x=FgjgJw zwEx+GVK$Nm&DgH-4#dDiwJ3wr*Eggb|M_BePH^ZrlFd&uac0#u*pNHFFbzd~wNtcS zZ<8@CtD~=@E#lf$`8?D07y7Z3Vi&V{IW$gSvb*Il{rs5jjA1|W6e?3Gwd$ikui818 z$vzkWo_z8E?tJks951T`Ue@e8cu^R!4MUoIJ2l^VY%mxzI7RvT zNNj01P|Wrpi`uV94cVyeiuNC!&OG|VbZET01D|>Q7J+dZIsNh9qm<3Bmd$+c&JFBI zF)>K$D|9(o%q~a|P*cn(eCrV@2e(e&EgR?}NbPd#)w>kykQv6%NKWGvoYIuka1Y&S zGuvj5OD2LK73!qtm5iA@_y%0V%{A3g^?;8OZ1tp3}1~a~U6FLlz z%Iw>;Xj2s$(NhawV^FSj6#Tuxt%V>IxJH7(_7tYC-XNTPmU^C@dfa9d)61TtRIDj@ zl!*^YXyL)ts85BiJ*d^&U~2+9I05TeM0V#!R}Q4>CHq^@I;Yb+RJOKKcZ0L3A8id~ zoT!;FBmEF-(2f~$OzKAR^O$)KCT+Rar3^r~9ti}r@1T1DZzjO(d_jBd$)ktx=9gPI zrIJ{@gXO?L+3+s%Xp}M!GVdK#Ggr+3s++DtIy>ITdBqp7Wn>tB&0_9IomvEDoF34O zbvW?de{O>~(fK~OLl=O6e^5scwez`-ip~z2Pud%MQwBH$5g_ zk@RY+JhM=T6=NQPYsje{zK%5&4d${AS|+$S%grO9(=Jl*84(esGqVLn)bXGsIinG` z5kru%oNR262ATg^3IYysC(26NQPCC&Weqms){R z&Ron16o-curvBahgvodcDw52rlDe`8{zl3&QmVu!d{1pZEswR~Bmse&f2q=BwK<3> zcS--FfM=o-X@avAztqT(CX4_hu={`g){ZRAVK(G6sQbR#Z79WFSt>jUONS z9e3ZT(a0aImCu=ibfk0mLQWlE_myp(a04lW7 z$PE;yS8Qf6Gc!v{-*LT|*fI(lc5^}xM(TTMW6n@-71gLZc%b)q-McPUVy5f1E zR&b}{sUcX|P{l{9 z&9w@3c9QC=aBXX4s@B~+coz)6h=H&btH-(2^+Lfw)*qG$$S1)KgI41?3RK(ExP1Un z7`tjw=#@~4ag$9zNae>>z6*b6yfxq{NVA|`05!EkzH;*~N(zsMANAxgz?I+GFIm9& z=4arnlrcuDmJCtL_$-Y;n_MA;AxhbmDUy={s`it`dW@uwx{exjUh6-IrX5Anq@thM zy3s*u>=;!fqK=$+oarN`oYJb>Cuw%-9NgA(^-V2D-IZgNzz&sKtyuKzwF!(9&!UaW z(;$YP8Mg2VkJp;dej#);R6)z8&-6RgcW71JrovZ4&%P%0}YESlN<C1hR@%)2A|#AqRoD1)Kb5M5P0}?K7+G48@6h*8NZ^;+p|T2@1ntqfTV)jZ~=QS zR>jUv^f!`ZhSG~lS>jkQp%5+u5=}WGW=u^WlxBm=98dM2XJq5RV!_;l6|Zf9J>=Tp z%N0yq*K@87$?VF^)R_p1`&C{`HlgQ?5JgLtrvpyW18f+Z^JhGn%}j8niW@{Ye6kN; z95H?&>+4DxN#M7RQJN@5!j1kFgZ|d105tX}ceYCl*76q%XKaQ=IeqC#C9SwP+2_SF zj5fA2aLT%w7y`H})HOYMWy$K`5OCl#T3!6g|r zveZ*_y8k?Oim8fl@NG(#7BZYT30scm!NjF6f9|yDmev$>9bhLpnKY&KQole_QtbGf zOOD|glt|YZ!HHFH>KIA^M?sux*;UxVYgH=Cls()Dt}THib&_63Ny*thEtmy8!j}1-b2pr%$#X+4NIYU((b{g*c}fF{!l=PXs=I?LdrrpM z@s?7bp_wnw?JCMo_zBr`Fd|G#;GC%=Rg9He;ht%Be$L{zmeD2asiZWAWCttExKX4ggaP>qT%H0%S&We#M5Cli#I}N3H)he;J4cmL&-x3|yw&;_sxLvR zn;$nKDy7)SPZmojC+_ziJR?nWr1xUbK|XcDjX#^yhz_yVi;KAqEk#j7uj+0&8FLgFTq@r>(4p4 z>1-2ogUBYG9sqZ@tGqb$`~JAw7zha` z5#7-NbmgSEJ|4jrU%dlAaQ_y(b@w`a?#>>Jn%J`}TP+utt*x|QBO5-r`>Nlgao}hK zKl4w%0>>vOeElzJMyXarG;EczQ?(DJevOL5ijL+TYj209N-Z09Om6Hl8!rf^MPa_> z`S!o}5T<+6>UwAF%k12*y& zr_@47C>-rkRB7vt!Ld-w-Tw2Vr`4j%Fw|FYe!*c41aFS@)^HU2vRWN)K&$s_%&fhGBe;I=E^O^(8hO>3x+-!d zVvs%h;1i~m`pw?k@Q&B-)pu337m~xttB51?hWb4ZI!HYxVd$MF>SUCx(yj30s;tAW z-?=Lu&5f9MSj$MXy&Y)AW%qYO7>^@-p=|Qc-zus6bVS|x>pPQ5?2*rgX?;)YZw_0j*BiEa++>#PSg;e=QoRvU< zUIv=}?_8VH$T^E}OV-H%9!8T<2^cd6g%;t~^73c1i_HhB!#f-uJcC;|?v_l!my_b* zDSCpzGR#~p0Q#b!>RT_}a~ywRGel0bMsxwSj=VTMk_^Aj{sQ!K@T5Cyq7O7&;Jz~t!L#zH>uo0iv!uFZ~U`@ne zBgAaT1PLf>CxP*~EO(5~*H6>v#=0|azx68o@SplY_|j)zDVu!{?z_#do7>myl`0Z9 zin{uZzn|`6k^C!ZpVil4=enVYT+;a`)j9hv9(H1{~ z&G2WIz!&iVsR=bbd0U_pn8yXK)Tn6)KOX{k1#0aQOJ7s!hsRR_*fe z_ZDYm<1QA)w4I&KNpL5GzIhz3|IyYM7RLh`2WmqSU;6ZHwpM%giF;Dl%>4)47fV;Ldv^4ZhaQA28x!>WobUV$4a}x+rx=JKAy^JG?;O zur>g(*|dd(h~U_}&Q12<=%f_;3zBP%YpuxJF97KwTv5pI;|{;Z^i$vE}PY6{^uIe1vE8yWUg zb8^-BcN+VeGFtcAHJEj5=($_j3lhj??+b+1p!3;RZo`*8|5~WE5H2>5~j>bgATbWLkBN3RXGCoHHR7` zqz;x*JqJUB9}72tG!5`I$|jpF#O9lf@Fc^PT6lIpnBQ-^c;rU++s$GqYoABt_Ijas+^b);!{N-}`mo$Kg4g7BcqXmySkF}?Pi!N0)m+QB8 zdH*(bQ76c?t_SA1i(GEGF%4Y1cN6wMekdC_nT5BBNA~EIxktqnbVrrdGmSj=J!jFS zSb=`=L zS}4!eEvmYBWFuEpp9VodYRS`%TIcc`ODcasARl<4U@!*|oJg&frzW=p)R<*o&L9$C zLC3$D=d5~9TYvL-($=yry^Qt9W{Zpk>IFsf4|BvZBL{c^gb}LYM!ASvE7L&aPaA4Zl!k&?*$h)a?Vx%-pz4M9}t|_CP3e!$qYY&w=1x+LD_Gr1N{<+ozh@SM9EX3C~z5hFEJ^suu z{x-ANgtu=nZOq4lBl#%U3W7_UL*J-8Y5JdJww+AKmcUfn*CLKQzt4-3=1=yv%57|I z?1%y;c%P|EBau(EUSE+%#&B;+qs1VTB|km{=W&=*wJKZ9MU+*g%OYFvU7Rmqo3c*F z1wlN(NT&b|`CZKC%e67!RlT)fWx(wC7}{pUdcMR{Vg_Kc{!?P1mchV4YHLlvAn@PF zlwN_HG@w23Sp0K185moQ-cXlm%ywL&q+-4+oitVn z>z;p_?=R#v`LQV6gch3d1g5*&J?pUEMiYb1B);ku48)@$oJ3r^bFbX6}syS#L3T^>;cf zmS-$#k|G$}6$D&0-kQMa=`qZx=@)w@GSAD>f;b!hDcqV$u>Inz=bv~IM{ARQf{;piqg)gJw?DdoV< z&Ff_Mg^*DeLltYT;DkE#&z^~>`MzJU3K7n^Cl2|!*Y1@RzHIonJ_BEP^Huo#8}}~( zX%;2DREsp-Br(P-Py0;)A-|L>%^&^0s?Nl(iQWHS{K{7ub730w)#Zpce?4h)PtDz1 zhean{5iYZ5W2i}mpQj7Nc2zPwSmoL&mw#?YjU6P~o4_|QC-faKQ;=R>h+QU_n)^-q z03tx@UpG-!gX%+mMymSp5nOwfS%oI-A|q4! z9}4QUt?a+JApn@`X%dTJY+fW1?5LfoOsuI@so_-6P;`4<_&yDC8PHpAi&C;ue^VO{U$$>3;i*jQKfmA-7Nv-i=TS~-u{8tX|w;p>-ULRrKdX) zpDr#gZR#kFNdEg*o&K8w!ByG7_Y)L0l^E*)Apic5o7STaRcAt|DH)H$ zuqBt?Z;zUD33vk=zNhTUWZ)x~&Nl8uPsXh}9M8}BRGnZDP}qn7Zxjh=V_`fJmff1H zxSlp#VoryH`nJS;2Z2<|gV75749268@l!%}pr%~=QEEGPIRH3pH#Xk5 z`R7bPf{0O+O@$CoL=y!k`}O>CC7P~WjzefCLngPxAe``Qs<`OG7o3PAHS;8WW(8>R z;4?Fc=mbWLj&R1rRY zcIxEOR)Q5!E`Ky6W0pm>vpuEJ+ZR8FoBg%2+3&&bR)5}(la`Av^fvYSV?7u=F95u3 z3Ghe#Z#|<}4=@@8F#Uh$l*9pE$Ssj8ADbTWz;=L%iti^SvHa@2X@9ad0VU0HLvKBXk8FIHyb>c zykb@feBnn3$MXDxNmJ#Sa=2O}d|i@U_8>};w~|;fm`uvfZe`&Kc60)nu)AMioLL= zV(RU)wvCLO2+&hv3DT!noXtfzWaN4bYaphKBkn1jJzFt#Jc_KF^c7a~)F0*vE`)R` zV)*_t0Gq5MHF#MkOo5fMl1iIP#KO@z#8EGccA9{hW~3mN*?5CE{SNhjEjM+A>M5pd zQqft@ebZ6ZX8180H&6|c_(Vta-}!tlM{;L<5RPP>+-#==WAe>w6b-={#8T&v5qcS_ z;HknxZS<%XSDC5Bc!Tlh&xv@^l~QGDz#s_8DW;VmFdD%2jqMTy5{>6-GQe+q9|#tuy!wUTc}JQl z0fr?jTO2dMia=rDb^9y2F{n6cmENt(Y`y*u)w9p~1A0jc8mJD;7w$+Hu)-0~(p3R1yLVEekrN;@(Xezu3tj^HQ$)=$H~|JVLo_^F@& zO)5zc1xFdl3pVzqjr_;)`2YI(Vq`1%-}=^v)O^#KJSI$oogLPiP!7MFg!I*;yz0Pa zqRpis=fs-(`Es_jo@DNzZ(lbUR)yZ+(WO0{Klc!9F4l9Jt|5gEh+BIEy=LSqpX{Az zYbJA;j@BNVUYj_|{P)=hz%pQV0R!|K5P9$*q#%=v70}xnJ*SEtvhSZXMSR;@Ko0mc z%Zpis{W=L}*yL#9Msi?dzy`*Xft+}p;&np8nJ+{o7pkzNHBzMxtk6jBoFcmQLQaaq zAxw9s^1-WuuA;+`?#p-yq4kQjc2YqNx)zx{=FhO!cQ#ynsj9dLjtIA}?}!WQK<3fa z5$Wjk9RAmz{ss6e|M`Cd|MTDfML0cQ!gM;Nw0Qm0zdYjkU*(5t0F1$vSjN)BDT^+vvXCg!Gik{(NKmdyYZVdrdXUW2oIhV_=G>RVg*$Ma8Rm; z!7eT7F+V$lvy#py)8ng-xEAe85Fkfe$^=?wAVM`lV^-G+{{GMZ8vND2_7m`5{f~bS z9y~sR$z(z&o=g^=$rZin@;LKt_)(m9QgF<5q$l--=pAa9*3&xi`NQ zMM|o&L^Pg5sB=}34|j(J^ckViVORPSMV@4>uTcvGuGG+V>z|2&+NiDXF$>u$_kK$D zBsPr)WIoai*cEtDO2HLTd*y#kH6xi!hbAvx*Z9lsFKnP+kenGfck3+ka^?rHc3=*h znt-XZUO*7ZFYw?VN&At*9Xu;526%qPB0nSbH>FuIxL${|+v-@zBB&-*j248mNW~y$ z{ZjEp7T=Aef4?Z(plKo~{~fqIxWticAuHM69j2OqlMDjAWA4 zGCgQdpe268*}<31FPALrb@=L1*fxzVz84DD-E+~K~HQ0 z962b5H4lq*{D(H>VugeoIy_blh)!?->HkpcQ!URq6kqnNN~RgiU;g}}6Vu(= zqES7*iotglM?q}LlZur_n)|1$>PDf$aLa#Zr;M>iDW=q^_(m2#`4uYxB{0ir9PjZp zEUDYPgVTeK#)4NIo%iAO*Y3f8 z@NfQk_;dfl+eR(jv_W6gGk6jB=VjP^>zn$j4Zo>*csbw%_}~BUUxnrI84OTuc+jkg zUW#83ig%2MB?DXvbh~D5Jt~yWvOQZ$7I-i^A$Q_?jbRfMO|^A?DM&_w1M9rJ&d-B! z_X*239J;j$=JafKX?a5joB~J(J9}da04%}KnDVkpwSza24x8NpH;K5Z-r#aEheq7G zaD79lIjAwhn^r(jzKr{#B+hBHu~Hog(5G6lEa z{3P7Eegpo>U;4A~ul>0{Nw!blZ$|LEP5+|rt;2nv#}Rl@R-n+|Z@&Kkp6wrSd3QF0 zb}|)z33qI30LQ~&+?MieE=N!&J=|P1{$&ys+^Gy}>3Ni%kCFoOdZB8DCEzk#Wh?UU zbA|_IJr-hxv5!WB-W=W7tYxh(W*v;T2e2-KhvPR~!-Ep!?!0=d974%74QQPOhShKF zPTXe=058!D)CMVb=ujU+m9_Et=#WKubMZbT2CZsMuJ-_frVHBPj7>!cT3ycMAXtOq z!&UD$^wV^j#i9H0BDrIdCH6H_5Ir1JR?Q5a&C2luL2 z5M6gGK4*Vjau5%&LVQjXVN(o*G-hlV476I=_j>egPu5}el-5o`1!JhsIH$y&yC`d^ zR9<^?*+Y8sbMCM zhlnrkUnN&LC_S!~Ta6M#LnG40usQqz8^<*HDyej)CRq_z3>i z|M?5>@BF9#9sKpb^Rw{a$>GMS!Shb_mub>n6(C;3DR^N?THfcyd#aEMnKx^*6RTLCdkYmN^gFsuO1%klpz)4DjjUx&7 zX1#25j^-Jt4o|_!Kjofb9yixa^~IQV>!TUfW9L(1xHYM@p@Vc|h#`@O<;of(N&{Bt zE@A&W;Rf{XfD%R&RFYV7nW&X0i+%xPOj?PE3qvP_;A$!hc?;Y&k ztLpL7Y022|)SbfL``KTIfA9;x3;)uOei8oiU-&cd+eO4 z!>gVXH}9`}^_{W-&ZR@`0Te)@D`+(k2YSLcwxK8mA7&VqlXi8nFu_ySeGrAy*woGM z7=YIEkFhr)2W|FQ2^mcyj{Z$udwQd{Dlw+-5qbMz{T#xkVhLyoGnsbv4x*TS2*^)JjGn(#Z@0t>qqp`q4Q_ zZyEiKwnvwvW9E_5{6wUZM7Wdced(O0tg197%`1)Q4Bq8e@1v0^uwhs>{>5=3VaT4; zxHetzvy2*;?Crq(=oC^p(U{iU*?Upv8CL9dBj3E;IhVU z=u@FsDLu(v6{Kt@89)*yVAov&)AjAaLBKXxFAUi4EUL~q*0WBbwpUkOr3bQhaQBNY z{oMS7(Q+zjxcG3FH`PG(XR*Vqa^=1|gP#=_P_heAZe%lL^Ak{wf!wo!*5o34CEnhA z#FYdhAaQXzgYnjw(%5YHWEo>3q`I7R2!FjeI+flEOH@}at86;_*+@-E$S%b8r`a)1 zVSexTz6S4n>jQY@)%)-t|66~CCI`qMd|4LYiV-CYOCK3+c&S<;%9Q%7V> zHodXu739Y&NU-AIP2=<>XY0C;@cne1=mqxoNskW99%=&_-E~Y3(r7{%z>qdm(`Rjb zeQ5qFNr3@?K0H2Gi#Exe7A4=hNM2WO zy}Ri(`f6>%Vvs9SB*HRdgr@|mCxt5f$(?B+x1RCdlzi{GjnbGedN8U;y~l zuYQwHJhSnxo#zl#xtL2m%mlDhYS3JhVng+Iq|qJX?#sU~W*Epd^Q%yC2+j=M+^-a- z8~Ruj2)#qg@GQWFBF(S?Z~Mhh!S?Cxu-VvuUzSrIo7Y%k;)d_6;m4bNc6dxbyN9;* z+H6<4c?`yat=fH?D9tYi2T;>9H0veBY@A}OMBXoeh_A%ny>9EMG!e>=lv0zV$e9f! zP!A9<1Vt85h1;lctnZexAw01uW;FHBkd^M?YT@$D?Q28Yte94#n<>|FLSg_#4|;{+ zhMJ1)u!X+$jYQ`1TzG?moU|!74(jX_VWc4lrokJ*ub=EJ#*IcCs*fNm28UAj%>i{% ziQTB65U5JOfQ?GY1o*y>7%Y^6(T9!d3SbS;LH?{Pmyu zb@-3|;*Y|Q|BGLSySJ`=-;~~~#(MMR+)a{abZnv)#LrLstJq# zBLmCA1|5P-*~xOTfYaj>33|D&2wj%%>A^8Q=e2v+YEMAM%OTfRI4fGq`&Xr`9A3Ej znSLI4ibi~c1?gcD`m$v5I0{U<*HkFPHvzL6EGAiW0#8+|u3SbwH+^UZIy~ z`&ntCwm2MDOl_7No+&$cFNoVOnRo`C2q2>n7Yz0U2xaI~acru#4H=TmOW8ma;uuAk zbY03j8eJL8oI+28&M66}vVjiaXm$*LLQ3yd zV4mlp1Fy<5@bv%2cfSYE_V;^?_X^5U5|}`HMG~AyW@i_Ku@44~<}82|ti{=8w1a9? zE0OS8agA=NbZ|9)-QJf3gS0AD9E)fNvKM7^eYHpkL9+kG`?=w?#e?MZ@DyezCtP>0 zufx>YnD^rF2#(5|yMF(MO`#xGS!}%y8%OIe4B~!TDQ?i6NUbIDk))uqu(iLT3Ftr; zs*~1KhaIKF{t?;ZHs(S>gi6I#*H>0BVJ2OK?VA(0C|Sq6Y~YyqeGtYzETn_mNXpa@ zsxN1sD%Ww`3Y}7NSJOr9btcq0Omu4J=!`2&hWm06nb(9Le9+OxAOngJbC9SU09S9R zaRmhv>5h9ZPN^7f+n0b&$X!k*~-Ed?pE zxG#}3t5B)?ukD8sCIMj-29f-_)ZlO0KdOR+%g(ct+;b)uk*%{aec39R01_z9kIF(> zl+DyEjZPe71W4{SSKy_W7Yn%oBGV;xBT;{a2m~?o`VzreGg}(gFJ_!Li` zLQDZJ9+25`vW?8?d@MEPFinUYlB8Y^p?VDh)azAmfH$#>RR>i$>r%R`F3#X|aSlKC za|iHCzx6JB`N#eQ{3k#DBk%>u2wrylw@LB$dBI>-uK7Ruh2L{clM1u#Zw|>g%|)g1 zP!`AMFupz&z>S*@B<=^`DLvhba9%P*6x=|EWIjA9ZEanmK6su0lDAadHwMwX;A}2> zk8~V0mbW(99&g;1h*&&$d>~HE2`*!RoeOIMv2HXR6rM;0U3=T z!?tgaV6wMc7Q=`d8#I+5%5O`V!*D!wkYug5`LV$CKZz2HTL`3(1QqTZcs^?Q%0e$#sR7$Ps(Q+vLP!1Uu+KChkVsJc7MFu zqpRk|&BO;K_%C6;I)tx%^Xu?8f9(&xZ-CFskcj;0|CK*@pO}{D!xuwqYSH$Y1P-o> z&5D$?>nNXhae@v|$%IbHt{!>yNS{TYzjEES_qNE)18LawAPKluo-^7#;%2J?sM@ME zXlhn+A4`^rYliL)Wxg$S{u|{7K($<7ES7L~at<8|ZKj$z+Sj!;A4CyI*BS|v>fvM} zD8baXy;i}??kgUBvKB^G6B9B`>Fh8ky^K!Gb~a}KRizhA1=LH7ar2#BTu+8|(O@lh zWj9mJJ%!i225;g;l4`SGQ@^%E``bto*@CmKoaoEefFRg8ru2V3V&dd&z7m6v0kY?46}RG_sM3SlS_CQ%SLvPPO3^f;R1v(O8$12@C{ZzBWdsRCfS_@^g#x z3t0pWjcu|^3GIq`#9MEI(uby!&;~LuZ%m1EkEg(If9E5(Sgv3^XkXYAeBOwVdy}cB zQcSgExgY=AKm8r~8MPPpnSiq}BT9G{Yxrnpp8PR*-CUFnHZ7aIr7TZ-qmm6!_Lg94 zZ&K>-ITK&9u-%gDSLD1V*r74rzb;?XltN|ViD(Hb0dwHUCLNCrKb#uPj%IR@XzHK) z10=&2k5cx-SELKG7^9@?32qgGy zV!_F1%$QMXIkl=_h!-%G!g>L%y|^j$F!EzXxb+Dvsp zh6c>9K8^;&k~HUJIXy2MPUm{d{5Xq{bn1r7&C$WN?XvkN^xVyOM4$8hCxm%(}PC`@b0%ia80;q@Nx)VeMbVaVEetZRGq$c5(F+tpHb^{9S^Fs9O5fbMTa1| zjY5WFuVWuPbvHuaOQKO_>qZ1q8ck>D^dBPeN8s1!T8*2Z-W{q(VZhFvXcSyA3kz%H zH7N-OgVqHMHw}AP`tMbZ0F`JHIy>8@t*Vy=VR}|QHRf2yIkE1e)b-_*6T1Wx(yiA6 zc-au;J|qcns-sH3AwiwLjU5Hp&w;m$*B zDjDWd5#`ljIK8G6IB*wzczqiNyW?`1#^pMVNh2Ya$5%gk^nJE%@=FB={QST2)pt3_ zMFH_Ra9Ie^p~a&)M6vfoxZFKw9vd?_kIpFwkc52XwSW&)rACua7Gs&hXgmN;K(W7O zGt96CyWl+$0Zx2v3Z3$2%LvMkP0_Bt&uo8RaP}VF^aRKhS6i~^?4lhG@2SwFqR+Jv@+(xzl+ou){N|MTgQ$d zF0NGPj$7t5m`G$R{eo6*s?^l6F-MpP>d?f&d2p@N##>{OMMIGi463wg%Fq7Vho8bf z?|+*-2Jut=B&Pph?wPi^`&0IsEt#T}DCdwSK&V3VtP0Ip+{Mv3Yw5|juJ&c3H3^YQ zOKYQH>8;-D3-&%LH9ZD#z!IsnM(ciVI^xMc!~+I5KdDDmG1o*mm6>EI$$?@kDM>eS z-5bGFdl(K9>!GL{(SAQ$RrPCfRYp?Wpfh^@k>ev4>`=o_Ffa`WDlC*NpoP(PD@Kx8 z(zOj)yYOvy%oLO zYO$1TtP`S&oH~O*K$vEX^X>`P$xSfR$Pg>>$(I}?DTRx-)XT%`viV00sv(3OHpnn| zGzmT|CBPHpMXa6Z>tA2y)c5~= z_TH(-37H+9nW_$K=yBzZbNuXj5Ro)7dMr%={2-95cdCUx_if|fT`vy%FlY*@U?u|m zq?G{GmOKu$zQrXvaATffNI>D4;i{^Zq?MU!g6G=5XlRitHIL`y9XS9c$tXzex8v{Q zQy)CNAVgEAqdIVuPiYhlhM_MJt=9qr3#R|l2r*Zd-eO|*mNg`09B2rv&=;Q6et|Vk zHQmo^>aqTP26ZP2&b1bZFoK^KG4KpdOip)BQdgV?;B;VnYSWJ3-cyj8pNvmJD}95& zCx1BwvEHYYza5DG9K&3(u{A$9fv>;+$qUo`t5W}Ur(wnZ|Lkx4f!JgRS2<+?>i8-u zm_LLD%ou!t2v!#dY1jt2kGNK5$LBoy!>lS+SDeO9&laXTV;GcjKsSGIr@i$eE*!9Aiy0CQkXev;l+bMr#bpxG=f_FRn-Qjy$>`KE3(F>b0X2o&(AD z-WWz(Q&GZcP0dGx9zx;20zJ$S`;Y{Na#y*q)G$W!McuIGUn;=InIoIZA zT^EFSjJ5e$vxlmbYZ7Oh_ERtUuN{=Za7+hhb`pFf2BLtpAR-}YV-pa};4-tnFkLjp z|7XMC;|x~EIaaSo1go9!^)#rOZIYJ`ofe(QfhX}*XQB?CmPo8Pemoi)VG0+favc*K;&Kd_24f^o}xIB2QWL#X(5O<_&d#WrIW zR3?ueyHc)1H}j>_kS=@RATS=n==zjQP6#JJ^KOC5HcW^b-kO%pKju`n)kPgDU4mR` z&tb8DOqvJ3^tJb3>C8qqo&4WV^Y1smUY>7$eyJy%J&OqeJWZ&e9ut$zmgQjikR4q& zXn>8uN;iUAVL{FHfYH5T&lNT+8@bogeTWk5 zOSRPiv0M{@AKI9ZJRkxPC0=#(}!k2N%it&^kcBjKk{uqFoG|4~vOhHN%oxgNq6Xzaw+ zy48){jEfMQeU;ar_kDq&U=*<5t?CE7lyGFJ)>C>CHPpmn-au0p>*&Umy4~d0sGA)7 zAvd;QP)`2XO6j0bZfoQs4goj+DG@{PadLbDA3Qy}lGO9OAh2EvV7Bsi|LN}t3C2N_ zLzVdg_j!BLUe+o|78IhS0*%{t46MbFx8j-Nbq0>A&954+1#C9)OM=wOJW$ zcWR;Q&+zK5O0X^aAjPq1i&0 z)@J=ZXI51>Lig6}q$N0#QZ?Sj$~d&XMG*2*HKMEl4mZ0E@_v%j4G7@0211o5&(asj z4RpBRG4-4@mLBVgq3@4y0XLhH!k?Av%|WLvnL&$VQQAbUl|^(BiT{CA+Z8Mi&+0;o zXhgYyuRnMKZ{5E3!VF+j&F@eD4?lSZ?|l0Mo9ci7#_T3^x!R-WP^JI9E0m6EqvOd# ztQ#OWF%c)vhHLz^WCFO!ha?~)O=~*wk_DhG(q_DXi;I=?;H23Xxim>~TH?Z3ESD9= z=K5SXSvoyD;q@y`Y=iICW|#R}8q}7AX22}E@&EAjhc(oImedqvq`#2$x@@o@^>QM_ zWR<-*9F0mzCT`cjnwLS~?1%-xQqn+6z6X#UNFbOCi`M>9Yjk{L+ji7z0&W1Tx<{;E zlPm%(5Its^G;R2ibPlCowJX#Lts8XBd!Q~@SIB&-^RzFK1nNl6?Ku-u7y zt)veSW$J=p9yHJx-?>5WaeQm9ocufdISCjQZCt9SaECQNE-3Xs$Siw?`|}sS^SzB5 z{HpJ53KaOce(5XUC|TE1nt!tSlk(kz;U(EE$&bpSYnaArGZ#Z|?L_<8Sf>Oe=EArD zTqD>MK<;}5f@TuNq>T|S%p&bw14b5v7ePdG>XA+Pd%{65iK=WatuaK&c$9f5O2y2j9LyWI5|9r zo$ImGz%6)vN(J}eh;Q%aHo(!$Qha_tm8ix^S+&FqqVs@4o9D>&&#v6`HF)xwZoU8Y zl*-jex4{53s4iA=mGHBklOU~2VS~#mFP;9*H^ZR&4YY%ZCRYNgYbE36V5~+z>)^X+ zQ67I7Q%$-Oq69=kb52Qut7ixckdn&;HXx$wDm;~M5(12(jqey`7e!Ge z_dMy;K*f)~+;~z>_&R=S)?lyMnqdqUQXiK!=CDIhDl zY)w_5HkIVChKPe|Y#EY~!~%F$pMqtW?uxeZNHx#0d3qXyGM3%h*@Efr*jRx5)09

lWZa6LyXAsJq!kjc5B&V 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

8uh9gQQ%p7dM38~&_JwRn6$~BRIS8c2 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 Y0I5oHcGL@4)Bpeg07*qoM6N<$g2f+i#Q*>R diff --git a/subsonic/content/contents/code/subsonic-icon.png b/subsonic/content/contents/code/subsonic-icon.png index f3b6553b002417aa6795270b5807a276483aac52..6dda109d90900bd978852e67ada4ed23dd4ace45 100644 GIT binary patch literal 11259 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 ND9ETv*GifO{|^e1n!f-5 literal 12192 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 qchbVK&Y$VR$V~tD=}N8d5xkb(r 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 literal 12932 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 diff --git a/subsonic/content/contents/images/icon.png b/subsonic/content/contents/images/icon.png index f3b6553b002417aa6795270b5807a276483aac52..6dda109d90900bd978852e67ada4ed23dd4ace45 100644 GIT binary patch literal 11259 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 ND9ETv*GifO{|^e1n!f-5 literal 12192 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 qchbVK&Y$VR$V~tD=}N8d5x Date: Fri, 16 May 2014 15:36:12 +0100 Subject: [PATCH 219/597] [synology] Optimize PNG size --- .../contents/code/audiostation-icon.png | Bin 16130 -> 10336 bytes .../content/contents/images/icon.png | Bin 16130 -> 10336 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/synology-audiostation/content/contents/code/audiostation-icon.png b/synology-audiostation/content/contents/code/audiostation-icon.png index 5f5be8bcaaac99bb5ca85a5cca03353f47ca8741..98cc40f023fdf1729ac2f11ad5d91f6f1ae07f60 100644 GIT binary patch delta 10300 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 diff --git a/synology-audiostation/content/contents/images/icon.png b/synology-audiostation/content/contents/images/icon.png index 5f5be8bcaaac99bb5ca85a5cca03353f47ca8741..98cc40f023fdf1729ac2f11ad5d91f6f1ae07f60 100644 GIT binary patch delta 10300 zcmV-CD8tu+e&A4$dw(a-NklXtxwWx*R@{n-RJwx_x--L34a}yFFpGK0T$PZMEoKc zuNNd%Gh;45g9Hcy0Yo4G0Ku%6TLg%#eIRSS_}3ioU8h{P_M`m2bB|)(Jzp>6Zz1%) zu>L;-%+3~jJ6A{Rzp8EQ9i!I~t`{5F>|yIz_ReMRI@LN9z^6gjqgZVK;SnhQUOS=f zAHMNVxb7{ZBY*OR^&dhifB8gp2^BB^`z+D}1F*$VQG)lz04_7Ieoa2W%->|CK7X3p zTRwK{gWVb6i_g4|5|P{w;D12TEO;~3CUSAIH_NMi!haBrIx_$uy!jiGDlP*A^V(w+ z=l_HrnIKO5a1ZN=>m46q6lV4q$7TRkUAPwpF!zW`fCzJ_@^$wy%TF-#SAXMG4{$95 zeDUe`4Tyw3L!gf^lPCvJv4TVnW?4OO?W`veigNNLLTq2ndLZ)2o7q&$1imWpw$`wK zH9mF3kAI2!iYdCxe(q&mY37MA4yz6XXMhNT1OzouP@>pJ0+N}3U$Xqvhi?7z;eY|Y z@XY%t0se?UA7+Li5@1%yRU3+BpzF_$0mzdGog{=sNQy{@8r2Zf`7uW5%mo~k3E@oV zja7UDpkT^`BZ&I0I%MNWs5csR?vpf{^gG-Zp&3HQV8`AA8mV zv&*7vv%hL$TI7gfU;O*~YSchSQ_%yC6tM;$M`j+p(1zaMx{o(oFh|Iw1bzVN(BID5hlq-d>)ZsS&M%ItUu(9z=ZagItfK5jVGj znb>)|s}eX6@ZrAjJe$bzcc>HfF7dlDLw6D1i;4|t#G1C2#Jsnq=-N~e-pq`t0DmA= z4yj}zrJ1z=B@h(@K$iF|Za|%ASz9&|EHCRGkaQcD5M0&uqg!`@{iwMf`?97Z;_roEap~6^ zkc=PeKcNe*bIz=H!W#sGZzvB_b%;M|k9M;Je4@iSw{G5XOx!Vd*@g&VP!Y~&l+Hh{ zWuzE7@I`w}ZS~@C?xZBS#>L$6oSK1_Dz9ijgd0+&cpia33@Ck3vfwz^xqnW`;(%IY z&&J!wY{ajxQlcl5^HSt&W9vM!p3*v!ERoM~1<;Fm>LYxh#?<6`jMCW$01x4Ftw~&O z0n}eRJXUGp#9+nq1b`&U-#iL9SM%UK_*r`J1;hr^x0^Xi5PQE5?&|)F0>ZAu=dRCN zKPH{PW6T_7$42aQZtZv)?SDLwRxd{`N4oYnJD@C>xiu1i!O>Y>fVA)gb5sc4TwoWI z6yZRab9!gyIKy&aEpV{U2Vfj93`e4V-PT=Iia?ddeGcWh@qNmylQ2PxPAIqwZ+1ei z9R`#=bj{!nHh5I~Mz)9Gjrr^e?_vN?PIM$bBJbGCY#+_oa~B}qU4PZ3Z0UWaO}`?v zOeo!LtOGfS%-Ql$T{F<$Z?08o=t^Sf{mwdD_l#?PqxXFb;QIx+iZ6srKwXF37uy_D z1Kf*AXvh3}H34J3{@$EEU9Br+{!YVLMIHpRP%T-uIolpLE(1}937mCLm9Vz=OQ!MH ztNVG%fl+NkWV`DSrhk}k_Z(bR+*_EqHXbrM6VJEl>*w$&iSIpEYCBAPHQ>y00*J|V z#`NsdXG^QchS*{(J5RvJ3C_0e7@*^9r{4G>3@ou1H;4nYU^|BvLY`L&um;i!gklu;!1GG41Vy?>?>U2KW_+dPC!LA%gIq)CDLf~F>jq76S5v5^ql`YzX zYg%_y)={p+aFH-k%=Tv|`p@8+i9Q-YSQE(Qh*V(9DMVb8QWi=Bw#~8#!sn=|?fC@Q zbD(vU2Cla=t$%a&m|0FVpx?qBHj%3J$k~5 z(3I=Yy1I))x@m8iqR5- zm_B$7es*kA5eyUhxygRiFh=1=?m7`IiVb>V5O3YW6REj4Y4@x(i%IKh#H0WmflVMo ze~-ZN^Ng4`$r`SU7?xCV2v*iAg;R_bz^V_B;YgK`DhilUOwUdfdJ8ew-XR zif4EI6Mr`DeGF}N3L+H{f(nld`wGg>C-hZ9=tDTGfSS!f>{>;IAHWuuni`C1@>(jv z_Op`-2aq)~Wb|<Ghr6&<0`n_|! zAjB2ry;FxPIk2Dst;;Kwpq(~sxq+Qny*=BBtQl>)bd^>U{wsOzU(c-+n2W3j)jHk` z9vLja=UMk_XNr;x*_M!P;F_t|JLgU6n}#>8dM{SYxdRWs_*EPm-h-r(XlYQ2%DPPA z5P$WDDPnc*;#fe)t|@SXmx3Kfg3BR(AXV8HvGU&I>wwZJ%(g(X^-pD!vKNx!NYF+f zqrB~f9!C5eFchoeIjSG`@Kffz*nbQt#gI}V%W_Qbn~#b8Q=>Rz;j|U_wL5+X%V+#N zvJr_qmrzndDFvkvjGgkv+#XMNoWgZ5M}NcHeh!pr+I6fyh3 z#R@W)$l5s;&0W#4-k_1R z@a7xt$Fyy8@YuGsPz_mN11jFJlm>M(7J-G}yMwz0lRWE#4I`&9yM{I8d=6{** zAMl+%V73B=24Ik-W=g$idml?P)JFd0wWFYqEheRIxW5*b-|KWs*ZGUje0ckrWez;FC+E|pRQ~6&0z{{t#f$vYmIg9!_1~9wI*`Mb*mQ7!QG=FW5>gu;G zdOc1LAID?czXc{nk_bSsE6)OO7^3^IFtt839K-_j@u@9-*cR1XX6afXUz-WoLi$?Q zS2nui)w5=vW&(oADn=Dybe#rn-3P;XjZBR|IV*_Z#Q^QVmR&2*J5$u9finQ5BxEkp zZfCe|_6?EPKzCWNX4%`Y_kZ{fY(2UTXaXVySlCL;KD8%KDoP^0(2y(oP#?T|4^I z$5rP!zhb{sj67FpP(K#UTya)1CJ`y#e%o)N4-=8Kb4Y2%!WmoTj(@YUdi=3PSUA@zm|V%i0+>253sVMXpnIx${MSrc_@x`)57}nqnS|0z;EWgG z5YUW+{eH0a+q5uber#mW(x`zm&-2qy(1ULdP=*gYYXrS9zbv zWDDE)fXVR)R(OKR4Yt@y!9(G`r7&7^Fzo!Hc}*(Fym0?sJ9iZlk)CzR8NgUN=T{mf<_g!(d(}A*zgPqbynfZMV#_~2 zi!5uSLBdOB^}$^{%`ET%)aDV`k{L*gh69#wUgz);`T4h2)~-KyfB1sE(v7LSwtBCTg1jpQqgobT1hE+8}#ueNJlCh{$@LrmIrr51zke|QBo<7+9<4?n&d0(4Ubo`y z7#YcsXA&$+@Q1)%uHexE76`Om#I{>Ga(oG-(=rp7wb-e|xt=+pI1jUM*b2Hh?v^T{ zgo8|f+u$MJ{35qPAYMP@C51U|;;^!)J}}(7BS^Vod&Cm=ycnpOuC_6t`$k?)161JUnE17!gQQ5~;1K>UssV4-z$ z3>=fsN2cZ+1jwBOR2w2yw%E5c8S79#2iAiMuG{e4R`+`m$Ws_*VI$-fEkf5vtOA$~xYk?W)rK_EENjB>wZAK=I?)auAil zpCz+zfe@)DeSm{U4`AoPm+{o5M=ORO&9A>P0ZV4yj65r>3}xd03o|L*2+GG%A&n4( zm|ZMYIf5*)XK{h+5YpmBMfR!C3FJ5_fPYZ@t59S^d8(ikcdAZIyN(ic5$(NFB6hA+ z44D@Wpe1uwBi2`7}2JW~^F#>!|OwaK>^ZXhCK-T~5lZ|iXv zH<)rV1Wae_V=J-5vle_dI-81sGJpCfGlgp=EyBe9$pJf^8ajcUhh9RnKY@~rCti32 zs}|ofYId8{KLyhV=HbA|b|eZAN`NUA>h<)zAM^p@1-0xRC!AylCtWB^`%#aR8CPoGA;7drFN15aNJ9&wDhpb-j=0%nRsfpsyc7 zQ_MBBf&h<=5rBw^=IU4F=pl}pZ-|<9Y?+2}6EJqoDiT;l`f40M(c_B0Wv-xd#Bv9o9gDgxI zn)E(Rxx@f$#n)Z&>zGX1jx)g-t}26UykJ-DxUm6)5$yBGy1z*Xu~NLrcWapEsghIR zi+`@q4;+R2w($NH0B}nGY|NZAH_-n|No?Ht6dKJGjg|m2&{Qe@`G5I;z-w=O3;LS< zqf!I&r!GO3yW#u7om?2!M%~G}6Cb){4*FHV9D;SOh zi1!9?vvK`mjWP^uXXY0PoQ}kBl1(j1V^s<}uBK9dlP@d0NL5fd? zk|2ahzOL^;>Q@~3nL?IJ+3GkhIM5Gl+4Xfgzh=L0X9Dp=kw``h>fD})WxuEzS1`Kz z0)lL#ZpW#@``4FDz=9b|0@OwTp5OL3(nbQ20wSg2*A!?p1rD9siyuDoZA6h{%`X)x z1{xC!0P4S|ihuZ7lt(|y2fz^@fQDqw5V(+5e;j7SCQ0AaEkW##ep{5)6^(4_^?2i6Ih(NC`=c(CkmK zao11r@Y8>XH@*5DJ=~j+ibh3v!DV}%&;p3}EPwQqS-j@9RwISfF1}>1$S17wwcNyZ z_6}P)0r2t(;T3UMmAw=zz^T6RX1CZWr9j#eNc$43eeBD)Ztf~9oxidx_Ys7aLfR4`drrpt7S$6U zZhuaowLv&MQi%vV6BY6FZ%=%?YQ&AC1)0G59!ka1%ehh+%FF64)k7iDl}5?t$5MI6 zu)ar~w2cGF@?Df<?GghM6XazXo$ccm4d+e2B_KPB!vwT(nMU#kBAZ;aR_NS1d zjnA+B&p3MOa90dc>VK2U9TVyCv1bQ>n}6V&VgyaEh3j2I)WZfZVi@z%Ro*!jdI${@ zr~v6hq1GyZ%@E3%WO=5LwK zNttLVNP{n3ZyN8hDso1iXDev z#Q$FVU-8j77^1*e!d={npre+^d5xgFC6XY~}_%YRjd-AA`$ z!`{cSY2TAL(LP)tbRi1oO4-9F;womTATxPVd})`L5syR?IFv*@3xI`8<=vWd1d5dSwW41 z27$_I4X2zWP@C9sCV(Bx^?xOXT{pmfZoXgGVb|Sj9V{7w6RezlJ6^l=ZMbIY5+~8J zms-3;q*yq885T{y9^H@o=K>djwC42op?!t@m&FAQDjFA3zi#JmaD z;osbRKdzm=vi!se&Nc;~!Dy!axOKtnuzKDdcyjy0czE+SkjW7wsW7Uc%umoEU?myL z=iM5;?{nLqD0II@|9_z9_fiaY0ze5NX%rSgX~G>owGW^DtN(y|f8qVO`;K4Hrk})6 z`y~2WsTDi%C9UfM4v5c@`X)Axp>j#xPUvhkbcjXp$TL;k-d|4Tj-4qIHMp#riM{jq8-%tSs21Xw=!o8B$ILPZ6Cp^ zdAIj0=FgTBCV%x$!+o#$1irKW>-h1GhYCM_BD4x9QnMG&Ux`NA44&iU=@WS6&`U@L zsIvX5xI4nH9r^mMkOTxqQtV9_qCwblXgxmjx4(_0*Q`X+NMJtr$)R0eC-Q5=eh?Ba z8Nk-_K`EG(3kauZlOi97qN)`h0xHb(fXpN}}4S}jPZ|OrL zcA0={qFWtMrB zyS$3kOZV$<4C3GZ+=qb-xM|_fMQigm?SFg@8Mn3gFU(!@{B~;@-KxfEO{2m#Id+B) zaoIKrWO?oEwmIyLc^D3_X|rRUV`p}!zGdl)cQ^N+gHHxnA04wqTi6nUn5tNT${5HA z@3`$Z#>C9GXVJo$OYz2=?!h%P76;F!SYiFnCyVT#M1wi2Pi~N~+40kP9QTfPRDU4# zy1w(Q_uAaX`~Y^1KY3ZeomB$DB2OoWz`C(25O&^{SUKx zI5RSYEqh;p=+|N!48`PyuDgBI8F2z~XSU(mdyJ0wzFQ^bs58OB?H<^xW;UDV&oOM^ z?l%!XDHWgyZ&-N`1Ozbl=np|j^nbaw?%9Mh`6&!0{l$AxFC?#T;7wj+^!Uy#2 zBmod-gFqTMj9{nc*DwOKe_v(_*Gyc7YiBJVQ{ulDbMfh|k0NcPE<&$KFOGHl>;?{d zoAH(_hcRm62NIwcy%@M;eMTr>l3G$MjD4*pfQ^s5^0^Q^4uQ(jAaU6s;>zngK?JM{w(+HBgt)><56o zM|NTViCt(;5C!_zNV=BDvGoq$ROY~w=O4>8$Ba&;_|KO1J_K%`ALq;A5laD9d$y{> zmQtA1nuZw@XJ1ycp8#yy`F|{!Bq$LE{dbvd-2iTPtAT5dJGWUM`EX?KK{ww$T!#%D zQ>SdOoHG{9xPBC0xE(vobK9S&^8QQRucCUGy8_!#f7cMclb%0o;@4n+QD#g7yF z$!l${ia7h^f$5js?B98CD~=5vLjUBJM*s0|Er#@Abo$E`^PP`E&tS7x;U6&rdyrl| z-~;PIW$!?%$#Q>V0GAa20I*@ly5bWriO{%)qGJ`)`DbGhber+#I_q5(a2|=lemfRF zcbyqT$z?VFnHlR}d4EzTXp~vSp?>a881AAHx=`vo5I!bNQnz&Y{4s(H6irThmW^Ci z65!~`L)dj>JNhOyt?(?Io{8NIu1;>^UPS$QBYfm)X(XNeJl(>mf+`7u2`A5-xU3|= z^V^@&$sa}VhoiH<#(U4b>EU`4?82a>4xYgCf4j=$BLyPhz<=>Q&bNZbwEeHMf6|7~ z(LdJqe|NuqZ$!Tsv%RY)(8X;RMvO_q8Xn?De+ap%+EMA!c72w?5;{s=o&nIX~r_V1T!5f_L0x>Q;a z8jU6%-~7lZT}~H&85%x?r?xx_kqVvu)v2JgGr`9i(H#bGKPr5IW>cBum=yJK&un`f zC(j(msM}~>#NVc!&tdJ|XH_KgYjfa(~ICoAtNw>%}kB9f?TiyAzI` zIfAENdUQ;yfbT!^cSQkdV#&#xgX=#!F*aY$elBs*WKC5eE08nZx437+r$=SbU z_ajODyBw0X$my@8d&?pmvQL${xLQCA9?oM*mm$GBrQ?2ek~c` z3R-OGbx~i9sK5Y8TJ+N8gz=^C{7+&I8-9_VEXiwuBb{MgCv)ner=exwsgB zbSKS5(J7+K7q6$km%-5S19dcv4D#x z1)2h>ELy4lXv0I8)HfCPyzaf1WDt%I9mnU_ehSA%4xu$6McPVq@4qX1_FsGk&}~>m zQe+6FEdeDHuwwlElV3xcH1Nx7-gQwQ>EzG}{I9j2#x7&?Z>)<1%SNB3dryp`y0 z4xF#s;^keN@JHYJG#-2L2cRa<98A&ZPmz|QU#ET(aK+C4G-;SIdC!;DQ~}}P?99bB zNKGHxyr>(@M-;MQiTsR2dsqTFm{s4I$351+!u?a$)7Pk*h& zrrpn?)z?JYUwqst?JG>u#On8dB@-V2`Wgc<1^|Y$p-bVFFiE4it{-d{j39@Lf7>G& zgi0`X+C1F6_%&F*@FpyrwHT8ICnHT8NJU!J=jVBbcHYL};|H;2_aA$s|FH)ghy;leEeFjLaM3+m7 zdk6sQwkskbO*n>X64IQZG6k74RGvWP1(TeX$8q}faquaa-ovE(^fw8uq<>L(^U{I| zM5FLRij<75zsiUYkIw0sh-Nvt76c?fq8ULY1R)vR6vc-WrI8X&`}E4USu}4FLgydo zA8Dcsp~Zc-uHjekQd1o~M#7pDX9UyBAMU@AFU64Mb}qVuTmN3ggpbiW9lLVMFajmT z7s!#Y^U1TYdv<7IR-Y}p%74Us&n6*-l6cH9g3(*1-%#*TsGzcyt`=X;*$!z$0$e5o zW_KE91+GBjKNSsQ=`nvplH5rE zaQ|2CTtR~Vg&8veK!34BF0=7LyMmT9X;xofC&C^u);w_EqdQUnpj^Jljr0>F=ug2& z5=wQFI_4I@`@Vc? zVtpi#Gw@l?)$cy=>;G>g$^ZcHfxmnmDT((A!e^KiF386RijZ#?jxM>*gd zfBE3w+y>PiSVAN|2H+k5v&U!rWl8wG4E_c)f9}uT^XSf6!BMw-@Nd?T8c7xiL3cCb zE)sMDGtU8IA~k^K_z;h&WrPT)K(vZ7sv0|fYAd)Mh}!m7~L>Hq`O7B1VKOqX+}s$NrTi>LOK)?>2P#QBQ4#H z)XVSvU>znova+k7Yc?9Dx+(;dI2y$I@?u-b9I zJxRtv|D6Mf17%E?_}ar{aAel!F2rL}3T2kiyBAr4@a2{m%21L?v9&7cwVi<7MuRaq zdF&*DthC0+v$pu9*rmrnS@FxC3LkZEsLa%F<3AB)#1HrtsZIE#{VcWE*PWPHv)KGM zb*1(v(Acdglc(Xg+5M*93ipeAdzR9CyO(+!?YjTU6z8X1svPv{2br860?#o#&GICP zRK=~;ODW9NhbbS2kS6&(sbdwy5l^~kH^&mHPsenIo{vdv*6>%~)KnFd{N7r|98~M1 zJjl!{*L<%rv|3VUNLlr$q>o=}uBP+52Gg=et`{*qerI0w@=Ch6*FdnxVwRZbK!V5L zEb%j{3ItvZc*)9IP}}BLI=@%U;z)0Ri@M*77@8N@tg1r%W1J9nGucq3iq?{v{nFls z=xnBpfVy5+)g!Uhc{lAZ>(*GCBVN1vm;|yROkcgSUH4VA87}Zc(-Rm5;81_yUkXmk z0u*3D>;p*HV;l^O16Y;0Sp`sfs?M<@sf3scQW2nX_SDn3O! z3a*)}-+o+|$D_pvO7Tu0e@r1QUfJ8+`mftqd)sHAj@1^;vnKFKEy_&391|nY&55>6B{x$1k%g+j zVJi`?cxA$A(i(7Lj62eu{4!-nG`*4D$QbX%MI6r}IU5UJAdQlz-P^DZY!2g4wEw#~OG$ilD&K>(s{JKh?3wWhdtcrALs{#z0NcRDx4%sge#;89k-YeChn+svqFJim!TZhGUsJGYKHO)1B3SA^~UXkq5rQTj~w}RvLs*3-)bR~?0OhBBglHQxs>pIc26$tE>x|2hPnb+7 z_gFD9sEO z1lIx!e!%adbA6>|Sf5PV)#KK;$z-cpU^DHTsmB?CKePM9{+J6>QdzP^vKV|FsHEft z^N8bxOsy$D__aJmu0|CpIe2I@$o%8pGsM)(PhtrTT~YO@g}zgYK{vDau*x*=)2$wk z;ubqXhpsfUBD)1n_<;cN$8SP{YMi#ET&6Ye2)Q@-b7lhi`FFjusy<7Pp2Bu|kHw*^ zxdO|JKg62y;p}R%ode=LfkpAcO|==z`8nfPjBI$+e+cL`mw0VIZhKts#!Sks^;4)* zA^FK|upjs%T=x+w0T^}&nsJ!hS7iA${z<&~05JhjO#!H*Dfzc(fEEY|Be=K)~ZCY?$0G5}B= zxKRc|rd)w^ui`R8NYc75sXNiwCAmI2Z|*}YfY?(HQJ0>20$Kn)CD6>ULzT2R^57Pd z06*_#wF;oB2p7($9EOqk`QaUS2o!6&pNuvxF97t&xsj`Z-fko9D5y}swyRPWSb6Z1 zQ;iKnP{Iq?ZJgEgc`m;n+mL2O zr(L8k@1H_cvV;sy$Q>K6sPU&vk&f6#Kh z5cPFQjn6w_&O$x&FmdjS$3xgtiS=`7;{XW;DCU+r^gGz3M=**iy@FkVO|p-cMu(sW z8q7-+?1Vu+)`!e5Ec|4YsuLV*AM`d%wH&WclJ;wJ;7-c<_QdYyk3)0GCy$=2>jUJE zmF+ikA2wU_B{!U&k8gzS9cg}!$<<8kW`9~#kcEW7KZa%5a(;9(^dV%(VsX6J8yAcq zBU#OrbCg)_xff+OC7>qPDxNBsT;oyRk>H)&cvKEqdc2O)vxIBJ0%}z(O{4ZJQD@^X z(SB-BK6|P(lo5irt&>Q9 zGCFpqZOHVkF8e3;7c%zrI{)IBp6ZGS$1;Zlcq9#Yqd~w{Cj+p6vX;}P0PsSd1Mu|v zP&C_P1sEw#EOErgl{GnZk9AXUwe69g@2V0QbyPnK0+RHbF0d$@z(NX8q@9ekef7-p zE!77fLUvdou|`r{ZJ0K0T+%%y5~ze+BE11(`=N^9?|!LYATio0B!TC*kXgZplS9wk z?%U=H-z}h6L{zSz0gAiT#}?~j3(ZSez!6aTYlKsVN1b3tP43oZn=_oK)}=fKq~zAf zQ3hSvOyo>e2Q+JmlE!r#aK99{7Y$6hklvpC>2vgVmIh2sh7IQz$cUfWi!{5TnN5?E zqS3>8-S7Ks6eHf48GJs9|4+`MAbT4_pf*^L^}HlQi*JLoF~4&fPipM|0PvPt)f+4U z6jkLN52)g!!9&YxXvBSB5r%{g!+v1?NJC_xZ-^AW9bC7gx&QcsQ7WsH=OcjS$SeVx zqMr{8U_Aij@3=uSxo#Seq-TZ@ko=VsUTZ1}6f8c}S z9=kCh$`F1lXZw=$3)oU>#JS_@g95e}F01W=zMbbUR@*6kZ3LJk<_rS_Gss#8qxMs7 z2Bb2+)1*;k!^{( zH!#fAl;w|wWConnX~|%1JUGrOek(uXPxm>KO%n+7`e;AS(fL*JJ35=cDI^c;$>bOA{dtZ;fmxy>_W9wf)y*ow+_{Jl6R8_*N}53~w{*!6_`4L89ak_YI5|Vr zvKYkqSXgYe7=#ehtfIB-w^kHubwZ!SAil5^2ipf1;e9nBk(zRH!y7|jkns0DLhaoZ z#EVpIq6uR-Qw-Ysu8Z+zbl80iVZsh>VSP_ll1cT#>!7LQL*j19X%l;f{`U>b8HqtS z8G#fMc5mz4ayNYW zVH$lfRS&Pw88PuEmS8a=$~}1xcXeaa@7FBOWB#_6+mvRutBb@_fp+CrTNbiig%@vt6*yp9K2F^^jptYEnZmX(PL&8Wyehpn}bew{3=Q>MtlIfj8f22 z8w+bMGr)rYZeiJ(a_Jx%C^3{CS;X3i7qXEK7gk_@k$+4F%~B6Xn&Kb;oDigvoMpya zZSpVjsD)^x+auDhvO!rdx?xfcQTaNh+Y4k6c2PZ}f!)BoDUcqx>K$db_>-E=$CvDQ zDQHV8Cx-VmUV(jt--3%|DsIAs9-ef^j~yJt(RBR|JZ8_vxQWpG&Dp+I)pO^9AOJr2 zTxx9Ao6vQGe@0;ETiQ_G1FV=+Uoe}%eO)N&A%Jp&-7%*EumJ03vAP#2seZ@w)!Mf}+;Krt%j!@LsHg8ZqonGE#T@eaxH=RxO>(b))LL!r-uG7d#SA z4t)Cs#=&`y?DakO-f$8K9>mKTu|Hh}OV>0ef!?L=mIVZ=u05}Rg#;oK7%;&%Jz9t!52TzH7UFmx2aNNT#lTM0?q?5rK>mpp=Z?dF|;4_HD$_BZPLuY`e@s7K{(Yij?Qff2x z?K^!Y`SGC7TqH6)V$TsqdUsN#jU)g`2(OqxkzbxeLlEiR8Bw2T!-CPe&zUWSp&`hA zFtZ3Tq?MB%%Jgm$^_Xtw^vLR!n|pL%++y{vcJYe!qe1i0Cz=+2xbFsb9Y0=sd-Wuh zVK8NQ#&Vqz9)Px|Th2hT`8XF8Utqoa{WHB|0+KJfu8da&tAtw@tMJLEi86TDG+Z9~ zX$62=8FwSW2nABqq#8__O7eL*tpcYH+ER8pSb5d^TZ#t&E_kLW22EtvBkz06p5V(m zpNdMAi$ti)31bSDVtlxYaTH^!?&cwU~6uuvh%uv!Q78D;WJI1P%cCh=;`m^mvd65TFRh zI4S`lgfKB5WFDB1hl+gZ#bSknWiIB*#+qU9^!(rN_96jy*Tk5)uv@{p#%5%a$;h7O zd~eDNcDs)7aRFa^W|ZR`8M7g8FkB&))w;M!F@|P~zxX~I%?7U2N73W13&p+P3f?MO z8!jSJj1i~n3&D6eg$dIjPMe4V57G`|C~Nn32Z{fjSd#?@ zCsFfmm$WCzfLIj2$ss{oo!u<0W`5_1nhpRs?%_N;YHW!65ULj0gd9iiv z*SOgAZoK_)Js)uP$82jRD3JS?k_W5b1M44@*lm~SA5-a8TbXYkDmt5Gjrn)vFv9sh z6!9H*`Y7(Lf26Hg6&-rWL{zaMemBs$-Y2HPd4>YE4rVkzzc%d(-2v4kK<89STSdo! zDiD0#&`E54Y)%@<0xi(kdCuhcSy^CAGbL2@eW<5v2%$palD_Rk zQ0M|C(?|^Ezz>@$@U~9H%SX+=WtqwF=fF*KjS{doRigP>UDFVFJz_@36t;?0+Ux2% z*|9sn-|;dnDud5K%KF`;KvT?D+QG?o@IR#W8@-cX7mo*jOGcXO9(#2S_l6mKAl zowHH@9KQVp3<_a5v4zWNn?Q$#_RRpRG%!dFERp|YhYgB{=R&q*SyZ*&0S-oPgCT}b zcTd5P=WT&t1zt-e4mA0#6@?Y_`Jo&UI9MAL0{=jW41D)2(>Z7)_+dt+q}&r1C%y+p ztXiJ}|(ZldEg{g5#?V zkW6#pOdFhvK>_cds&;8ZK4Dt#qnUp`AO(P@8DdJH-=)j&xKJ$w zb?*QG8q$WL`q;?TDZgNVOC-Mw@;4`cWx)I+8v@fuw?x_FQW3>eH{5r&8ELic{*%kG z?A4)m`cp(8XwSI+#t#I{c;7Cc~_ zcXgM-`YuFY;|t7x(2CE%V2@TQXg{tBcm5of$8)LpOxw`NYx$*+_7grhjKTRm$ye~} zZ=Q!G?RcfP zEuG_~ugDhk`i43%K-*({$Znn1JBn)flR1;&PED!zkuSWmE?iysLJft|J{x`SmTkTk zQLUBrwP?Cn-AWINu4(p*HLz^GsSbHpKJO|3rj7W*-H20)K3xS%a1$sjzg)z2PuCH(=irKW-|Y~-Q{F~8$j0{r@PP&W~wO1 z&U8P?>~1Nm!Auv+nG%4>aG=jE_eF@>yoU1S9cDW(C_`^&yyJ3aU?R#@}?qL zUmm}Fc7w7)!k}F(3uu7&hs`P{F=0#PAc6J*V|@=e?0ttWK#$9D8aPcl-8)6cXY;)_ z?c<9BxhaxADSiVdqGH>tdz(Jio+@2zKzUlgQpCQh@f#5b4Mkz$I|u`f zVK>2z+PZ?{d1B~y0H-9_lm`M>4H=>;$H?)Z-#;$9z<~}YOIzm39sAE_Mpof_5C|6< zP04^8Y+yx=LO)riP?pmMg<(zs90R{Gu~``dMGy#fif2chm;TExVP@X>Ku5g6QP9`H zuNzB}*`!9-n=h)hF2PjpYCBPNGVAQ0;4e?R7Kx76 zM2U{|M}<+?@n1erYZq&>WdkJR+|cJ>u5_}!5c83lK$tXt4jBD$y`^Zc;KNVwSdfQ{ z7FgsfGch6U4_uhDdp0P%Y~BBb0x>#t5d*Y}peh-@6%P%2y;gSY?3WWBlg~$dc}fEc z(J2-&bOGT(;KcWKaBzt02_8ovecU)6Vq5B|WjNo;JXy-QUZ{Z|^=Ka6D2e{vs%R#q z6!aSzksINyul~khs4~#_O3Ep>%f?!|`C_qt#KE0%qrN(rSe^?0v%e#O-}B(Fp-p*J zXP{6{4hp;w?~6P5uOudZz{po!cAY4IjAW`OJoC#x=ThDP(Q(-B?>CgF{S`~gPzWf@ z$GQ^^$q&VWnu2gTo;nZ;on7zG4I4mQ~C!{Yl&%eX87cE*8b4r+7FKM{w!q zHb24`bTXDE@KVEJ!z4zmLh0=vYikvnQM!Kz;fqaVca{&!VB83Mi^D{miCIwGsQ@AfF_)Q!xmX3hZS28q=yg=Bj;f0{=0O%AUxI|t}ix6Uo zA%@Dp2;Um9p8qIg2S1V2szP)0zHkm*jc>^mRv52+Kc`09o#XN1&dg0%l?5ZKpWY|Q z4_EY4eisQpw0q^L(qHz733%6ay?dNxV0DvoFcRSIvQdvW=0&L?x+>TTUk-L^==E}F z;BU^gmyD}va#!OU(~D#jWEMX7IAlrjJ->=L+}Gs`Z==Cv#&j1LgdSxRB0ZUhKsn?q zGr&mNA5$nx6ru<&mXAm$jc{g#a>$mmtlwuPV1YaVKyNzq??;kL{vWJBI3ciPLqaMv zhn$>PNW9ICEQRZct*av|*hn-fhlsXkM)U?xuQ_IO^W^!_!1DeoYZZ zb8ArKoU9?;ZcVm>kxH7+z7^|IJ*aASJ4VTweA%+^;>RspI+^S`$=?gy`QHj#>~~`B zX0Y#^vV5qBs64*D%|=}lZCEyDZcC1cbh|N_1jAg?L^lPJn2sdn+{p?>(pD0{oL5nt z#Plq8KmeY$%$g-$MYt6ykQfN-k<5%sVeTh3ma(EMk=`?g==SFwr{jcgbuu}ITXH`w zJ`d``rjEFZ@A{T2C-602;rtU&&kefCAht;7rTOZlQtRWHzcu?aQRZv-anFkfOo9HA zPPbjl4{|L6mrL{di&&)7n47j>gBol(V9P+{xc{uHjoC@-1;z2ZxuS^u#2npYZ)Ag4 zQ$)y<6JsL--*Q2i7|i#;(j~Gue?*f98bAdh4hgN=B!fcR0ETa5ZK#j}Bm|`mCx$-h z*Z%0{u1mY*=QXGR7aEgX}vwf8hd|X=W**p2QWcKcoE)6fD64om88288iPap-Z3T? zC+q|O34F^KxO}-_sr;FetL=#)?&uBhO%~Xqv6DFCCMy|4gkYRD9ifaR^e|HpM97&N z?RK~j35p7}Gv!7tzYt^8Yn`x`nR_SNB_f=5Q}RK1!pC!E`$fdxXuhV%k*2Sv58YqU zpB8a9y0ce^?ryv>)mBO@d=MvS+EX?oYRyPp@~G*wyO2rku#_vY2Fh>o)~S9jp4+C+ zxcxeV&BVSoIcSu&>*y}P#6hke%g1J zf4R^weKGPhFd7HyS|B@xP-F`FX+I$Ji7!&oB=E_kyE=k@|$mWO*>p<)Hg}YshS%VqN2+`Ud z1+{*~L>wo7YR2OGnrq1i+#P&?pXEh3Z__laV;)d@|OqVzS5` z8#!$R4|Kad68s!WsG*1yKoCP9Pc-yHfnYr`SU(T}{v?jUJcYM<7b>HAuIP7&?N2LQ zKCuS$U;_`Q9CCZs0K^w9nG56U0@2jh>3?iEmwptG$2sye8VM!y9=%W-`BqFJTmGRT z;5zn;&4U?2nY~&}tZiQ?es6;F3rC4!qP{o$_I+ko*>@y#vEsixexY)w&Pls9Mf@wR zh``2H8-CtKnHkwAeVK6zX~6@636u3+Op)86)(M~-f|zM8L1XlSt(+jkT|W-U;Rhoz z1c$b=DuLV*URhM-w7}M4Dg2!B&LJ)L4;K0X7S;ZP4}4&isg7klmdndh=P<#;>FS-8 zSMc);{~MDZyp4fRDBQ5QCXsNS_N;O1*)2LXCjH=DH8+7SuJ?K>Px|+`a{Ui=ejg<4 zYDoTi|VfRKctw*iJpQty6Mwl76=QIa^bM9sms-nH;d6L&# zOwHO$i8988A#hvo1fupKn^@dnr18m9A{a*q`cSbhkRC=KrUT#s!}Cd?Pt9PQncyFS zt3=w)LYBnuIEmhYS36&dij1l6nmn_pez)1f?V3G72)h^iw8@Wj{FaMQrQ)ygsvA-5 zZFsntpDRMzU90)%>O-QCwB~e-uiW^qDQxVCZRYBQgFv;InJ&@$_i8$xMxUoya(J6w z_DE$}6*6(48pPVp3u(yeq#zWTule7Yk1 z96vROm-Oq8n?+#Ph~}%y_OriVwX8HzJh$zu`D%wT#fderqi0csm2)vQe8755an5T~ zUAnZ_V|fZMSvQbB-(>~;wbhqQ*g3rTvZSt(1D3u2V9Jo?`-`hdf$=A7H|47M(w`iX zk94GKZUm-c*E}EEs(%#sWc5(AgJ$bOi0KQ$-~Cr=;H8VNxaRxP;>Ar zPV^Av3llyAGmHB&q&@FV=Aj5}!Z4~(IyPHVS%U`#L4<#eaKW)3fDg~_N~+6^;Wm@z z6;xv63ii}H@QRGfjl$fpjs6!#te&qJRQgNU%&2Y5OF+n&i395yKaGIWMdec5FF1nB zc{`KT53QUveAfPmex82k?AMX_TBRp~DH`Sg3^5p>mYtTjI~fAn@zi7g~34`n-fVelR?@lzss11!iMIcuPO|NdVEJb6s0$+K9PnzGaa+>VUSYt z>*|;*0bl|@_~uO4ewLyiw~|AC$*jt3ZPUgj{fr5reYG;edvTnkRT+M{bQDl1s#c#x zm}rjn;bR5hXHSobjyU7$){1|go4S;)jpdF0?iq1f@fdmGt5kQoYihNl_+9$7PW8i8 zgH&RiN*tiH*wMN~pvr!B%xw+-`>_)4U{;Wm)ZNmZj(gJ$D)bF8ighEPG`-xoVFNyB z!?!)=HraAib`sVR!^qcTtrtk|u~r-_OSF|CDfDd!*u&Ct#zXiUAzMZ11GBWTL|!$g zF3gw}){p+vl<9+>%>PFG>PCAtd>tkGPsK%Z! z5)bc0aZLN;r^ith6)qgoAf0iRL3eWt3R7y|7(=sMaiW+`cX?IZT9}*cun(` zREW!w&%{+hBC_OD-Xm1?BO5A9^@IbFjfNlX;6bvj_@iFIxqlm121hR23V*(R)2?|~ z^CKjW>a!k4Bm7vW7bTW#l~PBXANDjZ%GA?5PL8Ld_!YRf4INut@*_^%v)v|Tr(W`( z;bMW3=!YiyjHYh|ug!Fo4!uYc)LgR?$z*?)VdrDvLz#Qc+?RYV$yIa$4_^@cYnz^> z?1fIa7=~kf7fyJx8uI(fxk||H|Jpt}9P=3Q?ITJQBJ!|6*8xDPUzssu7cv(B><6O9 zxJf2X2?P%^g0t50yNB3WeblAJuSbTz$WR=_Sr=yPTgy@5W7?Tk{%O7LPbW;uA>k|UnjzG(o>O2#eKinL0FBu#hT2wp&`q=|Oe|{-0 zskW4&g2-Q5=;&3aPM{BjwNHzCB89tO?QW7^?6=Px4l6PJp$v%edKusbzWwY_bo^`@ znr2)o;AsU@s|gM^m3B9cq!dl}+t|!V51`)biHM?l=pzE4eD=Zx=D}(yw4|PIK3$Xo z03zDJ(%n;q^IejrAeTyJ*4n+0)KKo8p6sI<3b*oF*(=o3_#i`x{t)V;1m|CDtE-vuL zryOV4&7w<0Uj&!_NcgCf5L)~^yjG6&`G@P|-&<#4#~I{&Yvoz*Mavu6%Gjh>vkw>rLpD9J{iR-wSfnyT6wk zQd3v(VbYUk!l@xQKE~dDa9T)eRc!92Gjk+xHkv}VtUB+$mCUp9O6RJ+EsF4#e{$b3 zrjzx+X@d|Gp)CCq2HK=kltfiK;-K@GbJlMN{8#Ut9^EDBPfA9pi%Q$33UY(QL zhWgF?^X2HCe^f%*ffBA%k4v=E{_^w-YgfNerT{S3au|bFaO+-Q1&kB|4hAznz=J+z zt}NHtP+LNYYrbBcNVrQ4Ph=WMj)LR@_FFHjPbZ~RI`NSbeC3?kAo+h+n-sF2KW$4i z@~#@6=FEni-1;QD+fGaA3-g$oxeqoy9QAb6V;;XNi#qV&9!D=dbbM*Ik!++htrftC zkm7cEm7DTCDL2VG`8JQG!)Gx%@q0&nk!wTutHERBvd*Rpt0?wzb<~3It~F8HfdTd< zjDlLaLY1(KKBi`X%Z{J6FjfCB`CX^}GzD>wBPSkdJ|AukOm06cF_kp`Q87!mhx?^Z zpmd%0N#1PJb!))r<^#pV5Wl@5kCH`FdTgqZX?fF$>Thr3jDk}5JK=vm&kC&Kh_pf4 z`JZZ z5hzTTe_x+S{sV3>_Qg1#2&EQhDHlH9%cL2mma9t+!;mYN2kuL6t7G~YtC5OxLAQp# z)8_*Am=eWnioRu^hdf*|bfMKW76hRj;EcSo*QbDk&koUw(uuVd=C7Tz9p9&s;xK1yM%4=dbb&QD-x({957Dq(;ztMyj$ zw@4u!bPJacISO;%1M!3tw9(?Z543WTU_ILMBm+;0&XfCzFBY!P-r~)=9_&85y>4=ihM-IsXS8|p zy>!jxq=bvU8+}6l*X|_P>1bK0{Q!O$+&dGh#$US|CTY7_X0I-fgtlqQal-GDjv^&7 zFbF$Cn2wtzXEcDDZR_+e>z?Xp zf|g3eMmqPv%Bb6u+~6dM&zNquc9R{B4}H$@`M-Z5&F$1h1>A{5r{b%kC8hVTkpv|v zQf&$+qyOk2BVYtWXngK%Os(ESC?n)~S7C23uxZ@_!)=pK6)E+^HQsVd+nQAKV}dR} zSmd4-(|I}9KrZ~%I9e?IJFGS0X?x1@ zRoT=sV$N*#uAsj6QagC7s`5MKv=uhsQYm^Ay@*KgqKk}8IX%4&F&~b0 zfXB-{C_onHjD&)iE)inTHo5i3N6~JpS+`l=J{*4I`IB@vpO(A%oXyqqI#SZ9MY|6w zU($T>QtYyvZBbqIl!_tcntm;>eScJk6|6!zH_m+GSOj@X&FqwJ-Lqwo%=Kl&4)0Mlx-QQ&Jzn@4lzh}h~|mNGW0 zfr~GIhkJE+ugU!Wx~_TRl(}PV_$3yfM+l(Zn;mvYjc2qaKB*Yps;Y+tHSO23vo&_T| zlz;_^cl4+gz;hqj{3pvH?Kay4V2u z`+HqUZ>$1+Ms}Ao^LH_w`6i@5i-CFsPV(9vugu4Um}riwi8Lwb{5Tk%3Ou7>I*w+H z0KE?rG~pt5GTlGc(yhly{)kDx#`TUCyrpsEKT&Z+Zn~Q^z6oydyJq^Us+Sg@{I5Od z{e4REToYt5fL#htb^YcuOKv2Qu&EtJxxg{({6HfWT4OUC@-Buu=k{Jj*4k`%qMKl- zYFMD^=T@6g*f+b2LBFRTw0v|oWBt{~w@rB_Kq#MK*&BC_L=Rf!&pJT~sYxJj#&L() z!ALt1i)a@y=6#KLJOAX34^rd=CzP>o7+DuR!UxV^u||t7T_RtAGt~mY_o{%s^rL>Z zYlF==Z}rqYp2RJvlh3ePMONDMHB%ba=7#H0VH<3=*AjOfV^7yUlg45D!@f?3Cu!zY z6fq%{-tzsAet(H(+zGVi6{3FRYOuo4;=qFWi__5&r*XXz=Ov5$x&6+3w{}}A!xU;N zSMKC#K|$GTvrmBi zd%%xcCuurSEqm!G!hMG#*(GvpR;Q@)TDxRbj=Jx97-=*FO&H7yKKGsq8ta1Fs$BG|1TS+sn;^0pzeEXH z7X*Fu*>QlcyLE>exX&dn_;iDgnexZcw~4iLz6y8aI|Y}&v0Y2h&~<289&sZET2xAL z&}!4`x;rtCtfK8IH3)vL9q@)m+$E$Sa^R^uLHZ%JW8@_;_D`0@FV4l_Xx<0?Yg5Q> z%B@KHoZnIEW^lxs7U(KWc!SKOF@LvsHFJ%Wo?PQ20wSGL&hmtEPmLUfZnSj$x@-h| z6~mrSpaoI7CJ(+2<(bana|NUE4b0eT z5}tyY+N*Ja0%O2UL5(?bXprJ-ZZFZdEvdEBG%(r-M~V!7#$F`6&cA^yE@(LYN9A)_ zCdwqXBmLcM$@fOHH)xq42zz*vH`n_d_kC~XR2BBJ7mP8&S?onUt5C8Xe@CBwd%v7; z&foI5wz-kF+lKCL(LQJOi5gS zm=df!eiEteWqyI2DU_n9d2>_Pz+4>34Z8d-j5Gv7Xp zR5ue?rN&J;V@mtM7{Am6>FXrnGJIHmX})orl6@r& zr)v4LDDReG*ML1`_I~Dc+$j#~aeuZZ+l8UY{(JRn^l)`vhh!H-?D{D-8(&oIlDQ^d zch$9O_13&M@LEUf%SHbUNna3>>rQX)j(FR(Ee3ADNTebrtp!jcluUqCFL%jPtah=)PtJ+;f_FB95J= z?i8*L$~xtB~Wv5 z{^K^jD}hoLH?{WMa)+gpFrv(vO1yk9~;)&EeuzV0>cyW57T+7G|`{!yZR^tmv;`aK;@ ze;9wATr;_y9q>ypI-^CsX_p_F8!|NY_s;y@Zl>~-UA-kbbG#BEtgFRcKB1Je^T|AN znCxt-FKBg8grbMw2%#4CSDURrrWLfQ+~zS7eJeXpX-)IDJ`-Z2%>oNeW#YGPzToJA z_aqJ(q~-O4Rw#V~2G35%&NqJaDafwguLy|P3+%t8-krFG0s!Vf^Na*-2|N>dj7BZf zE+&bG1=}BHOVFxuoEI@@d6x}T%5ov4au;Um!Xia;esp{}IL(&cbNOR2iN0i5^Y$lg z@nHloBiAKB6>%gGY((^|B%@KoiY*vZ6~?0O9m}3{<)`QWKJ?PVWbxp37c03RqH?={ zvw(5y4J{w`YJ9R$@Ud@o^&atQ*qXl?i9^)cT<7f>*HOMf1`;^eK|b*J^Q4iPIYn$Q z2eCvjjaK8(&)Ec&t!ORDKs|os+U!er&a_$qvs<@R$CZtKx3Xosa_SF&ec5}oN0b#+ zGPsxfHIuodyzK4-^@RJf58^DUA}?-7t#6egBQ8_te}vsO1AEN`Ahf{Mo5G08*^A~d z>2?0Y8%fN~L}dhUH51H)hd#Ro&U?Ok{ZmvRJ9!ZwyeEF^C)V_+ZT(leg(d7LlbfZv zZDsN36_wEa!i?`G#teSsWWt7KT-axLS0sl2~j@l$H zzSbZVb^}yd*|Wy%uedFFHDKB_$&7vTTQSh#Py5=U#hmfnQtKXj-o!EeJp7*oXmYhl zG;aPC&5`8u2Tj!Hi!#IWDbLKU<>MRo2%hQNJ!;|>D`#((5~FFhNeiox6}8a$r`?Q& z51IO^SM*aq>GULJedK#EocznZ_QGZHUh^lZ!>t7-8M52#utQoh-z|Sl6N)#K&Blkf z@&wTq=VVvKiU}8XL|H@&_@ql0p^(;jkoWnIt4?svp(x35X4}Te5|<#weWP=Y$lLuS zw)lMBqQj_>%tF%K}APg;rkIQ zzw_Pa3lBxN5jPke_8a)HLdqq4NNtT<>W0@&CFL~df)S#&9GGNCFUt7{00s5NH5;D5 zLJl*a#{;$vDo);)3{s5IgqEs7E3#MG2e<0%kYDcenM@KwEYN57CoORTk-9-q0^1JD zj55u82SZFT-(*(_D$do)0+^c7GlJb#Io-Q0@SUqKJ!pzPw@td;2iR zd{=wK%Y5`8s>}FVoulkW&)!IyL4W8=`E&8}2rgItE@Q)!#$!A8(S^UakA%0>{@GwR zdzwMwx6~wdmWSMesYZS@$XV>NYp*Hth6H;_;{TH*p4XksFMT( From 88f75671a1274f3a383160fd6fded07bb3d443e0 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:36:32 +0100 Subject: [PATCH 220/597] [tomahk-metadata] Optimize PNG size --- .../content/contents/code/tomahk-metadata.png | Bin 8698 -> 7663 bytes .../content/contents/images/icon.png | Bin 10446 -> 9697 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tomahk-metadata/content/contents/code/tomahk-metadata.png b/tomahk-metadata/content/contents/code/tomahk-metadata.png index ea0720e8554bec9466f8684724c22799d87323a2..8461e9952315e59fdf21e4cff7843cad8e63d7f1 100644 GIT binary patch delta 7642 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 From d7664e35ce65069aff03e78e81c15f0f571eedf8 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 16 May 2014 15:36:53 +0100 Subject: [PATCH 221/597] [youtube] Optimize PNG size --- .../content/contents/code/youtube-icon.png | Bin 12193 -> 11785 bytes youtube/content/contents/code/youtube.png | Bin 6189 -> 5863 bytes youtube/content/contents/images/icon.png | Bin 12193 -> 11785 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/youtube/content/contents/code/youtube-icon.png b/youtube/content/contents/code/youtube-icon.png index 2b9bb3a23e85b936e3fade42625178716c482e72..a58d7667a2255ab9fe81364067dc42874dd47376 100644 GIT binary patch literal 11785 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�MtJ# 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 literal 12193 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 TurU71u?J)&6(y>~i~|1;?uFbT diff --git a/youtube/content/contents/code/youtube.png b/youtube/content/contents/code/youtube.png index 89ac0ff35adc70000c0b3e46afd7c54c989d9390..abd719f3135e70a4fe5230e1945231a5857e5666 100644 GIT binary patch delta 5862 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 literal 6189 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�MtJ# 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 literal 12193 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 TurU71u?J)&6(y>~i~|1;?uFbT From eb341021526d74250d1b48b3a0184e49476ad117 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 21 May 2014 12:31:36 +0100 Subject: [PATCH 222/597] Add archive README --- archive/README | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 archive/README diff --git a/archive/README b/archive/README new file mode 100644 index 000000000..cd3af8bfd --- /dev/null +++ b/archive/README @@ -0,0 +1,3 @@ +Resolvers in this directory are not functional anymore because the used API +is not available anymore. The resolver may still be helpful as a basis for +developing new resolvers. From 6430df7e5aabb21b6593a5ee369c5e2c56065f0d Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 21 May 2014 12:32:02 +0100 Subject: [PATCH 223/597] [exfm] Move to archive --- .../exfm}/content/contents/code/exfm-icon.png | Bin .../exfm}/content/contents/code/exfm.js | 0 .../exfm}/content/contents/images/icon.png | Bin {exfm => archive/exfm}/content/metadata.json | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {exfm => archive/exfm}/content/contents/code/exfm-icon.png (100%) rename {exfm => archive/exfm}/content/contents/code/exfm.js (100%) rename {exfm => archive/exfm}/content/contents/images/icon.png (100%) rename {exfm => archive/exfm}/content/metadata.json (100%) diff --git a/exfm/content/contents/code/exfm-icon.png b/archive/exfm/content/contents/code/exfm-icon.png similarity index 100% rename from exfm/content/contents/code/exfm-icon.png rename to archive/exfm/content/contents/code/exfm-icon.png diff --git a/exfm/content/contents/code/exfm.js b/archive/exfm/content/contents/code/exfm.js similarity index 100% rename from exfm/content/contents/code/exfm.js rename to archive/exfm/content/contents/code/exfm.js diff --git a/exfm/content/contents/images/icon.png b/archive/exfm/content/contents/images/icon.png similarity index 100% rename from exfm/content/contents/images/icon.png rename to archive/exfm/content/contents/images/icon.png diff --git a/exfm/content/metadata.json b/archive/exfm/content/metadata.json similarity index 100% rename from exfm/content/metadata.json rename to archive/exfm/content/metadata.json From 68943c25e2de76705fd929e216d858f9e0295bf6 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Sat, 24 May 2014 19:53:13 +0100 Subject: [PATCH 224/597] tomahawk-resolvers: add Google Music resolver --- gmusic/.gitignore | 3 + gmusic/COPYING.txt | 121 +++++ gmusic/README.md | 42 ++ gmusic/content/contents/code/config.ui | 71 +++ gmusic/content/contents/code/cryptojs.js | 28 ++ gmusic/content/contents/code/gmusic.js | 511 +++++++++++++++++++++ gmusic/content/contents/code/play-logo.png | Bin 0 -> 4272 bytes gmusic/content/contents/images/icon.png | Bin 0 -> 85124 bytes gmusic/content/metadata.json | 21 + 9 files changed, 797 insertions(+) create mode 100644 gmusic/.gitignore create mode 100644 gmusic/COPYING.txt create mode 100644 gmusic/README.md create mode 100644 gmusic/content/contents/code/config.ui create mode 100644 gmusic/content/contents/code/cryptojs.js create mode 100755 gmusic/content/contents/code/gmusic.js create mode 100644 gmusic/content/contents/code/play-logo.png create mode 100644 gmusic/content/contents/images/icon.png create mode 100644 gmusic/content/metadata.json diff --git a/gmusic/.gitignore b/gmusic/.gitignore new file mode 100644 index 000000000..bfa45d747 --- /dev/null +++ b/gmusic/.gitignore @@ -0,0 +1,3 @@ + +/makeaxe.rb +/gmusic-* diff --git a/gmusic/COPYING.txt b/gmusic/COPYING.txt new file mode 100644 index 000000000..0e259d42c --- /dev/null +++ b/gmusic/COPYING.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/gmusic/README.md b/gmusic/README.md new file mode 100644 index 000000000..0b2f71b60 --- /dev/null +++ b/gmusic/README.md @@ -0,0 +1,42 @@ + +This is a Tomahawk resolver for Google Music. + +[Tomahawk] is a music player which decouples your library and playlists +from individual sources and presents a unified view. When you play a +track Tomahawk will use the best version available from its configured +sources. You can build playlists and share tracks without thinking +about which of your services and libraries have a particular track. + +This is a [resolver], a plugin for Tomahawk responsible for interfacing +with an external music source, in this case Google Music. It can stream +tracks from your uploaded library. When you search for tracks +you'll get results from Google Music. In the future you'll also be able +to browse your library and sync playlists. + +[tomahawk]: http://www.tomahawk-player.org/ +[resolver]: http://www.tomahawk-player.org/resolvers.html + +Installing +========== + +In Tomahawk's Services configuration dialog, click "Install from File" +and choose `content/contents/code/gmusic.js`. Click the gear icon and +enter your Google email and password. Check the Tomahawk log file to +make sure the login succeeded. Unfortunately there's no way to provide +status information through the Tomahawk user interface. + +Copying +======= + +Written in 2013 by Sam Hanes +Heavily modified in 2014 by Lalit Maganti + +To the extent possible under law, the author(s) have dedicated all +copyright and related and neighboring rights to this software to +the public domain worldwide. This software is distributed without +any warranty. + +You should have received a copy of the CC0 Public Domain Dedication +along with this software. If not, see: +http://creativecommons.org/publicdomain/zero/1.0/ + diff --git a/gmusic/content/contents/code/config.ui b/gmusic/content/contents/code/config.ui new file mode 100644 index 000000000..7f071813f --- /dev/null +++ b/gmusic/content/contents/code/config.ui @@ -0,0 +1,71 @@ + + + Form + + + + 0 + 0 + 250 + 120 + + + + + 250 + 120 + + + + Form + + + + + + play-logo.png + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + Email + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Password + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + QLineEdit::Password + + + + + + + + + + diff --git a/gmusic/content/contents/code/cryptojs.js b/gmusic/content/contents/code/cryptojs.js new file mode 100644 index 000000000..fa55f46a0 --- /dev/null +++ b/gmusic/content/contents/code/cryptojs.js @@ -0,0 +1,28 @@ +/* +CryptoJS v3.1.2 +code.google.com/p/crypto-js +(c) 2009-2013 by Jeff Mott. All rights reserved. +code.google.com/p/crypto-js/wiki/License +*/ + +// core +var CryptoJS=CryptoJS||function(h,r){var k={},l=k.lib={},n=function(){},f=l.Base={extend:function(a){n.prototype=this;var b=new n;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, +j=l.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=r?b:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((c+e)%4);else if(65535>>2]=d[e>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<< +32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],d=0;d>>2]>>>24-8*(c%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>3]|=parseInt(a.substr(c, +2),16)<<24-4*(c%8);return new j.init(d,b/2)}},p=m.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new j.init(d,b)}},t=m.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}}, +q=l.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new j.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,c=b.sigBytes,e=this.blockSize,f=c/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;c=h.min(4*a,c);if(a){for(var g=0;ge&&(b=a.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,j=g.words,d=0;dc;c++){if(16>c)d[c]=n[p+c]|0;else{var g=d[c-3]^d[c-8]^d[c-14]^d[c-16];d[c]=g<<1|g>>>31}g=(e<<5|e>>>27)+b+d[c];g=20>c?g+((f&h|~f&j)+1518500249):40>c?g+((f^h^j)+1859775393):60>c?g+((f&h|f&j|h&j)-1894007588):g+((f^h^ +j)-899497514);b=j;j=h;h=f<<30|f>>>2;f=e;e=g}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+h|0;a[3]=a[3]+j|0;a[4]=a[4]+b|0},_doFinalize:function(){var b=this._data,d=b.words,a=8*this._nDataBytes,e=8*b.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=Math.floor(a/4294967296);d[(e+64>>>9<<4)+15]=a;b.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var b=l.clone.call(this);b._hash=this._hash.clone();return b}});k.SHA1=l._createHelper(b);k.HmacSHA1=l._createHmacHelper(b)})(); + +// enc-base64 +(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d< +e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(); + diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js new file mode 100755 index 000000000..c06d28f80 --- /dev/null +++ b/gmusic/content/contents/code/gmusic.js @@ -0,0 +1,511 @@ +/* Google Play Music resolver for Tomahawk. + * + * Written in 2013 by Sam Hanes + * Extensive modifications in 2014 by Lalit Maganti + * + * To the extent possible under law, the author(s) have dedicated all + * copyright and related and neighboring rights to this software to + * the public domain worldwide. This software is distributed without + * any warranty. + * + * You should have received a copy of the CC0 Public Domain Dedication + * along with this software. If not, see: + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +var GMusicResolver = Tomahawk.extend( TomahawkResolver, { + settings: { + name: 'Google Play Music', + icon: '../images/icon.png', + weight: 90, + timeout: 8 + }, + + _version: '0.1', + _baseURL: 'https://www.googleapis.com/sj/v1/', + _webURL: 'https://play.google.com/music/', + + getConfigUi: function() { + return { + "widget": Tomahawk.readBase64( "config.ui" ), + fields: [{ + name: "email", + widget: "email_edit", + property: "text" + }, { + name: "password", + widget: "password_edit", + property: "text" + }], + images: [{ + "play-logo.png": + Tomahawk.readBase64( "play-logo.png" ) + }] + }; + }, + + newConfigSaved: function() { + var config = this.getUserConfig(); + if (this._email !== config.email + || this._password !== config.password) + this.init(); + }, + + init: function() { + var name = this.settings.name; + var config = this.getUserConfig(); + this._email = config.email; + this._password = config.password; + + if (!this._email || !this._password) { + Tomahawk.log( name + " resolver not configured." ); + return; + } + + // check that we have all the needed CryptoJS modules + { var error = false; + if (error |= 'object' !== typeof CryptoJS) { + Tomahawk.log( "CryptoJS missing" ); + } else { + if (error |= 'object' !== typeof CryptoJS.algo.HMAC) + Tomahawk.log( "CryptoJS.algo.HMAC missing" ); + + if (error |= 'object' !== typeof CryptoJS.algo.SHA1) + Tomahawk.log( "CryptoJS.algo.SHA1 missing" ); + + if (error |= 'object' !== typeof CryptoJS.enc.Base64) + Tomahawk.log( "CryptoJS.enc.Base64 missing" ); + } + + if (error) { + Tomahawk.log( "Required CryptoJS modules are missing." + + " Did cryptojs.js get loaded? Some versions" + + " of Tomahawk don't load extra scripts when" + + " installing unpacked resolvers. Try making" + + " an AXE and installing it instead." + ); + return; + } + } + + // load signing key + { var s1 = CryptoJS.enc.Base64.parse( + 'VzeC4H4h+T2f0VI180nVX8x+Mb5HiTtGnKgH52Otj8ZCGDz9jRW' + + 'yHb6QXK0JskSiOgzQfwTY5xgLLSdUSreaLVMsVVWfxfa8Rw==' + ); + var s2 = CryptoJS.enc.Base64.parse( + 'ZAPnhUkYwQ6y5DdQxWThbvhJHN8msQ1rqJw0ggKdufQjelrKuiG' + + 'GJI30aswkgCWTDyHkTGK9ynlqTkJ5L4CiGGUabGeo8M6JTQ==' + ); + + for (var idx = 0; idx < s1.words.length; idx++) + s1.words[ idx ] ^= s2.words[ idx ]; + this._key = s1; + } + + Tomahawk.addCustomUrlHandler( 'gmusic', 'getStreamUrl', true ); + + var that = this; + this._login( function() { + that._loadWebToken( function() { + that._loadSettings( function() { + that._ready = true; + }); + }); + }); + }, + + _convertTrack: function (entry) { + return { + artist: entry.artist, + duration: entry.durationMillis / 1000, + source: "Google Music", + track: entry.title, + url: 'gmusic://track/' + entry.id, + }; + }, + + _convertAlbum: function (entry) { + return { + artist: entry.artist, + album: entry.album, + year: entry.year + }; + }, + + _convertArtist: function (entry) { + return entry.artist; + }, + + _execSearch: function (query, callback, max_results) { + var url = this._baseURL + 'trackfeed'; + + var that = this; + this._request( 'POST', url, function (request) { + if (200 != request.status) { + Tomahawk.log( + "Google Music search '" + query + "' failed:\n" + + request.status + " " + + request.statusText.trim() + "\n" + + request.responseText.trim() + ); + return; + } + + var response = JSON.parse( request.responseText ); + var results = { tracks: [], albums: [], artists: [] }; + for (var idx = 0; idx < response.data.items.length; idx++) { + var entry = response.data.items[ idx ]; + var lowerQuery = query.toLowerCase(); + if (entry.artist.toLowerCase() === lowerQuery + || entry.album.toLowerCase() === lowerQuery + || entry.title.toLowerCase() === lowerQuery) { + var artist = that._convertArtist(entry); + var album = that._convertAlbum(entry); + if (!that.containsObject(artist, results.artists)) { + results.artists.push(artist); + } + if (!that.containsObject(album, results.albums)) { + results.albums.push(album); + } + results.tracks.push(that._convertTrack(entry)); + } + } + callback.call( window, results ); + }); + }, + + search: function (qid, query) { + if (!this._ready) return; + + this._execSearch( query, function (results) { + Tomahawk.addTrackResults( + { 'qid': qid, 'results': results.tracks } ); + Tomahawk.addAlbumResults( + { 'qid': qid, 'results': results.albums } ); + Tomahawk.addArtistResults( + { 'qid': qid, 'results': results.artists } ); + }); + }, + + resolve: function (qid, artist, album, title) { + if (!this._ready) return; + var query = title; + this._execSearch( query, function (results) { + if (results.tracks.length > 0) { + Tomahawk.addTrackResults({ 'qid': qid, 'results': [ results.tracks[0] ] } ); + } else { + // no matches, don't wait for the timeout + Tomahawk.addTrackResults({ 'qid': qid, 'results': [] }); + } + }, 1 ); + }, + + _parseUrn: function (urn) { + var match = urn.match( /^gmusic:\/\/([a-z]+)\/(.+)$/ ); + if (!match) return null; + + return { + type: match[ 1 ], + id: match[ 2 ] + }; + }, + + getStreamUrl: function (qid, urn) { + if (!this._ready) return; + Tomahawk.log( "getting stream for '" + urn + "'" ); + + urn = this._parseUrn( urn ); + if (!urn || 'track' != urn.type) + return; + + Tomahawk.log( "track ID is '" + urn.id + "'" ); + + // TODO - this is required for the All Access part of Google Music + /*// generate 13-digit numeric salt + var salt = '' + Math.floor( Math.random() * 10000000000000 ); + + // generate SHA1 HMAC of track ID + salt + // encoded with URL-safe base64 + var sig = CryptoJS.HmacSHA1( urn.id + salt, this._key ) + .toString( CryptoJS.enc.Base64 ) + .replace( /=+$/, '' ) // no padding + .replace( /\+/g, '-' ) // URL-safe alphabet + .replace( /\//g, '_' ) // URL-safe alphabet + ;*/ + + var url = 'https://android.clients.google.com/music/mplay' + + '?net=wifi&pt=e&targetkbps=8310' + + '&' + ('T' == urn.id[ 0 ] ? 'mjck' : 'songid') + + '=' + urn.id; + + Tomahawk.reportStreamUrl(qid, url, { + 'Authorization': 'GoogleLogin auth=' + this._token, + 'X-Device-ID' : this._deviceId + }); + }, + + _loadSettings: function (callback) { + var that = this; + that._request( + 'POST', that._webURL + + 'services/loadsettings?u=0&xt=' + + encodeURIComponent( that._xt ), + function (request) { + if (200 != request.status) { + Tomahawk.log( + "settings request failed:\n" + + request.status + " " + + request.statusText.trim() + ); + return; + } + + var response = JSON.parse( request.responseText ); + if (!response.settings) { + Tomahawk.log( "settings request failed:\n" + + request.responseText.trim() + ); + return; + } + + that._allAccess = response.settings.isSubscription; + Tomahawk.log( "Google Play Music All Access is " + + (that._allAccess ? "enabled" : "disabled" ) + ); + + var device = null; + var devices = response.settings.devices; + for (var i = 0; i < devices.length; i++) { + var entry = devices[ i ]; + if ('PHONE' == entry.type) { + device = entry; + break; + } + } + + if (device) { + that._deviceId = device.id.slice( 2 ); + Tomahawk.log(that._deviceId); + + Tomahawk.log( that.settings.name + + " using device ID from " + + device.carrier + " " + + device.manufacturer + " " + + device.model + ); + + callback.call( window ); + } else { + Tomahawk.log( that.settings.name + + ": there aren't any Android devices" + + " associated with your Google account." + + " This resolver needs an Android device" + + " ID to function. Please open the Google" + + " Music application on an Android device" + + " and log in to your account." + ); + } + }, + { 'Content-Type': 'application/json' }, + JSON.stringify({ 'sessionId': '' }) + ); + }, + + _loadWebToken: function (callback) { + var that = this; + that._request( 'HEAD', that._webURL + 'listen', + function (request) { + if (200 != request.status) { + Tomahawk.log( "request for xt cookie failed:" + + request.status + " " + + request.statusText.trim() + ); + return; + } + + var match = request.getResponseHeader( 'Set-Cookie' ) + .match( /^xt=([^;]+)(?:;|$)/m ); + if (match) { + that._xt = match[ 1 ]; + callback.call( window ); + } else { + Tomahawk.log( "xt cookie missing" ); + return; + } + } + ); + }, + + + /** Called when the login process is completed. + * @callback loginCB + */ + + /** Asynchronously authenticates with the SkyJam service. + * Only one login attempt will run at a time. If a login request is + * already pending the callback (if one is provided) will be queued + * to run when it is complete. + * + * @param {loginCB} [callback] a function to be called on completion + */ + _login: function (callback) { + this._token = null; + + // if a login is already in progress just queue the callback + if (this._loginLock) { + this._loginCallbacks.push( callback ); + return; + } + + this._loginLock = true; + this._loginCallbacks = [ callback ]; + + var that = this; + var name = this.settings.name; + this._request( + 'POST', 'https://www.google.com/accounts/ClientLogin', + function (request) { + if (200 == request.status) { + that._token = request.responseText + .match( /^Auth=(.*)$/m )[ 1 ]; + that._loginLock = false; + + Tomahawk.log( name + " logged in successfully" ); + + for (var idx = 0; idx < that._loginCallbacks.length; idx++) { + that._loginCallbacks[ idx ].call( window ); + } + that._loginCallbacks = null; + } else { + Tomahawk.log( + name + " login failed:\n" + + request.status + " " + + request.statusText.trim() + "\n" + + request.responseText.trim() + ); + } + }, null, + { 'accountType': 'HOSTED_OR_GOOGLE', + 'Email': that._email.trim(), + 'Passwd': that._password.trim(), + 'service': 'sj', + 'source': 'tomahawk-gmusic-' + that._version + }, true + ); + }, + + /** Called when an HTTP request is completed. + * @callback requestCB + * @param {XMLHttpRequest} request the completed request + */ + + /** Sends an asynchronous HTTP request. + * + * If an authentication token is available it will be sent. + * Unless {@code nologin} is set, if the server returns 401 + * {@link #_login} will be called and the request will be retried. + * Automatic login will only be attempted once per request. If 401 + * is returned again after logging in the request will be handled + * as normal. + * + * If {@code body} is not provided the request will be sent without + * an entity. If a body is provided it must be of a type supported + * by {@code XMLHttpRequest}. As a special case, if an object is + * provided it will be interpreted as form parameters and encoded + * as {@code application/x-www-form-urlencoded}. + * + * @param {string} method the HTTP method to use + * @param {string} url the URL to request + * @param {requestCB} callback completion callback function + * @param {object} [headers] additional request headers + * @param {string|object} [body] the request entity to be sent + * @param {boolean} [nologin=false] + * whether to suppress automatic re-authentication + */ + _request: function (method, url, callback, headers, body, nologin) { + var that = this; + var args = arguments; + + // if we're waiting for a login, queue the request + if (!nologin && this._loginLock) { + this._loginCallbacks.push( function() { + args[ 5 ] = true; // set nologin + that._request.apply( that, args ); + } ); + return; + } + + var request = new XMLHttpRequest(); + request.open( method, url, true ); + + // prevent useless parsing of the response + request.responseType = 'text'; + + // add the authentication token if we have one + if (this._token) request.setRequestHeader( + 'Authorization', 'GoogleLogin auth=' + this._token ); + + // add extra request headers + if (headers) for (var name in headers) + request.setRequestHeader( name, headers[ name ] ); + + // add extra request headers + for (var name in request.headers) + Tomahawk.log(name); + + var name = this.settings.name; + request.onreadystatechange = function() { + if (4 != request.readyState) return; + + // log in and retry if necessary + if (401 == request.status && !nologin) { + Tomahawk.log( name + ' login expired, re-authenticating' ); + that._login( function() { + args[ 5 ] = true; // set nologin + that._request.apply( that, args ); + }); + } else { + callback.call( window, request ); + } + } + + // if body given as object encode as x-www-form-urlencoded + if ('object' == typeof body) { + request.setRequestHeader( 'Content-Type', + 'application/x-www-form-urlencoded' ); + + function encode (value) { + // close enough to x-www-form-urlencoded + return encodeURIComponent( value ).replace( '%20', '+' ); + } + + var postdata = ""; + for (var name in body) { + postdata += '&' + encode( name ) + + '=' + encode( body[ name ] ); + } + + body = postdata.substring( 1 ); + } + + if (body) { + request.send( body ); + } else { + request.send(); + } + }, + + containsObject: function (obj, list) { + var i; + for (i = 0; i < list.length; i++) { + if (list[i] === obj) { + return true; + } + } + + return false; + } +}); + +Tomahawk.resolver.instance = GMusicResolver; diff --git a/gmusic/content/contents/code/play-logo.png b/gmusic/content/contents/code/play-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..93b7de54b1fc3e2e0a2c0ff9b84209d1c8005453 GIT binary patch literal 4272 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 z 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 literal 0 HcmV?d00001 diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json new file mode 100644 index 000000000..8cb327acd --- /dev/null +++ b/gmusic/content/metadata.json @@ -0,0 +1,21 @@ +{ + "name": "Google Play Music", + "pluginName": "gmusic", + "author": "Sam Hanes, Lalit Maganti", + "email": "sam@maltera.com, lalitmaganti@gmail.com", + "version": "0.2", + "website": "http://gettomahawk.com", + "description": "Streams music from Google Play Music.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/gmusic.js", + "scripts": [ + "contents/code/cryptojs.js" + ], + "icon": "contents/images/icon.png", + "resources": [ + "contents/code/config.ui", + "contents/code/play-logo.png" + ] + } +} From 3ef3feb4bc6b62bce562840d63f68f38108148d7 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 24 May 2014 19:56:18 +0100 Subject: [PATCH 225/597] [soundcloud] Minor reformattings --- .../content/contents/code/soundcloud.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/soundcloud/content/contents/code/soundcloud.js b/soundcloud/content/contents/code/soundcloud.js index 2aa739da7..13c28a79d 100644 --- a/soundcloud/content/contents/code/soundcloud.js +++ b/soundcloud/content/contents/code/soundcloud.js @@ -68,16 +68,15 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { init: function() { // Set userConfig here var userConfig = this.getUserConfig(); - if ( userConfig !== undefined ){ - this.includeCovers = userConfig.includeCovers; - this.includeRemixes = userConfig.includeRemixes; - this.includeLive = userConfig.includeLive; - } - else { - this.includeCovers = false; - this.includeRemixes = false; - this.includeLive = false; - } + if ( userConfig !== undefined ) { + this.includeCovers = userConfig.includeCovers; + this.includeRemixes = userConfig.includeRemixes; + this.includeLive = userConfig.includeLive; + } else { + this.includeCovers = false; + this.includeRemixes = false; + this.includeLive = false; + } String.prototype.capitalize = function(){ From b48c6dedec0bd25dc93ba5695b40f3ac5d2f4524 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Sat, 24 May 2014 19:59:33 +0100 Subject: [PATCH 226/597] tomahawk-resolvers: remove custom CryptoJS for Google Music --- gmusic/content/contents/code/cryptojs.js | 28 ------------------------ gmusic/content/metadata.json | 3 --- 2 files changed, 31 deletions(-) delete mode 100644 gmusic/content/contents/code/cryptojs.js diff --git a/gmusic/content/contents/code/cryptojs.js b/gmusic/content/contents/code/cryptojs.js deleted file mode 100644 index fa55f46a0..000000000 --- a/gmusic/content/contents/code/cryptojs.js +++ /dev/null @@ -1,28 +0,0 @@ -/* -CryptoJS v3.1.2 -code.google.com/p/crypto-js -(c) 2009-2013 by Jeff Mott. All rights reserved. -code.google.com/p/crypto-js/wiki/License -*/ - -// core -var CryptoJS=CryptoJS||function(h,r){var k={},l=k.lib={},n=function(){},f=l.Base={extend:function(a){n.prototype=this;var b=new n;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}}, -j=l.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=r?b:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var e=0;e>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((c+e)%4);else if(65535>>2]=d[e>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<< -32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],d=0;d>>2]>>>24-8*(c%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>3]|=parseInt(a.substr(c, -2),16)<<24-4*(c%8);return new j.init(d,b/2)}},p=m.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new j.init(d,b)}},t=m.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}}, -q=l.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new j.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,c=b.sigBytes,e=this.blockSize,f=c/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;c=h.min(4*a,c);if(a){for(var g=0;ge&&(b=a.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,j=g.words,d=0;dc;c++){if(16>c)d[c]=n[p+c]|0;else{var g=d[c-3]^d[c-8]^d[c-14]^d[c-16];d[c]=g<<1|g>>>31}g=(e<<5|e>>>27)+b+d[c];g=20>c?g+((f&h|~f&j)+1518500249):40>c?g+((f^h^j)+1859775393):60>c?g+((f&h|f&j|h&j)-1894007588):g+((f^h^ -j)-899497514);b=j;j=h;h=f<<30|f>>>2;f=e;e=g}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+h|0;a[3]=a[3]+j|0;a[4]=a[4]+b|0},_doFinalize:function(){var b=this._data,d=b.words,a=8*this._nDataBytes,e=8*b.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=Math.floor(a/4294967296);d[(e+64>>>9<<4)+15]=a;b.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var b=l.clone.call(this);b._hash=this._hash.clone();return b}});k.SHA1=l._createHelper(b);k.HmacSHA1=l._createHmacHelper(b)})(); - -// enc-base64 -(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d< -e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})(); - diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index 8cb327acd..35092dc9e 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -9,9 +9,6 @@ "type": "resolver/javascript", "manifest": { "main": "contents/code/gmusic.js", - "scripts": [ - "contents/code/cryptojs.js" - ], "icon": "contents/images/icon.png", "resources": [ "contents/code/config.ui", From 57692e6757e61526200ce3c701c5da5e1cb575ef Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 24 May 2014 20:13:24 +0100 Subject: [PATCH 227/597] [soundcloud] Add callback to track if init was successful --- soundcloud/content/contents/code/soundcloud.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/soundcloud/content/contents/code/soundcloud.js b/soundcloud/content/contents/code/soundcloud.js index 13c28a79d..b354fb835 100644 --- a/soundcloud/content/contents/code/soundcloud.js +++ b/soundcloud/content/contents/code/soundcloud.js @@ -65,7 +65,12 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { } }, - init: function() { + /** + * Initial the soundcloud resolver. + * + * @param callback function(err) Callback that notifies when the resolver was initialised. + */ + init: function (callback) { // Set userConfig here var userConfig = this.getUserConfig(); if ( userConfig !== undefined ) { @@ -83,6 +88,10 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); } ); }; Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + + if (callback) { + callback(null); + } }, getTrack: function (trackTitle, origTitle) { From e36a0864e25d46ba379bcc6ed597bb5d9901368b Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 24 May 2014 20:14:41 +0100 Subject: [PATCH 228/597] Add basic test environment --- .gitignore | 1 + package.json | 30 +++++++++++++++++ soundcloud/content/contents/code/test.js | 42 ++++++++++++++++++++++++ test/buster.js | 13 ++++++++ 4 files changed, 86 insertions(+) create mode 100644 package.json create mode 100644 soundcloud/content/contents/code/test.js create mode 100644 test/buster.js diff --git a/.gitignore b/.gitignore index 4eae9644b..91e38bc67 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ moc_* build *.axe *.md5 +node_modules/ diff --git a/package.json b/package.json new file mode 100644 index 000000000..13799a390 --- /dev/null +++ b/package.json @@ -0,0 +1,30 @@ +{ + "name": "tomahawk-resolvers", + "version": "0.7.99", + "description": "Tomahawk Resolvers", + "main": "", + "directories": { + "test": "test" + }, + "scripts": { + "test": "buster-test" + }, + "repository": { + "type": "git", + "url": "git://github.com/tomahawk-player/tomahawk-resolvers.git" + }, + "keywords": [ + "tomahawk", + "resolver" + ], + "author": "", + "license": "Various", + "bugs": { + "url": "https://github.com/tomahawk-player/tomahawk-resolvers/issues" + }, + "homepage": "https://github.com/tomahawk-player/tomahawk-resolvers", + "dependencies": { + "buster": "^0.7.13", + "tomahawkjs": "^0.3.0" + } +} diff --git a/soundcloud/content/contents/code/test.js b/soundcloud/content/contents/code/test.js new file mode 100644 index 000000000..0e250b8da --- /dev/null +++ b/soundcloud/content/contents/code/test.js @@ -0,0 +1,42 @@ +var buster = require("buster"); +var TomahawkJS = require("tomahawkjs"); + +buster.testCase("soundcloud", { + setUp: function (done) { + var that = this; + // TODO: Make this path dynamic, maybe even freshly built the resolver first. + TomahawkJS.loadAxe('soundcloud/soundcloud-0.9.5.axe', function(err, axe) { + axe.getInstance(function(err, instance_context) { + that.instance = instance_context.instance; + that.context = instance_context.context; + that.instance.init(function (error) { + if (error) { + // TODO Loading failed, crash! + } else { + // Resolver loaded successfully, start testing. + done(); + } + }); + }); + }); + }, + + "test capabilities": function () { + buster.assert(this.context.hasCapability('urllookup')); + buster.refute(this.context.hasCapability('playlistsync')); + buster.refute(this.context.hasCapability('browsable')); + }, + + "test resolving": function (done) { + this.context.on('track-result', function (qid, result) { + buster.assert.equals("qid-001", qid); + buster.assert.equals("Bloc Party", result.artist); + buster.assert.equals("Ratchet", result.track); + // console.log(JSON.stringify(result)); + done(); + }); + // TODO: Mock web requests. + this.instance.resolve("qid-001", "Bloc Party", "", "Ratchet"); + } +}); + diff --git a/test/buster.js b/test/buster.js new file mode 100644 index 000000000..daf96f4ff --- /dev/null +++ b/test/buster.js @@ -0,0 +1,13 @@ +var config = module.exports; + +config["resolver tests"] = { + rootPath: "../", + environment: "node", + sources: [ + ], + tests: [ + "soundcloud/content/contents/code/test.js" + ] +} + +// Add more configuration groups as needed From 8e10e434121a6438169a87320e6e568680a3f9d4 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Sat, 24 May 2014 20:57:36 +0100 Subject: [PATCH 229/597] tomahawk-resolvers: use inbuilt asyncRequest instead of custom _request --- gmusic/content/contents/code/gmusic.js | 223 ++++++++----------------- 1 file changed, 67 insertions(+), 156 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index c06d28f80..39a11d7b1 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -1,5 +1,5 @@ /* Google Play Music resolver for Tomahawk. - * + * * Written in 2013 by Sam Hanes * Extensive modifications in 2014 by Lalit Maganti * @@ -10,7 +10,7 @@ * * You should have received a copy of the CC0 Public Domain Dedication * along with this software. If not, see: - * http://creativecommons.org/publicdomain/zero/1.0/ + * http://creativecommons.org/publicdomain/zero/1.0/ */ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { @@ -141,38 +141,44 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { var url = this._baseURL + 'trackfeed'; var that = this; - this._request( 'POST', url, function (request) { - if (200 != request.status) { - Tomahawk.log( - "Google Music search '" + query + "' failed:\n" - + request.status + " " - + request.statusText.trim() + "\n" - + request.responseText.trim() - ); - return; - } + Tomahawk.asyncRequest(url, + function (request) { + if (200 != request.status) { + Tomahawk.log( + "Google Music search '" + query + "' failed:\n" + + request.status + " " + + request.statusText.trim() + "\n" + + request.responseText.trim() + ); + return; + } - var response = JSON.parse( request.responseText ); - var results = { tracks: [], albums: [], artists: [] }; - for (var idx = 0; idx < response.data.items.length; idx++) { - var entry = response.data.items[ idx ]; - var lowerQuery = query.toLowerCase(); - if (entry.artist.toLowerCase() === lowerQuery - || entry.album.toLowerCase() === lowerQuery - || entry.title.toLowerCase() === lowerQuery) { - var artist = that._convertArtist(entry); - var album = that._convertAlbum(entry); - if (!that.containsObject(artist, results.artists)) { - results.artists.push(artist); - } - if (!that.containsObject(album, results.albums)) { - results.albums.push(album); + var response = JSON.parse( request.responseText ); + var results = { tracks: [], albums: [], artists: [] }; + for (var idx = 0; idx < response.data.items.length; idx++) { + var entry = response.data.items[ idx ]; + var lowerQuery = query.toLowerCase(); + if (entry.artist.toLowerCase() === lowerQuery + || entry.album.toLowerCase() === lowerQuery + || entry.title.toLowerCase() === lowerQuery) { + var artist = that._convertArtist(entry); + var album = that._convertAlbum(entry); + if (!that.containsObject(artist, results.artists)) { + results.artists.push(artist); + } + if (!that.containsObject(album, results.albums)) { + results.albums.push(album); + } + results.tracks.push(that._convertTrack(entry)); } - results.tracks.push(that._convertTrack(entry)); } - } - callback.call( window, results ); - }); + callback.call( window, results ); + }, { + 'Content-type': 'application/x-www-form-urlencoded', + 'Authorization': 'GoogleLogin auth=' + this._token, + }, { + method: 'POST' + }); }, search: function (qid, query) { @@ -240,6 +246,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { + '=' + urn.id; Tomahawk.reportStreamUrl(qid, url, { + 'Content-type': 'application/x-www-form-urlencoded', 'Authorization': 'GoogleLogin auth=' + this._token, 'X-Device-ID' : this._deviceId }); @@ -247,8 +254,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { _loadSettings: function (callback) { var that = this; - that._request( - 'POST', that._webURL + Tomahawk.asyncRequest(that._webURL + 'services/loadsettings?u=0&xt=' + encodeURIComponent( that._xt ), function (request) { @@ -288,7 +294,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { that._deviceId = device.id.slice( 2 ); Tomahawk.log(that._deviceId); - Tomahawk.log( that.settings.name + Tomahawk.log( that.settings.name + " using device ID from " + device.carrier + " " + device.manufacturer + " " @@ -306,15 +312,20 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { + " and log in to your account." ); } - }, - { 'Content-Type': 'application/json' }, - JSON.stringify({ 'sessionId': '' }) + }, { + 'Content-type': 'application/x-www-form-urlencoded', + 'Authorization': 'GoogleLogin auth=' + this._token, + 'Content-Type': 'application/json' + }, { + method: 'POST', + body: JSON.stringify({ 'sessionId': '' }) + } ); }, _loadWebToken: function (callback) { var that = this; - that._request( 'HEAD', that._webURL + 'listen', + Tomahawk.asyncRequest(that._webURL + 'listen', function (request) { if (200 != request.status) { Tomahawk.log( "request for xt cookie failed:" @@ -333,11 +344,14 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { Tomahawk.log( "xt cookie missing" ); return; } + }, { + 'Authorization': 'GoogleLogin auth=' + this._token + }, { + method: 'HEAD' } ); }, - /** Called when the login process is completed. * @callback loginCB */ @@ -345,8 +359,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { /** Asynchronously authenticates with the SkyJam service. * Only one login attempt will run at a time. If a login request is * already pending the callback (if one is provided) will be queued - * to run when it is complete. - * + * to run when it is complete. + * * @param {loginCB} [callback] a function to be called on completion */ _login: function (callback) { @@ -363,14 +377,13 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { var that = this; var name = this.settings.name; - this._request( - 'POST', 'https://www.google.com/accounts/ClientLogin', + Tomahawk.asyncRequest('https://www.google.com/accounts/ClientLogin', function (request) { if (200 == request.status) { that._token = request.responseText .match( /^Auth=(.*)$/m )[ 1 ]; that._loginLock = false; - + Tomahawk.log( name + " logged in successfully" ); for (var idx = 0; idx < that._loginCallbacks.length; idx++) { @@ -378,122 +391,20 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { } that._loginCallbacks = null; } else { - Tomahawk.log( - name + " login failed:\n" + Tomahawk.log(name + " login failed:\n" + request.status + " " + request.statusText.trim() + "\n" - + request.responseText.trim() - ); + + request.responseText.trim()); } - }, null, - { 'accountType': 'HOSTED_OR_GOOGLE', - 'Email': that._email.trim(), - 'Passwd': that._password.trim(), - 'service': 'sj', - 'source': 'tomahawk-gmusic-' + that._version - }, true - ); - }, - - /** Called when an HTTP request is completed. - * @callback requestCB - * @param {XMLHttpRequest} request the completed request - */ - - /** Sends an asynchronous HTTP request. - * - * If an authentication token is available it will be sent. - * Unless {@code nologin} is set, if the server returns 401 - * {@link #_login} will be called and the request will be retried. - * Automatic login will only be attempted once per request. If 401 - * is returned again after logging in the request will be handled - * as normal. - * - * If {@code body} is not provided the request will be sent without - * an entity. If a body is provided it must be of a type supported - * by {@code XMLHttpRequest}. As a special case, if an object is - * provided it will be interpreted as form parameters and encoded - * as {@code application/x-www-form-urlencoded}. - * - * @param {string} method the HTTP method to use - * @param {string} url the URL to request - * @param {requestCB} callback completion callback function - * @param {object} [headers] additional request headers - * @param {string|object} [body] the request entity to be sent - * @param {boolean} [nologin=false] - * whether to suppress automatic re-authentication - */ - _request: function (method, url, callback, headers, body, nologin) { - var that = this; - var args = arguments; - - // if we're waiting for a login, queue the request - if (!nologin && this._loginLock) { - this._loginCallbacks.push( function() { - args[ 5 ] = true; // set nologin - that._request.apply( that, args ); - } ); - return; - } - - var request = new XMLHttpRequest(); - request.open( method, url, true ); - - // prevent useless parsing of the response - request.responseType = 'text'; - - // add the authentication token if we have one - if (this._token) request.setRequestHeader( - 'Authorization', 'GoogleLogin auth=' + this._token ); - - // add extra request headers - if (headers) for (var name in headers) - request.setRequestHeader( name, headers[ name ] ); - - // add extra request headers - for (var name in request.headers) - Tomahawk.log(name); - - var name = this.settings.name; - request.onreadystatechange = function() { - if (4 != request.readyState) return; - - // log in and retry if necessary - if (401 == request.status && !nologin) { - Tomahawk.log( name + ' login expired, re-authenticating' ); - that._login( function() { - args[ 5 ] = true; // set nologin - that._request.apply( that, args ); - }); - } else { - callback.call( window, request ); - } - } - - // if body given as object encode as x-www-form-urlencoded - if ('object' == typeof body) { - request.setRequestHeader( 'Content-Type', - 'application/x-www-form-urlencoded' ); - - function encode (value) { - // close enough to x-www-form-urlencoded - return encodeURIComponent( value ).replace( '%20', '+' ); - } - - var postdata = ""; - for (var name in body) { - postdata += '&' + encode( name ) - + '=' + encode( body[ name ] ); + }, { + 'Content-type': 'application/x-www-form-urlencoded' + }, { + method: 'POST', + data: "accountType=HOSTED_OR_GOOGLE&Email=" + that._email.trim() + + "&Passwd=" + that._password.trim() + "&service=sj&source=tomahawk-gmusic-" + + that._version } - - body = postdata.substring( 1 ); - } - - if (body) { - request.send( body ); - } else { - request.send(); - } + ); }, containsObject: function (obj, list) { From 27ce24a02ea0a1510cf1b2d6d00b4b842bf4fd3f Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Sat, 24 May 2014 20:59:15 +0100 Subject: [PATCH 230/597] tomahawk-resolvers: readd empty scripts section to Google Music resolver --- gmusic/content/metadata.json | 37 ++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index 35092dc9e..b505d830c 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -1,18 +1,19 @@ -{ - "name": "Google Play Music", - "pluginName": "gmusic", - "author": "Sam Hanes, Lalit Maganti", - "email": "sam@maltera.com, lalitmaganti@gmail.com", - "version": "0.2", - "website": "http://gettomahawk.com", - "description": "Streams music from Google Play Music.", - "type": "resolver/javascript", - "manifest": { - "main": "contents/code/gmusic.js", - "icon": "contents/images/icon.png", - "resources": [ - "contents/code/config.ui", - "contents/code/play-logo.png" - ] - } -} +{ + "name": "Google Play Music", + "pluginName": "gmusic", + "author": "Sam Hanes, Lalit Maganti", + "email": "sam@maltera.com, lalitmaganti@gmail.com", + "version": "0.2", + "website": "http://gettomahawk.com", + "description": "Streams music from Google Play Music.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/gmusic.js", + "icon": "contents/images/icon.png", + "scripts": [], + "resources": [ + "contents/code/config.ui", + "contents/code/play-logo.png" + ] + } +} From d66ca8543c31ee3a98ddba83ee5111087f44e8b4 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Sat, 24 May 2014 21:08:51 +0100 Subject: [PATCH 231/597] tomahawk-android: add more information to Google Music tracks --- gmusic/content/contents/code/gmusic.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 39a11d7b1..c49b7fb1a 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -118,10 +118,19 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { _convertTrack: function (entry) { return { artist: entry.artist, + album: entry.album, + track: entry.title, + year: entry.year, + + albumpos: entry.trackNumber, + discnumber: entry.discNumber, + + size: entry.estimatedSize, duration: entry.durationMillis / 1000, + source: "Google Music", - track: entry.title, url: 'gmusic://track/' + entry.id, + checked: true }; }, From 05c867bb6c06578bde65ecf209cb839c9dcc5260 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 24 May 2014 20:28:20 +0100 Subject: [PATCH 232/597] [gmusic] Remove check for CrytoJS, this should be done via api version --- gmusic/content/contents/code/gmusic.js | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index c49b7fb1a..8a4e086c0 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -62,32 +62,6 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { return; } - // check that we have all the needed CryptoJS modules - { var error = false; - if (error |= 'object' !== typeof CryptoJS) { - Tomahawk.log( "CryptoJS missing" ); - } else { - if (error |= 'object' !== typeof CryptoJS.algo.HMAC) - Tomahawk.log( "CryptoJS.algo.HMAC missing" ); - - if (error |= 'object' !== typeof CryptoJS.algo.SHA1) - Tomahawk.log( "CryptoJS.algo.SHA1 missing" ); - - if (error |= 'object' !== typeof CryptoJS.enc.Base64) - Tomahawk.log( "CryptoJS.enc.Base64 missing" ); - } - - if (error) { - Tomahawk.log( "Required CryptoJS modules are missing." - + " Did cryptojs.js get loaded? Some versions" - + " of Tomahawk don't load extra scripts when" - + " installing unpacked resolvers. Try making" - + " an AXE and installing it instead." - ); - return; - } - } - // load signing key { var s1 = CryptoJS.enc.Base64.parse( 'VzeC4H4h+T2f0VI180nVX8x+Mb5HiTtGnKgH52Otj8ZCGDz9jRW' From 592b34aff18a53f4367165988537c826b709e8f1 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 24 May 2014 20:40:16 +0100 Subject: [PATCH 233/597] [gmusic] Cache response for 5min --- gmusic/content/contents/code/gmusic.js | 79 ++++++++++++++------------ 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 8a4e086c0..c0dd0c817 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -15,6 +15,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { settings: { + cacheTime: 300, name: 'Google Play Music', icon: '../images/icon.png', weight: 90, @@ -120,48 +121,52 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { return entry.artist; }, - _execSearch: function (query, callback, max_results) { - var url = this._baseURL + 'trackfeed'; - - var that = this; - Tomahawk.asyncRequest(url, - function (request) { - if (200 != request.status) { - Tomahawk.log( - "Google Music search '" + query + "' failed:\n" - + request.status + " " - + request.statusText.trim() + "\n" - + request.responseText.trim() - ); - return; - } - - var response = JSON.parse( request.responseText ); - var results = { tracks: [], albums: [], artists: [] }; - for (var idx = 0; idx < response.data.items.length; idx++) { - var entry = response.data.items[ idx ]; - var lowerQuery = query.toLowerCase(); - if (entry.artist.toLowerCase() === lowerQuery - || entry.album.toLowerCase() === lowerQuery - || entry.title.toLowerCase() === lowerQuery) { - var artist = that._convertArtist(entry); - var album = that._convertAlbum(entry); - if (!that.containsObject(artist, results.artists)) { - results.artists.push(artist); - } - if (!that.containsObject(album, results.albums)) { - results.albums.push(album); - } - results.tracks.push(that._convertTrack(entry)); - } - } - callback.call( window, results ); + _getData: function (callback) { + if (this.hasOwnProperty('cachedRequest') && this.cachedRequest.time + this.settings.cacheTime > Date.now()) { + callback(this.cachedRequest.response); + } else { + var that = this; + var url = this._baseURL + 'trackfeed'; + Tomahawk.asyncRequest(url, function (request) { + that.cachedRequest = { + response: JSON.parse( request.responseText ), + time: Date.now() + }; + callback(that.cachedRequest.response); }, { 'Content-type': 'application/x-www-form-urlencoded', 'Authorization': 'GoogleLogin auth=' + this._token, }, { method: 'POST' }); + } + }, + + _execSearch: function (query, callback, max_results) { + + var that = this; + this._getData(function (response) { + var results = { tracks: [], albums: [], artists: [] }; + for (var idx = 0; idx < response.data.items.length; idx++) { + var entry = response.data.items[ idx ]; + var lowerQuery = query.toLowerCase(); + if (entry.artist.toLowerCase() === lowerQuery + || entry.album.toLowerCase() === lowerQuery + || entry.title.toLowerCase() === lowerQuery) { + var artist = that._convertArtist(entry); + var album = that._convertAlbum(entry); + if (!that.containsObject(artist, results.artists)) { + results.artists.push(artist); + } + if (!that.containsObject(album, results.albums)) { + results.albums.push(album); + } + results.tracks.push(that._convertTrack(entry)); + } + } + callback.call( window, results ); + }); + }, search: function (qid, query) { @@ -169,7 +174,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._execSearch( query, function (results) { Tomahawk.addTrackResults( - { 'qid': qid, 'results': results.tracks } ); + { 'qid': qid, 'results': results.tracks } ); Tomahawk.addAlbumResults( { 'qid': qid, 'results': results.albums } ); Tomahawk.addArtistResults( From fe2c58a629ed9939e93e164176a72d20a3bab8a0 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 24 May 2014 21:02:22 +0100 Subject: [PATCH 234/597] [gmusic] Add collection support --- gmusic/content/contents/code/gmusic.js | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index c0dd0c817..05dd0864b 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -59,6 +59,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._password = config.password; if (!this._email || !this._password) { + Tomahawk.reportCapabilities(TomahawkResolverCapability.NullCapability); Tomahawk.log( name + " resolver not configured." ); return; } @@ -84,6 +85,11 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._login( function() { that._loadWebToken( function() { that._loadSettings( function() { + that._getData(function (response) { + that.trackCount = response.data.items.length; + Tomahawk.log("Reporting collection"); + Tomahawk.reportCapabilities(TomahawkResolverCapability.Browsable); + }); that._ready = true; }); }); @@ -404,6 +410,67 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { } return false; + }, + + // Script Collection Support + + artists: function (qid) { + this._getData(function (response) { + var names = response.data.items.map(function (item) { + return item.artist; + }); + var unique_names = names.filter(function (item, pos) { + return names.indexOf(item) == pos; + }); + Tomahawk.addArtistResults({ + qid: qid, + artists: unique_names + }); + }); + }, + + albums: function (qid, artist) { + this._getData(function (response) { + var names = response.data.items.filter(function (item) { + return item.artist == artist; + }).map(function (item) { + return item.album; + }); + var unique_names = names.filter(function (item, pos) { + return names.indexOf(item) == pos; + }); + Tomahawk.addAlbumResults({ + qid: qid, + artist: artist, + albums: unique_names + }); + }); + }, + + tracks: function (qid, artist, album) { + var that = this; + this._getData(function (response) { + var tracks = response.data.items.filter(function (item) { + return item.artist == artist && item.album == album; + }).map(function (item) { + return that._convertTrack(item); + }); + Tomahawk.addAlbumTrackResults({ + qid: qid, + artist: artist, + album: album, + results: tracks + }); + }); + }, + + collection: function () { + return { + prettyname: "Google Music", + description: this._email, + iconfile: '../images/icon.png', + trackcount: this.trackCount + }; } }); From 68caf11fc2fcd2bfa23d35f39493edafe9e6b060 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 25 May 2014 11:05:29 +0100 Subject: [PATCH 235/597] [soundcloud] Don't return an undefined result --- soundcloud/content/contents/code/soundcloud.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/soundcloud/content/contents/code/soundcloud.js b/soundcloud/content/contents/code/soundcloud.js index b354fb835..909d8a0dd 100644 --- a/soundcloud/content/contents/code/soundcloud.js +++ b/soundcloud/content/contents/code/soundcloud.js @@ -167,10 +167,14 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { results.push(result); } } - Tomahawk.addTrackResults({ - qid: qid, - results: [results[0]] - }); + if (results.length > 0) { + Tomahawk.addTrackResults({ + qid: qid, + results: [results[0]] + }); + } else { + Tomahawk.addTrackResults(empty); + } } else { Tomahawk.addTrackResults(empty); } From 3d2f80076c1aee227c57cefb49b1e35abbd02e72 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 25 May 2014 11:13:19 +0100 Subject: [PATCH 236/597] [soundcloud] Mock resolver HTTP request --- package.json | 1 + soundcloud/content/contents/code/test.js | 61 +++++++++++++++++++++++- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 13799a390..23132d235 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "homepage": "https://github.com/tomahawk-player/tomahawk-resolvers", "dependencies": { "buster": "^0.7.13", + "nock": "^0.32.0", "tomahawkjs": "^0.3.0" } } diff --git a/soundcloud/content/contents/code/test.js b/soundcloud/content/contents/code/test.js index 0e250b8da..d2637077e 100644 --- a/soundcloud/content/contents/code/test.js +++ b/soundcloud/content/contents/code/test.js @@ -1,4 +1,5 @@ var buster = require("buster"); +var nock = require("nock"); var TomahawkJS = require("tomahawkjs"); buster.testCase("soundcloud", { @@ -32,10 +33,66 @@ buster.testCase("soundcloud", { buster.assert.equals("qid-001", qid); buster.assert.equals("Bloc Party", result.artist); buster.assert.equals("Ratchet", result.track); - // console.log(JSON.stringify(result)); done(); }); - // TODO: Mock web requests. + // This is not the original reponse but one of the answer slightly adjusted + nock("https://api.soundcloud.com") + .get("/tracks.json?consumer_key=TiNg2DRYhBnp01DA3zNag&filter=streamable&q=Bloc%20Party+Ratchet") + .reply(200, JSON.stringify([ + { + "kind": "track", + "id": 112482070, + "created_at": "2013/09/25 21:51:32 +0000", + "user_id": 932254, + "duration": 1249970, + "commentable": true, + "state": "finished", + "original_content_size": 49995285, + "sharing": "public", + "tag_list": "kele okereke bloc party tapes k7 records dj mix cd download", + "permalink": "20-min-snippet", + "streamable": true, + "embeddable_by": "all", + "downloadable": false, + "purchase_url": null, + "label_id": null, + "purchase_title": null, + "genre": "Dance", + "title": "Bloc Party - Ratchet", + "description": "<--truncated-->", + "label_name": "", + "release": "", + "track_type": "recording", + "key_signature": "", + "isrc": "", + "video_url": null, + "bpm": null, + "release_year": null, + "release_month": null, + "release_day": null, + "original_format": "mp3", + "license": "all-rights-reserved", + "uri": "https://api.soundcloud.com/tracks/112482070", + "user": { + "id": 932254, + "kind": "user", + "permalink": "keleokereke", + "username": "Kele Okereke", + "uri": "https://api.soundcloud.com/users/932254", + "permalink_url": "http://soundcloud.com/keleokereke", + "avatar_url": "https://i1.sndcdn.com/avatars-000056100835-hnk1ji-large.jpg?30a2558" + }, + "permalink_url": "http://soundcloud.com/keleokereke/20-min-snippet", + "artwork_url": "https://i1.sndcdn.com/artworks-000059074336-nf414w-large.jpg?30a2558", + "waveform_url": "https://w1.sndcdn.com/nprcFygtaWnU_m.png", + "stream_url": "https://api.soundcloud.com/tracks/112482070/stream", + "playback_count": 38057, + "download_count": 0, + "favoritings_count": 679, + "comment_count": 39, + "attachments_uri": "https://api.soundcloud.com/tracks/112482070/attachments" + } + ])); this.instance.resolve("qid-001", "Bloc Party", "", "Ratchet"); } }); From 0c3116da3a17a31e8377c541062174094fe3bce6 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 25 May 2014 11:21:53 +0100 Subject: [PATCH 237/597] [soundcloud] Add deferred tests for search and UrlLookup --- soundcloud/content/contents/code/test.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/soundcloud/content/contents/code/test.js b/soundcloud/content/contents/code/test.js index d2637077e..5be704730 100644 --- a/soundcloud/content/contents/code/test.js +++ b/soundcloud/content/contents/code/test.js @@ -94,6 +94,12 @@ buster.testCase("soundcloud", { } ])); this.instance.resolve("qid-001", "Bloc Party", "", "Ratchet"); + }, + + "// test search": function () { + }, + + "// test url lookup": function () { } }); From 0507682bf98ee05fb02fbd6653accd75faa0e40e Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Wed, 28 May 2014 17:45:43 +0200 Subject: [PATCH 238/597] Lint + fix for THR-76. --- .../content/contents/code/soundcloud.js | 129 +++++++++--------- soundcloud/content/metadata.json | 2 +- 2 files changed, 69 insertions(+), 62 deletions(-) diff --git a/soundcloud/content/contents/code/soundcloud.js b/soundcloud/content/contents/code/soundcloud.js index 909d8a0dd..da75c7f24 100644 --- a/soundcloud/content/contents/code/soundcloud.js +++ b/soundcloud/content/contents/code/soundcloud.js @@ -111,6 +111,7 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { resolve: function (qid, artist, album, title) { + var query; if (artist !== "") { query = encodeURIComponent(artist) + "+"; } @@ -130,7 +131,7 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { for (i = 0; i < resp.length; i++) { // Need some more validation here // This doesnt help it seems, or it just throws the error anyhow, and skips? - if (typeof(resp[i]) == 'undefined' || resp[i] == null) { + if (typeof(resp[i]) == 'undefined' || resp[i] === null) { continue; } @@ -139,11 +140,15 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { continue; } - if (typeof(resp[i].title) != 'undefined' && resp[i].title != null) { + if (typeof(resp[i].title) != 'undefined' && resp[i].title !== null) { // Check whether the artist and title (if set) are in the returned title, discard otherwise // But also, the artist could be the username - if (resp[i].title.toLowerCase().indexOf(artist.toLowerCase()) === -1) continue; - if (resp[i].title.toLowerCase().indexOf(title.toLowerCase()) === -1) continue; + if (resp[i].title.toLowerCase().indexOf(artist.toLowerCase()) === -1){ + continue; + } + if (resp[i].title.toLowerCase().indexOf(title.toLowerCase()) === -1){ + continue; + } var result = { artist: artist, @@ -161,7 +166,7 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { result.duration = resp[i].duration / 1000; result.year = resp[i].release_year; result.url = resp[i].stream_url + ".json?client_id=TiNg2DRYhBnp01DA3zNag"; - if (typeof(resp[i].permalink_url) != 'undefined' && resp[i].permalink_url != null) { + if (typeof(resp[i].permalink_url) != 'undefined' && resp[i].permalink_url !== null) { result.linkUrl = resp[i].permalink_url; } results.push(result); @@ -249,7 +254,9 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { result.score = 0.85; result.year = resp[i].release_year; result.url = resp[i].stream_url + ".json?client_id=TiNg2DRYhBnp01DA3zNag"; - if (resp[i].permalink_url !== undefined) result.linkUrl = resp[i].permalink_url; + if (resp[i].permalink_url !== undefined){ + result.linkUrl = resp[i].permalink_url; + } (function (i, result) { var artist = encodeURIComponent(result.artist.capitalize()); @@ -304,7 +311,7 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { // case TomahawkUrlType.Track: // case TomahawkUrlType.Any: default: - return /https?:\/\/(www\.)?soundcloud.com\//.test(url); + return (/https?:\/\/(www\.)?soundcloud.com\//).test(url); } }, @@ -315,69 +322,69 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { artist: track.user.username }; - if (!(track.stream_url == null || typeof track.stream_url === "undefined")) { + if (!(track.stream_url === null || typeof track.stream_url === "undefined")) { result.hint = track.stream_url + "?client_id=" + this.clientId; } return result; }, - lookupUrl: function (url) { + lookupUrl: function (url) { var query = "https://api.soundcloud.com/resolve.json?client_id=" + this.clientId + "&url=" + encodeURIComponent(url.replace(/\/likes$/, '')); var that = this; Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); - if (res.kind == "playlist") { - var result = { - type: "playlist", - title: res.title, - guid: 'soundcloud-playlist-' + res.id.toString(), - info: res.description, - creator: res.user.username, - url: res.permalink_url, - tracks: [] - }; - res.tracks.forEach(function (item) { - result.tracks.push(that.track2Result(item)); - }); - Tomahawk.addUrlResult(url, result); - } else if (res.kind == "track") { - Tomahawk.addUrlResult(url, that.track2Result(res)); - } else if (res.kind == "user") { - var url2 = res.uri; - var prefix = 'soundcloud-'; - var title = res.full_name + "'s "; - if (url.indexOf("/likes") === -1) { - url2 += "/tracks.json?client_id=" + that.clientId; - prefix += 'user-'; - title += "Tracks"; - } else { - url2 += "/favorites.json?client_id=" + that.clientId; - prefix += 'favortites-'; - title += "Favorites"; - } - Tomahawk.asyncRequest(url2, function (xhr2) { - var res2 = JSON.parse(xhr2.responseText); - var result = { - type: "playlist", - title: title, - guid: prefix + res.id.toString(), - info: title, - creator: res.username, - url: res2.permalink_url, - tracks: [] - }; - res2.forEach(function (item) { - result.tracks.push(that.track2Result(item)); - }); - Tomahawk.addUrlResult(url, result); - }); - return; - } else { - Tomahawk.log("Could not parse SoundCloud URL: " + url); - Tomahawk.addUrlResult(url, {}) - } - }); - } + if (res.kind == "playlist") { + var result = { + type: "playlist", + title: res.title, + guid: 'soundcloud-playlist-' + res.id.toString(), + info: res.description, + creator: res.user.username, + url: res.permalink_url, + tracks: [] + }; + res.tracks.forEach(function (item) { + result.tracks.push(that.track2Result(item)); + }); + Tomahawk.addUrlResult(url, result); + } else if (res.kind == "track") { + Tomahawk.addUrlResult(url, that.track2Result(res)); + } else if (res.kind == "user") { + var url2 = res.uri; + var prefix = 'soundcloud-'; + var title = res.full_name + "'s "; + if (url.indexOf("/likes") === -1) { + url2 += "/tracks.json?client_id=" + that.clientId; + prefix += 'user-'; + title += "Tracks"; + } else { + url2 += "/favorites.json?client_id=" + that.clientId; + prefix += 'favortites-'; + title += "Favorites"; + } + Tomahawk.asyncRequest(url2, function (xhr2) { + var res2 = JSON.parse(xhr2.responseText); + var result = { + type: "playlist", + title: title, + guid: prefix + res.id.toString(), + info: title, + creator: res.username, + url: res2.permalink_url, + tracks: [] + }; + res2.forEach(function (item) { + result.tracks.push(that.track2Result(item)); + }); + Tomahawk.addUrlResult(url, result); + }); + return; + } else { + Tomahawk.log("Could not parse SoundCloud URL: " + url); + Tomahawk.addUrlResult(url, {}); + } + }); + } }); Tomahawk.resolver.instance = SoundcloudResolver; diff --git a/soundcloud/content/metadata.json b/soundcloud/content/metadata.json index 8a7d36f62..f8cfa1bac 100644 --- a/soundcloud/content/metadata.json +++ b/soundcloud/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "soundcloud", "author": "Thierry Göckel", "email": "thierry@strayrayday.lu", - "version": "0.9.5", + "version": "0.9.6", "website": "http://gettomahawk.com", "description": "Resolves to playable tracks on SoundCloud, including live, cover and remixed versions if specified", "type": "resolver/javascript", From 4e0263bd8628b125a3f19f717a7b9bf28f6ec2d1 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 28 May 2014 17:32:50 +0100 Subject: [PATCH 239/597] [soundcloud] bump version in test --- soundcloud/content/contents/code/test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soundcloud/content/contents/code/test.js b/soundcloud/content/contents/code/test.js index 5be704730..f47c9ae32 100644 --- a/soundcloud/content/contents/code/test.js +++ b/soundcloud/content/contents/code/test.js @@ -6,7 +6,7 @@ buster.testCase("soundcloud", { setUp: function (done) { var that = this; // TODO: Make this path dynamic, maybe even freshly built the resolver first. - TomahawkJS.loadAxe('soundcloud/soundcloud-0.9.5.axe', function(err, axe) { + TomahawkJS.loadAxe('soundcloud/soundcloud-0.9.6.axe', function(err, axe) { axe.getInstance(function(err, instance_context) { that.instance = instance_context.instance; that.context = instance_context.context; From b73dd319f98284062ab3ba5b0b94cbda53713282 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 28 May 2014 17:33:17 +0100 Subject: [PATCH 240/597] [soundcloud] Fix: 'The object literal notation {} is preferable.' --- soundcloud/content/contents/code/soundcloud.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soundcloud/content/contents/code/soundcloud.js b/soundcloud/content/contents/code/soundcloud.js index da75c7f24..eeb122027 100644 --- a/soundcloud/content/contents/code/soundcloud.js +++ b/soundcloud/content/contents/code/soundcloud.js @@ -204,7 +204,7 @@ var SoundcloudResolver = Tomahawk.extend(TomahawkResolver, { stop = stop - 1; continue; } - var result = new Object(); + var result = {}; if (that.getTrack(resp[i].title, "")){ var track = resp[i].title; From 506f6922df90de0de586b6258e0e8c17d7ba5de0 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 1 Jun 2014 16:06:16 +0100 Subject: [PATCH 241/597] [beatsmusic] Use UrlHandler instead of UrlTranslator --- beatsmusic/content/contents/code/beatsmusic.js | 4 ++-- beatsmusic/content/metadata.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 68bc9e7ef..c1acee22e 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -98,7 +98,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); - Tomahawk.addCustomUrlTranslator("beatsmusic", "getStreamUrl", true); + Tomahawk.addCustomUrlHandler("beatsmusic", "getStreamUrl", true); // re-login every 50 minutes setInterval((function(self) { return function() { self.login(); }; })(this), 1000*60*50); @@ -139,7 +139,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { var trackId = url.replace("beatsmusic://track/", ""); Tomahawk.asyncRequest(this.endpoint + "/api/tracks/" + trackId + "/audio?acquire=1&bitrate=highest&access_token=" + this.accessToken, function (xhr) { var res = JSON.parse(xhr.responseText); - Tomahawk.reportUrlTranslation(qid, res.data.location + "/?slist=" + res.data.resource); + Tomahawk.reportStreamUrl(qid, res.data.location + "/?slist=" + res.data.resource); }); }, diff --git a/beatsmusic/content/metadata.json b/beatsmusic/content/metadata.json index 28ad052d2..74d6c29c0 100644 --- a/beatsmusic/content/metadata.json +++ b/beatsmusic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "beatsmusic", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.0", + "version": "0.1.1", "website": "http://gettomahawk.com", "description": "Stream music from Beats.", "type": "resolver/javascript", From e1d102f4af4b45cbcefa65c589be19de1743d3df Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 1 Jun 2014 20:34:10 +0100 Subject: [PATCH 242/597] [soundcloud] Read version from metadata.json --- soundcloud/content/contents/code/test.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/soundcloud/content/contents/code/test.js b/soundcloud/content/contents/code/test.js index f47c9ae32..ccd00e7d8 100644 --- a/soundcloud/content/contents/code/test.js +++ b/soundcloud/content/contents/code/test.js @@ -1,12 +1,13 @@ var buster = require("buster"); +var fs = require('fs'); var nock = require("nock"); var TomahawkJS = require("tomahawkjs"); buster.testCase("soundcloud", { setUp: function (done) { var that = this; - // TODO: Make this path dynamic, maybe even freshly built the resolver first. - TomahawkJS.loadAxe('soundcloud/soundcloud-0.9.6.axe', function(err, axe) { + this.metadata = JSON.parse(fs.readFileSync('soundcloud/content/metadata.json')) + TomahawkJS.loadAxe('soundcloud/soundcloud-' + this.metadata.version + '.axe', function(err, axe) { axe.getInstance(function(err, instance_context) { that.instance = instance_context.instance; that.context = instance_context.context; From f83a3e25b4a262beaab793a79fd97af245974ed0 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 1 Jun 2014 20:56:29 +0100 Subject: [PATCH 243/597] [test] Add utils --- soundcloud/content/contents/code/test.js | 20 ++------------------ test/utils.js | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 test/utils.js diff --git a/soundcloud/content/contents/code/test.js b/soundcloud/content/contents/code/test.js index ccd00e7d8..0e80c9d74 100644 --- a/soundcloud/content/contents/code/test.js +++ b/soundcloud/content/contents/code/test.js @@ -1,26 +1,10 @@ var buster = require("buster"); -var fs = require('fs'); var nock = require("nock"); -var TomahawkJS = require("tomahawkjs"); +var utils = require("../../../../test/utils.js"); buster.testCase("soundcloud", { setUp: function (done) { - var that = this; - this.metadata = JSON.parse(fs.readFileSync('soundcloud/content/metadata.json')) - TomahawkJS.loadAxe('soundcloud/soundcloud-' + this.metadata.version + '.axe', function(err, axe) { - axe.getInstance(function(err, instance_context) { - that.instance = instance_context.instance; - that.context = instance_context.context; - that.instance.init(function (error) { - if (error) { - // TODO Loading failed, crash! - } else { - // Resolver loaded successfully, start testing. - done(); - } - }); - }); - }); + utils.loadResolver('soundcloud', this, done); }, "test capabilities": function () { diff --git a/test/utils.js b/test/utils.js new file mode 100644 index 000000000..8e83b11e9 --- /dev/null +++ b/test/utils.js @@ -0,0 +1,20 @@ +var fs = require('fs'); +var TomahawkJS = require("tomahawkjs"); + +module.exports.loadResolver = function (name, owner, done) { + owner.metadata = JSON.parse(fs.readFileSync(name + '/content/metadata.json')) + TomahawkJS.loadAxe(name + '/' + name + '-' + owner.metadata.version + '.axe', function(err, axe) { + axe.getInstance(function(err, instance_context) { + owner.instance = instance_context.instance; + owner.context = instance_context.context; + owner.instance.init(function (error) { + if (error) { + // TODO Loading failed, crash! + } else { + // Resolver loaded successfully, start testing. + done(); + } + }); + }); + }); +}; From 79ae5fa6e7b43f156c480dc8e6f7234b699c5a16 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 3 Jun 2014 13:40:22 +0100 Subject: [PATCH 244/597] [gmusic] Delete the cache if the user changes --- gmusic/content/contents/code/gmusic.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 05dd0864b..189f39b21 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -47,9 +47,15 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { newConfigSaved: function() { var config = this.getUserConfig(); - if (this._email !== config.email - || this._password !== config.password) + if (this._email !== config.email || this._password !== config.password) { this.init(); + this.invalidateCache(); + } + }, + + invalidateCache: function() { + delete this.cachedRequest.response; + // Tomahawk.deleteFuzzyIndex(); }, init: function() { From 2dd75474519c58972f021668bdc856e4b5231cbd Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 3 Jun 2014 16:09:48 +0100 Subject: [PATCH 245/597] [gmusic] Use fuzzy index for resolving --- gmusic/content/contents/code/gmusic.js | 46 +++++++++++++++++++++----- gmusic/content/metadata.json | 2 +- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 189f39b21..288191d33 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -48,14 +48,14 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { newConfigSaved: function() { var config = this.getUserConfig(); if (this._email !== config.email || this._password !== config.password) { - this.init(); this.invalidateCache(); + this.init(); } }, invalidateCache: function() { - delete this.cachedRequest.response; - // Tomahawk.deleteFuzzyIndex(); + delete this.cachedRequest; + Tomahawk.deleteFuzzyIndex(); }, init: function() { @@ -140,10 +140,32 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { var that = this; var url = this._baseURL + 'trackfeed'; Tomahawk.asyncRequest(url, function (request) { + var oldMD5 = ""; + if (that.hasOwnProperty('cachedRequest')) { + oldMD5 = that.cachedRequest.md5; + } that.cachedRequest = { response: JSON.parse( request.responseText ), + md5: CryptoJS.MD5(request.responseText), time: Date.now() }; + + // Check if we need to update the cache. + if (oldMD5 != that.cachedRequest.md5) { + // Recreate fuzzy index + var indexList = []; + for (var idx = 0; idx < that.cachedRequest.response.data.items.length; idx++) { + var entry = that.cachedRequest.response.data.items[ idx ]; + indexList.push({ + id: idx, + artist: entry.artist, + album: entry.album, + track: entry.title + }); + } + Tomahawk.createFuzzyIndex(indexList); + } + callback(that.cachedRequest.response); }, { 'Content-type': 'application/x-www-form-urlencoded', @@ -195,16 +217,24 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }, resolve: function (qid, artist, album, title) { + var that = this; if (!this._ready) return; - var query = title; - this._execSearch( query, function (results) { - if (results.tracks.length > 0) { - Tomahawk.addTrackResults({ 'qid': qid, 'results': [ results.tracks[0] ] } ); + + // Ensure that the recent data was loaded + this._getData(function (response) { + var resultIds = Tomahawk.resolveFromFuzzyIndex(artist, album, title); + if (resultIds.length > 0) { + Tomahawk.addTrackResults({ + 'qid': qid, + 'results': [ + that._convertTrack(response.data.items[resultIds[0][0]]) + ] + }); } else { // no matches, don't wait for the timeout Tomahawk.addTrackResults({ 'qid': qid, 'results': [] }); } - }, 1 ); + }); }, _parseUrn: function (urn) { diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index b505d830c..19935715a 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "gmusic", "author": "Sam Hanes, Lalit Maganti", "email": "sam@maltera.com, lalitmaganti@gmail.com", - "version": "0.2", + "version": "0.3", "website": "http://gettomahawk.com", "description": "Streams music from Google Play Music.", "type": "resolver/javascript", From 9caa8874606c7c6a12a37ebd1fee63d5e0f4bd23 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Wed, 4 Jun 2014 00:08:13 +0100 Subject: [PATCH 246/597] [gmusic]: add All Access resolving, searching and streaming --- gmusic/content/contents/code/gmusic.js | 157 ++++++++++++++++++++----- 1 file changed, 125 insertions(+), 32 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 288191d33..f30c5dcf9 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -13,6 +13,20 @@ * http://creativecommons.org/publicdomain/zero/1.0/ */ +var util = {}; +util.Base64 = { + _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_", + stringify: CryptoJS.enc.Base64.stringify, + parse: CryptoJS.enc.Base64.parse +}; +util.salt = function(len) { + return Array.apply(0, Array(len)).map(function() { + return (function(charset){ + return charset.charAt(Math.floor(Math.random() * charset.length)); + }('abcdefghijklmnopqrstuvwxyz0123456789')); + }).join(''); +}; + var GMusicResolver = Tomahawk.extend( TomahawkResolver, { settings: { cacheTime: 300, @@ -64,6 +78,9 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._email = config.email; this._password = config.password; + // Invalidate cache if account has changed for example + delete this.cachedRequest; + if (!this._email || !this._password) { Tomahawk.reportCapabilities(TomahawkResolverCapability.NullCapability); Tomahawk.log( name + " resolver not configured." ); @@ -92,9 +109,11 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { that._loadWebToken( function() { that._loadSettings( function() { that._getData(function (response) { - that.trackCount = response.data.items.length; - Tomahawk.log("Reporting collection"); - Tomahawk.reportCapabilities(TomahawkResolverCapability.Browsable); + if (response.data) { + that.trackCount = response.data.items.length; + Tomahawk.log("Reporting collection"); + Tomahawk.reportCapabilities(TomahawkResolverCapability.Browsable); + } }); that._ready = true; }); @@ -103,6 +122,13 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }, _convertTrack: function (entry) { + var realId; + if (entry.id) { + realId = entry.id; + } else { + realId = entry.nid; + } + return { artist: entry.artist, album: entry.album, @@ -116,7 +142,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { duration: entry.durationMillis / 1000, source: "Google Music", - url: 'gmusic://track/' + entry.id, + url: 'gmusic://track/' + realId, checked: true }; }, @@ -176,31 +202,104 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { } }, - _execSearch: function (query, callback, max_results) { - + _execSearchLocker: function (query, callback, max_results, results) { var that = this; this._getData(function (response) { - var results = { tracks: [], albums: [], artists: [] }; - for (var idx = 0; idx < response.data.items.length; idx++) { - var entry = response.data.items[ idx ]; - var lowerQuery = query.toLowerCase(); - if (entry.artist.toLowerCase() === lowerQuery - || entry.album.toLowerCase() === lowerQuery - || entry.title.toLowerCase() === lowerQuery) { - var artist = that._convertArtist(entry); - var album = that._convertAlbum(entry); - if (!that.containsObject(artist, results.artists)) { - results.artists.push(artist); - } - if (!that.containsObject(album, results.albums)) { - results.albums.push(album); + if (response.data) { + if (!results) { + results = { tracks: [], albums: [], artists: [] }; + } + for (var idx = 0; idx < response.data.items.length; idx++) { + var entry = response.data.items[ idx ]; + var lowerQuery = query.toLowerCase(); + if (entry.artist.toLowerCase() === lowerQuery + || entry.album.toLowerCase() === lowerQuery + || entry.title.toLowerCase() === lowerQuery) { + var artist = that._convertArtist(entry); + var album = that._convertAlbum(entry); + if (!that.containsObject(artist, results.artists)) { + results.artists.push(artist); + } + if (!that.containsObject(album, results.albums)) { + results.albums.push(album); + } + results.tracks.push(that._convertTrack(entry)); } - results.tracks.push(that._convertTrack(entry)); } } callback.call( window, results ); }); + }, + + _execSearchAllAccess: function (query, callback, max_results, results) { + if (!results) { + results = { tracks: [], albums: [], artists: [] }; + } + var that = this; + var url = this._baseURL + 'query?q=' + query; + if (max_results) + url += '&max-results=' + max_results; + + Tomahawk.asyncRequest(url, function (request) { + if (200 != request.status) { + Tomahawk.log( + "Google Music search '" + query + "' failed:\n" + + request.status + " " + + request.statusText.trim() + "\n" + + request.responseText.trim() + ); + return; + } + + var response = JSON.parse( request.responseText ); + + // entries member is missing when there are no results + if (!response.entries) { + callback.call( window, results ); + return; + } + + for (var idx = 0; idx < response.entries.length; idx++) { + var entry = response.entries[ idx ]; + switch (entry.type) { + case '1': + var result = that._convertTrack( entry.track ); + results.tracks.push( result ); + break; + case '2': + var result = that._convertArtist( entry.artist ); + if (!that.containsObject(result, results.artists)) { + results.artists.push( result ); + } + break; + case '3': + var result = that._convertAlbum( entry.album ); + if (!that.containsObject(result, results.albums)) { + results.albums.push( result ); + } + break; + } + } + callback.call( window, results ); + }, { + 'Authorization': 'GoogleLogin auth=' + this._token + }, { + method: 'GET' + }); + }, + _execSearch: function (query, callback, max_results) { + var that = this; + var results = { tracks: [], albums: [], artists: [] }; + this._execSearchLocker( query, function (results) { + if (that._allAccess) { + that._execSearchAllAccess( query, function (results) { + callback.call( window, results ); + }, max_results, results); + } else { + callback.call( window, results ); + } + }, max_results, results); }, search: function (qid, query) { @@ -213,7 +312,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { { 'qid': qid, 'results': results.albums } ); Tomahawk.addArtistResults( { 'qid': qid, 'results': results.artists } ); - }); + }, 20); }, resolve: function (qid, artist, album, title) { @@ -257,23 +356,17 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { Tomahawk.log( "track ID is '" + urn.id + "'" ); - // TODO - this is required for the All Access part of Google Music - /*// generate 13-digit numeric salt - var salt = '' + Math.floor( Math.random() * 10000000000000 ); - - // generate SHA1 HMAC of track ID + salt - // encoded with URL-safe base64 - var sig = CryptoJS.HmacSHA1( urn.id + salt, this._key ) - .toString( CryptoJS.enc.Base64 ) + var salt = util.salt(13); + var sig = CryptoJS.HmacSHA1(urn.id + salt, this._key).toString(util.Base64) .replace( /=+$/, '' ) // no padding .replace( /\+/g, '-' ) // URL-safe alphabet .replace( /\//g, '_' ) // URL-safe alphabet - ;*/ + ; var url = 'https://android.clients.google.com/music/mplay' + '?net=wifi&pt=e&targetkbps=8310' + '&' + ('T' == urn.id[ 0 ] ? 'mjck' : 'songid') - + '=' + urn.id; + + '=' + urn.id + '&slt=' + salt + '&sig=' + sig; Tomahawk.reportStreamUrl(qid, url, { 'Content-type': 'application/x-www-form-urlencoded', From 2d013c7e6840e5a6bad0f2b666f27dfbd2ce5870 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Wed, 4 Jun 2014 00:09:43 +0100 Subject: [PATCH 247/597] [gmusic]: cleanup duplicated code --- gmusic/content/contents/code/gmusic.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index f30c5dcf9..22254bc6d 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -78,9 +78,6 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._email = config.email; this._password = config.password; - // Invalidate cache if account has changed for example - delete this.cachedRequest; - if (!this._email || !this._password) { Tomahawk.reportCapabilities(TomahawkResolverCapability.NullCapability); Tomahawk.log( name + " resolver not configured." ); From 2af2a4a382dcc039c128bf408d5bd54545db1d45 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Wed, 4 Jun 2014 00:55:43 +0100 Subject: [PATCH 248/597] [gmusic] mesh together All Access and fuzzy indexing and add fuzzy resloving --- gmusic/content/contents/code/gmusic.js | 87 +++++++++++++++++--------- 1 file changed, 56 insertions(+), 31 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 22254bc6d..ead758cad 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -168,25 +168,27 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { oldMD5 = that.cachedRequest.md5; } that.cachedRequest = { - response: JSON.parse( request.responseText ), + response: JSON.parse(request.responseText), md5: CryptoJS.MD5(request.responseText), time: Date.now() }; - // Check if we need to update the cache. - if (oldMD5 != that.cachedRequest.md5) { - // Recreate fuzzy index - var indexList = []; - for (var idx = 0; idx < that.cachedRequest.response.data.items.length; idx++) { - var entry = that.cachedRequest.response.data.items[ idx ]; - indexList.push({ - id: idx, - artist: entry.artist, - album: entry.album, - track: entry.title - }); + if (that.cachedRequest.response.data) { + // Check if we need to update the cache. + if (oldMD5 != that.cachedRequest.md5) { + // Recreate fuzzy index + var indexList = []; + for (var idx = 0; idx < that.cachedRequest.response.data.items.length; idx++) { + var entry = that.cachedRequest.response.data.items[ idx ]; + indexList.push({ + id: idx, + artist: entry.artist, + album: entry.album, + track: entry.title + }); + } + Tomahawk.createFuzzyIndex(indexList); } - Tomahawk.createFuzzyIndex(indexList); } callback(that.cachedRequest.response); @@ -206,22 +208,19 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { if (!results) { results = { tracks: [], albums: [], artists: [] }; } - for (var idx = 0; idx < response.data.items.length; idx++) { - var entry = response.data.items[ idx ]; - var lowerQuery = query.toLowerCase(); - if (entry.artist.toLowerCase() === lowerQuery - || entry.album.toLowerCase() === lowerQuery - || entry.title.toLowerCase() === lowerQuery) { - var artist = that._convertArtist(entry); - var album = that._convertAlbum(entry); - if (!that.containsObject(artist, results.artists)) { - results.artists.push(artist); - } - if (!that.containsObject(album, results.albums)) { - results.albums.push(album); - } - results.tracks.push(that._convertTrack(entry)); + + var resultIds = Tomahawk.searchFuzzyIndex(query); + for (var idx = 0; idx < resultIds.length; idx++) { + var entry = resultIds[idx][0]; + var artist = that._convertArtist(entry); + var album = that._convertAlbum(entry); + if (!that.containsObject(artist, results.artists)) { + results.artists.push(artist); } + if (!that.containsObject(album, results.albums)) { + results.albums.push(album); + } + results.tracks.push(that._convertTrack(entry)); } } callback.call( window, results ); @@ -248,6 +247,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { return; } + Tomahawk.log(request.responseText); + var response = JSON.parse( request.responseText ); // entries member is missing when there are no results @@ -312,6 +313,31 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }, 20); }, + _resolveAllAccess: function(qid, artist, album, title) { + if (this._allAccess) { + // Format the search as track-artists-album for now + var query = artist; + if (album) { + query += ' - ' + album; + } + query += ' - ' + title; + Tomahawk.log(query); + this._execSearchAllAccess(query, function (results) { + if (results.tracks.length > 0) { + Tomahawk.addTrackResults({ + 'qid': qid, + 'results': [ + results.tracks[0] + ] + }); + } else { + // no matches, don't wait for the timeout + Tomahawk.addTrackResults({ 'qid': qid, 'results': [] }); + } + }, 1); + } + }, + resolve: function (qid, artist, album, title) { var that = this; if (!this._ready) return; @@ -327,8 +353,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { ] }); } else { - // no matches, don't wait for the timeout - Tomahawk.addTrackResults({ 'qid': qid, 'results': [] }); + that._resolveAllAccess(qid, artist, album, title); } }); }, From 19addeccd5ee62c8fa5bf1450fab6b87000c00f7 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Wed, 4 Jun 2014 01:00:13 +0100 Subject: [PATCH 249/597] [gmusic] remove debug text and report no results --- gmusic/content/contents/code/gmusic.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index ead758cad..1e56195e2 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -246,9 +246,6 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { ); return; } - - Tomahawk.log(request.responseText); - var response = JSON.parse( request.responseText ); // entries member is missing when there are no results @@ -335,6 +332,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { Tomahawk.addTrackResults({ 'qid': qid, 'results': [] }); } }, 1); + } else { + Tomahawk.addTrackResults({ 'qid': qid, 'results': [] }); } }, From 698d16681dc07ea735b935dd46dd6e5a047b3312 Mon Sep 17 00:00:00 2001 From: Lalit Maganti Date: Wed, 4 Jun 2014 01:16:07 +0100 Subject: [PATCH 250/597] [gmusic] actually get the entry before attempting to convert it --- gmusic/content/contents/code/gmusic.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 1e56195e2..52795e5a2 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -211,7 +211,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { var resultIds = Tomahawk.searchFuzzyIndex(query); for (var idx = 0; idx < resultIds.length; idx++) { - var entry = resultIds[idx][0]; + var id = resultIds[idx][0]; + var entry = response.data.items[id]; var artist = that._convertArtist(entry); var album = that._convertAlbum(entry); if (!that.containsObject(artist, results.artists)) { From 6dd4a1e93b373381db39d9513a3b8a2ebaa9bda4 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 18 Jun 2014 12:33:05 +0100 Subject: [PATCH 251/597] [spotify-metadata] Fix TWK-1589 --- spotify-metadata/content/contents/code/spotify-metadata.js | 2 +- spotify-metadata/content/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spotify-metadata/content/contents/code/spotify-metadata.js b/spotify-metadata/content/contents/code/spotify-metadata.js index c66e7ea1b..60f5dea50 100644 --- a/spotify-metadata/content/contents/code/spotify-metadata.js +++ b/spotify-metadata/content/contents/code/spotify-metadata.js @@ -54,7 +54,7 @@ var SpotifyMetadataResolver = Tomahawk.extend(TomahawkResolver, { var match = url.match(/spotify:(album|artist|track):(.*)/); var playlistmatch = url.match(/spotify:user:[0-9]*:playlist:(.*)/); if (match == null) { - match = url.match(/https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/]*)/); + match = url.match(/https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]*)/); if (match != null) match.splice(1, 1); } if (match != null) { diff --git a/spotify-metadata/content/metadata.json b/spotify-metadata/content/metadata.json index 86a02b0af..eced47153 100644 --- a/spotify-metadata/content/metadata.json +++ b/spotify-metadata/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "spotify-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.0", + "version": "0.1.1", "website": "http://gettomahawk.com", "description": "Supports loading/drag'n'drop of Spotify artists and track URLs without a premium account.", "type": "resolver/javascript", From 3e129de9bc68be3d901af5b5c7ea859e7b9f9314 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 19 Jun 2014 11:29:21 +0100 Subject: [PATCH 252/597] [spotify] Remove unnecessary semicolons --- spotify/spotifyplaylists.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spotify/spotifyplaylists.h b/spotify/spotifyplaylists.h index 3d7dee029..1e4ed8166 100644 --- a/spotify/spotifyplaylists.h +++ b/spotify/spotifyplaylists.h @@ -216,10 +216,10 @@ bool checkTracksAreLoaded(QList waitingForLoaded); bool checkPlaylistIsLoaded(sp_playlist* pl ); bool checkTracksAreLoaded(QList< sp_track* > waitingForLoaded); -Q_DECLARE_METATYPE( sp_playlistcontainer* ); -Q_DECLARE_METATYPE( sp_playlist* ); -Q_DECLARE_METATYPE( const int* ); -Q_DECLARE_METATYPE( QList< sp_track* > ); -Q_DECLARE_METATYPE( QList< int > ); +Q_DECLARE_METATYPE( sp_playlistcontainer* ) +Q_DECLARE_METATYPE( sp_playlist* ) +Q_DECLARE_METATYPE( const int* ) +Q_DECLARE_METATYPE( QList< sp_track* > ) +Q_DECLARE_METATYPE( QList< int > ) #endif // SPOTIFYPLAYLISTS_H From 081b94a3b6aaab195eee755f57fdac57e5c43b19 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Fri, 20 Jun 2014 16:09:26 +0200 Subject: [PATCH 253/597] [gmusic] Add "needCookieHeader" option to loadWebToken request --- gmusic/content/contents/code/gmusic.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 52795e5a2..d77a5879b 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -492,7 +492,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }, { 'Authorization': 'GoogleLogin auth=' + this._token }, { - method: 'HEAD' + method: 'HEAD', + needCookieHeader: true } ); }, From 7c125ca445b2c6fd6edfd4b5e471fe79ded3a8c3 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Fri, 20 Jun 2014 16:11:09 +0200 Subject: [PATCH 254/597] [gmusic] Remove unnecessary comma --- gmusic/content/contents/code/gmusic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index d77a5879b..f8b2cc5b7 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -194,7 +194,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { callback(that.cachedRequest.response); }, { 'Content-type': 'application/x-www-form-urlencoded', - 'Authorization': 'GoogleLogin auth=' + this._token, + 'Authorization': 'GoogleLogin auth=' + this._token }, { method: 'POST' }); From 6610c2629d9f6d7912ee4cbb8912fb57ee72572e Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 20 Jun 2014 17:38:57 +0100 Subject: [PATCH 255/597] [beatsmusic] Use async.js to retrieve metadata --- .../content/contents/code/beatsmusic.js | 71 ++++++++++--------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index c1acee22e..e9ed82c22 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -146,41 +146,46 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { search: function (qid, searchString) { var that = this; // TODO: Search for albums and artists, too. - Tomahawk.asyncRequest(this.endpoint - + "/api/search?type=track&filters=streamable:true&limit=100&q=" - + encodeURIComponent(searchString) + "&client_id=" + this.app_token, function (xhr) { + Tomahawk.asyncRequest(this.endpoint + + "/api/search?type=track&filters=streamable:true&limit=100&q=" + + encodeURIComponent(searchString) + "&client_id=" + this.app_token, function (xhr) { var res = JSON.parse(xhr.responseText); if (res.code == "OK" && res.data.length > 0) { - var results = []; - doneCounter = res.data.length; - for (i = 0; i < res.data.length; i++) { - if (res.data[i].result_type === "track") { - Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res.data[i].id - + "?fields=artist_display_name&fields=duration&fields=title&fields=id&client_id=" - + that.app_token, function (xhr2) { - var res2 = JSON.parse(xhr2.responseText); - if (res2.code == "OK") { - var result = { - artist: res2.data.artist_display_name, - duration: res2.data.duration, - source: that.settings.name, - track: res2.data.title, - url: "beatsmusic://track/" + res2.data.id - }; - results.push(result); - } - doneCounter -= 1; - if (doneCounter === 0) { - Tomahawk.addTrackResults({ - results: results, - qid: qid - }); - } - }); - } else { - doneCounter -= 1; - } - } + async.map(res.data, function (item, cb) { + var query = that.endpoint + "/api/tracks/" + item.id; + query += "?fields=artist_display_name&fields=duration"; + query += "&fields=title&fields=id&client_id="; + query += that.app_token; + Tomahawk.asyncRequest(query, function (xhr2) { + var res2 = JSON.parse(xhr2.responseText); + Tomahawk.log(xhr2.responseText); + if (res2.code == "OK") { + var result = { + artist: res2.data.artist_display_name, + duration: res2.data.duration, + source: that.settings.name, + track: res2.data.title, + url: "beatsmusic://track/" + res2.data.id + }; + cb(null, result); + } else { + Tomahawk.log("Failed to get track metadata: " + + JSON.stringify(res2)); + // Just skip this item instead of raising an error, + // so that at least the successful results get + // through. + cb(null, null); + } + }); + // cb(null, item); + }, function (err, results) { + Tomahawk.addTrackResults({ + results: results.filter(function (item) { + return item !== null; + }), + qid: qid + }); + }); } else { Tomahawk.addTrackResults({ results: [], From 29805592a101f5ea289b2f580ed493eeaaa9595e Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 20 Jun 2014 17:44:54 +0100 Subject: [PATCH 256/597] [beatsmusic] Return album name in search --- beatsmusic/content/contents/code/beatsmusic.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index e9ed82c22..46b2e69f9 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -167,6 +167,9 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { track: res2.data.title, url: "beatsmusic://track/" + res2.data.id }; + if (res2.data.refs.hasOwnProperty("album")) { + result.album = res2.data.refs.album.display; + } cb(null, result); } else { Tomahawk.log("Failed to get track metadata: " + From f0591e6af93433168bc787e74b3f925320c54b3e Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 20 Jun 2014 17:48:10 +0100 Subject: [PATCH 257/597] [beatsmusic] Bitrate is always 320 --- beatsmusic/content/contents/code/beatsmusic.js | 1 + 1 file changed, 1 insertion(+) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 46b2e69f9..97beb0b59 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -162,6 +162,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { if (res2.code == "OK") { var result = { artist: res2.data.artist_display_name, + bitrate: 320, duration: res2.data.duration, source: that.settings.name, track: res2.data.title, From ade619e0273d9c9d9b5f0fc6b8a679a12b9605a3 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 21 Jun 2014 09:16:16 +0100 Subject: [PATCH 258/597] [rdio-metadata] Correctly escape OAuth parameters --- .../content/contents/code/rdio-metadata.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/rdio-metadata/content/contents/code/rdio-metadata.js b/rdio-metadata/content/contents/code/rdio-metadata.js index 16bf5a139..e319b5586 100644 --- a/rdio-metadata/content/contents/code/rdio-metadata.js +++ b/rdio-metadata/content/contents/code/rdio-metadata.js @@ -49,6 +49,13 @@ var RdioMetadataResolver = Tomahawk.extend(TomahawkResolver, { } }, + encodeOAuthComponent: function (url) { + var encoded = encodeURIComponent(url); + encoded = encoded.replace(/\!/g, "%21").replace(/\'/g, "%27"); + encoded = encoded.replace(/\(/g, "%28").replace(/\)/g, "%29"); + return encoded.replace(/\*/g, "%2A"); + }, + lookupUrl: function (url) { var that = this; var fetchUrl = 'http://api.rdio.com/1/' @@ -57,13 +64,15 @@ var RdioMetadataResolver = Tomahawk.extend(TomahawkResolver, { var nonce = ''; for (i = 0; i < 8; i++) nonce += parseInt(Math.random() * 10).toString(); query += '&oauth_nonce=' + nonce; - query += '&oauth_signature_method=' + encodeURIComponent('HMAC-SHA1'); + query += '&oauth_signature_method=' + this.encodeOAuthComponent('HMAC-SHA1'); query += '&oauth_timestamp=' + Math.round((new Date()).getTime() / 1000);; query += '&oauth_version=1.0'; - query += '&url=' + encodeURIComponent(url); - var toSign = 'POST&' + encodeURIComponent(fetchUrl) + '&' + encodeURIComponent(query); + query += '&url=' + this.encodeOAuthComponent(url); + var toSign = 'POST&' + this.encodeOAuthComponent(fetchUrl) + '&' + this.encodeOAuthComponent(query); var signature = CryptoJS.HmacSHA1(toSign, 'yt35kakDyW&').toString(CryptoJS.enc.Base64); - query += '&oauth_signature=' + encodeURIComponent(signature); + query += '&oauth_signature=' + this.encodeOAuthComponent(signature); + Tomahawk.log(fetchUrl) + Tomahawk.log(query) Tomahawk.asyncRequest(fetchUrl, function (xhr) { var res = JSON.parse(xhr.responseText); if (res.status == 'ok') { From 70332b64fc514cab69ec6bb86d883fff231581ac Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 23 Jun 2014 03:29:43 +0200 Subject: [PATCH 259/597] [gmusic] Update cache every 300 seconds instead of every 300ms --- gmusic/content/contents/code/gmusic.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index f8b2cc5b7..03f5bb8c4 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -157,7 +157,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }, _getData: function (callback) { - if (this.hasOwnProperty('cachedRequest') && this.cachedRequest.time + this.settings.cacheTime > Date.now()) { + if (this.hasOwnProperty('cachedRequest') + && this.cachedRequest.time + this.settings.cacheTime * 1000 > Date.now()) { callback(this.cachedRequest.response); } else { var that = this; From d07d5553e207abd7f67467bce312388095bc77e6 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sun, 29 Jun 2014 03:52:05 +0200 Subject: [PATCH 260/597] [gmusic] Get all 20000 possible tracks in the locker. --- gmusic/content/contents/code/gmusic.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 03f5bb8c4..ebcba4c93 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -194,10 +194,11 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { callback(that.cachedRequest.response); }, { - 'Content-type': 'application/x-www-form-urlencoded', + 'Content-Type': 'application/json', 'Authorization': 'GoogleLogin auth=' + this._token }, { - method: 'POST' + method: 'POST', + data: JSON.stringify({'max-results': 20000}) }); } }, From 151dce73e3e9a137a2b3014f64ec243f484a896f Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sun, 29 Jun 2014 03:53:31 +0200 Subject: [PATCH 261/597] [gmusic] Remove non-functional code in _loadSettings function. --- gmusic/content/contents/code/gmusic.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index ebcba4c93..5b5514525 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -461,11 +461,9 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { } }, { 'Content-type': 'application/x-www-form-urlencoded', - 'Authorization': 'GoogleLogin auth=' + this._token, - 'Content-Type': 'application/json' + 'Authorization': 'GoogleLogin auth=' + this._token }, { - method: 'POST', - body: JSON.stringify({ 'sessionId': '' }) + method: 'POST' } ); }, From 97c5d289ed84ad41bbfe010772fcbf0d4ca8c024 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sun, 29 Jun 2014 03:55:32 +0200 Subject: [PATCH 262/597] [gmusic] Limit response to only the necessary fields. --- gmusic/content/contents/code/gmusic.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 5b5514525..c868f4142 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -162,7 +162,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { callback(this.cachedRequest.response); } else { var that = this; - var url = this._baseURL + 'trackfeed'; + var url = this._baseURL + + 'trackfeed?fields=data/items(id,nid,artist,album,title,year,trackNumber,discNumber,estimatedSize,durationMillis)'; Tomahawk.asyncRequest(url, function (request) { var oldMD5 = ""; if (that.hasOwnProperty('cachedRequest')) { From 257c5f03831f06bee7e3bb5658b6d987c5e48e5b Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sun, 29 Jun 2014 04:02:43 +0200 Subject: [PATCH 263/597] [gmusic] Add track count to "Reporting collection" log message. --- gmusic/content/contents/code/gmusic.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index c868f4142..1927afbc9 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -108,7 +108,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { that._getData(function (response) { if (response.data) { that.trackCount = response.data.items.length; - Tomahawk.log("Reporting collection"); + Tomahawk.log("Reporting collection with " + that.trackCount + + " tracks"); Tomahawk.reportCapabilities(TomahawkResolverCapability.Browsable); } }); From 511618d585fcb891845b3f5e7181429206aaec92 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 1 Jul 2014 02:05:51 +0200 Subject: [PATCH 264/597] [gmusic] Fetch all tracks from locker. Cache efficiently. --- gmusic/content/contents/code/gmusic.js | 178 ++++++++++++++++--------- 1 file changed, 113 insertions(+), 65 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 1927afbc9..2bd3b2904 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -68,6 +68,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }, invalidateCache: function() { + Tomahawk.log("Invalidating cache"); delete this.cachedRequest; Tomahawk.deleteFuzzyIndex(); }, @@ -86,13 +87,13 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { // load signing key { var s1 = CryptoJS.enc.Base64.parse( - 'VzeC4H4h+T2f0VI180nVX8x+Mb5HiTtGnKgH52Otj8ZCGDz9jRW' - + 'yHb6QXK0JskSiOgzQfwTY5xgLLSdUSreaLVMsVVWfxfa8Rw==' - ); + 'VzeC4H4h+T2f0VI180nVX8x+Mb5HiTtGnKgH52Otj8ZCGDz9jRW' + + 'yHb6QXK0JskSiOgzQfwTY5xgLLSdUSreaLVMsVVWfxfa8Rw==' + ); var s2 = CryptoJS.enc.Base64.parse( 'ZAPnhUkYwQ6y5DdQxWThbvhJHN8msQ1rqJw0ggKdufQjelrKuiG' + 'GJI30aswkgCWTDyHkTGK9ynlqTkJ5L4CiGGUabGeo8M6JTQ==' - ); + ); for (var idx = 0; idx < s1.words.length; idx++) s1.words[ idx ] ^= s2.words[ idx ]; @@ -106,8 +107,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { that._loadWebToken( function() { that._loadSettings( function() { that._getData(function (response) { - if (response.data) { - that.trackCount = response.data.items.length; + if (response) { + that.trackCount = response.length; Tomahawk.log("Reporting collection with " + that.trackCount + " tracks"); Tomahawk.reportCapabilities(TomahawkResolverCapability.Browsable); @@ -157,32 +158,47 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { return entry.artist; }, - _getData: function (callback) { - if (this.hasOwnProperty('cachedRequest') - && this.cachedRequest.time + this.settings.cacheTime * 1000 > Date.now()) { - callback(this.cachedRequest.response); - } else { - var that = this; - var url = this._baseURL - + 'trackfeed?fields=data/items(id,nid,artist,album,title,year,trackNumber,discNumber,estimatedSize,durationMillis)'; - Tomahawk.asyncRequest(url, function (request) { - var oldMD5 = ""; - if (that.hasOwnProperty('cachedRequest')) { - oldMD5 = that.cachedRequest.md5; - } - that.cachedRequest = { - response: JSON.parse(request.responseText), - md5: CryptoJS.MD5(request.responseText), - time: Date.now() - }; + _waitingCallbacks: [], + + _isRequesting: false, + + _callAllWaitingCallbacks: function () { + while (this._waitingCallbacks.length > 0) { + this._waitingCallbacks.splice(0, 1)[0](this.cachedRequest.response); + } + this._isRequesting = false; + }, - if (that.cachedRequest.response.data) { - // Check if we need to update the cache. - if (oldMD5 != that.cachedRequest.md5) { + _getData: function (callback) { + var that = this; + var url = that._baseURL + + 'trackfeed?fields=nextPageToken,' + + 'data/items(id,nid,artist,album,title,year,trackNumber,discNumber,estimatedSize,durationMillis)'; + if (that.cachedRequest) { + url += '&updated-min=' + that.cachedRequest.time * 1000; + } + var time = Date.now(); + var results = []; + that._waitingCallbacks.push(callback); + if (!that._isRequesting) { + if (!that.cachedRequest + || that.cachedRequest.time + that.settings.cacheTime * 1000 > Date.now) { + Tomahawk.log("Checking cache"); + that._isRequesting = true; + that._paginatedRequest(results, url, function (results) { + if (results && results.length > 0) { + Tomahawk.log("Collection needs to be updated"); + if (that.cachedRequest) { + results = that.cachedRequest.response.concat(results); + } // Recreate fuzzy index + that.cachedRequest = { + response: results, + time: Date.now() + }; var indexList = []; - for (var idx = 0; idx < that.cachedRequest.response.data.items.length; idx++) { - var entry = that.cachedRequest.response.data.items[ idx ]; + for (var idx = 0; idx < that.cachedRequest.response.length; idx++) { + var entry = that.cachedRequest.response[ idx ]; indexList.push({ id: idx, artist: entry.artist, @@ -190,25 +206,49 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { track: entry.title }); } + Tomahawk.log("Creating fuzzy index, count: " + indexList.length); Tomahawk.createFuzzyIndex(indexList); + Tomahawk.log("Updated cache in " + (Date.now() - time) + "ms"); + } else { + Tomahawk.log("Collection doesn't need to be updated"); } - } - - callback(that.cachedRequest.response); - }, { - 'Content-Type': 'application/json', - 'Authorization': 'GoogleLogin auth=' + this._token - }, { - method: 'POST', - data: JSON.stringify({'max-results': 20000}) - }); + that._callAllWaitingCallbacks(); + }, {method: 'POST'}); + } else { + that._callAllWaitingCallbacks(); + } } }, + _paginatedRequest: function (results, url, callback, options) { + var that = this; + var extraHeaders = { + 'Content-Type': 'application/json', + 'Authorization': 'GoogleLogin auth=' + that._token + }; + Tomahawk.asyncRequest(url, function (request) { + var response = JSON.parse(request.responseText); + if (response.data) { + results = results.concat(response.data.items); + Tomahawk.log("Received chunk containing" + results.length + " tracks"); + } + if (response.nextPageToken) { + options = { + method: 'POST', + data: JSON.stringify({'start-token': response.nextPageToken}) + }; + that._paginatedRequest(results, url, callback, options); + } else { + callback(results); + } + }, extraHeaders, options); + }, + _execSearchLocker: function (query, callback, max_results, results) { var that = this; + var time = Date.now(); this._getData(function (response) { - if (response.data) { + if (response) { if (!results) { results = { tracks: [], albums: [], artists: [] }; } @@ -216,7 +256,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { var resultIds = Tomahawk.searchFuzzyIndex(query); for (var idx = 0; idx < resultIds.length; idx++) { var id = resultIds[idx][0]; - var entry = response.data.items[id]; + var entry = response[id]; var artist = that._convertArtist(entry); var album = that._convertAlbum(entry); if (!that.containsObject(artist, results.artists)) { @@ -228,6 +268,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { results.tracks.push(that._convertTrack(entry)); } } + Tomahawk.log("Searched Locker for " + (Date.now() - time) + "ms and found " + + results.tracks.length + " tracks"); callback.call( window, results ); }); }, @@ -241,6 +283,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { if (max_results) url += '&max-results=' + max_results; + var time = Date.now(); Tomahawk.asyncRequest(url, function (request) { if (200 != request.status) { Tomahawk.log( @@ -248,7 +291,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { + request.status + " " + request.statusText.trim() + "\n" + request.responseText.trim() - ); + ); return; } var response = JSON.parse( request.responseText ); @@ -280,6 +323,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { break; } } + Tomahawk.log("Searched All Access for " + (Date.now() - time) + "ms and found " + + results.tracks.length + " tracks"); callback.call( window, results ); }, { 'Authorization': 'GoogleLogin auth=' + this._token @@ -307,11 +352,11 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._execSearch( query, function (results) { Tomahawk.addTrackResults( - { 'qid': qid, 'results': results.tracks } ); + { 'qid': qid, 'results': results.tracks } ); Tomahawk.addAlbumResults( - { 'qid': qid, 'results': results.albums } ); + { 'qid': qid, 'results': results.albums } ); Tomahawk.addArtistResults( - { 'qid': qid, 'results': results.artists } ); + { 'qid': qid, 'results': results.artists } ); }, 20); }, @@ -348,17 +393,20 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { // Ensure that the recent data was loaded this._getData(function (response) { + var time = Date.now(); var resultIds = Tomahawk.resolveFromFuzzyIndex(artist, album, title); if (resultIds.length > 0) { Tomahawk.addTrackResults({ 'qid': qid, 'results': [ - that._convertTrack(response.data.items[resultIds[0][0]]) + that._convertTrack(response[resultIds[0][0]]) ] }); } else { that._resolveAllAccess(qid, artist, album, title); } + Tomahawk.log("Resolved Locker for " + (Date.now() - time) + "ms and found " + + resultIds.length.length + " tracks"); }); }, @@ -390,9 +438,9 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { ; var url = 'https://android.clients.google.com/music/mplay' - + '?net=wifi&pt=e&targetkbps=8310' - + '&' + ('T' == urn.id[ 0 ] ? 'mjck' : 'songid') - + '=' + urn.id + '&slt=' + salt + '&sig=' + sig; + + '?net=wifi&pt=e&targetkbps=8310' + + '&' + ('T' == urn.id[ 0 ] ? 'mjck' : 'songid') + + '=' + urn.id + '&slt=' + salt + '&sig=' + sig; Tomahawk.reportStreamUrl(qid, url, { 'Content-type': 'application/x-www-form-urlencoded', @@ -404,15 +452,15 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { _loadSettings: function (callback) { var that = this; Tomahawk.asyncRequest(that._webURL - + 'services/loadsettings?u=0&xt=' - + encodeURIComponent( that._xt ), + + 'services/loadsettings?u=0&xt=' + + encodeURIComponent( that._xt ), function (request) { if (200 != request.status) { Tomahawk.log( "settings request failed:\n" + request.status + " " + request.statusText.trim() - ); + ); return; } @@ -420,14 +468,14 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { if (!response.settings) { Tomahawk.log( "settings request failed:\n" + request.responseText.trim() - ); + ); return; } that._allAccess = response.settings.isSubscription; Tomahawk.log( "Google Play Music All Access is " + (that._allAccess ? "enabled" : "disabled" ) - ); + ); var device = null; var devices = response.settings.devices; @@ -448,7 +496,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { + device.carrier + " " + device.manufacturer + " " + device.model - ); + ); callback.call( window ); } else { @@ -459,7 +507,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { + " ID to function. Please open the Google" + " Music application on an Android device" + " and log in to your account." - ); + ); } }, { 'Content-type': 'application/x-www-form-urlencoded', @@ -478,12 +526,12 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { Tomahawk.log( "request for xt cookie failed:" + request.status + " " + request.statusText.trim() - ); + ); return; } var match = request.getResponseHeader( 'Set-Cookie' ) - .match( /^xt=([^;]+)(?:;|$)/m ); + .match( /^xt=([^;]+)(?:;|$)/m ); if (match) { that._xt = match[ 1 ]; callback.call( window ); @@ -529,7 +577,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { function (request) { if (200 == request.status) { that._token = request.responseText - .match( /^Auth=(.*)$/m )[ 1 ]; + .match( /^Auth=(.*)$/m )[ 1 ]; that._loginLock = false; Tomahawk.log( name + " logged in successfully" ); @@ -540,9 +588,9 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { that._loginCallbacks = null; } else { Tomahawk.log(name + " login failed:\n" - + request.status + " " - + request.statusText.trim() + "\n" - + request.responseText.trim()); + + request.status + " " + + request.statusText.trim() + "\n" + + request.responseText.trim()); } }, { 'Content-type': 'application/x-www-form-urlencoded' @@ -570,7 +618,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { artists: function (qid) { this._getData(function (response) { - var names = response.data.items.map(function (item) { + var names = response.map(function (item) { return item.artist; }); var unique_names = names.filter(function (item, pos) { @@ -585,7 +633,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { albums: function (qid, artist) { this._getData(function (response) { - var names = response.data.items.filter(function (item) { + var names = response.filter(function (item) { return item.artist == artist; }).map(function (item) { return item.album; @@ -604,7 +652,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { tracks: function (qid, artist, album) { var that = this; this._getData(function (response) { - var tracks = response.data.items.filter(function (item) { + var tracks = response.filter(function (item) { return item.artist == artist && item.album == album; }).map(function (item) { return that._convertTrack(item); From 9e09dabc77d9a9c57bd5797ba2c0da0d964b8988 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 1 Jul 2014 03:12:54 +0200 Subject: [PATCH 265/597] [gmusic] Minor fix in log message. --- gmusic/content/contents/code/gmusic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index 2bd3b2904..e94b7eff7 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -230,7 +230,7 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { var response = JSON.parse(request.responseText); if (response.data) { results = results.concat(response.data.items); - Tomahawk.log("Received chunk containing" + results.length + " tracks"); + Tomahawk.log("Received chunk of tracks, tracks total: " + results.length); } if (response.nextPageToken) { options = { From 03db6ab4343f0a2928bd1bc65cfad78cc85301eb Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 1 Jul 2014 03:23:18 +0200 Subject: [PATCH 266/597] [gmusic] Increased version number to 0.4. --- gmusic/content/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index 19935715a..c96bfc199 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -1,9 +1,9 @@ { "name": "Google Play Music", "pluginName": "gmusic", - "author": "Sam Hanes, Lalit Maganti", - "email": "sam@maltera.com, lalitmaganti@gmail.com", - "version": "0.3", + "author": "Sam Hanes, Lalit Maganti, Enno Gottschalk", + "email": "sam@maltera.com, lalitmaganti@gmail.com, mrmaffen@gmail.com", + "version": "0.4", "website": "http://gettomahawk.com", "description": "Streams music from Google Play Music.", "type": "resolver/javascript", From b1243ce8df0272eeb286f4fb1a02d5de7912eb14 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Fri, 11 Jul 2014 21:06:52 +0200 Subject: [PATCH 267/597] [subsonic] Fixed collection for rest-api version > 1.8.0, +several other fixes --- subsonic/content/contents/code/config.ui | 45 ++-- subsonic/content/contents/code/subsonic.js | 255 +++++++++++---------- subsonic/content/metadata.json | 4 +- 3 files changed, 158 insertions(+), 146 deletions(-) diff --git a/subsonic/content/contents/code/config.ui b/subsonic/content/contents/code/config.ui index 61bf10b55..947eb6fc0 100644 --- a/subsonic/content/contents/code/config.ui +++ b/subsonic/content/contents/code/config.ui @@ -40,15 +40,22 @@ + + + + Requires at least Subsonic version 4.7 + + + QFormLayout::ExpandingFieldsGrow - + - Username: + Host: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -56,12 +63,12 @@ - + - + - Password: + Port: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -69,16 +76,12 @@ - - - QLineEdit::Password - - + - + - Server: + Username: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -86,12 +89,12 @@ - + - + - Max Songs: + Password: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -99,15 +102,9 @@ - - - 1 - - - 500 - - - 20 + + + QLineEdit::Password diff --git a/subsonic/content/contents/code/subsonic.js b/subsonic/content/contents/code/subsonic.js index 433db3c96..995b27381 100644 --- a/subsonic/content/contents/code/subsonic.js +++ b/subsonic/content/contents/code/subsonic.js @@ -3,6 +3,7 @@ * Copyright 2012, mack-t * Copyright 2012, Peter Loron * Copyright 2013, Teo Mrnjavac + * Copyright 2014, Enno Gottschalk * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +26,14 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { return { "widget": uiData, fields: [{ + name: "host", + widget: "host_edit", + property: "text" + }, { + name: "port", + widget: "port_edit", + property: "text" + },{ name: "user", widget: "user_edit", property: "text" @@ -32,14 +41,6 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { name: "password", widget: "password_edit", property: "text" - }, { - name: "subsonic_url", - widget: "subsonic_url_edit", - property: "text" - }, { - name: "max_songs", - widget: "max_songs_spinbox", - property: "value" }], images: [{ "subsonic.png" : Tomahawk.readBase64("subsonic.png") @@ -53,8 +54,8 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { if (this.user !== userConfig.user || this.password !== userConfig.password || - this.subsonic_url !== userConfig.subsonic_url || - this.max_songs !== userConfig.max_songs) + this.host !== userConfig.host || + this.port !== userConfig.port) { this.init(); } @@ -81,6 +82,52 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { return "enc:" + hex_string; }, + /** + * Compares versions strings + * (version1 < version2) == -1 + * (version1 = version2) == 0 + * (version1 > version2) == 1 + */ + versionCompare: function (version1, version2) { + var v1 = version1.split('.').map(function (item) { + return parseInt(item); + }); + var v2 = version2.split('.').map(function (item) { + return parseInt(item); + }); + var length = Math.max(v1.length, v2.length); + var i = 0; + + for (; i < length; i++) { + if (typeof v1[i] == "undefined" || v1[i] === null) { + if (typeof v2[i] == "undefined" || v2[i] === null) { + // v1 == v2 + return 0; + } else if (v2[i] === 0) { + continue; + } else { + // v1 < v2 + return -1; + } + } else if (typeof v2[i] == "undefined" || v2[i] === null) { + if (v1[i] === 0) { + continue; + } else { + // v1 > v2 + return 1; + } + } else if (v2[i] > v1[i]) { + // v1 < v2 + return -1; + } else if (v2[i] < v1[i]) { + // v1 > v2 + return 1; + } + } + // v1 == v2 + return 0; + }, + init: function() { var userConfig = this.getUserConfig(); @@ -89,102 +136,71 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { return; } - Tomahawk.log("Doing Subsonic resolver init, got credentials from config. User: " + userConfig.user); this.user = userConfig.user; - var enc_password = this.encodePassword(userConfig.password); - this.password = enc_password; - this.subsonic_url = userConfig.subsonic_url.replace(/\/+$/, ""); - this.max_songs = userConfig.max_songs; + this.user = this.user.trim(); + this.password = this.encodePassword(userConfig.password); + this.host = userConfig.host; + if (!this.host) { + this.host = "http://localhost"; + } else { + if (this.host.search(".*:\/\/") < 0) { + // couldn't find a proper protocol, so we default to "http://" + this.host = "http://" + this.host; + } + this.host = this.host.trim(); + } + this.port = userConfig.port; + if (!this.port) { + this.port = "4040"; + } else { + this.port = this.port.trim(); + } + Tomahawk.log("Doing Subsonic resolver init, got credentials from config. user: " + + this.user + ", host: " + this.host + ", port: " + this.port); this.element = document.createElement('div'); - // We need at least 1.6.0 for resolve operations (JSON API support) - // and 1.8.0 for scriptcollection - this.supported_api_versions = [ "1.6.0", "1.7.0", "1.8.0", "1.9.0" ]; - this.subsonic_api = 0; - //let's ask the server which API version it actually supports. - if (this.user === undefined || this.password === undefined || this.subsonic_url === undefined) + if (!this.user || !this.password || !this.host || !this.port) return; var that = this; - var ping_url = this.buildBaseUrl("/rest/ping.view") + "&f=json"; + this.subsonic_api = "1.8.0"; + var ping_url = this.buildBaseUrl("/rest/ping.view"); Tomahawk.asyncRequest(ping_url, function(xhr) { - var doc = JSON.parse(xhr.responseText); - if ( typeof doc["subsonic-response"].version === 'undefined' ) + var response = JSON.parse(xhr.responseText); + if (!response || !response["subsonic-response"] + || !response["subsonic-response"].version) return; - var versionString = doc["subsonic-response"].version; + var version = response["subsonic-response"].version; - for ( var i = 0; i < that.supported_api_versions.length; ++i ) - { - if ( that.supported_api_versions[i] === versionString ) - { - that.subsonic_api = i; - break; + if (typeof Tomahawk.reportCapabilities == 'function') { + // We need at least 1.8.0 + if (that.versionCompare(version, that.subsonic_api) >= 0) { + Tomahawk.reportCapabilities(TomahawkResolverCapability.Browsable + | TomahawkResolverCapability.AccountFactory); } } - - if ( typeof Tomahawk.reportCapabilities == 'function' ) - { - if ( that.subsonic_api<2 ) //version 1.8.0, scriptcollection support - Tomahawk.reportCapabilities( TomahawkResolverCapability.AccountFactory ); - else - Tomahawk.reportCapabilities( TomahawkResolverCapability.Browsable | TomahawkResolverCapability.AccountFactory ); - } } ); - - }, - - getXmlAttribute: function(attrib_name, attributes) - { - for (var count = 0; count < attributes.length; ++count) - { - if (attrib_name === attributes[count].nodeName) - return attributes[count].nodeValue; - } - return null; }, buildBaseUrl : function(subsonic_view) { - - return this.subsonic_url + subsonic_view + + return this.host + ":" + this.port + subsonic_view + "?u=" + this.user + "&p=" + this.password + - "&v=" + this.supported_api_versions[ this.subsonic_api ] + - "&c=tomahawk"; - }, - - parseSongFromXmlAttributes : function(song_attributes) - { - return { - artist: this.getXmlAttribute("artist", song_attributes), - album: this.getXmlAttribute("album", song_attributes), - track: this.getXmlAttribute("title", song_attributes), - albumpos: this.getXmlAttribute("track", song_attributes), - source: this.settings.name, - size: this.getXmlAttribute("size", song_attributes), - duration: this.getXmlAttribute("duration", song_attributes), - bitrate: this.getXmlAttribute("bitRate", song_attributes), - url: this.buildBaseUrl("/rest/stream.view") + "&id=" + this.getXmlAttribute("id", song_attributes), - extension: this.getXmlAttribute("suffix", song_attributes), - year: this.getXmlAttribute("year", song_attributes) - }; - }, - - decodeEntity : function(str) - { - this.element.innerHTML = str; - return this.element.textContent; + "&v=" + this.subsonic_api + + "&c=tomahawk" + + "&f=json"; }, parseSongFromAttributes : function(song_attributes) { return { - artist: this.decodeEntity(song_attributes["artist"]), - album: this.decodeEntity(song_attributes["album"]), - track: this.decodeEntity(song_attributes["title"]), + artist: song_attributes["artist"], + album: song_attributes["album"], + track: song_attributes["title"], albumpos: song_attributes["track"], source: this.settings.name, size: song_attributes["size"], @@ -192,11 +208,11 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { bitrate: song_attributes["bitRate"], url: this.buildBaseUrl("/rest/stream.view") + "&id=" + song_attributes["id"], extension: song_attributes["suffix"], - year: song_attributes["year"], + year: song_attributes["year"] }; }, - executeSearchQuery : function(qid, search_url, song_xml_tag, limit) + executeSearchQuery : function(qid, search_url, isResolve) { var results = []; var that = this; // needed so we can reference this from within the lambda @@ -204,14 +220,18 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { // Important to recognize this async request is doing a get and the user / password is passed in the search url // TODO: should most likely just use the xhr object and doing basic authentication. Tomahawk.asyncRequest(search_url, function(xhr) { - var dom_parser = new DOMParser(); - xmlDoc = dom_parser.parseFromString(xhr.responseText, "text/xml"); + doc = JSON.parse(xhr.responseText); - var search_results = xmlDoc.getElementsByTagName(song_xml_tag); - Tomahawk.log(search_results.length + " results returned.") - for (var count = 0; count < Math.min(search_results.length, limit); count++) + var searchResults; + if (isResolve){ + searchResults = doc["subsonic-response"].searchResult.match; + } else { + searchResults = doc["subsonic-response"].searchResult3.song; + } + Tomahawk.log(searchResults.length + " results returned."); + for (var i = 0; i < searchResults.length; i++) { - results.push(that.parseSongFromXmlAttributes(search_results[count].attributes)); + results.push(that.parseSongFromAttributes(searchResults[i])); } var return_songs = { @@ -265,7 +285,6 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { executeAlbumsQuery : function(qid, search_url, artist) { var results = []; - search_url += "&f=json"; //for large responses we surely want JSON // Important to recognize this async request is doing a get and the user / password is passed in the search url // TODO: should most likely just use the xhr object and doing basic authentication. @@ -273,7 +292,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { var doc = JSON.parse(xhr.responseText); Tomahawk.log("subsonic albums query:" + search_url); Tomahawk.log("subsonic albums response:" + xhr.responseText); - var albums = doc["subsonic-response"].searchResult2.album; + var albums = doc["subsonic-response"].searchResult3.album; if (albums instanceof Array) { @@ -282,7 +301,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { { if (albums[i].artist.toLowerCase() === artist.toLowerCase()) //search2 does partial matches { - results.push(albums[i].album) + results.push(albums[i].name) } } } @@ -290,7 +309,7 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { { if (albums.artist.toLowerCase() === artist.toLowerCase()) { - results.push(albums.album); + results.push(albums.name); } } @@ -309,7 +328,6 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { { var results = []; var that = this; - search_url += "&f=json"; //for large responses we surely want JSON // Important to recognize this async request is doing a get and the user / password is passed in the search url // TODO: should most likely just use the xhr object and doing basic authentication. @@ -358,29 +376,29 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { //! Please note i am using the deprecated search method in resolve // The reason i am doing this is because it allows me to get a little more specific with the search // since i have the artist, album and title i want to be as specific as possible - // NOTE: I do use the newer search2.view in the search method below and it will populate each result with the + // NOTE: I do use the newer search3.view in the search method below and it will populate each result with the // appropriate url. resolve: function(qid, artist, album, title) { - if (this.user === undefined || this.password === undefined || this.subsonic_url === undefined) + if (!this.user || !this.password || !this.host || !this.port) return { qid: qid, results: [] }; var search_url = this.buildBaseUrl("/rest/search.view") + "&artist=" + artist + "&album=" + album + "&title=" + title + "&count=1"; - this.executeSearchQuery(qid, search_url, "match", 1); + this.executeSearchQuery(qid, search_url, true); }, search: function( qid, searchString ) { - if (this.user === undefined || this.password === undefined || this.subsonic_url === undefined) + if (!this.user || !this.password || !this.host || !this.port) return { qid: qid, results: [] }; - var search_url = this.buildBaseUrl("/rest/search2.view") + "&songCount=" + this.max_songs + "&query=\"" + encodeURIComponent(searchString) + "\""; - this.executeSearchQuery(qid, search_url, "song", this.max_songs); + var search_url = this.buildBaseUrl("/rest/search3.view") + "&songCount=100&query=\"" + encodeURIComponent(searchString) + "\""; + this.executeSearchQuery(qid, search_url, false); }, artists: function( qid ) { - if (this.user === undefined || this.password === undefined || this.subsonic_url === undefined) + if (!this.user || !this.password || !this.host || !this.port) return { qid: qid, artists: [] }; var artists_url = this.buildBaseUrl("/rest/getArtists.view"); @@ -389,17 +407,17 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { albums: function( qid, artist ) { - if (this.user === undefined || this.password === undefined || this.subsonic_url === undefined) + if (!this.user || !this.password || !this.host || !this.port) return { qid: qid, artist: artist, albums: [] }; - var search_url = this.buildBaseUrl("/rest/search2.view") + "&songCount=0&artistCount=0&albumCount=900" + + var search_url = this.buildBaseUrl("/rest/search3.view") + "&songCount=0&artistCount=0&albumCount=900" + "&query=\"" + encodeURIComponent(artist) + "\""; this.executeAlbumsQuery(qid, search_url, artist); }, tracks: function( qid, artist, album ) { - if (this.user === undefined || this.password === undefined || this.subsonic_url === undefined) + if (!this.user || !this.password || !this.host || !this.port) return { qid: qid, artist: artist, album: album, tracks: [] }; // See note for resolve() about the search method @@ -412,26 +430,23 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { collection: function() { - //strip http:// and trailing slash - var desc = this.subsonic_url.replace(/^http:\/\//,"") - .replace(/\/$/, "") - .replace(/\/remote.php\/submedia/, ""); - - var return_object = { - prettyname: "Subsonic", - description: desc, - iconfile: "subsonic-icon.png" - }; - + var prettyname; + var iconfile; //Icon and text specific for Runners-ID - if (desc.indexOf("runners-id.com") !== -1 || - desc.indexOf("runners-id.org") !== -1 ) - { - return_object["prettyname"] = "Runners-ID"; - return_object["iconfile"] = "runnersid-icon.png"; + if (this.host.indexOf("runners-id.com") !== -1 || + this.host.indexOf("runners-id.org") !== -1) { + prettyname = "Runners-ID"; + iconfile = "runnersid-icon.png"; + } else { + prettyname = "Subsonic"; + iconfile = "subsonic-icon.png"; } - return return_object; + return { + prettyname: prettyname, + description: this.host + ":" + this.port, + iconfile: iconfile + }; } }); diff --git a/subsonic/content/metadata.json b/subsonic/content/metadata.json index fc06b328d..7098f89de 100644 --- a/subsonic/content/metadata.json +++ b/subsonic/content/metadata.json @@ -1,9 +1,9 @@ { "name": "Subsonic", "pluginName": "subsonic", - "author": "mack_t and Teo", + "author": "mack_t, Teo and Enno", "email": "teo@kde.org", - "version": "0.5.2", + "version": "0.6.0", "website": "http://gettomahawk.com", "description": "Searches your Subsonic server for music to play", "platform": "any", From 3e6ca41e234657d43b40f10d0751944f105ad795 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sat, 12 Jul 2014 15:15:52 +0200 Subject: [PATCH 268/597] [subsonic] Added configTest method to subsonic resolver. --- subsonic/content/contents/code/subsonic.js | 42 ++++++++++++++++++++++ subsonic/content/metadata.json | 5 ++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/subsonic/content/contents/code/subsonic.js b/subsonic/content/contents/code/subsonic.js index 995b27381..507af5c99 100644 --- a/subsonic/content/contents/code/subsonic.js +++ b/subsonic/content/contents/code/subsonic.js @@ -185,6 +185,48 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { } ); }, + configTest: function () { + Tomahawk.asyncRequest(this.buildBaseUrl("/rest/ping.view"), + function (xhr) { + try { + var response = JSON.parse(xhr.responseText); + } catch (e) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } + if (response && response["subsonic-response"] + && response["subsonic-response"].status) { + if (response["subsonic-response"].status === "ok") { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success); + } else { + if (response["subsonic-response"].error) { + if (response["subsonic-response"].error.code === 40) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials); + } else if (response["subsonic-response"].error.code === 50) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidAccount); + } else if (response["subsonic-response"].error.message) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + response["subsonic-response"].error.message); + } + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } + } + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } + }, {}, { + errorHandler: function (xhr) { + if (xhr.status == 404 || xhr.status == 0) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + xhr.responseText.trim()); + } + } + } + ); + }, + buildBaseUrl : function(subsonic_view) { return this.host + ":" + this.port + subsonic_view + diff --git a/subsonic/content/metadata.json b/subsonic/content/metadata.json index 7098f89de..b1f776c32 100644 --- a/subsonic/content/metadata.json +++ b/subsonic/content/metadata.json @@ -19,5 +19,8 @@ "contents/code/subsonic-icon.png", "contents/code/subsonic.png" ] - } + }, + "staticCapabilities": [ + "configTestable" + ] } From db515ddb46c8689890c8b4b1a21df1f18b10145e Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sat, 12 Jul 2014 15:32:28 +0200 Subject: [PATCH 269/597] [grooveshark] Fixed code-style and log output. --- .../content/contents/code/grooveshark.js | 164 ++++++++---------- 1 file changed, 69 insertions(+), 95 deletions(-) diff --git a/grooveshark/content/contents/code/grooveshark.js b/grooveshark/content/contents/code/grooveshark.js index 76693fd14..5bf452715 100644 --- a/grooveshark/content/contents/code/grooveshark.js +++ b/grooveshark/content/contents/code/grooveshark.js @@ -112,7 +112,6 @@ function removeDiacritics (str) { var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { apiKey: "tomahawkplayer", - tinySongKey: "2b8a3ea77bfd0f57bd5d06abae606dbc", sessionId: "", streamKeys: [], ip: "", @@ -126,10 +125,10 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { weight: 30, timeout: 20 }, + getConfigUi: function () { var uiData = Tomahawk.readBase64("config.ui"); return { - "widget": uiData, fields: [{ name: "username", @@ -139,21 +138,20 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { name: "password", widget: "passwordLineEdit", property: "text" - }, ], + }], images: [{ "grooveshark.png": Tomahawk.readBase64("grooveshark.png") - }, ] + }] }; }, + newConfigSaved: function () { var userConfig = this.getUserConfig(); - Tomahawk.log("In newConfigSaved... " + userConfig.username + " compared to " + this.username); + Tomahawk.log("newConfigSaved - username: " + userConfig.username); if ((userConfig.username != this.username) || (userConfig.password != this.password)) { Tomahawk.log("Saving new Grooveshark credentials with username:" + userConfig.username); this.sessionId = ""; this.countryId = ""; - window.localStorage['sessionId'] = ""; - window.localStorage['countryId'] = ""; this.username = userConfig.username; this.password = userConfig.password; @@ -161,6 +159,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { this.init(); } }, + getClientIP: function() { var that = this; Tomahawk.asyncRequest( "http://toma.hk?stat=1", function(xhr) { @@ -170,13 +169,14 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { } }); }, + apiCallSync: function (methodName, args) { var payload = { method: methodName }; payload.header = { wsKey: this.apiKey - } + }; if (this.sessionId != "") { payload.header.sessionID = this.sessionId; } @@ -206,7 +206,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }; payload.header = { wsKey: this.apiKey - } + }; if (this.sessionId != "") { payload.header.sessionID = this.sessionId; } @@ -217,9 +217,10 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { var url = "https://api.grooveshark.com/ws/3.0/?sig=" + sig; this.doPost(url, json, callback); }, + doPost: function (url, body, callback) { var xmlHttpRequest = new XMLHttpRequest(); - Tomahawk.log("DOing post:" + url + ", with body:" + body); + Tomahawk.log("Doing post:" + url + ", with body:" + body); xmlHttpRequest.open('POST', url, true); xmlHttpRequest.setRequestHeader("Content-Type", "application/octet-stream"); xmlHttpRequest.setRequestHeader("X-Client-IP", this.ip); @@ -236,8 +237,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { this.getSessionId(); } } - } -// Tomahawk.log("Post Body: " + body); + }; xmlHttpRequest.send(body); }, @@ -267,13 +267,13 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { } // Testing only -// Tomahawk.log("Getting playlist songs!"); -// this.apiCall('getPlaylistSongs', { playlistID: '64641975' }, function (xhr) { -// Tomahawk.log("PLAYLIST RESPONSE: " + xhr.responseText ); -// }); -// this.apiCall('getSongsInfo', { songIDs: ['3GBAjY'] }, function(xhr) { -// Tomahawk.log("GOT SONG INFO:" + xhr.responseText ); -// }); + //Tomahawk.log("Getting playlist songs!"); + //this.apiCall('getPlaylistSongs', { playlistID: '64641975' }, function (xhr) { + // Tomahawk.log("PLAYLIST RESPONSE: " + xhr.responseText ); + //}); + //this.apiCall('getSongsInfo', { songIDs: ['3GBAjY'] }, function(xhr) { + // Tomahawk.log("GOT SONG INFO:" + xhr.responseText ); + //}); }, getSessionId: function () { @@ -302,8 +302,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { var ret = JSON.parse(xhr.responseText); if (ret.result.success) { if (!ret.result.IsAnywhere) { - alert("Tomahawk requires a Grooveshark Anywhere account!"); - return; + Tomahawk.log("Tomahawk requires a Grooveshark Anywhere account!"); } else if (!this.countryId) { that.getCountry(); } @@ -312,8 +311,8 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }, getCountry: function () { - var that = this; - Tomahawk.log("Grooveshark resolver Getting country..." ); + var that = this; + Tomahawk.log("Grooveshark resolver Getting country..."); this.apiCall('getCountry', [], function (xhr) { var ret = JSON.parse(xhr.responseText); that.countryId = JSON.stringify(ret.result); @@ -358,83 +357,57 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }, doSearchOrResolve: function(qid, queryText, limit) { - if (!this.countryId) { - Tomahawk.log("No country id, skipping resolving"); + if (!this.countryId) { + Tomahawk.log("No country id, skipping resolving"); + return; + } + if (!this.sessionId) { + Tomahawk.log("No session id, skipping resolving"); + return; + } + + var params = { + query: queryText, + country: this.countryId, + limit: limit + }; + + var that = this; + this.apiCall("getSongSearchResults", params, function (xhr) { + //Tomahawk.log("Got song search results: " + xhr.responseText); + var ret = JSON.parse(xhr.responseText); + if (!ret || !ret.result || !ret.result.songs) { return; } - if (!this.sessionId) { - Tomahawk.log("No session id, skipping resolving"); + var songs = ret.result.songs; + var results = [] + + if (songs.length === 0) + // we should try without artist name, just album song name + { return; } - - // var query = artist + " " + title; - // var that = this; - // var url = "http://tinysong.com/b/" + query + "?format=json&key=" + this.tinySongKey; - // Tomahawk.asyncRequest(url, function(xhr) { - // Tomahawk.log("Got song search results: " + xhr.responseText); - // var ret = JSON.parse(xhr.responseText); - // if (!ret || !ret.SongID) { - // Tomahawk.log("Grooveshark could not parse output of TinySong query or SongID:" + xhr.responseText); - // return; - // } - // Tomahawk.log("Returning: " + ret.SongID ); - // var songResult = { - // artist: ret.ArtistName, - // album: ret.AlbumName, - // track: ret.SongName, - // source: that.settings.name, - // url: "groove://" + ret.SongID, - // mimetype: 'audio/mpeg', - // // duration: ret.result.uSecs / 1000000, - // // score: Tomahawk.valueForSubNode(song, "rating") - // } - // - // var toReturn = { - // results: [ songResult ], - // qid: qid - // }; - // Tomahawk.addTrackResults(toReturn); - // }); - - var params = { - query: queryText, - country: this.countryId, - limit: limit - }; - - - var that = this; - this.apiCall("getSongSearchResults", params, function (xhr) { - //Tomahawk.log("Got song search results: " + xhr.responseText); - var ret = JSON.parse(xhr.responseText); - if (!ret || !ret.result || !ret.result.songs) return; - var songs = ret.result.songs; - var results = [] - - if (songs.length === 0) - // we should try without artist name, just album song name - return; - Tomahawk.log("Got search result with num of songs: " + songs.length); - for (var i = 0; i < songs.length; i++) { - var song = songs[i]; - var songResult = { - artist: song.ArtistName, - album: song.AlbumName, - track: song.SongName, - source: that.settings.name, - url: "groove://" + song.SongID, - mimetype: 'audio/mpeg' - //duration: ret.result.uSecs/ 1000000 - // score: Tomahawk.valueForSubNode(song, "rating") - } - results.push(songResult); - } - var toReturn = { - results: results, - qid: qid + Tomahawk.log("Got search result with num of songs: " + songs.length); + for (var i = 0; i < songs.length; i++) { + var song = songs[i]; + var songResult = { + artist: song.ArtistName, + album: song.AlbumName, + track: song.SongName, + source: that.settings.name, + url: "groove://" + song.SongID, + mimetype: 'audio/mpeg' + //duration: ret.result.uSecs/ 1000000 + // score: Tomahawk.valueForSubNode(song, "rating") }; - Tomahawk.addTrackResults(toReturn); - }); + results.push(songResult); + } + var toReturn = { + results: results, + qid: qid + }; + Tomahawk.addTrackResults(toReturn); + }); }, resolve: function (qid, artist, album, title) { @@ -448,6 +421,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { // we use removeDiacritics cause it seems to have some problem in grooveshark resolving this.doSearchOrResolve(qid, removeDiacritics(searchString), 1); }, + search: function (qid, searchString) { this.doSearchOrResolve(qid, searchString, 15); } From 9c398efb5a5d87f104a92df9971c78badac719f7 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sat, 12 Jul 2014 18:54:22 +0200 Subject: [PATCH 270/597] [grooveshark] Reorganized and fixed the grooveshark resolver (proper md5/hmac hash). --- .../content/contents/code/grooveshark.js | 303 ++++++++---------- grooveshark/content/metadata.json | 4 +- 2 files changed, 144 insertions(+), 163 deletions(-) diff --git a/grooveshark/content/contents/code/grooveshark.js b/grooveshark/content/contents/code/grooveshark.js index 5bf452715..3cfdf15f9 100644 --- a/grooveshark/content/contents/code/grooveshark.js +++ b/grooveshark/content/contents/code/grooveshark.js @@ -113,9 +113,8 @@ function removeDiacritics (str) { var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { apiKey: "tomahawkplayer", sessionId: "", - streamKeys: [], + countryId: "", ip: "", - numSessionKeysTries : 0, spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, @@ -160,87 +159,6 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { } }, - getClientIP: function() { - var that = this; - Tomahawk.asyncRequest( "http://toma.hk?stat=1", function(xhr) { - var result = JSON.parse(xhr.responseText); - if (result.ip) { - that.ip = result.ip; - } - }); - }, - - apiCallSync: function (methodName, args) { - var payload = { - method: methodName - }; - payload.header = { - wsKey: this.apiKey - }; - if (this.sessionId != "") { - payload.header.sessionID = this.sessionId; - } - payload.parameters = args; - - var json = JSON.stringify(payload); - var sig = Tomahawk.hmac(this.secret, json); - var url = "https://api.grooveshark.com/ws/3.0/?sig=" + sig; - - var xmlHttpRequest = new XMLHttpRequest(); - xmlHttpRequest.open('POST', url, false); - xmlHttpRequest.setRequestHeader("Content-Type", "application/octet-stream"); - Tomahawk.log("URL: " + url); - Tomahawk.log("Post Body: " + json); - xmlHttpRequest.send(json); - if (xmlHttpRequest.status == 200) { - return xmlHttpRequest.responseText; - } else { - Tomahawk.log("Failed to do SYNCHRONOUS POST request: to: " + url + " and with body: " + json); - Tomahawk.log("Status Code was: " + xmlHttpRequest.status); - } - }, - - apiCall: function (methodName, args, callback) { - var payload = { - method: methodName - }; - payload.header = { - wsKey: this.apiKey - }; - if (this.sessionId != "") { - payload.header.sessionID = this.sessionId; - } - payload.parameters = args; - - var json = JSON.stringify(payload); - var sig = Tomahawk.hmac(this.secret, json); - var url = "https://api.grooveshark.com/ws/3.0/?sig=" + sig; - this.doPost(url, json, callback); - }, - - doPost: function (url, body, callback) { - var xmlHttpRequest = new XMLHttpRequest(); - Tomahawk.log("Doing post:" + url + ", with body:" + body); - xmlHttpRequest.open('POST', url, true); - xmlHttpRequest.setRequestHeader("Content-Type", "application/octet-stream"); - xmlHttpRequest.setRequestHeader("X-Client-IP", this.ip); - xmlHttpRequest.onreadystatechange = function () { - - if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) { - Tomahawk.log("Succeeded to do POST request: to: " + url + " and with body: " + body + "\n" + xmlHttpRequest.responseText); - callback.call(window, xmlHttpRequest); - } else if (xmlHttpRequest.readyState === 4) { - Tomahawk.log("Failed to do POST request: to: " + url + " and with body: " + body); - Tomahawk.log("Status Code was: " + xmlHttpRequest.status); - if (this.sessionId) { // if an error occurred, try re-fetching session id once - this.sessionId = ""; - this.getSessionId(); - } - } - }; - xmlHttpRequest.send(body); - }, - init: function () { var userConfig = this.getUserConfig(); if (!userConfig.username || !userConfig.password) { @@ -248,23 +166,13 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { return; } Tomahawk.log("Doing Grooveshark resolver init, got credentials: " + userConfig.username ); + this.secret = this.spell("499pn17500pq8r20nso1613p2q264r7r"); this.username = userConfig.username; this.password = userConfig.password; - this.sessionId = window.localStorage['sessionId']; - this.countryId = window.localStorage['countryId']; + this.authenticate(); - this.getClientIP(); - - this.secret = this.spell("499pn17500pq8r20nso1613p2q264r7r"); - - Tomahawk.addCustomUrlHandler( "groove", "getStreamUrl" ); - - if (!this.sessionId) { - this.getSessionId(); - } else if (!this.countryId || this.countryId == '') { - this.getCountry(); - } + Tomahawk.addCustomUrlHandler("groove", "getStreamUrl", true); // Testing only //Tomahawk.log("Getting playlist songs!"); @@ -276,105 +184,178 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { //}); }, - getSessionId: function () { - var that = this; - this.apiCall("startSession", [], function (xhr) { - var res = JSON.parse(xhr.responseText); - if ( res.result && res.result.success) { - Tomahawk.log("Got grooveshark session id"); - that.sessionId = res.result.sessionID; - window.localStorage['sessionId'] = that.sessionId; - that.authenticate(); - } else { - Tomahawk.log("Not able to get session id.. " + xhr.responseText); - } - }); - }, authenticate: function () { + Tomahawk.log("Grooveshark resolver authenticating with username: " + this.username); + var hashString; + if (typeof CryptoJS.MD5 == "function") { + hashString = CryptoJS.MD5(this.password).toString(CryptoJS.enc.Hex); + } else { + hashString = Tomahawk.md5(this.password); + } var params = { login: this.username, - password: Tomahawk.md5(this.password) + password: hashString }; - var that = this; - Tomahawk.log("Grooveshark resolver authenticating with username: " + this.username ); - this.apiCall("authenticate", params, function (xhr) { + this.apiCallWithSessionId("authenticate", params, function (xhr) { Tomahawk.log("Got result of authenticate: " + xhr.responseText); var ret = JSON.parse(xhr.responseText); if (ret.result.success) { if (!ret.result.IsAnywhere) { Tomahawk.log("Tomahawk requires a Grooveshark Anywhere account!"); - } else if (!this.countryId) { - that.getCountry(); } } }); }, - getCountry: function () { + ensureSessionId: function (callback) { + if (this.sessionId) { + if (callback) { + callback.call(window); + } + } else { + var that = this; + this.apiCall("startSession", [], function (xhr) { + var res = JSON.parse(xhr.responseText); + if (res.result && res.result.success) { + Tomahawk.log("Got grooveshark session id"); + that.sessionId = res.result.sessionID; + if (callback) { + callback.call(window); + } + } else { + Tomahawk.log("Not able to get session id.. " + xhr.responseText); + } + }); + } + }, + + ensureClientIP: function (callback) { + if (this.ip) { + if (callback) { + callback.call(window); + } + } else { + var that = this; + Tomahawk.asyncRequest("http://toma.hk?stat=1", function (xhr) { + var result = JSON.parse(xhr.responseText); + if (result.ip) { + that.ip = result.ip; + if (callback) { + callback.call(window); + } + } + }); + } + }, + + ensureCountryId: function (callback) { + if (this.countryId) { + if (callback) { + callback.call(window); + } + } else { + var that = this; + Tomahawk.log("Grooveshark resolver Getting country..."); + that.ensureClientIP(function () { + that.apiCall('getCountry', [], function (xhr) { + var ret = JSON.parse(xhr.responseText); + if (ret.result) { + that.countryId = ret.result; + Tomahawk.log("Got country id: " + that.countryId); + if (callback) { + callback.call(window); + } + } else { + Tomahawk.log("Not able to get country id.. " + xhr.responseText); + } + }); + }); + } + }, + + apiCall: function (methodName, args, callback) { + Tomahawk.log("apiCall - methodName: " + methodName + ", args: " + args); + var payload = { + method: methodName + }; + payload.header = { + wsKey: this.apiKey + }; + if (this.sessionId != "") { + payload.header.sessionID = this.sessionId; + } + payload.parameters = args; + + var data = JSON.stringify(payload); + var sig; + if (typeof CryptoJS.HmacMD5 == "function") { + sig = CryptoJS.HmacMD5(data, this.secret).toString(CryptoJS.enc.Hex); + } else { + sig = Tomahawk.hmac(this.secret, data); + } + var url = "https://api.grooveshark.com/ws/3.0/?sig=" + sig; + + var headers = { + "Content-Type": "application/json" + }; + Tomahawk.asyncRequest(url, callback, headers, { + method: 'POST', + data: data + }); + }, + + apiCallWithCountryId: function (methodName, args, callback) { var that = this; - Tomahawk.log("Grooveshark resolver Getting country..."); - this.apiCall('getCountry', [], function (xhr) { - var ret = JSON.parse(xhr.responseText); - that.countryId = JSON.stringify(ret.result); - Tomahawk.log("Got country id: " + that.countryId); - window.localStorage['countryId'] = that.countryId; + that.ensureSessionId(function () { + that.ensureCountryId(function () { + args.country = that.countryId; + Tomahawk.log("Setting country id: " + args.country); + that.apiCall(methodName, args, callback); + }); + }); + }, - // Finally ready + apiCallWithSessionId: function (methodName, args, callback) { + var that = this; + that.ensureSessionId(function () { + that.apiCall(methodName, args, callback); }); }, - getStreamUrl: function (ourUrl) { - var songId = ourUrl.replace("groove://", ""); + getStreamUrl: function (qid, url) { + var songId = url.replace("groove://", ""); //Tomahawk.log("Got factory function called to get grooveshark streaming url from:" + ourUrl + " and songId:" + songId); var params = { - songID: songId, - country: JSON.parse(this.countryId) + songID: songId }; - var streamResult = this.apiCallSync('getSubscriberStreamKey', params ); - //Tomahawk.log("Got song stream server: " + streamResult); - var ret = JSON.parse(streamResult); - if (ret.errors) { - Tomahawk.log("Got error doing getSubscriberStreamKey api call: " + streamResult); - if (this.numSessionKeysTries < 5) - { - Tomahawk.log("Retrying to get a new session key!") - this.sessionId = ""; - this.getSessionId(); - this.numSessionKeysTries = this.numSessionKeysTries + 1; + var that=this; + that.apiCallWithCountryId('getSubscriberStreamKey', params, function (request) { + Tomahawk.log("Got song stream url: " + request.responseText); + var ret = JSON.parse(request.responseText); + if (ret.errors) { + Tomahawk.log("Error doing getSubscriberStreamKey api call: " + + request.responseText); + Tomahawk.log("Deleting old session key!"); + that.sessionId = ""; + } else { + // ret.result.duration contains the duration of the song, we should update the duration here ! + Tomahawk.log("Reporting song stream url: " + ret.result.url); + Tomahawk.reportStreamUrl(qid, ret.result.url); } - } else { - var url = unescape(ret.result.url); - Tomahawk.log("Found MP3 URL: " + ret.result.url); - this.streamKeys[songId] = ret.result.StreamKey; - // ret.result.duration contains the duration of the song, we should update the duration here ! - - return url; - } - - return ""; + }); }, doSearchOrResolve: function(qid, queryText, limit) { - if (!this.countryId) { - Tomahawk.log("No country id, skipping resolving"); - return; - } - if (!this.sessionId) { - Tomahawk.log("No session id, skipping resolving"); - return; - } - var params = { query: queryText, - country: this.countryId, limit: limit }; var that = this; - this.apiCall("getSongSearchResults", params, function (xhr) { - //Tomahawk.log("Got song search results: " + xhr.responseText); + this.apiCallWithCountryId("getSongSearchResults", params, function (xhr) { + Tomahawk.log("Got song search results: " + xhr.responseText); var ret = JSON.parse(xhr.responseText); if (!ret || !ret.result || !ret.result.songs) { return; diff --git a/grooveshark/content/metadata.json b/grooveshark/content/metadata.json index 15b9939b8..a92c6992e 100644 --- a/grooveshark/content/metadata.json +++ b/grooveshark/content/metadata.json @@ -1,9 +1,9 @@ { "name": "Grooveshark", "pluginName": "grooveshark", - "author": "Leo Franchi", + "author": "Leo Franchi and Enno", "email": "lfranchi@kde.org", - "version": "0.6.4", + "version": "0.7.0", "website": "http://gettomahawk.com", "description": "Searches Grooveshark for playable tracks, requires premium account", "type": "resolver/javascript", From ec40381bd7210c4503ca147aeefe7608da555106 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Sat, 12 Jul 2014 22:31:10 +0200 Subject: [PATCH 271/597] [grooveshark] Added configTest methods. --- .../content/contents/code/grooveshark.js | 46 +++++++++++++++---- grooveshark/content/metadata.json | 5 +- 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/grooveshark/content/contents/code/grooveshark.js b/grooveshark/content/contents/code/grooveshark.js index 3cfdf15f9..5608d8a58 100644 --- a/grooveshark/content/contents/code/grooveshark.js +++ b/grooveshark/content/contents/code/grooveshark.js @@ -184,7 +184,11 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { //}); }, - authenticate: function () { + configTest: function() { + this.authenticate(true); + }, + + authenticate: function (doConfigTest) { Tomahawk.log("Grooveshark resolver authenticating with username: " + this.username); var hashString; if (typeof CryptoJS.MD5 == "function") { @@ -196,18 +200,36 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { login: this.username, password: hashString }; + var errorHandler; + if (doConfigTest){ + errorHandler = function () { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + }; + } this.apiCallWithSessionId("authenticate", params, function (xhr) { Tomahawk.log("Got result of authenticate: " + xhr.responseText); var ret = JSON.parse(xhr.responseText); if (ret.result.success) { - if (!ret.result.IsAnywhere) { + if (ret.result.UserID == 0) { + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials); + } + } else if (!ret.result.IsAnywhere) { + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + "Tomahawk requires a Grooveshark Anywhere account."); + } Tomahawk.log("Tomahawk requires a Grooveshark Anywhere account!"); + } else if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success); } + } else if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidAccount); } - }); + }, errorHandler); }, - ensureSessionId: function (callback) { + ensureSessionId: function (callback, errorHandler) { if (this.sessionId) { if (callback) { callback.call(window); @@ -223,9 +245,12 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { callback.call(window); } } else { + if (errorHandler) { + errorHandler.call(window); + } Tomahawk.log("Not able to get session id.. " + xhr.responseText); } - }); + }, errorHandler); } }, @@ -273,7 +298,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { } }, - apiCall: function (methodName, args, callback) { + apiCall: function (methodName, args, callback, errorHandler) { Tomahawk.log("apiCall - methodName: " + methodName + ", args: " + args); var payload = { method: methodName @@ -300,7 +325,8 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }; Tomahawk.asyncRequest(url, callback, headers, { method: 'POST', - data: data + data: data, + errorHandler: errorHandler }); }, @@ -315,11 +341,11 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }); }, - apiCallWithSessionId: function (methodName, args, callback) { + apiCallWithSessionId: function (methodName, args, callback, errorHandler) { var that = this; that.ensureSessionId(function () { - that.apiCall(methodName, args, callback); - }); + that.apiCall(methodName, args, callback, errorHandler); + }, errorHandler); }, getStreamUrl: function (qid, url) { diff --git a/grooveshark/content/metadata.json b/grooveshark/content/metadata.json index a92c6992e..b2c23544c 100644 --- a/grooveshark/content/metadata.json +++ b/grooveshark/content/metadata.json @@ -17,5 +17,8 @@ "contents/code/grooveshark.svg", "contents/code/grooveshark-icon.png" ] - } + }, + "staticCapabilities": [ + "configTestable" + ] } From cd490635b5b3475d503c93bc6d85e9e948f650db Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 17:17:51 +0200 Subject: [PATCH 272/597] [ampache] Minor fix in generateUrl function --- ampache/content/contents/code/ampache.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ampache/content/contents/code/ampache.js b/ampache/content/contents/code/ampache.js index c6ce1b884..89964b106 100644 --- a/ampache/content/contents/code/ampache.js +++ b/ampache/content/contents/code/ampache.js @@ -159,11 +159,16 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { params['action'] = action; params['auth'] = auth; - + var first = true; for (param in params) { if (typeof (params[param]) == 'string') params[param] = params[param].trim(); - ampacheUrl += encodeURIComponent(param) + "=" + encodeURIComponent(params[param]) + "&"; + if (!first) { + ampacheUrl += "&"; + } else { + first = false; + } + ampacheUrl += encodeURIComponent(param) + "=" + encodeURIComponent(params[param]); } return ampacheUrl; }, From 466be3a8f1c6782c41725d0a60ad32187075938e Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 17:53:50 +0200 Subject: [PATCH 273/597] [ampache] Added configTest function --- ampache/content/contents/code/ampache.js | 27 ++++++++++++++++++++++++ ampache/content/metadata.json | 7 ++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/ampache/content/contents/code/ampache.js b/ampache/content/contents/code/ampache.js index 89964b106..5089fa418 100644 --- a/ampache/content/contents/code/ampache.js +++ b/ampache/content/contents/code/ampache.js @@ -104,6 +104,33 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { if (pingInterval) window.setInterval(this.ping, pingInterval - 60); }, + configTest: function () { + var that = this; + Tomahawk.asyncRequest(this.generateUrl('handshake', this.passphrase, this.params), + function (xhr) { + // parse the result + var domParser = new DOMParser(); + xmlDoc = domParser.parseFromString(xhr.responseText, "text/xml"); + that.applyHandshake(xmlDoc); + + if (!that.auth) { + Tomahawk.log("auth failed: " + xhr.responseText); + var error = xmlDoc.getElementsByTagName("error")[0]; + if (typeof error != 'undefined' && error.getAttribute("code") == "403") { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidAccount); + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials); + } + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success); + } + }, {}, { + errorHandler: function () { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } + }); + }, + init: function () { // check resolver is properly configured var userConfig = this.getUserConfig(); diff --git a/ampache/content/metadata.json b/ampache/content/metadata.json index bc0b84397..aecdccc52 100644 --- a/ampache/content/metadata.json +++ b/ampache/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "ampache", "author": "Dominik, Leo and Teo", "email": "teo@kde.org", - "version": "0.3.1", + "version": "0.3.2", "website": "http://gettomahawk.com", "description": "Connects to an Ampache or ownCloud server and resolves tracks", "type": "resolver/javascript", @@ -18,5 +18,8 @@ "contents/code/owncloud-icon.png", "contents/code/owncloud.png" ] - } + }, + "staticCapabilities": [ + "configTestable" + ] } From 320b7179af839a0b77c8d47278fa9dde3027a0e9 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 18:09:33 +0200 Subject: [PATCH 274/597] [ampache] Use CryptoJS directly, if present. --- ampache/content/contents/code/ampache.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ampache/content/contents/code/ampache.js b/ampache/content/contents/code/ampache.js index 5089fa418..cfc37f16b 100644 --- a/ampache/content/contents/code/ampache.js +++ b/ampache/content/contents/code/ampache.js @@ -74,8 +74,13 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { { // prepare handshake arguments var time = Tomahawk.timestamp(); - var key = Tomahawk.sha256(this.password); - this.passphrase = Tomahawk.sha256(time + key); + if (typeof CryptoJS.SHA256 == "function") { + var key = CryptoJS.SHA256(this.password).toString(CryptoJS.enc.Hex); + this.passphrase = CryptoJS.SHA256(time + key).toString(CryptoJS.enc.Hex); + } else { + var key = Tomahawk.sha256(this.password); + this.passphrase = Tomahawk.sha256(time + key); + } // do the handshake this.params = { From d384c1e8c67c2450216ce507855ff8bca6de6c47 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 21:54:41 +0200 Subject: [PATCH 275/597] [ampache] Updated resolver icon. Fixed alignment of pixmap in config.ui. --- .../content/contents/code/ampache-icon.png | Bin 11781 -> 44641 bytes ampache/content/contents/code/ampache.png | Bin 18077 -> 19262 bytes ampache/content/contents/code/config.ui | 3 +++ ampache/content/contents/images/icon.png | Bin 11781 -> 44641 bytes 4 files changed, 3 insertions(+) diff --git a/ampache/content/contents/code/ampache-icon.png b/ampache/content/contents/code/ampache-icon.png index f555e5dbe8ca6fccf54a36336dcac66dc462d11b..ed29e845e7967a36c2122a239fafece8fcf36270 100644 GIT binary patch delta 42263 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 delta 9145 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 DD5CF< diff --git a/ampache/content/contents/code/ampache.png b/ampache/content/contents/code/ampache.png index f997f080a9137c32560bd239a3a047d894dc8bfc..5e7bd7be2ba897ca4dd943f48b3c159a2ac6f4e5 100644 GIT binary patch literal 19262 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 diff --git a/ampache/content/contents/code/config.ui b/ampache/content/contents/code/config.ui index c9efa9597..c3e03573c 100644 --- a/ampache/content/contents/code/config.ui +++ b/ampache/content/contents/code/config.ui @@ -22,6 +22,9 @@ ampache.png + + Qt::AlignCenter + diff --git a/ampache/content/contents/images/icon.png b/ampache/content/contents/images/icon.png index f555e5dbe8ca6fccf54a36336dcac66dc462d11b..ed29e845e7967a36c2122a239fafece8fcf36270 100644 GIT binary patch delta 42263 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 delta 9145 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 DD5CF< From 9df3589130988932cacef387c6ca8022e6a24623 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 22:02:40 +0200 Subject: [PATCH 276/597] [qobuz] Use CryptoJS directly, if present. --- qobuz/content/contents/code/qobuz.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/qobuz/content/contents/code/qobuz.js b/qobuz/content/contents/code/qobuz.js index d84201a56..289783e47 100644 --- a/qobuz/content/contents/code/qobuz.js +++ b/qobuz/content/contents/code/qobuz.js @@ -174,15 +174,21 @@ var QobuzResolver = Tomahawk.extend(TomahawkResolver, { // We build the parameters for this call var params; + var hashString; + if (typeof CryptoJS.MD5 == "function") { + hashString = CryptoJS.MD5(this.password).toString(CryptoJS.enc.Hex); + } else { + hashString = Tomahawk.md5(this.password); + } if (this.username.indexOf('@') != -1) { params = { // User provided us with a username email: this.username, - password: Tomahawk.md5(this.password) + password: hashString }; } else { params = { // User provided us with an email username: this.username, - password: Tomahawk.md5(this.password) + password: hashString }; } @@ -253,7 +259,12 @@ var QobuzResolver = Tomahawk.extend(TomahawkResolver, { payload += this.apiParameter.secret; // Hashing Parmentier - var md5Payload = Tomahawk.md5(payload); + var md5Payload; + if (typeof CryptoJS.MD5 == "function") { + md5Payload = CryptoJS.MD5(payload).toString(CryptoJS.enc.Hex); + } else { + md5Payload = Tomahawk.md5(payload); + } // Creating the new arguments var newArgs = args; From 94183e178e84462215caca9c6bd82b3dc1c93240 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 22:10:09 +0200 Subject: [PATCH 277/597] [vkontakte] Use CryptoJS directly, if present. --- vkontakte/content/contents/code/vkontakte.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/vkontakte/content/contents/code/vkontakte.js b/vkontakte/content/contents/code/vkontakte.js index a781cd7a0..efb251a44 100644 --- a/vkontakte/content/contents/code/vkontakte.js +++ b/vkontakte/content/contents/code/vkontakte.js @@ -187,7 +187,16 @@ var VK = { var api = VK.getApiData() var url = "http://api.vk.com/api.php" - md5hash = Tomahawk.md5(api[0]+'api_id='+api[1]+'count=10format=jsonmethod=audio.searchq='+track+'sort=2test_mode=1'+api[2]) + var md5hash; + if (typeof CryptoJS.MD5 == "function") { + md5hash = CryptoJS.MD5(api[0] + 'api_id=' + api[1] + + 'count=10format=jsonmethod=audio.searchq=' + track + 'sort=2test_mode=1' + + api[2]).toString(CryptoJS.enc.Hex); + } else { + md5hash = Tomahawk.md5(api[0] + 'api_id=' + api[1] + + 'count=10format=jsonmethod=audio.searchq=' + track + 'sort=2test_mode=1' + + api[2]); + } var data = 'api_id='+api[1]+'&method=audio.search&format=json&sig='+md5hash+'&sort=2&test_mode=1&count=10&q='+encodeURIComponent(track) if (debugMode == true) { Tomahawk.log("Search url: "+url+'?'+data); } From bfeb7f1e7eff4a83934b66a258049d7aa78305bf Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 22:21:26 +0200 Subject: [PATCH 278/597] [exfm] Use CryptoJS directly, if present. --- archive/exfm/content/contents/code/exfm.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/archive/exfm/content/contents/code/exfm.js b/archive/exfm/content/contents/code/exfm.js index e7b57dd75..424dbb09f 100644 --- a/archive/exfm/content/contents/code/exfm.js +++ b/archive/exfm/content/contents/code/exfm.js @@ -168,10 +168,16 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { return that.track2Result(res.song); } else if (res.hasOwnProperty("site") && res.site.hasOwnProperty("songs")) { // A site with songs + var guid; + if (typeof CryptoJS.SHA256 == "function") { + guid = CryptoJS.SHA256(query).toString(CryptoJS.enc.Hex); + } else { + guid = Tomahawk.sha256(query); + } var result = { type: "playlist", title: res.site.title, - guid: 'exfm-site-' + Tomahawk.sha256(query), + guid: 'exfm-site-' + guid, info: "ex.fm parse of : " + res.site.url, creator: "exfm", url: url, @@ -183,10 +189,16 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.addUrlResult(url, result); } else if (res.hasOwnProperty("songs")) { // A list of songs + var guid; + if (typeof CryptoJS.SHA256 == "function") { + guid = CryptoJS.SHA256(query).toString(CryptoJS.enc.Hex); + } else { + guid = Tomahawk.sha256(query); + } var result = { type: "playlist", title: "ex.fm" + url.replace(/https?:\/\/(www\.)?ex.fm/, ''), - guid: 'exfm-playlist-' + Tomahawk.sha256(query), + guid: 'exfm-playlist-' + guid, info: "A playlist imported from ex.fm: " + url, creator: "exfm", url: url, From 7a5c3aa8c48be595fff54606aa267619680bf9f5 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Mon, 14 Jul 2014 23:09:33 +0200 Subject: [PATCH 279/597] [ampache] Improved config dialog. Added "http://" as default protocol prefix. --- ampache/content/contents/code/ampache.js | 37 +++++++++++++----------- ampache/content/contents/code/config.ui | 26 ++++++++--------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/ampache/content/contents/code/ampache.js b/ampache/content/contents/code/ampache.js index cfc37f16b..d44b0c274 100644 --- a/ampache/content/contents/code/ampache.js +++ b/ampache/content/contents/code/ampache.js @@ -36,6 +36,10 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { "widget": uiData, fields: [{ + name: "server", + widget: "serverLineEdit", + property: "text" + }, { name: "username", widget: "usernameLineEdit", property: "text" @@ -43,10 +47,6 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { name: "password", widget: "passwordLineEdit", property: "text" - }, { - name: "ampache", - widget: "ampacheLineEdit", - property: "text" }], images: [{ "owncloud.png": Tomahawk.readBase64("owncloud.png") @@ -58,13 +58,9 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { newConfigSaved: function () { var userConfig = this.getUserConfig(); - if ((userConfig.username != this.username) || (userConfig.password != this.password) || (userConfig.ampache != this.ampache)) { + if ((userConfig.username != this.username) || (userConfig.password != this.password) + || (userConfig.server != this.server)) { Tomahawk.log("Saving new Ampache credentials with username:" << userConfig.username); - - this.username = userConfig.username; - this.password = userConfig.password; - this.ampache = userConfig.ampache; - window.sessionStorage["ampacheAuth"] = ""; this.init(); } @@ -139,7 +135,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { init: function () { // check resolver is properly configured var userConfig = this.getUserConfig(); - if (!userConfig.username || !userConfig.password || !userConfig.ampache) { + if (!userConfig.username || !userConfig.password || !userConfig.server) { Tomahawk.log("Ampache Resolver not properly configured!"); return; } @@ -152,7 +148,16 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { this.username = userConfig.username; this.password = userConfig.password; - this.ampache = userConfig.ampache; + this.server = userConfig.server; + if (!this.server) { + this.server = "http://localhost/ampache"; + } else { + if (this.server.search(".*:\/\/") < 0) { + // couldn't find a proper protocol, so we default to "http://" + this.server = "http://" + this.server; + } + this.server = this.server.trim(); + } this.prepareHandshake(); @@ -186,7 +191,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { }, generateUrl: function (action, auth, params) { - var ampacheUrl = this.ampache.replace(/\/$/, "") + "/server/xml.server.php?"; + var ampacheUrl = this.server.replace(/\/$/, "") + "/server/xml.server.php?"; if (params === undefined) params = []; params['action'] = action; params['auth'] = auth; @@ -317,8 +322,6 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { qid: qid }; - userConfig = this.getUserConfig(); - var params = { filter: searchString, limit: this.settings.limit @@ -437,7 +440,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { collection: function() { //strip http:// and trailing slash - var desc = this.ampache.replace(/^http:\/\//,"") + var desc = this.server.replace(/^http:\/\//,"") .replace(/^https:\/\//,"") .replace(/\/$/, "") .replace(/\/remote.php\/ampache/, ""); @@ -452,7 +455,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { return_object["trackcount"] = this.trackCount; //stupid check if it's an ownCloud instance - if (this.ampache.indexOf("/remote.php/ampache") !== -1) + if (this.server.indexOf("/remote.php/ampache") !== -1) { return_object["prettyname"] = "ownCloud"; return_object["iconfile"] = "owncloud-icon.png"; diff --git a/ampache/content/contents/code/config.ui b/ampache/content/contents/code/config.ui index c3e03573c..c1c78682b 100644 --- a/ampache/content/contents/code/config.ui +++ b/ampache/content/contents/code/config.ui @@ -58,38 +58,38 @@ - + - Username: + Server URL: - + - + - Password: + Username: - - - QLineEdit::Password - - + - + - Server URL: + Password: - + + + QLineEdit::Password + + From 357863e2269b490ff0c27fb7902bada7a7145a7e Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 15 Jul 2014 00:10:27 +0200 Subject: [PATCH 280/597] Fixed check for presence of CryptoJS in every relevant resolver. --- ampache/content/contents/code/ampache.js | 2 +- archive/exfm/content/contents/code/exfm.js | 4 ++-- grooveshark/content/contents/code/grooveshark.js | 4 ++-- qobuz/content/contents/code/qobuz.js | 4 ++-- vkontakte/content/contents/code/vkontakte.js | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ampache/content/contents/code/ampache.js b/ampache/content/contents/code/ampache.js index d44b0c274..7932df0e0 100644 --- a/ampache/content/contents/code/ampache.js +++ b/ampache/content/contents/code/ampache.js @@ -70,7 +70,7 @@ var AmpacheResolver = Tomahawk.extend(TomahawkResolver, { { // prepare handshake arguments var time = Tomahawk.timestamp(); - if (typeof CryptoJS.SHA256 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.SHA256 == "function") { var key = CryptoJS.SHA256(this.password).toString(CryptoJS.enc.Hex); this.passphrase = CryptoJS.SHA256(time + key).toString(CryptoJS.enc.Hex); } else { diff --git a/archive/exfm/content/contents/code/exfm.js b/archive/exfm/content/contents/code/exfm.js index 424dbb09f..394f78015 100644 --- a/archive/exfm/content/contents/code/exfm.js +++ b/archive/exfm/content/contents/code/exfm.js @@ -169,7 +169,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { } else if (res.hasOwnProperty("site") && res.site.hasOwnProperty("songs")) { // A site with songs var guid; - if (typeof CryptoJS.SHA256 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.SHA256 == "function") { guid = CryptoJS.SHA256(query).toString(CryptoJS.enc.Hex); } else { guid = Tomahawk.sha256(query); @@ -190,7 +190,7 @@ var ExfmResolver = Tomahawk.extend(TomahawkResolver, { } else if (res.hasOwnProperty("songs")) { // A list of songs var guid; - if (typeof CryptoJS.SHA256 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.SHA256 == "function") { guid = CryptoJS.SHA256(query).toString(CryptoJS.enc.Hex); } else { guid = Tomahawk.sha256(query); diff --git a/grooveshark/content/contents/code/grooveshark.js b/grooveshark/content/contents/code/grooveshark.js index 5608d8a58..2352847e1 100644 --- a/grooveshark/content/contents/code/grooveshark.js +++ b/grooveshark/content/contents/code/grooveshark.js @@ -191,7 +191,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { authenticate: function (doConfigTest) { Tomahawk.log("Grooveshark resolver authenticating with username: " + this.username); var hashString; - if (typeof CryptoJS.MD5 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.MD5 == "function") { hashString = CryptoJS.MD5(this.password).toString(CryptoJS.enc.Hex); } else { hashString = Tomahawk.md5(this.password); @@ -313,7 +313,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { var data = JSON.stringify(payload); var sig; - if (typeof CryptoJS.HmacMD5 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.HmacMD5 == "function") { sig = CryptoJS.HmacMD5(data, this.secret).toString(CryptoJS.enc.Hex); } else { sig = Tomahawk.hmac(this.secret, data); diff --git a/qobuz/content/contents/code/qobuz.js b/qobuz/content/contents/code/qobuz.js index 289783e47..f9921482e 100644 --- a/qobuz/content/contents/code/qobuz.js +++ b/qobuz/content/contents/code/qobuz.js @@ -175,7 +175,7 @@ var QobuzResolver = Tomahawk.extend(TomahawkResolver, { // We build the parameters for this call var params; var hashString; - if (typeof CryptoJS.MD5 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.MD5 == "function") { hashString = CryptoJS.MD5(this.password).toString(CryptoJS.enc.Hex); } else { hashString = Tomahawk.md5(this.password); @@ -260,7 +260,7 @@ var QobuzResolver = Tomahawk.extend(TomahawkResolver, { // Hashing Parmentier var md5Payload; - if (typeof CryptoJS.MD5 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.MD5 == "function") { md5Payload = CryptoJS.MD5(payload).toString(CryptoJS.enc.Hex); } else { md5Payload = Tomahawk.md5(payload); diff --git a/vkontakte/content/contents/code/vkontakte.js b/vkontakte/content/contents/code/vkontakte.js index efb251a44..f66a92e24 100644 --- a/vkontakte/content/contents/code/vkontakte.js +++ b/vkontakte/content/contents/code/vkontakte.js @@ -188,7 +188,7 @@ var VK = { var url = "http://api.vk.com/api.php" var md5hash; - if (typeof CryptoJS.MD5 == "function") { + if (typeof CryptoJS !== "undefined" && typeof CryptoJS.MD5 == "function") { md5hash = CryptoJS.MD5(api[0] + 'api_id=' + api[1] + 'count=10format=jsonmethod=audio.searchq=' + track + 'sort=2test_mode=1' + api[2]).toString(CryptoJS.enc.Hex); From 91d1ff96de0755e77a3f46d27cdbf424dfda4ef7 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 15 Jul 2014 00:21:53 +0200 Subject: [PATCH 281/597] [subsonic] Check if valid results were returned before parsing. --- subsonic/content/contents/code/subsonic.js | 39 +++++++++++----------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/subsonic/content/contents/code/subsonic.js b/subsonic/content/contents/code/subsonic.js index 507af5c99..96392e075 100644 --- a/subsonic/content/contents/code/subsonic.js +++ b/subsonic/content/contents/code/subsonic.js @@ -270,18 +270,19 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { } else { searchResults = doc["subsonic-response"].searchResult3.song; } - Tomahawk.log(searchResults.length + " results returned."); - for (var i = 0; i < searchResults.length; i++) - { - results.push(that.parseSongFromAttributes(searchResults[i])); - } + if (searchResults) { + Tomahawk.log(searchResults.length + " results returned."); + for (var i = 0; i < searchResults.length; i++) { + results.push(that.parseSongFromAttributes(searchResults[i])); + } - var return_songs = { - qid: qid, - results: results - }; + var return_songs = { + qid: qid, + results: results + }; - Tomahawk.addTrackResults(return_songs); + Tomahawk.addTrackResults(return_songs); + } }); }, @@ -389,18 +390,18 @@ var SubsonicResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.log("tracks[i].album =" + tracks[i].album); Tomahawk.log("album= " + album); - if (tracks[i].artist.toLowerCase() === artist.toLowerCase() && tracks[i].album.toLowerCase() === album.toLowerCase()) - { + if (tracks[i].artist && artist + && tracks[i].artist.toLowerCase() === artist.toLowerCase() + && tracks[i].album && album + && tracks[i].album.toLowerCase() === album.toLowerCase()) { results.push(that.parseSongFromAttributes(tracks[i])); } } - } - else - { - if (tracks.artist.toLowerCase() === artist.toLowerCase() && tracks.album.toLowerCase() === album.toLowerCase()) - { - results.push(that.parseSongFromAttributes(tracks)); - } + } else if (tracks && tracks.artist && artist + && tracks.artist.toLowerCase() === artist.toLowerCase() + && tracks.album && album + && tracks.album.toLowerCase() === album.toLowerCase()) { + results.push(that.parseSongFromAttributes(tracks)); } var return_tracks = { From 1da2ea67677b3bce481f896417cbac74051d1444 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 15 Jul 2014 00:50:14 +0200 Subject: [PATCH 282/597] [grooveshark] Don't use Tomahawk.asyncRequest to ensure backwards compatibility. --- .../content/contents/code/grooveshark.js | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/grooveshark/content/contents/code/grooveshark.js b/grooveshark/content/contents/code/grooveshark.js index 2352847e1..d90926194 100644 --- a/grooveshark/content/contents/code/grooveshark.js +++ b/grooveshark/content/contents/code/grooveshark.js @@ -323,13 +323,42 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { var headers = { "Content-Type": "application/json" }; - Tomahawk.asyncRequest(url, callback, headers, { + this.asyncRequest(url, callback, headers, { method: 'POST', data: data, errorHandler: errorHandler }); }, + /** + * We can't use Tomahawk.asyncRequest, because it is only capable of sending body data in a POST + * request since Jan 26, 2014 and we need to ensure backwards compatibility. + */ + asyncRequest: function (url, callback, extraHeaders, options) { + // unpack options + var opt = options || {}; + var method = opt.method || 'GET'; + var xmlHttpRequest = new XMLHttpRequest(); + xmlHttpRequest.open(method, url, true, opt.username, opt.password); + if (extraHeaders) { + for (var headerName in extraHeaders) { + xmlHttpRequest.setRequestHeader(headerName, extraHeaders[headerName]); + } + } + xmlHttpRequest.onreadystatechange = function () { + if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) { + callback.call(window, xmlHttpRequest); + } else if (xmlHttpRequest.readyState === 4) { + Tomahawk.log("Failed to do " + method + " request: to: " + url); + Tomahawk.log("Status Code was: " + xmlHttpRequest.status); + if (opt.hasOwnProperty('errorHandler')) { + opt.errorHandler.call(window, xmlHttpRequest); + } + } + }; + xmlHttpRequest.send(opt.data || null); + }, + apiCallWithCountryId: function (methodName, args, callback) { var that = this; that.ensureSessionId(function () { From 1da7009d81d68b63de1458434329c9f34df6ab67 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 20 Jul 2014 15:23:38 +0200 Subject: [PATCH 283/597] [subsonic] Bump version --- subsonic/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subsonic/content/metadata.json b/subsonic/content/metadata.json index b1f776c32..cede00dd1 100644 --- a/subsonic/content/metadata.json +++ b/subsonic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "subsonic", "author": "mack_t, Teo and Enno", "email": "teo@kde.org", - "version": "0.6.0", + "version": "0.6.1", "website": "http://gettomahawk.com", "description": "Searches your Subsonic server for music to play", "platform": "any", From 9cdaa4abb4a053c2d8ab670b9bacf27776f251dc Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Fri, 8 Aug 2014 09:54:10 -0400 Subject: [PATCH 284/597] Remove padding and square up all resolver icons --- beatsmusic/content/contents/images/icon.png | Bin 22150 -> 27220 bytes grooveshark/content/contents/images/icon.png | Bin 3726 -> 5817 bytes .../content/contents/code/jamendo-icon.png | Bin 6754 -> 8456 bytes jamendo/content/contents/images/icon.png | Bin 6754 -> 9495 bytes officialfm/content/contents/images/icon.png | Bin 6666 -> 7601 bytes .../content/contents/images/icon.png | Bin 272369 -> 60731 bytes vkontakte/content/contents/images/icon.png | Bin 10459 -> 10646 bytes youtube/content/contents/images/icon.png | Bin 11785 -> 11631 bytes 8 files changed, 0 insertions(+), 0 deletions(-) diff --git a/beatsmusic/content/contents/images/icon.png b/beatsmusic/content/contents/images/icon.png index 36b747c1a8a4a296ef5d0d39bc99069b554e1739..13f34b9aed1d610a8d484d063beecf9f21d796b1 100644 GIT binary patch literal 27220 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

OeG8EQii60 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 diff --git a/grooveshark/content/contents/images/icon.png b/grooveshark/content/contents/images/icon.png index c089882500b4259c8528effafb43887fbb97613f..6e62a232d3b6f96b93f4fc27d1b5225df582e90f 100644 GIT binary patch literal 5817 zcmV;q7DnlbP)Jm$=-J+o)dTHp7-=bV|n*Iw(t z_nO(SnftN<7i$JKkito8FkYXV3S-uMHolM2@0T@Um3}`dJhkSN@5_bzh5r?n3Xcl^ zC%70fKqa{J&H%g(3OftC2s;X|5jeJm5K2}^@iO6F;dbGU1PC0L9vSceNJrQ!m27um zy0DwDldy>plPs1ozY=a(gWL4^g5c7D0S|!I?f=% zxbzVN>&e%53YQDaymV_UbwAI{(zk@Ef=i7V7?f|P3y%qPZ`4`+yH(tLP}op#sR;v9 z|>%VV{njp{rOQ?H;s-k}k zl)ovkkIE$g1BXbbFJi?X{Ombmi-n630}Ql&C{*#P*v~f4QJwjwyPQEVQ~B@r#$Vas zzf*PRYX=#EfW7y#1Rm(<=c{NPe1Beb_)#HBiSZ#1o}0Z;*f&bX+8f2r(uV}bDLkGC zo)efe2b?FM0Ru*W(8wD?eT))bzUFg%eKOq(HWM}%*uq`KuEk}t`#l1@L?f{U0JqCa zgxEJ>-6b1u6nNr_+x*?aBSNw<>t`_Gx#QOg@by>1bb$rI*o9}9-!A+yc0pNY8*edNN*>sdZ_oGTO zM#g?XxK5y}6&tT~2agf@Ug&~-MTn__mdl>A1-ch?kU=@|X@PEAOgv-D7lpo+(egZ| z`Td2mho_;cIKWKXh~A`x-w=3XL@dGZZP~Jp&{skuyH+T>5}2Z!EijPmCmAbeKPx;T zlwAju&xLSZp)Z6fy`KwZ63-4&x;a}4{VcrP>k|Ugw`JA`Wi!dJflzC~!E1!F$Y!AZ z9br&#d5Hn)1X*J)xGuqR!8RvIxFGW$#)`X6>A!@%@uf<``j~%4Z?4 zRzl;yQYfSGKcI5oBgD4oCzGO;iL&fcp^W;X%nOCu42+59vi9&_pt9Lo;gXGkeU)vI zP(~myIZ+E?nyY968PpwA3--!)g7Lu@gfbpIJ+*xI^I7n5WiPt%bGLa_KC?Y{3kJ5= zvEK?s*XN-vY^lT{uE5N?6h#D5Zc+J)=1KwEpU)RQ zEKC+$@-y%+Qc*-3xK-t_ojwX-$@*%c2*>}?$YUCRv%QOS>~vu_qcZwc4gYhkncEP* zd5|g!`Da-X!og;p>{hgrf0LqS{mI{pbe^jjGg>aaGr%+{>oQ4Bt-r69eje~CRp>fA zD_A?%tZ$aFmnWpOnM!13nLRPSz$OxUkfW5gxgM>5->x#&>%k`Tq*oQ-h5A8E7xiAt(5+qJDXvDcC1vg{UD8jS<|o|eU!cFLmDR-*#3xgF#hpC7^1Z8A69P{ z2wB@fntV65Ej`eQ^8!0`i}Z(F_GZP}YR!T`I7#rXkw|DGOp`AW(lq9*X%1;qw)x>{ zfgNEzp@`WR-r<>*>{j`>BQi}}>Yz;J$0|F?Fcz^|ac6Oi01J819Om`rjUV51^ryuuB#ROm*70P z+^zxVJ^r+Gj}JvDE52+=&1+=4{ND*>cpJS8vfJ5Wb$o@&V45zPW&1W<6nU84yCKH| zvqL#^xD;D8jAlK*m+qnmk>>{Vr`bQ&5K3RQlnt@S3>jiI3DL|o-RMcyjp<m>V0b&PDfTI zJ8$U$h*5k2BelX)w&=W?2hu zmyfG|ERyG;n0EeI9cNEV=393x1ZS}0UCLv{VN%a0d$lFh;P)N98WJ!)TN9Eb#rB

F4-_pEthqcTt!E(`22)%Na$=JG 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 H+pzxutL?L{ diff --git a/jamendo/content/contents/code/jamendo-icon.png b/jamendo/content/contents/code/jamendo-icon.png index a69cd9171ba63535e08f0cbc72e9850be6712dcf..723ca505e45a8cd1528384d4cafbdd5693fc9809 100644 GIT binary patch delta 5842 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 aEnVD*;^H!t=@`$h0gu#lRjXBOBmM{Qru-xT delta 4129 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 diff --git a/jamendo/content/contents/images/icon.png b/jamendo/content/contents/images/icon.png index a69cd9171ba63535e08f0cbc72e9850be6712dcf..f7994ac645ceaec066193ad9c459a95e73d9414a 100644 GIT binary patch delta 6889 zcmV- zElu0$lIe6h&-BUkH_h}(C(m?dl62an2?+@yI1~t52oUT5HsG+?7`)&e?~*Osk}S#E z?(+LX#^8k2wytHu`#daxEg&WtK&|@@_W}}6&n0n!`InZmef+R^01VDKI0zm+zfPCm1F*FMR;5ZiG z0G8#zaU3)uL69mXPz91C>b0N>UY`=cF22C~1gxS<9 z?P%^qx1k55kN`oD5cGo@e+saN6_#beu^d>I^}=O1ghq!z6BYz*SWsVFN-Q#Fr6Vyd zUj7&)fYyfg-l7v1P*Yk<7+N|NhDHM%4kt*01SupzlHY|!5Wa6V$8p~sy$lPEVZpF0 zRDnuFkB@{VL}N|OO2Xus>4=OASAFk5R$i_$6&yZ;_NESXT}1<|eRgH$PKFddARa0nf zSpz&C8YD@8BuIc5e;e@b36=By%Q6gvA`0Wv;xOr{w2r0EErdE)9rj3oJn+Hc)+^`A zA}TIkhsW&(L6VOIz`FruITjqtLavl!@{CEC^wh+*#hVsHj#-dZr8SKQwtYcVmDWV} zbechu1PJ2RpGQ@0s#}ibz_Bbsqe78BJ*{ck3pp5<6g_TCe}O#s;TLtqg;(RtE>wVH zIS}Nd5AcpaSq?16K_U@j;u9&DwR}c>_KKMaeh;#)yfGqgPk#QT(@VIFRgo5w&D7;e;gAfn^0hqch zIG=wxRY*}V>bpvUb=oO@0rK+cD;M`~JDgE*xe6S|K8AP?@y3Wb*sXTt?K=sEp)*<= z+Ac=MMNAu2)mmI|<=lY}k4!H+UkQMNKqz=j>j70Qf5R{!NdaappN`qfW)x-4&X_SO zBeJ;Q%IQNN9i3iwzOq02@EGF5s9K>=2-?G-@QZUW8!gkj4LzqdVL{nL8tFrANJ-(< zydyi0&%Rnz1`zyYBpyW(QUb6ni>pOt`277tv%5P@dAyCtwkG}2?XT~gUvlOuKwu!f z^jL-ne^V#~!!S6$J0GNwoZn^WKB^7VEb%EwTd)1#r*H0Fe7T?m03dj*PDexp0s%a3 z5033R0f|Js*ypPCtIzUR=IuENaE~F5v```nZkGo~bMx@d@7~|yYi741CHe5Md_RNXBCv!(!f3;paU-9uL|DC(e(qjQ7qWp*yK!5

x-BeQ`uUTFlmjo&S})rRHiqgp|-PMj6Afa68>_yFH-Y-sH40KmnOT0jXRvU=b<< zf0P5?vs$d6JzmIGvkkO|hOxa1q=1A-Oo0+p5KF{f@0uIU=OaLgDO@coL*Cw#TL8TH z0PpktCHK#J@;-m>(0qnrM>TfJfrG2h1*gLWiV{Mj(?G2afI_82pjL(8a4l4UDyV|I z@WfIPg2Qhm>5c71xE$_5|8K2tL!aFRe@nL+<}Ndg`fd;e0f|fukwgSy6qhxz3=2w3 zVZ%SH-nQl^t6m<~h%CQQ`PR1AKc4S)c}7j8vMdXS%>kBS5gZYW(8yqf$A%*zH4c&S z;n0L>AX7*nmWUvvC{QBrW03-KP@6sOc(9Cj`J>C}2FoyT*qv}X+-Sd{M{7eHf9lHX z(a~Z=M{6fcohArHLP+G2Q2|N{NI2{clwGR)QG2t#FFacJk3$}j@BiUr?u#8qM+G7W z4o7a|zA$@upCQeO8U`P-Y0dh#?k`amPGBg8+-2q##9i1&klwZ1zsw*|P zQPqTwmJU#23KE%QR8%g@ve^7je;cs&<(0&cKz_Zy;E(VA`v`TP-rX*SVW8Fo z;MKqV=8uV!5?;NdfpoVo_nLd>9Lvr7psuU|LLt8fj?3W!Ns>sNnu0|ef97H7a|H#a$*CLjR5fG$8^!O+wXN-p;Kml8?9cH5$48!v3evu>zd#@eA;o6z|j_!Hw zp+GKvdfEOx@9fv{{r2_Q`k)L{V&>B6*zohUm@+dRn$Vz8GqNa=5Nb^T#wEodAvG3u zn*&CDH=KP=UM+Z%B+*jae~S0Ezt4WK^ZmjH1{o_)`de#5JFmfThs}YIh+r(f8pXaP>}!mDKu6$ z{qli8HdHqJFH7@RMdoz4pa~7ahF`43yfw3-3RL=a7)`BJW9bVy*zk+BPy{I8aeH_h zm8LE;s!MC%zAwnOM#I*V2MT$c%xMn|RiFavf3^k-*3I#+@ZUW|u9RcJx;a?BB?m$g zHQ=B6d{hbq_~Mh}f3TZvo9_v-v8riXuc?2oH1(z>IWlLQv+L{bI?+NnAC&ziS5NVpmw0T)r{=(uRyA>v*30;P6UgxUY zMH!&L#$T*O@{}adw*}~Z4fEuI!n>>1i>FF9R+rZBvI35we;Gu^N8q_v))Wp%WpOzKoc;KdGWO?av}c`dOA&OZhkh% zEbX)Q_<; zX!xx;P0dQif8tFGu=m{qyxgy+(}a%J&V4tdbAyP*DUyEQ*=FQHr81a2V-mLfX5)}Y z|L*_Wi!)z-1Ck&Bl7OYV7i~B6Xsm96%jt$LIuvphzg6Mml4DSQp%UGOowOUNQ^C~V~=PgRH{^x5z5JR7fi@v%Df2CRhN=!j06hNksLavgby-|-t zAAN}(f67I3O*7ms4{soq0Sc^qX(?~>WZA`v@6M5yZcBcjt&f+vF>}^rq+}!x>pHzA z>m46XrjWtqaO2d$Lj2{`ZMbx*7&eQYH<(Y%&qUmWabQ{ByCeE01I`@3uy7E_lESOJ znE#}Jf5h6Kt{Ray@~+`DF$J+yjFK}~vExsf|OS+5p(2z(( zUkw6T$%9(uI1Xt~q#}9pc%Op2slEfWDzwzKV()tgvGad+!_eHpi;M8oq9+g<70OF+ zpt_`HuxhOX|@Y$dD;?uYGpu3|7jE|B7!8#41;v;2$Fogtwy0Utohvhhq!}OddFxnzh%3!zl;mD3-_{*#Bq2ls&xSYNT?@gVX>GS8I zL=<9^qKZiXyjXM`%OQP68vH>-Vi80V5eknK;e*$A;N*cqIBX+7Z%)We;w6w?d#%nJ zqU&hs^u4njs6r^S1BG!ghV%F|;s zdFM!@zT4*=7d<`_{wQ*l3|6xZ`?np&U;piW)Lg9}u|%;dNCk~f?(nKseM^VWZx$Y{e}g{@ zNs>@&15jC9h0b;(3{4$)X6tfD<*@4{f$r2dZT?<28%`)jd8akB{ycpnp&a zjR^61d-Y9v@V01GDwkp`2}zQWf5^nRbg~3H{%aRFc4(tAFj(#Lw)WW^APvnOyeyZ~ z#e`w32|*B$t7JH_=Ok*%>W6d%e*_#IwWBX{Y$f5s$4r^AI6 zTXLX_8Cs&4508LlS^linwj25}1<~X7z;5lsvdxRI;g@TNJl8Qi)X)fo0`OLDC6SFC zW2evNfGS9Z)jwK+^*>t;=`h;PN7PIg73u})ar=Iwht75*l15;yj;~c|ugQi9nTc5P z+(OJ3SdqMJ1SXxt);Un96kd=)p}x;z69j?!iUy=ko!}R$RIZd_ z!MZtE`;%1&)@gmRUqa>ODqgmwjEoESf{cm}_dQ6Gz?HLQqY9GaI9N?q#HNhHf@kL- zXTt(0)e4{8?@HlSf1k%%X_`h*hKMx4u9utN&KU#qw z{`Pr9Cq(g5b#^>A-{-}yfOp9ya9a^iLjMQ86p|!SaQH0jy~D3pykD(8?V(|_*f8nI ziFp3k8?oZ0r3eh>=fqrnlL6%yDt$gbG7N*1%%s5}CqJFW%f>&ZPBV^umN)F{+{?;z z*qtCq64@(ff8wXFZN*ayr}=a~{I(qW=u0?x*kwdW2@xC?^x+_oGNp2%Od;cCR36LC zhr{k1b~NMLxjvR}Nk)`V#g8X2;7pijU33;(kI|8aFgT>AI0s)1!WZ29L+cxLOeq5Fva z<#3dU8j-ZqP{i%>;G;Ko;^?juyljoivMlDWf0=`yzy9(7zwhXPMH}byvNsJu5a3u2 zd*3~PODBgO@sTN{kSV021`z;`<>n!8?4{F6eR_v7>iPL{5^p5C8KMd~@O=FV6IEq}OD{*Pj>QZ?A1fb6qR1IaZ}wiKO&|SHAuE9cg{E z>x1)~R&D-$YeO3^>Vg0Pp-70%)-Kdne>6ZyQ3wiAL#~wj9YlR|2abQ1heIEIiPna8 z$P`lE$^u*t7Zz_^fQ8S_`_3Vu_Vp{zfGM0#bzp&9!aV`|f`1dTTFguhsi} zbE5|phuwj)^A-5yPr3NwlVj*?GeW6W@CK3NI4IQ$B&Lu5-JO1ZS5j}k^Hxolf1zhf zU3mj<`yi31zJKg-5)||JNlJ?NJT2zkq zCIc>?x`Ju*GckF_Bm`;#pa@X-e>9fKu^cR>UUap0qq3w57xRnJSksJ-md;T-QYk1T z5Yy&m{qgRD;6AeBzjL{Le>*s;hn&$K8lh34h)s?`az-K&CdMH;F%nX_6jHf#L@Y+9 z!v%-U0f*gz*7|l-T&_g@P1gir=}6UcX~ z-S@b?D+d6;YO#T#83-w1f2@{*NKE;~dCMHffuR|!{mCl4@av8D?eGUO0|V5`x@+ev zb~M&BZ>cV=9sPq=`a4-9_IAAYy}ET^Hh{Y>@*)TVLdx5IwI-ndrQ~pP;Em=8yd5I# zp)q;JBrI4rcL#obfB)}1usuKN$Gs(rw`-RrBBvev9r+7v(`+6@LKt z9V?Y)5R({;5w~J1$F0BE_aie+)`lAR@B&M)p%VNCve=nOKYDxY>Q&6bnt5*GB z>9MTYQwE&X$1*aJ8%jiB@pB82vuVMxhyDJLhEq^T;F6`A7v)cxnGSFO!_$#_k1|Ao zP=K5b^YP5q75UmQ%@STf0>G46=?j)UpHq-NJID+--Ce>)?)xZuh;mSv}xU#J9M2c$g;a??*F1p>@llZ|J8y1Gac7L+|4*Lv7; z`Sg{GC-#0l^+J9zIM#c#`=|#E#sEZ-gu<+4GqCBG>n~|_LDPnF%@N59Wo2hft1YW9 zk;8V?OkPV zr<m#9LGVWRw6kgsdd>4Ij+ew(nh=()u+AMSl!(C)!)Cy)uOVPwuW}^ z4f|m}%0M}e1IKa$aooi81WbG~wP|X0=Bx>siOs&aCojEu>R@5(*`w#FnzFhOv(XFz zDF8@3azHtbyA2``9Iipa#JKjHjSIMprziRJf8Z0|da?9eaco^h>o*k_D?=+USEJ9? z2U0)|f;kqU-W+u|A+ihytxkj3r0DL<*%|cG=NIv^2RQFN*WRc%o;*;9+H3XNrrH*C z8@fRdURUL&LFDg12U1_$t$C1T`vE4$n6qYQ&|xt_PiD@VTF+OTMyuYFU7wi|k-q1ga^QwIo=1W9^F>YY}*`x5S*lFcm3_QT^Kph)PV zbbD-B`?Vno-a0EaSx4;SneNKY*u!3ImtzD*id#s?{cR$WVs*rdW8~004u$ln?MWB+SC?VpK$3Y#e zMp$$xXqtW|H8c5$zxU6WcjC$}KUS^`(P>6;C3*zaDN7Z|KYp!U`&83IbU j3INikO*k}G`{Dls{1ovhhb45{00000NkvXXu0mjfT8AZC delta 4129 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 diff --git a/officialfm/content/contents/images/icon.png b/officialfm/content/contents/images/icon.png index fa7e35839e59a54e1387caf5973a13a84d78b265..b108e6bad295fc830e0861d2ff0ce83db8d9d646 100644 GIT binary patch literal 7601 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⇔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 literal 272369 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²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 XaJlm-E3QHhK)N2N>)o$Zg}wYgocDyh diff --git a/vkontakte/content/contents/images/icon.png b/vkontakte/content/contents/images/icon.png index ced9db3b3471ce6388bc31679e16a0ba92305b60..dab87338de27e2c3ef3026f16af9d9b8dc3272ee 100644 GIT binary patch literal 10646 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 RoVox2002ovPDHLkV1n(@Dg^)l diff --git a/youtube/content/contents/images/icon.png b/youtube/content/contents/images/icon.png index a58d7667a2255ab9fe81364067dc42874dd47376..13c8f926bd4e7c318f2d2473e98fdb4b0708c253 100644 GIT binary patch literal 11631 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 vDP3a_Gn1?G0sMkR?aFCjU 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 literal 11785 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�MtJ# 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 From 8e84ca0b9adc8968f616e28dd8ea777ee28ff288 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Fri, 8 Aug 2014 11:16:36 -0400 Subject: [PATCH 285/597] More resolver icon cleanup --- ampache/content/contents/images/icon.png | Bin 44641 -> 35079 bytes .../content/contents/images/icon.png | Bin 330067 -> 133847 bytes subsonic/content/contents/images/icon.png | Bin 11259 -> 65245 bytes .../content/contents/images/icon.png | Bin 9697 -> 16313 bytes vkontakte/content/contents/images/icon.png | Bin 10646 -> 46770 bytes youtube/content/contents/images/icon.png | Bin 11631 -> 15901 bytes 6 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ampache/content/contents/images/icon.png b/ampache/content/contents/images/icon.png index ed29e845e7967a36c2122a239fafece8fcf36270..ca07d908ef99e90b4c30fce888a7e145dcc01e6d 100644 GIT binary patch literal 35079 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 literal 44641 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 TV3_Bl00000NkvXXu0mjf9%if$ literal 330067 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≧v~JYk3sP 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 P`EN}%Jyp2!)A0WfS0_?7 diff --git a/subsonic/content/contents/images/icon.png b/subsonic/content/contents/images/icon.png index 6dda109d90900bd978852e67ada4ed23dd4ace45..2fe467f8eca3df5a3d64969a3234abc34ce0e2a7 100644 GIT binary patch literal 65245 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 literal 11259 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 ND9ETv*GifO{|^e1n!f-5 diff --git a/tomahk-metadata/content/contents/images/icon.png b/tomahk-metadata/content/contents/images/icon.png index f8b89f8a8f329ba37580fc2d634c8c5d1abf8b15..c4ccf7b30f6949791f8fa0ea23616add5b84db14 100644 GIT binary patch literal 16313 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 literal 10646 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 A{r~^~ literal 11631 zcmV-#Es)ZQP)l$te*Ip*Cp}3|k|k_o3-2~IW(yD#G6^^^3}b4jO!j1$34|h$ ztr#jZnM_SWG8Io{sE`zuq>>3qAPZDwVX+}#L$Hl8#+&d4USwOgHtXr_-S^&ezTf$SS?xy$*^_kF)_J;0gQclAq7#zoHEx$_!h%ryW6lmZ42V4T1M zy*&S?ef##Uj2d^v)~(}9?e&rfB6+{q)#|i< zOCWy95TO6_bSF*s0QkzNaZ71>6_o!Mf;L&NH>d82<&`5ho#8*goQ#XiF3o?zTDOlR zns1Ohoaz;8jU&w~2&BW~oaOCDmY2VAhI}W9fc<{|32WVFNqWxnFZG}0;x!2<`YHk@ zjBxrVC2KoB8m;Kk^rYKkj|kMAMAir^*$0+z&A;<3XE3wNC%-AN|kp@oGf zU14wZx{W~1jc2L27q7<0?&TmhlLS>MA_+-2m)`-vogv*xCLn;Ku=$Ouijs()fCR~l z07QcThF21dNIHcVpN_h3CC_g@L$*^xKosORoU`}C>p(*(H6kuOXZ!XSmB;Pav16x@ zy9h!-l|XP+K0ZG`|Ftt@J4FPXpPzqPRc|0UU<{JH+yONjb?)T^c7iA^$Al#4^ezAk z$KZ^JuEy2L32;=%xB2^bry&mjZv&!_14W_wFGlsf#_P25fjcCw0`L!BeB%2FY=*bq zjfg;15BF{Uxe*Ic0bu9Oozq$ruM*&u5ZSRGPq%h(>l{Sxr7?Fr^UO1MHzt|G_qTJ) zmR)MhON}v+s#*YJq?t?F$(Npd^2sBmWZyZxbB89yYm|~0p;eUx0HQRy`RS*h-n-WM zzv~J3@vu63z1{<{$k!xJUIh>&AOZ+@`8nsD(|+QKC;9*{4TLO25POEzeRFejcMPp| z1%Pc^wp^=u{(gwOhCmbuUn*0;+Cyh;-TJ46>hB&pbZBWLN{*t}LwUWbb_f&#Ng(=k zzMNkNpc2~}=U0Q~&x~LkfEweam=?u#0QQDO<-Qk1s0#$#Yn}U4y+}O~mAJIu@9)~Y zdGmH9U*Kur{bvMW>Fxn=powz;VB5^hPXh8$LS9QE@&LE=+IadAvW3L2M=*bR_SD%M zM>-8u6M9Ji(2HykQyS?2xKc7EI3CV#8Xlq;r{HxmFUoK|E96(5YHq}&4MLqSYF>~U zvrUP!0=V(3TeX)L?xrE`<5@E^Kjf6ZFCx>dPec(hC6o=CR>J$bBI!Q^;N2r`E~Dy- zh;+hYivTPdb#4e9=KvM~bn8i(kb61B3ptf;=<{Ts=_%{f)dU_lGeND@Y6FhGjCZXLRa4=yt8ku#|Zx1 z5{aE6)AVE$Pyt}J*V{|t=E|uJ0SP$bIw;;+Mjl8CK{)8{`D}hq6X~VKyc&=n@^dHz z5D^fkx;HQK5A?I_T}9zM;uRP`Ot@SZ4sTg4;9W!PN@d^_BlJLdTzTJ0o-)rud2)ocufTYcm*W@4?rO>AW`J@7BrQnUkMih><%Crl39`e_QJx#ABV4RnBKVY zAL1x}2|xqFK@b7FV0wCb$L#Fv(@TOy%-c)uqA}H?IaA*wFwGeyp{37De&t#$iv=+K-Z2p0~WlmWVue)j5a4Rvbwf z3#e;)kxCVCdJ%9j&%dR>ZME2<)N>aQo)W5jXk}&PTTSsfJv}{1a!Z9WD@V6{Gwt;T z&4f69m_%M53n)3MG}8m3QPD)M5*+6v>DN40`94)L^i&bh3m(V2yl=EgM8dP5U*W3m zCIHKWG>OLm?E(#R0e}el>6R^a&?oM4QXLxHB9O!wwuS{`xflkdb#Vs7tc_@_KBUxd zmXjdj;e!YzOirWyieUx} zoLL=z_VNvXmHIHNss~o z%d9Fwg{uf7<&`N6=Pr(J(aI_CUw_AlPzfvlVV^G8Sn(vNq$`Tg0qCz~P_9CWy2e}w zkrxDB;8-0^=<2L%%f$+THqYlyKLYy6DEO39ebP^glJLg6QV&QR?_Qe$6y7{&yw{+h zKb9c1G7fZvY%I?agyTr_z`-@l2W^-e?z9x45Rpto`s#IB^AjNrf)fP5r!byQfGAtj}&Sw=*3*j^;*B-C201}AJNHZziljpK04 zQs8@)fYw?VV@B$)EE~;&Q55B>+8>@bu8A6HnzE5(LDl}zz{y%VRh(NZkc%OGT)DE}PEucHvw>ae8Kgy((p6J?s9BZ}S z3E;=7Jn&GHs7{|LisI2>GlBu3mKLRmY;n%Lbqd(fX|=93#(YeGE1TtUBu}X&_?>1( z9R0h&3IDoLeF(-})EFTEe$|3jAG&+ezSF7Z~zF0IwuD>A#~R zX-I&MyK|d=bOe|>;FK#RLkD5tNKOHG1t2rNz(x;{T=eHVO5E^tA)p0B>C@+j-sw>= zf&?OdSjihgJiri$LQvL{T7)w02qEQAsf$+a?*drW-NHHdO;Q)DaFSmX5vtG;;Z#4N z^>5ZV=c6RQ5cF#7lY*<@5>)k**4qC>@?HR2L-?zH)264J4)n{`n1fWk0p!{6 zrDF!b1Vo-FTt0sc=XuOp`{Tx#A2q;RRpcTOnGDa?C%G5EZO*yB0C4xwPUM{XpTYS5 z_wc%~N7Zi;_^7J>6@Z>GW|8D40d%0c3}74pVa!v(=s&3f^;DZNfERHS;jat#WP%rL z3C9l2-q5IzXb<824K%|F6x&>z*zuh9q=H4W?DxQ?zaT5r4(BX_k8B{9k|Gj z^9_x;)F8Yt4 z`3XQ?3cH4^!z7ooRYdg=Kz`gsV> zZRj?lYBq69`eXG2Rhjh+`M1Y0cC;uS8Xzd|QAEVEg&y13Z|AztF}4O)e9%PlBd@;u z!6%M~9>*O{a*0kyX=N z&Z0>YNEDR;+2g-wd>hXjZY2~&84kdqOp!o?>{!Zca-Zszp>Q^%0(*K1^_39fGTc=#FV$W)rUOOHRsc!eF*y)2FT4YybV4*z)SF_mQrry@T7GSemtk5IPzWO5CIZ@+i8WTZ z42!a|&ekXE3aA8&LXad>=U^gFN-eC1rmQj8D6x1v*Znref{;{2ww^EolH6Gf#gMH9 zp-JLua0>(g8K~?0&3_O8> z&lU>ekIK3s;BgwZY!-+Ow<9r)JJRxZmfe?*4Lu+Ay3ccLtzx)+I9RYQ1U&bgb5c6Y zRF_eOX|*7#^1w$v!aZO7BBb9Jh(N7nv9ySpm%R)x`MI}CyW6D(!bNc`vyVQ)J3jOw zWOH+pOiYxVCsC3hdf)*j6XS4^0aYu+>K{~O(CfjG9+6PjAnM!ARR4!>AQ^VQ3q3Ab zy2O0dr!V1^#&uyPYU? z#x#(H#xW8qvM>KD4&S(p$QVEbTIA@hWUxo(aM_Rj1lrv$NQF9wD2`zd9>VO$K8pUK z!$>E`A!7X0lITorz}RFLDAVl+VaJfn6^urBWvpSKZ+2j@MkZjh+hE|IDhgbacnw)U z>bg=_3JRA)%dpU3ee@i3|q$xTJcssr(7Ygx@wnM3qOmsOZdb&ZD#o|UR0ys**IQxH>j|8r zmQC57q`#Sx>i4otg^@?1j&+LeVt%EpefV*uvYm4G7BCA7t=uz%3=S>F)r8yfn) zRt@4$QWwU1)6!a~F*144#Wa&$z*-5b7{$^OR-SqapbCru@*HD3cAzygBXmA~EG7~b zmdnpP4ZE}?aqK%Zg|6H|p*2jJ$Vjoc0GsvEJ@0(kdd)SQy7&@6AV8oBM<1g5Wcwz!}c^S)l_F(p&yJg|Qhk(T; zq|?)g(nRQV)rtzprL~x*8!?y-z8+?T?E=PVZCTeT3mj6+6^d-OI~sJcmAgM`uoDCj zyR-y5*5T#9{L6Co5C5?A4j!b5Vz3-6&U;Z+qnHea9sBMVNQWEx`eHKgP?GU+ z0YGOh_I>{IxaT+iI~E^)811cF0V5SC5ixMRzVr_qK=@? zaFkAvpv9FKXb&+EAz}&P84Ps+K{~6*tYfroo5Yv`TD6iJ-gw5qWYWoyO|>Sg-x2!jYmQx+t-c>E}zf zyd9}jl)F4AD0bO*SkC)BSm*OPi^WBh=hV=b#brKQ vDP3a_Gn1?G0sMkR?aFCjU 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 From d415f38bce86d7129d89a058c498aa4cd93c3274 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Fri, 8 Aug 2014 11:40:27 -0400 Subject: [PATCH 286/597] More resolver cleanup - still haven't changed Soundcloud or Officialfm because I don't like their official ones. --- ampache/content/contents/images/icon.png | Bin 35079 -> 33240 bytes jamendo/content/contents/images/icon.png | Bin 9495 -> 13012 bytes lastfm/content/contents/images/icon.png | Bin 12714 -> 57746 bytes qobuz/content/contents/images/icon.png | Bin 56392 -> 17896 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ampache/content/contents/images/icon.png b/ampache/content/contents/images/icon.png index ca07d908ef99e90b4c30fce888a7e145dcc01e6d..9309ef15d291da8c6fb2409759ebe02346756d5b 100644 GIT binary patch literal 33240 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 literal 35079 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 diff --git a/jamendo/content/contents/images/icon.png b/jamendo/content/contents/images/icon.png index f7994ac645ceaec066193ad9c459a95e73d9414a..923c2cf6468c941070b6254104c55d86b8d4a324 100644 GIT binary patch literal 13012 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 rkn^X{jF z83@7VoSA_Y8&Kskf~|caDTRYikI>hto^$9|*Zr~6HP76}eN}LK>&9AHV}WLk8QywE zybiy<7ZIi+GUPE26WWXnOmG4=r6{I0HWIl!3@@KK)+L-`V0J6XXJjOTdDrV@TiT+sh|%kO#>4uP@c-!=zOVgF|~hXyLyekpm!QmW}%vSat10fV96b?)sjKix_8Af7xd ze0q!a50`#9%yqhi?+V;N;NQWIZXW#i&cL5~pWo#Fckq*+ET8YZ_5b(7ym#a)@4@S{ zPnVqfLH3s|I;TrkeC_}Ehm(h?lxYHz!uUMPiBAGw@%LPsu^{w2GwWYevwr@!E(m=+ zNjnL+J=%Zkf_$yp*i~y7_&3f8v4yEee+5yBI?)YmA*O?MpEaAa9{d| z`mg_Zuk_6mtptVNVD4%t`5Vk-!nuDgTlwaR7>VUKO!U|=cvE0&J%rg!89I8T|~vxKl%5* z1(a_h#BwR>E5tj)3M*^dM@GSx|#OVJ82YowGy?@<0mW{fHwCKfE ie_!>-F8BNQ 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 Date: Sat, 9 Aug 2014 08:54:26 -0400 Subject: [PATCH 287/597] Also update the Attica instances of resolver icons --- .../content/contents/code/ampache-icon.png | Bin 44641 -> 33240 bytes .../content/contents/code/beatsmusic.png | Bin 22150 -> 27220 bytes .../contents/code/grooveshark-icon.png | Bin 3726 -> 5817 bytes .../content/contents/code/jamendo-icon.png | Bin 8456 -> 13012 bytes lastfm/content/contents/code/lastfm-icon.png | Bin 12714 -> 57746 bytes qobuz/content/contents/code/qobuz.png | Bin 20622 -> 17896 bytes .../contents/code/spotify-metadata.png | Bin 330067 -> 133847 bytes .../content/contents/code/subsonic-icon.png | Bin 11259 -> 65245 bytes .../content/contents/code/tomahk-metadata.png | Bin 7663 -> 16313 bytes .../content/contents/code/youtube-icon.png | Bin 11785 -> 15901 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ampache/content/contents/code/ampache-icon.png b/ampache/content/contents/code/ampache-icon.png index ed29e845e7967a36c2122a239fafece8fcf36270..9309ef15d291da8c6fb2409759ebe02346756d5b 100644 GIT binary patch delta 30819 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 diff --git a/grooveshark/content/contents/code/grooveshark-icon.png b/grooveshark/content/contents/code/grooveshark-icon.png index c089882500b4259c8528effafb43887fbb97613f..6e62a232d3b6f96b93f4fc27d1b5225df582e90f 100644 GIT binary patch literal 5817 zcmV;q7DnlbP)Jm$=-J+o)dTHp7-=bV|n*Iw(t z_nO(SnftN<7i$JKkito8FkYXV3S-uMHolM2@0T@Um3}`dJhkSN@5_bzh5r?n3Xcl^ zC%70fKqa{J&H%g(3OftC2s;X|5jeJm5K2}^@iO6F;dbGU1PC0L9vSceNJrQ!m27um zy0DwDldy>plPs1ozY=a(gWL4^g5c7D0S|!I?f=% zxbzVN>&e%53YQDaymV_UbwAI{(zk@Ef=i7V7?f|P3y%qPZ`4`+yH(tLP}op#sR;v9 z|>%VV{njp{rOQ?H;s-k}k zl)ovkkIE$g1BXbbFJi?X{Ombmi-n630}Ql&C{*#P*v~f4QJwjwyPQEVQ~B@r#$Vas zzf*PRYX=#EfW7y#1Rm(<=c{NPe1Beb_)#HBiSZ#1o}0Z;*f&bX+8f2r(uV}bDLkGC zo)efe2b?FM0Ru*W(8wD?eT))bzUFg%eKOq(HWM}%*uq`KuEk}t`#l1@L?f{U0JqCa zgxEJ>-6b1u6nNr_+x*?aBSNw<>t`_Gx#QOg@by>1bb$rI*o9}9-!A+yc0pNY8*edNN*>sdZ_oGTO zM#g?XxK5y}6&tT~2agf@Ug&~-MTn__mdl>A1-ch?kU=@|X@PEAOgv-D7lpo+(egZ| z`Td2mho_;cIKWKXh~A`x-w=3XL@dGZZP~Jp&{skuyH+T>5}2Z!EijPmCmAbeKPx;T zlwAju&xLSZp)Z6fy`KwZ63-4&x;a}4{VcrP>k|Ugw`JA`Wi!dJflzC~!E1!F$Y!AZ z9br&#d5Hn)1X*J)xGuqR!8RvIxFGW$#)`X6>A!@%@uf<``j~%4Z?4 zRzl;yQYfSGKcI5oBgD4oCzGO;iL&fcp^W;X%nOCu42+59vi9&_pt9Lo;gXGkeU)vI zP(~myIZ+E?nyY968PpwA3--!)g7Lu@gfbpIJ+*xI^I7n5WiPt%bGLa_KC?Y{3kJ5= zvEK?s*XN-vY^lT{uE5N?6h#D5Zc+J)=1KwEpU)RQ zEKC+$@-y%+Qc*-3xK-t_ojwX-$@*%c2*>}?$YUCRv%QOS>~vu_qcZwc4gYhkncEP* zd5|g!`Da-X!og;p>{hgrf0LqS{mI{pbe^jjGg>aaGr%+{>oQ4Bt-r69eje~CRp>fA zD_A?%tZ$aFmnWpOnM!13nLRPSz$OxUkfW5gxgM>5->x#&>%k`Tq*oQ-h5A8E7xiAt(5+qJDXvDcC1vg{UD8jS<|o|eU!cFLmDR-*#3xgF#hpC7^1Z8A69P{ z2wB@fntV65Ej`eQ^8!0`i}Z(F_GZP}YR!T`I7#rXkw|DGOp`AW(lq9*X%1;qw)x>{ zfgNEzp@`WR-r<>*>{j`>BQi}}>Yz;J$0|F?Fcz^|ac6Oi01J819Om`rjUV51^ryuuB#ROm*70P z+^zxVJ^r+Gj}JvDE52+=&1+=4{ND*>cpJS8vfJ5Wb$o@&V45zPW&1W<6nU84yCKH| zvqL#^xD;D8jAlK*m+qnmk>>{Vr`bQ&5K3RQlnt@S3>jiI3DL|o-RMcyjp<m>V0b&PDfTI zJ8$U$h*5k2BelX)w&=W?2hu zmyfG|ERyG;n0EeI9cNEV=393x1ZS}0UCLv{VN%a0d$lFh;P)N98WJ!)TN9Eb#rB

F4-_pEthqcTt!E(`22)%Na$=JG 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 H+pzxutL?L{ diff --git a/jamendo/content/contents/code/jamendo-icon.png b/jamendo/content/contents/code/jamendo-icon.png index 723ca505e45a8cd1528384d4cafbdd5693fc9809..923c2cf6468c941070b6254104c55d86b8d4a324 100644 GIT binary patch literal 13012 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 diff --git a/lastfm/content/contents/code/lastfm-icon.png b/lastfm/content/contents/code/lastfm-icon.png index d9df3afdf5e4c2b980b24ed026419cb4125518f1..53ecf06d4c922486753f0062d2da1bd64413c086 100644 GIT binary patch literal 57746 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 rkn^X{jF z83@7VoSA_Y8&Kskf~|caDTRYikI>hto^$9|*Zr~6HP76}eN}LK>&9AHV}WLk8QywE zybiy<7ZIi+GUPE26WWXnOmG4=r6{I0HWIl!3@@KK)+L-`V0J6XXJjOTdDrV@TiT+sh|%kO#>4uP@c-!=zOVgF|~hXyLyekpm!QmW}%vSat10fV96b?)sjKix_8Af7xd ze0q!a50`#9%yqhi?+V;N;NQWIZXW#i&cL5~pWo#Fckq*+ET8YZ_5b(7ym#a)@4@S{ zPnVqfLH3s|I;TrkeC_}Ehm(h?lxYHz!uUMPiBAGw@%LPsu^{w2GwWYevwr@!E(m=+ zNjnL+J=%Zkf_$yp*i~y7_&3f8v4yEee+5yBI?)YmA*O?MpEaAa9{d| z`mg_Zuk_6mtptVNVD4%t`5Vk-!nuDgTlwaR7>VUKO!U|=cvE0&J%rg!89I8T|~vxKl%5* z1(a_h#BwR>E5tj)3M*^dM@GSx|#OVJ82YowGy?@<0mW{fHwCKfE ie_!>-F8BNQ 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�*zSoL#9M+H7J;NTW7C~M7no;Z=@9N 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 TV3_Bl00000NkvXXu0mjf9%if$ literal 330067 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≧v~JYk3sP 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 P`EN}%Jyp2!)A0WfS0_?7 diff --git a/subsonic/content/contents/code/subsonic-icon.png b/subsonic/content/contents/code/subsonic-icon.png index 6dda109d90900bd978852e67ada4ed23dd4ace45..2fe467f8eca3df5a3d64969a3234abc34ce0e2a7 100644 GIT binary patch literal 65245 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 literal 11259 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 ND9ETv*GifO{|^e1n!f-5 diff --git a/tomahk-metadata/content/contents/code/tomahk-metadata.png b/tomahk-metadata/content/contents/code/tomahk-metadata.png index 8461e9952315e59fdf21e4cff7843cad8e63d7f1..c4ccf7b30f6949791f8fa0ea23616add5b84db14 100644 GIT binary patch literal 16313 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 diff --git a/youtube/content/contents/code/youtube-icon.png b/youtube/content/contents/code/youtube-icon.png index a58d7667a2255ab9fe81364067dc42874dd47376..0fc64d379cba8f37ff6da53896f7c9bd7d5aba4b 100644 GIT binary patch literal 15901 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 A{r~^~ literal 11785 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�MtJ# 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 From 1228514ca2bc1b98b4ca247f8d6bfe123611e634 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 9 Aug 2014 15:43:34 +0100 Subject: [PATCH 288/597] Optimize PNG sizes --- .../content/contents/code/4shared-icon.png | Bin 11417 -> 11405 bytes 4shared/content/contents/images/icon.png | Bin 10020 -> 10008 bytes 8tracks/content/contents/images/icon.png | Bin 8689 -> 7571 bytes .../content/contents/code/ampache-icon.png | Bin 33240 -> 33144 bytes ampache/content/contents/code/ampache.png | Bin 19262 -> 19201 bytes ampache/content/contents/code/owncloud.png | Bin 7526 -> 7516 bytes ampache/content/contents/images/icon.png | Bin 33240 -> 33144 bytes .../exfm/content/contents/code/exfm-icon.png | Bin 12803 -> 7658 bytes archive/exfm/content/contents/images/icon.png | Bin 10453 -> 5432 bytes .../content/contents/code/beatsmusic-wide.png | Bin 14630 -> 14615 bytes .../content/contents/code/beatsmusic.png | Bin 27220 -> 22484 bytes beatsmusic/content/contents/images/icon.png | Bin 27220 -> 22484 bytes beets/content/contents/code/beets-icon.png | Bin 4775 -> 4774 bytes .../content/contents/code/dilandau-icon.png | Bin 9781 -> 4193 bytes dilandau/content/contents/images/icon.png | Bin 9781 -> 4193 bytes gmusic/content/contents/code/play-logo.png | Bin 4272 -> 4261 bytes gmusic/content/contents/images/icon.png | Bin 85124 -> 83521 bytes .../contents/code/grooveshark-icon.png | Bin 5817 -> 3720 bytes grooveshark/content/contents/images/icon.png | Bin 5817 -> 3720 bytes .../content/contents/code/jamendo-icon.png | Bin 13012 -> 4695 bytes jamendo/content/contents/images/icon.png | Bin 13012 -> 4695 bytes lastfm/content/contents/code/lastfm-icon.png | Bin 57746 -> 22725 bytes lastfm/content/contents/images/icon.png | Bin 57746 -> 22725 bytes officialfm/content/contents/images/icon.png | Bin 7601 -> 7339 bytes qobuz/content/contents/code/qobuz.png | Bin 17896 -> 17872 bytes qobuz/content/contents/images/icon.png | Bin 17896 -> 17872 bytes .../content/contents/images/icon.png | Bin 60731 -> 60066 bytes .../content/contents/code/soundcloud.png | Bin 26366 -> 26347 bytes .../contents/code/spotify-metadata.png | Bin 133847 -> 131226 bytes .../content/contents/images/icon.png | Bin 133847 -> 131226 bytes .../breakpad/client/mac/sender/goArrow.png | Bin 3591 -> 3544 bytes spotify/spotify-sourceicon.png | Bin 381916 -> 329934 bytes .../content/contents/code/subsonic-icon.png | Bin 65245 -> 65161 bytes subsonic/content/contents/images/icon.png | Bin 65245 -> 65161 bytes .../contents/code/audiostation-icon.png | Bin 10336 -> 10113 bytes .../content/contents/images/icon.png | Bin 10336 -> 10113 bytes vkontakte/content/contents/images/icon.png | Bin 46770 -> 45597 bytes .../content/contents/code/youtube-icon.png | Bin 15901 -> 14977 bytes youtube/content/contents/images/icon.png | Bin 15901 -> 14977 bytes 39 files changed, 0 insertions(+), 0 deletions(-) diff --git a/4shared/content/contents/code/4shared-icon.png b/4shared/content/contents/code/4shared-icon.png index ff26dd94179aa526b4967900c19f6811c0761259..d66c39a82b34ad524a63ef3e917e992df65e1c02 100644 GIT binary patch delta 35 pcmbOk*&8__mPtoyV?2w(=6nSy9sxy<$PWxa;OXk;vd$@?2>`P)}(f-m2uvX(`QyI#`c+l8y3~tMwRFGwkW_lK-aY4@?RS=o zOE-QIF0S`)(M1wmWWWWzGyq?u!u!eqxk!YID(FI%00F#6g^M=eq6)gWE*jwrmI33P z0~l@*Q2-DG5kwFK00aOL05E(41VHRp_7@QV1VBLnVL(Cvl+h%a9`^zufCvmgA_O2n zsMD$Gb(0$A&s=ax{nYxJnu%44tS5rZ*wT8sx#jf1Bh7mcHn*Pc%m%&)lYk&17)A_P zIcgFx{+%EeAS9SpSAE5bhV@r0TY2gHX;W)KP(bXVj@5vGAhH07Ac!12esar>{hQv} zwRP9N*0vr&g)D%fkc^IeF1g|U@kVP90IP0*Q8eHcE0%oh=But=wWMxR4FF51M#5(x zp@k6u1QQAf5d;LATRUEQef!hTy|#PbQ4SxpY78N?qQhhfUOJ8#AOIjF5CAF=qqJUo z>4N+3zGc<2`5CQ1NPq$0Y;`yyiU6QwJ?E7-_WZB^^OMGd%?1nrB`qipODwSAhWo~q zz6X1>aqi414}9*Ho7S&ME6pGP3?d_oI<5MLUdR2>bFY8*$^SUj+7;7WhARWAZr%fbuWi}s8yjSV0mcO+0nxtIlu4BjKlJ(4D;fw43+4rwmZp}z z#+V=o{KWD+&-eWx2#hf?O9m5#s2L7X(P?C<{Q zKP_#Tg)Ao27X_p@#+bklj4>S8Ukx*}FarpHARrMD5t7!Lv{qWBlqRJVktQl&g9w2j z<4xDERVnq*U;JZ_=hImlnvxB~Bn)yzu&TWL&%S>Dr46%Dgn^SzxroH4-uDCF_k7Ru z11|{J^MX^Yr%$zYoN8_F>g*9D0jZx{GqtXEO5MaMQzoUg);gtA>2zABG%KZvD2E3a zh7AO;@dInRySxAJk^jqrkN_-(^i4|@jI;X_;gr%3-hJz}Ya38l@v(}V+|>NiueNR3w!68tv#Td7EP{f7hzKC4)WnL)*)t}uTf21qHLEX~Hbsm!sdPFm zT5F}$fMgXgx7~Ez&V5Z!KD`M6!vGs#Nb=(14fmF&1Tdfykzd=e`Y#^3PZKhrC3)=L z*n{tRp5r*K>t-Ei&%UOop8dtIw(j-=Ktx0Zgh&La5c{2Zfj}5QIFnM>uUq-)+c(ai zH9eh4r_$+^)>>;s%;$lC0qN=P{?bE#yKUDYA{C0^Pzpv(np>(~5CYUpobb1Q^k8*m zxg-DuOB!Ylg23~3rc|1A8YxXmBiWBaQbfxB zh6NfApLpTrH?pqNFn?A`D*!|!iq3bxlL~?WTI+@LWG}GnLXwe?O+a)jWNDeVg8V=a2vTiIc4zq_j$DrPJCTc~ppiA)1D{vX#dX)ToZP zcK&knwq=XwPn}X@za*kO28f6-E?zMG-+#6_>$nIwBnzkn&piSNY5MdXH&m3DCC!}W zgtfYk>pD)~8{2k&`+q*!+v}k!Q>k*&6G&x%C_xvA{wsMF97HVm0H{T2rPRsxzHj{b z-!~pO78qtW%u*P#AwccKs=GeAfjM9l8Ojz@sU7@~2XklE-?;t?0g1O5^B@QU*K_@> zyZ=!0Bai*CH|wEFDXmHANO@zzjwC;MCdPtq5&i%~O1E{nfAH}4PM_{#W)YJYsUac| zAgG(Kzj9Jdr7&B|Bxf?hvsacD11t)E_Z=IrS-m(3#K%sj>$;BPcJy@o@x$LcaJ+>m zO{ug}DMU3gqi=%%YHjarX>HxGZjH7cRH0YOQZXTYu<69^eNBjTW(c;_R1kt7r3i1m zXmyMOx{UQrePl*r>hz@d!c)iqs3QZF^<&wmjY^iKT8_sPp_{AK>$vw4rVq%;QM}aOZ)$O_Gd(zREksz!5y9c_F5r8g`%kz<4r0gwpOX}xCoA|nAXgW$L^!XjW+En84{ zmYLZECNSL9)A#b`ZG;L`3PS?nD8B_D2tWO^&BmC*yh7xj@`|PN4I5#WGohg+Ru?4I zRTZ;l)Y(d%JRxA?voZS*H#Z$Si7G>+5HWekMsKr-h&%TlJ$&rc!r3zcIZD^$Fks+!Vqn}&gju$~`<@6PsmSn-@(GLa?e6a09eWOj+68l*QM>9U z*G@=llL!||o&gL{Q#D~ic^V38qpS^J<~{qHfE1vz6>no9;SyES?R>9EP*5m8mPP~s ztyNuZC5wo#M61M&ut5FfT1EN#CnSo9h#YNhLkt0)v3{My$4_yticgX_rFCshHOQH~ zppvrzkkUAqV{JLm(bXGOd4^Hj*zK{svpettU6z4dG%yaP2?5zytTYLgm#`N!q=VAk z-6Mb?HZ6rPW+^8T$vQ5}z$#uu6j4P*1wqOMK20sD+j=ww7b4f^6cYP}PN? ztT9=~;XxEssj47|y^euioRInrVQ98#%=Rd?HI-?txFFC7y)rhw@7a3z7%~x|l6FI- zc>Qp;|I0AW!nDZ~l}=#-Y>>qA{h+5ii_8iBU};OhkbX^pLn4C;%V@mKvcye9JJ`Tm$VTs#tJ9O{RL1)JrJ`VmPjgvmoHt2U;rq2jN?L>uAaWOjt)Q? zH0@J*WhppxWM!)oW6%a=^rHbm0ifA4rZ&uyAB$WXmjMkPVcW1Vnme(6`3igzuQ_PEb%j zdE52V>uM$J`p8KN1%U~C@7Re`hmW-&kX22IV4<`l;UWA^vAQP$;Y4Kg-8{qvb7tKC z8y~UAN1p8s0uuzjZ}=ClZuPtX$Z`kA4Hkq&vPp8Bq0!u9Wku!>zw(*dn#w#$j2Pet zzSq;^y!h%{K!iv(c{kWQ=#mS>Bsb)V1wZ;@P8rCE8W{8S9twg6`0D5Hx_a%hJbCOd z1P+WJ1aH5y`{2=22nvwSoRrrkse%NOJuUX=`Mz(AVZ$K{L`GBsQQ-axNQ(5A@B8@Y zK7Lc)iH_gF^E}UW`+B>7_~TzN8`5dOA(VUxjw%ocOyIhn@B48(ku6BET`qB71=f?Hhm%jAZP#xMNnW$-K5XldE>pG{76+rdGx5tJNwMchW)_vJ@1Jp z|NZERQ>Zeel;zNw+cEXn=j{rS0to|D9EK`}_ugyTv-^MvJYm1U#v-5qrl7xYyl5m2 zE$_nF1nG3@(uK1>{J|@4|F!F;)z#P*)I!HMHb0Kj=eX{s&D)=O?iE2rq!9@L0f*>S zI@c1A$)xIPYbMuLgRl&*w;zzj00&{wUz{aF06+%OfJ}-=Mbl`CMz8^DtEy(rtXtMF zZ_V<>b1$hcFUy1&&p=^^b$dL|%Vx8Ej(hOnk-vKEpFGcCDvhK7s2EpxG#QYTxKPm} zO{|)*Xzq+FS1(z4+2SP&W=*S~q?HTh4LakksvUh z=Vr6nzP{}76DNP~+yBsZx|37}N!x<3VrZ*Jk^0dKG5}>VsVi13x%I}YuDfdajHz`h zY$!y4l4#462vyCeJ0#F%*K?h$lkLkkx1RpfN1oVs_!y}a>a@*M7RmlmV?eCwQmM?X z8?U_oQy*D0Z)Q53wtFzZC;&oGL}LB?jsqq3IJ4Po)^$%dxBkIje&?M%heT;4O+<)P z{0{X<&q+j06iB7@&FioH>gVs6KWC;r@hk>_02mAk0H7JI$n@OP9YC0Ev|()fljC^1 z_8$D!fB#<7@m3;@ltz_~W)b1JU;u&v(bhYkKl_s3{oW-ocmxy zOYmT>jzyS#-}gM%b=^MKJpc1e-}%9h+dCbl6{<9n3VUkKW{uDYYd}GfTRwQzH^1`P zsdW=YklBuhkx@s%hBQB;_|GMC>o&b*=Sg^;=X-v0%jw7e_cJeU-U&QSo{YWMRQ_I(wddVbi}p`*K&WON5|PKq(?^8zP5s0`xHH4}d6D73JUj%I9wX z&^l&e4hF10jlYb5Gme@I338j<&g_v4CE17=+ax>-Z!6c+0ZaFIm`xA_#sq;Mn4tO8 z>6c#J`og9yO~+3nDpVT7_HG5mbYzdB3bOxFCY}1T|9am|>(>GspN$AuWF~polVf?p z#fF)IZN`L(Kb#2$gmM*41I>T2C zDSm8qJTNKjkVYEtj3a{53Iv#?$O&S}`mMltLBOsb^kuWhn%kO=oZ7SZ@UF%KSubED zLP1PXIL?3s$wJK|RHFJUtP+Mpxe)QUK5_HMK75TIFdNSp5jOq%5M~x*IGlszd4AxT zAUM|CwtHVwltCgSB{0nH2^3s+#nKzEU11=1G?jpzedV~>N51on;IIc#VIsD~2++6gmBi{k zxA0V{fLl8h^?*Gh3rcbVM0+#~`Opu^H7!&xupLMfd)@$wT{^uXP@Y3dOejuPU zk`6P}Vdu&)t1$#&$>Mo;-g3PG1Yt?!0_;4p&Ys>!9)DWGKE>gMc{%nz4ug{r;HVDo zE>?^XNG@-fcgu}e8)Hl~aV?P&GM?u-so%cq=1eAKf*>Zn zRsGED`+@8Fj?=gQ(20j1`{!e=?Fv(*G}w6xv zAz}~$ECJA|SQ`Ms4GZR6yY@0+iO+uSWH8@zvnN{H|HpTqI?-}kQ5uy7l>#IfXeQ6_ z6sSb;YFrXwzmG!=HVh&l)-MQ|jps2ZhS0?f%z^@jQ9k+64WuxRc=O>|*UP%@<4-(u z=-4Ts6sQ!214=Md-lI~UBN1AV_-O^oOcIgt`3`*#VFOT5&eh2aza%@ zFK{=VlQJK6s1&t4Z$piT!BtpFiyxOxR5nrQAw?8X=q1cprz zJon=3tzFp^DJC6xZ==8YVxp`5RDFMws+`9R7{Ul3B2-mPSh8>yGl(!JOY+zjB>8O} z-LJg469Iv=)%#=Cn_Kkxm$(KA&gUH55MGb~h~U)8)%A4~^PpxM`5I%GgYCQapYF^m zrGfOAP6&{*)j{Wd{&Oe^Kn9?>vu0$pvIC-$sV-p-nAymi+xI9GP$c2C9`7d$!n(U? zk0Fh)-G{Si;0!6r?h!ZQzk{gdl_F7}t z+SbKvAvPSijBm7MU?|wOl-7_c2#BDpEH${)qwBhoTfaAkflrus&+iTD2W4|Ilq?~L zb{?ysq2*an1oLb_jKmR9a#a3Ui@K#Xp7DXO{#~Rb{2&@~!yssjO$v{;)kVqqRbwCY zi=u%W3u31LKuW0XhlYe%jN$f<&H?`l5fEug-DE}T+`O*sm>BF(i%4fzmwmZ$Vgqb6 z+}7TcXWK0PMTAP}OQuaBLc{htov}r}l%h+f*C8n|LE-UdmX?mLcxJc?KiX$0Wr8?Gb}Q;>~`8s)h0;Bf@$Z%-5v;n9Ad(fkZy z11zH4(sKIH(U#hYRrx|dNI*)d`ExG0V)>HS-)YoLOpK$d1ENb%X>#?1TW`FI1w{-b zRFI{95Comw*+Wgo!VFA~(_FeLNB|H5mN&NTDGUPQP@pWGy5p7&88udMsO9Hx-hN}% zgtV|gA}bWvKpJBj4>oo6W&u@{h#m)SXoN0q-m=4WJ$p52e8A(oY)Gjq*Ic@8^)dsD zf|657Gg9ye5e3Zbne}(vx;|iAU2T%bo0)y%vynI7-f376$=0y};Q7x6k~6Om{*s-0 z55ITds4xp~Aufc78J+p^7d}x}RW4!(0YySij9`Vm9?WIwim!d~uDaS935y}Zt5HS7 z*a=9Vr&Jip=RvvxxfJmqa)b-b{dhp(lrW6Yx3d-4n6A}$vN*K>uHeUOsdp^c2zF{sXMfH6@@O?M% ze)`;NKp0M~FC9-*mDepSjx^u|zL)i`UVEu6+s?V{82a0smo?0rJgMf*t-AulNsO*| zng{|3B8pP_leca7{r~dWv{pe7urYanU=Re3>$r~l(rep(`r@0Uh|m_|0hWjnR%MeH z6i0s`kRvDB)?B`@ZqmevrZ_-sjCkpy+4E;l-@bEyU!M!%VQ}L0!jbYw!5G?>^Pl+ec{YP)jKgQ)R_T00N+B$9GROpT6PRRZ3CV zz5tj9Q81wvnLB6BhIK1iTH6jEIU&VE)#2c6xO~a%KmWZ4fBnX5fG7w&Q=ok8kOtRv zvyS_(KY97}w|4_6)M-FfT5ZV1G9Vs%dHiJSgmQJ+;(7K0^};(XNq~_EOigv=&DUSO zeA%M*j?T7@F5fp2mJ4Ekdr6|H(cVV7WZ|s;eBYhF|J8eDO|A9VaNq?4seaG*JjZj~ zzOC;z{=<{c1`JB2VUSto=kvmvhMS8GMojStb$qWV z<~BDV5|UCjG$Qeh^z`~|r`wxPwPv%fYl6xN<@Hl0Uov${MR~fcJR=dLBZk9%%EWY% z*zIv$H=A`kyW0Np(I0Nvv6m=AN<&nUH%=LlsPz#9U|uw5+PA)TPknu@R{cCEWP`O8 zM2HaH>taO);>I5dFGyu(W)LxK!hY|(nefIKKk!}0bsV>|tLr=8|M82Pw-Lr;0;mLs zP!#P2B`+PdDfqVb&K-LWtXbJmQI@fXl!$D%UXlS4H82TCPUkQ)3me;P5rR44*Ia;X z+XsB#cOB1l`+EBN9{tB>Uf%pRpvLg*6PDod2LP3sG=G?~gV=Jq^PQasmN(37cAVQa&xsX(S!jFW%gG(baUG|vz3cCv_|c}#+ksL*8kHXDHL3421B#S@0*Dj< z5vaYR{g<2HojId!+LYSCuF8VJr;rSG{Y{eeR_QyA<9S}=p<@p}`s7>hHX^1_r3f|k z8(zF%7!Yk10RYKyyjS1c?mFIrxib}6_=}?otux8QU~~@==D_%Y?|H7{dampAW!;xw zefw`7|CggD+lazB4P@`e#?lo4!0JUejQ}u<&}tD8Gk1FJ7e4p#PyXPk=eBHbG$KHXDAM}?7c>K++Iw3mZCFr)d&SD7AOG+N zmNm>#I-?cFJQ$1(Fwj_!AP54_`0N}$+VcF1Z~gq0U-fzcAtI&X0VRN?O!$}qRSP$c z><1)AWwX80RBK$ZWX{Ix)~s5-q`IP9Apt2ORElhD&_6mi$~v$x8xBJ+6L_BY?%snh zZF>8yclLJm^&)D(6vkjDj0e(>5(6L)YLl=_lnsGYO-Qd^zHrUTOP4O1U0qq3NvDXk zAP^>%7l;uN_I$6WH+%5V@hv+Vx9n(aX>AJ(BWXcIP^c7GkQB!c^+%5Z$)A`&%m7#z zKmtuTy?)a4sgvvLYU*lhCX{C?E6PEn&-MEHvTYrmEo~hqTe^-OZ+3hSL=l1@ArXK= zvVGnth~w$(j}-&@fg=C_j>0guAL+m9f=R+EPwBsmmk>z8OTiUHnTMpaI?g0u3`Z9W z002daafu3>g&@D%2Kyf{+1yVVtw`+6Kr)D!iWzz>D;M pUl&~@!9@mKWWdFBkpUO%`u{zplJktA*AoB$002ovPDHLkV1n=ga|!?e literal 8689 zcmVF}4^dfF_3rdaTDVjxmJCxCYSF7#9Ie4$mOQdJN+j zLyYSHO^$I9(Bv3b0-GEjW}E`*h9I3TA&mQjKwvNeyO#_gtX?J3i|wBc!fIT`U1Hob z5Ex;=Xb{r=#h6jqo8I{H*AKgZ8ju(x0RvLt<#U|gHI;?)W^vA$GnhG}gN`YaP%=@l z1zHRC_Z*;m{{gnX+Rdh|-SiyjqY#A{qmc%T5C~$lutXt7VR5{1BVZ`d7$ic%X+7F~PWI1?y?TV%`2Ntm=21`ol-=P%+NH(bhP7c8P{YKOZ%VcDhY?UI*Z z2||$J|Bj;=FoN!$Lp=J_T7LTAlWcf-r?buMb)~18?9&`At>^@r#JFH|MxH0ytSK{7?4!zYNA2h zK`gxXW8(yng|YkI?mNL*v!-+V2XEy1t1cq1Jh$I9xEZlEj@jp^eYqek-?s;B8E5Z*wf(I3+K8 zuSFsPEGr+{e#)|PyS9Ro76BcTC$i#=7m`zgwHvk)$J(kA825SNglIu^&As5x6S)7> zfFL!)PV4IA8+Uw!w_J6x`(texZ_W6OmTwGNYqZwHah(1?c_r^>?@1QF^t1NxJWsOx z`~{pjV=7OsT2B}!J_tiONe&&}3Eh1PAkpBpP)wiN&Nu$zqn!Wx`9PeSYgP9clm5&u za(3a3F=d=VN}2wYQlgYf|CW8#hCmy^TUK0xQi?C%buUN#7$GEReM08qxFZOI5rU~x zTKR{+`ZE?UoQ=?i7#vT|T$x??I3|uG!YC$=HBl52#rFSNYmC-p{eQ{A3+dr`63

S=&)>#* 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 r+8tbVz5{T?GL50MB69)2VJ%YU|g z;)?qxT^!q!$MM~H9GG-5S+&h3=(@(w9xmdg*H;GenXjE~;%A;NZI2VYM(SJ7a?0>f zUTXOvERS+Ge`7Fadf)(^)2I@(_ro@U?4ki``0!36+Q?S@4-R|<9N&}2@jV3;T}Iof zzV>?N(BQ!M(wmKK1IFImZt2Ao5k$GN+NA5ts|{Elm2bi-0^V{b)FeXEm@2DoA&_1M z<`|F~i2R3^6*sC?|9UI~y!Ib6juUrnPCR?Kh=R)lf0e3}72fJdjC)8?`+SR_r-0vZ zo^A$mGYkV*tAV{BPFYiZR%M?|qKy+r+T+7TB=!jP(Zi%bb_pUY=v%BjWW{w`MOR_} zl#Angia5SE0Urit$3J_hh?m|N3_E`3Y!g58ba88A5df*~wu~A*y;K2c;mFh04MGTO zwdLK=e?{dfCMWAamE^^l@CAw7TGg;+0O_xwXNb;_6$c8w<9mxK_zq0vASAH^eDIF6 zXATzz21X-Qw>B6-)Thm<^k9MjL_#_RV>7gtLgA(YItMsN1kn*lQP&&Zrecw8kdpv% z^KbA$v0^c&)(y~;RR_oS7I9!YhvR!oIFK|Pf0p$DUq5CXxKu5xEsRA4>T%$R!9#YO zIDiON*ofSDP!m=|a?2sCy4!}B(V?ORqPt+H@9g5UV;C}6G4#B}S#i*fq73*-cw%o6 z$M+R6RdYH$*&7f>8mv@p;b)%Oy6i}-x*8ap5#!P+Qw7RGXqCgIAU6-KVb!DjQozMJ zf3bq-Fg6G&Mse5&i??P*B8Ujc%ofl*Btd)mECDG ziU8X0xycF$tD$=}($atktS|_$8aeL>C?ueB*0J^kB-GI-g0Ns;A z#sCsdanrPb90V(V;l%W?!sA|<@m#CJF5NQD8!*_i`&f5=ClN72oT|Pal;8F|A0h(w z{TAlK(F-~^=Amn3m4vNc`z1*RxF0}n@bJ|^u;O}#GPcWl?QCo7eJN(Jf8}=JCNeU$ z3lE;S-rS0uYkB58aI;azwdLT7hr(j#)F}dV0O@`c(Pkd`tzbuM*^~sb3V>DGP(Tib z6?fpz-nubF)P35GTaFotp)98Z3hF zw-=wD7_#EPr0OOJxd^rYbSt*IbU3o@niyk;z3BCX3B__{DJs2xe`C3|kR$_GqBRz7 zF5{-}eowRec>+1@_8QtSV~^b!-bHxhR=1HH2m}f04hq7SSI5B^T=CT4w331t0LQ@V+RAZ7K0yJuH%Q2v{A|%CST7n9{|jg!>c9Ohr>jA~ z2oUxrO=zfSq2+$h_q;f}ihp1MKp1#f@T+fxcCKMFyK#2805;DymjD1D07*naR3Hgk z=3uhU9UZnuBi}b5T@W!OSY7vOk3raq$M>0OP#ZbHcq>ZPqCx4 zh1XVVKZv50fOJaw`yj z6^PbnlMjj&Kk-Jz5ckIUvf#`9+buENFqQ-kbfwEVnErs&i9rO(q={iAjAp{t~M{PsMmeZYu`rz!1sMzy5U`3 zk@7WBPM6&n^wO-B+g4<(?NMEmB0+Z9^krR#SmYpBv6xe_y?AqopaDzOySsT?AS(~b z)xh~tP<{mDmI2!}qq^72Q{Q*8lme6kvWrlK5pb6$Rf48be1F+$4dvoyR9m`HkKT=TyHgR$oQ+U%eqtZYLQ@7I>ua)^d`LyMB>LiS)JlQ9Xo?!#TTERz}c(y zp+sFLse0SJVdX)&DmXU^%GE%20Z6i4?$O~g$YrTMN-=D7J8wj+lAe!7|Ki4Kuw*=` zhI(1ZRPZk@uYclNtNg0AOJ3(VIDz<$9)At#fbMJb&MkC5S%o%?d$z+cjX-++GJjA=p5zB`u>YOLFV=>n!| z?l7eBAfzfOK;=QX5hFpJaxVjJvc;AHcUSjI2n2P>N>pMSEo;1Wv0nVH4*k@S1Oyg9 zAQ9-$$N44u!ph|2)uL6{6?b|gfD91Bma*sB^3?<~ZvmFHw(-6lJ9QxR?n#0SYOLEA zp4)-dR)09KK>zW*CH&Qo?dUA&PSr=Jhwn!h>Yd7@<1|Ru%X>?xZfW;q*10)vAl3Z$ zvR;4Rk8Q!6@vyVKwi9L(E{iR2Hoiy%30o$mG<&g>BiEzq;-#C>>tWOxJ+MHguZ`9b z=5N*;b3yf`Np_ziAv@Xpq$3e;1?1MKTdK-!`+soU?=p@ZVaw?6yU6|-WUKxYM@I%K zQ9u98B%at;Msoh4GxkoGyZ!jyQvXW-4EXx?!0Fh?{kp?RFUGrnpLs0pfRy>%FaFU2 zUV3BozRyR)7yS7}3qSE_`HpTJn@Xahk3#gu!~|va+Kcd3d+bHe8u8v+E&Xx5*@|Ujd$c$U zwV~Ol*KuKq->CEWHB!0Et&xn~7&LqA#(xLd1&-JOxs^K#e+-fpUwnE30Pw>Bf$@c> z#<&2_)wk$%eH$YDxwx7Y-B?kLMn%4npk;nNqr~qTWyh%Fk?1k z5e7akUH2~Epy}_6Tkg<6Mt$OT)yw& z(n9n6oJ@UB+_GeCGtnW$?>$+heY#Z<$Ka)ECrd)PAg2o0C9HZf(A?1{_E!eVj4wVl zhOM{;D^(vJcC;O*XS2g!jvG*A>KC1|TnQ%Mxw07iK&Kfw6nm%zL~#!sqIPsbi^lbv z%ec^-_;P5C)H}SYqD5N$qrVDC3*dvR;BB7Xtw;MvD_px_SX zM)NQ*BZ*-}?k*$_S|$vbVMS7|Eb+whkFUGm47^sysY|dZBAwn;NYb*y$N9O|r7L>p zOWGX?vq{?$29VZ`p0;xo`M0d(SYN4X)|bA04)xaH?AJu14#Hmi|J(cW;JWVXyzl(( z_ExL}xPlA7O`<4Sj(=@gPVFRK7;kE`v`J^$bf(j!iR&hrI&MA5OxsK|)0w88Oq?e5 zOqZlhGi~hD5=Ba~9oKfMSY9NVvKE%&0uUrY5&*Hj{cgY0KYn-l-S-~2NFV^pcr%o+ zKHPWT{qA?pch31vG56M~EvDa)U^^8J97$GZ>r|Imc0WPb?Qmfi7nZZ2>}Lm>iN zJv`Cc{@v*%?@XAesML;02t|x3QkVfLB^DPK@Oo|dan~MN(!>!aV&>Lj=iDI&Ah~|K z8EZ`+Pdq!Zs?YhgQ#UZPrJ~Rb$vbH!Lpd^)aL@$1OQ6Em?8JZI5=4$yYUq8_y{c=-iU9Cu-<-mqeRFD6^1ORKL?xm6MXekl zoM^{h`+J%20QSOuOAx8682!~e%~o5>B0 z67eQYAB9Z5NXbfK1`q~5re>BZ6Rqw4GqATbI%W??;k2<=o zfYEJ*dklS?fDmRLzGh>(*%r5P3+?>w}H^M+*4+O8* zhrh6}Tz{Vn!!QX@^*-OY2~H4c%8l;Q$c#p98Luw%e640~y`E{0V`6rzs+OV)ImDo_ zwdQ4xyTOX9`M4)pQJ8>TP-9HF9w7F1xy55OL)CA*y79)lALR0v5%{ z(wX_f@n*A;`FTA)kr*4`63Zu+90Q_Kxp@0EaFggRr1CS7^)hk3Crx#anqcSg`0#G zWo{@q*V_5)#7y(WAn-M@rpsguqDFBd(#js3kYp$&7Ut*h%F^&()ScZkTA70ZFt?Ue z4}V^!%)!7d*m1QVKmFcO{KrrI7)E#WY`8b?(Zd_Own)lR4ORi<^nr4HfK^2Ms)svy zeBfJmc5M?suIDroa}}vBCy{8w=yiwWaYVH?x?;vQ~n>-Y6Y=tc*hb|Js5#h zG?|X5Qu=euXf^A2?P}|VYuNof=Lf?qJAeA%<{Wp}Z%7Yx6WhhR5vq>u=*8zh_2c;a z#|~{QR(yDavLYFPsoWGOH=qoiOb1!Zl{W~+hlW<|FgH@DYMLg@_HqWZ!a$&DC4#_K zFON63pS>{ae%156?kRcOD6o)_U`owi6)-swNkbW8_Qs9y<)z{O+H!Wz!_0Haj(-ep zEp%@J2%2lkj`8Ccjvd0E{?-Ta;Mn@-X{xr^zX2|z=q4*nWgKnys4&#&1+2Vc##I!# z_iZa+xOa8d=lp7RW9EPH!Z}^Z`~O3PbN+)6^q}R_7+PQ9@P2Fky9L#rh3q zzm>hP?Ou6F?z?_=PMq+4H?14S&KZ#!pdjsTcLPqAaWvKsg|bqHUJ z7P<9e$6iKTHm^r|-mCc}G0wQ+3rsPdu8GsSXkw|~vu+?+gMFqTEe-wK5 zslRFF0kWf-;M%thuV$z^+-t9Iu4vg^8p5Tz<^wk?$T{F(_yd8y2tSU3n#ze9w_>`0N*6!YkwRcb^sCF%r#KS|F1(rJ7Yv%@RpSlH4ZS z-Qg%QtcvfelrC$bE`KRGw|}s{hE9(h>c`3F-<&(&k=-S{|G|NEdo6+tICidclHaR= zn{BzGnd7Q6Qh#A~`ybp`SiBKt%!@e{KGC^RoDtb>=0n>)2^Et2i|keq)OF zzQS$n2~b(1_!?SF=V8L^w0Q$mUv|0_iQ z&nf>4otJX%oBne(;R6cQC(4h zbAvqY?Yr{YHUA5W6{7&PEjQGIAW8%sz+{fPC+Vj^2K07zRxTv$DzH}~I&B)F*ntwzL2|zFa$sm%dDVVfNfH{eZ zTFp9Mx*C4-X#f6a@5^8PDe_x()T7Gakhnh0?1=SH8b*do_}HU+ zab>oKsT*(JjJKFG@#(+&wvOoZrf)pnx{v;ng@3P{noT}`U{4v3J+c-5;3szC7mtnL zy+``7Z)+i9!JC|r)jCOhd(UOrHk@3(GgqunGdJckZQNv+c-}d@aB^zoH!ohBKNGjU z0i>)nw7;GGR6!&@B;&xrQ81HY#^{caXat%dtGCRBVSsvIPi-6O-@4si`VrwRSWImrq<=Uv@HWa{_swW?dZjeug}5{-nhm6#~$5-cN`l2 z;X&JNfDvFk_O7k?=RY%w4?MI52X~gxU$j<^&es`?hG8IAD0UY3y((noa%?dZS!!4u z7DxQ=)*n3at%>k=8?|aO1x0PgO)&s7;eTl=&lzK5`=g%}iFyu*7(Ync<6@#Cuw;0? z3)kLy>A+z4{<56k3co>=pgbfS1vKUnl6np<+tF9b#(ga$$z2W zxHdC?J&@WYKiy0Th#<&mk;51p+XoOqXmm^|HEN(AXee9-l+Kb^AtJqdR)=3&#%raK)jk z`M6Usz7hT57GQK72ac2L$mO{)1AlJJWW!U_L9;a0{My{1-~awZ^^2`mBXx_SG*2Ym zVKGYkh&eNZ95Lf)3ObPjj=Hd8O0)t@jL`SdvbId@9?ZXIKrHMbw<=V@Qr$E-4p+@w zR$b*lt$tp)_PFks@793=j=gg?{6OOM%eS}i=I4H5KknPpzX`^*0^=$(qkn0d$mI*5 z_VCoNfh(6eT6&s@HYjWjPlpel{mOX$Q;UlW4Jl;@D^f~N(HB??P_y_l#tx3EDVliF zU!*|nU`I;b06=PURm%-rF73LwugCrIjF^KcM+|+C)0+)f!2pLUT<+r&$Y66``3q_KTzLv(+Pi_T2f_=j!!J`YU>_$epE(j?beJMi5}^9~;vSGBO<( zX_^=Jd1RF#?HdyCycVj);Dvny*8BR!!Y+7qqG<0R5i51o%oD}SR+Dl^s6G_-hQBIr z#gf1FvkzkHKw1%GXVajlrqu^rgC$Vx*i5OQk?T)7gjJxn@nP~67n@X+MbD%GRX)U+3+;i$8)*+7fw#?{q)((3*U)XyLGg^ zaeCmf-CJ9SX&S-`#e4<;96Wd*Bn1(`IH`rC45=HgYNd|k{|rCyvE~k8f`hNfdkljm3o)|Y1$Uv#9T?Czt2uJ{UXl#qBP44W4ZHi5ny9dE&7zXnB zyy~*i!&8Ld$`$73V*JBNcUQIe^I!YOo))bQxM$BOCy`KU& z`S?lYu@Htn$QNJJy1WdjP4KseryWx`#Oe4H>C-nzL`(w!CML%5(5{EkGSs>^VF(DJnXE=g z7nGe8h<`hD;xC6`h+4hXY}(sj-`6kSTf)*1f`+2#==Q)t17tWvRw0`|vWz-(td%-+ z?p=PNb^GNXK4!dChYbV55Xj|norQe>+**jbY_vR)h*21lSFH!9k6+yO$;s<;uX?^0 zRV*lTe9W9yBH}-&9TT_bjnVag?#wwPapCCxeSeU72@V;8LW(SS2yvr@xXYq zUI2oc+P6EDQ&mrt%ae?-h14U1n4BJ7&K;^eGjs6Yo|;(xVoUQtB~=SVJatM@j+lb8 zZGW&h^MU%_$;VHo%m@JIFP_K5xe1IN*bgEGNkCHEUq>45C<;|Y_C-gSWhMlkhdIwa z-P=FZyFFifo8d3n#6fhPh#&(XYyx(f$gndF0mK0a9QCliMF6=PM@+N{##LZOC+EO% zoDLu&Xn~g}qjtB{*_-Sl-0}hU+2x~Oe1CQ#{Fjx=a+JEYi#C)@H>IMDB2@yEtqnL+ zzh{FIAV#TUTPz(KU}6NsV3yHTvQ+u zERJ|E?C5aS8DO^>bv3vhp#uCC5Y)T6%WdY5n~yhkFC#dPlQN?I2tCN^W#(3!*ME*- za#+|Nyxcr=`s?H3cNXRsAQNkuwiZ&I^kM+U!}>_KF3L1Yt*;GuM%WzE=Po*2_OX7Jz0g7 z015;365a|S>t>j`?#vhik=m^FA%8>2>J@N(HhUDpWE8jYgm`f3_{D9%GI?$GwZQif ztC(q87!i@CnkGFr#OZ*9Ort+$g(IC6yMl3IVjKsyj{#2PO(hW}nQ0Cgk6977_u!>? z1Q@>WW3lSq@NzpR_w@673UZ;JRQ{L((rX;6A&Q*hAKwJHOI6oJzIk$4Mb@S4TOP*CC|KQ_3f_iEV}P-$1&l-l$F|e%noOR^khN)W?P_*&6cJOdpBM7?FP)qk z{oNNXRQ_|LQBA*{T>I(sC3zrIv=Ll0v|vsIPuA)a=gyqFJupsAPGa)HBz7I%4NLW_ zfmw9|C2}sM^H@p2gGtwNlDmiRxmfgzFFXAs_Krg9A)Bjt1a2(o0DsKHeockLR(C+E zImmkykegs!Q!vK+W9*eeQ(|y!8eE&=ObG*E*hQ`v57fT4aOA)L)w$Mh*Q(1}->JwP z3+Ya7+HgkHC7PY=S8KvyEH&`tm%rNe&~NIWxc9(b6d)jz9dbfTS|cG>=+n!oQj`YO z1P&RkRvkCI;t$IG!+%@0<-Pk&S#vn_SOvivAR$0bi84Ns1T|gF_b4DY!MLVi6hbkg zvl0;NGmzCQj4%sCvI^{$_qU#_zx~VK7#E*jT%32Mrkut@6v-UFevQW=YVv)J8A-L1 z27+*M1t8uMjF-+|!l6Su!AxKlkRS+3MB7YpGdVa)S^>21Re$a5Xw>WewAb^}V1NI< z;bJgqgbf>^n+0SLF{IrFNT{+0R%i^^(14^(kgpXOh3KN1X1i-3E8T(UmB+m2TW|l~ zSH_)B&dkov20@S|o;L5Wqy*1tRU!TcC*HP-ssffUh;Z)pb8ifc0C4c&UPx(xS%4rx zWF(dWlvEBiXMccbia83uwfdu)f2`G-jqBdPi(3Zz?jI_IyNs}5A#~MrM+``>rhctG zhXgmxutcris9bdiUK}3mIWklTcZi^Bvh=fn^lOpITB4*J zs#|x+pzE~9h6Lm$81Fh54Z}dr&cQT|u0WKvYvAhD&K%Jya9AGof8afI{`k4lFHT*b zebx89M1ORNmD5-mO0*kpyS^h3a9b-Jfgw%c>BpbG<;%Zq&;0`j_90{&24vD-K!UPo zN+1)SQq%~L+4dj+mLaP3=E8M<@TF~orK4LMZ-)qK28Vv6=)@sw9gqRYE-NO~tvet= z(pP7v%}-~;0df3A#5Kwi*+J9AW{Tf5cj?h$=_XRI|M=v~auKdfF zuitnf2BNAHilj^z_mh&&gxn_LvRaiviHb^KVSu>1disXJc>eq(_8%ApO9G21H>6k( zjpw8&Va3b|Opuu-kunTWZFqCDy!EB61LdOwj=xoe%?^fyUk5@DWECl4LDKF#fv=i! zjDPHkGfjP_O)$PS!AL}KObfPcrM8NCi<|TyD_4{izvQlr_=@+y_?OQ0e&W*Ax$pSC zi`3^SE@5!GyaqZVSvxdsR*}**DJ%$v3~}O#r*7-z-_bUj@eAX)Z}dI{B%}OMYm{Ym z@cP&mqM_t&%UTEo8A?>^?(8gYKQ-82zJGtPz}rMnH#ziDKmr860o7byP`#{~WEsjh zSq2KM8&TMyO}wu*7=;kXSvD-&>{LtvAZS1?O{!6-toucrBl<6UM=yNoY|kequgyId zd)Op$4YfCTC&P%D0zXK*#*^VBRmNbV+XmttgAoAUHuNwW+yt3f>Pd%cYhCzr>~yI{)1!i2SbntkW2*|; zkp#iEEI4{t+OC*3=OC9aG5khXAbO=S_eJmFGbhfMe(B2f8!!0Y%0Nu68-H!5Vgk}A zG)+2DN#jfboOt4?I|AYx0wVxSOiW<^*chl4<&AL;3C-6E8f{0E&q)QO&A5&L$ssEB z=E78K;M=`@TXqc<{gWbs#R#SfQ-()^x|g|g#Z8+=1D|BRJ*FJ z>y}4u=8SI|jD~5zu}oOz3V&g#^uhJ3EUQy$g*~+GIYKb(61R%`o8N1_{ku<{EB;cf zn(B4(b|5Cl(zf@K(s?BcaawSS>N|>3y7(R8i$`zYg-)kF(-{LVdy}J5P!#yKl6rP{+j~hrAy~9 zetrVG4~)TxYpFu05`U8T5=2}&6tSB)l2ehvP81LRoEJO3Xr;ZlVM4Zh(lTzmfQs69f4680=8wqHcbdY-9?(v1=p@JSEm5! zwxI?L!(uLOmw#8S2d7U=?fvZkJy-uX%gc*y7zSx6E+zy*cOWK;Y0Qfv1H|}8jL3EE z$tO>~sh4l8#yOlkKY=}aMnQ&1MN^qhv&78-A{wg92*uG0r8W-_mJ-cI4ObWC%L~TN z^IQ7L_w`urppdQs_O)R#J#4K3h83x;?JNn^Kp?%y_-jd+`oSmTv8wetKA)`a~wgCNWdwh6A^!f zwPmd7b$=uP$?#nlH!A+b40gRx=o#EIP!z+aY~>)E?IArux?p!%ja->|>dKN}kn};J zum0Rxgsz*+c+1mc8Ul`G!ZbzqkQ4wyH)?B}Vua0hHUxw+k7||F zn*U0pQIG5{kZSo_XN@i=CfL^YeKSW5EmB4n8h@!^0{})C;>_6#8wZRN6B8IaFa{q! zERI4`#Pb-Gu1jvSEJy(L+e?P9oWjONHILV6N4ccsprf}{-Qs{i<&z4O;_iWR6O1bow`mC2rUA<`wD!t25V8cj3u*yPV=fkH zI)B1a6oz>rf8XLamX7|#mtQx2ZR+}s)2`c86Zw=fq7KBaIjbflag=J2lu->a1tJsS z$>UG23J_NnjIqMH@8CZ4h!BB{YZ;7K---sMqR9?Q{ALAGVMm$y5J+bGUc11VKywaOB|MV2b1D$Q%_AF_;=qPcmMVL!h9tRf=mc3DC_2ywUZ*P zl+W2A2q__Bk5d_S*8q6(_|vO;UX0Z~(Ua#UvH#F0gy6J|C~^xR<^+(49VUflYkwC_ zcMzo`C>doG47b(9wWaX2tKs$+3%x@leR*uLgr9?S^}Z!7mu!H&Wfk9>4rRu!Rsdx> zh9XvnB{#vCVM5CkFio*C2#EmcLpEk1E0-CqrOwXM2+$iAR$!f8c$x3c3Lz*>JC3~Z8BZhq0XA`d0416u3u^ne9g`8Y7Un3`|?Iu zCiV=q)1#dwqecO@sv;G`K{5r>1(X!JL}6T`6j>9lHv-HbYA~u0(J}~@5r2V@D0@mW z&E0`2S5z)DH)lHw_%Rz=1?JK&dEGuT`0As5WV< zhJbcZ#yO?*i9(OmrmVED_KrdM!w5zK3;|e%fMt?WM@6@N6!Cj6!R|7+dWE@uU4^8K zF1euz%5ULD@j&Ah|LBD$FYWrwixbs9TwYqN1%aRZ?bH#UwYMN`r+;Cl=v(@LFegfB z-0Bvqrm-dd@l_5@*943)AP*hdhcGMv!i{Pjajhm|yOoythr zb6c2MYFxb782C#szpL5TQy3|jVVPvhh?cfy10`nV9_=mxUIa?RR=HwVP%=mcAQ`hI zCkhXxISAb|V7$xa4u3&_VJIdvO#wr!v=pWdgtaN=+BLwdcMnO4Kz4~`d3Si#xPRtr zbBF)*tLLpxOe`C`Tsjz>h&K^a3eC$Vy5ypdISpOorKij|dlwjS zO~42MXU|UJz=1IcYJsHyIKD&1pb}BYz?slBxg#ZaI*z~?S%0QSDi<>&2z=BUjoPIp z@vUhddCe{l?d&O-y|%%5NKctrwTG@Ofv}-K={Eo&h=koeeAQGvNRKG=h@?+RCG}Rh z{h_l7=%?oa=Wgn-fS}m$tE1-mVX|RbO{_p`K4A&ZWrs`VnR#| zKua(z0hopgE;>(Dn>s4}s7!H{xqeNRpd@$Zg#g1am~#DaOZ!{r`GHGcojvd$zHx#6 z#pUaBFSl9^B+hLVue{H?6sDy`&D)IQzGy-x@}p}_Do{EV57H5LH8fpwFe*S^!oGd? zt1wk6mw!2eYLQFbwc?0GBquBZAtxx*2A5Mml2|ARg8;Q!t#xI=KXt|1{w*&*5|oOC z;etaYgF{n=uH8V%K-g3{rMnCu1jrzx>5=;9Q#944hq3oOBvp$e!xVri z7?uH;B5Hf=_R8ANSJ(nK=M)pxXMmutgRo5{6@MVR#9?7qaMgNX=C2kGKk@X1(r=!* zvh<}&Ww{XszUJ0V(SSR51|zzyBGT23$@RvRmfT{q;mA~qn+Cj{y*T;jkFV)DUem|B z9{D-+_bsZ;Zw9CC%u$z4oJXd%I_ahx5jzP)Ov=O%OwrmcPK|;hAXt`-a!)VzZR>gO zyMMP=K5>8H@}vF1)K;T8YqMVk!Y<)!qOJ+R%z>OaRe?Ef<_-RL&k3-b5h6$sZs_IKuQNEPMlct8{WD+KK$ViK}v#UMelO# zOG$tbsvConi#`%en8AV|;&Uw+#3GIGStOv0MIs>t4AVkSPp^God+|e$Y^(m0`+xFN zM|#7ltwwXkWWP$0hh}$BGC^G=MNqB}V84p zMKF@q3>Gi66_H*|1l)4rS9>1Fta3r$1-nZOcM0s()Z)=p9q9~5g~4PM5ax!$1!H9C zbba^a3p3@0U515WI+)_s~h+S zmn!&Lxris9d}hrtv96)hv17+@}X+4E`O^Z;M>0tx&e?S zIA{W173?mv0-%307EHrYtH?4p6fPONmQOcEE`M*j=kpV@ttTqg%3|PqX*#GqOsHW6|-6V9e3C5rC$(VG;BE0%4ex39nNz8(1wy>n>cAMejyJJ=gu z8@grq+73+9R$z2`iR=={%%R(o*EjsoE@Zyr=j6=ccD;b_1b908Gk*ipQ(>oH2e+1) zg9Z?K-2m8)36pSi(HL2Jy}9$s3o|{RKR?|%QK?qv+Ci8q@A}+f3a}^$)oxf?14$Gq zNUdB!QVj?vJsnaaBm*a&II*r+*bt(^2ma;E#_aN+9P2gA$Ttk!fc@@%EZYxCB?6b8u5 z19kyql?hf6s(#t#Sa&C3?OH!p1fNvpA?bttI@ql;{5m*nsT)@|1nmw$BEWE%oDw`^ zz`J3LEWF;>b>^kn;-8GqG@q$fE6d$MNL_?h9gpeXUU5J;1ApE4z9b=8c{B+rSG~{l zo&{t4_~=L9kI)c+G!#3k?H(W^7zSxI$jpY1C{=80u}i`)N|$+2te0`>eoh3_vQaAc zn0tqN-t+Lb*55vypZbYmy0$at%@xU;H#lhFmY{^jJ|qA#Kt>L*iXbabF!O+!2MJ3_ zkWA|j$o7yrNq?vq-~jA5fuITY8-U+n4qMRF=vx6WDo>aoGY_`PvgK@RUJG{Ic&$40 z*RS3ve&OnT{p;0g#lK?^X23=rB2;E>pY_+NqACeMKq6oZB*KoRrJG=k9zXfm2O$Zt zLV6O!iroUvvuMvkHvSVAfIG0JTX#!+|3>#$S0W(i99Kf&@K*@||D{=Rjvz_@6 zDrS>DIP?|M`AtUH0*7wIhT%$~=gI&S0%TZ#QQ#mqrYPW!5ki(bpshc|U|_(VEo|?@2HMz{ie#4ALPO>>`jx zB<4hIPDW~QrJ_HPsA?3I3yHa7ZnFCer;Jf_{3T%+u$?^m`}+I$4BGEL++X|n!NTm1 z4x2Z&=YzSj87$fC)qv2Cfq8r2B+fEQw3>h-pnpP`5jY*dv?%$SFrr#oJDbwVxZub< z2~r)S3>2$LpE>k^z*8a%hYF0+Pdi}RkMmaG160LdSRkv&fz=x{%%R4#zh&-RW83#m z->{EQ&b!Yx>Ww+iZ6OSUF7L$6g&8ns{Hpk7cLvFt)PxtGlxh6m`&3Hm9VN-B@z6OH!{Vw_8J|T|X;7;<89CSHwV1VRY}H z@#x|H>c{sM7athL^tODsP%^wF6G1~UCQF@t=(f*uW@$sJux9$)$p8r>>&_1SXE;$$ z<2;XLsKAy{SG91oi%_%@6gs{h_vZ==uz!jiTD@V@7;H?-ZF3hJ{b$cEl}=om51(DE zHqJJi4FqlF37rL3@@1p;o`6UtZ$Ba(c*F{LG6G?|x|^f~39=#`1TCtAkgx#50o!Hv zMaiq8uR71eOP8AcXU;7ZzH)g{etT}Y`Ks4yBJh1kmKq3kkJ5J6{hLMCEAyaUTTQxc zI2vfzenzlr_W6O`FvgFMe1GI8;kp93oRX#WH3F1TU$dnRZMm#=M{Yx#cBiFV zsn7No@)oyj3L64JOPL|bU?t|< zP?~D;kzsu07}*V@Hv`#90clpIp=i}$yvB_sN2Nvy8NHu(vh!jSjJNSPcI+dd+!#O?AOeoo zI;XWrk%&8*WkOVFOvh;A@vWP@{AA;7XH#)UC`$suuwXlRlnS|WZ`nDpvsWD5nXkTM zd!hNZE#}f-A1(G5saX`>f`2L4H3UloVG{_w2%8+MwQKR-a9b>%-o%6jm<31(DPe}8 z-5)fl++39X%QIfz;&jt_`C7B|!nI|7d9m6&Q>`~ELEwSIP)*ircQ(>{N8?VJnI*HiI)Cq%uFiTrFV9rv>4kZ#aN$J-%&!XP%>JDf*BSZavj58G=%gGgQOwAh9DLMCL-3i$HyZH%+b^kGcki$ zGRcrBlq_UOMkwvR&_lti`bM)BI?Wmvo0YJ9eZJ1)6;Di7Jp1x&Exc5#x2`hF`5*}3 zc`jrafSKEJKY!NR)3Rsp*14cIrjwK?7&i@CwaFZ2*3$8;K*wN6A@J0fPTX_X^gTam z_t;~{Q0)oeESoUMh+3Z1-VZgzEHdlrk~~t}?2J%mAEw@D&@M&X5|pXFo|Z+Ut|Dbm zDUi?SkaO(3DQJKo`y9vYA1vp$lpOBQ!RyNzUY{d^UVn>%l0mXyK;{I&CX%*@_I$Ad zo+m+`WZ{Mo4Nn@imb5Caw3b?IEj4^|VWHNVZ#3Nn$+RdL3!WD=nyn^es1$3KVUmBP zl-6ab5mGCZv@u(cDpsVztRT~cHCg|8y?U?wJAshY{%lH1F_x5g{P;8X^tJq!7<>K5 zPkk6+D1Xt%E!2@$@0$=2fJ9W~prl^Oss%$UFr#f+9Jd9o_6zcM+&A=|AU(5c-%(Eh_rNvZ~=KP%}aN;ARtIc3DVsy-7Vc6pTBR-n!jge zojH5<*=J8%DkLx!QVpUdC7>~Z0Fs4@f;{m0zmeZsk^}(Kd`j{%IzEfXt#>&H_s3||@W&5|_`HaIHr;HHw3EntNnB@kpLkpH9; zCo@d#`f2UBK&ggL|Lb(rPH=&5EcEjI@a08D`jOb(I;#xOh)gd;_+y|o1@O%(Kz$*+*a@##9EZn_bJNC;m_&?i@?^XWoaBL4k_$p8QyL~pW=FVZ&+pwJLMCozHU{4bEGY%ev)XS;`|n+f3P zExfWV(v&o^f@i3TFiPwgZ4mBY1O}P3Ru2${qPfk0-1*;_=xW7`m{cKQHuAhSOaCx2 z7rWRuBEEW^Z#oG`adATZeT<9Na8t3F^)>t!j9pRENS5y=R3sTP(2f+9QN4iA)Lwum zeNm9cP710rgAZ!%z_!Fr%E6zswH|Qm17)uRSL->IAVBGFg&%OX>*sSfiEJLrFaPn- ziBWWl93$4s(M;Y_)kxKdotY6wC6eLoPv%HAl}*G;U*)+n6!J=50U^8|NW+`1M-TjPTaU!phN&dDrRJp44u8#q^iviN{ zjJ+Bz_0oxbzD|cdh2gquOUqG+>KVJM_>Q{|De5mf4Gz4jBE3mutAb-n?|B$o8pnLy z_nH8?`}w|NaZk%8FCX2b!%HwDR;-9a`652qw9Ne@80k`6*3KqRz)$xPj_THm;_yv* z?=UviHCx;K`;X1f&%vQ9kJ#98)}slr5DGjB7zf~_#DT)`o&(N_tDeSl`^#=IhKV7g z(peC($(J3>XJkYeGG*JFu#i*|+S3toOzYTuJ|hH63oBJ#8bcsnQ5i&_*E39A{<3nx zMrjzZeXz@MG9m~vXadSP_2x#-ZD|NwWM6Hu)K&hh^kpDMZ=V|?i(JAiPQ{q3Fikq%?_1@Pe1B|Z;cNn*Or$S!5;!hk;+SkoZRZldT1}d z-kKRB87D+5!`N^*vBsyVjRp|H08X$-a~3j16fc-x!BT`ta|m1@$Z1g{>$;MBv|#0Q zj$?GV@t4{jKtBjm`rBw@`L7AqW9$_^c>hh}WwOOH!`KIG5R-|B1=rlXUX!Av9%mzOO0eJ7 zbM3J?Jt#rtLJ$lv7$wYjP?3{)rb?)GkwC5%AhxV3>KT<0aSGq=2cJZ@CGdL4~Ch|n`O!ABtG0H^- z{r$}F$RJy9IamAnFa(C&-t^xtZO9pgwddG3^5z~9HW)j=I#_PD)7$H^;?*ngf#}N< zF|jTfAVk)0G2o!ZiieYCR?Hv|r6JV?qSOg)l)7~FGqs$LufcjT9*&%JsY$hSRXJqT z0XaKNdyL_^@DBB_4x-}J@wmE1*%WN6PnX2u&b}`(ak0nBhjao{nXm)A133Fc7aT`r zTcx(G)^Ykzt2PHd(^*w54^ikaKcSTY(4z{@S;z*9=N(X!x#gM?0XBy2I}t2Zn!N0M5#uIihSeJVtx-c2i%$(89r}Jmr{7GRIqOc%2HK$6B-&TPN*B~G<5`N z9Dl*7Y&L=_S2Kw#KqygAzhqYr5x#Jbo*oAEz|*ovt`{N@5!!NQPGL1QXdVjlyJ@xw zP{MGIKmwhnu2YWX%ais6==JQem^TGaDWsIK0IiI%5UGHsfZ=qhliug_i!0uj&9lV@ zeJ&7iT=Wzg!QgcB>|D(fiBjydPBq9)W%z+os$=NsHSV%J&hbXfZg&VV9*?k+7tPtt#8J zeZA!b(b3lye+ELU@b10iSO(v_1QEtD119C*(BEfUyD@LJsG zcNh>It>eVjCWqvY`DTXBY*yZX`EJcG7koh*^9Xh9*QIF6`Q(#4J0nN!?SO zCLKv1os3|J#2h)%9>8&PwCHgUF`Mqr0;$mwR7e=c3Yi-Q*bAG2G6+Wv7otDGNrbNM zw7!lespLYxoh`c%DoD2AwQ&GQY#l_VDp`$v`PXdHI10@5CUY?n{Kv1tz1TOo({SFqz*~Y<33Vd?XA$ueOSL&^7 zrxVLv?7w)jQw}T&p#OC;^64i>=o`dl5~oEuoU7`s{OHF;1vvWp;M3DYS`g9lMOhFB z^5hVXRBUIbVCp5@rqs`^{@e!VJ@;Kq`I@h*ssreU<^+Fu3pfpWz0=P$_T)o*AprI{ zC)OcB_mbEi<7QjE<~Fy}gw7hGea!W%>~D$#DE|=!oRiLe{7w1W`=rSe@L3P^ zOZdcM(Wh#`*O%b2OKYPCQorYo8sbitFy7%3_w9B9+in+L%ebGW*}4{Q>T*-+dgtD- zXS6^A8iMkofq}nGOCn7z9*7-(+ul~1e;et$y2YFNjA>UJ#>|pP1R?5VWkd1FmynTR z=Eu5TZFRh=yqWrq4Z68{&LA)iMNmUgXj#0R5=E#5u5NEF$8#k>Vk+QP(v`~shx4;1 zqK$QpM{L3*p<-%w)DZoUQcdHnP_E(Q-Io7NqvKJOJGX5SM_cUC$3MDLwc58#t2br( zxlSV1T!0NxNtWPGJ!N(PuYE#uZLX0xW-5v!&*AfFg9K5$pA-e35#C zbcjZl;SGvmsZTbjYRfWQ9nigy6Bv)|_0%g0$PQ2i?jVdux?odCWu6hy!EW?SY9fr$tHO8eLdu0Yh0G(Ve$W2 z4LA?RAk|i$jh9|{6%xN(XQ|~5IkaDq!Ag9q*2`TpQx&teU=hqL$PA_??}`NSr|GB2 zsv@yX^i80{^Wl$&3Q8f;Fd9~1gT{y3>dl-pxIZUw_*ml*E1ixHocNuYRJ8dDB+`HL zNZ^Uw9AM|EE%eZ1{E-MPe;O^BmGpNxzI_$rN0Q?(wZnBhzZT38%gZ^lDLLT60R}vD zMMS-(sIe7(Cw!T$q)}Olh-&TRV&-D_i8N7(Zx?gu7v>zDx*~e_SHGS{ed#Mg0`65O zn1sPHLC{g}F@igS3b3VB$tTN48(WPT67cjqj2UP2p>+;bNj0CRGOf&l0|#liD3)&K zI4_QgqNW@29D4uh=5Zd=PW? zt4^YiLJk{;6~rq?7oERj`Oj`&S0oiXIydx6|1x&ARQ2pkHtwtyrjxWi#vqmofPBUg zrzuQH2sn1-v5RLAU80X~6|3LQO|Ye8T5k8W-EndH??{Q%ZPb7_e`8xSP~ryBK3Sce zA>pg~UX+dc-1q8xtqOE}!FIIB78Z>f$>_D_oa3^NcaN{*pd>k&-Pb?o%spZBXp7XmU8LqT5HaY?2g=4D9G2!9 zA?Tk~hu_>)1Xp~N)5^`u3hw=vOlK^{e!pBVmFHf&YhE-m>(8-dGSVRf(na)qyT3m? zAI{pXJiHi+gw?`zeDgbbrxQWiG(W<_TicVsz^6}Z_@8g;%}X3M#`9>e99Xr6od@ys z9CqQE_-L>(4gr?hzi++zT%ynlJ;u4eqsMjITSViW|0Z5CH3Y0rWBvS$ufzcB7>X)e z1gPV*9tT<+W-CtoZp(*=+on@h+m^lpyzud2;a$UAqt1u()?QkZ``MGEIT=wS>^ysT zi45s%&oSY|l6CG^F)nO}APSDtAm+4OD>~DYHtD@Kxsuggt3Fl%&QkW;#i$0Ort;Bp zvA;DrpZEEsom#%zlOha}ZhrHy`tCVe+kuWPxw_>wr5~6!^0ZUqtdDlEr00Qd#!0#fB3^Ih+A&TfMa_(7s4@N z$KXY*bI0TlQ?HmGj0^7Oc)Co(ruppg`pb8Ct3iN}{Ya$W3Ey6wTYbrEg7%#fX*6C3 z`6M~w)VBverrA?ZZ)YkJvdV-p_@QV;LduLl%EVcx{r+Z$SIBpNIdEDkLn2Ja)OUNPUSEFj0TkJ0(*yBjqYa}EvVZA8#*-kM1I%$5uP z7jgSpPou=U9)|Pg~o{3x*eeJ&O+KeC)5#{#W7iI%MW;DGgu2VM27S|(%tY*Ct zB9q~h$g8x#GsN}bPNJ8)%SjL4JRvDk1s*};Y`KXUXS(ll$jv)y)rfOA7=PT^4o^*Q z_ng@R;LWfjBw?)pD?%ha9o^{q-L`ht{mgXM9u|zM?NSm@u#`u`#lRhevqR0_tQT5s z-d1n9G%W=Mc4;)mOo5wB-;*y%m;rY#q z#lG7#Y{?qeQAP^#{s-!-&*`H^)h~-3Jn2@zSLq614pbb-hgV$hB{s>)!mj?CmF2qg zN1wK4z<3+O+RducHX#M2+=pnW9cp@9#V+y^><7{WhDt65)z5zPDye-WmcL^H=j$F? zx9YK8{?;PzZr|te8g53oTl~8Jejy?cpSc7*vi|*F#Y%_@nx`8?)faX{65oL9{SJLt z|A*V@@t!lS3gjF8BA^w>BEzM1ID2i`?e(VmFzRFNG;rE_Nm(e}Cr$TJe)tWaA>e-= zCP+;FK5R$`Req>fHu-mc;0li2P#>L}f2{rLNu`z#a{J}d`CkDBAN^6D zkIo!R-q9Kn2raG4zuVJ0y}Kk|Gli2W2P>$J|Nhi^)>J%idz#+3yh+{rgCU(BrOy(0 zK}z168u_IInTM~2`-xFK@q>q-q*45mKF@b|kPm)6{L~+i zOXd495!!=o8HC!xCF#E>;Gm}iUXg4glFfVXSiSFitNUzY@cjC4Eyv8bH}1yP2Zjkr zWeDHenpF}N_;LO>+k@j@LO2!PT8>IaABVZ1;j;3}`JPoe1qZWKwve8MabH&Vzq8GT zv~diW+CR)C7fGixcLgk_@Nf{RZs|3+9u}&822=nMv$cuS_>#X=W3BtQiu16>{t8IE z4Oei<6xtFwJ+3Ig`ADW5x=w(14Q_?Y1`W^}oPJ+tnu+~o+WJuL@{hOxI)ENRDhg4& zi+6ljNp5B+QUp05?-_y~vs7TIuemXMILGl}^5x3B!w+V5N|?5CAO!z%eHb1u@A2Uo zdu1a0!>msH{q&a4cnwi(OmQ00A82g(G|4|=gdl%q%u|Lqd!M&j7jS(6eoACTU=11K zCQ#}_$T2ii%fbb2CH#p;-lDJ|80A~I@pJ^?Ftj(^tP_<}mIC~#X}H4ZoM9lE)aEb(l5{oRL|I46F+x@x(Ov9`oV_0#|ELw>nB$0vb(XVoqU& zeNb#W&;8Xb6g~9{mwiX6z&#f~Le`|?ZhKneEE(|GLq4Um*jEAJZ0TiBCE0IQ``21K z*R(253=#37{W?pRR|cCM_1Y1{A75%j+D|59E+-uQ>a;da9DJ?Cy-%gl``>ZFNY}|Z z@uV#+sIRc!GE`3>!z%c1xO__U4iQZmHIXzCG*PZZc~SUt-@!Zj-chDARtMTapW*tYFW5!SpKYmINZ`y4(G32eS1+vFoOX zJm1PBRPP&oYkr2}p0iz>KPomz7tQPHmT(t#AUAw*FM!~c+5BmB!=aTBoi-8yjV4l# zTzCqC<8QvCq7BSH&Ex0u8LXyb1t$?eB8j+u|7_u2@%B*9#3CX(V;{ESnvcBimXZw8 zvpHdNHxcRT6G*8NF}!u$mtni+lYi5(l&6~@pO$K?I}|TiUhr7NEj5AeW5u$#*={DZqj+-O9D|SqLwdTS1PVrMaZNx_Lsh8G{;^5H-ycRh%=5 z?!O4|c`>cJc3@J{bIYIK$P{@jvl#Iz)p}L-;%9JL_p;8C#9Y5XSE?9P}O$9N{!xn#gE2KN6~{~<|(%`fmFu?XD5Rq z#E7q*wtA1>_WJcJU*+sHMUIZoSs1hg!M&W$QB+QtWJLP7t69tjNkA;-oTd4&tA#rB z^B-put@bJO{|4waka_`fITsc>6b*21&=+0Rd(nu=zGGDCsS)T|=aHs^NylDDb zaG5+Kirpaf`7XE-JNM547h{;%g9gX;2)eh+eg+T6vH*O|R_M$*-c#$DHJ8a%L>UhteuKbjSdB|Fn-YgoV~HcN%{ z2~cJIxB?oI!1O_P3_ARrT3_&3$R#^m&-Y>Ym%~TI(bzE@%({uAJM@(qJjkidMdW&t34pl<_1%{~XO4J@m#eKaz_w5ZNgk;K)ivrda!1z2%8q)JPxa(6 zFEi?Vv+||qti9C}7~6fR$u z(-jTg!Qryo_v28Izs(cL6dxVt75?zvxk7Jtst9SFVeERhAB>Zv=+l>r`3DV-GvMv7 zode!wQb8hg-1FdL;$e(zva_MZq#4@*2ml#oU4Vn(_Cyrm3SV_8U*WEgc5C@e@OHf+ zfJTmq+fj%dPEX)Lxuo;i*4`nWi}jG=gz zVUsqQTnR{{Cu-F9U~=GC!Ut<4VKI||QH*oHd((RT3-V5cW4Vyu*gQYDtO|p((BK*L zThpZ|K9(r#TOqEWS~LGO!9fRXHlW0G(LD%5j;VZ|vQHXmuk?u4W9xPih5SL}=I@b; zaP4?q`jp38g#R8L471G29p|Zk9QCc?l#IoEJ@~`5XMExn^w93rX*VN<+qAv_Qc0}# z?S+%w*_u-1Q8;G5H>AfsyV(<12G#x+7Ppr;Sn}}4cN7lBhytZOtkb<%ZI(gJxUm0< z2I=_X2K<6E))B00Y@>le-gw-_Ppb9IW{V^#RfgZ9AVC_pF?>yzH z1leMLwW;s36iP`1NS~Bo3a%KuMfq<-yrCh?Mv`*VLANL&c%3R_ke-?iZ_{~DJ%%!F ztr_PrR^WVE0)IZBI_wzv&AeY7ZUk*13)QV7nUd7JZoB8$`PFCkMJrOUNxL5ri-jA< zP2)bn9m$KFmNC#`C49p!UubCO6H{O>*@_HW+7#-%Ur|`xO-w;@_Lsc1OOQ9@2Necw ztYae5H!X1~|An!L#>P3<*RZMH-z*60Hm=xk{mhqys2^h%$ye%iaY4k z1h2iE&>#o)#NVbX`uGv#S8__CsvrJaTWL7W{?IahGte?&>z9lNidmBNpgaw(?)JVW zGI6u2e^J8rl~RLcU(7M3-Sa=Nfn9I#3d6m=F_C`@Ky!UdtrYnAI>;AU4&Ui%J!#|8 zy4;5DOi#g}Rk)KwKgI1*_tSF2w-7=VeDQ1S&jkyTU$AK0X~=$gIN|=g6VVX$L7tL{ zabt$dg_+!+0CkygQS;ikdnIHiHbmepx^U7M1BysAW077)Uk(S2<;W z4X2q(7{0{c!d&uhqsTIBw|1l?!Ytea0BXRFwaDaGfG%m{?d|%*pHIsRrZP0Ni)G>C z$ch4DnMHqbx<lr*c=b;k=f1stX?>UK$Y?S z#N2kx2Hw(u8|Fp4N!gS5iTANppEoy@uz4NWk}(e)x|0mju>}-x=IzH%5Au}mtny(F zqngPZUvTc!^sm=%UQCu-z6HhT>#i$$PC06=|Cq^>9y2GZ_-3en>(s$Z5epakhR_HEzTF=E7ePYi|>oD+;T^q>2N+4ITmy7h5i z{0kKLv^$M%!_Fd>ceu9S97(49L8fKbvuMGOylvNf1h5uCX`!ddizOrtiB4|9NPWk9 zX_5fFTm=PiDVq3VA$ehc(^oS5hEUWIaqdYzRsX`VkItqQRHOi(y&ElED}wniWva_$cj#aPL4n|rGiPpDm#v@(0_vSBh%Qta$)(#OsUpjX5+p-iw(UA7hn(S)tvYgEE;d)L42klYB*Sg z0fq8^1<53v%oCl>*<5%2p_MK!Ri^PF(`9-=Dv>J%jheF~LU6v%Z8h7%sMxA#Qilg; znzx_02XM!R5un5`I6iCp-sF|o-i1(08rXgaGS0h-JfE*6kgkr+!rCz+vj1M6|8Uui z+|PX=CA#Wi?n`47;?CMy`3E#EpnOKeA>iLn&rXeD@&PKYMhc$mZFaRgyR{kfK6H&ia)dH;?P$|Jk08d%*}E zJ=!!BT798qFdliv%oUnK+^r0vU-r{hw;<>lA|1BUO1ZG4Uv+NM8fT{k)-%CHrQ<40 zu_46^YU7o`1mSU}23ZDI)po#E!1^0T@^G@u5Kwe=>}d1luZ?Rj_kM}MH%>Nrp!4rY zN8Mf$RC%J5<^j3l2Q_h^0pqsKns- zGc==UI?Tk9)k91KVF{UvjTIIuDgQ;k!5 zXnpotvAdDGaDp_j^}_8P^vNss2XqG(HA}GGF;F|~u=y>P_JGqt)Lg6_oIytY8X0U6 zwB7BGog)a?*Lq>d&c-3&&Cx2UQ21h5zsu_mra|LRehzd_Reo(%{wceyjqV7{U{}{) zIbef2iH3=bU-ax0{*f~ZRiMqQCq{j0-Xum#J5zVep}ve~lKB;MiH9J*N6Gp10}TSb zz=2-$$s5P$AkY?Ki)+tv2VsE>`a$6vpC=nM&(1faxDE$7;*tu*|EdjGDJpqRJ!n4S z%mw(zJU`hFs*K`Rd+TyThIWZACIfqWHEqcE`PHQ_+h4c3ZM}YyK0Y~r5W-$+ugI-o zwKdm>_H!|S>4{;MVIzsn>AS@z;tMt;qx*Lg_WFm*flN;RYI!~zOnY;0LbvKMxLzFn z`%W)rZFHadywOSp#P(KtCQyibWxnvg3wma1D*1A)pYyK%ZwCl<%aZ5+u-%e~LeU(V4lC=!dfy|%LC zpjUswv5|;R3Z{r67-6YhU+HMXn#z}e^>Z7_!0~t+)Qwhu#(elvwV#)LV~*an)xJRD zd}ZMqELw;4ijrSO5Oz+aLcH8Br~iT+)6oAFY-I0aviX&9{W;8Kt^TU8j@z;2X9RR7 z!vj~z%I7gDVQ^#%s`9F+7zw>MoDDL}uQ zfPaPop#&%o7t`&TWU%ZLN+F-1XXy>Y>??gq`o(u__0ZtGI*5Ev3gX>!BUVmL?_(y5AHNCO&pP=P`1`G+HP;ZB5>`^7Bf9l5vp>Hpkcbu@LV$73IY_1nug3#%P; zBzOn02I?d&O}13~9jK1_2ktWP8OuSUl(YLZ{0N(Y%1!E^;BO3H*_APO#G)vE!s&D7eMGJlGFQ^*TZpv4_%)r|QDk;!3NA5|%fDmzDte0k5uiaR^Fl4`X~KNHAWRLIBEzC?#zhXj@+nKbj|4 z33eAICLl=#Xs+}i);?5#iLy*oRHx)U1qBNNdZJsTj}WTgpU$CGqr?P>{Jl`KPb~3Q z+4-nsKQOS@TDGH4FK7Gd_DZVX$`%-mu!&)2-YLTd6L|xKeOGMk99q=#k;;(Da>W8! zB*YOuA>^+4l3||pIk>R(z+EKr!YHIUP%z;}rJgG8m|}7<;bARc=2uN4^f5CdDK=kN z)&udz+S7`HCg;1oqq=(Se{Z*uZ|=>yTr2z*uYn0%DzS#v)&;?22cI`bUX30O5F1lp zb8Gv&tcLTSMFDx+r$tz1KSc4*RP#Z@@uGS@)=wmN+Btv&rHmwzi)*{#m7ftnSzJTc z+}#nQ_27f;t|x%cmQ*&4En}rt^gI1n2!&lhkcg>zD(a#BXn(_60MeSD>#^bcR<*ci zp_}onk2)6uVkyW9yFn9CQ5_dr`4hx?ucWc{Y^(-?;4WUZg`>}5Qi2B`JRVx;)XV{u z7&VNW_`JXVP%4W=OcGL!REk#0nvYeQQv&n)j*y%q`v(lu3BNTlA#GX2$;2~~pM7}N z@LjXNt`x%>D3`?W`c6~5KcjJjXx&OM{g2HYhzV`1y)?#I$heq~W$>cjjkT6fDsjxX zt0ju74u8#yH&swHYob4DAS8mN6r0(hreB5b?NNWX7VF+!8goRFTs4&_>BA*^&z^Ge z$26Qw4gj~`q|{&Ac#l1XoCzfAqT=J(1DR;6AR|0k}do#a@Cb z1m}uC%h$KHwbk%>RMfk8%`M8G@f&9KPw}h7!EmRMB%wBImL8}C;?u*|HxsrtcdmQX zg@*3H%m;6pbe@k`))GxRH^l19<_qDGis5{CUD9?(vR%!7KR__B{yeVJ*{?5a8LFSgV zNT0!hZ3Wrm7$u6+eDqkUzq9Bc%Mbv%0utk)Tr`(MT8SL-n5b%BU7lY0Q@qJq=P+U~hVM&hOY^$w z^ocL+wAed}DfIF$Pvyt=oj;+S7)2TXPP=dVzOQPf9q#q1Y6Uh29%5Z_vE_J$Y;M{P zUAn}E(Hf)t8LIyy^~C>zGW4CE5r|eQ1>x+aQL=nYw1_tDZ5lVC$*64uTMcR}^Q>v# zcG)H&z*`w-k!)@L5vrT}o#V~wfPU;|G#)vjvA-m*BdH5WFr}<&N1jtj{G`0-ij$HG zyW`(5-3@Jjn5q9||98$%%I9<0f3;J9;Vv#|jb}hm`_mcg)9&rV`3!}MYxj4`5s<52 z@wx2tvvn1Owe?HVg1ppI#(FDz*?QB#SE;ALu}+Din0OL6ZWJ>DGl4aX3+k&UkMX>V zuj=KNIYsQj#PNgWbj*(IC|+9Eua_D|ruHe3&nbG)tyiRNMQX;Bz% ziB%DHK*)n5Pv9ugAPk-+_xpBgU)8n3!I5~*n3%BDl{2hC7+j~2^T#w03d)4`eCyq-BL)a;duc9LD!9v%Z-;w`vv+W zgv^=&KH-ciT^}sP%fz3u!J_!jy#A-1UUx52^FeHB*ZE1l(RxdFDaf;9v^VX>QOM9R z+drC>SE>(e0aoF_P$8V8BGuithBp>DAdF=}&`}z4F8;hk6VIZ}49Od8O#d6_=Y1^q z+FY+gLW7hD)xaemjF9xmi{=oyl5SrzaP$|@7>cNaq!RJzVAlT!mU@mEnLWH`mA^{~ zpR;@(g5HU}o;w+|RYxc79-An>1#k9TZw!tiD;gV#t&t|y6+WXLy8#ofYai*_pSOyu z>a*~>LofqLVB7?%FngNdtm)s-fAsBhE(HLX9cR|V)Do4DMa_plI?Byd#CR0B4|j?Y zQ>*eHRHbVLL1XCo} zU#EIH&q~?^7G8haOb;VtQAt>7e+O|oQ1V$xwAz8Ir&(faf|m-Q+WXX`;$yoYF}NDa z${iouf%49j@{I#~v%O{O+Hvb!J9OLFpkAnz4u(3-6BI=5T(EoaD6Vbh2J*k9wgSnK zZ|Rj1m!4Ul&ai-FHja+j#a*hlo6Ep)l<0VJJbr06gN}3> zxH(ykDu0{{;iktRKnXB6i*<*2Q&H3e#>^Q@fNsru_V*aJ7@b2=sPCYou&(O=&{2aH zTIjf>K){R)hzx~83(ZdEbLhnOrv-j8_l1GmhuS! z6C;!k;|m-y3WB()YzqPa(^SMGi0l>5R!qPI{n_tS`MWn(!(*Seu!&k1?Nu@G$?xR}3G@~($J@9Mqp}Hso8yIWiQhNoD`5ik7q7O`>(s+5a=-MxMjkI<{yu3^ zev{N!Ksg{6BVz!y!wSLzzzyj$bTmMTnJ7w|jf(VVU|dKA9YB`neR${ce6;A)9Sjfl zM++j@$FIYRa3Na+WRg0rP^DkiMBhPmAbkYqWHG${*+F_2-}>VGQ=ky=ZYnko!|U_o z;pbJ4VrP#Sy0=4eqXl-AAl3!*QqwTcE6eH zly@rfi)uY$66qiDa!1*8gLIz2v#eh)&l2zYyLljW{4*~Okkm9hF> zpF`L4-4$>4(`8=Npv4*-ieIuQxYO^rk?StugK8l#PE23~BSnj)=N@jNjONXg!C4tl zTEG6SPinz!4n6NkvL&yldJ+ji3UI?Y>wl{&Q}_F`X-Br+iy^$(?MbV_KND(8HryW0 zC+j9dSpEru{l!_$R?JEZX#Oaqceq;$EkZ&4jtP4o7|q)0H$X;{UVXPL<0=TO_aaN< z^)nNqr&}%CVRT}D;Z&r}?|X`=Ut4e+|F>=i!ApKVBuEY?HYyu76EyRF726Sx6Age> zfB5BnOLr`@do5L^-lYWNu|EI+xv#fg$@HglOI7$JLoL&1ZOA4Uh<43NOdB3v`{tYU* z`JFd`{E$-AQaawN7Kl&4A-YYy^;ns*+jwQG!CE^~VIU(8V^BfE@(7<0svOUDtGpvg_)?0r4MlgYZ)x<83~AY_BZ<0L$&n}5YjAP4xFZ8g`K{}4)wU1SjZn1p~PK();t zrK3SR(aM-%SMnnQ<-3gaPgexuito!LUw#I7HiEw`AHCS3%Gv(bAP!8iIIS& z53Eyq(34yc&K&#CmlRIg6^Q^ZTsX7PIhgnE{Q08a8)C?G_N$+P{BVW;Ov8Kme(HA~ z#t}@E4oL{Z9_RuFXmIG@%0n_~#RhmaWXE%uHu8u8pri8RV|Bo@ku*{qhRFK@jAXbu z7|68#_Rj2gzNH*py?5-72cPqUL$UIqulltTyMXMmJphNu*m^Y9BQr~1%ZOTKMs{>a z+ddBrX#cWOe@jJLIPeX1Rql`6MYkAEgM0V)+b{YyF2z~kg@%;D+3sYZr2>GlN7@Dn z3JwaRrbN~Woghe-y`UX0KO27oG*cTif*Y*VmpC8OAPN{WMU)sAx=2>MpO7wd^aP&G zz`c&uyAuir{VR@x?g@(`bJZLpOPymyYJnIwb8VLDlmxq+zyf*TW1~=DZMjrd?{ikc z&(iYI|D^E}ez9aW4JME)7aW-1Z%{zD-j(XrPr*?#JBi*&owi)2=u48_(>u+*1A#Y; zA_!)%j`*}N)ad_8d0Y<8HW(kY3B62`mlqbuH6-szMnw|ec@PCgV6wxpPfxH_$C*); znLw}mcJ9B7FHbeP4HxD)XXr1rjWjY|kX2C|q^7|n^i_AU)mzYz4cQH&xrvt;%M(1c zG^Cl6hCk8DOzXKfUc5`Ho%{`+g71D&#=_p4GJ$xoIxJo6?m1*a15LOe5ey9ETpz)w zrog3urwgVn)4R`Jkrr^)Aqm_Sn8*EXSRzXzTDd|sI1u4W}aY%X1cEYyl-TK{bF z|HRrs`>$0@-WWs3pZr8UYw@NP4zp1JweOB*MxyYPspWV0tjkPg?x;m-r6TO6Vn}rk zD|?72smVNg&7Y616Jn^Gmnz2{EW5Yp8Bt;b$>BZ83*tR=Cal=fiquy}*#^-0|0fg? z%fBNg0RH&}Nhy&OLK8u)%t>}Zn$#NULfLA#d}L{=K}tmlIA334_N?2LH$Oj|9xl19 z1@+mm`TzcI*PAF(uSlwAjFL>0=*BSf;$7^&_~rJm64lrkzpA?>z9y2_fwYH#JvsJk z?(zgSlTiUOU9ZEtRm#?lEvLM#%Y*qdl0dSK^TC6UW&{&HCjI&#`~5&{Mtu-e>?zH7YrXf#ww@`xv(w<){BO_0ENfGrrK zEIcw9bnpur)lkWHXzjv$6FY?a*~elSpF4;sgVe6bgTLoOS&=P)m1YhF!B6^1y42_H zCqwJbbvY5|7su=KEa!@&-*)e9*3bkMM)v%6nc!&W;8K~AzzU!Tv5R&xF&jO1UtI}h ztT^2N%^6EVeQ_PBV)ai?BM2cy*#`8ce@n6vl z{GoPL1xUjA6HYe;fVzJ_5Q~St(hVFo{opd;&yXj^2LcmTxA{)r4n?oZ9th*7c;J>Q zRTpS(>M%@zmUU>N^;2VC{v3?8ijx!0wfe1m|B$*;YvJEr--;~6-mR}s|DynJO0;D> zh*$x=_Ts1dy5Nb9gnDU<*s;+W6FWwxJDhkXX+rX!SmOHF^`XGyKWsPc?Ty~A#Np+^ zc3&6izpEvBP5qJ4kxS!byim~9syu*qNXyqT$;~H*fqQu?-&|gY_l6q9#L=t=fsRXP&l}a9qz%srB;Q-stSmX7Z7EJ&H<`$4bKh zG$d+8q6MxBLONu(5@@RU8A;(4-Khy6$w0DVDnc?!%EcZ!5SeHZ$n%j$MkgX|luM6D zf8Os;i|58>(QISUa<1v5Pnm6w#R&V)d|0+P_yz5<%-Co=QI8^J*Q{1paGq5cTaDmd zoSIdAXU)5hc5K&n<(AUOR$0>FR@%}@(%PD7iN#o@SOqjcvC2})A9MnJx#(K8sJb#U znm-4WL0sWT8pN?g72>)161hW6>QEBtI0EBgiU2`(@LM><>PIm&01t3`;ge1Oj{wyj ztQ&wPkg`X=&2Ti4Z?j_&Mhi*v--YMjK>Y@2G5w-*bkq$wuI? zt?Ce1ES5CBrK0p9Zzas8?Gd9v;`i}5!2O9R7bS)%7Ui={$i6hGU93Di4Q&FT>Mlbp z&8UL~&>|7QN5hkl&_s85-QVd15BNuetAk?bE1G=hkJGB~y6S1xF~|PQ8t7VYwnY^T*yyWc?ZLj*|kDOu|4unQx5&XhuP?I1A13r&q z)Ft{ytA2Woqnsl8(()IN!U_xwsWNc^l_HUG&ouu@HrKNqu>x77|01uJ zYd@U-IQ2*WNBm!Yw)Ce70N<#8USO$JgHDhnT+j#(Si39g|p&!PXy2uJ9HQp;7> z@chLO4sPJx1X~F=O1TJ^D#jLed^qun+rDRhkMmV%pV>mui*i8Z;XEOWK!z9) ya`~3hR3Oj|0VsgXkdiPDKDTw7ei>Qs)Bg{G0j*CNPhi>U^kna5XecyHd zfH`aCtUY`0Gvl8OX-kGwf#^8M=8CdXz{~$mZfkL3q7OPV2m|D$B(yvhj#@qAUfKA) zx)yG)Z*I58UP6JybzlN3Ypuc^7M>iHGYX}05mt)dq`nDM8~u#Ps>v+WQm|}h)qBJE zA%0sxL;8$a9bazAgA2ayVb2gM9BrEi77 zIlCak!e-dGNH_=@4P?BeEpd3X;_~Pmk@(_oE`q>XOuZq1z}R!257I#wD;A|=;`7%L za9R;~hz~tmD6L#ym!*azL1elDcfJhb1M+llP>~BVZC99>g*gzQ(y9@hsA>Qv(9zO@ znkJ<-$YcR)xgn(S6o*4`I$$|yf&oxVkGo#})7#D1wO$gFCki0*@GRPKDK^E#4`cNf z?E5pJfHrA6+Hsl_bPhsz;{10%(km6FiIa`UUpf_D@Zu=oZA+<7IR-#cfxS0g9^4-k z60J_Zq$LUBSij1C_4-Yq)SY3-fOq(0VUNfD_Mg)^0-W_C661Eulj>$d)q_sQrNAfe zwvPLitE2tDc_|ap)~?p{BZ9kfk;AOCAYMizv@fWtN09hqvViUcWu%l=ezond{3r$# zLbD2JzEs{GJOMERnGh{moLG(+lXX%T-Z&Q@KHQ5Pwr*%CCDnk6Z4F1Hgp31|QS@kt zZ$BU9jYWCi9QPK)ibl11-#kS_Q}-KQ;wv}HbyoWVV}*f90w-4)e0tP^G{JNb&552W z3^kW$GTt?aHcq7z-w94>E8}^Q%M(VcY)mgsnrq4tWYB4fsdh>$J@EcCdq8OrYE7%5 zK-QzBhE5xt^dHNWxXgdvG>BUa99szz3I8jl&n5-V=5~t7!@q3zoZ+lS@*8`j;D~zR z(P%xNr101}3q3uEtb7T@f9x{vi>)xy6s~T=U`%$` zzpA09I*5t;Kzol)@gDm$*#xXQM^~&#UXo(gagd3Wm8l)9#$!ExG0)$OY~56h@%3{x zH#PNW3F(uQsnbY!0|yCB2{aVN3I2x8L8tMj6MPO@HRRLiIn>U72p8#?cs%7JuIB@5 z*$>BkCO#(*4JVxsw#Wi5yz#^n(08&f^mL>afxWKDxM7gj^!OaTD|EjHYdkKtSx6j> z3>JSi`uGf?ziO*k5~z85JtM6oOErni;3+p)snu8}Hlp|Ozzsx-4X`d$T-%H(vofM1 zIQvQ0|9CLw9#c7YwvyMCjVOy8T6?cH1SbwB?m&irFGLOsDM9xCo|2BMe=d5Vfn3R& zNbk{!QQ7j?^c;xL(TcMKc`vDm8Sic#gUlm4PR16%#l`(PEshnCqh~n>9PN!u6!0ICs|>Dn?qG$ zpoQDo>#CRk&CFtt=R@7y19n&mSa3doPr?n=O@dEO znWK)r&SysigmMgcpD-dSg5`kISgSikg)@@0F-(STBvWtA13!EMKb<9x3C=oTgOrp^ z^s3d(_rzjI^l9f{hw(<1z=Typ|0eM=1Qo4{ROwwuVFuGzlmG+FROMbO{VZgU!f^7y%EePwow7Ftj9S1vw z#@~NHo#UQgPUg>2LOncKRP->MA_6rBwYGP_Z###Xb%=jd$z;uu$5}{D8>iEgOC{*) zn_tHH%7WBaR+3yhHEwXN2)sj$FM!$Lf z5!At5YxQyJK=V{ac4GVx1XMnreEf;1xn?S~B*!R&7lp_6#dA(qQv(5Y(riQEQ7R{i z529xI>H{m=RQx0xwW#+|lg;Ywf1S%p_IwE+BnWU{16m9pXr@JGG~S{?tyT_aF3Rx1 zQ4HX?^@N?5p@+9mT`H1J#*{GMHkmYjyfGh78qT1rwe)4VuJn0I+534k{p>_6Jlvv! z>RYg|+FpQL1w*7F>VmvsHUaD0^a{$xPquHxsNRztBR|ssef8r7P`d8FW4Qo6o$XSkn z_BCvpo_EWarv!S^iX)S+N@=`&Jy?VTFE==Wr*$&KuE*x>y)H;g~jT~kN|`NpjH z$NlkM#K%YR@XEx+;-P8XKw?_a)R}9}H@JEn%_Gb8H$tIiBdJ~F{Ua6z8eATf=T%l9 zHOvbWV2>wOO~gbl+8jTX_#sMo1eNFQ*Z$LYb~EYy{J7e-yJ{D86OC7fKuW;LZkws` zK||TNeAwp4&46$b;g5|ZkGt*QIt*f7lB%ocay5)FN;2tcL7P!h>77&o7ik_H?pl0X zqKOZ$8e9}l#M(YTIDRJeTi?|KMeyI#($|b58Tdu(?dnf5B&uc6@49Bh6ze>sc8+FX zz9_k4wcl4fmQSe{YkKt2+4D{ORE62kyni>}3x(=qYHKGHSxM;!*B~Qx@FC}8ExAm! zW+>|55LSq}mYhgssRhNU!Fu8pVbb_A3IVK$gwlJ<(}AtcH^yGT+Wud>paXyPX|^5L$x zM<)B8*1O0%--`}&CawKuD@=dISsPt@E{s(Flm~JMNy3@R> zCPJwxY=>!0Q*&0T=r;)N{~bd4&29qvZWe4ho6Kfb;jVlSb{v*4&3tt3q6?_{sEPCS zWW{|SFg-*xpg~h7ti?^!BWy;E+AlM;X4ozJR29)ud1>gjdH!N{xDL8*pYpU19!xOp zI_U4dTR1O`uHgO8l?VTs7qI2AtpYlQ$GQz!)QXveHHsx7Rc=6xM0lLkZ@vzBkJJb< ztMYe~_qu?j7V1f4L{-d?9KKzQ2CSTG&#UpF&!9rT_I_&N{;7bD(dSgcHkEjcc8`o+ zqKc>G-z_<=kLKOaAXRRM+5=xUGI(^ihH=v((Rq{Ub`^p?Se6O<+&EBxt-D!Zb>YcX z<(tw_p&bP$7O;XpIi;4W$iZZ{tUOizNu>9`Vm>Do-+**^^-PIED4N(Z$8dCVVnH}U zjWyOsUrb&U5~8kRj7ZyUD=iD?=^NkKo{jtCI`{J3eYf?H^xKvgn&l}E z7NP_y19H3)uP!RyrtjNv+7|!Q~&wZQz96q-|o*z zpXJ2znNxRZHobQ8O1~tv7YP8`?~NLF^W+OO2gl1|I`R>WG6C1Bm~Wkm1L<16sTq+b zpY^KOzwfAG7lpQ}%A;l@CkjhW)D)|OxJU%o!&7{jB*5>_t%1(f9Rr!tJGAd~Oh5mf z(p8Bt%6hrlw13rZ^(o=j(u`~A{1DUHVI$|m)}bZKV<~@zaMq0983UktW7Mg=&if{Q zRu+P%u7NGt){-E{2-nV%WAu>r**iE-r;rsDRuhq-6+pl=hM?kf2GT6d)i&yYI-d`E zj|CCTRDgzuw&tqOPw(jEm3C<@2z%r8%&nz&%arsPF0}7ZR4;{{{`9y%3r*j@XEXWu z=F>diTQZ>>sxuqLgE0bNz=cTgo$olzU3M|scQ#Wz`7IuaP@s{Tv4kaGt{%fA+UEn( z26lZ<%@;-!6-+1n77*9;ba8L^y-k+@wvXl3)-mntQ`uuSdp_p zS=ukhlPRcO#vXZMKs^E&}Vv*+NxAT>3eNrOb;GICFa4J1qj^cw7<|{3$eWDv ziQO60&pJ6rODW-}sby+1$T*IiorV3`9)ujNrxC=42ur>v+I`^#wF8-YpLXzhk~15* za|fGN4pW{AMoykCHpWp70bKR8&%MO*a zVccD0W;B41rxwL4{+p!gLb@(bq3^v|KC_blDym_eR2pcd<%@dy#?Yn8shj-I!&Cgq z->dKmVu`d=$bfhuJeg*Yts(d~cNFY!`r2nP{JZEzX4T8BeN$bO~V%<;4LP$w|9f zx@3UQg5+!&-47_Pt|uAa1j<0cwD5xOc8HtNiI3jhQhj>DfA!vk;?}^IO*N1G-ua>! z2W>}Y@+_Wr1w1bCX$(7tk~L75qV|`Lgoi(v?aw@e`Up~>f!|+Oos&nr7gvR6URivy z=e6x_rk=OEl|B{^qzd6#Lf^(>EOuUt>PK@;t59N9nL-V|D$8kEu{l(aZmLFor zWxYNmo=1C+BpEJ#WEx}bbM&9A=P2_((Q(|hz%t7nK_?YOnI&kW&AF=}QwscCa_M)V z@N0V<7TdiAQ_!Fb`B*ea@5&30Tku~BsmK2#61sD?t?~z-Ce3<2AB*WYcr3N#1u#(U zroPSFfo}fNLt-;eO6p{S4C7sy!OBbPT|P~*yD!GH`FEmCdWxsv{ph0O8Gk?7H_|%i zvHkjJzRt!Ef6aUK0btlaOr~P zp_lo-tW}kF$zKr<^5@WU15HbmXehJDP}^GmZr}ZYH@EvS9(%5_>rzh8%A$l|Q`sN^ z(w!0D%l2|FN^;brsl7qud_w8mjvR=FYXY?GIj(VtQiv9xcv?I#MO3eMQ3iaki6*5M zm}7SgU~5Y-ElD=e^gTH+X=uFVgHyqpfUgK8xJ(IAQM`eh7OKL7jM+Y}$H49L;t9lw zSEdlR6E~hUE*W4pc3V~+a_nAw2_~m|bq;RjN9P@97gyFcj`yIz=kUPO$rL7%QDq-$ z>W^ltXMF)=zO~bz@^}~&xwvkn8ytu`iEr?6XGkw%UE6N94u)n~QKr#y6Qxk#_+deq z+;FI|$Md(wdBC8(jVPtEoih9%n%i(j(z!@SmPzUM)~Y>6H#7RV-G!elBcZXnf)m6y zx*3O~g*RguXR1%tAFsR_U+dqt7UPWmcP{2o)q}U)Gu^8MQDhUqG#~W`pH#*2ur9ns~Xr zS3cA(Ptu}M18M%TPdV<_d&6DRzsMj?H;DD!hC#TJxxwnJ?8v&f`CBC3*dm`dQCNWJ z?Qc+=WrNIV&@ZoIiI5EnKQ|u^_8&C&y<8JiJ*(yM+>`H%7T)_oZq{GU>H_ zuir%XJ(v4@7ieVf@mlqh-=E*WlIlk6YO42ed-GA1l`oPJLnsytI*;*iMovrtsY%O! z?-1sHM#F|2AX?hHX93CW>~~w=k9&ujQIpSe)dXYFq-fYp|KYOZ=`XoCX2SWd; zyev*dag0q01UuY7xyc5hw#LW10=pP*Im>?V;LUQZV&H@Pn(B%u_wGR!?3tu9bOO>) zUXNJ*$(rwUu-}4YtP6|p{ihh5pCa=?RHbO)cFMMglZf>L-y&cNs4yn~FbNmV$>BD1 zIAgX4E>cQ|(qF;Q7%3_45JJZlr`~*qkyifQ_g^|D@ke|1NQS6x6Zvt*=9LfGg+4Wc z`P_Fm<*nbw_1_}?1fAMi{cC;eNVa%*OAFTj2KT~wPso55(%o0XX)M&4o0usT4tdLe>7}CzT#Fj@32vjAdQeAB%hPqd zr|)$hTcnz!HKY8T!CP(X$Km481JVl6diTWK_4)=?%ECuH@gfdA5{Q$3vfa-fqM$$u zp2rZ6mqMULumYm2z0QC1t7=2^cJO3wQjr2X1p%%N1s}JwH6yzZJRO1Gtft1)NEZJh z!Ueb=_l0D4ho45KcQ?R;M(x*2vj%DE-;(gVDRN>=g!$tBAl2Jh#Hj|7GqHh)u#yjd zqL*bW&b3*?nDCjP9N5mO@!0USi$&v1gpL9n5YZKRh+@jjDS=jeqUKvlN=o5_<3Q;5 zz~J6Yo3ta(%~Y|6$O7A6JEQT-+o%R_wc5-rmm3=qqo>E#8~{h(cQN!$4T0K4m>+$G zU2_PDgU=9*^}7RgwB9uhVzPs#XyWElNjXi*CwjHA?PpA>mQJ0I{P;1PvhV5NG}YEu zRg4S##)sh%p{4vn@i4@f#m56L4@jy!du&hIKjYa&S0dPSMBfai0!i5ZRe6~H;WxepjT}G-^Z>NuwlM0K9RdhY*#bVI!!TMedC@uP zsCrOMT^+Vht$F*q#sk(qD?Ro!v`?X=l3e zm@Z_4!e>x7@x%E~@UeLCPQ!9li&rBFe!ToE%m|1;$clyxZuaA>g#^+q>u@s~(vmgi znMI2Jypi$VB5jV>z%CdPLd;ZB2Q-O&y-lpg9*KPT2O_g8Qv`w+T~rxD)|eReGvY@c zqE?T?HwNO#eDPKzxa91vh=A|xIRy*iAs&&rBoczz^k>~va~O;u2iz$F-~!gRVhr*Z zuL}Zk-Pnxu_6B2aLZr!nL#uatWQv+bc}VZ|7+zlR=u?g)Q;d= z=ZW&QU!r&*dk+yn0-+b0+{|KWLeGL)gv)4AVQ?>b7_4#p?)6|vaoZghsRD@G%7pSR@xRPO9@znHM#ki+dP-oD z$lCH8L;pz6>9#v%*W{2t@m8lfP_N^EIIm>WcNL0qX!C&x>gglJ0NDb>Y|A7-k~^UvpJx*wj{`e>ZoIe+lQA*&|jH3Pu$rHo(9@AN-d z8%S9)a#&l7_wskM@5-v7mYx^`@2r)IL;)-F)#+e*V!=clB7mT+UDFHDh2g!YbJ`33 zwnx{I5n6PbYZb)LbWWJ%IjR3;w#a|`+!!vd(^0hc*pC#ty84^CI>V$<=YNS=6vXh9 zE=+S$9Al_JroSDo6`4q?0K^ki>z1%UR$>dpKxLE;XsTS(Fb}?27>`B>X5j_x`o}mu zEmOgBMaH}34Mp?z@mTll4w9!jPw@Hh4_mt166~r=M8|F8Q`bf};uQufq1%@-@mJ@1 z9xJ`5EL{HFhucb3YcEsVF9`@dHmAH&>f{nJRZNJJVZ3Sl7DWX@D*DaM=Xi%;-nD9R zrFE+s33Y#nn9p{kV2XDZ{j;OK5AvC+6ua(qzY6c!{5rYlf=O?2sGSWFu{^ZpY94yr zSmWB+wK`Q)O-e3jI$@cQ4KP;^x>g4|rse)dF{S-@J}^vozGC`Xz+aD*oKCz3(=y1K zOp^^g^|#D6OZvVfd@b>*V9pOTbzP}@b~rP!w{)V<4=btX_W4>8@fW3Z&a)vT=P0Mc zL*)IDz(>n$w$ZI94{uqb8xu{L^aI+D0Y4;W{uU>=mZ-fkN#pG+jVY8zkF25Zpd&>l z(-^1iYF>Iz$hMmIvC|7G8NMcc1#HZnK8#Td6wAcQe%23o>OZ_aTj4qa1$h0bLha_< z%ZQPsr8M6j`;g18t{Sy^^qpOPWnHi&Yt$SHCett_?Gdq(9VDCn5|$c-cPPrLirA{o z&LM=RSvFx@=)@Hb_myQlop{DeO1QhZ6S*mX2w(V#Z4A8b@6d|C;Ne&#JDZI`TdHkz zUH^;@xg{G8U5fq;8)`PM;Wt zQMZLM^=S5(40My7UdJ2=-q5gbnR!A63Xfk))D@GnH2B-4TxHg1D4%MjN?d%%GSPLF z;Mj`vCtta<#7((Bdp=%R+F8!t?T++I_v|pNtrbCt<(;42Um!#Pr<2*0ia$nwL=9U= zE5_(}>N#;-1V`CcE=0IFrqf>)^^B4ub0LT==(L|QdQM99{z$ycy_rHCc;oF$U~7gB z0RMl8AYr69y8WEdmxjhm*WRnc?7#$4flB{ooKmcEwzET*V0BTn!L-TiE!6Q>klPUc zl7}=IzoB~H2uPuz+e+I>@Z!pUFv8Q1OH0z?zvvY)z-?rT=@b!jhx#=9fjdWeI|=Dl z)8(zYF_UN!3h8TgilC$-G^W)I8nL0fj9FWGg>J1UrGO z8lFayliP0;wF}3X*Kh*3a9$z}4#V2tQ3hT@P9sg+pAXA(aq&i`yLT}P57?Ar_HnyL ze?Cn+w9^GqFh(iFkbSszXUnCI*G^aN+FLw3L8|VlHSXQ1C{#E~ z%Q}I_OOku_e6!rcX)<6q9o;JMe(;>0m{{V9Cg@`w#?TWFUJfSR8aWT4l?OGd-xCp4 zLs2~e|EChuAtE9H{Bqt5dJnoQMyy><4E-rqkov}`-tMWV6am+WT{cvnrmhTwO2{9eMzgH z3UaAIYKBTPC|njgy_7LtJl!nR*I8UgEI=scv%D^fGsmk56;W?+A)<7*K)Hor|u|EP+QfAN)S&=TyvvQ!t^Q4_JGG>Li zAFkT{b@+Nz#0pwW8Riqst!s!d69TFbWTlqA4A%BPBC#HaIlGpKzV{%UbNLm~e)AwS zE;cEdekVSsm3NLOZYd%0J2BFxlrvo!QvyL$c)Y{SeiLK!q!}871W8`B2&%3$rbK$( zC7?%x6pxe<6Tt0-{+%f}Fs_aXMu53OC==s1uRF`3gI*2)#no66dmj#LvUPG!OIb|LiKS`pYqJ!%S=&V+rP zO+Ln_l8qIPe@n7c;8XhooeaI#lLkzsyWwz^c933Bq6;yxXKaC6c-of?^GnbLx5P>? zN!JqpeU|Lc!15ArdI8+>QvmFWxJq=qouynfo}K zBi0J8%&Uvs^u_D>2`dar9NqqMfd2eUb!AcDM@f^MC@JR;0P;1MbJx3zrXg~AcAO|Q zJdQtZq{hjf-qY3DwVdmg@Lp+Xk1-M#+2|FES5-mRmWn?qcDbC434?3v>lw+Ltyzr3 zpN+>n1rC0kCI&|9ou6JB>~`7e>Oc+2!Un|+5emL`77KZP$POyeP22E0fuPYDzVkA7 z%}38g$}KXbvNprur^m2c`0cQW94L#9W3e-}#%~F5^T|v~w3}0pplaAfAvYdq4(A8r zv9hCm`{|;)cbdhIGXj!2+ZVm6|EwSM{>ja7Q1&S7kC;d+dFrQf|KMc>sZIc&rp!U37FOhhh#Ci7Xi*e0WKW19R~zYhr>WjxSG}C`v(mc0ka3;b#v|0E~l~jXjv0QH6pfjJ7++&v6HWGb0n? zU1<;jUR}14CB7e--gNh~;(1%~MmaJ7!{Un2qRw@}>$b|g8%9a~X{WtBaW+vW<5f4o zzPuNILoC=a1qud)hvcYZwbb)>yJgHux+Z?U46wpPqIXU>e35a2$YV9nbU!@Ucf-g5 z@*r~bui^^g=f*1?4qzJ_p-;e~Ft=cz(;)J91T4zzP) z%RzAM-LKR-ed^4HBgCz&&bGIldXT;&OFpO9LTjbWc^FLW=}__JIhWTP-W-p^RHdhZ zRPTB25AjcV>MO--J^c*oTj3}b<(YNPmW2yl{U|bHLxS}3W(R$LP`;d$Vw~J?%qtdQ z;kp4>!Lo{yU+r}2|Bc$IilFAu#Nu~(-zkCO7;1@@hgU}P*F3(D9Vh*ZzF-rLcP(6NOLUkgW)Odd)BQ5V&Y z5fLNZNl!D$s+sSnYi>4`F9BLmTsuS>8T*i|k?f~U3p#?vy-M!K z#U6TqUUfaKIHzBpc`aIJRgIaN83F87Qe)0T%QLh4y>evo5)+~Le%AJJZ_8Eu`wZD8 zxs8yq?+XwjGxmy8ulZNdSR3hk;rFg=7hRer2L3yq_Vc5O-B4T|__@LoI7H4nHfhVP zuY7jqADs0@iTHS~t%=l%@1ML0}^U%V>{X*5(7^$+1ASQ?WFy{P%S6_*nqe_pI+3 z=O&iwbvbfwx|khYpJswi0-WS;znb2M4Pz~q_BYInErgEz}kWyLSY(8}Bfaz~#N};b|%HltFKp9g792^NU|J`iC zK&Z#lOg*6w#8aNEgE$vCh}{1^$5;PRz1+fu8diDFnWO@>;4B}t7w))fRXpo|*^)?# zoDigN_=h<^7Ij$FutleZIN1ZYw@p3gw`>iw`zSmPu0Qb1q9b&i#lOC$D$Q<2r&VW7 z>el4>QXmKZ;)1h?db^!r`CMwBj8MEwNzgIocSKBIWj0;x2KRg?FHQVfd^O08F z9*u7lzueHMYC&LfMLHH6ny76G_!eo+4q@pF;jhQZ${+{h)R>aKH-KBYK$l?;wTj`z z{@g$~7n}gz2Z_cgL9pAQG0kEJtcvmKXr|X&Q*@9kUk5b>A; zs@V$*5SJhP_}x*a$K_ykTiNC&^1KW_;1atN?@+!;ggY+RVV6%!vi;eL3;pPPnYeL? z3SmtN`UD!7ap~$ol9L1Fbv*pA3xD$S2zy=3&vf*o^o{*+4w4~MEXsT+RdWE~KIM~| zzFs;vU%OP}C{s9Jn<0oBb>5HBSMFweKC|#&vnYH#$$r{fZt&+F>JOoS2q46hZB9(6 zAI?`z7#+K>Fy(}Q#40O8Z?!z9iT1SHuuqmcItH26QeG`Y>GO1lHs9lod_fkki{Hq3 zUZ9dwAcFmbJ0nFY{u{vC;3oan?IJJOlI;q2mPP$2i!`3Emwk}t-`K*^+5XbG?@qu! zg)8xR0#@%52CCP-kfCiW$T~gA+1l2}y|q;LcdUDLcP5mBbqsJyna527aDsr>FkX63 zNwDesp!D=^)QCqB2=YmY^W>np7}Q9>isM6bE2#9{-5gx38)bPw^)#Ulu?zGxEgAhf zF<@BKQOGMN@_bQT(fjgX5Nke@@P%nXc*uEZXIppaLx;Qw&M#chvA!m4$YuZUhP)XK zTVM7JQP~l;9c&~>pXdF_0k_{-_RQ@c5WLZExn8W#cenbu@+u;-;LT9GC}o5bO_WXr z`Ah9T(>wQ5W)CSG4{Z}}hbxIcrZ`9|d~^9W^8*6(O%)Es+v`cCLOD{0FC74xYE-n- ze3N}f#!|&%5?}BRQ@MrP9^<7lEpyJOe|DnW2~+QF?5icH=Xz)km8=i)4aY@SB`D%d zRH1t|^Mg9m#MayxA2uXROQ+4MaLR&H*6ZlgOrpBfMER%UZ%6)@sOcQ`Lw;{Gwf&>? zsMq(Msz@hR@cAN7x@ z%16bMB5`7xeVV)_5Qd%DoK}zSr5?{W@v*p%3m3vBzMVx|YwO>u0b1j#skvZl6=^&R}C3<>Z6kV&uJhasCpD z>uGg7?6)qye9>8zfEU0*Aef4zBi-$62x;8G_@`-~BGZhQ>b=FhK>lkrvtUxW9T90K zdb;~z2WmaP+ZE&bBHf1?gTb(0$jQlET3CGHC9b0yruXX1Qn!sLZ_TFCKR<51+*+6E zYxKQ&_&QdcoAcr=;LZA5es+EyjR(>8^nLTc2ME|!9bV_H-mORIWL#BCbRmmhN|2&5 zixbcUWW>5(^z7!Gfa%l#kZbcE$276Kuv@@vNcq!ytsK&Awe7z5^=u-)XUG{b^}hWI zixLWa$|GK^SeNwguz6*l;=c7cpB+|^Lk-Af=6h8r41Pn;XF@lNI^gy^8`&6E0$i|In36pl@8E4y9f~ zgMTUN^|0QUIBCD1YEwnSjHkq%mUUL^2!oRgPvZ7|t7!AO(0P0oLPeO4*#^B_Qn`F zfFpViqh<6^-8$=Zq8ct8N82^PdN4KJe=g4udYb~4qND%;KM|`26#|e$y6{3o{V$*h z?1Xq62mp*Q0UB)1<<6*K=}V0vN-*+oCE~f@W#g%+lGn~65Q-voNw7yEKyRBVNrj$y zy)-p8c28@A1b_0ru{b$?nrrYx41WZ9VZ*SYk@pQU4wOPQ_U@~m!N2M2x~bwq?VhU6 zBS1JGkA4gM%rVU=q=6I= z+KFm8dCE6@AxNaIvZPpdbD6)z7O= zg(1|)0JBs+($@wq>*A+6$_ThjDGH5s95DOsOzN;zLm%HKcd>StMH_D%DgYF){N>kq z6Hf{EkQ5((5J&eAc^JNMX=@NfG@bfxY>7FUv;G42F)UBrgs+|XPxQraV0nKwnrU*z zhZ6J$y04*kN-Nn*P>mBKLoXn3c5Gl6^P9$-+dG8ubn)4j>NQP>n#I{w9oTqry<2}G z_yyjRJ8=(PMX9DfWt55z1Z{s`wZR3QpIabRHe;fn7N!w7iaA}vxN8mB#MQhJ`8>C7 z!xvr|H*eY>y1v&E(+`3wU;3;2M=^JL4cK+2RoyO0a8d)OU5K!7i=+r7C6%QgSRFV% zujOcS7xLK%+M6#%|HaLs_iN7;4M4|oeF(nK!-g4h`Vg?PV^59vBwi|aG0?2>n!tt)kWQDv zgcN}|sUNAZ&yhX=`8=c87XXkZF>828USFMee!vjAp?W6}ecO*$y|Q=c2ELbY9OQ3Kv302g_cqPMfvzpvA-&z-91wzKIK8n%c?olNOZP|#wjlEuLCCrx&~Z_Kkjax2 zftNp^tfF%MD_WVX9RrpRj~t>4ARIR(?m_Mdn*Ga&b{hH_C{LCaZoGvYz0b1#`U>UE#&u!^90ZP|d;xmm zzz%0gw|F+oG{!s|lCWD01OS+8^%i^UZ~(D99f-qWPV(1CRTVrW#2DO?eyT92GXMdmw2S7lQ4fgJc8kj zcRmf_&#uy0B=le3=4@8?zxpmH`)`$w7Ps188g51Y4(Ti25$(*I%F%|FlEWVq&A)}) zF8gEMRgZM{DJ(prbzrPRL!B{0;Ok8kMw8$`)?`+hxk!h^8M${wjIgBtwt3@oKV~jf zv`lP$zPvtk!1>dS$9YiNodboHOK!@pl|G?ss&(n&DJlr4H|_M)`trY=7X2;AdDyvS zGA)3HT-asPNHVr?BA8}Mj%dCS){w|PO$f8u-9IoQ1b~i2RblktS%h>R5Jlfo9AX(R zg=ESISHU;Je}|+sXf)K+?%TTj*pdGi=c|fO(-MEFrugm4Vsq0$N_9DhGVTs>;tRx>h~!(&lu>bbFD?jO7cCfMP>af)sOVaQaFS__A)zL7x*W~8m~81 z{qpS_wSjw%>iuam8y3&!PYBF;`?#ck6;N=VPV^*JO@1xVULQD~JRMIo^9$8Gm98%T z#U}-pa`N2$W#QL!V2mSR3bn-#q78YICP?vO-F(sW>9R*c%brB6C;BkQ{Av;jzmJ!z zD;0NGd<#lm$OhOUWJaRfDSVnWC^jJR(-(U=)O7c|)4xlhW-Q2JO`39&Qz4`fPKE0c zl+?8Z3)#N|ifBuP6ON|bGti0Hhu%@iC5m#c6n}p&*kNT1%BXTG>au6DwQVilhflDb`1bY+<&a&7CE-b7ZkYvU+c<7>) z@X5K6whQ^>_;BeEI;C+Vanm7Yo#(S%s>UW>+uhW{J}<31%Qvd3C)wM!W0GZQ)NWy< zNUX0D%aB1!zAlZ4^8qAPEoQW~MohI-AP+Vet`(IDEoI$Frx2(|29gWa9OM`GDHi!r z9GC8nh6w6k?q<3jltSqe5EFa>Uw#2E;F{*joahATAnnl7$n$s?5b$>KPfoh>Wbr;Q zD(8r9g-UDHXPW(vU0RwQAsY470F8<-LZpnnIrz?YscrFO^*O+#_=+C{pRaN_UJj0) z4NiU?x7S61t?9AuJ#%$9kLp|K#V90;l6g(v8Dz=KM5jxqjyMNY0l8>Z5;{?(-Cx~F6L=f zWsteh%rAPewxe?REcP{VIjc3)m#82dl&~0=L5>lp9EcVT(^)lJp!9;EY!1wFeGmt- zid9e-78;(Fj!uUu*Ea5vQur{jX*eB)xupuZ{=*c1MU{u03(1wJp~;mf!OQsrOfy&^ z@VvgF{K#e?s^^&fvBvGV$b4T(RN(BqYs*seA-YNVkZfpL7+^rhL}DdWh%ie7V?%9Y ze#>4RUpGv={M7Nj%+Uz4|kKCZ-*AkX!E_z9z-UY4sgoYdwt^~T3(;q3AF2E{B=(IN@rP9P1leZL3 z8jLt`0`J3~4O6looit+ZxhN{UmO(kxnVp#5^Em-Rhq@y8v+08>F=%_BN%6^X1N4RT zU*Mj+u2_~T(kL))ak7r#EdMu#2>jvaKak_qWll1_1s{~?dHJRXYi@&Dy!M$=>e*a{ zXklDETw(ErZ|GG*X-F{Vmjp@y#9{S!GXB!F+U14q^$@R3IDp<;7uqvG~%jB(W4NWaYo>%0eO<%~s3<`sOyNcNAErhBs&P4JDf1`I8%=&oJdcPZWvVdqU43@!>XBN{?aBo%y?UIPJNT&Q_$vXeS9vo+MhhLS5rT-*zmA zMQN)W>+Y?tP{*Tg`!9qv&%yo#^rS)9IHjS@*)Ba?iT#VsS>uQe_!+y?!=+@$4yhzc zE<`S!Y$snbj&RAIkoGJgO6!zI7&W)mS$S-zMU)>K0PIt=oi`U8tG{|;A$Oo6OQR#c zq|^Oh0J;E0|1i}~t2@Bw6yQ3F%p8gAh0j*=R4OcDz0000$}RHW!=89j-8eT;!UU z?8_b4NhX9`lWPJAlbbMPm&}r|lh{Bo!N!0&Y-4;Mk|kT#VI9_eOO_>BKCyuSfrK1@ z-MwG6x}{dDWgBL8LO}K2_p0izs=uoK|I=U9Ez1%~CS_74Wq(p8oq%cQfkP5=q+enT z^-1)>K1pk6r^MN{J7btkN+d&j?=khaM+Y)SI~5a6(~<&>J4GJa_2o}3k^XCqp`9~q z9RrilZ>+G7GSHnd;Hi{a!+ny!$(-@}?)?W(!x1!B9q8T!=+yr101yG(s5fZ?J)asv zeKYwwA;&!(p@yal}yvdVGjB zw{SX|yq#I!9~sOT{KuNC9sLrew{z@B{aV_37OMP7k$;3@!LN(9;i&58A5o@IZ^rOH z#-!n0MuR)|ouTn}&jjWGj{-Lt!+mG5$IwhT{u>aBW&kn_gXH#De?*%uv#V=hLdNPp z!sO~4kjR}K@wz_PbCt^1RSZ&m*Tj+nR(W6uMCb-*gnt6!Ih@>~@ps*TyjUKS)BJWe7XzI} zMiV{Fp6IJh?vAMncZU>Fr?AN#eHZiG#9!C6Kj%u6?x@6*c?3VPlF}1>uE7~TB(;ZV zsROVlAajJjIVV(VbVZ(mqra=Sx5pfgGSCC(_Q>p^&E`QQbyrvr0-t8hmC`u)+^ z*9-NwU>3<69HES}PKd{9e{`zM(cT4z^?%Bp;g40m=wq5d=WKmj*9=Rj_t%HN9~=*I zG{JFnT>^t#8RLeej&=jaeu$@@hg$-jx9S63lX3UCzS+}poz~wu1-JuxAD1~ptDq~` z=nB6IvdkkS;pwD!IuUU~xkrwCGcI-!jxuZYbZ5TA{J|6XLb2K1Fsfr2f+EY&EDuEIJPFq9if|L_V(8y%LnSA zLx)@gR7q{^xoCR{q?%<6_FRKG$D#jotUe$(#O4%oiqVhxK$^weI-Q*vvix94j;D}~ zYJ1{Xa)u_?TZ4IU*w;1YHoC@=K!1b1{ZDFd^gfiot7c_zXfGT--x2Nm724;5SoIkD zJ%3yhptIT>Ama|zTic2i&d`IVP|xLvY;O`7+mGU5h|C4O`n6eoV%5KSV?s zq9yB_tcgchTkwrqOW*);s1Q}A01XE>nA*E9sWAt%jMFV`ty+KdI+d^E27fqPS|c)U zB-B`lp1@|Ex8pLUCwv zRjix@948Os-tmVzOPf@MdkLb-qtzz=K3*TOap`13?0j^!DG*XP!ZUHlxfbMT7xbel zTYZR5feu8o>sfM-&3N#in17nx5gu8Bi-n zm7{$y-Y=F@DdSViTz!a?t6KeE;Ygf~wM_?+_LdX9MsEzQ%-l4H`UshOo!r74OZq^k zB)oHP#-ab;X@}m!d_r-todu^KD2G#kqijyGInApB9^$;CN_XVy27gEUttbzc8$6_a zkT*s+mKM<^EK{rwqJKc;?YI^ZWF8?(xq*@Gt}^*raC{Xas$D6zpM1GV(&P$Dyj__K z@o^=sFOs;MSlhBnb*^zwe^Qim?t8oY&!}qkmF&>FX@WAnn<|Ut94HQKJB|+DGPNf% zwZiD>5{yd+dW1HbKYs@S2%=WGBA3^i{T~6#8Xch-GF#gf_13^mxJNx)ZwdS!xTDVO zzoOCJ{xfbrudc1mlGmZCY<+66P!{X>rnm zb)^6i%3sy$oqxyed6UvQ#@*4MA;L(h%ILwDT;t%7DXC+Z>`C9Ynjfq zu{a^8cx75B2kA5_Pk3@ki$leeQzMNVp)8ce^_2jK8ihDsZzyeX4h%D%O6&`{)IY7}iuj{BFr(Gi@2x#gqK8Q)_ufc-rkztiYk z8G;B?nJ)3uk7}d$9vJS>mS!srXAc34(@DaETIZTA&5WGp^$~&@gTC+K zc$f>a9TJR5J8l$Zp-i~WPMJ0EI~+CZN3qU$8-E!K(uA8`p$jt17$JT0?cwn-mYx`G zbF+mQk1;-*Q=65H>`;x#J9kHm^9@qp%xh=+(pv;}(@yvle9>m@5!5WiiBFZ=62)>$cFS#usDb?CfUBXB$zAHB>TDuD5t@H+Y zE43k(^Fi_DFrwPvi(a&~*|LGu*>Qv{)wL$?G=o<(Awj_x-4vL z&62Wj#!tC~^LhFPxv_V>%s{ViFj4@`1I3fY+qNjpOU=Q~3pXiR4F#wpLKV8By%%g& znqGmyBQP}M1jxIjX5V#iVnu6;P8i+|}M`GM_P z`;#F3@>rd*3nAhzkmzB~Zv58~r&MaRw_Q@uV2I{P^>n_>KmlAX1d$KsF~l-ZTb1T# zEA`H+5J^_ZEWY0qHky_a8Dgntgh?kc0}KM++`vE$==0tt6k8eG>To}#)=$)}|;_+;9M zvDVe=8K(+B3F?EabA}N1UuQ1O&6c?^?9p}gI?{fW8$;@a3R7W|J$Mxe6JXmZ5uGDp zxc(GbH_;7;Hps31%Qnhe4eO3ge|!$?!&_r?UxVl==h=f|*G{75YJbjlOE%WU?Kt=S zoFu!>L4D5R?30Hm<-C`6hz>c#AfMN@5Kz3F4_Y865u~@g#W@KPYMaP-282MkB+f=e zdNEBOD$QKfFm1G8JR!^xT(Ixi)@+$Cm`6-!Ivs@IIi+g*^n9uQfLMEh%+Ow`bDu6| zQ;;TW?&6%Yk)M9jMSqsAJ^SKia^}Mrht}3=>9uuQYAuYzf?`3Z0Dbf7b*37F`*w^q z0++0l>bxTJq>M?UOLQ%W26Ahl>wHAK z&vI*0)-9%!7Sn?xZMD?wy$t&bh}mLoZ3~&pU#WBcM9iKzf+m72t~rZy-Z&`-r|@Jg0=JJ zp@*4=N~15X7g0{vF9q9ZdPN*k0@^SLkAVa8|4l-wPw#&|rw)VJdjX zdhFhkJpp$Y6C%xPCnaHezxYzJO_}(!L|k5HeO{~WSbtrqra!An0wpLj^)=OM95?#; zMN0G2q`bOP#cz*;)0Z#R6_a^N)wV0(AT@7{P`4Q3{m2+HHm|;=tk&Q@k9iX-)fEZ! ziH)a3_5(6&g4@-$DImiO41uar_D`=S{c5%S*lYY1xz-&LUUVlQ!Wa=@7M|2kO1LN{ z%1ZMT7=NaDb(M-!=W}UlY!+*S%TS z>VNq;H+GP`VvyI*!(que$gG_f*zO>~<7;)K}8ukC+Q~Va5cJAGzFkH+Z`_Nk}u6%E8$&DKu^uJqM zr}^K{s#PWEpI0E$%`Z`zeJ$t>hWm18xSK$u3(>#gc-Hur!W!lnwS^LYucEL8 zBr7XaDRcJr?;ev^qdx7^62)otI_G#{`!kfAgC304NBBTMbrhf%f$-1(--@RM1xwdgMWSIa%nE^RSkoJGixjTE4 z-iE@k1*n&B^*?@`KjQD6pIVkHdFsE{q`XxXrjJS+M&9g&cSv?fb94iT|}6PkQwLxqmCrv3~@(I1)-*;A=6A=lq9E!n@F6sNV&w0h$0K zoTdamgX3=z5{LIGhXbeG2b`Z~p7C(x-DtloO@tvNyBT_>q;o#X=YOF6P3V%M&5F7e z^+x0$qJDW&wBwC~a~_0&d@$Gy&gsK_;g%c)1cX_fHd=rr*-t^X6;NX?J?5wa-beXj zeuUtSIRkxX!*N%pBcBNA&cT@bpyxb35d~4`5y&=RUJZz3f?nKLvW@Jcv<~a^qW&c? z@9#Q(P(BNW&VxhxV1M*x;A7y=aO4U=1H$y8o{fAQM>ZZ|rV%GXHY?3>ayI%9ozJ9M z$5^x#Vg8TBA`b|42dh5}tVewT>aPGRG1d))P=1zweDVzX7Z|Sz#=3y}w2pA!5k#2m z68^WlDaYOWIg{ahkR-bU$6}VZX z?P9E}9C;7cT#NO5fbwg=>sa?9v=O|Fb$tLtA%FfDqsvsjL&m`9RUk$W2=O?|KM_QL z@o>mfz%Dp`n=tG{J_GW0;I=e`nTR$xeCkW-2m@53&uWpecLIdOWgyF?B4f`bL3?%_U^P@xmK37COcX9P}aj?E-ET5Qap)w}i*t zFl3&Fe&k5GO`v}(8_h1_$;MzEog(pAWh9vPb4D^XSz<$PBZjH|3hZY5K6>@klnOD5<7%%EGlZIvXV+j zB(qGh5-iKIuri@EyG}1V?2o#OQqap@MW5fyGq=yo&dl!Kz39y?{Fs^N&u^Z4e&6~1 zeJ;+o@j~mo2AYCtLnj$CP4j2kY5NK4N&(C_%zx=l28_9zac;!-d7OD-Zl>yMtN1Dv zr&@*EU&3cwWRqQJ4;wYAQ4PbUR%w`=9RS8zjllmvAhRnGjGN5Mc0Yr*vyMy!Fzx}& z!}^8*W4pb)Yk}5w8*4br^^O4WR?J$o@uNKrV-K=gjX=Z~_>qktADF6A!HkPOn$-Oa z?tg#ax?1aRFL{75(g9OQ1`Gn<&AVOQWYWH$Ih&Irsu*74ZHb1-6^8~GaTwo$QUQZdv+6nuLGF_%O4l&7*MBxi zDH;ZV>?-LRreIFt`ADG2#Gk62Q!?g?xhzGZH8$syPy(*rJdEvZVeF15(Ae+^v>&Lo z=@IjGgXIC&T@XY`mgfVdYnVtV-vLPbm@{9k2mi#`2T)uEm~3KFuNXM&0LJ#5-iHU7 zxHHzX$%pwW$5c##8JDjK!s$tT$$#H+U8f2BMxJ{a(-{}GE3Nbuv?@+JFixVh_u%`2 zrY%|-f25=$A8~Z+0RMb=p5Qt+;uKnJ(s}64Q1UL$jD$6e2EK-JGVi z^n@C7a;)P7!oF7Z!2@C2?xr*z5x^{m`WQDu2Q_UUM#J``zl(KT&iq3XW`7S>!*qDj zMc%weGY12jCUAfQ$Cu|72(Mp{s8p2H$GCYqSTx6ZBx6MQ-QfhAW==dG#@wX!dw?kq z0LH8jFa`5ODFPU^Q4&dkWqeB@sOltIh}T=t zerTlDwgG`l)T8l8b)2_DAAjiwxVc}+oYU}_qX3kRbG`%f$hga(?<7Yvgo2*&E&@J= zz^;fZMrz~6c>>8BTO;EpGWS$T%Y%f&adRfm|3I(CW{UI1NcxUTRHX52<@pHIFks3t zfMJ8ivT297_DBLO&ff?C#C=u?@F_1*#wM#VBG5}zUz^H_yqr`5(0|&NGWSpB+#5Cz z&J3uZ@h?`bC0afxIu_u(z}Q^m?;4ZyGRy9sxVlqyJ%dY4&y2cXNZ&bVYtF9zn>4Uor833u^Y>??8nqt(Mc?e} zJhPEEPqXRINNorZboezQ<9XVC<^CYrV0vuwuV7v&wI?q}gMaDq9bt1RJU&O8^zgjc zFFhE)(XHYBr2Q2{G(C=XaF!>P`~a=Me`#(Un-_R(&LtQdfs`7 z=lh{W^0meQXbtUuF;9fCnDI>!VXmb8j8uT>Tg&s!USwuFD*)V1&vz=io4Afp0LexR zj@++;&U(Iu?SDKZc^1|O4|fIkyAX=2O5+4T|4Lnl;NQbUrEZd1jC{kUXEs3w>O0hdus^ZMMiM}amc^S=#j<&S`k`Bw~ z(V7;;CGzmf7LEarF8YOp*W_CB8UT%1mEEl&oPR3NmGWjyZC1}Z;&MUd8fz;nZI`A! zqmF5EHq{9oYKl9MrpzN(T)UBZCTdaEK{5lTxk|OnNvS zoY1R;*2X~OmMZ>@0-|%nv_y7I=1ATM)F#L^Iwg3PC07*qoM6N<$f;s%9V*mgE delta 7484 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 r+8tbVz5{T?GL50MB69)2VJ%YU|g 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 YUn45>$rOW+4Y=?3W(q~jf)f~>`w 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 S#tQ69gs3QJ$d}1lg#155tN{T4 diff --git a/beatsmusic/content/contents/code/beatsmusic-wide.png b/beatsmusic/content/contents/code/beatsmusic-wide.png index ee117951a259eea6cfb79cd81435797269bbaa01..6eef92873f64cd439bd14b73dca8e9a5abbbf1db 100644 GIT binary patch literal 14615 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 literal 14630 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 diff --git a/beatsmusic/content/contents/code/beatsmusic.png b/beatsmusic/content/contents/code/beatsmusic.png index 13f34b9aed1d610a8d484d063beecf9f21d796b1..10e66555de9213599cb4b4a0cafc3a67ba9c5145 100644 GIT binary patch literal 22484 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 delta 3355 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 SUq?Iu0000bAOJ~3 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 P00000NkvXXu0mjf{I2B= diff --git a/dilandau/content/contents/images/icon.png b/dilandau/content/contents/images/icon.png index 8cbb5addf061b6aeab771a4a050743229b44a49c..5d1411cb121ec1a16a0523120f94d62569de0fdb 100644 GIT binary patch delta 4168 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 SUq?Iu0000bAOJ~3 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 P00000NkvXXu0mjf{I2B= diff --git a/gmusic/content/contents/code/play-logo.png b/gmusic/content/contents/code/play-logo.png index 93b7de54b1fc3e2e0a2c0ff9b84209d1c8005453..0d97016a555df2ec5c27e035df8b95afc3a38c53 100644 GIT binary patch literal 4261 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 Hu0mjf`#CGE literal 4272 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

F4-_pEthqcTt!E(`22)%Na$=JG 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 literal 5817 zcmV;q7DnlbP)Jm$=-J+o)dTHp7-=bV|n*Iw(t z_nO(SnftN<7i$JKkito8FkYXV3S-uMHolM2@0T@Um3}`dJhkSN@5_bzh5r?n3Xcl^ zC%70fKqa{J&H%g(3OftC2s;X|5jeJm5K2}^@iO6F;dbGU1PC0L9vSceNJrQ!m27um zy0DwDldy>plPs1ozY=a(gWL4^g5c7D0S|!I?f=% zxbzVN>&e%53YQDaymV_UbwAI{(zk@Ef=i7V7?f|P3y%qPZ`4`+yH(tLP}op#sR;v9 z|>%VV{njp{rOQ?H;s-k}k zl)ovkkIE$g1BXbbFJi?X{Ombmi-n630}Ql&C{*#P*v~f4QJwjwyPQEVQ~B@r#$Vas zzf*PRYX=#EfW7y#1Rm(<=c{NPe1Beb_)#HBiSZ#1o}0Z;*f&bX+8f2r(uV}bDLkGC zo)efe2b?FM0Ru*W(8wD?eT))bzUFg%eKOq(HWM}%*uq`KuEk}t`#l1@L?f{U0JqCa zgxEJ>-6b1u6nNr_+x*?aBSNw<>t`_Gx#QOg@by>1bb$rI*o9}9-!A+yc0pNY8*edNN*>sdZ_oGTO zM#g?XxK5y}6&tT~2agf@Ug&~-MTn__mdl>A1-ch?kU=@|X@PEAOgv-D7lpo+(egZ| z`Td2mho_;cIKWKXh~A`x-w=3XL@dGZZP~Jp&{skuyH+T>5}2Z!EijPmCmAbeKPx;T zlwAju&xLSZp)Z6fy`KwZ63-4&x;a}4{VcrP>k|Ugw`JA`Wi!dJflzC~!E1!F$Y!AZ z9br&#d5Hn)1X*J)xGuqR!8RvIxFGW$#)`X6>A!@%@uf<``j~%4Z?4 zRzl;yQYfSGKcI5oBgD4oCzGO;iL&fcp^W;X%nOCu42+59vi9&_pt9Lo;gXGkeU)vI zP(~myIZ+E?nyY968PpwA3--!)g7Lu@gfbpIJ+*xI^I7n5WiPt%bGLa_KC?Y{3kJ5= zvEK?s*XN-vY^lT{uE5N?6h#D5Zc+J)=1KwEpU)RQ zEKC+$@-y%+Qc*-3xK-t_ojwX-$@*%c2*>}?$YUCRv%QOS>~vu_qcZwc4gYhkncEP* zd5|g!`Da-X!og;p>{hgrf0LqS{mI{pbe^jjGg>aaGr%+{>oQ4Bt-r69eje~CRp>fA zD_A?%tZ$aFmnWpOnM!13nLRPSz$OxUkfW5gxgM>5->x#&>%k`Tq*oQ-h5A8E7xiAt(5+qJDXvDcC1vg{UD8jS<|o|eU!cFLmDR-*#3xgF#hpC7^1Z8A69P{ z2wB@fntV65Ej`eQ^8!0`i}Z(F_GZP}YR!T`I7#rXkw|DGOp`AW(lq9*X%1;qw)x>{ zfgNEzp@`WR-r<>*>{j`>BQi}}>Yz;J$0|F?Fcz^|ac6Oi01J819Om`rjUV51^ryuuB#ROm*70P z+^zxVJ^r+Gj}JvDE52+=&1+=4{ND*>cpJS8vfJ5Wb$o@&V45zPW&1W<6nU84yCKH| zvqL#^xD;D8jAlK*m+qnmk>>{Vr`bQ&5K3RQlnt@S3>jiI3DL|o-RMcyjp<m>V0b&PDfTI zJ8$U$h*5k2BelX)w&=W?2hu zmyfG|ERyG;n0EeI9cNEV=393x1ZS}0UCLv{VN%a0d$lFh;P)N98WJ!)TN9Eb#rB

F4-_pEthqcTt!E(`22)%Na$=JG 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 literal 13012 zcmV;_GAqrAP)_5aM=_p$?FkyR@w0ult0Ag)zhs-lI87|7yU1%V`B^;cWlYSp&>E!DP?5CmL6 zn*@m9R;9JJ^06qQWPuO?8!@&*SVK0Fm-pVi^FQ+-nB^sJyX)L}pAY1{duPt_oqO)g zoH=s_Bk{2u0@Fs`6Em<+>~NZmK4wE;8k*)9GVX%&XjIHt2f<@0p<@U^=YS!O z03#kjFdkqgnJHCdMDZbt=>bad0eGlt;N`K8Ds-Q_&Ao5ao>jGGl2^!b3ISpK20sb6 zU6_4tOcY6l-gJtBa1t2ySm=Sz!x%$v&BupQ3L^-*5470_Ba5A~EbpjmI$HL@{*neh zG_-GuRaJ@GG(vJNh%kN)8~E0d_ar9tPq<3P(lsz2zXp1}iG&b=c@LPw=%5u*`Z3`2 zAxtGctSztld<)vbd=lcL0RrMdR2Nh{J2@vchN4?3!8c+=QZPZ_e-oc@5P;D^Gt~Px z#`Lf5ChuD%U%qf496F+oe*}c_`^P2dtEni}IcD;e(-5Jzf|dUW6AVr{@lhLr)6;|< z;7EM4&E{>lYpwQ7c>osG?NMm=?<} z<<*j^g6eST*twoC{t#M!_Jt2z5EJdZ8%g9&@Wy{HgsP&bh6pH>ZUsNV+WLm$8#Y%L zHfqR*^&OodAv6yYa(RH_;|<39~=`uOZiq!`DO zurzn0ricsTh9KaZ5+J#trM_|L8(+P4#1J7&#?jB8et0&vYqkII{(hW@rnJPhPe8BMf9D8o>YxQg)rjd2+_w2OAoKK+qPue7{4zP zFZs&FgeZ@L_r9-2&ypZ(Q3MpKR8o)U!Qx#n{L7*$ge^SE0!>#dWPRve6PASi>`{nt3T=mro_78mG^0eKzv2xX3eL3sHjXUGN?ZWxPV&Y;} zfYJX*9|#2(o)G|tpbK6CPZX6Od6qYaAXmnpmAvS7iltSMFrz=u52Vmde*_>O;pZ-o zCw*h(iv9X?*M=h(#?P|Z4jV!Tbowin6k{uIa%oHEUevm$qjKEp7bi$&2qKm=?e=KcQz8#T|iw z`Ut>gpN_raw?3D>Y{kQJjAfhTro8C+?UB z0T`X0?~IS#I(z)QB=bn+UlLOre|mE6uP~ODi+%V08&6y{Cju}v9UdJU`w>eGXHE%E zNoCeyKh8{9{2Ux>_Y*UNCu9={^o9T|1)fx7Jgd0k`G53Q&Zv84G=7|slDkqOWS&u= z2)+UVwGezldsi)*YSA&B@k5WF4?TXiS_%p}0s*5DfM~!rs^A%B8v&SV z&Yzi@%ZB>G@Qr?21%Fi$fM+_INc64r$vM+hB^)6!(-?nxO78E#Q~FSZ`iSZR0aGFX zt5va*ME*Kwa?TZI5zrLF{>;?Hk3sT{r_2J1kV7D#6#{HqFmlP)7giN~t`(19=^AeQ znGbiW>o>jF*@Mk;?oAalqEc`xlkRoCDMm4?QYa{~T1RNO~8@+k@=q$s|kT7IR zFAIHiI-=f(NT@zWHh|zQ5HJz}Z~_jEiH^Bc8E|g#(W76;dds4F&p&g*k|EKtF`LEi zJiVJ*@G~O`Hh_>xAYdc{SfbC&owVo%J!R0%+Yj;j4?w*B3wkOicnJio zga8~He!|lxPc5k`sMbSnU3z{N)dW3$o*oJb9s&WYBEbA$Q8CUprzNH7l8st({fs;+eM<5^&2o(XC|0g)3 zrDC=`9%|iS%WJaE&koM)9~<`%I6rS#u!4wk0s(~vtuf2Khq=)m?k|x zoS6Fr82=X$}+hMNn2whQ8BT@vYf)t9C1Bjyi znBoHprYB+l)=7$#7I@R2#PIjjZ@C4gWp3obvA{E)N+b>;B_1|f#X;S8crfB9!To^R zx!{2w1yN`NBb80m4-WxKQB{TOV2awO0jX-B)6g`BgOZoQyRRzU@F3&679@o@1XjKc zWBMgL9A6`a?Du*+U+=Hl{!J+=^{A~q+kMtIdcY{^q@yHE&x4l%yb#a?gz!|1F}yg$ zM=J!_^55jBp}(v`=+|oUP_^gJNLl<#iQwO=DWIT*(COYB+8%$bDCiT9*Yokl$`$*~ zfDL=$k4PGyjH2-s3YD&am(k_mtQu|x*?5ux(tvy1$dy`Bx~ftwy;L*)w22GHIvviP zELovi!r7S)3-yGl(EWs#T3q16eB@3+78ly ze_mL&>{6hms6kIPSUatcvl^nY{SsC*y#yuvymED%d)9EeF$qnUs(`h#mNzT`>q&Z&~(UUR=I>Td?K3mJ8eXZ%(>rX#beL z`=OCogqZmFK>%ENhbi{{qN1t- zKMTv3T_3K{VaN6-#>B%sO&GpE;F$+sR+N=3#~a59!}o_!@7LZ(ubnI^&3oAGa!p}t z+r5{z?_Dh6>*ge9UllF_VfFl36YoEpI^wEDKu>qrp|`J9sAulFvK9aCepg%x0|Ane zyyOvr(eFfzKzH=u<@gZ<{#@PtPT(tH_59Qs_e){;-NA((f19htl`0IsJ2nwqQHsl- zf5t0&rn9KW2zKlR9JgjJW8&iA7=y=P7Vu z3GcY9$TzJkU;buraEnrrBJdU3<*BUQUNU~jR2e#B!up&?dLUijPJpBhHRjVr^AS0?qh(J-rvS(#44Qsv|A#2lBhtasx*~gh1ieNzx z`_m`q-U7#Mg+x3QL99|1cHlK2m-mLEUHLn#A~Vl&?mo1AYtoRZ5EO{7;aSgMbc0SQ zDM31S*|&{fc!Mb)bk9#DJTDl6JeL7*n-F#1R9ICY0#8iT(8c9>PkE{Q8xx6Sh$!s1 zuaSd?&kmM(P{!|D-b3h?V2Scrj&02G$jbD>vK625sGrq!T34F?INR!Kbv+`L9}=|Q zA1sZaj6X3d{%*UcVuD>%3pP~be;h2ZqMZH+z#jLXAu7M8KWFoBgx>$^U{Cr9%J`8a z{n$L}=`RU*_VbHNm#@{Iv)~va0!s7o<}9ixx*TyGqHMYqkBTAp1;Z?$@w1Hs1mQ8k z5aY271e9#uSN6$6JnF`yPH)z%srR;eW`Td^B#-(9qZ38sZkAO!P}zXS4;fhR2t1Y#V|OQ}kg&CXK(=A2uDY1u*_J3Dys1b*x~Q z?<{N=oP4*xSGDGlU3BJ2&!W=&66%$g@}yHJx)36z1uEaG@y|&fbPc>k1_dI*<9$ly z$0Ny-!XqYD)2XoH@GtC|4}cIfE6~ut*Li^hI|IHwtoA?zBQFg1%MO-TnJy{m+zS^> za70NLC`74KJo2|9Em)w|ERo%K{(Vt2rj$j%1uD(ceHMoA8~X3u@_tWx^N~hrVxodKR9vd7jq`(+}iP;`2HONm9E3Th2g*5&PG6N=#LO|;yrwN zG=9j+`@pX3@ngavV8v)*USi49(ZX)VM$t%m6G!s%f1vY9p36Orzl0(bgMYp;*3+-$y)w+ z_%(itP>(|ee?+W*O)fIsVVRU%7b&iA-o+h#hmYDm`@#nA}*S$M+fN_Z-A-#?Jx+2&NG~c!7j6%YC-A=WbI>{eiZns-#(_n|;w11A_T?3bu6h9gYfGvM%(x5etgf<# z`D_{C-P| z`7*#j8#!}qPPdU{ zH{*xnwrykl2+^WVdzOC_A-1YlkBb`~qdL*k1mUG}RsWbi<&m86rj=}Z(yeRU|04AM z$MocBB(H>o?snbH_#rE;ZHymIe_3T@gBZmdrU648MEWP3f%mXcG8oNwbM@vnM3ps0 z%b^>8O1jx~C*x=9`_MCt&`lr%8Bs)c+j-X>OUnlP1D?%H$=Nu4be3&=JRKi7xutD& z$KQN^?>?RHWc*Qa_UZMJY|mc5>jMs(KW^)vIPi0}W3cNz-hZ#(yZTGW*|3FoJ$?FN zJh^MkMea+MbcJ#CBPm6fE0f>c>WUeTSYs zvE%d5$@sB?Cw08Z?RQFFXSv?E)h`UiAS^geBIvb@l*P-FlG0RPX$V6kU8>aAf4zyF zxu^>>gPADE(aF9$89ybc(@leA)r`H2yf&Kag$AQU@S;gEL;szYG~bsyAhg=nE6p5# zl;T&dCwb@+!%AK!`#xj*Y#q=J`}bja=kU6+6G>i4x6_ayAR((3pz^y`6fPcQx4WKoD2<+Lqxw^1XYd$>EhkXI(Mq{!yGiC97 z9`!rnYW*8{{be3?>!_1MLZjP%e`oyoyNm5NdHYKhVvD!CR_z8GM55u}%FNUyYcD%H zEmkW&M$r9x)k}4d=wq7^y!GS>M|qv;r@@{Es}^6a=};MQ|9pTSr*qFA?U2sA4YUT>DEgG52FTX4*C_tH@r4n<#HbkO z4xUnm!})&P_xwn~XKdZq^G8KF&%6zIdq~^$frc%E?_!Cs9S{}%LeNM*mNGnRat>t1 z={Y~V3aoS?ajfxhIm_a#3p1mbU^KG5t$fC>U~-;OvgpQ_(o)@c*^CkF4}2suW#~U= zPFOO;%Br&jpOE&q z{yPcmz#WYr@!sSze?pK3E$o)KH>A(-2sc_maqGIF}-pO%!C0M42O z6-b(w1f~BouW)=z2Hxd(2bKyUEI8jfNkaI3Ucjk&YS=$i9_aTRFPheTQ$6Wdqjbg8*mz*Fn*J?CCe5?2>P3;mjkJn>*oa$+W2gq zP?>Pu^E1zFqw9a)n&jCRVgLfCl7zr=U~0}X_<4G{**wq?ME`3ZX|#|8pE7<}^W(ec z$M}fvbQUcz6f`43K*CaPX6oWiUGvFDL{x>!avR^newcp6`A*{|9?W&m4+oDPP~mwH zBs4+*rU5_dGj!B?Aa9xxfb5mIA1OvBo!=Ky_bFWW{IK&(WbV<(aMdCUD*->uO3hxX z7QIO6G%HO_kRm{%`}jGhPK!5s}z}ws;|xw>KgpCa>&` zayr>Oi)-VDB<0+{#ZCU41uY&+B{wjoUv|(HG%N_u4cDE91A841Ns6gU zHHAz_2qOu4ehjCSas1(bHG{v#Q{3(WYsnuRnp~YMqa{{m zpbdL5PLx!wGCZ~(&UNJaxq%+v0}emTweiCP&2=N1!C=*t0nU(Lt|q;3X<^QT-(W=S z0f(Q=bua_G!MToL4ENzSV?B1N(#aD|&zV6siuvv|+|cP0c++y-^TTR}==sfHO+m;& zk^Jj7Yu3~UQB?CH;O*!7xpBC`_+fW7*T#=He}ijo1v)XHGF@9#n*Y2`>;kgkeZ=Uc zE-z6qb_Ybl!UZtm+i_#zra2=zoU8D0g}ZkCnF|JgnLc_t97PT@VxB*gxMA2&Ip4l0 zy!~c=hMD0XbG6K@swy!}Cq!cV$C(*3HDvQhF^vvNlm-*!QBXs#&NL|E`ZS`>%3A9e zRg?_}>YDD}QnSWX0W}FUk^5(+vALnaAZUsqn>s1i&kXo8JnV%Fxe8g&&+mujE4$^Q%>MjpXf4g)!D~?z&mCa+KLyE6XZQ?F zf*ogD3)Rr11<-vq?|=lJTpK@wB`zv~HRg%XAQGk3MnFOIOS#28d;OjlcB@TWReBV0 zZT#@g_1Qd8T$KA9cSMQeyfIaM^fe&{!~9Jr>W^P+dcz0pA@3vK&kF=ou|{^Zkox1% z=qybd+$=<4*@o*moLO-8CxpxV-+eP)gGD~RjUVIV40rNwWzh*(ZZVa& zRqY1?q8RyZOtk@1i5@&xhZO3$wy0v6WelIG4*Oj=?<{aF)06G$W8)m(58rnl|HF6` zk7}7&C&&}=(Fs>m^18AW|2DIn{$zuLEIEH(6ra7HTI5q`Ex0)ORhZJr{u)_a(*^;y zjCZhX_oFNet~MOBqnbAM{!uXJ=ldWV1ojReU(Zho?>#>n&q6k}dt?M#3R#Cm>?Kaj4-(ZBBn6F64UaMcv5RJvN+Q;K%xZ8BV# z2n2vbM7cM9cugN<5S{AzDLD`UUY4i|`?GD(sKzt}Rph@k)z)0PanH*C7$bp-Ty0?d zZsnBmpPuu3_am-jeBt4s!uVA*5g#dV>bYSE`C!qm{1s}`Hi{l36iJ3TKer#Y^m@E< z&wrVMKI2y$s2bAxaQ%TeX5sWxv4tT__rIvkdwWq;!RIQHHI&q>^Y0uCF(HPZ8K5l) z^qY2njBnWA*ic`sEkhGf$9PgIO658ut6nHm1^vC{WPM5@M~2U^i|&(nv0fM&#Ro<; zXQpO8g9Uy;*|$v)}>Tdo+>PR{^mFKzUqq-<4IQ{ zDL3$>k3U`D#eJru_Zh#h5dH3=ze+q@gF{ND^Pq zq1Lr(`M&Yz{eY!=v#R{T%Z)pA@MnzQM}X2!H-jf?ost-nzUQ7b>~`x&tdFGN^O0pm z{#j9J-mDMymo(_Z)f`+T2f5E2l4vUhcODjKD~fT{;jjW*G0I&oqOk=-%CI1tuin7AcXVkw4_C&dC?~l zJ;3m{x>{Vx>nifML_)`^b>pMtyVoL^ey51s zjZhlz`n-h zHw^WL&7C~hlyf~9AJy#KI@q#W<@R_kE-Wv2oriXeL51U7yJ;ckVj zq+}?vLQvDMLMg9TS;(kd4|8#^+Wg=c?4qNkb(fUvTCq=U+E$}Ccf$PhDaILAlRF%F zVKa|%w7GU$*Sg($es^n|ZHylre^cg6%$?B{6chZ0RT*?tEjd`y4T#UrEi7M_^*(y- zq*`>XOvmAjdCU%uzEf?aRQg-K?PmNe6%)(}zqNA1h9bMeiJpY=CXDQ)heFY#r?RKo z(sOlDSzdlmW$bo+?znkl5TSS2MQ=EV;9vf9?PmO}5O{&P-M!Tn1cFI&)}-uPyIwcJ z?++uD0m5`YXly!~Tv)c^(@1IYR9}jVc^rbhY~$>u3f}Cm{rnm~R*>Jq{s{1JjY`rJ zpogh?f3H{mYq;2+PP*~i!m_*@-}$omSh#d}tT+3j`QtDmwwUX)_JfgMOMUZ~ANgxb zzs7&!WZef^IGp?mV1{dKt8aQr&Kxty(k{bSJGXCzIQ###{|@#q82$-GK{Fuf#$!;2 z&!ii{g5jrJlq2Rhke=J`bML1(2bbuFo2xgs`BTI%2rR7^oNxDuzY4rwgW><5u0Jo$ zG$*yNfDEG0oKWzF`23GOCtFk3Rph-JN@PT~C;KdYor z|MLWPkH-&N_dhFf=pW3a+h5A_--Z#`3xQK7J4w9zFE`!M5G+`MJgIC3cF^`rWI(>Pf*~om^QdxfKxm zJgKM3JYHvsEcPEcG;!OvC9P)CFDWT4Dk*BvRZb#}febr!6w_~ucNVaznV8oHXsC?j z?8^vtY_->1A0e--JhrYp@3%d{LIo)V2>$M=Y%LefsEo&vGE? z4H&`2SV?ZRWQBN-Exmd9+xY}E{`acZzy=cx9!)9QNIKz=+d`Jxrj z<4?1Ju6|Wy;oS%8S~mK<+2vwT#=oxO(BD`-Ae5OOL~8j zu#{^hnYEA=9P?Y(SLJm&n4>p7K^uSJt{1-r;}5uY*c&q*?lBLt!{K-{JvsY29`v!g z4&aRagGA7SR@Xxf`5~P5xlrf?ZTyUAn+t_RJQP8!R2Ce7u@aHqo-;Yej2VEe1ZCK= zGOvDSN^Tw@(*K1`grkb!ll#wxiu|`jQ7I(j-}psdIV6hsS11g4EekJzIEVt=l%AUN z6zCWdj=W-`mtJfge?;m<|A1xKkn$bqC7%&|sF(f;_=dE}E98gPt5DJVpKe`v_^<;@ zk7cFizHO#NAVxfVdhyImS)4kcU!NUzUe4=^H3an>Z#q`9w(Ipkze6_u4He5avwgyW z2;1pCJczdpNgVchTG9iy+d!gcJ7-SJy$cSL-D>9m9)EaKiu2z&_)d$zd%ax?+4zAN zMPBqoZ$#~Q50(Nia7IUMhg^Vj?Wn(&I!_yUPmFIVFN&;X4p%LCS&cRe>N!$h%ZB_R ze|k;k(F-*U&Xyf4_Pv)fw!H-hq`c!gspM|jv-}&|f}oP(Y*|%uNCmKlf4)j2xgsMg z^jF1Y%YGM*Qeo#VPa1N`0hsb;hQpNiIvC-x4kw;BVc1m9pxU_4YEVr`ju_tY2}Zx0 zlkORM@i|wmb~vQp!!Un9Fm>!!2G;eD)wb1U)ExaHtg{`%?fHE;XQeLw6dL9dyMZ2x zzRW+O$nt`96~2^Pp;WbNS(25Svj8FKX^c@nyMhpm-m;=RQe2i7cGB61jDJq@!t0}? zsDA__sGZBeyo>_SYhA7Gr`d66cE+MN-C5`~aiFKbe{yke<-|RfU7OZ6)qXuX97kU} zei0czBa%5K_iZ=>VMaSa@waCL*lDSdcylATOn+Zgwyd=0l6Jb2CS^_>oQ56b=XOgL z8%Zn6)O$~H>GHLa(1_UhXJ7ch1u?PFyV=HT06z_V$mO)d@gFm8w z!aazPpTgAfJiE1jB>KWs^0T7Syi0*bM5)>%Hh!iAr1)k@5`P+rLUyeSVVR#p8?J6? zY1s6}-dB(FjsuH@kYb$aFj|}s2c-<*U0=2JJ2i#$UarRBtEw3P^wC*;`}Z68rD)9X zn;J#}UI<|MKvD39*1Ev(3V*O%pqC1G+OlaZ;bDu*2>Og3;w5+occy*59&#n^bUiY+GU3^5trYr>gPK zoiP7=M|8|CaNxwLC7__w9RYSQCuCOI4(o@dh~oWJ!C$-ETs3=1-8bxHpYAo(xx%J* zeWM4AqE0%>LC`3K@de;=x&+qaCqdY4*a2heNXIu7b^P?%pN@#M)2Asrae*+AHjmdcsbtrR zeVuMZ_(OH$M<`9oN*T6I1ZqUsGNQUb;4}g-*Z*ZvS>DrX0}{@zz5p_m$lg}>kJ;NQ zKtXX^ARrJ3fB+bN*}<~Pr2&eCbz1}DM`-@ABf6}l^qF|Ybtx<}PKtLeS3j!><6E^P5czy5c>RyVea!YgL zXHxF2{cOvGp;M>A{Qm+~q!vU30-Pd1DOyxqp8u8}>S;Rc@1TIvQrDEp4i@NeO?(vy z2n0GH0GWAKLY{|J9WH75RWIX5Y?qq5t?gEr|2J!@ksvM*upk03&;Mjs+o8pJimsdS zGo?zZR(=8DrNRNIXA28nrbhre#Dgc=nr3UcFT)=Qy3F}IGOj%Q`QD3$TzV41e{bk` zU3?b^*bxD?Nz2pb`oUXOFKh1L>x!@L#?J((Jhc6j3B#rgfSq6>^KaJ{5x;GN02sc< zqj+YP>{|JW5lS0k{7lix+RxvgF#M7Ukl95Xab-ly3!a7|z+zt@o9n&n%a^}tlpwm! z`MW5o96Z)|2c)ms+U2_VDG=Zu0ZPd))|D@N%}7O!G=8+DW{s=CeQYLpI(Hfgg5WI> z&=Ub!L4PhTfBqRgdHUm}!G3;!YJ3=Ec`*3;;|7T%0snFSmn zhd@9r1Wu*g&YK7HOtZ<&G{( zFfoV%1 z56%IY>hHd|CJ-XKWQeJy2@f&<7a}_9R0$r3^;fF5J$o|cmX7J6<+)n2$&54NLwdE-m3eH z%koq^Sw|}!O*`!GqA*HFM^o5=kFjl zWqSdVhE1t~{WZ+@^u?_`wm>>nPO3!~rovf6Fmm=(V z19k)sJ#$ff5eOKF02uxU^`7H%-mNS;VW1cxv$mY^GYzvQ-hVcA#Jx!fP7PUOQ9&S} zA_5BaE-NZM@{k#q@&c)8m0^D;Jt_~EH6}>kdo3|8;VhT}h!;R7bi@xm5MW6-U`sA@ z>@7v;3)4jHg`&G9d;X3JW~Sz(VMJEJOCYi1b@5#wpcMkJ6~ENe=1niDD$qUqj+#1I z-uM|9>EjlRByr9nLda!mf+J`N1Ue$X5^x}d|GcxU_UC%%+v_NYTHm=aeg?)gG|e$0 zdBRf&OFzTJd|}IKHJG4d5CV#F)UDuqtg?(33`*P>f4j2jkM@0M$1_3s=rwFe&d9wNEZ|{4#DVRD|EW@?& zpKcHc4bE9W5qT003ms&|MiMgXhX5G<4n>idtg9$6B%QW?nu6<6Pi98)x^?6|iE#t^ zJ`TQs99R}~8Yzq5Z9W9R=no<&ar4GV2{F&Yg20US zYvQkc5rANwRv9VJ)|EE={(bb?Njo87JL7L}+>D6}t|boVZy;mvB&y^}befQ>>|v|kf{`9;8I^pvilEuN>>?R}w! zUrhsRW_#mrhbTQc`#M6TC%`FqW&1VpmmdU}(Sr;B6<4eL^rk(_zu`x-@HG*}-vzt$ zl!f2N)VY`tItxYvmfZN%MI~GRgajMM!GE_Jd0fj2cfI(nt-Z zXG}Dltb*skXkbA5b@A642ta^NC9Ksit2ta-xb54LR%=MDuav_01K@qx*=e!o4IX+2 zto_V~jYCrc6c@J*L;%vgyJ73i+p^*<*s!zULjy&z1Z!dZAvDw635zb2qNTgxSn(`~ z6*xPDs-mcd2!PlAQ{<(uHqhhitd>njLs$Zm7RDbCBEJO)tP))7#E!cV#<#+YppV~D z;-Y2%zzMuU%+?dSaiRuk%X>+WkdKUat!o_Cd}R2Fs9oS z1${`d_ruDzW7~PinA4liM&1*~uOs@i&cAbTY$Ci2C}KyDv6X`qcq#PNQ3O-5V*BMO z#XB&fJG`>I?MOq*wkM`P2;9h<9PIjSxvK`j&ngz<-hmQH1-C8Z?{i5WbGV0aNI zj01Vr!F~$453f(7r+So_5#*I+F9v+fUU(4~X@3K+IwvVf+?rFm=RDlctS~cShC7(t#wG2b^kP@b*Yxp$>k0Q2GD+ W!bWMEMtonld_bVu?C<``r7_lY{ke5*Jkz1%W`~&Ijzhf&VQKh>uT1 z02rm3rE7se0wAp0K?eZ-_w%s@*`h!wJv|@iz0S63!Dh-n?uzb?pg>za9}k@n=eXH2QsCZp65gAE9knwPmFPuU!BH@vdz6de_5s8OWe2qv1!w5Wr?2Cvbz@z<) zNWMlCf?<>&g5nF0!o#V4Mr2<@Y5;=b2PXsVL?g1l5tU#_AtFfrC_s&jM^gL^$pkbB zkD~Y^Nd#mx9uehlNF|_vDJlUOg-1~Fh7M!Iy|7+h~ z0+omc_+p>J+68Pc;V%THcpN};oBSUHD%*UX zGH?7}PGA$L0qAIth0{3T0&K;5d*DEP`~o`!g@i?Rii&~7C3Z*U;RnrL6;n>FVhl7#hJ5NEF)GWS^;-xrL>bwTSFV;bS?r3+s_Gg}ZQZr&^$j-~n{GC@+`4_| z?!DIgZS5ToI=dcnyC3yD?tRkNKk)R~;Lz~%7bBzpj=dazH8J^m>do}b?Av#9^Y0fv zEPh=2^m%z@^~=|9Yv0#@{M^|5_5069k#S=XNJ7}ze*Zyvg}E-V)ck}g;gw~xIE3NT zbN#5jV+zt$2laBadRl#MwrI6d_qB}DFI?}_x+96pZmSxe(5}kUBFkkOXdb`tD(vP( zctp=pxgylFH7OOv_0!+mZ{&Rl zm@3k$XzfwY810Cit2KqHf+x!vnBqF zG)|@5`jE_@5k$Szq~(}_wf(*nlr`Uez1Ug9)@ZI(lL*G=^JF&&cA{M~&FvRTSpGn{ zcmZZ5;?CV{T9Mgp!!*0iT?Clu)oWROiF0r8kzZ;?_s_L1rTEry3(2f6Bgx~B`--ge z`7dgc>HuUg*}$XmZ<{Ks^%e+jCT(G zw~xLEv|zKK$o#1B^=FLDLTNU(=;iI-D(;6adET)UaPWLC-tp-x9i3j^drjpe+2}R) zpPh^r{mNJ~qxFLHR_(;oc+6Yxc5KrH`kcWBCBd3S%f=}u?jI4s_DIH7`y0PZxAd&U zA&x*(qs*GIxbCT2GUyXgKQgr4v+A89J-W&qhekt zt}43|UMp8mHs)2w+h)#+MfCh39>%UIRH5Iha)v01Gvz_M!vc$3Q05i<;$o4QFdg~# zdp=d{RAuphjd=KAkt=R>ECQ3r(CauSq@PWfC z+pbB8ysag}`y_)fR!$Zg@M_$PB*siEsa1e)_P3I;)^xy!k-{^nwLitz+x)*exRHk5C!&7DI1dNg$kuCbv< z>MiK}5awm)2&N>=!1_tt3<+z}LiUT_S;zi7Yn=OCQZv4$bQxZ%s6CC&uRRP~3gn_7 zRv>}dW6(>vFD9MLg7jXN4m4LDOz+Tvy}y=@n_>lsLMp#dg7#vF`KqveA`fy0s_@SI zkfj;3W1DspB7FuuHyW6e{aCMVq+4D_bzL!JQ{q8Vc8EhhORXSu1FBL&$2IVIBo&6- zu+4mQ^V3JLmCsG6iKNaa7G9Xsh%dMxHH5knGWb?5ANF04f!80KXc`($3n8xL?T2jc z1`0t*N(*?W+6yGp!$MV}BuvgD(RaJ(bRz7yvBwYLszd3Dc```|#SovHuml^AUiLv9 zP7}WAX}+3Cp?BPBvk>FeGEFhh-8fBe|xh|H8j2Qrl)@LH~ z7ONdQS*A9jxtbtLN7e^y*f4EPR=JOf-3=PVEyzNf7wqS6#mtL~1`15Oi)vwt9h_WL zGBq_}-;zP9UfN>DU{h`d&Pk!$7YdGp}zd?Q1p&PeV2cd)FB2HZn{H7m_X(;_5ok%kpZ@w`A`n# zDeD>g%(55sBm=pb+QC@$qnYP<$F*VMsmPz5YJE#t0$>V=X&!5}#-#<-}keqYLT zX1y3R-dd$*z}z(0iyPM{uS}2QcNeiAnWk8R3vp396FULAZy$vntZCSrKgZV5C;}U zJwvb8g}8LvF@DNR;2{$ytd~aF=Q1szg?z&LF6{~eg7r{H`YFZ}U{f-ylbLLb&|F#r zq)sqF*5ONZdWi+BP_U(9NDCY8rO_@9$*&slP@`emfer7RXu=woBZ)MBNUQLozPT?_ zdeIjh{3Y?+N@Ajr>8fJ`N-kp`q9ALLHNHHYA%o4u4#TX;t zO!+w2%}gHZW7zXYII-NZVP3-x*QNukL_c*Snjq%Vfnz>8@3+x(HZi_y+Jb`6vNNYvnLdO(ni z)!E&?-XxI`{B_$8M~0fpyc1_Ko-q7(8O!$Hc_0>#*J89P>rC1=?SMAn8^qUGa|jn1 z`K7SAgU|`=m-b~X*&+Kd4hBV$POb|{`5{)Z z&jTS7{4!Uii)Pjqheq2nygN+G7zgfsWN8$>hbBpG9IC=AdW^d_QB|NXdzwFWC~o*O zyeZlqgah|VnZZJXH>)MUc+9=MWzWlxl_v+^&>NgCpU&iy`w1-y60GSi!hYV>D7Ply zS@=TOvCZM0jOlA9M*o@gcBK=2J=JiwoUvv0i~MT3AQpc1L9fz0P0IMVmt9<0gP`$` z`?g&xT+6V*cXasPV#V8U-6BU;+5IES6@fY)0?Rk1*%HwjY7D7`La(4(zw42ZR9ib7W(n{tScvUCqL)2A&HO`XHaw1 zMl)Dr%xjQp>ZiI0Yv<#eB^pJ_x<7&T?;z`THn?Dp!*vX2g!bxryJavyq->6;Hi?nsWcRTkGn-$tp=9 z53h%o@2R{dO2qis>v9L>Ib>XKOtZ1Hgk?88u2M^x(6#c#$rP8U%6(EAqx)oVWi`d! z)FkI{1xKLlYs1mIcXvq}qvTcQ?dE5>VBu1>dVFCyD>~Y;+Y$M0E>K9kSz$K!zFk(L zf?dgJk#F6UV5pLK;H~HKtzr9vUK=UY%|Fce5l^pnP?3-A@}RRJM&QVAR(69yn!#?| z8}cMshfe0JQU(9&hu0O!@-B{DEelm(g{s6Z%jGz*)V=nZTnkYJ(T+&LO9Aa?yQ19< z?pDu)gO4|BPP6Nb5S%%2dcV-0?&&oGf56zgAh7qJ;$e~0-tZK#qs@26)Rs40)6JC< z{Ms8IG=wgxCTTKXQNkowADmF(AF$BR>k8>N=Ik&Imqp1hwZBg98=g(^ZB1Jp^*Y%w z(e2{Xwt_j>@L7ovnJb6hKlkxA?IQa}RgZ|ol_}j&W~gUW_VjQ>-+rOz-;?V!?jCGU z6ceaisBaK)tgl|G-n3Tm7whVq_Y(*q;=1!{dS^b`5z(qL%8VaZwdECzH%*&wDzdQpY#WptPWa1pnnFxJor|Z*NCln zUGMo|^}}cBy52$jotSrPIp;+zrZ)V(EBzU{?pJi<_4iM-GH#}|ieD1iC^=|je$-XY qO(|}D`PIn7EmbMRXoVHWZA%#RGg+`zwfz9^^N_QHhkXMkIPHIKK`cT5 literal 13012 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 W!bWMW@2002h+`@z9{ya9J|jR61};Zouv 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 literal 57746 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 rkn^X{jF z83@7VoSA_Y8&Kskf~|caDTRYikI>hto^$9|*Zr~6HP76}eN}LK>&9AHV}WLk8QywE zybiy<7ZIi+GUPE26WWXnOmG4=r6{I0HWIl!3@@KK)+L-`V0J6XXJjOTdDrV@TiT+sh|%kO#>4uP@c-!=zOVgF|~hXyLyekpm!QmW}%vSat10fV96b?)sjKix_8Af7xd ze0q!a50`#9%yqhi?+V;N;NQWIZXW#i&cL5~pWo#Fckq*+ET8YZ_5b(7ym#a)@4@S{ zPnVqfLH3s|I;TrkeC_}Ehm(h?lxYHz!uUMPiBAGw@%LPsu^{w2GwWYevwr@!E(m=+ zNjnL+J=%Zkf_$yp*i~y7_&3f8v4yEee+5yBI?)YmA*O?MpEaAa9{d| z`mg_Zuk_6mtptVNVD4%t`5Vk-!nuDgTlwaR7>VUKO!U|=cvE0&J%rg!89I8T|~vxKl%5* z1(a_h#BwR>E5tj)3M*^dM@GSx|#OVJ82YowGy?@<0mW{fHwCKfE ie_!>W@2002h+`@z9{ya9J|jR61};Zouv zDsC$$>z>hS&Umo)ze_9%w_iiyLO^>=oC%`J>_wQO7J!2N|Fw9U@KY`!^p z?4Ie^vH#+t?~?W;NZrprKeJ9_mS#i%K;9c6qY;)mesfPRAy5x}1R zYIDgx{viXMF#dlI{C|N!GW^%Y$eitCY%%aZ1pm9W_@{=AGjRL7UR|1QcmIEZ{Qm+E z4)s6M?I=|~6l{x${$K?+vHD|(4@Cddas>QiDkS6o4*Y+V`2P!j?PNP z{{h4Qsn>sLhf4b2Cd;J_e&9b%P?COh|Bq7tms$OvbMYU(a3TIp-2ZO>gQb@M{-fuI zNt*m4kBaes%x=JEMv^3~;J0i@0R>7#!SBKq)1RecRt?vy^xA`i3zfPvT>bk+`^(Nh zPkFERiFtGODCLD45%akC`(I2N9`QDXg?ARYg^$Z@mR=AA<=>Kp?QFl_h=DDJ-c7)N zY3_Y5Xp#Rq)Z9?GM-Y`}gpNFs1Rqh@RXAu~KK9DP^oogtZ47}*IzLSs;@+wiH11#e zJoab^*1j9KxDYqP;Wa-@p#XEq(#C0#&)Q~uHJW<66`R(574N%W>r@UMIyJ7|yuwO1 z9Yr~a*{HPScxhIcA3VyNt-jX#+%Ft7+p0OeT6}lfV54b0YvXP;TPM-2BN=Kn+mGr$ zwUz#J)v!GdOB-95NfAOVyoZImzd$GSfB2o$07Ts!{P1pgAXk{it2ooCh@01 z=eF~lo_wk8?D49h6I1?G+yFmRM5Y~ao{x8J8_O3Tp}Ebnx5r`g(zh;(+{2~WT2u3M z5?dTy)iHTJBJK?|UDx&d#78{6$CrHJPRH*;!kR+X?hTX4c%v-ua^(*LHx|z$Skpg_ zTBe=;N-1_O_SqPi!R}N02(Ctiwh|3u;?R3AgK*EgHLU6Aeb&50Il}q)GMbC>{a@;) ze{O4PUjMDjeT-99&LA4k;^Wt1Y35j|>f}|Ma3^ggdG@+_GuDg8VfiI3A)&H(^R>ZT zR>e~$Mzt))be>TaQLO=eUa6&VJ+)r91T*0-vb@d0Azsge$|KW*T21)rSmSZ4_mI*- zzFyx|tUl9KibFnAYpMTuNMF9RaAzW8 zxNB9A*X*ofzp<|4IEh`9IEvmlvfRuN$0z439>?6L?;6VTjQ38LOM{7jWzu9Z?-j+D zR<%&o{%A?gVjP!LD?uEaQc!)GvDvMgO~Yc3-z$IF+t#=~ah!hc37ftSrZL`KgU#D{ zX3skvO)_OtE}Y-vs(Nuww>RVPdbzPkXXQP*=QkpfDa7EmGE0|%8d|XaI||1i5z&eU zTfk5UIkQuIQ{yoGV}@>>js17;XJgWx0m7#lP3OdP~m~KWyDD6U9pSH z7w6lfp&4Ht!V9lMaFvR+Dp9%3(s{7egNs)Jql`%GE=|x`W^tt!)_i4x;^{&7$Q72N z<^sMK(l}jy;#bS=T-x?4t(y)3VUM>5l~$t+3|k!ilwDWxM^!tAq}tcwl??L>qtWSqFEk&$U~;UIs}*W#th0`@P_6oNcb{#vS~;YT4|sKM@+& zH|!rX>_eO({NmuWX75?A@2Je!d9ynG^Qyjh^ZlZD^>XWlQjxI?)B5kLdh(vtP9q%z zMd#K~64-@@Ht|f5F16@e#ICwd(ix`RuL^S;FvJx4wW+pmJ3SYx3y>d2YiUG^`5eC z4%2Q2e=X8EsI)qrq#Ca}f@kLc5F8>@n&%k18N+H68*&rA{<#kcIj+LC66S9B07er`_A>gagi0St%k*8Svdtg4}t zW_f2=5V%d!c#MOsU9iN#cCCJV_wl~hgDSaB04y7I_H%VAji5ZC<>h%#{yLPtoSpV~ zGp*T9C77MxUfUk|xzwFmu^+N>;BW6pcyPXZUAC*Frl*5bM(q9(y4raY^}TH`q1S`h z2C+90p6u=_p?ONL5cqAGu-uojq1>sVVxt2BB$Qa`QE5@2cd<&^sHDkG!Kyo`0SpT!yS6{UvB``rd|Mj935k( zyD}1nx^L<-GBJfaTgS!cgW&L;X9m5IgpjpVKs0tukbJSoI&X}q>JjsBHVGf{x2meG zYzML0+M^ZYTbq1)7}P8h_H*uJ6Q<2;JoQM;>|e6`_e{S;IU0Jn^bBTZc1ssHUFD2$ zkCa_W0AJYax*h(Yt0X0C)}bTg0N_n{pkwjM37vFW5E9dMrjVWren!3AWlyO?fO?qc zwt&&dUIoMvXLJTb>9D4&u44V%n=+3`Wfhgp@?}t{QgkZH5B(0eFiY}3McScS$&7Qd zy$}Om+8DQAeTQtT#kB3&Ao#kL!5Z{(*eFp|%|l&osip5Xh2@Ha zB@^0BIZiujwBC=LQw0$eEOJL^A;0$(zASM?8FBO6z26Wa1m@`jMpN%`H=flJ)1jEXp{z&P%$9G^1MH? zu)eYd50jQ-@BT3&4w*rz5176ldRJ60JWK2eSJpF1T$3GhxI`#xTs3Vg=KULsbBXY9 z^;`eNeiw&zH3wttWx=CxGP!3>kn-EBh0!=WoH|}CI2w6g-jf^}kzIg0Oq0vT5Q|o9 zcemjTI?g|RdzXf0?9gN)tx5B6FDm)_g+<~!i1Ji69wRo!J`sZrB|or&Onu0p+1Hb3 zW5SXqZ}nT{)ShNt z$m;hcuXhHE0VHRE;vK=NW}m25BI;^WO1yRcNN+=k4f# zALjs3CwgR9jeBB%vlD)CwZ1qY1b|vlE}~{9(Q)WAgLOkeEwa4n;#&sVne`pVpWC7V ztM2IAl|X-FMbC&ssC*#HQ!j;tct;y z%`t z5xYc#`SB$?SYn^j>}CF^QP(XD$^t~1gjhom)xB3~C?(z>;oSiiZec9)`($V+>}>Y9S(>ttnkf) zkEYVXNRZAC7o|Y}zys%7J^z}UkmH)a;FkwSi8aiU#d}6C8URJHhN=SnBM^7Y!G-$< zzqs_S#4%~qf21%^$V?YSNzmg2rOV&$jt1y({zTeT&RDcVe}(^we6*vD!KVlqdTqem ztyUEmm=!Pb^PZywg|R85>)G5)Rrn6y))M`O7jF}d7|FYE^^|(bnFO1Te=Tmi7FN^W zO>x_c(C;M(|3z=Uug5CDziw;*1%Z}>0S#W;*Ju#fWlF>n62>^$XF;ti2cVi(_|9J0 zSBft$M2Wojxos2oPPc|aM9aZvzQDRHsqgLX++zdKp#a?@jOoEfdNpdPtIPm#4sTOAUemC+pd@uB;Dix7jq!JQDJBQ4LMO@d8e?MN!Ad)YhdHtH<9<#0#3pW~chu>0@tgm#1#QUV z>-i`ef74!Ud&~OIoWB6ktU%O9NXj}Volf{5DM!-x?lW{S2SEIc0bC#97rV()q;FQFw94kz|#46~g_q5{>@I>u*c3~fWhSk; zA-Byv%&UzU2<+4{?1%g}NX%e^ea9q|vvDElg0x0hh@GvqGJGw}_h>mi;-$z;lY%rC zaG>Yf-p5i^??#2m;zkr|#t7AWT~{Ko!fIH!$o45*x$a?qSwX-KExxTaJ|(ddW>lM? ztJeEd{Q0tcJ5ISvRXjPq?XL2O&m^M`@sV3URb6mDn_Ghh2M1GsaU*R{rGVMy(V%9AM&+PPUBu z3U1X#AeAzGi~4<)M?jUTDjWteF9wX{YR{h}Iq}{9{F1`=8I6NY3?xh+M?h27<^AG# z;!GyLAuD_C`6>d9dLCsfA?NSXB^k;!guxOhhY6U8|K%6`u_9rz=!kOekfCrwK|}*` zV4h3r6lxD9b^c7|9(t{K%U{b1U~&k;Dh{%1b#dtHq!L7!7HoM=o!m*@6J9Y7e|zP5 zZzuK#^#Z>T+*4X8fA#ZT5@-FE{%NnXe0Su6@ZRYp6c+U{KlD>lOTR!=r9|oj4k19~ z2oZ|;xCqv|<|GIm6zyH~bH7M|W1l-)hDer|{H+|1UTHhbgE1$lY&7h>VnXaF!68v~hcnMFK)A2C_7*sD-uZi?K+=yz!-y_-ilC?+;x5h{ zt7iHbVRTD);Vug9(dn^3%)1^1Xt{B*E?dcBa*aPikCZ3kjc3A$ zfjfHQFl%P!X19NZ_-=Bfh4xXn{W4ju3cR{!35s;;!LMCw4-XIVr#fG^1yX5VspuJw}xZg9jesI zBcJ5}CNg0AL>T;fT_q`{u5HWV#|eVq%!h`3C|pql7Gjn0PEp4UI&-61*6J9(CUWe_{n^I^>b7eP&+ETxzGE___%Tm2ekdZnn~AIP^}1g)u~? z07I6Rv_r2Dr!MPs-UEpSn6Usxg+O}^h}&Eq(W%U52+Ei_R*2Lieq91oF54@ZPrf++zNfKH2xY6|uXpUOoH zf%+LAaKi9=dEMsj^-2ES@oatk`xyW4`|m?pDOBuZW@l$!FPlCSkHptWzFdyDNDL*X z(eZ_?t*PmMF=s;wIi0) z;jNqHo)jf|4K)J5(nFitpOLzppb=0eL79V~4HKy23s`bJ&oiW%;3-yL7oSq-%hf3a z?W~EXeNIlnY5R7P*1GLAKL8e0z^1Iuq<*R>E6nL4V7!;?D=pHJSLs?S%7cp|uuUcYk(#wu>bL%l$NpuimH zppd*x91cr=_uCqpKYb3~708Ux1fct+;v*MTC68?gIIj*49T47xd3c-;Y-L;#1_UU# zyxl$FkjEZ(L_#(usK_~gj*|qG@A=8~dBLwU+P;Endv*^3ZaS%{4f=^Juh^>MyhE`Z zBBnoGrNu?^57u$m*3*G;YDNhJDKUz$1pfu$Ff-=if6!bIKT;1YBydqAorBbT_pcH> zWDc7lByY--yxa8GDHU;+?G09eBs{~&0+&@1O8697l$)lhg_9^KOR5>Z;$v~Fd|V2O zB2Ff`%)%Pap!Q{gxG5Xo^J-hWvvR5Iu=iZr&ULRlWmZIzF#n%w`XRCSlLi(pMTfko zV~$C4%Y2c~E!$g>eR#9s?&2Z?BAozKAZY|7Y6t7_^?>iahl5wW=9j}nMqDs>942ws z`q!>_`U|XgYBibEtrFj10x)Qh1{}s>CK4qfh^@x-DQ;)0^Wm06%mYWqz*u|vjsjTZ zwWzo2I)AlF>BIirE24 z$x-q%)1%{=l9Ue4=zb zVNkhwmQIT%-N7QMv-Q?)o#X{muDoLKEf$=%vgxV`IT8yEKw#Hh?IZX=c$;muXE^{2 zp&Ba=H8I>t5s1Y$e20yAk37}BuSu(smY#T95wa*4nyK<{1lBUYX4iXhmn2o9Yg4NY zMh6`qnz$RL-#|1^_{t+N>+vA?X~BMqcUbwr3>q33~8h#h-8_SmeR;rz-ICPWs)=xYmEn3fwjp9rMv z0~|(+N?UOt^uaQt0rIaRPQS&mi5qEuvEbJd1P_%{nzZ85j6t0@5C9?^p(CGrM$6<` zSv2G@|5i5^6oip?Hcbum@_17>%cZLkgW81bv5BE~*x7eGytO|3BGayZT55t)t4a&7 z&G$+dFPI)N0sM~@PbEnJq@?Ytg)1<%VHijkQ+$kAPuqIlOf9J6mb4h( z7!&K|gGO$(jU0%ryij&iaU-^#_p~ow?j5D6oCujAo;O7833(9qlGH9oI)%|bTpSKi zLI4uITk*QiUHN2Xrem<@XSw$?e4?M&MihzPxKw&TgmcsO2nJEYRVRqNGHB@2Wd||Y zSGC>NaYOtcG8OHY__=(W0Rocc~K-f*VSdpT* zm7Jk11Y8C;PD`lHiLNQ86(0$)@4avD2}%(8bqAC@cZ7fM*SV@0b)gFn9lI~)FsD$6 zKDCO-PYo2B6^VYFZKKa2;WmlLotupA$S-tS%jv-Z8)tkju?MZC@x@ktD#ky87}5j7>rvRanqN4QGkJRv?dD zYK*gWH3U3Rvg>;hBF4RWQrF`j_!)amZX4+1&|8Dd&h!*BM(__k#cf3CtZPgI4&Tam zxD}3AWoK#Rme1D26Vx(kwUw_Wwu}IAfTTabZ%$WigU5R(gHrnwCpIH?%=#&x7qYIj zSR$$G>ut6*7<=CaFebY7L9 z0heIs_2caE5o;nQM$HC0y=L?&TFi=j-J*$UgH=rpakYm70o~g>&#^{J*hh;LeR^=H z=BI9+!=}I0<(}b?{op|d$01hFH)K9#*KcG7Jx4*cGOUYG>%KK3gOs99X@xE>TDOHF z&6fy(5)9D8d8~`>@SA`|-Qp&P>Xyi$joEDZ7ljqxigBGNd#o8Y=)?AU9@dbFV1*G4 z7U_lxZm_Wr*@2Hx5P+E)OR}4^kzA7h*ks4`tQK zA48#LMg16!z%Zv0_{0!vLI$mX1ZnHRT!3#xB|?{Cv2%@45?cxrsxTpIvLO4FXQ{O2 zYz_hx5MAxSQi3wZ(N1Fe5y$ba-Bi%(zWiERur+FZqrhdU$b)usZAp$3w~Z~rnME2Z zx<;*6RSg@$>|m}B%YJd^Qp)c(#sG5d zAk-2O?gOc6+jrOpnNbzP{y<>BCdS6Lwt;4g-e+-}y&eMM+|DO_w<=xr!1Z7s@MTRr z@i2o<4Q;6L$GKc;@^!Esw{SnOp5&XzA1&D!oK$Wt>~?baMNw*R+jGWE>;iv zX1Pp7q^aIdELDCdp2!OCMB4P@Y-E%~k{-;-I5-O7E4Soz5Q%Z z;64)2gHiS&C!7vRhVR}>-xyzB4@9D=HSG}x$IB<}@_JQsfM%QdYAr_c=6yRVeL-Nx zSse~2nEovIiPQSe7qjTXMFUp36fq~2exUfIVX|n4{;qKrr1>=6E#nVDWN)EP@YN-|#&ElCuNG|0#eb+m08S2K2_qJsN+($$n6cY80Sn{okH@U_Ne!MT_uETBC-}wG!|arv-2qEZtj zmy!^l$ceHNzO|NL(jX?>sq(uhKV$a0HK#mR>K*cU%yfXzjZI9Umos@B=PEeMib8n;h@1p`0juRBy9k~o!KzxY4m8A zP&Xj}lp1b{=mcmm^C`Y>;8$d+{E*}ff8gYaB2*^=r4P!p&Cc=8MfP;N<#h%V5`Y_d z7v>4bLdHHr`;Qz!pr)QLm3BGa@-5vHLCl6fW*^3kGsF;E@X&sN7hhTq3seUTy)X0Q zY!#0%L^iR9=5q)QIsL_gB#TxM1pz5?DWJ%vA|oxxzMwhd(_vUZmqWv{G4(G17DRm` z!|9md0j@;}S4lqQ$3(1R#zDF>Mff%BO!UWl!}7OpPUEGG*b-x?#2u9paju!kTXN=Tq!L}6sL}I#g%geit&I} zxZAb`KQp^y1Q2jbr3$1E8GS~qlDB7H?WW)m_A}`+F4iMAPD_PO?P;0P>40qGYqwcM zi+@2-#*TOoengYlg%6_0R6LSMVV6oxV6z|$)K(lr71I?tZ;>r#$j(KTpQYkHBP7+u zA+_`dhkSRRWmz18K|T3?mpVRG|HF0)@(;igg*4CNzRYWns+y=c+tTp|o*w-WpCfQC z&WE-`=8x+ZTD!i(e&kWDY*i;xCX8wlR7kub&ZfLE28PvfmvasN$)FIheC4y< z#|`Ts^WC!gDzLLH2GOq3!mSAGuxy1dyE3yHP1sA2$`8u3qIHK<$sRR4SY2KX&n-$_DHoPIh@;WEm{i%dQ2y;@_~m6FSxD1INqV z=OzPY-{L7q5?b%r<^oyagW6wWk1g9~!XWecA)s8Jwjl--3-(;Ohhb2oq>&0aP3yxb zDB=fzGt)M3970PEhaEp;7yj0%mr*E+rh7vDSYHBaatDe@R@J(W$(w_I;Q`BrcYy6+)ZkWZh$gdBXx(v=(i89Bv@0}Gc0J5zxi zzeCKC$cZh`TfXW_<;*O0@DnDdFwxSS#UQl1xPl{e5JD?qnbA&wh|?AGNd&0Q!m5oe6~ z`#WnYGy0o?*`EJn#=Qt!N*eL!CoVc()HV0#6D~TR+x4;J+fm6%{hzQ70%f-6WSW%} z)3XE=oLA3K+;9lcJd^3rt2q=)G8DUtnO@Kw%2}onQNm0f4D3>8nV3Uk- zdt&iOOEgtvMQc~gCr3X;*FY<5?gNpdEs(0LjKlDZ_%j6fz}> zN**!f=zwkQKJtk~WNv9iy*08W{mBKNUrV%Mc2*PI2mQX2R&j!`u|q!<5yw@>tZNhu zq4okUGP#n@A!b+ZyPI#Au9W6bi_)_07KAmiQq5`@ zR*t_pL41scQ3{7xFA^ev`^ClX#!iUT4V_P^cwe$dG9XG%hV!ky{a{d1%1lCV1XH4s z(us+raMH0JMndKjKtP@2B}O7F+5xVQlZOp4*%1Btlq{A+vyA5e-MaM;n@2AxTg6W( zu#yMDMoThlqzc7lik~w10-Mc*VP;dEv%Nez4sIigrU#QlP>LwWfIYw;o`4x{|JD%Q zqDcp^Q?Dabe0+nj8}I}c#b4b#dY-nGMb+Qz$R_s5BE&TE^}d57T_r?!eW0MM%l+Th{2-Sks%WWU*P; z!RIw$Ri3-2PyUJHIw#Ap0IphIu`-^;Tdz8UiI&`uZjN$~r>{PH;h!C6A?r6&LMM*K zk<$u<41lB*0bGvy|DMo|#UkyQ$44WDCM3NCh^JD+r{X#Kjk_@()n@lW^evh|SU*Z+ zXFTpq{bdgO(-F<>C*?L?PvU#q8`V`d{R1oxL@htMIzmEZz$Y4%6P+E|1be*1#a`^_ zq68qs{{UZn?SbOVyB#$tWm8UuL)A>3f(Smo;k63I(0AI%#+;1dOQ);5N_n+6z2F_0 zQL%7kT?~{#lz`m&J#VkiW&M#$U|wQOO6`w7L}9ZvM5{Y}g}q+3(e3C~SlAn29S^UR znIF3fMoG?b!&Ba$GzkT^%v^Wv{po5i^sge>ki@NmoneWK%><%|M-nAYT0uX*Ay^_9 zjwp0I|JotMy&f=Y+hf|@W>%rmzDj{7zI^duZNKIBK@{TuxJB1e+^)pqUpq}0?B2Hz zNKpR8rL%}35bc%;8!0^S+3U8KJzpy9RgAvjK?j4l=ZFy$-y%PRfLhfJSjg}cNnqE6 z8e)CB8gM`!^Up4Kn`M#ic7Ag#U5TmlC~+Un5@7>W0cB)%px}aZ!~t~dBxc1_ru_Ci z#R6;eP$NL}%l#Utr91_{9Sbau3J(b=DYCqv^|^9v?XC~=L?4}ml>zl&_f zT3&+t8QIA(th@0U;KtbsAobKmrrg+{RyuvaO5R)_;((rvfq-^y96SiT;2Z*Ot2QX~=)W@9ugptYnslfI@qu(^v?e*wSHNV}zZGcpZPez`0NSh^AXTZYX6epK0nr0ayFzQeI}c=-{# zirf&8kKyEUIDM6tgut-6K7Pk4+T~UKRK1W)IO!$h;t7Wr%7?Ye1td4dmYw9^)^+4T z5JWU`zJ{05skxHm$(GZ;0aYT%(F=e-#F9}wuz{54xZfOk(`nwr#9IHdYY4Hpli?~| zt1tAYmm|576m#JAGFvWZ>nlLq`4AOt;FP~T4Y-2uXb|tX!1Z)#DBc6N{a91uURd#( zk0LPxk(n6!{)D82q=Hx3m7bxI`#f-TNeiw&6Z4Zwn;xoZ`qm{A(=bj6m1aMFDc&3yK zPTPM%LSTKhYR^aYyboE0MCEXKbsQR1M4p7b4G^6Y;0-SAV#WE(iBI9>gB;z($C1+Q zaDp*~#T3BTc?18C@fct%AEAozr!HqbA#n63uOoJaT_KTFK|<0DeptFcp}&79AM)*$ z*pZ4cYme!^thT<|ePg4QKVs~Z&6rdvNuUnAP$0#06lrGr{9;0vyzoX`{`=1NdUlp{ zZVmx}qcb3Haw&l>=$4;H~c@ zy}T^%;YY72v-97PN%2hcB7M}^ZUYV}XWxA8CZPCAkHU9OOKvm>a)2XBy@|;Yj3e|= zqGAlpU`AV85C4LFyX+sNE&``k9+Az*ymfX%{1=oSTjlL(YEN8baq(D4c@phuk*Jv*Yo@Lchw+o*?Ud81l$gs?{@uE ze$k%+($tfH)u+Y$(!cs!v%jFwRV?$?VXvR*R@=G8zj2Iz&3h!~v~sf-!AZh&7!ZV& zEC*74Y(T#NDOshC9lx@#wlayJ&{Y7oTYh9DjQjYW)#X0N<-($_t@JFYgfE^(1C!%? zb+v;Gg{ISV) z$}C+e)ak%A&qwy5YY>Dx>Aj1w(Glrhi<4?yIdrRj)w)5yX4GeRQr~bt#7u65$)wn8 zFgE#<|$NQMO<=n zB4kjEa`ug@%=A1qq1`z}nv;#c#Obdp1qmU8WC#DUhw2PHMWMLRzxcOJqmy0;1HWcV z1hsb8Mzgw;H+z(*Q=UDh#{aCjqSCK3p8|foQiq_R6umj>;sP;XB?Hc{~$ z;uB$7!=nm_*%JvNCojsL=GZEw?z^e19+ftp_B#>P(Yk&)m>~!_dp!so@p;{1Gw`tD z>Rx%A_^t4E9=3%QaKupi8=2I*9hm-%BHg*klZ}WLN;t7KNeU}zpMW45KO4Br_KXvc zK^ak_7d~L7VQG}75EFd`Pa6=%1uxJm@VU|@C$%Fs%C2_bHlbv1&xVcBU@oepa9CIT zs>(){rXG)PuYF)20xInu&xnya9e+v`E{B<%w@zJeYo4j;Xa(N1M8U49&GLfqABgK0 zqxeG9bh~PQFsUUMyG|jJJ`6e^z%|U~ZdFz0_Us7}cPAP`eL}#qJT4=sSo+kN1!(== z-pyl0pDOg(^NqO#UjTB0plP@+te#diFmpUtwRyz1_2xR~)N?w@6Q9O%WqMSvs`^82x7ABSzbabdZ zGuZF}iqzDD=u4n0G-!?`;MY;$x^D6t4JC?+(EuuHU9hjiiSkUYEmCt-X8HGqnHK>0 zI{O}ux_@+PUO>{Nc{HTBB2!T`WRb&K+}7HArVCTR%m^--k@p|@dXGFYweNoyE+{*@ zeC>xHEbF=TEgMu*NORjw{Z=&+lNOcB%G+*de?W%&fkcoH_LBRk*d7&xeATXtC%AXV zVZu0g`L8}oM9s7E_5!}F5UByq7_ zS0w2IHJ(WaW|t((9L~K~Lovl*p@H5K9V{s@+=l>y&|DEs z(ldD6(K-dzx_qQW{s0b_c{H~zKI3MIN(C;JXH$VLNS3y>xO`FsCTb9(qr<8h=i=zm z*=$)qigC>gi}u0KeRL)C_natTsL3iJDBZ=4CD6xqF)+Ya{Wti6Q79oLseInVC!)`4XrjS*!(b z$X}%*oy4T2$=S`^({E{9?yW;Y47<};RB~Hi_yVWrJ9jRqaPIHUkc@iJew#pTo2QD1 zZMOmQk%FT%Qk@WWJ9a6y>O*Gsn!vR`S%Vc430S$In68$gdw&qXynn@WFP~okbT?HS z!IRE>g8pgxDQOYkcV!N6Nr1SuM!WjFzS&v{oc;=R)3O6D9dJWNMMh1y z!X}cIF=sNv71PSI;R+=p?XW`t3ID}WxM+tp`GXEC*$ea=N6)Ae86$+a<9@?eBOckWuQViB-7{90sVB1l1s=19^ekcctAWL z6@V0Aw#qC|gpd|>8j&=Y7%@r~UX$j6(Qkma9%<=bJFzNppu36}^n%UM5F9&#SBCnL z0&^eBmtJEvLU0QU&|39OLnqCAUkj+EV#sb@WG#df;RP8Hk@^x~JgUIsz!#c5WqxZyM#? z{LZ~QG;FFd@)~m(3m|^Yv6=o++jXf!4 z?shz5eDGVo6pXi?wQwVhhNl=15Zp0nrKbSdDQUV7@I1 zU2!FnS{1&QSS_g|SNae_&c@Y=A)KPp@`6?hplPkNv8=u0UUmJJD$qWrd%OX z2(x^!A59;ptb^XGCcobyc01$8aW@`DERcLC;Ex^aEwApzMRKL>%b(0E}hq5+<RL z&{Q=tihMzW+hz7(_gj+S787mm_v9<~_xvT5TJgcqT)ma7?*?u*pB>Mc)=lF$dQr_ zFO%0DFRJHWqZ?Y>OrsQ*VNWm5u)nRN(8IXdeD4Xw=!m*0!^Pbp+NTS@m8>~Jvs5k| zdS&crqjcxo~?(MkCj=PlS>M1}yX>x94o74^2nb$d6Prhx>k2Lps--fzO*xXXCPo z*qJn%7bNcm4%wr73=MRYV2IseCP1Z(TWvp)oOaAfPurkKm4u@Y#1`s5Dc=)xkCkm2 zS86x0uY{4-(g5!yr!eKO@8u8hPl~3xJYAp`h&@Fwa*l+O@%CBr-iUN!U^0cBmgF-H zTZgH>Ef<6sLIku0336f%y@dY4u=Qk{4Q;4j92=}PtGXPt=3qP4M`kYMGdmgBkT5FEhMy7(OCDIgT@SLQ0*Bnj`8y1+&QyG(WjkJd_jSMJ zD=qwrJ~YIbA0*kpyx@9JI7T*gM>`MC(Cnr2i)TU~;&zKIUk4M7EHnR}aI&5F5Tdoj zvAaTPzL-N$*E4dgJ+e$6?2UbuxBE01(z+=On8_uG7oI{ME91)d5$?l0)^6&q&qti| z3YM{HLkIT(QGMF5ej&y@tx_Zn=F3SYT?F+F;W@Va(pqUVqws~hgnA{lK%-K2OGJA1 zJr1k!>Njo|xjunn?QD-}?QoAMWW~>Q)3nz>$xag>_-pG?DDHKR@=>c<682SWp2XEp zB4?z05zllIo;5?xUZ)wcaMxPobxu;6G~3HgGg_rW(!ZeU635%>YdGv`w=v!-$_Z?4 z1}o%oRK7PUI+(ILRQvJM;@5Vl#M9pg0H&DFW%7R_T-uNK77e`31q1aDNL!rm^GjG} z+DQxv)q1=>_hY<*=B;rLs3*Xs6@N66?5Q5V?0HxlO2#D|w zxTutX7(m}-!yM!Y$r0elchZ071e&}}rs!gzRS3OL03S)C#oEs8G|4GDd?dxF{teQ_ zojP7BMCq$So`Ou6fWqw?TLx$H=!R({yk;^oFc18V4oxGGM4uJ{}+IAJ&@hhiygZVb9=6^hpep<=bCi-1(tSuWxtwey)Q4#X z6rgNB`jzfSN&X+LoCi=-!McFyy@V1<0z#0c6cG>s=^zFbh%^D|y(mZ%=~bi`>Ai-I zQl*zrq&KA#s!|jpozQs^?tSBZcizl1$e=#mcU6#Vr>>=eI3Wt{ zh?Pd%cP5Ji?CW3-%-G=D#l=d!hedt+K5}*q-8Zr*Frbg~S-v}PJAZ*@fWgWXse@F(<}p&^JmT;Y<)_uf64b)ElnftevXOL3J5Br4D9OzuWw<&qxxy(n z5}Co^ zOV$gHd)I5AVhGDYN}MzGMz}02w3Uo=Zq6ss*(8_WbB1Bx>~mxISv;ntOJdA1*b%VA za$!HXervI1Pgz5@zfLd&hZX6JyCq3pci}>_SujK+%c7;XvBn$Z(P4mPUJJ=upUO08 zbjF%3B@N182+Fi#4PhA#b?O?)@L6i4^%L|FFz6?9dR%WZBS&7hc_~2}Sw&x8c@nC| z=LI1q{HfNY-Rfsa?;Na0uP9%oM}liCieEAhX7i24sn$iD&*{H5Xu*yg=Jz{iu|#~{ z;?`)Y#V4zx^SAhc2Ln=AhN_$waT1b>-`XFqzS+}qDGJ<&n zBoKAUGMV|K(Cs-}1MQ09xCevzJflUT+S?KLMTXWyp|~4ijsf94>(*u%Z##>Vdc7?>kc(-E*)#9}w%Czgwn9_yyhyIdShm!pGp0 z9%dukm}Npv zsnR3Zs??yYE4Z#7sI%tsB{gX?eY-=PaZoiN;4-3BB-Nn6E!JXh!+@)PbXXfN$jzSM$CtB1POX|( z^wCHwVFwnDagGvOcdtI@2RZU?;{`7rcOj`-6HLi?U@e?*s6a~WD<$les);V zHOiWN@2K(0Tjot5dcU7Mci52>^OE*Ms06Fi?I&p6l0OSj1~p{+sX#2FR{9Dc2VM`c zGCUKTQcWifi@0xQE385!`co_!<8?WRev99d1GMb~Xq2HPqNxY`6dwFGFW;OVmK1fW z0Y$t-?kObO7Hx_h8q2mT?YJtlaKy9^1=WyvO}|-JhaEE9&g&%HuwnmWlRl?9lfLhC zy+*$?!A_A=T)D2IkRlU=_s+LMppF z#h-qhxmbfya1qO3K1g3IKzpEPMq=;AsB2ZQI$7E~g#>mL4sSGVVFk`T!tzJDuGXZ= z>I*-HW+Ap~{wy71CiqNK(Dp*7xA<0;uEy9Cj|^sr!Q|j<=bcB4!DY5XyS&)J)!Ir_cnQ)Y zbi%p$fbptfn-X<*il1Q_DTK?vE;sdwo#V!V`S8~>a<^Vnyk=#W!NxWxZmcei zf&1Nj0Bw_##m{?OfzP8w>y8EVkl{^u+@G%|LKTe{!;wvE#m5iV)wL-JiJi6-Odd!u zv-pkj*^>4Vj2&RV`BcQwY3Qc>ko4Z*+1AkceB;*qDf7c`N7HQ)V7HZ|IrfaAwElyEAMHMYr`SHW=h1Rs< zR5(S1cybi!zi#j{_Oqflm}zGAKbG2l+D)JC}*Q-GRmes9v2 zY2L}$;NAR@w5$83ThAPB;`SQ03H;0_sGXY~*yVz6BgJ~tCRM{9pLeFIIJYW)MM$f`sb&u8GP&{8NExy_YLNL# zMoso2_kF`E_W+h^Gz@nsURys}M7EHU1$=R`oP3=g9XO-8(O8&B^Gp3(`FhQH+6+i@ zGB45=jF)?2>*>?re}bUt82-0D__5yzF!`?GD)Tj!X0_bg4*=z(hQ2)zP--=3 z3ZFQRQgogvqiVF7eP08yDllabCq~&$nD(~Xk@yJB3azHQuT4q|9 zuIFK77kg-xaW3FK-!I$R%VxNr(iWV63bc{tMaR$}TSLVGPT)Pz%f>S6V)asqS~trv z7qCCRs=eISG}DAFB}%b)a41&n6Fym6-=Ja<@meyeRYrZ%sgHH#$R7j$!pqg`t_Ry< z4oO%Vv$DVEDH+8x?t~_iPmz{y!W^ams92cha$4WSj^o(}p3=0=xw9OE?84 z8UE!c0O2E z7Y(FkFu&LcnZw(B^SY&hF#Nkk(H?p(BL*b1+^;~HHw2uV*3n7?__P;49=&6dqip&y%4$>UDx%#b=O zk<5d0o~C^N8(J zPFTfVQKnp+cxtD3)XuFJG2QsabN*6^g;$E8Q;@UDwFfKaNX^4~he zk`~MXR-m1w1HI)>fil1D1Zg=>En|GxCGaudOS4To=y)$S2um5DATnSL=WS-tLiSKz zpVP2WGmm;2`xzn0~yaP0Ulf`&uZWynJIsEO^9&6Z}N_ zG|iPGFP@6Wt+2ske2Pe6uA+$!Kqvxws!aR+wn8&lHlj^-n_#baqe#%~Oss4^#-n+`M6Gh7j^805-f^?36)rg-`nH7gwS+I0RrmD2hD?H zfpu<$R>Xixo69ys3g;mFjwGz-{fo+46f?cGutMXq=3VnwUX7_U=QZj+)zUjp_R|Kx ze7N-fIOT^wMF9m(Y~A6CU}%gBN=Ty`<@pFYT^&|_qplVzn+QJF0=pU>uIedvpYT;P z1Ryz?$6=Zq27ks52-`0jH(Oh(?1MPvkMabEeP_EeqZbV%&1;SVg`zs87WZagMC@lA zI3nPNs2h)FL&uSwL!uT0px^1?$NKL9)>vC2eQ<@Xr#Pc>FZ$&CDc=0NJZXHC?eIfG zSUD*yf1j*evW0GribyilZPv1etM7o1pzIQ4u@*$$9z3 z86O5@w~C)?#k&ux7sS{l5u}wEf**$oy_=~XOSMqU3(;ey!@%A8D4Eg7 zIoS4|rR;Q>dZYKaMGA)#c0nb8r!`6q!2K>TLia%6Y%%@~x98Ce&)`}f<&6s>Q$=9ANj!XOkXI-D_F8z15e zH>92_b6S1lIWwyIN+G{lEZ0aY<@=m+3Fr@Z))0m(cldK<$`2O_!BPt3Tc-!8`%9+{ z)QYF%Vazj4p7F<}<*9*3Lnh1JM78u?cDFRZypFPMTE5s}%G2hap&xM{jUG;cgvnT< z8YsN_<77+^N~sOmAiRh|Sa6SVnwI2PmG6WkMB1Dc6r`fybmCbpQBKCUm#|mPuk$W) z@Wm~5ytwg|g5tHliru;#@*M;DOTe?}(A2G8r|VKjbaZxZjHoEdcN5`{;z|BD zoOfG+9^f8$DHa=EXh~|+PglMU06>9^o-n%Q9F+>^g~H$PS9i=_K$UYTMvRj8%55n7 zBy0J#{U#pr)E^>_cU358PA)uwm??}Uv!vo%OP5&d3P6jSFLlVl>e*7`A;euJvnwaP zvBC&NP%T+aQnr_XJ00#aFDR_~B2ck1xh2oWfwG^Cm4mFm1=EFXO5P04 zoD)d-!BQgXB+GaTuaelDVE#C8H#i5Pl0P(A)9hlAw-S7fm08i zUyN?z3455$vV&2gGG0EY@8$Lo00e+2oStB0V#!yj&c^)tSGOKjR;G%$*D_wS>|5Dg zkx6JCrG!8|$R3f?o`@T8V>Y#djEFRkZ+_IWIeJnPG7>D3S%JdMnId^U`P|xY?+_;UEj$tvj06Q`5%!GK)sGXgyAY+M$7e2 zIo5xRB2SdbD`+NT6g2ArNCFT?J|35Jh;63AcUL9Y{}*oB3J_8<@pnNy(Y8qN8SOiWkw(9Vu4z~;Xc zyn2>;ZGy;FXL`@CXV0bBI`Br@^4i| z|I~97Ju)yb@ILU5$bS~R&gAg7u)j-RB>=9~3;G}Fz3szlVX=C7WtJsiLI9>+LB4Ob zubX+r*t~AiwUmFD^;&OFsFj6<)HRRu`9DhhZwy29cg=q_3;>|K?!-TF;k>Ng-{uDf z&RDK;|FfH}3`7+CN8SJI)4z1SN(iDP9vm3(g!W*nA^Y?%ef9sT<^^Tvf2ZF2Yx?Z} lZTKN6H1zvCgQkNV`>*!T?O2#g>7k0kM>!+^{{Y`{Rto?C literal 57746 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 rkn^X{jF z83@7VoSA_Y8&Kskf~|caDTRYikI>hto^$9|*Zr~6HP76}eN}LK>&9AHV}WLk8QywE zybiy<7ZIi+GUPE26WWXnOmG4=r6{I0HWIl!3@@KK)+L-`V0J6XXJjOTdDrV@TiT+sh|%kO#>4uP@c-!=zOVgF|~hXyLyekpm!QmW}%vSat10fV96b?)sjKix_8Af7xd ze0q!a50`#9%yqhi?+V;N;NQWIZXW#i&cL5~pWo#Fckq*+ET8YZ_5b(7ym#a)@4@S{ zPnVqfLH3s|I;TrkeC_}Ehm(h?lxYHz!uUMPiBAGw@%LPsu^{w2GwWYevwr@!E(m=+ zNjnL+J=%Zkf_$yp*i~y7_&3f8v4yEee+5yBI?)YmA*O?MpEaAa9{d| z`mg_Zuk_6mtptVNVD4%t`5Vk-!nuDgTlwaR7>VUKO!U|=cvE0&J%rg!89I8T|~vxKl%5* z1(a_h#BwR>E5tj)3M*^dM@GSx|#OVJ82YowGy?@<0mW{fHwCKfE ie_!>H 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 T2A=%q8Gyjk)z4*}Q$iB}aRd>( diff --git a/qobuz/content/contents/images/icon.png b/qobuz/content/contents/images/icon.png index f11ac29ddc0530b6bb5fe286655efd2d618fb2f3..eb246f804ec7a7e62c44ea9a80341bae18073ee6 100644 GIT binary patch delta 41 vcmaFS&3K`kae_CKYyL)G7KO#J3JRMu9r9TP_RI}PU;qM7S3j3^P6egM76qQPW|cw)1_cIB7srsrfeH#d8mTe`3=FLKAc4(+4*9GC T2A=%q8Gyjk)z4*}Q$iB}aRd>( diff --git a/rdio-metadata/content/contents/images/icon.png b/rdio-metadata/content/contents/images/icon.png index 8cc711ab145255eb8661c9a059b4840aa418172a..d029d83337318d36f72c00c0c53800aa96f62f44 100644 GIT binary patch literal 60066 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­pdu6k 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 literal 60731 zcmV)1K+V62P)kigiM{J_S>hJei*hm@3z041b_ z(ifwQgwZsmjI<+^G;K#l3QZt`l+aPeXoyKe0EefcV6fx*C1V-%uqDfSTuJwN&R(;B zd~415oAdkjKKsa+(TE{*eeb#Z@qOP~YtG;NJp^Cee}sOm?SD)9HRA7yU^WA!2&4%8 zT>Do5sNmnle?|2gQ-|GWIpCf_w*Q~vLt>pd2QYX3z3uh!w;-I9WFNA>)}_b3WWd)$grJ2RUtC$9ol{p0IK?y(tmSw#btW!4!>@%Yj?*! z1ylj)pRfI;QrfTkUDjbM8$P3dAAXbJ_Z4X0K}1k%dp<-^L{L?s0E#_>g4(`+cyijC zm;RaCAE*p((Jq^Pwtnpt^j$FgUTGIi`5J~NS%)24#je%xqx}x}-?eMpK2Wvamf^Fj zw(sJv)$gQ2P@t&FPXXOC_3JO~4|U}Zg7$iTaTGGVpZdKPTEZgqehP@_?y~B6fu1e3 ze!gmbQup@$wCr8{fA!qihx8M_^AY{+pF4|l&n>Zcx#H6KVPlB5O4lrW{r~d@uxjCt z7yaSm1;s7+(42*WrqjUn%pg2Qi!93CNE2TiGwV&_yr(Iq*uL%J8s>_+3$3 zmS`J*vKioQOEI=no5ml&&JtY!Whqeb&yq;-4FKuDj zcl8%-@7p&BZC|e~Ap1MRcOQP=7cKv}wnf%ofB5`uF^Sms^PQtDs(jnRU%>5I;JQ(@E!O_I zp|M!dbYis))ixsa>tPSIh^neczfS$Rtct3`=3j=*`y%S@$FX<$xADTWzp5X3-|y=0 z{-4j|h0pKd+}XNjGx(xx1oG#&@CDmP1gCD8%YA?0n7sNOZH_@?wq zKop|=y7Y~p)gNuA5WAjqc(l#2i2vQ;@3d#By+J|0cEcU7kfE{dcd{;@#@^-MEH6C$ zbM=G&^4IGJe(8BU{n#EZo#Phbi?$KSpUc8ObgbZ}d$!A4|LQGr{hi;TTZg|@%KSzY zf!5kLYC9JDjfVKP04pDdCuG@A13E?c0aWq7FCy`3QF-huO~OJ1oyL&1HPJ~^+Iv`q z-k#p@UQ{6rr*mu*xP9tZ%r}X)x$#EdZp!dE6-7jA+n0(6bZ_@jy>$NP z_3@AW6a4B=eHxE^_!2HWU%!|efqa3Be+ta=g}-&U$SWS$DR22Jcj>ja|8<@1eA8@J zwkrgxRYf5~IUSqGN)MHnrhf5+ZibY0a`zID%5Uqd8!lsIr}#zzI&FOMs_pQ-KNfHD z>@-r_@%;hs=`6klKb}Jt-R2sbmg$kW)!-G})DYyQ)?@d-(QyH$Q{KUj}1#KoO zu}3a_ff0Vf7=}=P?k6Z=1_*^i{JY#$D2DIW?rm)gsPv7U+J?TsWBK2%cl8Rx?qj>> zwW?KeRsr>jNMW0wZ(@Ebs6S*7l~z^3HUtMcv{h#C_fp?jt##y9f$^Q%Ho#VP)z)tn ztrz9;#b2nOedvFxzxuy@6c7E*MO-?+ZX{Ir})zk z{e-^nA3dxe|Lseo>B1LS4a~m4Q@{UP?7vrDKQCYPeOHyY|F!RvYi|38SZu#mMP^WF zX?0RBZTn3sv>^H^RCu>X1OE7Q@2>%%l;Q7I+Cypr&C0Cp-U@$+448@&1#3p=$(4Tc z_tT)4+kGJlQnk=q1+ntFw;8e?Wg!W3Mw~wMc`=iFG z%w@6lB{+HAx0hGELFM>W59yPCatRk-ST|ie(12L}3`&061mxa#?3B0s)z|3NxBYjr z*t*XPT8M~XiPk%V03hr06jd7fUR#MLLN`Ie$R(GAl|EFV)7^W(UK0B*?>O2}Jyg39 zG!o*zPWpM>9+)_lu>P69pDI64ZKG2Ej8?k$o|#KVKBg!7P($SV_!)7$XB`4kfhcsM z8%WV>P=u*PZ$|_^u?RgqEkIr?rEQ#*PIxba+q9x@!VC7RwtS|lfsI>&*@g>$vdp)Qez7x`H~r-k^3MP0`{neF z{|jdG8=%8uqQ#5dLMOELIW`(%3Od<9rJcl5o1gAtb84|&xCpT9r>^*nu1^C*;s#k# zN$a!t;j~pkuK5U+w9y)RE)l;#!X!lEw#z4)A<%|pSU+JK;N+%HWs8I!od8ZKjW1gR zA;anCK&b@ogZKGj<+jj*izm5;O-I}0rh{Qzd7xJleR|OsKnH${Pb~U-I}j><&x=^) zWA`anay+}IQpJA1ZNv;f_RnQwVVX>!Ra<=nHIP!A8`59D-;3I6fg%x;vU}P#$yq6_ ziWM6Xi?qoiR56=hE5}ZM8*cyd3do1?_{T1z?(Nr}%NMc%tSb3?g;#Lu#)W*#-@2{5 z<{N%O4jub$5t;Yn%*NdUACL9&lW$ZfU-XkzhzLRmJ<`KhRl=NDsLWC#yx49kG`16& z9O)S|hsyJg4-^93>@><`BPJ}0G;RWIF7|u;eM+2px6@}BCn3!7c@G?B%cr?@BwJ0YwBpg*XZQItwi_!z^f1@R6X`&Lx$*-sVWa3B0_go&~<~fWXbtPk9>M z_D#MRM}aE>A1zl^%p{Vt1^`mpK_sEA!_+Yvibe^)uY{ah-D-!4!p{*IDy_Eh_C30I zZ3)q~v2lN7bz7P1*5NmoTkgA4Zg}Mf^^p%hj|dcqh7P+Lr1GKhhLW3aFH`PQTNhg{kz zCO&@jN+KfY!-Xz}WZTG5N+1FOic*Ad2Jg@N@Apj{JiryMis03r5c#RKh}^qFI>1B= z&M+jOz54=f6O}Ml^)V&vJ%*}lW)*^e#zKry+i;93De(~N&zljVBrKTDE>OcEV4JZ` zkGP6y&v2apX{EK&0959SSK!nQZgl}N+G>RLgm-d}# zG@QPLaDz4`Bl3{nM6bLG6Qq%rf6q$TK*uzc|Blo55;sHQc1~rn29_gyp}{!- zK2DX<)P`G!{y%Eqb!gy_7>&A>p|w$sdE+SwXjeM8WP(@HCj)3y@Y34^?_C1b*d|34 zSVA$ANM1veZvwNIu=r=V{dGsm*Z=U>%2hA_$C#C) zrPZtw%04RpiWqY4C4i9t4D<>B4#p)ulR1EP;?U_TE733bVzh-q%svs6cG5MZFfinX z@sET>R~f~J_l-qL`YxcUL4RpS{3TT%y+2nfVQoVz#JX$R0vnBK>ZjY{8?h(b6r+If ziT=QqRsmG6qzcm+GrFF*2!-$q1I%dAGV{_wF5lQoAA7cOigjb!$TR)V`5B`M&uG$0 zrFCj4n9$^#kl2FP#CVh<#Fg-a2|THwX@Ktt&VDTYb7{zm=Q7>;Q|u0GP?k?mJw*@o#=D&b;h@m08&t zW^2P8=W4Q#Hu$9D{wjk!72FFU@vM1Vh){+xcoQCKx@mmcOX9m%sum=HT;8*4ILm!M+MkI=`m<9JZS&ZNVHLL5ao0PUcw_!U8t4v0Z=B| zqL4hrTW%r2l0DvpXOLz@Tq|Ki17R+T>k*VE25qA&)B<^XSy5V@(GL;jHqNU~(Sc;J z(4FI7Q*OTJAw2%EhwiK zv6ES2kIMh`b3#Ldo69+cJskmAwec30Q>6oHJoEPxhxrDOxB+vP^9NVZ*?ZW3V( zK;kPD>hX#0>I^mCKy6-33_avivzL)24)DEgaqPjS7Q%!Re|Re`1{>=!NZD`~fzx(* zJm&Ll4Iu0AkxP`!A)cJ^^prp=hEnCj?8o-^c*H0qDhekvZ-`;M*hjcxS^&`KPbF?B znWk(dzB2SWl=mi9A~0K$K&*d;sys$gqCV#-hLA$hf#1^lWht`I!zbP;H{SI@efSR^ z!MSIb`>1k98$f^L%H-lddU9L7<-dN7-1O>yic*etkl)Z?l^~<)Wo+*;l{oL#Q2I)+Jr#Hr_D@k z+-avgO-87C^b<-o4;;g6$`)Qa`4NDrE=1x9NyIRO+muGBRl*!peZ!;LE&^3;L+vA6 zW$_hDihH|+I0=%*sZfD|bDhUw&sk#+_V+HGXw*vcV&tp1S;p#fczuPl07VeToN%Px z$Y|Vdir;gk?WS)^{lWh$8$M^T?Led~aOC7W<(gZ6LqGmo zpTp$~t2P0<7_$w>eRKKdzjY_>c<`rXvA9-LREu^*(#v1X5T}j6<7I4-O!OfnJo3lFTtD!`c`=1P zn`px#qq5pgl!m}}(u@!#P-rIICn=__;LjU4_!9KEUD0%{E$*5y8ozM+07qoxUSMPM%Y#Uj#`DNOb}rRv+~W`6Q@vYelnqWLk6FDU8b8 zs~nav_D!Kv=#;6vG{4tKiB=vx7H$p4mR1^g3-R1l&13?)kD2-n0)_inxo`y`q17wY z!<8~Sg)6Un8O}ZTD|qaq7uSsXb+%&R+v3NK_Z*ph@eFsr z2$%V-)JG=LF(4RSeRxukc>}ial1dID#3?{TiQ9~*m{x#gv&6invY#Ieru8}<**OJ$ z2Ul$(9b>K~xm?&Fg{00rHl^_?8(%PG)=sR>E8y?RoB}4P#BruwZ63D@i(?w-R=7`> zi53I7XA6WWzE&!&C zs*i+~{1k>~UqW?Kc?3zdD1SGbU$plu$?KsrL<>zGnRz*^i$cP$_B777Z<8BdxvLL< z;1BTpQ+xXnflAhJ04SI(w#s{c?2WkkwjYNyA{C9pDv5f87#D?~b1R#e)WW5|bJ#@% zwLjGDzg({Q!&uS@rmg`<-1*S=LWu<^jPtdN=qDf&Kif+BBK|-sXcFL`$1J3b((EN& z$@8m#C+MiZ7n zCuw+qY)Y(%h6PCc44r7f8Y@Ux`B;1+1D0O*XIUF-V*AKzaMdmE#|Qq!qtLpXPz%az zCB+w*%UArB>&pFq;UCC+er<0qI~z^YsJ+i$OCb@CI1f6U7=|vXi*3ZY*QV$r0HuIN zNj%G?_Oa3lB^rr8PR@wbPTnAdVE(9M4_Z<`*(4&vRT)lT^j&Dq&FFA6Ch4<#Nea8n z&-aa{KVx(=cyo(|_+-yqB%<*)-ZCbkCbuB+EmT&~(Rk1uUIKt6g!cqGw6Xz#1n^do zbr52nfF+MAV}~C7`oy1!aDt|vDlRv{vCW0bB&DFk$uVmOmm z&Qwt-VFS?Q92(n*VH&1dN}0kqAuH^k=gHXje}GW^)OV8}_aN-h*lJy)dBdo?XibskF+ckrpx zZ(tNy>xk&l%VKD?>48>ls>U=;)yO8VIwj!N@V`1^un16^IWi;qK8LQZWD^bJIAw7a zokB`;_I|XP0SLlDZhCmT>LdxyW}|^KLH$hsKk(?X6PMceQnqF5{W%d8lpRapW7Mi+ z)u4l(8m1kRsFS*4E~W;QDtSD(Qb}vv4+3GP(~?W^@hr)+a zNP`mYOTcv8NojCJneW^!Z}|4_!pZA*rq=sxRQ3=5ZsFZOd{=qdm;8j3vZboRqMXW8 zF3~`a$P~{)4@A}{I{kNyxViu*_h@V|A(0?qqaktQ41T>Poed37YQhU02Zegrnk21~ zz=nbZET+;s_Q9QH)_Ds;CtkEVQ|9n#1TZ@xDguc9KT75dFq$pQp6jPZH@}di+)J8@ z0N(m*7KsYNs6WsI7`j6bBvONWD<`ep6Ea5);2(`?OTZdjF_;hX!n9w+g(OG>QemHn zR^3WGm4(S^tlc47G;PMEnP)O!EhSVb&^R3cnWOT=tPtT0bcpp2V6~?Jx;T9A?C8l~ z)(`*6Q@IK#lcb+(?>JoUe8Uew$`N;|P&+MUi zcBFKvLGmuamXs-*b{*U2sWdGJ^Pm#J@#RugX62~f`G)VuHMbo}RlukuC;%4nRsZ3A za`@Q0nX@3mDl!eT{u+!qoyKXL@Aj4Y!)Rce(r8H~pw^le9HaqWg-f5-*LBAn?IxDw z56922Y0b$KzcI>cGQt4SSCxCeB;HB)DfX$-Eu|w7rJub;c*9fDGB~xAZ)`74Ybt@G z;k~d~5Fp(%UlTAFzeVV^#U;O9%6rSCE$5;y!eMeCVFVhUF5a+}sK}j>$&5I#0E%9s zfnOaJH*!x~2;Dxc3$Cj6O->_KTm611Wl8umf|xfUtN8JX8G+Cy(GFKwgDSG4{Y6;P zq%``I1UtlPxc_c&HI>;2!Wka_3P zYV)!$RBBXOXoVe7l_;F>ov$>gxoVblMxm!x4ZEKAqN7#`Y!7O^lMn}9G6jl7BK`pM zgS>wyGJOfv729T&))z2KOrRtwmJyUxHHv9+MWN6MwqF`DGm2db50sm^N7NRY8k1Cx z07maL+`Gzy-q8u8d{QM*PJfd6Dd~%ob@po9cLU5!h~#aEg^!RiOz;*X1l-O`&GcWG zBT;vZQi-7Im?9?#Xa$|zHhyNYRUYW1N*tr3Pd<<>9#UYxxC5U=-G0f;Q*E5GN?a_HDQI=e`zjIKJk?UdqcFm{G+D3)Yp^Schk=YX0N*Clf=0+|$j_Hy3TlBkKFU;ARSwsB*e?$qdk5bBAKclhfKUMp zRls~}OKyMQ-&2$=v*hcgmk=mNz*ga&Tzn30CI_7EW2OI4u2*>Ul!`{;3K2V$i!i$I zHr8o`iBbxmSG2ff6o?m8}7PTN(I_C}W~ zv!Y|{BQ@rhX4TsS-;j=l|+=p4KB*eqB3( z#6}@HaPR}^r(r+KRQ5=Zcf31a;~$xAOo$paX|k)eB}!r-m&YRP{q0vZ zQkhjElh7WvKyRMv`4P=HyUS1-B)SigG(gpze`2%1lWr%RRK!U|S2*@5Lf{ zB>r)iSJ%KR+jUdcl)2<*(29BIqOs4d$qQa{J3v6SjPw){vZsy7?6=zE(MdkFPeZKi zBSNQvlu8s-jSG`ljz~OtV;c7DSv2+`;wKx6&bI zl?rGCQxQY$m8u{U_fWz6kCkcnk0F^pyFfB zkGQqGwr05m+InX+s%=zkoz4NYg*KT=&oXaL6&gmXfgayin?&;*W&VTuoPnwMYJs_J zOId7PB@cf4TRIr%8^B_FyPUcC8zeEkL4g(hfYnF@3#|T_0;^V<7=DwfsvSt=_5$p? zPCY)^_jb8yUdd|K+d7G% zRwVy4mM2n*56`a)nPEWF=|}fTC%g-VG@Am-)J}SRt~7iRI{3yV6DathZzNrIToRQu z_ui6})uODMAAP;ZIY$IPHQeMJaVE_0H6&Uk&J7cI_u2peAOJ~3K~y@j>~`PCepw-7 zLAW;+MVOa{$|P2IW)qfVvwj~)?@^*vdd)Ikji;C)N8;hBN{UM26^_}Il92xZ7ss0+ zMDJEaz&HB=jPNbQ4V&>MpK9a-Qo%gVLgp;0F$WP64+22Paq3jsD-j^rUR+hN>@A8& zNKUQ_==R|+ll#B=41jrQ<^Np1^j)u&GCSr>XD|0^;!KM~;LC{|)PK_u2@_yUFWD*s zXG%SOBeyIk^4-Jwv;K;~4}`>8zRlGc9D%%4K&4vyvx>;9>r6SN`0f(?2eXddA>G1!Tv{(i&}p$eBPJcO24JcKnxyQ^TrIKaWs($c1xBw`82^n7>rri5(4n9yV)X=F+R z7STyV;7;B2W&n#hfEl(AZAH|ola*?=XsZL4ox@*Mf^h}wHaxOI!W^6N9&n5o zG3`VhdsVhV(&QpEGWgdClMxRQWwnw-1T-))D`h$;DNIK(` zqV8YPz(A5~PH>tD{j;+3cf&!Pv?M7wv|C*V>2;_`q9BaFX9shuj@fvUrVk^7R^{)P zqcmNDE1KoNL>{IwWyx{|R-_W(-KQ*)#9fLpd}8DxWXy|wDmA>;Fd5JZ%lO<*Iu}9W z$pmTInqf-R*{vGfjfXh$c8%xTx8UBdIx`0_lUKd@PARe&)~SlpxQa)ACHQ)%Mhv?$^>&!IXh8+z%tGbfCez$eo+a*Q1LOVBDxF*1C&I=6*Bk8UW6vnqIm9z2eGEbqr%-aI?au2 z@)76Gl5hk!3JKb|RvnK3lDNBsxc4DOY*xIA>s0kwTYobVEVYtpj967+Mk$HDJmAH$ zkh{O)&N+ZNPF;UnkMLzKv6NN?ghU;hahqzaOCH6-CY7wQ85uV74~>MKe)HLGtnX$l z2W2CY$jFPLj*%S<2YZCYNMoys9omT)Sq?W$3o2so<_|lKuY^XV6xvw`RP>312B8Qo zEgK)HAbs9Mno9068eEAr^s}S9QSj!ZZWBhIW0l!-lM{?&-;%lFL1pH1dSe@Elpc#> zoY^OFGcjJR1_3F#PN^GjN`g2gT?-}M13XSV5WOWj5g}D~=?n^?BTnIxAa5^%=ylP) z|5D*9P1Rv`r}1zG;&o!aPERe?s%;InC*$M|w+|b@;VbWm>p}yycL4r$# zmpnSAl3Pa)K21&NXI0}UNzzH|Bg{BjA4#R#{VF|enT#?zFPwd3EBVvwBu_HB<>oan z6wblfkHe)_Fof7gm!h#GD8khoeI1RQEF_NtjOPubO+Jvp2#l=(7Ir>~gUM>aG|^&B zh;0a?-rRyk83VFSWP4?P${)X*Z)pN^Y( zX6XgnE3!$e%+&z968qM|B9~z78d9HR^gXpR(IzCvo{&SWoG58WByPe%CXL|1m`8TS zS}dV()G&;psa4!KiX=*U;s$j2a-jBWwrS7#2pXyvB$@n7QhorGHjJ^$5~pghZy_eC zK=X}Mjp|%7>SdCeZtYw*fPk~b>HfRLl1n9wrx0WPY%v#gjkon4Y*Q8Fq)bZ`>IF5V z>CE5(j0Q6XAWM_{f`KxBctv{ptB$O`G}v{=xwcbTIebJDHIoDz&=gdPRBR_z9weAp zup%zHCetfO0vuJ7d^nO{Ow7acV|qN9%)<;e$7^D)f$GRS0Bp09)Vf?Q1RlTR8u2)< zI!5_REcfi1RL|TskZziPAt7`nh`JO+z@cl~!aF%XK-nnP7@(2h18~X{f=575GlLnf z#NlAqtDr|GyiB{IGG0?9fH7=hRh>`az;$zUZtw)o~6) zvi%>o2?3Cdud7J;l|)MG*JKv#8g8n5RiTLJRV7?BotsAp<#koMQgq!iJoNVhRxDw$W%P> z*s}yzBZM}@CnRE84v`6`B#gNP?pf&pCf$IhOpI@J^7~N$3z&Kw*(Ehs3BbrO)THc0 ziu1gL#Pp}ep(>g8Q?Ohg$gmDv=OjStkyvHqcq1Vl6BRoQPw z9;tEQDtXx4fi@x{$<%|XnSF?){bE6eOjwJpkX_Ns*N~Y&^A(9hKGoE_=SNPn4O&c& z%^P(D=E&4TU7sF6Qgte678=C_Aqn*0zS)h;QzVO^Fv5`%lAHir_uCJ0aYUZGj5f_Q z6A&GZ`ii8<%nDD!N@N?R-4lI;0PXz~6<*m{z9 z`^*t&h}Fdd`A65oJ$FfL2b7}K8m2{k4v%u9pY08S$AxLI*& zPK1dxa#k|X$*fW(oI@SsQ2;V097DRjanFb27%(BijIwpKxcjPo;9Tt~f^Kb;6hrPf z&BkEnA)Hb|dlG~_(2*Q?QmKfEbW0?YVMC=ExKBo|7{6`|<(4>|No2T6!vdw4 zGB%>|xO5p+Tk)$3jU#FImUwSMt0Nh)!3ZY`L@3(O3(eLU%g}_EI9DUquRPNW(GH9k zwE2JcB#5_8C|fZynw&9P=@4%TT!Y=OQ@Vrwl0%kkB7uB0Yvq6OaKWIFw?dE|oY@(1|11 z$sN)BLGsutRZCuN$+VnxYE~XBv65aPElB?v4b>7~<2u2(tP_<}$Ouw8?X1kt{03)7 zI$e8$0i@}kk=B^2A_114O8Pr5KW zM~YmZpe|3DsoLn6!9s2}Bqdydc>0+5p33 zH1R!@@*B9+XErY%hOQ6r_G;eOSs^2i{%xu{k%DKZTH<`(0HET65ws{JrO`&%4Mm`} zHd$;Zq&Vf*Xqpmz*b3Q`aTO8DyGDS~5V6(ACn;Jyq4L}Z^x3^8tw!|6Lm&oeAg)B_ zqDagd6TVKJb(j2O|by-yWF8%m7Z!t&7aXNb01mqpTIsBkt9^${NP=^ZS9{SVG}y^&G;s-2pfK>+eN}qNf-}{mPFWhfC)xDLqRowALinlvhma| zj%$v)tx;8HfmJpvNP&tVR+d7CldL+qs0T=P5W=PrIyS%H%y^$N$VlNA*=;h~34L)# zRDY_^bnbNy>XblEAtPq8q>h9mOqg;ye<8j;!jDO?t{R=>l5mC;7N%i0^XpS%61R_i zWn9?=mZGlOe-*NV2gLobU>wX*CZfDmGQb*r8be?y1IfvdM1&SXHXf05%>$mIp;F=d zVL~r@76W)q-Wue&L;M&vQxRt_c8v~6w9O$~B7wS)XP{Clm`Gy0l6`y$6M$gA7;8Yz zWfwZtLH}hZpN>+8-Z*`b0RW|t z=IFkE(XV0Zd1COgQ`-wTF3y2v?Xg`N!*+yRusFM+ax!t7MfNpZ47{LxyI?k{AT=2~ zkCHz>$!CKSE@$%x_3Rm`cQzKz$KDfw-1djN=X6)Um6{#@SMdbQJ7D707|~lU;;)2P>5o5@HB(&odM8Kn1{Q#KJsut!en>z*CVN ztL+y!Y=%PiV(MY1nw5Fg!N-d&!-X3LX2y!oHj%rdE$=JLf}|9RFb(U5;;rl0GYrB`)L^Luypi; zBI8kqqxT+QqDmHZokY`4@4{|Z5`jpnABZPG;G?jOeLQ)6JgTGdt%xL})b{?Rm`vX$ zXJ)Gh0u@u6rY>1F*Wgl6wHi2G`vw5bVU#=xbD<9Cv@-L?g1}xf8zb(EmEB*M6QI8R zkQ=B3do2I5oTp|Ct&w7G%%f#LJ&rl^l%p7U(%*Zj2$PD;ye@DPQa0ht3sk~vzk9&P zHl>a}bxZ};iDCJ$NjG&#t3-TB8&0)QGP}ZO=%v!Mcsn9+pX2VLpyA zw3~6Ag5U?B1UzKN<~*;@x)L_btvbP3(C8oNc$P-vm5D@RBLUHe)aK1uG~+8S<`Pn( zYQkHLFVjOpWH3LQ8;S|i@pBm$W}SJX=wG%H1IZ0Ec-&zT*|h!J#*i51f#X3l*9x|8 z?k0~K;-f?*lu$vNpc=$AhCfu|sK+ib*j2HCL}tzPiX!+BFaxAyf=qmni{{=sDdlRr z7PSI?cfzmAm#!;$|Ep!2SgP4RF@#8=%wGpb}x$2*_Rxu@|D&GeuGg$UOf5v(Rz$Ir% zl+2z_UX&=j-G5vaGuo{p`*A2aKwfED1!dM_vV5_I-b$3B#MLSVW_0za??Zb(wmV3p{I+K!+b1spSg*g+Q1d%2*2;DM?ib*6-vS!nX`lYUO?D_8 zv^KL^=AhV^p05~{TUMnCVE|k>=PHPI^`d^V6-2dO=(~#8g6m(Vf&)T4Kr+f3$Mm$& zd1VXd!0PJlJyD32O&P_UcDucDtTGf zaO%i5?o1oQ-7Zl$)TdnZTnFajoo# z>kffs0z#GK6)wiklc>&=*qW(E$+MK96t6mE5HT#&N~}-~*VnIvr~gRM(ggI2b^Se- zO*2$0BrT5M-f$?_;rA;!CQ&LAd;>s=0hb)c6OABpHrW(81nO2q4KOU7#8C3ckR1Ei z3OjHUlon&A?-OLL5;vq|q~@~utJ8enkO(Nw2%Sx9F4(c zL`@b-78WrOkcdE~o$>&UsU*&Glgp@uXtpva&VmB5!6O_zp*!9<9xM=~_WIJAZ%pQMM zYZ;Zsmx~H&He8&-M}y56yb(}sjbp|N zpe~2g{`#W@Z@&2m9=PTZUVHUn+9iaF)2gy76Na$e_vjwll5_Hz32F0OK`ja1JO%?PU5Gmb^AO%}$upsi2z0yK1 zHgi_;j#E;9kw%@yVwwtX2`n#(NIC-1szpd8d>|>~DjR4jQ6O`7$n9Bi5K1Jb1~Uf0 zaaOSnl*k1zKy=8f#}hh0yh&ivl*38y@ql~ax32L=?O|zH{%U>Oa&!Eg%&`~;nXCM zB?4TIuBI$A16ADFBv^KdbEu6#(*CT{h7ehQ{R7unMT$cu4(btBQ7Gz(!!qg02aF-f zbcIq}1KUp`m>4$?9VZdB`)&G(Wd)YIxcB4&Uvu+Gy#2f#cYb%wH-8$!(zde*S zUtgM9DFcf`$%zORu7ufgbTV*V>G@X<_V z<>b{M9iGr3aO)H1_(Q8x;ZfdQPC1Gr69n%98I2cZ9B~adv0N@Iu-wC)$7lGaTTkL0 zHyy=muRDgV`RpZ?_y_6T*ZsLGK0QGx1h7m@3HIL@l#EsL1tfK!(nERa629YASK`_u z3;g`UFW|R7cM*^|WIk&g5rli*e;s>g1c`90U?qsgn1N|lb=+qwThvLaV#WGxv+!2e zuz=No1>w-NmLPXbq1uVnqY33S`U-~OWj{Pw{v7(D8t-kh(yBcr(W$_cG{Tl!@RB=^ z{01gq8Re__LjY<(mA}=TO-c*qrkUn(dnM+vC=FPO4Phg3$a`Y_9=p<)#p@Ug5X^GNxbwbc!CZ3YvVi&q;V7Z5Zp5p@f zK5Gb+8IhPYG6(}m-qKSmVsaE9sFkK3hTBOp;nfhmD)lQb5N|5xAYpU!`aPOc$Zg%fJSCn1+|!Qo)uV`F6*Kk_OuhD`eNjOqoa#S zVBy{p3+&=+Z$5(Wc*T|Y%A1bi*r6?xEXx5;>`hMcbtn9EnLgdyufqd2+YtCc}uuAk$qi&MbSY^F6 z6cxp!xWXg{8G}d?r-^jBY2Q)C%nG;Z-MQ`0iJo!Pnh-0xv&# z1i;V=r>#gKdM^;UsNZ;?w7 zK{H{vRqwOOdykcE zt6P8^ot1SlJCqD`q@Gn}1+up;#V6+qLEh z3q68189*y^M%LC(_$W@p0wqY?ff1uQGC9ai4LW}w8b^M@N*i91go!kex;il6%E=ke=LT*7j; zK$*?VQ!(4vF-ZypTTYIJo zK!Kc~6G zf2yyrK&J{40!ktYQ^g&dBn|!wM;wL|dG)(~n zT6Cnhh$gAi*20cG4FCJCGgsi2V>@{LwMX!C4?Tx}_NlXY@zT&1%nI=atcr9XFjJAo zkWr+&bF{G%({PL((gN(W_v~Oy{di#9hENxNv}F`HVo~2BlxLvMn=$#brX--QW^>Pv z?lL^a080FF0hka;Axj#~EQ~Ad)FdH)H!R_Abp<-{>;Hw zEW@0dU~~p!Wlgm@qwnQM6o315*Ww#)KZ%{i9Lpxi;FI#8;NB*Sc-^M4Np-Qwdwe0B z19rd>)|-ynt`V9Vfx~?&k6J4ZZ_n|zmz~62rw-$7Hy*{$eEb>w%SSI@uM8W3II7mb zxHK+K8iX*iMpXYvaNf}XR6AAPH=Gz~LlR$!lKc2f!@@#@>Ao#FODzhnhRn{=@Tf|W zVv@ZaiSg*>tlo~!dF51L)>}U*#d-<$P&ILdBVr+W+^L(ATzh?Nk~#gA!X-k~msySR zOw)PgLZKNYO=Y4WEtqOIenY2fYOGYad((lodfy4)@4WGPy#3}AK#_szH(`pu=}doB zS$&XGeG@8h1{V+VSq~x}0zFtr1}TyWpd5=u)ZA57NvwJXeZ{p`?BG4G+{XP^9l_T; z@;v_0N1w(YK79!~TR>(dS&zvCXq+_wWGNyZx~Z*lHNQ$-=?dX(0weCwp@f$>3hcN6 znDNM5zCiJ9r)+5xfy!DJHWVfGLBO5FjYNqTGiSh}HotStvu{X%Yu0Ja3t%xpn@%obmfA`Hd z;Pp2iZ>AeMHlRGp~f?H4Q;K6H;;Ju$di+}v_XYr}$ccF_dl#*LT1d<5La@~qe4D_ywmT~EE;G?0{ zI2>U_pkq=LCVpHn_B>JpyETA>Dv7ivJQ?s|ppvm}$H1y0hwr&G8aX}2Kc%HF7B4-U#E-1z%wJTKxR_lGijn{rmsrk^GJ zZxJkO#k>^Ucg-=}eqsl2z3~{{`zL4d(;s^VkDmju*g~0!hsJ8QkCTul%rh#QZn;jTlRfZ7oWq@6f5I1P`e$h_rZLB`UmywM4|Cd83C@ys zBMZo6QsX?jwLwb^C;uBx75x3T-h_LvIkr+TlTYydSabWa^fo>54>}c?0w>q$16E-I zd4sXmLNJy9uV4tuMAfkByYGi>Sh=f;quX;laKmxjb?Okl>ZW7(#ZRBb&wl(FJaJxt z?Jdko^1GO@665dSSb#V!n8<5=u{m{@TAJE6kXpkE>;C=0f=?ZD(w3P~yQU&31p8F0 zC<_rLI2D9|s|k`CaM;>`IkmYCTrd+!$s?ce0nx!SNlIxhKy2j5DrikHNMk=XXL3b4 zrkb4?O#ozMzyS?`9(qQRlN{f>9#ysHS>ST;%3d__j$@wu#qpJv3b#RbVFG zju)cpS7^wW$eFhif;ruTP&+W{MSrIPv*QZok}FaOC&ej=QfV)d&DWYOP4G%!Nl8>I z`?KI5zNT>=fKkW^acFfC!fVb&s+xP3&_?iI8$k;P?%DykV=YCi$7O8Sv^@;DcnQ@Ew@s| zEcu$3;6M`tZ`c=5BrpM)`6vNQ^j5$t^*F(p8cK>QcJIla^p$>86rK!2?Z%0#A|Oj zu~HPXUn#w+#6Rew+@u|tssz3e3GqRUNk%LHL8Ser-Jl;ZWkP7Ni7GLFM&?Jao1I<}=J@C790+?W$VxZ|AX;1hB== z&6H+h9;y@CYSS3D3sOZL1T2)O%rQ#l z(;m10Fde_!i6N-+I4M>L98@59wMp3E*j5ZN3duOv-k(+OI1m+kiX8k-lvH8Hl|OiO zZ;8`eOZ+#lyBcqM+41JOE0dJk{LrnN{qMKHr?7=p5A}YkzfD_|b*KA&PQmNi4ki5y zyEb?6iKH~(DT=@d&*J>0 z8L;Rh#6F8p&(~;UjzKo=M#Z`lHO5~dQ{50nF9=rhy>u^#3_yQAXm9P7`*5*Rj!jeY zNo0@2d0wDs^xRV5r9xjUZKPtX!1m@d>3v4~a^zeZjLU4APz_8e3=VeGvd{)(4yx|W z*2^3bHPZ(3_fN?%P?u8*YY%vX5@5NkxMHsOfxA!OJ+Hb7K(veAPrbK^@1Cq>y6I$3 zd(cyR>g1eaBIc@Qm2v1M-#ZhnG{kfBX$C{gWg?Ol!qoQ$hlacD8aT~{5& zt4<%nn{K!Q-*fkA{F}#Kz%PFKdHm6ntt!}>H_*@@D#M;CIR^=XcEs%K?a&(pK8%%^ zZJhXbtH5MFBuf#MFgZ<$U4;!&ngEXzoLQ^TfzP>L6tzVr)TdjyL&gJ2{aj6Rcs3^p zx_P+dk>kOXj2Ttj)|-37GFpUAfmC>Inmff%0;^Ft6E_p?OJ8fn0!zH>rXBp?mtSXL zikr^mHv!82Ed2NOJHa<48}0YG_WN#m;}}POPoV!q3@TF)B4-ZRh*>wnET$@;RaKEP znXFN`Z#uq%n~opC{Z}8sH{X6G9(wK)e(jOx@vD!$h)+Cy37BmSsYk`#rZ@}H$UgLp zY0QWA0|m}@?bk&~pR6(=Y9dZf@YoFFOJ6%Zb=z=>!a9IRi<69xb68*jjo?ZsNluKmVT`+T>S3*2+nQM}>$qxkM~yZF>|m++g9zkpwV z>>NJ$xpSyGvG!&cnwha!7<#LJZw<~`1!5eVXiNhmd&#F27x)XOD>u=R!np%vj+=4f06*gG_ z2lWD2D-D*3&4PqgjPvxiZOQD*PPo~pg*gZda??sH2+i7$UVU^MS0CNRmt1uOZ@T^{ zzU%HiJb8W>AAagQe(#BM_~7R*;N#C+0+s?S=D=(|PzD<)EpQVKHtc77%~XFVfeh3Q za}bC;-4ukBtRP|@tshkhBl}qT4o{i8X!kZhdg⇔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 diff --git a/soundcloud/content/contents/code/soundcloud.png b/soundcloud/content/contents/code/soundcloud.png index 7b86a0bfd45bc5f8eb9541e422c8005e5373b736..0da9a23a2564e3a009adceea717d70f8872e1492 100644 GIT binary patch delta 20488 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 LNkvXXu0mjfo{&(Z delta 20520 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 diff --git a/spotify-metadata/content/contents/code/spotify-metadata.png b/spotify-metadata/content/contents/code/spotify-metadata.png index 8e85e7160f882c3146b0b959adebd6d85ba8cc4f..4b2824c174b5652ecdab5523f3bccf9e9a288fcb 100644 GIT binary patch literal 131226 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 T3csUh00000NkvXXu0mjfPXMO0 literal 133847 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 TV3_Bl00000NkvXXu0mjf9%if$ diff --git a/spotify-metadata/content/contents/images/icon.png b/spotify-metadata/content/contents/images/icon.png index 8e85e7160f882c3146b0b959adebd6d85ba8cc4f..4b2824c174b5652ecdab5523f3bccf9e9a288fcb 100644 GIT binary patch literal 131226 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 T3csUh00000NkvXXu0mjfPXMO0 literal 133847 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 TV3_Bl00000NkvXXu0mjf9%if$ diff --git a/spotify/breakpad/client/mac/sender/goArrow.png b/spotify/breakpad/client/mac/sender/goArrow.png index f318a56711d43d1b8925f1c26e709da0872dd607..14eba7db1575f85b2d88708d1876d35675258cd9 100644 GIT binary patch delta 159 zcmZpdxgkA4f|G@rfq`L3wBwbHih8{D5&=FTu0R2-Ak17w3n;-+666=mz$UEa>Jgi^ zxOp=NP|U{D#W93KHaS6n&)YO5A)!cLUq3KGK$D%xo$d3dqHmv)+CF?LYWoz__JxU! p?VFJVt7wZ>V^%{}y966UdAg`>++0&j1_mw$22WQ%mvv4FO#rrTC=CDr delta 206 zcmV;<05SjA8;2Z_7zqdl00011bzJAMAubJnqe(+(me{oKoExEXA=-oiHNNb z$O*La242E8hw@N*0YM0MVj&2EAXsF@5H`WLS>~H>ei%0RF+qhT7E!yR!3i%2F)_yq zr8H+8aLZ%o&4?LhC~(Q*8Y%O>7ni8AxbqPGqGiA?j!PN7)bV|0Bi)k(YzNl*POCdP zT9aw-JVf1#n;dscwWsT{?!{*ubG&0wktph#4|s%*_}AC?01Y`D*|_2L6aWAK07*qo IM6N<$f}!kK)&Kwi diff --git a/spotify/spotify-sourceicon.png b/spotify/spotify-sourceicon.png index 8d147f4fb5df7edaa47e2ad598dc864018508cc1..d426d24acc9ec6da3bd13d6208a2fc320aa9898c 100644 GIT binary patch literal 329934 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�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 z OH7esIW*qqri5l)y>Z$0GuU&=@ml9DvBYx$bg)%bQA=wjgK`z?@adccm&oDPAJ zIzB;Xycd+5C0P{$7!g#8^Gd~*X#YTNeZjW?QJEKN$eDZm$~Q?T694_5&T-{pFwn&~ zl$Dd9N>+uQ0q}O41Xt0S?+1Va!hjtID1HNDj=GQZ;t!`?c#(DX7A7QE@wXRw_iIOz zchu-T9rWxe2#BxXhH*;4E70Nsr;L=mtYETA0A5UiL_=Mb0j2eGG4UrJ*jw(A`?B0_=!YB zOg@KBO__d5gkKps^EZP5t22gc%tcIgEy ziaWyQxIo#*&dewUNr)i@su4eTXZ6oMz#?X~5#U1g2jrds>R}wYlu!m5Of%p~_FTIG z)S&bC!ApT{*pj?A->BQB!n1D2;LX{2lAj|YvT~ptBrMmExGgL*Hc9qjRKxQ!fVY7b zU>lKZhZCn$2k7>+|#{&m?kly{7pRJm%+T_5^m{{sMCiGGmAnKXQROr7XMjB}T|SXCpa{Z+rERh)3|%$zvH62=Jx zi${(bYhm3-&2i5<HRU`(K72@D#DLoP@?!PbLOppK zAnckBkTHNPaT&*uSpp(t0co>NQI|bvj_Q*z9afw8Gpl~#PoWH}U<4r!&0j1o&de&+U2gjet_xbZ>eG@OxITnSvkLixnxDd` z$p}Mpk73%J^M1rQ!+5tbp7x=a|Mwk}gIsA6ysrnYit-MHe3G#SZ5MI; z?Glv%nvJn|zgy|wB{)g(=d_>8QT^AfYv|ZeE~Tzr4HHUhHz(9;f5v-Xg*Gghls}pD z%PIx~UlK5m$_%Ffw4A3a`9Tc>Ct)=pgt;=*^j+AtN=Fyv-Q@0_J7DbW`OTZk*o0QM zo^5>k%%VhP=(?s306kE54O3z_x*C3hvELp#(2(ssWx!{BKZ$bL2sQ z48!?C*N>M%^B%2L%|H$8xNA)rpDh5l^-LXL4}xErPN8&#eYr}v_c1`Kt6QRNmr~C89 zZE(wA!UktE!KfH8fEFbKbVkk?gmyJ>$X$2~Kpg$qi%-Wp(J(%`yT2D8;mC)mdTMm+ zSvK+@Yu?IqUTdU*7PWkuB>C|QDnz?p>lAB{X`p@Xn5O_DJZWVjfs+w#0cI=|_RE3% zbcHoMC+aos)c;GnAHZ+u#acc(AIvq8PfgxkZ8o^ZvihKP?@(_2!OqMjlk3g48F=1s zfsrah$?5*s`6z$`xoB1GV>edvU_ptX<`XbN67b$4%Ky9CO3-;93q1glyB1Z-iBfn_ z=E_NVD&of7mm8;3|1Xh3ah85G5*;5K!UMN2?_^ylZdCMDdA+vIYtk)J#9B+h&(zJ6 ztST3Rzlp&!(n5pe6sa~}DYQC{kifsK4>-ua=4HF@LMbO~HvaMPwR$zx=1l#?soiTpQ*j*yH(nl9$3gO>hWMzN48i*n-M z7cb1b*tl`zgzRecQ2x|j^QCFjF-3u5RxL}x!IGWI*;kU5_R(RJ7Gi)C|W*sE`30+yM#YPwWw^{=Fl-&RLL6lEEnW<7MT&OT-f*bYVw5IO0z zHZo0a?x`GOSd{YlUZWFQ3MSM1MtzmK%%1y`8l$c65-l$N3|*_{h)2wk!dNA;W@fHahtaX;W>FgPTRz_WJJu zVouyHyoKT5p7FLHdnjdK3-fVBQs_`MXaaA9)nxzufS zP)@o*^FGGiPfj}n56p`7gKRJ#A3jpQ0fL)s;f^hI1&ZfF;_ER$<3R#1ESp0lwQpVJ z@=I1X!>7B=CUGtb*gP=uKhe15lQwC=XhXJ`fC_pm2ImM~w*k#!GO8WH4a@h_b;X5{ zHYOCd+j*&*+C$LzHhSnrsWdOE}iUp@mY-xQsjSq~}i^hIEQ)DquAr zl~11I^@MxE$egmgK|w_fBP2pA-mO;z>ismR>94NE3}u&OA`G z<=Ebr0_8*z5g_YjSIDTw(_zeKfc695`J7r=dBp*FL_$afBdW_R#Nt=wvO`u9>)tu!iP74>a(1}oR{xE6&iA% zv5lFfC~(~5592qyt{h9b+&>l-JQ1WBqvK*Ja(^f1mYK94=8Vw6dm~MzK77O5f zH}20{JVC_oHl?_Z)mPqG4Jmrw?#V(l{XvAgsMU)B-kaZ-K_|_-_Oag7jEhTb0Xi#z z34flweM6erPeFJp5W5%Ro$-ec)RZR_Ii4PgzF^mpI5etNqKS8jIH)lLA>s-Y46)q# z@Arj1KEpi=k}+w7>wGh{`kI;iRhf7@cjZG^w}L*Ci6oSF-pe}b?xQReZUJLwo=4w*%#a27ZdGcVk~FA-YqeTNo;-OtH%bM}PjmVm;XiV4 z&nE0?7pxY_Ot=X*t~lFMS0|+)ee5aFu=GfYF_nm%$Rp}mnp;ayVY+*1hb(Sh z%CI8$3O}PLe~dfUeE=6^MdPk)QD9{51_O4Xsea1$Gx_wG>B_L*vh8cHy#@x(8Z^x$&eWLv#lC0LStb)$Pbx`vu{QS;IV zC;n6$O!xuleH4AA!*)gnT(rm1_gkhYW8HJUBtLlo8@d^~7MCC~VS>azp)8l86xpLK zhvn1?HZM2O>JtOMjHg%w+;~4J^>0dc$}#w&T(w!xhS-T4pY072-=h96L|6?rPAyL0 zw9CULSA&B9E*B*HuY&B{%Hjn?Y|HzZR8HORGk`pYg61om*YFMHAHy?N3#Yd?yDsyZ zWiGvNbw`lqrjxat4E5#nJFRG@?iq?JuP3H~{(=65;KyvOneVLBOJ0$G+JI=W;|k~)4Z_Z8_ufid8&`od!H`k*hy{%+S@C#0HtO!7=Z z5rVr`9dvnMGOh0Csu~jotMpl<1RE^cs{DO?2sKz;2z5!kHRN){nn_8pe@t3TvMKTh zf>2Hf%iyFW>@(bDfbLKoXn&pF?ouEZY6fgfzs}NO0fPkuyIE2|WFkGLIe}z$cz#{n zo>RMP`|!!mZT|`<%%M}hw`0zVuhMEz-r0!uKR@&T{4vSh4oE#;u(A-U=~TzJLg?I& zA>NU&ZNN2VZQp@@1h$*?BiZhPzW*{rgi8gwliLRDWBRDsfRtG~4#uM2FctKW_ZbYP zC;m32e?hQndipxs`0PR%1OSMZY|!yV;WD6%<|PA*Qa=?a3uqpz+9Z$jVc4w!W zuS_UG%5JA}o?LQz1+PZ7CxqoliQe7gylHSwb8rBolaB3VM6t7CE1-b5)rDbexWZC-nhyY8lT8qzX|5vx6*z6bo`_p9bVUs=Y&q}kK&UcbJ z!!Rgm-xDu~)Bl!{qSHXgMVuk%SG~}RU9#f+EZ&jE6a_KNtl}T_H(AAM#P#La=$*~J zmfF9+GFaGlP~Gka{`#aJ_cW_S%o08zafBB0(td|Uv;{MhH=r+CBQkc?Fm8AbjhUY> zWstX0nYTZ`JvOf!@$6UH~Q3h;uj1*y`V|0Fx@Atj$@!dc8xr667tnI++bzw+RWPdOeW}z3SR>DR;A*Bv^^# z$&04LrNawxan4tHhp5|JsN(C0H8A3)bK(``fMhRK&rNk1Q^UK~$V@&YcV2ygUe357 z%E@XK-cV22s&zPt8 zC%QF5t8dd_nrG-~4k+)*vvRotqMo_3Jw3F2wUEqWUPSmm;M473pQaK}@9Bhp0wRTC zJevM?36G_&onAFaDP0g?x>K;yjnZRA718L<&)kITAjJSs3q5ZpU{CluZ|j`)n(zhK zBtvTOo_VNLf(~d#I)X>OI+N>H$`}B9ye;Bw6htZqLI58Sp{lO2(Tj%U-VI~#H> zuzq8ZMBll~)#ji~C{WL;ENK_9syHgp`^u+xx!=pFNc1IV-FIRWNm8vL8LIC4LxyV> zjUZ4_;Pr#C!?c)BC`A)hcm~L7l;ItEOOXy_Wm@x28(GGdQ*8Q$Ic>@)g z_&0VGW_Abkd7zYx!<6R5EcsWMU)u+{!;lanQ}SdiHzB~HmFM|V&PD`Izo08I?*LkA zK!ncTgfZ-@mlqoPg?U$lW-Qw8x>E1$P-1^UA2Veg6F$np5cH3|~{ z4Q0&CC!j{MJ~Yd?SDiC&o!{}FpBknz5)2{z%mlfffk^N^C&_xUZrMQl)@)x_XP8K} z?+Uj_%)IfL5;%A;(vYdUHT63{&F%6 zc!h_sEC*y7BWF|YBWD|0NW|vk>3&7IGVDq7(m+4JzmkL*i^Y;((m5WoLKYf=ZA)+D z-Uhr~Yz78Mf$cuQTl$KFM*K0`D-tV*_hqQC@1KXRfg0n;-}&*pUuWWYWo2ydY#lnb ztB>iNQZq;&crQ#@V4(N^&Ry`J@H_>cJI30R$?xcFIe?&4K`n0+j6KlM6owk+<(8tq zFL6mY1SATMIJvq+ku`Z$ypW}^Qe!Ke7f>Y%2oaA&EPyL%2U3c=k@F3(0dIY#v^{+n z7U~ucWUx1QfahjSCLcj~uwlUrYawUQ7KUxz1!36~?$KhQ4Cka{JkF=O@2)mcM=`<< zd7`E3oz^tP?_9zU!23FJWT-VHA>-$D#3IOwtd|3ro+u=-wtGiB@@4|f2&k7!L)4`q z*d569BjjvJ5$x^|>#s*-=w65UzE@BQKkB!Pu>AjBPv*>G7jOUv)40+4#&c&V&DSJh zkJC-ji4a>k?~7x*Z-CG9g*pSp%CPbCzsqefDAbwj91s0CnB zy1RE#@Yi)T%Y^h%ztholsGqNJ*|BOs%s2XduQT)S7>u&$NB^h>qqULo6 zoT#Tn|0O^eFl9gQd<((0)Jg#S-$xiY9jn;>cHsliNjjHCA}O{Xv==L*6Ty*)#-@Yh z4KkWqTv2qcmYwqrMFlT%yEQiO*N9?%Bp#vCt-2X1)8-mXIa#P_qxVmy8oqW6b+?r_ ze{MhuO*N!;t3F12jeVfTM@PXFX%$4~K0`}#H&s8<6-@bQ*iuxc9ksXJPI!#BWt?6MT#bHtYoS{spi#9>udw=5O$YpR zIon#hLySfI35jAk+2|q}zQ6c)3)&C|L|kW+WbI%%_YQ15btGU_-x0j9eNj`Gg8#Gs z;d*__{lRN(5+8%PJ_PsVj{Rn$C&M624Xf{+=1lR)Q1q=WMIch18P4rJSkvn*N!-D4 z$t5?~OEReu9X_Q5%e2mZytpJwxDw{~3@jgk&jDN!-nK6NjXhJtSrY8H-Al>>Vl@x`2`;cp=~4`5LA;85P)WL9C+ga5|e4~o$Pj_Qe4 zMw)}$OA$;Kwu5Q$5*AQ;OmTxG26^&si48qU3J$rlpCV~4^-Sv9p8s}>$ zSF&|}6e6|MV(1wzCw!@>=i$?||K!lj@N817bAA#(DLl#>ct3?G4%gVmDfOv zy_(K;uA7H&#D=;vsQew##z8t+wp(PSfliDW+?7N@UR0Ru!T3dI>vOTjtX4T2hn z-{3=9p8~UARu&ZAf*iZ_Q>_@7+B^7y(UFJ8khMwy-k8;QN>0Z5Tkrl`D&4T#vkcK& zwq8k8X^b{VVrU=o%a<^XyAu2}=Eh^I#Byb~C^obg=T{T>*tZ+r8_N}e`fmgCh~CVr zvps#}51yvxXKTHXq<)i1lwyDo9_}fOgRw2W@K2M#?ES0Oi(+tNs?tpk)LKz|J^-j& zK9+$oMB$Go0&=KP!sEX;xt@UbQd+pi*0y~zTFh!^`eqe_4n`@#d#Ud2PqS!%U`&&P zSqrR3ND!4_1DYazAaAP>!hZ0|Co(LDeohqFJGc8ETXYmEBM!rGq^}yipw8h3qlyni z*{#Y%92#=6+Yq6;tYcgu@8nVHqDF^I;L}t!p4Kj0~@`vhK zq{B&O#^S=&5;cu3V{af7D+OB6_MnOv5kBC7;gY)ykToFssG@(uKVW&68dfg8zVzS* z77F8KZc?FCoIA65nKNbRvAJH=W1zjGq2=6EkbK)x54hB#{-ha{7Kfq0rMw0qM9CTr zp0JGK*T(B+{Qj(7QAn`nNRrUqyD5ZK;J*UHUs19~Ui6iv)8z0o0JqR>pj!~ohe^;v zTBDh){0VaLQlmI}f1l?<`)Gmx9!9R(iLN)xxq5G!YS}X)d_zuucSlrsqrLreD1ry2 z5+O=ms`B>%7Z1n%p@zaK?oD)kOq3XR@11)Hb`U~JT6Bi0*5z%H7DG7hTTJv=__DdE zNU?0$ zMxa}ziRHn<65~y-On%@37Qqt?f!CPTws!gm$xS-+i4ayMy`U=wgC4GlmSBaDo2AX^ ztVpo~9!o{TPc_PW#M^hrNU>}jGqZMqD0|=iU>?=&V6oeeK}r*y-L0-9N$kPH zJ7i(oij+A(Kx-WN#|H5iuF^+dxB$so^;RPl@}g-*jtT`O0XM$-F{ucvV`m!*jDDIo z?Y-F36nb1)Fh6@saOmo{T;Fcj@SG)mV?{9vH@;X{z1EBwKTLkA5p{A# zMNr5*gjx2JEy%E{2V_xJ9Sc&~RQKTTOf;(^}Pv`q|vd}bKL zZnC2I474O+(9@3#fSbp^luCnwGBIEk0F1fRfz`dc=U1@kzXxN7C26uxZ926Qwj)k; ztXG_>LOvhnW}w$M&QK~f+D9lT&EUehw4d|w5~mGhDGCZyPq+N!qPEUtd727j-9z#4-}-YLxlLQ;eEx) z;)j}1NOV67`9_(6XBlow@!D7DvqJ^DjNh#31wIx+{kqsR{pN~%k zPySRKaNcin#>nEa)*hgl+2z*tVLnM(bEiJyv;&W&La@*2{d(i%%Yf&et72`YEW=-W z0`d(B)pFV8%5m&2EmlY~1s+?R1gf4 zhTS=cAf_QjECmE^i}CtZ+rGR)7h7Xg67}q&8T!cZvqI$nzrC3Mf=bIfau}fsQjyd( z>zz(PxgPEd-Wr!WK~0pEAQu-dvoNPgI-~yrX$@vBrlY5Fb)!(5!fs``5Qr>J0eN^^ zb6t8z5%(zm#G0;mU)Yj~j&D>KkJTm|2fPXtu^qAR=uH!XBo^BpL|`#>=iR2~1HT}S*>mzKP*E(# zdRaeqv-u?rtO=e1gHJ4foaOc%s{^XpF%>^@luZh_)N?m7hKVC3Jrr+&fO?zLtj-S6 zO$RUCuQ4r4eqeL8eR|f!jA~lW+mC$jZ%@rp?OR%dySs-LJBr-J!7nB+jdr>`F_%X4 z{uJxSyd!wkdm_Csspx+{<@FZ01Fm^E-q4yU&=ZCeNSf8_jb5e9E58W z@0tibNe{fGvUeJ9#a5;0*V^S`nK^5$G~Xhp{Hn5A%}i_LCM>Iz1qH2vct2)RIYNLC zf0WQ;j`v;@yyWjgp8_qPfBDUW zLjBB{*Sx_y-?Aj5m0R+E*~uGx)%^o&;b&;G9;JuZdFjOo!41FSP}Al=V-m(*&OK#N zEUyuHUj%1SbZ3G29Vc^;6N=7%xNc4Qvpxe67Ce;tK{F<@cdxI)#nIH}Wf^%JLN7!a z<+(v8B0qiktL?+$LNb&Wt4;#f(#s8{&Rfr zv@-hyRJS+ruMfVtJ9WE^OQfeHOzUcHoJI;WPx=IeID2&c@!D^REN}7=rDNQ9vFoZU zWuH{vPmO}1nN|YV6bpV?HK4hd`1LsRlsfDu2%F2y@Pri>Kg%yogC#CPP!yf;_j*dy zHq>4QdZkie%oCEmfxD2s3nZQ}QjVpup`SF^onb*LLZF)}hK=P4jvJmDvu(y@SQ{upvpBZ|f&2=P--X z`$?rXXV!R!Zs+JgdsZSFG2Zv{Osxdzupn@y?!xK@+Ir!3X6g4eCnrbl37A_oZ2fK8 zKAYm{C=aZEPt)mL_5dTLaWb+*IRvk;r6?L`h@=r3k|T&o)R!@#qC~ZeU9}mR@jz-O z2Rz0#V{=2Vbvu67_vaRe$)Gvjb;2V+NYY2VhzfHs z6(Z>zA4YxTSnMC%eoNBMRhb&vrc4Sg<3hs689F98P8Zhq`PLJaT93Io6%U~kr<3gd zTW7BXGOWlW@Fqs^d$bvg@loO>uRE%RC#yPW(DUv*18?4Ia!1l>=3jdfL>D9)^yFY_ z^bom4HpkQ|Q(JOky>qA4?~G?VwBz#ax%;RhyyYZxR?###2qYGy1Q~B@S=YZ`q)bzo z>^v#Ae3bI}*2`8YS=CyLf5~ChZXhODlrbW~%VJ!mAqp4208r&7$o&!h5yq8+;m=n( zM*$?`ukG?1k-jbT&Y$cXgA6SXZFNAw&%k@88b&0M(aQMufP_(qPm8grYPb60A6oeo zt>?JJWDw#-f2&o4X^F*S$exZGD8o~Ck$R8QAZzhNw@scl=k{#?x00d)??tnU@lwZ_ zA2v~hJWCs}SJii0x(`wUP@gKV>qxhY@I*!A0LT45;egq8+H1gd)ynPWY(pS!Q12fs zlPvK<_3UrYyqIN+Pioj^_4t9*QQ#^X?7y{6eNDNV`VGb_x@GMX)VAwax$XI{&#N2u z>j&>YXl6UjwRLV$DA*3#DtI#(!6h)C14N?WqYh@R=?<){44!SK&0mrhYmYc9(^Y;c@27K?_3=~~EpAT$5>`bb|ZS|a9zP)^M7J3%?+x$}Z=dsE}tK|BH_Es>%?9ujR z$JB?HqxSOec@}fqURz~}Ms^T|uT}6A&2B0+u@6kkwj<9P)=pgoY${Pfkppx8zQ%=f zMg=*se@~DiQ_2&E%N@5{3;RO*70!{=Y-MXW(WqD{L{mMd?qU7hR}6s8_{i>CP+%AL z)incula01gVRopnEm%eAwM4KC%tY0j%@X5WAwDevJ8We*JbAX>tO|uO7-cfSbnn8T zeNyzufea1qf&-=tV5iCYKpO~+_0~$s7CNoJ+K<;~A&NB-fmyliN{=JOpe(N6>kG~~ z)n=D6s42^c6s!mKW8f+0jQI&?0bREMVfzaB3R+m4`Sv$4rSTpn@sLI_mjjK-)Q^rs zd@UD(E)CD2Y#MDpmE>d*4hk}46)jPkg>4!i8n<;v#m4TSv2)LNY}t>L zMi#$r3E7sMgyM|311(M5rW+vmHsxO<7)sN_sd)~gA!pm+!JgzQ#LQq}#lZwK$F6jy znGLn=V>Vq$%6QwXup?jT=)vkO&Fzy)O*!`kUaKnDIdcrU*t{1KburFvRA#{PmF}|iAJ+NW>emeZ zi-n(C=fSyf%1Kafj4w@2U6b8OFRkKfoe1%P=EStsuE4N18G*fI*<+S`gR%=s%OZEJ zu08P3R(YQr|Ij3h!z9_F=GzY!n}Dp}`?7xRJ|7hat%z%<5k3D`JE{ zma82Yjw^F~7pK>@>NI6x8oAY(QLWt}<8WZcFV3>UayRyLx7M_0cV#2M|8PXx_Vk~l zt#2s1izOoiHnQ+6GL7HXc+0PTH^`!ctmg^DTY(BCLyC zN-IR(LKe^4^+P)J3kCiP%)O_%@D%=x3vKJRL(;Br_ z?Ff6E0e#qnLwEaAId9vT4ef>Q@~0C~3@;+huId9Hk+e>{8BeVk73{f2U9y$NUpRAO9a5})fvmN=_)N&RP^ z{)=&qdeuD}p0h5OQi7lvT)8eEtlT2ZjT8mtfDrmeF0~b4CXP&xh~}2YvvFo#hdOTn z&@-GTx$ahL!i!fR`Q@CUwywTe`pqb}W7POb`w$4*bsbTitBnW?Py<;pzbXJ@pQ!Ee zCS=mbLif89L5NavW6k|qO5zEi-ZbE_$zWD^#S*1uqG*W&-Td3MFy$KT=f8_o{0xOsT^KTGsd@Rqn%vS zu29(0Xw7aS-27fLia4?gn=OKryv8bYufwcKGOIC}5gs^5RN)|8Oqlb+>P20f%AX_n zui1fvusJ&Eqo?PY6Jv4*wzQ#rb-yb&Z2T`(zq!rHO0v{uX40sQZtVs-nRHFA@p&wq zPg{jhG@?k2} z+Cv(YyW9>V37&E=a;I5lsSwf#ZWL45^FVH%FMQ=dQK;=5f#owthAFWb!OOwEVx<&> z$mb;9dp0};(o@BUb4qe5lCM!HE#=4J%|f?(TjV#%HQUqM}m9UsuR zY;Q+0V#%!cb9rL5b?{L>?W1S;4S@-#xi`+NpL)UWmL+va>Ri%Oj09L1ZO*VN5FllI z@1PYKlfj>5&%V2=P@?j=QN@ZlGx}w#LpfSJ_d2AC=3ZmVd(s)MIp4`7o!5w8?Hdq#1JWeaD5xF^8KlY8|GVd3x#&cwZy?UY)~QUT&r&SMwyhq7l*euu-(iNg=hlzbhK9L*@Gn&ldK#v*RISK`rwS%Ac-Fa$C>+7%pW@?~Zg> zYqmcjA5`k~xrKDU2P^+T`rCQ3?s-WV`DEEG`>@S}R1#K8PwSZwcVo!BoHGw+syN$# z1&O%a!-dRBnvO;%6;s$O+=cnrP@Vzxy56Azukz_zL%$u4zMr#Vb7W9-gp9N=5JzeWEdNlvTIQj4= z1Dlqnhw_)nrtR?DVQazm??z^XAO$qFeN{NB))km=Q1{}fMy1t4Gv^yt?q}Zt)RDT? zfX-m8aL0iiRs042P4<537yN2YcK@B5pSIIM08=nQysf409D{4u&#dcz*nFa>1j=X| z4D|4RwlbR~H5_1=Ep^nal=>z1X#QgnjG@+x%?1R3XaIv=KbkxD3yt-6Z)V1QYxUqq zd+Ol5`+q=)@l6pD!XM9-zDL?^njT>{SRj=i3U82K?q?$orc`D9h#=1T3Mz6;+3Px$ zAnMs`$G4iRwrp%YFQ4ZpjNASsX{8b4ofWk`M%rhE+kV7V{8h3Z2`E#CVruOC5|w)B z`m3+E%QI*f;ZTRif4~&}UK79V8bQQYXjTZJP@Gr(vr)lN9>(ZtG#Z5?YY|QEZxjAV z_wGxrZ}s1gZPZEVWTFIu(Y|4O|Mi5W7CD^ht?DD_>8kI3DVy;O>nQkwgF z0AQbzM>Cr>_9=p`7{1-t1bK#cSz`qcJ`CU{QH%#D#Q~Z8OeiQL8MaFiV?c%VV}14- z-(Ss_F^jhzO9U(ouQ@#i1+UCrl2olWyPh*_+Fwz+^=R*JTSskeU^=cgkOJfOda}h- z{d@a-12u{w82Ru3#_)!)*hMmPn0^K6#`!Iu5=9aJ$eA6?AmDgosGd5wT>@5T$apl1 zrQtFn`2BP{3Cb1}V4SIRkXtp#e0Fs}YW%Qc7BeQ%wnN7ke@B7JF<3I$&qsi4p2;BJ z!FFJz`W8KXrIcf_i)**vPsn0`g{zyBApUEfq!ZWDLO97_RDEjth6yu7^f)Ykf*~UJ z@mp@%TF!|!#j#8`-P_*Weg1)c0W#+YVWYV<8kvlo2B5&I*bg2uirz^ zpIsZ{%AjsiKIU6jYD(?cN7v~H+cxAU2mr9P#ssJt->S$f<2cz;NWOFtawy+ibEuKL z!$U^%6)Jj9-sJ1zBLDdEe8a|BP``^si7%zI+B+!>{N9AvBRRlp%yLY$GjsSZ%&)kM z`153@qq_eS9o9n|zp;s#Fk7KpRjzw1L<16?fatg2PVqqP}On(*$SP zdvL{O90Z@-5cWcBo`lqg;1x3z0Zif5Hn9rd`W(8HHuEiW!E65@z;saIlNxc!%>r7c zgX!#hFPA*mgX5(fsw{h0r|Lf-YX3@gixceKk5wF)G6u+rO$_E*oG^yf@inpAQ;eAZ zKrAqm1}^m_1IfERr|)5Vz-$383ntjiwUV+%`x@fcYd1pN@b^J24KlJ6oBPHug7>#e zRy(pv_J-fe`=IO+%C;YrV{n!>EVBjdwFTo%v2et=(R^B^v&X?&uE%;W>oxgm$gGkagSE=ZwPx8f3GqI& z++o7gaN&=I{S;CoI0oY3`%rttQ$oq9u>Q3hutdCRllQ~-RNbD2xgxK-`C;yyI(TQv<5QOZdg!d6t~d~2j2E%LEOtC{FX#1 z=jDUi0%|B}e3#f{@njE5JC_m@kWkKz3Y=~Z-4b%mrQ~Ayq2M+4;+}^40o+ct5Y*bb zR8$wy8??vknSFJRsOO*Q{_D^9Oh=XXNl?m)TmH!W!a6Fqp_M@tW$_?YS9 zYlnr!Hv_{s<}Ck%VQ!}wRS*|d+SfF{wQF}VRO)02#C6LDo)3I}E-l(Hr*HU{{`w)g zc)=H=BU1{P?n6cxf24fg#g7|bbNtJTehIW~ePmXgQv$-gZ zIs}%4Dj?8o$dX?XF-z^}+axP2E0*g-6JPOsv^bdtdk$xT_R;Q7e1$KDSo?+MBuCfc z05i>Z&O$%xbm_w=Lhw^3DVbrGrNM-a$8DqTb>CmCdPx*FO9q@`5k@wX8xB$(LEbI%O zKQC*sEotokg5&8b#ArW$a&fSeZ#SB)c@25rh`H!zfTlPe^2f_gh;+f~JT7&5XP5a< zlx!4f0Q z5R;Om+m$`yt(Oum*8*rC;S;-li=QmSTIAf)_KqH}X(gz>t%) zw)<%7+W8=~pWg#|_5m;MP zqRdHq1^PiZ=ySJoS@M>=Nw$41yo_wDsi=oO>?D!Nic!%|_>1+f-r2 z2K2z~CDf1b#*+7rv*^zfx}4FEB6UT}dwViC>oo@Z<9faIb7ys*z0&_ z#PJ|c8q@u1Cg*8pPvQN;PNFQJ<%tiF1UD-C1B`3vdk0QdF-+?Bu~HHgUt3Jy7sdO! z$G(ar03Rnn7AAh5pE~2i2RFQi#s{3Ff*XWzr*%+TabD-TeqSk1OZqkBW+Z`$3RSG5 zzMnqPsWb>!<#G!{KS6Iu0Yu_Q-XtI;V}+!!Wu>$9bLNH{Tr@Gp@oXfk=Ni800PS!g zHDrLMNdN1T$ju|7c`KfU{zcjJ8D*T+WGC#nk#Bfjm*)&g;zsoj{m65(<9Cu&wDRXl zcLzY+^HuUj%-7q{(=?Td&0UzEFuL2>xBg7g)x&K|SaBv&bC_a~3YA9omlRtVT|nDS zCIQWADOL{8dkn>9lschtX1%p4wN)8~<5C0g($iQ9g^82MK>apCf%Vd7@^rT0uSK ztu!X?86JYzjIe&MuPOib5q=Mf*FR`kuatCNe%M{@*#Maf3S^p{I@NSs=q$CmZ3dg! z(aNg1)3e|m8r4H#WgO;YQ6>*C$LcMimWNZd-x*Oo4l_4inbdUFc8mOnw%c?z@I(l6 zi=Oxxa1K0T0myqD4aWR&SI8PSPQrYI1Bn$&KhTT!gEOg-Zt;euAS)3~;UoYzWQ6H5 z!?s>fqR_Zg;H5(dW4{$zG}Of#JHa}k8M9y1KMWZJ_=k%;Uu9^1cOB{?1A_9Q z$ut6StGi@f8;nPZ;J}W&2TT?8Z=cB)>Y!mUm9lWW|6Y6h&$6Hdm#C%7y_1_baV}S@ zWtZRPSCsg{#JEI|H_H_nU`1#?fD<%B({Eqx#uiPEodLR)?P*e&%sm<8^ZuwX>Y+f^aRm9q$Ex69q%>dM&!$ohwl03@Ro+35R>W+gPg*rxP(6Y`E^584RPpo0<#TczgUzH%&ABjl z%KK^PHJ@*Jy3zDchzda|6M^MZ!McJ1wPh1=gGtP<9) z%Z>DJEJbQmzYuEEs?6NIYc&~Fe3GsJ{{t>-pD@k(hy^OfBfo?e3XQ!or>2tQebSI?YbB)7wHgo zoQv^S>N;VkO+JJtyI2se&u`W-uO`Yu;2{tDcnyXB5n-{-EE@M)URth{B6oh*zS!v` z-XE?Nl?OFg`t_Yp7`A2RzieVnf&a*cF)-;(DgNquAGEGz{%wXB6y;Xqe>Nui&PW>E zYXos%=KD9*AOs8qtUph#ZlM&XyM!#iBk@pn1D#+~-j}_E9H~x91Owknc@%U&+q()<+?>A9^%(L>Sf za5OK)owRQ73PjoCb}QX2D1^w&+15yRf+@8v>Q-4lFC(pLh~fCM&|L3iz3{1!0-&l! z=It%{gBF35WYT^bR2?CC!nATC@8pm#qhriq*?A|`|61C`>RDXoC4qVNqm zkqywC{K2X`hi)|kV5c5e`eQxN4Tu#hGiC6=FhT6j1vaG(>DmRX_V3HJ)orwSyilH$ zE_TZ0#>r1mK%Xz%fHmqM-5@y>79Gjgz*07rcPUH8?U$Z0=b)i6*I)=>8NmDtw~Cg# zD9nj_B`yuGkm1OE?}Q%Zdeu66RGs5&4KJ`uY@+s7guW4y|;9u zRH*!Nt(Pq^J`e)H{@=y_t%>;EwM9WwdrqSaI4Fm<*#)UpS&TD2il>&tKRvp!TSefrYCiR5-s@=0bi>jx#i5))HUms?R~g2arzbAOpqKu z2Au;{Pl^If62ij>JYXlz6teOVU`U)cTiYsggBz3Hey7f?Hl!5q@_(8Nu<@_^yRoC1 zYA1~=Tr6)(sS;03#xG4MP@f{TAypf*Dz#A zO|)_*SRS*iId4HV=wn*{>og^{o3FTs?hD}sKD_Ar9VoAuMJT`V2mQ0l;AikV33`P` z`I9D`-O38S5ZlkkA+2mpU|H;^E}d&`;SH0?k(;fEzrJbKR3X!-YZ@d(bf zrm@;pfoN&tccxD`-P4dg@8+#O_>+{SpAReSEz7gqX;-*>VA%CJ{KmJjyuT@N8xOzx z1Z=+N=~y(i-1~CFB*$bcHvODc{JR@Q`MYzkM={iG?c+Xp^#OHcEx;)T)Kj+=2cBh@ zzQ)Td4vZEN{m%vf*y~|9-fn}=k$vF$js;) zxja^)ciP}3yRV9SMTsZoJoRqKGLD=y;RmUYk#1R6EU2)2=8c4UWC}pn0QNk@>KW@Y zVp+)$J}Rb`pIKOIP>3WW7^X53kJZR15=`P%#G6-+On3k2YZOO(s6l(SK0xq}*(M0f`M$l$D$rz9Gd0pZ_O~LzrzQZIJqIkl9T0-+zf~CJG~Pid8Z-)N97QoE7$5=BLb7D zf&bsjYjZP7r2F{!X@vbS1tRu?viDBM8VH~eod5)H5w)1;T1ZZDdjP;ayQV&F;h^Xi zU6u!qdasqkRa-z@wU%Q`S{-0gJCNhq%vCpz;8!gDbJ&%+@ z{Kr#ZzLyF_pycfiJ%TU#7*e=S@la_J4ej*CI{fCi4wfR3>hs3%rlnPEB1PK&+}1{d>}&}G8+|1uy^V8{ z)m4p`EGNZH#l^*GE33_CtA+Rvbcumvs3yCBx`I(~!WtQtDX>JlHX*E+osqqZFDpp* z9->*IDY51Jh4+?Mz6k;!P-QjDi&GvFftQOmftmu^syC!4Hg71eZl&YiidiXXT<40F zeObq;OxS2=>Zxdl#L`kgZ|J-v!dfEDOEuQ0e`3V4)O4FKLMdTwn7s#W_(`FYm1Uum z{7V~+H3g!S;sIYy?D3MN|BG8sUviUUjow6`bii-1ie1mdBOu3ebJ%HKN;VphamRVsG40~tA>gV3IJd@9Z z14d5M5u1O>unvNQ6p@$hd!&TFQhhJ32)#1?06yuG$~a6Zq-0=t&z>NlpDj}*jMdai zF0k8TvWV&%0`DQaH=H-vQrxJN$^Zque+XgW8XHCagBTnOE^kCSp~=pIuV`r%-TTR3G-HhJqxV}N4PhQfIiwfGOj>ocabPZ^v~ z10p6OpKx+L06sySnAPdm;k+3MRcnR6y~3upVH&e6aeb{zxBrMe|6WeJa^`pBPf{AR zkoJQq<4x>S_r1V6@1F#NjLJUFfwqP(9GH=s@2?hOBmK#Z=|leZ&X((=yK6Oor9qQS z=rBn}2Qf?6WOrX7i>lVX@?iM*on)y+BN%mB^_v!?q-ZkaSn;`zKH)I%{QOBYS(Go0 z;ubp%G{|xBY*cCtT8r?D1f*hxQbDL{G#v=FMu9zNw+hK{L2izlv9O`gTGyd;gJ#&5 z%rFdOQ1if0lmm)zo@%^HaPp)Vq1(gNndGj?v=OqYq-&fzGM9S9Io11_Fu5kP7LnW; zmx&IQ_rZ6_=FZf+!+W0JFz`D{mfCL^PpkT)M}H@I0M^j5#eUf8AoaMY_er`?r>Nzh zcA{*p_?5fVyj&o}^vAVI`Y+rz zaWFRO^6C?wz<2%yHWtmKATCx@!$;VeN8S`LKexc8lUsZ1f7`Gg`XyR(k4vpKXUrcs z=daS=0l8BUD6o~V2YJ1gnt=Spa&L(R`wplPPA|Zk8B0#E_P6Fl4jgoM5f#A*L*5s4 zki8Bu5`xQ2cUyW#yYE9Py8X!mQQL(aI#|!)rRze^kJ`v0jGW3IvXkPqhpzV_7*8_f z0P#506kVpsY`I#LrlDpX!Hd8mXb7L))T|n;mRcI-*~Eg@XM=Z0qGRk)e@cozKT-x2 z{pFB+HQA(xj2m5v?+>NfP}moC`;5`8g+{PQmu*aCZcO8_XtPq@fh%+S()oWpbsqW0 zvK*c#n%K>nx%n#N-o{1^h8eUyXbTCwqExdb=Ji%2#iehwP(_g(_f00ilq^!ZP}oOL zj!rK=eAQkfa@BFd=DClOX;i{crgBF`-ADJ19jLkbew0iU9q; zk5x5pw@W&VUMw+Qxou90bSsBvg_V zD3W&4$kyf2MNn{u=GFL!Cr=dEN}gVB1PcHD{a3e)lPLG$y}Nt;$r380Wr=d?LHlpJ zuv_67i#F4A+B(n7TD&(ij@C(Dt#nQ{oUO~1sF%yGgJ)LZ-xU2i_c-SpK#>hRiiaeG zq77Sh5MW&a_-Du$=a6{Y_?L~GD!#_Am*u^|BS^f}5QU@!hV^H!;Q6jJjuqE(wp5hD z8h_W4`B+641V}H&Ij#shJ8f39s^g;gRgm014L{jmUa<;Aa(}(g;O^fAZZwP@xb?L7 zX-+HwnX&fAy7M;0S129IJ~rv9ltV^v=7OB#*0U>-C!bDRBj~em9sOw*oI;2C2nvCr z&g+P@rhTE&$*-Jk?rDK8f{TwG&Y*zGRsx2}0vpO{9mZ{S^sP{AtIkmF$7ze%gD&DS zDyz^^MB$6qI+fZ5NQoz5HuidM%ZnWdhzleS+RFiKQxM**4_vI1g)$HYhr>PZ*&|np zHhE!Rc}g_5GG_)RTm0>0H_G~X)qQuH--{fLORH(On7pomy``rSIm7f4n<~exT0N=W zx9swH&n>f?@6gh-isps}WKXk|n>-l}$S_DVu%l$drJCq3gRvU-T~+)y^}flBQba7% zVV3}sFU|0?H?PUf>Ifk0Vg*VTWECBW7E@}lT>nUqbxt&rZt7k$@!7OTw)!4&5kgz^ zP9%Y;YXUv17`q`}+qSR__eeYR^q}DQ7I`3Q4T9}X0<YBl zIIr<9+2TdZb#%nCH}#>006pEj*~_`ER38!|$DUD|%oJ0kG~s4Qcy3>& z<5t=si`N*q&G(R>p@nj25wusY7yM2bw4woC2T25Spt|tFLx<5}CvT2J{| z!t}+`l*8VU^CfhK_*lifGC;0z>m|uKu?_x;cpO88rgP>p2*XojZWVXVcv$UyX#fNY zeKBwlVbHQ;yjBCEb$F-%fR;BwR?=BRAAYZpV&8sxBWUPYS1htAkF*XBymnQmsr38E z-|yN@-K}|n%!KKb_rpnXDHjR|(|Uig!h|dGde4!Y9JE)z>G|DjRi&$T5r$g7Evtsi zaHRjCXA_0MbQy-EaCP&qK8xDM(VU__`K&j{Q76C65Bg-yelnDHm=nz7u9jt^;QS=< zyu`GbSLs({-qO>$9bbvP*_!TH!UR9fO#(5=y|jY)uYV`(oJaWouyhrEO}=mU87V_T zxQN z=f2K$u5+F9`>DH;_iZ!$k`$Hg=kh1F;m^lA#Y0vk!XDDMlK{%L0p(IH<46U>eE`36 za#vj11HPoL%H}S9YbUcFnHQD6V*1kHx0v9@{dU*<9E;|+^CxrA(8Zwo-0_r3jej7q zQr!0IsmoM~|D@1gk|5+S4x$GR(WF`p9DjUeyyK4h8;uEuhU}xmE6j|wt7ET-KS}#u z#1*0cl(>DcsDV@qfSg+L%qp5dg~hX%BQ5)v_tlYtrb~tACnwEQ1@)i zboMJ1z4+2Wu|yPX(@O6_w8|*spIjSKtS2`-w8{6993S0x`(W`8HK3}W?gij4X>?fg-KF=|SO-HqZRjGX$#yzD2gQ`3n&HS6g>z*%J8{LG_H`& zdH&J5xCCK~2){g_UFvge&b}`($P2aaobHLQ0dO z6bodFW3>BU#mjQlbJg07lnm@#imfJhxI%1lR3r;$+m3)j$QqA=?=I~rez60MBF6tX zkyG5D$-4kwhJ8UhSQRI$c3b!c*IflGX@@}7h&J@u)9!n!^1VPN)eNgH?vFy%&p+fB z=PNl6qPL7H((5SDK+P0UriHfg!jcwzqMy^Rd|IQS;(ieGPF+y4A*nyU(2_ z=JQa${=YV#FG%vF8PBA_5+jiEMN3CDYssF6QrCm@c}_c#ew99UHZVSUUMJ}?#U|w> z-8~(PFTX-O_7JD%KW)KCXs|zDho8@uSjoQFI2zrn@w{;zE7s=EtxAwI5@$y)ofvb~ ziGc}c#_|X*R;FJc@kFV(`#+LhgN=+Kr$`cnL8p=#F?_#~Tp)Oy20Dr}Y<}_8!>-iy ziPQ^kVc2%fe`3K%_oY|^2`XgD)oST*day|txBwoD&x4@O5KL4ist=`+e=#^{# z3|PI~BF1V3hD!mb8d;ENW+Xc)1b>LU9@Q!jC{t?M$(hTNf3{UsD^lp4#&%RYcHLVc{J4DW2=z#m_tK++J*}t?Td|59*(jmpizp zwyW1aO{=UHsn6!$l;eQ2;F5!fdVMpBkNMWRLR{*Dhtyg#hmk7TL1I&2xke=)4f7qJU} zt_}yli+(Xkt>~8gC}(Ydw)eETuXRf#SYgBEqVX1St*0w1btL$;a_^pe$GBo3DOul`vH3IF=r&vi=V)WrBX?JLy{k+*!(j zvHKmf1ex-|*rDzBq~s*b98wDSGPo^1a;?oZ8nu6LlU=a&52YJR4LBA|B~6;jGSm7m z=)Y_2TeHlnK&d>L0(!WEzJ-Y=J&dQ5(7;r(1$I%&|@8`dl*k%4h5Lga6XR{7&c3~yV@6I0MB#7q8HV69y=%(1P1T|&QoJ^a`% zJi3DC62BC%#l-MbK(DccIs555sXCwBim_^o4exm_t=aChCMG19A1!LFa8-g{NhEpL zAMG~NU~0go6$knaqJNdU(R`L;CPrG(+C;Z_vZO!|wxA8+#~ZFM-v*h9k}AwyrsTA| zj7JHH);58$x23TyffZ2}6k;I-CpJU_2}MG%UOPz@ixOzd>hAp`+cG2YuW9l&sIVa} z;&jMz1m5dyWnL`9Q1sbZfsPH4AX&i?9}EXW%_FUTv^NO>%GZlFAfq*t-%B2s9I2}v z3juJU60iz3q~!7zUW`gT&mFH#`Tj5^$HmY_;gu-MZt$ca7V;%Rh@q5S0=4 zFoD=JO2N7t6A#-KApPjL$p$4!%Qq{aGAkHLilq_;vS0+)sU1A602}qt*lDh!V)?5> zU^dDJNsWAJ2w&;QLji>9=&#Ec8`pl%?mXev3XMDz@&#?wN>qwy&v8^(NS$;$HNXkI zErH-VIh&a_oDxn;M<|be=^c!8=gycr7MKcwvv8hOIFx#DwqiGZe74Mr6gREyqYFRj zi?HMcWjFa<(1jisDh{<6rVd3|oqh@DR_Kv^5e**1-4Kl3-V2%>GT=USiLkQWgJE%Hu2+)q@^ zsZC7IR7u=^g~2UUHu-XJ z6k^#-P_K4*WF`*-8+BkJ7x{|#=Pmb+@+Z!l>=87v9vV}G78#cC>0`4XxH(?QOeChqUE+o%vL-u9VQ`$)w`O*M>bS|IJ^oBsHFjXT!M z$2Q|3df7YHAdDi~>-aI)*uKAw*@xjw$gFjS%;gkr>7T}!nb>dVwoD_Al z?06+cohO0%*tGDDTE8AfNE=5NdU9{r%{0Vp&F=+(w;fu^*ZIGa`u~{0w)f*s^Z$rL zDwv!o!V6QA1jhcd#OVd2C-k4RYLwf`|L-YS8L$vRLO+f-wjG@SH-tti`mBc5^mS;# zBn8y`RkI?1I?zfzjc<@Z?`du;MJ@(i>9+bf&VI|_*nI@vSTEQJY0^+hh9Fl}l`_;1LU1uxZ-7SE zM0?c{0Ki=GmedGJYHy9+9wAxzaW+$N2VMCLp6m9c0baN9+T`cqazMY>GllrSDR&?C zr=LJAuYR!4^ZX*1;Anj7#J?Ejz%A^B=f2^A6)!Ud#VuyVBY~qf#8!wKD=NxLm16#* z=lo52BrbwqEJIFfuqxAE^6QQ@7fenG;KaO4x`qu=;iW_hM&m5O`LK8w37!lz)B#R4 z2W!1qVc_*M|I_Jfz5T(x7m0xyso3`y#r63zCWQVvnq)|=TiNG{o;XCX8o8LF&qal` zrmX_q^&d6cIWn+s_Mu2K{TZ@}4@8@yYw0qZm84HliCeJlPPjMu_5q??o=gw@iypa8 zT>T1B5F8RaT7BdboEt=Tp8S5Z!z)c(vPB*m&@zg@|0k?!x)t%>MlLSw-c!i+-}jtM z4v)y&I&M!jgK2=PUA;pf;bi@rY2f!tQ9m^HM0bASrG$sYcxrhTx)-QuKK_C zyBz$k%FppCViM1<8G;f@cE46PBHY6LYVI^g|6YcFV{+#xcW!ov}n?8ccVCOl>Hf#>KyB!u4^K`)uhS~Z^*sdj zJp}+muq%=DO3W)E;*`i5D3ml+IcJLuvoC*}aQ9yTBXgDHwkIOlM!A|OVw2!m0zZrj zpIicnfEIRjZDUv5*_E~u=8lrH3f}z@$x8+5>==NccK<9;jt7iAS$u13coR$$Dd3E> zfQC%L{l@~u6+n3u!s>Ik{&hrU#&=2p9s&(u?I@M6Jb;EqJzRy0Wbn#n+SePIwE&w}Vh=k0G|s#=0;xw?oEWW=xx>Q@?2!@_L|wQ`TinfKbFP`ex2sWH%-Pd2 z2(+DYEVgd=k*I}uF0XXbw==a+8UTLCpLUvkuQ~?i&qTIPP4xzMv?S_4{*?mL1VJX% z`gi<`C+ECee90aWg%GF8tDzngO-=WGNsga`#6c10u2Zjie_tAxSo?Y*3Gka{wN)@E z4IL1z8%rvd7V1}7HffT6B6=Z$is6KIDuuBizLcFOLf;kOuB^OT<7q(}?cCr{Ck3PlEmjXJYBU&p=Qzb<`8ZWg+nf zbz*xO>L(}9zMWJa)`^jlj!GC z*?B{;DxEP}oY^m-5Cs_gf+zHm3|PLa;Shj^6lga81ZwTygIflhCU)Dj9|HwlLi{fJ89yz+ME&uOVzA5kXYpb(T@ zk@2XK#^||*c`%3?*dZsjqz6joPO~?m*-ct+zy0|~f3Wn{Thj-tG*}@{!_BE${3~C6 zG73?>eZlCR1qN5MU%o3GrhD#nrMrLT;^RD~WJD%K3=gMe>L8xI(h(y^_E-B;nB?_( zA}^GOR)`2-+0Nu-Cm%M0SA$IWv??h+{t;sCVW7C$*~^(IF!Loyky#m(Iv$FljvYkica-}*7WE-{He?6ql`47cenwMm`tD+8C$Q9^U zvN&G<>rIAYG^Yv2o9Et#o9S4LZAEBLefDmpIzk*CX=FdmBm-h@0Htgw4yJvRWJ;&K zpWsCiTSgks2K* zFE|C*p1sc@hcOpwgV1A%ZZiR`LEwAyEwMdm6bc`IdVMUZ0v6?B*iDXP*8@ZOjjS+w8Eyp?G~wx%PB+*XR09-+^>X9i#@rGzsR|?9aMRT6K~3Yqt0pyz5efg z?&-7<9+HhXS8XBOK^-+-&Oj7cyE4FzPn=d(4huml;*1>sG%6vyf&qo>5s+CW!^Q^d zy{!+ieoVhCi%kM%J0PUD|BaSc`_gatpZIk8U%Rnc6tzru$bW?q)Qh^<$yUTJI4LVx z%64+wm^BEU?fz73GNW=a{c%^)nCgkOOSWk=m(#&woe#x2i)kwNjyTzaBWl`aE=rgB`h)TVMgkI8NRy=EapiTvnmflc$_ALQOInJb zw{Ys;2kOKef8A?y%Avui&1SFO#{C%XXw)v-ms|;9si$yM231!|(IxU=#wc9*(*_0M zUP{-UkhDG)p~0krGmAK}>Yxj;8$7B?5sIg~pNG>!)m-QHfvm}fg|n(w<=2llW$DT> z0iZgH7xhjN79>~UtBhSDf)~2Ma~{q9`Nbwm5?3AE(P)7X@1k!p0+iLoD%p@5WJ4D~ z2!keh7&CzX_1DG`kZQY#rURdcB2Nf@TQM&}_f*9dP%y5R6M4-2Qp{fV?k|$O4%+D)Dbh5CGR49g1g z(vdXvdhBs5<`e$+P?6aYVq%XF_oHUHi@E-nz&bE?cXbuQWSVRDV`1KnrX85ctn})zLf8e^jx+beAZVaaYfuC^c`?0;e z+itDdUE@<)Ru8AR#wsQSqtU-(n2}sbU64S-wOfi``(9=ZTGVqW}+EgKvLe^lk3@h9vxEW0{>e#7C%dY9eLrfT&S5o#@kQ9^yRb?TrLc_&NOI~ zi&i5j0inkBC~nd5Uc(l!a}+i*e`Yq~32?%c7)+0DW4}Z2gDZ!ZHhS>7!JhaQuh$_Z z7_*@t?{2{N7I_Wq=cIU_Q%YwL+AnJvILkMLo#`K!gAXM}d|^}3tQmURHC zdRJP)rB5wD+~4a~=f1TVj3%RIodOekSpG`Cz&NKEv?MOuuLWk;LMplGle+da&$5dh zK7nNAbfC(JDb<(171N;$wm%x&ByMBED3SiFhs*tQkDr{P8wH-oq+b6Fj?Bidk>F!V z$?y(T9-x4?Al7I#q0-`|ICX)!207ntK!IjMYr4_N%w?GZn_6OfQ~lFk!g9Q14k4Te zW&KHo3G%gzNB+f|7zIu!v~1$`zC09OULiTmwyRkTnPhZab0ilZ!RauadYYY<+U0K~ zncoxII)ssvDu~kgYl?9*3qFYQ*h_FJusjmNS|UoScfT&|7~TMsFBt14J*<`!UhM66 zIqjQmDq|RhF(W(gCWv}i*8hEFcD6Ebq3Q<5XNJsufV0NfeVXF5aZY6#A94`l4Zyel z{sbwCk9KWeca>B2W~hc^+fh;oF36Bp7Gz(RB@`eaweSAAB_a+>S?4n)d$pMSbs`&Y zn{)4TU?mvbM>@1mf{)%N2eL+gTJtk}+Q^s3=)6-&QzOkLK@w~J>rzS0L_u-L5p9WA z+0a+@ETJG=skuTV^>mYc6nt2RHqmSAY2~XxE>3M{ac&vUyO~Bco=ofZfR+t;+n@g7&;fJYC4G6)n8p~+N>7DwM| z$xu5bBLxrk1BsaLNjkX{Nbm>N3zOt(+w`*KB?ZQR(=Cac7C4(_JM?ZvM3H^KkoP1iod z1m1o+j||Dq1gpn2b`#_ODx1da^Zgc6^Wdk3rF?TAVnxyf3d4eu63q=Bi}|3{wQz>5 zuQTf=z%FX0GcGwm%Hh4vX zkIW)#GbjttPu7F80vEYxL=PpFiXZd<(R9wK5`q$x$Z)d&b`~0-+}_Z_C31#;ws!(5 zJL5vFC9_FOm`RcS@%YGX$ifZq7UvDM_0;=FmlZ`7zq<6WtBI2gNAiArz|)L4m&iQVP&_yfN4yNN*(6$uxEu`{8d$IY@J$hHth|~WK#+XrR0V-&@4f`{GPPOBu$*WPlNEFwvD4Xi=^!Nc zw!}pc6#K9e3bX{dpS^pyY;P%j5ApcnP>tAe`?I2x`z=^y@{$mNKB~4^=g-5BE%Lml z_6)hH^=?%PRPqRAJ5Oe5%Y5Tn7Ac?)bqP95esI9=c%S^*eKHnX8q_Npp!4X0%)+vt z%l;)~u{p{IH*gHUY9W2|2gWjf3pn zP37~soAgS#bn`XzS|NQqhVmQnK*DXQS~O+y(UUWV;FvmN9ro4qcXj7uLEAclDypzA zvQy&Z?g=ePDe9c|ilV|y9Da&QhP{2)^QznrGoXY^tgmF-oCKfg;e^U2N6etj@%!D$ zoycbcYn`|^+UqB!i6_-1Z;cKk|2yf}3Z8VQ=~>{a?Ie9^%%fZhNPWRdF-7?Shi)Ff zQ?m<6+f*v)l&P=w!yfYGyk5v4DWVtGyTAmsUXkQ2WHJJT>`KGR>_!9)ZJ^|zv*UJK z88aOXllmfR#sgx!8hLYt>AZ*P@fLu8=lmq%i}eq%BL~^>&>etZ=m-CUES@|kYTFOg zO8ejZUJ~KA?#IldyvXp~-~A~b7pANfETA1Xh%VQdJ=jyDACdvdwat~6jj^JOk_kt(l}f`jA@cvWyYGiG`PUp@%Eki z4`S+5#!G&*k@QdwgTQF3KRu?x#x&K96opqy2#We9zLI1Y5}Jqe++C~`ilZ_a(=ETI z%XQcCrIkF#uNDj+lXSO99&^8-auOY9d+1?jbkrZSK~umjcduf1fbsGSA*%_yYA1a| z*L|vJ0NVTUu(~r(sZp_Q&di|7iyBR z&xQZm)1!j5{%)k*`b)W0E9nR<)qK;YT8%=O_rgmtz0q?r!h113`JFw0p+xa>}7=ElW*X@ zp>jcUVQhfDMR6V_%shh3di3&wTx~%u6e0tl&n()oDcVeFVB6n3 z=-&G~_XG2sR7<&)f$GNL!~T)a2!gBys-140Ibs5YY`yKbgnI@;lDE6j(r%r4Vz48$ zL_h`&Gevf>S$c2uY-f8&0b|l?xF|2J;mx1V9!QBiEjSblfS-4AW9vK%3m2lOfm!;y zryvko_MjwPBmO}j;q%QPJgO5~K6Xp_g>})ny8aG7PYW4VOL(Gi3?2tB%7(rBuk5q* zqBN_BCT}}U;NBxCC(6oFzUzO6s`grE;F^A4w$IspzaoX|$3v<{M{5|TuacIEUu-e57>T}~y&X%aqRpWzqtM6%n>;HWP z<`0%kl~1KVXwPCqrl6mT2*T*7!LOWmi#_(N} zLXDyB=Oo0ux3NqfYG|V=xem0bjp44pO_6PT)x-2_S;baPRu$VQllX=5aq&|vg~t`% zb3uYrVT+{jr@K;AoCmww-m!uTqVM#RhzOQl-#jgylUZ3GNU$lWUqh{*8T4d z_lj3R^T`s$A7OOCG3>B%Cq89zEGgk*p-gU$8=_!ut8{drp`8(MJVDiCjnITyRSYfB?3qv3RMExbVb8J;YYCrokf2y~r_j ze!ollPby=Hjxq+Qs(8g_x<8#PWb{I?v|@*2To<>!DTFyADIX3~`%=k)OaMy0etN59 zta}^S@u)KV8U@rF#TlpSw-OcOAmN&4uUpV}Sa1%fEGGF9A0L{9jy)>1icrUS%c+=a zr(mu)KdYQlf}Cbf$!ezX$ipg-;RXw&EUk0d{tc5iT!Cg!hj+if-VGyI-wMvC-Dd}J zP!Lxs5mIOHKWR+w3D_+nxSo%xS6K74``ZAaqR}ofe>^=QU)Su zQuX*p>Iz5YKtnhFTBmFOILL4w+NbB}&C3zRYcRpz;EFd>IY=+_p5GSJOfR%Hq{2?t zxw1nC|54?!AN44iT^BO#ihrWC1pdb_EZs>Thlx_bQivx`Anu>kZJ5D1uaYyMydOCO zL>P`yOhAy7kYzPS+(Gm3V)I#vDz%!D}uA zcV^bv-JXk6#BT=FT;-)nEM?tUPNv~f$F&~6g~3VI{Vf)sG=S_pC9O==Prjwa_#3WN zCG?;KfSYEIkC~t87Y(vWxlbg{9QmQ~0&d18e?*GEVXvT=RGLx93`^Opre&P5lq5xU za|(Lo`j~PmwQzO~7Y4crk*+P+f>f^)>!P=a*hNOMo?U40>GsPA%6L4VE?jDomHntg zaNvh(d8+>JMK)5hV%MiGFVfhH_Oq?FdJGDg&8K=k(@Z21Ph2Q`c>r)$WmIYh?&M+K zI+LwQ-=`ZYZ?tMkWHUVtqkSwzh0>zN#_H)H(dENhrQ;`2<#z2QoOktNbx%AYCFJ7` zmaeJmzY8z!04ElSSxNAA74tYEQbki^#^s%}573`+shA*T^aZ<*ok6Fr^Vv`oM=N<& zGrau~%f8!F=s5HJ372VyBS)`k$0M&8M2ijso+W#KsU4h)7wR3EWcAZEI3=t_+Tue8 zVt>4d>&aAgBN@zJU0A*-5|(GC==pLWEIsq_Su;P$$)|fKck**xqdswV7YE0$0Dto= zK4Vk@jI*U7l9sBL-|J^B3pW&cF;lZ3c54RJjL!=-l;kCH`T2|(fY7QOEg@sW9NtjH z2to)QpB}N+hcMDL09yznXuf$w3zNHvVOhV9J<-ozyghoMAb$hMQX`0F)%zi`iSlrz zezX+W52o+c;2>ZeI+Orc%?Jfho3z6IV5m$JF;dR04+wrDN&HXz$pFBQFV-lq8m${c zjnA^C6{aTEM6{o`xg9)xn$^0zHXp_QPuffVYj8R+GbDi4c zObrX?EkKyNAeN_o@o1iNaM+xz_?OE;GV~tu z8<=8Bq(v%2avv7@NS}GE6#Grg_8SoaYd^GB#$X{%k8Jv4mB$l0)aCW<#pMrHSbrTt z__k0A<#6ng4QOEY{AgI;$VO*EI<1FNS)>`#UdgZ!r#?bLx?rh+&ssc-oi`5>8R)$U z3mJWBUZKRDW0kCpJ8h)@O7=ByvY959z$w5fHyL~uPl2&oeU*0WHN$a;x2T}_U!4uM z2f7Z^4L`|n_j?Gg?IE8eLT|L7^YuoR%;Fvg}mjKfY!L(C&hl9 zh1LY$Xdi?hs`MJLy9<;t6l5@sGFjx5KaT*&ErdOc~NwVevN4*p0eiXnadW62@& zxj6(`aanClGy17I!8%IvJtQ=f?DiXp(04qcbcijSYFgvcM~3G&+4FkM7#LLVs7!s+ z;&TEiA8Mo`kDTe89)fL@xpNfe`5JRl{8NC`cXIR5c#C)2^Qz5>kP?OOdr zLwwLI{c6uBYXcv^MUG^C7=b2_f3+ul79!6hjP;2{TTTg;()F?s)qh_m>0gLAPbuC~8u+1S|30IUi5>p)`I z(Z&pDP!4j_ub4$Yx1$TK$YMGiR71hQz2LlJv5ooOxFi&#Zu8CAFWTg9#fv`)o(7XJ zbiUG1eTI7EZ3~2-5TF>H>dV|ZmpQ@o8$4iy*2MfbMoOWg7Qw^ zcJI+#Jd=S^0w@RNjl^sE&Z*bYahg*Cp>h%fJ;lD~mh>M@e3FyYTvp%M@`1egj*=`) z;}LGeRnHpHuHph-Ro0^iFwf(((~HOlV&QGc5wkNHW&)`(i4 z?wCNJcoUT?B+rjG^gC@Neh(IU2S9OaZj)7S#pAr5g}&7ZtqRGK0e5^z%n74JR(Cm}}@$J7U*_zMF_V4Vmm1%Rkiq;&;{AR6Bw)%AdovQUw z{H$`wg7Vq?m{d9J7M-F$E>YFo(nF_V&wr{w=`o)Ay6Rcye)C2D%2~E~VW+>VKmI>d zH<@M)LX=3Ab;n8;R02-!r|)s{Vi`mw}fD&F^FVq{gnhQpc=BKU-8%j@ds;Ixf9QsYmd1DMa6 z-86kxEt@0U-`n8n+UCK{&Sz9>T>MxGN^Gc^JHE% zXu(S=yViqAv3DeN1o|w(0YHsxbHw^To^_voluCvb3ur(z)`oFAwQ(@xwGraOF>?PZ zJeru3jsdjydtOY3q^BXEPg6gbaN=>(+vRsq=+x=qPX0Gjw8Wj^Wn>r@0k0BugMM|ECuu# zOhkQDL}R@TlE$r7tQ~6k1@lr3Dj6#EOFxCc$&~0sJ^W%=ecU@-ttWV*4BY4$+_iI# ztcf&yI5lAj{u=>|Fhf5rKVC>E;!8Q6$GAs6lok0@V!M{9EARNfEg<4&Z7J7cGd5?g zjmQ$&?60WFvNj;bao4u<+pT{Ga(f?K*3VrRi&D4}FwU*YmQ>ow{$H4}F|9JbktbLj3R>ki%TFq<)5);91u%k}=@8R7VwK41&(9aw zJaLaGzm!CW)Q9EMBnXWx#V72gd^jzuX@jV;;?xvuyb*)?dSi_){7qe3S^y8*n`*VU z)J70Gb+rzP0+v9v;V%{MC%jj%%p^ya1Lz_H``fnlOR?Vtbam>uW_?Helvv ze1AXdqHi!W^hZc!ZLj?-_W#AO+JPCrsrMQe@;l^JcvISObgn{3w$5N~-&w%wQiGFC z#MT0Z5=V~jT)mz%X5VJ)8k4D9TzcQwD%WHFM;5<2_L`e9tad-@FWvTeWG!)C8~A@Z zJEgkcM&NFQ8vO6J$rJU#{qlOH`fV;cfmf;c^4$~~ZkHx+Et_*rX%rlMX343obbFTf2spYdD9S zg%s!?6_H&7^JKsm3{?1wy{E$No*raHhB>vW6P5NlyK);$ZE16Ep4%&fr{ifcFRF{9 zMGFGD$w=?l5jS zk_RF?$i;;LMiYb6FbUWQFx+nIrKToDPy@=V+zu~$f0No}WA7oTBb3w@PRdHzp2Q6v zDw5A$tah*-@r;oo&&sgh0sO8SDp`&BW$u~yiPm46qVhdrV-jMxyXqZYRAu_jB35J( z1i$b`T)^q>mlV|5JhfWBL1H#(8Mx2p>+t&%C88f;@FQ%TJQ!l15JLpxVt!i_$oH4T zHtj=H^4Yyw;nGbTqEp@=2VDbErPZ}D$K$UT%?_=rQiS39x zyN5lz+U*Y}s1`KcZ;Vwnl@(8Z+VQ@?37j(4c-(n`k$9Gh`{ktsdH`VPdh7TxSR+P2 z`Js_ZCKj7biZ>~u4Sr9S$fYC`O;w>50X~HYWXTsji35kLoZZRo3|l-XwR&1}0dcIe zyNfVzGk<7s>pd$HM?9oOp44Mp0!k_e=xrF4nD703S+0v0Ky1+rL6H4qYnGk5yRutR ziZz}cK+AYDb|1=~x?(k0VcWwXJQ^1ZM|?6eiX+G0PF;!goVQTh<9L6l(~wdm2!_q= zkeL+YJSD2YZ1ZC_Gw#) zG~TGU``dl0v`^l)r5dvEBEYoy6C+k!XWx?|KVY$?w~h0>J;KRTv2R(K z6f`FUB^>~K?srcs*U|_pR5!&)>HW*xkq=q16%VLuQ-2(DclqB+eUrolWYzl%^T5*A zUWyZ!kOw&GDU7eZ@3rD589_`kt*goipdok%vCwE7vDWCrdRpaJ-JG{-Z#-@wY6<8fxc~l zpz)y_Z^~n!#idRxoK_ehXsYFEk>D-fmVvJDTgk>cB7$TO4(?gh1297f_UqJ4E9NSC z>xX@d_tIaR=WktRAAb-e!54r&0$}pc3|VCc7$c!mG=P3q&&v%Z^YS4Xo{~fr$Vq7Fw|4kg_KHuBkmN09hdy_qgWJU9)Qh7BH`rte8{iB zc?|b(;3_Gm`#?FKboh=a_xH;dvM&M~O>2E7jt9fm2A7Y6t-mhC-ub5(vRZneF5-;< zY!rPATGl6n2!AiRbKjw7a(@EKl`tJS1lRn2^KHg#efqS)(JzgykAlGg<5IifyPak{ zl+c`H4tf&c@0!*oKQ?5^YCUhl8)$0&_|e+!?oI{XGT6Gp+8-M)4J7P%juP}DG~>L8 z;C~ZZL-W`^xv>ZIX?kJ99}#H=$!W7HmF?B~zk@6r zKcY6Fq)43SHXX^&1kx8tJrMlwHqVs$^Gyd2I|7e8^YgRe^4}66LPI7Z!Zxy$>~N8P z2md5B-m}xCokBLq3O~-(GpYSJJ}&bz{*uZkScq)(FZ9-L8smc##6{-Gy?FKu0iWVC zm+Xm{N(oy&B}CTFb?0kvbaip>*257r02y&+xHE z#rA?~pv8g~>>QpTR5&2N6EtqS`jilV%RtU}x8#TOfb0eM`GrtLaUr&>4H^=BJ}X0! z@gKy$_pnmhhGe^=BwbVqsUuxJsTLfBe@Si-pyk@rY#_l*y z^Y7m+wbG9iMya=Nr&)yGXeubMUipSMEqs+g>?`FXj{t;)-{%QYaNp{K65i^0+&^jv z0!_7$x-o|D`Jn~(6H@9ZU>{HT7AtFJm6b=Nr=@3=N0euk_n(fXH`RwtG)-syw{vvJ()I>Y)i9t~seUGTveV{UuYB!x#?CqL4-6lE**WZ4K4yVLo4-#_-rqC=x@ z#ajkP+fHF#M)iU+>Vx;eEVq2VfV3s z)5J?-dg=lD=m2{ZhCjFHmHI>H>~hVIiwAep9>Q!%2Ky&sXeMzXuGIYIM5lUds9cEmGqJlnEj}K(Pg(5v2c9M zqwwvuTr)9#XG+Lln1lwa(WjZd`e}SXy^0vCPg4Maz`tx`s6N&KAYb^<`9}a1GQ(We z1>73cOxJ3DaIqEhDeVc7(3~3r{X!oPSDUhVxXj-~_7T9UsSp!Bv#vf2xRn^n3Lxcf zao}RScf%n~BZju;LN9|(yj9OgLQluId#LeQr5;;0kj>c@9!2?yLFUBlsLSX+B`?({ zN^&Oy*PW0VWOy?w1pv#*7~kXWngO)j-JjtJ0}ylS2rl-BJ9h=^MQZr=&wutn-WNoN ztmZ_t9OZuU-_oie|CVql3VQ*b4Gr&M+rY=qm&T6_WM@)xyZSGVucPgM#c@3tN$PqnuM#;FlHg zDCI3$$96L&$Os?81mf>p1_UA6kqF?NwX1ShI!$WeL%E@-W)&bg&K|Xs>R2rP`uz!H z&|sTBG1xVzJ?5Y7g7meQ$T&$N}l_~ zjG{hQMozP;Jc@K*KeJ42cGVZ&ukQVPukAmQf>;1K{>Iy35_bH0pzr(KHs^H1f7z3L z5P}}J)%z)5o{~^zQ zJ{a?}g8i>zHfVKk;s?ynN}WFv<3oajdhTedn(zR4q%4HcxjFOI=`8#2F%fpgFTDRm z?XSwVv!0fv5>v>QV@_tl)o=Q%8y6Sfbs9b1W%1>+C#5EDZK;PR^<8IXT2i0ESrID) zsT|#a4u8RAPRHURlPa60NHB4dEx7@qoM~7Ygzdc;c}YZN8oVQN+>!{J@|IeMZT4G( z?=?;o_KXLu>RjnRYW2w>E9GqhHPF(^hf#V(*qWD zHxUg;guapu@!sw3o&|aDM_mIAv2C^r^Mak-d4l5Dv%hDOE~;nCoA`quJH35$P@`2~ z4JCiUbKo?<&u?+cswyu`oa=!#t`~Fg1|9n_?L{C35_H0>+|UeyU_2RKFm-s1gHtaW zMio1HWRfk0Ik=Jtdq+}LPftUK0a-PC#*+6m`9FEg()7mwBCuujda_FvFs;$Tp6ofp z;EYUx@}h=WZ(@K`22JqImZ=%)dnO_L< zafj!~vui^E5R}+k+hc#EZY{m#S{#3YsE%@RbL?+L-D|9Po^)1xc8vdTZ=R{*zQ`~1 z)rG2>BDM(%}#DqHfMF3_P}V^qG(7tCMSn+pY#|@au|IKYYa$eP?v_hN5#a z&bFHj2lKo8oMTjpuMefyIlqy|ZahaOa9|v79?b|S)jz*J&B5;;kiIh`0IPqd>%o8= zkHd)pc=<|FT=qx<^RL^!WT(4#{B!(w!XblBfP$nQfIpZ=#<9{Z4R3UVq|Cs;R1Hnf zv%Fgdr$APC%0@rzmEX_?K!C2~u^;~3Az+i3P%`F4 z;DMa}<`GE%Y~+Y%@4_(Y?|;oFMSgRUcopdIRf6_nQPrXf+VVasJtt$OCDVYF#@^eix45L}-ZXGUkY@83{p4n;IzycMRxRO4|c!Rvf9oFrh_3Df%; zNm0ryd92`(_oQO$Iq=4}<5^z+je9k*+w*rOtFNTyg2&_t@-;%-q)TBhlGY(YM=Z)b z+Hsb6GwGrIJr(i@f87Epo>yd#Z=v_kpDyW!zRaYmN0llyi}#{HX0|o>AyRcGyb!_NY%m1QD0qUo#GJD*BG)?(Gf~lYQqbvd(MrP2o+JEpOAr_p{&SyjfKAU@1C$NtNTwkA9xy-KJZqptk)R3SbD92 zpcdb+=Gd5|-y8+1YY%R`|6riz{o-<*K8L?Moq~4mkDgZ02|KjUH&9_^Rq-WicOFd` z-#y!3E*Ei1j+?iVN`U)&?tT!o%|M%i(=<+b2NBxD7B}WqF zEERG_-v^B$e_vJa!p9t#pEEUO*m~JfWsqB6+4c_gg;i*Nc2K^$W=O*3+*@#|J!-Qa zgT&Y=vE;l(8VeWv2q@1PxOIYWr%xjRB3wKpoHb0$A1}#N7X~v~&NaR!e!(MysASqL zA4q(14Fj$%Xzh#m8s2jFNL=fCqV_{iLk+;P!;v*-Evz$-`*}`vA}7yy0(1B8;f1ep zKa(0Nhrw}*U$hXFltTfO+S9^8eS6w($X1iL;lA-<)-!;Ey^%d+k*&sQ;Ew zJ=gI?pCqEdotJs8;q!fY@~k#>tdhL*|MB$Q@l?nE_wReJk!-TEm643HUF+J)h$59) z2$gxSaE-1cN;XNjuB#|SM)ody+>4Nm$hg-Y_e%En-RJZBeg5?DFy8O`dOgQ^p65A! za@xfZvo^}zhqJY8`KpxzC2hcA)M7)=%${Y@xof@7<9b1k%BRmpBAJE~ye7Yu6WoXJ zmd*_T@sm5Qb4%7?uhQ&UFAMr0uvvFk`;RBwIJ+TQjgr+zsM@D7%8B{qPB*dwL+$tzH$h8=naS!t zq=RG~W0252Yg4N$ALP_j>4?m_)J+IH&O5`dbDcteX{67{3N}ZJ@jfztS@D!?6n)OV zCjV!*(cjW1!~^2iR_Ea110BEYVX5@NGX`T#Ofb-}>-wMy1ZB&X{jK&9)2A~rg{d{5 z3+IH;3KS$hV7yPiBhBtrel^cZV%ZeH)cIkA^r?!c#|QV!{4r#l^d)XqzD0{y8fxM!^;ya?CVf@(X|IZ^@_I{s;Y%KE`9yVd{SG7!_MI zI2PKB#~LW>K7(NiNA=wyO8A9Oq&E{;y_&zKui@a~zpn9i!+liM3jAd8Ke+u;WBZF< zWRhpZeu8C*m+(xjEGAxqyxK<56%X=e!trCsO&Fvg2J0TLW`XvbnXK)Wwaudp?hTuUUkGF^r zxX}5ZEX0&@EASF@XB#QUu;bgLWyffGH-_Fpyn4zWqDL9iw${ z42}(2)+79BQ-NsR9t;2ep#jZR?+Tb;d~Lrz>aMlvwBJC^kN8eEw1z=}im_|vc|w^K z&#J+%rptaGhyAjkf3_A*o=!I&--iwa5;vqQB~C&TDEMk&{M?V%J}19V1^aXfoYJRu zhje6-D>aqGlH|@{GkXv|rE?9F0Tz(`-=mk3k}f{y0@rZ*Z*{g9I;PvXSF__>d!Sn~#7q7CxN(71z@^o`~S%@~zcfC}IPQ!OYAn zO>%Pm7olX!Z3d1)F+{qf)?Hs=Br|#T%}V}x>o2PswB#e2_>?i{OJN5ce|PqkB(vx9 zc0Fs!wd3>8{_=#QIMLf9TyGc3d-(~0a46wP^z^}0Ci&P{+gza&1R2`ag1mY4QD=W~ zxXpmvI|q!AIRwSOImv*KzvVO`&GD&x(T5YEQ>Ox8N=^}q092pw<@Cc%TeNVOK{etZ zXpu1e?MKuxFz!qm{i`sTbg9SCw(dQ?o5kHfy2@tMd6fej6C+fUr#F5UQS9-rde*2Vh7Feu0r?-XX?v)T3yTByAau75n ze1}^6s?pLWc5~q*dnxAb@t3#H=A+C?F_4!`RmQgNgI4Q%wIfmk+6gAAa~&1Cq7UdC z-*ij31NF3+_37Mr)sDu$$IYQ10>2LJH|Kt;UI}H{H@PK!=RK(A$n<)v;$A+aZi}hd zq%aYvTjyIkM0hdc6l11QM%fM+Z6-Q!{em>~i^=~R0BDJTc!b||2BL}(eNmJ7M8Y0^3&B6)I zdm|U910iEl8o%DNtfd+>tJa!EI$U};z0;=KbdGN6Z+g8P-Rf#i!=DLvB1vB8Jd*I< zYhP%FQ>0;KQWGJ}OHU48#PWQKey$5aef<5U*c>AlNiuiOIe-$vpyUz(l30F$OL_aR zOn-x(vzMP}mZLG7o$Yb@FT|hSdQf~UI|5YADTA*(G+oV~mM_4oq1{K1$oX@>pZrVqQr#^sUSlAjD zL@Lfd?I1DvNsJ}weP&LB`C~}lkUIG}-&~j$U56=8-aAds&bq_Zb|1-LvWCn=)NqNU zH+AYlP3feFaUTym#mA#Y`$qr`Sb$al%J~N;0TrMxpqgv-?R)EGT)^ z@$i=EmP~mAava{YwvMzJIQLs$1r#)_y7^mMJ}$_@o6lV!cW*@dN?Q$eTN)pg`#oSF zJsRsa$pHouuTazLYIUqn!U%g$GRNQWAqb>g+ZTRY_vou>iO2+H$e=zwSxyw*Yv6Ml zJAol*jB#0i`(C_-L6-u zv?wWm&Pw~XAee;SY_RC4y@0`fF2+FM@jk8jQ+qqN+jz?^^YBDZHy&Lu6L%N;K9R0^ z_=lUV20WPubi}Q0>@?O?{>VI(ul)lX&NhlXy*mH!IRp){F13~W$qaf*oKjV|%=@qQ zP?7W_|mjOnPr8*xIe$bNh&{C{1yyX{pwVzxob!rUH3tXOjT=A zv-^&w8Z^ST+Z9hLzkM(!v9Y1x_A0QL#brPZOrRT6F7hWL1KK2Bw}ht@ z+896Z_(zkUcgdwVTOMI4)r%tgh!2U7x#^$Ts#^Pl`l-v zJ!2e8s?>=Kd`l02slY_-FP1D!xXe2(VDM%)AUuuM#_(Rd`UkLh>Iw*o*|prAb}Nf# zg?qo44Yo3>^~5*^I<{OjxO~a!>b~jbL)N8Vf$`ACSzO2SMLIIT==yQJh4Y@p1!D95 zz(sOqy7#rk6yErha@#Dwrbc1eySJLsdbNHXOWn~7bXjAf);Ui;!IU(OmVKFiV4s=i z`e_xW$;yYDct$dZQfIPA_F}Xkw<~eLtPYvd%s?^jJ9j|}EH)V{)hg*1asgtaH2Z=| zpB*~n2mCK1?wB)}`UK0@Xb(OP0S)j~JU3m8gtOebS zQ6Q+jtw{9J80>Y-X^ql+B=wXGjEd6H;gn7R>RqrRG*^LR?MX0t*0`dI&5ks~c?2Z(cRoUA#3x4%O!BktXQ$n(`bhU*y=u_Ss0w5MasegmP$j>}D1w-+}ZVw`|gkOECAE406{Fi707PaZ;3mY*Bx`^2W z5#MPpJ$iuLaaR?AiV^>Ka9l%of+u{4%ds)(#K@&RdkvwAvB|-2XQ_KW0>$Jz0@H$F zk6q;bn)&H^zhwxz=T-#s?uA?_?hdDZlJq914+*;C@^(EU$a0UfnxBPl_9}kAO+ctV zpRvS$h0Dp=Uq!-!*1_+7+0)Y z?Tx;upTEwRXb7ukCj}pu`JK-e8TT*B#Lg^8CR!goU2XXgiO7~S*mV2SU?ElezdL%bqnqE2Qc+XL^G+r|{&a zD!#w!c;#!3flkT+B2Se%qWFMu@#^NPMwnx4=El6EH~rDRusm+#I25ba#dpaz zTe8PmQ%9MxPe1X)7(=ONvhtae(3vFJd3TG^ynlFx#a*e}Ih`wiR9vyw6uFLGQS`iB zKD#8ShW+$ST=}dl2=iL}Vw=xgqt+JHD6tqPZyzjhH)uMth8rNy>Y^HE|NK_e8f-cc zY61}>(r>W1S3c|JANx03m-ekKExG%>n93B{5k}3u?t(G_9Clwl4#$CshR zDdYk5HrNdk9xwoPnWuR9L@v<{e%ba|Sl49(P$`={B5DoM0P!d=F+Gm+{R64r#aG8( zTtl8(UG3Q1@3yriPK^D^>N$T6Z}WKT$U*edHQ`@L+)?FY2McMk)F)4ZnZR*@a0f24 z_5k$j<)TOPEUv?W?BXyzf@Z=PUIkLegsm1oXn2+R&fe`7KaPLFxOS{e=xh0XAsmHG zi3yKf_$#KQ+>?zWbN}3&cnvcsM#!+>^4gI$+Uibici?qvN*MZr#Y^PLe<>=9Tn-h z+IK(IHM64AB8#7oX2EcP`q;SAwKe#Bm-2>PV73N5`StJHuEC`8fFS-!Qh66Qm$nNt zR+WhuV6EJyPGAJ{X@w!vAgeqpky7fU=Q*wZ`8G&yXw2=tEqwMz!p0NImd0F#fqLg2 zXv4?jFcyWK7vID0M2suOD2vpoxi~=Zs;Q!*&lIP)4BRuwxg>mg?O*|N@M{F=zQi#) zNf!L5lOJvQNV{k;5~Itgl!v-&{)Mnm`jLp48JP{o=X;gppnDbb6>&3Ji+RJVzA{+} z7ESTOlHNXEg&hIS|P8K=Pvp>bDha;WcYmCjosgqBR zRj=XP9e?TR1g}FXk9Jw{&FDjUVpziQ6_#gnGL!@klEy{ALDN`qVyhult*!dpLqIDI zx#cN06?(;kvjpkB8Cp~u;GL!%Bt^7eC=5FnOyZ79ufp5Cx{rO>MtLKEH66z87HE*nYnvml`z5mw{_;3h86GnbyPRL4w9iSY1N{&0!=Sabgu- z3MGDOq1a#X=mHvJIDexUC(D9d)%9$Dg>$v{`O*E;-Nga$X^-Ip^&Rf}O}o@3HO9tk z=j?BKY_}2x7i#>Et)$!LEkU@Z?v)l9n5z|Use--4c%E^$g5@rFW;0TuIYRd zC^JMO@OSr8Kt5}l!?H-%9eRi+{TCbk+_z^-3*r4X9Zu=KS{gY^DYZYh*7z@ICg=vA zZkg+>@;1Z3!?DNpAkiFx1gi{zX8)(KjWfxtFM6{MC%PNn=pLk$ojauAS!mM_O93S$ z_(;ENxcN+2N8Ge&M{2*6ux@I)V&s~yKXGNn@+&!`+dGsvB)-*>JdgKgmCrI9O%+(+ zqlDge8(r0Z#R&TD-2*F$e8s_~j$Um2_UJ_qzd5$?A0ItJy!jAg(}SUEm)<-lyU~xm z73b0hPG=cMMm|$QER{|%-wwC&84#cT8K~d?3_zaLaEYmGmu)bmS8?Mu?-d5%@*((B> zyRDX;+1$RqMLkYz2}t&dce!`(Qo^}A$$O3iN!T3vQCf07sd_f`Sz)p1^ShmuzVVd& zv1&O8nlluC8llQDaj(YUJCE-`dPJeW7Q5QDO3m2#1f6)_o_6T{c&$4^XBE4`THGNx zdMlB$#x-WyTeoL~>_YxTpy*==0$*rx?kp_eiuVleCmqInj&z23ey?@1Zbj2+<~J`c z^C>xK=;J>g7g&g=*YrM{I7PG(ST@%f2qv~Z$svc)#>}gx(t#Q>d^p%DD-0KlP=E5Y z%0shCIsT*LmiSqhbWJFk=8n%3r3@tdkI?WZB_iS949njQ%DJ-CXi52o6qL#S{q^1# zdr*6xK1?TKd9RC?W4Bxxz&O@RDfM`s#YVFbDJ96k{n49A9%;(egvk~@gzXif54d*; zgvh_IHNh|5CPJw%F4>yZ@kmy`QrG+UId7(U|4^*f`d)w6FO*HtQHza~lkjdx%O$OO zGS9M~dB&b!|IkT;R%SFeZLE7<0jKMMH$GM4fCOBWb$F9IQw z=-n#$f|@9h6J>$?I%kx<^-*@NrsyKIaA0D&kF~-rx1SIk_BfN1)|yG$j#Fjf(togo zm7poX>sLOQTo)?W{{FhV7@6$j*pl)VGh6se{^^1nklpxa_T5FlZ>$@Hy9BA=y{GPU8aIvi?ADIUa1dir|7w_0mot49Ru| zkq-Ss2Y@L&IxEbP3tO>GEPw=v@(pBJC&p zK7;feQg>|=q%2&_a86%pZnvQBrNvBk0)mvUAyq#5nQ9~fcWkFaEF%*xXKgL&6ez&) z>AU=~Ur4z=5efvq>P3W*dbDbTbMD`=B%? zK!3aX40{|+iQ#@O*XQaSysG^Vnrt*|3pSWvW%J8BNr=|TTosT88Wl|FF^+33 z(`{-ztX+=KZ9Yczv6jq&93UZfXg~yPvM1*tc|NncjeML+2?FCa^N!qn@i4^_1n)(9b%?I z5-Q9fF#DrBI{BmOY#f|^u%3k&M!#aJ9Ptzc4qlfza&soi(l0n90b}6%G~r3+5xz0f z0edXKV~ETE$mR)w<}gsN+#!-=RiH>P%)V1H8w{q@t0>b?la%;>!}dz3rh6zG47Cgw z#-Dq5a3!>Nq3Bxfc~XP10zpv@b$U4004yyYPLhUqn|G<6UjG>wO+5Wn^p2XVg5Uvm z_UVJGfvMNMQ<9j0YcG>?R$3yw7Zi-U-`O69P&pw8RyN!M1i@yd)2+Gwghr##sPXXW-Tsu|L*{@zmHwK?qq+f#3k6 zN|g9kFTv&ewW`qPEdb&+qwtf!);)iKzRVitrGZ$bk=R-qfhzd(d5IDav)o{=z77(}LT zM6nXjF=Mc&|J50Z6@#B(R55qQ^^kU==E^(_!vc)}aOt}Sn}7p6egRRtd}|P7VP9UE z{I2QdS;PuVg<#}vm!eMLRGA4Bz#*W2l~Si8A8fYvfm>5vmgNgLRrN2`)GS>=TtgB) zKay8`n*7r)eRK3-U3^)Mn|AErV!y~v8w8$P#S^o%+WUuv1dojddLb)Sa9o|cQ(hLYa4!B6-ZI@!)_guY{gW4kT~h4L^kNp0iBN>t?wgZ< zuUjL~kS-NS>y$zDJ5SD3dW-c^BagLldaEXxGc-VB#r{9&{nlhdhCMbyez;}N=$(wS zoAqfhN2|h!HuvoH?~L0Is_Aqa)3aFnY3BI$GS4 z7QBm1-Io!i{O#agmJ&vrtcf7#`6~wr!4dLzdX*u>UNO7RwZ)*5+>2ylK6s&PNp4_- zL*T!#!>b;1)-8E#9I+9=?V)c=gFLpJJp15K%xhA1yo}cXyu0ZUAQahXQAMLR6VaI>sss<^oG# zYN^*F-WRJ`7W!IGN1RCUD`6#uaI9PyCY%E_QSt|UBUpBF z4erG>fddH|HdY$w_>H}-?m*1+h+kpGbAib6Dg)QSm84vd6N-1p(nHY=*}ZvD!Z=hvkKk!Edb~BlO#d(Z zendzEom`Vvvx=_=N)*>nt*uO zncmqe8nADU+tiF8_pPm6)@1b)^x?#&D{@f4GaNJkLmda(B{9Q7#x7Me7D;Ea~5=`aQ2*17()UdpWp|B8rUONvzh`=+RcJRAS-5Rs>d*~0avRRz6XdW_IL zI&|iu!1f*wfXac?t?Z-LGjT$Fya5yuer&J`&H`?I0PTKeZ$*v z@W6X@=^>z*j_(B^P`%^tHmr;>%w#|tf~bZK_A_&=L+aupZta+b&Rv#US)(Uwg4#dR z-k7G!kqsq;ZNM2hb$^SiCmr1?F*awG+Jtf*e=r807UVA8gw%C&J~J0|PiIo=s|SeY z1A+jqo{qd1)UmYpgdYNL#-bWuKRSy&0Ej#t+DrbJ6VS3Z~Yh&lqBUpY5l#f#^0lka|M*oYxl zDO4&AR7tZ+^w0`gCAQ=7R}8GK6nfkf%lg1OVCXKAO)w1P+PWu@Pm&;7hh2G$KY5=Q zTAR}S>Z$`q&Tb~+qSh;qH$5{_bTfwjPS<}jwYZc7Ex(E;^Raor#l%@l58i&RZ?lms znX@_H*;$Cw{$9LYQrjQEd^$Fz_JX`!%jD?cpkqhyJA00|R=5_;UslRHU!uCW)0FR9 zS$*iKQ%!BN6zmL6dqwF(sxT)o*AO@@Ztf^6F&BxM4E%L`@b>*9R%8o7V68Fdz4gB; z_nR82^w_c~l_t`IJ@+&69qU)~0d?g`u_XpCaf#K%EsZMic67$KwC51*nEgbZw*M5@?v>0#GQ#+PmK7{FhjB1j`0IW4y7 zp!)oyEYSFX32b64{rig?W+kCy(SFfPSq3j*M0#7m;${^)nf8pO1h z`o`49vUy#)VSq`^qr=vl4;^F=yXn)zQ zk5VC_-sP}NnKL_J6NsoY4D!Y!^i??wXM7i9Eg7Xb4PI=xI&G&}u{V&L<%sFNNw@-F`=d31ItRLDT#BOwWxyr|sL1 z&7hcRiR$3AJ$8f2F37$ml(?pcOb4`@g(~9SHM`2L$p56Rcq)d=7-oQH>St1jicXZ(JZmq99VyehZR;*F#uWSrB|LMlIyMW`mf zaD-sNtgseEHXQejN^kk-sOOHePnFMBuTp>D^vd)Fzo5cUz+H4TWd9>e&2gxFzv7Ce z@B=-(E^0iZ=y;~6PW!`s6%#ox^bbcVUJ%c; z9}MVS)Qct;BBH}T328vU2yP-=sc2hE{wobXt`fv%YRbW+z$)4p=;Nm$f0AK{8@qc; z#eo#HVj3P+mm&S_6=k_hb`fOFZjePZOEW_T6gAEcXEh!T3>UDUi2{kXHZlGnxl^rU zffzMS&!g&-&lcvT(rqZo7Pf^sO9?_09S~>2IP(0UA(;@a9IEfqdf&$2L=wYmrC0|8Ebd47g>J0{twK|) z`LJWMx9NQy#jC`#Q&h`t`Z5gc^-&~7p9GjY5p4H&=1wi*sk@gJehBvde z;H#PiNqs4Eos0cs*6^VNwoOZbEMn+|pKh9mwWdG(TyZUBBF^d8wVA!i2dS%=A932% z3jF#36+q+7bABd3Ss)b2-?Ylk~MQleTGl-7h+m3tR{ccn|Q=`r$6wN894S-aMdUn}D zWchmSz+CXbq6qm1_n=MFi#Y)&hDVnvpfhzf!(e7jTf-I1v=T@SBPt#i8$F6WjVRbW zL~QTuFN9oX$hv#T`p;e<(c1o4on(-sS;q4uY_Uyp@DSdw+k8%r<$diHyyBg_n*i!@ zOF5Lt1=RClw5d>B{WCC4O`S(bI#u)HZo~)$oW+m9$S{B`OHU5Sqj^dYn7$r~-XjRj zTsW25!E0Wd%=qWr$k8YAvzs2BIfb1zpu{^7M0CE)1jj=DDXC5Vl>cSx#*a(+LRus; z82A*E#1%JtV*ZTSO3<8PJ0x^_saRedaX z4J*k8Uw-te?Oxc>j3B)p^=}*dbgEPTmG8$kj>6Pu(it!>&`n-}pln{CY1hkt%WqPF zZeFH@R?@gH#rrG7FXz|gV3uFap*t5I<%q8%rT(ppD$HASY7DCiIpN%kUi%5{cb*c+ z$&_YKs~;??qz{DR9>NEA=&+A@Vn;6sahWGRf}+Ga7rst`@3XkmD&?l2+^0ryF0j_tk*80C4xLhE1^_dkts1v z`5Rwu@x&>1&gpK_N;W~L^Sf>1q4A=1vTv}#Yw-|NO6fxwu9v%2^mQsU=yH}-Nk*;! zdVHoEd0-k5GHtb<^Hso_9%s83dLz&;AiC_@f$g|o-uf0KzV)tg#rJHTH&C*6rcfw7 z*}Q)@oBR148d4R2_8340U>wtLNOhe@>~;q`vg3H%uyaA&eapTyiYxNxEvP%Up(9(( zd%aucWN-;VjE)duPcL@qUvxOfCb**#9wx7jY=5jbb&5y3=lya-t47Q^fF0w1^OJe7 z;HrxfC~ryAF?yb>25yKIj4lMZNX2sF`|TFbOKWxO@mlMQLk?uZNrM{n-S~AEH3&F-ze-WbFl` zVK>X;-9H871!1)&x8Pe0INJ+6AS@<;U{xM?{}Se)q+XsKJ#gZvZHD+{RBs)FjEG8p zpuLaVhJFESh!y9sEBGpdN|Or0LjX0Xl2;-4!ttxkA2pLKh!dHnltIJ6tJ>V5_HNO< zVkHNmeS=PO?9GkpGjCNFw9`vi?bZ>c91|QIh+PhBDRW#4^1g3- zL%eHF>E|J$)%K(o$;Yr^t|6NHzQ;4hZ#5vFEhCbgK%I{Ek#`DF($0II{KT6D$D@lH zvz(GflqSY`gG=BHIJ_d?s5SbzO%v0_@bg&<^_ zw*|EL#;_J0u;O^|I;LCz_2-AGkjB-=ckJ~n!K3@azdI5&#UKb88k`dk|+>h9lNT2YgZ#hAi`w{v)%#moGlN z77JRxsHRlw5Z&ao@PtQgQJJYn5?NxP3-$;UHes~;q5oUf{tx0nwmgGuo&OJGj5jA< z)i0{X%U6z;tl&MQfcb~`Ls6I2uI=#$BuNN`pmpeRBN!7HkD?0(DSlRaKK(u#=X6N^|lT9}-lwX5m$rtqK36 zMFH?}a$i^N|DzKy3O3p3%>DGWo{>>u-@3bh#I6gHHK$Aw_K6Gf@Np~ZUSV_TvgOEF zd_+UNKzzi%pP@euiq#+ponJOrln3FaReuT@iCaId0TV0;SR?7k44=I(Aaa~C z#68*7P6X-)_)K)PwV$y#ki!xQ+D;~B<&7B??ja!&VPKh(@i%c(T(CRdsFzkw^Tfgb ze(dV!UaP8NXE&U^LSabDo9kR;uO*CU{i>e(=j%d!N~iVoWVmH7qC^wCUP@{PZQH0o z6lo`;IGg=a&2I4-1aeXCiSsy|{;~Dzr{w8IRAqORFsk|YiQNU^qY#ccJ=4>8nm2@Y_x8mzk2m4; zY!09fpy{|~q{qWcL=+yRgvfElp3a73a_nNxVFpC%9&L}CV_2f{mcg|dxY`hiapyxs z0F-4qq^_USa^{jSfT&i|k%E#h84t_Sd8s1OOME(#keKPkSCqP_T=0Z2dk-O8O~tFM zBf~!OT6>PF%d$1P$m&s6D#*P$$1Y~nOTDmkkT#m=0Q<1i`}Zc^j!rZc?T;_XPd6KHTOq=HJ>19O^2!-sA#L~Q;Q?#!%OLc(bgPs?&80_+bEfCjD03G!RHO!_p->rX& z1@#AX0uoTqo>W;gkZ*j(cu2*`}vAVg*8;Uip7~luU+I55gko~7- z>+;8c$p($+ub2F<8ljSt;~w73__FMYk|z%6BxQ+tx6lMqO)teNR@ zEwF)+heaF;UetiY=KtR@_!n59I)O$LZ8Nl&`EmhhKE2$NaZ|^N2S8`5@q)YU&VdX> zhsB~uL=%jvvKkHaOz;o>zBj;;{I}M_Z|vHYV2{{b^$mEZe{IPSExG(+>dI53gbsMQ zs&E~b%{DoQOi7}er7T3{H)q!+?c<1ztS9QfZ=An}X=3G-1g|UX4vvo;qPT#U3V7!f zM&Uw*9{QCJPuHGpU#IATf_$e3Q(#u<{|)C||H8Rw-IzGOjQ`w|33H5)CqT9SFD1-} zdr~=L(4LBfOg;^bBAaqoJ>fr)0yoWMy>|Yc+A)Bfyocn|+yD?HUG#WePn9CLZg*C* z8Z?=|WlRr&A7FccupIyn2I-Qf9sjps$0i$KRijG>_N<9IAaTY?hqs<^K&!Ejv%KJ2 z`X@~gt{I=}Z@Rw7-CBM0$8HtAG4}X9Pb5<3 z-x(clf4HJZZ~IvB@&y%bogcdZE*eHGxpqzmHvVQh7cNWgfSZD)qCGXC69yv{ePC2oBHqrk~97Uc$>Q+ez zrdYw~C&M}NANVjVE=C6cItJXK%(C)1R-cEXpJz)km^a;jSP($FTTL6|T?o5)CdiQ) z&$`yjQT>^&iK~gHz6Hb%b{dfTTG4*XU;TTkeN%f`pX`Z0Q<#eKb2XJ8(9@ZiU|i(@ zJL@k)kDZcBsRfLUtXb2?)>)nBBNvz3@rJaF()41P^aJoqQ-3k%yN$*Yd9Qx z<3diEbc=HgJzl?35R>}(NFK;oeI0~`Wd&R zRF|0j^JkxC$=r)ZoeXT?n4W9ukL3p4vO>XD59gYTgl(4&SW0ex3&Yx<*7JYuF+GH| z#m4j+3}*{&kZ&hyU#BA*4j{7?(dJyyqZjf%2r%R&);hk|s`tQ{(JySb_V3d~96J6v z+gk)bleLJyHXT?zH)pkyO%BDnI^z4N<(gNeZ=HGTmtS-hN|c?5S;D`bifJgGnWP@zOcc``R`}Mj1a7-`My)>IDH-zc!~PG{cr#F4H@CDqGZ& z7R|r%sw;ts8brV5rkHlTJ8Vks+Ln2HBHDi+&u4B`EXwsn#Y=qT49ZC*?_;u6JIsC| z(z~^F=vMc~4g?D2mFRId?d21*cWoO*Nk!h*l5F0rXC6$_EAL=GUkM5q!)j{B#}vva z9qWXU{TWfW+>N<9(bc$sRf6jm}a%2b)5Ni}KNOob$f8A6yNmJ8QQ zhIyP?`V3lCtc+l;eF(h>SblBS6~21UvvxEt!yQcPRaZKA>y^!>Zw}mfSlT!? z?*41{=Summ`_heUc){{_znzZ(duu*nPQP7_kw1$!_4Ic1hSbKb-<&NtV1?hjxE^r- zNQaC4o~Fnte;et}wqn1r#l6;%z3K-{FHIj7i#_b@+i_*Gw74_(vq8@1x8r+9k7?y9 z9Sd!%X+rY`ffAtjWl~K3^UZFrZRlprhr6wB2VQA>l#yQBB0hS1_tJYOoyJU_m;p80 zgP*K~WRd)+aMyTb(i!%e!Lhss7APW`>09-wn5L{377f?5<^}76Hlt&8-CP)Olva1X z)ZR_a(?gLH&^lAN>U!t2@B=Pfx-9C0Asn(_+^n>;a6{*D@|i8g!M5wj%}H%cxM!&Y zhSHw;p34?(SxAywuG!rd+J>=H7CeYO8Av_80z9oFzR#Zg|8Ra zo2+oFS1$i)(z3HBjayF5w=E4hmdmZa*D1MP)%JMASxfqT=RFsdo4dl)H>*Ea1AcOf z->85Q13nHo(^DgH_fgU{i>6gf7YQByk(UT26sbdClZ-ODgZ}F24-GACyJV?Z*_$&RX=*%h@ zJdpB9nIbtS0_4Q6c-t0o5{I8*9FNeW&uy^r7vTGu_)u3qlmhHqSYWWHMs7$v$OO=% zVx87mz2f~)L@6tNqG0Y*1lcBn4nX?>^lS{e>i{wZ?8LRgnjnZk$#Pntv4%296)NcW zrkuw#QI$^vXpZ_1g18B1^eZIxA`MvpyZajdDxE_hztY_|vXxruq+|T7UXv{T3?PbD zpL5hc^4cgd4UrsoM)a}_l(|S!|6Z}xKva*sa10suxZd5-(B>!0@NOa{5-YTE&r}Ew z)CskO-)+tdzu`K2U!DO^aT&^e%R-EO8dn7qLKvNT3UsZ|lBGju6dGd zIZ$=>6B8W+hDE(}C93W`v@-1HOcS0aR~9}&F~%pCOI zajdpz7SGJrBWYku!1Y!!Y!rbmw& zA-E8wy-DjF2-cHkjX1w|)q*qMnS;KKX$HMd*WiF=EV0c$R@sNy!tHAiWWbKnSiRgbZ=%9@^hWd91!{e0Hok!d&v+h40^(T>^6f+43bbTu!U z+Ul?yRR;-ypb-4KjO_7eW7jp+6DnQp#?1Ngw*gP>B^!apjWdWb$lyZGmplO9%UQ!b zC|4A`Hgyv|IKf10r*sh{eL{bxB{T_8K)`OH=XwDUmP^ncF}8ryC>sv_Qa+gYqtp2Y z6u=e6?cQPRPah5ETVw`>K_*>>IzsxuTbZ@PUgZFzjW>ipFB$Jjlin>NQJFT zSxeS^Jg4XPX#hTFpR6$GX%RN=KiCINd95+{(X9Hrd+VBnK@BLG_GgcuZZNM*cHAkX zp{za67dN)SmX^b4$?^oA5U_*hGHYG%`cI!htS7g2RxZ6*=kj{CP$u!^_D>Ht zJC-&*y+A*r67BF>Ul4F$MijKLe&%}m-KfI(&`QHm6%>d}>V3!~7>^u-phw~0He7hC z0>=BRqw=mJ`li!e4+qUQZj79Ey70w29Cx^I$e@AdmVYnK;$zk z*fY~MIN3&?ykI^>eR(zjH(d1a@T%Q4>1#wrqE`TZWkATZ$3Wih(z0H0Y_NOe-nrxw z2+9Vd#eyrEd{%q<``57$P34Q(b>nY&kFIm|0a*nIDwLfaGiEs~xVasYsoqnX8hfWz zEzdj4+g8cc_${galPrCjAgPs-{>r^9EbNg6q8WoH>H!X3cRl2l-@fk#wAM*HvJ5sG z2$KEkMM7BevqkGmMgZ!=7F+glS!}3;(86!Qqv$7fhU*$?waJ`@^rugc?5GjbMe9P- z2(F_ymkDFHXL28i4PeM!1_|^_;AN<3-;SdDSg8Mj1+zZXf!f)T03n6@?_jtw;g2oA zewq-N_`iQhq5BM;w=>EU=mlK zPsP20v6U_jRa!y?W#Hfoj4Jr2;^;TgGu^Pd;b_8c{>;{BlsXsqvVU$RG^R#b+}&3! z4Rg61gcTumd=(+RU{|0vxHO+1FV7&JXDNiS;d)oGp`|G#wL*f?=&KkMeRtT-q-OC(T5`N)=}VB0 zpj35MzQdaJ-BN|(#saswHZ=ut@>(jT@>TCyFeMXySnJbo=?EXo6s+Yf*VyIeMAbDm z$~|1pE^G(tJbC);eXbM(?TvQ%Tw0>NL2b;%`@OaU$A6+V=2t5@S#G9qM*X(?4xu)I zGX;8s1fh@D83q@kFx}fknK$0&493>z%C>%ZVi}ox0Caym%I+>2JH|sYp+`iQD`fNn z|HsmG2SWY-|M#7}$3Gg_W|86Yfz7Wuol5EqYB z*0pg#WY~=wcM=f4*|2^u>|J>&Z)J%_v6}6ENx`BV&h4^phC7yGVP(9YG6}Xf!rji^ zVXvKO1MMkChPE5hq%GqH=rqw=WS|NOLI}QvH2!k}F|$Sw#+G$` z_jhmjQa78Wki0F@M}d>Z2J=b_YY+mkYWc4Wy72*N8VwawYxk`Hon>5Ed2%5fUccWt z=GoEzhC>s%eDc`6)0CJ{GC+Q1_=mRjv0P{}gk(|LDQ?r1^KuH1@Bln*q%jPX=kvcOfS@??zX#WXT2Q$SuFb}WQ&%-(ej^rK zMfxj5lX?ATjkKjy&HHrbrkrG4EDVCie@B>&h`@Z}W);)orO+8pih=vK%j4uD%k%qu z-e_QazR>PBJ?x&LGEk1jV<4!AfHNU+6U`JM;4>zI;{I*H0 zfyM*%=|DSaSeYA*S}KGYT<|QH0q1P}xuG+WY(qm+-oA`4BfiWb1|XRB8yj@7)^>I0 zpC1{{u{KQn=)13a*k_YcI8^#J?jMxk_vGT!2XLc02!MD5IeJ~>_QkB}^Q4|4?dK%-pdhwrCFx(!Ky)tXP0uBAJeRL{^ITsqx%konO8cTeW>vMtM8b!{JrAh50LQRtF_Ve#Xi zhkfEbevKz1hNt2gQcXIBwX{PNB`iD(ue;C^3?J+C8Zsr=T$l^rEN!^Qc-|oazY`lo zDxh%<`*|7AxZ&qcoedd6yMCvu9!@EsAD#c>K@Gdph(qpE$_`A@;F=Q5JXVU;Ur_)= zt9=T^rJN>G-267?TE~v1eYho|Ie$=6z7swgRj?>%6XYEHSB{HqzWQK_VtGDaU5At} zF8!5k3_X$_yphoFNrf+?3d?wR*H7X$!ZLZDSw7FHQXQ($A&No~xv53}3)~t&3j@*) z)B|_D$a|lq7Eb;I0cA4@R0d6(Bi(nwH3d6e{UfGFP`m?~8`Ud#4WjUSX|;FoX8 z(%@?L0+!@(F0OWm-|Ha(d41vtM5hbj_xLBbzwj<}lnxhJX!ewl^QxpM{P1UVZ&};g zw8*W}_@o;X_#Rj^SX7moe{XACii+&4@@)I&xcgNXGx+UVgyUYI3et|ZaFTQGjiSnO zrf?D6^i?qL)A{yzf^DU6(($jLo&{ZBO)5FEGk~Oz z4xAL0#pohiY4he3?_gCZU`h-)k4Svit-HHA+cqMFA4~$dUgAOTmAw4-eSUUQ-(0q` zN^SR2^x5wmtSNc6>FE7XS#+Fw(aOCDeNH)-fjd%acfF0#VR+5dJoLLGp}PmO;Hg-i zvqQtCmt$;)%p)q?hctfTpT3t9_u&@NH7Aa1g0KgG>1?(YzkLtY@TZvPDyA0vR*!|o z3}WmScDJiufS5YiJ;o!ob07|?L;<3x+F;RVb+20HI6H`N4Vqq*4gVHq!6)AA2!7n{clLdXDqOW4=d>xhg~Kk-TICK|T#>7*-Cq z2q6#yl0v4+1_6yA5o>b7hdBKm2~}Wdjg(-ys9mba*0J#qWzSjI?b&d0X^3DTbrd*~ zOX#h-V!!q7qy>tiv9RL;lmWFqJqVULOgg$7jCsoZUR+2#&|*=T+*Be`KsN5Ee}~_$ z$1;QpxlRs~<{fe4y^s{$0RLoA^KHP^atY0czRQN9cu!r!dyVe&Z_RmPJgG1PfcCnY z@Vx=X7)E9KVdiY@Q!otf)#*~kZv_Vl2qFziW#=Jlp&F! zB0Fe4CM$UrGH5k9SsmujmuWF^exG7P$AAuv|(Up}e)32Wm(T&SZ5vcbEME{_#LP#7 zi!+2fC5H^$&L^&r8I=u5(pDZb=4pnlEoH{Ayz1)qTgcG`gO(n zP+qhhD=M15#fDRl4Tilt4>`J(LU3}Z%2+wbwnc`Hrg&!S@+8kX@jRa}xc6Wx^u~t~ zrpINbu-CNDL3E>i*Cky{t5sc^%3I38n;HM7`B|#XGfqBSeJD@NsWzK$PK;AOTFeXgwbr{Km-pvVgrMITTbzk`g|vTsj{6EaAZJn zPeQf91zSpzvjpWVqR(rNtN4!A^EXTXx=ACKKY)zj)s*Xk%yF;Nb$jx=E9{azs~>)? zY~GdSpCFyKQP8PF{(mnNN{CD#XI*WD~62MOx!GHQsu6Frv?Qm^u+fv76-0hgk zVC)d7_xkTv^*b|xr#N*!d&f66_$V}{nA^B;sPm^A#zBPyui+asLubczda^TnOnFFn zG$TVl2*C(|H30ea!LEX@r>|0y_dDXV7x=%wZliJ}2Yf6}{HsZ!mth;m(=Z|cE^v{aSl-0l-rPX=ZSWC} z_{3^!8P^CMDEe@W?+d;n1zJpA#pSqtiS`TQ%lpA0K}HBXOgyn!6pA>0GY9Wc!3xL2 z19v~I=w<4wu<(2e%!@u?0|A=5^EzcRQpEYQ1nC;>C&rE;#!tiUzqpp>W2zMlI=8R- zK@mJ)x+dgGTUd6bVsQ$%$Hzkpg=E%qm9ih%9%LIg3{_D5p@;ytaAZndIq4f5KI zIhigyj_JQ!+=$Ow7fa(0`>OA(r*Sfnf3u5LL6>+#vrE6>yUKt?i5N!2tq^|pD|2Jh z=3KWeK<(Ou% zWaiQKU+Illu7#@_ct9i8(1gu`lNtRWV5+ctMgQ zlzLNi|MD!7(5h^QpU+DAx@|<(cJ8QKh}X#0R+I0K<{$t>1`x!}fz6NAy#ALFRPHmp zdGccW`$i-)m~e^|GrqiJ+Cvo}^;*U@aw`_&a|2Xg5=4QZDZ8YZG9Hwni53YeTaxa! zoGRO#+Nkm{E_&IPZ$|pZSxf4|T6jq0rOH|$Z-l_6leoGbw9+3{$ViH$f1BVXP+@2l zwt3{jHvg?pRctEO1YYt`^T@sEfl|<@?~wYX*|Lh!Mj6lvvS{4hqhtshxfwgU7Bn9*OJQTkjep0+kitrw%p z&|mV4jYnPQOy$sIvuZn4-NxX)qib{HtrL~#Fdx@wn-&GpKf#QE>b>BQej`6Yg?Uxfsp}}fz*|d#NT*?yXF2vnczxY#&1h~q+kUSlP$m|M`kaa$ ze#hKm9xNIJPR7ik1#r)zmf0W(`k^mIf{Z8gF@%oVa*cOnQaHytPdo(TT(%O{o4 zU-Lf@FgRHhie{+Ra3TPt1;u9)JgJnWLCeV6vN2j*oL|p-2;phq(Dgsc@(ib1;rl`h z<_v+|dX3NnUhvpP_sKaAIn8+cUs_#x5O6we(LfVg*U_%xpBI{Q=U5w{fZ?B^F+R_;E_Uf0*{! z{=pGZy7fkSDogu5C`Bq?qGX>jmFUxp?Y4RyIWK*3bLRYH4()(*THl#ym-a4aFJy-h zoM6&i_(CpJ6EIX`SM-cY$}C1o?fO?qD~5DX5BZVK=8usU_vWO+H)0*Wgv1HF`|rpJ z-kIZ&!AOPg+I%ZjuOJBXXW=Whcu6S1SOUfj!!lrl-*2i{b$l_=)Ei+UtQ`NV<>AYN z+jTj`3b|2V+^x}!D5=WdTgn+ijveA#u9ZLWc}K}wlngz4FX=0}9zYQju~K~^x4O~7 zx6@2+Z-U)Rw5CcMVIUq=v^nLMJhOLqNR~Lmbx~B>+qq;vq z7UJOxnMw?(Y`YyX2r(BOW_X0|YIDrGyaB^@Qqn>Y9YNdMY|KEe<~hD9@_)S~c5_l~eoeZn~1TOqkZOM=DqaF@FTj7fux;n4%a-3)|)+x0%iwPUJ~24xjjAKGt~u>-|_e&x%TzhvPPS)_m1Hm%IsUAjaFZ>-^8{;N96=<+z};sOQfI{6U;W& zSBF@Q{)glSRvAgPfrUMnoJVvoo8k9O)z7}X;Jc5e?%U1X9E^E(!>s704nF9ijt%Lp zy!f53-*EDkcg5uKSOw=>v2vn)xr)%4ujhRh;+cg8cbN2>F-~CN2tLI2xmbA1t z4L%K;RzZJ({aciG$r@4|FUlbF}`ZiRvo)&K<>&y&4Wf29q~Q z_Pb#jFShRogb7PrB5R5SSJwG^dUs6Yea_ryeIq9mYdg9lc!fFPX-*OZfcz+MEfh{`t8`JF+EqR>uWqwbc_ z`HGV#C(`IIm0eJ@0lxY+vE?_@@6Je(C(< z4?bWwbn$%TCGW38D#= z@wcPR+rK*(Xct*X?;ZAdfM?ylB`iHasM>&;DI&3zwEhqb+!y3`+lvQP3xP!nb0+64 z6*D~f;s108LV5KXNl9kgZz84ChTMLn)A>lnT71a%c9*=uu0f#(I>z;(~hB@n}SyhGjYWc-YNo9sVBN%F1> z$PEt-vvY!?YQ|OP+PbkCy8^!d%r;CM3C`}XxztH`7X|7r;CuJi-b^M4l~(1+07dk}>$;i-Ik08XsH7Lp%2bhuHd^YM6t?aVe56+_ws zbES|x5|l+!AmkvD-{`g;&5sAq%l-4Nl+_1~Mu(iZ1I^sS$G77VmR2xHwjrJSHAA~9znXdsC~WG5)?K#3lG2?- z(Tl@C2$M2{(TGj`QAy`KGBbG|I8wG*1Qz<@U|;NB^iPG11zK2>8t=tUh2%aki)4AN zQ(@3Xf3tgdX;IKmcjuF((#yqE`gw!N9o~(f*|Zanz(w5_%rxhi{jbm=5ws(8d$nu= z@Itx4-ETXBU4>U6jhJiw2^0ikYYw16lehvUsI!NDPD@IRN5Bw|KpIjIDL_3EXV3}! z%_JjuH|jDvSpv8beEkQpI_Cf|fCYF;%{SM7#b0N@F;`>Eom9Er`BieF`suf;b3IFx zW4-R)V;`yxz-(;+nR2e0%+rCoOX=Z%yN<88TZt7$OJA|#hybGodz``Ymv;=S0siXS zt1YXq1zWO=v>WMNdGR{Z)WiLEbO6Fl$42oqCVq{<-ef_ze$hiB3Cfyu6dnQBYes!! ziQrdYFK28TrlknFD^D|a6(BrDHlDhmZUDJ!%S)jEqC`e=S9eEs8f0M-f(HUkCYXXh z#U0neCsmds(wl=p=$aPy)wqS{B!EE3epwJQlT3=LG;es2SwQ=drc zn7l>uK8IH+>D{}`I>s^h60evRX+Wcs3ni#HS!aC?xBVT*b%n|g>&GieWgB)@d4682 zZFe%dALIPfrpPw9fFxHJaa|bcS)8L5TsmHUnmO!T&NsK2MY(J?)3_aYR77IlcWwJzM(cok%^mFLP zlyPf_A`(=6)xEDhr5P_sZ(|U^^GQJ`z_?(q>$3x`Yf`6;6qFTi$H}h3O^ESyi(IkM zCl5;HUTVx;y6=lEGON2G%Yf6j0u-#DvuVL2Pj=z?{NK4g>C0ku@rN<91}|yAgiz&E zO4K%)De@g-Q&q&WcrhPX*`EPN?X4A_z7@v%}}2_b|# zZk&EUPV_f){Z2d_){&sG{Z3}c8+nm6`vmReTByk9=Qvn!C~+F`9eGdQLc1={-y)l= z^na}D!R$5lcKe4*afbMpFWs@NRdPj3^im}x7{=SFO&}GOwMs^bIUZ!gY zT%`Q=x#pze-Q4s>>pI%y%WrUc-ZOh|Om*9BR+szr`q*49@9OM$Zo{-4deW~RTLw7TAOkLJ0vXdJ;F{}KPu-&oDMJu!1JlcpCZ^J6pm~Gi%?98bqhCw5c zAPGI`&+RpmVjSAaI%{2qWOZ@6!ykg6Q>OfExJ)gvXY44k+#U-m9GOI!jN}PgcTe}6Z+V^w?~B!OH4%Ez zfxXzKwe6nY^^X{EqxBvuDjQVotHQMEANH8Pwfr+dF?{R| z9zs*Snr-Uf{`mXcHU*U#&8|^i;W0 zUj}B;XY)g&T49BJedjYtQYV5MQ{OE{xu`3+lcQf7FvB!dLU93FS@-LYzhpj5d9vYR z=qIkso`{$RY_;?@IIpmKNWk_5g3N*ck}4^$toM`B$&h6Fn9;OL<_n)EAAGi)ZM(rI zk_Xa{B7-VJx8MVZz~UZT#P3CU3kZ&j4$DJIxc?{6_G45dw*DnesHoa>(=Gc0`}4fF zuU=Q1BH`dYj|lOW@;t9FY*CY5o$j1Fy!)kGCD|@K&DaZ^3m^1o-liG|f*Sb?fCvE( z<8;?xoz%Vx5L{!s{Ew&4yHQN7W5xHS{~tvPev5he?hyKbb#)_uP+mM`p}>@tEkS3y zNVeO#qZ+4!HBk#YQ;Ehu=@$DHDqk11H#gnp|K_CMd`62w*$lvHIHN#Fg^`;e|4pAZ zv8wIZyjnq{L&#=nx;@sjFTrl{^{0lX)+~kD;zDlV2SbGe?WH&$rbKJ1Qj*2cvyu}8 zv&-|N z5f25y30kd!ad|)5U${3DVdGGDtgbzlkFmx?Mtpht2P4Z0x_^vc&41b z!(rE{=8_qJa9Obgh%PQ`NxwnIn%5papfeVyf6u#KDy{vHo`+cUjf|7&PgE&9_!lIh z1u5>$FE2jXPfn2q@~~mhd;2f`#QkHdSxlu9w2xtEl!W+p*c2d!0MqAT&vN*8cvC$# zn`6NxEbc+UXCExUn}8r-NXP^}Pyi65xOCjHni;_*eE_jE*L{o**M+?XO315eB!SQ| z$8|Wyzkw##VE^u!P}3l~cNhy}C=AyCF2I0@Vw(y-8E?&7#`^3e*LX}Vi~F5Bll+#q zshr$PZN3tn@BQi9+RN#`H)e$j>?}A6)3Qye>J9yFW==}GEd&{#{Op!QvQp}x)_(b- zo;%E)*LP}sn0Kg6u_K8J(7mbcQq$j_NSWSqCVZt(gej+64~-JOmoQ?Z*vbm3DHc^T z62jl2d)-y~6cgX)l!iR{EnvMvr-R0>SJuLC{CXueg znUVhqgn3sXSmo5wY5IvBRbO!eK7;6z-sc72pWy2*|Ex!qWH7I2wdrkN z90x_v)cjDnF-z2gxQDkf>fSc8<+Y0XAGDb?F(wezmfJhkw^-u-MG=8%p zUkJO~0F&8G9iaRHRPvId_~H=%SBL=ALYb@cr6ar;JZs*et(pT4;2UI-ywBj!Fvtet5(Yd%0?1YA&uO4u#BV7s);q+>tl%%l~n!YTQo_9TV66``)^;todrW9 zDRTYykxbQuzL=3TE#?uR`UkCvY}MFsgWw+nK^ZM!7`ImoCmnpr_2I$KdP7ajDO}GE zdp5q22wlJn<*QsjcM=aGuV4+e7C*K5fYz#x=aICi5m~dVVfr=w>ytz=v1ySampJ`? z_IUdE$F(xG;usNeOiG;JM+(B0lwVpr^rP+)q^XCJ+##AD@U@*M2hg@iF4WZhEkDE; z^8)f|eBgk#-R$usqYB45ye&F^jY1K zin;v;8&v>ep_rst*ZZP|2jvHirvT40@lzQ|GvxZcu|WEO#E&~mX)m*0;lBk+U4oim zU&RleY%XQ;7haUaD66id?ahuc>mp0S->~0Pw7ZjBN4$lF# zFw2+O>|{z*(KW-87Kwc!osKiK z$V7!p-1xUS_$$Hbb?tC-(Hhy!snIv46QQjti|188aSg|RN%V-5V7vye*1h9w#Mioe zQde2yTlZx)I6Qop3|}@HqY2eq(=0~g?2EFWzs1fR3^a=y%}V<_4>xxCCr|#0I_75N zi2#L#yig#zlUr6f3CNoSDXZ!$v+Dk1fm6JCt+G+kT#9PCn`_OJg8Vg!En1HaUlL%q1&$_eWIzxpEnV69 zyA>e$UdWYuI#mZFzOG~#!Kr%{(~xG;zo#Iu(;r#&0iZy-Tm>9W9xJ|-@pwQenbRSU zb;9X#DgJk`aL0~f+DlbhtStpWg3Ljde{u(MxN07LYi9qAe+GB|wHh8!TOEy3UFan% zCzK z#jT>UBV%ZRvJrW-Drv2n(- zGJ|JN!x*LvkWz9PJ3ITSN}jX)Lqye5uY-qWGtT8u8k?)a2~#m$PQ7Zg?|@yhpI#rNY}{#O=>i%}Q1P`1d- z^m<>Fr(KJ}ZjsHAMDVp9{d~IKcRoqsnrq25sRc|ZDfak(y+%pV%Z)Vmf16&JuA(G>Hya zd#qn)STI!SW#pOX1yt_k_lHdQcrw7SCzr2ei7>zn$I!72=|?oWw>#mbmQS{hl%TEE z8hE~LtwSeDtQ)D9DfiWPyd9ta+f|M&L5A;VYu)xC$?mtKowK3ve|miW?`UjUtYaP- zc#sof5JSK)oFz6rrT1^4a%P^e`xwagwIB`jW!!Qx&%spEogL!;Zln7kVT-d`1gmZm zdhPAX!iNo5Qn31ERw^Xea9a;SF}zcJ!b6T*KJQ*aM6R|T08|0AD^(ynkUttwqyU~T zm`~EO$6qqL`Y+tXE1W2^@vG?0`LdJuMzsXOOro(@G*>F}9|ET|arcw7P)oG085f(s z8)FNwP z#w=2BC2Mj;CfQ^#Hc9i;M^=@%zJODgR~|+nQ+~R2AFa0kZ*O?!begAay>efGL|;O7Dc>)Wa z#Okv9GNCGv1OuLBBq7nTL0Dx3f`j}LU5j_^>U?s$edE$p%0pYhs=)V+&n3^?aet)yIWRp9Q=H{<eCYi;D=6nCEn8)Sr-hMc&R@Aza&ukl=_$GSwLZjPF!SphG842I7x1ycz_J6!FT)s&Xwa0nNP-}R z)LpRluB$3?4-IwV`A4gch2mv^7D*<_y7nFQb@)?E(cNXmdRCN|R2Uz2HtUU9vVUuz zGe^c&Gjb64@AX*FF;Ep)A@0>?KdRQ4^B5w2c%MmnfLHH~Ga-NSLnHmIr<2ng>)Q9k zuBPw0h@^X4$j(6 z@p6+xWkY)%oP>!1H-frIn-xs&mdXRFX=)Mr&0d>I;NxD;m>&JC%UfgF!N$0E_Y~a~ zoJs{u{~G`m{HiV@^4sZ6n5Gwpo2$-7;MMm%4A;8Z(P#Es!{4a6DDBIIHh~r;tr?*O zZaU+Fufb7)|Gie##^Y~KIEC3QOy6J2HK8YJhGnab)Qf@nE@yPCKD-0ce#+q ziC#1f=kq=}&;RLXVi_CbRj_&?0a*AVNtWt$z{D zjCYS|7$-kRa&P#6vF)jwI}IwZb_yQc5vT~mHfeza;-p=2?to_3a0*o=jWg5lrUx0K{a zgKY<|se%+RBKGOoC$-?@ISLeoiw>2q*T~TA0i$}4POu3MNe(jEU^u47dDvhZs4-Da z-N^248LvP8q|bGsVjwEAq3Ufu{Odzu)q;o7jZK*19eCv};Pb=g zzNb)kMy-vz@xylZW8>Y^;Z&f^L$*+M-aBRM{7uK9ac_>bPZ;}3%nsaQTqmVA$7RKY ze8ap=)F!*T@x8Hgc=xA$W`&Keo6VZj$2kqh%-Xxf&qB^KIRh{IM_7m0c_-!8d9f!+ z%0%^tO5S>*GSF>1L*kF_v?H14%~0xDYPeI^&9wk>(qD#6hr}o{{!>zVjDuK9W#-wR zjc(eU5h~}@4tN;Zo?OOZv4L3Hr!61FAzb$ZvBD#PMs=oZkpvlJK_AszDE6p@IxJ{I6{JG&RD*4> zsYVfA7YNxXbys!Qj1jiy-_k1j0Mjt4Co}nC;RzmKC(v0j7Npw`LE3TU52ep$4kt-B zm-BJ2zyvqL#7e>HBe-u)B(Y!DcMWu^<%_0?`47hmUQ7`xi>a5gD#|}zOuK#gk^-k5NgedL0Org{?eBGi9sTx4yI1cPEi#pUbI9qze=_2q3d zP>(HlP+)S~Z^Kewu2zc@tpRqgUI0$Z1ZZ_%g~Onvm{cRcc#$-AlGg zZhATgarjX2^~B!-@;@x3+R4`Z8gAV6K8ar*Rq|X{5NX7`>uG=4!zQw6Gk2sFAjJg^ zc?rbZJ_D8KztT(8iEkb&9IkAG{9%LkCFLigup=)y%?=*?080-Xn;$TzeM#fJwC3<7 zGqgI(#miOxNu*F~@67VLHfdMk%?L3BAZEt~OS5+Wr7%uEmm_bJP z87nnKfP#+SwqM8!tr>8vZ{rhLz7gd!n!(v_3oFx-BR3e2HPhZoyW8_L6(O`uo3c z;M803w;0qJ0?6b@pFd<%b>Y6#ys2`jVW3w$#?vw0SpZbz3Mu~wIXqQ>B`FWFpMQ$| zSk)a)wDes9tS*kZk_Dc|Ebw5LSeVC+%};=Lm`^5OsPS=`TmHv0Yp{6lL* z>n}9X=DEtq?s4e9;MQ3VTl`{-es(kdmz)sfzze#5emb5iJ*c@1n;r9w z5IuN7jiRaa39B>a%??MZA9rfqd}KZRafj*@UY!E*W173$qYu9F2+GUuDFi(m+BbiP zibpKo1fMNTCduMeqL(Vvy0>YD8@|w>*1tU*jj{_1(PXwoBEXUZbfd8KMfh~EUWV2C z{RB|sHvCn`SR+1Fn8gbw@Ha-FK0|^m#wh_JeR0maT$)irYjU+xJ%dU9;mZ8-hY$%?g=eSCEpOU`XQ)+-(@6NCm z(>&OSG|vZ#_$pGw5Pk)nt%GC9kfK;~CVqUv{*V(HlO;k!w^7NftV1E%{qxVR^*|?c=Sv2}6 z+1SVfa?Jed((qN0Qs97*w9D@A@^;uXo>VxayL!_#{rXbU(c!<6wr;_@WoUs9U5{U3 zu-y~1_6m6=EW4L-`a=%)S%08T&VDLNjCUpcW_k6&u4+;&-9NityQI z6MAP_o;^2Cqx2EdvoUU+8s|Zg3=V7j6emcTTskGGj5y)*tR5=KwRICF~) z(+U0gC+@!cBTDC^+k$B0y>#}Q&!6}QY6rR3<#sh*e{wWLA59pDoncj$h7wi%NBVVN zxQoYK*G!)o&@4l*DO#`wBSS{@=^eR1(`q$y6dEHoJwG5U1*cd4fVoe`vPCCw-@3odxPMwGs*gRsj@1M8yG+jyo z3jg=dUE#c~C!~O08E*@Wv(XGoe(M=?i9Sf6kXlZ}NIdm>_OP>S(D~8LU zL@$Mg0hKgPuJ)E$LyO~;eES%Lps2FqXQT9mcY=o+7OgwY7bBzJ4uFr*PcbC#U$`GQ z5|4Gri5x^5rqLLUydUynGW(~Cv7ba07>1#x%ygoo9<9#L9&->`4QJdv?%A18h zUIk>FxfJ)qj&Qcisa}1K@zle=prY++lo2`-TZmqbaSf%Ve6{F>>;5E5q3`$}$VhJK z*DfsC8P3OiVKAB#uBRZpdZ&)E{mzyX%`)foZ*hB0l|izuq}<%nFgqYO>qNY*!4F@S z=I!m;8geBH&xr@lUt9#I4^+6W{!}6~)xCLlreb0EFJ$|d0QS=SV&UXeY*^+}5#Oui z7wcjeeMMK(-ai2iCd8*HQlS8$@0MQ@2BD&t^sM(PTS8(m6^`cmY0v?a^zCnc)|3ks zHlQ>}Tpnq+Xz&>HvfZEJQ&mqIaa=FgKiQm$8?j+;`%8)Qs|kn+Hi`#q>mtVz6xRCu zDxrjx&5*Z&m^(diQJ>`_Euo*JJ!tYI_ul-kSO?Yr-}L*Rq=eB;Uzd+PX9E+|(E%~5 zgNh)Eg?nu{jxvJ{(&#=%c=FvioW(dD zob3%!ZKrpo&^9dxYfnUdL~Uk{t|&fk5td{Hpynu<^a>40AtmF%#sdOVN+kdrZU|0B(L5c)*~Tbof1{=)&g zqWW7{lRm%x-4X4t zP`L4m!Wv5ir>@M3ysYkn@~rRIp#|iOt;RSx$cr*Pd(6>WtZCKI4Rt{(3Xb z6jkiT&7OqRifYqMuK(bAdb#1*gGGi1B?T#e&uTh>}LpOofsJ zHT18L5CxP6j^~v5tUKUdfp`Tl%%6d?IkNk8bf^34YHh6>zv23PN@~`tG4}ymj$K|g z7752V_$$tE+vXFknZQJ7T$8MKn1TuST1) zaj!Wu+CHE9a68#9(Qk;3Ns8nZbzU^ zXgyqJrp=S~ixd`{yMQ$il>au_WAH^{%-;l#ww=1Fv1Qq`g(J5R&y_Ou(VH|?$i-^f znmU1?trhnh^ESj!^G6NrsVnM=ph~)QLjzW2*~8*w&?v1D<_^W3g2uebm60n2&^=Sz zEI;iu+D6C&9n+~4X@OZFUZJpy7IW-7oleZ-hIgqvV|_%HjmWmn-TWB%w`Qe9n-14W zvZ(sS6{qi0k62!>mPvd&7npsFzANWAz{Pr~bF{ZHttlL6+Ili;Td0h98~Hz`)Njl9 zyVT9qM5${Wp=X0CZOpgiu;yY%=tHSM_qw-e%s$K7ge@A3?N!RRG6A$3kn*E2wk(GV6_E$EQ*>Bu%OZP%^d}G>787rZW4$?5XU)#)LNnm85r%d{UlY8us z=DN<;>B4J{LC>GKt*)hXeOjQ_eunL4TBTUQ?D&8ami*sLlnDRyYx8K5_<8TrRVV9! zw#x}o(~Dw%o(R!np z0e)32Cj~3kxXb)OlZQ{MmD%fkSvz^cx=cxtyi_nHo*TQQBaa{i13E@jH}B!4pj$fT ziGGw3zkO1V1Ek#k9`>+YVU<(ov(lq6zhiQ6KYqVx_rwHRC+t3{ELjGQ_sPo(j zSqdEbQ#Yys%U@#|2w=(E;PH6F9u}6Siengg0OWE+_@4PktPY`E!3IvVZcy z@zZoBNmgbtVPSPmS1)T!DNb2>lH_@*XcMo3R?@OpuZ2=Ed`$Z2Jo%JQ4rbqf?#WST zZ$o?nNy|v0?=Rpjx~4Hk$-(1H0)Bqyz%;Rm{RnQjitUG@7%E5+_n5PyJsy+?{{yAP z^aCFIStd1u?CM$iJ>*&7%p%sq`JHvh(ad(6hzqU!(=?f=lDu%aDE#~R9F@W4e!6f$dRkgMa$-k^^31ucaTpUH!^S!21U+nac%c$ag4k*} zUEHq<%ArDy%*9^OLGlj&S>-~-l^E1J{7mqR6%z_w{fz44KiU+u3n3wj0k~_Cvh8;$ zpVFhckD77mSpn<3Ii1ZX{`UrWzCaPoELAi^{VBnr;MA9m*ma4*+4mAhd!xsVk$5R! zdhEtJ6t}!yA+eDY4Z)!~y>hPftJ^<)1JB+`RQw@kf}Dh16wmqv>|T5_F(&=`*phdI z!h2~th@gVvgo&>=vS)A4I3?YmJzQ7(-L+fUI*5A%+3k7`sl-#1`MS}D+mF*z2Y!un z50J`WCX>0x$F*Qpcu$~ccxh{~q(liroRL0Qr{8@j_w$%^!UM3*_F@0hg?qVu+O@s$ za}nFg818?}+U@ zIs_!8MhS>CBc(%$jgE~N`M>r1d!9GE*$cMM{kg9=*SXFyYAjzkZ&0-16P=0~Vc2+~ zfQ3a$qS5!mry+q05mVxX`7P#qU43D#|NTbu`=`ZVcivH~Nq@!&5*Wo*pQSPk#}!8FkNvx;WkeB;0T5hW6jJH*CTA<4#|fTGJ_ zi*v!nBXL@UoM0rOsBmg^NppAh3&*!B2)4Kmb16Hs4qOEYHE08g!Q(+g-u{@2BPU;k z4l_t}jMc>{B0I3%TW-!qFtlZ-(T$BEcpu)LzM7!;h~;0-z5b$~D#nYj{q>%23VIvk zk1aLEU*IKvJ-;#I`K{WsNZ>#I;wBU5%Qb#Hf8|Mj_!`eJrKwh=KuhE`ya?*lDubqBd%M-R$F zBCy-snL*ihRYZntDJyQq6JAv+3 zStX=MqVLI|)w;^|2NMz&h5xQsDai8O;_iudgG@%mHuQ~3FrDx=LaVq;b8Ty!za^<<>S=?$f192SRP1UYWA~(c0<*LftFNZ$6&_BMWI^ zKZ!>um`-G!%B%Zv%snR)JWV&ngsuS8gTLXB@5HLAabIW>z*PR2Kd=&e5J(tTsBN3^ezY zh@Vo0E6Vm;#znCsH z9Km7%g1Kk~zPLKtz@!Mqim-uQZe=}+|HyU^KoSbL9>MePwDH_fr(*`nFxiNcg`ypu zotv(d5hthCxImffzi<6ADr^9}q#kG*H*^8sg5B?hJ1Kg;W&!v7IB#ZQKQMoip=A4W zB^c&d3Un(e9k>qd{dRP$dZMQR6I>ah<6GV2 z<)e_fy-Vc~&{XP-aD4;MR2 z2EpA33rPnBmHjySQA(s2bdX9((x^Kf6XpJ|>3L^rl)zBc*!HJr{K%C({+xJSS$D~N z#CBLTvM?!RTa{?2PM~q9FBa{TlN=f#$6`^>^a%=YW1kR*7KZCsg0O(1dA5BXKv4h> zWrCoQw*)n|Q1%S#!q5;-TLfF+W}hAib>+A$yhRaO@H zP~aWYJJ*lRQ|m;!c9w?*7+=Hh+s@FTP}qbgQ|@&&u(uj%hi6G&)wy^+^t?SxpgS~J zq<0_H2x0byryGB^?@M~%D|2j6cF;-}PCZe_t&)ydSMn_)Zc@^_%vjdt2;)W=Y;ual z4#;kAitFBi89v{JzY)7BVSB$68|t4D7$c58<0JotbDukeRgvCiVrL1^;G0{)nP37V z8-a}3;YD`nlumQs4;i`Qp879o(y-=S9%rQ4d!B(}y?Q`WXhkPswC|JWEvYKa>6u$T zv_pMLVOmpK`SncELCwaC{_}S@Ws@4BzS)a~q}SSHS@v{}c^w&5z5+OLf3bb#N>EmZ z$2_&Quyj33pX3pEi1>j?PS<7616r$#2ANf(iVPg zVT~o|s5R(JVL!pw_1dbqE@04HQmBi__?J0oOz}nI<0U1&Sxt>@%&2hwDDaeLx#hUYavnrf3c0N z3~D3ozb{D^O>~zS771#Lr0P~9`+X~icm+<1(H^jiA%cZBO4|blf6S}mw6G`o&jH7@ zNUV)=dhw6LK-4Jv3YWvreswkZ9R@Xa&QDaOD{0jeYP@Z_9Dge(GK&Yj`@Qi!Kc#&w ztsoF~d!}Dh)h?cIq-Y!)r|5;Ht`EthZ+|E?{n6N?lT35}f&<0>OGT^^<8|;S3dZ~* z1FH{g6;Ndm5n)m9VNX6$JsAD1_m}yJ@RI1ilYe4KIjuLE`l`{_Mku+$4HNB$v z=tjgLYgTo4lH|e;THAM&H6%f$Rwnoir@4aL*A$xB6ozzzfByBA-_K1Skj}|(gH);+aZ5GCb zOD@bhw8S3_mo^;6o(;rK3Eo<|?E=D})cdY-nfHFc@%XgMNVqwpzha>BovjONQD7Kq zVYH=MmpvqEHelx=XFUS6`oiWp;|d@<0E91^1E$@wyRz{rWjtp(xc!wGUrR1sgD9OH z^(Tnnii`%dr1HWaXtN!n?8JP(e96~(Iy06EaMPf*0=dFgq3U2%KQ}|Tm#XjGabBof zdumy9-dl#Oj#QxCB(L9K%p>makd?zOpc?jDsuG^^=F3~|;IhTAdrvhv!E=p^AM7y|Ic=p(XO(r@fCte5a5 z+uI$;{c8fABS7%P7e7^SLu;LThZ&jiyi9bSe~Uj_ae|5us&B`*kZHCI(80#7wSLI_ z{USu}8SN8skSs}5OE9r@-uMs*^^K(0U2q~<)M6#>R@kEE5ve8Ua?zE1`3>MY;Ye@_ zDx3;J00KiVRdNal@<~;Cb7iCUyo`PH=r11bkdxk3PiEge{8LHNHLJv#YYV}VuZy@MAQUZj`QxoFI;kCXF_U*)kzQD&7VMneo#^aO7`fVNgFzPpjdBES0iR#qh4cvtsh zI+8462vH8ejd8hbT9TZ!Dv*p}%wA`J8Vx+8b`%bIW4>h4yGqQUEZo%t&f56hu>He@ zSM!MP29PC@$pdjilJo$h zp%Va(6-CSTA|y$%PK8Zh(})gmYn{oMFMCVYP9yF5<0^A&MDlLs?qiJU(hXx;Dme}q z5~16P4fm9pUtmAPrOaXp?_rhi#VsC~PNbIg?rxg>{37%kEj>#3c&M*Y7MC;FbtrPp zvGHyQJuTwhRr_*Y8RdepOSyMwa;5h=d#94)6D8Rh4|0nG4azkop9^&;o2=cQ@*ZrU zoJ?EAP39O=e%Q~gto3@={8hCuaeZk9LNVU+&1$r3Q|MB9ht;+G_Fgr>yYM|?j&%i) za{c`afgV}T+K3wwoH?X_ODKxsT>GWp!rZ>{a2!`3)wZk8@4<`oGHZ#(TzGwA`1&3Q zW)`(A_K7(iTS<(s>XWX`(Vx54iE!zt~y1sPv6^}hH3EVa(Nl5AHCmB%||)P1$RQpB89-DOa1wr-66<7jYn z0-Up=oVdpJy&otdifduEgM94FuQAX}-jq)hUqeH^(xQ@775r}?*i4k8*H5D>uaA)yoDNDp zN{sL^x&Csxe2rG;w`8nEe&ETyiSeFLEb1+i)G9>sf}_IhiJ1|ofM}z2L*Q~2wRrA8qNnklEH{Q3-kwNEZYhB5i6qJl)y@E=i4w!RU74VWhT^>d<0j~RNT?VnAewU{!{3-4-y8iE)&07?Y=91*!c6WXne7I!hf z=-SI?O*BuaGTa~xfO?ePKHoFDdW&4pi8TAoB%_hi6Tmxm3t2p!5Oex);~opscS%`= zi}7T6C09LlWJ7;K0yT1Baq+eY_lc|5vvd~ldLNJ)6ClFB%C2^Q*dUlz&~3CBn5iPK!0Bcx+|5%N74`u#6O*}A2k9z6Ahhb2Hq`|;6-QLGYiCgIN{+>Y|?(2 z-E_zgS5@6J147KpscitOJ+#|$ZJupDqQmx;6pc5pi4)fQLX?dKonOY;754MmbFoi7 z00Tq$zi^#QXMLV4?AK7nRkG3Y=KY09m6O@C;3~BxV9faNq^dqDjRWp z)~b0dpDJj`0V=Cn#3lvxCEe`wO9rbpsk`!Z&#i&!fMd#ls zxM<3PhbC5?XBuQ`j~SW8+!{H)X(KGX-3Bu$3PBkwS;AJWhtnb4{*jV1D^H>z7v`Py z2>8F6N#VfOd<4sQh>G&kShzeht1kWYnw2T-1C`K%H%Gt(C}Xw$6qY3r8W5~*{>rIR zNHeR&SpLsVDk$9xk%o%JmsD9yoGLGG`yP7SmI_8#UY??Jyw{hf6=R5jZK&t&W&0a{ zdvXupjxPcsB6(^04fPOiK{TU51@I}wZDZHgWD$msiHy5E@H|M`GpS^E`k#D1#%%BQ2%Nnb@rJ$5% zY-UWDFtf$wv`WhMIO!daoW6auHfdf2Sd`;Ck{u9Hd~DaFUbvXpGkj--a*_98##%wF zKsZ86jnZjq?|#NQLgl>IT9_(}v6v+z=bGzxntLA{Zt~W?a@(B9cmk`|UAd;0Y9|{u zg0A|ggpm+#-`fT^yrdicS$TVfTG2ltj>J#;K*vPp!*=0R%OjS+8Fu)O8uf>LYTxos z4`GkCI9T@n46UUMotu9O_vA`<&kVQt?=fVkFXx|cCNJ4KWS>%7oksgp4v&XzIOTO<>!CEV3 zYb0dc*t3j;uE?hS{FR=uKbh)9o|fv2-2Rmu%g*_?K&5xZUHN1BufEROH?(Lg$yk*a!x!S&0;qYq3sB^w%OXZ_6*%lda3c@r&5{U2pyqXRW>IL}obJ<|(Jezm5X#jJ zM}u|&p@wZ-du1|5S|`>$Fiwr7v77R9$M+lHn1=>f0WBVx+6W>%(4bra%G19bn=x)^ z=5@2iWZ{tYjh<$smIHcE*I;?C%xdYC7x%DJYvjij29?I&w&L~Yc1OjO(M}ZWS$?I! z5OnKW^Hc6;NW{sH{iy0K+mgW6&AkN6PjN&QN*)3}h?vVadTF#?2}?2piEQuj)ykub zK?Vg=SgaeS%rQ zmNtMzA!yrd*osEYi7RGcpBo1uiJ$abAKfrufRe+?I1JpGU*%?$0@V-^t`^h5&UWO0=$Vt8#@W z)}A%6c~ND4=T%deL`-teJqhbQ)>6we)Xtu@eKd=dY)TF!k@d6J+|ga!W`}YRcY&w zzih~u%#E)yVePphu!7-R&hmcmES9IBALm7w@^eH$u<CBTnOFhTG)Mrb`JPYi-Ui7AA>{J9lX#>IKtpNwXc7n7MZmC1-xLt) zE3WAkPciWj)zv`pTCxobA{c-U9&Q>qbb!z>E!+qTKeJ2u>oM9QBhnqQQ=P<*Wzuplh)35j z`QZXAmc(xn_k?e)aNnz4=}GCChLQApRPX=(Ol&=YKmn+-ra1Tyu<-~lV+O8)`yK2> z&DWphJK9X4pL=zbUN1oMvmCl4BUV-1t)twNd8L8-bswC+>;_wj2%Yrf0K4r^YDlE?r2V-K zVe$z|^ogHbPGb$0tuNzZ@HXb(kooHMY-0#ZV^L-n(}~&6#cLUlEu|701QCA9)u$_i zmI`(}nfA*!t1;}L0F0uIH}cFvPgpPmqXd6_Ce!T{qhJ|3d z1=7wh#d6&Mh=rr!U|wL>A4#Ft;)x{wU!Cr88J7GZelHo=mg-uT55{FWDYd6I)RzqI z)C17*tu5PLbvpJeH|ICfr_`{Ge*B1@z&`mY#ZX}CN7u@yD8ZpS;rJ{2Bh6R*`>v9B zQvrB!T8lnvwciq3UftG#`%D&ka~0JBNciz}pUr2#Gus0X9aPBZAT0YO*hRcd9L3Fo z`$LXP=o0Ee&h0qYIPE~P(c0S8=)ZOuksN%ch{2tAy8FI8ZWo8mA^Tfulo2^%#1_{Z zyQ!Yol3*RNHwUNz9}ExavyL1HBMy1d zDzz?%ZOSo=?~T+s#NA?P`8pXJ{6_)jVFnaoWZW_nzkEOUm4$12ecfcsk|ovy4}<3PFvw>ZXv=Gd7u*o3Lnr{HB`_tIa0^fNIy`X9^j}26_J+kN_JY z|AH!=#ad^7t&`P>lBa7+UutH=iaz`X3LVFB`zz#>Qg~Yml8=jh6{o7nS+1J3#mGk&U` zyi^YkaIqNeutYFjdffkq1b_lY_nw3YUs#Ma{-y>Lz+M!k7}}9zugCRqG|*;Yjy{~} z7}Uu;B^xw!%$o<{SL`h7A9A&OBUN%%-zkYIncl(OR{5t0si4<7hn4((k?Y%{f;5-u zj*JZ#LV}a$-xey3&BFpoTU080U%h%IS}wKtjeYM=U3Nk)dVriKLSe zJX#l({P6AUM()#xqUu|=*1tqeS;#lIK^z=E^0~YTw>Y!|hwtylx6woIlHBnG4BDpk zJzPqfH}ZZ5Yzb5c(I5(O>W_D4@~?l}l(2f_16#h$v^edj_{1gtHyMi(_+`h`YH=wJ zB2{WmZ7Puai*H6$bm{*r2o9jppK1j>wLa5UA&Q7NMOUwOu5Q;&R|i*zw(Mh z!|^X&N|jCiqR`}2f?ZXW8flgC^-Yo&pdEc9Co(P(U;%kASv(E@vK{3}fCEglvM!HY zvbE3L#-9VXM`e9xM?_#Ww?P$axBgO%5pu7L{LLPvx|Fra>6YGbjEZ7iu3ac!-(hrp z)3ElsAm9))av3OQM$I4X`j#pS^IOvJ_s$(11+$XV>JW0*`)5(9mOqiU`qU|{=V!ji> z)2DnyGu)>SAxz-HVT7oHeF~=^+S0iVnJG$V|AYdk^5C>GoL&qR;RK+aESXi zCHTk8Oo#NUEAmO5M>XZq&Nan)Pan$TZG0Y}D#9V)aW$6WezAhOQ?Y{-EybBw$4Vgz z?{Lh_>_@q|$87}2jMEe(up(^T$W>004K7C@Uw+vR?DEQ}$x!`wy?fq-+AoP|R4u*y z%jP^45SCYguw9>9{gaYb+1A7f-JwPHRh_LXz^1ys!dna)ii%~5+(2_bKeC;2KIdPd z238){x|Kd@v9oSKhUl|c*RQ>=^An{&3j-F%te{x3^cjhvK$0QtkjNBpz}}7xAUW;7 z@CZ7Q_}Zr?*Kljnz}vMlB?)g|GelVy+XKJ{Dn(K|bt%X}R*+{n-T_1cz!H(yQgY_>&PQK>Q? z4?wagdoS1C$vLlbYwr(pk?w6#qmp(KGxf>~ICx)7fY9odn8vI^F8y6%OnzwlBrudE zY)`6x!+a;m(rd#WiE(<{f?V_>Ud;yME1%fsx+Wd5@_w0@$AhFV4-0%Nicjr=W9?P> zULN-Q4*eO0Uisz;eRx{MUpL3tziIvvei()nm<$wrDpt zNaXuHeqPsSsOklfGSeWU;7)^c!*h#AD3_+_0sX<<3@jIKlqI)7b1c2E9O&dn$AcZB z>#y2QR5VnjX4e4U$&k#QJv*ooMe4GiugFvX8k38uRqu&gS#;KNw}_w<3I{xPX0S4x zH^cDBOgK4q3}15=I6Rru??0%iSXcFAZ0x$~(acItpdxMWXu>p6o>L{nn*3ip9^!bY z5gGA7x%KmE>s$G?nfV4Bng7{w=%(w1KNWd^Mbvy!pZU2@NGcY>{=~1elO8PxNIVoJ zw+O{}19M@G%x<~NC5#)xr&m|w$tFSf~}2&htNmnR=hXLW&qyw zL8!k3$l_7q%uSomu=Mgn>T@~!`Pg=1?8=;|0JZj!A?;Xl$mQBjd|wyc$GQdhSHM1D ztF5Zv>pQUc@E3aQ%`vrC8>wmwo%81PJwLf@(Jq?}y6ctQ$Y+lz^D!=3lngP?kinl5 zCNGw>I&(0wo9Pgs?57`(PZog2zVK+OSiA)|mY+00h_a3zC_2iLkzKvHPccL@tfJQh zYA%xwQU}e6`M$QiWh(daCIj>lv&H^Sp;uGc-LV&HMSv?Tphgdr`x#HJzbVTxOOiJu zZ&kX$d9~^W?}f~Bw#y_%u57xD$?&XE3w%a@r~5C&sq2e4xB2sv_vR7bckbp9FEa^c z`!mrC)o>c$F2_`67F7dsEZ)Cg2ZxPJ>Mt)ElvlH)_)w)13eV5GLp1niM5dNhWzazc zDN)M-AA%jN-%rVCca2aP_*rJF`-h;vjpgLle+5!e<$F9{eMaMBtd3RY1sYu$Y9I2s zPg!1_yx^Pr*s^N*U#4_51W;X3gWw3*67cM|F+6!z-|e+3hgTHz!oci1Be#5w>p&_h z$8(ZclSa?o4uI!}S5kEOVb4iu`T?}fn9KAPHT5&z1I{#g3t$jzuT{;AF^kzzb|Jzy z<3-vX2B8Gc9U1A|Q_S=6DewA3<`&xEpomX)CV+C!-^;RZc3(3x=1LD4?MJYhRpE+& zn3}6wZ7MAvm-vqgFpqcc#9P>l-t2iXC{wumC~@U0Y+;vT#0e#UIKT{>v^K4q2R(rg z-Igetue>hm(`bOOf=v%@b+g7$BOs89$w#}Tr#t!=ZsZ4xccUJ(_nfaf+f@pH!LZSX zC_3CbX|WwT=%d82LuO!t4WG z9w?CfFIGR~dUp5oT&1q~NPHp#=X69;1wey#mn_{Z<2VU=m6$LujA+@)fAvkXRLc%|RzKcS6w2RO51%igDh0pCAu> za_2=i$f9l*FEY|8jVRBEb&X1R(e`%Rz|z#Gh&Wi`PGae_^x7VdDguw&2wwX3<%tFl z!s1xg`Q**scTB8ji$67Ymbd})(^s74L7!hf4UEux9%ul}NaxrK)0St`cRpWFA5DHy zicOUy-$ctCQTSgbE+Z8+_@q^0uIc@E6<#Xd6LV_7tPSbEUMuO6(TzWXAFQBvlW<>x z7ClJUJ&0h^S(d(0^O>bBX zyE{e5K6CpNBac)g_~6lR5INM%b&#*s(mR-nJ}Yh25fC6nkIU&6tou;0xU*70C$^&h z>}buca*BUK4X$0mmN(%|R;8SzU(SP)088-yeND!!=+JP-Y>d|s!TN#5!cTVGpEN3g zqXrt~^3NZWS@$;lpki%!6lm@t*IfGBc{*~b^tE7sjbR~CIp9|#(>~7#?1bEu7y}gM zf3dF0xgnmx2g}n%=52mV={Zu@87CdH0%_Uwp%n(R=Lklz)Vl@=KS&o7SA=zx`FW_G z){a;tNTKN@WERXWW}5s?qpnk1X=U(;eRv8Bv}pxog#PX|I3hW8DD;qd_cNSwM(ec2 zUGwxI%zC;9qgEFP3@~LAxPwZ*rr-4*mX^a+&?(OJSK}K2nme>x4+{S8mzE?4eTFvn z;Y9y_v|-TSRy&26>N1wG;@dByfb!S6Gs1vHga**yBb(roWg5C2qs)33GYMr0r zJ`sxdhV^^ICuXDVRHV-OaQsH!rl1Q%cv%`xcc%1mpRbau~tt+B?51lpmyLu0*&OP31d$ze)*x1WqexLv1@x zOYDNzI4CIZ)ir?-v0WM6_@Ma|ej?cTfvftqr@zAURxs+9MVVB#q_fYP9cid=yVrJ> zyl=&T*Fd2evjh{Mb9D}DJ)5ROad1a&hks0o{$3n5$pRh%dI>FznXb`Rm9|vc*)$ANJ3>H9A=WJ;7 zqg2>RF5Du;x#LX|7$souMp-r^jooMyhC(UA_``8z@6t--cu-3Lo`6+G*0{X?Xnq3zv6H zMbVF8rcg~D>YU7$_*q=xqsxcV@6@QQiZ;^KYTh4beY^c0yCH*dU4AMt9UGPGa|hKM zQ`U!oncmOwm$oyP)@2q5!NHG+aG_G& zB@%<3Uu3e+G@AWDC&td#DtlyvTboM==E`+28_@pm`@U~5)Jd6tcoWtpa$I4QV}*U0 zZBvkcquwv&yhl9C__sv&3j;9*vmZaeZ~yn25k;(M>zlzTD=k&%M>d^ob-9I z2ZQ;fgy)nXR(_rJdpS|}CF8x*;6dkoLi5=yKv66swpbNs8VX`f?*jPgUL{px->4Tb zTc`nCDn}A7XoA>VaB+*Zp$;Pc^`^*ZzSk(3ULw_FfFYALSwq{c1P^{G^+4t14EWmm zwf?iTIDS0~(!R!ZUeke#;^Q6(FltMuE3it{-VK$JT7r}aKm=VLrpIYieY9T{jGr~$ z{*>_g6@|Ob!iQ`6|Ahuh6m+aNU&kOBI+z%II_SKt+j^kSh*1QXOD3kYqU@41riOO{ zjG3`Mdk{-4WmeIVKB~xTdBU{~oZyuz7BUd_Hwc#Sq}m1HdMcu=P#F#MRAT}NSN`9x zaD;p<#I`{gC1RT{tIuNfqmpOm?U%A$C&>l*nBM`9L37@Pxj7y}F!rFoxP4m4 zB}4mR*NTowx0J4(*#o8kBESCy2>7_?5Fs)oVfKg#ooNTC>&a#b%bD;hqYj>7*p&-ezG(@e6r7k4hcfdwKZMmZwU~*GN4)5jjZJwW2sr@mh zZ%2eRtuK?hGZpYy%Y3Mb5;}qEPd;T0q!yych@CvDNJc6bG_uW6;Z8X@fq~Os@R5T4 zergHgu3Pgd18`UGko7j4$_QPPHJ2PwseB)+o-7Ag-UkuE(%!=u;hti(kQeJLP%B^c zDWRq)KMxSUg(R05KaUF)(ga*XrXaN_GbVO+_?st|KxX zE0D~l`1;hzq2=3u|17GTzt4U4ik_~Fo*A*MmptgPv~*W~Lgd`_=f&9s9(Q`RtbDvz zVJV{=#(Nteoly-txiE#hs<2GhQVq>L7?cz%3}oHNvz4BU3fe1|SC|jsZs3*9?vHuK z@=Z;^3(1A~U+5xZUozmk&FyOuvV|V$PO=DYignCnfAzo!1zPitRy_p|&CO!v03$gd z+GdRrA57ZU6&dgv&(i=asqa8?R}qjtGg|tr(-W!UotfjK#y5O7i#jH6L@%@&yS;2c za(ujG^GWgk5U&e>C2T2O7S~KA%Tx?+El5G>yh4glmt#T{vZCyTABEETBXs1^kF3tC z74`X|UzsStPB0ptQj(QH3s*J=|97B|G5+%!adC6-7g3ZZmb8d;&0mr1dD+1i@MmwTYNDA0+%ce{cOO!cjmo|agiR3 z9>m2RMxsu2$IrE%Us^|Y)e0V=w1B4k@}OiVL2yB4j5-MsTi=`X|gFRVM{E;^*k z*k{eBms#-}i@WR3PP%y%@}S`~I^=YxIyd;0yIq9n(loL8-22w6taqidwgLMO$Gk?O z{oOk!-6f!*4kGN&opML86Z?|o^!qfB^7bPTyP}Lia}GLyyQotBlD5aea^MBq&YIlZ zrV|x9Ej`3ekV2@$Rqg54xj+o&?2qpyD`E0(L!{(D=Zoc8%aq66s$}D%N4lWl|K4{B zT~&YH6Z_mv@%qE{5Su+Ar$Y7$etK4ZC|U_N?Y{8TK6)I31HOq*ZeOnHJ`t210xkdg zA=DaspW&*MYs3Z4Y{Qw&ZTu3+5*!SM?#M$YZnQ*hKPcZ&Jd#73!ppXv1GLoEi}hr6 za8knTcCuG?xjE*G04p`|{RsWF=Hsq2EPOpJTU?w|L)kC?a$qSXZ6 z)>YQA%r2>dYHoV-j~{7Pccp&l(u;iA(I)%0o}~InGlb3%Es!k}@|0{>JhQcH;-=Mv zt@qu&dJOOG+4n>7Xa&1)j5nw0W76!L;{+tNW$I^D6UicMne9TK*xXcsd8}1n+}RnE z@JIRqG2ymdLvx@-{Z}EzIsfQ;gTUZ#vcn0((LHYP-)@)M;@{uK>x*Y;`#y0Z@bqbx zQw^1I%A(>0*_^ejnz!z!$UoSXq+K7Jvu-h1vbz zGMRv-W(h$4UQ76OWnC{z?eb=YC9OwO8~lf|m7H&d;l0()8bixNzdBEJg{CSC`I-wL zVm*txztEqgj~f8_-+lipVq3C9R_vaQ3VP+_2!CrTD=G^Nb%Q9$Os4T!s3H736^-C* z%+olUGT{&W7Bf^6{s92zDfk5o7LDSkpm9Mih;PfwN#*_cVirJYT;FH3!=7&yt^})1 z&i^PxYWI}$kIA#$rpahhKy~J?^o;!_iAwCg5V;^F+DOST{zmWY#py&3dkC)MOP>ud z>$Iw%z}&<3{41%EbD?0o0ikHlz~DSE1`d8$O!PGJSzJ5C8!<$#ZoHIMY+Z4Kv8?K> z7*d42(cIM$ucsrgbwejHDr5;RBYZQH-NVA8^`iUTB+f0GEh{i|WNx5%b>|^1>67v!!`9eNlM(#?OY3%;^ntv8l^jl}AZu3J5okc=}tYG!{ zT})FMjYh1he#zc#XN$W(^v^DXTlyX}*MHq>`t3fqmzX#w3TS;}y+LAQH)MP>%4ae# zW;4#uVXJMBM}n2uej&z;p4n9xd)l7*fPBaWk^iw)&s?YCkm0@Oa#c^##oqkyMii%q z4$e%Hs$)|9o9tJC7?vqPc|420h&MNt`Tk(|2y2~8>t+MSZ}EYopaI6fZkg2Wbwkmu zQ<`7e_jmV{Lag%jP~yR!iw zyRv3IF-C5gM4C;N;V!47XE61>qPpx_)5TvWD>4lTTm}zo7FM5>CZRf?QQl9SGjQR^ zKJ0UKd|4b%^O&)Yd*%g8JSgnT^j)0+G79VN?f15hFLQ!FuGD?4X&bZ-ccHk#Su0A` zYHyeJnl!-;eTWMfd{HwdT!>!tIx+u(%6aD7*Ihe{X(?~XToBqx?s&XlGR31~F2w&%Fb-M^BbT4wr)W}BrS*nkcMj^K|yMN9&Gid2(`RY5Ep3Ld*{D7%?^oTZ#sEc zSIQ$q1V4X)x4DAb=Cn}F2lod2(AqefMjvHfMA(NL+lm`!cfi)HBW%%EN8@)Wk|p+0 zpNHBq*S%4G`>%ujeeN2ce<51M%w=kq}+=J$e z!Iq~g^`-JL$Y-Ht?6Hk^G^)V8#Zb4S=0gT>0$r%3I_!@Jw(r!I@plIDQTLU@+68hg zWn8ne*qh7{W;6S>)dhuudH3~?_PQiDR86z!{>1E+u4EoP@pAZr+;s3Ast_HH97j)* z<}{Y9wwP*+Ef7NQ!)KJAqnb9JbODw;AQCAMw4Gt2da1v`Jp?S#%OLF#0{Yh1@5&u$p|lrkAmz%1YzqQ{1J{bqdyZi!x>|vh2OqN>zJR(<1~HxxbN9G`&QXn@S0lJ zWwqt?b*lWmU2BHsdmxS>Fvx&;VFaZ<=IVQ7h2^*N$=2Tb3YRK&@Ylp-&*Z+<;uacq z&ewwkNHKk&t^V$2wCVIDM-47&J;s8)u(i61RmZ=29LDt__X@0FzFH7XkIl$2*$+Nv zZ+?rj?IjIB{b+cHDoq}{9-vpyw^MU*7@IDUOsrY02)Xi5HigwZNA16xt67L1SZ>Hr zwsI>u72z5dh9B4Zopgubd51PcQM+Y>DM5HePAz5W8$D}`*o@3bD7$RvhsUu-SzIHd zTw4SjV)#0Sz<}+jmvcNn$*jqax_IqpN)j-=+`#Vqg&Xyu)?DK7hR5$!|KFa2&Arq0 zjJmIE-}3!;0PMf3#2M!1%ah-|d%K8R2^%KHAg?u+jM}Qfdza5OUdVnS3E*RBM%Dt6 zhYG*V;}_-LlWeV)b;MuvCvh{%FHe$M*RM46rnf^s zK-tTnx+Ti&kAF%M!D(uk$C=h6q~gs7&UGGj^Wl+}V;O5_}Jtlr(by8Z-i@R(G;@cq?I=2z47G5}u!u2WHH zIK+wY54Y2kkDSwv!`*r?OHulqUdTShNp_%0)5cg>MI`Vn>w+1w~| zv0};r07EVjS?j~CUnhb?W5^lS{S&bictHxmKgNiAo|c&-{6k)WtOH*qbe&k!klpXpXp*pVNbC5xPJ%V%@nHf zZk2Uuf9Y#%IsCZ4#|_)=*}zvT5bFA_@8z)ei|&=&wHQBUpIW)ZoSvzmU z-_s^?9x@qH{%~J`t!u$|EYpZ2K-Dtj>arxm>Qu2^Wb@52WR798miCT+JUn`q@U1#H zxuw<8KuK{s&jp9sPEA<2Ugv7XaQM3H-E;j8Rn@G(AJrfb5i5wJl^!w>TiwpWB;>zd zZh4&Q_iAO^QD1V&E!XWh;>B(X7m+NIha?m!9NMCaSP?gq4Wy@>J3G;cHo5CP&)XGw zj-xw2Blw=HQV_{T{*hs+aW*AE6=b!rvrgrlz9y{arAZixK>AenCffo#OIqP7B&S>v zNtocW23~Q)6d*eNO(#eZEst3re+$0ed+(iegOxBuzY5+fFBJ2LKeY_#B?)lKM&hp- z@Ql!7Jyr^pevt%RK>9*Av!j_ zqiq`dD~!|2l$=9LgYn9M-bo(Uuj+e4>Qk7-LCyTdi2Q;BgR73@%kwQa}=LZp! zUekB9wImbZ#Jm^fkul1WZuhx{s)dFpf_1+X6P))S7BBOlF)tHrTSRi%W-KxoPj$}n z>-W2ke*DRKw5^*Msp8M=E;XTwdY$~1=wEEwXIl94Rft-^lWYNwp#t7#mDHbzJ=L z+5Bg2^{~UoV$YG}!ZXfiD|G9ma#CIuam5rVo8l0_WL>!_k6SH+f*iC+^R1{n#N6!a z@>hc(I~!yM_WOal($9u{s5;P- z@hXip!^F0TGV*gNjwxUb%U6Li!k->%Aq-bRVA34FvIu?V-tx8=sUfUNEtyYjzP$5X z>4?#wpk${;Dqpu-JoBjiOJrw^Zdv-*$&@4$QEHO^e!ha&V?Ty~%A!nCzG%H_bEo#z zg4TfFPJhD{3h{NVh;iz1cl$H7x|Dl()qvzUN24r;wJ>NbWXP;jAL9_EE&;kp6FR@O z!9m0tx=j)gt-RxsNkb%i%~4%#0wro2x%numMkZM{GF>X!1XJv^*QD)w%==C7I_O_X zCL+k}GNAk@TCHo#fR#W9KW!e6hr@lV<1(IhmP(nv;89#H<{p1lq~U#U?8(*NBaM2x z8`nlIJ}hw#Nvg670XqBEc*YfpJRRTlbH==38%{)j5Beaz4Z3A$#5O z{=Ou-BhO?+3JxVJNq~P1oZVHk*U>jtT~C@GF#64+Rp}o4H^I;AC%tyr9(r6vrK?(r zccKzkW0*-!u2u`s1J~MK3dAu04rPnHk5+uGRZAMsU{f$;7!*ASy&UWn-y5t+Xuskq ze5Sv!b0iA-7e#JvUegap&JQuH30<4JUQoRh+Jo1wK5Y^L^oH~{%XCTv6;op&!&4EY ziIK>QE6E4;Qbe*;G=fC3mf$dJazrVm=R6|j=;Y(k30E|c?30HLpH^eOuIH6(3Kh3b z^KKJrkC-pVN_%D4-B>A$zcsS|cc#Q|-L72E%_tP__li+YW;b#}((AIGzhlIX$6v#| z%zh4cE_ioPp^OfL?wlO}ud8|~#~#Sq*gfn@D4X;7@E0}#N6jp!uWWUN#+h8j^p}1=|}L;`LB7p-`GsxCQpfYtqk+>nBrFcJLYav z>i0q~<&Uwld;L9;owOzteRj#-2^Nz>1L;k=osDBu%&F?^LZS21_VLMo;}tQG<3e?Q z`k!pn30}d+30gtc?|fe5(6%-yVy)8WHA*}0h}DHZF(+ViBzT&x*!Bp5|uEL$$L} zt|@vfD3|m9ntIECD8J`@7!gFkBt;~oR*+6b&6TWzw_6qE>c~sbYUytfyril8L zXTRFvl200dtDM}ci+IxAuv^IM>1UC7a3l&RSWxzGpY?gqa=$ESbh0t+ed4M1EnT~< zJIx}*NPdJlIfi=eev?J41&}+01eiXB(WWS1rw6|Y-L`&^_|lbV+sg3$e5$O2otRZO zIx#=YaOv#C_{F}e<>4)rRiKep(B?DHPoNqPZWY>K7^lB5vu;;P7X==dtac35cY+G^ zuS6tRo@(6}Q2cTKE(dXvqYH%59_7G7TNj`)BFBKU$rLCZS7Px=)s?_6L)}jqodbmj z{7bc82fYdq3OV=$jX_+5psDCPHVgGE%OdFv8(W^EmfYyyT-!eB(LSG%QnbTb)93lq zJ~Xe^2wp6TqhIc}6sc+u<9@NWip?;-wB~1WI^Cn)#nt8^OR=}8HX$RhS2;Wuvtwpk`Y4~SH!bP?GHq-pYq$g5Uy)O-wlLqE>r}n0@ z-wceTx;BT|oL`DK;2*xd3n>g3hoGUnOJ87pMTn(}aBc$bUg>a9BS>y3VYircs#3++ zjP$*_z{14V!{bH#V;^h;Vj-O(L%7uy=KC>HBFp`){fwswfrSeVLl6}iB+L=ZrkmZt zpox#2R=LnUru*TM(4rUt7Ouf^5ORLt@da-i-Z?;YDEe)BQSdX1~+~-D@j9f!s zE1Ca+mv1>>%2s>qVd1gS%275j^7X!U~6xk{nd2}(r^F>n<$PFr@Kov=t62fZ#K=qeIXdB-g z!5X?=C5detF9oAsR|)C>*Tm)A|v81`j?{f4*^2Sh_3yX?-Uhxejbp*c6xyZEtdX0CtP$LYGOMK!sXnN)J6C$F`=k3$4kAY0wZi^BtEY+sTvbjBde~rJO%0-@t=Mh(5aD;AtZ$zwHeP~k>}axc{DRHRbWEa zp6{pOpD2&ui+=w&;M{_bK?fLVe!hHVup+IM1y#yW0F~kJ6%#H@1=KyE_%4*#;$$!G zRax#d+_Oj>2F+x$^X#Y@`tu0m4g)`mY1+QF$3r|70ci`lt8eCzriKSZII0bV6$`|w z^}D{Eg(k|k9+bxq(v083J4>)VMly_hroY+dU8Qg7WCRm#t6_WjBs7xDg!^upSEbB8 z$B?yN6)7jADXZ`X8W<#ZBBO&5NO})G9+RG%WnamL_yfddU2)|7=D^9dqq<-vuanxq zuK1f%a&a)`9gFfM>TZ_x+Xr5&(=>*`X0#(i3nCXQ$bI$Xc6B%j`4uLVb4PGe?lY!( z9|{+>GAR2|x~{&d;NOBM7SfKQBEe*m-A-)AkzzQ$bX7E*QM&W2lnY*-=>$#J6lrq8RlrOHkj(mtmoy zo`@`Mr9OGJm=72(i7h@zoY<;5081)=R#0or6-_9~-y-`aWDHo%BMn}*;uMCHZJiS= z_9+~Plf=`E-uvi+4dR$N@}kBRDOhb;`4r?-!6|IvXYYP78|+L!kgj;+PcAaX4;{fH z9>_i+9Euo-Jf{DLm9n%>WNL3@#+2J&UdJO8$GihV(v1CDYn3%xa!x$_8Z+wNGPTs3 zJG9#*R=Gh$F(gxa>7#Qu#!j2Gon$c(|M5gAL ze#qwQh>&*e&kF~YkgBpsn+y1O4J4rjFrs-ISdo%!Ec)<#kdcTr=fJCz8mK{JpSHSv=>Wk zmE>t+#%%5s=pT~9JGQ5lKO#R2poVLuC88ExtL?Aq)b?I{6-(r)6e=q^#ZfATk<_Nu zG->UTUHp04M&foFRo=CM)sz7H8<6!Mh;o}{sT9&@6aOd}5!SB>Bn=Ibau7OmZEFNd z3jvSsQ52aRjUf*w)jxhxe~$?nLc|SLs32=3Ybt1eJwzG|94mLck@JgS$MF?!HF~6% z1@)A9Fy1l~jCd2e%9kbpuWjAsyAQG6HYNN^)3ySLTxMfke#f?(6#|&t8o|BcF66(r z{Tj_6ZhQ|H5^DZjnzmC@6t@0~O zeBg#v_qM%t7)w2TpQddE#CiJ%ZNWh<^h8hAy`^!$H|Qe&2x>X9Hew%qu|{TxPk zbh0brFz|OOGf4QYu@ir!dd5?_`@-2`PnB~|Ckl~O-{KyS`R#`S6i#EeuKdv9VuW?^ z$2f2r?44>241bTV@&#w~u0jyySRVeE-kyeR4}~X7BjLA2h6ssbu=p+ORS`b-$_ zACO72J&-0w-4e>nwK>3KrB*Tu*6AviUvk;gWF#cukP?<&YZc(xYGt%OHq$`+(Lda< zzA**D4N^;0G81^DzH6yehv>#w7q_lB)qz$(YagqL=sjm~He>~AxA_p!dTM)O^n;OM6)ObqhV5izd!yU#WM2m@f$PU-hhR4hKtqWPOYN*veTPOXL<4qHFpXF4hl4d8>ua%~QeF4y`r=Q|1Ygl) z-W(-6grZd(Vq!r#`}IaZgwm|k56PN;XiMFr0UNp@*H&uJ=3^xfRNxy9y*UhRbBo=q zI#g8((&rW^G6%W#v*=eT1(R$AtYcjW5I}@{bGm|%*VrIYvX-A?UT{G-|sd=5J)%{WL) zn}lDcN`6z=@!m^_cv8$^z$F!+xbgz)!WSD{}Q$hnivGHgfynT8iC`04CGF z2F_skv;P*0PeJyrX%)X}EOcmLyU-rAlc>aTrHY#Lz313KiGO6rT;cRg!VGkx+D94zy<&LKV68FDa)y70*D` z{xGDxz@{G`sP#X)6&yz3R74$0Nh1*pela|&LeJ)CHqhUlO zPFsv3geDqjXK`MSHbcOFofH=%W|UT<5)V z(DzKCRrp?iPt*3qI59Zi`v-nc964dQaPb>~mhZ1e1LaDSH`^!N45#(oaJ^#)46ofc zvU>iWo`jCDc%)wWJ>xSMc`g!6Hu!GFwIW@>y?{6UOFDt(Wb|8C}CBI8vsuWTn}C$g5IIP&|Or{=vdvwl9=%}**p2(Dh-lxyS6 z=s#nCA--Z6P;jZu+W}K!OaY4dk{rZ z`|H1L>syUzQSKdSyRLGFjth#~^0LvVi4My7 zA>QLb=yi=yo%?B&S}eW5nPu_Cm2 zVOx+Yl*voDS!K`Ma3z3nQUvwr_tUh+rx;~) z0AVd?Q8G|?hkAv6`&)7&XC#KnALG<7Lts>u3z(>t1!vD4D_#sGr-<>L!z@B%LtFr5 zfh;5U3AdM&bDx^1r*F9=#L@i0@VFmFpBaRBgOqIitqDrmXe5S}KPgGo zfq>(O-32o#c^33Fu;mKTw-&uQ8;;xV|NKrYMsqM1xF94~UsJS7*>>Jn`}Ap={wP1X zlIv_t=5-*_jMXeBo?Nqf4l5(@ex_s}w>GI*aNC+j_j9p;K8Qh_588CEhQ@2f5oi@%LKlBH|G7Nv49qkjyjV9iXJ+oYN|{v38Tb()mfp`T@ZXy2wj4ay6$~!t zV(4nH(HW!x0LE`z3}3xN85%3jC|ILw_^g3^2Tx(3__B7lWh(BW5BXAfwsDf8%+Fh5 zj36E%$jg8oKkzc< zqcZYYGDW!4o-KPcqjC5y!hRz3l!6|a?+!NoBdm3~g!h$7$+i!e{^A~oj8+LfLu3QS zi&p-NFtRlST7#9*⋘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 literal 381916 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

tECHMb9!1nke{`AFr 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%0AE7@;dbUDb>q-R;JV&2XcD- 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

kv?OF9>HmV*{0BKl<7H2QpYZ0QO#eVOua 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 diff --git a/subsonic/content/contents/code/subsonic-icon.png b/subsonic/content/contents/code/subsonic-icon.png index 2fe467f8eca3df5a3d64969a3234abc34ce0e2a7..a95a8d5c74867534d97102d267040e846a131bea 100644 GIT binary patch delta 61 zcmccnm$~yV^MqKYe_|WsSriuMD<~|kc2HQ{o}jRJa)ZL+`3n>luRfr#dHVw~IRSmq RUo8wk;OXk;vd$@?2>>hQ7+?SZ delta 152 zcmeDD%Y64Q^MqI?1%{3BEDAhdClpmMFeos1x;Ta`PF7Ihd7SF^2O;2~z%%`F=yQZX zf&x$aiz%@Pfd&PhmEC7%Ap{mE@H|vrV}}qppuqEHPEk1ngPa)1md(iz#N-6l*39N) O00K`}KbLh*2~7aOgD^b+ diff --git a/subsonic/content/contents/images/icon.png b/subsonic/content/contents/images/icon.png index 2fe467f8eca3df5a3d64969a3234abc34ce0e2a7..a95a8d5c74867534d97102d267040e846a131bea 100644 GIT binary patch delta 61 zcmccnm$~yV^MqKYe_|WsSriuMD<~|kc2HQ{o}jRJa)ZL+`3n>luRfr#dHVw~IRSmq RUo8wk;OXk;vd$@?2>>hQ7+?SZ delta 152 zcmeDD%Y64Q^MqI?1%{3BEDAhdClpmMFeos1x;Ta`PF7Ihd7SF^2O;2~z%%`F=yQZX zf&x$aiz%@Pfd&PhmEC7%Ap{mE@H|vrV}}qppuqEHPEk1ngPa)1md(iz#N-6l*39N) O00K`}KbLh*2~7aOgD^b+ diff --git a/synology-audiostation/content/contents/code/audiostation-icon.png b/synology-audiostation/content/contents/code/audiostation-icon.png index 98cc40f023fdf1729ac2f11ad5d91f6f1ae07f60..aaf3092db47d64b456496612c6245c71367f5bdb 100644 GIT binary patch delta 10075 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 MYZ$0ksM?184+CS-82|tP literal 46770 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 diff --git a/youtube/content/contents/code/youtube-icon.png b/youtube/content/contents/code/youtube-icon.png index 0fc64d379cba8f37ff6da53896f7c9bd7d5aba4b..16961ac8fd95d43dc1cb98aaa4f777955ca54264 100644 GIT binary patch literal 14977 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 literal 15901 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 A{r~^~ diff --git a/youtube/content/contents/images/icon.png b/youtube/content/contents/images/icon.png index 0fc64d379cba8f37ff6da53896f7c9bd7d5aba4b..16961ac8fd95d43dc1cb98aaa4f777955ca54264 100644 GIT binary patch literal 14977 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 literal 15901 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 A{r~^~ From 3a9ae272ce399dc973105c1dcdb1fd73a7e98c51 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Mon, 25 Aug 2014 23:16:10 +0200 Subject: [PATCH 289/597] YouTube may decide that that an undefined object has length === 1. --- youtube/content/contents/code/youtube.js | 2 +- youtube/content/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index 7ac5c5a12..faf4b066d 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -338,7 +338,7 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.asyncRequest(apiQuery, function(xhr) { var results = []; var resp = JSON.parse(xhr.responseText); - if (resp.data.totalItems !== 0) { + if (resp.data.totalItems !== 0 && resp.data.items !== undefined) { var stop = Math.min(limit, resp.data.totalItems); for (i = 0; i < Math.min(limit, resp.data.totalItems); i++) { if (resp.data.items[i] === undefined) { diff --git a/youtube/content/metadata.json b/youtube/content/metadata.json index d2d9c2d77..e793b7200 100644 --- a/youtube/content/metadata.json +++ b/youtube/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "youtube", "author": "Hugo, Leo and Thierry", "email": "lfranchi@kde.org", - "version": "0.9.11", + "version": "0.9.12", "website": "http://gettomahawk.com", "description": "Searches YouTube for audio content", "type": "resolver/javascript", From 334a32eead188e92f583b13438db60cf1ea237ce Mon Sep 17 00:00:00 2001 From: Dominik Schmidt Date: Sun, 7 Sep 2014 16:01:45 +0200 Subject: [PATCH 290/597] [youtube] Wrap Tomahawk.addTrackResults --- youtube/content/contents/code/youtube.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index faf4b066d..343e16031 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -76,6 +76,10 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { timeout: 15 }, + // Wrap Tomahawk.addTrackResults to intercept the call from Hatchet + addTrackResults: function(qid, results) { + Tomahawk.addTrackResults(qid, results); + }, getTrack: function (trackTitle, origTitle, isSearch) { if ((this.includeCovers === false || this.includeCovers === undefined) && trackTitle.search(/(\Wcover(?!(\w)))/i) !== -1 && origTitle.search(/(\Wcover(?!(\w)))/i) === -1) { return null; @@ -419,7 +423,7 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { results: [finalResult], qid: qid }; - Tomahawk.addTrackResults(resolveReturn); + that.addTrackResults(resolveReturn); } } else { @@ -433,11 +437,11 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { } } if (stop === 0) { // if no results had appropriate titles, return empty - Tomahawk.addTrackResults(empty); + that.addTrackResults(empty); } } else { - Tomahawk.addTrackResults(empty); + that.addTrackResults(empty); } }); }, @@ -578,7 +582,7 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { results: [], qid: qid }; - Tomahawk.addTrackResults(empty); + this.addTrackResults(empty); }, handleItemResponse: function(qid, searchString, data) @@ -696,7 +700,7 @@ var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { results: finalResults, qid: qid }; - Tomahawk.addTrackResults(return1); + that.addTrackResults(return1); return; } } From 6899b3a73e4d60eedf23775bfc040d5d6495f7a1 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Wed, 17 Sep 2014 19:03:27 -0400 Subject: [PATCH 291/597] Add bandcamp --- bandcamp/README.md | 4 + .../content/contents/code/bandcamp-icon.png | Bin 0 -> 1256 bytes bandcamp/content/contents/code/bandcamp.js | 167 ++++++++++++++++++ bandcamp/content/contents/images/icon.png | Bin 0 -> 1256 bytes bandcamp/content/metadata.json | 18 ++ 5 files changed, 189 insertions(+) create mode 100755 bandcamp/README.md create mode 100644 bandcamp/content/contents/code/bandcamp-icon.png create mode 100644 bandcamp/content/contents/code/bandcamp.js create mode 100644 bandcamp/content/contents/images/icon.png create mode 100755 bandcamp/content/metadata.json diff --git a/bandcamp/README.md b/bandcamp/README.md new file mode 100755 index 000000000..ee9121487 --- /dev/null +++ b/bandcamp/README.md @@ -0,0 +1,4 @@ +bandcamp-resolver +=================== + +Tomahawk resolver for Bandcamp diff --git a/bandcamp/content/contents/code/bandcamp-icon.png b/bandcamp/content/contents/code/bandcamp-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd47c4bb1e22361ce3c0c2648d6049efc7cb7a8 GIT binary patch literal 1256 zcmVP)K1_@qnpozf zBrcf33^mba!UBE|t#zzADis|={3Y~ zC>t9a2fB{K=%G^jvvWm~z^*R5fyoDVdFPH|Y8@!0O%5l-oH9u=@ZZ1Pf~cq{-Z{LE zx4C!fIEXHP++ z(QxPRaZgK23zV0a^L!DuuC5Ncy1KY?F)=aF(9p2Ux3;zx=H}+0y1JUciwW-23K|TC zJulLl|23l*Bmw^OhwBhnStQ4ci;Fzl^71l_jg5iXY$nP|QBe^L4Godwo}M1a$jIRN z>-Bm_O-<$ev$L~de0-euzn7Ml_P1#1^ajabpO5sz+S}K>g@l#v?ryTZC_g_REEWsY z*Vl74j41kJy0fqd%KE3Jr9n+i4d-7~RTX~G+G`HmE|f|F>tFi^9{+wDlnRCDn3$4* zK!Do~*x1-eB9)Vq19rO|j7B4`bd{8p@ci4_+Mu|&m>e%GEQpS=Cve>9Brw_>(v+bG z_aL|tfGve$mkp!k^?E_U*x1LnxPNSLaF76_AaFuL0y&cG+0~l79S#S%$-+(!_e*~- z9Po?M3OH#pOHzg&{`@2OeQRNT3JMCq@At#(>@19qjzUsW62!;HLu6zm*H~aj)!W<4 ztJioloK7eC9NM7t_xF=py}rI4zSDZ2zOM>9ECdKA!tM%Fo}J_2 + * Copyright (C) 2012 Leo Franchi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * NOTICE: This resolver and its intent, is for demonstrational purposes only + **/ +var BandcampResolver = Tomahawk.extend(TomahawkResolver, { + wand: "inganwbxhyy", + + settings: { + name: 'Bandcamp', + weight: 90, + icon: 'bandcamp-sourceicon.png', + timeout: 10 + }, + + spell: function(a){magic = function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d;}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64));}).join("");};return magic(a);}, + + init: function () { + this.secret = this.spell(this.wand); + }, + + resolve: function (qid, artist, album, title) { + var findArtistUrl = "http://api.bandcamp.com/api/band/3/search?key=" + this.secret + "&name=" + encodeURIComponent(artist); + var empty = { + qid: qid, + results: [] + }; + var that = this; + Tomahawk.asyncRequest(findArtistUrl, function (xhr) { + var response = JSON.parse(xhr.responseText); + if (response.results.length !== 0) { + var bandcampArtistId = response.results[0].band_id; + var artistDiscographyUrl = "http://api.bandcamp.com/api/band/3/discography?key=" + that.secret + "&band_id=" + bandcampArtistId; + Tomahawk.asyncRequest(artistDiscographyUrl, function (xhr1) { + var response1 = JSON.parse(xhr1.responseText); + var results = []; + if (response1.discography !== undefined && response1.discography.length !== 0) { + var result = {}; + for (var i = 0; i < response1.discography.length; i++) { + if (response1.discography[i].track_id && response1.discography[i].title.toLowerCase() === title.toLowerCase() && response1.discography[i].streaming_url) { + result.url = response1.discography[i].streaming_url; + result.artist = artist; + result.album = response1.title; + result.track = response1.discography[i].title; + result.bitrate = 128; + result.duration = response1.discography[i].duration; + result.score = 1; + result.mimetype = "audio/mpeg"; + result.source = that.settings.name; + result.checked = true; + result.year = new Date(response1.release_date * 1000).getFullYear(); + if (response1.discography[i].url !== undefined){ + result.linkUrl = response1.discography[i].url; + } + results.push(result); + } + } + if (results.length !== 0) { + var toReturn = { + qid: qid, + results: results + }; + Tomahawk.addTrackResults(toReturn); + } else { + var pendingJobs = response1.discography.length; + // We want to send only 1 addTrackResults call, at the end. But we have to fetch + // each album list individually and check if our track is in there. + var decrementAndSend = function () { + pendingJobs = pendingJobs - 1; + if (pendingJobs >= 0 && results.length > 0) { + Tomahawk.addTrackResults({ + qid: qid, + results: [results[0]] + }); + pendingJobs = -1; // Don't send again + } else if (pendingJobs === 0) { + Tomahawk.addTrackResults(empty); + } + }; + for (var j = 0; j < response1.discography.length; j++) { + if (!response1.discography[j].album_id) { + decrementAndSend(); + continue; + } else { + var bandcampAlbumId = response1.discography[j].album_id; + var albumInfoUrl = "http://api.bandcamp.com/api/album/2/info?key=" + that.secret + "&album_id=" + bandcampAlbumId; + Tomahawk.asyncRequest(albumInfoUrl, function (xhr2) { + var response2 = JSON.parse(xhr2.responseText); + var albumUrl = response2.url; + var albumBaseUrl = that.getArtistPageBase(albumUrl); + if (response2.tracks.length !== 0) { + var normalisedTrackName = title.toLowerCase().replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,"").replace(/\s{2,}/g," "); + for (var k = 0; k < response2.tracks.length; k++) { + var normalisedReturnedTrackName = response2.tracks[k].title.toLowerCase().replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,"").replace(/\s{2,}/g," "); + if ((response2.tracks[k].title.toLowerCase() === title.toLowerCase() || (normalisedReturnedTrackName === normalisedTrackName && album === response2.title)) + && response2.tracks[k].streaming_url) { + result.url = response2.tracks[k].streaming_url; + result.artist = artist; + result.album = response2.title; + result.track = response2.tracks[k].title; + result.bitrate = 128; + result.duration = response2.tracks[k].duration; + result.score = 1; + result.mimetype = "audio/mpeg"; + result.source = that.settings.name; + result.checked = true; + result.year = new Date(response2.release_date * 1000).getFullYear(); + if (response2.tracks[k].url){ + result.linkUrl = albumBaseUrl + response2.tracks[k].url; + } + else { + result.linkUrl = albumUrl; + } + results.push(result); + } + } + } + decrementAndSend(); + }); + } + } + } + } else { + Tomahawk.addTrackResults(empty); + } + }); + } else { + Tomahawk.addTrackResults(empty); + } + }); + }, + + search: function (qid, searchString) { + var empty = { + qid: qid, + results: [] + }; + Tomahawk.addTrackResults(empty); + }, + + getArtistPageBase: function (fullUrl) { + var baseUrl = ""; + if (fullUrl.indexOf(".bandcamp.com") == -1 && fullUrl.indexOf("/album/") != -1){ + baseUrl = fullUrl.substring(0, fullUrl.indexOf("/album/")); + } + else { + baseUrl = fullUrl.slice(0, fullUrl.indexOf(".bandcamp.com") + 13); + } + return baseUrl; + } +}); + +Tomahawk.resolver.instance = BandcampResolver; diff --git a/bandcamp/content/contents/images/icon.png b/bandcamp/content/contents/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bdd47c4bb1e22361ce3c0c2648d6049efc7cb7a8 GIT binary patch literal 1256 zcmVP)K1_@qnpozf zBrcf33^mba!UBE|t#zzADis|={3Y~ zC>t9a2fB{K=%G^jvvWm~z^*R5fyoDVdFPH|Y8@!0O%5l-oH9u=@ZZ1Pf~cq{-Z{LE zx4C!fIEXHP++ z(QxPRaZgK23zV0a^L!DuuC5Ncy1KY?F)=aF(9p2Ux3;zx=H}+0y1JUciwW-23K|TC zJulLl|23l*Bmw^OhwBhnStQ4ci;Fzl^71l_jg5iXY$nP|QBe^L4Godwo}M1a$jIRN z>-Bm_O-<$ev$L~de0-euzn7Ml_P1#1^ajabpO5sz+S}K>g@l#v?ryTZC_g_REEWsY z*Vl74j41kJy0fqd%KE3Jr9n+i4d-7~RTX~G+G`HmE|f|F>tFi^9{+wDlnRCDn3$4* zK!Do~*x1-eB9)Vq19rO|j7B4`bd{8p@ci4_+Mu|&m>e%GEQpS=Cve>9Brw_>(v+bG z_aL|tfGve$mkp!k^?E_U*x1LnxPNSLaF76_AaFuL0y&cG+0~l79S#S%$-+(!_e*~- z9Po?M3OH#pOHzg&{`@2OeQRNT3JMCq@At#(>@19qjzUsW62!;HLu6zm*H~aj)!W<4 ztJioloK7eC9NM7t_xF=py}rI4zSDZ2zOM>9ECdKA!tM%Fo}J_2 Date: Thu, 18 Sep 2014 10:11:24 +0200 Subject: [PATCH 292/597] Fix Bandcamp metadata so it's proper JSON. --- bandcamp/content/metadata.json | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/bandcamp/content/metadata.json b/bandcamp/content/metadata.json index e1f0f2cca..24ca896f0 100755 --- a/bandcamp/content/metadata.json +++ b/bandcamp/content/metadata.json @@ -1,18 +1,20 @@ { - "name": "Bandcamp", - "pluginName": "bandcamp", - "author": "Thierry Göckel", - "email": "thierry@strayrayday.lu", - "version": "0.1.0", - "website": "http://gettomahawk.com", - "description": "Stream music from Bandcamp.", - "type": "resolver/javascript", - "manifest": { - "main": "contents/code/bandcamp.js", - "scripts": [], - "icon": "contents/images/icon.png", - "resources": [ - "contents/code/bandcamp-icon.png", - ] - } + "name": "Bandcamp", + "pluginName": "bandcamp", + "author": "Thierry Göckel", + "email": "thierry@strayrayday.lu", + "version": "0.1.0", + "website": "http://gettomahawk.com", + "description": "Stream music from Bandcamp.", + "platform": "any", + "tomahawkVersion": "0.6.99", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/bandcamp.js", + "scripts": [], + "icon": "contents/images/icon.png", + "resources": [ + "contents/code/bandcamp-icon.png" + ] + } } From 5cbbdac6f1f777825889199b61340589d6abe145 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Thu, 18 Sep 2014 10:18:12 -0400 Subject: [PATCH 293/597] Fix Bandcamp icon --- bandcamp/content/contents/code/bandcamp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bandcamp/content/contents/code/bandcamp.js b/bandcamp/content/contents/code/bandcamp.js index 8691c7a02..84f2216c2 100644 --- a/bandcamp/content/contents/code/bandcamp.js +++ b/bandcamp/content/contents/code/bandcamp.js @@ -23,7 +23,7 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { settings: { name: 'Bandcamp', weight: 90, - icon: 'bandcamp-sourceicon.png', + icon: 'bandcamp-icon.png', timeout: 10 }, From 24353114dfe05ab09d7c062d39d7737b1ee29cca Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Thu, 18 Sep 2014 10:25:40 -0400 Subject: [PATCH 294/597] Add other icon to 8tracks --- 8tracks/content/contents/code/8tracks-icon.png | Bin 0 -> 7571 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 8tracks/content/contents/code/8tracks-icon.png diff --git a/8tracks/content/contents/code/8tracks-icon.png b/8tracks/content/contents/code/8tracks-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d5478fdb45359f22f899cb1f840f10c5457ef079 GIT binary patch literal 7571 zcmV;E9cP)}(f-m2uvX(`QyI#`c+l8y3~tMwRFGwkW_lK-aY4@?RS=o zOE-QIF0S`)(M1wmWWWWzGyq?u!u!eqxk!YID(FI%00F#6g^M=eq6)gWE*jwrmI33P z0~l@*Q2-DG5kwFK00aOL05E(41VHRp_7@QV1VBLnVL(Cvl+h%a9`^zufCvmgA_O2n zsMD$Gb(0$A&s=ax{nYxJnu%44tS5rZ*wT8sx#jf1Bh7mcHn*Pc%m%&)lYk&17)A_P zIcgFx{+%EeAS9SpSAE5bhV@r0TY2gHX;W)KP(bXVj@5vGAhH07Ac!12esar>{hQv} zwRP9N*0vr&g)D%fkc^IeF1g|U@kVP90IP0*Q8eHcE0%oh=But=wWMxR4FF51M#5(x zp@k6u1QQAf5d;LATRUEQef!hTy|#PbQ4SxpY78N?qQhhfUOJ8#AOIjF5CAF=qqJUo z>4N+3zGc<2`5CQ1NPq$0Y;`yyiU6QwJ?E7-_WZB^^OMGd%?1nrB`qipODwSAhWo~q zz6X1>aqi414}9*Ho7S&ME6pGP3?d_oI<5MLUdR2>bFY8*$^SUj+7;7WhARWAZr%fbuWi}s8yjSV0mcO+0nxtIlu4BjKlJ(4D;fw43+4rwmZp}z z#+V=o{KWD+&-eWx2#hf?O9m5#s2L7X(P?C<{Q zKP_#Tg)Ao27X_p@#+bklj4>S8Ukx*}FarpHARrMD5t7!Lv{qWBlqRJVktQl&g9w2j z<4xDERVnq*U;JZ_=hImlnvxB~Bn)yzu&TWL&%S>Dr46%Dgn^SzxroH4-uDCF_k7Ru z11|{J^MX^Yr%$zYoN8_F>g*9D0jZx{GqtXEO5MaMQzoUg);gtA>2zABG%KZvD2E3a zh7AO;@dInRySxAJk^jqrkN_-(^i4|@jI;X_;gr%3-hJz}Ya38l@v(}V+|>NiueNR3w!68tv#Td7EP{f7hzKC4)WnL)*)t}uTf21qHLEX~Hbsm!sdPFm zT5F}$fMgXgx7~Ez&V5Z!KD`M6!vGs#Nb=(14fmF&1Tdfykzd=e`Y#^3PZKhrC3)=L z*n{tRp5r*K>t-Ei&%UOop8dtIw(j-=Ktx0Zgh&La5c{2Zfj}5QIFnM>uUq-)+c(ai zH9eh4r_$+^)>>;s%;$lC0qN=P{?bE#yKUDYA{C0^Pzpv(np>(~5CYUpobb1Q^k8*m zxg-DuOB!Ylg23~3rc|1A8YxXmBiWBaQbfxB zh6NfApLpTrH?pqNFn?A`D*!|!iq3bxlL~?WTI+@LWG}GnLXwe?O+a)jWNDeVg8V=a2vTiIc4zq_j$DrPJCTc~ppiA)1D{vX#dX)ToZP zcK&knwq=XwPn}X@za*kO28f6-E?zMG-+#6_>$nIwBnzkn&piSNY5MdXH&m3DCC!}W zgtfYk>pD)~8{2k&`+q*!+v}k!Q>k*&6G&x%C_xvA{wsMF97HVm0H{T2rPRsxzHj{b z-!~pO78qtW%u*P#AwccKs=GeAfjM9l8Ojz@sU7@~2XklE-?;t?0g1O5^B@QU*K_@> zyZ=!0Bai*CH|wEFDXmHANO@zzjwC;MCdPtq5&i%~O1E{nfAH}4PM_{#W)YJYsUac| zAgG(Kzj9Jdr7&B|Bxf?hvsacD11t)E_Z=IrS-m(3#K%sj>$;BPcJy@o@x$LcaJ+>m zO{ug}DMU3gqi=%%YHjarX>HxGZjH7cRH0YOQZXTYu<69^eNBjTW(c;_R1kt7r3i1m zXmyMOx{UQrePl*r>hz@d!c)iqs3QZF^<&wmjY^iKT8_sPp_{AK>$vw4rVq%;QM}aOZ)$O_Gd(zREksz!5y9c_F5r8g`%kz<4r0gwpOX}xCoA|nAXgW$L^!XjW+En84{ zmYLZECNSL9)A#b`ZG;L`3PS?nD8B_D2tWO^&BmC*yh7xj@`|PN4I5#WGohg+Ru?4I zRTZ;l)Y(d%JRxA?voZS*H#Z$Si7G>+5HWekMsKr-h&%TlJ$&rc!r3zcIZD^$Fks+!Vqn}&gju$~`<@6PsmSn-@(GLa?e6a09eWOj+68l*QM>9U z*G@=llL!||o&gL{Q#D~ic^V38qpS^J<~{qHfE1vz6>no9;SyES?R>9EP*5m8mPP~s ztyNuZC5wo#M61M&ut5FfT1EN#CnSo9h#YNhLkt0)v3{My$4_yticgX_rFCshHOQH~ zppvrzkkUAqV{JLm(bXGOd4^Hj*zK{svpettU6z4dG%yaP2?5zytTYLgm#`N!q=VAk z-6Mb?HZ6rPW+^8T$vQ5}z$#uu6j4P*1wqOMK20sD+j=ww7b4f^6cYP}PN? ztT9=~;XxEssj47|y^euioRInrVQ98#%=Rd?HI-?txFFC7y)rhw@7a3z7%~x|l6FI- zc>Qp;|I0AW!nDZ~l}=#-Y>>qA{h+5ii_8iBU};OhkbX^pLn4C;%V@mKvcye9JJ`Tm$VTs#tJ9O{RL1)JrJ`VmPjgvmoHt2U;rq2jN?L>uAaWOjt)Q? zH0@J*WhppxWM!)oW6%a=^rHbm0ifA4rZ&uyAB$WXmjMkPVcW1Vnme(6`3igzuQ_PEb%j zdE52V>uM$J`p8KN1%U~C@7Re`hmW-&kX22IV4<`l;UWA^vAQP$;Y4Kg-8{qvb7tKC z8y~UAN1p8s0uuzjZ}=ClZuPtX$Z`kA4Hkq&vPp8Bq0!u9Wku!>zw(*dn#w#$j2Pet zzSq;^y!h%{K!iv(c{kWQ=#mS>Bsb)V1wZ;@P8rCE8W{8S9twg6`0D5Hx_a%hJbCOd z1P+WJ1aH5y`{2=22nvwSoRrrkse%NOJuUX=`Mz(AVZ$K{L`GBsQQ-axNQ(5A@B8@Y zK7Lc)iH_gF^E}UW`+B>7_~TzN8`5dOA(VUxjw%ocOyIhn@B48(ku6BET`qB71=f?Hhm%jAZP#xMNnW$-K5XldE>pG{76+rdGx5tJNwMchW)_vJ@1Jp z|NZERQ>Zeel;zNw+cEXn=j{rS0to|D9EK`}_ugyTv-^MvJYm1U#v-5qrl7xYyl5m2 zE$_nF1nG3@(uK1>{J|@4|F!F;)z#P*)I!HMHb0Kj=eX{s&D)=O?iE2rq!9@L0f*>S zI@c1A$)xIPYbMuLgRl&*w;zzj00&{wUz{aF06+%OfJ}-=Mbl`CMz8^DtEy(rtXtMF zZ_V<>b1$hcFUy1&&p=^^b$dL|%Vx8Ej(hOnk-vKEpFGcCDvhK7s2EpxG#QYTxKPm} zO{|)*Xzq+FS1(z4+2SP&W=*S~q?HTh4LakksvUh z=Vr6nzP{}76DNP~+yBsZx|37}N!x<3VrZ*Jk^0dKG5}>VsVi13x%I}YuDfdajHz`h zY$!y4l4#462vyCeJ0#F%*K?h$lkLkkx1RpfN1oVs_!y}a>a@*M7RmlmV?eCwQmM?X z8?U_oQy*D0Z)Q53wtFzZC;&oGL}LB?jsqq3IJ4Po)^$%dxBkIje&?M%heT;4O+<)P z{0{X<&q+j06iB7@&FioH>gVs6KWC;r@hk>_02mAk0H7JI$n@OP9YC0Ev|()fljC^1 z_8$D!fB#<7@m3;@ltz_~W)b1JU;u&v(bhYkKl_s3{oW-ocmxy zOYmT>jzyS#-}gM%b=^MKJpc1e-}%9h+dCbl6{<9n3VUkKW{uDYYd}GfTRwQzH^1`P zsdW=YklBuhkx@s%hBQB;_|GMC>o&b*=Sg^;=X-v0%jw7e_cJeU-U&QSo{YWMRQ_I(wddVbi}p`*K&WON5|PKq(?^8zP5s0`xHH4}d6D73JUj%I9wX z&^l&e4hF10jlYb5Gme@I338j<&g_v4CE17=+ax>-Z!6c+0ZaFIm`xA_#sq;Mn4tO8 z>6c#J`og9yO~+3nDpVT7_HG5mbYzdB3bOxFCY}1T|9am|>(>GspN$AuWF~polVf?p z#fF)IZN`L(Kb#2$gmM*41I>T2C zDSm8qJTNKjkVYEtj3a{53Iv#?$O&S}`mMltLBOsb^kuWhn%kO=oZ7SZ@UF%KSubED zLP1PXIL?3s$wJK|RHFJUtP+Mpxe)QUK5_HMK75TIFdNSp5jOq%5M~x*IGlszd4AxT zAUM|CwtHVwltCgSB{0nH2^3s+#nKzEU11=1G?jpzedV~>N51on;IIc#VIsD~2++6gmBi{k zxA0V{fLl8h^?*Gh3rcbVM0+#~`Opu^H7!&xupLMfd)@$wT{^uXP@Y3dOejuPU zk`6P}Vdu&)t1$#&$>Mo;-g3PG1Yt?!0_;4p&Ys>!9)DWGKE>gMc{%nz4ug{r;HVDo zE>?^XNG@-fcgu}e8)Hl~aV?P&GM?u-so%cq=1eAKf*>Zn zRsGED`+@8Fj?=gQ(20j1`{!e=?Fv(*G}w6xv zAz}~$ECJA|SQ`Ms4GZR6yY@0+iO+uSWH8@zvnN{H|HpTqI?-}kQ5uy7l>#IfXeQ6_ z6sSb;YFrXwzmG!=HVh&l)-MQ|jps2ZhS0?f%z^@jQ9k+64WuxRc=O>|*UP%@<4-(u z=-4Ts6sQ!214=Md-lI~UBN1AV_-O^oOcIgt`3`*#VFOT5&eh2aza%@ zFK{=VlQJK6s1&t4Z$piT!BtpFiyxOxR5nrQAw?8X=q1cprz zJon=3tzFp^DJC6xZ==8YVxp`5RDFMws+`9R7{Ul3B2-mPSh8>yGl(!JOY+zjB>8O} z-LJg469Iv=)%#=Cn_Kkxm$(KA&gUH55MGb~h~U)8)%A4~^PpxM`5I%GgYCQapYF^m zrGfOAP6&{*)j{Wd{&Oe^Kn9?>vu0$pvIC-$sV-p-nAymi+xI9GP$c2C9`7d$!n(U? zk0Fh)-G{Si;0!6r?h!ZQzk{gdl_F7}t z+SbKvAvPSijBm7MU?|wOl-7_c2#BDpEH${)qwBhoTfaAkflrus&+iTD2W4|Ilq?~L zb{?ysq2*an1oLb_jKmR9a#a3Ui@K#Xp7DXO{#~Rb{2&@~!yssjO$v{;)kVqqRbwCY zi=u%W3u31LKuW0XhlYe%jN$f<&H?`l5fEug-DE}T+`O*sm>BF(i%4fzmwmZ$Vgqb6 z+}7TcXWK0PMTAP}OQuaBLc{htov}r}l%h+f*C8n|LE-UdmX?mLcxJc?KiX$0Wr8?Gb}Q;>~`8s)h0;Bf@$Z%-5v;n9Ad(fkZy z11zH4(sKIH(U#hYRrx|dNI*)d`ExG0V)>HS-)YoLOpK$d1ENb%X>#?1TW`FI1w{-b zRFI{95Comw*+Wgo!VFA~(_FeLNB|H5mN&NTDGUPQP@pWGy5p7&88udMsO9Hx-hN}% zgtV|gA}bWvKpJBj4>oo6W&u@{h#m)SXoN0q-m=4WJ$p52e8A(oY)Gjq*Ic@8^)dsD zf|657Gg9ye5e3Zbne}(vx;|iAU2T%bo0)y%vynI7-f376$=0y};Q7x6k~6Om{*s-0 z55ITds4xp~Aufc78J+p^7d}x}RW4!(0YySij9`Vm9?WIwim!d~uDaS935y}Zt5HS7 z*a=9Vr&Jip=RvvxxfJmqa)b-b{dhp(lrW6Yx3d-4n6A}$vN*K>uHeUOsdp^c2zF{sXMfH6@@O?M% ze)`;NKp0M~FC9-*mDepSjx^u|zL)i`UVEu6+s?V{82a0smo?0rJgMf*t-AulNsO*| zng{|3B8pP_leca7{r~dWv{pe7urYanU=Re3>$r~l(rep(`r@0Uh|m_|0hWjnR%MeH z6i0s`kRvDB)?B`@ZqmevrZ_-sjCkpy+4E;l-@bEyU!M!%VQ}L0!jbYw!5G?>^Pl+ec{YP)jKgQ)R_T00N+B$9GROpT6PRRZ3CV zz5tj9Q81wvnLB6BhIK1iTH6jEIU&VE)#2c6xO~a%KmWZ4fBnX5fG7w&Q=ok8kOtRv zvyS_(KY97}w|4_6)M-FfT5ZV1G9Vs%dHiJSgmQJ+;(7K0^};(XNq~_EOigv=&DUSO zeA%M*j?T7@F5fp2mJ4Ekdr6|H(cVV7WZ|s;eBYhF|J8eDO|A9VaNq?4seaG*JjZj~ zzOC;z{=<{c1`JB2VUSto=kvmvhMS8GMojStb$qWV z<~BDV5|UCjG$Qeh^z`~|r`wxPwPv%fYl6xN<@Hl0Uov${MR~fcJR=dLBZk9%%EWY% z*zIv$H=A`kyW0Np(I0Nvv6m=AN<&nUH%=LlsPz#9U|uw5+PA)TPknu@R{cCEWP`O8 zM2HaH>taO);>I5dFGyu(W)LxK!hY|(nefIKKk!}0bsV>|tLr=8|M82Pw-Lr;0;mLs zP!#P2B`+PdDfqVb&K-LWtXbJmQI@fXl!$D%UXlS4H82TCPUkQ)3me;P5rR44*Ia;X z+XsB#cOB1l`+EBN9{tB>Uf%pRpvLg*6PDod2LP3sG=G?~gV=Jq^PQasmN(37cAVQa&xsX(S!jFW%gG(baUG|vz3cCv_|c}#+ksL*8kHXDHL3421B#S@0*Dj< z5vaYR{g<2HojId!+LYSCuF8VJr;rSG{Y{eeR_QyA<9S}=p<@p}`s7>hHX^1_r3f|k z8(zF%7!Yk10RYKyyjS1c?mFIrxib}6_=}?otux8QU~~@==D_%Y?|H7{dampAW!;xw zefw`7|CggD+lazB4P@`e#?lo4!0JUejQ}u<&}tD8Gk1FJ7e4p#PyXPk=eBHbG$KHXDAM}?7c>K++Iw3mZCFr)d&SD7AOG+N zmNm>#I-?cFJQ$1(Fwj_!AP54_`0N}$+VcF1Z~gq0U-fzcAtI&X0VRN?O!$}qRSP$c z><1)AWwX80RBK$ZWX{Ix)~s5-q`IP9Apt2ORElhD&_6mi$~v$x8xBJ+6L_BY?%snh zZF>8yclLJm^&)D(6vkjDj0e(>5(6L)YLl=_lnsGYO-Qd^zHrUTOP4O1U0qq3NvDXk zAP^>%7l;uN_I$6WH+%5V@hv+Vx9n(aX>AJ(BWXcIP^c7GkQB!c^+%5Z$)A`&%m7#z zKmtuTy?)a4sgvvLYU*lhCX{C?E6PEn&-MEHvTYrmEo~hqTe^-OZ+3hSL=l1@ArXK= zvVGnth~w$(j}-&@fg=C_j>0guAL+m9f=R+EPwBsmmk>z8OTiUHnTMpaI?g0u3`Z9W z002daafu3>g&@D%2Kyf{+1yVVtw`+6Kr)D!iWzz>D;M pUl&~@!9@mKWWdFBkpUO%`u{zplJktA*AoB$002ovPDHLkV1n=ga|!?e literal 0 HcmV?d00001 From 4875b7578daaf2d6144f753c1228f1665538ea4d Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Thu, 18 Sep 2014 16:10:27 -0400 Subject: [PATCH 295/597] Standarize resolver descriptions so they all have periods. --- ampache/content/metadata.json | 2 +- beets/content/metadata.json | 2 +- grooveshark/content/metadata.json | 2 +- jamendo/content/metadata.json | 2 +- officialfm/content/metadata.json | 2 +- soundcloud/content/metadata.json | 2 +- subsonic/content/metadata.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ampache/content/metadata.json b/ampache/content/metadata.json index aecdccc52..02ba7367e 100644 --- a/ampache/content/metadata.json +++ b/ampache/content/metadata.json @@ -5,7 +5,7 @@ "email": "teo@kde.org", "version": "0.3.2", "website": "http://gettomahawk.com", - "description": "Connects to an Ampache or ownCloud server and resolves tracks", + "description": "Connects to an Ampache or ownCloud server and resolves tracks.", "type": "resolver/javascript", "manifest": { "main": "contents/code/ampache.js", diff --git a/beets/content/metadata.json b/beets/content/metadata.json index c31f77a9b..96a54f577 100644 --- a/beets/content/metadata.json +++ b/beets/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.5.4", "website": "http://gettomahawk.com", - "description": "Connects to a beets server and resolves tracks", + "description": "Connects to a beets server and resolves tracks.", "type": "resolver/javascript", "manifest": { "main": "contents/code/beets.js", diff --git a/grooveshark/content/metadata.json b/grooveshark/content/metadata.json index b2c23544c..2dd4ac382 100644 --- a/grooveshark/content/metadata.json +++ b/grooveshark/content/metadata.json @@ -5,7 +5,7 @@ "email": "lfranchi@kde.org", "version": "0.7.0", "website": "http://gettomahawk.com", - "description": "Searches Grooveshark for playable tracks, requires premium account", + "description": "Searches Grooveshark for playable tracks. Requires a VIP account.", "type": "resolver/javascript", "manifest": { "main": "contents/code/grooveshark.js", diff --git a/jamendo/content/metadata.json b/jamendo/content/metadata.json index cc923256e..28ab5a08e 100644 --- a/jamendo/content/metadata.json +++ b/jamendo/content/metadata.json @@ -5,7 +5,7 @@ "email": "lasconic@gmail.com", "version": "0.1.5", "website": "http://gettomahawk.com", - "description": "Searches Jamendo's free music database", + "description": "Searches Jamendo's free music database.", "type": "resolver/javascript", "manifest": { "main": "contents/code/jamendo.js", diff --git a/officialfm/content/metadata.json b/officialfm/content/metadata.json index a6e462a8a..da3469821 100644 --- a/officialfm/content/metadata.json +++ b/officialfm/content/metadata.json @@ -5,7 +5,7 @@ "email": "lasconic@gmail.com", "version": "1.0.7", "website": "http://gettomahawk.com", - "description": "Searches Official.fm for playable tracks", + "description": "Searches Official.fm for playable tracks.", "type": "resolver/javascript", "manifest": { "main": "contents/code/officialfm.js", diff --git a/soundcloud/content/metadata.json b/soundcloud/content/metadata.json index f8cfa1bac..4e4eaa91a 100644 --- a/soundcloud/content/metadata.json +++ b/soundcloud/content/metadata.json @@ -5,7 +5,7 @@ "email": "thierry@strayrayday.lu", "version": "0.9.6", "website": "http://gettomahawk.com", - "description": "Resolves to playable tracks on SoundCloud, including live, cover and remixed versions if specified", + "description": "Resolves to playable tracks on SoundCloud, including live, cover and remixed versions if specified.", "type": "resolver/javascript", "manifest": { "main": "contents/code/soundcloud.js", diff --git a/subsonic/content/metadata.json b/subsonic/content/metadata.json index cede00dd1..ed430ff22 100644 --- a/subsonic/content/metadata.json +++ b/subsonic/content/metadata.json @@ -5,7 +5,7 @@ "email": "teo@kde.org", "version": "0.6.1", "website": "http://gettomahawk.com", - "description": "Searches your Subsonic server for music to play", + "description": "Searches your Subsonic server for music to play.", "platform": "any", "tomahawkVersion": "0.6.99", "type": "resolver/javascript", From 641e31d0fbb019a68c7abfad4f5afc2efe3208d9 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Thu, 18 Sep 2014 18:05:13 -0400 Subject: [PATCH 296/597] Update Tomahk metdata icon to match --- .../content/contents/code/tomahk-metadata.png | Bin 16313 -> 25776 bytes .../content/contents/images/icon.png | Bin 16313 -> 25776 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tomahk-metadata/content/contents/code/tomahk-metadata.png b/tomahk-metadata/content/contents/code/tomahk-metadata.png index c4ccf7b30f6949791f8fa0ea23616add5b84db14..6b8155b437f6e01b55899b43d2215328b3bb7d03 100644 GIT binary patch literal 25776 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�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 nHQ?9BP)`H;-$TCnM7s%YsH_}<$@=tF^H0j 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�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 nHQ?9BP)`H;-$TCnM7s%YsH_}<$@=t Date: Sun, 21 Sep 2014 17:00:11 -0400 Subject: [PATCH 297/597] Make descriptions more consistent. Add periods. --- 4shared/content/metadata.json | 2 +- 8tracks/content/metadata.json | 6 ++++-- beatsmusic/content/metadata.json | 2 +- deezer-metadata/content/metadata.json | 2 +- dilandau/content/metadata.json | 2 +- gmusic/content/metadata.json | 2 +- lastfm/content/metadata.json | 2 +- qobuz/content/metadata.json | 2 +- rdio-metadata/content/metadata.json | 2 +- spotify-metadata/content/metadata.json | 2 +- synology-audiostation/content/metadata.json | 2 +- tomahk-metadata/content/metadata.json | 2 +- vkontakte/content/metadata.json | 2 +- youtube/content/metadata.json | 2 +- 14 files changed, 17 insertions(+), 15 deletions(-) diff --git a/4shared/content/metadata.json b/4shared/content/metadata.json index 48c56e643..51c59a76a 100644 --- a/4shared/content/metadata.json +++ b/4shared/content/metadata.json @@ -5,7 +5,7 @@ "email": "lasconic@gmail.com", "version": "0.1.5", "website": "http://gettomahawk.com", - "description": "Looks for tracks to play from www.4shared.com", + "description": "Looks for tracks to play from www.4shared.com.", "type": "resolver/javascript", "manifest": { "main": "contents/code/4shared.js", diff --git a/8tracks/content/metadata.json b/8tracks/content/metadata.json index 15a341c92..d925b6817 100644 --- a/8tracks/content/metadata.json +++ b/8tracks/content/metadata.json @@ -5,12 +5,14 @@ "email": "lfranchi@kde.org", "version": "0.1", "website": "http://gettomahawk.com", - "description": "Looks for tracks to play from 8tracks.com", + "description": "Looks for tracks to play from 8tracks.com.", "type": "resolver/javascript", "manifest": { "main": "contents/code/8tracks.js", "scripts": [], "icon": "contents/images/icon.png", - "resources": [] + "resources": [ + "contents/code/8tracks-icon.png" + ] } } diff --git a/beatsmusic/content/metadata.json b/beatsmusic/content/metadata.json index 74d6c29c0..07be29815 100644 --- a/beatsmusic/content/metadata.json +++ b/beatsmusic/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.1", "website": "http://gettomahawk.com", - "description": "Stream music from Beats.", + "description": "Stream music from Beats Music.", "type": "resolver/javascript", "manifest": { "main": "contents/code/beatsmusic.js", diff --git a/deezer-metadata/content/metadata.json b/deezer-metadata/content/metadata.json index de8144efa..c31d6b26f 100644 --- a/deezer-metadata/content/metadata.json +++ b/deezer-metadata/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.1", "website": "http://gettomahawk.com", - "description": "Supports loading/drag'n'drop of Deezer URLs.", + "description": "Supports loading and drag & drop of Deezer URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/deezer-metadata.js", diff --git a/dilandau/content/metadata.json b/dilandau/content/metadata.json index 7353bd59c..b0c1f154d 100644 --- a/dilandau/content/metadata.json +++ b/dilandau/content/metadata.json @@ -5,7 +5,7 @@ "email": "lasconic@gmail.com", "version": "0.4.1", "website": "http://gettomahawk.com", - "description": "Uses mp3 search engine http://www.dilandau.eu/ to find tracks", + "description": "Uses mp3 search engine http://www.dilandau.eu/ to find tracks.", "type": "resolver/javascript", "manifest": { "main": "contents/code/dilandau.js", diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index c96bfc199..916f1b90e 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -5,7 +5,7 @@ "email": "sam@maltera.com, lalitmaganti@gmail.com, mrmaffen@gmail.com", "version": "0.4", "website": "http://gettomahawk.com", - "description": "Streams music from Google Play Music.", + "description": "Streams music from your Google Play Music locker and the entire Google Music catalog for subscribers.", "type": "resolver/javascript", "manifest": { "main": "contents/code/gmusic.js", diff --git a/lastfm/content/metadata.json b/lastfm/content/metadata.json index aeab8d5b1..7adfd0223 100644 --- a/lastfm/content/metadata.json +++ b/lastfm/content/metadata.json @@ -5,7 +5,7 @@ "email": "thierry@strayrayday.lu", "version": "0.2.4", "website": "http://gettomahawk.com", - "description": "Resolves to freely downloadable tracks on Last.fm", + "description": "Resolves to freely downloadable tracks on Last.fm.", "type": "resolver/javascript", "manifest": { "main": "contents/code/lastfm.js", diff --git a/qobuz/content/metadata.json b/qobuz/content/metadata.json index 8e330dee4..1f3bbcd59 100644 --- a/qobuz/content/metadata.json +++ b/qobuz/content/metadata.json @@ -5,7 +5,7 @@ "email": "regbasket@gmail.com", "version": "0.1", "website": "http://gettomahawk.com", - "description": "Searches Qobuz for playable tracks", + "description": "Searches Qobuz for playable tracks. Qobuz subscription required.", "type": "resolver/javascript", "manifest": { "main": "contents/code/qobuz.js", diff --git a/rdio-metadata/content/metadata.json b/rdio-metadata/content/metadata.json index 8f21e615e..b9b45393b 100644 --- a/rdio-metadata/content/metadata.json +++ b/rdio-metadata/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.0", "website": "http://gettomahawk.com", - "description": "Supports loading/drag'n'drop of rdio URLs.", + "description": "Supports loading and drag & drop of Rdio URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/rdio-metadata.js", diff --git a/spotify-metadata/content/metadata.json b/spotify-metadata/content/metadata.json index eced47153..4a7940b26 100644 --- a/spotify-metadata/content/metadata.json +++ b/spotify-metadata/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.1", "website": "http://gettomahawk.com", - "description": "Supports loading/drag'n'drop of Spotify artists and track URLs without a premium account.", + "description": "Supports loading and drag & drop of Spotify artist and track URLs (no Spotify account required)", "type": "resolver/javascript", "manifest": { "main": "contents/code/spotify-metadata.js", diff --git a/synology-audiostation/content/metadata.json b/synology-audiostation/content/metadata.json index 3bff593a7..6024926eb 100644 --- a/synology-audiostation/content/metadata.json +++ b/synology-audiostation/content/metadata.json @@ -5,7 +5,7 @@ "email": "ron.jaegers@gmail.com", "version": "0.0.5", "website": "http://gettomahawk.com", - "description": "Resolves tracks from Synology AudioStation", + "description": "Resolves and plays tracks from your Synology AudioStation.", "platform": "any", "type": "resolver/javascript", "manifest": { diff --git a/tomahk-metadata/content/metadata.json b/tomahk-metadata/content/metadata.json index 55ab0d8e3..29997611b 100644 --- a/tomahk-metadata/content/metadata.json +++ b/tomahk-metadata/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.0", "website": "http://gettomahawk.com", - "description": "Supports loading/drag'n'drop of toma.hk URLs.", + "description": "Supports loading and drag & drop of toma.hk URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/tomahk-metadata.js", diff --git a/vkontakte/content/metadata.json b/vkontakte/content/metadata.json index 4e09a7dc8..0c9d5b214 100644 --- a/vkontakte/content/metadata.json +++ b/vkontakte/content/metadata.json @@ -5,7 +5,7 @@ "email": "kkszysiu@gmail.com", "version": "0.1", "website": "http://gettomahawk.com", - "description": "Searches VKontakte (vk.com) for music to play", + "description": "Searches VKontakte (vk.com) for music to play.", "type": "resolver/javascript", "manifest": { "main": "contents/code/vkontakte.js", diff --git a/youtube/content/metadata.json b/youtube/content/metadata.json index e793b7200..30759e1c0 100644 --- a/youtube/content/metadata.json +++ b/youtube/content/metadata.json @@ -5,7 +5,7 @@ "email": "lfranchi@kde.org", "version": "0.9.12", "website": "http://gettomahawk.com", - "description": "Searches YouTube for audio content", + "description": "Searches YouTube for audio content to play.", "type": "resolver/javascript", "manifest": { "main": "contents/code/youtube.js", From 26a473087201ce4faf16b38b96261ae0e7bbd5c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=BCbschle-Schneider?= Date: Tue, 23 Sep 2014 00:35:23 +0200 Subject: [PATCH 298/597] [4shared] API no longer returns mp3 URL, parse file page instead --- 4shared/content/contents/code/4shared.js | 106 +++++++++++++---------- 4shared/content/metadata.json | 2 +- 2 files changed, 63 insertions(+), 45 deletions(-) diff --git a/4shared/content/contents/code/4shared.js b/4shared/content/contents/code/4shared.js index 7562c99d1..e476b6227 100644 --- a/4shared/content/contents/code/4shared.js +++ b/4shared/content/contents/code/4shared.js @@ -1,6 +1,7 @@ /* === This file is part of Tomahawk Player - === * * Copyright 2011, lasconic + * Fixed in 2014 by Lorenz Hübschle-Schneider * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -24,69 +25,86 @@ var FSharedResolver = Tomahawk.extend(TomahawkResolver, { timeout: 5 }, resolve: function (qid, artist, album, title) { - var valueForSubNode = function (node, tag) { - return node.getElementsByTagName(tag)[0].textContent; - }; + // Parse a file detail page + var parseFileDetailPage = function (fileXhr) { - // build query to 4shared - var url = "http://search.4shared.com/network/searchXml.jsp?q="; - var request = ""; - if (title !== "") request += title + " "; + var response = fileXhr.responseText, + urlRegex = /<\!-- file: (https?:\/\/.*\.mp3) -->/gi, + durationRegex = /options_[0-9]+\['duration'\] = '([0-9]+).0';/gi, + bitrateRegex = /Bit Rate:<\/b>\n\s+([0-9]+) kbps \|/gi, + match; + + // Find mp3 URL + match = urlRegex.exec(response); + if (!match) { + return; + } + var mp3Url = match[1]; - if (artist !== "") request += artist + " "; + // Find track duration + match = durationRegex.exec(response); + var duration = match ? parseInt(match[1], 10) : null; - url += encodeURIComponent(request) + // Try to find bit rate (only present on some files) + match = bitrateRegex.exec(response); + var bitrate = match ? parseInt(match[1], 10) : 128; + + var result = { + artist: artist, + album: album, + track: title, + source: that.settings.name, + url: mp3Url, + duration: duration, + extension: 'mp3', + bitrate: bitrate, + score: 0.80 + }; + + // return this result + Tomahawk.addTrackResults({ + qid: qid, + results: [result] + }); + }; + // build query to 4shared + var request = [title, artist].join(" ").trim(); + + var url = "http://search.4shared.com/network/searchXml.jsp?q="; + url += encodeURIComponent(request); url += "&searchExtention=mp3&sortType=1&sortOrder=1&searchmode=3"; + // send request and parse it into javascript var that = this; - var xmlString = Tomahawk.asyncRequest(url, function(xhr) { + Tomahawk.asyncRequest(url, function (xhr) { // parse xml - var domParser = new DOMParser(); - xmlDoc = domParser.parseFromString(xhr.responseText, "text/xml"); + var domParser = new DOMParser(), + xmlDoc = domParser.parseFromString(xhr.responseText, "text/xml"), + results = xmlDoc.getElementsByTagName("result-files"); - var results = new Array(); - var r = xmlDoc.getElementsByTagName("result-files"); // check the response - if (r.length > 0 && r[0].childNodes.length > 0) { - var links = xmlDoc.getElementsByTagName("file"); + if (results.length > 0 && results[0].childNodes.length > 0) { + var links = xmlDoc.getElementsByTagName("file"), + link, fileDetailUrl; - // walk through the results and store it in 'results' + // walk through the results for (var i = 0; i < links.length; i++) { - var link = links[i]; - - var result = new Object(); - result.artist = artist; - result.album = album; - result.track = title; - //result.year = valueForSubNode(link, "year"); - result.source = that.settings.name; - result.url = decodeURI(valueForSubNode(link, "flash-preview-url")); - - result.extension = "mp3"; - //result.bitrate = valueForSubNode(link, "bitrate")/1000; - result.bitrate = 128; - //result.duration = valueForSubNode(link, "duration"); - result.score = 0.80; - results.push(result); + link = links[i]; + fileDetailUrl = link.getElementsByTagName("url")[0].textContent; + fileDetailUrl = decodeURI(fileDetailUrl); + // process this file detail page + Tomahawk.asyncRequest(fileDetailUrl, parseFileDetailPage); } } - - var return1 = { - qid: qid, - results: results - }; - - Tomahawk.addTrackResults(return1); }); }, search: function (qid, searchString) { - var return1 = { + return { qid: qid, - results: new Array() + results: [] }; - return return1; } }); -Tomahawk.resolver.instance = FSharedResolver; \ No newline at end of file +Tomahawk.resolver.instance = FSharedResolver; diff --git a/4shared/content/metadata.json b/4shared/content/metadata.json index 51c59a76a..933b7e574 100644 --- a/4shared/content/metadata.json +++ b/4shared/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "4shared", "author": "lasconic", "email": "lasconic@gmail.com", - "version": "0.1.5", + "version": "0.1.6", "website": "http://gettomahawk.com", "description": "Looks for tracks to play from www.4shared.com.", "type": "resolver/javascript", From fa084534896b345b84c6147ebf0efdb0d3d2de50 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 23 Sep 2014 11:26:25 +0100 Subject: [PATCH 299/597] [grooveshark] Style fixes and disable some logs Although Tomahawk.log outputs are very helpful during development, they are actually a very instensive call across the JS<->Qt bridge and does harm performance siginificantly. Only left the important/error reporting line active. --- .../content/contents/code/grooveshark.js | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/grooveshark/content/contents/code/grooveshark.js b/grooveshark/content/contents/code/grooveshark.js index d90926194..c17b196ff 100644 --- a/grooveshark/content/contents/code/grooveshark.js +++ b/grooveshark/content/contents/code/grooveshark.js @@ -146,9 +146,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { newConfigSaved: function () { var userConfig = this.getUserConfig(); - Tomahawk.log("newConfigSaved - username: " + userConfig.username); if ((userConfig.username != this.username) || (userConfig.password != this.password)) { - Tomahawk.log("Saving new Grooveshark credentials with username:" + userConfig.username); this.sessionId = ""; this.countryId = ""; @@ -165,7 +163,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.log("Grooveshark Resolver not properly configured!"); return; } - Tomahawk.log("Doing Grooveshark resolver init, got credentials: " + userConfig.username ); + // Tomahawk.log("Doing Grooveshark resolver init, got credentials: " + userConfig.username ); this.secret = this.spell("499pn17500pq8r20nso1613p2q264r7r"); this.username = userConfig.username; this.password = userConfig.password; @@ -189,7 +187,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }, authenticate: function (doConfigTest) { - Tomahawk.log("Grooveshark resolver authenticating with username: " + this.username); + // Tomahawk.log("Grooveshark resolver authenticating with username: " + this.username); var hashString; if (typeof CryptoJS !== "undefined" && typeof CryptoJS.MD5 == "function") { hashString = CryptoJS.MD5(this.password).toString(CryptoJS.enc.Hex); @@ -207,7 +205,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }; } this.apiCallWithSessionId("authenticate", params, function (xhr) { - Tomahawk.log("Got result of authenticate: " + xhr.responseText); + // Tomahawk.log("Got result of authenticate: " + xhr.responseText); var ret = JSON.parse(xhr.responseText); if (ret.result.success) { if (ret.result.UserID == 0) { @@ -239,7 +237,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { this.apiCall("startSession", [], function (xhr) { var res = JSON.parse(xhr.responseText); if (res.result && res.result.success) { - Tomahawk.log("Got grooveshark session id"); + // Tomahawk.log("Got grooveshark session id"); that.sessionId = res.result.sessionID; if (callback) { callback.call(window); @@ -280,13 +278,13 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { } } else { var that = this; - Tomahawk.log("Grooveshark resolver Getting country..."); + // Tomahawk.log("Grooveshark resolver Getting country..."); that.ensureClientIP(function () { that.apiCall('getCountry', [], function (xhr) { var ret = JSON.parse(xhr.responseText); if (ret.result) { that.countryId = ret.result; - Tomahawk.log("Got country id: " + that.countryId); + // Tomahawk.log("Got country id: " + that.countryId); if (callback) { callback.call(window); } @@ -299,17 +297,17 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { }, apiCall: function (methodName, args, callback, errorHandler) { - Tomahawk.log("apiCall - methodName: " + methodName + ", args: " + args); + // Tomahawk.log("apiCall - methodName: " + methodName + ", args: " + args); var payload = { - method: methodName - }; - payload.header = { - wsKey: this.apiKey + header: { + wsKey: this.apiKey + }, + method: methodName, + parameters: args }; if (this.sessionId != "") { payload.header.sessionID = this.sessionId; } - payload.parameters = args; var data = JSON.stringify(payload); var sig; @@ -364,7 +362,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { that.ensureSessionId(function () { that.ensureCountryId(function () { args.country = that.countryId; - Tomahawk.log("Setting country id: " + args.country); + // Tomahawk.log("Setting country id: " + args.country); that.apiCall(methodName, args, callback); }); }); @@ -385,9 +383,9 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { songID: songId }; - var that=this; - that.apiCallWithCountryId('getSubscriberStreamKey', params, function (request) { - Tomahawk.log("Got song stream url: " + request.responseText); + var that = this; + this.apiCallWithCountryId('getSubscriberStreamKey', params, function (request) { + // Tomahawk.log("Got song stream url: " + request.responseText); var ret = JSON.parse(request.responseText); if (ret.errors) { Tomahawk.log("Error doing getSubscriberStreamKey api call: " @@ -396,7 +394,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { that.sessionId = ""; } else { // ret.result.duration contains the duration of the song, we should update the duration here ! - Tomahawk.log("Reporting song stream url: " + ret.result.url); + // Tomahawk.log("Reporting song stream url: " + ret.result.url); Tomahawk.reportStreamUrl(qid, ret.result.url); } }); @@ -410,7 +408,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { var that = this; this.apiCallWithCountryId("getSongSearchResults", params, function (xhr) { - Tomahawk.log("Got song search results: " + xhr.responseText); + // Tomahawk.log("Got song search results: " + xhr.responseText); var ret = JSON.parse(xhr.responseText); if (!ret || !ret.result || !ret.result.songs) { return; @@ -423,7 +421,7 @@ var GroovesharkResolver = Tomahawk.extend(TomahawkResolver, { { return; } - Tomahawk.log("Got search result with num of songs: " + songs.length); + // Tomahawk.log("Got search result with num of songs: " + songs.length); for (var i = 0; i < songs.length; i++) { var song = songs[i]; var songResult = { From ec898f2353470157c7e97f2f095bc501327d8814 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 23 Sep 2014 15:18:37 +0100 Subject: [PATCH 300/597] [beatsmusic] Add indicator icon --- .../content/contents/images/icon-16x16.png | Bin 0 -> 785 bytes beatsmusic/content/metadata.json | 35 +++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 beatsmusic/content/contents/images/icon-16x16.png diff --git a/beatsmusic/content/contents/images/icon-16x16.png b/beatsmusic/content/contents/images/icon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..becb9f208f8d5267ac3f9f194583696ff9bc4701 GIT binary patch literal 785 zcmV+s1Md8ZP)^nA&G=9z5tMmdpi}2 zV&~UN6PG^NTxNK4d2w4OgD#N*uTw^Vk@m}+vIT5GJNuU$*OKrdFx(CNI5;)##V#h< zvu73uLiynO{KB2m5iI$**9-(`Lm#?C!kZw&TQ0wH^zZXUV1ss)mFNpTtpC8B(r4d_ z0P4Gtn=-rW^iZhTgC1=WYKwv2}v(I&2~7=aCoeGEPkf| z%#O^=74med@G9hm1I=)n640JbJq~|yPop|*W_HbT^6shW|0S%oq(CACTAi)DbU-En zDUM76GI6y%jq3DTX#%_Sbdl2|XE=55 Date: Tue, 23 Sep 2014 18:10:38 +0100 Subject: [PATCH 301/597] [beatsmusic] Add callback to notify when resolver was initialised. --- beatsmusic/content/contents/code/beatsmusic.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 97beb0b59..c6ca6c81c 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -53,11 +53,14 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }, - login: function() { + login: function(callback) { var userConfig = this.getUserConfig(); if (!userConfig.user || !userConfig.password) { Tomahawk.log("Beats Music Resolver not properly configured!"); this.loggedIn = false; + if (callback) { + callback("Beats Music Resolver not properly configured!"); + } return; } @@ -85,6 +88,9 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { var res = JSON.parse(xhr.responseText); that.accessToken = res.access_token; that.loggedIn = true; + if (callback) { + callback(); + } }, headers, { method: "POST", data: data @@ -93,7 +99,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, - init: function() { + init: function(cb) { this.app_token = this.spell("s4fw8if4jfwxakawi7xud55c"); Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); @@ -103,7 +109,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { // re-login every 50 minutes setInterval((function(self) { return function() { self.login(); }; })(this), 1000*60*50); - this.login(); + this.login(cb); }, From c5e9a339894fe83fb8d93ba01aa044942bc468ba Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 23 Sep 2014 18:11:37 +0100 Subject: [PATCH 302/597] [test] Add parameter to pass userConfig to the resolver --- test/utils.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/utils.js b/test/utils.js index 8e83b11e9..3285b966e 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,7 +1,7 @@ var fs = require('fs'); var TomahawkJS = require("tomahawkjs"); -module.exports.loadResolver = function (name, owner, done) { +module.exports.loadResolver = function (name, owner, done, config) { owner.metadata = JSON.parse(fs.readFileSync(name + '/content/metadata.json')) TomahawkJS.loadAxe(name + '/' + name + '-' + owner.metadata.version + '.axe', function(err, axe) { axe.getInstance(function(err, instance_context) { @@ -15,6 +15,7 @@ module.exports.loadResolver = function (name, owner, done) { done(); } }); - }); + }, config); }); }; + From 4991bb5550adede160e4bcd1f8c2d1fd69b32295 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 23 Sep 2014 18:12:04 +0100 Subject: [PATCH 303/597] [beatsmusic] Add basic test case --- beatsmusic/content/contents/code/test.js | 25 ++++++++++++++++++++++++ test/buster.js | 1 + 2 files changed, 26 insertions(+) create mode 100644 beatsmusic/content/contents/code/test.js diff --git a/beatsmusic/content/contents/code/test.js b/beatsmusic/content/contents/code/test.js new file mode 100644 index 000000000..d1f8908ca --- /dev/null +++ b/beatsmusic/content/contents/code/test.js @@ -0,0 +1,25 @@ +var buster = require("buster"); +var nock = require("nock"); +var utils = require("../../../../test/utils.js"); + +buster.testCase("beatsmusic", { + setUp: function (done) { + nock("https://partner.api.beatsmusic.com") + .post("/api/o/oauth2/approval") + .times(2) + .reply(200, JSON.stringify({ + "access_token": "testToken" + })); + utils.loadResolver('beatsmusic', this, done, { + user: "TestUser", + password: "TestPassword" + }); + }, + + "test capabilities": function () { + buster.assert(this.context.hasCapability('urllookup')); + buster.refute(this.context.hasCapability('playlistsync')); + buster.refute(this.context.hasCapability('browsable')); + } +}); + diff --git a/test/buster.js b/test/buster.js index daf96f4ff..631b69af2 100644 --- a/test/buster.js +++ b/test/buster.js @@ -6,6 +6,7 @@ config["resolver tests"] = { sources: [ ], tests: [ + "beatsmusic/content/contents/code/test.js", "soundcloud/content/contents/code/test.js" ] } From ecbc870f8f83f637c87ae0a0e4fac3386edf9c1a Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 23 Sep 2014 18:14:51 +0100 Subject: [PATCH 304/597] [test] Require newer tomahawkjs --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23132d235..29fd65ed6 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,6 @@ "dependencies": { "buster": "^0.7.13", "nock": "^0.32.0", - "tomahawkjs": "^0.3.0" + "tomahawkjs": "^0.3.1" } } From c4492be16036dbda8c8f68dc99327d1fe4a113d3 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 26 Sep 2014 20:42:06 +0100 Subject: [PATCH 305/597] [beatsmusic] Add small helper to resolve one song This is a handy tool to test beats RTMP streaming against latest libav with avplay -loglevel verbose `node beatsmusic/helpers/resolve.js ` --- beatsmusic/helpers/resolve.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 beatsmusic/helpers/resolve.js diff --git a/beatsmusic/helpers/resolve.js b/beatsmusic/helpers/resolve.js new file mode 100644 index 000000000..e2ce9f7c5 --- /dev/null +++ b/beatsmusic/helpers/resolve.js @@ -0,0 +1,29 @@ +// var process = require('process'); +var utils = require("../../test/utils.js"); + +var username = process.argv[2]; +var password = process.argv[3]; +var artist = process.argv[4]; +var track = process.argv[5]; + +var owner = {}; + +// We have the relevant credentials, so get a resolver instance. +utils.loadResolver('beatsmusic', owner, function (err) { + if (err) { + console.log("Error on creating a resolver instance:"); + console.log(err); + process.exit(1); + } + + owner.context.once('track-result', function (qid, result) { + owner.context.getStreamUrl(2, result.url); + }); + owner.context.once('stream-url', function (qid, url) { + console.log(url); + }); + owner.instance.resolve(1, artist, "", track); +}, { + user: username, + password: password +}); From 85d2f1c8e0f9af6d1ce72f611c28ad4c86f278ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=BCbschle-Schneider?= Date: Sun, 28 Sep 2014 17:39:25 +0200 Subject: [PATCH 306/597] [grooveshark] Use Tomahawk-provided diacritic remover if available --- .../content/contents/code/grooveshark.js | 191 +++++++++--------- 1 file changed, 99 insertions(+), 92 deletions(-) diff --git a/grooveshark/content/contents/code/grooveshark.js b/grooveshark/content/contents/code/grooveshark.js index c17b196ff..3ec3ad6ad 100644 --- a/grooveshark/content/contents/code/grooveshark.js +++ b/grooveshark/content/contents/code/grooveshark.js @@ -16,98 +16,105 @@ * along with Tomahawk. If not, see . */ -// for removing diacritics [extracted from : http://lehelk.com/2011/05/06/script-to-remove-diacritics/] -var defaultDiacriticsRemovalMap = [ - {'base':'A', 'letters':/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g}, - {'base':'AA','letters':/[\uA732]/g}, - {'base':'AE','letters':/[\u00C6\u01FC\u01E2]/g}, - {'base':'AO','letters':/[\uA734]/g}, - {'base':'AU','letters':/[\uA736]/g}, - {'base':'AV','letters':/[\uA738\uA73A]/g}, - {'base':'AY','letters':/[\uA73C]/g}, - {'base':'B', 'letters':/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g}, - {'base':'C', 'letters':/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g}, - {'base':'D', 'letters':/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g}, - {'base':'DZ','letters':/[\u01F1\u01C4]/g}, - {'base':'Dz','letters':/[\u01F2\u01C5]/g}, - {'base':'E', 'letters':/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g}, - {'base':'F', 'letters':/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g}, - {'base':'G', 'letters':/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g}, - {'base':'H', 'letters':/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g}, - {'base':'I', 'letters':/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g}, - {'base':'J', 'letters':/[\u004A\u24BF\uFF2A\u0134\u0248]/g}, - {'base':'K', 'letters':/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g}, - {'base':'L', 'letters':/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g}, - {'base':'LJ','letters':/[\u01C7]/g}, - {'base':'Lj','letters':/[\u01C8]/g}, - {'base':'M', 'letters':/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g}, - {'base':'N', 'letters':/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g}, - {'base':'NJ','letters':/[\u01CA]/g}, - {'base':'Nj','letters':/[\u01CB]/g}, - {'base':'O', 'letters':/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g}, - {'base':'OI','letters':/[\u01A2]/g}, - {'base':'OO','letters':/[\uA74E]/g}, - {'base':'OU','letters':/[\u0222]/g}, - {'base':'P', 'letters':/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g}, - {'base':'Q', 'letters':/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g}, - {'base':'R', 'letters':/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g}, - {'base':'S', 'letters':/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g}, - {'base':'T', 'letters':/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g}, - {'base':'TZ','letters':/[\uA728]/g}, - {'base':'U', 'letters':/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g}, - {'base':'V', 'letters':/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g}, - {'base':'VY','letters':/[\uA760]/g}, - {'base':'W', 'letters':/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g}, - {'base':'X', 'letters':/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g}, - {'base':'Y', 'letters':/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g}, - {'base':'Z', 'letters':/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g}, - {'base':'a', 'letters':/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g}, - {'base':'aa','letters':/[\uA733]/g}, - {'base':'ae','letters':/[\u00E6\u01FD\u01E3]/g}, - {'base':'ao','letters':/[\uA735]/g}, - {'base':'au','letters':/[\uA737]/g}, - {'base':'av','letters':/[\uA739\uA73B]/g}, - {'base':'ay','letters':/[\uA73D]/g}, - {'base':'b', 'letters':/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g}, - {'base':'c', 'letters':/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g}, - {'base':'d', 'letters':/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g}, - {'base':'dz','letters':/[\u01F3\u01C6]/g}, - {'base':'e', 'letters':/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g}, - {'base':'f', 'letters':/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g}, - {'base':'g', 'letters':/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g}, - {'base':'h', 'letters':/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g}, - {'base':'hv','letters':/[\u0195]/g}, - {'base':'i', 'letters':/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g}, - {'base':'j', 'letters':/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g}, - {'base':'k', 'letters':/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g}, - {'base':'l', 'letters':/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g}, - {'base':'lj','letters':/[\u01C9]/g}, - {'base':'m', 'letters':/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g}, - {'base':'n', 'letters':/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g}, - {'base':'nj','letters':/[\u01CC]/g}, - {'base':'o', 'letters':/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g}, - {'base':'oi','letters':/[\u01A3]/g}, - {'base':'ou','letters':/[\u0223]/g}, - {'base':'oo','letters':/[\uA74F]/g}, - {'base':'p','letters':/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g}, - {'base':'q','letters':/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g}, - {'base':'r','letters':/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g}, - {'base':'s','letters':/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g}, - {'base':'t','letters':/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g}, - {'base':'tz','letters':/[\uA729]/g}, - {'base':'u','letters':/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g}, - {'base':'v','letters':/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g}, - {'base':'vy','letters':/[\uA761]/g}, - {'base':'w','letters':/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g}, - {'base':'x','letters':/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g}, - {'base':'y','letters':/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g}, - {'base':'z','letters':/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g} -]; -function removeDiacritics (str) { - for(var i=0; i Date: Sun, 28 Sep 2014 16:27:13 +0200 Subject: [PATCH 307/597] Add a vibe3 resolver --- vibe3/content/contents/code/vibe3.js | 144 +++++++++++++++++++++++++ vibe3/content/contents/images/icon.png | Bin 0 -> 20501 bytes vibe3/content/metadata.json | 16 +++ 3 files changed, 160 insertions(+) create mode 100644 vibe3/content/contents/code/vibe3.js create mode 100644 vibe3/content/contents/images/icon.png create mode 100644 vibe3/content/metadata.json diff --git a/vibe3/content/contents/code/vibe3.js b/vibe3/content/contents/code/vibe3.js new file mode 100644 index 000000000..b383361e8 --- /dev/null +++ b/vibe3/content/contents/code/vibe3.js @@ -0,0 +1,144 @@ +/* + * Copyright 2014, Lorenz Hübschle-Schneider + * + * The MIT License (MIT) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +// DOMParser polyfill, slightly modified version of +// https://gist.github.com/eligrey/1129031 (public domain) +(function(DOMParser) { + "use strict"; + var DOMParser_proto = DOMParser.prototype, + real_parseFromString = DOMParser_proto.parseFromString; + + // Firefox/Opera/IE throw errors on unsupported types + try { + // WebKit returns null on unsupported types + if ((new DOMParser()).parseFromString("", "text/html")) { + // text/html parsing is natively supported + return; + } + } catch (ex) {} + + DOMParser_proto.parseFromString = function(markup, type) { + if (/^\s*text\/html\s*(?:;|$)/i.test(type)) { + var doc = document.implementation.createHTMLDocument(""), + doc_elt = doc.documentElement, + first_elt; + + doc_elt.innerHTML = markup; + first_elt = doc_elt.firstElementChild; + + if (doc_elt.childElementCount === 1 && + first_elt.localName.toLowerCase() === "html") { + doc.replaceChild(first_elt, doc_elt); + } + + return doc; + } else { + return real_parseFromString.apply(this, arguments); + } + }; +}(DOMParser)); + + +var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { + settings: { + name: 'vibe3', + icon: '../images/icon.png', + weight: 80, + timeout: 5 + }, + init: function () { + // Add URL handler for vibe3:// urls + // We need this for adding the "Referer" header to the mp3 URL + Tomahawk.addCustomUrlHandler("vibe3", "getStreamUrl", true); + }, + resolve: function (qid, artist, album, title) { + // build query + var query = [title, artist].join(" ").trim(), + url = "http://vibe3.com/searchProxy.php", + that = this; + + // Vibe3 has issues with diacritics, remove them + query = Tomahawk.removeDiacritics(query); + + // Send request + Tomahawk.asyncRequest(url, function (xhr) { + // parse xml + var domParser = new DOMParser(), + xmlDoc = domParser.parseFromString(xhr.responseText, "text/html"), + tracks = xmlDoc.getElementsByTagName("li"), + track, rawUrl, mp3url, artist, track_title, i, + results = []; + + // check the response + for (i = 0; i < tracks.length; i++) { + track = tracks[i]; + // Need to access the URL via the download button instead of the player because the player + // has 'display:none" and thus isn't available easily from the DOMParser + rawUrl = track.getElementsByClassName('downloadButton')[0].getAttribute('onclick'); + // Return a vibe3:// URL instead of http so we can add the referer + mp3url = rawUrl.replace(/.*'http:\/\//,'vibe3://').replace("?dl=1'",''); + artist = track.getElementsByTagName('a')[0].textContent.trim(); + track_title = track.getElementsByClassName('songName')[0].textContent; + // Trim away the artist-title-separator and extra spaces + track_title = track_title.replace(' - ', '').trim(); + + results.push({ + artist: artist, + track: track_title, + source: that.settings.name, + url: mp3url, + extension: 'mp3', + bitrate: 128, + score: 0.80 + }); + } + + Tomahawk.addTrackResults({ + qid: qid, + results: results + }); + }, { + "Content-Type": "application/x-www-form-urlencoded" + }, { + method: "POST", + data: "search=" + query + }); + }, + getStreamUrl: function (qid, url) { + // Add a referer header. This is required or vibe3's hotlink protection + // will prevent us from retrieving the file + url = url.replace("vibe3://", "http://"); + var headers = { + "Referer": "http://vibe3.com" + } + Tomahawk.reportStreamUrl(qid, url, headers); + }, + search: function (qid, searchString) { + return { + qid: qid, + results: [] + }; + } +}); + +Tomahawk.resolver.instance = Vibe3Resolver; diff --git a/vibe3/content/contents/images/icon.png b/vibe3/content/contents/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eb92b111af21a25f5e6639b026e54bd645ed32ee GIT binary patch literal 20501 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 literal 0 HcmV?d00001 diff --git a/vibe3/content/metadata.json b/vibe3/content/metadata.json new file mode 100644 index 000000000..f72d8df55 --- /dev/null +++ b/vibe3/content/metadata.json @@ -0,0 +1,16 @@ +{ + "name": "vibe3", + "pluginName": "vibe3", + "author": "Lorenz Hübschle-Schneider", + "email": "lorenz@4z2.de", + "version": "0.1.0", + "website": "http://gettomahawk.com", + "description": "Looks for tracks to play from www.vibe3.com.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/vibe3.js", + "scripts": [], + "icon": "contents/images/icon.png", + "resources": [] + } +} From 1bcd606722c90e687d00d3fd75c2f3fb0524d51a Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 28 Sep 2014 20:38:45 +0100 Subject: [PATCH 308/597] [beatsmusic] Add license --- beatsmusic/helpers/resolve.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/beatsmusic/helpers/resolve.js b/beatsmusic/helpers/resolve.js index e2ce9f7c5..c8f374d48 100644 --- a/beatsmusic/helpers/resolve.js +++ b/beatsmusic/helpers/resolve.js @@ -1,4 +1,26 @@ -// var process = require('process'); +/* + * Copyright 2014, Uwe L. Korn + * + * The MIT License (MIT) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + var utils = require("../../test/utils.js"); var username = process.argv[2]; From aa459addb5ac0828a04f92a5063fbc69bd2a59c6 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 28 Sep 2014 20:40:22 +0100 Subject: [PATCH 309/597] [beatsmusic] Better license indication --- .../content/contents/code/beatsmusic.js | 11 ++++++++- beatsmusic/content/contents/code/test.js | 23 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index c6ca6c81c..9da1ff07a 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -1,5 +1,7 @@ /* - * Copyright 2014, Uwe L. Korn + * Copyright 2014, Uwe L. Korn + * + * The MIT License (MIT) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -10,6 +12,13 @@ * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { diff --git a/beatsmusic/content/contents/code/test.js b/beatsmusic/content/contents/code/test.js index d1f8908ca..cfd4bd272 100644 --- a/beatsmusic/content/contents/code/test.js +++ b/beatsmusic/content/contents/code/test.js @@ -1,3 +1,26 @@ +/* + * Copyright 2014, Uwe L. Korn + * + * The MIT License (MIT) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + var buster = require("buster"); var nock = require("nock"); var utils = require("../../../../test/utils.js"); From 058e2ecf203e5ca683c5dda8e8fc147262c5eb96 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 28 Sep 2014 20:51:10 +0100 Subject: [PATCH 310/597] Require tomahawkjs 0.3.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 29fd65ed6..bf27406f3 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,6 @@ "dependencies": { "buster": "^0.7.13", "nock": "^0.32.0", - "tomahawkjs": "^0.3.1" + "tomahawkjs": "^0.3.2" } } From d75a82af68d8e2f6ae3aaadf25a75b32a435188a Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Mon, 6 Oct 2014 23:23:14 +0200 Subject: [PATCH 311/597] Don't throw errors if API is down. --- bandcamp/content/contents/code/bandcamp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bandcamp/content/contents/code/bandcamp.js b/bandcamp/content/contents/code/bandcamp.js index 84f2216c2..6cdd8fbf1 100644 --- a/bandcamp/content/contents/code/bandcamp.js +++ b/bandcamp/content/contents/code/bandcamp.js @@ -42,7 +42,7 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { var that = this; Tomahawk.asyncRequest(findArtistUrl, function (xhr) { var response = JSON.parse(xhr.responseText); - if (response.results.length !== 0) { + if (response.results !== undefined && response.results.length !== 0) { var bandcampArtistId = response.results[0].band_id; var artistDiscographyUrl = "http://api.bandcamp.com/api/band/3/discography?key=" + that.secret + "&band_id=" + bandcampArtistId; Tomahawk.asyncRequest(artistDiscographyUrl, function (xhr1) { From 0088b2abd311d831564e05abd33aefe23516f418 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Tue, 7 Oct 2014 01:02:00 +0200 Subject: [PATCH 312/597] First working version of YouTube's API V3 version of the resolver. --- youtube/content/contents/code/youtube.js | 1520 +++++++++++----------- 1 file changed, 795 insertions(+), 725 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index 343e16031..736db00a7 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -1,6 +1,6 @@ /* * Copyright (C) 2012 Hugo Lindström - * Copyright (C) 2013 Thierry Göckel + * Copyright (C) 2011-2014 Thierry Göckel * Copyright (C) 2012 Leo Franchi * * This program is free software: you can redistribute it and/or modify @@ -19,728 +19,798 @@ * NOTICE: This resolver and its intent, is for demonstrational purposes only **/ -var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { - - getConfigUi: function () - { - var uiData = Tomahawk.readBase64("config.ui"); - return { - "widget": uiData, - fields: [{ - name: "includeCovers", - widget: "covers", - property: "checked" - }, { - name: "includeRemixes", - widget: "remixes", - property: "checked" - }, { - name: "includeLive", - widget: "live", - property: "checked" - }, { - name: "qualityPreference", - widget: "qualityDropdown", - property: "currentIndex" - }, { - name: "debugMode", - widget: "debug", - property: "checked" - }], - images: [{ - "youtube.png" : Tomahawk.readBase64("youtube.png") - }] - }; - }, - - newConfigSaved: function () - { - var userConfig = this.getUserConfig(); - if ((userConfig.includeCovers !== this.includeCovers) || (userConfig.includeRemixes !== this.includeRemixes) || - (userConfig.includeLive !== this.includeLive) || (userConfig.qualityPreference !== this.qualityPreference)) { - - this.includeCovers = userConfig.includeCovers; - this.includeRemixes = userConfig.includeRemixes; - this.includeLive = userConfig.includeLive; - this.qualityPreference = userConfig.qualityPreference; - this.debugMode = userConfig.debugMode; - this.saveUserConfig(); - } - }, - - settings: - { - name: 'YouTube', - icon: 'youtube-icon.png', - weight: 70, - timeout: 15 - }, - - // Wrap Tomahawk.addTrackResults to intercept the call from Hatchet - addTrackResults: function(qid, results) { - Tomahawk.addTrackResults(qid, results); - }, - getTrack: function (trackTitle, origTitle, isSearch) { - if ((this.includeCovers === false || this.includeCovers === undefined) && trackTitle.search(/(\Wcover(?!(\w)))/i) !== -1 && origTitle.search(/(\Wcover(?!(\w)))/i) === -1) { - return null; - } - // Allow remix:es in search results? - if (isSearch === undefined) { - if ((this.includeRemixes === false || this.includeRemixes === undefined) && trackTitle.search(/(\W(re)*?mix(?!(\w)))/i) !== -1 && origTitle.search(/(\W(re)*?mix(?!(\w)))/i) === -1) { - return null; - } - } - if ((this.includeLive === false || this.includeLive === undefined) && trackTitle.search(/(live(?!(\w)))/i) !== -1 && origTitle.search(/(live(?!(\w)))/i) === -1) { - return null; - } - else { - return trackTitle; - } - }, - - getBitrate: function (urlString) - { - //http://www.h3xed.com/web-and-internet/youtube-audio-quality-bitrate-240p-360p-480p-720p-1080p - // No need to get higher than hd720, as it only will eat bandwith and do nothing for sound quality - if (urlString.indexOf("quality=hd720") !== -1) { - return 192; - } - else if (urlString.indexOf("quality=medium") !== -1) { - return 128; - } - else if (urlString.indexOf("quality=small") !== -1) { - return 96; - } - // Probably - return 128; - }, - - init: function() - { - // Set userConfig here - var userConfig = this.getUserConfig(); - if (userConfig !== undefined && userConfig.qualityPreference !== undefined) { - this.includeCovers = userConfig.includeCovers; - this.includeRemixes = userConfig.includeRemixes; - this.includeLive = userConfig.includeLive; - this.qualityPreference = userConfig.qualityPreference; - this.debugMode = userConfig.debugMode; - } - else { - this.includeCovers = false; - this.includeRemixes = false; - this.includeLive = false; - this.qualityPreference = 1; - this.debugMode = 1; - } - - // Protos - String.prototype.capitalize = function() { - return this.replace(/(^|\s)([a-z])/g , function(m,p1,p2) { return p1+p2.toUpperCase(); }); - }; - String.prototype.regexIndexOf = function(regex, startpos) { - var indexOf = this.substring(startpos || 0).search(regex); - return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf; - }; - String.prototype.splice = function(idx, rem, s) { - return (this.slice(0,idx) + s + this.slice(idx + Math.abs(rem))); - }; - }, - - hasPreferredQuality: function(urlString) - { - if (this.qualityPreference === undefined) { - this.debugMsg("ASSERT: quality undefined!"); - return true; - } - - if (urlString.indexOf("quality="+this.getPreferredQuality()) !== -1){ - return true; - } - return false; - }, - - getPreferredQuality: function() - { - if (this.qualityPreference === undefined) { - this.qualityPreference = 0; - } - - switch (this.qualityPreference) { - case 0: - return "hd720"; - break; - case 1: - return "medium"; - break; - case 2: - return "small"; - break; - default: - return "hd720"; - } - // To make Lint happy - return "hd720"; - }, - - debugMsg: function(msg) - { - if (msg.toLowerCase().indexOf("assert") === 0){ - console.log(this.settings.name + msg); - } - else if (this.debugMode){ - Tomahawk.log(this.settings.name + " debug: " + msg); - } - }, - - parseURLS: function(rawUrls) - { - var parsedUrls = new Array(); - var urls = decodeURIComponent(decodeURIComponent(rawUrls)); - // Youtube changes the start delimiter randomly - var matches = urls.match(/^((.+?)(=))/); - if (matches) { - // split the decoded urls by matches[0] delimiter, separated by comma - var urlArray = urls.split(RegExp(","+matches[0], "i")); - for (var i = 0; i < urlArray.length; i++) { - var url; - if (matches[0] != "url=") { - // Delimiter isnt url=, we need to sort the params - url = (urlArray[i] != urlArray[0]) ? matches[0]+urlArray[i] : urlArray[i]; - var urlMatch = url.match(/(.+?)(url=)(.+?)(\?)(.+)/); - // Base & Params - url = urlMatch[3]+urlMatch[4] + "&" + urlMatch[1]+urlMatch[5]; - } - else { - // Just replace url= - url = urlArray[i].replace(/^url=/, ""); - } - - // itag is found twice, we need to remove that (last occurence) - var itagMatch = url.match(/(.*)(itag=\d+&)(.*?)/); - url = url.replace(/(.*)(itag=\d+&)(.*?)/, itagMatch[1]+itagMatch[3]); - - // Sig needs to be sigature - url = url.replace(/sig=/, "signature="); - var type; - try { - // Parse out the type and codec, encode it - // May have an quality effect - type = url.match(/(&type=)(.+?)(&)/i); - url = url.replace(/(&type=)(.+?)(&)/, type[1]+encodeURIComponent(type[2])+type[3]); - } - catch (e) { - try { - // Type is on the end of the url - type = url.match(/(&type=)(.*?)/i); - type = type[1]+encodeURIComponent(type[1])+type[2]; - url = url.replace(/(&type=)(.*)/, type); - } - catch (e) { - this.debugMsg("Critical: Cannot parse out type in url" + e + "\nUrl: "+ url); - } - } - - if (url.regexIndexOf(/quality=(hd720|high|medium|small)/i, 0) !== -1) { - parsedUrls.push(url); - } - } - - var finalUrl; - - if (this.qualityPreference === undefined) { - // This shouldnt happen really, but sometimes do?! - this.qualityPreference = 0; - this.debugMsg("Critical: Failed to set qualitypreference in init, resetting to " + this.qualityPreference); - } - - for (i = 0; i < parsedUrls.length; i++) { - if (this.hasPreferredQuality(parsedUrls[i])) { - finalUrl = parsedUrls[i]; - } - } - - if (finalUrl === undefined) { - finalUrl = parsedUrls[0]; - } - - if (finalUrl && finalUrl !== undefined) { - return finalUrl; - } - } - return null; - }, - - parseVideoUrlFromYtPage: function(html) - { - // First, lets try and find the stream_map at top of the page - // to save some time going to the end and do JSON.parse on the yt.config - var streamMatch = html.match(/(url_encoded_fmt_stream_map=)(.*?)(?=(\\u0026amp))/i); - if (streamMatch && streamMatch[2] !== undefined) { - var parsed = this.parseURLS(streamMatch[2]); - if (parsed) { - return parsed; - } - else { - this.debug("Hm, failed to parse urls from top of the page"); - } - } - - // Now we can go further down, and check the ytplayer.config map - streamMatch = html.match(/(ytplayer\.config =)([^\r\n]+?\});/); - - if (!streamMatch) { - // Todo: Open window for user input? - var dasCaptcha = html.match(/www.google.com\/recaptcha\/api\/challenge?/i); - if (dasCaptcha) { - this.debugMsg("Failed to parse url from youtube page. Captcha limitation in place."); - } - else { - this.debugMsg("Failed to find stream_map in youtube page."); - } - return null; - } - - if (streamMatch && streamMatch[2] !== undefined) { - try { - var jsonMap = JSON.parse(streamMatch[2]); - if (jsonMap.args.url_encoded_fmt_stream_map !== undefined) { - parsed = this.parseURLS(jsonMap.args.url_encoded_fmt_stream_map); - if (parsed){ - return parsed; - } - } - } - catch (e) { - this.debugMsg("Critical: " + e); - } - } - return null; - }, - - magicCleanup: function(toClean) - { - return toClean.replace(/[^A-Za-z0-9 ]|(feat|ft.|featuring|prod|produced|produced by)/g, "").replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ').toLowerCase(); - }, - - resolve: function(qid, artist, album, title) - { - if (artist !== "") { - query = encodeURIComponent(artist) + "%20"; - } - if (title !== "") { - query += encodeURIComponent(title); - } - var limit = 10; - var apiQuery = "http://gdata.youtube.com/feeds/api/videos?q=" + query + "&v=2&alt=jsonc&safeSearch=none&max-results=" + limit; - apiQuery = apiQuery.replace(/\%20/g, '\+'); - var that = this; - var empty = { - results: [], - qid: qid - }; - Tomahawk.asyncRequest(apiQuery, function(xhr) { - var results = []; - var resp = JSON.parse(xhr.responseText); - if (resp.data.totalItems !== 0 && resp.data.items !== undefined) { - var stop = Math.min(limit, resp.data.totalItems); - for (i = 0; i < Math.min(limit, resp.data.totalItems); i++) { - if (resp.data.items[i] === undefined) { - stop = stop - 1; - continue; - } - var responseItem = resp.data.items[i]; - if (responseItem.duration === undefined) { - stop = stop - 1; - continue; - } - // ContentRating, eg. User needs to verify age or similar that requires login - if (responseItem.contentRating !== undefined) { - stop = stop - 1; - continue; - } - var responseTitle = responseItem.title.toLowerCase(); - // Check whether the artist and title (if set) are in the returned title, discard otherwise - if (responseTitle !== undefined && responseTitle.indexOf(artist.toLowerCase()) === -1 || - (title !== "" && responseTitle.toLowerCase().indexOf(title.toLowerCase()) === -1)) { - // Lets do a deeper check - // Users tend to insert [ft. Artist] or **featuring Artist & someOther artist - // Remove these - var newTitle = that.magicCleanup(title); - var newArtist = that.magicCleanup(artist); - var newRespTitle = that.magicCleanup(responseTitle); - - if (newRespTitle !== undefined && newRespTitle.indexOf(newArtist) === -1 || - (newTitle !== "" && newRespTitle.indexOf(newTitle) === -1)) { - // Lets do it in reverse! - if (newArtist.indexOf(newTitle) === -1 && newTitle.indexOf(newArtist) === -1) { - stop = stop - 1; - continue; - } - } - } - - if (that.getTrack(responseTitle, title)) { - var result = new Object(); - if (artist !== "") { - result.artist = artist; - } - - result.source = that.settings.name; - result.mimetype = "video/h264"; - result.duration = responseItem.duration; - result.score = 0.85; - result.year = responseItem.uploaded.slice(0,4); - result.track = title; - result.linkUrl = responseItem.player['default']; - if (that.qualityPreference === 0) { - result.linkUrl += "&hd=1"; - } - - (function(i, qid, result) { - Tomahawk.asyncRequest(responseItem.player['default'], function(xhr2) { - result.url = that.parseVideoUrlFromYtPage(xhr2.responseText, result); - if (result.url && result.url !== undefined) { - // Get the expiration time, to be able to cache results in tomahawk - var expires = result.url.match(/expire=([0-9]+)(?=(&))/); - if (expires && expires[1] !== undefined) { - result.expires = Math.floor(expires[1]); - } - result.bitrate = that.getBitrate(result.url); - result.id = i; - results.push(result); - stop = stop - 1; - if (stop === 0) { - var best = i + 1; - for (var j = 0; j < results.length; j++) { - if (results[j].id < best || that.hasPreferredQuality(results[j].url)) { - best = results[j].id; - var finalResult = results[j]; - } - } - delete finalResult.id; - var resolveReturn = { - results: [finalResult], - qid: qid - }; - that.addTrackResults(resolveReturn); - } - } - else { - stop = stop - 1; - } - }); - })(i, qid, result); - } - else { - stop = stop - 1; - } - } - if (stop === 0) { // if no results had appropriate titles, return empty - that.addTrackResults(empty); - } - } - else { - that.addTrackResults(empty); - } - }); - }, - - cleanupAndParseTrack: function(title, searchString) - { - var result = {}; - // For the ease of parsing, remove these - // Maybe we could up the score a bit? - if (title.regexIndexOf(/(?:[([](?=(official))).*?(?:[)\]])|(?:(official|video)).*?(?:(video))/i, 0) !== -1) - { - title = title.replace(/(?:[([](?=(official|video))).*?(?:[)\]])/gi, ""); - title = title.replace(/(official|video(?:([!:-])))/gi, ""); - result.isOfficial = 1; - } - result.query = title; - // Sometimes users separate titles with quotes : - // eg, "\"Young Forever\" Jay Z | Mr. Hudson (OFFICIAL VIDEO)" - // this will parse out the that title - var inQuote = title.match(/([""'])(?:(?=(\\?))\2.).*\1/g); - if (inQuote && inQuote !== undefined) { - result.track = inQuote[0].substr(1, inQuote[0].length-2); - title = title.replace(inQuote[0],''); - result.fromQuote = result.track; - result.parsed = this.parseCleanTrack(title); - if (result.parsed) { - result.parsed.track = result.track; - return result.parsed; - } - } - else { - result.parsed = this.parseCleanTrack(title); - if (result.parsed){ - return result.parsed; - } - } - - // Still no luck, lets go deeper - if (!result.parsed) { - if (title.toLowerCase().indexOf(searchString.toLowerCase()) !== -1) { - result.parsed = this.parseCleanTrack(title.replace(RegExp(searchString, "gi"), searchString.concat(" :"))); - } - else - { - var tryMatch = searchString.replace(/(?:[-|:&])/g, " "); - if (title.toLowerCase().indexOf(tryMatch.toLowerCase()) !== -1) { - var replaceWith; - if (title.regexIndexOf(/(?:[-|:&])/g, 0) !== -1){ - replaceWith = searchString; - } - else { - replaceWith = searchString.concat(" : "); - } - result.parsed = this.parseCleanTrack(title.replace(RegExp(tryMatch, "gi"), replaceWith)); - } - } - } - - if (result.fromQuote && result.fromQuote !== undefined) { - if (result.parsed){ - result.artist = result.parsed.artist; - } - result.track = result.fromQuote; - } - else if (result.parsed) { - if (result.parsed.artist !== undefined && result.parsed.artist.trim() !== "") { - result.artist = result.parsed.artist; - } - if (result.parsed.track !== undefined && result.parsed.track.trim() !== "") { - result.track = result.parsed.track; - } - } - delete result.parsed; - return result; - }, - - parseCleanTrack: function(track) - { - var result = {}; - result.query = track; - that = this; - result.query.replace(/.*?(?=([-:|]\s))/g, function (param) { - if (param.trim() !== "") { - if (result.artist === undefined) { - result.artist = param; - } - else { - if (result.track === undefined){ - result.track = param; - } - } - } - }); - - result.query.replace(/(?=([-:|]\s)).*/g, function (param) { - if (param.trim() !== "") { - if (param.regexIndexOf(/([-|:]\s)/g, 0) === 0) { - if (result.track === undefined){ - result.track = param.replace(/([-|:]\s)/g, ""); - } - } - else { - if (result.artist === undefined){ - result.artist = param; - } - result.track = result.replace(/([-|:]\s)/g, ""); - } - } - }); - - if (result.track !== undefined && result.artist !== undefined) { - // Now, lets move featuring to track title, where it belongs - var ftmatch = result.artist.match(/(?:(\s)(?=(feat.|feat|ft.|ft|featuring)(?=(\s)))).*/gi); - if (ftmatch) { - result.artist = result.artist.replace(ftmatch, ""); - result.track += " " + ftmatch; - } - // Trim - result.track = result.track.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' '); - result.artist = result.artist.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' '); - return result; - } - return null; - }, - - // Allows async requests being made with userdata - asyncRequest: function (url, userdata, callback) - { - Tomahawk.asyncRequest(url, function (xhr) { - callback.call(window, xhr, userdata); +var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { + + settings: { + name: 'YouTube', + icon: 'youtube-icon.png', + weight: 70, + timeout: 15 + }, + + hatchet: false, + + resolveMode: false, + + init: function() + { + // Set userConfig here + var userConfig = this.getUserConfig(); + if ( Object.getOwnPropertyNames( userConfig ).length > 0 ) + { + this.includeCovers = userConfig.includeCovers; + this.includeRemixes = userConfig.includeRemixes; + this.includeLive = userConfig.includeLive; + this.qualityPreference = userConfig.qualityPreference; + this.debugMode = userConfig.debugMode; + } + else + { + this.includeCovers = false; + this.includeRemixes = false; + this.includeLive = false; + this.qualityPreference = 1; + this.debugMode = 1; + } + + // Protos + String.prototype.capitalize = function() { + return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2) { return p1+p2.toUpperCase(); } ); + }; + String.prototype.regexIndexOf = function( regex, startpos ) { + var indexOf = this.substring( startpos || 0 ).search( regex ); + return ( indexOf >= 0 ) ? ( indexOf + ( startpos || 0 ) ) : indexOf; + }; + String.prototype.splice = function( idx, rem, s ) { + return ( this.slice( 0, idx ) + s + this.slice( idx + Math.abs( rem ) ) ); + }; + }, + + getConfigUi: function() + { + var uiData = Tomahawk.readBase64( "config.ui" ); + return { + "widget": uiData, + fields: [{ + name: "includeCovers", + widget: "covers", + property: "checked" + }, { + name: "includeRemixes", + widget: "remixes", + property: "checked" + }, { + name: "includeLive", + widget: "live", + property: "checked" + }, { + name: "qualityPreference", + widget: "qualityDropdown", + property: "currentIndex" + }, { + name: "debugMode", + widget: "debug", + property: "checked" + }], + images: [{ + "youtube.png" : Tomahawk.readBase64("youtube.png") + }] + }; + }, + + newConfigSaved: function () + { + var userConfig = this.getUserConfig(); + if ((userConfig.includeCovers !== this.includeCovers) || (userConfig.includeRemixes !== this.includeRemixes) || + (userConfig.includeLive !== this.includeLive) || (userConfig.qualityPreference !== this.qualityPreference)) + { + this.includeCovers = userConfig.includeCovers; + this.includeRemixes = userConfig.includeRemixes; + this.includeLive = userConfig.includeLive; + this.qualityPreference = userConfig.qualityPreference; + this.debugMode = userConfig.debugMode; + this.saveUserConfig(); + } + }, + + sendEmptyResult: function( qid, searchString ) + { + Tomahawk.log( "No results for " + searchString ); + var empty = { + results: [], + qid: qid + }; + Tomahawk.addTrackResults( empty ); + }, + + // Allows async requests being made with userdata + asyncRequest: function ( url, userdata, callback ) + { + Tomahawk.asyncRequest( url, function ( xhr ) { + callback.call( window, xhr, userdata ); + } ); + }, + + debugMsg: function( msg ) + { + if ( msg.toLowerCase().indexOf( "assert" ) === 0 ) + { + Tomahawk.log( this.settings.name + msg ); + } + else if ( this.debugMode ) + { + Tomahawk.log( this.settings.name + " debug: " + msg ); + } + }, + + iso8601toSeconds: function( iso8601 ) + { + var matches = iso8601.match( /[0-9]+[HMS]/g ); + var seconds = 0; + matches.forEach( function ( part ) { + var unit = part.charAt( part.length - 1 ); + var amount = parseInt( part.slice( 0, -1 ), 10 ); + switch ( unit ) { + case 'H': + seconds += amount * 60 *60; + break; + case 'M': + seconds += amount * 60; + break; + case 'S': + seconds += amount; + break; + default: + Tomahawk.log( "Erroneous ISO8601 format: " + iso8601 ); + break; + } }); - }, - - sendEmptyResult: function(qid, searchString) - { - Tomahawk.log("No results for " + searchString); - var empty = { - results: [], - qid: qid - }; - this.addTrackResults(empty); - }, - - handleItemResponse: function(qid, searchString, data) - { - var results = new Array(); - var artists = new Object(); - // r - //var artistLookupUrl = "http://developer.echonest.com/api/v4/artist/search?api_key=FILDTEOIK2HBORODV&format=json&results=1&name="; - var artistLookupUrl = "http://ws.audioscrobbler.com/2.0/?method=artist.search&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=1&artist="; - var that = this; - var count = 0; - for (i = 0; i < Math.min(data.totalItems, 50); i++) { - if (data.items[i] === undefined) { - continue; - } - - if (data.items[i].duration === undefined) { - continue; - } - - // Check whether the artist and title (if set) are in the returned title, discard otherwise - if (data.items[i].title === undefined) { - continue; - } - - // ContentRating, eg. User needs to verify age or similar that requires login - // May also indicate country restrictions - // @todo: Check user geo? may be found in result url, &gcr=COUNTRY_SHORT_CODE - // Value to be catched is then contentRating.GEOCODE - // If contentRating is just 1, login is required - if (data.items[i].contentRating !== undefined) { - continue; - } - - // Dirty check, filters out the most of the unwanted results - var searchFoundItem = data.items[i].title.replace(/([^A-Za-z0-9\s])/gi, "").replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,'|'); - var searchStringItem = searchString.replace(/([^A-Za-z0-9\s])/gi, "").replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,'|'); - var matches = searchFoundItem.match(RegExp(searchStringItem, "gi")); - if (!matches) { - continue; - } - - if (matches.length !== searchStringItem.split("|").length) { - this.debugMsg("Skipping: " + data.items[i].title + " Matches: " + matches.length); - this.debugMsg("Searched: " + searchString + " Matches: " + searchStringItem.split("|").length); - continue; - } - - var track = data.items[i].title; - var parsedTrack = this.cleanupAndParseTrack(track, searchString); - - if (!parsedTrack || parsedTrack.artist === undefined || parsedTrack.track === undefined) { - this.debugMsg("Failed to get a possitive match for : " + track); - continue; - } - if (this.getTrack(track, searchString, true)) { - var result = new Object(); - result.source = this.settings.name; - result.mimetype = "video/h264"; - result.duration = data.items[i].duration; - result.score = (parsedTrack.isOfficial !== undefined ? 0.85 : 0.95); - result.year = data.items[i].uploaded.slice(0,4); - result.url = data.items[i].player['default']; - result.query = searchString; - result.artist = parsedTrack.artist; - result.track = parsedTrack.track; - result.linkUrl = data.items[i].player['default']; - if (that.qualityPreference === 0) { - result.linkUrl += "&hd=1"; - } - results.push(result); - - // Lets just do one artist lookup query, instead of on all of them - var artist = result.artist.toLowerCase(); - if (artists[artist]){ - artists[artist].push(count); - } - else { - artists[artist] = [count]; - } - - result.id = count; - count++; - } - } - - if (count === 0) - { - this.debugMsg("Search results where empty for " + searchString); - this.sendEmptyResult(qid, searchString); - return; - } - - var finalResults = []; - for (var artistKey in artists) { - this.asyncRequest(artistLookupUrl+artistKey, artists[artistKey], function(xhr, ids) { - var response = JSON.parse(xhr.responseText); - if (response.results !== undefined && response.results.artistmatches.artist !== undefined) { - var artist = response.results.artistmatches.artist.name; - for (var i = 0; i < ids.length; i++) { - that.asyncRequest(results[ids[i]].url, {id: ids[i], artist: artist, results: results}, function(xhr, userdata) { - var url = that.parseVideoUrlFromYtPage(xhr.responseText); - if (url) { - userdata.results[userdata.id].url = url; - userdata.results[userdata.id].bitrate = that.getBitrate(url); - userdata.results[userdata.id].artist = userdata.artist; - var expires = url.match(/expire=([0-9]+)(?=(&))/); - if (expires && expires[1] !== undefined) { - userdata.results[userdata.id].expires = Math.floor(expires[1]); - } - that.debugMsg("Added " + count + " " + userdata.results[userdata.id].url + "\n"); - finalResults.push(userdata.results[userdata.id]); - if (count-1 === 0) { - var return1 = { - results: finalResults, - qid: qid - }; - that.addTrackResults(return1); - return; - } - } - else { - that.debugMsg("Failed on " + userdata.results[userdata.id].url + " count : " + count); - } - count--; - }); - } - } - else { - if( response.results !== undefined ){ - that.debugMsg("Bad name?" + JSON.stringify(response.results["opensearch:Query"], 4, null)); - } - else { - that.debugMsg("Bad result from artist lookup?"); - } - count = count-ids.length; - } - }); - } - }, - - search: function(qid, searchString) - { - var limit = 50; - var apiQuery = "http://gdata.youtube.com/feeds/api/videos?q=" + encodeURIComponent(searchString) + "&v=2&alt=jsonc&quality="+this.getPreferredQuality()+"&max-results=" +limit+"&category=Music"; - apiQuery = apiQuery.replace(/\%20/g, '\+'); - var that = this; - this.debugMsg("Searching for " + searchString); - Tomahawk.asyncRequest(apiQuery, function(xhr) { - var resp = JSON.parse(xhr.responseText); - if (resp.data.totalItems !== 0) { - that.handleItemResponse(qid, searchString, resp.data); - } - else { - that.sendEmptyResult(qid, searchString); - } - }); - } -}); - -Tomahawk.resolver.instance = YoutubeResolver; + return seconds; + }, + + magicCleanup: function( toClean ) + { + return toClean.replace( /[^A-Za-z0-9 ]|(feat|ft.|featuring|prod|produced|produced by)/g, "" ).replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,' ' ).toLowerCase(); + }, + + getMostRelevant: function( results ) + { + var best = results.length; + var finalResult = results[0]; + for ( var j = 0; j < results.length; j++ ) + { + if ( results[j].id < best || ( results[j].url && this.hasPreferredQuality( results[j].url ) ) ) + { + best = results[j].id; + finalResult = results[j]; + } + } + delete finalResult.id; + return finalResult; + }, + + hasPreferredQuality: function( urlString ) + { + if ( this.qualityPreference === undefined ) + { + this.debugMsg( "ASSERT: quality undefined!" ); + return true; + } + + if ( urlString.indexOf("quality=" + this.getPreferredQuality() ) !== -1 ) + { + return true; + } + return false; + }, + + getPreferredQuality: function() + { + if ( this.qualityPreference === undefined ) + { + this.qualityPreference = 0; + } + + switch ( this.qualityPreference ) + { + case 0: + return "hd720"; + break; + case 1: + return "medium"; + break; + case 2: + return "small"; + break; + default: + return "hd720"; + } + // To make Lint happy + return "hd720"; + }, + + getBitrate: function ( urlString ) + { + //http://www.h3xed.com/web-and-internet/youtube-audio-quality-bitrate-240p-360p-480p-720p-1080p + // No need to get higher than hd720, as it only will eat bandwith and do nothing for sound quality + if ( urlString.indexOf( "quality=hd720" ) !== -1 ) + { + return 192; + } + else if ( urlString.indexOf( "quality=medium" ) !== -1 ) + { + return 128; + } + else if ( urlString.indexOf( "quality=small" ) !== -1 ) + { + return 96; + } + // Probably + return 128; + }, + + getTrack: function ( trackTitle, origTitle, isSearch ) + { + if ( ( this.includeCovers === false || this.includeCovers === undefined ) && trackTitle.search( /(\Wcover(?!(\w)))/i ) !== -1 && origTitle.search( /(\Wcover(?!(\w)))/i ) === -1 ) + { + return null; + } + // Allow remix:es in search results? + if ( isSearch === undefined ) + { + if ( ( this.includeRemixes === false || this.includeRemixes === undefined ) && trackTitle.search( /(\W(re)*?mix(?!(\w)))/i ) !== -1 && origTitle.search( /(\W(re)*?mix(?!(\w)))/i ) === -1 ) + { + return null; + } + } + if ( ( this.includeLive === false || this.includeLive === undefined ) && trackTitle.search( /(live(?!(\w)))/i ) !== -1 && origTitle.search( /(live(?!(\w)))/i ) === -1 ) + { + return null; + } + else + { + return trackTitle; + } + }, + + cleanupAndParseTrack: function( title, searchString ) + { + var result = {}; + // For the ease of parsing, remove these + // Maybe we could up the score a bit? + if ( title.regexIndexOf( /(?:[([](?=(official))).*?(?:[)\]])|(?:(official|video)).*?(?:(video))/i, 0 ) !== -1 ) + { + title = title.replace( /(?:[([](?=(official|video))).*?(?:[)\]])/gi, "" ); + title = title.replace( /(official|video(?:([!:-])))/gi, "" ); + result.isOfficial = 1; + } + result.query = title; + // Sometimes users separate titles with quotes : + // eg, "\"Young Forever\" Jay Z | Mr. Hudson (OFFICIAL VIDEO)" + // this will parse out the that title + var inQuote = title.match( /([""'])(?:(?=(\\?))\2.).*\1/g ); + if ( inQuote && inQuote !== undefined ) + { + result.track = inQuote[0].substr( 1, inQuote[0].length - 2 ); + title = title.replace( inQuote[0], '' ); + result.fromQuote = result.track; + result.parsed = this.parseCleanTrack( title ); + if ( result.parsed ) + { + result.parsed.track = result.track; + return result.parsed; + } + } + else + { + result.parsed = this.parseCleanTrack( title ); + if ( result.parsed ) + { + return result.parsed; + } + } + + // Still no luck, lets go deeper + if ( !result.parsed ) + { + if ( title.toLowerCase().indexOf( searchString.toLowerCase() ) !== -1 ) + { + result.parsed = this.parseCleanTrack( title.replace( RegExp( searchString, "gi" ), searchString.concat( " :" ) ) ); + } + else + { + var tryMatch = searchString.replace( /(?:[-–—|:&])/g, " " ); + if ( title.toLowerCase().indexOf( tryMatch.toLowerCase() ) !== -1 ) + { + var replaceWith; + if ( title.regexIndexOf( /(?:[-–—|:&])/g, 0 ) !== -1 ) + { + replaceWith = searchString; + } + else + { + replaceWith = searchString.concat( " : " ); + } + result.parsed = this.parseCleanTrack( title.replace( RegExp( tryMatch, "gi" ), replaceWith ) ); + } + } + } + + if ( result.fromQuote && result.fromQuote !== undefined ) + { + if ( result.parsed ) + { + result.artist = result.parsed.artist; + } + result.track = result.fromQuote; + } + else if ( result.parsed ) + { + if ( result.parsed.artist !== undefined ) + { + result.artist = result.parsed.artist; + } + if ( result.parsed.track !== undefined ) + { + result.track = result.parsed.track; + } + } + delete result.parsed; + return result; + }, + + parseCleanTrack: function( track ) + { + var result = {}; + result.query = track; + that = this; + result.query.replace( /.*?(?=([-–—:|]\s))/g, function ( param ) { + if ( param.trim() !== "" ) + { + if ( result.artist === undefined ) + { + result.artist = param; + } + else + { + if ( result.track === undefined ) + { + result.track = param; + } + } + } + }); + + result.query.replace( /(?=([-–—:|]\s)).*/g, function ( param ) { + if ( param.trim() !== "" ) + { + if ( param.regexIndexOf( /([-–—|:]\s)/g, 0 ) === 0 ) + { + if ( result.track === undefined ) + { + result.track = param.replace( /([-–—|:]\s)/g, "" ); + } + } + else + { + if ( result.artist === undefined ) + { + result.artist = param; + } + result.track = result.replace( /([-–—|:]\s)/g, "" ); + } + } + }); + + if ( result.track !== undefined && result.artist !== undefined ) + { + // Now, lets move featuring to track title, where it belongs + var ftmatch = result.artist.match( /(?:(\s)(?=(feat.|feat|ft.|ft|featuring)(?=(\s)))).*/gi ); + if ( ftmatch ) + { + result.artist = result.artist.replace( ftmatch, "" ); + result.track += " " + ftmatch; + } + // Trim + result.track = result.track.replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,' ' ); + result.artist = result.artist.replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,' ' ); + return result; + } + return null; + }, + + parseURLS: function( rawUrls ) + { + var parsedUrls = new Array(); + var urls = decodeURIComponent( decodeURIComponent( rawUrls ) ); + // Youtube changes the start delimiter randomly + var matches = urls.match( /^((.+?)(=))/ ); + if ( matches ) { + // split the decoded urls by matches[0] delimiter, separated by comma + var urlArray = urls.split( RegExp( "," + matches[0], "i" ) ); + for ( var i = 0; i < urlArray.length; i++ ) + { + var url; + if ( matches[0] != "url=" ) + { + // Delimiter isnt url=, we need to sort the params + url = ( urlArray[i] != urlArray[0] ) ? matches[0] + urlArray[i] : urlArray[i]; + var urlMatch = url.match( /(.+?)(url=)(.+?)(\?)(.+)/ ); + // Base & Params + url = urlMatch[3]+urlMatch[4] + "&" + urlMatch[1]+urlMatch[5]; + } + else + { + // Just replace url= + url = urlArray[i].replace( /^url=/, "" ); + } + // itag is found twice, we need to remove that (last occurence) + var itagMatch = url.match( /(.*)(itag=\d+&)(.*?)/ ); + url = url.replace(/(.*)(itag=\d+&)(.*?)/, itagMatch[1] + itagMatch[3] ); + + // Sig needs to be sigature + url = url.replace( /sig=/, "signature=" ); + var type; + try { + // Parse out the type and codec, encode it + // May have an quality effect + type = url.match( /(&type=)(.+?)(&)/i ); + url = url.replace( /(&type=)(.+?)(&)/, type[1] + encodeURIComponent( type[2] ) + type[3] ); + } + catch ( e ) { + try { + // Type is on the end of the url + type = url.match( /(&type=)(.*?)/i ); + type = type[1] + encodeURIComponent( type[1] ) + type[2]; + url = url.replace( /(&type=)(.*)/, type ); + } + catch ( e ) { + this.debugMsg( "Critical: Cannot parse out type in url" + e + "\nUrl: "+ url ); + } + } + + if ( url.regexIndexOf( /quality=(hd720|high|medium|small)/i, 0 ) !== -1 ) + { + parsedUrls.push( url ); + } + } + + var finalUrl; + + if ( this.qualityPreference === undefined ) + { + // This shouldnt happen really, but sometimes do?! + this.qualityPreference = 0; + this.debugMsg( "Critical: Failed to set qualitypreference in init, resetting to " + this.qualityPreference ); + } + + for ( i = 0; i < parsedUrls.length; i++ ) + { + if ( this.hasPreferredQuality( parsedUrls[i] ) ) + { + finalUrl = parsedUrls[i]; + } + } + + if ( finalUrl === undefined ) + { + finalUrl = parsedUrls[0]; + } + + if ( finalUrl && finalUrl !== undefined ) + { + return finalUrl; + } + } + return null; + }, + + resolve: function( qid, artist, album, title ) + { + this.resolveMode = true; + var query; + if ( artist !== "" ) + { + query = encodeURIComponent( artist ) + "%20"; + } + if ( title !== "" ) + { + query += encodeURIComponent( title ); + } + var apiQuery = "https://www.googleapis.com/youtube/v3/search?part=snippet&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=10&order=relevance&type=video&q=" + query.replace( /\%20/g, '\+' ); + if ( this.hatchet ) + { + apiQuery += "&videoEmbeddable=true"; + } + var that = this; + var empty = { + results: [], + qid: qid + }; + Tomahawk.asyncRequest( apiQuery, function( xhr ) { + var results = []; + var resp = JSON.parse( xhr.responseText ); + if ( resp.pageInfo.totalResults !== 0 && resp.items !== undefined ) + { + var limit = Math.min( 10, resp.pageInfo.totalResults ); + for ( var i = 0; i < limit; i++ ) + { + var responseItem = resp.items[i]; + if ( responseItem === undefined ) + { + continue; + } + var responseTitle = responseItem.snippet.title.toLowerCase(); + // Check whether the artist and title (if set) are in the returned title, discard otherwise + if ( responseTitle !== undefined && responseTitle.indexOf( artist.toLowerCase() ) === -1 || + ( title !== "" && responseTitle.toLowerCase().indexOf( title.toLowerCase() ) === -1 ) ) + { + // Lets do a deeper check + // Users tend to insert [ft. Artist] or **featuring Artist & someOther artist + // Remove these + var newTitle = that.magicCleanup( title ); + var newArtist = that.magicCleanup( artist ); + var newRespTitle = that.magicCleanup( responseTitle ); + + if ( newRespTitle !== undefined && newRespTitle.indexOf( newArtist ) === -1 || + ( newTitle !== "" && newRespTitle.indexOf( newTitle ) === -1 ) ) + { + // Lets do it in reverse! + if ( newArtist.indexOf( newTitle ) === -1 && newTitle.indexOf( newArtist ) === -1 ) + { + continue; + } + } + } + if ( that.getTrack( responseTitle, title ) ) + { + var result = new Object(); + if ( artist !== "" ) + { + result.artist = artist; + } + result.source = that.settings.name; + result.mimetype = "video/h264"; + result.score = 0.85; + result.year = responseItem.snippet.publishedAt.slice( 0, 4 ); + result.track = title; + result.youtubeId = responseItem.id.videoId; + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.id = i; + if ( that.qualityPreference === 0 ) + { + result.linkUrl += "&hd=1"; + } + results.push( result ); + } + } + if (results.length === 0) { // if no results had appropriate titles, return empty + that.sendEmptyResult(); + } + else + { + if ( that.hatchet ) + { + Tomahawk.addTrackResults( { qid: qid, results: [that.getMostRelevant( results )] } ); + } + that.getMetadata( qid, results ); + } + } + else + { + that.sendEmptyResult(); + } + }); + }, + + getCandidates: function( qid, searchString ) + { + var queryUrl = "https://www.googleapis.com/youtube/v3/search?part=snippet&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=50&order=relevance&type=video&q=" + encodeURIComponent( searchString ).replace( /\%20/g, '\+' ); + if ( this.hatchet ) + { + queryUrl += "&videoEmbeddable=true"; + } + var that = this; + Tomahawk.asyncRequest( queryUrl, function( xhr ){ + var resp = JSON.parse( xhr.responseText ); + var results = new Array(); + if ( resp.pageInfo.totalResults !== 0 ) + { + var total = resp.items.length; + for ( var i = 0; i < total; i++ ) + { + if ( resp.items[i] === undefined ) + { + continue; + } + if ( resp.items[i].id === undefined || resp.items[i].id.videoId === undefined ) + { + continue; + } + if ( resp.items[i].snippet === undefined || resp.items[i].snippet.title === undefined || resp.items[i].snippet.description === undefined ) + { + continue; + } + // Dirty check, filters out the most of the unwanted results + var searchFoundItem = resp.items[i].snippet.title.replace( /([^A-Za-z0-9\s])/gi, "" ).replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,'|' ); + var searchStringItem = searchString.replace( /([^A-Za-z0-9\s])/gi, "" ).replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,'|' ); + var matches = searchFoundItem.match( RegExp( searchStringItem, "gi" ) ); + if ( !matches ) + { + continue; + } + var track = resp.items[i].snippet.title; + var parsedTrack = that.cleanupAndParseTrack( track, searchString ); + + if ( !parsedTrack || parsedTrack.artist === undefined || parsedTrack.track === undefined ) + { + continue; + } + var result = new Object(); + result.artist = parsedTrack.artist; + result.track = parsedTrack.track; + result.youtubeId = resp.items[i].id.videoId; + result.year = resp.items[i].snippet.publishedAt.slice( 0, 4 ); + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.mimetype = "video/h264"; + result.score = (parsedTrack.isOfficial !== undefined ? 0.85 : 0.95); + results.push( result ); + } + } + if ( results.length === 0 ) + { + that.sendEmptyResult( qid, searchString ); + } + else + { + that.verify( qid, results ); + } + } ); + }, + + verify: function( qid, candidates ) + { + var verified = []; + var total = candidates.length; + candidates.forEach( function( candidate ){ + var trackLookupUrl = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent( candidate.artist ) + "&track=" + encodeURIComponent( candidate.track ); + Tomahawk.asyncRequest( trackLookupUrl, function( xhr ){ + var response = JSON.parse( xhr.responseText ); + if ( response.track !== undefined && response.track.name !== undefined && response.track.artist.name !== undefined ) + { + if ( response.track.name.toLowerCase() === candidate.track.toLowerCase() && response.track.artist.name.toLowerCase() === candidate.artist.toLowerCase() ) + { + verified.push( candidate ); + } + } + else + { + if( response.track !== undefined ) + { + that.debugMsg( "Bad track name? " + trackLookupUrl + ": " + JSON.stringify( response.track ) ); + } + else + { + that.debugMsg( "Bad result from track lookup? " + trackLookupUrl + ": " + JSON.stringify( response ) ); + } + } + total--; + if ( total === 0 ) + { + that.getMetadata( qid, verified ); + } + } ); + } ); + }, + + getMetadata: function( qid, results ) + { + + var queryUrl = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&id="; + results.forEach( function( result ){ + queryUrl += result.youtubeId + ","; + } ); + queryUrl = queryUrl.substring( 0, queryUrl.length - 1 ); + var that = this; + Tomahawk.asyncRequest( queryUrl, function( xhr ){ + var response = JSON.parse( xhr.responseText ); + results.forEach( function( result ){ + for ( var i = 0; i < response.items.length; i++ ) + { + if ( response.items[i].id == result.youtubeId ) + { + result.name = that.settings.name; + result.duration = that.iso8601toSeconds( response.items[i].contentDetails.duration ); + } + } + } ); + that.parseVideoUrlFromYtPages( qid, results ); + } ); + }, + + parseVideoUrlFromYtPages: function( qid, results ) + { + var that = this; + var total = results.length; + results.forEach( function( result ){ + Tomahawk.asyncRequest( result.linkUrl, function( xhr ){ + var html = xhr.responseText; + var url; + // First, lets try and find the stream_map at top of the page + // to save some time going to the end and do JSON.parse on the yt.config + var streamMatch = html.match( /(url_encoded_fmt_stream_map=)(.*?)(?=(\\u0026amp))/i ); + if ( streamMatch && streamMatch[2] !== undefined ) + { + var parsed = this.parseURLS( streamMatch[2] ); + if ( parsed ) + { + url = parsed; + } + else + { + this.debug( "Hm, failed to parse urls from top of the page" ); + } + } + // Now we can go further down, and check the ytplayer.config map + streamMatch = html.match( /(ytplayer\.config =)([^\r\n]+?\});/ ); + if ( !streamMatch ) + { + // Todo: Open window for user input? + var dasCaptcha = html.match( /www.google.com\/recaptcha\/api\/challenge?/i ); + if ( dasCaptcha ) + { + that.debugMsg( "Failed to parse url from youtube page. Captcha limitation in place." ); + } + else + { + that.debugMsg( "Failed to find stream_map in youtube page." ); + } + } + if ( streamMatch && streamMatch[2] !== undefined ) + { + try { + var jsonMap = JSON.parse( streamMatch[2] ); + if ( jsonMap.args.url_encoded_fmt_stream_map !== undefined ) + { + parsed = that.parseURLS( jsonMap.args.url_encoded_fmt_stream_map ); + if ( parsed ) + { + url = parsed; + } + } + } + catch ( e ) { + that.debugMsg( "Critical: " + e ); + } + } + if ( url ) + { + result.url = url; + result.bitrate = that.getBitrate( url ); + var expires = result.url.match( /expire=([0-9]+)(?=(&))/ ); + if ( expires && expires[1] !== undefined) + { + result.expires = Math.floor( expires[1] ); + } + } + total--; + if ( total === 0 ) + { + var toReturn = {qid: qid, results: results}; + if ( that.resolveMode ) + { + toReturn.results = [that.getMostRelevant( results )]; + } + Tomahawk.addTrackResults( toReturn ); + } + } ); + } ); + }, + + search: function( qid, searchString ) + { + this.getCandidates( qid, searchString ); + } +} ); + +Tomahawk.resolver.instance = YoutubeResolver; \ No newline at end of file From 5d6964795d296d7658b06ff319e97e34d45e07d7 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Thu, 9 Oct 2014 13:16:33 +0200 Subject: [PATCH 313/597] Fix THR-91. --- vibe3/content/contents/code/vibe3.js | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/vibe3/content/contents/code/vibe3.js b/vibe3/content/contents/code/vibe3.js index b383361e8..b29902533 100644 --- a/vibe3/content/contents/code/vibe3.js +++ b/vibe3/content/contents/code/vibe3.js @@ -102,17 +102,19 @@ var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { // Trim away the artist-title-separator and extra spaces track_title = track_title.replace(' - ', '').trim(); - results.push({ - artist: artist, - track: track_title, - source: that.settings.name, - url: mp3url, - extension: 'mp3', - bitrate: 128, - score: 0.80 - }); + if ( artist !== "" && track_title !== "" && mp3url !== "" ) + { + results.push({ + artist: artist, + track: track_title, + source: that.settings.name, + url: mp3url, + extension: 'mp3', + bitrate: 128, + score: 0.80 + }); + } } - Tomahawk.addTrackResults({ qid: qid, results: results @@ -130,7 +132,7 @@ var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { url = url.replace("vibe3://", "http://"); var headers = { "Referer": "http://vibe3.com" - } + }; Tomahawk.reportStreamUrl(qid, url, headers); }, search: function (qid, searchString) { From 8c8505f9e874a9b3b953c9abb572f78a33586492 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Thu, 9 Oct 2014 13:53:26 +0200 Subject: [PATCH 314/597] Add search to Vibe3.com resolver. --- vibe3/content/contents/code/vibe3.js | 8 +++----- vibe3/content/metadata.json | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/vibe3/content/contents/code/vibe3.js b/vibe3/content/contents/code/vibe3.js index b29902533..087445761 100644 --- a/vibe3/content/contents/code/vibe3.js +++ b/vibe3/content/contents/code/vibe3.js @@ -1,5 +1,6 @@ /* * Copyright 2014, Lorenz Hübschle-Schneider + * Copyright 2014, Thierry Göckel * * The MIT License (MIT) * @@ -64,7 +65,7 @@ var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { name: 'vibe3', icon: '../images/icon.png', weight: 80, - timeout: 5 + timeout: 10 }, init: function () { // Add URL handler for vibe3:// urls @@ -136,10 +137,7 @@ var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.reportStreamUrl(qid, url, headers); }, search: function (qid, searchString) { - return { - qid: qid, - results: [] - }; + this.resolve( qid, searchString ); } }); diff --git a/vibe3/content/metadata.json b/vibe3/content/metadata.json index f72d8df55..3ef4fc587 100644 --- a/vibe3/content/metadata.json +++ b/vibe3/content/metadata.json @@ -1,9 +1,9 @@ { "name": "vibe3", "pluginName": "vibe3", - "author": "Lorenz Hübschle-Schneider", + "author": "Lorenz Hübschle-Schneider and Thierry Göckel", "email": "lorenz@4z2.de", - "version": "0.1.0", + "version": "0.1.1", "website": "http://gettomahawk.com", "description": "Looks for tracks to play from www.vibe3.com.", "type": "resolver/javascript", From d158397ba4120e9f13e26fa69a67f1dcf9898c09 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Thu, 9 Oct 2014 13:56:51 +0200 Subject: [PATCH 315/597] Add Vibe3.com resolver's capabilities to README. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2ea2e9807..f40c6615e 100644 --- a/README.md +++ b/README.md @@ -59,5 +59,6 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | subsonic | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | | synology-audiostation | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | | tomahk-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| vibe3 | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | vkontakte | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | youtube | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | From 6172dfb97011b91f58d66fccb51fbb789554e5d1 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Thu, 9 Oct 2014 15:17:20 +0200 Subject: [PATCH 316/597] Make sure code execution stops after returning results in hatchet mode. --- youtube/content/contents/code/youtube.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index 736db00a7..b8806fe72 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -593,7 +593,10 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { { Tomahawk.addTrackResults( { qid: qid, results: [that.getMostRelevant( results )] } ); } - that.getMetadata( qid, results ); + else + { + that.getMetadata( qid, results ); + } } } else @@ -813,4 +816,4 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { } } ); -Tomahawk.resolver.instance = YoutubeResolver; \ No newline at end of file +Tomahawk.resolver.instance = YoutubeResolver; From 287ba30c67e1b07d4d99a62a25feff8447a2ef1c Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Thu, 9 Oct 2014 16:00:27 +0200 Subject: [PATCH 317/597] Change key of Video Id to youtubeVideoId. --- youtube/content/contents/code/youtube.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index b8806fe72..a9affa049 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -574,8 +574,8 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { result.score = 0.85; result.year = responseItem.snippet.publishedAt.slice( 0, 4 ); result.track = title; - result.youtubeId = responseItem.id.videoId; - result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.youtubeVideoId = responseItem.id.videoId; + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeVideoId; result.id = i; if ( that.qualityPreference === 0 ) { @@ -652,9 +652,9 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { var result = new Object(); result.artist = parsedTrack.artist; result.track = parsedTrack.track; - result.youtubeId = resp.items[i].id.videoId; + result.youtubeVideoId = resp.items[i].id.videoId; result.year = resp.items[i].snippet.publishedAt.slice( 0, 4 ); - result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeVideoId; result.mimetype = "video/h264"; result.score = (parsedTrack.isOfficial !== undefined ? 0.85 : 0.95); results.push( result ); @@ -711,7 +711,7 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { var queryUrl = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&id="; results.forEach( function( result ){ - queryUrl += result.youtubeId + ","; + queryUrl += result.youtubeVideoId + ","; } ); queryUrl = queryUrl.substring( 0, queryUrl.length - 1 ); var that = this; @@ -720,7 +720,7 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { results.forEach( function( result ){ for ( var i = 0; i < response.items.length; i++ ) { - if ( response.items[i].id == result.youtubeId ) + if ( response.items[i].id == result.youtubeVideoId ) { result.name = that.settings.name; result.duration = that.iso8601toSeconds( response.items[i].contentDetails.duration ); From 16436ad966e1c4ce1d9015c6ea7687857a168b9f Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Tue, 7 Oct 2014 01:02:00 +0200 Subject: [PATCH 318/597] First working version of YouTube's API V3 version of the resolver. --- youtube/content/contents/code/youtube.js | 1520 +++++++++++----------- 1 file changed, 795 insertions(+), 725 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index 343e16031..736db00a7 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -1,6 +1,6 @@ /* * Copyright (C) 2012 Hugo Lindström - * Copyright (C) 2013 Thierry Göckel + * Copyright (C) 2011-2014 Thierry Göckel * Copyright (C) 2012 Leo Franchi * * This program is free software: you can redistribute it and/or modify @@ -19,728 +19,798 @@ * NOTICE: This resolver and its intent, is for demonstrational purposes only **/ -var YoutubeResolver = Tomahawk.extend(TomahawkResolver, { - - getConfigUi: function () - { - var uiData = Tomahawk.readBase64("config.ui"); - return { - "widget": uiData, - fields: [{ - name: "includeCovers", - widget: "covers", - property: "checked" - }, { - name: "includeRemixes", - widget: "remixes", - property: "checked" - }, { - name: "includeLive", - widget: "live", - property: "checked" - }, { - name: "qualityPreference", - widget: "qualityDropdown", - property: "currentIndex" - }, { - name: "debugMode", - widget: "debug", - property: "checked" - }], - images: [{ - "youtube.png" : Tomahawk.readBase64("youtube.png") - }] - }; - }, - - newConfigSaved: function () - { - var userConfig = this.getUserConfig(); - if ((userConfig.includeCovers !== this.includeCovers) || (userConfig.includeRemixes !== this.includeRemixes) || - (userConfig.includeLive !== this.includeLive) || (userConfig.qualityPreference !== this.qualityPreference)) { - - this.includeCovers = userConfig.includeCovers; - this.includeRemixes = userConfig.includeRemixes; - this.includeLive = userConfig.includeLive; - this.qualityPreference = userConfig.qualityPreference; - this.debugMode = userConfig.debugMode; - this.saveUserConfig(); - } - }, - - settings: - { - name: 'YouTube', - icon: 'youtube-icon.png', - weight: 70, - timeout: 15 - }, - - // Wrap Tomahawk.addTrackResults to intercept the call from Hatchet - addTrackResults: function(qid, results) { - Tomahawk.addTrackResults(qid, results); - }, - getTrack: function (trackTitle, origTitle, isSearch) { - if ((this.includeCovers === false || this.includeCovers === undefined) && trackTitle.search(/(\Wcover(?!(\w)))/i) !== -1 && origTitle.search(/(\Wcover(?!(\w)))/i) === -1) { - return null; - } - // Allow remix:es in search results? - if (isSearch === undefined) { - if ((this.includeRemixes === false || this.includeRemixes === undefined) && trackTitle.search(/(\W(re)*?mix(?!(\w)))/i) !== -1 && origTitle.search(/(\W(re)*?mix(?!(\w)))/i) === -1) { - return null; - } - } - if ((this.includeLive === false || this.includeLive === undefined) && trackTitle.search(/(live(?!(\w)))/i) !== -1 && origTitle.search(/(live(?!(\w)))/i) === -1) { - return null; - } - else { - return trackTitle; - } - }, - - getBitrate: function (urlString) - { - //http://www.h3xed.com/web-and-internet/youtube-audio-quality-bitrate-240p-360p-480p-720p-1080p - // No need to get higher than hd720, as it only will eat bandwith and do nothing for sound quality - if (urlString.indexOf("quality=hd720") !== -1) { - return 192; - } - else if (urlString.indexOf("quality=medium") !== -1) { - return 128; - } - else if (urlString.indexOf("quality=small") !== -1) { - return 96; - } - // Probably - return 128; - }, - - init: function() - { - // Set userConfig here - var userConfig = this.getUserConfig(); - if (userConfig !== undefined && userConfig.qualityPreference !== undefined) { - this.includeCovers = userConfig.includeCovers; - this.includeRemixes = userConfig.includeRemixes; - this.includeLive = userConfig.includeLive; - this.qualityPreference = userConfig.qualityPreference; - this.debugMode = userConfig.debugMode; - } - else { - this.includeCovers = false; - this.includeRemixes = false; - this.includeLive = false; - this.qualityPreference = 1; - this.debugMode = 1; - } - - // Protos - String.prototype.capitalize = function() { - return this.replace(/(^|\s)([a-z])/g , function(m,p1,p2) { return p1+p2.toUpperCase(); }); - }; - String.prototype.regexIndexOf = function(regex, startpos) { - var indexOf = this.substring(startpos || 0).search(regex); - return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf; - }; - String.prototype.splice = function(idx, rem, s) { - return (this.slice(0,idx) + s + this.slice(idx + Math.abs(rem))); - }; - }, - - hasPreferredQuality: function(urlString) - { - if (this.qualityPreference === undefined) { - this.debugMsg("ASSERT: quality undefined!"); - return true; - } - - if (urlString.indexOf("quality="+this.getPreferredQuality()) !== -1){ - return true; - } - return false; - }, - - getPreferredQuality: function() - { - if (this.qualityPreference === undefined) { - this.qualityPreference = 0; - } - - switch (this.qualityPreference) { - case 0: - return "hd720"; - break; - case 1: - return "medium"; - break; - case 2: - return "small"; - break; - default: - return "hd720"; - } - // To make Lint happy - return "hd720"; - }, - - debugMsg: function(msg) - { - if (msg.toLowerCase().indexOf("assert") === 0){ - console.log(this.settings.name + msg); - } - else if (this.debugMode){ - Tomahawk.log(this.settings.name + " debug: " + msg); - } - }, - - parseURLS: function(rawUrls) - { - var parsedUrls = new Array(); - var urls = decodeURIComponent(decodeURIComponent(rawUrls)); - // Youtube changes the start delimiter randomly - var matches = urls.match(/^((.+?)(=))/); - if (matches) { - // split the decoded urls by matches[0] delimiter, separated by comma - var urlArray = urls.split(RegExp(","+matches[0], "i")); - for (var i = 0; i < urlArray.length; i++) { - var url; - if (matches[0] != "url=") { - // Delimiter isnt url=, we need to sort the params - url = (urlArray[i] != urlArray[0]) ? matches[0]+urlArray[i] : urlArray[i]; - var urlMatch = url.match(/(.+?)(url=)(.+?)(\?)(.+)/); - // Base & Params - url = urlMatch[3]+urlMatch[4] + "&" + urlMatch[1]+urlMatch[5]; - } - else { - // Just replace url= - url = urlArray[i].replace(/^url=/, ""); - } - - // itag is found twice, we need to remove that (last occurence) - var itagMatch = url.match(/(.*)(itag=\d+&)(.*?)/); - url = url.replace(/(.*)(itag=\d+&)(.*?)/, itagMatch[1]+itagMatch[3]); - - // Sig needs to be sigature - url = url.replace(/sig=/, "signature="); - var type; - try { - // Parse out the type and codec, encode it - // May have an quality effect - type = url.match(/(&type=)(.+?)(&)/i); - url = url.replace(/(&type=)(.+?)(&)/, type[1]+encodeURIComponent(type[2])+type[3]); - } - catch (e) { - try { - // Type is on the end of the url - type = url.match(/(&type=)(.*?)/i); - type = type[1]+encodeURIComponent(type[1])+type[2]; - url = url.replace(/(&type=)(.*)/, type); - } - catch (e) { - this.debugMsg("Critical: Cannot parse out type in url" + e + "\nUrl: "+ url); - } - } - - if (url.regexIndexOf(/quality=(hd720|high|medium|small)/i, 0) !== -1) { - parsedUrls.push(url); - } - } - - var finalUrl; - - if (this.qualityPreference === undefined) { - // This shouldnt happen really, but sometimes do?! - this.qualityPreference = 0; - this.debugMsg("Critical: Failed to set qualitypreference in init, resetting to " + this.qualityPreference); - } - - for (i = 0; i < parsedUrls.length; i++) { - if (this.hasPreferredQuality(parsedUrls[i])) { - finalUrl = parsedUrls[i]; - } - } - - if (finalUrl === undefined) { - finalUrl = parsedUrls[0]; - } - - if (finalUrl && finalUrl !== undefined) { - return finalUrl; - } - } - return null; - }, - - parseVideoUrlFromYtPage: function(html) - { - // First, lets try and find the stream_map at top of the page - // to save some time going to the end and do JSON.parse on the yt.config - var streamMatch = html.match(/(url_encoded_fmt_stream_map=)(.*?)(?=(\\u0026amp))/i); - if (streamMatch && streamMatch[2] !== undefined) { - var parsed = this.parseURLS(streamMatch[2]); - if (parsed) { - return parsed; - } - else { - this.debug("Hm, failed to parse urls from top of the page"); - } - } - - // Now we can go further down, and check the ytplayer.config map - streamMatch = html.match(/(ytplayer\.config =)([^\r\n]+?\});/); - - if (!streamMatch) { - // Todo: Open window for user input? - var dasCaptcha = html.match(/www.google.com\/recaptcha\/api\/challenge?/i); - if (dasCaptcha) { - this.debugMsg("Failed to parse url from youtube page. Captcha limitation in place."); - } - else { - this.debugMsg("Failed to find stream_map in youtube page."); - } - return null; - } - - if (streamMatch && streamMatch[2] !== undefined) { - try { - var jsonMap = JSON.parse(streamMatch[2]); - if (jsonMap.args.url_encoded_fmt_stream_map !== undefined) { - parsed = this.parseURLS(jsonMap.args.url_encoded_fmt_stream_map); - if (parsed){ - return parsed; - } - } - } - catch (e) { - this.debugMsg("Critical: " + e); - } - } - return null; - }, - - magicCleanup: function(toClean) - { - return toClean.replace(/[^A-Za-z0-9 ]|(feat|ft.|featuring|prod|produced|produced by)/g, "").replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' ').toLowerCase(); - }, - - resolve: function(qid, artist, album, title) - { - if (artist !== "") { - query = encodeURIComponent(artist) + "%20"; - } - if (title !== "") { - query += encodeURIComponent(title); - } - var limit = 10; - var apiQuery = "http://gdata.youtube.com/feeds/api/videos?q=" + query + "&v=2&alt=jsonc&safeSearch=none&max-results=" + limit; - apiQuery = apiQuery.replace(/\%20/g, '\+'); - var that = this; - var empty = { - results: [], - qid: qid - }; - Tomahawk.asyncRequest(apiQuery, function(xhr) { - var results = []; - var resp = JSON.parse(xhr.responseText); - if (resp.data.totalItems !== 0 && resp.data.items !== undefined) { - var stop = Math.min(limit, resp.data.totalItems); - for (i = 0; i < Math.min(limit, resp.data.totalItems); i++) { - if (resp.data.items[i] === undefined) { - stop = stop - 1; - continue; - } - var responseItem = resp.data.items[i]; - if (responseItem.duration === undefined) { - stop = stop - 1; - continue; - } - // ContentRating, eg. User needs to verify age or similar that requires login - if (responseItem.contentRating !== undefined) { - stop = stop - 1; - continue; - } - var responseTitle = responseItem.title.toLowerCase(); - // Check whether the artist and title (if set) are in the returned title, discard otherwise - if (responseTitle !== undefined && responseTitle.indexOf(artist.toLowerCase()) === -1 || - (title !== "" && responseTitle.toLowerCase().indexOf(title.toLowerCase()) === -1)) { - // Lets do a deeper check - // Users tend to insert [ft. Artist] or **featuring Artist & someOther artist - // Remove these - var newTitle = that.magicCleanup(title); - var newArtist = that.magicCleanup(artist); - var newRespTitle = that.magicCleanup(responseTitle); - - if (newRespTitle !== undefined && newRespTitle.indexOf(newArtist) === -1 || - (newTitle !== "" && newRespTitle.indexOf(newTitle) === -1)) { - // Lets do it in reverse! - if (newArtist.indexOf(newTitle) === -1 && newTitle.indexOf(newArtist) === -1) { - stop = stop - 1; - continue; - } - } - } - - if (that.getTrack(responseTitle, title)) { - var result = new Object(); - if (artist !== "") { - result.artist = artist; - } - - result.source = that.settings.name; - result.mimetype = "video/h264"; - result.duration = responseItem.duration; - result.score = 0.85; - result.year = responseItem.uploaded.slice(0,4); - result.track = title; - result.linkUrl = responseItem.player['default']; - if (that.qualityPreference === 0) { - result.linkUrl += "&hd=1"; - } - - (function(i, qid, result) { - Tomahawk.asyncRequest(responseItem.player['default'], function(xhr2) { - result.url = that.parseVideoUrlFromYtPage(xhr2.responseText, result); - if (result.url && result.url !== undefined) { - // Get the expiration time, to be able to cache results in tomahawk - var expires = result.url.match(/expire=([0-9]+)(?=(&))/); - if (expires && expires[1] !== undefined) { - result.expires = Math.floor(expires[1]); - } - result.bitrate = that.getBitrate(result.url); - result.id = i; - results.push(result); - stop = stop - 1; - if (stop === 0) { - var best = i + 1; - for (var j = 0; j < results.length; j++) { - if (results[j].id < best || that.hasPreferredQuality(results[j].url)) { - best = results[j].id; - var finalResult = results[j]; - } - } - delete finalResult.id; - var resolveReturn = { - results: [finalResult], - qid: qid - }; - that.addTrackResults(resolveReturn); - } - } - else { - stop = stop - 1; - } - }); - })(i, qid, result); - } - else { - stop = stop - 1; - } - } - if (stop === 0) { // if no results had appropriate titles, return empty - that.addTrackResults(empty); - } - } - else { - that.addTrackResults(empty); - } - }); - }, - - cleanupAndParseTrack: function(title, searchString) - { - var result = {}; - // For the ease of parsing, remove these - // Maybe we could up the score a bit? - if (title.regexIndexOf(/(?:[([](?=(official))).*?(?:[)\]])|(?:(official|video)).*?(?:(video))/i, 0) !== -1) - { - title = title.replace(/(?:[([](?=(official|video))).*?(?:[)\]])/gi, ""); - title = title.replace(/(official|video(?:([!:-])))/gi, ""); - result.isOfficial = 1; - } - result.query = title; - // Sometimes users separate titles with quotes : - // eg, "\"Young Forever\" Jay Z | Mr. Hudson (OFFICIAL VIDEO)" - // this will parse out the that title - var inQuote = title.match(/([""'])(?:(?=(\\?))\2.).*\1/g); - if (inQuote && inQuote !== undefined) { - result.track = inQuote[0].substr(1, inQuote[0].length-2); - title = title.replace(inQuote[0],''); - result.fromQuote = result.track; - result.parsed = this.parseCleanTrack(title); - if (result.parsed) { - result.parsed.track = result.track; - return result.parsed; - } - } - else { - result.parsed = this.parseCleanTrack(title); - if (result.parsed){ - return result.parsed; - } - } - - // Still no luck, lets go deeper - if (!result.parsed) { - if (title.toLowerCase().indexOf(searchString.toLowerCase()) !== -1) { - result.parsed = this.parseCleanTrack(title.replace(RegExp(searchString, "gi"), searchString.concat(" :"))); - } - else - { - var tryMatch = searchString.replace(/(?:[-|:&])/g, " "); - if (title.toLowerCase().indexOf(tryMatch.toLowerCase()) !== -1) { - var replaceWith; - if (title.regexIndexOf(/(?:[-|:&])/g, 0) !== -1){ - replaceWith = searchString; - } - else { - replaceWith = searchString.concat(" : "); - } - result.parsed = this.parseCleanTrack(title.replace(RegExp(tryMatch, "gi"), replaceWith)); - } - } - } - - if (result.fromQuote && result.fromQuote !== undefined) { - if (result.parsed){ - result.artist = result.parsed.artist; - } - result.track = result.fromQuote; - } - else if (result.parsed) { - if (result.parsed.artist !== undefined && result.parsed.artist.trim() !== "") { - result.artist = result.parsed.artist; - } - if (result.parsed.track !== undefined && result.parsed.track.trim() !== "") { - result.track = result.parsed.track; - } - } - delete result.parsed; - return result; - }, - - parseCleanTrack: function(track) - { - var result = {}; - result.query = track; - that = this; - result.query.replace(/.*?(?=([-:|]\s))/g, function (param) { - if (param.trim() !== "") { - if (result.artist === undefined) { - result.artist = param; - } - else { - if (result.track === undefined){ - result.track = param; - } - } - } - }); - - result.query.replace(/(?=([-:|]\s)).*/g, function (param) { - if (param.trim() !== "") { - if (param.regexIndexOf(/([-|:]\s)/g, 0) === 0) { - if (result.track === undefined){ - result.track = param.replace(/([-|:]\s)/g, ""); - } - } - else { - if (result.artist === undefined){ - result.artist = param; - } - result.track = result.replace(/([-|:]\s)/g, ""); - } - } - }); - - if (result.track !== undefined && result.artist !== undefined) { - // Now, lets move featuring to track title, where it belongs - var ftmatch = result.artist.match(/(?:(\s)(?=(feat.|feat|ft.|ft|featuring)(?=(\s)))).*/gi); - if (ftmatch) { - result.artist = result.artist.replace(ftmatch, ""); - result.track += " " + ftmatch; - } - // Trim - result.track = result.track.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' '); - result.artist = result.artist.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' '); - return result; - } - return null; - }, - - // Allows async requests being made with userdata - asyncRequest: function (url, userdata, callback) - { - Tomahawk.asyncRequest(url, function (xhr) { - callback.call(window, xhr, userdata); +var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { + + settings: { + name: 'YouTube', + icon: 'youtube-icon.png', + weight: 70, + timeout: 15 + }, + + hatchet: false, + + resolveMode: false, + + init: function() + { + // Set userConfig here + var userConfig = this.getUserConfig(); + if ( Object.getOwnPropertyNames( userConfig ).length > 0 ) + { + this.includeCovers = userConfig.includeCovers; + this.includeRemixes = userConfig.includeRemixes; + this.includeLive = userConfig.includeLive; + this.qualityPreference = userConfig.qualityPreference; + this.debugMode = userConfig.debugMode; + } + else + { + this.includeCovers = false; + this.includeRemixes = false; + this.includeLive = false; + this.qualityPreference = 1; + this.debugMode = 1; + } + + // Protos + String.prototype.capitalize = function() { + return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2) { return p1+p2.toUpperCase(); } ); + }; + String.prototype.regexIndexOf = function( regex, startpos ) { + var indexOf = this.substring( startpos || 0 ).search( regex ); + return ( indexOf >= 0 ) ? ( indexOf + ( startpos || 0 ) ) : indexOf; + }; + String.prototype.splice = function( idx, rem, s ) { + return ( this.slice( 0, idx ) + s + this.slice( idx + Math.abs( rem ) ) ); + }; + }, + + getConfigUi: function() + { + var uiData = Tomahawk.readBase64( "config.ui" ); + return { + "widget": uiData, + fields: [{ + name: "includeCovers", + widget: "covers", + property: "checked" + }, { + name: "includeRemixes", + widget: "remixes", + property: "checked" + }, { + name: "includeLive", + widget: "live", + property: "checked" + }, { + name: "qualityPreference", + widget: "qualityDropdown", + property: "currentIndex" + }, { + name: "debugMode", + widget: "debug", + property: "checked" + }], + images: [{ + "youtube.png" : Tomahawk.readBase64("youtube.png") + }] + }; + }, + + newConfigSaved: function () + { + var userConfig = this.getUserConfig(); + if ((userConfig.includeCovers !== this.includeCovers) || (userConfig.includeRemixes !== this.includeRemixes) || + (userConfig.includeLive !== this.includeLive) || (userConfig.qualityPreference !== this.qualityPreference)) + { + this.includeCovers = userConfig.includeCovers; + this.includeRemixes = userConfig.includeRemixes; + this.includeLive = userConfig.includeLive; + this.qualityPreference = userConfig.qualityPreference; + this.debugMode = userConfig.debugMode; + this.saveUserConfig(); + } + }, + + sendEmptyResult: function( qid, searchString ) + { + Tomahawk.log( "No results for " + searchString ); + var empty = { + results: [], + qid: qid + }; + Tomahawk.addTrackResults( empty ); + }, + + // Allows async requests being made with userdata + asyncRequest: function ( url, userdata, callback ) + { + Tomahawk.asyncRequest( url, function ( xhr ) { + callback.call( window, xhr, userdata ); + } ); + }, + + debugMsg: function( msg ) + { + if ( msg.toLowerCase().indexOf( "assert" ) === 0 ) + { + Tomahawk.log( this.settings.name + msg ); + } + else if ( this.debugMode ) + { + Tomahawk.log( this.settings.name + " debug: " + msg ); + } + }, + + iso8601toSeconds: function( iso8601 ) + { + var matches = iso8601.match( /[0-9]+[HMS]/g ); + var seconds = 0; + matches.forEach( function ( part ) { + var unit = part.charAt( part.length - 1 ); + var amount = parseInt( part.slice( 0, -1 ), 10 ); + switch ( unit ) { + case 'H': + seconds += amount * 60 *60; + break; + case 'M': + seconds += amount * 60; + break; + case 'S': + seconds += amount; + break; + default: + Tomahawk.log( "Erroneous ISO8601 format: " + iso8601 ); + break; + } }); - }, - - sendEmptyResult: function(qid, searchString) - { - Tomahawk.log("No results for " + searchString); - var empty = { - results: [], - qid: qid - }; - this.addTrackResults(empty); - }, - - handleItemResponse: function(qid, searchString, data) - { - var results = new Array(); - var artists = new Object(); - // r - //var artistLookupUrl = "http://developer.echonest.com/api/v4/artist/search?api_key=FILDTEOIK2HBORODV&format=json&results=1&name="; - var artistLookupUrl = "http://ws.audioscrobbler.com/2.0/?method=artist.search&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=1&artist="; - var that = this; - var count = 0; - for (i = 0; i < Math.min(data.totalItems, 50); i++) { - if (data.items[i] === undefined) { - continue; - } - - if (data.items[i].duration === undefined) { - continue; - } - - // Check whether the artist and title (if set) are in the returned title, discard otherwise - if (data.items[i].title === undefined) { - continue; - } - - // ContentRating, eg. User needs to verify age or similar that requires login - // May also indicate country restrictions - // @todo: Check user geo? may be found in result url, &gcr=COUNTRY_SHORT_CODE - // Value to be catched is then contentRating.GEOCODE - // If contentRating is just 1, login is required - if (data.items[i].contentRating !== undefined) { - continue; - } - - // Dirty check, filters out the most of the unwanted results - var searchFoundItem = data.items[i].title.replace(/([^A-Za-z0-9\s])/gi, "").replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,'|'); - var searchStringItem = searchString.replace(/([^A-Za-z0-9\s])/gi, "").replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,'|'); - var matches = searchFoundItem.match(RegExp(searchStringItem, "gi")); - if (!matches) { - continue; - } - - if (matches.length !== searchStringItem.split("|").length) { - this.debugMsg("Skipping: " + data.items[i].title + " Matches: " + matches.length); - this.debugMsg("Searched: " + searchString + " Matches: " + searchStringItem.split("|").length); - continue; - } - - var track = data.items[i].title; - var parsedTrack = this.cleanupAndParseTrack(track, searchString); - - if (!parsedTrack || parsedTrack.artist === undefined || parsedTrack.track === undefined) { - this.debugMsg("Failed to get a possitive match for : " + track); - continue; - } - if (this.getTrack(track, searchString, true)) { - var result = new Object(); - result.source = this.settings.name; - result.mimetype = "video/h264"; - result.duration = data.items[i].duration; - result.score = (parsedTrack.isOfficial !== undefined ? 0.85 : 0.95); - result.year = data.items[i].uploaded.slice(0,4); - result.url = data.items[i].player['default']; - result.query = searchString; - result.artist = parsedTrack.artist; - result.track = parsedTrack.track; - result.linkUrl = data.items[i].player['default']; - if (that.qualityPreference === 0) { - result.linkUrl += "&hd=1"; - } - results.push(result); - - // Lets just do one artist lookup query, instead of on all of them - var artist = result.artist.toLowerCase(); - if (artists[artist]){ - artists[artist].push(count); - } - else { - artists[artist] = [count]; - } - - result.id = count; - count++; - } - } - - if (count === 0) - { - this.debugMsg("Search results where empty for " + searchString); - this.sendEmptyResult(qid, searchString); - return; - } - - var finalResults = []; - for (var artistKey in artists) { - this.asyncRequest(artistLookupUrl+artistKey, artists[artistKey], function(xhr, ids) { - var response = JSON.parse(xhr.responseText); - if (response.results !== undefined && response.results.artistmatches.artist !== undefined) { - var artist = response.results.artistmatches.artist.name; - for (var i = 0; i < ids.length; i++) { - that.asyncRequest(results[ids[i]].url, {id: ids[i], artist: artist, results: results}, function(xhr, userdata) { - var url = that.parseVideoUrlFromYtPage(xhr.responseText); - if (url) { - userdata.results[userdata.id].url = url; - userdata.results[userdata.id].bitrate = that.getBitrate(url); - userdata.results[userdata.id].artist = userdata.artist; - var expires = url.match(/expire=([0-9]+)(?=(&))/); - if (expires && expires[1] !== undefined) { - userdata.results[userdata.id].expires = Math.floor(expires[1]); - } - that.debugMsg("Added " + count + " " + userdata.results[userdata.id].url + "\n"); - finalResults.push(userdata.results[userdata.id]); - if (count-1 === 0) { - var return1 = { - results: finalResults, - qid: qid - }; - that.addTrackResults(return1); - return; - } - } - else { - that.debugMsg("Failed on " + userdata.results[userdata.id].url + " count : " + count); - } - count--; - }); - } - } - else { - if( response.results !== undefined ){ - that.debugMsg("Bad name?" + JSON.stringify(response.results["opensearch:Query"], 4, null)); - } - else { - that.debugMsg("Bad result from artist lookup?"); - } - count = count-ids.length; - } - }); - } - }, - - search: function(qid, searchString) - { - var limit = 50; - var apiQuery = "http://gdata.youtube.com/feeds/api/videos?q=" + encodeURIComponent(searchString) + "&v=2&alt=jsonc&quality="+this.getPreferredQuality()+"&max-results=" +limit+"&category=Music"; - apiQuery = apiQuery.replace(/\%20/g, '\+'); - var that = this; - this.debugMsg("Searching for " + searchString); - Tomahawk.asyncRequest(apiQuery, function(xhr) { - var resp = JSON.parse(xhr.responseText); - if (resp.data.totalItems !== 0) { - that.handleItemResponse(qid, searchString, resp.data); - } - else { - that.sendEmptyResult(qid, searchString); - } - }); - } -}); - -Tomahawk.resolver.instance = YoutubeResolver; + return seconds; + }, + + magicCleanup: function( toClean ) + { + return toClean.replace( /[^A-Za-z0-9 ]|(feat|ft.|featuring|prod|produced|produced by)/g, "" ).replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,' ' ).toLowerCase(); + }, + + getMostRelevant: function( results ) + { + var best = results.length; + var finalResult = results[0]; + for ( var j = 0; j < results.length; j++ ) + { + if ( results[j].id < best || ( results[j].url && this.hasPreferredQuality( results[j].url ) ) ) + { + best = results[j].id; + finalResult = results[j]; + } + } + delete finalResult.id; + return finalResult; + }, + + hasPreferredQuality: function( urlString ) + { + if ( this.qualityPreference === undefined ) + { + this.debugMsg( "ASSERT: quality undefined!" ); + return true; + } + + if ( urlString.indexOf("quality=" + this.getPreferredQuality() ) !== -1 ) + { + return true; + } + return false; + }, + + getPreferredQuality: function() + { + if ( this.qualityPreference === undefined ) + { + this.qualityPreference = 0; + } + + switch ( this.qualityPreference ) + { + case 0: + return "hd720"; + break; + case 1: + return "medium"; + break; + case 2: + return "small"; + break; + default: + return "hd720"; + } + // To make Lint happy + return "hd720"; + }, + + getBitrate: function ( urlString ) + { + //http://www.h3xed.com/web-and-internet/youtube-audio-quality-bitrate-240p-360p-480p-720p-1080p + // No need to get higher than hd720, as it only will eat bandwith and do nothing for sound quality + if ( urlString.indexOf( "quality=hd720" ) !== -1 ) + { + return 192; + } + else if ( urlString.indexOf( "quality=medium" ) !== -1 ) + { + return 128; + } + else if ( urlString.indexOf( "quality=small" ) !== -1 ) + { + return 96; + } + // Probably + return 128; + }, + + getTrack: function ( trackTitle, origTitle, isSearch ) + { + if ( ( this.includeCovers === false || this.includeCovers === undefined ) && trackTitle.search( /(\Wcover(?!(\w)))/i ) !== -1 && origTitle.search( /(\Wcover(?!(\w)))/i ) === -1 ) + { + return null; + } + // Allow remix:es in search results? + if ( isSearch === undefined ) + { + if ( ( this.includeRemixes === false || this.includeRemixes === undefined ) && trackTitle.search( /(\W(re)*?mix(?!(\w)))/i ) !== -1 && origTitle.search( /(\W(re)*?mix(?!(\w)))/i ) === -1 ) + { + return null; + } + } + if ( ( this.includeLive === false || this.includeLive === undefined ) && trackTitle.search( /(live(?!(\w)))/i ) !== -1 && origTitle.search( /(live(?!(\w)))/i ) === -1 ) + { + return null; + } + else + { + return trackTitle; + } + }, + + cleanupAndParseTrack: function( title, searchString ) + { + var result = {}; + // For the ease of parsing, remove these + // Maybe we could up the score a bit? + if ( title.regexIndexOf( /(?:[([](?=(official))).*?(?:[)\]])|(?:(official|video)).*?(?:(video))/i, 0 ) !== -1 ) + { + title = title.replace( /(?:[([](?=(official|video))).*?(?:[)\]])/gi, "" ); + title = title.replace( /(official|video(?:([!:-])))/gi, "" ); + result.isOfficial = 1; + } + result.query = title; + // Sometimes users separate titles with quotes : + // eg, "\"Young Forever\" Jay Z | Mr. Hudson (OFFICIAL VIDEO)" + // this will parse out the that title + var inQuote = title.match( /([""'])(?:(?=(\\?))\2.).*\1/g ); + if ( inQuote && inQuote !== undefined ) + { + result.track = inQuote[0].substr( 1, inQuote[0].length - 2 ); + title = title.replace( inQuote[0], '' ); + result.fromQuote = result.track; + result.parsed = this.parseCleanTrack( title ); + if ( result.parsed ) + { + result.parsed.track = result.track; + return result.parsed; + } + } + else + { + result.parsed = this.parseCleanTrack( title ); + if ( result.parsed ) + { + return result.parsed; + } + } + + // Still no luck, lets go deeper + if ( !result.parsed ) + { + if ( title.toLowerCase().indexOf( searchString.toLowerCase() ) !== -1 ) + { + result.parsed = this.parseCleanTrack( title.replace( RegExp( searchString, "gi" ), searchString.concat( " :" ) ) ); + } + else + { + var tryMatch = searchString.replace( /(?:[-–—|:&])/g, " " ); + if ( title.toLowerCase().indexOf( tryMatch.toLowerCase() ) !== -1 ) + { + var replaceWith; + if ( title.regexIndexOf( /(?:[-–—|:&])/g, 0 ) !== -1 ) + { + replaceWith = searchString; + } + else + { + replaceWith = searchString.concat( " : " ); + } + result.parsed = this.parseCleanTrack( title.replace( RegExp( tryMatch, "gi" ), replaceWith ) ); + } + } + } + + if ( result.fromQuote && result.fromQuote !== undefined ) + { + if ( result.parsed ) + { + result.artist = result.parsed.artist; + } + result.track = result.fromQuote; + } + else if ( result.parsed ) + { + if ( result.parsed.artist !== undefined ) + { + result.artist = result.parsed.artist; + } + if ( result.parsed.track !== undefined ) + { + result.track = result.parsed.track; + } + } + delete result.parsed; + return result; + }, + + parseCleanTrack: function( track ) + { + var result = {}; + result.query = track; + that = this; + result.query.replace( /.*?(?=([-–—:|]\s))/g, function ( param ) { + if ( param.trim() !== "" ) + { + if ( result.artist === undefined ) + { + result.artist = param; + } + else + { + if ( result.track === undefined ) + { + result.track = param; + } + } + } + }); + + result.query.replace( /(?=([-–—:|]\s)).*/g, function ( param ) { + if ( param.trim() !== "" ) + { + if ( param.regexIndexOf( /([-–—|:]\s)/g, 0 ) === 0 ) + { + if ( result.track === undefined ) + { + result.track = param.replace( /([-–—|:]\s)/g, "" ); + } + } + else + { + if ( result.artist === undefined ) + { + result.artist = param; + } + result.track = result.replace( /([-–—|:]\s)/g, "" ); + } + } + }); + + if ( result.track !== undefined && result.artist !== undefined ) + { + // Now, lets move featuring to track title, where it belongs + var ftmatch = result.artist.match( /(?:(\s)(?=(feat.|feat|ft.|ft|featuring)(?=(\s)))).*/gi ); + if ( ftmatch ) + { + result.artist = result.artist.replace( ftmatch, "" ); + result.track += " " + ftmatch; + } + // Trim + result.track = result.track.replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,' ' ); + result.artist = result.artist.replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,' ' ); + return result; + } + return null; + }, + + parseURLS: function( rawUrls ) + { + var parsedUrls = new Array(); + var urls = decodeURIComponent( decodeURIComponent( rawUrls ) ); + // Youtube changes the start delimiter randomly + var matches = urls.match( /^((.+?)(=))/ ); + if ( matches ) { + // split the decoded urls by matches[0] delimiter, separated by comma + var urlArray = urls.split( RegExp( "," + matches[0], "i" ) ); + for ( var i = 0; i < urlArray.length; i++ ) + { + var url; + if ( matches[0] != "url=" ) + { + // Delimiter isnt url=, we need to sort the params + url = ( urlArray[i] != urlArray[0] ) ? matches[0] + urlArray[i] : urlArray[i]; + var urlMatch = url.match( /(.+?)(url=)(.+?)(\?)(.+)/ ); + // Base & Params + url = urlMatch[3]+urlMatch[4] + "&" + urlMatch[1]+urlMatch[5]; + } + else + { + // Just replace url= + url = urlArray[i].replace( /^url=/, "" ); + } + // itag is found twice, we need to remove that (last occurence) + var itagMatch = url.match( /(.*)(itag=\d+&)(.*?)/ ); + url = url.replace(/(.*)(itag=\d+&)(.*?)/, itagMatch[1] + itagMatch[3] ); + + // Sig needs to be sigature + url = url.replace( /sig=/, "signature=" ); + var type; + try { + // Parse out the type and codec, encode it + // May have an quality effect + type = url.match( /(&type=)(.+?)(&)/i ); + url = url.replace( /(&type=)(.+?)(&)/, type[1] + encodeURIComponent( type[2] ) + type[3] ); + } + catch ( e ) { + try { + // Type is on the end of the url + type = url.match( /(&type=)(.*?)/i ); + type = type[1] + encodeURIComponent( type[1] ) + type[2]; + url = url.replace( /(&type=)(.*)/, type ); + } + catch ( e ) { + this.debugMsg( "Critical: Cannot parse out type in url" + e + "\nUrl: "+ url ); + } + } + + if ( url.regexIndexOf( /quality=(hd720|high|medium|small)/i, 0 ) !== -1 ) + { + parsedUrls.push( url ); + } + } + + var finalUrl; + + if ( this.qualityPreference === undefined ) + { + // This shouldnt happen really, but sometimes do?! + this.qualityPreference = 0; + this.debugMsg( "Critical: Failed to set qualitypreference in init, resetting to " + this.qualityPreference ); + } + + for ( i = 0; i < parsedUrls.length; i++ ) + { + if ( this.hasPreferredQuality( parsedUrls[i] ) ) + { + finalUrl = parsedUrls[i]; + } + } + + if ( finalUrl === undefined ) + { + finalUrl = parsedUrls[0]; + } + + if ( finalUrl && finalUrl !== undefined ) + { + return finalUrl; + } + } + return null; + }, + + resolve: function( qid, artist, album, title ) + { + this.resolveMode = true; + var query; + if ( artist !== "" ) + { + query = encodeURIComponent( artist ) + "%20"; + } + if ( title !== "" ) + { + query += encodeURIComponent( title ); + } + var apiQuery = "https://www.googleapis.com/youtube/v3/search?part=snippet&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=10&order=relevance&type=video&q=" + query.replace( /\%20/g, '\+' ); + if ( this.hatchet ) + { + apiQuery += "&videoEmbeddable=true"; + } + var that = this; + var empty = { + results: [], + qid: qid + }; + Tomahawk.asyncRequest( apiQuery, function( xhr ) { + var results = []; + var resp = JSON.parse( xhr.responseText ); + if ( resp.pageInfo.totalResults !== 0 && resp.items !== undefined ) + { + var limit = Math.min( 10, resp.pageInfo.totalResults ); + for ( var i = 0; i < limit; i++ ) + { + var responseItem = resp.items[i]; + if ( responseItem === undefined ) + { + continue; + } + var responseTitle = responseItem.snippet.title.toLowerCase(); + // Check whether the artist and title (if set) are in the returned title, discard otherwise + if ( responseTitle !== undefined && responseTitle.indexOf( artist.toLowerCase() ) === -1 || + ( title !== "" && responseTitle.toLowerCase().indexOf( title.toLowerCase() ) === -1 ) ) + { + // Lets do a deeper check + // Users tend to insert [ft. Artist] or **featuring Artist & someOther artist + // Remove these + var newTitle = that.magicCleanup( title ); + var newArtist = that.magicCleanup( artist ); + var newRespTitle = that.magicCleanup( responseTitle ); + + if ( newRespTitle !== undefined && newRespTitle.indexOf( newArtist ) === -1 || + ( newTitle !== "" && newRespTitle.indexOf( newTitle ) === -1 ) ) + { + // Lets do it in reverse! + if ( newArtist.indexOf( newTitle ) === -1 && newTitle.indexOf( newArtist ) === -1 ) + { + continue; + } + } + } + if ( that.getTrack( responseTitle, title ) ) + { + var result = new Object(); + if ( artist !== "" ) + { + result.artist = artist; + } + result.source = that.settings.name; + result.mimetype = "video/h264"; + result.score = 0.85; + result.year = responseItem.snippet.publishedAt.slice( 0, 4 ); + result.track = title; + result.youtubeId = responseItem.id.videoId; + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.id = i; + if ( that.qualityPreference === 0 ) + { + result.linkUrl += "&hd=1"; + } + results.push( result ); + } + } + if (results.length === 0) { // if no results had appropriate titles, return empty + that.sendEmptyResult(); + } + else + { + if ( that.hatchet ) + { + Tomahawk.addTrackResults( { qid: qid, results: [that.getMostRelevant( results )] } ); + } + that.getMetadata( qid, results ); + } + } + else + { + that.sendEmptyResult(); + } + }); + }, + + getCandidates: function( qid, searchString ) + { + var queryUrl = "https://www.googleapis.com/youtube/v3/search?part=snippet&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=50&order=relevance&type=video&q=" + encodeURIComponent( searchString ).replace( /\%20/g, '\+' ); + if ( this.hatchet ) + { + queryUrl += "&videoEmbeddable=true"; + } + var that = this; + Tomahawk.asyncRequest( queryUrl, function( xhr ){ + var resp = JSON.parse( xhr.responseText ); + var results = new Array(); + if ( resp.pageInfo.totalResults !== 0 ) + { + var total = resp.items.length; + for ( var i = 0; i < total; i++ ) + { + if ( resp.items[i] === undefined ) + { + continue; + } + if ( resp.items[i].id === undefined || resp.items[i].id.videoId === undefined ) + { + continue; + } + if ( resp.items[i].snippet === undefined || resp.items[i].snippet.title === undefined || resp.items[i].snippet.description === undefined ) + { + continue; + } + // Dirty check, filters out the most of the unwanted results + var searchFoundItem = resp.items[i].snippet.title.replace( /([^A-Za-z0-9\s])/gi, "" ).replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,'|' ); + var searchStringItem = searchString.replace( /([^A-Za-z0-9\s])/gi, "" ).replace( /(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'' ).replace( /\s+/g,'|' ); + var matches = searchFoundItem.match( RegExp( searchStringItem, "gi" ) ); + if ( !matches ) + { + continue; + } + var track = resp.items[i].snippet.title; + var parsedTrack = that.cleanupAndParseTrack( track, searchString ); + + if ( !parsedTrack || parsedTrack.artist === undefined || parsedTrack.track === undefined ) + { + continue; + } + var result = new Object(); + result.artist = parsedTrack.artist; + result.track = parsedTrack.track; + result.youtubeId = resp.items[i].id.videoId; + result.year = resp.items[i].snippet.publishedAt.slice( 0, 4 ); + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.mimetype = "video/h264"; + result.score = (parsedTrack.isOfficial !== undefined ? 0.85 : 0.95); + results.push( result ); + } + } + if ( results.length === 0 ) + { + that.sendEmptyResult( qid, searchString ); + } + else + { + that.verify( qid, results ); + } + } ); + }, + + verify: function( qid, candidates ) + { + var verified = []; + var total = candidates.length; + candidates.forEach( function( candidate ){ + var trackLookupUrl = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent( candidate.artist ) + "&track=" + encodeURIComponent( candidate.track ); + Tomahawk.asyncRequest( trackLookupUrl, function( xhr ){ + var response = JSON.parse( xhr.responseText ); + if ( response.track !== undefined && response.track.name !== undefined && response.track.artist.name !== undefined ) + { + if ( response.track.name.toLowerCase() === candidate.track.toLowerCase() && response.track.artist.name.toLowerCase() === candidate.artist.toLowerCase() ) + { + verified.push( candidate ); + } + } + else + { + if( response.track !== undefined ) + { + that.debugMsg( "Bad track name? " + trackLookupUrl + ": " + JSON.stringify( response.track ) ); + } + else + { + that.debugMsg( "Bad result from track lookup? " + trackLookupUrl + ": " + JSON.stringify( response ) ); + } + } + total--; + if ( total === 0 ) + { + that.getMetadata( qid, verified ); + } + } ); + } ); + }, + + getMetadata: function( qid, results ) + { + + var queryUrl = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&id="; + results.forEach( function( result ){ + queryUrl += result.youtubeId + ","; + } ); + queryUrl = queryUrl.substring( 0, queryUrl.length - 1 ); + var that = this; + Tomahawk.asyncRequest( queryUrl, function( xhr ){ + var response = JSON.parse( xhr.responseText ); + results.forEach( function( result ){ + for ( var i = 0; i < response.items.length; i++ ) + { + if ( response.items[i].id == result.youtubeId ) + { + result.name = that.settings.name; + result.duration = that.iso8601toSeconds( response.items[i].contentDetails.duration ); + } + } + } ); + that.parseVideoUrlFromYtPages( qid, results ); + } ); + }, + + parseVideoUrlFromYtPages: function( qid, results ) + { + var that = this; + var total = results.length; + results.forEach( function( result ){ + Tomahawk.asyncRequest( result.linkUrl, function( xhr ){ + var html = xhr.responseText; + var url; + // First, lets try and find the stream_map at top of the page + // to save some time going to the end and do JSON.parse on the yt.config + var streamMatch = html.match( /(url_encoded_fmt_stream_map=)(.*?)(?=(\\u0026amp))/i ); + if ( streamMatch && streamMatch[2] !== undefined ) + { + var parsed = this.parseURLS( streamMatch[2] ); + if ( parsed ) + { + url = parsed; + } + else + { + this.debug( "Hm, failed to parse urls from top of the page" ); + } + } + // Now we can go further down, and check the ytplayer.config map + streamMatch = html.match( /(ytplayer\.config =)([^\r\n]+?\});/ ); + if ( !streamMatch ) + { + // Todo: Open window for user input? + var dasCaptcha = html.match( /www.google.com\/recaptcha\/api\/challenge?/i ); + if ( dasCaptcha ) + { + that.debugMsg( "Failed to parse url from youtube page. Captcha limitation in place." ); + } + else + { + that.debugMsg( "Failed to find stream_map in youtube page." ); + } + } + if ( streamMatch && streamMatch[2] !== undefined ) + { + try { + var jsonMap = JSON.parse( streamMatch[2] ); + if ( jsonMap.args.url_encoded_fmt_stream_map !== undefined ) + { + parsed = that.parseURLS( jsonMap.args.url_encoded_fmt_stream_map ); + if ( parsed ) + { + url = parsed; + } + } + } + catch ( e ) { + that.debugMsg( "Critical: " + e ); + } + } + if ( url ) + { + result.url = url; + result.bitrate = that.getBitrate( url ); + var expires = result.url.match( /expire=([0-9]+)(?=(&))/ ); + if ( expires && expires[1] !== undefined) + { + result.expires = Math.floor( expires[1] ); + } + } + total--; + if ( total === 0 ) + { + var toReturn = {qid: qid, results: results}; + if ( that.resolveMode ) + { + toReturn.results = [that.getMostRelevant( results )]; + } + Tomahawk.addTrackResults( toReturn ); + } + } ); + } ); + }, + + search: function( qid, searchString ) + { + this.getCandidates( qid, searchString ); + } +} ); + +Tomahawk.resolver.instance = YoutubeResolver; \ No newline at end of file From f11ef46a39c679b2f536c62774eec021a7ea4be7 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Thu, 9 Oct 2014 15:17:20 +0200 Subject: [PATCH 319/597] Make sure code execution stops after returning results in hatchet mode. --- youtube/content/contents/code/youtube.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index 736db00a7..b8806fe72 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -593,7 +593,10 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { { Tomahawk.addTrackResults( { qid: qid, results: [that.getMostRelevant( results )] } ); } - that.getMetadata( qid, results ); + else + { + that.getMetadata( qid, results ); + } } } else @@ -813,4 +816,4 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { } } ); -Tomahawk.resolver.instance = YoutubeResolver; \ No newline at end of file +Tomahawk.resolver.instance = YoutubeResolver; From f7690ebf5fd192cc54f1a5110f5fe1892cc3af30 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Thu, 9 Oct 2014 16:00:27 +0200 Subject: [PATCH 320/597] Change key of Video Id to youtubeVideoId. --- youtube/content/contents/code/youtube.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index b8806fe72..a9affa049 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -574,8 +574,8 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { result.score = 0.85; result.year = responseItem.snippet.publishedAt.slice( 0, 4 ); result.track = title; - result.youtubeId = responseItem.id.videoId; - result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.youtubeVideoId = responseItem.id.videoId; + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeVideoId; result.id = i; if ( that.qualityPreference === 0 ) { @@ -652,9 +652,9 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { var result = new Object(); result.artist = parsedTrack.artist; result.track = parsedTrack.track; - result.youtubeId = resp.items[i].id.videoId; + result.youtubeVideoId = resp.items[i].id.videoId; result.year = resp.items[i].snippet.publishedAt.slice( 0, 4 ); - result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeId; + result.linkUrl = "https://www.youtube.com/watch?v=" + result.youtubeVideoId; result.mimetype = "video/h264"; result.score = (parsedTrack.isOfficial !== undefined ? 0.85 : 0.95); results.push( result ); @@ -711,7 +711,7 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { var queryUrl = "https://www.googleapis.com/youtube/v3/videos?part=contentDetails&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&id="; results.forEach( function( result ){ - queryUrl += result.youtubeId + ","; + queryUrl += result.youtubeVideoId + ","; } ); queryUrl = queryUrl.substring( 0, queryUrl.length - 1 ); var that = this; @@ -720,7 +720,7 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { results.forEach( function( result ){ for ( var i = 0; i < response.items.length; i++ ) { - if ( response.items[i].id == result.youtubeId ) + if ( response.items[i].id == result.youtubeVideoId ) { result.name = that.settings.name; result.duration = that.iso8601toSeconds( response.items[i].contentDetails.duration ); From de9042fe37764eb76c28ae445bfd47bd9820b4e4 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 11 Oct 2014 04:09:09 +0200 Subject: [PATCH 321/597] * Fixed beats config layout. --- beatsmusic/content/contents/code/config.ui | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/beatsmusic/content/contents/code/config.ui b/beatsmusic/content/contents/code/config.ui index b90db7849..f7bc5f1e6 100644 --- a/beatsmusic/content/contents/code/config.ui +++ b/beatsmusic/content/contents/code/config.ui @@ -6,22 +6,22 @@ 0 0 - 331 - 200 + 536 + 174 - - - 331 - 200 - - Form + + + 0 + 0 + + beatsmusic-wide.png From 2558f68131596fa16b7a32ce32ebc4d1751e244c Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Sun, 12 Oct 2014 16:11:27 -0400 Subject: [PATCH 322/597] Update README.md Add link to nightly axes --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f40c6615e..155f1a32e 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ To manually install a resolver either After you have the files locally, open Tomahawk's preferences and from the "Services" tab click "Install from File" and select the .axe or .js file for the resolver you are installing. -Since March 2013 Tomahawk resolvers have switched to a new directory structure for easy packaging. Ideally, you should download nightly .axe files, if available. +Since March 2013 Tomahawk resolvers have switched to a new directory structure for easy packaging. Ideally, you should download [nightly .axe files](http://teom.org/axes/nightly/), if available. For developer documentation, see [HACKING.md](HACKING.md). From 1c37f4fadffdf96ddba8a7e63ac365dc34a64152 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 13 Oct 2014 03:54:38 +0200 Subject: [PATCH 323/597] Switched to :key: for services requiring authentication. --- README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 155f1a32e..8041f6af7 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Some of the features need authentication (e.g. being a premium subscriber to thi **Legend:** * ✔ - Supports without authentication -* :lock: - Authentication required +* :key: - Authentication required * ? - Unknown * ✘ - No support for this capability @@ -39,25 +39,25 @@ Some of the features need authentication (e.g. being a premium subscriber to thi |------------|-----------|--------|-----------------|----------------|-------------------|----------------|------------| | 4shared | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | 8tracks | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| ampache | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | -| beatsmusic | :lock: | ✔ | ✔ | ✔ | :lock: | ✔ | ✘ | -| beets | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | +| ampache | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | +| beatsmusic | :key: | ✔ | ✔ | ✔ | :key: | ✔ | ✘ | +| beets | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | | deezer-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | | dilandu | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | exfm | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✘ | -| grooveshark | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✘ | +| grooveshark | :key: | :key: | ✘ | ✘ | ✘ | ✘ | ✘ | | jamendo | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | jazz-on-line | ? | ? | ? | ? | ? | ? | ? | | lastfm | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | | muzebra | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | officialfm | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| qobuz | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | ✘ | +| qobuz | :key: | :key: | ✘ | ✘ | ✘ | ✘ | ✘ | | rdio-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | | soundcloud | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | | spotify-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | -| spotify | :lock: | :lock: | ✘ | ✘ | :lock: | ✘ | ✘ | -| subsonic | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | -| synology-audiostation | :lock: | :lock: | ✘ | ✘ | ✘ | ✘ | :lock: | +| spotify | :key: | :key: | ✘ | ✘ | :key: | ✘ | ✘ | +| subsonic | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | +| synology-audiostation | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | | tomahk-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | | vibe3 | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | vkontakte | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | From ad5292e070281fe7cc964f533fc8300a2f117d2c Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Mon, 13 Oct 2014 04:00:09 +0200 Subject: [PATCH 324/597] Fixed table layout. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8041f6af7..ba4bb42b6 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ Some of the features need authentication (e.g. being a premium subscriber to thi * **Search**: (Fuzzily) find tracks, artists and albums on all services matching a query that can be streamed. * **Open Artist URL**: Given an URL about an artist of a service, return the information about that. (This opens the artist page in Tomahawk). * **Open Album URL**: Given an URL about an album of a service, return the information about that. (This opens the album page in Tomahawk). -* **Open Playlist URL**: Given an URL about a playlist of a service, return the information about that. (This imports the playlist in Tomahawk if it was not previously imported) +* **Open Playlist**: Given an URL about a playlist of a service, return the information about that. (This imports the playlist in Tomahawk if it was not previously imported) * **Open Track URL**: Given an URL about a track of a service, return the information about that. (This opens the track page in Tomahawk and plays it). * **Collection**: Browse the collection of music stored by the user in this service. @@ -35,8 +35,8 @@ Some of the features need authentication (e.g. being a premium subscriber to thi **Notes:** * Some services can search without being authenticated but only resolve after authentication. At the moment, we do not support this in Tomahawk but this may change in future. -| *Resolver* | Resolving | Search | Open Artist URL | Open Album URL | Open Playlist URL | Open Track URL | Collection | -|------------|-----------|--------|-----------------|----------------|-------------------|----------------|------------| +| *Resolver* | Resolving | Search | Open Artist URL | Open Album URL | Open Playlist | Open Track URL | Collection | +|:----------:|:---------:|:------:|:---------------:|:--------------:|:-------------:|:--------------:|:----------:| | 4shared | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | 8tracks | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | ampache | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | From 96833396eaa7d4dc923b346d5e847f566ca4c0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20H=C3=BCbschle-Schneider?= Date: Mon, 13 Oct 2014 14:40:47 +0200 Subject: [PATCH 325/597] [vibe3] add link to search result page as icon click action Also style fixes. This isn't Tomahawk C++ code :) --- vibe3/content/contents/code/vibe3.js | 10 ++++++---- vibe3/content/metadata.json | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/vibe3/content/contents/code/vibe3.js b/vibe3/content/contents/code/vibe3.js index 087445761..eece0614b 100644 --- a/vibe3/content/contents/code/vibe3.js +++ b/vibe3/content/contents/code/vibe3.js @@ -88,7 +88,9 @@ var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { xmlDoc = domParser.parseFromString(xhr.responseText, "text/html"), tracks = xmlDoc.getElementsByTagName("li"), track, rawUrl, mp3url, artist, track_title, i, - results = []; + results = [], + encodedQuery = encodeURIComponent(query.replace(" ", "_").toLowerCase()), + linkUrl = "http://vibe3.com/mp3/" + encodedQuery + ".html"; // check the response for (i = 0; i < tracks.length; i++) { @@ -103,13 +105,13 @@ var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { // Trim away the artist-title-separator and extra spaces track_title = track_title.replace(' - ', '').trim(); - if ( artist !== "" && track_title !== "" && mp3url !== "" ) - { + if (artist !== "" && track_title !== "" && mp3url !== "") { results.push({ artist: artist, track: track_title, source: that.settings.name, url: mp3url, + linkUrl: linkUrl, extension: 'mp3', bitrate: 128, score: 0.80 @@ -137,7 +139,7 @@ var Vibe3Resolver = Tomahawk.extend(TomahawkResolver, { Tomahawk.reportStreamUrl(qid, url, headers); }, search: function (qid, searchString) { - this.resolve( qid, searchString ); + this.resolve(qid, searchString); } }); diff --git a/vibe3/content/metadata.json b/vibe3/content/metadata.json index 3ef4fc587..610f3c113 100644 --- a/vibe3/content/metadata.json +++ b/vibe3/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "vibe3", "author": "Lorenz Hübschle-Schneider and Thierry Göckel", "email": "lorenz@4z2.de", - "version": "0.1.1", + "version": "0.1.2", "website": "http://gettomahawk.com", "description": "Looks for tracks to play from www.vibe3.com.", "type": "resolver/javascript", From 6e792fc35dcc8d43187d8dbfb44a46996946b33b Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Tue, 14 Oct 2014 16:52:04 +0200 Subject: [PATCH 326/597] Fix logging of empty result during resolve. --- youtube/content/contents/code/youtube.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/youtube/content/contents/code/youtube.js b/youtube/content/contents/code/youtube.js index a9affa049..eb04b2e45 100644 --- a/youtube/content/contents/code/youtube.js +++ b/youtube/content/contents/code/youtube.js @@ -585,7 +585,7 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { } } if (results.length === 0) { // if no results had appropriate titles, return empty - that.sendEmptyResult(); + that.sendEmptyResult( qid, artist + " - " + title ); } else { @@ -601,7 +601,7 @@ var YoutubeResolver = Tomahawk.extend( TomahawkResolver, { } else { - that.sendEmptyResult(); + that.sendEmptyResult( qid, artist + " - " + title ); } }); }, From 03dc2737d0cc59bf2767876d20c936c057b2fa68 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Wed, 15 Oct 2014 22:11:40 +0200 Subject: [PATCH 327/597] Version bump --- youtube/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/youtube/content/metadata.json b/youtube/content/metadata.json index 30759e1c0..307e60e5e 100644 --- a/youtube/content/metadata.json +++ b/youtube/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "youtube", "author": "Hugo, Leo and Thierry", "email": "lfranchi@kde.org", - "version": "0.9.12", + "version": "0.9.13", "website": "http://gettomahawk.com", "description": "Searches YouTube for audio content to play.", "type": "resolver/javascript", From fb9a9be088ebb482432e735465a3acd7b4fdcae5 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 18 Oct 2014 17:17:29 +0200 Subject: [PATCH 328/597] [test] Split helper function into two --- test/utils.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/utils.js b/test/utils.js index 3285b966e..261086c80 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,9 +1,8 @@ var fs = require('fs'); var TomahawkJS = require("tomahawkjs"); -module.exports.loadResolver = function (name, owner, done, config) { - owner.metadata = JSON.parse(fs.readFileSync(name + '/content/metadata.json')) - TomahawkJS.loadAxe(name + '/' + name + '-' + owner.metadata.version + '.axe', function(err, axe) { +module.exports.loadAxe = function(path, owner, done, config) { + TomahawkJS.loadAxe(path, function(err, axe) { axe.getInstance(function(err, instance_context) { owner.instance = instance_context.instance; owner.context = instance_context.context; @@ -19,3 +18,8 @@ module.exports.loadResolver = function (name, owner, done, config) { }); }; +module.exports.loadResolver = function (name, owner, done, config) { + owner.metadata = JSON.parse(fs.readFileSync(name + '/content/metadata.json')) + module.exports.loadAxe(name + '/' + name + '-' + owner.metadata.version + '.axe', owner, done, config); +}; + From 8c5b833bca5a4fa2125fcdde99f5fdb9ed45ff27 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 18 Oct 2014 17:17:45 +0200 Subject: [PATCH 329/597] [tools] Add small resolve tester --- tools/resolve.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tools/resolve.js diff --git a/tools/resolve.js b/tools/resolve.js new file mode 100644 index 000000000..54ffc0501 --- /dev/null +++ b/tools/resolve.js @@ -0,0 +1,36 @@ +var argv = require('minimist')(process.argv.slice(2)); +var utils = require('../test/utils.js'); + +if (argv._.length < 1) { + console.error("Please specify a single resolver"); + process.exit(1); +} + +if (argv._.length < 3) { + console.error("You need to specify at least an artist and a track for resolving."); + process.exit(1); +} + +// We use the string argument as the path to the resolver. +var resolverPath = argv._[0]; +var artist = argv._[1]; +var track = argv._[2]; +var album = ""; + +if (argv._.length > 3) { + album = argv._[3]; +} + +// All -/-- arguments will be added to the config. +// TODO: Add an agurment to load the config from a file. +var resolverConfig = argv; +delete resolverConfig._; + +var resolver = {}; + +utils.loadAxe(resolverPath, resolver, function () { + resolver.context.on('track-result', function (qid, result) { + console.dir(result); + }); + resolver.instance.resolve("qid", artist, album, track); +}, resolverConfig); From aa03c4c6354c3334da7d5d80d959f26817da852d Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 18 Oct 2014 17:19:00 +0200 Subject: [PATCH 330/597] Add minimist as node dependency --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index bf27406f3..7c1c749c1 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "homepage": "https://github.com/tomahawk-player/tomahawk-resolvers", "dependencies": { "buster": "^0.7.13", + "minimist": "^1.1.0", "nock": "^0.32.0", "tomahawkjs": "^0.3.2" } From 26ef0c4b56be5aab66facd5db817380fe7007b0c Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 19 Oct 2014 16:50:40 +0200 Subject: [PATCH 331/597] [beatsmusic] Style fix --- beatsmusic/content/contents/code/beatsmusic.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 9da1ff07a..18736f265 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -55,8 +55,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { newConfigSaved: function () { var userConfig = this.getUserConfig(); - if (this.user !== userConfig.user || this.password !== userConfig.password) - { + if (this.user !== userConfig.user || this.password !== userConfig.password) { this.init(); } }, From d8eab8e95654b03689b5038b917ec7ec1177d942 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 19 Oct 2014 19:01:51 +0200 Subject: [PATCH 332/597] [beatsmusic] Readbility++ --- .../content/contents/code/beatsmusic.js | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 18736f265..628440ca2 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -120,18 +120,35 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { this.login(cb); }, + apiRequest: function (path, queryArgs, cb) { + var queryArray = ["client_id=" + this.app_token]; + for (key in queryArgs) { + queryArray.push(key + "=" + queryArgs[key]); + } + var url = this.endpoint + "/api" + path; + url += "?" + queryArray.join("&"); + Tomahawk.asyncRequest(url, function (xhr) { + var res = JSON.parse(xhr.responseText); + if (res.code == "OK") { + cb(res, xhr); + } + }); + }, resolve: function (qid, artist, album, title) { if (!this.loggedIn) return; // TODO: Add album to search var that = this; - Tomahawk.asyncRequest(this.endpoint + "/api/search?type=track&filters=streamable:true&limit=1&q=" + encodeURIComponent(artist + " " + title) + "&client_id=" + this.app_token, function (xhr) { - var res = JSON.parse(xhr.responseText); - if (res.code == "OK" && res.info.count > 0) { + this.apiRequest("/search", { + "type": "track", + "filters": "streamable:true", + "limit": "1", + "q": encodeURIComponent(artist + " " + title) + }, function (res) { + if (res.info.count > 0) { // For the moment we just use the first result - Tomahawk.asyncRequest(that.endpoint + "/api/tracks/" + res.data[0].id + "?client_id=" + that.app_token, function (xhr2) { - var res2 = JSON.parse(xhr2.responseText); + that.apiRequest("/tracks/" + res.data[0].id, {}, function (res2) { Tomahawk.addTrackResults({ qid: qid, results: [{ From 5922c129fc4087fb7cd512e17d4dfb4ed711ba0f Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 19 Oct 2014 19:02:24 +0200 Subject: [PATCH 333/597] [beatsmusic] no tabs, please --- beatsmusic/content/contents/code/beatsmusic.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 628440ca2..3c36d3d48 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -107,7 +107,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, - init: function(cb) { + init: function(cb) { this.app_token = this.spell("s4fw8if4jfwxakawi7xud55c"); Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); @@ -118,7 +118,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { setInterval((function(self) { return function() { self.login(); }; })(this), 1000*60*50); this.login(cb); - }, + }, apiRequest: function (path, queryArgs, cb) { var queryArray = ["client_id=" + this.app_token]; From 1364aaed821b1694e9b05f46dc0d660625400ce2 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Thu, 23 Oct 2014 18:36:33 -0400 Subject: [PATCH 334/597] Update description of Spotify resolver to remove reference to syncing --- spotify/spotify.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spotify/spotify.desktop b/spotify/spotify.desktop index 2e08d6c57..b3b2ead7a 100644 --- a/spotify/spotify.desktop +++ b/spotify/spotify.desktop @@ -1,6 +1,6 @@ [Desktop Entry] Name=Spotify -Comment=Play your music from and sync your playlists with Spotify. Requires a Premium account. +Comment=Stream music from Spotify. Requires a Premium account. Type=Service X-KDE-ServiceTypes=Tomahawk/BinaryResolver From ff0b74edebf12b8dd3cc772d5dda64e557263851 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 27 Oct 2014 09:34:17 -0400 Subject: [PATCH 335/597] Capitalize Rdio --- rdio-metadata/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdio-metadata/content/metadata.json b/rdio-metadata/content/metadata.json index b9b45393b..d042a74a9 100644 --- a/rdio-metadata/content/metadata.json +++ b/rdio-metadata/content/metadata.json @@ -1,5 +1,5 @@ { - "name": "rdio Metadata", + "name": "Rdio Metadata", "pluginName": "rdio-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", From a5eef72e928a74fbb87fbf53c68af8e6f7a25e4c Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Mon, 27 Oct 2014 15:58:55 +0100 Subject: [PATCH 336/597] [tools] Add URLLookup tool --- tools/urllookp.js | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 tools/urllookp.js diff --git a/tools/urllookp.js b/tools/urllookp.js new file mode 100644 index 000000000..0e7f3340e --- /dev/null +++ b/tools/urllookp.js @@ -0,0 +1,40 @@ +var argv = require('minimist')(process.argv.slice(2)); +var utils = require('../test/utils.js'); + +if (argv._.length < 1) { + console.error("Please specify a single resolver"); + process.exit(1); +} + +if (argv._.length < 2) { + console.error("You need to specify an URL which shall be looked up."); + process.exit(1); +} + +// We use the string argument as the path to the resolver. +var resolverPath = argv._[0]; +var url = argv._[1]; + +// All -/-- arguments will be added to the config. +// TODO: Add an agurment to load the config from a file. +var resolverConfig = argv; +delete resolverConfig._; + +var resolver = {}; + +utils.loadAxe(resolverPath, resolver, function () { + if (!resolver.context.hasCapability('urllookup')) { + console.error("Resolver does not support URLLookup."); + } else { + resolver.context.on('url-result', function (url, result) { + console.dir(result); + }); + + if (resolver.instance.canParseUrl(url)) { + resolver.instance.lookupUrl(url); + } else { + console.error("Resolver cannot lookup URLs of the given type."); + } + } +}, resolverConfig); + From 7a79966dc41083038c31da3e4f6ee20d7dd453e2 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 27 Oct 2014 15:04:49 -0400 Subject: [PATCH 337/597] Update to new Google Music icon --- gmusic/content/contents/images/icon.png | Bin 83521 -> 41776 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gmusic/content/contents/images/icon.png b/gmusic/content/contents/images/icon.png index d1c7e2e7ca50ac47f224c14fd3c14a0ad7ade5a1..835be0df046cbb37e1fbf16a0509c5a6a502c9c4 100644 GIT binary patch literal 41776 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�iD9gLVvCO;#(&zU(1#H!OmmaB`i9gYiKgPU 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 literal 83521 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�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 sm(H4xG3A-k|ElMhF0NA2H-)$kJf)s+6 za>+@jC`u@0*cAsmwKf?z5boyr=b!!MpZ@88{*O*i@3c7Q+V3;O@0HnsIJjQZH8am# zfATA5XSYB0&ENE8XXKk^wN~6Fp zk$IzF96Q<=Fot_q1(a6I%L1Oc{^Z-=`<}P`5?_xD(tzQPL`!iteOCThGdb?SF z;*D?o6W=zgXUohb4Qa7R%n6W#vo!?~2nt%gnFyuEP)Rdsm9#db5fTDQNeDqbF@gfp zp(~0CFM3!Q=j_i2OfU? z8&-??Vqwc-VU5*^OSuUn-F4@~imAa)>~>25j;DkIf`|=eMH5J>xlz}1(tR=OUK@j) zGNcf=bLaMNz4^^Q^uP1Y|Pb&V&@Sw%Hp6Jy$gmUj%S$m>-H+|zbe$&6RJUV%}sb_!Emi27tHqfR>^V$5WvE@V0io6-}2O6_JqAY(e$3QMElM5SEIx^3|do=ulIhe zLHei6fvf?J0&)HRD}UwNzhQZF{LpNE^t!sNugn&UZ_X)Yk~fGfg#07MXr+`wQPl9> zK`AYK@SFAO^rqHEr5It$Qrx`x+*58C?i7W=qmMoMvG@MkTc76O6!x;vDY#G9>oU8# z3|RMF(9(R+_Jh{+V~O)spXsgm_f`BB7nDoWkCWPZ-=K6V{ioowFRz$5;`>^%{loWa z_G9+@eP%D)vV0v%zJ>+=y4h=S>^JeJ>j!=~?2DzR&l@@T0528?PXthj^9k>?OL{n% zc;HM;F9X(tQyQwhpjGZ=5Y^t{G<%0_KY-!j=ZE;>LskAEn|_*9y1n4^aze&eJ6qWA z_nEz5Z};BQ|4-D6>DtP@Ydu}}jF)aET!dQeuKhLj`YbGuTM)Kg}^5Efcc)tt06#0D7`=Y?V|MAP$Wx#r11DE&% zvMKRZzGwMmdNLOsMjT`Y`89gYzFKeZtNr||UAvdNj_HCd?DBOPupapD!$k)z{{g`Y z7X+TeM*QI+6!*cQJG>t9AbYy#nu$N)y1iVm$7?jWU%oD1m#@p$+*H^x_n)}E?<|gd-(eQ0O|10Q=>PFdjJ3c07*qoM6N<$f|#Pw(EtDd From 6b67ca463b81bc364655c4efe35c36ddce266187 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 28 Oct 2014 00:05:59 +0100 Subject: [PATCH 338/597] Archive old spotify resolver --- {spotify => archive/spotify}/BreakPad.cpp | 0 {spotify => archive/spotify}/BreakPad.h | 0 {spotify => archive/spotify}/CMakeLists.txt | 0 {spotify => archive/spotify}/PlaylistClosure.cpp | 0 {spotify => archive/spotify}/PlaylistClosure.h | 0 {spotify => archive/spotify}/appkey.h | 0 {spotify => archive/spotify}/audiohttpserver.cpp | 0 {spotify => archive/spotify}/audiohttpserver.h | 0 .../spotify}/breakpad/CMakeLists.txt | 0 .../client/apple/Framework/BreakpadDefines.h | 0 .../spotify}/breakpad/client/linux/android_link.h | 0 .../breakpad/client/linux/android_ucontext.h | 0 .../client/linux/crash_generation/client_info.h | 0 .../crash_generation/crash_generation_client.cc | 0 .../crash_generation/crash_generation_client.h | 0 .../crash_generation/crash_generation_server.cc | 0 .../crash_generation/crash_generation_server.h | 0 .../breakpad/client/linux/data/linux-gate-amd.sym | 0 .../breakpad/client/linux/data/linux-gate-intel.sym | 0 .../client/linux/handler/exception_handler.cc | 0 .../client/linux/handler/exception_handler.h | 0 .../linux/handler/exception_handler_unittest.cc | 0 .../spotify}/breakpad/client/linux/log/log.cc | 0 .../spotify}/breakpad/client/linux/log/log.h | 0 .../client/linux/minidump_writer/directory_reader.h | 0 .../minidump_writer/directory_reader_unittest.cc | 0 .../client/linux/minidump_writer/line_reader.h | 0 .../linux/minidump_writer/line_reader_unittest.cc | 0 .../linux/minidump_writer/linux_core_dumper.cc | 0 .../linux/minidump_writer/linux_core_dumper.h | 0 .../minidump_writer/linux_core_dumper_unittest.cc | 0 .../client/linux/minidump_writer/linux_dumper.cc | 0 .../client/linux/minidump_writer/linux_dumper.h | 0 .../minidump_writer/linux_dumper_unittest_helper.cc | 0 .../linux/minidump_writer/linux_ptrace_dumper.cc | 0 .../linux/minidump_writer/linux_ptrace_dumper.h | 0 .../minidump_writer/linux_ptrace_dumper_unittest.cc | 0 .../minidump_writer/minidump_extension_linux.h | 0 .../client/linux/minidump_writer/minidump_writer.cc | 0 .../client/linux/minidump_writer/minidump_writer.h | 0 .../minidump_writer/minidump_writer_unittest.cc | 0 .../linux/sender/google_crash_report_sender.cc | 0 .../client/mac/Breakpad.xcodeproj/project.pbxproj | 0 .../breakpad/client/mac/Framework/Breakpad.h | 0 .../breakpad/client/mac/Framework/Breakpad.mm | 0 .../client/mac/Framework/Breakpad_Prefix.pch | 0 .../breakpad/client/mac/Framework/Info.plist | 0 .../breakpad/client/mac/Framework/OnDemandServer.h | 0 .../breakpad/client/mac/Framework/OnDemandServer.mm | 0 .../breakpad/client/mac/UnitTests-Info.plist | 0 .../client/mac/crash_generation/ConfigFile.h | 0 .../client/mac/crash_generation/ConfigFile.mm | 0 .../client/mac/crash_generation/Inspector.h | 0 .../client/mac/crash_generation/Inspector.mm | 0 .../client/mac/crash_generation/InspectorMain.mm | 0 .../client/mac/crash_generation/client_info.h | 0 .../mac/crash_generation/crash_generation_client.cc | 0 .../mac/crash_generation/crash_generation_client.h | 0 .../mac/crash_generation/crash_generation_server.cc | 0 .../mac/crash_generation/crash_generation_server.h | 0 .../client/mac/handler/breakpad_nlist_64.cc | 0 .../breakpad/client/mac/handler/breakpad_nlist_64.h | 0 .../breakpad/client/mac/handler/dynamic_images.cc | 0 .../breakpad/client/mac/handler/dynamic_images.h | 0 .../client/mac/handler/exception_handler.cc | 0 .../breakpad/client/mac/handler/exception_handler.h | 0 .../breakpad/client/mac/handler/mach_vm_compat.h | 0 .../client/mac/handler/minidump_generator.cc | 0 .../client/mac/handler/minidump_generator.h | 0 .../handler/minidump_test.xcodeproj/project.pbxproj | 0 .../client/mac/handler/minidump_tests32-Info.plist | 0 .../client/mac/handler/minidump_tests64-Info.plist | 0 .../client/mac/handler/obj-cTestCases-Info.plist | 0 .../mac/handler/protected_memory_allocator.cc | 0 .../client/mac/handler/protected_memory_allocator.h | 0 .../mac/handler/testcases/DynamicImagesTests.cc | 0 .../mac/handler/testcases/DynamicImagesTests.h | 0 .../mac/handler/testcases/breakpad_nlist_test.cc | 0 .../mac/handler/testcases/breakpad_nlist_test.h | 0 .../client/mac/handler/testcases/dwarftests.h | 0 .../client/mac/handler/testcases/dwarftests.mm | 0 .../handler/testcases/testdata/dump_syms_dwarf_data | Bin .../testcases/testdata/dump_syms_i386_breakpad.sym | 0 .../breakpad/client/mac/sender/Breakpad.xib | 0 .../mac/sender/English.lproj/InfoPlist.strings | Bin .../mac/sender/English.lproj/Localizable.strings | Bin .../breakpad/client/mac/sender/ReporterIcon.graffle | 0 .../mac/sender/crash_report_sender-Info.plist | 0 .../client/mac/sender/crash_report_sender.h | 0 .../client/mac/sender/crash_report_sender.icns | Bin .../client/mac/sender/crash_report_sender.m | 0 .../client/mac/sender/da.lproj/InfoPlist.strings | Bin .../client/mac/sender/da.lproj/Localizable.strings | Bin .../client/mac/sender/de.lproj/InfoPlist.strings | Bin .../client/mac/sender/de.lproj/Localizable.strings | Bin .../client/mac/sender/es.lproj/InfoPlist.strings | Bin .../client/mac/sender/es.lproj/Localizable.strings | Bin .../client/mac/sender/fr.lproj/InfoPlist.strings | Bin .../client/mac/sender/fr.lproj/Localizable.strings | Bin .../spotify}/breakpad/client/mac/sender/goArrow.png | Bin .../client/mac/sender/it.lproj/InfoPlist.strings | Bin .../client/mac/sender/it.lproj/Localizable.strings | Bin .../client/mac/sender/ja.lproj/InfoPlist.strings | Bin .../client/mac/sender/ja.lproj/Localizable.strings | Bin .../client/mac/sender/nl.lproj/InfoPlist.strings | Bin .../client/mac/sender/nl.lproj/Localizable.strings | Bin .../client/mac/sender/no.lproj/InfoPlist.strings | Bin .../client/mac/sender/no.lproj/Localizable.strings | Bin .../client/mac/sender/sl.lproj/InfoPlist.strings | Bin .../client/mac/sender/sl.lproj/Localizable.strings | Bin .../client/mac/sender/sv.lproj/InfoPlist.strings | Bin .../client/mac/sender/sv.lproj/Localizable.strings | Bin .../client/mac/sender/tr.lproj/InfoPlist.strings | Bin .../client/mac/sender/tr.lproj/Localizable.strings | Bin .../spotify}/breakpad/client/mac/sender/uploader.h | 0 .../spotify}/breakpad/client/mac/sender/uploader.mm | 0 .../breakpad/client/mac/testapp/Controller.h | 0 .../breakpad/client/mac/testapp/Controller.m | 0 .../mac/testapp/English.lproj/InfoPlist.strings | Bin .../client/mac/testapp/English.lproj/MainMenu.xib | 0 .../spotify}/breakpad/client/mac/testapp/Info.plist | 0 .../breakpad/client/mac/testapp/TestClass.h | 0 .../breakpad/client/mac/testapp/TestClass.mm | 0 .../spotify}/breakpad/client/mac/testapp/bomb.icns | Bin .../breakpad/client/mac/testapp/crashInMain | Bin .../breakpad/client/mac/testapp/crashduringload | Bin .../spotify}/breakpad/client/mac/testapp/main.m | 0 .../client/mac/tests/BreakpadFramework_Test.mm | 0 .../client/mac/tests/SimpleStringDictionaryTest.h | 0 .../client/mac/tests/SimpleStringDictionaryTest.mm | 0 .../mac/tests/crash_generation_server_test.cc | 0 .../client/mac/tests/exception_handler_test.cc | 0 .../client/mac/tests/minidump_generator_test.cc | 0 .../mac/tests/minidump_generator_test_helper.cc | 0 .../breakpad/client/mac/tests/spawn_child_process.h | 0 .../breakpad/client/mac/tests/testlogging.h | 0 .../breakpad/client/minidump_file_writer-inl.h | 0 .../breakpad/client/minidump_file_writer.cc | 0 .../spotify}/breakpad/client/minidump_file_writer.h | 0 .../client/minidump_file_writer_unittest.cc | 0 .../client/solaris/handler/exception_handler.cc | 0 .../client/solaris/handler/exception_handler.h | 0 .../solaris/handler/exception_handler_test.cc | 0 .../client/solaris/handler/minidump_generator.cc | 0 .../client/solaris/handler/minidump_generator.h | 0 .../client/solaris/handler/minidump_test.cc | 0 .../breakpad/client/solaris/handler/solaris_lwp.cc | 0 .../breakpad/client/solaris/handler/solaris_lwp.h | 0 .../breakpad/client/windows/breakpad_client.gyp | 0 .../breakpad/client/windows/build/common.gypi | 0 .../client/windows/build/external_code.gypi | 0 .../windows/build/internal/release_defaults.gypi | 0 .../client/windows/build/internal/release_impl.gypi | 0 .../build/internal/release_impl_official.gypi | 0 .../breakpad/client/windows/build/release.gypi | 0 .../client/windows/common/auto_critical_section.h | 0 .../breakpad/client/windows/common/ipc_protocol.h | 0 .../client/windows/crash_generation/ReadMe.txt | 0 .../client/windows/crash_generation/client_info.cc | 0 .../client/windows/crash_generation/client_info.h | 0 .../windows/crash_generation/crash_generation.gyp | 0 .../crash_generation/crash_generation_client.cc | 0 .../crash_generation/crash_generation_client.h | 0 .../crash_generation/crash_generation_server.cc | 0 .../crash_generation/crash_generation_server.h | 0 .../windows/crash_generation/minidump_generator.cc | 0 .../windows/crash_generation/minidump_generator.h | 0 .../client/windows/handler/exception_handler.cc | 0 .../client/windows/handler/exception_handler.gyp | 0 .../client/windows/handler/exception_handler.h | 0 .../client/windows/sender/crash_report_sender.cc | 0 .../client/windows/sender/crash_report_sender.gyp | 0 .../client/windows/sender/crash_report_sender.h | 0 .../tests/crash_generation_app/abstract_class.cc | 0 .../tests/crash_generation_app/abstract_class.h | 0 .../crash_generation_app/crash_generation_app.cc | 0 .../crash_generation_app/crash_generation_app.gyp | 0 .../crash_generation_app/crash_generation_app.h | 0 .../crash_generation_app/crash_generation_app.ico | Bin .../crash_generation_app/crash_generation_app.rc | 0 .../windows/tests/crash_generation_app/resource.h | 0 .../windows/tests/crash_generation_app/small.ico | Bin .../client/windows/unittests/client_tests.gyp | 0 .../unittests/crash_generation_server_test.cc | 0 .../client/windows/unittests/dump_analysis.cc | 0 .../client/windows/unittests/dump_analysis.h | 0 .../unittests/exception_handler_death_test.cc | 0 .../windows/unittests/exception_handler_test.cc | 0 .../client/windows/unittests/minidump_test.cc | 0 .../breakpad/client/windows/unittests/testing.gyp | 0 .../spotify}/breakpad/common/basictypes.h | 0 .../spotify}/breakpad/common/byte_cursor.h | 0 .../breakpad/common/byte_cursor_unittest.cc | 0 .../spotify}/breakpad/common/convert_UTF.c | 0 .../spotify}/breakpad/common/convert_UTF.h | 0 .../spotify}/breakpad/common/dwarf/bytereader-inl.h | 0 .../spotify}/breakpad/common/dwarf/bytereader.cc | 0 .../spotify}/breakpad/common/dwarf/bytereader.h | 0 .../breakpad/common/dwarf/bytereader_unittest.cc | 0 .../spotify}/breakpad/common/dwarf/cfi_assembler.cc | 0 .../spotify}/breakpad/common/dwarf/cfi_assembler.h | 0 .../breakpad/common/dwarf/dwarf2diehandler.cc | 0 .../breakpad/common/dwarf/dwarf2diehandler.h | 0 .../common/dwarf/dwarf2diehandler_unittest.cc | 0 .../spotify}/breakpad/common/dwarf/dwarf2enums.h | 0 .../spotify}/breakpad/common/dwarf/dwarf2reader.cc | 0 .../spotify}/breakpad/common/dwarf/dwarf2reader.h | 0 .../common/dwarf/dwarf2reader_cfi_unittest.cc | 0 .../common/dwarf/dwarf2reader_die_unittest.cc | 0 .../common/dwarf/dwarf2reader_test_common.h | 0 .../spotify}/breakpad/common/dwarf/functioninfo.cc | 0 .../spotify}/breakpad/common/dwarf/functioninfo.h | 0 .../breakpad/common/dwarf/line_state_machine.h | 0 .../spotify}/breakpad/common/dwarf/types.h | 0 .../spotify}/breakpad/common/dwarf_cfi_to_module.cc | 0 .../spotify}/breakpad/common/dwarf_cfi_to_module.h | 0 .../breakpad/common/dwarf_cfi_to_module_unittest.cc | 0 .../spotify}/breakpad/common/dwarf_cu_to_module.cc | 0 .../spotify}/breakpad/common/dwarf_cu_to_module.h | 0 .../breakpad/common/dwarf_cu_to_module_unittest.cc | 0 .../breakpad/common/dwarf_line_to_module.cc | 0 .../spotify}/breakpad/common/dwarf_line_to_module.h | 0 .../common/dwarf_line_to_module_unittest.cc | 0 .../spotify}/breakpad/common/language.cc | 0 .../spotify}/breakpad/common/language.h | 0 .../spotify}/breakpad/common/linux/dump_symbols.cc | 0 .../spotify}/breakpad/common/linux/dump_symbols.h | 0 .../breakpad/common/linux/dump_symbols_unittest.cc | 0 .../spotify}/breakpad/common/linux/eintr_wrapper.h | 0 .../spotify}/breakpad/common/linux/elf_core_dump.cc | 0 .../spotify}/breakpad/common/linux/elf_core_dump.h | 0 .../breakpad/common/linux/elf_core_dump_unittest.cc | 0 .../breakpad/common/linux/elf_symbols_to_module.cc | 0 .../breakpad/common/linux/elf_symbols_to_module.h | 0 .../common/linux/elf_symbols_to_module_unittest.cc | 0 .../spotify}/breakpad/common/linux/file_id.cc | 0 .../spotify}/breakpad/common/linux/file_id.h | 0 .../breakpad/common/linux/file_id_unittest.cc | 0 .../common/linux/google_crashdump_uploader.cc | 0 .../common/linux/google_crashdump_uploader.h | 0 .../common/linux/google_crashdump_uploader_test.cc | 0 .../spotify}/breakpad/common/linux/guid_creator.cc | 0 .../spotify}/breakpad/common/linux/guid_creator.h | 0 .../spotify}/breakpad/common/linux/http_upload.cc | 0 .../spotify}/breakpad/common/linux/http_upload.h | 0 .../breakpad/common/linux/libcurl_wrapper.cc | 0 .../breakpad/common/linux/libcurl_wrapper.h | 0 .../breakpad/common/linux/linux_libc_support.h | 0 .../common/linux/linux_libc_support_unittest.cc | 0 .../breakpad/common/linux/memory_mapped_file.cc | 0 .../breakpad/common/linux/memory_mapped_file.h | 0 .../common/linux/memory_mapped_file_unittest.cc | 0 .../spotify}/breakpad/common/linux/safe_readlink.cc | 0 .../spotify}/breakpad/common/linux/safe_readlink.h | 0 .../breakpad/common/linux/safe_readlink_unittest.cc | 0 .../spotify}/breakpad/common/linux/synth_elf.cc | 0 .../spotify}/breakpad/common/linux/synth_elf.h | 0 .../breakpad/common/linux/synth_elf_unittest.cc | 0 .../breakpad/common/linux/tests/crash_generator.cc | 0 .../breakpad/common/linux/tests/crash_generator.h | 0 .../spotify}/breakpad/common/mac/Breakpad.xcconfig | 0 .../breakpad/common/mac/BreakpadDebug.xcconfig | 0 .../breakpad/common/mac/BreakpadRelease.xcconfig | 0 .../spotify}/breakpad/common/mac/GTMDefines.h | 0 .../breakpad/common/mac/GTMGarbageCollection.h | 0 .../spotify}/breakpad/common/mac/GTMLogger.h | 0 .../spotify}/breakpad/common/mac/GTMLogger.m | 0 .../breakpad/common/mac/HTTPMultipartUpload.h | 0 .../breakpad/common/mac/HTTPMultipartUpload.m | 0 .../spotify}/breakpad/common/mac/MachIPC.h | 0 .../spotify}/breakpad/common/mac/MachIPC.mm | 0 .../breakpad/common/mac/SimpleStringDictionary.h | 0 .../breakpad/common/mac/SimpleStringDictionary.mm | 0 .../breakpad/common/mac/bootstrap_compat.cc | 0 .../spotify}/breakpad/common/mac/bootstrap_compat.h | 0 .../spotify}/breakpad/common/mac/byteswap.h | 0 .../spotify}/breakpad/common/mac/dump_syms.h | 0 .../spotify}/breakpad/common/mac/dump_syms.mm | 0 .../spotify}/breakpad/common/mac/file_id.cc | 0 .../spotify}/breakpad/common/mac/file_id.h | 0 .../spotify}/breakpad/common/mac/macho_id.cc | 0 .../spotify}/breakpad/common/mac/macho_id.h | 0 .../spotify}/breakpad/common/mac/macho_reader.cc | 0 .../spotify}/breakpad/common/mac/macho_reader.h | 0 .../breakpad/common/mac/macho_reader_unittest.cc | 0 .../spotify}/breakpad/common/mac/macho_utilities.cc | 0 .../spotify}/breakpad/common/mac/macho_utilities.h | 0 .../spotify}/breakpad/common/mac/macho_walker.cc | 0 .../spotify}/breakpad/common/mac/macho_walker.h | 0 .../breakpad/common/mac/scoped_task_suspend-inl.h | 0 .../breakpad/common/mac/string_utilities.cc | 0 .../spotify}/breakpad/common/mac/string_utilities.h | 0 .../breakpad/common/mac/testing/GTMSenTestCase.h | 0 .../breakpad/common/mac/testing/GTMSenTestCase.m | 0 {spotify => archive/spotify}/breakpad/common/md5.cc | 0 {spotify => archive/spotify}/breakpad/common/md5.h | 0 .../spotify}/breakpad/common/memory.h | 0 .../spotify}/breakpad/common/memory_range.h | 0 .../breakpad/common/memory_range_unittest.cc | 0 .../spotify}/breakpad/common/memory_unittest.cc | 0 .../spotify}/breakpad/common/module.cc | 0 .../spotify}/breakpad/common/module.h | 0 .../spotify}/breakpad/common/module_unittest.cc | 0 .../breakpad/common/solaris/dump_symbols.cc | 0 .../spotify}/breakpad/common/solaris/dump_symbols.h | 0 .../spotify}/breakpad/common/solaris/file_id.cc | 0 .../spotify}/breakpad/common/solaris/file_id.h | 0 .../breakpad/common/solaris/guid_creator.cc | 0 .../spotify}/breakpad/common/solaris/guid_creator.h | 0 .../breakpad/common/solaris/message_output.h | 0 .../spotify}/breakpad/common/stabs_reader.cc | 0 .../spotify}/breakpad/common/stabs_reader.h | 0 .../breakpad/common/stabs_reader_unittest.cc | 0 .../spotify}/breakpad/common/stabs_to_module.cc | 0 .../spotify}/breakpad/common/stabs_to_module.h | 0 .../breakpad/common/stabs_to_module_unittest.cc | 0 .../spotify}/breakpad/common/string_conversion.cc | 0 .../spotify}/breakpad/common/string_conversion.h | 0 .../spotify}/breakpad/common/test_assembler.cc | 0 .../spotify}/breakpad/common/test_assembler.h | 0 .../breakpad/common/test_assembler_unittest.cc | 0 .../breakpad/common/testdata/func-line-pairing.h | 0 .../spotify}/breakpad/common/windows/guid_string.cc | 0 .../spotify}/breakpad/common/windows/guid_string.h | 0 .../spotify}/breakpad/common/windows/http_upload.cc | 0 .../spotify}/breakpad/common/windows/http_upload.h | 0 .../common/windows/pdb_source_line_writer.cc | 0 .../common/windows/pdb_source_line_writer.h | 0 .../breakpad/common/windows/string_utils-inl.h | 0 .../breakpad/common/windows/string_utils.cc | 0 {spotify => archive/spotify}/breakpad/config.h.in | 0 .../google_breakpad/common/breakpad_types.h | 0 .../google_breakpad/common/minidump_cpu_amd64.h | 0 .../google_breakpad/common/minidump_cpu_arm.h | 0 .../google_breakpad/common/minidump_cpu_ppc.h | 0 .../google_breakpad/common/minidump_cpu_ppc64.h | 0 .../google_breakpad/common/minidump_cpu_sparc.h | 0 .../google_breakpad/common/minidump_cpu_x86.h | 0 .../common/minidump_exception_linux.h | 0 .../google_breakpad/common/minidump_exception_mac.h | 0 .../common/minidump_exception_solaris.h | 0 .../common/minidump_exception_win32.h | 0 .../google_breakpad/common/minidump_format.h | 0 .../breakpad/google_breakpad/common/minidump_size.h | 0 .../processor/basic_source_line_resolver.h | 0 .../breakpad/google_breakpad/processor/call_stack.h | 0 .../google_breakpad/processor/code_module.h | 0 .../google_breakpad/processor/code_modules.h | 0 .../google_breakpad/processor/exploitability.h | 0 .../processor/fast_source_line_resolver.h | 0 .../google_breakpad/processor/memory_region.h | 0 .../breakpad/google_breakpad/processor/minidump.h | 0 .../google_breakpad/processor/minidump_processor.h | 0 .../google_breakpad/processor/process_state.h | 0 .../processor/source_line_resolver_base.h | 0 .../processor/source_line_resolver_interface.h | 0 .../google_breakpad/processor/stack_frame.h | 0 .../google_breakpad/processor/stack_frame_cpu.h | 0 .../google_breakpad/processor/stackwalker.h | 0 .../google_breakpad/processor/symbol_supplier.h | 0 .../google_breakpad/processor/system_info.h | 0 .../spotify}/breakpad/processor/address_map-inl.h | 0 .../spotify}/breakpad/processor/address_map.h | 0 .../breakpad/processor/address_map_unittest.cc | 0 .../spotify}/breakpad/processor/basic_code_module.h | 0 .../breakpad/processor/basic_code_modules.cc | 0 .../breakpad/processor/basic_code_modules.h | 0 .../processor/basic_source_line_resolver.cc | 0 .../processor/basic_source_line_resolver_types.h | 0 .../basic_source_line_resolver_unittest.cc | 0 .../spotify}/breakpad/processor/binarystream.cc | 0 .../spotify}/breakpad/processor/binarystream.h | 0 .../breakpad/processor/binarystream_unittest.cc | 0 .../spotify}/breakpad/processor/call_stack.cc | 0 .../breakpad/processor/cfi_frame_info-inl.h | 0 .../spotify}/breakpad/processor/cfi_frame_info.cc | 0 .../spotify}/breakpad/processor/cfi_frame_info.h | 0 .../breakpad/processor/cfi_frame_info_unittest.cc | 0 .../breakpad/processor/contained_range_map-inl.h | 0 .../breakpad/processor/contained_range_map.h | 0 .../processor/contained_range_map_unittest.cc | 0 .../spotify}/breakpad/processor/disassembler_x86.cc | 0 .../spotify}/breakpad/processor/disassembler_x86.h | 0 .../breakpad/processor/disassembler_x86_unittest.cc | 0 .../spotify}/breakpad/processor/exploitability.cc | 0 .../breakpad/processor/exploitability_unittest.cc | 0 .../breakpad/processor/exploitability_win.cc | 0 .../breakpad/processor/exploitability_win.h | 0 .../breakpad/processor/fast_source_line_resolver.cc | 0 .../processor/fast_source_line_resolver_types.h | 0 .../processor/fast_source_line_resolver_unittest.cc | 0 .../spotify}/breakpad/processor/linked_ptr.h | 0 .../spotify}/breakpad/processor/logging.cc | 0 .../spotify}/breakpad/processor/logging.h | 0 .../breakpad/processor/map_serializers-inl.h | 0 .../spotify}/breakpad/processor/map_serializers.h | 0 .../breakpad/processor/map_serializers_unittest.cc | 0 .../spotify}/breakpad/processor/minidump.cc | 0 .../spotify}/breakpad/processor/minidump_dump.cc | 0 .../spotify}/breakpad/processor/minidump_dump_test | 0 .../breakpad/processor/minidump_processor.cc | 0 .../processor/minidump_processor_unittest.cc | 0 .../breakpad/processor/minidump_stackwalk.cc | 0 .../minidump_stackwalk_machine_readable_test | 0 .../breakpad/processor/minidump_stackwalk_test | 0 .../breakpad/processor/minidump_unittest.cc | 0 .../spotify}/breakpad/processor/module_comparer.cc | 0 .../spotify}/breakpad/processor/module_comparer.h | 0 .../spotify}/breakpad/processor/module_factory.h | 0 .../breakpad/processor/module_serializer.cc | 0 .../spotify}/breakpad/processor/module_serializer.h | 0 .../breakpad/processor/pathname_stripper.cc | 0 .../spotify}/breakpad/processor/pathname_stripper.h | 0 .../processor/pathname_stripper_unittest.cc | 0 .../breakpad/processor/postfix_evaluator-inl.h | 0 .../spotify}/breakpad/processor/postfix_evaluator.h | 0 .../processor/postfix_evaluator_unittest.cc | 0 .../spotify}/breakpad/processor/process_state.cc | 0 .../spotify}/breakpad/processor/proto/README | 0 .../breakpad/processor/proto/process_state.proto | 0 .../spotify}/breakpad/processor/range_map-inl.h | 0 .../spotify}/breakpad/processor/range_map.h | 0 .../breakpad/processor/range_map_unittest.cc | 0 .../spotify}/breakpad/processor/scoped_ptr.h | 0 .../breakpad/processor/simple_serializer-inl.h | 0 .../spotify}/breakpad/processor/simple_serializer.h | 0 .../breakpad/processor/simple_symbol_supplier.cc | 0 .../breakpad/processor/simple_symbol_supplier.h | 0 .../breakpad/processor/source_line_resolver_base.cc | 0 .../processor/source_line_resolver_base_types.h | 0 .../spotify}/breakpad/processor/stackwalker.cc | 0 .../breakpad/processor/stackwalker_amd64.cc | 0 .../spotify}/breakpad/processor/stackwalker_amd64.h | 0 .../processor/stackwalker_amd64_unittest.cc | 0 .../spotify}/breakpad/processor/stackwalker_arm.cc | 0 .../spotify}/breakpad/processor/stackwalker_arm.h | 0 .../breakpad/processor/stackwalker_arm_unittest.cc | 0 .../spotify}/breakpad/processor/stackwalker_ppc.cc | 0 .../spotify}/breakpad/processor/stackwalker_ppc.h | 0 .../breakpad/processor/stackwalker_selftest.cc | 0 .../breakpad/processor/stackwalker_selftest_sol.s | 0 .../breakpad/processor/stackwalker_sparc.cc | 0 .../spotify}/breakpad/processor/stackwalker_sparc.h | 0 .../breakpad/processor/stackwalker_unittest_utils.h | 0 .../spotify}/breakpad/processor/stackwalker_x86.cc | 0 .../spotify}/breakpad/processor/stackwalker_x86.h | 0 .../breakpad/processor/stackwalker_x86_unittest.cc | 0 .../breakpad/processor/static_address_map-inl.h | 0 .../breakpad/processor/static_address_map.h | 0 .../processor/static_address_map_unittest.cc | 0 .../processor/static_contained_range_map-inl.h | 0 .../breakpad/processor/static_contained_range_map.h | 0 .../static_contained_range_map_unittest.cc | 0 .../spotify}/breakpad/processor/static_map-inl.h | 0 .../spotify}/breakpad/processor/static_map.h | 0 .../breakpad/processor/static_map_iterator-inl.h | 0 .../breakpad/processor/static_map_iterator.h | 0 .../breakpad/processor/static_map_unittest.cc | 0 .../breakpad/processor/static_range_map-inl.h | 0 .../spotify}/breakpad/processor/static_range_map.h | 0 .../breakpad/processor/static_range_map_unittest.cc | 0 .../spotify}/breakpad/processor/synth_minidump.cc | 0 .../spotify}/breakpad/processor/synth_minidump.h | 0 .../breakpad/processor/synth_minidump_unittest.cc | 0 .../processor/synth_minidump_unittest_data.h | 0 .../breakpad/processor/testdata/ascii_read_av.dmp | Bin .../testdata/ascii_read_av_block_write.dmp | Bin .../testdata/ascii_read_av_clobber_write.dmp | Bin .../testdata/ascii_read_av_conditional.dmp | Bin .../processor/testdata/ascii_read_av_then_jmp.dmp | Bin .../processor/testdata/ascii_read_av_xchg_write.dmp | Bin .../breakpad/processor/testdata/ascii_write_av.dmp | Bin .../testdata/ascii_write_av_arg_to_call.dmp | Bin .../processor/testdata/exec_av_on_stack.dmp | Bin .../breakpad/processor/testdata/linux_test_app.cc | 0 .../breakpad/processor/testdata/minidump2.dmp | Bin .../breakpad/processor/testdata/minidump2.dump.out | 0 .../minidump2.stackwalk.machine_readable.out | 0 .../processor/testdata/minidump2.stackwalk.out | 0 .../breakpad/processor/testdata/module0.out | 0 .../breakpad/processor/testdata/module1.out | 0 .../breakpad/processor/testdata/module2.out | 0 .../breakpad/processor/testdata/module3_bad.out | 0 .../breakpad/processor/testdata/module4_bad.out | 0 .../breakpad/processor/testdata/null_read_av.dmp | Bin .../breakpad/processor/testdata/null_write_av.dmp | Bin .../processor/testdata/read_av_clobber_write.dmp | Bin .../processor/testdata/read_av_conditional.dmp | Bin .../processor/testdata/read_av_non_null.dmp | Bin .../processor/testdata/stack_exhaustion.dmp | Bin .../BCE8785C57B44245A669896B6A19B9542/kernel32.sym | 0 .../5A9832E5287241C1838ED98914E9B7FF1/test_app.sym | 0 .../breakpad/processor/testdata/test_app.cc | 0 .../processor/testdata/write_av_non_null.dmp | Bin .../spotify}/breakpad/processor/tokenize.cc | 0 .../spotify}/breakpad/processor/tokenize.h | 0 .../breakpad/processor/windows_frame_info.h | 0 .../spotify}/breakpad/third_party/curl/COPYING | 0 .../spotify}/breakpad/third_party/curl/curl.h | 0 .../spotify}/breakpad/third_party/curl/curlbuild.h | 0 .../spotify}/breakpad/third_party/curl/curlrules.h | 0 .../spotify}/breakpad/third_party/curl/curlver.h | 0 .../spotify}/breakpad/third_party/curl/easy.h | 0 .../spotify}/breakpad/third_party/curl/mprintf.h | 0 .../spotify}/breakpad/third_party/curl/multi.h | 0 .../breakpad/third_party/curl/stdcheaders.h | 0 .../breakpad/third_party/curl/typecheck-gcc.h | 0 .../spotify}/breakpad/third_party/curl/types.h | 0 .../spotify}/breakpad/third_party/glog/AUTHORS | 0 .../spotify}/breakpad/third_party/glog/COPYING | 0 .../spotify}/breakpad/third_party/glog/ChangeLog | 0 .../spotify}/breakpad/third_party/glog/INSTALL | 0 .../spotify}/breakpad/third_party/glog/NEWS | 0 .../spotify}/breakpad/third_party/glog/README | 0 .../breakpad/third_party/glog/README.windows | 0 .../spotify}/breakpad/third_party/glog/aclocal.m4 | 0 .../spotify}/breakpad/third_party/glog/compile | 0 .../spotify}/breakpad/third_party/glog/config.guess | 0 .../spotify}/breakpad/third_party/glog/config.sub | 0 .../spotify}/breakpad/third_party/glog/configure | 0 .../spotify}/breakpad/third_party/glog/configure.ac | 0 .../spotify}/breakpad/third_party/glog/depcomp | 0 .../breakpad/third_party/glog/doc/designstyle.css | 0 .../breakpad/third_party/glog/doc/glog.html | 0 .../breakpad/third_party/glog/google-glog.sln | 0 .../spotify}/breakpad/third_party/glog/install-sh | 0 .../breakpad/third_party/glog/libglog.pc.in | 0 .../spotify}/breakpad/third_party/glog/ltmain.sh | 0 .../third_party/glog/m4/ac_have_attribute.m4 | 0 .../third_party/glog/m4/ac_have_builtin_expect.m4 | 0 .../glog/m4/ac_have_sync_val_compare_and_swap.m4 | 0 .../breakpad/third_party/glog/m4/ac_rwlock.m4 | 0 .../breakpad/third_party/glog/m4/acx_pthread.m4 | 0 .../third_party/glog/m4/google_namespace.m4 | 0 .../breakpad/third_party/glog/m4/libtool.m4 | 0 .../breakpad/third_party/glog/m4/ltoptions.m4 | 0 .../breakpad/third_party/glog/m4/ltsugar.m4 | 0 .../breakpad/third_party/glog/m4/ltversion.m4 | 0 .../breakpad/third_party/glog/m4/lt~obsolete.m4 | 0 .../breakpad/third_party/glog/m4/namespaces.m4 | 0 .../third_party/glog/m4/pc_from_ucontext.m4 | 0 .../breakpad/third_party/glog/m4/stl_namespace.m4 | 0 .../breakpad/third_party/glog/m4/using_operator.m4 | 0 .../spotify}/breakpad/third_party/glog/missing | 0 .../breakpad/third_party/glog/mkinstalldirs | 0 .../breakpad/third_party/glog/packages/deb.sh | 0 .../breakpad/third_party/glog/packages/deb/README | 0 .../third_party/glog/packages/deb/changelog | 0 .../breakpad/third_party/glog/packages/deb/compat | 0 .../breakpad/third_party/glog/packages/deb/control | 0 .../third_party/glog/packages/deb/copyright | 0 .../breakpad/third_party/glog/packages/deb/docs | 0 .../glog/packages/deb/libgoogle-glog-dev.dirs | 0 .../glog/packages/deb/libgoogle-glog-dev.install | 0 .../glog/packages/deb/libgoogle-glog0.dirs | 0 .../glog/packages/deb/libgoogle-glog0.install | 0 .../breakpad/third_party/glog/packages/deb/rules | 0 .../breakpad/third_party/glog/packages/rpm.sh | 0 .../breakpad/third_party/glog/packages/rpm/rpm.spec | 0 .../third_party/glog/src/base/commandlineflags.h | 0 .../breakpad/third_party/glog/src/base/googleinit.h | 0 .../breakpad/third_party/glog/src/base/mutex.h | 0 .../breakpad/third_party/glog/src/config.h.in | 0 .../third_party/glog/src/config_for_unittests.h | 0 .../breakpad/third_party/glog/src/demangle.cc | 0 .../breakpad/third_party/glog/src/demangle.h | 0 .../third_party/glog/src/demangle_unittest.cc | 0 .../third_party/glog/src/demangle_unittest.sh | 0 .../third_party/glog/src/demangle_unittest.txt | 0 .../third_party/glog/src/glog/log_severity.h | 0 .../breakpad/third_party/glog/src/glog/logging.h.in | 0 .../third_party/glog/src/glog/raw_logging.h.in | 0 .../third_party/glog/src/glog/stl_logging.h.in | 0 .../third_party/glog/src/glog/vlog_is_on.h.in | 0 .../breakpad/third_party/glog/src/googletest.h | 0 .../breakpad/third_party/glog/src/logging.cc | 0 .../third_party/glog/src/logging_striplog_test.sh | 0 .../third_party/glog/src/logging_striptest10.cc | 0 .../third_party/glog/src/logging_striptest2.cc | 0 .../third_party/glog/src/logging_striptest_main.cc | 0 .../third_party/glog/src/logging_unittest.cc | 0 .../third_party/glog/src/logging_unittest.err | 0 .../breakpad/third_party/glog/src/mock-log.h | 0 .../breakpad/third_party/glog/src/mock-log_test.cc | 0 .../breakpad/third_party/glog/src/raw_logging.cc | 0 .../breakpad/third_party/glog/src/signalhandler.cc | 0 .../third_party/glog/src/signalhandler_unittest.cc | 0 .../third_party/glog/src/signalhandler_unittest.sh | 0 .../breakpad/third_party/glog/src/stacktrace.h | 0 .../third_party/glog/src/stacktrace_generic-inl.h | 0 .../third_party/glog/src/stacktrace_libunwind-inl.h | 0 .../third_party/glog/src/stacktrace_powerpc-inl.h | 0 .../third_party/glog/src/stacktrace_unittest.cc | 0 .../third_party/glog/src/stacktrace_x86-inl.h | 0 .../third_party/glog/src/stacktrace_x86_64-inl.h | 0 .../third_party/glog/src/stl_logging_unittest.cc | 0 .../breakpad/third_party/glog/src/symbolize.cc | 0 .../breakpad/third_party/glog/src/symbolize.h | 0 .../third_party/glog/src/symbolize_unittest.cc | 0 .../breakpad/third_party/glog/src/utilities.cc | 0 .../breakpad/third_party/glog/src/utilities.h | 0 .../third_party/glog/src/utilities_unittest.cc | 0 .../breakpad/third_party/glog/src/vlog_is_on.cc | 0 .../breakpad/third_party/glog/src/windows/config.h | 0 .../glog/src/windows/glog/log_severity.h | 0 .../third_party/glog/src/windows/glog/logging.h | 0 .../third_party/glog/src/windows/glog/raw_logging.h | 0 .../third_party/glog/src/windows/glog/stl_logging.h | 0 .../third_party/glog/src/windows/glog/vlog_is_on.h | 0 .../breakpad/third_party/glog/src/windows/port.cc | 0 .../breakpad/third_party/glog/src/windows/port.h | 0 .../third_party/glog/src/windows/preprocess.sh | 0 .../glog/vsprojects/libglog/libglog.vcproj | 0 .../vsprojects/libglog_static/libglog_static.vcproj | 0 .../logging_unittest/logging_unittest.vcproj | 0 .../logging_unittest_static.vcproj | 0 .../spotify}/breakpad/third_party/libdisasm/TODO | 0 .../breakpad/third_party/libdisasm/ia32_implicit.c | 0 .../breakpad/third_party/libdisasm/ia32_implicit.h | 0 .../breakpad/third_party/libdisasm/ia32_insn.c | 0 .../breakpad/third_party/libdisasm/ia32_insn.h | 0 .../breakpad/third_party/libdisasm/ia32_invariant.c | 0 .../breakpad/third_party/libdisasm/ia32_invariant.h | 0 .../breakpad/third_party/libdisasm/ia32_modrm.c | 0 .../breakpad/third_party/libdisasm/ia32_modrm.h | 0 .../third_party/libdisasm/ia32_opcode_tables.c | 0 .../third_party/libdisasm/ia32_opcode_tables.h | 0 .../breakpad/third_party/libdisasm/ia32_operand.c | 0 .../breakpad/third_party/libdisasm/ia32_operand.h | 0 .../breakpad/third_party/libdisasm/ia32_reg.c | 0 .../breakpad/third_party/libdisasm/ia32_reg.h | 0 .../breakpad/third_party/libdisasm/ia32_settings.c | 0 .../breakpad/third_party/libdisasm/ia32_settings.h | 0 .../breakpad/third_party/libdisasm/libdis.h | 0 .../spotify}/breakpad/third_party/libdisasm/qword.h | 0 .../breakpad/third_party/libdisasm/swig/README | 0 .../breakpad/third_party/libdisasm/swig/libdisasm.i | 0 .../third_party/libdisasm/swig/libdisasm_oop.i | 0 .../third_party/libdisasm/swig/ruby/extconf.rb | 0 .../breakpad/third_party/libdisasm/x86_disasm.c | 0 .../breakpad/third_party/libdisasm/x86_format.c | 0 .../breakpad/third_party/libdisasm/x86_imm.c | 0 .../breakpad/third_party/libdisasm/x86_imm.h | 0 .../breakpad/third_party/libdisasm/x86_insn.c | 0 .../breakpad/third_party/libdisasm/x86_misc.c | 0 .../third_party/libdisasm/x86_operand_list.c | 0 .../third_party/libdisasm/x86_operand_list.h | 0 .../third_party/linux/include/gflags/gflags.h | 0 .../linux/include/gflags/gflags_completions.h | 0 .../third_party/lss/linux_syscall_support.h | 0 .../third_party/protobuf/protobuf/CHANGES.txt | 0 .../third_party/protobuf/protobuf/CONTRIBUTORS.txt | 0 .../third_party/protobuf/protobuf/COPYING.txt | 0 .../third_party/protobuf/protobuf/INSTALL.txt | 0 .../third_party/protobuf/protobuf/README.txt | 0 .../third_party/protobuf/protobuf/autogen.sh | 0 .../protobuf/protobuf/benchmarks/ProtoBench.java | 0 .../protobuf/benchmarks/google_message1.dat | Bin .../protobuf/benchmarks/google_message2.dat | Bin .../protobuf/protobuf/benchmarks/google_size.proto | 0 .../protobuf/protobuf/benchmarks/google_speed.proto | 0 .../protobuf/protobuf/benchmarks/readme.txt | 0 .../third_party/protobuf/protobuf/configure.ac | 0 .../protobuf/protobuf/editors/README.txt | 0 .../third_party/protobuf/protobuf/editors/proto.vim | 0 .../protobuf/protobuf/editors/protobuf-mode.el | 0 .../protobuf/protobuf/examples/AddPerson.java | 0 .../protobuf/protobuf/examples/ListPeople.java | 0 .../protobuf/protobuf/examples/README.txt | 0 .../protobuf/protobuf/examples/add_person.cc | 0 .../protobuf/protobuf/examples/add_person.py | 0 .../protobuf/protobuf/examples/addressbook.proto | 0 .../protobuf/protobuf/examples/list_people.cc | 0 .../protobuf/protobuf/examples/list_people.py | 0 .../protobuf/protobuf/generate_descriptor_proto.sh | 0 .../third_party/protobuf/protobuf/gtest/CHANGES | 0 .../protobuf/protobuf/gtest/CMakeLists.txt | 0 .../protobuf/protobuf/gtest/CONTRIBUTORS | 0 .../third_party/protobuf/protobuf/gtest/COPYING | 0 .../third_party/protobuf/protobuf/gtest/README | 0 .../protobuf/protobuf/gtest/build-aux/.keep | 0 .../protobuf/protobuf/gtest/codegear/gtest.cbproj | 0 .../protobuf/gtest/codegear/gtest.groupproj | 0 .../protobuf/protobuf/gtest/codegear/gtest_all.cc | 0 .../protobuf/protobuf/gtest/codegear/gtest_link.cc | 0 .../protobuf/gtest/codegear/gtest_main.cbproj | 0 .../protobuf/gtest/codegear/gtest_unittest.cbproj | 0 .../protobuf/protobuf/gtest/configure.ac | 0 .../protobuf/gtest/include/gtest/gtest-death-test.h | 0 .../protobuf/gtest/include/gtest/gtest-message.h | 0 .../protobuf/gtest/include/gtest/gtest-param-test.h | 0 .../gtest/include/gtest/gtest-param-test.h.pump | 0 .../protobuf/gtest/include/gtest/gtest-spi.h | 0 .../protobuf/gtest/include/gtest/gtest-test-part.h | 0 .../protobuf/gtest/include/gtest/gtest-typed-test.h | 0 .../protobuf/protobuf/gtest/include/gtest/gtest.h | 0 .../protobuf/gtest/include/gtest/gtest_pred_impl.h | 0 .../protobuf/gtest/include/gtest/gtest_prod.h | 0 .../gtest/internal/gtest-death-test-internal.h | 0 .../gtest/include/gtest/internal/gtest-filepath.h | 0 .../gtest/include/gtest/internal/gtest-internal.h | 0 .../gtest/include/gtest/internal/gtest-linked_ptr.h | 0 .../gtest/internal/gtest-param-util-generated.h | 0 .../internal/gtest-param-util-generated.h.pump | 0 .../gtest/include/gtest/internal/gtest-param-util.h | 0 .../gtest/include/gtest/internal/gtest-port.h | 0 .../gtest/include/gtest/internal/gtest-string.h | 0 .../gtest/include/gtest/internal/gtest-tuple.h | 0 .../gtest/include/gtest/internal/gtest-tuple.h.pump | 0 .../gtest/include/gtest/internal/gtest-type-util.h | 0 .../include/gtest/internal/gtest-type-util.h.pump | 0 .../protobuf/protobuf/gtest/m4/acx_pthread.m4 | 0 .../third_party/protobuf/protobuf/gtest/m4/gtest.m4 | 0 .../protobuf/protobuf/gtest/msvc/gtest-md.sln | 0 .../protobuf/protobuf/gtest/msvc/gtest-md.vcproj | 0 .../protobuf/protobuf/gtest/msvc/gtest.sln | 0 .../protobuf/protobuf/gtest/msvc/gtest.vcproj | 0 .../protobuf/gtest/msvc/gtest_main-md.vcproj | 0 .../protobuf/protobuf/gtest/msvc/gtest_main.vcproj | 0 .../protobuf/gtest/msvc/gtest_prod_test-md.vcproj | 0 .../protobuf/gtest/msvc/gtest_prod_test.vcproj | 0 .../protobuf/gtest/msvc/gtest_unittest-md.vcproj | 0 .../protobuf/gtest/msvc/gtest_unittest.vcproj | 0 .../protobuf/protobuf/gtest/run_tests.py | 0 .../protobuf/protobuf/gtest/samples/prime_tables.h | 0 .../protobuf/protobuf/gtest/samples/sample1.cc | 0 .../protobuf/protobuf/gtest/samples/sample1.h | 0 .../protobuf/gtest/samples/sample10_unittest.cc | 0 .../protobuf/gtest/samples/sample1_unittest.cc | 0 .../protobuf/protobuf/gtest/samples/sample2.cc | 0 .../protobuf/protobuf/gtest/samples/sample2.h | 0 .../protobuf/gtest/samples/sample2_unittest.cc | 0 .../protobuf/protobuf/gtest/samples/sample3-inl.h | 0 .../protobuf/gtest/samples/sample3_unittest.cc | 0 .../protobuf/protobuf/gtest/samples/sample4.cc | 0 .../protobuf/protobuf/gtest/samples/sample4.h | 0 .../protobuf/gtest/samples/sample4_unittest.cc | 0 .../protobuf/gtest/samples/sample5_unittest.cc | 0 .../protobuf/gtest/samples/sample6_unittest.cc | 0 .../protobuf/gtest/samples/sample7_unittest.cc | 0 .../protobuf/gtest/samples/sample8_unittest.cc | 0 .../protobuf/gtest/samples/sample9_unittest.cc | 0 .../protobuf/gtest/scripts/fuse_gtest_files.py | 0 .../protobuf/gtest/scripts/gen_gtest_pred_impl.py | 0 .../protobuf/protobuf/gtest/scripts/gtest-config.in | 0 .../protobuf/protobuf/gtest/scripts/pump.py | 0 .../protobuf/protobuf/gtest/scripts/upload.py | 0 .../protobuf/protobuf/gtest/scripts/upload_gtest.py | 0 .../protobuf/protobuf/gtest/src/gtest-all.cc | 0 .../protobuf/protobuf/gtest/src/gtest-death-test.cc | 0 .../protobuf/protobuf/gtest/src/gtest-filepath.cc | 0 .../protobuf/gtest/src/gtest-internal-inl.h | 0 .../protobuf/protobuf/gtest/src/gtest-port.cc | 0 .../protobuf/protobuf/gtest/src/gtest-test-part.cc | 0 .../protobuf/protobuf/gtest/src/gtest-typed-test.cc | 0 .../protobuf/protobuf/gtest/src/gtest.cc | 0 .../protobuf/protobuf/gtest/src/gtest_main.cc | 0 .../protobuf/gtest/test/gtest-death-test_test.cc | 0 .../protobuf/gtest/test/gtest-filepath_test.cc | 0 .../protobuf/gtest/test/gtest-linked_ptr_test.cc | 0 .../protobuf/gtest/test/gtest-listener_test.cc | 0 .../protobuf/gtest/test/gtest-message_test.cc | 0 .../protobuf/gtest/test/gtest-options_test.cc | 0 .../protobuf/gtest/test/gtest-param-test2_test.cc | 0 .../protobuf/gtest/test/gtest-param-test_test.cc | 0 .../protobuf/gtest/test/gtest-param-test_test.h | 0 .../protobuf/protobuf/gtest/test/gtest-port_test.cc | 0 .../protobuf/gtest/test/gtest-test-part_test.cc | 0 .../protobuf/gtest/test/gtest-tuple_test.cc | 0 .../protobuf/gtest/test/gtest-typed-test2_test.cc | 0 .../protobuf/gtest/test/gtest-typed-test_test.cc | 0 .../protobuf/gtest/test/gtest-typed-test_test.h | 0 .../protobuf/gtest/test/gtest-unittest-api_test.cc | 0 .../protobuf/protobuf/gtest/test/gtest_all_test.cc | 0 .../gtest/test/gtest_break_on_failure_unittest.py | 0 .../gtest/test/gtest_break_on_failure_unittest_.cc | 0 .../protobuf/gtest/test/gtest_color_test.py | 0 .../protobuf/gtest/test/gtest_color_test_.cc | 0 .../protobuf/gtest/test/gtest_env_var_test.py | 0 .../protobuf/gtest/test/gtest_env_var_test_.cc | 0 .../protobuf/gtest/test/gtest_environment_test.cc | 0 .../protobuf/gtest/test/gtest_filter_unittest.py | 0 .../protobuf/gtest/test/gtest_filter_unittest_.cc | 0 .../protobuf/protobuf/gtest/test/gtest_help_test.py | 0 .../protobuf/gtest/test/gtest_help_test_.cc | 0 .../gtest/test/gtest_list_tests_unittest.py | 0 .../gtest/test/gtest_list_tests_unittest_.cc | 0 .../protobuf/gtest/test/gtest_main_unittest.cc | 0 .../protobuf/protobuf/gtest/test/gtest_nc.cc | 0 .../protobuf/protobuf/gtest/test/gtest_nc_test.py | 0 .../protobuf/gtest/test/gtest_no_test_unittest.cc | 0 .../protobuf/gtest/test/gtest_output_test.py | 0 .../protobuf/gtest/test/gtest_output_test_.cc | 0 .../gtest/test/gtest_output_test_golden_lin.txt | 0 .../gtest/test/gtest_output_test_golden_win.txt | 0 .../protobuf/gtest/test/gtest_pred_impl_unittest.cc | 0 .../protobuf/protobuf/gtest/test/gtest_prod_test.cc | 0 .../protobuf/gtest/test/gtest_repeat_test.cc | 0 .../protobuf/gtest/test/gtest_shuffle_test.py | 0 .../protobuf/gtest/test/gtest_shuffle_test_.cc | 0 .../protobuf/gtest/test/gtest_sole_header_test.cc | 0 .../protobuf/gtest/test/gtest_stress_test.cc | 0 .../protobuf/gtest/test/gtest_test_utils.py | 0 .../gtest/test/gtest_throw_on_failure_ex_test.cc | 0 .../gtest/test/gtest_throw_on_failure_test.py | 0 .../gtest/test/gtest_throw_on_failure_test_.cc | 0 .../protobuf/gtest/test/gtest_uninitialized_test.py | 0 .../gtest/test/gtest_uninitialized_test_.cc | 0 .../protobuf/protobuf/gtest/test/gtest_unittest.cc | 0 .../protobuf/gtest/test/gtest_xml_outfile1_test_.cc | 0 .../protobuf/gtest/test/gtest_xml_outfile2_test_.cc | 0 .../protobuf/gtest/test/gtest_xml_outfiles_test.py | 0 .../gtest/test/gtest_xml_output_unittest.py | 0 .../gtest/test/gtest_xml_output_unittest_.cc | 0 .../protobuf/gtest/test/gtest_xml_test_utils.py | 0 .../protobuf/protobuf/gtest/test/production.cc | 0 .../protobuf/protobuf/gtest/test/production.h | 0 .../protobuf/protobuf/gtest/test/run_tests_util.py | 0 .../protobuf/gtest/test/run_tests_util_test.py | 0 .../gtest/xcode/Config/DebugProject.xcconfig | 0 .../gtest/xcode/Config/FrameworkTarget.xcconfig | 0 .../protobuf/gtest/xcode/Config/General.xcconfig | 0 .../gtest/xcode/Config/ReleaseProject.xcconfig | 0 .../gtest/xcode/Config/StaticLibraryTarget.xcconfig | 0 .../protobuf/gtest/xcode/Config/TestTarget.xcconfig | 0 .../protobuf/gtest/xcode/Resources/Info.plist | 0 .../gtest/xcode/Samples/FrameworkSample/Info.plist | 0 .../WidgetFramework.xcodeproj/project.pbxproj | 0 .../gtest/xcode/Samples/FrameworkSample/runtests.sh | 0 .../gtest/xcode/Samples/FrameworkSample/widget.cc | 0 .../gtest/xcode/Samples/FrameworkSample/widget.h | 0 .../xcode/Samples/FrameworkSample/widget_test.cc | 0 .../protobuf/gtest/xcode/Scripts/runtests.sh | 0 .../protobuf/gtest/xcode/Scripts/versiongenerate.py | 0 .../gtest/xcode/gtest.xcodeproj/project.pbxproj | 0 .../third_party/protobuf/protobuf/java/README.txt | 0 .../third_party/protobuf/protobuf/java/pom.xml | 0 .../java/com/google/protobuf/AbstractMessage.java | 0 .../com/google/protobuf/AbstractMessageLite.java | 0 .../com/google/protobuf/BlockingRpcChannel.java | 0 .../java/com/google/protobuf/BlockingService.java | 0 .../main/java/com/google/protobuf/ByteString.java | 0 .../java/com/google/protobuf/CodedInputStream.java | 0 .../java/com/google/protobuf/CodedOutputStream.java | 0 .../main/java/com/google/protobuf/Descriptors.java | 0 .../java/com/google/protobuf/DynamicMessage.java | 0 .../java/com/google/protobuf/ExtensionRegistry.java | 0 .../com/google/protobuf/ExtensionRegistryLite.java | 0 .../src/main/java/com/google/protobuf/FieldSet.java | 0 .../java/com/google/protobuf/GeneratedMessage.java | 0 .../com/google/protobuf/GeneratedMessageLite.java | 0 .../src/main/java/com/google/protobuf/Internal.java | 0 .../protobuf/InvalidProtocolBufferException.java | 0 .../com/google/protobuf/LazyStringArrayList.java | 0 .../java/com/google/protobuf/LazyStringList.java | 0 .../src/main/java/com/google/protobuf/Message.java | 0 .../main/java/com/google/protobuf/MessageLite.java | 0 .../com/google/protobuf/MessageLiteOrBuilder.java | 0 .../java/com/google/protobuf/MessageOrBuilder.java | 0 .../com/google/protobuf/ProtocolMessageEnum.java | 0 .../com/google/protobuf/RepeatedFieldBuilder.java | 0 .../main/java/com/google/protobuf/RpcCallback.java | 0 .../main/java/com/google/protobuf/RpcChannel.java | 0 .../java/com/google/protobuf/RpcController.java | 0 .../src/main/java/com/google/protobuf/RpcUtil.java | 0 .../src/main/java/com/google/protobuf/Service.java | 0 .../java/com/google/protobuf/ServiceException.java | 0 .../com/google/protobuf/SingleFieldBuilder.java | 0 .../java/com/google/protobuf/SmallSortedMap.java | 0 .../main/java/com/google/protobuf/TextFormat.java | 0 .../protobuf/UninitializedMessageException.java | 0 .../java/com/google/protobuf/UnknownFieldSet.java | 0 .../google/protobuf/UnmodifiableLazyStringList.java | 0 .../main/java/com/google/protobuf/WireFormat.java | 0 .../com/google/protobuf/AbstractMessageTest.java | 0 .../com/google/protobuf/CodedInputStreamTest.java | 0 .../com/google/protobuf/CodedOutputStreamTest.java | 0 .../com/google/protobuf/DeprecatedFieldTest.java | 0 .../java/com/google/protobuf/DescriptorsTest.java | 0 .../com/google/protobuf/DynamicMessageTest.java | 0 .../google/protobuf/ForceFieldBuildersPreRun.java | 0 .../com/google/protobuf/GeneratedMessageTest.java | 0 .../google/protobuf/LazyStringArrayListTest.java | 0 .../com/google/protobuf/LazyStringEndToEndTest.java | 0 .../src/test/java/com/google/protobuf/LiteTest.java | 0 .../test/java/com/google/protobuf/MessageTest.java | 0 .../com/google/protobuf/NestedBuildersTest.java | 0 .../google/protobuf/RepeatedFieldBuilderTest.java | 0 .../test/java/com/google/protobuf/ServiceTest.java | 0 .../com/google/protobuf/SingleFieldBuilderTest.java | 0 .../com/google/protobuf/SmallSortedMapTest.java | 0 .../com/google/protobuf/TestBadIdentifiers.java | 0 .../src/test/java/com/google/protobuf/TestUtil.java | 0 .../java/com/google/protobuf/TextFormatTest.java | 0 .../com/google/protobuf/UnknownFieldSetTest.java | 0 .../protobuf/UnmodifiableLazyStringListTest.java | 0 .../java/com/google/protobuf/WireFormatTest.java | 0 .../com/google/protobuf/multiple_files_test.proto | 0 .../com/google/protobuf/nested_builders_test.proto | 0 .../java/com/google/protobuf/nested_extension.proto | 0 .../com/google/protobuf/nested_extension_lite.proto | 0 .../com/google/protobuf/non_nested_extension.proto | 0 .../google/protobuf/non_nested_extension_lite.proto | 0 .../com/google/protobuf/test_bad_identifiers.proto | 0 .../protobuf/protobuf/m4/ac_system_extensions.m4 | 0 .../protobuf/protobuf/m4/acx_check_suncc.m4 | 0 .../third_party/protobuf/protobuf/m4/acx_pthread.m4 | 0 .../third_party/protobuf/protobuf/m4/stl_hash.m4 | 0 .../protobuf/protobuf/post_process_dist.sh | 0 .../protobuf/protobuf/protobuf-lite.pc.in | 0 .../third_party/protobuf/protobuf/protobuf.pc.in | 0 .../third_party/protobuf/protobuf/python/README.txt | 0 .../protobuf/protobuf/python/ez_setup.py | 0 .../protobuf/protobuf/python/google/__init__.py | 0 .../protobuf/python/google/protobuf/__init__.py | 0 .../protobuf/python/google/protobuf/descriptor.py | 0 .../python/google/protobuf/internal/__init__.py | 0 .../google/protobuf/internal/api_implementation.py | 0 .../python/google/protobuf/internal/containers.py | 0 .../python/google/protobuf/internal/cpp_message.py | 0 .../python/google/protobuf/internal/decoder.py | 0 .../google/protobuf/internal/descriptor_test.py | 0 .../python/google/protobuf/internal/encoder.py | 0 .../google/protobuf/internal/generator_test.py | 0 .../google/protobuf/internal/message_listener.py | 0 .../python/google/protobuf/internal/message_test.py | 0 .../google/protobuf/internal/more_extensions.proto | 0 .../google/protobuf/internal/more_messages.proto | 0 .../google/protobuf/internal/python_message.py | 0 .../google/protobuf/internal/reflection_test.py | 0 .../protobuf/internal/service_reflection_test.py | 0 .../python/google/protobuf/internal/test_util.py | 0 .../google/protobuf/internal/text_format_test.py | 0 .../google/protobuf/internal/type_checkers.py | 0 .../python/google/protobuf/internal/wire_format.py | 0 .../google/protobuf/internal/wire_format_test.py | 0 .../protobuf/python/google/protobuf/message.py | 0 .../python/google/protobuf/pyext/python-proto2.cc | 0 .../google/protobuf/pyext/python_descriptor.cc | 0 .../google/protobuf/pyext/python_descriptor.h | 0 .../python/google/protobuf/pyext/python_protobuf.cc | 0 .../python/google/protobuf/pyext/python_protobuf.h | 0 .../protobuf/python/google/protobuf/reflection.py | 0 .../protobuf/python/google/protobuf/service.py | 0 .../python/google/protobuf/service_reflection.py | 0 .../protobuf/python/google/protobuf/text_format.py | 0 .../third_party/protobuf/protobuf/python/mox.py | 0 .../third_party/protobuf/protobuf/python/setup.py | 0 .../third_party/protobuf/protobuf/python/stubout.py | 0 .../protobuf/protobuf/src/google/protobuf/SEBS | 0 .../src/google/protobuf/compiler/code_generator.cc | 0 .../src/google/protobuf/compiler/code_generator.h | 0 .../protobuf/compiler/command_line_interface.cc | 0 .../protobuf/compiler/command_line_interface.h | 0 .../compiler/command_line_interface_unittest.cc | 0 .../protobuf/compiler/cpp/cpp_bootstrap_unittest.cc | 0 .../src/google/protobuf/compiler/cpp/cpp_enum.cc | 0 .../src/google/protobuf/compiler/cpp/cpp_enum.h | 0 .../google/protobuf/compiler/cpp/cpp_enum_field.cc | 0 .../google/protobuf/compiler/cpp/cpp_enum_field.h | 0 .../google/protobuf/compiler/cpp/cpp_extension.cc | 0 .../google/protobuf/compiler/cpp/cpp_extension.h | 0 .../src/google/protobuf/compiler/cpp/cpp_field.cc | 0 .../src/google/protobuf/compiler/cpp/cpp_field.h | 0 .../src/google/protobuf/compiler/cpp/cpp_file.cc | 0 .../src/google/protobuf/compiler/cpp/cpp_file.h | 0 .../google/protobuf/compiler/cpp/cpp_generator.cc | 0 .../google/protobuf/compiler/cpp/cpp_generator.h | 0 .../src/google/protobuf/compiler/cpp/cpp_helpers.cc | 0 .../src/google/protobuf/compiler/cpp/cpp_helpers.h | 0 .../src/google/protobuf/compiler/cpp/cpp_message.cc | 0 .../src/google/protobuf/compiler/cpp/cpp_message.h | 0 .../protobuf/compiler/cpp/cpp_message_field.cc | 0 .../protobuf/compiler/cpp/cpp_message_field.h | 0 .../protobuf/compiler/cpp/cpp_plugin_unittest.cc | 0 .../protobuf/compiler/cpp/cpp_primitive_field.cc | 0 .../protobuf/compiler/cpp/cpp_primitive_field.h | 0 .../src/google/protobuf/compiler/cpp/cpp_service.cc | 0 .../src/google/protobuf/compiler/cpp/cpp_service.h | 0 .../protobuf/compiler/cpp/cpp_string_field.cc | 0 .../google/protobuf/compiler/cpp/cpp_string_field.h | 0 .../compiler/cpp/cpp_test_bad_identifiers.proto | 0 .../google/protobuf/compiler/cpp/cpp_unittest.cc | 0 .../src/google/protobuf/compiler/importer.cc | 0 .../src/google/protobuf/compiler/importer.h | 0 .../google/protobuf/compiler/importer_unittest.cc | 0 .../src/google/protobuf/compiler/java/java_enum.cc | 0 .../src/google/protobuf/compiler/java/java_enum.h | 0 .../protobuf/compiler/java/java_enum_field.cc | 0 .../google/protobuf/compiler/java/java_enum_field.h | 0 .../google/protobuf/compiler/java/java_extension.cc | 0 .../google/protobuf/compiler/java/java_extension.h | 0 .../src/google/protobuf/compiler/java/java_field.cc | 0 .../src/google/protobuf/compiler/java/java_field.h | 0 .../src/google/protobuf/compiler/java/java_file.cc | 0 .../src/google/protobuf/compiler/java/java_file.h | 0 .../google/protobuf/compiler/java/java_generator.cc | 0 .../google/protobuf/compiler/java/java_generator.h | 0 .../google/protobuf/compiler/java/java_helpers.cc | 0 .../google/protobuf/compiler/java/java_helpers.h | 0 .../google/protobuf/compiler/java/java_message.cc | 0 .../google/protobuf/compiler/java/java_message.h | 0 .../protobuf/compiler/java/java_message_field.cc | 0 .../protobuf/compiler/java/java_message_field.h | 0 .../protobuf/compiler/java/java_plugin_unittest.cc | 0 .../protobuf/compiler/java/java_primitive_field.cc | 0 .../protobuf/compiler/java/java_primitive_field.h | 0 .../google/protobuf/compiler/java/java_service.cc | 0 .../google/protobuf/compiler/java/java_service.h | 0 .../protobuf/compiler/java/java_string_field.cc | 0 .../protobuf/compiler/java/java_string_field.h | 0 .../protobuf/src/google/protobuf/compiler/main.cc | 0 .../google/protobuf/compiler/mock_code_generator.cc | 0 .../google/protobuf/compiler/mock_code_generator.h | 0 .../src/google/protobuf/compiler/package_info.h | 0 .../protobuf/src/google/protobuf/compiler/parser.cc | 0 .../protobuf/src/google/protobuf/compiler/parser.h | 0 .../src/google/protobuf/compiler/parser_unittest.cc | 0 .../protobuf/src/google/protobuf/compiler/plugin.cc | 0 .../protobuf/src/google/protobuf/compiler/plugin.h | 0 .../src/google/protobuf/compiler/plugin.pb.cc | 0 .../src/google/protobuf/compiler/plugin.pb.h | 0 .../src/google/protobuf/compiler/plugin.proto | 0 .../protobuf/compiler/python/python_generator.cc | 0 .../protobuf/compiler/python/python_generator.h | 0 .../compiler/python/python_plugin_unittest.cc | 0 .../src/google/protobuf/compiler/subprocess.cc | 0 .../src/google/protobuf/compiler/subprocess.h | 0 .../src/google/protobuf/compiler/test_plugin.cc | 0 .../google/protobuf/compiler/zip_output_unittest.sh | 0 .../src/google/protobuf/compiler/zip_writer.cc | 0 .../src/google/protobuf/compiler/zip_writer.h | 0 .../protobuf/src/google/protobuf/descriptor.cc | 0 .../protobuf/src/google/protobuf/descriptor.h | 0 .../protobuf/src/google/protobuf/descriptor.pb.cc | 0 .../protobuf/src/google/protobuf/descriptor.pb.h | 0 .../protobuf/src/google/protobuf/descriptor.proto | 0 .../src/google/protobuf/descriptor_database.cc | 0 .../src/google/protobuf/descriptor_database.h | 0 .../google/protobuf/descriptor_database_unittest.cc | 0 .../src/google/protobuf/descriptor_unittest.cc | 0 .../protobuf/src/google/protobuf/dynamic_message.cc | 0 .../protobuf/src/google/protobuf/dynamic_message.h | 0 .../src/google/protobuf/dynamic_message_unittest.cc | 0 .../protobuf/src/google/protobuf/extension_set.cc | 0 .../protobuf/src/google/protobuf/extension_set.h | 0 .../src/google/protobuf/extension_set_heavy.cc | 0 .../src/google/protobuf/extension_set_unittest.cc | 0 .../google/protobuf/generated_message_reflection.cc | 0 .../google/protobuf/generated_message_reflection.h | 0 .../generated_message_reflection_unittest.cc | 0 .../src/google/protobuf/generated_message_util.cc | 0 .../src/google/protobuf/generated_message_util.h | 0 .../protobuf/src/google/protobuf/io/coded_stream.cc | 0 .../protobuf/src/google/protobuf/io/coded_stream.h | 0 .../src/google/protobuf/io/coded_stream_inl.h | 0 .../src/google/protobuf/io/coded_stream_unittest.cc | 0 .../protobuf/src/google/protobuf/io/gzip_stream.cc | 0 .../protobuf/src/google/protobuf/io/gzip_stream.h | 0 .../src/google/protobuf/io/gzip_stream_unittest.sh | 0 .../protobuf/src/google/protobuf/io/package_info.h | 0 .../protobuf/src/google/protobuf/io/printer.cc | 0 .../protobuf/src/google/protobuf/io/printer.h | 0 .../src/google/protobuf/io/printer_unittest.cc | 0 .../protobuf/src/google/protobuf/io/tokenizer.cc | 0 .../protobuf/src/google/protobuf/io/tokenizer.h | 0 .../src/google/protobuf/io/tokenizer_unittest.cc | 0 .../src/google/protobuf/io/zero_copy_stream.cc | 0 .../src/google/protobuf/io/zero_copy_stream.h | 0 .../src/google/protobuf/io/zero_copy_stream_impl.cc | 0 .../src/google/protobuf/io/zero_copy_stream_impl.h | 0 .../protobuf/io/zero_copy_stream_impl_lite.cc | 0 .../google/protobuf/io/zero_copy_stream_impl_lite.h | 0 .../google/protobuf/io/zero_copy_stream_unittest.cc | 0 .../protobuf/src/google/protobuf/lite_unittest.cc | 0 .../protobuf/src/google/protobuf/message.cc | 0 .../protobuf/protobuf/src/google/protobuf/message.h | 0 .../protobuf/src/google/protobuf/message_lite.cc | 0 .../protobuf/src/google/protobuf/message_lite.h | 0 .../src/google/protobuf/message_unittest.cc | 0 .../protobuf/src/google/protobuf/package_info.h | 0 .../protobuf/src/google/protobuf/reflection_ops.cc | 0 .../protobuf/src/google/protobuf/reflection_ops.h | 0 .../src/google/protobuf/reflection_ops_unittest.cc | 0 .../protobuf/src/google/protobuf/repeated_field.cc | 0 .../protobuf/src/google/protobuf/repeated_field.h | 0 .../src/google/protobuf/repeated_field_unittest.cc | 0 .../protobuf/src/google/protobuf/service.cc | 0 .../protobuf/protobuf/src/google/protobuf/service.h | 0 .../protobuf/src/google/protobuf/stubs/common.cc | 0 .../protobuf/src/google/protobuf/stubs/common.h | 0 .../src/google/protobuf/stubs/common_unittest.cc | 0 .../protobuf/src/google/protobuf/stubs/hash.h | 0 .../protobuf/src/google/protobuf/stubs/map-util.h | 0 .../protobuf/src/google/protobuf/stubs/once.cc | 0 .../protobuf/src/google/protobuf/stubs/once.h | 0 .../src/google/protobuf/stubs/once_unittest.cc | 0 .../src/google/protobuf/stubs/stl_util-inl.h | 0 .../src/google/protobuf/stubs/structurally_valid.cc | 0 .../protobuf/stubs/structurally_valid_unittest.cc | 0 .../protobuf/src/google/protobuf/stubs/strutil.cc | 0 .../protobuf/src/google/protobuf/stubs/strutil.h | 0 .../src/google/protobuf/stubs/strutil_unittest.cc | 0 .../src/google/protobuf/stubs/substitute.cc | 0 .../protobuf/src/google/protobuf/stubs/substitute.h | 0 .../protobuf/src/google/protobuf/test_util.cc | 0 .../protobuf/src/google/protobuf/test_util.h | 0 .../protobuf/src/google/protobuf/test_util_lite.cc | 0 .../protobuf/src/google/protobuf/test_util_lite.h | 0 .../src/google/protobuf/testdata/golden_message | Bin .../protobuf/testdata/golden_packed_fields_message | Bin .../protobuf/testdata/text_format_unittest_data.txt | 0 .../text_format_unittest_extensions_data.txt | 0 .../protobuf/src/google/protobuf/testing/file.cc | 0 .../protobuf/src/google/protobuf/testing/file.h | 0 .../src/google/protobuf/testing/googletest.cc | 0 .../src/google/protobuf/testing/googletest.h | 0 .../src/google/protobuf/testing/zcgunzip.cc | 0 .../protobuf/src/google/protobuf/testing/zcgzip.cc | 0 .../protobuf/src/google/protobuf/text_format.cc | 0 .../protobuf/src/google/protobuf/text_format.h | 0 .../src/google/protobuf/text_format_unittest.cc | 0 .../protobuf/src/google/protobuf/unittest.proto | 0 .../google/protobuf/unittest_custom_options.proto | 0 .../protobuf/unittest_embed_optimize_for.proto | 0 .../src/google/protobuf/unittest_empty.proto | 0 .../protobuf/unittest_enormous_descriptor.proto | 0 .../src/google/protobuf/unittest_import.proto | 0 .../src/google/protobuf/unittest_import_lite.proto | 0 .../src/google/protobuf/unittest_lite.proto | 0 .../protobuf/unittest_lite_imports_nonlite.proto | 0 .../src/google/protobuf/unittest_mset.proto | 0 .../protobuf/unittest_no_generic_services.proto | 0 .../src/google/protobuf/unittest_optimize_for.proto | 0 .../src/google/protobuf/unknown_field_set.cc | 0 .../src/google/protobuf/unknown_field_set.h | 0 .../google/protobuf/unknown_field_set_unittest.cc | 0 .../protobuf/src/google/protobuf/wire_format.cc | 0 .../protobuf/src/google/protobuf/wire_format.h | 0 .../src/google/protobuf/wire_format_lite.cc | 0 .../protobuf/src/google/protobuf/wire_format_lite.h | 0 .../src/google/protobuf/wire_format_lite_inl.h | 0 .../src/google/protobuf/wire_format_unittest.cc | 0 .../protobuf/protobuf/src/solaris/libstdc++.la | 0 .../protobuf/protobuf/vsprojects/config.h | 0 .../protobuf/vsprojects/convert2008to2005.sh | 0 .../protobuf/vsprojects/extract_includes.bat | 0 .../protobuf/vsprojects/libprotobuf-lite.vcproj | 0 .../protobuf/protobuf/vsprojects/libprotobuf.vcproj | 0 .../protobuf/protobuf/vsprojects/libprotoc.vcproj | 0 .../protobuf/protobuf/vsprojects/lite-test.vcproj | 0 .../protobuf/protobuf/vsprojects/protobuf.sln | 0 .../protobuf/protobuf/vsprojects/protoc.vcproj | 0 .../protobuf/protobuf/vsprojects/readme.txt | 0 .../protobuf/protobuf/vsprojects/test_plugin.vcproj | 0 .../protobuf/protobuf/vsprojects/tests.vcproj | 0 {spotify => archive/spotify}/callbacks.h | 0 {spotify => archive/spotify}/cmake/FindQJSON.cmake | 0 .../spotify}/cmake/Findlibspotify.cmake | 0 {spotify => archive/spotify}/consolewatcher.cpp | 0 {spotify => archive/spotify}/consolewatcher.h | 0 .../kdlockedsharedmemorypointer.cpp | 0 .../kdlockedsharedmemorypointer.h | 0 .../kdsharedmemorylocker.cpp | 0 .../kdsingleapplicationguard/kdsharedmemorylocker.h | 0 .../kdsingleapplicationguard.cpp | 0 .../kdsingleapplicationguard.h | 0 .../kdsingleapplicationguard/kdtoolsglobal.cpp | 0 .../kdsingleapplicationguard/kdtoolsglobal.h | 0 .../spotify}/kdsingleapplicationguard/license-gpl | 0 .../spotify}/kdsingleapplicationguard/pimpl_ptr.cpp | 0 .../spotify}/kdsingleapplicationguard/pimpl_ptr.h | 0 {spotify => archive/spotify}/logger.cpp | 0 {spotify => archive/spotify}/logger.h | 0 {spotify => archive/spotify}/main.cpp | 0 {spotify => archive/spotify}/main.h | 0 .../spotify}/qxtweb-standalone/CMakeLists.txt | 0 .../spotify}/qxtweb-standalone/README.txt | 0 .../qxtweb/QxtAbstractHttpConnector | 0 .../qxtweb-standalone/qxtweb/QxtAbstractWebService | 0 .../qxtweb/QxtAbstractWebSessionManager | 0 .../qxtweb-standalone/qxtweb/QxtHtmlTemplate | 0 .../qxtweb-standalone/qxtweb/QxtHttpServerConnector | 0 .../qxtweb-standalone/qxtweb/QxtHttpSessionManager | 0 .../spotify}/qxtweb-standalone/qxtweb/QxtMail | 0 .../qxtweb-standalone/qxtweb/QxtScgiServerConnector | 0 .../spotify}/qxtweb-standalone/qxtweb/QxtSendmail | 0 .../spotify}/qxtweb-standalone/qxtweb/QxtWeb | 0 .../qxtweb-standalone/qxtweb/QxtWebCgiService | 0 .../spotify}/qxtweb-standalone/qxtweb/QxtWebContent | 0 .../qxtweb-standalone/qxtweb/QxtWebErrorEvent | 0 .../spotify}/qxtweb-standalone/qxtweb/QxtWebEvent | 0 .../qxtweb-standalone/qxtweb/QxtWebFileUploadEvent | 0 .../qxtweb-standalone/qxtweb/QxtWebPageEvent | 0 .../qxtweb-standalone/qxtweb/QxtWebRedirectEvent | 0 .../qxtweb/QxtWebRemoveCookieEvent | 0 .../qxtweb-standalone/qxtweb/QxtWebRequestEvent | 0 .../qxtweb-standalone/qxtweb/QxtWebServiceDirectory | 0 .../qxtweb-standalone/qxtweb/QxtWebSlotService | 0 .../qxtweb-standalone/qxtweb/QxtWebStoreCookieEvent | 0 .../qxtweb/qxtabstracthttpconnector.cpp | 0 .../qxtweb/qxtabstracthttpconnector.h | 0 .../qxtweb/qxtabstractwebservice.cpp | 0 .../qxtweb/qxtabstractwebservice.h | 0 .../qxtweb/qxtabstractwebsessionmanager.cpp | 0 .../qxtweb/qxtabstractwebsessionmanager.h | 0 .../qxtweb/qxtabstractwebsessionmanager_p.h | 0 .../qxtweb-standalone/qxtweb/qxtboundcfunction.h | 0 .../qxtweb-standalone/qxtweb/qxtboundfunction.h | 0 .../qxtweb-standalone/qxtweb/qxtboundfunctionbase.h | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtglobal.cpp | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtglobal.h | 0 .../qxtweb-standalone/qxtweb/qxthtmltemplate.cpp | 0 .../qxtweb-standalone/qxtweb/qxthtmltemplate.h | 0 .../qxtweb/qxthttpserverconnector.cpp | 0 .../qxtweb/qxthttpsessionmanager.cpp | 0 .../qxtweb/qxthttpsessionmanager.h | 0 .../qxtweb-standalone/qxtweb/qxtmetaobject.cpp | 0 .../qxtweb-standalone/qxtweb/qxtmetaobject.h | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtmetatype.h | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtnull.cpp | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtnull.h | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtnullable.h | 0 .../qxtweb/qxtscgiserverconnector.cpp | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtweb.h | 0 .../qxtweb-standalone/qxtweb/qxtwebcgiservice.cpp | 0 .../qxtweb-standalone/qxtweb/qxtwebcgiservice.h | 0 .../qxtweb-standalone/qxtweb/qxtwebcgiservice_p.h | 0 .../qxtweb-standalone/qxtweb/qxtwebcontent.cpp | 0 .../qxtweb-standalone/qxtweb/qxtwebcontent.h | 0 .../qxtweb-standalone/qxtweb/qxtwebevent.cpp | 0 .../spotify}/qxtweb-standalone/qxtweb/qxtwebevent.h | 0 .../qxtweb/qxtwebservicedirectory.cpp | 0 .../qxtweb/qxtwebservicedirectory.h | 0 .../qxtweb/qxtwebservicedirectory_p.h | 0 .../qxtweb-standalone/qxtweb/qxtwebslotservice.cpp | 0 .../qxtweb-standalone/qxtweb/qxtwebslotservice.h | 0 {spotify => archive/spotify}/spotify-sourceicon.png | Bin {spotify => archive/spotify}/spotify.desktop | 0 {spotify => archive/spotify}/spotify_key.h | 0 {spotify => archive/spotify}/spotifyiodevice.cpp | 0 {spotify => archive/spotify}/spotifyiodevice.h | 0 {spotify => archive/spotify}/spotifyloghandler.cpp | 0 {spotify => archive/spotify}/spotifyloghandler.h | 0 {spotify => archive/spotify}/spotifyplayback.cpp | 0 {spotify => archive/spotify}/spotifyplayback.h | 0 {spotify => archive/spotify}/spotifyplaylists.cpp | 0 {spotify => archive/spotify}/spotifyplaylists.h | 0 {spotify => archive/spotify}/spotifyresolver.cpp | 0 {spotify => archive/spotify}/spotifyresolver.h | 0 {spotify => archive/spotify}/spotifysearch.cpp | 0 {spotify => archive/spotify}/spotifysearch.h | 0 {spotify => archive/spotify}/spotifysession.cpp | 0 {spotify => archive/spotify}/spotifysession.h | 0 {spotify => archive/spotify}/tomahawkspotify.kdev4 | 0 1255 files changed, 0 insertions(+), 0 deletions(-) rename {spotify => archive/spotify}/BreakPad.cpp (100%) rename {spotify => archive/spotify}/BreakPad.h (100%) rename {spotify => archive/spotify}/CMakeLists.txt (100%) rename {spotify => archive/spotify}/PlaylistClosure.cpp (100%) rename {spotify => archive/spotify}/PlaylistClosure.h (100%) rename {spotify => archive/spotify}/appkey.h (100%) rename {spotify => archive/spotify}/audiohttpserver.cpp (100%) rename {spotify => archive/spotify}/audiohttpserver.h (100%) rename {spotify => archive/spotify}/breakpad/CMakeLists.txt (100%) rename {spotify => archive/spotify}/breakpad/client/apple/Framework/BreakpadDefines.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/android_link.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/android_ucontext.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/crash_generation/client_info.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/crash_generation/crash_generation_client.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/crash_generation/crash_generation_client.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/crash_generation/crash_generation_server.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/crash_generation/crash_generation_server.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/data/linux-gate-amd.sym (100%) rename {spotify => archive/spotify}/breakpad/client/linux/data/linux-gate-intel.sym (100%) rename {spotify => archive/spotify}/breakpad/client/linux/handler/exception_handler.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/handler/exception_handler.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/handler/exception_handler_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/log/log.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/log/log.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/directory_reader.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/directory_reader_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/line_reader.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/line_reader_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_core_dumper.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_core_dumper.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_core_dumper_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_dumper.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_dumper.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_dumper_unittest_helper.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/minidump_extension_linux.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/minidump_writer.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/minidump_writer.h (100%) rename {spotify => archive/spotify}/breakpad/client/linux/minidump_writer/minidump_writer_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/client/linux/sender/google_crash_report_sender.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/Breakpad.xcodeproj/project.pbxproj (100%) rename {spotify => archive/spotify}/breakpad/client/mac/Framework/Breakpad.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/Framework/Breakpad.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/Framework/Breakpad_Prefix.pch (100%) rename {spotify => archive/spotify}/breakpad/client/mac/Framework/Info.plist (100%) rename {spotify => archive/spotify}/breakpad/client/mac/Framework/OnDemandServer.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/Framework/OnDemandServer.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/UnitTests-Info.plist (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/ConfigFile.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/ConfigFile.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/Inspector.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/Inspector.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/InspectorMain.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/client_info.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/crash_generation_client.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/crash_generation_client.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/crash_generation_server.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/crash_generation/crash_generation_server.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/breakpad_nlist_64.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/breakpad_nlist_64.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/dynamic_images.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/dynamic_images.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/exception_handler.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/exception_handler.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/mach_vm_compat.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/minidump_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/minidump_generator.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/minidump_test.xcodeproj/project.pbxproj (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/minidump_tests32-Info.plist (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/minidump_tests64-Info.plist (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/obj-cTestCases-Info.plist (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/protected_memory_allocator.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/protected_memory_allocator.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/DynamicImagesTests.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/DynamicImagesTests.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/breakpad_nlist_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/breakpad_nlist_test.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/dwarftests.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/dwarftests.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/testdata/dump_syms_dwarf_data (100%) rename {spotify => archive/spotify}/breakpad/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/Breakpad.xib (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/English.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/English.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/ReporterIcon.graffle (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/crash_report_sender-Info.plist (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/crash_report_sender.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/crash_report_sender.icns (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/crash_report_sender.m (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/da.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/da.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/de.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/de.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/es.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/es.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/fr.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/fr.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/goArrow.png (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/it.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/it.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/ja.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/ja.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/nl.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/nl.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/no.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/no.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/sl.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/sl.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/sv.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/sv.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/tr.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/tr.lproj/Localizable.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/uploader.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/sender/uploader.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/Controller.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/Controller.m (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/English.lproj/InfoPlist.strings (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/English.lproj/MainMenu.xib (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/Info.plist (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/TestClass.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/TestClass.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/bomb.icns (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/crashInMain (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/crashduringload (100%) rename {spotify => archive/spotify}/breakpad/client/mac/testapp/main.m (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/BreakpadFramework_Test.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/SimpleStringDictionaryTest.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/SimpleStringDictionaryTest.mm (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/crash_generation_server_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/exception_handler_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/minidump_generator_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/minidump_generator_test_helper.cc (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/spawn_child_process.h (100%) rename {spotify => archive/spotify}/breakpad/client/mac/tests/testlogging.h (100%) rename {spotify => archive/spotify}/breakpad/client/minidump_file_writer-inl.h (100%) rename {spotify => archive/spotify}/breakpad/client/minidump_file_writer.cc (100%) rename {spotify => archive/spotify}/breakpad/client/minidump_file_writer.h (100%) rename {spotify => archive/spotify}/breakpad/client/minidump_file_writer_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/exception_handler.cc (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/exception_handler.h (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/exception_handler_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/minidump_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/minidump_generator.h (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/minidump_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/solaris_lwp.cc (100%) rename {spotify => archive/spotify}/breakpad/client/solaris/handler/solaris_lwp.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/breakpad_client.gyp (100%) rename {spotify => archive/spotify}/breakpad/client/windows/build/common.gypi (100%) rename {spotify => archive/spotify}/breakpad/client/windows/build/external_code.gypi (100%) rename {spotify => archive/spotify}/breakpad/client/windows/build/internal/release_defaults.gypi (100%) rename {spotify => archive/spotify}/breakpad/client/windows/build/internal/release_impl.gypi (100%) rename {spotify => archive/spotify}/breakpad/client/windows/build/internal/release_impl_official.gypi (100%) rename {spotify => archive/spotify}/breakpad/client/windows/build/release.gypi (100%) rename {spotify => archive/spotify}/breakpad/client/windows/common/auto_critical_section.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/common/ipc_protocol.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/ReadMe.txt (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/client_info.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/client_info.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/crash_generation.gyp (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/crash_generation_client.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/crash_generation_client.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/crash_generation_server.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/crash_generation_server.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/minidump_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/crash_generation/minidump_generator.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/handler/exception_handler.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/handler/exception_handler.gyp (100%) rename {spotify => archive/spotify}/breakpad/client/windows/handler/exception_handler.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/sender/crash_report_sender.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/sender/crash_report_sender.gyp (100%) rename {spotify => archive/spotify}/breakpad/client/windows/sender/crash_report_sender.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/abstract_class.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/abstract_class.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.gyp (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.ico (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.rc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/resource.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/tests/crash_generation_app/small.ico (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/client_tests.gyp (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/crash_generation_server_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/dump_analysis.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/dump_analysis.h (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/exception_handler_death_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/exception_handler_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/minidump_test.cc (100%) rename {spotify => archive/spotify}/breakpad/client/windows/unittests/testing.gyp (100%) rename {spotify => archive/spotify}/breakpad/common/basictypes.h (100%) rename {spotify => archive/spotify}/breakpad/common/byte_cursor.h (100%) rename {spotify => archive/spotify}/breakpad/common/byte_cursor_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/convert_UTF.c (100%) rename {spotify => archive/spotify}/breakpad/common/convert_UTF.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/bytereader-inl.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/bytereader.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/bytereader.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/bytereader_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/cfi_assembler.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/cfi_assembler.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2diehandler.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2diehandler.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2diehandler_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2enums.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2reader.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2reader.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2reader_cfi_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2reader_die_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/dwarf2reader_test_common.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/functioninfo.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/functioninfo.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/line_state_machine.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf/types.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_cfi_to_module.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_cfi_to_module.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_cfi_to_module_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_cu_to_module.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_cu_to_module.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_cu_to_module_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_line_to_module.cc (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_line_to_module.h (100%) rename {spotify => archive/spotify}/breakpad/common/dwarf_line_to_module_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/language.cc (100%) rename {spotify => archive/spotify}/breakpad/common/language.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/dump_symbols.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/dump_symbols.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/dump_symbols_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/eintr_wrapper.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/elf_core_dump.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/elf_core_dump.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/elf_core_dump_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/elf_symbols_to_module.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/elf_symbols_to_module.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/elf_symbols_to_module_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/file_id.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/file_id.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/file_id_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/google_crashdump_uploader.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/google_crashdump_uploader.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/google_crashdump_uploader_test.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/guid_creator.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/guid_creator.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/http_upload.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/http_upload.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/libcurl_wrapper.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/libcurl_wrapper.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/linux_libc_support.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/linux_libc_support_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/memory_mapped_file.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/memory_mapped_file.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/memory_mapped_file_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/safe_readlink.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/safe_readlink.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/safe_readlink_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/synth_elf.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/synth_elf.h (100%) rename {spotify => archive/spotify}/breakpad/common/linux/synth_elf_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/tests/crash_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/common/linux/tests/crash_generator.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/Breakpad.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/common/mac/BreakpadDebug.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/common/mac/BreakpadRelease.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/common/mac/GTMDefines.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/GTMGarbageCollection.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/GTMLogger.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/GTMLogger.m (100%) rename {spotify => archive/spotify}/breakpad/common/mac/HTTPMultipartUpload.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/HTTPMultipartUpload.m (100%) rename {spotify => archive/spotify}/breakpad/common/mac/MachIPC.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/MachIPC.mm (100%) rename {spotify => archive/spotify}/breakpad/common/mac/SimpleStringDictionary.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/SimpleStringDictionary.mm (100%) rename {spotify => archive/spotify}/breakpad/common/mac/bootstrap_compat.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/bootstrap_compat.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/byteswap.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/dump_syms.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/dump_syms.mm (100%) rename {spotify => archive/spotify}/breakpad/common/mac/file_id.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/file_id.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_id.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_id.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_reader.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_reader.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_reader_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_utilities.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_utilities.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_walker.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/macho_walker.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/scoped_task_suspend-inl.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/string_utilities.cc (100%) rename {spotify => archive/spotify}/breakpad/common/mac/string_utilities.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/testing/GTMSenTestCase.h (100%) rename {spotify => archive/spotify}/breakpad/common/mac/testing/GTMSenTestCase.m (100%) rename {spotify => archive/spotify}/breakpad/common/md5.cc (100%) rename {spotify => archive/spotify}/breakpad/common/md5.h (100%) rename {spotify => archive/spotify}/breakpad/common/memory.h (100%) rename {spotify => archive/spotify}/breakpad/common/memory_range.h (100%) rename {spotify => archive/spotify}/breakpad/common/memory_range_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/memory_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/module.cc (100%) rename {spotify => archive/spotify}/breakpad/common/module.h (100%) rename {spotify => archive/spotify}/breakpad/common/module_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/solaris/dump_symbols.cc (100%) rename {spotify => archive/spotify}/breakpad/common/solaris/dump_symbols.h (100%) rename {spotify => archive/spotify}/breakpad/common/solaris/file_id.cc (100%) rename {spotify => archive/spotify}/breakpad/common/solaris/file_id.h (100%) rename {spotify => archive/spotify}/breakpad/common/solaris/guid_creator.cc (100%) rename {spotify => archive/spotify}/breakpad/common/solaris/guid_creator.h (100%) rename {spotify => archive/spotify}/breakpad/common/solaris/message_output.h (100%) rename {spotify => archive/spotify}/breakpad/common/stabs_reader.cc (100%) rename {spotify => archive/spotify}/breakpad/common/stabs_reader.h (100%) rename {spotify => archive/spotify}/breakpad/common/stabs_reader_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/stabs_to_module.cc (100%) rename {spotify => archive/spotify}/breakpad/common/stabs_to_module.h (100%) rename {spotify => archive/spotify}/breakpad/common/stabs_to_module_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/string_conversion.cc (100%) rename {spotify => archive/spotify}/breakpad/common/string_conversion.h (100%) rename {spotify => archive/spotify}/breakpad/common/test_assembler.cc (100%) rename {spotify => archive/spotify}/breakpad/common/test_assembler.h (100%) rename {spotify => archive/spotify}/breakpad/common/test_assembler_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/common/testdata/func-line-pairing.h (100%) rename {spotify => archive/spotify}/breakpad/common/windows/guid_string.cc (100%) rename {spotify => archive/spotify}/breakpad/common/windows/guid_string.h (100%) rename {spotify => archive/spotify}/breakpad/common/windows/http_upload.cc (100%) rename {spotify => archive/spotify}/breakpad/common/windows/http_upload.h (100%) rename {spotify => archive/spotify}/breakpad/common/windows/pdb_source_line_writer.cc (100%) rename {spotify => archive/spotify}/breakpad/common/windows/pdb_source_line_writer.h (100%) rename {spotify => archive/spotify}/breakpad/common/windows/string_utils-inl.h (100%) rename {spotify => archive/spotify}/breakpad/common/windows/string_utils.cc (100%) rename {spotify => archive/spotify}/breakpad/config.h.in (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/breakpad_types.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_cpu_amd64.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_cpu_arm.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_cpu_ppc.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_cpu_ppc64.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_cpu_sparc.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_cpu_x86.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_exception_linux.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_exception_mac.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_exception_solaris.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_exception_win32.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_format.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/common/minidump_size.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/basic_source_line_resolver.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/call_stack.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/code_module.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/code_modules.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/exploitability.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/fast_source_line_resolver.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/memory_region.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/minidump.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/minidump_processor.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/process_state.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/source_line_resolver_base.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/source_line_resolver_interface.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/stack_frame.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/stack_frame_cpu.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/stackwalker.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/symbol_supplier.h (100%) rename {spotify => archive/spotify}/breakpad/google_breakpad/processor/system_info.h (100%) rename {spotify => archive/spotify}/breakpad/processor/address_map-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/address_map.h (100%) rename {spotify => archive/spotify}/breakpad/processor/address_map_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/basic_code_module.h (100%) rename {spotify => archive/spotify}/breakpad/processor/basic_code_modules.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/basic_code_modules.h (100%) rename {spotify => archive/spotify}/breakpad/processor/basic_source_line_resolver.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/basic_source_line_resolver_types.h (100%) rename {spotify => archive/spotify}/breakpad/processor/basic_source_line_resolver_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/binarystream.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/binarystream.h (100%) rename {spotify => archive/spotify}/breakpad/processor/binarystream_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/call_stack.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/cfi_frame_info-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/cfi_frame_info.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/cfi_frame_info.h (100%) rename {spotify => archive/spotify}/breakpad/processor/cfi_frame_info_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/contained_range_map-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/contained_range_map.h (100%) rename {spotify => archive/spotify}/breakpad/processor/contained_range_map_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/disassembler_x86.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/disassembler_x86.h (100%) rename {spotify => archive/spotify}/breakpad/processor/disassembler_x86_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/exploitability.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/exploitability_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/exploitability_win.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/exploitability_win.h (100%) rename {spotify => archive/spotify}/breakpad/processor/fast_source_line_resolver.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/fast_source_line_resolver_types.h (100%) rename {spotify => archive/spotify}/breakpad/processor/fast_source_line_resolver_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/linked_ptr.h (100%) rename {spotify => archive/spotify}/breakpad/processor/logging.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/logging.h (100%) rename {spotify => archive/spotify}/breakpad/processor/map_serializers-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/map_serializers.h (100%) rename {spotify => archive/spotify}/breakpad/processor/map_serializers_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_dump.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_dump_test (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_processor.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_processor_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_stackwalk.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_stackwalk_machine_readable_test (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_stackwalk_test (100%) rename {spotify => archive/spotify}/breakpad/processor/minidump_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/module_comparer.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/module_comparer.h (100%) rename {spotify => archive/spotify}/breakpad/processor/module_factory.h (100%) rename {spotify => archive/spotify}/breakpad/processor/module_serializer.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/module_serializer.h (100%) rename {spotify => archive/spotify}/breakpad/processor/pathname_stripper.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/pathname_stripper.h (100%) rename {spotify => archive/spotify}/breakpad/processor/pathname_stripper_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/postfix_evaluator-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/postfix_evaluator.h (100%) rename {spotify => archive/spotify}/breakpad/processor/postfix_evaluator_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/process_state.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/proto/README (100%) rename {spotify => archive/spotify}/breakpad/processor/proto/process_state.proto (100%) rename {spotify => archive/spotify}/breakpad/processor/range_map-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/range_map.h (100%) rename {spotify => archive/spotify}/breakpad/processor/range_map_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/scoped_ptr.h (100%) rename {spotify => archive/spotify}/breakpad/processor/simple_serializer-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/simple_serializer.h (100%) rename {spotify => archive/spotify}/breakpad/processor/simple_symbol_supplier.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/simple_symbol_supplier.h (100%) rename {spotify => archive/spotify}/breakpad/processor/source_line_resolver_base.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/source_line_resolver_base_types.h (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_amd64.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_amd64.h (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_amd64_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_arm.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_arm.h (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_arm_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_ppc.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_ppc.h (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_selftest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_selftest_sol.s (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_sparc.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_sparc.h (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_unittest_utils.h (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_x86.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_x86.h (100%) rename {spotify => archive/spotify}/breakpad/processor/stackwalker_x86_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/static_address_map-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_address_map.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_address_map_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/static_contained_range_map-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_contained_range_map.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_contained_range_map_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/static_map-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_map.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_map_iterator-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_map_iterator.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_map_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/static_range_map-inl.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_range_map.h (100%) rename {spotify => archive/spotify}/breakpad/processor/static_range_map_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/synth_minidump.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/synth_minidump.h (100%) rename {spotify => archive/spotify}/breakpad/processor/synth_minidump_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/synth_minidump_unittest_data.h (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_read_av.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_read_av_block_write.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_read_av_clobber_write.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_read_av_conditional.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_read_av_then_jmp.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_read_av_xchg_write.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_write_av.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/ascii_write_av_arg_to_call.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/exec_av_on_stack.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/linux_test_app.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/minidump2.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/minidump2.dump.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/minidump2.stackwalk.machine_readable.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/minidump2.stackwalk.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/module0.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/module1.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/module2.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/module3_bad.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/module4_bad.out (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/null_read_av.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/null_write_av.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/read_av_clobber_write.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/read_av_conditional.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/read_av_non_null.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/stack_exhaustion.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/test_app.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/testdata/write_av_non_null.dmp (100%) rename {spotify => archive/spotify}/breakpad/processor/tokenize.cc (100%) rename {spotify => archive/spotify}/breakpad/processor/tokenize.h (100%) rename {spotify => archive/spotify}/breakpad/processor/windows_frame_info.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/COPYING (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/curl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/curlbuild.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/curlrules.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/curlver.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/easy.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/mprintf.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/multi.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/stdcheaders.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/typecheck-gcc.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/curl/types.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/AUTHORS (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/COPYING (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/ChangeLog (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/INSTALL (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/NEWS (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/README (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/README.windows (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/aclocal.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/compile (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/config.guess (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/config.sub (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/configure (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/configure.ac (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/depcomp (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/doc/designstyle.css (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/doc/glog.html (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/google-glog.sln (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/install-sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/libglog.pc.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/ltmain.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/ac_have_attribute.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/ac_rwlock.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/acx_pthread.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/google_namespace.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/libtool.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/ltoptions.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/ltsugar.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/ltversion.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/lt~obsolete.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/namespaces.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/pc_from_ucontext.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/stl_namespace.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/m4/using_operator.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/missing (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/mkinstalldirs (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/README (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/changelog (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/compat (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/control (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/copyright (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/docs (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/deb/rules (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/rpm.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/packages/rpm/rpm.spec (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/base/commandlineflags.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/base/googleinit.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/base/mutex.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/config.h.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/config_for_unittests.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/demangle.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/demangle.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/demangle_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/demangle_unittest.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/demangle_unittest.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/glog/log_severity.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/glog/logging.h.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/glog/raw_logging.h.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/glog/stl_logging.h.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/glog/vlog_is_on.h.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/googletest.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/logging.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/logging_striplog_test.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/logging_striptest10.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/logging_striptest2.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/logging_striptest_main.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/logging_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/logging_unittest.err (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/mock-log.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/mock-log_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/raw_logging.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/signalhandler.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/signalhandler_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/signalhandler_unittest.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stacktrace.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stacktrace_generic-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stacktrace_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stacktrace_x86-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/stl_logging_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/symbolize.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/symbolize.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/symbolize_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/utilities.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/utilities.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/utilities_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/vlog_is_on.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/config.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/glog/log_severity.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/glog/logging.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/glog/raw_logging.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/glog/stl_logging.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/port.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/port.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/src/windows/preprocess.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/TODO (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_implicit.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_implicit.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_insn.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_insn.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_invariant.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_invariant.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_modrm.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_modrm.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_opcode_tables.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_opcode_tables.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_operand.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_operand.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_reg.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_reg.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_settings.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/ia32_settings.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/libdis.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/qword.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/swig/README (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/swig/libdisasm.i (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/swig/libdisasm_oop.i (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/swig/ruby/extconf.rb (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_disasm.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_format.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_imm.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_imm.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_insn.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_misc.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_operand_list.c (100%) rename {spotify => archive/spotify}/breakpad/third_party/libdisasm/x86_operand_list.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/linux/include/gflags/gflags.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/linux/include/gflags/gflags_completions.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/lss/linux_syscall_support.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/CHANGES.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/COPYING.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/INSTALL.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/README.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/autogen.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/benchmarks/google_message1.dat (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/benchmarks/google_message2.dat (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/configure.ac (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/editors/README.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/editors/proto.vim (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/README.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/add_person.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/add_person.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/list_people.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/examples/list_people.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/CHANGES (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/COPYING (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/README (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/configure.ac (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/production.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/README.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/pom.xml (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/post_process_dist.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/protobuf.pc.in (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/README.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/ez_setup.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/__init__.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/generator_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/service_reflection_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/test_util.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/text_format_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/mox.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/setup.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/python/stubout.py (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_message (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_packed_fields_message (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/config.h (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj (100%) rename {spotify => archive/spotify}/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj (100%) rename {spotify => archive/spotify}/callbacks.h (100%) rename {spotify => archive/spotify}/cmake/FindQJSON.cmake (100%) rename {spotify => archive/spotify}/cmake/Findlibspotify.cmake (100%) rename {spotify => archive/spotify}/consolewatcher.cpp (100%) rename {spotify => archive/spotify}/consolewatcher.h (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdlockedsharedmemorypointer.h (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdsharedmemorylocker.cpp (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdsharedmemorylocker.h (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdsingleapplicationguard.cpp (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdsingleapplicationguard.h (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdtoolsglobal.cpp (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/kdtoolsglobal.h (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/license-gpl (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/pimpl_ptr.cpp (100%) rename {spotify => archive/spotify}/kdsingleapplicationguard/pimpl_ptr.h (100%) rename {spotify => archive/spotify}/logger.cpp (100%) rename {spotify => archive/spotify}/logger.h (100%) rename {spotify => archive/spotify}/main.cpp (100%) rename {spotify => archive/spotify}/main.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/CMakeLists.txt (100%) rename {spotify => archive/spotify}/qxtweb-standalone/README.txt (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtAbstractHttpConnector (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtAbstractWebService (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtAbstractWebSessionManager (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtHtmlTemplate (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtHttpServerConnector (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtHttpSessionManager (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtMail (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtScgiServerConnector (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtSendmail (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWeb (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebCgiService (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebContent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebErrorEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebFileUploadEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebPageEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebRedirectEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebRemoveCookieEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebRequestEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebServiceDirectory (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebSlotService (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/QxtWebStoreCookieEvent (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtabstractwebservice.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtabstractwebservice.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager_p.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtboundcfunction.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtboundfunction.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtboundfunctionbase.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtglobal.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtglobal.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxthtmltemplate.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxthtmltemplate.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxthttpserverconnector.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxthttpsessionmanager.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxthttpsessionmanager.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtmetaobject.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtmetaobject.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtmetatype.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtnull.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtnull.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtnullable.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtscgiserverconnector.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtweb.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebcgiservice.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebcgiservice.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebcgiservice_p.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebcontent.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebcontent.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebevent.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebevent.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebservicedirectory.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebservicedirectory.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebservicedirectory_p.h (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebslotservice.cpp (100%) rename {spotify => archive/spotify}/qxtweb-standalone/qxtweb/qxtwebslotservice.h (100%) rename {spotify => archive/spotify}/spotify-sourceicon.png (100%) rename {spotify => archive/spotify}/spotify.desktop (100%) rename {spotify => archive/spotify}/spotify_key.h (100%) rename {spotify => archive/spotify}/spotifyiodevice.cpp (100%) rename {spotify => archive/spotify}/spotifyiodevice.h (100%) rename {spotify => archive/spotify}/spotifyloghandler.cpp (100%) rename {spotify => archive/spotify}/spotifyloghandler.h (100%) rename {spotify => archive/spotify}/spotifyplayback.cpp (100%) rename {spotify => archive/spotify}/spotifyplayback.h (100%) rename {spotify => archive/spotify}/spotifyplaylists.cpp (100%) rename {spotify => archive/spotify}/spotifyplaylists.h (100%) rename {spotify => archive/spotify}/spotifyresolver.cpp (100%) rename {spotify => archive/spotify}/spotifyresolver.h (100%) rename {spotify => archive/spotify}/spotifysearch.cpp (100%) rename {spotify => archive/spotify}/spotifysearch.h (100%) rename {spotify => archive/spotify}/spotifysession.cpp (100%) rename {spotify => archive/spotify}/spotifysession.h (100%) rename {spotify => archive/spotify}/tomahawkspotify.kdev4 (100%) diff --git a/spotify/BreakPad.cpp b/archive/spotify/BreakPad.cpp similarity index 100% rename from spotify/BreakPad.cpp rename to archive/spotify/BreakPad.cpp diff --git a/spotify/BreakPad.h b/archive/spotify/BreakPad.h similarity index 100% rename from spotify/BreakPad.h rename to archive/spotify/BreakPad.h diff --git a/spotify/CMakeLists.txt b/archive/spotify/CMakeLists.txt similarity index 100% rename from spotify/CMakeLists.txt rename to archive/spotify/CMakeLists.txt diff --git a/spotify/PlaylistClosure.cpp b/archive/spotify/PlaylistClosure.cpp similarity index 100% rename from spotify/PlaylistClosure.cpp rename to archive/spotify/PlaylistClosure.cpp diff --git a/spotify/PlaylistClosure.h b/archive/spotify/PlaylistClosure.h similarity index 100% rename from spotify/PlaylistClosure.h rename to archive/spotify/PlaylistClosure.h diff --git a/spotify/appkey.h b/archive/spotify/appkey.h similarity index 100% rename from spotify/appkey.h rename to archive/spotify/appkey.h diff --git a/spotify/audiohttpserver.cpp b/archive/spotify/audiohttpserver.cpp similarity index 100% rename from spotify/audiohttpserver.cpp rename to archive/spotify/audiohttpserver.cpp diff --git a/spotify/audiohttpserver.h b/archive/spotify/audiohttpserver.h similarity index 100% rename from spotify/audiohttpserver.h rename to archive/spotify/audiohttpserver.h diff --git a/spotify/breakpad/CMakeLists.txt b/archive/spotify/breakpad/CMakeLists.txt similarity index 100% rename from spotify/breakpad/CMakeLists.txt rename to archive/spotify/breakpad/CMakeLists.txt diff --git a/spotify/breakpad/client/apple/Framework/BreakpadDefines.h b/archive/spotify/breakpad/client/apple/Framework/BreakpadDefines.h similarity index 100% rename from spotify/breakpad/client/apple/Framework/BreakpadDefines.h rename to archive/spotify/breakpad/client/apple/Framework/BreakpadDefines.h diff --git a/spotify/breakpad/client/linux/android_link.h b/archive/spotify/breakpad/client/linux/android_link.h similarity index 100% rename from spotify/breakpad/client/linux/android_link.h rename to archive/spotify/breakpad/client/linux/android_link.h diff --git a/spotify/breakpad/client/linux/android_ucontext.h b/archive/spotify/breakpad/client/linux/android_ucontext.h similarity index 100% rename from spotify/breakpad/client/linux/android_ucontext.h rename to archive/spotify/breakpad/client/linux/android_ucontext.h diff --git a/spotify/breakpad/client/linux/crash_generation/client_info.h b/archive/spotify/breakpad/client/linux/crash_generation/client_info.h similarity index 100% rename from spotify/breakpad/client/linux/crash_generation/client_info.h rename to archive/spotify/breakpad/client/linux/crash_generation/client_info.h diff --git a/spotify/breakpad/client/linux/crash_generation/crash_generation_client.cc b/archive/spotify/breakpad/client/linux/crash_generation/crash_generation_client.cc similarity index 100% rename from spotify/breakpad/client/linux/crash_generation/crash_generation_client.cc rename to archive/spotify/breakpad/client/linux/crash_generation/crash_generation_client.cc diff --git a/spotify/breakpad/client/linux/crash_generation/crash_generation_client.h b/archive/spotify/breakpad/client/linux/crash_generation/crash_generation_client.h similarity index 100% rename from spotify/breakpad/client/linux/crash_generation/crash_generation_client.h rename to archive/spotify/breakpad/client/linux/crash_generation/crash_generation_client.h diff --git a/spotify/breakpad/client/linux/crash_generation/crash_generation_server.cc b/archive/spotify/breakpad/client/linux/crash_generation/crash_generation_server.cc similarity index 100% rename from spotify/breakpad/client/linux/crash_generation/crash_generation_server.cc rename to archive/spotify/breakpad/client/linux/crash_generation/crash_generation_server.cc diff --git a/spotify/breakpad/client/linux/crash_generation/crash_generation_server.h b/archive/spotify/breakpad/client/linux/crash_generation/crash_generation_server.h similarity index 100% rename from spotify/breakpad/client/linux/crash_generation/crash_generation_server.h rename to archive/spotify/breakpad/client/linux/crash_generation/crash_generation_server.h diff --git a/spotify/breakpad/client/linux/data/linux-gate-amd.sym b/archive/spotify/breakpad/client/linux/data/linux-gate-amd.sym similarity index 100% rename from spotify/breakpad/client/linux/data/linux-gate-amd.sym rename to archive/spotify/breakpad/client/linux/data/linux-gate-amd.sym diff --git a/spotify/breakpad/client/linux/data/linux-gate-intel.sym b/archive/spotify/breakpad/client/linux/data/linux-gate-intel.sym similarity index 100% rename from spotify/breakpad/client/linux/data/linux-gate-intel.sym rename to archive/spotify/breakpad/client/linux/data/linux-gate-intel.sym diff --git a/spotify/breakpad/client/linux/handler/exception_handler.cc b/archive/spotify/breakpad/client/linux/handler/exception_handler.cc similarity index 100% rename from spotify/breakpad/client/linux/handler/exception_handler.cc rename to archive/spotify/breakpad/client/linux/handler/exception_handler.cc diff --git a/spotify/breakpad/client/linux/handler/exception_handler.h b/archive/spotify/breakpad/client/linux/handler/exception_handler.h similarity index 100% rename from spotify/breakpad/client/linux/handler/exception_handler.h rename to archive/spotify/breakpad/client/linux/handler/exception_handler.h diff --git a/spotify/breakpad/client/linux/handler/exception_handler_unittest.cc b/archive/spotify/breakpad/client/linux/handler/exception_handler_unittest.cc similarity index 100% rename from spotify/breakpad/client/linux/handler/exception_handler_unittest.cc rename to archive/spotify/breakpad/client/linux/handler/exception_handler_unittest.cc diff --git a/spotify/breakpad/client/linux/log/log.cc b/archive/spotify/breakpad/client/linux/log/log.cc similarity index 100% rename from spotify/breakpad/client/linux/log/log.cc rename to archive/spotify/breakpad/client/linux/log/log.cc diff --git a/spotify/breakpad/client/linux/log/log.h b/archive/spotify/breakpad/client/linux/log/log.h similarity index 100% rename from spotify/breakpad/client/linux/log/log.h rename to archive/spotify/breakpad/client/linux/log/log.h diff --git a/spotify/breakpad/client/linux/minidump_writer/directory_reader.h b/archive/spotify/breakpad/client/linux/minidump_writer/directory_reader.h similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/directory_reader.h rename to archive/spotify/breakpad/client/linux/minidump_writer/directory_reader.h diff --git a/spotify/breakpad/client/linux/minidump_writer/directory_reader_unittest.cc b/archive/spotify/breakpad/client/linux/minidump_writer/directory_reader_unittest.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/directory_reader_unittest.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/directory_reader_unittest.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/line_reader.h b/archive/spotify/breakpad/client/linux/minidump_writer/line_reader.h similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/line_reader.h rename to archive/spotify/breakpad/client/linux/minidump_writer/line_reader.h diff --git a/spotify/breakpad/client/linux/minidump_writer/line_reader_unittest.cc b/archive/spotify/breakpad/client/linux/minidump_writer/line_reader_unittest.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/line_reader_unittest.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/line_reader_unittest.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.cc b/archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.h b/archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.h similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.h rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper.h diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper_unittest.cc b/archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper_unittest.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_core_dumper_unittest.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_core_dumper_unittest.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_dumper.cc b/archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_dumper.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_dumper.h b/archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper.h similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_dumper.h rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper.h diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_dumper_unittest_helper.cc b/archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper_unittest_helper.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_dumper_unittest_helper.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_dumper_unittest_helper.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc b/archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.h b/archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.h similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.h rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper.h diff --git a/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc b/archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/linux_ptrace_dumper_unittest.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/minidump_extension_linux.h b/archive/spotify/breakpad/client/linux/minidump_writer/minidump_extension_linux.h similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/minidump_extension_linux.h rename to archive/spotify/breakpad/client/linux/minidump_writer/minidump_extension_linux.h diff --git a/spotify/breakpad/client/linux/minidump_writer/minidump_writer.cc b/archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/minidump_writer.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer.cc diff --git a/spotify/breakpad/client/linux/minidump_writer/minidump_writer.h b/archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer.h similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/minidump_writer.h rename to archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer.h diff --git a/spotify/breakpad/client/linux/minidump_writer/minidump_writer_unittest.cc b/archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer_unittest.cc similarity index 100% rename from spotify/breakpad/client/linux/minidump_writer/minidump_writer_unittest.cc rename to archive/spotify/breakpad/client/linux/minidump_writer/minidump_writer_unittest.cc diff --git a/spotify/breakpad/client/linux/sender/google_crash_report_sender.cc b/archive/spotify/breakpad/client/linux/sender/google_crash_report_sender.cc similarity index 100% rename from spotify/breakpad/client/linux/sender/google_crash_report_sender.cc rename to archive/spotify/breakpad/client/linux/sender/google_crash_report_sender.cc diff --git a/spotify/breakpad/client/mac/Breakpad.xcodeproj/project.pbxproj b/archive/spotify/breakpad/client/mac/Breakpad.xcodeproj/project.pbxproj similarity index 100% rename from spotify/breakpad/client/mac/Breakpad.xcodeproj/project.pbxproj rename to archive/spotify/breakpad/client/mac/Breakpad.xcodeproj/project.pbxproj diff --git a/spotify/breakpad/client/mac/Framework/Breakpad.h b/archive/spotify/breakpad/client/mac/Framework/Breakpad.h similarity index 100% rename from spotify/breakpad/client/mac/Framework/Breakpad.h rename to archive/spotify/breakpad/client/mac/Framework/Breakpad.h diff --git a/spotify/breakpad/client/mac/Framework/Breakpad.mm b/archive/spotify/breakpad/client/mac/Framework/Breakpad.mm similarity index 100% rename from spotify/breakpad/client/mac/Framework/Breakpad.mm rename to archive/spotify/breakpad/client/mac/Framework/Breakpad.mm diff --git a/spotify/breakpad/client/mac/Framework/Breakpad_Prefix.pch b/archive/spotify/breakpad/client/mac/Framework/Breakpad_Prefix.pch similarity index 100% rename from spotify/breakpad/client/mac/Framework/Breakpad_Prefix.pch rename to archive/spotify/breakpad/client/mac/Framework/Breakpad_Prefix.pch diff --git a/spotify/breakpad/client/mac/Framework/Info.plist b/archive/spotify/breakpad/client/mac/Framework/Info.plist similarity index 100% rename from spotify/breakpad/client/mac/Framework/Info.plist rename to archive/spotify/breakpad/client/mac/Framework/Info.plist diff --git a/spotify/breakpad/client/mac/Framework/OnDemandServer.h b/archive/spotify/breakpad/client/mac/Framework/OnDemandServer.h similarity index 100% rename from spotify/breakpad/client/mac/Framework/OnDemandServer.h rename to archive/spotify/breakpad/client/mac/Framework/OnDemandServer.h diff --git a/spotify/breakpad/client/mac/Framework/OnDemandServer.mm b/archive/spotify/breakpad/client/mac/Framework/OnDemandServer.mm similarity index 100% rename from spotify/breakpad/client/mac/Framework/OnDemandServer.mm rename to archive/spotify/breakpad/client/mac/Framework/OnDemandServer.mm diff --git a/spotify/breakpad/client/mac/UnitTests-Info.plist b/archive/spotify/breakpad/client/mac/UnitTests-Info.plist similarity index 100% rename from spotify/breakpad/client/mac/UnitTests-Info.plist rename to archive/spotify/breakpad/client/mac/UnitTests-Info.plist diff --git a/spotify/breakpad/client/mac/crash_generation/ConfigFile.h b/archive/spotify/breakpad/client/mac/crash_generation/ConfigFile.h similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/ConfigFile.h rename to archive/spotify/breakpad/client/mac/crash_generation/ConfigFile.h diff --git a/spotify/breakpad/client/mac/crash_generation/ConfigFile.mm b/archive/spotify/breakpad/client/mac/crash_generation/ConfigFile.mm similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/ConfigFile.mm rename to archive/spotify/breakpad/client/mac/crash_generation/ConfigFile.mm diff --git a/spotify/breakpad/client/mac/crash_generation/Inspector.h b/archive/spotify/breakpad/client/mac/crash_generation/Inspector.h similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/Inspector.h rename to archive/spotify/breakpad/client/mac/crash_generation/Inspector.h diff --git a/spotify/breakpad/client/mac/crash_generation/Inspector.mm b/archive/spotify/breakpad/client/mac/crash_generation/Inspector.mm similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/Inspector.mm rename to archive/spotify/breakpad/client/mac/crash_generation/Inspector.mm diff --git a/spotify/breakpad/client/mac/crash_generation/InspectorMain.mm b/archive/spotify/breakpad/client/mac/crash_generation/InspectorMain.mm similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/InspectorMain.mm rename to archive/spotify/breakpad/client/mac/crash_generation/InspectorMain.mm diff --git a/spotify/breakpad/client/mac/crash_generation/client_info.h b/archive/spotify/breakpad/client/mac/crash_generation/client_info.h similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/client_info.h rename to archive/spotify/breakpad/client/mac/crash_generation/client_info.h diff --git a/spotify/breakpad/client/mac/crash_generation/crash_generation_client.cc b/archive/spotify/breakpad/client/mac/crash_generation/crash_generation_client.cc similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/crash_generation_client.cc rename to archive/spotify/breakpad/client/mac/crash_generation/crash_generation_client.cc diff --git a/spotify/breakpad/client/mac/crash_generation/crash_generation_client.h b/archive/spotify/breakpad/client/mac/crash_generation/crash_generation_client.h similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/crash_generation_client.h rename to archive/spotify/breakpad/client/mac/crash_generation/crash_generation_client.h diff --git a/spotify/breakpad/client/mac/crash_generation/crash_generation_server.cc b/archive/spotify/breakpad/client/mac/crash_generation/crash_generation_server.cc similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/crash_generation_server.cc rename to archive/spotify/breakpad/client/mac/crash_generation/crash_generation_server.cc diff --git a/spotify/breakpad/client/mac/crash_generation/crash_generation_server.h b/archive/spotify/breakpad/client/mac/crash_generation/crash_generation_server.h similarity index 100% rename from spotify/breakpad/client/mac/crash_generation/crash_generation_server.h rename to archive/spotify/breakpad/client/mac/crash_generation/crash_generation_server.h diff --git a/spotify/breakpad/client/mac/handler/breakpad_nlist_64.cc b/archive/spotify/breakpad/client/mac/handler/breakpad_nlist_64.cc similarity index 100% rename from spotify/breakpad/client/mac/handler/breakpad_nlist_64.cc rename to archive/spotify/breakpad/client/mac/handler/breakpad_nlist_64.cc diff --git a/spotify/breakpad/client/mac/handler/breakpad_nlist_64.h b/archive/spotify/breakpad/client/mac/handler/breakpad_nlist_64.h similarity index 100% rename from spotify/breakpad/client/mac/handler/breakpad_nlist_64.h rename to archive/spotify/breakpad/client/mac/handler/breakpad_nlist_64.h diff --git a/spotify/breakpad/client/mac/handler/dynamic_images.cc b/archive/spotify/breakpad/client/mac/handler/dynamic_images.cc similarity index 100% rename from spotify/breakpad/client/mac/handler/dynamic_images.cc rename to archive/spotify/breakpad/client/mac/handler/dynamic_images.cc diff --git a/spotify/breakpad/client/mac/handler/dynamic_images.h b/archive/spotify/breakpad/client/mac/handler/dynamic_images.h similarity index 100% rename from spotify/breakpad/client/mac/handler/dynamic_images.h rename to archive/spotify/breakpad/client/mac/handler/dynamic_images.h diff --git a/spotify/breakpad/client/mac/handler/exception_handler.cc b/archive/spotify/breakpad/client/mac/handler/exception_handler.cc similarity index 100% rename from spotify/breakpad/client/mac/handler/exception_handler.cc rename to archive/spotify/breakpad/client/mac/handler/exception_handler.cc diff --git a/spotify/breakpad/client/mac/handler/exception_handler.h b/archive/spotify/breakpad/client/mac/handler/exception_handler.h similarity index 100% rename from spotify/breakpad/client/mac/handler/exception_handler.h rename to archive/spotify/breakpad/client/mac/handler/exception_handler.h diff --git a/spotify/breakpad/client/mac/handler/mach_vm_compat.h b/archive/spotify/breakpad/client/mac/handler/mach_vm_compat.h similarity index 100% rename from spotify/breakpad/client/mac/handler/mach_vm_compat.h rename to archive/spotify/breakpad/client/mac/handler/mach_vm_compat.h diff --git a/spotify/breakpad/client/mac/handler/minidump_generator.cc b/archive/spotify/breakpad/client/mac/handler/minidump_generator.cc similarity index 100% rename from spotify/breakpad/client/mac/handler/minidump_generator.cc rename to archive/spotify/breakpad/client/mac/handler/minidump_generator.cc diff --git a/spotify/breakpad/client/mac/handler/minidump_generator.h b/archive/spotify/breakpad/client/mac/handler/minidump_generator.h similarity index 100% rename from spotify/breakpad/client/mac/handler/minidump_generator.h rename to archive/spotify/breakpad/client/mac/handler/minidump_generator.h diff --git a/spotify/breakpad/client/mac/handler/minidump_test.xcodeproj/project.pbxproj b/archive/spotify/breakpad/client/mac/handler/minidump_test.xcodeproj/project.pbxproj similarity index 100% rename from spotify/breakpad/client/mac/handler/minidump_test.xcodeproj/project.pbxproj rename to archive/spotify/breakpad/client/mac/handler/minidump_test.xcodeproj/project.pbxproj diff --git a/spotify/breakpad/client/mac/handler/minidump_tests32-Info.plist b/archive/spotify/breakpad/client/mac/handler/minidump_tests32-Info.plist similarity index 100% rename from spotify/breakpad/client/mac/handler/minidump_tests32-Info.plist rename to archive/spotify/breakpad/client/mac/handler/minidump_tests32-Info.plist diff --git a/spotify/breakpad/client/mac/handler/minidump_tests64-Info.plist b/archive/spotify/breakpad/client/mac/handler/minidump_tests64-Info.plist similarity index 100% rename from spotify/breakpad/client/mac/handler/minidump_tests64-Info.plist rename to archive/spotify/breakpad/client/mac/handler/minidump_tests64-Info.plist diff --git a/spotify/breakpad/client/mac/handler/obj-cTestCases-Info.plist b/archive/spotify/breakpad/client/mac/handler/obj-cTestCases-Info.plist similarity index 100% rename from spotify/breakpad/client/mac/handler/obj-cTestCases-Info.plist rename to archive/spotify/breakpad/client/mac/handler/obj-cTestCases-Info.plist diff --git a/spotify/breakpad/client/mac/handler/protected_memory_allocator.cc b/archive/spotify/breakpad/client/mac/handler/protected_memory_allocator.cc similarity index 100% rename from spotify/breakpad/client/mac/handler/protected_memory_allocator.cc rename to archive/spotify/breakpad/client/mac/handler/protected_memory_allocator.cc diff --git a/spotify/breakpad/client/mac/handler/protected_memory_allocator.h b/archive/spotify/breakpad/client/mac/handler/protected_memory_allocator.h similarity index 100% rename from spotify/breakpad/client/mac/handler/protected_memory_allocator.h rename to archive/spotify/breakpad/client/mac/handler/protected_memory_allocator.h diff --git a/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.cc b/archive/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.cc similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.cc rename to archive/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.cc diff --git a/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.h b/archive/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.h similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.h rename to archive/spotify/breakpad/client/mac/handler/testcases/DynamicImagesTests.h diff --git a/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.cc b/archive/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.cc similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.cc rename to archive/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.cc diff --git a/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.h b/archive/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.h similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.h rename to archive/spotify/breakpad/client/mac/handler/testcases/breakpad_nlist_test.h diff --git a/spotify/breakpad/client/mac/handler/testcases/dwarftests.h b/archive/spotify/breakpad/client/mac/handler/testcases/dwarftests.h similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/dwarftests.h rename to archive/spotify/breakpad/client/mac/handler/testcases/dwarftests.h diff --git a/spotify/breakpad/client/mac/handler/testcases/dwarftests.mm b/archive/spotify/breakpad/client/mac/handler/testcases/dwarftests.mm similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/dwarftests.mm rename to archive/spotify/breakpad/client/mac/handler/testcases/dwarftests.mm diff --git a/spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_dwarf_data b/archive/spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_dwarf_data similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_dwarf_data rename to archive/spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_dwarf_data diff --git a/spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym b/archive/spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym similarity index 100% rename from spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym rename to archive/spotify/breakpad/client/mac/handler/testcases/testdata/dump_syms_i386_breakpad.sym diff --git a/spotify/breakpad/client/mac/sender/Breakpad.xib b/archive/spotify/breakpad/client/mac/sender/Breakpad.xib similarity index 100% rename from spotify/breakpad/client/mac/sender/Breakpad.xib rename to archive/spotify/breakpad/client/mac/sender/Breakpad.xib diff --git a/spotify/breakpad/client/mac/sender/English.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/English.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/English.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/English.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/English.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/English.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/English.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/English.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/ReporterIcon.graffle b/archive/spotify/breakpad/client/mac/sender/ReporterIcon.graffle similarity index 100% rename from spotify/breakpad/client/mac/sender/ReporterIcon.graffle rename to archive/spotify/breakpad/client/mac/sender/ReporterIcon.graffle diff --git a/spotify/breakpad/client/mac/sender/crash_report_sender-Info.plist b/archive/spotify/breakpad/client/mac/sender/crash_report_sender-Info.plist similarity index 100% rename from spotify/breakpad/client/mac/sender/crash_report_sender-Info.plist rename to archive/spotify/breakpad/client/mac/sender/crash_report_sender-Info.plist diff --git a/spotify/breakpad/client/mac/sender/crash_report_sender.h b/archive/spotify/breakpad/client/mac/sender/crash_report_sender.h similarity index 100% rename from spotify/breakpad/client/mac/sender/crash_report_sender.h rename to archive/spotify/breakpad/client/mac/sender/crash_report_sender.h diff --git a/spotify/breakpad/client/mac/sender/crash_report_sender.icns b/archive/spotify/breakpad/client/mac/sender/crash_report_sender.icns similarity index 100% rename from spotify/breakpad/client/mac/sender/crash_report_sender.icns rename to archive/spotify/breakpad/client/mac/sender/crash_report_sender.icns diff --git a/spotify/breakpad/client/mac/sender/crash_report_sender.m b/archive/spotify/breakpad/client/mac/sender/crash_report_sender.m similarity index 100% rename from spotify/breakpad/client/mac/sender/crash_report_sender.m rename to archive/spotify/breakpad/client/mac/sender/crash_report_sender.m diff --git a/spotify/breakpad/client/mac/sender/da.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/da.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/da.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/da.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/da.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/da.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/da.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/da.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/de.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/de.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/de.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/de.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/de.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/de.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/de.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/de.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/es.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/es.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/es.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/es.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/es.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/es.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/es.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/es.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/fr.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/fr.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/fr.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/fr.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/fr.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/fr.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/fr.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/fr.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/goArrow.png b/archive/spotify/breakpad/client/mac/sender/goArrow.png similarity index 100% rename from spotify/breakpad/client/mac/sender/goArrow.png rename to archive/spotify/breakpad/client/mac/sender/goArrow.png diff --git a/spotify/breakpad/client/mac/sender/it.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/it.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/it.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/it.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/it.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/it.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/it.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/it.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/ja.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/ja.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/ja.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/ja.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/ja.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/ja.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/ja.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/ja.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/nl.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/nl.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/nl.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/nl.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/nl.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/nl.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/nl.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/nl.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/no.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/no.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/no.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/no.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/no.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/no.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/no.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/no.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/sl.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/sl.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/sl.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/sl.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/sl.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/sl.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/sl.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/sl.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/sv.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/sv.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/sv.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/sv.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/sv.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/sv.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/sv.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/sv.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/tr.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/sender/tr.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/tr.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/sender/tr.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/sender/tr.lproj/Localizable.strings b/archive/spotify/breakpad/client/mac/sender/tr.lproj/Localizable.strings similarity index 100% rename from spotify/breakpad/client/mac/sender/tr.lproj/Localizable.strings rename to archive/spotify/breakpad/client/mac/sender/tr.lproj/Localizable.strings diff --git a/spotify/breakpad/client/mac/sender/uploader.h b/archive/spotify/breakpad/client/mac/sender/uploader.h similarity index 100% rename from spotify/breakpad/client/mac/sender/uploader.h rename to archive/spotify/breakpad/client/mac/sender/uploader.h diff --git a/spotify/breakpad/client/mac/sender/uploader.mm b/archive/spotify/breakpad/client/mac/sender/uploader.mm similarity index 100% rename from spotify/breakpad/client/mac/sender/uploader.mm rename to archive/spotify/breakpad/client/mac/sender/uploader.mm diff --git a/spotify/breakpad/client/mac/testapp/Controller.h b/archive/spotify/breakpad/client/mac/testapp/Controller.h similarity index 100% rename from spotify/breakpad/client/mac/testapp/Controller.h rename to archive/spotify/breakpad/client/mac/testapp/Controller.h diff --git a/spotify/breakpad/client/mac/testapp/Controller.m b/archive/spotify/breakpad/client/mac/testapp/Controller.m similarity index 100% rename from spotify/breakpad/client/mac/testapp/Controller.m rename to archive/spotify/breakpad/client/mac/testapp/Controller.m diff --git a/spotify/breakpad/client/mac/testapp/English.lproj/InfoPlist.strings b/archive/spotify/breakpad/client/mac/testapp/English.lproj/InfoPlist.strings similarity index 100% rename from spotify/breakpad/client/mac/testapp/English.lproj/InfoPlist.strings rename to archive/spotify/breakpad/client/mac/testapp/English.lproj/InfoPlist.strings diff --git a/spotify/breakpad/client/mac/testapp/English.lproj/MainMenu.xib b/archive/spotify/breakpad/client/mac/testapp/English.lproj/MainMenu.xib similarity index 100% rename from spotify/breakpad/client/mac/testapp/English.lproj/MainMenu.xib rename to archive/spotify/breakpad/client/mac/testapp/English.lproj/MainMenu.xib diff --git a/spotify/breakpad/client/mac/testapp/Info.plist b/archive/spotify/breakpad/client/mac/testapp/Info.plist similarity index 100% rename from spotify/breakpad/client/mac/testapp/Info.plist rename to archive/spotify/breakpad/client/mac/testapp/Info.plist diff --git a/spotify/breakpad/client/mac/testapp/TestClass.h b/archive/spotify/breakpad/client/mac/testapp/TestClass.h similarity index 100% rename from spotify/breakpad/client/mac/testapp/TestClass.h rename to archive/spotify/breakpad/client/mac/testapp/TestClass.h diff --git a/spotify/breakpad/client/mac/testapp/TestClass.mm b/archive/spotify/breakpad/client/mac/testapp/TestClass.mm similarity index 100% rename from spotify/breakpad/client/mac/testapp/TestClass.mm rename to archive/spotify/breakpad/client/mac/testapp/TestClass.mm diff --git a/spotify/breakpad/client/mac/testapp/bomb.icns b/archive/spotify/breakpad/client/mac/testapp/bomb.icns similarity index 100% rename from spotify/breakpad/client/mac/testapp/bomb.icns rename to archive/spotify/breakpad/client/mac/testapp/bomb.icns diff --git a/spotify/breakpad/client/mac/testapp/crashInMain b/archive/spotify/breakpad/client/mac/testapp/crashInMain similarity index 100% rename from spotify/breakpad/client/mac/testapp/crashInMain rename to archive/spotify/breakpad/client/mac/testapp/crashInMain diff --git a/spotify/breakpad/client/mac/testapp/crashduringload b/archive/spotify/breakpad/client/mac/testapp/crashduringload similarity index 100% rename from spotify/breakpad/client/mac/testapp/crashduringload rename to archive/spotify/breakpad/client/mac/testapp/crashduringload diff --git a/spotify/breakpad/client/mac/testapp/main.m b/archive/spotify/breakpad/client/mac/testapp/main.m similarity index 100% rename from spotify/breakpad/client/mac/testapp/main.m rename to archive/spotify/breakpad/client/mac/testapp/main.m diff --git a/spotify/breakpad/client/mac/tests/BreakpadFramework_Test.mm b/archive/spotify/breakpad/client/mac/tests/BreakpadFramework_Test.mm similarity index 100% rename from spotify/breakpad/client/mac/tests/BreakpadFramework_Test.mm rename to archive/spotify/breakpad/client/mac/tests/BreakpadFramework_Test.mm diff --git a/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.h b/archive/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.h similarity index 100% rename from spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.h rename to archive/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.h diff --git a/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.mm b/archive/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.mm similarity index 100% rename from spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.mm rename to archive/spotify/breakpad/client/mac/tests/SimpleStringDictionaryTest.mm diff --git a/spotify/breakpad/client/mac/tests/crash_generation_server_test.cc b/archive/spotify/breakpad/client/mac/tests/crash_generation_server_test.cc similarity index 100% rename from spotify/breakpad/client/mac/tests/crash_generation_server_test.cc rename to archive/spotify/breakpad/client/mac/tests/crash_generation_server_test.cc diff --git a/spotify/breakpad/client/mac/tests/exception_handler_test.cc b/archive/spotify/breakpad/client/mac/tests/exception_handler_test.cc similarity index 100% rename from spotify/breakpad/client/mac/tests/exception_handler_test.cc rename to archive/spotify/breakpad/client/mac/tests/exception_handler_test.cc diff --git a/spotify/breakpad/client/mac/tests/minidump_generator_test.cc b/archive/spotify/breakpad/client/mac/tests/minidump_generator_test.cc similarity index 100% rename from spotify/breakpad/client/mac/tests/minidump_generator_test.cc rename to archive/spotify/breakpad/client/mac/tests/minidump_generator_test.cc diff --git a/spotify/breakpad/client/mac/tests/minidump_generator_test_helper.cc b/archive/spotify/breakpad/client/mac/tests/minidump_generator_test_helper.cc similarity index 100% rename from spotify/breakpad/client/mac/tests/minidump_generator_test_helper.cc rename to archive/spotify/breakpad/client/mac/tests/minidump_generator_test_helper.cc diff --git a/spotify/breakpad/client/mac/tests/spawn_child_process.h b/archive/spotify/breakpad/client/mac/tests/spawn_child_process.h similarity index 100% rename from spotify/breakpad/client/mac/tests/spawn_child_process.h rename to archive/spotify/breakpad/client/mac/tests/spawn_child_process.h diff --git a/spotify/breakpad/client/mac/tests/testlogging.h b/archive/spotify/breakpad/client/mac/tests/testlogging.h similarity index 100% rename from spotify/breakpad/client/mac/tests/testlogging.h rename to archive/spotify/breakpad/client/mac/tests/testlogging.h diff --git a/spotify/breakpad/client/minidump_file_writer-inl.h b/archive/spotify/breakpad/client/minidump_file_writer-inl.h similarity index 100% rename from spotify/breakpad/client/minidump_file_writer-inl.h rename to archive/spotify/breakpad/client/minidump_file_writer-inl.h diff --git a/spotify/breakpad/client/minidump_file_writer.cc b/archive/spotify/breakpad/client/minidump_file_writer.cc similarity index 100% rename from spotify/breakpad/client/minidump_file_writer.cc rename to archive/spotify/breakpad/client/minidump_file_writer.cc diff --git a/spotify/breakpad/client/minidump_file_writer.h b/archive/spotify/breakpad/client/minidump_file_writer.h similarity index 100% rename from spotify/breakpad/client/minidump_file_writer.h rename to archive/spotify/breakpad/client/minidump_file_writer.h diff --git a/spotify/breakpad/client/minidump_file_writer_unittest.cc b/archive/spotify/breakpad/client/minidump_file_writer_unittest.cc similarity index 100% rename from spotify/breakpad/client/minidump_file_writer_unittest.cc rename to archive/spotify/breakpad/client/minidump_file_writer_unittest.cc diff --git a/spotify/breakpad/client/solaris/handler/exception_handler.cc b/archive/spotify/breakpad/client/solaris/handler/exception_handler.cc similarity index 100% rename from spotify/breakpad/client/solaris/handler/exception_handler.cc rename to archive/spotify/breakpad/client/solaris/handler/exception_handler.cc diff --git a/spotify/breakpad/client/solaris/handler/exception_handler.h b/archive/spotify/breakpad/client/solaris/handler/exception_handler.h similarity index 100% rename from spotify/breakpad/client/solaris/handler/exception_handler.h rename to archive/spotify/breakpad/client/solaris/handler/exception_handler.h diff --git a/spotify/breakpad/client/solaris/handler/exception_handler_test.cc b/archive/spotify/breakpad/client/solaris/handler/exception_handler_test.cc similarity index 100% rename from spotify/breakpad/client/solaris/handler/exception_handler_test.cc rename to archive/spotify/breakpad/client/solaris/handler/exception_handler_test.cc diff --git a/spotify/breakpad/client/solaris/handler/minidump_generator.cc b/archive/spotify/breakpad/client/solaris/handler/minidump_generator.cc similarity index 100% rename from spotify/breakpad/client/solaris/handler/minidump_generator.cc rename to archive/spotify/breakpad/client/solaris/handler/minidump_generator.cc diff --git a/spotify/breakpad/client/solaris/handler/minidump_generator.h b/archive/spotify/breakpad/client/solaris/handler/minidump_generator.h similarity index 100% rename from spotify/breakpad/client/solaris/handler/minidump_generator.h rename to archive/spotify/breakpad/client/solaris/handler/minidump_generator.h diff --git a/spotify/breakpad/client/solaris/handler/minidump_test.cc b/archive/spotify/breakpad/client/solaris/handler/minidump_test.cc similarity index 100% rename from spotify/breakpad/client/solaris/handler/minidump_test.cc rename to archive/spotify/breakpad/client/solaris/handler/minidump_test.cc diff --git a/spotify/breakpad/client/solaris/handler/solaris_lwp.cc b/archive/spotify/breakpad/client/solaris/handler/solaris_lwp.cc similarity index 100% rename from spotify/breakpad/client/solaris/handler/solaris_lwp.cc rename to archive/spotify/breakpad/client/solaris/handler/solaris_lwp.cc diff --git a/spotify/breakpad/client/solaris/handler/solaris_lwp.h b/archive/spotify/breakpad/client/solaris/handler/solaris_lwp.h similarity index 100% rename from spotify/breakpad/client/solaris/handler/solaris_lwp.h rename to archive/spotify/breakpad/client/solaris/handler/solaris_lwp.h diff --git a/spotify/breakpad/client/windows/breakpad_client.gyp b/archive/spotify/breakpad/client/windows/breakpad_client.gyp similarity index 100% rename from spotify/breakpad/client/windows/breakpad_client.gyp rename to archive/spotify/breakpad/client/windows/breakpad_client.gyp diff --git a/spotify/breakpad/client/windows/build/common.gypi b/archive/spotify/breakpad/client/windows/build/common.gypi similarity index 100% rename from spotify/breakpad/client/windows/build/common.gypi rename to archive/spotify/breakpad/client/windows/build/common.gypi diff --git a/spotify/breakpad/client/windows/build/external_code.gypi b/archive/spotify/breakpad/client/windows/build/external_code.gypi similarity index 100% rename from spotify/breakpad/client/windows/build/external_code.gypi rename to archive/spotify/breakpad/client/windows/build/external_code.gypi diff --git a/spotify/breakpad/client/windows/build/internal/release_defaults.gypi b/archive/spotify/breakpad/client/windows/build/internal/release_defaults.gypi similarity index 100% rename from spotify/breakpad/client/windows/build/internal/release_defaults.gypi rename to archive/spotify/breakpad/client/windows/build/internal/release_defaults.gypi diff --git a/spotify/breakpad/client/windows/build/internal/release_impl.gypi b/archive/spotify/breakpad/client/windows/build/internal/release_impl.gypi similarity index 100% rename from spotify/breakpad/client/windows/build/internal/release_impl.gypi rename to archive/spotify/breakpad/client/windows/build/internal/release_impl.gypi diff --git a/spotify/breakpad/client/windows/build/internal/release_impl_official.gypi b/archive/spotify/breakpad/client/windows/build/internal/release_impl_official.gypi similarity index 100% rename from spotify/breakpad/client/windows/build/internal/release_impl_official.gypi rename to archive/spotify/breakpad/client/windows/build/internal/release_impl_official.gypi diff --git a/spotify/breakpad/client/windows/build/release.gypi b/archive/spotify/breakpad/client/windows/build/release.gypi similarity index 100% rename from spotify/breakpad/client/windows/build/release.gypi rename to archive/spotify/breakpad/client/windows/build/release.gypi diff --git a/spotify/breakpad/client/windows/common/auto_critical_section.h b/archive/spotify/breakpad/client/windows/common/auto_critical_section.h similarity index 100% rename from spotify/breakpad/client/windows/common/auto_critical_section.h rename to archive/spotify/breakpad/client/windows/common/auto_critical_section.h diff --git a/spotify/breakpad/client/windows/common/ipc_protocol.h b/archive/spotify/breakpad/client/windows/common/ipc_protocol.h similarity index 100% rename from spotify/breakpad/client/windows/common/ipc_protocol.h rename to archive/spotify/breakpad/client/windows/common/ipc_protocol.h diff --git a/spotify/breakpad/client/windows/crash_generation/ReadMe.txt b/archive/spotify/breakpad/client/windows/crash_generation/ReadMe.txt similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/ReadMe.txt rename to archive/spotify/breakpad/client/windows/crash_generation/ReadMe.txt diff --git a/spotify/breakpad/client/windows/crash_generation/client_info.cc b/archive/spotify/breakpad/client/windows/crash_generation/client_info.cc similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/client_info.cc rename to archive/spotify/breakpad/client/windows/crash_generation/client_info.cc diff --git a/spotify/breakpad/client/windows/crash_generation/client_info.h b/archive/spotify/breakpad/client/windows/crash_generation/client_info.h similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/client_info.h rename to archive/spotify/breakpad/client/windows/crash_generation/client_info.h diff --git a/spotify/breakpad/client/windows/crash_generation/crash_generation.gyp b/archive/spotify/breakpad/client/windows/crash_generation/crash_generation.gyp similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/crash_generation.gyp rename to archive/spotify/breakpad/client/windows/crash_generation/crash_generation.gyp diff --git a/spotify/breakpad/client/windows/crash_generation/crash_generation_client.cc b/archive/spotify/breakpad/client/windows/crash_generation/crash_generation_client.cc similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/crash_generation_client.cc rename to archive/spotify/breakpad/client/windows/crash_generation/crash_generation_client.cc diff --git a/spotify/breakpad/client/windows/crash_generation/crash_generation_client.h b/archive/spotify/breakpad/client/windows/crash_generation/crash_generation_client.h similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/crash_generation_client.h rename to archive/spotify/breakpad/client/windows/crash_generation/crash_generation_client.h diff --git a/spotify/breakpad/client/windows/crash_generation/crash_generation_server.cc b/archive/spotify/breakpad/client/windows/crash_generation/crash_generation_server.cc similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/crash_generation_server.cc rename to archive/spotify/breakpad/client/windows/crash_generation/crash_generation_server.cc diff --git a/spotify/breakpad/client/windows/crash_generation/crash_generation_server.h b/archive/spotify/breakpad/client/windows/crash_generation/crash_generation_server.h similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/crash_generation_server.h rename to archive/spotify/breakpad/client/windows/crash_generation/crash_generation_server.h diff --git a/spotify/breakpad/client/windows/crash_generation/minidump_generator.cc b/archive/spotify/breakpad/client/windows/crash_generation/minidump_generator.cc similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/minidump_generator.cc rename to archive/spotify/breakpad/client/windows/crash_generation/minidump_generator.cc diff --git a/spotify/breakpad/client/windows/crash_generation/minidump_generator.h b/archive/spotify/breakpad/client/windows/crash_generation/minidump_generator.h similarity index 100% rename from spotify/breakpad/client/windows/crash_generation/minidump_generator.h rename to archive/spotify/breakpad/client/windows/crash_generation/minidump_generator.h diff --git a/spotify/breakpad/client/windows/handler/exception_handler.cc b/archive/spotify/breakpad/client/windows/handler/exception_handler.cc similarity index 100% rename from spotify/breakpad/client/windows/handler/exception_handler.cc rename to archive/spotify/breakpad/client/windows/handler/exception_handler.cc diff --git a/spotify/breakpad/client/windows/handler/exception_handler.gyp b/archive/spotify/breakpad/client/windows/handler/exception_handler.gyp similarity index 100% rename from spotify/breakpad/client/windows/handler/exception_handler.gyp rename to archive/spotify/breakpad/client/windows/handler/exception_handler.gyp diff --git a/spotify/breakpad/client/windows/handler/exception_handler.h b/archive/spotify/breakpad/client/windows/handler/exception_handler.h similarity index 100% rename from spotify/breakpad/client/windows/handler/exception_handler.h rename to archive/spotify/breakpad/client/windows/handler/exception_handler.h diff --git a/spotify/breakpad/client/windows/sender/crash_report_sender.cc b/archive/spotify/breakpad/client/windows/sender/crash_report_sender.cc similarity index 100% rename from spotify/breakpad/client/windows/sender/crash_report_sender.cc rename to archive/spotify/breakpad/client/windows/sender/crash_report_sender.cc diff --git a/spotify/breakpad/client/windows/sender/crash_report_sender.gyp b/archive/spotify/breakpad/client/windows/sender/crash_report_sender.gyp similarity index 100% rename from spotify/breakpad/client/windows/sender/crash_report_sender.gyp rename to archive/spotify/breakpad/client/windows/sender/crash_report_sender.gyp diff --git a/spotify/breakpad/client/windows/sender/crash_report_sender.h b/archive/spotify/breakpad/client/windows/sender/crash_report_sender.h similarity index 100% rename from spotify/breakpad/client/windows/sender/crash_report_sender.h rename to archive/spotify/breakpad/client/windows/sender/crash_report_sender.h diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.cc b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.cc similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.cc rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.cc diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.h b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.h similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.h rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/abstract_class.h diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.cc b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.cc similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.cc rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.cc diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.gyp b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.gyp similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.gyp rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.gyp diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.h b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.h similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.h rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.h diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.ico b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.ico similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.ico rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.ico diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.rc b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.rc similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.rc rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/crash_generation_app.rc diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/resource.h b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/resource.h similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/resource.h rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/resource.h diff --git a/spotify/breakpad/client/windows/tests/crash_generation_app/small.ico b/archive/spotify/breakpad/client/windows/tests/crash_generation_app/small.ico similarity index 100% rename from spotify/breakpad/client/windows/tests/crash_generation_app/small.ico rename to archive/spotify/breakpad/client/windows/tests/crash_generation_app/small.ico diff --git a/spotify/breakpad/client/windows/unittests/client_tests.gyp b/archive/spotify/breakpad/client/windows/unittests/client_tests.gyp similarity index 100% rename from spotify/breakpad/client/windows/unittests/client_tests.gyp rename to archive/spotify/breakpad/client/windows/unittests/client_tests.gyp diff --git a/spotify/breakpad/client/windows/unittests/crash_generation_server_test.cc b/archive/spotify/breakpad/client/windows/unittests/crash_generation_server_test.cc similarity index 100% rename from spotify/breakpad/client/windows/unittests/crash_generation_server_test.cc rename to archive/spotify/breakpad/client/windows/unittests/crash_generation_server_test.cc diff --git a/spotify/breakpad/client/windows/unittests/dump_analysis.cc b/archive/spotify/breakpad/client/windows/unittests/dump_analysis.cc similarity index 100% rename from spotify/breakpad/client/windows/unittests/dump_analysis.cc rename to archive/spotify/breakpad/client/windows/unittests/dump_analysis.cc diff --git a/spotify/breakpad/client/windows/unittests/dump_analysis.h b/archive/spotify/breakpad/client/windows/unittests/dump_analysis.h similarity index 100% rename from spotify/breakpad/client/windows/unittests/dump_analysis.h rename to archive/spotify/breakpad/client/windows/unittests/dump_analysis.h diff --git a/spotify/breakpad/client/windows/unittests/exception_handler_death_test.cc b/archive/spotify/breakpad/client/windows/unittests/exception_handler_death_test.cc similarity index 100% rename from spotify/breakpad/client/windows/unittests/exception_handler_death_test.cc rename to archive/spotify/breakpad/client/windows/unittests/exception_handler_death_test.cc diff --git a/spotify/breakpad/client/windows/unittests/exception_handler_test.cc b/archive/spotify/breakpad/client/windows/unittests/exception_handler_test.cc similarity index 100% rename from spotify/breakpad/client/windows/unittests/exception_handler_test.cc rename to archive/spotify/breakpad/client/windows/unittests/exception_handler_test.cc diff --git a/spotify/breakpad/client/windows/unittests/minidump_test.cc b/archive/spotify/breakpad/client/windows/unittests/minidump_test.cc similarity index 100% rename from spotify/breakpad/client/windows/unittests/minidump_test.cc rename to archive/spotify/breakpad/client/windows/unittests/minidump_test.cc diff --git a/spotify/breakpad/client/windows/unittests/testing.gyp b/archive/spotify/breakpad/client/windows/unittests/testing.gyp similarity index 100% rename from spotify/breakpad/client/windows/unittests/testing.gyp rename to archive/spotify/breakpad/client/windows/unittests/testing.gyp diff --git a/spotify/breakpad/common/basictypes.h b/archive/spotify/breakpad/common/basictypes.h similarity index 100% rename from spotify/breakpad/common/basictypes.h rename to archive/spotify/breakpad/common/basictypes.h diff --git a/spotify/breakpad/common/byte_cursor.h b/archive/spotify/breakpad/common/byte_cursor.h similarity index 100% rename from spotify/breakpad/common/byte_cursor.h rename to archive/spotify/breakpad/common/byte_cursor.h diff --git a/spotify/breakpad/common/byte_cursor_unittest.cc b/archive/spotify/breakpad/common/byte_cursor_unittest.cc similarity index 100% rename from spotify/breakpad/common/byte_cursor_unittest.cc rename to archive/spotify/breakpad/common/byte_cursor_unittest.cc diff --git a/spotify/breakpad/common/convert_UTF.c b/archive/spotify/breakpad/common/convert_UTF.c similarity index 100% rename from spotify/breakpad/common/convert_UTF.c rename to archive/spotify/breakpad/common/convert_UTF.c diff --git a/spotify/breakpad/common/convert_UTF.h b/archive/spotify/breakpad/common/convert_UTF.h similarity index 100% rename from spotify/breakpad/common/convert_UTF.h rename to archive/spotify/breakpad/common/convert_UTF.h diff --git a/spotify/breakpad/common/dwarf/bytereader-inl.h b/archive/spotify/breakpad/common/dwarf/bytereader-inl.h similarity index 100% rename from spotify/breakpad/common/dwarf/bytereader-inl.h rename to archive/spotify/breakpad/common/dwarf/bytereader-inl.h diff --git a/spotify/breakpad/common/dwarf/bytereader.cc b/archive/spotify/breakpad/common/dwarf/bytereader.cc similarity index 100% rename from spotify/breakpad/common/dwarf/bytereader.cc rename to archive/spotify/breakpad/common/dwarf/bytereader.cc diff --git a/spotify/breakpad/common/dwarf/bytereader.h b/archive/spotify/breakpad/common/dwarf/bytereader.h similarity index 100% rename from spotify/breakpad/common/dwarf/bytereader.h rename to archive/spotify/breakpad/common/dwarf/bytereader.h diff --git a/spotify/breakpad/common/dwarf/bytereader_unittest.cc b/archive/spotify/breakpad/common/dwarf/bytereader_unittest.cc similarity index 100% rename from spotify/breakpad/common/dwarf/bytereader_unittest.cc rename to archive/spotify/breakpad/common/dwarf/bytereader_unittest.cc diff --git a/spotify/breakpad/common/dwarf/cfi_assembler.cc b/archive/spotify/breakpad/common/dwarf/cfi_assembler.cc similarity index 100% rename from spotify/breakpad/common/dwarf/cfi_assembler.cc rename to archive/spotify/breakpad/common/dwarf/cfi_assembler.cc diff --git a/spotify/breakpad/common/dwarf/cfi_assembler.h b/archive/spotify/breakpad/common/dwarf/cfi_assembler.h similarity index 100% rename from spotify/breakpad/common/dwarf/cfi_assembler.h rename to archive/spotify/breakpad/common/dwarf/cfi_assembler.h diff --git a/spotify/breakpad/common/dwarf/dwarf2diehandler.cc b/archive/spotify/breakpad/common/dwarf/dwarf2diehandler.cc similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2diehandler.cc rename to archive/spotify/breakpad/common/dwarf/dwarf2diehandler.cc diff --git a/spotify/breakpad/common/dwarf/dwarf2diehandler.h b/archive/spotify/breakpad/common/dwarf/dwarf2diehandler.h similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2diehandler.h rename to archive/spotify/breakpad/common/dwarf/dwarf2diehandler.h diff --git a/spotify/breakpad/common/dwarf/dwarf2diehandler_unittest.cc b/archive/spotify/breakpad/common/dwarf/dwarf2diehandler_unittest.cc similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2diehandler_unittest.cc rename to archive/spotify/breakpad/common/dwarf/dwarf2diehandler_unittest.cc diff --git a/spotify/breakpad/common/dwarf/dwarf2enums.h b/archive/spotify/breakpad/common/dwarf/dwarf2enums.h similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2enums.h rename to archive/spotify/breakpad/common/dwarf/dwarf2enums.h diff --git a/spotify/breakpad/common/dwarf/dwarf2reader.cc b/archive/spotify/breakpad/common/dwarf/dwarf2reader.cc similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2reader.cc rename to archive/spotify/breakpad/common/dwarf/dwarf2reader.cc diff --git a/spotify/breakpad/common/dwarf/dwarf2reader.h b/archive/spotify/breakpad/common/dwarf/dwarf2reader.h similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2reader.h rename to archive/spotify/breakpad/common/dwarf/dwarf2reader.h diff --git a/spotify/breakpad/common/dwarf/dwarf2reader_cfi_unittest.cc b/archive/spotify/breakpad/common/dwarf/dwarf2reader_cfi_unittest.cc similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2reader_cfi_unittest.cc rename to archive/spotify/breakpad/common/dwarf/dwarf2reader_cfi_unittest.cc diff --git a/spotify/breakpad/common/dwarf/dwarf2reader_die_unittest.cc b/archive/spotify/breakpad/common/dwarf/dwarf2reader_die_unittest.cc similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2reader_die_unittest.cc rename to archive/spotify/breakpad/common/dwarf/dwarf2reader_die_unittest.cc diff --git a/spotify/breakpad/common/dwarf/dwarf2reader_test_common.h b/archive/spotify/breakpad/common/dwarf/dwarf2reader_test_common.h similarity index 100% rename from spotify/breakpad/common/dwarf/dwarf2reader_test_common.h rename to archive/spotify/breakpad/common/dwarf/dwarf2reader_test_common.h diff --git a/spotify/breakpad/common/dwarf/functioninfo.cc b/archive/spotify/breakpad/common/dwarf/functioninfo.cc similarity index 100% rename from spotify/breakpad/common/dwarf/functioninfo.cc rename to archive/spotify/breakpad/common/dwarf/functioninfo.cc diff --git a/spotify/breakpad/common/dwarf/functioninfo.h b/archive/spotify/breakpad/common/dwarf/functioninfo.h similarity index 100% rename from spotify/breakpad/common/dwarf/functioninfo.h rename to archive/spotify/breakpad/common/dwarf/functioninfo.h diff --git a/spotify/breakpad/common/dwarf/line_state_machine.h b/archive/spotify/breakpad/common/dwarf/line_state_machine.h similarity index 100% rename from spotify/breakpad/common/dwarf/line_state_machine.h rename to archive/spotify/breakpad/common/dwarf/line_state_machine.h diff --git a/spotify/breakpad/common/dwarf/types.h b/archive/spotify/breakpad/common/dwarf/types.h similarity index 100% rename from spotify/breakpad/common/dwarf/types.h rename to archive/spotify/breakpad/common/dwarf/types.h diff --git a/spotify/breakpad/common/dwarf_cfi_to_module.cc b/archive/spotify/breakpad/common/dwarf_cfi_to_module.cc similarity index 100% rename from spotify/breakpad/common/dwarf_cfi_to_module.cc rename to archive/spotify/breakpad/common/dwarf_cfi_to_module.cc diff --git a/spotify/breakpad/common/dwarf_cfi_to_module.h b/archive/spotify/breakpad/common/dwarf_cfi_to_module.h similarity index 100% rename from spotify/breakpad/common/dwarf_cfi_to_module.h rename to archive/spotify/breakpad/common/dwarf_cfi_to_module.h diff --git a/spotify/breakpad/common/dwarf_cfi_to_module_unittest.cc b/archive/spotify/breakpad/common/dwarf_cfi_to_module_unittest.cc similarity index 100% rename from spotify/breakpad/common/dwarf_cfi_to_module_unittest.cc rename to archive/spotify/breakpad/common/dwarf_cfi_to_module_unittest.cc diff --git a/spotify/breakpad/common/dwarf_cu_to_module.cc b/archive/spotify/breakpad/common/dwarf_cu_to_module.cc similarity index 100% rename from spotify/breakpad/common/dwarf_cu_to_module.cc rename to archive/spotify/breakpad/common/dwarf_cu_to_module.cc diff --git a/spotify/breakpad/common/dwarf_cu_to_module.h b/archive/spotify/breakpad/common/dwarf_cu_to_module.h similarity index 100% rename from spotify/breakpad/common/dwarf_cu_to_module.h rename to archive/spotify/breakpad/common/dwarf_cu_to_module.h diff --git a/spotify/breakpad/common/dwarf_cu_to_module_unittest.cc b/archive/spotify/breakpad/common/dwarf_cu_to_module_unittest.cc similarity index 100% rename from spotify/breakpad/common/dwarf_cu_to_module_unittest.cc rename to archive/spotify/breakpad/common/dwarf_cu_to_module_unittest.cc diff --git a/spotify/breakpad/common/dwarf_line_to_module.cc b/archive/spotify/breakpad/common/dwarf_line_to_module.cc similarity index 100% rename from spotify/breakpad/common/dwarf_line_to_module.cc rename to archive/spotify/breakpad/common/dwarf_line_to_module.cc diff --git a/spotify/breakpad/common/dwarf_line_to_module.h b/archive/spotify/breakpad/common/dwarf_line_to_module.h similarity index 100% rename from spotify/breakpad/common/dwarf_line_to_module.h rename to archive/spotify/breakpad/common/dwarf_line_to_module.h diff --git a/spotify/breakpad/common/dwarf_line_to_module_unittest.cc b/archive/spotify/breakpad/common/dwarf_line_to_module_unittest.cc similarity index 100% rename from spotify/breakpad/common/dwarf_line_to_module_unittest.cc rename to archive/spotify/breakpad/common/dwarf_line_to_module_unittest.cc diff --git a/spotify/breakpad/common/language.cc b/archive/spotify/breakpad/common/language.cc similarity index 100% rename from spotify/breakpad/common/language.cc rename to archive/spotify/breakpad/common/language.cc diff --git a/spotify/breakpad/common/language.h b/archive/spotify/breakpad/common/language.h similarity index 100% rename from spotify/breakpad/common/language.h rename to archive/spotify/breakpad/common/language.h diff --git a/spotify/breakpad/common/linux/dump_symbols.cc b/archive/spotify/breakpad/common/linux/dump_symbols.cc similarity index 100% rename from spotify/breakpad/common/linux/dump_symbols.cc rename to archive/spotify/breakpad/common/linux/dump_symbols.cc diff --git a/spotify/breakpad/common/linux/dump_symbols.h b/archive/spotify/breakpad/common/linux/dump_symbols.h similarity index 100% rename from spotify/breakpad/common/linux/dump_symbols.h rename to archive/spotify/breakpad/common/linux/dump_symbols.h diff --git a/spotify/breakpad/common/linux/dump_symbols_unittest.cc b/archive/spotify/breakpad/common/linux/dump_symbols_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/dump_symbols_unittest.cc rename to archive/spotify/breakpad/common/linux/dump_symbols_unittest.cc diff --git a/spotify/breakpad/common/linux/eintr_wrapper.h b/archive/spotify/breakpad/common/linux/eintr_wrapper.h similarity index 100% rename from spotify/breakpad/common/linux/eintr_wrapper.h rename to archive/spotify/breakpad/common/linux/eintr_wrapper.h diff --git a/spotify/breakpad/common/linux/elf_core_dump.cc b/archive/spotify/breakpad/common/linux/elf_core_dump.cc similarity index 100% rename from spotify/breakpad/common/linux/elf_core_dump.cc rename to archive/spotify/breakpad/common/linux/elf_core_dump.cc diff --git a/spotify/breakpad/common/linux/elf_core_dump.h b/archive/spotify/breakpad/common/linux/elf_core_dump.h similarity index 100% rename from spotify/breakpad/common/linux/elf_core_dump.h rename to archive/spotify/breakpad/common/linux/elf_core_dump.h diff --git a/spotify/breakpad/common/linux/elf_core_dump_unittest.cc b/archive/spotify/breakpad/common/linux/elf_core_dump_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/elf_core_dump_unittest.cc rename to archive/spotify/breakpad/common/linux/elf_core_dump_unittest.cc diff --git a/spotify/breakpad/common/linux/elf_symbols_to_module.cc b/archive/spotify/breakpad/common/linux/elf_symbols_to_module.cc similarity index 100% rename from spotify/breakpad/common/linux/elf_symbols_to_module.cc rename to archive/spotify/breakpad/common/linux/elf_symbols_to_module.cc diff --git a/spotify/breakpad/common/linux/elf_symbols_to_module.h b/archive/spotify/breakpad/common/linux/elf_symbols_to_module.h similarity index 100% rename from spotify/breakpad/common/linux/elf_symbols_to_module.h rename to archive/spotify/breakpad/common/linux/elf_symbols_to_module.h diff --git a/spotify/breakpad/common/linux/elf_symbols_to_module_unittest.cc b/archive/spotify/breakpad/common/linux/elf_symbols_to_module_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/elf_symbols_to_module_unittest.cc rename to archive/spotify/breakpad/common/linux/elf_symbols_to_module_unittest.cc diff --git a/spotify/breakpad/common/linux/file_id.cc b/archive/spotify/breakpad/common/linux/file_id.cc similarity index 100% rename from spotify/breakpad/common/linux/file_id.cc rename to archive/spotify/breakpad/common/linux/file_id.cc diff --git a/spotify/breakpad/common/linux/file_id.h b/archive/spotify/breakpad/common/linux/file_id.h similarity index 100% rename from spotify/breakpad/common/linux/file_id.h rename to archive/spotify/breakpad/common/linux/file_id.h diff --git a/spotify/breakpad/common/linux/file_id_unittest.cc b/archive/spotify/breakpad/common/linux/file_id_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/file_id_unittest.cc rename to archive/spotify/breakpad/common/linux/file_id_unittest.cc diff --git a/spotify/breakpad/common/linux/google_crashdump_uploader.cc b/archive/spotify/breakpad/common/linux/google_crashdump_uploader.cc similarity index 100% rename from spotify/breakpad/common/linux/google_crashdump_uploader.cc rename to archive/spotify/breakpad/common/linux/google_crashdump_uploader.cc diff --git a/spotify/breakpad/common/linux/google_crashdump_uploader.h b/archive/spotify/breakpad/common/linux/google_crashdump_uploader.h similarity index 100% rename from spotify/breakpad/common/linux/google_crashdump_uploader.h rename to archive/spotify/breakpad/common/linux/google_crashdump_uploader.h diff --git a/spotify/breakpad/common/linux/google_crashdump_uploader_test.cc b/archive/spotify/breakpad/common/linux/google_crashdump_uploader_test.cc similarity index 100% rename from spotify/breakpad/common/linux/google_crashdump_uploader_test.cc rename to archive/spotify/breakpad/common/linux/google_crashdump_uploader_test.cc diff --git a/spotify/breakpad/common/linux/guid_creator.cc b/archive/spotify/breakpad/common/linux/guid_creator.cc similarity index 100% rename from spotify/breakpad/common/linux/guid_creator.cc rename to archive/spotify/breakpad/common/linux/guid_creator.cc diff --git a/spotify/breakpad/common/linux/guid_creator.h b/archive/spotify/breakpad/common/linux/guid_creator.h similarity index 100% rename from spotify/breakpad/common/linux/guid_creator.h rename to archive/spotify/breakpad/common/linux/guid_creator.h diff --git a/spotify/breakpad/common/linux/http_upload.cc b/archive/spotify/breakpad/common/linux/http_upload.cc similarity index 100% rename from spotify/breakpad/common/linux/http_upload.cc rename to archive/spotify/breakpad/common/linux/http_upload.cc diff --git a/spotify/breakpad/common/linux/http_upload.h b/archive/spotify/breakpad/common/linux/http_upload.h similarity index 100% rename from spotify/breakpad/common/linux/http_upload.h rename to archive/spotify/breakpad/common/linux/http_upload.h diff --git a/spotify/breakpad/common/linux/libcurl_wrapper.cc b/archive/spotify/breakpad/common/linux/libcurl_wrapper.cc similarity index 100% rename from spotify/breakpad/common/linux/libcurl_wrapper.cc rename to archive/spotify/breakpad/common/linux/libcurl_wrapper.cc diff --git a/spotify/breakpad/common/linux/libcurl_wrapper.h b/archive/spotify/breakpad/common/linux/libcurl_wrapper.h similarity index 100% rename from spotify/breakpad/common/linux/libcurl_wrapper.h rename to archive/spotify/breakpad/common/linux/libcurl_wrapper.h diff --git a/spotify/breakpad/common/linux/linux_libc_support.h b/archive/spotify/breakpad/common/linux/linux_libc_support.h similarity index 100% rename from spotify/breakpad/common/linux/linux_libc_support.h rename to archive/spotify/breakpad/common/linux/linux_libc_support.h diff --git a/spotify/breakpad/common/linux/linux_libc_support_unittest.cc b/archive/spotify/breakpad/common/linux/linux_libc_support_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/linux_libc_support_unittest.cc rename to archive/spotify/breakpad/common/linux/linux_libc_support_unittest.cc diff --git a/spotify/breakpad/common/linux/memory_mapped_file.cc b/archive/spotify/breakpad/common/linux/memory_mapped_file.cc similarity index 100% rename from spotify/breakpad/common/linux/memory_mapped_file.cc rename to archive/spotify/breakpad/common/linux/memory_mapped_file.cc diff --git a/spotify/breakpad/common/linux/memory_mapped_file.h b/archive/spotify/breakpad/common/linux/memory_mapped_file.h similarity index 100% rename from spotify/breakpad/common/linux/memory_mapped_file.h rename to archive/spotify/breakpad/common/linux/memory_mapped_file.h diff --git a/spotify/breakpad/common/linux/memory_mapped_file_unittest.cc b/archive/spotify/breakpad/common/linux/memory_mapped_file_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/memory_mapped_file_unittest.cc rename to archive/spotify/breakpad/common/linux/memory_mapped_file_unittest.cc diff --git a/spotify/breakpad/common/linux/safe_readlink.cc b/archive/spotify/breakpad/common/linux/safe_readlink.cc similarity index 100% rename from spotify/breakpad/common/linux/safe_readlink.cc rename to archive/spotify/breakpad/common/linux/safe_readlink.cc diff --git a/spotify/breakpad/common/linux/safe_readlink.h b/archive/spotify/breakpad/common/linux/safe_readlink.h similarity index 100% rename from spotify/breakpad/common/linux/safe_readlink.h rename to archive/spotify/breakpad/common/linux/safe_readlink.h diff --git a/spotify/breakpad/common/linux/safe_readlink_unittest.cc b/archive/spotify/breakpad/common/linux/safe_readlink_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/safe_readlink_unittest.cc rename to archive/spotify/breakpad/common/linux/safe_readlink_unittest.cc diff --git a/spotify/breakpad/common/linux/synth_elf.cc b/archive/spotify/breakpad/common/linux/synth_elf.cc similarity index 100% rename from spotify/breakpad/common/linux/synth_elf.cc rename to archive/spotify/breakpad/common/linux/synth_elf.cc diff --git a/spotify/breakpad/common/linux/synth_elf.h b/archive/spotify/breakpad/common/linux/synth_elf.h similarity index 100% rename from spotify/breakpad/common/linux/synth_elf.h rename to archive/spotify/breakpad/common/linux/synth_elf.h diff --git a/spotify/breakpad/common/linux/synth_elf_unittest.cc b/archive/spotify/breakpad/common/linux/synth_elf_unittest.cc similarity index 100% rename from spotify/breakpad/common/linux/synth_elf_unittest.cc rename to archive/spotify/breakpad/common/linux/synth_elf_unittest.cc diff --git a/spotify/breakpad/common/linux/tests/crash_generator.cc b/archive/spotify/breakpad/common/linux/tests/crash_generator.cc similarity index 100% rename from spotify/breakpad/common/linux/tests/crash_generator.cc rename to archive/spotify/breakpad/common/linux/tests/crash_generator.cc diff --git a/spotify/breakpad/common/linux/tests/crash_generator.h b/archive/spotify/breakpad/common/linux/tests/crash_generator.h similarity index 100% rename from spotify/breakpad/common/linux/tests/crash_generator.h rename to archive/spotify/breakpad/common/linux/tests/crash_generator.h diff --git a/spotify/breakpad/common/mac/Breakpad.xcconfig b/archive/spotify/breakpad/common/mac/Breakpad.xcconfig similarity index 100% rename from spotify/breakpad/common/mac/Breakpad.xcconfig rename to archive/spotify/breakpad/common/mac/Breakpad.xcconfig diff --git a/spotify/breakpad/common/mac/BreakpadDebug.xcconfig b/archive/spotify/breakpad/common/mac/BreakpadDebug.xcconfig similarity index 100% rename from spotify/breakpad/common/mac/BreakpadDebug.xcconfig rename to archive/spotify/breakpad/common/mac/BreakpadDebug.xcconfig diff --git a/spotify/breakpad/common/mac/BreakpadRelease.xcconfig b/archive/spotify/breakpad/common/mac/BreakpadRelease.xcconfig similarity index 100% rename from spotify/breakpad/common/mac/BreakpadRelease.xcconfig rename to archive/spotify/breakpad/common/mac/BreakpadRelease.xcconfig diff --git a/spotify/breakpad/common/mac/GTMDefines.h b/archive/spotify/breakpad/common/mac/GTMDefines.h similarity index 100% rename from spotify/breakpad/common/mac/GTMDefines.h rename to archive/spotify/breakpad/common/mac/GTMDefines.h diff --git a/spotify/breakpad/common/mac/GTMGarbageCollection.h b/archive/spotify/breakpad/common/mac/GTMGarbageCollection.h similarity index 100% rename from spotify/breakpad/common/mac/GTMGarbageCollection.h rename to archive/spotify/breakpad/common/mac/GTMGarbageCollection.h diff --git a/spotify/breakpad/common/mac/GTMLogger.h b/archive/spotify/breakpad/common/mac/GTMLogger.h similarity index 100% rename from spotify/breakpad/common/mac/GTMLogger.h rename to archive/spotify/breakpad/common/mac/GTMLogger.h diff --git a/spotify/breakpad/common/mac/GTMLogger.m b/archive/spotify/breakpad/common/mac/GTMLogger.m similarity index 100% rename from spotify/breakpad/common/mac/GTMLogger.m rename to archive/spotify/breakpad/common/mac/GTMLogger.m diff --git a/spotify/breakpad/common/mac/HTTPMultipartUpload.h b/archive/spotify/breakpad/common/mac/HTTPMultipartUpload.h similarity index 100% rename from spotify/breakpad/common/mac/HTTPMultipartUpload.h rename to archive/spotify/breakpad/common/mac/HTTPMultipartUpload.h diff --git a/spotify/breakpad/common/mac/HTTPMultipartUpload.m b/archive/spotify/breakpad/common/mac/HTTPMultipartUpload.m similarity index 100% rename from spotify/breakpad/common/mac/HTTPMultipartUpload.m rename to archive/spotify/breakpad/common/mac/HTTPMultipartUpload.m diff --git a/spotify/breakpad/common/mac/MachIPC.h b/archive/spotify/breakpad/common/mac/MachIPC.h similarity index 100% rename from spotify/breakpad/common/mac/MachIPC.h rename to archive/spotify/breakpad/common/mac/MachIPC.h diff --git a/spotify/breakpad/common/mac/MachIPC.mm b/archive/spotify/breakpad/common/mac/MachIPC.mm similarity index 100% rename from spotify/breakpad/common/mac/MachIPC.mm rename to archive/spotify/breakpad/common/mac/MachIPC.mm diff --git a/spotify/breakpad/common/mac/SimpleStringDictionary.h b/archive/spotify/breakpad/common/mac/SimpleStringDictionary.h similarity index 100% rename from spotify/breakpad/common/mac/SimpleStringDictionary.h rename to archive/spotify/breakpad/common/mac/SimpleStringDictionary.h diff --git a/spotify/breakpad/common/mac/SimpleStringDictionary.mm b/archive/spotify/breakpad/common/mac/SimpleStringDictionary.mm similarity index 100% rename from spotify/breakpad/common/mac/SimpleStringDictionary.mm rename to archive/spotify/breakpad/common/mac/SimpleStringDictionary.mm diff --git a/spotify/breakpad/common/mac/bootstrap_compat.cc b/archive/spotify/breakpad/common/mac/bootstrap_compat.cc similarity index 100% rename from spotify/breakpad/common/mac/bootstrap_compat.cc rename to archive/spotify/breakpad/common/mac/bootstrap_compat.cc diff --git a/spotify/breakpad/common/mac/bootstrap_compat.h b/archive/spotify/breakpad/common/mac/bootstrap_compat.h similarity index 100% rename from spotify/breakpad/common/mac/bootstrap_compat.h rename to archive/spotify/breakpad/common/mac/bootstrap_compat.h diff --git a/spotify/breakpad/common/mac/byteswap.h b/archive/spotify/breakpad/common/mac/byteswap.h similarity index 100% rename from spotify/breakpad/common/mac/byteswap.h rename to archive/spotify/breakpad/common/mac/byteswap.h diff --git a/spotify/breakpad/common/mac/dump_syms.h b/archive/spotify/breakpad/common/mac/dump_syms.h similarity index 100% rename from spotify/breakpad/common/mac/dump_syms.h rename to archive/spotify/breakpad/common/mac/dump_syms.h diff --git a/spotify/breakpad/common/mac/dump_syms.mm b/archive/spotify/breakpad/common/mac/dump_syms.mm similarity index 100% rename from spotify/breakpad/common/mac/dump_syms.mm rename to archive/spotify/breakpad/common/mac/dump_syms.mm diff --git a/spotify/breakpad/common/mac/file_id.cc b/archive/spotify/breakpad/common/mac/file_id.cc similarity index 100% rename from spotify/breakpad/common/mac/file_id.cc rename to archive/spotify/breakpad/common/mac/file_id.cc diff --git a/spotify/breakpad/common/mac/file_id.h b/archive/spotify/breakpad/common/mac/file_id.h similarity index 100% rename from spotify/breakpad/common/mac/file_id.h rename to archive/spotify/breakpad/common/mac/file_id.h diff --git a/spotify/breakpad/common/mac/macho_id.cc b/archive/spotify/breakpad/common/mac/macho_id.cc similarity index 100% rename from spotify/breakpad/common/mac/macho_id.cc rename to archive/spotify/breakpad/common/mac/macho_id.cc diff --git a/spotify/breakpad/common/mac/macho_id.h b/archive/spotify/breakpad/common/mac/macho_id.h similarity index 100% rename from spotify/breakpad/common/mac/macho_id.h rename to archive/spotify/breakpad/common/mac/macho_id.h diff --git a/spotify/breakpad/common/mac/macho_reader.cc b/archive/spotify/breakpad/common/mac/macho_reader.cc similarity index 100% rename from spotify/breakpad/common/mac/macho_reader.cc rename to archive/spotify/breakpad/common/mac/macho_reader.cc diff --git a/spotify/breakpad/common/mac/macho_reader.h b/archive/spotify/breakpad/common/mac/macho_reader.h similarity index 100% rename from spotify/breakpad/common/mac/macho_reader.h rename to archive/spotify/breakpad/common/mac/macho_reader.h diff --git a/spotify/breakpad/common/mac/macho_reader_unittest.cc b/archive/spotify/breakpad/common/mac/macho_reader_unittest.cc similarity index 100% rename from spotify/breakpad/common/mac/macho_reader_unittest.cc rename to archive/spotify/breakpad/common/mac/macho_reader_unittest.cc diff --git a/spotify/breakpad/common/mac/macho_utilities.cc b/archive/spotify/breakpad/common/mac/macho_utilities.cc similarity index 100% rename from spotify/breakpad/common/mac/macho_utilities.cc rename to archive/spotify/breakpad/common/mac/macho_utilities.cc diff --git a/spotify/breakpad/common/mac/macho_utilities.h b/archive/spotify/breakpad/common/mac/macho_utilities.h similarity index 100% rename from spotify/breakpad/common/mac/macho_utilities.h rename to archive/spotify/breakpad/common/mac/macho_utilities.h diff --git a/spotify/breakpad/common/mac/macho_walker.cc b/archive/spotify/breakpad/common/mac/macho_walker.cc similarity index 100% rename from spotify/breakpad/common/mac/macho_walker.cc rename to archive/spotify/breakpad/common/mac/macho_walker.cc diff --git a/spotify/breakpad/common/mac/macho_walker.h b/archive/spotify/breakpad/common/mac/macho_walker.h similarity index 100% rename from spotify/breakpad/common/mac/macho_walker.h rename to archive/spotify/breakpad/common/mac/macho_walker.h diff --git a/spotify/breakpad/common/mac/scoped_task_suspend-inl.h b/archive/spotify/breakpad/common/mac/scoped_task_suspend-inl.h similarity index 100% rename from spotify/breakpad/common/mac/scoped_task_suspend-inl.h rename to archive/spotify/breakpad/common/mac/scoped_task_suspend-inl.h diff --git a/spotify/breakpad/common/mac/string_utilities.cc b/archive/spotify/breakpad/common/mac/string_utilities.cc similarity index 100% rename from spotify/breakpad/common/mac/string_utilities.cc rename to archive/spotify/breakpad/common/mac/string_utilities.cc diff --git a/spotify/breakpad/common/mac/string_utilities.h b/archive/spotify/breakpad/common/mac/string_utilities.h similarity index 100% rename from spotify/breakpad/common/mac/string_utilities.h rename to archive/spotify/breakpad/common/mac/string_utilities.h diff --git a/spotify/breakpad/common/mac/testing/GTMSenTestCase.h b/archive/spotify/breakpad/common/mac/testing/GTMSenTestCase.h similarity index 100% rename from spotify/breakpad/common/mac/testing/GTMSenTestCase.h rename to archive/spotify/breakpad/common/mac/testing/GTMSenTestCase.h diff --git a/spotify/breakpad/common/mac/testing/GTMSenTestCase.m b/archive/spotify/breakpad/common/mac/testing/GTMSenTestCase.m similarity index 100% rename from spotify/breakpad/common/mac/testing/GTMSenTestCase.m rename to archive/spotify/breakpad/common/mac/testing/GTMSenTestCase.m diff --git a/spotify/breakpad/common/md5.cc b/archive/spotify/breakpad/common/md5.cc similarity index 100% rename from spotify/breakpad/common/md5.cc rename to archive/spotify/breakpad/common/md5.cc diff --git a/spotify/breakpad/common/md5.h b/archive/spotify/breakpad/common/md5.h similarity index 100% rename from spotify/breakpad/common/md5.h rename to archive/spotify/breakpad/common/md5.h diff --git a/spotify/breakpad/common/memory.h b/archive/spotify/breakpad/common/memory.h similarity index 100% rename from spotify/breakpad/common/memory.h rename to archive/spotify/breakpad/common/memory.h diff --git a/spotify/breakpad/common/memory_range.h b/archive/spotify/breakpad/common/memory_range.h similarity index 100% rename from spotify/breakpad/common/memory_range.h rename to archive/spotify/breakpad/common/memory_range.h diff --git a/spotify/breakpad/common/memory_range_unittest.cc b/archive/spotify/breakpad/common/memory_range_unittest.cc similarity index 100% rename from spotify/breakpad/common/memory_range_unittest.cc rename to archive/spotify/breakpad/common/memory_range_unittest.cc diff --git a/spotify/breakpad/common/memory_unittest.cc b/archive/spotify/breakpad/common/memory_unittest.cc similarity index 100% rename from spotify/breakpad/common/memory_unittest.cc rename to archive/spotify/breakpad/common/memory_unittest.cc diff --git a/spotify/breakpad/common/module.cc b/archive/spotify/breakpad/common/module.cc similarity index 100% rename from spotify/breakpad/common/module.cc rename to archive/spotify/breakpad/common/module.cc diff --git a/spotify/breakpad/common/module.h b/archive/spotify/breakpad/common/module.h similarity index 100% rename from spotify/breakpad/common/module.h rename to archive/spotify/breakpad/common/module.h diff --git a/spotify/breakpad/common/module_unittest.cc b/archive/spotify/breakpad/common/module_unittest.cc similarity index 100% rename from spotify/breakpad/common/module_unittest.cc rename to archive/spotify/breakpad/common/module_unittest.cc diff --git a/spotify/breakpad/common/solaris/dump_symbols.cc b/archive/spotify/breakpad/common/solaris/dump_symbols.cc similarity index 100% rename from spotify/breakpad/common/solaris/dump_symbols.cc rename to archive/spotify/breakpad/common/solaris/dump_symbols.cc diff --git a/spotify/breakpad/common/solaris/dump_symbols.h b/archive/spotify/breakpad/common/solaris/dump_symbols.h similarity index 100% rename from spotify/breakpad/common/solaris/dump_symbols.h rename to archive/spotify/breakpad/common/solaris/dump_symbols.h diff --git a/spotify/breakpad/common/solaris/file_id.cc b/archive/spotify/breakpad/common/solaris/file_id.cc similarity index 100% rename from spotify/breakpad/common/solaris/file_id.cc rename to archive/spotify/breakpad/common/solaris/file_id.cc diff --git a/spotify/breakpad/common/solaris/file_id.h b/archive/spotify/breakpad/common/solaris/file_id.h similarity index 100% rename from spotify/breakpad/common/solaris/file_id.h rename to archive/spotify/breakpad/common/solaris/file_id.h diff --git a/spotify/breakpad/common/solaris/guid_creator.cc b/archive/spotify/breakpad/common/solaris/guid_creator.cc similarity index 100% rename from spotify/breakpad/common/solaris/guid_creator.cc rename to archive/spotify/breakpad/common/solaris/guid_creator.cc diff --git a/spotify/breakpad/common/solaris/guid_creator.h b/archive/spotify/breakpad/common/solaris/guid_creator.h similarity index 100% rename from spotify/breakpad/common/solaris/guid_creator.h rename to archive/spotify/breakpad/common/solaris/guid_creator.h diff --git a/spotify/breakpad/common/solaris/message_output.h b/archive/spotify/breakpad/common/solaris/message_output.h similarity index 100% rename from spotify/breakpad/common/solaris/message_output.h rename to archive/spotify/breakpad/common/solaris/message_output.h diff --git a/spotify/breakpad/common/stabs_reader.cc b/archive/spotify/breakpad/common/stabs_reader.cc similarity index 100% rename from spotify/breakpad/common/stabs_reader.cc rename to archive/spotify/breakpad/common/stabs_reader.cc diff --git a/spotify/breakpad/common/stabs_reader.h b/archive/spotify/breakpad/common/stabs_reader.h similarity index 100% rename from spotify/breakpad/common/stabs_reader.h rename to archive/spotify/breakpad/common/stabs_reader.h diff --git a/spotify/breakpad/common/stabs_reader_unittest.cc b/archive/spotify/breakpad/common/stabs_reader_unittest.cc similarity index 100% rename from spotify/breakpad/common/stabs_reader_unittest.cc rename to archive/spotify/breakpad/common/stabs_reader_unittest.cc diff --git a/spotify/breakpad/common/stabs_to_module.cc b/archive/spotify/breakpad/common/stabs_to_module.cc similarity index 100% rename from spotify/breakpad/common/stabs_to_module.cc rename to archive/spotify/breakpad/common/stabs_to_module.cc diff --git a/spotify/breakpad/common/stabs_to_module.h b/archive/spotify/breakpad/common/stabs_to_module.h similarity index 100% rename from spotify/breakpad/common/stabs_to_module.h rename to archive/spotify/breakpad/common/stabs_to_module.h diff --git a/spotify/breakpad/common/stabs_to_module_unittest.cc b/archive/spotify/breakpad/common/stabs_to_module_unittest.cc similarity index 100% rename from spotify/breakpad/common/stabs_to_module_unittest.cc rename to archive/spotify/breakpad/common/stabs_to_module_unittest.cc diff --git a/spotify/breakpad/common/string_conversion.cc b/archive/spotify/breakpad/common/string_conversion.cc similarity index 100% rename from spotify/breakpad/common/string_conversion.cc rename to archive/spotify/breakpad/common/string_conversion.cc diff --git a/spotify/breakpad/common/string_conversion.h b/archive/spotify/breakpad/common/string_conversion.h similarity index 100% rename from spotify/breakpad/common/string_conversion.h rename to archive/spotify/breakpad/common/string_conversion.h diff --git a/spotify/breakpad/common/test_assembler.cc b/archive/spotify/breakpad/common/test_assembler.cc similarity index 100% rename from spotify/breakpad/common/test_assembler.cc rename to archive/spotify/breakpad/common/test_assembler.cc diff --git a/spotify/breakpad/common/test_assembler.h b/archive/spotify/breakpad/common/test_assembler.h similarity index 100% rename from spotify/breakpad/common/test_assembler.h rename to archive/spotify/breakpad/common/test_assembler.h diff --git a/spotify/breakpad/common/test_assembler_unittest.cc b/archive/spotify/breakpad/common/test_assembler_unittest.cc similarity index 100% rename from spotify/breakpad/common/test_assembler_unittest.cc rename to archive/spotify/breakpad/common/test_assembler_unittest.cc diff --git a/spotify/breakpad/common/testdata/func-line-pairing.h b/archive/spotify/breakpad/common/testdata/func-line-pairing.h similarity index 100% rename from spotify/breakpad/common/testdata/func-line-pairing.h rename to archive/spotify/breakpad/common/testdata/func-line-pairing.h diff --git a/spotify/breakpad/common/windows/guid_string.cc b/archive/spotify/breakpad/common/windows/guid_string.cc similarity index 100% rename from spotify/breakpad/common/windows/guid_string.cc rename to archive/spotify/breakpad/common/windows/guid_string.cc diff --git a/spotify/breakpad/common/windows/guid_string.h b/archive/spotify/breakpad/common/windows/guid_string.h similarity index 100% rename from spotify/breakpad/common/windows/guid_string.h rename to archive/spotify/breakpad/common/windows/guid_string.h diff --git a/spotify/breakpad/common/windows/http_upload.cc b/archive/spotify/breakpad/common/windows/http_upload.cc similarity index 100% rename from spotify/breakpad/common/windows/http_upload.cc rename to archive/spotify/breakpad/common/windows/http_upload.cc diff --git a/spotify/breakpad/common/windows/http_upload.h b/archive/spotify/breakpad/common/windows/http_upload.h similarity index 100% rename from spotify/breakpad/common/windows/http_upload.h rename to archive/spotify/breakpad/common/windows/http_upload.h diff --git a/spotify/breakpad/common/windows/pdb_source_line_writer.cc b/archive/spotify/breakpad/common/windows/pdb_source_line_writer.cc similarity index 100% rename from spotify/breakpad/common/windows/pdb_source_line_writer.cc rename to archive/spotify/breakpad/common/windows/pdb_source_line_writer.cc diff --git a/spotify/breakpad/common/windows/pdb_source_line_writer.h b/archive/spotify/breakpad/common/windows/pdb_source_line_writer.h similarity index 100% rename from spotify/breakpad/common/windows/pdb_source_line_writer.h rename to archive/spotify/breakpad/common/windows/pdb_source_line_writer.h diff --git a/spotify/breakpad/common/windows/string_utils-inl.h b/archive/spotify/breakpad/common/windows/string_utils-inl.h similarity index 100% rename from spotify/breakpad/common/windows/string_utils-inl.h rename to archive/spotify/breakpad/common/windows/string_utils-inl.h diff --git a/spotify/breakpad/common/windows/string_utils.cc b/archive/spotify/breakpad/common/windows/string_utils.cc similarity index 100% rename from spotify/breakpad/common/windows/string_utils.cc rename to archive/spotify/breakpad/common/windows/string_utils.cc diff --git a/spotify/breakpad/config.h.in b/archive/spotify/breakpad/config.h.in similarity index 100% rename from spotify/breakpad/config.h.in rename to archive/spotify/breakpad/config.h.in diff --git a/spotify/breakpad/google_breakpad/common/breakpad_types.h b/archive/spotify/breakpad/google_breakpad/common/breakpad_types.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/breakpad_types.h rename to archive/spotify/breakpad/google_breakpad/common/breakpad_types.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_cpu_amd64.h b/archive/spotify/breakpad/google_breakpad/common/minidump_cpu_amd64.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_cpu_amd64.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_cpu_amd64.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_cpu_arm.h b/archive/spotify/breakpad/google_breakpad/common/minidump_cpu_arm.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_cpu_arm.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_cpu_arm.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc.h b/archive/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_cpu_ppc.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc64.h b/archive/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc64.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_cpu_ppc64.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_cpu_ppc64.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_cpu_sparc.h b/archive/spotify/breakpad/google_breakpad/common/minidump_cpu_sparc.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_cpu_sparc.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_cpu_sparc.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_cpu_x86.h b/archive/spotify/breakpad/google_breakpad/common/minidump_cpu_x86.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_cpu_x86.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_cpu_x86.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_exception_linux.h b/archive/spotify/breakpad/google_breakpad/common/minidump_exception_linux.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_exception_linux.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_exception_linux.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_exception_mac.h b/archive/spotify/breakpad/google_breakpad/common/minidump_exception_mac.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_exception_mac.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_exception_mac.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_exception_solaris.h b/archive/spotify/breakpad/google_breakpad/common/minidump_exception_solaris.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_exception_solaris.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_exception_solaris.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_exception_win32.h b/archive/spotify/breakpad/google_breakpad/common/minidump_exception_win32.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_exception_win32.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_exception_win32.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_format.h b/archive/spotify/breakpad/google_breakpad/common/minidump_format.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_format.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_format.h diff --git a/spotify/breakpad/google_breakpad/common/minidump_size.h b/archive/spotify/breakpad/google_breakpad/common/minidump_size.h similarity index 100% rename from spotify/breakpad/google_breakpad/common/minidump_size.h rename to archive/spotify/breakpad/google_breakpad/common/minidump_size.h diff --git a/spotify/breakpad/google_breakpad/processor/basic_source_line_resolver.h b/archive/spotify/breakpad/google_breakpad/processor/basic_source_line_resolver.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/basic_source_line_resolver.h rename to archive/spotify/breakpad/google_breakpad/processor/basic_source_line_resolver.h diff --git a/spotify/breakpad/google_breakpad/processor/call_stack.h b/archive/spotify/breakpad/google_breakpad/processor/call_stack.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/call_stack.h rename to archive/spotify/breakpad/google_breakpad/processor/call_stack.h diff --git a/spotify/breakpad/google_breakpad/processor/code_module.h b/archive/spotify/breakpad/google_breakpad/processor/code_module.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/code_module.h rename to archive/spotify/breakpad/google_breakpad/processor/code_module.h diff --git a/spotify/breakpad/google_breakpad/processor/code_modules.h b/archive/spotify/breakpad/google_breakpad/processor/code_modules.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/code_modules.h rename to archive/spotify/breakpad/google_breakpad/processor/code_modules.h diff --git a/spotify/breakpad/google_breakpad/processor/exploitability.h b/archive/spotify/breakpad/google_breakpad/processor/exploitability.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/exploitability.h rename to archive/spotify/breakpad/google_breakpad/processor/exploitability.h diff --git a/spotify/breakpad/google_breakpad/processor/fast_source_line_resolver.h b/archive/spotify/breakpad/google_breakpad/processor/fast_source_line_resolver.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/fast_source_line_resolver.h rename to archive/spotify/breakpad/google_breakpad/processor/fast_source_line_resolver.h diff --git a/spotify/breakpad/google_breakpad/processor/memory_region.h b/archive/spotify/breakpad/google_breakpad/processor/memory_region.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/memory_region.h rename to archive/spotify/breakpad/google_breakpad/processor/memory_region.h diff --git a/spotify/breakpad/google_breakpad/processor/minidump.h b/archive/spotify/breakpad/google_breakpad/processor/minidump.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/minidump.h rename to archive/spotify/breakpad/google_breakpad/processor/minidump.h diff --git a/spotify/breakpad/google_breakpad/processor/minidump_processor.h b/archive/spotify/breakpad/google_breakpad/processor/minidump_processor.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/minidump_processor.h rename to archive/spotify/breakpad/google_breakpad/processor/minidump_processor.h diff --git a/spotify/breakpad/google_breakpad/processor/process_state.h b/archive/spotify/breakpad/google_breakpad/processor/process_state.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/process_state.h rename to archive/spotify/breakpad/google_breakpad/processor/process_state.h diff --git a/spotify/breakpad/google_breakpad/processor/source_line_resolver_base.h b/archive/spotify/breakpad/google_breakpad/processor/source_line_resolver_base.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/source_line_resolver_base.h rename to archive/spotify/breakpad/google_breakpad/processor/source_line_resolver_base.h diff --git a/spotify/breakpad/google_breakpad/processor/source_line_resolver_interface.h b/archive/spotify/breakpad/google_breakpad/processor/source_line_resolver_interface.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/source_line_resolver_interface.h rename to archive/spotify/breakpad/google_breakpad/processor/source_line_resolver_interface.h diff --git a/spotify/breakpad/google_breakpad/processor/stack_frame.h b/archive/spotify/breakpad/google_breakpad/processor/stack_frame.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/stack_frame.h rename to archive/spotify/breakpad/google_breakpad/processor/stack_frame.h diff --git a/spotify/breakpad/google_breakpad/processor/stack_frame_cpu.h b/archive/spotify/breakpad/google_breakpad/processor/stack_frame_cpu.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/stack_frame_cpu.h rename to archive/spotify/breakpad/google_breakpad/processor/stack_frame_cpu.h diff --git a/spotify/breakpad/google_breakpad/processor/stackwalker.h b/archive/spotify/breakpad/google_breakpad/processor/stackwalker.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/stackwalker.h rename to archive/spotify/breakpad/google_breakpad/processor/stackwalker.h diff --git a/spotify/breakpad/google_breakpad/processor/symbol_supplier.h b/archive/spotify/breakpad/google_breakpad/processor/symbol_supplier.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/symbol_supplier.h rename to archive/spotify/breakpad/google_breakpad/processor/symbol_supplier.h diff --git a/spotify/breakpad/google_breakpad/processor/system_info.h b/archive/spotify/breakpad/google_breakpad/processor/system_info.h similarity index 100% rename from spotify/breakpad/google_breakpad/processor/system_info.h rename to archive/spotify/breakpad/google_breakpad/processor/system_info.h diff --git a/spotify/breakpad/processor/address_map-inl.h b/archive/spotify/breakpad/processor/address_map-inl.h similarity index 100% rename from spotify/breakpad/processor/address_map-inl.h rename to archive/spotify/breakpad/processor/address_map-inl.h diff --git a/spotify/breakpad/processor/address_map.h b/archive/spotify/breakpad/processor/address_map.h similarity index 100% rename from spotify/breakpad/processor/address_map.h rename to archive/spotify/breakpad/processor/address_map.h diff --git a/spotify/breakpad/processor/address_map_unittest.cc b/archive/spotify/breakpad/processor/address_map_unittest.cc similarity index 100% rename from spotify/breakpad/processor/address_map_unittest.cc rename to archive/spotify/breakpad/processor/address_map_unittest.cc diff --git a/spotify/breakpad/processor/basic_code_module.h b/archive/spotify/breakpad/processor/basic_code_module.h similarity index 100% rename from spotify/breakpad/processor/basic_code_module.h rename to archive/spotify/breakpad/processor/basic_code_module.h diff --git a/spotify/breakpad/processor/basic_code_modules.cc b/archive/spotify/breakpad/processor/basic_code_modules.cc similarity index 100% rename from spotify/breakpad/processor/basic_code_modules.cc rename to archive/spotify/breakpad/processor/basic_code_modules.cc diff --git a/spotify/breakpad/processor/basic_code_modules.h b/archive/spotify/breakpad/processor/basic_code_modules.h similarity index 100% rename from spotify/breakpad/processor/basic_code_modules.h rename to archive/spotify/breakpad/processor/basic_code_modules.h diff --git a/spotify/breakpad/processor/basic_source_line_resolver.cc b/archive/spotify/breakpad/processor/basic_source_line_resolver.cc similarity index 100% rename from spotify/breakpad/processor/basic_source_line_resolver.cc rename to archive/spotify/breakpad/processor/basic_source_line_resolver.cc diff --git a/spotify/breakpad/processor/basic_source_line_resolver_types.h b/archive/spotify/breakpad/processor/basic_source_line_resolver_types.h similarity index 100% rename from spotify/breakpad/processor/basic_source_line_resolver_types.h rename to archive/spotify/breakpad/processor/basic_source_line_resolver_types.h diff --git a/spotify/breakpad/processor/basic_source_line_resolver_unittest.cc b/archive/spotify/breakpad/processor/basic_source_line_resolver_unittest.cc similarity index 100% rename from spotify/breakpad/processor/basic_source_line_resolver_unittest.cc rename to archive/spotify/breakpad/processor/basic_source_line_resolver_unittest.cc diff --git a/spotify/breakpad/processor/binarystream.cc b/archive/spotify/breakpad/processor/binarystream.cc similarity index 100% rename from spotify/breakpad/processor/binarystream.cc rename to archive/spotify/breakpad/processor/binarystream.cc diff --git a/spotify/breakpad/processor/binarystream.h b/archive/spotify/breakpad/processor/binarystream.h similarity index 100% rename from spotify/breakpad/processor/binarystream.h rename to archive/spotify/breakpad/processor/binarystream.h diff --git a/spotify/breakpad/processor/binarystream_unittest.cc b/archive/spotify/breakpad/processor/binarystream_unittest.cc similarity index 100% rename from spotify/breakpad/processor/binarystream_unittest.cc rename to archive/spotify/breakpad/processor/binarystream_unittest.cc diff --git a/spotify/breakpad/processor/call_stack.cc b/archive/spotify/breakpad/processor/call_stack.cc similarity index 100% rename from spotify/breakpad/processor/call_stack.cc rename to archive/spotify/breakpad/processor/call_stack.cc diff --git a/spotify/breakpad/processor/cfi_frame_info-inl.h b/archive/spotify/breakpad/processor/cfi_frame_info-inl.h similarity index 100% rename from spotify/breakpad/processor/cfi_frame_info-inl.h rename to archive/spotify/breakpad/processor/cfi_frame_info-inl.h diff --git a/spotify/breakpad/processor/cfi_frame_info.cc b/archive/spotify/breakpad/processor/cfi_frame_info.cc similarity index 100% rename from spotify/breakpad/processor/cfi_frame_info.cc rename to archive/spotify/breakpad/processor/cfi_frame_info.cc diff --git a/spotify/breakpad/processor/cfi_frame_info.h b/archive/spotify/breakpad/processor/cfi_frame_info.h similarity index 100% rename from spotify/breakpad/processor/cfi_frame_info.h rename to archive/spotify/breakpad/processor/cfi_frame_info.h diff --git a/spotify/breakpad/processor/cfi_frame_info_unittest.cc b/archive/spotify/breakpad/processor/cfi_frame_info_unittest.cc similarity index 100% rename from spotify/breakpad/processor/cfi_frame_info_unittest.cc rename to archive/spotify/breakpad/processor/cfi_frame_info_unittest.cc diff --git a/spotify/breakpad/processor/contained_range_map-inl.h b/archive/spotify/breakpad/processor/contained_range_map-inl.h similarity index 100% rename from spotify/breakpad/processor/contained_range_map-inl.h rename to archive/spotify/breakpad/processor/contained_range_map-inl.h diff --git a/spotify/breakpad/processor/contained_range_map.h b/archive/spotify/breakpad/processor/contained_range_map.h similarity index 100% rename from spotify/breakpad/processor/contained_range_map.h rename to archive/spotify/breakpad/processor/contained_range_map.h diff --git a/spotify/breakpad/processor/contained_range_map_unittest.cc b/archive/spotify/breakpad/processor/contained_range_map_unittest.cc similarity index 100% rename from spotify/breakpad/processor/contained_range_map_unittest.cc rename to archive/spotify/breakpad/processor/contained_range_map_unittest.cc diff --git a/spotify/breakpad/processor/disassembler_x86.cc b/archive/spotify/breakpad/processor/disassembler_x86.cc similarity index 100% rename from spotify/breakpad/processor/disassembler_x86.cc rename to archive/spotify/breakpad/processor/disassembler_x86.cc diff --git a/spotify/breakpad/processor/disassembler_x86.h b/archive/spotify/breakpad/processor/disassembler_x86.h similarity index 100% rename from spotify/breakpad/processor/disassembler_x86.h rename to archive/spotify/breakpad/processor/disassembler_x86.h diff --git a/spotify/breakpad/processor/disassembler_x86_unittest.cc b/archive/spotify/breakpad/processor/disassembler_x86_unittest.cc similarity index 100% rename from spotify/breakpad/processor/disassembler_x86_unittest.cc rename to archive/spotify/breakpad/processor/disassembler_x86_unittest.cc diff --git a/spotify/breakpad/processor/exploitability.cc b/archive/spotify/breakpad/processor/exploitability.cc similarity index 100% rename from spotify/breakpad/processor/exploitability.cc rename to archive/spotify/breakpad/processor/exploitability.cc diff --git a/spotify/breakpad/processor/exploitability_unittest.cc b/archive/spotify/breakpad/processor/exploitability_unittest.cc similarity index 100% rename from spotify/breakpad/processor/exploitability_unittest.cc rename to archive/spotify/breakpad/processor/exploitability_unittest.cc diff --git a/spotify/breakpad/processor/exploitability_win.cc b/archive/spotify/breakpad/processor/exploitability_win.cc similarity index 100% rename from spotify/breakpad/processor/exploitability_win.cc rename to archive/spotify/breakpad/processor/exploitability_win.cc diff --git a/spotify/breakpad/processor/exploitability_win.h b/archive/spotify/breakpad/processor/exploitability_win.h similarity index 100% rename from spotify/breakpad/processor/exploitability_win.h rename to archive/spotify/breakpad/processor/exploitability_win.h diff --git a/spotify/breakpad/processor/fast_source_line_resolver.cc b/archive/spotify/breakpad/processor/fast_source_line_resolver.cc similarity index 100% rename from spotify/breakpad/processor/fast_source_line_resolver.cc rename to archive/spotify/breakpad/processor/fast_source_line_resolver.cc diff --git a/spotify/breakpad/processor/fast_source_line_resolver_types.h b/archive/spotify/breakpad/processor/fast_source_line_resolver_types.h similarity index 100% rename from spotify/breakpad/processor/fast_source_line_resolver_types.h rename to archive/spotify/breakpad/processor/fast_source_line_resolver_types.h diff --git a/spotify/breakpad/processor/fast_source_line_resolver_unittest.cc b/archive/spotify/breakpad/processor/fast_source_line_resolver_unittest.cc similarity index 100% rename from spotify/breakpad/processor/fast_source_line_resolver_unittest.cc rename to archive/spotify/breakpad/processor/fast_source_line_resolver_unittest.cc diff --git a/spotify/breakpad/processor/linked_ptr.h b/archive/spotify/breakpad/processor/linked_ptr.h similarity index 100% rename from spotify/breakpad/processor/linked_ptr.h rename to archive/spotify/breakpad/processor/linked_ptr.h diff --git a/spotify/breakpad/processor/logging.cc b/archive/spotify/breakpad/processor/logging.cc similarity index 100% rename from spotify/breakpad/processor/logging.cc rename to archive/spotify/breakpad/processor/logging.cc diff --git a/spotify/breakpad/processor/logging.h b/archive/spotify/breakpad/processor/logging.h similarity index 100% rename from spotify/breakpad/processor/logging.h rename to archive/spotify/breakpad/processor/logging.h diff --git a/spotify/breakpad/processor/map_serializers-inl.h b/archive/spotify/breakpad/processor/map_serializers-inl.h similarity index 100% rename from spotify/breakpad/processor/map_serializers-inl.h rename to archive/spotify/breakpad/processor/map_serializers-inl.h diff --git a/spotify/breakpad/processor/map_serializers.h b/archive/spotify/breakpad/processor/map_serializers.h similarity index 100% rename from spotify/breakpad/processor/map_serializers.h rename to archive/spotify/breakpad/processor/map_serializers.h diff --git a/spotify/breakpad/processor/map_serializers_unittest.cc b/archive/spotify/breakpad/processor/map_serializers_unittest.cc similarity index 100% rename from spotify/breakpad/processor/map_serializers_unittest.cc rename to archive/spotify/breakpad/processor/map_serializers_unittest.cc diff --git a/spotify/breakpad/processor/minidump.cc b/archive/spotify/breakpad/processor/minidump.cc similarity index 100% rename from spotify/breakpad/processor/minidump.cc rename to archive/spotify/breakpad/processor/minidump.cc diff --git a/spotify/breakpad/processor/minidump_dump.cc b/archive/spotify/breakpad/processor/minidump_dump.cc similarity index 100% rename from spotify/breakpad/processor/minidump_dump.cc rename to archive/spotify/breakpad/processor/minidump_dump.cc diff --git a/spotify/breakpad/processor/minidump_dump_test b/archive/spotify/breakpad/processor/minidump_dump_test similarity index 100% rename from spotify/breakpad/processor/minidump_dump_test rename to archive/spotify/breakpad/processor/minidump_dump_test diff --git a/spotify/breakpad/processor/minidump_processor.cc b/archive/spotify/breakpad/processor/minidump_processor.cc similarity index 100% rename from spotify/breakpad/processor/minidump_processor.cc rename to archive/spotify/breakpad/processor/minidump_processor.cc diff --git a/spotify/breakpad/processor/minidump_processor_unittest.cc b/archive/spotify/breakpad/processor/minidump_processor_unittest.cc similarity index 100% rename from spotify/breakpad/processor/minidump_processor_unittest.cc rename to archive/spotify/breakpad/processor/minidump_processor_unittest.cc diff --git a/spotify/breakpad/processor/minidump_stackwalk.cc b/archive/spotify/breakpad/processor/minidump_stackwalk.cc similarity index 100% rename from spotify/breakpad/processor/minidump_stackwalk.cc rename to archive/spotify/breakpad/processor/minidump_stackwalk.cc diff --git a/spotify/breakpad/processor/minidump_stackwalk_machine_readable_test b/archive/spotify/breakpad/processor/minidump_stackwalk_machine_readable_test similarity index 100% rename from spotify/breakpad/processor/minidump_stackwalk_machine_readable_test rename to archive/spotify/breakpad/processor/minidump_stackwalk_machine_readable_test diff --git a/spotify/breakpad/processor/minidump_stackwalk_test b/archive/spotify/breakpad/processor/minidump_stackwalk_test similarity index 100% rename from spotify/breakpad/processor/minidump_stackwalk_test rename to archive/spotify/breakpad/processor/minidump_stackwalk_test diff --git a/spotify/breakpad/processor/minidump_unittest.cc b/archive/spotify/breakpad/processor/minidump_unittest.cc similarity index 100% rename from spotify/breakpad/processor/minidump_unittest.cc rename to archive/spotify/breakpad/processor/minidump_unittest.cc diff --git a/spotify/breakpad/processor/module_comparer.cc b/archive/spotify/breakpad/processor/module_comparer.cc similarity index 100% rename from spotify/breakpad/processor/module_comparer.cc rename to archive/spotify/breakpad/processor/module_comparer.cc diff --git a/spotify/breakpad/processor/module_comparer.h b/archive/spotify/breakpad/processor/module_comparer.h similarity index 100% rename from spotify/breakpad/processor/module_comparer.h rename to archive/spotify/breakpad/processor/module_comparer.h diff --git a/spotify/breakpad/processor/module_factory.h b/archive/spotify/breakpad/processor/module_factory.h similarity index 100% rename from spotify/breakpad/processor/module_factory.h rename to archive/spotify/breakpad/processor/module_factory.h diff --git a/spotify/breakpad/processor/module_serializer.cc b/archive/spotify/breakpad/processor/module_serializer.cc similarity index 100% rename from spotify/breakpad/processor/module_serializer.cc rename to archive/spotify/breakpad/processor/module_serializer.cc diff --git a/spotify/breakpad/processor/module_serializer.h b/archive/spotify/breakpad/processor/module_serializer.h similarity index 100% rename from spotify/breakpad/processor/module_serializer.h rename to archive/spotify/breakpad/processor/module_serializer.h diff --git a/spotify/breakpad/processor/pathname_stripper.cc b/archive/spotify/breakpad/processor/pathname_stripper.cc similarity index 100% rename from spotify/breakpad/processor/pathname_stripper.cc rename to archive/spotify/breakpad/processor/pathname_stripper.cc diff --git a/spotify/breakpad/processor/pathname_stripper.h b/archive/spotify/breakpad/processor/pathname_stripper.h similarity index 100% rename from spotify/breakpad/processor/pathname_stripper.h rename to archive/spotify/breakpad/processor/pathname_stripper.h diff --git a/spotify/breakpad/processor/pathname_stripper_unittest.cc b/archive/spotify/breakpad/processor/pathname_stripper_unittest.cc similarity index 100% rename from spotify/breakpad/processor/pathname_stripper_unittest.cc rename to archive/spotify/breakpad/processor/pathname_stripper_unittest.cc diff --git a/spotify/breakpad/processor/postfix_evaluator-inl.h b/archive/spotify/breakpad/processor/postfix_evaluator-inl.h similarity index 100% rename from spotify/breakpad/processor/postfix_evaluator-inl.h rename to archive/spotify/breakpad/processor/postfix_evaluator-inl.h diff --git a/spotify/breakpad/processor/postfix_evaluator.h b/archive/spotify/breakpad/processor/postfix_evaluator.h similarity index 100% rename from spotify/breakpad/processor/postfix_evaluator.h rename to archive/spotify/breakpad/processor/postfix_evaluator.h diff --git a/spotify/breakpad/processor/postfix_evaluator_unittest.cc b/archive/spotify/breakpad/processor/postfix_evaluator_unittest.cc similarity index 100% rename from spotify/breakpad/processor/postfix_evaluator_unittest.cc rename to archive/spotify/breakpad/processor/postfix_evaluator_unittest.cc diff --git a/spotify/breakpad/processor/process_state.cc b/archive/spotify/breakpad/processor/process_state.cc similarity index 100% rename from spotify/breakpad/processor/process_state.cc rename to archive/spotify/breakpad/processor/process_state.cc diff --git a/spotify/breakpad/processor/proto/README b/archive/spotify/breakpad/processor/proto/README similarity index 100% rename from spotify/breakpad/processor/proto/README rename to archive/spotify/breakpad/processor/proto/README diff --git a/spotify/breakpad/processor/proto/process_state.proto b/archive/spotify/breakpad/processor/proto/process_state.proto similarity index 100% rename from spotify/breakpad/processor/proto/process_state.proto rename to archive/spotify/breakpad/processor/proto/process_state.proto diff --git a/spotify/breakpad/processor/range_map-inl.h b/archive/spotify/breakpad/processor/range_map-inl.h similarity index 100% rename from spotify/breakpad/processor/range_map-inl.h rename to archive/spotify/breakpad/processor/range_map-inl.h diff --git a/spotify/breakpad/processor/range_map.h b/archive/spotify/breakpad/processor/range_map.h similarity index 100% rename from spotify/breakpad/processor/range_map.h rename to archive/spotify/breakpad/processor/range_map.h diff --git a/spotify/breakpad/processor/range_map_unittest.cc b/archive/spotify/breakpad/processor/range_map_unittest.cc similarity index 100% rename from spotify/breakpad/processor/range_map_unittest.cc rename to archive/spotify/breakpad/processor/range_map_unittest.cc diff --git a/spotify/breakpad/processor/scoped_ptr.h b/archive/spotify/breakpad/processor/scoped_ptr.h similarity index 100% rename from spotify/breakpad/processor/scoped_ptr.h rename to archive/spotify/breakpad/processor/scoped_ptr.h diff --git a/spotify/breakpad/processor/simple_serializer-inl.h b/archive/spotify/breakpad/processor/simple_serializer-inl.h similarity index 100% rename from spotify/breakpad/processor/simple_serializer-inl.h rename to archive/spotify/breakpad/processor/simple_serializer-inl.h diff --git a/spotify/breakpad/processor/simple_serializer.h b/archive/spotify/breakpad/processor/simple_serializer.h similarity index 100% rename from spotify/breakpad/processor/simple_serializer.h rename to archive/spotify/breakpad/processor/simple_serializer.h diff --git a/spotify/breakpad/processor/simple_symbol_supplier.cc b/archive/spotify/breakpad/processor/simple_symbol_supplier.cc similarity index 100% rename from spotify/breakpad/processor/simple_symbol_supplier.cc rename to archive/spotify/breakpad/processor/simple_symbol_supplier.cc diff --git a/spotify/breakpad/processor/simple_symbol_supplier.h b/archive/spotify/breakpad/processor/simple_symbol_supplier.h similarity index 100% rename from spotify/breakpad/processor/simple_symbol_supplier.h rename to archive/spotify/breakpad/processor/simple_symbol_supplier.h diff --git a/spotify/breakpad/processor/source_line_resolver_base.cc b/archive/spotify/breakpad/processor/source_line_resolver_base.cc similarity index 100% rename from spotify/breakpad/processor/source_line_resolver_base.cc rename to archive/spotify/breakpad/processor/source_line_resolver_base.cc diff --git a/spotify/breakpad/processor/source_line_resolver_base_types.h b/archive/spotify/breakpad/processor/source_line_resolver_base_types.h similarity index 100% rename from spotify/breakpad/processor/source_line_resolver_base_types.h rename to archive/spotify/breakpad/processor/source_line_resolver_base_types.h diff --git a/spotify/breakpad/processor/stackwalker.cc b/archive/spotify/breakpad/processor/stackwalker.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker.cc rename to archive/spotify/breakpad/processor/stackwalker.cc diff --git a/spotify/breakpad/processor/stackwalker_amd64.cc b/archive/spotify/breakpad/processor/stackwalker_amd64.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_amd64.cc rename to archive/spotify/breakpad/processor/stackwalker_amd64.cc diff --git a/spotify/breakpad/processor/stackwalker_amd64.h b/archive/spotify/breakpad/processor/stackwalker_amd64.h similarity index 100% rename from spotify/breakpad/processor/stackwalker_amd64.h rename to archive/spotify/breakpad/processor/stackwalker_amd64.h diff --git a/spotify/breakpad/processor/stackwalker_amd64_unittest.cc b/archive/spotify/breakpad/processor/stackwalker_amd64_unittest.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_amd64_unittest.cc rename to archive/spotify/breakpad/processor/stackwalker_amd64_unittest.cc diff --git a/spotify/breakpad/processor/stackwalker_arm.cc b/archive/spotify/breakpad/processor/stackwalker_arm.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_arm.cc rename to archive/spotify/breakpad/processor/stackwalker_arm.cc diff --git a/spotify/breakpad/processor/stackwalker_arm.h b/archive/spotify/breakpad/processor/stackwalker_arm.h similarity index 100% rename from spotify/breakpad/processor/stackwalker_arm.h rename to archive/spotify/breakpad/processor/stackwalker_arm.h diff --git a/spotify/breakpad/processor/stackwalker_arm_unittest.cc b/archive/spotify/breakpad/processor/stackwalker_arm_unittest.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_arm_unittest.cc rename to archive/spotify/breakpad/processor/stackwalker_arm_unittest.cc diff --git a/spotify/breakpad/processor/stackwalker_ppc.cc b/archive/spotify/breakpad/processor/stackwalker_ppc.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_ppc.cc rename to archive/spotify/breakpad/processor/stackwalker_ppc.cc diff --git a/spotify/breakpad/processor/stackwalker_ppc.h b/archive/spotify/breakpad/processor/stackwalker_ppc.h similarity index 100% rename from spotify/breakpad/processor/stackwalker_ppc.h rename to archive/spotify/breakpad/processor/stackwalker_ppc.h diff --git a/spotify/breakpad/processor/stackwalker_selftest.cc b/archive/spotify/breakpad/processor/stackwalker_selftest.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_selftest.cc rename to archive/spotify/breakpad/processor/stackwalker_selftest.cc diff --git a/spotify/breakpad/processor/stackwalker_selftest_sol.s b/archive/spotify/breakpad/processor/stackwalker_selftest_sol.s similarity index 100% rename from spotify/breakpad/processor/stackwalker_selftest_sol.s rename to archive/spotify/breakpad/processor/stackwalker_selftest_sol.s diff --git a/spotify/breakpad/processor/stackwalker_sparc.cc b/archive/spotify/breakpad/processor/stackwalker_sparc.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_sparc.cc rename to archive/spotify/breakpad/processor/stackwalker_sparc.cc diff --git a/spotify/breakpad/processor/stackwalker_sparc.h b/archive/spotify/breakpad/processor/stackwalker_sparc.h similarity index 100% rename from spotify/breakpad/processor/stackwalker_sparc.h rename to archive/spotify/breakpad/processor/stackwalker_sparc.h diff --git a/spotify/breakpad/processor/stackwalker_unittest_utils.h b/archive/spotify/breakpad/processor/stackwalker_unittest_utils.h similarity index 100% rename from spotify/breakpad/processor/stackwalker_unittest_utils.h rename to archive/spotify/breakpad/processor/stackwalker_unittest_utils.h diff --git a/spotify/breakpad/processor/stackwalker_x86.cc b/archive/spotify/breakpad/processor/stackwalker_x86.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_x86.cc rename to archive/spotify/breakpad/processor/stackwalker_x86.cc diff --git a/spotify/breakpad/processor/stackwalker_x86.h b/archive/spotify/breakpad/processor/stackwalker_x86.h similarity index 100% rename from spotify/breakpad/processor/stackwalker_x86.h rename to archive/spotify/breakpad/processor/stackwalker_x86.h diff --git a/spotify/breakpad/processor/stackwalker_x86_unittest.cc b/archive/spotify/breakpad/processor/stackwalker_x86_unittest.cc similarity index 100% rename from spotify/breakpad/processor/stackwalker_x86_unittest.cc rename to archive/spotify/breakpad/processor/stackwalker_x86_unittest.cc diff --git a/spotify/breakpad/processor/static_address_map-inl.h b/archive/spotify/breakpad/processor/static_address_map-inl.h similarity index 100% rename from spotify/breakpad/processor/static_address_map-inl.h rename to archive/spotify/breakpad/processor/static_address_map-inl.h diff --git a/spotify/breakpad/processor/static_address_map.h b/archive/spotify/breakpad/processor/static_address_map.h similarity index 100% rename from spotify/breakpad/processor/static_address_map.h rename to archive/spotify/breakpad/processor/static_address_map.h diff --git a/spotify/breakpad/processor/static_address_map_unittest.cc b/archive/spotify/breakpad/processor/static_address_map_unittest.cc similarity index 100% rename from spotify/breakpad/processor/static_address_map_unittest.cc rename to archive/spotify/breakpad/processor/static_address_map_unittest.cc diff --git a/spotify/breakpad/processor/static_contained_range_map-inl.h b/archive/spotify/breakpad/processor/static_contained_range_map-inl.h similarity index 100% rename from spotify/breakpad/processor/static_contained_range_map-inl.h rename to archive/spotify/breakpad/processor/static_contained_range_map-inl.h diff --git a/spotify/breakpad/processor/static_contained_range_map.h b/archive/spotify/breakpad/processor/static_contained_range_map.h similarity index 100% rename from spotify/breakpad/processor/static_contained_range_map.h rename to archive/spotify/breakpad/processor/static_contained_range_map.h diff --git a/spotify/breakpad/processor/static_contained_range_map_unittest.cc b/archive/spotify/breakpad/processor/static_contained_range_map_unittest.cc similarity index 100% rename from spotify/breakpad/processor/static_contained_range_map_unittest.cc rename to archive/spotify/breakpad/processor/static_contained_range_map_unittest.cc diff --git a/spotify/breakpad/processor/static_map-inl.h b/archive/spotify/breakpad/processor/static_map-inl.h similarity index 100% rename from spotify/breakpad/processor/static_map-inl.h rename to archive/spotify/breakpad/processor/static_map-inl.h diff --git a/spotify/breakpad/processor/static_map.h b/archive/spotify/breakpad/processor/static_map.h similarity index 100% rename from spotify/breakpad/processor/static_map.h rename to archive/spotify/breakpad/processor/static_map.h diff --git a/spotify/breakpad/processor/static_map_iterator-inl.h b/archive/spotify/breakpad/processor/static_map_iterator-inl.h similarity index 100% rename from spotify/breakpad/processor/static_map_iterator-inl.h rename to archive/spotify/breakpad/processor/static_map_iterator-inl.h diff --git a/spotify/breakpad/processor/static_map_iterator.h b/archive/spotify/breakpad/processor/static_map_iterator.h similarity index 100% rename from spotify/breakpad/processor/static_map_iterator.h rename to archive/spotify/breakpad/processor/static_map_iterator.h diff --git a/spotify/breakpad/processor/static_map_unittest.cc b/archive/spotify/breakpad/processor/static_map_unittest.cc similarity index 100% rename from spotify/breakpad/processor/static_map_unittest.cc rename to archive/spotify/breakpad/processor/static_map_unittest.cc diff --git a/spotify/breakpad/processor/static_range_map-inl.h b/archive/spotify/breakpad/processor/static_range_map-inl.h similarity index 100% rename from spotify/breakpad/processor/static_range_map-inl.h rename to archive/spotify/breakpad/processor/static_range_map-inl.h diff --git a/spotify/breakpad/processor/static_range_map.h b/archive/spotify/breakpad/processor/static_range_map.h similarity index 100% rename from spotify/breakpad/processor/static_range_map.h rename to archive/spotify/breakpad/processor/static_range_map.h diff --git a/spotify/breakpad/processor/static_range_map_unittest.cc b/archive/spotify/breakpad/processor/static_range_map_unittest.cc similarity index 100% rename from spotify/breakpad/processor/static_range_map_unittest.cc rename to archive/spotify/breakpad/processor/static_range_map_unittest.cc diff --git a/spotify/breakpad/processor/synth_minidump.cc b/archive/spotify/breakpad/processor/synth_minidump.cc similarity index 100% rename from spotify/breakpad/processor/synth_minidump.cc rename to archive/spotify/breakpad/processor/synth_minidump.cc diff --git a/spotify/breakpad/processor/synth_minidump.h b/archive/spotify/breakpad/processor/synth_minidump.h similarity index 100% rename from spotify/breakpad/processor/synth_minidump.h rename to archive/spotify/breakpad/processor/synth_minidump.h diff --git a/spotify/breakpad/processor/synth_minidump_unittest.cc b/archive/spotify/breakpad/processor/synth_minidump_unittest.cc similarity index 100% rename from spotify/breakpad/processor/synth_minidump_unittest.cc rename to archive/spotify/breakpad/processor/synth_minidump_unittest.cc diff --git a/spotify/breakpad/processor/synth_minidump_unittest_data.h b/archive/spotify/breakpad/processor/synth_minidump_unittest_data.h similarity index 100% rename from spotify/breakpad/processor/synth_minidump_unittest_data.h rename to archive/spotify/breakpad/processor/synth_minidump_unittest_data.h diff --git a/spotify/breakpad/processor/testdata/ascii_read_av.dmp b/archive/spotify/breakpad/processor/testdata/ascii_read_av.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_read_av.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_read_av.dmp diff --git a/spotify/breakpad/processor/testdata/ascii_read_av_block_write.dmp b/archive/spotify/breakpad/processor/testdata/ascii_read_av_block_write.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_read_av_block_write.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_read_av_block_write.dmp diff --git a/spotify/breakpad/processor/testdata/ascii_read_av_clobber_write.dmp b/archive/spotify/breakpad/processor/testdata/ascii_read_av_clobber_write.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_read_av_clobber_write.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_read_av_clobber_write.dmp diff --git a/spotify/breakpad/processor/testdata/ascii_read_av_conditional.dmp b/archive/spotify/breakpad/processor/testdata/ascii_read_av_conditional.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_read_av_conditional.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_read_av_conditional.dmp diff --git a/spotify/breakpad/processor/testdata/ascii_read_av_then_jmp.dmp b/archive/spotify/breakpad/processor/testdata/ascii_read_av_then_jmp.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_read_av_then_jmp.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_read_av_then_jmp.dmp diff --git a/spotify/breakpad/processor/testdata/ascii_read_av_xchg_write.dmp b/archive/spotify/breakpad/processor/testdata/ascii_read_av_xchg_write.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_read_av_xchg_write.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_read_av_xchg_write.dmp diff --git a/spotify/breakpad/processor/testdata/ascii_write_av.dmp b/archive/spotify/breakpad/processor/testdata/ascii_write_av.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_write_av.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_write_av.dmp diff --git a/spotify/breakpad/processor/testdata/ascii_write_av_arg_to_call.dmp b/archive/spotify/breakpad/processor/testdata/ascii_write_av_arg_to_call.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/ascii_write_av_arg_to_call.dmp rename to archive/spotify/breakpad/processor/testdata/ascii_write_av_arg_to_call.dmp diff --git a/spotify/breakpad/processor/testdata/exec_av_on_stack.dmp b/archive/spotify/breakpad/processor/testdata/exec_av_on_stack.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/exec_av_on_stack.dmp rename to archive/spotify/breakpad/processor/testdata/exec_av_on_stack.dmp diff --git a/spotify/breakpad/processor/testdata/linux_test_app.cc b/archive/spotify/breakpad/processor/testdata/linux_test_app.cc similarity index 100% rename from spotify/breakpad/processor/testdata/linux_test_app.cc rename to archive/spotify/breakpad/processor/testdata/linux_test_app.cc diff --git a/spotify/breakpad/processor/testdata/minidump2.dmp b/archive/spotify/breakpad/processor/testdata/minidump2.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/minidump2.dmp rename to archive/spotify/breakpad/processor/testdata/minidump2.dmp diff --git a/spotify/breakpad/processor/testdata/minidump2.dump.out b/archive/spotify/breakpad/processor/testdata/minidump2.dump.out similarity index 100% rename from spotify/breakpad/processor/testdata/minidump2.dump.out rename to archive/spotify/breakpad/processor/testdata/minidump2.dump.out diff --git a/spotify/breakpad/processor/testdata/minidump2.stackwalk.machine_readable.out b/archive/spotify/breakpad/processor/testdata/minidump2.stackwalk.machine_readable.out similarity index 100% rename from spotify/breakpad/processor/testdata/minidump2.stackwalk.machine_readable.out rename to archive/spotify/breakpad/processor/testdata/minidump2.stackwalk.machine_readable.out diff --git a/spotify/breakpad/processor/testdata/minidump2.stackwalk.out b/archive/spotify/breakpad/processor/testdata/minidump2.stackwalk.out similarity index 100% rename from spotify/breakpad/processor/testdata/minidump2.stackwalk.out rename to archive/spotify/breakpad/processor/testdata/minidump2.stackwalk.out diff --git a/spotify/breakpad/processor/testdata/module0.out b/archive/spotify/breakpad/processor/testdata/module0.out similarity index 100% rename from spotify/breakpad/processor/testdata/module0.out rename to archive/spotify/breakpad/processor/testdata/module0.out diff --git a/spotify/breakpad/processor/testdata/module1.out b/archive/spotify/breakpad/processor/testdata/module1.out similarity index 100% rename from spotify/breakpad/processor/testdata/module1.out rename to archive/spotify/breakpad/processor/testdata/module1.out diff --git a/spotify/breakpad/processor/testdata/module2.out b/archive/spotify/breakpad/processor/testdata/module2.out similarity index 100% rename from spotify/breakpad/processor/testdata/module2.out rename to archive/spotify/breakpad/processor/testdata/module2.out diff --git a/spotify/breakpad/processor/testdata/module3_bad.out b/archive/spotify/breakpad/processor/testdata/module3_bad.out similarity index 100% rename from spotify/breakpad/processor/testdata/module3_bad.out rename to archive/spotify/breakpad/processor/testdata/module3_bad.out diff --git a/spotify/breakpad/processor/testdata/module4_bad.out b/archive/spotify/breakpad/processor/testdata/module4_bad.out similarity index 100% rename from spotify/breakpad/processor/testdata/module4_bad.out rename to archive/spotify/breakpad/processor/testdata/module4_bad.out diff --git a/spotify/breakpad/processor/testdata/null_read_av.dmp b/archive/spotify/breakpad/processor/testdata/null_read_av.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/null_read_av.dmp rename to archive/spotify/breakpad/processor/testdata/null_read_av.dmp diff --git a/spotify/breakpad/processor/testdata/null_write_av.dmp b/archive/spotify/breakpad/processor/testdata/null_write_av.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/null_write_av.dmp rename to archive/spotify/breakpad/processor/testdata/null_write_av.dmp diff --git a/spotify/breakpad/processor/testdata/read_av_clobber_write.dmp b/archive/spotify/breakpad/processor/testdata/read_av_clobber_write.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/read_av_clobber_write.dmp rename to archive/spotify/breakpad/processor/testdata/read_av_clobber_write.dmp diff --git a/spotify/breakpad/processor/testdata/read_av_conditional.dmp b/archive/spotify/breakpad/processor/testdata/read_av_conditional.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/read_av_conditional.dmp rename to archive/spotify/breakpad/processor/testdata/read_av_conditional.dmp diff --git a/spotify/breakpad/processor/testdata/read_av_non_null.dmp b/archive/spotify/breakpad/processor/testdata/read_av_non_null.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/read_av_non_null.dmp rename to archive/spotify/breakpad/processor/testdata/read_av_non_null.dmp diff --git a/spotify/breakpad/processor/testdata/stack_exhaustion.dmp b/archive/spotify/breakpad/processor/testdata/stack_exhaustion.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/stack_exhaustion.dmp rename to archive/spotify/breakpad/processor/testdata/stack_exhaustion.dmp diff --git a/spotify/breakpad/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym b/archive/spotify/breakpad/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym similarity index 100% rename from spotify/breakpad/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym rename to archive/spotify/breakpad/processor/testdata/symbols/kernel32.pdb/BCE8785C57B44245A669896B6A19B9542/kernel32.sym diff --git a/spotify/breakpad/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym b/archive/spotify/breakpad/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym similarity index 100% rename from spotify/breakpad/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym rename to archive/spotify/breakpad/processor/testdata/symbols/test_app.pdb/5A9832E5287241C1838ED98914E9B7FF1/test_app.sym diff --git a/spotify/breakpad/processor/testdata/test_app.cc b/archive/spotify/breakpad/processor/testdata/test_app.cc similarity index 100% rename from spotify/breakpad/processor/testdata/test_app.cc rename to archive/spotify/breakpad/processor/testdata/test_app.cc diff --git a/spotify/breakpad/processor/testdata/write_av_non_null.dmp b/archive/spotify/breakpad/processor/testdata/write_av_non_null.dmp similarity index 100% rename from spotify/breakpad/processor/testdata/write_av_non_null.dmp rename to archive/spotify/breakpad/processor/testdata/write_av_non_null.dmp diff --git a/spotify/breakpad/processor/tokenize.cc b/archive/spotify/breakpad/processor/tokenize.cc similarity index 100% rename from spotify/breakpad/processor/tokenize.cc rename to archive/spotify/breakpad/processor/tokenize.cc diff --git a/spotify/breakpad/processor/tokenize.h b/archive/spotify/breakpad/processor/tokenize.h similarity index 100% rename from spotify/breakpad/processor/tokenize.h rename to archive/spotify/breakpad/processor/tokenize.h diff --git a/spotify/breakpad/processor/windows_frame_info.h b/archive/spotify/breakpad/processor/windows_frame_info.h similarity index 100% rename from spotify/breakpad/processor/windows_frame_info.h rename to archive/spotify/breakpad/processor/windows_frame_info.h diff --git a/spotify/breakpad/third_party/curl/COPYING b/archive/spotify/breakpad/third_party/curl/COPYING similarity index 100% rename from spotify/breakpad/third_party/curl/COPYING rename to archive/spotify/breakpad/third_party/curl/COPYING diff --git a/spotify/breakpad/third_party/curl/curl.h b/archive/spotify/breakpad/third_party/curl/curl.h similarity index 100% rename from spotify/breakpad/third_party/curl/curl.h rename to archive/spotify/breakpad/third_party/curl/curl.h diff --git a/spotify/breakpad/third_party/curl/curlbuild.h b/archive/spotify/breakpad/third_party/curl/curlbuild.h similarity index 100% rename from spotify/breakpad/third_party/curl/curlbuild.h rename to archive/spotify/breakpad/third_party/curl/curlbuild.h diff --git a/spotify/breakpad/third_party/curl/curlrules.h b/archive/spotify/breakpad/third_party/curl/curlrules.h similarity index 100% rename from spotify/breakpad/third_party/curl/curlrules.h rename to archive/spotify/breakpad/third_party/curl/curlrules.h diff --git a/spotify/breakpad/third_party/curl/curlver.h b/archive/spotify/breakpad/third_party/curl/curlver.h similarity index 100% rename from spotify/breakpad/third_party/curl/curlver.h rename to archive/spotify/breakpad/third_party/curl/curlver.h diff --git a/spotify/breakpad/third_party/curl/easy.h b/archive/spotify/breakpad/third_party/curl/easy.h similarity index 100% rename from spotify/breakpad/third_party/curl/easy.h rename to archive/spotify/breakpad/third_party/curl/easy.h diff --git a/spotify/breakpad/third_party/curl/mprintf.h b/archive/spotify/breakpad/third_party/curl/mprintf.h similarity index 100% rename from spotify/breakpad/third_party/curl/mprintf.h rename to archive/spotify/breakpad/third_party/curl/mprintf.h diff --git a/spotify/breakpad/third_party/curl/multi.h b/archive/spotify/breakpad/third_party/curl/multi.h similarity index 100% rename from spotify/breakpad/third_party/curl/multi.h rename to archive/spotify/breakpad/third_party/curl/multi.h diff --git a/spotify/breakpad/third_party/curl/stdcheaders.h b/archive/spotify/breakpad/third_party/curl/stdcheaders.h similarity index 100% rename from spotify/breakpad/third_party/curl/stdcheaders.h rename to archive/spotify/breakpad/third_party/curl/stdcheaders.h diff --git a/spotify/breakpad/third_party/curl/typecheck-gcc.h b/archive/spotify/breakpad/third_party/curl/typecheck-gcc.h similarity index 100% rename from spotify/breakpad/third_party/curl/typecheck-gcc.h rename to archive/spotify/breakpad/third_party/curl/typecheck-gcc.h diff --git a/spotify/breakpad/third_party/curl/types.h b/archive/spotify/breakpad/third_party/curl/types.h similarity index 100% rename from spotify/breakpad/third_party/curl/types.h rename to archive/spotify/breakpad/third_party/curl/types.h diff --git a/spotify/breakpad/third_party/glog/AUTHORS b/archive/spotify/breakpad/third_party/glog/AUTHORS similarity index 100% rename from spotify/breakpad/third_party/glog/AUTHORS rename to archive/spotify/breakpad/third_party/glog/AUTHORS diff --git a/spotify/breakpad/third_party/glog/COPYING b/archive/spotify/breakpad/third_party/glog/COPYING similarity index 100% rename from spotify/breakpad/third_party/glog/COPYING rename to archive/spotify/breakpad/third_party/glog/COPYING diff --git a/spotify/breakpad/third_party/glog/ChangeLog b/archive/spotify/breakpad/third_party/glog/ChangeLog similarity index 100% rename from spotify/breakpad/third_party/glog/ChangeLog rename to archive/spotify/breakpad/third_party/glog/ChangeLog diff --git a/spotify/breakpad/third_party/glog/INSTALL b/archive/spotify/breakpad/third_party/glog/INSTALL similarity index 100% rename from spotify/breakpad/third_party/glog/INSTALL rename to archive/spotify/breakpad/third_party/glog/INSTALL diff --git a/spotify/breakpad/third_party/glog/NEWS b/archive/spotify/breakpad/third_party/glog/NEWS similarity index 100% rename from spotify/breakpad/third_party/glog/NEWS rename to archive/spotify/breakpad/third_party/glog/NEWS diff --git a/spotify/breakpad/third_party/glog/README b/archive/spotify/breakpad/third_party/glog/README similarity index 100% rename from spotify/breakpad/third_party/glog/README rename to archive/spotify/breakpad/third_party/glog/README diff --git a/spotify/breakpad/third_party/glog/README.windows b/archive/spotify/breakpad/third_party/glog/README.windows similarity index 100% rename from spotify/breakpad/third_party/glog/README.windows rename to archive/spotify/breakpad/third_party/glog/README.windows diff --git a/spotify/breakpad/third_party/glog/aclocal.m4 b/archive/spotify/breakpad/third_party/glog/aclocal.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/aclocal.m4 rename to archive/spotify/breakpad/third_party/glog/aclocal.m4 diff --git a/spotify/breakpad/third_party/glog/compile b/archive/spotify/breakpad/third_party/glog/compile similarity index 100% rename from spotify/breakpad/third_party/glog/compile rename to archive/spotify/breakpad/third_party/glog/compile diff --git a/spotify/breakpad/third_party/glog/config.guess b/archive/spotify/breakpad/third_party/glog/config.guess similarity index 100% rename from spotify/breakpad/third_party/glog/config.guess rename to archive/spotify/breakpad/third_party/glog/config.guess diff --git a/spotify/breakpad/third_party/glog/config.sub b/archive/spotify/breakpad/third_party/glog/config.sub similarity index 100% rename from spotify/breakpad/third_party/glog/config.sub rename to archive/spotify/breakpad/third_party/glog/config.sub diff --git a/spotify/breakpad/third_party/glog/configure b/archive/spotify/breakpad/third_party/glog/configure similarity index 100% rename from spotify/breakpad/third_party/glog/configure rename to archive/spotify/breakpad/third_party/glog/configure diff --git a/spotify/breakpad/third_party/glog/configure.ac b/archive/spotify/breakpad/third_party/glog/configure.ac similarity index 100% rename from spotify/breakpad/third_party/glog/configure.ac rename to archive/spotify/breakpad/third_party/glog/configure.ac diff --git a/spotify/breakpad/third_party/glog/depcomp b/archive/spotify/breakpad/third_party/glog/depcomp similarity index 100% rename from spotify/breakpad/third_party/glog/depcomp rename to archive/spotify/breakpad/third_party/glog/depcomp diff --git a/spotify/breakpad/third_party/glog/doc/designstyle.css b/archive/spotify/breakpad/third_party/glog/doc/designstyle.css similarity index 100% rename from spotify/breakpad/third_party/glog/doc/designstyle.css rename to archive/spotify/breakpad/third_party/glog/doc/designstyle.css diff --git a/spotify/breakpad/third_party/glog/doc/glog.html b/archive/spotify/breakpad/third_party/glog/doc/glog.html similarity index 100% rename from spotify/breakpad/third_party/glog/doc/glog.html rename to archive/spotify/breakpad/third_party/glog/doc/glog.html diff --git a/spotify/breakpad/third_party/glog/google-glog.sln b/archive/spotify/breakpad/third_party/glog/google-glog.sln similarity index 100% rename from spotify/breakpad/third_party/glog/google-glog.sln rename to archive/spotify/breakpad/third_party/glog/google-glog.sln diff --git a/spotify/breakpad/third_party/glog/install-sh b/archive/spotify/breakpad/third_party/glog/install-sh similarity index 100% rename from spotify/breakpad/third_party/glog/install-sh rename to archive/spotify/breakpad/third_party/glog/install-sh diff --git a/spotify/breakpad/third_party/glog/libglog.pc.in b/archive/spotify/breakpad/third_party/glog/libglog.pc.in similarity index 100% rename from spotify/breakpad/third_party/glog/libglog.pc.in rename to archive/spotify/breakpad/third_party/glog/libglog.pc.in diff --git a/spotify/breakpad/third_party/glog/ltmain.sh b/archive/spotify/breakpad/third_party/glog/ltmain.sh similarity index 100% rename from spotify/breakpad/third_party/glog/ltmain.sh rename to archive/spotify/breakpad/third_party/glog/ltmain.sh diff --git a/spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4 b/archive/spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4 rename to archive/spotify/breakpad/third_party/glog/m4/ac_have_attribute.m4 diff --git a/spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 b/archive/spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 rename to archive/spotify/breakpad/third_party/glog/m4/ac_have_builtin_expect.m4 diff --git a/spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 b/archive/spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 rename to archive/spotify/breakpad/third_party/glog/m4/ac_have_sync_val_compare_and_swap.m4 diff --git a/spotify/breakpad/third_party/glog/m4/ac_rwlock.m4 b/archive/spotify/breakpad/third_party/glog/m4/ac_rwlock.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/ac_rwlock.m4 rename to archive/spotify/breakpad/third_party/glog/m4/ac_rwlock.m4 diff --git a/spotify/breakpad/third_party/glog/m4/acx_pthread.m4 b/archive/spotify/breakpad/third_party/glog/m4/acx_pthread.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/acx_pthread.m4 rename to archive/spotify/breakpad/third_party/glog/m4/acx_pthread.m4 diff --git a/spotify/breakpad/third_party/glog/m4/google_namespace.m4 b/archive/spotify/breakpad/third_party/glog/m4/google_namespace.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/google_namespace.m4 rename to archive/spotify/breakpad/third_party/glog/m4/google_namespace.m4 diff --git a/spotify/breakpad/third_party/glog/m4/libtool.m4 b/archive/spotify/breakpad/third_party/glog/m4/libtool.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/libtool.m4 rename to archive/spotify/breakpad/third_party/glog/m4/libtool.m4 diff --git a/spotify/breakpad/third_party/glog/m4/ltoptions.m4 b/archive/spotify/breakpad/third_party/glog/m4/ltoptions.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/ltoptions.m4 rename to archive/spotify/breakpad/third_party/glog/m4/ltoptions.m4 diff --git a/spotify/breakpad/third_party/glog/m4/ltsugar.m4 b/archive/spotify/breakpad/third_party/glog/m4/ltsugar.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/ltsugar.m4 rename to archive/spotify/breakpad/third_party/glog/m4/ltsugar.m4 diff --git a/spotify/breakpad/third_party/glog/m4/ltversion.m4 b/archive/spotify/breakpad/third_party/glog/m4/ltversion.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/ltversion.m4 rename to archive/spotify/breakpad/third_party/glog/m4/ltversion.m4 diff --git a/spotify/breakpad/third_party/glog/m4/lt~obsolete.m4 b/archive/spotify/breakpad/third_party/glog/m4/lt~obsolete.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/lt~obsolete.m4 rename to archive/spotify/breakpad/third_party/glog/m4/lt~obsolete.m4 diff --git a/spotify/breakpad/third_party/glog/m4/namespaces.m4 b/archive/spotify/breakpad/third_party/glog/m4/namespaces.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/namespaces.m4 rename to archive/spotify/breakpad/third_party/glog/m4/namespaces.m4 diff --git a/spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4 b/archive/spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4 rename to archive/spotify/breakpad/third_party/glog/m4/pc_from_ucontext.m4 diff --git a/spotify/breakpad/third_party/glog/m4/stl_namespace.m4 b/archive/spotify/breakpad/third_party/glog/m4/stl_namespace.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/stl_namespace.m4 rename to archive/spotify/breakpad/third_party/glog/m4/stl_namespace.m4 diff --git a/spotify/breakpad/third_party/glog/m4/using_operator.m4 b/archive/spotify/breakpad/third_party/glog/m4/using_operator.m4 similarity index 100% rename from spotify/breakpad/third_party/glog/m4/using_operator.m4 rename to archive/spotify/breakpad/third_party/glog/m4/using_operator.m4 diff --git a/spotify/breakpad/third_party/glog/missing b/archive/spotify/breakpad/third_party/glog/missing similarity index 100% rename from spotify/breakpad/third_party/glog/missing rename to archive/spotify/breakpad/third_party/glog/missing diff --git a/spotify/breakpad/third_party/glog/mkinstalldirs b/archive/spotify/breakpad/third_party/glog/mkinstalldirs similarity index 100% rename from spotify/breakpad/third_party/glog/mkinstalldirs rename to archive/spotify/breakpad/third_party/glog/mkinstalldirs diff --git a/spotify/breakpad/third_party/glog/packages/deb.sh b/archive/spotify/breakpad/third_party/glog/packages/deb.sh similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb.sh rename to archive/spotify/breakpad/third_party/glog/packages/deb.sh diff --git a/spotify/breakpad/third_party/glog/packages/deb/README b/archive/spotify/breakpad/third_party/glog/packages/deb/README similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/README rename to archive/spotify/breakpad/third_party/glog/packages/deb/README diff --git a/spotify/breakpad/third_party/glog/packages/deb/changelog b/archive/spotify/breakpad/third_party/glog/packages/deb/changelog similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/changelog rename to archive/spotify/breakpad/third_party/glog/packages/deb/changelog diff --git a/spotify/breakpad/third_party/glog/packages/deb/compat b/archive/spotify/breakpad/third_party/glog/packages/deb/compat similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/compat rename to archive/spotify/breakpad/third_party/glog/packages/deb/compat diff --git a/spotify/breakpad/third_party/glog/packages/deb/control b/archive/spotify/breakpad/third_party/glog/packages/deb/control similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/control rename to archive/spotify/breakpad/third_party/glog/packages/deb/control diff --git a/spotify/breakpad/third_party/glog/packages/deb/copyright b/archive/spotify/breakpad/third_party/glog/packages/deb/copyright similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/copyright rename to archive/spotify/breakpad/third_party/glog/packages/deb/copyright diff --git a/spotify/breakpad/third_party/glog/packages/deb/docs b/archive/spotify/breakpad/third_party/glog/packages/deb/docs similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/docs rename to archive/spotify/breakpad/third_party/glog/packages/deb/docs diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs b/archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs rename to archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.dirs diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install b/archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install rename to archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog-dev.install diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs b/archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs rename to archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.dirs diff --git a/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install b/archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install rename to archive/spotify/breakpad/third_party/glog/packages/deb/libgoogle-glog0.install diff --git a/spotify/breakpad/third_party/glog/packages/deb/rules b/archive/spotify/breakpad/third_party/glog/packages/deb/rules similarity index 100% rename from spotify/breakpad/third_party/glog/packages/deb/rules rename to archive/spotify/breakpad/third_party/glog/packages/deb/rules diff --git a/spotify/breakpad/third_party/glog/packages/rpm.sh b/archive/spotify/breakpad/third_party/glog/packages/rpm.sh similarity index 100% rename from spotify/breakpad/third_party/glog/packages/rpm.sh rename to archive/spotify/breakpad/third_party/glog/packages/rpm.sh diff --git a/spotify/breakpad/third_party/glog/packages/rpm/rpm.spec b/archive/spotify/breakpad/third_party/glog/packages/rpm/rpm.spec similarity index 100% rename from spotify/breakpad/third_party/glog/packages/rpm/rpm.spec rename to archive/spotify/breakpad/third_party/glog/packages/rpm/rpm.spec diff --git a/spotify/breakpad/third_party/glog/src/base/commandlineflags.h b/archive/spotify/breakpad/third_party/glog/src/base/commandlineflags.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/base/commandlineflags.h rename to archive/spotify/breakpad/third_party/glog/src/base/commandlineflags.h diff --git a/spotify/breakpad/third_party/glog/src/base/googleinit.h b/archive/spotify/breakpad/third_party/glog/src/base/googleinit.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/base/googleinit.h rename to archive/spotify/breakpad/third_party/glog/src/base/googleinit.h diff --git a/spotify/breakpad/third_party/glog/src/base/mutex.h b/archive/spotify/breakpad/third_party/glog/src/base/mutex.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/base/mutex.h rename to archive/spotify/breakpad/third_party/glog/src/base/mutex.h diff --git a/spotify/breakpad/third_party/glog/src/config.h.in b/archive/spotify/breakpad/third_party/glog/src/config.h.in similarity index 100% rename from spotify/breakpad/third_party/glog/src/config.h.in rename to archive/spotify/breakpad/third_party/glog/src/config.h.in diff --git a/spotify/breakpad/third_party/glog/src/config_for_unittests.h b/archive/spotify/breakpad/third_party/glog/src/config_for_unittests.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/config_for_unittests.h rename to archive/spotify/breakpad/third_party/glog/src/config_for_unittests.h diff --git a/spotify/breakpad/third_party/glog/src/demangle.cc b/archive/spotify/breakpad/third_party/glog/src/demangle.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/demangle.cc rename to archive/spotify/breakpad/third_party/glog/src/demangle.cc diff --git a/spotify/breakpad/third_party/glog/src/demangle.h b/archive/spotify/breakpad/third_party/glog/src/demangle.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/demangle.h rename to archive/spotify/breakpad/third_party/glog/src/demangle.h diff --git a/spotify/breakpad/third_party/glog/src/demangle_unittest.cc b/archive/spotify/breakpad/third_party/glog/src/demangle_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/demangle_unittest.cc rename to archive/spotify/breakpad/third_party/glog/src/demangle_unittest.cc diff --git a/spotify/breakpad/third_party/glog/src/demangle_unittest.sh b/archive/spotify/breakpad/third_party/glog/src/demangle_unittest.sh similarity index 100% rename from spotify/breakpad/third_party/glog/src/demangle_unittest.sh rename to archive/spotify/breakpad/third_party/glog/src/demangle_unittest.sh diff --git a/spotify/breakpad/third_party/glog/src/demangle_unittest.txt b/archive/spotify/breakpad/third_party/glog/src/demangle_unittest.txt similarity index 100% rename from spotify/breakpad/third_party/glog/src/demangle_unittest.txt rename to archive/spotify/breakpad/third_party/glog/src/demangle_unittest.txt diff --git a/spotify/breakpad/third_party/glog/src/glog/log_severity.h b/archive/spotify/breakpad/third_party/glog/src/glog/log_severity.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/glog/log_severity.h rename to archive/spotify/breakpad/third_party/glog/src/glog/log_severity.h diff --git a/spotify/breakpad/third_party/glog/src/glog/logging.h.in b/archive/spotify/breakpad/third_party/glog/src/glog/logging.h.in similarity index 100% rename from spotify/breakpad/third_party/glog/src/glog/logging.h.in rename to archive/spotify/breakpad/third_party/glog/src/glog/logging.h.in diff --git a/spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in b/archive/spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in similarity index 100% rename from spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in rename to archive/spotify/breakpad/third_party/glog/src/glog/raw_logging.h.in diff --git a/spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in b/archive/spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in similarity index 100% rename from spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in rename to archive/spotify/breakpad/third_party/glog/src/glog/stl_logging.h.in diff --git a/spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in b/archive/spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in similarity index 100% rename from spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in rename to archive/spotify/breakpad/third_party/glog/src/glog/vlog_is_on.h.in diff --git a/spotify/breakpad/third_party/glog/src/googletest.h b/archive/spotify/breakpad/third_party/glog/src/googletest.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/googletest.h rename to archive/spotify/breakpad/third_party/glog/src/googletest.h diff --git a/spotify/breakpad/third_party/glog/src/logging.cc b/archive/spotify/breakpad/third_party/glog/src/logging.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/logging.cc rename to archive/spotify/breakpad/third_party/glog/src/logging.cc diff --git a/spotify/breakpad/third_party/glog/src/logging_striplog_test.sh b/archive/spotify/breakpad/third_party/glog/src/logging_striplog_test.sh similarity index 100% rename from spotify/breakpad/third_party/glog/src/logging_striplog_test.sh rename to archive/spotify/breakpad/third_party/glog/src/logging_striplog_test.sh diff --git a/spotify/breakpad/third_party/glog/src/logging_striptest10.cc b/archive/spotify/breakpad/third_party/glog/src/logging_striptest10.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/logging_striptest10.cc rename to archive/spotify/breakpad/third_party/glog/src/logging_striptest10.cc diff --git a/spotify/breakpad/third_party/glog/src/logging_striptest2.cc b/archive/spotify/breakpad/third_party/glog/src/logging_striptest2.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/logging_striptest2.cc rename to archive/spotify/breakpad/third_party/glog/src/logging_striptest2.cc diff --git a/spotify/breakpad/third_party/glog/src/logging_striptest_main.cc b/archive/spotify/breakpad/third_party/glog/src/logging_striptest_main.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/logging_striptest_main.cc rename to archive/spotify/breakpad/third_party/glog/src/logging_striptest_main.cc diff --git a/spotify/breakpad/third_party/glog/src/logging_unittest.cc b/archive/spotify/breakpad/third_party/glog/src/logging_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/logging_unittest.cc rename to archive/spotify/breakpad/third_party/glog/src/logging_unittest.cc diff --git a/spotify/breakpad/third_party/glog/src/logging_unittest.err b/archive/spotify/breakpad/third_party/glog/src/logging_unittest.err similarity index 100% rename from spotify/breakpad/third_party/glog/src/logging_unittest.err rename to archive/spotify/breakpad/third_party/glog/src/logging_unittest.err diff --git a/spotify/breakpad/third_party/glog/src/mock-log.h b/archive/spotify/breakpad/third_party/glog/src/mock-log.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/mock-log.h rename to archive/spotify/breakpad/third_party/glog/src/mock-log.h diff --git a/spotify/breakpad/third_party/glog/src/mock-log_test.cc b/archive/spotify/breakpad/third_party/glog/src/mock-log_test.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/mock-log_test.cc rename to archive/spotify/breakpad/third_party/glog/src/mock-log_test.cc diff --git a/spotify/breakpad/third_party/glog/src/raw_logging.cc b/archive/spotify/breakpad/third_party/glog/src/raw_logging.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/raw_logging.cc rename to archive/spotify/breakpad/third_party/glog/src/raw_logging.cc diff --git a/spotify/breakpad/third_party/glog/src/signalhandler.cc b/archive/spotify/breakpad/third_party/glog/src/signalhandler.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/signalhandler.cc rename to archive/spotify/breakpad/third_party/glog/src/signalhandler.cc diff --git a/spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc b/archive/spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc rename to archive/spotify/breakpad/third_party/glog/src/signalhandler_unittest.cc diff --git a/spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh b/archive/spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh similarity index 100% rename from spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh rename to archive/spotify/breakpad/third_party/glog/src/signalhandler_unittest.sh diff --git a/spotify/breakpad/third_party/glog/src/stacktrace.h b/archive/spotify/breakpad/third_party/glog/src/stacktrace.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/stacktrace.h rename to archive/spotify/breakpad/third_party/glog/src/stacktrace.h diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h b/archive/spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h rename to archive/spotify/breakpad/third_party/glog/src/stacktrace_generic-inl.h diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h b/archive/spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h rename to archive/spotify/breakpad/third_party/glog/src/stacktrace_libunwind-inl.h diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h b/archive/spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h rename to archive/spotify/breakpad/third_party/glog/src/stacktrace_powerpc-inl.h diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc b/archive/spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc rename to archive/spotify/breakpad/third_party/glog/src/stacktrace_unittest.cc diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h b/archive/spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h rename to archive/spotify/breakpad/third_party/glog/src/stacktrace_x86-inl.h diff --git a/spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h b/archive/spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h rename to archive/spotify/breakpad/third_party/glog/src/stacktrace_x86_64-inl.h diff --git a/spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc b/archive/spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc rename to archive/spotify/breakpad/third_party/glog/src/stl_logging_unittest.cc diff --git a/spotify/breakpad/third_party/glog/src/symbolize.cc b/archive/spotify/breakpad/third_party/glog/src/symbolize.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/symbolize.cc rename to archive/spotify/breakpad/third_party/glog/src/symbolize.cc diff --git a/spotify/breakpad/third_party/glog/src/symbolize.h b/archive/spotify/breakpad/third_party/glog/src/symbolize.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/symbolize.h rename to archive/spotify/breakpad/third_party/glog/src/symbolize.h diff --git a/spotify/breakpad/third_party/glog/src/symbolize_unittest.cc b/archive/spotify/breakpad/third_party/glog/src/symbolize_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/symbolize_unittest.cc rename to archive/spotify/breakpad/third_party/glog/src/symbolize_unittest.cc diff --git a/spotify/breakpad/third_party/glog/src/utilities.cc b/archive/spotify/breakpad/third_party/glog/src/utilities.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/utilities.cc rename to archive/spotify/breakpad/third_party/glog/src/utilities.cc diff --git a/spotify/breakpad/third_party/glog/src/utilities.h b/archive/spotify/breakpad/third_party/glog/src/utilities.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/utilities.h rename to archive/spotify/breakpad/third_party/glog/src/utilities.h diff --git a/spotify/breakpad/third_party/glog/src/utilities_unittest.cc b/archive/spotify/breakpad/third_party/glog/src/utilities_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/utilities_unittest.cc rename to archive/spotify/breakpad/third_party/glog/src/utilities_unittest.cc diff --git a/spotify/breakpad/third_party/glog/src/vlog_is_on.cc b/archive/spotify/breakpad/third_party/glog/src/vlog_is_on.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/vlog_is_on.cc rename to archive/spotify/breakpad/third_party/glog/src/vlog_is_on.cc diff --git a/spotify/breakpad/third_party/glog/src/windows/config.h b/archive/spotify/breakpad/third_party/glog/src/windows/config.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/config.h rename to archive/spotify/breakpad/third_party/glog/src/windows/config.h diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h b/archive/spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h rename to archive/spotify/breakpad/third_party/glog/src/windows/glog/log_severity.h diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/logging.h b/archive/spotify/breakpad/third_party/glog/src/windows/glog/logging.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/glog/logging.h rename to archive/spotify/breakpad/third_party/glog/src/windows/glog/logging.h diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h b/archive/spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h rename to archive/spotify/breakpad/third_party/glog/src/windows/glog/raw_logging.h diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h b/archive/spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h rename to archive/spotify/breakpad/third_party/glog/src/windows/glog/stl_logging.h diff --git a/spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h b/archive/spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h rename to archive/spotify/breakpad/third_party/glog/src/windows/glog/vlog_is_on.h diff --git a/spotify/breakpad/third_party/glog/src/windows/port.cc b/archive/spotify/breakpad/third_party/glog/src/windows/port.cc similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/port.cc rename to archive/spotify/breakpad/third_party/glog/src/windows/port.cc diff --git a/spotify/breakpad/third_party/glog/src/windows/port.h b/archive/spotify/breakpad/third_party/glog/src/windows/port.h similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/port.h rename to archive/spotify/breakpad/third_party/glog/src/windows/port.h diff --git a/spotify/breakpad/third_party/glog/src/windows/preprocess.sh b/archive/spotify/breakpad/third_party/glog/src/windows/preprocess.sh similarity index 100% rename from spotify/breakpad/third_party/glog/src/windows/preprocess.sh rename to archive/spotify/breakpad/third_party/glog/src/windows/preprocess.sh diff --git a/spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj b/archive/spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj similarity index 100% rename from spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj rename to archive/spotify/breakpad/third_party/glog/vsprojects/libglog/libglog.vcproj diff --git a/spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj b/archive/spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj similarity index 100% rename from spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj rename to archive/spotify/breakpad/third_party/glog/vsprojects/libglog_static/libglog_static.vcproj diff --git a/spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj b/archive/spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj similarity index 100% rename from spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj rename to archive/spotify/breakpad/third_party/glog/vsprojects/logging_unittest/logging_unittest.vcproj diff --git a/spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj b/archive/spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj similarity index 100% rename from spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj rename to archive/spotify/breakpad/third_party/glog/vsprojects/logging_unittest_static/logging_unittest_static.vcproj diff --git a/spotify/breakpad/third_party/libdisasm/TODO b/archive/spotify/breakpad/third_party/libdisasm/TODO similarity index 100% rename from spotify/breakpad/third_party/libdisasm/TODO rename to archive/spotify/breakpad/third_party/libdisasm/TODO diff --git a/spotify/breakpad/third_party/libdisasm/ia32_implicit.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_implicit.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_implicit.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_implicit.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_implicit.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_implicit.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_implicit.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_implicit.h diff --git a/spotify/breakpad/third_party/libdisasm/ia32_insn.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_insn.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_insn.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_insn.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_insn.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_insn.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_insn.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_insn.h diff --git a/spotify/breakpad/third_party/libdisasm/ia32_invariant.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_invariant.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_invariant.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_invariant.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_invariant.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_invariant.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_invariant.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_invariant.h diff --git a/spotify/breakpad/third_party/libdisasm/ia32_modrm.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_modrm.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_modrm.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_modrm.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_modrm.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_modrm.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_modrm.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_modrm.h diff --git a/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_opcode_tables.h diff --git a/spotify/breakpad/third_party/libdisasm/ia32_operand.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_operand.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_operand.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_operand.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_operand.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_operand.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_operand.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_operand.h diff --git a/spotify/breakpad/third_party/libdisasm/ia32_reg.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_reg.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_reg.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_reg.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_reg.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_reg.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_reg.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_reg.h diff --git a/spotify/breakpad/third_party/libdisasm/ia32_settings.c b/archive/spotify/breakpad/third_party/libdisasm/ia32_settings.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_settings.c rename to archive/spotify/breakpad/third_party/libdisasm/ia32_settings.c diff --git a/spotify/breakpad/third_party/libdisasm/ia32_settings.h b/archive/spotify/breakpad/third_party/libdisasm/ia32_settings.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/ia32_settings.h rename to archive/spotify/breakpad/third_party/libdisasm/ia32_settings.h diff --git a/spotify/breakpad/third_party/libdisasm/libdis.h b/archive/spotify/breakpad/third_party/libdisasm/libdis.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/libdis.h rename to archive/spotify/breakpad/third_party/libdisasm/libdis.h diff --git a/spotify/breakpad/third_party/libdisasm/qword.h b/archive/spotify/breakpad/third_party/libdisasm/qword.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/qword.h rename to archive/spotify/breakpad/third_party/libdisasm/qword.h diff --git a/spotify/breakpad/third_party/libdisasm/swig/README b/archive/spotify/breakpad/third_party/libdisasm/swig/README similarity index 100% rename from spotify/breakpad/third_party/libdisasm/swig/README rename to archive/spotify/breakpad/third_party/libdisasm/swig/README diff --git a/spotify/breakpad/third_party/libdisasm/swig/libdisasm.i b/archive/spotify/breakpad/third_party/libdisasm/swig/libdisasm.i similarity index 100% rename from spotify/breakpad/third_party/libdisasm/swig/libdisasm.i rename to archive/spotify/breakpad/third_party/libdisasm/swig/libdisasm.i diff --git a/spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i b/archive/spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i similarity index 100% rename from spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i rename to archive/spotify/breakpad/third_party/libdisasm/swig/libdisasm_oop.i diff --git a/spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb b/archive/spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb similarity index 100% rename from spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb rename to archive/spotify/breakpad/third_party/libdisasm/swig/ruby/extconf.rb diff --git a/spotify/breakpad/third_party/libdisasm/x86_disasm.c b/archive/spotify/breakpad/third_party/libdisasm/x86_disasm.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_disasm.c rename to archive/spotify/breakpad/third_party/libdisasm/x86_disasm.c diff --git a/spotify/breakpad/third_party/libdisasm/x86_format.c b/archive/spotify/breakpad/third_party/libdisasm/x86_format.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_format.c rename to archive/spotify/breakpad/third_party/libdisasm/x86_format.c diff --git a/spotify/breakpad/third_party/libdisasm/x86_imm.c b/archive/spotify/breakpad/third_party/libdisasm/x86_imm.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_imm.c rename to archive/spotify/breakpad/third_party/libdisasm/x86_imm.c diff --git a/spotify/breakpad/third_party/libdisasm/x86_imm.h b/archive/spotify/breakpad/third_party/libdisasm/x86_imm.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_imm.h rename to archive/spotify/breakpad/third_party/libdisasm/x86_imm.h diff --git a/spotify/breakpad/third_party/libdisasm/x86_insn.c b/archive/spotify/breakpad/third_party/libdisasm/x86_insn.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_insn.c rename to archive/spotify/breakpad/third_party/libdisasm/x86_insn.c diff --git a/spotify/breakpad/third_party/libdisasm/x86_misc.c b/archive/spotify/breakpad/third_party/libdisasm/x86_misc.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_misc.c rename to archive/spotify/breakpad/third_party/libdisasm/x86_misc.c diff --git a/spotify/breakpad/third_party/libdisasm/x86_operand_list.c b/archive/spotify/breakpad/third_party/libdisasm/x86_operand_list.c similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_operand_list.c rename to archive/spotify/breakpad/third_party/libdisasm/x86_operand_list.c diff --git a/spotify/breakpad/third_party/libdisasm/x86_operand_list.h b/archive/spotify/breakpad/third_party/libdisasm/x86_operand_list.h similarity index 100% rename from spotify/breakpad/third_party/libdisasm/x86_operand_list.h rename to archive/spotify/breakpad/third_party/libdisasm/x86_operand_list.h diff --git a/spotify/breakpad/third_party/linux/include/gflags/gflags.h b/archive/spotify/breakpad/third_party/linux/include/gflags/gflags.h similarity index 100% rename from spotify/breakpad/third_party/linux/include/gflags/gflags.h rename to archive/spotify/breakpad/third_party/linux/include/gflags/gflags.h diff --git a/spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h b/archive/spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h similarity index 100% rename from spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h rename to archive/spotify/breakpad/third_party/linux/include/gflags/gflags_completions.h diff --git a/spotify/breakpad/third_party/lss/linux_syscall_support.h b/archive/spotify/breakpad/third_party/lss/linux_syscall_support.h similarity index 100% rename from spotify/breakpad/third_party/lss/linux_syscall_support.h rename to archive/spotify/breakpad/third_party/lss/linux_syscall_support.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/CHANGES.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/CONTRIBUTORS.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/COPYING.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/INSTALL.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/README.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/README.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/README.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/README.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/autogen.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/autogen.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/autogen.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/autogen.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/ProtoBench.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message1.dat b/archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message1.dat similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message1.dat rename to archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message1.dat diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message2.dat b/archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message2.dat similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message2.dat rename to archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_message2.dat diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_size.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/google_speed.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/benchmarks/readme.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/configure.ac b/archive/spotify/breakpad/third_party/protobuf/protobuf/configure.ac similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/configure.ac rename to archive/spotify/breakpad/third_party/protobuf/protobuf/configure.ac diff --git a/spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/editors/README.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim b/archive/spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim rename to archive/spotify/breakpad/third_party/protobuf/protobuf/editors/proto.vim diff --git a/spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el b/archive/spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el rename to archive/spotify/breakpad/third_party/protobuf/protobuf/editors/protobuf-mode.el diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/AddPerson.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/ListPeople.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/README.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/add_person.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/addressbook.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/examples/list_people.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/generate_descriptor_proto.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CHANGES diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CMakeLists.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/CONTRIBUTORS diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/COPYING diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/README b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/README similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/README rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/README diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/build-aux/.keep diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.cbproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest.groupproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_all.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_link.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_main.cbproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/codegear/gtest_unittest.cbproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/configure.ac diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-death-test.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-message.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-param-test.h.pump diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-spi.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-test-part.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest-typed-test.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_pred_impl.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/gtest_prod.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-death-test-internal.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-filepath.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-internal.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-linked_ptr.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util-generated.h.pump diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-param-util.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-port.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-string.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-tuple.h.pump diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/include/gtest/internal/gtest-type-util.h.pump diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/acx_pthread.m4 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/m4/gtest.m4 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.sln diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest-md.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.sln diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main-md.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_main.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test-md.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_prod_test.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest-md.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/msvc/gtest_unittest.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/run_tests.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/prime_tables.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample10_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample1_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample2_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3-inl.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample3_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample4_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample5_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample6_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample7_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample8_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/samples/sample9_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/fuse_gtest_files.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gen_gtest_pred_impl.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/gtest-config.in diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/pump.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/scripts/upload_gtest.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-all.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-death-test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-filepath.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-internal-inl.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-port.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-test-part.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest-typed-test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/src/gtest_main.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-death-test_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-filepath_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-linked_ptr_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-listener_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-message_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-options_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test2_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-param-test_test.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-port_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-test-part_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-tuple_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test2_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-typed-test_test.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest-unittest-api_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_all_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_break_on_failure_unittest_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_color_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_env_var_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_environment_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_filter_unittest_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_help_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_list_tests_unittest_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_main_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_nc_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_no_test_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_lin.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_output_test_golden_win.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_pred_impl_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_prod_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_repeat_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_shuffle_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_sole_header_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_stress_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_test_utils.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_ex_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_throw_on_failure_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_uninitialized_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile1_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfile2_test_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_outfiles_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_output_unittest_.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/gtest_xml_test_utils.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/production.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/test/run_tests_util_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/DebugProject.xcconfig diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/FrameworkTarget.xcconfig diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/General.xcconfig diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/ReleaseProject.xcconfig diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/StaticLibraryTarget.xcconfig diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Config/TestTarget.xcconfig diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Resources/Info.plist diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/Info.plist diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/runtests.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Samples/FrameworkSample/widget_test.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/runtests.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/Scripts/versiongenerate.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/gtest/xcode/gtest.xcodeproj/project.pbxproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/README.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/README.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/README.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/README.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/pom.xml diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ByteString.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Internal.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Message.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcController.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/Service.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 b/archive/spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 rename to archive/spotify/breakpad/third_party/protobuf/protobuf/m4/ac_system_extensions.m4 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 b/archive/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 rename to archive/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_check_suncc.m4 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 b/archive/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 rename to archive/spotify/breakpad/third_party/protobuf/protobuf/m4/acx_pthread.m4 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 b/archive/spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 rename to archive/spotify/breakpad/third_party/protobuf/protobuf/m4/stl_hash.m4 diff --git a/spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/post_process_dist.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in b/archive/spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in rename to archive/spotify/breakpad/third_party/protobuf/protobuf/protobuf-lite.pc.in diff --git a/spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in b/archive/spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in rename to archive/spotify/breakpad/third_party/protobuf/protobuf/protobuf.pc.in diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/README.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/README.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/README.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/README.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/ez_setup.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/__init__.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/__init__.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/descriptor.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/__init__.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/api_implementation.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/containers.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/cpp_message.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/decoder.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/descriptor_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/encoder.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/generator_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/generator_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/generator_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/generator_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_listener.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/message_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_extensions.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/more_messages.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/python_message.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/reflection_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/service_reflection_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/service_reflection_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/service_reflection_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/service_reflection_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/test_util.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/test_util.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/test_util.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/test_util.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/text_format_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/text_format_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/text_format_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/text_format_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/type_checkers.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/internal/wire_format_test.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/message.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python-proto2.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_descriptor.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/pyext/python_protobuf.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/reflection.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/service_reflection.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/google/protobuf/text_format.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/mox.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/mox.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/mox.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/mox.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/setup.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/setup.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/setup.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/setup.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py b/archive/spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py rename to archive/spotify/breakpad/third_party/protobuf/protobuf/python/stubout.py diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/SEBS diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/code_generator.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/importer_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_enum_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_extension.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_file.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_generator.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_helpers.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_message_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_service.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/java/java_string_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/main.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/mock_code_generator.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/package_info.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/parser_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.pb.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/plugin.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_generator.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/subprocess.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/test_plugin.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/compiler/zip_writer.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.pb.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_database_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/descriptor_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/dynamic_message_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_heavy.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/extension_set_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/generated_message_util.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_inl.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/coded_stream_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/package_info.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/printer_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/tokenizer_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/lite_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_lite.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/message_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/package_info.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/reflection_ops_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/repeated_field_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/service.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/common_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/hash.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/map-util.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/once_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/stl_util-inl.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/strutil_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/stubs/substitute.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/test_util_lite.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_message b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_message similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_message rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_message diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_packed_fields_message b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_packed_fields_message similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_packed_fields_message rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/golden_packed_fields_message diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/file.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/googletest.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgunzip.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/testing/zcgzip.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/text_format_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_custom_options.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_empty.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_import_lite.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_mset.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_no_generic_services.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unittest_optimize_for.proto diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/unknown_field_set_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_lite_inl.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/google/protobuf/wire_format_unittest.cc diff --git a/spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la b/archive/spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la rename to archive/spotify/breakpad/third_party/protobuf/protobuf/src/solaris/libstdc++.la diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/config.h diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/convert2008to2005.sh diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/extract_includes.bat diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf-lite.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotobuf.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/libprotoc.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/lite-test.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protobuf.sln diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/protoc.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/readme.txt diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/test_plugin.vcproj diff --git a/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj b/archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj similarity index 100% rename from spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj rename to archive/spotify/breakpad/third_party/protobuf/protobuf/vsprojects/tests.vcproj diff --git a/spotify/callbacks.h b/archive/spotify/callbacks.h similarity index 100% rename from spotify/callbacks.h rename to archive/spotify/callbacks.h diff --git a/spotify/cmake/FindQJSON.cmake b/archive/spotify/cmake/FindQJSON.cmake similarity index 100% rename from spotify/cmake/FindQJSON.cmake rename to archive/spotify/cmake/FindQJSON.cmake diff --git a/spotify/cmake/Findlibspotify.cmake b/archive/spotify/cmake/Findlibspotify.cmake similarity index 100% rename from spotify/cmake/Findlibspotify.cmake rename to archive/spotify/cmake/Findlibspotify.cmake diff --git a/spotify/consolewatcher.cpp b/archive/spotify/consolewatcher.cpp similarity index 100% rename from spotify/consolewatcher.cpp rename to archive/spotify/consolewatcher.cpp diff --git a/spotify/consolewatcher.h b/archive/spotify/consolewatcher.h similarity index 100% rename from spotify/consolewatcher.h rename to archive/spotify/consolewatcher.h diff --git a/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp b/archive/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp similarity index 100% rename from spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp rename to archive/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.cpp diff --git a/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.h b/archive/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.h similarity index 100% rename from spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.h rename to archive/spotify/kdsingleapplicationguard/kdlockedsharedmemorypointer.h diff --git a/spotify/kdsingleapplicationguard/kdsharedmemorylocker.cpp b/archive/spotify/kdsingleapplicationguard/kdsharedmemorylocker.cpp similarity index 100% rename from spotify/kdsingleapplicationguard/kdsharedmemorylocker.cpp rename to archive/spotify/kdsingleapplicationguard/kdsharedmemorylocker.cpp diff --git a/spotify/kdsingleapplicationguard/kdsharedmemorylocker.h b/archive/spotify/kdsingleapplicationguard/kdsharedmemorylocker.h similarity index 100% rename from spotify/kdsingleapplicationguard/kdsharedmemorylocker.h rename to archive/spotify/kdsingleapplicationguard/kdsharedmemorylocker.h diff --git a/spotify/kdsingleapplicationguard/kdsingleapplicationguard.cpp b/archive/spotify/kdsingleapplicationguard/kdsingleapplicationguard.cpp similarity index 100% rename from spotify/kdsingleapplicationguard/kdsingleapplicationguard.cpp rename to archive/spotify/kdsingleapplicationguard/kdsingleapplicationguard.cpp diff --git a/spotify/kdsingleapplicationguard/kdsingleapplicationguard.h b/archive/spotify/kdsingleapplicationguard/kdsingleapplicationguard.h similarity index 100% rename from spotify/kdsingleapplicationguard/kdsingleapplicationguard.h rename to archive/spotify/kdsingleapplicationguard/kdsingleapplicationguard.h diff --git a/spotify/kdsingleapplicationguard/kdtoolsglobal.cpp b/archive/spotify/kdsingleapplicationguard/kdtoolsglobal.cpp similarity index 100% rename from spotify/kdsingleapplicationguard/kdtoolsglobal.cpp rename to archive/spotify/kdsingleapplicationguard/kdtoolsglobal.cpp diff --git a/spotify/kdsingleapplicationguard/kdtoolsglobal.h b/archive/spotify/kdsingleapplicationguard/kdtoolsglobal.h similarity index 100% rename from spotify/kdsingleapplicationguard/kdtoolsglobal.h rename to archive/spotify/kdsingleapplicationguard/kdtoolsglobal.h diff --git a/spotify/kdsingleapplicationguard/license-gpl b/archive/spotify/kdsingleapplicationguard/license-gpl similarity index 100% rename from spotify/kdsingleapplicationguard/license-gpl rename to archive/spotify/kdsingleapplicationguard/license-gpl diff --git a/spotify/kdsingleapplicationguard/pimpl_ptr.cpp b/archive/spotify/kdsingleapplicationguard/pimpl_ptr.cpp similarity index 100% rename from spotify/kdsingleapplicationguard/pimpl_ptr.cpp rename to archive/spotify/kdsingleapplicationguard/pimpl_ptr.cpp diff --git a/spotify/kdsingleapplicationguard/pimpl_ptr.h b/archive/spotify/kdsingleapplicationguard/pimpl_ptr.h similarity index 100% rename from spotify/kdsingleapplicationguard/pimpl_ptr.h rename to archive/spotify/kdsingleapplicationguard/pimpl_ptr.h diff --git a/spotify/logger.cpp b/archive/spotify/logger.cpp similarity index 100% rename from spotify/logger.cpp rename to archive/spotify/logger.cpp diff --git a/spotify/logger.h b/archive/spotify/logger.h similarity index 100% rename from spotify/logger.h rename to archive/spotify/logger.h diff --git a/spotify/main.cpp b/archive/spotify/main.cpp similarity index 100% rename from spotify/main.cpp rename to archive/spotify/main.cpp diff --git a/spotify/main.h b/archive/spotify/main.h similarity index 100% rename from spotify/main.h rename to archive/spotify/main.h diff --git a/spotify/qxtweb-standalone/CMakeLists.txt b/archive/spotify/qxtweb-standalone/CMakeLists.txt similarity index 100% rename from spotify/qxtweb-standalone/CMakeLists.txt rename to archive/spotify/qxtweb-standalone/CMakeLists.txt diff --git a/spotify/qxtweb-standalone/README.txt b/archive/spotify/qxtweb-standalone/README.txt similarity index 100% rename from spotify/qxtweb-standalone/README.txt rename to archive/spotify/qxtweb-standalone/README.txt diff --git a/spotify/qxtweb-standalone/qxtweb/QxtAbstractHttpConnector b/archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractHttpConnector similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtAbstractHttpConnector rename to archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractHttpConnector diff --git a/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebService b/archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebService similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtAbstractWebService rename to archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebService diff --git a/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebSessionManager b/archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebSessionManager similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtAbstractWebSessionManager rename to archive/spotify/qxtweb-standalone/qxtweb/QxtAbstractWebSessionManager diff --git a/spotify/qxtweb-standalone/qxtweb/QxtHtmlTemplate b/archive/spotify/qxtweb-standalone/qxtweb/QxtHtmlTemplate similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtHtmlTemplate rename to archive/spotify/qxtweb-standalone/qxtweb/QxtHtmlTemplate diff --git a/spotify/qxtweb-standalone/qxtweb/QxtHttpServerConnector b/archive/spotify/qxtweb-standalone/qxtweb/QxtHttpServerConnector similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtHttpServerConnector rename to archive/spotify/qxtweb-standalone/qxtweb/QxtHttpServerConnector diff --git a/spotify/qxtweb-standalone/qxtweb/QxtHttpSessionManager b/archive/spotify/qxtweb-standalone/qxtweb/QxtHttpSessionManager similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtHttpSessionManager rename to archive/spotify/qxtweb-standalone/qxtweb/QxtHttpSessionManager diff --git a/spotify/qxtweb-standalone/qxtweb/QxtMail b/archive/spotify/qxtweb-standalone/qxtweb/QxtMail similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtMail rename to archive/spotify/qxtweb-standalone/qxtweb/QxtMail diff --git a/spotify/qxtweb-standalone/qxtweb/QxtScgiServerConnector b/archive/spotify/qxtweb-standalone/qxtweb/QxtScgiServerConnector similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtScgiServerConnector rename to archive/spotify/qxtweb-standalone/qxtweb/QxtScgiServerConnector diff --git a/spotify/qxtweb-standalone/qxtweb/QxtSendmail b/archive/spotify/qxtweb-standalone/qxtweb/QxtSendmail similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtSendmail rename to archive/spotify/qxtweb-standalone/qxtweb/QxtSendmail diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWeb b/archive/spotify/qxtweb-standalone/qxtweb/QxtWeb similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWeb rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWeb diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebCgiService b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebCgiService similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebCgiService rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebCgiService diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebContent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebContent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebContent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebContent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebErrorEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebErrorEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebErrorEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebErrorEvent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebEvent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebFileUploadEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebFileUploadEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebFileUploadEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebFileUploadEvent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebPageEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebPageEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebPageEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebPageEvent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebRedirectEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebRedirectEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebRedirectEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebRedirectEvent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebRemoveCookieEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebRemoveCookieEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebRemoveCookieEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebRemoveCookieEvent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebRequestEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebRequestEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebRequestEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebRequestEvent diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebServiceDirectory b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebServiceDirectory similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebServiceDirectory rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebServiceDirectory diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebSlotService b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebSlotService similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebSlotService rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebSlotService diff --git a/spotify/qxtweb-standalone/qxtweb/QxtWebStoreCookieEvent b/archive/spotify/qxtweb-standalone/qxtweb/QxtWebStoreCookieEvent similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/QxtWebStoreCookieEvent rename to archive/spotify/qxtweb-standalone/qxtweb/QxtWebStoreCookieEvent diff --git a/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtabstracthttpconnector.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebservice.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager_p.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager_p.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager_p.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtabstractwebsessionmanager_p.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtboundcfunction.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtboundcfunction.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtboundcfunction.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtboundcfunction.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtboundfunction.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtboundfunction.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtboundfunction.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtboundfunction.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtboundfunctionbase.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtboundfunctionbase.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtboundfunctionbase.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtboundfunctionbase.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtglobal.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtglobal.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtglobal.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtglobal.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtglobal.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtglobal.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtglobal.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtglobal.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.h b/archive/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxthtmltemplate.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxthttpserverconnector.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxthttpserverconnector.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxthttpserverconnector.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxthttpserverconnector.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.h b/archive/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxthttpsessionmanager.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtmetaobject.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtmetaobject.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtmetaobject.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtmetatype.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtmetatype.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtmetatype.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtmetatype.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtnull.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtnull.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtnull.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtnull.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtnull.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtnull.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtnull.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtnull.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtnullable.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtnullable.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtnullable.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtnullable.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtscgiserverconnector.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtscgiserverconnector.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtscgiserverconnector.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtscgiserverconnector.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtweb.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtweb.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtweb.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtweb.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice_p.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice_p.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice_p.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebcgiservice_p.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebcontent.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebcontent.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebcontent.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebevent.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebevent.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebevent.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebevent.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebevent.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebevent.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebevent.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebevent.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory_p.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory_p.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory_p.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebservicedirectory_p.h diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.cpp b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.cpp similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.cpp rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.cpp diff --git a/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.h b/archive/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.h similarity index 100% rename from spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.h rename to archive/spotify/qxtweb-standalone/qxtweb/qxtwebslotservice.h diff --git a/spotify/spotify-sourceicon.png b/archive/spotify/spotify-sourceicon.png similarity index 100% rename from spotify/spotify-sourceicon.png rename to archive/spotify/spotify-sourceicon.png diff --git a/spotify/spotify.desktop b/archive/spotify/spotify.desktop similarity index 100% rename from spotify/spotify.desktop rename to archive/spotify/spotify.desktop diff --git a/spotify/spotify_key.h b/archive/spotify/spotify_key.h similarity index 100% rename from spotify/spotify_key.h rename to archive/spotify/spotify_key.h diff --git a/spotify/spotifyiodevice.cpp b/archive/spotify/spotifyiodevice.cpp similarity index 100% rename from spotify/spotifyiodevice.cpp rename to archive/spotify/spotifyiodevice.cpp diff --git a/spotify/spotifyiodevice.h b/archive/spotify/spotifyiodevice.h similarity index 100% rename from spotify/spotifyiodevice.h rename to archive/spotify/spotifyiodevice.h diff --git a/spotify/spotifyloghandler.cpp b/archive/spotify/spotifyloghandler.cpp similarity index 100% rename from spotify/spotifyloghandler.cpp rename to archive/spotify/spotifyloghandler.cpp diff --git a/spotify/spotifyloghandler.h b/archive/spotify/spotifyloghandler.h similarity index 100% rename from spotify/spotifyloghandler.h rename to archive/spotify/spotifyloghandler.h diff --git a/spotify/spotifyplayback.cpp b/archive/spotify/spotifyplayback.cpp similarity index 100% rename from spotify/spotifyplayback.cpp rename to archive/spotify/spotifyplayback.cpp diff --git a/spotify/spotifyplayback.h b/archive/spotify/spotifyplayback.h similarity index 100% rename from spotify/spotifyplayback.h rename to archive/spotify/spotifyplayback.h diff --git a/spotify/spotifyplaylists.cpp b/archive/spotify/spotifyplaylists.cpp similarity index 100% rename from spotify/spotifyplaylists.cpp rename to archive/spotify/spotifyplaylists.cpp diff --git a/spotify/spotifyplaylists.h b/archive/spotify/spotifyplaylists.h similarity index 100% rename from spotify/spotifyplaylists.h rename to archive/spotify/spotifyplaylists.h diff --git a/spotify/spotifyresolver.cpp b/archive/spotify/spotifyresolver.cpp similarity index 100% rename from spotify/spotifyresolver.cpp rename to archive/spotify/spotifyresolver.cpp diff --git a/spotify/spotifyresolver.h b/archive/spotify/spotifyresolver.h similarity index 100% rename from spotify/spotifyresolver.h rename to archive/spotify/spotifyresolver.h diff --git a/spotify/spotifysearch.cpp b/archive/spotify/spotifysearch.cpp similarity index 100% rename from spotify/spotifysearch.cpp rename to archive/spotify/spotifysearch.cpp diff --git a/spotify/spotifysearch.h b/archive/spotify/spotifysearch.h similarity index 100% rename from spotify/spotifysearch.h rename to archive/spotify/spotifysearch.h diff --git a/spotify/spotifysession.cpp b/archive/spotify/spotifysession.cpp similarity index 100% rename from spotify/spotifysession.cpp rename to archive/spotify/spotifysession.cpp diff --git a/spotify/spotifysession.h b/archive/spotify/spotifysession.h similarity index 100% rename from spotify/spotifysession.h rename to archive/spotify/spotifysession.h diff --git a/spotify/tomahawkspotify.kdev4 b/archive/spotify/tomahawkspotify.kdev4 similarity index 100% rename from spotify/tomahawkspotify.kdev4 rename to archive/spotify/tomahawkspotify.kdev4 From e063b44e8ebf3801dad17c1321f0ea1c3681a074 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 28 Oct 2014 00:06:31 +0100 Subject: [PATCH 339/597] Fix spelling mistake --- tools/{urllookp.js => urllookup.js} | 1 - 1 file changed, 1 deletion(-) rename tools/{urllookp.js => urllookup.js} (99%) diff --git a/tools/urllookp.js b/tools/urllookup.js similarity index 99% rename from tools/urllookp.js rename to tools/urllookup.js index 0e7f3340e..168dfeb94 100644 --- a/tools/urllookp.js +++ b/tools/urllookup.js @@ -37,4 +37,3 @@ utils.loadAxe(resolverPath, resolver, function () { } } }, resolverConfig); - From badd714c76cb042ed70acd05e8f8fe11c8d09d51 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 28 Oct 2014 00:17:45 +0100 Subject: [PATCH 340/597] [spotify] Add skeleton for new resolver --- spotify/LICENSE | 20 ++++ spotify/content/contents/code/config.ui | 71 ++++++++++++++ spotify/content/contents/code/spotify.js | 107 ++++++++++++++++++++++ spotify/content/contents/code/spotify.png | Bin 0 -> 329934 bytes spotify/content/contents/images/icon.png | Bin 0 -> 329934 bytes spotify/content/metadata.json | 19 ++++ 6 files changed, 217 insertions(+) create mode 100644 spotify/LICENSE create mode 100644 spotify/content/contents/code/config.ui create mode 100644 spotify/content/contents/code/spotify.js create mode 100644 spotify/content/contents/code/spotify.png create mode 100644 spotify/content/contents/images/icon.png create mode 100644 spotify/content/metadata.json diff --git a/spotify/LICENSE b/spotify/LICENSE new file mode 100644 index 000000000..1ef4329d1 --- /dev/null +++ b/spotify/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Uwe L. Korn + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/spotify/content/contents/code/config.ui b/spotify/content/contents/code/config.ui new file mode 100644 index 000000000..120790cb6 --- /dev/null +++ b/spotify/content/contents/code/config.ui @@ -0,0 +1,71 @@ + + + Form + + + + 0 + 0 + 536 + 174 + + + + Form + + + + + + + 0 + 0 + + + + spotify.png + + + + + + + QFormLayout::ExpandingFieldsGrow + + + + + Username: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + Password: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + QLineEdit::Password + + + + + + + + + + diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js new file mode 100644 index 000000000..e6ffacf4a --- /dev/null +++ b/spotify/content/contents/code/spotify.js @@ -0,0 +1,107 @@ +/* + * Copyright 2014, Uwe L. Korn + * + * The MIT License (MIT) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { + settings: { + name: 'Spotify', + icon: 'spotify.png', + weight: 95, + timeout: 15 + }, + + getConfigUi: function () { + var uiData = Tomahawk.readBase64("config.ui"); + return { + "widget": uiData, + fields: [{ + name: "user", + widget: "user_edit", + property: "text" + }, { + name: "password", + widget: "password_edit", + property: "text" + }], + images: [{ + "spotify.png" : Tomahawk.readBase64("spotify.png") + }] + }; + }, + + newConfigSaved: function () { + var userConfig = this.getUserConfig(); + + if (this.user !== userConfig.user || this.password !== userConfig.password) { + this.init(); + } + }, + + + login: function(callback) { + var userConfig = this.getUserConfig(); + if (!userConfig.user || !userConfig.password) { + Tomahawk.log("Spotify Resolver not properly configured!"); + this.loggedIn = false; + if (callback) { + callback("Spotify Resolver not properly configured!"); + } + return; + } + + this.user = userConfig.user; + this.password = userConfig.password; + + // TODO + + }, + + spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, + + init: function(cb) { + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + + // re-login every 50 minutes + setInterval((function(self) { return function() { self.login(); }; })(this), 1000*60*50); + + this.login(cb); + }, + + resolve: function (qid, artist, album, title) { + // TODO + }, + + search: function (qid, searchString) { + // TODO + }, + + canParseUrl: function (url, type) { + // TODO + }, + + lookupUrl: function (url) { + // TODO + } +}); + +Tomahawk.resolver.instance = SpotifyResolver; + diff --git a/spotify/content/contents/code/spotify.png b/spotify/content/contents/code/spotify.png new file mode 100644 index 0000000000000000000000000000000000000000..d426d24acc9ec6da3bd13d6208a2fc320aa9898c GIT binary patch literal 329934 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�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 z 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⋘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 literal 0 HcmV?d00001 diff --git a/spotify/content/contents/images/icon.png b/spotify/content/contents/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d426d24acc9ec6da3bd13d6208a2fc320aa9898c GIT binary patch literal 329934 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�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 z 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⋘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 literal 0 HcmV?d00001 diff --git a/spotify/content/metadata.json b/spotify/content/metadata.json new file mode 100644 index 000000000..664b53f0f --- /dev/null +++ b/spotify/content/metadata.json @@ -0,0 +1,19 @@ +{ + "name": "Spotify", + "pluginName": "spotify", + "author": "Uwe L. Korn", + "email": "uwelk@xhochy.com", + "version": "0.1.0", + "website": "http://gettomahawk.com", + "description": "Stream music from Spotify.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/spotify.js", + "icon": "contents/images/icon.png", + "scripts": [], + "resources": [ + "contents/code/config.ui", + "contents/code/spotify.png" + ] + } +} From da903986f919829dc6399561eef76432c18ee93d Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Tue, 28 Oct 2014 19:02:48 +0100 Subject: [PATCH 341/597] [authproxy] Remove Beats HTML --- beatsmusic/authproxy/ZeroClipboard.swf | Bin 1635 -> 0 bytes beatsmusic/authproxy/app.yaml | 10 - beatsmusic/authproxy/authproxy.go | 54 - beatsmusic/authproxy/jquery.clipboard.swf | Bin 1923 -> 0 bytes beatsmusic/authproxy/js/jquery.clipboard.js | 1110 ------------------- beatsmusic/authproxy/js/jquery.zclip.min.js | 12 - 6 files changed, 1186 deletions(-) delete mode 100644 beatsmusic/authproxy/ZeroClipboard.swf delete mode 100644 beatsmusic/authproxy/jquery.clipboard.swf delete mode 100644 beatsmusic/authproxy/js/jquery.clipboard.js delete mode 100644 beatsmusic/authproxy/js/jquery.zclip.min.js diff --git a/beatsmusic/authproxy/ZeroClipboard.swf b/beatsmusic/authproxy/ZeroClipboard.swf deleted file mode 100644 index 880e64ee7614e224660c6616b4bbb1ee5fab8ec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1635 zcmV-p2AugrS5prD2><|i+I>}9Z`;@rK0}c_ByHJ}?I?+JQ#Rf>o5+@IXOp$p(Z-Ri zjT772`m$RD392LV(Bg(7Rg&_hFAWOxAN0NGOaDNhi~fKD1)ZSidmk2k>@TQ0hg5vo zE=owlnQtyU^UY8?B=SEA8Tlh2SAf*>R|z4%9{(#4vK(0U(pJ4uJnXt&xP;b|=}r{& zmdfRWgM-h(sVY9a1 zkDg3V52{+`Y0+LkaFddjS>`V9axV(YbF*_;$TF8~Kj^Zk%6dK5F_|b=KAZ_VzWMfm z?eiJiWnpKzd=@BjA}4Zrb;a`Ayx4I0Vew&c#`g_=pL=%e=il+vC;M&BS+V zCud|4ufAYjaqe-cIA57tNRJ`VEz_(m65>-tN4}GKfEHz z_4|MSZfzMS{x{{yPu=Wy+dRl#cw9CuVL4&XWk>3E zFK{BRw);`!dzy(+JNz&*x}r4Zm~Zt&ZSM0xOSOKKLUrVoCfaUK>+*=zS;T0_BT*oW z_vg&BYW*Pe1A%Tkzv4<5A;;3ry24y%&!e8dZ8DeZp^zKC#f^2JSv*+tY+nw1KQi1? z+vqXDPQ-&S8wLF^;#S@7GRM0;SfjHQTG?JG&sQps%I&`6Mvga>w%m^#H=MZ8{!-fh z)J3qK-cwF%KE7&>$AeoJgVsDe3Ns^TpQnM>{!fwX=jXPRj7<1hWa7dOh8iAWPhD-B zn|(af5xiEgfD=itU(4V7*aUN3{~&GINXI1@%Od}0L~DBi>vbG6)Z2W|@fwcn8VTp$ zIabseO4R4v+3Q4_6|jRXJQ|Lo*I^p7tXju$Ev2@;R(qL4GdbnDgNMTAjg98+_UbR1 z->z=y19f+20M?t|ZEC5y`_0Ip(?ev(V{U$Rpd@tJ%;ZDjN!Ux9nQsdhHZ!44P$G+| z%eWJ+x}A_RjQevMrs0TtE-r!`iABTLl5O!{_PN-Il*(^$NAT4guCX3#JIJBKL%N@W zDs!Wk{D_)S;No2iJB}>?9=&g< zDkD@GrAm$}d8&+2Wt_qUg-a9)6fRS^O5qyKT&Hk@!c7Xd^divQXZi!sXMn;ig))T- zg*giI6c#8vr0_X~M-(1Y_=3VBg(V7KQdp+&gyz4Z@RUN0=IRtysrGYH#4?@bEdQ0Zqhvqdx8G_y1O@y825`e`9$qzuudG)5LeK@e2+V|?A`Jt{WP!*dK$KA+Y7Pj^1JTBS=;I&)F^tMUhOwfiXX47&2q}_o z`~Yz!UL&oE(iL_IV-xg6V9?5mB-U{Aiw{QcOzHa12`>pCi>`;8k=Dm89G^A^N! zv=^4gKlNo5}D1^E12w0geG*f|H4sc!7VmEvzrxwO`LWIx`8cbR`2 zi(z~?w!dJDD3{omD3{rjDPk(`e`Bh-aYFRA+E#92+K0CMzAf8TR-IRs{0}E5nyM)u zp5yLF_)v&NUi0)~{)jnM({70UPQDZ)b%ZqJ>#!bvMrX{}UR&nm52 hrB$!AH2nOW+(@nt#n7>F@%Mf4Z~ZAE{{=lE$MA>_KQRCR diff --git a/beatsmusic/authproxy/app.yaml b/beatsmusic/authproxy/app.yaml index 11bf83413..0bee25007 100644 --- a/beatsmusic/authproxy/app.yaml +++ b/beatsmusic/authproxy/app.yaml @@ -8,15 +8,5 @@ handlers: static_files: index.html upload: index\.html -- url: /js - static_dir: js - -- url: /jquery\.clipboard\.swf - static_files: jquery.clipboard.swf - upload: jquery\.clipboard\.swf - -- url: /callback - script: _go_app - - url: /json script: _go_app diff --git a/beatsmusic/authproxy/authproxy.go b/beatsmusic/authproxy/authproxy.go index 8726bbfad..4b63eca65 100644 --- a/beatsmusic/authproxy/authproxy.go +++ b/beatsmusic/authproxy/authproxy.go @@ -1,67 +1,13 @@ package authproxy import ( - "html/template" "net/http" ) func init() { http.HandleFunc("/json", jsonHandler) - http.HandleFunc("/callback", handler) } -const tokenTemplateHTML = ` - - - - - - Tomahawk Beats Login - - -

- - - - - -` - -var tokenTemplate = template.Must(template.New("name").Parse(tokenTemplateHTML)) - -func handler(w http.ResponseWriter, r *http.Request) { - err := tokenTemplate.Execute(w, r.FormValue("access_token")) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - } -} func jsonHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") diff --git a/beatsmusic/authproxy/jquery.clipboard.swf b/beatsmusic/authproxy/jquery.clipboard.swf deleted file mode 100644 index ed962a56d1173f1cef99d0c2a61e21f9aabae46e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1923 zcmV-}2YmQLS5pqQ3jhFk+I?1AbJN-t-dmQmCHWHDNlXYg1A$ynVmsk*4k6?ad?A4Z z(>Q@s%EjCAmaT&#xsseqFH`2s^e6P4zVxYY{Q>;}o#`lH+P?Rp)BcIlCD}Of>1jRj z(psOswf4G6@gd^>j!@!v2u)yAN}Wdt{c7}27@-xXsV{GrD%rz5({h)=xFZ-o7x~~r|Xzu$flNKCfj3{=jI9v1qjsCmUY|Nquwg*bWB5|LAc!EyxX?5cL#Kz z&Fdz0+bg+KV&LN$p2=3%ns$R_D<(V4-p;O_`iJZuB_KCX6J0%1CJnq7GFeg5AT)gMmG~A9!kHlKX zF+3(Vx}IlSk_N0DcIYYJx?3;?lWjDWy&yQaYwzSxt?n~N>S<=e+_5k2aR2@PC3_JiCg^;TD$q ztziz)JjaAICAV$pLB7J8 zJ5qZ49-I`1tv%gSspZg4+t6IO!60PCFij=Q^@Y*&+R;#5XGW{-Nlk|yY(xD}LZ?k7 z+H4lvhS?N~n;XR^Nif4!Y#NXtbXeJ{?$*k0tIx~Za$nuu>4T-}i>Fdg-F=qmxAPDR zw5XXX_myxaI_ya_I0-6hQ0*Nbv_-7-wgeur!FEcpX&n=q#CyTB2=6Ys4O`8EZV3lL zEn+(?gNKfrBj1}^d}zR_|5}I44{uRAgEM?anUDn}O=YG9bPi{3P0Ew%|L=5iStnBEeUQc!Q7`f@cYyljktO1-SrnQC`Fs;JQTcZG!I*{1u7Z zC3uv3=Brp<3Fd|8eq!dPS8Y5*Cqv#k$F~pCH z7@x-(k;CX*DuO3cJcr|$z|Q(Ws+MDvV)v<{CxJ;8n520U(he^;`iL&j?-y`J|63r=w*;sXcpvE zdTk16!pV1fk&Zio%xGPr$g@FxvkzfP|&ibCoipFT;VBz%O}5g{TgA2`1!p2yWMaHvh8 zx%v(L4t&3?e#HZn!}RX!Wl*Zi0izz#@A-PHy2AC0`@S9@7^}XX7#Lss`pCd|;Oj{+ z>TBw_ucxaI18vOLQ#~!?>!YCg>T^i8GJ&dN988BNoUF|G`FhdUm1+t5>W_n3)R!Ou zfr@s4%mLX~aa#cofd`MIpZC>dz^qK*UL9e=@|C1~Ep5 zaG3*~0Dc^%paiB2rY;}TB>~^(Xnd1b^S4OW~(YfSMi+es&H29D4xB Je*oi0MM?K&#aaLW diff --git a/beatsmusic/authproxy/js/jquery.clipboard.js b/beatsmusic/authproxy/js/jquery.clipboard.js deleted file mode 100644 index 16fbb5315..000000000 --- a/beatsmusic/authproxy/js/jquery.clipboard.js +++ /dev/null @@ -1,1110 +0,0 @@ -/* - * jQuery Clipboard :: Fork of zClip :: Uses ZeroClipboard v1.3.2 - * - * https://github.com/valeriansaliou/jquery.clipboard - * http://www.steamdev.com/zclip/ - * - * Copyright 2014, Valerian Saliou - * Copyright 2011, SteamDev - * - * Released under the MIT license. - * http://www.opensource.org/licenses/mit-license.php - * - * Version: v1.3 - * Date: Sat Mar 1, 2014 - */ - -/* Component: jQuery Clipboard */ -(function ($) { - var $clip = null; - var $is_loaded = false; - - $.fn.clipboard = function (params) { - if ((typeof params == 'object' && !params.length) || (typeof params == 'undefined')) { - var settings = $.extend({ - path: 'jquery.clipboard.swf', - copy: null, - beforeCopy: null, - afterCopy: null, - clickAfter: true - }, (params || {})); - - return this.each(function () { - var o = $(this); - - if (o.is(':visible') && (typeof settings.copy == 'string' || $.isFunction(settings.copy))) { - if ($.isFunction(settings.copy)) { - o.bind('Clipboard_copy',settings.copy); - } - if ($.isFunction(settings.beforeCopy)) { - o.bind('Clipboard_beforeCopy',settings.beforeCopy); - } - if ($.isFunction(settings.afterCopy)) { - o.bind('Clipboard_afterCopy',settings.afterCopy); - } - - if($clip === null) { - ZeroClipboard.config({ - moviePath: settings.path, - trustedDomains: '*', - hoverClass: 'hover', - activeClass: 'active' - }); - - $clip = new ZeroClipboard(null); - - $clip.on('load', function(client) { - client.on('mouseover', function (client) { - $(this).trigger('mouseenter'); - }); - - client.on('mouseout', function (client) { - $(this).trigger('mouseleave'); - }); - - client.on('mousedown', function (client) { - $(this).trigger('mousedown'); - - if (!$.isFunction(settings.copy)) { - client.setText(settings.copy); - } else { - client.setText($(this).triggerHandler('Clipboard_copy')); - } - - if ($.isFunction(settings.beforeCopy)) { - $(this).trigger('Clipboard_beforeCopy'); - } - }); - - client.on('complete', function (client, args) { - if ($.isFunction(settings.afterCopy)) { - $(this).trigger('Clipboard_afterCopy'); - } else { - $(this).removeClass('hover'); - } - - if (settings.clickAfter) { - $(this).trigger('click'); - } - }); - }); - } - - $clip.clip([o[0]]); - } - }); - } - }; -})(jQuery); - -/* Component: ZeroClipboard */ -/*! -* ZeroClipboard -* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface. -* Copyright (c) 2014 Jon Rohan, James M. Greene -* Licensed MIT -* http://zeroclipboard.org/ -* v1.3.2 -*/ -(function() { - "use strict"; - var currentElement; - var flashState = { - bridge: null, - version: "0.0.0", - disabled: null, - outdated: null, - ready: null - }; - var _clipData = {}; - var clientIdCounter = 0; - var _clientMeta = {}; - var elementIdCounter = 0; - var _elementMeta = {}; - var _amdModuleId = null; - var _cjsModuleId = null; - var _swfPath = function() { - var i, jsDir, tmpJsPath, jsPath, swfPath = "ZeroClipboard.swf"; - if (document.currentScript && (jsPath = document.currentScript.src)) {} else { - var scripts = document.getElementsByTagName("script"); - if ("readyState" in scripts[0]) { - for (i = scripts.length; i--; ) { - if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) { - break; - } - } - } else if (document.readyState === "loading") { - jsPath = scripts[scripts.length - 1].src; - } else { - for (i = scripts.length; i--; ) { - tmpJsPath = scripts[i].src; - if (!tmpJsPath) { - jsDir = null; - break; - } - tmpJsPath = tmpJsPath.split("#")[0].split("?")[0]; - tmpJsPath = tmpJsPath.slice(0, tmpJsPath.lastIndexOf("/") + 1); - if (jsDir === null) { - jsDir = tmpJsPath; - } else if (jsDir !== tmpJsPath) { - jsDir = null; - break; - } - } - if (jsDir !== null) { - jsPath = jsDir; - } - } - } - if (jsPath) { - jsPath = jsPath.split("#")[0].split("?")[0]; - swfPath = jsPath.slice(0, jsPath.lastIndexOf("/") + 1) + swfPath; - } - return swfPath; - }(); - var _camelizeCssPropName = function() { - var matcherRegex = /\-([a-z])/g, replacerFn = function(match, group) { - return group.toUpperCase(); - }; - return function(prop) { - return prop.replace(matcherRegex, replacerFn); - }; - }(); - var _getStyle = function(el, prop) { - var value, camelProp, tagName, possiblePointers, i, len; - if (window.getComputedStyle) { - value = window.getComputedStyle(el, null).getPropertyValue(prop); - } else { - camelProp = _camelizeCssPropName(prop); - if (el.currentStyle) { - value = el.currentStyle[camelProp]; - } else { - value = el.style[camelProp]; - } - } - if (prop === "cursor") { - if (!value || value === "auto") { - tagName = el.tagName.toLowerCase(); - if (tagName === "a") { - return "pointer"; - } - } - } - return value; - }; - var _elementMouseOver = function(event) { - if (!event) { - event = window.event; - } - var target; - if (this !== window) { - target = this; - } else if (event.target) { - target = event.target; - } else if (event.srcElement) { - target = event.srcElement; - } - ZeroClipboard.activate(target); - }; - var _addEventHandler = function(element, method, func) { - if (!element || element.nodeType !== 1) { - return; - } - if (element.addEventListener) { - element.addEventListener(method, func, false); - } else if (element.attachEvent) { - element.attachEvent("on" + method, func); - } - }; - var _removeEventHandler = function(element, method, func) { - if (!element || element.nodeType !== 1) { - return; - } - if (element.removeEventListener) { - element.removeEventListener(method, func, false); - } else if (element.detachEvent) { - element.detachEvent("on" + method, func); - } - }; - var _addClass = function(element, value) { - if (!element || element.nodeType !== 1) { - return element; - } - if (element.classList) { - if (!element.classList.contains(value)) { - element.classList.add(value); - } - return element; - } - if (value && typeof value === "string") { - var classNames = (value || "").split(/\s+/); - if (element.nodeType === 1) { - if (!element.className) { - element.className = value; - } else { - var className = " " + element.className + " ", setClass = element.className; - for (var c = 0, cl = classNames.length; c < cl; c++) { - if (className.indexOf(" " + classNames[c] + " ") < 0) { - setClass += " " + classNames[c]; - } - } - element.className = setClass.replace(/^\s+|\s+$/g, ""); - } - } - } - return element; - }; - var _removeClass = function(element, value) { - if (!element || element.nodeType !== 1) { - return element; - } - if (element.classList) { - if (element.classList.contains(value)) { - element.classList.remove(value); - } - return element; - } - if (value && typeof value === "string" || value === undefined) { - var classNames = (value || "").split(/\s+/); - if (element.nodeType === 1 && element.className) { - if (value) { - var className = (" " + element.className + " ").replace(/[\n\t]/g, " "); - for (var c = 0, cl = classNames.length; c < cl; c++) { - className = className.replace(" " + classNames[c] + " ", " "); - } - element.className = className.replace(/^\s+|\s+$/g, ""); - } else { - element.className = ""; - } - } - } - return element; - }; - var _getZoomFactor = function() { - var rect, physicalWidth, logicalWidth, zoomFactor = 1; - if (typeof document.body.getBoundingClientRect === "function") { - rect = document.body.getBoundingClientRect(); - physicalWidth = rect.right - rect.left; - logicalWidth = document.body.offsetWidth; - zoomFactor = Math.round(physicalWidth / logicalWidth * 100) / 100; - } - return zoomFactor; - }; - var _getDOMObjectPosition = function(obj, defaultZIndex) { - var info = { - left: 0, - top: 0, - width: 0, - height: 0, - zIndex: _getSafeZIndex(defaultZIndex) - 1 - }; - if (obj.getBoundingClientRect) { - var rect = obj.getBoundingClientRect(); - var pageXOffset, pageYOffset, zoomFactor; - if ("pageXOffset" in window && "pageYOffset" in window) { - pageXOffset = window.pageXOffset; - pageYOffset = window.pageYOffset; - } else { - zoomFactor = _getZoomFactor(); - pageXOffset = Math.round(document.documentElement.scrollLeft / zoomFactor); - pageYOffset = Math.round(document.documentElement.scrollTop / zoomFactor); - } - var leftBorderWidth = document.documentElement.clientLeft || 0; - var topBorderWidth = document.documentElement.clientTop || 0; - info.left = rect.left + pageXOffset - leftBorderWidth; - info.top = rect.top + pageYOffset - topBorderWidth; - info.width = "width" in rect ? rect.width : rect.right - rect.left; - info.height = "height" in rect ? rect.height : rect.bottom - rect.top; - } - return info; - }; - var _cacheBust = function(path, options) { - var cacheBust = options === null || options && options.cacheBust === true && options.useNoCache === true; - if (cacheBust) { - return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + new Date().getTime(); - } else { - return ""; - } - }; - var _vars = function(options) { - var i, len, domain, str = [], domains = [], trustedOriginsExpanded = []; - if (options.trustedOrigins) { - if (typeof options.trustedOrigins === "string") { - domains.push(options.trustedOrigins); - } else if (typeof options.trustedOrigins === "object" && "length" in options.trustedOrigins) { - domains = domains.concat(options.trustedOrigins); - } - } - if (options.trustedDomains) { - if (typeof options.trustedDomains === "string") { - domains.push(options.trustedDomains); - } else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) { - domains = domains.concat(options.trustedDomains); - } - } - if (domains.length) { - for (i = 0, len = domains.length; i < len; i++) { - if (domains.hasOwnProperty(i) && domains[i] && typeof domains[i] === "string") { - domain = _extractDomain(domains[i]); - if (!domain) { - continue; - } - if (domain === "*") { - trustedOriginsExpanded = [ domain ]; - break; - } - trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, "//" + domain, window.location.protocol + "//" + domain ]); - } - } - } - if (trustedOriginsExpanded.length) { - str.push("trustedOrigins=" + encodeURIComponent(trustedOriginsExpanded.join(","))); - } - if (typeof options.jsModuleId === "string" && options.jsModuleId) { - str.push("jsModuleId=" + encodeURIComponent(options.jsModuleId)); - } - return str.join("&"); - }; - var _inArray = function(elem, array, fromIndex) { - if (typeof array.indexOf === "function") { - return array.indexOf(elem, fromIndex); - } - var i, len = array.length; - if (typeof fromIndex === "undefined") { - fromIndex = 0; - } else if (fromIndex < 0) { - fromIndex = len + fromIndex; - } - for (i = fromIndex; i < len; i++) { - if (array.hasOwnProperty(i) && array[i] === elem) { - return i; - } - } - return -1; - }; - var _prepClip = function(elements) { - if (typeof elements === "string") throw new TypeError("ZeroClipboard doesn't accept query strings."); - if (!elements.length) return [ elements ]; - return elements; - }; - var _dispatchCallback = function(func, context, args, async) { - if (async) { - window.setTimeout(function() { - func.apply(context, args); - }, 0); - } else { - func.apply(context, args); - } - }; - var _getSafeZIndex = function(val) { - var zIndex, tmp; - if (val) { - if (typeof val === "number" && val > 0) { - zIndex = val; - } else if (typeof val === "string" && (tmp = parseInt(val, 10)) && !isNaN(tmp) && tmp > 0) { - zIndex = tmp; - } - } - if (!zIndex) { - if (typeof _globalConfig.zIndex === "number" && _globalConfig.zIndex > 0) { - zIndex = _globalConfig.zIndex; - } else if (typeof _globalConfig.zIndex === "string" && (tmp = parseInt(_globalConfig.zIndex, 10)) && !isNaN(tmp) && tmp > 0) { - zIndex = tmp; - } - } - return zIndex || 0; - }; - var _deprecationWarning = function(deprecatedApiName, debugEnabled) { - if (deprecatedApiName && debugEnabled !== false && typeof console !== "undefined" && console && (console.warn || console.log)) { - var deprecationWarning = "`" + deprecatedApiName + "` is deprecated. See docs for more info:\n" + " https://github.com/zeroclipboard/zeroclipboard/blob/master/docs/instructions.md#deprecations"; - if (console.warn) { - console.warn(deprecationWarning); - } else { - console.log(deprecationWarning); - } - } - }; - var _extend = function() { - var i, len, arg, prop, src, copy, target = arguments[0] || {}; - for (i = 1, len = arguments.length; i < len; i++) { - if ((arg = arguments[i]) !== null) { - for (prop in arg) { - if (arg.hasOwnProperty(prop)) { - src = target[prop]; - copy = arg[prop]; - if (target === copy) { - continue; - } - if (copy !== undefined) { - target[prop] = copy; - } - } - } - } - } - return target; - }; - var _extractDomain = function(originOrUrl) { - if (originOrUrl === null || originOrUrl === "") { - return null; - } - originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, ""); - if (originOrUrl === "") { - return null; - } - var protocolIndex = originOrUrl.indexOf("//"); - originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2); - var pathIndex = originOrUrl.indexOf("/"); - originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex); - if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") { - return null; - } - return originOrUrl || null; - }; - var _determineScriptAccess = function() { - var _extractAllDomains = function(origins, resultsArray) { - var i, len, tmp; - if (origins !== null && resultsArray[0] !== "*") { - if (typeof origins === "string") { - origins = [ origins ]; - } - if (typeof origins === "object" && "length" in origins) { - for (i = 0, len = origins.length; i < len; i++) { - if (origins.hasOwnProperty(i)) { - tmp = _extractDomain(origins[i]); - if (tmp) { - if (tmp === "*") { - resultsArray.length = 0; - resultsArray.push("*"); - break; - } - if (_inArray(tmp, resultsArray) === -1) { - resultsArray.push(tmp); - } - } - } - } - } - } - }; - var _accessLevelLookup = { - always: "always", - samedomain: "sameDomain", - never: "never" - }; - return function(currentDomain, configOptions) { - var asaLower, allowScriptAccess = configOptions.allowScriptAccess; - if (typeof allowScriptAccess === "string" && (asaLower = allowScriptAccess.toLowerCase()) && /^always|samedomain|never$/.test(asaLower)) { - return _accessLevelLookup[asaLower]; - } - var swfDomain = _extractDomain(configOptions.moviePath); - if (swfDomain === null) { - swfDomain = currentDomain; - } - var trustedDomains = []; - _extractAllDomains(configOptions.trustedOrigins, trustedDomains); - _extractAllDomains(configOptions.trustedDomains, trustedDomains); - var len = trustedDomains.length; - if (len > 0) { - if (len === 1 && trustedDomains[0] === "*") { - return "always"; - } - if (_inArray(currentDomain, trustedDomains) !== -1) { - if (len === 1 && currentDomain === swfDomain) { - return "sameDomain"; - } - return "always"; - } - } - return "never"; - }; - }(); - var _objectKeys = function(obj) { - if (obj === null) { - return []; - } - if (Object.keys) { - return Object.keys(obj); - } - var keys = []; - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - keys.push(prop); - } - } - return keys; - }; - var _deleteOwnProperties = function(obj) { - if (obj) { - for (var prop in obj) { - if (obj.hasOwnProperty(prop)) { - delete obj[prop]; - } - } - } - return obj; - }; - var _detectFlashSupport = function() { - var hasFlash = false; - if (typeof flashState.disabled === "boolean") { - hasFlash = flashState.disabled === false; - } else { - if (typeof ActiveXObject === "function") { - try { - if (new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) { - hasFlash = true; - } - } catch (error) {} - } - if (!hasFlash && navigator.mimeTypes["application/x-shockwave-flash"]) { - hasFlash = true; - } - } - return hasFlash; - }; - function _parseFlashVersion(flashVersion) { - return flashVersion.replace(/,/g, ".").replace(/[^0-9\.]/g, ""); - } - function _isFlashVersionSupported(flashVersion) { - return parseFloat(_parseFlashVersion(flashVersion)) >= 10; - } - var ZeroClipboard = function(elements, options) { - if (!(this instanceof ZeroClipboard)) { - return new ZeroClipboard(elements, options); - } - this.id = "" + clientIdCounter++; - _clientMeta[this.id] = { - instance: this, - elements: [], - handlers: {} - }; - if (elements) { - this.clip(elements); - } - if (typeof options !== "undefined") { - _deprecationWarning("new ZeroClipboard(elements, options)", _globalConfig.debug); - ZeroClipboard.config(options); - } - this.options = ZeroClipboard.config(); - if (typeof flashState.disabled !== "boolean") { - flashState.disabled = !_detectFlashSupport(); - } - if (flashState.disabled === false && flashState.outdated !== true) { - if (flashState.bridge === null) { - flashState.outdated = false; - flashState.ready = false; - _bridge(); - } - } - }; - ZeroClipboard.prototype.setText = function(newText) { - if (newText && newText !== "") { - _clipData["text/plain"] = newText; - if (flashState.ready === true && flashState.bridge) { - flashState.bridge.setText(newText); - } else {} - } - return this; - }; - ZeroClipboard.prototype.setSize = function(width, height) { - if (flashState.ready === true && flashState.bridge) { - flashState.bridge.setSize(width, height); - } else {} - return this; - }; - var _setHandCursor = function(enabled) { - if (flashState.ready === true && flashState.bridge) { - flashState.bridge.setHandCursor(enabled); - } else {} - }; - ZeroClipboard.prototype.destroy = function() { - this.unclip(); - this.off(); - delete _clientMeta[this.id]; - }; - var _getAllClients = function() { - var i, len, client, clients = [], clientIds = _objectKeys(_clientMeta); - for (i = 0, len = clientIds.length; i < len; i++) { - client = _clientMeta[clientIds[i]].instance; - if (client && client instanceof ZeroClipboard) { - clients.push(client); - } - } - return clients; - }; - ZeroClipboard.version = "1.3.2"; - var _globalConfig = { - swfPath: _swfPath, - trustedDomains: window.location.host ? [ window.location.host ] : [], - cacheBust: true, - forceHandCursor: false, - zIndex: 999999999, - debug: true, - title: null, - autoActivate: true - }; - ZeroClipboard.config = function(options) { - if (typeof options === "object" && options !== null) { - _extend(_globalConfig, options); - } - if (typeof options === "string" && options) { - if (_globalConfig.hasOwnProperty(options)) { - return _globalConfig[options]; - } - return; - } - var copy = {}; - for (var prop in _globalConfig) { - if (_globalConfig.hasOwnProperty(prop)) { - if (typeof _globalConfig[prop] === "object" && _globalConfig[prop] !== null) { - if ("length" in _globalConfig[prop]) { - copy[prop] = _globalConfig[prop].slice(0); - } else { - copy[prop] = _extend({}, _globalConfig[prop]); - } - } else { - copy[prop] = _globalConfig[prop]; - } - } - } - return copy; - }; - ZeroClipboard.destroy = function() { - ZeroClipboard.deactivate(); - for (var clientId in _clientMeta) { - if (_clientMeta.hasOwnProperty(clientId) && _clientMeta[clientId]) { - var client = _clientMeta[clientId].instance; - if (client && typeof client.destroy === "function") { - client.destroy(); - } - } - } - var htmlBridge = _getHtmlBridge(flashState.bridge); - if (htmlBridge && htmlBridge.parentNode) { - htmlBridge.parentNode.removeChild(htmlBridge); - flashState.ready = null; - flashState.bridge = null; - } - }; - ZeroClipboard.activate = function(element) { - if (currentElement) { - _removeClass(currentElement, _globalConfig.hoverClass); - _removeClass(currentElement, _globalConfig.activeClass); - } - currentElement = element; - _addClass(element, _globalConfig.hoverClass); - _reposition(); - var newTitle = _globalConfig.title || element.getAttribute("title"); - if (newTitle) { - var htmlBridge = _getHtmlBridge(flashState.bridge); - if (htmlBridge) { - htmlBridge.setAttribute("title", newTitle); - } - } - var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer"; - _setHandCursor(useHandCursor); - }; - ZeroClipboard.deactivate = function() { - var htmlBridge = _getHtmlBridge(flashState.bridge); - if (htmlBridge) { - htmlBridge.style.left = "0px"; - htmlBridge.style.top = "-9999px"; - htmlBridge.removeAttribute("title"); - } - if (currentElement) { - _removeClass(currentElement, _globalConfig.hoverClass); - _removeClass(currentElement, _globalConfig.activeClass); - currentElement = null; - } - }; - var _bridge = function() { - var flashBridge, len; - var container = document.getElementById("global-zeroclipboard-html-bridge"); - if (!container) { - var opts = ZeroClipboard.config(); - opts.jsModuleId = typeof _amdModuleId === "string" && _amdModuleId || typeof _cjsModuleId === "string" && _cjsModuleId || null; - var allowScriptAccess = _determineScriptAccess(window.location.host, _globalConfig); - var flashvars = _vars(opts); - var swfUrl = _globalConfig.moviePath + _cacheBust(_globalConfig.moviePath, _globalConfig); - var html = ' '; - container = document.createElement("div"); - container.id = "global-zeroclipboard-html-bridge"; - container.setAttribute("class", "global-zeroclipboard-container"); - container.style.position = "absolute"; - container.style.left = "0px"; - container.style.top = "-9999px"; - container.style.width = "15px"; - container.style.height = "15px"; - container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex); - document.body.appendChild(container); - container.innerHTML = html; - } - flashBridge = document["global-zeroclipboard-flash-bridge"]; - if (flashBridge && (len = flashBridge.length)) { - flashBridge = flashBridge[len - 1]; - } - flashState.bridge = flashBridge || container.children[0].lastElementChild; - }; - var _getHtmlBridge = function(flashBridge) { - var isFlashElement = /^OBJECT|EMBED$/; - var htmlBridge = flashBridge && flashBridge.parentNode; - while (htmlBridge && isFlashElement.test(htmlBridge.nodeName) && htmlBridge.parentNode) { - htmlBridge = htmlBridge.parentNode; - } - return htmlBridge || null; - }; - var _reposition = function() { - if (currentElement) { - var pos = _getDOMObjectPosition(currentElement, _globalConfig.zIndex); - var htmlBridge = _getHtmlBridge(flashState.bridge); - if (htmlBridge) { - htmlBridge.style.top = pos.top + "px"; - htmlBridge.style.left = pos.left + "px"; - htmlBridge.style.width = pos.width + "px"; - htmlBridge.style.height = pos.height + "px"; - htmlBridge.style.zIndex = pos.zIndex + 1; - } - if (flashState.ready === true && flashState.bridge) { - flashState.bridge.setSize(pos.width, pos.height); - } - } - return this; - }; - ZeroClipboard.prototype.on = function(eventName, func) { - var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; - if (typeof eventName === "string" && eventName) { - events = eventName.toLowerCase().split(/\s+/); - } else if (typeof eventName === "object" && eventName && typeof func === "undefined") { - for (i in eventName) { - if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") { - this.on(i, eventName[i]); - } - } - } - if (events && events.length) { - for (i = 0, len = events.length; i < len; i++) { - eventName = events[i].replace(/^on/, ""); - added[eventName] = true; - if (!handlers[eventName]) { - handlers[eventName] = []; - } - handlers[eventName].push(func); - } - if (added.noflash && flashState.disabled) { - _receiveEvent.call(this, "noflash", {}); - } - if (added.wrongflash && flashState.outdated) { - _receiveEvent.call(this, "wrongflash", { - flashVersion: flashState.version - }); - } - if (added.load && flashState.ready) { - _receiveEvent.call(this, "load", { - flashVersion: flashState.version - }); - } - } - return this; - }; - ZeroClipboard.prototype.off = function(eventName, func) { - var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; - if (arguments.length === 0) { - events = _objectKeys(handlers); - } else if (typeof eventName === "string" && eventName) { - events = eventName.split(/\s+/); - } else if (typeof eventName === "object" && eventName && typeof func === "undefined") { - for (i in eventName) { - if (eventName.hasOwnProperty(i) && typeof i === "string" && i && typeof eventName[i] === "function") { - this.off(i, eventName[i]); - } - } - } - if (events && events.length) { - for (i = 0, len = events.length; i < len; i++) { - eventName = events[i].toLowerCase().replace(/^on/, ""); - perEventHandlers = handlers[eventName]; - if (perEventHandlers && perEventHandlers.length) { - if (func) { - foundIndex = _inArray(func, perEventHandlers); - while (foundIndex !== -1) { - perEventHandlers.splice(foundIndex, 1); - foundIndex = _inArray(func, perEventHandlers, foundIndex); - } - } else { - handlers[eventName].length = 0; - } - } - } - } - return this; - }; - ZeroClipboard.prototype.handlers = function(eventName) { - var prop, copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers; - if (handlers) { - if (typeof eventName === "string" && eventName) { - return handlers[eventName] ? handlers[eventName].slice(0) : null; - } - copy = {}; - for (prop in handlers) { - if (handlers.hasOwnProperty(prop) && handlers[prop]) { - copy[prop] = handlers[prop].slice(0); - } - } - } - return copy; - }; - var _dispatchClientCallbacks = function(eventName, context, args, async) { - var handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[eventName]; - if (handlers && handlers.length) { - var i, len, func, originalContext = context || this; - for (i = 0, len = handlers.length; i < len; i++) { - func = handlers[i]; - context = originalContext; - if (typeof func === "string" && typeof window[func] === "function") { - func = window[func]; - } - if (typeof func === "object" && func && typeof func.handleEvent === "function") { - context = func; - func = func.handleEvent; - } - if (typeof func === "function") { - _dispatchCallback(func, context, args, async); - } - } - } - return this; - }; - ZeroClipboard.prototype.clip = function(elements) { - elements = _prepClip(elements); - for (var i = 0; i < elements.length; i++) { - if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) { - if (!elements[i].zcClippingId) { - elements[i].zcClippingId = "zcClippingId_" + elementIdCounter++; - _elementMeta[elements[i].zcClippingId] = [ this.id ]; - if (_globalConfig.autoActivate === true) { - _addEventHandler(elements[i], "mouseover", _elementMouseOver); - } - } else if (_inArray(this.id, _elementMeta[elements[i].zcClippingId]) === -1) { - _elementMeta[elements[i].zcClippingId].push(this.id); - } - var clippedElements = _clientMeta[this.id].elements; - if (_inArray(elements[i], clippedElements) === -1) { - clippedElements.push(elements[i]); - } - } - } - return this; - }; - ZeroClipboard.prototype.unclip = function(elements) { - var meta = _clientMeta[this.id]; - if (meta) { - var clippedElements = meta.elements; - var arrayIndex; - if (typeof elements === "undefined") { - elements = clippedElements.slice(0); - } else { - elements = _prepClip(elements); - } - for (var i = elements.length; i--; ) { - if (elements.hasOwnProperty(i) && elements[i] && elements[i].nodeType === 1) { - arrayIndex = 0; - while ((arrayIndex = _inArray(elements[i], clippedElements, arrayIndex)) !== -1) { - clippedElements.splice(arrayIndex, 1); - } - var clientIds = _elementMeta[elements[i].zcClippingId]; - if (clientIds) { - arrayIndex = 0; - while ((arrayIndex = _inArray(this.id, clientIds, arrayIndex)) !== -1) { - clientIds.splice(arrayIndex, 1); - } - if (clientIds.length === 0) { - if (_globalConfig.autoActivate === true) { - _removeEventHandler(elements[i], "mouseover", _elementMouseOver); - } - delete elements[i].zcClippingId; - } - } - } - } - } - return this; - }; - ZeroClipboard.prototype.elements = function() { - var meta = _clientMeta[this.id]; - return meta && meta.elements ? meta.elements.slice(0) : []; - }; - var _getAllClientsClippedToElement = function(element) { - var elementMetaId, clientIds, i, len, client, clients = []; - if (element && element.nodeType === 1 && (elementMetaId = element.zcClippingId) && _elementMeta.hasOwnProperty(elementMetaId)) { - clientIds = _elementMeta[elementMetaId]; - if (clientIds && clientIds.length) { - for (i = 0, len = clientIds.length; i < len; i++) { - client = _clientMeta[clientIds[i]].instance; - if (client && client instanceof ZeroClipboard) { - clients.push(client); - } - } - } - } - return clients; - }; - _globalConfig.hoverClass = "zeroclipboard-is-hover"; - _globalConfig.activeClass = "zeroclipboard-is-active"; - _globalConfig.trustedOrigins = null; - _globalConfig.allowScriptAccess = null; - _globalConfig.useNoCache = true; - _globalConfig.moviePath = "ZeroClipboard.swf"; - ZeroClipboard.detectFlashSupport = function() { - _deprecationWarning("ZeroClipboard.detectFlashSupport", _globalConfig.debug); - return _detectFlashSupport(); - }; - ZeroClipboard.dispatch = function(eventName, args) { - if (typeof eventName === "string" && eventName) { - var cleanEventName = eventName.toLowerCase().replace(/^on/, ""); - if (cleanEventName) { - var clients = currentElement ? _getAllClientsClippedToElement(currentElement) : _getAllClients(); - for (var i = 0, len = clients.length; i < len; i++) { - _receiveEvent.call(clients[i], cleanEventName, args); - } - } - } - }; - ZeroClipboard.prototype.setHandCursor = function(enabled) { - _deprecationWarning("ZeroClipboard.prototype.setHandCursor", _globalConfig.debug); - enabled = typeof enabled === "boolean" ? enabled : !!enabled; - _setHandCursor(enabled); - _globalConfig.forceHandCursor = enabled; - return this; - }; - ZeroClipboard.prototype.reposition = function() { - _deprecationWarning("ZeroClipboard.prototype.reposition", _globalConfig.debug); - return _reposition(); - }; - ZeroClipboard.prototype.receiveEvent = function(eventName, args) { - _deprecationWarning("ZeroClipboard.prototype.receiveEvent", _globalConfig.debug); - if (typeof eventName === "string" && eventName) { - var cleanEventName = eventName.toLowerCase().replace(/^on/, ""); - if (cleanEventName) { - _receiveEvent.call(this, cleanEventName, args); - } - } - }; - ZeroClipboard.prototype.setCurrent = function(element) { - _deprecationWarning("ZeroClipboard.prototype.setCurrent", _globalConfig.debug); - ZeroClipboard.activate(element); - return this; - }; - ZeroClipboard.prototype.resetBridge = function() { - _deprecationWarning("ZeroClipboard.prototype.resetBridge", _globalConfig.debug); - ZeroClipboard.deactivate(); - return this; - }; - ZeroClipboard.prototype.setTitle = function(newTitle) { - _deprecationWarning("ZeroClipboard.prototype.setTitle", _globalConfig.debug); - newTitle = newTitle || _globalConfig.title || currentElement && currentElement.getAttribute("title"); - if (newTitle) { - var htmlBridge = _getHtmlBridge(flashState.bridge); - if (htmlBridge) { - htmlBridge.setAttribute("title", newTitle); - } - } - return this; - }; - ZeroClipboard.setDefaults = function(options) { - _deprecationWarning("ZeroClipboard.setDefaults", _globalConfig.debug); - ZeroClipboard.config(options); - }; - ZeroClipboard.prototype.addEventListener = function(eventName, func) { - _deprecationWarning("ZeroClipboard.prototype.addEventListener", _globalConfig.debug); - return this.on(eventName, func); - }; - ZeroClipboard.prototype.removeEventListener = function(eventName, func) { - _deprecationWarning("ZeroClipboard.prototype.removeEventListener", _globalConfig.debug); - return this.off(eventName, func); - }; - ZeroClipboard.prototype.ready = function() { - _deprecationWarning("ZeroClipboard.prototype.ready", _globalConfig.debug); - return flashState.ready === true; - }; - var _receiveEvent = function(eventName, args) { - eventName = eventName.toLowerCase().replace(/^on/, ""); - var cleanVersion = args && args.flashVersion && _parseFlashVersion(args.flashVersion) || null; - var element = currentElement; - var performCallbackAsync = true; - switch (eventName) { - case "load": - if (cleanVersion) { - if (!_isFlashVersionSupported(cleanVersion)) { - _receiveEvent.call(this, "onWrongFlash", { - flashVersion: cleanVersion - }); - return; - } - flashState.outdated = false; - flashState.ready = true; - flashState.version = cleanVersion; - } - break; - - case "wrongflash": - if (cleanVersion && !_isFlashVersionSupported(cleanVersion)) { - flashState.outdated = true; - flashState.ready = false; - flashState.version = cleanVersion; - } - break; - - case "mouseover": - _addClass(element, _globalConfig.hoverClass); - break; - - case "mouseout": - if (_globalConfig.autoActivate === true) { - ZeroClipboard.deactivate(); - } - break; - - case "mousedown": - _addClass(element, _globalConfig.activeClass); - break; - - case "mouseup": - _removeClass(element, _globalConfig.activeClass); - break; - - case "datarequested": - var targetId = element.getAttribute("data-clipboard-target"), targetEl = !targetId ? null : document.getElementById(targetId); - if (targetEl) { - var textContent = targetEl.value || targetEl.textContent || targetEl.innerText; - if (textContent) { - this.setText(textContent); - } - } else { - var defaultText = element.getAttribute("data-clipboard-text"); - if (defaultText) { - this.setText(defaultText); - } - } - performCallbackAsync = false; - break; - - case "complete": - _deleteOwnProperties(_clipData); - break; - } - var context = element; - var eventArgs = [ this, args ]; - return _dispatchClientCallbacks.call(this, eventName, context, eventArgs, performCallbackAsync); - }; - if (typeof define === "function" && define.amd) { - define([ "require", "exports", "module" ], function(require, exports, module) { - _amdModuleId = module && module.id || null; - return ZeroClipboard; - }); - } else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports) { - _cjsModuleId = module.id || null; - module.exports = ZeroClipboard; - } else { - window.ZeroClipboard = ZeroClipboard; - } -})(); \ No newline at end of file diff --git a/beatsmusic/authproxy/js/jquery.zclip.min.js b/beatsmusic/authproxy/js/jquery.zclip.min.js deleted file mode 100644 index 3548cc2ae..000000000 --- a/beatsmusic/authproxy/js/jquery.zclip.min.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - * zClip :: jQuery ZeroClipboard v1.1.1 - * http://steamdev.com/zclip - * - * Copyright 2011, SteamDev - * Released under the MIT license. - * http://www.opensource.org/licenses/mit-license.php - * - * Date: Wed Jun 01, 2011 - */ - -(function(a){a.fn.zclip=function(c){if(typeof c=="object"&&!c.length){var b=a.extend({path:"ZeroClipboard.swf",copy:null,beforeCopy:null,afterCopy:null,clickAfter:true,setHandCursor:true,setCSSEffects:true},c);return this.each(function(){var e=a(this);if(e.is(":visible")&&(typeof b.copy=="string"||a.isFunction(b.copy))){ZeroClipboard.setMoviePath(b.path);var d=new ZeroClipboard.Client();if(a.isFunction(b.copy)){e.bind("zClip_copy",b.copy)}if(a.isFunction(b.beforeCopy)){e.bind("zClip_beforeCopy",b.beforeCopy)}if(a.isFunction(b.afterCopy)){e.bind("zClip_afterCopy",b.afterCopy)}d.setHandCursor(b.setHandCursor);d.setCSSEffects(b.setCSSEffects);d.addEventListener("mouseOver",function(f){e.trigger("mouseenter")});d.addEventListener("mouseOut",function(f){e.trigger("mouseleave")});d.addEventListener("mouseDown",function(f){e.trigger("mousedown");if(!a.isFunction(b.copy)){d.setText(b.copy)}else{d.setText(e.triggerHandler("zClip_copy"))}if(a.isFunction(b.beforeCopy)){e.trigger("zClip_beforeCopy")}});d.addEventListener("complete",function(f,g){if(a.isFunction(b.afterCopy)){e.trigger("zClip_afterCopy")}else{if(g.length>500){g=g.substr(0,500)+"...\n\n("+(g.length-500)+" characters not shown)"}e.removeClass("hover");alert("Copied text to clipboard:\n\n "+g)}if(b.clickAfter){e.trigger("click")}});d.glue(e[0],e.parent()[0]);a(window).bind("load resize",function(){d.reposition()})}})}else{if(typeof c=="string"){return this.each(function(){var f=a(this);c=c.toLowerCase();var e=f.data("zclipId");var d=a("#"+e+".zclip");if(c=="remove"){d.remove();f.removeClass("active hover")}else{if(c=="hide"){d.hide();f.removeClass("active hover")}else{if(c=="show"){d.show()}}}})}}}})(jQuery);var ZeroClipboard={version:"1.0.7",clients:{},moviePath:"ZeroClipboard.swf",nextId:1,$:function(a){if(typeof(a)=="string"){a=document.getElementById(a)}if(!a.addClass){a.hide=function(){this.style.display="none"};a.show=function(){this.style.display=""};a.addClass=function(b){this.removeClass(b);this.className+=" "+b};a.removeClass=function(d){var e=this.className.split(/\s+/);var b=-1;for(var c=0;c-1){e.splice(b,1);this.className=e.join(" ")}return this};a.hasClass=function(b){return !!this.className.match(new RegExp("\\s*"+b+"\\s*"))}}return a},setMoviePath:function(a){this.moviePath=a},dispatch:function(d,b,c){var a=this.clients[d];if(a){a.receiveEvent(b,c)}},register:function(b,a){this.clients[b]=a},getDOMObjectPosition:function(c,a){var b={left:0,top:0,width:c.width?c.width:c.offsetWidth,height:c.height?c.height:c.offsetHeight};if(c&&(c!=a)){b.left+=c.offsetLeft;b.top+=c.offsetTop}return b},Client:function(a){this.handlers={};this.id=ZeroClipboard.nextId++;this.movieId="ZeroClipboardMovie_"+this.id;ZeroClipboard.register(this.id,this);if(a){this.glue(a)}}};ZeroClipboard.Client.prototype={id:0,ready:false,movie:null,clipText:"",handCursorEnabled:true,cssEffects:true,handlers:null,glue:function(d,b,e){this.domElement=ZeroClipboard.$(d);var f=99;if(this.domElement.style.zIndex){f=parseInt(this.domElement.style.zIndex,10)+1}if(typeof(b)=="string"){b=ZeroClipboard.$(b)}else{if(typeof(b)=="undefined"){b=document.getElementsByTagName("body")[0]}}var c=ZeroClipboard.getDOMObjectPosition(this.domElement,b);this.div=document.createElement("div");this.div.className="zclip";this.div.id="zclip-"+this.movieId;$(this.domElement).data("zclipId","zclip-"+this.movieId);var a=this.div.style;a.position="absolute";a.left=""+c.left+"px";a.top=""+c.top+"px";a.width=""+c.width+"px";a.height=""+c.height+"px";a.zIndex=f;if(typeof(e)=="object"){for(addedStyle in e){a[addedStyle]=e[addedStyle]}}b.appendChild(this.div);this.div.innerHTML=this.getHTML(c.width,c.height)},getHTML:function(d,a){var c="";var b="id="+this.id+"&width="+d+"&height="+a;if(navigator.userAgent.match(/MSIE/)){var e=location.href.match(/^https/i)?"https://":"http://";c+=''}else{c+=''}return c},hide:function(){if(this.div){this.div.style.left="-2000px"}},show:function(){this.reposition()},destroy:function(){if(this.domElement&&this.div){this.hide();this.div.innerHTML="";var a=document.getElementsByTagName("body")[0];try{a.removeChild(this.div)}catch(b){}this.domElement=null;this.div=null}},reposition:function(c){if(c){this.domElement=ZeroClipboard.$(c);if(!this.domElement){this.hide()}}if(this.domElement&&this.div){var b=ZeroClipboard.getDOMObjectPosition(this.domElement);var a=this.div.style;a.left=""+b.left+"px";a.top=""+b.top+"px"}},setText:function(a){this.clipText=a;if(this.ready){this.movie.setText(a)}},addEventListener:function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");if(!this.handlers[a]){this.handlers[a]=[]}this.handlers[a].push(b)},setHandCursor:function(a){this.handCursorEnabled=a;if(this.ready){this.movie.setHandCursor(a)}},setCSSEffects:function(a){this.cssEffects=!!a},receiveEvent:function(d,f){d=d.toString().toLowerCase().replace(/^on/,"");switch(d){case"load":this.movie=document.getElementById(this.movieId);if(!this.movie){var c=this;setTimeout(function(){c.receiveEvent("load",null)},1);return}if(!this.ready&&navigator.userAgent.match(/Firefox/)&&navigator.userAgent.match(/Windows/)){var c=this;setTimeout(function(){c.receiveEvent("load",null)},100);this.ready=true;return}this.ready=true;try{this.movie.setText(this.clipText)}catch(h){}try{this.movie.setHandCursor(this.handCursorEnabled)}catch(h){}break;case"mouseover":if(this.domElement&&this.cssEffects){this.domElement.addClass("hover");if(this.recoverActive){this.domElement.addClass("active")}}break;case"mouseout":if(this.domElement&&this.cssEffects){this.recoverActive=false;if(this.domElement.hasClass("active")){this.domElement.removeClass("active");this.recoverActive=true}this.domElement.removeClass("hover")}break;case"mousedown":if(this.domElement&&this.cssEffects){this.domElement.addClass("active")}break;case"mouseup":if(this.domElement&&this.cssEffects){this.domElement.removeClass("active");this.recoverActive=false}break}if(this.handlers[d]){for(var b=0,a=this.handlers[d].length;b Date: Tue, 28 Oct 2014 19:04:06 +0100 Subject: [PATCH 342/597] Make authproxy a toplevel project --- {beatsmusic/authproxy => authproxy}/app.yaml | 0 {beatsmusic/authproxy => authproxy}/authproxy.go | 0 {beatsmusic/authproxy => authproxy}/index.html | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {beatsmusic/authproxy => authproxy}/app.yaml (100%) rename {beatsmusic/authproxy => authproxy}/authproxy.go (100%) rename {beatsmusic/authproxy => authproxy}/index.html (100%) diff --git a/beatsmusic/authproxy/app.yaml b/authproxy/app.yaml similarity index 100% rename from beatsmusic/authproxy/app.yaml rename to authproxy/app.yaml diff --git a/beatsmusic/authproxy/authproxy.go b/authproxy/authproxy.go similarity index 100% rename from beatsmusic/authproxy/authproxy.go rename to authproxy/authproxy.go diff --git a/beatsmusic/authproxy/index.html b/authproxy/index.html similarity index 100% rename from beatsmusic/authproxy/index.html rename to authproxy/index.html From fd70babebf16914baa6453b035f3cba329d82455 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 29 Oct 2014 19:17:08 +0100 Subject: [PATCH 343/597] [tools] Add option to load config from file --- tools/resolve.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/resolve.js b/tools/resolve.js index 54ffc0501..1ac8097af 100644 --- a/tools/resolve.js +++ b/tools/resolve.js @@ -22,9 +22,14 @@ if (argv._.length > 3) { } // All -/-- arguments will be added to the config. -// TODO: Add an agurment to load the config from a file. +// If --config is specified, we will instead load them from the config file. var resolverConfig = argv; -delete resolverConfig._; +if (argv.hasOwnProperty("config")) { + // FIXME: Add support for absolute paths + resolverConfig = require("../" + argv.config); +} else { + delete resolverConfig._; +} var resolver = {}; From 8092507a46c69ca3f991888fa43f4fe3eddf29e4 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 29 Oct 2014 19:18:04 +0100 Subject: [PATCH 344/597] [authproxy] Add basic Spotify handling --- authproxy/app.yaml | 3 +++ authproxy/authproxy.go | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/authproxy/app.yaml b/authproxy/app.yaml index 0bee25007..ff157eefc 100644 --- a/authproxy/app.yaml +++ b/authproxy/app.yaml @@ -10,3 +10,6 @@ handlers: - url: /json script: _go_app + +- url: /spotify + script: _go_app diff --git a/authproxy/authproxy.go b/authproxy/authproxy.go index 4b63eca65..89fab05bb 100644 --- a/authproxy/authproxy.go +++ b/authproxy/authproxy.go @@ -6,6 +6,7 @@ import ( func init() { http.HandleFunc("/json", jsonHandler) + http.HandleFunc("/spotify", spotifyHandler) } @@ -14,3 +15,9 @@ func jsonHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") w.Write([]byte("{ \"access_token\": \"" + r.FormValue("access_token") + "\" }")) } + +func spotifyHandler(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.Header().Set("Access-Control-Allow-Origin", "*") + w.Write([]byte("{ \"code\": \"" + r.FormValue("code") + "\" }")) +} From ff7978c93e1f740ca3c071a1fd75bf8d69362c65 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 29 Oct 2014 19:22:31 +0100 Subject: [PATCH 345/597] [spotify] Add basic resolving --- spotify/content/contents/code/spotify.js | 122 +++++++++++++++++++++-- 1 file changed, 116 insertions(+), 6 deletions(-) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index e6ffacf4a..b4babeb77 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -29,6 +29,8 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { timeout: 15 }, + authorization_endpoint: "https://accounts.spotify.com/authorize/", + getConfigUi: function () { var uiData = Tomahawk.readBase64("config.ui"); return { @@ -56,10 +58,36 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { } }, + /** + * Refresh the access token when it is expired. + */ + refreshToken: function (callback) { + var that = this; + var data = "grant_type=refresh_token"; + data += "&refresh_token=" + encodeURIComponent(this.refresh_token); + var headers = { + "Authorization": "Basic " + Tomahawk.base64Encode(this.client_id + ":" + this.client_secret), + "Content-Type": "application/x-www-form-urlencoded" + }; + Tomahawk.asyncRequest("https://accounts.spotify.com/api/token", function (xhr) { + var res = JSON.parse(xhr.responseText); + if (res.hasOwnProperty("access_token")) { + that.access_token = res.access_token; + that.access_token_expires = new Date().getTime() + res.expires_in * 1000; + callback() + } else { + callback(res); + } + }, headers, { + method: "POST", + data: data + }); + }, login: function(callback) { + var that = this; var userConfig = this.getUserConfig(); - if (!userConfig.user || !userConfig.password) { + if (!userConfig.access_token || !userConfig.refresh_token) { Tomahawk.log("Spotify Resolver not properly configured!"); this.loggedIn = false; if (callback) { @@ -68,11 +96,67 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { return; } - this.user = userConfig.user; - this.password = userConfig.password; - - // TODO - + this.access_token = userConfig.access_token; + this.refresh_token = userConfig.refresh_token; + // TODO: Maybe not from userConfig... + // Also we do not want the secret in the resolver + this.client_id = userConfig.client_id; + this.client_secret = userConfig.client_secret; + + if (this.hasOwnProperty("access_token") && this.hasOwnProperty("refresh_token")) { + // Check if access_token is still valid. + var headers = { + "Authorization": "Bearer " + this.access_token + }; + Tomahawk.asyncRequest("https://api.spotify.com/v1/me", function (xhr) { + var res = JSON.parse(xhr.responseText); + if (res.hasOwnProperty("error")) { + that.refreshToken(callback); + } else { + callback(); + } + }, headers); + } else { + // var code = "bla"; + // if (typeof code !== "undefined" && code !== null) { + // var headers = { + // "Content-Type": "application/x-www-form-urlencoded" + // }; + // var data = "grant_type=authorization_code"; + // data += "&code=" + encodeURIComponent(code); + // data += "&redirect_uri=" + encodeURIComponent("http://localhost:8080/spotify"); + // data += "&client_id=" + this.client_id; + // data += "&client_secret=" + this.client_secret; + + // Tomahawk.asyncRequest("https://accounts.spotify.com/api/token", function (xhr) { + // var res = JSON.parse(xhr.responseText); + // if (res.hasOwnProperty("error")) { + // var errorMsg = "Spotify auth falied: " + res.error; + // Tomahawk.log(errorMsg); + // if (callback) { + // callback(errorMsg); + // } + // } else { + // Tomahawk.log(res); + // } + // }, headers, { + // method: "POST", + // data: data + // }); + // } else { + // This URL does only work in the browser + var authUrl = this.authorization_endpoint; + authUrl += "?client_id=" + this.client_id; + authUrl += "&response_type=code"; + authUrl += "&redirect_uri=" + encodeURIComponent("http://localhost:8080/spotify"); + authUrl += "&scope=playlist-read-private%20streaming%20user-read-private%20user-library-read"; + + var errorMsg = "Auth CODE missing, please visit: " + authUrl; + Tomahawk.log(errorMsg); + if (callback) { + callback(errorMsg); + } + } }, spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, @@ -87,6 +171,32 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { }, resolve: function (qid, artist, album, title) { + var that = this; + var searchUrl = "https://api.spotify.com/v1/search?market=from_token" + searchUrl += "&type=track"; + searchUrl += "&q=artist:" + encodeURIComponent(artist); + searchUrl += "+track:" + encodeURIComponent(title); + if (album != "") { + searchUrl += "+album:" + encodeURIComponent(album); + }; + Tomahawk.asyncRequest(searchUrl, function (xhr) { + var res = JSON.parse(xhr.responseText); + Tomahawk.addTrackResults({ + qid: qid, + results: res.tracks.items.map(function (item) { + return { + artist: item.artists[0].name, + album: item.album.name, + duration: item.duration_ms / 1000, + source: that.settings.name, + track: item.name, + url: "spotify://track/" + item.id + }; + }) + }); + }, { + "Authorization": "Bearer " + this.access_token + }); // TODO }, From 5d3345a8fbc81fde41052090fa260d8c09101b72 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 29 Oct 2014 19:25:47 +0100 Subject: [PATCH 346/597] [spotify] Remove obsolete TODO --- spotify/content/contents/code/spotify.js | 1 - 1 file changed, 1 deletion(-) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index b4babeb77..d79cfed3f 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -197,7 +197,6 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { }, { "Authorization": "Bearer " + this.access_token }); - // TODO }, search: function (qid, searchString) { From d709f490b7e330f8a56b05f8bc5b22813f0f65f4 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 1 Nov 2014 21:04:19 +0100 Subject: [PATCH 347/597] Use node-tomahawkjs 0.3.3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7c1c749c1..b5c562fad 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,6 @@ "buster": "^0.7.13", "minimist": "^1.1.0", "nock": "^0.32.0", - "tomahawkjs": "^0.3.2" + "tomahawkjs": "^0.3.3" } } From d1c008521e2b7ecac35d0e55b63680ba79487c1b Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 1 Nov 2014 21:31:12 +0100 Subject: [PATCH 348/597] [spotify] Add basic track search --- spotify/content/contents/code/spotify.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index d79cfed3f..c15c6e9b6 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -200,7 +200,29 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { }, search: function (qid, searchString) { - // TODO + var that = this; + var searchUrl = "https://api.spotify.com/v1/search?market=from_token" + // TODO: Artists and Albums + searchUrl += "&type=track"; + searchUrl += "&q=" + encodeURIComponent(searchString); + Tomahawk.asyncRequest(searchUrl, function (xhr) { + var res = JSON.parse(xhr.responseText); + Tomahawk.addTrackResults({ + qid: qid, + results: res.tracks.items.map(function (item) { + return { + artist: item.artists[0].name, + album: item.album.name, + duration: item.duration_ms / 1000, + source: that.settings.name, + track: item.name, + url: "spotify://track/" + item.id + }; + }) + }); + }, { + "Authorization": "Bearer " + this.access_token + }); }, canParseUrl: function (url, type) { From bd826507d293949ba229aed36ca34bf5c412b8f8 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 1 Nov 2014 21:31:25 +0100 Subject: [PATCH 349/597] Add tool for testing search --- tools/search.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 tools/search.js diff --git a/tools/search.js b/tools/search.js new file mode 100644 index 000000000..f6a3f3895 --- /dev/null +++ b/tools/search.js @@ -0,0 +1,36 @@ +var argv = require('minimist')(process.argv.slice(2)); +var utils = require('../test/utils.js'); + +if (argv._.length < 1) { + console.error("Please specify a single resolver"); + process.exit(1); +} + +if (argv._.length < 2) { + console.error("You need to specify at least some characters to search for."); + process.exit(1); +} + +// We use the string argument as the path to the resolver. +var resolverPath = argv._.shift(); +// All other arguments are passed as the search query +var searchQuery = argv._.join(" "); + +// All -/-- arguments will be added to the config. +// If --config is specified, we will instead load them from the config file. +var resolverConfig = argv; +if (argv.hasOwnProperty("config")) { + // FIXME: Add support for absolute paths + resolverConfig = require("../" + argv.config); +} else { + delete resolverConfig._; +} + +var resolver = {}; + +utils.loadAxe(resolverPath, resolver, function () { + resolver.context.on('track-result', function (qid, result) { + console.dir(result); + }); + resolver.instance.search("qid", searchQuery); +}, resolverConfig); From b634fbfa413fe14c4636879d5e9b6faa8a3ea831 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 1 Nov 2014 21:48:51 +0100 Subject: [PATCH 350/597] Add support for loading resolver config from file --- tools/urllookup.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/urllookup.js b/tools/urllookup.js index 168dfeb94..e4c27c551 100644 --- a/tools/urllookup.js +++ b/tools/urllookup.js @@ -18,7 +18,12 @@ var url = argv._[1]; // All -/-- arguments will be added to the config. // TODO: Add an agurment to load the config from a file. var resolverConfig = argv; -delete resolverConfig._; +if (argv.hasOwnProperty("config")) { + // FIXME: Add support for absolute paths + resolverConfig = require("../" + argv.config); +} else { + delete resolverConfig._; +} var resolver = {}; From 0acf5c75779de3dd447f7b191f9a061799d53f29 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 1 Nov 2014 21:49:26 +0100 Subject: [PATCH 351/597] [spotify] Import UrlLookup from spotify-metadata --- spotify/content/contents/code/spotify.js | 62 +++++++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index c15c6e9b6..6d072b7a7 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -226,11 +226,69 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { }, canParseUrl: function (url, type) { - // TODO + switch (type) { + case TomahawkUrlType.Album: + return /spotify:album:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/album\//.test(url); + case TomahawkUrlType.Artist: + return /spotify:artist:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/artist\//.test(url); + case TomahawkUrlType.Playlist: + return /spotify:user:[0-9]*:playlist:/.test(url); + case TomahawkUrlType.Track: + return /spotify:track:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/track\//.test(url); + // case TomahawkUrlType.Any: + default: + return /spotify:(album|artist|track|user):/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\//.test(url); + } }, lookupUrl: function (url) { - // TODO + var that = this; + var match = url.match(/spotify:(album|artist|track):(.*)/); + var playlistmatch = url.match(/spotify:user:[0-9]*:playlist:(.*)/); + if (match == null) { + match = url.match(/https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]*)/); + if (match != null) match.splice(1, 1); + } + if (match != null) { + var query = 'https://ws.spotify.com/lookup/1/.json?uri=spotify:' + match[1] + ':' + match[2]; + Tomahawk.asyncRequest(query, function (xhr) { + var res = JSON.parse(xhr.responseText); + if (match[1] == "artist") { + Tomahawk.addUrlResult(url, { + type: "artist", + name: res.artist.name + }); + } else if (match[1] == "album") { + Tomahawk.addUrlResult(url, { + type: "album", + name: res.album.name, + artist: res.album.artist, + }); + } else if (match[1] == "track") { + Tomahawk.addUrlResult(url, { + type: "track", + title: res.track.name, + artist: res.track.artists.map(function (item) { return item.name; }).join(" & ") + }); + } + }); + } else if (playlistmatch != null) { + var query = 'http://spotikea.tomahawk-player.org/browse/' + url; + Tomahawk.asyncRequest(query, function (xhr) { + var res = JSON.parse(xhr.responseText); + var result = { + type: "playlist", + title: res.playlist.name, + guid: "spotify-playlist-" + url, + info: "A playlist on Spotify.", + creator: res.playlist.creator, + url: url, + tracks: [] + }; + result.tracks = res.playlist.result.map(function (item) { return { type: "track", title: item.title, artist: item.artist }; }); + Tomahawk.addUrlResult(url, result); + }); + } } }); From b48b661e5eef3cf0e036a194a1dd1ac9c58386f8 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 2 Nov 2014 09:12:08 +0100 Subject: [PATCH 352/597] [spotify] Add basic HTTP server --- spotify/native/CMakeLists.txt | 40 +++++++ .../native/CMakeModules/FindMicrohttpd.cmake | 22 ++++ spotify/native/main.cpp | 111 ++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 spotify/native/CMakeLists.txt create mode 100644 spotify/native/CMakeModules/FindMicrohttpd.cmake create mode 100644 spotify/native/main.cpp diff --git a/spotify/native/CMakeLists.txt b/spotify/native/CMakeLists.txt new file mode 100644 index 000000000..24458d825 --- /dev/null +++ b/spotify/native/CMakeLists.txt @@ -0,0 +1,40 @@ +project( spotify-native ) +cmake_minimum_required( VERSION 2.8.6 ) +set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules" ) + +find_package(Microhttpd REQUIRED) + +include(CheckCXXCompilerFlag) +check_cxx_compiler_flag( "-std=c++11" CXX11_FOUND ) +check_cxx_compiler_flag( "-std=c++0x" CXX0X_FOUND ) +check_cxx_compiler_flag( "-stdlib=libc++" LIBCPP_FOUND ) +if(CXX11_FOUND) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +elseif(CXX0X_FOUND) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") +else() + message(FATAL_ERROR "${CMAKE_CXX_COMPILER} does not support C++11, please + use a different compiler") +endif() +if(LIBCPP_FOUND AND APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") +endif() + +# We want as many as possible warnings +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") + +include_directories( + ${MICROHTTPD_INCLUDE_DIR} +) + +# Define the "resolver" target +add_executable( spotify_native_bin + main.cpp +) +target_link_libraries( spotify_native_bin + ${MICROHTTPD_LIBRARY} +) +set_target_properties( spotify_native_bin + PROPERTIES + RUNTIME_OUTPUT_NAME spotify-native${SPOTIFY_NATIVE_SUFFIX} +) diff --git a/spotify/native/CMakeModules/FindMicrohttpd.cmake b/spotify/native/CMakeModules/FindMicrohttpd.cmake new file mode 100644 index 000000000..a7eb73da5 --- /dev/null +++ b/spotify/native/CMakeModules/FindMicrohttpd.cmake @@ -0,0 +1,22 @@ +find_package(PkgConfig) +pkg_check_modules(PC_MICROHTTPD libmicrohttpd) + +find_path(MICROHTTPD_INCLUDE_DIR microhttpd.h + HINTS + ${PC_MICROHTTPD_INCLUDEDIR} + ${PC_MICROHTTPD_INCLUDE_DIRS} +) + +find_library(MICROHTTPD_LIBRARY NAMES microhttpd + HINTS + ${PC_MICROHTTPD_LIBDIR} + ${PC_MICROHTTPD_LIBRARY_DIRS} +) + +set(MICROHTTPD_VERSION ${PC_MICROHTTPD_VERSION}) + +find_package_handle_standard_args(Microhttpd + REQUIRED_VARS MICROHTTPD_INCLUDE_DIR MICROHTTPD_LIBRARY + VERSION_VAR MICROHTTPD_VERSION +) + diff --git a/spotify/native/main.cpp b/spotify/native/main.cpp new file mode 100644 index 000000000..e317e8982 --- /dev/null +++ b/spotify/native/main.cpp @@ -0,0 +1,111 @@ +/* + * Copyright 2014, Uwe L. Korn + * + * The MIT License (MIT) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include + +#include +#include +#include + +// Typedef the pointers for better readability. +typedef struct MHD_Connection* connection_ptr; +typedef struct MHD_Response* response_ptr ; + +std::mutex exit_mutex; + +static int ahc_echo( void* /*cls*/, connection_ptr connection, const char* url, + const char* method, const char* /*version*/, const char* /*upload_data*/, + size_t* upload_data_size, void** ptr) +{ + static int header_test; + + // We only expect GET requests. + if ( 0 != strcmp( method, "GET" ) ) + { + return MHD_NO; + } + + std::cout << "Test" << std::endl; + + // On the first call only the headers are valid. Reply in the second round. + if ( &header_test != *ptr ) + { + *ptr = &header_test; + return MHD_YES; + } + + // There should no data uploaded in the GET request. + if ( *upload_data_size ) + { + return MHD_NO; + } + + int ret; + if ( !strcmp( url, "/exit" ) ) + { + // Shutdown requested, unlock the relevant mutex. + response_ptr response = MHD_create_response_from_data( strlen( "OK" ), (void*)"OK", MHD_NO, MHD_NO ); + ret = MHD_queue_response( connection, MHD_HTTP_OK, response ); + MHD_destroy_response( response ); + // FIXME: Add a settle time so that we can actually send the response. + exit_mutex.unlock(); + } + else + { + response_ptr response = MHD_create_response_from_data( strlen(url), (void*)url, MHD_NO, MHD_NO ); + ret = MHD_queue_response( connection, MHD_HTTP_OK, response ); + MHD_destroy_response( response ); + } + + return ret; +} + +int main( int argc, char* argv[] ) +{ + // TODO: Kill all other instances on startup. + + if ( argc != 2 ) { + std::cout << "Usage:" << std::endl; + std::cout << "\t" << argv[0] << " " << std::endl; + return EXIT_FAILURE; + } + + struct MHD_Daemon* daemon = MHD_start_daemon( MHD_USE_THREAD_PER_CONNECTION, + atoi(argv[1]), nullptr, nullptr, + &ahc_echo, nullptr, MHD_OPTION_END); + if ( daemon == nullptr ) + { + return EXIT_FAILURE; + } + + // Lock mutex twice. The second call will hang until we receive an unlock + // command from a different. This will initiate the shutdown process. + exit_mutex.lock(); + exit_mutex.lock(); + + // (void) getc (); + + MHD_stop_daemon(daemon); + + return EXIT_SUCCESS; +} From 85b158d06e2ba5447980e68ef611cdb3458624a7 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 2 Nov 2014 09:52:10 +0100 Subject: [PATCH 353/597] [spotify] Fix spelling mistake --- spotify/native/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spotify/native/main.cpp b/spotify/native/main.cpp index e317e8982..7bbfccef3 100644 --- a/spotify/native/main.cpp +++ b/spotify/native/main.cpp @@ -54,7 +54,7 @@ static int ahc_echo( void* /*cls*/, connection_ptr connection, const char* url, return MHD_YES; } - // There should no data uploaded in the GET request. + // There should be no data uploaded in the GET request. if ( *upload_data_size ) { return MHD_NO; From 1647fe6bbde139d80b689d090d24965a5a333cb0 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 2 Nov 2014 09:53:44 +0100 Subject: [PATCH 354/597] [spotify] Typedef for better readability --- spotify/native/main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spotify/native/main.cpp b/spotify/native/main.cpp index 7bbfccef3..add702102 100644 --- a/spotify/native/main.cpp +++ b/spotify/native/main.cpp @@ -29,6 +29,7 @@ // Typedef the pointers for better readability. typedef struct MHD_Connection* connection_ptr; +typedef struct MHD_Daemon* daemon_ptr; typedef struct MHD_Response* response_ptr ; std::mutex exit_mutex; @@ -90,9 +91,9 @@ int main( int argc, char* argv[] ) return EXIT_FAILURE; } - struct MHD_Daemon* daemon = MHD_start_daemon( MHD_USE_THREAD_PER_CONNECTION, - atoi(argv[1]), nullptr, nullptr, - &ahc_echo, nullptr, MHD_OPTION_END); + daemon_ptr daemon = MHD_start_daemon( MHD_USE_THREAD_PER_CONNECTION, + atoi(argv[1]), nullptr, nullptr, + &ahc_echo, nullptr, MHD_OPTION_END); if ( daemon == nullptr ) { return EXIT_FAILURE; From 7004e91bd9621d5bb58563fde7ba796d40c6fe89 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 2 Nov 2014 11:00:55 +0100 Subject: [PATCH 355/597] [spotify] Add find script for libspotify --- spotify/native/CMakeLists.txt | 1 + spotify/native/CMakeModules/FindSpotify.cmake | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 spotify/native/CMakeModules/FindSpotify.cmake diff --git a/spotify/native/CMakeLists.txt b/spotify/native/CMakeLists.txt index 24458d825..b0a0076cc 100644 --- a/spotify/native/CMakeLists.txt +++ b/spotify/native/CMakeLists.txt @@ -3,6 +3,7 @@ cmake_minimum_required( VERSION 2.8.6 ) set( CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules" ) find_package(Microhttpd REQUIRED) +find_package(Spotify REQUIRED) include(CheckCXXCompilerFlag) check_cxx_compiler_flag( "-std=c++11" CXX11_FOUND ) diff --git a/spotify/native/CMakeModules/FindSpotify.cmake b/spotify/native/CMakeModules/FindSpotify.cmake new file mode 100644 index 000000000..8fda243e2 --- /dev/null +++ b/spotify/native/CMakeModules/FindSpotify.cmake @@ -0,0 +1,22 @@ +find_package(PkgConfig) +pkg_check_modules(PC_SPOTIFY libspotify) + +find_path(SPOTIFY_INCLUDE_DIR libspotify/api.h + HINTS + ${PC_SPOTIFY_INCLUDEDIR} + ${PC_SPOTIFY_INCLUDE_DIRS} +) + +find_library(SPOTIFY_LIBRARY NAMES spotify + HINTS + ${PC_SPOTIFY_LIBDIR} + ${PC_SPOTIFY_LIBRARY_DIRS} +) + +set(SPOTIFY_VERSION ${PC_SPOTIFY_VERSION}) + +find_package_handle_standard_args(Spotify + REQUIRED_VARS SPOTIFY_INCLUDE_DIR SPOTIFY_LIBRARY + VERSION_VAR SPOTIFY_VERSION +) + From 4b2646896b773f7eb832c978d8b5b21faa561d23 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 2 Nov 2014 20:45:55 +0100 Subject: [PATCH 356/597] [beatsmusic] Add 0.8+ prefix to description --- beatsmusic/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beatsmusic/content/metadata.json b/beatsmusic/content/metadata.json index 8579d48c5..63432b1a2 100644 --- a/beatsmusic/content/metadata.json +++ b/beatsmusic/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.1", "website": "http://gettomahawk.com", - "description": "Stream music from Beats Music.", + "description": "(0.8+) Stream music from Beats Music.", "type": "resolver/javascript", "manifest": { "main": "contents/code/beatsmusic.js", From 0aa8f369367c9aa719e674c16631089f7ff29cde Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sun, 2 Nov 2014 20:46:17 +0100 Subject: [PATCH 357/597] [beatsmusic] Bump version --- beatsmusic/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beatsmusic/content/metadata.json b/beatsmusic/content/metadata.json index 63432b1a2..71561e6c2 100644 --- a/beatsmusic/content/metadata.json +++ b/beatsmusic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "beatsmusic", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.1", + "version": "0.1.2", "website": "http://gettomahawk.com", "description": "(0.8+) Stream music from Beats Music.", "type": "resolver/javascript", From a05d0d47e256c7373de08da370dcf9dde129a4c1 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Mon, 3 Nov 2014 09:30:02 +0100 Subject: [PATCH 358/597] [gmusic] Trim down README --- gmusic/README.md | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/gmusic/README.md b/gmusic/README.md index 0b2f71b60..e4e05c78b 100644 --- a/gmusic/README.md +++ b/gmusic/README.md @@ -1,30 +1,3 @@ - -This is a Tomahawk resolver for Google Music. - -[Tomahawk] is a music player which decouples your library and playlists -from individual sources and presents a unified view. When you play a -track Tomahawk will use the best version available from its configured -sources. You can build playlists and share tracks without thinking -about which of your services and libraries have a particular track. - -This is a [resolver], a plugin for Tomahawk responsible for interfacing -with an external music source, in this case Google Music. It can stream -tracks from your uploaded library. When you search for tracks -you'll get results from Google Music. In the future you'll also be able -to browse your library and sync playlists. - -[tomahawk]: http://www.tomahawk-player.org/ -[resolver]: http://www.tomahawk-player.org/resolvers.html - -Installing -========== - -In Tomahawk's Services configuration dialog, click "Install from File" -and choose `content/contents/code/gmusic.js`. Click the gear icon and -enter your Google email and password. Check the Tomahawk log file to -make sure the login succeeded. Unfortunately there's no way to provide -status information through the Tomahawk user interface. - Copying ======= From 3c8348a4cb5155ee80bd84e2ebf00179f9c56211 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Mon, 3 Nov 2014 10:04:48 +0100 Subject: [PATCH 359/597] [grooveshark] Bump version --- grooveshark/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grooveshark/content/metadata.json b/grooveshark/content/metadata.json index 2dd4ac382..be0d8bfae 100644 --- a/grooveshark/content/metadata.json +++ b/grooveshark/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "grooveshark", "author": "Leo Franchi and Enno", "email": "lfranchi@kde.org", - "version": "0.7.0", + "version": "0.8.0", "website": "http://gettomahawk.com", "description": "Searches Grooveshark for playable tracks. Requires a VIP account.", "type": "resolver/javascript", From 145a6ba84c4dc898e5d14a6fa053593556ec2c20 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Mon, 3 Nov 2014 10:09:19 +0100 Subject: [PATCH 360/597] [soundcloud] Bump version --- soundcloud/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/soundcloud/content/metadata.json b/soundcloud/content/metadata.json index 4e4eaa91a..72a62ccaa 100644 --- a/soundcloud/content/metadata.json +++ b/soundcloud/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "soundcloud", "author": "Thierry Göckel", "email": "thierry@strayrayday.lu", - "version": "0.9.6", + "version": "0.9.7", "website": "http://gettomahawk.com", "description": "Resolves to playable tracks on SoundCloud, including live, cover and remixed versions if specified.", "type": "resolver/javascript", From 9eb42866297dee4adf6f36dc4d2742fe7ea14cca Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 4 Nov 2014 22:53:43 +0100 Subject: [PATCH 361/597] Added tomahawk-metadata and hatchet-metadata resolvers --- .../content/contents/code/hatchet-metadata.js | 81 +++++++++++++++ .../contents/code/hatchet-metadata.png | Bin 0 -> 20593 bytes .../content/contents/images/icon.png | Bin 0 -> 20593 bytes hatchet-metadata/content/metadata.json | 18 ++++ .../contents/code/tomahawk-metadata.js | 93 ++++++++++++++++++ .../contents/code/tomahawk-metadata.png | Bin 0 -> 7663 bytes .../content/contents/images/icon.png | Bin 0 -> 16313 bytes tomahawk-metadata/content/metadata.json | 18 ++++ 8 files changed, 210 insertions(+) create mode 100644 hatchet-metadata/content/contents/code/hatchet-metadata.js create mode 100644 hatchet-metadata/content/contents/code/hatchet-metadata.png create mode 100644 hatchet-metadata/content/contents/images/icon.png create mode 100644 hatchet-metadata/content/metadata.json create mode 100644 tomahawk-metadata/content/contents/code/tomahawk-metadata.js create mode 100644 tomahawk-metadata/content/contents/code/tomahawk-metadata.png create mode 100644 tomahawk-metadata/content/contents/images/icon.png create mode 100644 tomahawk-metadata/content/metadata.json diff --git a/hatchet-metadata/content/contents/code/hatchet-metadata.js b/hatchet-metadata/content/contents/code/hatchet-metadata.js new file mode 100644 index 000000000..270cc1040 --- /dev/null +++ b/hatchet-metadata/content/contents/code/hatchet-metadata.js @@ -0,0 +1,81 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2014, Enno Gottschalk + * + * Tomahawk is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tomahawk is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tomahawk. If not, see . + */ + +var HatchetMetadataResolver = Tomahawk.extend(TomahawkResolver, { + settings: { + name: 'Hatchet Metadata', + icon: 'hatchet-metadata.png', + weight: 0, // We cannot resolve, so use minimum weight + timeout: 15 + }, + + init: function () { + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + }, + + resolve: function (qid, artist, album, title) { + Tomahawk.addTrackResults({ results: [], qid: qid }); + }, + + search: function (qid, searchString) { + Tomahawk.addTrackResults({ results: [], qid: qid }); + }, + + canParseUrl: function (url, type) { + switch (type) { + case TomahawkUrlType.Album: + return /https?:\/\/(www\.)?hatchet\.is\/music\/[^\/\n]+\/[^\/\n]+/.test(url); + case TomahawkUrlType.Artist: + return /https?:\/\/(www\.)?hatchet\.is\/music\/[^\/\n]+/.test(url); + case TomahawkUrlType.Track: + return /https?:\/\/(www\.)?hatchet\.is\/music\/[^\/\n]+\/_\/[^\/\n]+/.test(url) + default: + return false; + } + }, + + lookupUrl: function (url) { + var urlParts = url.split('/').filter(function (item) { + return item.length != 0; + }).map(decodeURIComponent); + if (/https?:\/\/(www\.)?hatchet\.is\/music\/[^\/\n]+\/[^\/\n]+/.test(url)) { + // We have to deal with an Album + Tomahawk.addUrlResult(url, { + type: 'album', + artist: urlParts[urlParts.length - 2], + name: urlParts[urlParts.length - 1] + }); + } else if (/https?:\/\/(www\.)?hatchet\.is\/music\/[^\/\n]+/.test(url)) { + // We have to deal with an Artist + Tomahawk.addUrlResult(url, { + type: 'artist', + name: urlParts[urlParts.length - 1] + }); + } else if (/https?:\/\/(www\.)?hatchet\.is\/music\/[^\/\n]+\/_\/[^\/\n]+/.test(url)) { + // We have to deal with a Track + Tomahawk.addUrlResult(url, { + type: "track", + artist: urlParts[urlParts.length - 3], + title: urlParts[urlParts.length - 1] + }); + } + } +}); + +Tomahawk.resolver.instance = TomaHKMetadataResolver; + diff --git a/hatchet-metadata/content/contents/code/hatchet-metadata.png b/hatchet-metadata/content/contents/code/hatchet-metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..0653d833d88380dc4092d02216d8c47e732a4dd8 GIT binary patch literal 20593 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 QPyhe`07*qoM6N<$f-ylN)c^nh literal 0 HcmV?d00001 diff --git a/hatchet-metadata/content/contents/images/icon.png b/hatchet-metadata/content/contents/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0653d833d88380dc4092d02216d8c47e732a4dd8 GIT binary patch literal 20593 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 QPyhe`07*qoM6N<$f-ylN)c^nh literal 0 HcmV?d00001 diff --git a/hatchet-metadata/content/metadata.json b/hatchet-metadata/content/metadata.json new file mode 100644 index 000000000..c59676b5a --- /dev/null +++ b/hatchet-metadata/content/metadata.json @@ -0,0 +1,18 @@ +{ + "name": "Hatchet Metadata", + "pluginName": "hatchet-metadata", + "author": "Enno Gottschalk", + "email": "mrmaffen@googlemail.com", + "version": "0.1.0", + "website": "http://gettomahawk.com", + "description": "Supports loading/drag'n'drop of hatchet.is URLs.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/hatchet-metadata.js", + "scripts": [], + "icon": "contents/images/icon.png", + "resources": [ + "contents/code/hatchet-metadata.png" + ] + } +} diff --git a/tomahawk-metadata/content/contents/code/tomahawk-metadata.js b/tomahawk-metadata/content/contents/code/tomahawk-metadata.js new file mode 100644 index 000000000..84865ce59 --- /dev/null +++ b/tomahawk-metadata/content/contents/code/tomahawk-metadata.js @@ -0,0 +1,93 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2014, Enno Gottschalk + * + * Tomahawk is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tomahawk is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tomahawk. If not, see . + */ + +var TomahawkMetadataResolver = Tomahawk.extend(TomahawkResolver, { + settings: { + name: 'Tomahawk Metadata', + icon: 'tomahawk-metadata.png', + weight: 0, // We cannot resolve, so use minimum weight + timeout: 15 + }, + + init: function () { + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + }, + + resolve: function (qid, artist, album, title) { + Tomahawk.addTrackResults({ results: [], qid: qid }); + }, + + search: function (qid, searchString) { + Tomahawk.addTrackResults({ results: [], qid: qid }); + }, + + canParseUrl: function (url, type) { + switch (type) { + case TomahawkUrlType.Album: + return /^tomahawk:\/\/view\/album\/?\?$/.test(url); + case TomahawkUrlType.Artist: + return /^tomahawk:\/\/view\/artist\/?\?$/.test(url); + case TomahawkUrlType.Track: + return /^tomahawk:\/\/(queue\/add|play)\/track\/?\?$/.test(url); + default: + return false; + } + }, + + lookupUrl: function (url) { + Tomahawk.log("lookupUrl: " + url); + if (/^tomahawk:\/\/view\/album\/?\?$/.test(url)) { + Tomahawk.log("Found an album"); + // We have to deal with an Album + Tomahawk.addUrlResult(url, { + type: 'album', + artist: this._getQueryVariable(url, 'artist'), + name: this._getQueryVariable(url, 'name') + }); + } else if (/^tomahawk:\/\/view\/artist\/?\?$/.test(url)) { + Tomahawk.log("Found an artist"); + // We have to deal with an Artist + Tomahawk.addUrlResult(url, { + type: 'artist', + name: this._getQueryVariable(url, 'name') + }); + } else if (/^tomahawk:\/\/(queue\/add|play)\/track\/?\?$/.test(url)) { + Tomahawk.log("Found a track"); + // We have to deal with a Track + Tomahawk.addUrlResult(url, { + type: "track", + artist: this._getQueryVariable(url, 'artist'), + title: this._getQueryVariable(url, 'title') + }); + } + }, + + _getQueryVariable: function (url, variable) { + var parts = url.split('?'); + var vars = parts[parts.length - 1].split('&'); + for (var i = 0; i < vars.length; i++) { + var pair = vars[i].split('='); + if (decodeURIComponent(pair[0]) == variable) { + return decodeURIComponent(pair[1]); + } + } + } +}); + +Tomahawk.resolver.instance = TomahawkMetadataResolver; + diff --git a/tomahawk-metadata/content/contents/code/tomahawk-metadata.png b/tomahawk-metadata/content/contents/code/tomahawk-metadata.png new file mode 100644 index 0000000000000000000000000000000000000000..8461e9952315e59fdf21e4cff7843cad8e63d7f1 GIT binary patch literal 7663 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 literal 0 HcmV?d00001 diff --git a/tomahawk-metadata/content/contents/images/icon.png b/tomahawk-metadata/content/contents/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ccf7b30f6949791f8fa0ea23616add5b84db14 GIT binary patch literal 16313 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 nHQ?9BP)`H;-$TCnM7s%YsH_}<$@=t Date: Tue, 4 Nov 2014 23:18:27 +0100 Subject: [PATCH 362/597] [spotify-metadata] Instead of using splice(1,1) use non-capturing group in regexp --- spotify-metadata/content/contents/code/spotify-metadata.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spotify-metadata/content/contents/code/spotify-metadata.js b/spotify-metadata/content/contents/code/spotify-metadata.js index 60f5dea50..31aa07709 100644 --- a/spotify-metadata/content/contents/code/spotify-metadata.js +++ b/spotify-metadata/content/contents/code/spotify-metadata.js @@ -54,8 +54,7 @@ var SpotifyMetadataResolver = Tomahawk.extend(TomahawkResolver, { var match = url.match(/spotify:(album|artist|track):(.*)/); var playlistmatch = url.match(/spotify:user:[0-9]*:playlist:(.*)/); if (match == null) { - match = url.match(/https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]*)/); - if (match != null) match.splice(1, 1); + match = url.match(/https?:\/\/(?:play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]+)/); } if (match != null) { var query = 'https://ws.spotify.com/lookup/1/.json?uri=spotify:' + match[1] + ':' + match[2]; From 3ae88d0250ccc2f90113b8560845bea1f52d6c3e Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 5 Nov 2014 00:30:13 +0100 Subject: [PATCH 363/597] [spotify-metadata] Added log output, improved regexps, allow playlist url handling --- .../content/contents/code/spotify-metadata.js | 51 +++++++++++++------ 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/spotify-metadata/content/contents/code/spotify-metadata.js b/spotify-metadata/content/contents/code/spotify-metadata.js index 31aa07709..35953f09c 100644 --- a/spotify-metadata/content/contents/code/spotify-metadata.js +++ b/spotify-metadata/content/contents/code/spotify-metadata.js @@ -36,51 +36,71 @@ var SpotifyMetadataResolver = Tomahawk.extend(TomahawkResolver, { canParseUrl: function (url, type) { switch (type) { case TomahawkUrlType.Album: - return /spotify:album:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/album\//.test(url); + return /spotify:album:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/album\/([^\/\?]+)/.test(url); case TomahawkUrlType.Artist: - return /spotify:artist:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/artist\//.test(url); + return /spotify:artist:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/artist\/([^\/\?]+)/.test(url); case TomahawkUrlType.Playlist: - return /spotify:user:[0-9]*:playlist:/.test(url); + return /spotify:user:([^:]+):playlist:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/user\/([^\/]+)\/playlist\/([^\/\?]+)/.test(url);; case TomahawkUrlType.Track: - return /spotify:track:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/track\//.test(url); + return /spotify:track:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/track\/([^\/\?]+)/.test(url); // case TomahawkUrlType.Any: default: - return /spotify:(album|artist|track|user):/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\//.test(url); + return /spotify:(album|artist|track):([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]+)/.test(url) + || /spotify:user:([^:]+):playlist:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/user\/([^\/]+)\/playlist\/([^\/\?]+)/.test(url); } }, lookupUrl: function (url) { + Tomahawk.log("lookupUrl: '" + url + "'"); var that = this; - var match = url.match(/spotify:(album|artist|track):(.*)/); - var playlistmatch = url.match(/spotify:user:[0-9]*:playlist:(.*)/); + var match = url.match(/spotify:(album|artist|track):([^:]+)/); if (match == null) { match = url.match(/https?:\/\/(?:play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]+)/); } + var playlistmatch = url.match(/spotify:user:([^:]+):playlist:([^:]+)/); + if (playlistmatch == null) { + var playlistmatch = url.match(/https?:\/\/(?:play|open)\.spotify\.[^\/]+\/user\/([^\/]+)\/playlist\/([^\/\?]+)/); + } if (match != null) { var query = 'https://ws.spotify.com/lookup/1/.json?uri=spotify:' + match[1] + ':' + match[2]; + Tomahawk.log("Found album/artist/track, calling " + query); Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); if (match[1] == "artist") { - Tomahawk.addUrlResult(url, { + var result = { type: "artist", name: res.artist.name - }); + }; + Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found artist '" + result.name + "'"); } else if (match[1] == "album") { - Tomahawk.addUrlResult(url, { + var result = { type: "album", name: res.album.name, - artist: res.album.artist, - }); + artist: res.album.artist + }; + Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found album '" + result.name + "' by '" + result.artist + "'"); } else if (match[1] == "track") { - Tomahawk.addUrlResult(url, { + var result = { type: "track", title: res.track.name, artist: res.track.artists.map(function (item) { return item.name; }).join(" & ") - }); + }; + Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found track '" + result.title + "' by '" + result.artist + "'"); } }); } else if (playlistmatch != null) { - var query = 'http://spotikea.tomahawk-player.org/browse/' + url; + var query = 'http://spotikea.tomahawk-player.org/browse/spotify:user:' + playlistmatch[1] + + ':playlist:' + playlistmatch[2]; + Tomahawk.log("Found playlist, calling url: '" + query + "'"); Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); var result = { @@ -94,6 +114,7 @@ var SpotifyMetadataResolver = Tomahawk.extend(TomahawkResolver, { }; result.tracks = res.playlist.result.map(function (item) { return { type: "track", title: item.title, artist: item.artist }; }); Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found playlist '" + result.title + "' containing " + result.tracks.length + " tracks"); }); } } From 81e7e3703ba232832bfa3802c9becaca49ba8542 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 5 Nov 2014 00:53:37 +0100 Subject: [PATCH 364/597] [spotify] Added log output, improved regexps, allow playlist url handling --- spotify/content/contents/code/spotify.js | 54 ++++++++++++++++-------- 1 file changed, 37 insertions(+), 17 deletions(-) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index 6d072b7a7..2302a4083 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -228,52 +228,71 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { canParseUrl: function (url, type) { switch (type) { case TomahawkUrlType.Album: - return /spotify:album:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/album\//.test(url); + return /spotify:album:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/album\/([^\/\?]+)/.test(url); case TomahawkUrlType.Artist: - return /spotify:artist:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/artist\//.test(url); + return /spotify:artist:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/artist\/([^\/\?]+)/.test(url); case TomahawkUrlType.Playlist: - return /spotify:user:[0-9]*:playlist:/.test(url); + return /spotify:user:([^:]+):playlist:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/user\/([^\/]+)\/playlist\/([^\/\?]+)/.test(url);; case TomahawkUrlType.Track: - return /spotify:track:/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/track\//.test(url); + return /spotify:track:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/track\/([^\/\?]+)/.test(url); // case TomahawkUrlType.Any: default: - return /spotify:(album|artist|track|user):/.test(url) || /https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\//.test(url); + return /spotify:(album|artist|track):([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]+)/.test(url) + || /spotify:user:([^:]+):playlist:([^:]+)/.test(url) + || /https?:\/\/(?:play|open)\.spotify\.[^\/]+\/user\/([^\/]+)\/playlist\/([^\/\?]+)/.test(url); } }, lookupUrl: function (url) { + Tomahawk.log("lookupUrl: '" + url + "'"); var that = this; - var match = url.match(/spotify:(album|artist|track):(.*)/); - var playlistmatch = url.match(/spotify:user:[0-9]*:playlist:(.*)/); + var match = url.match(/spotify:(album|artist|track):([^:]+)/); if (match == null) { - match = url.match(/https?:\/\/(play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]*)/); - if (match != null) match.splice(1, 1); + match = url.match(/https?:\/\/(?:play|open)\.spotify\.[^\/]+\/(album|artist|track)\/([^\/\?]+)/); + } + var playlistmatch = url.match(/spotify:user:([^:]+):playlist:([^:]+)/); + if (playlistmatch == null) { + var playlistmatch = url.match(/https?:\/\/(?:play|open)\.spotify\.[^\/]+\/user\/([^\/]+)\/playlist\/([^\/\?]+)/); } if (match != null) { var query = 'https://ws.spotify.com/lookup/1/.json?uri=spotify:' + match[1] + ':' + match[2]; + Tomahawk.log("Found album/artist/track, calling " + query); Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); if (match[1] == "artist") { - Tomahawk.addUrlResult(url, { + var result = { type: "artist", name: res.artist.name - }); + }; + Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found artist '" + result.name + "'"); } else if (match[1] == "album") { - Tomahawk.addUrlResult(url, { + var result = { type: "album", name: res.album.name, - artist: res.album.artist, - }); + artist: res.album.artist + }; + Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found album '" + result.name + "' by '" + result.artist + "'"); } else if (match[1] == "track") { - Tomahawk.addUrlResult(url, { + var result = { type: "track", title: res.track.name, artist: res.track.artists.map(function (item) { return item.name; }).join(" & ") - }); + }; + Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found track '" + result.title + "' by '" + result.artist + "'"); } }); } else if (playlistmatch != null) { - var query = 'http://spotikea.tomahawk-player.org/browse/' + url; + var query = 'http://spotikea.tomahawk-player.org/browse/spotify:user:' + playlistmatch[1] + + ':playlist:' + playlistmatch[2]; + Tomahawk.log("Found playlist, calling url: '" + query + "'"); Tomahawk.asyncRequest(query, function (xhr) { var res = JSON.parse(xhr.responseText); var result = { @@ -287,6 +306,7 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { }; result.tracks = res.playlist.result.map(function (item) { return { type: "track", title: item.title, artist: item.artist }; }); Tomahawk.addUrlResult(url, result); + Tomahawk.log("Reported found playlist '" + result.title + "' containing " + result.tracks.length + " tracks"); }); } } From 0cebea2d367cea96983a6f227a9fbc93f0848e60 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 5 Nov 2014 20:10:10 +0100 Subject: [PATCH 365/597] [deezer-metadata] Mention that we only support 0.8 + --- deezer-metadata/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deezer-metadata/content/metadata.json b/deezer-metadata/content/metadata.json index c31d6b26f..89a68e095 100644 --- a/deezer-metadata/content/metadata.json +++ b/deezer-metadata/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.1", "website": "http://gettomahawk.com", - "description": "Supports loading and drag & drop of Deezer URLs.", + "description": "(0.8+) Supports loading and drag & drop of Deezer URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/deezer-metadata.js", From cf1ebdc4217b9ad74959a32dc78b6ccf02a2d922 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 5 Nov 2014 20:10:34 +0100 Subject: [PATCH 366/597] [deezer-metadata] Bump version --- deezer-metadata/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deezer-metadata/content/metadata.json b/deezer-metadata/content/metadata.json index 89a68e095..a84d8369d 100644 --- a/deezer-metadata/content/metadata.json +++ b/deezer-metadata/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "deezer-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.1", + "version": "0.1.2", "website": "http://gettomahawk.com", "description": "(0.8+) Supports loading and drag & drop of Deezer URLs.", "type": "resolver/javascript", From 374b96ae0a123db8b7eedea11310d5b88235cb99 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 5 Nov 2014 20:13:56 +0100 Subject: [PATCH 367/597] [rdio-metadata] Mention that we only support 0.8 + --- rdio-metadata/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdio-metadata/content/metadata.json b/rdio-metadata/content/metadata.json index d042a74a9..a63b49a7b 100644 --- a/rdio-metadata/content/metadata.json +++ b/rdio-metadata/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.0", "website": "http://gettomahawk.com", - "description": "Supports loading and drag & drop of Rdio URLs.", + "description": "(0.8+) Supports loading and drag & drop of Rdio URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/rdio-metadata.js", From 10bd5527b924aca1ebdfecac8f9c3326543a9835 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 5 Nov 2014 20:14:12 +0100 Subject: [PATCH 368/597] [rdio-metadata] Bump version --- rdio-metadata/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rdio-metadata/content/metadata.json b/rdio-metadata/content/metadata.json index a63b49a7b..dfa998e28 100644 --- a/rdio-metadata/content/metadata.json +++ b/rdio-metadata/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "rdio-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.0", + "version": "0.1.1", "website": "http://gettomahawk.com", "description": "(0.8+) Supports loading and drag & drop of Rdio URLs.", "type": "resolver/javascript", From 80d05ff79af85604648d8e0592e940180023bc7c Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 5 Nov 2014 21:34:18 +0100 Subject: [PATCH 369/597] Update HACKING.md to include info regarding cross-compatibility with the Android app --- HACKING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HACKING.md b/HACKING.md index 1d0c32cba..6739bf3de 100644 --- a/HACKING.md +++ b/HACKING.md @@ -2,9 +2,9 @@ ## Developing resolvers -The Tomahawk resolver API is currently still in flux. You can use some of the existing resolvers as inspiration, especially Subsonic and Ex.fm. +The Tomahawk resolver API is currently still in flux. You can use some of the existing resolvers as inspiration, especially Subsonic and Soundcloud. -The API you should develop against is defined in [`tomahawk.js`](https://github.com/tomahawk-player/tomahawk/blob/master/data/js/tomahawk.js) and [`JSResolverHelper`](https://github.com/tomahawk-player/tomahawk/blob/master/src/libtomahawk/resolvers/JSResolverHelper.h) in the Tomahawk main repo. +The API you should develop against is defined in [`tomahawk.js`](https://github.com/tomahawk-player/tomahawk/blob/master/data/js/tomahawk.js) and [`JSResolverHelper`](https://github.com/tomahawk-player/tomahawk/blob/master/src/libtomahawk/resolvers/JSResolverHelper.h) in the Tomahawk main repo. This API is also being used in the [`Tomahawk Android`](https://github.com/tomahawk-player/tomahawk-android) App, which means that you only have to write one resolver and have it work right away on Desktop and Android! If you have questions, look for us in #tomahawk on irc.freenode.net. From 89eca16a3aca7066bc2bf98c20fa1d59e1cfbc1d Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Wed, 5 Nov 2014 23:40:25 +0100 Subject: [PATCH 370/597] [beatsmusic] Bump version --- beatsmusic/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beatsmusic/content/metadata.json b/beatsmusic/content/metadata.json index 71561e6c2..641b02077 100644 --- a/beatsmusic/content/metadata.json +++ b/beatsmusic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "beatsmusic", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.2", + "version": "0.1.3", "website": "http://gettomahawk.com", "description": "(0.8+) Stream music from Beats Music.", "type": "resolver/javascript", From 1f2d7cd860cc50d50c960ea7fc6f3b2ad7626044 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 6 Nov 2014 00:26:17 +0100 Subject: [PATCH 371/597] [deezer-metadata] Bump version --- deezer-metadata/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deezer-metadata/content/metadata.json b/deezer-metadata/content/metadata.json index a84d8369d..ed092c74c 100644 --- a/deezer-metadata/content/metadata.json +++ b/deezer-metadata/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "deezer-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.2", + "version": "0.1.3", "website": "http://gettomahawk.com", "description": "(0.8+) Supports loading and drag & drop of Deezer URLs.", "type": "resolver/javascript", From 56bcb6632f4c0b815222428c965f490ee6e776d9 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 6 Nov 2014 00:26:49 +0100 Subject: [PATCH 372/597] [deezer-metadata] Don't use ampersands in descriptions as this will break attica --- deezer-metadata/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deezer-metadata/content/metadata.json b/deezer-metadata/content/metadata.json index ed092c74c..5f42c7171 100644 --- a/deezer-metadata/content/metadata.json +++ b/deezer-metadata/content/metadata.json @@ -5,7 +5,7 @@ "email": "uwelk@xhochy.com", "version": "0.1.3", "website": "http://gettomahawk.com", - "description": "(0.8+) Supports loading and drag & drop of Deezer URLs.", + "description": "(0.8+) Supports loading and drag and drop of Deezer URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/deezer-metadata.js", From 79b84d552a826cf20ba8f5459b50cf5eb9004cb7 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 6 Nov 2014 12:18:36 +0100 Subject: [PATCH 373/597] Add Node to HACKING.md --- HACKING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HACKING.md b/HACKING.md index 6739bf3de..9d4bddb87 100644 --- a/HACKING.md +++ b/HACKING.md @@ -4,7 +4,7 @@ The Tomahawk resolver API is currently still in flux. You can use some of the existing resolvers as inspiration, especially Subsonic and Soundcloud. -The API you should develop against is defined in [`tomahawk.js`](https://github.com/tomahawk-player/tomahawk/blob/master/data/js/tomahawk.js) and [`JSResolverHelper`](https://github.com/tomahawk-player/tomahawk/blob/master/src/libtomahawk/resolvers/JSResolverHelper.h) in the Tomahawk main repo. This API is also being used in the [`Tomahawk Android`](https://github.com/tomahawk-player/tomahawk-android) App, which means that you only have to write one resolver and have it work right away on Desktop and Android! +The API you should develop against is defined in [`tomahawk.js`](https://github.com/tomahawk-player/tomahawk/blob/master/data/js/tomahawk.js) and [`JSResolverHelper`](https://github.com/tomahawk-player/tomahawk/blob/master/src/libtomahawk/resolvers/JSResolverHelper.h) in the Tomahawk main repo. This API is also being used in the [`Tomahawk Android`](https://github.com/tomahawk-player/tomahawk-android) App. Furthermore we also have an implementation in [`NodeJS`](https://github.com/xhochy/node-tomahawkjs). This means that you only have to write one resolver and have it work right away on Desktop, Android and Node! If you have questions, look for us in #tomahawk on irc.freenode.net. From dab6852c90ee3f3c03e2ea4064db5c80f36fc80c Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Thu, 6 Nov 2014 09:34:07 -0500 Subject: [PATCH 374/597] Remove ampersand and bump version for Tomahk and Rdio metadata resolvers --- rdio-metadata/content/metadata.json | 4 ++-- tomahk-metadata/content/metadata.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rdio-metadata/content/metadata.json b/rdio-metadata/content/metadata.json index dfa998e28..066587da7 100644 --- a/rdio-metadata/content/metadata.json +++ b/rdio-metadata/content/metadata.json @@ -3,9 +3,9 @@ "pluginName": "rdio-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.1", + "version": "0.1.2", "website": "http://gettomahawk.com", - "description": "(0.8+) Supports loading and drag & drop of Rdio URLs.", + "description": "(0.8+) Supports loading and drag and drop of Rdio URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/rdio-metadata.js", diff --git a/tomahk-metadata/content/metadata.json b/tomahk-metadata/content/metadata.json index 29997611b..ee800d6f4 100644 --- a/tomahk-metadata/content/metadata.json +++ b/tomahk-metadata/content/metadata.json @@ -3,9 +3,9 @@ "pluginName": "tomahk-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.0", + "version": "0.1.1", "website": "http://gettomahawk.com", - "description": "Supports loading and drag & drop of toma.hk URLs.", + "description": "Supports loading and drag and drop of toma.hk URLs.", "type": "resolver/javascript", "manifest": { "main": "contents/code/tomahk-metadata.js", From 9c6870603886eae301c9f6cf3a85ec9db9b33a80 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Thu, 6 Nov 2014 09:36:17 -0500 Subject: [PATCH 375/597] Remove ampersand from Spotify metadata resolver and bump version --- spotify-metadata/content/metadata.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spotify-metadata/content/metadata.json b/spotify-metadata/content/metadata.json index 4a7940b26..92a484266 100644 --- a/spotify-metadata/content/metadata.json +++ b/spotify-metadata/content/metadata.json @@ -3,9 +3,9 @@ "pluginName": "spotify-metadata", "author": "Uwe L. Korn", "email": "uwelk@xhochy.com", - "version": "0.1.1", + "version": "0.1.2", "website": "http://gettomahawk.com", - "description": "Supports loading and drag & drop of Spotify artist and track URLs (no Spotify account required)", + "description": "Supports drag and drop of Spotify artist and track URLs (no Spotify account required)", "type": "resolver/javascript", "manifest": { "main": "contents/code/spotify-metadata.js", From 8a07dc4aef6938dd884d41e0ab64301d14ec3720 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 6 Nov 2014 19:57:30 +0100 Subject: [PATCH 376/597] [gmusic] Add note about using the mobile apps first --- gmusic/content/contents/code/config.ui | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gmusic/content/contents/code/config.ui b/gmusic/content/contents/code/config.ui index 7f071813f..c64302ba9 100644 --- a/gmusic/content/contents/code/config.ui +++ b/gmusic/content/contents/code/config.ui @@ -6,8 +6,8 @@ 0 0 - 250 - 120 + 393 + 203 @@ -27,6 +27,16 @@ + + + + Note that for the Google Music plug-in to work you must first login using the official Google Music iOS or Android app and play a song. After you've done that Tomahawk should then be able to authenticate with your account. + + + true + + + From e5131a073baeb7710a8cd63ee1495219bf35c9f6 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Thu, 6 Nov 2014 19:57:39 +0100 Subject: [PATCH 377/597] [gmusic] Bump version --- gmusic/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index 916f1b90e..3a0fdb253 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "gmusic", "author": "Sam Hanes, Lalit Maganti, Enno Gottschalk", "email": "sam@maltera.com, lalitmaganti@gmail.com, mrmaffen@gmail.com", - "version": "0.4", + "version": "0.4.1", "website": "http://gettomahawk.com", "description": "Streams music from your Google Play Music locker and the entire Google Music catalog for subscribers.", "type": "resolver/javascript", From 04441261abda0577f013aaa4891892bbee77df81 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Fri, 7 Nov 2014 12:20:34 +0100 Subject: [PATCH 378/597] Add Urllookup to capabilities. --- bandcamp/content/contents/code/bandcamp.js | 147 ++++++++++++++++++++- 1 file changed, 142 insertions(+), 5 deletions(-) diff --git a/bandcamp/content/contents/code/bandcamp.js b/bandcamp/content/contents/code/bandcamp.js index 6cdd8fbf1..dc6987398 100644 --- a/bandcamp/content/contents/code/bandcamp.js +++ b/bandcamp/content/contents/code/bandcamp.js @@ -29,8 +29,14 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { spell: function(a){magic = function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d;}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64));}).join("");};return magic(a);}, - init: function () { + init: function (callback) { this.secret = this.spell(this.wand); + + + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + if (callback) { + callback(null); + } }, resolve: function (qid, artist, album, title) { @@ -42,13 +48,13 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { var that = this; Tomahawk.asyncRequest(findArtistUrl, function (xhr) { var response = JSON.parse(xhr.responseText); - if (response.results !== undefined && response.results.length !== 0) { + if (response.hasOwnProperty("results") && response.results.length !== 0) { var bandcampArtistId = response.results[0].band_id; var artistDiscographyUrl = "http://api.bandcamp.com/api/band/3/discography?key=" + that.secret + "&band_id=" + bandcampArtistId; Tomahawk.asyncRequest(artistDiscographyUrl, function (xhr1) { var response1 = JSON.parse(xhr1.responseText); var results = []; - if (response1.discography !== undefined && response1.discography.length !== 0) { + if (response1.hasOwnProperty("discography") && response1.discography.length !== 0) { var result = {}; for (var i = 0; i < response1.discography.length; i++) { if (response1.discography[i].track_id && response1.discography[i].title.toLowerCase() === title.toLowerCase() && response1.discography[i].streaming_url) { @@ -63,7 +69,7 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { result.source = that.settings.name; result.checked = true; result.year = new Date(response1.release_date * 1000).getFullYear(); - if (response1.discography[i].url !== undefined){ + if (response1.discography[i].hasOwnProperty("url")){ result.linkUrl = response1.discography[i].url; } results.push(result); @@ -139,11 +145,142 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { } }); } else { + Tomahawk.log(JSON.stringify(response)); Tomahawk.addTrackResults(empty); } }); }, + canParseUrl: function (url, type) { + switch (type) { + case TomahawkUrlType.Album: + return false; + case TomahawkUrlType.Artist: + return true; + case TomahawkUrlType.Playlist: + return true; + case TomahawkUrlType.Track: + return true; + default: + return (/https?:\/\/[a-z]*\.bandcamp.com\//).test(url); // Always return true in the future (non bandcamp.com pages exist) + } + }, + + track2Result: function (track) { + var result = { + type: "track", + title: track.title + }; + if (track.downloadable === 2 && track.hasOwnProperty("streaming_url")){ + result.hint = track.streaming_url; + } + return result; + }, + + lookupUrl: function (url) { + var query = "http://api.bandcamp.com/api/url/1/info?key=" + this.secret + "&url=" + url; + result = {}; + var that = this; + Tomahawk.asyncRequest(query, function (xhr) { + var response = JSON.parse(xhr.responseText); + if (response.hasOwnProperty("band_id")){ + if (response.hasOwnProperty("track_id")){ + result.type = "track"; + query = "http://api.bandcamp.com/api/track/3/info?key=" + that.secret + "&track_id=" + response.track_id; + } + else if (response.hasOwnProperty("album_id")){ + result.type = "album"; + result.guid = "bandcamp-album-playlist-" + response.album_id; + query = "http://api.bandcamp.com/api/album/2/info?key=" + that.secret + "&album_id=" + response.album_id; + } + else { + result.type = "artist"; + result.guid = "bandcamp-artist-playlist-" + response.band_id; + query = "http://api.bandcamp.com/api/band/3/discography?key=" + that.secret + "&band_id=" + response.band_id; + } + Tomahawk.asyncRequest(query, function (xhr2) { + var response2 = JSON.parse(xhr2.responseText); + if (result.type === "artist"){ + result.type = "playlist"; + result.tracks = []; + albums = {}; + var stop = 0; + for (i = 0; i < response2.discography.length; i++){ + if (response2.discography[i].track_id){ + result.tracks.push(that.track2Result(response2.discography[i])); + } + else if (response2.discography[i].album_id){ + if (!result.hasOwnProperty("artist")){ + result.artist = response2.discography[i].artist; + result.title = result.artist + " Bandcamp discography"; + } + albums[response2.discography[i].title] = response2.discography[i].album_id; + stop++; + } + } + for (var album in albums){ + if (albums.hasOwnProperty(album)){ + query = "http://api.bandcamp.com/api/album/2/info?key=" + that.secret + "&album_id=" + albums[album]; + Tomahawk.asyncRequest(query, function (xhr3){ + var response3 = JSON.parse(xhr3.responseText); + if (response3.hasOwnProperty("tracks")){ + response3.tracks.forEach(function(track){ + result.tracks.push(that.track2Result(track)); + }); + } + stop--; + if (stop === 0){ + if (result.hasOwnProperty("tracks")){ + for (i = 0; i < result.tracks.length; i++){ + result.tracks[i].artist = result.artist; + } + } + Tomahawk.addUrlResult(url, result); + } + }); + } + } + } else { + if (result.type === "track" && response2.hasOwnProperty("title")){ + result = that.track2Result(response2); + } else if (result.type === "album" && response2.hasOwnProperty("tracks")){ + result.type = "playlist"; + result.title = response2.title; + if (response2.hasOwnProperty("about")){ + result.description = response2.about; + } + result.tracks = []; + response2.tracks.forEach(function (track){ + result.tracks.push(that.track2Result(track)); + }); + } + query = "http://api.bandcamp.com/api/band/3/info?key=" + that.secret + "&band_id=" + response2.band_id; + Tomahawk.asyncRequest(query, function (xhr3) { + var response3 = JSON.parse(xhr3.responseText); + if (response3.hasOwnProperty("name")){ + result.artist = response3.name; + if (result.type === "playlist"){ + result.title = result.artist + " - " + result.title; + } + if (result.hasOwnProperty("tracks")){ + for (i = 0; i < result.tracks.length; i++){ + result.tracks[i].artist = result.artist; + } + } + Tomahawk.log("Returning " + JSON.stringify(result) + " for " + url); + Tomahawk.addUrlResult(url, result); + } else { + Tomahawk.addUrlResult(url, {}); + } + }); + } + }); + } else { + Tomahawk.addUrlResult(url, {}); + } + }); + }, + search: function (qid, searchString) { var empty = { qid: qid, @@ -154,7 +291,7 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { getArtistPageBase: function (fullUrl) { var baseUrl = ""; - if (fullUrl.indexOf(".bandcamp.com") == -1 && fullUrl.indexOf("/album/") != -1){ + if (fullUrl.indexOf(".bandcamp.com") === -1 && fullUrl.indexOf("/album/") !== -1){ baseUrl = fullUrl.substring(0, fullUrl.indexOf("/album/")); } else { From f01d7f89a5193a4e2313e6be0a4b8d2d23c3d17d Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Fri, 7 Nov 2014 14:38:41 +0100 Subject: [PATCH 379/597] - Initially, allow any URL. - Don't report allowing artist type TomahawkUrl. --- bandcamp/content/contents/code/bandcamp.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/bandcamp/content/contents/code/bandcamp.js b/bandcamp/content/contents/code/bandcamp.js index dc6987398..c0a1bb71d 100644 --- a/bandcamp/content/contents/code/bandcamp.js +++ b/bandcamp/content/contents/code/bandcamp.js @@ -156,13 +156,14 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { case TomahawkUrlType.Album: return false; case TomahawkUrlType.Artist: - return true; + return false; case TomahawkUrlType.Playlist: return true; case TomahawkUrlType.Track: return true; default: - return (/https?:\/\/[a-z]*\.bandcamp.com\//).test(url); // Always return true in the future (non bandcamp.com pages exist) + //return (/https?:\/\/[a-z]*\.bandcamp.com\//).test(url); // Always return true in the future (non bandcamp.com pages exist) + return true; } }, @@ -179,7 +180,8 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { lookupUrl: function (url) { var query = "http://api.bandcamp.com/api/url/1/info?key=" + this.secret + "&url=" + url; - result = {}; + Tomahawk.log(query); + var result = {}; var that = this; Tomahawk.asyncRequest(query, function (xhr) { var response = JSON.parse(xhr.responseText); @@ -267,7 +269,6 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { result.tracks[i].artist = result.artist; } } - Tomahawk.log("Returning " + JSON.stringify(result) + " for " + url); Tomahawk.addUrlResult(url, result); } else { Tomahawk.addUrlResult(url, {}); From 6f816f4b4ec3f894471435b520e7b13a8abbadb5 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 18:19:21 +0100 Subject: [PATCH 380/597] [spotify] Extract exit request handling in its own function --- spotify/native/main.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/spotify/native/main.cpp b/spotify/native/main.cpp index add702102..b054996d9 100644 --- a/spotify/native/main.cpp +++ b/spotify/native/main.cpp @@ -34,6 +34,17 @@ typedef struct MHD_Response* response_ptr ; std::mutex exit_mutex; +int handle_exit(const connection_ptr connection) +{ + // Shutdown requested, unlock the relevant mutex. + response_ptr response = MHD_create_response_from_data( strlen( "OK" ), (void*)"OK", MHD_NO, MHD_NO ); + int ret = MHD_queue_response( connection, MHD_HTTP_OK, response ); + MHD_destroy_response( response ); + // FIXME: Add a settle time so that we can actually send the response. + exit_mutex.unlock(); + return ret; +} + static int ahc_echo( void* /*cls*/, connection_ptr connection, const char* url, const char* method, const char* /*version*/, const char* /*upload_data*/, size_t* upload_data_size, void** ptr) @@ -64,12 +75,7 @@ static int ahc_echo( void* /*cls*/, connection_ptr connection, const char* url, int ret; if ( !strcmp( url, "/exit" ) ) { - // Shutdown requested, unlock the relevant mutex. - response_ptr response = MHD_create_response_from_data( strlen( "OK" ), (void*)"OK", MHD_NO, MHD_NO ); - ret = MHD_queue_response( connection, MHD_HTTP_OK, response ); - MHD_destroy_response( response ); - // FIXME: Add a settle time so that we can actually send the response. - exit_mutex.unlock(); + ret = handle_exit(connection); } else { From a09fcf36703563667f7e5eeb19455996f1d42e14 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 18:20:39 +0100 Subject: [PATCH 381/597] [spotify] Debug-- --- spotify/native/main.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/spotify/native/main.cpp b/spotify/native/main.cpp index b054996d9..3ae250f20 100644 --- a/spotify/native/main.cpp +++ b/spotify/native/main.cpp @@ -57,8 +57,6 @@ static int ahc_echo( void* /*cls*/, connection_ptr connection, const char* url, return MHD_NO; } - std::cout << "Test" << std::endl; - // On the first call only the headers are valid. Reply in the second round. if ( &header_test != *ptr ) { From b2a1a3d5d4fe74d73186f024910ea53f4c3f4ac6 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Fri, 7 Nov 2014 18:23:22 +0100 Subject: [PATCH 382/597] - Open Tomahawk's artist page when dropping a Bandcamp artist page to Tomahawk. - Cleanup + safety --- bandcamp/content/contents/code/bandcamp.js | 106 +++++++-------------- 1 file changed, 33 insertions(+), 73 deletions(-) diff --git a/bandcamp/content/contents/code/bandcamp.js b/bandcamp/content/contents/code/bandcamp.js index c0a1bb71d..114845f0a 100644 --- a/bandcamp/content/contents/code/bandcamp.js +++ b/bandcamp/content/contents/code/bandcamp.js @@ -145,7 +145,6 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { } }); } else { - Tomahawk.log(JSON.stringify(response)); Tomahawk.addTrackResults(empty); } }); @@ -153,17 +152,17 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { canParseUrl: function (url, type) { switch (type) { - case TomahawkUrlType.Album: - return false; + case TomahawkUrlType.Album: //Don't rely on Tomahawk's InfoPlugins for Bandcamp's mostly rather unknown bands & albums + return false; // Albums are opened as playlists instead case TomahawkUrlType.Artist: - return false; + return true; case TomahawkUrlType.Playlist: return true; case TomahawkUrlType.Track: return true; default: - //return (/https?:\/\/[a-z]*\.bandcamp.com\//).test(url); // Always return true in the future (non bandcamp.com pages exist) - return true; + return (/https?:\/\/[a-z]*\.bandcamp.com\//).test(url); // This excludes bandcamp pages with a custom (non .bandcamp.com) URL + // return true; // go easy on API queries per key ratio } }, @@ -180,7 +179,6 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { lookupUrl: function (url) { var query = "http://api.bandcamp.com/api/url/1/info?key=" + this.secret + "&url=" + url; - Tomahawk.log(query); var result = {}; var that = this; Tomahawk.asyncRequest(query, function (xhr) { @@ -191,90 +189,52 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { query = "http://api.bandcamp.com/api/track/3/info?key=" + that.secret + "&track_id=" + response.track_id; } else if (response.hasOwnProperty("album_id")){ - result.type = "album"; + result.type = "playlist"; result.guid = "bandcamp-album-playlist-" + response.album_id; query = "http://api.bandcamp.com/api/album/2/info?key=" + that.secret + "&album_id=" + response.album_id; } else { result.type = "artist"; - result.guid = "bandcamp-artist-playlist-" + response.band_id; query = "http://api.bandcamp.com/api/band/3/discography?key=" + that.secret + "&band_id=" + response.band_id; } Tomahawk.asyncRequest(query, function (xhr2) { var response2 = JSON.parse(xhr2.responseText); - if (result.type === "artist"){ - result.type = "playlist"; - result.tracks = []; - albums = {}; - var stop = 0; - for (i = 0; i < response2.discography.length; i++){ - if (response2.discography[i].track_id){ - result.tracks.push(that.track2Result(response2.discography[i])); - } - else if (response2.discography[i].album_id){ - if (!result.hasOwnProperty("artist")){ - result.artist = response2.discography[i].artist; - result.title = result.artist + " Bandcamp discography"; - } - albums[response2.discography[i].title] = response2.discography[i].album_id; - stop++; - } - } - for (var album in albums){ - if (albums.hasOwnProperty(album)){ - query = "http://api.bandcamp.com/api/album/2/info?key=" + that.secret + "&album_id=" + albums[album]; - Tomahawk.asyncRequest(query, function (xhr3){ - var response3 = JSON.parse(xhr3.responseText); - if (response3.hasOwnProperty("tracks")){ - response3.tracks.forEach(function(track){ - result.tracks.push(that.track2Result(track)); - }); - } - stop--; - if (stop === 0){ - if (result.hasOwnProperty("tracks")){ - for (i = 0; i < result.tracks.length; i++){ - result.tracks[i].artist = result.artist; - } - } - Tomahawk.addUrlResult(url, result); - } - }); - } + if (result.type === "track" && response2.hasOwnProperty("title")){ + result = that.track2Result(response2); + } else if (result.type === "playlist" && response2.hasOwnProperty("tracks")){ + result.title = response2.title; + if (response2.hasOwnProperty("about")){ + result.description = response2.about; } + result.tracks = []; + response2.tracks.forEach(function (track){ + result.tracks.push(that.track2Result(track)); + }); } else { - if (result.type === "track" && response2.hasOwnProperty("title")){ - result = that.track2Result(response2); - } else if (result.type === "album" && response2.hasOwnProperty("tracks")){ - result.type = "playlist"; - result.title = response2.title; - if (response2.hasOwnProperty("about")){ - result.description = response2.about; - } - result.tracks = []; - response2.tracks.forEach(function (track){ - result.tracks.push(that.track2Result(track)); - }); - } - query = "http://api.bandcamp.com/api/band/3/info?key=" + that.secret + "&band_id=" + response2.band_id; - Tomahawk.asyncRequest(query, function (xhr3) { - var response3 = JSON.parse(xhr3.responseText); - if (response3.hasOwnProperty("name")){ + Tomahawk.addUrlResult(url, {}); + } + query = "http://api.bandcamp.com/api/band/3/info?key=" + that.secret + "&band_id=" + response.band_id; + Tomahawk.asyncRequest(query, function (xhr3) { + var response3 = JSON.parse(xhr3.responseText); + if (response3.hasOwnProperty("name")){ + if (result.type === "playlist"){ result.artist = response3.name; - if (result.type === "playlist"){ - result.title = result.artist + " - " + result.title; - } + result.title = result.artist + " - " + result.title; if (result.hasOwnProperty("tracks")){ - for (i = 0; i < result.tracks.length; i++){ + for (var i = 0; i < result.tracks.length; i++){ result.tracks[i].artist = result.artist; } } - Tomahawk.addUrlResult(url, result); + } else if (result.type === "artist"){ + result.name = response3.name; } else { - Tomahawk.addUrlResult(url, {}); + result.artist = response3.name; } - }); - } + Tomahawk.addUrlResult(url, result); + } else { + Tomahawk.addUrlResult(url, {}); + } + }); }); } else { Tomahawk.addUrlResult(url, {}); From 214630f89afee05d4deb6f8deedfed26ef275efd Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Fri, 7 Nov 2014 18:33:58 +0100 Subject: [PATCH 383/597] Add Bandcamp to the capabilities table. --- README.md | 51 ++++++++++++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index ba4bb42b6..23df5073e 100644 --- a/README.md +++ b/README.md @@ -37,28 +37,29 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | *Resolver* | Resolving | Search | Open Artist URL | Open Album URL | Open Playlist | Open Track URL | Collection | |:----------:|:---------:|:------:|:---------------:|:--------------:|:-------------:|:--------------:|:----------:| -| 4shared | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| 8tracks | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| ampache | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | -| beatsmusic | :key: | ✔ | ✔ | ✔ | :key: | ✔ | ✘ | -| beets | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | -| deezer-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | -| dilandu | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| exfm | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✘ | -| grooveshark | :key: | :key: | ✘ | ✘ | ✘ | ✘ | ✘ | -| jamendo | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| jazz-on-line | ? | ? | ? | ? | ? | ? | ? | -| lastfm | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | -| muzebra | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| officialfm | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| qobuz | :key: | :key: | ✘ | ✘ | ✘ | ✘ | ✘ | -| rdio-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | -| soundcloud | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | -| spotify-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | -| spotify | :key: | :key: | ✘ | ✘ | :key: | ✘ | ✘ | -| subsonic | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | -| synology-audiostation | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | -| tomahk-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | -| vibe3 | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| vkontakte | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | -| youtube | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| 4shared | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| 8tracks | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| ampache | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | +| bandcamp | ✔ | ✘ | ✔ | ✔ | ✘ | ✔ | ✘ | +| beatsmusic | :key: | ✔ | ✔ | ✔ | :key: | ✔ | ✘ | +| beets | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | +| deezer-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| dilandu | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| exfm | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✘ | +| grooveshark | :key: | :key: | ✘ | ✘ | ✘ | ✘ | ✘ | +| jamendo | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| jazz-on-line | ? | ? | ? | ? | ? | ? | ? | +| lastfm | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | ✘ | +| muzebra | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| officialfm | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| qobuz | :key: | :key: | ✘ | ✘ | ✘ | ✘ | ✘ | +| rdio-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| soundcloud | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✘ | +| spotify-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| spotify | :key: | :key: | ✘ | ✘ | :key: | ✘ | ✘ | +| subsonic | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | +| synology-audiostation | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | +| tomahk-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | +| vibe3 | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| vkontakte | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| youtube | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | From f27c8d5c54f95e22359c524454e7783174a0f5fb Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Fri, 7 Nov 2014 18:39:54 +0100 Subject: [PATCH 384/597] Version bump. --- bandcamp/content/metadata.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bandcamp/content/metadata.json b/bandcamp/content/metadata.json index 24ca896f0..1a37b9e27 100755 --- a/bandcamp/content/metadata.json +++ b/bandcamp/content/metadata.json @@ -3,11 +3,10 @@ "pluginName": "bandcamp", "author": "Thierry Göckel", "email": "thierry@strayrayday.lu", - "version": "0.1.0", + "version": "0.2.0", "website": "http://gettomahawk.com", "description": "Stream music from Bandcamp.", "platform": "any", - "tomahawkVersion": "0.6.99", "type": "resolver/javascript", "manifest": { "main": "contents/code/bandcamp.js", From 261ea931b1fee9c0d853a67d3e68bef2543aeb16 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 18:57:39 +0100 Subject: [PATCH 385/597] [spotify] Style fix --- spotify/native/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spotify/native/main.cpp b/spotify/native/main.cpp index 3ae250f20..34b34bf05 100644 --- a/spotify/native/main.cpp +++ b/spotify/native/main.cpp @@ -52,7 +52,7 @@ static int ahc_echo( void* /*cls*/, connection_ptr connection, const char* url, static int header_test; // We only expect GET requests. - if ( 0 != strcmp( method, "GET" ) ) + if ( strcmp( method, "GET" ) ) { return MHD_NO; } From 86c24fd45586db84909a27e741353a950cd48e20 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 19:09:42 +0100 Subject: [PATCH 386/597] [spofify] newConfigSaved is outdated, mark with FIXME --- spotify/content/contents/code/spotify.js | 1 + 1 file changed, 1 insertion(+) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index 2302a4083..bfbb571cb 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -53,6 +53,7 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { newConfigSaved: function () { var userConfig = this.getUserConfig(); + // FIXME if (this.user !== userConfig.user || this.password !== userConfig.password) { this.init(); } From 489b4204776e28ffa13a4d212d397c08f5be98ca Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 19:12:25 +0100 Subject: [PATCH 387/597] [spotify] We also require user/pw for the binary part until the Desktop SDK is released --- spotify/content/contents/code/spotify.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index bfbb571cb..0a9fece1f 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -88,7 +88,7 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { login: function(callback) { var that = this; var userConfig = this.getUserConfig(); - if (!userConfig.access_token || !userConfig.refresh_token) { + if (!userConfig.access_token || !userConfig.refresh_token || !userConfig.user || !userConfig.password) { Tomahawk.log("Spotify Resolver not properly configured!"); this.loggedIn = false; if (callback) { @@ -99,6 +99,8 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { this.access_token = userConfig.access_token; this.refresh_token = userConfig.refresh_token; + this.user = userConfig.user; + this.password = userConfig.password; // TODO: Maybe not from userConfig... // Also we do not want the secret in the resolver this.client_id = userConfig.client_id; From 32d57cf5169cbfbb1a700fc310c9ff90928b426f Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 19:21:09 +0100 Subject: [PATCH 388/597] Depend on node-tomahawkjs@0.3.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b5c562fad..4a8973fcc 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,6 @@ "buster": "^0.7.13", "minimist": "^1.1.0", "nock": "^0.32.0", - "tomahawkjs": "^0.3.3" + "tomahawkjs": "^0.3.4" } } From ba5e2f76adf4d8c83f6357b5935bea90a2ed0d48 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 19:27:42 +0100 Subject: [PATCH 389/597] [spotify] Add getStreamUrl skeleton --- spotify/content/contents/code/spotify.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/spotify/content/contents/code/spotify.js b/spotify/content/contents/code/spotify.js index 0a9fece1f..e805c988b 100644 --- a/spotify/content/contents/code/spotify.js +++ b/spotify/content/contents/code/spotify.js @@ -106,6 +106,8 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { this.client_id = userConfig.client_id; this.client_secret = userConfig.client_secret; + Tomahawk.addCustomUrlHandler("spotify", "getStreamUrl", true); + if (this.hasOwnProperty("access_token") && this.hasOwnProperty("refresh_token")) { // Check if access_token is still valid. var headers = { @@ -173,6 +175,11 @@ var SpotifyResolver = Tomahawk.extend(TomahawkResolver, { this.login(cb); }, + getStreamUrl: function (qid, url) { + var trackId = url.replace("spotify://track/", ""); + Tomahawk.reportStreamUrl(qid, trackId); + }, + resolve: function (qid, artist, album, title) { var that = this; var searchUrl = "https://api.spotify.com/v1/search?market=from_token" From e3158df2d4778a0b1169f13cb33086dec5519b2c Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Fri, 7 Nov 2014 19:28:09 +0100 Subject: [PATCH 390/597] Add tool to query the stream URL for (artist, track, album) --- tools/getstreamurl.js | 50 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 tools/getstreamurl.js diff --git a/tools/getstreamurl.js b/tools/getstreamurl.js new file mode 100644 index 000000000..7b67e3c46 --- /dev/null +++ b/tools/getstreamurl.js @@ -0,0 +1,50 @@ +var argv = require('minimist')(process.argv.slice(2)); +var utils = require('../test/utils.js'); + +if (argv._.length < 1) { + console.error("Please specify a single resolver"); + process.exit(1); +} + +if (argv._.length < 3) { + console.error("You need to specify at least an artist and a track for resolving."); + process.exit(1); +} + +// We use the string argument as the path to the resolver. +var resolverPath = argv._[0]; +var artist = argv._[1]; +var track = argv._[2]; +var album = ""; + +if (argv._.length > 3) { + album = argv._[3]; +} + +// All -/-- arguments will be added to the config. +// If --config is specified, we will instead load them from the config file. +var resolverConfig = argv; +if (argv.hasOwnProperty("config")) { + // FIXME: Add support for absolute paths + resolverConfig = require("../" + argv.config); +} else { + delete resolverConfig._; +} + +var resolver = {}; + +utils.loadAxe(resolverPath, resolver, function () { + // Use once instead of on here to only handle the first result. + resolver.context.once('track-result', function (qid, result) { + if (resolver.context.Tomahawk.hasCustomUrlHandler) { + resolver.context.getStreamUrl(2, result.url); + } else { + console.log(result.url); + } + }); + resolver.context.once('stream-url', function (qid, url) { + console.log(url); + }); + resolver.instance.resolve("qid", artist, album, track); +}, resolverConfig); + From 541a231eff1cba9b25ea6c6433b0563fa610536e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thierry=20G=C3=B6ckel?= Date: Tue, 11 Nov 2014 14:42:54 +0100 Subject: [PATCH 391/597] Initial Urllookup commit. --- .../contents/code/youtube-urllookup.js | 52 +++++++++++++++++++ youtube-urllookup/content/metadata.json | 16 ++++++ 2 files changed, 68 insertions(+) create mode 100644 youtube-urllookup/content/contents/code/youtube-urllookup.js create mode 100644 youtube-urllookup/content/metadata.json diff --git a/youtube-urllookup/content/contents/code/youtube-urllookup.js b/youtube-urllookup/content/contents/code/youtube-urllookup.js new file mode 100644 index 000000000..8c18d80c4 --- /dev/null +++ b/youtube-urllookup/content/contents/code/youtube-urllookup.js @@ -0,0 +1,52 @@ +/* +* Copyright (C) 2014 Thierry Gckel +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Affero General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Affero General Public License for more details. +* +* You should have received a copy of the GNU Affero General Public License +* along with this program. If not, see . +* +**/ + +var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { + init: function (callback) { + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + if (callback){ + callback(null); + } + }, + + canParseUrl: function (url, type){ + switch (type){ + case TomahawkUrlType.Album: + return false; + case TomahawkUrlType.Artist: + return false; + case TomahawkUrlType.Playlist: + return true; + case TomahawkUrlType.Track: + return true; + default: + return (/https?:\/\/(www\.)?youtube.com\/watch\?v=.*/).test(url); + } + }, + + lookupUrl: function (url){ + var begin = url.indexOf("?v=") + 3; + var end = url.indexOf("&", begin); + var videoId = url.substring(begin, end); + var query = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + videoId + "&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA"; + Tomahawk.log("Query URL for " + url + " --> " + query); + Tomahawk.addUrlResult(url, {}); + } +}); + +Tomahawk.resolver.instance = YoutubeUrllookup diff --git a/youtube-urllookup/content/metadata.json b/youtube-urllookup/content/metadata.json new file mode 100644 index 000000000..1e6c6f36a --- /dev/null +++ b/youtube-urllookup/content/metadata.json @@ -0,0 +1,16 @@ +{ + "name": "YouTube URL Lookup", + "pluginName": "youtube-urllookup", + "author": "Thierry Gckel", + "email": "thierry@strayrayday.lu", + "version": "0.0.1", + "website": "http://gettomahawk.com", + "description": "Enables dropping YouTube URLs on Tomahawk.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/youtube-urllookup.js", + "scripts": [], + "icon": "", + "resources": [] + } +} From 70a6729a35ca1d230f7b96b10cdac4f7e1114da7 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Wed, 12 Nov 2014 09:30:48 +0100 Subject: [PATCH 392/597] Drag'n'drop YouTube video URLs to Tomahawk. Playlists = WIP. --- .../contents/code/youtube-urllookup.js | 169 +++++++++++++++++- 1 file changed, 162 insertions(+), 7 deletions(-) diff --git a/youtube-urllookup/content/contents/code/youtube-urllookup.js b/youtube-urllookup/content/contents/code/youtube-urllookup.js index 8c18d80c4..8432ffcbf 100644 --- a/youtube-urllookup/content/contents/code/youtube-urllookup.js +++ b/youtube-urllookup/content/contents/code/youtube-urllookup.js @@ -18,12 +18,127 @@ var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { init: function (callback) { + String.prototype.regexIndexOf = function (regex, startpos) { + var indexOf = this.substring(startpos || 0).search(regex); + return (indexOf >= 0) ? (indexOf + (startpos || 0 )) : indexOf; + }; Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); if (callback){ callback(null); } }, + cleanupAndParseTrack: function(title) { + var result = {}; + // For the ease of parsing, remove these + if (title.regexIndexOf(/(?:[([](?=(official))).*?(?:[)\]])|(?:(official|video)).*?(?:(video))/i, 0) !== -1){ + title = title.replace(/(?:[([](?=(official|video))).*?(?:[)\]])/gi, ""); + title = title.replace(/(official|video(?:([!:-])))/gi, ""); + result.isOfficial = 1; + } + result.query = title; + // Sometimes users separate titles with quotes : + // eg, "\"Young Forever\" Jay Z | Mr. Hudson (OFFICIAL VIDEO)" + // this will parse out the that title + var inQuote = title.match(/([""'])(?:(?=(\\?))\2.).*\1/g); + if (inQuote && inQuote !== undefined){ + result.track = inQuote[0].substr(1, inQuote[0].length - 2); + title = title.replace(inQuote[0], ''); + result.fromQuote = result.track; + result.parsed = this.parseCleanTrack(title); + if (result.parsed){ + result.parsed.track = result.track; + return result.parsed; + } + } else { + result.parsed = this.parseCleanTrack(title); + if (result.parsed){ + return result.parsed; + } + } + return result; + }, + + parseCleanTrack: function(track) { + var result = {}; + result.query = track; + result.query.replace(/.*?(?=([-:|]\s))/g, function (param) { + if (param.trim() !== ""){ + if (result.artist === undefined){ + result.artist = param; + } else { + if (result.track === undefined){ + result.track = param; + } + } + } + }); + result.query.replace(/(?=([-:|]\s)).*/g, function (param) { + if (param.trim() !== ""){ + if (param.regexIndexOf(/([-|:]\s)/g, 0) === 0){ + if (result.track === undefined){ + result.track = param.replace(/([-|:]\s)/g, ""); + } + } else { + if (result.artist === undefined){ + result.artist = param; + } + result.track = result.replace(/([-|:]\s)/g, ""); + } + } + }); + if (result.track !== undefined && result.artist !== undefined){ + // Now, lets move 'featuring' to track title, where it belongs + var ftmatch = result.artist.match( /(?:(\s)(?=(feat.|feat|ft.|ft|featuring)(?=(\s)))).*/gi ); + if (ftmatch){ + result.artist = result.artist.replace(ftmatch, ""); + result.track += " " + ftmatch; + } + // Trim + result.track = result.track.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' '); + result.artist = result.artist.replace(/(?:(?:^|\n)\s+|\s+(?:$|\n))/g,'').replace(/\s+/g,' '); + delete result.query; + return result; + } + return null; + }, + + extractPlaylistItems: function (url, query, candidates){ + var that = this; + Tomahawk.log(query); + Tomahawk.asyncRequest(query, function (xhr) { + var response = JSON.parse(xhr.responseText); + if (response.hasOwnProperty("items") && response.items.length !== 0){ + var totalResults = response.items.length; + for (var i = 0; i < totalResults; i++){ + if (!response.items[i].hasOwnProperty("snippet") || !response.items[i].snippet.hasOwnProperty("title")){ + continue; + } + var title = response.items[i].snippet.title; + if (title.toLowerCase().match(/\(full .*?\)/g)){ + Tomahawk.log("Excluding " + title); + continue; + } + var parsedTrack = that.cleanupAndParseTrack(title); + if (parsedTrack && parsedTrack.hasOwnProperty("artist") && parsedTrack.hasOwnProperty("track")){ + candidates.push(parsedTrack); + } + } + if (response.hasOwnProperty("nextPageToken")){ + if (query.indexOf("&pageToken") !== -1){ + query = query.substring(0, query.indexOf("&pageToken=")) + "&pageToken=" + response.nextPageToken; + } else { + query = query + "&pageToken=" + response.nextPageToken; + } + that.extractPlaylistItems(url, query, candidates); + } else { + Tomahawk.log(candidates.length + " candidates: " + JSON.stringify(candidates)); + Tomahawk.addUrlResult(url, {}); + } + } + }); + }, + canParseUrl: function (url, type){ switch (type){ case TomahawkUrlType.Album: @@ -40,13 +155,53 @@ var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { }, lookupUrl: function (url){ - var begin = url.indexOf("?v=") + 3; - var end = url.indexOf("&", begin); - var videoId = url.substring(begin, end); - var query = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + videoId + "&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA"; - Tomahawk.log("Query URL for " + url + " --> " + query); - Tomahawk.addUrlResult(url, {}); + var query = ""; + var result = {}; + var that = this; + var begin = -1; + if (url.indexOf("&list=") === -1){ + begin = url.indexOf("?v=") + 3; + var videoId = (url.indexOf("&", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("&", begin))): url.substring(begin, url.length); + query = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + videoId + "&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA"; + Tomahawk.log("Query URL for " + url + " --> " + query); + Tomahawk.asyncRequest(query, function (xhr) { + var response = JSON.parse(xhr.responseText); + if (response.hasOwnProperty("items") && response.items.length !== 0){ + var title = response.items[0].snippet.title; + Tomahawk.log("Initial title \"" + title + "\""); + var parsedTrack = that.cleanupAndParseTrack(title); + if (parsedTrack && parsedTrack.hasOwnProperty("artist") && parsedTrack.hasOwnProperty("track")){ + Tomahawk.log(JSON.stringify(parsedTrack)); + query = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent(parsedTrack.artist) + "&track=" + encodeURIComponent(parsedTrack.track); + Tomahawk.asyncRequest(query, function (xhr2) { + var response2 = JSON.parse(xhr2.responseText); + if (response2.track !== undefined && response2.track.name !== undefined && response2.track.artist.name !== undefined){ + if (response2.track.name.toLowerCase() === parsedTrack.track.toLowerCase() && response2.track.artist.name.toLowerCase() === parsedTrack.artist.toLowerCase()){ + result.type = "track"; + result.artist = response2.track.artist.name; + result.title = response2.track.name; + Tomahawk.addUrlResult(url, result); + } + } else { + if(response2.track !== undefined){ + Tomahawk.log("Bad track name? " + query + ": " + JSON.stringify(response2.track)); + } else { + Tomahawk.log("Bad result from track lookup? " + query + ": " + JSON.stringify(response2)); + } + } + }); + } else { + Tomahawk.addUrlResult(url, result); + } + } + }); + } else { + begin = url.indexOf("&list=") + 6; + var playlistId = (url.indexOf("&", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("&", begin))) : (url.indexOf("#", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("#", begin))) : url.substring(begin, url.length); + query = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=" + playlistId + "&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=10"; + this.extractPlaylistItems(url, query, []); + } } }); -Tomahawk.resolver.instance = YoutubeUrllookup +Tomahawk.resolver.instance = YoutubeUrllookup; From be550599e1b4657dc0ef5449835a325fa7c98238 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Wed, 12 Nov 2014 09:37:11 -0500 Subject: [PATCH 393/597] Add link to 2-step auth instructions --- gmusic/content/contents/code/config.ui | 30 ++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/gmusic/content/contents/code/config.ui b/gmusic/content/contents/code/config.ui index c64302ba9..e56993413 100644 --- a/gmusic/content/contents/code/config.ui +++ b/gmusic/content/contents/code/config.ui @@ -6,8 +6,8 @@ 0 0 - 393 - 203 + 585 + 251 @@ -37,6 +37,32 @@ + + + + <html><head/><body><p>Note: if you use 2-Step Verification, you must create an <a href="https://support.google.com/accounts/answer/185833?hl=en"><span style=" text-decoration: underline; color:#0000ff;">app-specifc password</span></a> to use in Tomahawk.</p></body></html> + + + true + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + From b2d0bf6f415e860ebef3061410bab15eb4d9bf20 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Wed, 12 Nov 2014 16:57:19 +0100 Subject: [PATCH 394/597] Enable drag and drop of YouTube URLs for both, single videos and playlists. --- .../content/contents/code/youtube-icon.png | Bin 0 -> 14977 bytes .../contents/code/youtube-urllookup.js | 62 +++++++++++++++--- .../content/contents/images/icon.png | Bin 0 -> 14977 bytes .../content/metadata.json | 10 +-- 4 files changed, 58 insertions(+), 14 deletions(-) create mode 100644 youtube-metadata/content/contents/code/youtube-icon.png rename {youtube-urllookup => youtube-metadata}/content/contents/code/youtube-urllookup.js (76%) create mode 100644 youtube-metadata/content/contents/images/icon.png rename {youtube-urllookup => youtube-metadata}/content/metadata.json (60%) diff --git a/youtube-metadata/content/contents/code/youtube-icon.png b/youtube-metadata/content/contents/code/youtube-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..16961ac8fd95d43dc1cb98aaa4f777955ca54264 GIT binary patch literal 14977 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 literal 0 HcmV?d00001 diff --git a/youtube-urllookup/content/contents/code/youtube-urllookup.js b/youtube-metadata/content/contents/code/youtube-urllookup.js similarity index 76% rename from youtube-urllookup/content/contents/code/youtube-urllookup.js rename to youtube-metadata/content/contents/code/youtube-urllookup.js index 8432ffcbf..1b90f5ddd 100644 --- a/youtube-urllookup/content/contents/code/youtube-urllookup.js +++ b/youtube-metadata/content/contents/code/youtube-urllookup.js @@ -16,7 +16,15 @@ * **/ -var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { +var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { + + settings: { + name: 'YouTube Metadata', + icon: 'youtube-icon.png', + weight: 0, // not a resolver + timeout: 15 + }, + init: function (callback) { String.prototype.regexIndexOf = function (regex, startpos) { var indexOf = this.substring(startpos || 0).search(regex); @@ -116,11 +124,11 @@ var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { } var title = response.items[i].snippet.title; if (title.toLowerCase().match(/\(full .*?\)/g)){ - Tomahawk.log("Excluding " + title); continue; } var parsedTrack = that.cleanupAndParseTrack(title); if (parsedTrack && parsedTrack.hasOwnProperty("artist") && parsedTrack.hasOwnProperty("track")){ + parsedTrack.position = response.items[i].snippet.position; candidates.push(parsedTrack); } } @@ -132,13 +140,52 @@ var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { } that.extractPlaylistItems(url, query, candidates); } else { - Tomahawk.log(candidates.length + " candidates: " + JSON.stringify(candidates)); - Tomahawk.addUrlResult(url, {}); + that.verify(url, candidates); } + } else { + Tomahawk.addUrlResult(url, {}); } }); }, + verify: function (url, candidates){ + var stop = candidates.length; + var query = ""; + var result = {}; + result.tracks = []; + candidates.forEach(function (candidate){ + query = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent(candidate.artist) + "&track=" + encodeURIComponent(candidate.track); + Tomahawk.asyncRequest(query, function (xhr) { + var response = JSON.parse(xhr.responseText); + if (response.track !== undefined && response.track.name !== undefined && response.track.artist.name !== undefined){ + if (response.track.name.toLowerCase() === candidate.track.toLowerCase() && response.track.artist.name.toLowerCase() === candidate.artist.toLowerCase()){ + var track = {}; + track.type = "track"; + track.artist = response.track.artist.name; + track.title = response.track.name; + track.position = candidate.position; + result.tracks.push(track); + } + } + stop--; + if (stop === 0){ + if (result.tracks.length !== 0){ + result.tracks.sort(function(a,b){return (a.position > b.position) ? 1 : ((b.position > a.position) ? -1 : 0);}); + result.tracks.forEach(function(v){ delete v.position}); + result.type = "playlist"; + var begin = url.indexOf("&list=") + 6; + var playlistId = (url.indexOf("&", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("&", begin))) : (url.indexOf("#", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("#", begin))) : url.substring(begin, url.length); + result.guid = "youtube-playlist-" + playlistId; + result.title = "YouTube Mix - " + result.tracks[0].artist + " - " + result.tracks[0].title; + Tomahawk.addUrlResult(url, result); + } else { + Tomahawk.addUrlResult(url, {}); + } + } + }); + }); + }, + canParseUrl: function (url, type){ switch (type){ case TomahawkUrlType.Album: @@ -163,15 +210,12 @@ var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { begin = url.indexOf("?v=") + 3; var videoId = (url.indexOf("&", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("&", begin))): url.substring(begin, url.length); query = "https://www.googleapis.com/youtube/v3/videos?part=snippet&id=" + videoId + "&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA"; - Tomahawk.log("Query URL for " + url + " --> " + query); Tomahawk.asyncRequest(query, function (xhr) { var response = JSON.parse(xhr.responseText); if (response.hasOwnProperty("items") && response.items.length !== 0){ var title = response.items[0].snippet.title; - Tomahawk.log("Initial title \"" + title + "\""); var parsedTrack = that.cleanupAndParseTrack(title); if (parsedTrack && parsedTrack.hasOwnProperty("artist") && parsedTrack.hasOwnProperty("track")){ - Tomahawk.log(JSON.stringify(parsedTrack)); query = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent(parsedTrack.artist) + "&track=" + encodeURIComponent(parsedTrack.track); Tomahawk.asyncRequest(query, function (xhr2) { var response2 = JSON.parse(xhr2.responseText); @@ -198,10 +242,10 @@ var YoutubeUrllookup = Tomahawk.extend(TomahawkResolver, { } else { begin = url.indexOf("&list=") + 6; var playlistId = (url.indexOf("&", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("&", begin))) : (url.indexOf("#", begin) !== -1) ? url.substring(begin, Math.min(url.length, url.indexOf("#", begin))) : url.substring(begin, url.length); - query = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=" + playlistId + "&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=10"; + query = "https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=" + playlistId + "&key=AIzaSyD22x7IqYZpf3cn27wL98MQg2FWnno_JHA&maxResults=50"; this.extractPlaylistItems(url, query, []); } } }); -Tomahawk.resolver.instance = YoutubeUrllookup; +Tomahawk.resolver.instance = YoutubeMetadataResolver; diff --git a/youtube-metadata/content/contents/images/icon.png b/youtube-metadata/content/contents/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..16961ac8fd95d43dc1cb98aaa4f777955ca54264 GIT binary patch literal 14977 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 literal 0 HcmV?d00001 diff --git a/youtube-urllookup/content/metadata.json b/youtube-metadata/content/metadata.json similarity index 60% rename from youtube-urllookup/content/metadata.json rename to youtube-metadata/content/metadata.json index 1e6c6f36a..2773d2058 100644 --- a/youtube-urllookup/content/metadata.json +++ b/youtube-metadata/content/metadata.json @@ -1,7 +1,7 @@ { - "name": "YouTube URL Lookup", - "pluginName": "youtube-urllookup", - "author": "Thierry Gckel", + "name": "YouTube Metadata", + "pluginName": "youtube-metadata", + "author": "Thierry Göckel", "email": "thierry@strayrayday.lu", "version": "0.0.1", "website": "http://gettomahawk.com", @@ -10,7 +10,7 @@ "manifest": { "main": "contents/code/youtube-urllookup.js", "scripts": [], - "icon": "", - "resources": [] + "icon": "contents/images/icon.png", + "resources": ["contents/code/youtube-icon.png"] } } From f9b7ffd48e2ec8b614e1f3eb05414ff2995fb22b Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Wed, 12 Nov 2014 17:15:26 +0100 Subject: [PATCH 395/597] Add YouTube-Metadata to capabilities table. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 23df5073e..2b51d2139 100644 --- a/README.md +++ b/README.md @@ -63,3 +63,4 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | vibe3 | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | vkontakte | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | youtube | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| youtube-metadata | ✘ | ✘ | ✘ | ✘ | ✔ | ✔ | ✘ | From 3fba82561054467d6721a03729f026bac6eeddfe Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 12 Nov 2014 17:29:42 +0100 Subject: [PATCH 396/597] [hatchet-metadata] Fix reference --- hatchet-metadata/content/contents/code/hatchet-metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hatchet-metadata/content/contents/code/hatchet-metadata.js b/hatchet-metadata/content/contents/code/hatchet-metadata.js index 270cc1040..33124b3b3 100644 --- a/hatchet-metadata/content/contents/code/hatchet-metadata.js +++ b/hatchet-metadata/content/contents/code/hatchet-metadata.js @@ -77,5 +77,5 @@ var HatchetMetadataResolver = Tomahawk.extend(TomahawkResolver, { } }); -Tomahawk.resolver.instance = TomaHKMetadataResolver; +Tomahawk.resolver.instance = HatchetMetadataResolver; From 5937b94247891d560599cfcf112b0c84c73a1038 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Wed, 12 Nov 2014 12:32:58 -0500 Subject: [PATCH 397/597] Bump version on gmusic --- gmusic/content/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index 3a0fdb253..a073bba02 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "gmusic", "author": "Sam Hanes, Lalit Maganti, Enno Gottschalk", "email": "sam@maltera.com, lalitmaganti@gmail.com, mrmaffen@gmail.com", - "version": "0.4.1", + "version": "0.4.2", "website": "http://gettomahawk.com", "description": "Streams music from your Google Play Music locker and the entire Google Music catalog for subscribers.", "type": "resolver/javascript", From e8bac8fd7ef301e3b00292199091d9b1c143cb44 Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Wed, 12 Nov 2014 18:54:38 +0100 Subject: [PATCH 398/597] - Use correct naming of resolver - Use getCorrection last.fm API method to verify metadata --- ...utube-urllookup.js => youtube-metadata.js} | 52 ++++++++++--------- youtube-metadata/content/metadata.json | 4 +- 2 files changed, 29 insertions(+), 27 deletions(-) rename youtube-metadata/content/contents/code/{youtube-urllookup.js => youtube-metadata.js} (81%) diff --git a/youtube-metadata/content/contents/code/youtube-urllookup.js b/youtube-metadata/content/contents/code/youtube-metadata.js similarity index 81% rename from youtube-metadata/content/contents/code/youtube-urllookup.js rename to youtube-metadata/content/contents/code/youtube-metadata.js index 1b90f5ddd..25bffd60b 100644 --- a/youtube-metadata/content/contents/code/youtube-urllookup.js +++ b/youtube-metadata/content/contents/code/youtube-metadata.js @@ -30,6 +30,9 @@ var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { var indexOf = this.substring(startpos || 0).search(regex); return (indexOf >= 0) ? (indexOf + (startpos || 0 )) : indexOf; }; + String.prototype.capitalise = function () { + return this.toLowerCase().replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); }); + }; Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); if (callback){ callback(null); @@ -113,7 +116,6 @@ var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { extractPlaylistItems: function (url, query, candidates){ var that = this; - Tomahawk.log(query); Tomahawk.asyncRequest(query, function (xhr) { var response = JSON.parse(xhr.responseText); if (response.hasOwnProperty("items") && response.items.length !== 0){ @@ -154,18 +156,22 @@ var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { var result = {}; result.tracks = []; candidates.forEach(function (candidate){ - query = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent(candidate.artist) + "&track=" + encodeURIComponent(candidate.track); + query = "http://ws.audioscrobbler.com/2.0/?method=track.getCorrection&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&artist=" + encodeURIComponent(candidate.artist) + "&track=" + encodeURIComponent(candidate.track); Tomahawk.asyncRequest(query, function (xhr) { var response = JSON.parse(xhr.responseText); - if (response.track !== undefined && response.track.name !== undefined && response.track.artist.name !== undefined){ - if (response.track.name.toLowerCase() === candidate.track.toLowerCase() && response.track.artist.name.toLowerCase() === candidate.artist.toLowerCase()){ - var track = {}; - track.type = "track"; - track.artist = response.track.artist.name; - track.title = response.track.name; - track.position = candidate.position; - result.tracks.push(track); - } + var track = {}; + if (response.hasOwnProperty("corrections") && response.corrections.hasOwnProperty("correction") && response.corrections.correction.hasOwnProperty("track") && response.corrections.correction.track.hasOwnProperty("artist")){ + track.type = "track"; + track.artist = response.corrections.correction.track.artist.name; + track.title = response.corrections.correction.track.name; + track.position = candidate.position; + result.tracks.push(track); + } else if (response.hasOwnProperty("corrections")){ + track.type = "track"; + track.title = candidate.track.capitalise(); + track.artist = candidate.artist.capitalise(); + track.position = candidate.position; + result.tracks.push(track); } stop--; if (stop === 0){ @@ -216,22 +222,18 @@ var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { var title = response.items[0].snippet.title; var parsedTrack = that.cleanupAndParseTrack(title); if (parsedTrack && parsedTrack.hasOwnProperty("artist") && parsedTrack.hasOwnProperty("track")){ - query = "http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent(parsedTrack.artist) + "&track=" + encodeURIComponent(parsedTrack.track); + query = "http://ws.audioscrobbler.com/2.0/?method=track.getCorrection&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent(parsedTrack.artist) + "&track=" + encodeURIComponent(parsedTrack.track); Tomahawk.asyncRequest(query, function (xhr2) { var response2 = JSON.parse(xhr2.responseText); - if (response2.track !== undefined && response2.track.name !== undefined && response2.track.artist.name !== undefined){ - if (response2.track.name.toLowerCase() === parsedTrack.track.toLowerCase() && response2.track.artist.name.toLowerCase() === parsedTrack.artist.toLowerCase()){ - result.type = "track"; - result.artist = response2.track.artist.name; - result.title = response2.track.name; - Tomahawk.addUrlResult(url, result); - } - } else { - if(response2.track !== undefined){ - Tomahawk.log("Bad track name? " + query + ": " + JSON.stringify(response2.track)); - } else { - Tomahawk.log("Bad result from track lookup? " + query + ": " + JSON.stringify(response2)); - } + if (response2.hasOwnProperty("corrections") && response2.corrections.hasOwnProperty("correction") && response2.corrections.correction.hasOwnProperty("track") && response2.corrections.correction.track.hasOwnProperty("artist")){ + result.type = "track"; + result.artist = response2.corrections.correction.track.artist.name; + result.title = response2.corrections.correction.track.name; + Tomahawk.addUrlResult(url, result); + } else if (response2.hasOwnProperty("corrections")){ + result.type = "track"; + result.artist = parsedTrack.artist.capitalise(); + result.title = parsedTrack.track.capitalise(); } }); } else { diff --git a/youtube-metadata/content/metadata.json b/youtube-metadata/content/metadata.json index 2773d2058..1786c528b 100644 --- a/youtube-metadata/content/metadata.json +++ b/youtube-metadata/content/metadata.json @@ -3,12 +3,12 @@ "pluginName": "youtube-metadata", "author": "Thierry Göckel", "email": "thierry@strayrayday.lu", - "version": "0.0.1", + "version": "0.0.2", "website": "http://gettomahawk.com", "description": "Enables dropping YouTube URLs on Tomahawk.", "type": "resolver/javascript", "manifest": { - "main": "contents/code/youtube-urllookup.js", + "main": "contents/code/youtube-metadata.js", "scripts": [], "icon": "contents/images/icon.png", "resources": ["contents/code/youtube-icon.png"] From 57af64c0e487ba45c3bbe94f28fca4e214c02aea Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Fri, 14 Nov 2014 10:30:29 +0100 Subject: [PATCH 399/597] Allow all possible subdomain names and fix dropping of artist URLs. --- bandcamp/content/contents/code/bandcamp.js | 9 +++++---- bandcamp/content/metadata.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/bandcamp/content/contents/code/bandcamp.js b/bandcamp/content/contents/code/bandcamp.js index 114845f0a..5faf8d6a9 100644 --- a/bandcamp/content/contents/code/bandcamp.js +++ b/bandcamp/content/contents/code/bandcamp.js @@ -112,8 +112,8 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { var normalisedTrackName = title.toLowerCase().replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,"").replace(/\s{2,}/g," "); for (var k = 0; k < response2.tracks.length; k++) { var normalisedReturnedTrackName = response2.tracks[k].title.toLowerCase().replace(/[\.,-\/#!$%\^&\*;:{}=\-_`~()]/g,"").replace(/\s{2,}/g," "); - if ((response2.tracks[k].title.toLowerCase() === title.toLowerCase() || (normalisedReturnedTrackName === normalisedTrackName && album === response2.title)) - && response2.tracks[k].streaming_url) { + if ((response2.tracks[k].title.toLowerCase() === title.toLowerCase() || (normalisedReturnedTrackName === normalisedTrackName && album === response2.title)) && + response2.tracks[k].streaming_url) { result.url = response2.tracks[k].streaming_url; result.artist = artist; result.album = response2.title; @@ -161,7 +161,7 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { case TomahawkUrlType.Track: return true; default: - return (/https?:\/\/[a-z]*\.bandcamp.com\//).test(url); // This excludes bandcamp pages with a custom (non .bandcamp.com) URL + return (/https?:\/\/(?!-)[A-Za-z0-9-]{1,62}[A-Za-z0-9]\.bandcamp.com\//).test(url); // This excludes bandcamp pages with a custom (non .bandcamp.com) URL // return true; // go easy on API queries per key ratio } }, @@ -210,8 +210,9 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { response2.tracks.forEach(function (track){ result.tracks.push(that.track2Result(track)); }); - } else { + } else if (result.type !== "artist"){ Tomahawk.addUrlResult(url, {}); + return; } query = "http://api.bandcamp.com/api/band/3/info?key=" + that.secret + "&band_id=" + response.band_id; Tomahawk.asyncRequest(query, function (xhr3) { diff --git a/bandcamp/content/metadata.json b/bandcamp/content/metadata.json index 1a37b9e27..f9cdb2b3f 100755 --- a/bandcamp/content/metadata.json +++ b/bandcamp/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "bandcamp", "author": "Thierry Göckel", "email": "thierry@strayrayday.lu", - "version": "0.2.0", + "version": "0.2.1", "website": "http://gettomahawk.com", "description": "Stream music from Bandcamp.", "platform": "any", From 013b6878db9a084b7cdbd80411e42417d5bca799 Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Sat, 15 Nov 2014 16:17:09 +0100 Subject: [PATCH 400/597] Don't just accept any url as a new playlist in Bandcamp and YouTube resolvers. --- bandcamp/content/contents/code/bandcamp.js | 7 +++++-- youtube-metadata/content/contents/code/youtube-metadata.js | 5 ++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/bandcamp/content/contents/code/bandcamp.js b/bandcamp/content/contents/code/bandcamp.js index 5faf8d6a9..1b7e8c8fc 100644 --- a/bandcamp/content/contents/code/bandcamp.js +++ b/bandcamp/content/contents/code/bandcamp.js @@ -151,6 +151,10 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { }, canParseUrl: function (url, type) { + // This excludes bandcamp pages with a custom (non .bandcamp.com) URL + if (!(/https?:\/\/(?!-)[A-Za-z0-9-]{1,62}[A-Za-z0-9]\.bandcamp.com\//).test(url)) + return false; + switch (type) { case TomahawkUrlType.Album: //Don't rely on Tomahawk's InfoPlugins for Bandcamp's mostly rather unknown bands & albums return false; // Albums are opened as playlists instead @@ -161,8 +165,7 @@ var BandcampResolver = Tomahawk.extend(TomahawkResolver, { case TomahawkUrlType.Track: return true; default: - return (/https?:\/\/(?!-)[A-Za-z0-9-]{1,62}[A-Za-z0-9]\.bandcamp.com\//).test(url); // This excludes bandcamp pages with a custom (non .bandcamp.com) URL - // return true; // go easy on API queries per key ratio + return true; } }, diff --git a/youtube-metadata/content/contents/code/youtube-metadata.js b/youtube-metadata/content/contents/code/youtube-metadata.js index 25bffd60b..15a4c027d 100644 --- a/youtube-metadata/content/contents/code/youtube-metadata.js +++ b/youtube-metadata/content/contents/code/youtube-metadata.js @@ -193,6 +193,9 @@ var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { }, canParseUrl: function (url, type){ + if (!(/https?:\/\/(www\.)?youtube.com\/watch\?v=.*/).test(url)) + return false; + switch (type){ case TomahawkUrlType.Album: return false; @@ -203,7 +206,7 @@ var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { case TomahawkUrlType.Track: return true; default: - return (/https?:\/\/(www\.)?youtube.com\/watch\?v=.*/).test(url); + return true; } }, From e39fe764a255c0d4e14567db103a2078fbb6caed Mon Sep 17 00:00:00 2001 From: Christian Muehlhaeuser Date: Wed, 19 Nov 2014 14:06:34 +0100 Subject: [PATCH 401/597] Fixed typo. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2b51d2139..1e75cfeba 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ Some of the features need authentication (e.g. being a premium subscriber to thi | beatsmusic | :key: | ✔ | ✔ | ✔ | :key: | ✔ | ✘ | | beets | :key: | :key: | ✘ | ✘ | ✘ | ✘ | :key: | | deezer-metadata | ✘ | ✘ | ✔ | ✔ | ✔ | ✔ | ✘ | -| dilandu | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | +| dilandau | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | | exfm | ✔ | ✔ | ✘ | ✘ | ✔ | ✔ | ✘ | | grooveshark | :key: | :key: | ✘ | ✘ | ✘ | ✘ | ✘ | | jamendo | ✔ | ✔ | ✘ | ✘ | ✘ | ✘ | ✘ | From 1368c745e6b8593ee6aae2d37217c612ce330084 Mon Sep 17 00:00:00 2001 From: Orville Bennett Date: Sun, 30 Nov 2014 15:15:53 -0500 Subject: [PATCH 402/597] Add more info to help troubleshoot google music login failures. --- gmusic/content/contents/code/config.ui | 13 +++++++++++++ gmusic/content/metadata.json | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/config.ui b/gmusic/content/contents/code/config.ui index e56993413..a8a87eb2d 100644 --- a/gmusic/content/contents/code/config.ui +++ b/gmusic/content/contents/code/config.ui @@ -50,6 +50,19 @@ + + + + <html><head/><body><p>Finally, if you are still unable to log in, make sure that you enable "less secure apps" in your <a href="https://www.google.com/settings/security/lesssecureapps"><span style=" text-decoration: underline; color:#0000ff;">Google account settings</span></a>.</p></body></html> + + + true + + + true + + + diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index a073bba02..d09ceb59a 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "gmusic", "author": "Sam Hanes, Lalit Maganti, Enno Gottschalk", "email": "sam@maltera.com, lalitmaganti@gmail.com, mrmaffen@gmail.com", - "version": "0.4.2", + "version": "0.4.3", "website": "http://gettomahawk.com", "description": "Streams music from your Google Play Music locker and the entire Google Music catalog for subscribers.", "type": "resolver/javascript", From 2904387b08fc2a22202db2737247494bb5830587 Mon Sep 17 00:00:00 2001 From: Orville Bennett Date: Sun, 30 Nov 2014 15:31:56 -0500 Subject: [PATCH 403/597] Caress wording in the google music resolver dialog, for clarity. --- gmusic/content/contents/code/config.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gmusic/content/contents/code/config.ui b/gmusic/content/contents/code/config.ui index a8a87eb2d..bcadaf137 100644 --- a/gmusic/content/contents/code/config.ui +++ b/gmusic/content/contents/code/config.ui @@ -53,7 +53,7 @@ - <html><head/><body><p>Finally, if you are still unable to log in, make sure that you enable "less secure apps" in your <a href="https://www.google.com/settings/security/lesssecureapps"><span style=" text-decoration: underline; color:#0000ff;">Google account settings</span></a>.</p></body></html> + <html><head/><body><p>Otherwise, make sure that you enable "less secure apps" in your <a href="https://www.google.com/settings/security/lesssecureapps"><span style=" text-decoration: underline; color:#0000ff;">Google account settings</span></a>.</p></body></html> true From 5de20158f16612e43a339ada47ccd2af25ce485b Mon Sep 17 00:00:00 2001 From: Thierry Goeckel Date: Sun, 7 Dec 2014 20:20:37 +0100 Subject: [PATCH 404/597] Fix returning of result for actually correctly named tracks on YouTube. --- .../content/contents/code/youtube-metadata.js | 20 ++++++++++--------- youtube-metadata/content/metadata.json | 2 +- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/youtube-metadata/content/contents/code/youtube-metadata.js b/youtube-metadata/content/contents/code/youtube-metadata.js index 15a4c027d..d085a079e 100644 --- a/youtube-metadata/content/contents/code/youtube-metadata.js +++ b/youtube-metadata/content/contents/code/youtube-metadata.js @@ -228,16 +228,18 @@ var YoutubeMetadataResolver = Tomahawk.extend(TomahawkResolver, { query = "http://ws.audioscrobbler.com/2.0/?method=track.getCorrection&api_key=b14d61bf2f7968731eb686c7b4a1516e&format=json&limit=5&artist=" + encodeURIComponent(parsedTrack.artist) + "&track=" + encodeURIComponent(parsedTrack.track); Tomahawk.asyncRequest(query, function (xhr2) { var response2 = JSON.parse(xhr2.responseText); - if (response2.hasOwnProperty("corrections") && response2.corrections.hasOwnProperty("correction") && response2.corrections.correction.hasOwnProperty("track") && response2.corrections.correction.track.hasOwnProperty("artist")){ - result.type = "track"; - result.artist = response2.corrections.correction.track.artist.name; - result.title = response2.corrections.correction.track.name; - Tomahawk.addUrlResult(url, result); - } else if (response2.hasOwnProperty("corrections")){ - result.type = "track"; - result.artist = parsedTrack.artist.capitalise(); - result.title = parsedTrack.track.capitalise(); + if (response2.hasOwnProperty("corrections")){ + if (response2.corrections.hasOwnProperty("correction") && response2.corrections.correction.hasOwnProperty("track") && response2.corrections.correction.track.hasOwnProperty("artist")){ + result.type = "track"; + result.artist = response2.corrections.correction.track.artist.name; + result.title = response2.corrections.correction.track.name; + } else { + result.type = "track"; + result.artist = parsedTrack.artist.capitalise(); + result.title = parsedTrack.track.capitalise(); + } } + Tomahawk.addUrlResult(url, result); }); } else { Tomahawk.addUrlResult(url, result); diff --git a/youtube-metadata/content/metadata.json b/youtube-metadata/content/metadata.json index 1786c528b..f99258526 100644 --- a/youtube-metadata/content/metadata.json +++ b/youtube-metadata/content/metadata.json @@ -3,7 +3,7 @@ "pluginName": "youtube-metadata", "author": "Thierry Göckel", "email": "thierry@strayrayday.lu", - "version": "0.0.2", + "version": "0.0.3", "website": "http://gettomahawk.com", "description": "Enables dropping YouTube URLs on Tomahawk.", "type": "resolver/javascript", From 95e7c32cd75c275a95ea2d2388be6632ba3c2ef0 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 15 Dec 2014 17:25:37 -0500 Subject: [PATCH 405/597] Fancy icons --- ampache/content/metadata.json | 2 ++ beatsmusic/content/metadata.json | 2 ++ beets/content/metadata.json | 2 ++ deezer-metadata/content/metadata.json | 2 ++ gmusic/content/metadata.json | 2 ++ grooveshark/content/metadata.json | 2 ++ .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes .../content/contents/images/iconWhite.png | Bin 0 -> 10234 bytes jamendo/content/metadata.json | 2 ++ lastfm/content/metadata.json | 2 ++ officialfm/content/metadata.json | 2 ++ rdio-metadata/content/metadata.json | 2 ++ soundcloud/content/metadata.json | 2 ++ spotify-metadata/content/metadata.json | 2 ++ spotify/content/metadata.json | 2 ++ subsonic/content/metadata.json | 2 ++ 16 files changed, 28 insertions(+) create mode 100644 hatchet-metadata/content/contents/images/iconBackground.png create mode 100644 hatchet-metadata/content/contents/images/iconWhite.png diff --git a/ampache/content/metadata.json b/ampache/content/metadata.json index 02ba7367e..5a0801e4d 100644 --- a/ampache/content/metadata.json +++ b/ampache/content/metadata.json @@ -11,6 +11,8 @@ "main": "contents/code/ampache.js", "scripts": [], "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", "resources": [ "contents/code/config.ui", "contents/code/ampache-icon.png", diff --git a/beatsmusic/content/metadata.json b/beatsmusic/content/metadata.json index 641b02077..b852069fc 100644 --- a/beatsmusic/content/metadata.json +++ b/beatsmusic/content/metadata.json @@ -13,6 +13,8 @@ "contents/code/async.js" ], "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", "indicator": "contents/images/icon-16x16.png", "resources": [ "contents/code/config.ui", diff --git a/beets/content/metadata.json b/beets/content/metadata.json index 96a54f577..1777bf8ed 100644 --- a/beets/content/metadata.json +++ b/beets/content/metadata.json @@ -11,6 +11,8 @@ "main": "contents/code/beets.js", "scripts": [], "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", "resources": [ "contents/code/config.ui", "contents/code/beets-icon.png" diff --git a/deezer-metadata/content/metadata.json b/deezer-metadata/content/metadata.json index 5f42c7171..f78288476 100644 --- a/deezer-metadata/content/metadata.json +++ b/deezer-metadata/content/metadata.json @@ -11,6 +11,8 @@ "main": "contents/code/deezer-metadata.js", "scripts": [], "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", "resources": [ "contents/code/deezer-metadata.png" ] diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index d09ceb59a..e3036b2f1 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -10,6 +10,8 @@ "manifest": { "main": "contents/code/gmusic.js", "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", "scripts": [], "resources": [ "contents/code/config.ui", diff --git a/grooveshark/content/metadata.json b/grooveshark/content/metadata.json index be0d8bfae..399fd1ace 100644 --- a/grooveshark/content/metadata.json +++ b/grooveshark/content/metadata.json @@ -11,6 +11,8 @@ "main": "contents/code/grooveshark.js", "scripts": [], "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", "resources": [ "contents/code/config.ui", "contents/code/grooveshark.png", diff --git a/hatchet-metadata/content/contents/images/iconBackground.png b/hatchet-metadata/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..120a06302dd594f090e90fb51c7a05a223af56ec GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoJO d;=ew(XJDJg%$sL*Isqub;OXk;vd$@?2>^1U5-9)x literal 0 HcmV?d00001 diff --git a/hatchet-metadata/content/contents/images/iconWhite.png b/hatchet-metadata/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..53fa67161291b73e805dad4172900740b670b41a GIT binary patch literal 10234 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 Date: Mon, 15 Dec 2014 17:26:19 -0500 Subject: [PATCH 406/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes spotify/content/contents/images/iconWhite.png | Bin 0 -> 12735 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 spotify/content/contents/images/iconBackground.png create mode 100644 spotify/content/contents/images/iconWhite.png diff --git a/spotify/content/contents/images/iconBackground.png b/spotify/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..692212ea5e8de99a0dfdbaea03f45339b9b95920 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoJw dM7{qc&%k<+sWxHGi6=k_22WQ%mvv4FO#qek6c+#h literal 0 HcmV?d00001 diff --git a/spotify/content/contents/images/iconWhite.png b/spotify/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..16e0089d0cc41ed54dd0a35ed5a86437d864ed30 GIT binary patch literal 12735 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 FV1g;eaDe~- literal 0 HcmV?d00001 From 37116885cd70da1aa75fceb3265d6a8620a448a4 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 15 Dec 2014 17:26:42 -0500 Subject: [PATCH 407/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes ampache/content/contents/images/iconWhite.png | Bin 0 -> 7585 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ampache/content/contents/images/iconBackground.png create mode 100644 ampache/content/contents/images/iconWhite.png diff --git a/ampache/content/contents/images/iconBackground.png b/ampache/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..013bd4234f373aa17aa1669db6847f54715b3f5e GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoK5 dRG#@^&%nNb>C?6X`!1jagQu&X%Q~loCIFVy6XpN_ literal 0 HcmV?d00001 diff --git a/ampache/content/contents/images/iconWhite.png b/ampache/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..52a210431d4ed078db4d1f6f037f3f54c50ac151 GIT binary patch literal 7585 zcmZ{Jbx_n_)IMF(CEeYP#KHngN~d&7Bi$&?f^vdd1u}~KKIN#_k8X>bLO1q-nmbTp}r;w5d#qh1_p_?7RdO~-v0Ly;60AueJjAD z!3;FkRK;kTWZJ>NV7Aru|7Zb?whDa#}a&STWV=w*V zzF`rGIj$Ebn1_VKP&c$<=3(YR&h6z_H#|HcdaR@vb_W8w|80N-1dSANlyz!W z1dTS`r&B0|74uD*^!y8Fbt^!6y{y+r^+%6iB$!&k0_ei*!dwOT-2IyarP1YykYy2L zd+=J3zVm2b=wZjhYjUy7L;P*48sMpq`}MH-rs`zYOj+1@wVJt@>+09CaFfGVp3yzU zq^@hS=dd4thB{uObm~4t&ZGPJHHGc#b8W_3~Z3la{Khl%W+ zlC-ZO=`2*=l$4Pdi9X5KfE;WL1rv+30F*>&FmK!{YTbY0karb*)b=*vZf$%-alXU>Y zplWEQLm^F~Y=!P>A~J9Pg6M83={VZe(x%bwHO}|y?NOa}wB2zRX((Jw6TWg`bu)6?9xdw%JB6VNLM>sYbDR=Z z@vy)mo3=b?6>ExsF)331j)DeGLg~o@@OHM3i{Q_-neIAX9i)@WJj6swa2)?_qYfst zESIYJ&`TSTfLEd~UM=LGcCC2EL`zw;Cp)xRq7gv_@ zSgl+1sZtGI+5VKOYPP#|2VG&E`LPqb5E_Zny&k%Z>9=w@+a*noqgZ8shg%|Fbh`Ys zai-=^r^ag4=YysmHLohr~XYt zayow{P2Ntk8Or#p-VZK+%HOr+WD7mbwx+x7e7Ud_%|34N2$S);)gJ#v|6Ej=WH?`* z?tMK>!bD_uDr57U=CPwJa9ThYUe9LjhTw*;1qC`<5ql2?bJtl8f|>a z!DF8DP*;W&{^EOvyQTXwrnK|Q!d)LSQz%iHH)x&>Jw#O|CWdr z7Ag)}v(-34AiH@1b zOiLJatopE;W=9L&Y$`+*=5D2_aC=viV`-eL`q7B|E1X?y_50)}5cFhO@*s-J7HM@| zUS)s0aQO8pPNSB;;_YVMdV^M3|G550r1FAZ{d{lodZ729@2JiB>DmwAph(=`Fux&0%ygtnK$@K7Y(L3W4r8m+zztyGRGoB^RE@?}rcztk) zCitBYG^TpR&=@PbUh?vdk=l$>$qHd}uRB-ld0=2hpMJsB`i+ig)dDFjp_XG*F#=GK z7R>LNG*W%1C4$R;MypKbny+~0J4L85e{L-h6GPF9@gh7`f?!J|a^LIyS;7H56D`b5 z3+JB~DD+jSm%BuW%`1M431-~!uL2Q`4N1j6Gi<9BI;7U3o)lZ_7I-wb)+H0dpR6v` zt+yovr*4xrcTSJA@1ur>55rZl{{>K|79r!@vReRy_MA~&S1>o!_O*0oId+Yr`mtx5 zybphPuHqK9h$KZOtOor0{0=y-Y*UjF-}VF%Xn}tq1tB~`9ex)I{N>Dh69?gX_3etU z52hTbm`J7jedg_II+RJ69uXKb+f0D1KX4I<&VTzmtfQ~ z``r)k$5{H8ce#yPd!1a;uPUU#zHe;;tVWv*Q4tQQN6SE{dBHHn$5n_gsjfI-Iay{-c!Hhy;Y@ zj9|`m@7vRK4!HsVHyIHVjOwuJ0@Yjo@)z@YJvs~vJ2THtGD7BJsh7neg)IW{I(AW6 z<3s|yj*)nryy=PFeR+3R=YpcJ7Pno_7#|QTW+?@!?GJH!o7Q>*6p(pBR~q`2B02%# z{@;{u^6}rz#Ww+6&J>4eah5L`a=VW^NVe$hdy#lDs%o77nYPoQS#R%4^(tyknrZ3P ztAX0>mUTWT$tbN-hD_&4pkfLiaehg_Dw&IrsdrvvEi$*V$?VKV_N*d~>QZd#k_mn0bV!Ha6 zG}TW=YCJWY7D~5aE~BuK2WiMQBUT|&kXD`l<{6|=;SY%9dG>`MuBlMe5ymQb4O45| zexP4%smp%*9{jMr^!4@S9B#U0fTn|Nc$4pk#K*RKF#PiIP4;`8YocXIL#d{jEeh1W zE+#ttVMgWiFY;zF8ch2}Gw}L|vg*pJk~$^ek+G~RB&^$nqF!OIDn>BU*~*w$rWOYu zgn+MJUyg1zCs`=xPz4h`$t-;b2d`mk;K47MbbJmwj#>a}7Mt?XQUh+TL{fJP;I&Ac zvCrW;EE@*r+vRJkpDxCttQNprj|&&gf!AE4Hh+w^q4PwNoz{W{9nts<%)r9{q-Uv1 z#N#H+r)HvIk&{z7bV0oFyYHQ69f{zlV%+AeBE=s{QA2JN-Vl{T^A>2lq~->~xFqOgK^q z;8+(lsZ4o{oV~$brlaWle9t*@tv{k#B`CHMvC%_OM$x}ySEq9*TFu@XB)QS1Yfi`y zNRoKP#}`x@_uT=+fKZkk&j0pe=o3d(;=!qa`vPn5_qU7G`lz12!lhQ-BUH?rM;S(2 zTa+JaLs8Rru^~EwQOZh&ik=n?Cm{Td*#gMR_`mpJ2I0$IVC_RjcirFG{uv+@1}+Zup!)!T&&FFxCU>1%j=QVSA}3Q}Y=5@Vx#A9SrtOw7@Zk59`MKt_8M|*# z*~j2Di<|lcd$`*CGsE+s$$e+wrPpUj!@{**nBL93<=Bo$p7n=H2Tpt3)fW)Seiz!6 z2qNqs$zu+WjCEEDwsS*g|3_#irO2*JK2ZXrbT0X%g4*}?WCK`-`C+*{(&j1oJ1HZp zp+&nT zrjZ+y9q)Ko~eJ5-4q{;KyDa1IDsAm1$RnzI?((DoF>Yo z2`fzY&a7LEwiSFrIru+9&WJJEkCn?zyNAYAuTf^bD?VgG#G+ogJLk^Syc*%dW~U#F z7EpATjzYz|UWsqkZdCU3(Sy`+-qf@?9=!!Il(7O&z zx8n)fw!*B1%xRgrHf0>7k0S3a)waFyuH&jY(39&*xydQ_8Do8mzPHX(gsdgR`3nig zpHdEo7fT}?Y_h^+2HjV1O6F>KeWqrux8h!j3661e=x>3n9H_=<$%OIjQ+UABUpeeq z_?Y2<%V$k<7D#?3>mpOYt%Z0(wqhsZeM2)8%r$(4ZdR3+gKYlb*3k~<|0u%zv!LAj zx||6?pFEnwh~6pd2!9cIlrds7CbfYyP6Zj9G`xqCK!FNUc)c%iK3a2s&f$=E+l*IH zt9xT5fiupL<#Jt4jcDCBbN%FXK^#kqHQIT2#)YdT0UCW4V5_9SzxTpTikvQU8VMP2 z0cZF(@$kxt0-ZZ#ZC(a!L{bj*m%N(j&m)xJZ#MR#yi%%b@8g+Z^tm!aT~qQ*>Y8R* zmyDT${pAR1e-{2qWA+<7f|Nuh>#b>v-cW!q*?IlK6FWw(mU!4Am4m{FZ?tPr0C~J6 zrsqQJ6CAY9{n^+q$F+p}`eIE7*EBPIT%+zY6f^b}?f~+(JJ#;Dr^d%|PcbsGp-mLV zy{kgRQ{X#toE!_2E4{q5Q)ZwdWcD@KlDNGdcV zVVqdDKjgFSbL#z2>W#EhIp+__d`(L$ma|7XC`9~*Kzhha8CNbTaf8MbTKJVUN7|0< z)D_92a_$b0cZ-nI7Ur0kU=_YmsSKjCQwMlQ3tqUA#2p5bef;J_h)a-+Z@iaH+WcyI34ORr z_P_~d8mWAgrV=Z&PiiWPE`mr)Sv^DNh(SYh-!Y6|tK}i|eVE6G@i_r_=yq4^ezU2U zMstYw0_xN$g(oLU{Ep>(-n*wfPc`?RYKX?#S8FW~sx9cYywtou)ydoTDH~)^q3ssG-*$X#Fybqu+_}>loHnCnK4kj+vmu=Qwzd+ zmq+iWGq|2rs=!;-%h>7Dl`mz`rOvQFTVizIg$_%O zBI_9Nm0Aj+awdpOK~#AX)u;8dKdVf4+H*jGx`qW?)8C(8*d~jN@50|3w}7@A!@0B$ zS!jyuyiLfTDRpMxMJ_NylnLI=IAhPA``}=mlJI2}8E3ID=dfZ#Xq@sT8FJ?5 zJvC#YFqw+ylE)Yioqc>?W9KBFTfO?N8Vc=(IykV)JzG^}39c&%#aUB>e2=#OYa2iq z%N}vwfJ)AWCWwDZwZL&s+y|L-*?Tvs8k(}w^Q69e^s`TP*p^RK1m%s2TD!l2$wBVhaQXFLEKTg6-X#rRSk zj@gt9*+SXcF}-KclYor`IIOS+D&~oD(3*((lajS03<9R)L83nrUkasF*=}ii^V;u{ zfLsLL>E&%ooQpL&L6dRG@!wg#L7Y?Rv2G{`FueES{u1p2$?t#G7}*MjTa66#j3O(P=X*tWnDzpw-R z8lY9m!o+Y-eJc)8Vp|ZOZkK6a&(@m#OdM}^safR5A#t)R-Bv)gMDnkkh(z&7@Rit5 z81UND9T+yN3G;a^74O)sS(HwJ+w@9e`*#rTUXHj+D0ei5cm4#V5JMWL4H>bt8D~&;Ly1RkfD}-l9)Ds zp^~vP?WGSDzP?0lLn3muMOe3c7RqiKYkdiTZQF|vs$I_Imu0`T^?k+Hz>}6CwjJ`y zT`xUop+zcm2kA{?x&b8+*tf)^H83fvK6{iujx`QdqG||Xmv^_TKT3BlA*Y9^wfx3Z&R zDoT;g^;KA%nXaX!_bK=8ax*=QRg0^~HQH8iKHz|*Y;yeh;gwLGc|h%YjV2k_Lc_5F zmn3;1{|EleroI}k$ajmsQZhg{r#dq;WL8x!GyccF-iSSLVo9^Q;ZeaBbb_EaFbu#< zL+~K=OUIsaTdBdT_>F$|-X=2brhF8*J3!0SxyvPXIBw+9u5UB6azKY$8tE~^#J$vz z@+lov3g=1u37?DDf5=QY=)7N1K5XEMyKC@PY~r#T!lQsKXavcJ$#qX&;ttW}Bp%$F z|19OcQZFrUJTcV!OrD(qcTO}hjigQTJK<4&qL#1WRTW+)!b$?rV7#+>OqmEzbMbvDvbit+7lW;v3X`n)xtCQKtJ z%BP2k8!M9Q%{QfgLiN`%&fUB$`{@xoF)NlUMh%>?@XsZFvGg^y8DT*`Y6m<+*KH|R z>v~8@e4i{Qw-CI1%eP0ySKXa@%*V0*SsKG%H7HLRXX|Pn1&oofcLLr?0DE<7r^u&? z*S8Sue#4OgszDtrn)hQpmySeIuUP7AB|b@|h{(TBIBI*grajOw(EzzmjC!Aox9Q^| zz;d^6^05N;H_fbd>QD!ef3@iIjqW6(xj$c%6?pO#o{S(Y+PqJq1pjif7t8S~VJnQ% zYlg`&Opevo4ysOq%Xfx=ec1Q)sg+fK=$=k^ec zcImJtQ8R#ab4+CosS6L^cq_usz)6Fa3=u~J-8?^)Y8@9bUoXo&+ zF8X8dLnkv2)}l6to?f#^yJqj}gU{xWw?&x2ayQoAhZ-=8OYUMJ@63soV$jnXXwuQ= zq{G#H{Y5U>z58s%y5$q_)xkKSkK@p-tWNOA#@C?hE0?0;kJ&E4n+fJYMm_(20V3SU zP>Uq{CA#+_a``2}2J~``m>&r)!~~I!NNSgyD8Mp^)dz7&ktrJKmFQ%FixzTwMvAN+Vy`D@zwqEd-WDw?8;?_Alm!HudS7`-hF? zck|lO#(4z$`Qc0(bz5HPg^d09ipC=wYCn0r46`_Y_DWqvGTd!kMwfSm{&ta^OV$mB zxRv1q6`9GreF%g*#k|N7)=nQbUcK-hS`EFJ?q$3z-Et}Z9Xb}+!%XJAu3uV7i(8lb zA(sksnk2Pq}TdrI`W|4?JGt!{Q4)8bB|x! zQmrpCjw@o`BTcO005G=BCd!#yAmmN(;huQ+mdk&ijoXu5KqI4xI_*(zvrs_=-7?aQ)9Sq>4mW=a!G!8f{aaks?Z- z?xoa?@>ucC&q@`EEh6@Q;H_`Qw{vmVa_)8Ad%PQ*Q|i;=!~}lojLGUQXPkb?8_|t_ zHJ5iRovyowpvn2?fH4UQ7IFunA1dF;tRX|N0PRkzu^(?NtLXmpLJEEnJ~&hcj|GI- zYFy?^@mg|u>-9E?`^m6PaUTgTM-;z9Qc(0i%Y~o8m42#o3OM7FV5(Kx;W*svAiF$W z(Dfa?X1%>F^Z%iuSmgf1H<8lWy&0oo(P$T3;ztl4i#(e4CVVtOxi9(Ivd^QgXGH)! z4Ti6C^n9_rB0TW^F!waq>k*D7kExWXzg7vzm+H%;Q}BL-ei8H^OOLr_O{_I4X!elt ztdoo31aM#=wqCBLBRRBRs;B?pA9y^#lYo2#z!kMIQKU=cc=JcnVXnGlc0)3(EF0hX z=n^QDY-8%9Cbrkyy!ZdUPk^#26gSd1z1HaijJf5_l9PflLIz^TDyHEY0DnRu7NIC~L`MkQIVv2!a1g ix%~g+OewP12mImy3f7x56_ZEJ6+>HHAJnAk5cfZUZ@@ Date: Mon, 15 Dec 2014 17:27:00 -0500 Subject: [PATCH 408/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 285529 bytes .../content/contents/images/iconWhite.png | Bin 0 -> 9276 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 beatsmusic/content/contents/images/iconBackground.png create mode 100644 beatsmusic/content/contents/images/iconWhite.png diff --git a/beatsmusic/content/contents/images/iconBackground.png b/beatsmusic/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..cbb3015fec0a93e97a4acb45236113c126366278 GIT binary patch literal 285529 zcmZUbcT^Hy`2X9st<2n7Sz20Il9~gkG_6dj+?sn}?nK1}RF)%GYNj}#wA|a=D4Kgg z=D-P>3T{MH5COlR-ygs4Ki@y@dCqzMy63s)-1m9z>;2rQ=Z1Qxj*B1Pw{PF6Cy#Yr z?%Q|3{Qs?^NB+w+xuj117xu$m>OI_7LXceCx9|SGCpr&|1NToh?oYd_=k=reABi?r zxT3=P(%LS_1n-MyRgC_PxjXgAIJ|X#s@OhOiiv`05}uFWqwVpQ>2)YDW1>XitM_#gEy3#73=jF;du<(;`v3NF|6ZDLlws`+-LU6W!nH@ zt((T|wd*?#x`mUp62RjQ5z8Zw|TT zOIUpd;y0fQi3L@VE2>hke<0%Trf63QD(sT0i##$kD}=;QX`;ee=a1AsA2wO*ZobS} zO|b8*CaUv@?R$=bok0K(4B}5*`vdu~=nZ6_M|g15;~arS+8U|!_SN0FjDxf9aZ2H1 zB?X7kmVC}Ks{M0rn2T;yO|rApk-7nl2P3Q}Vu?R9{Fa$0FDZdN6atg-_>5kYGRb^J zJT_6;iUF9wg7vk$O-8S_;)He-*?6~p>x-2I8V=pRY0Td;HBx08uVlE8#2xf2xGaDm z_yZD}Dx1B%hU{wWJrlr#?H6+re17D`RO8OobNJkcGJzV3)=~$Ej|^zZ8Z4`y>;uHi zPUaxb?2dZtcS0^wIS3k_ABtQ2T?3ONR1y_2I9jC^{C%Ww9j4sFbwa&ybJw6%_HtdR zDu&mP`{J@{w3VkzynGzVl(aO{aEd$E@bQ$!aR=YI8^>D)Co+aJiB zuF5ffz7#R3BJT43L`rSZMnp;t!VZ;wiA!RV3j5WGcmhS{8-xaA%Xrl0HA@@C21V_* zlqodMXlZOMy2NGUlgl4@4|yiNS(Xr#=JT{axKfv{s3IMW?r^sq&No_H1xLnN@_qaa z9W071uv_#sta(E3Fvum`-myvpZ!9_YF{+Tf=(L&n;+}Fs*&LI(FTPyZ#~Hi@nQUMP zX|sIZk0{v!unl+EL!eJWj6++WcMMR(L;ahnPjN!U)=GW>u?z@mvnZUG)T%v_bga8l zEMyt7Ck*cPVVY|Pq(@#0QQk0k6w1^pJhaMdi~b={rMcyUZ*2R~XI;vx3v1b_j!Rbw z6iZy@-anMgT%Lp(c5Ce@0Y`%|RZW_k8Anhca3KZ4n|a6L?o(f30u(K>R$ps~_B*QI zJ_x0AIY?WSy$O(WT*eFI7k7eu8g4FwQ$pWQ)unPt9#0`i&7V= zdwItuYe)L@RzJUbJID+`@FGF@L*knusF32zk5 zQN_Liya%9v<?105rcQhL;R`LK+r!TN5r<4M17fc(?-uJ0 z>AhZ`chB6&kh$#U^>Nzdvcq}9;2qGO^@+`d$ecUtn;F82wjBV$e@n!tasHJ#A`K-M zX#q`|^v!EWaDtrtE6@x0SEa|!6Jb|R(~Pgmd8Er|BKrDPCipth>B%QK21NDT%}Krq zO1^|deTKE&gvemPKAvWw4Th_1BMPwbnm1PTvZuh;hIfchKMnnO(#|)Qh_LC1QG@-L>yQ4y(*7D8F>F|N&9yn4j^-)(yHcr)qFg@Ibwx~4aH|rmKDzKLtLdp@ z>E*Hzy}Rn0X_fw8zlT5VHUyQfPQd=^3Z!>x!oJCzsLDmE7;VKuL~u-?b$(Qw>g9jJ ze!9$^JBeb=k-i0(QS*HFZA-#xo> zXr)~~U@Zi7q1u4o6lxQ>Dyw&M#8XJ3_>*uD|E@kFbSu3y%s~ogY92T%w(2t-mU7hn z?q+fbuv=WO9t!!;d7QhRU|-ChTok$vs#gaDe@r5^F}lv}#??6M8E&tG74liH>0Ge@>#JzDRKPp3XynQKw&>}rO%lh*xI`AOEW}U0vL1A*HrVm zO_^2$q+)wZmcPnfr!kmGQ`EGWAy3_4z$csUO_^g1Prv8EuU0Qrl}X%`R}c0+fgbv- z5?DLa?RjE$p-~<4{p{N^!NqSq)!^S{eY{S9(ZQKp3&x)8P{Lo z>7eONuR%FhH!{nE+UovIqvbNs^X9w8G zwt3%T2Tq5PyhF2Fy=)~tmEMZTrW}=AC~C}4x!KFPsfbGRzdWqRzZ~iot?RJ6;h9
lRQOyQoglkMOd2H>3m2jfP`t{0M*a4wdA_`8V-^QTG zguA}n=+p7143tL+XZx6?^rxJ~!YAxXQ(tK|%|ZRr+0X*TBN}Xs#^diiW(mf)SqDMw z1jQ*3Xwov;#~tghU9M*KFXG+9?K>o@>!%Sg$%nw!yeR{)<-Pj&m8g&7GR_h-pa1 z_`EH_E!A&#!<;f=df-0W(fTS&_t`8~`c~h~|AEo_UYgueTClRlUxHtmy*+UkEFJYV z!{t`WNcvhETtrSL?REOjlQ;?H(s#7*KcuQ|Q$#kmP`b{2lAZQ;*Rv~)JR#Y@!|&HkL|azSJj$lq%@L1L66_%Kg(5dK>89a(Nbr(`wgN;x zj%{h;QQ5rg+`?y*oYf^&Jn~GQ-2&ax!EZ0wfiyzi`6AI<&<<54Up)hSOrw%~F@voo zEb74)AH)b2F?y}NP2JQ`Kz9>|PxzRV*vT4|`To;fguKgiQXOEh;LZJA6%oS?*LV=V zBFdHcoY*LoHc3~QA2ZEn_D9FIG!s?l8+{J_XnwcyWqTAeC)R@vREJ}1OVZY`GqU*J z!l_FSM6Ep^hH;eZdy$Cf9R^W}-+N4S?*nT0VbZ=XkMLFy*lM zgj4$>t$}OkB&_foQ+TX<2VJlIke8f`XGOfigvDjN=jj{jg+qBS1&1c;tsfK%fcQTz z7x*?Y+?BU~5~mF0RY!)T)ufllQ8VP&5hpQM3+jZAzT}7fjvi-4Or}())j$Lp2d-i(V z_b+dNXLUVP%L{tXb39Y1qqv2pnTzgPkny4do#=oFqz1iCj>ko22r(!cKM?H0~ z^bbW#Pb};xuL|&(m96kFqUmcJUMO~7Aw_6H^QH#Z;eya?7XmF=TqLo#tCp4RAPCfk zph>%pNNbpn+nJ=vfh_F0>(03b3|kb0P}e3+*jvKJjtirC6?Q!Jw`nuv`((mn8bos@ zH>zT0Io$HzA+Ap~CP>|({DFbDP~IYLK#Y1S+O-7aqJVvrlo{8aT-SqroF)oX zMI3=rJjY?%i1#4WAJ#M=v8zyXxIDDh{7%eeCr^>h@>JWdv5M|f_#7_>W9wHe!T}ZV z)%%fOmg(yWD*@ zv%fFZT`OJ_d1;lWLv>^lcXy+zZCybT6Z>d|yzLN81EBMikeGOsjq@)w1o>qXnACy7 zaJ5aeyOu=?apJa?jzC`awu@Vx9sEWE1j4{7Z^kUh{VLSq*2F+zj$ckpd!}6mg+YiO z@dCtjNmr25K-pZDd$eWP8_LKAY4-;bdkDVHDmY=dz>*wYoqjM?O0Lq%6`4#GkViX5)|E7rT%jv{U-an^qa6cA)Gc7;0H;A+_vb$DBn z`8@zm_~=51+T_X&&_w$JdSuWO4)oth)vNtGxgJq+U*iGPb!%`daULTkOO)!})rn>oN9#N>3bZd1gAE z10gSEef=`9lLGLLsoL}h>ONq#+U9V+uh2;&-Y)T~%g@uOlY-P$4WY3=lC-EWrzUA_ z44|Gn#J(Vjc~7Tt4CvLnjFKnv8CMMh&3o52xjieL`9WMnt-~+)rLV z!TXxgSson>rS6D{Ka6*Du3;l)D9C6`P?Z#%s*rf;`^{pc1AE_Dp-F64UeeumeR>wb zvr10VwiLSctg$7SCAu2JfvIRJK;Rv!oc-&YFPSnaXo*lnYML&UQg~2%1bwEp$Yvm5 zX^jqMV+V?}1LSoW2nkDKHU8*BdTy4Q1}!Ms;By`M19{F)AC0-7o+UWD9h?@BXj(A< z9tef{gaOoWrPC*=VxMUL`-mc|&cIR+piI5l<>#IGp->Np>eiMHm|2|bCaC!jjO(Gg z8r|YvhtJYhW?O|pQ(U2+(0wcI2^IAr{3@rWE8FQ-1ll^k;r9rBrZ4L&oZB_Ge=WO5 zk=5X8yU~dEsRiqdGL}~QQolDN`R3|>Hx9UM-W>r6o;|#syKK3L(V|sBL|X89Mf^EueOupebgdC zpL@XE5H}8qQFjP)ma@zEwAxEzhFf+Vp*(qVh515RYPPS{286ztbQ=3;YJir=@fK7I zKQ?P>CczatQE)_Yp^V4xdgb!+_G8;SRtan9nQk$18Ooa76Z9*yZ(oJbO8J8{7b-Qu6t+rv}n(1qrZmDw<5$R_2XG-NuqY$WHlHJutF zN8h>u+0M%9qWn)H`_--gn6D0Ts2R-2DjG34+i&=IWAPWr?-A!kJa^!yRiGcP6=frG4Fc5_4sgw-BkK_f!R&Yj z_0SxCU-M}1-zWW!oeRZ1V?NTmX|S>y0Pfdcc!o-=^2d94m*ZzmcNe7Vg}I^0!hpba zB{3k#In}31w-}+F5g4!$KZE`yG6K*Z ztXWqcuN?YTQikyDPAH*~0Eh5YJuT^n4$+i%XBuz`_{ncqW?A1*cSV8rJ!%@Ba2kA{ z;f=hHjPUzg6c~ECBOm?J&ZMpK``G7pMZgfV2zT1w{>g-O&_>I(fLbyAKtZLwCEOSq zj5;7WkNz;TLLugDKdrKQ!x;Y-UU#OBK@I#${-bv*)Vl+g$phwd8wxf3hxDmvQBz|9 z#`KCKHD%&Q1f8suh&^D9w=+XV+?Lf>K<>dv^grv&VpEnOpP2af#&~*opRdLIcgA=Q z)2vb|t4jS*FB)wzEPVLNvt3lmO0dQ!&3dOxs&Py%gK_27_58>Kx>a$B=rg0QNbSa1 z3V-{}SqdMsLS#<59T%6d@1oV9{9GD)`x_L#ix*HR&h>=ePq7NN+dky8YjH`hpP2qg zJX{=c#c=aqQ}~H1#NnqMk$+Uyx$NSrd`n(wMk}6*i1Haqz7Wh&=bMr zefq`^n&U@sAve!T37!^{PyNwfe_ItUK?<`A- zZrDD94`i7@S4&F{>cd`(C^}eY`jOF_SVgIvi*eQ=)X{xiN^O{+Sya{)3)I&ag7Q0pqX-Ya# zXWw)(!#;!8*2BH*`f6L}G4l%El>oeOloJZc$raua0IPMrF8bA-R-9Y82+mTJ@U-&_ zIbgBd{+q?FY?tSKjf{yJ^@J_Wtnh}y)s^3k&)A3H23$IvfvRavSc^mJX^|KCo>oR@fNxv@( zgwB+_gMlPX72G{H%Jtj03Pj&jXCTviG`_;gZvCq$!=JQm8L$`t{~AU3_Y)(8j==+n%?lsTb>!9N$5<9 z4Z!9%e^`Gl3GN0|&PItCEi~$kBkcn*>HzolA~xhIAQY#ck~;q(^XHv6-5CGpnZM;T z>S~iCI7dM1Nly5^TRFAK2oy3SEy~4KZXxOS5@Mz?vvxy5_k9& zzho7+3VTnF#;`bb_PW@PCk8}MXAL(xO+C?uj3Bi_P%j@>ib|0UymCEIr+0Y`>Z8{S zQwHA*{sDCLHK-r-Tb+J^dKT12{>5h&)XyM)D>sY}ChLkfAQKu#?3`Ss^i|wph7X0w zZI7$5WRQ=WbGH&aN_33Te`%Pf`wdWZFe&+Hi(Rz5SK-V}*-9d^CE&%OvxfP?T?os= zE!|s`wpoGFLb!z3+_to8=f#+oz{d2ZlHFW=SboB3`s`gGZl+v0oBX>+tFilt;g&hS zom2mCWnpEii1q>1=?2gSx0h@HJ{s>)`!ue(%PH->nn!O1GQg3Hb3&4 zY+m}Aaxt>)5D$W$#3r`e$j6_tqDyJ`OwloOG%X)kZH$u1S)(N)^LW|8)A7x9A?X1T zxhV5~h?B_`ZZoi^c%{jwg(Z9@SfA>JmtaIY0~SlcY{~h!n%qH;$kdS9>C&*ds{m51 z)GI*6DD%C8xME?w*Kf9Y=Xu*aa!zsw_sy&9Ec1{%lS~U1ul;L!De;1Fl(|hTk{pkk z8ple=3vfE4R?4b1oR^L}VHlk>d*Y7_8{JBa1`<=-;ST^lH%RgGE%-HRGi!1Ahy|mi^*za6sz4PB` z{fWX=555oCH$=Q|^?p^hefx@Avu6P=GGn`&e&luuOt+{#R}rEY zBwAwF#?Dj5xqkh{%3*dgWys}wW(a??&F}U4&>cKR(rmpxzNEhgcblr$);tS(9rsr} zmaaoYah47Qo^0lK3+-5#f6eeGm+Yq+D~AyNPWP&@rD99@pD_H~%D-36^ItRk!>KZX zqx9+N>g?4n=C8|{zaT3r9HUTiw?R6ii2YI3)Q7&v?i?=9q4rrxkhOTszb_VSkG+=0 ze}V4l$#C+sURp)CryKZV>TmgIaJFMVpZbG0C|djfnEDs}n)>rbuIMHeIf*)NgJfjF z->Fr~_fYJgOa1vckGK}^Qo^ir9(=YfY1;wAnn*GN62NFIUBvYuCS*P@h<~Mb6emGQ zKDQ=VIH4f)kIwn_S?ByUeE`da$UWa%P?4SqbOts6iakFM&r{UW^RRSp=u#E+*5bFQ zz2slWhUQ>v@NcPq{MtDWp8mW=-v3`YDIwhs#hdB)q#3aXPC+H)o*%56c67ITT%@yY z?1#lV|Gbhx*wQl6_p?=3ehJ1T;aI-RvKhJy`5bV;D|_i@jP~&QIpsX-@0Ih;|0MI5 zzgEr%FnS#T<$SQ#uFvq_Wd1AWjt^$QX(_sfZ!gh3X)MqZTk=WcgCuNN`i2%)e!rfJ zeeR&A09OI?b%}f$N&OT7e3jJBEH+fq)q28J*co1+L#xD`dDjSl{FW4p?&gl2_$bo) zJ>T#Xii^=RkFUXWoZTm@L9SFsn$8OlzNgjLXB?E=Gn8t0K1-#`m4yY`(1gckzj)Pl z?L_wA(=rqX(te7xjErw5$)N<_GeGkHbsHDD&U-IG;*mrZS}QL+w)Ww+UMh|$^F{cu zr{HPMlgw{o*uthjP=(PZn#UHVq!rp+X)8D~J#dYk`2+g`fZVq60_Y~N}{uX-C(V5N9uGb3JIiaW2d6+OvU z4daFvftf3^g-Zre%{?}Gwv)+{`T&?u9ewDcjOIHnXeHO0bClHZq~G%Y)W0MAQ{N!` z;r~iY4|b4?ewriv%j3Hup+EMRBVN7@_a$MKE9~aq`1&B9iIFZzInW9ex>|DN&h z{u9Q(?6s^OkiSiq(a8!Ssui_SgUXa!UYgmwIaxh4Wes<%G@Sxs2vQ71CY99z&(G^Z zzKd%nqi#fEH^_{UewQF0LN+2K7;DFi2bSnt`NLES-|;lNOS3 zAni-5VEHQfXKyO&m)nrjj3erkVL&579XSsFm&*DbHrtmsmbAI%9yZU4bQa^~+Lh>h z6>w*`w2ip0ZQ`?8Wj#w`%Zs)E7LKF5(sIcR{4z^~3+k9?43j>+yP|{$H`P7hzoUR0g zGTkK`_`C;-`0V-dIMn=j9OYNaU%tCsa~}N?qcx$cEf;_(-eeTnP2iTukb)+scWw9S zFg>Jvn(7r1L`%o9$w%ZOnr>EIPfU2cwp>SL37a1h8@KKkGzT#2Fr%+<4`FKKq$hJ$ zQ-#$5-Zk17Ai6m20b#1P?JHcAnk#V`EIlC9HuE9;)(9S`aBK`#U{ z^F`phr&=R;rSEV!EWhGqPV((6$1?z@zKisxc6vb>D58aHQ*L!{6ZS_uw#CQ%H3aXu z+KFAU9(W;dg(|w+LX>5*P(a=rP(Y9EQVURF@a1&RD(wN2#drE;JI!A13?OySPn4n< z=1wygmD{Raq=cCY-5^62wS@3hTuXlaeo~@^(vd)@c;oT!Za08tuBt0@l8#_AjHDa z(bF3hg^jZ+dmqwB5Vy3?vc{m20S1eAg7Y;L{!m%M1deSm&Pw#E0^gXFV@93K0RNWHc9fND zoe+y&I1`N(&MdUBpdI4}Z~;4@kjWv2i$Z;+h8kj=%nIqVs}zFW*kdH|XuoPDVz4td zO&imGZC0ko{i|f~_|~O<18;imC$(~5VsIpDpoAb*GgJD715wQlkcZ}@l5x9-K}XvQ z*aFa>?8~7&rD{;h79exU#d9(}+O%hhj;d*wH`9ZOpl$_!ftrF;Izm1c*B+@!Yxxfrm|jjxQm9dqT`@dWSbg~BfdVo;WXF; zHtFQ!k;ysuUtII_5EU!z__;&iulXKlH?zQ*q(~1)(wzWMp=othq2Seed7$IYd|PXf zq9{QXFvkTzeNMYtcP2`M_JGD@=DuY1s!61iBP1;kLKD=&D0Rp0L4}|2zOhWl*$8fNpN;E$0-*{aJFmNf} z4HWLF-^S61wTZsIe^CFV!FVY{mWRFtNa@b)-%zhUr?g1wA6!QQUF6YNp>3ODZ0NasqS5qT@? z3=z02Trov+MY{7KurB+s*61;f85y@Me3qh4>jl>zj#77qIe(MlJ_FpnK0)B5GXeHC zcf8@c_rUlNl>zjnS0yzhV+Q#7RvB~T1;gie)n3H-@RQ$~{QC=L^xQqroS4cv4}O^O zLyGY_=Pp3Y-6hcf8_`~osSE0Df{dGhzoFphhX%yHF zVGNWAkZ1PZnBSnIz98#nP52Y(ieNe(Z;8Z){n3OE2R7)Y?zGr&b@Ll^)ZaGf=+hTw zH|VIreQABqEPJ+-53g^pGw!oVOl6gwQpNdF?SJ&8E>S5 zte4uD!tpbJ7N6oKsGJ7{cxMCj=~ zPx0!@<`I?;xCY5_kz{pd{Xo{~b?3IC(q;?(I0}F4iF4lOiGW`P`HaSO|5yhon-k=- zRMET)^f$WL8QFU#h3Po$gKa_PnhcX3P~=J{>vx>mZ$F zxlvEn8c$E-Hz3D+eaXNq?k&yrrqzF;-lFC)yj@&*)|k0FLEy>6cukV8$?aC!h>mo` z%g`!)yXOoBCiF7eYr^p=bp?_+Y*0)fL6dcBFf{q0Wlz!nX2`%WFA0iXLRK? z&GQ1jOqV&wp9yIEwEr_+Kt%=QdrAlfze%ZY70XRXYH8fl8U5fpqR;9xr{LW2J2p=2 zolN=*?tX{N`yw5?A^MSB%Yvo&%VC4EBMQeGqKi9{u4ZpDHQ9B-w-}h&PM3TOfM&$% z$8iW1g7ZUHu%r1Bb4v<8)+q=}ykx@2AJLGpWw^3|AyjtP7mPP-`I-OHmY?yPE&p5^ z`3$SlzD9n#-{fCqusp!>5+iOUkcjtVryoOjd4fq!E=9v z2jIU~0|tSiI%nv7HDE=BX*A)n+}lz0iZC=^4N&X){%|75l-)4+%+Ay`zY4rPR}9#) z>SOwC;Hg1aLht&~I>?_N>{T&U@0p0I!_8t2NhZIuJ0A(_{J;825ck(V*^c*~GO$1T z_Tu#&$WklOv(M_LkK5G);XU{kkGt#V*De6+wpcG>H~ql{XRu#sUC7aeOJmXRPdHn* zT=Ok4@UID|LghRnkT8wV%HJVxqDZtn0s7&jsNgTN)?<~58Z16_m z+Zg)uj=nkdt44YLAzszmulOs1{vqGLO+(OpPkGBzhVv^0xTSdhL5^S z)c%`kWxK43CZ_NFVSXOzKSL3D@1WUWs$D7%6llXVv|fN4lrE*s3i#y&eacf%@h7Q^ zxn1vXJi!lEd^pz674hZIuTzV=l)< zrvg$R1`y%;81h$BO9dw_;Vl971LtK{+C7__Hly)jz#6@+6`DjO9|xd==C; zp!O5};}{-bxtmq{xy+5>O<#a}QL?eO-P|Avn?$lb+g{9Mu!mvf85a5Osat)9)8sX# z+a@x^G8qN0l)e1IqGYFNrj*N8rX;WRM}Esr`fka#P+vFB@dr7y#B<5TEX?i`!uE@# zG@s$SHHeE@jzY1C&L3#f!b|c=@KXR*(3tI4XMd|v{{_2=u`UXb{1Gf4{GZ?oT-j`2 zD<7pNlC? zSoL;bGhi*8nma3y>=@2Ai!2{|16Kt=64+x4HYZ2@xl6#2=0W%JGY+7YK;eLMNSe7g zpZvjKy7kVk1o`Kw9G^T*mn!hXQe7wgJy7>_-jy@nVT5II=A1uP4g%&Y2P;nOZRu$D z^>72eq`+Y@2kwhn!MMJgQI5R*zmC>pN}vPel94)~>=KT3q@7L=@q_vy!PMI?fL&9n zS0bc#iZ@?5=p8HBtSOiBa$z$Zpf(GD7FW}rH6nFM;N>CHdYc&5~_Hvc#n{rkY?87B;JWA^F!puGXBK5kLUg z{?PfFT_}fe)#k4=``#ZsIi8lj-FC9e&;1?_KKkmwKo}<$&|kI-JKy#}h&zEYexNOB ze#Cx!0LD^(op>odMAvhZnJ~k&HJI`G_6sGe{egAm$3xE75Ql-21H}i|As8r+G1BI| z{T29;y|BceEuL?z*z*%K+6y9n!5kK<>Mo| zX<=LTp-ZS_EXzG^gI0hGHs2zPk(P%8!#{ry8^^qSOW1&~P5FhKvxX~bv>aFa-vE8f zFTzJx#uh-jT3|3o;I!&pDEDnU%Sk8UjhBYEqyV;oU)u<+h7sad-U>k#^1adt$h)4T zJ>X7lOpv5CZ2D5w$jcHMZ^&gcXlN{`CHnQc{XaWCP$aqp7hv0-|DLryk)50`<8_a@ z#CjPYHQpxL3F`7OEtR@{y;RFr(AuC~bH)MqzZChC`euy-rN0>mUg8+$?|XJSqP`PV z?{`8VduCLD?mGY(z%}O#ith}J3w%puZE0ydd1+N&1~8x6wT%M62VVb=zz1MC&zCNz zSnXnf(l88iOtd?tP?xM}h0i9PqZiM`o`^h<&}pc!~~ zUNgWX_eyYOp&MVlSf?LaE_xR@#6ke|l1^sMwUhc7P-&%Pv_FD&iv)~;l0{Uustw&Kb;*O9LbrL7tT0q`EzRjng13(DEtTbz;6@8vcTm?`a<;h zL-{0Ky&PM%$99BQR1j}JOQ|_Q`GA~+yVrE@cC>$ju30__8+_7o_qsig z5$BNCn&}E5`cYpNtftM2{#CBNPmu)-+i1rUiNTWA=23qHHV*J~E)e0fZ2hzfujRITPR z9Lf-I)V!N~J3@4Q`hx5S0UEeEd`0Erf4w>k^E)a|zzMncN8!=|(040`M>21KOXg1w zr`$d-oelTe|ShKIy@a92* z*_MLp((9H2rLzB?9;hg=|D>Y8^6@>4mG;#O9TXwxWtJJr%xEk>&)Frs`TGm^Q5PD{wUG&=K~dI0G5na-N}H?l1hPGY>2 zAKnp?lm@&h++X=8T^a_fZM5)|1djuj5AQISz_g_34K!Wn_Mg(wO^wjTX-*8UEH@s1 zr;&Xh9x*k@X9jy^-53~$Foj~n{Ly*zJBgN0iig*p)YdyU_*scc8kbb5T{vOmfPDw<4tI7@|heG@`z1b%yhNOvQunp_)PLJiG= zi+uDpVTZ0ZABy@xHzJnP{-FGK8s0t+A*6R??^cYuVVK7@?Me#Nx0|)Al1e^xEI7j| zi4Pq~jFYsVQl0Tu0)h$d->V1AY4_z`deyPsG!=p|)M8~|Pix$8TM;Q10uD=K61T<; zjDEf9w+n;s4YASpgUYd^8~WGgHKd5tou~~pS=$QzzK!D*))Ef@4ApGn-cy8*wp$u;|EGzNJlX%BFv1WC z)u9W@%`#@WVKU)zega;|nVBq4ZmdI(9&V?T)IzN}fH{>A#rJnB&Ymf-MdaZcT z0=sH!u>It=2;4acI6)MkYDr0Mzh2TDXllQa(s5xeR8Kc_spu&(&%7SU<3qy**S+eg zZsc5M^2^Jw!X=J^us@9XjgH7KLkn2ti=BztPUXh;+P%Au3ORp1=EtfD|G&6<^RT4z zh4249XQrHKV_I!-scFiYtfWq*WEs4Vu&E+2j(c|a-$OuJ!W zvC-^#VMIZz?Ptavdw2TAQf>vE(NV5gY+w`NCSp=uKgqb*3uFaP`UpV9FCG1pu(c&o zuiU%R&lTTN_my}+zKn@ACka2GmYhn-zr6gjhN?tGed@^0gmhrL^7=JL4(oh~7Zx-x z+>I!2+d&%{9!r=Zen%~z)HH`D%LhS|+5X?06)LK;)H=H*LcP}bV$wGtNg)=SB>~w(b!XWB zjok!9nNj}X=eNhUNw>?^B>IaMzN@{fbqs#|+E>39z!U8>?JYYLqce9Dc$zF`Ltbdl zDe&`_C31yvFzkZAu9$O#XbtmeDE?*A*3mv_P7pmVI1%U18%7 zed@b-c(=!5k1*kQ;C{;}>vOwI3nV{mgkhxtr8Z_0n{-{1GbKa6NSqkZd6+J|48c|} zpHzRkC{uu;BwA~7!OSaB%TG!8gv~^G*Ual2tYhefVP8G{XJf!~Bdir3tg1^<6dQDF zcuGH*iPD5TLd0!0V18u`fSyUK(Lug5oqfqo%Lj}BUz?2qrpZ|?W@)fZcAgTi2`9}j zZv!6&Erq{kRUmh8r=Jv#Sex$KB(R6M<&8xX^|LXqj$+(4O*bUkL!KK#E&XD1!Z>Rw zW-!IlTv3>v;}$R%^3#*PCf&4Jiw2|u`tf8-QXMcJ7_@@@I~xVfrt4h`v<{6l;}*dgHW5*8LB<78<&i9pOYbA2l*0N(}3Vb|^(zN5K&kP#A_mN(lA zf*(M9l?~(w$G>B-Uaj%xHU>m9MbnCbdW*#n(L;(`>Hwp3s63M>5!9AtQD}i>vWBKR zYalYuSdUuUnFC|;+ODm8)HsshK66ht$PAme4d}-Y#uI@h9m_a6tFmobt`ZQ$Sb|B>Lw;U508CzDCb9uwlR!q$@K z5V$KQ$7#7PVTfv4x78*`2Cb~=xJI+cvX~e$uJxFB&ia&k(Jw(ZJt}pu+()PMKcrF5 zQWeq~06v(F-6POsEzGqvC>~+urHvd9J~3EYh79(@w7md=gt+~2o_^!_h17;l#mAvc z;XMlPl3@S3B}DBwi?K{ze`Gr9;i{j|g@1d&Fexb_+Ey$Bz=b8RZg&8p0r77|12u6t zR{}Lp5NfhEz0gB0sDgo;!6v2)!}JhGv_nrlebB_wLyhS*)h3FQ259V-$G1~x<^}^I zX>bv~f;y`NZFRaC;IHX+VM($C&+I^SdSR{WNn*XPJ<52hb z6kOLpeB%a0Z=F=3(ykG(CRz78dn$*0OPV&8wLwe|Y|@CC#THYGkEa;(&SK{6QgXb7-*YX>)^i4*Ia1t`6jLvjMtnWt6?CJvLx0Eh$FY@XR-nO-PjIN z2M{QYTcn>P4ioy@PorG_-ahCnv?G&>NcDdN21 z?Zx`wghkALT0*M7O?WfwYD>0;x6$BR#O9;KiiZkpA&-2VGx2q|nw!!;*d%iu4!i9TRR|^xQ-(4x_NlR8w`Q9bQL3{?CEhp{cQ22D zQ?qM>1bqnTVMDHtEt$;@?4qZ8V~ya>1NC))aPS9W`Gh9H^i{!s<-gZZYKV0Ga8iMY zX8tA7<{sh+vC5N9T%Ue*Ax9D`!?_&!)GD-DR+_xQ^QB9_t>_)br$e86&W#$_Fy--9 zF{93&?wIfm*76tH0b6&bR=rsR30+M0J{!K0#xFY&cDT0Bv~!75%XZ>>Na9b|=K%+gNswNJAc;Ta!eM0|VdG+i~BwFVt&(8Nca z)>g)s0_s3$9`WVYO3vhuD8nyk4HNKde*HCZs9&KB!-C~CMNH;?8#2EM_RL8rL&HrO zRBvn=tpoXG<_g>xz}XO(&4F8gF$ad2W@jAIE2=&IuPT*fIxA5KiQgy!{~%@#Pp5Spyv;5$2wx$6+8AwmzY-vzcUrk-xrwS zgYCs}(Dnm^HR2k3MYB4SaqP9TMzBXE;$j=2Ke`IunR6A~2<47cxW6GAt{hz+I#I)i z7bVebS2#(w7Ty7&vq_^ry9$2z#Z@3-qdu3>n#k148f53CFOd@hp2xQI?lQ;w_GVJfi|l^cR{$tV)7QN< zF4oy0@W;vmHQq5TurijD#y)YLnz0WNWJmacR$8Ti{)T%XNy7Ojfm|-U-0E2661W<^ zZQ5)WsFcOd_}*C)_yb7hNLR8BTzxB-u!%z8%s|*%HKUuTFmjD^!e~q|LPxut8QXNk z@Jvb!EfT)X3gazs`n^mrX8*c-sC3D1yajIv2T#V$V1zAiyan06^%h`eBoe?|VA}j@ z&Rf9mHL*#1gR*y@{_Pp0=m zhu+G1iW6O0%W$zEf^)K;z+q;<0q5TZ91KXdYWW{wZ;~Q~)6#JR)RSH7O=V<+IpaKC z+v2!sd>-F)-x9uk3L5lWag2(6Ho>Ps;#e9~0*#V}mr(hLDrO%FuncNS?WAus1{l7H zZF`b^0c(Lc@aaQv5)~eg2fcq1h!pCAYbsyU!3`b8PlR^1Wk;7pj6)GQ63r1T-lw*v zrlY=Xse9R2_8E8`e>BEiL+CY65av(^Id39`ng29WDE>bkDQs^9HVs!EVZKeJ)i-T8 zuDU6IryBhZ>89)V@h)-KnRWL+zUCnzJC}Ehfe)dB-0~hN#CEv#Oh`mm_(eb$&6Ug8I9_W-0PXrF0A zHa;gqkl{12Tm;-==tO@FJ-qR2=%J;YXabmp7y-r%J-iNwF-!_aFofqcSruG6d*4az zX$1q#CR3<}LhipzJOKU=7%XmW+N$g|PI!oll-C=h#0inJZE+Y%-Sykx2bht&dD`rX zpmNhvW;ujEC4g?)jU68oO5T$!0wf3jOG1T2ks5dvzS_3mYC~DoqQ#!_9m2XKJ;d_`PR&ER0TyC+ zgPk786rB4uMZ>a=HSyEwvXQ)Z;UF8j!ye)?@Y_;Z{OnDZYcy7I8gD%^Pm?5X&$fZl z496tiP;^L4L_DCSA5~vX&8?VYB7XRWiOBZ`3}6luG*RYXj!6n|E8+KlrXuQhD&tu% zCDnYZm7%ef;j+}owdl%mnSF0gYJOf^FpzC1fK$;!e|9=XR=St72Y9b)fjhZW%V|$Q zJn7khz0~oter69^ysA8&7+;5mA9_5(Wy1l~PxugHTY11r6Ht&raNhH{_^NLg>)I-W zv<8@&Z|(Q8$pJr5RI5gxvU&0Y+IPdJm|4(G1GRxtaZc~U)zQ}?g6$bb>rvZlz44G) zF(zBUdrh-sLq?ZVs=|XKrjU@>IJ?@7e9-JY*+pOn0W?r_^`gbTi|(E}hjV22$WKb! z_i_F}C4t~%h>Y#eUi#!Lm(sZIPp}pq6KF=r?lza7;?83Bq612We#&RLl<`kZ02SkB z=|SDdIQ7g#98J}p4ELd22Xfl7*E7@agJ*?C&0&pI^3d5$#siJhQdTy&Vl8`iMt{yI z^5!k>+m>(K1*C)Bc3~ORsT~eBr)?f4K|ds^B1QrxRlIJ}8o`H+9N*PdKq-MjOik!) zmf(k>f$idW(b?_i(F#sOJF8|H(iVUuHnHJF(Fr^4B}wYB4P!3RMHAcNmmK0OtTN=J z<0CDJ8!tG|ii@4p2iq*1ssMu0BTcEu$4J?Fa?dvrQ?smEV>;6Q|L!_MZmnu9#ffJvrT%9snE3O&TwNx8-^==yqTn~o zM1T*isQJ6hMEwK1y1{@@?(H?fL&LNf<&%AFr-&V`f%bx5tO(oN@tyr?9x$eal(;hH zO83dN_g1IRczIX@gG+vqG-Y#yHS@zno6ixi?;87b=jjx+|BRczu-7EcB9tu^ev}wzrmvj4w0dY6z^P3T8Smdq- z@{jw7oO}Z)Q+rN@2$UZm86b?yrx;%Ue-9K)Vlr`nX~s)tNw zyPiI$TWBBAK9;mcB0psm1p>(e=^cxsz(nGUxt>A{Kr>h@TF{xb^0RyqxcN@Dex{Q{ z)4eTfi!ISht4-xp+|W_u@Mzwr6V8U_WOlnLDRSXtH^mxgwUi>L;3bD`GubCbSs^qI zC}$on$1e}1%?=~gOh&~H(jFfoI7xze@ZpRe-fc#gm;T5FqLWf>*^F2nxPLQmAWTI9k|8nEjeWkwzim)Zd}!! z{?;XtkN_B9FCz~D;R3_;b^p}fx9GB&b!Mt!d=q}=J_TLM4`~)vJfk2HH%cdxu?b>^ z<(;Wv1tm%4VY*)oJK%IN2pcmym@t(q`U$J}t;dK9r{Q%Y)D>7Q*pyAf12M38*bf`4 z3^kkUuEZw-ra~xPIOS{?Eh&_gzO)r!R0r>jjFKjLsTlTBNqF!x>=6uaql29lp6F5S zmnK;9MuUjDj;t(^;C1(GD8x^BKtO&O9{YvyhUB0Cd)JXRF$_#H^53m)%S5uS)gmxA zTBxhA#I-`i0n0zbFDNSf*DMpt-o z93FKYGjh;Lbk#s*JN2t_YBSUiI|%Io4Z@M#g{F4jx~X#6W7MpD=~}eRDl2v@S35oP z^-wuxA_vLnC)v^Ka54^eMR9zF*G6;-n6Om1^92{vD5 zeL0g~tF4-;z6i(&PfQq(98$_gHDN*XO0>FgdaKi1)1uTw#%o@w|$ZhfEKyFTI=746x0pS#|=s3-9fiT>MGpWPM1jE zIM>+HmscU97MdKcR`|j5uYmg)Hsc%+hu?~q-3080eq?wgw47=<-T)ZV3yDLqh>Fj! z7llrtmvZ;%?mSdEy=7N9ENw`qS2{!IM2Wb5ZxGch40v?e%1ri>bBT)JNFU`W00v$; zaHtJZHQSbUYo8|JW~`}Rzqsv~7PwsG z54t0pA<7Qbz? z-{A^8^=PyO?Uw1qMxMgYzTNv82?#lgAoj{em+Kzf*(k||YE5FDsNzyxpKv$|Gxc8# zLj4qORl*yhB32!%G+NUF`G4h2{6kEIcy9Xa!vf=^)DUixnC=_}UCwTCW27FRz~en# z6<)Q|dpYqoxa<7s`aNt5)roq=#-b8W_CSPJb!mAjRr4O^e@&s`xshqIf7UJYa@?P45AwNNl?-iO zSZK4@FPLft$MQ32;16D>jB_iy>lQL;p+Np%`pEa~8UumW7_fb-%_cdnlEcDJG&%R3 zq41fyk|XCy(bZzyCa0t@hj?*%vD+RpSaGNgdh?b~N1YnE0hrgJzp=c@cR$~JtJsYv zyg&4sl% z$#kvQM;l48^{O30<=Hct;)yQ#lhL! zKgc_4Q{o~6D;9FxzrGWt=h+ch2KN~JzGf{hyn@75liMz4bEIAO1m&YBcGnlF-aF9A zxy4*ZSDx^jhARAToQu5#*$HATq+V1%lCiHDIeck7ngYUnmrV;zwK+^bTf5#A&Npig zo?ymdAsSU{L6n?H~WYNMM{pj~qzO zezNl|UvdU|angKGaCE!@w*wu2al|~6=$!6P=fhQr$WG*!gdMnpPpj6rx=#Wr#I)M* zzpmQgnxzqe9=?P7y0h2Edg!Al71$QE1Ju({qQV8Sfjkh?Kw4nn zX>GcX=SHJ(YTCdMnWOPMi|nnfBH&{}`5Cd(?}s5Av27BqzZV}QX?1^r9Y4lBHEVUN z&@xizXr~dEjc zo6{tuQdgOg1rdeKv$$4=sXKxT3zn^PvLX%*b=IXwd90d|KHa1~Mkkp?390AGP*^SAT-pi{f~zdCGiz%(SbLN z#G(Hx#(U%y42gS|NJgz-ZM?4(I? z7=h9{JM52iRWiQ<&d2;Lt(MhuR(ScMI z6^6YCqbf&fo{3mX*15rKnlYHFa=8-sy|oi$bD$8Lroa}!377&-StmO?66<+{zT8WI z0SA|%*g}AR>pjIr$Ta%YfX;auPXn+R|28O12urr8Cku#W0AQc(0}IP2o@Y(?fC?S9 z8XDJBh;GEF_=5=f-Go5X<47$`XH6G)@g?gr3ON zYPR|$F62x&R~eL@YW=Yq?A;5bomWxKEhYq3eV4cY=IDa1^AAm?T>4+6kN$%C1b%;< zzb@dw>|0+F3ctHQPU-9W1?ON{k_iYOoLQ-u(Ud;{uE7Y=Vde8i3RByZL40W@J0jlB z{TP^_`Rw2_fj+kjEtJ?}IRfNW3S-Ai^#iJ__I5&7IM6B$mr6_hbtyw9((Kr{J%_7C zET*0rMWp&G%k%4`skWRe9?Qv2&WuhfxAq)cMx{(#6ZzdFR>|Jm`>Tj=Vffj1`MHhWUR#w>VHWPZi8g%^ups zrLrw83e#FeTV%p=j@W{A5y~oUw>Pv^F#Tfo)J}7H3mCaL$5318!H`g(cwuiW+|A6@ z>QYAQ#eTev`qSGbWAZm{$2G9GYVTFrGmCOHp2cuYU=`z{>*)~bF^=h!t~rU8UCX+p z#od5s**9O60Cvtf*dy)uBu_^gKe2~Y8ZTn{$osacm@3Py`=Abwb;;N&am#^JI&EJr zxh{moT$WqbKudbVc9{C2j(61?2`4xQI!8zD2ZO3(2p!)SyXv1)ic42v9^1J7{XPWu zPQtitbh)K?-+LF@moRH23369v%MGN%*`736kZT}*bzW?e2fwWOY|o%*vN(xu5%)m_ ziQ9;}5eD=w;zixH)}njUgNnhG+7VqV`lBeaKFnGtpKuwr_B;|>Dh8C7!mr)glKmAE z(t!Fl@mT&`~Jp1Jt6k90Sm{$f4op0ldSgGLw^95LZBv56l@J ziNn7!JnA7f4jy$P!0^a4&n(gq$7`P(xyHq-9)B_P5NDHGob+I5_ik`BHh|%X^Cv>% z@o{s_h=Ch@>FO(84CHh&ahUA*hguP7{|{jfNmVl(gXko&j2|aSmGE(JcC#Gov z#_+ha*Tly>(iUn9p%ijml_JL+Ry;)pS3c5F8>K@lqk@TbS=z9YJMsE2zPOw%G|UH> zkKM*J9cNCTh?s*u8n(W8IOqz|{#=XT{JIw5KA+Sp{R;78R1v-4MdD8^fQ5x{Q8fRt zXvx4|#TI`L|A_f-h%HE-jQFwJ7NoK_vBf2-z_deUZAZ$Zdz)$(lcGH@cHa!WT~NGE zoI3?)uk=Kgy&eNX9@h8bycZ$L)?MXeZ;ibhCoe1Zmd%6*wZB|s<4VhfBQ(J_>~LwJ zEw#88ZhwvV(o=OE>4z2Lctshx8$hLI03_A-e_~N0>;}~v!h9tVNRMEQd9PYcq)gjS zYgkSAGcf&h!Den!l$+J+R3fmG!>M0#q=yp}uFe>*mZnkAy@k)&%6<5rhz4;!-wcD4 z9$n(1?x3pdzBh8-gXccv1GKv5k5%xCY1P6t$+H`X~35}U2J_D2d*@< z-<9O;veSgM^I&KOsac%uG*MO|TP$i%PI94YJ8}nfw#sMC1%|g-S?F=BXY8PE>M$B> zJRv9&<@3$ZR;$hiGqOecq_3 zzR9uhDcy?HOKCP*yW}S7L)lP>~lr_SUi6fz0 z=<}K@Fd$WsdO6vBSn49r>>IFkcHNVOZ;nMpOoySgs#O+Ev5yR?v9r)o5G`!t*#SX; zhduKmwq21GCtnVY-4VUBk&*Z$Ja{U-&YsM_5WK2NvSsy^)pei8v@DX_UbGxRza&&t zWDSrjs+)tl#EJfB)Qu(kxY85U8802JhiEPLyl{fcyr_V&u~*Qx)4`~K66dL!aZHJU zs~cE{9>mt?3e++SrPw3_-~}z;2fg0BeHGp?#B!gq7~st+QaU5#%W_>tTA(lD-u7EZ zv^iZzcKyK?^I1nzKF*WeKdz{?4lJ1PnV8K6Nyq-EF@kR)N%{`A&v+SDJmS>pwrp|U z$-0|)e+7%I>L)dYu(s5dF|(!Fd-y6)O#Hn&d9R75*(=q{dB>-D$3;ngZ@`S0$2rC<@8pwzr*JVe?H`!aU57l;NXH%TB zu(-|E=M$O*)3iBV#Ce5@ur>Rus@?ZE2N>ba$DIukxq)fI&C{;&{awpB1?t>}z;>NX zap~=ZqlVQL{kS1@X9?h*XMUY>x`HJ6wzut4Q~u}1C1!U7W3?T$jRV;H%9E$)o=%3+ zQNSU28JzHwJR;7c^O$|V+W1jp2)}im^y5y#H&eZlj^7MeIa)EYi>Vv@UPj+*(c9N< zOjEQqjGT4tZDP+y0{5N1L{i+6n9;C0{g%!n=NSY^ z_AKjoLw-nmcV&4pR>~az%879d6IW!g)Ty`X?)T}ochXgoz;G^3sVA&LIBEv76{I*4 zDOC@!BZnoXCAaFmPfl(wy?vAo(Lj2bduM;H9Y5s_b;_GA9(EQLJPwO~NW?-X)C( z+IYqs@B+VJi%)FVf052(DWtt(LsAo9JND0a+Izm&r0Skz-B zP(ii^^YV;Aro79d1^IUphoWmcw*_nDBW&&fwE#Q~+?rqcCc^aIs(^uIfHUIWQ}dkS zUEynvMU84b3=zP9<>Kt7t5OWGPcWZ7p6(C%OxFg(+zb3N#MH$5s80w>K>`zvru!jR zkDn4NCF@N=jl$e|B(Mh%?n5wQDI2H&Me=w`2q~vtZUKI6_!7JYJZtJOhOz63GtqBZ zCeHC4=8%$Q9e-<=(UJ*&P#SS`qR!`ulP44BFTfC8YA4&?>3V{ zJPzwHlcuw?W!J5F>kc1+m3t!*qG_Yxfk9*rFTVJ14lgQxiX-Z*4UBGJWO0V zX`W|n+=ZYy`ujqO5c)rwXFMWh1BMaHw8`ndcJBtc#}#DSOP5r%tgh?K6PKZxrHHjo zh`X#IWuBq$4mRR?X$a0AxX5)upq=ru>7q*`_k_o4uIQgx%5UM=R#0@Fe3X%3cVe6J zghWbi!%RhEjT0^`!yrnp;4$MJQU+U4PAFlqrKetxZ1|| zJdlQI-s_+{hA|XOI<*^HGoSV8LQ6zBFmVFpmMLhXel|%wN;1;lIos)UtM_)wTj(cM zCnM2iv{1B`C3b%6Cg%f5e(J`scDtR-pk}x+c}Fj3_h*d8w6nJN;g3ZuKCLSItSQq^ zTh-Zo$L;1wk!kVhpnRZ0H#}|klpAVl5sWFcEolLlGmT`^iE%{KolPbw`rZwWcCa=~ zC>3=W%K|+giE?-Rt1FG%xs}Gozg}rrnpYa&f40&hAcbf!#FCq=1Jmpp`_jY3fK!2#ZdqTE=niBK8W))Zv3ik-(PYpJ4f4@@M*2A zUzz6Mp`&hB?R`xx(-cXkU`mY&UHlv71F2n3TrFW7FkU&;5Yn^Sx2Z^d9&kp6sYq8F zj(nG5+n5gOZ#%dZ(^6fLf~r1oVO&%ew0Qer`pBq?dq^NZG}WH`)X=m8ZEc6>M;OvM zg5!K7sRMt2wde|Ga&~Xs>X+y~TU`5RVTUI*#TZ|)#Wj>JO7H&YBY?UK_%00VbP}_O zGB9B$F&KrE*e<3Q|3*X!?A(~E(aKm^Jk6w`p4;Ex?% z0MRZa?P+Rfm}qF^ppNv(>oafrU4DUB(_7cUCI@m^5K?5n2lCo(mjrGOY11_08CAn+ zu=IL4W+@I?RKjo=)t3Dl12Lt#`xPo~_8JW3x2?_}7W)|zjFOa($WNVN)2REo%EqcX z1wZ9wOaz|puImEU8sMMS8iM~(YmJ*GIsTDN_@lG#i}&nwJ&zRRi5>J?r=cq)W)MUhT-KGMa!Rs!UOZ=} zAO@Od(maLEoC@6e)YYm|OgR9Y1mcM_b};1^3IzABDG;Pxe=Vx~9R*_cZ&M&>y6lFq zzoI}?%*iMWjlY#q{78XVW!j|vChOz3YH;;>i%YhjoE$5v(%vcRFh>)0W&9lIPNp@S zA-nYLa>ZCzxnz2{j4HotsHQ65RkU;lW~1F7B0)(1ACe$;SQ4vER;^(@P|2Wl@D$Jy z*fX1AFzIoRvg*<69o5y`qjXehl)R4a^O^B*M`OAIVYo;jO{9BX}%xgx$K352<} zG;68r$P)4Hv3c(2C0)un$^v_CxPeH)8(-9K-$AZQTD!zoHo?+^-%=JM>eaqDE>lDAu zC2EJ%NCo(gwh6T~3$9h{8yDq}(?*i|ILtxQbL zg-%l6xOSo`_f4r{vvb&Gi{v$~v7X=rFIl%MWoY;a0*-o|;I$SYLriXZC?#}=N}rJRkTS81;UDM3RA65t0<+u-+5iqa^gvtzBn zI^@?;^|MuNUj}SK@{&BbUeZw@yy#9z+B2=_M#8Kt(dzEh9a<~6hc>(u*U@Pqj!@?0 z_GfU=L-J3<(xx}vauV6Ah``CCpP%OxtPonwGR_5bY88{;R@)p=rwTjfom)?bI+yEF zHbaFHpNRHgeWDb5B+t9ZuKg?5>gO~9sDt%)fs?H4nr487<_wbuB&fXVhIlU09irn1 zJeFX}N6%J1q26A@Ih4@;E}g*qEg^zsVDTr7BJjyu<6nFi4z^CUirFR|~R zb* z@(OwVKniCwcW6N`JT2bd(@hYpUM znGZ~M5+pq7mEsr&%fL%fZrm&C6LRE5xutj=%!VPKhHo5?OGdbqj0D0*?f)=tGQ}Rn z2Q@=Ck{T!g{6M@u`LZYQrO8u8+FwWs7{e9x;Mwz@691ULLI(E94pTL)NqPcA5&^e# zdA)^zwdSWe$2u57cZ6L-Ua1^ZFrUc20 zn|)GbS9nO`l*A^h$Ha52h@GM3l4p{FQ&Xfy(z}-Rp(g%EkFyu1c(mxPr=!aF_?@0H zSu|jcAF_M^lNYM>YhewoTa3|;247zyT4-1%Prdhx&%)_H^jTEujWVmr9|ZB56Zdj^ z@oGLqnoGOv!6g?*ge(^gle*su!xz-aj_JTEiMQ%#ncD9jW=g<*RVo?RsJ9Y>Wi=3S z*rdr|x%Jti&7S0W3gIq4Oj8F221~b`YO5)=;2b)S(phvrYq?W@pk!o}N~YK{T*k&M z3&C5==t+3JZw)6W6{pX~D_|)Y?lM}b#mK1X*XV0L%Hot;NQKQ^ zaz}UO1RncY<g$sMZ?6by+H#slJ8wFJ9+)R%e2gs4AMJA7?@(nPRRH%iKsww>%0Zj zGCl=R)Twz*#=7hAN1Lic=trj@>i8R!Kb0CRv9!-~)m!0y%X3%em+thuP{3s->hqW8 zhRsJ9?B%)Z42t2n%kj@3mY&;64d>>AC12wjb$`NqhMqCy8w8X@!>ft;+vj(bJgLbE zoQQiE8<=l4TSooPZ24D+2-d5Cog0IiOBpx7n-#BXvc+m%3kL*%CX*#rgzTyuTr-#_ zc2R0cXGwepg2Xr-T*jB@5*$Ne5+oI)=#YIKBQ_9LS@Zoy=QSIF)NTc*V|Hirv)G-y zZGpYOXZfEc2LOjw7S)G)3YiNxqZ?okko+x(fipp}y%}ITZV-v4(t}l)?K3APMLp{K z03t$OU4s~0A_DXlYYESUtU*qh84rQA1O^@1XNf=AE%+2Dn^G~;e=7$11cN<>7@+QU z)o;BGfF*|9Ie$xTX^5fc)!}vw_(DsZD=m6S*)l`)Urcf=MGo4V8z7JblhpgR|0K7h z{Y!F7md@yO@}tip@UF6|MI$}QhWADfHSAqVwJG=!-@wPN9GMrFYZumjl&1&Q98WYi z$BRFrWA1+R)1D*WG}RYZz()x`Cwhi7R>tT9(56w&f`7=IWX&}x%)-mGzahLNev;cT z0o9eci-y!1FV9Wm6}Un;Wi1yC8lr%Q$_^>nhzQmEzJyq)`V@{$?|%1E~_Yy%$+RC z%_L&?q+%j-MiaUsMp>E+? ztu@zut@;Mcn~vQ7VAH{$+jIb_@b5Prj1SG5j-~%((~(eZ-gLB>HyunFuwTj8JaYZL z<2VJB8Uf@HLotU5mrD+i2P3=IDN(wL089C}@xd))cNqsULHtUaa)Jb;+dCP;vYQ@hX41QLF!D%hchXx$hF^O0=%kt5N*-NlVi1Y2u~2m*=|k6-;V_*ne2BoiTdmalJW zf!^tf(55Y?=9$v}+Xf%?zYIQh;pfL5h(HmKJIV9B5@hU1!o0Zedxi@NO%%()1$Y4>;l}H&pumFt$#n^+Rz#B;ws}qJ7D(>A@6aymucZw!w7nH!iIR3 zeFBw2KMAtw=CpPbre^hCy>hW#XEZFL6wFY+|HO~XpLhvZ0$PlepR^e2{~=n8S8}b9 zq~bNA_rpd@?WS{9#~{kdJtWjL$h8z2~F2mWU~8e;5G9;5$Mw`&}N9?igpk(-sm*+iRV?sU4~3$@4`}C*jOWuFo*TNO_l(G;sw3(`MstYB(l|cz zH3Jn4Ttvi*8!}98teU=WrwE#%t12Q4p>Bj^q>PG?x?qfAv!zz!rna+huzHZ%K-YNAK(y1D^-5&brpF%y0o zo6F$|dDo^^`!!Fc1F-^cx^LZ6HnW_mVH{_%EsvYVw%A(}y_M~d-3@JhrVm8(Mvm$b z6b5>ShcVBfnIl;S&XFuT5CdI+Q#1bbIMoIs9;w<>WR5Nxz`JJ~QbBsRf9lGxEnc(j z@u8UoT%y!@L`_bOQ^2N$>@`CM*?)s80~m(eTfoejjr5XUm6E$*a?`Qg#O|2bLJ_w% z-&tQZ0N@~o&v``bND?hzt`Sh}4Z$%X0p~B{f!u<+*k?z11vO(cvR9cj$Ln|`x0!v*h}KC%fNahw_1AK1hN<(vg+x*Ri!&3QgmYhJ@8$TdxqZH)~{~Pb{xe zTNed+$r=-4qb{sO+OWG&jM)1lo)|+{L&Q)tX6l`M_7L_S$S%QhTf%i46uqj*&t+;Q z9HdmeM*GKM>-;63yoA0bxZjbBeWfnUJ}|*4J3fwg7=-3{Sl;`pcKTJ93={WtZe2)| zOR*I6ob4DLP(X3EkiA|@orZnl^!G)ZxyucT*9K_274H`eg{JEl429j#7>cmpxH5pd zJtk3OxDz`7aToo$NV)56Y&H;8>>B`-6TMDh#E^kgRx6yGB6KCOQI9m7iG!YD>eG2f z|Nf@E%sO+cqWS!{W?cr|l?li)2H0_tX_0$Ym#*$?g$%^UGg_w1^@+!#O%%I1^JWv3 z*(R$~K;^eP>sLUxGY<^`vyjGrXBHx{280=yAB7ny|A8=L%wQ6IL7jby3EiA>vT$Vc z<)mVp>1l=gcx*E@T7Ha{l%A_UZwd$cD^O1+l09DO61da64Vi77(eKsnOY@LSQUv?i z_e7hFqfdZc$aT8a(^Vde?e1U3T8I;^o6l-DvsdyvI%p!oJ#S^(p)||$#Ng~Rp3P0I z)FEF3=paA)uHjvPOF>%QeAFSzUvn_-JCpk^rGq`wzPtyBtpt7QKg6ZrBbivVml;ff z8nJYfAQD(94Bchev1^vLN+CZvU-TzZz9^6hEM5Q^%_Kiwva`tfNDhlNQ=ZKBNs@D&Ee#SR!`r z&!zl#|YOa)oQBx(cL(>Wmox}k{p_{TV*N(sbuO;z3b3IIBIRCG=U$CR0_;C5$j?v)3Zb+A@;rPPo!GIXy;N!k1Rj04-k{=u|EBD|J;$ z*aJZ0Svx(AtY~nd$@8959>rnRiaCWRZ!dtr6lMvOO%DNXM`qHuqOO9{iW!%!N5G?h z)T0rm?iUj*%2?%`D~W_JiL|dfB_m$`fW&j9m4lY3**(Z8YC-YBXD=lk(tY&&k4ZdV znSdM|^Ev5;>wj0SO z=T~a1<)?z=5FqOy64TZ)-^ev;k07oA{4_PdJz<|S+cgAj6V!O0`mzwnlE4Z}WF=4_ zKEc;ELelnKvjIH-wbi`JJk=aV{QFeQ{{c}4TMoQLn__i;Hoo6Zp8YB+e95jSy0G~f zU%OMY3O~&J7;+oas=R4NX-0-fSHuW zw#TN{opZL0^)3IzwxKB)gSi;WCXG1xu8GMxe8qVciLnrtUKj$XnsJ25_%?F2HR*)t zPbhNNuCtK=aP@u!YP?K+Vh_yTK>o-{)TP*SMrlwM?j|VD^MMs#w^6^5%9aFe_PZ|W z!kiTEO;!c*Q)1t1(@Z%LNCeZvZn;;L&&$UivZ{^kOG_yvg3Y-=3C92d_xGE0;FBkI zv|2*U?ySr;BXu2?9}SBNdLT_ZtaeVWO|y4a+EfG6jzJ?9?#HF~lulkNlReBPZm#z= z>}?vp#0i0?SW4}`za)<4@$$1af4GEsHjdl)p51G!sWj}@9dh8_Urx(4cxPHfK&O4M z^yfdBH%RSL;_8WCw=k#(h~aeUuSO(px!wSG+FKn1$cP^tF~qMbsRy2i%roM}1Y*&k zO9#-CcwRg*>Y<~NBK2>b3F0GxVNFrCo78>Ap9h-t{iTK>5KNz{F9ztr;{$K-m|;KS zF?CD-_B4cf&_q~C%WARICcfuuqqMmn@ZpB`2lQ1dIP*~D(-J@vL^upbj|Z?s7dZ(# znWM46^(_Kq+6*$a!E`Xf~ zFI|7l+szSgj08j+ATTVUTJVdAV**jZUs_&kJIuWTXgHYro&HQH4{Uxob8~_%N_mUZ zJceBvC+`<45(Db<0#Kq1qHsX49cqnMpPTIDvuf5>q{S9EIt78tSCWqB3Xbqug$QQ` zu!gX0OVH3&|Mp0PctoSIU7C7H+sd{5CYhdld+`;~r^>Az5h6uB@zZo$R)%|pyUiey z+^YYpxrm3!cbRCMDoA|ZfEKnY0UYeVgSkK_sftKl-ROJk+@82V_0x4~mR!Ht1Kx4f z8}TAvN*14q8n(8HW80*8w4(8$6@ma?IX3^Qa>aC66JeSK}Zb65~l`+=#zIJpAQJZV znOZzzC)qHHQ-MscKTm}u5SoSGoRMfx3@~gF{N?i5hd*T!WQd9c69f%}$h`Pv`y?*8 zi*wTkvW#|E%~S4+X7mufGB~ycdwMt{Y`msn`DHG#B&2;Q-O(a~&x(60*)%<6`?HZh9dEuwOWFF4e*FstIe~BqL2$juI+Pk>>LOxi9c86`M9=?^ zy*CeQ>R!~g&)!z4MM*7H)G}xtXiFv9fDj2}TU)UOL8Y3CkT_I=pbSO`BqZ6DDn%5m z)G{ZIP(+9}AXA1SlPDoTn1{qLBm_u8NXR^VE1<0%_Bs1K=ljlghWBr-Yw5N0Vy*T3 zp69+7;*LqeD&#P6IPj9Y>6CB7>1bLcovz0A6e77Kk$A}AEywS zTF|l|z6+C^6)fvw(6UjZ5tY(r8Wby3KnF|E{%mLU(?vi>V<-=>b@+IaOdB3|gzs%O zKC79EewgysIZX67=v!7nNXd6=ZIXhMmc3+BxL4v;7bS{lNi=i!=3Mo=P~vVVd|yaOIv>aM9q(8dIU_WYX*Wewtg)3OFZpyMB1 zU!VQvrlcm*fyLeIq;(*i_MP_&IUm1iRd|;Y+{|7odwPnXfgR`_`G29adSx=@qyI%!J-GkJS`R0sH*1TMz1^-zA7M2yY%QE6 zx^9}+gtAkKIHkz}Z6p1ahmkbt8yzJh&GRs9-A>?&IZ#2Itnya^r^ND>+B)q2r0lI5 zb(R369e)%i{HtVeY^F7k(CD|ts!h{Dmv;c~VA_bb2ym|Ih+I=AR8%D^<3T-QaA9bO za*AVVZ=BfvbbSCpgdp?Xii#v6ShX+IVHskXcs%Ef&#yerw>Y-*JkAjgDl8GDD@fcY zK6=R^i+?u;n3jzEd!{97n~U#W1m}c)RBuRm-dJU)FP|ft9Bi#Vig1}Ma-|9`N9k_njB|u-MLqt03%?9fp`=KQ#!jb2|`UZ~( z*l2yp%N*pJsdM+^FA6XCf)E2VqgL7G5Xb=v7eE~!C~{nsf$Lw?IB0m{2JcLAmL`+C zgDBj^Jlhv+@1B2SZJWa#P`rJHI1h$M@b#sTW#5H$L%`n12ioG37oiSz9E!+fwMpjR zVfqGGm%uNNzGp#m-i7@E&58M^svJdpD7d7x?WC$io_0e`VG0|0gnGx~rnC$kM%K`w z_&cjZLE|fREC34;55v}83naj4>C}V^qlu|@H55`^?#5*2RaBHFJ#ChGd3RKTBd88$ z%;6T2vu(^a0n~62{os`{bpP$SR4))^`y7DiGzw>O6igUl{Z4p^)94|+s{vWlZSpl_ z#jF5)g#~ZrRX<4hzLhTs@R%yK8~rLJ5oeZGZhvU(78mlb57{$2X6^=-EfL2sx5~a@ zg}-0Y;u$R-7SZ70Xy~`xjF%Y0EHD+ zPin3lx95CLyr|p>IaP?j)aO8lm+H!JU&6e*e)wnYAHdw^_x2Cb{ZZD@x%Twtza|P8 z(@4`!ZBE$NqPM`yT-<5rJ%PC69APDiRz^_yBfp2pY8?H+4?`tRUsyY*EOD+#&m^72 z0cxG^vryT@Lo++0nS}Gz@qkrSrtzJdz^`JJZ3+klHC6tyH}T5lhv?63frx{m(>0Sw zx+c)rTJI4AB39@^XUMRPhRm_{na_dF2qKWKQQR#^oD@#fDR%%Lk04Pd#2Xi&zssY= z(|e{zG&7N$7TFpHkLU`x>uJ;e)8HMe_ck+Vz=k}$hbB_{{Q=qe@3x9gWSGyd{3&nk z$HcARL}U^e-bLDllyBd)<&#)-P19wjyQ;DJk|9x!w5U0aSz*CMBsasY&7*_aU4 z&vAZ?q{d24z%}oBFAC9vg#j(wJ(AJi0?m$YBe|9vZROX)*1AUg^fv7uKHc4*OWImJ{q+AWOH8;A^a%NgP8Al3{SI03fOm-#?w3R zQVx4(Z8oU(khw#$rxkzHiN3*ffSiw?9(YH4{NoH}UJf7uff;WM*ZiPqduWk>U=5E8 z$U#&z2sn+46=2Pj~;y4G7JwOQ3Ypbr44RmWxrwB4Be#G5n9i{+@0yWJF zd0x`TDV6O9Mkk^;EUCu9ViR>!eZ$VHEkcWgp{XL*Syd3E*-!=!8+VX1VRv9fu5pYD zoMWeO>nnkxN1*g^^c?`mL6{RFQ?<`GV|N^~Rt=T$Q`zn(fFXA*-iFdetnCfpdu5*~ zD>!67v`Fc->HB}I0SVkj{?|1ijFU%5 zBQbkqzVdMrvwDQP0lR>-=);#Cr>~1vjIp7Y^7z|W7q-K1Gjm5o>L2C55InhmAb7SE zt%TKXAB~B}%fE5qDUXbo2Er8KT@&&fx}WLR#Ojyxlg%v5jQEsSbB7-KBJXU#J_nX^+s zuKH&38s$+2bzsnL=H2N2JoMVbowsJ!nWcAmz_-H2!c%S66WX5JNv3m-S@tK{xkbgb}$ss-3Kq%;u2^mkU>Ryab zXcR-&sTk=kXelr-LrJ(kzS}@mqhU>Btx3}Fh-F=9S;;xvAssX*s;yWY_jpo2wfBr_ zvY);Jys^Zn_4T3fJN#?b@rzjxI@8{gbkObO>#`Mt(JGV5bht!RdbZ-miHtFfZ~lf5 zZ?g*4*@l#mWZ*AXrL4NzyAIX5wKN^|#lX=rAOsQj*Y72)M3q*^4#T`f-cwc>iHc)C z6iT0@MgVO(FC$Hgeyg<`^#y#lKNX-`{2icMR8{+K15g^oS5X?bMNX~bqCgKl%@s5f zKU84}ELoSj&sR@VP5Gn7tv!HxbmdF+D4Z0gs|(39I*rC;PLEj0$NpK0MusZTJf^XF z-2O}3!}31jG*kVGdz3X?c^=rIBz0H1mjHF{DSjVGogd@@S8r$vluU|^w*_$r;faAp zbJRO?vy85~k4@`d%kuSp;=85V^SFJ5v}AE(hi6GHZ^iCj%;V5RK^)(B=ZEB7a6;^i z<1LZZ-rlkXI>49^8}kp$(tz-zVe~qzc96t#_G!rE*YOT68}!}so|M^F1{6I6Av@R7 z&PON>NS?&kap_Q!shva&i37Jt3!M&=ZJiurA(ZqYV*oNf8e*rY~KW)dv0H|UyGC?m@hL|iiw|Kvvi zmyrX9w#etY!ZW$pQZ3>*0OV9oQ2a(hj0${vLf^Bbf7tmDj-$~pSpfe@{f{M$88T{X z{EkEVcfv_XZ(n+S@luXEAvU8uKW0MfAddGYdfk~~CJIMGcKQe&F{dP%xCGtKSl~&x zR`>k6){03oQM{e5{;=hl^2&uiYrAu*Bsgzyr&kBiT1lBxeqi6 z1xwHteg(nDiX*q?TCi6N7zTYg+8_Ut42y^yFwVOwP#LP0+77D&zv5u!XC#+o9MTm z*%Sm)rE^TSbrDq=lZSmfZxJ5sj!X3Pg&Ay>1>IEyFxy8CJFWOqLT&yVvwo&C4*|DB zBHHtXWf8;hOQ*1V28|62mZNk9PY|{{z>VO2$phYcfg&}#tMtGO-a5H=@`uEgJ#~g6 z{-$U3Z>XX&?^|(EmgFNJiB)Jk9ZD7lQ4|1217EMwR;oN$*n3*-VK$|=8FeTuyI-w7 z)oR^Tq$1%>XvGmbCj*e?Bq*b}zMw+5dSCt5+^GQanuYv?xRuJkGK{K00#=a{`LTaP zRqAsH5_~-C`N}fmNNke~>Y$jw53wnb$NKUAxT;jC(8J$VJ|FzMptv!!Jy}~f`^4@c zSoi@vf(om#*Ax&)kBXQBHXJ4JcE$tp4#8`Z_j(kDL*MQ?v5NEy^K;hEcFTmQx5Bs8 z_T8EP=Jbpv8E{9Iz5i8jYPk4hLauUa#Ux&C9DMUfN8QxSjV#vdoWH@pU9`(GN)dj8 z9WVDuax9*bi;v_g}n6|#gSa$nD%#m9eJu7F!a^{O4igc?|!a!wl3y~7c;QritevR<7f(55M`IA-vm57$IDphH0cZHIX^4b`nFu(5xV zu0e)#{{QcQWc5$%THGEwz|2#iUmK-yhjMzAGJ!@@)WPgMw4uXL1s<|<>CsPYV zNsi*2G$0W<8kSp<&VR2-et!(T$H^@-4Cn5VpTjMW?9>v?i%ZPjtG2zx zz4DiVw~lb->qHmSKjF1jXM&3|`1!T5oX~06LLKBv zq>~;f->!KMSaW{^4IL^VdTDMP6XthAp2XJny32~5GoV!zI zm9#&xuA6SBU3UYt>EZDFPwIRmyB6hPH>F429qyhEGq04LcHR46^t!9Db+Xz`Q0Y6H zFC-$$2(x!H?nQ=l)lgSSu5e`qeQLyvB-^4e;XSdl#VLndm3Zlx*ho7ot3X6ay$lm`+O%Sxn=wx%TZ&%)jK2xKTtGxS(w^4B~+92*u z7!A9|$Did?SQU4?wk0uty^lBXe^(cTG)^)NA`T`k#eJ!+B{~aNlrLi-gHhh7rc<2! zv9HfeFUJ!IGn0}PQewJcQQP2Q8)73`x6c*w=6U@ z5!jD(>Y;bX(BszApN?MtIKI+M=VU!!^PH`_P6yZ=JwUQDY&Ym04tCFX*>mF1zAI#w zeM;DDyhX_Fs)0|pJV4;%TbF^WO-W48t%MLC#CIOlf&h5h+s^z>cA1XM}>B{i;vm}3XqLB3al`RV2b%E=YDnbvxzm&H#LT8 z_YSvWgXdb{&m=3y{&FNOE7!yyfcwDMV`p5uSZTmE4JG1`to#(UCgVui@rvgWVkvcm zSuBOy;SvrF+r@rv`kQ~!sRXM=tTgSSPaj^4&hbi#N}<WyvPaF*4T6h>>-6bCokUk|M>&IDd%+bagsmLSIk9;%SI3eBat=li`GA&lO1PV@zD z3h~|0UR#l_6A%7)uu;sgkpuw(6vm#H0uW3SzoI}-T!B1Rr6z+ z8O>P{5&ZgOOFiv!uqQTm5F5Cyo z#fqR)s*f@Q&&G~k@~HO2K0vn?JVl$546T=DO-%Xuz5eWKPbZ_5REd#}HNIETUDrJ* zS8}d8UgYaj1=G%zwqIEDymLlpA^|KHn_Ekq15_v(>IQqFOEkmf2{ra^9;V4e6}@u? zznAwE-!tKjrX5qnzQZ+t<;qtDYx`UbD-p}Vi8lW9*}Vj8!sD3%Y8)FnQXyQ2GzRoD zv*K&;ByUnBT(&YRtohX5kw7&hh5ri@!~|H70KZjRwCuZPOdExD)O(2Kv+SDfxpak_ zR%5j~5E*qD&A~S%b_8-R)#t57w>_RBx)qOpjKs$1Is*b>1iVFkc~o(26xh1+?TJ_D zk&h_0)2JWe%=k?)W@0DaAI{S9oI87`k}~5UL=}Un`q4&`sig&jRwQzF*iwZZyzDo z>xs)+uW6XGM{Zf^Y=Xq_80A2Ip#Hqnm}?6rRL#PFO!Ub6i2#P@ckrkp5jkNArpva( zT}3+;a2$QMiv#2&cYD0zWFHE9s|HH-^3!bv+N3tsOVpbVA!b(>kO)A`5J~3RF;pk72-n_V|sJ8$HS?Gfpk0M#`5Fge(N^D4a z4*It(tY5OjQ$x=qs#IysYgnRlt+!>d9;CL{Wm*3L3u}ux(Yt)}N6W(6VLyb(m4|A? zTxe*7@bQSYh^PG&n8wtqKagxV%@O9X9;?0-lQ2{|!ckSfv`h%(C$-hUG3OO?gvtYN zJoQ5q{)b+}nhR2qukK^=zGO-$`&vrMF3iQS84anym=*;&d<`=F*W_xmAFr?QzVqG- zy-$<*Iw9(Bmtxngx%owK{6V#HCLgIYjFlw9>KpTjNz&u``)<0OUj4g#;@Efju|%6ahCHJDZm`%mO<9W^S?MwNPP3x=Zmz8xE7oPmZ2)w#g0;r8Ze@lO zIjOO+fBl)O$h}N%8%|S>vs|58m9!vr<=(Sw0`oN5=m+slYdRU}kUj9Z5Ypj$-r{3n zU+|M<86N<-N^C;=GtgtNcF@Sr`v7-q6;v<`Ed^10CvizNy&;4>z@$Ym0l-0Ufgo=O zPM2>qaeGS^#TGESxJZXs?eJc+QfpsNZz(` zSMpeg`lHDNz(N{~ILA1mRo2T=ZVm7q%T=fNn^VxlNf#u({ay>@Cb1qq8A_bvk=yy?SBd&OT$-e6m2IF^;i^CX-itTX|qx}WYW`>@EmW_uE883%R8 zNtvK*OJ!@;F{f}bXUk@LHnpAf8C(An5dzz(JK8MIX0~81VB?iyE&0?TZ$;B`^}GQyk3rLrd~*2TTEe1=*fgZc%M86kiM!H z;R{!fWJ4KILZcxSc-)KZ=f^d-<)9bi8ufDgowZ<}NjBjvU(O;^+5)*0z;(8!i=y%j zB2xJGt2>rQzCHR$=Ay=^t`aRVXFyuec+S?33rcGKR7-p_AzaA|wT?cE4w&EAC=S-d z6(T-yp&q_HwO$n-HPTjJwAXtZFfI5+1Iu}#VcAtVV7^Rx{a0WJqUFzlA;Z4`hA8|s zyZjFCHGMpgu&J$4{b|C?W0$w&PyLpUsNS1rn4&BU)4~>m7aj6DhG`XI*5wt3scSp7 z``L)(<|BjYtkXO*B-FwTk^K^}U>72mvX>EyWp(sZMlK`zIq?7Fz1g;gy{8?c%pTPT zrrx>8b$3JnhSU^S5ItqM9{wJSJAKk)^`Yam^SGBq6Di{#6iv+IO2Y*EeK2b);n2*d zuM|zte=M2+pdGKgSBfUm-xN&_&*am8Et+8eSTq5namsv^9|J8(DD7{Q3wp_!e8`R{ zUIZzm&p_)#p4*z64h&OI^ZM^&IkK!fWIxUaN&815cfTP#C;2o<^U-hJux$%&Sg%*y zuu_W~R{hcq`!$@j_Co6?Lu1>&vNxr_b4DG06fYaOPON9|B3tq6L0RX#l%|Lk-zIy8 zp19YW+hsbd@g2k3Mm^>H2h%}qbV&g#vZlDxF$|=qcX$zd?(JT%K0~= z8y4RZvfTMY$g+~FI2ZjQWC2DuqD78hAY
nMLHn*iU77NCfwY!dosWfKO1soWoT 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 K=VhM-pZdQNzXh@Y literal 0 HcmV?d00001 diff --git a/soundcloud/content/contents/images/iconWhite.png b/soundcloud/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..16347383ee9b8a2421d5e77d11c0be8515711613 GIT binary patch literal 8370 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 Date: Mon, 15 Dec 2014 17:29:47 -0500 Subject: [PATCH 417/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes subsonic/content/contents/images/iconWhite.png | Bin 0 -> 8172 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 subsonic/content/contents/images/iconBackground.png create mode 100644 subsonic/content/contents/images/iconWhite.png diff --git a/subsonic/content/contents/images/iconBackground.png b/subsonic/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..331d69f960122a6f86bf0897a99addb3d0d2c418 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoJ6 dqVxX9Gq5!?O^=usUI>(6@O1TaS?83{1ORW*5*z>k literal 0 HcmV?d00001 diff --git a/subsonic/content/contents/images/iconWhite.png b/subsonic/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..2e56086dba486b434bd1bc2e2b07ec01cf6f0e5f GIT binary patch literal 8172 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 SLXxZi0000 Date: Tue, 16 Dec 2014 21:52:49 +0100 Subject: [PATCH 418/597] [beatsmusic] Added configTest functionality to beatsmusic resolver. --- .../content/contents/code/beatsmusic.js | 40 +++++++++++++++---- beatsmusic/content/metadata.json | 5 ++- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/beatsmusic/content/contents/code/beatsmusic.js b/beatsmusic/content/contents/code/beatsmusic.js index 3c36d3d48..375c87232 100644 --- a/beatsmusic/content/contents/code/beatsmusic.js +++ b/beatsmusic/content/contents/code/beatsmusic.js @@ -61,7 +61,7 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { }, - login: function(callback) { + login: function(callback, doConfigTest) { var userConfig = this.getUserConfig(); if (!userConfig.user || !userConfig.password) { Tomahawk.log("Beats Music Resolver not properly configured!"); @@ -69,6 +69,9 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { if (callback) { callback("Beats Music Resolver not properly configured!"); } + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials); + } return; } @@ -93,18 +96,41 @@ var BeatsMusicResolver = Tomahawk.extend(TomahawkResolver, { var that = this; Tomahawk.asyncRequest("https://partner.api.beatsmusic.com/api/o/oauth2/approval", function (xhr) { - var res = JSON.parse(xhr.responseText); - that.accessToken = res.access_token; - that.loggedIn = true; - if (callback) { - callback(); + try { + var res = JSON.parse(xhr.responseText); + that.accessToken = res.access_token; + that.loggedIn = true; + if (callback) { + callback(); + } + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success); + } + } catch (e) { + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials); + } } }, headers, { method: "POST", - data: data + data: data, + errorHandler: function (xhr) { + if (doConfigTest) { + if (xhr.status == 404) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + xhr.statusText.trim()); + } + } + } }); }, + configTest: function () { + this.login(null, true); + }, + spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, init: function(cb) { diff --git a/beatsmusic/content/metadata.json b/beatsmusic/content/metadata.json index b852069fc..677781f79 100644 --- a/beatsmusic/content/metadata.json +++ b/beatsmusic/content/metadata.json @@ -21,5 +21,8 @@ "contents/code/beatsmusic.png", "contents/code/beatsmusic-wide.png" ] - } + }, + "staticCapabilities": [ + "configTestable" + ] } From ca969cc97542d6dd36795319db84957b7eb0e5e5 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Tue, 16 Dec 2014 21:54:49 +0100 Subject: [PATCH 419/597] [beets] Added new configTest functionality to beets resolver. --- beets/content/contents/code/beets.js | 23 +++++++++++++++++++++++ beets/content/metadata.json | 9 ++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/beets/content/contents/code/beets.js b/beets/content/contents/code/beets.js index 8d60eceaf..1732d666e 100644 --- a/beets/content/contents/code/beets.js +++ b/beets/content/contents/code/beets.js @@ -2,6 +2,7 @@ * * Copyright 2012, Adrian Sampson * Copyright 2013, Uwe L. Korn + * Copyright 2014, Enno Gottschalk * * Tomahawk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -190,6 +191,28 @@ var BeetsResolver = Tomahawk.extend(TomahawkResolver, { }); }, + configTest: function () { + Tomahawk.asyncRequest(this.baseUrl(), + function (xhr) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success); + }, {}, { + method: 'HEAD', + username: this.username, + password: this.password, + errorHandler: function (xhr) { + if (xhr.status == 403) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials); + } else if (xhr.status == 404 || xhr.status == 0) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + xhr.responseText.trim()); + } + } + } + ); + }, + // Script Collection Support artists: function (qid) { diff --git a/beets/content/metadata.json b/beets/content/metadata.json index 1777bf8ed..ca25ba15f 100644 --- a/beets/content/metadata.json +++ b/beets/content/metadata.json @@ -1,9 +1,9 @@ { "name": "Beets", "pluginName": "beets", - "author": "Adrian and Uwe", + "author": "Adrian, Uwe and Enno", "email": "uwelk@xhochy.com", - "version": "0.5.4", + "version": "0.5.5", "website": "http://gettomahawk.com", "description": "Connects to a beets server and resolves tracks.", "type": "resolver/javascript", @@ -17,5 +17,8 @@ "contents/code/config.ui", "contents/code/beets-icon.png" ] - } + }, + "staticCapabilities": [ + "configTestable" + ] } From 66a5584b2ff9e0c3d124c4f017db17d69c145c6b Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 17 Dec 2014 00:09:23 +0100 Subject: [PATCH 420/597] [gmusic] Added new configTest functionality to gmusic resolver. Persist response. --- gmusic/content/contents/code/gmusic.js | 284 ++++++++++++++++--------- gmusic/content/metadata.json | 5 +- 2 files changed, 186 insertions(+), 103 deletions(-) diff --git a/gmusic/content/contents/code/gmusic.js b/gmusic/content/contents/code/gmusic.js index e94b7eff7..c758175f8 100755 --- a/gmusic/content/contents/code/gmusic.js +++ b/gmusic/content/contents/code/gmusic.js @@ -2,6 +2,7 @@ * * Written in 2013 by Sam Hanes * Extensive modifications in 2014 by Lalit Maganti + * Further modifications in 2014 by Enno Gottschalk * * To the extent possible under law, the author(s) have dedicated all * copyright and related and neighboring rights to this software to @@ -70,6 +71,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { invalidateCache: function() { Tomahawk.log("Invalidating cache"); delete this.cachedRequest; + if (Tomahawk.localStorage) + Tomahawk.localStorage.removeItem(this.storageKey); Tomahawk.deleteFuzzyIndex(); }, @@ -87,13 +90,13 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { // load signing key { var s1 = CryptoJS.enc.Base64.parse( - 'VzeC4H4h+T2f0VI180nVX8x+Mb5HiTtGnKgH52Otj8ZCGDz9jRW' - + 'yHb6QXK0JskSiOgzQfwTY5xgLLSdUSreaLVMsVVWfxfa8Rw==' - ); + 'VzeC4H4h+T2f0VI180nVX8x+Mb5HiTtGnKgH52Otj8ZCGDz9jRW' + + 'yHb6QXK0JskSiOgzQfwTY5xgLLSdUSreaLVMsVVWfxfa8Rw==' + ); var s2 = CryptoJS.enc.Base64.parse( 'ZAPnhUkYwQ6y5DdQxWThbvhJHN8msQ1rqJw0ggKdufQjelrKuiG' + 'GJI30aswkgCWTDyHkTGK9ynlqTkJ5L4CiGGUabGeo8M6JTQ==' - ); + ); for (var idx = 0; idx < s1.words.length; idx++) s1.words[ idx ] ^= s2.words[ idx ]; @@ -169,8 +172,19 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._isRequesting = false; }, + storageKey: "gmusic_cached_request", + _getData: function (callback) { var that = this; + if (!that.cachedRequest) { + var persistedRequest; + if (Tomahawk.localStorage) + persistedRequest = Tomahawk.localStorage.getItem(that.storageKey); + if (persistedRequest) { + that.cachedRequest = JSON.parse(persistedRequest); + that._ensureFuzzyIndex(); + } + } var url = that._baseURL + 'trackfeed?fields=nextPageToken,' + 'data/items(id,nid,artist,album,title,year,trackNumber,discNumber,estimatedSize,durationMillis)'; @@ -196,18 +210,9 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { response: results, time: Date.now() }; - var indexList = []; - for (var idx = 0; idx < that.cachedRequest.response.length; idx++) { - var entry = that.cachedRequest.response[ idx ]; - indexList.push({ - id: idx, - artist: entry.artist, - album: entry.album, - track: entry.title - }); - } - Tomahawk.log("Creating fuzzy index, count: " + indexList.length); - Tomahawk.createFuzzyIndex(indexList); + if (Tomahawk.localStorage) + Tomahawk.localStorage.setItem(that.storageKey, JSON.stringify(that.cachedRequest)); + that._createFuzzyIndex(that.cachedRequest.response); Tomahawk.log("Updated cache in " + (Date.now() - time) + "ms"); } else { Tomahawk.log("Collection doesn't need to be updated"); @@ -220,6 +225,27 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { } }, + _ensureFuzzyIndex: function () { + if (!Tomahawk.hasFuzzyIndex() && this.cachedRequest) { + this._createFuzzyIndex(this.cachedRequest.response); + } + }, + + _createFuzzyIndex: function (results) { + var indexList = []; + for (var idx = 0; idx < results.length; idx++) { + var entry = results[ idx ]; + indexList.push({ + id: idx, + artist: entry.artist, + album: entry.album, + track: entry.title + }); + } + Tomahawk.log("Creating fuzzy index, count: " + indexList.length); + Tomahawk.createFuzzyIndex(indexList); + }, + _paginatedRequest: function (results, url, callback, options) { var that = this; var extraHeaders = { @@ -268,8 +294,8 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { results.tracks.push(that._convertTrack(entry)); } } - Tomahawk.log("Searched Locker for " + (Date.now() - time) + "ms and found " - + results.tracks.length + " tracks"); + Tomahawk.log("Locker: Searched with query '" + query + "' for " + (Date.now() - time) + + "ms and found "+ results.tracks.length + " track results"); callback.call( window, results ); }); }, @@ -285,15 +311,6 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { var time = Date.now(); Tomahawk.asyncRequest(url, function (request) { - if (200 != request.status) { - Tomahawk.log( - "Google Music search '" + query + "' failed:\n" - + request.status + " " - + request.statusText.trim() + "\n" - + request.responseText.trim() - ); - return; - } var response = JSON.parse( request.responseText ); // entries member is missing when there are no results @@ -323,13 +340,20 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { break; } } - Tomahawk.log("Searched All Access for " + (Date.now() - time) + "ms and found " - + results.tracks.length + " tracks"); + Tomahawk.log("All Access: Searched with query '" + query + "' for " + + (Date.now() - time) + "ms and found " + results.tracks.length + " track results"); callback.call( window, results ); }, { 'Authorization': 'GoogleLogin auth=' + this._token }, { - method: 'GET' + method: 'GET', + errorHandler: function (request) { + Tomahawk.log("Google Music search '" + query + "' failed:\n" + + request.status + " " + + request.statusText.trim() + "\n" + + request.responseText.trim() + ); + } }); }, @@ -352,11 +376,11 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._execSearch( query, function (results) { Tomahawk.addTrackResults( - { 'qid': qid, 'results': results.tracks } ); + { 'qid': qid, 'results': results.tracks } ); Tomahawk.addAlbumResults( - { 'qid': qid, 'results': results.albums } ); + { 'qid': qid, 'results': results.albums } ); Tomahawk.addArtistResults( - { 'qid': qid, 'results': results.artists } ); + { 'qid': qid, 'results': results.artists } ); }, 20); }, @@ -368,7 +392,6 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { query += ' - ' + album; } query += ' - ' + title; - Tomahawk.log(query); this._execSearchAllAccess(query, function (results) { if (results.tracks.length > 0) { Tomahawk.addTrackResults({ @@ -395,7 +418,9 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { this._getData(function (response) { var time = Date.now(); var resultIds = Tomahawk.resolveFromFuzzyIndex(artist, album, title); + var resolveTarget = ""; if (resultIds.length > 0) { + resolveTarget = "Locker"; Tomahawk.addTrackResults({ 'qid': qid, 'results': [ @@ -403,10 +428,12 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { ] }); } else { + resolveTarget = "All Access"; that._resolveAllAccess(qid, artist, album, title); } - Tomahawk.log("Resolved Locker for " + (Date.now() - time) + "ms and found " - + resultIds.length.length + " tracks"); + Tomahawk.log(resolveTarget + ": Resolved track '" + artist + " - " + title + " - " + + album + "' for " + (Date.now() - time) + "ms and found " + resultIds.length + + " track results"); }); }, @@ -421,14 +448,16 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }, getStreamUrl: function (qid, urn) { - if (!this._ready) return; - Tomahawk.log( "getting stream for '" + urn + "'" ); - + if (!this._ready) { + Tomahawk.log("Failed to get stream for '" + urn + "', resolver wasn't ready"); + return; + } urn = this._parseUrn( urn ); - if (!urn || 'track' != urn.type) + if (!urn || 'track' != urn.type) { + Tomahawk.log( "Failed to get stream. Couldn't parse '" + urn + "'" ); return; - - Tomahawk.log( "track ID is '" + urn.id + "'" ); + } + Tomahawk.log("Getting stream for '" + urn + "', track ID is '" + urn.id + "'"); var salt = util.salt(13); var sig = CryptoJS.HmacSHA1(urn.id + salt, this._key).toString(util.Base64) @@ -438,9 +467,9 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { ; var url = 'https://android.clients.google.com/music/mplay' - + '?net=wifi&pt=e&targetkbps=8310' - + '&' + ('T' == urn.id[ 0 ] ? 'mjck' : 'songid') - + '=' + urn.id + '&slt=' + salt + '&sig=' + sig; + + '?net=wifi&pt=e&targetkbps=8310' + + '&' + ('T' == urn.id[ 0 ] ? 'mjck' : 'songid') + + '=' + urn.id + '&slt=' + salt + '&sig=' + sig; Tomahawk.reportStreamUrl(qid, url, { 'Content-type': 'application/x-www-form-urlencoded', @@ -449,33 +478,28 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { }); }, - _loadSettings: function (callback) { + _loadSettings: function (callback, doConfigTest) { var that = this; Tomahawk.asyncRequest(that._webURL - + 'services/loadsettings?u=0&xt=' - + encodeURIComponent( that._xt ), + + 'services/loadsettings?u=0&xt=' + + encodeURIComponent( that._xt ), function (request) { - if (200 != request.status) { - Tomahawk.log( - "settings request failed:\n" - + request.status + " " - + request.statusText.trim() - ); - return; - } - var response = JSON.parse( request.responseText ); if (!response.settings) { Tomahawk.log( "settings request failed:\n" + request.responseText.trim() - ); + ); + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + "Wasn't able to get resolver settings"); + } return; } that._allAccess = response.settings.isSubscription; Tomahawk.log( "Google Play Music All Access is " + (that._allAccess ? "enabled" : "disabled" ) - ); + ); var device = null; var devices = response.settings.devices; @@ -489,17 +513,17 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { if (device) { that._deviceId = device.id.slice( 2 ); - Tomahawk.log(that._deviceId); - - Tomahawk.log( that.settings.name - + " using device ID from " - + device.carrier + " " - + device.manufacturer + " " - + device.model - ); + Tomahawk.log(that.settings.name + " using device ID '" + that._deviceId + + "' from " + device.carrier + " " + device.manufacturer + " " + + device.model); callback.call( window ); } else { + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + "No Android devices associated with Google account." + + " Please open the 'Play Music' App, log in and play a song"); + } Tomahawk.log( that.settings.name + ": there aren't any Android devices" + " associated with your Google account." @@ -507,43 +531,65 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { + " ID to function. Please open the Google" + " Music application on an Android device" + " and log in to your account." - ); + ); } }, { 'Content-type': 'application/x-www-form-urlencoded', 'Authorization': 'GoogleLogin auth=' + this._token }, { - method: 'POST' + method: 'POST', + errorHandler: function (request) { + if (doConfigTest) { + if (request.status == 403) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidAccount); + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } + } + Tomahawk.log( + "Settings request failed:\n" + + request.status + " " + + request.statusText.trim() + ); + } } ); }, - _loadWebToken: function (callback) { + _loadWebToken: function (callback, doConfigTest) { var that = this; Tomahawk.asyncRequest(that._webURL + 'listen', function (request) { - if (200 != request.status) { - Tomahawk.log( "request for xt cookie failed:" - + request.status + " " - + request.statusText.trim() - ); - return; - } - - var match = request.getResponseHeader( 'Set-Cookie' ) - .match( /^xt=([^;]+)(?:;|$)/m ); + var match = request.getResponseHeader('Set-Cookie') + .match(/^xt=([^;]+)(?:;|$)/m); if (match) { that._xt = match[ 1 ]; - callback.call( window ); + callback.call(window); } else { - Tomahawk.log( "xt cookie missing" ); - return; + if (doConfigTest) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + "Wasn't able to get xt cookie"); + } + Tomahawk.log("xt cookie missing"); } }, { 'Authorization': 'GoogleLogin auth=' + this._token }, { method: 'HEAD', - needCookieHeader: true + needCookieHeader: true, + errorHandler: function (request) { + if (doConfigTest) { + if (request.status == 403) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidAccount); + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } + } + Tomahawk.log("Request for xt cookie failed:" + + request.status + " " + + request.statusText.trim() + ); + } } ); }, @@ -558,51 +604,85 @@ var GMusicResolver = Tomahawk.extend( TomahawkResolver, { * to run when it is complete. * * @param {loginCB} [callback] a function to be called on completion + * @param doConfigTest boolean indicating whether or not to call the configTest callbacks */ - _login: function (callback) { + _login: function (callback, doConfigTest) { this._token = null; + if (!this._loginCallbacks) { + this._loginCallbacks = []; + } + if (callback) { + this._loginCallbacks.push(callback); + } + if (doConfigTest){ + this.doConfigTest = true; + } // if a login is already in progress just queue the callback if (this._loginLock) { - this._loginCallbacks.push( callback ); return; } this._loginLock = true; - this._loginCallbacks = [ callback ]; var that = this; var name = this.settings.name; Tomahawk.asyncRequest('https://www.google.com/accounts/ClientLogin', function (request) { - if (200 == request.status) { - that._token = request.responseText - .match( /^Auth=(.*)$/m )[ 1 ]; - that._loginLock = false; + that._token = request.responseText + .match(/^Auth=(.*)$/m)[ 1 ]; - Tomahawk.log( name + " logged in successfully" ); + Tomahawk.log(name + " logged in successfully"); - for (var idx = 0; idx < that._loginCallbacks.length; idx++) { - that._loginCallbacks[ idx ].call( window ); - } - that._loginCallbacks = null; - } else { - Tomahawk.log(name + " login failed:\n" - + request.status + " " - + request.statusText.trim() + "\n" - + request.responseText.trim()); + for (var idx = 0; idx < that._loginCallbacks.length; idx++) { + that._loginCallbacks[ idx ].call(window); } + that._loginCallbacks = null; + that._loginLock = false; }, { 'Content-type': 'application/x-www-form-urlencoded' }, { method: 'POST', data: "accountType=HOSTED_OR_GOOGLE&Email=" + that._email.trim() + "&Passwd=" + that._password.trim() + "&service=sj&source=tomahawk-gmusic-" - + that._version + + that._version, + errorHandler: function (request) { + Tomahawk.log(name + " login failed:\n" + + request.status + " " + + request.statusText.trim() + "\n" + + request.responseText.trim()); + for (var idx = 0; idx < that._loginCallbacks.length; idx++) { + that._loginCallbacks[ idx ].call(window); + } + if (that.doConfigTest) { + that.doConfigTest = false; + if (request.status == 403) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.InvalidCredentials); + } else if (request.status == 404) { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.CommunicationError); + } else { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Other, + request.responseText.trim()); + } + } + that._loginCallbacks = null; + that._loginLock = false; + } } ); }, + configTest: function () { + var that = this; + this._login(function () { + that._loadWebToken(function () { + that._loadSettings(function () { + Tomahawk.onConfigTestResult(TomahawkConfigTestResultType.Success); + }, true); + }, true); + }, true); + }, + containsObject: function (obj, list) { var i; for (i = 0; i < list.length; i++) { diff --git a/gmusic/content/metadata.json b/gmusic/content/metadata.json index e3036b2f1..07ed3f244 100644 --- a/gmusic/content/metadata.json +++ b/gmusic/content/metadata.json @@ -17,5 +17,8 @@ "contents/code/config.ui", "contents/code/play-logo.png" ] - } + }, + "staticCapabilities": [ + "configTestable" + ] } From 56f9ce1641e5756b126892a029b83738d426b91d Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Tue, 16 Dec 2014 20:30:20 -0500 Subject: [PATCH 421/597] Change block to black --- .../content/contents/images/iconBackground.png | Bin 83 -> 83 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/deezer-metadata/content/contents/images/iconBackground.png b/deezer-metadata/content/contents/images/iconBackground.png index 82cdd70bf53059032b7a460c2c9c5d303af18b97..22b958a249c379d5f53551f9309b3ff35fc5ae9c 100644 GIT binary patch delta 31 lcmWFzo?t1JkdW|$pMjBukwLC_jspV_c)I$ztaD0e0sw)`2o?YU delta 31 kcmWFzo?s~zQFG>lJp-Ey(=6k>6AU2W>FVdQ&MBb@0HECong9R* From 7a768a6a3527842426427a1dfa1e21533c173cca Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 17 Dec 2014 01:11:37 +0100 Subject: [PATCH 422/597] [rdio-metadata] Put a spell on those super secret keys. --- .../content/contents/code/rdio-metadata.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/rdio-metadata/content/contents/code/rdio-metadata.js b/rdio-metadata/content/contents/code/rdio-metadata.js index e319b5586..0120ebef6 100644 --- a/rdio-metadata/content/contents/code/rdio-metadata.js +++ b/rdio-metadata/content/contents/code/rdio-metadata.js @@ -49,18 +49,22 @@ var RdioMetadataResolver = Tomahawk.extend(TomahawkResolver, { } }, - encodeOAuthComponent: function (url) { - var encoded = encodeURIComponent(url); - encoded = encoded.replace(/\!/g, "%21").replace(/\'/g, "%27"); - encoded = encoded.replace(/\(/g, "%28").replace(/\)/g, "%29"); - return encoded.replace(/\*/g, "%2A"); + encodeOAuthComponent: function(url) { + return encodeURIComponent(url) + .replace(/\!/g, "%21") + .replace(/\*/g, "%2A") + .replace(/\'/g, "%27") + .replace(/\(/g, "%28") + .replace(/\)/g, "%29"); }, + spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, + lookupUrl: function (url) { var that = this; var fetchUrl = 'http://api.rdio.com/1/' var query = 'extras=tracks&method=getObjectFromUrl'; - query += '&oauth_consumer_key=gk8zmyzj5xztt8aj48csaart'; + query += '&oauth_consumer_key=' + this.spell("tdo7m2m8u6r7r76mpod9jqlc"); var nonce = ''; for (i = 0; i < 8; i++) nonce += parseInt(Math.random() * 10).toString(); query += '&oauth_nonce=' + nonce; @@ -69,7 +73,7 @@ var RdioMetadataResolver = Tomahawk.extend(TomahawkResolver, { query += '&oauth_version=1.0'; query += '&url=' + this.encodeOAuthComponent(url); var toSign = 'POST&' + this.encodeOAuthComponent(fetchUrl) + '&' + this.encodeOAuthComponent(query); - var signature = CryptoJS.HmacSHA1(toSign, 'yt35kakDyW&').toString(CryptoJS.enc.Base64); + var signature = CryptoJS.HmacSHA1(toSign, this.spell("oKeSjHrS9d") + '&').toString(CryptoJS.enc.Base64); query += '&oauth_signature=' + this.encodeOAuthComponent(signature); Tomahawk.log(fetchUrl) Tomahawk.log(query) From 8d4c07a4080e2b774f8324e6bd28f01d3913c73a Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 17 Dec 2014 01:15:30 +0100 Subject: [PATCH 423/597] [rdio-metadata] Fix indentation in metadata.json --- rdio-metadata/content/metadata.json | 34 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/rdio-metadata/content/metadata.json b/rdio-metadata/content/metadata.json index 020d2310d..354d25ee0 100644 --- a/rdio-metadata/content/metadata.json +++ b/rdio-metadata/content/metadata.json @@ -1,20 +1,20 @@ { - "name": "Rdio Metadata", - "pluginName": "rdio-metadata", - "author": "Uwe L. Korn", - "email": "uwelk@xhochy.com", - "version": "0.1.2", - "website": "http://gettomahawk.com", - "description": "(0.8+) Supports loading and drag and drop of Rdio URLs.", - "type": "resolver/javascript", - "manifest": { - "main": "contents/code/rdio-metadata.js", - "scripts": [], - "icon": "contents/images/icon.png", - "iconWhite": "contents/images/iconWhite.png", + "name": "Rdio Metadata", + "pluginName": "rdio-metadata", + "author": "Uwe L. Korn", + "email": "uwelk@xhochy.com", + "version": "0.1.2", + "website": "http://gettomahawk.com", + "description": "(0.8+) Supports loading and drag and drop of Rdio URLs.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/rdio-metadata.js", + "scripts": [], + "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", "iconBackground": "contents/images/iconBackground.png", - "resources": [ - "contents/code/rdio-metadata.png" - ] - } + "resources": [ + "contents/code/rdio-metadata.png" + ] + } } From 8620a785f063996878a0c97a8343075559678022 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 17 Dec 2014 01:29:34 +0100 Subject: [PATCH 424/597] [deezer-metadata] Fix indentation in metadata.json --- deezer-metadata/content/metadata.json | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/deezer-metadata/content/metadata.json b/deezer-metadata/content/metadata.json index f78288476..56e712e2d 100644 --- a/deezer-metadata/content/metadata.json +++ b/deezer-metadata/content/metadata.json @@ -1,20 +1,20 @@ { - "name": "Deezer Metadata", - "pluginName": "deezer-metadata", - "author": "Uwe L. Korn", - "email": "uwelk@xhochy.com", - "version": "0.1.3", - "website": "http://gettomahawk.com", - "description": "(0.8+) Supports loading and drag and drop of Deezer URLs.", - "type": "resolver/javascript", - "manifest": { - "main": "contents/code/deezer-metadata.js", - "scripts": [], - "icon": "contents/images/icon.png", - "iconWhite": "contents/images/iconWhite.png", + "name": "Deezer Metadata", + "pluginName": "deezer-metadata", + "author": "Uwe L. Korn", + "email": "uwelk@xhochy.com", + "version": "0.1.3", + "website": "http://gettomahawk.com", + "description": "(0.8+) Supports loading and drag and drop of Deezer URLs.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/deezer-metadata.js", + "scripts": [], + "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", "iconBackground": "contents/images/iconBackground.png", - "resources": [ - "contents/code/deezer-metadata.png" - ] - } + "resources": [ + "contents/code/deezer-metadata.png" + ] + } } From e2582de930c6d644aa45bf11320b8a0f021213e1 Mon Sep 17 00:00:00 2001 From: Enno Gottschalk Date: Wed, 17 Dec 2014 02:37:54 +0100 Subject: [PATCH 425/597] Add Deezer and Rdio resolver (metadata + resolving) --- deezer/content/contents/code/deezer.js | 143 +++++++++++++++ deezer/content/contents/code/deezer.png | Bin 0 -> 723 bytes deezer/content/contents/images/icon.png | Bin 0 -> 923 bytes .../contents/images/iconBackground.png | Bin 0 -> 83 bytes deezer/content/contents/images/iconWhite.png | Bin 0 -> 2113 bytes deezer/content/metadata.json | 20 +++ rdio/content/contents/code/rdio.js | 169 ++++++++++++++++++ rdio/content/contents/code/rdio.png | Bin 0 -> 301180 bytes rdio/content/contents/images/icon.png | Bin 0 -> 60731 bytes .../contents/images/iconBackground.png | Bin 0 -> 83 bytes rdio/content/contents/images/iconWhite.png | Bin 0 -> 6798 bytes rdio/content/metadata.json | 20 +++ 12 files changed, 352 insertions(+) create mode 100644 deezer/content/contents/code/deezer.js create mode 100644 deezer/content/contents/code/deezer.png create mode 100644 deezer/content/contents/images/icon.png create mode 100644 deezer/content/contents/images/iconBackground.png create mode 100644 deezer/content/contents/images/iconWhite.png create mode 100644 deezer/content/metadata.json create mode 100644 rdio/content/contents/code/rdio.js create mode 100644 rdio/content/contents/code/rdio.png create mode 100644 rdio/content/contents/images/icon.png create mode 100644 rdio/content/contents/images/iconBackground.png create mode 100644 rdio/content/contents/images/iconWhite.png create mode 100644 rdio/content/metadata.json diff --git a/deezer/content/contents/code/deezer.js b/deezer/content/contents/code/deezer.js new file mode 100644 index 000000000..5f46b9450 --- /dev/null +++ b/deezer/content/contents/code/deezer.js @@ -0,0 +1,143 @@ +/* + * Copyright 2013, Uwe L. Korn + * Copyright 2014, Enno Gottschalk + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + */ + +var DeezerMetadataResolver = Tomahawk.extend(TomahawkResolver, { + settings: { + name: 'Deezer', + icon: 'deezer.png', + weight: 95, + timeout: 15 + }, + + init: function () { + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + }, + + resolve: function (qid, artist, album, title) { + var that = this; + var query = artist + " " + title; + Tomahawk.asyncRequest("http://api.deezer.com/search?q=" + query + "&limit=100", + function (xhr) { + var res = JSON.parse(xhr.responseText); + var results = []; + for (var i = 0; i < res.data.length; i++) { + if (res.data[i].type == 'track' && res.data[i].readable) { + var result = { + source: that.settings.name, + artist: res.data[i].artist.name, + track: res.data[i].title, + duration: res.data[i].duration, + url: "deezer://track/" + res.data[i].id, + album: res.data[i].album.title, + linkUrl: res.data[i].link + }; + results.push(result); + } + } + Tomahawk.addTrackResults({ + qid: qid, + results: results + }); + }); + }, + + search: function (qid, searchString) { + this.resolve(qid, "", "", searchString); + }, + + canParseUrl: function (url, type) { + switch (type) { + case TomahawkUrlType.Album: + return /https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)album\//.test(url); + case TomahawkUrlType.Artist: + return /https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)artist\//.test(url); + case TomahawkUrlType.Playlist: + return /https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)playlist\//.test(url); + case TomahawkUrlType.Track: + return /https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)track\//.test(url); + // case TomahawkUrlType.Any: + default: + return /https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)/.test(url); + } + }, + + lookupUrl: function (url) { + var that = this; + var urlParts = url.split('/').filter(function (item) { + return item.length != 0; + }).map(decodeURIComponent); + if (/https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)artist\//.test(url)) { + // We have to deal with an artist + var query = 'https://api.deezer.com/2.0/artist/' + urlParts[urlParts.length - 1]; + Tomahawk.asyncRequest(query, function (xhr) { + var res = JSON.parse(xhr.responseText); + Tomahawk.addUrlResult(url, { + type: "artist", + name: res.name + }); + }); + } else if (/https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)playlist\//.test(url)) { + // We have to deal with an album. + var query = 'https://api.deezer.com/2.0/playlist/' + urlParts[urlParts.length - 1]; + Tomahawk.log(query); + Tomahawk.asyncRequest(query, function (xhr) { + var res = JSON.parse(xhr.responseText); + var query2 = 'https://api.deezer.com/2.0/playlist/' + res.creator.id; + Tomahawk.log(query2); + Tomahawk.asyncRequest(query2, function (xhr2) { + var res2 = JSON.parse(xhr2.responseText); + var result = { + type: "playlist", + title: res.title, + guid: "deezer-playlist-" + res.id.toString(), + info: "A playlist by " + res2.name + " on Deezer.", + creator: res2.name, + url: res.link, + tracks: [] + }; + result.tracks = res.tracks.data.map(function (item) { + return { type: "track", title: item.title, artist: item.artist.name }; + }); + Tomahawk.addUrlResult(url, result); + }); + }); + } else if (/https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)track\//.test(url)) { + // We have to deal with an album. + var query = 'https://api.deezer.com/2.0/track/' + urlParts[urlParts.length - 1]; + Tomahawk.asyncRequest(query, function (xhr) { + var res = JSON.parse(xhr.responseText); + Tomahawk.addUrlResult(url, { + type: "track", + title: res.title, + artist: res.artist.name, + }); + }); + } else if (/https?:\/\/(www\.)?deezer.com\/([^\/]*\/|)album\//.test(url)) { + // We have to deal with an album. + var query = 'https://api.deezer.com/2.0/album/' + urlParts[urlParts.length - 1]; + Tomahawk.asyncRequest(query, function (xhr) { + var res = JSON.parse(xhr.responseText); + Tomahawk.addUrlResult(url, { + type: "album", + name: res.title, + artist: res.artist.name, + }); + }); + } + } +}); + +Tomahawk.resolver.instance = DeezerMetadataResolver; + diff --git a/deezer/content/contents/code/deezer.png b/deezer/content/contents/code/deezer.png new file mode 100644 index 0000000000000000000000000000000000000000..9ed15cc478be3b52de9adc9e274c7a5337205dce GIT binary patch literal 723 zcmV;^0xbQBP)C0004HP)t-sGBPrK zmz;>Ct5RKHu-fFo@%(6ee?CG(Kt)D3IXON$JeYcmafXX|k(W(YSV}`j|H9=tH#l!y zXINxsU2ASaNJ%?5I)rO^WOaFKeuGC(Q9(O9TS`h+M@Kd_Hd{|tLqt4OR!2-uLQ7Ls zPFPw!KtX_DVE?MB=bW5}jb`2Go3*`ySxHHlZf=ZcXIx)Qb9Y)fHa12+K14h`G&3|t zKtwt_H$Oi*VNFe~dU~F5aX>sit%#jvXi=D-ae#$lfFB?K008F(2FSY&|Lp*nj~PlV zJ^uibc!V&%)-Ro}F9x;S0LStlYkP1aBGw8D!VV6qpcK}}3WR(fMJ+ql3V&*IFru|D zhn6r7o4E?9%OYQFcpxC^1qIX!3c0Ni>e>a4h8ssLJn99AaeFYZ#V?YgFbb&31-RcJ zWprsIB*704uoDxTk{H3Y4|#JSLM=MM4|QW}F_fh+eTpy>j;IfsxP~ZtRsaA10b)x> zL;#2d9Y_EG010qNS#tmY3ljhU3ljkVnw%H_000McNliru-3t;AI|?|DN>2a)0Q5;j zK~#9!?bBH+MR6EL@s&~{84~#drf_Xa98*eWDVe2Ymh$;s|DX27PTF-&>v#QLtc&*n zNs=TFK9?%n<15N*c0R{|*p~|a~;COvP13D>SER0rOjR(hD%fw`9 zs_qZWguniP0S3&@mF6q2`a&;E2cSPVai7qD_6S&5EG<=Dt%PM*4M10L;tAk<_ zHr#r0@Z+D1>UujTX9rg|b4yD*E1MZr-Gy!4l@q7?hDCTeyZ=A*)Y9A{KQ=ugB|SDf z&&k8n+QOM!%$&j_rSj zNfj*y`>yHFU9Zo!^)|!tPx9H-1xiZSxVR4S@vT}Qa_u-*OO2eXuJtvp`mADuMO*dT zry20g-pRG{v{HOdg@VE>R@N(ATszkayt>8O*Cy?*WAlo&qp;dw!%_W7iww9{oMPQ^ zUm>+5Q$^(*1bE>>n(et;KMCR^H4q#wp z5paMIs|^l(SQ`-;ef8IhbysS1J=v4L@0?)tYGwISL5spa3Ul&SvopMQ$!|H8Y~S=G_%%Ak;{W@6>qgnF4 zH<{tqF{))XG`DB91J#r-ag3iNV;g2Y@5uTs3~nboCvOe*oOC%oD}C~k|1r(~R4nTk zmKk~$y)1g$1@~D4L;dSlTW@_;IoUgVYqY0P!R~_&lkV({-aTDq=l=!YF7WXi2+7&5 zv-O;0QyW%2Po-I3ibw6_>F}-BJtvvxXTN{LhzL$IM~1fdf7@>zS2?--{8oKWqc2+z z2285?9rt^p%FmyxzulID1w2p>Qv5)fJ>K;UW%gGp{5JRofP_3<{an^LB{Ts5>W*mF literal 0 HcmV?d00001 diff --git a/deezer/content/contents/images/iconBackground.png b/deezer/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..82cdd70bf53059032b7a460c2c9c5d303af18b97 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoI} dYR-JHXJB(-nq{1K0w~VF;OXk;vd$@?2>@}G5(WSO literal 0 HcmV?d00001 diff --git a/deezer/content/contents/images/iconWhite.png b/deezer/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..ef2f0195391b48a853c521b81dbad2c9b427d341 GIT binary patch literal 2113 zcmchZX;f2Z8po3uG@%D10fM4p3;~fq0!oPtAeSu!WsyZh30o*jM*&$P!~`Tzg+xFQ zSvm+tBBDb{0SBmIovMH$5`;=bmI@&uvdJP&5Mi#<`DEKqbIyFY_r2$y=e+0s|Ih#T zyqA02!$nP1R}}(*sJT*|yuo!1ysjg*f_D+xLI+%+3EnOa5aILP3J7G|M^`6%-(=|A zsBKoDvlb*|C@Tb|wMB`#Xo>L>cRD6VULM-vuqvCsmXdUS?EBuNecvpMkPpe(k)F$|Z67f)aT?fK zB4=u9sS9g8*!U_OVWA6}7@V*|7oFMMSM^?QX=H#X@tAET~Fu0$ZRtV~|%ExXhH_FAs!% z)QrNO3&^lNYaenSc_aI~B65KD(mo&!0)@d58rUx$Vw^(WP=cgiqrIg=gQr*CCE@hWvh$#T^lT6HVh1;Lfn4-Yd?Uf-^k=L&39toOZ)44a?$PT5-} zIwZ7upoaX1j(B>mcaF+`kVc91h;f9?saRZKC0L`Qi2VN2g4cNf3;fuzkzDxSKs_?4 zC0-l^2%5-E`WzW3{ZF=F->qy_s?F`#dqaXDjW8TZ&zCC(7H<_LFn@kkLanf5(WhRM zBN)}_FU5g!#SLjmqXk8zu~#X02iC!FldCT=OvV_SaSc~W!)^Y$>@BTtsAAh3HI8j~ zI>}R)s>NE=e=-*-cG9CS$_*prw@Lrx6b;sUu6ZNzz{VzD-R zJ_0>W0R&0^L&?a@k>*iK-@2h?GD|?d*OJOrMjRfyieC`zL>KD+QQKy;{Ij|y&IZeG zFx%J1OQpwP^N4Ao-bt;+psZoq?v3)J5y}P~t46V=aaWr2YIA^0&=68oL_-E($d1sSy1AG1= zyZrqRg(w{k59|`|P9@?SZSnLef<6(Z4K~=>?HH=tnBRZjk3xeRt46KxN{VoKCjdcY zP4-U+UoG*pwz;V@wmOZ{cY0?W>aG#LpFls&1N@*lvS=FK$tzxBQ1 zj-HJ(q)*pa8p!GdY;k21?WKsknb|F$^{?pseSm*^!|5d+*E3+W+{b%9)=v$ZHIXqg zcQKd;3|s5wxyxnm><489p@{sRPv)zN&+_WJ!w2n_lqU4{{mga3&xDIE7wM0w8wHw5 z#~;vdp8Hoe4PP(m%C)A~HqkbAACo?nge`7P=nf48#z)db*AQ7i3N$BZe2@o!fs9&7 zG(c%^)|` z#O1wv4Ha9KM)5p}hNAA0jvpDUZ{4WhC7Nho49!T`C2~xEEFey8ysJSvobp8IR9Na{ zYT}Ab%^RZ+m#?pTOXE{bI=ic+-tqCjWBao;A(a4g=u=IhqoQwvm*i;Yws-0gL_oaS zh3<2w-Fd%4s<0eaBj?cObL)mKPd@3pm_rk?O#HZ3OHA91X2O5W$!Tk$<2RphjXLJn zLp`pTfsye$Y!+Q8yZ^x@T3tOUho;A?YiOH@I&ARpx8Pv^Z^2K zCVR4OH4X0$cs%Ep`QQf4p!nc=#QMyfdGMLrljuJJ=@U}h8Sqj%`-@dJf`Cqio z{@umZ8G2;9Qr_IZX(!H{)OjlpeU^X4#Z}E~xSVy}Hz2kdg*7|TQ5NT;(z{>GNuw
~o} zeqU_z8KHNB&bobe&7G-Tlf!mrXno0wg%jy(rk$*6cP?|*$ZEBy=R+8mwv%vGIb7Gt zDE?EL+zB8}4Z}B`>J2}+*j!NDtNRsKe3ibgs5`^$D(A9`E-yM0NnH}_hl^7A0)@DD zdssH@e3zvEvr#|dicfaZv)OIAi>xkT_#O~0lJm5}-(O!+7FW~6_G5MbTDC{#P1mzN zn%nxzlt})szye9i;_}4Ta>d2ONZJ}2nb(mBnlLI>g}(rySusFkISTNQ6y4HB+y!0nn91M}h{G1oBl(O@rS7OBI*>uzBE_Qbo##Al<;y0ks+c+Y0g(jDw;}i0}4p YUs-Ev$#V$={|O+j&K^!ehmiDt18E4aOaK4? literal 0 HcmV?d00001 diff --git a/deezer/content/metadata.json b/deezer/content/metadata.json new file mode 100644 index 000000000..1afae458d --- /dev/null +++ b/deezer/content/metadata.json @@ -0,0 +1,20 @@ +{ + "name": "Deezer", + "pluginName": "deezer", + "author": "Uwe and Enno", + "email": "uwelk@xhochy.com", + "version": "0.1.2", + "website": "http://gettomahawk.com", + "description": "Stream music with Deezer. Premium Deezer account required.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/deezer.js", + "scripts": [], + "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", + "resources": [ + "contents/code/deezer.png" + ] + } +} diff --git a/rdio/content/contents/code/rdio.js b/rdio/content/contents/code/rdio.js new file mode 100644 index 000000000..70c41f4ca --- /dev/null +++ b/rdio/content/contents/code/rdio.js @@ -0,0 +1,169 @@ +/* + * Copyright 2013, Uwe L. Korn + * Copyright 2014, Enno Gottschalk + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + */ + +var RdioMetadataResolver = Tomahawk.extend(TomahawkResolver, { + settings: { + name: 'rdio', + icon: 'rdio.png', + weight: 95, + timeout: 15 + }, + + init: function() { + Tomahawk.reportCapabilities(TomahawkResolverCapability.UrlLookup); + }, + + encodeOAuthComponent: function(url) { + return encodeURIComponent(url) + .replace(/\!/g, "%21") + .replace(/\*/g, "%2A") + .replace(/\'/g, "%27") + .replace(/\(/g, "%28") + .replace(/\)/g, "%29"); + }, + + spell: function(a){magic=function(b){return(b=(b)?b:this).split("").map(function(d){if(!d.match(/[A-Za-z]/)){return d}c=d.charCodeAt(0)>=96;k=(d.toLowerCase().charCodeAt(0)-96+12)%26+1;return String.fromCharCode(k+(c?96:64))}).join("")};return magic(a)}, + + resolve: function (qid, artist, album, title) { + var that = this; + var fetchUrl = 'http://api.rdio.com/1/' + var query = 'method=search'; + query += '&oauth_consumer_key=' + this.spell("tdo7m2m8u6r7r76mpod9jqlc"); + var nonce = ''; + for (i = 0; i < 8; i++) nonce += parseInt(Math.random() * 10).toString(); + query += '&oauth_nonce=' + nonce; + query += '&oauth_signature_method=' + this.encodeOAuthComponent('HMAC-SHA1'); + query += '&oauth_timestamp=' + Math.round((new Date()).getTime() / 1000);; + query += '&oauth_version=1.0'; + query += '&query=' + this.encodeOAuthComponent(artist + " " + title) + '&types=Track'; + var toSign = 'POST&' + this.encodeOAuthComponent(fetchUrl) + '&' + this.encodeOAuthComponent(query); + var signature = CryptoJS.HmacSHA1(toSign, this.spell("oKeSjHrS9d") + '&').toString(CryptoJS.enc.Base64); + query += '&oauth_signature=' + this.encodeOAuthComponent(signature); + + Tomahawk.asyncRequest(fetchUrl, function (xhr) { + var res = JSON.parse(xhr.responseText); + if (res.status == 'ok' && res.result.results.length !== 0) { + var results = []; + for (i = 0; i < res.result.results.length; i++) { + if (res.result.results[i].type == 't' && res.result.results[i].canStream) { + var result = { + source: that.settings.name, + artist: res.result.results[i].artist, + track: res.result.results[i].name, + duration: res.result.results[i].duration, + url: "rdio://track/" + res.result.results[i].key, + album: res.result.results[i].album, + linkUrl: res.result.results[i].url + }; + results.push(result); + } + } + Tomahawk.addTrackResults({ + qid: qid, + results: [results[0]] + }); + } else { + var empty = { + results: [], + qid: qid + }; + Tomahawk.addTrackResults(empty); + } + }, {"Content-type": "application/x-www-form-urlencoded"}, { + method: 'post', + data: query + }); + }, + + search: function (qid, searchString) { + this.resolve(qid, "", "", searchString); + }, + + canParseUrl: function (url, type) { + switch (type) { + case TomahawkUrlType.Album: + return /https?:\/\/(www\.)?rdio.com\/artist\/([^\/]*)\/album\/([^\/]*)\/?$/.test(url); + case TomahawkUrlType.Artist: + return /https?:\/\/(www\.)?rdio.com\/artist\/([^\/]*)\/?$/.test(url); + case TomahawkUrlType.Playlist: + return /https?:\/\/(www\.)?rdio.com\/people\/([^\/]*)\/playlists\/(\d+)\//.test(url); + case TomahawkUrlType.Track: + return /https?:\/\/(www\.)?rdio.com\/artist\/([^\/]*)\/album\/([^\/]*)\/track\/([^\/]*)\/?$/.test(url); + // case TomahawkUrlType.Any: + default: + return /https?:\/\/(www\.)?rdio.com\/([^\/]*\/|)/.test(url); + } + }, + + lookupUrl: function (url) { + var that = this; + var fetchUrl = 'http://api.rdio.com/1/' + var query = 'extras=tracks&method=getObjectFromUrl'; + query += '&oauth_consumer_key=' + this.spell("tdo7m2m8u6r7r76mpod9jqlc"); + var nonce = ''; + for (i = 0; i < 8; i++) nonce += parseInt(Math.random() * 10).toString(); + query += '&oauth_nonce=' + nonce; + query += '&oauth_signature_method=' + this.encodeOAuthComponent('HMAC-SHA1'); + query += '&oauth_timestamp=' + Math.round((new Date()).getTime() / 1000);; + query += '&oauth_version=1.0'; + query += '&url=' + this.encodeOAuthComponent(url); + var toSign = 'POST&' + this.encodeOAuthComponent(fetchUrl) + '&' + this.encodeOAuthComponent(query); + var signature = CryptoJS.HmacSHA1(toSign, this.spell("oKeSjHrS9d") + '&').toString(CryptoJS.enc.Base64); + query += '&oauth_signature=' + this.encodeOAuthComponent(signature); + Tomahawk.log(fetchUrl) + Tomahawk.log(query) + Tomahawk.asyncRequest(fetchUrl, function (xhr) { + var res = JSON.parse(xhr.responseText); + if (res.status == 'ok') { + if (res.result.type == 'p') { + var result = { + type: "playlist", + title: res.result.name, + guid: "rdio-playlist-" + res.result.key, + info: "A playlist by " + res.result.owner + " on rdio.", + creator: res.result.owner, + url: res.result.shortUrl, + tracks: [] + }; + result.tracks = res.result.tracks.map(function (item) { return { type: "track", title: item.name, artist: item.artist }; }); + Tomahawk.addUrlResult(url, result); + } else if (res.result.type == 't') { + Tomahawk.addUrlResult(url, { + type: "track", + title: res.result.name, + artist: res.result.artist, + }); + } else if (res.result.type == 'a') { + Tomahawk.addUrlResult(url, { + type: "album", + name: res.result.name, + artist: res.result.artist, + }); + } else if (res.result.type == 'r') { + Tomahawk.addUrlResult(url, { + type: "artist", + name: res.result.name, + }); + } + } + }, {"Content-type": "application/x-www-form-urlencoded"}, { + method: 'post', + data: query + }); + } +}); + +Tomahawk.resolver.instance = RdioMetadataResolver; + diff --git a/rdio/content/contents/code/rdio.png b/rdio/content/contents/code/rdio.png new file mode 100644 index 0000000000000000000000000000000000000000..093d371890b6760cd2a59d86f263897f05a783bd GIT binary patch literal 301180 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%0Dr?;s)cMv|mvPbUsklO^3;gGBUIai~k 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 V+SF$R=otHYc;Dn+)g6bZ{{!DtGl&2H literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoK5 dRG#@^&%nNb>C?6X`!1jagQu&X%Q~loCIFVy6XpN_ diff --git a/beatsmusic/content/contents/images/iconBackground.png b/beatsmusic/content/contents/images/iconBackground.png index cbb3015fec0a93e97a4acb45236113c126366278..4057b180dd53ca8c6016440f0f1c645d29f42a9c 100644 GIT binary patch literal 299506 zcmZ78S5#Bo*9Lk(5d{?#0a1#I6zPb7)PNvW>Afmd0i{ZSgakzCMT&F?f=F)y(i7>u zNw1-WNKHt9B#@Bf|2^lsITw4ZG4|cMSbNMlf6v;{hWc9981FFB(9m4d(bh1gp`kPS z_n2J1^zV&Oz54XOh1Snl>lsbeDAzU(jVg_fhMH+0ZAI?2pBMV#ziTnV+!N~>7xfZ2 z90YEv%IWANcq`X3(K`!3$_9+~0{ft31QidZQZUrg9(*F8=Dg1!^Vsl7WFN$bD!#;f zoE{QJJlBK!8qg+oY`j#i zv$zidw9anbwJD(~1>IRpHpNddWqiOb9&(JOs1Cf(!{9+N6d-Z3y3Bx5Pu*91PCu}l zml_s z?zsEXbDHR@VuN1_ZJX`k2c5{BERqJs$VkR9a@A}GVoM8s7dfp&%3LX(8b~O7L9#x( z?~TvQKyEc7dZ8eTE#n>Ev~-{gForY&EF};CnBX!H-mbJwU>1)P$tI@*R9}baDxLL! z7c`d%rph67&_H{#!jCbA*V%W0uCaWGV(5cnGq#Q!)#4uuEZaY5R0W0h_q|~L@{#EG zHms0ryY@43?A!wERLPo6sm#k5G+erTs)O(NBB3H8zs{301jswE2p0tsEs;cy!wRfT z!y)Oj;O>&zyv9IZpPX55#ffj^@gdosoCd|GTzJ%UAf4-mn6~LCV**YpYuiTuJk5|qKtQmcM`6Rn~ zm~Tzd?bfhCb;+K-QNWf+Vwg#oJXu`Sp+n&=QqiX2QbJR}@K3zE9q7q-6Yg8H4QA=| z7qbm^K-kSa2<*BS*U_IxQO zy(+R~-j|G8tM0J9i-altymz%khXtIjAy(g-dFW0Q?spLKCO3aU31+oH`{WL=t+M39 zpSxX!=1-gq7caGZ^qsJAKPn1k%3hWw+cdU4k6^vZrZhGL{7|;4v>L&yh&HZNL3iq> zT{dKej$)SN5JaYx$IHeK>dL8q7FFIQy`Ig^A@A59leww34g)F8;dnE!%%ljB4(gvfgg%=8q54Jx3YsEy8j-TbnzKguNC zkJK}<{k{^Royz1zJDECKxv0D`9J67u4t@8?j8~zMQ@ul zXM6cSfeGR(c`nMVB1GyECFYjy`<%`E91QMyemB*3c9PIYKH9;kx|J2k7T?%{&SWX+ zvfR|4A1TmDlgPgcJ5KPABZplP2{dDhRBe(kG(Ha*JGFlX2cvekJO1r(m6vYo41CAq z^T&(MOg+$_!FReM!vCaDtKObDvS*p#g;c)gqmFZ{mqr)_SJptIVrp#+;nYJ3qmQPB z&pk4h;$t_3?uY$J)7x~8b+gx|)hj1*_qe*q^{F%RiXJ-Gd`Pm-g z$oLXEO=Td^FXGqVO;hy#358Sx9$hnuOed9R%lX)>)P<%%+${m7jg^qba$?6qI5O4%e2@J^@O>y5B;UEkYm zbjSl+W#OHb46u}s;I;H8J26k*wR-somw+v%fjp}XxEofM;*mZ zAM-w&4nGxtDsQLK&bj6gae^gXoha^HV*$40Nz#xFk@APTnXp z1GmcD+U<-H#T#Hneh2YzqKrR@kcUyr0 z!!;D19px5J6#1GW<5eZH(^Iu5MNCvy6OC=fOYC{I}*)Ar^4o;-DcpG^Rn5}qodJ=1Caf2;gFZn(+L3CH;f7T)ag^5@?VF7XZOJGetQ2< zg^H@;7!Fe9x;UmJ{Aa`5!@~u`nG9}PT;z)hG8bMx@8~BRbwgvRo^OPPH zD=R7UJXgVP-jCftMOeo_rh{T>)ETs&V=|OnwUcW_+?FG3+Q&G!7)HYj#W>;;ENS6vC)s*8=K0e9|k7Y(8U;3CMprFq|`Aqaymqa;8H z@nI>7O<+C{i=$m@O5O6M8b!p7tuJ^uKm{mPRGFor-QDKh$tG$&3g*qfgG?x?eS-(AxABM26&PE9?@+J}H4e6i z^w4jA!%(V}s2)V4`Jm2})`B)pEfachLk>3l*k?rM-c1Ct$ubkrwq&H`zWdfpS$eT> zJ4X{=Z+-_ngE^~lWO+XsQW;a(DCh3YL*}%{VMGgp@XjjH6PXs&^XZO|5Gn<*pUobe zyW>z`?D}xbo+E#=!R@a`h{RdZ+=*lJm$vaevdjFS_Nr}mOdc4N=9Mew*1jF35birt z`idaO4h~*UXS&6k26Shi(GQYGkoGz4i7ypxj(mDt4bo0>HE&8eNg%;mc-;45xYEGK z@jHe3@6h@`F_g*=ZwE3UiPZ>$ATL1$mmaXigPg@;#-mFxl?YQ zdi-8J^=zR_;Lf4zYas&f6h=2ADDCiT zBNqs239At7D@IY)wff}cGdGlF-J`8Y#}{vV2i%*Jbi=%2zUSv00Dhd_44r7zyjG(| zdlS>MtT6`mt!=@rJOAopT;iNJFT;k@C?v@XB!V;=w}SA+L6;3` z9_CeHdFPXNcJmajj1rp5?Y>T`X0}lEMIjfufQ<)TI3JgzwSkBh#Da zDCb-&*AhZj@SK4MU+05gz6q2)Ix`Y#Fls#<0nD9=uO+l&f(yQv}a zC!YIXKWj7?mu|VHSJSpiWuO6;@PR8epF}?V`O7p8f?vHyd=O-($aB&LdH>xIHB?0O zpK!Gu!yQIojP!9Q*#vo^Kzkc6uKntLct*$AQBl55Xik;&^NHc8^!wyKRNU=}H_yXD zEc^78xHeJ?v#*Fu4tIAxvo~N>x)AM6=xE(Z`XNh6|l^3{S2@?e#FQNs~GS5H}rz=@o75? z;<-+tm%WFd^INi*W znUh~@g}TMId@u<+`P-eTWGC?+Az^%rQ6{zG&d4UsI(cQJadr+{E#Xegd30w0rWDKK zy93=K+)7Er#E#q5$&mf?+W9sz3enaiJ%zUddR%+QVHhs1%F_1BEm_xhKoOVGD`7~k zm&hC);cFLDoIFBicmZePlV)M=rl-1FDj%|PZj~scsZcoQQF>Fd<8lnVfob1z5e7>s zd`4{bZDO{4Sni`-=ejz=U)8lksLM*(fOGindj<9gn!>X! z#Uy0mAPyXs3fxi`53+6^LzUf{3BulG0yNB>3|yTXA`Ar8s3{Z^=DNiJ#hVykvR$dV z|LT4V-J=`X(CCjDoCZ?PgRg4t=07|Hv0qd>+Hv%cdAW4ke)m>gMT76_ z!_d!Nydtgdnt9-IfTq7L9Cgf|^;+WApjT0ca-&iYJ1#Ku;t8McZ?VB!qa`NL*SFe} z@mN1z`j-$(0)Imc;)&CuWa+!_0_w>9r;I6?h=#6alJaLs?cYit!SLb30L}$+r>lKW zRWR9+&jo@tfE#$haTej+$I5Wc3L~5lm5(=C0YMz@efCJL6#+Q^8O{90+gpJ;P@Y5Y zNI+w`{ja0AY6s3X3orb5U$U!Ap9*{U!~QM5`O!cl)K9lHp#^%eC2>jb6nO8YI5HEV zRD8Pzyn31da>Uv4FAm%oL7DLFjwD7<4B#R6f+3t~sTFMP4q)=;)>w1$M6R+yHCcwi zwSSp(uHf_Qf!j>W-Ge}PzZZwh5Y&CM-x+;rpXwKx+f+XOeGQkNVn|TsbX&8r>w5tR zxL_=Jgu1*O6FHf8w|%}E@huAw;8@}#N1liEJKp3QrEnHk?qkUJ3^y-Kl5QU65hp?V zwA#N(txN1QhOtcAywYPh(+uV{3}$Q%GtR%=T7JHOK=5u}=xm(<&liv;-v8?FG>E?> zhD64{5z_^Sqnk^5Zgf}wT<8T_;E=(8?p`=8$`{^J>R z=RL2?4^w$DdeBf@;^E7WzQHvowtz}oNY?on(a1T`8eFQ4a&Vh}Mf!ve>wKjt;VpuM zL-3iH>_qY1)BSmLd?lqRc80&D{Zck1lZtB&H0(<3XTLwh#qe6xlccA!viG-oG%FM1<(?Fq*Dmy}uEmrE@jBZZr3-PG|bdK^~^ZeWE zx5n+>*N=6Zn(e>2sQ1!-6I>-I4xWAEd23A!SsN=o`(_#RExLTH>K=IyNhGELTP;Ci zz_c41&^7>Dp5@mxMQ+GJOXRa9U^3wZs~oDifILd#O9xlCEyHoyCaf$o$9%st6D`Q{ zAd8TFx)#hBi{fcGa>8>8=Xw+0e(@_I(x&zAl0?(49DwI()s`aC>SM$%GtXYU(mVWV zkeWp(_WJa%*dQXIy(EX5dB3-61}>uA9O?y+(Juu;vWA}gz5Mu*SC9c@eI1d?As-fb zm|$?qAS``33-gI~$B&tpkdk$5|5ktk09aG+!p32WO%I1wUi{Lpu+HhAH!UzY|6LvG zNrZGz98do8!qt-)M*kg3>&PR?@SeAd0M$&yNsQ(-Q}Z3^z9czb$Dg)U6ocz6q;EJo|29??B5v(4 zr_+hhO%|uIS+Rx}Zq2s3mDjjrBii1SE9ls2pu!v=Pyq2`i73-6k-xf$=CU&F^;pQC0-QTtGxQ=#Pt`sOqQOch003zAD)K|lO_bt zSA7FTdo0_TPsyXjO*bE(#?fM2FU zZ1*&Cb=HG7l@aIA-s+%=;jWV-X^EZ9bGz!5($SnlZ!p~B^F9g9(Nnz!#rm%DgfHM(IF&mZ_LFt)7uAv$YZVmd9Y*bFVb$G?yx-ol%)_g7FXJ! z1P6G+0$uI0>4L$XS#I2>w)xT_8#c>H#qSFd^1N{KFA@P5W$0GFqtkUDJH(AEF_$2M zhhm}&-?pNsI75hrgd`nATi!{^VD zlmX^y@5d7VCPH8Sl4s#>4EK*iEl7BToL)B3si5d62E zo;yWnU81~yB`>?J?|yjV!1ZS03YAfmcT=3$%z*Y0Z4S|O$Wg#VLD38hPNyGp*V<1u z7Zog5#Z{L1bes+0;db9C%YM3%>=VAAnG{GQB=y$lmi*S?EZp)G$Sk)1~sJ zb_31l$)!ODS_D8s<=kaJmm5!!@bTw2y95~x_;p{aorAj%wCm4Fcf(yOn_c`&U}_@x z;pt{}wnD;Bx}5DUB`3T;)OD$tQ*$1Q^dlcug^)6{*#ZN8hxFsze&5<3up~W-{-S6IHsjl-u^k4=Am)?`yNG@zdTEnGyoZmz0s#avdtt1-!hU$jR$-zrQSsjidX8*sO>j~ zN*@1C|4NcT0uTHSU@2zr=(($>KSl|x}(WfZ6mxrv7x?1ronp2;xUs?`6_CRY=#nCSym41A%>haX2=y~ zr;sfnw@s~lF5I;Gr%OlX>Rd*yU*x-$fhnpdt|;X-;xUC2d^7o>bNY9uR)&=?^yqVS z*?aGL6_2k&*?vu;{>^fmj+hr^4s)%=a=Z(zN=E;NkWl)6vDEHIxcw%st5dv3IrU$G zCj8>7vT=&w@bqfi!r!GN6T7UnX=uT>%(dl16vKY5o04QZRx(mUI)!-WWbT$nsZfkV zd<$l8yg>VUVf9HiV)|1$#poG#XPg6@zltZ`mpNJ>+4?Dn-e}O)a_4}cIuTq`*O|Uy z_MrA`Jz8W`5bFQX`Pd7L-prh~9N|J5b#hoj@B1!st6;uigfX)F3+dK2+p-fG%%!sr@5iC7;>m!{)$vId^S7KjWNX~9pAbs z4<_B?-m7~P75({<#hS?l^eARrErVP|DHgT|#lY0}JDdUE9>FYKO5D&G z?usByZ}`wvr&Yg3QRLxsN1H33D$zV*U&glAO4I@kup6$8i z5{{9$Tnr=9^U2Dz0xz+7b2KSkV)+g!&*+IBXP$tGd?4>%Go~N2j-j_x#0lrd8`+44 z0(LX}-#D`UJgj)i)Ql(8L-_lSS6ClAR*;wbFl^i_A8Vo#K>AReHGm`XZL~w%*^p> z@k$ANjJd`)UdwPpS!}C;tdGPJ>$Ff9Vh4hNVkHfGA!k@s+VU%DHKlPrc_*LIxl%a$ zEq&z~Md~*~?or4w*(eM;+fH>hQ6gBh;?gF`L%&#cd=wK&?1p=%$BrzEF8@l%VlJ1m zQ3X8|6LrnK)CN%}ysy%*B4h-}|&TsLgBcWZ7M!VG+%*9a(bP(toFIA6F2 zz5Em*uKUUOkMh~F_W4qSOm4jVY2$&Zm)ivHy)qDQgL+lvK$=kTOSO*?jGS@z>)vHw z-V6sAg|2liuz4A1SRcB`DHP{Ue4TnhGs6|WBx-pG!BHfP%3eh(I4J#WYTThsa<3gt z+#E0+{eA_Re!GnnR@dm?I;_cGZFf7mjT1?Ha%Mpu>VRzhHExkby))eLrEYr5Y|XB^ z2^me*Yf6H-vh=i43#Z_RFiKTbInVavKUd(kzCp)53qnFOE2(2@-#=sh=joGzi-7_b z*FZHc<&kuI>&kTM=AaAACp<>*2l^t>UV#qJkIyU5(h*2J^p#o5s|UO8foZi#-h)W3#j&Q9o8! zI3Jjqx~nZ&u zBbtStzP=-A)a}+V$KjNkA3v;Am3CZmAiTfVX(4V$!!x#o5eW!tskD8*B?4h+ma9D* z6-P`Ki>)0!UC6Ypq8n|{DvZw6$3)Qs1%linken&uKRyQJnpu&uY(OM~H$I+^S;~!UX=Zqw2X{c`+j9wsqz3 zgtT+o31Efo!XrbjlhuQ~Q`!*hqwj&0hQ$ggG1Q!gRMS_EAM91MAB1+?ZZKI1`Yf>; zl+m1E=BK}Ia1gwNe0_BF5AXrBk2*Qha@kdswmVp;@pZ$ao?=hyd?n(#zuFwURqTA( zeCjqQ^y;LFjimD5|(bj>9m5rEetKT2DU^|S9iP?kEkX;S{_V-g8m8AJK-0b8H7NIFSFC1ew zg+PWhSpP&eDm;Qtt6p;XMt!-&F5Rq;kCg>$M<}6Z3m%Nw4p@BjPa>z>N*aAG$_1{K zsTS`in`Ae!=c{yCW4#qrX(K(!o1Bn)=k{5DmUg6=N-mJ zRZbG(SqqWW`0!*(jafo!_(;O!Nl4Y~61FhYE_p3ol^le`AN;hD4r;fNgAW;)4S1ag zXFD9U#}2AUS9>Oj#ksz$Q1NA8sCainSX&_e1Up8PG#&}zdCE1?_W~lBg2>r&@HvaP zhf}dNfEu)zyPq7h#+wKD`RM|3HqH7Zx zcUijzvOyq`?*3Zpaz)MSmuY7$yQGlrWD2h1^s(wiP!ei)VV#~MTTg3j8gpG> z^zSbH+Xstq|JRYu<1=25+VgMH_N{;X4M8*E0);$4juJ@Zl`Zt=9nG)tanKO}*HO1Y z(6?XDejVxX%DKJiuo`*LnBWC|x<)wu%J6;}NUtP^S^e~nVo`S#!G0^`PPT!zb*GZI z7k3N;*4GN-E8Rc#3^4MVIIh&1)JctSl=6x@Dy1h%%hLz8Y5gb}ElkRpxB&}pSjec; z)8Z40b|`*fcFYXFx_7FLz^~+t4z-z>_UAaYW(AdnCPe>hRFQ<@UHh<~1^Y@S(6fCR zf&U+FSLmBf{5;+a=O3CTuL7xg$ROy|)PK62dThj;>99`_&sRdi*mcU&gswmBbFAaz zK@`Lr-Ov|3*bZIC&XLIw{u2N4Yp*TPN#J!YqIxn&9`pFys z8JXKyU>dp}(~_!E{wLVTU9Qiam;9h8V`vr(vP@@ojcw@JZBk(gZ1X7Zi+5rzeuo(J zsvpy|x(_}<-93yxxcDPRlI*^O%vxM5OndIT3DJ z#QbcDtr?|B_w>mft2n{F5KEEAaH#uEoSA`Z4PlB)tt#Friv3G@NcR)Pr##ZqFaE_i zqC)WNlT&w5Dea?NGs9{MhglJHL%JRkk#C;v)gES}xfex1ydKhhbxslSBKQ2z6-H0g zWHWkuSOA-h;gjv34c6xxm==13o&=kl3i$+txnuNwX9F!k0nAnNbdBdvF2GTd7@S={ z>Ozy{Xub-#m_br5;oWtwIO=ave)AJl7sU%Z0Q6W_@|aBU=;+abM`Ma96X4@kTtj~yhovz879@w0}SGS{iDZgB3;>YzuGS0%EYO_64)-!P^Ij+U?mKp&#r)+3?&ICJ-)6 zVB(P`BVmnazxiK1jg(k6YnPUW|M+mK=0ZeSSlqZ54zI~~@8N|XbWs|I$g~lgZw`#D zlktg<2!vP|8AD(s_jcO5*qmKpg#^#$VY(RF@9f*BTu|OqZ6J7_%N69>=g1*0BZ%KX zz!Bj}u5`b5MLXm*#So&I2T|CZ{_^9#Dgv(SHO*2?Fy}KFvlFhn7X&fmD8gc@Xam8p zV*Gp|k6yAQTqZJyKsjvoc%(f2ut#H<>0dhXr@GWxuq@&ju4C(IL+Z$b{&SJ>`I*zWqARp|Cu?K~IMZ57{95>0_w3 zq65GcmR7QQGDlV}Lexfm^y{Oz*|xnyQKUjTLhSC#4=52`!>ak=GmT@%cZwX!AV|*s zP+t0a@EV-7Pg+giXejukDBF5#7I;UeJC1TFi=0S2V@7n|tM4r_StLyizzK~rMf}Bw zQ^pu)N|0cSa?j4*>HXVqd)=`RH0BLI&yBy5eSg%qCaKZ8|5J6zH5|N#0O)JC^5j5XX^91?k=wNQB zlw6?1n`<&!Ya(L5yBVVMQ1Q^2QMNtcbMkp_qr#q$bEAUTmYob@%Le)%bvwot6~KWm z>ViY0<dktgDa!vQs)y~Q*DqRq+D^Iw?t7uX zSg+cT=rJV{s-MsjrHA2Dy@zMv6M%#|)A)|+f zqF>1QCC7P1et#b`nM$tV;J48j(!V_QL1o{3tNE3)!>t@c{6K>FETHU!0qWNSBsh?< zKO^xfeE`rOhLU#XX!>ER_*1wK29v0sr{4XMVV+49A>mVdMv-s3%XQXH)MoqbGK+#&+pdc30v+>18GX0N13xQY7^b2a5xj~#YWz|5I+?)CIs=E6cP{ zpg<2OIj(n{b*4og`X6(D$t&3ZHQw-%g5B;?D9`hAr#Zp#C%SvTAXNxG$c*yWB>CdP z-l$Y@Ku;N|rz>D5FUX>|<;3Zplo3n17s8`=)HgTJ!S`0(*6+w#+(1SIFGH(0xVX(W zh14RU&F!3ahYNke=i{f{0$vE?FMTqMgqygaFarZI_4>|M>m!mV+@b4Kc&l>!K@m~?d-p8>IeuT~>Cu)%>6#2o; ztJK9IHSX@+3l`v?@fy+B5v(!c`zj*j&5eHJQNQe$ z2yk$C^;zEmX@D64{&mG)@`?`D;{$|4O9fwB68*U^Eun80A3Rd5Ig`zM?aah!P9u9P z1jw#c$%d3rf%tl8J`gDU3M;la&qKBWnDoPx9R@4%-E+oA0T?7!gt>Ifvn7*KaXYz% zarO9yEi<025a3A5a{~$GqAznftrc@rdG_jJa#0;`mI#wSG_0U+rGX;MEK2a#lwS=KWJS0wZetMa^vi3R0`SRS zOPWJjUVgs4^KES|8T4s)bBzHs*^OSmIgw$EdifyGaH!}@Th2*vjX36(RY$wzm$#?? z$_b+n3Ttj(Q#tcZj*s@tEhRpMOPg$0;`W*JonhoZT$TC)xsA%Bvi9`7Ap3~F@1IZc z+Ml?chj8fD)T>^Dbs|LlxIWd^pd`eC>X2Fg>~zBAv_bc~cdmBG!RxKI7k;6E0_W*j zMJxu><%-~g;?6ZZ;Dz+L15i@3eyLiyc_d#&Rc5}9(Rs2=?Wy;%F1rv=`hcG-8Y-SG0G)u z3%T{$ur8hOA9_2yjxIOY76T~!553*Y(Dwh-TbA#h+lccDjM1P%cPRHd0GM0FxOX-N z0udiM)`U>|48(QdxPY@kOzM)1<*b2n4k@q)RtMZMxcC~#g9!PQL9N={ zoDshRAPluY@Ec)H4Hz)`%AG1eV2vEEeqisb0)}0BB3*`A?3g zBg-77O2mg7EUhgo9sE`&|L#!O!x?A@DTohMA2S9q9Bm}!mR*|!vBdQOi$pe8G%5Z+ z`F;q0?-17ZCjN1#I;{lEs^vOSqu^v1ppcfa;S0y-ig88+#BFxFC=#+s9@TGzK~vP# zr?@Tk7imKc)Bzv16Oy=se*R22fCrg^VSM4b16&)hp-0|8cTVrUW23G_`&v%Au02f3 zI`pAioGq* zTCDVkOF<@ItCttb9uBfOfFN4^_J5 ztkhMWHD3H|F}?0T?7nw2fS`o;gCG=Y90Efa`Lu6Mv7g_{^>5GnCUqwk8&~4~QtuV$ zyqN(L&&oj2HvMHdVC{gjKY?0HcwnB&_;*<=RO=NRWq zxxnvp>t~^o)CKtheW7qYM~%|w?!k=WwxR(~mD0Unq=cueZ_=cza{nGHp3?P^Xncj} zNsfdSyjy~(tZSy*SlZd2 zS^H<*u-mPQ!KZP|gLui#kceV?8?r$M=R;iO;63RnCfQ=Ot5sY&#oxHkqtteoZURm` zj0gE3@kPM3m%&Q80-3qdr~3qHQhZBNHw>)MT*82Ow6I`*Vjdj|w_Mn_$lm6(Ao9|c zPSNCnH5wM%WUJG$^*;H9I^Jx?OZCIRre@*}vG2EV~rp za1rlvdzR899tsYY{HZQZup7aTi;OpjP}fp0XJra(+BwUxGp7(z>0t1ye;tRVKL=^E z8mWY@q`_q(gHD3x)4eomJubz)K0uVtRH|S3ZXMeB_C2aP^k8+Q4IA3q$5(yt zCd}){e9_)Nw)f}4R8G3&{~5Z@>xlfsHUScdIXkErk+=D?SS0x5CH4D@If}eD%=NYl zHDv6tuk{4w_TGGTKC=bjv|(pjVF1y3=8Wch#VLQG%k^d3D`^7;nA7#wr3D;9A4Cz7 zC<1V$E# zX~6M^!GXQXqy+2T2SX``H!Ao8NMxj`)ym47r2?@JI3 zTyOm>4Dn5}9a32yAj7Ib8D#erbFY}f_k*!{(2kn6O4`YK7H#n)5!Pc zVip{4XW{O*+-Nb_DspNr^5K}ilaO|%SKaMaN-GlOpw@sq-<+mcP&fRPJ zl^<+zW@3bMoroQ2PP+lO$RjY4RGR26hT`JfTS7CUv!GrdidnSk8lt(h@O=NwBvbJp zgDKG8n53-t19hwXs5Y2LRsNY5&l}?hbg9sPL8Ao61-WIH#%jAP3BQ9hXHu?VZyqA6 zfNm|YwJumm;pCwfYcXbw{7=G7%4>Kkx2)05&$UFl_nsDqYN8(?Y*#nE;21;^=s;%k z&k?~S2~IrA%cd3mdiowGZk#H>|7bCDzXwiDS>LF(=qUl|6$~XE98P zXm)vF*&bnYaCTx%%@lIDA8uqMxf#Ak``yw-AbYu;KnsaU^B}!fap`n>Ge$25E~bnE ze@TGNkT3P_e4j9(1{VC3Y2rx)7OqJgSjXJK?G=Y)rkLp*sBUGQj#r!n;WDP>>Q*Gk z0W#J&WHGH`W>rTsBJ(gX~%_gHvKsvHT zoW&yEu{qp=Up9$hyaszQaI+g1eUNn?bN>ZnzAo;GYV)rtw%g@rVX)8LSc<*K)E`cm zbK@7+Rs-Uvqpm>7^@q%$zF%V~R(4qFQ_d=DJ5SPP)kdm=D!3GxL{rCX?f!*uCedR6 z|B{gT{h^aWoJz)C-~gL_09nI#wE7|%-FIVSDYImx9^M?-pNApn zB-iKK_xTm@v!|2piSAb&g7kn5?8*%hbJtnGPqTPw&gGEb--JEsWW3wZu=nOtEn_;b z=_SwUM&OtwOn#7)bVDc-e9ZEVww+W^F?97Y!!ob0PaDu=>pvL3;>F0P(=V>m7r@+h zpJ|j5>8ZL92i)O47j8rMkiwBYMbNpbXv~y5B^rJ)TEOr!rFO_I+5JY7PURCYE!W29 z69)7eLzg(5!S`-2H+*f#AoxsP264C7D-I<2{@?fM!a8om22$a&*u@_f&wfa(LF(1A zBjj;KT5r!7_ED#K3ts1%T|+!y_g=3^tC-D#a!*J2lM`=jokeRFxcI!zq@vOliAN9m z$~7F1gCAHA5jcF{!Z?I)Q?DJR28RfkqUj`ol;S-lshYhH*_m|Z#3ctm+z zeVBo?F+19#9(_+P|3OJ3OP5HFo2Q}cw}&Z3zo8AOB06)qvA_|*ly@*X0o_l`QiUZl zV9>`oMaG#k2^HO$0!9z}=Y11RQf>J`nw;mAN!qUe26@Fr(ps8@hu`<%f!rcBWaF)n zUFUVe)6MeX=px2|{}0GHP?n5g*HmP@cgPt)weP=hC}6DQ0rr{$TzVn9m?%HR^Wuax z3m3iI+OJ4Eqr@jJSIYwnTpRYP^IVJ!K z3HTS~bM}Yejc~-d9N@UXzr`XAbYQxWS{=Slpuu&1+Z-~g|7yoz(Qs`2p+-6t1GXT# z7KUNWTZ0NifNnA?{e-vztHJ4Pw1s?N;$Jflyx65EsqN$tV%gyc(mE-=EXe;7QsfMu znk76$+w|jE**SZlCoL2=af3JN;NO@=r7C7J+YP6PxHC=+mX+?xO?ORA7S_MRZJ;uC zGDY_TeJucqQ1DMkDXRq#+5f)c-={N<4DeOn{s*jY?-(*oYb^6#ptP(f?wpYy*m0}H z6Y4W&af%^K-7w`AXdm-=y9BJ?4RZD?54%SH?wVv)QX;-yLJ3np)|#ex{PchvxdQw{ znD$fe!R)MWQA+dc{6+s$@kKIfP+0IdYB6ZjB5CRpRhVzsEnVt^c#dysslx76++FJZ zd1H*|L<|7b<)$YCaxiT|*vwL^mgP-drs168$VsW*!Ia?Bo;pvrW;dyvJ*$u4N@ev& z=wT>+t15SS$1p=i3MBNM)F2q}e=43N@28Po$1d;r;(9`$+C{>u!L3(B7Z@8Rpxy7~ zFg9n2uS9!?%CDOrxRd|U-B1|8BV4h8r&GU~Pl!p0V7@S=CF>UKeS;Zd;&B1n(RXb{ zh2#QyOjxNU{E1k5l(JMjPh1#ta51`#~4OR-yCUGN5euEY-)4BdAC zZzkgEf_HXoWyZe-6HltxRmbkdSO2p5@SMXvQ%hPi@&qdv`UtFMgYdA}Rt(5mBm$AP6WZ z9fBgDC{4PQ2uP9MLkWqBQUyes)S&b(U0QHtU(j3@)Lv zyp4`vEy2tZNI=qKev9{)`eLN8%PB4l!teSf3{K_rPNfL}f34Zm&rY|+!Ia9zt2Ix{96l$my{OMxS!>7=lyXQJ8~7Z_#88p4ikWl-uV1ZHmEqre-S${rLz^R zbD4b*ma8F7BHQM+z_Y<)O-9^r~#Le|h00tGF%b2I2_Cf9mYZccW}( zQ>cookPinx$`<{URy>>Q!0#U!r-n-4{P`ZJO6w8~Utk$QWL>Y}T?VujOEqe`R<{vE z6*}Fv7C|ofW!s5RjS`2BuX3Wl+1V23Ws}YF`=AEJXDH)hZdNcnjx(N6s{I}PtvD*Y z-<1gj2n=$Pq(nz}`ukC52G!vyEWnQtV+)12`i z$ub^heJk?)=;@Zw*XK;kHXhn(EC~Up+9ZISZ?Bb_RAuv$HBRzs;$n`UzxlN*^9PuN zJuSaJBngLDYxM(IP%YQV=Rg79HR;KtEf?D^BeAVXW4cc~xC1?gMwLl!T=83>C7#(_ z&c10i7_X+)5Z?Z+FBcJKmIjF#prpB!?#;RSJqt*oCImY%L-NE}7#t=0+eSKD-FLD+ zj8%|*Y-F|Q~33ZTz|| zUJvyGkG`dpX7v4h-_Olb>n2uIEc4oU3`yx(Ap#*Hd!S4yL%r0Ib7Pj@F)!mZ-hFoO zalN8d0X}7mFDC9>C7fn8+AX}o^v>N&J%{9P--l5Yd#eLRd11W7^K)_8*;Vl>?5~IG z*xRI_AH|JSPhyCbO;j@+S7gY8H8dWKCA?#;pCHoqWv_K}a_`p^j#=8w;*ms5FJ2xbm3J4g2REfAJy-g& z`s6$-B{=3gt8s>;P@c<=ZcKFhJpCc(O{5G&DF0{VS=fG@rNeEYQIzti$V?W)k)QL8PYdNWb=R4Ij!4G zde=5^qJ&?kiOR?z2+r`JU=Ey%ue8y#h)oT8Cwxl~^lkTrR4;saH8af>O0`7w@Mtx9 zQ%}n@|D5CRRP^iWi|p`QchqTAYjcnyr=yo1$A2GP@MjTcMYS18WxQDvT z^)3HPC&d4FM-?KOA+#|O1YJ)0hoR5oVpc<*5t2vp^sXG=Fc<;u{SQD#ui8s9ie2)> zkM0~>F>7?BMO1+20M-X--!F%k=z8(8oW08s6uOxA`riOORCRcT8BLE|-0dC*+ludr zzsemG&l{_}suR5rg!}?i1nnXQAbIk+59JU}_0k#q@^_4hVT?#Ysn*BL#88gxT;=J- zya$rJwf zuiB>=p1O~`!?98EHOhl@b=q!Xcz0Izq0@->scWp-Qaq=%A?+Tz@H*3T__G(^T6TO7!|3jdvvqhVxwtN~ zgTZ%GAZ78P)GK^r%8q_)0f3}ZjV3PaXXnt9cODS-Hp$lnHPIAgnD6s{$T<%8A}3+l zv$Vt@9RSW_hGC#s!@uls3k)i>mFB1Mq2ve0!Yw)Jv)Vfg`%zmD!+fY&kfS?qA0|kd zU{)G2F@qM*-W1)cx)tNU_<`5lS4!4maMhUd*6~}y^QpZVOSqRZR)SYFt!4~bP<2Mm zXToQIX&BSCDErZVkX!bqw%>FoQ2pJN2`V`^;OU4llXHTprpkU107;m{?%JPJycq`{ z&(A0SLXF;j(J8_q>y~o8x}t)3rUOiZ;p{)A&sNM+$+-{_m!dB*{ZM3ZS(oQ+Y}Xyb zWCuwCQ@wvZ7rW>2dXwA>2B-(2@ zB6)8BX(k@JQ4Mj;Te1^O5`poFl;Tl2)(7=Ls81D6+H?)Ata;@%CF+A20DEGEzL)1W z^>}P5GDCe-T7D9w#tYoauc*b`-|xdDn|b*ALs!Wy5|ZGOdmE#^J2#2*$d^fp=Urehpu2ZAu1Ae~ z-f5W<%JRdmrOC%IN-JXgfh^rj;$0}&9x1pRSi?$#KM?EG+u#W4uO%-LJ3s^NS9=e3 z{o9k`DunTH#M0>Vt3IU`a>;S5?CdupEdN61yKiY!FhOCtn}oixcMH|}tY_Eb>O89D z;$I(K-#!?V-@8cY449y-n((j9*?fe} zfwk5D7jj-BE*?m)RFy1Hxjf=Zu+P{u*9CVSP2=d(n>Gu$U<@gZ5r^jt9NT#2LXx{oUw(R8`>x*u2{FZ# z58D3hyQ{5c+ofBq?mRkVbP>&^=i}9T$pG9KhHhT1l${+zoHvKmpLen++6C@((2rr- z-vxk^n@ctocpW{%KK_G`vx+;?MaFV^34-bdgGycd$~ zeYHL+4mm)gyO%dr{|Mr^rVEraP>+w4u0#VMZuF@;e9&UMFzswlcHVB4%v~^OQ#q~b z3BoAgMVew5iuDV@Y%m@DKYFSqyt^}NtKTX$8ht}+K8X443#X06Pve~;y1zd360Oq^XzJMOElF3jqp^DE+R9lbl}S_+5Yc265N$lj32%q9YBH@;)ylxe2lx=)nE} z;p>UY;i@Mk-eB%67h>VoFo<&RD1Cuvbq;Z7@cKFUV%zQj{!!7I@5^7@{8C?yZ4d|T z$3cEyUD_&M1^*>`=FS>V? z?d|OBe4tE_L(M(!UO${;musy%+OMS@Gol^#KBZN1nzFF@p*u+`NtUEtz~vrr8LbLj zsug~)Dd@1h@Bp&6C|8YV|51}pEv`K>$QrhNVHk6!%kg6OkMVv21Mn~r@%DhtC9^=k z@YlB+*WE@-BJIatO?%-B^avtp^}4Fvg+tGoymwK{0oxCxNt=<^ltJ5?<#VI+3Q~srfrmNxd(KfFmXFM0AA4kH75NuuMK6a{h;r& zd&{l~!w8BSi6iGujTrV~W5-Y}g7_Kv$$dbw{W)e3S z1F^x8mcI9h&AH{H+P%yd?~yy?LT>tn0Trqp$+EnnV9@gKyy%lx^P-cjgF$Tf308!U zjPpEmoOWtLlInZC1NVR-9&DmgP^Zw=Kg3)>j@5_keN`g=4tlULAcIpG5q9%79wv4~M)W90a zOBt0@|HiDbH7;LsSqB>W0JH;cvKnP^l;zxJ(V(!>kBeya>-#t#s zmvwz_p3UHR2-&-u-IKi`NTf?DhW52XJED{TKTsf?lPZ~qWRMH7BrSZ6T_*j0OmlwlnON-=+V%8 zDCCcog5m9Jjo_&tGtBej2IT^Uy(&kzgfkn2`HmwB3L~;EJEPv5m4j`DONCyT;8pYM ztsQ7jcB(EV6zkv(5s_7t~d;E?%ah@)m9#e8+s68-m>p zS#mtUY*uH`AW++ga`9UFd2Efg9R0Lf-F3F92Bc_H2o3MCeK87ogNgjy@%vMWso|K& ztwzt|M%i_cw8vUwVJss;dHl7Is_&L1(^mnAmB<+?G3Ve6uxITIdH{RWW&c1a$)-10 z->TI(#+tmEI^^g>6J9oBoY?~{{p=WXz8PojU}xJVMPa8l9p6>gT*De~ikM%oW^+=& zJX|en(&OVH_$*nnsk-YbeRoO~eblL{8&n|vfu7n{E%K`LyS~w4@{4RegA!6jh)N|Mr z;*eg$MQQ!Zd!d0*&J`^~xUZ8a6KXgP6tJOuTCpyk`$k<@D+Y`*grx0QaJs_|_v=hK zXf#_BWa;LnXh`(haJjJ57e_}UEciDcFHSsUJ|}h0&#jLoiFVIm6d~B zLNmVo3a=rYwW?&ncI!-+b}81WHZ7y}PV^&3uL-WThQu)C?{2rIhDjy6Y*n*rm4v^c ztb*~f@$bRqff$06#+B<{KPz_?mi@LGfytCW9WJdIrMxTSeVW6S239>!6H|%7m|OQX zteKUgUm8^g!SJj$AdM5m!1CJnE%mPeqlmF@Je*hT+3yH|nOEiKnb7Mt|JU{~+fxKOaP1`7fHdy@ffD?e?ktm>zrrkTiNKZ{|7U%90y? z_!)ej8HxM(|63Dpgit;lDZ<*)>SKl|E2&XPQA5H9UY(_GA1tdD*MXr4{4$a-fI{0U zU_}3Aiu*eX;|=sx7Vp>Y8#iMHBV(YZ6)!X(8c%{tvwNBcrv{`~@^Rmn{oK;URrwx? z*^RW=B0tE#jCl+Ld+B%T8NIE{#W7VO6x?}F?k}$;zF)t*w?mliI!wjb3s{hn?r;QF z0!~zKGV*pO#!9(6kGC;MW4(X$uH6g$VKBt7QYi6T?5q&5 zu`fxkZNf!(Ci@c=nR}P+p3ieLP6qSWlSgAsUH+EF>vm=~w}&3wEW>_`3Gkcxg(QMb zm+Fog=r-k-3&C&?IcJMY`LVsOCvKJEFYs>z{IhccEmg)ioVkC)4?`Km!R#X^^3ki? z)!zA*j8|i&&rbUPQO3F9j*GZlqhsx$Ez4+}Rjs|=8$J~5eS(W+`=}XJ~`jp;%Tr9WLASpm#wrp4AZkgd$n{q-#>8 z%omaoB%dQZJE!H@-vw#M-@k$typD~Ju3A2>>hfF7+( zm%{Z5WDe$y+oO*u>7l}rU*ye|Pkj2w`ntluKYW}A%L4F)KrWu@>=El-eQzR&=1u?o z10at_Yu=eQ#9sO~1A+)buY%qwaiEz1=K@b8kHa5*ubHn7$;#&+giI&-AC@?jzVHpU zJ)6HbK}f!x@Tt~cfx|A|agyFYy^{&wbX^h{A^-lINMV7!K-5}EDO7d|LHC4pE9qso z0ME~tse|al6>?m2I%P>e$#~U}r0+D}*(_aln8cfIlzK3(|7?FOxJg2z?ksWCK~P74 zZsD;tp76~Tu-Bn^L|{4hfkC<9k30TQpvYz>&tC>W$9d)G3ZD*l9*K5|0U7(3I$lZ( zVP8n0Bdsv3n`mObujW@?5Y+jx5|KW~cI$dCy9Wfa3Nnmc$XfG)*dWaZ$d+PdtVY@3 zZE^?Z_PF`rNh*7IX@bpaI3K7QMr`uE2o^(WpGpvv*jS`xKz4O7LthG;-|scP8-+O9 z)It0uk0UuJbW*nag+7e91RB`jduF8E!9xWQ#qEW@&@6)8{%nH>iEw`)!01PIJezl) zEFgF{8ne%_{`0>mmxv|7Y#mtA+i52(<52(PL9`UTMA^3Nn+c~DH6FqmruOE?^ zce5cLp>Fuqzj!&cBTM?y1k8hYzxC>+BwiPc;xeHfR#1vng#yLE#)S zvs^tgCTl#^O>us=f&s!~)zL23xRo>P=K4L{&nOjnWvF7*9Nk2^aQ)Z(l^H5BZ_KiU z>%1Z?FawBDkmb}?sa`_Cm>`cJ_?_YJF4>A@l+u9(;pDZY;ZvuS2~Dp3H+}TLh=mud z(WtE6CG8g_;2_^BnkXp~ow^#TOKx#+JyMKtMxuc656Xn(@xOhY2_~gpv4qwQygQ}i&?98TxiLiuq<6}=oQ9EXy^5a|>ji;hCyi*W zHtRGPR=fiI96ughx#}*u=DF3!rPTUGI1Dpr{a&*Ho!Yxi4NQ3K3}JNe^A_erVeg$m zpG$g-D}@QTaYg@K>rpRs*Uh%={L8(Arfm?CXy|RDXr3oiH)X|vMly*Z?0HL$XR1=h zA$Z!wY`%vvYg)AySV<&La{d)UHu-L$LFrqyo7qIpg-;r*J5%) zfSeif@_o$Ie3YOt1XqtmKif&_A923|Enht=P(I1o1A>cAyVmA{st4$meP-trLG~+w z>U?P$iiR)k=Y;~sBze8=seF2xgyVrvP(5;XL#$`aW9cKsoZJ-GE;@HDN%fIN#na@K zECJ<9b1t%JF%}+k1$O%il;|>hEX7pex{Gn*jC!Xj^|w?zgjePBR-*ULUSE7^y~#}) zvVqe~ug8~UtGz(Wwddd1g&5b}lx=h%cUxf?(U}=uu;yKXBb$4B!LsVU1Y=>;*$Hy+YJObMO)&u-`+o(-$)$ z&u#SQ1=*!j!8%EMZYT`MHzyX#R5<>5Z=xPY$>;wA*58+4BE^N2J=`wSzPL^*`g9j* z(J@-*-lKOb$nz{Ait^dH0F>y^4r^Mh%t=X?VPAE#K57m=n)(-3N5~8RxMvhSuD*LG za46E5MzZ$I)7qnpIcZXq{?vw=+{%Z07@UEdP%zBoZhexz!F?F$aa01wwv-0ao&)L_ zC0$`aN6WMM3+6xCcfG%RG@EI51D#g;uepGPaH?9g-z64izlIxPv?Z8E!8zqM#i90Y@0`cN|%d5Mm= z8F`jxYT?VB+JbEsbL$q_k60X12_ANk0Crm)znxBZdQ};8H$^xz=W69XPtbsWb*a)d zO#=(|32Ibvlip2xaLXa~g~6vA?-!g(1>BqZ2E)^J;d_xt2)LKo8t0yVp zSKepWh$*B#ReqX<-Ww|(t)%nLY zwg6fb4kD~-iHNVWnziFfZloStAOwe!fIa9b&-XvysxKB9X(lkK2|bj)ez*3 zgO`f*u)N;+*BrJlK1l^S3iC|v(CwJpi^2;xxw@f*^*i8QqZg+JsPhrA-|BBn_S~J4 z0ATOkm>hlMb{v*uP@YHCwa=PGegVo^l+s8>ZV{gyeJ;+Z4^II?SO$)zps#F%onY3L z3Q)U@i#>9B0Y{y*06hDr8vzw!nBeXh`{TxuP?qWUf4DjI>^X{+0Rb%8|5{cb5Zwp$ zq~3VAfsuxb46jq0_DBC<^ZYj#XnyYP4s{qk__g%$lVzIi#2N+tk1uD;?%!Kl{=sZ-^l_F?DQ4J=< z0=~9UFST3tjLVK<&_==i{I>2@&NQzkLeB_@wCR$7&G8 zp0>22`}b^&V^#YJ6!lF5DFbbUi3Nq^D>yWODxd#E7DRKyFOOIBdxdq5DO+y#b3@%#aB*S96uf^Gy9F*gyGKSk$Ox|@6L z@-1GfX4kq=+*@lu6r>zKy3-ZBV|lH}|G}gbh-ZR!MrFg>*6_R(=5S^C`4$`N?v~yK zvUNX5Ow}*{Z-)LO1PFPQx1w>vY~_A@=Y+aXqI*T& zqszXN;H$W|lNNZflQkfzBYZgc7&gI>oq{B-P+IoTxb$6|V?iD$d@MMu+#gL1tT%9` zm7;h5>Z@PJ_2E|(&{CBB@~#?!qJrJpRjCP!3Aw)l>s)!eTcVfRnc=odv}wz` zL$aQNLL{!~wpglr{+^u)Ixdl#y*h$B(iTh7&wIjMWWLZ?0O_%@#hw2|zymOY7ZmDj zn@SM>xBMIy*w!yo`P|%#F|18OS=?xqSpqZ~J00-SaIo*lK|XItu_WOv?2xEjeD%YO zH*j|o5H9)V*Ucl%Z$X7(g8t3%*J21yrDy{P-WyhvzKW++wCWxqX+tQ*f?(eXx0ubA zL<7_)Y7{~cw}rCxMxdaJS~^?c3g;XX*@>h0-4AX~gmHhb@zm&iDdCB<3%*dBgxX&R zTS=^JKx${*H)<0_TCKJBTTJzV4Rvy)Dw$6I(a$dqa?OA>ETH}^y_Qy&UfPTnY|lPD zYC=?ti^)l`AIyW2;+w@6|>?1}rKY@g1 zVay%(OL3}!a&1Y%Clj=wL?3f6&&$zFe$IOpyzqXid%n@}pYHitt?g1}c5(ar0iZ3E z0R&$*CWqoys9vg$My6_TaMxk9JW~d-I$({(4@pggYLtZ!ImIpLUjY5tTo9%wL^~1N zaELo03><3eJxfC4G6|kL7k|&;>`U=$4O;i1t0#^E;;)PbuOoGX$ z)fJSM{>bNvg-_|gxojK?{|V4Bb(j;YrcJ0<@$MjL?JI1jGS#gF|6<05o|;*wnXLc0 z#eMMGF1jz;tpNq|FZFu3$3NqQXu}6)4udt{!Th+O*U=$b44mlCh zqu!$!F}{kMl#A}v6}BS;(p(jpqmH# z7tL+2vYNyQ0Z!bw82+~d^sF!bb`u6&tWm4zuZnPGZ>J0yD6(i*XP3hmALIP=&_^fz z3>r5(R@(C>^LfApoxuO-s|)?zplyx2M2B8eO4*+s! z)I?*-hIX_zF4ak$+1Psm!DaeZ)7f2?fs5>o*S^YmfrYA^4_HV)P*mL(9$uNl(Fj-P z@(efx71Odm|Jf+fK>$JICe+bAR%W4Hr84#ci>)m+k9K+;BjI)94dZ{+)%~b-^*P&| zuKCmiljafp0F**zt9Hm}?LOwYh=u@f^zKl5(ys2#^Y%7JaIZ3p`l^uKy9c-|yrWHg z3b2bTk+{4YY5fz_TR9Q3%GB`;1j3DmmihRe3gpP^FkaTE_v+^kw6vn z)l26?FpvEl6TTk5I~_p^1=^MIf_+4MusIv#Z3{?oU*E8QP*5S&J}+{7bUS8QwgvWz zGu*X_dz;40E*mGda`|*@ni=%fV({*q?DvMxoXVk-TOd@LBE}?Q?<8mb2h}}yo;oZ| z>qt1ce;cBdL9(v>fiy${QWnx|_%y5K%%LM6A9VVWka)e`hU6~~2Iax2nzAC943=c0 z%xO)P6!FXgp9NlU`dxzOD)r0*3%k)@`gzhH{e14LT~KqoDTiX-6$I^g4HknRH;Nh_ z$S&kLulpLEr+xRQi9B>sKmOXGh1!hEHzzt`6n9^~nX&)=XIG}|HO0anKfB2Y+T7HE z$(41QSgcRe+u4G^>iy$^GuJqyc8pW<{nR!qHI^QqEXE)2Aw|L$Ar?tkhubJEZ=7R zL_iLx#xuWtCfrv{TI~KR(8Htrs_8X~V4`$p-TT+OMX#R~PEV}z%H=s!PSae4v?j)6 z$w|g+pAoDi`Lgei2g+ut&0ZZmzvq{61>3-*4N{&oEic9N$BbLImNun3I~Mt>vpRq7 z0Sw$@xxyn+eN4VJs(w3c)pd(BTF%=SNEe7#0^cCC>=QW}mFlJXBD7y$#AVn(E;2ku z4%PZnqdU~Z`WGoZv`*;W`yNm7AM2bW3Z&3HU6wwQT9y&%=Dc_Bg^E*mXBMd*ASa)X z)W;&4xJLE-;O^~0sjTvx9xK|Gd2i{F*IGfB&eCx%j3~muXrW)@06MnNGym?Z69S+c z`9zIOVpm`SnfpmxFYG(AgY9&pggMef=XplaYX!L*Kf#W#n+QWcDBZQpZFPVG{KMI= zYmoi$xYQUg!7PQq3`+*@I`vqNd`hI}i%LYQDD4fCu^nc=WV7Kzl;3ACFyeayV zXEn8z$oMC)P9QJ4_Z`@nwShl4Rx>=a2QcL|$plmap=Z7VMDJ$9uIJ|<~;2uU{ z{Sb~Ga5oApvthE~uYP=R$^B%6=JQ2OugWi&U;HiL^8gIsc=dp;W+W9;dc4U+#APjs zd<2ycP+@|;ypuI;xHE|uWQWMBb>w58-kvo*V&|DxHm;@SolfPis4V>^V}FE&g5`sB z_w5gJ#gwm+Nq*e-(|nf(e&@5euILeJ5}B8~p-YIp0s@=9boI2?$vS^TT@~dMuiB9T zD=^+?eZo}Q1irXUN*-dE?Wrw8f>(*Fd0#eTB#8elvi?MKZSMaXS?9I6@p1EU3X%uD z+kfhYGrs{AMfJ^78~fh5<4MY{0}dB}lVXC^EhV+}{s9Od8S&%$RHDCainPcS$hDOAa9=+>$kMf1~oc(mg{% z`}^;6Zb^75Pq5lEaTfz3cBxx0e>vy8Cu15xnr?(4LPuw=9J}3vSYw0iTeDiA!q!?KY*wZq#_yOK~EwdU}5+OF1{cQGIqROf8 z@@ObB@&ZVadMoHfD&<4bdIQ8R{SDN0^|lwTw<370hn>ENr?;0JNfG|W#Fv2BmY)Yj*bF-$z^lvhBH61{1>Nm3 z00}nUO~Y@ zllapyqL&eyaOMk-m;9;gQp8&FLVmH3#f#mxWclF6f}ROim-cVw0sGoIbM|kAk}6bh za!^|&WsN;CBTb^GcPcHFWj1M5-uz@i^YQrD#EU0E z=dqg<1u`5doKu*;(>TkHWz()~w$AWe|2CB?_(O>@8;t9b%3d{_Cs#;0-u%HEXnRfG zH?MY3Xy(DY0fdk8=Jxldy{*^z%_l1WFNq|jJuBf3fK*&F?+Z&*@Pn{3q(e7+G^uT1F}2{7>!lRJS#6` z^`GQ=pK%fRhp(xqm#ec3Bb2P5H~5fcDR?6LNv`RDYj0v?h5b}NFw?SrNJMqxB1@6S zMM-~$h2JtxME&$@N~FvB{u*Jc=D*i0 z3^q9aDCqNB7B|e=y`84FClul`uD9Mo@Si--(Qb|_!_Ls}YI@8kL|kbocT=u9Von5( zTE{bcU(KHme%UyWZRM9dxev`0{P72?N7uPh>+7aqPm;P3^NJ93GrJUpPS4;!x*LZn zn3+mt_QsFJ8n!;?46-}>_3(ts)d$L+Ti7}BaljUzl^tHTCmz?2jNPdLgpfHEo@Z#Evdxu6<+Nw^)S|4%qDGDExmxkiYIccFf}TR#0^yh2OF8d`)KPL@)-nlx zc06?#(zw?cUDyX4O%Vu0&LrSXRPU z@dQ-nx%=+dWf^@)qJUPCvDzlD%x~-dR-IeQ8YavuRE9*Je9`&61f59`DI zs{M^6+_`Y7Q@^hp_5#+RQ!vb^q(2La>iWw$f48PD*t8I1d+}8<@Ciy}U@9S;bIf>J)ti?GRvDtv|CWB^F3YBrMaq@jFP2MK9?t={M}qN# zZEjGCYG{6PgsVb1V6P!NzAQa-+U*^+LE^AlnutjzI-7ZIsqcB&m@4sbyM($u*O@Qg zflggJ%vXy{N14}j#;W{*=+T|F4>G~Yz@)ver|&gA>t~k!(_UAoMJn-zAbr--jc!8_ z7HV?C2A#tlj4RqFMNkjxA0g9 z@wka6kauCiSZ<~8f;=MCP27xXj99q0%4{njr{KGWO~8RyBC#*>%d~6CA9K4aDJFA8 z+T%UJifj*7rgVrYrC-aLw#;cq@y{r72?mn$8EDjCnBg2Bz_D6@FyD~X2Vi)tyO*00 zb^p7}+Tsr#m&+=Olg4Eq-iCL68(+oxE7eh6OW`=6Ga_nw5m3i|;#Wx-Dn*CMH|jtQ z3+~>2E1oH>Qg`Q&?W;a6j&@hz9vCt4zSg@#Xi6-beNG7csD2{&a$f9sl|9j1*#p6G zRCmu`O{-{B3KduTo$8wJ3u_%cG^77FNdNj&Q!=-8Ex0>6$$ZhaQ|Bg{l(0Y|$y=u> zuvRA@g`TW>4v_k$^QxYg$xFuc&*>XDV@rLC+++Ou2Dzrv0sfIlxjB^!`4{%TdqPh> zvcqHfL4|V{YUw?Nb+#vvsxzK3!HO$~o{Tk8sUMDU!y3{*7tNLw02^78Oar%}nhqyT z*LA41)h;SRzo}yuUH!F&uW`Aaq$UoH)w3AghfyWvTL}>#Hoko*nNF4Hxz@+$_4_0t zaOc*$t#oP3`OY%T;6mKzoBSBk-Xf2m>XkI23<1FrCa}CZeWYL3D)9bRSEiiMJKLm4 zL5R+KFQb&i&__L&U>sj!ET4l(mr{K|X}M!NeUB1m%@ahbfG2aIk{Kj$?l>~PuHmSCs5zNob#J2Yck3&7hl$v zr_^PIZ}MEUrjf9u&GcsuGKK)?+<^N&yvklap8AyI(yc_>caP1`0dR~B~OuD zjbRyB)e@{eA!`7MkAvW6+&1hd98XbW>`$)a?+e)O&9de2>C(0-w(aJZAr_<~oB4E;71?jyO^z)jGUE;slUEdk694!RQMV14^>X-nSOfpp}zpc|SleD#p` z15WT?y&&~KEE^znI=CD1NME_UM|W@lsbGTrv;a=x>}VcDD*csXFX$}ER9cLiqvk`K z=txw8Zk+XZkNqFv{O}*)9O-cv0&T&;xnKFP7;ej}@GCely#&>sV50Lg***{PX}tek zujTI?s?{QHRLa*65Vv^wBQ@r60;=)z%INN`1_Ohast>CwYd9!p&h2=7(|k)iWFCg) zvCuH=Rn2DdKeZ>7Lk)%@MFwX(_DKU8x4~H%q){jMWko|A4{st{z2IJ;kpdL50!J85 zLtZ?5cE^|O4n`9p^IL9XxkY17mFhWsmbcX5_H6xy8Oj@3%6_ml!(MP-`|gFSakYv# zKlJWOZH?zo)i)dSuVN|Pei<+H4LM((GLQSTn3`nY3m zdv;Xu{P0c3?SiH3p}iF;$_o7m_H3k5kyn~Q6!(Wui)NX@2~`YFxTm`hv*Wz&bKaD^iFcGadZy`Y^Ea~v`c*6NmLyKR)@^~4y43f^MqE5N=P0C4WZhET+y*rZ~xZL zLH}syNQ3l;kY&J4vyF7YmwWbZc;^B;wAM!=2y=|ARtPODo|b7v1jS12y8H%QT3Q9Zln%u%-#)lobZ!} z$^bkzq&uqzJ}nSotw>8T9Ud%QS?3tbw8|lT>tHvvY~^<1_+hz>Pi*5b!1EU1i5lHG zBnGw<;xKU~dN9SP;BQDiqVKCE?6;g|!TwmKfjuiwZbJJIN!SYr)zH>154ypxYzIp6 z*mG8#G@xyX(19DAcOVRK(qWe$R4Ogj@wU>%i`#qsOq!G>iqgbbmS}M)M$RE(@|3Q% zjGc+toG$FWAqSM*!8krOuM&jGu0B{t2dEig&%O|80&(V9b z(LiVGI(^Xw+RpcxO(-G#?^}DOS+G;?7gZLNUu}x!-Ro&hp088@Xuu29_)dEqn-KR~ z28rmvlLh_9d;3;AJs%Mp+q?g?0FV@C!h2UKA5s~`S8o7w!=sY+AbO%K+@?IZqu2Aa z`?aBdCBpj)&wjxmiMBNSP^7?WfHcd^O;C(Y$-s) z@aSXB8l+5dDKuA|lKQh`Uny?X2d%ebznIWQA#MVP8deFaV z`E9YQyHpQCiB6Xaq4LCXOx=^6RM?*P?zPkXfCNV~QV*j|`-TAJUlW~N-H7bIF0 zaowg*<<8qCnwQlrYDhKQY?b&kKJGhj;p=p(47Aw+A{2-a`hjlP-X@S9r~PVzSjESo z;_xx!orSm6Vvp#$vxj)#X+f@>)Ba2D_j#oVLn;4XJ@fXH;N8%zhq)}2v(%Bdu|z*= z$&)%ge)^Lt?LW)oK1gl>=&P0smWM6;ms|((;{ljYg!DYR-S9H-oDz88m>v>b*)%w2 zLV?NNrG4}zWVyU~_LPmsyq@^+{zK~X@;=P1f}_%c`bq=+@nR`y@Pp}UOL=K<0&Ye1 zyhPwTH@lg30zM3GUhqK`0wIhoZIe-QIT0?S}} zc9!}f*52S_l2+@wqhZ%{hu>%RxWVqsO_l=~;o&yqf-b*Y!*L&%glK}S<~mvSnmBQB z;x^C0>$0~6W%kF9>DP9FvKnF5{+-7i^l?=|LDuJWER-~S-CM5QrNVMAlB+o4rrRCdYenj4jPWA74&2fy_#_JsK&WYarWQ$_I>~eMCyBM)4z@> zKwxJ!x%8NkP5)TtafF}ei}W?BoRtW#x;-BN@N)>XF$tHR^cI|5To%wpazudM)$Aaj zrkM`}gsq8rKPsR4r8unLXvC>~hqU^^ZE-90{_OO#(S!CELZc|TE6RDGV?Nj7ktBH5 z;++neHKK=Bhvm&}B?4a*{uzY5LN1*i0zU%#%a@=<|2;pxU=K;idS16tOdJ%fK+n(^ zctTf+>Alni@&e0%bb#CxPUj|xt2-)VSwiWU^?ny2^s!8Hr6=}*qkZ3ANM<&8ClpbB91j)yCJb!Yet*n!JOlJ`*W|H9j8Q*dDSyC@H% z9z|Z@=)>vgPzT7e?RjnY6IE$uhXV7*( zXzz*ss#2nru>+#|hAri5Nxu-0YzDWt$V&TDylJCTgp=#}H`Tn}*jAk}^Hd!{ zgxAwq)9*gHc^l$td2=!D%qHlCE_B712dk7RoOfm2klzC2B*$>biGJzU&to}31B1MX zT;GuJ&&MV){+>3pm|C$d2M#>1wLb8^bysN^I1;F1zxXvFSvcnNxS90janwvOSs;)l z5m0@7s#!TdsUsKo2o69`kBZ&JiUw6r_>YC&=9 zI+RHdAYj;D?$ywT$4BUFe2NS1@wO;aOzo3G^7aaV|H#jR+=L5HVyOeo1jFpE<^*rj z{oV7!q;jQd%>XrxK<0IU9Ws?TU7kJo;F6WOJgTg$bZXg4#VrLXb0h&=LiiX}e~@Lj zP<6c zx^V^H$Kj6e{at0hh>eJfh$A(33wUQ%K%b4sl&K^mUf%561GsNf?%3!u@v|q|U0emk zW|p=q$@KFlN8b*t11-e6E=5IbO}1cOj8|A42}<_(oO(}e6a{c{ANOSBpMQ>fV?kc3 zjm`COu>KK^Zgw8D7Rf4&rFs;m8QX{+QF-g}ih) zjxxI{Ui~Bjk%Ei^ZKIS8e_`7q#RACM!hIBIwQK@<#vu8KS=BmXP*(WF|E6o=j`24Z!79O3GRRS#cGm`fgmnq)aA-J zGU69{r*bjjN`OSTQn%uPT(0jlCM7t>i`0V?@77-3-Fi%Cd~!17hn`4s;7dbZtnP>1 z$3)hrc1d;N2Nah0574;wY{K1AZk_LzLr#WQR$W1P&5^f#@`kKtpW>YwcET`xNCjT& zYdkyk;(Ut62+SywV3^AGB-C*gcN5S0zDnk2J*E#AcU(1S(mPN)?Y13c*%65E$r9oH z^8DS)=JZQW$j_*>lknYcL-DvT-y%@_Ppoq|)}&xv=z;Y_+;#l51#wq}U23tau}-8; zH@P(`($hn_J-~VRWEpP#==He`wc;0uS#_>g%N-lU3KMD)T9NmZ5UzfAU)>(#FV>E} zEmCBqawyK|`Hsc4%A}b+){2ogh^Y+noeM|%HAjD5VlB#=PsmM;_eP<#9FA5D*0I%m zeEz1UHbgX#%}r#7aOPBqbsJMEROs?4R%W-eKdvtELIyOnw8eqcT+VL>DMy`mN5XcN zoBi;x@l;j9BI)mrxx#^CPSTz4O<=59nl<<;tUA);lFsh837PR~#aR18gLB`JpWVE*e0 z`C0NIzz~MvlrWbS>76BY)cVcWF?Px6N}9(gV#=vt39z3--&@5{5_^aN?*<;r{_)J0 z>mf3ubWFajb&d4RWNtgF8Q9cuUJA@V`?;5=>NR)5*9Y^)=Sk|i>nab?{kEsGEt{4C zZy@0K?&@39CQ)U;f|I)oy$b2eF#>dd!(fw(x*U$#f)i1;T;Q&rQ&J*l{Hc|}x4K1yINcjdH+V|75Xdi&MlbTU+oqCLk?UahvtK;t-YVP$5 z&4IX${R1vJHz@A}b=HuUvfJx2C0Rdh6I=PfY1d->D&L5|uOKr2aN&Mq3ic3x?l;Vp z%4VaD63wcq^02%dJ61%()j-^%^9T54%H&{){->Xf%ncrN#0A!>bWB_|YV9g|-YdBh zPUAbOcPhg(wmUa#-EELUr}T|CItQf{LLz3;JNv3}ZnT+4pOVx?1V#KpWT#|B-X3Jy z2FpRS311h)UH2b*lWgnHg_hLpYB+i02#ys4_bK5k+BJ;z`1Lb_|KsmQlJz8|L zJeyVTg5935#*mzSbgnYK5;HtuC8^#tm{g{hbLK+MS%b~3AZ9c%uJztV zmPlKL$7+?Iyqif^VuhXXdj_+7KleUnKy_y~o^N5`0t6~}-b7RH! z$UyJv1N!Jg&#i|f_|;#>w>};6+<%YU3tYbHsB)8mQ^m$Af63FsHFw#(ErGImo6)MM zSx92O%~$)Kq>}_ZTfH_}NoXVAXpFEN!dy9CJeK3Dl5L8a3bqu39KQcjeSU0!Qa=^3 zov(KH3OU2s53J)_910^lwBGv!5H(m+=Jj?|I^LwP+NG*L8*Vz)?V}%l2%=Gta!4`D1A8z-j`hFri|jzw{kfepMzgyEQqz8~ zHlY$6W2nI1vV}n@Ie6E95*|I zr4E-;j*6fRD6NTB9j&}C;KJXo91=896fEjnmxY}(b_L(uz#Mtx;*77xAO>HgE&Nf= zAGFwb?e`6dL;9j7$omhMuRf8faK4&zzr8<=1Uaa*-|{P*wt@02ob%%O!^_FZzJSIP zR~D|Jqnd9FMZG$KKao2kc`a>UK6Q6?r5C(^!jhWbBJVEOAUAc0|Iyzg?TcDw2vLIa zNul;BRtAs0`>z{qpM*0Of@E}@Ax9w)NY5(!hqaX+vc4cbgvA5GMST_C@zs*1!mL!w zcIW!rOcQ<0+N6$NBviNY?Vs9U49yarw^y;*~N4mBuI`v4*4`6zvnF#Y;3!WUYLpz(#JBP0Q z;pIGq|HR8-xMfV0I4giG*H9LEFic)BnpUAa;CJx8UJFJZFD<@{%U@aHZ^+9>66QMzokc> zDOu}92J_kN6{xYX@itu@NynJ3=inDzOoSL3^n?LB?ic$kr7MnF9}-yDa7=-2o-e(i zwF28lbD18{cgppa0EQ3B+YiqL+_+gLJ)cAiuO}7$d`_>Q<$3cIetaHYo<{Dal*_TT z2*b6f*YD4Q77Hkgldk1%**$~@Pp56$j}GHHD`3wWFtQa&xZ3T-g4dXA(o=Xrm+o%b zdlHIAd-+}!ghJ1?Ct|{P6JemY?2ok9n^q~UW2Vu$1ayA3_Rq9lR?S>wYhlh4X(AHGFjF$B?bJb_2X-Hp09VWurkedMeve`(0c6N%-ro!{86 zJgnO|iMD(X1%E0Vf@jeEa}daD#hc_yAut^n=-fAo>d<2}ASGGjt|PqS$T+^DcfWQv z5R!;y>wv}o+zq4;lp8`X$O>t%zCjv}U_RQ!vS!j>%%8qs5q6AFiThH>?5K!~Om2x^S_cF2@Umji%?*@^3>l#&WzS8m*2tm;LypFLlgx7l zp_0Rcqcs4&zJIvf5ShY4owE^S zW@#0T{ifVYo&##ii%y?T{}8U9jlm8)GVT!a4gL7c)B zY~aYC(|{AC-q2MNf1NgWS7f!>aQ0+(fIQ|UDVk3{H;K3=uK|{Cdc1c(>jO@TK2;9y z7Ez3{PTxEALOZPz2m_EB8xtEW?R|?>NEHa*crIIF9MYI~jQ5^a5ap{hc!?L_{d4t} zK2tT3!@|FFjEo`+$`w8rZ=i&04()vQAgAm2`F3E&QBKPatXBLxVf{-$l^lWVq{k>f z;ynY%l~|Li<^=smw$}~qzkyYg(dkT^rf-pO7!(~thjKUeV4yN=z&A12_JXEzwF@{S zETn<0TW($nSxu>PMh7kx{ifw2I>(q{j%-&_m!DDDi2Ht6tklD2YaPfFgI~mRq_;gQ z%8n_l)vw6Unq+k!fBz(6;)mOWTzcfF@PH_Cde}XdXD)xWo@o=qIjsTcm9P0`>3_E_ zKvm9Tf0;b-fR}c;yLEO$hjv`E*|5}hk%K=)7W=waSztrjzvnkDuU_kxdPLeMG*ic| z9_D%)Fj6?Fk3HaSoSBL5bxI|p=dV|GECcOH?kdC?3Dwf+z*dTX1cc$YgzhXv;lNw) z6hKVv?O#FJ=R!ppcL3?DWnzB#;4(2av+r57H;V;CQRIm(G3`K5#pbHgJH3nw1uS;2 z&9F?x%uT1^>u5~}?vy-G)6}?&07qw7X(MOg{qrm+#e(J`C;#qg>Q6)U3*e2dp2V)F ziYe(B8xUXEqvhRYvgDlMB})9W&6iTQ%Oi%yw~qqEaWj&=J6W8)HRVl|HlSHfZ{YfV z3MGY6d~Y;=Z8$-g&NTxt$YVz86t>(zo(h?FedI5Z(n8hKjXk=10ftE<^nz*qwB9O| z_sP!V!ai#AX7pNi?ho-O28UVmhb*RF-fHqOU29t6dX~BrLb9OF4r?KC^`zT%f_)h` z^)KjsNNyi0i!U$NV-}q=FBBHt?NL^hnO4*(``RCPm;*-5=B`yWh)(+j{Y)y9p3J!R z4Ag#WN(O@SQaow|kB!SC9w_L!QpqT#i0K$vWyd4R3U_b%fGjz71sl;NGOd9OB$~IlJ=zmJ)#_8=}LpHYy`eWqs zSQ1S?sgib2cuMA*U$AReIrMS%gm%6oPB^FcYkPHFtt(Emj6qr9USxD2({xwYhFvFVKsf&UsjOc=sY0!|0C4C8}I_g_S28;llh1$ot+;) zVCM(><$57?a0nxSbX(CbI{L%v^*zhdh0BJ%6Ikv}1;}N206g*x8gcj4_x%^}>Qos( z+3r<|p}fc*Yfr){o~b&g8L??$L3|+LZGo{o1UK(w5+JmOdn;^&+*W_*YO`?kulaIA z=wuNf^(8^RqYU%G>3r|*GIvwbv)>B3Nljk)N{(!cPtaWV0DZz7P7=Ato_XTgcy@uU zhRpk?Rg^E%mU#{J0d0Fdx`>V_HHF2zP}XBBy}Y(&^ab-3>Zgc>`V{Hk=v>EF|BU7u z@@^~FRjHKloE}9&#OFj{G5wyeIbrg{Yo{rldd?`;d(uq3!6EUYD6~gOi>R>#!dRc1 zlP%{H@$E>cnd+Fh`N{_8b9cVaoRd^7(_w!2dAJe9<@V!3W^*Kh@iRG?f?XKIHu6tLxGY zcBNaJ%^TjC$b!YFJcsc`E(1m|p@twI>^O@tZWU5F*~SF}_3fy5ebb^PJA) zR>WAzp>8SL*-C8@)i2vOl;Xw4u}cv@uCombD~zaHEgU|u(R1+Dvv04I$4NmdS(S=N z@1%q_0>U7v2g~M33O8IHl&`KT{!F$%jIQmuegsV2T1u-Kzp_)sQ|d#sA#_paSpEY^ zkG*6|G`nK1wq)M0U`e6A!2~K1i)ee5Q$fXtx{_TUoUV;ABFc9^k`Ac7K-p8SC)#mx z9z#|`LF&n0y4TtUi|1X`%5zse9DQ+KCo2YDW^)~_C%PkFw8~Mm)QpEy*&D&bODooy z1D)(06EdiK4N~8Q8}0i7K?`5K_6sE+m0PeD3FdI-2E5>UNKB&b)&$~&3Ej&eD4REE z7EYS?P=AgjK`aXJ!8!s!9Znx%q|C+nocCi_BtMoJI&SX0y;|SaFY1Je@?5)k5)4vp zcQPl=C1C&NqR&W+#Q6Cgp>%4r3IYU#ECKhvx4~4xX)XVkfO|laQg091OrXNuUv7J6`UzveSRH`JD?W0W>S#FYkph|U zxp>tDed4ws@l_+dixoffk6rT+N*m-s#jw)DAM<^)+Y@@dv%LRqn*R>C4@|N`Z3Au} zfOLg3M@i2E-svHdXv@83DURM(z!2>nA8BG3GoHL(A~?ANK;R!L?s%1OdGI7gm|+WR zx9K4L;s@Do-sXvBJA&N%6*7OOdi8mq35?YR0iiSDx9{1h(4){thv@)={;$rTzxK@Rebm7t*yl{a_&=kE`%wod*;)(D+Fl zUmh)77|gMn=Q)zE{w8YYBjiLM8~iCB48pqDqx48Hqch3;r|((yV<3C~K)>(`kno*U ze)$#{X<_1MrlR5Jm<8S?vRoINGRA}1mjd5tKF$Qrl-r;L?CC?UYIObaT@(`93vHGgiT0-mWrRQb4L`iwIG;c%gcbl zF&G$0cc%daOTchU({juv%$VIBHTfGbG~*ZZZ7DJZ%{fV)yZdEianM9kQ6J}MSrm+N zmiawHN#3!g^235@o=YuOQSXQ&>h7eqE%wB7y;zVS=to?-;Jw3*a-iFD|GWMNdQBAQambU1W1J$3A<324|B!$S?eCI zn%86oSAS^Ydd@{Y7YSSo^&}mBE7{weKvw>ge1R`pAt!U0Z;O(?yy&tP{p*5bce!i& z*0l|7h!;#skWtcnWbz{Oprvo{0Eg&9rQIw~Z1hyD#=M2ZZUATSuEH`t8{k zq3$R7IV6n?Q{QGGl(vq+>QC77#9;aV{>XU`hZ07zRyJm=)_b9rVh~4JE~+Fg&DLgr zkimDIo@jCyZCMisy8WCyo&MTp(1FVWp<2nYsq8MF9F;_Icue(3hO}<-z3w2psrW&9 zzS>y;1{`eVE2ujDgc$1BnKmwShD}w*KON;O&6}sH6YuPv*AIg*rR9V>K2&zb z1Dqa18QU%d+YMam=6&+6uLcwO8F2jtbCEylIIEn!K^F|zMnMc6A`1a$)i9F`Y*X_kx4rq6%bwi2Jxl`#Q#9W^N+25zKfR z)G8(-OziRDQR&}LF#iw4^Soo&yzc*>iswyZ@UYi0YA4kPZzskbR$cW|xO$D;)I(Tb z6TQJ>q?0jjJXV3}6f(Ws^)!pqszg+OdASgDedk2D-NqKjgRS8tpEku{id2C5Fkd|=yP7KpL*-bG zffv=28qT;{8@t4n7qsoy!^0X%6oV55Ng=}vvd1|8dEiRTlEpgfx*8ntBEgGi?%Z_W zzq#hyf+Qw~t0kpHs?#(f5N;+}zHjo!!gIG0J+%)3!An!56a>Y8*gxuGGW^atA0`S^ zh5dM;=AN9c9OJGI_Hg*MNY@?RIh}^&?!L%wYb4WxMy{$u9T{1gcU^bVH6R~K zds3{Q(N%LJa%lm!=Or?OJiX(gwHZ0=IaG_L19i`g#OI4~hrPcKDV2!|Ih;(h%5)R@ zEt7u@s44`wf zGAuyl8S$L&;IEzS<_cwWE6Rniju=dMI&-Af-AQn@;kupg1oWt|XXMCDZS)sK2SPww z&$Ucs(`EhstemGbt{$wMvlw(^^4$AA==^TATj=$Lj{s!6KBU&HE86qIFNF-$r8Sim zsSULr)v5g#*L=hnbK$pb&i_wL{U1x`|IeAa%KUPQu}ER{k-PJ}LcHSm&@39#578@h z>TY$FIQW4CtD4GDGUd)G@X7QEw(_N#9<?Rl}Ju-P=ekF!ntkbq%y3o|G+gjLzK%zY_vc@>van2 zk2QwR#vat#;U!(8mj1gGb*!x)y3lmOUja_qJZnz0o3a0eZMD;h-%Y!J@AFdWH^RFjjvz&3!)2hPmjJC?OWbdN_hFJFIx(!RC zWY@n`b6sc@;wpMPho{IJ*KjF1%~zT^#k}^mCS<`xz~@w{N!n?AVX_6jKnH{*BC5|= z=VW8dCi*))z?D>buH7I=(coc1R+5HVOB&-=ASAx%%{Jq3;kxJADQU8dVQq@Ns%$mG zi1Z^q&dbK+NDfRak)FPPo^x2ji~}8X?xF1y2+2S-%Dg=`^iQt6gb=#Z>F)u0J}U+G zN{xw8n6>^IpBQJM6U1oG^7@$PE~mePjD}r%AW&G=!P@k0N(2O*Z6V5 zGH&Rxk+4DLSDFK3T^{y$#|rzEN;N|p5yzhB^#8K> zFeq@4ZP)n{3ed*UtL?mR7dr}bK8fyayv*)dEMcEXM)yLBrHW6%@j?@C$U6_xTK?{w z&p<>^!-G+^CInR7y}k0mp!r4hYsgPMNdFIRzx*5Dl6Nf-lYRjO<&-Rd_Xd=hCKPiP z(s#Wkr!9>?ZA)&fj^Nt1mmth;9(Eb-^*8B!u{Ek$skHi#q1(L2DNSYeOMokm_4cd$ zH9h|#4BsJcFEAM_WaBj%13qvx}) z4X)E

  • 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

    jsl+k)((!Sv09KI@m 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 z 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

    I z`o;r_+4nQTG_)j*=cy~&9VVQvUGJ4|68?T@C6MWLfnr1#pO5bkMU>atHxl{wXvya> zn^=tNUh}P3T-deGDJ3()$V~}Q=1h(+Wd5MJ9>R}24f0Dd9qN-jf}Yu#Mr(UBpWD1X zV}5x%(J!>L`?RCOTh5pAI~{lL*s^K#xn``le3{?K}KccOU>*w%iK z95!KjYuCbzy=7&yivOeVg@Y;~zS`{3kzgZD*t!U@h3Sy*%O89m|A`>n?C?d zUOOP`hk9^&tvP=DhewS8W{FF4;cgBZRVO3qvmht@R#i2-NE14|Bh9V#7*~X3;U4P+RSGyQ{S`f9|mws)+ z6<@?H(QxrCf^f-5XI1OQscJ(#p$MBVDXWc2*4LhYs*W4GXu_gBGj~5uz&5+c*O-FQ z?=|`>c^c1c*k9TrO8}cJ#y!jWBAaHQ$U*g@%mwWoVk~h@ zjhOc(%66Vyz{#@nZvrAB29Ge(^O6_e={>K9LB`!DR?y*sQ>*0wfd_uax!dR74@MQ% zG_`;nVBR(s*8=|7>cJ8F8SB>&8y{pmwui~#!P1vz7&;dj#J}RzIqS}I2YR!}DO_F9 ztM`Cod0p_WW0FKoYd2X0p>6z51TGr1EJ3!8Evju^M{G?8yLHd9Pwoq+ZQdoF0*HJU zq%2-NdJz{!VrstPZwDikaR%rrfLVpRu}YKLO{NNt$bpT zvciD1``Q|RKsqv-F*$#Y*_dSbZpEvF(6i)S0Q@4Xnc-EmMC@i_?A)V~Zu8sjuJh=u zhTLf@Ck}k8Z@Hs;Y8jBYD*(qAp4Oy@>OVUW=r75TWw1El) z)gem+PFX*UZBlDV-n*gz&;NZrja|oZE^({Jup!&yVG4TpjV=27s>KE28VggmrQR6? zv2Pr4;VaG9?SQHHE+$t@nRcXI)x&dokU_Q0Z}e&Dolb8DNb`+lzYT#ne?NohwB?*Z zbfM56ZCyW*?~7AJ$;K3bTN)KC#gdh<>_+P+u_EL!uzvIdUc*QBp;oDB03I}N*eID4PwlRqOyk*Zwg%Z5T=;xI3<15I^hR}r9UmJm#ntQyHb)_Q^LBF z{nib2qwl6jOfbVoTGTZPN@u=5;fymXnTE6JtyD*(fqWz=wfDLBsGx^3ZO!ngzE4HT zYNat>!`6Th#K2X{81?ZIajvAkNFfb+`t`80KmC3_K-^9KcnCix#XMma(;IT+JK$@P z#yB*-;2H^_f1|R&o0>w#$hyNE!3M+`r?KTYzzclm2|}k9x+Ykh!=9Ew<3!2KxVZAH zsSR@9vEAC5a4{`AlK^JD3qFYOtLS8#ZueEvlCmJ8TgxpV!OxFH!2Y5L*~k84a9@sV zhZKf>SmihtkuK&DggLYR7|KNtwX3H%>y!Z)3PXpogi)OJROoCde#D6Fnf;eKU=n#{ zC@MvSlM;I`#fOw{9J`&BzfiIl(_A^>eY`{HUN)9#OI}*~TyT9bU~2qLN0i4iBuiE& z_;9c=H*WVpMi_2kG5sGa=>+PA+yj&CcycX2qkn0C&kFznAH82lA%dq)yab z!)TI)$hKi1-?tP#WUCA9v1>pzm%Z7@C2bQ-Hn-4EbhLv^koeM&7f;KS`-O49hq5!# z6nDKvqzoKOb7b7QKE^nHr3G`qFh@LTy=NuYwNqN}&f;w-tW8C$lB1w>>SOON`zXTW zm*R-#NDO&PEyKXu)_Uy|<#}%TM)Q#}{fwwg=zC_lb{7`nUuvtcM)0arGcA*}LE5k2bw;vts4)&If;KhM8kxsrYpCB?bPG0YD=p zGud0EXNTvjJ2SqN3s@uvO2Y3%bG%#-m&je|vc8wU+UV90?aDON=M<`{ACnB&Mn}^P zAH_3GN6HdC`}2%xgP-Rs<1)BZFAa$t+QA8(OBaNtO}#=m07!IIvMNG8J3RODfaT-* zm~JS6<~)$7!jUo+zWc$C0L&q+#(a3kdEBWiV7@7CDB>mRIvf0$VZK9+>JLKq(Rw}J zvb+flL=J!Y7eF7XiA;6q&A+;IS7C`^Oi!rd9p)&$IdTrj1pVz5fLm?R12rb8RWS;= zN#1~AdQDsG1uvNcA2Ko5ZRB}E#f29&T8Y!TV3k(JX;iA#<%*1+=&7gJL|k`FD6^k( z*#jv!UcU;}3|%VEUV1fq#j-yqQ^&J(1WxSxFpG1#WP3TS@9Qjkxiw7^c+wjom4eSu zZ5iw7Q2t;Hd`f$C&)0q^GOLGJPw*%6U18O+D;5#6ku3MCDBmm(7CF0aL0qD{eRN)f z(7t0KLl(Ol%A9=7IYx^}+_50JnLkD^*z&1v!JCIFWTzg+h+KL9%>R1R6=1K1q#`H& zD&t`F(|s+=ccNLY?-Ai`gWLfbkKcnE+c0lP>;OwPB`p)ebw9P72I03Jrat)H?1_{c z#i_Z1TCp2_pZ*5uPnmvU2P1v(-TG1&1P2QjJD50WpdXa0L+7w(cG*dOmId3#AA?e~ z>%6*r=GNUU2PJ?*o8YevZ#X-Kn;|%dudr4xZQ_mxaxl3GQ>60ii3SJ-3C{QoK`M6{ z%xuKnG>`(|Um=b$(U8G&?}{&#Zz2OE!7Z_S{OT_q)LVG{poP2r2-6`|qg5T6Da%P% z{)j#sXW*t#uAO~Q*JU&xfNQXqc$X@mr%Q;_-|sdY8wqYo>F;y#PX((MdFOdxQ?wQ> z{*!`!aH60ionUX`c1lDq6olAi@1Vx^=kwoX}0fI($$UiLZ>0<)wQ?NN)rMs2t3ccZwic6`rj~mRkFSM9=Q)Ji`7$}=)PYs zjtTMU%l@ICLO3|X=3|HgoLl~0rS$Wc~f_ z_NsIk+TBPE%7YY#7f)@my|cuHuK0-pG8D;GcQ!9QbOU3?a>!T_ zA*i?z|7_sJhW@01nmxCFF3sz*eY9hM4pZ3E#UJ@exMZM50@3B(%VYGe$?03YyIYF@ z7&wJ1SMt@B^ICMXUGdIeEo)O81>S+1)~kP_4I&ji;s#rR!D{l!ptTvWuii86r$5FW z28jl7{O5!l3nh0Su7-S#;U)$zF^);A^iqD@2}e<{7?9=Y07s6YsI~U^Ss63)t48Am zN3n7fTeZWaB+20`PqTp09PfO5&N|&jr07ab*R5wxTlGMxUNUAR>NJ;_j!)L^ zWTpRqjk^z6M97MiJA4$3ve}NTlYaC}gm_~F^#3OAz9ZD~%ss4q+pL#=^TN1+E18F= zd=htu{}p#{q6jQWaW0C^L$ROls31PksBu3iOo{35N*;RY78}p+2nOD%6x{p4eh`rq z9W&UXZ`Nx$B@LInh3}-*NTncjoKhl@E!%6bKrS@D(R^nr=3 zZyCrl$&E%REM2oZYU2tp0bMoR+hqlOB;6%JnMr^6&rJGygZiYG)I~HbVASH0Ng?^Xg!UxDQ!W*`gn>CL1;>(rm9vzyb+5Wh`XMcD`nFG z8~>~AzQy)x#~u3yy`TQ#OHrhTrpH_m1oTJS`elbZmo?V|JW>ja$Ul;UECB0XbAMLTBj{4x9gIY@{uxc@ z_L>#YHvF1lyWtFP?o^QFh-$W^>|C$54}kY9-i{XXo7QGRDqb|C0*E^ZtN`g~Kur#) zJEkoABA^D*C})O4-O?1Yl~vfgEcJO}>lyd@UCUwyzRLmbt#vL38dsgR|I*JlFr4(T zVQK%15@YLXh#{BDOV{>}>u*~N#~oxsVwH$D;dGPfMDjqeP`{@cxay(b?_1qp{O%}R z@N~DAe{Fi*JhS%E0b{MTj{MCGKCbUzEv>$hIuuh9p$eD1ftCza3UR*Tf zT=cHZUt~b=inQH%{Qh`WO<#}l@T#YS7ook|X@8aT-}UoGzxVwuy_|y|IHaEZcRXF~ zf5X!o|BpN!+J=Mj+1)nRb=*V-TJz1fs!bZN)EMG$Yj=}#8c^v$?I{%(Ym4mMA)E0es%n$dm`qbIrC=7&#=2gz(Sn5-*a z6{FJ1+jNdXso}3j1WIeW&_*r)IbSIdhPWlkmI#`Qe-X;>|dT zu9Ep7kv8AnIdy0HW95Te3Y!y)j=uY!7Jmz0LBN925Kl%@%o{`=X|>46*frBvj1S&% z{pLAP*s->6x<7D_xR*AyYEkmAV7Upi1N!ac)l(zhg*-EJ%)4#A_>#>2uNn0iZ&7@EKSyAW9&H$%Nz|X-cE9zeT{H2`9?v7tJhzrvGcnCSI+{z%3 z$9>CJ_@5PZeZ7~1l@DCpXp<3j3HNGn+9kh8Q<*gP3xdVM(s9k02K&3RqqjN~{))cK zKR7yxz9*Mq`Sd91Jj#YTZ8FYZ()g>^j_wxA&%%=xb(a9Xiqxe`tM0Un;jEblyYeF- z%&We1`8UQs_53qE=cU5LU2iGxSXQ(y3?9CWAAuas%@wY=ZCom}PNYwl7}fGA*#ZVV z0Kk#X@A6-UWXx2}jlp;0{p}B+EW9<3^aA-)-#QOh${J&3?!CK`ex_z{B~gU*Kt=<} zV_Z0tVB+aHk|6SLTzx&vsBxxepLm@PB-w`a#n+2r8?N{@<#cyl`P~sWwQ#KtA^9<3@%JS|e(>?cdZKsKS@zhv%>-8MN-v5#MaTht2e;+LcC9d( zd`d$!Nwdn>&?Kv;>!^y>9=P4^P9`5-lFF-uwUBKm`*c5@crU;gt63T*OEOPThj-R z9}o|O+yrTml}!!g8GC!G*+!1+sF}243R|z|kZn=_&Sut4*;8k2BtC1b@dxxWn|oRt zJ^!1n*Z#%UITlu8;)%imB*p94zW-DG{lBu$Z9^&h+kr$%{v8(B|Nn3PJrPXgZ6efh z+oDX97pDdZsjKnL-rr!&!eSoZCB|K22$4)E5a|IAvxek?p;Gc;S1?uL=dVNwU~rB8 zX1K(eaVXzym*9>s$lcGW=A6Z=U8W0&r63i)L|_4R7E%kIH;YemTp{SDWT_C*3kO?l$nH&I!| zR%KbLJcNVe^8lr-tTH-JO#2}B2S<3$s&Yql(D5qPpP?vGGd^NusT-A0^I4g}AjuJC zSVN3&Bd|6?AQ1B$N6`}zougszaA(75QibD6dMZUM>K4!qAe#~2~6GOCg>_)uU z9P2{L*tR4*@8>vKtaQtNlZ?&A7Vs~nJQtw*TmH^y&k0g@4ZTMM zdZd{ls6=gwx9-yOW4n1vY@C@3_nJfr%YO_^Zg!uy7DU))vc?x<)u_47C~2JIJ~+BU zI-^Cr2B*+;-_jQ;Bz;4-x-~=Ev7OaeCxQ=0E!W;LGfPHyP`)A6%6Lc+%9ToELYwX> zja4Hfn+@M7dus+NCcvNgyUza_f7b{w-h(28l)Z$y^~`Q9BxmHbK%Xte zuD6*pDDjXe8hZTNmINU7$QNns6h{j+ejO6N=IwuGybS_o zMe)_2<-YLW80iEXIO*JdsG(Il#P494TX^+w4zg5oF-^9Z(ui?b#bg$Si^iL;w+_mii&sEgxKU6uFRgz-8{5lX523-ktUl3+E{&FLC!#m8$t~; z9SJ*fgftKj2Lk^F_bJq7)B?DM3%Nb4xs3SBMUUJ17f(0vUj?8G)yq}`knW(mw_wkN zDrlGNPPT`hNMFYOzkvEZ-aV&(SJ4XwQOfn-*bRnHRCKO;hm>0-!4Ku6k6qCk?LeGO zPnAp(hRmVT^gQv)&^6OV3QeErtu*vf5h_i!P`AN^5ox{q(31;|caSgDZy%GJeSx)k5gyi(OdO z+P=}UsMl=OTX`{1NHX$cfw^dZ;raKdL+1IuE&)<{b0k8jyM_J=o{7}%C%TA{ue6>>=Zr-bfe^O~M(if9WT)7^X@-{q< zXrx}V@=z8x(}lU~%x2Y_L!iXpJIZArt#>6X|CK zMPmpgD$Kuxi}yJT7+ckr$}=Ux4krYzifxso#JEXgR^^+BF56JI_bbPH7H^tVfYEP% z>7V73@wBS}EBRE7VYpm9VYU3^=J-5Cvr&~+j^7-dN<13)cZ8CHL46-Qod{x8fD01k z`zlEaA7uuNGL3ua;`ioM7kwuw!>Q9XlxLVv}+u2xl!adECYMN*<- z=~B^FJ^j6FCjt2IKA6H8o6#Gyk=io^Nx+S#dI@zQ^*Prqu6he(eW? z46P0hRi@ce_;AR^T&wJn8#PMj4=Wae&#<-luafzML*A-aU5>uKqouR5Q|+K_oAG(R zndp}ycxy4|IesIjqZ=XiPOELqV@?8mYO#RI`b%VmQEPg@uEAsK#LW(84o4iSHK~;_wXEh3X>6dK2t;_=S+{E>O zw!j`ge3!y@$vMxrtSPxnU>`O0{X`IgRfsyIAS*R>Y_otca4iE}{v89O`J<<&%qZob zK=pP>C?+`gf&Y&Iw51=$F=O{0pa(4guNEp3j!2*)D8D532nTEg4m;+Zb=#GItn-3V zly?Yc^BO}4fh|67^XAHdJPd=5MO3zp_YGZaf3(5+xfkWDEBy?U)`~?(7Lc^>)VYKS z=YQ&XRyLq|3=tiar=4n`EB`k^9YnBM!l@bn7rNrT-DZgjthD}YNzUzFl)oUK$$_ID zu*fq8cd|z2RXX5*64W0c$eC|*6X4j`C?=+DQZo~3Z2jSxx7v7N&-Y4uM>k#Cgu8fr zHe7Gexs2`21s#MfxX7)`3>{_Ov`^Pb_Bo#41IaN!z)1|jYTpl%nO}7m>N@0Wzok9< z-nB1U(xPQ>*DU|Bw5^<1;=qXVt2d?cO7Qzmn!YrR{OdH6rJK^AV=_IUIpZT1*}Ffl z_myurY04#iOx&~&_gO4OY*nO`YF+aU+ z6^_qS9X`8%6m`Mq0^5Z2_KG%Q=b+cv{eXiC=@J@o_@)i^sT!^+u*liX{{V2f9bcFS?iy-pKIC?yer+A7_)K$w zsW#0J_xqk;fV15fR3Gj~-7hTR9{=g5g#7tTG0Ba1)AhG{MQ`>}7F+BUgkbTLI%~iW z3cf$sO1IuOC}S-sNc~3yoG^46inR@h;_W>Q(Jxy}x3HVh@h{+k5H`0q^h0J3~oK}v*^bR}rFF*l(+BW%h!NT~3rR^(3wzS?oH z7^yD`H(IbwMu2IUa!5*K@L-{~Qw?2iJy()T{^;FlzvS>{`mmpZ4n_%509KI)- zh@t=a(u9Na&}3{^vW+~?{`5ic7j!vf6hYh$A!UEh45rj7$Sd}}mBAtocGh%qIOJz~OJf3eZF7Lm6Vx>nY@cqK6zTM`VGwyb}u3*A`2h z!9xA@0h)h#=^_5TbEov>x$+^H%fkE8y4=*&Oj9Zg<5}j_fiTE*E)f-#&No;5?@#W= z2{dit!H`y0nfTV)p?fZShrk(LDm zkZ(@k&Eo$V*>k*4Ylv40ohkGbnBo5U`NU0Ua_p65#KeyGicJhSuxy~z0F(2f&fzFx zL5!93qkQ7s&-*whnOWp8&!)+bI2lLDF{`P!=rSm)M||Ky3EYXH(!4#1KkHWF)#icD zUl00q-rx^DD>o%rbUjdr`u_GzZ65eu*q!fE`AVGUZ>b!)>2R{1I`lS?E->wFsf6v@ z&u2(rH=8ZPqLjE34P&w-MV9;rE}RnvijCfgTQM~adu;fWKVh%0Cd2j)-0grNdk;Hh+bPL>9K#}}-~HZubQOqD(LB+{B;IJn z#Soft5{18_qcFHue7t%sMxtr!)hwG0B)zTIlHWfj{C1q_|6uRkADM38|L-J;3XxP| z>EslWoX2!GN?aNP*MikQY$uRyu1sG&kDm z&3;-kghztmcXI?OXctiz)Q1QzpVCXe!;3%HgvK4GcM-XBuj`)d1a|H%9x;O*UfTXsf^Ya5$M*{<4Sn`2NSf;v z>hU0K04_vRvtge}BhoGGRdbc#1HK4|ou71EfZ7%6(8F8Rb_fzBX2!P6$wD=lYKy2>r9R?2jxTCyx`jrY*FP;ukcIfsxZJ`t$I@08h zu$b?~e^&7;T7IR4J4s)L;=q3_p-Kg|xOfi-{=z3lnj>1S*I0YnO1mOb?I6S>L$)dX zK#`>8$h~7$IVCY0IG10QaWJE*z|pjcrLVc^4%@I40}}ir13BzwmtsTcs=PryKC}zg zw$5hxP5~aQ9z;^&T|>i-M`btw=KFxklKF(E#nJ5-iy|9)(4xT7ecnktks+_`yc4=Q z-)OU;Knkv&-T~T2k{6LKZ_*P2}dFBXr{D7of40GWy&BFHK-t zA0slV1w>Bq8v8)#b^3Ou0_5tj%nt{#NK>A8yIK7j|Ar^* z;XLh$K}0D-<{)k6v0g`CWKaaYCuB)HuqnBf|Ly%7AB1HRH(fJd_+ zIFf*5(h_JQahKe62SIbqI(bi?XLxJiEI4A*$I1uaB~dUDFt!}WefT3m0Ld`&g>g_M zrOyQL`k}Lxl5I>2x%09S#z4Z7)+-C>cy|3-i9JAB(j{b7GuyfgR5>W;e|WmYBHicAS-!@oc7I$`Qv2$O!n^Mq41$CB{JG# zwB30@SU(BnPxKLVL5Y^Ny&Bm{nd@lI=dx1BAV@9Lx(5BLu_q)OQ4$x9Hu)xk7FM}q zp^#-LT68)X`3DCq{3&t>{}^aess0;WCI;3B55Z|GIn5?_MxO~MuN7a`?fCxBvicrU z#!Op@oILh^$@L^-#2c`)b<#tsRf_H32t4qdo3z&w<~=T_O0XG!Y9VfnB%C3UJDz3(~iHJ9*-IfVhTVQ^%qN{2Q!)qzN_!^ zJ!HD*r5R9Scl?3V+L%jMfgQW@M;f+ob>d5O7+(9dWuli-eXHk@ulK~?;`_mGazXw( zazvcN(VW2CTEb3#n4j%gnI~^WznDdM%qQ0#XFx8+~nf>*#TKf6Brm4ZE^+Q6P_*qVcNbz*VnoK)7NPWbbb9s zvI$sbT!qgW3MM#JGvDF8!}UwI?gu_r8vd8Ihf*6AH2Uao?}feaw4Xe1Vb**HuTEFj zcU3Pue|Zx=RNM$ozi)&C5oRjN;|^y@rJId|O$j$Hs&CzV@&a&WBh7CcL?lt=csmVJ zH};V@KJS=<2#mGs1T_+wvW-n7*0U6^+%#WMBEBf}kOmRv;V2U_K0PtS_FG9@Krh+3 z#W(cVE>hLfvhA32^yx-Ul_L{YD9&H0*8SyD-5u~*$N8+KDf6s6iAzx3M3f~VZDB2} zzCqmPcsRWJGV&*;C*yOA#!TP=n#Qq~*q+Y(?3=?mHSGf>X<5~>fwMk%2cc_hSEpTs z>_7ev+2uEVe0DU$l+(U6(y5^HX?RdXt@s17IoDlQ9q~154ifWS=Be%HkbS-nG_WNS z#0E)V?gsZ+_s@qFXHn>XnGDUS;4$^(5`#iucA+Q9u~Nq*&~IIrILB=cR44`uQ@G&! zbvy)diFoy(Lmo6=uC{FCsFnn!#$^B>OMMGoFGdzgw-V%0Zroj6#zVJ^j7DCm5Z6=*y|@#qcj zNKtafHdo;jYU65?R;IsuJSFt|qoM;fX2M=u$}C4%Ztk^3hN&IZvd%PW#bj`Q*UB*Z zY2K7DCw(D9sfju8R|vj4_sX6a2s~RC|3BgP&cEUJj28K3Nh)LYx9uu%8``}8?2DXB zA!*iMJ(MJ#?+m${>7;$_!bFdqky9|QW@*x8SH2khZ4Vk~E5`i#-prT9o9B#bf}B(h zgm@z{gy zz9$2e-%;)vO$6=uFQH3Mn}{)Hu$J6A`Av=sQ|r4&)CKUJFA*8`Dh%-7hwGs1H!DMu zqEZYjJu``KV;rCNT$)GiCURu}Mt=B?r0c+61VK*EL}z{7->G$USQtsrxz|t^dhfj^ zKlrGxYrvyyD}8zpeaPst&=r-S@B``_{IP8kKnP@9*0K3Mkx{TebBI9hVTW6gqNJM4 zebBPY;n0Yc%MhmRD7=)R<_Y1JHzbBLml;R9F(dE3K)yj&`0{( zgF3pAkNI4=^g#l{G{iapNAgY|Z^3gZu&a)-T&^$|WpvmBnnyr6H92!+V!{d`FM0*e z6*0c@d%J-#zmr7=-RWZRvkNEB05FQs<1!vHNBy=qSs35MQ=-v{CC`kP5D!~gq{0RY z4RVId9xXOIz4Ke^+v2*6jSQr!`I#I4=@S!eqLn0H){GQ2T+ZJtE9`#5)gWlI&8oU{ zP>p{vbhFzH=x6La^_s~m;}oyXxb&$zor{9f;K^HU3AjB2T3?)?P}li#V~hEx^f7G* zqH3O-P9Ipj`$DZ`~RaCJH- z@ZiOerx=_o%CNh#n;V~)d!GmGiQ%GkjOYD!7CPgv>^NLr`Cj2% zm04)jwzoLq&c^z^Yl5@=;Us3qYOelfHEosD;_o%Oc69zK9FR_cdKBu z*fwqazVWgDlvc&mQub@cGOj$6{FA$;k2}BS&rAjooj+=tHD0bx=DXl#9*7(Rl-|Pv zyGi0l)ITlE71t=PSz{Y10i4F4pPE-Ok4!_Kw-9H~k%gLxuRmCrim9Up9hmN|>bw`( zIS$R_pyDvXskBf3`t2n?P1K;J*nag95iZ-Sgh4|Y*fq@D^R3IM#0QovEw3eiGF%3I z;e1&B9qPq=c1x?s!n`mp+0BEX^`@={}PLlb6+V1C@QJA??7 zwlbH^c`X}?NFg`%q)7-T|CWv;p7HTxD9)O z>aKPlapoVt-FP7<6L$yi0M^Y=saL^Te}Fd>*+5)jattHpjqlzfdsv@{qFWWKO%SUm zpOqV#5w*n1xXsF%RLn1RwZ_c{d+%`xi2P@Xq;-XMCLpEWPB}$z9+4vsZQ%sm)>b z*rP^H?_Q4cH~2GL4t#?rpoB1;xsgE5b*yV4HtotoFIj4dgs%H(^~TnvCU#p1>)6Yj zAcpcXt3V*ofKO;_!n>t)?<%O%>$|3dm~PvL0g`PR1eNHC|6LCKMbldu(wts1;1d&F zh3)>Nc3j7X4R3W{FAuSB{}j|YC@DksHs3E&IpX&u(Fr=8cHF&h#m?eU7Z@6e zhzM9c#pqOk3z0io7hPxoP13kP4FhnQS8D50@FV?7vSjh#(}m|nnC|{;V$_7m?)nt_ z^XkPfFqbtQ{?Ti}s<$`%FW|#?H~2zq0BE+qC|)-Q=6qs{nXQrs9!nwrJI4OGQpbxp z9lun0$Yo}vU!dl4-XBJ~ z6GeF{i)`+A=D+lp5rPw=b7PC3ce={U1>vE!Kh@tA=hNmc6xBkP8iT=B%96@QgjLix zUn!4G+&s5*M+0fCoY7yD;q{D)0lF3P$-8Z0AQ{=Z*OcSjx)}ik9CN}|rKN_BL!zq% z{KUnAZLz^{B*iAWeKOGUJlz3l5SY51VqVX5}vfX+c8URb=t&v>D={R zZS$KH)d1)62GZsB>p9I@9l?cr>&QRJDmUjDFC%pLZWQCD?Wz=e2oc^^S{nQfiC&Z7 z-CX4lMEhqQIw3}K!3m`WX~c`oV}9{0t)G&q1*3^=l()<|9Cg!7L@<~1mRT5;RJYpZDnsd>kG=2;Iw_4 zwr)|!JkGS&55VF+8~7s>MNjkkmMn!$J(ZbWa}4<_w?7(GGQsuxOGvY9SlR>x$$dZ` z41lh^ozL&D*(gP3KKgZGlP^}J5&i-w$iVJG9E=mZ;9tfCi509)TJ41s*DdeH2b)K! z+7*5ueZ#b381%mS^@Wwl#FB-2#Hw{{#{eo;@@o>`OZobTPj~N@n>rbn&;osM;X;n*72{lPBhIqQ$^%%)K0CF#O!FwUap|u4ORk z3CR;b6}BB}F}emnT!*t^XOnEMzL?CooqOVgpaPQ6Nw9>;AKeH&S1OVFN^gp3G}Q6A zJ#=Eez>#l|6#PP5ojKa*rrS1B;N&5S#~uYaUm)1V4nnP4h+$M*@Ks>npT|Rx8}R+Y zNHj3x`%T#le(_ietvl|9%iOI?uNLAGZ@=W4N=Xbqu2z3Zx7*!d*y#N>^$66?pdJJ{ zw+rwcZA72xdQq*6wo#T~D_9zDP3*ZQ`0}sb{&c4ujF=jlNuIf9nfiaeZ7 zS$K!1n=)I=dAik;h1y%I0pMIP=E_diL$pDX6|JLCf zMJh0G8U;>Hy8H%7i!^xpm5$>-sRkvkmbJ}*g5|LL34X)YU6?QS?6gR78|3}!E3J%c zSY$-t>e7^WiX7g879o^;q4Rlzp3N!448NA;8J;Ukok|x^t4`b5|Ju;fH*+owW=Q8H-8ffd!Vkc0?U*f_@V-|HB+1qDUUAa99x`Ryd7=0l_b~ zN=URt1B*TE+6m-tG4XO{#^hm;#?1ST{{ArB=Q*?lwc`=rZ#~LFb_yb*CF6_p&<{Cm zB|FAsXA^mY8jKwx4*S*`){9JM|7gbhvmXQ^W`sE6juqU?Q|X2Hx`PCC{bYNa(SiTO5U|{K1Igf-NpDOpyu!Se}$x%b-r0 z)6bGby&L}>WDkPtS;z=(Ia=>V`5$bP9$RO|^vL|lfb6!R>Ft103)1JSEb}xgBih7v zY0#g~cjPeO(N|bX&AjY#2in$Ryg=lHnn*%~Dayn;+zni{!x>lA?3%BJ|J zbBDcrGy=OWN_X6~5MVh?S|rA}X)2msVk8@OI_I>4SRLQ|@hw+&MXhy{dYSq+)*Q=) z$9;(k%Is{(6EA}!Vi}{ofx8b-+SA=HYb7pJL)cXC7pKX_9rHU0?v(wiipY&vpchTZpDRuta zvtYrCC-_bm?bqlz4*AYE46oaSuGzrLkbFfW6NAoP$IBDm>S>+`==SoT=QgWS&4`o$ zv{d}s<14|FzLQ-zRXxt@wD@@&Tvr^s+`I!&HyXb5R00>E1RjB456p>cCfX@S>U}#A z%G^s&-BJIex9;jTlwuTw-p&z28FxVxLTo3$&2=&50 z-BK*NM3?ZWE=2YgM&5^*>QA}LxdHA)k zi-qM0dhe_A@Y-I$bNP%~DB3ZCX10L5VBk2vME(8aqL=ll)2Tt>3~`h&iTszda&BUD_4b@=@zDih} zYX`OIe4tL>&AZwQ+%+k`w|zF7tjrN&Z=Ao{x#|$L)hX``Q}mBqkadXJn*kVQY^ora zweenX&-7$Ay&3=b_FCD>Ql+gHAB(Q#$5Uz3H?G7UF?~H=OW5eSDc0%Fu;%Ja$MWx< zPU)4^^wUS$7pzIc|25-jy;>UcPpfMP_`D4N{Qf~0s$YnO*{k3M zb_C2@S3D>8_AK+fhKfe>jwppr2tg(p$JljGxU!#emD?_a5`5;O-nCJTVt77*x>}d} zr!JRu*+O~tYNY>Lksm|}q!gYAr94DljYmtr!b&=LCdn^l ze=JztCYLz*<`L=ZjWhe*j}7oA4hox@UD6b#x)fp^2_0wQ#%t%qZ4q|)JFc)}SL*P4 zm?hlmP=HGya)4r2M&baCd7Sv z1zq;GM>BoZ*agvx$S7H582O^j#o%$fT$!n}ca7eg278&m?YGbotA)i}{%IZ-9i=pixe<0#8&)|3vN;*g(&jkX!v9&$X?1h%==DOWj!{RuHDlC-`!>%PQ^K&} zlh%^3UuOxgS~Hl)t7kVYOX>>cx9(<7u>3Hec9ecaMX5K`-8>kHlUi?(^5j~&NN4lY zaMA3cb8uU}zq-3tAbM9^#9B({)IZsHT#QEJVHoW({f z<+$#S&6nk8td1x*)A^fqT$KgLQJ;8WTYp{m{TcoJFn++nI-SvP0HmJe$D~s z@ViAl193hCwU3*)zKER&X)@bTmZf0W%Urte&i%i>JJ)#$QFAXOc zp5fs4ZU6(?!C6i)!QlS=+OI2o*p>gV{L%kn`RUdF!SXDBv3%gVQm$2xemUtxhK`*w zLH|^QLn(0jB9B$X-fD~OL6U~RRmTb#_sORsG^+jE@mbW84zUcgFy~9I-m1Kf=E(XX z6;%lH8K^@%YFo?R5#apc+DxkUzTnC^3kjGoiK=KnYFbZVYL4^FmKg_61|4L->|BUf zQbX|o1W5~|zrA>%xvaV&wg4kED@sj-PFEf;#4HbXWWAl)jYd>*4wO4LyIMUXi|3lU ztS#SE7ynD-NdF02mP)WI;cTh*!;UA?>Q_z~Xhv9&aXdfP8_LYDcWDr4f0U}94N z4c(lfar0(D?Ro19vYlNVI8e|fsVE9LtUjpr3G)Q-@Pw18hfMO`YHF;<+GV#bMLTM% zFPCk(>N{mL!Ty>NMEnN1M6b|u)DZe*JPM3r6nSYru)=en%Jp2wY2WYd+LBusVq&C1H{2uis>OYDWDH#^be(Uz7Y10~FlZf_^SuLH9!k zJ2Ckq;HGoX6CM2hr0YnjlZy(=s^#K4Lp)W-BcHK>y>#Nv6X!}pbC(Xz0WE*-2%@nU zb=DS7Y&U&5m^vAEdy$?UTV@=c=eOPFDgyrX-OVQ&4Y2Rb5gGOTiet&e=ANY(oS z^%3kIqg>$I+1vMDzZN=`X|0VPmwm)ayE#$`B}`SG*ngI$bWIsp(x;f^bcgYgEaSBv zQyhO9R1nnLKRK1wk|^kND!>kyr+bCE>2IyU@VW5x>eGcq8R!BbCl7DXFD)0m#B~~j zveZ@ASW7tD$uzvPfTUmXrGxf+v=M5le`el}{8*xcx#eZvYOv%hH2 z$KG#c6WYn*3oMpv<3(`uv-T!knIC8%)%!w3kTz<`n7e__jke^7K00MjNV7|2m(lLE zp!AuDS#T`-L%x^Jea<@y6l_gDXN5tnP&Ts|3p_Kb1gxG4^~;w}%@4?39V=wHm>9PU z3weQ!gfoK-i!R2q&@K0Sejxh{9WC~pv1LTcp983+_7VcJb5@;a@%F@YL9?XlK4s=tH)=dPJ0XO#I*SO*W)vBbcqgMY+s+)hAs#}0; z)CIRq6(~w2Vj#=B{)C+v zzpRquJtLh5)yXzLICp+lTr~-t2r8JaFl&i`1c{o{HFs53EKmZuYrg~TlCIx2vr3po ziz}cv#`ft`>t#XcXn@~~G~}ZgJz8#EPyn+xls>h-f`SrI$6CLTvOY>WA_c4z*QEuc z?F$c}E@uH>1zxlmu+RA1*}w5#074WwJ>j;Nb(^vWBG*0tVZaW_t9e04ZEY3cg{JU0 ze1Rn9nHpf@o_zci4r;f`D5+nJ<8iniOUM9J0?&W^_Ip}FJjFbM78CY$rQ(%(f1AVY z4GLwUpkYZ}s`yriL}+L76;g9k$<#Be@~P+B2P-1DA*2&lwAojW+i~4Utm@-vN#CUU z(qahC`h%9fX0{TTi8Ob=2HSbTNqKfc-DS(NBe@5D_cHT~pF!ubE>v~}LjoNwCa;VG4Er2ewr0h5Ai90u!~dMff7pllp)D+ zsTB&!S!?qN>_0?Iuwh6_U~m@%>CYmh)^}VGF<3qo$m4{jT6K1Dmq=V_`9KeO8{dmN zNJ1F!@>~jbp$qL(Vprdl{uSEyS-ky+KaOl#DSt{uALL@*$l)OAsHe5q50SgU9~xa! zZ)|-YICIP9gDbK)~fC!)H8m=qY#l0ZZv7zsq6ql0w*SV_B#9BHtvRaM_V^@!hP+|$dbpF4!hqKQkK6x0!tGzn>5p~fm3TLv zB~u+g0gkf~+q>VdsO>d#1ZWlwH$SlQEE!(ASd72QpuXijP7&-hH$Ji~?4(#k8?gsXTB{Sh9WcZzoUuCVklA8o@(ltuJuVJ-I5An9 zr>+pETJ9Qa)|TxUj{EUE9Cg6=5U;1iB&v*+JRFnGP8x5%x}DrKJQYXUdEgsX?=E(pM|z^uNd*JHl5HmCf*e`{5^Vyj9wo zOsjPe6M9lB5=VLbeGmpom6X9)61pP55GLOj{nSud-exJKdUPvmcYS260l>( z@L@^#oQ3gyQx-L>56cLQb8|7w)hw=7CA#<&>J&I_pUe0;LH_WEO7q$-ljya5ApGc} zG!$0n+iaTFK3G!=^pnwAKE76hpj47WCMfu0tkh)RczcdAstwI5spl+ z$tRk@P~V`Upa%{H)}$0OK1Hq=8?)9xf|~>~dG7lnm>Vf|6uh!9E!r4tc3Z2c$BWn? zB}LhpPJ-62>oe1j!_aF@r4+pf=A7$+mog$9YtnnHMf}<7VE(>$o{UYX2E^%CO}mu7 zDEi}B-<0>4xmTwkg;lkgQ1!+3y3xa_$S43bsX!jDN$6=Jtnz882Oz-}dc2a7PJTF++Y(EHVF zimYa(+R^?dLnDD``qQH{Mv?83dJv{){W2I)CL&_Be-c9>4)clH&td~#{0dWKoD_L~ zZ{jW|I5}hlX51xL=diObP*w`!k>~5 zE-fG3Tr1E$`*t{0+H7;@oaMnLO^3Yk>O2UyyQZnWj*n=6u$NqzbAWsITwT9M4xY25 z)w@WEWwu>X`Pp7By zZO@$ue!t!#p|+_lbn+BI=Vt`y;TD`gzU228xj#zZsLm5uN_RUmpMoldREQtTlGUYo z2>X1{929=;oypoi$emq-d^-Fuavungu@S2oUi4CPD@JEo#}Dle*SjJ2^KGmA1M^{9 zoaft<@xK4@cCe_W7?xN!p*Q^bdLu8qWQK9s{6TpJJt_}<2Z`Z-ybSWT;-%=Bp17uA zfWVz>bs=-OxM&9cU%35?(Spc~MLuIBj|TlZ_8@G~*-rN!A15lnwqFpssU}>WsFN1$ zBN{?rPki$d@j=~S-E~xf=iIF;rRB#+!bF`Rx^3h~Os6GWKmC?9U~9DI#R+-YC%QdT z+3$}QRH=rv>Yg=0U!o$deKRw79bvtd25MYRI2Q=wi&w{T7fRFv>tOOqX9f90lpzOa zTnXH@pVh|$o6O#-OpJaO7^x~1cDDd`~UUdqf(aUC{Ahh!= z3U7ZcAWY{T*E;!QobWPJPQDXYl+LYdf9-c|GEM{Esjtre*`(!tr%7Wa%1N8~QGfA+ z?L<~rYD_xIgE6HLcglo7l{r-DPLtrpXY>dh2nLPWJ=yDbtTDveQxh z$vSPKF+9m9J|}I)U44#B5iUBp?uy)>w%uWPxjAT-Yp%B)OXstJ$2;?Um z(**m&ihY_$Vw^&I^O)EQ9r`COLDf0wVkvw(_xK}xTnKi0deVYTE21gy8$V7ga0~J4 zssH@uLm&Ni{`))Kg1Y(x9WjO*H@pRliSImP~RL}n$zy?uz|&_)BX2*-j8?imkZ=npS6sMlx!zp2vgsD{`KD*5)Uy? zQY>Mj5F)?S3t}sd58rvQL2Dsj?LlIkdWJ0MYAij!8@fS!WvX9gd>FhRX^;v+XsP-h z0b8~Z*OCN$Q6zM`SyY-C`d$6X{(9O0fL!#rFl0KTG z%o~WM<_{6b@47t!4IQ5#SjzpM%|Y84_59E8rPOBGNcvB}9-oghR!y~T`JCS&ael=1 z)<>HSSC~z>AmIMoo{M11porkIj}3T-=XK2W>UHtEj@q`}Z${p>Kk{(H#GRmm;ffFj zF-)?P&TX|F^Lp@6q8}HCu!}x`_PTGr*YQ7I71^4+~Y69u~cZXuP@&f`Ap8`H}JFE2UgijS_LI}Rng4gra`b*KT@?Hekzr|&=rj!Q??bGe|`MO@*cUX@8Ke)YF zZj-T0fBCn{(Hs}OoKL~WU0PnI&jy@Em*$cd2;~xG4<>n z*Tc?n&VPWri}3kEqMMfb{*2>CkEGt76xnu)IV?A2WLeNImOY6Kh=D^(S z-(CMP-_64_8Np{wIROWc=BOLe#~}+~rp`k9()OvV%4s>%wB@Er4A{?~AADZpyqEbq zMQ7U5JipJk!E(2^ZuG0Y{fbb_OT>T;>|)3%b=m;OA6vdS#i7Dbad*>v2cR-@FVG)S z0-gN$>+dkT;P-)I?fuP??1vv&B#455RaGVwu@$W`p15Oq!owt~@Z=tSn0-xP+k#SzYMuoD4c>&)}m|?{@_yUZM&fJCYRbmyVz?1IEhR~Ux zY*xN=?$p)tk^b1q2~n-xY{Y~GH1aOMDVS@cX>0j7>rL{NFGVBe$IHG!@r^@%KQBQ# z60Nsz0fcv+{}K0D+EJK}Wm5Ufm@;_n_ZN$xKAZ7(|M2!wXUbmm3z$r|H|U6oKE4+S z@ZiIYH=|lo{=#+~P~t6qty(fRS7zTngIsS8j3=D+AufJek1QMM9QtRLeF{=CVwL!3 z4wBIGnB{ZoNmhiX{U~2Eu`@B(3Y-Q_UjE7nM^7vmMiwyMTe5=wV#oy0UtKA8hHofw zbp`oWuBY8zOYPC8F?Hfp9E57kQ>U&So@FU0E0s*^1xeihti@!CUW=Bo8E~u^?Z3C! zAPL?x-2YQ#U}0QZ%FtPVSk-_71pe?gNPf$%A{=CtxsSkgIOb+KKWTkv7NZfc)C{wy zgh8pd=TE{3IlgKckbR?#C||esJ(OiW2?E2?G&_e|CZfn>~RGfdRu8o=*j8lZnLc2o_OR z9awe6xTdj_zjtr3Ru`35rF2>wIS>E6%={8MwKU6ameDL~2H%gQ1ox(!2bo09;~!it z9Fq6+j5(MglVRl9jpLS2(61Ltjna6K(&z4X`8GWu#jy`H){glm?ue7-g(S76%Y%^C zYwpqD!(=2-x_y9kX93>h8gXE#iMwH^qntMppE@aRpJ!G|dpq?`i;QkTlj;8Zfov^3 zDo;7`N3x&>Twc4D=Z2B&uD?B3ab{4M+!j?09{LJ#-O@xRW5QfBQTXwTCx?3m3jxI= zllk>tk4HHD;an}?J=l`ammvBT!}4f<|FgMlV(?9Cvh8i*4mi8w6RLH^a>cY{12%XGqy z=r^IjBbPIy$5qmm5<4>$FWp_oUiQABq{|NYM(l?CylEgLOTTqlik``6KM;HUb4Q=C z3Tfd&kyT|i8r70E9YV(Nv@D^@vP|Pq0V*m7$bI4wH{FC+1hz^B?8zFub<<^=ETyc+; zEJjcm-TKIr_%MZpJ`t)_pVP zw|xH#+0!&d?px%KGADc&s%;<8N_#d;{AZZ`v->XHe^=oDAO9Vm`znCg3;gAyqt{T{ z)P!zV;{5Bsds8OFf)QSflDcdMSsoBdC^sx#z_-wfwT{`jK)Y0S;ju-NpbFpCaV0ZG zDmCXAKc;@Ee#v545ww+U%0L5TxlK>|UHAGpO>6vp;o`}syOLzV5d}43piPJp7il#C zL>4bOL-j2CUaBNIOX~EK{DW5&NbQ~$O|E@-G8Mx!P|*sI;Qez;KgZ6mk^GIa$fHeV zc72XN?1GC|pzk+fP0GX81)jDrUa4t5I=hHitRgzT53r(D$QZLe(C66SABF~8cYqfq zWc|a~V>Eg!ADrP2zE`r`B)gs%;YNrRv+-akN?fqAf`Kd1KIw!tFR@Jj5jBzpPC+=B z{RIl@`)Jy@iv8FOUTOk%cN9VreGVP6_kEhYQA%4^{So8o@t7;B)!&w0a~g$_a!i!& zQSP4pB)REE#?aZ%=mL)lVWq`qTdmq7#YM4(6xxvtfYg^&;zOHkR6)g@Gpz?KKQ zrHEEGVEg;2$xGc2RwfF8ue^Y`!Tdet(NhD#8D;Kt4eFtj6!@%HRn)Ig!tW@WV0xCK z=yOKr%#;FB6O5lsh}j~MPZUo*IVHU?ZfiY&IXJHabTOnx0?2_@%E=?gv8B+xC8oFM z@1?}YVRuaZtgqa}nD0*5wO|1ONKK^42!I=29NmP6I`^+rosH&MQ{a|6t9|ke2|qNO z+u;3Yu+u$%7uuzrMWO#S<_)K5&o8ok(JRf4KnXPZ^UU7R2{TpjvXF>(Iai&CDX~h{ zxrrLN6Q1BOB!`_$3DzXK-p<8age+6&(Zofp91E{= zLU9p}@{@yu%YZUsrPsMn5p_T+;8|MadaR5NE%9$&emcB3OsO&>^UKK~L(*|XYPwh`% z2yEiDbOol<_ldCVr^_SF`mW#?&3B7kCQDR4jO_B#Ze*~*8=n8`w?hh(t+zkB-sfIp zTPw{6@KuQ+H8cYB!@>xjkS9JT>Db*q0bZaec=Hs{#^(%E6vSGC!V$EbFPqNYIn-{6M z-W2&L;a6H8CY72Tj;?>>z7B>%4h!K&mtr0B-aX~cDyl*KL*DOPY<9O=$_)9EJlc}h z#GD8hM@H+dhgIB=j={{1v9Rhn_yVw;)8Gm{rZ(zOVv*RH{bpLf@jEpG(jZUEt;Yz( z9?YY(gJol(B|*{reod1<+6d+HOAXsy5d#ryQ3L9}HY$i}YqAm{GisNmH>IAlmgk_H z$f^07f`EM%HL_}cF2H+p=Ex+xy;AZvdMunH#$SE6ju_qfjpmVA0&6x(XHZV@2ok<% zn14D7RQ5YM0tbk@(s+--fqQ7RIIiY;tu=jHJOxJXTxw-UfDWYU%53fp+0F@O9DlDk zt?~a5cb-8_E_|O>6e%i*fQSf)iYQe?IwUqg5sXOhNL7l6fV7YxigZvB=>$dT5IWLA z?}UgnsUh?pNC-(t+vqvxd7gdW*`1x)o!QTP%M5eh$?tz%m&jPJBt6op^Jd!Xx9_)~ z!9a+?Ky#Ps;u8?^Yd9c!Lyf;IuQ|&6m&^0*)lD2*1|=cl3-Ra`Qo%U>vE2O^Cu~eA zyzBlR-$^rhDbOzEwe3lvojc|POkt*fuQSA4*T4G2^^(0j%EOAs6@lDM=7qNZp5E_h z+Ik(A4Kf*X+^dToP^Bd}tOz@1giCa#I>H4LYWUs{iCC^GS|4e;elmfos z)OhQY(S^0_=g*r1zYgvJ)!gaxwD_gCeapX^4ur{ zq3+ z_3b^ZePHiN-&cm&kVw}i1ld@{vwrjKCxrAgJrSkKWPk8#xdRU=02jF zZ;zYaRYF<>qkxGwKT>|XEz*2H=rMC-L%%M=+5b^AY%sr_eQ_CNMbi3N1 ztrjUoYGb`yLNLePJwl|o2I9IheD;luoeG+?v>o)FIyXArFjtXs6wujhh4u*V zA!Ch-)=2?fM&0QZ@XcVyEbqB8#sW5I%0_42H3&$r&&e*~AsAiV`)70?tO*;Is3V}k zrAB`{#?vHXxgG$;=H1$Bd5wE{5smj{=!^deAFwxRwa`OEiJ2Nk{?YlXh;q`?WYW zr4^DL{D9UMUJt$i7_>fc9>g=dO_F`dU`E=h4eNd0$MLQ*&@bXAbxQD5u7RoeW~F`PccuNCBYN9`gB}20uwkzQk;B_A5!%Qtern(XMcc&t z4afT{)fUS4Wjhn*Q!J&f)g9%^S$T%z+R{|i$=S+mK9M*wwrixS$ldiR<*~xC5#?G> z1N+p#Z19WW#I{t`yAlRN4`<7MZYAATIy<@%nYNtR2rCLM>Ntxk`Doc{ieM&$952y;TF}4Jv+aB%8dT{T9r(u~8Ok-bc+da2>04&<-NsZn2u8Abp|M zv}@#~<=AlC>F%kJ;8Zjb-Y`G6R`>$rmbVpNtQj;~v#i@4@{ZLgu6GS>-$x`*LzCVN z;}?G8?bH_ve1RVhYHg!pa4yO9{@(qZA{V9I(mY=xL(kr zD5ye!FTKr0Ef|GrxW$=z%X;?l`S8nL2uk{3AP&BkVNQD0HMxEN$TtY#$}GKV{zsau zi-!t|<2&X4HH@InK+}8R&e;4=bnwIv5~#;vmsxGMzz3~BKH1bwyO9=tu@zMP!P{Bp z8pv9t4({nfsA;*$tG?Qx#I=1)J(xtLr^!`ZJJ)@761y1QcHq0fzqa;&;q7}&$^4E* z=8@CGEvdJWzq9Q&x}eOj$uR+#H=yG_2>F zWKr}T^Bv$Ez#gt&`u>JI^~!MWO|I|U34*BBb>{&wwPH0Z{>LMSGj4lweAWIfndd>_ z-9QHT)u5oRzD24;c*yOK>+0`|&8q^)Pm65r&WDMQX6&x<4t5P4w*sU>EW5^O=60F*w<8ylO}Z-ic=T@A@(21 zT&>+GhNXVoejUK@G2>9M)M-%Dt`^+MpI>Zi1WPTKq}tpJQqU~$UGo5Ee_PK02g1LrYqi1&xb@2e14~FEI9cEMV^2$EBlGyM|Gbpyucw@>naVENtL(6w;}!Bm zO003!5lY4j+V=rn+ny|e3}rM|HxARYHUvTY?-k|$EE~Fe?TP=Wfu#sG0*7%bE>%d( zKyKk>ou|pzt)JIk>4lACnr(86`Yn4WCcV>~grg}LO(UA~U+IVN$kCjVGZSSl|$j$`4BYP#da2jxpA|ABu0(3U9>JRwHEz) zLVt`{VZuCf)Zl3z$_+7Wk3E=_VL~vfw~#|WQp`WH4(06-dzBKxC&XG<(_-Fz$$_sI zs41}C;?Oxa2m$pAoYfP`zlE8cQX=#y-6#;cH!roQ#nXjeS-qZg5r6FVjy$ zbOdVE#h2Z%G~AHBnfj!dYeJ9$;4+8E@_OElHAm~W z7hX>vRmZB)1hRbu#yAg?;+>8~`G*cecgQl^j+y3){A+h!D<0>-zPXJMFlWcubqz-f z-)Ap`xLT4?XaV)6<(EQ7MU2*s3-|{S7h0AxzZywXT68{xWpnjiKF6h?%BGzi z?57+1tEa>&fBDRwE?CIR4LGR4h{Fy!tO|g3WO2Fs(78V=`|6ueCj~>XI70?cqu?H7 zDmu^|ah|}Muso`q>w@`udzTX?*d_$Yke**(Z=5btI=A+u^WCyJ(za z#@k)X|Mz%%Ao^B};D|nwAZkWB2UZ@~pd31HKVC5-u{<2G{8z|bL#UvEOci;Jv+`vK z|9oT%f{biw1TItu?u$mmJUc$-Sx0>Xiiy_*kX09_V-}g7d0j1spIp0*RNr%+%#gd# z$_w9FV0)e2+G0O*$uqiK^q+)#<3l#9^y4kwPj{pqd$2L$JUs$FzPw}%xfs$@5)Zoi z#@~nD+V$}a!CGt5%&z0(z(%ALz(nvc{5Fn*mH z{&H?aP?BAJ>l>*G^KCaeAo}`4=I+iV1DgR0n18i?lm z8fX`3>DAD;hHD9w!#{3!+Jl|JeO=87@bQCB5M{nw61cNrv{ng3lC)z5jP6ys*0xNfthy}Y9$u@uSMTfK&5#ObR02v8!}r7v#4xv?OcOgQW28C z>~(<|ujTJ~>_JRuhFxckWsE5xZ=})PwMm_g+NA zqw!d_mG_qiF`m}F2ki;V+Zor*6m{GWXM)FaUlE|HeDVa{!cyzuQz7IyIon#bHF^ty z+TX$$g*kG@&C8|9-i-4cISkgoHIN6NHway=Ekll}pQ=3g{0lJ} zls=LA{z+lWRzTngmh9z+Xj1z0tvjV^OIsx4_;W^irbm~_ z9h7TSXmt3Nk$QwRjbBO5WxXP4P+Pgl63e;p2}oCWgy2d%5e)eg^+C>q((Fs0A-l(a z6fL~>{uadJz`X3sgOb0kn_oxEz=KN(O!Q#hn{0Oh1<^oB3ya73(KXh!qDFj`Q|qrX zf`On18LjX{t_`#m%h!A)vA?&N^J`{X6qcYEo%f2*PDbN`X?1T(XWP*H>`O{%ibr7xP^TEV#3b+KA{r@tvHU6d2|t*`+-N>i2TQlIYI!Fp5BZ2}0lgI;io zx``G+bZikgdHS4f*)|?~BV>@Tp%kMof+d)kp0B7oyJ=`>vk*#V|{9$JtF?b{}EQmv|J0g9CYW$}$rB-1Y{K@g-La|7iAH{7vM%f((yE22J;;#e)m1O6KF<7~;Zw z`~3z3P7*XoygQoVU2AbvSA40+91yd{-DQ~41stK+b?ZEpMbF3lo)1nxFM!_i^;t|YCow$LdgjEjmB?r1hk1{_?Z(~w zQ3$hR`qy%W+#sdUJ~UCN%E|i+WT_*QQj<$7e$TePOfKR7W1+Xuz3qxv6ov#Od? zSLq(lpbb0EC*c3E@7+LJ)F6vR-RYq3V5%+U(W{7CtvvTeCu8O^h_~1_GN}=h4-W;- zYE#mZ&Y2ev7cC?GlGE`ltB28?MYt)jLyM_R&#B?#Lj5t`RSdnFLDH6`9TJcOGeXB zcw$|$X&h5RPKXpKZUOXO3)YW>x+ki&y$XC%e*~>tx;Uk zgr8oydbevxJ3|r8GT4$;u46|YV-{dVth&e#gI!;%`AmCt)vk{{3#d;+bi4S&6;}u; zck}%m9=^3rwDR=|Hh7WGT;V~ai*If1=epQ>o+*elde7`dF@Hu93ACde-(@j$@c`aY1`TRmhwLs7=5hv(w!+eny zfORGX)nv~XS1B$$`ZLEfRjr4KdK$gOh@_ zul`}*Yn?LcA0;u16iWlx;oh@9P*+>AbOr&-G6L23R5Gf8zCe^Z*mxnqmEIH${3$;~ zd-p@Ho<4a2;|WeIJe#o1G|>lvP^vplAEsyipzpzTNm&?mx8i7@^Kh=EPHKA4wtG4ouOOD4 z#-ZRRqls@smy{up3cANu(|rIIY$&n6ssJ8HF)&g2BcgAIf1T?2m4KpT#o0HF`uDoh zQ0A){9KcRD0wHmWNxaMbQp*aag>%V*K^-c~OcnhnuC0*}9;S@mT7ug0atPCRlrb}$ zfS3mbt7T*3;ko(OPf)r_3y^6i;XVhGD?};Xkpu)R9l70G^V>y#U@yT&MO#YBerph1 zA5+bGM2bEtag;uaqJra*#G}vQTG%4_Yax+8uQZC)aT{a^0x~&{8{N6*-tQxy_DlgB zjS5@mJb>D4V z>Hdtn zW6-U$PVck}XLrynPuS|MeYO1LY;>w^&P6hp`DQCH zWPZL6wDZq4-~32CVo@h|B&UHepjE?j$jGe}6ia%vdHS3gX{rJuAb8db7dt{HpN!CB z2NZ4*?AmW$04-O8@Xvw^&Yapi^YCk&LsLk5t6$D}7H8o~>t?w_d(yKKws)898}*R} zE`r}4ln(a-3a?P3-)9JWK_FCYIP>F-xude#BoC6cpj!)iIFtC-x0N9vg9%GNKZBjr zfI7%h_u78G71eC;%y0VL^7 zr^E5H-QZg`9FJ}CPdWn+eLhk9@GwqHggpi7Z`^+TR5U6Cy5 zgm9ghW3XLJh5q55bT=nA+4^Bni~^;%z1RJZpI!;=?NjihxI&Td?s+YBeggimn5{5{>-Kfa9)U75e%+EgXbgPCh-?j-lUvnK2SdCq8-Y6+K;*bnc?^R zzrycV1XC>j%=5w8G^D67hbkpD-sJnJN0IZEJFbrH_37s5q{Az{gbXr`ufZYzkDvb5 zERYlxGEa9~?8%v3I?>8YjU$ZnuqFyL z7tGaOi57dv;usWx!N7sD3P*VjzcoVxjid->k15vp9!D(Pxx5J6t@@HIun5ieJnS(5 zM(h|&5a|h64Qkqjf`GG&6QdQ1vyLx|5YX&vI@;MgRA}$Ojr$+Ij(+CmVlaBP!Qy={ zosEh8&Ys41etnQuFK6RA>i#z?FXuE<^X&F-R=($wfIv|@?xxzWYVNNhcM_s`!Z<~_ z)9Vq2l-MVc3>_r8i7@D_PrHbcJN$F{yV2ygPtRVYqRTZ;99idlP%F511zvR{P5$R` z8T7YP9pWg_2vqII8%$ij>%i&cp_0j}OK6vm(XAmFfjBlq+KCI7j|T8`x&(aswmsu! zB>6yV$4yc1J@ZyiykY27TSh1F05I;GD7;vMdPj5qDhxcv`GK;r#X- zd$bKy`*Wv=z4G!T*IQ6G_xrtfcZC(}_ix>d0B(nQLOwMDuTy87SRMRO6YYP`_ivvf z7u7qJ%M@buePr(uCYiiE{(<8eo1L3LY+!8@73m&39>}`+z!$fo~JdUVKs{cjV@owbgg5v1BFR9NlfWVM?!Fe zJfaa>dq3=(#C>v8dr$=90)K_y} z>wWJuV3lv$-1ty;H*MREJ~sARw8zzhmO6EW?w_P#55$;8paa_(5Z6*cm4W4FU!Hjly_$sZMV1JCL>xo0J*x* z_V!J+52sFeZo{v&g7@Te2Eq>IGwjKSIe0uW^F>0DL6@(zhU_|i^Cxv*rYS%<&A;U- zjTBVdoKN>eZZMy@2l2r@1H*nnM|GA3Pxe|LN9RKP&5<=Wm2F!JQGfce#zo{65J^qoTxMiNcw2b5Vt@`G((%TVYt3HiQqSrxgCOtD zUw6SSM)K3-Z@Aj&?z^u`oDK4bJ5XY9fc!!EJCe;aj%_0tpH?s=0Pxy|46ypXF#^=y zu$oO0Rrf5Na>6QFjc%Jm=Y{IQFWYCfejDn$X#LVM*@4Uf|02=u9c9g;0cbro-U#bc zu8Y<<3-L}fdrJJ_BEwP6-0;6lmF&j-=+XnKZCi@O_JNL9&eoxPGDiq4UrqM*+Lb}1 z$$)DEcn`LTM4)sWn_e#ixLgm!Ul}ZRJC*L+WZmbdzsWh9XA+yc-e=#%nkVNSx+&P# z&?pOx@qhj|J0C2b<*UItYv95Zjye%<9Lhvw@7e|Kh|7c*r0oAi&nHJh+~*d@E#mjD zWvEn7nwsb*Cr`0Y^Ya;GHTAnA$}y$RC|O{V$6-McIOa6!tCGvHih2+!ZU-VA9-MC0 zRnY{_pSTqkyc}~2YjH0C9TSDkI3Q4}&c2KQeqjEm2jz}le{uhE|8IsK#QQV9q*p+6 zI{0AA5-*e+GMNlLARl_kv=d(rFL@yBsh&bIHttwFM9x>yvcJme-66a2gcP~yia_l- z(rr|dj>8bR%1t#u>P977uHK;z*d#9NxD8_`8FEMebJ6+QB_=+90*OxQR82M4w}s3N zABIh=Dh5QGA`V}AxrfR2JpN9jB+;14>rkz6bG=!RXYtG+4M^5r4-R5R;x#0@y?=}9 zC4*dZ(_Q_7xu26I$GEuAvU@^@GmR>OE0V-Pr7b0*&JTz*?--FNx!E(DJ#V%?t?lxn zoBu7UpSvPdsXWLfdB<}nkJ3$La~CI#)qG)QP~L6>UPmRA$W4QJ<_}$>q)S-@ugP*1 zRO4qOVcTeW2e;bQfwGTQ@VWog)B|@=ghcly&yB!Lqlf(a=+?%)O`nrF}toos6LcmS@qo^j9ha&ML{>TMo z`bq7)wbtG2q^}LD;!hRwJ)NGHpJ;G09PqT~;EUvoxVjO%Ko`GzE zcm|f(Uj3%&?bLu2wW~Vt=%eGc{>FXs|%Y}Xml9(VL`Z*G= z!aU{90G5vDxx&g_s@A8>CG(aX%eF+1Qk&t9e1k(XI6yL$^Z>@}9N)Hl?m7`Yj{stm zP^wf&m83m_iPNV5RUS+63@9V81>3B+%&PCcN^p|g>2CMnRg8t+1hgjI7~7i(IMHIEox4~0nwo*q zTD}PqxZ_K{IHt&2A7r*@5FNZt%dnMfBZ{PXR9){M`*6qafil-g=bjWQl2dGk8Q*=DPgAgnlBvsiD?kS*Mnrgfag0vZ_6B7X4PQb)og;cc~ z=qZX%Rk#aRBFg$(=0N!)UFe)4eBB1ocYnb^w102&x3m7da0+9AiJK{~x=nql=&MuA zZwuEO%_=wPJ>aoc7-AQYOr93@ytfGJSq{{Pp7e_wyo<4yuMA ziq{Iw5P8n_FTA@RkSym3X#K^9p_$;$;5qh(`rjq0N!i zW0ZLLu70CIUwrfv< zWNV+3GJnt?>yJ0CZmQdPqIL#h>%0cP;-?-clc1o(Ejooeeu%In@D?W7%#B(s%--`S zmXeMtnk}{M%_w*m6VSAJJuj8CwiZp@W{wZ7rw?zs9!I#9goIppCdY56Qc(%g34$K( zcMQvv5*iq2`a4@<~E=I^ZDq$wZT zOjq%QtU)nMfqkY^F-y(T^!=RmaL?6ka-%1rzn58&j}c%^oj!Y{xv?Ng%*e0`=HNi3 zc)lOrJrGGa*Iq}F9e5#R2Seh6s+Ph4PHnzM6frQAF z`PCz`(4)=EJE>*pocWH|k!3}g#5-YMUXsUc0rG*N@5$wAZ%@e`CkK|V3PxVK>W^1v zYV426tusHk1X0k(qB+cnYav3)JLWiADaqC`hPcx2QXS{7m4K>F$r$EBe_ymz^<%Z* z2CTl9n5i=T>Y{a=h{KYogOP2wMzH0T8V}@j^2)pAHus+nm)Lsu z-b(8w86RDmPC0SUP+(P4x5pV?6`F64!fbJ3?HgHS8t&lzO7GpwK6zjtLnur&qi_D>2zgVK>gP9iKf5~;2lC+XT0x*s>U_LLdsSS zfK>ctR{~a4w=>Zgc|l=9Utw<9=IW6|IiWGmw`|Z?&c3p(=CJ~+km-X1BJTb+cqUTM zZ}qOv>l3yev6B%d99D#ci(?DO0iKPJ`TC{cu9j{=^dhS429lgqKOw z5A|E;{U+*r>u({?uNK^G#v02H6r0xvWLBwBXS45x;9x8dMu2--S*?O~v*|L{EQih1 z9^VrX`$W<^U>|z=$;@%FyR_53#pouv(btxcN~hiK1y-@$SWoYjHw#-^k$eW^%{y!1 zq79S@-ugl31hv$oE-b=EPsg}7aBwKnB2fKMDV84jm7WIkHYpurP^R;B6VbMO1987R zF8MXye{>maWrc<=m!C$X<uqcZ-s%0vxhjIGX;<{lMlFgWq#M=k^P9`6C0o zz$Qu6ZIaNp7|iXhV;LMUu37`0?mO1ABcYUwQuGDn=>OtA6jO*f ziX8iA@~7c`FaDZYr~YH|hbym?M%w~A*+#G(S-s(JuDx1cR~L14g~ypSh^y^+tDTeda2hAK+s^!+kOJ!{xC7XA#0AH@do(>drT zIT;2r-w-7`_g+9?lbZ$UM_liNFi$<~NL!=9-=DmP1pZ9G4KsW4@A_?lewoUgvP^g0 zi*NNPyMe$zZ&?z5B)^V15u`HW6-jxto^V%MjDOlvK)kYaVAVw-$@ z(D}kB(v}-d{n^aGlndf@f6S#Jj{KJ&Mnlm@FV1mwcN+V&vSI4IoYAoDNEcKfEZuN9 zOa@`c@>IP0$k{Y zmNjrhbS9^*-Wle+%A<7JU|Wwgkm*%QatT*B`bHjqqgAyY~9 zb1;$sU5_{Y$hb|~k#B9Ag5jQwxE?P_e}ZlF$A+UcUc%-( zB$LpD_hky8su1{MN`YJrAzYs!t-!ScG#I6^&fkGgV)1d>pUJ;9_xJi&CxLntqY{LQ zCP@ZCZ5ym6Z&=T^U{BmTK|A|kP0I6F@EI@jK9{!|kcnycRFmT!c7s`&AKlOlyZW#WVg(eIWlI+wlY>YQQEk0V&Xfhp?ouvez(V;*U5@LH z@s5rrZn!9&)ZcjvxjTmzWuzVdOKyMP5Xn-u?@fAerYQA-5)0FzXt(xu0xSQ}D=Ing zo3Yur1haH-Ws^Dk^Q@3-FVT~LJ$ydnShT}i3-F0O^+!>2Cw3lm@e%^Em*(FuGc)t^ ze=_p`{Q4ieJ&e?zUo04z9JR+_g7!q}cXhO_WPA$(t>#A0`mXDB%s5i3b0g_ zfRY4y9l+dX6^7csn^YM2BA~DeSKkwxdunait5{^OwyA{6wPs`LNmq9df8Q%gBM``)b8i7po9{l@yqD!MNwf-;oUZu*oDHOZ2VLj1wKzt_G zn?YNK_Q3ZJmdkwD0xmtW!YPg1UW1qklpU$9(8PD z22CfKit?MQrJ7XXOtL=OdD+)he~8~0UeF}4v*cYHP$~B__+B2Uece9kt(+9QIWp%r zg726$H=c?WG>(a7J$57g^xOpRmcsoG7K2N-4hKB=X~X^~%jxK;Jcj}OZ8kbH*Hq!o~T@?tG7I|CZ!@1h{MW8CCaDI)^^4I=f_fh3+K@k(fcR+R;eKH^q^ zqUEFhE{0GM z31RPlNm>Ee8Dy`rK0omn5L_mjgx(?2w6BzWsl&f8?Kf0Gh6>}2?%Jk$Sg=guQJVh6 zYX95-#2%(}StPz4K=i3EB@h)~onJ%WK^7Z@SX};KG+k&S55y{Jsn39Yo+TC<(+iKavE3-(S@#Vehq5u|_n)H9Pq1u7$r5Vn>uFiW8Rd z9vs)^!R2mahTL}Z_x~2((^~HBDvnP^_`m#;}sI96Zq$viLPp zZoXO+{H5Zz`Cj$96>25(cE^8!_*rzjRyN}He}MSAiz8rK?WLmSfT#6Xz(oE!fb8r^ z`(A#;>wHh{sk-Qksmq-;sB;K>o0GNi1KTz4G5$;nn+Ztr+|_5Cm#t9mwfuILcx^wu z+`$kf6lV*~R$pcS*4q)sLc|!Nua3-~3t_MtNIm73y1KL!mapKI74U->Y9?}IB*vP4 zEbr*ouZ60~0*0yLrB#^%dL!!!!Zv{9;7_3NfGcyWgSmH&t&W>vMkmf}owW)aw=(u` zpS;JGE62S(A?>#bU$+&OEYLoj%6%R58^e#f@`L$m&3GF>({MBuLIkBd0s~%0I6X6W zxx7|RX8Vp;uTq1b5!5D4GZ-U4=FdAAe4qbPUO;kX(B_&7Fi7uS_+p2`I{T-6Ouq1%i&Y@gFExTf>GJ;C(;%C#%AeA6qr^&nEKx+{5zW2!xy^% z!G7a$yY&W7|Dy08qnD>$Aj|nYHYWZ=x+X-b+faP*L1!jdFF*TN63Fk}xW%6eJtLX; zCqn-Zgx_N{1jjR7_rcs_HzrQo@gy6PUT@}%G+w_S4gBvAKD>N55A~J8moxylKjjzO z|Ci~WK=a7hZM|Y)&f^`wM2YpUJ6%Mw6xH0Wfh;A-hm_H0Y_*+Zjvc`1yFRyGItm47_Bs!_&2FNk$tgo%VAI0C4 z5Wl~J<}+U8$8|DG^amCU$-CSG87U_<9|Vx!3P6f`1*KUl92zM-+uWew>rfX=edLii zs^j@|uUa6v<60akpi|&7=$**!Q0;bC8~=&w-QK3>&mprQ%y!k@K}hhF0=@U<7!e83 z%$>Z0dFwghhbSD$c=M}pn!^3j?wTcGhLF)B>wC@gWDY{>+dV*SPR&& zVi_hK-7abu#_8=Ig=$mptnHE$nLX6Ijm!EhJVt9>DCaYS_pLF{+o4CZgg0J}@K5LZ z3y%lBy7++tI_SMaj*XWCb_j%_SIZs=t+RfTyeSP-D^_B%ou4ew+Q%Liw*VC9?pHa4 z*kSOQE5!eY!h1sY)Fcmixl0f~l~Nn|oRflF+(7@|2=DKIrK6M#=5bY*Plt4m2-Tjh z6ytu`K7N-?2Kc5~(wJpKP}k?Kqx+E*3DK%B7dpn6XUDcfJJ-MLru3iD-^gQK^}&+f zMuO+=c6}+|`~F&!>XLkSEN>e(ZVD zBUi34I_hitd1~+8-qEwlz7{VE@pyLR`f|I9OO8mF0E8;~sj-p^FLiV0XrZV{hlXe3 zJp&VoVp1~j%J-#g&fR$)bfbK>#+x=jcQQ!u0kX!sCDwrLefr3;ssa%?-~>iUad@!v zO7fHUcVlQ2gOZLQ`KB|zX!FOJs_cYe2wqvpX0#^yD(`Z?&Q@TtA^LWCw4I;C$vYiB zwbn%3QTxA%{LQB8B*3f1`MRa}fgZ?wTAN?ylG{>y+{v=$-lq2)j^e#REA_qg`t@<+ z*z0T>uukyyH+C-M9~^&KmmL)0TZD?coR^NU$i3L%!p|U?#HvB(L1c_4(+N|M%UXG& zK!4&~j$nS&a*p)d8yxR8#omTD(L+$udU}a0jJ-UQwX)Wwl9Xk@j4jg9oczvv11Hy; zsvHV%0ia1t9={uez;AoTrMPPtl7q{%JVxjM)8{7ZZ1WEDSXwJ zJPLCkQ~3s2HgrE?rZss3{G@}yx1vvUEU3Gz$7Jw>&Q5c`VEdwW$p26uV%lS*>Hje;X@pQLAh&d~4W_v*~c;EoX9-qr|Ffbk;> zeM3Tg`UU)lp>y@+HwvQV_)yJvz)_-YOEPX_MbZoo98_b(})}!U-A=n zu|C#KeS;l|8gx3oyaipZcXN0~ zg6&SlV;;PHHju!0ob~N=#hOU)KtR~>-pY<_ou#&_QgA!3|XgRe?$1njh95*`hD$PL;?Gw z2YTi$%>Uh)&*ZCPNT8pTqJ-f7q>i+|0sO;!6{V=zSwsAP0Qjkf6z6{c{1?jf+nw@( zml1Yg&*A>2c_H6_+wV1;6ueDZE5fq8s&uBqQ;(;O1d)&ywEu|AuaTqNo{v}5U8+E- z*AIT1j})D^ri=;zx0_Wg0V(Dq{}X}F%doQT*`supEZ<`_{>+e>s*lnPUGnz8+`e|W z$ZzfD7vldj`$KSswHRlL~HYvM4BMtUT z_H5rj=jGf9z{(aX8jcnE^43$o>jvYMC#alQYom^o0OM%)$JgCn5DZjQ>>33=e=z#_ zgxj_SP;+ck!|QM=YLxLypyO)JM7y<^)E9>nH{&Jcj$TdS67>uC1;r%11?hs$xJ#G$ z{j=VWs-ow{R6n3eM@2su)E_U+_VUSwwG*U{8|QSz0Rw{KW0 zLBXT~1KaVVfuzf7f!4GG2ma|W_ApZ!stA!5*9;{uIy|F(QPqQb>YWqtv#Ccr+4~(>7H7@ z75HfKp){m?*3*S4U)MpZ5InWY?^8ahYxTJ~chiH&t4f=u&BJ4UTO9wjG(RTsX`8gB zS{}+<9fAQfANSa{MS+@uC4Lz4`hn+oOg2&^**#hB*R5%b8FiEC`#~mU+ejR7$xt~t(vsABs6Mlw%ZJsP^_wA z{_7?=B+cA@YVmY|#pHfZf4UF<7d92mPE1z?3y%zEJcT(-it5BwO_&wi(%j?B; z5iyvGzm| zt5_$BKP6Q$rm%_{`Kh}tG8*akyo9h+7#GesG@pP)3w4Q7%U|(2rB-k0(D8KC;f?a1 zFLxe)3`4LN%y7KHMEMp7u4Uk(ztQUQtqD-F&yOFvHi)b?(SPCiF@AuY6u&)PMWWc_ z8&~*2S)a3fMMVqQ!t#d*Qs=g8am9iFLK?hR{Mmi=O|IG^M4};bX)4%}N&$ha%fR~? z_ImKt&|lGmVD6naYT6H8SDPbJ9+!vHZu5Q30Zd@Jv?}+C#XjUceePdWNm+b%oEg_T z11aD0B4t`{HEpvxZZ&Y9(IT;H=rUh7Lbx9gPeJfsjpc7n#yq;8*zhQ0tSR!*D=t!~ zbZi+{4)2=h|Zn5A8j*nGp?&704*C1?AB0ziuQO z4M4Pq6oere<3SK5-UpV3DD+-LQ0CP13_9(%^8OACvJIk9FZS*)CG%^rn=z$XOnsT3 z&tPy|tlAuTM|zs(2cU%#Xo64VqI8eI9E}oEi1-Cwy)BP(F?Ju~U2#ijzbnT~M&M`G zQPf>^tRaim35jam3#WHyUIvRkufFBV3B35_NBnbG5496SBL+Fa(3B=^H1+8Si>u22 zpzTfEq449rUy>GuWXoPELJ^XErbQ`=>{%z-w&%gpe!~*|)Ke zeTKp8GiUsk=f0o&IrnwWxz6+a3$AM}GvC+e^?J)|tPf(K^&0}${1#M4ypEDEy0?_l zKatKr|5}(gd*EHkP?i>JZ_ZD>BrGd|Q$I1^UU6;@5#vx?vRQ(j_`E*L2pKU(e;6_j z=aGeJM78+m8Vkmj-iBA(u2KX~mbFy- z!=d?2P>v+>dj~Xt+4$WmG9qsmYG_5pSUAuKQf%pQo7ePktRNetm%|@N%Ir@`_)c0>A1qQo{evM6J$C z2B5d^!}d+2V>Y{~;UJeY0ggt6vuNwSUzvo7nf!dmg7)=5`^)4W&$jMBX9UF4kER~) z<;!a6zi(o)!HE9o6mBh##2%9_%xCgK>;`v2PW^Nm6Va1$ku$(s2Rpv0j@1m;c5JDK z?l2)3h#o5mb64(UAbM}ApW-6#Ti0rNIhk{!{mO!^YIwF1_!T50dO!D9^qw-S(X`qJ zzuk6hgyS+b#?xmH;lG71eC5@T2VgMDaJN}MVUAeRtVzE-p~5<<=E-67emV29>CgJ& z)aED0{f?EGJhLq_zhupOlF%yM)u`mAtnW&ldgPtax@tI7eTwINn6QM+Ir`r_D2T~tTI+&_)uV(8sL!Mm;g;L!{`=LLA)?}wqz@3g>R{~rPuhz4p z+uk6;=+4c&nARb0f!EKC;bF7v=4{R9p0H5i#|*?*>s}dWh+H!>oEg%gK0tXp^7xl` z-e$I%@$LpPYbCWHs;H-Vc14%@Fgw zf`ZU@A8#e^1m;^Mv^22){BI!re&C|97p{_9k-raM(|0?R@(B-i#Ho8%i_Q!OC+R;}iL<(x(Q4o|4__S6 zlAma4jg_MdaJr2xDTZSuY2S8&Kr=mqYY^}JRj#P*u9RGn?6X3`w_8(I^cyhm;%%80 zBG)7r6^C}Ueb_FbNj~$2B=p#1oc-G$X0N-CewA#!6>r}uK5z5HwS55cuLZ; zu71O@FP#M}-A^uSYqB3dm#m_kcK{RReccjGF{LX*UZo&#-6uJ-6oBN#46*-Qzpvc$ z-w4k)_gbBON{rVoIgQ9UyVnvyt`2dI2Ho1=h&a;0X*41DmK4kqMG6N^K_GMdx-COU zo$?r2pt_gFCy02dj#HULwz!>^&sk*JCTZ)DWZq;CgnBySFEJmwuav?@c#%eHlhmto z7C>XZQKbI2?aqV#((HayL+TP8xb7aWq>&Z^ZU$H{!pA95w0eOMXi!X9^mD=21keM0x zzEQ|>VcA6RKsQX8-ZgMka8304H^}-K^KztU;*4q+ux!Kd&hF3Fywa61VU4j8Q1J&B z!pW-9Zp>2|X(s?{l#-Em}plM z0qU{!gpuFJVG>j6j^lSaJYO7ZrW~`$twRj1wzq!=k| zCFME@sgms1U)FJG;@>WX+yi8ZzI{Ce?TAnfqUtiV!4ZC=Ky35RT~2LFq`8CDA(byF z-&-inA)o5!} zX)I#1nh0q6pNc#Mw;6Vf{oSV>XzQTeQhf{dr{fX_hV+NSC$TjnEH-!Q>`d}LO|aw` zFk9bMJ6Af6Z7x>14zl0z_z=I(4LMl^AxIx}_&94=G|o}z&)R8r;58{_J948{=~PPE zkq@Otwa@*zyvlV2nuu#YZr2bodcP=3azJl6XR=ezEN$J=TY!a$CsBJ#eK>SEow1#H zWCcGR@A*)w3jH^af7Y(tZE^PV#DTSHM9oSxwBIcLp`NuDBn#|)R#Czx40SB;8U31x z*M3RLD>N{ltsv{_S4u{@r&1smf=Iz|7$b<$&+#$(errM>oJOqAewM@(vCO@p2>_Fy zE=tJva7n%lsgq2q8tu#YXM7&`&-Q$pmp#Js1wO9XdB!L7d6hYAUk=89d>HGp&}$c) zc%84FlAr%#bmL?aG2Oag``!z|v9KFJNf$>(4Br%oxkjdHeo9#38S6yeJhCLi2cZd{ zc(VUTX}_{^^e-T5nM&0*#@AA`i{@!tS9=?K4JBzj9f{{+d($7!x_y581M`N9UHgbOn`C%i} z{Q%-1qYhf%GS#{5haOmAD>6|u2y(Pu>q)L_?cKi1|IM{YtdoSK_xiESAbird8IFzp z+48zAse4aT^a3v}1>bRe?>NRABA39tGHkQ6B7>pcajui}3kwaXh#2dXWw+L?TIF|olfvmpoIhg+Yjm?)JafkD zY{|jVQ{Vq%gnmu*ev4+f+zbo{Dmsi36==eymqD2A6c@qTQ zewTDZ`evOCK(QfC$A!-za8xXFvW4i2&GdXNZI!%fpgYU(@f(5VF-LZaD!K7Zsmfyh zGQh@I%WJ|`%hWyV*I8Pc0Dp|9OvlN%5fP&Gn_bg3zu`j?Kl06QC_m?#UjiXR;GZo1 z*KRAF@XFW0#cL`V2Ox0&<@|u40k)7MB|L?^yElUzsiR`T69Ge)S@kn^1eUIuRCBmV zarmzF$Y}b&n6oTOIN~jq=KWfuN&vU<6>OnMTvVgE5L5oVPDaQZ!mqoJbADt^tV*1^ zSZ(qRd}eQ5a(ubj@V~nF%N3s`k#OJ=@8lczkS!uwv;{J6Ioni+EQTziq-;erIGp_Z8n6i3`JRDJ5G!#K3+J6u=E^k369D zI2rQuW;}U3I7D`6==|h(KutO8s;H^_et87I)qc;18BY8LxBG?pwCKOE${3+9+v_z0 z_XXO>|F+E*)EDv@1&_sWq!ey)J*8DgSF8+Cj1-M?|L_-9sBf!4cSAztgW60rJsxmj zb3C6GXZR3rg@aVgtgS#v$!u5Gbm+z)N`;(Zg8=97f)gQ05ImNt=<_5}Y<&z4=*62y ztat$R;jX8=2}AeqzSzGEwLUoD#=I@|WJ866j^gU%x93ZDG+p@XhtyWBagKm3>wQjG z01CESthHPGSVLgEXRJl^&X34TVw=0cK%$u~(UdTteG%!L$gdgtPgVbi$tqDswAO#t+KJU|YW2|MBD{_YSjXot2)OQ5}Y zQ7Ul`-+!iex+Ye@XM(~qP0X~&G>f^x4Z$OU#zHbLN=udW`INZT3%c^s=#^y7Wzn&@ zjkT@YW8*fyDnSW9OA_o>Q@6916^C6I4Z_m0T zBju-Xu;lH(e&xWepHgE1#YorY(6AnsC{dTSEdD37f>9^>mj-*0Wu4OXr>UogW|4B!_B8U$ic~PjM&+J^4}a+7Y#?9&f@@nkUXf?e}BdZo~b@@kS?363PT0 zxry6xG;74VbFO#bc6E8_^c3Fx zfgAJ>@1kTuN7i9WhvNMwhAGaop^}w?Y4gZLQ<`laQX(q>Y)7F^w?P#sS<=Ty#x^ z#-p$3mqbNzbD^a_s~LuvR>5q1OZEA8QLYsC0ojGZ{Q1+xjeo{a02#p@)A+HPP6< zUN4tZLdL)~EG1bbH3L_86wSczi_@t^{jW7Pl~Zb=l^+xpDN#NIAw=O*Q6!arzBtKf zrKj=w^lj)irp|lo&hX0ECR$U~>f^l7#GA9NROQk~qg^*SuE6jAWck9bLhfx_*8Tab z|6<&gL;SvRMNTxkJu6)Jspw|K}l333Dm<7$|R4 z3ao@T%dA8g@`qo4^yyoALIlh2B8SaVQHJW`X-w(ummEX3Fwtnw){Lbv2hgfzy zGWMycVmo7bex&8R-+u`AlK+ixfA_x??lrakd*R-Bwu2h<|9W{I`u}x#9;mr4bMJ5C z{>W^1qd~e0d>ud>y#5^XQ#2RHeYiZ2Mj1^vEe$rQb{8#6Z={JBWZlUWAkC`hrt;)u zPu|a#v+3?&Rixdcm@*@b$Qu{vMsnPo-bT{;OY&5a8A9ev~ay(Q@O;_j~vz2lMU zh!YHbEKYTAgGHU96?s(Zyh{HiJZ~Pc{l;y?#~2X=lk|O57Id^Dd#>7`Gnt373 zzxPn2-$HRzh?y12X8K>Q=f(8w{~RF9^)%d+6Sc}J3Sx-#pku33r-Qm7y4QuO5F`9z zseSj~xJmql-^-tVHbOqd?Y4q9By9@5YUVf5&VLmE)H%KF^k8WvM9?LzGg3{IO5%eB zAv35|$Vc@vBLd%rR&gU-!-N*M3XZ)#{k~PlI;+&N6({Bgs&wlUZe~= zNcGtsUc{39v@b$}UpEM=NmX9pu0+p583Bfkk5cytucWOISc!`Z{7k2>f>wg0el!%- zUQ6P?2sQZYOR+Hv)l2a>O8+*Yrj91ZERKl1~!Ov_=(bI5|Z9ARXw7 zhSmbwR=Nji^^wOB>AcW&qo?lLzBdohq7f`}U-zwsZI1Oa@|wkDVh`BW1ZoXpH{My=v5mFct|mGsC>JRUFSKd4>sOj>FiGXu z!QC-Va2cakQH!y-+|PyuT1%C6Yf}5SugKhD?9qQ;>y~)GnEFFf%OsvPb#=z()~?q( zWrU0dPj))j?DBNbbZLn3h-(sYpvEr<)&MyA9PcMCZwmZ-kbWlZ@sqFGg;X3Z+9kyc3AY#NF;dzYJ2n(L^?;&dd2aZG3+8Rwm1Mj(@@@BIHks z9Uq@RrK1t-)OnE?-i|&cMRC(R<{DQa@@+dEwi-ki{v$L#JGMG7*h&9!SjV68xs3Ui zG`3jP=`^6$5Yqk*eF-9RKznlBo%v9#7bC!kSz>8;gAumuPnxA}uQ>gkl$*dBJKTWT zO6U#?=ZD(m#8eZ?&=jCGqzRec(!PWHA7OlQ;k%OGbiQrtPSM-AXf^PI_iy+0G@YkX ze?*^n4_?SUrf}_`SnDK!nM6? zZ^A*@X+Qmg3x&J*sqo9kvufnddqx{r#LFkIgzGmSsE(H%ZACClB4vuRW3oNr@<$a# zJD6X}NLum6NK>RW#3~<76!L(C;blt}`dUiv)n89jY9w6|7Ot9&e)3RSev+hY015uX zqjGsIbW~+&?d~qzJz1LfLvj7!eD#sykz=jWSMNlRK?w5+q+tChQbh&Jm*P&olB>#B zrRV*8>=R}K_pSKQ z)}%RmA$@@72V#ZKZ1#ya9>b)orbIqi*1AD?>jB%9)%Lxo-PkWx=pNU1cgUS!cEe2} z6zhX#6#`syOQrej#(-3iQ_OxZ5-bZ`H;AEQORdHj9wm}wPj)e22=zy<`XMG_uu@JLHVQ|FluRF?+aCZzpX( zFfn!jQ24F7GY;LwQ(Y=^U)HsX(XIa+PSi`E3(P&xr;OUeV5?Ji*12a$o`9z%R{fk1 zJcejO#b>6xeV$azsmq?8%~+_G^$vN=4dY=r;vgiI|+`aSCxQI>{WPS+jI|dp0xXBs&t4*+`Z> z4|ht4${*LP2B_>#n0yU4I(O}$4etlXOwd{jAEijgYFqSlk?;^qD1r^-I*$O!56uuYa>3_da<`Jcr22N{ig z&HuKMA1iRP;%#4M?ft={TWvRFg?8>%+)$aZoToJ4)FPR!fAhN6Sw4u3%Vzr;xD)6Z zJ3~o%+TGp2;qz|`;N>$T-`pU^0d;Aw$MD$|nGuV4K1AKuyapzo(;rBg$?dK3I{nIWWmZ#cNaPnlSpa?Vvuqg7@cw_&$Zj;aG;(vbp@;3T{d_7 zvu&$G;(Q}m`#02Bzby(0KHd5nSyR2n{~3eysfPy>9+j)tN{S^DG#pO=v#xNpkTVt? z9v%wylszF&Mo!p)MY2W0|J|VKPQBaTv3!G~n3G7A7bGe<3`Tl0AnHK=`eg@};8Zam z3Y)E4!G9r}2dw#4&L`T56^)7xLoZJL9n6muYZ{{vL7Jv>ueNRS884->VsNN(XS}(< z8T;5R{H{?VvsWp0<~7dE94_zm>UavOAxXOK|6efQ+ta*lOn8#&2w85q1LtxdHwA@8md-0g%ILlx{7< zDQ9+XP#5-L&gpSD^)W@m8n+94uK3VPg~j$D{vni_yZON+P~C)6y%eT!Yu}+3)7<)Y4{{;M5@5K5`ut6 zlIb^v&U~QK{7O673}jNr!AOE6=}q;PiulO<1L<2I^_u+$qt||TxJ=K~2^3X9@@g8^c$R^O?A+&>+r z_D%6g`H_%8=-GQGZTFM!dqfBy%Ng-Yt12Cp@=y1%7_>_(BCz^?c3huBXeGS#Qd=(l z%~0tt0N~Q+BhM%>7qPsc$>hO*a0(1z;y_k**mcrM;k5U$jL)F!mNH;vG{Ayr`_9JJ zrPI?1MY%lhroXw;C!y+?uNcf>sFf^n=NX{^+Umi8^yzZXq4_kHF0a88*&v@HB^sMr7_gu7Y$a9j1Qa-IZ91n`HWh-NJm}^`_eD@O zSnn`fZBMDtgS}M!I8l5}kj(ACE4UD5DzSy=Rj<48UTI4LYmrFDj-R|HDbSLZ!pHUa zj--C4X2MBe#e2CMjAl9s_Vs3p555;hUdJC97Wcys&)`@7?&m8{c`E~oAaWeTi@irH zDly=q;#LJnWs+_JzMk2fAM?{@rWkmeBzHewf`|DC#X%tCMXcsN2n^wW^S4T$v{l(9 zi1~bXbyUNX8san94toj)5aV2}_sC~q_GoPtkJ(0>Ps05^&)x9my1K5 z0&G7cAln+AJXYT@gyl_uXQj+Fx-whl)Si0$dNYr0Wg&}#5aeWZAhC@(DYc`rwms~Na2G{4!S*-P zCGU;~dy{vSap{J+B44R1em(ktkwNVG?P_g(sjWJh)2Zx6bSHrDii@cT+b=*048ZG= zdCg)@TC1Fq#L}E(eBXi9fY&0w9yj^oaXOxDI6OIENu?y=%Y5OOGHB-*^>0cK_3)M4 zP4l}U-?H0LrXcrfllt3EbEXs%iaYS%IAsY+V+|L1yOAW{??mufKf60kR*ATI{$Nz( z4C{M+RZ$1sN7U~Z4i?6$VPb^NU5zw3lY>YGrdRj})A#W|iI*2&{!uH@3{n3}q9?K< zo@*I;Q$a!fyh+<#0yAOt^WHxpCFe9uj0!s}+UK9_7Y{;m7bfO*`$2~u{i}tsvBXM+ z@A=vsCZd=i9gj|@Zxt|MNV{ZLw`gnlM)!x7^myG$Ooc3ZI|adUqx9^@0`}KCYFPei z+0Oy0V^waJOaz|iy`Ag7lVvdE%7O2RW#_Wy<37zx9!0wBoO0WOwl{G38>^O_UDRBA zr^cP2NEXk>@dFCxctH5V+Pgb00gG(uB=Pu1kGIG&YLWS|RR>=Jo}=9_H!O^g-g4IT zdWT%pi#aV*t&G|k-XJGNA==5C^2xWX;ERg1!5Xufmy63^SLPZ&)rvbj>d=2%2Y_^6 zEuq7T2B9}lxgX_hx=8WQ5uY#k@Lr>KP3zw5yVqeRfLE`*#BYZp@L&vAcu-E=;UIPh z)@8ag)hwbHGbymSTey%Qs?M=>1UlIakG=}rZd~1ro)NB`N3t(ep)cis%6$|buHTB? z0OW3oCU8BUyNP}_4vHbsx?8kS=Tf{T+!0o3U zlBJ|}FExG6xp~CBLuTKxpOI85r^gBDm7{xo^#BC&zrm_&oz(({Cz5^%EvgDI4r>06 z=j%~avihDUT%@n0dsl0bT%`B{zVKCcnO@f$kyJ_Nlg}z5RswTFrCA539~*1WRWsut zhB&OZ80+QcLu_C18l9jqd*`hsS=gVxcj*?q7Sf;`FXDEPb?4j_YhVS8BZXxkZo|o@ zQx^DtjN97`A-G*$5$#B=0{`=1{m~Qzf*$>d@2d|C+(J+5}DsfnL+dvBM; z*VWWQWzL>|>;VrS<9V|F5Zi%lB&z9jG?QB?LnWc>r@W$8H$`Rn-OSERd!A%A&4R;fWLH;}unzgGTB?Gb|9 z0R(~ZwBG~5lD1dfiMkJG%Eq{hkf=B>AGvM>atq2?f>tKTv!Mo7f7JhL3)WOVdnijVmA*`&p>DI|03!LV}ZZ4Us>=;E?z zfm6Y=DwtCc7qc6D`^yh+u}1DEDT%E&N{f%j9Sj=5ir2lvwnFUxmgtpWO}N*840#Y$ z$)V&P=)kz(L3;z)6>z`ENhwGOfnp5W?>-x`yJybuSj49T)|m|V1NFac0%0Fr`}vq~ zCvVg$ESS@yT8X~T%6;r;uGV4A+8)BrF#LJk*yNSpaU`{uh;)Bkynb@8&vd+(4!kOs zD66KQlXV;_4o73bahIsFRhF~cVC{@8RCD{Rda#xL*Sf=yK575ncRZ*4y}-Ww*909r zCUVh>l=8rOo$<7khEyBw9TrXI88O69xM_0IE+ zZ2qYIi^1cdF2T+mq7o;>&0Xn zLckGzAYkrw`p&IukoR(}!yEfpO?rQ?+j0s>)n!uba)TJjI8?4PQyttd%zpbr2ke9g zf}s>VTTgGt&+{8lzdW&>=K$T7H)*rVWEAvAG&n_^$D~_mR@{>~@LBJ5zGeYVDu~C8l8w zqquicP%=-|3C1lBY#Dh~Mu1VQZ!1}-HYv1pb7PX1ZFPS^1(H@f_Bx3G6K9GK70bRQ zdhs`3mJHuuSgWexX_j@~0FxGgSv0-10FtVIc%Fk@D2ZU^snlk8D(Dva|3Lw)UHe$z1zu{59j z(La9hAQQd)H=bl_I%yD3+ExS)E9RD6-=;P*%lv$NS;<<7!S0Fc&XswZU8PhF*W|R} zsU*qg!l)O;XV9!kh~oVT==ilrouGqEFVX%fH$-VL2TK5pTW26a+w{)5&F`TFWO~3# zrnJqr3t?6RVI*TPprQDuT;H+14nKjqts3CCj3CRKvc1cN%&2o@ao|J$dH|8hhKnD)w4n;d4$|Ig|BK30juVB^cMa#}Gmr!wv-v$ulK9$;aDp2Q^X8$}?#kA2sp4q1%1$;|Tm7W-eZy~DepeVr(^g_lK6 z8^o6QX(-!gGPf8AqGP}Vk?hv-DB~X=t)uPc{&6*$4fw-k{c)q$;82{m==l@D{O+$6 z`>Mkg`}&uo3aMwnrZXFD5w&yS`r-Y}`||dYRZ~}e&X2s@G-|jrug?8!^mg+lieQqa z?oOgyp0`BtPxs9GVvkI7hS}s~UMi@f^-m5U;}p9Z6%EqY-i&+7I?-(eoc`_PS8HUE z<=Ty;3i}ehZNG)krcrL_$*>}71J3Hw0p(Qup9)d?)72~d53A39jrlC?2(BLSOgMf= zsDnSFmlG127k5l`$IaWvB4O#YBIIPSNs0gI%W9XpvTivVMu&eSLgYPX{Hh0~Z2r(; zHQs{>4yry|jiNNVe!ZO0om-A3<*ga5&EiKcU5F^F@Ae-b;($35@&le2i@)LpAAqr* zEoQleI)6g5y$0%Pl(Z*iCEtr3*Y#b#@$#9F$T`&fUNa;Yev#%JF_lz`;uAP#%lXm*k>}B9iXv^7U%{}YonF8zXAvYOjq^BK# zV0bj#v0P(Zu zXy3$vcwljbnJw>c!G5MG*jx$vGk8j&K7=UF!6CG3=OzD(a1U&lRYBa4r)B zPTFL(r)hSU>x!1Adw;N~NbsKm9wL4s5d>9BROK%wCCrXrjl;-BhQh$pnaPEiXr+CJ#BHfoPIm>QZsW~BC+iN2~U^Yknx+uXI zi61tlOiE3V+00>>|9hB{v`<$(;jh_yD0beYT)hKLVJ5uPciws9u{Sh~6{n2a-COv@#*ib?Zu$V~W2eln{oq{AS>DggtAR&{f zTiH%W=rmh#ze2IHF;6g7nYPj`$F_-kvYf^3lpLZLg{qw-VlvNNO9KDaSBrpbH-T=M zWPSd98`Sk;ce1vA3GMHH?{3zOYGM5$UT`%)v#Vna@}O$emJX|`N*Mizx)FBI%>PD#K3+DLQtY_Y_!Fpir`4j zD%ZzaPZl-HbxPGD6oFhhjBx({jdL%~&o!KmJm)|5s!((z6QQ&Z9KzP2j#r6UR3ERkrv_$S<1BEODS)n&#fbXQnzyc z7C-?HEfk6?{HS$h%dJYrX>f&d;K|mQ-GRTXZUh67u)Uz00M`Ct0cstUZbC6kZyBzH!c{>cXAqru57k~ zN2RA--U@zB1Wb`mcH2ySW~yKo1MMDbAkOvgylwS_82OOeB{}|~`;{`d#-Id|rVQ(Y zS22+^7_rm|0uIe&3)zS%G|EszUKIkPr?`z*)&O`Rvhl1t?;`X#PR=Ki7i(>tXMcS)5&k<4u09(1Ml z>5xmdCysfPjC;F0i-PrX<|7S1aUpmX_|3qi|H}1o|8jjv#W0>(wNrQbLY|mZ_6GzE z2r{G7Caegt=j<4{e8qRLR2}anN2B@8R1mDGf{>Oq{>OE_nOcFOMhK$J9fnncB(ipt z#sczZiDdlX+Zv~(dcNly3Yt)cGMOVq%1za=TiJmu}LPR+w zii|X*d%eRxh;vwo#VTd25(-zA6M53`!L7v2?GTpj)=ox%=04v^Z;|ihe0n5O4bxlykl=+*=&)lo zEVVhdr)zA>b*7^5po24ozzLUn=>e!7etyb?=3(HolaZ33sYLCQV8(4|by*NYY(p9& zl<9hzt*)c%O_r!%Re$U~N9Kbs^bMV#mUDn_Q#DX1F+b;`%#}gzk56I{m@8}9Np)xjgdsvzP_K8FLJ;9^Y1?< z1;}lp68*SHNkDnBfXf=WGK7SAdTl@NlRgKrVjgEdAly-z`D)&~CgJqn>(gzlnz-@7 zied;cRbTqEcl^dhgRix)gOj7&nSr;AlrAV4Oo@{-o336+-&TP|8Gb?Qx6^y|@_UmQK{QC;jJ7mFshxex&YgO#QteJPb$ zxp2hu-DrX$dqP@E6{Sm}o`2?#bTmN8wt^j}u!)l0@eN*UQ?B?qK>XlU1^sZ*2=7ugV z3?s84z4Jk?NK-NH2W@a7P0)e)@uqyJ>EQOnkt-IpZ->s?7#}1BFhOtp30>ig2u6~NaHp`z`za=A?mF^T*sxb!-(Y5ys|!^BQ4-`IZA@aa)Af_ zBHf?vbR;_~BjdjL>V{61DJ>DCIINE5FJ(Ar7?kR-Hl89 z@<_@@YJvU=<7Wp3h0k}}jX^~l`NfCVNG0ZF!_c#@1hZJ?jrs#u+5pEKEks_K2l1`< z#N&JAK5xJKETx8gw5Teax=y<3EVqdfb_C@J-VnBQd~dB&y@}B7ab0iU<$_p+0=+*5 z#BZnEy(v7p8QEN5hX1I!0a$tCn?HT_D{@*D4;?R1e35OC{|YHjNx61UuQ1vFpPr~Qvg1GSESNAdaP3Qnb~{iIK_e7)({UD;n{qnDX+OP74ibb0Rq zREU+fvPU)3cu+YfDuOeH-wX+GaVK3~PHooHn8+tHFn;v^it&{c zeMb*DK2G)%d&XX=oX&N?)5|Fiha8`fB^0OuT+HI$r~UX_x!-HQN5hu z%wBTq4kt#8x6tF~R2oBim1~Y)7@hHZ`Kgfkm`U5SRzn;d2xv$d`Xu?aAolOgdqtI* z!_E7*>$hc+YtG^!j1Af{1o+Ulr>5xWJ~8sMcA}E_DgDTHU({an6Epd3w~Pleq# z)|&VQ3f{CHryN<$+2F}~T(7P&AKaYN^!3Fwf89Ioqy3i zA|zO5leF~mKCkMg{sMZ<)(Wortgm;STt&O`S`M2s)@Ipo$Djk0waM7M=S))CQjGrL zbhqYR$%X509G}~mu9rwKi?xVC)`7&VTB%M=@QCrX>r_$W>lCjm^Wl@U^{TUuj3mC# z2X{q7{qElIK%(h@wNmT51IGa4jo~T6{fD^7v0I!VBG*AzD>KJSzo<~q#`2g!MrMCH zhIl=_?@D5bOCaN~n|jamRn;FJHVw~#`+v9qAvI2R+i0OuSM~$-Wzx&cWO%}DIWBM0w)-b^$+N}P_iH`FMRulhH?77|EdihW8B6w$U$?y2U$*p1 z)S7cSwLqPtqNhq5NTG6(vG}A=b1$5X8fAwSX#a<{=U+`+xLmJrRxFjQa8y^}kljBD zz!e7h$4n_h*>-nXhuc(ZAL@au29BzYdk6DL@9UyOQh#+jxWpyN_$ZOc%>NeH5s0u*P^nZi3%m{VSRPq*ROc_VJ{ z!D`TAAmrEX7s(+}$6AX!IAxdz|H>3-n*fL&VY>W>mRJ=ZY(B}xK}7)aTgX? zhp8KzA4%@EV>fQ@o6R&yq&XGAU3lxWH^k~>>f#>KTNvjzxU+=Ut^(H&i&by^e^x}e5)ogo)>3T2D((* z^_sBo#zyhfD+uwFH9vU;cQe-PW+#4PXPzG)f{b2RSh(j*sQZ%TW&`K)ySeFkqsbF) z5d9%gRxQw_uCjMb+2UR_$~(cZ_jc+|zMOGg9KF!UFj$a}mG@PG7BWs^QE|}{{<8n8 zQ9`(=`pw(#$z2yjS)(#h@9L+rw6jyxb@8EsUV@+zqJ@RpX zD!H$)Xg_!ZMGaYc>6x&t>O#+lgh&0kKT8=DXY}qJ19~S#aElMMvNn>4_N||V0&yYH zHl_Ov{uvco@uJFSJon~28t{Ly_U8Xk@c;jB zQYjTl(t@cZWli>NMktjS`_5QGk;uM`nUL%x*_V-h-zD3O?E6HPtYepTFqj!;Iiu^k zzVG*EJLhxG?feIR8Mm3&{dvDX7?TdlNR*S3W~ z&prg!!(>dDq-dbti>;m%4&SF6@y1Ix5(^;buZ8KcSfy8An$Mhz@?NM%{vEu>LK;V7 z*#SRhW?aeI`r>C>S1~OfgL4JamfH9(6^7@dqZH@67fZQko84Nc7JD>KFANmIU8(E! z%q}U+@J~T-K48tx)6*`bTkEpztjsJ}S2<0Dq#cmUYnt>@YWjS_k@mUqj$5*K-vKPkS0ygCZ}&$n8PDD*j@BNT3?weyw&}I9SwZPl z>^ln4?eT$SsrCx;XJCY*#Jzl3Tz>@=pMB8B+`c9W6rYL_*`vHtPkEDah=e+|lY~ik zD;^8}yH(GDuT-&!EiJ{6ETLNiv$c0P#?Z+VDA>qL_w^X)O)Oh?}(M*wyPIU zQ(fh+uXeWTzBasuJ;5=;gOaeE(BS7S+PWrj$C%v<8rJLh5K=atydM|Fw!YRoO`b7{Q36d5F(fGq^}`Lo}^3Fr$WlC?NT?JS`}D=x?D8$?pm;XP8l+D55ZpnbYZj-d zLt2fZN_{xSATo6e0~Q_(51Zn7uwO|2UnffXiaFe|6f|!ycMeUx}S4 zl*>^r9;h+OXK%9Ft`EgBP#IrB^)8?~cLuk&3|Mqkj^{-uLTmzxovLg%_i!^Yzj=XF zA2Wq#4#j9nOC!z7)#RiruuF`M>))R}RrFEf)Grt3ubp;Z)u*cJ;%#1S<3D`9o{;9~ zOE(PwYp-g5Ot{)2Z*Mn*%{puyi}GD)^~QkvK#vERhu--$e$tl?$D;}8Aorem1(d5 zrL8!B)t<=PjtU!k%9}a$ht59<2ydl*c=2|>pbV?0Z{_8+|5dfe998W#?)-AeeeadW zou>Uv2??G+oVn06z$_v0obn&n;kQMdE)ZzGGbb$w)5@O-Cv~JTJLr9dtI_a z&_`;$96NStlA$^cif$F>!x3ifT}1gb0U>WCKnMt78*U(~Jz)QlC-3cLJy22TSZR0G ze`4?0=>$!#=2_XVq}+44OB1y-?Rf!D`t3d#=|;r^Hnt+Jt-hSU^t|fH?RE~yf*PDA;e`#|9?@nA9d>kq{fijC4K{(uDEiXN8xMG6)wsFJJiO)vfvT{9A%fy#s7LU z$!l|-Jp4Q^7UCRfN_k|6d;DX$7b^*Twtsx*pCS7p+s{;A;RtzO-niIX5_95;=&$$M zV|0UXEUu6zAu5P-@e86O2WNPejc|&`nGm}H7`dH1&NdooXPczfQwy1!W=9`m{S+uq z{$}llGVNT>E+h7TP`kZ&(*aZtgzw+eveR7WELL7nNvBVEAxke1$LOucnx=L_4(CYW zN%U?}H75=QqGf<9?=(EIZoj8Wd)tBHv@8Z&+{jKZxv{7=_eA5@oh{Z!BAvfKV2vJj zC*D*`4=~S#T;O_V*JTxWrR6^%_Ln1WCC7hVoC6SQKk0sdCdqRi<&hRKPuW!#5{`C+ zPEHagd`KBJ!x44MQQoPSP(D*MzFsuAUkNKtI-J0wJ&>Hpv6mO>-z+{We~Dpxy!9Aq zt32)28snb2_7_~IvwS{X*@*Il;zs%FG{u?OJ$>{WIz0=FnaT$Dv--A*KcWAW?3tB4 zt}`uHmdat{YA`oOb-|oKy%#I65*?(5=k0k=%3>1`Rz=K$+O1kF}jWC zTZ8mA_n+qe?tk|4ol)MMRZ2-I0|=IR00cD^h_gJ5z*q4VKMat%!0x;@(|q36ZGIL1srwB4oO8JJ}=N-|g+5+$No&F4ZfB?6;ic zJRmS^?>lz)zpFgT*XKEqd$2ZP4@=exvx@;{dbnct;w=x@x4gU;#-mDWbov734ih{Y zQ8Z7o&`oLz-Eg)*;?pg>3V|iuc5dBDl~ET&9Bwk^LW+5nj^*MOFwlg)QbAeVSS{s& z&{iIEgQnB_arS zf7I6Fmy1E}brRB+jvh3sj(Lq2t$b&~tb4KY(^K?nEmd*o*u&=$08*Hz3~5QCd~ov% z+NioS$HqHf1N4H=2)SOI%g$LLi0QnLdzo(AmZI!_{H-m!v|DQ8iT1(Am5`!QC`-A75_iN;^lMH{&#^5w_HpMI5;R#CNrNBC{2PsXzGiXz(VrOVS9tW_*)0H>;2qwl2dKE$E}&+kBCOI@AEQ)m(dRbPXsXNA9+(<9my&P4?EPh?05WiLG_~>jsUTqlf zMRaFa0y>+}{nfA^HFX^skl793g*C$u+2P-#r^IW24}i(95!0F$2rxT~*dc&}068AA?2E4NvFjV!vzuxaLQs#-MWUTn<>ce99WGq-xEimxdAW(h*2?nC zYs>n&Xm-RwfFLrk6@AkS^7XpHS;Y4EDS=a2PrR@G5Y`misd&;5+yWmuLFfviM|@7Z z^hQ90sB=?k$A2mN68z*j8N`1{*pI+ITXx1yPzY}L1 zV7BKPyHeS|zNR92FWl}VQ;W59 zR=qZqL6lS!=M8hCN|6H~U3Z zSh(CtD(4N04IXxcV%RW2TGwE2*It`#k2Re7_=l(`o1fWvkJhs^!!;T_$FcopPEP1t zWPPqiH%=R#=SHY-i)V5JVSBqa{a+&=8(l=H|Fb(^y8CYl`^Kr>+;gt#a{CA<7%foo z(39O^^y-l&Zm3t> z`=MS1<2JpDD2VijsT-uKRwogKR7Ce)Se!>CXI?(G?e>z=c09jh$dxUU)jNNNy)#K| z>#o@3*1$p0nU5HW!l_MOt7yLYgIPj0mrl7RU$~gtkRjxnvoO-4&vt+wl{Pdql9mQF zg;@X1)C01st1fFGL)c^GS0q7cvFA{Cfue!=6%zho{n$91tu6pREUB61*SxNsA+W>tS1mbX5YRzVb;G?c!q0dFJ>#=s5O3m-I_|g=V z92J@8M$o|{oi zoA&*5{+7|<$c3jvVp4K?<7DT~54dD3ob}Q4HEjK8A`BN+gq5B9yv-G|9w@tf<<2HA z6z&xqf<7s(=o0DffA+P`uz>m#qZ2X`iV&; zi@=onLx0X!a#u3XyAjyhWwJ0Nn>-5RX{oshYBIvV7qxHI^ey3#ANbhTzYPoUD)HqT zc)DLOcHVQpmTpufAlUnjUc-}2lJ|oRlt`6@$+i!uc<+xEzlpJFeq~?0sJ*(Tqu^D@ z29)C(VR&QWEo6H<_HESe*sj@6Ln)h+r80`%89i}<2j8F_KP2nW_Y68bJ#zefHH0J7 zpm*f*|7iiBvY_yi%DwZuX><(uey!D=8N<@GdI-fgUgAKy^7#$&QrZWIgp;!X z2)koFil^21A}UaUoqwP-VLV#_L|n>E*f9o zSOy8xy`3iAA{_zz80XoZIoXYU_-quY4y%koL)+V-X{ zP7|cU)vPRac^-qNnmYxK7J&p7t9U&@|rZFfA4)A zudcv5p*sKBSGr1zr+qdJ88rEA1->kKgwqAnQ=J4Y(1#BMF%60#qx@!SFZ7wK-|e1# zuDsWkpKO-<=;C4LuNc(HAw!GCrC}v_+O!tjt1D<(XGjQi*n^^IhwAd&H3|BguseA_ z0DqB4Ph#oxCgfuiKVYTnp^0Zo^|~%&8j6fTDccxfzuXtV%08bpkFSI(##%0~{kRxd z41Eo>;-!1#?2PECxm1&|Z~9DRuE4ZgLDb#3<8cxgmP1?N{J%%%^F5%l3&bp5J=l(? zZBj{KWg| zU#@&gBe8#poOpN^HF#sUH%Gk@o%&+xaN@6=J>ww%*v7s3l4)$TPc;OEm!%%b@_!(^ z-4SHZ{<*(nr$Qh5Q|s6_2(ig5XR&gPDdCJ9D5U5 z?Zdi!fVFAoKQ?S>Wu|vuF3C~M+ijCg$5%5AV53ZNc~H9e$z?qeSCZrKj+D zV@~%=6-KF-aV4}D)?x&0g5LCJ0(?r=U&<}?)s2hQyt>tffRwWros*|7<&a)%SP4e{ z)&{)#`20r@;=*x-iQW(K!Va9|!G|mjO-!t%0o0ot@h4N%iFd{5;?#p7bc9c*EzB+` zAEz1e@6(AlbEmPx!X-EwWRG*6nhKtbziIGkwq6=P(A~mT0(5$U-cc>1MW!{abM{)> zlRpd(bexSfOhhlIJ|m1$eQyHZN^e|iqhuRS%g*V1KNy5pzkp3r(4JSN2RbZRJjAfL&Ac_=pQUr-(##@Kz9&?_+2_ks-=e zoId;sAbiKx+ReJose94@A8b58(qiLvP@dXmA0b`N&xy_(x}RP73rd)tCh^{x8FcuY zwWt3in=hZ*VihCzv`^xZ?}n=Nkg$)#L_?>^C1=TZNoD38KfJ!qx6VFiRg zKx2`{_vjayO-9!5y(LJ80RHd)FK{CcoyOz&9JOsShIczq*-{ z$hrlB<>#G3`F*fHHiUDud8lyl<>8x59YLR&29J9>*g%rMOf< z(Yo29daN{0K0_wNR?VI4p2MoO@d5=q)f&EemqaPRt=a-)#n9X?lOpxx`}h>#?o+EW6({MV|Qsvei*jt_2|20zRGg zbB=vvoQcATdAy*xXwGtE$h(&)zL4ncgUwondeW`j8-G8?YTXgR*_+1-mmicbABtv} z*DbxV9s6coI_an1#~r@&huO`^a4Xy65w6VUCLp)qq7mDuJ!)$F%}N_#;gr63RF`hJ zug%-}vmM9uNI!bzdDQneU7T@!8p2-E7G)qXpsFg-r|a>~gV;0$p3bDJfsjH7%v%&z z*fhq}EIItPs!e#40bx=5Z7nB<@mD-K`Wxw#gb?fv4Z6eF1PHh0DPHXR;hT%-#b&JZ z)BMGk*6r~~#<2E-cs_vllaqD^m(1R!0kS(>q8y1=Ja=@jH}wLhWbjI>2*OJz4RT@- zp!-5wGakXWgJDd(d$E!qro+D#EsBEDl%>AUcF=0}F&xCBnmx}TSoN=({lA;>J~i}B zjW0Lv6eOc$?_+tznL&6>jfyZ&6v!&sk@aPvB8> z1C)!pxZ%7BWSWMOev|di>|YwN03IQC3I$+or>7q6D6Eoy7jos>TmVW7p{P8WchI>`RgyN=Ymv0r{Dp?6-xo~(+p^nN-p%ux^in0xtJ)WJgQJ$E!Gk%?|} zy3igr&+3C~N!{6Azn-A2`_Y56+_7aV1teboI&lSX z)Uf}6X2hIa7k7D*FQju;_F=9kP888)CgYE7X?#|V+YCfA#VwTr!496=L)xMU|#n@wO{d49%e3^#VyKHpH z7}E1$=powVQp`Qvg!pV_+vtbgwwqHAOSb@7vp1B5Tt;)2Zw=q3Rc}7i?P--Od=9zr zFfAsW7u+fSl!0*)aM}cuW{eI9#9QLnFoKu*!oH@L*a(1a(D|hoDi?iD?Ms+ zkp4r&D<0iLpm+FY`3@iCHw?4T^1UN`A-(#u4Rh|rIw~{8rG3iJdR4UYB5JarWO%*n zJ@LfAo7kXIF8=O=FyT@Sud;QX4Stgm1o%m{&DnQ`r&enpN9;{gyZ?6Kk%igKcI!;l z3yo;<5~WIlu{9H^-oS8#+iP}W*1iolf7hP|V;(I(9h#59Q>q@MY#s6T>_5D{PnbHb z8{xxi$~W%J8-h+0IsU4dw+|b-pP;(36)SXKoHOVrC9JeIOQ#fVXrZAHJ6EMRor5mI z90YJ1gX^+pLPUW94cUAn7J_Zxh2*`mb2mksv{i?1YK6&>O7t~{d4Esq`fYiciAdVh zr;C|{xLja{c;!9){7dxu)C-H-Um4?>o8cfKcVdZhKX@8p)fCEk=-#+{$GgFa z5a)3o(n?5G%P&<3jnp`MsxOex6jDV*<;Cy zt$I2b`vHLW5>C(*_BIk2x?0oWLM$*fkb!OG@*jRdk&K0ukFM=3fZ{gvBXnvUYR;m*c-(wbk>zA?TT;3TlXe@vZA>&m z7<_Bd*LbdbU*9$s1`~5!`ck>Jf=&8CD?le`<3$cOs{3b?)h59vMCFtxJG578CuN*+ zJPvggsMKRkd=M0tJpOXHyiZ%~r^0Rwet0kSZ4^@bOsDi|L=wj3cHAMA^=MDt zsbRp&W+W6s+hJO|dNmb~N71fpHg>1Tg{<2FQkcw3*dz`YxFKrW`nMCp*u&-=KAy{z zid>$J?ox8>-RYyv$)~>TGizn$QLGM)@yJ%k;-^0k(IT+(+$noiQ;wJ~F7I`!GH7wVv>^&D({0_!9S#Am%(kRFy0G>|MC_S|!zK zLW@&=d3Q}Nsb&;esc`nQ#3_Rld-wc~pDJ`CCY^yF?a4<;2bS*bZHooIqZ7$oI);d7oO4#ZDOLenuptL--U9La?0X@uf0+x&XdUb$#SE zh|!@6Tifm;VHM=)G5*@~zon|R?yqTH1J*8e1RY#k&l-N0y&7{X_rk?3 z!#&IDI}esPzDI@!$pkTX3+Gt%Oy?^*-Wtm8AL95!+J6A~=7iNe4Rb{_`vC5vP4$H{ z|FYo?{<7g~c2)o>vZ6fRDLae4PR7g9)RLgMuR!>GVbt;H2^wvO_p{2IY(}9d-xhAd zxRUdZ-34E;`s2gTGM+x$NOYq8k8vUx9i|gK5S$3_oxNQ-JjTN2v-Fs|+f0P_*@_C893XP|wNd09MNvRlmasrltSET%h>c%UzpT!H$@A&aE`h}vz{Z_R zv7eXrba?vd35ZM4Jl2j&*ueEk9*2P6^W4kKH*wqhMTbHXGHqe!EoWJEO|835=uUV? z#z^}B36j%=11;EQ#T$t(#jpGRO4<9~YwLck9Ny%ALIQ(xdKQ@#!)(zi&^JaN_!RJniW@1MaMzTO^K9=k&cNz|x?VwsLs%N#3?6_eTdo2YC%f)v0 zx>vK<065;0qfi|`nB1Ix$;IBg%(GjZ#uV+x&v9tkSK%_j3q>}0x_fsWV}1LtNIl_y z+l^aj!L=NO0BhAxwLFX3l;tPf&9L1ahT$T3ubJspZL-=}rnK}J@%b`$-C-3@A)lB9 z=1>;dZxgn1U%as6siDp-;BT%vQhq<_9CL&&w7BKB+b#9qDfPJ@OxNJ~^xcyDBvurA zZ$l=|TOK|`bm(P(gwFgZisen7%UHXR)}a5Ki}jxJ{JD`_Mf0bNSn!BMqc0cbGxlJ! z&$k0q$Yor?bkj~cGhx-f2I?bt$pls{uiU&7;X!?4+M3+DkKo#iy;W33E+M|4!_H6U z^@%~;5Tut^$~|604G`NpLK;cN?Ao5!E*I;;Sr7|Xh0S6L9Ey~dk5^{Ip0!4GCQOxb z8eZQKN=n&(S|wc7nh8Ed1=cffD;h>OLwBBn2z^S-)tORIbY38qx_aD+P;J45fBFw^ zm$MRh{JCUcCT~km-~gAM>t^U{MaBzkI6F- zQ(_sDoK%FsQzBD{njPGR_DV@8~)AFZAB9MpfO| zUAXG>VO`^UJtnco&DbaMy9Oi2a%;sWT;=fu76{@+`R_39{+Qw1$g0F1k51^9qy*4$ zuUV3H*WGhT!WyHF+9gxxY1zk&^DkD7joOV(E4NG%RjG8@H6xdg{S1CzD)(^pxu(?^pCr)Akrja~=mO1bru0=`>Y{(HdQkrY<;X42Os*Lu_7JWrEuh)yB-)C$Pg-jt3#nJ9 zeEa_On_VlXx={}t^q}I8xa9TH_5e|K0ARwgN{No%7-r<(bMlir)3&79oY7e~@~2UO zESLRR)|yjKxYlghsI9vcHoljdQrx#pxZjXxub+=Ybg;sxsot?STBfs6;|5+W=ZGm*()fV>m6^-n>TY-(=$64nkImG4y z-RxB5_UfqssC^N0KkWYIb@RCOMm^uQ>mxmTC%kRX_Hf`P{(BnF$UYLb-1@w^$L@G5 z?mi&$LKSq!^j%R{z%Gr($GggZ>r7ei6mecM5QL)aAD;4wX0vw;F)MzBFqhwKKIG7d zw>@E`Of%dmLiY7x{I{0a!~AiiL{QmSo*kmX){Q)A$k!TDX@HM92|M!JcdHtTcXFcvxzSI?xKjlllAiQm7S+%O{+|8Ngiq{5h31$ z_USw_E4Ysc643V&%1{$cU#b3t_M=z5Dm!wo`hCr3*TeZ~TtKOPdA>(LPt>Baf02vV zQ|$`KmvqNIyITuOgkbi<)U*JH&`4HXikv@J0aITP>udepwK>wyto?{^&W zEBT=hqf1d=4C36h3uq<4WM4a9E;HZd(6$_`@8h|oK}8tKmeRfsa;DcYu)2Dtz^)q)7(O@ZQLv$UZt!5Xw_+?$>Hnd+9~Ntx2tYnFse3eP6N7r}zyGkc~=(4K;I(`maTz zh$5lN`!}%CABvl7ukG}Jl|9Y)nD#VyrLfYYR_XY?6^iffNgp_o>gV#l?YpAirT~zT zWZR(J%n>zy_#_OwLph;?Zh>E=TQ=&8KL&_k=g%E-`&j>8)g8Zp+)m{6C{+QGl5d|F^M&2rbf8X8468d8gzv;W## zwl?(QC|KY1!fahPMor#^3%2(LHVxqK2vc7ijR}dParu;Gn2#Pf769~6^4$~WzoxW$ zfmqG((qS_agN1r*aLBv46|Y41Cr{hU1Z>C?XEa4yynF7nxDX=~;03wn+4EDK3{zxD z39>(q+-BU`F!!^+yQ^VgdU@JZ6xae_uw~^@^gy^Y2rL#%Ck7&5^MYwtfa;NpLDZ}E z6V(zajda@#SEBBC@{QV};P9DJ6|^udsFynr>dHr;0((12yCt!Y`O|(4@=q&0_jO*M z3VC@#nTS?ZNRb5X)d#yK(R_EGxN649BoE<4cFf=`j_imG?Rs~^C7k_a(iF$3rs9J5 zn>yOn2rH|+7}+Ok%okoTD;Cvb=LFgiL5(yZUl@C_l0n^O^RVWs6|O(f5$aiD=l-B| zCJ99oWRNVPcBLOGkH^0n)E%5ufeaR2Tdm$%5w(}ndI|L5GUg7}Rri%{^!L&{y+^NC zvicJWe~WXjK49ydzK5&VzeKvVv?xQ`YSL;<>QODM?#KDxwGHo;91SA|2pSLupyxgs z<@cr4e)aI>Il4z>xMuN5A{c_)wIW_t`%*{xdjGhO{n>A#3|3Ry2Q6!Ajo- zUjM{)N!fgB$-|CNaFv#?LmYsS%dds4?=%?cYF9Tcn2sIHYBV#eEw0%ir>l|ts7hDn zf~)zt^NZJOp!_Z{IYPK!;qb}1>*9U9yW;nui-5V^XUCj^>s<=g^f!8H*pU1zDQf&) zz_h1cYlw6QEDfhrc0TK8ob~Z_kw}W%x;n&(8TPW$E&dM6HNm*}U&SK@5gaFpOCB#g zXES%98OmZlBl_f@PafEKF0GIDAwe$iS@x^Qw6URlycc_=Gd;}R<5hlQewqL7v;7#1 ze-!=)w%!*@^0+m-&iHj_wXk6LX2ajr`tv&Ks&q53Mfx!E<&WqRS&q7Fq_W}K_erlJ zEA(tMSLp^su1Oe~{r@by|4w4;2bzT#@nTgU7D=;$4@ z9Q1}R_>1KpzYfWH#&2@^N`j0`>A7z+fRw0=iS?Y-L1Vr(%@Mt~zFFV*GuLM!bmXWm5$WHn_&dBjE$3S?8$#@iipQj+o6g4@8|Ka$vM%rOd z5};mp9`sv(<-M&MWy-3*ds(AsX1GBo_~k_zFTVEZGngqZ>)VVgOrR%{KrLkFX4-!Z#Fmj7-|yANM`rqZ(|*DD^GC-Hr7olSl@Xa ze@o#V{IMsIbqK%I^?!u-yAyy2@oAADsBp!F=I_%7(P3y_&_X(_bo-1Y?Wx*bSDn5( zJ9n!}f+oBhW7|%9NF%()t*RF4SXPc@dGXD%~bu~v8&(&1eI23R>c&G_|B%wtR)y? zuqjwbFntMKHCZ2Q^LJ&Le=g|IXa?NwMaaLnBxm*8iF7?xl!NWrgb`#9wJnblYS#iA z?|yKeFyIx@L+Q5S3NxWsuTgSU!v0-=U!m70Eph5TQGdIJ=fU0Tm}YM9UKoHrTIKeg zJ~)LJ_+X1%{VcNm0g@|p6WtgU@RHuL^lE%Fum}8n>|#%&Z6j$&hh3kk@M3qC+;y*# z-p7F9q}gA|U@<7Z`Xr~MqwQv;*K{eSzxsr#O)KfKS8MRg<2O3sg{Mnv-wjSlW!C?Y zfHIAN*#dIyR$UELr8uDQ?d!3>9nYdQrE!|B+&zUSA^nTUI zsbm&j)7T2(I+G>?E{R+h4ZF^+=XCZxSoB;w^P%r1kZlSoDkh3EUF(WUa2@Y$T*x=9 z-D-<|V?A+98b#XG6F1_AcFxD17u6j6ONcMaP?@@X4d#%yoD`2~D#^570e;;~#@_0Q zI$SpWCZre-iVqt|i}`F6`HAxlTFaB@5f0{(au~KZyOGQO1DCn$xw$O}pnq#l*Qeh8 z0HhmnP)P9rUYktCVkH5#vUKrH{Gi@=zy+)d7n>O9%E;E!LW*SIpQZV*3oZu-@z((T z1Bm@cj1a?}S=O!BJX2B|rV78dWZ&EIHxe=*Ouq)spk|Q3%m{FUY7ujS*zeLVjI#S}Fxw8zR&!isW*F9w~WH~R8f5s?qW-NR7 zu#T16VDG*68{C^eSaFh`A$@}_>8|gHVmSYC;#V*RRiRhti?go)*x*Cln7uYziOY65 z>~MHL=0B{>%R_kuOOm)HXw`YwriK4$ZT>%2>jT$hH$(0@$2Nc?P7A^RuGYu@0rDl! zMzNlAO)>z zYiz&G+DheHy4gb&D?9W~it*0@k88XpoczXteRLU9ywH7G9Ce~;$1)^Sv7b3P!>+Be zl0ewX+hBPl5rnb0|vcVFFfo>$@t|v zKTk}^Z(Ke>Y5z(8mdnYE$_~3^_#c<%%ioD=pDEhe+e?OIKR)ZHZ}AFtNQm^Ae6&`= zJ=D^3Py{D7NTq)OvqHFBQr?%BEeZ>|Rhog*dok+|+=QKfeiOTazdDkb3$jXPW+3;w%;%qsOtH7l>r3{z^z0LE_VMBAGzftt1ZQI{tV-h*g8GO_ zgf?xjci1~owXEd7d9GTqUeRN-I#!h0du$r|#1ZB#<7)AMI#cO=8eCuXZl$VENRVYd zgqIL0uGmbY^p8It*r+y5G(&){rZRO$R{ZOk`kSX9StYmCH`pAJJJZZn5+h=$#SLrM zn$PZWY*9(IQK^C5NkgV@o#1bH1j(!*Z4s1#uB?k@_+!4g@qDLHYZzy9;lzUxIfB-_ zQWW~NJhj(U4SyuW18+M+oowHM>gocke6AtipP$d z1O06D9?PvkX!{;aMb&S5A;pDG_`C@E4Hwj(oq2LzsrKerq9lN*Q)|+JNckjOWQ7dt zkI7s9jyR1Chlh7PC)03x;f(Cu>%RznL3vu$f6Ub{;;}^q|GNpQYhDi)l{LRY91&t+}*5 zgyQWbL$yF?t%QQYW1jx+7km!_l1wSF5pODHSTmJqmnp4q&?;!IsbWnjfAOA3N5W<- zU6z56;+#@~n8kT;Paps6K{UX8aSkk(Q@UK+|LVlWS1`_yyjR&fZN@3qhbA&zzb#qs z6v(rmx4OusYcjQWs zyE-B^Mz%Pzuy6PIT@o`L!yxB>fX3?6mbP72g}Nz10)+fK-4j2wMxw zxUE2mo`USPMKMcF*~tCT;)VCT<)LUeZpVm7iw!01t8{Gy0oi7i-YzpiL{ z37D<30ztWcv*6(ZVfydhn;sOuoUB~yQ6G3mVbUaV#QanQ=^)E#pwNp=}7E-kw7`+61jr%I;HrahP;aYuEI3D%c z2O}V2kUx4r@F^eP3;x+Bs{g*6Eu-|XUHSAWNxFvDUR30<@_e*|Dx;N z|CtW_|8JCpN|Gd}A{4PoayBX{3OUPRB8Lz;&S5r@gpizaoKVikLQb2rm_yEIGt8Vf zbJ)gg-_`s5`F^h3b=|JNV7Kj;-CnQz^ZvNY%7I`CQvra5{HBwmQvK2T^{>2n=J&6x z^M8|2vhSsK4uHp?n}_>>(%B@&Z2fJFgUONf3RH(Ie=HR;J>uaYnPm(nZc z4#dUfUq5~-l3!lG;Bef%X^2&F9-0QXFC|%vxxF`2CjljkZZGDaFI3wT`=U`QmE?_U z)AwhaV7fCo7C{jzXWarIDnh?c{uD+Gw7j-9@h;UExCFSEv#&ZGaxd>fdRsQ{MfK*t zoL-smTTIGY{kj*&+qVNne6Ei$f-R=}T)t;S5Z>E^_8$u_v&}k* z(uUrp_>yzdfTIn7#)e=>(SdgG{ox3dX~!H{cP_?$4wN8 zei?rwi{`l`$%FZbI@%sbzKC+-@}cZF<^0cV{mXZy)v_9j3@u)K4Oh9(3_YrMvc+bv zA3CNNCnC!wMcv8YgK_^|tS97(?qRGC^zUr@$^OiTE8P4|V5N`^YP7t9ShUDXAAN0c z=dwFNBN075w+FLu*ntlw{+~o_gdR1K);1d3e2;S*8_P}h-O1rYv|%b@Yfmz?c(d}n zkjSpDS*5t0hhFr;efo73fz9W!vk&zhu}30G{7@#%s^_1}^L_mIqK`Mj*JOe^6l&^V z+l8p&^I8}cwQq?pnwsyH@1=-jnx^lLrJq;{HRsZ(J8}4z=f|_W5xoULjGc)d}cEg%7+k>r6JlZz3R^S??7Q*eTGy#xygKP;xfVx&xEc{VFMW%&vq-d9+!c(0}H-Yh(RDypi5;nEFi4wC-n|DN3QPzqv z=EEo0EP8ym%$-CrcXb3#*Ja*`c>>WOvdX!_uZo=*Q#o+%#?^%L>y39=$c38aMU>n1 zI9=J%2Z@)NJ3@R%;QrRXulnI_P3$A3J@7Igex_*LmD9FbHcF?g!9(iZ-CyT=i;`Pm z0m$ugmcS#UxdfABWL}F(9eyve5WYIGHzAI~ zPvnvQxWMMF!{L&K#XF^bP8W)1mUG_X2$r3SWZq+*;p#$>%V&$!yf zb|&@4;~G1{%Oq_F8NSV_6v!+a0di?4450PKd8|L`nU&9Gj>I&vu+yJoP%&&Tk@Ln^ zs(a6zmIpinxT=B-@3~M#uUgI9K8ROU{|28(pZR_7ni;-9 zsfoz<(&)-$ai)0l<+D+2ArbcL2iyJ~(|pe#OXxGt@H`@2(YvNh_5`&PB2}r&+}fMh zTx!5j!zTJlTj}J}@)WDNCCPC7V*`#)Ut?^AVmAFf+RS1CFV1Y|joX|y-*fSYZq0({ z4{u5U3iaYe0#&Y^^FCo-qPNlb^o##-h?C0tRYsoP_1#5HY`8uxIIPv9iSR@FTmR+u z^4S*w#`Kvktch%3PasaDTt1@whE(M*6xer$9eHvt3EWc`x+K4{@z<$W0KIx8f$$hL zmt~;+A&fm_$n}|>2z34$*;^Hpa+2d7m5nC!Dsi9o=QltbZ)+vAhL6HARt3iCrD}UQ z{`F>DB#4|8h^+%}1EvK@_Dd$NWtW$Z7u6w;Xw-giIOy&rvU_!Z1YimbHeHON_A}7F zRa0N-*f&oE^uE%==5U&9y z=~sN8lz%4Bp91=O|0~uDYm?aOgq~$GL*A-`g#L>4MdwdnT1ka}8SHacx>y20(-q^o zP3|52QB27}Sh+>WTy~BQODOWR>al_3d#|LD3auf#KUOU3ror}|XD1vLzg<5J_Kfcp z4*qlfgbjJ=w1{*7L$Y7Z;H?n4YYvI7`Q*d`cObJxaIN6STTKF!N)8F<$>1laNy$ zVJxhT+x#k@9m0&-P`=(GCIltAi0EPLCApfQM6q+w<3@5&H${l~GMr_j@1@3yV~COG zR>A5$Z4lcn&8R;aO(}e?okH1POh(%9%nf79c})9JMky{~(-6Y)FW@vo#y^ML)_hC4 z4V3h|M_FPi4DGRQf-h55)RpP&a4%(rDKcU$%(ZRU6UZpjFGZJ2esCjQ{;^wF?7dC< zxw(Rex(L66Tq?cY6zEz?o^6M-|E`x~dfBMZFvbH09H#?lYRmS9zB z&7*Hheu#N|d>X}Tn~;7k|3sAW5$doOLUK}n+~C_6`eUosn^M;O+Se~8eL`; zTv^U=yUdr8-E;#ljN#OiLPwdkz5poS|mk7I?qo>XmK`y)ZPh95Zy$nGzj$cHg zXavnbZtoc!*|Qedpx7cX&M(aB)5{PbtW-wF=@L489fWK3z|l&VAp<>YFQ~}*09n=; zA;atDffgXOH5U;>ZM_T;i1ldCAct?&?elv3S99I~5$Zc?!UIg%mN_)%2xy{7`5`Yd ziloY|=>KNX1?nSLK9)nrh;q+-krAW|UEIeUOFclL&l|g9bsf_4aS>Rp?}WwaS*q51 zB&j72<0|oV=2ATu#a<35RXnP(J(`%|dF<@iW_tPlu+uq*2zRWu$SX}3#>=G4SsxsR zAGrfyDE3*Qx==-Dabb0J99y?n*~WqhXl^09PqXcjzu^iEgc!7?1elUL($zWbj00{+ zML|@TRQ3{fh-`g_&0pDx_+!^yhTKjimVP$Y^q=hO>z*Ya{fHA@Q{#5y^mR%n{Zs7A zPQw~E4hRLjeHZ1NSnESuhb&!2f?v{d?ZnBo?g0$L{xl}&gae{DVI`nop|jmlAtLAt z$)`~_Ujq6Oyk!~pceh?iTzstI0MN8Kd||{IMC8cNqPGLb&8m(NFZNWsvv2GoBd4X% zi~qy)Ul+2a3PmD6*nR*ZJ~PW(RXRUr`1O0>R5wYHz0{#lj7JE|nMv|enFJ^v5X-7hT?0qq|H%K&dtP+ z926hJ$T2b5nMx5oa+Aj}q%v8q>4Ozlk*C&BQqb`FMfC_mAqvHkA$QWRzw=FLgPoH? z7a5a4CmwtFo%7L5%I1lACrHmlVU{=4n!>mZWV z$4MNv;bRKkLOCbxTN8x$tG!dI`Z}W!OuwK1Wbb*j04_(5%%2W%vF+ z7cw%+I-qm#%PIP9jkkl+%b) z8wZb&J98QRs752>-x>Dc%1L95uJ$%sH!#8A&Pn^+O;sZpZUopro%089xowoyQpdQz zG+Zh8gPmX_3i$;*-<)>;hr`-Cns(HiWSzCPHo!UHsfB6VU+2+S?XMNLxR4q1p$Mf> zbldjZ=NaRmYXSE+@|0uCGv3s{V(9e<4re=@oNv((^~q{V)cv<57FSQc`g0}YnX7up zGG~V3Ty>1g)7OA5@U3gu5Pa&&H8rGB;y%&ZX=n21{J7U*(J~nE&_aVJ=+xJw+Cy7c znN3#XS#oq#X?#*2;twJ2$F&=zKH3z9Be9LwWFDK{(zC^*kNel4cS1Z!=O9;N$%IWY zE;qU12(oqa%c6SC)tROW{tHlJSIO*Wbz2X7z+Op1u!V&39UH{3C25&$QD-b?ZV#ic zZ8;ue&$Ioc}>Ikr<9RSvAN04)f8sh<`0} zCt5tH_zpe!&SQz4GUcRXp)b<-nrX-{e$bRG~C&^ z;^6i>&U~l@eu=;dn7^jW+E5uR0~{?SV&vHTPNj28Gdh>rTs4vrC8fXP@$oEGV?ypM z#wwvNH(JbV>}=i+;AT0vd+hQUY+yE?b@x<1NZ6{??4Dopy1Z<)iot*!6RG^e0mnX( z&Ne7^@~Xe9F%Z_UXirVi7qZyB6Djo~Fc0~iM8kgJRSk4B z_n1syb^S_zsekWhtjyeZ@PLp$(pJ^`m;&@=R|RcA80( z94GMT`(2VDRVqx!|L6y!K2MV!pL#RL{_F7BwYGQT`tl61{uq#g#3!x$Xd1x`v+5Wl z*w!jB$p#Qz0E~1={nm#2Y!KHPOr2!`LeZi!cI&~ga^vSpvbd?D>YWJuK^raz4dE?i zIi8x!u228}s`dCLwy%-a4GHJIYpegy7J#lU`$jhZ9&ZWwEa_-_lHb4Vp6K!@u>VKd zd%naB-vaA!zK1a!Q}3$aEv=FE{(bq1uS5+TY97q{qe@+{u7!`PBE+0`DlKHES=_4u z`2eQgh|pp_a}yK&3E#rL;V0*VcjC+kbg5DXe5XZJf)ol5jNUEeab7rDt{u2#pIBZu zXSIWPf{K%9ct1wTU;bPY(h8)stHwO3w!B)Q+h+iUF`s|z{lcFV{0qVDd=28V-6NcJ z|JgLjsah7jb3ZcedFB4kI62y_lgUO(CzCN*y$Qvf2DFnefz%}!B};CU@th`u2$)oW zDH_3$$K6Zua2qTsRs!yhR^lFNb-kl)-v+)47FUd08 z{BrUr+GO^0f5VHtC6XSfwZ_;7K`mXudazcW!wISsZEUKwUTW z!^|l^u;Au|0=QJyJ6MIcqzRT|O|MiALTZ;y?j1CtDf*^$(eM07BAX+mS^A_}^a)p5Jo8 zzj#vmE|D{=u_5fmGqm&1WP9#@Mw~HS8#fZ*R)Gm11?~6@eh3arwnxwa&s1H`eVmmU-Yn3~=FKsaznZaH@f-S=kMwuQQt){-ZRoSWTV~m*_yd8P>8uG|zYwtNk6!+< zCu^;qsIlqLJ>Fy*8&zlxn`6bQ9kCF}Y>H}@*>KhzQ*xchz;X(jf%vQ9wi2cAL5jX= z-E(aziL8SS!59c9&`_PrZ6T7^c5-uo|mo z_fjXJ@vL)NWvuq&L?X@eKcn`jA4x%S>IGOfILWU6RzU+40cq`4`*Y9N^-w)o?AJzg zty8(Ig2B{c9^KB^*^0Zlg|TYyV?VJ(Cs1T7K8rPczbCA982|oV?SQP0>um*ki}EW> z9KaVrm9&&R3f9ehfIFNS{hOqJG7FQufP9N-uq0thviiz-^O#w?|I?)3n+dQ1DAHoE z)lLrwI@+&W(^(QG$>586G(M3M0UIl_!c+2Er0V-({WrTP;dBBv0#lyKu{9Xn8whg8;E$?V^{M34<()nb4#}>_V&duc^ zj?;SEd{#?n@`tp6tp?AWLZe95&)E8dC$gz?01?=7+-VC?)K)Ke%PNTe3;;{b&~Prd zsua(k0l=xU>`1eeM+q{?g1m7jR48`Q2Z855DpIFP%S9CmYl|?x~h#XeVBLV7{ z-?+`m1b^^lK$oRjxr8e?5}h-03ieZR{5hX$L`Qi@^(GYzG5JOvdmkQ0I?jc<`1wU? z`VIgR)e6!GG^EQUDEpo|!#nAp>u#<38D=E>l8$MNqt^%>EX*ByC;h!g zJZ}*e5MvT}bMW>&8?60-hq{i*PuW$%O~!qqs)K3S$OSh?&m)=1J~g$(BdxExw$a z-HF^nbiHJU7Z6i$U26>YUd4s+)Z%eunDEhVFMBP5@u4uq+q3yYiY;v(d_|?Z80p+Y z&Q9;!5DV8^KvUJCI?0zX(P&M%bw&x@F07>KmD}z;*(MLR(89yi^Y*87sLH8GunN=p z2i^+%^pQ%DUNCDAxh^hL0(b)nYnjef=_*-y(D??hM5Mjycoxx1Di%5!!ztxdd1?DWDLW2l8H#@*y<59+Cwjo`#>f*78Z84Y z5^{nqe+S;!V{zFJb_T5(Esgu|bS@?C%$NGFWu)^4(9d52za^Ourg+eo6a9pI=_h?e z>QZ*`8fjJtIXW@Ju9^7uFXHd^PI8lEW4zG48@{T~xNV9KnG5a8zjJguQHJ&E8JNEa zG-^9r3rgNLh%?<+7Q7yQ2gRds1)S83*jdeZlG}L(}4fWuF zm$k+0gHq*;N)Z7=YARII<+UVAcVKfvA<$Pn=@ zxuaSfVLKpoz?lNfa614c$o8*GuRFIQt#7_sXCH32-bKr-tc!saU}Y_h}Xy zDmwU(b42V|Iv-OUZ=kbI^Ud{qmcb{`U(fSDp%k1b7v?#MLk}BIrt+WcW=Td05^hLY zIv$q1f}$EyVs)j{s&jeOmApk%qWigO^1WobliP^&UMHwURdgPy?5IDL^r})f7a(2n z%$2xcjnGs5+4_~XTg22>)yyJ~Q|9>4z@+1Ngpx#>p39i;AGp|^te0&_OQE9bYNAO& zqcP4|&iIl@{8T;RSvq9^&s>?}t5nHbdLUw>6ue)Ok#y)I<*B&)h{CcIY$U{TXYM7i zVHMjTISYIB>pQkd?%us8YHBIVMvsEa2G~if(?OKAXT3;@<4-*yjfM4n-rsu)QVuRi z$bq*IA@adyA5hr=LRqHvD=71q>1-@5xvAhaxAcRwj3yK47)2uX{*z=>H68nl;}F6p zBx$gYiR&U|;8`0~_8SO9(-v@h-5dEJ%cRA*NUu){ja4rlzej++-@))KFW$^i&wW=e zZTzdb2LQ|{Lz2@R3>il-=c=D@zmeKF9?N$**pXfeRFrJ`HROR%G;;dnj+!S{TUsVP zsCzZ7B!`1T9J-!LpKQTH%GxwZ2ngKcqp`j)p2bC|uk zi3W4?2f)qXAFU%_V}r}o;xpGH0B`4`2b5IzYmV+gcD2Fwa+%=Na26yKL9R$ZQzilW!$IDxr;D*l%r zYN&_2unCR*5OLo%RmICKgY?^fR*epgGM7iLUy01h`^X)l#kF=YVg8 zo@PD_XTQ9iGH_K^O7Ux2PU)sYLu;Pn{*kuq?9MQ9n<(Ofe()?aL{bD-%SBFFXq4ua z@v}!#{wy5bb(z~CzC9E6#^rf=?y}`&&$?2bNd z%wq8R4NBDKEBjdxOD9znTN?iOL4W-(#I=;(Qzu7p<|utIL;pNeo+a zziiREF9<&hIkMpy+iCncK`-6nE~KB_iu-DW?k;}+=4R!ToNZJ;;4Ara^Xa|9073`G zYJF5u!htX%t-8Ih`XZ69fR>jM^ZKaQd76k(f=j(}S(CnoBgna8KZImv z-CsY8M$l441PiNZ3p{9WQskfdR4$~)cNE`3|3F(dYFT8yAHTHr%j@OEw9mJs@}Tff zzwKAu`n;KY+j)zTx5F7@_~S=$USNkI-fu9Nph_iU5E?PW`-z{TCw@77=3lBl=`aqb zfJoa^ZfSyO53WD%)k|wsZuf;@57Eayb~h7c$u=A^(6cYa50~2{dU_f@TTiM}Q(n!f z531K4lr8AKjz-UrZ!6&DY1XdGD8YsGyH-Jl!Y@44A-J2r&!cyStYB-uOaADf%dQEf z;_D65*AY#v2XoAp(p?2U}`VIf|5d_lb27-$bJ80JX}JUTeYWM!P;ICNsOk zQiSN<`$7NX0Z+Xg9QZXLNJgltm|1M7lPUTQC2aG1+xQJiu#t4I6M_r#*F>23KDC5Qp^)~2N&2d(4&+`>1S(M6l9t}*ovOo zj-PDY=1;x$Q?QfvNuT0?63s#1~`aj z6nepSo7_jHng3t~%y7ije0z-k>95(>-8OsU1VVP$kPn)&nz+(n^r6IJsTC?>a=9uA zINOQ(NNK*c2}b-lYBk$yJWajE9{KVc-G32m{HaXR!}b$KU?*5=N>rcWHz*rygY~-8WTVgo*rG2=a zKri}Z+bs}ejVSfk$=AQ`z;N>W{^R6JH2rh($5L{w!h-+C=^rsG{=c03GDylC8uZzw zVBT=>i69}v9cr#;ztLE{^p;UWrLea1A;g#+MSdE!mTT5IUZ*W_u6}u}bNhQ6V*o!k z#R}ulrN4wEizF}JIIALH%fZ0B;+>mjVo@GuK(&*=AX*CifJ+)IDzt3&{%?c6 z0g^?!n#J{0I8&4zFtLpLUyT0_bozRU zvsx$@C^k`9XOvzD?3sKU4xjBY?IK~*huMG1o63PlgvWv6CP&+#nw@RogEFG~y6bS- za`m|gNDpfkzZxW<`KyJB^uw0E7Okg*>2ar^CF3V?c^>MoI?T@C%wm=4o$%c@G}H*# zV9M#-X7X^VIiLT!E>2uWb1J4b-~;9v2zJ+l)skx+D2vrm_nUy4L8@9|LF)^FzxV_9 zTM}D7dByK9mTgK9gSoW&lN_rXLLZ78)UDq6A8%UkfX!u zD{GjEwI_o8QD9KsO7Ydv)2e&P{5>YuKRX%*k?pLZJ0EiW&daB(03V}ayUdD^z^0e? zGDSY%ZiMUDW#0|;y;HN;bQ+|jJXm;hwK`$_+j#d;0~q}l-`3oir>q6NGo=~-<-+w` z^UR5W^qbo!{g<;u5dT5>6G52uI6T)53hzyx%r$g6yD+|0p;`pnS|k=#sdp zSP`28`?d%focC<%@V*#Quqn(FmGww*W1HG38F&<3b8ij%GWc+?(J4qFIh#DY-VejK zQ!>JpS6tWsYw2g=qY!R)5TnW>iu+^*otLc}nWAf(; zpaWdyb)91WG<{+n-P0yg&yEB9tU=|8%lq9^aX0*Q?%Z!pdMRY8#)UlN90d}XL8XK; z<*WARgJYc?2T$P0Rg$re$A8Nrik*=F+0T&*12}QhDx&H?%Q*<+HH| zFA-><_S&kbFjPSr>f|{q3G<)KLFWS+!Bk-2;9E4&*$V2FEzW3G59nPUt;=T=?VqqgNjgDy*L32YL z(R(V4AiaLn-ynVJ+{S=)f`AOpOgj@KUIPjV`~Wl$bW^YUaO}KD8;ZE~jKortVW#{0 z{JO+FyfAH9HCWMK)4da5t2Ob(srRI}^`KvXJ&PfRs$F6FBKllC>3BiyJi5hA}uU`HPw ze7j;qe(_D@{~z%00j6g}yQf6T+F^m@qzLcekOw?lgf_L1P+$fCwlk>BXMT9sx_q}g zwK04@wCd-!wH5jJV!kYZ^G%uFlAYPC@^;b`uS$bbCl~UiFhkq-VU9ekQt)_K@DWpa ztkBw96X~;bLDRXE>zcFf6`5(X!UDm$z?cVXQ5Z0F<#N|DWXz{;Y`b>w#MV{Dz zy%S0A0>#b7mhd$C{4p+|G5*6dfrOu%O+*wu$K$E&BDU=ox|;SU`($bV?cgzf0d=)e z!?I@VCvV5oQr@BGZ2U;9+cy{^`rgz|FpGxXnYj!4JKvs3)<23{RSD8TQhRa4+^ohz zAXR6W;tF7ZUY^ZSJ)*tKh)ipzYB20Y8_&61i()(lX+q@zi4NSinC3~JrFc7af6_4& z`mxZp&IM)7{gAc6>%7%~g)(ARAaiLRt#Oqx56I2O)8)zLtwt%bZ7PZ{I4|~lK)lK7 zR{xpKzxACtM1V`=wVSO}+sl~?Yh%Q@N?cIomu1voTya=p)TEkH_!dnha64TT?DbHa zTGsdUf?L0=kh-i6_kZW}`6u?`q2o|*Wx&o>_Q{U;gOiwvZ!F3Z!uzOkV87*{EYtSP z!&HN;&}}WYZqns4Lgofa`{3J8bC&8h8pATzn7%srAiS*SvjTV zt^7~p2Cf>#$vU~dUgHfvR}iC%+GTM*`OvT56<8rSVV_RJOh0~%_kyA$;O%cInbku5 ze+Tnv^D7{!5oF0kLZOR9k@xt3V^l!IR>*VT+3x&?gyKXR4;+$7B4*CjD*(R?zr8ln zpl-G5yk76=CYp8KeDQ*i^x^Wm2FUvHq^8SfeivwS&sTh*RD)Qre9w};twdjnbBR<< zx*TZw=2s5K95g_cifQ~vdLRokgJDuOt|`235TU?HFbSqL?9!c{d*~wL;U4 zz?FQ=B)9rxT6wSK&XeN5JRkoshSmc3f~4~*XyH;{x#;QfI+R}bkL((?YnOl>fpQ)Q zJ(E<({&n24H_S!N#Z_%UHjHWOcn(KbYKCgBLVopw$InpuBY^Leq6U_3{*O9tnXJr;siej`EJ9@4MY%W>9>4SQ>@f^kss2+(AFxK4_ ztrx3(ImPq2zgj7o*iCoqo08t{P3<=RFV8O@n~z>50a{<(Nc%N5l4Eqb`LCOwCC$A>-&B$lf?`|z=*FS1WA$Ov zOoeP^Kt~8=BwkD3XI<-PX+Xbm0~Bk~5=Qu0;w0cPhMm?PlML#)29yW7uCCn@&j(c? zfDDo!ULaTJ<@Ck|p{nW<%vmu$aLu#cufMQkW$*c3{|)MH`qYf>t>RNst7f3k7IJpJ z=KLC4qsO0H+a^x-`h8hCRC+9&iYE2=?o)^VJet;b070{-Uj2NxU>QiU6ouGLEIGWw zYaR_~Yh(bBCt=(7Nn2?q|7gBc&Q1gXM7rTdmNI2Md0U$&i?K*Nf17E`WdCdrXkSoZ z5sz#oCUqa$dH_nf*=bhP~pRRjof4zVlNYU~z z{N2H?>Xm@13Fu34r4%6{01@p&j0RF7W`Zel!H}_peebOQ=hE5W31VF4!Ri? zyO7xoIC;QO4glkM$Bh85rH_7}i@$zjo4{dRR$vX?K!NEmZNK-o>%pJ!Wo=q8Y?;;yxD6@2wKn3nb@gx#{X8W(Bb6g)D^51KIyu2ihrMo` zs@L6+Ndoe)JAngl1n-$xtbYnZ^(!)#@_R%*I)3spF`7xXa28`ToRHr2?&NDn3CH%V z$2|Km+?mfCpxaC^vgtvz{?Bwf{9Jq89$3yunhD!_6QFW2d08N4PUuiE36w}0RKf~Q zSC7#vW*nqPhbt0-K5Lou@;U73*udI73X+sbWJLvi^6@nXDuL%!_@tL+r}yC4DPVI{ z!FRPTugn(o-SXGF(8o1dMaXYeA`Yp<^=D7_4ArW*=p0O&EMrZOJ|pdAr)QfE)3e^C z-sC`wPx6iM@XnSo=IuipLPxnSyMo^7{{Hozre&?uoACYUzNSvTP24%%j{@B{!o;=7 z?y~rBQB}u5*IH2U!&OPx$uv|}#rL}(voMD&wMJokKF1oUmUJwT){aerfG)e$ePF=~L}zd54Ef8zA)z9|7n*J@1&rwuro+#x(m0 zv_nm(#Mi{EDBqU%__Dk3=D-khS}k-@!d0mJ=?Jy1910-FddXaD*l((%8uN_x`=y%K zDJ+H&kGHa>kXX{IZ=t7C=yneZwO3h63}_Be?P0- z1ADc4ex|p2>u*3e%(hcmjHKrORLY<3*8CsKNaD5 z>6#GKb^z0oArZ-?K1dEe?uhR!m` zwp({a=)Gu9+_wpgw_jT{C%yT7d8!|1%zl2&EXd6+1>MJ+dA(TWvhup`5cV<%X@?yTPS zW5+k~uthPB_6Gb30k!a#D5+ENz6o>>b;0FVra~N1oBWdb-daux$;fl@obUGaq24wK zoZ0cpiS9+~_wC=q&Ls1kWsv*{iP^s-e}M@84C|rmQ`==>IP_le_uhfMI>Vw4G=RR^5UvmI#sK-JD*Uj8t?dHPOyzJFcNN|T0%vP{*&c*qBx`fTA95}1LMh!8 zN#w*r3e>M+J-BN1Q)*p3Utv}>UC&}tEKk+jSuE4N$s@#{Vd{s1D$~8!^|J_t)_8q3 zAHJ$K+}ZS_vJACC0gE#>Xwcee)Q=apLD0XFz60=S6eupG{Eif}nq5Ja+hO7iQU451 ze}lNa?HN;p2~3R#%Xy_a2_dYl`>Rusyan`gpT2XhEcwoJA@sgLly(l^kgrOWcr~wT zW&DHqX`dZ~n>#G{RP!$&S;lI1(A%Y@m%e2_-p+awez$<9_m>jAHUAowH80~mPcV}m3kbN-=PuG-cpq}KEIFD`O&4@0yApp+B7 zjU2qlSTGaDAw`zWMYmpE|D!?2?dWy3o*wyU647#enDD0cDV^tEBg&Oh@m2t!-O#EX zLM`VJ9TP1!t24%W_E^}Vg8EV+Z*GYCG?03!mrK2krCC%ny$#T|hpD5UXysh3RQ$=Y z*L@dF#^wh)3Ro5)2{^Cr$4%9FBVGnmvq~|)C^FN>$qs%}_<*nh>8X3b*yX3+QhJlnJ))D`qI=6n5GWkuf1pmD|`?B@zb0HAC6X|&S*1# z7P)bR4wxUz)Lj|z8xs3ltv40){V->ya&~_r>)yp{vw;~%Il(iE0Ng-hl=a?|qX}k) zyO)8W?t0vKuJweuR9qyE2&8-fL$_07!qZm!(D0qZV~k+^uBx65_Qu%;U<5w9Bgwm6 z0*_(@>t_wdgE+1MA3tdt(kWR%)xx}W8e;2V$Lr%}bPvFnpUR?BVFAgebWl#3v88kT zcK8K;wl>?*WxKKDa_Xx$0e#Gu5YB)3z5E?6n0FJkP(SPf1=E!qsB|OvYS`cneF*jT zxrvmlEd09y@oV0}RcQ0R?v^c>GNGhQV?Y~nP%JV~q8ct>8F=XM`FLDbH=(!%RkxFp zt>bBy{PR05bQU65Qs&W1XkgmiF_bX#+aCCt{YAFwCjhh;IkH`)raLZb8D8Us^(!m$ z^^$?Dd8D{x{%zLh-UyqtQ?XZ*Pq`qcp}zIB&X31|vaCvBH0#UuIg0Ll`}6II5ORBa z`-&O)YFr~n>g3Dh{R=wyj5(D_f4|^$yntXY32G~=%@%EPYo#9A@Wvq5(QE*d$ug2K z9|8B?DNP1vR|i=l4h?C`$lqx4l4?idrcz5IZTGAeBU(=<OUGjipeq~$0CXYEUf@i$>N;$oPP6H0p>BIm}jnhC;xM8p7+0NEvWa3gE ztv`~78Y62&x*gx@E86G5g(Q@ocrbCVU>OB3G6UacpmB82!jalq#^8BGg=LQ)v!rSh zx?X^9{y-(2Iw9Zi)sn}0{Ad~2Z2x{>EA87c3^&XRM;pz23GK+gmOkLkoz&4E zh8mk=Zh4BRS|&ijMj|8E}U1xnb1nicvo7CE0p*O|2@fw+GqyVnh|#QmdJ9_K$uBK2nQ4-t^1QmWTx?Q=!rWYREr(37PaQni_%gn8Gs6-$+E zY&0PV$s^ZlO_X{NJhy<2t=)|$NpYYw0{f1|pzsdL>=(|>S}~IW?{y9LX#G)Z$Bm`* ztmnV1${l(fwLG%~SQ`@BQ?=!#HfO#J!6gg9yeoencPQeoKMm#I(f6DJM+F@k#=-wg9SEn{6*%MKZ0%e zOy-+sl6QV*%$%9XcjDAqejrTqi#s?I8`v}#tS2U@zq9^98xkJqp3676oTO*zR3?Jx z;Xsfx+Uz~10qxqbk%W#N@1#;A$Zj(J$Hn&J#Z6s{hn7hEavQucXZ*Uib82o7#V_}D z@DHUHF!RQ;fnUW2FJEbJRqmf4jG8(dfWAs!LX)cR%v&~xF5xe==8uiAt)Now3$C+E zTa(x%Uu+=BYuO>lZH$8&WbfMvR25%-W*EoH zyuUj4^OgJR?#nJ#)XQ?)BaamX5NRQ{eskgDZO;P&^&QRfNO)VL{AVw0W>W_8WY;h% z^ZwJQIVt9whqT-f#*n_`QT|a>o}uJ?xAt5cP{PIOo9NEp$qfirhEbuxv$yHH-!Z6; zU<~P};~NLrVcEPk>X#a*vGT~7^1wH-ha&+ZOZqe^lOrSZ0J+8iM8J63Mju1a@4=U} z@I8-Jm%HD4Kutmu03uPrOAAiqAx;EX-1D2P_hM1?0;>GWokG;F%?RZ|3#5HS`Nd29 zPCf%)A+_+4Ghe8sE=PpuY?^H=8)<~~Q(WTonYvh~BhqJPBjZi#E9iREZFA)^jfzV; zN7`>-r)Dc2lfv-bg=FeE7H_jl>nw>Wk&9gWQ(uipOVO8yh;bi9J>pJ)pmD87`yZEC zZoD!CDwOlQAFyph^_O@+9~<+~*ICa0N6xn*hq%-+M)W21JsH4W?wYoch#T^YRuA>q z({4;5nj2Vc=sfVu5%}3NttcaiZX9TagkjSxk~7nYda4k4*O+wITgFz|2MIQJYxd-F zU!x*$)a1H7-b9P=0lnLQfqml5X!8Ev0Ck>r8h(6!R*dKCB{>mwE$~%ulzLwQ>Y=84 z^Z(#_446*Ohr$h_x`yofj3Uz_rN9{r;pkiw8awWi8sz63;Hz;BMj;-ikMXTH%&7o=k~KHLE9zNqu*g3b38Ll5;e2Cw(Sqfe7h8_DxNK$jvQ8N1Smk0ZYt z_F(DN(Jq&6mM&4yJ1ozEbySnFoh#Sx_=oK8 z|7JDzXJr1aS`Pdm?7@TUWI1p7&O}z5wceAwY`nvnm-B#15EGaKYqLOu&x^uf&u6DG zk8k5ngo}{QR4_Z+jkQtt$4`*{8u|y}518OTrv{XM^|?NvhGuEI#Luz5K6a1ix!W1- z4}q<06V#Efh%>6h4>~E5)P$3#Abw5e_c?GUYkEcua0E?kN`!dEV0X!On~?^jkbeIC zcwVZXi0k5!cV8!U9<^!S`RyJixoy)(<;%tjIFGV*49LBHC7Z@Rr{6IQ^asCpxF~Fj zXymH(ouhyeuog3sZ_F?!O_0uHoZxNle&agefejZc-9qd{kGJSssPYBc2qRlBqqfW@ z(l0`NEQr`wcc#rc9ZJI20$ufLw{Pe6b~~7{-MuDTA=`qcdvah7W|g?3-n?GpG?NM1 z8iqQ}N3ulcm-dx4tDcu%GFJTghgWWFezUk+t8hPn_$5iFbNXMr-aJe&X8aKX@18if zBN1{^s;JP30q4;5O{cJpUKocRMoR{Xh*b!@pPh>)$8V1(Y(Dm@&Zz z#X8}SnSGe6nR^@x&205%^*Ng3+6feyaTaok-ZG@)K^jk{!L3A7_x@l8VZEI2C zOMWKx-tI+`+2TR-9%m%w2DzOvtS{{mfZdsR$Nzl1W%6iv`mc!JB}+Y77e`!msqZe% zRqr@<$HL+4G1uofnJe2eD?Zt*w?V!?8Tj5+_$ch?YTN%I@6G?A{2#t=6hcV05~gHL zOl4n3i-a=DzD~*#l6@aD3K1cR$u4CNAv-gcBztzUjKSEMF=Lrw%v{sw^F7b=y6zwD z$MwVg+x;(iJj`*tkLT<8d?%;ez(-XyaN<;`W{*!Fn`AB#jZ!;2(>2p0N-y$j`|^2c zXdkxjKkqbH6sEiQOc}UfRX)-{5t&V#t?5?UioqhS4cNS1ar`qt6o?L75athtk&MtW z>$w7Nt&nOUIHr)=(UWyg5BH(;G3@XmH%Zeo-{4VzqAUh)VyO0epLGSp+98h&eR|ib zzN5~Q+{2%HLnY@{$oWOlgA)&rO&Pou4uD}m?X7jxZ=k)@b`8PC(M^@Qle^z1()aJ>G%YVE2^|U`$*JC#t z7V;#2{P_>PAD7YJnd$`j%j#vp7s2#Q@2sEPc8>OUYn=<_H-=fX`|nwCCBD*OJ3~Cv z@fk@CAG~`1ek#+%p{FOy);HUsY>u&6nMVshhQGz-y&Eph!BF=n$-ld^P=%{3886<^(M9j$xHMF#(sV3T64jRCdZ#JEs&Dj7$u&11$_mEi__` zZ7Ym@%Iy@ko^(i2@ELl-^uRtPklK807C4Vz+k4NJQsh%(mtk?DrVTL%!l!)Z&0!4Xyt2HFJyuHQ(ahAsh`w5M^iMueD zlkH})2pR93-4ZA5@ z3?s;#1tABFOL$en^u6?5R8!$3e;t#&nzk0G%qjdpC=l@D_roj5!6gT$1O4ofdU#bF z?#dsuuiLHO-8W^LTBzPSj@j{Sit-Km9Wt$v58`J4fBK^z0j@W_1Om7K0@HZ87AQe_ zpe1}ZPy)()=9V~RTz3_Sd|z)csf+EhA1EpRwTV7_V|c`h#?cSO@0!Q4fz=CO<+C}I zHMu5oe$b(cAm9++@}Y`&MKzr1XKI>I+yO?aVjrUlf3Ma#NHOI>Ub!;A1-MX7mRaL_ zJe>A?XQNO$UFP02(>hOB=qtr{^8JA*V6D<$TrYg(1|~2wo%Krib=6|Snl=yZAm5oB zkH{9WoeO}IK|rGK6R8hidHlY<-)hNb6~g`g?!obKJSt?lFyULWgO^8;dS@}Qud2=T zJOpf%Hup*nu)iWOCySIi7 zxVRP&Mx@nOF8Pg1RdqyRz8aZ2M&7lj9_8WHb3^JzoP5QH@n>ImRl`=AKt%nd19Sdy ztAptVM?vY}sWHe3c<4>?obbf@-^{*u#Gm*STgT2hEdmz;@YK;8SfzYRpPE!6O=C_DmWcZShNe|s*_pH0h z3v5-EfVe>A-9kh7P%h@b5N-gO47zP?_&t&;Xs}5}m1UtXehi@YPF4GsvA0 ze(}&om8x-V^MN>J6hbYqL}b5=p!0qdSDgxF@8=D))WmlpPSj8kIagWW!8sdEsZ4`g zjL_wLKAm0b)zKWGk;H3^&Y)m%9{BQbwK0|HjzZI#(SQPVK3U_hoPVB3N)XXL9B25~ z&Ci)b-C~wwcexYke&>Kph#x;XG&_X~8gWU=D%8BvThs00z-Dy3)C|=#L-bxpn{D#a z_595L(eu}k@cp3()b#e_mJB6c77U`%9RQ3G*whwZDByfCfka^b8CC*;S7oyhKTdehjpM9KmG`pDGTUlJ|0f8IT`7mq6K|r1;?{(P+vv#t=oPy zHuH)8#UXXDc*NT6_KrIw7R}>+yaa@j1J@^eteS`~sQqb@S#M2J-OB&G2Mi1z_7754 zt->z9y4lK91%$i{F}`g0yF+kaz4vFAlrYf;{zC%W^$)tYdAecA{G%vd|IfZX84D2~ zFY9({hN>=KIJzBSU!&f;YvuBsG@I+g%*AR`UD9&RaUe4{5-}UeG}{SP4NO3j_@BQ{ z_N~fi%BjdP(%bZK0l|HpR_dHS*YL&fV#>ylO1!DvWTw4?F5 zq#KMZ!IVI+p*-C-v6|-j2i^x+_DpHGICmya0HByYUGRG9!KbM}!<=t_<@^k~oKFoy z0dp)#VPV+o5dS^lG?1!;>=`=0NAshj9|`@3;EyWiF{p@Y|Cub2w9Nd9zb>(?g^ue~ zge1V~V|Hw{2bTD9HvnGe*B76OyZF(sa4%C{-W+ans<{O7Pb)5=wIN>G0oDTNGDd>a z0%LEGX;qhm>dMSD?Bjn4r+j5`@*nP!&wc%<#3}EX?=6r`wpMrTFThh$eRmBR!-a$i{C^F-fZzk@2oplUNZyQn+oADnj8cA{kZ?Y14>O%U|3Aii7h$ukG8zcv{(M3Acr44+1o8Z^sn5i z&)3dQ>fQ@Oa%5sno_>=bK~0}jrFL6ome%mUJ^1XBAI1_bRkBnE$sP1{J}2dkreQjG|x$jsL+dZeYgttWNM zY35Ct=7Ud~g;B)uM}y47W5gg|mP^ir2_yu`6`fr{`k&GI&$A>pp4ZdlgI2E&U<7rC$w;P1dM~`YTpng-tgyCrG?4 zA!lKix~lh3%32kQN*{p{3;>522~4RHiI5CuJ}K<2YDF(&zzLnMbEt(-_K^2+2bqAe znWkemeQc4l6-j5AWu}mf?7j0S?n*`WNLtMd_vdQ~M|J(>V+vzDu&hcg(Czje8Eb6` zlo4iv3m_VI-1Z;^itahp)ARbTy>(sCjd}eRh|Ow#6GGmI z=$7a5;;~z-dRRkM$x_#m%k^IIhf>A_++_n&MV3NKGo>{Byv-P;)npoP$dYeDFrmGz z8L_%Bpurf3dt0|W0sewU!RI~WM^gqK6%PLO^lx>1a@pK17tspYhNaq5jrg^%?_3Z! zm>_}xjNVAf5-sYlsSl*H{TBo7h6TiE&o%s74f!9o-!&?xSDn$pP;a((BQjgicuDAX z_RLM6kZ?+9o;sU`I+P%GuURWa|6XUN6wi@txw@*7c~c{hNn79Xpi|xth=!`;-_17& zypaWP>#sx_3wOA~9OOZ2ClDuV%z8fbit6uswc2M?AJvAV-1_q53t>=su2zWPxrJWt z#Pn!5GY{0{*MGGDo@i8(AD2GEdSsJkzqoOMcMPnrujCf~W9pk)`?fSJhoz+g9t3cf z5K$*C3a%Y77r?Q=&xJ|F0dXe-iqjAfb`kE5qXFQ~s~UZ(+K*yNR*Toe&&aQn2>1r~ z2dyoII8xU|OC#(VRjo8B3&Gq>o?kFhH!kfpPR-;10i0UMK!g#a753bHZkP^(O-}53qzjo zJG!D>#d#DoeV-FW`i~S21YuD(pT$2ctR>1jqmOJhhTkigIIyl|t?u)cRv&~e*(-SN zXVHwrGiMt<$Cg&~1O#;e*S@zjS3S#p@`s(_z(V^Qcxe8jWOP8I1nSOI_sc{1jr!#! zF(DEB`oh_bIoI}_VolSbX?^C<>TKoV!JVWV03`;L05TA> zle@E$ziK5!JN=day=5h~G%xlIsQV|0@3$rbo zu`DNMBo@^O)Fn5_nNnXnLSAcytUuJ{R9@{!#%I8kN=DF zKXj|Zg=i44+&6uvc*jRyCk5mPmSkxOdMDf=)lrX_gDAG6F2|kRz$Vutr164X_EXxc zuM93%4t%9@1Q70Ef@LilK=<@9m5;)Ou4!NTbEhKZ^8%i4{(g^*bvO5~MZo;rkodJz z%t3TZ--nL*U%-v}BFD%Ze&~)pAl03|L>~4aVV(=_G>0yL+&05&c~2vIf!8(DBO}+M zqErAZ&pbl}zW{(V8`RCmRps%6lm^s4l)tPf2px)|_|YlI$ghMSnX1=y#$atHf(gatrh0KusZYDVS(P^#}e%xJ7rHPrLb%H zD~|^a?aqF-2>PO5!gY>s1-=BD>N{RcQ)e4IXehNy8PQ4G<;&h@c@3g%Y2Foc*=m-| zv|2kM6MvUcehkIuwKyE@5Z7VSigiDOMNI2D&8H3dUiVHt8_XL4mVUs)sd%n)A=2(a zQ5~3waGzExWh2ag?L3`1LWlfPoKm*BfwYc7>S3kDJL0JlTe(_FZ1HmT-mO%$aB(CU zRf5GwoQSb$l(Tec;E2#5w!2$uVSLa0h8mhnk`77sE>tWZ=)~1V0eX`E@wQwODeKw# zXv1W_KHISFTZL|?5EPU`ENB1nmarx*-#n()@i6au*>N(ufqqNgME9hd{~P6S&!-|+ zrE(1x$YYhEb5@KmDak;17gdG^+To>7J_>k~b3*$~@sEn(__q9Z)}R0J^>^|5U5~!AFCyk7v zw6v$d_j7h>WU*h>1{kTI*{kEzLtOW2B0|u&M6aLeZrEcL&_0EZzkEcEO#DaKml{+_ zeRAbLx_-byul-f+|B!xk>z{hYCmCADINN-U4*%og4La%HDML~+2`}!-w@{T+ynX>f z$u=*Y&6tM$7&$9W!14a=OT7)R?VK6s1BI}^8Cgfujl)(ADFXS$R2MxaWPZzJ-Fw^ zbv-vudEtH%e#Zry-oEnHiY=T@`)412vI~DgzjPq-}kT#&q#-#Z;B&iQCUpY@v=W>_^;)S&nESZ@pkLaAGM5^N}863W0qw$~uoG$Xw+ASTVzp?)f|mL=cWT zj!Mj-8~bcin{tC(e)Kn0Ib0%KnRss(s+#ftYuwLGIn0n|vieP$-$7Q!@#ei;1WL=B zTOxl4Tsv*8 zp4`tr$Sio3<{LEH#>De=SsZxG1A?B=V5h%0~TV}OvE-hV?C)SC@J6plefzqnU)hdqIs)ougElvUeYY@v9k>5C4;_2 zZJ|qDyTXSa?SKdy^7x(#N)e79a+np{oLY%5JEk}J&q{#Y-9yw88dD!P1Q~ba==`3` z8o7Cn!-jg}y~xY^2_Zp5?!Hq6fA9ldyX*KKl>(k3(_lBuirO#L$a6 zblZiJSS~RiS%^N-c;SQ{%6k-NRvp)UpL&VLD5?MrAW2zBc=hX#y>aU}>-S!Twku`6 z;Po3v_w_A~ADA*_8{D5U@oBW%()1@t^@IylO&G#;7`RoQ0%WhosTArM zp8u08$5rEqqR+2iH8K3EP65AAt#7R=DB?$x&tINmXJy|)6M!p!u9UD7ZM!?re5&Yy zbW(X42f&hee5?Z4Cd>x%wIiIB_VCXDT6<|QE% zB#QP8Lh8MO34TkhOU1=hZ`7GhhDyD2*R@F%hYfs%Ku$twI_BTIYz?9-yx`!?=n>pW z-;OlX7F2bfI%8cI&wEo;oE>l09aQh_mzh_33v9OpAeqGq_ckurA_Lq@-%G1tHC&b{ z$rYRRuFRK6DV|hs`_bdh@AYTj&8ocde~?9tDf$=_s8f9yUmKb`(_ zv6~N-1Ef^`RrePds2)@~wuW(fo&Qh+eIEosI)7#n%5$5JgHQZp?z2zq0W;PXX&J!1 z1v}vz-5nI}mdL|Vs%c^9`nz7$ujPhjKVYoJ#6AeaN0DD0p3|a@PbI38LTF3exV-k0 z??}CRxV%?HsQ6~k2x9AFHouAgpDl}wweuDv(8m97c{q%A=)#ncD z>9`H+`cIv|2plPo+R)z$@AhOL>;UE+%0|)l5rPapF$T3cj%Un5zfEC`n>n;8H)wSd zgPFExxRNss6=Oe7j_jf^p*}sh^mli?CPe%QRsX>Mru&O``{nGFnQ^ zG4~BRKQ6h54*#1wdhN^Cu~oh0lGF)iX;sQd;PzWsrzhtD4M<)p_EVwZ$IK=wm|krO zR^Lm5=gOpM8>Za#13Uf7w)U4tdZ~Z!>I=OYN_#d}LrHUrGBKHZ6P;7Vevsw*!OR3R z+>0%wZZ7OPIR7G-8z}DiQ}LWz=XG<*77{HNoBW4lvk^H|8Yg7)tasx5lS&Ez7?=aH zoEo-m@Nb%bbh<&kTv+kbT-y8Vqir}|gB?rt3z6dGty}P00Rk23WP*fkBKxy~%;~u^ z2201?fss|Q5RmqC!Bz8Rgfw!7{zmCgpk{NkD{lDD`4ftRzr3+P2n?=J(HVdq@eMis z1Z9#j3mx@^PmPrkfaov^XkhMcL+aA_*xR&v9PQW2X;ApZGzr(~z(=8GH}n}O-PUf= zO~38Nt26XHF1}s; zqU;)cv8jA?xzV$tPH*B}^MIhXT6-@Sbq;mGE2^aU)w*s}3v@2b$*a2YbszBWM8H3( zoprSLKT7}Ojqv?4kgXR69oX)z=vk3}d(W*k=KJ;50bc6krZxNu>P<0Qc-@fsD5&gXO5r?YJ;2)+XvG0?@EOK4{htr?NvQ(t~ zhR(7fMVF#{Pue)S75S2KDN)}&r>4I>dKD)g+-r24a55$Aw*x;KGJvn*hL{qgXTu(9 zXy3>{h>#N$X>VV>9e^;cqvK7QLHz$l{KwZqZZzWur~@eCCkdh_@=*E=C5t&s4Q??M zeLwP|*>)mw;&vN+Jmw`K^ImRFLKH~JmeIj5k=zzdWQCuNu4v)LkNnR-pq&%_|Ls12 zk2uK0W7_=BJb*Jqb<@P=XUH7=rgc-HaZ|fUgarLS9|9l$ z?5Z=Yb}9jp9&@2w34N4bP2`9`*pp=r6X!#_2)@gYn^ttE@mk!`rb&J`GM1&n%}MMn zlqK|e6;x1(KOx14m-wa$h$a0F#=D@%w$FGUuO(K=N0Cq_1f*TzmJNYS>Ew z`>$l-&jJH~$DWTQ-D_0>9iI(JC2f1a;nK(W_=Dze$#XEH{y?nHh0k24HNXmAPb?7n z4Y`bVzJ{O2bnHK&z0t1ZV(A!w&IAVFAKn>UEj`9wNK|Rwd^XGP49%qfa9#;Zd?WeZ zS~Zjzqb*6p3W}5PQcjL;QmLrzPrTSoosPj5PNlS;D$y?H^h`fgj}7wJ43*^V*wq`l z+SJqZplQD$FYUztYo*`a9lBwjuwc1^1s@LJ=K8?L;Kbkh`o~URIH5fis{}jQ6W2xC zX)@KR8M|>hqp?(MUFVBe&5Apjk{U8ryKz=7;_)d}ukF`AB`4n8_v+|1iYo8EasKVG z$XRs!QQVStYl#01A3qqSq;P*;xz;y`9G+2c(~~1IuwTfVXq~Ne^c`Yfu<0A{a`5uA ziNv7Yv4{|+Y*_DUY>6KY0UXDwaEFa1JQmO3f;#`y;g9$gH(ffBU6g}W%);M*Z zp6Rz+{VVsIY#3J1rPg_kNfph5-;GIt_yA*Z$rHm@qUe?Wt?ZzjZVNutQ<6Qkb>dXz zLAy#$82aMML1^Oh4d+CItT#(`ftI3UvI)}^W?y%ZC;2C`-2UnG3qc0yoqpmi7xpq$*L!ec zaIF;RW44MV3MhgTmNI)vo42{>xFQEx|7}!`FdEJ>Gkg1%8Zc+Cd3vUxQ3)C(w<_+g zkq!(`S`ajbZbd^@3WM2xxyoR#uVDfsPOq_|jmAD+S~NHo2`K2T&=KJ%D)a+F*txE2 z00+93C;d9xyc2*;-I^BRn+r{`v6mu+ni|k zq15dY5McEE`2&)IG5K_ox-8q>$5jGxTk+@P89*QEv$j9X z>2sm3bm?kRUYJt`78=3StoTxI>abkP==(!`47q_Tf3sProq_$Fjq`*)d!i|mPBx{( zn=0P%fRin5CK2y{RmaWf*sBk$U&xSbpjJxS>qv|B?Yw|Kx_vTCX^5OvIFj_j26_q}rizQ&^kGc5PNB-S)A4TR`z zs45wMSywSQCpvhTg`@UK>CV}hS-Q-6uDrL)U2?L3XMuF3j6!^EOGBS)r~lw|i@5E^ z;G*5+(=gc$WQg2?<;rdp6O3A*|$n6=>d32McXL`%vdw?$YCU-nfF`l`W{ecrwJ}` z@2pbz{&?i*s({P(Jqja};iYB6>L?Szz1pp#=*tB&87>YYN}28H^JFz4PtrzwCvdu^ zGJq-{uHSK>;r86%!N7jV?Uw=czY5eJ=rY4lKpj05_%rFw)Th843wpyp{Q^v}IwKo7 zKgp%tFyg)-Q@<4b*+3f#rOyPaU;#UcKu_=A%efBX&C@HrDneI5gY2mFhzf1?|1IG^ zGL7X{}KLq-;Zm7X#y^Oo0 zBunJ8xm)aYU-Q=LsFT`s!(aT2a+3$C-}<{7~X;2tI!a{t>({_ml_A4*N~!g76Um-Q$A-3z$gdBJn0+-x7; z(Me-P^96=$z0nYqFG@eJJw|bRH~uMq zM+1Fh`liB-rg8v!(jT_Wdf%A-Ro_x4fKUjlY#Tkhi;rpppx0Gqf6Y(6_)~meI_(R5e`PA?EK4*;m_{FT&A_{P=8kgvp$uW%aC)P!7g5E zo&g6bJ)uCPF{`0yLT|MZDbw~fyVqRm=h)rVSm{BiuPP97%qcb*H>18FVYcZCC)Bl# zJ0(NZE-5{9P6~r_^7)q<&Ia`X1?WZp4A8ghA8NprQ&}Jd@N3fr>HMQECOBU9obIk; zh0Y4BZdYGK#pPL?kWaO3vwNF)+llzZmaJtcIpM-1=-WXC ze0N#X<<;hONz3339&KkS=auAio3Bl5l??|$qt*1LhbaD%-mb{i!Z@l=GQ#Rf%Xrgt}1jBL%#o@PX(e%jbS>* z3jb~ee%taC3YOC2Yn$2r!a1y~sYqRA?Ekmtc_+dz0K(S@$OkK$$Z(`>#irDagbYerspsoiP}1 zxyMAW=SQCv*f4A5U-kd4$x3-nzrXsli9&SjN_jHaCFK!)EdWLigp!SbN%V*8*0jK0 zIrkm)8#L@k@DBxM_nEw>PUy@f%x&>d<0)Ck@V6m+XRgMjL8e=KcX5)RCvt4zM7^4# z-s%DRPykpmzlG@P01WpAftLu!w07Xs!xw)7Km-sD(9db%S?1Uw&$&YlYnAt`tj<6m!-2w5)xW;Oa`cxWyi|6`0fJowu35NW3jV$k~gtz2{FCbB&is~ zWo)k*_v`DF(@b_u4R3%D7b)hSgv}c>X+xN7n;hDK0;FFoZ59QZpB5YVeETt~I zZl%wUl)`EQRjce@8~#D-XL;ta{Q`&UElju?^2Eq~6ilW3=>4bVf6DS_TB7F!cDiX* zyYQ|0BVu*xHkCeyXbV|pX%q;SxSe(9LpAy`6A&UQT7zVs+;I7zYNxR>`eZjm1MXd` zO&kI4eVgI9>$_=w^&DVVvFJXUwW~ij`@b6iB7ckiV_93Hpkdcmob)z+q$%LA(B;Q= zJNj%l_?(9EmKKUeJ{3d63Sxk;)j7Lr1KBRDtqnGSil4njGIRf*20(`c!;IT8MEKcV z-}raFNifFEwhgQnuygMfl;oC6o_+g0?)#*9nW}c#&vC!QeYdW1P{^~uXP-|0@N;-r znrkmQl%W{*-Oof>P^Nvut{f}1vUEGbEB`~q^8l}@4j#ov!fp-EIY_1E!5c0sp243{ z;BP+=fNV&SIZExRh9m6YYxCriC*ZspJSY}Xo!)DBVYB&h?D@~b=^On@+~$Yar`;^h-c zYP_L;y3W(io$M_ZW-62-F0C_tP++3J)|0i8@eRqNk2)hQnr8SFfk(^H{Qc&wBO^CJ zxS&eDo5|ohAhJPo=e6eyK?Fm&x<13AJjymB%Q^wtm3vG|M_>6>^_|R?&$QJIIl@j< zn*Z(h2SEI8$GjL>3`jsjJ@)FufS%;q;nAw{lp=C@gt|$dJJ-{|pasS8+A+e5`X@)V zAr@gRUMR}G>5`ZV&HByan|}Guy{x-uuXiYPDWiv)LB4Q|#kt7wbN+4`f$zg`o@IuH z1NWoCa5?`y53s91AN{)zXfwABGaFZrL}ZP+h6Xzg>HK#EAkWO@|FQy5Y({$=TqJNt z_faiDa{){E-G8w?`c<-_3$(gV>bfkDSx=Lo&3U2jRc6>j{FuYwGuQr0&^`=Xj*b}~ zBgJ%FZu^ej?;pal+WfN(5b95a-l^MvtdKT+Yi|~_d6QKFCECC!b`t=zJ@sz^z;$C4 z!4*5tT-${EJb*zTFg06zV*I9LO!2{M&&NS-v&$KA&JAqb`b}}<-oa_%05LP}(4p<^ zyODnr04-3J747>zfjsl0TTOFZ;&4)1Q-zkp1CMjA2f;6=i$@0llUVd2j)P2UC>k`N zvRaUR2VMwKYqcL`FCJ_0B(l-%|1w7~;oQVQ&P$58clQIS`n?{jOS{%;S5&f8RX-f; z#tkl_zpSNAer0;dNSUegMp3AiGDBg0$ELyP+aV5N(gf@dwv^`Zk@m#*ut93DuIq2R zf3+p3LD?4=}^|gJs`X`&@1~T{la-wbF#`!3kBggK9mjBtl19BJ0(&*b! zr)C^Rd|~N8SMtikPXoa2;tKL}MF{Bp$9hDC5p$+m{l-}i)U^&3Q}RQL&w(G8dK$ic z#9ez#7ma{9)vR|%>*=Ntib1PD-cU=m(6>uj?=9>jz2o2Lu6B^V2DvMm`WgEG&skcwj7xEko->%2&9ScNlv7m(w~f(Ta{ zX9hgHI2Wcexhf-WW9|_1^#~1BC6@b0-(b)7_EEPWcn%XR#C#;AK2E+j>8JmzZ#X`$ zX;iv!_9K_NrIF6kh}U}2{mctuBEM<^uCbTw8xblfpwO#j3&j->l1ezdn<&q^8((>bJP<1ar8jvAENcT_vqx8zz^>!lh*Z5SzXWI_M=%`yIb;-h3|MOUwd z(ENIerFG?&iBH6|a5?DuIvW50n0R)f9C02UXh>Yjk~LQB2-1SUe$T?$R%5*rE$K;r z&u!FB*m7WeNCbExr0A}Qmrfbi#%&0a#=dTQv&EQ|Qa{h;26HGohIiBjECZ2Ouv(wg z%~uKs)XR?Or#^22BR+h+?~$*vzfg5N0tLM9W5b9q`8);xU{lSMgsG`jekJ}AFpuRm zZzik7^j%A>IOCL=kH;jQJGbttH8!sN=_4XXz~+Sk%OF#4XIE{_psfihQ%Uyb!1E2^ zw^Q0$P%J&5g`}K{nd*mzeqlW1hGh0ta9m_zIq-!3;`AS4-kqXii0`w5o19wvCI2S{ zVBok_^P8~N8~9$g;P5~`Q;^)7)0=O+E}_l+ZBYOmek-?<{yLNv*=R}+0o=FO8BB~c z@lEt3^Zkxef;2EHq9@hClx130B1_=PQ3Oc?O$EcudXE-!oC=r-UA;)$b*Ye9*fA1V zUAAl}bzCR@H|3AFEqt;!zl+yXr*tGuL7z(nk+#H6L}A;X zbMFZ5gu&M}1^wMP7+*}$Gyd+KmplL;x3c^%ZdPhV#Wns@@%J{!9>@tMYwlTiAbht> z@mP~YB*5V1gR>&bm*^3Iqa*l-Zma9TuuwGv-JSMUe!%X%536{o{0-?duE%OnVXL0t zfh`qrXu!2B$UgSNY?thV1*&IWfY>~J1(1Di0?_m-!q{5anjV$Uq%U#&3`GTH)1aTW z9-sUAXWnnH3LAlD>WzEk-Hy0Jw0ZYiVdHUihfL^t$G}VWbfB83euf?8O;0#{N$T0u z8L-hC$>QUiX`8&K20uV*qbnSvJ?EDmT=yA)9RH2?uT^#y1rbwHSThNnC@#cPjkQ>Y zZ?Y*W6hZ_xUqJ6o_!X1fUK~?9<2&0a-MlyUmPTmgFp^%k?MdiTXai<6zJ38KWv740 zJnkPt1cWqF`pT9x1_Y)X>4Sg*1_pw+XRXV>0f4MlN_NwqYDZ$0n)+Y=pOIJl>#w?3 zDrlX%r%E)bJ70G;4d(XNSy<_F0B3ntvU#aU?_M2D?UZ}Kp0K@%PO(%QH@)4zVM#%c z6J}o$RA`;FpHeF_1<&1TRt`sQ^R-n{aioWiV5J>>F3?N5{BJSyN5Pkn7~g({9+6%a zTx11^jLWrWhs{m?8MOPpZ65jL+Z39DfJCurLDNZ2X^R)%M#;flyEBf*Pxky{|NE>T zG;E+dW=3w5vHYl>!&TmJGb(N*biHNRAw=b%PcYs!!MDHmMCsC300&1)eDZ2o3$wQ< zgc7X>9^UnJDsGSq&GyJ7K;m9r`)!`@&^E6rmmCJIf^Cwmv}Bn_VdUkj zXx$xV1r0@|SKP>ZEYe(-)L50fO|#=A^-BFJO-Jqt-!t30xpOib60@R)g{JMiz2J5R zS#mT_SiuvR44*#Eu2jusF4|GGn_XouxjOxUz3Y`z=<`8U?VsE>`|Msb3lyoTyg7IN z_fuH{HW?zzX5_Wv^48H%$~cH7NAoE!%PYAyn4+l!XHUt$^g;K(D*zdZ*-HIQnUlj` z3q=2E`1fre6`3wPyX({LcmE!|n=`?WrUnfb7^{djv7+797_`>vpk?hL9F9Sv!f>(~8mgh&p!U<$-dv zIkrA9PuM2;sy-$2d_|Qa2HsWi*dmbBWA)gFY3NmA+sx|~h3!5IW$qJ!%9l^px|cjV zJT3!;OSPB=M*;^%&wp8DLC_IiNkGU)IQ>a)FPWONn1a(*)@|M=#kpz=841)VUKrSR z1Ahx4CB8~Gn}~eccXj|sS4nxWQ4l~X>u9uUQ_~7__Uk^CX{LVrq4Axs_xp5PGZcmI zA{Y|DGvy8U08&qfEW$(3^@EF9KX%?BN&Y`BBX5xxz`1OBYOI2$`+7P!S3yJCdZ`7<`&IN@g*bYw2w{MQSEg8H@`)ybR-U9oln?&3Gbnv$;5!=^b z=vQmrEOawDa>Y6Z=!Vd^uJ{W%{R|rrEL0r|UEJYnRc+csUYQLuz3&+wz&h$2@{^yM zie@h!WyppuX;Gdk18q)f+?@GCzb_B=1}n6z1%&wA)*TZy8rpe*B;IvFotSqw3nB+# z*XRX*EOacwXQpuA=pvk8Q9KNG!1m*{kCyG+t5g6zcv)063*?#FVc+TN8$=6O2MQ{^ zpA?saF$9w4QhuZ~_QjWu#{yALhQG)!)&kb=xEv>lAfG%_%^AwReasQ#z`K+EW%xNX z@A0T5F0-GV>7fD&`h}va^0VU#n9=TA$`2qBZbRtPKfyCDzH+v#br0BfeBIAAkar0< z*Kx44VC>gAf6LgFJu^|Y}Xo2msV$jMo;-2@H%em!zDW6e!@EZ=?BiWeo@T#`GJ zrWkWTy|Ix2Q8$~XH8S$2Q|dhXlMHSw%C{fW5Kw|K#`Q7D>|hkAU^#d^p!xfQaQ30d zj!9|y40-LINEST?@MK2n)Rh)@GTG?NF_M=XJ#i_Co&s=`F+SD@UYI^i8>+>2_`-Te zFPyPUKMkrjPdGJ6_A`VY9jbupOWf!K5Qd}j8$8x3M9e||eD6#ZSYf@2%vw*>_&WqR zf0r~1LVd7K?6L8PBLE6eIid?cWT*)|%RD#D8Z1 z3c&OkfO}1!md5vH^^1gT?14%du=Z%18YKXVIX3bLAm(Q^97o`^Z8rv`N~A2-f~Eq| zBVKPDonEAw&F%Fe)P5j#;ylT}o(UEbqrvlKzXF@?OysC5Zm_p=6IGBK1|C#-w7uD) z-d>(|(%A23iyF@sM{{6Kh*>QmL6ll9xh3VOoi4Mxi z%%i^r0B0ZD$L=*bzFrv?Q$K;L!CwSE{L*s2@Xp=GYFqL}4<^DDwr&i$tnIL7S(WXo zldxVLK-xUKRU>)hm2gW?Z8Y`-QE(XfIM5mu^vf{2TaC9h&aq76TMz|%8rW3X$vZ}I z2;_1L6j(o*tkqCUl`%B4Oyn@7ox~OT4TB7}PxoHay!!M{FxiQIJr|VoSP&AX2zN=+ z{?!v}FWH`U<)91Y#=LF$JfT;md;mKF?rP5wx^?sJ`jPPC_oX8MtPgv zTsi1hMwC(3lJNueIl%3u5Mfj+j9w97HZ$-mc@61hIrM>50cv{BxIQ1wM z46d(^cMW1R{|E51(E&f$&OTq79la)#e|m$t_OJiH`u)$Bx;aH1!5@b{AKbrH+?5R$ zl3|cK+i?&o_ndwhfA5i5bN^=wZuscPaF~PN_DcGj6WJsE+`X=EvjS@pjtB3k?UeR) z+ubyT2d?z4y>y9A7Wbkmpo6@Yu}nMHD0c|2eD?`Jkw9~Mb;sL<|A_ydw>+g{rY^Fn z0OG0hMliLlYq?L)tMW%8jtM)im38qrBx{=^go)3&zsIkF8-+S!i4!}29nIfFNVU+e zlk3AbY7cDZ%xOdUO|%0rdiM@Veo6+;$n_!xd8NUjbt{$sq#4Dxhg8jocstU8cXX1Rk!{nivS_ zS+;F5i@yfjEIU}tYkXdoxM)x04_R*8wzt_1?c`0?MLneb@V2T+d2H~ zqCYqChY#L86Dy9Ywm7r>lmLOcV%l2e>RuhO>fM**oFnlIk=JpZE4r3QIN75zjaSrnQSCuCU@6fW z!mX{{osfcB>+}w*oqdjn3quy%>ujq22ka6nf0Rb#m7(q1HmT8KU&j&_@Iz_-v~j(k zEIIZ-tMudY?^;5fqXn-YZCrHx0xJY_W{9uV2tKGs(4Bi8l{G+*f);#{d!1*I z5$koKvt(S>*WrC)KjLT_H;ALqkk)4TTzO%E2N)LmW8+k0DIc)T8u61%h`I`K&cxlG zt8M`W6?3E#D?B%n3bx~~{NC@OW1NGAc5(^nfu7D=5-K{iA z7KF0U|J?cY#t7xnqfUjgj6vvGT&$$&rd8JBmvu_SyX#PnUlVW*PXlSGA;0V}UZJ(6 zH`|?`8=!Tsxji{6_VG_;E$2Ln$joOTN0^D=N@qiVmRq990nv*y|Ap}}bc}Ca6%C1g z#cvE=vq$m?KZ0?Ljx3tojLazi2Klu&`;npN8RK8+-#TdJG;$=P#3eYy9N{V0ST_6P zKP;bDxyA<`qk`5|J4oYAqo9RtMmTD(`d zG&giR=dgIug(g08-s=V$mveb~5qt3MMK(qmI{WXBP)D*Mz=s*=2O~PV zN(|Fl9Am{S9rC7K_|=5>xdB;WQ|+J9@K+Rp2~1y{Nt0frZJSTPEPbv zGAG%vCY;hsY7Z+f-^SJJ9H07!=^N7s2b(kZFdR+!h>4Tn!f*cBR>~i*?pSqyQ3>5f zL(j;`ZKzOnoB65c9?+D+Xzfs^i|Ltb`L-=F9}pT#v*X+?jkk1dkV%)gSfWY!yxQl> zyh`g{{V&4a`=9Fn@&7N8q9`NDZ0L|U+1sgPlsK~YQDz8{eVjv*O_`ZTL&qM;<{Vo# z*?T*(onxHC8K0x)^YtE|@8@#){sZTyvmW>B{d&F8aiawt&s?_jTJ#l#Y&-Di*|Xoj zOhMyy3mWG_b#*o$ZsA=LH#jEoQ;-7xhd^_UJO;BA0!TzigSjBglX z#$b8aV|DQEh!dVK$0=wgAe4rK5q4(|`;`55yd_v~S%B@tDF9T^8|7V=WN)^#4U zel5(3_j;4SHeUM>ze%J>PAzJQU0aC~K3i<4d2noq>_%MZd`L;FD#R*j8<9|A>z~_a472%&F7N9+|Y)Y;Re*uly#(8Nj#CIr27i@UQf5q(Hn+Jm%}f@ZALu z8(pYn%^!9-@cAee|Jj<U1ZgU)2f4n+Ln%KD({rQ2|pto1g!%aY8vbl(X<(i!vh{#yt*u$3H#g z_JY=?;pXGvB}EXM^N)tF_MjNm89k2f{S3M?WIlvg7e^0A$`aiY%XnJ{0vxZ}9`L_` zYav>qFB<4T%jX(>soj2-MQk_s4FVTvtP8EzZrD4K;f(`^KDE$z1wI}!2jyj_5lqm8 z6ux^8gqZ$~_S?{Zole*ZVMnX}5AmNqbVYq#1|?MyV{kue;?uWR+nHSp&eN&pZC!_V zc}{ormE{=Zmpw&zwiWU1KfAijz|BlPrj+)GV8xhji zVViRb^NQBso4OJ0BryR-SaZG9Xn8BU9;!|LlzS~zVMS4-F_+)8QPl1Y|LgtM^I*4q4NLH|6wx- z{$#LootS>~Y!B3R>^!3`9kZnJfmbSSS;0kPS4{a#1E6v%#_B<*p-f|^S?rFOf>`aA zfVXSu*6o&+8S499Tl>M6{kdsP^NtkxmSR5;K_)-72JJLF zChvvoANkAXsd}B3N_d!%tC-&0&LO`4|H1e+b3?!UJVrPH`vKqF?5`vC zcOqMuB|5e6i5F5y>*s$w{G0B7`4%Oor1#S?oOKXtJm?W-Q5Lf(3?RCsT26s+2KQMr zzUYAsnj#^o3+^8R&M9>{y5M6{%c$}G@$?Q_*bNKxwwK%pCmUN&Y_82`3|0ECSrKF$ zA%134dsx(Q^X2ipQ$mPjX?s6uVKejYocrociFSy-pF^dWv!Np_oym90Hhxf|gr~?# zuB4ru=n631cE5f?@~yfnyZAa!8vd}rp|s=2n=LQE-}5-NGHPMcqko*iJ={Zi>)Oga z&x&-9z)-B`OqaLc`V7&k!qto#@xS!{6Y+;~IH4J+%Z^4i?j!e#MzHN>H^2hg(tUI3 z>s>~?%oOG}FbXYm06LjvXL~tectY|iPa6!RO%ep7e)MxZ7*PnimtLwZrBd$!E46Wz zvNfP2gXu38&Mh;_6RFBSYqBzQ8uX$LCzR^jZkSUY`|fnMzGBe(w<8wHhRp8qNL;eY z6eZ5JXQu;Bp7u@qa96a~zju`0FS2g2^}A4#_oBXo|9FEc0gSS-M49hfU2X2;?-%%x zhR1q}>fmyl%hn$(IH0ncKGVn02f8`qpzbq79@cW+jk{j(4rr#@+Bs6uFO%kvKoCwv zS^AfMZ-#M@Jqw{LSRMc5SFd}0+js>!C}7nxbqV-IC7A+hi7h!&uetAi1%$tL-!c51 zT&5PBPe1-!1FqRwdbjG}WrtH2`kQtp zM?~D54R9Cz2|78=rA~`xe*!49w;R;2V$>J9D(~R(9pdILpyjB2BDQ)I)J;g+YmvO< zRFPu!>{wmOgL!_G*Gz8Gl^XDe!FB}g%XA|p^B~~w$F5PBCoLXmseI%OW;E8S7S2%y zMa0JsmZwyf=Xd^?FQpzb|N4ULEmBhYZ9nKwaqni}Rgx&EbiP5={OL&mf0iUrIoEiD zat@~LJLDk>gc&EE)wOq@PN|3L>tck?9+rK1hntW?CJ9&!E0paFx;mzLmv&~cSW*hC z-o&80%B9o2X|`Z&o%iPV^|a7%${c`lSnr-8>aYgxlo$nq>Yb1SED^4MmbWdN0q>^^ z{r@ZAANDukzn%CGy)UQIdkZ)oO2Ht)-5n4X88t(K!fyijr|-=0kG zCBKCqE?#2iV_^c;AYv#_?a>6_z#BpEv(&Y7Jj*18a z%cEihUL!xXS+6cV#G9!vG-bCD^GWOus(Qv8XO%r$rVJG*EDKipE&87pfT8>0=|iyc zga07>mF4Ys&F5xo{URQYJ|r(^H|%g@J8+yw9egPJi*E^>OKDc)$@+rIDkLFQ@+u+@HdmH?QWis<2wlHd@EJuRw zo7X9&*#NjXrC*_FTpEJ&Z}}tjB26YqB?IjaL21s{vNVd-(DvD*+EcY7o)DcsErTzd;d;zUcrdBh;fb|I&`%s6mYz zC5r1^-jdsWQxH7++0RmH856y=p8_!Gk?d+vzfUy<3K+9MxaaDc`OX~n?;q7q63mqF z-t=a#PeT5eEWH>sCYeXGYZho4NQsbdK!~T;%zVET;c-rVSoy3i&nP$VZZ117zt4Da z;6^f~Yqs~e(Lvq2AnEmMDG$u%^xILEf{$+8&prn<-E_UySAAf?ujl~vOcLX@H*cflt`>y z8Tl9AC)$*p;Cn0T%dA_XetPa{(yQ*!Oimw~V0O0sPtWA{pBlR+2$RF#_z%9P2K@iU z_dHO;Eh*H+>YB!nNQDbY#{YQzpB>es3nqjg-@#*(A3^+^QYF-0^f3-=CvF}6&G!df z=R@BiDN%y+iE{QbPV2~)+NpXLx;-qzN1jcR0(em+q2NwC|O70ox z)vVfSD9!pVc97Cm+F)bBg&=r9NS1RJOQz3uQQJMs$g~o#3P=UU1*$``sQg* zO5F9&Hhx=IdGQy@$NykWoBaAWT`w z#iwK`x~BwP8uv8MqBIPzqH07-cZ5F#*{k)nw&d=G^rS%dJF+il>TpH0j_>DGY_(P} z(^try`$)fQx_3(SB;C*V9&JaC3!g1>G%>dq(5yD4hWqIz%1qB`7q4gt5WAC@nwXjR zT?nP?b0FITQZvVleYl(UnI4XBzc$Ehs45AHyL^Ds#jVtgSy8+|mTuj#OX+}~Mnypr zi^(CH;I?A1tYgEbXx-_~>suS6Wm@{=QPC1DpP4&)CwEqtzy3yHAno@v5rR4aV;$;) z+==03DuT9#W?$0}sP+D33J0jPYnBk7v22QqX;UvG_OtWp+;uKKcvFmuk4RT`C6`Dt zGEH;UV((eU*W)(W^5p2=&<$Kc2afQ3U^ow|W)~6LKcjB@!Jg1HPGm+KXR70JtCiOS z2GYePj1F%Mmq`}XY-|b;TgF(Y{S+onS9FIF=s>NCa+PGmXZjvOp)&}kRZ*L-pE_TF zlhiQ8gB2^;bVbS#SCYL-5)g#$i~0Rhm*`gq&Av=6_?rbBfjnrGn?1=xo&-F;sx29z zH`DX$Wu_eBV)=dU&y4~f*#{8LO3keXl*g}N2N(4F1pqw8qM7U{Fzl%7lkc-T zxTtFfMNUqI?;NocQ3 z2Y?2q4?o@At0AGhB^jn02I0wJee-po=hfP+YmI;AWt<7JsW)+B+B-Xw2EQ_foB2e% z!*2zc?*B;YBSsB=k4IWRU3numdbmuVd|^C$hF;q5dKs#SVM~P&D%*CdCA14k3sdni z&eEmlyIk>!e zj2`w4`Nf+ZLcmeVX4m1LE+lXL?0*A$5aIrZvKPAc(%KT{7vOLrUquVOq^#^bP)m-n zWvg#q!J))GX6)QM3Z;ev1gIJBO1$dt{9){}C5Tr!e1$Q@ev{@x(`Cg1Gy$kh)RwGC zWaAKKCp?^Nyk}hAIB;nqsd%H?#kVKu3hGvBEU)7#H;RdBKjjuTba)ct%D(kv$J*T6 z0Y83yc;R7zBF}F6!8`VZ>&oM?J;2FkqaV!_hBs7P&qs87;^Hi@eq!*SM*eCpZeE@u zM4r-N|1rvdCR!0*gai+YC^br?iUWso{LZ)e@q_yJQy^;a8`^u!6pnhzYahD9HW1Ds*S#&G`DY>9& z_Xf7OxadLX)q>%WcJ)I3O<%lVitAj${k-3fxITq&&blv?mCWKE&bKiCl+a;}&bE9vDRr`jc zfU+9y@pxtKnS6b#9yFG3PHZ3DEBqq%=F!I~l3GbeDro{PhR0Rw5V+K{M4y{T5>QC8E_1=DP1m>Rcw95{PTidx2x~yZ|;(U4TlhL?-ZtY!KzkxH~V*X!Ycyx z{xLgFDq+D_6q}nP@3j5!;)+Qm>V+6@{eCocY-T4~3R{RUjvZF(Qyrt7?`rD`^b>~g zM?5+QSf}-d-EzCr6f}Vulcmf-ddm$ayTQ>z9jOXVE45DRx^(+HL=vg^cpZn$^<{t2 z^_6gp>Q?W;F>4i4|xlt%@h_9z6}BcAKm2W1rUJL6K7+p0T}uW$`ua9Z7|@=Olnkc!dg&#w}>!1^KFuDyF)md|fw5b(N9J7s- zKJpI`L5g21>v~>AeHvnJ^Lf{ESjaj}a?g4YTmnweMfL`(+?Jg|s~~A2%R$3Rv#bx8 z^4D3!4yfDf!H4v;WjN6~-jU8hfAQKI^>F$$`Dg~*8VY*b^BME(>Gny>1H(u=_31glo*aQU`a!DFJ-3nJv}4+s_1an9I-QAU+zC#*hS*Z!h}?OqC})d;4T zxPWBR^-RkRGACYu_!Y+9Ti>x*X)|zYO@@fQ6a|uqd~jcWy%29R3j<$xQLB6f@mBrD zqmIvQei-L${;NeP5M^IoCof-yRl9;)uoTKrd@~XEQbDshs|;gfCfG*_R;z#|*LXB;DaR?mIdG^-p2o z?CrF;oZP9jE)V@2zDn@v$dbd@6^pLEr{OC~8Uf58TlTFL)2KXs!XH~}Gs>Vk-*;fI zx51a(VrrSr;qYqE3M6sw?Z${|v5zI}h~kQWksRi4b7LCq#j~G9ek5MG;h#%C9Du#H zLCmT2@HChD{m#!7m39Y0VC{VMKx1Lys$=Nl(1`$((c3HD(3+8y-I8!UK3(; zCb!v;1%E_5(o#rEuG!CLr{$vN$#JdhYuau0mhK*%Q`E`M(b?#c4J~Nb?8Cgl9zK-E zRlA67-|!-kXGz%{a$9?n7iVE~eJBk#V`=a;ffxomx`3c2z@JYYdp|b3gnpZ+P1W*6 zAw1c{2@k+{A;rURi4WB^GB|2fgQ3$8h+ns-;LyFe9sRfnyPxFr3)U>w)Yh^VNV&bR z#wXUc&o~VcZ{!v;UuH>6M=(0DTk*3pLW1L?Jiml8<`q3^VMf!zcH;SoO&zLavW7zJ zoKvz*FAs(W=!(5K>p754I6qX)4c`r6myGv-neJo%DfU0GH~Pu9l$nU~1N@hf5A@6_ zJ`)SwGFiJN7v9idKg!{#VbL`ZY40dFzY}y)>>qjzDEq|>KE0bw*1KvM4-J0hKUmCE zr7d~9qbdb&n>KdzKAyK%uf5sh8WD$e`h6BH+j+z1#K@nUO1b(r8$rnStbTO@>@(J= zUxuG0=j?CiSqbQW%>V3jeq?oh3kHb=+<|x z-G{k3*IhxI>ozCI{(wEJ4T9a)|J~u^&zlUosrx#Zm^6V|I^JTEpxnLmpf$};`ghn& zR%o+wx$3E1D^NWP&28RL)3iR!{t`L9X9|sBz8zmcUlTW#{Oyi&^<%8ku zd#-qUSHli{3K#z9&lXfpX=lUD2mqOZ??%tc7mNZ`t64i3Gl`G9WS573>f}53EMnb* znqwPi8zmuyGU)1e#`Bu}Op)GqIkf3M_QD7Qde&bzv5lo~J7z4~BUaDb*M#u#eF$Lg z?uxf*ff{YB9=mj6DnibGd~RiAp&Q`kOztDz-lNZI3_^9@P0BKE(!1l)3oKkqqy<*OMiC`&v{u{D=HJmZbzj-WQXN_WDe~~ zskvf_8w6i?WjWK!oYzU)EqxID-m^%JB&U}=JvpvP69j6kzY1+P%>$4SNO)kC+-xq% zX0F_RcUQBvw;RaljX!t=>!5S612IEhAKvSiPRMumx+FP=^tMV5{@}~o<|1h_-lH%l z&Ax7RZ)0y2Ri+Yl!%q#e37qw*o3~Y8FS@t5$ZdI``^R5H^5am`xbV3{G3tgCe`6>} z=%$_mHP+9ZA!tv34dx|mMv_6vDVAN!PgzuWf~UzpijKOeFcYz#K_J;!W)G#Vl(U3F zui=7$s%}&8&4R0~s-vQgKSU6YQOHZt62{=_inhuvQNJT1sG~l(j^k}syqP>0dat>S zZ?=zgr@@V2?vHo*jal|M%LVH&3UDEFvce91smkJ@ z#BZ6WkTc>coYC%Li_~Y*7ZxyF*jF#M(AeIB<4Wbs@efWq;&FTjUkC2LqK&lQ;DcuW z1MCOaH39iY-UL)|K=WgN6#O3pf2BLiIAhE=?cVM=d@nI(UXun#k5UV(=RlG15SWSi2f^) z9p}@OrLT*=DImHAFkviY@UMT*f%cK$n!jv}uuF)O1a*K2-7>&Fhlj0pe<*-XPqot2 z4L-KY(3Z~@X%ad3vF1+H`DjV$XOJl{IW40m?&YR?N7{RH_3Qfpg_)HEr&2pcMb~%7 zl*VFg!~|Mc&k0xkZDAehWqHm#7u`%V>7p!KC+qZ#1F@4mcL{5m9@|s;Cn9)}8{!r3 zTXbr?)tjANr3yp)^UAJwA~LcXTH8&JsM~Am>?WNk_+v*43u{D+1P@B%VN}6I8+?-C zJdc4$rjxr+3O3F&LiHB$wNb`zjHM+iF8w^=Vu{g@LM`fd~dgqSdL+Z=|5CFk^Pe}9?v_FCYpl-$yXA8Cihh7$Pbi4&e%MD3vB z#FAx43i{&r0m_P5|6b=x(1dZ5mdVkg}||B>(Zv zdNRk|9a^JrCZ&eRdrRDZ98i(?ELMZqMt^FCaoPKFXM2jTIDqm7pmns37bHf4mfyIv z>;??ekG@AP!tAbmaQX;T7EXBw>I(2IN|pK;O-;juRW_Yi_&@zu%Zx<7P;2?RW=7e( ztJdH7c<>^zZOZ_9Q@3e*`MxcpRh)2zQ|GOw*H6ZD`aphW;fpTsKZr#nl8RB{u7vQd?07sR`gI=_z}^I$*)y@h2*v)+oO+C$%0Q$i7r(J+oUe@tc$;;* zCwIM#>fSf_)`neg^QX%9ihxm6h@IDEJQ%vjgm!A?1J)`lI;u*XEq|3IEXYy+`bOUI zFCx9O0KU@2m$CNn;=KRa#3%CTH#nVSVx zGsvTIBHrIC-zoDr%77OY+Z+cpuldG3FjuPy^neWnO{EC8uCp_D5)RK7$u3u|S=pC7x*GLf?>^8^s;N z50t{dpp+NaFIju-D!eE}5Kr@wGvq7WN4DzH;2z%}0~QmqQ#BO`^TdK#Vs~uju*{9C zw0HTBv2?kiTe`JE)Fu=x@_?w%LAFfE_7gA~`5Wp#qb}Yr2bEt@|wf0J@VGg+w;HRn$)pbtfg|o&X2*a*jA{U7t?Z!H(vYHFX&E% zPbx54{+X)Z8`T4Y963Wq5U!fYVS?X_)d1ocP0mg&)0b+m@iR%Q{<^DfSAX}q=hRWH z9qlcaJv8CLCX7Mnx?Js1H#bl?QTE9n@@q-+gXUsA#nleW(|Vx3y>O=fdAM85rB-ar zJ{RB9-v|5Q0*cg5|9Inhvj#WVV%nm&2ccCY&bPJw)7dp0uZ8)q(HEcEeu|oWIBhzk zZ~z5f8HCCmz4rW|D^?4@Q2*_F6q0}2!cP({cUm4^hJ^S2cbWg4ozQo7IjU`+ zR3z7_!}nLVw>y#Ti=Ro)O51wnWfUu2hj>b!ouud1(f9?AiXqWg zOzeFY07UPd>;y6^0-AA%&9J-yhTWU26j`(23wvWj?h-?U*)xn(skV2bKUlW;-$>r3aKJiZ z+y}9|F+QB2Exw*JK5}x=Kl&^04DSJ9^_89Dz_NAFyEW=GrS$QPbtrhVi0{D7raN4d z@Bb3+`<1ROAZ_sWgkSY@x4;;nIyJ$}`r(_wBa@l%=i|sgUe~x$z5@2?p8X(8GSBul zLG$@{YaX|vZYcnznPbSeDLJ3_f;HY#!#o*b4ng%M<`S0nHj;tQ&ld3e-qGawHVgGQ z<)b7Q;%XHV9u(TwD?S@=qTHYQ7uL_l>!&CUw+&a67IqBW!gj?nzgv^aT9*Sw6z@T%su@xI`+O&qpvh+IT1~G<#a}WJr|Bg9rlF# zEw*+F`ED+W8o-~Q0DJU3B3mfmXC_E`(e6YE{_Ew>cTuYVq|@|KEgUJtZSNuLHuB{D z8A*B&HO=qyg1hL9OQio5K`7xdb%d;!+Ugs&eVd4c>q{KY?MVP*@~TO8ys+gJ`dB}g zki8rAYu@dl?Iu@)U$?sYtEqsOSy}#;`8im%lSlqd^A{Z_3z~L-7{rG3?16mywdzOC ze%pV#%N_;#>?lvF*o;3iPIm44a-9Co^V^EO$TZ2@9OqcF-Ph3Ln&n#Tv~_rnlnewT zNmu$^UM*=5CukKY$kYA`@IGVRCZlpB9}y>-gyVv;)cBuX>6RYsaKx zdeAnvRJ+=wCz-nDM{_5gs@)$z`Dzfkobbv^%3>S$%MY{2fG;Bay~&VwX#8h?@18q_ z+@wleTm{#5qiTW0&JOgd>%-#RcI6_ zA>QnYux@jZ?%7{S9eCf)07~7scCGf*jC%tq9;`pSw-qmk8J7dX0aJu;XJ#=&LWx_g zWq+FMjM~;sKId4#sJas+M}l>_?e3qN; zM*VdgOZEFyX?Nc&;v!`G(~4pG?xt3b9kLjpa-MH%Ss||0l!1T@dacO-8;y-~my&#a zbdgfns+;t^=+bB$fH(m}$1HsNY1@j0Dzf(3DfB_9>j(B%#={#8by*IN+&82rJaz1K zisYuI2LnnLWIkmofpj{yGislR4pDRb-U1-J+YEa^UFp}(8Pwpfv{{MD6)bEDj#qtO z{6AT}Elmo8g2wivTC%n0L8@4iQ*Yh4H+e8X&>j17%d=`_XAj-0@TpyLy4m_uRFlHJW4hO0_ltFsc)+kFA|lX z(y-&aTe>ryetZwpg*cdYWrPzp)qF7ny}1`}ZYl%a6#PZ|Y2v3t&Cu@!>$fk=9#L9j zExk%AVYBh|ic0FRXMV50OM;%a&9*ta@cTxsAF4CZ)m;otrjfkA$a;g*uaNj#y(=Z5 z@@E|1#aMVCXzQsj!#kR~smdop#e|1{o>SzyHi!n(0n8G)J*Yb47!k;!xW&Z3qJ8W& zg{)25U?W^y^Vi3#OS$;Yuy=^O_dv;5Y7rE0ckxG2J+T_}9>O?uV^r6T*MB=1;nLKZ zCizp^-L;K=`TRRZ$!%3US3Yqcw;aj3vyr_%au9G={pSznx|{xj{R^h2 z>EUWVgvDE+-DXT}!;_eeR0dhq?^;3J@JQ7hM>VeO*k$)~XsGQ4dE<4m4Btv!K6gaaTYK{gcLk%hv2V-8 zkCvWj-zyb3WSreL16bz^7+*O5l%5*m=g0n0y$QJA+eI<4KAm&k1wb$&!%s^58R#e1 zQAAMtEvY3isLwPMOdy*v)z*^L)5Z6l=Ip+u+_V2wUj50)r$C7_9|aq8pX_=VBM zWtkG`y|7mYdkBSx*dwaVS>fahatoDYz?5HK#Fl*w;{Z!GcT+caXl=dg6 z9FFHI45`l~TOWq|4BR!-ml!Nyu998PgWrC_f4;ChdHzDbfF;=Qtb>`TueGPQe*&G1 z+z;TbXFUu2!ER)w)=o0^Fk~Q_F(GgIqNs1gRhJn}>g~#UR@yMDK-r1Hl7%VT<$s{P znO&1DlnU(^{(<(x9?PE?YL=GHn8le=mk73w`|6-55HwO&GHjLTtKQQCK zZGL3T4!|UXI2o%COsfLi z;bSXYXbq!W2O%EnU{STXn-V}Q^=$TZYRbfY1JhhSSJslw4gDD$O-fy0Cg0Fd%B~24 zMmLBqf$Kgly3m9A8z26^Jo|O@SVGfts%Wns8z7dx>Uk`1Wdl1H_~tjfdB=o2!aVAE z$B%*t(s^g}(A>`$=zeUjSRe>J8L3I0N%V`_=UZ z5e4-bc%kgK&EVP1i!Co=H-+kCegH7w(60Z7XFubb-Ecdc3HKpZoj@XiI+qGQDWdDS zv%mN}pNnAjyY=J^KK{2STMl(owekzk)pwFTcpwuT^>mck{zqhNy9I>X%Wb{A88Fa8 zkbvVOOEKQcscGt**JQ~Ii!bQ@FutPaXvn+BgXYc{p9o)#|^|{h`wA zQPLu&`;7KSs?^a{D)Qs}sT5LGDg;&nEp2&_FuWhl3FEjFvuH^A7;h!=<-7L*Rj4WD6_F6^SYx;@!5-n?PpM`%jZAALET`d?ylHTn zXPi6rQgv5#zfuCu14aq`XN~!@kwm@W34I7se|)Lg4{LY~fE{pa*P^j#D+}*@+m;f}xJj-%I7Yp&RBWm7zPoB5l_9-d|lm*DWmOC*`u2&3_8^G^gPt{$B2 zj%JT=xu`u(=Fw#H=+Bz?QpV2@J{6CiGb#-t0#Iv$C6;YBd@8@;)f>=vg~2qfWz5iH z1)#v`+I4z}aWD$%13{&}oNgJz@tPxWE~iyhN|iI?MHCOUY2Cr%0h(@5MWXoE6yn)o z92<@GhlMvV&C}#(Xna_*w%z*(8~>7u$@3M;czsRIq7LZj3yjK=S`TjeJl2SmXEC*lxp@qdy_iC>8r-xT5>k=xkim@T35Sk2ziKG{>P7yfIB)DZYP|V27=98`Vu%-D7FI0xqu7w$ga>>f^v8(db zvL5bEOA<2G&u4j$;C`gMib!y1eGlPtl8*7CrJbVI6@X7e-cT!h+L!aZ8L|H<>-Qxi zbz7VGP<{mxf5Z9))UZDFG{`%VT=c;)_Ix0LHr0f4cLn_df)XwnF|;N-T7)=#m1h6d z>;K_+a7M5n49ln*jfN6_0lJnaT*0ye5aVMg2M<7JeLlARkejzw0b9F+HEi^58Q-7G z<37|*uy%?Q2uDa*)Bb)3{?r$7@F~Bh*{G^v>E}OyULe;GZm$|dv*oO&L7`a~Dpd*k zJuKPLdHAOjvcz@x=LT%z0H0g5-@3x>cx$csZ6C)YVSn$#x`sP!3545263K=A`PS5G|GzbT*q^h9I4r&35rat1 zmUfk+h0)8gc!uT3O4&c}A^$t2KMQO&@5}*2wiPhwh1!{2>jG{J&;y>vh7z8A&dfmI znh|wxhlM;=o$k!ILTkh2T%-Yb(ZK0#6@uzH)WVm2LSl*j{Ih>+`ocl3K?A~KY)H6c zv~m`ZT8PV%GOXER)@~Yu?@q66Lw!uBPbIo%cnr%or-`(#%nF^TP*Jz>DW_cyd@#`S zNKw`%E|kD0&tBDbfRvy9*Q3AD2BXjNX8_i+?*25)oQWTQRu9+i{~5{PQGOH+irRbW z?Cz(Wr2nlst$wgvvTPf~kkhj_b+rO~?Bm8UeBKB98g|SEiC;9yU6pBYMg1oK zRSOS{>e}|<%uBUknect;nlj0U2d`-Soab)S54|<&9&)I(-LSNhUR_Thz{ElaoL>&R z5HuW5B>Zje_bChhreD^3l z*C1x{Y61=M=ob~~%RUDM7hA;1dCL;30FX!hEk&V(^RkD375p!~z`}#z^Dek+mnn8- ziKc>KQ)LyWtIvr@hd$^Mg9i41dDhk&ZpP-k@r_%$MRNx6|4i&Vx%uVBRYncL8JdNE zJviiyh1)cBDMO$2AU38s%4-AG^bcZ*@4qu6mpN4OX@@{r$GJX7^qAhK;k-z~K+RMI zf(rB+%Bi2zO3Zv%Q1pD({VoII3#&+J0T z3q=C#no7qnAuG-Xw|IV;>+z)yD}#BMxN?ybTRTN4-6m0^o+(tq-GwwmNGPxT4yUFfDE%8LaHI}!QXApzaTvF)`GWQ zx=p7e;Cn60+-!{@YM9i}_wWUt*jauGb}zcMh;qp`=(JWHdgxN`lZ*|r`(2QfkIaG& z`jb^n)i|*G3BR+FH@0?b!|iMG(FUP)Hpe&RjL-YNB4R-Nz{jI0ZC_4VuGNXgaD)z? z)|j=$`2$T4(1`!NOsS{KJrL}R5qaka1hy*Le*t>@P`+3$M&?PHeNoP>7h*SyVb?v< zGmgRuMPrGTb=c}x&v_G+9n{t~Ta6a5rB07--U@)$q`F|&9Ih;!PAw1*3zCXXiEH*} zl;?2>>h9xyodWlLzR;eAFA6X zV`Am3lHD12Ra(y7)v&@TsfYe@$jE#}y}|gd{)(qL?04@pccvpR5vvrtl<2I~drBNV zL(opMNUxA>x2I!n>Z?9I-wGy$N=c{&sy)#mHm${4DEFE9#wAQY5VpG%c;|fuNR|m< zO>OE&6Kv<1W>L$4dQy7ocIUEmo6^-vu!Q~>zdE8rsOyk>X(ln#h>)ucb@LYbkAENP zxzZnDblfxBJ#ULgiIt)#>t%0Q++J-SMZIV_x<`^_{8rS0?ixy&xR& zKHxt*10-%lx^47Ov-(Lm{}p@;%i$&CVOJaO@m(zMQ4tZAgbW*yEKZbN8vMkJVr%?t zq9CmHdZ0Wq)wv6KZIRFiCo7nnlS_9*f82VSG#=~YuI;vCbwQ6SebBe~8$MpAp;ae&3uZq}HwVPQB4mv!^>3jcSj{z!GE8HSSSI3&$ z;5!EhUm3)!hNTfNeLa<>bTU0|%`ErDxE>FNs~6VkC^ zaDe03t;fanj#C=9utn|%JR4lvXv{GOK}SNThuQB`>sm|i?&oOb`?Oypm3@6t& zd5M0}eeR8w_*1QkUZXjrox(3)-UR%1diG-T!hdD;_wPRlL+^w@&YPS_`1M^(4a1+w z=DX0vuWv}(6MDc1r2oEKpUhXR=RZ*2`{97$46MR3e}#N-jLX<&n01!inRb+M{kgqW z(8fi`d?u+`?U!b@9Pq`cu&44<-WM@K(grEJO@<2erSnz>I0^MXK;YcmJjGL^`WnNt zG_fLc{|5DWUv#z`ytZ3RA@&xZjgToz;Vc46Y{l)t0iC`Z&sd^qT-7GoOEPR}1r3FD zmmq{jwF@EmvBIj_NcvabN+UZX&%7Y?t>roqN}tcwLj*rF@T0u+(;%4ER1sp`B_ zGc3_SbavM&tvC{(LNbWbY)d>+xLfk-kolZekW;WfLHAPNr`0NlHch$rqI|N;F1!aG zg{Q{lvb7nv)8_;Fci)InCH#=;s-=BKW&!e)!Prn_taFd|v)<{4t|M)^}g3CG5mz#|J{L-9ERcI=`P%vXmO>_o>oEBU%D43QQxp9j^M@nz(QiRgE|X`HTc#zFEH)e zlYI`z6$@thiyWR98@fzy5yVu&--te-%;>-X-|G!uQP~=qJ|X#7Owq6CBwRka7qJu` ze3`mIV$BXG!!f6At`f!0G4~iEA2N(R^6VcU0m8n_Z#1 zi_4Mg|;uprrYGaT+d^W)Hh-yo6p1_E&WUJ1CSi#_2Bf}QYrU& z$${UR0qdUCr*vUm;kZV1k728501n{N&BeI8DS;4gL7vlL$$|-wE1b?xi1!V;j6ODU zAG}M;bf?Kzt&(sGia2w*hEWXdq&v40ynE_@GkhUe>oZer@d+PfR~Fpu6)11k2m~G} z&*i9>#g%I;TB_Gp$MZCntBFH!e>T3LQ)R*`Yx1wL^F;ysJ5mSOMb_!vB}SS0_Xzn_ zD`-0t+B^eJ1^9PQ06t`9A&V|A6xaOn(I|0=tME|E)o_gEQgTf;4f4&Mg&;+>jF|^%+PnmMROXM}$@bhE@!MUN zKvO$ip^;$-Y^}}O75llNv%hB+iSu}7WC481tasTtgK?GW+Y9t?!XAv7FvF_oPi?pt zP19t6U$}n^B={J#128A){HfHgHu&1&RhaXp;!pl#x^9K0q8j$Tmgt#0s5GV(01t`w zB&jV%jlQlQ>dwDn%K4dFhVz5GlPEQ(`y3atQbKe)e}0vOJ^zP%&)7me@wv9^opFIX z!1SqDJdf~cecs3+0Lh5Vk_1P_6sDIeY_H6wcj!6_Gz&2@l^KXkciWRz?8yzZsx7~xE-T|GMtpK~jb%Aa6VN$NiT#AjSfu-~FP)B}TWE4GqIPmdR2pR0?` zVsNyp{xZE;Zi-IJlA&)og{6*H?V^f!{HUkaP3fuYnA^1Fh0T05ig&d43~obDw9sae<5 zP~`(h#M~Go|7nc&b77Yr&tHVr?Q?dDN&18BsmbCBF@liv{OpgPE~@r-j=R1Nk5K@Y z_MAR%_5+cLJUwZ}6O})>J$|2x1u#Ct6jW~as@udhhRb?>q>co~!=AC$wry5>3VB}e z;X1YCcU!rj&fr>^#_e&a~WzqvvtY_cjhFwEU?`O5XHO~}ZK z!fR~;vk3u`j(sJiP8wBRl^R;3XJ-Fc^Xblad6w+yJP6HM412CIxgbS*ojsj?DR7a4 zGcr4%5|WCdXr+Ey{Afy>g3ch;grr0X7C%S98%NLmNx;fm=!{>Uw)zF%;F(t`wjVl| z+4EMJYxY)ncFmk!YM>87z?>Yev%rdyqLT0ONq`uMdWi9Rdgad1_1g3Q*cn~cntE_0jo-E1^QVZE;s`nP$wZdFm|+YS}rB{s5!Crrf;=g+Lj&j7-FYkBB7 zw7Vp9+!m7EgL9<*GDOLV6$N63pH&?nD)f5PeHWR9x&u5sV0SUh%~Ua^<&ES+v1yDd4DP)d24Qf!)j4-d&gSd68+{}q$zfmmQDTv3O7L7YLy>&T4b>p@VhvQ~^5o*9 zXY1)DZu`FtF?kKC)$fyVN-J(wSR;AzYqd0;Zq|!@stpkPMYyE19--UXJc~zn^2`&g z%<%=E2`lQ1!Qt2alhU;m@t?d2n>*L`rC{4=obbXjVQB!zF)7H1o+}NTCSUszy+E1X z=A8bB_Em?~PJ$|gQjXwLL@+f9xSwr$xpScyHzU2TUk>`plB5zrJ3hJ+mZM=u-df`p zk(1tAJ&~Zw{=V(aD<_&17}TP7IBn;zKhUeEe0K%eqODfV6t0=a2#R#Nq=fife=n@K zcUDE|&*)z1v@`xCOxv+=n{}veYT@?9f<)D%7-ld^HNi#4)?6Nx3kJsaOs0i@@jZIi z(>rQUrWt(lkx-V)1(7C&65$^yrE&l0@{!PuW_2|AFTGC!%QOw&vE@zG#=+T=_lF4i z#&4bvukE;fiz2r!$fcRGEm94;1sHzV1Twf53GMk_@cF`tI)I1v+ciIQGlO2%@cOq4 zz>8~zn&Ch z3uhJ_b4G8!uMg8tNijG=6K{MPF;h(P3$c7oMQr`VL2o}<+(v!^r%Xo^JFp$T8sWyu zmR4(=`X8cC+ONM8X!9>?J}JDC)>i583j_N2cXcl~j5L@6YgG@E(h43%ot64x zbkdjXC`Jgr5#mtph}-qJM{a^#@>@S`*K_5gf_b)wZE>pOO9Xrs4VrJlD%b08gPr5R zi))z_eARl)(FB zABzwK^NF+6GH&@UaAW&UO}-t=efUNm?o3^{X&!^`_&$DHN8M0vTx#4^N--M-IuDS1 z)4mJ?Lnpz24Q*kvK48B6jrs&@X0 zow=-XYXa?)Q&tr`81+dyPXSuL69RcZqt*{yq#xGctn-(NDN>{ah}^r<5)h(ZD4TV8 ze4xs7Jf*BllVLNt-*-(4omQ1=eC90jV7169cvMAeVL1^Pg+0Zz*`CTYko$27X04_$ z!^n7{k~-qP3AUVJOprt=I zMj>@o!+j)Ki>la^tDLgC$iWwaL(YSnUfghb-%IN}iXf2L9*B5sdm*luEPo4Jpx1T8 zGFLp46XxA>h`5YEzk+uj3BoK9z(nUjPX|9-o~@m`>t|zrr=qJh_X%+!N9CZ79HU+~ z{TXFvkb3)h-OO-~PBy+m=fO`p3lmSJn^#~i!p4>>jFFvQ+c8AJze9Ur=8;{+(&f(y z)ir{pfJ+Yb$^SKasnf;|`M|NBYt>&@uALh2N0C22ggiSF*h}fBn+#stlxem`3op)l zw{4a|;Q+H24}9Kjn7WALv8-*qcMGPFN?AYx`4>4t%tTv^@x1vVo@mv3&fhIU}uM_;d`&24**KjjEB(DLZiV@dOj4oKxbr z`uN=UujSP8J@HQu=prRO{2wFA^%1t)@*f#v`~t$J`4L2ivvy^aolnNzWYist31CNQ z#=>6%R=r71T4y-xD?NUj!iNDuLW$IXfwkv6-j5iI&SedFL*lQ$P1dS{0buH%@}q&?&F@tBUg}~bcZou zgj%qI;CJKmsv}TY)c$k1RK#CHz5&K? z5-Z*2e8Cak4L^Kxx_rNE1u1*^@j`t7|B%NBk&wZ9a3eqjmGpEZ4|A zDy~GKMu zcM$Wt8Q3T1IXj1lR@#6V-4QePz zY(JOqN!{#`6k0F%q|~tlI^l1$imWc|MA)Q4Sa}@CND%vK-2xgS4!jLvBC}KP8D@bYW%zRR?CMJ@#e|XF+^1P)4 z>tA@E%9bbxr#o>=N&GzI?nV#vk?%`P*Avl?b>s#rUPmHd1lyUqnsxA+E-Cp)3dTB` zei?GR*Y{nDRp0{4R1cD){#OB@X~x)~oM5-BX{1uz$XHbE8?&@=yW&wK8HDU&l%$6K z2%5sYyU^MgkB*(kMAF8Rry-hEG?ajLmBtV9`pg*|CvW5BhmsJQZhcKh7w4%E?EWhL z6F~0OZyoR~x<^K1y_@9%a3HUfN_``b*GwV{9MwWLUFkRuktF?UHW>tjeG%eY2Ii3b zbe@0MrGjQ9mskeNH?~;s{Dv5Y?gr#NJ-Z(b>EC$vvp}{p!zdP8%ijV%PAkcmKh26& z+*~Kr`7obHa4V9w25IIY=8a5@2urG59k`(u0D3d__9J}tVrAC0@;>(V)p#P z{97I4U+0IT8I^Y(^P*=(aL1t!PNGhtes^>m_h339sjY87zSb{3NMfA4cRA0G^fgOE zUGRz?m&f&uX2WptswJOnX)ItJNywv|oz!sXZ81VWe(dMYLbLt6HqE2Pn$+`hz6@rW zPWpXgMjwWg0c(aCms6$w1vRD~zLHW;X>o@ds`TO$J2^R!1$KPpZmSj$MLOMi~?#KgmDLRS>w2pOdvO8k2y(Zk7q@ zHh^Ko2fq^RJDfvbX{*mx5V_}RKc$$O(*c5yi>M>Fn~*!oakevB`cqDSefZlQ6-fOL zEdL<<`GSY_mgR|%-SOMldKN(r2R*@$*o3>s-!=+%+bH{X$1QHMiQSP|59!|p9`Eo) z<=nJ382$OT-P?<8$Lh>`@qwo!)#lEm#nspP{^9q!-q*x5#7w?tMY^lI zao;tEQg)!fHT@4Nt!>+Xn;t0Dn`8YnbiCxdc`Ss(inLH(;W3V+Kht{U^kCbpsT`I& zi<=|kmwANppyq_h!=hC3G(vNuFwgxSd~j=CxbhB&<`#EboDqRMn1W`d;|Ki6VoEri z38HvfSj?D+yd*j=JHTvI;}IGKSn#npH|(?KK37nejY}Wn4!)~zw~4J{52I-of5d_- zfGvV3aS*>{23x>^?*wtakrgT$LcVL`8;{wMfS;M*@Q;`EDL4gCG0Y(>u>oo&-M=a#tWPndv$|lvFku@7iz^Em&ddzk{|} zCjWq!L!xzU1vC|Vc*?g6K8^td|JrmCv*?tQTDPycVz0%8p621zZ1UyM^9;9r=;Ps? z$_AKwNAqU~m&CL}{$cY@DQqc?U!oqTeBYlRmz^_G?1c*UdJeVhDp$`RSF346Z-?W^ zM@dc5w(lsg7HVVG1@kFU2*mnr&GXzFVc=9JD07VJr*K&+Hm)=6P3njKN1F7GX>YPF z8zh@PsM3&jLis^R3=@bP@&W}Hzb5l&IQW!W1e=z}CA!?BOQwVI2t0%oq1-Rwex84| z4JCd1S9O?R&qC#7lIk`yU+|80!Tc2thE#>C;h;ZMey{ek?=e5|P)_q(LRS?RH%m`c zlTE(ii;lB$!q`$#3W!8wl35T1bcEhKlh2f-wlR~JR|sLCH}TZ_Ht^l2_ScW+xE0St zx$^rRVX~$i?0uFSF?aq4mRBG-wr%+^jn=mV2KZIvjtlu|5t?It;(o?enXvJLQ-kD{ z&(CFUC>0OsJp+-PV2_a0og)x*;nv0dcK$E>YOt`4P|5f9Ve%b~;g4cg+C zF^k=~IF?IZBBD>;Fik7aj}R;$VvdR^kWPi0o8?UD3EU>I;G4!<6qIZZ-)j-rA=&;K zy)aRY6*7edZ&_r@08aey-(wsn04IKP92!bK%-n79z)hliXBkUyIT%OOPl-zK<|N~i z)0x4TJh!^FT7vh;<5F?Y#c3J_3q72CgPCg9>^wCn))THtGKwa6ynU>YK7aEA7hVd6 zDk~gz$C*1tE!9)bBAv4+uXQZ?`ct-!E-hSs+bQhJQ$E_pn|ekj z%R@Ww%DQfA2zGhJ1j{CZzu|}?l?le5ckzJMD`qvCG~k&LOWW&*^I$Pvom*GhoAWWF z)YB8ES^o{+VLL+SVSe*B;BZsV|F7_!_8)!w?Kz9nHg4i}P%oxX&@QrZGx1*k#w&*d zTBCc~C{TkWOKh}i*N!uT5XpzNVJ2CA%4(q{r zz3rf4hB;MFz^v1l^dGWSUk$Ul_~S2tk378;k|cC3cJVRu!KxuirwIcR*}*rF8$f+M z-uoVnnn)Kth7{cXFlWVf*0|Tq2d6PlRGHt5=h24gv!^%7J3LNQGw)X;^62?f8)kW@ zb}tkvbALUB{959%W_o;pBnKbp^MwBNO$Da(mmNL}Zx??d)L(0+mMPJ*IjxL7hLqqit_-Cp2oO zS%_vO!cN``uH%hovsUNUXyK5Xz=0osCR~YEr9J&Nt{eR+FWo4V@zjQx<;ziWpYGJA z=#rZjy*T269eH4{o1&qA%NhXiJyGSjm@uvb#3tE~?k^zQ^p#cZWEn?2JUxe+e@C-Yp?tjs3)+ttH9sv>0_Q1+=@$;2il- zfks8iXj-2Wf1@IQ3XI;=IkLb!zt}6M{3mD+-cwDZKJ)NoERbfW<2hZ0&w~8mQKKd* z%Ot$Gys^1X{F}7D`#+NQ56hRAW&Jo&g89t6vQQdASu!%Bni-;aN6FqKFLL)7$3zn0&F6Aq141nunisI5rkgl4ed>*r@M{x z{&3EX_0-v&sm`V-_7+|obdl-z{`Kc9OT5*Y=Eo905=lY`tpWi>4JJMji`delq z@7?_COI?Cs_gM57HyAN%xC1d6GElMqHmX~w41B!-64#cF{ znZcw?%q=5@w>o&tJ&1oOy8=(C*Db5X_3yj>!Un&@YgJV@pYk8O>0Qp8MM?0alSaj} zj|0{E+e)^rQRhOK!xi57&SPFHy%GPFBkeih_9B(atNf;Cs*6SVAf3)dD|YAZDu{D< zjFT=o{aCJAd4q$Zm#h5Cag0;0282Xv@J%^m%lsYc@?Q4=u#ee3nO8G1)nvttJk*4~ zLPP}<%qFMDHr*z$-M_^<*^zP2U6@Z+7xlDI`n|a(Db>()xsLQkr@>Z(F@>E`wSYG+ znFt|IJs*|-=VpGkg9$FD+59fGP)UDK<)h9CgcIDr({BfmQr+4L&>i;(CnZJ@I z(M->yZI7)NbQ~0zBv&Fa* zOY(k(fQ@hcccql%t3s$6goNWU9k^|f+}zW&wcc86Uer%s%sF5yudWGkwr506EK6>& znr=6};0Gxx+WEgW0@sq-5S7wzTzl_anp!7z0F8Qh6dP=i5x92OoV{(R%S!fY_gu*W zq}TTdCqe|;(ab-xpUIqyE%>7Qz-ttPSw_M4`U2relMOyntH49eY3;tOr&|5)1HJOH zR|Bf*cddJvyedBb%6c*xLf>dzc@Axq2N|h%ng9^H+4t=K?X_6hocTer0K@Q>URvk#S0&Mq7$>Zgw!MxKC?p-2Fq@MK#v(qJNk2uI`uELPm4r9r1Y2 z)A(0JIsu_eS6mAH$N>X<^>yS%bDL2TDJbyd{X4s=GDb0I!2iL>4a=UIG?7e0KioAZ zyGv;96m(e0lYumSF1g^rMdSHb(B(2;0kFcLcHysu&oSDP`&}WI%sqU_hTV)di%)4? zp2wB&ft4-&(6<90#l!_YUqgZuUzKl4AiLl<&LC+Qm#tveyZmdZyhG2pnk82RN|zPq z&t5D1d!#SX9kdF5{psgtd0NvfG0D@p@$#Kypm;-4G=;rewKw0on@Q(?jTug3?|SB9 z;I;J*AG2^%hX0n0N>#F;z;O9(smS$Y+HYuDQx~clsUJH94CJ%4_qZxV?}VR-R;!`C zKEP;(96oZsxu2$LCbb}D&wdAzDIOQ%N+R7b``Kmit+;Ubn-ot@5tTj>es}3&j}K6z z_j@1k__o&`l8U0+ke7<4KxpGEudnB7(VB~_Z%HgA0j~PHbxSR_w1*wnEcf&0Nb*Wp zMvW5pHz=kzmWy}Xb8R&kgn7lFqak+~ZqrLQ7-;xIFSQx_-Y^4uF8gp*dk9{@Nt7_w zLm8)_%%x?;Z}raa&Brb$rc&#|1@^8y6pq*kEGYkJgC~WnG6wci3?n+hBGEyyBj||6QCI&Iaze-D#Dh2#xivvj4Q#MN*3eUu`~`=dfigZEE+u7UP&qi6iGVD=ce1k#t&Ce{Z453>E#rO2y)4ariMH zwN!Mdd%<$0`UY@L57$+je{nj^h9N}wUm5zIm@WC}uKlB6NNM`S&vn>*3p&@AuT}of zC?4-l&V9R(S9YyH2lF|RXy$wv@{8gb+5N#_a&=pnMPaY*15lzjJ=g>al!esy&yW(; z+YKKNTW4&Hga^0y8W7jvtDJXgg!_SgjTP756=xs28)5Kr=Th7D{@21=BS|Rmx(zc<{!p@xq5pDbNAQtm!8rh z-v#kV)k=RhvY9t9_#R*Oq4#$+prc^246Iw+Xg}`bQ}`{7AIkRYkG(#_gK@>1$^9to zsqjeG5zphOV(ArMV!HoPgP`VCYt}uykS^W3c_-NTSWV9+7ZcJHW8ffPgB#j>tJcPK zex#f&r!5I9U+t?v2mIAJDrtT#{^65*JbOvZDYBfk_fc_~Cttn3FwNIJM8!)zA{%_G zo9Vj8vlfF4DkN_=WJm*=rNeohH-2e=S)XTdZT3v?pp3(PB2fJE_J-#t8@uJc&yd*A zZ2D5Tdb7-?j%c9Czy({l$nq_DfDIL{rlB!>a>?7-(--cf=>EE||7LE`a&(UzkO_}8 zYDl;Fup3{WFm?GLYVBF*P)W=9&PMgzGW#bR$7#IOXW5w5p0y4Y{*O}(7rMeOE!r(6 z8wbF1rxJpZFr6gdTd=qX{B<;=h9yoo!p=b&d%BA9LZ~Sy3u$|BNI3x};|Ou9ZVzswat(q@q#h_8* zMllZm&CuV{l&9~GjU*jmuxjrBl;G2!|Fu%XRp_^6PR0PGEth$$c}xBH(xpG*dLd;} zXz3Sr_4m$`s^@&`t~AeGF(>j@Q=c-3NjAnoQ1M|meWhO(VMeV?ei4onur&X$rn%KI z&vO}F#OEelq|u*5i0 zq~~}7M`Qc{EZ^h89?2=TUu=hwI*#TM9#Y>DoAS&ym=X~wb(ORQU(~^#fh&HMtDhPs zp~#ou@8ZKcdttdx=xCd(!%Q@o+W)JHZ`SyQ+o5Bw&ihO(9&C4gi6e#srZ2KSGYliU zvkGSTZ7c9#o6AOfQnost>HA`8B^qKn>V?m>!D4@3bbm4`8B$BRCJYNCIvU<3*Si{Y z1RJ|eQ42OYa7>o`+~sQ>zqbHW{SzO&zM3Rt15CZqG<-E(!(q{^8%2by{uY1#Jecc; zXWFt;LC+NK#qiqxpgVzDz)f}itEnGd0W|g6S?i35lehH&HeL}|&aD-P^ZFj>IvO4U z=0-laJI)n0w?)}mC*yUthU{okQ=UAwm9sXm#cdXv@eAL-!}n8IhI>?YI4t&R2ZK4R zRGoqER3|9pE?YLd8TtCvSp~xdHpQ<#8~`S-_+ZW63t}gG^=*Q{UX$u?t<4mq3DD_$ zwv!atvv_R1uNC2y!`@O(+hu25+$J~Kzk=`GIrru+VVQ$U9ZD5Nab?27kM059UjO6t z%T@o^UD4jHN2H3@oCc%inhW=i5-{xq%}pb6bg0v#LPzKM<;Vd3%c!I--|tVe$6l=N znK`N8sQi7ysm1tD(Ia!fNv^8r;d?V$!4c{+GnjqXxZ~*8?tbHe)cBC*M^Ep_ea{=* z#1m*+{CEttb@$MQ7kN`GXPG_%>2o{CTv%lxlZ7#4I~BHdJ;mqK4B40=?Kohk$8L8K z+VWsLW?;RvSli{`-L!T@TT&4%#Dd0>)W4W2@68<0ZnVXD`wA2>%B}uzfZF-KE9=9( z&6zWp6Ij4cA7o`ZRDL=Uygx`_m{Km}ul8Q^btUHr96Q_! zB{(T&x7^FI9w;a`CwE;m-TRhaY~Z;a6+`QL7SSc(3_P4&3(ka^5-C?<5Ub4>o1>42 zyfd@AS}x+S(YHGoMs`#Z3!?}|DbJw!`k9s>L8cST*#Y9G4~PG65P zS6T!LI7yHfrpo*FAw}NeWxVvODq8e7s_Y|M#i0U(E2rfLJ1 z;)92aeICy9ej~@{n*~~ndi00jSJalNI$ce@d zefShW5Ryp|CQH2~3ty~OdIMhoWYqiA_D{Gx6F!S@b;iB-{7)3mF@7cggUK@>ie$OH zEGm3f(1R>@v>X(qXPp^4TtOa!0$V*s_lo`RSnkpCm*;fLCQ123jjEwxagnIITGC}`74^J0t ze1q|v650!}k0UGczf zk5K@WzmQcAgG33U-d(G1CF*+#n++M~fZgpg zUzUQ7GxNAuJ-N1y^by7!SnlK{zD{|6SoyMeDA5(HZ|dPoqsTZ#-x zvrj93)E=`uDE+eD9lo}CU21^SG;9=1orP_3#K)-Je%M5qpv*OJu}D6A8|hcy#{ehe z#l#1}gn-gd)xf0PWiL6%Rz_%@TaoMt>$?A5HZxXgh&Nm|G*YXPZI#Yxnu1q$pHNq)?G{;iT%m-=4i}(~LjSh1Q)nq8Bw~)Ho9Hs@6lp3AJqy*qRpH z6Si}t77Iz*1!tTPOl>b`IU;IAV!k!1Vp3NHRZ72o%{)p$>m?Fu+TRgh3S$4?SbQO|de+kr`p*EOxjnSC2Q{q2&`F@>Xn}!Jcde^=0<%Iv<`R z=qtq&^U-BxOS#a)b**g=9hL37PgQS8K=x#zC62 z0o?aR^d}J5HQg$3)Y8);F6_K<_c5|ApG_xGpmQ7J4V+H`rTG5>;&XE+1fZ_*koc7s z@0WH@hmVno`A+%vwga6TjsJ+}b(%Nr1Xm6ULIdwqd!NUOAI}jq=>n$gvZ_r(equPk zTW}&s%+>oKoBY>1zXEvYN2WiK(VOY*jx;$n@@e`d*2dNX1qsk}H*0>VKFWQD+yiQT z6O8To_n!S7dx6>j+xIK>dp5ML#TGgMi`!o;?fx$;4zmM%)lU#PzAq#rRv#xK1Mf+= znr9AD>sx?oeC)j}T{G(aBV^J{Y-VYZTYj%h5}h3*(ra%s;1>b(_Nsq`L%C+^E{ROb3P|=a&XtHLUwZ=FS&$Qf`;UKl=0( zoBu0OnOtY0P37Y~4^sbU(5@DDhra~3+rT~qymU<^;f96bmL2X}ALEWYisEO0H`4$o zxDtDT?0ex($BHwyu+xuq<{0Av@jPLJ^+iETqi`raDInoWVgPA6d>}#BZFJk9?(W!n zg?>xHTh!N4q(4OM84+bt^-8Wwth{bF{r-gDhkW08=1j_0ah zLAY@YJ7L>hT#NP<@B3t-so0-RB2?hw2_=n+Fvhf}L7CadE1VVuqfbRd zr=OkHx>9V^-R2$(DGLSI_~x1uN|@9mCCgE$YCmwPGG(84Kdb%)FE`nJ)?8{E&*!ut zI1I}Rex&CO_WLtz?-Cq`8IL--7XzL6U_mD~s0ya&z(Ft4S1{$aWRC1JXwRpMPgxXa z4!Ys%T}-bhE-sygk7{!kYi25V`xwM&FFdC;FRaD9kg}vij-?W)dAo1N=WJ|NoLVK+ zG{SK!b7~o_+w*)*b^-DNZAOXc?A=Xp*t@rgd({8N;XR1LU$S~eq(T$#*l3=LTW4mT zAZ4#k!#|3E>(;d2jRX+HQ{QS#iB6NvTaP9d?|q!Jpk0mid1>w_0I6%qiQTl*e7(5h zeGcL$85ZH{wdR21iFCNLGAe0JulvC*42yyygLzLT)-SG7Owa^;OBAYX;Fjx~gmhoB zN4mpdrWB50iQ-FY4JfL5gMq6W=6Z1>13S)b^&NGf3Bp$IiDC~{v_!kI3|3_ql0bCt z^7-=JCVBFMO5j_A59rWaGgb*HK7E^OwBJV2|sGbK?mY55btQB zGN&+!4AFG6d{;hqN#_@;HIHEFmQtI#V7d3pk@^~cXgJ}UcGe5)2^;iQNVKBPe#dVy z2L~sQXQUT*t#L=~S@-)TQa8c$+BtOcocql1iYM+n-?S7xu1<)Dz6Z@5 zAPO#DM;TInt1m2nH}gpAh@%!Z@AAWQp~MarbHFuU1&X2khy#Y|)lOS^_bqZtj&~~G zm~_VeSRHQRIH?yt#Z7IUbybg(qT;J6E;<(uoz|z~gEgMT6fN&4o4w@pJSMk#4XrW* zqnNeJ(Ghz2%e+(WP&-XWc4~;Ve~36FU(AiW!GX{L3~! zl3S~k^Jv%O{j+DtR8?H1Qr3`w(TkA1uQKZH+x-LXrQl+9$;(bDEo)9?lZ z?-k^qp*oV|;_yn-+{AT<;G}~$-+N}tVgMrkQjov<2FmX+foB4}`RsG8u0^sOF%U;M zjzX=BW+iM(>t~;sAg7pe*-)lEkB)MVv>n{!<9o*BS0z|Zzxh*$hfe~+`GU&;(69Qa(VVE)ZqIm;2leqk;I!vniVr5c~y5=LOt$ zbf1{U6x+|l&3qy9L-)fRzT|?pwVs_YDP03w*U3tQ!LO|4DmdGWDQM4(RmjkhXWE_b zQ)#zEx8I&i9v*KR72U`P;W}UIcXquxxjsq%)Q`UA(#A#m@r!(>4VGdzm=NU1B=pm^ z;cE+|pSh|s4r&{uj#gu=^4RYh3`aEs@Ex=0;|m&jZh3tBi~ zZw_SP8B@u;E6;bIpKu}7`!nl6ZvkT1_)2JMiEHW z9m@B_2=a8-`bcpt$hJ+znpm1X6^%!}&~5fH^*<2&>zEg+mJn&$EXKDTxd2ccO*}jS z@ryl4O=0l6Wd(KteunBS&?a$c8%CYS9N**xFD(_Z1cN1S^0S>fQ%`n=ZK@5dmh3+u z5)>D5nPky~qH6mE&B`tD^zM$I1gH(AkwBZQ{_^?h_A+>iRJ+|;yz48#+_$+v@)8=m z5d|AVc<&ZuJ3aOgqqC*5d1tduZvAP(!=L1@oXqK8o%lK8$`i;ADGkI4IK-rso^9Qw3TW8$d@15B?rhc2F`B$lg$-+70>*j|S+ZiAJ z^~*~Ttk^Tc_N?Jm z=#}>jr|nUTGg{wGY+T!;mA(|8N%H<6xSvp>#FR^$U8lawLJGod@}SYz3S@@zL!ogkzRnAHKHjJr(1{bjN~}lg0Ul5=h((v_N>ZC?!*xxKJ}) z24Zp-{YN!DHQKN2|00V?e4=|t#*2c7fXfD;y-g6eNy+(>O&U=fa=yK5e|b1nAGA~O zcxRZeyGri?u^59@xS9CWc4mz&h;j;jRok%7hn@$;dCNVP8hNlp`E-y3mc8V{ilo&G z(h=`Al{>zYbX8#)R=A?;AObF2Fvur#6SAg(ucmkAm%m&d2?zyl&G#r;onK?OU~Axx znl2*ZJ9tY2B^DE|!R7x|EicnvD7cNnDv)2+LSEfxc2%2NU}@ulm5Sa^b(MK27Y>6q zZ6I`_QSFD5x17k-k4>M;nr*U5?$9&1a7JVz7=>{-H$Mx|tH!Or| z{_H}UeQJFv7vrhvmK8NDQNH_a=6Bd|S!PssROsr-uduGO44xoNMff>nZy-({lW6EV z+GvAxKT=`mxHfW-v?b+5YA$+mqCDsOe4>c>hoYSv3*qNJ>lx_irFpZ3wLe(goT#8B z{bNcFiC2LVvm5~^zSU0Z@fiAOFmxkw;_CG$pTD>ptQDqekqZ8y;`C&r^IiR92vjM! zUIN;~|;)myii^nxra1lzA6;^f{b ze%Jk@mehjE>ZW|l%yg=dcI31$k|q z%5eGL75LpvgpG^BZeuZpl4PEQ1OZC>^B~s30i4Bq2Pqy-^W^eBTpTFDzn2#D8|6$Y zyyM^;391e7$^XYFuMCvnlS!^|SvKxuj|65#ZzA94gjL|YXyj!z*zo_pLH{F^*Q4`z z+{m-uxb}C5o@ywur;%u+{0zFwhf^D9$W&^_mV6(&ncvEyy6clqBP zy3nTiV`R9NVo$d#<)*A#&QVI#aS;hHIj^#O&euSy>i$FuCBeu|=JiLcs(?b-BJIqJ zvg3DUV4I*>qnS$EIpKBggSANrK*hz-!nZ)4*<(IFeeZGGZ%kn>-}r%hUCKHcrhE8=0fSnNfzuwveiRG8F}ZTzzO+k|ML2@NQb+pa zB^*+JpdEu$p=*jK=haCX?K(lz@E|m^{E_pUmgtJCAwL$P++>hha81~kR9oZ~$_>pb2gk(jk3)6ELLUKX} z4gKqo*Y_e04ra&A>@#S(e*5>AxP%S09|!|NPe>ukPuRx|KKO60}N~ zYt^~K6%?rdKOOS$|8mIFkkIso?R~=;cBcc8&=(6Y#$v`BzkEID@FqtNmEB`Limp8W zbb&IUgn7n)Yo*Stxp%Iffb`p$CS(o{%gu|^TBSU$VJ2sy49Z@t*Q?PH*ArI=nN@+k56PMb&rM z+`J8YD;G5p0>Kw-pytDzYinkXAMn&)nG1k?CZ`Qwhg@Pf#jVs39H9mwHSwHxKfW>v zxp{tYt0SSV@w7=)#;D(J7mH%UW=_|cQXIPg*3w{7)@oL^J&Fw_15zY2&K+P{-&)Tm zn(aqiwr;)i?3j-6dg7Ub48F=!1?GF3r>zgCS%wZ75zQ%Qq;%sxX;#4RxPW1BPS@y? z`f!N#&6$R3s+HRpmx-KL;enOmr~mDaPpn6uiml?+oM1l}HFCI;}ACtdI07_89k7Gp=X>s8gt{J)wN_k@%ZcLgKSln;|6m#I;98 z6xO6kJy(WAIG--@znAAr9Tj!V1%8z~&$y&)-h``b3|k(da0pEiDy$rcYObuvh{K&5 z^?3m-j?+6DMw!0UzMERRXWx}fsaxV6dgoBdB z9lH+7%Mo2NzPH_b21jMx^}>+Xn?1D<1(()Dxo@EF65X znQ@hi?Ux08ts~LWJG~o>U`cTDA1?k(VeQ97A;!HCraH36isVw26q88q!DfuaV)lDznucZtqNn?7o)QoZmi#|L5BLk2BuI<*L_&XBcoS=AGt&G-tJWnSc&)+K2R+a3C(ap{u!E2Ezb;Je^+1E zv5Q|_yS$xp%m>1K8llr0`R+3+d89`(Dqlq-CX;=9b z+O}K<;D=v*UlUK?xbIsg^MU}omMEqp>$su4%kJTzyt0Lt(A+TBR0>I_>-|Z+sx@8{ ztU4Bozg8iG89#_l%bYH}CwcQ+W6J_xzbtSK!dmEv>6G+rYH+kB>{88Q7rS8nUSy*t z%ADJJ#M@S!nuDKeDN?!9eXFaxsVEu0czE}I{gN(JGjr9+>U9KgJc~(K-V|o8u#IMs zgBl=`lMB!Fj!kg!%mJ2AnPU)-6T+@OKZv`>;jZ$P(+|GVZIpg27Q=DxL~OWT8oFC9 z_xnGx?&N%!T)l+v_KRmJSyv{a-1AWPzx5p1P6KG%>iGMt3UBtjv$ti6sKlP4;?jLe zf8_(^Sxtyng|#LF5@8oeOrCCWh!}`FuAPO|fd>h~52J`8c!b03t6u*Qc#J@DX#c1k z&c|iy_k{RTb6TY$bI%E92Pt@^`)p z9NMev>g9f+{N&5EnaU`mu%^$`lEX>liF43Z;93kzk>%QPuP(ZML8Oq^J&fJ`_hu=? z?W|vTQ5;i_&J8gmGGe$V39&7=y3jUMI~v%qsPF68lHUCj`@PHKm|4JPF+-~rEaXE` z^1t|amcV@8*G*dkjfLZLzK_MAh@aFOInI5Paxev7xfqCB#$NU_Eg8+IQe@`oeO#Py z;c3yr!eIjC4Ek3fPx^>MKaVhF3TKSKCwksCEc`gR`%KH+#QQ+O1(P5}>46Jg>e<)@ z_o$7DdNx&D(2RZHu$(e<$D$Q_r8NVS5R+(9z8kVOg2!rcMuC^GhnTE@0vuIy2*hl= zOy4bmb|pV^6V=EU1cLw^N78$$hb9rV1>kfbNY2ii;EVIgAbx+Q0dSoX?Bk~7qSbj# z(#w_m=G4dEaB+w}QVks)f+v3?^IlmYce1CVvx%=^9lv=O4n#T#s8rEZXtciiC*0oq z{%^P)pTpI3AbCE#6CRn((W5+VcPE(JNg5wW%AYJl;PlSx{$R$!|KyMeha04HrJ$OL6a(;Ky7+SAWO^$$Y zJ4|e)9JbZeS ztsmR#zt8?ZOudCy6L255ZDRpSNQVKafRpYG6+s0-q;p70BS?>p5Ger(X&BPo9UCx0 z8kDY)n>1s@24j2YeZTkfJbwWP4(Bj_*Y|T>=S+8I8vsZiLB6KwGWg?N-@o-mp9Mzq zahPJthXdo3BLOa6s?A}5ipc4pV7^-^ms~f3xtxI#IRUElZPXv_nTCG1l}TzQ(GB+B zfO~9e&%)`yfcri_ZE56OD(=~#@256y^n&VVH)m(ySeMeT-5=)H_7^;)eMcVtrFdra zKel zzKluMYI>UQT^mgNnH6vak8wMq&+MGBzSCbjAAFE>(&_vHd$2>w(%1po`YuS1H%}%= ze9q{7ALV386u(|!Q+q4TbTH-(Az2u89VG4Fu+~!+M0xaQ*9-Hqt->d8<((1Xf1o@W zMxB$Nizo`#R=t$N;mw&=+V6s2Tzd0*mB~kzy3cs;~&Mw2|UKl|QX8wh}&9O(?ZnK5FGyWA4EAOXjNdzY0 z$~oVoehqc^Piqf#o+roKWTyyLEvVF4PaR`cXwiO-&rb(ulTRHowoB_RgxeF?M39=? zBJwHceib5hzDyb`t~+s#n*6#6f3ekTzGwM1!^8eYNYF0eP?=BcmqX$=kmcv0sU$U7?-LL<6eZJ{kE09h(tbWYeIs5rau&Pih-GPX~Y{3 zv6wEStFIic?%oiKq%KBXsMU6x25$iTc#`evn@qy_<&X6p;d*EI`-xOR#x~m^-s_2nd@c(JHn|}EUzS4NybN|@t%kM8a-;VxH zH&HLjh!ze-u!UfJU;`DGi~Fb-<@DcO`v&l1J~BXRryHNF?rHj(X7al1uM=Z@>~?U% z=!SRGKTh`|g^dA2u$Aogc_NvY3e4fxq|evx_dpa@)FG0?G&EEnquX_O!Tt@@`hTb7 z|H|z~AmhnGeFbR+f-sVVikXHu2zc$yzPzPWj(QF4io~Veq@EiLL^DU*l`+DO1gerc zLy^=exlo3waF;S*)x0LPUD}EV%PMRxZ;C&5qES4|YD_I~A{m-32+Gidjy2z9MexGZ z|E?bAI7&_g@cy{Ji&kmLhSmoe(`6hsb^9*($ftg8V9j4$CnYBi``B>Fd#C-O+$~}j zaCeVq`H;)@@=4FA5$hb2$E^3h)UvVEiBxJ@YJkIPJ@%yclZu-?q5(}RjZNwJ5X}YK zFX5r*kzZguEdhBufsw?I%EfrkESw&zo=Ph=_=}H&^a))&7~(+?ehP4v&bq%W0pZ#_ zSavQ$JsKGcNx#S}4m$a>@gM2?-a>!XwX`&bx9?Abs=jLQipLe{`gsIG8UqJOvhrP_ z<)#tk7y7k+TSScfSN#6$|A^mpKAd(4q;Fx0-(~has2JFzF38V4(DR5fE+ig`w@Rq) z?H6vwp$59%kCPK^vr{N*v`*HDpi=)$O`(xFue=tJzz>w*P7VpW_=87~KoPk8`^-9`;3zO(v zCgau(s3-ZtmG}O|PY}Ufk&qL+8HbeDHFikS`CgZV{OBEz_sKe*ME?zPkDEQ&6Z)O% zeMh{)LtEZ#tWTHj-OMfG;Rx12__c>^#eu)k17%A*t&UE-E$l%%S?=}sn1Tk$12Cd7 zuwY4xkZ2VZ^z=?0DVNXr$cXVFUaCoLKBCChSl~B_GbcH@n)-@G4xnKA{+2n*)X6^({JNXc`}V+uVibTcy(*`Zy4xTY zd}g_qjrn1iSWQG(!S;sh2SJ?aU_d!>BllJK7+LC{_T5_ZWMR`7_JRigdWee4WrvuR=0=&~WIdDK+=^VfaxP{eL*b$S-~9d<>V?Ry5S}9iQaQPl z#D!|3!vD<1NfFkI_KU@`+Nu||sox>9^EZ#?Qk_p)12o<5g$HBq09hUiJM^QD{dR=t zCf*bqBv@7pQk-I3B*S^EvzVCOt)Ptij!J?zo5eYvR?S%gL07etRYXwRP-xz0JqQsdjl6 zroHK1VKW?;Pc)J0bGyn5kkz;~*X??Nv{*oiA0i@(vEXp=|BByNO9OX9t2gU)WQNkm zDCRQ#*Jk1yz_(aZagP=X!xlA~m}vOB*eK4!O!cJx=5Ql}TV)m@=17@!XZLM%pVqD? zdHke?dUq{$D7BKzm)~XMDhS(a*GZ`;j*!!A98c0tYaDgQd`OH)^}Gty79zy3|8hZ33PPM%N7tTaN__;r2g zp$B&-vu4yL*V8G3iSZ3lsay!=gKXxu9us5t&aCyFS>TMJXT=i$lc=53^3M4 z{bU4uab4o%fggTN8uFoV^Bg0Y5xmX3$H8Md5hKhZ^fnVk4Y6l9d)3pdz4!mmTs-nI zxguceyz0hUvotStEiO8;u63%Fjv2d~FI^HRCIJNapBBhxJ#CJosdh7r+0pOaDp&v! zxoD}&`|}UTtJ$8K?bpVc9325hug?mSivBny?hr>QII3}L$Ri?VUa~GM5lx9%i7*Mi zFd}R_w5sw%!Y)=(XDP@bQV+81R!}G~e*0_rO7(uj`$}(h

  • uOd~DCP)ait@IbVEd{wwsVh$E=wszu)yjOcW`HoEk!~**y84R;_y49n<9R7SXiFYa=0Clqr&OL)wJ zZjfp@Ez?I0*W(6U>l$*ni?IW?@Gc#gqtytbOGJI^UW7?uy)@3M37~3a3B4`;P9a_- z0dk6xe}H|{bIey+O0;ouVXe)eD&o$f742fqu(`RBJbOfqa}-(5Q|%!((1vS7N690D z`69)t6xjCE7e$Q%H4%F9J#86Gc(7A?xya_M=UWip(+W}EMGv*!VZNKQ#P#dFf*5u| z2d`5lPsmFsh@DIIj`!Sp?7A~YD2 zr|z_WdaWhvUH1D}T02b7xoNLc_!=9TPm*_m#u5r<0u@8?p2Byvr!qzU-9LZE?m8Vj z2tw6ADClHzw-ywxtQgC}y-9{pTB<2D1;RljMb+i9d#(`Qy>r&Hc*;7q3apGwD5gL} zR5y!OeKMT9x**hWF&>0AcPh2^b>Ba0V>wf2YERq0=_Ao;v*O0!SP^!amt`M28-{@7o5_r>4DORI_AaN4^L$?VBZ zG*7!O*%}zbbiaKtb`JP}FVP-e^hc6zBZ;G}l&tytT~1PyqZ$++6ya4-(r(NRigB&o z7hTQDXi(!TkAYo_3}po5F45!^7t;QjN_>chfoi7}GHxRbaVU5#&>4Ivr>B7hE4c?@ zH`{HsKLT7agcpxw=EFO}L(klI!cEBX>o=8I#c8;m=EcHos%FU$gykC-= z;-zouu*RBnjAlVt@|4#ayGjkh&bCK@QwgFa`fbu}%kV$xs)Rr(i0+OkAXw^Ve5>w* zqpe{QGjZ22F)`P&h?gUd`wiKj1upS)UbAUF?`at}spPD>W=E?m7oMPbjWk)?Nry#I zu@~)@&blsS)}*F-6=B-dAP>YO&uN1mTZMsUz+$ZxhiH5Z3x2v^QWG+>>(J3r4JTXK+ipE*{#X{sdHb%zhm z>@sr0p46fBO0djs11;VeCVJn|LWJd4aqyQzzG_62~otlnT3H1i4L2vRb;y~Pc z<@8+Rd5*|xF9A0!DmN()q3rguGdrVFt7VN3u|j*}0Y0)r&Ck@=!95bIpmg%>#G1Lr zlM)}to1bex_|?B2fBirHJD&l7i?5oa(mt|C`Ot2P{`@Rf-W4go`|f*xgOpSkwDtu~ zJ3RAE3iQ+ERJ(+o>pC;O*~y|PR!w=Y_|$NTYsjvY?Dq@?SqR{ z69JT)_U8d0o1 zM8qvEkvJ_yZEBAEBBKt79SCFYOSv~rT5+2TbAw`T<$M&@|4cN0QJPJHE3eP|M6te3 zbrx8xYTUCDn}NKHI_$v(5!od?G5#Zuh?L`{*T8e$Twc_Ht_kx_&=>;qtD_a+G;7%mK5??4dQZWkC$lAPVUxHoz_1b+Cx)-3-x@1Z*D>apO?1 z*K`Va?194c(nB=7dxUk(w2)iILU8QGXo?YKX&uz&$+#_`oueDF$;k69u2D>Z9gav{ z9}BvcV(mKYa7-Nd86({<{ME2J;kn@Bdfh`KfK1D9K$pfw9dUoaI}(Q zYaY6i)a}{j;Aq{_VN`ic8EQM#0kj4D4Gz7hWCwK#Kb=;#`|;x9O8p-?Bwch-oyD=2 zo^0{GCJqMI8e`i?u)-%X(v^nd)}73)*QA!uuqHL;4E2Whitsv5An3BWQ@8jjP?Qj& z@zQj;9On0p`$qe@KlZy~RrZ%!;$yoi{#A5TJ}+$WechD8<^SXV>JQ?N{qA3Uw>ti` zi{Jkc_zxdihb^?hYpXdE%2miks&NYmCZgGHGLK`lo1~C5xxV2t#af`8(x%C#h1> zumcuDYL=WZCb0%48k}nR+!XA7Ql63bg}ND@SlI0{jts4+udbG1Eu`0?G_w-QaI#jA zw`O;Xxv@jg?x$;wuU9)V7vd^@NJni|)QK&+v6T($^kx`&&b-Y{g3Ydfx50pF(dPd= z6cQ$ki~~-L0s3>mQn^ms*flbt+3Ljl1GUaS9|zW=Xbx;ote^ z{5wDQXB-4V2Hy?fi#fhI)Gux*ETmo=VfGSTk&9`ghzU%PeW6=k`k)i2mpf!_)M6K$ z34OXl)<_=Z@196UCDY~6EL+bFVyA5}1!h_Vg}v=!CBaAqYAvy(S7DYHzuhUTZjqEq zYxfa|x@aTAeUOX0) z?#z%EF08t3nTaBu3g(|QWcEbVLaG+!F07qEF4G~lLSC*%FFu5xlID)X&CTpVOQqGw ziO)1oA3HGt>rx)0 z{1!6l3971=xh(8qH=KUDl1T6LWUM9g!-#QjEkp4r$ZaAV*9UrFlP1SwTaa6YoU-8e z(i9P5M^IlAk+cc0uWZF|K;D8G{idyQC63}g1|22lw{Z+l^ES&NXj&NJ0LJVzb|C0X zs(?OAt<#iIdWdK{$=v9ibiA{~(hnVz;+{Udx*Ava;c-x`jEo(MzM1_a{3it{5+v!8 zW!2ElHCcz*!D1pgopda?GWG)NytOKxX%LA-ZWIHC;@Ywddv>WZd0BFSm`u+D)eKL8 zvKhZ*UzJU`}@D+R$_%QD(?PymVbOU3Yd!OM~y`CKqSGItvoLD ztykz3EsbnhuLXe{E$DtEO&&R7kyfh2ck^=`h|ferhPIAiIo7Fu8^qI&;$28Uv3FxWU<8S zczv(uyf5<1^~plZ_Me$ntc853myOf1<^GHv13%?dzA|b?&D(bdRHP`9;7V1T=ZyT{#GN<65RluER$?z|FNdZBYluTg zNU>=k__D@!+uBd})`{!KZdz*+>%M!`M13)|{UYqGPu)k+go1Z=+*I}^|4+u!>gPBTA)RQr{|-#(_J z^05?J$`juBKmTw4YWs!X_zT|q*DJEVW}>e`j)r)lS6p2bbt(?>x@Z>0)S(8-I{UVoMsNv5ZlFEtPxwI6!1XvB|ICM^pgZdV< zSs;Ka4<*d_4qXico^MT?v!BLh+-gIxJsAx zx9ifD&wQy?&JAt?11C>Yv<-fx__vi}~J4 z;K^r&-BONPgB%>!<7i|CR|)f7=-RUG*j>}7U_+Dt&9xz*L3;{qw_}~*;o)gSy>F*U zBNUB?yH+|AQdw{2g=96Av#Cy-1&!3Lg@uqw5zzJL;aTpzgjpma^SwV_h}@HGClT_x zz~Qcv_wQvqBUQRX(WVEMSXrbq4Tv`%7bs*1oi~8e{7t z$4H*15^S1y;14jd+0vXD(Y@`*m(zuo<0**vFP=A>wOFt((+~Nu$kC4B?F^PL3HPd-g2z8 zD*F)$P;!o)uFlk8=WKtDH-eqs1tLac=4mG-?j%q|g;+vULed15mUHl#pZ&xshDFI5 z<&mEvRMH9My<2UDBlDsnISEeaA$G={J{;MGUq#iZjH+|WxI$cI%o-Y`OUen2us3RZ z)`+Rq#zGYLQwz-mUv1l}(wtNCfsOSPQFWkea>o6InUZ^wnMyA1F|TVqN2R|~NO)Qa zL%I1Xsp7cXf=!#rZ^dr-{YB0IK`TjqE^$U^nXU zbV)RJj!~oyk~%yJY`q`f^>=&w3;eCUr=#*k>xwTu`uQwwiit+$@NfRiZ?e5Tg++bP z41j8l;+^PTZTN=jUjhK9Yz93OWzikr>=j~I@8v8K5DRi(XcI2i#+lrZYN4JC*lH#0 zVh^46+l|_XBT zFxJtBl?&dYHoB^Bssohb#@I#K=~WDou&CngnXo6k5NH*fWOy)TI`G2t*_o1g!*pq* zJIeP+kfOlc%g_nnbKgO;<@|Vx4TI~=^-Pc*LlQrq#g1h^Q;DM%Nss#osU;)DWVRh( zpv=ADpCPCH(&9AQKMho7cT)`J0Xy7s;vlU8f!D~`U})ef>>^z<?0wGk?|EqnsFD%rKCpbSk|QLM`G#Z2r@M$qJm4J}nu|#f(dA772~qHRJ^y)o@aG#xJTgY^IK;WUXC@q` zIm@kMV(}iLf1HxJLQS4W$f0*1guB-mrf1tFQXCsi*fCNlGaU3lC-f8uJ1LzKQ@T#fHSrPvHr&JO z`MrvlCLL0MXj6#WAZpf5B^Tjg`*b)sHnXxTZ@tRQ_nHB4)Gje%fZ16t?f#qoE#Dh2 z*O(VmA~R2#i=c8puR1DX*NpA_L#}O(b|&7pG4c1H^ALDogLbI*hJ%Bp+bzep>wDEZ z9_o;zz23HlirkzOq=fb zhbPShPYDWC%}VGyDj}=gi?&O*Ds`Bml~1kRdR_nuRrg)vHOHEEP97-QW})Cv< zQ8|9)w|}FxZb+pzcM~03ZOPvFC<<_9vW`i|Be`WD(VC*`XA!v> zl(~L4zUzY|RxZlDis+?ty4FSNo!G^hmWPtaxQnQ$40HfGc3Ywe&PgqsbWftXEnPxe zSrm=@{(CLDim#zt8?(l2ufMdb_oQ$~b}$V9I2tP`L|K{*ZvNA=xZ-~EXjPyeD6nb2 z?t+O(DBY+8X%{l|WT*twpwXpf7Fh^9?-DXIcZkd)+V)R&mZ(>Ri;M;H%4AA|#NLD0 z)!~75b9%tbLWWbrx)ps}lh-qR08hYfSyVB%8-3Nqo3mOc)DzC*-QNDIzx^B1QSr~H z3BJ_$=VO3xp9Oe({c}xz?h)Vm*?*Yod5W}p6iz(FtS*2r{J0d4%}Cp@<8(g}f_4B4 zpN9hW_nD5{NDpnbueDfbITw+)C$X)Ph>w8{(fMH5(KiCPPHR;~b}<$WfrD!koH>oGYreZU#=5mX50l@YUNh zs_PS#`=o@T6VFlzM}?ytUXQf43qg`jm}u47x0?{M^iIrA8Q2Abr`&Y0l(vJqhG}KV z-($Yb=V>^RUmMIocY(#}lyi)u*r1X>85bUz+RBp=i(D@J0Wh2iFpmgxww;-%{g8qx zq!V*OHxx2TAx${Y%BK~#%Z%OR6uDtwGb0ulzL%S)-xGT?bfVQE$E6$4ta5xzNYWGTMXOb00$r1jR(WaH&v~Lyn-s`;9eR7xzH6*)3?vk2;?{pf z7GIN^KCH3qKr_22tZs)aAOV2j|Vu=7k4!~?}X4-ltUcPk_e zm0jfPeR>-R&U@9@0u6Empey__sc>ul>ZId>jqgIg#Uy&O8#F{5$8V-E*E#%PaqniM#XY zew%$hM@V29x+;@8lwGObKu&mB&C9MeEhJ>HTIiXW3H<~&%_L|_nx-Quv`e);?QT~a zSahE_nXlQPW*L#GVf7$!Gjl#9y-?Rob*_P`+}tLVMro@LSS2G$z(sBb$59mipZ zXk56_bK#`eDi>U2m~hmfngTK~@-w%p^qut2R^zMFN(PZA?;H(A+UA&l!LiZ?tQa zL27sOhEY28 zUehW7GsIra5qyeWd+9V7kVw74q{c&%%1zd!>+`=QcoJ*!Y-P3>A@KstT;jbF#>&xn z@WcD-4EwD0&Z9bXGl|n6P`6?*b-^d3yn$LtUNaV+(q-pidGUCT8d)Xc!s;E5?l_3} z4J_Do9Rl2q2ZXDL4DNRcvqT3LonZ>6d94yEc>T~%zWFEZ>+kmZ(xuwxbX2|)jmqbd zX#I0EDm`t<|Kh*<8}kRh_UC6VMu69ll!uqaQKg=<+OmZ1WZSdVgRZco6s>v{5ut#z zfiV$cyf^5ru;?yg!S&KbF3=h5NMTxgIY_+M@Jiu4^X2QdN0fL&gA21mDy)5Rm8Wig|Tf_=i`@+ne-0^$4Q!fU0iNe!6H=;^{rolR^u z$^93P{H>2hwmGnIz4!SnMz%Oo*Npn#NAx8C9Gn4&Z3e z9PJIctB@3HHQ7s^<377RtL);O(p8+I9ZXmw#u)2oT3PrH$SlJTvtVYlyg4!0~R(X4(ohJGL>7W7tpRGYpNB|nEK6_HNHzJ19Q^W znE%bs*iZb-e{TQvAN(&?=?WhTfcv2FPy4{X;2+pg(NTBzpZ%p@XO2q3!up;=@@3D! zsbDJ)Sv9lx8rmxuGKQe`fVQhiD=sTwwji%L=cA=4?BrE!rO$Z6-|oFgmvk77u-k*( zWlX{sdq}9=(8V4n%xfk&->njFV97nmCXl3LlSO#CXUBl{?Lp^{Swi9(5akpaE&;Ar zm&y_pwoh;mq;`g2<+s?;?}~cS9&`aB?Ts&T7Rq$boV~Nq!Wzwb3Gs`S}!b?ui$k9EdfmWvg6U`AG^b2gY`5 z0Xl~EJ6piZp~CSYPMm?+^OGH#s3L_zy6ZDNzvm(%x-0ZQmPH;N zsph4#S;cb{0L{5!%GhW|+&X%UcW5SJb#&&~uBXn64l|B5r%Tt!O~mp=AU<(IUG{eX z`O=|)50bW4Y=TU3t3X`9ThZa8Q-2te}3Vw z4ADNF5Ib`meUiBom3x(D9CBKkWeh~4omCDyW8Qy0<2e#RLCw!BlLOxawfHlQn);A+ z-HE%G_v?+w1$h5A;Io{9Yjhlya7?@RSw-fjNWR3BqM?d}^hDvMS{LZg!m%@GK&g$_H zfB*8apH*1!DOrn`Rq`%R1#_L~VD)6?409A_ydS-cscR%9tn^FCt?;FyGhuWHJ-R^&9%=tYxIT9oE(pd z6UKEdo*dsmOtrW(=kAGjizM7`t0t^$5av>7mhK91#_ZrS%)2oXpw0Ny&cKWt7a+%4 zJYhlI9}vHieKN#Kp3IK?-Hb+uaP#I=@kD%2a$XL<#UP|Y{wRT5(~gQGn9>XSG#618 zc1zBFXSH7m1EgMqoD|yR$zJGI?xDnBm#Sj5{HX(3b8$SkPu#OTD{gtR9Uus&^%f_i z?RJBMD1^$14$s7b#Svcz(U~tu7t$)*$7+={YH09%&kTw4>{P4}OA1Y_?9%+sO_9&D z9Dl<#lrmC0Ng**AA0A0L%MD;X-%*QFO24EP@+yWjp_bB_HU)jpE^CHmQl#s&EHmFF zZrvUhze8L(hkI!}tsET$$~Cm#heF_R7;@>Xt_+5)OOg2ddDtI}h4_^5Uh=EF?ioq7EbuZY5(P+rvC^!pSab%mQ=JLd=y#yy2!<0UmYuuOq|M#HN+?alUa-qSvp1;XN=zY-YN+2@ zEGfKTA&!%D!dU&g zK<9xYyuhJ^U9J!UDc76>(4c{L=;TS4NzHiHMv6c!7j@pNCK)>XJKObV`OjmDi2ye6 zhpVL2ihL+n^fb%E>>e9iehYy`{B2J^!<5P z3`&TTQwpalp8ZbTP0(TSovs(+#5gt~eK3sl&W`^s@b~)Pay(C$)yj^0_db&aBWA74 zq-v7%9^lS+uhi%qCFQ8Jp?kDD^|UQhtD;Q<$3qZctV|b!1P(&UxVpa2yS@Ge{AQn1 zD}0o8rGG)|@sD&*UiB&cpZ$x!I)CXO{Wss;#l}`u5@zw@@D#i*`hm1xgZ3dxqY$E3 z=<@t{vpnr(^tRxzO#on15-E97T)8W4&u7UiXi=g{g`R~eCcc8e94AXUN~X+D9HPuY zO+@1U@2Ay+Ivn|h30uQc{%ECp>6mSXfa;j#5Flf^q!p8|!Nrg>`C4GiYKT%;c#mqu z4rzfWQ9QW~g(~lMhgP{{_V9(E<{-OdURo4piZEv+&{pQSi}Ul9W*jvWP734;gp79O zz~^!q-DQme{C%btCk(6#$n8?70=JO+ks1_#JrTh|d`8WW35PqVAM)CyIA)?P{J@dB z$)Zf!sZl&GVRSk6G)0hmrN&Ca?8w5!GYQz``wSd212j>-w?lX`JVIv2OPpS0fgAux z4bI1n>E;zF&_qnS;~NTN&P9GI@GPBWh(*BlI3a*efFQ%wSQJQTTiA;Rin^j!_wL4B zQtgqKIDP89Y2`#3QGu0_R$9vwuB9Nm;j_hUZR3IC4Z2JP`SN7vP~X>@Cz!5@4VEL* z);vY34s3$U=av+P>_poXjSGWYQM3;N?$}LkwVtHzuvKx?g_EKgvn{(iRZNA9_iw55 zUKHp2J%ZjpZY(OlJu5b=cnL{LACM&sjDj9;Ke2;wi)#_lMQiolyXbv*usCqqZaAn> zB;L_=ryZW-`;l&;sF;O#AgLDxu&iM zLfcN!@~of1ZV*RA{qgv=_s4${f9tRP-S_BJ;sYi#pZd?fC_?|Uikd7~=J)^jFTeYy z2c0LZ%DU(u6dpq^0Rxk!h_t-jGfw!xn=n$=i580WNAueWInn1sRO{FOmWw{v7Uk(R zY$1-F55l;gyl2u_loOW&e|8VXGA4 zw2DP_NGbzJx&~fI^t4eEtKVxAq!^Da{e%|@^y)yT$CI7mCEB#okDM}d-f6y31zyyg zd>C`0A_M;>xE4IMQk%q+aoT1tFjMUD95X_uXc{`cw`U=X&f0BuT=(lOoN(u?qNg|M z$e5h`tulpft~Mw1YGyaB;ktE##jr_oD7^^E6uzV7pM7cx++_EYj<%q6p3k%JLs&3| zI;C2H!G>VSuj|lNNIj#pY&q8C!cPh@PsB1Jz~;ryTDWYSvyR#>wrmz56i(9-<4mA! zB?k7428e9iQ+!O_j&nph3(&ait`tO~FkPr~an*$IjZ&n}!p5s`2)ek$RY$f{pg83? znPgVRgHQ)TLx2)~aVQ6hlf(faEOhc2w-S>+sEb*N;E`)|p61aZ^Iq?{gJr_BbMi~FsF>82 zLBNWj%chtHuXR)!{najKREH9`?KuEa#gWCizYc?{#Wy zw%GQFAO89;e+o+f%hVJfJ^Fbcz{NjBQ0xAa-~B~Xb+M?XnVw0K=m8FEtiPS3ykog*8CV`f-^aHIx$0;v!A2`m*F$W3=h)_r7@JNEHX&S8MiILX0 z752s?RVuwj_%u%(8wWRBJUnNV`keS^wl6ayM=WrY z85y&LdmS(R6aR@;pW+ znT!+n&l+SNc!@jr@Ao`WO(-*;IGt?p)kIr0DwIq#2`$+fwGkc(my2A~Hb6)$x9rHZ z>S{C@18|cjXsI+GTZ6Qo#W5u@7Y>6<2+oCCIzD{fD`KKXtbThYD(+y4h`4O}`w(!A zgJ@5ui2ChBYx|V3N!z@P^|`T{KDysdv3XjhK7pdgC<}bld0@SxS0T^$fug=K3uMRp zeo{m#W4nf;Do09K$XACF3kz}jv}HayT4|Pv!w-pwXd(!9#0DG~gK=a%X59mJXB)>{ zc0ZsQMq?*BP9v&&L)-hd^v~_2HO? zAPQzd7xLcm;FNkk0MD`j6R=wHe5Tm^C9=ZB@pwz?<+Ee;eB?nx1lpz?jVqU+PN zfUbM~GicIwDDGzGFf}}oa8CUn3&)}Y{bt6z|BROmzN{vx5qJ7eC8OOB&E!DvHTF+9G5jLN1tk?XR2R;|oe2gn3BgH zsj&9M_7CVsrsPtbt3qWspl55aah_@_ShR9y%>5EoU=-+!!j+gnARm~2y67hy;>W9k z4hk!yMrFNK(AG>#a-=$cF*T0L46=-1$7esP4Vi@piL;X8e25OHzhJxh^52R8yr7R( z@VXSiHP5b5LkH;kWp9|d6D3+Zq&V;>VlWl;PX;!&R_VMi;yaTVd3I4IGF=#yNCyFf zfNMM4`f!59mHyl%kqZLTZnBEPBL&BWI;S*k(p0$|Ld0~~T z%&v<;>%x)c2+QJk1(@;le|XxAiIm^&J_9evDx<^&G>Br+P11>TJcU#2EZqK_g@Je2 z(Yg5At2o#0A#Ll`I6OZGyMD}DTOFO`DX}FS`R)cbV;-O;o{e;7HByC{U|p`Ime)Tr z9JTzUyl?ySY=P>mQ3>8#Vg{DR06G;ms@6C(WVH&>Ak9c#2fJW$eZMfwp9JUW034 z$Y>Y^aswA9KNDZK70S7Vz$^q?^Xx!OreaI6>IkZ&7KqtOCv;x9&bW(1wK~%Wb#_s9 zZOvGFOV=BdkbMI_9a_x|U5i_W8O;dPD$y2R+Ui}Lu}d^&x%gCW!RK~O0Wfm1pf>ED zcD=e(U;oxGytsb+18avbU8wj+c39HIIvzjvM;jijCfb4~Cp@0ymhg(P<6bJ|`~Zzm zu4<<$$cjmy9W9GPn9~DTWmer+LDR7!IZmv^e%p*60TR)f^qgb>>{F&eAWS7H(dPWU z`LJa=$`&f#@)-zBlDPLRx=Vo^}ocS~o#>OAc@d$;r97#PIGavTP z8EGFa$Qe^TIcUtW*|cn%ziBd_vtq%l?hk-#j;;j-yWS-x9_>vRvFzbONo}5hIxfXS z$X6jL&W4nMk`EK~d?DjqwJ{%9C|uVMhMWD)dGPMmfG|3+2`1j&DzUe>8XpYN zE4bW`3^v7eSw-HcV>w43Dbj__I4~ws;j_t!^%=E(Xm@a77QE2*(frnuk5OaBj$(n& zY+yq?fiK`l;rboR!GfSTq7R5pm?AuV&4$VlM{!9Oz8(d;&Y=ZJ{U4&_dRc6(BgB^jHs5oVs&<|jHGRdfcZ$L~HDY29=S zVog3}tu;DiL~!(IqW0x@cUFc~2uFrmwoO29wZ?fltqu{~PBD!*=5)i#1vy1=T)ZDk z5w(ImEuoztV>clmTX9p&?m)eDfXDW@j3iM9m)wtGO>>E#SQw9^lBHSr=l#2$pLcuy z3r7EAIw&7(PxcS^-|zc(#ZUQ#f8?9?_}UMcJ+fQHXvqQd+ga%|9O*jgKoLb(2y;Ff zMTjoRkehI`ikA+@ONdP+fIZGln-4Lh4q@j#+l${Ao+2j<<$n806qo%piN+yxNCQx9Geii89CLZ?*vD!|&EosGU;3loz# z<+DxvohH@4&hp4c=#_()e3>%yVO+)nRpzRmoeBs(-(9cOm0$)Afl)!#`)+TNGa>Sz zdZ8Oz;;?p$1u|xFaMEhtWR8rk*ueE^;&RB~vF^8+05Txh29AWz$yl&&NS_N8GDWz| zY9T}D(lCW**KDq=sJLO#1F6OnE$lUho0iN4gNT>d@P?D53&1KzSgl}Z2F40E=R-t% zQ#5aE#UFUPT}Be~MjWm@AHu50A<0p0!lyXKMN+ujp8@Oe)2c(0r7*4X^DfT3?#r9( zq7@|TDuS|$!sn-zj>!^|RY7#r$ed9{E#EVbx|i9kx{7kFA9OE1nY)B>0JWPi%sm-Axj;ZDR{2y0(#llOp8PAR90jV@40|gMD0lKt^{@-1Pna|N7??My0w9$er`X!fatR`?l9>h3) z=b@A1TWXU!fpu1$yKDT;5oV5XFedB}?Cl^-yAg;va+)JD$-GnFNmt&kf)Q_n{d^#u z83)p}FTeTmANVi6+xzc4l`m6M_!rfv_y-VcTm12V^5@@O{%`T9&dO|}`a3P^WStwx z?k`6xz*j)g&xh;`Rs7QywokOfDrhdnjLc@Ry+|C;y-Ydrbg`fX+r3_`Y;MRD0I%^t zRQx!}p|qTdE<6yMPfw&vO)BG2Yoj8Wu9a#4qqCa@4VLhK$$AKforyG5G^u5Y$s z&l>oKoCGMocr0AVeHYMKe6oXroRE;tWXE_e>AsouQJj=|QLzazh61ni zgLX%7Q6^g0*NC-2Je}9q3MW7cFWc`|*W#R#3*z_ur;zmG#QD#%*mo0Gns6jEC7UVE zJXL3E^JI6ftf52n6(m(t6XvkCI$9; ztn9#qXcZF!-7xItCvukh7i=HEBbgd2qw`#sua)i1k)%oDsCKI^b^_YMs z7RLU>L5GNU2A&>p&LxVU$>T*g$t(MA1Rr44|NCJi)W+7~e3nEIa2R4FD9rC*80ZhqEJ| z4yyI@%d(vNd28SDU;C$i{)MCB_ThPfUpesYy}!8s%pd*UN@wk`jiKn^?350ifFO{B zOv1aG)hU1ACM2$TnrwPdp?}&J@;#a$o$(X|JQ2hLFEQ=3$5C@$!g4epfld#0fsPC( zn_^2<&Bd--54HwdyNxme+L0`?TSv0?&d+`Z-0Dm?ITvwEifrD1H=Ft22o zpD|LM;yUaa2ekrTL2gWPZEQ0zos?rVoaR!Kfroz}*orS1$8aP3<~T^yI|;xnQ1~+G zJr=Rt;;~Tu?xiDWy<8D7A{XWqjLH3C!gGjbMs-yK&^PY3oZ0d_rWQb=9EjC!7=JuR zh3L6ZRVNhri{KkO7bXN$wbc1cpr&vVv*E*wW|w-3c~79#nX}a836$z6e!Yp%xmmJY zo>QDCOmMI!2)KW z(6-D~a%r3I4RBboXn1N}8yiQq*krgNo>9d=7x+vLmW~58N`ZsN^*xrTcnC9wfIy^| z8}xHR1}SF_i&?hw-Shi&Sv07Ja;!b)q}GbUMjq}tzVi&D zw1nnmVVVaTOB+5D>JvoAtfvfLE!_QykywgUso#N+b4X$90;6mqq@BWmqG(+=DgGRG zmuR`?*mFqtE~Eg6D1!9^jo&;*`%miNfdQ|r}&u@ihJc4zkS()oHcPYuqsM{X0Kiv+{- z{>68G_&xiQ0fZl0sC?)w>6NF_?3+LRN7{=beA}V0d0@`ikio!CfqNw-Pk?<`y$(s| zeY9$+cPVfZiH*%VT1CTWOt+Wf-4oz|*4~s6K`V-6Zh98^!VGNkD*z7aY|hD3G#PPA zpzL;cckp&kI66Y$Uqo^<^QVQ(iBqv}Wn;x@WR0Mj-{QG5{TBq%Lo!zw-%SKOTk?6` z$9@@jZRV`Ie$Ai{x;kuI?%FMIOV~7>Az8J6U4qLlR_iQuMxCy^T$iVnhA2?9(hAFh z$UrP+L_1f~_P`_ z(y`&Vlsbde;TZA4+$o2PYt~N`(5Z=|tXTO!281!Wb910z&^H)?dIbP8A$ zU(a4+w1VBOofP0_UXdWnsdd)0=jLL=MJI9H%61?3txb)gjcBoxXK^j`Z!^p=l9Www z0D;AcmPX4w7=V*cZkj2Tj`vP1!H^J2%_9{ zbdrtCJgPi3c0W!Kidh78*m*njjN~s(;e*gJ&QR2e!qu@6H_coT-Cc_9`|C*C(-}5+ z{Y)Hr0;-#M?n5+Cfx?3NN~SuGpe82L(dc*m^bP=(!g_K<+xNl1j@vV&^WEP6BBuQq zo3ejZ9hJ|UGi}Y@}f;w7-k-6A04W~)=!xnf7c^B*| z5x~U7@4CMHd6p*)d@nC&z#~}-C1|B+&WYXU0!`sJj@)yWgKckGErTW3k_{b7Z)FwD zah#jHM;IsdmTabahxOgG+#rOlj|un#~jY#9;;T z^Dv9+A zU4!dH&x|D=@GhN70_-4ar&D7UK3xRx5PUabbu3nr)q9#yxqf#-isyJg3%D*xP(|Qj z>Lmyr6w>Vjqt|DMFkYQkt#m^jYZKRAzQY4rurmeCp6i{)rjX&a)>Y2TOhaZP9gQJ+ zLPeVfh55oS;X2lt^_1>A%R`{V`5*`~GLvY%7ZCeS9K82`MVQkD4tUG6SoIteAUZH+*U6UXC`gh+m*7?Fn{q_;X z$oupuH+ynCzV@9IN=13-2_D)O#YjqNT5ZKvm!w6j&5|Op^@7swnPk<<@ED~K121G> z$RoJ`)%v=A|C_!$Jk0r+K%Eo()-X#j z_)H|aXBz7vc_*P`HL>uiy_5=cqwXkbWI_S&09ka7xZ$^RQ)1B|;@KbD({M<9=xFvK;3#)H!0Si&)Opz#S0trjNnb#tdBZ65AY^3&S z7kLNTozLss|L`aHzB~VChtx4pV$V6OCJ2ATxHSV)4=9d28sN%!n zXd!o|X-178-g~Q#*NgkuWZHU5kew)edFow^pjn-+Kv1D_z7t4Bc1znGwwa=KiRr*7 zBL8oUNgbLGZcc-v3@NITonpnR;XgZ|0^fQe90Ibqt0>`X}Oz9X9#rtj-?C zEfnTX-MCr-_*xQ}WrG3}#Zx@GI|P9d{a^dI}N zpIX6HZQq2o@Xk9NremQwH2fp2YJ~!x;=oBVA@l)U?6QNv2LNuO6CySy@=|a_lsbiC zSLoZAWohJGJ?FM2v{*0~SUDfP1ZB%VkHzc?JFIHEl+}kx2;&qqww#QqkWay=l>ltx zS>2Fg=ppx{wzA$36)wCm!hP;bKx@A_pI@axe%#kdc2 zEe<+>Fgoe2?Av*3(Ms;r@puVUGhI}=M*48kj^4DLZgnlmyx~ZwwJQFcX}ZWxa*|3> zP&7g1H!tF7fa*7-n84eZV@H9%{EHx^!upEs9 zT2GSb!rxOffz3PJIwoXKw(?DI>&OksFfyE^^?InqbIup)DZUu9y{aW{RiFrgIzt_Q{b6b^^D?_B7*>oX1V ziFTKUDEUXT%xf{xxIJfm#_pxX%SoMdPY3V{EJm26wKu!SF2`a>rA-^f@Wou}o&{@V z;S>^JeWos2H-W|x%^oPA*cE4hX%ZQ*ac>Bri}|1gwv$!^AzG(s9_x?^;kQEz!!D8v z??d#4J?OTwEG8yw-^o#-_?KfGYW7laUnBU`8uGB~noY$Z*BV21>0&aN)SBhy9_XCA z=np#%9&~)U=n!c-gHE&5a5{IKyh@< zSsk2nX&!eW*IQ*`QSZZ?uj7*+`>D@?!+vOear--8L`?g>&dRDOh8;iY^kFl;+AGsx zIf0O?aBk~NR?OVYx@O>b*_O!-2w@GFxI zW^0j_=?uXttTazmPb?Y_FZ-WSWakx>Mm<1od}y^BqP{0x8&+&=Zs7UZ*k2YM0P~I- ziH8y!9>V${)a^`sx#dPO<)r(_hj(Aw739TE!w7_L;WUd)^-{&}&Qfs#mKq-8s(2|t zLva3S1e%r7IyL0X?KbyiF*F6U&P6J)!f?)e^ty*nI19+=SSiw0KroU%o6L((bh}jC zdwss^G}@WZ)2d71*fhoxj+Zr&g+it~(?V>;Yv@QiZ4xEG;+EQp>?C4Q*&Lj>$uf^t zaIC-xU}o&R<>|RVZ*_8QLf}-Zv8OAka$TNL`6p8X-A2?u$S4IXeoTsG(V3y(`p{_+ z3#5?DBhg)SC!eMU6w?ZNK{_qf(0=4* z<#{Mjz7w5dWb8CVH=KBo7`CbwUA}vX1wc^d;Ak!6zxj7N9E?$;{~SZ})Q{(V-~c*h zuX#c&uS}he4)BC^Jd%1XAV-G%^_KZiBrKCD)mv$%x)e*Q`yryCVT5*g0p?a$k|qS~ zS7}4;_eF8eVhGC>o#R23cK7VKH4^|U-iIe#x4UT8 zaVe^_MN&$1bT$a8#??t=;FjVjJLiXl0)x1v_o5vjB( zI=gIWQ-)P;f}^$0z%WICI~+QbVkx+U7T*AHt)U2Kt5)n<*ykQ!k?jzu)_K|;ncGv4 z9d=Uk9Th>9i6Wk(o)BTH(|3=q2;D5{mf+0VD{}r62vFJrql%LhqIrdpQSt7WpKBK* zGz^YazE!@;iTo7i_Ka3SM2aSRD{EhGb?WVh@HS>t*rVz*BvsX0wLY7);!Sb(Q82bM z?upuafx&nU3)B6^yI%kPR^IBpq>~Ps2Y6k6e zwzxfom{SVhHPW28M;WFF!DXwIX$C$9M1?LQz_cWq-85q?>_*hdYBG-mi$0UGskn9RobqZI)#Kl38EM0*XrGFS?bVwWk?ctNc+tSA0pmWLXXm<|K z$q`Yz&-T;d0R6)Q2Mmt5*x97OI73OPZx9e64@)g-bN5!=uqF=?MUouRu!Aw#t+S#F zPjp!vf=!ohfzNFhezGHrgHuO4aS6PcnU+qK(pYg!d&1&-VuN!Ol~exS5@_O?9HVl& zXl2ggg=`eKN)CbkO)n;rV+3MRY24)IP-k|a=;J%Y@8UN%sL)fRG*u!B%F*)!Aj~zM z^wdHY%+5#CpI(_399TMoc>Kh30?YphWi&n*_O^TLq;K9Ju?t zz2DxSlKh3-KkXybw;%e0Tknr=q`Dul9};Svwl2Thzi6XnRm#n8>Kv7#rFKs&ZL{1L zX^RcfE+7*jZ~|P50@`YWG*V_5c=_QoLffl?e(*&Ykul;Sa2K9B9ync3CraDI^5vU( z(e5umB>-O=)h?ng75Lk8rZ}&)BDCj$F&G`F7LqN`?SD@xDk*+s8E!x7pUr5}1S2_9>}$@Pz9Uld-( z@t1VjHe7C|b}N@&6pBw#_%hs+c{?2i(~iy9E-*vr=7ivc$@Vj-#q=Cq<~k;0#ixk4 zh8!l=GjeVd!PP;cvnV^6ApC|{;2lL3VT_HVcZ$i^&+gy&NIu&K)fpdZPyRe1?aihf zt$!`K1o)?q6djg2pSCLAJD+MR!>P(8JA!jgbWKhi&6qu*3B$`~)^HN#3%UfQ6Li0N z&`xopoq+BTRA*qlOxO#aGW-s>jt-12NS8b*{Dqz+#epI|W7}@Exec>jFEHJp;{&59 zTDc95iiz<8NtNBCSRi8p_OVRc?FjM0oINOH#)&EIkN7!*_QzRC&ovIIur1yL&L=)0 z1Hs!-jx|z_3BBXzy#$qsSGO9cvAEzpJ}|lUV8`=$GR-?3xV-P3VlwzP;aXR$hKR^<8 zIWX|~Bb+e7am=lu9z>j7mBSTTI5eyK_!b(sYh%eAp%;<$z@aUvzzi1+0^X{qK44un z(Mow1%5uny3brH5rFRKt6l*L`^9SCKCie1;YnW;2H8T;9SEs9C1j{i)V=>NfJ&TM@ zc)(psN6sp&lI9Or5L|5(C-<&nThH(3qHpAyas^@@I2<#2V5+W$hvBI4>vew~JSYMH z>41S6x?w`?Pw;5L5+lc{Qv~ddKv8Ifcyo9Naw$SwVilCEeSMxc7&q<$Wp{e?^Ri>l z4r~f~qi_fhb_K^S2A3{yy^P1#KEsy$v4Yz77ApRcLYGhdGw&|kC$zTNtl1&cc_&(t z{D0)4oGzms%#sZlY!_%#ce~mD5+np66X~qX1$ug6=MM-d2R12+*)oz{zgW&J9gGn9 z7pbji31HjW0L!FTE|46}Q18Ij_cLv%L^~H$sl!h=q`#0^E>Wb@j#>5-T9MxG@F!~( z@6G?XCYc&-l9F45YKp=t2e68#8ZP>rho{wAgpsGXQz|;3vWli?K)69a%<~!sHdme^ zxoELd5@4z3ss-)5!raS6EhLkApm!9J`S%o z`#JA{iEQ<&+TCR_onni(sBuyv1eiC)Y!nDsM}omB_ediqnD;_tJ%x>I-!~bL2Aw_9 z+E3>kG%j79{YR@nNp^G+kfj?ZiWh3cf}>Nv+rA&LZu9zb?69;?bXB3VM-ljhe!<`% z>Z$)JXCy7@)5|#U=oIcwOQl}@i^zB_eq(i3!@Jp1-9H{I6 zy`8nzFxQIgr#wtpX`v4OIR?9`u7RTz+>6u7BI}}0GUcBzXA6ZNsk7I?jn;GJXIZQF zn%x_Aegao(YDX(bUY2}0ycpyx$|G<7ddoQ8UKxA#7BKod!G#Snt?6Q7BZ8XSLC zlr9S2wsX?>jD}eMhteKVKsQ;>pXinoZLl~^ODj{|wPbi92zW{;E~N-l;ya$@EcoQB zs3Cr|rugz2mDiu=?_R1$%|bCMR-cYV?AWYLZ4HAL#YcT!K;L`DC)>)dhjseuW!GVPcs?>7!=O zBWeWVuArV;Oqi-ki{bS-o*5p68T^C-TTb!^+p8mz^veLqb&45rOEt}W28-OF4^gVW z-qef<_Zm}Ch)Q7_Pd4*YIt-)(OEB>M99Rh7ES^H7%ZHZbVWl}~vWXHrb|lrdbTqU_ zcWI|DPKgjKNe)d+exoRwk6J|^q_~zR7YWdNcxiYdZHsl1W?LntjX1B4bf8B%SLf{aWA@XT0){PGGZYGpY^-b zao99WFERzZwIblUIJcS$xpP)A&Ln7l&PQ{}bJF0r>VCMrj6VHU6bwL`&`jBhB)^4Q zT*Kj_VbkQolie^J;LcecWr714nAmZj9NkJ%#D_T;Ecb5JGwQ(9NaDt`dyXh^Hj1h& z&ZVPgl4#E~Wx~vO*kn-QH5PsJ-HAAGcq4a-qa8yL)x>RS=wgSySJW%=Py{C&#q?7T z1WDJ8e0I7x-?RWCaducy*H_6oB0Co*uB-LcF8xd}MqtM%OdJH#smlGX`3)?0pn%+a z${sn+R&K6xE&(EHrgX&2OJwpl&1ezvZpaqijcWoju_s=mU=*@8vC~nLGeplcK)B?P`v_Iwmql_&ifsz(D!^rT*r@vn+G#6XkO=dG z`A1$O0)_`pQ3aDMo6pfzSdv4WVTGV_wsK=!e@;(t9V3^JQN{ZHgu%&%>My{wNVbKX zDy`xssN+cbsoQPQ$t)J(uIQqyV%cyCUds_MW(mx4e-_*0;djDx6StK1a57~#q)P&K z2%R9V*TxGSo>2u9S$mCn6n3_3>iC(XN%l}$JFEN9Nmm9oTwc|(LW{VPqnogT&rw)w zQNeQT_9{z=lxu_VdvZj9O`nE@Ov`TDmOo$-rh6z!u`HedrgY@BT+U0)_<1yTuq%C> z&bUDfY{v+tNp?=FLkxw!-H8vV%&_e0Kvb(^ALZikB(L;ej>#xG9-pRVgZU_GV{ifZK9Ds!Q^-KxJCv>^liEUQIB9wPy4 ze6XLefLt%+Ng*b?0)W$WbVeNQv;+NdwqvKXewnc|TLrlhFKx&}Sp^Utm~3TYwnt}3 zI%y_Cr(8A_E35BSjE$Ua?&}i}e61EBQc`zo*RpHFQ}shs`U&D<(s2UUYGzBv%Aqt< zyPrI_Pru^d>2#V_3=vt8oc)hu6utNij*=X?pQEl4BSr z{){n|I2~ZEXr0Y(u?LzIZ7906llP=uUo=AG?<7Eusl3ZhZONdMPs4?aF}6|v_8XKizP32=5iaIJC`r_Y##oV5IuiHi{c;1Vta4x z@ntzGpZ*7+MYw2`8At8g^2AHV8$m&wk(1Et;Y>G)mqpFQxxf}KPZjBJXO$Y!vs7vsjTd_TsJcj$tEv3UQ%*b4k)Idb4P@8g`l&C zr|DfiR~vX>1#bXQonE5dCyJ~VWufeu;LPlsy$HNz_lC4ajxcaPn3ntoWi$niCsRH_ z#N7_2R$|ZVXLe63Ev>u!jAk{Doq7sFOE*aO6~U&8&SsRZg4O(KWj&2nZSO5gjLOP@ z(~DgpE@TZj`+;X7L)EM-sBWYb*Ib&``YEF^GHVERo7g#9y4WH&vP|FRGJ?fpU~D=i z+>!Rsv{1L|4APQHFjSxw&tkTH_A|_lZ;lnV!*j1;5E^UJrDHGu*a*UY!CK|daBeq)t za@ZaHpThF8!*VP|cc#MEsEMP_Y`vG)dTVh@gC5zr++CUjDE-s!n#?Q&lQ4a>JWw@`t?+DI`l+1^{ngYEA2Ry!FZqLgNK1&Je1uXNPu%D# z4KJ%C+f+$_6{I`E(cFs8w>AsT+95L9+LoE8x)ty3P~zi7qB7eg6N1GR#g&$j9C1M>Y4jV!YTdy=RRjxN&^FvaqRZGG^!ls3yxEW7Tvh!z+5PGl|)_l&g!VO6Q z<_kL@u8kM_ugSG$Xcs%qF(sK)1j2M449SGz^`WFF;xM`xux-XKjwqQ!y=fR@mc!U3191+{9)~ z5iy0BPZkMy1}I=}O}bGS$3#eX%4Ktode)Sj>w+ccJHj#9MEWx~*6ZiIIoMq*3vgtY ztg@vV0dVNxsOxR0cUgqwHY-H#Cicfm-MxYt2}ONr?uS;xJ>zQE-eBnbXG4`WDVFj=@g|LOEjPL8D3T z(v-vW$qo_;zx;c?pQ+RkwFWdPDArDjdoW-rdSO9nE{P=p| zL;l$p)u_Dphd(5M%E1F!slC9;59#Ol|3}@M{M@!>*lFoz1Ny+&M|(2YHxyna>TOjfMkTE z0)19nb&V$A65)c8bK+L3A{Wy)!j)JW&0c( zI=eVLjWYX#I*dq?U1pPVKN`IP}>bK+v6DP=(Smf74&T+ zv;s{Eo7p})WUoX;tU13^LfHPR>)lIHoJ#JQql@4la zqCBr2B7QbQxK41z60TmXP$3&=Iug3%_U{T}C#?Vl7VgjxK1$P}a>G_souRVFpp#v5LAToF}ZIjsq~$st3^UCin6LYpbDinjMhXsqi7t zN}XebbRSb+Dc#^9*o#2b%OFYG@G~KMV7+x0k$Bxx^Ne(0tq1@q{HE+Zq)Rh2HdNru zd$w;$!Nei0gsSJZ!li;|in+V1_=w(0R56)OHu5YT>$U?y`cVA1QX z7Oy)KjeUy(8%`ZST;<8VV>fCDG~>v^p(MY)_Z!)Gc@iXGh#ei5#f-}K`M@0zK^#tQ zIrkrxROwh4C=&CiP(|7$Iih0gnjd^a<*BDCkD{_RB$~3t>Q_N`X>KT3Md3pih_!MI zI5;l@bLs>%J)AfTeeE)9Z$fM~bhntodO!Ecg{~3KCRt>Vona#2osu3)8*LNe<4sz| zOtU80G<7%b4|<+}iz^G$6M&}iD8l1NVQ9!3gt`=DwHihQ1axKZQu zIc4@v+ab9E17Vtj+75U9;lj#VQ7^!-P75GMTNYcR-760 z#{}2`oy5GfCVsJalc`y`E7LHK(}qdNbjefVvsg<)t%k32>vVtn5N` zaY{|Ayec|KW^!?M;i;fY6RT^-y)-x$_c{cmZV152Q(SgeH})i%|oG zzjN%34jgH%#4j`yy8|eM{aX6yC8N-Wj}V zsx5={cpa8z7Ui>=f|i z6Z=smt?}mmfKn&PR_(v-a$NP=#7)%jL@?{G6Av&KB1@v_W1E~O3wEO@tmH925ZXot z#9lC@%7<`o#nm%6YL+9zft*(HARA|EVa`B6&)__Yx|>CIWbR@?G;yLZGb*f*=sOLz zVS|YWBCzINT^$f+G@aQ_FBgm{oJ__HN%3^yp5)0D8>VO&GN3PN9ME82cB4a1$6@w( z+Jer6mf;~f#VIsa#u7LnYwI(>Q2uBwM&mXmu!f=x9Ns zaR(RYZlymL+eqx5433j8i805X@dkVxxv>3+hfMVT0v)Mb)6(8q&FH!m?Y?$4W7$CS@j3c@*-k-QuiHc!tn zPdS8!1Q90TcNY6788*0v7e)Nqm(DXDI+zrDlUp){?ws91(tlgAYbM6xg#(bnfCq9f zz2z;PeicgULPghfY&XJ3i!YQybp&%x9%^x4WiV?LN9sTk$Mq)B2QqaSEYKAjG2&NS zI{b>rwEipkA-%Eyg&pA8D!S(3fyL4Q8OoDBMh*umm&y4fJ26(4+#6=!*FRSP-rT~X zrg&(td8$Lv-(+JPfl#ohICv_xy;l~(fe-LRFO52pZp{7xqJ5M=?8JQUdM`6Q?puFw zv|0f>^Gs$HAnv=fa~EOfY?WTyM7hrS`ix4=WJ+sbUfWtNW{f)*t9-RJ*;<{I)x zW$Sw=$SzMU#dSH9D}bND4Vj-~@moAcb8Poc2)Z5GrlU!|n79B)_)QCWRH4V#EnDXP zRCu!($@F0Ga2RygS#U!WG3_bcRz#6+X9;hoj1viS>coMIt^N%hX(X7YJvK^r6DFHU zJW_k9Ez2Za(*-2z#mflZ_q~`(XuPG%qI(i}++02|d@u*~0G5 zDfwh{$FVbd>KILkifQ|{vVL>CGy%%u_}88UsR!uMk?sm{*0C$VPN`6Z*~J^kXDN{5 zBVUGkh$(I{WjUFoIP*L+qyXvIfLVnnUj@nRCzwwiV*`Q>TTv)WKpu5~7*jY}xR-Az zBKT*^t=Ow0$E-1Oxs=V4hs69W1s;gC_yGHZZWnfUDeN5_hfi$&=(0}HMDc#R$!1AH zvZVvh9*QV$6=x!T^ct~6iTat#cIAYSE%Wj~vTUKw$AmTNV zXaY}-Rtdf*)0<_hKQLzIbJXKk)$H(JE}8aMV^ep7e(Rt+ja~k$F%FJ}1JZYIdAj z1*^99x*_>G@V+}1s|MQJ39!RN2GPzysm*xJ_M=XHgC`$pCw2wav1NxY64A>lL}Tk+ zk@GcZS`MUC%P85NrP%~ZI1(acYnI|(VF*nq9Z~kbF zbcJYPycR`A)>F~po^$n#m3J?FiHuwV*8eby} zC~v|K(RREuW5y~WoVt}k;GY1_Ce}W7?AV>)+B-52YbOThT5WZxoD^2d=F3bT#+?MS z)PT3ACFmy^n~uyeA4TdJPU>a-UZUXkco?H#c4C9QqY967 z4pw)XV`EnN9M`kkIfW0^8<6y5eu-Rw1(G_i9FqVOXB!+`vbW@Swr zaQLTvyUEDLaWW+pddQghhzi#|qYl_zSUyukxXeo80q=ydqwW!mh;%gmYvcOyUx}F3 zf0=*2c1U{SJ64D;zIuoI=GGn^0E3}^_cpap`W$TexO+O8Y#`k81WhFDUkWcRE@W|X;y%nftKJ(wMVV7jB_!#}Wq9&iqI zq&u&qQ~_i86VCV?s^HhGq+KzdQ7!$+QaM|N4#Ht&dvGyl67daV5uVI%7@=I6k7Z>R zBCSOg3IkjK+7^}Vur)Om9@kqr5llJ;GdPQ;%V$q>R(4)}nNI z69oywOPc}QcOB-=sqme||I;Sj^Dxs?_r1RU)*b-X-$~8zp^|Ce`HN({12)`s!a7PE z$ZGlRteF-wK}=5EHvt2gI8vD7a=`h*6FW~;>~1iiudK#pL%hqz*<^NV0tjPEpIwz6 zHH(ZVe0`2Bs1ZT2#t^S;<5_unU0VGO;^P#Os?Q4>0F##oZk{nq2g6Pk$6nhm{0Ltf zWLE@8oJudlMtmco5uXXEl7SYe2^Eq+JuNVl5J^S*j(iu?G?^e#gjKd&O-`X~mnKeH zl=4hG9XUpT^N6i>X9y`44OrPJkxhnT|3v>C!(;&=f^ip2NB&c%An zI%PM}A5B4nhukk|L2T6po)p4CH^WSjE+LnxdlD$vl#H2^VQf>zOl*k6pMHjIiH@HL1iD z7*7am59xj~TZ)HB?|AVH5U8{hL7qOxGQS(Az0j0(uI5oxB$>slggs!R>W; zF)-++;>i6Z0>CPdiUeYINl&qk@32-+UES2&J*>rpl$jt2vBmvqTb84!x*;Gu z?&rUHdF!ufq2m9<%E-%Y&|B#&oTmdvHw1QydQxhLRS{@q~m92KJ(a6=ByT zlN4dK`Ffs?^mX%nog$`nIT^bEtwNrI6V}5sPa&Ss2Nas~-bqeJZ0!$mJ{_Av2%(iC z%f^;JW7kFKX;%3;bSUW)8)-=lP(Q^DCL<1B;X52o87wK3&hdoSw`LET9vvH)6t#WD zQ9$2A#RV&)W5ha(;^HW2Ra zQ$ELJCj^H>?pto2)cZ7avM7!|n7T~fg;&aOjw{d^7#SRhA{Ir$YfYmY3dkHGOgBlc3#t6h0p6QnP^1e-^8)X!{G>yMdLv;M<_B6vqToq zO-6uQTD-NJ7Nx(c2d>h&lYbSDF48^H`W4g)A96?K-R+&)F%WZa^}*v|A!>O2qwldt z&Li7nklD%Hi%G~&r6aRCz8g>54gqSh4jgvV1@pn?z6GNQCKR>(Av1M46ewD|N%$d8 za%+@Rq@`+Qns7Y8prG=+OKV!^d@N*EafXr5!0D3ugB0lDT5u*k^91{p0h8iUPbeNY zLk_}EoEQgYwJ|Gq$*j_P8Sl}qT~VB}mn3tKCE`VdiXST%hbf@oI^bt{sq*GMKfkkk##fDat!!>iAlvsJQ1?SLRWP^jk z%wBwfgYov=vjecRfC|k`QYlA1c~b?_Hd}RQ=*8!$Vxqw5p~Xr(fXZkETr)~=T$s?= zOf(Oo7!Pz%7+5%+_+DLt z=vr0rX&H^$m@)=E3sQ)2#Yu6XAnEKfsi&J_+*a8B1TAr+#Aevh(Qp*H3^E96$ ztGuxfY5TWO9cN+%4G>x#E>7%^0_Tk$uVmvh7=2tdK{P~T)Lm`x2-lO}^Y)ahC9xLl zRAuKrN-JfmF_pJWBGFu1OwtPwZC%#Y=;* z*d@h%2#|Dog*bX^k5=Hzb&5{(k-@9}Ahzck5>JKfVsAyUg;+SPJxaRwEh3+hla3>z z`Y~>9_&&D>SJ1CbC*?!csAR{)3n+D>U3_vjh^&y4&ISD55#=~Is7jAg=$C5%ixnHL5I4VtGzU`CnTs>(WN=~_JFz*ghiHjJ14KxCFHxE^Y>;zzJ~Y&`u$}6HXg10J z$Rt_O=kRpUu`uiw>nxrNENdt9HMevX?VGciKZ=nllx0W4E12q(j0e8%fzO6*?J0y& z3ik|fxypnnBJYH#?vC&6cyIZB&tZ|qHr}A9l==d31f5uP2J~Iy z$w8-qYUwHoC50BXSz%761jUhc!NP4wp3n8U+@m@v6r5+iNNjujj7RFJzJ@LGMdzgn zY;45}6pV%Lo12%DhuxDQZi*A)(PKHc_C4JN^2kc#hpXVN+-w^7|3cDmA`$B`!aC~`0I zpfOl@;2Ur(J;fqUVf17XP z_sH(8r#QI5?7#&0z(u1&lyFm8MQ3)xg$R8WSnTNjQ`D$@N7ayvLY^5cZ(!Nw2~=%+ z`4C5Nfpw z&zY)l+8Oy_5?GdGMd0;kxIo_EGZ#+5`X6qz{ZO^6gdo~J<;MV%Q0O*(^SwZU)^O$@r%_-3`b(f!QlGvdJ>KfO}3@6anm+E*dyZpBP#avJS8 z@eHvnG5J z70+{lCk7x~h@fFv$T!2{@70aTo2oJ-v3 z587n`uA}QNCzl@?Ill2`hK68=u2~9f)rQQrWsYBGMaL7^#(6hKASYVL zfs;Hfn)$s3I1Tv5>vc@Fx-DDLj`{Gd?L_OJp%!kEW23?l*^Q~0x!RG-ZaoDOHt_mr z(evE6U|R+mlA>IK`p8M}Rx=ekGPd1tYfdPzV+%D$ETCOB88x!wLrZI?vKpsyCLQ0H zl8lpPhi%+(5=;;jvwct4Iohh zd-$wPaI8)VbY$0>?z4)s0C5)D#eu`l@QRoS{Cm3fP`KoN4xQSVzif`mcijB=P)0u_ z-*vV)p*V^`5iHj^0AzTYb0sD28~z?O2TepcL#8kzGtdng{&xi?Ev5V*qk;=;tGPQq zguWIcJXF2LGgooLcKo!;2ASe8aW6~pWc!*0k``FiHQNjsIi-Yr2t{;6n=cAkpJ9vQ z)=3vrlf{QtWh;^A!6GRYwgsnhfg%RF9d$~M6xlW_hQb1#!BugH^JP+lK!;DxfH4|@ z?QXXbJw?S7K^xcvO|Q?ag~)MzrvwEadI~}(AoF2F@-WbiFYY9hR`0cC-X8Ef-`z7eoDqk;yy+f$xLhV7LY*z%;Th5(MQiEN;2hvSGT zw)ckOVTy2{owp&UD$Rs(;drE79rxWG_mI>M+ik;<99&F!&T5|PN_JXj@oP+qI*wfq z_YAG1#*e6q-T+fTtiK98_v~~daP-Raajzq)43O`0GG)by;cu9<=7;U>TzAnr*MgX|J|&zLHmU0GfBW;s4Qjp`Ri-mfEj^0)sr_9-M#6<*@Lk$845@}-wvr3>vbt9fz3 zq$tzsYpF-^bl=nl)>=@%5jh4cFqmE41Eo?bG^MM;L zb4~mquj)aWo|s}Qo8G|5k3|86tL5b2O;kAgES5mhtt4gGNuOHhst;iSuC$vSrFHhD6 zPc)H>`PT7Q#Ll9o+j;@wXkpDTz&poWLR-qR)=SOo9bZX@GZmDA{RD&usw8c zYAL)kb%T%)8WpL|j$20&bGOQ;QBk)^r}7k6$b$&-YUv&=;dsTy;drV>fkCYnixskT z;3Ak19-p)Fg47b9MI>9*(46_V=sKeAEi0H=$MboZ5NDf}coe6*DL^`gmL?bt8yvw| z0UQCxST`5lnb@tn6gw7GKs>UMh;6Uuj0Xe8YfMRkk0j_uc0}&8x-uztlt9sY6r+aO zO9vkQH?0J)WXR|UFAJvb8MaB(J;Ob_5xvm1*b}E`69mJYkF?xK9TCD3S)`jpVQ4pt zF#tFOa`TK0$+L($#75zSjB!G0QS(!1c$mQ)*kTd#<&F3SK{FA4*zgu(4Q4YPMDP?j*D?XM>U9 ziFBZHn$SQ+PX3nH_qnv0-i44W$c{S?U(jh$EYJ9a%emWrC80b26bcpBj!NntK(gdq zkEvn70KTU;C`R8sn!y5nU70Bkf$P$;ixLcuvTDb714%aQ!NR+Wq$%vWw0m=i+rEYpCe0_up;P5>Y9+w+la!Pe{&^-2;KH|IGBw)4zO=@f0Uqa%4EOn)6b zMNhG-dlgN@gNGI6ktwJh!rpEw;+$|W6xi>EmM@;l*zM>U28k2) zs1yG}1XzLH=2K^dk?wCrkb4&__noKi1S>{m%(Mzxq$}yxJ+%>mQ*F-vy<+LdC^UBm z46B8vpnHm@)3LxY8#)hTL;<*<6C)?5Dbt1{W+am*)DQ2Wi*1pCrs+zHas*9@kT|?> z|8!vFfs11`aWq;ILOt>3Z)X*k$-$A43qR8XcH-pdMN|h>Xwd9p7=+Kvj!M)5^l&D~ z09uMmz+)+556S;Y%X13mp?9%5AO$;@$U0(uAxV$?F0 zxfvFynK38+d`6vGIIFc@DCE^127K+x4-!!8TAV3V0?37fKW)OaL<_@t9CE( zYNyx_Ai6VAl>TrPXWBw}YLM2Y;MVD2n6p+zraseM!azHhc4oriD2(ztQLRPzXvIq4 zi2;OAE(8rcf{9S7F$+c)qLLk=(cs44M4UKysx*5L_pyaNO?e??8^l8}*~HTqAT4fp z7ig15t58GE&zmE*0BuneC?-}shV4z1A9N-Rt6;F1e4u!6uAHIW5{#9uuGeM7M0u(f8aw2FU)`BAYN4cckoqaF#k4;|$fVPkuB$wWV^qdK#3}hJQJNqI zdAh(Dd0!FQm}59W){m!dSRNW29Rq(_OuSNX9pj;cMLLRkpA}&clH5H7y0waQ6fk*z zp^HijDn}QR5tpNr34vw_za3-INHL{F<#jo;4G5@-{f#*v#`wIyCz1as+D{xNsk<9qa6PhqOxP)J z;Y2$}-ODEOg)ELn)EbuY05gT$Tz~F#dU~zfWrh*ae3o?|fzb~WF|FCdLdT8#KC6Ar zqTtp_fXB-HKv!f_79*2G@3ec-a*9ngISLJW1w6dn>$Ef}5E}b|ys;pF$T5?epH9Vr zf@!o?LMdABILd;mJG@dh*>s_miw>vdB=V|wPmYt|kIgOvxiUpB{*5J&@*{AZWlPHZn!LAqFj*ZMg*qBQ} z*>@*oXb2xp{5);a`g;hVj(5z8gEs~X(!!7Y6x?JK&NEvi-8b@D_C{YKWVXg91gtey zDR^8LCH^Vlqep*)Q6)V$Dui<}m~d!fZVNXBZk|19%bscMhnHT(^Zo!Hp4uH+#Zip2 zkmd-HFORn4Hyrn7xMJxL_`qC65gl?79IsXm)W9?24^aap;5ES$P}n}vMRu#mfr*VU zt>2)adaJ|CDPt-MrhQhYAe7aVx>e@N6jUwUG~~sM$l@yI7Av!uBbe{zMOIy`8IH_D zbV-fQ%gD~30)ISXJS+5bmeFW`ehfRk#v1XhPMs#MmpnK$OD!R@iMS3@-_lgYK1n_= zz1l#CYZDQyODBU}8gOt{yuA{8aU+*R41AAiSEr( zhf8O{fTF$%yk;znJPWN5fDnWKx=>BmW;RQlNtM5QZMt+Z1!v4G2qh)63j}Klk?|_5 z4&bHJO(de{6ZXja*rPADOanIODO{Rtn@BtHB#}0#&gZxV$-QYm#lqF9&&x&g;AUGYsdEVkDo=Etd~6qm<~${G+{>Ag_Q|NgN{UUV@2HMI zhhQ>WNcOFC)w!mNvuG}X=RqgN5-aY|&=cu`v%XncRvpiK5}mWavNcp^bjd>vrMh!i?EBrC422uuZG zrP~PY)I@dlx^xj5`;5@)O$z_L(D5ses0^a%%$c14#8~hD`aXC0nYyMqO&fs!aZ}~E zmum(sx}>+B=n5u@8IGBFViU0=>{)OWW`9_XR5`|+xKhe}IfQ zr$JhJz3wwdKrP4klLup-xQcLEF(gwuWm%A5+!fXJiHQ8%%xe6^#c@&y4K@-<)du?Z z_3Q0NMNE5+NFK%mDRP!J!+}R0l4-!jk9-qqQuyI7`YKMctSp=AAcR18lNRO1ZO?*` zS!Fib4h+?6uLyVp8#W}(+NRxTMvZKw71k9 zkr;e~KA<5BqsiE7N?4n+B-m!BwYHTbaKiwt3bQV>MGCV|oQ_6B+O6pjp~FFc?m^2P zIx8HD(4|HNe!#slC67b9K@7y3SXj0Y&JoF8E|U_v;RHsfiV`zXgm$uBWb{FO3e%ZQ z=D?0l#(~zgd&Qr|T+JUT zs4Q}Le^(-s)xCo;9mkhE!_YysHmIXzx~_W_?&PsJMhl0G#G=kZX@h5{logR! zDc0mE>?)3t__GXMtyTE3$dnFQCmkB25;Ba4l*kb)iuZez`-i`-ZfuW8dou5Hg8W*F zmnCt#d)mK4tkaI}wP8I=)=#jzUXZ^gTqi>Gycc}4<9TGT?oGPV)OZlD(Q&WcIf8<1 z?|KeTNje@F^|W-{MrKe|)Il-IOt26f;RmB`TEPk(Bfa@VzL`IP^dUs zU&c+ESXZMt=4|iOJksTuP3XWEKn!UM0i!<3WpASOi zD1Cc=eQR__z|j;lHDg)$d1UrW@@2B{nI+Ifa&=B#$P`NL!~Q&0>MV;z%zYL-3$KF@ z%spm`W8EVc#N^PK=m}6HU7bsxk>fCmwIe&F0oG9I#Z2g(?nOk-d$ZMvYU}ID2JK+* zs0DXm9Fqqi^MsfU6G1&SODu|`x-j=y(GKU-$cnw@+*;|#uIqVymT#$l!Rgo~r$!UW zoz6O|yd`y?@au-O@LBlx%y8L7A;$+q=l4AElPfdRD(x~ZT@+%BU0C!iv9HTvfQ6J~ z3*C6g!bpW{H}y|sJzdxHdJp$mOs#>S!;=L7J{M+#b)3`)DW&6(&s;vwa)9V=h1l>4 zrsTy|s`rFDkD;S1u_s>FYJ!LmSoK@%)H>almum=NlbY|;ke$KQ_5I#G_r;;1nk>}N z*7%+~0S%e?N;Xm|WnU9~q5`p+Z}PLyJuE<$}qM%Q^+(6#K?K z)%{%brmEUxJdv|vlW?$BC*OuJw3s!jaTy0BZhOGR6LnfX@>M*#Ip`J2o#4>>kYA+NegwuaXTA;K~wYl;<{ zJO`$-rUg){Xr3%Mhv!B#C9{PT*V8I%?JSP=4kklqh&r0m1Jnsv$QZjr0cTEWM2pTXxmK)Z$$rG~CE6glGXj8s_lMzr$-ktBZLR$(M}?po)&) zYp{rR6cg>`|JNKk1+g4qw$dGCYAW-Fm`V*thzXuP?T;viR!8tEI0n0g6Pgzanqw7& zfldl-%vZPO5E3Uxb*n>3Jb=xz*RwdCI8}P7dRS01*M=fYj-!{rc0`IuM}peC3}eu| zxCA=p;%>}5i-+f%xihEetXN?2%rmel--U5=Yvtfr8||d*A+R16Vt^rZnZFhayzpG( zIy594U9mvwGFH3wO3CI}l1aYd-)i<~Qd}7W5J`PD=~$x6whmf&BS~WYcg%Sha(nbJ6jJN zG&^nBv{Dnf(OOn3Ida1ID#WpQP6nq|d_-j0wx=MOu^&SW3XB9{7u#mx79PxmYtMn( z6|n)=7Z;-k6mE=euVQafSJgg3g-ZI$9h*MdCJNHxross8)rM?a+?R@ZbTTH|+!Vx~ zQ&=a7u=i~9-hdOP3V$!a`-3`1Wb2Yvy6KfDNyYV)#LKl|51`+LCQ18YZ=U}6oaI6@ zah-fZKxt>N%@zr}TIUql2rVMhPssr}K|Ez-`+~t?#@tw>jL6QwAt7iC*m813S|Q_^ zQ=%C~)bJSSt|5x_$lMr+9b36)D7s@oc%a~DaOmvQo#%`PN;or;?Q|Uc!UUX0vjI@)QFcHFwj+!BpC}IMq8f7JHYo=$~F#{EIbITAx zPpe@DN5)`PU_wuXam$SWC$yW{-oG|+ZyXU7V<)vrxUU>P>quZ%@rhV0xmO4r z7swNxv};T-_wf)G@hD~lijC{fmIDvkoqKjo$`!Rv+$b2F1;P>!OBmvEZS52InB}x% zJA9&m+}fFmtgj+??h~OWMKd)3P&az`V|7gTVH7Bg0?(oG-U<4u*Rl$u%OOYdC*C`Y z;0LD;1c?$Rk0_3E<8|nz*l}U;>-I>6TROK{qIRlv8`h(=H?#2R`{3jjAbr1q644pSJ_E}v$xHy@voU~oMz7mC69s*9Q z_4jBT&(;on6K7+{bqdjXu@l@xb9Bcz**izIpkL3zO6XzLME^9V=)7hH8SXBZC--Fz zBsZZW-b4`p5O6wcG{p5k7~3*thNtoX=mOR|TDj)}`x-&4hQj(D#gyWKqDhzMU=EY* zNyWe$?1*CjusSLqnwWM8=%CJbgljbby*i5(9N&Z4K$x}iCd_s$Tte4slgMRO@m84( ze873pnK~OHV$JbQ+ozHdB@S}N)VKP39j%Xmkvy1n!37m75HZUWfYNcp&xd_siYil+Vfnzc6bM!pP{--OgNXY_w#3DgxwHEsgvTyWHU?=?ps2Yb zAwo|#CJv*3MUZ1_b$Z@yd6Rr47Z{&E`s?snhZHYcm(-T)<=m)Tpva4&dw_{CqF5D8 zsFrLKuNi%FoJu0c8je$Q!?SW{YAqc#UZW-^8dpGO*(P(eO$QWCLve+LEQ{z|@58UI z#mhx;b}p6}QG)IW4sZXDfVK^R{8jAc(}f$zJx+AfxsBh1W%f%bs(;kTpiu{@;s zA9IViukJ+$oQ*{cKeqraT)}i1jLUH# zuGx**VRMhaT;O@(p4ab=L&=F^;UotM+LRSp)Tu(pQJbmmC06q6K_-oXM{-(LiiS;*2IG3&6r-CcW}a}RI?%+uj< z(9Of(H78>xvM93L2tef2MJziMEO3jc>mYch!-!VOu$-|^xRe&ONd>;{l|YS6r7!E^ zx!Q?-Rb}^=t8mR%R+nSi4}Ip1{qW~MW?%UD8~eg1Z}#1vIPCLp4*T9uy|K@KtlJkp z@y0&$@?d`A<^KBkvDF2izV)pudinLaj~!`w{pQQ_{T4Yy*X#J&%g?(0`@E;(;7uH#4Mhrz_OSw;J7ooe*egVi_Q~(N@%v>~`PKz&q6@^I{r>&5fAmtg{NG=F-~P{+ zqUHbi#rN!Qzx?~(e);GB{tI8TfBgPSq1A8K?C$03UJ99h6*Mf;A@*4 z9eL`7I>%z<&scR>Gw2eFACr$$%hWjH+@BGPeg3=@`te2UHJX$*;xltSmM1$7U3V( zuj9k|#*Sp&o*5q0QS1%X&@EV)bB-d+k{95)I0m{H`^G=n&f80U{|Ltc@MERmkd0k1L*LaosuYN zuo!Ou5Kd750X^W@Ln`Ts^ykp7O+CEy_?Oz7i~~=l{FDUfhKK#Km#z@4m)CQF_U>$z zPEuKwLs4Tm6ODrba&@PRON7u2eN4r>ZDz*OC$Pij_K>@AianY6JZ}C_@NgEpg>tP} z4^|MkB>6&@aYy%rSxyAQ1q#8=4O`>vbYZ~y*J+fRJqv-syH?8mAi9vZSp*9uc~D+Dw%skpW@3aR&DY`ZJGbTDj>+qRMt$atSxs3A{? z`YYf9XyNUteQ+GqJVo27wQyybVH5|(Pj+_k?-VyT?T!#{A2Z_tnB2_nTL_z^6WA$0JG#86g=3x)fo>T$0fWTi%Xl>aPOJw*Mp{jvpf_}w z8xE~wkRw%NFb;#(9`BK2=5*meE5+`KihJGYnAkocLDX+)u4#mX7g8OrtVDC_i$$3wK|$a%kqPNP7pHL&CGOjlW7 zBf4FsJTxFaGKEUB#3nP9wPUy08*#N7gWVI+Zg^@BN*tB6))|jXgzLe1*$CcrPaD}} zl4Ng~abJQzc<0X&9rfEj#V)V?+^wvo32Y4PimXO65Dps-PZ>k(iy?o{9`ZLThv5(= zNVekS70Gd2VCoj;klT@di07?4g>*%!GMOmjK zN(9~7Bj4fzq9Qp656TqeZ+ZEpD{XcrHft&z}nz{{6+Fk%Hy5fAa7Cz$Xv;;*Wf{{YyXm zUHP@&d^zI%wSV|^`zwF{YxY8<(_;gSZ*JCdBAQq`;q#Zy9g17 zJa!|BSwtZ-?=$KZ!b;r9@xg^Ee}j%+%<5!zI)awax#daxR<8cd{}88$xyVXf#*|WA z(AhMC#fvar2w$9*x|_AepzD|;VUE(N|G~Y>?|m{42Za_#We39Nrlv~bb-n4Ox!`Gk znreV5Iop}_BlO;Y*zn*5XsZ7y!uQ!LL#N3a!cP7m+$}^rjc1j`RhOJCuD?tW-iHLs z*Y4&I--m_O~_3QHWB`|1@;=$@{> z)se=i`!0fD7AvdM-s`|@vbXlslkbD&1>U5UnTJJZ78aD$109%N&D)WbcpgoHd2@5*e;xaJn2S-{9TXVx%GZ% zUA62utb(G`+Q^4!BZApgxY}QP(PoJ;HNn?|8in27T^{vb4;E*&&H}{Swj82E zGiK>uD*h9cQAs1~DDqZ!2wIAmwb_OMuO4OO)n)4FGTd%x``RX0I&>JEi}Ukvh|k!; znO@Q3E|^Y2n>zmfluaV@iNpm)wR!Nt%2Ca}Pfk!?*JkgfTL~dzX2+_N$O~~dPOhU{ z&g@+@P9zL_tHjFO^r<0-#=spST?l#eo(C`-D1HQSn-5BM$*jofK~TEJU6Q z1r|Neg~xMo@;v5Yk)y>6iynOqI!bzeoh)Xa3z+NIrJwm{fABN*Ge7kC{C@w}SKqV$ z;s5#S{{P?oMf*GNy)3LB|16w%`!k;zaztEyCDiIYzPf|1y1A$knD2s;#c^u4U>(1Q z@Ml^jKu<;@Tj|wIm`6-xH&~N~g=Bv$oPclP?;yM_vKmkD=gq|l%7y|mU)VXDAQ&$> z1V@!#T%VL&M43)LQm&tLBJlKq6we2+Tl1oW9+;Jpoj!N&4sDOC1&4msQiDUhI?z^K zXnQaJ{|Svkio4cE($cd(QZ!aW&l`}y2R6}la>pEnbI@Qu0^KhJyS3_)tT`<6UvLwU zvN*A;ai-0}hbOn?L`bpJ7E>J}j3RTz(2=73njNH|8lAynsgIXktfr3fa9R&xJZi#k8IG%Yf zR``1?6m%r?JZj0$ku!h%ERKy{D;%`w(85PMC$EixUMr;dT3+i0X`%D1o%s!)`I!CL zpZEd$+28hq>+ihzPyR=nAN$Nc_`tqS-IqlXrDeL8?y`iR;a_(A!rZxF>_}j&O&8sb zVtbz0g_#lP08^0a)i}gGSKK9PQZguUO1P;@nz2m+gJAye?~|pE!Wo=`+>(tGH@CuD%v1Zs@;;_%IA!)KgF+C7s?y**H8#_Dax*E zI-swMtxsZlcE>o`oJD1sFAmWbHQ}@@u{}5;nv{Kgvxe6-W;{5*niPgx) zlVB1bzz+7%utglUPaq09_RSIO-V=0K>k|Emo|-BzClj=MR}-M4qa5jhul>Np?Knl7 zmA`>&W6*L@43r-SG&i&A`j3{FcGK)C>}eoDGw^|MQ5cx@-;fBIc|I61T-}9*S;j^{ zT>Stk)JW=!N}jz=utOX;2FTg!l)&{v!Pxp>#wA?BD1p>;z_u(?es5Up_;9Vcu_k4YiZrL?tx2o3 z%V(c2E!_b%W}-#iQTb#61Kg!cIOZyj4*^&SA-6+!L<(FBPt`utZJBR$PI22%=Y(R5 zMdk@SeVfw0fB&1SF!`>R-~3m8^t5Ut;m^`B(sOa7MN&jDRkZW+ns(*6Bcng_`R8f3$K+tN z$0e5Yes&Bpof?}uEuRy@Q}TEY043S|vZx4xNi+gJ^D{`}=6!}DT!55^mo4?W$L}~; zbSt|*0fZ+W5(+a<=mGfreFr_9H68 z>coe(ZOitM6V=(J0~|D3nF0=UTnu|1Gu=j5rm?r8F066(2_b*9>hi8mV&Kph4zouY zNe1*zf$_FkO#nVp9TirNhm~@4Jhh-W{uyLXP-9?QT-)bkP@fWN4KS^SfAaL*J2t?} zRdKX+623u_>Nt@kLK~+bwmgF;npw8PwLqP-Ixr&sN)&rU+V?^&hlf9Wr~@m*^h%V@ zVW|MumhE?yNc51am#C65iK0JX|uR^?viN1@|uYCSwli`?Q;R51<&(1=rx_n zYsJEAW2aW&nuo&XT{;(iZ{Kn_k`Yt7195$NBlOJ^cDTBr=sZw3NEXeRkELhu>GTr1 zZ&piXdJWK%N0c*=5g!|=&@wO+OTq@>(OH8LMT6#xjvE&XbGc7TFX1vmkJKq(iCo=K z8C66jic>5slVfz3_GpT0(Ev1W0v>EhV1Po}2#;#`nlY9}p_x)$;$rX^CD zk@Os&GzfOc@}SshT9h#Anzf1WazMzH)dau4q?*#*;=ObPZB_tY&(vluq#~Lc( zPXM}d`qg9+DJwOA^lq=wZ8YH)81S&K%>n{p=GLt45#2zUud^TKTI2woQ~d?` zAeR`B&YHGc!~-HNj=+Wy^So!=c{)R3c{?60hOUA*d``3-x|I!iN+4yRJsRM&9E2u` zcmMDrNUj3rT40Wr?av7{|F&pvZP9hj?s%~&wi|DO5zzJ1@zP5q~S>-XB9{H)^6nFjo0pF-yDQBIdsen9D6TC4ri}4jw2cU4&L?&>bS+%=1FjLU_4k zD1_yED`dSu^bpudhRVPwYC@;M4VK}Z3ra~Mt-2%C!g z(-5a3(FO?+MaNh>At47+@5+aP7Lbgsj(Z0CPS131&xi~jEV)Mp9H=*|q9hR!9AVGu z&~_ZmSVV=@p8Pa025)GKa<;Hh!~X0^C^gWEzcwfaH8mMO_~h6Kof=eoD}@vI>V&facD6j`J8ynf z>s$}$HrX2`sI93ijZ7cDLuarzwvD>KD(O2QWHH%pg#x@oBZIcX*5H)T%$dN+1lK&& zlQB?F6g4Xhj2bxFH{rL8DXq~=JFVOaE&=rQ-#XxOvk=%LiswS;2`z9ZY@?hXj|4an zywvtpOLwx%5QuQ~8pdDS3hOWt^P?g1@ zJ!zA?1PLqzX>(`SiXAUcy5`JN$9>S{1*|)BM8wMaveH@q;63};eBb`qkAA`a^pAhZ z{^*Z>kG<*b)p3T7V|4R>)|EUL8PDJAwNZ+8L-c#9{zEtZXV%H{2P|+oEG3{TUIJ^1V8_P_IT>WD_2rD$E0G0`C_G?Uke1OtQ>Y{uVJV z#t%H2GxbSjuXWITdwV>*ogzrp5V>jPusJCFHVxLq0i;zo@@7nD4;->+T5xb;Dm2qu ziAlMcO(aprtQ2f^3>W{WZHQ;41+xQ*gVVr-s>)u5o>}3X4o^2Z|%7SwuGV79SzkPooy4*JxvH)=?C~DZnFV_1&c6rtX6C zP$?`LX`iIY@>Jx&j-MMcM~wkF2^V27X0ZouVi$f3Ql*L5jpLM410$@kkUj~B+ZFG` zgK^y2o&xwIh4rMsc)e~EL<`sxr2|2WIwXIm%YxOo;JE|$J-6Ejg06JaG_n+g{nE># z%msG41Plxpz^^dk@Gc`aB*AWbw6D*TA#H})G*6uh!}I13xgrPiEodu`y@;MsW%+E? zwK0tAZV8CO!)}pX4<^i#ikaFU6gUwz3L>7r#AIc0zrH`C2dHPFD~JFqE|3iyD0Nkx zuj!>YnQz~--~L^1?9cw5AGCk#C%)gl`{T#AY~-(vV_xfY=%|Knp6BA>xhtXFlk00< z6TYe__g$TuqL=np^)atGh@M9@@A?|;(x~nES&*w;pyz^xe^155&$^ZCd(# z#WtW|nU%0S5^4y6D2lzo7zStuJG%@RuN4!gM6B%0YJqU)_#fBx0JDVvwbj*a)QIdq zXZMG!laLqyx@jn;?$qIpO<5yGOk(sZEwkt*={mVSJi|@rYXSH%E89Q0r@OVAfC*i`-l`O zu`2Hny}(0CCDiP1!BinorfcR_R&q6yBkK3gbl_H^tYP(`rJ~;oBKLOe#pc?;87P$^ zvvk*3Qg6+wqCC7J&sWg|3)ej=XJX1oU`V@-El?5&m*uPxDc>M?EvT9L;BW4k9<3)B z&dt5moRZuYI#SGpl`uI!WQPi~N4QW1Q1MB{q?n3b0&D^l2sczYhnK>9CG(zJms5*V z@v#G$KX-IbY!aF#jD$dY*b1IRnAge+)x4|qoAdamFEecqJ zDZaZlxa^q4wyrKAH%^EKB)DbL?n}Y)-Z$;zF9pgU|H}8+U--!%wcq!}&pd3h&zch5 zjGwzI+Bs3z%(I|Y3j{3;$WBp>%5%5oT~M~yTr}FXd97>l+Q{hnb-$~ydG4CLCaBfI z=lQ+p&r)}hzRn3}h_%u`jahVBjtsb&k4zC4Vd^X=4aMTxDxblTWR0}R)R{RH^h!5( zaf9LDrdWk$HBLH_rIWvpnJ(8cb_^M)8eYMJ%OHSGiqdHLdeQ;I^@FEn7K-MXV@4U) zDkQF)s}|`>u^b~=I%@_;+gL}{bVBV4ul?0Y@3N*+%s+5gnzA9@+^gFJ?aNC1Z51rp z@;NO72j6w_O03rJmLN(1L8Dx&8n(zWP9WbZ;Cji!kVFE^5J5IUZqQCr4|qe=Lqv)E z8EU&e#}OGbu)A|Dv(2vSdVwUV>)UDM1OrBP;Jd)%jL$09ZH^ROP#)9^MTKIX4CPHQ z-+tDX++u8r!rK8i-A88hV|(M{2X?AR2{+tZK)0qBX>qF6lN&0mz&jWTi2__GoG9eV zTcA$E&t2(TJQhjI$`%qyj=6J3`&Oex8-3w{MVHw*wA4us4jCQ+pVmo+0%(DEM3N3{ z&PcY=nwr-} zRnOz1=W)~X-+31D>ig06{hIb={nx#=E>NHl0{DRux3j{=l}AI$HVS2eNMk=sYd=RP=_Auo>5?zWS3PfgHU-P}r9M)>6OH zrL~qhL6e*ut5XB?1eLsvd#o2mdyleqr9V?lT>8KHIe9RZk=bxjM{r&+rU*9@{Fw4Vu&3XrP4lc z?%Dx){yX2!vGcAG*1N!R&*K~IbiAuW@|t+}ndhR#(Q|S2;6PkO72JW>{n7zmoZEW2 z1MONqE4(%by22Ek(g9=0!lG`0sj_tR+*4oT2s-o>-uK+NV|5-c=FW)&0%!gVRV8m^ z4$@sQu4C%Dj1eX~wQ&BVt{~C;*uaQAZ}q%4aHsggLqhbH{;zE$!^Etfho)1wCoZFr z&NarFTr3E8AldH_>JH?=4XbcH2NW(DT(AgEVC|=b9C0ME4i&9|~`FuGr+44!j;-VD#o@i^8kYCU*J&V*;L zu@np2bXG|yYKnqk)7}oqNSz+zYI>{B>Jnx1-zUa@EPC(Ams6M<_s#``V)EuId?yzH^8ufHSsTdyShOM5SJKwlJdKEB}Gk@*u%AJ6@HG(Q#rqz_20K z-i?C5;;5wWKZ}Ese$)38|sP8r1 zMvmfM(VTGOejf4g`#g7eo(qZBv?R}?sn=}9ujyD`8&f@xjh_GgHHVOPNA&tWcVC{r zUK#~Edy4k;Ua`Z6SF1V_GvGO%3FN;t@KLgu$H;@-x`xPxH@@5A?hMYf)WNvG7bBTM zg*(vc$bfX%r!{|~q(Zjf8I(71xAYu(1 zN{6Ods}!Mel)j6yHGa7|BPaATB5Ed}ad@P?+u30)F-JimvA;Bm`Ue4+mSdoGjRwL9 z#R-{#sk1mcE`>3Rhr^}2j`fVf5~jeLxMgXT=Sh*yvWaN-2JAzpLl%YH#DV!b^ygY> z)d{oO(w|(kzs?Jly3;C3-=;EqvL2b_m9-0td`7bnmF98D;?4BOjO-kn;^873{h zv;j|PDc|I#*G>otp9H-f`hYYmp)Z&vE+Q@hl!}dk#TO#7&dtdxC6*(cd_9ZQ3EQTe zQY*DRlBDZ^H&vo5?1NX~`N4Y@?|;+&zz=-V{-dAyiv8g)e_?Hwq$2Cas0G3E=Kj2i zKhss;Rir#`)X&AoGe6{cEc9AOe`# zun>C}U*)+=q@AM@w;Gbmk!EXkn&rl2Rvo*=ziE+tCr68aVi#+3W(VQAH}5Zn?8n~! zn!WwRXDmMUi9EEhuRPO|8jGE?EYG7rb0_cBsO0arvkDLAxJLDAgrTKX*3!9gtvQ|J zZDnYnyATlLs(WToyF&55Rk!7h*ZLO+KPy|K?VDGuN0*N7GcM}kbG1ksb%TAjV?*CL zS}h$w-H7xzT+3Q_dycbfd>3@%V2mA6*5)P_<$;I*9uRvkk#*xU6Sa>7wS$u1#gPb$ z!>QaYbS`dc9mo4Uupgvl8bVhV!JP#pg#2W&(8+TgkFSmLir$H`@Eln+jB;Y6P3z@# zwu)%*>JScbg1J?8Qm62_wIchXUik-RF4b*TQ)t+*lw`Gvh}|@3BlQCIeiFE%Hp~gbm>|!25ojD(r->M(PdG+ z(?o+-;JT?DP&lN6h1aa^1||q+%WK4gjkVL>213!W%Az?aIE`DK>^gFBqQ*W_@7f#)@O#|; z+kf-N?Z5lezhf0C@9K^`k5BTXhi=33=Bb$a=S-V-Ie(tJAkVO~cWGOmixK@A3IJU| zqQ6m}wJYj2de)n;V0a$=Xouywlk@yNUMr-Y(fwNVJ@Z=L#bbGfS63lhEzP@4q%g_F#{ly>qlzrl>|Io%azrHsgy#J#Yb@m)1 z4_7?2b&iQwMpmRdk;&udLNj=}1ld_x#9FeDU~T1^cfzi7%GfxA1BnrE(c)QkYuGIv zvoc;N8Z`k)c2c*!3Wv-vnsDym`R8?hD5|;0Sy}x%$1TZm!CLPo;%EMhz3;GdnrYG| zqhc>wudZ`zT|VKwT(K?G9Z_V93@_US4G*F0s4yac@0S@psiB11>x5Z@T^8yxr*y3u zaO#)_kdwnh9qrppwLYVuZ4FvJnk6{ia^t89U1c2NSK%VzuB5q>J#$(KbB`m(-Q+d~&y6p10)sS{$hv(PqMMUIO95NHpXKg3Yq zv6&95NOYGp%?)BIA*x$F*r&m1A@jiAN^3JEmyKhF-)r5MXPr(1BVrS&Bg5_%-@*bpUC(yw%3-=Tt(zt%vonXB7t4+w@Z~Re z?GJqFjs4|6^rQB-{@tIlfB(09+TMKiADDgc&Ass>OcX~#*0@Wz>|Fd_&8`iW}QQhlGW&_V4~Z-HzOX#Wd{zL)VNKn z_1#fa9af$0A?%a}t2XiabCylHi~jP!by=VF)jjv(It>}G@VZ0-_x5!-=!!&?3=gPz zpo5)xe~-NePmx@7oC?=Ddd?az344o1kS6Qb5uy=fOaaIGEYLAh9dP504@so*p%g0j z5r7C4!kwU`nN&lZEO;81SHcz=p*`82Z#XS;laFdsl?0l0VUQ%D44+WbXQFWwHMM2i zFOmwle%57E%~mFK3Nf=zA$W({6>4c_JZ3XQNY?-l^ffPD`WW7YW~uZh-u{lZp(CQ5 z!BsrD(5-W{Qge4y{H9eplcVvv4}#us3Y$$RoYbeF)qQY|%LOhIe@g>&W8j_@)M({u zbh%Ew;8Iz<4Y7ApwCu&0=;GB6T$8P9*_*=-%R*6Vwct5UO!WPiT0PR9JW<3Pc(}HZ zZ>$sWj~?&YfAPn@Z2!}r`JMJJ{>JZqC+FiidH6L_tOD4ck@nBLkk@FguXQG#J2uad zIK|#ScOPEM>(Sr;cHNoRimBJS8ti(!7AW`{=!|wDKyiDQBD(`2%(dFO<(-f&HmGW`8V7D_UC`f{`8kWVg0Lr-~7F= z=b?ZDf4T@N@{`&_#_P4q->Eo(oA zm3{^pI&}ba`0M*S(%OIB7AmajPgHtL2rjE_J@Bg)D;~TXUz9{i-_g3Pu>wvnnGRgy zD(=|K!5|l4bqLPLaYu6nChb!AMleoLl;(L;hS>Bvs_hh~;FH5!1f;cfmk$ z?oC>kO+>D(w@PtUOP?t9>8T&9+aid2FM%&}Yn0GPC>+N?Z23m2+mYPK%~m1-4(TFM z{KsPSfhL=UzNvr0N z4jV7yEwu@_#xEPl=id88`%6Fl1NPVdo!?`B;w#^q-MQ!V-*>^-R7>&NCi^Ze%DXmR z9m%{Vo_$xg4!=&JZm-c>U$ZDH1nxP|kbh5$FdbJti&@|03et#xXIr%vIL}?0XPdIV zj%TW_zVBg{OpWETfcQGa@HjDbbX}NW%jEF@AdZ@W&hCe7)*M;#gsSAB(=Jg zh4*mE`pPX7g8{27DkDc!JFt`oCzDPW_8iPuNCb9S)APU;y9>0s6K54S14ZLWEuv(f zS~YZOEo$_9^8I|{AjzM-><%!)C5x#B z3_mH06tK}Ehw3~eKjwhid+T*(HhY40LEsMA{^N|5kR`Ta*L4yYPnSi;Y1NZ<^seA% z7AdK3ksv}+ck@5FsiWQFIJMnTBs4rwjt&oz`k5AtRyGTT8xi#a^X2x3tUiE&=YlKz8pc(B8#(c@6*n+KA{iq42|NHfC1EL+hVBAlHHhh07p? z824_MK+((-o8*b?jjj2kTkrY4_{w*E-2Tgd?Z@rE`IA3xKk=!%wGY1b^1Pij`?qqd zWs0p`ys3CNq}U4bvjmu}@K3YqV4`h1W?89uxXF=gh5kUdR*p@N8fWlpn~+g`GGUw@ zUv@&}peoQdiizvc>ab^{V?&EI);?*D@7EyVk)&ZSv_X`E$D2r9nj#Wv?VrK184MI& znwZ8UXL`w_OcA$MPNR4NiIS&sP>+d!A6C%MG0TZW>-q>95(L{%3NH%j%!h0hnCL?P z-YzbD7FJnoJbgZ77e=IjcYtJ`N%K*M;wfLl+_=PM!Gb;AlTggjXLX7`LZhGEE{zPO zi+n&lD}F|p-*FnR6Ep&xU>z>hd1QL&L|27&sEdq8>nq#-SEaegfjR%h2_aGIV4Yuy-4R(|fVyrxfi9#=iPkzOk-UW38CrssLB1N53rTSrJ*9I|M7PELOQ z%%~50)9N|qIF`w{PTH~PoiegMDqkn>{b>MV?XK&lOUDB@=-HXYZqYygL!Yz1`fvYk z`^!J`Mf>yzzhv>=*VkgRx(0Ncq3upFY4J5+`Ms{g+)%Uz#?<{30q~S8q47xgo(YOW z!Y?{VohNE^N$DukQ4C`#jAJ3NQ1Z6N_&d)}t;GBt{1Ka#QAWb}ficZ2bQY_w}+hLIEm7himtzqB7 zRJw2$Vry?+PS;5e4+^IP*Esh#no!vN2G*Yk+KGdAxh=Makz@Tl4C8gHE0YEHfWVh9 zI$qa^`ip_t)!_3vBKKUn#oRaECiznXtLN`1<8#n_-V+hKP%}6l@EVEtAoF5+trEbHv zl0W1$EF1h_;w~!gt75*%4b~8vHLb|H34o%Nxwq=P2$1P;+LNOMR_Ji>G}mdL9FYNv z4GM1(8N(|-V+@IlmlRs99qNH5S7m>OcZmkDAk|TH0xoY7AMCm&Cq@Oq)^N?d*Ml}U zNoS0DJ+sU~`?bCQ4g2Ibf5HCJ%SQ26e)f0U@Bh+gzeOynr}=m3K3*#TUgLf|b3$Gt zuj*$18eaZ2u8EFOo;SvK6;k?ol}qy4>w1k*^4tk}jRT{v>9wq%Z#NQpO}zX3xm=sQ z+LWI=T+dxBK0g`u2eK;Z$cNWx+LLsQ{2cB9tssgisKtTeL|QlR=XYf@>1TF*@4xty zU$VdP=YEgO+8%dwPe)FoXGlWL=P+ACXTkoCGj9W!E1DOB1?gJY{ZqZP?=Hh|JFFZ;Yhrt zUZ_zh4D7|R_LG)tsSh5kS`y-Cij?Kx_>t(SgaFMrx1564_3AzZp*dFF1?DoOW%>W3 z?%iXq%g*|+XRW=@_s!k**kgNUY>z#@G1y~l>@hf)f=Rg*8ygIcfCdyhby7%Z(n^&Q znpW^fq?R^qqm(LDrK(9plctp@kX9`;|0JoaR4pZdN=S%FAyE=vn9Dcc*=L`%p7pyEGWH>C1lbsA*02Ti^55AiNEBiK>)u7O(Ieli`GKRRWUF+pS(u>c@ zcRz8j{PJhsFMslx$Cb0UnIB#xYlj7^;jmv9rM&K;FVV&xIcWUJ+#?Ehfbs={7QvvM zn46~k{wO@oXP$T(C(3n+5T~fGDC+s~!%md95@~)c`sDLg?9i4qc&w_h^q{ft2`9m7 zK1ZnIfHpz+XQ?L(v%W^^JFp>Gl+2?^p0;}Qf$Q?uKK?HG*^j?No;X}czH{SpO)G6} zN{!;F<3NXNw;;Quxq)Wf-y6kjs!KE%C5>nZ#>}T=`ihDv-b0=dUr#}9)kPVBn+ZIM zCV;bDo(IM{(1eU8Wv)L&b}lSUA=IiRjVLgrpw=8rbQ;xh_+h!N9z+X6{Y7=DnbJFOD0;dj<_Up_X|C5f<5~_^QpFy)vd0Y4iVMH_CuTk`cIeb$m5y{-l0+DyS=-OVv&uQ}747>ybzghNlBk1KB$vnfVCN zm58Nk5UWkm7$cGa#ZiEpjE(TnN*7UZC8LE^+cdE_ER|XfISHjBJw~J>;R97wi9RB> z+v}&ujFsao0R#Viz{yHCGkhoxDXD{r_Hx4G6fho)n3kF)LcrP3X*~`)_qJ^9Pa1)3 z#k3(OWJ$Dalx+duzTx%_dHDE({FQHei~RNPdY8QMp?mHUh}zB=uf6aBTDz(5IcB1a zlSmihk&Z~P>jxmedHc;e+VG=n7XLc-kdjEm8@X=0t=VqW)~+1UB0e-PLW%5fM4D?a z<(HHZ;rm&buT!;`heCDRK1?h8NZT~}CsSBBqjO;*Uq9VFghqWvHiL%${vB_9wfyoQ zdPaWq-LIDE`7bp)b49USh3ki{;W-gKt_tCIeMCVRmq8Eds^j5|DW%YAG_fQRpfUvb z7o-?2AM9FAD#oSygu#<7N!BD{XNq|lItdZ}jL#%B5gCYVH&B>J|H`@yXe!uBjDscV z6>b+3kzyiZW-#gwoutNv0^K4vfQk7^)c;i(dL34AWOR_hy>qAoVZQ+V#U3&afy}dM z0h+j08VDz+0h|-p!a8zL+Wv9*00$Wcl$8##IuLbR-LlCXR+L4x>=i_N6k3h*pe(q~ zr#jYFW{MpsKS00HLLH!t0gu;;Mv6*0(p0fr5$dOJfU8>hWJCxP_Dih(u6iL0ta@2( z%FHhj^@S&#tf}VC5W;5I+Uzj1LZ?DE&NQVH;p%o8X;IPWP!J3r^tNvcLkqEimVy>J z4jHTEtSc>Q-9Ef<3S~(kgikZ3Ti$TRSekoEV;^#un7JV6h+PX6HpL9ss+jJf$#(YO z`BwAcD44v}sZe>^>chwZ`j*1*G^3tpqoyKdrHgA@&Pz2L1g}RLL0OXtom09goy;er zt~|3O3?+z0_tUaD3KnjZOZHQBAAAL_jduE7IwYRUm%=_hgpL!&u zUhHNP=^T7Po)0qfx{WA=EYf0lJ&2E#_d|{yrfimrA3&nbzwX!vy`Ck?Vey$RQPh1T zY_*SPlX$&$#t&B(;qrr&bu`)MO$~@2xQh0buzn&bs!&a!q&DChw@79)yE#auGVJY= zjNWUN6W2r3zvSNw`}_MY*Q1~O$dmH9fAxLxz6USA?&b?Jm7`L#98j8Wq>1LMYAZYRS?)v>GaFUrP2^MI5`@H49Z2X@0Jh?G`0(qPtjab(;O_M4hPW@YYsy= z6~zSga6FAbF7kWTHtcGqN^J44)(jC>Vl)vRK>eFj>S5)VFG zN^w$p?V5~my=+{k8E!|mCa+>Lamv`+CQwsBw0>5JzV3vP6LVygBI0X`PEcEm5>#N({@Zs$c6_IiCJXW6&sSo_d%iAsz_6% ziwN)cVM=#d1ZgEFQkIbZxZwA_bkH*xO8O?lwJ5c(44YU;nr~c;|VMJ1_PV`-Y%G;CHb7E!4}D zqArpx*|r5mZYTc=d#Q2r2pk-=`U)vmq^B|M=rCn-P#g+Ot~*>4Gg5mO)hZ;_mQ2uz zjBKf@s7@NyGh?79LXPJ)Sz1zzcvA+YWfO;KZ`PDtqkn9A7%@V7n`;ErW;SSYHix`6 zoUTQ6LN$-PCc9R1SLHf9oBWj3Q4cdi|I+9}VtCv%k7B@r==%(N5j7$9b3B`UhIwNu zluoQZNeG`CE-=wdo;>yqlXJf8JCmxIh*`EOuQKlkswx zbS}YA#1z`3oc3bHuPe18gKCmIOlK^8Y$va^s-|bN8!i~6+OUI0PCb$2p%7n8_c&>C z_2_HUECsc&Btj%TY0P(0r_%Ob&3F$hVyfll^YZntp5&K4{fvD2J+Hru+VQ9Qm$C&% zZWS+N-7ECtCPYMm14NXa5^eC_X%p#bEW+Ri44*k-hYE|D&_NUFNG!_3KU)gJUzfUb zvWgm@ZMyDW(r?r$w0GU^3gm-8lOpp{#;G*pAfxv;6Kr`3$NEDJ18JU0ori6TuX0wK z6gjJWYB1lIYx5+3{QYl`U-`oyl<$7xJ~`ZaR;Kk1*3R0R%h?3K9J>H_VUS%O)N5-a zZuK9vQ7rb(W>!c-MiCJwZh})D{WtS8HscxV^C1sCS;1nJjK!FZ=cIXhH6}KvNX9Tiz*^sK3wYx}0N#T@C7L^giYCg`0j;C%Wi)dT&M#*GD zRZYfinBfu?bG^2IKH_?ks#?oX?vgq=Lcq+!IGe8f+K-<#XGJtD2nA1==2$JJ27%hn zO}>!u+Lt0K%V6RMJAB$eiT8EprXmcT>#~gIb~C6I-JJ{ci&saZf>Mo=M%rJIkv||v z)5~VUY$Bv-IBHh#z(h#6h@2ufRj2hCNvfI9Eb>0O=(RxoEh8#+yD>PaSMb+x3LPk} zVyiG?lVw=4R1gK-MZt%QC4~nKPLrmTt|KqLPtj29SEEXwvzep}9-Z=VP*n#lPnnCj z>Ee*lyTjfhLZ?Nepc&FO7O&pKi88e9S~BS zWj)dytBKMtCfIJ2r!li-I|*bX-l|w!DtL1IoaK&8&wo+=^!p!?U${J#KJkj{yTy8* zve_F{JnG?pZ~tfMh)8SU(HTGR{9dB@?SN(N$bK{Txh_#5pdSJv@n4s)4Q-ik-SwKRPIN#t^o)88B6Fy*ffuIAcv@ zjK8v2X|%?39nU@~8N5@$wdEQ+<*r9mDj$-Eqm1TjQZ~Xo78%(x>_c1deM=egiUJC8 z;;?}NLmv7oDoPJBN~E0BNi z1Z=_-ckm7u3cx@ytTL?RD;+b{<^q5poYE+NA`D81u#N_1F>qiqVyHF+=V8HK?FYP2 z42-luIqk4nh&F*EoY;v{N0MyCn9s-D783>&B?GyUUg2qOmeGVv<#%O))SNW3o6Vhd z9Tq!Q0Zg+Ul)5^f&7Ly@k=CjM*lcbho-!75r&jZxw7|GJgj}i@0@ORzG02G3rRa%s z%ZXUqhxx#mgRRxMSsP0mRMYJj<+bHS`T0-1TYmgsddsj$n+?`ym-tO0N{Y3jP%n~< zHgu0dL`a4oQ2Zd_DUQfdvlq;^rw{Q1K@?$cH8^(2iJo&rvqXbL)FtHgE_(x`eT+!I z<0&}rdSbMD&SSCDp*FEUXNUutMqE9G1q4QQUnYa48nloFgAoC%ro-uJ@Z<*|Ms&@Y@0y2(jCMwub%QufjIOwbXa1&=_1`a8k>!iX*Ng+=`Za> z!y0)2l8}wFQm`4XCVD|dwCp%agW9EqIxFRzR0~H$xS`f_)>JtTEE|G5%c=gZKp$xj z^@YM}6v3XnuXSXM@cm;+VJkXa#@g3~|0s?vqs5xn@MzYojCNzOqFx|xl_m_VZDbiF zGd0$%?<*6)`}I4*RB>SD)Fz&$h!}fCAB-}FryhDoi*zql9EGg|`R~*q50!^B99*qz zH)loR7d)Sa$WYizDZU5qIraXiylesb2&Z$-0+Z%8!>eFwbPSlgYWiuIbe$r@Y z&<{}7Z?9`rPI3s@5^d4s`fyT72zMgCNcv>^z#iZXnlwwH4-iM3WY#)Pg@RU4mSt6& zb2GCZ9%Y2t|7q|LER*zUj1CF&)TWZA%b0Y^4pBs@7Pq{>5(ccRiwTHq)!dgFYM87=p z69v&FbFVIip^{1M%1K5EscCu`ZnZQzz>X{L>8d51jrPUhz2LLs?~w>S*>f!UHf{SD z*Dn{AAN$Y~^2?uoMn3xZJ+j<*PV#cQe-k%o@g&M$Vyx!RaywUbOn}4U+bkNZdW@cM?fy351kY(mVEzoc* z6sJ~mm^1@|4p2ZCR)hGn?tt#hZPPtsKUhJ5+mgez4$3;2R(iH6AM)rcV}KV}Hk!xeUrj(=ia8`VWKYcNy-N0Eg?$YSr!l-3c^BN&v~86lTJNoPv?*)o(Sq=z zCQx1bCY51zp5f!qWr!aZ-ta&>s%a+`xOUoowDv{ez#=Lw0~^QunNwq_Cn70+peg#C z1jS*kLOW@e$*lB7)qbE(hZTHahT@%zX_j=tV=CXtQ$!j$4z#fG^{#LNWWceR`VS0x zncA5=+GGjWDnGhbt(WJCa#1QLH3t*LZ|ve>0Nf0fd}eQY}R6z!8tS}&wL`!D2Ay!X}e3qSBadG!86xFLJj%$}Gr3R<(`Qi@F@M~oMD z+P}9OPedU_wq-vMM8e%jn-L8N{%fti#8WGL9X5AmPlpm^pZHU1WCu+RgQWFSa8#UvG{Xrkf$xxK1XKHDHb7i z{@TC!q3iN9pM1Cc%*Wm?Z#-PcdgBHhNSjuxplyA;*9WO14}&oZCTD}2GuJAsGuWur zDS^s{W2&l1dDMTX=YZ89>kw*|I@UBcp=)@heqUc3mMZGPVPdVKzLTMPczTn8Y~(uh zFRFzjVl$0mS1GLBs2X0mtzXxSQ?bz?>llQt@HsASLE zl>G+pExqB+xFUh>}{`>|NDpD zFMsL-kI22ZzAW>_Ev*CC$`11u97ps6hlw`ybG@Q{c5@Ta9SADD>GDi5Eb~SRzLp|Y z0kWVPjx@x#L~oTQk$NH*nt{#`ouCcZx~vk?R3sCY4A;8ImN z*seERlF2qxQ&!MYW6i!=M$32mOaeOF5cD=kFF^e@1$g8LEzD}c9;#;AX&kuqMG>8m zs@fWA53dfQV!YtI5e{^a&|YTr3WWK!ff9V%ajho-WeP3kewyc9u)&^msVt-%80lU{ zm`x(A2)}co!VAd4vQ`x{v8k6M&Wj$Vkmhemh} zh($WQ*2AaZM)XxQJb9#MPe0>-t{(#Jb=e!%d_;d_1wYZoAWFar9J$#Nfvo26z((Ol z*$K9Y?gDM^&ubYx~~=*Jt_huX{rN&&z@3TOPYE z)6HjPUTy>OC$)n_-pdczLAa)N3X4|ZiuBV2L}eDPb<~#>eT^OAtb^jmA&djZWHhNO zHa_a(D)O~*8c_|aDN37hI1~218SMj+*KAN30Rpxr<8EZU0#Gs@2xlB7>6EM*g}}Wx zjeJx{G^j zweb#Vw8$gb*0xx;lHl4Krl~{ZK(m^H!x?e}ZErTOQ>hzcD$x5o+o*3rf-h+Q=Cp5wUQyiQ|eud!vK4jjjeQ_pQs9}fIwU4Vfe=O{N zVB&q@t;!w+iiWVr#vW;&-udvo@^hbjT7LFB-zo3Bcaieq3zv^`Y(m?HOycmcV(nu> z_LN0i-x=q=Mffi==$OLhcjNLH{5W)aX{5y-%Lq_AOe~ijUsEl$P)(7mm_k<|xW(j@ z6s!v;0hZ=_S&&*a9TsakzMoXhr0LxivH4?tE;7)cez;91C_$m&0cdlU(H1|1u%~Xu z3bz!~WK$WgNvWfKxKoXFp z!kba2ZTQKHjOlweADEN~x&u)-T+P6q$m1b0i- z^wxrDlcit_S`Qc8h^+tS&{Xh&X0mHB5yciZWcLOCo-j0TpqT+wX`Dh9+i*%fOzOyn zrr7sV6g*E+i}s{;`l?hEIs7Ad&_vf%vR2(LP@_=q2n1?wB4dcUWK`2rm^G4ZtDb6R zh=n%+;dec8zx>S~c(1$xG5EGz&oBPb=IOIjJYr&Pz5K-igqycTHKNnAr%R&8kMs#q zZi)T99h4%3#Fre}ud#hVd-*SZpo#j7Eb8N_nCP`ddYgy}vai#kOr8?)e~#?fCxhEM zayEE6ob-g=S7cpFa4%m}I1qu*k_MtaV9|Sgl-hBPuwv*4A&T0l?X~k-p2$tcd(pqw z-}>ak@^^pm{qpaB-DC3b@`9|lZ!`?04g3AcDoWksw`$*(d?5%ibT|0A!Wq-bB~{8 zP#}aiXsS@xsFnyOElOoILK_}{I2;hMn|a^ygggPEuA}cG)zeTqHIWL-Zj(MAidhSV ztT?Dvx~F=_OBcqLst(!~mk*YJj6feYs&Qo{4G^UsQsoJWwJx<$LW!D4BN@oFJ(p2` zLdviOYRWKrYZ(bx4MLlko~quSF6Od+ zeZsfW5r|~;Eh{Hp2;ho=epfn63Z}x00f_pEGRmMBW4}Gd<|)rOWvze{2^}&RXoJ=i zN?waj+l=EsAoE2O-sBWKv^9l`d#(ByH4SY{Lp{K`_xOKMrXK2sQ~R~2I7{u) zD@0+Xd*K@gE5mEQipe>F)`z(+vk~4M#n!z;P@4w|Gf(Nn`mK{W2D@2Cj!J@XtR-*O z9%q#9+>k%<-q*-q{rFSz&^?E{1_dtKj4R*MjYKC^tFf@dg>~Q9ldyHvM7bmpWn-n@Rig|#62r~&f*DinkCUN?SSnF1 zIqCaau&MTfK2h3VBdXZeoYQa)nLQ^bYn$n_t;1Y%HNOgj+#!tu+_e-{WM(7@^R*V3A~+w-iRgOLEEI->sxB1SU~Rvf z(g|8#p@$?w)b{fko}ZjfDkT2@uTe?1W&xY}gnPaWw+*`>xS6Ih#90Nf2b+$Ifx=cy z^#wW#+I1NqxAFr|EeuZjE2m~;32Zh#AAdZ-az^xGse|v-Lcw*MpeldQl*H0M#Iy0W zThK*wUUJgrO+FrBxk)X%{hKQUa7`3@>{Irlji7aeAi+XiOs@w!CMe*dh?s?s3~ig) zsgXM$TfqY-QyNGFm-G_Dn;PnpMhF%=RJt{KbR$VUX_eQ?aee?5O~Xpo7U^w)I9`rG z&wfFE^754UAAIC3y_gUiz26l5X3Gu0+ko#%FAaKZBFnO;9K8O-$M5^1Lo4$1I*sV( z>}fE3O#hzEHL~(Xg3U;C;x#6F7UR8ofW4B&$noSiXKwUS0&Ub#?Vq0=FzHm8nJ)x- zm`%8g(aRO&8I?2yl&Ov!m1LWRWu(#;Gt5WBofk24VDadaccuB)YzG^wy^83;*WQ0! z{`@z;P5!Sx^nUqQ9=k5})^n1Mw|hvObe)N!K{)(W8AYGh@_29C2FLgV=|&<(WdCYc{out9HbQ4|o)2+KT{5n9SNd*MBhMmQxc#ymvQ z60L(AbF->xD#l=Wg!ZU%kX)+{H3yNCDi?}ll>%MOepH7fqcCG=>68b%eTdxi;;lfw zE1P^$K)D|!&NYrD-Nm4zA=!ay5-7i5!U9+6@+A#kk<4rvvT}>TIWl%=U zC}2xzQ6F1H=+6jMQq*bALr@F<7X`GmiP083jsxgAS`G5VHch>3Rh9ZH2C@|`vq?^4 zscG*^_>eFkz&drfuv386tKS9L2N)bVv=wS?M%F;l#d=gKlsmWO`mJZ>FMa1z@}ti@ zepmZ$6gpRTF-g?zV3G=43ytMpUG)Pl#gqecgdY?CigN&73IyHS7S(T_-hOU@(R%P+PE})7zeVR^)~PS{OqFpJTeQ zm|11&TnaWJZEZF~ccKgfht>(2iv^Mm?X80gb75V8BAZEG#=N(eiTXkJO+}Xm;$Id1 zpCFp-f}%RA)PbZdh0dF9Np2@-P(ti}5h$EnK^CgY+ex1GV?bxM8k9zc!z3Yhh132t zjdMHYi6wn>#gHmnI~+&4 zC0U+OMrThlg+ek~ipejt&!i17a1u@6^qG>YQ#ihtkRuZ< zGfu4Sx$`k_=cSI9_Qfst+ImJhx5rp+%eC9j%YXY_?~+eF^~hZskG&1gZ)_fA*b8rq zdVj1I#cm=LiAEV9K0m{k3i{33YcV2$rKh;g4L^IYD-x`V$k`m1C`mWkG;Nt-w4wUe zX=`itHt)R-rgMRN{;_;cNikuNJTFa&@O3hk_hPhXY_lCF(CoEoY->;Hq*%|3fPGr8 zALJsWdE^G0hIZ>hE@8BDgLhloeZ zqA7a%95^@aePHyxDv@E6t;0phQ@O_WXVBglrV0+56mS-E*eiJ) z0<+1vqJWxqXWJ>%?kVgu31U=j)K2CBIFu}K<}hzc9i}L-oVv?3CkCH#IAh7-DTR}g zZTTJvyL}WIsLv6}s5Os6p_Lm>L~iqGzZ!p5!aiK8ZKFr+3U$$VKMS>6<}rA9R53M- zBy+1_=>0;~Ad6SS^}|V*f+-m{^omqMhR5)vQ_SgxvT07-1snEcpvY29wn`ef>x^8L zl*bJ}r>YIW!|ql!%3aZeG+^9GOh^yS#0Z-sin7SaC#dw^Gb9a3cgs3pV%_9%BW^U# zQmT4q3PqMrIZR_vFZMpY&Lw@d4 zPs>N&{_4=8>1h^wqK`Uh{GaWB;5S+Om{Eb8rJk&oCCb8xXbQW5csl8vz|{{e5f$SR zC4UWw;P@eBPh=c9g`zg(=(KN7`kwmoG!utE@4(t~0eOv&*A<=Qv6#>cE6zWFt}Ga` zGw20ItFNi*XZtWz z{h_B{C%^ic56FM?;m76S<%Xo&H~NCr^k79O+UP-SrCFIX>?WCLgLJ(~1~0~_{(1TAFFH4y#s2xMB2Q z5L@YV{*+CVHtvlC1ce%x2|5M#<{YeT+9E?m#KbDIGTl4;#Z*<^+?xvd8sgmx;j-;(af4(#rsKE#K(wBnrK-+hrk(^}IT@j^LSxDY zmKJAUYtIx>OD?(@I4Dq|%?W+h=Y@9T2~Q0O&8CBy@S!T1MUC6Sc=_F+bh2?QB?wt7 zyDO$4x@rg&(qJ>QON=;m!KY<1fj!$zH_u)F)9ivkFBX2VREyh1$Amo-v?q(PQj?oJ zOKk&Hx!$0~p@@GEqI(fy` zA9V5Js0}!--4VpzVxpmn-jEzA%}STh9aq|97mMhXwFLLEy!jawge90MI_>)TQc zg52MSRio^I3gFPVfD+Oz8Y1e11KjAf5j_M?c|^{uAp*n65zjf{IaB0MO=OxzbZe!X zhV92vRo|!7V;NN0TIx_H;EZ;dlGcK>d%O;+tCy2r~DS3QwJuM(|L2Bwjq%C9}8bdm-yyr;Z&S ztTw}Y{;GcS{t0_%MACz+PuDEPgLvQ)9Cg1L3EGeJGUWMbn}es zIkW~8#J2(Fq~RPII%aGDg`6~%bDT1{fv%~4#*({!o{I9e`8|i2cLaG+vq#(Z@^tp@ zPyXElhb({Q>z7Qpw14TV(z-3X*8TYeoon-=c zsm3idorZSOPF(Bg;Nc-sqcFKK*D+);`-P5RNpjMR&1{mYmg=OGOfqfm6CH;LyCXfs zpEu(F2ZcqNoZJe-H)}Tgnx&&;yq*<7ds8|U6R&l+Rk@~j(?T9C%esdF@dskALrfh7 zv`KiN9+Z9s6~??6X4uR?c(zpZjQW`hG>dT+E1oM2EgVSrxk&nXsv~pk$_y$Rpp&%s zAw#URP_zozluu$o7Z3Fj%@S5eaw-uKYF`*wLtB}ujcX4T%SMdaE-WozIw6igwzhdK zqeQTRf8)k`0X~s`#|Y(0(JiT{)YEinjU)WXK_X*;n87tM{B1?oP@7;gMhG)x3}+MI zP5fI0cgec(6X8@6RqrQ2QRAipPphIXXoK)UT`fh1#KaMWUzL*=Be>0`ZFN;@cU(`> zf9&QE3W|-E;@b*^c6FUd5@VDW=nloPWTq!y*|`t;i9=SN{}J|;dIO8jH`uibl{K1eRQ zb|)wtquFt)p<8DnS8r0sto=2^w#*dQY@9%gYF$`;!ODwMI?oG$qx)*l!Q^e~k=rVw zEYG1g5zYC?eb?ka{HC|bul?a?|W+CtdV4#@2j-QJSaa(ZEOc4Ldm5R{E zi*LV*vHmix7H*GGgxBFh`uQv1zg78QYykMs&EU<{65N7jl6J-jVwn@5$!ZGuNU0oE zTP-?`Ht)I>C88&X1DE>AO%4iqn^cEoj;8qSgE{9hxG|iledaNcaEM@^5N~8L4x|+x z^$O7{ZGNOtD6pN$QDR|cV>1&trH;yi1irYb`pij&1-?ayh<|N9p51C5_HtLEX#72w zl($Jo&(mL5Z^4d+H~%$vJy*CID8}T0g|spcNaX4_y7K}~w>E@;7G*A!;NT*N66a|% z%W$rFa$(PMhcx*wMJG)s}K`;D)-SAObS-yy&L*$>K(y!%yh{c>Q* z7dP8NUbcIo4J|8>>7*TI+ojyxfGzY3h;Bcyqf`|AG8D@$OJ9t*flfyMQ_ z0cb>fxE^lx1;@p7_mHwr6crEml)#3qZW>k3CT%&UJNAe@^oS^n?eC8(!r~@IY>ek| zEJHZX!K$r87!Zl_P#09w=&|B+snF{*G_mw@$NDl2DKD#-mNqb!0ajSZvUlvON zF_CaMW^%131%oT|MM|G;bD>9lJkF6rNg5)g)d-so7#@fQ5T)1<5ys{BzMNs{%250! zBm~k&zOcInU&mY+@{6?avD1Q{|7^HfI%5iQ3MP|`m^cUtE7rSHXody57SR&`X+W00 z%UVULF@bGw0w1Yqyk$6g5?W6uII)sJI#?X35&X&Utm}wa<_C6R%Az6;{Y4T&Z+x-I zV=49&aXiYs7thIG{lvTE8{YJalTFVGKRx{I!`Sv*KYkPUc@rKnIEM=C2_bz>i+Art z>8_Eb)^A$=XL)T-L~nT{#nWVdh$dn)zXEkJ|C?#oc05 zX`)!$`YI`D{lxYUhm)i)gi@A4k0yoAD{?$~fMaC{8GC;6s7LUKk=G?f1J~Ylj{2Ic zuzQaR^TTZP7=F;){`iO3a#ek zO|~AcsXGEl`5tHq$J*Y0KC)I)Wv^L9ri-a6NPX=WG}31v!n1U%Zm&=oMhF2NU7=m! zftSekcIrQp!h%qiKX2PZSjIPLdMg7dM{NlY$8Fu`I+&=r6t(?opH3a_8i95sVIW|> z3Iha>6tH4=W`S)nh%`6sc_dJP9_r%VIgidCr6@s>9f2ZF6AK^vy*#Vqv<|eZFcr98 z7lwgubkga5Ub@?J8Vp9xS19l;n>z0ac_}>6U(2En6b30#sk{kk=OiZyX)Qf3jhqeg zdPHZ4H!>!ld>?JI$y8Y@%m;WwEzyFyY{8~S7z}D=E=@%hlb1b}W!fw1Tl~@}EzeR#c{~Uc>ycNersKuV+CK8x> z_lG}$`!ri?BR(hUjVK2Dy8Y|fOAC(rfA;DIEIsF+Ut|Tg?Z_D?V`@_9@L|SM!QrCH zKuIc`D}0b^Q~z8Y@(>O#GMeC71n23l=(<{qyQgUEd$;FCi$uzM1J0g{%+iit8^!-U z_TY8-bHD#`VEODb@+aQ&DtYkMvm&=|$hO_KV9VNbSV);Ptq+E`?GY~;f?PE9H`6%+ z1epiS)&s_VA9nD_IB*s?UPvq3#BBw!)7Zd?CNq}dh~{AD}v|9j=QPS5o=0YO{4spM}qolv^onMO^oAc zgIFD1aJJ34l2S8BBM-xg2WLL7%vyo5?-I4Ymf87p1#?t#9VLX7cv0;FSqiNLcHnkn zOi7Cd*V++-oJZ+VV*id6uWetC^i^7=STHr2;zL4J1(snJTXFH>jl}Sr6{vZpV~4F`+OE>Hwe&H`ZwOS`;i|3mc-fi8AR3K4GGs@_21cNTt0&$Z;^? zcQ)NMYc>oZMNnJ1cq8V1twXoM3>Yp}px4*x* zDL?gX?~w0%*K6;BuOnAX)c+E>T>J)Y(`ombeP2pUYn?ymPV|0A@sHzQlOKru=5lUR z_8ZHdEqE`8F4DGmswjG1eglmJw7w+LhxF|Q%SCxIQKwI2oFXpP zg2kNCrjp3TVp&V+aBn+JRXfvFBrXsSco zL0V;kP&FydG2AVxxswsv#sIfkM;;fo9g;>;cS{>qH{x*ctUx{5b3jtt3NdO&G&&M8 z0r??(O{;XR!;COtp>JB5rJDS%q_m(wX3%n_mNKX(WSUeA2DAzDfR`{BtL}xWVpCzD zQUBP77wzs5Wi{AL&q0SG^VPW7Sn5K+VTFdL5*)yAcQkIT`ZA6xFAwzt-gnR{GL+N} zzN_QIUpgJpY_#n{qx)yATF{qSan0)L4UJ$@VKrQzIlUhgeUa8^JRw}}fB~mP-xo3A zWTLqW+YK;5Z_$bh*V2ZkBMZ5Ja8P4XO<`iyH;jU#s)29W3{U+3xvR6-0(_|4KIH1=^LRKSaE&pCA>xZY=qM8iY$`u6A)Pl27wf{8Za=&|=4JC;`RKgZL3 zduYjC7D-fIxZTv-y}oTkQyz$+y7>?+wxWozFr=~$!kv2-2VR7%9eJ(^$ z?7i#zjV$Wrk-SJa?uEpWOUw_TQC>?F7#P(Zyym`Z@?*d63He7q{I&8^A9NHE&wk);RrZAJK>JX50J?8tem~~wX zXmQ}0fZAjnpbIwOiK(=SR%HfIil)b+ZLCp9oV-+|JC6hLD#L<&m`5Cg6=~A~-O=f+ zx|mhQFrl)8*6oH`gVM#{Ge0Xb1i>o@D)dk-WdH&#W@4>Mdk#0za6XCMI}nM{-Eajl z9!RuBiBSO+)R+PoOC(>lK?T%Iw;Drt0>q$3JN6V%Q{kldJe#dz$7Hf-)H3)lj=ogCfgdcrq-%KcNC@(Wnq6-fySjJ2v4l9 z2aTh=Z&kjS17Jy`0hv(i0oKl>cI2eoX&XlJQ0a?Q1S?(s+{@G0A9(8n@)O_qmb>hm zQIC&z$wav$Q6|Tp_%(91c=t{uJhc>sA5uJ=AGJ4ov8qLT&Sk&YYh$m4e_T(k_|iVR z0qt%2dyxZPd>L)3c0=}qlC3g`v^RV_`x>JzoQMwFdrUp8qA)Kbura~uM%sWUX+r#! z4c<)WgbwrWrsBF6=v-@W(R2NK$Q$j9vOW$IY%iw(%z8^Y~l`S-&kZvK7rl$`y$ zdoI_+f9<`G$*+C(gYw^f=iBA?J$(5^H-5Kw3DsVD*gMLK(fJ_ktn>q4@A4@?K?V}A zt;`2*!kXxv`vDNwoI+=!--TK`)OH9Y0t}90*((chi30QBIGgg+WxadAW<|n^o}WpE zi9xCEJbIDTGy(Leg=$v1$Oc_g*h1Xw!J?gPdiaC=d96kYloKel)N2k()%AM|=UXU^ z0EMN+gV+p?CZZxk5Y7#msC%hHE>R$yZ6*}FUV+Xfr=)|7J@8)*donjy*uH2>T^DRv zCc}iz4^EmJqC#7-{=HiMlD^S1>?;la%ER5FoFV9u+3;!n5U*v#8W$iQ6DE9i6OGi{ zqyj3qpVhJ^rre4;ja0_zfv=;Z8$|P+tmyPR&UdUT_?qiq7~ppt-S+v%GFRX za!Th^6A`Yhu@KZwK!HkSenHY3a59ae+Oi5Be;d>;O1Ha>z9B^GZ~XOi+5=LtLCCEe z@(r)MCjaF}pVDq1e}eO(KYx;p+#`EP${q@_2Yc_8{#nT0yKk(!B6{4t)LE}>*+U1s zroe7=b|~;+Za!Idk7Dtsd2eTp5FD!sve%c-!J`^h$Q(JExFPzi7r(hiP8xsR?69;z zpwAqOne_EfpIKni4t@ziWCj7k>CTIn*Jni|d(pa# zm6ST|%oP8(^w~i3@{+IP9>&oU-mRok0^W`#UCX?| z+6CtVl%ay=B)f8QN5C8VYlK}tl|gYyJ@At$%9@x=YeZ71kj84|MX)xH6PQNe!;Z~~ zxtcDcYLXC}(+SxmoVZtw?ndcf9-(y0IuzqfF|6gZkAc^FEQo_sE++h^_n}k`)7vb~ z+iTe1O=hK#Z)K!)|Iig3R2#~2=cYV)Z;`+9@ux;}vO^4f%zNZ;@&9(Ns4nW&*>hQV zG$MKoOS43}7M~6pH5=Q3$ZuS~7t692^m>iMUYC#`e(YxFs|ccDCvqG`L1f;F90_pm z$~rN_-roBZS$iWpvmazK4z9_EP3B$HH22f_sCB~!0Q)&w+6VuLW|RO&&bp1LU+$-p=X(l}!D zi7UmlT#F2{L)kz**<<^<+^(ng#C7y1dwX;l;@lNt2kuv+{*sS5Y0BB(bA{Ug~_mZ6AHvp1svSODEd4W;E9#+3cJr6rRq*E03Rblrgv_lbOQ5TMZ4CfxK)3!8|9m(`6aqMk}Ux4sxlE ziu1|zJy3n0uqteiH<<}~g1BooR1~AjkE8-G?#Kh{P5JAee3v|O-yuA8Mw_1B*toHJ zwBV(}t|Ck3Uj7Oxh;tU>y>ddo2}G9C2vy*Q6b&DCBeOJ7bPXeIM|p09N?(0&PSm}JOxmHsQ;ShiroUGsL@PqPUVr~V{@t&8)8)YO zA^B?`eVcsbwU<}z*)NFPd2!>|V1GqPp}?e2MA!5MIW0U8R_Z{?*cUWH9#Qq&SGx6B zRKK#Apf`r5Ng2IIloGT(VjhMD4yIbPS9>CFV(wEiG4>Q)7n9q==U;|areYA7QKhof z5tK(asD=|7>Zk34OCPWgs9C91w9cUAnIQM2B0htH-ARVahr(GRF2_1hdfK(KMMaR- zo+kr6Lff;jg<5bR!N4-5D`Zb*F%@~=wy_;jyMdUa(v;X~D0o`tNj(LRwm0$sE|N|e zJ=xTeVAxY)LAO9bv}GJDEOeSW^->^~Sdn_jSbtJV%t4@_X)RQCSG5W=x;cx9LMFXI zeatF4!FR|RNQ=-7)TjL;Zlr9YqT5Y?0j|+SY3O;_pFw)3;(8oVT9whZ$v3tNyGH=i znQre&rw*{Z18&43<2173gP0|m+!Kn(OfeyTU+dtayOpgD;n=n~-gs92tB-z#y!(;+ z?-G?p`5t~)vD%S{TG^wC{E0l;=snaO2?@PM!f(i+pF#Kj2v0MxG@?Q_w*K#aMaTvdpS3WiPW?w6RNg-R2(?a+FsM3 zNf~~{CU_Qy7L&%T!rFw++cWQJB!0CBO4R!lr7cHv<~gzKUa(v=5LrvP7o$f*)Sdu+ zJIH+UosY=>_^GGm*Z=6($e()uBl2juA@$aCmy6%+7EK^L92p9sBD^vIU1-|Drq$R4 zr$y9on8rGpw1>!Kht#poR}7{+u(n3xwQ7-~(&IR^W!;aGcCcxYGO78NP)-U5C^kjg zWoVuhl_;XN=uDE!b-)`VfKrjZ3U zBPxXSB!?(X(5;h+4^;?$L&EU4=nqLg0=H*D9^Y5MK&6W z5UWsIPbYT3u7H+xY`{`R6mn&(Fec<97NsJmb=DK=s1*eO$Cpi3$t=`~jMBXcZkIz& zW?b%w44+dO5*UcH7yu>eTqrPu95iAz;NI~<^2J;-!5wcz^K90`Z_Xd15_iL9+J z6=!d+Wz@4{^(T>D!lNhl8tu_Np3aLj8UE)+;beQw&kM1|}KHB%mUT;5~ z`}^1;eqO&6S@G>-zU|@r)8(6w69NH^d1j6)p}7Nx#?8kPBFK~%Vb779D- z(59p`thC_H$oUd-Jz@i#Oq8-MA?yOyqPDUvdnFO|Xvws-UBH%~f{V@2Ai7cd<75>b z^>o49es)HrU&5Q-gj&>gZ2twtQDzeh&**2MA)T*G4OJ?Lm+zujTo+JFoPf6*^cpf( zX2vr!^k=h2Uw+XMRpC_(?20@rZNJ`0 zvUeKygOT6d{m{DizWIBF{Q0)fX@DX&oqih3=mP8Z&K1=VIgQO=R?IL6>O0c!}x4nEk8k(#r=uDbEd&H)>V14QOj^Q|&*d$zR zkI*>e7Wm9HKT7Gmu^;h3$bimmK)sd+Vys<7(>R2#d9*A~aENg)X!jLp6()HzA0}&G z9R;={t(-#IhUS!dVxnN)Ns*ziq20ck9I&+{&H9;ANA$B{1||fEW>nEoC((QPx@@3l zuZZT*zyE%KK?{*>YM@7|F7>HA#wiC>VT zUYWh-*hs+YH+hTDoD;};E3F@HqEf`jHqFPdo9-UX<88>+4($hpNQCT%HhYSWT7K<@ z=k-I8red$>Ceodp+w`KL(ho*^$c_IuHqFjyWKK-bFccZxE^GuJSx0?CSgOtBsJbpx z6AGs-xg}06js^ki%!vj^ufvJ%2an7}Lyi|L+rcT)D0!qaqC!1Y<==-W-^f0n?bk!s zCi(PNJu3gp_q|6x|07>3f8irLaXa21UZ zz7|iVX}GmHZpK=eaLB4E+---eBdpS_aly5s)}}9&5Ebes3T`GXIl_zCV6Cnv8BkJBQ5~vcy8Q~2#3g~a z19sN=;H0T~X-cZ{?)I(AKToE;8N%AJsC02@1=%^ldbWveHz&)nj1Z?I{9RQcvyQaT zn%u*GPU*RBwPsjQLi8{O1=HEHVo982oK{vSzAIw<^#-crCYjJ;OeBS;iDj)S)>4iX z83WtRx1mGrYY+#%=n9Z4yUWKZZe%6Pp62w5-T>SH=1uM6I%xn7>8E^f$A zf9k#R%Ii}ITSu1QJwYfJN1xMS7r_V~-&@@Gtity3{bp-j6dvJ-P!EqNL|GMf2#R3( zXjAtakk`@pDEnxb*wcVmbRrT>?gfwSX&Iu|VmG#^h9IJPqSv>l zkV0yDT2>0?OQ#r)IPuaM(rwKhb(v)xFe*_-6Q&i3toP^{8w6*svF*CD=!ZwA{Odk< zkGvEW7!9*TWjqq&?|uImUPH7eDBm9U_4gZahAaarn&pecNAg$flu|iP3i0P?<8&>r=<`8~Bj!FjQqx<>V#k>V}|FYJr zGpKa?YDXpJIxsk3(|(zE_$JjxoSz_oJ}+_D2~~LD-c*%IS8@x9l>`qInUZB`~op8bEQkp zKuz#mCdBpY0t5K7^gMw@20}HgXG18PWDG6ag+DST8K10bhPJLmhtOB&!47G25wIN< ze2+5%@G>X*%7AK=P2RaFKk*H3kq^D$6=5ETM@78G!D~Xu)klGFe&O`a8Xv1}1GLUr zZ@F3cY>;RGxl60%!nPus$36}p!v~)24GVjZ9Z?NY?7DxQk@$Dd`4J6*(Y1(@Q9T0S z^H?lONVZqV3ft{~^V$dQkso~b z>*R-?e!bkdT$KLjfAnSf#n1n){NitYSw8>#QPSnWlJezte7M%$m~EYF>r^r&xV2~C z&}lj8>l>&3LTI_Ku1fU@_6EWIkPKo`0Fz8C{HsIn*eI0TsUYrKrEu+pkQ;QmAXKm) z&U>DTwlmjGEoMwP6{)q_mnLJdNw!S0HGU6c2?y*|58_?zyV9LG4{hN>_s@iMWmLIL zNUuG%!+*xGj{9BuUf%!M>He3?_4Bd}Dipfv8(wJDWeAjAq;kTEq>^G1!-Mj<^7S%GT&iZYB({ET@7e7e@(qt(mw)R+Zwkee zkwDfjp7zgC!e#_>N8x4>-yaEfBly~%WcN;~ezUiyVJ|lI+`r#+qJ=*a_xepgvaLqn z>$5fdsoxG~QHpIO4z;g8+5n^Ht_e^iDY);mK)C7BM?&8W}Ubzc>@?Aw9;o3t;_NpWzRPtPaU*v?dXpKj&{E)Pl zJ>=0hf4}Ud=31SR?clPVTHCMtFW;9>zVkKmJzw!i`?t?Odt3hIZ~d zNhK*XCv{AywGA3rEctJMxL7d7iMhFLraUaf_?{y&xR*L|QrLExkak-!Ty*EmaP`oZ zJWnG%aS=J`7)eGO!|T4eo@NXujI%#L^tHjHO+33+EwS3x_r!?iGzOTQ<)mUXodo6q&ZJ<$xiCsMH z$v-MU^qZzXQTi^R$i=j$E!ZpS^X?6QBHkMi>~IkYJ?#b;i7cbdD?$+VM8eUv^FxS# z+(^tB4NvwxYVQSx?HMOeLjF9_W+5tR-&=?s^EhEvK;T;6fsJedtFV1mkHIkE2eNbh zI~GOq@1K9X2>siu7T7}}y#p*N=KKDi?FoE*De}Cu%*w5KUWcKuzidD-h8x?I7HpoYYHE(y+jM zvDkaL4ozY>QTVLD~=93*XnmIQ_2e zX{gnP;;emhS(YnA{cJjhIwchrrQQP7VO|+rVktxxIx?^V86owsmJzYMV$smXUf6@_ z2I|8|e`7YA@evn3gO;JEp6JX{M~PTQ5EM;XY~^f)foX_O8@jRadQ2?DDOTmIt5-XV`YbkEt1GNMepbHj$a`LB;o`H@p4 zN==QDY&|02f0l>6)m7q<6d%sEN5Oa+%p(PUh=@+=-q8^WcBAj*W@KqCzp46b9HCUv zAQcUf=kzvSwCSBbez@{9(p~`{U)PGTH@ezdn&-ASL+3S~&nS&cuLR@3EaqrHrr zh#CqraCYuJu6yr${e$w=k3J+nQXX%A_l28B`K8O@<(L223-T*pcu{`!^4D*C@p-x3 zuIt=skUXQY{_?*S_iF7(`V3?qRtlxZx269Y1+Z`eQK(H(b$8AHS%zq~xim}CCizk+ zcR=S(MW7l|yt5IvG6QQ7cCoRFr6YI?4(~LmG#w#Yo)=a-u$3An5Xvrc+glVWK|}^} zXS7YY|IKz_uNtT~kpF6(aq|QdN_tuPeqJ6it!R3$*c_P&6K2ZPl8owVY93bHBpR*+ zO@<)udWIOZT}vhjCN@2GI!V)8x#<@M>Oe-3!5M-hQCM#p!rBS2AtUeGb30Z9?+iY> zqBM$==#&QvBuPdMeBs89)?;HS>((y%m|(RACO4a4w+d8aEy;8)z?mdH6QT+^&^jCo zZP>+gA5>=-oYCO`l&T{*qGDZ}HdkR2r@KK+HxOMy`Qk{-FR5clLcA|P^RnN00EwgrOml19aZ0G=n6%iyxY zd%V%1MI#9qQkg-awoPis)%H^K;U2o?@Arrji-zQLoBUpC^PUAd5;xm{%D>LN_bftP zB7M=`J+?=c@#|l6?=0W;)>q57yyaB`Nxl5qfBfui`3GOV*{Gx6dEt)y(;FA^|2}(5 zzI^kJeDT&I&);5}UAjV!km&5eL2E^nH}4PKer4m;D1PTngr_490%N<;WcZAfFn>WGVP zbkf{KuQOCly_gDuRMuLXnr zpre?EINFvc6em=oLW#mGsJG3eU8!3!!$CHho}vw147BS4-UWWkY|t&rY7X%Cx4*k~Uxo>&<$*JEv8X~^kpSCM^#jFT|IIlUPo%-Ir|D>@ve(9oJoko@XdsO2t9u)* zMGI_?lSgo(;mK=YB4>;JZ}gs?JU&jB0@^dD6lh7{0%UtQHj{1mKepn{@j08Aa@$^C z8u>w(>$`0?hu75S@pyDFYEJe7Z6DGX4S@EZjC3k{g4(DTD$>nF=*l_kd33+np~ntj zk#@~fR8cOH|E#M^>GEsd{EF-HdfIZtDoTz4qU4|Gjmww3g`Y>woLHJMzE( z_OtRc|KN-Axqo^?j@K>+mic-c9P~g(Z3!KcbOAvtS&`Yotf~a9VlAdjw+;tLg7c_3 zj9On_X9pUpvOTZb>C1`XpLIlEkdmC}9zwFRn2x%m46C$g-WG?Q)Z`Nro@1$?#u&># z4X~jg6?k3cW$Pt;Sq7COUO?L%nJus>vk%#%@*zKE?EQW7u51wQr=8S#4EpB1LZdOI z5f!hSKgDvH9&`mxXkJ%tuH}$0ga@?C4Au68ry$1Q!oDA7ldNzKOn~-^+N{$kn&JY4 zn{+`~8v}DzwXr1)q^jTqDbm}L4?7Cd7fX$iF);PaDH#LHg26D)$g-hJY3WnC+Kw%* zsZ2 z$D=Ay5~)RMB0Krs_4gEq-&7)9%{d!-Wvb`UJdSJ%l$Hv3bnLaV*YKtEL=gfR1t*^Stn8sb5u)hnB>OqG zuipyO{g7|%(vd#x9M$NDq3yA*ry}G1#aC86&d#qV!c~LL?(++Rd|}<*y%{Mu~Fv)ry5O{ zh{q_yd340SxIpjN<^{?q>Yy_Dcw)245Q@q@xjBcxR4j;{IIie@gVAE`0m2QDDTvok zXjv}#3I)C~in_ol()1BT6k28U5XVk=WU3H4%dnFj*|&quInl!o2Mc>3IvoM{3hk#o zPo-+(GGgP@Q@-6mhk0z$Yc+vQfX7tNfvyMw8cjTlX#d3&7PbLo#cj%71ZZszY|&)K z2|9>2TNg_SE9$fx^+VLilt#@MY6{}=3FWa!kxm^JWo3wnR}4R5EN*jR<-MpNjPzNS z5q?E(lAO`8_Wq;RD2nUUIMh2giWli^fD6 z9J>)jCvzVazn7Easf)-C?nTocjkBB3UMZ!g1NixF38P32ZO}J1fe8nUQklS6wJ}z6 zo~Xq#>qT2rPyw=3b%@@D5<~;J&nSt$-ri5X6*&qv^n;N7y6Bqu&!7EwJ9yj51p7Q9 z$5=GHdbBMXlDsp>|J+DGd=3S&*KY6HL?YpchV|F$!*6`0eD2d9kdHojzsT(uJLSGq zO=8aon%lb0lF|AJG=s&s(YF5`P?*T>ITfCyzK{f#$O!{Ws-tP`?s`3U~iPl`^OjwPa;c z#qwx{u1d44rrC6yhN?D9wt_)aYcFE5Mas~MREXZ#bbNp<7iJ@UPNMlK*evD@I~UUS zU=Jo5vcjNVS?R5BmQ_TL0zismkGv*JzXk{JmmF}q5C;WW83m4LdQLJ*74ynVTlt~OFW!7? zz7}o_-YMk2-{z5c3-g|)C)(`17GdwS95wR#pXYTW{v_`=GjCsy29Uk-L9b!*8;oWf z;q)mQcaGOiO&F0x@}m$wGRQDN*K)u@op5m34m`{>V!0d#K>t2jBqS0+M}wPp>_kXR zM48zk(%x55`>`D!?Qk0*e!Mq4dbXEgv_~O&B+_eV{PXjlu|4F?cU^f0lO5_KL^rbg zdvWr;m;1y|f8s0U=~qrNFSjr6jjCBJY=KVfu|op;0Rsyun#6{AFb>RWnJ808qQ$lX z@#{vjR}M1JXHw=+v5zqq?1;T_!2nc*rMNh+rXG~Kq@kP9Lo*K5$E6tiH5dq%KW;im zxL|c}PFHMD=^_TZIoA|k<)$$?mrD|3WUu;Ol`<0ye{A~(5U!LBDc0ZBQ{ zie8@y(3Mu8-?}M(_8Xs+*WGtGX+_@C5bQzxemIC|7oYa&iv_)oB8tqn8%Z=Y?44R8 zjfRDwqXEfo_#PREPL7d|!HZHOEs2Hu{buN?A3HGm}SU#k-qba-@~CcLJp#VzzdN1{r=kT4J46eIw~>rpYc7N+Br1OzQ6WyE&AcB z9$u=RVXyMRM-2G;lD~i8`a%A)Z-2Y2cW$*TkzNZBfEDR|N6BBBQNw!H}Ys zS_Gr5b@X-=bnTSdA+i||98sSkj2$V4bK{`P}W(Llb z-C2aeTYtUtG<3izNgWBvv+;`^Y*E=w%)>{dV7}U z2ubwU&m*$_^>}p9qBb9T{2}@9WA|UKlS^A8S5k&_mEyiC7yzdDzqzg+0mDy(E>Ql3ci*LnLh}>^MbY`GPsQzZU zV547qP;apPdBMU0n2nUyk;#~)(>ELdD+I=b?8ud?&=wbh87V9utR~=%RplC) zpSw+aDMmB}C2$4`lW#vSfBxIw(TAv=igxMwil^-ZHFH+_F~odbUB{7*>lhAGP1#Nbgs%E(yl~%k*?Vj+pCl?1jF7-cgAr+&EF!gM2lfY$sAMyufFc35r)c=NHvG;D+I>5; zrDh|Y7@tFQPw!>OL?T`L{I;+C#8*5b>Ed>en?NKzb5*iQCKsUfoHLkYJ2~cH6U!bT z>`rzHUa3v7hzJX3AqvM9)%LH#H9TpR%L+G9#$L5B=@vtI8;*#g$Qj~m>G=Li}+Me#KPo}%Od3OMloOkHBoHb zJ%e``BcHmc_Xw&fql9m@R%sx;EAskRh*uA^;!2-_sjO`@4PO@_X1%f_Y=;x|ar5fe zegh|{!jJ59fOV~ij8ZGy(A)Fa_`*4j0xAwa*3Q<%$M|~o`Ao*MzhGcFF7*VN+FVJD zPR>A2Dk87vzWD^Qe5_(Fb==ID0Yfd$HeM=;_fEt6Pcaq-cS$C(U!u zCDJ?C1XLpr;_B(7bchPvm5Y93YW9 z$(BQgv@+0^2z`h&1}uUj)ZId?GV_X{MMvf9@(<*i4BO0uHhb95>atcxuCrtBI?k;4-vu=z1|2RwZol|+Pci9v?BVx4-?c$);z54B@KZpQNA|p^8T7S8eb7* zKdKynlq1zvWVnUe0e-FcKJ`2_B)ru^Aakr0a}q2tn#uzxCl+#2W3sOHvo8t|w8F@_tu5grKV3Nlezs1xJkQ7K*$72NpXY10+!x1r|dgbVAK zPy{O@HfDmGfQUvP7P_c6V-nx4$+ay6XzjJ*2T)M$=FfcqOQr^3f>nV{4*+`^ zDL#8)FY6&X`A4w4*RI&pRix3eKhp|cE$nQQc2(dm}W=qb-)cu_%|PzV-&xh=TRW&|Wycr_b0!()I$`{NUpgq$4WG z4+hbo9MPrG!NWW8qWjyUmFM(S(dXgK4_$8&^3)c#)Y@Y7Bu1LhH{GgkS2ocry@)`~ z32a2JBZgx|90r3%1$!T*0=Ke9CdR%$#{*tW z=j#TnS5q$!toWW)MovmWWk6O@Rl@M(8aIXF;jBf2ZGji2CYsY;9nZDE9yh1q?caXT z#oA+=7ot+Ag06YkGgl5&K)n(m$evKxZ}2wQ9B;{wefSA^-2>O}Itg2(U{Bb#S5oNR zF&2i71a^M2@(Zc|`4P{)7ycGS@t-?UMgvAvO1IZlOcI+ z(Y}VrhU`zl5sDRAw*BkyC+NLA8!yQA@9Ew^coK3(*CE?pDX^8Q0>nb$JcR4SUq~&d z(ho{>Vo+?mP=5w=cuul=uSfcyJ&lT`QKF{qJ*%zX=%eAs4$L0a+tUpB``y21o=WtC zP-KCQnwIx!7a|HK3UZ7zToI}lQM3NOi5@p9+X=t4A=5_)7v6UKRV*=b7m1#7bdmG;=lrn7Dd-Yby_&iN^5Tq)#2n?O3w=E6Kx)@ zo+_r5bIe9`BeC6b1^m_m+z5@^^BIPw1xOLQ8x{;?Hm*M>et^lj59p3%R07*^`?<)H zNl<^!M&q(9y&*K$QEo^zc`vXcU*B;f^7^$L<;~ZN{IL%_9?~oR1hQurj!u#Ow7<6) zTX@`4MiEEtbuRvdwWn9Hk8g#(7QWv*d3h&|g{9AFOQLYED0SBVtSAya8m9Irsl7UY zNC@lQD0{e%PLXW_PMlh>?7;(U+zc|f5Hr*?YKH>}a=6rCUq`uY+f(rKW_;~6z9%whBQgmq@1+&55iU2~&kOs1 zj05*7Au2NjXKSx1ZOxQI+iU937X?R3F{~YKT`Cujq~7mr^(bi|EsZkSK5z+%c?M;e zAb6vIj*<5VbR4j|V@7KxBq^8wr7@T3wv}}VipX#vX$62awV{UiTroE3jQIRQ&;%cX zr4Btz%Tqy&f7PPI{#rH22RCkm`Ie%st>h0IJWcqHk@paA(NUC$C_&IXLWTO*@wv{p zD^_0PObyYnJ8ibk&xC~QzI%U8f?6?DH=39g<Yi6^xj8h zlY5#WpG>-^F*6?<*Xf()v-K%#{b@2Jy0f7dIluTaL7#h@O+*+KImf=bs{cdzu79e?>6@Dpv zj)scFL3UX1`-W2R{mr#GB^Bcqpad(V13gJTjsCctbj|OH<_P*sph}^?Y02vhO2qzm zrCdLadayC>4b^~}IQI)w5tf!wvrS2Ui>JqC*>oVKpZvR1sQ39ay+on2rK)pB5S~*& zduT`-?tu-eIvRWMS}pvJH>^|@&yi=GLFE)vu-IX=qQP(TM4>Ctp)&G|6C?kjuofiL z7IVEi{ZfX&mER*tdyHD7K83w_T?+GIQ56(ju_UeWjL;5MSTQr2meq5g#(4xcf2D{J(T79-~HN!J9_dBs7&cOcoJa}PC%QisoJ5cJ(G!Z1Yg7#$Y ze9MBK43rhEbmYJ@JAnhP5PcR_XG0J>85oVhY?Xz4c;jXSur*D{3X$v7G1w%7ZxaNY z%`KB;V007`nE*fx16j+Ric}3`OPF{HCSj&oCJ5=6tH7ko1?Kan1A*$gvX+~~BG8zW zsqlvLDRqRYLP#YDbXys;hVhr;EGtMZGK9gxVK9&UWWA=eBNsEg6$IePh(>O|wh+9V zH{{R${pr|G;>-OY5JB4ZWa&kTRyPpEi$`vV$Z6m$u~BGU zL{;s<_mPvwpNRLO$2|oViHD<f8 z9oPc>81qh+N{v7T50B4{R2*>XNhZ<^G;(4nGpa(?ia@O*C(e?+%`~EY_6A#jFGU4_ z9u+%>WceW}La;2_5K%6qTK3RIKg90|)ct|Pen$5WBOV3uv`>`G8^!iVjpWfaIG5JD z{qOI8@x{x1Cc`nBRIkW`a4j%@Ku5`8SL!f_Fg)na1JpD zDy={SkGS6pMJmh{TYDV-f&;4J1lS{HHLr+9l(X+@!JjFmNcfyg>52uui45!O1XQCr zSqc(X^N4q+R%D?<85=QA|5QBp@HeEwCN}r>^t=@uUz<`dAMIl4WZA;_d(u3nihHJ| z7j3}_gM{8(7;08TW{*V*hz1cJSg`5rX~W5uGXj^>Van>MA1Iv~;dRI%RhClL^w_Kd zsv-KLVrrt@G9~54DBSABSh(?*aUHG2n-=jYBcFvQOw}P{AYA$cz1i;M&TaYN>+Y5B zc>8O@E)hSZ_+F5`AhvVD+DP1L2Mk}P=W`;W(mwAX+6%Pu)=m4pkp{s3ti5u;C}+i| z>H3VBNFeORevyV@Ply@mV9x1x&be`-fI9!P{YJDG!so@8(P=%ZEQq?I^u6Tgz94~_ zdVsYLF#uCQtiKc1VwR7J5eI50WEvemRkSy*uOnDb`Uz9QZkoM>RGT%lhu&HAAhM4~ z0f5$u>s@M*Eq8Cg_1Y@0d5Y+#2r-Rp{gKwpwwmWCTgDsxqUicDG>rId`24anWV!SCPdQ@Cmd@GeG=vTy)O z!#2;LRNEEU{=QYc^a%XzF&EmCp^L0YVlQ3fqJEwUfry$;YcjT$wO%dP4=uv&1uq>^ zqJo)vkCeLmMlkhdoJ=O@GxU9wF_AXfW-%WUgw0Is*x*ztT}0YY1#|U{} zAj1Wko?^Njv}YulzMg3){W#E7EZ7Ctoahf-Kh3@jr_-!n`OB|8-jqN6;U_dj*gH^s zef!>E5G7K2iYE$&+S}y(#=W;dMG$**3il@{8$Pv{bK;?Wt0Az@+n@d-VX24BZFWXv z1C26KEb`({wcdHLHyoa$)I2iaof=V#?@PtW@6m&Pi1jI=k=>T>Ti>XwipA-!s}$6? z1zrm!^uUp)(-O~=hErmOGjEbn1wwSCmVJBeo{q|DAtGyeR00@n;!&7clsV&37mF&M zL+_$=+`WNp&-D~Nzla));`;siaPIX-LwMwVijb5D>GY-nd;k5N-+AtGEuZArHu|JR zxQX%uK-)9ddhK3gLUK~N2q|1Arj1r@!u1EiJK~E&)rzFrHbORMyrKm~< zmC=NpQxC4uJ{viuig;5Lyc1jN@L~IvMLpvM)Ke=FL%n-N^Y0NUuR3_t5s^<0u+~w4 zNK4ns4+n#N$`E{H2zn>bPZJ}zF?bz8P4$5aLRx%at|9Y<(fKmEkGsei*$){*i{M5r z5d2jLeRa6PwQigxbSsOtM1vN>0F|I|VHhIk`m|igdtZG`KK9N>b{#vBz%AMg_cl1Y zXxl_eztBfQzdfEgI+gn_m_0$QM|+~cGz)$EMa^!kKA_Go;*pjhN*s+gfpcz~NI1B+ zVcCs?oBSSq5XF;wTEgEC-Ue+clD$^nbBV%Hd8DV4_@4+bOZm(HwJJ*gz822q(zEv9#{F?Z$Edr-^|_BngyswQuIyF z#zfTDE=--2C#lU5N^N4sVNwu=%ENz7%=&^rwpV>?b2m2<4kZipl{9-K({fB`B{Lx% zYrQ};Tj2mvWJvm6$>{(8kGgk{**&|;!`9yW_kQQh*y9T}wz-B|NK&A*Q7$x%s-z9M zP?bncQPW7JrGFJQimJ3tuaT-sB}vmLi9}kpG@+z{K%meFhlqrLYe5L$fUo$%cx*Es zk3Hj=vB#d<_x|?YefQqav-bMd*}rf6&qzIkhB-dxJMVR0)_T@+=|c;sdowfhUO^v~ z?G>8*3{C~FSX6#=OYID2%+3-jMk-NS5Fax*+W$TwC0TILG|oq65s*jT%Zpho%3VulCg_hDCaPh({Z)~$nwR^F(IYUvqw_&}D?ZGM6LRF8@^V3C zt1-eVK+YSL`HR&TA4jrazW6(Y47BOZD9tj1#gJGUd!BXhu&Cy3{+tYr7A$MXe=C4R4@ z*++=lk>jx+>3JK1)%#mL=2206o6pTEl#_q3rltmc@ zce{(5=%rx!2B1E+U=pD2+W1eScHJlUMWLc@t!VG*1ELU4;m=IFc;;tRd_WPF^ci%%12?<{TvklM+eu@ zh4h6K5|-W1$Fl05Bhuc>*~K4apR6wTqZ#>%OLLoN#?haz_%JVbA+FRXtM}dh`S`Oh z$~!*wd3pb*pO^PM`FZ)kGtbM1o_;~D%e?Vh5l~f)5T+kM9fkjJD0pdD5VX&pG_7v^ zUDUbr&gF3b%7^aCzxd`?$v3_6Rr1YmdbRwXFL{l;`BKmvIq0r9H#aZ+!5uhbPX)R% z%Z&RVrz`^YrrbD!jKYa?1fPx@VUY70l82 z%@@)BviEzSJDvlj(*WX7dBlI)4@Wscy1($gWl5~U-b3M|DCW&uO71UZMzDPqU^YNI7cwUL~a&3b<$-9kq^aL0;{h?yVh>_=5z=>^z)$?*Jvp#q?c_Ubfq2- z|1fxS2~8LMlQ<6T89_)auV@Mq9;=-{o?vdrf=7hTBeY_LM*7EIt-)2c(2-f;3U&1U zJ4b3bUxfJexZ)hG#yY-uwx5@6EbPAW((I#Xf}_!>KNq~}$QLbkjN5+iGcWG))(<@; z@$^9Frfg~Kh1M5w+%oR4p~Tq)=rj-s3M5FRZHw;=33I8_Q$--;7#z;oc=kKNp!pcM+#p97zi~W1Nh+f>YyzMtXBR~1@r{(W|=xO=n^XE%3 za_JI>HMHc@t3WcxoZO5H6P%#4Mnz0zLo&Rn3{5I{tn!JFih zo$-4-%tgn~-9M)L5%x zW@S=$WL$TfT;C%cFBd@S$1X>qibuuQ5rKDAH2J-=LP(GH82|a3zxtRwUoYo}M3{d< zR;=XM@%ucI3ku&>teiCjS6u{0fq?Tlf#`YyrJ={Q^k#nq6LyE%jcPX0AYaKvyvF}9~@8w$Sm9c||q~b|XUKJ>wbh#R#9C>)GMno$<%Sz&UWM_X{M|RX{`U7oc*S&(n zJygCb#_sh9iOWcP|2nOzqkUfO;QH|oJRv{!fhXl3edKBR?B3SjcIgf;N5TWAE`7{c zN9_QtO5_&Z+vIF)aJbAeU8&g&79gcOurpB!nX=xDpWVwSf%>|JD>QSu8s{Tzt#BE| z{|8DV%dQ86T)tmf@um58CcYpgA%kTZt*W6P$GAxcV{uCn$`g>Ic0SF)GTLRJpY(?T9G6vbbL<-&Wy$D@Bf93oE~zBjwhSS>e$L_lO5} z8^^|ulYFtUBIq8O0UnJ>Z?oCAg};3bw~dZGF_|NozwwSwT-M_W(@*e2D!+pvRiE;9 zoXMps%APnT<-V6uq+~;z$TDsCcbv<^Mjx)T@X@+SdYs0jG2G-;?YxK}b`h-IR%kHE znW&G@a8+p&9QT9w1Ow9kxaWbQvMISQ3YE=VtOXnUgl;9FNIAjyOvf&D{LEQ7E91i4 zG58}jrGGW)<_M@jPB?rKBFt@2$N+6oJK{RVFFzLp>b9B;8oF2$&va52zMxqzq> zDXm74)e6Lz!VN!_4aH3WWUWx&J`_y7s=s_V=~AeC_wV}h!)y{i$Mu~H<+)bkYd5|{ zVLWniG#6g^Ev%AHeK+WRPFC=>eVs?-(iK0%zD`@5tuCll!L#Dc*w^ME>D8FY5|h1D zo1goye(Lk`1MmH${P6ppkZ1O`7dF|h?#gxwy-?jjBF{0ZWK#Lwfgz$n53u%9&Lo>eVOt_rBrH@?GEbX8EeuK7jW=iYXer@xAbTCn~C@k2j!n7+r4Dh?20_?QHdj>>rwo{ZAjqJdp+_WvCrqp_(zD~ z3N8CW(3I84$s;O9pWTtFsr}whe(*{8*mL`3{hh{G#gMecm%mTiD z{eAqbx&h{q^4Q1dkabbUMZO6&;#0{5O*rDU#f+ee@lWWAfxf86BV|39;njk}S1t2V zEmzFPdjSThIDkXaP4Ajaxhb3KAm0wPP8>x!3ahpd&X6l_%0L_os@WxH1HlK3iL9cb zJ%5RFE}tr7;}Y;Z8u>Gbw-KmP`@F7Sl0Wg=-Y9Q*_0>IO+126aA!5(xxJ`PxB7}Mc z!BKFZMIv@yTH|{@s%doHKxpS7k z^XpH@_r2?JdC#X`kdn5`C4UE~<+!|wdUhm`$ft5M7#%;ViW5ec0izy!wrB3m%PC2o z2gg4AIUz*w|*n6YY<3g?!=gaz)Y+3gi)`Bf0(& z%CmB}UKL3vH`NY6kH!f`-=^q9*ux1uB2g z2-A@^AP1&KM#tPwqn`k8j`ksJtXQi?NGDUFC0fd(D(DAW#Jo;mj0Ok3LJ}-_A=XwO z4y~Q{fiI@wAna8k;5h!wkUo#9w(~yAu8aoHN5MQ{|9<_XJ3##P>6&OTpz-A}xb<*)wAqw=>d1eYh-$>_?ssOq)A5VA4}d^ga&t~R(7A92VPW1M8!VV;K6@-oTT^p1$pBnz9- zibO))0VbVQjSjmJV@&FHIXG5reUEh<+TOxNz%hRUWD~cO?ArtKlOKOk{=vuI+YzIH znL4|Xg08c`FfzkWh-gqY)&W^2^IgA>)?|=tXZBReH&H=r_;hNt=TK z=nCQSGe}K)QL2tAcoN1+TZ-xtQG!+RR6RTc7Z><6m9QU*CJr;hDfF&Tv2Pij{MWrE z$shcx*Wa_jk5oTLTor#%9<75i0B07r~GjWEVL7)$2L3)eUw zhonYMU4Gg3z)%HjC=7NdlWccdAPUnD%Ib%myIHOfp6wXtz2H zv5#GIzEjsZQ}pLHtUhsbL@OjGx<#CyN_{6F9K+?7N+c2Zf5NW)HAfnFEBeh!^CM=9glHQ3iM5x z>Ke+>_-8|MT*hleRmzc<7E_Fm2SKU^wWR8;YDR(95ROdWnK%z3&hLXU?a9a*((#W` z`s^5=ag^3jpOLIthWY}PQF-YF`L5sfB{M^4(UtkRu0M3{Sr=}kahrX-^^35-=T$|k zvC5HB;)ri@WJu=&(2n3?Ket~IdcE3UrC2!1M>&#+`U~Qz7kBxdU;It^zDvjVLbGi; zJ=ixztpV9s;DJCj7`2Z=lX9?_R2~r_OrHoER?+9EG8tAT_oJCd(O+T% zVSbZ2nyox+0gp$SXrq9Ht07gF!fD1}gq}1$KF2YJ-EkhMMS$Vd2nvW^Sg}BnX&A{o zF`hYsB0s~1pcnFxD)%!0uGm`8)Dhbe>&-RfBNSHY+(&!I7Z@vf{0dn+3e!A7H~c#F z?yTO$`8K}SDu~mLS63sL6{pJc)mEf^zo%A3(+YvKui1WOYF}4D$6sr>e+m_W zlPgJ{JR}3{;Df0`abPtV>m-wuM}wt}>K|O<lDGcK7vcWlx#ATaG2u7UJu2aQaiX*5*i?*5|u z2jBdbdpi1~i{E!kcC)XDe5(ulh}FLuv8)c|+k6sM9qB6P=SanL)Xm*yE$@?HEn2h+ zE?jxW+~&E#&*O8~S^nBP9_wSC=W3EYJpkjTwv5N3F31!aDCUfnA1SDzqXGTrT8Gpw z*COiP+}3PE2s4SMOdF>?07&R@I7SWVw{kQIgDMs6)Tg>4biX0anQ3L zxiPL3Ge&DtP^jRD!X^@Sao83e`wWg4`E6pzyHYH{779ed>IJUZAm`G{B0-Ycz^i>h z`dnS4w~as|=rL)+AXIH-A(c9vzh>`}_x&3Vv8onY$3;)+EI6Ork18!#>@RN6>@+WpcYg`MS@fB0Mj7Ec6;MSo&~zn ziMe&S?TWE_78tn+B;@7#CHdoD{|0%}tFG?hcO1=hkJ$d6&*BeeFJHdR*>#0<_`~Zc z`PUzwE5zc6z~>7TuR`#jk$t~M^5hjdVh`R`EWxT6`{DOLA^+9e9+AhMubqpb-CPYw zBacwa1ier*B=e&a;w2rim&WYo>NJX!(`A7&3yT-{WW|nyFk*j~Y8!z${@E2}okav; z#jY|SugfaGDkQ%;xE~Dmt~SDWRoH#vK;|fE!0L28Pw?Hs{I@cfrL0|mJ%7W;M!X!dw<1X&DPX)Z=r)fK+XUD#mABzvjd6SdZb`LA zHvLEP`_+E%A*ZV`mK`G<@xuJMbd=7%I;*r$ynMIc{Zk*3=PvDZqSUw->p??gdy%`1 zv1vo9)pkBiJBvzL8zM}Ivh>$Xt|BQ8od!T}l|c>Yp@5A;*dAX7zfu*pAt)*sWO^7C zpd=h~j(tHZjInQr;AQ02bp#dsH4V5$ITGj@6qzPIE_-r7>-{wP(P053Q=Rx}iV%@0 z&t=v@#r&%xzFO!STZe^x1S*q=0z-nk!8Nu3O<_!X1=&YouMQ&z^@E6}v(s@*3^$x7 z$!F<{H^dPnMe{01d&gL1jCfdlS&6fzWcKF=3?~CY8im(HUlQOu{vCFmBrX;#)Kj|Y zlBty;2*E{}S%WYep(@gf-w*}+pCd4_KprjEFUoiQOJ99s{Icq({HVqk6n5rp4?%l4 zt_~ghJV&8~w{>1ecIy5>x~)s|#gye7tkeoCCBacVz-laZWJ&JT7<`@&JoTLXnVMD-7h@n(N^o5Zn^P(qQ9ix?_W2O&elV)lb@@AKrv2XMcHXcRfr|nQ3D&h!B z1NBvcBy$57rxz~5wQ@56v`18c3s;#!j_N5Q7o~k3fur3Z_n;N4HSb3uo)Eh##8(^? zyFUCF#=A1Fd|T{(_B<~SFjrS9@*mi;%^mP z%76aXcRVJ)`1tdZPIpJKUnf;TkRv7FIRn#>lc4*+Ac0!4uFR z(>Rpm+!#cy_|+g4MT(jihRNI9;F7z;)KfiHXiir~DB@^JrmvP}7aH-%h;+eyo~KZx zhw@ewX!lK_Qf4w~LU~7CNIxh-h5hcdrjIyG1jN|D!Ul&!tPXYPBa7G_Wc!DXJRJra zb|R7ttU82=RkaWL3f)^rH((MsM>16L2!t6@!?5)OaSL=(Dqr=aW@vL7A zA9F>>JA#^5FuD&mJjym||7|X^f8iG&mH+vdep6n$6e#iT1IW&b<2%3nHv>_rR21~b zNb2D;xJ*$E2>YQ&!^Jw}{Y8uC>2P_*|0chxp>f>kdsz9@yGSr{ia zNq%o=V$}wN_Tr+xMb@kkO@cFK+u7aWInG3O!e}NW!1D!xrai%2?F8bqM=0=Gii6+M z|7r>9{;WjFu0|XZ>Ij)N3oWjV6=!KhHuW5*BZ>WOej#3Q;|ucJtmto(^B*Z~R?0a( z&dLe;woILsi?v6lR!HV*Z0b2jfs)nw&WqZDH3?bvTot~utX>$vr_;Sv5wc+NOZtJH2A^PKK94oR zs#Vi3ckovtNRwh@-esz+dsjS7x-N(Gj!{n>pKBjkwf}wnqI}0Uytx-(LvB~@i9+{9 z!U}5j9gr_VRtL_J$AU*Uyl(>!;T4h2XNIig#z)E>|9JjT^pN!G^{*iQl@i36}<>Sji^XM zmq@}Z#v3ZX4a14D&RUs8NUW2`qUMPOsu-$;*bD@4!5I4x=NKo^%B7IJ$_R|vr4IAL z;o7;yX(`?zZJ8wE8|Ixc$mFDt$0ISn)+w(RnH)HU@8S5|3j3=x)PJNTP!Z^TZ;nQO zEBX1#5!R0cSNsXPPObZ@U(qO8iVq(sVW?3xmOBPxe@Hg5ZMj6bP>{D=3&vQW5dXh z#WB@DTM#uDvs&3D)DK@>8y@u#f0 zH^;{HR_GQDg-|PYl8MB4r35;!!02cGB4IqT!5Q@=gCV`EslphGOP!9YG-TV!bBlz^ zAX^53wV^3pvb>}G!OX40WM$08NBs4W0nHGxF~27fRq8aNi=6MHJ37V53yF{|Mo5ek z)CL)w^sEQ={6Y&Qm(>JNfnmKx_52+3@TS1gg$?MQDX%H0Gbi5z&uT>AR;gxb!#&|x}Z5%7l`B?Fq zj+zWlFkgjm9tHcooF~$X_u*gP5xRIpia+A9Q8w)x0?#Y+Tpi14IZCx|zxUn$;Dhq; zv-_n0xEfH~!#mr(bqch|$74)dwO_L-lNJRTO1)4glEV9fYSg~I`2_Izs&F>1GV+H~Fh$D!gs9Mn zNn}K;lSa|2OCwiKHepi+FGdGLWL3hZutx3(1W^O}45D9}K9D3*k|UKQR34=65B_TkeSb{;zzk zR@ILhIO*I4!Fh%*{P%Lr%iU`(z;WC1V> zluY9)&WP$H@=K+aJ;}ICdxaEPrrL)_SUk}CbEh$;W&o->Ng!Gx zF^bvatdYBs8_+(3k2?#RI*k&=ynp2P6ooKa z0a(F#33zQ)$@z*Fp_xf|UHkolsGJNTj>KWw!S_F(REqw^b{lyabG|-msncUcFIB?8 zVRA=VnJQ`kLaLx66d(n)OwW{>i&nvH0d?u6vC!6y!sJS*BYHOnvo(%gm@Ju5gcUqj zFw#dRNLQ4|*${~vKV=j!LFfJz9*B|55nX=|=NIMMf7=&pk#b~V?Z-N+JRY9_e8j?ENd*#u`SW~cmAz+$j?3Y++~AYij=qk0l+vkO!;H0 zI7X;v#3-UyB;#@iF?>@w@<3byI4e9vxk-2cXRb$#KB7VJNWvC0CB=}`naEwrB&b)F zZz8CZ7qn zUX-bVYMNXHJa;a$8JoeXeC_oxQ|D+DWRbm9M1m)&u88IwM;;XlE8{a?z}T_XQBl4^ zKv#;rRk5=wr0kwu6)&rXW96x0kr!X!tjsCx-uBP?)`y>#|N3Vik$O5oWPq_CWcs40 zL)7)y?-Y2Z^nk$#-X!E@k)wY~`=N-Vi)~+LbsD)v<-&~dOA;8x;ccAasP+Q{6Y4QU zjwrl<$ZI4T(+v!Pd~Wq-fmUSF7~0)=#+Zq87{R?kL%H!f=3SiYD+8&#GNT_DIc1Ra zHn_O%rhCe$`jVM%Cn|ryH93WOK=t|a&ILJ)2wcKSA0cl$E*4_m6}zO`Znw`ImSkrvs*bSQMvXqd(!{W9+< z=BnMD2psSIV#YbO&IUr_%*{$5p9b>9vZx%mK$25n09WCd8H_9JUgkKG#6K1R!4@$x zQ^f;F;mjSPLu|zNvJWrY{{F96^fdIgjLYGK#)hVKNr=D>`vZ=zm}FaII*GC-WLHT= zQw(y?8u5m2eoS$jN6+dqwgrtvCyxx?R^;22NunpE`Xbvm2|mYbmECnzsH_4*z3H7r zQCGP;w-tl7q44i>bzWElxL-DDC$RqyQ!Vq4IN3iFbc+=yo;_8 zB$b6mf}=R5vU5-ms@@&7&U-U3rMMR^qj>3S8nXNnW+cVNd@hn)(bYFZFrXnW#syc% zpQNV{?ynT*e-jeNBYnJ}=*b8wYzf`lQ7#64760On`z{|L{q5D>>Q-L_7qdN(9(4_@;S$UD|FzRi4dkkE8#f?4o)~- z)C8(mqm2X{CV8NDtT;hiwLA!YSQH@lkyFFRAW4Y_ZXtXIHNlN^)-qn(1`h(*A*%Lqg;p#i2)j{NKxxKpO zNNunxm^`AfvgY@sL=O-1eH}U4^4}w4sMTD3)kS))i!WI0>uKxqKYZ)^<-dIUZ%VoQ zfNWP+7+thcOhgfa0=E^32o-FEx{M;Us?g@dI}0uHMG3DP?$NO{sTf5uq~oconN^jlS`^~e6Q!CkS~l(6d&32NP$LRP zrldU3A7+EabIg;QQ|>23rDur{;>BUI!w;d&ubV88E~}LKSq8MwDjsCdiaE9L*HjDD z`Q;9BUzsX}{#c{4V@mQ!dPLy_sbL$B(7P!^CKF9(7vS1@#=N^&=(&$pN)MRIu+whi znr=QPV+6y*%7ReA-ob(Q64AXCpK!dj;|`!1h#2UpyxU8JaJ%J=e)V zhP#2^dmc)rTB!`;E%F@7{*wHmulXXmv!x|Gdeq5y=+_=TM_rYFYVapug#cz06fz2v z%G@maGjzs%1V1V2IJ0n%$lOmAh(ackf{_Vf?L2{&ejw6XzKpDRq<5S61^Ptf3fD{c zp43TxBPw$iBP9lZX2d;=H6M^IA~H#V%%n;vjObF`WyOYw8%-!_sZ+|?_pFTlkl>En z&jT5LOvo_Ap^k#fa%KYDvmy5gk`noZ`;rIIafR|Z$Nn@|6UP!J(1Qv_hZk#D1Y?t zyi-2;{N?8_4MO7+_HlV5sk1?=6Q$b%`A)FX=W~KzxM9RnaOTq!rC_hcFbfGb%k7@X z@G1#1iLg}5wl&QHDTYZ7uT~5aj5isJ8mjx?GRr8Moqk;?gs!pg0uajp9%PcaU#bKn zXc>E(13`t2~mJgXSSdHU;2^wZe(=`5`Olv@_ux3)HSWfBK}ghhq?Dy@w51qq1%xq_bM>XlkHZV6c4c< zb)hQ-g7=*H=x1J#Z~M{r$|Ik@e2%BP!#}4Tey6B~L|5u;QHkUmlm^4pY)EV=-xV52 zX>vCdJb*R39JfwVY@!c}%)r0|ZF{M+NT4-6Q4z+zb8V@sGD)tOTc0#x^`??9!FHf1 z@5@GLV2=XP=!vh`bIj)Ih5iQ4NCDbXN7F+}OR2L^n~3Td0c8nF;HCf4>{2J^ra<9G z!^z454o%o*#<;75Vf(*VvR_+__=4S&PgjNdsyOkNzn38&rG0y@iZzs5B_dmb_|bb? z?UCDDcvmW)6=B~K>;2FB5tk%nl#9jY0@ z1)gcWEYnJZ%C>e-l_to5)A&iVfo4YAnf4sCz`%y9-S6ZkMPQm4%{T}mHDdW!P>4{i zRM1dY2v}%}2%E5R*0krNbv|~{8GEKhViYnU*b7$PmlCKXWiUNG_q^RS+#P~$NZI<{0r^KW9E@R}k$F=#bg zao`7h>78SMbeMMGJg^IGx#8W=9+F!8svZ(W?Ysq?f)hfc zhGXX>2dZj=4!yN%ro$QIpFpKX43oHg9*Bx9GVJKX6Vp~c1-^K>Ejz~_EX^5JLq9(Gnh+A1>R z*GDc@MD9&fpC$M#M3v+Y)dA$ZxIDYjV7-|w6-;m-i-U8WoDA(~fvB9!&y4Y9)k7~B zW8@8&{sx3F0(wrE=R`-6uf||18bUAk3n;%pU12GZhq{h3;bEpY3#T0tgiex=^p+W~ zDWVYwDk%+<{>9)JqArItxQQv@?2NiLy2&U%2O1rMoO((F1sxLhI=P89CA`+D-~;zC0mUnO zQ9FvD+?eUrBh^eL!Zc=7NX771nCG)2Ba78~1-E1)8C^#6$`O^$ZpmQ}urvTaB_npF zy;l9K?<;>jYOiyq|*36FXTEVQAzEaO@>Oh_aY~HWp}CeR{Ah5LO4&>Ok~fD*gbo2#hspyUn}7D*;x14&DLN7IQ~qB>(>T zobP$^Ir-Kfdbd3O(&hKA?(_p-Yb513ct`#5Ifj8OP@ORmlsSzGgBBGDL{}!EZYa7l zymshYQtBkx1u9_R1+sxin>lU)RLyZvLXH)a#;<|e?IZ$HE+5BU-s_x|2g3^kq7Jhw z?3XejZ+;B}ZboiTpp5{1h3Zt;$vjg!`oeK@nQYgnMBu9Ck_E&-Ji<+%7pk6c0MIBh za-7TWB*?N*c)7xOB{TMDhaUs2#wecSaztLWYufWc$T_k5c~xN9L}efFc@#Fd$}{o} z%c>bzDdtv=xc>7#DpvS9-v8<6vMA_IqG2Dk2e_=b7V9qJ`+v1I*ScE|`w^fqO>E0})UXXQhlZIyt)OuC_>QPGR!XqHa{tJrYn5r9>Hg)sUL|15qjJJkUR=tRx|H z$Z?uG)hbGoYlj&RjgjMn#Z4I{6O$7b1=_Zee-o5sN0&a~c*!6K+C)YMG0kGCqN{9K zI_*A-an9+AL4Y!of#b~s>SPo*#Ym!~scPx6nOLY%B?SWrsvOvva=uBlC71<8qGXK0 z5dEg#3>8hP?qRSR$hKo_aCzVRwfy0){i0<+pgkn5_rprQ>^muoVEBvNTkfwE2P;*A z??4GjujcXoF)WF2bzs`g@iv*|>fpOAhr}n+^7X#^iOO@H zoa{J=5)O~TWk1$0ZM;giNU7)MRkv>Q4;8duRk zDr5XX6qB;uonzc!bF`*`VZ?e?L=XC;PG2T9weO|l2Y=LF>sxM}a3bZ4{^|)PoEdQhW6Q?&+@N+#cOXRl^)HzS6zz#xg%pW zf55ExFTMa+1&1Ax>8up<$mH$lpj~-Wcz0cY@OsY)Z|`s4`>%icIr(Eh@*a8e`ck-T zCyW#LJ;re%18N?5Gwt7`oDmXg+vw*MBBC5{pvfRwrw9olii!y0E2iHXvC!8t;N)m7 z=@cf(+>FGv!C(@)8n0D2RSIEex>!!+kR9L|O$TMhTbQp?rNt~}%5=FUXC&4sr`!!O zmk1FH_ij*S5Z1sDIL2X=L8#Ag&xOlUN2X$_ia;`qEh9{9dXI`)rS~wpe7mgJU%spH z=8^o?lh#)x(G}s0Ca{8LJ_^ra0pkhFGG4ppG3J<~^pl zu?-zL4>xr|V?n8WFL=wy>B;cI3dji3Xc_pT@DnXPXKNrV0TD6<`!(0e5zQpt8d7Ym zL}9ARY|W5oP!}xfk3G#j%<*i%=qExEdta%32DDYxYk(u28>x*M-3JJ^yto^At`TVY zg$HxUcEtmdQ+GIE(u<*hYm(6FTt&;62Lvobl|ynMvpp!c+GT{16}V5@2zbHhg```J zm*>XFbCV`hU9;PzY&ipZD`HJ@MiCRC8q&FWKsHMe9q|OTuNnLo2C~r=lPZi#6_X}B z8(KKn=k(BM{FL8!DO6TuJYNu4bYgY*Sf2>bckxiKKjb_QzwZkv zZ?El(9zT{^c~Gn_1#cP7KWjzGxBk$(E=9`ab30vW0lU{xlnl4nVSmrCFRl-%bL0>a zq&FrSlm}04R`13z4%tze(3Q3TMI^67b8;w8ECb;rlYfU#57!?*uVn0IBXUXjvov_i zs$iR363Tzo_dzBqL`4GUIGyui45PYZ3_mARIZAJ)fm;U@1s$pM?k$Q&lmANV`n7+ z_U_b2MbS!zZ_gH=`LoKuT5(N|Mq$1g@G$|b!2jaUe^ma||NTC>ZYbuZNf?2*W4x2g zOcjn8skZUX2DvZQE~U)zVM0XAS*GO$6?jA>dsCT5Op5vsVRXty{RDBvhBY~m8Yt5A zvzB2*iu*Bx(Av!jDc?`imLt+jC0A{J*_iNbVC=;VI^+l#4$NgdKa-)8r8>0d*r-OW zuM|b)6+%>+O|S$tZre>{G_C3jJXQibqBtdy6(>?f_KzMsENt+?6YPY?$2AIx>pVJ~ zbK&J5lt3CQW^iG;0Y?3T2Dz5iEWj4Y z&&QvAQU1-p_a1rTQlu0RXGiu)L+dWf(jytt^B2oy_DThIflALzIUbO2&NoxkrB z?xviW%?1jbnX45J!~Cp*#$UoKubv}9t6ys?CEgJ?Wrb$0JcfMKgDrM!#?DbeVc(}O zc5XvEd{Jcgy8Ya&7t2by=bM&iuZ#RUm%aDjy!}zRzIvcZ;D+2dGQ_owU?U2XaptxH zW`}h|M=8@h(+Bc5E_L2@XTwG>d!0n{WK=tdMd5yHf6!gX(Gc$}zSYbPjW6~)lg%sA zzbkXz)PpE!s>F_akLkxss8_C6K$tJ~DjI&JPr$*w_s`&|?NGf6kRT?h7bZ&IFNKPx z`vO(y^XMHmXoQih0Z5pMt3{?VNDn}K>H&w@&M%nb9~nvnhA^GXh2FZ#2u?@|(`KKk z#Oj_4ABJkiFZ#SDuc(4KT@dk}Wja0tfV7MlfW3mf73$2PFUqdHZa@BED=L>AJ z5F@M@Ro{*Sl3blKem@)CLSniynCM-jU#GsZ!HfI#wS3E$z2=^d#?QuAo+N$@vm)KC zX7RpLw6L@f8uTueUdrkDF5W`irV+0YlGSB#!&2HE+^e~|=bm^k2>$FdFI>yF|LA+< zu@^3{r6DN=s91=qBx7`Zv*O->A`ZpMC^j>A8HMxd7ppdmIHrJqIbhb)FkL=rH(UDMS!T=Xi(i zYjkj>&vU7BJgTo@$lipm6T$LJdIMZk>~J~_@_bdq4xU6PuG=VPLz6+FMGq9sH zc!?^csHzC;X9&=t4F9iWcxeH7LJZ%{D4N)e1k8eoB<*mlvqo#imC?zKKL!BDd}n8ZLP zBvZ#3a4}RJMNKw0E7Vbkji2MeCm`b{-JC_cvS{IUnM6PV{73nt7!uWPB%T#&CwjRs z%b~yQe!$JoD~e&BmpO;O^gQzWzVda;sCFMH=D8)SZp{}c9)Vb?g;stEwyOoZ zQpzBf?#RR$)4-r8Ng#4T*|1Qa2&D}J169>BiL-gSXyLxWZ#2iU+P0oofqn zgL0jtPX4{qHV)iUMj+`<3;zh^K^%TBbcq&7JE_8MZk|QGTu`V1;mIcTI0HH1_=`#) zg{=b>4RwZq%FGV3L|>IR;}0XO$g}!fh`K^kDy7Ph`6BNZ1yrX}aIZD3SHdtxVkp$Aj5FI^H)8H4*;|;ldctBY?$( zd-j0A$nScry*7?4x!%a0+N^syCJu>Ge>2XHhC{{?XD*^H>1RBzU`&)^P;&SVf0PXl z=be@z)7^a>1NEl4Xqd$F%rs{ak^5=%Q^E02b}-&q!YoU>KIHw(!yN=y;ANCV7PW=1 zn$j2m3saUQMtWEgP2G)a;NDt5YNanipFa!JU6Fo_?vA-WB^%jrB)T!W+G62t5C$0@ z*s9A@oWY3Xq0rPW!sRoRnRP^yy54baBfP2~j(gRlS0xar_B{?b92ZE2rRJWC%EUH1 zSHc{z=HY17E)2Q8mf!ysuU*=CuV&vzDXyzvuT`hz!~MJ*@hH5^A8toH09y=shgh#z zSP}GAQ2dHGd-NIE!_pQ?|Jl!cSbp}==epx;?~t&93!G*{1P=uk!V$qaXXSxR^+_d} zO~z|EacM-_H&=y1qWYYS!%^zAM@ZPKt-Goyiin*hF^Ib6Y{5YwNC*+7KdW7Rmu-q4(=BrGKT%{cnL50vN!ZwsJ}wi6C1 zC>cFz%*V~5Vn^da8**VcTB{}~dm`*@uEd_t26onRd6&KA8ZHa z&~s`ozdohN04Izufk@+C^O@M7zZJE$Lk7s zZ{5Zl{JyT#*rLMX1&48!(bbL&q@q&i&bH=f8bz!*O*Ul1s_vx7q_}(_Z+;-jSHJG= zJ>AR71La7?a2wLH3h*O}V(q_I-VB}qcqC)AqoY-~>AOjL;Idfp5WDqsum`g@(emBq z>Qec^_kL2o_nn{W#Mxdf%Yc>}7v;1C=K)YbteS zsi=cAKX0N+DDDEzD+b9`hg8^N*P|v!g}f|yF7`23Na1af5UV}oAKQ<5j}QwV`>;|m z`MgzosucsH^ zTN=eTI2M@-o*03&&yiwQcjlnZ$Q4er3E`m0LK`xDgL(sE3riG2?P3|Kv)GHE{#b}) zu$gRB=4kVd#vvLYqfilR3i%8x4Z7WKbu<@=+?+5d4cwu;vrjlz3Y4zN7^l*8ntaKK zzZc_uWTD^5J85=uWCV8zJ5IMeR*@YUX*Rt(!j0k>ahyOTY#(Yn(E9=cYBBOd0tkWA z`dhT~3*FI`&aiz}9*xNx7T$=npPZTqf-ViGR5@b|*lx-aSzQLLq@`=$<1l!G<$2G1 z0F>OlOcLYgt3u~(cFzhrB$H$t!&FMN*J}c%c#sZQyK1s>HwG(3Ra3o?DI;C6BQ9+r zmn`4>B@f+W?QRbuPfD|e#L>vZlT(j8SL{K%a?w13&;3E?iHNpCUHPJ{y3JKF<_WtN zdOx!0_r==>o_<08^iMy0SqG=Vd4R&JhiM|kw0C9bd@9;|{+IkWCF0RlIZdOcP3At^ zz}LzcA0-s~tQtmKL(#)J;{c+!N;jN~yYb0y2 z3SacB&IX_0?2Y7Bq+CnbU6F0Qx02tVwm2ej_gzmsC;$0BepufA*z=c$>`H2TeAr0P zAh9dz!cdM1*6@f@3F;X{cW17z#E1m)6$L?=SX?_L>ve`@Ml=Q_tyYBmP1BL8qn}_E zIaq)F{@IIi$pX+!l3LGoS_njpVyP@mG3w|t0==)`S{3B|WE9r@u1r)Hi8|KSDjL7h zIiRARZv$~{Xn#VafJ`&Q`=(G~R~FeBRS;sEP93K$a|qO^ECd|fRS7$1T)e%j%s8Cu z{ICRZ@&cLgFvfu!A4<=uM@PD&;c`%3+-HeNrj!eCN$c`Bm+XZGV6$_X&YpDC%qULC zuj$ogD^{Q}FB+OQVDfHfoF-?6FmtPR>o({4qMLkt9vdzjdaJbOWPu_i^wAnT8x95* zXy9Sq4%mH{Z+^?`4zqn$vFY9e!J;Yl;9G?Nt|X8vJMdMonm@RXvUiUBRE`jzBkvV| zfgGtPR*s^4zGq)N%Xj?v`{dc$MmgKyCA9;Utb1@Qgmf(&gc72fswqK}g|M;0Cznd4 zi49>(L!A>M6>JRf13^_&ijAKN#u&R0!6}N|B)#Nk&>>~c0#!^eY=~3_)7~NCf%E#E zQUt?Kp(#uMtZ`uoGE|29Y}6v5mcd~mGLyqZo`&2q!ZCInqC`HK3|+wOx`FP@{L$Vh z5y4dwJ#7^t1L#I`qTVuaGL0Y&(^SqD6*gPPUgF+W`6%P&h&a09aQHkPuekFG=PN#p zCCaV}4UTL*zsv3)-_Ur}a#aMa&K(v-{+#invBy7uEr0&!J}m#|yB@!spLZo)-62_H z@RexpS=j&t9gWbnT#){)steKs!X$K&+&c23Ohz4i!YZ1JK8~fR1AbvdSHzem7LdaU z(f1-GO_aZJzV>(cF)PBd=`~ z{Q-QjIDr(+-`mWHtQh~I`=U^(7(FBntm$~~n1LHubz}=!LTfGa;36chl`!D&tX`;^@04A6DjP%}2K2w_Wl_4zMdCt3Pc0pC1tuS7C-nyc(;-@IQAXx8~#i zCqMlg!e=u8`1m zn0DU6aZ8+1U>ZX)p*bOGJRmPbFU6t7SKdhuGX3l0B%PvMnlU6ORw_`IJy(r>5Hute z=R-Cl%qiy#+6eK$S46Zfdr0W3QH&oqdQYFDIEN#o&LWevh`muNcx!XLlJ^*cXh@t| zc%%t`DmP4#QDh8-snAQjTR`F`&*o}FXrj>QuHH;WPSbp@0CnVfbl(&z1q8nxa1$AN zvrr8kWr=Z0AC;wV!kY@Arwu9~dakHrrq)1%dwrQ zZX>_?OZlicc{wtzFMvE@d=>tAgs|Ax?(?!NckH%+(4%pV=el^L*8aH<_7d|E*d;U_4Hh0-OBb0NHUZeW$2o+-FcyzAF81M834n_I7avV7?>~3b33yKoB zyvDgkNJFUPLV<@;4OG{Ce%c5J*;yQs1|%OBuvEwT9?wxwgm1#OJT&&-~+uFE8>6 zo_iv`QVj<2#9`W=f$p^dT&`kdeie;eRkUyhnROd`q#n14K-o#*Bc#q31*`DCqtL=t_?|~DSB|x-F|S84UXB2}Qpv4?J6F6HKPtAr z_6Uwoc>esQ0{!3q`N!pZ-|?6{_PN}hWxJXuj-66yd}#{p&Y?g+A43D1Lb9#(vmvQM zksvgd-+*q$FnK1FyYo&VVqbCj3&aot?vsEYBA_j3##DszhwBGx`mFAvqXfu6GRP5& z^fI9^gVJM+syffa#8gC}k|$(R#S#9cBH2K9+&XwDy~%Fxy&)?5wAjen%nu}pcP+hJ zDy;O&{WSU+^T0ahWpQTCv;(q&P#ZDg=%iAls1dc`7hVD`UmVOQ43!x~M&v@_ZCK;? z$CWynwa|y}_~InY*)%PPNs!Vp4YN^prpSUMY}WID@Nkg9qoP&IJH|^@eJzmvQ0HTj zOB1y!wT4<$AdL4aMfAWO&|iVfx%R9FMQ2b{DG3>-K8cCSbV=-Twk*HniyzbuaFy-j z4VabB?Y7AB>9l;#KmF4m zlBX^=aX5_>Y4VSX>IQ@ItvI{RG*ILB6QW*z)9<5#^jA9~F*sOLu3SurV6Bs#pD?R$ zJgNj|W_rNpNs#FW>W=l&eHA#T2bz%MB&F^QxHMsXEWY|aDkF}9;~h$lBOv2*`@AZj z3$GV%qC@owU9ilNYbTB8nJ<)K;1*>%)iTXI;DTVs$7l`pjwz;q0Sd#pbigRAqduXk z!6e65OiQOPk$@1L>kL`-BMyty`Cv@HN33k$?;XEKj-<;+gz?pA*Ebz2kCj!D_-b6V zDyCNGsz+c~4!rjBd*m}O%J==+-IHW~qc4gpC3Q8vNFJjHM$TaKP(G#ur9OyaGGxz9Dn2t{0s zibUNXqaQ))={AkeNcxHBDhpsR5^aeJB%F90Z!mzZ{he#fuiNEJ#NwCk#)FT<~+M2feR`RhoEb^DvA7z!-3f$Iu^vpb2FXX;BqlvYrw@MuqI97 zGo7FPo?=kG3(*#Ka|x0ej%ceH@%Hxz;%vcKq{GK`A|dR$)atwO1L#P|?@t&RP_?OK zkr(CW;a>4PJ?KqlMo^KN7@e?}0>)9}V-A|NC5o~lNHx^ym&6XdP6V`fx0Ii<7(`V_ z|CQ`Wt1HQ^ErRXkd?>ed>bN5m#*cW8#;LwIu=~PVuq>uLJ7^A|uxiZ*OW}}$m zRIHHu7m?G_eYlwA2E=2GdPZ=t@P_8;dyF8$g4<@w{YEt*S}&gX%xO;ql4a>U^|) zd=~2DF7=i2dwYdOKSo9#O>*Rbj3=44F`6fIJ=w&Rc@=im$Sfh;%tTfjgj4~Eg)A!9 zWhEGt)s0I#Vw_axle3ED!le6Pg%ZLNo&vkA0vH+>4V4!Rl%gSBgrj9KL4`^@kXg;1 z+z4l{6UB+A`5K06FARI4OcErjV8NkJYyEJ6rjh*FU)QCGee(zapTjL85JKC|qh!(BsJ~Nlk z@@*gcjQrU9pOByU;FI#y3$6OTl6d#klZRD^o{X4-#)}Fe4TPl?0Sx7bA zji%*(DO5J&=-44!T>g8U+zgs3(LOk_(AbcUEE8f=M@jgp3>UufL2=|0fj*qWG;ykR zN*ybRaMh>{Dq-Y0s@@Z4ktW3LoIzS8*%#qU93K?~ASM^QMzUit>L7M%6^DB@`6?vw z5egS{bHl7H+6Avk1s93}ma@fY&Tv{rbC0mc8YGcuC`m z1n9>mE5`n+a9DXTtWr?DG1Us~u?PK8vE*f%tAfmTjo!DyyYbqh=YRZ#N92>wmtLrp z;dc*S!#Gq4JNH61S3uD$&WFUk8B&exj#03jaR6ilcP1HRTFQM-af}D`Vuu$>5OZLZ z8Q0La29UJ^5}+`tl_MA!w*_3nt-#2_k;{}zccn~qE2%&{a7}$YVK(5+k2r%6BuGbX`Xzk=zPR!hY{_n52U4B$_ zq?lWcRgXqa?dP6){w!~Q^t19)4?itG^&3yhlP|UJf4h9dC#iR$n(AdVT`5eXy&X+( zLG!i?JW!yrY3DaB>;vWgWv-{h#N;q9Z4zYz)=x)^0ljT0%<(^Xjv2lt@5pAC1DX9`EhRG9`Lzp5yr&S1?@=eS5r!yBlW z!#%aHd)?1DVL?aM(dkJ5yFTnk(d&zyNL= zNQZVb-2P#jTxIf5%m>+te4t;GZxX?U36?N~L!8m{%r+rxIKHGf_4Ir$*caDi5{Scu z$+m4Of`XMELw%FO^r9f?U`K(}JKu&Zjrh({$(G@COV`>2n7+b9%lcsK%0kEHx%^>! zyo^m)kXUy{JZ=B8*125%{VF)p`k+CNTG&o+Wg)-vKk?j=BSN4rgpQ=qN0R0hoP1>F zwlaS^n)lm-+be=ruDu_8>UsHJe&sQdOXpX|4Kn8AM0{k}<_n#f6WwAXy8Fvxw@U{j z6c*IX#!6|fw^KA@2O6tYQDZjRTo)yT!uB2=VTN>3XY<0*Owh4yC7(-18agGrG;rHw zCZlg4m6D`8I!GMa%+Cr{Ex1dZ!JQm$Ciu7X>=inAMx(mHY+b@E(y}pS6Bx(QO_XOw z409Yz=2`$6bFKUx9Q<9b8CCt1QP7?qi!<6!^$kskL#}~sZl+ONL zFG*e@k1OAkRl#su;ONTQ-lLmG@e-@ik`FJm`}42-vq$B>d)r6)nk?~B*r(H2;K-2a zkqSM}NtDbz5XK0CbTp34sh|6Tn29dyPx!veyqq?uAkR?MB!$Sv_p5gc)H_7iTJd^D zQytYRs4AKIOjH~uqZO2b2!ect+_#_C?QviRx`E@!sVtR#SJ7Wq|uZNTW$>-%j3&FSCxYIgR_6I14bE_c%gCJJZv|>$U&cP z{(fMUjl~o~1-p9`4BfqtYK%A?V=LIvEzWyKEPM?n*e!-h#B0UJUS`F~Lx7tPGto#W zSV>_41y~ro6;6(7P?>Q-6fMUDXN8yzR+s_{ulq`VRoS1mz6l+D(XGHtLpKCQ4CEu1E+$t-pgw0}p`t z_z_?WjgcaY9dMj>Bzte>Fv@lEGAM!H^t-BR+s~wQ7XOiwd(2)7LJAWcLm5L6jZaLe z)4WcD*Mf=Y2;|)0%s>&tKsC5j2&lo|#-mSpNpGa{JT0~-L7o5M^vHjfzyO5-#pc&h|7jX@^? zq6h)`8Wj%d2{{(sG1hXOC>E(QiRHOY(>Jrulv`C4Z=AkJK>rwgn}Ez`aH%N3=)B5m zEbGHGGTjXcy})6*-`TB}~;=9N% z#Cg&e7AqIdm5kFr|B9DlVe2F5=1NKA35)h{{zo5qM*iVPJ}Yu{r+=Tr4~Rj0fUW~h zo$1teIW)&b7>zW)7? zNEJ18>S~?HIl0`p(1qb^xvHi3$l|j6u110`KA}DXc1%!lvU=BA7dU_ z&3j__4euCNEHFoC<+XB~rwR9c0)*O_7?at}mEZFa)wJ_?UD}WeE3j|YnW^AzQcwfPgYPo(} z^P{LD_G?0R98sH7mNRXvIafesxtINsWck!Z_&(x9j#b9n_D1T z<=6>MlMVXqw)wSc_}H#ax9m2Hj#&y@N)mx{(GaN$^rdaS6G8*C7)2VTljsVsFb*m- zr>ZvTcH}*rv@pQvN@nguzl64+PKuqi-t$-H0e(i&(lUO&@-=sL*1JkQUXk~Fkl%_V z>*bbKQQ$omtgp(dU|IzLu86PRAZt}ncp|TTPHzh5FM*@S;qU+Xw>=_ZI}M^6OrY2q zj+!K>q*W+=43j^V!%d=h!FpuqrrKQ7cZYEc_;1F+!qHHcc?boQq}Jt)b&}&~2Oi8p zNnZ$}8C511qhJG4os`0q=rSFdMGA9MNMKDQw!?3NMpePMW(G!BVB*sarVzdv#mF%6 zp)iAlMGZYPI3l2Dh7d88aiHFaq~~Xk;xI!k#G<5t*%{An2GRU8NvO;U!Sg=bHk!Qt8c9TtPK%%HRh8wYe+1vB?HOQYnB{v{lNWZ2&)KxUMPg*ZE|P$oer!=An^yns+P zYSGhaq*rzX1z9YN@fLxO<adg`nyXTXxQ56)=LOVrdlU6Ae`lAoG2&D~|LVLJ`&v zQ_4GOfMwQB0t^(HfUN4KDl>l$-#scJcB#Fv%T*&fRDo1yUQh(mdWttM@m1mNCGOrj ze}zC=6vgkwBQDo%*;%&nuuX&AV>Z>;Hx4T`-)$kJN2A#08CO5EL5IZ}c0rq{P+jv0CR_F|<>gwjk-1|+8CJEMXL{Oite+~kC^;|Y9d$T4d=WHvef8u>_tuz z>Iowip`Qp~Fct{v4?;67j6Eu%x)tIzEO8p7?5K2^y(7@G7oE3{q2SJ39D#uqzCeCy zduEqBiXfGe0v2zJw;Qhk)`}aUQl@};n<8zIbq-&m9#fd7fNawrYHE0IR8aPq1tBC zn6Q6G;JK)4r5GqTjDu~*Ub&iQ1gQjD6z)oBATj1<`4XWSi`&>&^jDB`NjVufNCHs+R# zWk);A0ZK$8i`-v@iWU$c)b%)Mx;{z(iFO=rXU@hsMZuxAql?*4$#qBx7Qe+3t-?*o z)fUIU0SjmpMT7Vh6o9Kbda4YE!(n@ad>bbLH_JQ|joE47<-R2?VFM^-> z=ri)mpL+gs$Zq}n?)LCR4UCjB^02BE5_!YK;MkMuG_xxM_$Tzz5gbmzD1Mj;QjDWB z3A6$TnBzc_x{JxIVsIg4yv3;30{n(zoKunr8MUShqp{$7WdSgQgXVjU;HzZV6q4i^ z1BtFQZJR_~F(?y*PEVNq4<%rnhitIxZhEhGNa(~+qj&;jjja*mC zqm}Z`lIZVTii|ftcp4~Sx3xz@iE)2Zot*m^CiY?`kxzn=Bnt`w0$x<^AJo8b{0Mxt z#GLzS=BW*lMpd<3km(d1Fp_0zb{VouMfe%^r^NFFO+CIih~3M%*Lc|L;__TW;8_<0|_Ta#G~7%X&lvS zrB)5aWSFJU1kG?O6iF~j0~Spci;Rr~FMk0_!$a{5?+}hXPjPmdeb1Jn7kn|VFTB}S&3*sYGd4!Iwz#FOU*F8*`sWur5seHw z?gQ#|GW);c@zX8j)s=+TbG=ri?UjPa7csXPw5>*-t0u$lJ>MjFM2L;VZFxkt`LP9& zkD++O1E45+s+iazxsjI+qguix-MT1KxQsb+j9whB?R>VYGxc|WqTMMwKtUoiQ?!4?Wf zWLHmG^dp>=<-R4@-WCGK1N)=TJTL$7;isi;r+HZbIje!A4BEDf@<3FH1{T{6Lf>Z8 zKUK5Sr^}?Zl}|=JM%nTRNE?T7d#n@2kwHhK2;!7!>rL`!1QC5m{U@?Q$hu4T;U}ai zsVsU6p>CLO$#kk@2fC3}D^*cKF=TQom`JSMA}qcsvqXoi-6BR~J%5N{aVCFfT8j%T z3wm7L>}VmqjQGr00MZqk0fZF=((r< zJ#WnJORin-0=puAuXtgrKU+E0dL;BH9C4Mk<#{`NoHsmpQj3M1O14ebYUr99} z*|-AzJ+Xo5+)Iv+jB6{3uz*0q1VZlpGx{mh?pmrbSOb}DN0yE4W`fKlM*2BKKqWDl z90Fl?3QONQCAuV)GKZtq*&%VEsjDG~d;OrMWHQXzIpv#l6r|KF5(z@ZT7}gmXLaLs z3HUD6I0_c41Vcw%kZ7#ZF{C7O!!RRe$h1e{u^Td2MOV?D?@R-tGOK77j@@LaKX2=V zc6t5X(>?B$N9q>eQLPRt7A5}Ye5jv2xI9^JrFQU#>TTW3I2A)yTV=e2?6~z(`*V*0NL?E;A)`7lJN#NvCwQgvaX_QFc6g%z_ zW5G>nf5CiN4`(NruaOR{VWNX&6!_$E^w&~nF&~vbGuOY&$egKEl4);Wtcx)X5%aL3 zA8Mz`3FDd2XX{Y!)iMt4063kBAaW3xvDLj);>^9G+&_S5OsD3t$3Y?t;O&HIxOm3r zkd%lV6p>-K&Z2O~cM#;>y<-3OZK=h#k;_-UMwV#qkxo1QSrsowXs6wWcGT%ds7JiA zl_F?W)bKH0-wHdT69u1NLl5BQ+qpAE$*f&O14r(2{2N~AYctfC(B-EDp;Z*vh%zw5p$*3J|F~|lh*-Qv6i3XQV zsUpm-%-ANB8Nk$Skm1>~!KHFXTzx-O_pwkny8RJ0q~8lj#MOA@v$JL3Q&faxrcoxj z3EOoAQd=mnawf`i#<<6F08W(VC3Wi>hj4;pSwi#c0H{H0LR~{rQJMNW5zC}Ac zT)a{!+y;NIB$8e+;YUcmTeT_*ALiy~`F>R7k)Bl-*n0CHc+cY!PN#vQaJY+uDxxqU zLbq`&L)Dcn4(#P4Gh1Q<%15sfhM!S-SuElZrXNX#CrQMq5`|%dL6v45Il)LHfLs^> zRqSON!V&V=fj-jj=S1%as`9FsF)#ia&Ecqk09vT~INF1JjE}03B~ww8G0#``%QPWr z<`(Jb1{cb?Oc&^OsGii&%H&zd40EJiKtFV467LH~!A!5NGwz_815{NSmp^>y6z}1V ztYr2pq+?~m#$v;pAFhG{SG=p0dT$kb;Z;R8C7plf3m@(gYrVg+0yy$f;@*Gg?l4Mh z2t~74=wIuWfDjKvp@;barR!)H3Y7gk#{5Oc69|t*<3|*e;}fDORCq;G5Emc`bW~S6 z0Ti>9q-^F>Q5b>AfWSsV&qJI6yu&sb>nTI*K~yLkei`{%8SgjAM8UOq#~EIuG0+U6 zjVTdEfoISTu8UF>)Xu+7)estfqE|YNMfbsTL{RweP%!2YW-9Z7JpKRg(GOBf3lt}T zo&)LTY;6=EgH7F2gV7QdC~m4LQrdWabg zQ2ZhaqV7i)Q0W^Y>-b7ATNhO-;y>h0xTPr?_j+(epD7D<_I{~km z66c|70R+N)gIonTkOwN!nlP*5X7E-4X||%PAu4v1VqG#lo8K#aR;r!bBI3P2igm(V zAvd?p?Csw_LOfQ+SE~>;fAHI)$A%I5vDeRj^ci{L`H|;BVjtCQI||GSr`cfQ;>ool zId6-zpkWtYj1{$YU`=G%mznI%!hkA(R=g55u}+sA?EvvQl0+Mg(yo}W&H%&(e|L)} z4~5@PnB%Dw=7HA}&4mbt5mf+fNH_!N@JjQ!XrR?%r1wb$HgiOk_ZettP471B2ckZ` z^X7gvRt9~}Zas>~Sutjd*^qcEKBS_ZD-LSQYoR;u)|cTs^v zggklNKaG1BsyVx0$xlgs9}9u_vcqYYDmnolr-JNDXWVQRH$>Q`$ao--iJUgPP6YMR zx2&Q`5vZ4v7=Gy%2EP-=b-@Ts7%qIq=Dn{h^h=l~Xtb-Q%Vwxkrqv3T6XuHiJ7oKp zI3>p&p(t}UUkn*4gh?cdh5^l3?HZ;nam|Re#%oZ8M4a9ckv=KZ?qlvAX#%vx8+;Rm zlTDkorAanCTif$I0_OVTDttS>+%t+f5+FGiVjjzY{OS#lj9&C@LB~BjIH{!A;DVUz zOaTpGgunKI(~=N-WQ}b*x|a)Ev)0}owqDKWS6ml=xO#4h{kun_p_R;erAo5z&lWT* zKaBS4AASFmJv6OGa#Dgioi-m8Ysp^F)d#>15sH=&W_Lp;*oL-H8B>&)8PuFDLe9J6 zy|Jt5$*Q@kU&JW|b-d-f<_x`B_2AEo@&sA?K z&Sf5mT125zqUw98*r=qFi?!2F)oqpTQCCkLR(iVV7e7{8icl^9N{QU-R7c=FY`}6q26?4^5 zbO2FkNU1GQhKe?@O&!z|3YYPofON~8A>ISb-l98hgQ#MI%sw@ab1juxO z_e*j)3M?3CP&XIca+?hjL(BYO6#W#=Le0)ddMkxb%-!)El2z(5k)DU_xgQEzdox+| zis-xQ1`nk0fA|NVm%eQXp42=uO+!vF)hkfI>~7sReeKgZSf3-3xs{yVotYY?ipSdA zrX%M@@-;sA3ycX94)?3G2B%L;?M9sQ3A79vY*_n==mb$5QOb-WfX$&cT#p3@W?V;KHAlHk@>~zH5tGxf^yEi45#-iYiFLD<1;EM@QM2}foe*Lc$I`Ofi z<$pAKTiFgo1<~1f)$iko!rmn-i0KGkGOZ#Uv(%|tAm$uvgUT#V0*C7ZV?+=df*n}M3gKD*MVh%^MClpDB-w8db7KRk-IY|2wr?Lcu#Gc>V%O@mR|O%NGs z^v*&jPV+z(D+y?(^2nevqDZ3Sg>!tw^(;7FI)2!;C5*2yI!mGn%cB6J11(+T6Vs)e zN{sYAM`M3XDz1av{)h^d9hL6IU==;AIO9@fOXi_93xZ3cb#YSTr|cuBad^@AXGjkr z^K7nD5@(PzlTdNcXIp&62f=t`g8`S9s-ZCH;H60IYPv=VKtT9jlEB9Ul+M1ijy@L4#+)N&7pWyQkRu>O?|930(=n|^ zFrM?VBG#@Xmn)9S${ycK72j;e?zuD%Nu5_nP*nD;crs@SC*QI1>wn`jUy(0ApR;ok zX?fxMS@%d&#p27}pQIV`CvrQoq?sX=Dg29$j)$=n4Mj^~H`jUSf)oypN5Mg^@?0^p zo|@7DVQbX_|MqTjX_K_`VipS}17VSJ#;TUn>e{c3Lw93Yeh?%ZE!tjG)^9^M5u02w1^66KG} z@BJ^oWr;j^HCt5dtVW)GPpl;LkwhB{053Q8YM@o9=88)af4)BpqMypj)X_h-A5D3y zeSXio-g>8L)J(bOMatxHGdr{MIjIth9Id2COUYK8jBy_bu9XE2(wGGWb*14VI3=}C z#aDvDg(!+zKcIo&#ZC?r^MdGWB~Ajo!?K=@fF>hDeRpBp3=s_!AIBNfyN&XX1~lU? z8$X|)k&cn+y_8fwO=VK2M4BLgCNqoDG`8eOz`~ro>1xZFYw>IRxU09Uxnhr|Q1J=H zI{U++Rw&C-sMUq7p#&aw!IcN28B}qULf*-MulJ^xLqkDAG$RqdC0WQ{W^l%B%n2c* z83%aAshXXR?1;GDC=Z|>9vqTmKD{?Xe4ck3b!CkTPkI0foHZ{FDXO)*j#V`GVUP_O zU7pNi)ex-=i z@Q5I(7h_d&1UPC`*W_@>DB-SJ6o4;Y8i*kU|9%51GYT5laAf*rI2r!`+_5`%@r9o zqKBSO7I|5IkHwU7j(yJZt2|%Dk8~mz#_!L5;>dgUnpiN6=jn>lqKWgf7;ns<0&BS= zL7O)4%=#1<6IQpcu8P)~wLH&vVK$s2)i!ZOY%qgMjDta;%CA+pyBeI|QmZ%1X!z=(e z_Tb@V{v?jLyJhu@*nm(FPV>AGGMb01tw6GcRxfoklu~k|mtdjGV*$~f3D@Sbc}6NT zSnG$m&p>I4)5HtWBoKLPS8Hf;8pNe0U)<%x?t!pp1NVf%Fu7ZC*O-0@#(b*nCK&RN zD8F^fr^LG0WyLVU7}vfEEIXTJ`@_;7q$^bd58^X!%j)OGuDmR6HiR>?inICS zG5+d(p_0;u{2ai@G}}WLLxipaLD`+V>P~VdNuJ3ZQ0cv=I?UGUC#r^%6m7BGDTbZUcF8BdeVe_G0E*$KJmy=FLG@VR8i6 z`c{`%J`tS+qr0w|Vh0}kk$1oKg}vjsTG2V#U-VI?d?xwzC{5(KL@vo{zpVU_R^uUG zM8$pTi=kDs5l3Gh74jorhPSpP8e<~OGRii15zXk8q?Q%Q`G=@-bniOp-m;Aob4fPh z7gJkaRRJU#$)Z;V)nqttHy{Um{HfBz7zDn^|G|x%`z#MMH`z7i2QX_ljA%R9kc;R55bByQE5XM3g{p7?ZFH zZ3_7ssZh1%R9$opke?<}l)5>K;p?@*CGq~xo5A^m2h!}|BdS8j!GxJ)N#+mJA%Pr~ zv{0e5QeKMR%wenN(1?I74Pj-ceE{GR3xr|DbKmiF9dW>hO# z@QSk%57?+GTK$}O`1yk}7B?}Y=%JM5H?zw3&vljN>@R^YKHcU2{oLzgv+^*jIHV}Q zJ$xIcLoB4d?q}>k0w_N(D8}#dEjQ@`1FD42n3*@s%3@ORalmvZm+fkuIi-!8mkVPb z9s90%rzng`U<8WMjvYkganXQLBPGOKYRTR5o)XR3-m^gGhy|w3TC{9F3v9eLK33O= z06w4AZr@LiaL8|e#8`!O0STM9F=H% z7g3wHX$BU|18uG|Mj*RpToLWI@qU-vp$uHH6cRvuT_`SZR{OoD$jhzb)>xsv!| zled~jswCb>C9a`@%;*BO(qq_DLe#dHg2yk|;SrInGTfZopLhODbSDJ7P3!Wb`y3tT zQLyZ@up&Iybv6pf595}3aCDV{a+W%}YQT;p=WW@XbUWZinhFj0Fq@wR3AmIfZ#dkm z$~xyL%2(zhwy7oAg-NbVXA19$>*cB#S*dnbUJ++rDUtKBk~qe~#~+BROp_HSWo0ZE zc`hp?B_5=!wAthDfA-hEGQ3ly5jn}|B9dnO(0ZC95OS^N0Xb#)I__(f@*C?vtG&Fa zF=2N0@OLX%Rm5EdiKZ z4UTkp2o7Y>A(mFSz`&|mqfk&Rkk>YefL82`q8qLB#o0kObe$!b>9LriWkBvGfz}aG zp2TxSFEt_n^LjB$^$v1A4dIdo;B|TF{`)`vp08VyPFLf^NY;+A5UboRPrmht3YmCNt$xa?5u&Lom5tfE&cbk!iaWaB z*2k3fGh~*@kcH$IHi&`jm=YGiP~r5B+#O>&-!y;T84uMWE$s{D*M#!ChXUu41+z_l z^2Zx}!F--@H%;gWm(z@g3#KA3sCd5;AV)%5d%UwF*%q<%qO9|#hHx9Khk41UbwA9q zq_ILy_FTGi8BOAHi_DsT@2+5U>LU^|C-mNy*7z$4Z$viEAm|mTZlwT-hH)#^L+r$2 z$XX=yuF#v6!Bj+2R{knya?-#3`8Q@NsVlIvqH>}a`URwH21YjFcoA!q5<}-T;w&T# zd8n57%Y)=7R4+K#GDaJIGq+^j|CU7MwGA`r9SeFu$XcRckHOQ3>KZC=l)FJAI_w>d zl>qv=<#Z#Dr(#H83{_~)%{AW5>6Nqgp3EknZ%A>YvkOqe&Z~&TB-ihQZ_+Au}`D98@Gj9A12S1Z-DHlC1sI8OS zL{gYHj+(LKM1Z(x#&-^`r4`>^E3Ki{70|eUtAex zZCOqIu8=Bj7|9IV`JS}98pPlCZHF|`2%HIb2sBO z`L2jt!8U&qRuPyfvjM&MBzj)H zPCZH$5XYz-d$N!rk$adX9%GwkD$OcBGQmjNEm?YUWk!`lfw=ER@^_!AQF@|q`an}r z9f^uLJd@x~lepoNQY`#auZdQSw_)F;#6e{YjndiJ) z=ky^vhZg(Iu&s%vpu((xj(H$@o3h9aB-@>w4jj~*Dvsu5P&Qj6n{aM8hly8b zInsDgB3p$HiCoN-gmy?pEB#wYSfzp|+2JkfLje+TcP4jueq6*m7g4&EeG8OM!>d9l zgSOzbY#>1gw&8i_FI2pBxxxywU<%XC&&-y;wli7>E< zxMYjNXn0?$^EVm_g1y0$$W%{M1TsKP5k-!3nhTZ_XSLCpVrwbL5j~(ag8IX7?8RVD zAUj37->wpL0m;2#tb56ruU?%}k z=6E(tXXco-;9jg^=32ZTHyGg^XU}n@F+!}NXc=zrYK1SFPscSsP?>H`Mso#_-sdE= zCqq>pO`(!WGNm5@j1TOh?D#+&2gR}Rb-vF_VH}oC38qzGGo0v9Y%)>KJ9)_OAkrlz z+=+H+JHx{|!^n^m;Ru6VZMh`%R2keAb>p0!bQzAG&Fr<4nZ(gxE0cK0uEEJCdlD_$ zIJ4*C%^+6Nizb5*+0el^C^zUh$kg5ptea$Hvb>MqKe_HpDdCylL!7UBUlU&#tau*& z@Oub;ULCOUkn?22RYuUN2=PS3v*)!U*ZTM7C`y0*)o1tXtK6t~X4g;jg!wbG_)N}e zQm_{1+}*fXL_jJIkloF+=|)Raxpp&_fd2`)nyl&CfN#AkF3?GihLVqzhY_3SiIBmc z&nM23_nWm65rl;q*yT+HvK)~;5%>Rzj0ljC5Zd) zjfRM4inT~ejiaJi(63OAi0-UVPycTt`sqpM(dQ_t{-TW8@55K0?Nio^qM>EFaZmmh zd4}X&adbh_>jqSd3JuR(av{S7b9;R+h^wQv)d=wVVeXS&O11(6Bod`xUOa5b#p{f<(=17`s+W=3G z8LH6nHVx^r@0=NEm8IW!wFpdhxFQR94&xwkv-~6m-4CWY!{qdGNqX5yHZtMp;>BES zI~Jf1l3UG{A3A7OWZKoN+7kq$!Y3Z!X~7bI2%?TC&+74ff#Qv>ys9FOzTzPoQKZkl z@@#B$Wx+#6yunnDYLHPx^0^&c6{<^|XHW&fwJ_Lh5KgU2>*gb<93-CW?5aF^(43=W zbA&tPA&lR1qL(+})J>ny(d9SdmYdXR;YlDUe4vvEgC7oh2=MMOMa1GKVT_z{5 zCVEN}G4hnQ`Pl%ir-jttUQI{sDx`Y7T6D=kt=>oAWvxcx70aZ7qmO?bIKa zGc9c`8!zbE^$^XR38Oy^=5B>JBD!K{iLe}I4Hm8Y{POi7%mMEOTlg3Ycw3$l>yAP@`lW06>r z@jPl1OF?x9UjrGOj!4cT%+YBh7VU_*o(S4|2E;%$j0O4J8h1;*Fzs-xG zfYCf{rCd1UrFaFyS-iXdS^lu{P<8A){b9L6cl`5>J5{5yW z7dU8gmYh4?KMk^F;oE3ok2$syx3QmmO0z=2*heXm6x`JnmmH2Qxj2DtV@?4g!pnq` zVD*cUq`T%PnIlvpqD2dLkPVBOOR8F=Teuc2*Y|ECtOimt|6FiB9PjCs z!E!iDSk#TP>-t>&$j86&rhtf}(v?$lRKY!z9KH%LT#?~doRk$mB?gX0Wl|*EKa}TX ze39~kf6GdC9nn{pL}G{=xF71k{d*e0HXT z1$Pb$=N;ZAgKki#y#kO800wp&bqS>Xs8+{$dFu; za)+y1Z?-vNJyt?2s=rtD$w9^%h9anDG1hwJi~oI1^tL0lol;P;^8{R^fm?nRTTw z@`q&XI#;sh2qi~iVDzGhU8R2x5!oRk^UBk!UAB!xYKvg+PGfu+mTgpr4U;!Y4KYS> z>xbw`LRFC5=%%`&rnOteTx+H}p>01Cg~|Dn)|K3+ggB%Zvxpf#Q^UtRX^L*FNqJK{ zZWCJ9Gn1=QMbpjLOpkLpBJ%l6MPWWiky3%BP*}-W~bSk zWu)|!ZVqZ1f6)Q@qCBqdQrYo3kf2^^ZNSU8Ugf*K@g@1lyWV>0J>(1G6>7QiFp3-& z|8JwmP$aGTky6}Se$2GWx;hIGjr-)yxLuJ{yCT!_F`v{45mKC>X~pmup-G~jFy-(o z)i}IUcFn%Bzw;3)wHd#uC6`!^!dK%=P}q`KP3718`-E|5ooGG<5E-!)jcDd97B&~& zNgm5+h_`G3m(@l&O^mN~+!w00!979_O~Gi4dz#Md%sk4>4Z_HjId@&}V@si~;H&VS z%`W%uIXshihvwe(?C9O3)sKfvOC~jg(NKU~!3)`42cz?QC5B~1I0VpD?zH;tgA1Y@ z0l>Tpd22|HJJ|63R}?(Q{pc6@sNkz*ItWbQ3Q{YJbKN|uaWw~m8exW{nfaQMEO{^@ zKSd8m{Ls9aze95iX_#$^#dPOv37LXJ+r|Rjq-YgB6s*WSD&Uns=t!UK?Llq{ZLVukMhJMbbIA}PS zC@1bDsXH|c2~J#xM3UI~C9GFg?ZuH=xv!c#^yu*EbBHPmA)W&lxGO8S%HA&BFBhgj zqr<)uf#Fnu{Iz_`0o$A0cw%hMD`vQ2WAD6ID~>ys}WAXXgb7AC*Bv<}21h zrP&cor}N{iusfh7zUjj{A9Cb`6Kq4ll0dX-bn_I#-?#Jrj>?_pPCNJ_TXtPtvK)nm z()0ou8XVg;=ADSjq^ooAZDPpHT*n!Z|NX^veIh^g$@ed4dVQH7yc!9`|6(D%N-{q~QT!NY zg(Swu^r)goKfOEd8JA@>=7}haH+_pESN_~D9eg=?(U7m<%qN;MYJ+S(LCu*F4jz+A z=Sh=*I)?FVVyhmi6~r9c#xCQc$w#{UN0Rk>1+Yj(DASxs@jW=*Ob`!|CLG>P%|W+6 z&blcvZh~}HX8ky*dV|z>CPRbl=)w^Rv2RYP#4tIM$C^W=`1~l%@^5oNqf}GjTM_0;7AdE(B(Gw#2o~%-oS0vqdAoKf<=fe({yq8t*;aQ>fWN&)# zNV1~4JB|~{dLDkJw0)3mVH#Gv5uYLv);%S}ynE%!29h@a6CAdCH=Fk&7Pxi+)O_dM zVvp{K=4cfKR&%m^CJ-kaT(y(OlGUv3c&~Ow0}ztus1(J_4#JBnpfYoOXxk0sqnbUs zrZKzy+~iiiKj!g}I9FFxxvhnKl7{FA(Ev!kmkf(M6dwgM{-WM7^j0x{i8(%M$X-cM zBej|N^8Bg%*hk(Y?|a*Jg9NT*#b-^x*$8vRQ}KJjhls8`g`$1H8R>R4ii%&4oVEBk zk?8w^s%OzG`0xGFldH+dlL6x!&;nJTRMDna=$tC1#8b<7vFslWuuNts*kB=%ya5{| z{2aH|q55h-ESj!CHVvAogPgSl6-~zLj6A72}zKpcE_GDDxK-d^#@0#$i%5n=g7Rjn~N<4nezopE!1=FAR~| z$HP%khP{nFXsKO99qiS{m@;O;3%}wGRnyjPxhX?xOwwtCt@oCUM5vxK(3ZQIWaXg@ zgd)RCh;rf!x-fCdq>2uWxhr(+90f&Y)jTUvwczG_9BgWa3U1)IXq-4rxRQ~>7%$Jw zSHOVZ0cSEDlV)KFp=jAubTG5S_luD~RjPcyia+qQLw^Y7JvoT2PZv5k9k-IYXX#!;?iDR$ih)8TiOuuk{79G;sLw;MUUCyjH3K0g7 zs_PEz`7zK6_^SCzG4Z7^UbQ;s}-&1#(M>ZRDPmd9Mirah2j=qiRwPI$|u2 z&*h@T_4%1yb(}*|3d}752rv($t}(> zCOL9w24SxwcDe{z{`33CMZV9DEYnpbwzA8xKOf-Dq^$9 z$;B~wSEmH5B=bjst#`^K#m;JXvbK}jERO;Vhp4#RA>K|@Y^WW$5Q?17^*Rnw1j&^N zY41+YpnQT93}G zzBdwsU%C{hS2a^KW^|Cp#CbVKE=O^)*RCp{%=m+51+QHU#r{rd)l+$dknI-;w-x>~loW&eh z;60gy%m#m_rrevO5IZdMKmP7J`M%%%^*1iBE5*!1A%hVCj0oXsl;rn`_b2hr%4fM; zs}X8c?Zv(2k<;j>a@J@>_1wxA>3GZowfO2`_(mf@bX-IjFL|Dq)#a9D-uhys=&ZgX zN#hU9bktIb$9Ns1MJ<|3wy`8!0JAFjXkl-Sa7j)UoXu81aK6uk;;aU8nvcctJk)QL zyLURgRzp45;cp2=6UMMRiWI&ydjD{&Jery-nrsq^Ge3u<<1Gp~)X|#xUR04ng;$)g zqan?FBFXR-YThyUHhb)Me4$b)|6`(T_Zo1xtcvB6i~~2>3_ZhtBrAcit2=A&=9NHY zgC`qRLZgtJ?R4Bj(Q$nJ3gfumth;J7gQENqu-%S>n6cSSl0w45ITm6P>N|`JG-CX?NZj|T!O`*i``7Y? z*Pkylc^;ZedxzIZ(pw!wt29>+{rV1W1#3qe|1apJA<#$ z&2pRM>)Ktu7F24RI|L5$YU=#Hu7-w$r>TI`kUy?*$BCk9sNy1+L7WWkOmNb*G}euY zvEz`Ody53}<2}3+my9d)SD9$maeyA7gcY2&iVCWTIZ{`bV%>504=w^;z+u+MK+>z2 z!iS&3-~t^mK0_dn!tB_~_v>?i`b7TBKk>oYM7fZ`h#JNVJ|cIk)M5VltibVw`x#;x z4G-hdZE5Qt6L*gPxZcSIS>^u ze~hY~)r>vzQew9h541D1V>RzyLEs)jUMYlPFk8$aT0z;dz&V5BV}bUrw`{|rx+Sxi z=1iJvAc@?>zw>kIE`gg1s%oYNpxHj9%bHikOF5bJyqHpdc4T5Hu}aB+{FuC^yOPY+ z7G3E$;4!D)$@0gq93ke8L);PK8~Ff7A$IW24%4Rt;?`yY@IK}I-4bEvn~(?cu@&>6 zVQ1z$WGa7Jb|@D{NF|BwZ8(gwx#_x>fku(Tg^=V z9;>^2`0He-eSERIa$jCa;8%NLMWBsn;Mp2IBcHGKL@e54@p7hs^TbV0tvbq+2 zAeI+1b5nvazD9C;=cpI&8=IYD4-st|dt8zHu4q+)tpWuci9TOAYlc{$iXuplhfIqO zjAXT;VrdhVARBui2_P%+f187H#Z|owCTt}5;7}T~HN1(Pb8RY$Xx!8RA9iOu4>vu9 z1M#M_*;0=NH-qd*u4I?C5uybXo0m#OL2zX>IKIBqk=D)Wue8x;f^4@8h#g)q0>Ux9 zD>}F;!+j92Ujou2)w*}Pyt+Z;AS_<)f9U65-*1#ID~|_H5RA%$IFnxm{>8)6kAQpu z;SWCFd9H|wE7#aa{EJ=PnJHHElJMwCB>R5g<-1|1q>kPAjJuOkHXNV=a%dAP&Np^n zVyK}f-H!BPF#o_4;__q^A&noFm zt`p2IA(Bc$O2?aa+vF9nSh9orKpl5L|JlLeMa;2Oo<5O(^Pl>Vk)jvDfM+9|$ctKy zMI!eq@=Rh%@v5kaVTUWl(ODp&AB(PvnblrfDfU(czb}}MUw`FGZ`^-wWuA33PgDM# z=(r_0kDSf<0{A`E_}UquCl-9!;ggeqcy16c&_-aAcIgQ+i`9g2Nk)o2iS%rs@3JY* z63p2cAz_LiYal4LV3X2Y*BBHkOw~lL;Ir0oqj4t-j0{Jy?|yz#{-yC&HqTMPw1e*# z3p_p-Q~XThyNsVR?pqp?;!ZmDA9*f=OkB{YKPE(_k8Xz{U)dlkVCEYRb_-Ox^`z)H zJxlV2GZyTojb=wdFe%B3j1<7;8sQEUqi2&r>gEK*=*d>p>36a8=9J9jDWkK@D8|O~ zS2HNW|2`7={NcEA^^C>GDwNH?WBIG;|ka1bmr;+Mrz%lRi1$x=5@CnE4&~;vLjN#N-;Z& z)?K`uf`#kK;(t$bZ&^QN~Ym(y;j&(@X-9c<4G%lTMu`8@h zWTWt)5*E(nHkmY$ho8`fU(KZ^>POF(isy6fMs)W@KSG^V36!__oG#8$R#Rue*P(2F z7{?7)%&v+8UsNWbs60wq{ME>m9GVq>=FIplqBik; zh$G}^0I3;TUwNu>|KVH=UK7VN#YJ z?x9ChsBDm43O0SmAw&+zoJr5zgpC%-$`==Z577?AiTeeD;;6H$Ea~ z=1o!RxU%_P1p@k_!WR-TUnDIEiBTHu|K|_YmHAslS5~s<`21E8^}a(qVBT+i=S%mU z)~-B;&ScDNBS8`KGSC?>Exn1vU__Dp>m&ho@GQE~IuwNw{g1@eMwNijCj>Uu)nxje zbABX0ZzwoeNb?=Jx-dhI9vOnzolnWwhuxY7nl4gqEl@%<*nVG-3DmQN3=Rd4OoWgY z{lmA#$+v0zn40BfWym=-gQZ*U3HfB5Zkw&&@V+QfX1Z+WXPZpc&v8_v6g-=^6lU7f*NL}+KH&jSyJ(8T;iLB)%V2$SsX}t+ zle0?L9uuOnC-YUH6K6AJC*UX-(nJ2&qk3)vUY$e?wtIc#>qm0vX(uYLDJ^^rA)4QREazLuv7k z=X;mUI$4V>5}h(2O(i9FH6_Y$5*#+}Bkalydot$v<2_78e)Y?5ywLr{3z`RPL>Z#m zApSlU39;*3#l5d&%_}0WM_nQ(#*cdIjP3RKyNf=;8SQ{z`vCDu)arvgOfUght4g8Df8m$t@`)}N7?N4r6F@DvK@#>u$ zmyMBb>T1uQT}T|K0VMflq9-PBn1xj1Xv-38mEWRjs{0P}*=zFWe(+;U6zTewXmi&-gwU_vx`6|V<=2gSsQKDZx5S9CXb4g};c6h2B zpTQk`tA+&y5H(>Q8x<)Wl>%Lu=ryJ7hA}TXmCNcd^3*a=m&KH)^-{J zh2#K^!Z+QHu6Cjo%+V@YNBISp&EZqRD2U?$b|5bsf=@dURl40`Pi8dE8wv_(Cfy$I zp)+8qZhUnS%S$TA&D)YF+MB>jD`L{=855HOQEI-SSk4t$x0gat+L%=X5iLQ)X4b#|3CicQg1c zdk+VbEnkWe;W}pT-6Jw$sjC(1Kck>9BScf(^=4AsqnMpuKn(Fq>REE#jl)6iM|Jrt zOfSytKw(gqb&P8{IzBY#rYocMez&jd_(g1_(E0AD$^1A%#fBbjL$KL(cQ-d_`U$VO3AIhsb8wl$Fm zD@q6z=P2DE(cwiro+F6mg%#Qau&8IYVc*FN114zV-sF=`7Vw^Z07Y}SEa_{^V&tqek z*)5cliLlyj;o!Mss~IwoA3A;V`=(4D#gvFk9yUU5PE<@lMFY67B>TN4EvprQabu3h zKg=3QC}%VUFB?@y;ec-F`tYevv;llL=e!RqET*L}dILrQt+^#cn?urk#8gcqx&ytgUAr#%AJ%V{= z{CJiJ7L|1T8DDtgxxD(kPX1G8aqN=q#nuivNNn6X-D7il!MlA&+(lC_9h~Rl2pO4Y zZ`ScerpkuoZ+g!_s6gL%Rh~f(t^Qfgb#}uYGYSJWNm(yWt(vuQ{$txJvOZ?l*md$3GIg{FKnkE|JQPUiNs1D{rkL_!C?}3*K?~oE3%1`d=c(lub+#nAT0b-#UeknUCN*ni!%nH0 zuT7Dp(nZ?W3p%S^=q@;=qDfON%~dcb^J<~>J;yuZ6iiph)d<_~NTa0DTgm1?tAU1a z?o29&t3xYKp35;@+)6@a)W}bhw|$^l%~RGuUt0lI!Q8QIw18SxI{I3YAG(bnJAwLEViI z#XMP(`&AOn>!@m)haodQO1G+oBd`o_eja=*ka&pg;D;zr3@~v8W>2MCM%W+Um&t)~ zE~4GKxP*?H1({xMASXLxr}4cSks-7WpFe*<_st6Z+AMJHI`ZwG$e;VckIKt;+cG)) zp|NLlUXJ{(SbTFtd4}pmRAc2=wBnOIw8tWcYZWQsQIObttcs+wg30f$ufhjQWYis9n+{ zLR4V5qh>c^bMjWrin=)nZa}Yf4#AV_3`b%yVCeCoCNQB{$tRQKRz0+BXttr^$S8K$ zZFc2$OvOO$PIk#dn#M!uo`)$9m|llmtkU1bRjq{mCz%O+7>kmgQcEk&(Um8i+gDie z)3|6j03PVgNbPO9p#(D0T}Ly9UUhiFsCN)uaS5xYnfLSezVQ0;Fp1-qm08njq_QHs z#xS*2rx-^-o(LG9-$6v?{h&qor8H@NrfM=E{ygHW%@EteT87g@grAt2^jtWOQkkhJc@Ho56d}4y(J_W>;v@If>GYQ(%b2L)Y?`HLvXJBcXMb^Akz2@vx54<7oTsXYNs+ z%q}jXDzQWK&nb?SR-BfzOCuI&KlG9JNZPOC^5^@%OIM?)U6aU+^*@UadR~}OAW0up z8BAu*$4yV!>`uQO%6r9%THP;#6mTFCT{%&hEo1FpFq$F{gXGfbPD#Z;GSVH^G_!`7 zZKWazv3woxnETu{0DE)s5_nHC_*(+g#hlHouDH;{oV=fe9n=#&!RXgr1QPgO)yb7Rn z1aURySp|Ydf0XF7dp7=wuF!FR{onuSwQ)Y~Z0?eas1VD>DHxA;6tEI}U54`I+JI7~ z8;58iN|F&W>G&JjL-H^gWN2-7E25tavMq?mNL?FE3PP?-Y<6SEEJ?Gp7<@bI zBeJvKfRumUmvbXj=btoC#$rMWUO4LM1V62WPIahGol|eeMkUdHxVIn9w|#Qw1R-cu+rfi#GTgr5t~a3KdqZC29QhfO;91o#*B33yqpA;g^L;f=Nv(X1GTA zR|f>wY4-silTGJVajpRt$;xp-3KYYelALFS)*FJPk-F#kBcU~|+ zN!TfG7<+Ay50f9mTo`6j=mkN7vA;wRZ$A&!tSO*^RM@F`@6)X`XNM{o$3k;+#C|cYywgDtwhC1Ikwxja|z)zr_K7!7TOk>-AdV@;9=VBQBftJVQPvmjXGrPl?^X@N>ieR5^J=f3 zk%uD!^>;q^`uJon7)=u~NHAa9H43FE!ots;w)PvW9waACPF7WVQIc?Jbv+-=$7w= z=G8qa!#8wx$D4U2yw%Odv( zOp3Lv9OON)x+WTeoCkJ~g!9xwobH~7Z0=Cg)TXo1y&D`UL`ypK|9L*oL^d_K15IvR za;r`zv38}9G-Ko>bFnLSnBuISiI%g#e-l`?t&ROmzzj)u(#Qcre#hoRh zu0qyUv+Y%G$m(aUtij`~e$^qy!+(Y3cy3En|3uf^RT0I!J7w?$VArR>jMb8rF3)gQqr%n?pZ7tkewil28(=}BhGFzXC8V0Pe8E0 zlI@~qAzhLYz$v3t#LCHjQ?}eHaTi5JGGZ4~p=BgJ?+rylF-1)iQ>yiDF$CPV-hsNq zM}|cRy;+i83JLxux2d(`4B_YrU8NHk=@^=$uX)Lt)cn}b>^jHg_2dotcYptf<)8dr z?|4Cee0HIGN$_g@c&=A0v{wjC+?R306gesnxyVKiN<=JI1;?3c=phrh`1mV=J1@8Y z=ku>?^CcK{Hm3^RaPd2vXZ@@XMdMM_U!4+jobPr1cg6l1VULHMG#3CBiE zpv+G4MfUjU$deHWdouUT0j@ar!vv_)d&FcYFYK@@@(Z7R<%I&m^ETq)cotq5<-oCn zT0zO)Yrds)8(j5g|R};6So@SS1CXfa4W_mx>_Q>SP)g838`O8Vv zN_$k3N2LohHy(`a`YI5R$~+Hlj&8qCurMFwA3|WxLxCG-6f1!BxPkWCm6R%ue=A+o z*Q7c9W`!>dooxv>H~64jyE)}n=PkjGkrvPlt; OZPxhQu8{dMW;-evIQlQkzH^h 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 z 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 literal 0 HcmV?d00001 diff --git a/rdio/content/contents/images/icon.png b/rdio/content/contents/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8cc711ab145255eb8661c9a059b4840aa418172a GIT binary patch literal 60731 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⇔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 literal 0 HcmV?d00001 diff --git a/rdio/content/contents/images/iconBackground.png b/rdio/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..0585a28b17fe55323d89db1a4be8be9e17c6a09e GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoJI dWLo@^XJGlq)Oavt$0eWygQu&X%Q~loCIE&J6LtUq literal 0 HcmV?d00001 diff --git a/rdio/content/contents/images/iconWhite.png b/rdio/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..1dd84a5151eecd15210a08bdacbc216670291423 GIT binary patch literal 6798 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 literal 0 HcmV?d00001 diff --git a/rdio/content/metadata.json b/rdio/content/metadata.json new file mode 100644 index 000000000..b86eaabf2 --- /dev/null +++ b/rdio/content/metadata.json @@ -0,0 +1,20 @@ +{ + "name": "Rdio", + "pluginName": "rdio", + "author": "Uwe and Enno", + "email": "uwelk@xhochy.com", + "version": "0.1.0", + "website": "http://gettomahawk.com", + "description": "Stream music with Rdio. Premium Rdio account required.", + "type": "resolver/javascript", + "manifest": { + "main": "contents/code/rdio.js", + "scripts": [], + "icon": "contents/images/icon.png", + "iconWhite": "contents/images/iconWhite.png", + "iconBackground": "contents/images/iconBackground.png", + "resources": [ + "contents/code/rdio.png" + ] + } +} From 37399a819825b766908eed48d3dc2e1288d89f3c Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Wed, 17 Dec 2014 12:33:02 -0500 Subject: [PATCH 426/597] [Grooveshark] Change block to orange --- .../content/contents/images/iconBackground.png | Bin 83 -> 83 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/grooveshark/content/contents/images/iconBackground.png b/grooveshark/content/contents/images/iconBackground.png index 22b958a249c379d5f53551f9309b3ff35fc5ae9c..4fa608a98bb4e553ae448125effee07b615f5f69 100644 GIT binary patch delta 31 lcmWFzo?t0eaV_tMJOkTgrg?Fe{p%Qjz|+;wWt~$(69BD!3S0mH delta 31 lcmWFzo?t1JkdW|$pMjBukwLC_jspV_c)I$ztaD0e0sw)`2o?YU From 21a090db81696a682fc50479f9c2b140586b3975 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Wed, 17 Dec 2014 12:42:21 -0500 Subject: [PATCH 427/597] [gmusic] Match orange to their app --- gmusic/content/contents/images/iconBackground.png | Bin 83 -> 83 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/gmusic/content/contents/images/iconBackground.png b/gmusic/content/contents/images/iconBackground.png index fdf5ba9127fda195863825cf09f2e457d36421e0..902df6e96be108219ef110403c846bdab0ff6435 100644 GIT binary patch delta 31 lcmWFzo?t0e5s>sjo`KDQsU>#y{Qw3a@O1TaS?83{1OS`#38(-7 delta 31 lcmWFzo?t2UV~6H1dj|F?O#kw?3!h>D0#8>zmvv4FO#r>33oHNt From 283c5d4019a4c66e50d2eb4b5f9fcbc4c4419bb4 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Wed, 17 Dec 2014 13:37:17 -0500 Subject: [PATCH 428/597] [Hatchet metadata] Blue tweak --- .../content/contents/images/iconBackground.png | Bin 83 -> 83 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/hatchet-metadata/content/contents/images/iconBackground.png b/hatchet-metadata/content/contents/images/iconBackground.png index 120a06302dd594f090e90fb51c7a05a223af56ec..dcac2060597b3079d66c07cdc2746312b5baf183 100644 GIT binary patch delta 31 lcmWFzo?t1pVaAsq_6)2EOlupswhJ%-fv2mV%Q~loCIGV<3RD09 delta 31 lcmWFzo?t2E5&!kMJp_w$3B3RS From 0da750484963a2bfa2c80adb1898cf9977e33c37 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Wed, 17 Dec 2014 16:05:55 -0500 Subject: [PATCH 429/597] Color match all of the fancy icons to original source's colors --- .../contents/images/iconBackground.png | Bin 83 -> 315677 bytes .../contents/images/iconBackground.png | Bin 285529 -> 299506 bytes .../contents/images/iconBackground.png | Bin 83 -> 83 bytes .../contents/images/iconBackground.png | Bin 83 -> 83 bytes .../contents/images/iconBackground.png | Bin 83 -> 83 bytes .../contents/images/iconBackground.png | Bin 83 -> 37316 bytes .../contents/images/iconBackground.png | Bin 149485 -> 148218 bytes .../contents/images/iconBackground.png | Bin 83 -> 83 bytes .../contents/images/iconBackground.png | Bin 83 -> 209693 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ampache/content/contents/images/iconBackground.png b/ampache/content/contents/images/iconBackground.png index 013bd4234f373aa17aa1669db6847f54715b3f5e..82d470755cb5052c0bf6116f83710bc1b8388b1d 100644 GIT binary patch literal 315677 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°7Y|pXV~mtf^Fy=P7XC<^kA0Bw@6sU1 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�MiuL5OjLryH0`-(k%7U3thZ)_Yu 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 literal 0 HcmV?d00001 diff --git a/beatsmusic/content/contents/images/iconWhite.png b/beatsmusic/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..582ee6a4e7b475488f9e674133669a9e9401b179 GIT binary patch literal 9276 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 eCQFk7A@Kjrhbgb1!HKf~0000 Date: Mon, 15 Dec 2014 17:27:13 -0500 Subject: [PATCH 409/597] Fancy icons --- beets/content/contents/images/iconBackground.png | Bin 0 -> 83 bytes beets/content/contents/images/iconWhite.png | Bin 0 -> 6253 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 beets/content/contents/images/iconBackground.png create mode 100644 beets/content/contents/images/iconWhite.png diff --git a/beets/content/contents/images/iconBackground.png b/beets/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..f9113a5eac0fb080bf2696b98eacb4998b1c582a GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoJ& dyvq44&%iR9Nt7o!KM5$o;OXk;vd$@?2>^1B5#|5@ literal 0 HcmV?d00001 diff --git a/beets/content/contents/images/iconWhite.png b/beets/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..257307c5654ecb8046ed40dadce1487d3171b83e GIT binary patch literal 6253 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 Date: Mon, 15 Dec 2014 17:27:38 -0500 Subject: [PATCH 410/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes .../content/contents/images/iconWhite.png | Bin 0 -> 2113 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 deezer-metadata/content/contents/images/iconBackground.png create mode 100644 deezer-metadata/content/contents/images/iconWhite.png diff --git a/deezer-metadata/content/contents/images/iconBackground.png b/deezer-metadata/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..82cdd70bf53059032b7a460c2c9c5d303af18b97 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoI} dYR-JHXJB(-nq{1K0w~VF;OXk;vd$@?2>@}G5(WSO literal 0 HcmV?d00001 diff --git a/deezer-metadata/content/contents/images/iconWhite.png b/deezer-metadata/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..ef2f0195391b48a853c521b81dbad2c9b427d341 GIT binary patch literal 2113 zcmchZX;f2Z8po3uG@%D10fM4p3;~fq0!oPtAeSu!WsyZh30o*jM*&$P!~`Tzg+xFQ zSvm+tBBDb{0SBmIovMH$5`;=bmI@&uvdJP&5Mi#<`DEKqbIyFY_r2$y=e+0s|Ih#T zyqA02!$nP1R}}(*sJT*|yuo!1ysjg*f_D+xLI+%+3EnOa5aILP3J7G|M^`6%-(=|A zsBKoDvlb*|C@Tb|wMB`#Xo>L>cRD6VULM-vuqvCsmXdUS?EBuNecvpMkPpe(k)F$|Z67f)aT?fK zB4=u9sS9g8*!U_OVWA6}7@V*|7oFMMSM^?QX=H#X@tAET~Fu0$ZRtV~|%ExXhH_FAs!% z)QrNO3&^lNYaenSc_aI~B65KD(mo&!0)@d58rUx$Vw^(WP=cgiqrIg=gQr*CCE@hWvh$#T^lT6HVh1;Lfn4-Yd?Uf-^k=L&39toOZ)44a?$PT5-} zIwZ7upoaX1j(B>mcaF+`kVc91h;f9?saRZKC0L`Qi2VN2g4cNf3;fuzkzDxSKs_?4 zC0-l^2%5-E`WzW3{ZF=F->qy_s?F`#dqaXDjW8TZ&zCC(7H<_LFn@kkLanf5(WhRM zBN)}_FU5g!#SLjmqXk8zu~#X02iC!FldCT=OvV_SaSc~W!)^Y$>@BTtsAAh3HI8j~ zI>}R)s>NE=e=-*-cG9CS$_*prw@Lrx6b;sUu6ZNzz{VzD-R zJ_0>W0R&0^L&?a@k>*iK-@2h?GD|?d*OJOrMjRfyieC`zL>KD+QQKy;{Ij|y&IZeG zFx%J1OQpwP^N4Ao-bt;+psZoq?v3)J5y}P~t46V=aaWr2YIA^0&=68oL_-E($d1sSy1AG1= zyZrqRg(w{k59|`|P9@?SZSnLef<6(Z4K~=>?HH=tnBRZjk3xeRt46KxN{VoKCjdcY zP4-U+UoG*pwz;V@wmOZ{cY0?W>aG#LpFls&1N@*lvS=FK$tzxBQ1 zj-HJ(q)*pa8p!GdY;k21?WKsknb|F$^{?pseSm*^!|5d+*E3+W+{b%9)=v$ZHIXqg zcQKd;3|s5wxyxnm><489p@{sRPv)zN&+_WJ!w2n_lqU4{{mga3&xDIE7wM0w8wHw5 z#~;vdp8Hoe4PP(m%C)A~HqkbAACo?nge`7P=nf48#z)db*AQ7i3N$BZe2@o!fs9&7 zG(c%^)|` z#O1wv4Ha9KM)5p}hNAA0jvpDUZ{4WhC7Nho49!T`C2~xEEFey8ysJSvobp8IR9Na{ zYT}Ab%^RZ+m#?pTOXE{bI=ic+-tqCjWBao;A(a4g=u=IhqoQwvm*i;Yws-0gL_oaS zh3<2w-Fd%4s<0eaBj?cObL)mKPd@3pm_rk?O#HZ3OHA91X2O5W$!Tk$<2RphjXLJn zLp`pTfsye$Y!+Q8yZ^x@T3tOUho;A?YiOH@I&ARpx8Pv^Z^2K zCVR4OH4X0$cs%Ep`QQf4p!nc=#QMyfdGMLrljuJJ=@U}h8Sqj%`-@dJf`Cqio z{@umZ8G2;9Qr_IZX(!H{)OjlpeU^X4#Z}E~xSVy}Hz2kdg*7|TQ5NT;(z{>GNuw~o} zeqU_z8KHNB&bobe&7G-Tlf!mrXno0wg%jy(rk$*6cP?|*$ZEBy=R+8mwv%vGIb7Gt zDE?EL+zB8}4Z}B`>J2}+*j!NDtNRsKe3ibgs5`^$D(A9`E-yM0NnH}_hl^7A0)@DD zdssH@e3zvEvr#|dicfaZv)OIAi>xkT_#O~0lJm5}-(O!+7FW~6_G5MbTDC{#P1mzN zn%nxzlt})szye9i;_}4Ta>d2ONZJ}2nb(mBnlLI>g}(rySusFkISTNQ6y4HB+y!0nn91M}h{G1oBl(O@rS7OBI*>uzBE_Qbo##Al<;y0ks+c+Y0g(jDw;}i0}4p YUs-Ev$#V$={|O+j&K^!ehmiDt18E4aOaK4? literal 0 HcmV?d00001 From 71c869afa143a07eece655c7a112699243a0cddd Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 15 Dec 2014 17:27:56 -0500 Subject: [PATCH 411/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes gmusic/content/contents/images/iconWhite.png | Bin 0 -> 8517 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 gmusic/content/contents/images/iconBackground.png create mode 100644 gmusic/content/contents/images/iconWhite.png diff --git a/gmusic/content/contents/images/iconBackground.png b/gmusic/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..fdf5ba9127fda195863825cf09f2e457d36421e0 GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoK5 d?9lvW&%i!~>0kbK;Zr~f22WQ%mvv4FO#qHs6PN%1 literal 0 HcmV?d00001 diff --git a/gmusic/content/contents/images/iconWhite.png b/gmusic/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..b9442d69bfa086d85bec6671375b881268af9687 GIT binary patch literal 8517 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 Date: Mon, 15 Dec 2014 17:28:10 -0500 Subject: [PATCH 412/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes .../content/contents/images/iconWhite.png | Bin 0 -> 9343 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 grooveshark/content/contents/images/iconBackground.png create mode 100644 grooveshark/content/contents/images/iconWhite.png diff --git a/grooveshark/content/contents/images/iconBackground.png b/grooveshark/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..22b958a249c379d5f53551f9309b3ff35fc5ae9c GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoI( d5)yv!Gcd9+GRPIraR5p%c)I$ztaD0e0svBk5P|>z literal 0 HcmV?d00001 diff --git a/grooveshark/content/contents/images/iconWhite.png b/grooveshark/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..237ec741c5374eb75fc156ac91bbc52fc32696e9 GIT binary patch literal 9343 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 QL=k}|R8O^5*)Hn;09Us17XSbN literal 0 HcmV?d00001 From 5304578973557ef23c82717822cdf1bded53898e Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 15 Dec 2014 17:28:23 -0500 Subject: [PATCH 413/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes jamendo/content/contents/images/iconWhite.png | Bin 0 -> 8935 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 jamendo/content/contents/images/iconBackground.png create mode 100644 jamendo/content/contents/images/iconWhite.png diff --git a/jamendo/content/contents/images/iconBackground.png b/jamendo/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..061099fa7bf160557f7a5e64cad761eec462b7b2 GIT binary patch literal 83 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 BCxrk2 literal 0 HcmV?d00001 From 8fd76af94eb10397e1272233090a69a992a4c1ed Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 15 Dec 2014 17:28:53 -0500 Subject: [PATCH 414/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes .../content/contents/images/iconWhite.png | Bin 0 -> 11617 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 officialfm/content/contents/images/iconBackground.png create mode 100644 officialfm/content/contents/images/iconWhite.png diff --git a/officialfm/content/contents/images/iconBackground.png b/officialfm/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..22b958a249c379d5f53551f9309b3ff35fc5ae9c GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoI( d5)yv!Gcd9+GRPIraR5p%c)I$ztaD0e0svBk5P|>z literal 0 HcmV?d00001 diff --git a/officialfm/content/contents/images/iconWhite.png b/officialfm/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..defc39a4bfaf0acb1244c778510173c4a3d77895 GIT binary patch literal 11617 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 Date: Mon, 15 Dec 2014 17:29:14 -0500 Subject: [PATCH 415/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 83 bytes .../content/contents/images/iconWhite.png | Bin 0 -> 6798 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 rdio-metadata/content/contents/images/iconBackground.png create mode 100644 rdio-metadata/content/contents/images/iconWhite.png diff --git a/rdio-metadata/content/contents/images/iconBackground.png b/rdio-metadata/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..0585a28b17fe55323d89db1a4be8be9e17c6a09e GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k92}K#X;^)4C~IxyaaN1JzX3_IAoJI dWLo@^XJGlq)Oavt$0eWygQu&X%Q~loCIE&J6LtUq literal 0 HcmV?d00001 diff --git a/rdio-metadata/content/contents/images/iconWhite.png b/rdio-metadata/content/contents/images/iconWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..1dd84a5151eecd15210a08bdacbc216670291423 GIT binary patch literal 6798 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 literal 0 HcmV?d00001 From 189df58b6b442ac1e429181dfd6577b6dbd3f004 Mon Sep 17 00:00:00 2001 From: Jason Herskowitz Date: Mon, 15 Dec 2014 17:29:33 -0500 Subject: [PATCH 416/597] Fancy icons --- .../content/contents/images/iconBackground.png | Bin 0 -> 149485 bytes .../content/contents/images/iconWhite.png | Bin 0 -> 8370 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 soundcloud/content/contents/images/iconBackground.png create mode 100644 soundcloud/content/contents/images/iconWhite.png diff --git a/soundcloud/content/contents/images/iconBackground.png b/soundcloud/content/contents/images/iconBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..1a07fa9ebeb79762d041d5347b89b6f9f2dfd25f GIT binary patch literal 149485 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�pQ}s!nvg9v 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�@92y>mwE;7cY}Cu5 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�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 sm(H4xG3A-k|ElMhF0NA2H-)$kJf)s+6 za>+@jC`u@0*cAsmwKf?z5boyr=b!!MpZ@88{*O*i@3c7Q+V3;O@0HnsIJjQZH8am# zfATA5XSYB0&ENE8XXKk^wN~6Fp zk$IzF96Q<=Fot_q1(a6I%L1Oc{^Z-=`<}P`5?_xD(tzQPL`!iteOCThGdb?SF z;*D?o6W=zgXUohb4Qa7R%n6W#vo!?~2nt%gnFyuEP)Rdsm9#db5fTDQNeDqbF@gfp zp(~0CFM3!Q=j_i2OfU? z8&-??Vqwc-VU5*^OSuUn-F4@~imAa)>~>25j;DkIf`|=eMH5J>xlz}1(tR=OUK@j) zGNcf=bLaMNz4^^Q^uP1Y|Pb&V&@Sw%Hp6Jy$gmUj%S$m>-H+|zbe$&6RJUV%}sb_!Emi27tHqfR>^V$5WvE@V0io6-}2O6_JqAY(e$3QMElM5SEIx^3|do=ulIhe zLHei6fvf?J0&)HRD}UwNzhQZF{LpNE^t!sNugn&UZ_X)Yk~fGfg#07MXr+`wQPl9> zK`AYK@SFAO^rqHEr5It$Qrx`x+*58C?i7W=qmMoMvG@MkTc76O6!x;vDY#G9>oU8# z3|RMF(9(R+_Jh{+V~O)spXsgm_f`BB7nDoWkCWPZ-=K6V{ioowFRz$5;`>^%{loWa z_G9+@eP%D)vV0v%zJ>+=y4h=S>^JeJ>j!=~?2DzR&l@@T0528?PXthj^9k>?OL{n% zc;HM;F9X(tQyQwhpjGZ=5Y^t{G<%0_KY-!j=ZE;>LskAEn|_*9y1n4^aze&eJ6qWA z_nEz5Z};BQ|4-D6>DtP@Ydu}}jF)aET!dQeuKhLj`YbGuTM)Kg}^5Efcc)tt06#0D7`=Y?V|MAP$Wx#r11DE&% zvMKRZzGwMmdNLOsMjT`Y`89gYzFKeZtNr||UAvdNj_HCd?DBOPupapD!$k)z{{g`Y z7X+TeM*QI+6!*cQJG>t9AbYy#nu$N)y1iVm$7?jWU%oD1m#@p$+*H^x_n)}E?<|gd-(eQ0O|10Q=>PFdjJ3c07*qoM6N<$f|#Pw(EtDd literal 85124 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 z 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 diff --git a/grooveshark/content/contents/code/grooveshark-icon.png b/grooveshark/content/contents/code/grooveshark-icon.png index 6e62a232d3b6f96b93f4fc27d1b5225df582e90f..bdde5f0907af82b3dc6a7c1ce832bd3ecd12d1a5 100644 GIT binary patch literal 3720 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 literal 5817 zcmV;q7DnlbP)Jm$=-J+o)dTHp7-=bV|n*Iw(t z_nO(SnftN<7i$JKkito8FkYXV3S-uMHolM2@0T@Um3}`dJhkSN@5_bzh5r?n3Xcl^ zC%70fKqa{J&H%g(3OftC2s;X|5jeJm5K2}^@iO6F;dbGU1PC0L9vSceNJrQ!m27um zy0DwDldy>plPs1ozY=a(gWL4^g5c7D0S|!I?f=% zxbzVN>&e%53YQDaymV_UbwAI{(zk@Ef=i7V7?f|P3y%qPZ`4`+yH(tLP}op#sR;v9 z|>%VV{njp{rOQ?H;s-k}k zl)ovkkIE$g1BXbbFJi?X{Ombmi-n630}Ql&C{*#P*v~f4QJwjwyPQEVQ~B@r#$Vas zzf*PRYX=#EfW7y#1Rm(<=c{NPe1Beb_)#HBiSZ#1o}0Z;*f&bX+8f2r(uV}bDLkGC zo)efe2b?FM0Ru*W(8wD?eT))bzUFg%eKOq(HWM}%*uq`KuEk}t`#l1@L?f{U0JqCa zgxEJ>-6b1u6nNr_+x*?aBSNw<>t`_Gx#QOg@by>1bb$rI*o9}9-!A+yc0pNY8*edNN*>sdZ_oGTO zM#g?XxK5y}6&tT~2agf@Ug&~-MTn__mdl>A1-ch?kU=@|X@PEAOgv-D7lpo+(egZ| z`Td2mho_;cIKWKXh~A`x-w=3XL@dGZZP~Jp&{skuyH+T>5}2Z!EijPmCmAbeKPx;T zlwAju&xLSZp)Z6fy`KwZ63-4&x;a}4{VcrP>k|Ugw`JA`Wi!dJflzC~!E1!F$Y!AZ z9br&#d5Hn)1X*J)xGuqR!8RvIxFGW$#)`X6>A!@%@uf<``j~%4Z?4 zRzl;yQYfSGKcI5oBgD4oCzGO;iL&fcp^W;X%nOCu42+59vi9&_pt9Lo;gXGkeU)vI zP(~myIZ+E?nyY968PpwA3--!)g7Lu@gfbpIJ+*xI^I7n5WiPt%bGLa_KC?Y{3kJ5= zvEK?s*XN-vY^lT{uE5N?6h#D5Zc+J)=1KwEpU)RQ zEKC+$@-y%+Qc*-3xK-t_ojwX-$@*%c2*>}?$YUCRv%QOS>~vu_qcZwc4gYhkncEP* zd5|g!`Da-X!og;p>{hgrf0LqS{mI{pbe^jjGg>aaGr%+{>oQ4Bt-r69eje~CRp>fA zD_A?%tZ$aFmnWpOnM!13nLRPSz$OxUkfW5gxgM>5->x#&>%k`Tq*oQ-h5A8E7xiAt(5+qJDXvDcC1vg{UD8jS<|o|eU!cFLmDR-*#3xgF#hpC7^1Z8A69P{ z2wB@fntV65Ej`eQ^8!0`i}Z(F_GZP}YR!T`I7#rXkw|DGOp`AW(lq9*X%1;qw)x>{ zfgNEzp@`WR-r<>*>{j`>BQi}}>Yz;J$0|F?Fcz^|ac6Oi01J819Om`rjUV51^ryuuB#ROm*70P z+^zxVJ^r+Gj}JvDE52+=&1+=4{ND*>cpJS8vfJ5Wb$o@&V45zPW&1W<6nU84yCKH| zvqL#^xD;D8jAlK*m+qnmk>>{Vr`bQ&5K3RQlnt@S3>jiI3DL|o-RMcyjp<m>V0b&PDfTI zJ8$U$h*5k2BelX)w&=W?2hu zmyfG|ERyG;n0EeI9cNEV=393x1ZS}0UCLv{VN%a0d$lFh;P)N98WJ!)TN9Eb#rB